From 313c57c0b1f43a1d562691ed6d96eb6a9cedc045 Mon Sep 17 00:00:00 2001 From: hcf <11636549+hcf85679@user.noreply.gitee.com> Date: Fri, 14 Jun 2024 10:47:50 +0800 Subject: [PATCH 1/3] Add zsda and net code --- kmod-zxdh.spec | 123 + src/crypto/zsda/Makefile | 32 + src/crypto/zsda/accdevice/Makefile | 3 + .../zsda/accdevice/zsda_common/Makefile | 6 + .../zsda/accdevice/zsda_common/zsda_alg.c | 560 + .../zsda/accdevice/zsda_common/zsda_alg.h | 119 + .../accdevice/zsda_common/zsda_common_drv.c | 105 + .../accdevice/zsda_common/zsda_common_drv.h | 33 + .../zsda/accdevice/zsda_common/zsda_isr.c | 140 + .../zsda/accdevice/zsda_common/zsda_manage.c | 131 + .../zsda/accdevice/zsda_common/zsda_manage.h | 19 + .../zsda/accdevice/zsda_common/zsda_pci.c | 120 + .../zsda/accdevice/zsda_common/zsda_pci.h | 14 + .../zsda/accdevice/zsda_common/zsda_qp.c | 674 + .../zsda/accdevice/zsda_common/zsda_qp.h | 143 + src/crypto/zsda/accdevice/zsda_pf/Makefile | 4 + src/crypto/zsda/accdevice/zsda_pf/zsda_drv.c | 237 + src/crypto/zsda/accdevice/zsda_vf/Makefile | 5 + src/crypto/zsda/accdevice/zsda_vf/zsda_drv.c | 217 + src/crypto/zsda/include/acc_addr.h | 80 + src/crypto/zsda/include/acc_dev.h | 60 + src/crypto/zsda/include/acc_version.h | 26 + src/net/Kconfig | 1 + src/net/Makefile | 7 + src/net/README.MD | 156 + src/net/build.sh | 63 + src/net/build/Makefile | 133 + src/net/build/build.pl | 71 + src/net/build/config.mk | 386 + src/net/build/spec/zxdh-eth.spec.example | 530 + src/net/build/spec/zxdh-hpf.spec.example | 484 + src/net/build/spec/zxdh-zf-mpf.spec.example | 494 + src/net/build/zxdh_config/dpu_init.cfg | 29 + src/net/build/zxdh_config/smart_nic_init.cfg | 26 + src/net/ci_cmd.sh | 177 + src/net/{README => compat/config.h} | 0 src/net/compile.sh | 278 + src/net/drivers/base/Makefile | 6 + src/net/drivers/base/en_auxiliary.c | 368 + src/net/drivers/net/ethernet/dinghai/Kconfig | 6 + src/net/drivers/net/ethernet/dinghai/Makefile | 71 + src/net/drivers/net/ethernet/dinghai/cmd.c | 35 + .../net/ethernet/dinghai/cmd/msg_chan_lock.c | 179 + .../net/ethernet/dinghai/cmd/msg_chan_lock.h | 48 + .../net/ethernet/dinghai/cmd/msg_chan_priv.h | 294 + .../net/ethernet/dinghai/cmd/msg_chan_test.c | 148 + .../net/ethernet/dinghai/cmd/msg_chan_ver.h | 16 + .../net/ethernet/dinghai/cmd/msg_main.c | 31 + .../drivers/net/ethernet/dinghai/devlink.c | 50 + src/net/drivers/net/ethernet/dinghai/dh_cmd.c | 1208 + .../drivers/net/ethernet/dinghai/dh_procfs.c | 85 + .../drivers/net/ethernet/dinghai/dh_procfs.h | 30 + src/net/drivers/net/ethernet/dinghai/en_aux.c | 4046 + src/net/drivers/net/ethernet/dinghai/en_aux.h | 373 + .../ethernet/dinghai/en_aux/dcbnl/en_dcbnl.c | 877 + .../ethernet/dinghai/en_aux/dcbnl/en_dcbnl.h | 213 + .../dinghai/en_aux/dcbnl/en_dcbnl_api.c | 1463 + .../dinghai/en_aux/dcbnl/en_dcbnl_api.h | 35 + .../net/ethernet/dinghai/en_aux/drs_sec_dtb.c | 1060 + .../net/ethernet/dinghai/en_aux/drs_sec_dtb.h | 537 + .../dinghai/en_aux/en_1588_pkt_proc.c | 489 + .../dinghai/en_aux/en_1588_pkt_proc.h | 34 + .../dinghai/en_aux/en_1588_pkt_proc_func.c | 673 + .../dinghai/en_aux/en_1588_pkt_proc_func.h | 233 + .../net/ethernet/dinghai/en_aux/en_cmd.c | 1560 + .../net/ethernet/dinghai/en_aux/en_cmd.h | 226 + .../net/ethernet/dinghai/en_aux/en_ioctl.c | 1463 + .../net/ethernet/dinghai/en_aux/en_ioctl.h | 101 + .../drivers/net/ethernet/dinghai/en_aux/eq.c | 333 + .../drivers/net/ethernet/dinghai/en_aux/eq.h | 24 + .../net/ethernet/dinghai/en_aux/events.c | 824 + .../net/ethernet/dinghai/en_aux/events.h | 24 + .../net/ethernet/dinghai/en_aux/priv_queue.c | 812 + .../net/ethernet/dinghai/en_aux/priv_queue.h | 225 + .../net/ethernet/dinghai/en_aux/queue.c | 2913 + .../net/ethernet/dinghai/en_aux/queue.h | 830 + .../net/ethernet/dinghai/en_ethtool/ethtool.c | 1997 + .../net/ethernet/dinghai/en_ethtool/ethtool.h | 68 + src/net/drivers/net/ethernet/dinghai/en_mpf.c | 301 + src/net/drivers/net/ethernet/dinghai/en_mpf.h | 32 + .../net/ethernet/dinghai/en_mpf/cfg_sf.c | 54 + .../net/ethernet/dinghai/en_mpf/cfg_sf.h | 30 + .../net/ethernet/dinghai/en_mpf/devlink.c | 130 + .../net/ethernet/dinghai/en_mpf/devlink.h | 16 + .../drivers/net/ethernet/dinghai/en_mpf/eq.c | 235 + .../drivers/net/ethernet/dinghai/en_mpf/eq.h | 19 + .../net/ethernet/dinghai/en_mpf/events.c | 132 + .../net/ethernet/dinghai/en_mpf/events.h | 18 + .../drivers/net/ethernet/dinghai/en_mpf/irq.c | 171 + .../drivers/net/ethernet/dinghai/en_mpf/irq.h | 20 + .../drivers/net/ethernet/dinghai/en_mpf/tc.c | 0 .../net/ethernet/dinghai/en_np/.clang-format | 176 + .../net/ethernet/dinghai/en_np/.gitignore | 13 + .../net/ethernet/dinghai/en_np/Makefile | 21 + .../ethernet/dinghai/en_np/Makefile.include | 58 + .../dinghai/en_np/agent/Kbuild.include | 4 + .../en_np/agent/include/dpp_agent_channel.h | 158 + .../dinghai/en_np/agent/source/Kbuild.include | 2 + .../en_np/agent/source/dpp_agent_channel.c | 476 + .../ethernet/dinghai/en_np/cmd/Kbuild.include | 4 + .../dinghai/en_np/cmd/include/dpp_cmd_init.h | 16 + .../dinghai/en_np/cmd/include/dpp_cmd_shell.h | 49 + .../dinghai/en_np/cmd/source/Kbuild.include | 2 + .../dinghai/en_np/cmd/source/dpp_cmd_init.c | 33 + .../dinghai/en_np/cmd/source/dpp_cmd_shell.c | 296 + .../dinghai/en_np/comm/Kbuild.include | 4 + .../en_np/comm/include/zxic_comm_avl_tree.h | 97 + .../comm/include/zxic_comm_double_link.h | 109 + .../comm/include/zxic_comm_doublelink_index.h | 166 + .../en_np/comm/include/zxic_comm_index_ctrl.h | 77 + .../en_np/comm/include/zxic_comm_index_fill.h | 69 + .../comm/include/zxic_comm_index_fill_type.h | 96 + .../comm/include/zxic_comm_index_reserve.h | 78 + .../en_np/comm/include/zxic_comm_liststack.h | 95 + .../en_np/comm/include/zxic_comm_rb_tree.h | 128 + .../en_np/comm/include/zxic_comm_socket.h | 157 + .../en_np/comm/include/zxic_comm_thread.h | 95 + .../dinghai/en_np/comm/include/zxic_common.h | 2674 + .../dinghai/en_np/comm/include/zxic_private.h | 117 + .../en_np/comm/include/zxic_private_top.h | 194 + .../dinghai/en_np/comm/include/zxic_slt.h | 751 + .../dinghai/en_np/comm/source/Kbuild.include | 2 + .../en_np/comm/source/zxic_comm_double_link.c | 605 + .../en_np/comm/source/zxic_comm_index_fill.c | 420 + .../en_np/comm/source/zxic_comm_liststack.c | 431 + .../en_np/comm/source/zxic_comm_mutex_lock.c | 179 + .../en_np/comm/source/zxic_comm_print.c | 446 + .../en_np/comm/source/zxic_comm_rb_tree.c | 1059 + .../dinghai/en_np/comm/source/zxic_common.c | 1009 + .../en_np/comm/source/zxic_private_top.c | 148 + .../net/ethernet/dinghai/en_np/dpp_kshell | Bin 0 -> 4477496 bytes .../dinghai/en_np/driver/Kbuild.include | 4 + .../en_np/driver/include/dpp_drv_acl.h | 85 + .../en_np/driver/include/dpp_drv_eram.h | 262 + .../en_np/driver/include/dpp_drv_hash.h | 97 + .../en_np/driver/include/dpp_drv_init.h | 33 + .../en_np/driver/include/dpp_drv_sdt.h | 62 + .../en_np/driver/source/Kbuild.include | 2 + .../dinghai/en_np/driver/source/dpp_drv_acl.c | 162 + .../en_np/driver/source/dpp_drv_eram.c | 675 + .../en_np/driver/source/dpp_drv_hash.c | 588 + .../en_np/driver/source/dpp_drv_init.c | 115 + .../ethernet/dinghai/en_np/fc/Kbuild.include | 4 + .../dinghai/en_np/fc/include/dpp_drv_fc.h | 65 + .../dinghai/en_np/fc/source/Kbuild.include | 2 + .../dinghai/en_np/fc/source/dpp_drv_fc.c | 138 + .../dinghai/en_np/init/Kbuild.include | 4 + .../dinghai/en_np/init/include/dpp_np_init.h | 11 + .../dinghai/en_np/init/source/Kbuild.include | 2 + .../dinghai/en_np/init/source/dpp_np_init.c | 169 + .../dinghai/en_np/netlink/Kbuild.include | 4 + .../en_np/netlink/include/dpp_netlink.h | 30 + .../en_np/netlink/source/Kbuild.include | 2 + .../en_np/netlink/source/dpp_netlink.c | 205 + .../ethernet/dinghai/en_np/qos/Kbuild.include | 4 + .../dinghai/en_np/qos/include/dpp_drv_qos.h | 568 + .../dinghai/en_np/qos/source/Kbuild.include | 2 + .../dinghai/en_np/qos/source/dpp_drv_qos.c | 1100 + .../ethernet/dinghai/en_np/sdk/Kbuild.include | 4 + .../en_np/sdk/include/api/dpp_apt_se_api.h | 303 + .../en_np/sdk/include/api/dpp_dtb_table_api.h | 213 + .../en_np/sdk/include/api/dpp_pbu_api.h | 145 + .../en_np/sdk/include/api/dpp_ppu_api.h | 393 + .../en_np/sdk/include/api/dpp_reg_api.h | 183 + .../en_np/sdk/include/api/dpp_se_api.h | 1386 + .../en_np/sdk/include/api/dpp_stat_api.h | 533 + .../en_np/sdk/include/api/dpp_tm_api.h | 1209 + .../en_np/sdk/include/api/dpp_type_api.h | 415 + .../en_np/sdk/include/dev/chip/dpp_dev.h | 223 + .../en_np/sdk/include/dev/chip/dpp_init.h | 66 + .../sdk/include/dev/init/dpp_kernel_init.h | 19 + .../sdk/include/dev/module/dma/dpp_dtb.h | 696 + .../sdk/include/dev/module/dma/dpp_dtb_cfg.h | 439 + .../sdk/include/dev/module/nppu/dpp_pbu.h | 458 + .../sdk/include/dev/module/ppu/dpp_ppu.h | 104 + .../sdk/include/dev/module/se/dpp_apt_se.h | 111 + .../sdk/include/dev/module/se/dpp_etcam.h | 157 + .../en_np/sdk/include/dev/module/se/dpp_se.h | 821 + .../sdk/include/dev/module/se/dpp_stat_car.h | 1047 + .../sdk/include/dev/module/se/dpp_stat_cfg.h | 196 + .../include/dev/module/table/sdt/dpp_sdt.h | 164 + .../dev/module/table/sdt/dpp_sdt_def.h | 143 + .../dev/module/table/sdt/dpp_sdt_mgr.h | 147 + .../sdk/include/dev/module/table/se/dpp_acl.h | 103 + .../dev/module/table/se/dpp_dtb_table.h | 720 + .../include/dev/module/table/se/dpp_hash.h | 402 + .../dev/module/table/se/dpp_hash_crc.h | 16 + .../include/dev/module/table/se/dpp_se_cfg.h | 279 + .../en_np/sdk/include/dev/module/tm/dpp_tm.h | 4917 + .../en_np/sdk/include/dev/reg/dpp_axi_reg.h | 50 + .../en_np/sdk/include/dev/reg/dpp_cfg_reg.h | 1248 + .../en_np/sdk/include/dev/reg/dpp_dtb4k_reg.h | 47 + .../en_np/sdk/include/dev/reg/dpp_dtb_reg.h | 599 + .../en_np/sdk/include/dev/reg/dpp_etm_reg.h | 4926 + .../en_np/sdk/include/dev/reg/dpp_mem_info.h | 66 + .../en_np/sdk/include/dev/reg/dpp_module.h | 214 + .../en_np/sdk/include/dev/reg/dpp_nppu_reg.h | 3850 + .../en_np/sdk/include/dev/reg/dpp_pci.h | 37 + .../en_np/sdk/include/dev/reg/dpp_ppu4k_reg.h | 45 + .../en_np/sdk/include/dev/reg/dpp_ppu_reg.h | 4308 + .../en_np/sdk/include/dev/reg/dpp_ptptm_reg.h | 895 + .../en_np/sdk/include/dev/reg/dpp_reg.h | 62 + .../en_np/sdk/include/dev/reg/dpp_reg_info.h | 4458 + .../sdk/include/dev/reg/dpp_reg_struct.h | 88 + .../en_np/sdk/include/dev/reg/dpp_se4k_reg.h | 334 + .../en_np/sdk/include/dev/reg/dpp_se_reg.h | 3438 + .../en_np/sdk/include/dev/reg/dpp_smmu0_reg.h | 6423 + .../sdk/include/dev/reg/dpp_smmu14k_reg.h | 238 + .../en_np/sdk/include/dev/reg/dpp_smmu1_reg.h | 1327 + .../sdk/include/dev/reg/dpp_stat4k_reg.h | 42 + .../en_np/sdk/include/dev/reg/dpp_stat_reg.h | 2362 + .../en_np/sdk/include/dev/reg/dpp_trpg_reg.h | 344 + .../en_np/sdk/include/dev/reg/dpp_tsn_reg.h | 124 + .../en_np/sdk/include/diag/dpp_se_diag.h | 37 + .../dinghai/en_np/sdk/source/Kbuild.include | 4 + .../en_np/sdk/source/dev/Kbuild.include | 4 + .../en_np/sdk/source/dev/chip/Kbuild.include | 2 + .../en_np/sdk/source/dev/chip/dpp_dev.c | 1083 + .../en_np/sdk/source/dev/chip/dpp_init.c | 73 + .../en_np/sdk/source/dev/init/Kbuild.include | 2 + .../sdk/source/dev/init/dpp_kernel_init.c | 233 + .../sdk/source/dev/module/Kbuild.include | 4 + .../sdk/source/dev/module/dma/Kbuild.include | 2 + .../en_np/sdk/source/dev/module/dma/dpp_dtb.c | 2183 + .../sdk/source/dev/module/dma/dpp_dtb_cfg.c | 1079 + .../sdk/source/dev/module/nppu/Kbuild.include | 2 + .../sdk/source/dev/module/nppu/dpp_pbu.c | 225 + .../sdk/source/dev/module/ppu/Kbuild.include | 2 + .../en_np/sdk/source/dev/module/ppu/dpp_ppu.c | 339 + .../sdk/source/dev/module/se/Kbuild.include | 2 + .../sdk/source/dev/module/se/dpp_etcam.c | 814 + .../en_np/sdk/source/dev/module/se/dpp_se.c | 1084 + .../sdk/source/dev/module/se/dpp_stat_car.c | 4545 + .../sdk/source/dev/module/se/dpp_stat_cfg.c | 310 + .../source/dev/module/se_apt/Kbuild.include | 2 + .../source/dev/module/se_apt/dpp_apt_se_acl.c | 145 + .../dev/module/se_apt/dpp_apt_se_comm.c | 315 + .../source/dev/module/se_apt/dpp_apt_se_ddr.c | 62 + .../dev/module/se_apt/dpp_apt_se_eram.c | 216 + .../dev/module/se_apt/dpp_apt_se_hash.c | 326 + .../source/dev/module/table/Kbuild.include | 4 + .../dev/module/table/sdt/Kbuild.include | 2 + .../sdk/source/dev/module/table/sdt/dpp_sdt.c | 469 + .../source/dev/module/table/sdt/dpp_sdt_mgr.c | 739 + .../source/dev/module/table/se/Kbuild.include | 2 + .../sdk/source/dev/module/table/se/dpp_acl.c | 611 + .../dev/module/table/se/dpp_dtb_table.c | 7465 ++ .../dev/module/table/se/dpp_dtb_table_api.c | 643 + .../sdk/source/dev/module/table/se/dpp_hash.c | 2960 + .../source/dev/module/table/se/dpp_hash_crc.c | 381 + .../source/dev/module/table/se/dpp_se_cfg.c | 291 + .../sdk/source/dev/module/tm/Kbuild.include | 2 + .../en_np/sdk/source/dev/module/tm/dpp_tm.c | 21525 +++ .../en_np/sdk/source/dev/reg/Kbuild.include | 2 + .../en_np/sdk/source/dev/reg/dpp_module.c | 294 + .../en_np/sdk/source/dev/reg/dpp_pci.c | 89 + .../en_np/sdk/source/dev/reg/dpp_reg_api.c | 544 + .../en_np/sdk/source/dev/reg/dpp_reg_info.c | 101395 +++++++++++++++ .../dinghai/en_np/table/Kbuild.include | 4 + .../dinghai/en_np/table/include/dpp_tbl_api.h | 172 + .../dinghai/en_np/table/include/dpp_tbl_bc.h | 39 + .../en_np/table/include/dpp_tbl_comm.h | 79 + .../en_np/table/include/dpp_tbl_diag.h | 56 + .../en_np/table/include/dpp_tbl_ipsec.h | 26 + .../dinghai/en_np/table/include/dpp_tbl_lag.h | 29 + .../dinghai/en_np/table/include/dpp_tbl_mac.h | 26 + .../dinghai/en_np/table/include/dpp_tbl_mc.h | 43 + .../en_np/table/include/dpp_tbl_panel.h | 26 + .../en_np/table/include/dpp_tbl_port.h | 26 + .../en_np/table/include/dpp_tbl_promisc.h | 40 + .../dinghai/en_np/table/include/dpp_tbl_ptp.h | 26 + .../dinghai/en_np/table/include/dpp_tbl_qid.h | 28 + .../en_np/table/include/dpp_tbl_stat.h | 77 + .../dinghai/en_np/table/include/dpp_tbl_tm.h | 45 + .../en_np/table/include/dpp_tbl_vlan.h | 29 + .../dinghai/en_np/table/source/Kbuild.include | 2 + .../dinghai/en_np/table/source/dpp_tbl_bc.c | 196 + .../dinghai/en_np/table/source/dpp_tbl_comm.c | 286 + .../dinghai/en_np/table/source/dpp_tbl_diag.c | 466 + .../en_np/table/source/dpp_tbl_ipsec.c | 107 + .../dinghai/en_np/table/source/dpp_tbl_lag.c | 253 + .../dinghai/en_np/table/source/dpp_tbl_mac.c | 256 + .../dinghai/en_np/table/source/dpp_tbl_mc.c | 491 + .../en_np/table/source/dpp_tbl_panel.c | 135 + .../dinghai/en_np/table/source/dpp_tbl_port.c | 333 + .../en_np/table/source/dpp_tbl_promisc.c | 145 + .../dinghai/en_np/table/source/dpp_tbl_ptp.c | 47 + .../dinghai/en_np/table/source/dpp_tbl_qid.c | 208 + .../dinghai/en_np/table/source/dpp_tbl_stat.c | 386 + .../dinghai/en_np/table/source/dpp_tbl_tm.c | 175 + .../dinghai/en_np/table/source/dpp_tbl_vhca.c | 81 + .../dinghai/en_np/table/source/dpp_tbl_vlan.c | 152 + src/net/drivers/net/ethernet/dinghai/en_pf.c | 2275 + src/net/drivers/net/ethernet/dinghai/en_pf.h | 179 + .../net/ethernet/dinghai/en_pf/devlink.c | 132 + .../net/ethernet/dinghai/en_pf/devlink.h | 16 + .../net/ethernet/dinghai/en_pf/en_rep.c | 0 .../drivers/net/ethernet/dinghai/en_pf/eq.c | 455 + .../drivers/net/ethernet/dinghai/en_pf/eq.h | 53 + .../net/ethernet/dinghai/en_pf/events.c | 318 + .../net/ethernet/dinghai/en_pf/events.h | 17 + .../drivers/net/ethernet/dinghai/en_pf/irq.c | 180 + .../drivers/net/ethernet/dinghai/en_pf/irq.h | 27 + .../net/ethernet/dinghai/en_pf/msg_func.c | 1473 + .../net/ethernet/dinghai/en_pf/msg_func.h | 25 + .../drivers/net/ethernet/dinghai/en_pf/rdma.c | 0 .../net/ethernet/dinghai/en_ptp/tod_driver.c | 437 + .../net/ethernet/dinghai/en_ptp/tod_driver.h | 24 + .../ethernet/dinghai/en_ptp/tod_driver_stub.c | 62 + .../net/ethernet/dinghai/en_ptp/zxdh_ptp.c | 1477 + .../net/ethernet/dinghai/en_ptp/zxdh_ptp.h | 103 + .../ethernet/dinghai/en_ptp/zxdh_ptp_common.h | 12 + .../ethernet/dinghai/en_ptp/zxdh_ptp_regs.h | 460 + src/net/drivers/net/ethernet/dinghai/en_sf.c | 781 + src/net/drivers/net/ethernet/dinghai/en_sf.h | 107 + .../net/ethernet/dinghai/en_sf/devlink.c | 131 + .../net/ethernet/dinghai/en_sf/devlink.h | 15 + .../drivers/net/ethernet/dinghai/en_sf/eq.c | 391 + .../drivers/net/ethernet/dinghai/en_sf/eq.h | 57 + .../drivers/net/ethernet/dinghai/en_sf/irq.c | 5 + .../drivers/net/ethernet/dinghai/en_sf/irq.h | 24 + .../net/ethernet/dinghai/en_tsn/zxdh_tsn.c | 71 + .../net/ethernet/dinghai/en_tsn/zxdh_tsn.h | 112 + .../ethernet/dinghai/en_tsn/zxdh_tsn_comm.h | 228 + .../ethernet/dinghai/en_tsn/zxdh_tsn_ioctl.c | 695 + .../ethernet/dinghai/en_tsn/zxdh_tsn_ioctl.h | 48 + .../ethernet/dinghai/en_tsn/zxdh_tsn_reg.c | 428 + .../ethernet/dinghai/en_tsn/zxdh_tsn_reg.h | 86 + src/net/drivers/net/ethernet/dinghai/en_vf.c | 0 src/net/drivers/net/ethernet/dinghai/eq.c | 108 + src/net/drivers/net/ethernet/dinghai/events.c | 13 + .../net/ethernet/dinghai/irq_affinity.c | 278 + .../drivers/net/ethernet/dinghai/lag/lag.c | 867 + .../drivers/net/ethernet/dinghai/lag/lag.h | 120 + .../net/ethernet/dinghai/lag/lag_procfs.c | 62 + .../drivers/net/ethernet/dinghai/msg_common.h | 719 + .../drivers/net/ethernet/dinghai/pci_irq.c | 573 + src/net/drivers/net/ethernet/dinghai/plcr.c | 2371 + src/net/drivers/net/ethernet/dinghai/plcr.h | 359 + .../net/ethernet/dinghai/sriov_sysfs.c | 1483 + src/net/drivers/net/ethernet/dinghai/wq.c | 0 .../zf_mpf/bar_chan_user/normal_send_eg.c | 137 + .../zf_mpf/bar_chan_user/pci_res_query_eg.c | 214 + .../net/ethernet/dinghai/zf_mpf/cfg_sf.c | 53 + .../net/ethernet/dinghai/zf_mpf/cfg_sf.h | 30 + .../net/ethernet/dinghai/zf_mpf/devlink.c | 130 + .../net/ethernet/dinghai/zf_mpf/devlink.h | 16 + .../net/ethernet/dinghai/zf_mpf/epc/Makefile | 11 + .../ethernet/dinghai/zf_mpf/epc/dmaengine.c | 1636 + .../ethernet/dinghai/zf_mpf/epc/dmaengine.h | 205 + .../dinghai/zf_mpf/epc/pcie-zte-zf-epc.c | 1647 + .../dinghai/zf_mpf/epc/pcie-zte-zf-epc.h | 244 + .../dinghai/zf_mpf/epc/pcie-zte-zf-hdma.c | 748 + .../dinghai/zf_mpf/epc/pcie-zte-zf-hdma.h | 159 + .../ethernet/dinghai/zf_mpf/epc/virt-dma.c | 135 + .../ethernet/dinghai/zf_mpf/epc/virt-dma.h | 221 + .../dinghai/zf_mpf/epf/pcie-zte-zf-epf.c | 1024 + .../dinghai/zf_mpf/epf/pcie-zte-zf-epf.h | 142 + .../drivers/net/ethernet/dinghai/zf_mpf/eq.c | 502 + .../drivers/net/ethernet/dinghai/zf_mpf/eq.h | 19 + .../dinghai/zf_mpf/fuc_hotplug/fuc_hotplug.c | 224 + .../dinghai/zf_mpf/fuc_hotplug/fuc_hotplug.h | 62 + .../zf_mpf/fuc_hotplug/fuc_hotplug_commom.h | 79 + .../zf_mpf/fuc_hotplug/fuc_hotplug_ioctl.c | 76 + .../zf_mpf/fuc_hotplug/fuc_hotplug_ioctl.h | 20 + .../zf_mpf/fuc_hotplug/fuc_hp_app/build.sh | 5 + .../fuc_hotplug/fuc_hp_app/fuc_hp_app.c | 271 + .../fuc_hotplug/fuc_hp_app/fuc_hp_app.h | 51 + .../net/ethernet/dinghai/zf_mpf/gdma.c | 550 + .../net/ethernet/dinghai/zf_mpf/gdma.h | 67 + .../drivers/net/ethernet/dinghai/zf_mpf/irq.c | 169 + .../drivers/net/ethernet/dinghai/zf_mpf/irq.h | 49 + .../ethernet/dinghai/zf_mpf/zf_chan_ioctl.c | 284 + .../ethernet/dinghai/zf_mpf/zf_chan_ioctl.h | 100 + .../net/ethernet/dinghai/zf_mpf/zf_events.c | 192 + .../net/ethernet/dinghai/zf_mpf/zf_events.h | 24 + .../net/ethernet/dinghai/zf_mpf/zf_mpf.c | 437 + .../net/ethernet/dinghai/zf_mpf/zf_mpf.h | 36 + .../dinghai/zf_mpf/zf_reset_finish_flag.c | 95 + .../ethernet/dinghai/zf_mpf/zxdh_reset_zf.c | 242 + .../dinghai/zxdh_tools/zxdh_tools_ioctl.c | 476 + .../dinghai/zxdh_tools/zxdh_tools_ioctl.h | 88 + .../dinghai/zxdh_tools/zxdh_tools_netlink.c | 178 + .../dinghai/zxdh_tools/zxdh_tools_netlink.h | 53 + src/net/drivers/pcie/zxdh_pcie/Makefile | 16 + src/net/drivers/pcie/zxdh_pcie/bar_msg.c | 79 + src/net/drivers/pcie/zxdh_pcie/bar_msg.h | 165 + .../drivers/pcie/zxdh_pcie/function_hotplug.c | 461 + .../drivers/pcie/zxdh_pcie/function_hotplug.h | 128 + src/net/drivers/pcie/zxdh_pcie/pcie_common.c | 153 + src/net/drivers/pcie/zxdh_pcie/pcie_common.h | 53 + src/net/drivers/pcie/zxdh_pcie/pcie_msix.c | 88 + src/net/drivers/pcie/zxdh_pcie/pcie_msix.h | 29 + src/net/drivers/pcie/zxdh_pcie/zxdh_pcie.c | 167 + src/net/include/linux/dinghai/auxiliary_bus.h | 153 + src/net/include/linux/dinghai/device.h | 155 + src/net/include/linux/dinghai/devlink.h | 32 + src/net/include/linux/dinghai/dh_cmd.h | 266 + src/net/include/linux/dinghai/dh_ifc.h | 51 + src/net/include/linux/dinghai/dinghai_irq.h | 68 + src/net/include/linux/dinghai/driver.h | 219 + src/net/include/linux/dinghai/en_aux.h | 69 + src/net/include/linux/dinghai/en_sf.h | 83 + src/net/include/linux/dinghai/eq.h | 111 + src/net/include/linux/dinghai/events.h | 35 + src/net/include/linux/dinghai/helper.h | 81 + src/net/include/linux/dinghai/kcompat.h | 7333 ++ src/net/include/linux/dinghai/kcompat_vfd.h | 189 + src/net/include/linux/dinghai/lag.h | 26 + src/net/include/linux/dinghai/log.h | 39 + src/net/include/linux/dinghai/pci_irq.h | 70 + src/net/include/linux/dinghai/queue.h | 78 + src/net/include/linux/types.h | 5 + src/net/pci.updates | 44 + src/net/scripts/.gitignore | 11 + src/net/scripts/Kbuild.include | 328 + src/net/scripts/Kconfig.include | 50 + src/net/scripts/Lindent | 26 + src/net/scripts/Makefile | 56 + src/net/scripts/Makefile.asm-generic | 58 + src/net/scripts/Makefile.build | 533 + src/net/scripts/Makefile.clean | 73 + src/net/scripts/Makefile.dtbinst | 36 + src/net/scripts/Makefile.extrawarn | 96 + src/net/scripts/Makefile.gcc-plugins | 65 + src/net/scripts/Makefile.headersinst | 84 + src/net/scripts/Makefile.host | 132 + src/net/scripts/Makefile.kasan | 51 + src/net/scripts/Makefile.kcov | 6 + src/net/scripts/Makefile.kcsan | 15 + src/net/scripts/Makefile.lib | 478 + src/net/scripts/Makefile.modfinal | 59 + src/net/scripts/Makefile.modinst | 35 + src/net/scripts/Makefile.modpost | 142 + src/net/scripts/Makefile.modsign | 29 + src/net/scripts/Makefile.package | 161 + src/net/scripts/Makefile.ubsan | 15 + src/net/scripts/Makefile.userprogs | 45 + src/net/scripts/adjust_autoksyms.sh | 76 + src/net/scripts/asn1_compiler.c | 1611 + src/net/scripts/atomic/atomic-tbl.sh | 186 + src/net/scripts/atomic/atomics.tbl | 41 + src/net/scripts/atomic/check-atomics.sh | 34 + src/net/scripts/atomic/fallbacks/acquire | 9 + src/net/scripts/atomic/fallbacks/add_negative | 16 + src/net/scripts/atomic/fallbacks/add_unless | 16 + src/net/scripts/atomic/fallbacks/andnot | 7 + src/net/scripts/atomic/fallbacks/dec | 7 + src/net/scripts/atomic/fallbacks/dec_and_test | 15 + .../scripts/atomic/fallbacks/dec_if_positive | 15 + .../atomic/fallbacks/dec_unless_positive | 14 + src/net/scripts/atomic/fallbacks/fence | 11 + .../scripts/atomic/fallbacks/fetch_add_unless | 23 + src/net/scripts/atomic/fallbacks/inc | 7 + src/net/scripts/atomic/fallbacks/inc_and_test | 15 + src/net/scripts/atomic/fallbacks/inc_not_zero | 14 + .../atomic/fallbacks/inc_unless_negative | 14 + src/net/scripts/atomic/fallbacks/read_acquire | 7 + src/net/scripts/atomic/fallbacks/release | 8 + src/net/scripts/atomic/fallbacks/set_release | 7 + src/net/scripts/atomic/fallbacks/sub_and_test | 16 + src/net/scripts/atomic/fallbacks/try_cmpxchg | 11 + src/net/scripts/atomic/gen-atomic-fallback.sh | 260 + .../scripts/atomic/gen-atomic-instrumented.sh | 209 + src/net/scripts/atomic/gen-atomic-long.sh | 102 + src/net/scripts/atomic/gen-atomics.sh | 21 + src/net/scripts/basic/.gitignore | 2 + src/net/scripts/basic/Makefile | 5 + src/net/scripts/basic/fixdep.c | 404 + src/net/scripts/bin2c.c | 36 + src/net/scripts/bloat-o-meter | 104 + src/net/scripts/bootgraph.pl | 224 + src/net/scripts/bpf_helpers_doc.py | 611 + src/net/scripts/cc-can-link.sh | 11 + src/net/scripts/check-sysctl-docs | 181 + src/net/scripts/check_extable.sh | 147 + src/net/scripts/checkincludes.pl | 98 + src/net/scripts/checkkconfigsymbols.py | 476 + src/net/scripts/checkpatch.pl | 7092 + src/net/scripts/checkstack.pl | 201 + src/net/scripts/checksyscalls.sh | 269 + src/net/scripts/checkversion.pl | 72 + .../clang-tools/gen_compile_commands.py | 237 + .../scripts/clang-tools/run-clang-tools.py | 74 + src/net/scripts/clang-version.sh | 19 + src/net/scripts/cleanfile | 178 + src/net/scripts/cleanpatch | 260 + src/net/scripts/coccicheck | 273 + .../coccinelle/api/alloc/alloc_cast.cocci | 123 + .../api/alloc/pool_zalloc-simple.cocci | 85 + .../coccinelle/api/alloc/zalloc-simple.cocci | 411 + .../coccinelle/api/atomic_as_refcounter.cocci | 130 + .../coccinelle/api/check_bq27xxx_data.cocci | 162 + .../scripts/coccinelle/api/d_find_alias.cocci | 81 + .../api/debugfs/debugfs_simple_attr.cocci | 68 + .../coccinelle/api/device_attr_show.cocci | 55 + src/net/scripts/coccinelle/api/err_cast.cocci | 57 + .../coccinelle/api/kfree_mismatch.cocci | 228 + .../coccinelle/api/kfree_sensitive.cocci | 100 + .../scripts/coccinelle/api/kobj_to_dev.cocci | 45 + src/net/scripts/coccinelle/api/kstrdup.cocci | 105 + src/net/scripts/coccinelle/api/kvmalloc.cocci | 256 + src/net/scripts/coccinelle/api/memdup.cocci | 66 + .../scripts/coccinelle/api/memdup_user.cocci | 119 + .../coccinelle/api/platform_get_irq.cocci | 102 + .../api/platform_no_drv_owner.cocci | 180 + .../scripts/coccinelle/api/pm_runtime.cocci | 114 + src/net/scripts/coccinelle/api/ptr_ret.cocci | 97 + .../coccinelle/api/resource_size.cocci | 94 + .../scripts/coccinelle/api/simple_open.cocci | 71 + .../scripts/coccinelle/api/stream_open.cocci | 370 + .../scripts/coccinelle/api/vma_pages.cocci | 61 + src/net/scripts/coccinelle/free/clk_put.cocci | 68 + .../scripts/coccinelle/free/devm_free.cocci | 143 + .../scripts/coccinelle/free/ifnullfree.cocci | 67 + src/net/scripts/coccinelle/free/iounmap.cocci | 68 + src/net/scripts/coccinelle/free/kfree.cocci | 134 + .../scripts/coccinelle/free/kfreeaddr.cocci | 37 + .../coccinelle/free/pci_free_consistent.cocci | 53 + .../scripts/coccinelle/free/put_device.cocci | 56 + .../iterators/device_node_continue.cocci | 104 + .../scripts/coccinelle/iterators/fen.cocci | 124 + .../coccinelle/iterators/for_each_child.cocci | 358 + .../scripts/coccinelle/iterators/itnull.cocci | 95 + .../iterators/list_entry_update.cocci | 63 + .../coccinelle/iterators/use_after_iter.cocci | 151 + .../scripts/coccinelle/locks/call_kern.cocci | 106 + .../coccinelle/locks/double_lock.cocci | 93 + src/net/scripts/coccinelle/locks/flags.cocci | 81 + .../scripts/coccinelle/locks/mini_lock.cocci | 99 + .../coccinelle/misc/add_namespace.cocci | 31 + .../scripts/coccinelle/misc/array_size.cocci | 88 + .../coccinelle/misc/array_size_dup.cocci | 209 + src/net/scripts/coccinelle/misc/badty.cocci | 77 + .../scripts/coccinelle/misc/boolconv.cocci | 91 + .../scripts/coccinelle/misc/boolinit.cocci | 195 + .../scripts/coccinelle/misc/boolreturn.cocci | 59 + src/net/scripts/coccinelle/misc/bugon.cocci | 63 + .../coccinelle/misc/cond_no_effect.cocci | 65 + src/net/scripts/coccinelle/misc/cstptr.cocci | 42 + .../scripts/coccinelle/misc/doubleinit.cocci | 54 + .../coccinelle/misc/excluded_middle.cocci | 39 + .../coccinelle/misc/flexible_array.cocci | 88 + src/net/scripts/coccinelle/misc/ifaddr.cocci | 35 + src/net/scripts/coccinelle/misc/ifcol.cocci | 49 + .../coccinelle/misc/irqf_oneshot.cocci | 113 + .../coccinelle/misc/newline_in_nl_msg.cocci | 75 + src/net/scripts/coccinelle/misc/noderef.cocci | 82 + .../scripts/coccinelle/misc/of_table.cocci | 86 + src/net/scripts/coccinelle/misc/orplus.cocci | 71 + .../scripts/coccinelle/misc/returnvar.cocci | 67 + .../scripts/coccinelle/misc/semicolon.cocci | 84 + .../coccinelle/misc/uninitialized_var.cocci | 51 + src/net/scripts/coccinelle/misc/warn.cocci | 110 + src/net/scripts/coccinelle/null/badzero.cocci | 239 + .../scripts/coccinelle/null/deref_null.cocci | 283 + src/net/scripts/coccinelle/null/eno.cocci | 49 + src/net/scripts/coccinelle/null/kmerr.cocci | 73 + .../coccinelle/tests/doublebitand.cocci | 55 + .../scripts/coccinelle/tests/doubletest.cocci | 59 + .../coccinelle/tests/odd_ptr_err.cocci | 118 + .../tests/unsigned_lesser_than_zero.cocci | 76 + src/net/scripts/config | 229 + src/net/scripts/const_structs.checkpatch | 68 + src/net/scripts/decode_stacktrace.sh | 225 + src/net/scripts/decodecode | 147 + src/net/scripts/depmod.sh | 55 + src/net/scripts/dev-needs.sh | 315 + src/net/scripts/diffconfig | 132 + src/net/scripts/documentation-file-ref-check | 241 + src/net/scripts/dtc/.gitignore | 2 + src/net/scripts/dtc/Makefile | 33 + src/net/scripts/dtc/checks.c | 1953 + src/net/scripts/dtc/data.c | 256 + src/net/scripts/dtc/dt_to_config | 1212 + src/net/scripts/dtc/dtc-lexer.l | 297 + src/net/scripts/dtc/dtc-parser.y | 576 + src/net/scripts/dtc/dtc.c | 369 + src/net/scripts/dtc/dtc.h | 332 + src/net/scripts/dtc/dtx_diff | 361 + src/net/scripts/dtc/fdtdump.c | 163 + src/net/scripts/dtc/fdtget.c | 352 + src/net/scripts/dtc/fdtput.c | 348 + src/net/scripts/dtc/flattree.c | 925 + src/net/scripts/dtc/fstree.c | 76 + src/net/scripts/dtc/libfdt/fdt.c | 327 + src/net/scripts/dtc/libfdt/fdt.h | 66 + src/net/scripts/dtc/libfdt/fdt_addresses.c | 101 + src/net/scripts/dtc/libfdt/fdt_empty_tree.c | 38 + src/net/scripts/dtc/libfdt/fdt_overlay.c | 882 + src/net/scripts/dtc/libfdt/fdt_ro.c | 859 + src/net/scripts/dtc/libfdt/fdt_rw.c | 492 + src/net/scripts/dtc/libfdt/fdt_strerror.c | 59 + src/net/scripts/dtc/libfdt/fdt_sw.c | 384 + src/net/scripts/dtc/libfdt/fdt_wip.c | 94 + src/net/scripts/dtc/libfdt/libfdt.h | 2080 + src/net/scripts/dtc/libfdt/libfdt_env.h | 96 + src/net/scripts/dtc/libfdt/libfdt_internal.h | 173 + src/net/scripts/dtc/livetree.c | 1032 + src/net/scripts/dtc/srcpos.c | 406 + src/net/scripts/dtc/srcpos.h | 103 + src/net/scripts/dtc/treesource.c | 345 + src/net/scripts/dtc/update-dtc-source.sh | 79 + src/net/scripts/dtc/util.c | 468 + src/net/scripts/dtc/util.h | 247 + src/net/scripts/dtc/version_gen.h | 1 + src/net/scripts/dtc/yamltree.c | 233 + src/net/scripts/dummy-tools/gcc | 92 + src/net/scripts/dummy-tools/ld | 30 + src/net/scripts/dummy-tools/nm | 1 + src/net/scripts/dummy-tools/objcopy | 1 + src/net/scripts/export_report.pl | 186 + src/net/scripts/extract-cert.c | 162 + src/net/scripts/extract-ikconfig | 68 + src/net/scripts/extract-module-sig.pl | 138 + src/net/scripts/extract-sys-certs.pl | 159 + src/net/scripts/extract-vmlinux | 64 + src/net/scripts/extract_xc3028.pl | 1717 + src/net/scripts/faddr2line | 289 + src/net/scripts/file-size.sh | 4 + src/net/scripts/find-unused-docs.sh | 62 + src/net/scripts/gcc-goto.sh | 22 + src/net/scripts/gcc-ld | 30 + src/net/scripts/gcc-plugins/.gitignore | 2 + src/net/scripts/gcc-plugins/Kconfig | 107 + src/net/scripts/gcc-plugins/Makefile | 61 + .../gcc-plugins/arm_ssp_per_task_plugin.c | 122 + .../gcc-plugins/cyc_complexity_plugin.c | 69 + src/net/scripts/gcc-plugins/gcc-common.h | 980 + .../gcc-plugins/gcc-generate-gimple-pass.h | 176 + .../gcc-plugins/gcc-generate-ipa-pass.h | 290 + .../gcc-plugins/gcc-generate-rtl-pass.h | 176 + .../gcc-generate-simple_ipa-pass.h | 176 + .../scripts/gcc-plugins/gen-random-seed.sh | 9 + .../gcc-plugins/latent_entropy_plugin.c | 638 + .../gcc-plugins/randomize_layout_plugin.c | 992 + src/net/scripts/gcc-plugins/sancov_plugin.c | 140 + .../scripts/gcc-plugins/stackleak_plugin.c | 631 + .../scripts/gcc-plugins/structleak_plugin.c | 264 + src/net/scripts/gcc-version.sh | 20 + .../scripts/gcc-x86_32-has-stack-protector.sh | 4 + .../scripts/gcc-x86_64-has-stack-protector.sh | 4 + src/net/scripts/gdb/Makefile | 2 + src/net/scripts/gdb/linux/.gitignore | 4 + src/net/scripts/gdb/linux/Makefile | 25 + src/net/scripts/gdb/linux/__init__.py | 1 + src/net/scripts/gdb/linux/clk.py | 76 + src/net/scripts/gdb/linux/config.py | 44 + src/net/scripts/gdb/linux/constants.py.in | 77 + src/net/scripts/gdb/linux/cpus.py | 174 + src/net/scripts/gdb/linux/device.py | 182 + src/net/scripts/gdb/linux/dmesg.py | 154 + src/net/scripts/gdb/linux/genpd.py | 83 + src/net/scripts/gdb/linux/lists.py | 131 + src/net/scripts/gdb/linux/modules.py | 95 + src/net/scripts/gdb/linux/proc.py | 275 + src/net/scripts/gdb/linux/rbtree.py | 177 + src/net/scripts/gdb/linux/symbols.py | 187 + src/net/scripts/gdb/linux/tasks.py | 140 + src/net/scripts/gdb/linux/timerlist.py | 219 + src/net/scripts/gdb/linux/utils.py | 193 + src/net/scripts/gdb/vmlinux-gdb.py | 39 + src/net/scripts/gen_autoksyms.sh | 55 + src/net/scripts/gen_ksymdeps.sh | 31 + src/net/scripts/genksyms/.gitignore | 2 + src/net/scripts/genksyms/Makefile | 30 + src/net/scripts/genksyms/genksyms.c | 873 + src/net/scripts/genksyms/genksyms.h | 83 + src/net/scripts/genksyms/keywords.c | 75 + src/net/scripts/genksyms/lex.l | 469 + src/net/scripts/genksyms/parse.y | 503 + src/net/scripts/get_abi.pl | 628 + src/net/scripts/get_dvb_firmware | 929 + src/net/scripts/get_maintainer.pl | 2618 + src/net/scripts/gfp-translate | 86 + src/net/scripts/headerdep.pl | 193 + src/net/scripts/headers_check.pl | 171 + src/net/scripts/headers_install.sh | 113 + src/net/scripts/insert-sys-cert.c | 410 + src/net/scripts/jobserver-exec | 66 + src/net/scripts/kallsyms.c | 832 + src/net/scripts/kconfig/.gitignore | 12 + src/net/scripts/kconfig/Makefile | 216 + src/net/scripts/kconfig/conf.c | 727 + src/net/scripts/kconfig/confdata.c | 1343 + src/net/scripts/kconfig/expr.c | 1303 + src/net/scripts/kconfig/expr.h | 332 + src/net/scripts/kconfig/gconf-cfg.sh | 30 + src/net/scripts/kconfig/gconf.c | 1517 + src/net/scripts/kconfig/gconf.glade | 661 + src/net/scripts/kconfig/images.c | 328 + src/net/scripts/kconfig/images.h | 33 + src/net/scripts/kconfig/lexer.l | 471 + src/net/scripts/kconfig/list.h | 132 + src/net/scripts/kconfig/lkc.h | 173 + src/net/scripts/kconfig/lkc_proto.h | 51 + .../scripts/kconfig/lxdialog/BIG.FAT.WARNING | 4 + src/net/scripts/kconfig/lxdialog/checklist.c | 319 + src/net/scripts/kconfig/lxdialog/dialog.h | 238 + src/net/scripts/kconfig/lxdialog/inputbox.c | 289 + src/net/scripts/kconfig/lxdialog/menubox.c | 424 + src/net/scripts/kconfig/lxdialog/textbox.c | 395 + src/net/scripts/kconfig/lxdialog/util.c | 700 + src/net/scripts/kconfig/lxdialog/yesno.c | 101 + src/net/scripts/kconfig/mconf-cfg.sh | 50 + src/net/scripts/kconfig/mconf.c | 1040 + src/net/scripts/kconfig/menu.c | 899 + src/net/scripts/kconfig/merge_config.sh | 189 + src/net/scripts/kconfig/nconf-cfg.sh | 50 + src/net/scripts/kconfig/nconf.c | 1555 + src/net/scripts/kconfig/nconf.gui.c | 664 + src/net/scripts/kconfig/nconf.h | 92 + src/net/scripts/kconfig/parser.y | 727 + src/net/scripts/kconfig/preprocess.c | 574 + src/net/scripts/kconfig/qconf-cfg.sh | 32 + src/net/scripts/kconfig/qconf.cc | 1892 + src/net/scripts/kconfig/qconf.h | 275 + src/net/scripts/kconfig/streamline_config.pl | 704 + src/net/scripts/kconfig/symbol.c | 1314 + .../kconfig/tests/auto_submenu/Kconfig | 52 + .../kconfig/tests/auto_submenu/__init__.py | 13 + .../tests/auto_submenu/expected_stdout | 10 + src/net/scripts/kconfig/tests/choice/Kconfig | 56 + .../scripts/kconfig/tests/choice/__init__.py | 41 + .../tests/choice/alldef_expected_config | 5 + .../tests/choice/allmod_expected_config | 9 + .../tests/choice/allno_expected_config | 5 + .../tests/choice/allyes_expected_config | 9 + .../tests/choice/oldask0_expected_stdout | 10 + .../kconfig/tests/choice/oldask1_config | 2 + .../tests/choice/oldask1_expected_stdout | 15 + .../tests/choice_value_with_m_dep/Kconfig | 21 + .../tests/choice_value_with_m_dep/__init__.py | 16 + .../tests/choice_value_with_m_dep/config | 2 + .../choice_value_with_m_dep/expected_config | 3 + .../choice_value_with_m_dep/expected_stdout | 4 + src/net/scripts/kconfig/tests/conftest.py | 291 + .../kconfig/tests/err_recursive_dep/Kconfig | 63 + .../tests/err_recursive_dep/__init__.py | 10 + .../tests/err_recursive_dep/expected_stderr | 38 + .../kconfig/tests/err_recursive_inc/Kconfig | 2 + .../tests/err_recursive_inc/Kconfig.inc1 | 5 + .../tests/err_recursive_inc/Kconfig.inc2 | 4 + .../tests/err_recursive_inc/Kconfig.inc3 | 2 + .../tests/err_recursive_inc/__init__.py | 11 + .../tests/err_recursive_inc/expected_stderr | 6 + .../kconfig/tests/inter_choice/Kconfig | 25 + .../kconfig/tests/inter_choice/__init__.py | 15 + .../kconfig/tests/inter_choice/defconfig | 1 + .../tests/inter_choice/expected_config | 4 + .../kconfig/tests/new_choice_with_dep/Kconfig | 39 + .../tests/new_choice_with_dep/__init__.py | 15 + .../kconfig/tests/new_choice_with_dep/config | 3 + .../tests/new_choice_with_dep/expected_stdout | 10 + .../tests/no_write_if_dep_unmet/Kconfig | 16 + .../tests/no_write_if_dep_unmet/__init__.py | 20 + .../tests/no_write_if_dep_unmet/config | 1 + .../no_write_if_dep_unmet/expected_config | 5 + .../tests/preprocess/builtin_func/Kconfig | 27 + .../tests/preprocess/builtin_func/__init__.py | 9 + .../preprocess/builtin_func/expected_stderr | 5 + .../preprocess/builtin_func/expected_stdout | 1 + .../preprocess/circular_expansion/Kconfig | 5 + .../preprocess/circular_expansion/__init__.py | 11 + .../circular_expansion/expected_stderr | 1 + .../kconfig/tests/preprocess/escape/Kconfig | 44 + .../tests/preprocess/escape/__init__.py | 8 + .../tests/preprocess/escape/expected_stderr | 10 + .../kconfig/tests/preprocess/variable/Kconfig | 53 + .../tests/preprocess/variable/__init__.py | 8 + .../tests/preprocess/variable/expected_stderr | 9 + src/net/scripts/kconfig/tests/pytest.ini | 7 + src/net/scripts/kconfig/util.c | 129 + src/net/scripts/kernel-doc | 2439 + src/net/scripts/ksymoops/README | 7 + src/net/scripts/ld-version.sh | 11 + src/net/scripts/leaking_addresses.pl | 647 + src/net/scripts/link-vmlinux.sh | 375 + src/net/scripts/lld-version.sh | 37 + src/net/scripts/makelst | 32 + src/net/scripts/markup_oops.pl | 366 + src/net/scripts/mkcompile_h | 96 + src/net/scripts/mkmakefile | 17 + src/net/scripts/mksysmap | 44 + src/net/scripts/mkuboot.sh | 20 + src/net/scripts/mod/.gitignore | 5 + src/net/scripts/mod/Makefile | 27 + src/net/scripts/mod/devicetable-offsets.c | 250 + src/net/scripts/mod/empty.c | 1 + src/net/scripts/mod/file2alias.c | 1530 + src/net/scripts/mod/mk_elfconfig.c | 57 + src/net/scripts/mod/modpost.c | 2678 + src/net/scripts/mod/modpost.h | 206 + src/net/scripts/mod/sumversion.c | 420 + src/net/scripts/module.lds.S | 55 + src/net/scripts/modules-check.sh | 26 + src/net/scripts/nsdeps | 63 + src/net/scripts/objdiff | 162 + src/net/scripts/package/builddeb | 240 + src/net/scripts/package/buildtar | 159 + src/net/scripts/package/mkdebian | 246 + src/net/scripts/package/mkspec | 147 + src/net/scripts/package/snapcraft.template | 14 + src/net/scripts/pahole-flags.sh | 21 + src/net/scripts/parse-maintainers.pl | 194 + src/net/scripts/patch-kernel | 332 + src/net/scripts/profile2linkerlist.pl | 20 + src/net/scripts/prune-kernel | 21 + src/net/scripts/recordmcount.c | 710 + src/net/scripts/recordmcount.h | 697 + src/net/scripts/recordmcount.pl | 647 + src/net/scripts/selinux/Makefile | 2 + src/net/scripts/selinux/README | 2 + src/net/scripts/selinux/genheaders/.gitignore | 2 + src/net/scripts/selinux/genheaders/Makefile | 5 + .../scripts/selinux/genheaders/genheaders.c | 142 + src/net/scripts/selinux/install_policy.sh | 85 + src/net/scripts/selinux/mdp/.gitignore | 2 + src/net/scripts/selinux/mdp/Makefile | 7 + src/net/scripts/selinux/mdp/dbus_contexts | 6 + src/net/scripts/selinux/mdp/mdp.c | 273 + src/net/scripts/setlocalversion | 194 + src/net/scripts/show_delta | 128 + src/net/scripts/sign-file.c | 423 + src/net/scripts/sorttable.c | 485 + src/net/scripts/sorttable.h | 497 + src/net/scripts/spdxcheck-test.sh | 12 + src/net/scripts/spdxcheck.py | 296 + src/net/scripts/spelling.txt | 1536 + src/net/scripts/sphinx-pre-install | 925 + src/net/scripts/split-man.pl | 28 + src/net/scripts/stackdelta | 60 + src/net/scripts/stackusage | 34 + src/net/scripts/subarch.include | 13 + src/net/scripts/tags.sh | 330 + src/net/scripts/tools-support-relr.sh | 17 + src/net/scripts/tracing/draw_functrace.py | 129 + src/net/scripts/tracing/ftrace-bisect.sh | 116 + src/net/scripts/unifdef.c | 1225 + src/net/scripts/ver_linux | 81 + src/net/scripts/xen-hypercalls.sh | 13 + src/net/scripts/xz_wrap.sh | 23 + src/net/smoke.sh | 16 + src/net/test | 2 + src/net/test_tools/Makefile | 9 + src/net/test_tools/pkt_dtp_nopi_parse.txt | 34 + src/net/test_tools/pkt_dtp_pi_parse.txt | 34 + .../test_tools/pkt_dtp_pi_parse_lookside.txt | 34 + src/net/test_tools/pkt_np_128.txt | 35 + src/net/test_tools/zxdh_net_test.c | 496 + src/net/test_tools/zxdh_net_test.h | 100 + src/net/upload.sh | 201 + src/net/ut.sh | 6 + src/net/zxdh_eth_rpm_build.sh | 276 + src/net/zxdh_hpf_rpm_build.sh | 209 + src/net/zxdh_kernel.sh | 127 + src/net/zxdh_zf_mpf_rpm_build.sh | 201 + 857 files changed, 394486 insertions(+) create mode 100644 kmod-zxdh.spec create mode 100644 src/crypto/zsda/Makefile create mode 100644 src/crypto/zsda/accdevice/Makefile create mode 100644 src/crypto/zsda/accdevice/zsda_common/Makefile create mode 100644 src/crypto/zsda/accdevice/zsda_common/zsda_alg.c create mode 100644 src/crypto/zsda/accdevice/zsda_common/zsda_alg.h create mode 100644 src/crypto/zsda/accdevice/zsda_common/zsda_common_drv.c create mode 100644 src/crypto/zsda/accdevice/zsda_common/zsda_common_drv.h create mode 100644 src/crypto/zsda/accdevice/zsda_common/zsda_isr.c create mode 100644 src/crypto/zsda/accdevice/zsda_common/zsda_manage.c create mode 100644 src/crypto/zsda/accdevice/zsda_common/zsda_manage.h create mode 100644 src/crypto/zsda/accdevice/zsda_common/zsda_pci.c create mode 100644 src/crypto/zsda/accdevice/zsda_common/zsda_pci.h create mode 100644 src/crypto/zsda/accdevice/zsda_common/zsda_qp.c create mode 100644 src/crypto/zsda/accdevice/zsda_common/zsda_qp.h create mode 100644 src/crypto/zsda/accdevice/zsda_pf/Makefile create mode 100644 src/crypto/zsda/accdevice/zsda_pf/zsda_drv.c create mode 100644 src/crypto/zsda/accdevice/zsda_vf/Makefile create mode 100644 src/crypto/zsda/accdevice/zsda_vf/zsda_drv.c create mode 100644 src/crypto/zsda/include/acc_addr.h create mode 100644 src/crypto/zsda/include/acc_dev.h create mode 100644 src/crypto/zsda/include/acc_version.h create mode 100755 src/net/Kconfig create mode 100755 src/net/Makefile create mode 100644 src/net/README.MD create mode 100755 src/net/build.sh create mode 100755 src/net/build/Makefile create mode 100755 src/net/build/build.pl create mode 100644 src/net/build/config.mk create mode 100644 src/net/build/spec/zxdh-eth.spec.example create mode 100644 src/net/build/spec/zxdh-hpf.spec.example create mode 100644 src/net/build/spec/zxdh-zf-mpf.spec.example create mode 100755 src/net/build/zxdh_config/dpu_init.cfg create mode 100755 src/net/build/zxdh_config/smart_nic_init.cfg create mode 100755 src/net/ci_cmd.sh rename src/net/{README => compat/config.h} (100%) mode change 100644 => 100755 create mode 100755 src/net/compile.sh create mode 100755 src/net/drivers/base/Makefile create mode 100644 src/net/drivers/base/en_auxiliary.c create mode 100755 src/net/drivers/net/ethernet/dinghai/Kconfig create mode 100755 src/net/drivers/net/ethernet/dinghai/Makefile create mode 100755 src/net/drivers/net/ethernet/dinghai/cmd.c create mode 100644 src/net/drivers/net/ethernet/dinghai/cmd/msg_chan_lock.c create mode 100644 src/net/drivers/net/ethernet/dinghai/cmd/msg_chan_lock.h create mode 100644 src/net/drivers/net/ethernet/dinghai/cmd/msg_chan_priv.h create mode 100644 src/net/drivers/net/ethernet/dinghai/cmd/msg_chan_test.c create mode 100644 src/net/drivers/net/ethernet/dinghai/cmd/msg_chan_ver.h create mode 100644 src/net/drivers/net/ethernet/dinghai/cmd/msg_main.c create mode 100755 src/net/drivers/net/ethernet/dinghai/devlink.c create mode 100644 src/net/drivers/net/ethernet/dinghai/dh_cmd.c create mode 100644 src/net/drivers/net/ethernet/dinghai/dh_procfs.c create mode 100644 src/net/drivers/net/ethernet/dinghai/dh_procfs.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_aux.c create mode 100755 src/net/drivers/net/ethernet/dinghai/en_aux.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_aux/dcbnl/en_dcbnl.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_aux/dcbnl/en_dcbnl.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_aux/dcbnl/en_dcbnl_api.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_aux/dcbnl/en_dcbnl_api.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_aux/drs_sec_dtb.c create mode 100755 src/net/drivers/net/ethernet/dinghai/en_aux/drs_sec_dtb.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_aux/en_1588_pkt_proc.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_aux/en_1588_pkt_proc.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_aux/en_1588_pkt_proc_func.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_aux/en_1588_pkt_proc_func.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_aux/en_cmd.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_aux/en_cmd.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_aux/en_ioctl.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_aux/en_ioctl.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_aux/eq.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_aux/eq.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_aux/events.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_aux/events.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_aux/priv_queue.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_aux/priv_queue.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_aux/queue.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_aux/queue.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_ethtool/ethtool.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_ethtool/ethtool.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_mpf.c create mode 100755 src/net/drivers/net/ethernet/dinghai/en_mpf.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_mpf/cfg_sf.c create mode 100755 src/net/drivers/net/ethernet/dinghai/en_mpf/cfg_sf.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_mpf/devlink.c create mode 100755 src/net/drivers/net/ethernet/dinghai/en_mpf/devlink.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_mpf/eq.c create mode 100755 src/net/drivers/net/ethernet/dinghai/en_mpf/eq.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_mpf/events.c create mode 100755 src/net/drivers/net/ethernet/dinghai/en_mpf/events.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_mpf/irq.c create mode 100755 src/net/drivers/net/ethernet/dinghai/en_mpf/irq.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_mpf/tc.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/.clang-format create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/.gitignore create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/Makefile create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/Makefile.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/agent/Kbuild.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/agent/include/dpp_agent_channel.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/agent/source/Kbuild.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/agent/source/dpp_agent_channel.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/cmd/Kbuild.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/cmd/include/dpp_cmd_init.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/cmd/include/dpp_cmd_shell.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/cmd/source/Kbuild.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/cmd/source/dpp_cmd_init.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/cmd/source/dpp_cmd_shell.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/comm/Kbuild.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_avl_tree.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_double_link.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_doublelink_index.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_index_ctrl.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_index_fill.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_index_fill_type.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_index_reserve.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_liststack.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_rb_tree.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_socket.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_thread.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_common.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_private.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_private_top.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_slt.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/comm/source/Kbuild.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_comm_double_link.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_comm_index_fill.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_comm_liststack.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_comm_mutex_lock.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_comm_print.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_comm_rb_tree.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_common.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_private_top.c create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/dpp_kshell create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/driver/Kbuild.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/driver/include/dpp_drv_acl.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/driver/include/dpp_drv_eram.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/driver/include/dpp_drv_hash.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/driver/include/dpp_drv_init.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/driver/include/dpp_drv_sdt.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/driver/source/Kbuild.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/driver/source/dpp_drv_acl.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/driver/source/dpp_drv_eram.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/driver/source/dpp_drv_hash.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/driver/source/dpp_drv_init.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/fc/Kbuild.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/fc/include/dpp_drv_fc.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/fc/source/Kbuild.include create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/fc/source/dpp_drv_fc.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/init/Kbuild.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/init/include/dpp_np_init.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/init/source/Kbuild.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/init/source/dpp_np_init.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/netlink/Kbuild.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/netlink/include/dpp_netlink.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/netlink/source/Kbuild.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/netlink/source/dpp_netlink.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/qos/Kbuild.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/qos/include/dpp_drv_qos.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/qos/source/Kbuild.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/qos/source/dpp_drv_qos.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/Kbuild.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_apt_se_api.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_dtb_table_api.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_pbu_api.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_ppu_api.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_reg_api.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_se_api.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_stat_api.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_tm_api.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_type_api.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/chip/dpp_dev.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/chip/dpp_init.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/init/dpp_kernel_init.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/dma/dpp_dtb.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/dma/dpp_dtb_cfg.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/nppu/dpp_pbu.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/ppu/dpp_ppu.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/se/dpp_apt_se.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/se/dpp_etcam.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/se/dpp_se.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/se/dpp_stat_car.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/se/dpp_stat_cfg.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/sdt/dpp_sdt.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/sdt/dpp_sdt_def.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/sdt/dpp_sdt_mgr.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/se/dpp_acl.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/se/dpp_dtb_table.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/se/dpp_hash.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/se/dpp_hash_crc.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/se/dpp_se_cfg.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/tm/dpp_tm.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_axi_reg.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_cfg_reg.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_dtb4k_reg.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_dtb_reg.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_etm_reg.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_mem_info.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_module.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_nppu_reg.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_pci.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_ppu4k_reg.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_ppu_reg.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_ptptm_reg.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_reg.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_reg_info.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_reg_struct.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_se4k_reg.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_se_reg.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_smmu0_reg.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_smmu14k_reg.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_smmu1_reg.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_stat4k_reg.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_stat_reg.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_trpg_reg.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_tsn_reg.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/diag/dpp_se_diag.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/Kbuild.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/Kbuild.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/chip/Kbuild.include create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/chip/dpp_dev.c create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/chip/dpp_init.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/init/Kbuild.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/init/dpp_kernel_init.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/Kbuild.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/dma/Kbuild.include create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/dma/dpp_dtb.c create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/dma/dpp_dtb_cfg.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/nppu/Kbuild.include create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/nppu/dpp_pbu.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/ppu/Kbuild.include create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/ppu/dpp_ppu.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se/Kbuild.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se/dpp_etcam.c create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se/dpp_se.c create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se/dpp_stat_car.c create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se/dpp_stat_cfg.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se_apt/Kbuild.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se_apt/dpp_apt_se_acl.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se_apt/dpp_apt_se_comm.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se_apt/dpp_apt_se_ddr.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se_apt/dpp_apt_se_eram.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se_apt/dpp_apt_se_hash.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/Kbuild.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/sdt/Kbuild.include create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/sdt/dpp_sdt.c create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/sdt/dpp_sdt_mgr.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/Kbuild.include create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/dpp_acl.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/dpp_dtb_table.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/dpp_dtb_table_api.c create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/dpp_hash.c create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/dpp_hash_crc.c create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/dpp_se_cfg.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/tm/Kbuild.include create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/tm/dpp_tm.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/reg/Kbuild.include create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/reg/dpp_module.c create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/reg/dpp_pci.c create mode 100755 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/reg/dpp_reg_api.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/reg/dpp_reg_info.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/Kbuild.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_api.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_bc.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_comm.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_diag.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_ipsec.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_lag.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_mac.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_mc.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_panel.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_port.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_promisc.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_ptp.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_qid.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_stat.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_tm.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_vlan.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/source/Kbuild.include create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_bc.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_comm.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_diag.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_ipsec.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_lag.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_mac.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_mc.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_panel.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_port.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_promisc.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_ptp.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_qid.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_stat.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_tm.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_vhca.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_vlan.c create mode 100755 src/net/drivers/net/ethernet/dinghai/en_pf.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_pf.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_pf/devlink.c create mode 100755 src/net/drivers/net/ethernet/dinghai/en_pf/devlink.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_pf/en_rep.c create mode 100755 src/net/drivers/net/ethernet/dinghai/en_pf/eq.c create mode 100755 src/net/drivers/net/ethernet/dinghai/en_pf/eq.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_pf/events.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_pf/events.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_pf/irq.c create mode 100755 src/net/drivers/net/ethernet/dinghai/en_pf/irq.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_pf/msg_func.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_pf/msg_func.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_pf/rdma.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_ptp/tod_driver.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_ptp/tod_driver.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_ptp/tod_driver_stub.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_ptp/zxdh_ptp.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_ptp/zxdh_ptp.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_ptp/zxdh_ptp_common.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_ptp/zxdh_ptp_regs.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_sf.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_sf.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_sf/devlink.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_sf/devlink.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_sf/eq.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_sf/eq.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_sf/irq.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_sf/irq.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn_comm.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn_ioctl.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn_ioctl.h create mode 100644 src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn_reg.c create mode 100644 src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn_reg.h create mode 100755 src/net/drivers/net/ethernet/dinghai/en_vf.c create mode 100755 src/net/drivers/net/ethernet/dinghai/eq.c create mode 100755 src/net/drivers/net/ethernet/dinghai/events.c create mode 100755 src/net/drivers/net/ethernet/dinghai/irq_affinity.c create mode 100644 src/net/drivers/net/ethernet/dinghai/lag/lag.c create mode 100644 src/net/drivers/net/ethernet/dinghai/lag/lag.h create mode 100644 src/net/drivers/net/ethernet/dinghai/lag/lag_procfs.c create mode 100644 src/net/drivers/net/ethernet/dinghai/msg_common.h create mode 100755 src/net/drivers/net/ethernet/dinghai/pci_irq.c create mode 100644 src/net/drivers/net/ethernet/dinghai/plcr.c create mode 100644 src/net/drivers/net/ethernet/dinghai/plcr.h create mode 100644 src/net/drivers/net/ethernet/dinghai/sriov_sysfs.c create mode 100755 src/net/drivers/net/ethernet/dinghai/wq.c create mode 100644 src/net/drivers/net/ethernet/dinghai/zf_mpf/bar_chan_user/normal_send_eg.c create mode 100644 src/net/drivers/net/ethernet/dinghai/zf_mpf/bar_chan_user/pci_res_query_eg.c create mode 100755 src/net/drivers/net/ethernet/dinghai/zf_mpf/cfg_sf.c create mode 100755 src/net/drivers/net/ethernet/dinghai/zf_mpf/cfg_sf.h create mode 100755 src/net/drivers/net/ethernet/dinghai/zf_mpf/devlink.c create mode 100755 src/net/drivers/net/ethernet/dinghai/zf_mpf/devlink.h create mode 100644 src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/Makefile create mode 100644 src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/dmaengine.c create mode 100644 src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/dmaengine.h create mode 100644 src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/pcie-zte-zf-epc.c create mode 100644 src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/pcie-zte-zf-epc.h create mode 100644 src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/pcie-zte-zf-hdma.c create mode 100644 src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/pcie-zte-zf-hdma.h create mode 100644 src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/virt-dma.c create mode 100644 src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/virt-dma.h create mode 100644 src/net/drivers/net/ethernet/dinghai/zf_mpf/epf/pcie-zte-zf-epf.c create mode 100644 src/net/drivers/net/ethernet/dinghai/zf_mpf/epf/pcie-zte-zf-epf.h create mode 100755 src/net/drivers/net/ethernet/dinghai/zf_mpf/eq.c create mode 100755 src/net/drivers/net/ethernet/dinghai/zf_mpf/eq.h create mode 100644 src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hotplug.c create mode 100644 src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hotplug.h create mode 100644 src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hotplug_commom.h create mode 100644 src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hotplug_ioctl.c create mode 100644 src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hotplug_ioctl.h create mode 100755 src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hp_app/build.sh create mode 100644 src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hp_app/fuc_hp_app.c create mode 100644 src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hp_app/fuc_hp_app.h create mode 100644 src/net/drivers/net/ethernet/dinghai/zf_mpf/gdma.c create mode 100644 src/net/drivers/net/ethernet/dinghai/zf_mpf/gdma.h create mode 100755 src/net/drivers/net/ethernet/dinghai/zf_mpf/irq.c create mode 100755 src/net/drivers/net/ethernet/dinghai/zf_mpf/irq.h create mode 100644 src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_chan_ioctl.c create mode 100644 src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_chan_ioctl.h create mode 100755 src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_events.c create mode 100755 src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_events.h create mode 100755 src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_mpf.c create mode 100755 src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_mpf.h create mode 100755 src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_reset_finish_flag.c create mode 100755 src/net/drivers/net/ethernet/dinghai/zf_mpf/zxdh_reset_zf.c create mode 100755 src/net/drivers/net/ethernet/dinghai/zxdh_tools/zxdh_tools_ioctl.c create mode 100755 src/net/drivers/net/ethernet/dinghai/zxdh_tools/zxdh_tools_ioctl.h create mode 100644 src/net/drivers/net/ethernet/dinghai/zxdh_tools/zxdh_tools_netlink.c create mode 100644 src/net/drivers/net/ethernet/dinghai/zxdh_tools/zxdh_tools_netlink.h create mode 100644 src/net/drivers/pcie/zxdh_pcie/Makefile create mode 100644 src/net/drivers/pcie/zxdh_pcie/bar_msg.c create mode 100644 src/net/drivers/pcie/zxdh_pcie/bar_msg.h create mode 100644 src/net/drivers/pcie/zxdh_pcie/function_hotplug.c create mode 100644 src/net/drivers/pcie/zxdh_pcie/function_hotplug.h create mode 100644 src/net/drivers/pcie/zxdh_pcie/pcie_common.c create mode 100644 src/net/drivers/pcie/zxdh_pcie/pcie_common.h create mode 100644 src/net/drivers/pcie/zxdh_pcie/pcie_msix.c create mode 100644 src/net/drivers/pcie/zxdh_pcie/pcie_msix.h create mode 100644 src/net/drivers/pcie/zxdh_pcie/zxdh_pcie.c create mode 100755 src/net/include/linux/dinghai/auxiliary_bus.h create mode 100755 src/net/include/linux/dinghai/device.h create mode 100755 src/net/include/linux/dinghai/devlink.h create mode 100644 src/net/include/linux/dinghai/dh_cmd.h create mode 100755 src/net/include/linux/dinghai/dh_ifc.h create mode 100755 src/net/include/linux/dinghai/dinghai_irq.h create mode 100755 src/net/include/linux/dinghai/driver.h create mode 100644 src/net/include/linux/dinghai/en_aux.h create mode 100755 src/net/include/linux/dinghai/en_sf.h create mode 100755 src/net/include/linux/dinghai/eq.h create mode 100755 src/net/include/linux/dinghai/events.h create mode 100755 src/net/include/linux/dinghai/helper.h create mode 100644 src/net/include/linux/dinghai/kcompat.h create mode 100644 src/net/include/linux/dinghai/kcompat_vfd.h create mode 100644 src/net/include/linux/dinghai/lag.h create mode 100644 src/net/include/linux/dinghai/log.h create mode 100755 src/net/include/linux/dinghai/pci_irq.h create mode 100644 src/net/include/linux/dinghai/queue.h create mode 100755 src/net/include/linux/types.h create mode 100644 src/net/pci.updates create mode 100644 src/net/scripts/.gitignore create mode 100644 src/net/scripts/Kbuild.include create mode 100644 src/net/scripts/Kconfig.include create mode 100755 src/net/scripts/Lindent create mode 100644 src/net/scripts/Makefile create mode 100644 src/net/scripts/Makefile.asm-generic create mode 100644 src/net/scripts/Makefile.build create mode 100644 src/net/scripts/Makefile.clean create mode 100644 src/net/scripts/Makefile.dtbinst create mode 100644 src/net/scripts/Makefile.extrawarn create mode 100644 src/net/scripts/Makefile.gcc-plugins create mode 100644 src/net/scripts/Makefile.headersinst create mode 100644 src/net/scripts/Makefile.host create mode 100644 src/net/scripts/Makefile.kasan create mode 100644 src/net/scripts/Makefile.kcov create mode 100644 src/net/scripts/Makefile.kcsan create mode 100644 src/net/scripts/Makefile.lib create mode 100644 src/net/scripts/Makefile.modfinal create mode 100644 src/net/scripts/Makefile.modinst create mode 100644 src/net/scripts/Makefile.modpost create mode 100644 src/net/scripts/Makefile.modsign create mode 100644 src/net/scripts/Makefile.package create mode 100644 src/net/scripts/Makefile.ubsan create mode 100644 src/net/scripts/Makefile.userprogs create mode 100755 src/net/scripts/adjust_autoksyms.sh create mode 100644 src/net/scripts/asn1_compiler.c create mode 100755 src/net/scripts/atomic/atomic-tbl.sh create mode 100755 src/net/scripts/atomic/atomics.tbl create mode 100755 src/net/scripts/atomic/check-atomics.sh create mode 100755 src/net/scripts/atomic/fallbacks/acquire create mode 100755 src/net/scripts/atomic/fallbacks/add_negative create mode 100755 src/net/scripts/atomic/fallbacks/add_unless create mode 100755 src/net/scripts/atomic/fallbacks/andnot create mode 100755 src/net/scripts/atomic/fallbacks/dec create mode 100755 src/net/scripts/atomic/fallbacks/dec_and_test create mode 100755 src/net/scripts/atomic/fallbacks/dec_if_positive create mode 100755 src/net/scripts/atomic/fallbacks/dec_unless_positive create mode 100755 src/net/scripts/atomic/fallbacks/fence create mode 100755 src/net/scripts/atomic/fallbacks/fetch_add_unless create mode 100755 src/net/scripts/atomic/fallbacks/inc create mode 100755 src/net/scripts/atomic/fallbacks/inc_and_test create mode 100755 src/net/scripts/atomic/fallbacks/inc_not_zero create mode 100755 src/net/scripts/atomic/fallbacks/inc_unless_negative create mode 100755 src/net/scripts/atomic/fallbacks/read_acquire create mode 100755 src/net/scripts/atomic/fallbacks/release create mode 100755 src/net/scripts/atomic/fallbacks/set_release create mode 100755 src/net/scripts/atomic/fallbacks/sub_and_test create mode 100755 src/net/scripts/atomic/fallbacks/try_cmpxchg create mode 100755 src/net/scripts/atomic/gen-atomic-fallback.sh create mode 100755 src/net/scripts/atomic/gen-atomic-instrumented.sh create mode 100755 src/net/scripts/atomic/gen-atomic-long.sh create mode 100644 src/net/scripts/atomic/gen-atomics.sh create mode 100644 src/net/scripts/basic/.gitignore create mode 100644 src/net/scripts/basic/Makefile create mode 100644 src/net/scripts/basic/fixdep.c create mode 100644 src/net/scripts/bin2c.c create mode 100755 src/net/scripts/bloat-o-meter create mode 100755 src/net/scripts/bootgraph.pl create mode 100755 src/net/scripts/bpf_helpers_doc.py create mode 100755 src/net/scripts/cc-can-link.sh create mode 100755 src/net/scripts/check-sysctl-docs create mode 100755 src/net/scripts/check_extable.sh create mode 100755 src/net/scripts/checkincludes.pl create mode 100755 src/net/scripts/checkkconfigsymbols.py create mode 100755 src/net/scripts/checkpatch.pl create mode 100755 src/net/scripts/checkstack.pl create mode 100755 src/net/scripts/checksyscalls.sh create mode 100755 src/net/scripts/checkversion.pl create mode 100755 src/net/scripts/clang-tools/gen_compile_commands.py create mode 100755 src/net/scripts/clang-tools/run-clang-tools.py create mode 100755 src/net/scripts/clang-version.sh create mode 100755 src/net/scripts/cleanfile create mode 100755 src/net/scripts/cleanpatch create mode 100755 src/net/scripts/coccicheck create mode 100644 src/net/scripts/coccinelle/api/alloc/alloc_cast.cocci create mode 100644 src/net/scripts/coccinelle/api/alloc/pool_zalloc-simple.cocci create mode 100644 src/net/scripts/coccinelle/api/alloc/zalloc-simple.cocci create mode 100644 src/net/scripts/coccinelle/api/atomic_as_refcounter.cocci create mode 100644 src/net/scripts/coccinelle/api/check_bq27xxx_data.cocci create mode 100644 src/net/scripts/coccinelle/api/d_find_alias.cocci create mode 100644 src/net/scripts/coccinelle/api/debugfs/debugfs_simple_attr.cocci create mode 100644 src/net/scripts/coccinelle/api/device_attr_show.cocci create mode 100644 src/net/scripts/coccinelle/api/err_cast.cocci create mode 100644 src/net/scripts/coccinelle/api/kfree_mismatch.cocci create mode 100644 src/net/scripts/coccinelle/api/kfree_sensitive.cocci create mode 100644 src/net/scripts/coccinelle/api/kobj_to_dev.cocci create mode 100644 src/net/scripts/coccinelle/api/kstrdup.cocci create mode 100644 src/net/scripts/coccinelle/api/kvmalloc.cocci create mode 100644 src/net/scripts/coccinelle/api/memdup.cocci create mode 100644 src/net/scripts/coccinelle/api/memdup_user.cocci create mode 100644 src/net/scripts/coccinelle/api/platform_get_irq.cocci create mode 100644 src/net/scripts/coccinelle/api/platform_no_drv_owner.cocci create mode 100644 src/net/scripts/coccinelle/api/pm_runtime.cocci create mode 100644 src/net/scripts/coccinelle/api/ptr_ret.cocci create mode 100644 src/net/scripts/coccinelle/api/resource_size.cocci create mode 100644 src/net/scripts/coccinelle/api/simple_open.cocci create mode 100644 src/net/scripts/coccinelle/api/stream_open.cocci create mode 100644 src/net/scripts/coccinelle/api/vma_pages.cocci create mode 100644 src/net/scripts/coccinelle/free/clk_put.cocci create mode 100644 src/net/scripts/coccinelle/free/devm_free.cocci create mode 100644 src/net/scripts/coccinelle/free/ifnullfree.cocci create mode 100644 src/net/scripts/coccinelle/free/iounmap.cocci create mode 100644 src/net/scripts/coccinelle/free/kfree.cocci create mode 100644 src/net/scripts/coccinelle/free/kfreeaddr.cocci create mode 100644 src/net/scripts/coccinelle/free/pci_free_consistent.cocci create mode 100644 src/net/scripts/coccinelle/free/put_device.cocci create mode 100644 src/net/scripts/coccinelle/iterators/device_node_continue.cocci create mode 100644 src/net/scripts/coccinelle/iterators/fen.cocci create mode 100644 src/net/scripts/coccinelle/iterators/for_each_child.cocci create mode 100644 src/net/scripts/coccinelle/iterators/itnull.cocci create mode 100644 src/net/scripts/coccinelle/iterators/list_entry_update.cocci create mode 100644 src/net/scripts/coccinelle/iterators/use_after_iter.cocci create mode 100644 src/net/scripts/coccinelle/locks/call_kern.cocci create mode 100644 src/net/scripts/coccinelle/locks/double_lock.cocci create mode 100644 src/net/scripts/coccinelle/locks/flags.cocci create mode 100644 src/net/scripts/coccinelle/locks/mini_lock.cocci create mode 100644 src/net/scripts/coccinelle/misc/add_namespace.cocci create mode 100644 src/net/scripts/coccinelle/misc/array_size.cocci create mode 100644 src/net/scripts/coccinelle/misc/array_size_dup.cocci create mode 100644 src/net/scripts/coccinelle/misc/badty.cocci create mode 100644 src/net/scripts/coccinelle/misc/boolconv.cocci create mode 100644 src/net/scripts/coccinelle/misc/boolinit.cocci create mode 100644 src/net/scripts/coccinelle/misc/boolreturn.cocci create mode 100644 src/net/scripts/coccinelle/misc/bugon.cocci create mode 100644 src/net/scripts/coccinelle/misc/cond_no_effect.cocci create mode 100644 src/net/scripts/coccinelle/misc/cstptr.cocci create mode 100644 src/net/scripts/coccinelle/misc/doubleinit.cocci create mode 100644 src/net/scripts/coccinelle/misc/excluded_middle.cocci create mode 100644 src/net/scripts/coccinelle/misc/flexible_array.cocci create mode 100644 src/net/scripts/coccinelle/misc/ifaddr.cocci create mode 100644 src/net/scripts/coccinelle/misc/ifcol.cocci create mode 100644 src/net/scripts/coccinelle/misc/irqf_oneshot.cocci create mode 100644 src/net/scripts/coccinelle/misc/newline_in_nl_msg.cocci create mode 100644 src/net/scripts/coccinelle/misc/noderef.cocci create mode 100644 src/net/scripts/coccinelle/misc/of_table.cocci create mode 100644 src/net/scripts/coccinelle/misc/orplus.cocci create mode 100644 src/net/scripts/coccinelle/misc/returnvar.cocci create mode 100644 src/net/scripts/coccinelle/misc/semicolon.cocci create mode 100644 src/net/scripts/coccinelle/misc/uninitialized_var.cocci create mode 100644 src/net/scripts/coccinelle/misc/warn.cocci create mode 100644 src/net/scripts/coccinelle/null/badzero.cocci create mode 100644 src/net/scripts/coccinelle/null/deref_null.cocci create mode 100644 src/net/scripts/coccinelle/null/eno.cocci create mode 100644 src/net/scripts/coccinelle/null/kmerr.cocci create mode 100644 src/net/scripts/coccinelle/tests/doublebitand.cocci create mode 100644 src/net/scripts/coccinelle/tests/doubletest.cocci create mode 100644 src/net/scripts/coccinelle/tests/odd_ptr_err.cocci create mode 100644 src/net/scripts/coccinelle/tests/unsigned_lesser_than_zero.cocci create mode 100755 src/net/scripts/config create mode 100644 src/net/scripts/const_structs.checkpatch create mode 100755 src/net/scripts/decode_stacktrace.sh create mode 100755 src/net/scripts/decodecode create mode 100755 src/net/scripts/depmod.sh create mode 100755 src/net/scripts/dev-needs.sh create mode 100755 src/net/scripts/diffconfig create mode 100755 src/net/scripts/documentation-file-ref-check create mode 100644 src/net/scripts/dtc/.gitignore create mode 100644 src/net/scripts/dtc/Makefile create mode 100644 src/net/scripts/dtc/checks.c create mode 100644 src/net/scripts/dtc/data.c create mode 100755 src/net/scripts/dtc/dt_to_config create mode 100644 src/net/scripts/dtc/dtc-lexer.l create mode 100644 src/net/scripts/dtc/dtc-parser.y create mode 100644 src/net/scripts/dtc/dtc.c create mode 100644 src/net/scripts/dtc/dtc.h create mode 100755 src/net/scripts/dtc/dtx_diff create mode 100644 src/net/scripts/dtc/fdtdump.c create mode 100644 src/net/scripts/dtc/fdtget.c create mode 100644 src/net/scripts/dtc/fdtput.c create mode 100644 src/net/scripts/dtc/flattree.c create mode 100644 src/net/scripts/dtc/fstree.c create mode 100644 src/net/scripts/dtc/libfdt/fdt.c create mode 100644 src/net/scripts/dtc/libfdt/fdt.h create mode 100644 src/net/scripts/dtc/libfdt/fdt_addresses.c create mode 100644 src/net/scripts/dtc/libfdt/fdt_empty_tree.c create mode 100644 src/net/scripts/dtc/libfdt/fdt_overlay.c create mode 100644 src/net/scripts/dtc/libfdt/fdt_ro.c create mode 100644 src/net/scripts/dtc/libfdt/fdt_rw.c create mode 100644 src/net/scripts/dtc/libfdt/fdt_strerror.c create mode 100644 src/net/scripts/dtc/libfdt/fdt_sw.c create mode 100644 src/net/scripts/dtc/libfdt/fdt_wip.c create mode 100644 src/net/scripts/dtc/libfdt/libfdt.h create mode 100644 src/net/scripts/dtc/libfdt/libfdt_env.h create mode 100644 src/net/scripts/dtc/libfdt/libfdt_internal.h create mode 100644 src/net/scripts/dtc/livetree.c create mode 100644 src/net/scripts/dtc/srcpos.c create mode 100644 src/net/scripts/dtc/srcpos.h create mode 100644 src/net/scripts/dtc/treesource.c create mode 100755 src/net/scripts/dtc/update-dtc-source.sh create mode 100644 src/net/scripts/dtc/util.c create mode 100644 src/net/scripts/dtc/util.h create mode 100644 src/net/scripts/dtc/version_gen.h create mode 100644 src/net/scripts/dtc/yamltree.c create mode 100755 src/net/scripts/dummy-tools/gcc create mode 100755 src/net/scripts/dummy-tools/ld create mode 120000 src/net/scripts/dummy-tools/nm create mode 120000 src/net/scripts/dummy-tools/objcopy create mode 100755 src/net/scripts/export_report.pl create mode 100644 src/net/scripts/extract-cert.c create mode 100755 src/net/scripts/extract-ikconfig create mode 100755 src/net/scripts/extract-module-sig.pl create mode 100755 src/net/scripts/extract-sys-certs.pl create mode 100755 src/net/scripts/extract-vmlinux create mode 100755 src/net/scripts/extract_xc3028.pl create mode 100755 src/net/scripts/faddr2line create mode 100755 src/net/scripts/file-size.sh create mode 100755 src/net/scripts/find-unused-docs.sh create mode 100755 src/net/scripts/gcc-goto.sh create mode 100755 src/net/scripts/gcc-ld create mode 100644 src/net/scripts/gcc-plugins/.gitignore create mode 100644 src/net/scripts/gcc-plugins/Kconfig create mode 100644 src/net/scripts/gcc-plugins/Makefile create mode 100644 src/net/scripts/gcc-plugins/arm_ssp_per_task_plugin.c create mode 100644 src/net/scripts/gcc-plugins/cyc_complexity_plugin.c create mode 100644 src/net/scripts/gcc-plugins/gcc-common.h create mode 100644 src/net/scripts/gcc-plugins/gcc-generate-gimple-pass.h create mode 100644 src/net/scripts/gcc-plugins/gcc-generate-ipa-pass.h create mode 100644 src/net/scripts/gcc-plugins/gcc-generate-rtl-pass.h create mode 100644 src/net/scripts/gcc-plugins/gcc-generate-simple_ipa-pass.h create mode 100644 src/net/scripts/gcc-plugins/gen-random-seed.sh create mode 100644 src/net/scripts/gcc-plugins/latent_entropy_plugin.c create mode 100644 src/net/scripts/gcc-plugins/randomize_layout_plugin.c create mode 100644 src/net/scripts/gcc-plugins/sancov_plugin.c create mode 100644 src/net/scripts/gcc-plugins/stackleak_plugin.c create mode 100644 src/net/scripts/gcc-plugins/structleak_plugin.c create mode 100755 src/net/scripts/gcc-version.sh create mode 100755 src/net/scripts/gcc-x86_32-has-stack-protector.sh create mode 100755 src/net/scripts/gcc-x86_64-has-stack-protector.sh create mode 100644 src/net/scripts/gdb/Makefile create mode 100644 src/net/scripts/gdb/linux/.gitignore create mode 100644 src/net/scripts/gdb/linux/Makefile create mode 100644 src/net/scripts/gdb/linux/__init__.py create mode 100644 src/net/scripts/gdb/linux/clk.py create mode 100644 src/net/scripts/gdb/linux/config.py create mode 100644 src/net/scripts/gdb/linux/constants.py.in create mode 100644 src/net/scripts/gdb/linux/cpus.py create mode 100644 src/net/scripts/gdb/linux/device.py create mode 100644 src/net/scripts/gdb/linux/dmesg.py create mode 100644 src/net/scripts/gdb/linux/genpd.py create mode 100644 src/net/scripts/gdb/linux/lists.py create mode 100644 src/net/scripts/gdb/linux/modules.py create mode 100644 src/net/scripts/gdb/linux/proc.py create mode 100644 src/net/scripts/gdb/linux/rbtree.py create mode 100644 src/net/scripts/gdb/linux/symbols.py create mode 100644 src/net/scripts/gdb/linux/tasks.py create mode 100644 src/net/scripts/gdb/linux/timerlist.py create mode 100644 src/net/scripts/gdb/linux/utils.py create mode 100644 src/net/scripts/gdb/vmlinux-gdb.py create mode 100755 src/net/scripts/gen_autoksyms.sh create mode 100755 src/net/scripts/gen_ksymdeps.sh create mode 100644 src/net/scripts/genksyms/.gitignore create mode 100644 src/net/scripts/genksyms/Makefile create mode 100644 src/net/scripts/genksyms/genksyms.c create mode 100644 src/net/scripts/genksyms/genksyms.h create mode 100644 src/net/scripts/genksyms/keywords.c create mode 100644 src/net/scripts/genksyms/lex.l create mode 100644 src/net/scripts/genksyms/parse.y create mode 100755 src/net/scripts/get_abi.pl create mode 100755 src/net/scripts/get_dvb_firmware create mode 100755 src/net/scripts/get_maintainer.pl create mode 100755 src/net/scripts/gfp-translate create mode 100755 src/net/scripts/headerdep.pl create mode 100755 src/net/scripts/headers_check.pl create mode 100755 src/net/scripts/headers_install.sh create mode 100644 src/net/scripts/insert-sys-cert.c create mode 100755 src/net/scripts/jobserver-exec create mode 100644 src/net/scripts/kallsyms.c create mode 100644 src/net/scripts/kconfig/.gitignore create mode 100644 src/net/scripts/kconfig/Makefile create mode 100644 src/net/scripts/kconfig/conf.c create mode 100644 src/net/scripts/kconfig/confdata.c create mode 100644 src/net/scripts/kconfig/expr.c create mode 100644 src/net/scripts/kconfig/expr.h create mode 100755 src/net/scripts/kconfig/gconf-cfg.sh create mode 100644 src/net/scripts/kconfig/gconf.c create mode 100644 src/net/scripts/kconfig/gconf.glade create mode 100644 src/net/scripts/kconfig/images.c create mode 100644 src/net/scripts/kconfig/images.h create mode 100644 src/net/scripts/kconfig/lexer.l create mode 100644 src/net/scripts/kconfig/list.h create mode 100644 src/net/scripts/kconfig/lkc.h create mode 100644 src/net/scripts/kconfig/lkc_proto.h create mode 100644 src/net/scripts/kconfig/lxdialog/BIG.FAT.WARNING create mode 100644 src/net/scripts/kconfig/lxdialog/checklist.c create mode 100644 src/net/scripts/kconfig/lxdialog/dialog.h create mode 100644 src/net/scripts/kconfig/lxdialog/inputbox.c create mode 100644 src/net/scripts/kconfig/lxdialog/menubox.c create mode 100644 src/net/scripts/kconfig/lxdialog/textbox.c create mode 100644 src/net/scripts/kconfig/lxdialog/util.c create mode 100644 src/net/scripts/kconfig/lxdialog/yesno.c create mode 100755 src/net/scripts/kconfig/mconf-cfg.sh create mode 100644 src/net/scripts/kconfig/mconf.c create mode 100644 src/net/scripts/kconfig/menu.c create mode 100755 src/net/scripts/kconfig/merge_config.sh create mode 100755 src/net/scripts/kconfig/nconf-cfg.sh create mode 100644 src/net/scripts/kconfig/nconf.c create mode 100644 src/net/scripts/kconfig/nconf.gui.c create mode 100644 src/net/scripts/kconfig/nconf.h create mode 100644 src/net/scripts/kconfig/parser.y create mode 100644 src/net/scripts/kconfig/preprocess.c create mode 100755 src/net/scripts/kconfig/qconf-cfg.sh create mode 100644 src/net/scripts/kconfig/qconf.cc create mode 100644 src/net/scripts/kconfig/qconf.h create mode 100755 src/net/scripts/kconfig/streamline_config.pl create mode 100644 src/net/scripts/kconfig/symbol.c create mode 100644 src/net/scripts/kconfig/tests/auto_submenu/Kconfig create mode 100644 src/net/scripts/kconfig/tests/auto_submenu/__init__.py create mode 100644 src/net/scripts/kconfig/tests/auto_submenu/expected_stdout create mode 100644 src/net/scripts/kconfig/tests/choice/Kconfig create mode 100644 src/net/scripts/kconfig/tests/choice/__init__.py create mode 100644 src/net/scripts/kconfig/tests/choice/alldef_expected_config create mode 100644 src/net/scripts/kconfig/tests/choice/allmod_expected_config create mode 100644 src/net/scripts/kconfig/tests/choice/allno_expected_config create mode 100644 src/net/scripts/kconfig/tests/choice/allyes_expected_config create mode 100644 src/net/scripts/kconfig/tests/choice/oldask0_expected_stdout create mode 100644 src/net/scripts/kconfig/tests/choice/oldask1_config create mode 100644 src/net/scripts/kconfig/tests/choice/oldask1_expected_stdout create mode 100644 src/net/scripts/kconfig/tests/choice_value_with_m_dep/Kconfig create mode 100644 src/net/scripts/kconfig/tests/choice_value_with_m_dep/__init__.py create mode 100644 src/net/scripts/kconfig/tests/choice_value_with_m_dep/config create mode 100644 src/net/scripts/kconfig/tests/choice_value_with_m_dep/expected_config create mode 100644 src/net/scripts/kconfig/tests/choice_value_with_m_dep/expected_stdout create mode 100644 src/net/scripts/kconfig/tests/conftest.py create mode 100644 src/net/scripts/kconfig/tests/err_recursive_dep/Kconfig create mode 100644 src/net/scripts/kconfig/tests/err_recursive_dep/__init__.py create mode 100644 src/net/scripts/kconfig/tests/err_recursive_dep/expected_stderr create mode 100644 src/net/scripts/kconfig/tests/err_recursive_inc/Kconfig create mode 100644 src/net/scripts/kconfig/tests/err_recursive_inc/Kconfig.inc1 create mode 100644 src/net/scripts/kconfig/tests/err_recursive_inc/Kconfig.inc2 create mode 100644 src/net/scripts/kconfig/tests/err_recursive_inc/Kconfig.inc3 create mode 100644 src/net/scripts/kconfig/tests/err_recursive_inc/__init__.py create mode 100644 src/net/scripts/kconfig/tests/err_recursive_inc/expected_stderr create mode 100644 src/net/scripts/kconfig/tests/inter_choice/Kconfig create mode 100644 src/net/scripts/kconfig/tests/inter_choice/__init__.py create mode 100644 src/net/scripts/kconfig/tests/inter_choice/defconfig create mode 100644 src/net/scripts/kconfig/tests/inter_choice/expected_config create mode 100644 src/net/scripts/kconfig/tests/new_choice_with_dep/Kconfig create mode 100644 src/net/scripts/kconfig/tests/new_choice_with_dep/__init__.py create mode 100644 src/net/scripts/kconfig/tests/new_choice_with_dep/config create mode 100644 src/net/scripts/kconfig/tests/new_choice_with_dep/expected_stdout create mode 100644 src/net/scripts/kconfig/tests/no_write_if_dep_unmet/Kconfig create mode 100644 src/net/scripts/kconfig/tests/no_write_if_dep_unmet/__init__.py create mode 100644 src/net/scripts/kconfig/tests/no_write_if_dep_unmet/config create mode 100644 src/net/scripts/kconfig/tests/no_write_if_dep_unmet/expected_config create mode 100644 src/net/scripts/kconfig/tests/preprocess/builtin_func/Kconfig create mode 100644 src/net/scripts/kconfig/tests/preprocess/builtin_func/__init__.py create mode 100644 src/net/scripts/kconfig/tests/preprocess/builtin_func/expected_stderr create mode 100644 src/net/scripts/kconfig/tests/preprocess/builtin_func/expected_stdout create mode 100644 src/net/scripts/kconfig/tests/preprocess/circular_expansion/Kconfig create mode 100644 src/net/scripts/kconfig/tests/preprocess/circular_expansion/__init__.py create mode 100644 src/net/scripts/kconfig/tests/preprocess/circular_expansion/expected_stderr create mode 100644 src/net/scripts/kconfig/tests/preprocess/escape/Kconfig create mode 100644 src/net/scripts/kconfig/tests/preprocess/escape/__init__.py create mode 100644 src/net/scripts/kconfig/tests/preprocess/escape/expected_stderr create mode 100644 src/net/scripts/kconfig/tests/preprocess/variable/Kconfig create mode 100644 src/net/scripts/kconfig/tests/preprocess/variable/__init__.py create mode 100644 src/net/scripts/kconfig/tests/preprocess/variable/expected_stderr create mode 100644 src/net/scripts/kconfig/tests/pytest.ini create mode 100644 src/net/scripts/kconfig/util.c create mode 100755 src/net/scripts/kernel-doc create mode 100644 src/net/scripts/ksymoops/README create mode 100755 src/net/scripts/ld-version.sh create mode 100755 src/net/scripts/leaking_addresses.pl create mode 100755 src/net/scripts/link-vmlinux.sh create mode 100755 src/net/scripts/lld-version.sh create mode 100755 src/net/scripts/makelst create mode 100755 src/net/scripts/markup_oops.pl create mode 100755 src/net/scripts/mkcompile_h create mode 100755 src/net/scripts/mkmakefile create mode 100755 src/net/scripts/mksysmap create mode 100755 src/net/scripts/mkuboot.sh create mode 100644 src/net/scripts/mod/.gitignore create mode 100644 src/net/scripts/mod/Makefile create mode 100644 src/net/scripts/mod/devicetable-offsets.c create mode 100644 src/net/scripts/mod/empty.c create mode 100644 src/net/scripts/mod/file2alias.c create mode 100644 src/net/scripts/mod/mk_elfconfig.c create mode 100644 src/net/scripts/mod/modpost.c create mode 100644 src/net/scripts/mod/modpost.h create mode 100644 src/net/scripts/mod/sumversion.c create mode 100644 src/net/scripts/module.lds.S create mode 100755 src/net/scripts/modules-check.sh create mode 100644 src/net/scripts/nsdeps create mode 100755 src/net/scripts/objdiff create mode 100755 src/net/scripts/package/builddeb create mode 100755 src/net/scripts/package/buildtar create mode 100755 src/net/scripts/package/mkdebian create mode 100755 src/net/scripts/package/mkspec create mode 100644 src/net/scripts/package/snapcraft.template create mode 100755 src/net/scripts/pahole-flags.sh create mode 100755 src/net/scripts/parse-maintainers.pl create mode 100755 src/net/scripts/patch-kernel create mode 100755 src/net/scripts/profile2linkerlist.pl create mode 100755 src/net/scripts/prune-kernel create mode 100644 src/net/scripts/recordmcount.c create mode 100644 src/net/scripts/recordmcount.h create mode 100755 src/net/scripts/recordmcount.pl create mode 100644 src/net/scripts/selinux/Makefile create mode 100644 src/net/scripts/selinux/README create mode 100644 src/net/scripts/selinux/genheaders/.gitignore create mode 100644 src/net/scripts/selinux/genheaders/Makefile create mode 100644 src/net/scripts/selinux/genheaders/genheaders.c create mode 100755 src/net/scripts/selinux/install_policy.sh create mode 100644 src/net/scripts/selinux/mdp/.gitignore create mode 100644 src/net/scripts/selinux/mdp/Makefile create mode 100644 src/net/scripts/selinux/mdp/dbus_contexts create mode 100644 src/net/scripts/selinux/mdp/mdp.c create mode 100755 src/net/scripts/setlocalversion create mode 100755 src/net/scripts/show_delta create mode 100644 src/net/scripts/sign-file.c create mode 100644 src/net/scripts/sorttable.c create mode 100644 src/net/scripts/sorttable.h create mode 100644 src/net/scripts/spdxcheck-test.sh create mode 100755 src/net/scripts/spdxcheck.py create mode 100644 src/net/scripts/spelling.txt create mode 100755 src/net/scripts/sphinx-pre-install create mode 100755 src/net/scripts/split-man.pl create mode 100755 src/net/scripts/stackdelta create mode 100755 src/net/scripts/stackusage create mode 100644 src/net/scripts/subarch.include create mode 100755 src/net/scripts/tags.sh create mode 100755 src/net/scripts/tools-support-relr.sh create mode 100755 src/net/scripts/tracing/draw_functrace.py create mode 100755 src/net/scripts/tracing/ftrace-bisect.sh create mode 100644 src/net/scripts/unifdef.c create mode 100755 src/net/scripts/ver_linux create mode 100644 src/net/scripts/xen-hypercalls.sh create mode 100755 src/net/scripts/xz_wrap.sh create mode 100755 src/net/smoke.sh create mode 100755 src/net/test create mode 100644 src/net/test_tools/Makefile create mode 100644 src/net/test_tools/pkt_dtp_nopi_parse.txt create mode 100644 src/net/test_tools/pkt_dtp_pi_parse.txt create mode 100644 src/net/test_tools/pkt_dtp_pi_parse_lookside.txt create mode 100644 src/net/test_tools/pkt_np_128.txt create mode 100644 src/net/test_tools/zxdh_net_test.c create mode 100644 src/net/test_tools/zxdh_net_test.h create mode 100755 src/net/upload.sh create mode 100755 src/net/ut.sh create mode 100755 src/net/zxdh_eth_rpm_build.sh create mode 100755 src/net/zxdh_hpf_rpm_build.sh create mode 100755 src/net/zxdh_kernel.sh create mode 100755 src/net/zxdh_zf_mpf_rpm_build.sh diff --git a/kmod-zxdh.spec b/kmod-zxdh.spec new file mode 100644 index 0000000..4db6f9f --- /dev/null +++ b/kmod-zxdh.spec @@ -0,0 +1,123 @@ +%global pkg zxdh +%global kernel 5.10.134-16.2.an8 +%define pkg_version 1.13.1 +%define anolis_release 1 + +%global debug_package %{nil} + +Name: kmod-%{pkg}-%(echo %{kernel} | sed -E 's/\.(an|al)[0-9]+$//g') +Version: %{pkg_version} +Release: %{anolis_release}%{?dist} +Summary: ASPEED Graphics DRM Driver +License: LBPLv2+ and MIT +URL: https://www.aspeedtech.com/support_driver/ +Source0: kmod-%{pkg}-%{pkg_version}.tar.gz +Epoch: 1 + +# 安装依赖, 和内核版本对应 +Requires: kernel >= %{kernel} +Requires(posttrans): %{_sbindir}/depmod +Requires(postun): %{_sbindir}/depmod +Requires(posttrans): %{_sbindir}/weak-modules +Requires(postun): %{_sbindir}/weak-modules +Requires(posttrans): %{_bindir}/sort +Requires(postun): %{_bindir}/sort + +# 构建依赖, 和内核版本对应 +BuildRequires: kernel-devel = %{kernel} +BuildRequires: kernel-headers = %{kernel} +BuildRequires: elfutils-libelf-devel +BuildRequires: gcc +BuildRequires: kmod +BuildRequires: make +BuildRequires: system-rpm-config + +Provides: %{name} = %{version}-%{release} +Obsoletes: %{name} < %{version}-%{release} + +%description +RPM Package for ZXDH Driver + +%prep +%setup -q -n kmod-%{pkg}-%{pkg_version} + +%build +pushd src/crypto/zsda +%{__make} -C /usr/src/kernels/%{kernel}.%{_arch} %{?_smp_mflags} M=$PWD modules CONFIG_ACC_ZSDA_COMMON=m CONFIG_ACC_ZSDA_PF=m CONFIG_ACC_ZSDA_VF=m +popd +pushd src/net +./build.sh m +popd + +%install +mkdir -p %{buildroot}/lib/modules/%{kernel}.%{_arch}/extra/drivers/crypto/zsda/ +%{__install} -D -t %{buildroot}/lib/modules/%{kernel}.%{_arch}/extra/drivers/crypto/zsda/ src/crypto/zsda/accdevice/zsda_common/zsda_common.ko +%{__install} -D -t %{buildroot}/lib/modules/%{kernel}.%{_arch}/extra/drivers/crypto/zsda/ src/crypto/zsda/accdevice/zsda_pf/zsda_pf.ko +%{__install} -D -t %{buildroot}/lib/modules/%{kernel}.%{_arch}/extra/drivers/crypto/zsda/ src/crypto/zsda/accdevice/zsda_vf/zsda_vf.ko +%{__install} -D -t %{buildroot}/lib/modules/%{kernel}.%{_arch}/extra/drivers/net/ethernet/dinghai/ src/net/drivers/base/zxdh_auxiliary.ko +%{__install} -D -t %{buildroot}/lib/modules/%{kernel}.%{_arch}/extra/drivers/net/ethernet/dinghai/ src/net/drivers/net/ethernet/dinghai/zxdh_cmd.ko +%{__install} -D -t %{buildroot}/lib/modules/%{kernel}.%{_arch}/extra/drivers/net/ethernet/dinghai/ src/net/drivers/net/ethernet/dinghai/zxdh_np.ko +%{__install} -D -t %{buildroot}/lib/modules/%{kernel}.%{_arch}/extra/drivers/net/ethernet/dinghai/ src/net/drivers/net/ethernet/dinghai/zxdh_ptp.ko +%{__install} -D -t %{buildroot}/lib/modules/%{kernel}.%{_arch}/extra/drivers/net/ethernet/dinghai/ src/net/drivers/net/ethernet/dinghai/zxdh_tsn.ko +%{__install} -D -t %{buildroot}/lib/modules/%{kernel}.%{_arch}/extra/drivers/net/ethernet/dinghai/ src/net/drivers/net/ethernet/dinghai/zxdh_pf.ko +%{__install} -D -t %{buildroot}/lib/modules/%{kernel}.%{_arch}/extra/drivers/net/ethernet/dinghai/ src/net/drivers/net/ethernet/dinghai/zxdh_en_aux.ko + +# Make .ko objects temporarily executable for automatic stripping +find %{buildroot}/lib/modules -type f -name \*.ko -exec chmod u+x \{\} \+ + +# Generate depmod.conf +%{__install} -d %{buildroot}/%{_sysconfdir}/depmod.d/ +for kmod in $(find %{buildroot}/lib/modules/%{kernel}.%{_arch}/extra -type f -name \*.ko -printf "%%P\n" | sort) +do + echo "override $(basename $kmod .ko) * weak-updates/$(dirname $kmod)" >> %{buildroot}/%{_sysconfdir}/depmod.d/%{pkg}.conf + echo "override $(basename $kmod .ko) * extra/$(dirname $kmod)" >> %{buildroot}/%{_sysconfdir}/depmod.d/%{pkg}.conf +done + +%clean +%{__rm} -rf %{buildroot} + +%post +depmod -a > /dev/null 2>&1 + +if [ -x "/usr/sbin/weak-modules" ]; then + printf '%s\n' "/lib/modules/%{kernel}.%{_arch}/extra/drivers/crypto/zsda/zsda_common.ko" | /usr/sbin/weak-modules --no-initramfs --add-modules + printf '%s\n' "/lib/modules/%{kernel}.%{_arch}/extra/drivers/crypto/zsda/zsda_pf.ko" | /usr/sbin/weak-modules --no-initramfs --add-modules + printf '%s\n' "/lib/modules/%{kernel}.%{_arch}/extra/drivers/crypto/zsda/zsda_vf.ko" | /usr/sbin/weak-modules --no-initramfs --add-modules + printf '%s\n' "/lib/modules/%{kernel}.%{_arch}/extra/drivers/net/ethernet/dinghai/zxdh_auxiliary.ko" | /usr/sbin/weak-modules --no-initramfs --add-modules + printf '%s\n' "/lib/modules/%{kernel}.%{_arch}/extra/drivers/net/ethernet/dinghai/zxdh_cmd.ko" | /usr/sbin/weak-modules --no-initramfs --add-modules + printf '%s\n' "/lib/modules/%{kernel}.%{_arch}/extra/drivers/net/ethernet/dinghai/zxdh_np.ko" | /usr/sbin/weak-modules --no-initramfs --add-modules + printf '%s\n' "/lib/modules/%{kernel}.%{_arch}/extra/drivers/net/ethernet/dinghai/zxdh_ptp.ko" | /usr/sbin/weak-modules --no-initramfs --add-modules + printf '%s\n' "/lib/modules/%{kernel}.%{_arch}/extra/drivers/net/ethernet/dinghai/zxdh_tsn.ko" | /usr/sbin/weak-modules --no-initramfs --add-modules + printf '%s\n' "/lib/modules/%{kernel}.%{_arch}/extra/drivers/net/ethernet/dinghai/zxdh_pf.ko" | /usr/sbin/weak-modules --no-initramfs --add-modules + printf '%s\n' "/lib/modules/%{kernel}.%{_arch}/extra/drivers/net/ethernet/dinghai/zxdh_en_aux.ko" | /usr/sbin/weak-modules --no-initramfs --add-modules +fi + +%preun +echo "/lib/modules/%{kernel}.%{_arch}/extra/drivers/crypto/zsda/zsda_common.ko" >> /var/run/rpm-%{pkg}-modules.list +echo "/lib/modules/%{kernel}.%{_arch}/extra/drivers/crypto/zsda/zsda_pf.ko" >> /var/run/rpm-%{pkg}-modules.list +echo "/lib/modules/%{kernel}.%{_arch}/extra/drivers/crypto/zsda/zsda_vf.ko" >> /var/run/rpm-%{pkg}-modules.list +echo "/lib/modules/%{kernel}.%{_arch}/extra/drivers/net/ethernet/dinghai/zxdh_auxiliary.ko" >> /var/run/rpm-%{pkg}-modules.list +echo "/lib/modules/%{kernel}.%{_arch}/extra/drivers/net/ethernet/dinghai/zxdh_cmd.ko" >> /var/run/rpm-%{pkg}-modules.list +echo "/lib/modules/%{kernel}.%{_arch}/extra/drivers/net/ethernet/dinghai/zxdh_np.ko" >> /var/run/rpm-%{pkg}-modules.list +echo "/lib/modules/%{kernel}.%{_arch}/extra/drivers/net/ethernet/dinghai/zxdh_ptp.ko" >> /var/run/rpm-%{pkg}-modules.list +echo "/lib/modules/%{kernel}.%{_arch}/extra/drivers/net/ethernet/dinghai/zxdh_tsn.ko" >> /var/run/rpm-%{pkg}-modules.list +echo "/lib/modules/%{kernel}.%{_arch}/extra/drivers/net/ethernet/dinghai/zxdh_pf.ko" >> /var/run/rpm-%{pkg}-modules.list +echo "/lib/modules/%{kernel}.%{_arch}/extra/drivers/net/ethernet/dinghai/zxdh_en_aux.ko" >> /var/run/rpm-%{pkg}-modules.list + +%postun +depmod -a > /dev/null 2>&1 + +if [ -x "/usr/sbin/weak-modules" ]; then + modules=( $(cat /var/run/rpm-%{pkg}-modules.list) ) + printf '%s\n' "${modules[@]}" | /usr/sbin/weak-modules --no-initramfs --remove-modules +fi +rm /var/run/rpm-%{pkg}-modules.list + +%files +%defattr(644,root,root,755) +%license licenses +/lib/modules/%{kernel}.%{_arch} +%config(noreplace) %{_sysconfdir}/depmod.d/%{pkg}.conf + +%changelog + diff --git a/src/crypto/zsda/Makefile b/src/crypto/zsda/Makefile new file mode 100644 index 0000000..51211ce --- /dev/null +++ b/src/crypto/zsda/Makefile @@ -0,0 +1,32 @@ + +#obj-m += accdevice/ + +ifeq ($(KERNELRELEASE),) + + # Assume the source tree is where the running kernel was built + # You should set KERNELDIR in the environment if it's elsewhere + ifndef KERNELDIR + KERNELDIR ?= /lib/modules/$(shell uname -r)/build + endif + # The current directory is passed to sub-makes as argument + PWD := $(shell pwd) + +modules: + $(MAKE) -C $(KERNELDIR) M=$(PWD) modules \ + CONFIG_ACC_ZSDA_COMMON=m \ + CONFIG_ACC_ZSDA_PF=m \ + CONFIG_ACC_ZSDA_VF=m + +modules_install: + $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install + +clean: + $(MAKE) -C $(KERNELDIR) M=$(PWD) clean + +.PHONY: modules modules_install clean + +else + # called from kernel build system: just declare what our modules are + obj-m += accdevice/ +# ast-objs := ast_cursor.o ast_drv.o ast_main.o ast_mm.o ast_mode.o ast_post.o ast_dp501.o +endif diff --git a/src/crypto/zsda/accdevice/Makefile b/src/crypto/zsda/accdevice/Makefile new file mode 100644 index 0000000..a7aa7ef --- /dev/null +++ b/src/crypto/zsda/accdevice/Makefile @@ -0,0 +1,3 @@ +obj-$(CONFIG_ACC_ZSDA_COMMON) += zsda_common/ +obj-$(CONFIG_ACC_ZSDA_PF) += zsda_pf/ +obj-$(CONFIG_ACC_ZSDA_VF) += zsda_vf/ diff --git a/src/crypto/zsda/accdevice/zsda_common/Makefile b/src/crypto/zsda/accdevice/zsda_common/Makefile new file mode 100644 index 0000000..93c8e7e --- /dev/null +++ b/src/crypto/zsda/accdevice/zsda_common/Makefile @@ -0,0 +1,6 @@ +ccflags-y := -I$(src)/../../include +ccflags-y += -I$(src)/../crypto/ +ccflags-y += -I/usr/include +obj-$(CONFIG_ACC_ZSDA_COMMON) += zsda_common.o +zsda_common-objs = zsda_manage.o zsda_alg.o zsda_qp.o zsda_common_drv.o zsda_isr.o zsda_pci.o + diff --git a/src/crypto/zsda/accdevice/zsda_common/zsda_alg.c b/src/crypto/zsda/accdevice/zsda_common/zsda_alg.c new file mode 100644 index 0000000..1fb2263 --- /dev/null +++ b/src/crypto/zsda/accdevice/zsda_common/zsda_alg.c @@ -0,0 +1,560 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright(c) 2024 ZTE Corporation */ + +#include +#include +#include "zsda_common_drv.h" +#include "zsda_alg.h" +#include "zsda_manage.h" +#include "acc_dev.h" + +static DEFINE_MUTEX(lkcf_lock); +static unsigned int acc_devs; + +static void zsda_ablkcipher_callback(struct zsda_cqe *resp, + struct zsda_crypto_request *req) +{ + int res = 0; + struct skcipher_request *sreq = req->skcipher_req; + + if (cqe_err1(resp->err1)) + res = -EINVAL; + + sreq->base.complete(&sreq->base, res); +} + +static int zsda_ablkcipher_init(struct crypto_skcipher *tfm) +{ + int reqsize; + + reqsize = sizeof(struct zsda_crypto_request) + + sizeof(struct skcipher_request); + crypto_skcipher_set_reqsize(tfm, reqsize); + + return 0; +} + +static void zsda_ablkcipher_exit(struct crypto_skcipher *tfm) +{ + struct zsda_crypto_ctx *ctx = crypto_skcipher_ctx(tfm); + struct accel_dev *inst = ctx->acc_dev; + struct device *dev; + + if (!inst) + return; + + dev = &GET_DEV(inst); + + zsda_put_instance(inst); +} + +static const unsigned char aes_sbox[256] = { + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, + 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, + 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, + 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, + 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, + 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, + 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, + 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, + 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, + 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, + 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, + 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, + 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, + 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, + 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, + 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, + 0xb0, 0x54, 0xbb, 0x16 +}; + +static const unsigned char Rcon[11] = { 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, + 0x20, 0x40, 0x80, 0x1b, 0x36 }; + +#define GET_AES_SBOX_VAL(num) (aes_sbox[(num)]) + +static void zsda_aes_key_expansion(uint8_t *round_key, uint32_t round_num, + const uint8_t *key, uint32_t key_len) +{ + uint32_t i, j, k, nk, nr; + uint8_t tempa[4], temp; // Used for the column/row operations + + nk = key_len >> 2; // The number of 32 bit words in a key. + nr = round_num; + + // The first round key is the key itself. + for (i = 0; i < nk; ++i) { + round_key[(i * 4) + 0] = key[(i * 4) + 0]; + round_key[(i * 4) + 1] = key[(i * 4) + 1]; + round_key[(i * 4) + 2] = key[(i * 4) + 2]; + round_key[(i * 4) + 3] = key[(i * 4) + 3]; + } + + // All other round keys are found from the previous round keys. + for (i = nk; i < 4 * (nr + 1); ++i) { + k = (i - 1) * 4; + tempa[0] = round_key[k + 0]; + tempa[1] = round_key[k + 1]; + tempa[2] = round_key[k + 2]; + tempa[3] = round_key[k + 3]; + + if (i % nk == 0) { + { + const u_int8_t u8tmp = tempa[0]; + + tempa[0] = tempa[1]; + tempa[1] = tempa[2]; + tempa[2] = tempa[3]; + tempa[3] = u8tmp; + } + for (j = 0; j < 4; j++) { + temp = GET_AES_SBOX_VAL(tempa[j]); + tempa[j] = temp; + } + + tempa[0] = tempa[0] ^ Rcon[i / nk]; + } + + if (nk == 8) { + if (i % nk == 4) { + for (j = 0; j < 4; j++) { + temp = GET_AES_SBOX_VAL(tempa[j]); + tempa[j] = temp; + } + } + } + + j = i * 4; + k = (i - nk) * 4; + round_key[j + 0] = round_key[k + 0] ^ tempa[0]; + round_key[j + 1] = round_key[k + 1] ^ tempa[1]; + round_key[j + 2] = round_key[k + 2] ^ tempa[2]; + round_key[j + 3] = round_key[k + 3] ^ tempa[3]; + } +} + +void reverse_memcpy(uint8_t *dst, const uint8_t *src, size_t n) +{ + size_t i; + + for (i = 0; i < n; ++i) + dst[n - 1 - i] = src[i]; +} + +static void build_encry_key(const uint8_t *key, uint8_t *encry_key, + unsigned int keylen) +{ + unsigned int skey_len; + + skey_len = keylen / 2; + // 适配硬件所需的密钥格式 + if (skey_len == ZSDA_XTS_256_SKEY_LEN) { + reverse_memcpy(encry_key + ZSDA_XTS_256_KEY2_OFF, key + skey_len, + skey_len); + reverse_memcpy(encry_key + ZSDA_XTS_256_KEY1_OFF, key, skey_len); + } else { + reverse_memcpy(encry_key, key, keylen); + } +} + +static void build_decry_key(const uint8_t *key, uint8_t *decry_key, + unsigned int keylen) +{ + unsigned int skey_len; + uint8_t round_num; + uint8_t dec_key1[ZSDA_AES_MAX_KEY_BYTE_LEN] = { 0 }; + uint8_t aes_round_key[ZSDA_AES_MAX_EXP_BYTE_SIZE] = { 0 }; + + skey_len = keylen / 2; + + if (skey_len != ZSDA_XTS_512_KEY1_OFF && + skey_len != ZSDA_XTS_256_SKEY_LEN) + return; + + round_num = + (skey_len == 16) ? ZSDA_AES256_ROUND_NUM : ZSDA_AES512_ROUND_NUM; + + zsda_aes_key_expansion(aes_round_key, round_num, key, skey_len); + memcpy(dec_key1, aes_round_key + 16 * round_num, 16); + if (skey_len > ZSDA_XTS_256_SKEY_LEN) + memcpy(dec_key1 + 16, + aes_round_key + 16 * round_num - (skey_len - 16), + skey_len - 16); + + if (skey_len == ZSDA_XTS_256_SKEY_LEN) { + reverse_memcpy(decry_key + ZSDA_XTS_256_KEY2_OFF, key + skey_len, + skey_len); + reverse_memcpy(decry_key + ZSDA_XTS_256_KEY1_OFF, dec_key1, + skey_len); + } else { + reverse_memcpy(decry_key, key + skey_len, skey_len); + reverse_memcpy(decry_key + ZSDA_XTS_512_KEY1_OFF, dec_key1, + skey_len); + } +} + +static void zsda_init_ctx(struct zsda_crypto_ctx *ctx, const uint8_t *key, + unsigned int keylen, int mode) +{ + build_encry_key(key, ctx->encry_key, keylen); + build_decry_key(key, ctx->decry_key, keylen); + memcpy(ctx->key, key, keylen); + ctx->keylen = keylen; + ctx->mode = mode; +} + +static int zsda_alg_validate_key(unsigned int key_len, int mode) +{ + if (mode != HW_CIPHER_XTS_MODE) + return -EINVAL; + + switch (key_len) { + case AES_KEYSIZE_128 << 1: + break; + case AES_KEYSIZE_256 << 1: + break; + default: + return -EINVAL; + } + + return 0; +} + +static int zsda_init_sessions(struct zsda_crypto_ctx *ctx, const uint8_t *key, + unsigned int keylen, int mode) +{ + if (zsda_alg_validate_key(keylen, mode)) + goto bad_key; + + zsda_init_ctx(ctx, key, keylen, mode); + + return 0; +bad_key: + return -EINVAL; +} + +static int zsda_crypto_newkey(struct zsda_crypto_ctx *ctx, const u8 *key, + unsigned int keylen, int mode) +{ + struct accel_dev *inst = NULL; + struct device *dev; + int ret; + + inst = zsda_get_instance(); + if (!inst) + return -EINVAL; + dev = &GET_DEV(inst); + ctx->acc_dev = inst; + + ret = zsda_init_sessions(ctx, key, keylen, mode); + if (ret) + goto fail; + + return 0; + +fail: + ctx->acc_dev = NULL; + zsda_put_instance(inst); + return ret; +} + +static int zsda_crypto_rekey(struct zsda_crypto_ctx *ctx, const u8 *key, + unsigned int keylen, int mode) +{ + return zsda_init_sessions(ctx, key, keylen, mode); +} + +static int zsda_alg_ablkcipher_setkey(struct crypto_skcipher *tfm, const u8 *key, + unsigned int keylen, int mode) +{ + struct zsda_crypto_ctx *ctx = crypto_skcipher_ctx(tfm); + + if (ctx->acc_dev) + return zsda_crypto_rekey(ctx, key, keylen, mode); + else + return zsda_crypto_newkey(ctx, key, keylen, mode); +} + +static int zsda_ablkcipher_xts_setkey(struct crypto_skcipher *tfm, const u8 *key, + unsigned int keylen) +{ + return zsda_alg_ablkcipher_setkey(tfm, key, keylen, HW_CIPHER_XTS_MODE); +} + +#define SGL_LINK_MODULE 32 +static int zsda_fill_sgl(struct accel_dev *acc_dev, struct scatterlist *buff, + struct zsda_buf *sgl_in, phys_addr_t sgl_phy_addr) +{ + int i = 0, y = 0; + int n = sg_nents(buff); + struct scatterlist *sg; + struct device *dev = &GET_DEV(acc_dev); + + if (unlikely(!n)) + return -EINVAL; + + for_each_sg(buff, sg, n, i) { + if (y >= n) + break; + if (!sg->length) + continue; + memset(&(sgl_in[y]), 0, sizeof(struct zsda_buf)); + if (y > 0 && ((y + 1) % SGL_LINK_MODULE) == 0) { + sgl_in[y].len = 0; + sgl_in[y].addr = + sgl_phy_addr + (y + 1) * sizeof(struct zsda_buf); + sgl_in[y].type = 2; // link elment + y++; + continue; + } + + sgl_in[y].addr = dma_map_single( + dev, sg_virt(sg), sg->length, DMA_BIDIRECTIONAL); + sgl_in[y].len = sg->length; + sgl_in[y].type = 0; + // printk("sgl_addr[%d] 0x%llx\n", y, sgl_in[y].addr); + if (unlikely(dma_mapping_error(dev, sgl_in[y].addr))) { + dev_err(dev, "sgl error dma_map\n"); + return -ENOMEM; + } + y++; + } + sgl_in[y - 1].type = 1; + return 0; +} + +static int zsda_alg_sgl_to_bufl(struct accel_dev *acc_dev, + struct zsda_crypto_request *zsda_req, + struct scatterlist *sgl, + struct scatterlist *sglout) +{ + struct device *dev = &GET_DEV(acc_dev); + int i = 0, n = sg_nents(sgl), n_out = sg_nents(sglout); + struct zsda_buf *bufl = NULL, *buflout = NULL; + phys_addr_t blp = 0, bloutp = 0; + size_t sz_out, sz; + struct cookie *cookie = zsda_req->cookie; + + if (unlikely(!n) || unlikely(!n_out)) + return -EBADMSG; + + sz = PAGE_ALIGN(n * sizeof(struct zsda_buf)); + bufl = kzalloc_node(sz, GFP_KERNEL, dev_to_node(dev)); + if (!bufl) + return -ENOMEM; + blp = dma_map_single(dev, bufl, sz, DMA_TO_DEVICE); + if (unlikely(dma_mapping_error(dev, blp))) + goto err_src; + if (zsda_fill_sgl(acc_dev, sgl, bufl, blp)) + goto err_src; + cookie->src_n = n; + cookie->src_buf = bufl; + cookie->src_addr = blp; + // printk("sz=0x%x map src_addr=0x%llx\n", sz, cookie->src_addr); + sz_out = PAGE_ALIGN(n_out * sizeof(struct zsda_buf)); + buflout = kzalloc_node(sz_out, GFP_KERNEL, dev_to_node(dev)); + if (unlikely(!buflout)) + goto err_src; + bloutp = dma_map_single(dev, buflout, sz_out, DMA_TO_DEVICE); + if (unlikely(dma_mapping_error(dev, bloutp))) + goto err_dst; + if (zsda_fill_sgl(acc_dev, sglout, buflout, bloutp)) + goto err_dst; + cookie->dst_n = n_out; + cookie->dst_buf = buflout; + cookie->dst_addr = bloutp; + // printk("sz_out=0x%x map dst_addr=0x%llx\n", cookie->dst_addr, cookie->dst_addr); + cookie->zsda_req = zsda_req; + cookie->used = true; + return 0; + +err_dst: + n = sg_nents(sglout); + for (i = 0; i < n; i++) { + if (!dma_mapping_error(dev, buflout[i].addr)) + dma_unmap_single(dev, buflout[i].addr, + buflout[i].len, + DMA_BIDIRECTIONAL); + } + if (!dma_mapping_error(dev, bloutp)) + dma_unmap_single(dev, bloutp, sz_out, DMA_TO_DEVICE); + kfree(buflout); +err_src: + n = sg_nents(sgl); + for (i = 0; i < n; i++) { + if (!dma_mapping_error(dev, bufl[i].addr)) + dma_unmap_single(dev, bufl[i].addr, + bufl[i].len, + DMA_BIDIRECTIONAL); + } + if (!dma_mapping_error(dev, blp)) + dma_unmap_single(dev, blp, sz, DMA_TO_DEVICE); + kfree(bufl); + dev_err(dev, "Map err buf for dma\n"); + return -EBADMSG; +} + +static void zsda_alg_backlog_req(struct zsda_alg_req *alg_req, + struct zsda_backlog *backlog) +{ + INIT_LIST_HEAD(&alg_req->list); + + spin_lock_bh(&backlog->lock); + list_add_tail(&alg_req->list, &backlog->list); + spin_unlock_bh(&backlog->lock); + + atomic_inc(&backlog->inflights); +} + +static int zsda_ablkcipher_blk_encrypt(struct skcipher_request *req) +{ + int ret; + struct crypto_skcipher *stfm = crypto_skcipher_reqtfm(req); + struct zsda_crypto_ctx *ctx = crypto_skcipher_ctx(stfm); + struct zsda_crypto_request *zsda_req = skcipher_request_ctx(req); + struct accel_dev *acc_dev = ctx->acc_dev; + struct device *dev = &GET_DEV(acc_dev); + struct zsda_alg_req *alg_req; + struct zsda_backlog *backlog; + struct cookie *cookie; + + if (unlikely(req->cryptlen < 16)) + return -EINVAL; + cookie = kzalloc_node(sizeof(struct cookie), GFP_KERNEL, + dev_to_node(dev)); + if (unlikely(!cookie)) { + dev_err(dev, "Failed Kzalloc cookie buf\n"); + return -ENOMEM; + } + zsda_req->cookie = cookie; + zsda_req->skcipher_req = req; + zsda_req->ablkcipher_ctx = ctx; + zsda_req->cb = zsda_ablkcipher_callback; + ret = zsda_alg_sgl_to_bufl(acc_dev, zsda_req, req->src, req->dst); + if (unlikely(ret)) + return ret; + + zsda_build_req(zsda_req, ctx, ZSDA_SERVICE_ENCRYPT); + + ret = enqueue(zsda_req, ZSDA_SERVICE_ENCRYPT, false); + if (unlikely(ret)) + goto softqueue; + + return -EINPROGRESS; + +softqueue: + alg_req = &zsda_req->alg_req; + alg_req->zsda_req = zsda_req; + alg_req->base = &req->base; + backlog = &acc_dev->cfg->backlog[ZSDA_SERVICE_ENCRYPT]; + zsda_alg_backlog_req(alg_req, backlog); + return -EBUSY; +} + +static int zsda_ablkcipher_blk_decrypt(struct skcipher_request *req) +{ + int ret; + struct crypto_skcipher *stfm = crypto_skcipher_reqtfm(req); + struct zsda_crypto_ctx *ctx = crypto_skcipher_ctx(stfm); + struct zsda_crypto_request *zsda_req = skcipher_request_ctx(req); + struct accel_dev *acc_dev = ctx->acc_dev; + struct zsda_alg_req *alg_req; + struct zsda_backlog *backlog; + struct device *dev = &GET_DEV(acc_dev); + struct cookie *cookie; + + if (unlikely(req->cryptlen < 16)) + return -EINVAL; + + cookie = kzalloc_node(sizeof(struct cookie), GFP_KERNEL, + dev_to_node(dev)); + if (unlikely(!cookie)) { + dev_err(dev, "Failed Kzalloc cookie buf\n"); + return -ENOMEM; + } + zsda_req->cookie = cookie; + zsda_req->skcipher_req = req; + zsda_req->ablkcipher_ctx = ctx; + zsda_req->cb = zsda_ablkcipher_callback; + ret = zsda_alg_sgl_to_bufl(acc_dev, zsda_req, req->src, req->dst); + if (unlikely(ret)) + return ret; + + zsda_build_req(zsda_req, ctx, ZSDA_SERVICE_DECRYPT); + + ret = enqueue(zsda_req, ZSDA_SERVICE_DECRYPT, false); + if (unlikely(ret)) + goto softqueue; + + return -EINPROGRESS; + +softqueue: + alg_req = &zsda_req->alg_req; + alg_req->zsda_req = zsda_req; + alg_req->base = &req->base; + backlog = &acc_dev->cfg->backlog[ZSDA_SERVICE_DECRYPT]; + zsda_alg_backlog_req(alg_req, backlog); + return -EBUSY; +} + +static struct skcipher_alg zsda_algs[] = { { + //todo priority和name + .base = { + .cra_name = "xts(zsda_aes)", + .cra_driver_name = "zsda_aes_xts", + .cra_priority = 4001, + .cra_flags = CRYPTO_ALG_ASYNC, + //.cra_flags = CRYPTO_ALG_ASYNC | + // CRYPTO_ALG_ALLOCATES_MEMORY, + .cra_blocksize = AES_BLOCK_SIZE, + .cra_ctxsize = sizeof(struct zsda_crypto_ctx), + .cra_alignmask = 0, + .cra_module = THIS_MODULE, + }, + + .init = zsda_ablkcipher_init, + .exit = zsda_ablkcipher_exit, + .setkey = zsda_ablkcipher_xts_setkey, + .decrypt = zsda_ablkcipher_blk_decrypt, + .encrypt = zsda_ablkcipher_blk_encrypt, + .min_keysize = 2 * AES_MIN_KEY_SIZE, + .max_keysize = 2 * AES_MAX_KEY_SIZE, + .ivsize = AES_BLOCK_SIZE, +}, +}; + +int zsda_lkcf_register(void) +{ + int ret = 0; + + mutex_lock(&lkcf_lock); + + if (++acc_devs != 1) + goto unlock; + ret = crypto_register_skciphers(zsda_algs, ARRAY_SIZE(zsda_algs)); + if (ret) { + pr_err("ZSDA:Failed register skciphers %d\n", ret); + goto unlock; + } + +unlock: + mutex_unlock(&lkcf_lock); + return ret; +} +EXPORT_SYMBOL_GPL(zsda_lkcf_register); + +void zsda_lkcf_unregister(void) +{ + mutex_lock(&lkcf_lock); + + if (--acc_devs == 0) + crypto_unregister_skciphers(zsda_algs, ARRAY_SIZE(zsda_algs)); + + mutex_unlock(&lkcf_lock); +} +EXPORT_SYMBOL_GPL(zsda_lkcf_unregister); diff --git a/src/crypto/zsda/accdevice/zsda_common/zsda_alg.h b/src/crypto/zsda/accdevice/zsda_common/zsda_alg.h new file mode 100644 index 0000000..ce12682 --- /dev/null +++ b/src/crypto/zsda/accdevice/zsda_common/zsda_alg.h @@ -0,0 +1,119 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright(c) 2024 ZTE Corporation */ +#ifndef ZSDA_ALG_H +#define ZSDA_ALG_H + +enum hw_cipher_mode_t { + HW_CIPHER_ECB_MODE = 0, /*!< ECB mode */ + HW_CIPHER_CBC_MODE = 1, /*!< CBC more */ + HW_CIPHER_CTR_MODE = 2, /*!< CTR mode */ + HW_CIPHER_XTS_MODE = 6, /*!< XTS mode */ + HW_CIPHER_MODE_DELIMITER = 7 /**< Delimiter type */ +}; + +/**************** AES KEY EXPANSION ****************/ +#define ZSDA_XTS_256_SKEY_LEN (16) +#define ZSDA_XTS_256_KEY2_OFF (16) +#define ZSDA_XTS_256_KEY1_OFF (48) +#define ZSDA_XTS_512_KEY1_OFF (32) + +#define ZSDA_AES256_ROUND_NUM (10) +#define ZSDA_AES512_ROUND_NUM (14) +#define ZSDA_AES_MAX_EXP_BYTE_SIZE (240) +#define ZSDA_AES_MAX_KEY_BYTE_LEN (32) + +struct crypto_cfg { + uint8_t slba_l[8]; + uint8_t key[64]; + uint8_t lbads : 4; + uint8_t resv1 : 4; + uint8_t resv2[7]; + uint8_t slba_h[8]; + uint8_t resv3[8]; +} __attribute__((__packed__)); + +union zsda_wqe_cfg { + struct crypto_cfg crypto; +} __attribute__((__packed__)); + +struct zsda_wqe { + uint8_t valid; + uint8_t op_code; + uint16_t sid; + uint8_t resv[3]; + uint8_t rx_sgl_type : 4; + uint8_t tx_sgl_type : 4; + uint64_t rx_addr; + uint32_t rx_length; + uint64_t tx_addr; + uint32_t tx_length; + union zsda_wqe_cfg cfg; +} __attribute__((__packed__)); + +struct zsda_cqe { + uint8_t valid; + uint8_t op_code; + uint16_t sid; + uint8_t state; + uint8_t result; + uint16_t zsda_wq_id; + uint32_t tx_real_length; + uint16_t err0; + uint16_t err1; +} __attribute__((__packed__)); + +struct zsda_crypto_ctx { + uint8_t key[256]; + uint8_t encry_key[256]; + uint8_t decry_key[256]; + uint32_t keylen; + int mode; + struct accel_dev *acc_dev; + struct crypto_skcipher *tfm; +}; + +struct zsda_alg_req { + struct zsda_crypto_request *zsda_req; + struct crypto_async_request *base; + struct list_head list; +}; + +struct zsda_buf { + uint64_t addr; + uint32_t len; + uint8_t resrvd[3]; + uint8_t type; +}; + +struct zsda_sgl { + struct zsda_buf *buffers; +}; + +struct cookie { + uint32_t used; + struct zsda_buf *src_buf; + struct zsda_buf *dst_buf; + phys_addr_t src_addr; + phys_addr_t dst_addr; + size_t src_n; + size_t dst_n; + uint16_t sid; + uint16_t valid; + struct zsda_crypto_request *zsda_req; +}; + +struct zsda_crypto_request { + struct zsda_wqe wqe; + struct cookie *cookie; + struct zsda_crypto_ctx *ablkcipher_ctx; + struct skcipher_request *skcipher_req; + struct zsda_alg_req alg_req; + void (*cb)(struct zsda_cqe *resp, struct zsda_crypto_request *req); + void *iv; + dma_addr_t iv_paddr; +}; + +int zsda_lkcf_register(void); +void zsda_lkcf_unregister(void); +void reverse_memcpy(uint8_t *dst, const uint8_t *src, size_t n); +#endif diff --git a/src/crypto/zsda/accdevice/zsda_common/zsda_common_drv.c b/src/crypto/zsda/accdevice/zsda_common/zsda_common_drv.c new file mode 100644 index 0000000..4d05947 --- /dev/null +++ b/src/crypto/zsda/accdevice/zsda_common/zsda_common_drv.c @@ -0,0 +1,105 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright(c) 2024 ZTE Corporation */ +#include +#include +#include "acc_dev.h" +#include "zsda_common_drv.h" +#include "zsda_manage.h" + +void zsda_unmap_pci_bars(struct accel_dev *accel_dev) +{ + struct accel_pci *accel_pci_dev = &accel_dev->accel_pci_dev; + int i; + + for (i = 0; i < ZSDA_PCI_MAX_BARS; i++) { + struct acc_bar *bar = &accel_pci_dev->pci_bars[i]; + + if (bar->virt_addr) { + pci_iounmap(accel_pci_dev->pci_dev, bar->virt_addr); + bar->virt_addr = NULL; + } + } +} +EXPORT_SYMBOL_GPL(zsda_unmap_pci_bars); + +int zsda_map_pci_bars(struct accel_dev *accel_dev) +{ + struct accel_pci *accel_pci_dev = &accel_dev->accel_pci_dev; + struct pci_dev *pdev = accel_pci_dev->pci_dev; + unsigned long bar_mask = 0; + unsigned int bar_nr = 0; + + bar_mask = pci_select_bars(pdev, IORESOURCE_MEM); + for_each_set_bit(bar_nr, &bar_mask, ZSDA_PCI_MAX_BARS * 2) { + struct acc_bar *bar = &accel_pci_dev->pci_bars[bar_nr / 2]; + + bar->base_addr = pci_resource_start(pdev, bar_nr); + bar->size = pci_resource_len(pdev, bar_nr); + if (!bar->base_addr || !bar->size) + continue; + bar->virt_addr = pci_iomap(pdev, bar_nr, 0); + if (!bar->virt_addr) { + dev_err(&GET_DEV(accel_dev), "Failed to map BAR %d\n", + bar_nr); + zsda_unmap_pci_bars(accel_dev); + return -EFAULT; + } + } + return 0; +} +EXPORT_SYMBOL_GPL(zsda_map_pci_bars); + +static int zsda_show(struct seq_file *m, void *v) +{ + struct accel_dev *accel_dev = m->private; + if(zsda_dev_started(accel_dev)) { + if(test_bit(ZSDA_STATUS_RUNNING, &accel_dev->status)) + seq_printf(m, "%s is in used\n", accel_dev->name); + seq_printf(m, "decrypt :%lld %lld\n", accel_dev->zsda_dbg.decry_enq, + accel_dev->zsda_dbg.decry_deq); + seq_printf(m, "encrypt :%lld %lld\n", accel_dev->zsda_dbg.encry_enq, + accel_dev->zsda_dbg.encry_deq); + } + else + seq_printf(m, "%s is no support LKCF\n", accel_dev->name); + return 0; +} + +int zsda_seq_open(struct inode *inode, struct file *file) +{ + return single_open(file, zsda_show, inode->i_private); +} +EXPORT_SYMBOL_GPL(zsda_seq_open); + +ssize_t zsda_seq_write(struct file *file, const char __user *ubuf, size_t count, loff_t *off) +{ + int ret = 0; + uint32_t val; + struct seq_file *seqf = file->private_data; + struct accel_dev *accel_dev = seqf->private; + char buf[16]; + + if (count > 15) + return -EINVAL; + if (copy_from_user(buf, ubuf, count)) + return -EFAULT; + buf[count] = '\0'; + ret = kstrtou32(buf, 10, &val); + if (unlikely(ret)) + return -EINVAL; + if(!accel_dev->lkcf_en) + return -ENODEV; + + switch (val) { + case 0: + clear_bit(ZSDA_STATUS_STARTED, &accel_dev->status); + break; + case 1: + set_bit(ZSDA_STATUS_STARTED, &accel_dev->status); + break; + default: + return -EINVAL; + } + return count; +} +EXPORT_SYMBOL_GPL(zsda_seq_write); diff --git a/src/crypto/zsda/accdevice/zsda_common/zsda_common_drv.h b/src/crypto/zsda/accdevice/zsda_common/zsda_common_drv.h new file mode 100644 index 0000000..8a25098 --- /dev/null +++ b/src/crypto/zsda/accdevice/zsda_common/zsda_common_drv.h @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright(c) 2024 ZTE Corporation */ +#ifndef ZSDA_COMMON_H +#define ZSDA_COMMON_H + +#include "zsda_qp.h" + +#define ZSDA_STATUS_STARTED 0 +#define ZSDA_STATUS_RUNNING 1 +#define ZSDA_STATUS_IRQ_ALLOCATED 2 + +struct device_cfg_data { + u32 irq_mode; // only 1 irq, or 8 irqs. + struct zsda_qp alg_qps[ZSDA_SERVICE_COUNT]; + struct zsda_backlog backlog[ZSDA_SERVICE_COUNT]; +}; + +struct device_hw_data { + int (*alloc_irq)(struct accel_dev *accel_dev); + void (*free_irq)(struct accel_dev *accel_dev); + void (*reset_device)(struct accel_dev *accel_dev); + void (*pre_reset)(struct accel_dev *accel_dev); + void (*post_reset)(struct accel_dev *accel_dev); + +}; + +int zsda_seq_open(struct inode *inode, struct file *file); +ssize_t zsda_seq_write(struct file *file, const char __user *ubuf, size_t count, loff_t *off); +void zsda_free_irqs(struct accel_dev *accel_dev); +int zsda_request_irqs(struct accel_dev *accel_dev); +void zsda_unmap_pci_bars(struct accel_dev *accel_dev); +int zsda_map_pci_bars(struct accel_dev *accel_dev); +#endif diff --git a/src/crypto/zsda/accdevice/zsda_common/zsda_isr.c b/src/crypto/zsda/accdevice/zsda_common/zsda_isr.c new file mode 100644 index 0000000..6b5457d --- /dev/null +++ b/src/crypto/zsda/accdevice/zsda_common/zsda_isr.c @@ -0,0 +1,140 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright(c) 2024 ZTE Corporation */ +#include +#include +#include +#include "zsda_common_drv.h" +#include "acc_addr.h" +#include "acc_dev.h" + +static void zsda_alg_send_backlog(struct accel_dev *acc_dev, + enum zsda_service_type type) +{ + struct zsda_backlog *backlog; + struct zsda_alg_req *req, *tmp; + + if (!atomic_read(&acc_dev->cfg->backlog[type].inflights)) + return; + backlog = &acc_dev->cfg->backlog[type]; + spin_lock_bh(&backlog->lock); + + list_for_each_entry_safe(req, tmp, &backlog->list, list) { + if (enqueue(req->zsda_req, type, true)) + break; + + atomic_dec(&backlog->inflights); + list_del(&req->list); + req->base->complete(req->base, -EINPROGRESS); + } + spin_unlock_bh(&backlog->lock); +} + +static void encrypt_handler(uintptr_t data) +{ + struct accel_dev *accel_dev = (void *)data; + struct qp_srv *qp; + struct zsda_qp *alg_qp = + &accel_dev->cfg->alg_qps[ZSDA_SERVICE_ENCRYPT]; + + list_for_each_entry(qp, &alg_qp->list, list) { + if (unlikely(!qp->used)) + continue; + dequeue(accel_dev, qp); + } + + zsda_alg_send_backlog(accel_dev, ZSDA_SERVICE_ENCRYPT); +} + +static void decrypt_handler(uintptr_t data) +{ + struct qp_srv *qp; + struct accel_dev *accel_dev = (void *)data; + struct zsda_qp *alg_qp = + &accel_dev->cfg->alg_qps[ZSDA_SERVICE_DECRYPT]; + + list_for_each_entry(qp, &alg_qp->list, list) { + if (unlikely(!qp->used)) + continue; + dequeue(accel_dev, qp); + } + + zsda_alg_send_backlog(accel_dev, ZSDA_SERVICE_DECRYPT); +} + +static irqreturn_t encrypt_intr_handler(int irq, void *data) +{ + struct accel_dev *accel_dev = data; + + tasklet_hi_schedule(&accel_dev->encry_task); + return IRQ_HANDLED; +} + +static irqreturn_t decrypt_intr_handler(int irq, void *data) +{ + struct accel_dev *accel_dev = data; + + tasklet_hi_schedule(&accel_dev->decry_task); + return IRQ_HANDLED; +} + +static void enable_intr(struct accel_dev *accel_dev) +{ + void __iomem *base = accel_dev->accel_pci_dev.pci_bars[ZSDA_BAR0].virt_addr; + + ZSDA_REG_WR(base, ZSDA_IO_QUE_INT_MASK_1, NOMASK); + ZSDA_REG_WR(base, ZSDA_IO_QUE_INT_MASK_2, NOMASK); +} + +int zsda_request_irqs(struct accel_dev *accel_dev) +{ + int ret = 0; + struct pci_dev *pdev = accel_dev->accel_pci_dev.pci_dev; + + tasklet_init(&accel_dev->encry_task, encrypt_handler, + (unsigned long)accel_dev); + tasklet_init(&accel_dev->decry_task, decrypt_handler, + (unsigned long)accel_dev); + ret = pci_alloc_irq_vectors(pdev, 2, 10, PCI_IRQ_MSIX); + if (ret < 0) { + pr_err("ZSDA: alloc irq failed ret %d\n", ret); + ret = -EFAULT; + goto err_alloc; + } + ret = request_irq(pci_irq_vector(pdev, ZSDA_SERVICE_ENCRYPT), encrypt_intr_handler, + IRQF_SHARED, "irq2", (void *)accel_dev); + if (ret < 0) { + pr_err("ZSDA: request irq failed ret %d\n", ret); + ret = -EFAULT; + goto err_req; + } + ret = request_irq(pci_irq_vector(pdev, ZSDA_SERVICE_DECRYPT), decrypt_intr_handler, + IRQF_SHARED, "irq3", (void *)accel_dev); + if (ret < 0) { + pr_err("ZSDA: request irq failed ret %d\n", ret); + ret = -EFAULT; + goto err_req; + } + + set_bit(ZSDA_STATUS_IRQ_ALLOCATED, &accel_dev->status); + enable_intr(accel_dev); + return ret; +err_req: + pci_free_irq_vectors(pdev); +err_alloc: + tasklet_kill(&accel_dev->encry_task); + tasklet_kill(&accel_dev->decry_task); + return ret; +} +EXPORT_SYMBOL_GPL(zsda_request_irqs); + +void zsda_free_irqs(struct accel_dev *accel_dev) +{ + struct pci_dev *pdev = accel_dev->accel_pci_dev.pci_dev; + + free_irq(pci_irq_vector(pdev, ZSDA_SERVICE_ENCRYPT), (void *)accel_dev); + free_irq(pci_irq_vector(pdev, ZSDA_SERVICE_DECRYPT), (void *)accel_dev); + tasklet_kill(&accel_dev->encry_task); + tasklet_kill(&accel_dev->decry_task); + pci_free_irq_vectors(pdev); +} +EXPORT_SYMBOL_GPL(zsda_free_irqs); diff --git a/src/crypto/zsda/accdevice/zsda_common/zsda_manage.c b/src/crypto/zsda/accdevice/zsda_common/zsda_manage.c new file mode 100644 index 0000000..c9b5712 --- /dev/null +++ b/src/crypto/zsda/accdevice/zsda_common/zsda_manage.c @@ -0,0 +1,131 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright(c) 2024 ZTE Corporation */ +#include +#include +#include +#include "zsda_common_drv.h" +#include "zsda_manage.h" +#include "acc_version.h" +#include "acc_dev.h" + +static LIST_HEAD(accel_table); +static DEFINE_MUTEX(table_lock); + +int zsda_dev_started(struct accel_dev *accel_dev) +{ + return test_bit(ZSDA_STATUS_STARTED, &accel_dev->status); +} + +static void sda_dev_pf_put(struct accel_dev *vf_accel_dev) +{ + struct accel_dev *pf_accel_dev = NULL; + struct pci_dev *pf_pci_dev = NULL; + + pf_pci_dev = vf_accel_dev->accel_pci_dev.pci_dev->physfn; + pf_accel_dev = acc_devmgr_pci_to_accel_dev(pf_pci_dev); + if (pf_accel_dev) { + if (atomic_sub_return(1, &pf_accel_dev->lkcf_ref) == 0) + module_put(pf_accel_dev->owner); + } +} + +void zsda_put_instance(struct accel_dev *accel_dev) +{ + if (atomic_sub_return(1, &accel_dev->lkcf_ref) == 0) { + module_put(accel_dev->owner); + if (accel_dev->is_vf) + sda_dev_pf_put(accel_dev); + } + clear_bit(ZSDA_STATUS_RUNNING, &accel_dev->status); +} + +static int zsda_dev_pf_get(struct accel_dev *vf_accel_dev) +{ + int ret = 0; + struct accel_dev *pf_accel_dev = NULL; + struct pci_dev *pf_pci_dev = NULL; + + pf_pci_dev = vf_accel_dev->accel_pci_dev.pci_dev->physfn; + pf_accel_dev = acc_devmgr_pci_to_accel_dev(pf_pci_dev); + if (pf_accel_dev) { + if (atomic_add_return(1, &pf_accel_dev->lkcf_ref) == 1) { + if (!try_module_get(pf_accel_dev->owner)) + ret = -EFAULT; + } + } + return ret; +} + +int zsda_dev_get(struct accel_dev *accel_dev) +{ + if (atomic_add_return(1, &accel_dev->lkcf_ref) == 1) { + if (!try_module_get(accel_dev->owner)) + return -EFAULT; + if (accel_dev->is_vf) + return zsda_dev_pf_get(accel_dev); + } + return 0; +} + +struct accel_dev *zsda_get_instance(void) +{ + struct accel_dev *accel_dev = NULL, *tmp_dev; + + list_for_each_entry(tmp_dev, &accel_table, list) { + if ((!atomic_read(&tmp_dev->lkcf_ref)) && zsda_dev_started(tmp_dev)) { + accel_dev = tmp_dev; + break; + } + } + if (accel_dev){ + if (zsda_dev_get(accel_dev)) { + dev_err(&GET_DEV(accel_dev), "Could not increment dev refctr\n"); + return NULL; + } + set_bit(ZSDA_STATUS_RUNNING, &accel_dev->status); + } + else { + pr_err("ZSDA:Could not find a device\n"); + return NULL; + } + return accel_dev; +} + +void acc_devmgr_add_dev(struct accel_dev *accel_dev) +{ + mutex_lock(&table_lock); + list_add_tail(&accel_dev->list, &accel_table); + mutex_unlock(&table_lock); +} +EXPORT_SYMBOL_GPL(acc_devmgr_add_dev); + +void acc_devmgr_rm_dev(struct accel_dev *accel_dev) +{ + mutex_lock(&table_lock); + list_del(&accel_dev->list); + mutex_unlock(&table_lock); +} +EXPORT_SYMBOL_GPL(acc_devmgr_rm_dev); + +struct accel_dev *acc_devmgr_pci_to_accel_dev(struct pci_dev *pci_dev) +{ + struct list_head *itr; + + mutex_lock(&table_lock); + list_for_each(itr, &accel_table) { + struct accel_dev *ptr = list_entry(itr, struct accel_dev, list); + + if (ptr->accel_pci_dev.pci_dev == pci_dev) { + mutex_unlock(&table_lock); + return ptr; + } + } + mutex_unlock(&table_lock); + return NULL; +} +EXPORT_SYMBOL_GPL(acc_devmgr_pci_to_accel_dev); + +MODULE_AUTHOR("ZTE"); +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_DESCRIPTION("ZTE ACC ZSDA COMMON"); +MODULE_VERSION(ZSDA_DRV_VERSION); diff --git a/src/crypto/zsda/accdevice/zsda_common/zsda_manage.h b/src/crypto/zsda/accdevice/zsda_common/zsda_manage.h new file mode 100644 index 0000000..3541367 --- /dev/null +++ b/src/crypto/zsda/accdevice/zsda_common/zsda_manage.h @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright(c) 2024 ZTE Corporation */ +#ifndef ZSDA_MANAGE_H +#define ZSDA_MANAGE_H +#include + +#define ACC_STATUS_RESTARTING 0 +#define ACC_STATUS_STARTING 1 +#define ACC_STATUS_CONFIGURED 2 +#define ACC_STATUS_STARTED 3 + +int zsda_dev_started(struct accel_dev *accel_dev); +void acc_devmgr_add_dev(struct accel_dev *accel_dev); +void acc_devmgr_rm_dev(struct accel_dev *accel_dev); +struct accel_dev *acc_devmgr_pci_to_accel_dev(struct pci_dev *pci_dev); +struct accel_dev *zsda_get_instance(void); +void zsda_put_instance(struct accel_dev *dev); + +#endif diff --git a/src/crypto/zsda/accdevice/zsda_common/zsda_pci.c b/src/crypto/zsda/accdevice/zsda_common/zsda_pci.c new file mode 100644 index 0000000..6d1a6da --- /dev/null +++ b/src/crypto/zsda/accdevice/zsda_common/zsda_pci.c @@ -0,0 +1,120 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright(c) 2024 ZTE Corporation */ +#include +#include +#include "zsda_pci.h" +#include "zsda_common_drv.h" +#include "zsda_manage.h" +// #include "acc_compat.h" +#include "acc_version.h" +#include "acc_dev.h" + +static int sriov_enable(struct accel_dev *accel_dev, const int numvfs) +{ + if (!iommu_present(&pci_bus_type)) + dev_warn( + &(accel_dev->accel_pci_dev.pci_dev->dev), + "IOMMU should be enabled for SR-IOV to work correctly\n"); + + return pci_enable_sriov(accel_dev->accel_pci_dev.pci_dev, numvfs); +} + +static int sriov_disable(struct accel_dev *accel_dev) +{ + pci_disable_sriov(accel_dev->accel_pci_dev.pci_dev); + return 0; +} + +int zsda_sriov_configure(struct pci_dev *pdev, int numvfs) +{ + struct accel_dev *accel_dev = acc_devmgr_pci_to_accel_dev(pdev); + int totalvfs = pci_sriov_get_totalvfs(pdev); + + if (!accel_dev) { + dev_err(&pdev->dev, "Failed to find accel_dev\n"); + return -EFAULT; + } + + numvfs = (numvfs > totalvfs) ? totalvfs : numvfs; + if (numvfs) + return sriov_enable(accel_dev, numvfs); + else + return sriov_disable(accel_dev); +} +EXPORT_SYMBOL_GPL(zsda_sriov_configure); + +pci_ers_result_t zsda_err_detected(struct pci_dev *pdev, + pci_channel_state_t state) +{ + struct accel_dev *accel_dev = acc_devmgr_pci_to_accel_dev(pdev); + + dev_info(&pdev->dev, "Acceleration driver hardware error detected.\n"); + if (!accel_dev) { + dev_err(&pdev->dev, "Can't find acceleration device\n"); + return PCI_ERS_RESULT_DISCONNECT; + } + if (!accel_dev->is_vf) { + dev_err(&pdev->dev, "accel is pf\n"); + pci_clear_master(pdev); + } + + if (state == pci_channel_io_perm_failure) { + dev_err(&pdev->dev, "Can't recover from device error\n"); + return PCI_ERS_RESULT_DISCONNECT; + } + return PCI_ERS_RESULT_NEED_RESET; +} +EXPORT_SYMBOL_GPL(zsda_err_detected); + +pci_ers_result_t zsda_slot_reset(struct pci_dev *pdev) +{ + struct accel_dev *accel_dev = acc_devmgr_pci_to_accel_dev(pdev); + + if (!accel_dev) { + pr_err("ZSDA: Can't find acceleration device\n"); + return PCI_ERS_RESULT_DISCONNECT; + } + if (accel_dev->is_vf) + return PCI_ERS_RESULT_RECOVERED; + + pci_aer_clear_nonfatal_status(pdev); + sriov_disable(accel_dev); + + return PCI_ERS_RESULT_RECOVERED; +} +EXPORT_SYMBOL_GPL(zsda_slot_reset); + +void zsda_reset_prepare(struct pci_dev *pdev) +{ + struct accel_dev *accel_dev = acc_devmgr_pci_to_accel_dev(pdev); + + if (!accel_dev) { + dev_err(&pdev->dev, " Can't find acceleration device\n"); + return; + } + zsda_release_qps(accel_dev); + zsda_free_irqs(accel_dev); + sriov_disable(accel_dev); +} +EXPORT_SYMBOL_GPL(zsda_reset_prepare); + +void zsda_reset_done(struct pci_dev *pdev) +{ + struct accel_dev *accel_dev = acc_devmgr_pci_to_accel_dev(pdev); + + if (!accel_dev) { + dev_err(&pdev->dev, " Can't find acceleration device\n"); + return; + } + zsda_dev_int(accel_dev); + zsda_request_irqs(accel_dev); + set_bit(ZSDA_STATUS_STARTED, &accel_dev->status); +} +EXPORT_SYMBOL_GPL(zsda_reset_done); + +void zsda_resume(struct pci_dev *pdev) +{ + dev_info(&pdev->dev, "Acceleration driver reset completed\n"); + dev_info(&pdev->dev, "Device is up and running\n"); +} +EXPORT_SYMBOL_GPL(zsda_resume); diff --git a/src/crypto/zsda/accdevice/zsda_common/zsda_pci.h b/src/crypto/zsda/accdevice/zsda_common/zsda_pci.h new file mode 100644 index 0000000..94b1eba --- /dev/null +++ b/src/crypto/zsda/accdevice/zsda_common/zsda_pci.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright(c) 2024 ZTE Corporation */ +#ifndef ZSDA_PCI_H +#define ZSDA_PCI_H + +pci_ers_result_t zsda_err_detected(struct pci_dev *pdev, + pci_channel_state_t state); +pci_ers_result_t zsda_slot_reset(struct pci_dev *pdev); +void zsda_reset_prepare(struct pci_dev *pdev); +void zsda_reset_done(struct pci_dev *pdev); +void zsda_resume(struct pci_dev *pdev); +int zsda_sriov_configure(struct pci_dev *pdev, int numvfs); + +#endif diff --git a/src/crypto/zsda/accdevice/zsda_common/zsda_qp.c b/src/crypto/zsda/accdevice/zsda_common/zsda_qp.c new file mode 100644 index 0000000..c9d8203 --- /dev/null +++ b/src/crypto/zsda/accdevice/zsda_common/zsda_qp.c @@ -0,0 +1,674 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright(c) 2024 ZTE Corporation */ +#include +#include +#include "acc_addr.h" +#include "zsda_common_drv.h" +#include "acc_dev.h" + +#define RING_DIR_TX 0 +#define RING_DIR_RX 1 +#define CRYPTO_WQE_SIZE 128 +#define CRYPTO_CQE_SIZE 16 +#define MAX_RETRY_TIMES 30 + +static uint8_t crc8_table[256] = { + 0x0, 0x41, 0x13, 0x52, 0x26, 0x67, 0x35, 0x74, 0x4c, 0xd, 0x5f, 0x1e, + 0x6a, 0x2b, 0x79, 0x38, 0x9, 0x48, 0x1a, 0x5b, 0x2f, 0x6e, 0x3c, 0x7d, + 0x45, 0x4, 0x56, 0x17, 0x63, 0x22, 0x70, 0x31, 0x12, 0x53, 0x1, 0x40, + 0x34, 0x75, 0x27, 0x66, 0x5e, 0x1f, 0x4d, 0xc, 0x78, 0x39, 0x6b, 0x2a, + 0x1b, 0x5a, 0x8, 0x49, 0x3d, 0x7c, 0x2e, 0x6f, 0x57, 0x16, 0x44, 0x5, + 0x71, 0x30, 0x62, 0x23, 0x24, 0x65, 0x37, 0x76, 0x2, 0x43, 0x11, 0x50, + 0x68, 0x29, 0x7b, 0x3a, 0x4e, 0xf, 0x5d, 0x1c, 0x2d, 0x6c, 0x3e, 0x7f, + 0xb, 0x4a, 0x18, 0x59, 0x61, 0x20, 0x72, 0x33, 0x47, 0x6, 0x54, 0x15, + 0x36, 0x77, 0x25, 0x64, 0x10, 0x51, 0x3, 0x42, 0x7a, 0x3b, 0x69, 0x28, + 0x5c, 0x1d, 0x4f, 0xe, 0x3f, 0x7e, 0x2c, 0x6d, 0x19, 0x58, 0xa, 0x4b, + 0x73, 0x32, 0x60, 0x21, 0x55, 0x14, 0x46, 0x7, 0x48, 0x9, 0x5b, 0x1a, + 0x6e, 0x2f, 0x7d, 0x3c, 0x4, 0x45, 0x17, 0x56, 0x22, 0x63, 0x31, 0x70, + 0x41, 0x0, 0x52, 0x13, 0x67, 0x26, 0x74, 0x35, 0xd, 0x4c, 0x1e, 0x5f, + 0x2b, 0x6a, 0x38, 0x79, 0x5a, 0x1b, 0x49, 0x8, 0x7c, 0x3d, 0x6f, 0x2e, + 0x16, 0x57, 0x5, 0x44, 0x30, 0x71, 0x23, 0x62, 0x53, 0x12, 0x40, 0x1, + 0x75, 0x34, 0x66, 0x27, 0x1f, 0x5e, 0xc, 0x4d, 0x39, 0x78, 0x2a, 0x6b, + 0x6c, 0x2d, 0x7f, 0x3e, 0x4a, 0xb, 0x59, 0x18, 0x20, 0x61, 0x33, 0x72, + 0x6, 0x47, 0x15, 0x54, 0x65, 0x24, 0x76, 0x37, 0x43, 0x2, 0x50, 0x11, + 0x29, 0x68, 0x3a, 0x7b, 0xf, 0x4e, 0x1c, 0x5d, 0x7e, 0x3f, 0x6d, 0x2c, + 0x58, 0x19, 0x4b, 0xa, 0x32, 0x73, 0x21, 0x60, 0x14, 0x55, 0x7, 0x46, + 0x77, 0x36, 0x64, 0x25, 0x51, 0x10, 0x42, 0x3, 0x3b, 0x7a, 0x28, 0x69, + 0x1d, 0x5c, 0xe, 0x4f +}; + +static void zsda_release_dma(struct accel_dev *accel_dev, struct qp_srv *qp); + +static uint8_t zsda_crc8(uint8_t *message, int length) +{ + uint8_t crc = 0; + int i; + + for (i = 0; i < length; i++) + crc = crc8_table[crc ^ message[i]]; + return crc; +} + +void set_reg_8(void __iomem *addr, uint8_t val0, uint8_t val1, uint8_t val2, + uint8_t val3) +{ + uint32_t value; + uint8_t val[4]; + + val[0] = val0; + val[1] = val1; + val[2] = val2; + val[3] = val3; + memcpy(&value, val, sizeof(val)); + ZSDA_REG_WR(addr, 0, value); +} + +uint8_t get_reg_8(void __iomem *addr, uint8_t offset) +{ + uint32_t val = ZSDA_REG_RD(addr, 0); + + return *(((uint8_t *)&val) + offset); +} + +void zsda_admin_q_start(struct accel_dev *accel_dev) +{ + void __iomem *base = accel_dev->accel_pci_dev.pci_bars[ZSDA_BAR0].virt_addr; + + ZSDA_REG_WR(base, ZSDA_ADMIN_Q_START, VALID); +} + +int zsda_admin_msg_init(struct accel_pci *accel_pci_dev) +{ + void __iomem *base = accel_pci_dev->pci_bars[ZSDA_BAR0].virt_addr; + + set_reg_8(base + ZSDA_ADMIN_WQ_BASE7, 0, 0, MAGIC_RECV, 0); + set_reg_8(base + ZSDA_ADMIN_CQ_BASE7, 0, 0, MAGIC_RECV, 0); + return 0; +} + +int zsda_send_admin_msg(struct accel_pci *accel_pci_dev, void *req, uint32_t len) +{ + int i; + uint8_t wq_flag, crc; + uint32_t db, admin_db; + uint32_t retry = ADMIN_RETRY_TIMES; + void __iomem *base = accel_pci_dev->pci_bars[ZSDA_BAR0].virt_addr; + + if (len > ADMIN_BUF_DATA_LEN) + return -EINVAL; + + for (i = 0; i < ADMIN_BUF_DATA_LEN / sizeof(uint32_t); i++) + ZSDA_REG_WR(base, ZSDA_ADMIN_WQ(i), *((uint32_t *)req + i)); + + crc = zsda_crc8((uint8_t *)req, ADMIN_BUF_DATA_LEN); + set_reg_8(base + ZSDA_ADMIN_WQ_BASE7, crc, ADMIN_VER, MAGIC_SEND, 0); + admin_db = ZSDA_REG_RD(base, ZSDA_ADMIN_WQ_TAIL); + db = zsda_modulo(admin_db, 0x1ff); + ZSDA_REG_WR(base, ZSDA_ADMIN_WQ_TAIL, db); + + do { + msleep(20); + wq_flag = get_reg_8(base + ZSDA_ADMIN_WQ_BASE7, 2); + if (wq_flag == MAGIC_RECV) + return 0; + } while (retry--); + set_reg_8(base + ZSDA_ADMIN_WQ_BASE7, 0, crc, ADMIN_VER, 0); + return -EIO; +} + +int zsda_recv_admin_msg(struct accel_pci *accel_pci_dev, void *resp, + uint32_t len) +{ + int i; + uint8_t cq_flag, crc; + uint32_t retry = ADMIN_RETRY_TIMES; + uint8_t buf[ADMIN_BUF_TOTAL_LEN]; + uint32_t resp_buff[ADMIN_BUF_DATA_LEN / sizeof(uint32_t)] = { 0 }; + void __iomem *base = accel_pci_dev->pci_bars[ZSDA_BAR0].virt_addr; + struct device *dev = &accel_pci_dev->pci_dev->dev; + + if (len > ADMIN_BUF_DATA_LEN) + return -EINVAL; + do { + msleep(20); + cq_flag = get_reg_8(base + ZSDA_ADMIN_CQ_BASE7, 2); + if (cq_flag == MAGIC_SEND) + break; + } while (--retry); + if (!retry) { + dev_err(dev, "cq_flag error 0x%x\n", cq_flag); + return -EIO; + } + + for (i = 0; i < (ADMIN_BUF_DATA_LEN / sizeof(uint32_t)); i++) + resp_buff[i] = ZSDA_REG_RD(base, ZSDA_ADMIN_CQ(i)); + + memcpy(buf, resp_buff, ADMIN_BUF_DATA_LEN); + crc = get_reg_8(base + ZSDA_ADMIN_CQ_BASE7, 0); + set_reg_8(base + ZSDA_ADMIN_CQ_BASE7, 0, 0, MAGIC_RECV, 0); + if (crc != zsda_crc8(buf, ADMIN_BUF_DATA_LEN)) { + dev_err(dev, "get crc error!"); + return -EIO; + } + memcpy(resp, buf, len); + + return 0; +} + +int zsda_function_resume(struct accel_dev *accel_dev) +{ + int ret = 0; + struct zsda_admin_req_qcfg req = { 0 }; + struct zsda_admin_resp_qcfg resp = { 0 }; + struct accel_pci accel_pci_dev = accel_dev->accel_pci_dev; + + zsda_admin_msg_init(&accel_pci_dev); + req.msg_type = ZSDA_FLR_SET_FUNCTION; + ret = zsda_send_admin_msg(&accel_pci_dev, &req, sizeof(req)); + if (ret) { + dev_err(&GET_DEV(accel_dev), "Failed to send resume msg\n"); + return -EBUSY; + } + ret = zsda_recv_admin_msg(&accel_pci_dev, &resp, sizeof(resp)); + if (ret) { + dev_err(&GET_DEV(accel_dev), "Failed to recv resume msg\n"); + return -EBUSY; + } + return ret; +} + +enum zsda_service_type zsda_get_queue_cfg_by_id(struct accel_dev *accel_dev, + int qid, struct qinfo *qcfg) +{ + struct accel_pci accel_pci_dev = accel_dev->accel_pci_dev; + struct zsda_admin_req_qcfg req = { 0 }; + struct zsda_admin_resp_qcfg resp = { 0 }; + int ret = 0; + + zsda_admin_msg_init(&accel_pci_dev); + + req.msg_type = ZSDA_ADMIN_QUEUE_CFG_REQ; + req.qid = (unsigned char)qid; + ret = zsda_send_admin_msg(&accel_pci_dev, &req, sizeof(req)); + if (ret) { + dev_err(&GET_DEV(accel_dev), "Failed send to admin to get ZSDA queue configure qid = %d, request statu:%d\n", + qid, ret); + goto err_out; + } + + ret = zsda_recv_admin_msg(&accel_pci_dev, &resp, sizeof(resp)); + if (ret) { + dev_err(&GET_DEV(accel_dev), "Failed recv from admin to get ZSDA queue configure qid = %d, response status:%d\n", + qid, ret); + goto err_out; + } + + if ((resp.msg_type == ZSDA_ADMIN_QUEUE_CFG_RESP) && + (resp.qcfg.q_type < ZSDA_SERVICE_COUNT)) { + memcpy(qcfg, &resp.qcfg, sizeof(struct qinfo)); + return resp.qcfg.q_type; + } +err_out: + return ZSDA_SERVICE_COUNT; +} + +static int clear_io_queue(void __iomem *base, uint32_t id) +{ + int retry = 0; + + ZSDA_REG_WR(base, ZSDA_IO_Q_CLR_RESP(id), INVALID); + ZSDA_REG_WR(base, ZSDA_IO_Q_CLR(id), VALID); + while (ZSDA_REG_RD(base, ZSDA_IO_Q_CLR_RESP(id)) == INVALID) { + retry++; + if (retry >= MAX_RETRY_TIMES) + return -EBUSY; + msleep(20); + } + return 0; +} + +static void restore_io_queue(void __iomem *base, uint32_t id) +{ + ZSDA_REG_WR(base, ZSDA_IO_Q_CLR(id), INVALID); +} + +static int zsda_queue_create(struct accel_dev *accel_dev, + struct zsda_queue *queue, struct qinfo *qcfg, + uint8_t dir) +{ + uint64_t iova; + uint8_t *addr; + uint16_t desc_size = (dir == RING_DIR_TX) ? + CRYPTO_WQE_SIZE : + CRYPTO_CQE_SIZE; // wqe or cq size + uint32_t queue_size_bytes = ZSDA_MAX_DESC * desc_size; // queue size + + addr = dma_alloc_coherent(&GET_DEV(accel_dev), queue_size_bytes, &iova, + GFP_KERNEL); + if (!addr) + return -EFAULT; + + queue->base_phys_addr = iova; + queue->base_addr = addr; + queue->modulo_mask = 0x1ff; + queue->head = (dir == RING_DIR_TX) ? qcfg->wq_head : qcfg->cq_head; + queue->tail = (dir == RING_DIR_TX) ? qcfg->wq_tail : qcfg->cq_tail; + queue->msg_size = desc_size; + if (queue->head == 0 && queue->tail == 0) + qcfg->cycle += 1; + queue->valid = qcfg->cycle & 0xff; + queue->sid = 0; + queue->queue_size = ZSDA_MAX_DESC; + queue->io_addr = accel_dev->accel_pci_dev.pci_bars[ZSDA_BAR0].virt_addr; + memset(queue->base_addr, 0, queue_size_bytes); + + return 0; +} + +static int build_qps(struct accel_dev *accel_dev, struct qp_srv *qp, + struct qinfo *qcfg, uint32_t qid) +{ + int ret = 0; + + qp->type = qcfg->q_type; + qp->qid = qid; + spin_lock_init(&qp->lock); + atomic_set(&qp->unqueued, 0); + ret = zsda_queue_create(accel_dev, &qp->tx_q, qcfg, RING_DIR_TX); + if (unlikely(ret)) { + dev_err(&GET_DEV(accel_dev), "Tx queue create failed queue_pair_id=%u\n", qid); + return ret; + } + ZSDA_WQ_RING_BASE(qp->tx_q.io_addr, qid, qp->tx_q.base_phys_addr); + + ret = zsda_queue_create(accel_dev, &qp->rx_q, qcfg, RING_DIR_RX); + if (unlikely(ret)) { + dev_err(&GET_DEV(accel_dev), "Rx queue create failed queue_pair_id=%hu\n", qid); + return ret; + } + ZSDA_CQ_RING_BASE(qp->rx_q.io_addr, qid, qp->rx_q.base_phys_addr); + + return ret; +} + +int start_qp(void __iomem *base, uint32_t qid) +{ + int retry = 0; + + ZSDA_REG_WR(base, ZSDA_IO_Q_START(qid), Q_START); + while (ZSDA_REG_RD(base, ZSDA_IO_Q_START(qid)) == INVALID) { + retry++; + if (retry >= MAX_RETRY_TIMES) + return -EBUSY; + msleep(20); + } + return 0; +} + +int stop_qp(void __iomem *base, uint32_t qid) +{ + int retry = 0; + + ZSDA_REG_WR(base, ZSDA_IO_Q_STOP_RESP(qid), INVALID); + ZSDA_REG_WR(base, ZSDA_IO_Q_STOP(qid), Q_STOP); + + while (ZSDA_REG_RD(base, ZSDA_IO_Q_STOP_RESP(qid)) == INVALID) { + retry++; + if (retry >= MAX_RETRY_TIMES) + return -EBUSY; + msleep(20); + } + ZSDA_REG_WR(base, ZSDA_IO_Q_STOP_RESP(qid), INVALID); + + return 0; +} + +int zsda_qp_int(struct accel_dev *accel_dev, struct qp_srv *qp, + struct qinfo *qcfg, uint32_t qid) +{ + void __iomem *base = accel_dev->accel_pci_dev.pci_bars[ZSDA_BAR0].virt_addr; + int ret = 0; + + ret = build_qps(accel_dev, qp, qcfg, qid); + if (unlikely(ret)) + return ret; + + ret = clear_io_queue(base, qid); + if (unlikely(ret)) + return ret; + + restore_io_queue(base, qid); + + ret = stop_qp(base, qid); + if (unlikely(ret)) + return ret; + + ret = start_qp(base, qid); + if (unlikely(ret)) + return ret; + + return ret; +} + +static void zsda_add_qps(struct accel_dev *accel_dev, struct qp_srv *qp, + enum zsda_service_type type) +{ + struct zsda_qp *alg_qp = &accel_dev->cfg->alg_qps[type]; + + qp->used = true; + alg_qp->qp_num++; + INIT_LIST_HEAD(&qp->list); + mutex_lock(&alg_qp->lock); + list_add_tail(&qp->list, &alg_qp->list); + mutex_unlock(&alg_qp->lock); +} + +int zsda_dev_int(struct accel_dev *accel_dev) +{ + int i = 0, ret = 0; + uint32_t qp_num; + struct qinfo qcfg; + struct qp_srv *qp; + enum zsda_service_type type = ZSDA_SERVICE_COUNT; + void __iomem *base = accel_dev->accel_pci_dev.pci_bars[ZSDA_BAR0].virt_addr; + + for (i = 0; i < ZSDA_SERVICE_COUNT; i++) { + atomic_set(&accel_dev->cfg->backlog[i].inflights, 0); + INIT_LIST_HEAD(&accel_dev->cfg->backlog[i].list); + spin_lock_init(&accel_dev->cfg->backlog[i].lock); + + INIT_LIST_HEAD(&accel_dev->cfg->alg_qps[i].list); + mutex_init(&accel_dev->cfg->alg_qps[i].lock); + } + + zsda_admin_q_start(accel_dev); + ret = zsda_function_resume(accel_dev); + if (unlikely(ret)) + return ret; + + qp_num = MIN(ZSDA_REG_RD(base, 0) + 1, MAX_RING_NUM); + for (i = 0; i < qp_num; i++) { + ZSDA_REG_WR(base, ZSDA_QUE_DB_INIT(i), 0); + + type = zsda_get_queue_cfg_by_id(accel_dev, i, &qcfg); + if (type < ZSDA_SERVICE_ENCRYPT || + type > ZSDA_SERVICE_DECRYPT) + continue; + dev_info(&GET_DEV(accel_dev), "qid %d; type %d\n", i, type); + + qp = kzalloc_node(sizeof(struct qp_srv), GFP_KERNEL, + dev_to_node(&GET_DEV(accel_dev))); + + ret = zsda_qp_int(accel_dev, qp, &qcfg, i); + if (unlikely(ret)) { + zsda_release_dma(accel_dev, qp); + kfree(qp); + continue; + } + zsda_add_qps(accel_dev, qp, type); + } + + if (list_empty(&accel_dev->cfg->alg_qps[ZSDA_SERVICE_ENCRYPT].list) || + list_empty(&accel_dev->cfg->alg_qps[ZSDA_SERVICE_DECRYPT].list)){ + dev_info(&GET_DEV(accel_dev), "%s don't support Crypto", accel_dev->name); + return -EFAULT; + } + + return 0; +} +EXPORT_SYMBOL_GPL(zsda_dev_int); + +static void zsda_release_dma(struct accel_dev *accel_dev, struct qp_srv *qp) +{ + struct zsda_queue *tx_qp = &qp->tx_q; + struct zsda_queue *rx_qp = &qp->rx_q; + + if (tx_qp->base_addr != NULL) { + memset(tx_qp->base_addr, 0x0, + tx_qp->queue_size * tx_qp->msg_size); + dma_free_coherent(&GET_DEV(accel_dev), + (tx_qp->msg_size * tx_qp->queue_size), + tx_qp->base_addr, tx_qp->base_phys_addr); + } + if (rx_qp->base_addr != NULL) { + memset(rx_qp->base_addr, 0x0, + rx_qp->queue_size * rx_qp->msg_size); + dma_free_coherent(&GET_DEV(accel_dev), + (rx_qp->msg_size * rx_qp->queue_size), + rx_qp->base_addr, rx_qp->base_phys_addr); + } +} + +void zsda_release_qps(struct accel_dev *accel_dev) +{ + int i; + struct zsda_qp *alg_qp; + struct qp_srv *qp, *tmp; + void __iomem *base = accel_dev->accel_pci_dev.pci_bars[ZSDA_BAR0].virt_addr; + + clear_bit(ZSDA_STATUS_STARTED, &accel_dev->status); + for (i = 0; i < ZSDA_SERVICE_COUNT; i++) { + alg_qp = &accel_dev->cfg->alg_qps[i]; + mutex_lock(&alg_qp->lock); + list_for_each_entry_safe(qp, tmp, &alg_qp->list, list) { + if (unlikely(!qp->used)) + continue; + + while (atomic_read(&qp->unqueued)) + msleep(100); + + clear_io_queue(base, qp->qid); + + stop_qp(base, qp->qid); + + zsda_release_dma(accel_dev, qp); + list_del(&qp->list); + kfree(qp); + } + mutex_unlock(&alg_qp->lock); + } +} +EXPORT_SYMBOL_GPL(zsda_release_qps); + +struct qp_srv *get_free_qp(struct device_cfg_data *cfg, + enum zsda_service_type type) +{ + struct qp_srv *qp = NULL; + struct zsda_qp *alg_qp = &cfg->alg_qps[type]; + + list_for_each_entry(qp, &alg_qp->list, list) { + if (unlikely(!qp->used)) + continue; + if (atomic_read(&qp->unqueued) < ZSDA_MAX_DESC) { + return qp; + } + } + + return NULL; +} + +int find_next_free_cookie(struct zsda_queue *queue, void **op_cookie) +{ + uint32_t tail = queue->tail; + + if (tail >= ZSDA_MAX_DESC) + return -EINVAL; + if (op_cookie[tail] == NULL) + return tail; + else + return -EINVAL; +} + +void zsda_build_req(struct zsda_crypto_request *zsda_req, + struct zsda_crypto_ctx *ctx, enum zsda_service_type type) +{ + struct zsda_wqe *wqe = &(zsda_req->wqe); + struct cookie *cookie = zsda_req->cookie; + + wqe->tx_sgl_type = SGL_ELM_TYPE_LIST; + wqe->rx_sgl_type = SGL_ELM_TYPE_LIST; + wqe->tx_addr = cookie->dst_addr; + wqe->tx_length = zsda_req->skcipher_req->cryptlen; + wqe->rx_addr = cookie->src_addr; + wqe->rx_length = zsda_req->skcipher_req->cryptlen; + wqe->cfg.crypto.lbads = 0; + + reverse_memcpy(wqe->cfg.crypto.slba_l, + zsda_req->skcipher_req->iv + ZSDA_XTS_IV_SLBA_OFF, + sizeof(wqe->cfg.crypto.slba_l)); + reverse_memcpy(wqe->cfg.crypto.slba_h, zsda_req->skcipher_req->iv, + sizeof(wqe->cfg.crypto.slba_h)); + + if (type == ZSDA_SERVICE_ENCRYPT) { + if (ctx->keylen == 32) + wqe->op_code = ZSDA_OPC_EC_AES_XTS_256; + else + wqe->op_code = ZSDA_OPC_EC_AES_XTS_512; + memcpy(wqe->cfg.crypto.key, ctx->encry_key, + sizeof(wqe->cfg.crypto.key)); + } else { + if (ctx->keylen == 32) + wqe->op_code = ZSDA_OPC_DC_AES_XTS_256; + else + wqe->op_code = ZSDA_OPC_DC_AES_XTS_512; + memcpy(wqe->cfg.crypto.key, ctx->decry_key, + sizeof(wqe->cfg.crypto.key)); + } +} + +int enqueue(struct zsda_crypto_request *zsda_req, enum zsda_service_type type, + bool soft) +{ + int tx_tail; + struct qp_srv *qp; + struct zsda_queue *tx_queue; + struct accel_dev *acc_dev = zsda_req->ablkcipher_ctx->acc_dev; + + qp = get_free_qp(acc_dev->cfg, type); + if (qp == NULL) + return -EBUSY; + + tx_queue = &qp->tx_q; + spin_lock_bh(&qp->lock); + tx_tail = find_next_free_cookie(tx_queue, qp->op_cookies); + if (unlikely(tx_tail < 0)) { + spin_unlock_bh(&qp->lock); + return -EBUSY; + } + qp->op_cookies[tx_tail] = zsda_req->cookie; + zsda_req->wqe.valid = tx_queue->valid; + zsda_req->wqe.sid = tx_tail; + + memcpy(tx_queue->base_addr + tx_tail * tx_queue->msg_size, + &zsda_req->wqe, tx_queue->msg_size); + + tx_queue->tail = (tx_tail + 1) & tx_queue->modulo_mask; + + if (tx_queue->tail == 0) + tx_queue->valid = (tx_queue->valid+1) & 0xff; + // if (zsda_req->wqe.sid == 0x1fe) { + // printk("%s soft:%d qid:%d, valid:0x%x, len:0x%x, sid:0x%x op_code:0x%x\n", + // acc_dev->name, soft, qp->qid, zsda_req->wqe.valid, + // zsda_req->wqe.tx_length, zsda_req->wqe.sid, + // zsda_req->wqe.op_code); + // } + if (type == ZSDA_SERVICE_ENCRYPT) + acc_dev->zsda_dbg.encry_enq++; + else + acc_dev->zsda_dbg.decry_enq++; + atomic_inc(&qp->unqueued); + WRITE_WQ_TAIL(tx_queue->io_addr, qp->qid, tx_queue->tail); + + spin_unlock_bh(&qp->lock); + return 0; +} +EXPORT_SYMBOL_GPL(enqueue); + +void zsda_free_sgl(struct accel_dev *acc_dev, struct cookie *cookie) +{ + struct device *dev = &GET_DEV(acc_dev); + phys_addr_t blp = 0, bloutp = 0; + uint32_t n; + size_t sz; + int i; + + n = cookie->src_n; + sz = PAGE_ALIGN(n * sizeof(struct zsda_buf)); + for (i = 0; i < n; i++) { + if (!dma_mapping_error(dev, cookie->src_buf[i].addr)){ + dma_unmap_single(dev, cookie->src_buf[i].addr, + cookie->src_buf[i].len, + DMA_BIDIRECTIONAL); + } + } + blp = cookie->src_addr; + + if (!dma_mapping_error(dev, blp)) + dma_unmap_single(dev, blp, sz, DMA_TO_DEVICE); + kfree(cookie->src_buf); + + n = cookie->dst_n; + sz = PAGE_ALIGN(n * sizeof(struct zsda_buf)); + for (i = 0; i < n; i++) { + if (!dma_mapping_error(dev, cookie->dst_buf[i].addr)){ + dma_unmap_single(dev, cookie->dst_buf[i].addr, + cookie->dst_buf[i].len, + DMA_BIDIRECTIONAL); + } + } + bloutp = cookie->dst_addr ; + + if (!dma_mapping_error(dev, bloutp)) + dma_unmap_single(dev, bloutp, sz, DMA_TO_DEVICE); + kfree(cookie->dst_buf); + + kfree(cookie); +} + +void dequeue(struct accel_dev *acc_dev, struct qp_srv *qp) +{ + struct zsda_queue *rx_queue = &qp->rx_q; + struct zsda_cqe *cqe = NULL; + struct cookie *cookie = NULL; + uint16_t cq_head = rx_queue->sid; + int unqueued = atomic_read(&qp->unqueued); + bool dealed = 0; + + while (unqueued > 0) { + cqe = (struct zsda_cqe *)(rx_queue->base_addr + + cq_head * rx_queue->msg_size); + if (cqe_err1(cqe->err1) || !cqe_valid(cqe->err1) || + cqe->err0 != 0x0) { + if (!cqe->err1) + break; + dev_err(&GET_DEV(acc_dev), "qid:%d error cq_head:0x%x sid:0x%x, state:0x%x, real_len:0x%x, err0:0x%x, err1:0x%x unqueued:0x%x\n", + qp->qid, cq_head, cqe->sid, cqe->state, + cqe->tx_real_length, cqe->err0, cqe->err1, + unqueued); + } + dealed = 1; + cq_head = cqe->sid; + if (cq_head >= ZSDA_MAX_DESC) + break; + cookie = (struct cookie *)qp->op_cookies[cq_head]; + + cookie->zsda_req->cb(cqe, cookie->zsda_req); + zsda_free_sgl(acc_dev, cookie); + memset(cqe, 0, sizeof(struct zsda_cqe)); + qp->op_cookies[cq_head] = NULL; + unqueued = atomic_sub_return(1, &qp->unqueued); + + cq_head = (cq_head + 1) & rx_queue->modulo_mask; + rx_queue->sid = cq_head; + // if (cqe->sid == 0x1fe) { + // printk("qid:%d cycle:0x%x cq_head:0x%x sid:0x%x, unqueued:0x%x\n", + // qp->qid, cqe->valid, cq_head, cqe->sid, unqueued); + // } + + if (qp->type == ZSDA_SERVICE_ENCRYPT) + acc_dev->zsda_dbg.encry_deq++; + else + acc_dev->zsda_dbg.decry_deq++; + } + WRITE_CQ_HEAD(rx_queue->io_addr, qp->qid, rx_queue->sid); +} diff --git a/src/crypto/zsda/accdevice/zsda_common/zsda_qp.h b/src/crypto/zsda/accdevice/zsda_common/zsda_qp.h new file mode 100644 index 0000000..605b2ef --- /dev/null +++ b/src/crypto/zsda/accdevice/zsda_common/zsda_qp.h @@ -0,0 +1,143 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright(c) 2024 ZTE Corporation */ +#ifndef ZSDA_QP_H +#define ZSDA_QP_H + +// #include +#include "zsda_alg.h" + +#define ZSDA_MAX_DESC 512 +#define MAX_RING_NUM 128 +#define ZSDA_SGL_MAX_NUMBER 512 +#define ZSDA_XTS_IV_SLBA_OFF (8) + +#define ZSDA_OPC_EC_AES_XTS_256 0x0 +#define ZSDA_OPC_EC_AES_XTS_512 0x01 +#define ZSDA_OPC_DC_AES_XTS_256 0x08 +#define ZSDA_OPC_DC_AES_XTS_512 0x09 + +#define MAGIC_SEND 0xab +#define MAGIC_RECV 0xcd +#define ADMIN_VER 1 + +#define MIN(a, b) (a < b ? a : b) + +enum zsda_service_type { + ZSDA_SERVICE_COMPRESSION = 0, + ZSDA_SERVICE_DECOMPRESSION = 1, + ZSDA_SERVICE_ENCRYPT, + ZSDA_SERVICE_DECRYPT, + ZSDA_SERVICE_HASH_ENCODE, + ZSDA_SERVICE_DIFF, + ZSDA_SERVICE_EC_ENCODE, + ZSDA_SERVICE_EC_DECODE, + ZSDA_SERVICE_COUNT +}; + +enum zsda_admin_msg_id { + ZSDA_ADMIN_VERSION_REQ = 0, // 版本信息 + ZSDA_ADMIN_VERSION_RESP, + ZSDA_ADMIN_QUEUE_CFG_REQ, // 算法类型 + ZSDA_ADMIN_QUEUE_CFG_RESP, + ZSDA_ADMIN_QUEUE_CYCLE_REQ, // get cycle值 + ZSDA_ADMIN_QUEUE_CYCLE_RESP, + ZSDA_ADMIN_SET_CYCLE_REQ, // set cycle值 + ZSDA_ADMIN_SET_CYCLE_RESP, + + ZSDA_MIG_STATE_WARNING, + ZSDA_ADMIN_RESERVE, + ZSDA_FLR_SET_FUNCTION, // 关闭flr屏蔽寄存器 + ZSDA_ADMIN_MSG_VALID, + ZSDA_ADMIN_INT_TEST +}; + +enum sgl_elment_type { + SGL_ELM_TYPE_PHYS_ADDR = 1, + SGL_ELM_TYPE_LIST, + SGL_ELM_TYPE_LIST_ADDR +}; + +struct qinfo { + uint16_t q_type; + uint16_t wq_tail; + uint16_t wq_head; + uint16_t cq_tail; + uint16_t cq_head; + uint16_t cycle; +}; + +struct zsda_admin_req_qcfg { + uint16_t msg_type; + uint8_t qid; + uint8_t data[25]; +}; + +struct zsda_admin_resp_qcfg { + uint16_t msg_type; + struct qinfo qcfg; + uint8_t data[14]; +}; + +struct zsda_queue { + void __iomem *io_addr; + uint8_t *base_addr; /* Base address */ + uint64_t base_phys_addr; /* Queue physical address */ + uint32_t head; /* Shadow copy of the head */ + uint32_t tail; /* Shadow copy of the tail */ + uint32_t msg_size; + uint32_t queue_size; //512 + + /* HW queue offset */ + uint32_t csr_head; /* last written head value */ + uint32_t csr_tail; /* last written tail value */ + uint16_t modulo_mask; + /* number of responses processed since last CSR head write */ + uint8_t valid; + uint8_t rsv; + uint16_t sid; +}; + +struct qp_srv { + uint32_t qid; + enum zsda_service_type type; + bool used; + struct zsda_queue tx_q; + struct zsda_queue rx_q; + void *op_cookies[ZSDA_MAX_DESC]; + spinlock_t lock; + /**< zsda device this qp is on */ + atomic_t unqueued; + struct list_head list; +}; + +struct zsda_backlog { + atomic_t inflights; + struct list_head list; + spinlock_t lock; /* protects backlog list */ +}; + +struct zsda_qp { + uint32_t qp_num; + uint64_t enqueue; + uint64_t dequeue; + atomic_t inflights; + struct list_head list; + struct mutex lock; +}; + +#define cqe_valid(value) (value & 0x8000) +#define cqe_err1(value) (value & 0x7fff) + +static inline uint32_t zsda_modulo(uint32_t data, uint32_t modulo_mask) +{ + return (data) & (modulo_mask); +} + +int zsda_dev_int(struct accel_dev *accel_dev); +void zsda_release_qps(struct accel_dev *accel_dev); +void zsda_build_req(struct zsda_crypto_request *zsda_req, + struct zsda_crypto_ctx *ctx, enum zsda_service_type type); +int enqueue(struct zsda_crypto_request *zsda_req, enum zsda_service_type type, + bool soft); +void dequeue(struct accel_dev *acc_dev, struct qp_srv *qp); +#endif diff --git a/src/crypto/zsda/accdevice/zsda_pf/Makefile b/src/crypto/zsda/accdevice/zsda_pf/Makefile new file mode 100644 index 0000000..f5b4168 --- /dev/null +++ b/src/crypto/zsda/accdevice/zsda_pf/Makefile @@ -0,0 +1,4 @@ +ccflags-y := -I$(src)/../../include +ccflags-y += -I$(src)/../zsda_common +obj-$(CONFIG_ACC_ZSDA_PF) += zsda_pf.o +zsda_pf-objs = zsda_drv.o diff --git a/src/crypto/zsda/accdevice/zsda_pf/zsda_drv.c b/src/crypto/zsda/accdevice/zsda_pf/zsda_drv.c new file mode 100644 index 0000000..ca39579 --- /dev/null +++ b/src/crypto/zsda/accdevice/zsda_pf/zsda_drv.c @@ -0,0 +1,237 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright(c) 2024 ZTE Corporation */ +#include +#include +#include +#include +#include +#include +#include "acc_version.h" +// #include "acc_compat.h" +#include "acc_dev.h" +#include "zsda_pci.h" +#include "zsda_manage.h" +#include "zsda_common_drv.h" + +#define PCI_VENDOR_ID_ZTE 0x1cf2 +#define ZSDA_PF_PCI_DEVICE_ID 0x8050 + +#define ZSDA_SYSTEM_DEVICE(device_id) \ + {PCI_DEVICE(PCI_VENDOR_ID_ZTE, device_id)} + +static const struct pci_device_id zsda_pf_pci_tbl[] = { + ZSDA_SYSTEM_DEVICE(ZSDA_PF_PCI_DEVICE_ID), + { + 0, + } +}; +MODULE_DEVICE_TABLE(pci, zsda_pf_pci_tbl); + +static int zsda_pf_probe(struct pci_dev *dev, const struct pci_device_id *ent); +static void zsda_pf_remove(struct pci_dev *dev); + +static const struct file_operations test_debugfs_ops = { + .open = zsda_seq_open, + .read = seq_read, + .write = zsda_seq_write, + .llseek = seq_lseek, + .release = single_release, +}; + +static const struct pci_error_handlers zsda_err_handler = { + .error_detected = zsda_err_detected, + .slot_reset = zsda_slot_reset, + .reset_prepare = zsda_reset_prepare, + .reset_done = zsda_reset_done, + .resume = zsda_resume, +}; + +static struct pci_driver zsda_pf_driver = { + .id_table = zsda_pf_pci_tbl, + .name = "ZSDA-PF", + .probe = zsda_pf_probe, + .remove = zsda_pf_remove, + .err_handler = &zsda_err_handler, +#ifndef NO_SRIOV_CONFIGURE + .sriov_configure = zsda_sriov_configure, +#endif +}; + +static void zsda_pf_cleanup_pci_dev(struct accel_dev *accel_dev) +{ + pci_release_regions(accel_dev->accel_pci_dev.pci_dev); + pci_disable_device(accel_dev->accel_pci_dev.pci_dev); +} + +static void zsda_pf_cleanup_accel(struct accel_dev *accel_dev) +{ + zsda_unmap_pci_bars(accel_dev); + + kfree(accel_dev->hw_data); + accel_dev->hw_data = NULL; + kfree(accel_dev->cfg); + accel_dev->cfg = NULL; + + debugfs_remove(accel_dev->debugfs_dir); + accel_dev->debugfs_dir = NULL; + acc_devmgr_rm_dev(accel_dev); +} + +static int zsda_pf_probe(struct pci_dev *pdev, const struct pci_device_id *ent) +{ + struct accel_dev *accel_dev; + struct accel_pci *accel_pci_dev; + struct device_hw_data *hw_data; + struct device_cfg_data *hw_cfg_data; + char name[ZSDA_DEVICE_NAME_LENGTH]; + int ret = 0; + + if ((num_possible_nodes() > 1) && (dev_to_node(&pdev->dev) < 0)) { + dev_err(&pdev->dev, "Invalid NUMA configuration.\n"); + return -EINVAL; + } + + accel_dev = kzalloc_node(sizeof(struct accel_dev), GFP_KERNEL, + dev_to_node(&pdev->dev)); + if (!accel_dev) + return -ENOMEM; + + accel_pci_dev = &(accel_dev->accel_pci_dev); + accel_pci_dev->pci_dev = pdev; + + acc_devmgr_add_dev(accel_dev); + + accel_dev->owner = THIS_MODULE; + hw_data = kzalloc_node(sizeof(struct device_hw_data), GFP_KERNEL, + dev_to_node(&pdev->dev)); + if (!hw_data) { + ret = -ENOMEM; + goto out_err; + } + accel_dev->hw_data = hw_data; + + hw_cfg_data = kzalloc_node(sizeof(struct device_cfg_data), GFP_KERNEL, + dev_to_node(&pdev->dev)); + if (!hw_cfg_data) { + ret = -ENOMEM; + goto out_err; + } + accel_dev->cfg = hw_cfg_data; + + snprintf(name, sizeof(name), "zsda_%04x:%02x:%02x.%d", + pci_domain_nr(accel_dev->accel_pci_dev.pci_dev->bus), + pdev->bus->number, PCI_SLOT(pdev->devfn), + PCI_FUNC(pdev->devfn)); + memcpy(accel_dev->name, name, sizeof(name)); + dev_info(&pdev->dev, "Probe %s\n", name); + + accel_dev->debugfs_dir = debugfs_create_dir(name, NULL); + if (!accel_dev->debugfs_dir) { + dev_err(&pdev->dev, "Could not create debugfs dir %s\n", name); + ret = -EINVAL; + goto out_err; + } + + if (!debugfs_create_file("ctrl", 0444, accel_dev->debugfs_dir, + accel_dev, &test_debugfs_ops)) { + ret = -EINVAL; + goto out_err; + } + + if (pci_enable_device(pdev)) { + ret = -EFAULT; + goto out_err; + } + + if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) { + if ((pci_set_dma_mask(pdev, DMA_BIT_MASK(32)))) { + dev_err(&pdev->dev, "No usable DMA configuration\n"); + ret = -EFAULT; + goto out_err_disable; + } else { + pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)); + } + } else { + pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)); + } + + if (pci_request_regions(pdev, ZSDA_PF_DEVICE_NAME)) { + ret = -EFAULT; + goto out_err_disable; + } + + ret = zsda_map_pci_bars(accel_dev); + if (unlikely(ret)) + goto out_err_free_reg; + pci_set_master(pdev); + + if(zsda_dev_int(accel_dev)) + return ret; + + ret = zsda_request_irqs(accel_dev); + if (unlikely(ret)) + goto out_err_dev_release; + + set_bit(ZSDA_STATUS_STARTED, &accel_dev->status); + accel_dev->lkcf_en = true; + zsda_lkcf_register(); + + return ret; + +out_err_dev_release: + zsda_release_qps(accel_dev); +out_err_free_reg: + pci_release_regions(accel_pci_dev->pci_dev); +out_err_disable: + pci_disable_device(accel_pci_dev->pci_dev); +out_err: + zsda_pf_cleanup_accel(accel_dev); + kfree(accel_dev); + return ret; +} + +static void zsda_pf_remove(struct pci_dev *pdev) +{ + struct accel_dev *accel_dev = acc_devmgr_pci_to_accel_dev(pdev); + + if (!accel_dev) { + pr_err("ZSDA: Driver removal failed pf\n"); + return; + } + zsda_release_qps(accel_dev); + if(test_bit(ZSDA_STATUS_IRQ_ALLOCATED, &accel_dev->status)){ + zsda_free_irqs(accel_dev); + clear_bit(ZSDA_STATUS_IRQ_ALLOCATED, &accel_dev->status); + } + zsda_sriov_configure(pdev, 0); + zsda_pf_cleanup_pci_dev(accel_dev); + zsda_pf_cleanup_accel(accel_dev); + kfree(accel_dev); + zsda_lkcf_unregister(); + +} + +static int __init zsda_pfdrv_init(void) +{ + request_module("zsda_common"); + + if (pci_register_driver(&zsda_pf_driver)) { + pr_err("ZSDA: Driver initialization failed\n"); + return -EFAULT; + } + + return 0; +} + +static void __exit zsda_pfdrv_release(void) +{ + pci_unregister_driver(&zsda_pf_driver); +} + +module_init(zsda_pfdrv_init); +module_exit(zsda_pfdrv_release); + +MODULE_AUTHOR("ZTE"); +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_DESCRIPTION("ZTE ACC ZSDA PF"); +MODULE_VERSION(ZSDA_DRV_VERSION); diff --git a/src/crypto/zsda/accdevice/zsda_vf/Makefile b/src/crypto/zsda/accdevice/zsda_vf/Makefile new file mode 100644 index 0000000..2981e38 --- /dev/null +++ b/src/crypto/zsda/accdevice/zsda_vf/Makefile @@ -0,0 +1,5 @@ + +ccflags-y := -I$(src)/../../include +ccflags-y += -I$(src)/../zsda_common +obj-$(CONFIG_ACC_ZSDA_VF) += zsda_vf.o +zsda_vf-objs = zsda_drv.o diff --git a/src/crypto/zsda/accdevice/zsda_vf/zsda_drv.c b/src/crypto/zsda/accdevice/zsda_vf/zsda_drv.c new file mode 100644 index 0000000..0502062 --- /dev/null +++ b/src/crypto/zsda/accdevice/zsda_vf/zsda_drv.c @@ -0,0 +1,217 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright(c) 2024 ZTE Corporation */ +#include +#include +#include +#include +#include +#include "acc_version.h" +// #include "acc_compat.h" +#include "acc_dev.h" +#include "zsda_manage.h" +#include "zsda_common_drv.h" + +#define PCI_VENDOR_ID_ZTE 0x1cf2 +#define ZSDA_VF_PCI_DEVICE_ID 0x8051 + +#define ZSDA_SYSTEM_DEVICE(device_id) \ + {PCI_DEVICE(PCI_VENDOR_ID_ZTE, device_id)} + +static const struct pci_device_id zsda_vf_pci_tbl[] = { + ZSDA_SYSTEM_DEVICE(ZSDA_VF_PCI_DEVICE_ID), + { + 0, + } +}; +MODULE_DEVICE_TABLE(pci, zsda_vf_pci_tbl); + +static int zsda_vf_probe(struct pci_dev *dev, const struct pci_device_id *ent); +static void zsda_vf_remove(struct pci_dev *dev); + +static const struct file_operations test_debugfs_ops = { + .open = zsda_seq_open, + .read = seq_read, + .write = zsda_seq_write, + .llseek = seq_lseek, + .release = single_release, +}; + +static struct pci_driver zsda_vf_driver = { + .id_table = zsda_vf_pci_tbl, + .name = "ZSDA-VF", + .probe = zsda_vf_probe, + .remove = zsda_vf_remove, +}; + +static void zsda_vf_cleanup_pci_dev(struct accel_dev *accel_dev) +{ + pci_release_regions(accel_dev->accel_pci_dev.pci_dev); + pci_disable_device(accel_dev->accel_pci_dev.pci_dev); +} + +static void zsda_vf_cleanup_accel(struct accel_dev *accel_dev) +{ + zsda_unmap_pci_bars(accel_dev); + + kfree(accel_dev->hw_data); + accel_dev->hw_data = NULL; + kfree(accel_dev->cfg); + accel_dev->cfg = NULL; + + debugfs_remove(accel_dev->debugfs_dir); + accel_dev->debugfs_dir = NULL; + acc_devmgr_rm_dev(accel_dev); +} + +static int zsda_vf_probe(struct pci_dev *pdev, const struct pci_device_id *ent) +{ + struct accel_dev *accel_dev; + struct accel_pci *accel_pci_dev; + struct device_hw_data *hw_data; + struct device_cfg_data *hw_cfg_data; + char name[ZSDA_DEVICE_NAME_LENGTH]; + int ret = 0; + + if (num_possible_nodes() > 1 && dev_to_node(&pdev->dev) < 0) { + dev_err(&pdev->dev, "Invalid NUMA configuration.\n"); + return -EINVAL; + } + + accel_dev = kzalloc_node(sizeof(struct accel_dev), GFP_KERNEL, + dev_to_node(&pdev->dev)); + if (!accel_dev) + return -ENOMEM; + + accel_pci_dev = &(accel_dev->accel_pci_dev); + accel_pci_dev->pci_dev = pdev; + + acc_devmgr_add_dev(accel_dev); + + accel_dev->owner = THIS_MODULE; + accel_dev->is_vf = true; + hw_data = kzalloc_node(sizeof(struct device_hw_data), GFP_KERNEL, + dev_to_node(&pdev->dev)); + if (!hw_data) { + ret = -ENOMEM; + goto out_err; + } + accel_dev->hw_data = hw_data; + + hw_cfg_data = kzalloc_node(sizeof(struct device_cfg_data), GFP_KERNEL, + dev_to_node(&pdev->dev)); + if (!hw_cfg_data) { + ret = -ENOMEM; + goto out_err; + } + accel_dev->cfg = hw_cfg_data; + + snprintf(name, sizeof(name), "zsda_%02x:%02x.%d", pdev->bus->number, + PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn)); + memcpy(accel_dev->name, name, sizeof(name)); + dev_info(&GET_DEV(accel_dev), "probe %s\n", name); + + accel_dev->debugfs_dir = debugfs_create_dir(name, NULL); + if (!accel_dev->debugfs_dir) { + dev_err(&pdev->dev, "Could not create debugfs dir %s\n", name); + ret = -EINVAL; + goto out_err; + } + if (!debugfs_create_file("ctrl", 0444, accel_dev->debugfs_dir, + accel_dev, &test_debugfs_ops)) { + ret = -EINVAL; + goto out_err; + } + + if (pci_enable_device(pdev)) { + ret = -EFAULT; + goto out_err; + } + + if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) { + if ((pci_set_dma_mask(pdev, DMA_BIT_MASK(32)))) { + dev_err(&pdev->dev, "No usable DMA configuration\n"); + ret = -EFAULT; + goto out_err_disable; + } else { + pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)); + } + } else { + pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)); + } + + if (pci_request_regions(pdev, ZSDA_VF_DEVICE_NAME)) { + ret = -EFAULT; + goto out_err_disable; + } + + ret = zsda_map_pci_bars(accel_dev); + if (unlikely(ret)) + goto out_err_free_reg; + + pci_set_master(pdev); + if(zsda_dev_int(accel_dev)) + return ret; + + ret = zsda_request_irqs(accel_dev); + if (unlikely(ret)) + goto out_err_dev_release; + + set_bit(ZSDA_STATUS_STARTED, &accel_dev->status); + accel_dev->lkcf_en = true; + zsda_lkcf_register(); + return ret; + +out_err_dev_release: + zsda_release_qps(accel_dev); +out_err_free_reg: + pci_release_regions(accel_pci_dev->pci_dev); +out_err_disable: + pci_disable_device(accel_pci_dev->pci_dev); +out_err: + zsda_vf_cleanup_accel(accel_dev); + kfree(accel_dev); + return ret; +} + +static void zsda_vf_remove(struct pci_dev *pdev) +{ + struct accel_dev *accel_dev = acc_devmgr_pci_to_accel_dev(pdev); + + if (!accel_dev) { + pr_err("ZSDA: Driver removal failed vf\n"); + return; + } + zsda_release_qps(accel_dev); + if(test_bit(ZSDA_STATUS_IRQ_ALLOCATED, &accel_dev->status)){ + zsda_free_irqs(accel_dev); + clear_bit(ZSDA_STATUS_IRQ_ALLOCATED, &accel_dev->status); + } + zsda_vf_cleanup_accel(accel_dev); + zsda_vf_cleanup_pci_dev(accel_dev); + kfree(accel_dev); + zsda_lkcf_unregister(); +} + +static int __init zsda_vfdrv_init(void) +{ + request_module("zsda_common"); + + if (pci_register_driver(&zsda_vf_driver)) { + pr_err("ZSDA: Driver initialization failed\n"); + return -EFAULT; + } + return 0; +} + +static void __exit zsda_vfdrv_release(void) +{ + pci_unregister_driver(&zsda_vf_driver); +} + +module_init(zsda_vfdrv_init); +module_exit(zsda_vfdrv_release); + +MODULE_AUTHOR("ZTE"); +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_DESCRIPTION("ZTE ACC ZSDA VF"); +MODULE_VERSION(ZSDA_DRV_VERSION); diff --git a/src/crypto/zsda/include/acc_addr.h b/src/crypto/zsda/include/acc_addr.h new file mode 100644 index 0000000..c1f97d2 --- /dev/null +++ b/src/crypto/zsda/include/acc_addr.h @@ -0,0 +1,80 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright(c) 2024 ZTE Corporation */ + +#define VALID 0x1 +#define INVALID 0x0 + +#define Q_STOP 0x0 +#define Q_START 0x1 + +#define MASK 0x1 +#define NOMASK 0x0 + +#define ZSDA_BAR0 0x0 +#define ADMIN_RETRY_TIMES 500 + +#define ZSDA_ADMIN_WQ(i) (0x40 + ((i) * 0x04)) +#define ZSDA_ADMIN_WQ_BASE7 0x5C +#define ZSDA_ADMIN_CQ(i) (0x60 + ((i) * 0x04)) +#define ZSDA_ADMIN_CQ_BASE7 0x7C +#define ZSDA_ADMIN_WQ_TAIL 0x80 +#define ZSDA_ADMIN_CQ_HEAD 0x84 +#define ZSDA_ADMIN_Q_START 0x100 +#define ADMIN_BUF_DATA_LEN 0x1C +#define ADMIN_BUF_TOTAL_LEN 0x20 + +#define ZSDA_IO_QUE_INT_MASK_0 0x180 +#define ZSDA_IO_QUE_INT_MASK_1 0x184 +#define ZSDA_IO_QUE_INT_MASK_2 0x188 +#define ZSDA_IO_QUE_INT_MASK_3 0x18c +#define ZSDA_IO_QUE_INT_MASK_4 0x190 +#define ZSDA_IO_QUE_INT_MASK_5 0x194 +#define ZSDA_IO_QUE_INT_MASK_6 0x198 +#define ZSDA_IO_QUE_INT_MASK_7 0x19c +#define ZSDA_IO_QUE_INT_MASK_8 0x1a0 +#define ZSDA_IO_Q_START(i) (0x200 + ((i) * 0x04)) +#define ZSDA_IO_Q_STOP(i) (0x200 + ((i) * 0x04)) +#define ZSDA_IO_Q_STOP_RESP(i) (0x400 + ((i) * 0x04)) +#define ZSDA_IO_Q_CLR(i) (0x600 + ((i) * 0x04)) +#define ZSDA_IO_Q_CLR_RESP(i) (0x800 + ((i) * 0x04)) + +#define ZSDA_WQ_TAIL 0x1800 +#define ZSDA_CQ_HEAD 0x1804 +#define ZSDA_QUE_DB_INIT(i) (0x1c00 + ((i) * 0x04)) +#define ZSDA_WQ_LBASE 0x1000 +#define ZSDA_WQ_UBASE 0x1004 +#define ZSDA_CQ_LBASE 0x1400 +#define ZSDA_CQ_UBASE 0x1404 + +#define ZSDA_REG_WR(base, offset, val) \ +({ \ + __raw_writel(val, (((u8 *)(base)) + (offset))); \ +}) + +#define ZSDA_REG_RD(base, offset) \ +({ \ + __raw_readl((u8 *)(base) + (offset)); \ +}) + +#define ZSDA_WQ_RING_BASE(csr_base_addr, ring, value) \ +do { \ + uint32_t l_base = 0, u_base = 0; \ + l_base = (uint32_t)(value & 0xFFFFFFFF); \ + u_base = (uint32_t)((value & 0xFFFFFFFF00000000ULL) >> 32); \ + ZSDA_REG_WR(csr_base_addr, (ring<<3) + ZSDA_WQ_LBASE, l_base); \ + ZSDA_REG_WR(csr_base_addr, (ring<<3) + ZSDA_WQ_UBASE, u_base); \ +} while (0) + +#define ZSDA_CQ_RING_BASE(csr_base_addr, ring, value) \ +do { \ + uint32_t l_base = 0, u_base = 0; \ + l_base = (uint32_t)(value & 0xFFFFFFFF); \ + u_base = (uint32_t)((value & 0xFFFFFFFF00000000ULL) >> 32); \ + ZSDA_REG_WR(csr_base_addr, (ring<<3) + ZSDA_CQ_LBASE, l_base); \ + ZSDA_REG_WR(csr_base_addr, (ring<<3) + ZSDA_CQ_UBASE, u_base); \ +} while (0) + +#define WRITE_WQ_TAIL(csr_base_addr, ring, value) \ + ZSDA_REG_WR(csr_base_addr, ZSDA_WQ_TAIL + (ring << 3), value) +#define WRITE_CQ_HEAD(csr_base_addr, ring, value) \ + ZSDA_REG_WR(csr_base_addr, ZSDA_CQ_HEAD + (ring << 3), value) diff --git a/src/crypto/zsda/include/acc_dev.h b/src/crypto/zsda/include/acc_dev.h new file mode 100644 index 0000000..89f46c0 --- /dev/null +++ b/src/crypto/zsda/include/acc_dev.h @@ -0,0 +1,60 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright(c) 2024 ZTE Corporation */ +#ifndef ACC_DEV_H +#define ACC_DEV_H + +#include + +#define ZSDA_PCI_MAX_BARS 3 +#define ZSDA_DEVICE_NAME_LENGTH 32 +#define ZSDA_INTR_NAME_LENGTH 32 +#define ACC_DEVICE_NAME_PREFIX "acc_" +#define ZSDA_PF_DEVICE_NAME "zsda_pf" +#define ZSDA_VF_DEVICE_NAME "zsda_vf" + +struct acc_bar { + resource_size_t base_addr; + void __iomem *virt_addr; + resource_size_t size; +} __packed; + +struct accel_msix { + struct msix_entry *entries; + u32 num_entries; +} __packed; + +struct accel_pci { + struct pci_dev *pci_dev; + struct accel_msix msix_entries; + struct acc_bar pci_bars[ZSDA_PCI_MAX_BARS]; + +} __packed; + +struct zsda_dbg { + uint64_t encry_enq; + uint64_t encry_deq; + uint64_t decry_enq; + uint64_t decry_deq; +}; + +struct accel_dev { + struct list_head list; + struct device_hw_data *hw_data; + struct device_cfg_data *cfg; + struct accel_pci accel_pci_dev; + struct module *owner; + bool is_vf; + bool lkcf_en; + u32 accel_id; + unsigned long status; + atomic_t lkcf_ref; + struct dentry *debugfs_dir; + struct tasklet_struct encry_task; + struct tasklet_struct decry_task; + char name[ZSDA_DEVICE_NAME_LENGTH]; + struct zsda_dbg zsda_dbg; +}; + +#define GET_DEV(accel_dev) ((accel_dev)->accel_pci_dev.pci_dev->dev) + +#endif diff --git a/src/crypto/zsda/include/acc_version.h b/src/crypto/zsda/include/acc_version.h new file mode 100644 index 0000000..78e07a1 --- /dev/null +++ b/src/crypto/zsda/include/acc_version.h @@ -0,0 +1,26 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright(c) 2024 ZTE Corporation */ +#ifndef ACC_VERSION_H +#define ACC_VERSION_H + +#include +#include + +#define ZSDA_MAJOR_VERSION 4 +#define ZSDA_MINOR_VERSION 8 +#define ZSDA_BUILD_VERSION 0 +#define ZSDA_DRV_VERSION \ + __stringify(ZSDA_MAJOR_VERSION) "." __stringify( \ + ZSDA_MINOR_VERSION) "." __stringify(ZSDA_BUILD_VERSION) + +#if (KERNEL_VERSION(3, 2, 0) > LINUX_VERSION_CODE) +#define iommu_present(b) iommu_found() +#endif /* 3.2.0 */ + +#if (KERNEL_VERSION(5, 18, 0) <= LINUX_VERSION_CODE) +#define pci_set_dma_mask(pdev, mask) dma_set_mask(&(pdev)->dev, mask) +#define pci_set_consistent_dma_mask(pdev, mask) \ + dma_set_coherent_mask(&(pdev)->dev, mask) +#endif + +#endif diff --git a/src/net/Kconfig b/src/net/Kconfig new file mode 100755 index 0000000..0f115fe --- /dev/null +++ b/src/net/Kconfig @@ -0,0 +1 @@ +source "drivers/net/ethernet/dinghai" \ No newline at end of file diff --git a/src/net/Makefile b/src/net/Makefile new file mode 100755 index 0000000..c7829d2 --- /dev/null +++ b/src/net/Makefile @@ -0,0 +1,7 @@ +EXTRA_CFLAGS += -I$(CWD)/include +EXTRA_CFLAGS += -I$(CWD)/drivers/net/ethernet/dinghai/zf_mpf/epc + +subdir-ccflags-y += -include $(CWD)/autoconf.h +obj-$(CONFIG_DINGHAI_ETH) += drivers/net/ethernet/dinghai/ +obj-$(CONFIG_ZXDH_AUXILIARY) += drivers/base/ +obj-m += drivers/pcie/zxdh_pcie/ \ No newline at end of file diff --git a/src/net/README.MD b/src/net/README.MD new file mode 100644 index 0000000..7c31da7 --- /dev/null +++ b/src/net/README.MD @@ -0,0 +1,156 @@ +# 源码编译驱动 +## build +cd ./build +./build.pl -t kernel -m CONFIG_DINGHAI_ETH -m CONFIG_ZXDH_AUXILIARY -m CONFIG_DINGHAI_PF -m CONFIG_ZXDH_SF -m CONFIG_DINGHAI_EN_AUX -m HAVE_DEVLINK_ALLOC_GET_1_PARAMS -m HAVE_DEV_PM_DOMAIN_ATTACH -m HAVE_BUS_FIND_DEVICE_GET_CONST -m CONFIG_DINGHAI_DH_CMD -m CONFIG_DINGHAI_NP -m CONFIG_ZXDH_MSGQ -m CONFIG_ZXDH_1588 -m CONFIG_DINGHAI_PTP -m CONFIG_DINGHAI_TSN + +## build clean +cd ./build +./build.pl -t clean + +## 说明 +1. If you want to add/delete a compilation option or macro definition, add/delete the corresponding " -m ***" parameter. +2. You can also use the "build.sh" compilation script under the root directory of the source code: ./build.sh + +3. If you are using ZF server or your architecture is aarch64, and you want to compile the mpf.ko driver to run on ZF. +./build.pl -t kernel -m CONFIG_DINGHAI_ETH -m CONFIG_ZXDH_AUXILIARY -m CONFIG_DINGHAI_PF -m CONFIG_ZXDH_SF -m CONFIG_DINGHAI_EN_AUX -m HAVE_DEVLINK_ALLOC_GET_1_PARAMS -m HAVE_DEV_PM_DOMAIN_ATTACH -m HAVE_BUS_FIND_DEVICE_GET_CONST -m CONFIG_DINGHAI_DH_CMD -m CONFIG_DINGHAI_NP -m CONFIG_DINGHAI_ZF_MPF -m PCIE_ZF_EPC_OPEN + +4. **Note: CONFIG_DINGHAI_ZF_MPF is used for the ZF platform(aarch64), CONFIG_DINGHAI_MPF is used for the x86_64 platform, and the two cannot be used at the same time.** + +5. If you want to test 1588, you need to add the compile option CONFIG_ZXDH_1588 and open macro TIME_STAMP_1588, otherwise do not add the compile option CONFIG_ZXDH_1588. +example, +./build.pl -t kernel -m CONFIG_DINGHAI_ETH -m CONFIG_ZXDH_AUXILIARY -m CONFIG_DINGHAI_PF -m CONFIG_ZXDH_SF -m CONFIG_DINGHAI_EN_AUX -m HAVE_DEVLINK_ALLOC_GET_1_PARAMS -m HAVE_DEV_PM_DOMAIN_ATTACH -m HAVE_BUS_FIND_DEVICE_GET_CONST -m CONFIG_DINGHAI_DH_CMD -m CONFIG_DINGHAI_NP -m CONFIG_ZXDH_MSGQ -m CONFIG_ZXDH_1588 -m CONFIG_DINGHAI_PTP -m CONFIG_DINGHAI_TSN + +6. ## Modify the queue pairs +If you want to modify the queue pairs, you should add the "max_pairs=*" parameter after "insmod zxdh_en_aux.ko". If you do not add the "max_pairs=*" parameter after "insmod zxdh_en_aux.ko", the default queue pairs in the driver are used for initialization. For example: +insmod zxdh_en_aux.ko max_pairs=16 + +7. If you want to test Hot-Plug PF(hpf), you need to add the compile option CONFIG_DINGHAI_HPF. For example: +./build.pl -t kernel -m CONFIG_DINGHAI_ETH -m HAVE_DEVLINK_ALLOC_GET_1_PARAMS -m CONFIG_DINGHAI_DH_CMD -m CONFIG_DINGHAI_HPF + +8. rpm包相关 +## Compile and Install driver module +``` +cd ./build +./build.pl -t {all|install} -m CONFIG_DINGHAI_ETH -m CONFIG_ZXDH_AUXILIARY -m CONFIG_DINGHAI_PF -m CONFIG_ZXDH_SF -m CONFIG_DINGHAI_EN_AUX -m HAVE_DEVLINK_ALLOC_GET_1_PARAMS -m HAVE_DEV_PM_DOMAIN_ATTACH -m HAVE_BUS_FIND_DEVICE_GET_CONST -m CONFIG_DINGHAI_DH_CMD -m CONFIG_DINGHAI_NP +``` +- These drivers will be compiled and they will not only appear in the local directory, but also be copied to **/lib/modules/\/updates/drivers/net/ethernet/zte/zxdh/** +- The install location listed above is the default location. This may differ for various Linux distributions. +- now you can not only use `insmod` to load these drivers, but you can also use `modprobe` in any directory. `modprobe` will automatically analyze the dependencies between these drivers. eg: +``` bash +# register driver to kernel +modprobe zxdh_pf +# unregister driver from kernel +modprobe -r zxdh_pf +``` +- Use modinfo to view some information about the driver, such as version number, etc. eg: +``` bash +modinfo zxdh_en_aux +``` +- **Note:** When your compilation target is `./build.pl -t all` or `./build.pl -t install`, these drivers will be automatically loaded when the host is reset or restarted. Therefore, you must ensure that your drivers do not have bugs that cause the kernel to hang. Otherwise, they will be loaded every time the kernel is reset. Automatically load your problematic driver so that the host cannot be reset normally. + +## Uninstall driver module +``` bash +cd ./build +./build.pl -t uninstall +``` +- When your compilation target is `./build.pl -t uninstall`. After this, the host will not automatically load your driver after reset. + +## cross compile +If you want to use source code to cross-compile, for example, the host is the x86_64 platform and the target is the aarch64 platform, you need to add 3 additional parameters. +``` shell +./build.pl -t kernel -m CONFIG_DINGHAI_ETH -m CONFIG_ZXDH_AUXILIARY -m CONFIG_DINGHAI_PF -m CONFIG_DINGHAI_ZF_MPF -m CONFIG_ZXDH_SF -m CONFIG_DINGHAI_EN_AUX -m HAVE_DEVLINK_ALLOC_GET_1_PARAMS -m HAVE_DEV_PM_DOMAIN_ATTACH -m HAVE_BUS_FIND_DEVICE_GET_CONST -m CONFIG_DINGHAI_DH_CMD -m CONFIG_DINGHAI_NP --ksrc /path/kernel/source --cross_compile /path/cross/compile/tools/aarch64-pc-linux-gnu- --target_arch aarch64 +``` +- --ksrc kernel source path +- --cross_compile cross compile tools path +- --target_arch target arch + +If you want to delete the compiled product, use the following script +``` shell +./build.pl -t clean --ksrc /path/kernel/source --cross_compile /path/cross/compile/tools/aarch64-pc-linux-gnu- --target_arch aarch64 +``` +*** +# 生成驱动`RPM`包 +目前生成rpm包的脚本文件有3个, 分别是 +- `zxdh_eth_rpm_build.sh` +- `zxdh_mpf_rpm_build.sh` +- `zxdh_zf_mpf_rpm_build.sh` + +输入下面命令查看脚本文件参数用法 +``` shell +zxdh_eth_rpm_build.sh -h +zxdh_mpf_rpm_build.sh -h +zxdh_zf_mpf_rpm_build.sh -h +``` +## `zxdh_eth_rpm_build.sh`脚本 +该脚本支持交叉编译, 和使用不同内核源码编译, 具体参数见`zxdh_eth_rpm_build.sh -h` +该脚本用于生成2个rpm包 +- zxdh-eth-*****.rpm +- zxdh-smartnic-config-*******.rpm + +其中`zxdh-eth-****.rpm`包里包含的驱动ko,具体如下: +- `zxdh_cmd.ko` +- `zxdh_np.ko` +- `zxdh_pf.ko` +- `zxdh_en_aux.ko` +- `zxdh_auxiliary.ko`(内核是否支持`auxiliary`总线,都会生成该驱动) + +其中`zxdh-smartnic-config-*******.rpm`包里包含配置文件 +- `dpu_init.cfg`或者`smart-nic_init.cfg` + +## `zxdh_mpf_rpm_build.sh`脚本 +该脚本支持交叉编译, 和使用不同内核源码编译, 具体参数见`zxdh_mpf_rpm_build.sh -h` +该脚本用于生成1个rpm包 +- zxdh-mpf-*****.rpm + +其中`zxdh-mpf-*****.rpm`包里包含的驱动ko,具体如下: +- `zxdh_cmd.ko` +- `zxdh_np.ko` +- `zxdh_mpf.ko` +- `zxdh_auxiliary.ko`(内核是否支持`auxiliary`总线,都会生成该驱动) + +## `zxdh_zf_mpf_rpm_build.sh`脚本 +该脚本支持交叉编译, 但是目标架构必须是`aarch64`, 和使用不同内核源码编译, 具体参数见`zxdh_zf_mpf_rpm_build.sh -h` +该脚本用于生成1个rpm包 +- zxdh-zf-mpf-*****.rpm + +其中`zxdh-zf-mpf-*****.rpm`包里包含的驱动ko,具体如下: +- `zxdh_cmd.ko` +- `zxdh_zf_mpf.ko` + + +## rpm包命名格式 +<软件名称> - <软件版本信息> - <发布次数> - - <硬件架构平台>.rpm +- 这些变量在3个脚本中都有默认值,根据需要可进行修改 +- `zxdh-smartnic-config-1.0-1.rpm`是配置文件包,没有带 和<硬件架构平台> + + +## 交叉编译 +交叉编译生成rpm包,需要提供额外的编译参数,需要提供的额外参数如下: +- --ksrc 目标架构的内核源码路径 +- --cross-compile 交叉编译工具链路径 +- --target-arch 目标架构类型(脚本`zxdh_zf_mpf_rpm_build.sh`没有该参数) + +# rpm安装zxdh_kernel包使用方法 + +## 安装rpm包 +``` shell +rpm -ivh zxdh-eth.XXXXXXX.rpm +``` +## 卸载rpm包 +``` shell +rpm -evh zxdh-eth.XXXXXXX.rpm +``` + +## 安装驱动 +``` shell +modprobe zxdh_en_aux +``` + +## 卸载驱动 +``` shell +modprobe -r zxdh_en_aux +``` + +## 开机自动加载zxdh_en_aux驱动 +- 在`/etc/rc.d/rc.local`文件下新增一行 `modprobe zxdh_en_aux` +- 如果该文件没有可执行权限,使用`chmod a+x /etc/rc.d/rc.local` diff --git a/src/net/build.sh b/src/net/build.sh new file mode 100755 index 0000000..3ff31dc --- /dev/null +++ b/src/net/build.sh @@ -0,0 +1,63 @@ +#!/bin/bash + +path=$(pwd) + +# 定义函数 +unload_drivers() { + echo "卸载驱动" + rmmod zxdh_en_aux + rmmod zxdh_pf + rmmod zxdh_tsn + rmmod zxdh_ptp + rmmod zxdh_np + rmmod zxdh_cmd + rmmod zxdh_auxiliary +} + +compile_zxdh_kernel() { + echo "编译zxdh_kernel" + cd $path/build + ./build.pl -t clean + ./build.pl -t kernel -m CONFIG_DINGHAI_ETH -m CONFIG_ZXDH_AUXILIARY -m CONFIG_DINGHAI_PF -m CONFIG_ZXDH_SF \ + -m CONFIG_DINGHAI_EN_AUX -m HAVE_DEVLINK_ALLOC_GET_1_PARAMS -m HAVE_DEV_PM_DOMAIN_ATTACH \ + -m HAVE_BUS_FIND_DEVICE_GET_CONST -m CONFIG_DINGHAI_DH_CMD -m CONFIG_DINGHAI_NP \ + -m CONFIG_ZXDH_MSGQ -m CONFIG_ZXDH_1588 -m CONFIG_DINGHAI_PTP -m CONFIG_DINGHAI_TSN +} + +load_zxdh_kernel() { + echo "加载zxdh_kernel" + cd $path/drivers + insmod base/zxdh_auxiliary.ko + insmod net/ethernet/dinghai/zxdh_cmd.ko + insmod net/ethernet/dinghai/zxdh_np.ko + insmod net/ethernet/dinghai/zxdh_ptp.ko + insmod net/ethernet/dinghai/zxdh_tsn.ko + insmod net/ethernet/dinghai/zxdh_pf.ko + insmod net/ethernet/dinghai/zxdh_en_aux.ko +} + +# 主逻辑 +command="$1" +case "$command" in + r) unload_drivers ;; + m) compile_zxdh_kernel ;; + i) load_zxdh_kernel ;; + a) + unload_drivers + compile_zxdh_kernel + load_zxdh_kernel + ;; + *) + echo "用法:" + echo "m 编译" + echo "i 加载ko" + echo "r 移除ko" + echo "a = r + m + i" + ;; +esac + +# 检查最后一个命令的退出状态 +if [ $? -ne 0 ]; then + echo "错误:上一个命令失败!" + exit 1 +fi diff --git a/src/net/build/Makefile b/src/net/build/Makefile new file mode 100755 index 0000000..b32d748 --- /dev/null +++ b/src/net/build/Makefile @@ -0,0 +1,133 @@ +CONFIG_MK ?= $(wildcard config.mk) +ifeq (${CONFIG_MK},) + $(error Cannot find config.mk build rules) +else + include ${CONFIG_MK} +endif + +# Check that kernel version is at least 2.6.0, since we don't support 2.4.x +# kernels with the driver. We can't use minimum_kver_check since SLES 10 +# SP4's Make has a bug which causes $(eval) inside an ifeq conditional to error +# out. This was fixed in Make 3.81, but SLES 10 SP4 does not have a fix for +# this yet. +ifeq (0,$(shell [ ${KVER_CODE} -lt $(call get_kvercode,2,6,0) ]; echo "$?")) + $(warning *** Aborting the build.) + $(error This driver is not supported on kernel versions older than 2.6.0) +endif + +# Command to update initramfs or display a warning message +ifeq (${cmd_initrd},) +define cmd_initramfs +@echo "Unable to update initramfs. You may need to do this manually." +endef +else +define cmd_initramfs +@echo "Updating initramfs..." +-@$(call cmd_initrd) +endef +endif + +# Command to update udev rules or display a warning message +ifeq (${cmd_udevadm},) +define cmd_udevrules +@echo "Unable to reload udev rules in-memory representation. You may need to do this manually." +endef +else +define cmd_udevrules +@echo "Reloading udev rules in-memory representation..." +-@$(call cmd_udevadm) +endef +endif + + +DRIVER := zxdh +autoconf_h := $(CWD)/autoconf.h +ZXDH_EN_AUX_UDEV_RULE := 80-zxdh_en_aux-drivers + +LINUXINCLUDE=\ + -D__KERNEL__ \ + CFLAGS += -include $(autoconf_h) + +zxdh_en_aux_udev_rule_file: + @echo 'ACTION!="add", GOTO="drivers_end"' > ${ZXDH_EN_AUX_UDEV_RULE}.rules + @echo 'ENV{MODALIAS}=="zxdh_auxiliary:zxdh_pf.en_aux", RUN{builtin}+="kmod load zxdh_en_aux"' >> ${ZXDH_EN_AUX_UDEV_RULE}.rules + @echo 'LABEL="drivers_end"' >> ${ZXDH_EN_AUX_UDEV_RULE}.rules + + +zxdh_en_aux_udev_rule_install: zxdh_en_aux_udev_rule_file + @echo "Add zxdh_en_aux driver udev rule..." + @install -D -m 644 ${ZXDH_EN_AUX_UDEV_RULE}.rules ${INSTALL_MOD_PATH}${UDEV_RULES_DIR}/${ZXDH_EN_AUX_UDEV_RULE}.rules + $(call cmd_udevrules) + + + +zxdh_en_aux_udev_rule_uninstall: + @if [ -e ${ZXDH_EN_AUX_UDEV_RULE}.rules ] ; then \ + rm -f ${ZXDH_EN_AUX_UDEV_RULE}.rules ; \ + fi; + @if [ -e ${INSTALL_MOD_PATH}${UDEV_RULES_DIR}/${ZXDH_EN_AUX_UDEV_RULE}.rules ] ; then \ + rm -f ${INSTALL_MOD_PATH}${UDEV_RULES_DIR}/${ZXDH_EN_AUX_UDEV_RULE}.rules ; \ + fi; + $(call cmd_udevrules) + +################### +# Build kernel # +################## +kernel: + @echo "Building kernel modules..." + +$(call kernelbuild,modules) + +################### +# Install kernel # +################### +modules_install: + @echo "Installing kernel modules..." + +$(call kernelbuild, modules_install) + +############################## +# Build and install kernel # +############################## +all: kernel modules_install zxdh_en_aux_udev_rule_install + @echo "Running depmod..." + $(call cmd_depmod) + $(call cmd_initramfs) + +install: all + +############################# +# Delete module(s) binaries # +############################# +clean: + +$(call kernelbuild, clean) + -$(RM) -rf $(CWD)/autoconf.h + +############################## +# Uninstall kernel module(s) # +############################## +modules_uninstall: + rm -rf ${INSTALL_MOD_PATH}/lib/modules/${KVER}/${INSTALL_MOD_DIR} + +uninstall: clean modules_uninstall zxdh_en_aux_udev_rule_uninstall + $(call cmd_depmod) + $(call cmd_initramfs) + + +help: + @echo 'Building external (out-of-tree) modules:' + @echo ' all - default target, build and install the module(s) and update initramfs' + @echo ' kernel - build the module(s)' + @echo ' modules_install - install kernel module(s) under $(INSTALL_MOD_PATH)/lib/modules/$(KVER)/$(INSTALL_MOD_DIR)' + @echo ' install - build and install the module(s) and update initramfs' + @echo ' install modules(s) under $(INSTALL_MOD_PATH)/lib/modules/$(KVER)/$(INSTALL_MOD_DIR)' + @echo ' clean - remove generated files' + @echo ' modules_uninstall - uninstall kernel module(s) under $(INSTALL_MOD_PATH)/lib/modules/$(KVER)/$(INSTALL_MOD_DIR)' + @echo ' uninstall - remove generated files and uninstall the module(s) and update initramfs' + @echo 'Command-line option:' + @echo ' KSRC= - Path to kernel source (defaults to running kernel)' + @echo ' INSTALL_MOD_PATH= - Prefix added to default module(s) installation path' + @echo ' ($(INSTALL_MOD_PATH)/lib/modules/$(KVER)/)' + @echo ' INSTALL_MOD_DIR= - Install module(s) in subdirectory other than default' + @echo ' (.../updates/drivers/net/ethernet/ZTE/${DRIVER})' + @echo '' + +.PHONY: all kernel modules_install install clean modules_uninstall uninstall diff --git a/src/net/build/build.pl b/src/net/build/build.pl new file mode 100755 index 0000000..42bd197 --- /dev/null +++ b/src/net/build/build.pl @@ -0,0 +1,71 @@ +#!/usr/bin/perl + +use strict; +use File::Basename; +use File::Path; +use File::Find; +use File::Copy; +use File::Glob qw/:bsd_glob/; +use File::Temp; +use Cwd; +use Term::ANSIColor qw(:constants); +use Data::Dumper; +use Scalar::Util 'reftype'; + +my $CWD = getcwd; + +my $compile_arg = ""; +my $num_cores = scalar(`cat /proc/cpuinfo | grep -c '^processor'`); +$num_cores -= 1 unless $num_cores == 1; +my $autoconf_h = $CWD.'/../autoconf.h'; +my $target_name; +my $auto_config= ""; +my $ksrc = ""; +my $cross_compile = ""; +my $target_arch = ""; +my $driver_version = ""; +print $autoconf_h."\n"; + +while ( $#ARGV >= 0 ) { + my $cmd_flag = shift(@ARGV); + if ( $cmd_flag eq "-t") { + $target_name = shift(@ARGV); + $compile_arg = $compile_arg." ".$target_name; + } elsif ( $cmd_flag eq "-m" ) { + my $mod = shift(@ARGV); + $auto_config = $auto_config."\n"."#define ".$mod." 1"; + $compile_arg = $compile_arg." ".$mod."=m"; + } elsif ( $cmd_flag eq "-y" ) { + my $mod = shift(@ARGV); + $auto_config = $auto_config."\n"."#define ".$mod." 2"; + $compile_arg = $compile_arg." ".$mod."=y"; + } elsif ( $cmd_flag eq "--dri_ver" ) { + my $mod = shift(@ARGV); + $compile_arg = $compile_arg." CONFIG_DRIVER_VERSION=".$mod; + } elsif ( $cmd_flag eq "--ksrc" ) { + $ksrc = shift(@ARGV); + $compile_arg = $compile_arg." "."KSRC=".$ksrc; + } elsif ( $cmd_flag eq "--cross_compile" ) { + $cross_compile = shift(@ARGV); + $compile_arg = $compile_arg." "."CROSS_COMPILE=".$cross_compile; + } elsif ( $cmd_flag eq "--target_arch" ) { + $target_arch = shift(@ARGV); + $compile_arg = $compile_arg." "."TARGET_ARCH=".$target_arch; + } elsif ( $cmd_flag eq "-j" ) { + $num_cores = shift(@ARGV); + } elsif ( $cmd_flag eq "--help" or $cmd_flag eq "-h" ) { + usage(); + exit 0; + } +} + +system("cat >$autoconf_h</dev/null ] && \ + [ "${2}" -ge 0 -a "${2}" -le 255 2>/dev/null ] && \ + [ "${3}" -ge 0 -a "${3}" -le 255 2>/dev/null ] && \ + printf %d $$(( ( ${1} << 16 ) + ( ${2} << 8 ) + ( ${3} ) )) ) + +################ +# depmod Macro # +################ + +cmd_depmod = /sbin/depmod $(if ${SYSTEM_MAP_FILE},-e -F ${SYSTEM_MAP_FILE}) \ + $(if $(strip ${INSTALL_MOD_PATH}),-b ${INSTALL_MOD_PATH}) \ + -a ${KVER} + +################ +# dracut Macro # +################ + +cmd_initrd := $(shell \ + if which dracut > /dev/null 2>&1 ; then \ + echo "dracut --force"; \ + elif which update-initramfs > /dev/null 2>&1 ; then \ + echo "update-initramfs -u"; \ + fi ) + +################# +# udevadm Macro # +################# + +cmd_udevadm := $(shell \ + if which udevadm > /dev/null 2>&1 ; then \ + echo "udevadm control --reload"; \ + fi ) + + +##################### +# Environment tests # +##################### + +DRIVER_UPPERCASE := $(shell echo ${DRIVER} | tr "[:lower:]" "[:upper:]") + +ifeq (,${BUILD_KERNEL}) +BUILD_KERNEL=$(shell uname -r) +endif + +# Kernel Search Path +# All the places we look for kernel source +KSP := /lib/modules/${BUILD_KERNEL}/source \ + /lib/modules/${BUILD_KERNEL}/build \ + /usr/src/linux-${BUILD_KERNEL} \ + /usr/src/linux-$(${BUILD_KERNEL} | sed 's/-.*//') \ + /usr/src/kernel-headers-${BUILD_KERNEL} \ + /usr/src/kernel-source-${BUILD_KERNEL} \ + /usr/src/linux-$(${BUILD_KERNEL} | sed 's/\([0-9]*\.[0-9]*\)\..*/\1/') \ + /usr/src/linux \ + /usr/src/kernels/${BUILD_KERNEL} \ + /usr/src/kernels + +# prune the list down to only values that exist and have an include/linux +# sub-directory. We can't use include/config because some older kernels don't +# have this. +test_dir = $(shell [ -e ${dir}/include/linux ] && echo ${dir}) +KSP := $(foreach dir, ${KSP}, ${test_dir}) + +# we will use this first valid entry in the search path +ifeq (,${KSRC}) + KSRC := $(firstword ${KSP}) +endif + +ifeq (,${KSRC}) + $(warning *** Kernel header files not in any of the expected locations.) + $(warning *** Install the appropriate kernel development package, e.g.) + $(error kernel-devel, for building kernel modules and try again) +else +ifeq (/lib/modules/${BUILD_KERNEL}/source, ${KSRC}) + KOBJ := /lib/modules/${BUILD_KERNEL}/build +else + KOBJ := ${KSRC} +endif +endif + +SCRIPT_PATH := ${KSRC}/scripts +info_signed_modules = + +ifeq (,${SCRIPT_PATH}) + info_signed_modules += echo "*** Could not find sign-file script. Cannot sign driver." ; +else + SIGN_FILE_EXISTS := $(or $(and $(wildcard $(SCRIPT_PATH)/sign-file),1),) + PRIV_KEY_EXISTS := $(or $(and $(wildcard zte-linux-key.key),1),) + PUB_KEY_EXISTS := $(or $(and $(wildcard zte-linux-key.crt),1),) +ifneq ($(and $(SIGN_FILE_EXISTS),$(PRIV_KEY_EXISTS),$(PUB_KEY_EXISTS)),) + info_signed_modules += \ + echo "*** Is sign-file present: ${SIGN_FILE_EXISTS}" ; \ + echo "*** Is private key present: ${PRIV_KEY_EXISTS}" ; \ + echo "*** Is public key present: ${PUB_KEY_EXISTS}" ; + info_signed_modules += echo "*** All files are present, signing driver." ; + #sign_driver = $(shell ${SCRIPT_PATH}/sign-file sha256 zte-linux-key.key \ + zte-linux-key.crt ${DRIVER}.ko) +else + info_signed_modules += echo "*** Files are missing, cannot sign driver." ; + sign_driver = +endif +endif + +# Version file Search Path +VSP := ${KOBJ}/include/generated/utsrelease.h \ + ${KOBJ}/include/linux/utsrelease.h \ + ${KOBJ}/include/linux/version.h \ + ${KOBJ}/include/generated/uapi/linux/version.h \ + /boot/vmlinuz.version.h + +# Config file Search Path +CSP := ${KOBJ}/include/generated/autoconf.h \ + ${KOBJ}/include/linux/autoconf.h \ + /boot/vmlinuz.autoconf.h + +# System.map Search Path (for depmod) +MSP := ${KSRC}/System.map \ + /usr/lib/debug/boot/System.map-${BUILD_KERNEL} \ + /boot/System.map-${BUILD_KERNEL} + +# prune the lists down to only files that exist +test_file = $(shell [ -f ${1} ] && echo ${1}) +VSP := $(foreach file, ${VSP}, $(call test_file,${file})) +CSP := $(foreach file, ${CSP}, $(call test_file,${file})) +MSP := $(foreach file, ${MSP}, $(call test_file,${file})) + + +# and use the first valid entry in the Search Paths +ifeq (,${VERSION_FILE}) + VERSION_FILE := $(firstword ${VSP}) +endif + +ifeq (,${CONFIG_FILE}) + CONFIG_FILE := $(firstword ${CSP}) +endif + +ifeq (,${SYSTEM_MAP_FILE}) + SYSTEM_MAP_FILE := $(firstword ${MSP}) +endif + +ifeq (,$(wildcard ${VERSION_FILE})) + $(error Linux kernel source not configured - missing version header file) +endif + +ifeq (,$(wildcard ${CONFIG_FILE})) + $(error Linux kernel source not configured - missing autoconf.h) +endif + +ifeq (,$(wildcard ${SYSTEM_MAP_FILE})) + $(warning Missing System.map file - depmod will not check for missing symbols during module installation) +endif + +ifneq ($(words $(subst :, ,$(CURDIR))), 1) + $(error Sources directory '$(CURDIR)' cannot contain spaces nor colons. Rename directory or move sources to another path) +endif + +################## +# Udev Rules Dir # +################## + +test_dir = $(shell [ -e ${dir} ] && echo ${dir}) + +UDEV_RULES_DIR := /etc/udev/rules.d/ /usr/lib/udev/rules.d/ +UDEV_RULES_DIR := $(foreach dir, ${UDEV_RULES_DIR}, ${test_dir}) +UDEV_RULES_DIR := $(firstword ${UDEV_RULES_DIR}) +ifeq (, ${UDEV_RULES_DIR}) + UDEV_RULES_DIR := /etc/udev/rules.d/ +endif + + +######################## +# Extract config value # +######################## + +get_config_value = $(shell ${CC} -E -dM ${CONFIG_FILE} 2> /dev/null |\ + grep -m 1 ${1} | awk '{ print $$3 }') + +######################## +# Check module signing # +######################## + +CONFIG_MODULE_SIG_ALL := $(call get_config_value,CONFIG_MODULE_SIG_ALL) +CONFIG_MODULE_SIG_FORCE := $(call get_config_value,CONFIG_MODULE_SIG_FORCE) +CONFIG_MODULE_SIG_KEY := $(call get_config_value,CONFIG_MODULE_SIG_KEY) + +# Signing key search path +SIG_KEY_SP := ${KOBJ}/${CONFIG_MODULE_SIG_KEY} \ + ${KOBJ}/certs/signing_key.pem + +# Get system signing key file path +SIG_KEY_FILE := $(firstword $(foreach file, ${SIG_KEY_SP}, $(call test_file,${file}))) + +# print a warning if the kernel configuration attempts to sign modules but +# the signing key can't be found. +ifneq (${SIG_KEY_FILE},) +warn_signed_modules := : ; +else +warn_signed_modules := +ifeq (${CONFIG_MODULE_SIG_ALL},1) +warn_signed_modules += \ + echo "*** The target kernel has CONFIG_MODULE_SIG_ALL enabled, but" ; \ + echo "*** the signing key cannot be found. Module signing has been" ; \ + echo "*** disabled for this build." ; +endif # CONFIG_MODULE_SIG_ALL=y +ifeq (${CONFIG_MODULE_SIG_FORCE},1) + warn_signed_modules += \ + echo "warning: The target kernel has CONFIG_MODULE_SIG_FORCE enabled," ; \ + echo "warning: but the signing key cannot be found. The module must" ; \ + echo "warning: be signed manually using 'scripts/sign-file'." ; +endif # CONFIG_MODULE_SIG_FORCE +DISABLE_MODULE_SIGNING := Yes +endif + + +# get the kernel version - we use this to find the correct install path +KVER := $(shell ${CC} ${EXTRA_CFLAGS} -E -dM ${VERSION_FILE} | grep UTS_RELEASE | \ + awk '{ print $$3 }' | sed 's/\"//g') + +# assume source symlink is the same as build, otherwise adjust KOBJ +ifneq (,$(wildcard /lib/modules/${KVER}/build)) + ifneq (${KSRC},$(call readlink,/lib/modules/${KVER}/build)) + KOBJ=/lib/modules/${KVER}/build + endif +endif + +# 如果当前用户指定的KSRC不是当前正在运行的内核源码目录, 指定KOBJ和用户传入的KSRC相同 +ifeq (/lib/modules/${BUILD_KERNEL}/source, ${KSRC}) + KOBJ := /lib/modules/${BUILD_KERNEL}/build +else + KOBJ := ${KSRC} +endif + +ifeq (${KVER_CODE},) + KVER_CODE := $(shell ${CC} ${EXTRA_CFLAGS} -E -dM ${VSP} 2> /dev/null |\ + grep -m 1 LINUX_VERSION_CODE | awk '{ print $$3 }' | sed 's/\"//g') +endif + +# minimum_kver_check +# +# helper function to provide uniform output for different drivers to abort the +# build based on kernel version check. Usage: "$(call minimum_kver_check,2,6,XX)". +define _minimum_kver_check +ifeq (0,$(shell [ ${KVER_CODE} -lt $(call get_kvercode,${1},${2},${3}) ]; echo "$$?")) + $$(warning *** Aborting the build.) + $$(error This driver is not supported on kernel versions older than ${1}.${2}.${3}) +endif +endef +minimum_kver_check = $(eval $(call _minimum_kver_check,${1},${2},${3})) + +############################# +# kcompat definitions setup # +############################# + +# In most cases, kcompat flags can be checked within the driver source files +# using simple CPP checks. However, it may be necessary to check for a flag +# value within the Makefile for some specific edge cases. For example, if an +# entire feature ought to be excluded on some kernels due to missing +# functionality. +# +# To support this, kcompat_defs.h is compiled and converted into a word list +# that can be checked to determine whether a given kcompat feature flag will +# be defined for this kernel. +# +# KCOMPAT_DEFINITIONS holds the set of all macros which are defined. Note +# this does include a large number of standard/builtin definitions. +# +# Use is_kcompat_defined as a $(call) function to check whether a given flag +# is defined or undefined. For example: +# +# ifeq ($(call is_kcompat_defined,HAVE_FEATURE_FLAG),1) +# +# ifneq ($(call is_kcompat_defined,HAVE_FEATURE_FLAG),1) +# +# The is_kcompat_defined function returns 1 if the macro name is defined, +# and the empty string otherwise. +# +# There is no mechanism to extract the value of the kcompat definition. +# Supporting this would be non-trivial as Make does not have a map variable +# type. +# +# Note that only the new layout is supported. Legacy definitions in +# kcompat.h are not supported. If you need to check one of these, please +# refactor it into the new layout. + +ifneq ($(wildcard ./kcompat_defs.h),) +KCOMPAT_DEFINITIONS := $(shell ${CC} ${EXTRA_CFLAGS} -E -dM \ + -I${KOBJ}/include \ + -I${KOBJ}/include/generated/uapi \ + kcompat_defs.h | awk '{ print $$2 }') + +is_kcompat_defined = $(if $(filter ${1},${KCOMPAT_DEFINITIONS}),1,) +else +KCOMPAT_DEFINITIONS := +is_kcompat_defined = +endif + +#################### +# CCFLAGS variable # +#################### + +# set correct CCFLAGS variable for kernels older than 2.6.24 +ifeq (0,$(shell [ ${KVER_CODE} -lt $(call get_kvercode,2,6,24) ]; echo $$?)) +CCFLAGS_VAR := EXTRA_CFLAGS +else +CCFLAGS_VAR := ccflags-y +endif + +################# +# KBUILD_OUTPUT # +################# + +# Only set KBUILD_OUTPUT if the real paths of KOBJ and KSRC differ +ifneq ($(call readlink,${KSRC}),$(call readlink,${KOBJ})) +export KBUILD_OUTPUT ?= ${KOBJ} +endif + +############################ +# Module Install Directory # +############################ + +# Default to using updates/drivers/net/ethernet/zte/ path, since depmod since +# v3.1 defaults to checking updates folder first, and only checking kernels/ +# and extra afterwards. We use updates instead of kernel/* due to desire to +# prevent over-writing built-in modules files. +export INSTALL_MOD_DIR ?= updates/drivers/net/ethernet/zte/${DRIVER} + +###################### +# Kernel Build Macro # +###################### + +# kernel build function +# ${1} is the kernel build target +# ${2} may contain any extra rules to pass directly to the sub-make process +# +# This function is expected to be executed by +# @+$(call kernelbuild,,) +# from within a Makefile recipe. +# +# The following variables are expected to be defined for its use: +# GCC_I_SYS -- if set it will enable use of gcc-i-sys.sh wrapper to use -isystem +# CCFLAGS_VAR -- the CCFLAGS variable to set extra CFLAGS +# EXTRA_CFLAGS -- a set of extra CFLAGS to pass into the ccflags-y variable +# KSRC -- the location of the kernel source tree to build against +# DRIVER_UPPERCASE -- the uppercase name of the kernel module, set from DRIVER +# W -- if set, enables the W= kernel warnings options +# C -- if set, enables the C= kernel sparse build options + +CWD := $(shell dirname $(CURDIR)) +ifneq (${TARGET_ARCH}, ) +NEED_CROSS_COMPILE := Yes +ifeq (${TARGET_ARCH}, aarch64) +ARCH := arm64 +endif +endif + +kernelbuild = $(call warn_signed_modules) \ + env CWD=$(CWD) ${MAKE} \ + -C "${KSRC}" M="$(CWD)"\ + CONFIG_DINGHAI_ETH=$(CONFIG_DINGHAI_ETH) \ + CONFIG_DINGHAI_MPF=$(CONFIG_DINGHAI_MPF) \ + CONFIG_DINGHAI_HPF=$(CONFIG_DINGHAI_HPF) \ + CONFIG_DINGHAI_PF=$(CONFIG_DINGHAI_PF) \ + CONFIG_DINGHAI_ZF_MPF=$(CONFIG_DINGHAI_ZF_MPF) \ + $(if ${NEED_CROSS_COMPILE}, ARCH=$(ARCH)) \ + $(if ${NEED_CROSS_COMPILE}, CROSS_COMPILE=$(CROSS_COMPILE)) \ + $(if ${DISABLE_MODULE_SIGNING},CONFIG_MODULE_SIG=n) \ + $(if ${DISABLE_MODULE_SIGNING},CONFIG_MODULE_SIG_ALL=) \ + ${2} ${1} diff --git a/src/net/build/spec/zxdh-eth.spec.example b/src/net/build/spec/zxdh-eth.spec.example new file mode 100644 index 0000000..5a52666 --- /dev/null +++ b/src/net/build/spec/zxdh-eth.spec.example @@ -0,0 +1,530 @@ +%global IS_RHEL_VENDOR "%{_vendor}" == "redhat" || ("%{_vendor}" == "bclinux") || ("%{_vendor}" == "openEuler") + +%{!?_name: %global _name zxdh-eth} +%{!?_version: %global _version 1.0} +%{!?_release: %global _release 1} + +%{!?_config_name: %global _config_name zxdh-smartnic-config} +%{!?_config_version: %global _config_version 1.0} +%{!?_config_release: %global _config_release 1} + +%{!?ETH_DRI_VER: %global ETH_DRI_VER 1.0-1} + +%{!?KSRC: %global KSRC /lib/modules/%(uname -r)/source} +%{!?target: %global target %(uname -m)} + +%if "%{_config_name}" == "zxdh-smartnic-config" +%global _config_file smart_nic_init +%else +%global _config_file dpu_init +%endif + +Name: %{_name} +Version: %{_version} +Release: %{_release}%{?dist} +Summary: ZTE(R) PCI Express Linux Network Driver +Source: %{_name}-%{_version}-%{_release}.tar.gz +Vendor: ZTE Corporation +License: @ +ExclusiveOS: linux +Group: System Environment/Kernel +Provides: %{_name} +URL: http://support.zte.com +BuildRoot: %{_tmppath}/%{_name}-%{_version}-root + +%global debug_package %{nil} +# macros for finding system files to update at install time (pci.ids, pcitable) +%define find() %(for f in %*; do if [ -e $f ]; then echo $f; break; fi; done) +%define _pciids /usr/share/pci.ids /usr/share/hwdata/pci.ids +%define _pcitable /usr/share/kudzu/pcitable /usr/share/hwdata/pcitable /dev/null +%define pciids %find %{_pciids} +%define pcitable %find %{_pcitable} + + +Requires: kernel, findutils, gawk, bash + +%global __strip /bin/true + +%description +This package contains the ZTE(R) PCI Express Linux Network Driver. + +%package -n %{_config_name} +Version: %{_config_version} +BuildArch: noarch +Release: %{_config_release} +Group: System Environment/Base +Summary: Smart NIC initial configuration file + +%description -n %{_config_name} +The smart-nic-init package contains the initial configuration file for smart NIC. + +# set modules dir +%if %{IS_RHEL_VENDOR} +%if 0%{?fedora} +%global install_mod_dir updates +%else +%global install_mod_dir extra/%{name} +%endif +%endif + +%if "%{_vendor}" == "suse" +%global install_mod_dir updates +%endif + +%{!?install_mod_dir: %global install_mod_dir updates} + + +%prep +%setup -q -n zxdh_kernel + +%build +cd ./build +./build.pl -t clean --ksrc %{KSRC} + +%if 0%{?CROSS_COMPILE:1} +# cross compile + +./build.pl -t kernel -m CONFIG_DINGHAI_ETH -m CONFIG_ZXDH_AUXILIARY -m CONFIG_DINGHAI_PF \ + -m CONFIG_ZXDH_SF -m CONFIG_DINGHAI_EN_AUX \ + -m HAVE_DEVLINK_ALLOC_GET_1_PARAMS -m HAVE_DEV_PM_DOMAIN_ATTACH \ + -m HAVE_BUS_FIND_DEVICE_GET_CONST -m CONFIG_DINGHAI_DH_CMD \ + -m CONFIG_DINGHAI_NP -m CONFIG_ZXDH_MSGQ \ + -m CONFIG_ZXDH_1588 -m CONFIG_DINGHAI_PTP \ + -m CONFIG_DINGHAI_TSN\ + --ksrc %{KSRC} \ + --cross_compile %{CROSS_COMPILE} \ + --target_arch %{target} \ + --dri_ver %{ETH_DRI_VER} +%else +# no cross compile +./build.pl -t kernel -m CONFIG_DINGHAI_ETH -m CONFIG_ZXDH_AUXILIARY -m CONFIG_DINGHAI_PF \ + -m CONFIG_ZXDH_SF -m CONFIG_DINGHAI_EN_AUX \ + -m HAVE_DEVLINK_ALLOC_GET_1_PARAMS -m HAVE_DEV_PM_DOMAIN_ATTACH \ + -m HAVE_BUS_FIND_DEVICE_GET_CONST -m CONFIG_DINGHAI_DH_CMD \ + -m CONFIG_DINGHAI_NP -m CONFIG_ZXDH_MSGQ \ + -m CONFIG_ZXDH_1588 -m CONFIG_DINGHAI_PTP \ + -m CONFIG_DINGHAI_TSN\ + --ksrc %{KSRC} \ + --dri_ver %{ETH_DRI_VER} +%endif + +%install +cd ./build + +export INSTALL_MOD_PATH=%{buildroot} +export INSTALL_MOD_DIR=%{install_mod_dir} +export KSRC=%{KSRC} +make modules_install INSTALL_MOD_PATH=%{buildroot} INSTALL_MOD_DIR=%{install_mod_dir} KSRC=%{KSRC} + +# Remove modules files that we do not want to include +find %{buildroot}/lib/modules/ -name 'modules.*' -exec rm -f {} \; + +cd %{buildroot} +find lib -name "*.ko" -printf "/%p\n" \ + >%{_builddir}/zxdh_kernel/file.list +export _ksrc=%{KSRC} + +# Add config files +%if %{IS_RHEL_VENDOR} +%if ! 0%{?fedora} +%{__install} -d %{buildroot}%{_sysconfdir}/depmod.d/ +for module in `find . -type f -name *.ko`; +do +ko_name=${module##*/} +mod_name=${ko_name/.ko*/} +mod_path=${module/*%{name}} +mod_path=${mod_path/\/${ko_name}} +echo "override ${mod_name} * weak-updates/%{name}${mod_path}" >> %{buildroot}%{_sysconfdir}/depmod.d/%{name}-${mod_name}.conf +echo "override ${mod_name} * extra/%{name}${mod_path}" >> %{buildroot}%{_sysconfdir}/depmod.d/%{name}-${mod_name}.conf +done +%endif +%endif + +# Add zxdh_en_aux udev conf + +%{__install} -d %{buildroot}%{_sysconfdir}/udev/rules.d/ +echo 'ACTION!="add", GOTO="drivers_end"' > %{buildroot}%{_sysconfdir}/udev/rules.d/80-%{name}-zxdh_en_aux-drivers.rules +echo 'ENV{MODALIAS}=="zxdh_auxiliary:zxdh_pf.en_aux", RUN{builtin}+="kmod load zxdh_en_aux"' >> %{buildroot}%{_sysconfdir}/udev/rules.d/80-%{name}-zxdh_en_aux-drivers.rules +echo 'LABEL="drivers_end"' >> %{buildroot}%{_sysconfdir}/udev/rules.d/80-%{name}-zxdh_en_aux-drivers.rules + +cd $HOME/rpmbuild/BUILD/zxdh_kernel/build/zxdh_config +%{__install} -m 644 ./%{_config_file}.cfg %{buildroot}%{_sysconfdir} + +%clean +rm -rf %{buildroot} + +%files -f file.list +%if %{IS_RHEL_VENDOR} +%if ! 0%{?fedora} +%config(noreplace) %{_sysconfdir}/depmod.d/%{name}-*.conf +%endif +%endif + +%{_sysconfdir}/udev/rules.d/80-%{name}-zxdh_en_aux-drivers.rules + + + +%defattr(-, root, root) +%doc file.list +%doc pci.updates + +%files -n %{_config_name} +%defattr(-, root, root,-) +%config %{_sysconfdir}/%{_config_file}.cfg + +%post +if [ -d /usr/local/share/%{name} ]; then + rm -rf /usr/local/share/%{name} +fi +mkdir /usr/local/share/%{name} +cp --parents %{pciids} /usr/local/share/%{name}/ +echo "original pci.ids saved in /usr/local/share/%{name}"; +if [ "%{pcitable}" != "/dev/null" ]; then + cp --parents %{pcitable} /usr/local/share/%{name}/ + echo "original pcitable saved in /usr/local/share/%{name}"; +fi + +LD="%{_docdir}/%{name}"; +if [ -d %{_docdir}/%{name}-%{version} ]; then + LD="%{_docdir}/%{name}-%{version}"; +fi + +#Yes, this really needs bash +bash -s %{pciids} \ + %{pcitable} \ + $LD/pci.updates \ + $LD/pci.ids.new \ + $LD/pcitable.new \ + %{name} \ +<<"END" +#! /bin/bash +# For licensing information, see the file 'LICENSE' in the root folder +# $1 = system pci.ids file to update +# $2 = system pcitable file to update +# $3 = file with new entries in pci.ids file format +# $4 = pci.ids output file +# $5 = pcitable output file +# $6 = driver name for use in pcitable file + +exec 3<$1 +exec 4<$2 +exec 5<$3 +exec 6>$4 +exec 7>$5 +driver=$6 +IFS= + +# pattern matching strings +ID="[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]" +VEN="${ID}*" +DEV=" ${ID}*" +SUB=" ${ID}*" +TABLE_DEV="0x${ID} 0x${ID} \"*" +TABLE_SUB="0x${ID} 0x${ID} 0x${ID} 0x${ID} \"*" + +line= +table_line= +ids_in= +table_in= +vendor= +device= +ids_device= +table_device= +subven= +ids_subven= +table_subven= +subdev= +ids_subdev= +table_subdev= +ven_str= +dev_str= +sub_str= + +# force a sub-shell to fork with a new stdin +# this is needed if the shell is reading these instructions from stdin +while true +do + # get the first line of each data file to jump start things + exec 0<&3 + read -r ids_in + if [ "$2" != "/dev/null" ];then + exec 0<&4 + read -r table_in + fi + + # outer loop reads lines from the updates file + exec 0<&5 + while read -r line + do + # vendor entry + if [[ $line == $VEN ]] + then + vendor=0x${line:0:4} + ven_str=${line#${line:0:6}} + # add entry to pci.ids + exec 0<&3 + exec 1>&6 + while [[ $ids_in != $VEN || + 0x${ids_in:0:4} < $vendor ]] + do + echo "$ids_in" + read -r ids_in + done + echo "$line" + if [[ 0x${ids_in:0:4} == $vendor ]] + then + read -r ids_in + fi + + # device entry + elif [[ $line == $DEV ]] + then + device=`echo ${line:1:4} | tr "[:upper:]" "[:lower:]"` + table_device=0x${line:1:4} + dev_str=${line#${line:0:7}} + ids_device=`echo ${ids_in:1:4} | tr "[:upper:]" "[:lower:]"` + table_line="$vendor $table_device \"$driver\" \"$ven_str|$dev_str\"" + # add entry to pci.ids + exec 0<&3 + exec 1>&6 + while [[ $ids_in != $DEV || + $ids_device < $device ]] + do + if [[ $ids_in == $VEN ]] + then + break + fi + if [[ $ids_device != ${ids_in:1:4} ]] + then + echo "${ids_in:0:1}$ids_device${ids_in#${ids_in:0:5}}" + else + echo "$ids_in" + fi + read -r ids_in + ids_device=`echo ${ids_in:1:4} | tr "[:upper:]" "[:lower:]"` + done + if [[ $device != ${line:1:4} ]] + then + echo "${line:0:1}$device${line#${line:0:5}}" + else + echo "$line" + fi + if [[ $ids_device == $device ]] + then + read -r ids_in + fi + # add entry to pcitable + if [ "$2" != "/dev/null" ];then + exec 0<&4 + exec 1>&7 + while [[ $table_in != $TABLE_DEV || + ${table_in:0:6} < $vendor || + ( ${table_in:0:6} == $vendor && + ${table_in:7:6} < $table_device ) ]] + do + echo "$table_in" + read -r table_in + done + echo "$table_line" + if [[ ${table_in:0:6} == $vendor && + ${table_in:7:6} == $table_device ]] + then + read -r table_in + fi + fi + # subsystem entry + elif [[ $line == $SUB ]] + then + subven=`echo ${line:2:4} | tr "[:upper:]" "[:lower:]"` + subdev=`echo ${line:7:4} | tr "[:upper:]" "[:lower:]"` + table_subven=0x${line:2:4} + table_subdev=0x${line:7:4} + sub_str=${line#${line:0:13}} + ids_subven=`echo ${ids_in:2:4} | tr "[:upper:]" "[:lower:]"` + ids_subdev=`echo ${ids_in:7:4} | tr "[:upper:]" "[:lower:]"` + table_line="$vendor $table_device $table_subven $table_subdev \"$driver\" \"$ven_str|$sub_str\"" + # add entry to pci.ids + exec 0<&3 + exec 1>&6 + while [[ $ids_in != $SUB || + $ids_subven < $subven || + ( $ids_subven == $subven && + $ids_subdev < $subdev ) ]] + do + if [[ $ids_in == $VEN || + $ids_in == $DEV ]] + then + break + fi + if [[ ! (${ids_in:2:4} == "1014" && + ${ids_in:7:4} == "052C") ]] + then + if [[ $ids_subven != ${ids_in:2:4} || $ids_subdev != ${ids_in:7:4} ]] + then + echo "${ids_in:0:2}$ids_subven $ids_subdev${ids_in#${ids_in:0:11}}" + else + echo "$ids_in" + fi + fi + read -r ids_in + ids_subven=`echo ${ids_in:2:4} | tr "[:upper:]" "[:lower:]"` + ids_subdev=`echo ${ids_in:7:4} | tr "[:upper:]" "[:lower:]"` + done + if [[ $subven != ${line:2:4} || $subdev != ${line:7:4} ]] + then + echo "${line:0:2}$subven $subdev${line#${line:0:11}}" + else + echo "$line" + fi + if [[ $ids_subven == $subven && + $ids_subdev == $subdev ]] + then + read -r ids_in + fi + # add entry to pcitable + if [ "$2" != "/dev/null" ];then + exec 0<&4 + exec 1>&7 + while [[ $table_in != $TABLE_SUB || + ${table_in:14:6} < $table_subven || + ( ${table_in:14:6} == $table_subven && + ${table_in:21:6} < $table_subdev ) ]] + do + if [[ $table_in == $TABLE_DEV ]] + then + break + fi + if [[ ! (${table_in:14:6} == "0x1014" && + ${table_in:21:6} == "0x052C") ]] + then + echo "$table_in" + fi + read -r table_in + done + echo "$table_line" + if [[ ${table_in:14:6} == $table_subven && + ${table_in:21:6} == $table_subdev ]] + then + read -r table_in + fi + fi + fi + + exec 0<&5 + done + + # print the remainder of the original files + exec 0<&3 + exec 1>&6 + echo "$ids_in" + while read -r ids_in + do + echo "$ids_in" + done + + if [ "$2" != "/dev/null" ];then + exec 0>&4 + exec 1>&7 + echo "$table_in" + while read -r table_in + do + echo "$table_in" + done + fi + + break +done <&5 + +exec 3<&- +exec 4<&- +exec 5<&- +exec 6>&- +exec 7>&- + +END + +mv -f $LD/pci.ids.new %{pciids} +if [ "%{pcitable}" != "/dev/null" ]; then + mv -f $LD/pcitable.new %{pcitable} +fi + +uname -r | grep BOOT || /sbin/depmod -a > /dev/null 2>&1 || true + +if [ -x "/usr/sbin/weak-modules" ]; then + modules=( $(cat %{_docdir}/%{name}/file.list | grep '\.ko$' | xargs realpath) ) + printf '%s\n' "${modules[@]}" | /usr/sbin/weak-modules --no-initramfs --add-modules +fi + +if which dracut >/dev/null 2>&1; then + if [[ `cat /etc/CGSL/cgsl-customize/extra_driver.conf 2>/dev/null | grep "^[[:space:]]*update_initramfs[[:space:]]*=[[:space:]]*no"` == "" ]]; then + echo "Updating initramfs with dracut..." + if dracut --force ; then + echo "Successfully updated initramfs." + else + echo "Failed to update initramfs." + echo "You must update your initramfs image for changes to take place." + exit -1 + fi + else + echo "You must update your initrd manually for changes to take place, please execute the command: dracut --force" + fi +elif which mkinitrd >/dev/null 2>&1; then + echo "Updating initrd with mkinitrd..." + if mkinitrd; then + echo "Successfully updated initrd." + else + echo "Failed to update initrd." + echo "You must update your initrd image for changes to take place." + exit -1 + fi +else + echo "Unable to determine utility to update initrd image." + echo "You must update your initrd manually for changes to take place." + exit -1 +fi + +%preun +# save tmp list of installed kernel modules for weak-modules +cat %{_docdir}/%{name}/file.list | grep '\.ko$' | xargs realpath > /var/run/rpm-%{name}-modules.list + +rm -rf /usr/local/share/%{name} + +%postun +uname -r | grep BOOT || /sbin/depmod -a > /dev/null 2>&1 || true + +if [ -x "/usr/sbin/weak-modules" ]; then + modules=( $(cat /var/run/rpm-%{name}-modules.list) ) + printf '%s\n' "${modules[@]}" | /usr/sbin/weak-modules --no-initramfs --remove-modules +fi +rm /var/run/rpm-%{name}-modules.list + +if which dracut >/dev/null 2>&1; then + if [[ `cat /etc/CGSL/cgsl-customize/extra_driver.conf 2>/dev/null | grep "^[[:space:]]*update_initramfs[[:space:]]*=[[:space:]]*no"` == "" ]]; then + echo "Updating initramfs with dracut..." + if dracut --force ; then + echo "Successfully updated initramfs." + else + echo "Failed to update initramfs." + echo "You must update your initramfs image for changes to take place." + exit -1 + fi + else + echo "You must update your initrd manually for changes to take place, please execute the command: dracut --force" + fi +elif which mkinitrd >/dev/null 2>&1; then + echo "Updating initrd with mkinitrd..." + if mkinitrd; then + echo "Successfully updated initrd." + else + echo "Failed to update initrd." + echo "You must update your initrd image for changes to take place." + exit -1 + fi +else + echo "Unable to determine utility to update initrd image." + echo "You must update your initrd manually for changes to take place." + exit -1 +fi + +%changelog +#let's skip this for now diff --git a/src/net/build/spec/zxdh-hpf.spec.example b/src/net/build/spec/zxdh-hpf.spec.example new file mode 100644 index 0000000..3dd09b0 --- /dev/null +++ b/src/net/build/spec/zxdh-hpf.spec.example @@ -0,0 +1,484 @@ +%global IS_RHEL_VENDOR "%{_vendor}" == "redhat" || ("%{_vendor}" == "bclinux") || ("%{_vendor}" == "openEuler") + +%{!?_name: %global _name zxdh-hpf} +%{!?_version: %global _version 1.0} +%{!?_release: %global _release 1} + +%{!?HPF_DRI_VER: %global HPF_DRI_VER 1.0-1} + +%{!?KSRC: %global KSRC /lib/modules/%(uname -r)/source} +%{!?target: %global target %(uname -m)} + +Name: %{_name} +Version: %{_version} +Release: %{_release}%{?dist} +Summary: ZTE(R) PCI Express Linux Hot-Plug PF Network Driver. +Source: %{_name}-%{_version}-%{_release}.tar.gz +Vendor: ZTE Corporation +License: @ +ExclusiveOS: linux +Group: System Environment/Kernel +Provides: %{_name} +URL: http://support.zte.com +BuildRoot: %{_tmppath}/%{_name}-%{_version}-root + +%global debug_package %{nil} +# macros for finding system files to update at install time (pci.ids, pcitable) +%define find() %(for f in %*; do if [ -e $f ]; then echo $f; break; fi; done) +%define _pciids /usr/share/pci.ids /usr/share/hwdata/pci.ids +%define _pcitable /usr/share/kudzu/pcitable /usr/share/hwdata/pcitable /dev/null +%define pciids %find %{_pciids} +%define pcitable %find %{_pcitable} + + +Requires: kernel, findutils, gawk, bash +%global __strip /bin/true + +%description +This package contains the ZTE(R) PCI Express Linux Hot-Plug PF Network Driver. + + +# set modules dir +%if %{IS_RHEL_VENDOR} +%if 0%{?fedora} +%global install_mod_dir updates +%else +%global install_mod_dir extra/%{name} +%endif +%endif + +%if "%{_vendor}" == "suse" +%global install_mod_dir updates +%endif + +%{!?install_mod_dir: %global install_mod_dir updates} + + +%prep +%setup -q -n zxdh_kernel + +%build +cd ./build +./build.pl -t clean --ksrc %{KSRC} + + +%if 0%{?CROSS_COMPILE:1} +# cross compile +./build.pl -t kernel -m CONFIG_DINGHAI_ETH -m CONFIG_DINGHAI_HPF -m CONFIG_DINGHAI_DH_CMD -m HAVE_DEVLINK_ALLOC_GET_1_PARAMS\ + --ksrc %{KSRC} \ + --cross_compile %{CROSS_COMPILE} \ + --target_arch %{target} \ + --dri_ver %{HPF_DRI_VER} +%else +# no cross compile +./build.pl -t kernel -m CONFIG_DINGHAI_ETH -m CONFIG_DINGHAI_HPF -m CONFIG_DINGHAI_DH_CMD -m HAVE_DEVLINK_ALLOC_GET_1_PARAMS\ + --ksrc %{KSRC} \ + --dri_ver %{HPF_DRI_VER} +%endif + +%install +cd ./build + +export INSTALL_MOD_PATH=%{buildroot} +export INSTALL_MOD_DIR=%{install_mod_dir} +export KSRC=%{KSRC} +make modules_install INSTALL_MOD_PATH=%{buildroot} INSTALL_MOD_DIR=%{install_mod_dir} KSRC=%{KSRC} + +# Remove modules files that we do not want to include +find %{buildroot}/lib/modules/ -name 'modules.*' -exec rm -f {} \; + +cd %{buildroot} +find lib -name "*.ko" -printf "/%p\n" \ + >%{_builddir}/zxdh_kernel/hpf_file.list +export _ksrc=%{KSRC} + + +# Add config files +%if %{IS_RHEL_VENDOR} +%if ! 0%{?fedora} +%{__install} -d %{buildroot}%{_sysconfdir}/depmod.d/ +for module in `find . -type f -name *.ko`; +do +ko_name=${module##*/} +mod_name=${ko_name/.ko*/} +mod_path=${module/*%{name}} +mod_path=${mod_path/\/${ko_name}} +echo "override ${mod_name} * weak-updates/%{name}${mod_path}" >> %{buildroot}%{_sysconfdir}/depmod.d/%{name}-${mod_name}.conf +echo "override ${mod_name} * extra/%{name}${mod_path}" >> %{buildroot}%{_sysconfdir}/depmod.d/%{name}-${mod_name}.conf +done +%endif +%endif + +%clean +rm -rf %{buildroot} + + +%files -f hpf_file.list +%if %{IS_RHEL_VENDOR} +%if ! 0%{?fedora} +%config(noreplace) %{_sysconfdir}/depmod.d/%{name}-*.conf +%endif +%endif + + +%defattr(-, root, root) +%doc hpf_file.list +%doc pci.updates + + +%post +if [ -d /usr/local/share/%{name} ]; then + rm -rf /usr/local/share/%{name} +fi +mkdir /usr/local/share/%{name} +cp --parents %{pciids} /usr/local/share/%{name}/ +echo "original pci.ids saved in /usr/local/share/%{name}"; +if [ "%{pcitable}" != "/dev/null" ]; then + cp --parents %{pcitable} /usr/local/share/%{name}/ + echo "original pcitable saved in /usr/local/share/%{name}"; +fi + +LD="%{_docdir}/%{name}"; +if [ -d %{_docdir}/%{name}-%{version} ]; then + LD="%{_docdir}/%{name}-%{version}"; +fi + +#Yes, this really needs bash +bash -s %{pciids} \ + %{pcitable} \ + $LD/pci.updates \ + $LD/pci.ids.new \ + $LD/pcitable.new \ + %{name} \ +<<"END" +#! /bin/bash +# For licensing information, see the file 'LICENSE' in the root folder +# $1 = system pci.ids file to update +# $2 = system pcitable file to update +# $3 = file with new entries in pci.ids file format +# $4 = pci.ids output file +# $5 = pcitable output file +# $6 = driver name for use in pcitable file + +exec 3<$1 +exec 4<$2 +exec 5<$3 +exec 6>$4 +exec 7>$5 +driver=$6 +IFS= + +# pattern matching strings +ID="[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]" +VEN="${ID}*" +DEV=" ${ID}*" +SUB=" ${ID}*" +TABLE_DEV="0x${ID} 0x${ID} \"*" +TABLE_SUB="0x${ID} 0x${ID} 0x${ID} 0x${ID} \"*" + +line= +table_line= +ids_in= +table_in= +vendor= +device= +ids_device= +table_device= +subven= +ids_subven= +table_subven= +subdev= +ids_subdev= +table_subdev= +ven_str= +dev_str= +sub_str= + +# force a sub-shell to fork with a new stdin +# this is needed if the shell is reading these instructions from stdin +while true +do + # get the first line of each data file to jump start things + exec 0<&3 + read -r ids_in + if [ "$2" != "/dev/null" ];then + exec 0<&4 + read -r table_in + fi + + # outer loop reads lines from the updates file + exec 0<&5 + while read -r line + do + # vendor entry + if [[ $line == $VEN ]] + then + vendor=0x${line:0:4} + ven_str=${line#${line:0:6}} + # add entry to pci.ids + exec 0<&3 + exec 1>&6 + while [[ $ids_in != $VEN || + 0x${ids_in:0:4} < $vendor ]] + do + echo "$ids_in" + read -r ids_in + done + echo "$line" + if [[ 0x${ids_in:0:4} == $vendor ]] + then + read -r ids_in + fi + + # device entry + elif [[ $line == $DEV ]] + then + device=`echo ${line:1:4} | tr "[:upper:]" "[:lower:]"` + table_device=0x${line:1:4} + dev_str=${line#${line:0:7}} + ids_device=`echo ${ids_in:1:4} | tr "[:upper:]" "[:lower:]"` + table_line="$vendor $table_device \"$driver\" \"$ven_str|$dev_str\"" + # add entry to pci.ids + exec 0<&3 + exec 1>&6 + while [[ $ids_in != $DEV || + $ids_device < $device ]] + do + if [[ $ids_in == $VEN ]] + then + break + fi + if [[ $ids_device != ${ids_in:1:4} ]] + then + echo "${ids_in:0:1}$ids_device${ids_in#${ids_in:0:5}}" + else + echo "$ids_in" + fi + read -r ids_in + ids_device=`echo ${ids_in:1:4} | tr "[:upper:]" "[:lower:]"` + done + if [[ $device != ${line:1:4} ]] + then + echo "${line:0:1}$device${line#${line:0:5}}" + else + echo "$line" + fi + if [[ $ids_device == $device ]] + then + read -r ids_in + fi + # add entry to pcitable + if [ "$2" != "/dev/null" ];then + exec 0<&4 + exec 1>&7 + while [[ $table_in != $TABLE_DEV || + ${table_in:0:6} < $vendor || + ( ${table_in:0:6} == $vendor && + ${table_in:7:6} < $table_device ) ]] + do + echo "$table_in" + read -r table_in + done + echo "$table_line" + if [[ ${table_in:0:6} == $vendor && + ${table_in:7:6} == $table_device ]] + then + read -r table_in + fi + fi + # subsystem entry + elif [[ $line == $SUB ]] + then + subven=`echo ${line:2:4} | tr "[:upper:]" "[:lower:]"` + subdev=`echo ${line:7:4} | tr "[:upper:]" "[:lower:]"` + table_subven=0x${line:2:4} + table_subdev=0x${line:7:4} + sub_str=${line#${line:0:13}} + ids_subven=`echo ${ids_in:2:4} | tr "[:upper:]" "[:lower:]"` + ids_subdev=`echo ${ids_in:7:4} | tr "[:upper:]" "[:lower:]"` + table_line="$vendor $table_device $table_subven $table_subdev \"$driver\" \"$ven_str|$sub_str\"" + # add entry to pci.ids + exec 0<&3 + exec 1>&6 + while [[ $ids_in != $SUB || + $ids_subven < $subven || + ( $ids_subven == $subven && + $ids_subdev < $subdev ) ]] + do + if [[ $ids_in == $VEN || + $ids_in == $DEV ]] + then + break + fi + if [[ ! (${ids_in:2:4} == "1014" && + ${ids_in:7:4} == "052C") ]] + then + if [[ $ids_subven != ${ids_in:2:4} || $ids_subdev != ${ids_in:7:4} ]] + then + echo "${ids_in:0:2}$ids_subven $ids_subdev${ids_in#${ids_in:0:11}}" + else + echo "$ids_in" + fi + fi + read -r ids_in + ids_subven=`echo ${ids_in:2:4} | tr "[:upper:]" "[:lower:]"` + ids_subdev=`echo ${ids_in:7:4} | tr "[:upper:]" "[:lower:]"` + done + if [[ $subven != ${line:2:4} || $subdev != ${line:7:4} ]] + then + echo "${line:0:2}$subven $subdev${line#${line:0:11}}" + else + echo "$line" + fi + if [[ $ids_subven == $subven && + $ids_subdev == $subdev ]] + then + read -r ids_in + fi + # add entry to pcitable + if [ "$2" != "/dev/null" ];then + exec 0<&4 + exec 1>&7 + while [[ $table_in != $TABLE_SUB || + ${table_in:14:6} < $table_subven || + ( ${table_in:14:6} == $table_subven && + ${table_in:21:6} < $table_subdev ) ]] + do + if [[ $table_in == $TABLE_DEV ]] + then + break + fi + if [[ ! (${table_in:14:6} == "0x1014" && + ${table_in:21:6} == "0x052C") ]] + then + echo "$table_in" + fi + read -r table_in + done + echo "$table_line" + if [[ ${table_in:14:6} == $table_subven && + ${table_in:21:6} == $table_subdev ]] + then + read -r table_in + fi + fi + fi + + exec 0<&5 + done + + # print the remainder of the original files + exec 0<&3 + exec 1>&6 + echo "$ids_in" + while read -r ids_in + do + echo "$ids_in" + done + + if [ "$2" != "/dev/null" ];then + exec 0>&4 + exec 1>&7 + echo "$table_in" + while read -r table_in + do + echo "$table_in" + done + fi + + break +done <&5 + +exec 3<&- +exec 4<&- +exec 5<&- +exec 6>&- +exec 7>&- + +END + +mv -f $LD/pci.ids.new %{pciids} +if [ "%{pcitable}" != "/dev/null" ]; then + mv -f $LD/pcitable.new %{pcitable} +fi + +uname -r | grep BOOT || /sbin/depmod -a > /dev/null 2>&1 || true + +if [ -x "/usr/sbin/weak-modules" ]; then + modules=( $(cat %{_docdir}/%{name}/hpf_file.list | grep '\.ko$' | xargs realpath) ) + printf '%s\n' "${modules[@]}" | /usr/sbin/weak-modules --no-initramfs --add-modules +fi + +if which dracut >/dev/null 2>&1; then + if [[ `cat /etc/CGSL/cgsl-customize/extra_driver.conf 2>/dev/null | grep "^[[:space:]]*update_initramfs[[:space:]]*=[[:space:]]*no"` == "" ]]; then + echo "Updating initramfs with dracut..." + if dracut --force ; then + echo "Successfully updated initramfs." + else + echo "Failed to update initramfs." + echo "You must update your initramfs image for changes to take place." + exit -1 + fi + else + echo "You must update your initrd manually for changes to take place, please execute the command: dracut --force" + fi +elif which mkinitrd >/dev/null 2>&1; then + echo "Updating initrd with mkinitrd..." + if mkinitrd; then + echo "Successfully updated initrd." + else + echo "Failed to update initrd." + echo "You must update your initrd image for changes to take place." + exit -1 + fi +else + echo "Unable to determine utility to update initrd image." + echo "You must update your initrd manually for changes to take place." + exit -1 +fi + +%preun +# save tmp list of installed kernel modules for weak-modules +cat %{_docdir}/%{name}/hpf_file.list | grep '\.ko$' | xargs realpath > /var/run/rpm-%{name}-modules.list + +rm -rf /usr/local/share/%{name} + +%postun +uname -r | grep BOOT || /sbin/depmod -a > /dev/null 2>&1 || true + +if [ -x "/usr/sbin/weak-modules" ]; then + modules=( $(cat /var/run/rpm-%{name}-modules.list) ) + printf '%s\n' "${modules[@]}" | /usr/sbin/weak-modules --no-initramfs --remove-modules +fi +rm /var/run/rpm-%{name}-modules.list + +if which dracut >/dev/null 2>&1; then + if [[ `cat /etc/CGSL/cgsl-customize/extra_driver.conf 2>/dev/null | grep "^[[:space:]]*update_initramfs[[:space:]]*=[[:space:]]*no"` == "" ]]; then + echo "Updating initramfs with dracut..." + if dracut --force ; then + echo "Successfully updated initramfs." + else + echo "Failed to update initramfs." + echo "You must update your initramfs image for changes to take place." + exit -1 + fi + else + echo "You must update your initrd manually for changes to take place, please execute the command: dracut --force" + fi +elif which mkinitrd >/dev/null 2>&1; then + echo "Updating initrd with mkinitrd..." + if mkinitrd; then + echo "Successfully updated initrd." + else + echo "Failed to update initrd." + echo "You must update your initrd image for changes to take place." + exit -1 + fi +else + echo "Unable to determine utility to update initrd image." + echo "You must update your initrd manually for changes to take place." + exit -1 +fi + +%changelog +#let's skip this for now diff --git a/src/net/build/spec/zxdh-zf-mpf.spec.example b/src/net/build/spec/zxdh-zf-mpf.spec.example new file mode 100644 index 0000000..d918da7 --- /dev/null +++ b/src/net/build/spec/zxdh-zf-mpf.spec.example @@ -0,0 +1,494 @@ +%global IS_RHEL_VENDOR "%{_vendor}" == "redhat" || ("%{_vendor}" == "bclinux") || ("%{_vendor}" == "openEuler") + +%{!?_name: %global _name zxdh-zf-mpf} +%{!?_version: %global _version 1.0} +%{!?_release: %global _release 1} + +%{!?ZF_MPF_DRI_VER: %global ZF_MPF_DRI_VER 1.0-1} + +%{!?KSRC: %global KSRC /lib/modules/%(uname -r)/source} +%{!?target: %global target aarch64} + + +Name: %{_name} +Version: %{_version} +Release: %{_release}%{?dist} +Summary: ZTE(R) PCI Express Linux ZF MPF Network Driver +Source: %{_name}-%{_version}-%{_release}.tar.gz +Vendor: ZTE Corporation +License: @ +ExclusiveOS: linux +Group: System Environment/Kernel +Provides: %{_name} +URL: http://support.zte.com +BuildRoot: %{_tmppath}/%{_name}-%{_version}-root + +%global debug_package %{nil} +# macros for finding system files to update at install time (pci.ids, pcitable) +%define find() %(for f in %*; do if [ -e $f ]; then echo $f; break; fi; done) +%define _pciids /usr/share/pci.ids /usr/share/hwdata/pci.ids +%define _pcitable /usr/share/kudzu/pcitable /usr/share/hwdata/pcitable /dev/null +%define pciids %find %{_pciids} +%define pcitable %find %{_pcitable} + + +Requires: kernel, findutils, gawk, bash +%global __strip /bin/true + +%description +This package contains the ZTE(R) PCI Express Linux ZF MPF Network Driver. + + +# set modules dir +%if %{IS_RHEL_VENDOR} +%if 0%{?fedora} +%global install_mod_dir updates +%else +%global install_mod_dir extra/%{name} +%endif +%endif + +%if "%{_vendor}" == "suse" +%global install_mod_dir updates +%endif + +%{!?install_mod_dir: %global install_mod_dir updates} + + +%prep +%setup -q -n zxdh_kernel + +%build +cd ./build +./build.pl -t clean --ksrc %{KSRC} + + +%if 0%{?CROSS_COMPILE:1} +# cross compile +./build.pl -t kernel -m CONFIG_DINGHAI_ETH -m CONFIG_ZXDH_AUXILIARY -m CONFIG_DINGHAI_ZF_MPF \ + -m PCIE_ZF_EPC_OPEN -m CONFIG_DINGHAI_DH_CMD \ + -m CONFIG_ZXDH_SF -m HAVE_DEVLINK_ALLOC_GET_1_PARAMS \ + -m HAVE_DEV_PM_DOMAIN_ATTACH -m HAVE_BUS_FIND_DEVICE_GET_CONST \ + -m CONFIG_ZF_GDMA \ + --ksrc %{KSRC} \ + --cross_compile %{CROSS_COMPILE} \ + --target_arch %{target} \ + --dri_ver %{ZF_MPF_DRI_VER} +%else +# no cross compile +./build.pl -t kernel -m CONFIG_DINGHAI_ETH -m CONFIG_ZXDH_AUXILIARY -m CONFIG_DINGHAI_ZF_MPF \ + -m PCIE_ZF_EPC_OPEN -m CONFIG_DINGHAI_DH_CMD \ + -m CONFIG_ZXDH_SF -m HAVE_DEVLINK_ALLOC_GET_1_PARAMS \ + -m HAVE_DEV_PM_DOMAIN_ATTACH -m HAVE_BUS_FIND_DEVICE_GET_CONST \ + -m CONFIG_ZF_GDMA \ + --ksrc %{KSRC} \ + --dri_ver %{ZF_MPF_DRI_VER} +%endif + +%install +cd ./build + +export INSTALL_MOD_PATH=%{buildroot} +export INSTALL_MOD_DIR=%{install_mod_dir} +export KSRC=%{KSRC} +make modules_install INSTALL_MOD_PATH=%{buildroot} INSTALL_MOD_DIR=%{install_mod_dir} KSRC=%{KSRC} + +# Remove modules files that we do not want to include +find %{buildroot}/lib/modules/ -name 'modules.*' -exec rm -f {} \; +find %{buildroot}/lib/modules/ -name '*zf_epf.ko' -exec rm -f {} \; + +cd %{buildroot} +find lib -name "*.ko" -printf "/%p\n" \ + >%{_builddir}/zxdh_kernel/zf_mpf_file.list +export _ksrc=%{KSRC} + + +# Add config files +%if %{IS_RHEL_VENDOR} +%if ! 0%{?fedora} +%{__install} -d %{buildroot}%{_sysconfdir}/depmod.d/ +for module in `find . -type f -name *.ko`; +do +ko_name=${module##*/} +mod_name=${ko_name/.ko*/} +mod_path=${module/*%{name}} +mod_path=${mod_path/\/${ko_name}} +echo "override ${mod_name} * weak-updates/%{name}${mod_path}" >> %{buildroot}%{_sysconfdir}/depmod.d/%{name}-${mod_name}.conf +echo "override ${mod_name} * extra/%{name}${mod_path}" >> %{buildroot}%{_sysconfdir}/depmod.d/%{name}-${mod_name}.conf +done +%endif +%endif + +%clean +rm -rf %{buildroot} + + +%files -f zf_mpf_file.list +%if %{IS_RHEL_VENDOR} +%if ! 0%{?fedora} +%config(noreplace) %{_sysconfdir}/depmod.d/%{name}-*.conf +%endif +%endif + + +%defattr(-, root, root) +%doc zf_mpf_file.list +%doc pci.updates + + +%post +if [ -d /usr/local/share/%{name} ]; then + rm -rf /usr/local/share/%{name} +fi +mkdir /usr/local/share/%{name} +cp --parents %{pciids} /usr/local/share/%{name}/ +echo "original pci.ids saved in /usr/local/share/%{name}"; +if [ "%{pcitable}" != "/dev/null" ]; then + cp --parents %{pcitable} /usr/local/share/%{name}/ + echo "original pcitable saved in /usr/local/share/%{name}"; +fi + +LD="%{_docdir}/%{name}"; +if [ -d %{_docdir}/%{name}-%{version} ]; then + LD="%{_docdir}/%{name}-%{version}"; +fi + +#Yes, this really needs bash +bash -s %{pciids} \ + %{pcitable} \ + $LD/pci.updates \ + $LD/pci.ids.new \ + $LD/pcitable.new \ + %{name} \ +<<"END" +#! /bin/bash +# For licensing information, see the file 'LICENSE' in the root folder +# $1 = system pci.ids file to update +# $2 = system pcitable file to update +# $3 = file with new entries in pci.ids file format +# $4 = pci.ids output file +# $5 = pcitable output file +# $6 = driver name for use in pcitable file + +exec 3<$1 +exec 4<$2 +exec 5<$3 +exec 6>$4 +exec 7>$5 +driver=$6 +IFS= + +# pattern matching strings +ID="[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]" +VEN="${ID}*" +DEV=" ${ID}*" +SUB=" ${ID}*" +TABLE_DEV="0x${ID} 0x${ID} \"*" +TABLE_SUB="0x${ID} 0x${ID} 0x${ID} 0x${ID} \"*" + +line= +table_line= +ids_in= +table_in= +vendor= +device= +ids_device= +table_device= +subven= +ids_subven= +table_subven= +subdev= +ids_subdev= +table_subdev= +ven_str= +dev_str= +sub_str= + +# force a sub-shell to fork with a new stdin +# this is needed if the shell is reading these instructions from stdin +while true +do + # get the first line of each data file to jump start things + exec 0<&3 + read -r ids_in + if [ "$2" != "/dev/null" ];then + exec 0<&4 + read -r table_in + fi + + # outer loop reads lines from the updates file + exec 0<&5 + while read -r line + do + # vendor entry + if [[ $line == $VEN ]] + then + vendor=0x${line:0:4} + ven_str=${line#${line:0:6}} + # add entry to pci.ids + exec 0<&3 + exec 1>&6 + while [[ $ids_in != $VEN || + 0x${ids_in:0:4} < $vendor ]] + do + echo "$ids_in" + read -r ids_in + done + echo "$line" + if [[ 0x${ids_in:0:4} == $vendor ]] + then + read -r ids_in + fi + + # device entry + elif [[ $line == $DEV ]] + then + device=`echo ${line:1:4} | tr "[:upper:]" "[:lower:]"` + table_device=0x${line:1:4} + dev_str=${line#${line:0:7}} + ids_device=`echo ${ids_in:1:4} | tr "[:upper:]" "[:lower:]"` + table_line="$vendor $table_device \"$driver\" \"$ven_str|$dev_str\"" + # add entry to pci.ids + exec 0<&3 + exec 1>&6 + while [[ $ids_in != $DEV || + $ids_device < $device ]] + do + if [[ $ids_in == $VEN ]] + then + break + fi + if [[ $ids_device != ${ids_in:1:4} ]] + then + echo "${ids_in:0:1}$ids_device${ids_in#${ids_in:0:5}}" + else + echo "$ids_in" + fi + read -r ids_in + ids_device=`echo ${ids_in:1:4} | tr "[:upper:]" "[:lower:]"` + done + if [[ $device != ${line:1:4} ]] + then + echo "${line:0:1}$device${line#${line:0:5}}" + else + echo "$line" + fi + if [[ $ids_device == $device ]] + then + read -r ids_in + fi + # add entry to pcitable + if [ "$2" != "/dev/null" ];then + exec 0<&4 + exec 1>&7 + while [[ $table_in != $TABLE_DEV || + ${table_in:0:6} < $vendor || + ( ${table_in:0:6} == $vendor && + ${table_in:7:6} < $table_device ) ]] + do + echo "$table_in" + read -r table_in + done + echo "$table_line" + if [[ ${table_in:0:6} == $vendor && + ${table_in:7:6} == $table_device ]] + then + read -r table_in + fi + fi + # subsystem entry + elif [[ $line == $SUB ]] + then + subven=`echo ${line:2:4} | tr "[:upper:]" "[:lower:]"` + subdev=`echo ${line:7:4} | tr "[:upper:]" "[:lower:]"` + table_subven=0x${line:2:4} + table_subdev=0x${line:7:4} + sub_str=${line#${line:0:13}} + ids_subven=`echo ${ids_in:2:4} | tr "[:upper:]" "[:lower:]"` + ids_subdev=`echo ${ids_in:7:4} | tr "[:upper:]" "[:lower:]"` + table_line="$vendor $table_device $table_subven $table_subdev \"$driver\" \"$ven_str|$sub_str\"" + # add entry to pci.ids + exec 0<&3 + exec 1>&6 + while [[ $ids_in != $SUB || + $ids_subven < $subven || + ( $ids_subven == $subven && + $ids_subdev < $subdev ) ]] + do + if [[ $ids_in == $VEN || + $ids_in == $DEV ]] + then + break + fi + if [[ ! (${ids_in:2:4} == "1014" && + ${ids_in:7:4} == "052C") ]] + then + if [[ $ids_subven != ${ids_in:2:4} || $ids_subdev != ${ids_in:7:4} ]] + then + echo "${ids_in:0:2}$ids_subven $ids_subdev${ids_in#${ids_in:0:11}}" + else + echo "$ids_in" + fi + fi + read -r ids_in + ids_subven=`echo ${ids_in:2:4} | tr "[:upper:]" "[:lower:]"` + ids_subdev=`echo ${ids_in:7:4} | tr "[:upper:]" "[:lower:]"` + done + if [[ $subven != ${line:2:4} || $subdev != ${line:7:4} ]] + then + echo "${line:0:2}$subven $subdev${line#${line:0:11}}" + else + echo "$line" + fi + if [[ $ids_subven == $subven && + $ids_subdev == $subdev ]] + then + read -r ids_in + fi + # add entry to pcitable + if [ "$2" != "/dev/null" ];then + exec 0<&4 + exec 1>&7 + while [[ $table_in != $TABLE_SUB || + ${table_in:14:6} < $table_subven || + ( ${table_in:14:6} == $table_subven && + ${table_in:21:6} < $table_subdev ) ]] + do + if [[ $table_in == $TABLE_DEV ]] + then + break + fi + if [[ ! (${table_in:14:6} == "0x1014" && + ${table_in:21:6} == "0x052C") ]] + then + echo "$table_in" + fi + read -r table_in + done + echo "$table_line" + if [[ ${table_in:14:6} == $table_subven && + ${table_in:21:6} == $table_subdev ]] + then + read -r table_in + fi + fi + fi + + exec 0<&5 + done + + # print the remainder of the original files + exec 0<&3 + exec 1>&6 + echo "$ids_in" + while read -r ids_in + do + echo "$ids_in" + done + + if [ "$2" != "/dev/null" ];then + exec 0>&4 + exec 1>&7 + echo "$table_in" + while read -r table_in + do + echo "$table_in" + done + fi + + break +done <&5 + +exec 3<&- +exec 4<&- +exec 5<&- +exec 6>&- +exec 7>&- + +END + +mv -f $LD/pci.ids.new %{pciids} +if [ "%{pcitable}" != "/dev/null" ]; then + mv -f $LD/pcitable.new %{pcitable} +fi + +uname -r | grep BOOT || /sbin/depmod -a > /dev/null 2>&1 || true + +if [ -x "/usr/sbin/weak-modules" ]; then + modules=( $(cat %{_docdir}/%{name}/zf_mpf_file.list | grep '\.ko$' | xargs realpath) ) + printf '%s\n' "${modules[@]}" | /usr/sbin/weak-modules --no-initramfs --add-modules +fi + +if which dracut >/dev/null 2>&1; then + if [[ `cat /etc/CGSL/cgsl-customize/extra_driver.conf 2>/dev/null | grep "^[[:space:]]*update_initramfs[[:space:]]*=[[:space:]]*no"` == "" ]]; then + echo "Updating initramfs with dracut..." + if dracut --force ; then + echo "Successfully updated initramfs." + else + echo "Failed to update initramfs." + echo "You must update your initramfs image for changes to take place." + exit -1 + fi + else + echo "You must update your initrd manually for changes to take place, please execute the command: dracut --force" + fi +elif which mkinitrd >/dev/null 2>&1; then + echo "Updating initrd with mkinitrd..." + if mkinitrd; then + echo "Successfully updated initrd." + else + echo "Failed to update initrd." + echo "You must update your initrd image for changes to take place." + exit -1 + fi +else + echo "Unable to determine utility to update initrd image." + echo "You must update your initrd manually for changes to take place." + exit -1 +fi + +%preun +# save tmp list of installed kernel modules for weak-modules +cat %{_docdir}/%{name}/zf_mpf_file.list | grep '\.ko$' | xargs realpath > /var/run/rpm-%{name}-modules.list + +rm -rf /usr/local/share/%{name} + +%postun +uname -r | grep BOOT || /sbin/depmod -a > /dev/null 2>&1 || true + +if [ -x "/usr/sbin/weak-modules" ]; then + modules=( $(cat /var/run/rpm-%{name}-modules.list) ) + printf '%s\n' "${modules[@]}" | /usr/sbin/weak-modules --no-initramfs --remove-modules +fi +rm /var/run/rpm-%{name}-modules.list + +if which dracut >/dev/null 2>&1; then + if [[ `cat /etc/CGSL/cgsl-customize/extra_driver.conf 2>/dev/null | grep "^[[:space:]]*update_initramfs[[:space:]]*=[[:space:]]*no"` == "" ]]; then + echo "Updating initramfs with dracut..." + if dracut --force ; then + echo "Successfully updated initramfs." + else + echo "Failed to update initramfs." + echo "You must update your initramfs image for changes to take place." + exit -1 + fi + else + echo "You must update your initrd manually for changes to take place, please execute the command: dracut --force" + fi +elif which mkinitrd >/dev/null 2>&1; then + echo "Updating initrd with mkinitrd..." + if mkinitrd; then + echo "Successfully updated initrd." + else + echo "Failed to update initrd." + echo "You must update your initrd image for changes to take place." + exit -1 + fi +else + echo "Unable to determine utility to update initrd image." + echo "You must update your initrd manually for changes to take place." + exit -1 +fi + +%changelog +#let's skip this for now diff --git a/src/net/build/zxdh_config/dpu_init.cfg b/src/net/build/zxdh_config/dpu_init.cfg new file mode 100755 index 0000000..243fddf --- /dev/null +++ b/src/net/build/zxdh_config/dpu_init.cfg @@ -0,0 +1,29 @@ +{ + "device_pcie_list_api_name": "neo_get_bdf_info.py", + "flow_merge_enable": "true", + "vdpa_type": "0", + "vswitch_cfg": { + "bond_info": { + "bus_name": "pci", + "prefix": "", + "linux-device": ["1cf2:8047"], + "dpdk-device": "1cf2:8048" + }, + "vport_info": { + "bus_name": "vdev", + "prefix": "net_zxdhx_", + "max_queue_num":"8" + }, + "upcall-queue": { + "vm-queue-total-num": "1" + }, + "reinject-queue": { + "vm-queue-total-num": "1" + } + }, + "global_cfg": { + "vnic_max_num": "252", + "vnic_queue_num": "2048" + } +} + diff --git a/src/net/build/zxdh_config/smart_nic_init.cfg b/src/net/build/zxdh_config/smart_nic_init.cfg new file mode 100755 index 0000000..576b2a4 --- /dev/null +++ b/src/net/build/zxdh_config/smart_nic_init.cfg @@ -0,0 +1,26 @@ +{ + "vdpa_type": "1", + "vswitch_cfg": { + "bond_info": { + "bus_name": "pci", + "prefix": "", + "linux-device": ["1cf2:8063"], + "dpdk-device": "1cf2:8064" + }, + "vport_info": { + "bus_name": "pci", + "prefix": "", + "max_queue_num":"8" + }, + "upcall-queue": { + "vm-queue-total-num": "1" + }, + "reinject-queue": { + "vm-queue-total-num": "1" + } + }, + "global_cfg": { + "vnic_max_num": "252", + "vnic_queue_num": "2048" + } +} diff --git a/src/net/ci_cmd.sh b/src/net/ci_cmd.sh new file mode 100755 index 0000000..7c926b1 --- /dev/null +++ b/src/net/ci_cmd.sh @@ -0,0 +1,177 @@ +#!/bin/bash + +cmd=$1 + +ver_path=/zte +root_dir=$ver_path/zxdh_kernel + +function get_chg_no(){ + commit_id=$(git log --pretty=format:"%H" | head -n 1) + chg_no=$(git ls-remote | awk '/'${commit_id}'/&&/changes/' | sed 's/\//\n/g' | tail -n 2 | head -1) + echo "${chg_no}" +} + +function get_submit_info(){ + commit_id=$(git log --pretty=format:"%H" | head -n 1) + chg_no=$(git ls-remote | awk '/'${commit_id}'/&&/changes/' | sed 's/\//\n/g' | tail -n 2 | head -1) + title=$(git log --pretty=format:"%s" ${commit_id} -1) + echo "${commit_id} ${chg_no} ${title}" +} + +if [ $cmd = "verifyci" ]; then + param=$2 + if [ $param = "kw" ]; then + exit 0 + elif [ $param = "coverity" ]; then + exit 0 + elif [ $param = "compile" ]; then + build_no=$3 + chg_no=$4 + sh compile.sh verifyci ${build_no} ${chg_no} + result=$? + exit ${result} + elif [ $param = "unittest" ]; then + sh ut.sh + result=$? + exit ${result} + else + echo "unknow cmd" + exit 1 + fi +fi + +if [ $cmd = "gateci" ]; then + param=$2 + if [ $param = "compile" ]; then + build_no=$3 + chg_no=$4 + sh compile.sh gateci ${build_no} ${chg_no} + result=$? + exit ${result} + elif [ $param = "smoke" ]; then + sh smoke.sh gateci + result=$? + exit ${result} + else + echo "unknow cmd" + exit 1 + fi +fi + +if [ $cmd = "postci" ]; then + param=$2 + if [ $param = "compile" ]; then + build_no=$3 + chg_no=$4 + sh compile.sh postci ${build_no} ${chg_no} + result=$? + exit ${result} + elif [ $param = "upload" ]; then + chg_branch=$3 + env_user=$4 + env_pwd=$5 + sh upload.sh postci ${chg_branch} ${env_user} ${env_pwd} + result=$? + exit ${result} + else + echo "unknow cmd" + exit 1 + fi +fi + +if [ $cmd = "versionci" ]; then + param=$2 + cd ${root_dir} + chg_no=`get_chg_no | tail -n 1` + + if [ $param = "kw" ]; then + exit 0 + elif [ $param = "coverity" ]; then + exit 0 + elif [ $param = "smoke" ]; then + sh smoke.sh versionci + elif [ $param = "compile" ]; then + build_no=$3 + sh compile.sh versionci ${build_no} ${chg_no} + result=$? + exit ${result} + elif [ $param = "upload" ]; then + chg_branch=$3 + env_user=$4 + env_pwd=$5 + sh upload.sh versionci ${chg_branch} ${env_user} ${env_pwd} + result=$? + exit ${result} + else + echo "unknow cmd" + exit 1 + fi +fi + +if [ $cmd = "download" ]; then + chg_branch=$2 + env_user=$3 + env_pwd=$4 + + rm -rf ${ver_path}/os + mkdir -p ${ver_path}/os + art_path="https://artsz.zte.com.cn:443/artifactory/dinghai-snapshot-generic/dpu_sdk/os" + last_files=$(curl -k -u ${env_user}:${env_pwd} -X GET ${art_path}/) + for file in ${last_files} + do + if [[ ${file} =~ "href=" ]] + then + file_name=$(echo ${file#*>} | sed -e 's/<\/a>//') + curl -k -u ${env_user}:${env_pwd} -o ${ver_path}/os/${file_name} ${art_path}/${file_name} + unzip -q ${ver_path}/os/${file_name} -d ${ver_path}/os + fi + done + kernel_file1=$(ls ${ver_path}/os | grep "aarch64$") + echo $kernel_file1 + kernel_file2=$(ls ${ver_path}/os | grep "x86_64$") + echo $kernel_file2 + + NXI_NXE_DPU_host_aarch64_file=$(ls ${ver_path}/os | grep "aarch64_${NXI_Host_CGS_kernel_aarch64}$") + echo "NXI_NXE_DPU_host_aarch64_file:"$NXI_NXE_DPU_host_aarch64_file + NXI_NXE_DPU_host_x86_file=$(ls ${ver_path}/os | grep "x86_${NXI_Host_CGS_kernel_X86}$") + echo "NXI_NXE_DPU_host_x86_file:"$NXI_NXE_DPU_host_x86_file + + # if [[ ${NXI_Host_CGS_kernel_aarch64} == ${DPU_Host_CGS_kernel_aarch64} ]] + # then + # echo "The values of NXI_Host_CGS_kernel_aarch64[${NXI_Host_CGS_kernel_aarch64}] and DPU_Host_CGS_kernel_aarch64[${DPU_Host_CGS_kernel_aarch64}] are equal." + # else + # echo "The values of NXI_Host_CGS_kernel_aarch64[${NXI_Host_CGS_kernel_aarch64}] and DPU_Host_CGS_kernel_aarch64[${DPU_Host_CGS_kernel_aarch64}] are not equal." + # DPU_host_aarch64_file=$(ls ${ver_path}/os | grep "aarch64_${DPU_Host_CGS_kernel_aarch64}$") + # echo "DPU_host_aarch64_file:"$DPU_Host_CGS_kernel_aarch64 + # DPU_host_x86_file=$(ls ${ver_path}/os | grep "x86_${DPU_Host_CGS_kernel_X86}$") + # echo "DPU_host_x86_file:"$DPU_Host_CGS_kernel_X86 + # fi + + DPU_zf_aarch64_file=$(ls ${ver_path}/os | grep "aarch64_${DPU_CGS_kernel_aarch64}$") + echo "DPU_zf_aarch64_file:"$DPU_zf_aarch64_file + + rm -rf /lib/modules/${NXI_NXE_DPU_host_aarch64_file} + rm -rf /lib/modules/${NXI_NXE_DPU_host_x86_file} + rm -rf /lib/modules/${DPU_zf_aarch64_file} + # mkdir -p /lib/modules/${kernel_file1} + # mkdir -p /lib/modules/${kernel_file2} + ln -s ${ver_path}/os/${NXI_NXE_DPU_host_aarch64_file} /lib/modules/${NXI_NXE_DPU_host_aarch64_file} + ln -s ${ver_path}/os/${NXI_NXE_DPU_host_x86_file} /lib/modules/${NXI_NXE_DPU_host_x86_file} + ln -s ${ver_path}/os/${DPU_zf_aarch64_file} /lib/modules/${DPU_zf_aarch64_file} + echo "*****************cat os dir*********************" + ls -l ${ver_path}/os + echo "*****************cat kernel dir*****************" + echo $NXI_NXE_DPU_host_aarch64_file + ls -ll /lib/modules/${NXI_NXE_DPU_host_aarch64_file}/ + echo $NXI_NXE_DPU_host_x86_file + ls -ll /lib/modules/${NXI_NXE_DPU_host_x86_file}/ + echo $DPU_zf_aarch64_file + ls -ll /lib/modules/${DPU_zf_aarch64_file}/ + echo "************************************************" + exit 0 +fi + +echo "unknow cmd" +exit 1 + + diff --git a/src/net/README b/src/net/compat/config.h old mode 100644 new mode 100755 similarity index 100% rename from src/net/README rename to src/net/compat/config.h diff --git a/src/net/compile.sh b/src/net/compile.sh new file mode 100755 index 0000000..c249b03 --- /dev/null +++ b/src/net/compile.sh @@ -0,0 +1,278 @@ +#!/bin/bash + +#接收参数 +compile_stage=$1 #四种取值:verifyci、gateci、postci、versionci +build_no=$2 +chg_no=$3 +rpm_ver_no="2.24.20.02" + + +#ver_path不变,各组件只需修改root_dir +ver_path=/zte +root_dir=$ver_path/zxdh_kernel + +if [ "$compile_stage" = "verifyci" ]; then + echo "start compileing kernel for verifyci" + + NXI_NXE_DPU_host_aarch64_file=$(ls /lib/modules/ | grep "aarch64_${NXI_Host_CGS_kernel_aarch64}$") + echo "NXI_NXE_DPU_host_aarch64_file:"$NXI_NXE_DPU_host_aarch64_file + NXI_NXE_DPU_host_x86_file=$(ls /lib/modules/ | grep "x86_${NXI_Host_CGS_kernel_X86}$") + echo "NXI_NXE_DPU_host_x86_file:"$NXI_NXE_DPU_host_x86_file + DPU_zf_aarch64_file=$(ls /lib/modules/ | grep "aarch64_${DPU_CGS_kernel_aarch64}$") + echo "DPU_zf_aarch64_file:"$DPU_zf_aarch64_file + + echo "start check x86 pf driver" + compile_path=${root_dir}/build + rm -f $compile_path/zxdh_kernel_compile.txt $compile_path/zxdh_kernel_compile_fail_result.txt + cd ${compile_path} + ./build.pl -t clean --ksrc /lib/modules/$NXI_NXE_DPU_host_x86_file + ./build.pl -t kernel --ksrc /lib/modules/$NXI_NXE_DPU_host_x86_file -m CONFIG_DINGHAI_ETH -m CONFIG_ZXDH_AUXILIARY -m CONFIG_DINGHAI_PF -m CONFIG_ZXDH_SF -m CONFIG_DINGHAI_EN_AUX -m HAVE_DEVLINK_ALLOC_GET_1_PARAMS -m HAVE_DEV_PM_DOMAIN_ATTACH -m HAVE_BUS_FIND_DEVICE_GET_CONST -m CONFIG_DINGHAI_DH_CMD -m CONFIG_DINGHAI_NP -m CONFIG_ZXDH_MSGQ -m CONFIG_ZXDH_1588 -m CONFIG_DINGHAI_PTP -m CONFIG_DINGHAI_TSN \ + >>$compile_path/zxdh_kernel_compile.txt 2>$compile_path/zxdh_kernel_compile_fail_result.txt + status=$? + echo "***************print x86 en_pf_compile.txt***************" + cat $compile_path/zxdh_kernel_compile.txt + #判断结果 + if [[ $status -ne 0 ]]; then + echo "The build failed. Check $compile_path/kernel_compile_fail_result.txt for details." + cat $compile_path/zxdh_kernel_compile_fail_result.txt + exit $status + fi + echo "x86 pf driver compile success" + + echo "start check x86 hpf driver" + compile_path=${root_dir}/build + rm -f $compile_path/zxdh_kernel_compile.txt $compile_path/zxdh_kernel_compile_fail_result.txt + cd ${compile_path} + ./build.pl -t clean --ksrc /lib/modules/$NXI_NXE_DPU_host_x86_file + ./build.pl -t kernel --ksrc /lib/modules/$NXI_NXE_DPU_host_x86_file -m CONFIG_DINGHAI_ETH -m CONFIG_DINGHAI_HPF -m CONFIG_DINGHAI_DH_CMD -m HAVE_DEVLINK_ALLOC_GET_1_PARAMS \ + >>$compile_path/zxdh_kernel_compile.txt 2>$compile_path/zxdh_kernel_compile_fail_result.txt + status=$? + echo "***************print x86 hpf_compile.txt***************" + cat $compile_path/zxdh_kernel_compile.txt + #判断结果 + if [[ $status -ne 0 ]]; then + echo "The build failed. Check $compile_path/kernel_compile_fail_result.txt for details." + cat $compile_path/zxdh_kernel_compile_fail_result.txt + exit $status + fi + echo "x86 hpf driver compile success" + + echo "start check arm zf_mpf driver" + compile_path=${root_dir}/build + rm -f $compile_path/zxdh_kernel_compile.txt $compile_path/zxdh_kernel_compile_fail_result.txt + cd ${compile_path} + ./build.pl -t clean --ksrc /lib/modules/$DPU_zf_aarch64_file + ./build.pl -t kernel --ksrc /lib/modules/$DPU_zf_aarch64_file \ + --cross_compile /opt/aarch64_cgslv6.01_gcc8.3.1_glibc2.28/bin/aarch64-pc-linux-gnu- \ + --target_arch aarch64 \ + -m CONFIG_DINGHAI_ZF_MPF -m PCIE_ZF_EPC_OPEN -m CONFIG_DINGHAI_ETH -m CONFIG_ZXDH_AUXILIARY -m CONFIG_ZXDH_SF -m HAVE_DEVLINK_ALLOC_GET_1_PARAMS -m HAVE_DEV_PM_DOMAIN_ATTACH -m HAVE_BUS_FIND_DEVICE_GET_CONST -m CONFIG_DINGHAI_DH_CMD -m CONFIG_ZF_GDMA \ + >>$compile_path/zxdh_kernel_compile.txt 2>$compile_path/zxdh_kernel_compile_fail_result.txt + status=$? + echo "***************print arm zf_mpf_compile.txt***************" + cat $compile_path/zxdh_kernel_compile.txt + #判断结果 + if [[ $status -ne 0 ]]; then + echo "The build failed. Check $compile_path/kernel_compile_fail_result.txt for details." + cat $compile_path/zxdh_kernel_compile_fail_result.txt + exit $status + fi + echo "arm zf_mpf driver compile success" + exit 0 + +fi + +if [ $compile_stage = "postci" ]; then + echo "start compileing kernel for postci" + + NXI_NXE_DPU_host_aarch64_file=$(ls /lib/modules/ | grep "aarch64_${NXI_Host_CGS_kernel_aarch64}$") + echo "NXI_NXE_DPU_host_aarch64_file:"$NXI_NXE_DPU_host_aarch64_file + NXI_NXE_DPU_host_x86_file=$(ls /lib/modules/ | grep "x86_${NXI_Host_CGS_kernel_X86}$") + echo "NXI_NXE_DPU_host_x86_file:"$NXI_NXE_DPU_host_x86_file + DPU_zf_aarch64_file=$(ls /lib/modules/ | grep "aarch64_${DPU_CGS_kernel_aarch64}$") + echo "DPU_zf_aarch64_file:"$DPU_zf_aarch64_file + + #打包 + mkdir -p $root_dir/kernel-src + cd $root_dir/kernel-src + rm -f *\.tgz + date=$(date +%Y%m%d%H%M%S) + version=${rpm_ver_no} + dri_version=${rpm_ver_no}-${date} + + pf_tgz_name=$root_dir/kernel-src/zxdh-eth-${version}-${date}.src.tgz + host_hpf_tgz_name=$root_dir/kernel-src/zxdh-neo-host-hpf-${version}-${date}.src.tgz + zf_mpf_tgz_name=$root_dir/kernel-src/zxdh-neo-mpf-${version}-${date}.src.tgz + tar czvf $pf_tgz_name --exclude=$root_dir/kernel-src $root_dir + result=$? + #判断结果 + if [[ $status -ne 0 ]]; then + echo "压缩源码失败." + exit $status + fi + cp $pf_tgz_name $host_hpf_tgz_name + cp $pf_tgz_name $zf_mpf_tgz_name + echo "查看压缩包" + ls + + #开始生成rpm包 + cd $root_dir + rm -f *\.rpm + echo "[NXI/NXE]交叉编译生成host-arm下的rpm包,使用[en_pf]源码" + ./zxdh_eth_rpm_build.sh \ + --ksrc /lib/modules/$NXI_NXE_DPU_host_aarch64_file \ + --cross-compile /opt/aarch64_cgslv6.01_gcc8.3.1_glibc2.28/bin/aarch64-pc-linux-gnu- \ + --target-arch aarch64 \ + --dist .cgsl${NXI_Host_CGS_kernel_aarch64:1} \ + --rpm-driver-version "${version}" --rpm-driver-release "${date}" \ + --rpm-config-version "${version}" --rpm-config-release "${date}" --rpm-config-name zxdh-dpu-config \ + --eth-driver-version "${dri_version}" + + echo "[NXI/NXE]生成host-x86下的rpm包,使用[en_pf]源码" + ./zxdh_eth_rpm_build.sh \ + --ksrc /lib/modules/$NXI_NXE_DPU_host_x86_file \ + --dist .cgsl${NXI_Host_CGS_kernel_X86:1} \ + --rpm-driver-version "${version}" --rpm-driver-release "${date}" \ + --rpm-config-version "${version}" --rpm-config-release "${date}" \ + --eth-driver-version "${dri_version}" + + echo "[DPU]交叉编译生成host-arm下的rpm包,使用[function_hotplug]源码" + ./zxdh_hpf_rpm_build.sh \ + --ksrc /lib/modules/$NXI_NXE_DPU_host_aarch64_file \ + --cross-compile /opt/aarch64_cgslv6.01_gcc8.3.1_glibc2.28/bin/aarch64-pc-linux-gnu- \ + --target-arch aarch64 \ + --dist .cgsl${NXI_Host_CGS_kernel_aarch64:1} \ + --rpm-driver-version "${version}" --rpm-driver-release "${date}" \ + --hpf-driver-version "${dri_version}" + + echo "[DPU]生成host-x86下的rpm包,使用[function_hotplug]源码" + ./zxdh_hpf_rpm_build.sh \ + --ksrc /lib/modules/$NXI_NXE_DPU_host_x86_file \ + --dist .cgsl${NXI_Host_CGS_kernel_X86:1} \ + --rpm-driver-version "${version}" --rpm-driver-release "${date}" \ + --hpf-driver-version "${dri_version}" + + echo "[DPU]交叉编译生成zf-arm下的rpm包,使用[en_pf]源码" + ./zxdh_eth_rpm_build.sh \ + --ksrc /lib/modules/$DPU_zf_aarch64_file \ + --cross-compile /opt/aarch64_cgslv6.01_gcc8.3.1_glibc2.28/bin/aarch64-pc-linux-gnu- \ + --target-arch aarch64 \ + --dist .cgsl${DPU_CGS_kernel_aarch64:1} \ + --rpm-driver-name "zxdh-eth" \ + --rpm-driver-version "${version}" --rpm-driver-release "${date}" \ + --rpm-config-version "${version}" --rpm-config-release "${date}" \ + --eth-driver-version "${dri_version}" + + echo "[DPU]生成zf-arm下的rpm包,使用[zf_mpf]源码" + ./zxdh_zf_mpf_rpm_build.sh \ + --ksrc /lib/modules/$DPU_zf_aarch64_file \ + --cross-compile /opt/aarch64_cgslv6.01_gcc8.3.1_glibc2.28/bin/aarch64-pc-linux-gnu- \ + --dist .cgsl${DPU_CGS_kernel_aarch64:1} \ + --rpm-driver-version "${version}" --rpm-driver-release "${date}" \ + --zf-mpf-driver-version "${dri_version}" + + #TODO + echo "查看全部rpm包" + ls + + exit 0 +fi + +if [ $compile_stage = "versionci" ]; then + echo "start compileing kernel for versionci" + + NXI_NXE_DPU_host_aarch64_file=$(ls /lib/modules/ | grep "aarch64_${NXI_Host_CGS_kernel_aarch64}$") + echo "NXI_NXE_DPU_host_aarch64_file:"$NXI_NXE_DPU_host_aarch64_file + NXI_NXE_DPU_host_x86_file=$(ls /lib/modules/ | grep "x86_${NXI_Host_CGS_kernel_X86}$") + echo "NXI_NXE_DPU_host_x86_file:"$NXI_NXE_DPU_host_x86_file + DPU_zf_aarch64_file=$(ls /lib/modules/ | grep "aarch64_${DPU_CGS_kernel_aarch64}$") + echo "DPU_zf_aarch64_file:"$DPU_zf_aarch64_file + + #打包 + mkdir -p $root_dir/kernel-src + cd $root_dir/kernel-src + rm -f *\.tgz + date=$(date +%Y%m%d%H%M%S) + version=${rpm_ver_no} + dri_version=${rpm_ver_no}-${date} + + pf_tgz_name=$root_dir/kernel-src/zxdh-eth-${version}-${date}-daily.src.tgz + host_hpf_tgz_name=$root_dir/kernel-src/zxdh-neo-host-hpf-${version}-${date}-daily.src.tgz + zf_mpf_tgz_name=$root_dir/kernel-src/zxdh-neo-mpf-${version}-${date}-daily.src.tgz + tar czvf $pf_tgz_name --exclude=$root_dir/kernel-src $root_dir + result=$? + #判断结果 + if [[ $status -ne 0 ]]; then + echo "压缩源码失败." + exit $status + fi + cp $pf_tgz_name $host_hpf_tgz_name + cp $pf_tgz_name $zf_mpf_tgz_name + echo "查看压缩包" + ls + + #开始生成rpm包 + cd $root_dir + rm -f *\.rpm + echo "[NXI/NXE]交叉编译生成host-arm下的rpm包,使用[en_pf]源码" + ./zxdh_eth_rpm_build.sh \ + --ksrc /lib/modules/$NXI_NXE_DPU_host_aarch64_file \ + --cross-compile /opt/aarch64_cgslv6.01_gcc8.3.1_glibc2.28/bin/aarch64-pc-linux-gnu- \ + --target-arch aarch64 \ + --dist .cgsl${NXI_Host_CGS_kernel_aarch64:1} \ + --rpm-driver-version "${version}" --rpm-driver-release "${date}" \ + --rpm-config-version "${version}" --rpm-config-release "${date}" --rpm-config-name zxdh-dpu-config \ + --eth-driver-version "${dri_version}" + + echo "[NXI/NXE]生成host-x86下的rpm包,使用[en_pf]源码" + ./zxdh_eth_rpm_build.sh \ + --ksrc /lib/modules/$NXI_NXE_DPU_host_x86_file \ + --dist .cgsl${NXI_Host_CGS_kernel_X86:1} \ + --rpm-driver-version "${version}" --rpm-driver-release "${date}" \ + --rpm-config-version "${version}" --rpm-config-release "${date}" \ + --eth-driver-version "${dri_version}" + + echo "[DPU]交叉编译生成host-arm下的rpm包,使用[function_hotplug]源码" + ./zxdh_hpf_rpm_build.sh \ + --ksrc /lib/modules/$NXI_NXE_DPU_host_aarch64_file \ + --cross-compile /opt/aarch64_cgslv6.01_gcc8.3.1_glibc2.28/bin/aarch64-pc-linux-gnu- \ + --target-arch aarch64 \ + --dist .cgsl${NXI_Host_CGS_kernel_aarch64:1} \ + --rpm-driver-version "${version}" --rpm-driver-release "${date}" \ + --hpf-driver-version "${dri_version}" + + echo "[DPU]生成host-x86下的rpm包,使用[function_hotplug]源码" + ./zxdh_hpf_rpm_build.sh \ + --ksrc /lib/modules/$NXI_NXE_DPU_host_x86_file \ + --dist .cgsl${NXI_Host_CGS_kernel_X86:1} \ + --rpm-driver-version "${version}" --rpm-driver-release "${date}" \ + --hpf-driver-version "${dri_version}" + + echo "[DPU]交叉编译生成zf-arm下的rpm包,使用[en_pf]源码" + ./zxdh_eth_rpm_build.sh \ + --ksrc /lib/modules/$DPU_zf_aarch64_file \ + --cross-compile /opt/aarch64_cgslv6.01_gcc8.3.1_glibc2.28/bin/aarch64-pc-linux-gnu- \ + --target-arch aarch64 \ + --dist .cgsl${DPU_CGS_kernel_aarch64:1} \ + --rpm-driver-name "zxdh-eth" \ + --rpm-driver-version "${version}" --rpm-driver-release "${date}" \ + --rpm-config-version "${version}" --rpm-config-release "${date}" \ + --eth-driver-version "${dri_version}" + + echo "[DPU]生成zf-arm下的rpm包,使用[zf_mpf]源码" + ./zxdh_zf_mpf_rpm_build.sh \ + --ksrc /lib/modules/$DPU_zf_aarch64_file \ + --cross-compile /opt/aarch64_cgslv6.01_gcc8.3.1_glibc2.28/bin/aarch64-pc-linux-gnu- \ + --dist .cgsl${DPU_CGS_kernel_aarch64:1} \ + --rpm-driver-version "${version}" --rpm-driver-release "${date}" \ + --zf-mpf-driver-version "${dri_version}" + + #TODO + echo "查看全部rpm包" + ls + exit 0 +fi + +if [ $compile_stage = "gateci" ]; then + echo "gateci compile success" + exit 0 +fi diff --git a/src/net/drivers/base/Makefile b/src/net/drivers/base/Makefile new file mode 100755 index 0000000..4f40a2e --- /dev/null +++ b/src/net/drivers/base/Makefile @@ -0,0 +1,6 @@ +subdir-ccflags-y += -I$(CWD)/include +subdir-ccflags-y += -include $(CWD)/autoconf.h +ccflags-y += -Werror + +obj-m += zxdh_auxiliary.o +zxdh_auxiliary-y += en_auxiliary.o \ No newline at end of file diff --git a/src/net/drivers/base/en_auxiliary.c b/src/net/drivers/base/en_auxiliary.c new file mode 100644 index 0000000..fb7232b --- /dev/null +++ b/src/net/drivers/base/en_auxiliary.c @@ -0,0 +1,368 @@ + +#ifdef pr_fmt +#undef pr_fmt +#endif + +#define pr_fmt(fmt) "%s:%s: " fmt, KBUILD_MODNAME, __func__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef CONFIG_COMPAT_AUXILIARY_EXTERNAL_INIT +#include "base.h" +#endif + + +static const struct zxdh_auxiliary_device_id *zxdh_auxiliary_match_id(const struct zxdh_auxiliary_device_id *id, + const struct zxdh_auxiliary_device *auxdev) +{ + for (; id->name[0]; id++) + { + const char *p = strrchr(dev_name(&auxdev->dev), '.'); + int32_t match_size; + + if (!p) + { + continue; + } + match_size = p - dev_name(&auxdev->dev); + + /* use dev_name(&auxdev->dev) prefix before last '.' char to match to */ + if (strlen(id->name) == match_size && + !strncmp(dev_name(&auxdev->dev), id->name, match_size)) + { + return id; + } + } + + return NULL; +} + +static int32_t zxdh_auxiliary_match(struct device *dev, struct device_driver *drv) +{ + struct zxdh_auxiliary_device *auxdev = zxdh_to_auxiliary_dev(dev); + struct zxdh_auxiliary_driver *auxdrv = zxdh_to_auxiliary_drv(drv); + + return !!zxdh_auxiliary_match_id(auxdrv->id_table, auxdev); +} + +static int32_t zxdh_auxiliary_uevent(struct device *dev, struct kobj_uevent_env *env) +{ + const char *name; + const char *p; + + name = dev_name(dev); + p = strrchr(name, '.'); + + return add_uevent_var(env, "MODALIAS=%s%.*s", ZXDH_AUXILIARY_MODULE_PREFIX, (int32_t)(p - name), name); +} + +static const struct dev_pm_ops zxdh_auxiliary_dev_pm_ops = { + SET_RUNTIME_PM_OPS(pm_generic_runtime_suspend, pm_generic_runtime_resume, NULL) + SET_SYSTEM_SLEEP_PM_OPS(pm_generic_suspend, pm_generic_resume) +}; + +static int32_t zxdh_auxiliary_bus_probe(struct device *dev) +{ + struct zxdh_auxiliary_driver *auxdrv = zxdh_to_auxiliary_drv(dev->driver); + struct zxdh_auxiliary_device *auxdev = zxdh_to_auxiliary_dev(dev); + int32_t ret = 0; + +#ifdef HAVE_DEV_PM_DOMAIN_ATTACH + ret = dev_pm_domain_attach(dev, true); + + /* In case of old kernels 4.17 and below do nothing in case of + * failure of ENODEV */ + if (ret == -ENODEV) + { + ret = 0; + } + + if (ret != 0) + { + LOG_WARN("Failed to attach to PM Domain : %d\n", ret); + return ret; + } +#else + acpi_dev_pm_attach(dev, true); +#endif + + ret = auxdrv->probe(auxdev, zxdh_auxiliary_match_id(auxdrv->id_table, auxdev)); + if (ret != 0) +#ifdef HAVE_DEV_PM_DOMAIN_ATTACH + dev_pm_domain_detach(dev, true); +#else + acpi_dev_pm_detach(dev, true); +#endif + + return ret; +} + +#ifdef HAVE_BUS_TYPE_REMOVE_RETURN_VOID +static void zxdh_auxiliary_bus_remove(struct device *dev) +#else +static int32_t zxdh_auxiliary_bus_remove(struct device *dev) +#endif +{ + struct zxdh_auxiliary_driver *auxdrv = zxdh_to_auxiliary_drv(dev->driver); + struct zxdh_auxiliary_device *auxdev = zxdh_to_auxiliary_dev(dev); + + if (auxdrv->remove) + { + auxdrv->remove(auxdev); + } +#ifdef HAVE_DEV_PM_DOMAIN_ATTACH + dev_pm_domain_detach(dev, true); +#else + acpi_dev_pm_detach(dev, true); +#endif + +#ifndef HAVE_BUS_TYPE_REMOVE_RETURN_VOID + return 0; +#endif +} + +static void zxdh_auxiliary_bus_shutdown(struct device *dev) +{ + struct zxdh_auxiliary_driver *auxdrv = NULL; + struct zxdh_auxiliary_device *auxdev = NULL; + + if (dev->driver) + { + auxdrv = zxdh_to_auxiliary_drv(dev->driver); + auxdev = zxdh_to_auxiliary_dev(dev); + } + + if (auxdrv && auxdrv->shutdown) + { + auxdrv->shutdown(auxdev); + } +} + +static struct bus_type zxdh_auxiliary_bus_type = { + .name = "zxdh_auxiliary", + .probe = zxdh_auxiliary_bus_probe, + .remove = zxdh_auxiliary_bus_remove, + .shutdown = zxdh_auxiliary_bus_shutdown, + .match = zxdh_auxiliary_match, + .uevent = zxdh_auxiliary_uevent, + .pm = &zxdh_auxiliary_dev_pm_ops, +}; + +/** + * zxdh_auxiliary_device_init - check zxdh_auxiliary_device and initialize + * @auxdev: auxiliary device struct + * + * This is the second step in the three-step process to register an + * zxdh_auxiliary_device. + * + * When this function returns an error code, then the device_initialize will + * *not* have been performed, and the caller will be responsible to free any + * memory allocated for the zxdh_auxiliary_device in the error path directly. + * + * It returns 0 on success. On success, the device_initialize has been + * performed. After this point any error unwinding will need to include a call + * to zxdh_auxiliary_device_uninit(). In this post-initialize error scenario, a call + * to the device's .release callback will be triggered, and all memory clean-up + * is expected to be handled there. + */ +int32_t zxdh_auxiliary_device_init(struct zxdh_auxiliary_device *auxdev) +{ + struct device *dev = &auxdev->dev; + + if (!dev->parent) + { + LOG_ERR("zxdh_auxiliary_device has a NULL dev->parent\n"); + return -EINVAL; + } + + if (!auxdev->name) + { + LOG_ERR("zxdh_auxiliary_device has a NULL name\n"); + return -EINVAL; + } + + dev->bus = &zxdh_auxiliary_bus_type; + device_initialize(&auxdev->dev); + + return 0; +} +EXPORT_SYMBOL_GPL(zxdh_auxiliary_device_init); + +/** + * zxdh_aux_dev_add - add an auxiliary bus device + * @auxdev: auxiliary bus device to add to the bus + * @modname: name of the parent device's driver module + * + * This is the third step in the three-step process to register an + * zxdh_auxiliary_device. + * + * This function must be called after a successful call to + * zxdh_auxiliary_device_init(), which will perform the device_initialize. This + * means that if this returns an error code, then a call to + * zxdh_auxiliary_device_uninit() must be performed so that the .release callback + * will be triggered to free the memory associated with the zxdh_auxiliary_device. + * + * The expectation is that users will call the "zxdh_auxiliary_device_add" macro so + * that the caller's KBUILD_MODNAME is automatically inserted for the modname + * parameter. Only if a user requires a custom name would this version be + * called directly. + */ +int32_t zxdh_aux_dev_add(struct zxdh_auxiliary_device *auxdev, const char *modname) +{ + struct device *dev = &auxdev->dev; + int32_t ret = 0; + + if (!modname) + { + LOG_ERR( "zxdh auxiliary device modname is NULL\n"); + return -EINVAL; + } + + ret = dev_set_name(dev, "%s.%s.%d", modname, auxdev->name, auxdev->id); + if (ret != 0) + { + LOG_ERR( "zxdh auxiliary device dev_set_name failed: %d\n", ret); + return ret; + } + + ret = device_add(dev); + if (ret != 0) + { + LOG_ERR( "adding zxdh auxiliary device failed!: %d\n", ret); + } + + return ret; +} +EXPORT_SYMBOL_GPL(zxdh_aux_dev_add); + +/** + * zxdh_auxiliary_find_device - auxiliary device iterator for locating a particular device. + * @start: Device to begin with + * @data: Data to pass to match function + * @match: Callback function to check device + * + * This function returns a reference to a device that is 'found' + * for later use, as determined by the @match callback. + * + * The reference returned should be released with put_device(). + * + * The callback should return 0 if the device doesn't match and non-zero + * if it does. If the callback returns non-zero, this function will + * return to the caller and not iterate over any more devices. + */ +#if defined(HAVE_LINUX_DEVICE_BUS_H) || defined(HAVE_BUS_FIND_DEVICE_GET_CONST) +struct zxdh_auxiliary_device * +zxdh_auxiliary_find_device(struct device *start, + const void *data, + int32_t (*match)(struct device *dev, const void *data)) +#else +struct zxdh_auxiliary_device * +zxdh_auxiliary_find_device(struct device *start, + void *data, + int32_t (*match)(struct device *dev, void *data)) +#endif /* HAVE_BUS_FIND_DEVICE_GET_CONST || HAVE_LINUX_DEVICE_BUS_H */ +{ + struct device *dev = NULL; + + dev = bus_find_device(&zxdh_auxiliary_bus_type, start, data, match); + if (dev == NULL) + { + return NULL; + } + + return zxdh_to_auxiliary_dev(dev); +} +EXPORT_SYMBOL_GPL(zxdh_auxiliary_find_device); + +/** + * zxdh_aux_drv_register - register a driver for auxiliary bus devices + * @auxdrv: zxdh_auxiliary_driver structure + * @owner: owning module/driver + * @modname: KBUILD_MODNAME for parent driver + * + * The expectation is that users will call the "zxdh_auxiliary_driver_register" + * macro so that the caller's KBUILD_MODNAME is automatically inserted for the + * modname parameter. Only if a user requires a custom name would this version + * be called directly. + */ +int32_t zxdh_aux_drv_register(struct zxdh_auxiliary_driver *auxdrv, + struct module *owner, const char *modname) +{ + int32_t ret = 0; + + if (WARN_ON(!auxdrv->probe) || WARN_ON(!auxdrv->id_table)) + { + return -EINVAL; + } + + if (auxdrv->name) + { + auxdrv->driver.name = kasprintf(GFP_KERNEL, "%s.%s", modname, auxdrv->name); + } + else + { + auxdrv->driver.name = kasprintf(GFP_KERNEL, "%s", modname); + } + if (!auxdrv->driver.name) + { + return -ENOMEM; + } + + auxdrv->driver.owner = owner; + auxdrv->driver.bus = &zxdh_auxiliary_bus_type; + auxdrv->driver.mod_name = modname; + + ret = driver_register(&auxdrv->driver); + if (ret) + { + kfree(auxdrv->driver.name); + } + + return ret; +} +EXPORT_SYMBOL_GPL(zxdh_aux_drv_register); + +/** + * zxdh_auxiliary_driver_unregister - unregister a driver + * @auxdrv: zxdh_auxiliary_driver structure + */ +void zxdh_auxiliary_driver_unregister(struct zxdh_auxiliary_driver *auxdrv) +{ + driver_unregister(&auxdrv->driver); + kfree(auxdrv->driver.name); +} +EXPORT_SYMBOL_GPL(zxdh_auxiliary_driver_unregister); + +#ifdef CONFIG_COMPAT_AUXILIARY_EXTERNAL_INIT +void __init zxdh_auxiliary_bus_init(void) +{ + WARN_ON(bus_register(&zxdh_auxiliary_bus_type)); +} +#else +static int32_t __init zxdh_auxiliary_bus_init(void) +{ + return bus_register(&zxdh_auxiliary_bus_type); +} + +static void __exit zxdh_auxiliary_bus_exit(void) +{ + bus_unregister(&zxdh_auxiliary_bus_type); +} + +module_init(zxdh_auxiliary_bus_init); +module_exit(zxdh_auxiliary_bus_exit); + +MODULE_LICENSE("GPL v2"); +MODULE_DESCRIPTION("Auxiliary Bus"); +MODULE_INFO(supported, "external"); +MODULE_AUTHOR("David Ertman "); +MODULE_AUTHOR("Kiran Patil "); +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/Kconfig b/src/net/drivers/net/ethernet/dinghai/Kconfig new file mode 100755 index 0000000..101de52 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/Kconfig @@ -0,0 +1,6 @@ +config DINGHAI_MPF + depends on PCI + select AUXILIARY_BUS + select NET_DEVLINK + help + DingHai Eth \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/Makefile b/src/net/drivers/net/ethernet/dinghai/Makefile new file mode 100755 index 0000000..2f40270 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/Makefile @@ -0,0 +1,71 @@ +subdir-ccflags-y += -I$(src) +subdir-ccflags-y += -I$(CWD)/include/ +subdir-ccflags-y += -include $(CWD)/autoconf.h +ccflags-y += -Werror + + +ifeq ($(CONFIG_ZXDH_MSGQ),m) +EXTRA_CFLAGS += -DZXDH_MSGQ +endif + +ifeq ($(CONFIG_DINGHAI_SEC),m) +EXTRA_CFLAGS += -DZXDH_SEC +endif + +ifeq ($(CONFIG_DRIVER_VERSION),) +EXTRA_CFLAGS += -DDRIVER_VERSION_VAL=\"1.0-1\" +$(info CONFIG_PF_MPF_DRIVER_VERSION is null, EXTRA_CFLAGS=$(EXTRA_CFLAGS)) +else +EXTRA_CFLAGS += -DDRIVER_VERSION_VAL=\"$(CONFIG_DRIVER_VERSION)\" +$(info CONFIG_PF_MPF_DRIVER_VERSION is not null, EXTRA_CFLAGS=$(EXTRA_CFLAGS)) +endif + +obj-$(CONFIG_DINGHAI_DH_CMD) += zxdh_cmd.o +zxdh_cmd-y := dh_cmd.o cmd/msg_main.o cmd/msg_chan_lock.o cmd/msg_chan_test.o + +obj-$(CONFIG_DINGHAI_MPF) += zxdh_mpf.o +zxdh_mpf-y := events.o eq.o en_mpf.o pci_irq.o en_mpf/irq.o en_mpf/events.o en_mpf/eq.o devlink.o \ + en_mpf/devlink.o en_mpf/cfg_sf.o +zxdh_mpf-$(CONFIG_ZXDH_SF) += irq_affinity.o en_sf.o en_sf/eq.o en_sf/irq.o en_sf/devlink.o + +obj-$(CONFIG_DINGHAI_ZF_MPF) += zxdh_zf_mpf.o + +ifdef PCIE_ZF_EPC_OPEN +zxdh_zf_mpf-y := events.o eq.o pci_irq.o devlink.o \ + zf_mpf/zf_mpf.o zf_mpf/zf_events.o zf_mpf/irq.o zf_mpf/eq.o zf_mpf/devlink.o zf_mpf/cfg_sf.o \ + zf_mpf/epc/pcie-zte-zf-epc.o zf_mpf/epc/pcie-zte-zf-hdma.o zf_mpf/epc/virt-dma.o zf_mpf/zxdh_reset_zf.o \ + zf_mpf/fuc_hotplug/fuc_hotplug_ioctl.o zf_mpf/fuc_hotplug/fuc_hotplug.o zf_mpf/zf_reset_finish_flag.o zf_mpf/zf_chan_ioctl.o +obj-m += zxdh_zf_epf.o +my_api-objs := zf_mpf/epc/pcie-zte-zf-epc.o +zxdh_zf_epf-y := zf_mpf/epf/pcie-zte-zf-epf.o +else +zxdh_zf_mpf-y := events.o eq.o pci_irq.o devlink.o \ + zf_mpf/zf_mpf.o zf_mpf/zf_events.o zf_mpf/irq.o zf_mpf/eq.o zf_mpf/devlink.o zf_mpf/cfg_sf.o zf_mpf/zxdh_reset_zf.o \ + zf_mpf/fuc_hotplug/fuc_hotplug_ioctl.o zf_mpf/fuc_hotplug/fuc_hotplug.o zf_mpf/zf_reset_finish_flag.o zf_mpf/zf_chan_ioctl.o +endif +zxdh_zf_mpf-$(CONFIG_ZXDH_SF) += irq_affinity.o en_sf.o en_sf/eq.o en_sf/irq.o en_sf/devlink.o +zxdh_zf_mpf-$(CONFIG_ZF_GDMA) += zf_mpf/gdma.o + +obj-$(CONFIG_DINGHAI_PF) += zxdh_pf.o +zxdh_pf-y := events.o en_pf.o eq.o pci_irq.o en_pf/irq.o en_pf/eq.o devlink.o en_pf/devlink.o en_pf/events.o \ + en_pf/msg_func.o dh_procfs.o lag/lag.o lag/lag_procfs.o plcr.o sriov_sysfs.o + +zxdh_pf-$(CONFIG_ZXDH_SF) += irq_affinity.o en_sf.o en_sf/eq.o en_sf/irq.o en_sf/devlink.o + +obj-$(CONFIG_DINGHAI_EN_AUX) += zxdh_en_aux.o +zxdh_en_aux-y := en_aux.o eq.o pci_irq.o irq_affinity.o en_aux/queue.o en_aux/en_cmd.o en_aux/eq.o \ + en_aux/events.o en_ethtool/ethtool.o en_aux/en_ioctl.o \ + en_aux/dcbnl/en_dcbnl.o en_aux/dcbnl/en_dcbnl_api.o \ + zxdh_tools/zxdh_tools_ioctl.o zxdh_tools/zxdh_tools_netlink.o +zxdh_en_aux-$(CONFIG_ZXDH_1588) += en_aux/en_1588_pkt_proc.o en_aux/en_1588_pkt_proc_func.o +zxdh_en_aux-$(CONFIG_DINGHAI_SEC) += en_aux/drs_sec_dtb.o +zxdh_en_aux-$(CONFIG_ZXDH_MSGQ) += en_aux/priv_queue.o + +obj-$(CONFIG_DINGHAI_PTP) += zxdh_ptp.o +zxdh_ptp-y :=en_ptp/tod_driver.o en_ptp/tod_driver_stub.o en_ptp/zxdh_ptp.o + +obj-$(CONFIG_DINGHAI_TSN) += zxdh_tsn.o +zxdh_tsn-y :=en_tsn/zxdh_tsn.o en_tsn/zxdh_tsn_reg.o en_tsn/zxdh_tsn_ioctl.o + +include $(CWD)/drivers/net/ethernet/dinghai/en_np/Makefile + diff --git a/src/net/drivers/net/ethernet/dinghai/cmd.c b/src/net/drivers/net/ethernet/dinghai/cmd.c new file mode 100755 index 0000000..a8e46fc --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/cmd.c @@ -0,0 +1,35 @@ +#include +#include +#include +#include + +static int32_t cmd_status_err(struct dh_core_dev *dev, int32_t err, uint16_t opcode, void *out) +{ + u8 status = DH_GET(mbox_out, out, status); + + return err; +} +static int32_t cmd_exec(struct dh_core_dev *dev, void *in, int32_t in_size, void *out, + int32_t out_size, zxdh_cmd_cbk_t callback, void *context, + bool force_polling) +{ + return 0; +} + +int32_t zxdh_cmd_do(struct dh_core_dev *dev, void *in, int32_t in_size, void *out, int32_t out_size) +{ + int32_t err = cmd_exec(dev, in, in_size, out, out_size, NULL, NULL, false); + uint16_t opcode = DH_GET(mbox_in, in, opcode); + + err = cmd_status_err(dev, err, opcode, out); + + return err; +} +EXPORT_SYMBOL(zxdh_cmd_do); + +int32_t zxdh_cmd_exec(struct dh_core_dev *dev, void *in, int32_t in_size, void *out, int32_t out_size) +{ + int32_t err = zxdh_cmd_do(dev, in, in_size, out, out_size); + + return zxdh_cmd_check(dev, err, in, out); +} \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/cmd/msg_chan_lock.c b/src/net/drivers/net/ethernet/dinghai/cmd/msg_chan_lock.c new file mode 100644 index 0000000..daf77d4 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/cmd/msg_chan_lock.c @@ -0,0 +1,179 @@ +#include +#include "msg_chan_lock.h" +#include "msg_chan_priv.h" +/***************************************** +[src/dst]时应该将消息发到硬件锁还是软件所 +src/dst: TO_RISC, TO_PFVF, TO_MPF +MPF: 1 1 1 +PF: 0 0 1 +VF: 0 0 1 +******************************************/ + +/*/PF0-7 DIRECT_CHNA/(PF0)VF0-VF32/(PF1)VF0-VF32/...*/ +struct mutex lock_array[LOCK_ARR_LENGTH] = {0}; + +uint8_t lock_type_tbl[BAR_MSG_SRC_NUM][BAR_MSG_DST_NUM] = +{ + {LOCK_TYPE_HARD, LOCK_TYPE_HARD, LOCK_TYPE_HARD}, + {LOCK_TYPE_SOFT, LOCK_TYPE_SOFT, LOCK_TYPE_HARD}, + {LOCK_TYPE_HARD, LOCK_TYPE_HARD, LOCK_TYPE_HARD} +}; + +/** + * pcieid_to_lockid - 将pcie_id转化成lock_id + * @src_pcieid: pcie_id + * @result: 软件数组的索引值 + */ +uint16_t pcieid_to_lockid(uint16_t src_pcieid, uint8_t dst) +{ + uint16_t lock_id = 0; + uint16_t pf_idx = 0; + uint16_t vf_idx = 0; + uint16_t ep_idx = 0; + + pf_idx = (src_pcieid & PCIEID_PF_IDX_MASK) >> PCIEID_PF_IDX_OFFSET; + vf_idx = (src_pcieid & PCIEID_VF_IDX_MASK); + ep_idx = (src_pcieid & PCIEID_EP_IDX_MASK) >> PCIEID_EP_IDX_OFFSET ; + switch (dst) + { + case MSG_CHAN_END_RISC: + { + if (src_pcieid & PCIEID_IS_PF_MASK) + { + lock_id = MULTIPLY_BY_8(ep_idx) + pf_idx; + } + else + { + lock_id = MULTIPLY_BY_256(ep_idx) + MULTIPLY_BY_32(pf_idx) + vf_idx + MULTIPLY_BY_32(1); + } + break; + } + case MSG_CHAN_END_VF: + { + lock_id = MULTIPLY_BY_8(ep_idx) + pf_idx + MULTIPLY_BY_32(1 + VF_NUM_PER_PF); + break; + } + case MSG_CHAN_END_PF: + { + lock_id = MULTIPLY_BY_8(ep_idx) + pf_idx + MULTIPLY_BY_32(2 + VF_NUM_PER_PF); + break; + } + default: + { + lock_id = 0; + break; + } + } + + if (lock_id >= LOCK_ARR_LENGTH) + { + lock_id = 0; + } + + return lock_id; +} + +void bar_soft_lock(uint16_t src_pcieid, uint8_t dst) +{ + uint16_t lockid = 0; + + lockid = pcieid_to_lockid(src_pcieid, dst); + mutex_lock(&lock_array[lockid]); +} + +void bar_soft_unlock(uint16_t src_pcieid, uint8_t dst) +{ + uint16_t lockid = 0; + + lockid = pcieid_to_lockid(src_pcieid, dst); + mutex_unlock(&lock_array[lockid]); +} + +void bar_hard_lock(void) +{ + return; +} + +void bar_hard_unlock(void) +{ + return; +} + +/** + * bar_init_lock_arr - 初始化软件锁数组 + * 在msg_chan模块初始化函数中调用软件锁初始化 + */ +void bar_init_lock_arr(void) +{ + int idx = 0; + + for (idx = 0; idx < ARR_LEN(lock_array); idx++) + { + mutex_init(&lock_array[idx]); + } +} + +/** + * bar_chan_lock - 通道上锁 + * @src: 消息源类型 + * @dst: 消息对端类型 + * @src_pcieid: 源pcieId + * @return: 0成功, 1失败 + */ +int bar_chan_lock(uint8_t src, uint8_t dst, uint16_t src_pcieid) +{ + uint16_t idx = 0; + uint8_t src_index = 0; + uint8_t dst_index = 0; + + src_index = bar_msg_row_index_trans(src); + dst_index = bar_msg_col_index_trans(dst); + if (src_index == BAR_MSG_SRC_ERR || dst_index == BAR_MSG_DST_ERR) + { + BAR_LOG_ERR("lock ERR: chan doesn't exist.\n"); + return BAR_MSG_ERR_TYPE; + } + idx = lock_type_tbl[src_index][dst_index]; + if (idx == LOCK_TYPE_SOFT) + { + bar_soft_lock(src_pcieid, dst); + } + else + { + bar_hard_lock(); + BAR_LOG_INFO("hard_lock.\n"); + } + return BAR_MSG_OK; +} + +/** + * bar_chan_lock - 通道解锁功能 + * @src: 消息源类型 + * @dst: 消息对端类型 + * @src_pcieid: 源pcieId + * @return: 0成功1失败 + */ +int bar_chan_unlock(uint8_t src, uint8_t dst, uint16_t src_pcieid) +{ + uint16_t idx = 0; + uint8_t src_index = 0; + uint8_t dst_index = 0; + + src_index = bar_msg_row_index_trans(src); + dst_index = bar_msg_col_index_trans(dst); + if (src_index == BAR_MSG_SRC_ERR || dst_index == BAR_MSG_DST_ERR) + { + BAR_LOG_ERR("unlock ERR: chan doesn't exist.\n"); + return BAR_MSG_ERR_TYPE; + } + idx = lock_type_tbl[src_index][dst_index]; + if (idx == LOCK_TYPE_SOFT) + { + bar_soft_unlock(src_pcieid, dst); + } + else + { + bar_hard_unlock(); + } + return BAR_MSG_OK; +} \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/cmd/msg_chan_lock.h b/src/net/drivers/net/ethernet/dinghai/cmd/msg_chan_lock.h new file mode 100644 index 0000000..beea9b0 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/cmd/msg_chan_lock.h @@ -0,0 +1,48 @@ +#ifndef _ZXDH_MSG_CHAN_LOCK_H_ +#define _ZXDH_MSG_CHAN_LOCK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#define ARR_LEN(arr) (sizeof(arr)/sizeof(arr[0])) + +/* PCIEID位域掩码*/ +#define PCIEID_IS_PF_MASK (0x0800) +#define PCIEID_PF_IDX_MASK (0x0700) +#define PCIEID_VF_IDX_MASK (0x00ff) +#define PCIEID_EP_IDX_MASK (0x7000) +#define PF0_PCIEID (0x0800) + +/* PCIEID位域偏移*/ +#define PCIEID_PF_IDX_OFFSET (8) +#define PCIEID_EP_IDX_OFFSET (12) + + + + +/* 硬件锁软件锁*/ +#define LOCK_TYPE_HARD 0 +#define LOCK_TYPE_SOFT 0 + +#define MAX_EP_NUM 4 +#define PF_NUM_PER_EP 8 +#define VF_NUM_PER_PF 32 + +#define MULTIPLY_BY_8(x) ((x) << 3) +#define MULTIPLY_BY_32(x) ((x) << 5) +#define MULTIPLY_BY_256(x) ((x) << 8) + +#define LOCK_ARR_LENGTH (MAX_EP_NUM * PF_NUM_PER_EP * (3 + VF_NUM_PER_PF)) + +void bar_init_lock_arr(void); + +int bar_chan_lock(uint8_t src, uint8_t dst, uint16_t src_pcieid); + +int bar_chan_unlock(uint8_t src, uint8_t dst, uint16_t src_pcieid); + +#ifdef __cplusplus +} +#endif + +#endif /* _ZXDH_MSG_CHAN_LOCK_H_ */ diff --git a/src/net/drivers/net/ethernet/dinghai/cmd/msg_chan_priv.h b/src/net/drivers/net/ethernet/dinghai/cmd/msg_chan_priv.h new file mode 100644 index 0000000..1533ef5 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/cmd/msg_chan_priv.h @@ -0,0 +1,294 @@ +#ifndef _ZXDH_MSG_CHAN_PRIV_H_ +#define _ZXDH_MSG_CHAN_PRIV_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include +/* */ +#define BAR_KFREE_PTR(ptr) { \ + if (ptr != NULL) \ + { \ + kfree(ptr); \ + } \ + ptr = NULL; \ +} + +#define BAR_LOG_ERR(fmt, arg...) DH_LOG_ERR(MODULE_CMD, fmt, ##arg); +#define BAR_LOG_INFO(fmt, arg...) DH_LOG_INFO(MODULE_CMD, fmt, ##arg); +#define BAR_LOG_DEBUG(fmt, arg...) DH_LOG_DEBUG(MODULE_CMD, fmt, ##arg); +#define BAR_LOG_WARN(fmt, arg...) DH_LOG_WARNING(MODULE_CMD, fmt, ##arg); + +#define HOST_OR_ZX 0 + +#define MAX_MSG_BUFF_NUM 0xffff + +#define BAR_ALIGN_WORD_MASK 0xffffffc +#define BAR_MSG_ADDR_CHAN_INTERVAL (1024*2) + +/* 消息类型*/ +#define BAR_CHAN_MSG_SYNC 0 +#define BAR_CHAN_MSG_ASYNC 1 +#define BAR_CHAN_MSG_NO_EMEC 0 +#define BAR_CHAN_MSG_EMEC 1 +#define BAR_CHAN_MSG_NO_ACK 0 +#define BAR_CHAN_MSG_ACK 1 + +/* payload, valid和内容的偏移*/ +#define BAR_MSG_PLAYLOAD_OFFSET (sizeof(struct bar_msg_header)) +#define BAR_MSG_LEN_OFFSET 2 +#define BAR_MSG_VALID_OFFSET 0 + +/* valid字段的掩码*/ +#define BAR_MSG_VALID_MASK 1 + +/* reps_buff的偏移*/ +#define REPS_HEADER_VALID_OFFSET 0 +#define REPS_HEADER_LEN_OFFSET 1 +#define REPS_HEADER_PAYLOAD_OFFSET 4 + +#define REPS_HEADER_REPLYED 0xff + +/* 通道状态*/ +#define BAR_MSG_CHAN_USABLE 0 +#define BAR_MSG_CHAN_USED 1 + +/* 超时时间 = 100 us *30000次轮询 = 3s*/ +#define BAR_MSG_POLLING_SPAN_US 100 +#define BAR_MSG_TIMEOUT_TH 30000 + +/* vf,pf,mpf总数*/ +#define BAR_DRIVER_TOTAL_NUM (BAR_MPF_NUM + BAR_PF_NUM + BAR_VF_NUM) + +/* bar的通道偏移*/ +#define BAR_INDEX_TO_RISC 0 +#define BAR_MPF_NUM 1 + +/* 定时器周期宏*/ +#define BAR_MSGID_FREE_THRESHOLD (jiffies + msecs_to_jiffies(2000)) + +/* 管理pf信息*/ +#define BAR_MSG_OFFSET (0x2000) +#define MPF_VENDOR_ID (0x16c3) +#define MPF_DEVICE_ID (0x8045) + +enum { + TYPE_SEND_NP = 0x0, + TYPE_SEND_DRS = 0x01, + TYPE_SEND_DTP = 0x10, + TYPE_END, +}; + +/************************************************************************** + * common.ko会工作在5中场景,不同场景每个mpf/pf/vf可以看到的bar不一样 + * 1、DPU场景下的host中:SCENE_HOST_IN_DPU + * 2、DPU场景下的ZF中: SCENE_ZF_IN_DPU + * 3、智能网卡带ddr: SCENE_NIC_WITH_DDR + * 4、智能网卡不带ddr: SCENE_NIC_NO_DDR + * 5、普卡: SCENE_STD_NIC +**************************************************************************/ +#define SCENE_TEST + +#ifdef SCENE_HOST_IN_DPU +#define BAR_PF_NUM 31 +#define BAR_VF_NUM 1024 +#define BAR_INDEX_PF_TO_VF 1 +#define BAR_INDEX_MPF_TO_MPF 1 +#define BAR_INDEX_MPF_TO_PFVF 0xff +#define BAR_INDEX_PFVF_TO_MPF 0xff +#endif + +#ifdef SCENE_ZF_IN_DPU +#define BAR_PF_NUM 7 +#define BAR_VF_NUM 128 +#define BAR_INDEX_PF_TO_VF 0xff +#define BAR_INDEX_MPF_TO_MPF 1 +#define BAR_INDEX_MPF_TO_PFVF 0xff +#define BAR_INDEX_PFVF_TO_MPF 0xff +#endif + +#ifdef SCENE_NIC_WITH_DDR +#define BAR_PF_NUM 31 +#define BAR_VF_NUM 1024 +#define BAR_INDEX_PF_TO_VF 1 +#define BAR_INDEX_MPF_TO_MPF 0xff +#define BAR_INDEX_MPF_TO_PFVF 0xff +#define BAR_INDEX_PFVF_TO_MPF 0xff +#endif + +#ifdef SCENE_NIC_NO_DDR +#define BAR_PF_NUM 31 +#define BAR_VF_NUM 1024 +#define BAR_INDEX_PF_TO_VF 1 +#define BAR_INDEX_MPF_TO_MPF 0xff +#define BAR_INDEX_MPF_TO_PFVF 1 +#define BAR_INDEX_PFVF_TO_MPF 2 +#endif + +#ifdef SCENE_STD_NIC +#define BAR_PF_NUM 7 +#define BAR_VF_NUM 256 +#define BAR_INDEX_PF_TO_VF 1 +#define BAR_INDEX_MPF_TO_MPF 0xff +#define BAR_INDEX_MPF_TO_PFVF 1 +#define BAR_INDEX_PFVF_TO_MPF 2 +#endif + +#ifdef SCENE_TEST +#define BAR_PF_NUM 7 +#define BAR_VF_NUM 256 +#define BAR_INDEX_PF_TO_VF 0 +#define BAR_INDEX_MPF_TO_MPF 0xff +#define BAR_INDEX_MPF_TO_PFVF 0 +#define BAR_INDEX_PFVF_TO_MPF 0 +#endif + +/* 左边通道还是右边通道*/ +#define BAR_SUBCHAN_INDEX_SEND 0 +#define BAR_SUBCHAN_INDEX_RECV 1 + +/* 消息源索引*/ +#define BAR_MSG_SRC_NUM 3 +#define BAR_MSG_SRC_MPF 0 +#define BAR_MSG_SRC_PF 1 +#define BAR_MSG_SRC_VF 2 +#define BAR_MSG_SRC_ERR 0xff + +/* 消息目的索引*/ +#define BAR_MSG_DST_NUM 3 +#define BAR_MSG_DST_RISC 0 +#define BAR_MSG_DST_MPF 2 +#define BAR_MSG_DST_PFVF 1 +#define BAR_MSG_DST_ERR 0xff + +/* msg_id项标志位状态*/ +#define REPS_INFO_FLAG_USABLE 0 +#define REPS_INFO_FLAG_USED 1 + +#define BAR_MSG_PAYLOAD_MAX_LEN (BAR_MSG_ADDR_CHAN_INTERVAL - sizeof(struct bar_msg_header)) + +#define BAR_MSG_POL_MASK (0x10) +#define BAR_MSG_POL_OFFSET (4) + +enum { + CHECK_STATE_OK = 0, + CHECK_STATE_EVENT_EXCEED = 1, + CHECK_STATE_EVENT_NOT_EXIST = 2, + CHECK_STATE_EVENT_ERR_RET = 4, + CHECK_STATE_EVENT_ERR_REPS_LEN = 5, +}; + +struct zxdh_pcie_bar_msg_internal +{ + uint32_t id; /**< the msg id that passing through */ + uint64_t virt_addr; /**< pcie bar mapping virtual addr */ +}; + +/* bar通道消息头 */ +struct bar_msg_header +{ + uint8_t valid: 1; /* 消息通道状态 */ + uint8_t sync: 1; /* 同步消息or异步消息*/ + uint8_t emec: 1; /* 消息是否紧急 */ + uint8_t ack: 1; /* 是否是回复消息*/ + uint8_t poll: 1; + uint8_t check; + uint16_t event_id; /* 请求的消息处理函数标识 */ + uint16_t len; /* 消息长度 */ + uint16_t msg_id; /* 消息id*/ + uint16_t src_pcieid; + uint16_t dst_pcieid; /* 用于pf给vf发消息*/ +}; + +/* 根据消息的msgid查询回复缓存的地址和长度*/ +struct msgid_reps_info +{ + void *reps_buffer; /* reps的地址*/ + uint16_t id; /* msg_id*/ + uint16_t buffer_len; /* buffer的最大长度*/ + uint16_t flag; /* 该条目是否被分配,已经非配和未被分配*/ + struct timer_list id_timer; /* 该id对应的定时器*/ +}; + +struct msix_msg +{ + uint16_t pcie_id; + uint16_t vector_risc; + uint16_t vector_pfvf; + uint16_t vector_mpf; +}; +struct offset_get_msg +{ + uint16_t pcie_id; + uint16_t type; +}; + +struct bar_offset_reps +{ + uint16_t check; + uint16_t rsv; + uint32_t offset; + uint32_t length; +}__attribute__((packed)); + +struct bar_recv_msg +{ + uint8_t replied; + uint16_t reps_len; + uint8_t rsv1; + union + { + struct bar_offset_reps offset_reps; + uint8_t data[BAR_MSG_PAYLOAD_MAX_LEN - 4]; + }; +}__attribute__((packed)); + +struct msgid_ring +{ + uint16_t msg_id; + spinlock_t lock; + struct msgid_reps_info reps_info_tbl[MAX_MSG_BUFF_NUM]; +}; + +/* 异步消息相关实体*/ +struct async_msg_entity +{ + struct task_struct *async_proc; /* 异步队列消息线程*/ + struct mutex async_qlock; /* 易怒队列入队锁*/ + struct bar_async_node *noemq_head; /* 非紧急队列头*/ + struct bar_async_node *noemq_tail; /* 非紧急队列尾部*/ + struct bar_async_node *emq_head; /* 紧急队列头*/ + struct bar_async_node *emq_tail; /* 紧急队列尾部*/ +}; + +/* 异步消息队列节点*/ +struct bar_async_node +{ + uint32_t msg_id; + void *payload_addr; /**< 消息净荷起始地址,有用户创建并填充 */ + uint64_t payload_len; /**< 消息净荷长度. */ + uint64_t subchan_addr; /**< 消息发送到哪个2K, 由virt_addr, src, dst共同决定,计算交给common来做>**/ + uint32_t event_id; /**< 消息发送模块,描述消息哪个模块发送 */ + uint16_t src_pcieid; + uint16_t dst_pcieid; /**< 消息目的的bdf号,适用于PF与VF公用4K的时候用>**/ + uint16_t emec; /**< 消息紧急类型,异步消息可以分为紧急消息和非紧急消息>**/ + uint16_t ack; + uint8_t src; + uint8_t dst; + struct bar_async_node *next; +}; + +uint8_t bar_msg_col_index_trans(uint8_t dst); +uint8_t bar_msg_row_index_trans(uint8_t src); + +#ifdef __cplusplus +} +#endif + +#endif /* _ZXDH_MSG_CHAN_PRIV_H_ */ diff --git a/src/net/drivers/net/ethernet/dinghai/cmd/msg_chan_test.c b/src/net/drivers/net/ethernet/dinghai/cmd/msg_chan_test.c new file mode 100644 index 0000000..1de7b52 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/cmd/msg_chan_test.c @@ -0,0 +1,148 @@ +#include +#include +#include +#include +#include +#include +#include +#include "cmd/msg_chan_priv.h" + +#ifdef BAR_MSG_TEST + +/*计算方法: risc时间戳 - host时间戳*/ +#define HOST_RISC_DIFF (307762) + +uint64_t print_time(char *str) +{ + ktime_t kt = ktime_get(); + s64 us_since_boot = ktime_to_us(kt); + LOG_INFO(KERN_INFO "%s timestamp: %llu us\n", str, us_since_boot); + return us_since_boot; +} +struct msg_time_statis_reps +{ + uint16_t sum_check; + + uint64_t risc_recv_msg_t; + uint64_t risc_push_msg_t; + uint64_t risc_pop_msg_t; + uint64_t risc_msg_proc_t; + uint64_t risc_notice_peer_t; +} __attribute__((packed)); + +struct msg_time_host_risc +{ + uint64_t host_send_msg_t; + uint64_t host_recv_msg_t; + struct msg_time_statis_reps risc_time; +}__attribute__((packed)); + +struct msg_time_host_risc global_time_stat = {0}; + +void print_risc_time_stamp(struct msg_time_host_risc *stat) +{ +#if 0 + LOF_INFO("host_send_msg_t: %llu us.\n", stat->host_send_msg_t); + LOF_INFO("risc_recv_msg_t: %llu us.\n", stat->risc_time.risc_recv_msg_t); + LOF_INFO("risc_push_msg_t: %llu us.\n", stat->risc_time.risc_push_msg_t); + LOF_INFO("risc_pop_msg_t: %llu us.\n", stat->risc_time.risc_pop_msg_t); + LOF_INFO("risc_msg_proc_t: %llu us.\n", stat->risc_time.risc_msg_proc_t); + LOF_INFO("risc_notice_peer_t: %llu us.\n", stat->risc_time.risc_notice_peer_t); + LOF_INFO("host_recv_msg_t: %llu us.\n", stat->host_recv_msg_t); +#endif + LOG_INFO("risc recv->msg push: %llu us.\n", stat->risc_time.risc_push_msg_t - stat->risc_time.risc_recv_msg_t); + LOG_INFO("risc push->risc pop: %llu us.\n", stat->risc_time.risc_pop_msg_t - stat->risc_time.risc_push_msg_t); + LOG_INFO("risc pop->before proc : %llu us.\n", stat->risc_time.risc_msg_proc_t- stat->risc_time.risc_pop_msg_t); + LOG_INFO("after proc->risc set valid: %llu us.\n", stat->risc_time.risc_notice_peer_t - stat->risc_time.risc_msg_proc_t); +} + +uint16_t sum_func(void *data, uint16_t len) +{ + uint64_t result = 0; + int idx = 0; + uint16_t ret = 0; + + if (data == NULL) + { + return 0; + } + + for (idx = 0; idx < len; idx++) + { + result += *((uint8_t *)data + idx); + } + + ret = (uint16_t)result; + return ret; +} + +uint16_t test_sync_send(void) +{ + struct zxdh_pci_bar_msg in = {0}; + struct zxdh_msg_recviver_mem result = {0}; + uint16_t payload_len = 0; + uint64_t bar_base_addr = 0; + void *payload_addr = NULL; + uint8_t recv_buffer[200] = {0}; + uint16_t reps = 0; + uint16_t ret = 0; + + payload_len = 100; + payload_addr = kmalloc(payload_len, GFP_KERNEL); + if (!payload_addr) + { + LOG_ERR("malloca failed"); + return 0xaa; + } + get_random_bytes(payload_addr, payload_len); + LOG_INFO("sync send msg len: %x", payload_len); + + in.src_pcieid = 0x900; + in.virt_addr = 0; + in.payload_addr = payload_addr; + in.payload_len = payload_len; + in.src = MSG_CHAN_END_MPF; + in.dst = MSG_CHAN_END_RISC; + in.event_id = 50; + + /* 构造result接收参数*/ + result.recv_buffer = recv_buffer; + result.buffer_len = sizeof(recv_buffer); + + /* 调用发送接口*/ + LOG_INFO("start to sync send test."); + global_time_stat.host_send_msg_t = print_time("before send.") + HOST_RISC_DIFF; + ret = zxdh_bar_chan_sync_msg_send(&in, &result); + global_time_stat.host_recv_msg_t = print_time("after send.") + HOST_RISC_DIFF; + + if (ret != BAR_MSG_OK) + { + LOG_ERR("sync send failed"); + ret = 0xAA; + goto out; + } + + struct msg_time_statis_reps *reps_ptr = (struct msg_time_statis_reps*)((uint8_t *)result.recv_buffer + 4); + if (reps_ptr->sum_check == sum_func(payload_addr, payload_len)) + { + memcpy(&global_time_stat.risc_time, (void*)reps_ptr, sizeof(struct msg_time_statis_reps)); + print_risc_time_stamp(&global_time_stat); + ret = 0; + LOG_ERR("reps validate success: %d", reps); + goto out; + } + else + { + LOG_ERR("reps valide failed: %d", reps); + ret = 0xAA; + } + +out: + if (!payload_addr) + { + kfree(payload_addr); + payload_addr = NULL; + } + return ret; +} +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/cmd/msg_chan_ver.h b/src/net/drivers/net/ethernet/dinghai/cmd/msg_chan_ver.h new file mode 100644 index 0000000..b3575d2 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/cmd/msg_chan_ver.h @@ -0,0 +1,16 @@ +#ifndef _ZXDH_MSG_CHAN_VERSION_H_ +#define _ZXDH_MSG_CHAN_VERSION_H_ + +#ifdef DRIVER_VERSION_VAL + #define DRV_VERSION DRIVER_VERSION_VAL +#else + #define DRV_VERSION "1.0-1" +#endif + +#define DRV_RELDATE "December 1, 2022" +#define DRV_NAME "msg_chan" +#define DRV_DESCRIPTION "DPU MSG Channel Driver" + +#define hbond_version DRV_DESCRIPTION ": v" DRV_VERSION " (" DRV_RELDATE ")\n" + +#endif /* _ZXDH_MSG_CHAN_VERSION_H_ */ \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/cmd/msg_main.c b/src/net/drivers/net/ethernet/dinghai/cmd/msg_main.c new file mode 100644 index 0000000..599e6e5 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/cmd/msg_main.c @@ -0,0 +1,31 @@ +#include +#include +#include + +#include "msg_chan_ver.h" +#include "msg_chan_priv.h" + +static int __init msg_chan_init(void) +{ + BAR_LOG_INFO("%s init. version %s\n", DRV_DESCRIPTION, DRV_VERSION); + zxdh_bar_msg_chan_init(); + +#ifdef TEST + BAR_TestApp(); +#endif + + return 0; +} + +static void __exit msg_chan_exit(void) +{ + zxdh_bar_msg_chan_remove(); + BAR_LOG_INFO("%s exit.\n", DRV_DESCRIPTION); +} + +module_init(msg_chan_init); +module_exit(msg_chan_exit); +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_VERSION(DRV_VERSION); +MODULE_DESCRIPTION(DRV_DESCRIPTION ", v" DRV_VERSION); +MODULE_AUTHOR("ZTE Corporation"); diff --git a/src/net/drivers/net/ethernet/dinghai/devlink.c b/src/net/drivers/net/ethernet/dinghai/devlink.c new file mode 100755 index 0000000..f244c90 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/devlink.c @@ -0,0 +1,50 @@ +#include +#include + +#ifdef HAVE_DEVLINK_REGISTER_GET_1_PARAMS + int32_t zxdh_devlink_register(struct devlink *devlink) +#else + int32_t zxdh_devlink_register(struct devlink *devlink, struct device *dev) +#endif +{ + struct dh_core_dev *dh_dev = devlink_priv(devlink); + int32_t err = 0; + +#ifdef HAVE_DEVLINK_REGISTER_GET_1_PARAMS + devlink_register(devlink); +#else + devlink_register(devlink, dev); +#endif + + err = dh_dev->devlink_ops->params_register(devlink); + if (err != 0) + { + LOG_ERR("params_register failed: %d\n", err); + return err; + } + + return err; +} + +struct devlink *zxdh_devlink_alloc(struct device *dev, struct devlink_ops *dh_devlink_ops, size_t priv_size) +{ +#ifdef HAVE_DEVLINK_ALLOC_GET_1_PARAMS + return devlink_alloc(dh_devlink_ops, sizeof(struct dh_core_dev) + priv_size); +#else + return devlink_alloc(dh_devlink_ops, sizeof(struct dh_core_dev) + priv_size, dev); +#endif +} + +void zxdh_devlink_free(struct devlink *devlink) +{ + devlink_free(devlink); +} + +void zxdh_devlink_unregister(struct devlink *devlink) +{ + struct dh_core_dev *dev = devlink_priv(devlink); + + dev->devlink_ops->params_unregister(devlink); + + devlink_unregister(devlink); +} diff --git a/src/net/drivers/net/ethernet/dinghai/dh_cmd.c b/src/net/drivers/net/ethernet/dinghai/dh_cmd.c new file mode 100644 index 0000000..704cf4a --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/dh_cmd.c @@ -0,0 +1,1208 @@ +#include +#include +#include +#include +#include +#include +#include "cmd/msg_chan_priv.h" +#include "cmd/msg_chan_lock.h" +#include "en_aux/en_cmd.h" +#include "msg_common.h" + +/***************************************** +[src/dst]时应该将消息发到低2k(0)还是高2K(1) +src/dst: TO_RISC, TO_PFVF, TO_MPF +MPF: 0 0 0 +PF: 0 0 1 +VF: 0 1 1 +******************************************/ +uint8_t subchan_id_tbl[BAR_MSG_SRC_NUM][BAR_MSG_DST_NUM] = +{ + {BAR_SUBCHAN_INDEX_SEND, BAR_SUBCHAN_INDEX_SEND, BAR_SUBCHAN_INDEX_SEND}, + {BAR_SUBCHAN_INDEX_SEND, BAR_SUBCHAN_INDEX_SEND, BAR_SUBCHAN_INDEX_RECV}, + {BAR_SUBCHAN_INDEX_SEND, BAR_SUBCHAN_INDEX_RECV, BAR_SUBCHAN_INDEX_RECV} +}; + +uint8_t chan_id_tbl[BAR_MSG_SRC_NUM][BAR_MSG_DST_NUM] = +{ + {BAR_INDEX_TO_RISC, BAR_INDEX_MPF_TO_PFVF, BAR_INDEX_MPF_TO_MPF}, + {BAR_INDEX_TO_RISC, BAR_INDEX_PF_TO_VF, BAR_INDEX_PFVF_TO_MPF}, + {BAR_INDEX_TO_RISC, BAR_INDEX_PF_TO_VF, BAR_INDEX_PFVF_TO_MPF} +}; + +void *internal_addr; + +bool is_mpf_scaned = FALSE; + +static struct msgid_ring g_msgid_ring; + +/* 消息处理函数表*/ +zxdh_bar_chan_msg_recv_callback msg_recv_func_tbl[MSG_MODULE_NUM]; + +void bar_chan_check_chan_stats(int ret, uint64_t addr) +{ + struct bar_msg_header *hdr = (struct bar_msg_header*)addr; + + if (ret == 0) + { + return; + } + /* check bar msg_header*/ + BAR_LOG_ERR("bar msg err, ret: %d, valid: %u, msg_id: %u, event_id: %u, " + "ack: %u, src_pcieid: 0x%x, dst_pcieid: 0x%x, chan_addr: 0x%llx.\n", + ret, hdr->valid, hdr->msg_id, hdr->event_id, hdr->ack, hdr->src_pcieid, hdr->dst_pcieid, addr); +} + +uint16_t bar_msg_src_parse(struct zxdh_pci_bar_msg *in) +{ + if (in == NULL) + { + return BAR_MSG_ERR_NULL; + } + + if (in->src == MSG_CHAN_END_MPF) + { + if (!is_mpf_scaned) + { + return BAR_MSG_ERR_MPF_NOT_SCANED; + } + in->virt_addr = (uint64_t)internal_addr + BAR_MSG_OFFSET; + in->src_pcieid = PF0_PCIEID; + } + return BAR_MSG_OK; +} + +void bar_chan_sync_fill_header(uint32_t msg_id, struct zxdh_pci_bar_msg *in, struct bar_msg_header *msg_header) +{ + memset(msg_header, 0, sizeof(*msg_header)); + msg_header->sync = BAR_CHAN_MSG_SYNC; + msg_header->event_id = in->event_id; + msg_header->len = in->payload_len; + msg_header->msg_id = msg_id; + msg_header->dst_pcieid = in->dst_pcieid; + msg_header->src_pcieid = in->src_pcieid; +} + +int bar_chan_msgid_allocate(uint16_t *msgid) +{ + int ret = BAR_MSG_OK; + uint16_t msg_id = 0; + struct msgid_reps_info *msgid_reps_info = NULL; + uint16_t count = 0; + + spin_lock(&g_msgid_ring.lock); + msg_id = g_msgid_ring.msg_id; + do + { + count++; + ++msg_id; + msg_id %= MAX_MSG_BUFF_NUM; + msgid_reps_info = &g_msgid_ring.reps_info_tbl[msg_id]; + + }while(msgid_reps_info->flag != REPS_INFO_FLAG_USABLE && (count < MAX_MSG_BUFF_NUM)); + + if (count >= MAX_MSG_BUFF_NUM) + { + ret = -1; + goto out; + } + + msgid_reps_info->flag = REPS_INFO_FLAG_USED; + g_msgid_ring.msg_id = msg_id; + *msgid = msg_id; + +out: + spin_unlock(&g_msgid_ring.lock); + return ret; +} + +uint16_t bar_chan_save_recv_info(struct zxdh_msg_recviver_mem *result, uint16_t *msg_id) +{ + int ret = 0; + struct msgid_reps_info *reps_info = NULL; + + ret = bar_chan_msgid_allocate(msg_id); + if (ret == -1) + { + return BAR_MSG_ERR_MSGID; + } + reps_info = &g_msgid_ring.reps_info_tbl[*msg_id]; + reps_info->reps_buffer = result->recv_buffer; + reps_info->buffer_len = result->buffer_len; + + return BAR_MSG_OK; +} + +void bar_chan_msgid_free(uint16_t msg_id) +{ + struct msgid_reps_info *msgid_reps_info = NULL; + if (msg_id >= MAX_MSG_BUFF_NUM) + { + return; + } + msgid_reps_info = &g_msgid_ring.reps_info_tbl[msg_id]; + spin_lock(&g_msgid_ring.lock); + msgid_reps_info->flag = REPS_INFO_FLAG_USABLE; + spin_unlock(&g_msgid_ring.lock); + return; +} + +uint8_t bar_msg_row_index_trans(uint8_t src) +{ + uint8_t src_index = 0; + + switch (src) + { + case MSG_CHAN_END_MPF: + { + src_index = BAR_MSG_SRC_MPF; + break; + } + case MSG_CHAN_END_PF: + { + src_index = BAR_MSG_SRC_PF; + break; + } + case MSG_CHAN_END_VF: + { + src_index = BAR_MSG_SRC_VF; + break; + } + default: + { + src_index = BAR_MSG_SRC_ERR; + break; + } + } + return src_index; +} + +uint8_t bar_msg_col_index_trans(uint8_t dst) +{ + uint8_t dst_index = 0; + + switch (dst) + { + case MSG_CHAN_END_MPF: + { + dst_index = BAR_MSG_DST_MPF; + break; + } + case MSG_CHAN_END_PF: + { + dst_index = BAR_MSG_DST_PFVF; + break; + } + case MSG_CHAN_END_VF: + { + dst_index = BAR_MSG_DST_PFVF; + break; + } + case MSG_CHAN_END_RISC: + { + dst_index = BAR_MSG_DST_RISC; + break; + } + default: + { + dst_index = BAR_MSG_SRC_ERR; + break; + } + } + return dst_index; +} + +int bar_chan_send_para_check(struct zxdh_pci_bar_msg *in, struct zxdh_msg_recviver_mem *result) +{ + uint8_t src_index = 0; + uint8_t dst_index = 0; + + if (in == NULL || result == NULL) + { + BAR_LOG_ERR("send para ERR: null para.\n"); + return BAR_MSG_ERR_NULL_PARA; + } + + src_index = bar_msg_row_index_trans((uint8_t)in->src); + dst_index = bar_msg_col_index_trans((uint8_t)in->dst); + if (src_index == BAR_MSG_SRC_ERR || dst_index == BAR_MSG_DST_ERR) + { + BAR_LOG_ERR("send para ERR: chan doesn't exist.\n"); + return BAR_MSG_ERR_TYPE; + } + if (in->event_id > MSG_MODULE_NUM) + { + BAR_LOG_ERR("send para ERR: invalid event_id: %d.\n", in->event_id); + return BAR_MSG_ERR_MODULE; + } + if (in->payload_addr == NULL) + { + BAR_LOG_ERR("send para ERR: null message.\n"); + return BAR_MSG_ERR_BODY_NULL; + } + if (in->payload_len > BAR_MSG_PAYLOAD_MAX_LEN) + { + BAR_LOG_ERR("send para ERR: len %x is too long.\n", in->payload_len); + return BAR_MSG_ERR_LEN; + } + if (in->virt_addr == 0 || result->recv_buffer == NULL) + { + BAR_LOG_ERR("send para ERR: virt_addr or recv_buffer is NULL.\n"); + return BAR_MSG_ERR_VIRTADDR_NULL; + } + if (result->buffer_len < REPS_HEADER_PAYLOAD_OFFSET) + { + BAR_LOG_ERR("recv buffer's len: %d is short than mininal 4 bytes\n", result->buffer_len); + } + return BAR_MSG_OK; +} + +/* 根据用户提供的src和dst和当前的场景来推算2K的偏移*/ +void bar_chan_subchan_addr_get(struct zxdh_pci_bar_msg *in, uint64_t *subchan_addr) +{ + uint8_t src_index, dst_index; + uint16_t chan_id, subchan_id; + + src_index = bar_msg_row_index_trans((uint8_t)in->src); + dst_index = bar_msg_col_index_trans((uint8_t)in->dst); + + if (src_index == BAR_MSG_SRC_ERR || dst_index == BAR_MSG_DST_ERR) + { + return; + } + + chan_id = chan_id_tbl[src_index][dst_index]; + subchan_id = subchan_id_tbl[src_index][dst_index]; + *subchan_addr = in->virt_addr + (2 * chan_id + subchan_id) * BAR_MSG_ADDR_CHAN_INTERVAL; + return; +} + +int bar_chan_reg_write(uint64_t subchan_addr, uint32_t offset, uint32_t data) +{ + uint32_t algin_offset = (offset & BAR_ALIGN_WORD_MASK); + + if (algin_offset >= BAR_MSG_ADDR_CHAN_INTERVAL) + { + return -EADDRNOTAVAIL; + } + + writel(data, (volatile void*)(subchan_addr + algin_offset)); + return 0; +} + +int bar_chan_reg_read(uint64_t subchan_addr, uint32_t offset, uint32_t *pdata) +{ + uint32_t algin_offset = (offset & BAR_ALIGN_WORD_MASK); + + if (algin_offset >= BAR_MSG_ADDR_CHAN_INTERVAL) + { + return -EADDRNOTAVAIL; + } + + *pdata = readl((const volatile void *)(subchan_addr + algin_offset)); + return 0; +} + +uint16_t bar_chan_msg_header_set(uint64_t subchan_addr, struct bar_msg_header *msg_header) +{ + uint32_t *data = (uint32_t*)msg_header; + uint16_t idx = 0; + + for (idx = 0; idx < (BAR_MSG_PLAYLOAD_OFFSET >> 2); idx++) + { + bar_chan_reg_write(subchan_addr, idx * 4, *(data + idx)); + } + + return BAR_MSG_OK; +} + +uint16_t bar_chan_msg_header_get(uint64_t subchan_addr, struct bar_msg_header *msg_header) +{ + uint32_t *data = (uint32_t*)msg_header; + uint16_t idx = 0; + + for (idx = 0; idx < (BAR_MSG_PLAYLOAD_OFFSET >> 2); idx++) + { + bar_chan_reg_read(subchan_addr, idx * 4, data + idx); + } + + return BAR_MSG_OK; +} + +uint16_t bar_chan_msg_payload_set(uint64_t subchan_addr, uint8_t *msg, uint16_t len) +{ + uint32_t *data = (uint32_t*)msg; + uint32_t count = (len / sizeof(uint32_t)); + uint32_t remain = (len % sizeof(uint32_t)); + uint32_t ix = 0, remain_data = 0; + + for (ix = 0; ix < count; ix++) + { + bar_chan_reg_write(subchan_addr, 4 * ix + BAR_MSG_PLAYLOAD_OFFSET, *(data + ix)); + } + for (ix = 0; ix < remain; ix++) + { + remain_data |= *((uint8_t *)(msg + (len - remain + ix))) << (8 * ix); + } + bar_chan_reg_write(subchan_addr, 4 * count + BAR_MSG_PLAYLOAD_OFFSET, remain_data); + + return BAR_MSG_OK; +} + +uint16_t bar_chan_msg_payload_get(uint64_t subchan_addr, uint8_t *msg, uint16_t len) +{ + uint32_t *data = (uint32_t*)msg; + uint32_t count = (len / sizeof(uint32_t)); + uint32_t remain = (len % sizeof(uint32_t)); + uint32_t ix = 0, remain_data = 0; + + for (ix = 0; ix < count; ix++) + { + bar_chan_reg_read(subchan_addr, 4 * ix + BAR_MSG_PLAYLOAD_OFFSET, (data + ix)); + } + bar_chan_reg_read(subchan_addr, 4 * count + BAR_MSG_PLAYLOAD_OFFSET, &remain_data); + for (ix = 0; ix < remain; ix++) + { + *((uint8_t *)(msg + (len - remain + ix))) = remain_data >> (8 * ix); + } + return BAR_MSG_OK; +} + +uint16_t bar_chan_msg_valid_set(uint64_t subchan_addr, uint8_t valid_label) +{ + uint32_t data = 0; + + bar_chan_reg_read(subchan_addr, BAR_MSG_VALID_OFFSET, &data); + data &= (~BAR_MSG_VALID_MASK); + data |= (uint32_t)valid_label; + bar_chan_reg_write(subchan_addr, BAR_MSG_VALID_OFFSET, data); + + return BAR_MSG_OK; +} + +uint16_t bar_msg_valid_stat_get(uint64_t subchan_addr) +{ + uint32_t data = 0; + + bar_chan_reg_read(subchan_addr, BAR_MSG_VALID_OFFSET, &data); + if (BAR_MSG_CHAN_USABLE == (data & BAR_MSG_VALID_MASK)) + { + return BAR_MSG_CHAN_USABLE; + } + + return BAR_MSG_CHAN_USED; +} + +uint16_t bar_chan_msg_poltag_set(uint64_t subchan_addr, uint8_t label) +{ + uint32_t data = 0; + + bar_chan_reg_read(subchan_addr, BAR_MSG_VALID_OFFSET, &data); + data &= (~(uint32_t)BAR_MSG_POL_MASK); + data |= ((uint32_t)label << BAR_MSG_POL_OFFSET); + bar_chan_reg_write(subchan_addr, BAR_MSG_VALID_OFFSET, data); + + return BAR_MSG_OK; +} + +static uint8_t payload_temp_buf[BAR_MSG_ADDR_CHAN_INTERVAL] = {0}; +uint16_t bar_chan_msg_send(uint64_t subchan_addr, void *payload_addr, uint16_t payload_len, struct bar_msg_header *msg_header) +{ + uint8_t *msg = (uint8_t*)(payload_addr); + struct bar_msg_header hdr_read = {0}; + uint16_t valid = 0; + + bar_chan_msg_header_set(subchan_addr, msg_header); + bar_chan_msg_header_get(subchan_addr, &hdr_read); + + bar_chan_msg_payload_set(subchan_addr, msg, payload_len); + bar_chan_msg_payload_get(subchan_addr, payload_temp_buf, payload_len); + + bar_chan_msg_valid_set(subchan_addr, BAR_MSG_CHAN_USED); + valid = bar_msg_valid_stat_get(subchan_addr); + + return BAR_MSG_OK; +} + +int bar_chan_recv_func_check(uint16_t check) +{ + if (CHECK_STATE_OK == check) + { + return BAR_MSG_OK; + } + else + { + BAR_LOG_ERR("recv func check failed, check field: 0x%x", check); + return BAR_MSG_ERR_USR_RET_ERR; + } +} + +int bar_chan_sync_msg_reps_get(uint64_t subchan_addr, uint64_t recv_buffer, uint16_t buffer_len, uint16_t send_msg_id) +{ + int ret = BAR_MSG_OK; + uint16_t recv_msg_id = 0; + uint16_t recv_len = 0; + uint8_t *recv_msg = (uint8_t*)recv_buffer; + struct bar_msg_header msg_header; + struct msgid_reps_info *reps_info = NULL; + + /*从消息头中取出消息回复的长度,取出msg_id,如果msg_id对应的usable的话,该条同步回复作废*/ + memset(&msg_header, 0, sizeof(msg_header)); + bar_chan_msg_header_get(subchan_addr, &msg_header); + recv_len = msg_header.len; + recv_msg_id = msg_header.msg_id; + + if (recv_msg_id != send_msg_id) + { + BAR_LOG_ERR("send msg id: %d, but get reply msg id: %d.\n", send_msg_id, recv_msg_id); + ret = BAR_MSG_ERR_REPLY; + goto out; + } + + reps_info = &g_msgid_ring.reps_info_tbl[recv_msg_id]; + if (reps_info->flag != REPS_INFO_FLAG_USED) + { + BAR_LOG_ERR("msg_id: %d is release", recv_msg_id); + ret = BAR_MSG_ERR_REPLY; + goto out; + } + if (recv_len > buffer_len - REPS_HEADER_PAYLOAD_OFFSET) + { + BAR_LOG_ERR("reps_buf_len is %d, but reps_msg_len is %d", buffer_len, recv_len + 4); + ret = BAR_MSG_ERR_REPSBUFF_LEN; + goto out; + } + + /* 从reps_buff + 4的位置拷贝进回复数据*/ + bar_chan_msg_payload_get(subchan_addr, recv_msg + REPS_HEADER_PAYLOAD_OFFSET, recv_len); + + ret = bar_chan_recv_func_check(msg_header.check); + if (ret != BAR_MSG_OK) + { + goto out; + } + + /* 拷贝数据长度*/ + *(uint16_t*)(recv_msg + REPS_HEADER_LEN_OFFSET) = recv_len; + /* reps头valid置位*/ + *recv_msg = REPS_HEADER_REPLYED; + +out: + return ret; +} + +uint64_t subchan_addr_cal(uint64_t virt_addr, uint8_t chan_id, uint8_t subchan_id) +{ + return virt_addr + (2 * chan_id + subchan_id) * BAR_MSG_ADDR_CHAN_INTERVAL; +} + +uint64_t recv_addr_get(uint8_t src_type, uint8_t dst_type, uint64_t virt_addr) +{ + uint8_t chan_id = 0; + uint8_t subchan_id = 0; + uint8_t src = bar_msg_col_index_trans(src_type); + uint8_t dst = bar_msg_row_index_trans(dst_type); + + if (src >= BAR_MSG_SRC_NUM || dst >= BAR_MSG_DST_NUM) + { + return 0; + } + /* 接收通道id和发送通道id相同*/ + chan_id = chan_id_tbl[dst][src]; + /* 接收子通道id和发送子通道相反*/ + subchan_id = (!!subchan_id_tbl[dst][src])? BAR_SUBCHAN_INDEX_SEND : BAR_SUBCHAN_INDEX_RECV; + return subchan_addr_cal(virt_addr, chan_id, subchan_id); +} + +uint64_t reply_addr_get(uint8_t sync, uint8_t src_type, uint8_t dst_type, uint64_t virt_addr) +{ + uint8_t chan_id = 0; + uint8_t subchan_id = 0; + uint64_t recv_rep_addr = 0; + uint8_t src = bar_msg_col_index_trans(src_type); + uint8_t dst = bar_msg_row_index_trans(dst_type); + + if (src == BAR_MSG_SRC_ERR || dst == BAR_MSG_DST_ERR) + { + return 0; + } + + chan_id = chan_id_tbl[dst][src]; + subchan_id = (!!subchan_id_tbl[dst][src])? BAR_SUBCHAN_INDEX_SEND : BAR_SUBCHAN_INDEX_RECV; + if (sync == BAR_CHAN_MSG_SYNC) //同步消息 + { + recv_rep_addr = subchan_addr_cal(virt_addr, chan_id, subchan_id); + } + else + { + recv_rep_addr = subchan_addr_cal(virt_addr, chan_id, 1 - subchan_id); + } + return recv_rep_addr; +} + +uint16_t bar_chan_msg_header_check(struct bar_msg_header *msg_header) +{ + uint8_t event_id = 0; + uint16_t len = 0; + + if (msg_header == NULL) + { + return BAR_MSG_ERR_NULL; + } + if (msg_header->valid != BAR_MSG_CHAN_USED) + { + BAR_LOG_ERR("recv header ERR: valid label is not used.\n"); + return BAR_MSG_ERR_MODULE; + } + event_id = msg_header->event_id; + if (event_id >= (uint8_t)MSG_MODULE_NUM) + { + BAR_LOG_ERR("recv header ERR: invalid event_id: %d.\n", event_id); + return BAR_MSG_ERR_MODULE; + } + len = msg_header->len; + if (len > BAR_MSG_PAYLOAD_MAX_LEN) + { + BAR_LOG_ERR("recv header ERR: invalid mesg len: %d.\n", len); + return BAR_MSG_ERR_LEN; + } + if (msg_header->ack == BAR_CHAN_MSG_NO_ACK && msg_recv_func_tbl[msg_header->event_id] == NULL) + { + BAR_LOG_DEBUG("recv header ERR: module:%d doesn't register", event_id); + return BAR_MSG_ERR_MODULE_NOEXIST; + } + return BAR_MSG_OK; +} + + +/* 同步消息接收处理*/ +void bar_msg_sync_msg_proc(uint64_t reply_addr, struct bar_msg_header *msg_header, uint8_t *reciver_buff, void *dev) +{ + uint16_t reps_len = 0; + uint8_t *reps_buffer = NULL; + zxdh_bar_chan_msg_recv_callback recv_func = NULL; + + reps_buffer = kmalloc(BAR_MSG_PAYLOAD_MAX_LEN, GFP_KERNEL); + if (reps_buffer == NULL) + { + return; + } + /* 查询消息处理函数,处理消息,消息处理的结果放到reps_buffer中, 长度放到reps_len中*/ + recv_func = msg_recv_func_tbl[msg_header->event_id]; + recv_func(reciver_buff, msg_header->len, reps_buffer, &reps_len, dev); + msg_header->ack = BAR_CHAN_MSG_ACK; + msg_header->len = reps_len; + /* 计算回复消息2K的地址*/ + bar_chan_msg_header_set(reply_addr, msg_header); + bar_chan_msg_payload_set(reply_addr, reps_buffer, reps_len); + bar_chan_msg_valid_set(reply_addr, BAR_MSG_CHAN_USABLE); + + BAR_KFREE_PTR(reps_buffer); + return; +} + +/* 统一的中断处理函数*/ +int zxdh_bar_irq_recv(uint8_t src, uint8_t dst, uint64_t virt_addr, void *dev) +{ + uint64_t recv_addr = 0; + uint64_t reps_addr = 0; + struct bar_msg_header msg_header = {0}; + uint8_t *recved_msg = NULL; + uint16_t ret = 0; + + /*1 接收消息地址*/ + recv_addr = recv_addr_get(src, dst, virt_addr); + BAR_LOG_DEBUG("recv_addr: 0x%llx, \nvirt_addr: 0x%llx", recv_addr, virt_addr); + if (recv_addr == 0) + { + BAR_LOG_DEBUG("invalid driver type"); + return BAR_MSG_ERR_NULL; + } + /*2 取消息头并检查是否合法*/ + bar_chan_msg_header_get(recv_addr, &msg_header); + ret = bar_chan_msg_header_check(&msg_header); + if (ret != BAR_MSG_OK) + { + bar_chan_check_chan_stats(ret, recv_addr); + return ret; + } + /*3 创建消息payload buf,取出消息暂存*/ + recved_msg = kmalloc(msg_header.len, GFP_KERNEL); + if (recved_msg == NULL) + { + BAR_LOG_DEBUG("create temp buff failed"); + return BAR_MSG_ERR_NULL; + } + bar_chan_msg_payload_get(recv_addr, recved_msg, msg_header.len); + + /*4 根据来的是同步消息还是异步消息计算回复消息地址*/ + reps_addr = reply_addr_get(msg_header.sync, src, dst, virt_addr); + + /*5 如果是同步消息,走同步消息流程*/ + if (msg_header.sync == BAR_CHAN_MSG_SYNC) + { + bar_msg_sync_msg_proc(reps_addr, &msg_header, recved_msg, dev); + goto out; + } + + /*6 不应该为异步消息,先置位告诉对方已收到消息*/ + BAR_LOG_DEBUG("%d end set valid", dst); + //TODO set 错误码 + bar_chan_msg_poltag_set(recv_addr, 0); + bar_chan_msg_valid_set(recv_addr, BAR_MSG_CHAN_USABLE); + +out: + kfree(recved_msg); + return BAR_MSG_OK; +} +EXPORT_SYMBOL(zxdh_bar_irq_recv); + +int32_t call_msg_recv_func_tbl(uint16_t event_id, void *pay_load, uint16_t len, void *reps_buffer, uint16_t *reps_len, void *dev) +{ + zxdh_bar_chan_msg_recv_callback recv_func = NULL; + + recv_func = msg_recv_func_tbl[event_id]; + if (unlikely(recv_func == NULL)) + { + BAR_LOG_ERR("event_id[%d] unregister\n", event_id); + return BAR_MSG_ERR_MODULE_NOEXIST; + } + + return recv_func(pay_load, len, reps_buffer, reps_len, dev); +} +EXPORT_SYMBOL(call_msg_recv_func_tbl); + + +/** + * zxdh_bar_chan_sync_msg_send - 通过PCIE BAR空间发送同步消息 + * @in: 消息发送信息 + * @result: 消息结果反馈 + * @return: 0 成功,其他失败 + */ +int zxdh_bar_chan_sync_msg_send(struct zxdh_pci_bar_msg *in, struct zxdh_msg_recviver_mem *result) +{ + int ret = 0; + uint16_t valid = 0; + uint16_t time_out_cnt = 0; + uint16_t msg_id = 0; + uint64_t subchan_addr = 0; + struct bar_msg_header msg_header = {0}; + + ret = bar_msg_src_parse(in); + if (ret != BAR_MSG_OK) + { + goto out; + } + + ret = bar_chan_send_para_check(in, result); + if (ret != BAR_MSG_OK) + { + BAR_LOG_ERR("para check failed, %d.", ret); + goto out; + } + + /* 申请msg_id,并将缓存信息存放到表中*/ + ret = bar_chan_save_recv_info(result, &msg_id); + if (ret != BAR_MSG_OK) + { + BAR_LOG_ERR("msg_id allocated failed."); + goto out; + } + /* 计算2K通道的地址*/ + bar_chan_subchan_addr_get(in, &subchan_addr); + /* 填充消息头*/ + bar_chan_sync_fill_header(msg_id, in, &msg_header); + /* 给通道上锁,根据src和dst判断是分配硬件锁还是软件锁*/ + bar_chan_lock((uint8_t)in->src, (uint8_t)in->dst, in->src_pcieid); + + /* 消息头、消息体发送到bar空间, valid置位*/ + bar_chan_msg_send(subchan_addr, in->payload_addr, in->payload_len, &msg_header); + /* 轮询等待消息回复*/ + do + { + usleep_range(BAR_MSG_POLLING_SPAN_US, BAR_MSG_POLLING_SPAN_US + 10); + valid = bar_msg_valid_stat_get(subchan_addr); + time_out_cnt++; + }while((time_out_cnt < BAR_MSG_TIMEOUT_TH) && (BAR_MSG_CHAN_USED == valid)); + + /* 如果超时恢复标志位*/ + if ((BAR_MSG_TIMEOUT_TH == time_out_cnt) && (BAR_MSG_CHAN_USABLE != valid)) + { + bar_chan_msg_valid_set(subchan_addr, BAR_MSG_CHAN_USABLE); + bar_chan_msg_poltag_set(subchan_addr, 0); + BAR_LOG_ERR("BAR MSG ERR: msg_id: %d time out.\n", msg_header.msg_id); + ret = BAR_MSG_ERR_TIME_OUT; + } + else + { + /* 从消息头中取出回复消息的长度len, 从payload中取出消息内容,放到本地缓存reps_buff*/ + ret = bar_chan_sync_msg_reps_get(subchan_addr, (uint64_t)result->recv_buffer, result->buffer_len, msg_id); + } + bar_chan_msgid_free(msg_id); + /*通道解锁*/ + bar_chan_unlock((uint8_t)in->src, (uint8_t)in->dst, in->src_pcieid); + bar_chan_check_chan_stats(ret, subchan_addr); +out: + return ret; +} +EXPORT_SYMBOL(zxdh_bar_chan_sync_msg_send); + +static int bar_chan_callback_register_check(uint8_t event_id, zxdh_bar_chan_msg_recv_callback callback) +{ + if (event_id >= (uint8_t)MSG_MODULE_NUM) + { + BAR_LOG_ERR("register ERR: invalid event_id: %d.\n", event_id); + return BAR_MSG_ERR_MODULE; + } + if (callback == NULL) + { + BAR_LOG_ERR("register ERR: null callback.\n"); + return BAR_MEG_ERR_NULL_FUNC; + } + if (msg_recv_func_tbl[event_id] != NULL) + { + BAR_LOG_ERR("register ERR: repeat register.\n"); + return BAR_MSG_ERR_REPEAT_REGISTER; + } + return BAR_MSG_OK; +} + +/** + * zxdh_bar_chan_msg_recv_register - PCIE BAR空间消息方式,注册消息接收回调 + * @event_id: 注册模块id + * @callback: 模块实现的接收处理函数指针 + * @return: 0 成功,其他失败 + * 一般在驱动初始化时调用 + */ +int zxdh_bar_chan_msg_recv_register(uint8_t event_id, zxdh_bar_chan_msg_recv_callback callback) +{ + int ret = 0; + + ret = bar_chan_callback_register_check(event_id, callback); + + if (BAR_MSG_OK == ret) + { + msg_recv_func_tbl[event_id] = callback; + BAR_LOG_DEBUG("register module: %d success.\n", event_id); + } + + return ret; +} +EXPORT_SYMBOL(zxdh_bar_chan_msg_recv_register); + +/** + * zxdh_bar_chan_msg_recv_unregister - PCIE BAR空间消息方式,解注册消息接收回调 + * @event_id: 内核PCIE设备地址 + * @return:0 成功,其他失败 + * 在驱动卸载时需要调用 + */ +int zxdh_bar_chan_msg_recv_unregister(uint8_t event_id) +{ + if (event_id >= (uint8_t)MSG_MODULE_NUM) + { + BAR_LOG_ERR("unregister ERR: invalid event_id :%d.\n", event_id); + return BAR_MSG_ERR_MODULE; + } + if (msg_recv_func_tbl[event_id] == NULL) + { + BAR_LOG_ERR("unregister ERR: null proccess func.\n"); + return BAR_MSG_ERR_UNGISTER; + } + msg_recv_func_tbl[event_id] = NULL; + BAR_LOG_DEBUG("unregister module %d success.\n", event_id); + return BAR_MSG_OK; +} +EXPORT_SYMBOL(zxdh_bar_chan_msg_recv_unregister); + +int bar_mpf_addr_ioremap(void) +{ + uint64_t addr; + uint64_t len; + struct pci_dev *pdev = NULL; + + pdev = pci_get_device(MPF_VENDOR_ID, MPF_DEVICE_ID, NULL); + + if (pdev == NULL) + { + BAR_LOG_DEBUG("not found device: deviceID %x, VendorID: %x", MPF_DEVICE_ID, MPF_VENDOR_ID); + return -EINVAL; + } + + addr = pci_resource_start(pdev, 0); + len = pci_resource_len(pdev, 0); + if (addr == 0 || len == 0) + { + BAR_LOG_ERR("pci resouce addr or len is 0\n"); + return -EINVAL; + } + + internal_addr = ioremap(addr, len); + if (IS_ERR_OR_NULL(internal_addr)) + { + BAR_LOG_ERR("ioremap failed, internal_addr=0x%p\n", internal_addr); + return -ENOMEM; + } + is_mpf_scaned = TRUE; + + return BAR_MSG_OK; +} + +void bar_mpf_addr_iounmap(void) +{ + if (internal_addr != NULL) + { + iounmap(internal_addr); + } + internal_addr = NULL; + is_mpf_scaned = FALSE; + return; +} + +int bar_msgid_ring_init(void) +{ + uint16_t msg_id = 0; + struct msgid_reps_info *reps_info = NULL; + + spin_lock_init(&g_msgid_ring.lock); + for( msg_id = 0; msg_id < MAX_MSG_BUFF_NUM; msg_id++) + { + reps_info = &(g_msgid_ring.reps_info_tbl[msg_id]); + reps_info->id = msg_id; + reps_info->flag = REPS_INFO_FLAG_USABLE; + } + return BAR_MSG_OK; +} + +void bar_msgid_ring_free(void) +{ + uint16_t msg_id = 0; + struct msgid_reps_info *reps_info = NULL; + + for (msg_id = 0; msg_id < MAX_MSG_BUFF_NUM; msg_id++) + { + reps_info = &g_msgid_ring.reps_info_tbl[msg_id]; + del_timer_sync(&reps_info->id_timer); + } +} + +extern uint16_t test_sync_send(void); +int zxdh_bar_msg_chan_init(void) +{ + int16_t ret = 0; + + /* msg_id锁初始化*/ + bar_init_lock_arr(); + bar_msgid_ring_init(); + + /* 管理pf地址映射*/ + ret = bar_mpf_addr_ioremap(); + if (ret != BAR_MSG_OK) + { + BAR_LOG_DEBUG("mpf do not exit, but do not impact the msg chan.\n"); + } + +#ifdef BAR_MSG_TEST + test_sync_send(); +#endif + + return BAR_MSG_OK; +} + +void bar_chan_timer_callback(struct timer_list *timer) +{ + struct msgid_reps_info *reps_info = NULL; + + reps_info = container_of(timer, struct msgid_reps_info, id_timer); + if (reps_info->flag == REPS_INFO_FLAG_USED) + { + reps_info->reps_buffer = NULL; + reps_info->buffer_len = 0; + reps_info->flag = REPS_INFO_FLAG_USABLE; + BAR_LOG_ERR("RECV ERR: get async reply time out, free msg_id: %u.\n", reps_info->id); + } + else + { + BAR_LOG_DEBUG("RECV NOTICE: get async reply message success.\n"); + } + return; +} + +int zxdh_bar_msg_chan_remove(void) +{ + + bar_msgid_ring_free(); + /* mpf解ioremap*/ + bar_mpf_addr_iounmap(); + /* 消息链表资源释放*/ + + BAR_LOG_DEBUG("zxdh_msg_chan_bar remove success"); + + return 0; +} + +uint16_t bar_get_sum(uint8_t *ptr, uint8_t len) +{ + int idx = 0; + uint64_t sum = 0; + for (idx = 0; idx < len; idx++) + { + sum += *(ptr + idx); + } + return (uint16_t)sum; +} + +/** + * zxdh_bar_enable_chan - 驱动使能通道函数 + * @_msix_para: msix中断配置信息 + * @vport: 查询到的vport + * @return: 0 成功,其他失败 + */ +int zxdh_bar_enable_chan(struct msix_para *_msix_para, uint16_t *vport) +{ + int ret = 0; + uint8_t recv_buf[12] = {0}; + uint16_t check_token, sum_res; +#if 0 + uint32_t domain, bus, devid, function; +#endif + struct msix_msg msix_msg = {0}; + struct zxdh_pci_bar_msg in = {0}; + struct zxdh_msg_recviver_mem result = {0}; + + if (!_msix_para || !_msix_para->pdev) + { + return -BAR_MSG_ERR_NULL; + } +#if 0 + sscanf(pci_name(_msix_para->pdev), "%x:%x:%x.%u", &domain, &bus, &devid, &function); + msix_msg.bdf = BDF_ECAM(bus, devid, function); +#endif + msix_msg.pcie_id = _msix_para->pcie_id; + msix_msg.vector_risc = _msix_para->vector_risc; + msix_msg.vector_pfvf = _msix_para->vector_pfvf; + msix_msg.vector_mpf = _msix_para->vector_mpf; + + in.payload_addr = &msix_msg; + in.payload_len = sizeof(msix_msg); + in.virt_addr = _msix_para->virt_addr; + in.src = _msix_para->driver_type; + in.dst = MSG_CHAN_END_RISC; + in.event_id = MODULE_MSIX; + in.src_pcieid = _msix_para->pcie_id; + + result.recv_buffer = recv_buf; + result.buffer_len = sizeof(recv_buf); + + ret = zxdh_bar_chan_sync_msg_send(&in, &result); + if (ret != BAR_MSG_OK) + { + return -ret; + } + + check_token = *(uint16_t *)(recv_buf + 6); + sum_res = bar_get_sum((uint8_t *)&msix_msg, sizeof(msix_msg)); + if (check_token != sum_res) + { + BAR_LOG_DEBUG("expect token: 0x%x, get token: 0x%x.\n", sum_res, check_token); + return -BAR_MSG_ERR_NOT_MATCH; + } + *vport = *(uint16_t *)(recv_buf + 8); + BAR_LOG_DEBUG("vport of %s get success.\n", pci_name(_msix_para->pdev)); + return BAR_MSG_OK; +} +EXPORT_SYMBOL(zxdh_bar_enable_chan); + +int zxdh_get_bar_offset(struct bar_offset_params *paras, struct bar_offset_res *res) +{ + int ret = 0; + uint16_t check_token, sum_res; + struct offset_get_msg send_msg = {0}; + struct bar_recv_msg *recv_msg = NULL; + + struct zxdh_pci_bar_msg in = {0}; + struct zxdh_msg_recviver_mem result = {0}; + + if (!paras || !res) + { + return BAR_MSG_ERR_NULL; + } + + send_msg.pcie_id = paras->pcie_id; + send_msg.type = paras->type; + + in.payload_addr = &send_msg; + in.payload_len = sizeof(send_msg); + in.virt_addr = paras->virt_addr; + in.src = MSG_CHAN_END_PF; + in.dst = MSG_CHAN_END_RISC; + in.event_id = MODULE_OFFSET_GET; + + recv_msg = kzalloc(sizeof(struct bar_recv_msg), GFP_KERNEL); + if (recv_msg == NULL) + { + LOG_ERR("NULL ptr\n"); + return -1; + } + result.recv_buffer = recv_msg; + result.buffer_len = sizeof(struct bar_recv_msg); + + ret = zxdh_bar_chan_sync_msg_send(&in, &result); + if (ret != BAR_MSG_OK) + { + ret = -ret; + goto free_msg; + } + + check_token = recv_msg->offset_reps.check; + sum_res = bar_get_sum((uint8_t*)&send_msg, sizeof(send_msg)); + if (check_token != sum_res) + { + BAR_LOG_ERR("expect token: 0x%x, get token: 0x%x.\n", sum_res, check_token); + ret = -BAR_MSG_ERR_NOT_MATCH; + goto free_msg; + } + res->bar_offset = recv_msg->offset_reps.offset; + res->bar_length = recv_msg->offset_reps.length; + +free_msg: + kfree(recv_msg); + return ret; +} +EXPORT_SYMBOL(zxdh_get_bar_offset); + +void zxdh_bar_reset_valid(uint64_t subchan_addr) +{ + struct bar_msg_header msg_header = {0}; + + bar_chan_msg_header_get(subchan_addr, &msg_header); + + subchan_addr += BAR_MSG_ADDR_CHAN_INTERVAL; + bar_chan_msg_valid_set(subchan_addr, BAR_MSG_CHAN_USABLE); + bar_chan_msg_poltag_set(subchan_addr, 0); +} +EXPORT_SYMBOL(zxdh_bar_reset_valid); + +uint16_t zxdh_get_event_id(uint64_t subchan_addr, uint8_t src_type, uint8_t dst_type) +{ + uint8_t subchan_id = 0; + struct bar_msg_header msg_header = {0}; + uint8_t src = bar_msg_col_index_trans(src_type); + uint8_t dst = bar_msg_row_index_trans(dst_type); + + if (src == BAR_MSG_SRC_ERR || dst == BAR_MSG_DST_ERR) + { + return 0; + } + /* 接收子通道id和发送子通道相反*/ + subchan_id = (!!subchan_id_tbl[dst][src])? BAR_SUBCHAN_INDEX_SEND : BAR_SUBCHAN_INDEX_RECV; + subchan_addr += subchan_id * BAR_MSG_ADDR_CHAN_INTERVAL; + bar_chan_msg_header_get(subchan_addr, &msg_header); + return msg_header.event_id; +} +EXPORT_SYMBOL(zxdh_get_event_id); + +int32_t zxdh_send_command(uint64_t vaddr, uint16_t pcie_id, uint16_t module_id, \ + void *msg, void *ack, bool is_sync_msg) +{ + struct zxdh_pci_bar_msg in = {0}; + struct zxdh_msg_recviver_mem result = {0}; + struct bar_recv_msg *bar_reps = NULL; + int32_t ret = 0; + + if ((msg == NULL) || (ack == NULL)) + { + LOG_ERR("NULL ptr\n"); + return -1; + } + + in.payload_addr = msg; + in.payload_len = sizeof(union zxdh_msg); + + if (((pcie_id >> PFVF_FLAG_OFFSET) & 1) == 1) + { + in.src = MSG_CHAN_END_PF; + } + else + { + in.src = MSG_CHAN_END_VF; + } + + bar_reps = kzalloc(sizeof(struct bar_recv_msg), GFP_KERNEL); + if (bar_reps == NULL) + { + LOG_ERR("NULL ptr\n"); + return -1; + } + in.dst = MSG_CHAN_END_RISC; + in.event_id = module_id; + in.virt_addr = vaddr; + in.src_pcieid = pcie_id; + result.recv_buffer = bar_reps; + result.buffer_len = BAR_MSG_PAYLOAD_MAX_LEN; + + switch (module_id) + { + case MODULE_VF_BAR_MSG_TO_PF: + { + in.dst = MSG_CHAN_END_PF; + in.dst_pcieid = FIND_PF_PCIE_ID(pcie_id); + in.virt_addr += ZXDH_BAR_PFVF_MSG_OFFSET; + break; + } + case MODULE_PF_BAR_MSG_TO_VF: + { + in.dst = MSG_CHAN_END_VF; + in.dst_pcieid = ((zxdh_msg_info *)msg)->hdr_vf.dst_pcie_id; + in.virt_addr += ZXDH_BAR_PFVF_MSG_OFFSET; + break; + } + case MODULE_TBL: + { + in.payload_len = MSG_STRUCT_HD_LEN + ((zxdh_msg_info *)msg)->hdr_to_cmn.write_bytes; + break; + } + case MODULE_PF_TIMER_TO_RISC_MSG: + { + in.payload_len = MSG_STRUCT_HD_LEN + ((zxdh_msg_info *)msg)->hdr_to_cmn.write_bytes; + break; + } + case MODULE_PHYPORT_QUERY: + { + in.payload_len = sizeof(struct zxdh_port_msg); + break; + } + case MODULE_NPSDK: + { + in.payload_len = sizeof(zxdh_cfg_np_msg); + break; + } + } + + ret = zxdh_bar_chan_sync_msg_send(&in, &result); + if (ret != ZXDH_NET_ACK_OK) + { + LOG_ERR("zxdh_bar_chan_sync_msg_send failed: %d\n", ret); + ret = -ret; + goto free_reps; + } + + if (is_sync_msg && bar_reps->replied != BAR_MSG_REPS_OK) + { + LOG_ERR("reps get failed\n"); + ret = -1; + goto free_reps; + } + + if (bar_reps->reps_len > BAR_MSG_PAYLOAD_MAX_LEN) + { + LOG_ERR("reps len too long\n"); + ret = -1; + goto free_reps; + } + memcpy(ack, bar_reps->data, bar_reps->reps_len); + +free_reps: + kfree(bar_reps); + return ret; +} +EXPORT_SYMBOL(zxdh_send_command); diff --git a/src/net/drivers/net/ethernet/dinghai/dh_procfs.c b/src/net/drivers/net/ethernet/dinghai/dh_procfs.c new file mode 100644 index 0000000..bcd6fba --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/dh_procfs.c @@ -0,0 +1,85 @@ +#include + +#include "dh_procfs.h" + +#define DRV_NAME "dinghai" + +static struct fs_entry_desc fs_entry_table[] = { + { FS_ENTRY_BOND, "lag" }, + {0} +}; + +uint32_t find_fs_entry(uint32_t type) +{ + uint32_t idx = 0; + + while (fs_entry_table[idx].file_name) + { + if (type == fs_entry_table[idx].type) + { + break; + } + idx++; + } + + return idx; +} + +void zxdh_create_proc_dir(struct zxdh_proc_fs *procfs) +{ + if (!procfs->proc_dir) + { + procfs->proc_dir = proc_mkdir(DRV_NAME, NULL); + if (!procfs->proc_dir) + { + pr_warn("Warning: Cannot create /proc/%s\n", DRV_NAME); + } + } +} + +void zxdh_destroy_proc_dir(struct zxdh_proc_fs *procfs) +{ + if (procfs->proc_dir) + { + remove_proc_entry(DRV_NAME, NULL); + procfs->proc_dir = NULL; + } +} + +void zxdh_create_proc_entry(struct zxdh_proc_fs *procfs, + uint32_t type, struct seq_operations *seq_ops, void *data) +{ + uint32_t idx = 0; + char *file_name = NULL; + + if (procfs->proc_dir) + { + idx = find_fs_entry(type); + file_name = fs_entry_table[idx].file_name; + if (file_name && (idx < PROC_ENTRY_MAX)) + { + procfs->proc_entry[idx] = proc_create_seq_data(file_name, 0444, procfs->proc_dir, seq_ops, data); + if (procfs->proc_entry[idx] == NULL) + { + pr_info("Cannot create /proc/%s/%s\n", DRV_NAME, file_name); + } + } + } +} + +void zxdh_remove_proc_entry(struct zxdh_proc_fs *procfs, uint32_t type) +{ + uint32_t idx = 0; + char *file_name = NULL; + + if (procfs->proc_dir) + { + idx = find_fs_entry(type); + file_name = fs_entry_table[idx].file_name; + if (file_name && (idx < PROC_ENTRY_MAX)) + { + remove_proc_entry(file_name, procfs->proc_dir); + procfs->proc_entry[idx] = NULL; + } + } +} diff --git a/src/net/drivers/net/ethernet/dinghai/dh_procfs.h b/src/net/drivers/net/ethernet/dinghai/dh_procfs.h new file mode 100644 index 0000000..6197957 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/dh_procfs.h @@ -0,0 +1,30 @@ +#ifndef _ZXDH_PROC_FS_H_ +#define _ZXDH_PROC_FS_H_ + +#define PROC_ENTRY_MAX (16) + +struct zxdh_proc_fs +{ + struct proc_dir_entry *proc_dir; + struct proc_dir_entry *proc_entry[PROC_ENTRY_MAX]; +}; + +struct fs_entry_desc +{ + uint32_t type; + char *file_name; +}; + +enum +{ + FS_ENTRY_BOND = 0, +}; + +void zxdh_create_proc_dir(struct zxdh_proc_fs *procfs); +void zxdh_destroy_proc_dir(struct zxdh_proc_fs *procfs); +void zxdh_create_proc_entry(struct zxdh_proc_fs *procfs, + uint32_t type, struct seq_operations *seq_ops, void *data); +void zxdh_remove_proc_entry(struct zxdh_proc_fs *procfs, uint32_t type); + + +#endif /* _ZXDH_PROC_FS_H_ */ \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_aux.c b/src/net/drivers/net/ethernet/dinghai/en_aux.c new file mode 100755 index 0000000..b5c64e8 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_aux.c @@ -0,0 +1,4046 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "en_aux.h" +#include "en_ethtool/ethtool.h" +#include "en_np/table/include/dpp_tbl_api.h" +#include "en_np/table/include/dpp_tbl_comm.h" +#include "en_aux/events.h" +#include "en_aux/eq.h" +#include "en_aux/en_cmd.h" +#include "msg_common.h" +#include "en_pf.h" +#include "en_aux/en_ioctl.h" +#include +#ifdef ZXDH_MSGQ +#include "en_aux/priv_queue.h" +#endif +#include "en_aux/en_1588_pkt_proc.h" +#include "en_aux/en_cmd.h" +#include "zxdh_tools/zxdh_tools_netlink.h" +#include + +#ifdef ZXDH_DCBNL_OPEN +#include "en_aux/dcbnl/en_dcbnl.h" +#endif + +uint32_t max_pairs = ZXDH_MQ_PAIRS_NUM; +module_param(max_pairs, uint, S_IRUGO | S_IWUSR); +MODULE_PARM_DESC(max_pairs, "Max queue pairs"); + +MODULE_LICENSE("Dual BSD/GPL"); + +/* WARNING Do not use netif_carrier_on/off(), + it may affect the ethtool function */ +int32_t zxdh_en_open(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + int32_t i = 0; + int32_t err = 0; + DPP_PF_INFO_T pf_info = {0}; + + LOG_INFO("zxdh_en_open start\n"); + mutex_lock(&en_priv->lock); + + for (i = 0; i < en_dev->curr_queue_pairs; i++) + { + /* Make sure we have some buffers: if oom use wq */ + if (!try_fill_recv(netdev, &en_dev->rq[i], GFP_KERNEL)) + { + schedule_delayed_work(&en_dev->refill, 0); + } + + virtnet_napi_enable(en_dev->rq[i].vq, &en_dev->rq[i].napi); + virtnet_napi_tx_enable(netdev, en_dev->sq[i].vq, &en_dev->sq[i].napi); + } + + mutex_unlock(&en_priv->lock); + + if (!en_dev->link_up) + { + return 0; + } + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + if (!en_dev->ops->is_bond(en_dev->parent)) + { + if(en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_VF) + { + return zxdh_vf_egr_port_attr_set(en_dev, EGR_FLAG_VPORT_IS_UP, 1, 0); + } + return dpp_egr_port_attr_set(&pf_info, EGR_FLAG_VPORT_IS_UP, 1); + } + + /* 给bond-pf的端口属性表配置为up */ + err = dpp_egr_port_attr_set(&pf_info, EGR_FLAG_VPORT_IS_UP, 1); + if (err != 0) + { + LOG_ERR("dpp_egr_port_attr_set bond pf failed\n"); + return err; + } + + return dpp_panel_attr_set(&pf_info, en_dev->phy_port, PANEL_FLAG_IS_UP, 1); +} + +int32_t zxdh_en_close(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + int32_t i = 0; + int32_t err = 0; + DPP_PF_INFO_T pf_info = {0}; + + LOG_INFO("zxdh_en_close start\n"); + /* Make sure refill_work doesn't re-enable napi! */ + cancel_delayed_work_sync(&en_dev->refill); + + for (i = 0; i < en_dev->curr_queue_pairs; i++) + { + napi_disable(&en_dev->rq[i].napi); + virtnet_napi_tx_disable(&en_dev->sq[i].napi); + } + + if (!en_dev->link_up) + { + return 0; + } + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + if (!en_dev->ops->is_bond(en_dev->parent)) + { + if(en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_VF) + { + return zxdh_vf_egr_port_attr_set(en_dev, EGR_FLAG_VPORT_IS_UP, 0, 0); + } + return dpp_egr_port_attr_set(&pf_info, EGR_FLAG_VPORT_IS_UP, 0); + } + + /* 给bond-pf的端口属性表配置为down */ + err = dpp_egr_port_attr_set(&pf_info, EGR_FLAG_VPORT_IS_UP, 0); + if (err != 0) + { + LOG_ERR("dpp_egr_port_attr_set bond pf failed\n"); + return err; + } + + return dpp_panel_attr_set(&pf_info, en_dev->phy_port, PANEL_FLAG_IS_UP, 0); +} + +void pkt_transport_protocol_parse(int8_t next_protocol, struct zxdh_net_hdr *hdr) +{ + if (next_protocol == IPPROTO_UDP) + { + hdr->pi_hdr.pt.type_ctx.pkt_code = PCODE_UDP; + } + else if (next_protocol == IPPROTO_TCP) + { + hdr->pi_hdr.pt.type_ctx.pkt_code = PCODE_TCP; + } + else + { + hdr->pi_hdr.pt.type_ctx.pkt_code = PCODE_IP; + } + + return; +} + +void pkt_protocol_parse(struct sk_buff *skb, struct zxdh_net_hdr *hdr, int32_t flag) +{ + struct ethhdr *mach = NULL; + struct iphdr *ipv4h = NULL; + struct ipv6hdr *ipv6h = NULL; + + if (flag == 0) + { + if (skb->protocol == htons(ETH_P_IP)) + { + ipv4h = (struct iphdr *)skb_network_header(skb); + hdr->pi_hdr.pt.type_ctx.ip_type = IPV4_TYPE; + pkt_transport_protocol_parse(ipv4h->protocol, hdr); + } + else if (skb->protocol == htons(ETH_P_IPV6)) + { + ipv6h = (struct ipv6hdr *)skb_network_header(skb); + hdr->pi_hdr.pt.type_ctx.ip_type = IPV6_TYPE; + pkt_transport_protocol_parse(ipv6h->nexthdr, hdr); + } + else + { + hdr->pi_hdr.pt.type_ctx.ip_type = NOT_IP_TYPE; + } + } + else + { + mach = (struct ethhdr *)skb_inner_mac_header(skb); + if (mach->h_proto == htons(ETH_P_IP)) + { + ipv4h = (struct iphdr *)skb_inner_network_header(skb); + hdr->pi_hdr.pt.type_ctx.ip_type = IPV4_TYPE; + pkt_transport_protocol_parse(ipv4h->protocol, hdr); + } + else if (mach->h_proto == htons(ETH_P_IPV6)) + { + ipv6h = (struct ipv6hdr *)skb_inner_network_header(skb); + hdr->pi_hdr.pt.type_ctx.ip_type = IPV6_TYPE; + pkt_transport_protocol_parse(ipv6h->nexthdr, hdr); + + } + else + { + hdr->pi_hdr.pt.type_ctx.ip_type = NOT_IP_TYPE; + } + } +} + +int32_t pkt_is_vxlan(struct sk_buff *skb) +{ + switch (skb->protocol) + { + case htons(ETH_P_IP): + if (ip_hdr(skb)->protocol != IPPROTO_UDP) + { + return -1; + } + break; + + case htons(ETH_P_IPV6): + if (ipv6_hdr(skb)->nexthdr != IPPROTO_UDP) + { + return -1; + } + break; + + default: + return -1; + } + + if (skb->inner_protocol_type != ENCAP_TYPE_ETHER || skb->inner_protocol != htons(ETH_P_TEB) || + (skb_inner_mac_header(skb) - skb_transport_header(skb) != sizeof(struct udphdr) + sizeof(struct vxlanhdr))) + { + return -1; + } + + return 0; +} + +int32_t zxdh_tx_checksum_offload(struct zxdh_en_device *edev, struct sk_buff *skb, struct zxdh_net_hdr *hdr) +{ + if (skb->ip_summed != CHECKSUM_PARTIAL) + { + return 0; + } + + if ((skb->inner_protocol != 0) && (pkt_is_vxlan(skb) == 0)) + { + skb->encapsulation = 0x1; + } + + if(skb->encapsulation == 0x1) + { + if ((edev->netdev->features & NETIF_F_GSO_UDP_TUNNEL_CSUM) == 0) + { + return 0; + } + hdr->pi_hdr.bttl_pi_len = ENABLE_PI_FLAG_32B; + hdr->pd_hdr.ol_flag |= htons(0x1 << OUTER_IP_CHECKSUM_OFFSET); + pkt_protocol_parse(skb, hdr, 1); + hdr->pi_hdr.hdr_l3_offset = htons(edev->hdr_len + skb_inner_network_offset(skb)); + hdr->pi_hdr.hdr_l4_offset = htons(edev->hdr_len + skb_inner_transport_offset(skb)); + } + + hdr->pi_hdr.pkt_action_flag1 |= htons(0x1 << INNER_IP_CHECKSUM_OFFSET); + hdr->pi_hdr.pkt_action_flag2 |= 0x1 << INNER_L4_CHECKSUM_OFFSET; + return 0; +} + +static int pd_hdr_validate_vlan(struct zxdh_en_device *edev, struct sk_buff *skb, struct zxdh_net_hdr *hdr) +{ + /* pf set vf vlan is done*/ + if (edev->vlan_dev.vlan_id) + { + if (!skb_vlan_tag_present(skb)) + { + hdr->pd_hdr.cvlan.tci = htons(edev->vlan_dev.vlan_id); + hdr->pd_hdr.cvlan.tpid = (edev->vlan_dev.protcol); + hdr->pd_hdr.ol_flag |= htons(TXCAP_CTAG_INSERT_EN_BIT); + return 0; + } + else + { + hdr->pd_hdr.svlan.tci = htons(edev->vlan_dev.vlan_id); + hdr->pd_hdr.svlan.tpid = (edev->vlan_dev.protcol); + hdr->pd_hdr.ol_flag |= htons(TXCAP_STAG_INSERT_EN_BIT); + } + } + + /* insert vlan hard-accellate when skb is taged to be inserted, eg. in vlan interface case*/ + if (skb && skb_vlan_tag_present(skb)) + { + hdr->pd_hdr.cvlan.tci = htons(skb_vlan_tag_get(skb)); + hdr->pd_hdr.cvlan.tpid = (skb->vlan_proto); + hdr->pd_hdr.ol_flag |= htons(TXCAP_CTAG_INSERT_EN_BIT); + } + return 0; +} + + +int32_t pi_net_hdr_from_skb(struct zxdh_en_device *edev, struct sk_buff *skb, struct zxdh_net_hdr *hdr) +{ + uint32_t gso_type = 0; + uint16_t mss = 0; +#ifdef TIME_STAMP_1588 + int32_t ret = 0; +#endif + + memset(hdr, 0, sizeof(*hdr)); /* no info leak */ + hdr->pd_len = edev->hdr_len / HDR_2B_UNIT; + hdr->pi_hdr.bttl_pi_len = DISABLE_PI_FIELD_PARSE + ENABLE_PI_FLAG_32B; + hdr->tx_port = TX_PORT_DTP; + hdr->pi_hdr.pt.type_ctx.pkt_src = PKT_SRC_CPU; + hdr->pi_hdr.eth_port_id = INVALID_ETH_PORT_ID; + + if(edev->delay_statistics_enable) + { + pkt_delay_statistics_proc(skb, hdr, edev); + } + +// #ifdef TIME_STAMP_1588 +// ret = pkt_1588_proc_xmit(skb, hdr, edev->clock_no, edev); +// switch (ret) +// { +// case PTP_SUCCESS: +// { +// LOG_DEBUG("pkt_1588_proc_xmit success!!!\n"); +// return 0; +// } +// case IS_NOT_PTP_MSG: +// { +// LOG_DEBUG("not ptp msg!!\n"); +// break; +// } +// default: +// { +// LOG_ERR("pkt_1588_proc_xmit err!!!\n"); +// return ret; +// } +// } +// #endif + + pd_hdr_validate_vlan(edev, skb, hdr); + + mss = skb_shinfo(skb)->gso_size; + gso_type = skb_shinfo(skb)->gso_type; + if(gso_type & SKB_GSO_TCPV4) + { + mss = (mss > 0) ? min(skb_shinfo(skb)->gso_size, (uint16_t)(edev->netdev->mtu - IP_BASE_HLEN - TCP_BASE_HLEN)) + : (uint16_t)(edev->netdev->mtu - IP_BASE_HLEN - TCP_BASE_HLEN); + hdr->pi_hdr.pkt_action_flag1 |= htons((mss / ETH_MTU_4B_UNIT) + NOT_IP_FRG_CSUM_FLAG); + hdr->pi_hdr.pkt_action_flag2 |= TCP_FRG_CSUM_FLAG; /*0x24 bit21,18: 带pi,tso,计算checksum */ + } + else if(gso_type & SKB_GSO_TCPV6) + { + mss = (mss > 0) ? min(skb_shinfo(skb)->gso_size, (uint16_t)(edev->netdev->mtu - IPV6_BASE_HLEN - TCP_BASE_HLEN)) + : (uint16_t)(edev->netdev->mtu - IPV6_BASE_HLEN - TCP_BASE_HLEN); + hdr->pi_hdr.pkt_action_flag1 |= htons((mss / ETH_MTU_4B_UNIT) + NOT_IP_FRG_CSUM_FLAG); + hdr->pi_hdr.pkt_action_flag2 |= TCP_FRG_CSUM_FLAG; /*0x24 bit21,18: 带pi,tso,计算checksum */ + } + else if(gso_type & (SKB_GSO_UDP | SKB_GSO_UDP_L4 | SKB_GSO_UDP_TUNNEL | SKB_GSO_UDP_TUNNEL_CSUM)) + { + hdr->pi_hdr.pkt_action_flag1 = htons((uint16_t)(edev->netdev->mtu / ETH_MTU_4B_UNIT) + IP_FRG_CSUM_FLAG); + hdr->pi_hdr.pkt_action_flag2 |= NOT_TCP_FRG_CSUM_FLAG; + } + else + { + hdr->pi_hdr.pkt_action_flag1 |= htons((edev->netdev->mtu / ETH_MTU_4B_UNIT) + NOT_IP_FRG_CSUM_FLAG); + hdr->pi_hdr.pkt_action_flag2 |= NOT_TCP_FRG_CSUM_FLAG; + } + + if (edev->netdev->features & NETIF_F_HW_CSUM) + { + zxdh_tx_checksum_offload(edev, skb, hdr); + } + + if ((edev->ops->is_bond(edev->parent)) && + (skb->protocol == htons(ETH_P_SLOW) || skb->protocol == htons(ETH_P_PAUSE))) + { + hdr->pd_hdr.ol_flag |= htons(PANELID_EN); + hdr->pd_hdr.panel_id = edev->phy_port; + } + + #ifdef ZXDH_DCBNL_OPEN + if (NULL != skb->sk) + { + hdr->pd_hdr.ol_flag |= htons(ZXDH_DCBNL_SET_SK_PRIO(skb->sk->sk_priority)); + } + #endif + + +#ifdef TIME_STAMP_1588 + ret = pkt_1588_proc_xmit(skb, hdr, edev->clock_no, edev); + switch (ret) + { + case PTP_SUCCESS: + { + LOG_DEBUG("pkt_1588_proc_xmit success!!!\n"); + return 0; + } + case IS_NOT_PTP_MSG: + { + LOG_DEBUG("not ptp msg!!\n"); + break; + } + default: + { + LOG_ERR("pkt_1588_proc_xmit err!!!\n"); + return ret; + } + } +#endif + return 0; +} + +int32_t xmit_skb(struct net_device *netdev, struct send_queue *sq, struct sk_buff *skb) +{ + struct zxdh_net_hdr *hdr = NULL; + //const unsigned char *dest = ((struct ethhdr *)skb->data)->h_dest; + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + int32_t num_sg = 0; + unsigned hdr_len = en_dev->hdr_len; + bool can_push = false; + uint8_t *hdr_buf = sq->hdr_buf; + + can_push = en_dev->any_header_sg && + !((unsigned long)skb->data & (__alignof__(*hdr) - 1)) && + !skb_header_cloned(skb) && skb_headroom(skb) >= hdr_len; + /* Even if we can, don't push here yet as this would skew + * csum_start offset below. */ + if (can_push) + { + hdr = (struct zxdh_net_hdr *)(skb->data - hdr_len); + } + else + { + memset(hdr_buf, 0, HDR_BUFFER_LEN); + hdr = (struct zxdh_net_hdr *)hdr_buf; + } + + if (pi_net_hdr_from_skb(en_dev, skb, hdr)) + { + return -EPROTO; + } + + sg_init_table(sq->sg, skb_shinfo(skb)->nr_frags + (can_push ? 1 : 2)); + if (can_push) + { + __skb_push(skb, hdr_len); + num_sg = skb_to_sgvec(skb, sq->sg, 0, skb->len); + if (unlikely(num_sg < 0)) + { + return num_sg; + } + /* Pull header back to avoid skew in tx bytes calculations. */ + __skb_pull(skb, hdr_len); + } + else + { + sg_set_buf(sq->sg, hdr, hdr_len); + num_sg = skb_to_sgvec(skb, sq->sg + 1, 0, skb->len); + if (unlikely(num_sg < 0)) + { + return num_sg; + } + num_sg++; + } + + return virtqueue_add_outbuf(sq->vq, sq->sg, num_sg, skb, GFP_ATOMIC); +} + +netdev_tx_t zxdh_en_xmit(struct sk_buff *skb, struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + int32_t qnum = skb_get_queue_mapping(skb); + struct send_queue *sq = &en_dev->sq[qnum]; + int32_t err = 0; + struct netdev_queue *txq = netdev_get_tx_queue(netdev, qnum); + bool kick = !netdev_xmit_more(); + bool use_napi = sq->napi.weight; + + /* Free up any pending old buffers before queueing new ones. */ + do { + if (use_napi) + { + virtqueue_disable_cb(sq->vq); + } + + free_old_xmit_skbs(netdev, sq, false); + + } while (use_napi && kick && unlikely(!virtqueue_enable_cb_delayed(sq->vq))); + + /* timestamp packet in software */ + skb_tx_timestamp(skb); + + /* Try to transmit */ + err = xmit_skb(netdev, sq, skb); + + /* This should not happen! */ + if (unlikely(err)) + { + netdev->stats.tx_fifo_errors++; + netdev->stats.tx_errors++; + if (net_ratelimit()) + { + LOG_WARN("unexpected TXQ (%d) queue failure: %d\n", qnum, err); + } + netdev->stats.tx_dropped++; + dev_kfree_skb_any(skb); + return NETDEV_TX_OK; + } + + /* If running out of space, stop queue to avoid getting packets that we + * are then unable to transmit. + * An alternative would be to force queuing layer to requeue the skb by + * returning NETDEV_TX_BUSY. However, NETDEV_TX_BUSY should not be + * returned in a normal path of operation: it means that driver is not + * maintaining the TX queue stop/start state properly, and causes + * the stack to do a non-trivial amount of useless work. + * Since most packets only take 1 or 2 ring slots, stopping the queue + * early means 16 slots are typically wasted. + */ + if (sq->vq->num_free < 2 + MAX_SKB_FRAGS) + { + netif_stop_subqueue(netdev, qnum); + en_dev->hw_stats.q_stats[qnum].q_tx_stopped++; + if (!use_napi && unlikely(!virtqueue_enable_cb_delayed(sq->vq))) + { + /* More just got used, free them then recheck. */ + free_old_xmit_skbs(netdev, sq, false); + if (sq->vq->num_free >= 2 + MAX_SKB_FRAGS) + { + netif_start_subqueue(netdev, qnum); + virtqueue_disable_cb(sq->vq); + } + } + } + + if (kick || netif_xmit_stopped(txq)) + { + if (virtqueue_kick_prepare_packed(sq->vq) && virtqueue_notify(sq->vq)) + { + u64_stats_update_begin(&sq->stats.syncp); + sq->stats.kicks++; + u64_stats_update_end(&sq->stats.syncp); + } + } + + return NETDEV_TX_OK; +} + +#ifdef HAVE_NDO_GET_STATS64 +#ifdef HAVE_VOID_NDO_GET_STATS64 +static void zxdh_en_get_netdev_stats_struct(struct net_device *netdev, struct rtnl_link_stats64 *stats) +#else +static struct rtnl_link_stats64 *zxdh_en_get_netdev_stats_struct(struct net_device *netdev, struct rtnl_link_stats64 *stats) +#endif +{ +#ifdef HAVE_VOID_NDO_GET_STATS64 + struct zxdh_en_device *en_dev = netdev_priv(netdev); + struct receive_queue *rq = NULL; + struct send_queue *sq = NULL; + uint32_t start = 0; + uint32_t i = 0; + uint64_t tpackets = 0; + uint64_t tbytes = 0; + uint64_t rpackets = 0; + uint64_t rbytes = 0; + uint64_t rdrops = 0; + uint32_t loop_cnt = en_dev->max_queue_pairs; + int32_t ret = 0; + + if (en_dev->ops->is_bond(en_dev->parent)) + { + ret = zxdh_mac_stats_get(en_dev); + if (ret != 0) + { + LOG_ERR("zxdh_mac_stats_get failed, ret: %d\n", ret); + return; + } + + stats->rx_packets = en_dev->hw_stats.phy_stats.rx_packets_phy; + stats->rx_bytes = en_dev->hw_stats.phy_stats.rx_bytes_phy; + stats->rx_errors = en_dev->hw_stats.phy_stats.rx_errors; + stats->rx_dropped = en_dev->hw_stats.phy_stats.rx_discards; + stats->tx_packets = en_dev->hw_stats.phy_stats.tx_packets_phy; + stats->tx_bytes = en_dev->hw_stats.phy_stats.tx_bytes_phy; + stats->tx_errors = en_dev->hw_stats.phy_stats.tx_errors; + stats->tx_dropped = en_dev->hw_stats.phy_stats.tx_drop; + return; + } + +#ifdef ZXDH_MSGQ + NEED_MSGQ(en_dev) + { + loop_cnt--; + } +#endif + + for (i = 0; i < loop_cnt; ++i) + { + sq = &en_dev->sq[i]; + rq = &en_dev->rq[i]; + do + { + start = u64_stats_fetch_begin_irq(&sq->stats.syncp); + tpackets = sq->stats.packets; + tbytes = sq->stats.bytes; + } while (u64_stats_fetch_retry_irq(&sq->stats.syncp, start)); + + do + { + start = u64_stats_fetch_begin_irq(&rq->stats.syncp); + rpackets = rq->stats.packets; + rbytes = rq->stats.bytes; + rdrops = rq->stats.drops; + } while (u64_stats_fetch_retry_irq(&rq->stats.syncp, start)); + + stats->rx_packets += rpackets; + stats->rx_bytes += rbytes; + stats->rx_dropped += rdrops; + stats->tx_packets += tpackets; + stats->tx_bytes += tbytes; + } + + stats->rx_errors = netdev->stats.rx_errors; + stats->tx_errors = netdev->stats.tx_errors; + stats->tx_dropped = netdev->stats.tx_dropped; + stats->tx_carrier_errors = netdev->stats.tx_carrier_errors; + return; +#else + return stats; +#endif +} +#endif/* HAVE_VOID_NDO_GET_STATS_64 */ + +static void zxdh_en_set_rx_mode(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + + queue_work(en_priv->events->wq, &en_dev->rx_mode_set_work); +} + +void rx_mode_set_handler(struct work_struct *work) +{ + struct zxdh_en_device *en_dev = container_of(work, struct zxdh_en_device, rx_mode_set_work); + bool promisc_changed = false; + bool allmulti_changed = false; + int32_t err = 0; + uint8_t fow = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + ZXDH_AUX_INIT_COMP_CHECK(en_dev); + + if (en_dev->ops->is_bond(en_dev->parent)) + { + return; + } + + promisc_changed = en_dev->netdev->flags & IFF_PROMISC; + allmulti_changed = en_dev->netdev->flags & IFF_ALLMULTI; + if (en_dev->promisc_enabled != promisc_changed) + { + LOG_INFO("promisc_changed: %d", promisc_changed); + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + dpp_vport_uc_promisc_set(&pf_info, promisc_changed); + if (!en_dev->allmulti_enabled) + { + dpp_vport_mc_promisc_set(&pf_info, promisc_changed); + } + } + else + { + if (!en_dev->allmulti_enabled) + { + fow = 1; + } + err = zxdh_vf_port_promisc_set(en_dev, ZXDH_PROMISC_MODE, promisc_changed, fow); + if (err != 0) + { + LOG_ERR("zxdh_vf_port_promisc_set failed\n"); + return; + } + } + en_dev->promisc_enabled = promisc_changed; + } + + if (en_dev->allmulti_enabled != allmulti_changed) + { + LOG_INFO("allmulti_changed: %d", allmulti_changed); + if (!en_dev->promisc_enabled) + { + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + dpp_vport_mc_promisc_set(&pf_info, allmulti_changed); + } + else + { + err = zxdh_vf_port_promisc_set(en_dev, ZXDH_ALLMULTI_MODE, allmulti_changed, fow); + if (err != 0) + { + LOG_ERR("zxdh_vf_port_promisc_set failed\n"); + return; + } + } + } + en_dev->allmulti_enabled = allmulti_changed; + } +} + +static int zxdh_en_bar_cfg_mac(struct net_device *netdev, const char *mac) +{ + int ret = 0; + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + union zxdh_msg msg = {0}; + + memcpy(msg.payload.mac_cfg_msg.ifname, netdev->name, IFNAMSIZ); + memcpy(msg.payload.mac_cfg_msg.mac, mac, ETH_ALEN); + msg.payload.mac_cfg_msg.pannel_id = en_dev->panel_id; + + if (en_dev->ops->is_bond(en_dev->parent)) + { + msg.payload.mac_cfg_msg.pannel_id = en_dev->pannel_id; + } + msg.payload.mac_cfg_msg.ctl = 1; + + ret = zxdh_send_command_to_specify(en_dev, MODULE_CFG_MAC, &msg, &msg); + if (ret != 0 || msg.reps.flag != ZXDH_REPS_SUCC) + { + LOG_ERR("config mac info failed\n"); + return -msg.reps.flag; + } + return 0; +} + +static int zxdh_en_bar_del_mac(struct net_device *netdev) +{ + int ret = 0; + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + union zxdh_msg msg = {0}; + + msg.payload.mac_cfg_msg.pannel_id = en_dev->panel_id; + + if (en_dev->ops->is_bond(en_dev->parent)) + { + msg.payload.mac_cfg_msg.pannel_id = en_dev->pannel_id; + } + msg.payload.mac_cfg_msg.ctl = 0; + + ret = zxdh_send_command_to_specify(en_dev, MODULE_CFG_MAC, &msg, &msg); + if (ret != 0 || msg.reps.flag != ZXDH_REPS_SUCC) + { + LOG_ERR("del mac info failed.\n"); + return -msg.reps.flag; + } + return 0; +} + +static int zxdh_en_set_mac(struct net_device *netdev, void *p) +{ + struct sockaddr *addr = (struct sockaddr *)p; + struct zxdh_en_device *en_dev = NULL; + struct zxdh_en_priv *en_priv = NULL; + struct netdev_hw_addr *ha = NULL; + bool delete_flag = true; + bool add_flag = true; + int32_t ret = 0; + DPP_PF_INFO_T pf_info = {0}; + + if (!is_valid_ether_addr(addr->sa_data)) + { + LOG_INFO("invalid mac address %pM\n", addr->sa_data); + return -EADDRNOTAVAIL; + } + + if (ether_addr_equal(netdev->dev_addr, addr->sa_data)) + { + LOG_INFO("already using mac address %pM\n", addr->sa_data); + return 0; + } + + list_for_each_entry(ha, &netdev->uc.list, list) + { + if (!memcmp(ha->addr, netdev->dev_addr, netdev->addr_len)) + { + delete_flag = false; + } + + if (!memcmp(ha->addr, addr->sa_data, netdev->addr_len)) + { + add_flag = false; + } + } + + en_priv = netdev_priv(netdev); + en_dev = &en_priv->edev; + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + if (en_dev->ops->is_bond(en_dev->parent)) + { + ether_addr_copy(netdev->dev_addr, addr->sa_data); + zxdh_en_bar_del_mac(netdev); + zxdh_en_bar_cfg_mac(netdev, netdev->dev_addr); + return 0; + } + + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + if (delete_flag) + { + ret = dpp_del_mac(&pf_info, netdev->dev_addr); + if (ret != 0) + { + LOG_ERR("pf del mac failed, retval: %d\n", ret); + return ret; + } + } + + if (add_flag) + { + ret = dpp_add_mac(&pf_info, addr->sa_data); + if (ret != 0) + { + LOG_ERR("pf add mac failed: %d\n", ret); + return ret; + } + } + + LOG_INFO("set pf new mac address %pM\n", addr->sa_data); + ether_addr_copy(netdev->dev_addr, addr->sa_data); + if (!en_dev->ops->is_upf(en_dev->parent)) + { + zxdh_en_bar_del_mac(netdev); + zxdh_en_bar_cfg_mac(netdev, netdev->dev_addr); + } + } + else + { + ret = zxdh_vf_dpp_del_mac(en_dev, netdev->dev_addr, UNFILTER_MAC, delete_flag); + if (ret != 0) + { + LOG_ERR("zxdh vf dpp del mac failed: %d\n", ret); + return ret; + } + + if (add_flag) + { + ret = zxdh_vf_dpp_add_mac(en_dev, addr->sa_data, UNFILTER_MAC); + if (ret != 0) + { + LOG_ERR("zxdh vf dpp add mac failed: %d\n", ret); + return ret; + } + en_dev->ops->set_mac(en_dev->parent, addr->sa_data); + } + + LOG_INFO("set vf new mac address %pM\n", addr->sa_data); + ether_addr_copy(netdev->dev_addr, addr->sa_data); + } + + return ret; +} + +int32_t zxdh_en_config_mtu_to_np(struct net_device *netdev, int32_t mtu_value) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + int32_t ret = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + dpp_panel_attr_set(&pf_info, en_dev->phy_port, PANEL_FLAG_MTU_OFFLOAD_ENABLE, 1); + dpp_panel_attr_set(&pf_info, en_dev->phy_port, PANEL_FLAG_MTU, mtu_value); + dpp_egr_port_attr_set(&pf_info, EGR_FLAG_MTU_OFFLOAD_EN_OFF, 1); + dpp_egr_port_attr_set(&pf_info, EGR_FLAG_MTU, mtu_value); + } + else + { + ret = zxdh_vf_egr_port_attr_set(en_dev, EGR_FLAG_MTU_OFFLOAD_EN_OFF, 1, 0); + if (ret != 0) + { + LOG_ERR("zxdh_vf_egr_port_attr_set config mtu enable failed: %d\n", ret); + return ret; + } + ret = zxdh_vf_egr_port_attr_set(en_dev, EGR_FLAG_MTU, mtu_value, 0); + if (ret != 0) + { + LOG_ERR("zxdh_vf_egr_port_attr_set config mut value failed: %d\n", ret); + return ret; + } + } + + return 0; +} + +static int zxdh_en_change_mtu(struct net_device *netdev, int new_mtu) +{ + int32_t ret = 0; + + if ((new_mtu < ETH_MIN_MTU) || (new_mtu > ZXDH_MAX_MTU)) + { + return -EINVAL; + } + LOG_INFO("changing MTU from %d to %d\n", netdev->mtu, new_mtu); + + netdev->mtu = new_mtu; + + ret = zxdh_en_config_mtu_to_np(netdev, new_mtu); + if (ret != 0) + { + LOG_ERR("zxdh_en_config_mtu_to_np failed: %d\n", ret); + return ret; + } + + return 0; +} + +#ifdef HAVE_TX_TIMEOUT_TXQUEUE +static void zxdh_en_tx_timeout(struct net_device *netdev, unsigned int txqueue) +{ + return; +} +#else +static void zxdh_en_tx_timeout(struct net_device *netdev) +{ + return; +} +#endif + +#ifdef HAVE_VLAN_RX_REGISTER +static void zxdh_en_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp) +{ + return; +} +#endif + +static int __attribute__((unused)) vf_vlan_rx_add_vid(struct net_device *netdev, u16 vid) +{ + int ret = 0; + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + union zxdh_msg msg = {0}; + + msg.payload.hdr.op_code = ZXDH_VLAN_FILTER_ADD; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.hdr.pcie_id = en_dev->pcie_id; + msg.payload.rx_vid_add_msg.vlan_id = vid; + + ret = zxdh_send_command_to_specify(en_dev, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg); + if (ret != 0 || msg.reps.flag != ZXDH_REPS_SUCC) + { + LOG_ERR("pcieid:0x%x send msg to pf add vlan:%d failed! ret = %d, flag = 0x%x\n", + en_dev->pcie_id, + vid, + ret, + msg.reps.flag); + return -1; + } + + return 0; +} + +#if defined(HAVE_INT_NDO_VLAN_RX_ADD_VID) && defined(NETIF_F_HW_VLAN_CTAG_RX) +static int zxdh_en_vlan_rx_add_vid(struct net_device *netdev, __always_unused __be16 proto, u16 vid) +{ + int retval = 0; +#if 0 + struct zxdh_en_priv *zxdev = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &zxdev->edev; + uint16_t pcieid = en_dev->pcie_id; + + if (vid > MAX_VLAN_ID) + { + LOG_ERR("vlan id:%d input is err!\n", vid); + return -EINVAL; + } + + if ((pcieid & PF_AC_MASK) == 0) /* VF */ + { + retval = vf_vlan_rx_add_vid(netdev, vid); + goto exit; + } + + retval = dpp_add_vlan_filter(zxdev->edev.vport, vid); + if (0 != retval) + { + LOG_ERR("failed to add vlan: %d\n",vid); + goto exit; + } + LOG_INFO("pf add vlan %d succeed.\n", vid); + +exit: +#endif + return retval; +} +#elif defined(HAVE_INT_NDO_VLAN_RX_ADD_VID) && !defined(NETIF_F_HW_VLAN_CTAG_RX) +static int zxdh_en_vlan_rx_add_vid(struct net_device *netdev, u16 vid) +{ + return 0; +} +#else +static void zxdh_en_vlan_rx_add_vid(struct net_device *netdev, u16 vid) +{ + return; +} +#endif + +static int vf_vlan_rx_del_vid(struct net_device *netdev, u16 vid) +{ + int ret = 0; + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + union zxdh_msg msg = {0}; + + msg.payload.hdr.op_code = ZXDH_VLAN_FILTER_DEL; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.hdr.pcie_id = en_dev->pcie_id; + msg.payload.rx_vid_del_msg.vlan_id = vid; + + ret = zxdh_send_command_to_specify(en_dev, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg); + if (ret != 0 || msg.reps.flag != ZXDH_REPS_SUCC) + { + LOG_ERR("pcieid:0x%x send msg to pf del vlan:%d failed! ret = %d, flag = 0x%x\n", + en_dev->pcie_id, + vid, + ret, + msg.reps.flag); + return -1; + } + + return 0; +} + + +#if defined(HAVE_INT_NDO_VLAN_RX_ADD_VID) && defined(NETIF_F_HW_VLAN_CTAG_RX) +static int zxdh_en_vlan_rx_kill_vid(struct net_device *netdev, __always_unused __be16 proto, u16 vid) +{ + int retval = 0; + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + uint16_t pcieid = en_dev->pcie_id; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + if (vid > MAX_VLAN_ID) + { + LOG_ERR("vlan id:%d input is err!\n", vid); + return -EINVAL; + } + + if ((pcieid & PF_AC_MASK) == 0) /* VF */ + { + retval = vf_vlan_rx_del_vid(netdev, vid); + goto exit; + } + + retval = dpp_del_vlan_filter(&pf_info, vid); + if (0 != retval) + { + LOG_ERR("failed to del vlan: %d\n", vid); + goto exit; + } + LOG_INFO("pf del vlan %d succeed.\n", vid); + +exit: + return retval; +} +#elif defined(HAVE_INT_NDO_VLAN_RX_ADD_VID) && !defined(NETIF_F_HW_VLAN_CTAG_RX) +static int zxdh_en_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) +{ + return 0; +} +#else +static void zxdh_en_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) +{ + return; +} +#endif + +static void zxdh_en_netpoll(struct net_device *netdev) +{ + return; +} + +#ifdef HAVE_SETUP_TC +int zxdh_en_setup_tc(struct net_device *netdev, u8 tc) +{ + return 0; +} + +#ifdef NETIF_F_HW_TC +#ifdef HAVE_NDO_SETUP_TC_REMOVE_TC_TO_NETDEV +static int __zxdh_en_setup_tc(struct net_device *netdev, enum tc_setup_type type, void *type_data) +#elif defined(HAVE_NDO_SETUP_TC_CHAIN_INDEX) +static int __zxdh_en_setup_tc(struct net_device *netdev, u32 handle, + u32 chain_index, __be16 proto, + struct tc_to_netdev *tc) +#else +static int __zxdh_en_setup_tc(struct net_device *netdev, u32 handle, __be16 proto, + struct tc_to_netdev *tc) +#endif +{ + return 0; +} +#endif +#endif + +#ifdef HAVE_NDO_GET_PHYS_PORT_ID +static int zxdh_en_get_phys_port_id(struct net_device *netdev, struct netdev_phys_item_id *ppid) +{ + return 0; +} +#endif /* HAVE_NDO_GET_PHYS_PORT_ID */ + + +static void zxdh_set_en_device(struct net_device *netdev, netdev_features_t features) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + + if ((features & NETIF_F_GSO) || (features & NETIF_F_GSO_UDP) || (features & NETIF_F_GSO_UDP_L4)) + { + en_dev->drs_offload = true; + } + else if ((features & NETIF_F_TSO) || (features & NETIF_F_HW_CSUM)) + { + en_dev->dtp_offload = true; + } + else + { + en_dev->np_direction = true; + } + + return; +} + +static int zxdh_handle_feature(struct net_device *netdev, + netdev_features_t *features, + netdev_features_t wanted_features, + netdev_features_t feature, + zxdh_feature_handler feature_handler) +{ + netdev_features_t changes = wanted_features ^ netdev->features; + bool enable = !!(wanted_features & feature); + int err; + + if (!(changes & feature) || feature_handler == NULL) + { + return 0; + } + + err = feature_handler(netdev, enable); + if (err) + { + LOG_ERR("%s feature %pNF failed, err %d\n", + enable ? "Enable" : "Disable", &feature, err); + return err; + } + + ZXDH_SET_FEATURE(features, feature, enable); + return 0; +} + +static int32_t zxdh_dtp_offload_set(struct zxdh_en_device *en_dev, DPP_PF_INFO_T *pf_info) +{ + ZXDH_VPORT_T port_attr_entry = {0}; + int32_t ret = 0; + + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + ret = dpp_egr_port_attr_get(pf_info, &port_attr_entry); + if (ret != 0) + { + LOG_ERR("dpp_egr_port_attr_get failed: %d\n", ret); + return ret; + } + + if (!port_attr_entry.lro_offload && !port_attr_entry.ip_fragment_offload && + !port_attr_entry.ip_checksum_offload && !port_attr_entry.tcp_udp_checksum_offload) + { + ret = dpp_egr_port_attr_set(pf_info, EGR_FLAG_ACCELERATOR_OFFLOAD_FLAG, 0); + } + else + { + ret = dpp_egr_port_attr_set(pf_info, EGR_FLAG_ACCELERATOR_OFFLOAD_FLAG, 1); + } + + return ret; + } + + ret = zxdh_vf_egr_port_attr_get(en_dev, &port_attr_entry); + if (ret != 0) + { + LOG_ERR("dpp_egr_port_attr_get failed: %d\n", ret); + return ret; + } + + if (!port_attr_entry.lro_offload && !port_attr_entry.ip_fragment_offload && + !port_attr_entry.ip_checksum_offload && !port_attr_entry.tcp_udp_checksum_offload) + { + ret = zxdh_vf_egr_port_attr_set(en_dev, EGR_FLAG_ACCELERATOR_OFFLOAD_FLAG, 0, 0); + } + else + { + ret = zxdh_vf_egr_port_attr_set(en_dev, EGR_FLAG_ACCELERATOR_OFFLOAD_FLAG, 1, 0); + } + + return ret; +} + +static int32_t set_feature_rx_checksum(struct net_device *netdev, bool enable) +{ + int en_value = enable ? 1 : 0; + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + DPP_PF_INFO_T pf_info = {0}; + int32_t ret = 0; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + ret = dpp_egr_port_attr_set(&pf_info, EGR_FLAG_IP_CHKSUM, enable); + if (ret != 0) + { + LOG_ERR("EGR_FLAG_IP_CHKSUM set failed: %d\n", ret); + return ret; + } + ret = dpp_egr_port_attr_set(&pf_info, EGR_FLAG_TCP_UDP_CHKSUM, enable); + if (ret != 0) + { + LOG_ERR("EGR_FLAG_TCP_UDP_CHKSUM set failed: %d\n", ret); + return ret; + } + } + else if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_VF) + { + ret = zxdh_vf_egr_port_attr_set(en_dev, EGR_FLAG_IP_CHKSUM, en_value, 0); + if (ret != 0) + { + LOG_ERR("EGR_FLAG_IP_CHKSUM set failed: %d\n", ret); + return ret; + } + ret = zxdh_vf_egr_port_attr_set(en_dev, EGR_FLAG_TCP_UDP_CHKSUM, en_value, 0); + if (ret != 0) + { + LOG_ERR("EGR_FLAG_TCP_UDP_CHKSUM set failed: %d\n", ret); + return ret; + } + } + + return zxdh_dtp_offload_set(en_dev, &pf_info); +} + +static int set_feature_tx_checksum(struct net_device *netdev, bool enable) +{ + if (enable) + { + netdev->features |= NETIF_F_HW_CSUM; + } + else + { + netdev->features &= ~NETIF_F_HW_CSUM; + } + return 0; +} + +static int set_feature_vxlan_checksum(struct net_device *netdev, bool enable) +{ + int ret = 0; + int en_value = enable ? 1 : 0; + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + if (enable) + { + netdev->features |= NETIF_F_GSO_UDP_TUNNEL_CSUM; + } + else + { + netdev->features &= ~NETIF_F_GSO_UDP_TUNNEL_CSUM; + } + + if(en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + ret = dpp_egr_port_attr_set(&pf_info, EGR_FLAG_OUTER_IP_CHECKSUM_OFFLOAD, enable); + if (ret != 0) + { + LOG_ERR("zxdh set vxlan rx checksum failed!\n"); + return ret; + } + } + else if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_VF) + { + ret = zxdh_vf_egr_port_attr_set(en_dev, EGR_FLAG_OUTER_IP_CHECKSUM_OFFLOAD, en_value, 0); + if (ret != 0) + { + LOG_ERR("zxdh_vf_egr_port_attr_set vxlan rx checksum failed!\n"); + return ret; + } + } + + return ret; +} + +static int32_t set_feature_rxhash(struct net_device *netdev, bool enable) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + if(en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + return dpp_vport_rss_en_set(&pf_info, enable); + } + + return zxdh_vf_rss_en_set(en_dev, enable); +} + +static int32_t set_vf_cvlan_filter(struct net_device *netdev, bool enable) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + union zxdh_msg msg = {0}; + int32_t ret = 0; + + msg.payload.hdr.op_code = ZXDH_VLAN_FILTER_SET; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.hdr.pcie_id = en_dev->pcie_id; + msg.payload.vlan_filter_set_msg.enable = enable; + + ret = zxdh_send_command_to_specify(en_dev, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg); + if (ret != 0 || msg.reps.flag != ZXDH_REPS_SUCC) + { + LOG_ERR("pcieid:0x%x send msg to pf set vlan filter enable:%s failed! ret = %d, flag = 0x%x\n", + en_dev->pcie_id, + enable ? "enable":"disable", + ret, + msg.reps.flag); + return -1; + } + + return 0; +} + +static int __attribute__((unused)) set_feature_cvlan_filter(struct net_device *netdev, bool enable) +{ + int ret = 0; + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + uint16_t pcieid = en_dev->pcie_id; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + if ((pcieid & PF_AC_MASK) == 0) /* VF */ + { + ret = set_vf_cvlan_filter(netdev, enable); + goto exit; + } + + ret = dpp_vport_vlan_filter_en_set(&pf_info, enable); + +exit: + return ret; +} + +static int __attribute__((unused)) set_feature_svlan_filter(struct net_device *netdev, bool enable) +{ + int ret = 0; +#if 0 //TODO:STAG 暂时没有设置 + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + + ret = dpp_vport_vlan_qinq_en_set(en_dev->vport, enable); +#endif + return ret; +} + +int set_vf_qinq_tpid(struct net_device *netdev, uint16_t tpid) +{ + int ret = 0; + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + union zxdh_msg msg = {0}; + + msg.payload.hdr.op_code = ZXDH_SET_TPID; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.tpid_cfg_msg.tpid = tpid; + + ret = zxdh_send_command_to_specify(en_dev, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg); + if (ret != 0 || msg.reps.flag != ZXDH_REPS_SUCC) + { + LOG_ERR("pcieid:0x%x send msg to vfs set tpid: 0x%x failed! ret = %d.\n", + en_dev->pcie_id, + tpid, + ret); + return -EINVAL; + } + + return 0; +} + +static int set_vf_vlan_strip(struct net_device *netdev, bool enable, uint8_t flag) +{ + int ret = 0; + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + union zxdh_msg msg = {0}; + + msg.payload.hdr.op_code = ZXDH_VLAN_OFFLOAD_SET; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.hdr.pcie_id = en_dev->pcie_id; + msg.payload.vlan_strip_msg.enable = enable; + msg.payload.vlan_strip_msg.flag = flag; + + ret = zxdh_send_command_to_specify(en_dev, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg); + if (ret != 0 || msg.reps.flag != ZXDH_REPS_SUCC) + { + LOG_ERR("pcieid:0x%x send msg to vfs set vlan strip enable:%s failed! ret = %d, flag = 0x%x\n", + en_dev->pcie_id, + enable ? "enable":"disable", + ret, + msg.reps.flag); + return -EINVAL; + } + + return 0; +} + +static int set_feature_vlan_strip(struct net_device *netdev, bool enable) +{ + int ret = 0; + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + ret = dpp_vport_vlan_strip_set(&pf_info, enable); + } + else + { + ret = set_vf_vlan_strip(netdev, enable, VLAN_STRIP_MSG_TYPE); + } + + return ret; +} + + +static int set_feature_qinq_strip(struct net_device *netdev, bool enable) +{ + int ret = 0; + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + ret = dpp_vport_vlan_qinq_en_set(&pf_info, enable); + } + else + { + ret = set_vf_vlan_strip(netdev, enable, QINQ_STRIP_MSG_TYPE); + } + + return ret; +} + + +static int32_t set_feature_lro(struct net_device *netdev, bool enable) +{ + uint32_t en_value = enable ? 1 : 0; + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + DPP_PF_INFO_T pf_info = {0}; + int32_t ret = 0; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + dpp_egr_port_attr_set(&pf_info, EGR_FLAG_IPV4_TCP_ASSEMBLE, en_value); + if (ret != 0) + { + LOG_ERR("EGR_FLAG_IPV4_TCP_ASSEMBLE set failed: %d\n", ret); + return ret; + } + dpp_egr_port_attr_set(&pf_info, EGR_FLAG_IPV6_TCP_ASSEMBLE, en_value); + if (ret != 0) + { + LOG_ERR("EGR_FLAG_IPV6_TCP_ASSEMBLE set failed: %d\n", ret); + return ret; + } + } + else + { + zxdh_vf_egr_port_attr_set(en_dev, EGR_FLAG_IPV4_TCP_ASSEMBLE, en_value, 0); + if (ret != 0) + { + LOG_ERR("EGR_FLAG_IPV4_TCP_ASSEMBLE set failed: %d\n", ret); + return ret; + } + zxdh_vf_egr_port_attr_set(en_dev, EGR_FLAG_IPV6_TCP_ASSEMBLE, en_value, 0); + if (ret != 0) + { + LOG_ERR("EGR_FLAG_IPV6_TCP_ASSEMBLE set failed: %d\n", ret); + return ret; + } + } + + return zxdh_dtp_offload_set(en_dev, &pf_info); +} + +int32_t zxdh_en_set_features(struct net_device *netdev, netdev_features_t wanted_features) +{ + int32_t ret = 0; + netdev_features_t oper_features = netdev->features; + + zxdh_set_en_device(netdev, wanted_features); + +#define ZXDH_HANDLE_FEATURE(set_feature, handler) \ + zxdh_handle_feature(netdev, &oper_features, wanted_features, set_feature, handler) + + ret |= ZXDH_HANDLE_FEATURE(NETIF_F_RXCSUM, set_feature_rx_checksum); + ret |= ZXDH_HANDLE_FEATURE(NETIF_F_HW_CSUM, set_feature_tx_checksum); + ret |= ZXDH_HANDLE_FEATURE(NETIF_F_GSO_UDP_TUNNEL_CSUM, set_feature_vxlan_checksum); + ret |= ZXDH_HANDLE_FEATURE(NETIF_F_RXHASH, set_feature_rxhash); + ret |= ZXDH_HANDLE_FEATURE(NETIF_F_LRO, set_feature_lro); + ret |= ZXDH_HANDLE_FEATURE(NETIF_F_HW_VLAN_CTAG_RX, set_feature_vlan_strip); + ret |= ZXDH_HANDLE_FEATURE(NETIF_F_HW_VLAN_STAG_RX, set_feature_qinq_strip); + + if (ret) + { + netdev->features = oper_features; + return -EINVAL; + } + + return 0; +} + +static uint32_t list_hw_addr_create(struct netdev_hw_addr_list *list, \ + const uint8_t *addr, int32_t addr_len, \ + uint8_t addr_type, bool global, \ + bool sync) +{ + struct netdev_hw_addr *ha = NULL; + + ha = kzalloc(sizeof(struct netdev_hw_addr), GFP_KERNEL); + if (ha == NULL) + { + LOG_ERR("Kzalloc struct netdev_hw_addr failed \n"); + return 1; + } + + /* 结构体赋值 */ + memcpy(ha->addr, addr, addr_len); + ha->type = addr_type; + ha->refcount = 1; /* 引用计数 */ + ha->global_use = global; + ha->synced = sync ? 1 : 0; + ha->sync_cnt = 0; + list_add_tail_rcu(&ha->list, &list->list); + list->count++; /* 链表节点加1 */ + + return 0; +} + +static uint32_t list_hw_addr_del(struct netdev_hw_addr_list *list, struct netdev_hw_addr *ha) +{ + int32_t refcount = ha->refcount; + + /* 引用的计数大于1,则不能删除此mac地址 */ + if (--refcount) + { + return 1; + } + + /* 从链表中删除此条目 */ + list_del_rcu(&ha->list); + + /* 释放ha结构体占用内存,rcu_head可以安全地释放ha占用的内存*/ + kfree_rcu(ha, rcu_head); + list->count--; + + return 0; +} + +bool is_this_mac_exist(struct net_device *netdev, const uint8_t *addr) +{ + struct netdev_hw_addr *ha = NULL; + bool isexist = false; + + /* 给net_device结构体上锁 */ + netif_addr_lock_bh(netdev); + + /* 判断此mac地址类型 */ + if (is_unicast_ether_addr(addr)) + { + /* 遍历单播mac地址链表 */ + list_for_each_entry(ha, &netdev->uc.list, list) + { + /* 检查该单播地址链表中是否存在此mac,且此mac地址标志为单播 */ + if ((!memcmp(ha->addr, addr, netdev->addr_len)) \ + && (ha->type == NETDEV_HW_ADDR_T_UNICAST)) + { + isexist = true; + goto out; + } + } + } + else + { + /* 遍历组播mac地址链表 */ + list_for_each_entry(ha, &netdev->mc.list, list) + { + /* 检查该组播地址链表中是否存在此mac,且此mac地址类型为组播 */ + if ((!memcmp(ha->addr, addr, netdev->addr_len)) \ + && (ha->type == NETDEV_HW_ADDR_T_MULTICAST)) + { + isexist = true; + goto out; + } + } + } + +out: + /* 给net_device结构体释放锁 */ + netif_addr_unlock_bh(netdev); + + return isexist; +} + +/** + * zxdh_dev_list_addr_add - 在地址链表中添加此mac地址 + * @netdev: 网络设备结构体 + * @addr: 要添加的mac地址 + * @addr_type: mac地址类型 + */ +int32_t zxdh_dev_list_addr_add(struct net_device *netdev, const uint8_t *addr) +{ + int32_t err = 0; + + /* 给net_device结构体上锁 */ + netif_addr_lock_bh(netdev); + + /* 判断此mac地址类型 */ + if (is_unicast_ether_addr(addr)) + { + /* 将此mac地址添加到地址链表中 */ + err = list_hw_addr_create(&netdev->uc, addr, netdev->addr_len, \ + NETDEV_HW_ADDR_T_UNICAST, false, false); + if (err != 0) + { + LOG_ERR("list_hw_addr_create failed\n"); + } + } + else + { + err = list_hw_addr_create(&netdev->mc, addr, netdev->addr_len, \ + NETDEV_HW_ADDR_T_MULTICAST, false, false); + if (err != 0) + { + LOG_ERR("list_hw_addr_create failed\n"); + } + } + + /* 给net_device结构体释放锁 */ + netif_addr_unlock_bh(netdev); + + return err; +} + +/** + * zxdh_dev_list_addr_del - 在地址链表中删除此mac地址 + * @netdev: 网络设备结构体 + * @addr: 要删除的mac地址 + * @addr_type: mac地址类型 + */ +int32_t zxdh_dev_list_addr_del(struct net_device *netdev, const uint8_t *addr) +{ + struct netdev_hw_addr *ha = NULL; + int32_t err = 0; + + /* 给net_device上锁 */ + netif_addr_lock_bh(netdev); + + if (is_unicast_ether_addr(addr)) + { + /* 遍历单播mac地址链表 */ + list_for_each_entry(ha, &netdev->uc.list, list) + { + /* 检查该单播地址链表中是否存在此mac,且此mac地址标志为单播 */ + if ((!memcmp(ha->addr, addr, netdev->addr_len)) \ + && (ha->type == NETDEV_HW_ADDR_T_UNICAST)) + { + /* 从单播地址链表中删除此mac */ + err = list_hw_addr_del(&netdev->uc, ha); + if (err != 0) + { + LOG_ERR("list_hw_addr_del failed\n"); + } + goto out; + } + } + } + else + { + /* 遍历组播mac地址链表 */ + list_for_each_entry(ha, &netdev->mc.list, list) + { + /* 检查该组播地址链表中是否存在此mac,且此mac地址标志为组播 */ + if ((!memcmp(ha->addr, addr, netdev->addr_len)) \ + && (ha->type == NETDEV_HW_ADDR_T_MULTICAST)) + { + /* 从组播地址链表中删除此mac */ + err = list_hw_addr_del(&netdev->mc, ha); + if (err != 0) + { + LOG_ERR("list_hw_addr_del failed\n"); + } + goto out; + } + } + } + +out: + /* 给net_device结构体释放锁 */ + netif_addr_unlock_bh(netdev); + + return err; +} + +#ifdef MAC_CONFIG_DEBUG +int32_t zxdh_pf_dump_all_mac(struct zxdh_en_device *en_dev) +{ + MAC_VPORT_INFO *unicast_mac_arry = NULL; + MAC_VPORT_INFO *multicast_mac_arry = NULL; + uint32_t current_unicast_num = 0; + uint32_t current_multicast_num = 0; + int32_t err = 1; + int32_t i = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + /* 开辟单播数组和组播数组*/ + unicast_mac_arry = (MAC_VPORT_INFO *)kzalloc(sizeof(MAC_VPORT_INFO)*UNICAST_MAX_NUM, GFP_KERNEL); + if (unicast_mac_arry == NULL) + { + LOG_ERR("kzalloc unicast_mac_arry failed \n"); + return err; + } + + multicast_mac_arry = (MAC_VPORT_INFO *)kzalloc(sizeof(MAC_VPORT_INFO)*MULTICAST_MAX_NUM, GFP_KERNEL); + if (multicast_mac_arry == NULL) + { + LOG_ERR("kzalloc multicast_mac_arry failed \n"); + goto out1; + } + + /* 从NP中dump所有单播mac地址*/ + err = dpp_unicast_mac_dump(&pf_info, unicast_mac_arry, ¤t_unicast_num); + if (err != 0) + { + LOG_ERR("dpp_unicast_mac_dump failed\n"); + goto out2; + } + + /* 从NP中dump所有组播mac地址*/ + err = dpp_multicast_mac_dump(&pf_info, multicast_mac_arry, ¤t_multicast_num); + if (err != 0) + { + LOG_ERR("dpp_multicast_mac_dump failed\n"); + goto out2; + } + + for(i = 0; i < current_unicast_num; ++i) + { + LOG_INFO("unicast_mac_arry[%d].vport is %#x\n", i, unicast_mac_arry[i].vport); + LOG_INFO("unicast_mac_arry[%d].mac is %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", i, \ + unicast_mac_arry[i].addr[0], unicast_mac_arry[i].addr[1], \ + unicast_mac_arry[i].addr[2], unicast_mac_arry[i].addr[3], \ + unicast_mac_arry[i].addr[4], unicast_mac_arry[i].addr[5]); + } + for(i = 0; i < current_multicast_num; ++i) + { + LOG_INFO("multicast_mac_arry[%d].vport is %#x\n", i, multicast_mac_arry[i].vport); + LOG_INFO("multicast_mac_arry[%d].mac is %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", i, \ + multicast_mac_arry[i].addr[0], multicast_mac_arry[i].addr[1], \ + multicast_mac_arry[i].addr[2], multicast_mac_arry[i].addr[3], \ + multicast_mac_arry[i].addr[4], multicast_mac_arry[i].addr[5]); + } + +out2: + if (multicast_mac_arry != NULL) + { + kfree(multicast_mac_arry); + } + +out1: + if (unicast_mac_arry != NULL) + { + kfree(unicast_mac_arry); + } + + return err; +} +#endif /* MAC_CONFIG_DEBUG */ + +int32_t unicast_mac_add(struct zxdh_en_device *en_dev, struct net_device *dev, \ + const uint8_t* addr, uint16_t flags) +{ + int32_t err = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + /* 判断目前所配置mac地址数量是否超过上限 */ + if (en_dev->curr_unicast_num >= DEV_UNICAST_MAX_NUM-1) + { + LOG_ERR("curr_unicast_num is beyond maximum\n"); + return -ENOSPC; + } + + /* 遍历单播地址链表,判断是否存在此单播mac */ + if (is_this_mac_exist(dev, addr)) + { + LOG_DEBUG("Mac already exists\n"); + if (!(flags & NLM_F_EXCL)) + { + return 0; + } + return -EEXIST; + } + + /* 如果待配置mac和本机mac相同,则不配置到NP中, 只将此mac添加到单播地址链表中 */ + if (!memcmp(addr, dev->dev_addr, dev->addr_len)) + { + goto out; + } + + /* 将此mac地址配置到np中 */ + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + err = dpp_add_mac(&pf_info, addr); + if (err != 0) + { + LOG_ERR("dpp_add_mac failed\n"); + return err; + } + } + else + { + err = zxdh_vf_dpp_add_mac(en_dev, addr, FILTER_MAC); + if (err != 0) + { + LOG_ERR("zxdh_vf_dpp_add_mac failed\n"); + return err; + } + } + +out: + /* 将此单播mac地址添加到地址链表中 */ + err = zxdh_dev_list_addr_add(dev, addr); + if (err != 0) + { + LOG_ERR("zxdh_dev_list_addr_add failed\n"); + return err; + } + en_dev->curr_unicast_num++; + LOG_DEBUG("curr_unicast_num is %d\n", en_dev->curr_unicast_num); + return err; +} + +bool is_ipv6_mulicast_mac(const uint8_t *mac) +{ + return ((mac[0] == 0x33) && (mac[1] == 0x33)); +} + +int32_t multicast_mac_add(struct zxdh_en_device *en_dev, struct net_device *dev, \ + const uint8_t* addr, uint16_t flags) +{ + int32_t err = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + if (is_ipv6_mulicast_mac(addr)) + { + LOG_ERR("invlaid ipv6 mac address\n"); + return -EINVAL; + } + + /* 遍历组播地址链表,判断是否存在此mac */ + if (is_this_mac_exist(dev, addr)) + { + LOG_DEBUG("Mac already exists\n"); + if (!(flags & NLM_F_EXCL)) + { + return 0; + } + return -EEXIST; + } + + /* 将此组播mac地址配置到np中 */ + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + err = dpp_multi_mac_add_member(&pf_info, addr); + if (err != 0) + { + if (err == DPP_RC_TABLE_RANGE_INVALID) + { + LOG_ERR("multicast mac is beyond 32\n"); + return -ENOSPC; + } + LOG_ERR("dpp_multi_mac_add_member failed\n"); + return err; + } + } + else + { + err = zxdh_vf_dpp_add_mac(en_dev, addr, FILTER_MAC); + if (err != 0) + { + if(err == DPP_RC_TABLE_RANGE_INVALID) + { + LOG_ERR("multicast mac is beyond 32\n"); + return -ENOSPC; + } + LOG_ERR("zxdh_vf_dpp_add_mac failed\n"); + return err; + } + } + + /* 将此组播mac地址添加到地址链表中 */ + err = zxdh_dev_list_addr_add(dev, addr); + if (err != 0) + { + LOG_ERR("zxdh_dev_list_addr_add failed\n"); + return err; + } + return err; +} + +int32_t unicast_mac_del(struct zxdh_en_device *en_dev, struct net_device *dev, const uint8_t* addr) +{ + int32_t err = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + /* 判断目前所配置mac地址数量是否小于0 */ + if (en_dev->curr_unicast_num <= 0) + { + LOG_ERR("curr_unicast_num is less than 0\n"); + return -ENOENT; + } + + /* 遍历单播地址链表,判断是否存在此mac */ + if(!is_this_mac_exist(dev, addr)) + { + LOG_DEBUG("Mac is not exists\n"); + return -ENOENT; + } + + /* 如果待删除mac和本机mac相同,则不从NP中删除,只从链表中删除 */ + if (!memcmp(addr, dev->dev_addr, dev->addr_len)) + { + goto out; + } + + /* 从np中删除此单播mac */ + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + /* 此设备为PF */ + err = dpp_del_mac(&pf_info, addr); + if (err != 0) + { + LOG_ERR("dpp_del_mac failed\n"); + return err; + } + LOG_DEBUG("dpp_del_mac succeed\n"); + } + else + { + /* 此设备为VF */ + err = zxdh_vf_dpp_del_mac(en_dev, addr, FILTER_MAC, true); + if (err != 0) + { + LOG_ERR("zxdh_vf_dpp_del_mac failed\n"); + return err; + } + LOG_DEBUG("zxdh_vf_dpp_del_mac succeed\n"); + } + +out: + /* 从链表中删除单播mac */ + err = zxdh_dev_list_addr_del(dev, addr); + if (err != 0) + { + LOG_ERR("zxdh_dev_list_addr_del failed\n"); + return err; + } + en_dev->curr_unicast_num--; + LOG_DEBUG("curr_unicast_num is %d\n", en_dev->curr_unicast_num); + return err; +} + +int32_t multicast_mac_del(struct zxdh_en_device *en_dev, struct net_device *dev, const uint8_t* addr) +{ + int32_t err = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + if (is_ipv6_mulicast_mac(addr)) + { + LOG_ERR("invlaid ipv6 mac address\n"); + return -EINVAL; + } + + /* 遍历组播地址链表,判断是否存在此组播mac,如果不存在,则返回报错 */ + if(!is_this_mac_exist(dev, addr)) + { + LOG_DEBUG("Mac is not exists\n"); + return -ENOENT; + } + + /* 从np中删除此组播mac */ + if(en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + /* 此设备为PF */ + err = dpp_multi_mac_del_member(&pf_info, addr); + if (err != 0) + { + LOG_ERR("dpp_multi_mac_del_member failed\n"); + return err; + } + LOG_DEBUG("dpp_multi_mac_del_member succeed\n"); + } + else + { + /* 此设备为VF */ + err = zxdh_vf_dpp_del_mac(en_dev, addr, FILTER_MAC, true); + if (err != 0) + { + LOG_ERR("zxdh_vf_dpp_del_mac failed\n"); + return err; + } + } + + /* 从链表中删除组播mac */ + err = zxdh_dev_list_addr_del(dev, addr); + if (err != 0) + { + LOG_ERR("zxdh_dev_list_addr_del failed\n"); + return err; + } + + return err; +} + +static unsigned int mac_hash(struct zxdh_ipv6_mac_tbl *mac_tbl, const uint8_t *mac_addr) +{ + unsigned int mact_size_half = mac_tbl->ip6mact_size / 2; + uint32_t mac_part1 = (mac_addr[0] << 24) | (mac_addr[1] << 16) | (mac_addr[2] << 8) | mac_addr[3]; + uint32_t mac_part2 = (mac_addr[4] << 8) | mac_addr[5]; + + uint32_t xor = mac_part1 ^ mac_part2; + + return (jhash_1word(xor, 0) % mact_size_half); +} + +int32_t zxdh_ip6mac_to_np(struct zxdh_en_device *en_dev, struct zxdh_ipv6_mac_tbl *ip6mac_tbl, const uint8_t *ip6mac, uint8_t action, bool need_lock) +{ + int32_t err = 0; + DPP_PF_INFO_T pf_info = {0}; + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + switch (action) + { + case ADD_IP6MAC: + { + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { /* PF流程 */ + if (need_lock) + { + write_lock_bh(&ip6mac_tbl->lock); + } + /* 将此组播mac地址配置到np中 */ + err = dpp_multi_mac_add_member(&pf_info, ip6mac); + if (err != 0) + { + LOG_ERR("dpp_multi_mac_add_member failed, err:%d\n", err); + } + if (need_lock) + { + write_unlock_bh(&ip6mac_tbl->lock); + } + } + else + { /* VF流程*/ + err = zxdh_vf_dpp_add_ipv6_mac(en_dev, ip6mac); + if (err != 0) + { + LOG_ERR("zxdh_vf_dpp_add_ipv6_mac failed, err:%d\n", err); + } + } + break; + } + case DEL_IP6MAC: + { + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + {/* PF流程 */ + if (need_lock) + { + write_lock_bh(&ip6mac_tbl->lock); + } + err = dpp_multi_mac_del_member(&pf_info, ip6mac); + if (err != 0) + { + LOG_ERR("dpp_multi_mac_del_member failed, err:%d\n", err); + } + if (need_lock) + { + write_unlock_bh(&ip6mac_tbl->lock); + } + } + else + {/* VF流程 */ + err = zxdh_vf_dpp_del_ipv6_mac(en_dev, ip6mac); + if (err != 0) + { + LOG_ERR("zxdh_vf_dpp_del_ipv6_mac failed, err:%d\n", err); + } + } + break; + } + } + return err; +} + +int32_t zxdh_ip6mac_add(struct zxdh_en_device *en_dev, const uint32_t *addr6, const uint8_t *ip6mac) +{ + int32_t err = 0; + unsigned int mac_hash_val; + struct zxdh_ipv6_mac_tbl *ip6mac_tbl = en_dev->ops->get_ip6mac_tbl(en_dev->parent); + struct zxdh_ipv6_mac_entry *ce, *cte; + + if (!ip6mac_tbl) + { + LOG_ERR("ip6mac_tbl is NULL\n"); + return -ENXIO; + } + + err = zxdh_ip6mac_to_np(en_dev, ip6mac_tbl, ip6mac, ADD_IP6MAC, TRUE); + if (err != 0) + { + return err; + } + + mac_hash_val = mac_hash(ip6mac_tbl, ip6mac); + //如果没有报错,则说明MAC已经存在或成功存入NP + read_lock_bh(&ip6mac_tbl->lock); + list_for_each_entry(cte, &ip6mac_tbl->hash_list[mac_hash_val], list) + { + if (memcmp(cte->ipv6_mac, ip6mac, ETH_ALEN) == 0) + {//MAC已经存在 + ce = cte; + refcount_inc(&ce->refcnt); + LOG_INFO("Increase Multicast MAC Address(%pM) refcnt:%d\n", ip6mac, refcount_read(&ce->refcnt)); + read_unlock_bh(&ip6mac_tbl->lock); + return 0; + } + } + read_unlock_bh(&ip6mac_tbl->lock); + + //成功新增MAC至NP,需要更新 ip6mac_tbl + write_lock_bh(&ip6mac_tbl->lock); + if (list_empty(&ip6mac_tbl->ip6mac_free_head)) + { + write_unlock_bh(&ip6mac_tbl->lock); + err = zxdh_ip6mac_to_np(en_dev, ip6mac_tbl, ip6mac, DEL_IP6MAC, TRUE); + LOG_ERR("ip6mac_tbl overflow, can't add; del mac from NP, ret:%d\n",err); + return -ENOMEM; + } + ce = list_first_entry(&ip6mac_tbl->ip6mac_free_head, struct zxdh_ipv6_mac_entry, list); + list_del(&ce->list); + INIT_LIST_HEAD(&ce->list); + spin_lock_init(&ce->lock); + refcount_set(&ce->refcnt, 0); + list_add_tail(&ce->list, &ip6mac_tbl->hash_list[mac_hash_val]); + memcpy(ce->ipv6_mac, ip6mac, ETH_ALEN); + refcount_set(&ce->refcnt, 1); + write_unlock_bh(&ip6mac_tbl->lock); + LOG_INFO("Add New Multicast MAC Address: %pM, refcnt:%d\n", ip6mac, refcount_read(&ce->refcnt)); + + return 0; +} + +int32_t zxdh_ip6mac_del(struct zxdh_en_device *en_dev, const uint32_t *addr6, const uint8_t *ip6mac) +{ + int32_t err = 0; + struct zxdh_ipv6_mac_tbl *ip6mac_tbl = en_dev->ops->get_ip6mac_tbl(en_dev->parent); + struct zxdh_ipv6_mac_entry *ce, *cte; + unsigned int mac_hash_val; + int32_t refcnt = 0; + DPP_PF_INFO_T pf_info = {0}; + + if (!ip6mac_tbl) + { + LOG_ERR("ip6mac_tbl is NULL"); + return -ENXIO; + } + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + mac_hash_val = mac_hash(ip6mac_tbl, ip6mac); + + read_lock_bh(&ip6mac_tbl->lock); + list_for_each_entry(cte, &ip6mac_tbl->hash_list[mac_hash_val], list) + { + if (memcmp(cte->ipv6_mac, ip6mac, ETH_ALEN) == 0) + {//MAC存在 + ce = cte; + read_unlock_bh(&ip6mac_tbl->lock); + goto found; + } + } + read_unlock_bh(&ip6mac_tbl->lock); + LOG_INFO("Don't Found Multicast MAC Address: %pM in Hash List\n", ip6mac); + return zxdh_ip6mac_to_np(en_dev, ip6mac_tbl, ip6mac, DEL_IP6MAC, TRUE); + +found: + write_lock_bh(&ip6mac_tbl->lock); + spin_lock_bh(&ce->lock); + if (!refcount_dec_and_test(&ce->refcnt)) + { + LOG_INFO("Decrease Multicast MAC Address(%pM) refcnt:%d\n", ip6mac, refcount_read(&ce->refcnt)); + spin_unlock_bh(&ce->lock); + write_unlock_bh(&ip6mac_tbl->lock); + return err; + } + //如果引用计数减到0 + list_del(&ce->list); + INIT_LIST_HEAD(&ce->list); + list_add_tail(&ce->list, &ip6mac_tbl->ip6mac_free_head); + refcnt = refcount_read(&ce->refcnt); + spin_unlock_bh(&ce->lock); + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_VF) + { //VF设备需要先释放锁再发消息下表,因为PF侧会加锁 + write_unlock_bh(&ip6mac_tbl->lock); + err = zxdh_ip6mac_to_np(en_dev, ip6mac_tbl, ip6mac, DEL_IP6MAC, FALSE); + } + else + { //PF设备需要带锁下表 + err = zxdh_ip6mac_to_np(en_dev, ip6mac_tbl, ip6mac, DEL_IP6MAC, FALSE); + write_unlock_bh(&ip6mac_tbl->lock); + } + LOG_INFO("Del Multicast MAC Address: %pM Completely, refcnt:%d, np ret:%d\n", ip6mac, refcnt, err); + return err; +} + +int32_t zxdh_en_set_vepa(struct zxdh_en_device *en_dev, bool setting) +{ + struct zxdh_vf_item *vf_item = NULL; + bool vepa = false; + uint16_t vf_idx = 0; + int32_t ret = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + vepa = en_dev->ops->get_vepa(en_dev->parent); + if (setting == vepa) + { + LOG_ERR("vport(0x%x) is now %s mode\n", en_dev->vport, vepa?"vepa":"veb"); + return 0; + } + + en_dev->ops->set_vepa(en_dev->parent, setting); + ret = dpp_egr_port_attr_set(&pf_info, EGR_FLAG_VEPA_EN_OFF, (uint32_t)setting); + if (ret != 0) + { + LOG_ERR("Failed to setup vport(0x%x) %s mode, ret: %d\n", en_dev->vport, setting?"vepa":"veb", ret); + return ret; + } + + for (vf_idx = 0; vf_idx < ZXDH_VF_NUM_MAX; vf_idx++) + { + vf_item = en_dev->ops->get_vf_item(en_dev->parent, vf_idx); + if (IS_ERR_OR_NULL(vf_item)) + { + break; + } + + if (vf_item->is_probed) + { + pf_info.vport = vf_item->vport; + ret = dpp_egr_port_attr_set(&pf_info, EGR_FLAG_VEPA_EN_OFF, (uint32_t)setting); + if (ret != 0) + { + LOG_ERR("Failed to setup vport(0x%x) %s mode, ret: %d\n", vf_item->vport, setting?"vepa":"veb", ret); + return ret; + } + LOG_INFO("Configure vport(0x%x) to %s mode\n", vf_item->vport, setting?"vepa":"veb"); + } + } + + LOG_INFO("Configure vport(0x%x) to %s mode\n", en_dev->vport, setting?"vepa":"veb"); + + return ret; +} + +#ifdef HAVE_FDB_OPS +#if defined(HAVE_NDO_FDB_ADD_EXTACK) +static int zxdh_en_ndo_fdb_add(struct ndmsg *ndm, struct nlattr *tb[], + struct net_device *dev, const unsigned char *addr, + u16 vid, u16 flags, struct netlink_ext_ack *extack) +#elif defined(HAVE_NDO_FDB_ADD_VID) +static int zxdh_en_ndo_fdb_add(struct ndmsg *ndm, struct nlattr *tb[], + struct net_device *dev, const unsigned char *addr, + u16 vid, u16 flags) +#elif defined(HAVE_NDO_FDB_ADD_NLATTR) +static int zxdh_en_ndo_fdb_add(struct ndmsg *ndm, struct nlattr *tb[], + struct net_device *dev, const unsigned char *addr, + u16 flags) +#elif defined(USE_CONST_DEV_UC_CHAR) +static int zxdh_en_ndo_fdb_add(struct ndmsg *ndm, struct net_device *dev, + const unsigned char *addr, u16 flags) +#else +static int zxdh_en_ndo_fdb_add(struct ndmsg *ndm, struct net_device *dev, + unsigned char *addr, u16 flags) +#endif +{ + struct zxdh_en_priv *en_priv = netdev_priv(dev); + struct zxdh_en_device *en_dev = &en_priv->edev; /*aux层net_device的私有结构体 */ + int32_t err = 0; + +#ifdef MAC_CONFIG_DEBUG + LOG_DEBUG("vport is %#x\n", en_dev->vport); + LOG_DEBUG("addr is %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", \ + addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); + LOG_DEBUG("ndm_state is %u\n", ndm->ndm_state); +#endif /* MAC_CONFIG_DEBUG */ + + /* 检查这个设备的ndm状态是否是静态的 */ + if (ndm->ndm_state && !(ndm->ndm_state & NUD_PERMANENT)) + { + LOG_ERR("FDB only supports static addresses\n"); + return -EINVAL; + } + + /* 判断mac地址是否全0 */ + if (is_zero_ether_addr(addr)) + { + LOG_ERR("Invalid mac\n"); + return -EINVAL; + } + + if (is_unicast_ether_addr(addr) || is_link_local_ether_addr(addr)) + { + err = unicast_mac_add(en_dev, dev, addr, flags); + if (err != 0) + { + LOG_ERR("unicast_mac_add failed"); + return err; + } + } + else if (is_multicast_ether_addr(addr)) + { + err = multicast_mac_add(en_dev, dev, addr, flags); + if (err != 0) + { + LOG_ERR("multicast_mac_add failed"); + return err; + } + } + else + { + err = -EINVAL; + } + +#ifdef MAC_CONFIG_DEBUG + if(en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + err = zxdh_pf_dump_all_mac(en_dev); + if (err != 0) + { + LOG_INFO("zxdh_pf_dump_all_mac failed\n"); + return err; + } + } +#endif /* MAC_CONFIG_DEBUG */ + + LOG_DEBUG("zxdh_en_ndo_fdb_add end\n"); + return err; +} + +#ifdef HAVE_NDO_FEATURES_CHECK +static netdev_features_t zxdh_en_features_check(struct sk_buff *skb, struct net_device *dev, + netdev_features_t features) +{ + return features; +} +#endif /* HAVE_NDO_FEATURES_CHECK */ + +#ifdef USE_CONST_DEV_UC_CHAR +#ifdef HAVE_NDO_FDB_ADD_VID +static int zxdh_en_ndo_fdb_del(struct ndmsg *ndm, struct nlattr **nla, struct net_device *dev, + const unsigned char *addr, u16 vid) +#else +static int zxdh_en_ndo_fdb_del(struct ndmsg *ndm, struct net_device *dev, + const unsigned char *addr) +#endif +#else +#ifdef HAVE_NDO_FDB_ADD_VID +static int zxdh_en_ndo_fdb_del(struct ndmsg *ndm, struct net_device *dev, + unsigned char *addr, u16 vid) +#else +static int zxdh_en_ndo_fdb_del(struct ndmsg *ndm, struct net_device *dev, + unsigned char *addr) +#endif +#endif +{ + struct zxdh_en_priv *en_priv = netdev_priv(dev); + struct zxdh_en_device *en_dev = &en_priv->edev; + int32_t err = 0; + +#ifdef MAC_CONFIG_DEBUG + LOG_DEBUG("the vport is %#x",en_dev->vport); + LOG_DEBUG("the addr is %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",\ + addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); + LOG_DEBUG("ndm_state is %u,\n", ndm->ndm_state); +#endif /* MAC_CONFIG_DEBUG */ + + /* 检查这个设备的ndm状态是否是静态的 */ + if (!(ndm->ndm_state & NUD_PERMANENT)) + { + LOG_ERR("FDB only supports static addresses\n"); + return -EINVAL; + } + + /* 地址是否全为0 */ + if (is_zero_ether_addr(addr)) + { + LOG_ERR("Invalid mac address\n"); + return -EINVAL; + } + + /* 根据mac地址类型,对相对应地址链表做删除操作 */ + if (is_unicast_ether_addr(addr)) + { + err = unicast_mac_del(en_dev, dev, addr); + if (err != 0) + { + LOG_ERR("unicast_mac_del failed\n"); + return err; + } + } + else if (is_multicast_ether_addr(addr)) + { + err = multicast_mac_del(en_dev, dev, addr); + if (err != 0) + { + LOG_ERR("multicast_mac_del failed\n"); + return err; + } + } + else + { + return -EINVAL; + } + +#ifdef MAC_CONFIG_DEBUG + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + /*先dump所有mac地址*/ + err = zxdh_pf_dump_all_mac(en_dev); + if (err != 0) + { + LOG_ERR("zxdh_pf_dump_all_mac failed\n"); + return err; + } + } +#endif /* MAC_CONFIG_DEBUG */ + + LOG_DEBUG("zxdh_en_ndo_fdb_del end\n"); + return err; +} + +#ifdef HAVE_BRIDGE_ATTRIBS +#if defined(HAVE_NDO_BRIDGE_SETLINK_EXTACK) +static int zxdh_en_ndo_bridge_setlink(struct net_device *dev, struct nlmsghdr *nlh, + u16 flags, struct netlink_ext_ack *extack) +#elif defined(HAVE_NDO_BRIDGE_SET_DEL_LINK_FLAGS) +static int zxdh_en_ndo_bridge_setlink(struct net_device *dev, struct nlmsghdr *nlh, u16 flags) +#else +static int zxdh_en_ndo_bridge_setlink(struct net_device *dev, struct nlmsghdr *nlh) +#endif +{ + struct zxdh_en_priv *en_priv = netdev_priv(dev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct nlattr *attr = NULL; + struct nlattr *br_spec = NULL; + int32_t rem = 0; + uint16_t mode = BRIDGE_MODE_UNDEF; + bool setting = false; + + if(en_dev->ops->get_coredev_type(en_dev->parent) != DH_COREDEV_PF) + { + return -EOPNOTSUPP; + } + + br_spec = nlmsg_find_attr(nlh, sizeof(struct ifinfomsg), IFLA_AF_SPEC); + if (br_spec == NULL) + { + return -EINVAL; + } + + nla_for_each_nested(attr, br_spec, rem) + { + if (nla_type(attr) != IFLA_BRIDGE_MODE) + { + continue; + } + + if (nla_len(attr) < sizeof(mode)) + { + return -EINVAL; + } + + mode = nla_get_u16(attr); + if (mode > BRIDGE_MODE_VEPA) + { + return -EINVAL; + } + break; + } + + if (mode == BRIDGE_MODE_UNDEF) + { + return -EINVAL; + } + + setting = (mode == BRIDGE_MODE_VEPA) ? 1 : 0; + + return zxdh_en_set_vepa(en_dev, setting); +} + +#ifdef HAVE_NDO_BRIDGE_GETLINK_NLFLAGS +static int zxdh_en_ndo_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, + struct net_device *dev, u32 __always_unused filter_mask, + int nlflags) +#elif defined(HAVE_BRIDGE_FILTER) +static int zxdh_en_ndo_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, + struct net_device *dev, u32 __always_unused filter_mask) +#else +static int zxdh_en_ndo_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, + struct net_device *dev) +#endif /* NDO_BRIDGE_STUFF */ +{ + struct zxdh_en_priv *en_priv = netdev_priv(dev); + struct zxdh_en_device *en_dev = &en_priv->edev; + uint8_t mode = 0; + bool vepa = false; + + vepa = en_dev->ops->get_vepa(en_dev->parent); + mode = vepa ? BRIDGE_MODE_VEPA : BRIDGE_MODE_VEB; + + return ndo_dflt_bridge_getlink(skb, pid, seq, dev, mode, 0, 0, nlflags, filter_mask, NULL); +} +#endif /* HAVE_BRIDGE_ATTRIBS */ +#endif /* HAVE_FDB_OPS */ + +static int32_t zxdh_pf_notify_vf_reset(struct zxdh_en_device *en_dev, int vf_idx) +{ + int32_t retval = 0; + union zxdh_msg msg = {0}; + + msg.payload.hdr_vf.op_code = ZXDH_SET_VF_RESET; + msg.payload.hdr_vf.dst_pcie_id = FIND_VF_PCIE_ID(en_dev->pcie_id, vf_idx); + + retval = zxdh_send_command_to_specify(en_dev, MODULE_PF_BAR_MSG_TO_VF, &msg, &msg); + if(retval != 0) + { + LOG_ERR("zxdh_send_command_to_vf failed: %d\n", retval); + } + return retval; +} + +static int32_t zxdh_pf_notify_vf_set_link_state(struct zxdh_en_device *en_dev, int vf_idx, bool link_up) +{ + int32_t retval = 0; + uint16_t func_no = 0; + uint16_t pf_no = FIND_PF_ID(en_dev->pcie_id); + uint8_t link_info = 0; + uint8_t link_up_val = 0; + uint8_t phyport_val = 0; + union zxdh_msg msg = {0}; + + msg.payload.hdr_to_agt.op_code = AGENT_DEV_STATUS_NOTIFY; + msg.payload.hdr_to_agt.pcie_id = en_dev->pcie_id; + + func_no = GET_FUNC_NO(pf_no, vf_idx); + LOG_DEBUG("vf_idx:%d, func_no=0x%x\n",vf_idx,func_no); + msg.payload.pcie_msix_msg.func_no[msg.payload.pcie_msix_msg.num++] = func_no; + if(en_dev->ops->is_bond(en_dev->parent)) + { + link_up_val = link_up ? 1 : 0; + phyport_val = en_dev->ops->get_pf_phy_port(en_dev->parent); + link_info = (phyport_val & 0x0F) << 4 | (link_up_val & 0x0F); + LOG_DEBUG("phyport and link_up need write to VQM, val: 0x%x\n", link_info); + en_dev->ops->set_vf_link_info(en_dev->parent, vf_idx, link_info); + } + else + { + en_dev->ops->set_vf_link_info(en_dev->parent, vf_idx, link_up ? 1 : 0); + } + LOG_DEBUG("msg.pcie_msix_msg.num:%d\n", msg.payload.pcie_msix_msg.num); + retval = zxdh_send_command_to_specify(en_dev, MODULE_MAC, &msg, &msg); + if (retval != 0) + { + LOG_ERR("failed to update VF link info\n"); + } + return retval; +} + +static int32_t zxdh_pf_set_vf_link_state(struct zxdh_en_device *en_dev, int vf_idx, int link_status) +{ + int32_t retval = 0; + struct zxdh_vf_item *vf_item = NULL; + bool pf_link_up = en_dev->ops->get_pf_link_up(en_dev->parent); + + vf_item = en_dev->ops->get_vf_item(en_dev->parent, vf_idx); + switch (link_status) + { + case IFLA_VF_LINK_STATE_AUTO: + LOG_DEBUG("[SET_VF_LINK_STATE]--NDO set VF %d link state auto\n", vf_idx); + vf_item->link_forced = FALSE; + vf_item->link_up = pf_link_up; + break; + case IFLA_VF_LINK_STATE_ENABLE: + LOG_DEBUG("[SET_VF_LINK_STATE]--NDO set VF %d link state enable\n", vf_idx); + vf_item->link_forced = TRUE; + vf_item->link_up = TRUE; + break; + case IFLA_VF_LINK_STATE_DISABLE: + LOG_DEBUG("[SET_VF_LINK_STATE]--NDO set VF %d link state disable\n", vf_idx); + vf_item->link_forced = TRUE; + vf_item->link_up = FALSE; + break; + default: + LOG_ERR("[SET_VF_LINK_STATE]--NDO set VF %d - invalid link status %d\n", vf_idx, link_status); + return -EINVAL; + } + LOG_DEBUG("vf_item->is_probed: %s\n", vf_item->is_probed?"TRUE":"FALSE"); + if(vf_item->is_probed) + { + /* Notify the VF of its new link state */ + retval = zxdh_pf_notify_vf_set_link_state(en_dev, vf_idx, vf_item->link_up); + if (0 != retval) + { + LOG_ERR("[SET_VF_LINK_STATE]--Failed to set VF %d link state %d\n", vf_idx, vf_item->link_up); + return retval; + } + } + return retval; +} + +int zxdh_en_ndo_set_vf_link_state(struct net_device *netdev, int vf_idx, int link_status) +{ + int num_vfs = 0; + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct pci_dev *pdev = NULL; + struct dh_core_dev *dh_dev = NULL; + + dh_dev = en_dev->parent; + pdev = en_dev->ops->get_pdev(dh_dev); + num_vfs = pci_num_vf(pdev); + if ((vf_idx < 0) || (vf_idx >= num_vfs)) + { + LOG_ERR("[SET_VF_LINK_STATE]--NDO set VF link - invalid VF idx: %d\n", vf_idx); + return -EINVAL; + } + return zxdh_pf_set_vf_link_state(en_dev, vf_idx, link_status); +} + +static int32_t zxdh_pf_set_vf_port_vlan(struct zxdh_en_device *en_dev, int vf_idx, u16 vid, u8 qos, uint16_t vlan_proto) +{ + int32_t retval = 0; + struct zxdh_vf_item *vf_item = NULL; + union zxdh_msg msg = {0}; + DPP_PF_INFO_T pf_info = {0}; + + /* 获取pf本地保存的vf变量*/ + vf_item = en_dev->ops->get_vf_item(en_dev->parent, vf_idx); + if(!vf_item->is_probed) + { + LOG_DEBUG("vf %d is not probed.\n", vf_idx); + return -EINVAL; + } + + if (vf_item->vlan == vid) + { + return 0; + } + + pf_info.slot = en_dev->slot_id; + pf_info.vport = vf_item->vport; + if (vid) + { + /* vf端口Vlan strip开启*/ + retval = dpp_vport_vlan_strip_set(&pf_info, 1); + if (retval != 0) + { + LOG_ERR("dpp_vport_vlan_strip_set failed, retval: %d\n", retval); + return retval; + } + /* 将vlan_id add到表项中*/ + retval = dpp_vport_vlan_filter_en_set(&pf_info, 1); + if (retval != 0) + { + LOG_ERR("dpp_vport_vlan_filter_en_set failed, retval: %d\n", retval); + return retval; + } + + retval = dpp_add_vlan_filter(&pf_info, vid); + if (0 != retval) + { + LOG_ERR("failed to add vlan: %d\n",vid); + return retval; + } + } + else + { + /* vf端口vlan strip关闭*/ + retval = dpp_vport_vlan_strip_set(&pf_info, 0); + if (retval != 0) + { + LOG_ERR("dpp_vport_vlan_strip_set failed, retval: %d\n", retval); + return retval; + } + /* 将Vlan_id 从表项中kill*/ + retval = dpp_vport_vlan_filter_en_set(&pf_info, 0); + if (retval != 0) + { + LOG_ERR("dpp_vport_vlan_filter_en_set failed, retval: %d\n", retval); + return retval; + } + + retval = dpp_vlan_filter_init(&pf_info); + if (retval != 0) + { + LOG_ERR("dpp_vlan_filter_init failed: %d\n", retval); + return retval; + } + } + + msg.payload.hdr_vf.op_code = ZXDH_PF_SET_VF_VLAN; + msg.payload.hdr_vf.dst_pcie_id = FIND_VF_PCIE_ID(en_dev->pcie_id, vf_idx); + + msg.payload.vf_vlan_msg.vlan_id = vid; + msg.payload.vf_vlan_msg.qos = qos; + msg.payload.vf_vlan_msg.protocl = vlan_proto; + msg.payload.vf_vlan_msg.vf_idx = vf_idx; + + retval = zxdh_send_command_to_specify(en_dev, MODULE_PF_BAR_MSG_TO_VF, &msg, &msg); + if(retval != 0) + { + LOG_ERR("zxdh_send_command_to_vf failed: %d\n", retval); + return retval; + } + + /* 更新pf本地的vf vlan信息,用于ip link show显示*/ + vf_item->vlan = vid; + vf_item->qos = qos; + return retval; +} + + +int zxdh_en_ndo_set_vf_mac(struct net_device *netdev, int vf_id, u8 *mac) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct zxdh_vf_item *vf_item = NULL; + int32_t retval = 0; + bool delete_flag = true; + uint8_t *addr = NULL; + uint8_t i = 0; + DPP_PF_INFO_T pf_info = {0}; + + vf_item = en_dev->ops->get_vf_item(en_dev->parent, vf_id); + if (IS_ERR_OR_NULL(vf_item)) + { + LOG_ERR("Failed to get vf_item, vf_id:%d\n", vf_id); + return PTR_ERR(vf_item); + } + pf_info.slot = en_dev->slot_id; + pf_info.vport = vf_item->vport; + + if (is_multicast_ether_addr(mac)) + { + LOG_ERR("Invalid Ethernet address %pM for VF %d\n", mac, vf_id); + return -EINVAL; + } + + if (ether_addr_equal(vf_item->mac, mac)) + { + LOG_INFO("[SET_VF_MAC]--already using mac address %pM\n", mac); + return retval; + } + + if (is_zero_ether_addr(mac)) + { + eth_zero_addr(vf_item->mac); + vf_item->pf_set_mac = false; + en_dev->ops->set_vf_mac(en_dev->parent, mac, vf_id); + eth_zero_addr(vf_item->vf_mac_info.unicast_mac[0]); + goto vf_reset; + } + + for (i = 1; i < DEV_UNICAST_MAX_NUM; ++i) + { + addr = vf_item->vf_mac_info.unicast_mac[i]; + if (!memcmp(vf_item->mac, addr, netdev->addr_len)) + { + delete_flag = false; + } + } + + if (delete_flag) + { + if (!is_zero_ether_addr(vf_item->mac)) + { + retval = dpp_del_mac(&pf_info, vf_item->mac); + if (retval != 0) + { + LOG_ERR("delete vf old mac in NP failed.\n"); + return retval; + } + } + } + + vf_item->pf_set_mac = true; + en_dev->ops->set_vf_mac(en_dev->parent, mac, vf_id); + ether_addr_copy(vf_item->vf_mac_info.unicast_mac[0], mac); + ether_addr_copy(vf_item->mac, mac); + LOG_INFO("[SET_VF_MAC]--setting MAC %pM on VF %d\n", mac, vf_id); + +vf_reset: + if (vf_item->is_probed) + { + retval = zxdh_pf_notify_vf_reset(en_dev, vf_id); + if(retval != 0) + { + LOG_ERR("zxdh_pf_notify_vf_reset failed: %d\n", retval); + } + } + + return retval; +} + +#ifdef IFLA_VF_VLAN_INFO_MAX +int zxdh_en_ndo_set_vf_port_vlan(struct net_device *netdev, int vf_id, + u16 vlan_id, u8 qos, __be16 vlan_proto) +#else +int zxdh_en_ndo_set_vf_port_vlan(struct net_device *netdev, int vf_id, u16 vlan_id, u8 qos) +#endif /* IFLA_VF_VLAN_INFO_MAX */ +{ + int num_vfs = 0; + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct pci_dev *pdev = NULL; + struct dh_core_dev *dh_dev = NULL; + + /* Comparing with the mellnox network card, it only supports the configuration of cvlan*/ + if (vlan_proto != htons(ETH_P_8021Q)) + { + return -EPROTONOSUPPORT; + } + dh_dev = en_dev->parent; + pdev = en_dev->ops->get_pdev(dh_dev); + num_vfs = pci_num_vf(pdev); + if ((vf_id < 0) || (vf_id >= num_vfs)) + { + LOG_ERR("[SET+VF_VLAN]--NDO set VF vlan - invalid VF idx: %d\n", vf_id); + return -EINVAL; + } + return zxdh_pf_set_vf_port_vlan(en_dev, vf_id, vlan_id, qos, vlan_proto); +} + +int zxdh_en_ndo_set_vf_bw(struct net_device *netdev, int vf_id, int min_tx_rate, int max_tx_rate) +{ + return 0; +} + +int zxdh_en_ndo_get_vf_config(struct net_device *netdev, int vf_idx, struct ifla_vf_info *ivi) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct zxdh_vf_item *vf_item = NULL; + + vf_item = en_dev->ops->get_vf_item(en_dev->parent, vf_idx); + if (IS_ERR_OR_NULL(vf_item)) + { + LOG_ERR("Failed to get vf_item, vf_idx:%d\n", vf_idx); + return PTR_ERR(vf_item); + } + + ivi->vf = vf_idx; + + ether_addr_copy(ivi->mac, vf_item->mac); + +#ifdef HAVE_NDO_SET_VF_MIN_MAX_TX_RATE + ivi->max_tx_rate = vf_item->max_tx_rate; + ivi->min_tx_rate = vf_item->min_tx_rate; +#else + ivi->tx_rate = vf_item->max_tx_rate; +#endif + + ivi->vlan = vf_item->vlan; + ivi->qos = vf_item->qos; + +#ifdef HAVE_NDO_SET_VF_LINK_STATE + if (vf_item->link_forced == false) + { + ivi->linkstate = IFLA_VF_LINK_STATE_AUTO; + } + else if (vf_item->link_up == true) + { + ivi->linkstate = IFLA_VF_LINK_STATE_ENABLE; + } + else + { + ivi->linkstate = IFLA_VF_LINK_STATE_DISABLE; + } +#endif + +#ifdef HAVE_VF_SPOOFCHK_CONFIGURE + ivi->spoofchk = vf_item->spoofchk; +#endif + +#ifdef HAVE_NDO_SET_VF_TRUST + ivi->trusted = vf_item->trusted; +#endif + + return 0; +} + +int zxdh_en_ndo_set_vf_spoofchk(struct net_device *netdev, int vf_idx, bool enable) +{ + int ret = 0; + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct zxdh_vf_item *vf_item = NULL; + DPP_PF_INFO_T pf_info = {0}; + + vf_item = en_dev->ops->get_vf_item(en_dev->parent, vf_idx); + if (IS_ERR_OR_NULL(vf_item)) + { + LOG_ERR("Failed to get vf_item, vf_idx:%d\n", vf_idx); + return PTR_ERR(vf_item); + } + + pf_info.slot = en_dev->slot_id; + pf_info.vport = vf_item->vport; + vf_item->spoofchk = enable; + LOG_INFO("vf %d spoof check is %s\n", vf_idx, vf_item->spoofchk? "on" : "off"); + if (vf_item->is_probed) + { + ret = dpp_egr_port_attr_set(&pf_info, EGR_FLAG_SPOOFCHK_EN_OFF, enable); + if (0 != ret) + { + LOG_ERR("[SET_VF_SPOOFCHK]--Failed to set vf %d spookchk %s\n", vf_idx, enable ? "on" : "off"); + return ret; + } + } + return ret; +} + +#ifdef HAVE_NDO_SET_VF_TRUST +int zxdh_en_ndo_set_vf_trust(struct net_device *netdev, int vf_idx, bool setting) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct zxdh_vf_item *vf_item = NULL; + DPP_PF_INFO_T pf_info = {0}; + + vf_item = en_dev->ops->get_vf_item(en_dev->parent, vf_idx); + if (IS_ERR_OR_NULL(vf_item)) + { + LOG_ERR("Failed to get vf_item, vf_idx:%d\n", vf_idx); + return PTR_ERR(vf_item); + } + + pf_info.slot = en_dev->slot_id; + pf_info.vport = vf_item->vport; + vf_item->trusted = setting; + LOG_INFO("VF %u is now %strusted\n", vf_idx, setting ? "" : "un"); + if (vf_item->is_probed && !vf_item->trusted) + { + LOG_DEBUG("vport[0x%x] promisc and allmulti off\n", vf_item->vport); + vf_item->promisc = false; + vf_item->mc_promisc = false; + dpp_vport_uc_promisc_set(&pf_info, vf_item->promisc); + dpp_vport_mc_promisc_set(&pf_info, vf_item->mc_promisc); + } + + return 0; +} +#endif + +int zxdh_en_ndo_set_tx_maxrate(struct net_device *netdev, int qid, uint32_t max_rate) +{ + int rtn = 0; + zxdh_plcr_rate_limit_paras rate_limit_paras; + + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct dh_core_dev *dh_dev = en_dev->parent; + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev->parent); + + PLCR_FUNC_DBG_ENTER(); + + /*1. 入参检测:队列号不能超过vf下实际的队列数*/ + if (qid >= en_dev->curr_queue_pairs) + { + LOG_ERR("zxdh_en_ndo_set_tx_maxrate : invalid parameter qid=%d\n", qid); + return -EINVAL; + } +#if 0 + if (!en_dev->link_up) + { + LOG_ERR("[EN SET TX MAXRATE]--PF is not link up.\n"); + return -EINVAL; + } + link_speed = en_dev->link_speed; +#endif + + rate_limit_paras.req_type = E_RATE_LIMIT_REQ_QUEUE_BYTE; + rate_limit_paras.direction = E_RATE_LIMIT_TX; + rate_limit_paras.mode = E_RATE_LIMIT_BYTE ; + rate_limit_paras.max_rate = max_rate; + rate_limit_paras.min_rate = 0; + rate_limit_paras.queue_id = qid; + rate_limit_paras.vf_idx = PLCR_INVALID_PARAM; + rate_limit_paras.vfid = PLCR_INVALID_PARAM; + rate_limit_paras.group_id = PLCR_INVALID_PARAM; + + rtn = zxdh_plcr_unified_set_rate_limit(pf_dev, &rate_limit_paras); + PLCR_COMM_ASSERT(rtn); + + PLCR_LOG_INFO("The maxrate of tx-%d has been set to %dMbit/s\n", qid, max_rate); + + return rtn; +} + +/**-------------------------------------------------------------------------------------------------------------------@n + * 功能详述: + * - zxdh_en_ndo_set_vf_rate函数属于接口函数, 其功能是: + * - 设置vf端口发送方向,最大速率和最小保证速率 + * - 该接口会挂接到内核的钩子上,函数声明是固定的 + * + * 基于plcr的端口限速背景: + * - 1.一级flowid与vqm的2K个(接收和发送)队列是一一映射的 + * - 2.二级flow id与vf num的映射关系 + * 端口限速,需要将vf下的发送队列(即一级flow id)映射到二级flowid + * 二级flow id的资源是4K,dpu限制vf数量是1K,即二级flow id数量 > vf数量 + * 所以规定固定的映射关系:二级flow id前1K <---> 与1K个vf(发送)一一对应 + * 下面的链接整理了pf下vf转换成全局vf(0-1023)的原理 + * https://i.zte.com.cn/#/space/4e62cb2b730540ff8721c1a8552b2356/wiki/page/ff8178f1304e45dc9457e92ff196cce5/view + * - 3.vf限速的设置 + * 项目对vf提出了最小保证带宽的需求; + * 二级CAR的限速模板使用:双速率,三色算法,色敏模式 + * - 4.创建vf的其它考虑 + * 参考mlx的做法,vf创建之后,默认关联到vf组0(注意:>>>>>>>>先交付vf端口限速的需求,这一步可以暂时不实现<<<<<<<<); + * vf创建之后,用户设置限速才会调用到这里,用户不设置限速,vf(二级flow id)就不用关联限速模板 + * + * 参数概述: + * - netdev : 网络设备结构体指针 + * - vf_id :pf内vf的编号(从0开始) + * - min_tx_rate : 最小保证速率 + * - max_tx_rate : 最大速率 + * - 返回值类型是INT32, 含义是: 错误码,正确时为S_OK + * + * 引用(类变量,外部变量,接口函数): + * - 无 + * + * 注意:该函数挂接到pf的钩子上,只在pf下执行 + *--------------------------------------------------------------------------------------------------------------------*/ +int zxdh_en_ndo_set_vf_rate(struct net_device *netdev, int vf_id, int min_tx_rate, int max_tx_rate) +{ + int rtn; + zxdh_plcr_rate_limit_paras rate_limit_paras; + + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct dh_core_dev *dh_dev = en_dev->parent; + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev->parent); + + PLCR_FUNC_DBG_ENTER(); + + rate_limit_paras.req_type = E_RATE_LIMIT_REQ_VF_BYTE; + rate_limit_paras.direction = E_RATE_LIMIT_TX; + rate_limit_paras.mode = E_RATE_LIMIT_BYTE ; + rate_limit_paras.max_rate = max_tx_rate; + rate_limit_paras.min_rate = min_tx_rate; + rate_limit_paras.queue_id = PLCR_INVALID_PARAM; + rate_limit_paras.vf_idx = vf_id; + rate_limit_paras.vfid = PLCR_INVALID_PARAM; + rate_limit_paras.group_id = PLCR_INVALID_PARAM; + + rtn = zxdh_plcr_unified_set_rate_limit(pf_dev, &rate_limit_paras); + PLCR_COMM_ASSERT(rtn); + + PLCR_LOG_INFO("The Rate of VF%d has been set to: Min Tx Rate: %dMbit/s, Max Tx Rate: %dMbit/s\n", + vf_id, min_tx_rate, max_tx_rate); + + return rtn; +} + +const struct net_device_ops zxdh_netdev_ops = { + .ndo_open = zxdh_en_open, + .ndo_stop = zxdh_en_close, + .ndo_start_xmit = zxdh_en_xmit, + +#if defined(HAVE_NDO_GET_STATS64) || defined(HAVE_VOID_NDO_GET_STATS64) + .ndo_get_stats64 = zxdh_en_get_netdev_stats_struct, +#else + .ndo_get_stats = zxdh_en_get_netdev_stats_struct, +#endif + .ndo_set_rx_mode = zxdh_en_set_rx_mode, + .ndo_validate_addr = eth_validate_addr, + .ndo_set_mac_address = zxdh_en_set_mac, + +#ifdef HAVE_RHEL7_EXTENDED_MIN_MAX_MTU + .extended.ndo_change_mtu = zxdh_en_change_mtu, +#else + .ndo_change_mtu = zxdh_en_change_mtu, +#endif /* HAVE_RHEL7_EXTENDED_MIN_MAX_MTU */ + + .ndo_do_ioctl = zxdh_en_ioctl, +#ifdef ZXDH_PLCR_OPEN + .ndo_set_tx_maxrate = zxdh_en_ndo_set_tx_maxrate, +#endif + .ndo_tx_timeout = zxdh_en_tx_timeout, + +#ifdef HAVE_VLAN_RX_REGISTER + .ndo_vlan_rx_register = zxdh_en_vlan_rx_register, +#endif + .ndo_vlan_rx_add_vid = zxdh_en_vlan_rx_add_vid, + .ndo_vlan_rx_kill_vid = zxdh_en_vlan_rx_kill_vid, + +#ifdef CONFIG_NET_POLL_CONTROLLER + .ndo_poll_controller = zxdh_en_netpoll, +#endif + +#ifdef HAVE_SETUP_TC +#ifdef HAVE_RHEL7_NETDEV_OPS_EXT_NDO_SETUP_TC + .extended.ndo_setup_tc_rh = __zxdh_en_setup_tc, +#else +#ifdef NETIF_F_HW_TC + .ndo_setup_tc = __zxdh_en_setup_tc, +#else + .ndo_setup_tc = zxdh_en_setup_tc, +#endif /* NETIF_F_HW_TC */ +#endif /* HAVE_RHEL7_NETDEV_OPS_EXT_NDO_SETUP_TC */ +#endif /* HAVE_SETUP_TC */ + +#ifdef HAVE_RHEL7_NET_DEVICE_OPS_EXT + .ndo_size = sizeof(const struct net_device_ops), +#endif + +#ifdef IFLA_VF_MAX + .ndo_set_vf_mac = zxdh_en_ndo_set_vf_mac, +#ifdef HAVE_RHEL7_NETDEV_OPS_EXT_NDO_SET_VF_VLAN + .extended.ndo_set_vf_vlan = zxdh_en_ndo_set_vf_port_vlan, +#else + .ndo_set_vf_vlan = zxdh_en_ndo_set_vf_port_vlan, +#endif +#ifdef HAVE_NDO_SET_VF_MIN_MAX_TX_RATE +#ifdef ZXDH_PLCR_OPEN + .ndo_set_vf_rate = zxdh_en_ndo_set_vf_rate, +#else + .ndo_set_vf_rate = zxdh_en_ndo_set_vf_bw, +#endif +#else + .ndo_set_vf_rate = zxdh_en_ndo_set_vf_bw, +#endif + .ndo_get_vf_config = zxdh_en_ndo_get_vf_config, +#ifdef HAVE_VF_SPOOFCHK_CONFIGURE + .ndo_set_vf_spoofchk = zxdh_en_ndo_set_vf_spoofchk, +#endif +#ifdef HAVE_NDO_SET_VF_TRUST +#ifdef HAVE_RHEL7_NET_DEVICE_OPS_EXT + .extended.ndo_set_vf_trust = zxdh_en_ndo_set_vf_trust, +#else + .ndo_set_vf_trust = zxdh_en_ndo_set_vf_trust, +#endif /* HAVE_RHEL7_NET_DEVICE_OPS_EXT */ +#endif /* HAVE_NDO_SET_VF_TRUST */ +#endif /* IFLA_VF_MAX */ + +#ifdef HAVE_UDP_ENC_RX_OFFLOAD +#ifdef HAVE_VXLAN_RX_OFFLOAD +#if IS_ENABLED(CONFIG_VXLAN) + .ndo_add_vxlan_port = zxdh_en_add_vxlan_port, + .ndo_del_vxlan_port = zxdh_en_del_vxlan_port, +#endif +#endif /* HAVE_VXLAN_RX_OFFLOAD */ + +#ifdef HAVE_GENEVE_RX_OFFLOAD +#if IS_ENABLED(CONFIG_GENEVE) + .ndo_add_geneve_port = zxdh_en_add_geneve_port, + .ndo_del_geneve_port = zxdh_en_del_geneve_port, +#endif +#endif /* HAVE_GENEVE_RX_OFFLOAD */ +#endif /* HAVE_UDP_ENC_RX_OFFLOAD */ + +#ifdef HAVE_NDO_GET_PHYS_PORT_ID + .ndo_get_phys_port_id = zxdh_en_get_phys_port_id, +#endif /* HAVE_NDO_GET_PHYS_PORT_ID */ + + .ndo_set_features = zxdh_en_set_features, + +#ifdef HAVE_FDB_OPS + .ndo_fdb_add = zxdh_en_ndo_fdb_add, + .ndo_fdb_del = zxdh_en_ndo_fdb_del, +#ifdef HAVE_NDO_FEATURES_CHECK + .ndo_features_check = zxdh_en_features_check, +#endif /* HAVE_NDO_FEATURES_CHECK */ +#ifdef HAVE_BRIDGE_ATTRIBS + .ndo_bridge_getlink = zxdh_en_ndo_bridge_getlink, + .ndo_bridge_setlink = zxdh_en_ndo_bridge_setlink, +#endif /* HAVE_BRIDGE_ATTRIBS */ +#endif /* HAVE_FDB_OPS */ + +#ifdef HAVE_UDP_TUNNEL_OPS + .ndo_udp_tunnel_add = udp_tunnel_nic_add_port, + .ndo_udp_tunnel_del = udp_tunnel_nic_del_port, +#endif + +#ifdef HAVE_RHEL6_NET_DEVICE_OPS_EXT +}; + +/* RHEL6 keeps these operations in a separate structure */ +static const struct net_device_ops_ext zxdh_netdev_ops_ext = +{ + .size = sizeof(struct net_device_ops_ext), +#endif /* HAVE_RHEL6_NET_DEVICE_OPS_EXT */ + +#ifdef HAVE_NDO_SET_FEATURES + .ndo_set_features = zxdh_en_set_features, +#endif /* HAVE_NDO_SET_FEATURES */ + +#ifdef HAVE_NDO_SET_VF_LINK_STATE + .ndo_set_vf_link_state = zxdh_en_ndo_set_vf_link_state, +#endif +}; + +static void priv_flags_init(struct zxdh_en_priv *priv) +{ + priv->edev.pflags = 0; + + priv->edev.pflags &= BIT(ZXDH_PFLAG_ENABLE_LLDP); /* LLDP默认为开 */ +} + +static int32_t get_max_num_qs(struct zxdh_en_container *en_con) +{ + return en_con->ops->is_bond(en_con->parent) ? ZXDH_BOND_ETH_MQ_PAIRS_NUM : max_pairs; +} + +static int32_t fw_version_init(struct zxdh_en_device *en_dev) +{ + int32_t ret = 0; + uint8_t fw_version[ETHTOOL_FWVERS_LEN] = {0}; + uint8_t fw_version_len = 0; + + ret = zxdh_en_firmware_version_get(en_dev, fw_version, &fw_version_len); + if (ret != 0) + { + LOG_ERR("zxdh_en_firmware_version_get err, ret %d!!!!\n", ret); + return ret; + } + if (fw_version_len > ETHTOOL_FWVERS_LEN) + { + LOG_ERR("fw_version_len (%d) greater than 31!!!!\n", fw_version_len); + return -1; + } + + fw_version[ETHTOOL_FWVERS_LEN - 1] = '\0'; + en_dev->fw_version_len = ETHTOOL_FWVERS_LEN; + memcpy(en_dev->fw_version, (uint8_t *)fw_version, en_dev->fw_version_len); + LOG_INFO("fw_version:%s\n", en_dev->fw_version); + + return 0; +} + +int32_t zxdh_priv_init(struct zxdh_en_priv *priv, struct net_device *netdev) +{ + int32_t ret = 0; + struct zxdh_en_device *en_dev = &priv->edev; + + mutex_init(&priv->lock); + priv_flags_init(priv); + en_dev->msglevel = NETIF_MSG_LINK; + + /* 优先级4,暂时写死不支持 */ + en_dev->wol_support = 0; + en_dev->wolopts = 0; + + ret = fw_version_init(en_dev); + if (ret != 0) + { + LOG_ERR("fw_version_init err ret: %d\n", ret); + return ret; + } + + return 0 ; +} + +struct net_device *zxdh_create_netdev(struct zxdh_en_container *en_con) +{ + struct net_device *netdev = NULL; + struct zxdh_en_priv *en_priv = NULL; + struct dh_core_dev *dh_dev = en_con->parent; + + netdev = alloc_etherdev_mqs(sizeof(struct zxdh_en_priv), get_max_num_qs(en_con), get_max_num_qs(en_con)); + if (unlikely(netdev == NULL)) + { + LOG_ERR("alloc_etherdev_mqs() failed\n"); + return NULL; + } + + en_priv = netdev_priv(netdev); + + en_priv->edev.parent = dh_dev; + en_priv->edev.ops = en_con->ops; + en_priv->edev.netdev = netdev; + + zxdh_priv_init(en_priv, netdev); + + netif_carrier_off(netdev); + netif_tx_disable(netdev); + dev_net_set(netdev, dh_core_net(dh_dev)); + + return netdev; +} + +void zxdh_netdev_features_init(struct net_device *netdev) +{ + netdev->features |= NETIF_F_RXCSUM | + NETIF_F_HW_CSUM | + NETIF_F_TSO | + NETIF_F_SG | + NETIF_F_GSO | + NETIF_F_LRO | + NETIF_F_TSO6 | + NETIF_F_GRO | + NETIF_F_HW_VLAN_STAG_FILTER | + NETIF_F_HW_VLAN_CTAG_FILTER | + NETIF_F_GSO_UDP_TUNNEL_CSUM | + NETIF_F_RXHASH; + + netdev->hw_features |= NETIF_F_RXCSUM | + NETIF_F_HW_CSUM | + NETIF_F_TSO | + NETIF_F_SG | + NETIF_F_GSO | + NETIF_F_LRO | + NETIF_F_TSO6 | + NETIF_F_GRO | + NETIF_F_HW_VLAN_STAG_FILTER | + NETIF_F_HW_VLAN_CTAG_FILTER | + NETIF_F_GSO_UDP_TUNNEL_CSUM | + NETIF_F_HW_VLAN_CTAG_RX | + NETIF_F_HW_VLAN_CTAG_TX | + NETIF_F_HW_VLAN_STAG_RX | + NETIF_F_HW_VLAN_STAG_TX | + NETIF_F_RXHASH; + + netdev->hw_enc_features |= NETIF_F_RXCSUM | + NETIF_F_HW_CSUM | + NETIF_F_GSO_UDP_TUNNEL_CSUM; + + return; +} + +extern const struct xfrmdev_ops zxdh_xfrmdev_ops; +static void zxdh_build_nic_netdev(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct dh_core_dev *dh_dev = en_priv->edev.parent; + + SET_NETDEV_DEV(netdev, &dh_dev->parent->pdev->dev); + + netdev->netdev_ops = &zxdh_netdev_ops; + +#ifdef ZXDH_SEC + /*内核 sec相关*/ + netdev->features |=NETIF_F_HW_ESP; + netdev->xfrmdev_ops = &zxdh_xfrmdev_ops; +#endif + +#ifdef HAVE_RHEL6_ETHTOOL_OPS_EXT_STRUCT + zxdh_en_set_ethtool_ops_ext(netdev); +#else + zxdh_en_set_ethtool_ops(netdev); +#endif /* HAVE_RHEL6_ETHTOOL_OPS_EXT_STRUCT */ + + zxdh_netdev_features_init(netdev); +} + +int32_t zxdh_en_bond_get_mac(struct net_device *netdev, uint8_t pannel_id, uint8_t *mac) +{ + int32_t ret = 0; + union zxdh_msg msg = {0}; + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + + msg.payload.hdr_to_agt.op_code = AGENT_FLASH_MAC_READ; + msg.payload.flash_read_msg.index = pannel_id; + + ret = zxdh_send_command_to_specify(en_dev, MODULE_FLASH, &msg, &msg); + if (ret != 0) + { + LOG_ERR("zxdh_send_command_to_specify failed: %d\n", ret); + return ret; + } + + LOG_INFO("bond get mac %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", msg.reps.flash_mac_read_msg.mac[0],\ + msg.reps.flash_mac_read_msg.mac[1],msg.reps.flash_mac_read_msg.mac[2], msg.reps.flash_mac_read_msg.mac[3],\ + msg.reps.flash_mac_read_msg.mac[4], msg.reps.flash_mac_read_msg.mac[5]); + + ether_addr_copy(mac, msg.reps.flash_mac_read_msg.mac); + return ret; +} + +int32_t zxdh_mac_addr_init(struct net_device *netdev) +{ + uint8_t mac[6] = {0}; + uint8_t pannel_id = 0; + int32_t ret = 0; + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + + if (en_dev->ops->is_bond(en_dev->parent)) + { + pannel_id = en_dev->pannel_id; + ret = zxdh_en_bond_get_mac(netdev, pannel_id, mac); + if (ret != 0) + { + LOG_ERR("zxdh_en_bond_mac_get failed: %d\n", ret); + } + } + else + { + en_dev->ops->get_mac(en_dev->parent, mac); + } + + if (!is_valid_ether_addr(mac)) + { + get_random_bytes(mac, 6); + mac[0] &= 0xfe; + LOG_INFO("set random mac %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + } + LOG_INFO("set mac %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + memcpy(netdev->dev_addr, mac, 6); + + return ret; +} + +int32_t zxdh_status_init(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + + if (en_dev->ops->if_init(en_dev->parent)) + { + zxdh_vp_reset(netdev); + } + + /* Disable VQ/configuration callbacks. */ + zxdh_vp_disable_cbs(netdev); + + zxdh_add_status(netdev, ZXDH_CONFIG_S_ACKNOWLEDGE); + + zxdh_add_status(netdev, ZXDH_CONFIG_S_DRIVER); + + /* fix features, not set features*/ + zxdh_pf_features_init(netdev); + + might_sleep(); + zxdh_add_status(netdev, ZXDH_CONFIG_S_FEATURES_OK); + if (!zxdh_has_status(netdev, ZXDH_CONFIG_S_FEATURES_OK)) + { + LOG_ERR("device refuses features ok\n"); + return -ENODEV; + } + + return 0; +} + +void zxdh_device_ready(struct net_device *netdev) +{ + zxdh_vp_enable_cbs(netdev); + + zxdh_add_status(netdev, ZXDH_CONFIG_S_DRIVER_OK); +} + +void zxdh_link_state_notify_kernel(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + + if(en_dev->ops->get_pf_link_up(en_dev->parent)) + { + netif_carrier_off(netdev); + udelay(10); + netif_carrier_on(netdev); + } + else + { + netif_carrier_on(netdev); + udelay(10); + netif_carrier_off(netdev); + } +} + +int32_t aux_get_bond_attrs(struct zxdh_en_device *en_dev, struct zxdh_lag_attrs *attr) +{ + *attr = (struct zxdh_lag_attrs) + { + .pannel_id = en_dev->pannel_id, + .vport = en_dev->vport, + .slot_id = en_dev->slot_id, + .qid[0] = en_dev->phy_index[0], + .qid[1] = en_dev->phy_index[1], + .pcie_id = en_dev->pcie_id, + .phy_port = en_dev->phy_port, + }; + + LOG_INFO("bond pf: pannel %hu, vport 0x%hx, phy_qid[0] %u, phy_qid[1] %u, pcie id 0x%x\n", + attr->pannel_id, attr->vport, attr->qid[0], attr->qid[1], attr->pcie_id); + + return 0; +} + +void aux_set_netdev_name(struct net_device *netdev, uint16_t pannel_id) +{ + struct zxdh_en_device *en_dev = NULL; + struct zxdh_en_priv *en_priv = NULL; + + en_priv = netdev_priv(netdev); + en_dev = &en_priv->edev; + + if (en_dev->ops->is_bond(en_dev->parent)) + { + netdev->dev_port = pannel_id + 1; + } +} + +int32_t zxdh_en_mtu_init(struct net_device *netdev) +{ + netdev->min_mtu = ETH_MIN_MTU; + netdev->max_mtu = ZXDH_MAX_MTU; + + return zxdh_en_config_mtu_to_np(netdev, ZXDH_DEFAULT_MTU); +} + +static int32_t zxdh_en_dev_probe(struct zxdh_auxiliary_device *adev, const struct zxdh_auxiliary_device_id *id) +{ + struct zxdh_en_container *en_container = container_of(adev, struct zxdh_en_container, adev); + struct net_device *netdev = NULL; + struct zxdh_en_priv *en_priv = NULL; + struct zxdh_en_device *en_dev = NULL; + struct zxdh_lag_attrs lag_attrs; + int32_t err = 0; + int32_t vqs_channel_num = 0; + + LOG_INFO("aux level driver probe start\n"); + + netdev = zxdh_create_netdev(en_container); + if (unlikely(netdev == NULL)) + { + LOG_ERR("zxdh_create_netdev is null\n"); + err = -ENOMEM; + goto err_create_netdev; + } + + zxdh_build_nic_netdev(netdev); + + dev_set_drvdata(&adev->dev, netdev_priv(netdev)); + + en_priv = netdev_priv(netdev); + en_dev = &en_priv->edev; + en_dev->channels_num = en_dev->ops->get_channels_num(en_dev->parent); + en_dev->ops->set_rdma_netdev(en_dev->parent, netdev); + en_dev->curr_unicast_num = 0; + en_dev->curr_multicast_num = 0; + en_dev->init_comp_flag = AUX_INIT_INCOMPLETED; + en_dev->delay_statistics_enable = 0; + + vqs_channel_num = en_dev->ops->create_vqs_channels(en_dev->parent); + if (vqs_channel_num < 0) + { + LOG_ERR("create_vqs_channels failed, vqs_channel_num: %d\n", vqs_channel_num); + err = vqs_channel_num; + goto err_create_vqs_channels; + } + + err = dh_aux_eq_table_init(en_priv); + if (err != 0) + { + LOG_ERR("Failed to alloc IRQs: %d\n", err); + goto err_eq_table_init; + } + + err = dh_aux_events_init(en_priv); + if (err != 0) + { + LOG_ERR("dh_aux_events_init failed: %d\n", err); + goto err_events_init; + } + + err = dh_aux_eq_table_create(en_priv); + if (err != 0) + { + LOG_ERR("Failed to alloc EQs: %d\n", err); + goto err_eq_table_create; + } + + err = zxdh_status_init(netdev); + if (err != 0) + { + LOG_ERR("zxdh_status_init failed: %d\n", err); + goto err_status_init; + } + + en_dev->ep_bdf = en_dev->ops->get_epbdf(en_dev->parent); + en_dev->vport = en_dev->ops->get_vport(en_dev->parent); + en_dev->pcie_id = en_dev->ops->get_pcie_id(en_dev->parent); + en_dev->slot_id = en_dev->ops->get_slot_id(en_dev->parent); + LOG_INFO("ep_bdf: 0x%x, vport: 0x%x, pcie_id: %d, slot_id: %d\n", en_dev->ep_bdf, en_dev->vport, en_dev->pcie_id, en_dev->slot_id); + + err = zxdh_vqs_init(netdev); + if (err != 0) + { + LOG_ERR("zxdh_vqs_init failed: %d\n", err); + goto err_vqs_init; + } + + if (en_dev->ops->is_upf(en_dev->parent)) + { + en_dev->hash_search_idx = 2;//FIXME + } + else if (!en_dev->ops->is_bond(en_dev->parent)) + { + err = zxdh_hash_id_get(en_dev); + if (err != 0) + { + LOG_ERR("zxdh_hash_id_get failed: %d\n", err); + goto err_do_vqs_free; + } + + err = zxdh_panel_id_get(en_dev); + if (err != 0) + { + LOG_ERR("zxdh_panel_id_get failed: %d\n", err); + goto err_do_vqs_free; + } + } + + en_dev->hash_func = ZXDH_FUNC_TOP; + if(en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + if (en_dev->ops->is_bond(en_dev->parent)) + { + err = zxdh_aux_alloc_pannel(en_dev); + if (err != 0) + { + LOG_ERR("zxdh_aux_alloc_pannel failed: %d\n", err); + goto err_do_vqs_free; + } + } + else if (!en_dev->ops->is_upf(en_dev->parent)) + { + err = zxdh_phyport_get(en_dev); + if (err != 0) + { + LOG_ERR("zxdh_phyport_get failed: %d\n", err); + goto err_do_vqs_free; + } + } + + err = zxdh_mac_addr_init(netdev); + if (err != 0) + { + LOG_ERR("zxdh_mac_addr_init failed: %d\n", err); + goto err_do_vqs_free; + } + + err = zxdh_pf_port_init(netdev); + if (err != 0) + { + LOG_ERR("zxdh_pf_port_init failed: %d\n", err); + goto err_do_vqs_free; + } + } + else + { + err = zxdh_vf_dpp_port_init(netdev); + if (err != 0) + { + LOG_ERR("zxdh_vf_dpp_port_init failed: %d\n", err); + goto err_do_vqs_free; + } + } + + if (!en_dev->ops->is_bond(en_dev->parent)) + { + netdev->priv_flags &= ~IFF_RXFH_CONFIGURED; + err = zxdh_num_channels_changed(en_dev, en_dev->curr_queue_pairs); + if (err != 0) + { + LOG_ERR("zxdh_num_channels_changed failed: %d\n", err); + goto err_do_vport_free; + } + } + + err = zxdh_common_tbl_init(netdev); + if (err != 0) + { + LOG_ERR("zxdh_common_tlb_init failed: %d\n", err); + goto err_do_rxfh_free; + } + + zxdh_device_ready(netdev); + + err = zxdh_en_mtu_init(netdev); + if (err != 0) + { + LOG_ERR("zxdh_en_mtu_init failed: %d\n", err); + goto err_do_rxfh_free; + } + + en_dev->hw_stats.q_stats = kmalloc_array(max_pairs, sizeof(struct zxdh_en_queue_stats), GFP_KERNEL); + if (unlikely(en_dev->hw_stats.q_stats == NULL)) + { + LOG_ERR("hw_stats.q_stats kmalloc failed\n"); + goto err_do_rxfh_free; + } + memset(en_dev->hw_stats.q_stats, 0, max_pairs * sizeof(struct zxdh_en_queue_stats)); + memset(&en_dev->pre_stats, 0, sizeof(struct zxdh_en_vport_stats)); + + err = zxdh_en_vport_pre_stats_get(en_dev); + if(err != 0) + { + LOG_ERR("get vport pre stats failed, %d\n", err); + goto err_do_q_stats_free; + } + + aux_set_netdev_name(netdev, en_dev->pannel_id); + err = register_netdev(netdev); + if (err != 0) + { + LOG_ERR("register_netdev failed, %d\n", err); + goto err_do_q_stats_free; + } + + zxdh_en_bar_del_mac(netdev); + zxdh_en_bar_cfg_mac(netdev, netdev->dev_addr); + zxdh_link_state_notify_kernel(netdev); + + if (en_dev->ops->is_bond(en_dev->parent)) + { + aux_get_bond_attrs(en_dev, &lag_attrs); + zxdh_ldev_add_netdev(en_container->parent, en_dev->pannel_id, netdev, &lag_attrs); + } + +#ifdef ZXDH_PLCR_OPEN + err = zxdh_plcr_init(en_priv); + if (err != 0) + { + LOG_ERR("zxdh_plcr_init failed, %d\n", err); + } +#endif + + en_dev->init_comp_flag = AUX_INIT_COMPLETED; + + err = dh_aux_ipv6_notifier_init(en_priv); + if (err != 0) + { + LOG_ERR("dh_aux_ipv6_notifier_init failed: %d\n", err); + goto err_ipv6_notifier_init; + } + + if(en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + en_dev->autoneg_enable = AUTONEG_ENABLE; + err = zxdh_en_phyport_init(en_dev); + if (err != 0) + { + LOG_ERR("zxdh_en_phyport_init failed: %d\n", err); + goto err_phyport_init; + } + } + +#ifdef ZXDH_MSGQ + NEED_MSGQ(en_dev) + { + err = zxdh_msgq_init(en_dev); + if (err) + { + LOG_ERR("zxdh_msgq_init failed: %d\n", err); + goto err_phyport_init; + } + } +#endif + + en_dev->ops->set_init_comp_flag(en_dev->parent); + + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + /* clear mcode gate,successfully build the scheduling tree, and then open it again */ + zxdh_dcbnl_set_tm_pport_mcode_gate_close(netdev); +#ifdef ZXDH_DCBNL_OPEN + err = zxdh_dcbnl_initialize(netdev); + if (err != 0) + { + LOG_ERR("zxdh_dcbnl_initialize failed: %d\n", err); + } +#endif + } + + en_dev->ops->set_bond_num(en_dev->parent, true); + LOG_INFO("%s: aux level driver probe completed\n", netdev->name); + + return 0; + +err_phyport_init: + dh_inet6_addr_change_notifier_unregister(&(en_dev->ipv6_notifier)); +err_ipv6_notifier_init: + if (en_dev->ops->is_bond(en_dev->parent)) + { + aux_get_bond_attrs(en_dev, &lag_attrs); + zxdh_ldev_remove_netdev(en_dev->parent, netdev, &lag_attrs); + } + unregister_netdev(netdev); +err_do_q_stats_free: + kfree(en_dev->hw_stats.q_stats); +err_do_rxfh_free: + if (!en_dev->ops->is_bond(en_dev->parent)) + { + zxdh_rxfh_del(en_dev); + } +err_do_vport_free: + zxdh_vport_uninit(netdev); +err_do_vqs_free: + zxdh_vqs_uninit(netdev); +err_vqs_init: + zxdh_add_status(netdev, ZXDH_CONFIG_S_FAILED); +err_status_init: + dh_aux_eq_table_destroy(en_priv); +err_eq_table_create: + dh_aux_events_uninit(en_priv); +err_events_init: + dh_aux_eq_table_cleanup(en_priv); +err_eq_table_init: + en_dev->ops->destroy_vqs_channels(en_dev->parent); + en_dev->ops->release_port(en_dev->parent, en_dev->pannel_id); +err_create_vqs_channels: + free_netdev(netdev); +err_create_netdev: + return err; +} + +static int32_t zxdh_en_dev_remove(struct zxdh_auxiliary_device *adev) +{ + struct zxdh_en_priv *en_priv = (struct zxdh_en_priv *)dev_get_drvdata(&adev->dev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct net_device *netdev = en_dev->netdev; + struct zxdh_lag_attrs lag_attrs; + + LOG_INFO("%s: aux level driver remove start\n", netdev->name); + + en_dev->ops->set_bond_num(en_dev->parent, false); + dh_inet6_addr_change_notifier_unregister(&(en_dev->ipv6_notifier)); +#ifdef ZXDH_MSGQ + NEED_MSGQ(en_dev) + { + zxdh_msgq_exit(en_dev); + } +#endif + +#ifdef ZXDH_PLCR_OPEN + zxdh_plcr_uninit(en_priv); +#endif + + if (en_dev->ops->is_bond(en_dev->parent)) + { + aux_get_bond_attrs(en_dev, &lag_attrs); + zxdh_ldev_remove_netdev(en_dev->parent, netdev, &lag_attrs); + } + + #ifdef ZXDH_DCBNL_OPEN + zxdh_dcbnl_ets_uninit(netdev); + #endif + + unregister_netdev(netdev); + kfree(en_dev->hw_stats.q_stats); + + if (!en_dev->ops->is_bond(en_dev->parent)) + { + zxdh_rxfh_del(en_dev); + } + + zxdh_vport_uninit(netdev); + + zxdh_vqs_uninit(netdev); + + zxdh_add_status(netdev, ZXDH_CONFIG_S_FAILED); + + dh_aux_eq_table_destroy(en_priv); + dh_aux_events_uninit(en_priv); + dh_aux_eq_table_cleanup(en_priv); + en_dev->ops->destroy_vqs_channels(en_dev->parent); + en_dev->ops->release_port(en_dev->parent, en_dev->pannel_id); + free_netdev(netdev); + LOG_INFO("aux level driver remove completed\n"); + + return 0; +} + +static void zxdh_en_dev_shutdown(struct zxdh_auxiliary_device *adev) +{ + LOG_INFO("aux level driver shutdown start\n"); + zxdh_en_dev_remove(adev); + LOG_INFO("aux level driver shutdown completed\n"); +}; + +static const struct zxdh_auxiliary_device_id zxdh_en_dev_id_table[] = { + { .name = ZXDH_PF_NAME "." ZXDH_EN_DEV_ID_NAME, }, + { }, +}; + +MODULE_DEVICE_TABLE(zxdh_auxiliary, zxdh_en_dev_id_table); + +static struct zxdh_auxiliary_driver zxdh_en_driver = { + .name = ZXDH_EN_DEV_ID_NAME, + .probe = zxdh_en_dev_probe, + .remove = zxdh_en_dev_remove, + .shutdown = zxdh_en_dev_shutdown, + .id_table = zxdh_en_dev_id_table, +}; + +int32_t zxdh_en_driver_register(void) +{ + int32_t err = 0; + + if ((max_pairs == 0) || (max_pairs >= ZXDH_MAX_PAIRS_NUM)) + { + LOG_INFO("max_pairs %u parameter is a invalid value, use the default value %u\n", max_pairs, ZXDH_MQ_PAIRS_NUM); + max_pairs = ZXDH_MQ_PAIRS_NUM; + } + + err = zxdh_auxiliary_driver_register(&zxdh_en_driver); + if (err != 0) + { + LOG_ERR("zxdh_auxiliary_driver_register failed: %d\n", err); + goto err_aux_register; + } + + err = dh_aux_msg_recv_func_register(); + if (err != 0) + { + LOG_ERR("dh_aux_msg_recv_func_register failed: %d\n", err); + goto err_msg_recv_register; + } + + err = zxdh_tools_netlink_register(); + if (err != 0) + { + LOG_ERR("zxdh_tools_msg_family register error failed: %d\n", err); + goto err_netlink_register; + } + + LOG_INFO("all driver insmod completed\n"); + + return 0; + +err_netlink_register: + dh_aux_msg_recv_func_unregister(); +err_msg_recv_register: + zxdh_auxiliary_driver_unregister(&zxdh_en_driver); +err_aux_register: + return err; +} + +void zxdh_en_driver_unregister(void) +{ + LOG_INFO("driver rmmod start\n"); + zxdh_tools_netlink_unregister(); + dh_aux_msg_recv_func_unregister(); + zxdh_auxiliary_driver_unregister(&zxdh_en_driver); +} + +module_init(zxdh_en_driver_register); +module_exit(zxdh_en_driver_unregister); diff --git a/src/net/drivers/net/ethernet/dinghai/en_aux.h b/src/net/drivers/net/ethernet/dinghai/en_aux.h new file mode 100755 index 0000000..6c7755a --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_aux.h @@ -0,0 +1,373 @@ +#ifndef __ZXDH_EN_AUX_H__ +#define __ZXDH_EN_AUX_H__ + +#include "msg_common.h" +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include +#include "./en_aux/queue.h" +#include "./en_aux/en_cmd.h" +#include "./en_pf.h" +#include "./en_aux/dcbnl/en_dcbnl.h" + +#define MAX_VLAN_ID 4095 + +#define PF_AC_MASK 0x800 +#define FILTER_MAC 0xAA +#define UNFILTER_MAC 0xFF + +#define AUX_INIT_INCOMPLETED 0 +#define AUX_INIT_COMPLETED 1 + +#define IS_DELAY_STATISTICS_PKT 0 +#define IS_NOT_DELAY_STATICTICS_PKT 1 + +#define ADD_IP6MAC 1 +#define DEL_IP6MAC 2 + +#define ZXDH_SET_FEATURE(features, feature, enable) \ + do { \ + if (enable) \ + { \ + *features |= feature; \ + } \ + else \ + { \ + *features &= ~feature; \ + } \ + } while (0) + +#define ZXDH_AUX_INIT_COMP_CHECK(en_dev) \ + do { \ + if (en_dev->init_comp_flag != AUX_INIT_COMPLETED) \ + { \ + return; \ + } \ + } while (0) + +typedef int (*zxdh_feature_handler)(struct net_device *netdev, bool enable); + +extern uint32_t max_pairs; + +struct zxdh_rdma_if; +struct zxdh_en_if; + +struct zxdh_en_container { + struct zxdh_auxiliary_device adev; + struct zxdh_rdma_dev_info *rdma_infos; + struct zxdh_rdma_if *rdma_ops; + struct zxdh_en_if *ops; + struct dh_core_dev *parent; + int32_t aux_id; +}; + +struct zxdh_en_queue_stats +{ + uint64_t q_rx_pkts; + uint64_t q_tx_pkts; + uint64_t q_rx_bytes; + uint64_t q_tx_bytes; + uint64_t q_tx_stopped; + uint64_t q_tx_wake; + uint64_t q_tx_dropped; +}; + +struct zxdh_en_netdev_stats +{ + uint64_t rx_packets; + uint64_t tx_packets; + uint64_t rx_bytes; + uint64_t tx_bytes; + uint64_t tx_queue_wake; + uint64_t tx_queue_stopped; + uint64_t tx_queue_dropped; +}; + +struct zxdh_en_vport_vqm_stats +{ + uint64_t rx_vport_packets; + uint64_t tx_vport_packets; + uint64_t rx_vport_bytes; + uint64_t tx_vport_bytes; + uint64_t rx_vport_dropped; +}; + +struct zxdh_en_vport_np_stats +{ + uint64_t rx_vport_broadcast_packets; + uint64_t tx_vport_broadcast_packets; + uint64_t rx_vport_mtu_drop_packets; + uint64_t tx_vport_mtu_drop_packets; + uint64_t rx_vport_mtu_drop_bytes; + uint64_t tx_vport_mtu_drop_bytes; + uint64_t rx_vport_plcr_drop_packets; + uint64_t tx_vport_plcr_drop_packets; + uint64_t rx_vport_plcr_drop_bytes; + uint64_t tx_vport_plcr_drop_bytes; +}; + + +struct zxdh_en_vport_stats +{ + struct zxdh_en_vport_vqm_stats vqm_stats; + struct zxdh_en_vport_np_stats np_stats; +}; + +struct zxdh_en_phy_stats +{ + uint64_t rx_packets_phy; + uint64_t tx_packets_phy; + uint64_t rx_bytes_phy; + uint64_t tx_bytes_phy; + uint64_t rx_errors; + uint64_t tx_errors; + uint64_t rx_discards; + uint64_t tx_drop; + uint64_t rx_multicast_phy; + uint64_t tx_multicast_phy; + uint64_t rx_broadcast_phy; + uint64_t tx_broadcast_phy; + uint64_t rx_size_64_phy; + uint64_t rx_size_65_127; + uint64_t rx_size_128_255; + uint64_t rx_size_256_511; + uint64_t rx_size_512_1023; + uint64_t rx_size_1024_1518; + uint64_t rx_size_1519_mru; + uint64_t rx_pause; + uint64_t tx_pause; +}__attribute__((packed)); + +struct zxdh_en_hw_stats +{ + struct zxdh_en_netdev_stats netdev_stats; + struct zxdh_en_vport_stats vport_stats; + struct zxdh_en_phy_stats phy_stats; + struct zxdh_en_queue_stats *q_stats; +}; + +struct zxdh_vlan_dev +{ + uint8_t qos; + uint8_t rsv; + uint16_t protcol; + uint16_t vlan_id; +}; + +/* drs sec */ +typedef struct +{ + uint64_t SecVAddr; /*每个设备的sec私有内存的虚拟基地址*/ + uint64_t SecPAddr; /*每个设备的sec私有内存的物理基地址*/ + uint32_t SecMemSize; /*每个设备的sec私有内存的大小*/ +}zxdh_sec_pri; + + +struct zxdh_en_device { + struct dh_core_dev *parent; + struct net_device *netdev; + void *msgq_dev; + struct zxdh_en_if *ops; + struct zxdh_en_hw_stats hw_stats; + struct zxdh_en_vport_stats pre_stats; + struct zxdh_vlan_dev vlan_dev; + + uint32_t device_id; + uint32_t vendor_id; + + uint64_t driver_feature; + uint64_t device_feature; + uint64_t guest_feature; + + struct list_head vqs_list; + spinlock_t vqs_list_lock; + uint32_t indir_rqt[ZXDH_INDIR_RQT_SIZE]; + + int32_t channels_num; + + /* a list of queues so we can dispatch IRQs */ + spinlock_t lock; + struct list_head virtqueues; + /* array of all queues for house-keeping */ + struct zxdh_pci_vq_info **vqs; + + struct send_queue *sq; + struct receive_queue *rq; + uint32_t status; + + /* Max # of queue pairs supported by the device */ + uint16_t curr_queue_pairs; + uint16_t max_queue_pairs; + + bool need_msgq; + /* Host can handle any s/g split between our header and packet data */ + bool any_header_sg; + /* Packet custom queue header size */ + uint8_t hdr_len; + /* Work struct for refilling if we run low on memory. */ + struct delayed_work refill; + + /* CPU hotplug instances for online & dead */ + struct hlist_node node; + struct hlist_node node_dead; + + bool np_direction; + bool drs_offload; + bool dtp_offload; + + uint32_t phy_index[ZXDH_MAX_QUEUES_NUM]; + + uint8_t link_check_bit; + uint8_t pannel_id; + uint8_t rsv[2]; + + uint16_t ep_bdf; + uint16_t pcie_id; + /* vfunc_active */ + uint16_t slot_id; + uint16_t vport; + uint8_t phy_port; + uint8_t panel_id; + uint8_t hash_search_idx; + uint8_t hash_func; + + uint32_t link_speed; + bool link_up; + uint8_t duplex; + + uint32_t speed; + uint32_t autoneg_enable; + uint32_t supported_speed_modes; + uint32_t advertising_speed_modes; + + bool promisc_enabled; + bool allmulti_enabled; + uint32_t pflags; + uint8_t clock_no; + uint32_t msglevel; + uint32_t wol_support; + uint32_t wolopts; + uint8_t fw_version[ETHTOOL_FWVERS_LEN]; + uint8_t fw_version_len; + uint32_t vf_1588_call_np_num; + uint32_t ptp_tc_enable_opt; + uint32_t delay_statistics_enable; + + struct work_struct vf_link_info_update_work; + struct work_struct link_info_irq_update_vf_work; + struct work_struct link_info_irq_process_work; + struct work_struct link_info_irq_update_np_work; + struct work_struct rx_mode_set_work; + + uint8_t curr_unicast_num; + uint8_t curr_multicast_num; + struct work_struct pf_notify_vf_link_state_work; + struct work_struct pf2vf_msg_proc_work; + struct work_struct pf_notify_vf_reset_work; + struct work_struct service_task; + struct work_struct service_riscv_task; + struct timer_list service_timer; + struct timer_list service_riscv_timer; + struct work_struct riscv2aux_msg_proc_work; + /* QoS DCB */ + struct zxdh_dcbnl_para dcb_para; + /* SEC */ + zxdh_sec_pri drs_sec_pri; + + /* initialization completion flag */ + uint8_t init_comp_flag; + + struct notifier_block ipv6_notifier; +}; + +struct zxdh_en_priv { + struct zxdh_en_device edev; + struct mutex lock; + struct dh_eq_table eq_table; + struct dh_events *events; +}; + +#define DEV_UNICAST_MAX_NUM 32 /* 每个PF/VF存储的单播mac转发表上限 */ +#define DEV_MULTICAST_MAX_NUM 32 /* 每个PF/VF存储的组播mac转发表上限 */ +#define UNICAST_MAX_NUM (DEV_UNICAST_MAX_NUM * 257) +#define MULTICAST_MAX_NUM (DEV_MULTICAST_MAX_NUM * 257) + +int32_t dh_aux_eq_table_init(struct zxdh_en_priv *en_priv); +void dh_aux_eq_table_cleanup(struct zxdh_en_priv *en_priv); +int32_t zxdh_ip6mac_add(struct zxdh_en_device *en_dev, const uint32_t *addr6, const uint8_t *ip6mac); +int32_t zxdh_ip6mac_del(struct zxdh_en_device *en_dev, const uint32_t *addr6, const uint8_t *ip6mac); +struct zxdh_rdma_if { + void *(*get_rdma_netdev)(struct dh_core_dev *dh_dev); +}; + +struct zxdh_en_if { + uint16_t (*get_channels_num)(struct dh_core_dev *dh_dev); + int32_t (*create_vqs_channels)(struct dh_core_dev *dh_dev); + void (*destroy_vqs_channels)(struct dh_core_dev *dh_dev); + void (*switch_vqs_channel)(struct dh_core_dev *dh_dev, int32_t channel, int32_t op); + int32_t (*vqs_channel_bind_handler)(struct dh_core_dev *dh_dev, int32_t vqs_channel_num, struct dh_vq_handler *handler); + void (*vqs_channel_unbind_handler)(struct dh_core_dev *dh_dev, int32_t vqs_channel_num); + int32_t (*vq_bind_channel)(struct dh_core_dev *dh_dev, int32_t channel_num, int32_t queue_index); + void (*vq_unbind_channel)(struct dh_core_dev *dh_dev, int32_t queue_index); + int32_t (*vqs_bind_eqs)(struct dh_core_dev *dh_dev, int32_t vqs_channel_num, struct list_head *vq_node); + void (*vqs_unbind_eqs)(struct dh_core_dev *dh_dev, int32_t vqs_channel_num); + void __iomem * (*vp_modern_map_vq_notify)(struct dh_core_dev *dh_dev, uint32_t index, resource_size_t *pa); + void (*vp_modern_unmap_vq_notify)(struct dh_core_dev *dh_dev, void *priv); + int32_t (*get_phy_vq)(struct dh_core_dev *dh_dev, uint16_t index); + void (*activate_phy_vq)(struct dh_core_dev *dh_dev, uint32_t phy_index, int32_t queue_size, uint64_t desc_addr, uint64_t driver_addr, uint64_t device_addr); + void (*de_activate_phy_vq)(struct dh_core_dev *dh_dev, uint32_t phy_index); + int32_t (*release_phy_vq)(struct dh_core_dev *dh_dev, uint32_t *phy_index, uint16_t total_qnum); + void (*set_status)(struct dh_core_dev *dh_dev, uint8_t status); + uint8_t (*get_status)(struct dh_core_dev *dh_dev); + void (*set_vf_mac)(struct dh_core_dev *dh_dev, uint8_t *mac, int32_t vf_id); + void (*get_vf_mac)(struct dh_core_dev *dh_dev, uint8_t *mac, int32_t vf_id); + void (*set_mac)(struct dh_core_dev *dh_dev, uint8_t *mac); + void (*get_mac)(struct dh_core_dev *dh_dev, uint8_t *mac); + uint64_t (*get_features)(struct dh_core_dev *dh_dev); + void (*set_features)(struct dh_core_dev *dh_dev, uint64_t features); + uint16_t (*get_queue_num)(struct dh_core_dev *dh_dev); + uint16_t (*get_queue_size)(struct dh_core_dev *dh_dev, uint32_t index); + void (*set_queue_enable)(struct dh_core_dev *dh_dev, uint16_t index, bool enable); + uint32_t (*get_epbdf)(struct dh_core_dev *dh_dev); + uint16_t (*get_vport)(struct dh_core_dev *dh_dev); + uint16_t (*get_pcie_id)(struct dh_core_dev *dh_dev); + uint16_t (*get_slot_id)(struct dh_core_dev *dh_dev); + bool (*is_bond)(struct dh_core_dev *dh_dev); + bool (*is_upf)(struct dh_core_dev *dh_dev); + enum dh_coredev_type (*get_coredev_type)(struct dh_core_dev *dh_dev); + struct pci_dev * (*get_pdev)(struct dh_core_dev *dh_dev); + uint64_t (*get_bar_virt_addr)(struct dh_core_dev *dh_dev, uint8_t bar_num); + int32_t (*msg_send_cmd)(struct dh_core_dev *dh_dev, uint16_t module_id, void *msg, void *ack, bool is_sync); + int32_t (*async_eq_enable)(struct dh_core_dev *dh_dev, struct dh_eq_async *eq, const char *name, bool attach); + struct zxdh_vf_item *(*get_vf_item)(struct dh_core_dev *dh_dev, uint16_t vf_idx); + void (*set_pf_link_up) (struct dh_core_dev *dh_dev, bool link_up); + bool (*get_pf_link_up) (struct dh_core_dev *dh_dev); + void (*update_pf_link_info)(struct dh_core_dev *dh_dev, struct link_info_struct *link_info_val); + int32_t (*get_pf_drv_msg)(struct dh_core_dev *dh_dev, uint8_t *drv_version, uint8_t *drv_version_len); + void (*set_vepa) (struct dh_core_dev *dh_dev, bool setting); + bool (*get_vepa) (struct dh_core_dev *dh_dev); + void (*set_bond_num)(struct dh_core_dev *dh_dev, bool add); + bool (*if_init)(struct dh_core_dev *dh_dev); + int32_t (*request_port)(struct dh_core_dev *dh_dev, void *data); + int32_t (*release_port)(struct dh_core_dev *dh_dev, uint32_t port_id); + void (*get_link_info_from_vqm)(struct dh_core_dev *dh_dev, uint8_t *link_up); + void (*set_vf_link_info)(struct dh_core_dev *dh_dev, uint16_t vf_idx, uint8_t link_up); + void (*set_pf_phy_port)(struct dh_core_dev *dh_dev, uint8_t phy_port); + void (*set_rdma_netdev)(struct dh_core_dev *dh_dev, void *data); + uint8_t (*get_pf_phy_port)(struct dh_core_dev *dh_dev); + void (*set_init_comp_flag)(struct dh_core_dev *dh_dev); + struct zxdh_ipv6_mac_tbl * (*get_ip6mac_tbl)(struct dh_core_dev *dh_dev); +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_aux/dcbnl/en_dcbnl.c b/src/net/drivers/net/ethernet/dinghai/en_aux/dcbnl/en_dcbnl.c new file mode 100644 index 0000000..34bfadd --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_aux/dcbnl/en_dcbnl.c @@ -0,0 +1,877 @@ +//#include +#include "../../en_aux.h" +#include "en_dcbnl.h" +#include "en_np/qos/include/dpp_drv_qos.h" +#include "en_aux/en_cmd.h" +#include "en_dcbnl_api.h" + +static int zxdh_dcbnl_ieee_getets(struct net_device *netdev, struct ieee_ets *ets) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + uint32_t tc = 0; + uint32_t j = 0; + + if (en_dev->ops->get_coredev_type(en_dev->parent) != DH_COREDEV_PF) + { + LOG_ERR("zxdh_dcbnl_ieee_getets: coredev type is not a PF"); + return -EOPNOTSUPP; + } + + ets->willing = 0; + + ets->ets_cap = ZXDH_DCBNL_MAX_TRAFFIC_CLASS; + + memcpy(ets->tc_tsa, en_dev->dcb_para.ets_cfg.tc_tsa, sizeof(ets->tc_tsa)); + memcpy(ets->tc_tx_bw, en_dev->dcb_para.ets_cfg.tc_tx_bw, sizeof(ets->tc_tx_bw)); + memcpy(ets->prio_tc, en_dev->dcb_para.ets_cfg.prio_tc, sizeof(ets->prio_tc)); + + for (tc = 0; tc < ZXDH_DCBNL_MAX_TRAFFIC_CLASS; tc++) + { + if (ets->tc_tsa[tc] != IEEE_8021QAZ_TSA_ETS) + { + ets->tc_tx_bw[tc] = 0; + } + } + + /* debug */ + for (j = 0; j < ZXDH_DCBNL_MAX_TRAFFIC_CLASS; j++) + { + LOG_INFO(" idx:%d, ets->tc_tsa:%d, ets->tc_tx_bw:%d, ets->prio_tc:%d \n", j, + ets->tc_tsa[j], ets->tc_tx_bw[j], ets->prio_tc[j]); + } + + return 0; +} + +static int zxdh_dcbnl_check_ets_maxtc(struct ieee_ets *ets) +{ + uint32_t i; + + for (i = 0; i < ZXDH_DCBNL_MAX_PRIORITY; i++) + { + if (ets->prio_tc[i] >= ZXDH_DCBNL_MAX_TRAFFIC_CLASS) + { + LOG_ERR("dcbnl_check_ets: Failed! TC value greater than max(%d)\n", ZXDH_DCBNL_MAX_TRAFFIC_CLASS); + return 1; + } + } + return 0; +} + +static int zxdh_dcbnl_check_ets_tcbw(struct ieee_ets *ets) +{ + bool have_ets_tc = false; + uint32_t bw_sum = 0; + uint32_t i; + + for (i = 0; i < ZXDH_DCBNL_MAX_TRAFFIC_CLASS; i++) + { + if (ets->tc_tsa[i] == IEEE_8021QAZ_TSA_ETS) + { + have_ets_tc = true; + bw_sum += ets->tc_tx_bw[i]; + } + } + + if (have_ets_tc && ((bw_sum != 100) && (bw_sum != 0))) + { + LOG_ERR("dcbnl_check_ets_tcbw: Failed! ETS BW sum is illegal\n"); + return 1; + } + + return 0; +} + +static int zxdh_dcbnl_check_ets_para(struct ieee_ets *ets) +{ + uint32_t err = 0; + + err = zxdh_dcbnl_check_ets_maxtc(ets); + if (err) + { + return -EINVAL; + } + + err = zxdh_dcbnl_check_ets_tcbw(ets); + if (err) + { + return -EINVAL; + } + LOG_INFO(" end \n"); + return 0; +} + + +static int zxdh_dcbnl_ieee_divide_tc_type(struct ieee_ets *ets, uint8_t *tc_type) +{ + uint32_t i; + + for (i = 0; i < ZXDH_DCBNL_MAX_TRAFFIC_CLASS; i++) + { + switch (ets->tc_tsa[i]) + { + case IEEE_8021QAZ_TSA_ETS: + tc_type[i] = ets->tc_tx_bw[i] ? ZXDH_DCBNL_ETS_TC : ZXDH_DCBNL_ZEROBW_ETS_TC; + break; + case IEEE_8021QAZ_TSA_STRICT: + tc_type[i] = ZXDH_DCBNL_STRICT_TC; + break; + case IEEE_8021QAZ_TSA_VENDOR: + tc_type[i] = ZXDH_DCBNL_VENDOR_TC; + break; + default: + tc_type[i] = ZXDH_DCBNL_STRICT_TC; + LOG_ERR("dcbnl: %d tsa error, change to strict \n", ets->tc_tsa[i]); + break; + } + } + + return 0; +} + +static int zxdh_dcbnl_ieee_convert_tc_bw(struct ieee_ets *ets, uint8_t *tc_type, uint8_t *tc_tx_bw) +{ + uint32_t i; + uint8_t zero_ets_bw = 0; + uint8_t zero_ets_num = 0; + + for (i = 0; i < ZXDH_DCBNL_MAX_TRAFFIC_CLASS; i++) + { + if (tc_type[i] == ZXDH_DCBNL_ZEROBW_ETS_TC) + { + zero_ets_num++; + } + } + + if (zero_ets_num) + { + zero_ets_bw = (uint8_t)ZXDH_DCBNL_MAX_BW_ALLOC / zero_ets_num; + } + + for (i = 0; i < ZXDH_DCBNL_MAX_TRAFFIC_CLASS; i++) + { + switch (tc_type[i]) + { + case ZXDH_DCBNL_ZEROBW_ETS_TC: + tc_tx_bw[i] = zero_ets_bw; + break; + case ZXDH_DCBNL_ETS_TC: + tc_tx_bw[i] = ets->tc_tx_bw[i]; + break; + case ZXDH_DCBNL_STRICT_TC: + case ZXDH_DCBNL_VENDOR_TC: + tc_tx_bw[i] = ZXDH_DCBNL_MAX_BW_ALLOC; + break; + default: + break; + } + } + /* debug */ + LOG_INFO(" zero_ets_num:%d, zero_ets_bw:%d \n", zero_ets_num, zero_ets_bw); + + return 0; +} + +static uint32_t zxdh_dcbnl_ieee_set_ets_para(struct zxdh_en_priv *en_priv, struct ieee_ets *ets) +{ + struct zxdh_en_device *en_dev = &en_priv->edev; + uint8_t tc_type[ZXDH_DCBNL_MAX_TRAFFIC_CLASS]; + uint8_t tc_tx_bw[ZXDH_DCBNL_MAX_TRAFFIC_CLASS]; + uint32_t err = 0; + uint32_t j = 0; + + zxdh_dcbnl_ieee_divide_tc_type(ets, tc_type); + + zxdh_dcbnl_ieee_convert_tc_bw(ets, tc_type, tc_tx_bw); + + err = zxdh_dcbnl_set_tc_scheduling(en_priv, tc_type, tc_tx_bw); + if (err) + { + LOG_ERR("set_tc_scheduling failed \n"); + return err; + } + + err = zxdh_dcbnl_set_ets_up_tc_map(en_priv, ets->prio_tc); + if (err) + { + LOG_ERR("set_prio_tc_map failed \n"); + return err; + } + + memcpy(en_dev->dcb_para.ets_cfg.tc_tsa, ets->tc_tsa, sizeof(ets->tc_tsa)); + memcpy(en_dev->dcb_para.ets_cfg.tc_tx_bw, ets->tc_tx_bw, sizeof(ets->tc_tx_bw)); + memcpy(en_dev->dcb_para.ets_cfg.prio_tc, ets->prio_tc, sizeof(ets->prio_tc)); + /* debug */ + for (j = 0; j < ZXDH_DCBNL_MAX_TRAFFIC_CLASS; j++) + { + LOG_INFO(" idx:%d, tc_tsa:%d, tc_tx_bw:%d, prio_tc:%d \n", j, + en_dev->dcb_para.ets_cfg.tc_tsa[j], en_dev->dcb_para.ets_cfg.tc_tx_bw[j], en_dev->dcb_para.ets_cfg.prio_tc[j]); + + LOG_INFO(" idx:%d, tc_type:%d, tc_tx_bw:%d \n", j, tc_type[j], tc_tx_bw[j]); + } + + return 0; +} + +static int zxdh_dcbnl_ieee_setets(struct net_device *netdev, struct ieee_ets *ets) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + uint32_t err; + uint32_t j = 0; + + /* debug */ + for (j = 0; j < ZXDH_DCBNL_MAX_TRAFFIC_CLASS; j++) + { + LOG_INFO(" idx:%d, ets->tc_tsa:%d, ets->tc_tx_bw:%d, ets->prio_tc:%d \n", j, + ets->tc_tsa[j], ets->tc_tx_bw[j], ets->prio_tc[j]); + } + + if (en_dev->ops->get_coredev_type(en_dev->parent) != DH_COREDEV_PF) + { + LOG_ERR(" coredev type is not a PF"); + return -EOPNOTSUPP; + } + + err = zxdh_dcbnl_check_ets_para(ets); + if (err) + { + return err; + } + + err = zxdh_dcbnl_ieee_set_ets_para(en_priv, ets); + if (err) + { + return err; + } + + return 0; +} + +static int zxdh_dcbnl_ieee_getpfc(struct net_device *netdev, struct ieee_pfc *pfc) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + uint32_t pfc_cur_tm_en = 0; + uint32_t pfc_cur_mac_en = 0; + int32_t ret = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + LOG_INFO("zxdh_dcbnl_ieee_getpfc start\n"); + + /*获取端口pfc使能函数*/ + ret = zxdh_en_fc_mode_get(en_dev, &pfc_cur_mac_en); + LOG_INFO("zxdh_en_fc_mode_get:%d", pfc_cur_mac_en); + + if(0 != ret) + { + LOG_ERR("zxdh_port_pfc_enable_get failed"); + return ret; + } + ret = dpp_qmu_port_pfc_get(&pf_info, en_dev->phy_port, &pfc_cur_tm_en); + LOG_INFO("dpp_qmu_port_pfc_get:%d", pfc_cur_tm_en); + + if(ret != 0) + { + LOG_ERR("dpp_qmu_port_pfc_get failed"); + return ret; + } + if((pfc_cur_tm_en == 1)&&(pfc_cur_mac_en == BIT(SPM_FC_PFC_FULL))) + { + pfc->pfc_en = 255; + } + else if((pfc_cur_tm_en == 0)&&(pfc_cur_mac_en == BIT(SPM_FC_NONE))) + { + pfc->pfc_en = 0; + } + else + { + //ret = -1; + LOG_INFO("pfc_cur_mac_en != pfc_cur_tm_en"); + } + + LOG_INFO("zxdh_dcbnl_ieee_getpfc end\n"); + + return ret; +} + +static int zxdh_dcbnl_ieee_setpfc(struct net_device *netdev, struct ieee_pfc *pfc) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + uint32_t port_mac_en = 0; + uint32_t port_tm_en = 0; + uint32_t ret = 0; + uint32_t test_pfc_mac_en = 0; + DPP_PF_INFO_T pf_info = {0}; + + LOG_INFO("zxdh_dcbnl_ieee_setpfc start\n"); + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + //兼容现有工具考虑,后续开发工具后可以注释掉 + if(pfc->pfc_en != 0 && pfc->pfc_en != 0xff ) + { + LOG_INFO("pfc->pfc_en input invalid: %d", pfc->pfc_en); + return EINVAL; + } + + if(pfc->pfc_en != 0) + { + port_mac_en = BIT(SPM_FC_PFC_FULL); + port_tm_en = 1; + } + else + { + port_mac_en = BIT(SPM_FC_NONE); + //不使能后重新设置为初始状态阈值 + //ret = zxdh_port_th_update_to_default(en_dev); + + if(ret) + { + LOG_INFO("zxdh_port_th_update_to_last failed"); + } + } + /*tm端口pfc使能*/ + //ret |= dpp_qmu_port_pfc_set(&pf_info, en_dev->phy_port, port_tm_en); + //dpp_qmu_port_pfc_get(&pf_info, en_dev->phy_port, &test_pfc_tm_en); + //LOG_INFO("dpp_qmu_port_pfc_get: %d", test_pfc_tm_en); + + /*mac部分端口pfc使能*/ + ret |= zxdh_en_fc_mode_set(en_dev, port_mac_en); + zxdh_en_fc_mode_get(en_dev, &test_pfc_mac_en); + LOG_INFO("zxdh_port_pfc_enable_get: %d", test_pfc_mac_en); + + if(pfc->pfc_en != 0) + { + //ret = zxdh_port_th_update(en_dev); + } + + /*错误判断及打印*/ + if(0 != ret) + { + LOG_ERR("zxdh_dcbnl_ieee_setpfc pfc_en:%c failed, %d", pfc->pfc_en, ret); + } + + LOG_INFO("zxdh_dcbnl_ieee_setpfc end\n"); + + return ret; +} + +static int zxdh_dcbnl_ieee_getmaxrate(struct net_device *netdev, struct ieee_maxrate *maxrate) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + uint32_t i = 0; + uint32_t j = 0; + + if (en_dev->ops->get_coredev_type(en_dev->parent) != DH_COREDEV_PF) + { + LOG_ERR("coredev type is not a PF"); + return -EOPNOTSUPP; + } + + for (i = 0; i < ZXDH_DCBNL_MAX_TRAFFIC_CLASS; i++) + { + if (ZXDH_DCBNL_MAXRATE_KBITPS <= en_dev->dcb_para.tc_maxrate[i]) + { + maxrate->tc_maxrate[i] = 0; //0 indicates unlimited + } + else + { + maxrate->tc_maxrate[i] = en_dev->dcb_para.tc_maxrate[i]; + } + } + + /* debug */ + for (j = 0; j < ZXDH_DCBNL_MAX_TRAFFIC_CLASS; j++) + { + LOG_INFO(" tc:%d,tc_maxrate:%lld \n", j, maxrate->tc_maxrate[j]); + } + + return 0; +} + +static int zxdh_dcbnl_ieee_setmaxrate(struct net_device *netdev, struct ieee_maxrate *maxrate) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + uint32_t maxrate_kbps[ZXDH_DCBNL_MAX_TRAFFIC_CLASS] = {0}; + uint32_t err,i; + uint32_t j = 0; + + if (en_dev->ops->get_coredev_type(en_dev->parent) != DH_COREDEV_PF) + { + LOG_ERR("coredev type is not a PF"); + return -EOPNOTSUPP; + } + + /* Values are 64 bits and specified in Kbps */ + for (i = 0; i < ZXDH_DCBNL_MAX_TRAFFIC_CLASS; i++) + { + if ((maxrate->tc_maxrate[i] == 0) || (maxrate->tc_maxrate[i] >= ZXDH_DCBNL_MAXRATE_KBITPS)) + { + maxrate_kbps[i] = ZXDH_DCBNL_MAXRATE_KBITPS; + } + else if (maxrate->tc_maxrate[i] <= ZXDH_DCBNL_MINRATE_KBITPS) + { + maxrate_kbps[i] = ZXDH_DCBNL_MINRATE_KBITPS; + } + else + { + maxrate_kbps[i] = (uint32_t)maxrate->tc_maxrate[i]; + } + } + /* debug */ + for (j = 0; j < ZXDH_DCBNL_MAX_TRAFFIC_CLASS; j++) + { + LOG_INFO(" tc:%d,maxrate->tc_maxrate:%lld,maxrate_kbps:%d \n", + j, maxrate->tc_maxrate[j], maxrate_kbps[j]); + } + + err = zxdh_dcbnl_set_tc_maxrate(en_priv, maxrate_kbps); + if (err) + { + return err; + } + + return 0; +} + + +static int zxdh_dcbnl_ieee_setapp(struct net_device *netdev, struct dcb_app *app) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct dcb_app app_old; + bool is_new = false; + int err = 0; + + if (en_dev->ops->get_coredev_type(en_dev->parent) != DH_COREDEV_PF) + { + LOG_ERR(" coredev type is not a PF"); + return -EOPNOTSUPP; + } + + if ((app->selector != IEEE_8021QAZ_APP_SEL_DSCP) || + (app->protocol >= ZXDH_DCBNL_MAX_DSCP) || + (app->priority >= ZXDH_DCBNL_MAX_PRIORITY)) + { + return -EINVAL; + } + /* Save the old entry info */ + app_old.selector = IEEE_8021QAZ_APP_SEL_DSCP; + app_old.protocol = app->protocol; + app_old.priority = en_dev->dcb_para.dscp2prio[app->protocol]; + + LOG_INFO(" protocol:%d, priority:%d \n", app->protocol, app->priority); + + if (!en_dev->dcb_para.dscp_app_num) + { + err = zxdh_dcbnl_set_ets_trust(en_priv, ZXDH_DCBNL_ETS_TRUST_DSCP); + if (err) + { + return err; + } + } + + if (app->priority != en_dev->dcb_para.dscp2prio[app->protocol]) + { + err = zxdh_dcbnl_set_dscp2prio(en_priv, app->protocol, app->priority); + if (err) + { + zxdh_dcbnl_set_ets_trust(en_priv, ZXDH_DCBNL_ETS_TRUST_PCP); + return err; + } + } + + /* Delete the old entry if exists */ + err = dcb_ieee_delapp(netdev, &app_old); + if (err) + { + is_new = true; + } + /* Add new entry and update counter */ + err = dcb_ieee_setapp(netdev, app); + if (err) + { + return err; + } + if (is_new) + { + en_dev->dcb_para.dscp_app_num++; + } + LOG_INFO(" dscp_app_num:%d \n", en_dev->dcb_para.dscp_app_num); + + return err; +} + +static int zxdh_dcbnl_ieee_delapp(struct net_device *netdev, struct dcb_app *app) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + int err = 0; + + if (en_dev->ops->get_coredev_type(en_dev->parent) != DH_COREDEV_PF) + { + LOG_ERR("zxdh_dcbnl_ieee_delapp coredev type is not a PF"); + return -EOPNOTSUPP; + } + + if ((app->selector != IEEE_8021QAZ_APP_SEL_DSCP) || + (app->protocol >= ZXDH_DCBNL_MAX_DSCP)) + { + return -EINVAL; + } + + if (!en_dev->dcb_para.dscp_app_num) + { + return -ENOENT; + } + + if (app->priority != en_dev->dcb_para.dscp2prio[app->protocol]) + { + return -ENOENT; + } + + /* Delete the app entry */ + err = dcb_ieee_delapp(netdev, app); + if (err) + { + return err; + } + + /* Restore to default */ + err = zxdh_dcbnl_set_dscp2prio(en_priv, app->protocol, app->protocol>>3); + if (err) + { + zxdh_dcbnl_set_ets_trust(en_priv, ZXDH_DCBNL_ETS_TRUST_PCP); + return err; + } + en_dev->dcb_para.dscp_app_num--; + LOG_INFO(" protocol:%d, dscp_app_num:%d \n", app->protocol, en_dev->dcb_para.dscp_app_num); + + if (!en_dev->dcb_para.dscp_app_num) + { + err = zxdh_dcbnl_set_ets_trust(en_priv, ZXDH_DCBNL_ETS_TRUST_PCP); + } + + return err; + +} +#ifdef ZXDH_DCBNL_CEE_SUPPORT +static void zxdh_dcbnl_setpgtccfgtx(struct net_device *netdev, int tc, + uint8_t prio_type, uint8_t pgid, + uint8_t bw_pct, uint8_t up_map) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct zxdh_dcbnl_cee_ets *cee_ets_cfg; + uint32_t i; + + if (en_dev->ops->get_coredev_type(en_dev->parent) != DH_COREDEV_PF) + { + LOG_ERR("zxdh_dcbnl_setpgtccfgtx coredev type is not a PF"); + return; + } + + if ((tc < 0) || (tc >= ZXDH_DCBNL_MAX_TRAFFIC_CLASS)) + { + return; + } + + cee_ets_cfg = &en_dev->dcb_para.cee_ets_cfg; + for (i = 0; i < ZXDH_DCBNL_MAX_PRIORITY; i++) + { + if (up_map & BIT(i)) + { + cee_ets_cfg->prio_tc[i] = tc; + } + } + cee_ets_cfg->tc_tsa[tc] = IEEE_8021QAZ_TSA_ETS; + +} +static void zxdh_dcbnl_setpgbwgcfgtx(struct net_device *netdev, int pgid, uint8_t bw_pct) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + + if (en_dev->ops->get_coredev_type(en_dev->parent) != DH_COREDEV_PF) + { + LOG_ERR("zxdh_dcbnl_setpgbwgcfgtx coredev type is not a PF"); + return; + } + + if ((pgid >= 0) && (pgid < ZXDH_DCBNL_MAX_TRAFFIC_CLASS)) + { + en_dev->dcb_para.cee_ets_cfg.tc_tx_bw[pgid] = bw_pct; + } + LOG_INFO(" tc_tx_bw[%d]:%d \n", pgid, bw_pct); + +} + +static void zxdh_dcbnl_getpgtccfgtx(struct net_device *netdev, int prio, + uint8_t *prio_type, uint8_t *pgid, + uint8_t *bw_pct, uint8_t *up_map) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + + /* pf检查 */ + if (en_dev->ops->get_coredev_type(en_dev->parent) != DH_COREDEV_PF) + { + LOG_ERR("zxdh_dcbnl_getpgtccfgtx coredev type is not a PF"); + return; + } + + if ((prio >= 0) && (prio < ZXDH_DCBNL_MAX_PRIORITY)) + { + *pgid = en_dev->dcb_para.ets_cfg.prio_tc[prio]; + } + +} + +static void zxdh_dcbnl_getpgbwgcfgtx(struct net_device *netdev, int pgid, uint8_t *bw_pct) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + + if (en_dev->ops->get_coredev_type(en_dev->parent) != DH_COREDEV_PF) + { + LOG_ERR("zxdh_dcbnl_getpgbwgcfgtx coredev type is not a PF"); + return; + } + + if ((pgid >= 0) && (pgid < ZXDH_DCBNL_MAX_TRAFFIC_CLASS)) + { + *bw_pct = en_dev->dcb_para.ets_cfg.tc_tx_bw[pgid]; + } + +} + + +static void zxdh_dcbnl_setpgtccfgrx(struct net_device *netdev, int prio, + uint8_t prio_type, uint8_t pgid, + uint8_t bw_pct, uint8_t up_map) +{ + LOG_ERR("Rx PG TC Config Not Supported.\n"); +} + +static void zxdh_dcbnl_setpgbwgcfgrx(struct net_device *netdev, int pgid, uint8_t bw_pct) +{ + LOG_ERR("Rx PG BWG Config Not Supported.\n"); +} + + +static void zxdh_dcbnl_getpgtccfgrx(struct net_device *netdev, int prio, + uint8_t *prio_type, uint8_t *pgid, + uint8_t *bw_pct, uint8_t *up_map) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + + if (en_dev->ops->get_coredev_type(en_dev->parent) != DH_COREDEV_PF) + { + LOG_ERR("zxdh_dcbnl_getpgtccfgrx coredev type is not a PF"); + return; + } + + if ((prio >= 0) && (prio < ZXDH_DCBNL_MAX_PRIORITY)) + { + *pgid = en_dev->dcb_para.ets_cfg.prio_tc[prio]; + } + +} + +static void zxdh_dcbnl_getpgbwgcfgrx(struct net_device *netdev, int pgid, uint8_t *bw_pct) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + + if (en_dev->ops->get_coredev_type(en_dev->parent) != DH_COREDEV_PF) + { + LOG_ERR("zxdh_dcbnl_getpgbwgcfgrx coredev type is not a PF"); + return; + } + + if ((pgid >= 0) && (pgid < ZXDH_DCBNL_MAX_TRAFFIC_CLASS)) + { + *bw_pct = 0; + } + +} + +static uint8_t zxdh_dcbnl_setall(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct ieee_ets ets = {0}; + uint32_t i = 0; + uint32_t err = 0; + uint32_t j = 0; + + if (en_dev->ops->get_coredev_type(en_dev->parent) != DH_COREDEV_PF) + { + LOG_ERR("zxdh_dcbnl_setall coredev type is not a PF"); + return 1; + } + + ets.ets_cap = ZXDH_DCBNL_MAX_TRAFFIC_CLASS; + for (i = 0; i < ZXDH_DCBNL_MAX_TRAFFIC_CLASS; i++) + { + ets.tc_tx_bw[i] = en_dev->dcb_para.cee_ets_cfg.tc_tx_bw[i]; + ets.tc_rx_bw[i] = en_dev->dcb_para.cee_ets_cfg.tc_tx_bw[i]; + ets.tc_tsa[i] = en_dev->dcb_para.cee_ets_cfg.tc_tsa[i]; + } + + for (i = 0; i < ZXDH_DCBNL_MAX_PRIORITY; i++) + { + ets.prio_tc[i] = en_dev->dcb_para.cee_ets_cfg.prio_tc[i]; + } + /* debug */ + for (j = 0; j < ZXDH_DCBNL_MAX_TRAFFIC_CLASS; j++) + { + LOG_INFO(" idx:%d, tc_tsa:%d, tc_tx_bw:%d, prio_tc:%d \n", j, ets.tc_tx_bw[j], ets.tc_tsa[j], ets.prio_tc[j]); + } + + err = zxdh_dcbnl_check_ets_para(&ets); + if (err) + { + return err; + } + + err = zxdh_dcbnl_ieee_set_ets_para(en_priv, &ets); + if (err) + { + return err; + } + + return 0; +} + +static uint8_t zxdh_dcbnl_getstate(struct net_device *netdev) +{ + return ZXDH_DCBNL_CEE_STATE_UP; +} + +static uint8_t zxdh_dcbnl_setstate(struct net_device *netdev, u8 state) +{ + + return 0; +} +#endif + +static const struct dcbnl_rtnl_ops zxdh_dcbnl_ops ={ + .ieee_getets = zxdh_dcbnl_ieee_getets, + .ieee_setets = zxdh_dcbnl_ieee_setets, + .ieee_getpfc = zxdh_dcbnl_ieee_getpfc, + .ieee_setpfc = zxdh_dcbnl_ieee_setpfc, + + .ieee_getmaxrate = zxdh_dcbnl_ieee_getmaxrate, + .ieee_setmaxrate = zxdh_dcbnl_ieee_setmaxrate, + + .ieee_setapp = zxdh_dcbnl_ieee_setapp, + .ieee_delapp = zxdh_dcbnl_ieee_delapp, + +#ifdef ZXDH_DCBNL_CEE_SUPPORT + /* CEE not support */ + .setall = zxdh_dcbnl_setall, + + .getstate = zxdh_dcbnl_getstate, + .setstate = zxdh_dcbnl_setstate, + + .setpgtccfgtx = zxdh_dcbnl_setpgtccfgtx, + .setpgbwgcfgtx = zxdh_dcbnl_setpgbwgcfgtx, + .getpgtccfgtx = zxdh_dcbnl_getpgtccfgtx, + .getpgbwgcfgtx = zxdh_dcbnl_getpgbwgcfgtx, + + .setpgtccfgrx = zxdh_dcbnl_setpgtccfgrx, + .setpgbwgcfgrx = zxdh_dcbnl_setpgbwgcfgrx, + .getpgtccfgrx = zxdh_dcbnl_getpgtccfgrx, + .getpgbwgcfgrx = zxdh_dcbnl_getpgbwgcfgrx, +#endif +}; + +uint32_t zxdh_dcbnl_set_tm_pport_mcode_gate_open(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + uint32_t err = 0; + err = zxdh_dcbnl_set_tm_gate(en_priv, 1); + if (err) + { + LOG_ERR(" set_tm_gate close failed \n"); + } + LOG_INFO(" tm mcode gate open "); + return err; +} + +uint32_t zxdh_dcbnl_set_tm_pport_mcode_gate_close(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + uint32_t err = 0; + err = zxdh_dcbnl_set_tm_gate(en_priv, 0); + if (err) + { + LOG_ERR(" set_tm_gate close failed \n"); + } + LOG_INFO(" tm mcode gate close "); + return err; +} + +uint32_t zxdh_dcbnl_initialize(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + uint32_t err = 0; + + LOG_INFO("%s dcbnl init begin\n", netdev->name); + + err = zxdh_dcbnl_init_port_speed(en_priv); + if (err) + { + LOG_INFO("dcbnl_init_ets: init_port_speed failed \n"); + //return err; + } + + err = zxdh_dcbnl_init_ets_scheduling_tree(en_priv); + if (err) + { + LOG_ERR("dcbnl_init_ets: init_ets_scheduling_tree failed \n"); + return err; + } + + zxdh_dcbnl_printk_ets_tree(en_priv); + + zxdh_dcbnl_pfc_init(en_priv); + + en_dev->dcb_para.init_flag = ZXDH_DCBNL_INIT_FLAG; + netdev->dcbnl_ops = &zxdh_dcbnl_ops; + zxdh_dcbnl_set_tm_pport_mcode_gate_open(netdev); + LOG_INFO("%s dcbnl init ok ", netdev->name); + return 0; +} + +uint32_t zxdh_dcbnl_ets_uninit(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + + if (en_dev->ops->get_coredev_type(en_dev->parent) != DH_COREDEV_PF) + { + return 0; + } + LOG_INFO("%s dcbnl uninit begin\n", netdev->name); + + en_dev->dcb_para.init_flag = 0; + netdev->dcbnl_ops = NULL; + zxdh_dcbnl_set_tm_pport_mcode_gate_close(netdev); + + zxdh_dcbnl_free_flow_resources(en_priv); + + zxdh_dcbnl_free_se_resources(en_priv); + + LOG_INFO("%s dcbnl uninit ok ", netdev->name); + return 0; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_aux/dcbnl/en_dcbnl.h b/src/net/drivers/net/ethernet/dinghai/en_aux/dcbnl/en_dcbnl.h new file mode 100644 index 0000000..2ade85a --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_aux/dcbnl/en_dcbnl.h @@ -0,0 +1,213 @@ +#ifndef __ZXDH_EN_DCBNL_H__ +#define __ZXDH_EN_DCBNL_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* 启用dcb会大幅度增加初始化时间,暂时先注释 */ +//#define ZXDH_DCBNL_OPEN + +/* CEE not support */ +//#define ZXDH_DCBNL_CEE_SUPPORT + +#define ZXDH_DCBNL_INIT_FLAG (0x5a5a5a5a) +#define ZXDH_DCBNL_NULL_ID (0xffffffff) + +#define ZXDH_DCBNL_MAX_PRIORITY (8) +#define ZXDH_DCBNL_MAX_TRAFFIC_CLASS (8) + +#define ZXDH_DCBNL_MAX_DSCP (64) + +#define ZXDH_DCBNL_MAX_BW_ALLOC (100) +#define ZXDH_DCBNL_MAX_WEIGHT (512) + +#define ZXDH_DCBNL_RATEUNIT_K (1000) +#define ZXDH_DCBNL_RATEUNIT_M (1000000) +#define ZXDH_DCBNL_RATEUNIT_G (1000000000) +#define ZXDH_DCBNL_MAXRATE_KBITPS (400*1000000) +#define ZXDH_DCBNL_MINRATE_KBITPS (64) + +#define ZXDH_DCBNL_INITRATE_KBITPS (400*1000000) + +#define ZXDH_DCBNL_FLOW_RATE_CIR (0) + +#define ZXDH_DCBNL_FLOW_RATE_CBS (2000) +#define ZXDH_DCBNL_FLOW_RATE_EBS (4000) +#define ZXDH_DCBNL_PORT_RATE_CBS (4000) + +#define ZXDH_DCBNL_FLOW_RATE_CBS_REFRESH (0) +#define ZXDH_DCBNL_FLOW_RATE_EBS_REFRESH (0) + +#define ZXDH_DCBNL_FLOW_TDTH (150) + +#define ZXDH_DCBNL_CEE_STATE_UP (1) + +#define ZXDH_DCBNL_MAX_SE_NODE_NUM (12) +#define ZXDH_DCBNL_MAX_TREE_LEVEL (7) +#define ZXDH_DCBNL_ETS_TREE_ROOT_LEVEL (4) +#define ZXDH_DCBNL_ETS_TREE_FLOW_LEVEL (0) + +#define ZXDH_DCBNL_GSCHID_ID_MASK (0xFFFF) +#define ZXDH_DCBNL_GSCHID_ID_SHIFT (0) + +#define ZXDH_DCBNL_GET_GSCHID_MSG(val,mask,shift) ((val >> shift)&mask) + +enum zxdh_dcbnl_ets_trust { + ZXDH_DCBNL_ETS_TRUST_PCP = 0, + ZXDH_DCBNL_ETS_TRUST_DSCP = 1, +}; + +enum zxdh_dcbnl_ets_tc_tsa { + ZXDH_DCBNL_VENDOR_TC = 0, + ZXDH_DCBNL_STRICT_TC = 1, + ZXDH_DCBNL_ETS_TC = 2, + ZXDH_DCBNL_ZEROBW_ETS_TC = 3, +}; + +enum zxdh_dcbnl_ets_node_link_point { + ZXDH_DCBNL_ETS_NODE_NULL = 0, + ZXDH_DCBNL_ETS_NODE_VENDOR_C = 1, + ZXDH_DCBNL_ETS_NODE_STRICT_C = 2, + ZXDH_DCBNL_ETS_NODE_ETS_C = 3, + ZXDH_DCBNL_ETS_NODE_ZEROBW_ETS_C = 4, + ZXDH_DCBNL_ETS_NODE_VENDOR_E = 5, + ZXDH_DCBNL_ETS_NODE_STRICT_E = 6, + ZXDH_DCBNL_ETS_NODE_ETS_E = 7, + ZXDH_DCBNL_ETS_NODE_ZEROBW_ETS_E = 8, +}; + +enum zxdh_dcbnl_se_flow_node_type { + ZXDH_DCBNL_ETS_NODE_FQ = 0, + ZXDH_DCBNL_ETS_NODE_FQ2 = 1, + ZXDH_DCBNL_ETS_NODE_FQ4 = 2, + ZXDH_DCBNL_ETS_NODE_FQ8 = 3, + ZXDH_DCBNL_ETS_NODE_SP = 4, + ZXDH_DCBNL_ETS_NODE_WFQ = 5, + ZXDH_DCBNL_ETS_NODE_WFQ2 = 6, + ZXDH_DCBNL_ETS_NODE_WFQ4 = 7, + ZXDH_DCBNL_ETS_NODE_WFQ8 = 8, + ZXDH_DCBNL_ETS_NODE_FLOW = 9, +}; + +enum zxdh_tm_trpg_speed{ + ZXDH_TRPG_SPEED_50G = 0, + ZXDH_TRPG_SPEED_100G = 1, + ZXDH_TRPG_SPEED_200G = 2, + ZXDH_TRPG_SPEED_RDMA_400G = 3, + ZXDH_TRPG_DEFAULT = 4, + + ZXDH_TRPG_SPEED_NUM, + +}; +struct zxdh_dcbnl_ets_se_node{ + struct zxdh_dcbnl_ets_se_node *se_next; + uint64_t gsch_id; + uint32_t node_idx; + uint32_t node_type; + uint32_t se_id; + uint32_t se_link_id; + uint32_t se_link_weight; + uint32_t se_link_sp; + uint32_t link_point; +}; + +struct zxdh_dcbnl_ets_flow_node{ + struct zxdh_dcbnl_ets_flow_node *flow_next; + uint64_t gsch_id; + uint32_t flow_id; + uint32_t tc_id; + uint32_t tc_type; + uint32_t tc_tx_bw; + uint32_t td_th; + uint32_t c_linkid; + uint32_t c_weight; + uint32_t c_sp; + uint32_t c_rate; + uint32_t mode; + uint32_t e_linkid; + uint32_t e_weight; + uint32_t e_sp; + uint32_t e_rate; +}; + +struct zxdh_dcbnl_ets_node_list_head{ + struct zxdh_dcbnl_ets_se_node *se_next; + struct zxdh_dcbnl_ets_flow_node *flow_next; + uint32_t node_num; +}; + +struct zxdh_dcbnl_ets_se_flow_resource{ + uint32_t numq; + uint32_t level; + uint32_t flags; + uint32_t resource_id; + uint64_t gsch_id; +}; + +struct zxdh_dcbnl_se_tree_config{ + uint32_t level; + uint32_t idx; + uint32_t type; + uint32_t link_level; + uint32_t link_idx; + uint32_t link_weight; + uint32_t link_sp; + uint32_t link_point; +}; + +struct zxdh_dcbnl_tc_flow_config{ + uint32_t link_level; + uint32_t tc_type; + uint32_t tc_tx_bw; + uint32_t c_rate; + uint32_t e_rate; + uint32_t td_th; +}; + +struct zxdh_dcbnl_tc_flow_shape_para{ + uint32_t cir; + uint32_t cbs; + uint32_t db_en; + uint32_t eir; + uint32_t ebs; +}; + +struct zxdh_dcbnl_ieee_ets { + uint8_t willing; + uint8_t ets_cap; + uint8_t cbs; + uint8_t tc_tx_bw[ZXDH_DCBNL_MAX_TRAFFIC_CLASS]; + uint8_t tc_tsa[ZXDH_DCBNL_MAX_TRAFFIC_CLASS]; + uint8_t prio_tc[ZXDH_DCBNL_MAX_PRIORITY]; +}; + +struct zxdh_dcbnl_cee_ets { + uint8_t tc_tx_bw[ZXDH_DCBNL_MAX_TRAFFIC_CLASS]; + uint8_t tc_tsa[ZXDH_DCBNL_MAX_TRAFFIC_CLASS]; + uint8_t prio_tc[ZXDH_DCBNL_MAX_PRIORITY]; +}; + +struct zxdh_dcbnl_para { + uint32_t init_flag; + uint32_t trust; + uint32_t dscp_app_num; + uint8_t dscp2prio[ZXDH_DCBNL_MAX_DSCP]; + uint64_t tc_maxrate[ZXDH_DCBNL_MAX_TRAFFIC_CLASS]; + struct zxdh_dcbnl_ieee_ets ets_cfg; + struct zxdh_dcbnl_cee_ets cee_ets_cfg; + struct zxdh_dcbnl_ets_node_list_head ets_node_list_head[ZXDH_DCBNL_MAX_TREE_LEVEL]; +}; + +uint32_t zxdh_dcbnl_initialize(struct net_device *netdev); +uint32_t zxdh_dcbnl_ets_uninit(struct net_device *netdev); +uint32_t zxdh_dcbnl_set_tm_pport_mcode_gate_open(struct net_device *netdev); +uint32_t zxdh_dcbnl_set_tm_pport_mcode_gate_close(struct net_device *netdev); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_aux/dcbnl/en_dcbnl_api.c b/src/net/drivers/net/ethernet/dinghai/en_aux/dcbnl/en_dcbnl_api.c new file mode 100644 index 0000000..c65759c --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_aux/dcbnl/en_dcbnl_api.c @@ -0,0 +1,1463 @@ +//#include +#include "../../en_aux.h" +#include "en_dcbnl.h" +#include "en_dcbnl_api.h" +#include "en_np/qos/include/dpp_drv_qos.h" +#include "en_np/table/include/dpp_tbl_tm.h" +#include "en_np/fc/include/dpp_drv_fc.h" +#include "en_np/sdk/include/api/dpp_pbu_api.h" + +uint32_t zxdh_dcbnl_get_se_flow_resources(struct zxdh_en_device *en_dev, + struct zxdh_dcbnl_ets_se_flow_resource *tree_resource) +{ + uint64_t gsch_id = 0; + uint32_t err = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + if (tree_resource->level == ZXDH_DCBNL_ETS_TREE_ROOT_LEVEL) + { + err = dpp_sch_base_node_get(&pf_info, en_dev->phy_port, &gsch_id); + } + else + { + err = dpp_cosq_gsch_id_add(&pf_info, en_dev->phy_port, tree_resource->numq, + tree_resource->level, tree_resource->flags, &gsch_id); + } + + if (err) + { + LOG_ERR("dcbnl_init_ets: get se/flow resources failed, level: %d, type: %d, err:%d \n", + tree_resource->level, tree_resource->flags, err); + return err; + } + tree_resource->gsch_id = gsch_id; + tree_resource->resource_id = ZXDH_DCBNL_GET_GSCHID_MSG(gsch_id, ZXDH_DCBNL_GSCHID_ID_MASK, ZXDH_DCBNL_GSCHID_ID_SHIFT); + /* debug */ + LOG_INFO(" gsch_id:0x%llx,resource_id:0x%x level:%d, flags:%d\n", + gsch_id, tree_resource->resource_id,tree_resource->level, tree_resource->flags); + + return 0; +} + +uint32_t zxdh_dcbnl_find_se_link_id(struct zxdh_en_priv *en_priv, + uint32_t level, + uint32_t link_level, + uint32_t link_idx, + uint32_t link_sp, + uint32_t *link_id) +{ + struct zxdh_en_device *en_dev = &en_priv->edev; + struct zxdh_dcbnl_ets_se_node *se_link_node = NULL; + struct zxdh_dcbnl_ets_node_list_head *ets_node_list_head = &en_dev->dcb_para.ets_node_list_head[link_level]; + + *link_id = ZXDH_DCBNL_NULL_ID; + + if (level < ZXDH_DCBNL_ETS_TREE_ROOT_LEVEL) + { + if (ets_node_list_head->se_next == NULL) + { + LOG_ERR("dcbnl: no nodes in the link_level: %d \n", link_level); + return 1; + } + + se_link_node = ets_node_list_head->se_next; + + while ((NULL != se_link_node) && (se_link_node->node_idx != link_idx)) + { + se_link_node = se_link_node->se_next; + } + + if (se_link_node != NULL) + { + *link_id = se_link_node->se_id + link_sp; + } + else + { + LOG_ERR("dcbnl: find se link_id failed, link_level: %d, link_idx: %d\n", link_level, link_idx); + return 1; + } + } + + return 0; +} + +uint32_t zxdh_dcbnl_save_se_resources(struct zxdh_en_priv *en_priv, struct zxdh_dcbnl_se_tree_config *tree_node_cfg) +{ + struct zxdh_en_device *en_dev = &en_priv->edev; + struct zxdh_dcbnl_ets_se_flow_resource tree_resource = {0}; + struct zxdh_dcbnl_ets_se_node *new_se_node = NULL; + struct zxdh_dcbnl_ets_node_list_head *ets_node_list_head = NULL; + uint32_t level = 0; + uint32_t link_level = 0; + uint32_t link_idx = 0; + uint32_t link_id = 0; + uint32_t err = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + level = tree_node_cfg->level; + link_level = tree_node_cfg->link_level; + link_idx = tree_node_cfg->link_idx; + + if ((level == 0) || (level > 4) || (link_level > 5) || (level >= link_level)) + { + LOG_ERR("dcbnl_init_ets: configuration level error, level: %d, link_level: %d\n", level, link_level); + return 1; //todo:考虑使用标准的错误定义 + } + + ets_node_list_head = &en_dev->dcb_para.ets_node_list_head[level]; + + tree_resource.numq = 1; + tree_resource.level = level; + tree_resource.flags = tree_node_cfg->type; + err = zxdh_dcbnl_get_se_flow_resources(en_dev, &tree_resource); + if (err) + { + LOG_ERR("dcbnl_init_ets: get se resources failed, level: %d, idx: %d\n", + tree_resource.level, tree_node_cfg->idx); + return err; + } + + err = zxdh_dcbnl_find_se_link_id(en_priv, level, link_level, link_idx, tree_node_cfg->link_sp, &link_id); + if (err) + { + LOG_ERR("dcbnl_init_ets: find se link_id failed, link_level: %d, link_idx: %d\n", link_level, link_idx); + return err; + } + + new_se_node = kmalloc(sizeof(struct zxdh_dcbnl_ets_se_node), GFP_KERNEL); + if (NULL == new_se_node) + { + LOG_ERR("dcbnl_init_ets: kmalloc se node failed\n"); + return 1; + } + + new_se_node->se_next = NULL; + new_se_node->gsch_id = tree_resource.gsch_id; + new_se_node->node_idx = tree_node_cfg->idx; + new_se_node->node_type = tree_node_cfg->type; + new_se_node->se_id = tree_resource.resource_id; + new_se_node->se_link_id = link_id; + new_se_node->se_link_weight = tree_node_cfg->link_weight; + new_se_node->se_link_sp = tree_node_cfg->link_sp; + new_se_node->link_point = tree_node_cfg->link_point; + + if (level < ZXDH_DCBNL_ETS_TREE_ROOT_LEVEL) + { + err = dpp_crdt_se_link_set(&pf_info, new_se_node->se_id, new_se_node->se_link_id, + new_se_node->se_link_weight, new_se_node->se_link_sp); + if (err) + { + LOG_ERR("dcbnl_init_ets: dpp_crdt_se_link_set failed, level: %d, idx: %d, err:%d\n", + level, tree_node_cfg->idx, err); + kfree(new_se_node); + return err; + } + } + + new_se_node->se_next = ets_node_list_head->se_next; + ets_node_list_head->se_next = new_se_node; + + ets_node_list_head->node_num += 1; + + LOG_INFO(" level:%d, node_idx:%d, node_num:%d \n", + level, new_se_node->node_idx, ets_node_list_head->node_num); + return 0; +} + +uint32_t zxdh_dcbnl_build_ets_scheduling_tree(struct zxdh_en_priv *en_priv) +{ + uint32_t i = 0; + uint32_t err = 0; + + struct zxdh_dcbnl_se_tree_config ets_se_config_table[ZXDH_DCBNL_MAX_SE_NODE_NUM + 1] = + { + /*level idx type link_level link_idx link_weight link_sp link_point*/ + {4, 0, ZXDH_DCBNL_ETS_NODE_WFQ, 5, 0, 1, 0, ZXDH_DCBNL_ETS_NODE_NULL}, + {3, 0, ZXDH_DCBNL_ETS_NODE_FQ2, 4, 0, 1, 0, ZXDH_DCBNL_ETS_NODE_NULL}, + {2, 0, ZXDH_DCBNL_ETS_NODE_FQ4, 3, 0, 1, 0, ZXDH_DCBNL_ETS_NODE_NULL}, + {2, 1, ZXDH_DCBNL_ETS_NODE_FQ4, 3, 0, 1, 1, ZXDH_DCBNL_ETS_NODE_NULL}, + {1, 0, ZXDH_DCBNL_ETS_NODE_FQ, 2, 0, 1, 0, ZXDH_DCBNL_ETS_NODE_VENDOR_C}, + {1, 1, ZXDH_DCBNL_ETS_NODE_FQ8, 2, 0, 1, 1, ZXDH_DCBNL_ETS_NODE_STRICT_C}, + {1, 2, ZXDH_DCBNL_ETS_NODE_WFQ, 2, 0, 1, 2, ZXDH_DCBNL_ETS_NODE_ETS_C}, + {1, 3, ZXDH_DCBNL_ETS_NODE_WFQ, 2, 0, 1, 3, ZXDH_DCBNL_ETS_NODE_ZEROBW_ETS_C}, + {1, 4, ZXDH_DCBNL_ETS_NODE_FQ, 2, 1, 1, 0, ZXDH_DCBNL_ETS_NODE_VENDOR_E}, + {1, 5, ZXDH_DCBNL_ETS_NODE_FQ8, 2, 1, 1, 1, ZXDH_DCBNL_ETS_NODE_STRICT_E}, + {1, 6, ZXDH_DCBNL_ETS_NODE_WFQ, 2, 1, 1, 2, ZXDH_DCBNL_ETS_NODE_ETS_E}, + {1, 7, ZXDH_DCBNL_ETS_NODE_WFQ, 2, 1, 1, 3, ZXDH_DCBNL_ETS_NODE_ZEROBW_ETS_E}, + {0xff} + }; + + for (i = 0; i < ZXDH_DCBNL_MAX_SE_NODE_NUM && ets_se_config_table[i].level != 0xff; i++) + { + err = zxdh_dcbnl_save_se_resources(en_priv, &ets_se_config_table[i]); + if (err) + { + LOG_ERR("dcbnl_init_ets: build_tc_scheduling_tree failed, entry: %d\n", i); + return err; + } + } + + return 0; +} + +void zxdh_dcbnl_tc_map_to_link_point(uint32_t tc_type, uint32_t *c_type, uint32_t *e_type) +{ + switch (tc_type) + { + case ZXDH_DCBNL_VENDOR_TC: + *c_type = ZXDH_DCBNL_ETS_NODE_VENDOR_C; + *e_type = ZXDH_DCBNL_ETS_NODE_VENDOR_E; + break; + + case ZXDH_DCBNL_STRICT_TC: + *c_type = ZXDH_DCBNL_ETS_NODE_STRICT_C; + *e_type = ZXDH_DCBNL_ETS_NODE_STRICT_E; + break; + + case ZXDH_DCBNL_ETS_TC: + *c_type = ZXDH_DCBNL_ETS_NODE_ETS_C; + *e_type = ZXDH_DCBNL_ETS_NODE_ETS_E; + break; + + case ZXDH_DCBNL_ZEROBW_ETS_TC: + *c_type = ZXDH_DCBNL_ETS_NODE_ZEROBW_ETS_C; + *e_type = ZXDH_DCBNL_ETS_NODE_ZEROBW_ETS_E; + break; + default: + break; + } +} + +void zxdh_dcbnl_get_tc_weight_sp(uint32_t tc_type, uint32_t tc_tx_bw, uint32_t tc_id, + uint32_t *c_weight, uint32_t *e_weight, + uint32_t *c_sp, uint32_t *e_sp) +{ + if (tc_tx_bw == ZXDH_DCBNL_MAX_BW_ALLOC) + { + *c_weight = 1; + *e_weight = 1; + } + else + { + *c_weight = ZXDH_DCBNL_MAX_WEIGHT * tc_tx_bw / ZXDH_DCBNL_MAX_BW_ALLOC; + *e_weight = ZXDH_DCBNL_MAX_WEIGHT * tc_tx_bw / ZXDH_DCBNL_MAX_BW_ALLOC; + } + + if ((tc_type == ZXDH_DCBNL_STRICT_TC) && (tc_id < ZXDH_DCBNL_MAX_TRAFFIC_CLASS)) + { + *c_sp = ZXDH_DCBNL_MAX_TRAFFIC_CLASS - 1 - tc_id; + *e_sp = ZXDH_DCBNL_MAX_TRAFFIC_CLASS - 1 - tc_id; + } + else + { + *c_sp = 0; + *e_sp = 0; + } +} + +uint32_t zxdh_dcbnl_find_flow_link_se_id(struct zxdh_en_priv *en_priv, + uint32_t tc_type, uint32_t link_level, + uint32_t *c_linkid, uint32_t *e_linkid, + uint32_t c_sp, uint32_t e_sp) +{ + struct zxdh_en_device *en_dev = &en_priv->edev; + struct zxdh_dcbnl_ets_se_node *se_node = en_dev->dcb_para.ets_node_list_head[link_level].se_next; + uint32_t c_type = 0; + uint32_t e_type = 0; + + if (NULL == se_node) + { + LOG_ERR("dcbnl: find_flow_link_se_id no nodes \n"); + return 1; + } + + zxdh_dcbnl_tc_map_to_link_point(tc_type, &c_type, &e_type); + + *c_linkid = ZXDH_DCBNL_NULL_ID; + *e_linkid = ZXDH_DCBNL_NULL_ID; + + while ((NULL != se_node) && ((ZXDH_DCBNL_NULL_ID == *c_linkid) || (ZXDH_DCBNL_NULL_ID == *e_linkid))) + { + if (se_node->link_point == c_type) + { + *c_linkid = se_node->se_id + c_sp; + } + else if (se_node->link_point == e_type) + { + *e_linkid = se_node->se_id + e_sp; + } + + se_node = se_node->se_next; + } + + if ((ZXDH_DCBNL_NULL_ID == *c_linkid) || (ZXDH_DCBNL_NULL_ID == *e_linkid)) + { + LOG_ERR("dcbnl: find_flow_link_se_id failed, c_linkid: 0x%x, e_linkid: 0x%x\n", *c_linkid, *e_linkid); + return 1; + } + return 0; +} + +uint32_t zxdh_dcbnl_get_ieee_tsa(uint32_t tc_type) +{ + uint32_t tsa = 0; + switch (tc_type) + { + case ZXDH_DCBNL_ETS_TC: + case ZXDH_DCBNL_ZEROBW_ETS_TC: + tsa = IEEE_8021QAZ_TSA_ETS; + break; + case ZXDH_DCBNL_STRICT_TC: + tsa = IEEE_8021QAZ_TSA_STRICT; + break; + case ZXDH_DCBNL_VENDOR_TC: + tsa = IEEE_8021QAZ_TSA_VENDOR; + break; + default: + tsa = IEEE_8021QAZ_TSA_STRICT; + LOG_ERR("dcbnl:tsa error, change to strict \n"); + break; + } + return tsa; +} + +uint32_t zxdh_dcbnl_save_flow_resources(struct zxdh_en_priv *en_priv, + struct zxdh_dcbnl_tc_flow_config *tc_flow_config, + struct zxdh_dcbnl_ets_se_flow_resource *tree_resource, + uint32_t tc_id) +{ + struct zxdh_en_device *en_dev = &en_priv->edev; + struct zxdh_dcbnl_ets_flow_node *new_flow_node = NULL; + struct zxdh_dcbnl_ets_node_list_head *ets_node_list_head = NULL; + struct zxdh_dcbnl_tc_flow_shape_para p_para = {0}; + uint32_t c_linkid = 0; + uint32_t e_linkid = 0; + uint32_t c_weight = 0; + uint32_t e_weight = 0; + uint32_t c_sp = 0; + uint32_t e_sp = 0; + uint32_t err = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + if (tc_flow_config->link_level != 1) + { + LOG_ERR("dcbnl_init_ets: zxdh_dcbnl_save_flow_resources link_level err\n"); + return 1; + } + + ets_node_list_head = &en_dev->dcb_para.ets_node_list_head[ZXDH_DCBNL_ETS_TREE_FLOW_LEVEL]; + + if (tc_id == 0) + { + tree_resource->numq = ZXDH_DCBNL_MAX_TRAFFIC_CLASS; + tree_resource->level = ZXDH_DCBNL_ETS_TREE_FLOW_LEVEL; + tree_resource->flags = ZXDH_DCBNL_ETS_NODE_FLOW; + err = zxdh_dcbnl_get_se_flow_resources(en_dev, tree_resource); + if (err) + { + LOG_ERR("dcbnl_init_ets: get flow resources err\n"); + return err; + } + + err = dpp_tm_flowid_pport_table_set(&pf_info, en_dev->phy_port, tree_resource->resource_id); + if (err) + { + LOG_ERR("dcbnl_init_ets: flowid_pport_table_set failed, port: %d, flowid:%d, err:%d\n", + en_dev->phy_port, tree_resource->resource_id, err); + return err; + } + } + + zxdh_dcbnl_get_tc_weight_sp(tc_flow_config->tc_type, tc_flow_config->tc_tx_bw, tc_id, &c_weight, &e_weight, &c_sp, &e_sp); + + err = zxdh_dcbnl_find_flow_link_se_id(en_priv, tc_flow_config->tc_type, tc_flow_config->link_level, &c_linkid, &e_linkid, c_sp, e_sp); + if (err) + { + LOG_ERR("dcbnl_init_ets init ets: find_flow_link_se_id failed, tc_id: %d, tc_type: %d\n", + tc_id, tc_flow_config->tc_type); + return err; + } + + new_flow_node = kmalloc(sizeof(struct zxdh_dcbnl_ets_flow_node), GFP_KERNEL); + if (new_flow_node == NULL) + { + LOG_ERR("dcbnl_init_ets: kmalloc new flow node failed\n"); + return 1; + } + + new_flow_node->flow_next = NULL; + new_flow_node->gsch_id = tree_resource->gsch_id + tc_id; + new_flow_node->flow_id = tree_resource->resource_id + tc_id; + new_flow_node->tc_id = tc_id; + new_flow_node->tc_type = tc_flow_config->tc_type; + new_flow_node->tc_tx_bw = tc_flow_config->tc_tx_bw; + new_flow_node->td_th = tc_flow_config->td_th; + new_flow_node->c_linkid = c_linkid; + new_flow_node->c_weight = c_weight; + new_flow_node->c_sp = c_sp; + new_flow_node->c_rate = tc_flow_config->c_rate; + new_flow_node->mode = 1; + new_flow_node->e_linkid = e_linkid; + new_flow_node->e_weight = e_weight; + new_flow_node->e_sp = e_sp; + new_flow_node->e_rate = tc_flow_config->e_rate; + + err = dpp_flow_map_port_set(&pf_info, new_flow_node->flow_id, en_dev->phy_port); + if (err) + { + LOG_ERR("dcbnl_init_ets: dpp_flow_map_port_set failed, flow_id: %d, phy_port: %d, err:%d\n", + new_flow_node->flow_id, en_dev->phy_port, err); + kfree(new_flow_node); + return err; + } + + err = dpp_crdt_flow_link_set(&pf_info, new_flow_node->flow_id, c_linkid, c_weight, c_sp, + new_flow_node->mode, e_linkid, e_weight, e_sp); + if (err) + { + LOG_ERR("dcbnl_init_ets: dpp_crdt_flow_link_set failed, flow_id: %d, c_linkid: %d, e_linkid: %d, err:%d\n", + new_flow_node->flow_id, c_linkid, e_linkid, err); + kfree(new_flow_node); + return err; + } + + err = dpp_flow_td_th_set(&pf_info, new_flow_node->flow_id, new_flow_node->td_th); + if (err) + { + LOG_ERR("dcbnl_init_ets: dpp_flow_td_th_set failed,vport:%d flow_id: %d, td_th: %d, err:%d\n", + en_dev->vport, new_flow_node->flow_id, new_flow_node->td_th, err); + //kfree(new_flow_node); //The default is 150 + //return err; + } + + p_para.cir = new_flow_node->c_rate; + p_para.cbs = ZXDH_DCBNL_FLOW_RATE_CBS; + p_para.db_en = 1; + p_para.eir = new_flow_node->e_rate; + p_para.ebs = ZXDH_DCBNL_FLOW_RATE_EBS; + + err = dpp_flow_shape_set(&pf_info, new_flow_node->flow_id, p_para.cir, p_para.cbs, p_para.db_en, p_para.eir, p_para.ebs); + if (err) + { + LOG_ERR("dcbnl_init_ets: dpp_flow_shape_set failed, vport: %d, flow_id: %d, tc_id: %d, e_rate: %d, err:%d\n", + en_dev->vport, new_flow_node->flow_id, new_flow_node->tc_id, new_flow_node->e_rate, err); + } + LOG_INFO("dcbnl_init_ets dpp_flow_shape_set end vport%d,phy_port:%d, flow_id:%d,tc_id:%d, cir:%d, cbs:%d, db_en:%d, eir:%d,ebs:%d,err:%d \n", + en_dev->vport,en_dev->phy_port, new_flow_node->flow_id,new_flow_node->tc_id, p_para.cir, p_para.cbs, p_para.db_en, p_para.eir, p_para.ebs,err); + + new_flow_node->flow_next = ets_node_list_head->flow_next; + ets_node_list_head->flow_next = new_flow_node; + ets_node_list_head->node_num += 1; + + en_dev->dcb_para.ets_cfg.tc_tsa[tc_id] = zxdh_dcbnl_get_ieee_tsa(new_flow_node->tc_type); + en_dev->dcb_para.ets_cfg.tc_tx_bw[tc_id] = tc_flow_config->tc_tx_bw; + en_dev->dcb_para.tc_maxrate[tc_id] = new_flow_node->e_rate; + + LOG_INFO(" level:%d, tc_id:%d, flow_id:%d, node_num:%d \n", + tree_resource->level, new_flow_node->tc_id, new_flow_node->flow_id, ets_node_list_head->node_num); + + return 0; +} + +uint32_t zxdh_dcbnl_scheduling_tree_link_tc(struct zxdh_en_priv *en_priv) +{ + struct zxdh_dcbnl_ets_se_flow_resource tree_resource; + uint32_t i = 0; + uint32_t err = 0; + + struct zxdh_dcbnl_tc_flow_config ets_tc_config_table[ZXDH_DCBNL_MAX_TRAFFIC_CLASS+1] = + { + /*link_level tc_type tc_tx_bw c_rate e_rate td_th */ + {1, ZXDH_DCBNL_STRICT_TC, 100, ZXDH_DCBNL_FLOW_RATE_CIR, ZXDH_DCBNL_INITRATE_KBITPS, ZXDH_DCBNL_FLOW_TDTH}, + {1, ZXDH_DCBNL_STRICT_TC, 100, ZXDH_DCBNL_FLOW_RATE_CIR, ZXDH_DCBNL_INITRATE_KBITPS, ZXDH_DCBNL_FLOW_TDTH}, + {1, ZXDH_DCBNL_STRICT_TC, 100, ZXDH_DCBNL_FLOW_RATE_CIR, ZXDH_DCBNL_INITRATE_KBITPS, ZXDH_DCBNL_FLOW_TDTH}, + {1, ZXDH_DCBNL_STRICT_TC, 100, ZXDH_DCBNL_FLOW_RATE_CIR, ZXDH_DCBNL_INITRATE_KBITPS, ZXDH_DCBNL_FLOW_TDTH}, + {1, ZXDH_DCBNL_STRICT_TC, 100, ZXDH_DCBNL_FLOW_RATE_CIR, ZXDH_DCBNL_INITRATE_KBITPS, ZXDH_DCBNL_FLOW_TDTH}, + {1, ZXDH_DCBNL_STRICT_TC, 100, ZXDH_DCBNL_FLOW_RATE_CIR, ZXDH_DCBNL_INITRATE_KBITPS, ZXDH_DCBNL_FLOW_TDTH}, + {1, ZXDH_DCBNL_STRICT_TC, 100, ZXDH_DCBNL_FLOW_RATE_CIR, ZXDH_DCBNL_INITRATE_KBITPS, ZXDH_DCBNL_FLOW_TDTH}, + {1, ZXDH_DCBNL_STRICT_TC, 100, ZXDH_DCBNL_FLOW_RATE_CIR, ZXDH_DCBNL_INITRATE_KBITPS, ZXDH_DCBNL_FLOW_TDTH}, + {0xff} + }; + + for (i = 0; i < ZXDH_DCBNL_MAX_TRAFFIC_CLASS && ets_tc_config_table[i].link_level != 0xff; i++) + { + + err = zxdh_dcbnl_save_flow_resources(en_priv, &ets_tc_config_table[i], &tree_resource, i); + if (err) + { + LOG_ERR("dcbnl_init_ets: save_flow_resources failed, entry: %d\n", i); + return err; + } + + } + + return 0; +} + +uint32_t zxdh_dcbnl_set_ets_trust(struct zxdh_en_priv *en_priv, uint32_t trust) +{ + + struct zxdh_en_device *en_dev = &en_priv->edev; + uint32_t err = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + err = dpp_tm_pport_trust_mode_table_set(&pf_info, en_dev->phy_port, trust); + if (err) + { + LOG_ERR("dcbnl_set_ets: set_ets_trust failed, vport: %d, trust: %d, err:%d\n", en_dev->vport, trust, err); + return err; + } + en_dev->dcb_para.trust = trust; + LOG_INFO(" trust:%d \n", trust); + return 0; +} + +uint32_t zxdh_dcbnl_init_trust_and_table(struct zxdh_en_priv *en_priv) +{ + + struct zxdh_en_device *en_dev = &en_priv->edev; + uint32_t i = 0; + uint32_t err = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + for (i = 0; i < ZXDH_DCBNL_MAX_PRIORITY; i++) + { + err = dpp_tm_pport_up_map_table_set(&pf_info, en_dev->phy_port, i, i); //初始时,配置一一对应 + if (err) + { + LOG_ERR("dcbnl_init_ets: dpp_tm_pport_up_map_table_set failed, vport: %d, phy_port: %d, err:%d\n", + en_dev->vport, en_dev->phy_port, err); + return err; + } + en_dev->dcb_para.ets_cfg.prio_tc[i] = i; + } + LOG_INFO(" vport:%d,phy_port:%d prio2tc ok \n", en_dev->vport, en_dev->phy_port); + + for (i = 0; i < ZXDH_DCBNL_MAX_DSCP; i++) + { + err = dpp_tm_pport_dscp_map_table_set(&pf_info, en_dev->phy_port, i, i>>3); + if (err) + { + LOG_ERR("dcbnl_init_ets: dscp_map_table_set failed, vport: %d, phy_port: %d, err:%d\n", + en_dev->vport, en_dev->phy_port, err); + return err; + } + + en_dev->dcb_para.dscp2prio[i] = i>>3; + } + LOG_INFO("vport:%d,phy_port:%d,dscp2prio ok \n", en_dev->vport, en_dev->phy_port); + + err = zxdh_dcbnl_set_ets_trust(en_priv, ZXDH_DCBNL_ETS_TRUST_PCP); + if (err) + { + LOG_INFO("set_ets_trust failed \n"); + return err; + } + en_dev->dcb_para.trust = ZXDH_DCBNL_ETS_TRUST_PCP; + LOG_INFO(" vport:%d,phy_port:%d,trust:%d \n", en_dev->vport, en_dev->phy_port, en_dev->dcb_para.trust); + return 0; +} + +uint32_t zxdh_dcbnl_init_ets_list(struct zxdh_en_priv *en_priv) +{ + struct zxdh_en_device *en_dev = &en_priv->edev; + uint32_t level = 0; + + for (level = 0; level < ZXDH_DCBNL_MAX_TREE_LEVEL; level++) + { + en_dev->dcb_para.ets_node_list_head[level].se_next = NULL; + en_dev->dcb_para.ets_node_list_head[level].flow_next = NULL; + en_dev->dcb_para.ets_node_list_head[level].node_num = 0; + } + return 0; +} + +/* Normal release se*/ +uint32_t zxdh_dcbnl_free_se_resources(struct zxdh_en_priv *en_priv) +{ + struct zxdh_en_device *en_dev = &en_priv->edev; + struct zxdh_dcbnl_ets_se_node *se_node = NULL; + struct zxdh_dcbnl_ets_node_list_head *ets_node_list_head = NULL; + uint32_t err = 0; + uint32_t level = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + LOG_INFO(" vport:%d, phy_port:%d \n",en_dev->vport, en_dev->phy_port); + for (level = 1; level <= ZXDH_DCBNL_ETS_TREE_ROOT_LEVEL; level++) + { + ets_node_list_head = &en_dev->dcb_para.ets_node_list_head[level]; + while (NULL != ets_node_list_head->se_next) + { + se_node = ets_node_list_head->se_next; + ets_node_list_head->se_next = se_node->se_next; + if (level < ZXDH_DCBNL_ETS_TREE_ROOT_LEVEL) + { + err = dpp_crdt_del_se_link_set(&pf_info, se_node->se_id, se_node->se_id); + if (err) + { + LOG_ERR("dcbnl_free_ets: dpp_crdt_del_se_link_set failed, se_id: %d, err:%d \n", se_node->se_id, err); + } + LOG_INFO(" dpp_crdt_del_se_link_set"); + + err = dpp_cosq_gsch_id_delete(&pf_info, en_dev->phy_port, se_node->gsch_id); + if (err) + { + LOG_ERR("dcbnl_free_ets: dpp_cosq_gsch_id_delete failed, se_id: %lld, err:%d \n", se_node->gsch_id, err); + } + LOG_INFO("del se id dpp_cosq_gsch_id_delete"); + } + LOG_INFO(" free level:%d se_id:%x \n", level, se_node->se_id); + kfree(se_node); + ets_node_list_head->node_num -= 1; + LOG_INFO("current node_num:%d \n", ets_node_list_head->node_num); + } + } + + return 0; +} +/* Normal release flow*/ +uint32_t zxdh_dcbnl_free_flow_resources(struct zxdh_en_priv *en_priv) +{ + struct zxdh_en_device *en_dev = &en_priv->edev; + struct zxdh_dcbnl_ets_flow_node *flow_node = NULL; + struct zxdh_dcbnl_ets_node_list_head *ets_node_list_head = &en_dev->dcb_para.ets_node_list_head[ZXDH_DCBNL_ETS_TREE_FLOW_LEVEL]; + uint32_t err = 0; + bool have_flow = false; + DPP_PF_INFO_T pf_info = {0}; + struct zxdh_dcbnl_tc_flow_shape_para p_para = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + LOG_INFO(" vport:%d, phy_port:%d \n",en_dev->vport, en_dev->phy_port); + while (NULL != ets_node_list_head->flow_next) + { + have_flow = true; + flow_node = ets_node_list_head->flow_next; + ets_node_list_head->flow_next = flow_node->flow_next; + + p_para.cir = 0; + p_para.cbs = ZXDH_DCBNL_FLOW_RATE_CBS_REFRESH; + p_para.db_en = 0; + p_para.eir = 0; + p_para.ebs = ZXDH_DCBNL_FLOW_RATE_EBS_REFRESH; + + err = dpp_flow_shape_set(&pf_info, flow_node->flow_id, p_para.cir, p_para.cbs, p_para.db_en, p_para.eir, p_para.ebs); + if (err) + { + LOG_ERR("dcbnl_set_ets: dpp_flow_shape_set failed, vport: %d, flow_id: %d, tc_id: %d, eir: %d, err:%d\n", + en_dev->vport, flow_node->flow_id, flow_node->tc_id, p_para.eir , err); + return err; + } + LOG_INFO("clean maxrate"); + err = dpp_flow_td_th_set(&pf_info, flow_node->flow_id, 0); + if (err) + { + LOG_ERR("dcbnl_free_ets: dpp_flow_td_th_set failed,vport:%d flow_id: %d, td_th: 0, err:%d\n", + en_dev->vport, flow_node->flow_id, err); + } + LOG_INFO(" clean TD "); + + err = dpp_crdt_del_flow_link_set(&pf_info, flow_node->flow_id, flow_node->flow_id); + if (err) + { + LOG_ERR("dcbnl_free_ets: dpp_crdt_del_flow_link_set failed, flow_id: %d, err:%d \n", flow_node->flow_id, err); + } + LOG_INFO(" dpp_crdt_del_flow_link_set"); + + err = dpp_cosq_gsch_id_delete(&pf_info, en_dev->phy_port, flow_node->gsch_id); + if (err) + { + LOG_ERR("dcbnl_free_ets: dpp_cosq_gsch_id_delete failed, gsch_id: %lld ,err:%d\n", flow_node->gsch_id, err); + } + LOG_INFO("del id dpp_cosq_gsch_id_delete"); + + LOG_INFO(" free level:0, flow_id:%d, tc:%d\n", flow_node->flow_id, flow_node->tc_id); + + kfree(flow_node); + ets_node_list_head->node_num -= 1; + LOG_INFO("current node_num:%d \n", ets_node_list_head->node_num); + } + + if (have_flow) + { + err = dpp_tm_flowid_pport_table_del(&pf_info, en_dev->phy_port); + if (err) + { + LOG_ERR("dcbnl_free_ets: dpp_tm_flowid_pport_table_del failed,vport:%d, phy_port: %d \n", + en_dev->vport, en_dev->phy_port); + } + LOG_INFO("del table dpp_tm_flowid_pport_table_del"); + } + + return 0; +} + +/* host no reset,risc reset? */ +uint32_t zxdh_dcbnl_check_and_free_node_memory(struct zxdh_en_priv *en_priv) +{ + struct zxdh_en_device *en_dev = &en_priv->edev; + struct zxdh_dcbnl_ets_flow_node *flow_node = NULL; + struct zxdh_dcbnl_ets_se_node *se_node = NULL; + struct zxdh_dcbnl_ets_node_list_head *ets_node_list_head = NULL; + uint32_t level = 0; + + ets_node_list_head = &en_dev->dcb_para.ets_node_list_head[ZXDH_DCBNL_ETS_TREE_FLOW_LEVEL]; + while (NULL != ets_node_list_head->flow_next) + { + flow_node = ets_node_list_head->flow_next; + ets_node_list_head->flow_next = flow_node->flow_next; + kfree(flow_node); + ets_node_list_head->node_num -= 1; + } + + for (level = 1; level < ZXDH_DCBNL_ETS_TREE_ROOT_LEVEL + 1; level++) + { + ets_node_list_head = &en_dev->dcb_para.ets_node_list_head[level]; + while (NULL != ets_node_list_head->se_next) + { + se_node = ets_node_list_head->se_next; + ets_node_list_head->se_next = se_node->se_next; + kfree(se_node); + ets_node_list_head->node_num -= 1; + } + } + + return 0; +} + +uint32_t zxdh_dcbnl_set_tc_scheduling(struct zxdh_en_priv *en_priv, uint8_t *tc_type, uint8_t *tc_tx_bw) +{ + struct zxdh_en_device *en_dev = &en_priv->edev; + struct zxdh_dcbnl_ets_flow_node *flow_node = en_dev->dcb_para.ets_node_list_head[ZXDH_DCBNL_ETS_TREE_FLOW_LEVEL].flow_next; + uint32_t tc_id = 0; + uint32_t c_linkid = 0; + uint32_t e_linkid = 0; + uint32_t c_weight = 0; + uint32_t e_weight = 0; + uint32_t c_sp = 0; + uint32_t e_sp = 0; + uint32_t i = 0; + uint32_t err = 0; + DPP_PF_INFO_T pf_info = {0}; + struct zxdh_dcbnl_tc_flow_shape_para p_para = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + if (NULL == flow_node) + { + LOG_ERR("dcbnl_set_ets: set_tc_scheduling no flow in the tree\n"); + return 1; + } + + for (i = 0; i < ZXDH_DCBNL_MAX_TRAFFIC_CLASS && flow_node != NULL; i++) + { + tc_id = flow_node->tc_id; + if ((flow_node->tc_type == tc_type[tc_id]) && (flow_node->tc_tx_bw == tc_tx_bw[tc_id])) + { + LOG_INFO("Same configuration,tc_id:%d, tc_type:%d, tc_tx_bw:%d\n",tc_id, tc_type[tc_id], tc_tx_bw[tc_id]); + flow_node = flow_node->flow_next; + continue; + } + + zxdh_dcbnl_get_tc_weight_sp(tc_type[tc_id], tc_tx_bw[tc_id], tc_id, &c_weight, &e_weight, &c_sp, &e_sp); + + err = zxdh_dcbnl_find_flow_link_se_id(en_priv, tc_type[tc_id], 1, &c_linkid, &e_linkid, c_sp, e_sp); + if (err) + { + LOG_ERR("dcbnl_set_ets: find_flow_link_se_id failed, tc_id: %d, tc_type: %d\n", tc_id, tc_type[tc_id]); + return err; + } + + /* 1、清限速,刷新桶深,断流*/ + p_para.cir = 0; + p_para.cbs = ZXDH_DCBNL_FLOW_RATE_CBS_REFRESH; + p_para.db_en = 0; + p_para.eir = 0; + p_para.ebs = ZXDH_DCBNL_FLOW_RATE_EBS_REFRESH; + + LOG_INFO("clean maxrate vport%d,phy_port:%d, flow_id:%d,tc_id:%d, cir:%d, cbs:%d, db_en:%d, eir:%d,ebs:%d \n", + en_dev->vport,en_dev->phy_port, flow_node->flow_id, tc_id, p_para.cir, p_para.cbs, p_para.db_en, p_para.eir, p_para.ebs); + + err = dpp_flow_shape_set(&pf_info, flow_node->flow_id, p_para.cir, p_para.cbs, p_para.db_en, p_para.eir, p_para.ebs); + if (err) + { + LOG_ERR("dcbnl_set_ets: dpp_flow_shape_set failed, vport: %d, flow_id: %d, tc_id: %d, eir: %d, err:%d\n", + en_dev->vport, flow_node->flow_id, tc_id, p_para.eir , err); + return err; + } + + /* 2、清TD,断流*/ + err = dpp_flow_td_th_set(&pf_info, flow_node->flow_id, 0); + if (err) + { + LOG_ERR("dcbnl_set_ets: dpp_flow_td_th_set failed,vport:%d flow_id: %d, td_th: 0, err:%d\n", + en_dev->vport, flow_node->flow_id, err); + } + + /* 3、删除挂接*/ + err = dpp_crdt_del_flow_link_set(&pf_info, flow_node->flow_id, flow_node->flow_id); + if (err) + { + LOG_ERR("dcbnl_set_ets: dpp_crdt_del_flow_link_set failed, vport: %d, flow_id: %d, err:%d\n", + en_dev->vport, flow_node->flow_id, err); + return err; + } + + /* 4、重新挂接*/ + err = dpp_crdt_flow_link_set(&pf_info, flow_node->flow_id, c_linkid, c_weight, c_sp, 1, + e_linkid, e_weight, e_sp); + if (err) + { + LOG_ERR("dcbnl_set_ets: dpp_crdt_flow_link_set failed, flow_id: %d, flow_id: %d, flow_id: %d, err:%d\n", + flow_node->flow_id, c_linkid, e_linkid, err); + return err; + } + + /* 5、恢复TD*/ + err = dpp_flow_td_th_set(&pf_info, flow_node->flow_id, flow_node->td_th); + if (err) + { + LOG_ERR("dcbnl_set_ets: dpp_flow_td_th_set failed,vport:%d flow_id: %d, td_th:%d, err:%d\n", + en_dev->vport, flow_node->flow_id, flow_node->td_th, err); + } + + /* 6、恢复限速*/ + p_para.cir = ZXDH_DCBNL_FLOW_RATE_CIR; + p_para.cbs = ZXDH_DCBNL_FLOW_RATE_CBS; + p_para.db_en = 1; + p_para.eir = flow_node->e_rate; + p_para.ebs = ZXDH_DCBNL_FLOW_RATE_EBS; + + LOG_INFO("dpp_flow_shape_set begin vport%d,phy_port:%d, flow_id:%d,tc_id:%d, cir:%d, cbs:%d, db_en:%d, eir:%d,ebs:%d \n", + en_dev->vport,en_dev->phy_port, flow_node->flow_id, tc_id, p_para.cir, p_para.cbs, p_para.db_en, p_para.eir, p_para.ebs); + + err = dpp_flow_shape_set(&pf_info, flow_node->flow_id, p_para.cir, p_para.cbs, p_para.db_en, p_para.eir, p_para.ebs); + if (err) + { + LOG_ERR("dcbnl_set_ets: dpp_flow_shape_set failed, vport: %d, flow_id: %d, tc_id: %d, eir: %d, err:%d\n", + en_dev->vport, flow_node->flow_id, tc_id, p_para.eir , err); + return err; + } + LOG_INFO(" dpp_flow_shape_set end"); + flow_node->tc_type = tc_type[tc_id]; + flow_node->tc_tx_bw = tc_tx_bw[tc_id]; + + flow_node->c_linkid = c_linkid; + flow_node->c_weight = c_weight; + flow_node->c_sp = c_sp; + + flow_node->e_linkid = e_linkid; + flow_node->e_weight = e_weight; + flow_node->e_sp = e_sp; + + LOG_INFO(" tc_id:%d, tc_type:%d, c_linkid:%x, e_weight:%d, e_sp:%d ,e_linkid:%x, e_weight:%d, e_sp:%d \n", + tc_id, flow_node->tc_type, flow_node->c_linkid,flow_node->c_weight, flow_node->c_sp, flow_node->e_linkid, flow_node->e_weight, flow_node->e_sp); + + flow_node = flow_node->flow_next; + } + + return 0; +} + +uint32_t zxdh_dcbnl_set_ets_up_tc_map(struct zxdh_en_priv *en_priv, uint8_t *prio_tc) +{ + struct zxdh_en_device *en_dev = &en_priv->edev; + uint32_t i = 0; + uint32_t err = 0; + DPP_PF_INFO_T pf_info = {0}; + + LOG_INFO(" begin \n"); + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + for (i = 0; i < ZXDH_DCBNL_MAX_PRIORITY; i++) + { + err = dpp_tm_pport_up_map_table_set(&pf_info, en_dev->phy_port, i, prio_tc[i]); + if (err) + { + LOG_ERR("dcbnl_set_ets: failed, vport: %d, prio: %d, tc: %d, err:%d\n", + en_dev->vport, i, prio_tc[i], err); + return err; + } + LOG_INFO(" vport:%d, phy_port:%d, prio:%d, tc:%d \n",en_dev->vport, en_dev->phy_port, i, prio_tc[i]); + } + return 0; +} + +uint32_t zxdh_dcbnl_set_tc_maxrate(struct zxdh_en_priv *en_priv, uint32_t *maxrate) +{ + struct zxdh_en_device *en_dev = &en_priv->edev; + struct zxdh_dcbnl_ets_flow_node *flow_node = en_dev->dcb_para.ets_node_list_head[ZXDH_DCBNL_ETS_TREE_FLOW_LEVEL].flow_next; + struct zxdh_dcbnl_tc_flow_shape_para p_para = {0}; + uint32_t tc_id = 0; + uint32_t i = 0; + uint32_t err = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + if (NULL == flow_node) + { + LOG_ERR("dcbnl_set_ets: set_tc_maxrate no flow in the tree\n"); + return 1; + } + + for (i = 0; i < ZXDH_DCBNL_MAX_TRAFFIC_CLASS && flow_node != NULL; i++) + { + tc_id = flow_node->tc_id; + if (flow_node->e_rate == maxrate[tc_id]) + { + LOG_INFO("Same configuration, tc_id:%d, maxrate:%d\n", tc_id, maxrate[tc_id]); + flow_node = flow_node->flow_next; + continue; + } + /* clean CBS、EBS*/ + p_para.cir = 0; + p_para.cbs = ZXDH_DCBNL_FLOW_RATE_CBS_REFRESH; + p_para.db_en = 0; + p_para.eir = 0; + p_para.ebs = ZXDH_DCBNL_FLOW_RATE_EBS_REFRESH; + LOG_INFO(" refresh maxrate "); + err = dpp_flow_shape_set(&pf_info, flow_node->flow_id, p_para.cir, p_para.cbs, p_para.db_en, p_para.eir, p_para.ebs); + if (err) + { + LOG_ERR("dcbnl_set_ets: dpp_flow_shape_set failed, vport: %d, flow_id: %d, tc_id: %d, eir: %d, err:%d\n", + en_dev->vport, flow_node->flow_id, tc_id, p_para.eir, err); + return err; + } + /* 2、set maxrate*/ + p_para.cir = ZXDH_DCBNL_FLOW_RATE_CIR; + p_para.cbs = ZXDH_DCBNL_FLOW_RATE_CBS; + p_para.db_en = 1; + p_para.eir = maxrate[tc_id]; + p_para.ebs = ZXDH_DCBNL_FLOW_RATE_EBS; + + LOG_INFO(" vport%d,phy_port:%d, flow_id:%d,tc_id:%d, cir:%d, cbs:%d, db_en:%d, eir:%d,ebs:%d \n", + en_dev->vport,en_dev->phy_port, flow_node->flow_id, tc_id, p_para.cir, p_para.cbs, p_para.db_en, p_para.eir, p_para.ebs); + + err = dpp_flow_shape_set(&pf_info, flow_node->flow_id, p_para.cir, p_para.cbs, p_para.db_en, p_para.eir, p_para.ebs); + if (err) + { + LOG_ERR("dcbnl_set_ets: dpp_flow_shape_set failed, vport: %d, flow_id: %d, tc_id: %d, eir: %d, err:%d\n", + en_dev->vport, flow_node->flow_id, tc_id, p_para.eir, err); + return err; + } + + flow_node->e_rate = maxrate[tc_id]; + en_dev->dcb_para.tc_maxrate[tc_id] = maxrate[tc_id]; + + flow_node = flow_node->flow_next; + + } + + return 0; +} + +uint32_t zxdh_dcbnl_set_dscp2prio(struct zxdh_en_priv *en_priv, uint16_t dscp, uint8_t prio) +{ + struct zxdh_en_device *en_dev = &en_priv->edev; + uint32_t err = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + err = dpp_tm_pport_dscp_map_table_set(&pf_info, en_dev->phy_port, dscp, prio); + if (err) + { + LOG_ERR("dcbnl_set_ets: set_dscp2prio failed, vport: %d, dscp: %d, prio: %d, err:%d\n", en_dev->vport, dscp, prio, err); + return err; + } + en_dev->dcb_para.dscp2prio[dscp] = prio; + LOG_INFO(" vport:%d, ephy_port:%d,dscp:%d, up:%d \n",en_dev->vport, en_dev->phy_port,dscp, prio); + + return 0; +} + +uint32_t zxdh_dcbnl_set_flow_td_th(struct zxdh_en_priv *en_priv, uint32_t* tc_td_th) +{ + struct zxdh_en_device *en_dev = &en_priv->edev; + struct zxdh_dcbnl_ets_flow_node *flow_node = en_dev->dcb_para.ets_node_list_head[ZXDH_DCBNL_ETS_TREE_FLOW_LEVEL].flow_next; + uint32_t err = 0; + uint32_t i = 0; + uint32_t tc_id = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + if (flow_node == NULL) + { + LOG_ERR("dcbnl_set_ets: set_flow_td_th no flow in the tree\n"); + return 1; + } + + if (tc_td_th == NULL) + { + LOG_ERR("dcbnl_set_ets: tc_td_th is null \n"); + return 1; + } + + for (i = 0; i < ZXDH_DCBNL_MAX_TRAFFIC_CLASS && flow_node != NULL; i++) + { + tc_id = flow_node->tc_id; + err = dpp_flow_td_th_set(&pf_info, flow_node->flow_id, tc_td_th[tc_id]); + if (err) + { + LOG_ERR("dcbnl_set_ets: set_flow_td_th failed, vport: %d, flow_id:%d, tc_id:%d, td_th: %d, err:%d\n", + en_dev->vport, flow_node->flow_id, tc_id, tc_td_th[tc_id], err); + return err; + } + flow_node->td_th = tc_td_th[tc_id]; + flow_node = flow_node->flow_next; + } + + return 0; +} + +uint32_t zxdh_dcbnl_get_flow_td_th(struct zxdh_en_priv *en_priv, uint32_t* tc_td_th) +{ + struct zxdh_en_device *en_dev = &en_priv->edev; + struct zxdh_dcbnl_ets_flow_node *flow_node = en_dev->dcb_para.ets_node_list_head[ZXDH_DCBNL_ETS_TREE_FLOW_LEVEL].flow_next; + uint32_t err = 0; + uint32_t i = 0; + uint32_t tc_id = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + if (flow_node == NULL) + { + LOG_ERR("get_flow_td_th no flow in the tree\n"); + return 1; + } + + if (tc_td_th == NULL) + { + LOG_ERR(" tc_td_th is null \n"); + return 1; + } + + for (i = 0; i < ZXDH_DCBNL_MAX_TRAFFIC_CLASS && flow_node != NULL; i++) + { + tc_id = flow_node->tc_id; + err = dpp_flow_td_th_get(&pf_info, flow_node->flow_id, &tc_td_th[tc_id]); + if (err) + { + LOG_ERR("get_flow_td_th failed, vport: %d, flow_id:%d, tc_id:%d, err:%d\n", + en_dev->vport, flow_node->flow_id, tc_id, err); + return err; + } + flow_node = flow_node->flow_next; + } + + return 0; +} + +uint32_t zxdh_dcbnl_init_port_speed(struct zxdh_en_priv *en_priv) +{ + struct zxdh_en_device *en_dev = &en_priv->edev; + struct zxdh_dcbnl_tc_flow_shape_para p_para = {0}; + uint32_t err = 0; + uint32_t speed = 0; + uint32_t max_speed = ZXDH_DCBNL_MAXRATE_KBITPS / ZXDH_DCBNL_RATEUNIT_K; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + speed = en_dev->speed; + if ((0 == speed) || (speed > max_speed)) + { + LOG_INFO("get port speed is : %u ,set to max:%u\n",speed, max_speed); + speed = max_speed; + } + + p_para.cir = speed * ZXDH_DCBNL_RATEUNIT_K; //Mbps->Kbps + p_para.cbs = ZXDH_DCBNL_PORT_RATE_CBS; + p_para.db_en = 0; + p_para.eir = 0; + p_para.ebs = 0; + + LOG_INFO(" vport:%d,phy_port:%d, p_para.cir:%d, speed:%d \n", + en_dev->vport, en_dev->phy_port, p_para.cir, speed); + + err = dpp_port_shape_set(&pf_info, en_dev->phy_port, p_para.cir, p_para.cbs, 1); + if (err) + { + LOG_ERR("dcbnl_set_ets: dpp_port_shape_set failed, port:%d, speed:%d, speed:%d,err:%d \n", + en_dev->phy_port, speed, p_para.cir, err); + return err; + } + + return 0; +} + +uint32_t zxdh_dcbnl_printk_ets_tree(struct zxdh_en_priv *en_priv) +{ + struct zxdh_en_device *en_dev = &en_priv->edev; + struct zxdh_dcbnl_ets_flow_node *flow_node = NULL; + struct zxdh_dcbnl_ets_se_node *se_node = NULL; + struct zxdh_dcbnl_ets_node_list_head *ets_node_list_head = NULL; + uint32_t level = 0; + + LOG_INFO(" ***vport:%d port:%d \n", en_dev->vport,en_dev->phy_port); + + for (level = ZXDH_DCBNL_ETS_TREE_ROOT_LEVEL; level > 0; level--) + { + ets_node_list_head = &en_dev->dcb_para.ets_node_list_head[level]; + se_node = ets_node_list_head->se_next; + while (NULL != se_node) + { + LOG_INFO(" se_node *** level:%d, node_idx:%d, se_id:0x%x *** \n", + level, se_node->node_idx, se_node->se_id); + LOG_INFO(" se_node gsch_id:0x%llx, node_type:%d, se_id:0x%x \n", + se_node->gsch_id, se_node->node_type, se_node->se_id); + LOG_INFO(" se_node se_link_id:0x%x, se_link_weight:%d, se_link_sp:%d, link_point:%d \n", + se_node->se_link_id, se_node->se_link_weight, se_node->se_link_sp, se_node->link_point); + se_node = se_node->se_next; + } + } + + ets_node_list_head = &en_dev->dcb_para.ets_node_list_head[ZXDH_DCBNL_ETS_TREE_FLOW_LEVEL]; + flow_node = ets_node_list_head->flow_next; + while (NULL != flow_node) + { + LOG_INFO(" flow_node *** tc_id:%d, flow_id:%d *** \n", + flow_node->tc_id, flow_node->flow_id); + LOG_INFO(" flow_node gsch_id:0x%llx, tc_type:%d, td_th:%d \n", + flow_node->gsch_id, flow_node->tc_type, flow_node->td_th); + LOG_INFO(" flow_node c_linkid:0x%x, c_weight:%d, c_sp:%d, c_rate:%d \n", + flow_node->c_linkid, flow_node->c_weight,flow_node->c_sp,flow_node->c_rate); + LOG_INFO(" flow_node e_linkid:0x%x, e_weight:%d, e_sp:%d, e_rate:%d \n", + flow_node->e_linkid, flow_node->e_weight, flow_node->e_sp, flow_node->e_rate); + flow_node = flow_node->flow_next; + } + + return 0; +} + +uint32_t zxdh_link_speed_to_index(uint32_t link_speed) +{ + //50G以下统一按50G处理 + //暂未使用RDMA端口 + uint32_t index = ZXDH_TRPG_DEFAULT; //riscv上默认初值 + if(link_speed == 200000) + { + index = ZXDH_TRPG_SPEED_200G; + } + else if(link_speed == 100000) + { + index = ZXDH_TRPG_SPEED_100G; + } + else + { + index = ZXDH_TRPG_SPEED_50G; + } + + return index; +} + +DPP_PBU_PORT_TH_PARA_T port_th_para_tbl[ZXDH_TRPG_SPEED_NUM] = +{ + /*brief lif阈值 lif私有阈值 idma私有阈值 idma_th0 idma_th1 idma_th2 idma_th3 idma_th4 idma_th5 idma_th6 idma_th7*/ + /*单位512byte,512代表芯片处理包粒度*/ + {100, 140, 140, 110, 130, 150, 170, 190, 210, 230, 250}, //50G + {210, 280, 280, 180, 230, 280, 330, 380, 430, 480, 530}, //100G + {480, 560, 560, 370, 450, 550, 670, 770, 870, 970, 1070}, //200G + {1400, 0, 0, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500}, //400G RDMA + {2036, 2000, 2000, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100} //riscv上默认初始值 +}; + +DPP_PBU_PORT_COS_TH_PARA_T port_cos_th_para_tbl[ZXDH_TRPG_SPEED_NUM] = +{ + /*单位512byte*/ + {{100, 120, 140, 160, 180, 200, 220, 240}}, //50G + {{160, 210, 260, 310, 360, 410, 460, 510}}, //100G + {{320, 420, 480, 620, 720, 820, 920, 1020}}, //200G + {{1200, 1200, 2000, 2000, 2800, 2800, 2800, 2800}}, //400G RDMA + {{1650, 1700, 1750, 1800, 1850, 1900, 1950, 2000}} //riscv上默认初始值 +}; + +uint32_t flow_td_th_tbl[ZXDH_TRPG_SPEED_NUM][ZXDH_DCBNL_MAX_TRAFFIC_CLASS] = +{ + /*单位KB*/ + {72, 119, 166, 213, 260, 306, 353, 400}, //50G 梯度47 + {144, 207, 269, 332, 394, 457, 519, 582}, //100G 梯度63 + {287, 365, 443, 521, 600, 678, 756, 834}, //200G 梯度78 最小560*512/1000 + {375, 570, 766, 961, 1156, 1352, 1547, 1742}, //400G RDMA 梯度195 + {150, 150, 150, 150, 150, 150, 150, 150} //riscv上默认初始值 +}; + +uint32_t zxdh_config_param_compare_test(uint32_t tbl_index, + DPP_PBU_PORT_TH_PARA_T port_th_para, + DPP_PBU_PORT_COS_TH_PARA_T port_cos_th_para, + uint32_t *flow_td_th_para) +{ + uint32_t index = 0; + uint32_t *port_th_para_p1 = (uint32_t *)&port_th_para; + uint32_t *port_th_para_p2 = (uint32_t *)&port_cos_th_para_tbl[tbl_index]; + for(index = 0; index<11; index++) + { + if(*(port_th_para_p1+index) != *(port_th_para_p2+index)) + { + return false; + } + } + for(index = 0; indexnetdev; + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + //en_dev里面其实是包含link_speed的,填的是具体的速率值 + uint32_t tbl_index; + uint32_t index; + uint32_t pfc_cur_mac_en = 0; + uint32_t ret = 0; + uint32_t speed = 0; + uint32_t max_speed = ZXDH_DCBNL_MAXRATE_KBITPS; + uint32_t params_check = 0; + DPP_PBU_PORT_TH_PARA_T port_th_para_test = {0}; + DPP_PBU_PORT_COS_TH_PARA_T port_cos_th_para_test = {0}; + DPP_TM_SHAPE_PP_PARA_T port_shape_para_test = {0}; + uint32_t flow_td_th_para_test[ZXDH_DCBNL_MAX_TRAFFIC_CLASS] = {0}; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + LOG_INFO("port speed en_dev->speed is abnormal: %d \n",en_dev->speed) + + if(en_dev->speed) + { + speed = en_dev->speed *ZXDH_DCBNL_RATEUNIT_K; + } + + zxdh_en_fc_mode_get(en_dev, &pfc_cur_mac_en); + if(pfc_cur_mac_en == BIT(SPM_FC_NONE)) + { + LOG_INFO("port pfc & fc disable"); + return 0; + } + + //speed过滤 + if ((0 == speed) || (speed > max_speed)) + { + LOG_INFO("port speed is abnormal: %u \n",speed); + speed = max_speed; + } + ret = dpp_port_shape_set(&pf_info, en_dev->phy_port, speed, ZXDH_DCBNL_PORT_RATE_CBS, 1); + + if(en_dev->phy_port > 9) + { + LOG_INFO("en_dev->phy_port not supported"); + return 0; + } + + tbl_index = zxdh_link_speed_to_index(en_dev->link_speed); + + LOG_INFO("link_speed to tbl_index: %d", tbl_index); + + if(pfc_cur_mac_en != BIT(SPM_FC_PAUSE_RX)) + { + ret = dpp_port_th_set(&pf_info, en_dev->phy_port, port_th_para_tbl+tbl_index); + + ret |= dpp_port_cos_th_set(&pf_info, en_dev->phy_port, port_cos_th_para_tbl+tbl_index); + } + + //暂时规避fc下的td阈值改配 + //if(pfc_cur_mac_en != BIT(SPM_FC_PAUSE_TX)) + if(pfc_cur_mac_en == SPM_FC_PFC_FULL) + { + ret |= zxdh_dcbnl_set_flow_td_th(en_priv, flow_td_th_tbl[tbl_index]); + } + + /*维测需要*/ + dpp_port_th_get(&pf_info, en_dev->phy_port, &port_th_para_test); + LOG_INFO("dpp_port_th_get lif_th:%d, lif_prv:%d, idma_prv:%d \n", + port_th_para_test.lif_th, port_th_para_test.lif_prv, port_th_para_test.idma_prv); + LOG_INFO("idma_th0:%d, idma_th1:%d, idma_th2:%d, idma_th3:%d, idma_th4:%d, idma_th5:%d, idma_th6:%d, idma_th7:%d \n", + port_th_para_test.idma_th_cos0, port_th_para_test.idma_th_cos1, port_th_para_test.idma_th_cos2, port_th_para_test.idma_th_cos3, + port_th_para_test.idma_th_cos4, port_th_para_test.idma_th_cos5, port_th_para_test.idma_th_cos6, port_th_para_test.idma_th_cos7); + + dpp_port_cos_th_get(&pf_info, en_dev->phy_port, &port_cos_th_para_test); + for(index = 0; indexcos_th[0], port_cos_th_para_test->cos_th[1], port_cos_th_para_test->cos_th[2], port_cos_th_para_test->cos_th[3],\ + port_cos_th_para_test->cos_th[4], port_cos_th_para_test->cos_th[6], port_cos_th_para_test->cos_th[0], port_cos_th_para_test->cos_th[0], ) + */ + dpp_port_shape_get(&pf_info, en_dev->phy_port, &port_shape_para_test); + LOG_INFO("dpp_port_shape_get cir:%d, cbs:%d, c_en:%d\n",port_shape_para_test.cir, port_shape_para_test.cbs, port_shape_para_test.c_en); + + zxdh_dcbnl_get_flow_td_th(en_priv, flow_td_th_para_test); + for(index = 0; indexnetdev; + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + uint32_t ret = 0; + uint32_t pfc_cur_mac_en = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + zxdh_en_fc_mode_get(en_dev, &pfc_cur_mac_en); + + if(pfc_cur_mac_en != BIT(SPM_FC_PAUSE_TX)) + { + ret = dpp_port_th_set(&pf_info, en_dev->phy_port, port_th_para_tbl+ZXDH_TRPG_DEFAULT); + + ret |= dpp_port_cos_th_set(&pf_info, en_dev->phy_port, port_cos_th_para_tbl+ZXDH_TRPG_DEFAULT); + } + + if(pfc_cur_mac_en != BIT(SPM_FC_PAUSE_RX)) + { + ret |= zxdh_dcbnl_set_flow_td_th(en_priv, flow_td_th_tbl[ZXDH_TRPG_DEFAULT]); + } + + return ret; +} + +uint32_t zxdh_dcbnl_pfc_init(struct zxdh_en_priv *en_priv) +{ + struct zxdh_en_device *en_dev = &en_priv->edev; + uint32_t ret = 0; + uint32_t test_en = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + LOG_INFO("zxdh_dcbnl_pfc_init start\n"); + + ret = dpp_qmu_pfc_en_set(&pf_info, 1); + + if(ret) + { + LOG_ERR("dpp_qmu_pfc_en_set failed"); + } + + dpp_qmu_pfc_en_get(&pf_info, &test_en); + LOG_INFO("dpp_qmu_pfc_en_get:%d", test_en); + LOG_INFO("zxdh_dcbnl_pfc_init end\n"); + + return ret; +} + +uint32_t zxdh_dcbnl_init_ets_scheduling_tree(struct zxdh_en_priv *en_priv) +{ + uint32_t err = 0; + + zxdh_dcbnl_init_ets_list(en_priv); + + err = zxdh_dcbnl_build_ets_scheduling_tree(en_priv); + if (err) + { + LOG_ERR("dcbnl_init_ets: build_tc_scheduling_tree failed \n"); + goto init_ets_se_error; + } + + err = zxdh_dcbnl_scheduling_tree_link_tc(en_priv); + if (err) + { + LOG_ERR("dcbnl_init_ets: scheduling_tree_link_tc failed \n"); + goto init_ets_error; + } + + err = zxdh_dcbnl_init_trust_and_table(en_priv); + if (err) + { + LOG_ERR("dcbnl_init_ets: init_trust_and_table failed \n"); + goto init_ets_error; + } + + return 0; + +init_ets_error: + zxdh_dcbnl_free_flow_resources(en_priv); +init_ets_se_error: + zxdh_dcbnl_free_se_resources(en_priv); + LOG_INFO("dcbnl_init_ets failed \n"); + return err; +} + +uint32_t zxdh_dcbnl_set_tm_gate(struct zxdh_en_priv *en_priv, uint32_t mode) +{ + struct zxdh_en_device *en_dev = &en_priv->edev; + uint32_t err = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + if (mode == 1) + { + err = dpp_tm_pport_mcode_switch_set(&pf_info, en_dev->phy_port, 1); + if (err) + { + LOG_ERR(" set_tm_gate open failed \n"); + } + } + else if (mode == 0) + { + err = dpp_tm_pport_mcode_switch_del(&pf_info, en_dev->phy_port); + if (err) + { + LOG_ERR(" set_tm_gate close failed \n"); + } + } + else + { + LOG_ERR(" error \n"); + } + + return err; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_aux/dcbnl/en_dcbnl_api.h b/src/net/drivers/net/ethernet/dinghai/en_aux/dcbnl/en_dcbnl_api.h new file mode 100644 index 0000000..485a377 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_aux/dcbnl/en_dcbnl_api.h @@ -0,0 +1,35 @@ +#ifndef __ZXDH_EN_DCBNL_API_H__ +#define __ZXDH_EN_DCBNL_API_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +struct zxdh_en_priv; + +uint32_t zxdh_dcbnl_init_port_speed(struct zxdh_en_priv *en_priv); +uint32_t zxdh_dcbnl_init_ets_scheduling_tree(struct zxdh_en_priv *en_priv); +uint32_t zxdh_dcbnl_printk_ets_tree(struct zxdh_en_priv *en_priv); +uint32_t zxdh_dcbnl_pfc_init(struct zxdh_en_priv *en_priv); + +uint32_t zxdh_dcbnl_free_flow_resources(struct zxdh_en_priv *en_priv); +uint32_t zxdh_dcbnl_free_se_resources(struct zxdh_en_priv *en_priv); + +uint32_t zxdh_dcbnl_set_tc_scheduling(struct zxdh_en_priv *en_priv, uint8_t *tc_type, uint8_t *tc_tx_bw); +uint32_t zxdh_dcbnl_set_ets_up_tc_map(struct zxdh_en_priv *en_priv, uint8_t *prio_tc); +uint32_t zxdh_dcbnl_set_tc_maxrate(struct zxdh_en_priv *en_priv, uint32_t *maxrate); +uint32_t zxdh_dcbnl_set_ets_trust(struct zxdh_en_priv *en_priv, uint32_t trust); +uint32_t zxdh_dcbnl_set_dscp2prio(struct zxdh_en_priv *en_priv, uint16_t dscp, uint8_t prio); + +uint32_t zxdh_port_th_update(struct zxdh_en_device *en_dev); +uint32_t zxdh_port_th_update_to_default(struct zxdh_en_device *en_dev); + +uint32_t zxdh_dcbnl_set_tm_gate(struct zxdh_en_priv *en_priv, uint32_t mode); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_aux/drs_sec_dtb.c b/src/net/drivers/net/ethernet/dinghai/en_aux/drs_sec_dtb.c new file mode 100755 index 0000000..150b79f --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_aux/drs_sec_dtb.c @@ -0,0 +1,1060 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include "driver.h" +#include "../en_aux.h" +#include "drs_sec_dtb.h" + + + +UINT32 g_udDownloadSaNum = 1; //sa表的数量 +UINT32 gudTunnelID = 0; +UINT32 gudDtbSaNum = 1; +E_INLINE_TYPE e_gInlineType = 0; //0是inline入境 1是inline出境 +UINT64 guddAntiWindow = 2047; //得配成2047,否则覆盖不到sn为0的情况 + +UINT64 guddSecTestSaDtbPdVirAddr = 0; + +UINT32 gudSecTestSwanSrcIp = 0x0A04B007; +UINT32 gudSecTestSwanDstIp = 0x0AE3656D; + +UINT8 gudIpType = 1; +// 出入境分开下表需要将此字段置0,会影响入境下表 +UINT16 gusOutSaOffset=0; +UINT32 gudOutSaId=0; + + +UINT64 HalBttlSecRegBaseGet(struct zxdh_en_device *en_dev) +{ + PUB_CHECK_NULL_PTR_RET_ERR(en_dev); + return en_dev->ops->get_bar_virt_addr(en_dev->parent, 0) + 0x7000; //0x7000是目前sec模块寄存器基地址的固定偏移,包括PF/VF +} + + +#if 1 +static int zxdh_ipsec_cipher_id_get(u8 ealgo, char* p_alg_name,char* p_aead_name,E_HAL_SEC_IPSEC_CIPHER_ALG *p_zxdh_ealgo_id) +{ + int i = 0; + T_ZXDH_EALGO atZxdhEalgo[] = + { + {"rfc7539esp(chacha20,poly1305)","",e_HAL_IPSEC_CIPHER_CHACHA}, + }; + + if((NULL == p_alg_name)||(NULL == p_aead_name)) + { + return -1; + } + for(i=0;iaalg) + { + p_aalg_alg_name = xs->aalg->alg_name; + } + if(NULL != xs->ealg) + { + p_ealg_alg_name = xs->ealg->alg_name; + } + if(NULL != xs->aead) + { + p_aead_alg_name = xs->aead->alg_name; + } + + /*AH应该提前拦截*/ + /*空加密空认证应该提前拦截*/ + + //DH_LOG_INFO(MODULE_SEC, "xs:0x%llx\n",xs); + //DH_LOG_INFO(MODULE_SEC, "ptDtbOutSa:0x%llx\n",ptDtbOutSa); + /*应该和pcs的思路一样 ,mlx5e_xfrm_validate_state 参数校验里去把sa的赋值做了*/ + + err = zxdh_ipsec_auth_id_get(xs->props.aalgo,p_aalg_alg_name,&zxdh_auth_id); + if (err) { + DH_LOG_INFO(MODULE_SEC, "Cannot offload xfrm state aalgo:%u\n",xs->props.aalgo); + return -EINVAL; + } + err = zxdh_ipsec_cipher_id_get(xs->props.ealgo,p_ealg_alg_name,p_aead_alg_name,&zxdh_ealgo_id); + if (err) { + DH_LOG_INFO(MODULE_SEC, "Cannot offload xfrm state ealgo:%u\n",xs->props.aalgo); + return -EINVAL; + } + + //DH_LOG_INFO(MODULE_SEC, "replay_esn 0x%llx\n",xs->replay_esn); + ptDtbOutSa->ucAuthkeyLen = 0; /*默认值*/ + + /*处理单认证算法*/ + if(zxdh_auth_id == e_HAL_IPSEC_AUTH_NULL) + { + zxdh_encpy_mode = e_SEC_ENCRYP_ESP_ENCRYP_MODE; + } + else + { + ptDtbOutSa->ucAuthkeyLen = (xs->aalg->alg_key_len + 7)/8; + udIcvLen = (xs->aalg->alg_trunc_len + 7)/8; + memcpy((ptDtbOutSa->aucSaAuthKey),xs->aalg->alg_key,ptDtbOutSa->ucAuthkeyLen); + } + + if((zxdh_ealgo_id != e_HAL_IPSEC_CIPHER_NULL)&&(zxdh_auth_id != e_HAL_IPSEC_AUTH_NULL)) + { + zxdh_encpy_mode = e_SEC_ENCRYP_ESP_AUTH_AND_ESP_ENCRYP_MODE; + } + /*这里处理组合算法的4字节的salt*/ + if((zxdh_ealgo_id == e_HAL_IPSEC_CIPHER_AES_GCM)||(zxdh_ealgo_id == e_HAL_IPSEC_CIPHER_CHACHA)||(zxdh_ealgo_id == e_HAL_IPSEC_CIPHER_AES_GMAC)) + { + zxdh_encpy_mode = e_SEC_ENCRYP_ESP_COMBINED_MODE; + + ptDtbOutSa->ucCipherkeyLen = (xs->aead->alg_key_len + 7)/8 - 4; + udIcvLen = (xs->aead->alg_icv_len+ 7)/8; + memcpy(&(ptDtbOutSa->udSalt), xs->aead->alg_key + ptDtbOutSa->ucCipherkeyLen,sizeof(ptDtbOutSa->udSalt)); + memcpy((ptDtbOutSa->aucSaCipherKey),xs->aead->alg_key,ptDtbOutSa->ucCipherkeyLen); + } + /*这里处理组合算法CCM,CCM的salt是3B*/ + else if(zxdh_ealgo_id == e_HAL_IPSEC_CIPHER_AES_CCM) + { + zxdh_encpy_mode = e_SEC_ENCRYP_ESP_COMBINED_MODE; + + ptDtbOutSa->ucCipherkeyLen = (xs->aead->alg_key_len + 7)/8 - 3; + udIcvLen = (xs->aead->alg_icv_len+ 7)/8; + memcpy(&(ptDtbOutSa->udSalt), xs->aead->alg_key + ptDtbOutSa->ucCipherkeyLen,sizeof(ptDtbOutSa->udSalt)); + memcpy((ptDtbOutSa->aucSaCipherKey),xs->aead->alg_key,ptDtbOutSa->ucCipherkeyLen); + } + /*这里处理有salt的单加密算法CTR,salt是4B*/ + else if(zxdh_ealgo_id == e_HAL_IPSEC_CIPHER_AES_CTR) + { + ptDtbOutSa->ucCipherkeyLen = (xs->ealg->alg_key_len + 7)/8 - 4; + memcpy(&(ptDtbOutSa->udSalt), xs->ealg->alg_key + ptDtbOutSa->ucCipherkeyLen,sizeof(ptDtbOutSa->udSalt)); + memcpy((ptDtbOutSa->aucSaCipherKey),xs->ealg->alg_key,ptDtbOutSa->ucCipherkeyLen); + } + /*空加密算法*/ + else if(zxdh_ealgo_id == e_HAL_IPSEC_CIPHER_NULL) + { + zxdh_encpy_mode = e_SEC_ENCRYP_ESP_AUTH_MODE; + ptDtbOutSa->ucCipherkeyLen = 0; + } + /*单加密算法,且没有salt*/ + else + { + ptDtbOutSa->ucCipherkeyLen = (xs->ealg->alg_key_len + 7)/8; + memcpy((ptDtbOutSa->aucSaCipherKey),xs->ealg->alg_key,ptDtbOutSa->ucCipherkeyLen); + } + + + ptDtbOutSa->udSN = xs->replay.oseq; + ptDtbOutSa->uddProcessedByteCnt = xs->curlft.bytes; //PUB_HTON64(uddProcessedByteCnt); //没法设置,用于构造iv, 一般都是用seq构造的iv + + ptDtbOutSa->udSPI = xs->id.spi; + ptDtbOutSa->udSaId = PUB_HTON32(0x80001); //PUB_HTON32(udSaId); /*这个要软件自己管理,需要设计一下*/ + + ptDtbOutSa->ucCiperID = zxdh_ealgo_id; + ptDtbOutSa->ucAuthID = zxdh_auth_id; + + //CmdkBttlSecSaParamConstruct(UINT32 udEntryValid,E_CMDK_SEC_IPSEC_MODE eTunnelMode,UINT32 udSeqCnterOverflow,E_CMDK_LIVETIME_TYPES eLiveTimeType,E_CMDK_SEC_SA_DF_MODE eSaDfMode,E_CMDK_SEC_ENCRYP_MODE eEncryptionMode,UINT32 udIcvLen,UINT16* pusSaParam) + //E_CMDK_SEC_ENCRYP_MODE 这个只能根据算法反推 gcm ccm gmac chacha是combine gaucSecSwanIpv6Data + //udIcvLen + //mode的定义刚好一样E_CMDK_SEC_IPSEC_MODE , XFRM_MODE_TRANSPORT + /*这个地方还要根据算法做个转换 e_SEC_ENCRYP_ESP_COMBINED_MODE 暂时用GCM*/ + CmdkBttlSecSaParamConstruct(1,xs->props.mode,0,e_SEC_SA_LIVETIME_TIME_TYPE,e_SEC_SA_DF_BYPASS_MODE,zxdh_encpy_mode,udIcvLen,&usSaParam); + ptDtbOutSa->usSaParam = PUB_HTON16(usSaParam); + + + + ptDtbOutSa->usFrag_State = PUB_HTON16(0xd2c8); + + ptDtbOutSa->udLifetimeSecMax = PUB_HTON32(0xc4454766); + ptDtbOutSa->uddLifetimByteCntMax = PUB_HTON64(0xffffffffffffffff); + + ptDtbOutSa->ucProtocol = xs->id.proto; //50esp协议 51ah + ptDtbOutSa->ucTOS = 0xbb; + + /*esn相关*/ + ptDtbOutSa->ucEsnFlag = 0; /* 默认是非ESN模式 */ + if(xs->props.flags & XFRM_STATE_ESN) + { + if(NULL == xs->replay_esn) + return 1; + ptDtbOutSa->ucEsnFlag = 0xff; //ucEsnFlag; //0xff表示开启ESN,否则不开启 + ptDtbOutSa->udSN = xs->replay_esn->oseq; + ptDtbOutSa->udESN = xs->replay_esn->oseq_hi; /*不需要考虑replay_esn为null的情况?*/ + } + + /*ipv4*/ + if(AF_INET == xs->props.family) + { + ptDtbOutSa->ucIpType = 1<<6; //bit[7:6] 1:ivp4 2:ipv6 /*换成宏*/ + ptDtbOutSa->udSrcAddress0 = xs->props.saddr.a4; + ptDtbOutSa->udSrcAddress1 = 0x0; + ptDtbOutSa->udSrcAddress2 = 0x0; + ptDtbOutSa->udSrcAddress3 = 0x0; + + ptDtbOutSa->udDstAddress0 = xs->id.daddr.a4; + ptDtbOutSa->udDstAddress1 = 0x0; + ptDtbOutSa->udDstAddress2 = 0x0; + ptDtbOutSa->udDstAddress3 = 0x0; + } + /*ipv4*/ + else if(AF_INET6 == xs->props.family) + { + ptDtbOutSa->ucIpType = 2<<6; //bit[7:6] 1:ivp4 2:ipv6 /*换成宏*/ + ptDtbOutSa->udSrcAddress0 = xs->props.saddr.a6[0]; + ptDtbOutSa->udSrcAddress1 = xs->props.saddr.a6[1]; + ptDtbOutSa->udSrcAddress2 = xs->props.saddr.a6[2]; + ptDtbOutSa->udSrcAddress3 = xs->props.saddr.a6[3]; + + ptDtbOutSa->udDstAddress0 = xs->id.daddr.a6[0]; + ptDtbOutSa->udDstAddress1 = xs->id.daddr.a6[1]; + ptDtbOutSa->udDstAddress2 = xs->id.daddr.a6[2]; + ptDtbOutSa->udDstAddress3 = xs->id.daddr.a6[3]; + } + else + { + return -EINVAL; /*不可能走到这里,前面函数已经校验过了*/ + } + + ptDtbOutSa->udRSV0 = 0x0; + ptDtbOutSa->udRSV1 = 0x0; + ptDtbOutSa->udRSV2 = 0x0; + + DH_LOG_INFO(MODULE_SEC, "ptDtbOutSa->ucAuthkeyLen:0x%x\n",ptDtbOutSa->ucAuthkeyLen); + DH_LOG_INFO(MODULE_SEC, "ptDtbOutSa->ucCipherkeyLen:0x%x\n",ptDtbOutSa->ucCipherkeyLen); + DH_LOG_INFO(MODULE_SEC, "zxdh_encpy_mode:0x%x\n",zxdh_encpy_mode); + DH_LOG_INFO(MODULE_SEC, "ptDtbOutSa->ucCiperID:0x%x\n",ptDtbOutSa->ucCiperID); + DH_LOG_INFO(MODULE_SEC, "ptDtbOutSa->ucAuthID:0x%x\n",ptDtbOutSa->ucAuthID); + + + return 0; +} + +static int zxdh_ipsec_dtb_in_sa_get(struct xfrm_state *xs,T_HAL_SA_DTB_HW_IN* ptDtbInSa) +{ + int err = -EINVAL; + u16 usSaParam = 0; + u32 udIcvLen = 0; + E_HAL_SEC_IPSEC_AUTH_ALG zxdh_auth_id; + E_HAL_SEC_IPSEC_CIPHER_ALG zxdh_ealgo_id; + E_CMDK_SEC_ENCRYP_MODE zxdh_encpy_mode = e_SEC_ENCRYP_MODE_LAST; + char test_alg_name[] = "zxdh_alg_test"; + char* p_aalg_alg_name = test_alg_name; + char* p_ealg_alg_name = test_alg_name; + char* p_aead_alg_name = test_alg_name; + +/*应该和pcs的思路一样 ,mlx5e_xfrm_validate_state 参数校验里去把sa的赋值做了*/ + if(NULL != xs->aalg) + { + p_aalg_alg_name = xs->aalg->alg_name; + } + if(NULL != xs->ealg) + { + p_ealg_alg_name = xs->ealg->alg_name; + } + if(NULL != xs->aead) + { + p_aead_alg_name = xs->aead->alg_name; + } + err = zxdh_ipsec_auth_id_get(xs->props.aalgo,p_aalg_alg_name,&zxdh_auth_id); + if (err) { + DH_LOG_INFO(MODULE_SEC, "Cannot offload xfrm state aalgo:%u\n",xs->props.aalgo); + return -EINVAL; + } + err = zxdh_ipsec_cipher_id_get(xs->props.ealgo,p_ealg_alg_name,p_aead_alg_name,&zxdh_ealgo_id); + if (err) { + DH_LOG_INFO(MODULE_SEC, "Cannot offload xfrm state ealgo:%u\n",xs->props.aalgo); + return -EINVAL; + } + + ptDtbInSa->ucAuthkeyLen = 0; /*默认值*/ + + /*处理单认证算法*/ + if(zxdh_auth_id == e_HAL_IPSEC_AUTH_NULL) + { + zxdh_encpy_mode = e_SEC_ENCRYP_ESP_ENCRYP_MODE; + } + else + { + ptDtbInSa->ucAuthkeyLen = (xs->aalg->alg_key_len + 7)/8; + udIcvLen = (xs->aalg->alg_trunc_len + 7)/8; + memcpy((ptDtbInSa->aucSaAuthKey),xs->aalg->alg_key,ptDtbInSa->ucAuthkeyLen); + } + + if((zxdh_ealgo_id != e_HAL_IPSEC_CIPHER_NULL)&&(zxdh_auth_id != e_HAL_IPSEC_AUTH_NULL)) + { + zxdh_encpy_mode = e_SEC_ENCRYP_ESP_AUTH_AND_ESP_ENCRYP_MODE; + } + /*这里处理组合算法的4字节的salt*/ + if((zxdh_ealgo_id == e_HAL_IPSEC_CIPHER_AES_GCM)||(zxdh_ealgo_id == e_HAL_IPSEC_CIPHER_CHACHA)||(zxdh_ealgo_id == e_HAL_IPSEC_CIPHER_AES_GMAC)) + { + zxdh_encpy_mode = e_SEC_ENCRYP_ESP_COMBINED_MODE; + + ptDtbInSa->ucCipherkeyLen = (xs->aead->alg_key_len + 7)/8 - 4; + udIcvLen = (xs->aead->alg_icv_len+ 7)/8; + memcpy(&(ptDtbInSa->udSalt), xs->aead->alg_key + ptDtbInSa->ucCipherkeyLen,sizeof(ptDtbInSa->udSalt)); + memcpy((ptDtbInSa->aucSaCipherKey),xs->aead->alg_key,ptDtbInSa->ucCipherkeyLen); + } + /*这里处理组合算法CCM,CCM的salt是3B*/ + else if(zxdh_ealgo_id == e_HAL_IPSEC_CIPHER_AES_CCM) + { + zxdh_encpy_mode = e_SEC_ENCRYP_ESP_COMBINED_MODE; + + ptDtbInSa->ucCipherkeyLen = (xs->aead->alg_key_len + 7)/8 - 3; + udIcvLen = (xs->aead->alg_icv_len+ 7)/8; + memcpy(&(ptDtbInSa->udSalt), xs->aead->alg_key + ptDtbInSa->ucCipherkeyLen,sizeof(ptDtbInSa->udSalt)); + memcpy((ptDtbInSa->aucSaCipherKey),xs->aead->alg_key,ptDtbInSa->ucCipherkeyLen); + } + /*这里处理有salt的单加密算法CTR,salt是4B*/ + else if(zxdh_ealgo_id == e_HAL_IPSEC_CIPHER_AES_CTR) + { + ptDtbInSa->ucCipherkeyLen = (xs->ealg->alg_key_len + 7)/8 - 4; + memcpy(&(ptDtbInSa->udSalt), xs->ealg->alg_key + ptDtbInSa->ucCipherkeyLen,sizeof(ptDtbInSa->udSalt)); + memcpy((ptDtbInSa->aucSaCipherKey),xs->ealg->alg_key,ptDtbInSa->ucCipherkeyLen); + } + /*空加密算法*/ + else if(zxdh_ealgo_id == e_HAL_IPSEC_CIPHER_NULL) + { + zxdh_encpy_mode = e_SEC_ENCRYP_ESP_AUTH_MODE; + ptDtbInSa->ucCipherkeyLen = 0; + } + /*单加密算法,且没有salt*/ + else + { + ptDtbInSa->ucCipherkeyLen = (xs->ealg->alg_key_len + 7)/8; + memcpy((ptDtbInSa->aucSaCipherKey),xs->ealg->alg_key,ptDtbInSa->ucCipherkeyLen); + } + + ptDtbInSa->uddProcessedByteCnt = xs->curlft.bytes; //PUB_HTON64(uddProcessedByteCnt); //没法设置,用于构造iv, 一般都是用seq构造的iv + + ptDtbInSa->udSPI = xs->id.spi; + ptDtbInSa->udSaId = PUB_HTON32(0x80000); //PUB_HTON32(udSaId); /*这个要软件自己管理,需要设计一下*/ + + ptDtbInSa->ucCiperID = zxdh_ealgo_id; + ptDtbInSa->ucAuthID = zxdh_auth_id; + + //CmdkBttlSecSaParamConstruct(UINT32 udEntryValid,E_CMDK_SEC_IPSEC_MODE eTunnelMode,UINT32 udSeqCnterOverflow,E_CMDK_LIVETIME_TYPES eLiveTimeType,E_CMDK_SEC_SA_DF_MODE eSaDfMode,E_CMDK_SEC_ENCRYP_MODE eEncryptionMode,UINT32 udIcvLen,UINT16* pusSaParam) + //CmdkBttlSecSaParamConstruct(1,x->props.mode,不确定,e_SEC_SA_LIVETIME_BYTE_TYPE(好像硬件只支持这个),E_CMDK_SEC_SA_DF_MODE(0),) + //E_CMDK_SEC_ENCRYP_MODE 这个只能根据算法反推 gcm ccm gmac chacha是combine gaucSecSwanIpv6Data + //udIcvLen + //mode的定义刚好一样E_CMDK_SEC_IPSEC_MODE , XFRM_MODE_TRANSPORT + CmdkBttlSecSaParamConstruct(1,xs->props.mode,0,e_SEC_SA_LIVETIME_TIME_TYPE,e_SEC_SA_DF_BYPASS_MODE,zxdh_encpy_mode,udIcvLen,&usSaParam); + ptDtbInSa->usSaParam = PUB_HTON16(usSaParam); + + + + ptDtbInSa->usFrag_State = PUB_HTON16(0xd2c8); + + ptDtbInSa->udLifetimeSecMax = PUB_HTON32(0xc4454766); + ptDtbInSa->uddLifetimByteCntMax = PUB_HTON64(0xffffffffffffffff); + + ptDtbInSa->ucProtocol = xs->id.proto; //50esp协议 51ah + ptDtbInSa->ucTOS = 0xbb; + + /*esn相关*/ + ptDtbInSa->ucEsnFlag = 0; /* 默认是非ESN模式 */ + if(xs->props.flags & XFRM_STATE_ESN) + { + if(NULL == xs->replay_esn) + return 1; + ptDtbInSa->ucEsnFlag = 0xff; //ucEsnFlag; //0xff表示开启ESN,否则不开启 + ptDtbInSa->udAntiWindowHigh = PUB_HTON32(xs->replay_esn->seq_hi); /*ESN*/ + ptDtbInSa->udAntiWindowLow = PUB_HTON32(xs->replay_esn->replay_window - 1); /*窗口上限sn,这里使用窗口大小-1*/ + memcpy((void*)ptDtbInSa->aucBitmap,(void*)xs->replay_esn->bmp,xs->replay_esn->bmp_len * sizeof(__u32)); /*需要提前判断bmp_len不能太大,避免超过64(拦截窗口大小就行)*/ + } + + /*ipv4*/ + if(AF_INET == xs->props.family) + { + ptDtbInSa->ucIpType = 1<<6; //bit[7:6] 1:ivp4 2:ipv6 /*换成宏*/ + ptDtbInSa->udSrcAddress0 = xs->props.saddr.a4; + ptDtbInSa->udSrcAddress1 = 0x0; + ptDtbInSa->udSrcAddress2 = 0x0; + ptDtbInSa->udSrcAddress3 = 0x0; + + ptDtbInSa->udDstAddress0 = xs->id.daddr.a4; + ptDtbInSa->udDstAddress1 = 0x0; + ptDtbInSa->udDstAddress2 = 0x0; + ptDtbInSa->udDstAddress3 = 0x0; + } + /*ipv4*/ + else if(AF_INET6 == xs->props.family) + { + ptDtbInSa->ucIpType = 2<<6; //bit[7:6] 1:ivp4 2:ipv6 /*换成宏*/ + ptDtbInSa->udSrcAddress0 = xs->props.saddr.a6[0]; + ptDtbInSa->udSrcAddress1 = xs->props.saddr.a6[1]; + ptDtbInSa->udSrcAddress2 = xs->props.saddr.a6[2]; + ptDtbInSa->udSrcAddress3 = xs->props.saddr.a6[3]; + + ptDtbInSa->udDstAddress0 = xs->id.daddr.a6[0]; + ptDtbInSa->udDstAddress1 = xs->id.daddr.a6[1]; + ptDtbInSa->udDstAddress2 = xs->id.daddr.a6[2]; + ptDtbInSa->udDstAddress3 = xs->id.daddr.a6[3]; + } + else + { + return -EINVAL; /*不可能走到这里,前面函数已经校验过了*/ + } + + ptDtbInSa->udOutSaId = 0x0; /*内核不需要出入境sa一起下吧,固定为0*/ + ptDtbInSa->usOutSaOffset = 0x0; + + ptDtbInSa->udRSV0 = 0x0; + ptDtbInSa->udRSV1 = 0x0; + + DH_LOG_INFO(MODULE_SEC, "ptDtbInSa->ucAuthkeyLen:0x%x\n",ptDtbInSa->ucAuthkeyLen); + DH_LOG_INFO(MODULE_SEC, "ptDtbInSa->ucCipherkeyLen:0x%x\n",ptDtbInSa->ucCipherkeyLen); + DH_LOG_INFO(MODULE_SEC, "zxdh_encpy_mode:0x%x\n",zxdh_encpy_mode); + DH_LOG_INFO(MODULE_SEC, "ptDtbInSa->ucCiperID:0x%x\n",ptDtbInSa->ucCiperID); + DH_LOG_INFO(MODULE_SEC, "ptDtbInSa->ucAuthID:0x%x\n",ptDtbInSa->ucAuthID); + + + return 0; +} +#endif + + +VOID RdlSecWrite(UINT64 uddSecBase, UINT32 udRegOff, UINT32 udRegVal) +{ + PUB_WRITE_REG32(uddSecBase + udRegOff, udRegVal); +} + +UINT32 HalSecWrite(struct zxdh_en_device *en_dev, UINT32 udSecEngineId, UINT32 udRegOff, UINT32 udRegVal) +{ + UINT64 uddBttlSecBase = 0; + UINT32 udSecnBaseOff = 0; + UINT64 uddSecnBase = 0; + + PUB_CHECK_NULL_PTR_RET_ERR(en_dev); + + uddBttlSecBase = HalBttlSecRegBaseGet(en_dev); + //udSecnBaseOff = udSecEngineId * REG_SEC_IDX_OFFSET; //host不允许操作第二套 + uddSecnBase = uddBttlSecBase + udSecnBaseOff; + //DH_LOG_INFO(MODULE_SEC, "HalBttlSecRegBaseGet regBase vir:0x%llx\n",uddSecnBase); + //DH_LOG_INFO(MODULE_SEC, "HalBttlSecRegBaseGet regBase pa:0x%llx\n",virt_to_phys((void*)uddSecnBase)); + RdlSecWrite(uddSecnBase, udRegOff, udRegVal); + + return 0; +} + +UINT32 RdlSecRead(UINT64 uddSecBase, UINT32 udRegOff) +{ + return PUB_READ_REG32(uddSecBase + udRegOff); +} + +UINT32 HalSecRead(struct zxdh_en_device *en_dev, UINT32 udSecEngineId, UINT32 udRegOff) +{ + UINT64 uddBttlSecBase = 0; + UINT32 udSecnBaseOff = 0; + UINT64 uddSecnBase = 0; + + PUB_CHECK_NULL_PTR_RET_ERR(en_dev); + uddBttlSecBase = HalBttlSecRegBaseGet(en_dev); + udSecnBaseOff = udSecEngineId * REG_SEC_IDX_OFFSET; + uddSecnBase = uddBttlSecBase + udSecnBaseOff; + + return RdlSecRead(uddSecnBase, udRegOff); +} + + +UINT64 HalBttlVaToVpa(struct zxdh_en_device *en_dev, UINT64 pVaAddr) +{ + PUB_CHECK_NULL_PTR_RET_ERR(en_dev); + return (UINT64)virt_to_phys((void*)pVaAddr); +} + +UINT64 HalBttlVpaToVa(struct zxdh_en_device *en_dev, UINT64 pVpaAddr) +{ + PUB_CHECK_NULL_PTR_RET_ERR(en_dev); + return (UINT64)phys_to_virt(pVpaAddr); +} + +#if 0 +VOID PubDumpBuf(UINT8 *pucBuf, UINT32 udLen) +{ + UINT32 i = 0; + UINT32 j = 0; + UINT8 *pucPtr =NULL; + + pucPtr = pucBuf; + for( j=0; j<48; j++ ) + { + PUB_PRINTF("-"); + } + PUB_PRINTF("\n"); + + for( i=0; iops->get_vport(en_dev->parent); + + //写sa的队列锁状态寄存器CFG_DTB_QUEUE_LOCK_STATE,共128个队列,理论上应该查询 + //udRet = HalSecWrite(en_dev, udSecEngineId, REG_SEC_DTB_QUEUE_LOCK_STATE_0_3(0), PUB_BIT_SET(udLockMask,udQueIndex)); + + + //暂时沟通是,只需要将epid配置为0,下表模块就会去riscv侧下表,暂时可以不配 + udEpid = EPID(usVport) + 5; + udVfuncNum = VFUNC_NUM(usVport); + udFuncNum = FUNC_NUM(usVport); + udVfuncActive = VF_ACTIVE(usVport); + + DH_LOG_INFO(MODULE_SEC, "udEpid:0x%x,udVfuncNum:0x%x\n",udEpid,udVfuncNum); + DH_LOG_INFO(MODULE_SEC, "udFuncNum:0x%x,udVfuncActive:0x%x\n",udFuncNum,udVfuncActive); + + PUB_BIT_FIELD_SET64(udEpldVfunNum,udVfuncActive,0,1); + PUB_BIT_FIELD_SET64(udEpldVfunNum,udFuncNum,5,3); + PUB_BIT_FIELD_SET64(udEpldVfunNum,udCfgMsixVector,8,7); + PUB_BIT_FIELD_SET64(udEpldVfunNum,udVfuncNum,16,8); + PUB_BIT_FIELD_SET64(udEpldVfunNum,udEpid,24,4); + PUB_BIT_FIELD_SET64(udEpldVfunNum,udPcieDbiEn,31,1); + + //return 0; + DH_LOG_INFO(MODULE_SEC, "udEpldVfunNum = 0x%x\n",udEpldVfunNum); + HalSecWrite(en_dev, udSecEngineId, REG_SEC_CFG_EPID_V_FUNC_NUM_0_127(udQueIndex), udEpldVfunNum); + + //查询所申请队列剩余空间,如果队列剩余空间大于0则可入队; + udRegVal = HalSecRead(en_dev, udSecEngineId, REG_SEC_INFO_QUEUE_BUF_SPACE_LEFT_0_127(udQueIndex)); + if(udRegVal < 2) + { + BTTL_PRINTF("queue:%u buf empty left:%u\n",udQueIndex,udRegVal); + return 1; + } + if(udRegVal > 0x20) + { + BTTL_PRINTF("queue:%u buf left:%u\n",udQueIndex,udRegVal); + return 1; + } + + //先写DTB_ADDR[63:32],接着写DTB_ADDR[31:0],最后写usdtb_len(软件需严格遵守该顺序) + udRet = HalSecWrite(en_dev, udSecEngineId, REG_SEC_CFG_QUEUE_DTB_ADDR_H_0_127(udQueIndex), pt->DtbAddrH); + + //DH_LOG_INFO(MODULE_SEC, "pt->DtbAddrH = 0x%x\n",pt->DtbAddrH); + udRet = HalSecWrite(en_dev, udSecEngineId, REG_SEC_CFG_QUEUE_DTB_ADDR_L_0_127(udQueIndex), pt->DtbAddrL); + + //DH_LOG_INFO(MODULE_SEC, "pt->DtbAddrL = 0x%x\n",pt->DtbAddrL); + //DH_LOG_INFO(MODULE_SEC, "pt->DtbAddrVir = 0x%llx\n",HalBttlVpaToVa(en_dev,(UINT64)((UINT64)pt->DtbAddrH)<<32)+pt->DtbAddrL); + // CMD寄存器最后配 + udRet = HalSecWrite(en_dev, udSecEngineId, REG_SEC_CFG_QUEUE_DTB_LEN_0_127(udQueIndex), pt->DtbCmd); + + //DH_LOG_INFO(MODULE_SEC, "pt->DtbCmd = 0x%x\n",pt->DtbCmd); + return 0; +} + +/* + sa下表模块测试 + SA存放地址,第二套L2D uddSaL2DPhyAddr= 0x6201000000;理论上为68位,目前场景为64位 + usdtb_len =30; +*/ +//E_SA_TYPE geSaType; + +UINT32 gudTestCnt = 0; +UINT32 CmdkBttlTestSecDtbSaAdd(struct zxdh_en_device *en_dev,E_CMDK_DTB_SA_CMD_TYPE eDtbSaCmdType,E_SA_TYPE eSaType,UINT64 uddSaVirAddr,UINT32 udDtbSaIsIntEn,UINT32 udDtbLen,UINT32 udQueIndex) +{ + /* int_en指示是否产生需要中断 第29位,cmd_type=0指示为流表下发命令,cmd_type=1指示为流表dump命令 第30位 一对sa表的大小为480字节,以16字节为单位*/ + T_QUEUE_DTB_REG tDtbReg = {0}; + UINT32 udDtbCmd = 0; + UINT64 uddSaPhaAddr = 0; + UINT32 udIsDtbAckFinish = 0; + UINT32 udDtbAckRsl = 0; + UINT32 udRet = 0; + int i = 0; + + + /*入参检查*/ + //BTTL_PUB_ID_CHECK(en_dev, CMDK_BTTL_PUB_CHIP_MAX); + //BTTL_PUB_ID_CHECK(eDtbSaCmdType, E_DTB_SA_CMD_LAST); + PUB_CHECK_NULL_PTR_RET_ERR(en_dev); + + uddSaPhaAddr = (UINT64)HalBttlVaToVpa(en_dev, uddSaVirAddr); + //BTTL_PUB_0_CHECK(uddSaPhaAddr); + DH_LOG_INFO(MODULE_SEC, "uddSaVirAddr:0x%llx,uddSaPhaAddr:0x%llx\n",uddSaVirAddr,uddSaPhaAddr); + + //构造udDtbCmd + PUB_BIT_FIELD_SET64(udDtbCmd,udDtbLen>>4,0,10); + PUB_BIT_FIELD_SET64(udDtbCmd,eSaType,27,2); + PUB_BIT_FIELD_SET64(udDtbCmd,udDtbSaIsIntEn,29,1); + PUB_BIT_FIELD_SET64(udDtbCmd,eDtbSaCmdType,30,1); + + tDtbReg.DtbAddrH = (UINT32)PUB_BIT_FIELD_RIGHT_JUST_GET64(uddSaPhaAddr,32,32); + tDtbReg.DtbAddrL = (UINT32)PUB_BIT_FIELD_RIGHT_JUST_GET64(uddSaPhaAddr,0,32); + tDtbReg.DtbCmd = udDtbCmd; + + /* 配置下表寄存器 */ + for(i=0;ixso; + struct net_device *netdev = xso->dev; + struct zxdh_en_priv *en_priv = NULL; + //struct zxdh_en_device *en_dev = NULL; + struct zxdh_en_device *en_dev = NULL; + dma_addr_t dma_handle; + UINT32 dma_size = 0x1000; //暂定4K,批量下表情况下需要更多 + + UINT64 uddDtbSaVirAddr = 0; + UINT32 udSaTblLen = 0; + int ret = 0; + + en_priv = netdev_priv(netdev); + en_dev = &(en_priv->edev); + + if(unlikely(en_dev->drs_sec_pri.SecVAddr == 0)) + { + en_dev->drs_sec_pri.SecVAddr = (uint64_t)dma_alloc_coherent(netdev->dev.parent,dma_size,&dma_handle,GFP_KERNEL); + if(en_dev->drs_sec_pri.SecVAddr == 0) + { + DH_LOG_INFO(MODULE_SEC, "zxdh_ipsec_add_sa dma_alloc_coherent fail\n"); + return -1; + } + en_dev->drs_sec_pri.SecPAddr = dma_handle; + en_dev->drs_sec_pri.SecMemSize = dma_size; + } + uddDtbSaVirAddr = en_dev->drs_sec_pri.SecVAddr; + + DH_LOG_INFO(MODULE_SEC, "uddDtbSaVirAddr:0x%llx\n",uddDtbSaVirAddr); + //DH_LOG_INFO(MODULE_SEC, "xs:0x%llx\n",xs); + + memset((void*)uddDtbSaVirAddr,0,1024); + + //else if(1 == xs->xso.dir) + if(xso->flags & XFRM_OFFLOAD_INBOUND) + { + ret = zxdh_ipsec_dtb_in_sa_get(xs,(T_HAL_SA_DTB_HW_IN*)(uddDtbSaVirAddr+16)); + if(ret != 0) + { + return 1; + } + BttlPubDump((unsigned char *)uddDtbSaVirAddr, 0x210); //传入时加了16字节的回写空间 + + #if 1 + udSaTblLen = 512 - 16; + CmdkBttlTestSecDtbSaAdd(en_dev,E_DTB_SA_CMD_FLOW_DOWN,E_SATYPE_IN,uddDtbSaVirAddr,0,udSaTblLen,2); + + #endif + } + //if(2 == xs->xso.dir) + else + { + ret = zxdh_ipsec_dtb_out_sa_get(xs,(T_HAL_SA_DTB_HW_OUT*)(uddDtbSaVirAddr+16)); + if(ret != 0) + { + return 1; + } + BttlPubDump((unsigned char *)uddDtbSaVirAddr, 0x110); //传入时加了16字节的回写空间 + + #if 1 + udSaTblLen = 256 - 16; + CmdkBttlTestSecDtbSaAdd(en_dev,E_DTB_SA_CMD_FLOW_DOWN,E_SATYPE_OUT,uddDtbSaVirAddr,0,udSaTblLen,2); + #endif + } + + return 0; +} + +void zxdh_ipsec_del_sa(struct xfrm_state *xs) +{ + DH_LOG_INFO(MODULE_SEC, "zxdh_ipsec_del_sa\n"); + return; +} + +bool zxdh_ipsec_offload_ok(struct sk_buff *skb, struct xfrm_state *xs) +{ + DH_LOG_INFO(MODULE_SEC, "zxdh_ipsec_offload_ok\n"); + return true; +} + +void zxdh_ipsec_state_advance_esn (struct xfrm_state *x) +{ + DH_LOG_INFO(MODULE_SEC, "zxdh_ipsec_state_advance_esn\n"); + return; +} +void zxdh_ipsec_state_update_curlft (struct xfrm_state *x) +{ + DH_LOG_INFO(MODULE_SEC, "zxdh_ipsec_state_update_curlft\n"); + return ; +} +int zxdh_ipsec_policy_add (struct xfrm_policy *x) +{ +#if 1 + int32_t ret = 0; + UINT8 aucSip[4] = {0xc8,0xfe,0x00,0x1}; + UINT8 aucDip[4] = {0xc8,0xfe,0x00,0x2}; + UINT8 aucSipMask[4] = {0xff,0xff,0x00,0x0}; + UINT8 aucDipMask[4] = {0xff,0xff,0x00,0x0}; + /*6.2的内核才有*/ + //struct xfrm_dev_offload *xdo = &x->xdo; + //struct net_device *netdev = xdo->dev; + struct net_device *netdev = NULL; //低版本内核仅编译通过 + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + DPP_PF_INFO_T pf_info = {0}; + + DH_LOG_INFO(MODULE_SEC, "zxdh_ipsec_policy_add\n"); + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + /*np下表 inline sec模式 打开*/ + ret = dpp_egr_port_attr_set(&pf_info,EGR_FLAG_INLINE_SEC_OFFLOAD,1); + if (ret != 0) + { + LOG_ERR("Failed to set port_attr EGR_FLAG_INLINE_SEC_OFFLOAD !\n"); + } + + /*配置np ipset加密表*/ + ret = dpp_ipsec_enc_entry_add(&pf_info,0,aucSip,aucDip,aucSipMask,aucDipMask,1,0x80001); + if (ret != 0) + { + LOG_ERR("xfrm policy dpp_ipsec_enc_entry_add Failed!\n"); + } +#endif + + return 0; +} +void zxdh_ipsec_policy_delete (struct xfrm_policy *x) +{ + DH_LOG_INFO(MODULE_SEC, "zxdh_ipsec_policy_delete\n"); + return; +} +void zxdh_ipsec_policy_free (struct xfrm_policy *x) +{ + DH_LOG_INFO(MODULE_SEC, "zxdh_ipsec_policy_free\n"); + return; +} + +const struct xfrmdev_ops zxdh_xfrmdev_ops = +{ + .xdo_dev_state_add = zxdh_ipsec_add_sa, + .xdo_dev_state_delete = zxdh_ipsec_del_sa, + .xdo_dev_offload_ok = zxdh_ipsec_offload_ok, + //.xdo_dev_state_advance_esn = zxdh_ipsec_state_advance_esn, + //.xdo_dev_state_update_curlft = zxdh_ipsec_state_update_curlft, + //.xdo_dev_policy_add = zxdh_ipsec_policy_add, + //.xdo_dev_policy_free = zxdh_ipsec_policy_free, +}; +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_aux/drs_sec_dtb.h b/src/net/drivers/net/ethernet/dinghai/en_aux/drs_sec_dtb.h new file mode 100755 index 0000000..ed07b7f --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_aux/drs_sec_dtb.h @@ -0,0 +1,537 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : drs_sec.dtb.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : +* 完成日期 : 2024/01/29 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ +#ifndef DRS_SEC_DTB_H +#define DRS_SEC_DTB_H +/*同步pub宏定义*/ +typedef void VOID; +typedef float FLOAT; +typedef double DOUBLE; + +typedef signed char INT8; +typedef unsigned char UINT8; + +typedef char CHAR; + + +typedef signed short INT16; +typedef unsigned short UINT16; + +typedef signed int INT32; +typedef unsigned int UINT32; + + +typedef signed long long INT64; +typedef unsigned long long UINT64; + +#define BITWIDTH1 ((UINT32)0x00000001) +#define BITWIDTH2 ((UINT32)0x00000003) +#define BITWIDTH3 ((UINT32)0x00000007) +#define BITWIDTH4 ((UINT32)0x0000000f) +#define BITWIDTH5 ((UINT32)0x0000001f) +#define BITWIDTH6 ((UINT32)0x0000003f) +#define BITWIDTH7 ((UINT32)0x0000007f) +#define BITWIDTH8 ((UINT32)0x000000ff) +#define BITWIDTH9 ((UINT32)0x000001ff) +#define BITWIDTH10 ((UINT32)0x000003ff) +#define BITWIDTH11 ((UINT32)0x000007ff) +#define BITWIDTH12 ((UINT32)0x00000fff) +#define BITWIDTH13 ((UINT32)0x00001fff) +#define BITWIDTH14 ((UINT32)0x00003fff) +#define BITWIDTH15 ((UINT32)0x00007fff) +#define BITWIDTH16 ((UINT32)0x0000ffff) +#define BITWIDTH17 ((UINT32)0x0001ffff) +#define BITWIDTH18 ((UINT32)0x0003ffff) +#define BITWIDTH19 ((UINT32)0x0007ffff) +#define BITWIDTH20 ((UINT32)0x000fffff) +#define BITWIDTH21 ((UINT32)0x001fffff) +#define BITWIDTH22 ((UINT32)0x003fffff) +#define BITWIDTH23 ((UINT32)0x007fffff) +#define BITWIDTH24 ((UINT32)0x00ffffff) +#define BITWIDTH25 ((UINT32)0x01ffffff) +#define BITWIDTH26 ((UINT32)0x03ffffff) +#define BITWIDTH27 ((UINT32)0x07ffffff) +#define BITWIDTH28 ((UINT32)0x0fffffff) +#define BITWIDTH29 ((UINT32)0x1fffffff) +#define BITWIDTH30 ((UINT32)0x3fffffff) +#define BITWIDTH31 ((UINT32)0x7fffffff) +#define BITWIDTH32 ((UINT32)0xffffffff) + + + +#define PUB_OK (0) +#define PUB_ERROR (0xffffffff)/*直接定义为0xffffffff*/ + +#define BTTL_PRINTF(fmt, arg...) DH_LOG_INFO(MODULE_SEC, fmt, ##arg) +#define BTTL_PUB_PRINT_ERROR(fmt, arg...) DH_LOG_ERR(MODULE_SEC, fmt, ##arg) + + +/* 寄存器单bit位操作 */ + +/** 某bit置位,其它bit不变 */ +#define PUB_BIT_SET(reg, bit) ((reg) = ((reg) | (1u << (bit)))) + +/** 某bit清零,其它bit不变 */ +#define PUB_BIT_CLEAR(reg, bit) ((reg) = ((reg) & (~(1u << (bit))))) + +/** 获取某bit的值 (0/1) */ +#define PUB_GET_BIT_VAL(reg, bit) (((reg)>> (bit)) & 1u) + +/** 判断某bit的值是否为1 */ +#define PUB_IS_BIT_SET(reg, pos) (((reg) & (1u << (pos))) != 0x0u) + +/** 判断某bit的值是否为0 */ +#define PUB_IS_BIT_CLEAR(reg, pos) (((reg) & (1u << (pos))) == 0x0u) + +/** 某bit位填写值val,其他bit不变 */ +#define PUB_BIT_INSR(reg, bit, val) \ + ((reg) = (((reg) & (~(1u << (bit)))) | (((val) & 1u) << (bit)))) + + +#define PUB_BIT_FIELD_MASK_GET64(bitoff, bitfieldlen) \ +((((UINT64)0x01 << (bitfieldlen)) - 1) << (bitoff)) + +#define PUB_BIT_FIELD_GET64(val, bitoff, bitfieldlen) \ +((val) & PUB_BIT_FIELD_MASK_GET64(bitoff, bitfieldlen)) + +#define PUB_BIT_FIELD_SET64(var, val, bitoff, bitlen) \ +((var) = (((var) & (~ PUB_BIT_FIELD_MASK_GET64(bitoff, bitlen))) | (((UINT64)val) << (bitoff)))) + +#define PUB_BIT_FIELD_RIGHT_JUST_GET64(val, bitoff, bitfieldlen) \ +(((val) >> (bitoff)) & (((UINT64)0x01 << (bitfieldlen)) - 1)) + +/** 检查空指针,返回错误 */ +#define PUB_CHECK_NULL_PTR_RET_ERR(ptr) \ + do{\ + if(NULL == ptr){\ + DH_LOG_INFO(MODULE_SEC, "Null Ptr Err! Fuc:%s,Line:%d,File:%s\n", __FUNCTION__,__LINE__,__FILE__);\ + return PUB_ERROR;\ + }\ + }while(0) + +/** 检查空指针,返回VOID */ +#define PUB_CHECK_NULL_PTR_RET_VOID(ptr) \ + do{\ + if(NULL == ptr){\ + DH_LOG_INFO(MODULE_SEC, "Null Ptr Err! Fuc:%s,Line:%d,File:%s\n", __FUNCTION__,__LINE__,__FILE__);\ + return;\ + }\ + }while(0) + +#define PUB_CHECK_RET_VAL_RV(expr) \ + do { \ + UINT32 _ret = (expr); \ + if (PUB_OK != _ret) \ + { \ + DH_LOG_INFO(MODULE_SEC, "%s Error,Line:%d,Ret:0x%x\n", __FUNCTION__,__LINE__,_ret); \ + return _ret; \ + } \ + } while (0) + +#define BTTL_PUB_ID_CHECK(id, cmpid) \ + do{\ + if(cmpid <= (id)){\ + DH_LOG_INFO(MODULE_SEC, " ID %d <= %d check Err! Fuc:%s,Line:%d,File:%s\n", id, cmpid, __FUNCTION__,__LINE__,__FILE__);\ + return 1;\ + }\ + }while(0) + +#define BTTL_PUB_0_CHECK(value) \ + do{\ + if(0 == (value)){\ + DH_LOG_INFO(MODULE_SEC, " value %x 0 check Err! Fuc:%s,Line:%d,File:%s\n", value, __FUNCTION__,__LINE__,__FILE__);\ + return E_INVALID_VALUE;\ + }\ + }while(0) + +/* 大小端操作 */ +/** 16位数据大小端转换 */ +#define PUB_SWAP16(x) ((UINT16)((((x) >> 8) & 0xffu) | (((x) & 0xffu) << 8))) +/** 32位数据大小端转换 */ +#define PUB_SWAP32(x) \ + ((UINT32)( \ + (((UINT32)(x) & (UINT32)0x000000ffUL) << 24) | \ + (((UINT32)(x) & (UINT32)0x0000ff00UL) << 8) | \ + (((UINT32)(x) & (UINT32)0x00ff0000UL) >> 8) | \ + (((UINT32)(x) & (UINT32)0xff000000UL) >> 24) )) +/** 64位数据大小端转换 */ +#define PUB_SWAP64(x) \ + ((UINT64)( \ + (((UINT64)(x) & (UINT64)0x00000000000000ffUL) << 56) | \ + (((UINT64)(x) & (UINT64)0x000000000000ff00UL) << 40) | \ + (((UINT64)(x) & (UINT64)0x0000000000ff0000UL) << 24) | \ + (((UINT64)(x) & (UINT64)0x00000000ff000000UL) << 8 ) | \ + (((UINT64)(x) & (UINT64)0x000000ff00000000UL) >> 8 ) | \ + (((UINT64)(x) & (UINT64)0x0000ff0000000000UL) >> 24) | \ + (((UINT64)(x) & (UINT64)0x00ff000000000000UL) >> 40) | \ + (((UINT64)(x) & (UINT64)0xff00000000000000UL) >> 56) )) + + +/* 已知数据的大小端,转换为网络序 */ +#define PUB_LE_TO_NET16(x) PUB_SWAP16(x) /**< 将小端数据转换为网络序 */ +#define PUB_LE_TO_NET32(x) PUB_SWAP32(x) /**< 将小端数据转换为网络序 */ +#define PUB_LE_TO_NET64(x) PUB_SWAP64(x) /**< 将小端数据转换为网络序 */ +#define PUB_DE_TO_NET16(x) (x) /**< 将大端数据转换为网络序 */ +#define PUB_DE_TO_NET32(x) (x) /**< 将大端数据转换为网络序 */ +#define PUB_DE_TO_NET64(x) (x) /**< 将大端数据转换为网络序 */ + + +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + +#define PUB_LE_TO_HOST16(x) PUB_SWAP16(x) /**< 小端16位数据转换为主机序 */ +#define PUB_LE_TO_HOST32(x) PUB_SWAP32(x) /**< 小端32位数据转换为主机序 */ +#define PUB_LE_TO_HOST64(x) PUB_SWAP64(x) /**< 小端64位数据转换为主机序 */ +#define PUB_DE_TO_HOST16(x) (x) /**< 大端16位数据转换为主机序 */ +#define PUB_DE_TO_HOST32(x) (x) /**< 大端32位数据转换为主机序 */ +#define PUB_DE_TO_HOST64(x) (x) /**< 大端64位数据转换为主机序 */ +#define PUB_HTON16(x) (x) /**< 16位数据主机序转换为网络序 */ +#define PUB_HTON32(x) (x) /**< 32位数据主机序转换为网络序 */ +#define PUB_HTON64(x) (x) /**< 64位数据主机序转换为网络序 */ +#define PUB_NTOH16(x) (x) /**< 16位数据网络序转换为主机序 */ +#define PUB_NTOH32(x) (x) /**< 32位数据网络序转换为主机序 */ +#define PUB_NTOH64(x) (x) /**< 64位数据网络序转换为主机序 */ + + +#else +#define PUB_LE_TO_HOST16(x) (x) +#define PUB_LE_TO_HOST32(x) (x) +#define PUB_LE_TO_HOST64(x) (x) +#define PUB_DE_TO_HOST16(x) PUB_SWAP16(x) +#define PUB_DE_TO_HOST32(x) PUB_SWAP32(x) +#define PUB_DE_TO_HOST64(x) PUB_SWAP64(x) +#define PUB_HTON16(x) PUB_SWAP16(x) +#define PUB_HTON32(x) PUB_SWAP32(x) +#define PUB_HTON64(x) PUB_SWAP64(x) +#define PUB_NTOH16(x) PUB_SWAP16(x) +#define PUB_NTOH32(x) PUB_SWAP32(x) +#define PUB_NTOH64(x) PUB_SWAP64(x) + + +#endif + +/*因为SEC下表和NP下表硬件基本一样,这里同步NP关于EPID等定义*/ +#define VF_ACTIVE(VPORT) ((VPORT & 0x0800) >> 11) +#define EPID(VPORT) ((VPORT & 0x7000) >> 12) +#define FUNC_NUM(VPORT) ((VPORT & 0x0700) >> 8) +#define VFUNC_NUM(VPORT) ((VPORT & 0x00FF)) + +#define PF_VQM_VFID_OFFSET (1152) +#define IS_PF(VPORT) (!VF_ACTIVE(VPORT)) +#define VQM_VFID(VPORT) (IS_PF(VPORT) ? \ + (PF_VQM_VFID_OFFSET + EPID(VPORT) * 8 + FUNC_NUM(VPORT)) : \ + (EPID(VPORT) * 256 + VFUNC_NUM(VPORT))) + +#define OWNER_PF_VQM_VFID(VPORT) (PF_VQM_VFID_OFFSET + EPID(VPORT) * 8 + FUNC_NUM(VPORT)) +#define OWNER_PF_VPORT(VPORT) (((EPID(VPORT)) << 12) | ((FUNC_NUM(VPORT)) << 8)) + +#define VQM_VFID_MAX_NUM (2048) + +/*vport格式 +15 |14 13 12 | 11 |10 9 8|7 6 5 4 3 2 1 0| +rsv| ep_id |func_active|func_num| vfunc_num | +*/ +#define VPORT_EPID_BT_START (12) /*EPID起始位*/ +#define VPORT_EPID_BT_LEN (3) /*EPID长度*/ +#define VPORT_FUNC_ACTIVE_BT_START (11) /*FUNC_ACTIVE起始位*/ +#define VPORT_FUNC_ACTIVE_BT_LEN (1) /*FUNC_ACTIVE长度*/ +#define VPORT_FUNC_NUM_BT_START (8) /*FUNC_NUM起始位*/ +#define VPORT_FUNC_NUM_BT_LEN (3) /*FUNC_NUM长度*/ +#define VPORT_VFUNC_NUM_BT_START (0) /*FUNC_NUM起始位*/ +#define VPORT_VFUNC_NUM_BT_LEN (8) /*FUNC_NUM长度*/ + +/** +* @name 通用寄存器操作宏 +* @brief 读寄存器宏定义 +* @{ +*/ +#define PUB_READ_REG8(addr) (*(volatile UINT8 *)(addr)) /**< 读8位寄存器 */ +#define PUB_READ_REG16(addr) (*(volatile UINT16 *)(addr)) /**< 读16位寄存器 */ +#define PUB_READ_REG32(addr) (*(volatile UINT32 *)(addr)) /**< 读32位寄存器 */ +/** @} 通用寄存器操作宏 */ + +/** +* @name 通用寄存器操作宏 +* @brief 写寄存器宏定义 +* @{ +*/ +#define PUB_WRITE_REG8(addr, val_8) (*(volatile UINT8 *)(addr) = val_8) /**< 写8位寄存器 */ +#define PUB_WRITE_REG16(addr, val_16) (*(volatile UINT16 *)(addr) = val_16) /**< 写16位寄存器 */ +#define PUB_WRITE_REG32(addr, val_32) (*(volatile UINT32 *)(addr) = val_32) /**< 写32位寄存器 */ +/** @} 通用寄存器操作宏 */ + + +/*寄存器偏移定义*/ +#define REG_SEC_IDX_OFFSET (0x800000) /* SEC内部基地址偏移 */ + +#define REG_SEC_TOP_DTB_OFFSET (0) /*host驱动 这里为0,因为就是从dtb开始映射的*/ +/* CFG_QUEUE_DTB_ADDR_H_0_127 虚机队列入队的高地址寄存器 n=0~127 */ +#define REG_SEC_CFG_QUEUE_DTB_ADDR_H_0_127(n) (REG_SEC_TOP_DTB_OFFSET + 0x0000 + n*32) + +/* CFG_QUEUE_DTB_ADDR_L_0_127 虚机队列入队的低地址寄存器 n=0~127*/ +#define REG_SEC_CFG_QUEUE_DTB_ADDR_L_0_127(n) (REG_SEC_TOP_DTB_OFFSET + 0x0004 + n*32) + +/* CFG_QUEUE_DTB_LEN_0_127 虚机队列入队的长度寄存器 n=0~127*/ +#define REG_SEC_CFG_QUEUE_DTB_LEN_0_127(n) (REG_SEC_TOP_DTB_OFFSET + 0x0008 + n*32) + +/* INFO_QUEUE_BUF_SPACE_LEFT_0_127 靠靠靠靠靠靠?n=0~127*/ +#define REG_SEC_INFO_QUEUE_BUF_SPACE_LEFT_0_127(n) (REG_SEC_TOP_DTB_OFFSET + 0x000C + n*32) + +/* CFG_EPID_V_FUNC_NUM_0_127 SOC虚机信息配置寄存器 n=0~127*/ +#define REG_SEC_CFG_EPID_V_FUNC_NUM_0_127(n) (REG_SEC_TOP_DTB_OFFSET + 0x0010 + n*32) + +/* DTB_QUEUE_LOCK_STATE_0_3 队列锁状态寄存器,4个寄存器共128bit,对应队列0~127 n=0~3 */ +#define REG_SEC_DTB_QUEUE_LOCK_STATE_0_3(n) (REG_SEC_TOP_DTB_OFFSET + 0x4080 + n*4) + +typedef enum +{ + e_SEC_IPSEC_TRANSPORT_MODE = 0, /*传输模式*/ + e_SEC_IPSEC_TUNNEL_MODE, /*隧道模式*/ + e_SEC_IPSEC_MODE_LAST, +} E_CMDK_SEC_IPSEC_MODE; + +typedef enum +{ + e_SEC_SA_DF_BYPASS_MODE = 0, /*00 bypass DF bit*/ + e_SEC_SA_DF_CLEAR_MODE, /*01 clear*/ + e_SEC_SA_DF_SET_MODE, /*10 set*/ + e_SEC_SA_DF_COPY_MODE, /*11 copy*/ + e_SEC_SA_DF_MODE_LAST, +} E_CMDK_SEC_SA_DF_MODE; + +typedef enum +{ + E_DTB_SA_CMD_FLOW_DOWN = 0, + E_DTB_SA_CMD_DUMP, + E_DTB_SA_CMD_LAST, +} E_CMDK_DTB_SA_CMD_TYPE; + +typedef enum +{ + E_SATYPE_IN = 1, + E_SATYPE_OUT , + E_SATYPE_IN_AND_OUT = 3, +}E_SA_TYPE; + +typedef enum +{ + E_INLINE_IN, + E_INLINE_OUT, + E_INLINE_IN_AND_OUT, +}E_INLINE_TYPE; + +typedef enum +{ + e_SEC_ENCRYP_AH_MODE = 0, /*000 AH认证*/ + e_SEC_ENCRYP_ESP_AUTH_MODE, /*001 ESP完整性*/ + e_SEC_ENCRYP_ESP_ENCRYP_MODE, /*010 ESP加密*/ + e_SEC_ENCRYP_ESP_AUTH_AND_ESP_ENCRYP_MODE, /*011 ESP加密+ESP完整*/ + e_SEC_ENCRYP_ESP_COMBINED_MODE, /*100 ESP组合模式*/ + e_SEC_ENCRYP_MODE_LAST, +} E_CMDK_SEC_ENCRYP_MODE; + +typedef enum +{ + e_SEC_SA_LIVETIME_NONE_TYPE = 0, /*00 none*/ + e_SEC_SA_LIVETIME_TIME_TYPE, /*01 生存时间*/ + e_SEC_SA_LIVETIME_BYTE_TYPE, /*10 byte数*/ + e_SEC_SA_LIVETIME_PKT_TYPE, /*11 pkt数(预留,目前不支持)*/ + e_SEC_SA_LIVETIME_TYPE_LAST, +} E_CMDK_LIVETIME_TYPES; + +#pragma pack(1) +typedef struct IPV4_HEAD +{ + UINT8 ip_headlen_version; + UINT8 ip_tos; + UINT16 usTotallen; + + UINT16 usIdentify; + UINT16 ip_fragoff; + + UINT8 uclive_time; + UINT8 ucProtocal; + UINT16 usHeadChecksum; + + UINT32 udSrcIpAddr; + UINT32 udDstIpAddr; +}T_IPV4_HEAD; +#pragma pack() + +typedef struct +{ + UINT32 DtbAddrH; /*地址的高32位*/ + UINT32 DtbAddrL; /*地址的低32位,两个地址组成64位然后左移4位得到68位的真实地址*/ + UINT32 DtbCmd; /*研规上的DTB_LEN字段 */ +}T_QUEUE_DTB_REG; + +//SA下表模块使用的结构体 +typedef struct +{ + UINT32 udSPI; + UINT32 udSaId; + UINT16 usSaParam; + UINT8 ucCiperID; + UINT8 ucAuthID; + UINT8 ucCipherkeyLen; + UINT8 ucAuthkeyLen; + UINT16 usFrag_State; + + UINT32 udESN; + UINT32 udSN; + UINT64 uddProcessedByteCnt; + + UINT32 udSalt; + UINT32 udLifetimeSecMax; + UINT64 uddLifetimByteCntMax; + + UINT8 ucProtocol; + UINT8 ucTOS; + UINT8 ucEsnFlag; + UINT8 ucIpType; + UINT32 udRSV0; + UINT32 udRSV1; + UINT32 udRSV2; + + UINT32 udSrcAddress0; + UINT32 udSrcAddress1; + UINT32 udSrcAddress2; + UINT32 udSrcAddress3; + + UINT32 udDstAddress0; + UINT32 udDstAddress1; + UINT32 udDstAddress2; + UINT32 udDstAddress3; + + UINT8 aucSaCipherKey[32]; + UINT8 aucSaAuthKey[128]; +}__attribute__((packed))T_HAL_SA_DTB_HW_OUT; + + typedef struct +{ + + UINT32 udSrcAddress0; + UINT32 udSrcAddress1; + UINT32 udSrcAddress2; + UINT32 udSrcAddress3; + + UINT32 udDstAddress0; + UINT32 udDstAddress1; + UINT32 udDstAddress2; + UINT32 udDstAddress3; + + UINT32 udSPI; + UINT32 udSaId; + UINT16 usSaParam; + UINT8 ucCiperID; + UINT8 ucAuthID; + UINT8 ucCipherkeyLen; + UINT8 ucAuthkeyLen; + UINT16 usFrag_State; + + UINT32 udSalt; + UINT32 udLifetimeSecMax; + UINT64 uddLifetimByteCntMax; + + UINT8 ucProtocol; + UINT8 ucTOS; + UINT8 ucEsnFlag; + UINT8 ucIpType; + UINT16 usOutSaOffset; + UINT16 udRSV0; + UINT32 udOutSaId; + UINT32 udRSV1; + + UINT8 aucBitmap[256]; + + UINT32 udAntiWindowHigh; + UINT32 udAntiWindowLow; + UINT64 uddProcessedByteCnt; + + UINT8 aucSaCipherKey[32]; + UINT8 aucSaAuthKey[128]; +}__attribute__((packed))T_HAL_SA_DTB_HW_IN; + +typedef enum +{ + e_HAL_IPSEC_CIPHER_NULL = 0x00, + e_HAL_IPSEC_CIPHER_AES_CTR = 0x11, + e_HAL_IPSEC_CIPHER_AES_CBC = 0x12, + e_HAL_IPSEC_CIPHER_AES_ECB = 0x13, + e_HAL_IPSEC_CIPHER_AES_GCM = 0x14, + e_HAL_IPSEC_CIPHER_AES_CCM = 0x15, + e_HAL_IPSEC_CIPHER_AES_GMAC = 0x16, + /* 新增SM4算法 */ + e_HAL_IPSEC_CIPHER_SM4_CTR = 0x17, + e_HAL_IPSEC_CIPHER_SM4_CBC = 0x18, + e_HAL_IPSEC_CIPHER_SM4_ECB = 0x19, + /* 新增XTS算法 */ + e_HAL_IPSEC_CIPHER_AES_XTS = 0x1a, + e_HAL_IPSEC_CIPHER_SM4_XTS = 0x1b, + + e_HAL_IPSEC_CIPHER_DES_CBC = 0x31, + e_HAL_IPSEC_CIPHER_3DES_CBC = 0x32, + e_HAL_IPSEC_CIPHER_CHACHA = 0x50, +}E_HAL_SEC_IPSEC_CIPHER_ALG; + +typedef enum +{ + e_HAL_IPSEC_AUTH_NULL = 0x00, + + /* 新增 */ + e_HAL_IPSEC_AUTH_AES_GMAC = 0x16, /* 1 */ + e_HAL_IPSEC_AUTH_SM4_GMAC = 0x1e, + + e_HAL_IPSEC_AUTH_AES_CMAC32 = 0x22, /* 3 */ + e_HAL_IPSEC_AUTH_AES_CMAC96 = 0x23, + e_HAL_IPSEC_AUTH_AES_XCBCMAC = 0x21, + e_HAL_IPSEC_AUTH_AES_SHA1 = 0x41, /* 6 */ + e_HAL_IPSEC_AUTH_AES_SHA224 = 0x42, + e_HAL_IPSEC_AUTH_AES_SHA256 = 0x44, + e_HAL_IPSEC_AUTH_AES_SHA384 = 0x45, + e_HAL_IPSEC_AUTH_AES_SHA512 = 0x46, + e_HAL_IPSEC_AUTH_AES_MD5 = 0x43, + e_HAL_IPSEC_AUTH_SM3 = 0x47, +}E_HAL_SEC_IPSEC_AUTH_ALG; + +typedef struct +{ + char alg_name[64]; + char compat_name[64]; + E_HAL_SEC_IPSEC_CIPHER_ALG e_zxdh_ealgo_id; +}T_ZXDH_EALGO; + +typedef struct +{ + char alg_name[64]; + char compat_name[64]; + E_HAL_SEC_IPSEC_AUTH_ALG e_zxdh_auth_id; +}T_ZXDH_ALGO; + + +void BttlPubDump(unsigned char *ucBuf, UINT32 udLen); +UINT32 CmdkBttlTestSecDtbSaAdd(struct zxdh_en_device *en_dev,E_CMDK_DTB_SA_CMD_TYPE eDtbSaCmdType,E_SA_TYPE eSaType,UINT64 uddSaVirAddr,UINT32 udDtbSaIsIntEn,UINT32 udDtbLen,UINT32 udQueIndex); +void zxdh_ipsec_del_sa(struct xfrm_state *xs); +bool zxdh_ipsec_offload_ok(struct sk_buff *skb, struct xfrm_state *xs); +void zxdh_ipsec_state_advance_esn (struct xfrm_state *x); +void zxdh_ipsec_state_update_curlft (struct xfrm_state *x); +int zxdh_ipsec_policy_add (struct xfrm_policy *x); +void zxdh_ipsec_policy_delete (struct xfrm_policy *x); +void zxdh_ipsec_policy_free (struct xfrm_policy *x); + +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_aux/en_1588_pkt_proc.c b/src/net/drivers/net/ethernet/dinghai/en_aux/en_1588_pkt_proc.c new file mode 100644 index 0000000..79f1a12 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_aux/en_1588_pkt_proc.c @@ -0,0 +1,489 @@ +/***************************************************************************** +(C) 2023 ZTE Corporation. 版权所有. + +文件名 : en_1588_pkt_proc.c +内容摘要 : 提供PTP数据包处理相关接口 +作者/日期 : Limin / 2023.10.12 +版本 : 1.0 +*****************************************************************************/ + +#include "en_1588_pkt_proc.h" +#include "en_ioctl.h" +#include "queue.h" + +#define PTP_MESSAGE_HRD_LEN 34 +#define IPV6_HDR_LEN 40 +#define IPV6_PROT_OFFSET 6 +#define UDP_DEST_PORT_OFFSET 2 +#define VLAN_TPID 0x8100 + +/* pi头中pkt_type字段值 */ +#define PTP_EVENT_TYPE_NOSECURITY 2 +#define PTP_EVENT_TYPE_SECURITY 3 +#define PTP_GENERAL_TYPE 0 +#define PTP_TYPE_OFFSET 4 +/* 下行层四1588微码是否需要查询ipsec表 */ +#define PTP_L4_NEED_QUERY_IPSEC_TABLE 1 +#define PTP_TYPE_L4_SECURITY_OFFSET 3 + +/* L3报文类型 */ +#define ETH_TYPE_PTP 0x88f7 +#define ETH_TYPE_IPV4 0x0800 +#define ETH_TYPE_IPV6 0x86dd + +/* L4报文类型 */ +#define ETH_TYPE_UDP 0x11 +#define ETH_TYPE_TCP 0x06 + +#define UDP_HDR_LEN 0x08 +#define TCP_HDR_LEN 0x14 + +/* 报文中关键字段的长度 */ +#define ETHER_TYPE_LEN 2 +#define ETHER_MAC_LEN 6 +#define L2_PKT_HDR_LEN ((2 * ETHER_MAC_LEN) + ETHER_TYPE_LEN) + +#define IP_PROT_OFFSET 9 /* IP头中protocol字段的偏移 */ + +#define PTP_MSG_ERROR_TYPE 0xff +#define PTPHDR_CF_OFFSET 8 + +#define VLAN_LEN 4 + +extern int get_hw_timestamp(struct zxdh_en_device *en_dev, u32 *hwts); +/* PTP报文类型和处理函数对应关系结构体 */ +typedef struct +{ + uint8_t type; + int32_t (*proc_func)(struct sk_buff *skb, \ + struct zxdh_net_hdr *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct zxdh_en_device *en_dev); +} MsgProc_t; + +typedef struct +{ + uint8_t type; + int32_t (*proc_func)(struct zxdh_net_hdr_rcv *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct skb_shared_info *ptSkbSharedInfo, + struct zxdh_en_device *en_dev); +} MsgRcv_t; + +/* PTP报文类型和处理函数对应关系表 */ +MsgProc_t g_MsgProcTable[] = +{ + {PTP_MSG_TYPE_SYNC, pkt_proc_type_sync }, + {PTP_MSG_TYPE_DELAY_REQ, pkt_proc_type_delay_req }, + {PTP_MSG_TYPE_PDELAY_REQ, pkt_proc_type_pdelay_req }, + {PTP_MSG_TYPE_PDELAY_RESP, pkt_proc_type_pdelay_resp }, + + {PTP_MSG_TYPE_FOLLOW_UP, pkt_proc_type_follow_up }, + {PTP_MSG_TYPE_DELAY_RESP, pkt_proc_type_delay_resp }, + {PTP_MSG_TYPE_PDELAY_RESP_FOLLOW_UP, pkt_proc_type_pdelay_resp_follow_up}, + {PTP_MSG_TYPE_ANNOUNCE, pkt_proc_type_announce }, + {PTP_MSG_TYPE_SIGNALING, pkt_proc_type_signaling }, + {PTP_MSG_TYPE_MANAGEMENT, pkt_proc_type_management }, + + {PTP_MSG_ERROR_TYPE, NULL } +}; + +MsgRcv_t g_MsgRcvTable[] = +{ + {PTP_MSG_TYPE_SYNC, pkt_rcv_type_event }, + {PTP_MSG_TYPE_DELAY_REQ, pkt_rcv_type_event }, + {PTP_MSG_TYPE_PDELAY_REQ, pkt_rcv_type_event }, + {PTP_MSG_TYPE_PDELAY_RESP, pkt_rcv_type_event }, + + {PTP_MSG_TYPE_DELAY_RESP, pkt_rcv_type_delay_resp }, + + {PTP_MSG_ERROR_TYPE, NULL } +}; + +/* 判断是否为事件报文 */ +bool is_event_message(const uint8_t msg_type) +{ + if (msg_type <= PTP_MSG_TYPE_PDELAY_RESP) + { + return true; + } + return false; +} + +/* 判断是否为普通报文 */ +bool is_general_message(const uint8_t msg_type) +{ + if ((PTP_MSG_TYPE_FOLLOW_UP <= msg_type) && (msg_type <= PTP_MSG_TYPE_MANAGEMENT)) + { + return true; + } + return false; +} + +/* p得到PTP报文头位置 */ +int32_t get_hdr_point(uint8_t *pData, uint8_t *piTs0ffset, uint8_t **ptpHdr) +{ + uint16_t udp_dest_port_ptp = 0; + uint16_t offset = 0; + uint16_t temp_len = 0; + uint16_t eth_type_lay3 = ntohs(*((uint16_t*)(pData + (2 * ETHER_MAC_LEN)))); /* get Eth Type */ + uint8_t eth_type_lay4 = 0; + uint8_t eth_type_lay4_ipv6 = 0; + uint16_t eth_type_vlan_lay3 = ntohs(*((uint16_t*)(pData + (2 * ETHER_MAC_LEN) + VLAN_LEN))); + + /* 计算PTP头的偏移 */ + offset = L2_PKT_HDR_LEN; + + if ((VLAN_TPID == eth_type_lay3) && (VLAN_TPID != eth_type_vlan_lay3)) /* 单vlan偏移 */ + { + offset += VLAN_LEN; + } + else if ((VLAN_TPID == eth_type_lay3) && (VLAN_TPID == eth_type_vlan_lay3)) /* 双vlan偏移 */ + { + offset += (VLAN_LEN * 2); + } + + eth_type_lay3 = ntohs(*((uint16_t*)(pData + offset - ETHER_TYPE_LEN))); + eth_type_lay4 = *(pData + offset + IP_PROT_OFFSET); + + eth_type_lay4_ipv6 = *(pData + offset + IPV6_PROT_OFFSET); + + if ((ETH_TYPE_PTP != eth_type_lay3) && (ETH_TYPE_IPV4 != eth_type_lay3) && (ETH_TYPE_IPV6 != eth_type_lay3)) + { + LOG_ERR("unknown L3 eth type: %d\n", eth_type_lay3); + return IS_NOT_PTP_MSG; + } + + if (ETH_TYPE_IPV4 == eth_type_lay3) + { + /* IP首部第一字节: 版本(4b)+首部长度(4b),这里取低4位,长度是以4字节为单位 */ + temp_len = *(pData + offset); + temp_len = (temp_len & 0x0f) * 4; + offset += temp_len; + + /* L4类型PTP只有UDP */ + if (ETH_TYPE_UDP == eth_type_lay4) + { + udp_dest_port_ptp = ntohs(*(uint16_t *)(pData + offset + UDP_DEST_PORT_OFFSET)); + if ((udp_dest_port_ptp != 319) && (udp_dest_port_ptp != 320)) + { + LOG_ERR("UDP destination port(%hd) is not 319 or 320!!\n", udp_dest_port_ptp); + return IS_NOT_PTP_MSG; + } + temp_len = UDP_HDR_LEN; + offset += temp_len; + } + else + { + LOG_ERR("eth_type_lay4 = %c, is not UDP!!!!!\n", eth_type_lay4); + return IS_NOT_PTP_MSG; + } + } + else if(ETH_TYPE_IPV6 == eth_type_lay3) + { + temp_len = IPV6_HDR_LEN; + offset += temp_len; + + /* L4类型PTP只有UDP */ + if (ETH_TYPE_UDP == eth_type_lay4_ipv6) + { + udp_dest_port_ptp = ntohs(*(uint16_t *)(pData + offset + UDP_DEST_PORT_OFFSET)); + if ((udp_dest_port_ptp != 319) && (udp_dest_port_ptp != 320)) + { + LOG_ERR("UDP destination port(%hd) is not 319 or 320!!\n", udp_dest_port_ptp); + return IS_NOT_PTP_MSG; + } + temp_len = UDP_HDR_LEN; + offset += temp_len; + } + else + { LOG_ERR("eth_type_lay4_ipv6 = %c, is not UDP!!!!!!\n",eth_type_lay4_ipv6); + return IS_NOT_PTP_MSG; + } + } + + *ptpHdr = pData + offset; + + /* 赋值pd头的ts_offset字段 */ + *piTs0ffset = offset; + + return PTP_SUCCESS; +} + +/* 从PTP报文头中解析出报文类型 */ +uint8_t get_msgtype_from_hrd(uint8_t *hrd, const uint8_t len) +{ + uint8_t msg_type = PTP_MSG_ERROR_TYPE; + + CHECK_UNEQUAL_ERR(len, PTP_MESSAGE_HRD_LEN, -EFAULT, "error len %d!", len); + + msg_type = hrd[0] & 0x0f; + if (is_event_message(msg_type) || is_general_message(msg_type)) + { + return msg_type; + } + + LOG_ERR("error message type %d", msg_type); + return PTP_MSG_ERROR_TYPE; +} + +/* 调用PTP模块驱动接口,读取3个时间戳:两个80bit(T1,T2),一个32bit(T3) */ +#ifdef PTP_DRIVER_INTERFACE_EN +extern int get_pkt_timestamp(int32_t clock_no, struct zxdh_en_device *en_dev, struct time_stamps *ts, u32 *hwts); +#endif /* PTP_DRIVER_INTERFACE_EN */ + +int32_t get_tstamps_from_ptp(int32_t clock_no, struct time_stamps *t5g, struct time_stamps *tsn, uint32_t *thw, struct zxdh_en_device *en_dev) +{ + uint32_t hwts = 0; + struct time_stamps ts[2] = {}; + +#ifdef PTP_DRIVER_INTERFACE_EN + int32_t ret = 0; + ret = get_pkt_timestamp(clock_no, en_dev, ts, &hwts);//todo + if (unlikely(ret != 0)) + { + LOG_ERR("netdev %s get tsn clock %d failed!, ret = %d", en_dev->netdev->name,clock_no,ret); + return -1; + } +#endif /* PTP_DRIVER_INTERFACE_EN */ + + LOG_DEBUG("===GET-PTP===: hwts=%u", hwts); + LOG_DEBUG("===GET-PTP===: ts[0].s=%llu, ts[0].ns=%u", ts[0].s, ts[0].ns); + LOG_DEBUG("===GET-PTP===: ts[1].s=%llu, ts[1].ns=%u", ts[1].s, ts[1].ns); + + *t5g = ts[1]; + *tsn = ts[1]; + *thw = hwts; + + return 0; +} +#ifdef TIME_STAMP_1588 +/* 发送流程中的报文时间戳处理 */ +int32_t pkt_1588_proc_xmit(struct sk_buff *skb, struct zxdh_net_hdr *hdr, int32_t clock_no, struct zxdh_en_device *en_dev) +{ + struct time_stamps ts_5g; /* 5G时间戳,有效值80bit */ + struct time_stamps ts_tsn; /* TSN时间戳,有效值80bit */ + uint32_t ts_thw = 0; /* 硬件当前时间戳,有效值32bit */ + uint8_t *pData = NULL; + uint8_t *ptpHdr = NULL; + uint8_t ret = 0; + uint8_t i = 0; + uint8_t cnt = 0; + uint8_t msg_type = 0xff; + struct ptpHdr_t *ptPtpHdr = NULL; + + memset(&ts_5g, 0, sizeof(struct time_stamps)); + memset(&ts_tsn, 0, sizeof(struct time_stamps)); + + CHECK_EQUAL_ERR(skb, NULL, -EADDRNOTAVAIL, "skb is NULL!\n"); + CHECK_EQUAL_ERR(hdr, NULL, -EADDRNOTAVAIL, "hdr is NULL!\n"); + + pData = skb->data; + + /* 获得ptp报文头指针&赋值pd头ts_offset字段 */ + ret = get_hdr_point(pData, &(hdr->ts_offset), &ptpHdr); + CHECK_EQUAL_ERR(ptpHdr, NULL, -EADDRNOTAVAIL, "get ptp hdr failed!\n"); + CHECK_UNEQUAL_ERR(ret, 0, ret, "is not ptp msg or get hdr err!!\n"); + + ptPtpHdr = (struct ptpHdr_t *)ptpHdr; + char * phdr = (char *)ptPtpHdr; + + /* 解析PTP报文类型 */ + msg_type = get_msgtype_from_hrd(ptpHdr, PTP_MESSAGE_HRD_LEN); + CHECK_EQUAL_ERR(msg_type, PTP_MSG_ERROR_TYPE, -EFAULT, "unknow PTP msg type!\n"); + + /* 如果是事件报文,提取时间戳 */ + if (is_event_message(msg_type)) + { + ret = get_tstamps_from_ptp(clock_no, &ts_5g, &ts_tsn, &ts_thw, en_dev); + CHECK_UNEQUAL_ERR(ret, 0, -EFAULT, "get tstamps from ptp failed!\n"); + + /* ptp_type[2]的低bit2-4表示pkt_type,加密事件报文类型为2,非加密事件报文为3, */ + hdr->ptp_type[2] = (hdr->ptp_type[2] & 0x8F) + (PTP_EVENT_TYPE_NOSECURITY << PTP_TYPE_OFFSET); + if (0 != ((ptPtpHdr->flagField) & 0x0080)) + { + hdr->ptp_type[2] = (hdr->ptp_type[2] & 0x8F) + (PTP_EVENT_TYPE_SECURITY << PTP_TYPE_OFFSET); + } + } + else + { + /* 普通报文类型为0 */ + hdr->ptp_type[2] = (hdr->ptp_type[2] & 0x8F) + (PTP_GENERAL_TYPE << PTP_TYPE_OFFSET); + } + /* 层四1588报文,下行微码处理时,是否需要查ipsec表, 加密报文需要 */ + LOG_INFO("ptPtpHdr->flagField: 0x%x\n", ptPtpHdr->flagField); + if (0 != ((ptPtpHdr->flagField) & 0x0080)) + { + hdr->ptp_type[2] = (hdr->ptp_type[2] & 0xF7) + (PTP_L4_NEED_QUERY_IPSEC_TABLE << PTP_TYPE_L4_SECURITY_OFFSET); + LOG_INFO("hdr->ptp_type[2]: 0x%x\n", hdr->ptp_type[2]); + } + /* 层二发送方向的出端口需要这里指示 */ + hdr->port = en_dev->phy_port; + + /* 根据不同报文类型做不同处理 */ + cnt = sizeof(g_MsgProcTable) / sizeof(MsgProc_t); + for (i = 0; i < cnt; i++) + { + if (g_MsgProcTable[i].type == msg_type) + { + if (likely(g_MsgProcTable[i].proc_func != NULL)) + { + ret = g_MsgProcTable[i].proc_func(skb, hdr, ptpHdr, &ts_5g, &ts_tsn, &ts_thw, en_dev); + } + } + } + + return ret; +} +#endif +/* 接收流程中的报文时间戳处理 */ +int32_t pkt_1588_proc_rcv(struct sk_buff *skb, struct zxdh_net_hdr_rcv *hdr, int32_t clock_no, struct zxdh_en_device *en_dev) +{ + struct time_stamps ts_5g; /* 5G时间戳,有效值80bit */ + struct time_stamps ts_tsn; /* TSN时间戳,有效值80bit */ + uint32_t ts_thw = 0; /* 硬件当前时间戳,有效值32bit */ + uint8_t *pData = NULL; + uint8_t *ptpHdr = NULL; + int32_t ret = 0; + uint8_t i = 0; + uint8_t cnt = 0; + uint8_t msg_type = 0xff; + uint8_t piTsOffset = 0; + + memset(&ts_5g, 0, sizeof(struct time_stamps)); + memset(&ts_tsn, 0, sizeof(struct time_stamps)); + + CHECK_EQUAL_ERR(skb, NULL, -EADDRNOTAVAIL, "skb is NULL!\n"); + CHECK_EQUAL_ERR(hdr, NULL, -EADDRNOTAVAIL, "hdr is NULL!\n"); + + pData = skb->data;//TODO,大包data可能会填到非线性区,此处需要修改。 + + print_data((uint8_t *)hdr, sizeof(struct zxdh_net_hdr)+16); //todo + print_data(skb->data, skb->len); + + /* 获得ptp报文头指针&赋值pi头ts_offset字段 */ + ret = get_hdr_point(pData, &piTsOffset, &ptpHdr); + CHECK_EQUAL_ERR(ptpHdr, NULL, -EADDRNOTAVAIL, "get ptp hdr failed!\n"); + CHECK_UNEQUAL_ERR(ret, 0, ret, "is not ptp msg or get hdr err!!\n"); + + /* 解析PTP报文类型 */ + msg_type = get_msgtype_from_hrd(ptpHdr, PTP_MESSAGE_HRD_LEN); + CHECK_EQUAL_ERR(msg_type, PTP_MSG_ERROR_TYPE, -EFAULT, "unknow PTP msg type!\n"); + + /* 如果是事件报文,提取时间戳 */ + if (is_event_message(msg_type)) + { + ret = get_tstamps_from_ptp(clock_no, &ts_5g, &ts_tsn, &ts_thw, en_dev); + CHECK_UNEQUAL_ERR(ret, 0, -EFAULT, "get tstamps from ptp failed!\n"); + } + + /* 根据不同报文类型做不同处理 */ + cnt = sizeof(g_MsgRcvTable) / sizeof(MsgRcv_t); + for (i = 0; i < cnt; i++) + { + if (g_MsgRcvTable[i].type == msg_type) + { + if (likely(g_MsgRcvTable[i].proc_func != NULL)) + { + ret = g_MsgRcvTable[i].proc_func(hdr, ptpHdr, &ts_5g, &ts_tsn, &ts_thw, skb_shinfo(skb), en_dev); + } + } + } + + return ret; +} + +int32_t is_delay_statistics_pkt(uint8_t *pData) +{ + uint16_t udp_dest_port = 0; + uint16_t offset = 0; + uint16_t temp_len = 0; + uint16_t eth_type_lay3 = ntohs(*((uint16_t*)(pData + (2 * ETHER_MAC_LEN)))); /* get Eth Type */ + uint8_t eth_type_lay4 = 0; + uint8_t eth_type_lay4_ipv6 = 0; + uint16_t eth_type_vlan_lay3 = ntohs(*((uint16_t*)(pData + (2 * ETHER_MAC_LEN) + VLAN_LEN))); + + /* 计算PTP头的偏移 */ + offset = L2_PKT_HDR_LEN; + + if ((VLAN_TPID == eth_type_lay3) && (VLAN_TPID != eth_type_vlan_lay3)) /* 单vlan偏移 */ + { + offset += VLAN_LEN; + } + else if ((VLAN_TPID == eth_type_lay3) && (VLAN_TPID == eth_type_vlan_lay3)) /* 双vlan偏移 */ + { + offset += (VLAN_LEN * 2); + } + + eth_type_lay3 = ntohs(*((uint16_t*)(pData + offset - ETHER_TYPE_LEN))); + eth_type_lay4 = *(pData + offset + IP_PROT_OFFSET); + + eth_type_lay4_ipv6 = *(pData + offset + IPV6_PROT_OFFSET); + + if (ETH_TYPE_IPV4 != eth_type_lay3) + { + // LOG_ERR("unknown L4 eth type: %d\n", eth_type_lay3); + return IS_NOT_STATISTICS_PKT; + } + + if (ETH_TYPE_IPV4 == eth_type_lay3) + { + /* IP首部第一字节: 版本(4b)+首部长度(4b),这里取低4位,长度是以4字节为单位 */ + temp_len = *(pData + offset); + temp_len = (temp_len & 0x0f) * 4; + offset += temp_len; + + /* L4类型PTP只有UDP */ + if (ETH_TYPE_UDP == eth_type_lay4) + { + udp_dest_port = ntohs(*(uint16_t *)(pData + offset + UDP_DEST_PORT_OFFSET)); + if (udp_dest_port != 49184) + { + // LOG_ERR("UDP destination port(%hd) is not 49184!!\n", udp_dest_port); + return IS_NOT_STATISTICS_PKT; + } + } + else + { + // LOG_ERR("eth_type_lay4 = %c, is not UDP!!!!!\n", eth_type_lay4); + return IS_NOT_STATISTICS_PKT; + } + } + + return PTP_SUCCESS; +} + +/* delay统计报文发送流程中的时间戳处理 */ +int32_t pkt_delay_statistics_proc(struct sk_buff *skb, struct zxdh_net_hdr *hdr, struct zxdh_en_device *en_dev) +{ + uint8_t *pData = NULL; + uint8_t ret = 0; + uint32_t ts_thw = 0; + + CHECK_EQUAL_ERR(skb, NULL, -EADDRNOTAVAIL, "skb is NULL!\n"); + CHECK_EQUAL_ERR(hdr, NULL, -EADDRNOTAVAIL, "hdr is NULL!\n"); + + pData = skb->data; + + /* 检查是否是delay统计报文: udp端口号:49184 */ + if(IS_NOT_STATISTICS_PKT == is_delay_statistics_pkt(pData)) + { + return DELAY_STATISTICS_FAILED; + } + /* 时延统计使能 */ + hdr->pd_hdr.ol_flag |= htons(DELAY_STATISTICS_INSERT_EN_BIT); + + ret = get_hw_timestamp(en_dev, &ts_thw); + CHECK_UNEQUAL_ERR(ret, 0, -EFAULT, "get_hw_timestamp failed!\n"); + + /*hw的时间戳,写到 PD头的5~8字节:高29位为ns位,低3bits位为小数ns位 */ + *(uint32_t*)(&(hdr->pd_hdr.tag_idx)) = htonl(ts_thw << CPU_TX_DECIMAL_NS); /* 大端对齐 */ + + return ret; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_aux/en_1588_pkt_proc.h b/src/net/drivers/net/ethernet/dinghai/en_aux/en_1588_pkt_proc.h new file mode 100644 index 0000000..63af628 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_aux/en_1588_pkt_proc.h @@ -0,0 +1,34 @@ +/***************************************************************************** +(C) 2023 ZTE Corporation. 版权所有. + +文件名 : en_1588_pkt_proc.h +内容摘要 : 提供PTP数据包处理相关接口 +作者/日期 : Limin / 2023.10.12 +版本 : 1.0 +*****************************************************************************/ + +#ifndef _EN_1588_PKT_PROC_H_ +#define _EN_1588_PKT_PROC_H_ + +#ifdef __cplusplus + extern "C" { +#endif /* __cplusplus */ + +#include "en_1588_pkt_proc_func.h" + +#define PTP_SUCCESS 0 +#define PTP_FAILED (-1) +#define IS_NOT_PTP_MSG 1 +#define IS_NOT_STATISTICS_PKT 1 +#define DELAY_STATISTICS_FAILED (-1) + +int32_t pkt_1588_proc_xmit(struct sk_buff *skb, struct zxdh_net_hdr *hdr, int32_t clock_no, struct zxdh_en_device *en_dev); +int32_t pkt_1588_proc_rcv(struct sk_buff *skb, struct zxdh_net_hdr_rcv *hdr, int32_t clock_no, struct zxdh_en_device *en_dev); +int32_t pi_1588_net_hdr_add(struct sk_buff *skb, struct zxdh_net_hdr *hdr, int32_t clock_no, struct zxdh_en_device *en_dev); +int32_t pkt_delay_statistics_proc(struct sk_buff *skb, struct zxdh_net_hdr *hdr, struct zxdh_en_device *en_dev); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _EN_1588_PKT_PROC_H_ */ \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_aux/en_1588_pkt_proc_func.c b/src/net/drivers/net/ethernet/dinghai/en_aux/en_1588_pkt_proc_func.c new file mode 100644 index 0000000..53786dc --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_aux/en_1588_pkt_proc_func.c @@ -0,0 +1,673 @@ +/***************************************************************************** +(C) 2023 ZTE Corporation. 版权所有. + +文件名 : en_1588_pkt_proc_func.c +内容摘要 : 不同数据类型包的处理接口实现 +作者/日期 : Limin / 2023.10.12 +版本 : 1.0 +*****************************************************************************/ + +#include "en_1588_pkt_proc_func.h" +#include "en_cmd.h" +#include "en_ioctl.h" + +struct ptp_update_buff tGlobalPtpBuff = {0}; + +uint64_t htonll(uint64_t u64_host) +{ + uint64_t u64_net = 0; + uint32_t u32_host_h = 0; + uint32_t u32_host_l = 0; + + u32_host_l = u64_host & 0xffffffff; + u32_host_h = (u64_host >> 32) & 0xffffffff; + + u64_net = htonl(u32_host_l); + u64_net = ( u64_net << 32 ) | htonl(u32_host_h); + + return u64_net; +} + +/** +* @brief 计算两时间戳subtraction和minuend之差,并将差值赋值给*ptMinusRet +* @param minuend 高48bit为s位,低32bit为ns位 +*/ +int32_t bits_80_minus(struct time_stamps subtraction, Bits80_t minuend, struct time_stamps *ptMinusRet) +{ + uint64_t minusHigh48_s = 0; + uint32_t minusLow32_ns = 0; + + /* 取出80bits被减数的ns位值和s位值 */ + memcpy((uint8_t *)(&minusHigh48_s), &minuend, S_SIZE); + memcpy(&minusLow32_ns, (uint8_t *)(&minuend) + S_SIZE, NS_SIZE); + + /* minuend大端 */ + minusHigh48_s = htonll(minusHigh48_s) >> 16; + minusLow32_ns = htonl(minusLow32_ns); + + /* 如果减数值小于被减数值 */ + if ((subtraction.s < minusHigh48_s) || ((subtraction.s == minusHigh48_s) && (subtraction.ns < minusLow32_ns))) + { + LOG_ERR("The difference between the two times is negative!!"); + return PTP_RET_TIME_ERR; + } + + if (subtraction.ns > minusLow32_ns) + { + ptMinusRet->ns = subtraction.ns - minusLow32_ns; /* 赋值ns位 */ + ptMinusRet->s = subtraction.s - minusHigh48_s; /* 赋值s位 */ + } + else + { + ptMinusRet->ns = S_HOLD - (minusLow32_ns - subtraction.ns); /* 赋值ns位 */ + ptMinusRet->s = subtraction.s - minusHigh48_s - 1; /* 赋值s位 */ + } + + return PTP_RET_SUCCESS; +} + +int32_t pkt_proc_type_sync(struct sk_buff *skb, \ + struct zxdh_net_hdr *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct zxdh_en_device *en_dev) +{ + struct SkbSharedHwtstamps_t tShhwtstamps; + struct time_stamps tMinusRet; + struct skb_shared_hwtstamps tHwtstamps5g; + struct skb_shared_hwtstamps tHwtstampsTsn; + Bits80_t tTsi; + struct ptpHdr_t * ptPtpHdr = NULL; + uint8_t *pOriginTimeStamp = NULL; + uint8_t majorSdoId = 0; + uint32_t t5gNsBig = 0; + uint64_t t5gSBig = 0; + uint32_t tsnNsBig = 0; + uint64_t tsnSBig = 0; +#ifdef TIME_STAMP_1588 + uint32_t frequency = 0; + uint64_t cfAddedVal = 0; + uint8_t *tsiTlv = NULL; + uint32_t cpuTx_ns = 0; + uint32_t cpuTx_frac_ns = 0; + uint64_t cfNs = 0; +#endif + + ptPtpHdr = (struct ptpHdr_t *)ptpHdr; + majorSdoId = ((ptPtpHdr->majorType) & 0xf0) >> 4; + pOriginTimeStamp = ptpHdr + sizeof(struct ptpHdr_t); + t5gSBig = (htonll(t5g->s)) >> 16; + t5gNsBig = htonl(t5g->ns); + tsnSBig = (htonll(tsn->s)) >> 16; + tsnNsBig = htonl(tsn->ns); + + memset(&tShhwtstamps, 0, sizeof(struct SkbSharedHwtstamps_t)); + memset(&tHwtstamps5g, 0, sizeof(struct skb_shared_hwtstamps)); + memset(&tHwtstampsTsn, 0, sizeof(struct skb_shared_hwtstamps)); + memset(&tMinusRet, 0, sizeof(struct time_stamps)); + memset(&tTsi, 0, sizeof(Bits80_t)); +#ifdef TIME_STAMP_1588 + /* 解析PTP Header的majorSdoId字段,如果是0,表示PTP消息由1588使用 */ + if (0 == majorSdoId) + { + /* 解析Flag字段低一字节bit1,如果为0,则是一步法,为1不做处理 */ + if (0 == ((ptPtpHdr->flagField) & 0x0002)) + { + memcpy(pOriginTimeStamp, &t5gSBig, S_SIZE); + memcpy(pOriginTimeStamp + S_SIZE, &t5gNsBig, NS_SIZE); + } + } + else if (1 == majorSdoId) /* 如果是1,表示PTP消息由802.1AS协议使用 */ + { + /* 解析Flag字段低一字节bit1,如果为0,则是一步法 */ + if (0 == ((ptPtpHdr->flagField) & 0x0002)) + { + /* tsn时间戳放到Sync报文的originTimestamp字段 */ + memcpy(pOriginTimeStamp, &tsnSBig, S_SIZE); + memcpy(pOriginTimeStamp + S_SIZE, &tsnNsBig, NS_SIZE); + + if (0 != ((ptPtpHdr->flagField) & 0x8000)) /* 解析Flag字段高一字节bit7,如果为1,做如下处理,为0不做处理*/ + { + frequency = *(uint32_t *)(ptpHdr + PTPHDR_FREQUENCY_OFFSET); + frequency = htonl(frequency);/* 频率比 */ + + memcpy(&tTsi, ptpHdr + PTPHDR_TSI_OFFSET, sizeof(Bits80_t)); + + bits_80_minus(*t5g, tTsi, &tMinusRet); + + /* (*t5g-*tsi)*频率比 计算结果叠加到CF字段ns位,(不会出现CF字段ns位值溢出情况) */ + cfAddedVal = (tMinusRet.s * S_HOLD + tMinusRet.ns) * frequency; + memcpy(&cfNs, ptPtpHdr->correctionField, CF_NS_SIZE); + cfNs = htonll(cfNs) >> 16; + cfNs += cfAddedVal; + cfNs = htonll(cfNs) >> 16; + memcpy(&(ptPtpHdr->correctionField[0]), &cfNs, CF_NS_SIZE); + + /* flagField字段的高1字节bit7清0 */ + ptPtpHdr->flagField = (ptPtpHdr->flagField) & 0x7f; + + /* 清除20 byte tTsi TLV为0 */ + tsiTlv = ptpHdr + PTPHDR_TSI_TLV_OFFSET; + memset(tsiTlv, 0, PTPHDR_TSI_TLV_LEN); + + /* 把Header中的messageLength值减去20 */ + ptPtpHdr->msglen = htons(ptPtpHdr->msglen); + ptPtpHdr->msglen -= PTPHDR_TSI_TLV_LEN; + ptPtpHdr->msglen = htons(ptPtpHdr->msglen); + } + } + else /* 如果为1,则是两步法 */ + { + /* 解析Flag字段高一字节bit7,如果为1,做如下处理,为0不做处理 */ + if (0 != ((ptPtpHdr->flagField) & 0x8000)) + { + memcpy(&tTsi, ptpHdr + PTPHDR_TSI_OFFSET, sizeof(Bits80_t)); + + bits_80_minus(*t5g, tTsi, &tMinusRet); + + /* (*t5g-*tsi)*频率比 计算结果叠加到CF字段ns位,(不会出现CF字段ns位值溢出情况) */ + frequency = htonl(ptPtpHdr-> msgTypeSpecific); + cfAddedVal = (tMinusRet.s * S_HOLD + tMinusRet.ns) * frequency; + memcpy(&cfNs, ptPtpHdr->correctionField, CF_NS_SIZE); + cfNs = htonll(cfNs) >> 16; + cfNs += cfAddedVal; + cfNs = htonll(cfNs) >> 16; + memcpy(&(ptPtpHdr->correctionField[0]), &cfNs, CF_NS_SIZE); + + /* 将messagetypespecific清0 */ + memset(&(ptPtpHdr->msgTypeSpecific), 0, sizeof(uint32_t)); + + /* flagField字段的高1字节bit7清0 */ + ptPtpHdr->flagField = (ptPtpHdr->flagField) & 0x7f; + + /* 清除20 byte tTsi TLV为0 */ + tsiTlv = ptpHdr + PTPHDR_TSI_TLV_OFFSET_TWO; + memset(tsiTlv, 0, PTPHDR_TSI_TLV_LEN); + + /* 把Header中的messageLength值减去20 */ + ptPtpHdr->msglen = htons(ptPtpHdr->msglen); + ptPtpHdr->msglen -= PTPHDR_TSI_TLV_LEN; + ptPtpHdr->msglen = htons(ptPtpHdr->msglen); + } + } + } + + /*PTPM的32bit的时间戳,写到 PI头的cpu_tx字段:高29位为ns位,低3bits位为小数ns位 */ + cpuTx_frac_ns = (hdr->cpu_tx) & 0x07; + cpuTx_ns = *thw << CPU_TX_DECIMAL_NS; + hdr->cpu_tx = htonl(cpuTx_ns + cpuTx_frac_ns); /* 大端对齐 */ + + /* 两个80bit时间戳(T1,T2)放到socket的ERR_QUEUE中 */ + tShhwtstamps.ts_5g_t = *t5g; + tShhwtstamps.ts_tsn_t = *tsn; + tHwtstamps5g.hwtstamp = tShhwtstamps.ts_5g_t.ns + tShhwtstamps.ts_5g_t.s * S_HOLD; + tHwtstampsTsn.hwtstamp = tShhwtstamps.ts_tsn_t.ns + tShhwtstamps.ts_tsn_t.s * S_HOLD; + skb_tstamp_tx(skb, &tHwtstamps5g); +#ifdef CGEL_TSTAMP_2_PATCH_EN + skb_tstamp_tx_2(skb, &tHwtstampsTsn); +#endif /* CGEL_TSTAMP_2_PATCH_EN */ +#endif + return PTP_RET_SUCCESS; +} + +int32_t delay_and_pdelay_req_proc(struct sk_buff *skb, \ + struct zxdh_net_hdr *hdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw) +{ +#ifdef TIME_STAMP_1588 + struct SkbSharedHwtstamps_t tShhwtstamps; + struct skb_shared_hwtstamps tHwtstamps5g; + struct skb_shared_hwtstamps tHwtstampsTsn; + uint32_t cpuTx_ns = 0; + uint32_t cpuTx_frac_ns = 0; + + memset(&tShhwtstamps, 0, sizeof(struct SkbSharedHwtstamps_t)); + memset(&tHwtstamps5g, 0, sizeof(struct skb_shared_hwtstamps)); + memset(&tHwtstampsTsn, 0, sizeof(struct skb_shared_hwtstamps)); + /*PTPM的32bit的时间戳,写到 PI头的cpu_tx字段:高29位为ns位,低3bits位为小数ns位 */ + cpuTx_frac_ns = (hdr->cpu_tx) & 0x07; + cpuTx_ns = *thw << CPU_TX_DECIMAL_NS; + hdr->cpu_tx = htonl(cpuTx_ns + cpuTx_frac_ns); + + tShhwtstamps.ts_5g_t = *t5g; + tShhwtstamps.ts_tsn_t = *tsn; + + /* 2个80bit放到socket error queue中 */ + tHwtstamps5g.hwtstamp = tShhwtstamps.ts_5g_t.ns + tShhwtstamps.ts_5g_t.s * S_HOLD; + tHwtstampsTsn.hwtstamp = tShhwtstamps.ts_tsn_t.ns + tShhwtstamps.ts_tsn_t.s * S_HOLD; + skb_tstamp_tx(skb, &tHwtstamps5g); +#ifdef CGEL_TSTAMP_2_PATCH_EN + skb_tstamp_tx_2(skb, &tHwtstampsTsn); +#endif /* CGEL_TSTAMP_2_PATCH_EN */ +#endif + return PTP_RET_SUCCESS; +} + +int32_t pkt_proc_type_delay_req(struct sk_buff *skb, \ + struct zxdh_net_hdr *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct zxdh_en_device *en_dev) +{ + int32_t ret = 0; + ret = delay_and_pdelay_req_proc(skb, hdr, t5g, tsn, thw); + return ret; +} + +int32_t pkt_proc_type_pdelay_req(struct sk_buff *skb, \ + struct zxdh_net_hdr *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct zxdh_en_device *en_dev) +{ + int32_t ret = 0; + ret = delay_and_pdelay_req_proc(skb, hdr, t5g, tsn, thw); + return ret; +} + +int32_t pkt_proc_type_pdelay_resp(struct sk_buff *skb, \ + struct zxdh_net_hdr *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct zxdh_en_device *en_dev) +{ +#ifdef TIME_STAMP_1588 + Bits80_t tReqReceTs; + struct SkbSharedHwtstamps_t tShhwtstamps; + struct skb_shared_hwtstamps tHwtstamps5g; + struct skb_shared_hwtstamps tHwtstampsTsn; + struct time_stamps tMinusRet; + struct ptpHdr_t *ptPtpHdr = NULL; + uint64_t MinusVal = 0; + uint32_t cpuTx_ns = 0; + uint32_t cpuTx_frac_ns = 0; + uint64_t cfNs = 0; + + memset(&tReqReceTs, 0, sizeof(Bits80_t)); + memset(&tShhwtstamps, 0, sizeof(struct SkbSharedHwtstamps_t)); + memset(&tMinusRet, 0, sizeof(struct time_stamps)); + memset(&tHwtstamps5g, 0, sizeof(struct skb_shared_hwtstamps)); + memset(&tHwtstampsTsn, 0, sizeof(struct skb_shared_hwtstamps)); + ptPtpHdr = (struct ptpHdr_t *)ptpHdr; + + /*PTPM的32bit的时间戳,写到 PI头的cpu_tx字段:高29位为ns位,低3bits位为小数ns位 */ + cpuTx_frac_ns = (hdr->cpu_tx) & 0x07; + cpuTx_ns = *thw << CPU_TX_DECIMAL_NS; + hdr->cpu_tx = htonl(cpuTx_ns + cpuTx_frac_ns); + + /* 解析Header中flagField的低1字节的bit1,如果是0(一步法) */ + if (0 == (ptPtpHdr->flagField & 0x0002)) + { + /* 提取requestRecieptTimestamp */ + tReqReceTs = *(Bits80_t *)(ptpHdr + sizeof(struct ptpHdr_t)); /* 记为T2 */ + + /* 将*tsn-T2的差值加到CorrectionField字段的高48bit ns位上 */ + bits_80_minus(*tsn, tReqReceTs, &tMinusRet); + MinusVal = tMinusRet.ns + tMinusRet.s * S_HOLD; + memcpy(&cfNs, ptPtpHdr->correctionField, CF_NS_SIZE); + cfNs = htonll(cfNs) >> 16; + cfNs += MinusVal; + cfNs = htonll(cfNs) >> 16; + memcpy(&(ptPtpHdr->correctionField[0]), &cfNs, CF_NS_SIZE); + } + + tShhwtstamps.ts_5g_t = *t5g; + tShhwtstamps.ts_tsn_t = *tsn; + + /* 2个80bit放到socket error queue中 */ + tHwtstamps5g.hwtstamp = tShhwtstamps.ts_5g_t.ns + tShhwtstamps.ts_5g_t.s * S_HOLD; + tHwtstampsTsn.hwtstamp = tShhwtstamps.ts_tsn_t.ns + tShhwtstamps.ts_tsn_t.s * S_HOLD; + skb_tstamp_tx(skb, &tHwtstamps5g); +#ifdef CGEL_TSTAMP_2_PATCH_EN + skb_tstamp_tx_2(skb, &tHwtstampsTsn); +#endif /* CGEL_TSTAMP_2_PATCH_EN */ +#endif + return PTP_RET_SUCCESS; +} + +/* 接收方向的事件报文的时间戳处理函数:在1588驱动中对接收方向的事件报文的时间戳处理是一致的 */ +int32_t pkt_rcv_type_event(struct zxdh_net_hdr_rcv *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct skb_shared_info *ptSkbSharedInfo, \ + struct zxdh_en_device *en_dev) +{ +#ifdef TIME_STAMP_1588 + struct SkbSharedHwtstamps_t tShhwtstamps; + uint32_t tsRx = 0; + uint32_t tsRx_ns = 0; + uint32_t tsRx_frac_ns = 0; + int32_t MinusRetThwCpu = 0; + uint64_t temp = 0x20000000; + uint32_t i = 0; + + memset(&tShhwtstamps, 0, sizeof(struct SkbSharedHwtstamps_t)); + /* cpu_tx高29bits ns位,低3bits小数ns位 */ + tsRx = htonl(hdr->rx_ts); + + tsRx_frac_ns = tsRx & 0x07; + tsRx_ns = tsRx >> 3; + // LOG_DEBUG("hdr->rx_ts = %d, tsRx = %d, tsRx_ns = %d\n", hdr->rx_ts, tsRx, tsRx_ns); + + if (tsRx_frac_ns > 4) + { + tsRx_ns += 1; + } + // LOG_DEBUG("thw = %d, tsRx_ns = %d\n", *thw, tsRx_ns); + MinusRetThwCpu = (*thw & 0x1fffffff) - tsRx_ns; + + if(MinusRetThwCpu < 0) + { + MinusRetThwCpu += temp; + } + + LOG_DEBUG("MinusRetThwCpu = %d\n", MinusRetThwCpu); + + tShhwtstamps.ts_5g_t = *t5g; + tShhwtstamps.ts_tsn_t = *tsn; + + /* 更新两个80bits时间戳 */ + if (tShhwtstamps.ts_5g_t.ns > MinusRetThwCpu) + { + tShhwtstamps.ts_5g_t.ns -= MinusRetThwCpu; + } + else + { + for (i = 1; i < tShhwtstamps.ts_5g_t.s + 1; i++) + { + temp = i * S_HOLD + tShhwtstamps.ts_5g_t.ns; + + if (temp > MinusRetThwCpu) + { + tShhwtstamps.ts_5g_t.ns = temp - MinusRetThwCpu; + tShhwtstamps.ts_5g_t.s -= i; + break; + } + } + if (temp < MinusRetThwCpu) + { + LOG_ERR("ts_5g_t < MinusRetThwCpu!!!\n"); + } + } + + if (tShhwtstamps.ts_tsn_t.ns > MinusRetThwCpu) + { + tShhwtstamps.ts_tsn_t.ns -= MinusRetThwCpu; + } + else + { + for (i = 1; i < tShhwtstamps.ts_tsn_t.s + 1; i++) + { + temp = i * S_HOLD + tShhwtstamps.ts_tsn_t.ns; + if(temp > MinusRetThwCpu) + { + tShhwtstamps.ts_tsn_t.ns = temp - MinusRetThwCpu; + tShhwtstamps.ts_tsn_t.s -= i; + break; + } + } + if (temp < MinusRetThwCpu) + { + LOG_ERR("ts_tsn_t < MinusRetThwCpu!!!\n"); + } + } + + LOG_DEBUG("enter in pkt_rcv_type_event!!!!\n"); + LOG_DEBUG("tShhwtstamps.ts_5g_t.s = %llu, tShhwtstamps.ts_5g_t.ns = %d\n", tShhwtstamps.ts_5g_t.s, tShhwtstamps.ts_5g_t.ns); + LOG_DEBUG("tShhwtstamps.ts_tsn_t.s = %llu, tShhwtstamps.ts_tsn_t.ns = %d\n", tShhwtstamps.ts_tsn_t.s, tShhwtstamps.ts_tsn_t.ns); + + /* 2个80bit放到socket cmsg中。连同报文返回给应用 */ + ptSkbSharedInfo->hwtstamps.hwtstamp = ktime_set(tShhwtstamps.ts_5g_t.s, tShhwtstamps.ts_5g_t.ns); +#ifdef CGEL_TSTAMP_2_PATCH_EN + ptSkbSharedInfo->hwtstamps2.hwtstamp = ktime_set(tShhwtstamps.ts_tsn_t.s, tShhwtstamps.ts_tsn_t.ns); +#endif /* CGEL_TSTAMP_2_PATCH_EN */ +#endif + return PTP_RET_SUCCESS; +} + +/** +* @fn read_ts_match_info +* @brief 查询时间戳匹配信息,查询到匹配信息后更新cf字段和本地时间戳信息 +* @param msgType ptp事件报文类型 +* @return 返回值为0表示查询时间戳匹配信息成功 +*/ +int32_t read_ts_match_info(uint32_t msgType, uint8_t *ptpHdr) +{ + uint32_t mssageType = 0; + int32_t cfNum = 0; + uint32_t srcPortIdFifo = 0; + uint32_t sequeIdFifo = 0; + struct ptpHdr_t *ptPtpHdr = NULL; + uint32_t matchInfo = 0; + uint8_t srcPortId = 0; + uint64_t cfVal = 0; + + ptPtpHdr = (struct ptpHdr_t *)ptpHdr; + + CHECK_EQUAL_ERR(ptPtpHdr, NULL, -EADDRNOTAVAIL, "tPtpBuff is NULL\n"); + + srcPortId = *(uint8_t *)(ptPtpHdr->srcPortIdentity + SRCPORTID_LEN - 1); /* 只取srcPortIdentity最后一字节值 */ + + for (cfNum = 0; cfNum < tGlobalPtpBuff.cfCount; cfNum++) + { + matchInfo = tGlobalPtpBuff.ptpRegInfo[cfNum].matchInfo; + mssageType = (matchInfo >> MSGTYPE_OFFSET) & 0xf; + srcPortIdFifo = (matchInfo >> SRCPORTID_OFFSET) & 0xf; + sequeIdFifo = htons(matchInfo & 0xffff); + + if((mssageType == msgType) && \ + (srcPortIdFifo == (srcPortId & 0xf)) && \ + (sequeIdFifo == ptPtpHdr->sequenceId)) + { + LOG_DEBUG("read the match info successfully!!!\n"); + LOG_DEBUG("mssageType: %u, srcPortIdFifo: %u, sequeIdFifo: %u\n", mssageType, srcPortIdFifo, sequeIdFifo); + memcpy(&cfVal, &(tGlobalPtpBuff.ptpRegInfo[cfNum].cfVal[0]), CF_SIZE); + cfVal = htonll(cfVal); + memcpy(&(ptPtpHdr->correctionField[0]), &cfVal, CF_SIZE); + + /* 将匹配到的信息从本地buff去除 */ + tGlobalPtpBuff.cfCount--; + if (cfNum == MAX_PTP_REG_INFO_NUM - 1) + { + memset(&(tGlobalPtpBuff.ptpRegInfo[cfNum]), 0, sizeof(struct ptp_reg_info)); + return 0; + } + memcpy(&(tGlobalPtpBuff.ptpRegInfo[cfNum]), &(tGlobalPtpBuff.ptpRegInfo[cfNum + 1]), \ + (MAX_PTP_REG_INFO_NUM - cfNum - 1) * sizeof(struct ptp_reg_info)); + memset(&(tGlobalPtpBuff.ptpRegInfo[MAX_PTP_REG_INFO_NUM - 1]), 0, sizeof(struct ptp_reg_info)); + + return 0; + } + } + + return -1; +} + +#ifdef PTP_DRIVER_INTERFACE_EN +extern int32_t get_event_ts_info(struct zxdh_en_device *en_dev, struct ptp_buff* p_tsInfo, int32_t mac_number); +#endif /* PTP_DRIVER_INTERFACE_EN */ + +/** +* @fn general_encrypt_msg_proc +* @brief 使用两步法,获取、存储和处理不同的ptp加密事件报文的时间戳信息 +* @param msgType ptp事件报文类型 +*/ +int32_t general_encrypt_msg_proc(uint32_t msgType, uint8_t *ptpHdr, struct zxdh_en_device *en_dev) +{ + int32_t num = 0; + int32_t macNum = 0; + int32_t ret = 0; + struct ptpHdr_t *ptPtpHdr = NULL; + struct ptp_buff tempBuff; + + memset(&tempBuff, 0, sizeof(struct ptp_buff)); + ptPtpHdr = (struct ptpHdr_t *)ptpHdr; + + /* 判断报文是否是加密报文 */ + if (!(0x0080 == ((ptPtpHdr->flagField) & 0x0080))) + { + return ret; + } + + macNum = zxdh_pf_macpcs_num_get(en_dev); + if (macNum < 0) + { + LOG_ERR("get mac num %d err, its value should is 0-2!\n", macNum); + return -1; + } + + // LOG_INFO("ptp buff:\n "); + // print_data((uint8_t *)&tGlobalPtpBuff, sizeof(struct ptp_update_buff)); + + /* 1、从本地buff查询和处理时间戳匹配信息,并更新本地buff */ + ret = read_ts_match_info(msgType, ptpHdr); + + /* 2、从本地没匹配到信息,则读取FIFO中信息,将读取到的信息更新到本地,重新匹配 */ + if (ret != 0) + { + // LOG_INFO("cannot read the matchInfo from the BUFF!---------------"); + + #ifdef PTP_DRIVER_INTERFACE_EN + ret = get_event_ts_info(en_dev, &tempBuff, macNum); + CHECK_UNEQUAL_ERR(ret, 0, -EFAULT, "read FIFO form ptpDriver failed!!!"); + #endif /* PTP_DRIVER_INTERFACE_EN */ + + /* 2.1 将读取到到的FIFO信息,添加到本地全局buff */ + if (tempBuff.cfCount > 0) + { + if (tempBuff.cfCount + tGlobalPtpBuff.cfCount < MAX_PTP_REG_INFO_NUM) + { + memcpy(&(tGlobalPtpBuff.ptpRegInfo[tGlobalPtpBuff.cfCount]), + tempBuff.ptpRegInfo, sizeof(struct ptp_reg_info) * tempBuff.cfCount); + + tGlobalPtpBuff.cfCount += tempBuff.cfCount; + // LOG_INFO("tGlobalPtpBuff.cfCount: %u\n", tGlobalPtpBuff.cfCount); + } + else /* 当超过64组时间戳信息时 */ + { + num = tempBuff.cfCount + tGlobalPtpBuff.cfCount - MAX_PTP_REG_INFO_NUM; + + /* 丢弃掉最先存在本地的信息(此信息更大的概率匹配不上) */ + memcpy(&(tGlobalPtpBuff.ptpRegInfo[0]), &(tGlobalPtpBuff.ptpRegInfo[num]), + sizeof(struct ptp_reg_info) * (MAX_PTP_REG_INFO_NUM - num)); + tGlobalPtpBuff.cfCount -= num; + + /* 添加新的信息到本地 */ + memcpy(&(tGlobalPtpBuff.ptpRegInfo[tGlobalPtpBuff.cfCount]), + tempBuff.ptpRegInfo, sizeof(struct ptp_reg_info) * tempBuff.cfCount); + tGlobalPtpBuff.cfCount = MAX_PTP_REG_INFO_NUM; + } + + /* 2.2 在更新后的本地全局buff查询和处理匹配信息,并更新本地buff*/ + ret = read_ts_match_info(msgType, ptpHdr); + CHECK_UNEQUAL_ERR(ret, 0, -EFAULT, "cannot read the matchInfo from the local BUFF!"); + } + } + + // LOG_INFO("ptp buff:\n "); + // print_data((uint8_t *)&tGlobalPtpBuff, sizeof(struct ptp_update_buff)); + + return ret; +} + + +int32_t pkt_proc_type_follow_up(struct sk_buff *skb, \ + struct zxdh_net_hdr *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct zxdh_en_device *en_dev) +{ + int32_t ret = 0; + ret = general_encrypt_msg_proc(PTP_MSG_TYPE_SYNC, ptpHdr, en_dev); + + return ret; +} + +int32_t pkt_proc_type_delay_resp(struct sk_buff *skb, \ + struct zxdh_net_hdr *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct zxdh_en_device *en_dev) +{ + return 0; +} + +int32_t pkt_rcv_type_delay_resp(struct zxdh_net_hdr_rcv *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct skb_shared_info *ptSkbSharedInfo, \ + struct zxdh_en_device *en_dev) +{ + int32_t ret = 0; + ret = general_encrypt_msg_proc(PTP_MSG_TYPE_DELAY_REQ, ptpHdr, en_dev); + + return ret; +} + +int32_t pkt_proc_type_pdelay_resp_follow_up(struct sk_buff *skb, \ + struct zxdh_net_hdr *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct zxdh_en_device *en_dev) +{ + int32_t ret = 0; + ret = general_encrypt_msg_proc(PTP_MSG_TYPE_PDELAY_RESP, ptpHdr, en_dev); + + return ret; +} + +int32_t pkt_proc_type_announce(struct sk_buff *skb, \ + struct zxdh_net_hdr *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct zxdh_en_device *en_dev) +{ + /* 驱动不做处理 */ + return 0; +} + +int32_t pkt_proc_type_signaling(struct sk_buff *skb, \ + struct zxdh_net_hdr *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct zxdh_en_device *en_dev) +{ + /* 驱动不做处理 */ + return 0; +} + +int32_t pkt_proc_type_management(struct sk_buff *skb, \ + struct zxdh_net_hdr *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct zxdh_en_device *en_dev) +{ + /* 驱动不做处理 */ + return 0; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_aux/en_1588_pkt_proc_func.h b/src/net/drivers/net/ethernet/dinghai/en_aux/en_1588_pkt_proc_func.h new file mode 100644 index 0000000..191a887 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_aux/en_1588_pkt_proc_func.h @@ -0,0 +1,233 @@ +/***************************************************************************** +(C) 2023 ZTE Corporation. 版权所有. + +文件名 : en_1588_pkt_proc_func.h +内容摘要 : 不同数据类型包的处理接口实现 +作者/日期 : Limin / 2023.10.12 +版本 : 1.0 +*****************************************************************************/ + +#ifndef _EN_1588_PKT_PROC_FUNC_H_ +#define _EN_1588_PKT_PROC_FUNC_H_ + +#ifdef __cplusplus + extern "C" { +#endif /* __cplusplus */ + +#include "../en_aux.h" +#include "queue.h" + +#define PTP_REG_INFO_NUM 32 +#define MAX_PTP_REG_INFO_NUM 64 + +/* MAC FIFO相关定义 */ +#define MSGTYPE_OFFSET 20 +#define SRCPORTID_OFFSET 16 + +/* PTP报文时间戳处理函数返回值 */ +#define PTP_RET_SUCCESS 0 +#define PTP_RET_TIME_ERR (-1) + +/* CF字段ns位和s位长度 */ +#define CF_DECIMAL_NS_SIZE 2 +#define CF_NS_SIZE 6 +#define CF_SIZE 8 + +/* PTP时间戳长度 */ +#define PTP_TS_5G_LEN 10 +#define PTP_TS_TSN_LEN 10 +#define PTP_REQRECE_TS_LEN 10 + +/* PTP报文后缀相关字段偏移和长度 */ +#define PTPHDR_FREQUENCY_OFFSET 54 +#define PTPHDR_TSI_OFFSET 86 +#define PTPHDR_TSI_TLV_OFFSET 76 +#define PTPHDR_TSI_TLV_OFFSET_TWO 44 +#define PTPHDR_TSI_TLV_LEN 20 +#define ORIGINTIMESTAMP_LEN 10 +#define FOLLOWUP_TLV_LEN 32 +#define TSITLV_LEN 20 +#define SRCPORTID_LEN 10 + +/* 80bit时间戳ns位和s位长度 */ +#define S_SIZE 6 /* 高48位 */ +#define NS_SIZE 4 /* 低32位 */ +#define S_HOLD 1000000000L /* 进位阈值,即低32位达到1e9 */ + +/* pi头中cpu_tx字段,高29位为ns位,低3位为小数ns位 */ +#define CPU_TX_DECIMAL_NS 3 +#define CPU_TX_NS 29 + +typedef struct +{ + uint8_t data[S_SIZE + NS_SIZE]; +} Bits80_t; + +struct time_stamps +{ + uint64_t s; + uint32_t ns; +}; + +struct SkbSharedHwtstamps_t +{ + struct time_stamps ts_5g_t; + struct time_stamps ts_tsn_t; +}; + +struct ptpHdr_t +{ + uint8_t majorType; /* 高4位为majorSdoId,低4位为msgType */ + uint8_t versionPTP; + uint16_t msglen; + uint8_t domainNumber; + uint8_t minorSdoId; + uint16_t flagField; + uint8_t correctionField[CF_SIZE]; /* 高48位为ns位,低16字节为小数ns位 */ + uint32_t msgTypeSpecific; /* 大端 */ + uint8_t srcPortIdentity[SRCPORTID_LEN]; + uint16_t sequenceId; + uint8_t controlField; + uint8_t logMsgInterval; +} __attribute__((packed)); + + +struct ptp_reg_info +{ + uint32_t cfVal[2]; //High寄存器是ns位,Low寄存器的高16bit是ns位,低16bit是ns小数位 + uint32_t matchInfo; //保存的内容是[bit23:0]: {MessageType[23:20], sourcePortIdentity[19:16], sequenceId[15:0]} +}; + +struct ptp_buff +{ + uint32_t cfCount; + struct ptp_reg_info ptpRegInfo[PTP_REG_INFO_NUM]; +}; + +struct ptp_update_buff +{ + uint32_t cfCount; + struct ptp_reg_info ptpRegInfo[MAX_PTP_REG_INFO_NUM]; +}; + +/* PTP报文类型枚举 */ +enum +{ + /* event message types */ + PTP_MSG_TYPE_SYNC = 0, + PTP_MSG_TYPE_DELAY_REQ, + PTP_MSG_TYPE_PDELAY_REQ, + PTP_MSG_TYPE_PDELAY_RESP, + + /* general message types */ + PTP_MSG_TYPE_FOLLOW_UP = 8, + PTP_MSG_TYPE_DELAY_RESP, + PTP_MSG_TYPE_PDELAY_RESP_FOLLOW_UP, + PTP_MSG_TYPE_ANNOUNCE, + PTP_MSG_TYPE_SIGNALING, + PTP_MSG_TYPE_MANAGEMENT +}; + +uint64_t htonll(uint64_t u64_host); + +int32_t pkt_proc_type_sync(struct sk_buff *skb, \ + struct zxdh_net_hdr *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct zxdh_en_device *en_dev); + +int32_t pkt_proc_type_delay_req(struct sk_buff *skb, \ + struct zxdh_net_hdr *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct zxdh_en_device *en_dev); + +int32_t pkt_proc_type_pdelay_req(struct sk_buff *skb, \ + struct zxdh_net_hdr *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct zxdh_en_device *en_dev); + +int32_t pkt_proc_type_pdelay_resp(struct sk_buff *skb, \ + struct zxdh_net_hdr *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct zxdh_en_device *en_dev); + +int32_t pkt_proc_type_follow_up(struct sk_buff *skb, \ + struct zxdh_net_hdr *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct zxdh_en_device *en_dev); + +int32_t pkt_proc_type_delay_resp(struct sk_buff *skb, \ + struct zxdh_net_hdr *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct zxdh_en_device *en_dev); + +int32_t pkt_proc_type_pdelay_resp_follow_up(struct sk_buff *skb, \ + struct zxdh_net_hdr *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct zxdh_en_device *en_dev); + +int32_t pkt_proc_type_announce(struct sk_buff *skb, \ + struct zxdh_net_hdr *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct zxdh_en_device *en_dev); + +int32_t pkt_proc_type_signaling(struct sk_buff *skb, \ + struct zxdh_net_hdr *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct zxdh_en_device *en_dev); + +int32_t pkt_proc_type_management(struct sk_buff *skb, \ + struct zxdh_net_hdr *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct zxdh_en_device *en_dev); + +int32_t pkt_rcv_type_event(struct zxdh_net_hdr_rcv *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct skb_shared_info *ptSkbSharedInfo, + struct zxdh_en_device *en_dev); + +int32_t pkt_rcv_type_delay_resp(struct zxdh_net_hdr_rcv *hdr, \ + uint8_t *ptpHdr, \ + struct time_stamps *t5g, \ + struct time_stamps *tsn, \ + uint32_t *thw, \ + struct skb_shared_info *ptSkbSharedInfo, + struct zxdh_en_device *en_dev); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _EN_1588_PKT_PROC_FUNC_H_ */ \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_aux/en_cmd.c b/src/net/drivers/net/ethernet/dinghai/en_aux/en_cmd.c new file mode 100644 index 0000000..c80e402 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_aux/en_cmd.c @@ -0,0 +1,1560 @@ +#include +#include +#include +#include +#include +#include +#include + +#include +#include "../en_aux.h" +#include "../en_np/table/include/dpp_tbl_api.h" +#include "../msg_common.h" +#include "en_cmd.h" + +static int32_t get_common_table_msg(struct zxdh_en_device *en_dev, uint16_t pcie_id, uint8_t field, void *ack); +static int32_t write_queue_index_to_message(struct zxdh_en_device *en_dev, uint32_t queue_nums, + uint32_t field, uint16_t *bytes, uint16_t *data) +{ + uint32_t ix = 0; + uint16_t old_queue_nums = 0; + int32_t ret = 0; + union zxdh_msg msg = {0}; + + if (OP_CODE_DATA_CHAN == field) + { + *bytes = (uint16_t)((queue_nums + 1) * ZXDH_QS_PAIRS); + data[0] = (uint16_t)queue_nums; + + for (ix = 0; ix < queue_nums; ix = ix + ZXDH_QS_PAIRS) + { + data[ix + 1] = en_dev->rq[ix / ZXDH_QS_PAIRS].vq->phy_index; + data[ix + 2] = en_dev->sq[ix / ZXDH_QS_PAIRS].vq->phy_index; + } + + if (en_dev->ops->is_bond(en_dev->parent)) + { + ret = get_common_table_msg(en_dev, en_dev->pcie_id, OP_CODE_DATA_CHAN, &msg); + if (ret != 0) + { + LOG_ERR("Failed to get data queue: %d\n", ret); + return ret; + } + + old_queue_nums = msg.reps.cmn_vq_msg.queue_nums; + if (old_queue_nums == 0) + { + return 0; + } + + if ((old_queue_nums + queue_nums) > 256) + { + LOG_ERR("Exceeded the maximum number of queues, old_queue_nums(%d)\n", old_queue_nums); + return -1; + } + + *bytes = (uint16_t)((queue_nums + old_queue_nums + 1) * ZXDH_QS_PAIRS); + data[0] = (uint16_t)(queue_nums + old_queue_nums); + memcpy(data + queue_nums + 1, msg.reps.cmn_vq_msg.phy_qidx, old_queue_nums * ZXDH_QS_PAIRS); + + for (ix = 1; ix <= (queue_nums + old_queue_nums); ix++) + { + LOG_INFO("vq phy_qid: %d ", data[ix]); + } + } + } +#ifdef ZXDH_MSGQ + else if (OP_CODE_MSGQ_CHAN == field) + { + *bytes = (uint16_t)(queue_nums * ZXDH_QS_PAIRS); + data[0] = en_dev->rq[en_dev->curr_queue_pairs].vq->phy_index; + data[1] = en_dev->sq[en_dev->curr_queue_pairs].vq->phy_index; + } +#endif + + return 0; +} + +static int32_t cmd_tbl_messgae_to_riscv_send(struct zxdh_en_device *en_dev, void *payload, uint32_t pld_len) +{ + int32_t ret = 0; + struct cmd_hdr_recv *hdr_recv; + struct cmd_tbl_ack cmd_tbl_ack = {0}; + + ret = en_dev->ops->msg_send_cmd(en_dev->parent, MODULE_TBL, payload, &cmd_tbl_ack, true); + if (0 != ret) + { + LOG_ERR("en_dev->ops->msg_send_cmd failed\n"); + goto out; + } + + hdr_recv =(struct cmd_hdr_recv*)&cmd_tbl_ack; + if (hdr_recv->check != OP_CODE_TBL_STAT) + { + LOG_ERR("tbl init message recv check failed\n"); + ret = -1; + } +out: + return ret; +} + +static int32_t cmd_common_tbl_init(struct zxdh_en_device *en_dev, uint32_t queue_nums, uint32_t field) +{ + int32_t ret = 0; + union zxdh_msg msg = {0}; + + if ((2 * ZXDH_MAX_PAIRS_NUM) < queue_nums) + { + LOG_ERR("queue pairs %u out of range\n", queue_nums); + return -ENOMEM; + } + + msg.payload.hdr_to_cmn.field = field; + msg.payload.hdr_to_cmn.type = OP_CODE_WRITE; + msg.payload.hdr_to_cmn.pcie_id = en_dev->pcie_id; + ret = write_queue_index_to_message(en_dev, queue_nums, field, \ + &msg.payload.hdr_to_cmn.write_bytes, msg.payload.cmn_tbl_msg); + if (0 != ret) + { + LOG_ERR("write_queue_index_to_message failed, ret: %d\n", ret); + return ret; + } + + // 执行message send + ret = cmd_tbl_messgae_to_riscv_send(en_dev, &msg, MSG_STRUCT_HD_LEN + msg.payload.hdr_to_cmn.write_bytes); + if (0 != ret) + { + LOG_ERR("zxdh_bar_chan_sync_msg_send failed, ret: %d\n", ret); + } + + return ret; +} + +int32_t zxdh_common_tbl_init(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + int32_t ret = 0; + +#ifdef ZXDH_MSGQ + NEED_MSGQ(en_dev) + { + ret = cmd_common_tbl_init(en_dev, ZXDH_QS_PAIRS, OP_CODE_MSGQ_CHAN); + if (0 != ret) + { + LOG_ERR("field msgq message failed\n"); + return -1; + } + } +#endif + + ret = cmd_common_tbl_init(en_dev, en_dev->curr_queue_pairs * ZXDH_QS_PAIRS, OP_CODE_DATA_CHAN); + if (0 != ret) + { + LOG_ERR("field data message failed\n"); + return -1; + } + + return 0; +} + +int32_t zxdh_send_command_to_specify(struct zxdh_en_device *en_dev, uint16_t module_id, void *msg, void *ack) +{ + struct dh_core_dev *dh_dev = en_dev->parent; + + return en_dev->ops->msg_send_cmd(dh_dev, module_id, msg, ack, true); +} + +static int32_t get_common_table_msg(struct zxdh_en_device *en_dev, uint16_t pcie_id, \ + uint8_t field, void *ack) +{ + union zxdh_msg msg = {0}; + + msg.payload.hdr_to_cmn.type = RISC_TYPE_READ; + msg.payload.hdr_to_cmn.field = field; + msg.payload.hdr_to_cmn.pcie_id = pcie_id; + msg.payload.hdr_to_cmn.write_bytes = 0; + + return zxdh_send_command_to_specify(en_dev, MODULE_TBL, &msg, ack); +} + +int32_t zxdh_hash_id_get(struct zxdh_en_device *en_dev) +{ + int32_t ret = 0; + union zxdh_msg msg = {0}; + + ret = get_common_table_msg(en_dev, en_dev->pcie_id, RISC_FIELD_HASHID_CHANNEL, &msg); + if(ret != 0) + { + LOG_ERR("get own hash_id failed: %d\n", ret); + return ret; + } + + en_dev->hash_search_idx = msg.reps.cmn_recv_msg.value; + LOG_DEBUG("hash_id: %u\n", en_dev->hash_search_idx); + if (en_dev->hash_search_idx > ZXDH_MAX_HASH_INDEX) + { + LOG_ERR("hash_id is invalid value: %u\n", en_dev->hash_search_idx); + return -EINVAL; + } + if (en_dev->hash_search_idx == ZXDH_MAX_HASH_INDEX) //TODO:if should be delete + { + en_dev->hash_search_idx = 1; + } + + return ret; +} + +int32_t zxdh_phyport_get(struct zxdh_en_device *en_dev) +{ + int32_t ret = 0; + union zxdh_msg msg = {0}; + + ret = get_common_table_msg(en_dev, en_dev->pcie_id, RISC_FIELD_PHYPORT_CHANNEL, &msg); + if(ret != 0) + { + LOG_ERR("get own phyport failed: %d\n", ret); + return ret; + } + + en_dev->phy_port = msg.reps.cmn_recv_msg.value; + if (en_dev->phy_port == INVALID_PHY_PORT) + { + LOG_ERR("get phy_port failed\n"); + return -EINVAL; + } + en_dev->ops->set_pf_phy_port(en_dev->parent, en_dev->phy_port); + LOG_DEBUG("phy_port: %u\n", en_dev->phy_port); + + return ret; +} + +int32_t zxdh_panel_id_get(struct zxdh_en_device *en_dev) +{ + int32_t ret = 0; + union zxdh_msg msg = {0}; + + ret = get_common_table_msg(en_dev, en_dev->pcie_id, RISC_FIELD_PANEL_ID, &msg); + if(ret != 0) + { + LOG_ERR("get own phyport failed: %d\n", ret); + return ret; + } + + en_dev->panel_id = msg.reps.cmn_recv_msg.value; + if (en_dev->panel_id > MAX_PANEL_ID) + { + LOG_ERR("get panel_id failed, panel_id: %u\n", en_dev->panel_id); + return -EINVAL; + } + LOG_DEBUG("panel_id: %u\n", en_dev->panel_id); + + return ret; +} + +int32_t zxdh_pf_macpcs_num_get(struct zxdh_en_device *en_dev) +{ + int32_t phy_port = 0; + int32_t mac_num = 0; //0-2 + + phy_port = en_dev->phy_port; + + if (phy_port < 4) + { + mac_num = 0; + } + else if (phy_port < 8) + { + mac_num = 1; + } + else if (phy_port < 10) + { + mac_num = 2; + } + else + { + LOG_ERR("phy_port(%d) err, not in 0-9!!\n", phy_port); + mac_num = -1; + return mac_num; + } + + LOG_DEBUG("mac_num: %d\n", mac_num); + return mac_num; +} + +int32_t zxdh_pf_link_state_get(struct zxdh_en_device *en_dev) +{ + int32_t ret = 0; + union zxdh_msg msg = {0}; + + msg.payload.hdr_to_agt.op_code = AGENT_MAC_LINK_INFO_GET; + msg.payload.hdr_to_agt.phyport = en_dev->phy_port; + ret = zxdh_send_command_to_specify(en_dev, MODULE_MAC, &msg, &msg); + if (ret != 0) + { + LOG_ERR("zxdh_pf_link_state_get failed: %d\n", ret); + return ret; + } + en_dev->ops->set_pf_link_up(en_dev->parent, msg.reps.mac_set_msg.link_state); + LOG_INFO("link_up is %s\n", msg.reps.mac_set_msg.link_state ? "true" : "false"); + if(msg.reps.mac_set_msg.link_state) + { + netif_carrier_on(en_dev->netdev); + } + else + { + netif_carrier_off(en_dev->netdev); + } + return ret; +} + +int32_t zxdh_lldp_enable_set(struct zxdh_en_device *en_dev,bool lldp_enable) +{ + union zxdh_msg msg = {0}; + + msg.payload.hdr_to_agt.op_code = AGENT_DEBUG_LLDP_ENABLE_SET; + msg.payload.hdr_to_agt.port_id = en_dev->panel_id; + + if (en_dev->ops->is_bond(en_dev->parent)) + { + msg.payload.hdr_to_agt.port_id = en_dev->pannel_id; + } + msg.payload.lldp_msg.lldp_enable = lldp_enable; + + return zxdh_send_command_to_specify(en_dev, MODULE_DEBUG, &msg, &msg); +} + +int32_t zxdh_sshd_enable_set(struct zxdh_en_device *en_dev, bool sshd_enable) +{ + union zxdh_msg msg = {0}; + + if (sshd_enable) + { + msg.payload.hdr_to_agt.op_code = AGENT_SSHD_START; + } + else + { + msg.payload.hdr_to_agt.op_code = AGENT_SSHD_STOP; + } + + LOG_INFO("event id is %d\n", MODULE_LOGIN_CTRL); + return zxdh_send_command_to_specify(en_dev, MODULE_LOGIN_CTRL, &msg, &msg); +} + +int32_t zxdh_lldp_enable_get(struct zxdh_en_device *en_dev, uint32_t *lldp_enable) +{ + int32_t ret = 0; + union zxdh_msg msg = {0}; + + msg.payload.hdr_to_agt.op_code = AGENT_DEBUG_LLDP_ENABLE_GET; + msg.payload.hdr_to_agt.port_id = en_dev->panel_id; + + if (en_dev->ops->is_bond(en_dev->parent)) + { + msg.payload.hdr_to_agt.port_id = en_dev->pannel_id; + } + + ret = zxdh_send_command_to_specify(en_dev, MODULE_DEBUG, &msg, &msg); + if (ret != 0) + { + LOG_ERR("zxdh_lldp_enable_get failed: %d\n", ret); + return ret; + } + + *lldp_enable = (uint32_t)(msg.reps.debug_lldp_msg.lldp_status); + + return ret; +} + +int32_t zxdh_riscv_os_type_get(struct zxdh_en_device *en_dev, uint8_t *is_zios) +{ + int32_t ret = 0; + union zxdh_msg msg = {0}; + msg.payload.hdr_to_agt.op_code = AGENT_OS_TYPE_GET; + + ret = zxdh_send_command_to_specify(en_dev, MODULE_LOGIN_CTRL, &msg, &msg); + if (ret != 0) + { + LOG_ERR("get bus from riscv failed: %d\n", ret); + return ret; + } + + *is_zios = msg.reps.os_type_msg.is_zios; + + return ret; +} + +int32_t zxdh_ep0_bus_get(struct zxdh_en_device *en_dev, uint8_t *bus_info) +{ + int32_t ret = 0; + union zxdh_msg msg = {0}; + + msg.payload.hdr_to_agt.op_code = AGENT_EP0_BUS_GET; + + ret = zxdh_send_command_to_specify(en_dev, MODULE_LOGIN_CTRL, &msg, &msg); + if (ret != 0) + { + LOG_ERR("get bus from riscv failed: %d\n", ret); + return ret; + } + + *bus_info = msg.reps.ep0_bus_msg.bus_info; + + return ret; +} + +int8_t zxdh_debug_ip_get(struct zxdh_en_device *en_dev, int8_t *ip) +{ + int32_t ret = 0; + uint8_t bus_info = 0; + int8_t ip_address[20] = {0}; + int8_t bus_str[5]= {0}; + + sprintf(ip_address, "26.20.5"); + + ret = zxdh_ep0_bus_get(en_dev, &bus_info); + if (ret != 0) + { + LOG_ERR("zxdh_ep0_bus_get failed: %d\n", ret); + return ret; + } + + sprintf(bus_str, ".%d", bus_info); + strcat(ip_address, bus_str); /* 将bus号添加到IP地址字符串后面 */ + strcpy(ip, ip_address); + + LOG_INFO("DEBUG IP is: %s\n", ip_address); + + return ret; +} + +#define FLASH_OPEN_FW +int32_t zxdh_en_firmware_version_get(struct zxdh_en_device *en_dev, uint8_t *fw_version, uint8_t *fw_version_len) +{ +#ifdef FLASH_OPEN_FW + int32_t ret = 0; + union zxdh_msg msg = {0}; + + msg.payload.hdr_to_agt.op_code = AGENT_FLASH_FIR_VERSION_GET; + + ret = zxdh_send_command_to_specify(en_dev, MODULE_FLASH, &msg, &msg); + if (ret != 0) + { + LOG_ERR("zxdh_send_command_to_specify failed: %d\n", ret); + return ret; + } + + memcpy(fw_version, msg.reps.flash_msg.firmware_version, FW_VERSION_LEN); + *fw_version_len = FW_VERSION_LEN; +#else + uint8_t fw_version_test[] = "V2.24.10.01B4"; + + memcpy(fw_version, fw_version_test, sizeof(fw_version_test)); + *fw_version_len = sizeof(fw_version_test); +#endif + return 0; +} + +int32_t do_get_vport_stats(struct zxdh_en_device *en_dev, uint8_t np_mode, + struct zxdh_en_vport_stats *vport_stats) +{ + union zxdh_msg msg = {0}; + uint64_t rx_broadcast_cnt = 0; + uint64_t tx_broadcast_cnt = 0; + uint64_t rx_mtu_drop_pkts_cnt = 0; + uint64_t tx_mtu_drop_pkts_cnt = 0; + uint64_t rx_mtu_drop_bytes_cnt = 0; + uint64_t tx_mtu_drop_bytes_cnt = 0; + uint64_t rx_plcr_drop_pkts_cnt = 0; + uint64_t tx_plcr_drop_pkts_cnt = 0; + uint64_t rx_plcr_drop_bytes_cnt = 0; + uint64_t tx_plcr_drop_bytes_cnt = 0; + uint32_t vf_id = GET_VFID(en_dev->vport); + int32_t err = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + msg.payload.hdr_to_agt.op_code = AGENT_VQM_DEVICE_STATS_GET; + msg.payload.hdr_to_agt.vf_id = vf_id; + err = zxdh_send_command_to_specify(en_dev, MODULE_VQM, &msg, &msg); + if (err != 0) + { + LOG_ERR("zxdh_vport_stats_get failed, err: %d\n", err); + return err; + } + memcpy(&(vport_stats->vqm_stats), &(msg.reps.stats_msg), sizeof(vport_stats->vqm_stats)); + + memset(&msg, 0, sizeof(union zxdh_msg)); + + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_VF) + { + msg.payload.hdr.op_code = ZXDH_GET_NP_STATS; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.hdr.vf_id = vf_id; + msg.payload.np_stats_get_msg.clear_mode = np_mode; + err = zxdh_send_command_to_specify(en_dev, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg); + if(err != 0) + { + LOG_ERR("zxdh_send_command_to_pf failed: %d\n", err); + return err; + } + rx_broadcast_cnt = msg.reps.np_stats_msg.np_rx_broadcast; + tx_broadcast_cnt = msg.reps.np_stats_msg.np_tx_broadcast; + rx_mtu_drop_pkts_cnt = msg.reps.np_stats_msg.np_rx_mtu_drop_pkts; + tx_mtu_drop_pkts_cnt = msg.reps.np_stats_msg.np_tx_mtu_drop_pkts; + rx_mtu_drop_bytes_cnt = msg.reps.np_stats_msg.np_rx_mtu_drop_bytes; + tx_mtu_drop_bytes_cnt = msg.reps.np_stats_msg.np_tx_mtu_drop_bytes; + rx_plcr_drop_pkts_cnt = msg.reps.np_stats_msg.np_rx_plcr_drop_pkts; + tx_plcr_drop_pkts_cnt = msg.reps.np_stats_msg.np_tx_plcr_drop_pkts; + rx_plcr_drop_bytes_cnt = msg.reps.np_stats_msg.np_rx_plcr_drop_bytes; + tx_plcr_drop_bytes_cnt = msg.reps.np_stats_msg.np_tx_plcr_drop_bytes; + } + else + { + dpp_stat_port_bc_packet_rx_cnt_get(&pf_info, vf_id, np_mode, &rx_broadcast_cnt); + dpp_stat_port_bc_packet_tx_cnt_get(&pf_info, vf_id, np_mode, &tx_broadcast_cnt); + dpp_stat_MTU_packet_msg_rx_cnt_get(&pf_info, vf_id, np_mode, &rx_mtu_drop_bytes_cnt, &rx_mtu_drop_pkts_cnt); + dpp_stat_MTU_packet_msg_tx_cnt_get(&pf_info, vf_id, np_mode, &tx_mtu_drop_bytes_cnt, &tx_mtu_drop_pkts_cnt); + dpp_stat_plcr_packet_drop_rx_cnt_get(&pf_info, vf_id, np_mode, &rx_plcr_drop_bytes_cnt, &rx_plcr_drop_pkts_cnt); + dpp_stat_plcr_packet_drop_tx_cnt_get(&pf_info, vf_id, np_mode, &tx_plcr_drop_bytes_cnt, &tx_plcr_drop_pkts_cnt); + } + vport_stats->np_stats.rx_vport_broadcast_packets = rx_broadcast_cnt; + vport_stats->np_stats.tx_vport_broadcast_packets = tx_broadcast_cnt; + vport_stats->np_stats.rx_vport_mtu_drop_packets = rx_mtu_drop_pkts_cnt; + vport_stats->np_stats.tx_vport_mtu_drop_packets = tx_mtu_drop_pkts_cnt; + vport_stats->np_stats.rx_vport_mtu_drop_bytes = rx_mtu_drop_bytes_cnt; + vport_stats->np_stats.tx_vport_mtu_drop_bytes = tx_mtu_drop_bytes_cnt; + vport_stats->np_stats.rx_vport_plcr_drop_packets = rx_plcr_drop_pkts_cnt; + vport_stats->np_stats.tx_vport_plcr_drop_packets = tx_plcr_drop_pkts_cnt; + vport_stats->np_stats.rx_vport_plcr_drop_bytes = rx_plcr_drop_bytes_cnt; + vport_stats->np_stats.tx_vport_plcr_drop_bytes = tx_plcr_drop_bytes_cnt; + + return err; +} + +int32_t zxdh_en_vport_pre_stats_get(struct zxdh_en_device *en_dev) +{ + int32_t err = 0; + struct zxdh_en_vport_stats *vport_stats = &en_dev->pre_stats; + + err = do_get_vport_stats(en_dev, NP_GET_PKT_CNT, vport_stats); + if(err != 0) + { + LOG_ERR("zxdh_en_vport_pre_stat_get failed\n"); + } + return err; +} + +int32_t zxdh_vport_stats_get(struct zxdh_en_device *en_dev) +{ + int32_t err = 0; + struct zxdh_en_vport_stats *vport_stats = &en_dev->hw_stats.vport_stats; + + err = do_get_vport_stats(en_dev, NP_GET_PKT_CNT, vport_stats); + if(err != 0) + { + LOG_ERR("zxdh_vport_stats_get failed\n"); + return err; + } + + vport_stats->vqm_stats.rx_vport_packets -= en_dev->pre_stats.vqm_stats.rx_vport_packets; + vport_stats->vqm_stats.tx_vport_packets -= en_dev->pre_stats.vqm_stats.tx_vport_packets; + vport_stats->vqm_stats.rx_vport_bytes -= en_dev->pre_stats.vqm_stats.rx_vport_bytes; + vport_stats->vqm_stats.tx_vport_bytes -= en_dev->pre_stats.vqm_stats.tx_vport_bytes; + vport_stats->vqm_stats.rx_vport_dropped -= en_dev->pre_stats.vqm_stats.rx_vport_dropped; + vport_stats->np_stats.rx_vport_broadcast_packets -= en_dev->pre_stats.np_stats.rx_vport_broadcast_packets; + vport_stats->np_stats.tx_vport_broadcast_packets -= en_dev->pre_stats.np_stats.tx_vport_broadcast_packets; + vport_stats->np_stats.rx_vport_mtu_drop_packets -= en_dev->pre_stats.np_stats.rx_vport_mtu_drop_packets; + vport_stats->np_stats.tx_vport_mtu_drop_packets -= en_dev->pre_stats.np_stats.tx_vport_mtu_drop_packets; + vport_stats->np_stats.rx_vport_mtu_drop_bytes -= en_dev->pre_stats.np_stats.rx_vport_mtu_drop_bytes; + vport_stats->np_stats.tx_vport_mtu_drop_bytes -= en_dev->pre_stats.np_stats.tx_vport_mtu_drop_bytes; + vport_stats->np_stats.rx_vport_plcr_drop_packets -= en_dev->pre_stats.np_stats.rx_vport_plcr_drop_packets; + vport_stats->np_stats.tx_vport_plcr_drop_packets -= en_dev->pre_stats.np_stats.tx_vport_plcr_drop_packets; + vport_stats->np_stats.rx_vport_plcr_drop_bytes -= en_dev->pre_stats.np_stats.rx_vport_plcr_drop_bytes; + vport_stats->np_stats.tx_vport_plcr_drop_bytes -= en_dev->pre_stats.np_stats.tx_vport_plcr_drop_bytes; + return err; +} + +int32_t zxdh_mac_stats_get(struct zxdh_en_device *en_dev) +{ + union zxdh_msg msg = {0}; + int32_t err = 0; + + msg.payload.hdr_to_agt.op_code = AGENT_MAC_STATS_GET; + msg.payload.hdr_to_agt.phyport = en_dev->phy_port; + err = zxdh_send_command_to_specify(en_dev, MODULE_MAC, &msg, &msg); + if (err != 0) + { + LOG_ERR("zxdh_mac_stats_get failed, err: %d\n", err); + return err; + } + + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_VF) + { + memset(&msg.reps.stats_msg, 0, sizeof(msg.reps.stats_msg)); + } + memcpy(&(en_dev->hw_stats.phy_stats), &msg.reps.stats_msg, sizeof(en_dev->hw_stats.phy_stats)); + + return err; +} + +int32_t zxdh_mac_stats_clear(struct zxdh_en_device *en_dev) +{ + union zxdh_msg msg = {0}; + int32_t err = 0; + + msg.payload.hdr_to_agt.op_code = AGENT_MAC_STATS_CLEAR; + msg.payload.hdr_to_agt.phyport = en_dev->phy_port; + err = zxdh_send_command_to_specify(en_dev, MODULE_MAC, &msg, &msg); + if (err != 0) + { + LOG_ERR("zxdh_mac_stats_clear failed, err: %d\n", err); + return err; + } + + return err; +} + +int32_t zxdh_en_phyport_init(struct zxdh_en_device *en_dev) +{ + union zxdh_msg msg = {0}; + int32_t err = 0; + struct link_info_struct link_info_val = {0}; + + msg.payload.hdr_to_agt.op_code = AGENT_MAC_PHYPORT_INIT; + msg.payload.hdr_to_agt.phyport = en_dev->phy_port; + if (en_dev->ops->is_upf(en_dev->parent)) + { + msg.payload.hdr_to_agt.phyport = 0; + msg.payload.hdr_to_agt.is_upf = 1; + //TODO 确定upf设备link状态获取方案 + en_dev->link_up = true; + en_dev->speed = SPEED_100000; + en_dev->ops->set_pf_link_up(en_dev->parent, en_dev->link_up); + netif_carrier_on(en_dev->netdev); + } + + err = zxdh_send_command_to_specify(en_dev, MODULE_MAC, &msg, &msg); + if (err != 0) + { + LOG_ERR("zxdh_send_command_to_riscv_mac failed, err: %d\n", err); + return err; + } + + en_dev->supported_speed_modes = msg.reps.mac_set_msg.speed_modes; + en_dev->advertising_speed_modes = msg.reps.mac_set_msg.speed_modes; + + link_info_val.speed = en_dev->speed; + link_info_val.autoneg_enable = en_dev->autoneg_enable; + link_info_val.supported_speed_modes = en_dev->supported_speed_modes; + link_info_val.advertising_speed_modes = en_dev->advertising_speed_modes; + link_info_val.duplex = en_dev->duplex; + en_dev->ops->update_pf_link_info(en_dev->parent, &link_info_val); + + return err; +} + +int32_t zxdh_en_autoneg_set(struct zxdh_en_device *en_dev, uint8_t enable, uint32_t speed_modes) +{ + union zxdh_msg msg = {0}; + + msg.payload.hdr_to_agt.op_code = AGENT_MAC_AUTONEG_SET; + msg.payload.hdr_to_agt.phyport = en_dev->phy_port; + msg.payload.mac_set_msg.autoneg = enable; + msg.payload.mac_set_msg.speed_modes = speed_modes; + + return zxdh_send_command_to_specify(en_dev, MODULE_MAC, &msg, &msg); +} + +int32_t zxdh_en_fec_mode_set(struct zxdh_en_device *en_dev, uint32_t fec_cfg) +{ + union zxdh_msg msg = {0}; + + msg.payload.hdr_to_agt.op_code = AGENT_MAC_FEC_MODE_SET; + msg.payload.hdr_to_agt.phyport = en_dev->phy_port; + msg.payload.mac_fec_mode_msg.fec_cfg = fec_cfg; + + return zxdh_send_command_to_specify(en_dev, MODULE_MAC, &msg, &msg); +} + +int32_t zxdh_en_fec_mode_get(struct zxdh_en_device *en_dev, uint32_t *fec_cap, uint32_t *fec_cfg, uint32_t *fec_active) +{ + union zxdh_msg msg = {0}; + int32_t err = 0; + + msg.payload.hdr_to_agt.op_code = AGENT_MAC_FEC_MODE_GET; + msg.payload.hdr_to_agt.phyport = en_dev->phy_port; + + err = zxdh_send_command_to_specify(en_dev, MODULE_MAC, &msg, &msg); + if (err != 0) + { + LOG_ERR("zxdh_send_command_to_riscv_mac failed, err: %d\n", err); + return err; + } + + if(fec_cap) + *fec_cap = msg.reps.mac_fec_mode_msg.fec_cap; + if(fec_cfg) + *fec_cfg = msg.reps.mac_fec_mode_msg.fec_cfg; + if(fec_active) + *fec_active = msg.reps.mac_fec_mode_msg.fec_link; + + return err; +} + +int32_t zxdh_en_fc_mode_set(struct zxdh_en_device *en_dev, uint32_t fc_mode) +{ + union zxdh_msg msg = {0}; + + msg.payload.hdr_to_agt.op_code = AGENT_MAC_FC_MODE_SET; + msg.payload.hdr_to_agt.phyport = en_dev->phy_port; + msg.payload.mac_fc_mode_msg.fc_mode = fc_mode; + + return zxdh_send_command_to_specify(en_dev, MODULE_MAC, &msg, &msg); +} + +int32_t zxdh_en_fc_mode_get(struct zxdh_en_device *en_dev, uint32_t *fc_mode) +{ + union zxdh_msg msg = {0}; + int32_t err = 0; + + msg.payload.hdr_to_agt.op_code = AGENT_MAC_FC_MODE_GET; + msg.payload.hdr_to_agt.phyport = en_dev->phy_port; + + err = zxdh_send_command_to_specify(en_dev, MODULE_MAC, &msg, &msg); + if (err != 0) + { + LOG_ERR("zxdh_send_command_to_riscv_mac failed, err: %d\n", err); + return err; + } + + if(fc_mode) + *fc_mode = msg.reps.mac_fc_mode_msg.fc_mode; + + return err; +} + +uint32_t zxdh_en_module_eeprom_read(struct zxdh_en_device *en_dev, struct zxdh_en_module_eeprom_param *query, uint8_t *data) +{ + union zxdh_msg msg = {0}; + int32_t err = 0; + + msg.payload.hdr_to_agt.op_code = AGENT_MAC_MODULE_EEPROM_READ; + msg.payload.hdr_to_agt.phyport = en_dev->phy_port; + msg.payload.module_eeprom_msg.i2c_addr = query->i2c_addr; + msg.payload.module_eeprom_msg.bank = query->bank; + msg.payload.module_eeprom_msg.page = query->page; + msg.payload.module_eeprom_msg.offset = query->offset; + msg.payload.module_eeprom_msg.length = query->length; + + err = zxdh_send_command_to_specify(en_dev, MODULE_MAC, &msg, &msg); + if (err != 0) + { + LOG_ERR("zxdh_send_command_to_riscv_mac failed, err: %d\n", err); + return 0; + } + + if(data) + memcpy(data, msg.reps.module_eeprom_msg.data, msg.reps.module_eeprom_msg.length); + + return msg.reps.module_eeprom_msg.length; +} + +int32_t zxdh_vf_1588_call_np_interface(struct zxdh_en_device *en_dev) +{ + int32_t ret = 0; + union zxdh_msg msg = {0}; + + msg.payload.hdr.op_code = ZXDH_VF_1588_CALL_NP; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.hdr.pcie_id = en_dev->pcie_id; + msg.payload.vf_1588_call_np.vfid = VQM_VFID(msg.payload.hdr.vport); + msg.payload.vf_1588_call_np.call_np_interface_num = en_dev->vf_1588_call_np_num; + msg.payload.vf_1588_call_np.ptp_tc_enable_opt = en_dev->ptp_tc_enable_opt; + ret = zxdh_send_command_to_specify(en_dev, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg); + if(ret != 0) + { + LOG_ERR("zxdh_send_command_to_pf failed: %d\n", ret); + return ret; + } + + return ret; +} + +int32_t zxdh_vf_port_create(struct zxdh_en_device *en_dev) +{ + int32_t ret = 0; + union zxdh_msg msg = {0}; + uint8_t link_up = 0; + bool is_upf = false; + + if (en_dev->ops->is_upf(en_dev->parent)) + { + is_upf = true; + } + + msg.payload.hdr.op_code = ZXDH_VF_PORT_INIT; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.hdr.pcie_id = en_dev->pcie_id; + msg.payload.vf_init_msg.base_qid = en_dev->phy_index[0]; + msg.payload.vf_init_msg.hash_search_idx = en_dev->hash_search_idx; + msg.payload.vf_init_msg.rss_enable = 1; + msg.payload.vf_init_msg.is_upf = is_upf; + + ret = zxdh_send_command_to_specify(en_dev, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg); + if(ret != 0) + { + LOG_ERR("zxdh_send_command_to_pf failed: %d\n", ret); + return ret; + } + + if (is_upf) + { + en_dev->link_up = msg.reps.vf_init_msg.link_up; + } + else + { + en_dev->ops->get_link_info_from_vqm(en_dev->parent, &link_up); + en_dev->link_up = link_up; + LOG_INFO("vf read link_up: %d from vqm\n", link_up); + } + + ether_addr_copy(en_dev->netdev->dev_addr, msg.reps.vf_init_msg.mac_addr); + en_dev->speed = msg.reps.vf_init_msg.speed; + en_dev->autoneg_enable = msg.reps.vf_init_msg.autoneg_enable; + en_dev->supported_speed_modes = msg.reps.vf_init_msg.sup_link_modes; + en_dev->advertising_speed_modes = msg.reps.vf_init_msg.adv_link_modes; + en_dev->duplex = msg.reps.vf_init_msg.duplex; + + if (!is_upf) + { + en_dev->phy_port = msg.reps.vf_init_msg.phy_port; + en_dev->ops->set_pf_phy_port(en_dev->parent, en_dev->phy_port); + } + + if (en_dev->link_up) + { + en_dev->ops->set_pf_link_up(en_dev->parent, TRUE); + netif_carrier_on(en_dev->netdev); + } + else + { + en_dev->ops->set_pf_link_up(en_dev->parent, FALSE); + netif_carrier_off(en_dev->netdev); + } + return ret; +} + +int32_t zxdh_vf_port_delete(struct zxdh_en_device *en_dev) +{ + union zxdh_msg msg = {0}; + + //dpp_np_uninit + msg.payload.hdr.op_code = ZXDH_VF_PORT_UNINIT; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.hdr.pcie_id = en_dev->pcie_id; + return zxdh_send_command_to_specify(en_dev, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg); +} + +int32_t zxdh_vf_dpp_add_mac(struct zxdh_en_device *en_dev, const uint8_t *dev_addr, uint8_t filter_flag) +{ + union zxdh_msg msg = {0}; + int32_t err = 0; + + msg.payload.hdr.op_code = ZXDH_MAC_ADD; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.hdr.pcie_id = en_dev->pcie_id; + msg.payload.mac_addr_set_msg.filter_flag = filter_flag; + memcpy(msg.payload.mac_addr_set_msg.mac_addr, dev_addr, en_dev->netdev->addr_len); + + err = zxdh_send_command_to_specify(en_dev, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg); + if (err != 0) + { + if (msg.reps.flag == ZXDH_REPS_BEOND_MAC) + { + return DPP_RC_TABLE_RANGE_INVALID; + } + } + return err; +} + +int32_t zxdh_vf_dpp_del_mac(struct zxdh_en_device *en_dev, const uint8_t *dev_addr, uint8_t filter_flag, bool mac_flag) +{ + union zxdh_msg msg = {0}; + + msg.payload.hdr.op_code = ZXDH_MAC_DEL; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.hdr.pcie_id = en_dev->pcie_id; + msg.payload.mac_addr_set_msg.filter_flag = filter_flag; + msg.payload.mac_addr_set_msg.mac_flag = mac_flag; + memcpy(msg.payload.mac_addr_set_msg.mac_addr, dev_addr, en_dev->netdev->addr_len); + + return zxdh_send_command_to_specify(en_dev, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg); +} + +int32_t zxdh_vf_rss_en_set(struct zxdh_en_device *en_dev, uint32_t enable) +{ + union zxdh_msg msg = {0}; + + msg.payload.hdr.op_code = ZXDH_RSS_EN_SET; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.hdr.pcie_id = en_dev->pcie_id; + msg.payload.rss_enable_msg.rss_enable = enable; + return zxdh_send_command_to_specify(en_dev, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg); +} + +int32_t zxdh_vf_dpp_add_ipv6_mac(struct zxdh_en_device *en_dev, const uint8_t *mac_addr) +{ + union zxdh_msg msg = {0}; + int32_t err = 0; + + msg.payload.hdr.op_code = ZXDH_IPV6_MAC_ADD; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.hdr.pcie_id = en_dev->pcie_id; + memcpy(msg.payload.mac_addr_set_msg.mac_addr, mac_addr, en_dev->netdev->addr_len); + err = zxdh_send_command_to_specify(en_dev, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg); + if ((err != 0) && (msg.reps.flag == ZXDH_REPS_BEOND_MAC)) + { + LOG_ERR("Add Multicast MAC Address(%pM) Failed, Beyond Max MAC Num 32\n", mac_addr); + return DPP_RC_TABLE_RANGE_INVALID; + } + return err; +} + +int32_t zxdh_vf_dpp_del_ipv6_mac(struct zxdh_en_device *en_dev, const uint8_t *mac_addr) +{ + union zxdh_msg msg = {0}; + + msg.payload.hdr.op_code = ZXDH_IPV6_MAC_DEL; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.hdr.pcie_id = en_dev->pcie_id; + memcpy(msg.payload.mac_addr_set_msg.mac_addr, mac_addr, en_dev->netdev->addr_len); + + return zxdh_send_command_to_specify(en_dev, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg); +} + +int32_t zxdh_vf_egr_port_attr_set(struct zxdh_en_device *en_dev, uint32_t mode, uint32_t value, uint8_t fow) +{ + union zxdh_msg msg = {0}; + + msg.payload.hdr.op_code = ZXDH_PORT_ATTRS_SET; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.hdr.pcie_id = en_dev->pcie_id; + msg.payload.port_attr_set_msg.mode = mode; + msg.payload.port_attr_set_msg.value = value; + msg.payload.port_attr_set_msg.allmulti_follow = fow; + return zxdh_send_command_to_specify(en_dev, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg); +} + +int32_t zxdh_vf_egr_port_attr_get(struct zxdh_en_device *en_dev, ZXDH_VPORT_T *port_attr_entry) +{ + union zxdh_msg msg = {0}; + int32_t err = 0; + + msg.payload.hdr.op_code = ZXDH_PORT_ATTRS_GET; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.hdr.pcie_id = en_dev->pcie_id; + err = zxdh_send_command_to_specify(en_dev, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg); + if (err != 0) + { + LOG_ERR("vf_egr_port_attr_get failed, err = %d\n", err); + return err; + } + + memcpy(port_attr_entry, &msg.reps.port_attr_get_msg.port_attr_entry, sizeof(ZXDH_VPORT_T)); + return err; +} + +int32_t zxdh_vf_port_promisc_set(struct zxdh_en_device *en_dev, uint8_t mode, uint8_t value, uint8_t fow) +{ + union zxdh_msg msg = {0}; + + msg.payload.hdr.op_code = ZXDH_PROMISC_SET; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.hdr.pcie_id = en_dev->pcie_id; + msg.payload.promisc_set_msg.mode = mode; + msg.payload.promisc_set_msg.value = value; + msg.payload.promisc_set_msg.mc_follow = fow; + return zxdh_send_command_to_specify(en_dev, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg); +} + +int32_t zxdh_en_vport_create(struct zxdh_en_device *en_dev) +{ + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + if (!en_dev->ops->if_init(en_dev->parent)) + { + return 0; + } + + return dpp_vport_create(&pf_info); +} + +int32_t zxdh_en_vport_delete(struct zxdh_en_device *en_dev) +{ + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + if (!en_dev->ops->if_init(en_dev->parent)) + { + return 0; + } + + return dpp_vport_delete(&pf_info); +} + +int32_t zxdh_pf_vport_create(struct zxdh_en_device *en_dev) +{ + int32_t ret = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + ret = zxdh_en_vport_create(en_dev); + if (ret != 0) + { + LOG_ERR("zxdh_en_vport_create failed: %d\n", ret); + return ret; + } + + ret = dpp_vport_bond_pf(&pf_info); + if (ret != 0) + { + LOG_ERR("dpp_vport_bond_pf failed: %d\n", ret); + goto err_vport; + } + + if (en_dev->ops->is_upf(en_dev->parent)) + { + ret = dpp_egr_port_attr_set(&pf_info, EGR_FLAG_LAG_ID, 0); + if (ret != 0) + { + LOG_ERR("dpp_egr_port_attr_set lag_id 0 failed: %d\n", ret); + goto err_vport; + } + + ret = dpp_egr_port_attr_set(&pf_info, EGR_FLAG_LAG_EN_OFF, 1); + if (ret != 0) + { + LOG_ERR("dpp_egr_port_attr_set bond_en 1 failed: %d\n", ret); + goto err_vport; + } + } + else + { + ret = dpp_panel_bond_vport(&pf_info, en_dev->phy_port); + if (ret != 0) + { + LOG_ERR("dpp_panel_bond_vport failed: %d\n", ret); + goto err_vport; + } + } + + return ret; + +err_vport: + zxdh_en_vport_delete(en_dev); + return ret; +} + +int32_t zxdh_rxfh_set(struct zxdh_en_device *en_dev, uint32_t *queue_map) +{ + union zxdh_msg msg = {0}; + int32_t err = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + if (queue_map == NULL) + { + return -1; + } + + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + err = dpp_rxfh_set(&pf_info, queue_map, ZXDH_INDIR_RQT_SIZE); + if (err != 0) + { + LOG_ERR("dpp_rxfh_set failed: %d\n", err); + } + } + else + { + msg.payload.hdr.op_code = ZXDH_RXFH_SET; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.hdr.pcie_id = en_dev->pcie_id; + memcpy(msg.payload.rxfh_set_msg.queue_map, queue_map, ZXDH_INDIR_RQT_SIZE * sizeof(uint32_t)); + err = en_dev->ops->msg_send_cmd(en_dev->parent, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg, true); + if(err != 0) + { + LOG_ERR("zxdh_send_command_to_pf_np failed: %d\n", err); + } + } + + return err; +} + +void zxdh_rxfh_del(struct zxdh_en_device *en_dev) +{ + union zxdh_msg msg = {0}; + int32_t err = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + if (en_dev->ops->is_bond(en_dev->parent)) + { + return; + } + + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + dpp_rxfh_del(&pf_info); + } + else + { + msg.payload.hdr.op_code = ZXDH_RXFH_DEL; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.hdr.pcie_id = en_dev->pcie_id; + err = en_dev->ops->msg_send_cmd(en_dev->parent, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg, true); + if(err != 0) + { + LOG_ERR("zxdh_send_command_to_pf_np failed: %d\n", err); + } + } +} + +int32_t zxdh_ethtool_init(struct zxdh_en_device *en_dev) +{ + int32_t ret = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + ret = dpp_vport_rss_en_set(&pf_info, 1); + if (ret != 0) + { + LOG_ERR("dpp_vport_rss_en_set failed: %d\n", ret); + return ret; + } + + ret = dpp_vport_hash_funcs_set(&pf_info, en_dev->hash_func); + if (ret != 0) + { + LOG_ERR("dpp_vport_hash_funcs_set failed: %d\n", ret); + return ret; + } + + ret = dpp_rx_flow_hash_set(&pf_info, ZXDH_NET_RX_FLOW_HASH_SDFNT); + if (ret != 0) + { + LOG_ERR("zxdh_rx_flow_hash_set failed: %d\n", ret); + return ret; + } + + ret = dpp_egr_port_attr_set(&pf_info, EGR_FLAG_PORT_BASE_QID, (uint16_t)en_dev->phy_index[0]); + if (ret != 0) + { + LOG_ERR("dpp_egr_port_attr_set %d failed: %d\n", en_dev->phy_index[0], ret); + return ret; + } + + ret = dpp_egr_port_attr_set(&pf_info, EGR_FLAG_IPV4_TCP_ASSEMBLE, 1); + if (ret != 0) + { + LOG_ERR("dpp_egr_port_attr_set tcp assemble failed: %d\n", ret); + return ret; + } + + ret = dpp_egr_port_attr_set(&pf_info, EGR_FLAG_IPV6_TCP_ASSEMBLE, 1); + if (ret != 0) + { + LOG_ERR("dpp_egr_port_attr_set tcp assemble failed: %d\n", ret); + return ret; + } + + ret = dpp_egr_port_attr_set(&pf_info, EGR_FLAG_IP_CHKSUM, 1); + if (ret != 0) + { + LOG_ERR("dpp_egr_port_attr_set rx ip checksum failed: %d\n", ret); + return ret; + } + + ret = dpp_egr_port_attr_set(&pf_info, EGR_FLAG_TCP_UDP_CHKSUM, 1); + if (ret != 0) + { + LOG_ERR("dpp_egr_port_attr_set rx l4 checksum failed: %d\n", ret); + return ret; + } + + ret = dpp_egr_port_attr_set(&pf_info, EGR_FLAG_ACCELERATOR_OFFLOAD_FLAG, 1); + if (ret != 0) + { + LOG_ERR("dpp_egr_port_attr_set accelerator offload failed: %d\n", ret); + return ret; + } + + ret = dpp_egr_port_attr_set(&pf_info, EGR_FLAG_OUTER_IP_CHECKSUM_OFFLOAD, 1); + if (ret != 0) + { + LOG_ERR("dpp_egr_port_attr_set vxlan outer ip checksum failed: %d\n", ret); + return ret; + } + + ret = dpp_vport_vlan_filter_en_set(&pf_info, 0); + if (ret != 0) + { + LOG_ERR("dpp_vport_vlan_filter_en_set failed: %d\n", ret); + return ret; + } + + ret = dpp_vlan_filter_init(&pf_info); + if (ret != 0) + { + LOG_ERR("dpp_vlan_filter_init failed: %d\n", ret); + return ret; + } + + return ret; +} + +int32_t zxdh_pf_flush_mac(struct zxdh_en_device *en_dev) +{ + int32_t err = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + /* 删除此转发域所有单播mac地址 */ + err = dpp_unicast_all_mac_delete(&pf_info); + if (err != 0) + { + LOG_ERR("dpp_unicast_all_mac_delete failed\n"); + return err; + } + LOG_INFO("dpp_unicast_all_mac_delete succeed\n"); + + /* 删除此转发域中所有组播mac地址 */ + err = dpp_multicast_all_mac_delete(&pf_info); + if (err != 0) + { + LOG_ERR("dpp_multicast_all_mac_delete failed\n"); + return err; + } + LOG_INFO("dpp_multicast_all_mac_delete succeed\n"); + + return err; +} + +int32_t zxdh_pf_flush_mac_online(struct zxdh_en_device *en_dev) +{ + int32_t err = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + /* 删除此转发域所有单播mac地址 */ + err = dpp_unicast_all_mac_online_delete(&pf_info); + if (err != 0) + { + LOG_ERR("dpp_unicast_all_mac_online_delete failed:%d\n", err); + return err; + } + + /* 删除此转发域中所有组播mac地址 */ + err = dpp_multicast_all_mac_online_delete(&pf_info); + if (err != 0) + { + LOG_ERR("dpp_multicast_all_mac_online_delete failed:%d\n", err); + return err; + } + + return err; +} + +int32_t zxdh_pf_port_delete(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + int32_t ret = 0; + DPP_PF_INFO_T pf_info = {0}; + + if (en_dev == NULL) + { + return -1; + } + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + dpp_vport_uc_promisc_set(&pf_info, 0); + dpp_vport_mc_promisc_set(&pf_info, 0); + + /* pf删除所有配置到np的mac地址 */ + if (!en_dev->ops->is_bond(en_dev->parent)) + { + ret = zxdh_pf_flush_mac_online(en_dev); + if (ret != 0) + { + LOG_ERR("zxdh_pf_flush_mac_online failed: %d\n", ret); + return ret; + } + } + + ret = zxdh_en_vport_delete(en_dev); + if (ret != 0) + { + LOG_ERR("dpp_vport_delete failed: %d\n", ret); + return ret; + } + + return ret; +} + +int32_t zxdh_aux_alloc_pannel(struct zxdh_en_device *en_dev) +{ + int32_t ret = 0; + struct zxdh_pannle_port port; + + ret = en_dev->ops->request_port(en_dev->parent, &port); + if (ret != 0) + { + LOG_ERR("zxdh_aux_alloc_pannel failed \n"); + goto out; + } + + en_dev->phy_port = port.phyport; + en_dev->pannel_id = port.pannel_id; + en_dev->link_check_bit = port.link_check_bit; + + LOG_INFO("bond pf: pannel %u, phyport %u check bit %u \n", + en_dev->pannel_id, en_dev->phy_port, en_dev->link_check_bit); + +out: + return ret; +} + +#if 0 +int32_t zxdh_aux_query_phyport(struct zxdh_en_device *en_dev) +{ + int32_t ret = 0; + struct aux_phyport_message recv = {0}; + struct aux_phyport_message *recv_data = &recv; + zxdh_aux_phyport_msg msg = {0}; + zxdh_aux_phyport_msg *payload = &msg; + + payload->pcie_id = en_dev->pcie_id; + payload->pannel_id = en_dev->pannel_id; + payload->rsv = en_dev->pannel_id; + + ret = en_dev->ops->msg_send_cmd(en_dev->parent, MODULE_PHYPORT_QUERY, payload, recv_data, true); + if (ret != 0) + { + LOG_ERR("zxdh_aux_query_phyport send message failed \n"); + goto out; + } + + en_dev->phy_port = recv_data->phyport; + +out: + return ret; +} +#endif +int32_t zxdh_pf_port_init(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + bool vepa = false; + int32_t ret = 0; + DPP_PF_INFO_T pf_info = {0}; + + if (en_dev == NULL) + { + return -1; + } + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + +#if 0 + en_dev->ops->dpp_np_init(en_dev->parent, en_dev->vport); +#endif + + ret = zxdh_pf_vport_create(en_dev); + if (ret != 0) + { + LOG_ERR("zxdh_pf_vport_create failed: %d\n", ret); + return ret; + } + + zxdh_mac_stats_clear(en_dev); + + if (en_dev->ops->is_bond(en_dev->parent)) + { + if (!en_dev->ops->if_init(en_dev->parent)) + { + LOG_INFO("First net-device is init\n"); + return 0; + } + + /* 只将第一个网络设备的队列配置到vport属性表中 */ + ret = dpp_egr_port_attr_set(&pf_info, EGR_FLAG_PORT_BASE_QID, (uint16_t)en_dev->phy_index[0]); + if (ret != 0) + { + LOG_ERR("dpp_egr_port_attr_set %d failed: %d\n", en_dev->phy_index[0], ret); + goto err_vport; + } + return 0; + } + + vepa = en_dev->ops->get_vepa(en_dev->parent); + ret = dpp_egr_port_attr_set(&pf_info, EGR_FLAG_VEPA_EN_OFF, (uint32_t)vepa); + if (ret != 0) + { + LOG_ERR("Failed to setup vport(0x%x) %s mode, ret: %d\n", en_dev->vport, vepa?"vepa":"veb", ret); + goto err_vport; + } + LOG_INFO("Initialize vport(0x%x) to %s mode\n", en_dev->vport, vepa?"vepa":"veb"); + + ret = dpp_egr_port_attr_set(&pf_info, EGR_FLAG_HASH_SEARCH_INDEX, en_dev->hash_search_idx); + if (ret != 0) + { + LOG_ERR("dpp_egr_port_attr_set hash_search_index %u failed: %d\n", en_dev->hash_search_idx, ret); + goto err_vport; + } + + ret = zxdh_ethtool_init(en_dev); + if (ret != 0) + { + LOG_ERR("zxdh_ethtool_init failed: %d\n", ret); + return ret; + } + + /* PF删除复位前配置到np的mac */ + ret = zxdh_pf_flush_mac(en_dev); + if (ret != 0) + { + LOG_ERR("zxdh_pf_flush_mac failed: %d\n", ret); + goto err_vport; + } + + ret = dpp_add_mac(&pf_info, netdev->dev_addr); + if (ret != 0) + { + LOG_ERR("dpp_add_mac failed: %d\n", ret); + goto err_vport; + } + + dpp_vport_uc_promisc_set(&pf_info, 0); + dpp_vport_mc_promisc_set(&pf_info, 0); + + return 0; + +err_vport: + zxdh_en_vport_delete(en_dev); + return ret; +} + +int32_t zxdh_vf_get_mac(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct netdev_hw_addr *ha = NULL; + union zxdh_msg msg = {0}; + uint8_t mac[6] = {0}; + int32_t ret = 0; + bool add_flag = true; + + msg.payload.hdr.op_code = ZXDH_MAC_GET; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.hdr.pcie_id = en_dev->pcie_id; + ret = zxdh_send_command_to_specify(en_dev, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg); + if (ret != 0) + { + LOG_ERR("zxdh_send_command_to_pf failed: %d\n", ret); + return ret; + } + + ether_addr_copy(mac, msg.reps.vf_mac_addr_get_msg.mac_addr); + LOG_INFO("zxdh_vf_get_mac %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + if (is_zero_ether_addr(mac)) + { + get_random_bytes(mac, 6); + mac[0] &= 0xfe; + LOG_INFO("vf set random mac %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + } + + list_for_each_entry(ha, &netdev->uc.list, list) + { + if (!memcmp(ha->addr, mac, netdev->addr_len)) + { + add_flag = false; + } + } + + if (add_flag) + { + ret = zxdh_vf_dpp_add_mac(en_dev, mac, UNFILTER_MAC); + if (ret != 0) + { + LOG_ERR("zxdh_vf_dpp_add_mac failed: %d\n", ret); + goto free_vport; + } + } + + ether_addr_copy(netdev->dev_addr, mac); + + return ret; +free_vport: + zxdh_vf_port_delete(en_dev); + return ret; +} + +int32_t zxdh_vf_dpp_port_init(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + int32_t ret = 0; + + ret = zxdh_vf_port_create(en_dev); + if (ret != 0) + { + LOG_ERR("zxdh_vf_port_create failed: %d\n", ret); + } + + return ret; +} + +void zxdh_vport_uninit(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + int32_t ret = 0; + + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + ret = zxdh_pf_port_delete(netdev); + if (ret != 0) + { + LOG_ERR("zxdh_pf_port_delete failed: %d\n", ret); + } + } + else + { + ret = zxdh_vf_port_delete(en_dev); + if (ret != 0) + { + LOG_ERR("zxdh_vf_port_delete failed: %d\n", ret); + } + } +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_aux/en_cmd.h b/src/net/drivers/net/ethernet/dinghai/en_aux/en_cmd.h new file mode 100644 index 0000000..578b8dc --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_aux/en_cmd.h @@ -0,0 +1,226 @@ +#ifndef _ZXDH_EN_COMMAND_H_ +#define _ZXDH_EN_COMMAND_H_ + +#include +#include "../msg_common.h" + +#define ZXDH_QRES_TBL_LEN (300) +#define ZXDH_QS_PAIRS (2) + +#define INVALID_PHY_PORT 0xff +#define ZXDH_MAX_HASH_INDEX 6//TODO:should is 5 + +/* HASH_FUNC TYPE */ +#define ZXDH_FUNC_TOP 0x04 +#define ZXDH_FUNC_XOR 0x02 +#define ZXDH_FUNC_CRC32 0x01 + +/* RX_NFC */ +#define ZXDH_NET_RX_FLOW_HASH_MV 4 +#define ZXDH_NET_RX_FLOW_HASH_SDT 2 +#define ZXDH_NET_RX_FLOW_HASH_SDFNT 1 + +/* RISCV OPCODE */ +#define RISC_TYPE_READ 0 +#define RISC_FIELD_PANEL_ID 5 +#define RISC_FIELD_PHYPORT_CHANNEL 6 +#define RISC_FIELD_HASHID_CHANNEL 10 +#define RISC_SERVER_TIME 0xF0 + + +#define MAX_PANEL_ID 8//TODO:should is 5 + +enum riscv_op_code +{ + OP_CODE_WRITE = 1, + OP_CODE_MSGQ_CHAN = 2, + OP_CODE_DATA_CHAN = 3, + OP_CODE_MAX, +}; + +#define OP_CODE_TBL_STAT (0xaa) +#define MSG_STRUCT_HD_LEN 8 + +struct queue_index_message +{ + uint8_t type; + uint8_t field; + uint16_t ep_bdf; + uint16_t write_bytes; + uint16_t rsv; + uint16_t write_data[0]; +} __attribute__((packed)); + +struct cmd_hdr_recv +{ + uint8_t check; + uint8_t rsv; + uint16_t data_len_bytes; +}; + +struct cmd_tbl_ack +{ + struct cmd_hdr_recv hdr; + uint8_t phy_port; + uint8_t rsv[3]; +} __attribute__((packed)); + +enum zxdh_msg_chan_opc +{ + ZXDH_VPORT_GET = 4, + ZXDH_PHYPORT_GET = 6, +}; + +struct zxdh_debug_msg +{ + uint8_t opcode; + uint8_t phyport; + bool lldp_enable; +} __attribute__((packed)); + +struct zxdh_debug_rcv_msg +{ + uint8_t reps_states; + uint8_t lldp_enable; +} __attribute__((packed)); + +enum zxdh_en_link_speed_bit_indices +{ + SPM_SPEED_1X_1G = 2, + SPM_SPEED_1X_10G = 5, + SPM_SPEED_1X_25G = 6, + SPM_SPEED_1X_50G = 7, + SPM_SPEED_2X_100G = 8, + SPM_SPEED_4X_40G = 9, + SPM_SPEED_4X_100G = 10, +}; + +enum zxdh_en_fec_mode_bit_indices +{ + SPM_FEC_NONE = 0, + SPM_FEC_BASER = 1, + SPM_FEC_RS528 = 2, + SPM_FEC_RS544 = 3, +}; + +enum zxdh_en_fc_mode_bit_indices +{ + SPM_FC_NONE = 0, + SPM_FC_PAUSE_RX = 1, + SPM_FC_PAUSE_TX = 2, + SPM_FC_PAUSE_FULL = 3, + SPM_FC_PFC_FULL = 4, +}; + +struct zxdh_en_module_eeprom_param +{ + uint8_t i2c_addr; + uint8_t bank; + uint8_t page; + uint8_t offset; + uint8_t length; +}; + +#define SFF_I2C_ADDRESS_LOW (0x50) +#define SFF_I2C_ADDRESS_HIGH (0x51) + +enum zxdh_module_id { + ZXDH_MODULE_ID_SFP = 0x3, + ZXDH_MODULE_ID_QSFP = 0xC, + ZXDH_MODULE_ID_QSFP_PLUS = 0xD, + ZXDH_MODULE_ID_QSFP28 = 0x11, + ZXDH_MODULE_ID_QSFP_DD = 0x18, + ZXDH_MODULE_ID_OSFP = 0x19, + ZXDH_MODULE_ID_DSFP = 0x1B, +}; + +#define SPEED_MODES_TO_SPEED(speed_modes, speed) \ +do \ +{ \ + if (((speed_modes) & BIT(SPM_SPEED_1X_1G)) == BIT(SPM_SPEED_1X_1G)) \ + { \ + (speed) = SPEED_1000; \ + } \ + else if (((speed_modes) & BIT(SPM_SPEED_1X_10G)) == BIT(SPM_SPEED_1X_10G)) \ + { \ + (speed) = SPEED_10000; \ + } \ + else if (((speed_modes) & BIT(SPM_SPEED_1X_25G)) == BIT(SPM_SPEED_1X_25G)) \ + { \ + (speed) = SPEED_25000; \ + } \ + else if (((speed_modes) & BIT(SPM_SPEED_4X_40G)) == BIT(SPM_SPEED_4X_40G)) \ + { \ + (speed) = SPEED_40000; \ + } \ + else if (((speed_modes) & BIT(SPM_SPEED_1X_50G)) == BIT(SPM_SPEED_1X_50G)) \ + { \ + (speed) = SPEED_50000; \ + } \ + else if (((speed_modes) & BIT(SPM_SPEED_2X_100G)) == BIT(SPM_SPEED_2X_100G)) \ + { \ + (speed) = SPEED_100000; \ + } \ + else if (((speed_modes) & BIT(SPM_SPEED_4X_100G)) == BIT(SPM_SPEED_4X_100G)) \ + { \ + (speed) = SPEED_100000; \ + } \ + else \ + { \ + (speed) = SPEED_UNKNOWN; \ + } \ +} while (0) + +#define GET_VFID(vport) \ + (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) ? \ + (PF_VQM_VFID_OFFSET + EPID(vport) * 8 + FUNC_NUM(vport)) : \ + (EPID(vport) * 256 + VFUNC_NUM(vport)) \ + + +#define NP_GET_PKT_CNT 0 +#define NP_CLEAR_PKT_CNT 1 + +struct zxdh_en_device; +int32_t zxdh_common_tbl_init(struct net_device *netdev); +int32_t zxdh_en_phyport_init(struct zxdh_en_device *en_dev); +int32_t zxdh_en_autoneg_set(struct zxdh_en_device *en_dev, uint8_t enable, uint32_t speed_modes); +int32_t zxdh_vport_stats_get(struct zxdh_en_device *en_dev); +int32_t zxdh_en_vport_pre_stats_get(struct zxdh_en_device *en_dev); +int32_t zxdh_mac_stats_get(struct zxdh_en_device *en_dev); +int32_t zxdh_mac_stats_clear(struct zxdh_en_device *en_dev); +int32_t zxdh_hash_id_get(struct zxdh_en_device *en_dev); +int32_t zxdh_en_fec_mode_set(struct zxdh_en_device *en_dev, uint32_t fec_cfg); +int32_t zxdh_en_fec_mode_get(struct zxdh_en_device *en_dev, uint32_t *fec_cap, uint32_t *fec_cfg, uint32_t *fec_active); +int32_t zxdh_en_fc_mode_set(struct zxdh_en_device *en_dev, uint32_t fc_mode); +int32_t zxdh_en_fc_mode_get(struct zxdh_en_device *en_dev, uint32_t *fc_mode); +uint32_t zxdh_en_module_eeprom_read(struct zxdh_en_device *en_dev, struct zxdh_en_module_eeprom_param *query, uint8_t *data); +int32_t zxdh_lldp_enable_set(struct zxdh_en_device *en_dev, bool lldp_enable); +int32_t zxdh_sshd_enable_set(struct zxdh_en_device *en_dev, bool sshd_enable); +int32_t zxdh_vf_dpp_add_mac(struct zxdh_en_device *en_dev, const uint8_t *dev_addr, uint8_t filter_flag); +int32_t zxdh_vf_dpp_del_mac(struct zxdh_en_device *en_dev, const uint8_t *dev_addr, uint8_t filter_flag, bool mac_flag); +void zxdh_vport_uninit(struct net_device *netdev); +int32_t zxdh_pf_port_init(struct net_device *netdev); +int32_t zxdh_vf_dpp_port_init(struct net_device *netdev); +int32_t zxdh_vf_egr_port_attr_set(struct zxdh_en_device *en_dev, uint32_t mode, uint32_t value, uint8_t fow); +int32_t zxdh_vf_egr_port_attr_get(struct zxdh_en_device *en_dev, ZXDH_VPORT_T *port_attr_entry); +int32_t zxdh_vf_rss_en_set(struct zxdh_en_device *en_dev, uint32_t enable); +int32_t zxdh_num_channels_changed(struct zxdh_en_device *en_dev, uint16_t num_changed); +int32_t zxdh_send_command_to_specify(struct zxdh_en_device *en_dev, uint16_t module_id, void *msg, void *ack); +int32_t zxdh_pf_macpcs_num_get(struct zxdh_en_device *en_dev); +int32_t zxdh_lldp_enable_get(struct zxdh_en_device *en_dev, uint32_t *lldp_enable); +int32_t zxdh_vf_get_mac(struct net_device *netdev); +int32_t zxdh_rxfh_set(struct zxdh_en_device *en_dev, uint32_t *queue_map); +void zxdh_rxfh_del(struct zxdh_en_device *en_dev); +void zxdh_u32_array_print(uint32_t *array, uint16_t size); +int32_t zxdh_en_firmware_version_get(struct zxdh_en_device *en_dev, uint8_t *fw_version, uint8_t *fw_version_len); +int32_t zxdh_panel_id_get(struct zxdh_en_device *en_dev); +int32_t zxdh_vf_port_promisc_set(struct zxdh_en_device *en_dev, uint8_t mode, uint8_t value, uint8_t fow); +int32_t zxdh_phyport_get(struct zxdh_en_device *en_dev); +int32_t zxdh_vf_1588_call_np_interface(struct zxdh_en_device *en_dev); +int32_t zxdh_aux_alloc_pannel(struct zxdh_en_device *en_dev); +int8_t zxdh_debug_ip_get(struct zxdh_en_device *en_dev, int8_t *ip); +int32_t zxdh_riscv_os_type_get(struct zxdh_en_device *en_dev, uint8_t *is_zios); +int32_t zxdh_vf_dpp_add_ipv6_mac(struct zxdh_en_device *en_dev, const uint8_t *mac_addr); +int32_t zxdh_vf_dpp_del_ipv6_mac(struct zxdh_en_device *en_dev, const uint8_t *mac_addr); + +#endif /* END __ZXDH_EN_COMMAND_H_ */ diff --git a/src/net/drivers/net/ethernet/dinghai/en_aux/en_ioctl.c b/src/net/drivers/net/ethernet/dinghai/en_aux/en_ioctl.c new file mode 100644 index 0000000..f8a48fb --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_aux/en_ioctl.c @@ -0,0 +1,1463 @@ +#include +#include "en_ioctl.h" +#include "en_cmd.h" +#include "../zxdh_tools/zxdh_tools_ioctl.h" +#include "queue.h" +#include "priv_queue.h" +#include "../en_np/table/include/dpp_tbl_api.h" +#include "../en_pf/msg_func.h" +#include "../en_pf/eq.h" +#include "../en_tsn/zxdh_tsn_ioctl.h" + +extern int32_t tod_device_set_bar_virtual_addr(uint64_t virtaddr, uint16_t pcieid); +int32_t print_data(uint8_t *data, uint32_t len) +{ + int32_t i = 0; + uint32_t loopcnt = 0; + uint32_t last_line_len = 0; + uint32_t line_len = PKT_PRINT_LINE_LEN; + uint8_t last_line_data[PKT_PRINT_LINE_LEN] = {0}; + + if (len == 0) + { + return 0; + } + loopcnt = len / line_len; + last_line_len = len % line_len; + + LOG_DEBUG("***************packet data[len: %d]***************\n", len); + for (i = 0; i < loopcnt; i++) + { + LOG_INFO("%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x\n", \ + *(data + (line_len * i) + 0), *(data + (line_len * i) + 1), *(data + (line_len * i) + 2), *(data + (line_len * i) + 3), \ + *(data + (line_len * i) + 4), *(data + (line_len * i) + 5), *(data + (line_len * i) + 6), *(data + (line_len * i) + 7), \ + *(data + (line_len * i) + 8), *(data + (line_len * i) + 9), *(data + (line_len * i) + 10), *(data + (line_len * i) + 11), \ + *(data + (line_len * i) + 12), *(data + (line_len * i) + 13), *(data + (line_len * i) + 14), *(data + (line_len * i) + 15)); + } + if (last_line_len != 0) + { + memcpy(last_line_data, (data + (line_len * i)), last_line_len); + LOG_INFO("%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x\n", \ + last_line_data[0], last_line_data[1], last_line_data[2], last_line_data[3], \ + last_line_data[4], last_line_data[5], last_line_data[6], last_line_data[7], \ + last_line_data[8], last_line_data[9], last_line_data[10], last_line_data[11], \ + last_line_data[12], last_line_data[13], last_line_data[14], last_line_data[15]); + } + LOG_INFO("****************end packet data**************\n"); + + return 0; +} + +int32_t zxdh_read_reg_cmd(struct net_device *netdev, struct ifreq *ifr) +{ + struct zxdh_en_priv *en_priv = NULL; + struct zxdh_en_device *en_dev = NULL; + struct zxdh_en_reg *reg = NULL; + uint32_t size = sizeof(struct zxdh_en_reg); + uint64_t base_addr = 0; + uint32_t num = 0; + int32_t err = 0; + + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + + en_priv = netdev_priv(netdev); + CHECK_EQUAL_ERR(en_priv, NULL, -EADDRNOTAVAIL, "netdev priv is null!\n"); + en_dev = &en_priv->edev; + + reg = kzalloc(size, GFP_KERNEL); + CHECK_EQUAL_ERR(reg, NULL, -EADDRNOTAVAIL, "reg is null!\n"); + + if (copy_from_user(reg, ifr->ifr_ifru.ifru_data, size)) + { + LOG_ERR("copy_from_user failed\n"); + err = -EFAULT; + goto err_ret; + } + + if ((reg->num == 0) || (reg->num > MAX_ACCESS_NUM)) + { + LOG_ERR("transmit failed, reg->num=%u\n", reg->num); + err = -EFAULT; + goto err_ret; + } + + base_addr = en_dev->ops->get_bar_virt_addr(en_dev->parent, 0); + + for (num = 0; num < reg->num; num++) + { + reg->data[num] = readl((const volatile void *)(base_addr + (reg->offset & 0xfffffffc) + num * 4)); + } + + if (copy_to_user(ifr->ifr_ifru.ifru_data, reg, size)) + { + LOG_ERR("copy_to_user failed\n"); + err = -EFAULT; + } + +err_ret: + kfree(reg); + return err; +} + +int32_t zxdh_write_reg_cmd(struct net_device *netdev, struct ifreq *ifr) +{ + struct zxdh_en_priv *en_priv = NULL; + struct zxdh_en_device *en_dev = NULL; + struct zxdh_en_reg *reg = NULL; + uint32_t size = sizeof(struct zxdh_en_reg); + uint64_t base_addr = 0; + uint32_t num = 0; + int32_t err = 0; + + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + + en_priv = netdev_priv(netdev); + CHECK_EQUAL_ERR(en_priv, NULL, -EADDRNOTAVAIL, "netdev priv is null!\n"); + en_dev = &en_priv->edev; + + reg = kzalloc(size, GFP_KERNEL); + CHECK_EQUAL_ERR(reg, NULL, -EADDRNOTAVAIL, "reg is null!\n"); + + if (copy_from_user(reg, ifr->ifr_ifru.ifru_data, size)) + { + LOG_ERR("copy_from_user failed\n"); + err = -EFAULT; + goto err_ret; + } + + if ((reg->num == 0) || (reg->num > MAX_ACCESS_NUM)) + { + LOG_ERR("transmit failed, reg->num=%u\n", reg->num); + err = -EFAULT; + goto err_ret; + } + + base_addr = en_dev->ops->get_bar_virt_addr(en_dev->parent, 0); + + for (num = 0; num < reg->num; num++) + { + writel(reg->data[num], (volatile void *)(base_addr + (reg->offset & 0xfffffffc) + num * 4)); + } + +err_ret: + kfree(reg); + return err; +} + +int32_t print_vring_info(struct virtqueue *vq, struct zxdh_en_reg *reg) +{ + struct vring_virtqueue *vvq = to_vvq(vq); + + if ((reg->num + reg->data[0]) > vvq->packed.vring.num) + { + LOG_ERR("the sum of desc_index %u and desc_num %u over desc depth %u, should be [0-%u]\n", \ + reg->num, reg->data[0], vvq->packed.vring.num, vvq->packed.vring.num - 1); + return -EINVAL; + } + + zxdh_print_vring_info(vq, reg->num, reg->num + reg->data[0]); + + return 0; +} + +int32_t zxdh_get_vring_info(struct net_device *netdev, struct ifreq *ifr) +{ + struct zxdh_en_priv *en_priv = NULL; + struct zxdh_en_device *en_dev = NULL; + struct zxdh_en_reg *reg = NULL; + uint32_t size = sizeof(struct zxdh_en_reg); + struct virtqueue *vq = NULL; + int32_t ret = 0; + + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + + en_priv = netdev_priv(netdev); + CHECK_EQUAL_ERR(en_priv, NULL, -EADDRNOTAVAIL, "netdev priv is null!\n"); + en_dev = &en_priv->edev; + + reg = kzalloc(size, GFP_KERNEL); + CHECK_EQUAL_ERR(reg, NULL, -EADDRNOTAVAIL, "reg is null!\n"); + + if (copy_from_user(reg, ifr->ifr_ifru.ifru_data, size)) + { + LOG_ERR("copy_from_user failed\n"); + ret = -EFAULT; + goto err_ret; + } + + if (reg->offset >= en_dev->max_queue_pairs) + { + LOG_ERR("the queue index %u over the curr_queue_pairs %u, should be [0-%u]\n", \ + reg->offset, en_dev->curr_queue_pairs, en_dev->curr_queue_pairs - 1); + ret = -EINVAL; + goto err_ret; + } + + vq = en_dev->sq[reg->offset].vq; + LOG_INFO("******************************tx vring info****************************\n"); + ret = print_vring_info(vq, reg); + if (ret != 0) + { + LOG_ERR("print tx vring info failed!\n"); + ret = -EINVAL; + goto err_ret; + } + + vq = en_dev->rq[reg->offset].vq; + LOG_INFO("******************************rx vring info****************************\n"); + ret = print_vring_info(vq, reg); + if (ret != 0) + { + LOG_ERR("print rx vring info failed!\n"); + ret = -EINVAL; + } + +err_ret: + kfree(reg); + return ret; +} + +int32_t zxdh_en_set_clock_no(struct net_device *netdev, struct ifreq *ifr, struct zxdh_en_reg *reg) +{ + uint32_t reg_size = sizeof(struct zxdh_en_reg); + struct zxdh_en_priv *en_priv = NULL; + struct zxdh_en_device *en_dev = NULL; + + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + + en_priv = netdev_priv(netdev); + CHECK_EQUAL_ERR(en_priv, NULL, -EADDRNOTAVAIL, "netdev priv is null!\n"); + en_dev = &en_priv->edev; + + if (reg->num != 1) + { + LOG_ERR("Transmit failed[len = %d]!\n", reg->num); + goto err_ret; + } + + en_dev->clock_no = reg->data[0]; + LOG_INFO("en_dev %s clock_no = %d\n", en_dev->netdev->name, en_dev->clock_no); + + reg->num = 0; + if (unlikely(copy_to_user(ifr->ifr_ifru.ifru_data, reg, reg_size))) + { + LOG_ERR("copy_to_user failed!\n"); + goto err_ret; + } + + return 0; + +err_ret: + return -1; +} + +void copy_u32_to_u8(uint8_t *data_pkt, uint32_t *data, uint32_t pktlen) +{ + uint32_t i = 0; + + for (i = 0; i < pktlen; i++) + { + *data_pkt++ = data[i]; + } +} + +int32_t zxdh_tx_file_pkts(struct zxdh_en_priv *en_priv, struct zxdh_en_reg *reg) +{ + int32_t total_sg = 0; + uint8_t *data_pkt = NULL; + struct scatterlist *sg = NULL; + struct zxdh_en_device *en_dev = &en_priv->edev; + struct send_queue *sq = en_dev->sq; + struct page *page = NULL; + struct data_packet pkt = {0}; + uint16_t i = 0; + uint32_t len = 0; + void *ptr = NULL; + uint32_t last_buff_len = 0; + uint32_t pktLen = reg->num; + uint32_t buffLen = 4096; + + while ((ptr = virtqueue_get_buf(sq->vq, &len)) != NULL) + { + LOG_ERR("virtqueue_get_buf() != NULL, ptr=0x%llx, len=0x%x\n", (uint64_t)ptr, len); + }; + + sg = sq->sg; + pkt.buf_size = 16 * PAGE_SIZE; + page = alloc_pages(GFP_KERNEL, 4); + if (unlikely(page == NULL)) + { + LOG_ERR("page is null\n"); + goto err; + } + + pkt.buf = page_address(page); + if (unlikely(pkt.buf == NULL)) + { + LOG_ERR("pkt.buf is null\n"); + goto err1; + } + memset(pkt.buf, 0, pkt.buf_size); + + data_pkt = (uint8_t*)pkt.buf; + copy_u32_to_u8(data_pkt, reg->data, pktLen); + print_data(data_pkt, (pktLen > PKT_PRINT_LEN_MAX) ? PKT_PRINT_LEN_MAX : pktLen); + + total_sg = pktLen / buffLen; + last_buff_len = pktLen % buffLen; + if (last_buff_len != 0) + { + total_sg += 1; + } + + sg_init_table(sg, total_sg); + for (i = 0; i < total_sg; i++) + { + if (i == (total_sg - 1)) + { + sg_set_buf(&sg[i], data_pkt + (i * buffLen), ((last_buff_len != 0) ? last_buff_len : buffLen)); + } + else + { + sg_set_buf(&sg[i], data_pkt + (i * buffLen), buffLen); + } + } + + if (unlikely(virtqueue_add_outbuf(sq->vq, sg, total_sg, data_pkt, GFP_ATOMIC) != 0)) + { + LOG_ERR("virtqueue_add_outbuf failure!\n"); + goto err1; + } + + if (virtqueue_kick_prepare_packed(sq->vq) && virtqueue_notify(sq->vq)) + { + u64_stats_update_begin(&sq->stats.syncp); + sq->stats.kicks++; + u64_stats_update_end(&sq->stats.syncp); + } + + en_dev->netdev->stats.tx_packets++; + en_dev->netdev->stats.tx_bytes += pktLen; + LOG_INFO("en_dev->netdev->stats.tx_packets=%ld, tx pktLen=%d\n", en_dev->netdev->stats.tx_packets, pktLen); + + return 0; + +err1: + free_pages((uint64_t)pkt.buf, 4); +err: + return -1; +} + +int32_t zxdh_send_file_pkt(struct net_device *netdev, struct ifreq *ifr) +{ + struct zxdh_en_priv *en_priv = NULL; + struct zxdh_en_reg *reg = NULL; + uint32_t size = sizeof(struct zxdh_en_reg); + int32_t ret = 0; + + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + + en_priv = netdev_priv(netdev); + CHECK_EQUAL_ERR(en_priv, NULL, -EADDRNOTAVAIL, "netdev priv is null!\n"); + + reg = kzalloc(size, GFP_KERNEL); + CHECK_EQUAL_ERR(reg, NULL, -EADDRNOTAVAIL, "reg is null!\n"); + + if (copy_from_user(reg, ifr->ifr_ifru.ifru_data, size)) + { + LOG_ERR("copy_from_user failed\n"); + ret = -EFAULT; + goto err_ret; + } + + if ((reg->num == 0) || (reg->num > MAX_ACCESS_NUM)) + { + LOG_ERR("transmit failed, reg->num=%d\n", reg->num); + ret = -EFAULT; + goto err_ret; + } + + ret = zxdh_tx_file_pkts(en_priv, reg); + if (unlikely(ret != 0)) + { + LOG_ERR("transmit failed[ret = %d]!", ret); + ret = -1; + goto err_ret; + } + + reg->num = 0; + if (copy_to_user(ifr->ifr_ifru.ifru_data, reg, size)) + { + LOG_ERR("copy_to_user failed\n"); + ret = -EFAULT; + } + +err_ret: + kfree(reg); + return ret; +} + +#ifdef PTP_DRIVER_INTERFACE_EN +/* ptp发送加密报文时,需要调用使能函数进行使能 */ +extern int32_t enable_write_ts_to_fifo(struct zxdh_en_device *en_dev, uint32_t enable, uint32_t mac_number); +extern int32_t set_interrupt_capture_timer(struct zxdh_en_device *en_dev, uint32_t index); +extern int32_t zxdh_set_pps_selection(struct zxdh_en_device *en_dev, uint32_t pps_type, uint32_t selection); +extern int32_t zxdh_set_pd_detection(struct zxdh_en_device *en_dev, uint32_t pd_index, uint32_t pd_input1, uint32_t pd_input2); +extern int32_t zxdh_get_pd_value(struct zxdh_en_device *en_dev, uint32_t pd_index, uint32_t *pd_result); +#endif /* PTP_DRIVER_INTERFACE_EN */ +int32_t zxdh_en_enable_ptp_encrypted_msg(struct net_device *netdev, struct ifreq *ifr, struct zxdh_en_reg *reg) +{ + uint32_t reg_size = sizeof(struct zxdh_en_reg); + int32_t mac_num = 0; //0-2 + struct zxdh_en_priv *en_priv = NULL; + struct zxdh_en_device *en_dev = NULL; + uint32_t enable = 0; + int32_t ret = 0; + + LOG_INFO("enter in zxdh_en_enable_ptp_encrypted_msg\n"); + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + + en_priv = netdev_priv(netdev); + CHECK_EQUAL_ERR(en_priv, NULL, -EADDRNOTAVAIL, "netdev priv is null!\n"); + en_dev = &en_priv->edev; + + mac_num = zxdh_pf_macpcs_num_get(en_dev); + if (mac_num < 0) + { + LOG_ERR("get mac num %d err, its value should is 0-2!\n", mac_num); + goto err_ret; + } + + if (unlikely(copy_from_user(reg, ifr->ifr_ifru.ifru_data, reg_size))) + { + LOG_ERR("copy_from_user failed!\n"); + goto err_ret; + } + if (reg->num != 1) + { + LOG_ERR("Transmit failed[len = %d]!\n", reg->num); + goto err_ret; + } + + enable = reg->data[0]; + if ((enable != 0) && (enable != 1)) + { + LOG_ERR("Transmit failed[enable = %u]!\n", enable); + goto err_ret; + } + + LOG_INFO("enable = %u\n", enable); + +#ifdef PTP_DRIVER_INTERFACE_EN + /* 使能ptp加密报文发送接口 */ + ret = enable_write_ts_to_fifo(en_dev, enable, mac_num); + CHECK_UNEQUAL_ERR(ret, 0, -EFAULT, "enable ptp encrypted msg failed!!\n"); +#endif /* PTP_DRIVER_INTERFACE_EN */ + + reg->num = 0; + if (unlikely(copy_to_user(ifr->ifr_ifru.ifru_data, reg, reg_size))) + { + LOG_ERR("copy_to_user failed!\n"); + goto err_ret; + } + + return ret; + +err_ret: + return -1; +} + +int32_t zxdh_en_set_intr_capture_timer(struct net_device *netdev, struct ifreq *ifr, struct zxdh_en_reg *reg) +{ + u_int32_t index; + uint32_t reg_size = sizeof(struct zxdh_en_reg); + struct zxdh_en_priv *en_priv = NULL; + struct zxdh_en_device *en_dev = NULL; + int32_t ret = 0; + + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + + en_priv = netdev_priv(netdev); + CHECK_EQUAL_ERR(en_priv, NULL, -EADDRNOTAVAIL, "netdev priv is null!\n"); + en_dev = &en_priv->edev; + + if (reg->num != 1) + { + LOG_ERR("Transmit failed[len = %d]!", reg->num); + goto err_ret; + } + + index = reg->data[0]; + LOG_INFO("index = %d\n", index); + if (index > 4) + { + LOG_ERR("capture timer out of range!"); + goto err_ret; + } +#ifdef PTP_DRIVER_INTERFACE_EN + ret = set_interrupt_capture_timer(en_dev, index); + CHECK_UNEQUAL_ERR(ret, 0, -EFAULT, "set interrupt capture timer failed!!\n"); +#endif /* PTP_DRIVER_INTERFACE_EN */ + + reg->num = 0; + if (unlikely(copy_to_user(ifr->ifr_ifru.ifru_data, reg, reg_size))) + { + LOG_ERR("copy_to_user failed!!!\n"); + goto err_ret; + } + + return ret; + +err_ret: + return -1; + +} + +int32_t zxdh_en_set_pps_selection(struct net_device *netdev, struct ifreq *ifr, struct zxdh_en_reg *reg) +{ + uint32_t pps_type; + uint32_t selection; + uint32_t reg_size = sizeof(struct zxdh_en_reg); + struct zxdh_en_priv *en_priv = NULL; + struct zxdh_en_device *en_dev = NULL; + int32_t ret = 0; + + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + + en_priv = netdev_priv(netdev); + CHECK_EQUAL_ERR(en_priv, NULL, -EADDRNOTAVAIL, "netdev priv is null!\n"); + en_dev = &en_priv->edev; + + if (reg->num != 2) + { + LOG_ERR("Transmit failed[len = %d]!", reg->num); + goto err_ret; + } + + pps_type = reg->data[0]; + selection = reg->data[1]; + LOG_INFO("pps_type = %u, selection = %u\n", pps_type, selection); +#ifdef PTP_DRIVER_INTERFACE_EN + ret = zxdh_set_pps_selection(en_dev, pps_type, selection); + CHECK_UNEQUAL_ERR(ret, 0, -EFAULT, "set pps selection failed!!\n"); +#endif /* PTP_DRIVER_INTERFACE_EN */ + + reg->num = 0; + if (unlikely(copy_to_user(ifr->ifr_ifru.ifru_data, reg, reg_size))) + { + LOG_ERR("copy_to_user failed!!!\n"); + goto err_ret; + } + + return ret; + +err_ret: + return -1; +} + +int32_t zxdh_en_set_phase_detection(struct net_device *netdev, struct ifreq *ifr, struct zxdh_en_reg *reg) +{ + uint32_t pd_index; + uint32_t pd_input1; + uint32_t pd_input2; + uint32_t reg_size = sizeof(struct zxdh_en_reg); + struct zxdh_en_priv *en_priv = NULL; + struct zxdh_en_device *en_dev = NULL; + int32_t ret = 0; + + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + + en_priv = netdev_priv(netdev); + CHECK_EQUAL_ERR(en_priv, NULL, -EADDRNOTAVAIL, "netdev priv is null!\n"); + en_dev = &en_priv->edev; + + if (reg->num != 3) + { + LOG_ERR("Transmit failed[len = %d]!", reg->num); + goto err_ret; + } + + pd_index = reg->data[0]; + pd_input1 = reg->data[1]; + pd_input2 = reg->data[2]; + LOG_INFO("pd_index = %u, pd_input1 = %u, pd_input2 = %u\n", pd_index, pd_input1, pd_input2); +#ifdef PTP_DRIVER_INTERFACE_EN + ret = zxdh_set_pd_detection(en_dev, pd_index, pd_input1, pd_input2); + CHECK_UNEQUAL_ERR(ret, 0, -EFAULT, "set pd detection failed!!\n"); +#endif /* PTP_DRIVER_INTERFACE_EN */ + + reg->num = 0; + if (unlikely(copy_to_user(ifr->ifr_ifru.ifru_data, reg, reg_size))) + { + LOG_ERR("copy_to_user failed!!!\n"); + goto err_ret; + } + + return ret; + +err_ret: + return -1; +} + +int32_t zxdh_en_get_pd_value(struct net_device *netdev, struct ifreq *ifr, struct zxdh_en_reg *reg) +{ + uint32_t pd_index; + uint32_t pd_result; + uint32_t reg_size = sizeof(struct zxdh_en_reg); + struct zxdh_en_priv *en_priv = NULL; + struct zxdh_en_device *en_dev = NULL; + int32_t ret = 0; + + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + + en_priv = netdev_priv(netdev); + CHECK_EQUAL_ERR(en_priv, NULL, -EADDRNOTAVAIL, "netdev priv is null!\n"); + en_dev = &en_priv->edev; + + if (reg->num != 1) + { + LOG_ERR("Transmit failed[len = %d]!", reg->num); + goto err_ret; + } + + pd_index = reg->data[0]; + LOG_INFO("pd_index = %u\n", pd_index); +#ifdef PTP_DRIVER_INTERFACE_EN + ret = zxdh_get_pd_value(en_dev, pd_index, &pd_result); + CHECK_UNEQUAL_ERR(ret, 0, -EFAULT, "get pd value failed!!\n"); +#endif /* PTP_DRIVER_INTERFACE_EN */ + + reg->num = 1; + reg->data[0] = pd_result; + if (unlikely(copy_to_user(ifr->ifr_ifru.ifru_data, reg, reg_size))) + { + LOG_ERR("copy_to_user failed!!!\n"); + goto err_ret; + } + + return ret; + +err_ret: + return -1; +} + +int32_t zxdh_en_set_l2_ptp_port(struct net_device *netdev, struct ifreq *ifr, struct zxdh_en_reg *reg) +{ + uint32_t reg_size = sizeof(struct zxdh_en_reg); + struct zxdh_en_priv *en_priv = NULL; + struct zxdh_en_device *en_dev = NULL; + int32_t ret = 0; + DPP_PF_INFO_T pf_info = {0}; + + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + + en_priv = netdev_priv(netdev); + CHECK_EQUAL_ERR(en_priv, NULL, -EADDRNOTAVAIL, "netdev priv is null!\n"); + en_dev = &en_priv->edev; + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + LOG_INFO("reg->num: %d", reg->num); + LOG_INFO("reg->offset: %d", reg->offset); + if (reg->num != 1) + { + LOG_ERR("Transmit failed[len = %d]!", reg->num); + goto err_ret; + } + + en_dev->vf_1588_call_np_num = PTP_PORT_VFID_SET; + LOG_INFO("en_dev->vport: 0x%x, IS_PF(en_dev->vport): %d", en_dev->vport, IS_PF(en_dev->vport)); + if (IS_PF(en_dev->vport)) + { + ret = dpp_ptp_port_vfid_set(&pf_info, VQM_VFID(en_dev->vport)); + if (ret != 0) + { + LOG_ERR("dpp_ptp_port_vfid_set failed!!!\n"); + goto err_ret; + } + } + else + { + ret = zxdh_vf_1588_call_np_interface(en_dev); + if (ret != 0) + { + LOG_ERR("zxdh_vf_1588_call_np_interface failed!!!\n"); + goto err_ret; + } + } + + reg->num = 0; + if (unlikely(copy_to_user(ifr->ifr_ifru.ifru_data, reg, reg_size))) + { + LOG_ERR("copy_to_user failed!!!\n"); + goto err_ret; + } + LOG_INFO("dpp_ptp_port_vfid_set success"); + + return ret; + +err_ret: + return -1; +} + +int32_t zxdh_en_set_ptp_tc_enable(struct net_device *netdev, struct ifreq *ifr, struct zxdh_en_reg *reg) +{ + uint32_t reg_size = sizeof(struct zxdh_en_reg); + struct zxdh_en_priv *en_priv = NULL; + struct zxdh_en_device *en_dev = NULL; + int32_t ret = 0; + DPP_PF_INFO_T pf_info = {0}; + + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + + en_priv = netdev_priv(netdev); + CHECK_EQUAL_ERR(en_priv, NULL, -EADDRNOTAVAIL, "netdev priv is null!\n"); + en_dev = &en_priv->edev; + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + if (reg->num != 1) + { + LOG_ERR("Transmit failed[len = %d]!", reg->num); + goto err_ret; + } + + en_dev->ptp_tc_enable_opt = reg->data[0]; + LOG_INFO("en_dev->ptp_tc_enable_opt = %u\n", en_dev->ptp_tc_enable_opt); + + en_dev->vf_1588_call_np_num = PTP_TC_ENABLE_SET; + + if (IS_PF(en_dev->vport)) + { + ret = dpp_ptp_tc_enable_set(&pf_info, en_dev->ptp_tc_enable_opt); + if (ret != 0) + { + LOG_ERR("dpp_ptp_tc_enable_set failed!!!\n"); + goto err_ret; + } + } + else + { + ret = zxdh_vf_1588_call_np_interface(en_dev); + if (ret != 0) + { + LOG_ERR("zxdh_vf_1588_call_np_interface failed!!!\n"); + goto err_ret; + } + } + + reg->num = 0; + if (unlikely(copy_to_user(ifr->ifr_ifru.ifru_data, reg, reg_size))) + { + goto err_ret; + } + + return ret; + +err_ret: + return -1; +} + +int32_t zxdh_en_set_synce_recovery_port(struct net_device *netdev, struct ifreq *ifr, struct zxdh_en_reg *reg) +{ + uint32_t reg_size = sizeof(struct zxdh_en_reg); + struct zxdh_en_priv *en_priv = NULL; + struct zxdh_en_device *en_dev = NULL; + int32_t ret = 0; + union zxdh_msg msg = {0}; + int32_t err = 0; + + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + + en_priv = netdev_priv(netdev); + CHECK_EQUAL_ERR(en_priv, NULL, -EADDRNOTAVAIL, "netdev priv is null!\n"); + en_dev = &en_priv->edev; + + if (reg->num != 1) + { + LOG_ERR("Transmit failed[len = %d]!", reg->num); + goto err_ret; + } + + msg.payload.hdr_to_agt.op_code = AGENT_MAC_RECOVERY_CLK_SET; + msg.payload.hdr_to_agt.phyport = en_dev->phy_port; + msg.payload.synce_clk_recovery_port.clk_speed = reg->data[0]; + LOG_INFO("phyport = %u, clk_speed = %u\n", msg.payload.hdr_to_agt.phyport, msg.payload.synce_clk_recovery_port.clk_speed); + err = zxdh_send_command_to_specify(en_dev, MODULE_MAC, &msg, &msg); + if (err != 0) + { + LOG_ERR("zxdh_en_set_synce_recovery_port failed, err: %d\n", err); + return err; + } + + reg->num = 0; + if (unlikely(copy_to_user(ifr->ifr_ifru.ifru_data, reg, reg_size))) + { + goto err_ret; + } + + return ret; + +err_ret: + return -1; +} + +int32_t zxdh_en_get_synce_clk_stats(struct net_device *netdev, struct ifreq *ifr, struct zxdh_en_reg *reg) +{ + uint32_t reg_size = sizeof(struct zxdh_en_reg); + struct zxdh_en_priv *en_priv = NULL; + struct zxdh_en_device *en_dev = NULL; + int32_t ret = 0; + union zxdh_msg msg = {0}; + int32_t err = 0; + + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + + en_priv = netdev_priv(netdev); + CHECK_EQUAL_ERR(en_priv, NULL, -EADDRNOTAVAIL, "netdev priv is null!\n"); + en_dev = &en_priv->edev; + + if (reg->num != 1) + { + LOG_ERR("Transmit failed[len = %d]!", reg->num); + goto err_ret; + } + + msg.payload.hdr_to_agt.op_code = AGENT_MAC_SYNCE_CLK_STATS_GET; + msg.payload.hdr_to_agt.phyport = en_dev->phy_port; + LOG_INFO("phyport = %u\n", msg.payload.hdr_to_agt.phyport); + err = zxdh_send_command_to_specify(en_dev, MODULE_MAC, &msg, &msg); + if (err != 0) + { + LOG_ERR("zxdh_en_get_synce_clk_stats failed, err: %d\n", err); + return err; + } + + reg->num = 1; + reg->data[0] = msg.reps.synce_clk_recovery_port.clk_stats; + if (unlikely(copy_to_user(ifr->ifr_ifru.ifru_data, reg, reg_size))) + { + goto err_ret; + } + LOG_INFO("num = %u, clk_stats: 0x%x\n", reg->num, reg->data[0]); + + return ret; + +err_ret: + return -1; +} + +int32_t zxdh_en_set_spm_port_tstamp_enable(struct net_device *netdev, struct ifreq *ifr, struct zxdh_en_reg *reg) +{ + uint32_t reg_size = sizeof(struct zxdh_en_reg); + struct zxdh_en_priv *en_priv = NULL; + struct zxdh_en_device *en_dev = NULL; + int32_t ret = 0; + union zxdh_msg msg = {0}; + int32_t err = 0; + + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + + en_priv = netdev_priv(netdev); + CHECK_EQUAL_ERR(en_priv, NULL, -EADDRNOTAVAIL, "netdev priv is null!\n"); + en_dev = &en_priv->edev; + + if (reg->num != 2) + { + LOG_ERR("Transmit failed[len = %d]!", reg->num); + goto err_ret; + } + + msg.payload.hdr_to_agt.op_code = AGENT_MAC_PORT_TSTAMP_ENABLE_SET; + msg.payload.hdr_to_agt.phyport = en_dev->phy_port; // 0~9 + msg.payload.mac_tstamp_msg.tx_enable = reg->data[0]; + msg.payload.mac_tstamp_msg.rx_enable = reg->data[1]; + LOG_INFO("phyport = %u, tx_enable: %u, rx_enable: %u\n", msg.payload.hdr_to_agt.phyport, msg.payload.mac_tstamp_msg.tx_enable, msg.payload.mac_tstamp_msg.rx_enable); + err = zxdh_send_command_to_specify(en_dev, MODULE_MAC, &msg, &msg); + if (err != 0) + { + LOG_ERR("zxdh_en_set_spm_port_tstamp_enable failed, err: %d\n", err); + return err; + } + + reg->num = 0; + if (unlikely(copy_to_user(ifr->ifr_ifru.ifru_data, reg, reg_size))) + { + goto err_ret; + } + + return ret; + +err_ret: + return -1; +} + +int32_t zxdh_en_get_spm_port_tstamp_enable(struct net_device *netdev, struct ifreq *ifr, struct zxdh_en_reg *reg) +{ + uint32_t reg_size = sizeof(struct zxdh_en_reg); + struct zxdh_en_priv *en_priv = NULL; + struct zxdh_en_device *en_dev = NULL; + int32_t ret = 0; + union zxdh_msg msg = {0}; + int32_t err = 0; + + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + + en_priv = netdev_priv(netdev); + CHECK_EQUAL_ERR(en_priv, NULL, -EADDRNOTAVAIL, "netdev priv is null!\n"); + en_dev = &en_priv->edev; + + msg.payload.hdr_to_agt.op_code = AGENT_MAC_PORT_TSTAMP_ENABLE_GET; + msg.payload.hdr_to_agt.phyport = en_dev->phy_port; // 0~9 + LOG_INFO("phyport = %u\n", msg.payload.hdr_to_agt.phyport); + err = zxdh_send_command_to_specify(en_dev, MODULE_MAC, &msg, &msg); + if (err != 0) + { + LOG_ERR("zxdh_en_get_spm_port_tstamp_enable failed, err: %d\n", err); + return err; + } + + reg->num = 2; + reg->data[0] = msg.reps.mac_tstamp_msg.tx_enable; + reg->data[1] = msg.reps.mac_tstamp_msg.rx_enable; + LOG_INFO("tx_enable: %u, rx_enable: %u\n", msg.reps.mac_tstamp_msg.tx_enable, msg.reps.mac_tstamp_msg.rx_enable); + + if (unlikely(copy_to_user(ifr->ifr_ifru.ifru_data, reg, reg_size))) + { + goto err_ret; + } + + return ret; + +err_ret: + return -1; +} + +int32_t zxdh_en_set_spm_port_tstamp_mode(struct net_device *netdev, struct ifreq *ifr, struct zxdh_en_reg *reg) +{ + uint32_t reg_size = sizeof(struct zxdh_en_reg); + struct zxdh_en_priv *en_priv = NULL; + struct zxdh_en_device *en_dev = NULL; + int32_t ret = 0; + union zxdh_msg msg = {0}; + int32_t err = 0; + + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + + en_priv = netdev_priv(netdev); + CHECK_EQUAL_ERR(en_priv, NULL, -EADDRNOTAVAIL, "netdev priv is null!\n"); + en_dev = &en_priv->edev; + + if (reg->num != 2) + { + LOG_ERR("Transmit failed[len = %d]!", reg->num); + goto err_ret; + } + + msg.payload.hdr_to_agt.op_code = AGENT_MAC_PORT_TSTAMP_MODE_SET; + msg.payload.hdr_to_agt.phyport = en_dev->phy_port;// 0~9 + msg.payload.mac_tstamp_msg.tx_mode = reg->data[0]; + msg.payload.mac_tstamp_msg.rx_mode = reg->data[1]; + LOG_INFO("phyport = %u, tx_mode: %u, rx_mode: %u\n", msg.payload.hdr_to_agt.phyport, msg.payload.mac_tstamp_msg.tx_mode, msg.payload.mac_tstamp_msg.rx_mode); + err = zxdh_send_command_to_specify(en_dev, MODULE_MAC, &msg, &msg); + if (err != 0) + { + LOG_ERR("zxdh_en_set_spm_port_tstamp_mode failed, err: %d\n", err); + return err; + } + + reg->num = 0; + if (unlikely(copy_to_user(ifr->ifr_ifru.ifru_data, reg, reg_size))) + { + goto err_ret; + } + + return ret; + +err_ret: + return -1; +} + +int32_t zxdh_en_get_spm_port_tstamp_mode(struct net_device *netdev, struct ifreq *ifr, struct zxdh_en_reg *reg) +{ + uint32_t reg_size = sizeof(struct zxdh_en_reg); + struct zxdh_en_priv *en_priv = NULL; + struct zxdh_en_device *en_dev = NULL; + union zxdh_msg msg = {0}; + int32_t err = 0; + + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + + en_priv = netdev_priv(netdev); + CHECK_EQUAL_ERR(en_priv, NULL, -EADDRNOTAVAIL, "netdev priv is null!\n"); + en_dev = &en_priv->edev; + + msg.payload.hdr_to_agt.op_code = AGENT_MAC_PORT_TSTAMP_MODE_GET; + msg.payload.hdr_to_agt.phyport = en_dev->phy_port;// 0~9 + LOG_INFO("phyport = %u\n", msg.payload.hdr_to_agt.phyport); + err = zxdh_send_command_to_specify(en_dev, MODULE_MAC, &msg, &msg); + if (err != 0) + { + LOG_ERR("zxdh_en_get_spm_port_tstamp_mode failed, err: %d\n", err); + return err; + } + + reg->num = 2; + reg->data[0] = msg.reps.mac_tstamp_msg.tx_mode; + reg->data[1] = msg.reps.mac_tstamp_msg.rx_mode; + LOG_INFO("tx_mode: %u, rx_mode: %u\n", msg.reps.mac_tstamp_msg.tx_mode, msg.reps.mac_tstamp_msg.rx_mode); + + if (unlikely(copy_to_user(ifr->ifr_ifru.ifru_data, reg, reg_size))) + { + goto err_ret; + } + + return 0; + +err_ret: + return -1; +} + +/* 配置时延测量功能是否打开, 维测功能 */ +int32_t zxdh_en_set_delay_statistics_enable(struct net_device *netdev, struct ifreq *ifr, struct zxdh_en_reg *reg) +{ + uint32_t reg_size = sizeof(struct zxdh_en_reg); + struct zxdh_en_priv *en_priv = NULL; + struct zxdh_en_device *en_dev = NULL; + int32_t ret = 0; + + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + + en_priv = netdev_priv(netdev); + CHECK_EQUAL_ERR(en_priv, NULL, -EADDRNOTAVAIL, "netdev priv is null!\n"); + en_dev = &en_priv->edev; + + if (reg->num != 1) + { + LOG_ERR("Transmit failed[len = %d]!", reg->num); + goto err_ret; + } + + en_dev->delay_statistics_enable = reg->data[0]; + LOG_INFO("en_dev->delay_statistics_enable = %u\n", en_dev->delay_statistics_enable); + + reg->num = 0; + if (unlikely(copy_to_user(ifr->ifr_ifru.ifru_data, reg, reg_size))) + { + goto err_ret; + } + + return ret; + +err_ret: + return -1; +} + +int32_t zxdh_en_get_delay_statistics_value(struct net_device *netdev, struct ifreq *ifr, struct zxdh_en_reg *reg) +{ + uint32_t reg_size = sizeof(struct zxdh_en_reg); + struct zxdh_en_priv *en_priv = NULL; + struct zxdh_en_device *en_dev = NULL; + int32_t ret = 0; + union zxdh_msg msg = {0}; + + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + + en_priv = netdev_priv(netdev); + CHECK_EQUAL_ERR(en_priv, NULL, -EADDRNOTAVAIL, "netdev priv is null!\n"); + en_dev = &en_priv->edev; + + msg.payload.hdr_to_agt.op_code = AGENT_MAC_PORT_DELAY_VALUE_GET; + msg.payload.hdr_to_agt.phyport = en_dev->phy_port;// 0~9 + LOG_INFO("phyport = %u\n", msg.payload.hdr_to_agt.phyport); + ret = zxdh_send_command_to_specify(en_dev, MODULE_MAC, &msg, &msg); + if (ret != 0) + { + LOG_ERR("zxdh_en_get_delay_statistics_value failed, ret: %d\n", ret); + return ret; + } + + reg->num = 4; + reg->data[0] = (uint32_t)(msg.reps.delay_statistics_val.min_delay & 0xffffffff); + reg->data[1] = (uint32_t)((msg.reps.delay_statistics_val.min_delay >> 32) & 0xffffffff); + reg->data[2] = (uint32_t)(msg.reps.delay_statistics_val.max_delay & 0xffffffff); + reg->data[3] = (uint32_t)((msg.reps.delay_statistics_val.max_delay >> 32) & 0xffffffff); + LOG_INFO("delay val: min_delay: %llu, max_delay: %llu\n", msg.reps.delay_statistics_val.min_delay, \ + msg.reps.delay_statistics_val.max_delay); + if (unlikely(copy_to_user(ifr->ifr_ifru.ifru_data, reg, reg_size))) + { + goto err_ret; + } + + return 0; + +err_ret: + return -1; +} + +int32_t zxdh_en_clear_delay_statistics_value(struct net_device *netdev, struct ifreq *ifr, struct zxdh_en_reg *reg) +{ + uint32_t reg_size = sizeof(struct zxdh_en_reg); + struct zxdh_en_priv *en_priv = NULL; + struct zxdh_en_device *en_dev = NULL; + int32_t ret = 0; + union zxdh_msg msg = {0}; + + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + + en_priv = netdev_priv(netdev); + CHECK_EQUAL_ERR(en_priv, NULL, -EADDRNOTAVAIL, "netdev priv is null!\n"); + en_dev = &en_priv->edev; + + msg.payload.hdr_to_agt.op_code = AGENT_MAC_PORT_DELAY_VALUE_CLR; + msg.payload.hdr_to_agt.phyport = en_dev->phy_port;// 0~9 + LOG_INFO("phyport = %u\n", msg.payload.hdr_to_agt.phyport); + ret = zxdh_send_command_to_specify(en_dev, MODULE_MAC, &msg, &msg); + if (ret != 0) + { + LOG_ERR("zxdh_en_clear_delay_statistics_value failed, ret: %d\n", ret); + return ret; + } + + reg->num = 0; + if (unlikely(copy_to_user(ifr->ifr_ifru.ifru_data, reg, reg_size))) + { + goto err_ret; + } + + return 0; + +err_ret: + return -1; +} + +struct zxdh_en_ptp_ioctl_table ioctl_ptp_table[] = +{ + {PTP_SET_CLOCK_NO, zxdh_en_set_clock_no}, + {PTP_ENABLE_PTP_ENCRYPTED_MSG, zxdh_en_enable_ptp_encrypted_msg}, + {PTP_SET_INTR_CAPTURE_TIMER, zxdh_en_set_intr_capture_timer}, + {PTP_SET_PP1S_SELECTION, zxdh_en_set_pps_selection}, + {PTP_SET_PHASE_DETECTION, zxdh_en_set_phase_detection}, + {PTP_GET_PD_VALUE, zxdh_en_get_pd_value}, + {PTP_SET_L2PTP_PORT, zxdh_en_set_l2_ptp_port}, + {PTP_SET_PTP_EC_ENABLE, zxdh_en_set_ptp_tc_enable}, + {PTP_SET_SYNCE_CLK_PORT, zxdh_en_set_synce_recovery_port}, + {PTP_GET_SYNCE_CLK_STATS, zxdh_en_get_synce_clk_stats}, + {PTP_SET_SPM_PORT_TSTAMP_ENABLE, zxdh_en_set_spm_port_tstamp_enable}, + {PTP_GET_SPM_PORT_TSTAMP_ENABLE, zxdh_en_get_spm_port_tstamp_enable}, + {PTP_SET_SPM_PORT_TSTAMP_MODE, zxdh_en_set_spm_port_tstamp_mode}, + {PTP_GET_SPM_PORT_TSTAMP_MODE, zxdh_en_get_spm_port_tstamp_mode}, + {PTP_SET_DELAY_STATISTICS_ENABLE, zxdh_en_set_delay_statistics_enable}, + {PTP_GET_DELAY_STATISTICS_VALUE, zxdh_en_get_delay_statistics_value}, + {PTP_CLR_DELAY_STATISTICS_VALUE, zxdh_en_clear_delay_statistics_value} +}; + +int32_t ptp_table_match_func(struct net_device *netdev, struct ifreq *ifr, struct zxdh_en_reg *reg) +{ + uint32_t i = 0; + uint32_t ret = 0; + uint32_t table_size = sizeof(ioctl_ptp_table) / sizeof(struct zxdh_en_ioctl_table); + for(i = 0; i < table_size; i++) + { + if((reg->offset == ioctl_ptp_table[i].cmd) && (ioctl_ptp_table[i].func != NULL)) + { + ret = ioctl_ptp_table[i].func(netdev, ifr, reg); + break; + } + } + return ret; +} + +int32_t zxdh_en_ptp_func(struct net_device *netdev, struct ifreq *ifr) +{ + struct zxdh_en_reg *reg = NULL; + uint32_t reg_size = sizeof(struct zxdh_en_reg); + + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + + reg = kzalloc(reg_size, GFP_KERNEL); + CHECK_EQUAL_ERR(reg, NULL, -EADDRNOTAVAIL, "reg is null!\n"); + + if (unlikely(copy_from_user(reg, ifr->ifr_ifru.ifru_data, reg_size))) + { + LOG_ERR("copy_from_user failed!\n"); + goto err_ret; + } + + if(-1 == ptp_table_match_func(netdev, ifr, reg)) + { + LOG_ERR("ptp_table_match_func failed!\n"); + goto err_ret; + } + + kfree(reg); + return 0; + +err_ret: + kfree(reg); + return -1; +} + +int32_t zxdh_en_pps_func(struct net_device *netdev, struct ifreq *ifr) +{ + struct zxdh_en_priv *en_priv = NULL; + struct zxdh_en_device *en_dev = NULL; + struct dh_core_dev *dh_dev = NULL; + struct zxdh_pf_device *pf_dev = NULL; + struct dh_eq_table *table = NULL; + struct dh_pf_eq_table *table_priv = NULL; + uint64_t virtaddr = 0x0; + struct dh_irq *expps = NULL; + struct dh_irq *lopps = NULL; + union zxdh_msg msg = {0}; + int32_t err = 0; + + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + + en_priv = netdev_priv(netdev); + en_dev = &en_priv->edev; + dh_dev = en_dev->parent->parent; + pf_dev = dh_core_priv(dh_dev); + + table = &dh_dev->eq_table; + table_priv = table->priv; + + LOG_ERR("pf_dev->pci_ioremap_addr[0]: 0x%llx\n", pf_dev->pci_ioremap_addr[0]); + + virtaddr = pf_dev->pci_ioremap_addr[0] + ZXDH_BAR_MSG_OFFSET; + tod_device_set_bar_virtual_addr(virtaddr, pf_dev->pcie_id); + + expps = table_priv->async_irq_tbl[3]; + lopps = table_priv->async_irq_tbl[4]; + + msg.payload.msg_pps.pcieid = pf_dev->pcie_id; + msg.payload.msg_pps.extern_pps_vector = expps->index; + msg.payload.msg_pps.local_pps_vector = lopps->index; + err = zxdh_send_command_to_specify(en_dev, MODULE_PPS, &msg, &msg); + if (err != 0) + { + LOG_ERR("zxdh_en_pps_func failed, err: %d\n", err); + return err; + } + + return 0; +} + +#ifdef ZXDH_MSGQ +int32_t zxdh_msgq_msg_send(struct net_device *netdev, struct ifreq *ifr) +{ + struct zxdh_en_device *en_dev = NULL; + struct msgq_dev *msgq_dev = NULL; + struct zxdh_en_reg *reg = NULL; + struct msgq_pkt_info pkt_info = {0}; + uint32_t size = sizeof(struct zxdh_en_reg); + struct reps_info reps = {0}; + uint32_t loop_cnt = 0; + uint32_t i = 0; + int32_t err = -2; + uint64_t start_us = 0; + uint64_t end_us = 0; + + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + en_dev = netdev_priv(netdev); + CHECK_EQUAL_ERR(en_dev, NULL, -EADDRNOTAVAIL, "en_dev is null!\n"); + msgq_dev = (struct msgq_dev *)en_dev->msgq_dev; + CHECK_EQUAL_ERR(msgq_dev, NULL, -EADDRNOTAVAIL, "msgq_dev is null!\n"); + + reg = kzalloc(size, GFP_KERNEL); + CHECK_EQUAL_ERR(reg, NULL, -EADDRNOTAVAIL, "reg is null!\n"); + + if (unlikely(copy_from_user(reg, ifr->ifr_ifru.ifru_data, size))) + { + LOG_ERR("copy_from_user failed!\n"); + goto err_ret; + } + + pkt_info.event_id = MODULE_DEMO; + pkt_info.timeout_us = 500000; + pkt_info.len = reg->data[0] + PRIV_HEADER_LEN; + pkt_info.no_reps = (reg->data[1] == 0) ? false : true; + loop_cnt = reg->data[2]; + if (loop_cnt == 0) + { + goto err_ret; + } + + if (loop_cnt > 100000000) + { + loop_cnt = 100000000; + } + + reps.len = 14000; + reps.addr = vmalloc(reps.len); + if (reps.addr == NULL) + { + LOG_ERR("vmalloc failed!\n"); + goto err_ret; + } + + LOG_DEBUG("len: %d, no_reps: %d, loop_cnt: %d\n", \ + pkt_info.len, pkt_info.no_reps, loop_cnt); + + start_us = jiffies_to_usecs(jiffies); + for (i = 0; i < loop_cnt; ++i) + { + pkt_info.addr = kzalloc(pkt_info.len, GFP_KERNEL); + if(pkt_info.addr == NULL) + { + err = -3; + break; + }; + err = zxdh_msgq_send_cmd(msgq_dev, &pkt_info, &reps); + } + + end_us = jiffies_to_usecs(jiffies); + if (i != 0) + { + LOG_DEBUG("exec_time: %lld us, single_time: %lld us\n", \ + end_us- start_us, (end_us- start_us) / i); + } + + reg->num = -err; + if (unlikely(copy_to_user(ifr->ifr_ifru.ifru_data, reg, size))) + { + LOG_ERR("copy_to_user failed!\n"); + } + + if (pkt_info.is_async && !pkt_info.no_reps) + { + usleep_range(pkt_info.timeout_us, pkt_info.timeout_us + 100); + } + + vfree(reps.addr); +err_ret: + kfree(reg); + return err; +} + +int32_t zxdh_msgq_dev_config(struct net_device *netdev, struct ifreq *ifr) +{ + uint32_t reg_size = sizeof(struct zxdh_en_reg); + struct zxdh_en_device *en_dev = NULL; + struct msgq_dev *msgq_dev = NULL; + struct zxdh_en_reg *reg = NULL; + + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + en_dev = netdev_priv(netdev); + CHECK_EQUAL_ERR(en_dev, NULL, -EADDRNOTAVAIL, "en_dev is null!\n"); + msgq_dev = (struct msgq_dev *)en_dev->msgq_dev; + CHECK_EQUAL_ERR(msgq_dev, NULL, -EADDRNOTAVAIL, "msgq_dev is null!\n"); + + reg = kzalloc(reg_size, GFP_KERNEL); + CHECK_EQUAL_ERR(reg, NULL, -EADDRNOTAVAIL, "reg is null!\n"); + + if (unlikely(copy_from_user(reg, ifr->ifr_ifru.ifru_data, reg_size))) + { + LOG_ERR("copy_from_user failed!\n"); + goto err_ret; + } + + if (reg->data[1] == MSGQ_PRINT_STA) + { + LOG_DEBUG("msgq_rx_pkts: %lld\n", msgq_dev->rq_priv->stats.packets); + LOG_DEBUG("msgq_rx_kicks: %lld\n", msgq_dev->rq_priv->stats.kicks); + LOG_DEBUG("msgq_rx_bytes: %lld\n", msgq_dev->rq_priv->stats.bytes); + LOG_DEBUG("msgq_rx_drops: %lld\n", msgq_dev->rq_priv->stats.drops); + LOG_DEBUG("msgq_rx_errs: %lld\n", msgq_dev->rq_priv->stats.xdp_drops); + + LOG_DEBUG("msgq_tx_pkts: %lld\n", msgq_dev->sq_priv->stats.packets); + LOG_DEBUG("msgq_tx_bytes: %lld\n", msgq_dev->sq_priv->stats.bytes); + LOG_DEBUG("msgq_tx_kicks: %lld\n", msgq_dev->sq_priv->stats.kicks); + LOG_DEBUG("msgq_tx_timeouts: %lld\n", msgq_dev->sq_priv->stats.tx_timeouts); + LOG_DEBUG("msgq_tx_errs: %lld\n", msgq_dev->sq_priv->stats.xdp_tx_drops); + + kfree(reg); + return 0; + } + + msgq_dev->loopback = (reg->data[0] != 0 ? true : false); + msgq_dev->print_flag = reg->data[1]; + LOG_INFO("msgq_dev->print_flag = %d\n", msgq_dev->print_flag); + LOG_INFO("msgq_dev->loopback = %d\n", msgq_dev->loopback); + + if (unlikely(copy_to_user(ifr->ifr_ifru.ifru_data, reg, reg_size))) + { + LOG_ERR("copy_to_user failed!\n"); + goto err_ret; + } + + kfree(reg); + return 0; + +err_ret: + kfree(reg); + return -1; +} +#endif + +struct zxdh_en_ioctl_table ioctl_table[] = +{ + {SIOCGMIIREG, zxdh_read_reg_cmd}, + {SIOCSMIIREG, zxdh_write_reg_cmd}, + {SIOCDEVPRIVATE_VQ_INFO, zxdh_get_vring_info}, + {SIOCDEVPRIVATE_SEND_FILE_PKT, zxdh_send_file_pkt}, +#ifdef ZXDH_MSGQ + {SIOCDEVPRIVATE_MSGQ_SNED, zxdh_msgq_msg_send}, + {SIOCDEVPRIVATE_MSGQ_CONFIG, zxdh_msgq_dev_config}, +#endif + {SIOCDEVPRIVATE_PTP_FUNC, zxdh_en_ptp_func}, + {SIOCDEVPRIVATE_PPS_FUNC, zxdh_en_pps_func}, + {SIOCDEVPRIVATE_TSN_FUNC, zxdh_en_tsn_func}, + {SIOCDEVPRIVATE_DH_TOOLS, zxdh_tools_ioctl_dispatcher}, +}; + +int32_t ioctl_table_match_func(struct net_device *netdev, struct ifreq *ifr, int32_t cmd, + struct zxdh_en_ioctl_table *func_table, uint32_t table_size) +{ + int32_t ret = 0; + uint32_t i = 0; + + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + for (i = 0; i < table_size; i++) + { + if ((func_table[i].cmd == cmd) && (func_table[i].func != NULL)) + { + ret = func_table[i].func(netdev, ifr); + break; + } + } + + return ret; +} + +int32_t zxdh_en_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) +{ + uint32_t table_size = sizeof(ioctl_table) / sizeof(struct zxdh_en_ioctl_table); + + return ioctl_table_match_func(netdev, ifr, cmd, ioctl_table, table_size); +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_aux/en_ioctl.h b/src/net/drivers/net/ethernet/dinghai/en_aux/en_ioctl.h new file mode 100644 index 0000000..1b2e5c4 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_aux/en_ioctl.h @@ -0,0 +1,101 @@ +#ifndef _EN_IOCTL_H_ +#define _EN_IOCTL_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../en_aux.h" + +#define SIOCDEVPRIVATE_WRITE_MAC (SIOCDEVPRIVATE + 1) +#define SIOCDEVPRIVATE_VQ_INFO (SIOCDEVPRIVATE + 2) +#define SIOCDEVPRIVATE_MSGQ_SNED (SIOCDEVPRIVATE + 3) +#define SIOCDEVPRIVATE_MSGQ_CONFIG (SIOCDEVPRIVATE + 4) +#define SIOCDEVPRIVATE_SEND_FILE_PKT (SIOCDEVPRIVATE + 6) +#define SIOCDEVPRIVATE_PTP_FUNC (SIOCDEVPRIVATE + 9) +#define SIOCDEVPRIVATE_PPS_FUNC (SIOCDEVPRIVATE + 10) +#define SIOCDEVPRIVATE_TSN_FUNC (SIOCDEVPRIVATE + 11) +#define SIOCDEVPRIVATE_DH_TOOLS (SIOCDEVPRIVATE + 13) + +#define PTP_SET_CLOCK_NO (0) +#define PTP_ENABLE_PTP_ENCRYPTED_MSG (1) +#define PTP_SET_INTR_CAPTURE_TIMER (2) +#define PTP_SET_PP1S_SELECTION (3) +#define PTP_SET_PHASE_DETECTION (4) +#define PTP_GET_PD_VALUE (5) +#define PTP_SET_L2PTP_PORT (6) +#define PTP_SET_PTP_EC_ENABLE (7) +#define PTP_SET_SYNCE_CLK_PORT (8) +#define PTP_GET_SYNCE_CLK_STATS (9) +#define PTP_SET_SPM_PORT_TSTAMP_ENABLE (10) +#define PTP_GET_SPM_PORT_TSTAMP_ENABLE (11) +#define PTP_SET_SPM_PORT_TSTAMP_MODE (12) +#define PTP_GET_SPM_PORT_TSTAMP_MODE (13) +#define PTP_SET_DELAY_STATISTICS_ENABLE (14) +#define PTP_GET_DELAY_STATISTICS_VALUE (15) +#define PTP_CLR_DELAY_STATISTICS_VALUE (16) + +#define PI_HDR_MAX_NUM 128 +#define GET_LOW32 0x00000000ffffffff +#define MIN_ALIGN_BYTE 64 +#define SEND_PKT_CNT_MAX 0xffffffff +#define PKT_PRINT_LINE_LEN 16 +#define PKT_PRINT_LEN_MAX (16 * 1024) + +#define CONFIG_RISC_PCS_LOOPB_OPCODE 13 +#define CONFIG_RISC_PCS_NORMAL_OPCODE 14 + +#define MSG_MODULE_DEBUG_RISC 20 + +#define MAX_ACCESS_NUM 500 +struct zxdh_en_reg +{ + uint32_t offset; + uint32_t num; + uint32_t data[MAX_ACCESS_NUM]; +}; + +struct risc_config_mac_msg +{ + uint8_t op_code; + uint8_t phyport; + uint8_t spm_speed; + uint8_t spm_fec; + uint8_t loop_enable; +}; + +struct risc_config_userspace +{ + uint8_t op_code; + uint8_t arg_num; + uint8_t filestr_size; + uint8_t file[100]; +}; + +struct data_packet +{ + void *buf; + uint32_t buf_size; +}; + +struct zxdh_en_ioctl_table +{ + int32_t cmd; + int32_t (*func)(struct net_device *netdev, struct ifreq *ifr); +}; + +struct zxdh_en_ptp_ioctl_table +{ + int32_t cmd; + int32_t (*func)(struct net_device *netdev, struct ifreq *ifr, struct zxdh_en_reg *reg); +}; + +int32_t print_data(uint8_t *data, uint32_t len); +int32_t zxdh_en_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_aux/eq.c b/src/net/drivers/net/ethernet/dinghai/en_aux/eq.c new file mode 100644 index 0000000..e63fb8d --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_aux/eq.c @@ -0,0 +1,333 @@ +#include +#include +#include +#include "eq.h" + +static int32_t dh_eq_async_link_info_int_bond_pf(struct notifier_block *nb, unsigned long action, void *data) +{ + struct dh_eq_async *eq_link_info_async = container_of(nb, struct dh_eq_async, irq_nb); + struct zxdh_en_priv *en_priv = (struct zxdh_en_priv *)eq_link_info_async->priv; + struct zxdh_en_device *en_dev = &en_priv->edev; + uint8_t link_up = 0; + uint8_t link_info = 0; + uint8_t bit_value = 0; + + if (en_dev == NULL) + { + LOG_ERR("null ptr\n"); + return -1; + } + + if(!en_dev->ops->is_bond(en_dev->parent)) + { + LOG_INFO("isn't bond_pf exit\n"); + return 0; + } + + //读取state寄存器中第en_dev->link_check_bit位的值 + en_dev->ops->get_link_info_from_vqm(en_dev->parent, &link_info); + bit_value = (link_info >> en_dev->link_check_bit) & 0x01; + LOG_INFO("[aux level] netdev:%s read VQM[0x%x]: link_check_bit[%d]-bit_value[%d]\n", en_dev->netdev->name, link_info, en_dev->link_check_bit, bit_value); + link_up |= bit_value; + + en_dev->link_up = link_up; + queue_work(en_priv->events->wq, &en_dev->link_info_irq_update_np_work); + + if(link_up == 0) + { + netif_carrier_off(en_dev->netdev); + en_dev->speed = SPEED_UNKNOWN; + en_dev->duplex = DUPLEX_UNKNOWN; + } + else + { + netif_carrier_on(en_dev->netdev); + queue_work(en_priv->events->wq, &en_dev->link_info_irq_process_work); + } + + return 0; +} + +static int32_t dh_eq_async_link_info_int(struct notifier_block *nb, unsigned long action, void *data) +{ + struct dh_eq_async *eq_link_info_async = container_of(nb, struct dh_eq_async, irq_nb); + struct zxdh_en_priv *en_priv = (struct zxdh_en_priv *)eq_link_info_async->priv; + struct zxdh_en_device *en_dev = &en_priv->edev; + uint8_t link_up = 0; + uint8_t link_info = 0; + uint8_t phyport_val = 0; + + //判断是否为bond_pf + if (en_dev == NULL) + { + LOG_ERR("null ptr\n"); + return -1; + } + + if(en_dev->ops->is_bond(en_dev->parent)) + { + LOG_INFO("is bond_pf, exit\n"); + return 0; + } + + if(en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_VF && (en_dev->device_id==0x8042)) + { + //调用读取state后四位获取phoport、读取前四位,获取link_up信息 + en_dev->ops->get_link_info_from_vqm(en_dev->parent, &link_info); + link_up = link_info & 0x0F; + phyport_val = (link_info >> 4) & 0x0F; + LOG_INFO("[bond_vf netdev %s] read VQM[0x%x]: phyport[0x%x] link_up[%d]\n", en_dev->netdev->name, link_info, phyport_val, link_up); + en_dev->phy_port = phyport_val; + } + else + { + en_dev->ops->get_link_info_from_vqm(en_dev->parent, &link_up); + } + + en_dev->link_up = link_up; + queue_work(en_priv->events->wq, &en_dev->link_info_irq_update_np_work); + if(link_up == 0) + { + en_dev->ops->set_pf_link_up(en_dev->parent, FALSE); + netif_carrier_off(en_dev->netdev); + en_dev->speed = SPEED_UNKNOWN; + en_dev->duplex = DUPLEX_UNKNOWN; + } + else + { + en_dev->ops->set_pf_link_up(en_dev->parent, TRUE); + netif_carrier_on(en_dev->netdev); + queue_work(en_priv->events->wq, &en_dev->link_info_irq_process_work); + } + + if(en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + LOG_INFO("pf update all vf\n"); + queue_work(en_priv->events->wq, &en_dev->link_info_irq_update_vf_work); + } + return 0; +} + +static int32_t dh_eq_async_riscv_int(struct notifier_block *nb, unsigned long action, void *data) +{ + struct dh_eq_async * eq_riscv_async = container_of(nb, struct dh_eq_async, irq_nb); + struct zxdh_en_priv *en_priv = (struct zxdh_en_priv *)eq_riscv_async->priv; + struct zxdh_en_device *en_dev = &en_priv->edev; + struct dh_eq_table *eq_table = &en_priv->eq_table; + struct dh_events *events = en_priv->events; + struct dh_event_nb *event_nb = NULL; + uint64_t virt_addr = 0; + int32_t event_type = 0; + uint16_t event_idx = 0; + uint16_t i = 0; + + if(en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_VF) + { + return 0; + } + + virt_addr = en_dev->ops->get_bar_virt_addr(en_dev->parent, 0) + ZXDH_BAR_MSG_OFFSET; + event_idx = zxdh_get_event_id(virt_addr, MSG_CHAN_END_RISC, MSG_CHAN_END_PF); + event_type = dh_eq_event_type_get(event_idx); + LOG_INFO("------------- event_idx: %d, event_type: %d------------\n", event_idx, event_type); + + if(events == NULL) + { + LOG_ERR("riscv_irq trigger, events is null\n"); + return 0; + } + + for (i = 0; i < events->evt_num; i++) + { + event_nb = &events->notifiers[i]; + + if (event_type == event_nb->nb.event_type) + { + LOG_INFO("en_aux async riscv irq_handler called\n"); + atomic_notifier_call_chain(&eq_table->nh[event_type], event_type, NULL); + return 0; + } + } + + return 0; +} + +static int32_t dh_eq_async_pf_int(struct notifier_block *nb, unsigned long action, void *data) +{ + struct dh_eq_async * eq_pf_async = container_of(nb, struct dh_eq_async, irq_nb); + struct zxdh_en_priv *en_priv = (struct zxdh_en_priv *)eq_pf_async->priv; + struct zxdh_en_device *en_dev = &en_priv->edev; + struct dh_eq_table *eq_table = &en_priv->eq_table; + struct dh_events *events = en_priv->events; + struct dh_event_nb *event_nb = NULL; + uint64_t virt_addr = 0; + int32_t event_type = 0; + uint16_t event_idx = 0; + uint16_t i = 0; + + if(en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + return 0; + } + + virt_addr = en_dev->ops->get_bar_virt_addr(en_dev->parent, 0) + ZXDH_BAR_MSG_OFFSET + ZXDH_BAR_PFVF_MSG_OFFSET; + event_idx = zxdh_get_event_id(virt_addr, MSG_CHAN_END_PF, MSG_CHAN_END_VF); + event_type = dh_eq_event_type_get(event_idx); + LOG_INFO("------------- event_idx: %d, event_type: %d------------\n", event_idx, event_type); + + for (i = 0; i < events->evt_num; i++) + { + event_nb = &events->notifiers[i]; + + if (event_type == event_nb->nb.event_type) + { + LOG_INFO("en_aux async pf irq_handler called\n"); + atomic_notifier_call_chain(&eq_table->nh[event_type], event_type, NULL); + return 0; + } + } + + return 0; +} + +struct dh_aux_async_eq_table +{ + char name[64]; + notifier_fn_t async_int; +}; + +static struct dh_aux_async_eq_table dh_aux_async_eq_tbl[] = +{ + {"riscv", dh_eq_async_riscv_int}, + {"pf", dh_eq_async_pf_int}, + {"link_info", dh_eq_async_link_info_int}, + {"link_info", dh_eq_async_link_info_int_bond_pf}, +}; + +static int32_t dh_aux_setup_async_eq(struct zxdh_en_priv *en_priv, \ + struct dh_eq_async *eq, const char *name, \ + notifier_fn_t call) +{ + struct zxdh_en_device *en_dev = &en_priv->edev; + int32_t err = 0; + + spin_lock_init(&eq->lock);//unused + eq->priv = en_priv; + eq->irq_nb.notifier_call = call; + err = en_dev->ops->async_eq_enable(en_dev->parent, eq, name, true); + if (err != 0) + { + LOG_ERR("failed to enable %s EQ %d\n", name, err); + } + + return err; +} + +static void cleanup_async_eq(struct zxdh_en_priv *en_priv, struct dh_eq_async *eq, const char *name) +{ + struct zxdh_en_device *en_dev = &en_priv->edev; + int32_t err = 0; + + err = en_dev->ops->async_eq_enable(en_dev->parent, eq, name, false); + if (err != 0) + { + LOG_ERR("failed to disable %s EQ %d\n", name, err); + } +} + +static void destroy_async_eqs(struct zxdh_en_priv *en_priv) +{ + struct dh_eq_table *table = &en_priv->eq_table; + struct dh_aux_eq_table *table_priv = table->priv; + int32_t i = 0; + + for (i = 0; i < ZXDH_AUX_ASYNC_EQ_NUM; ++i) + { + cleanup_async_eq(en_priv, &table_priv->async_eq_tbl[i], dh_aux_async_eq_tbl[i].name); + } +} + +void dh_aux_eq_table_destroy(struct zxdh_en_priv *en_priv) +{ + destroy_async_eqs(en_priv); +} + +void dh_aux_eq_table_cleanup(struct zxdh_en_priv *en_priv) +{ + kvfree(en_priv->eq_table.priv); +} + +int32_t dh_aux_eq_table_init(struct zxdh_en_priv *en_priv) +{ + struct dh_eq_table *eq_table; + struct dh_aux_eq_table *table_priv = NULL; + int32_t err = 0; + uint32_t i = 0; + + eq_table = &en_priv->eq_table; + + table_priv = kvzalloc(sizeof(*table_priv), GFP_KERNEL); + if (unlikely(table_priv == NULL)) + { + LOG_ERR("dh_aux_eq_table kvzalloc failed\n"); + err = -ENOMEM; + goto err_table_priv; + } + + eq_table->priv = table_priv; + + mutex_init(&eq_table->lock); + for (i = 0; i < DH_EVENT_TYPE_MAX; i++) + { + ATOMIC_INIT_NOTIFIER_HEAD(&eq_table->nh[i]); + } + + eq_table->irq_table = NULL; + + return 0; + +err_table_priv: + return err; +} + +static int32_t create_async_eqs(struct zxdh_en_priv *en_priv) +{ + struct dh_eq_table *eq_table = &en_priv->eq_table; + struct dh_aux_eq_table *table_priv = eq_table->priv; + int32_t err = 0; + int32_t i = 0; + int32_t j = 0; + + for (i = 0; i < ZXDH_AUX_ASYNC_EQ_NUM; ++i) + { + err = dh_aux_setup_async_eq(en_priv, &table_priv->async_eq_tbl[i], \ + dh_aux_async_eq_tbl[i].name, dh_aux_async_eq_tbl[i].async_int); + if (err != 0) + { + LOG_ERR("Failed to setup aux_async_eq_tbl[%d]\n", i); + goto err_setup_async_eq; + } + } + + return err; + +err_setup_async_eq: + for (j = 0; j < i; ++j) + { + cleanup_async_eq(en_priv, &table_priv->async_eq_tbl[j], dh_aux_async_eq_tbl[j].name); + } + return err; +} + +int32_t dh_aux_eq_table_create(struct zxdh_en_priv *en_priv) +{ + int32_t err = 0; + + err = create_async_eqs(en_priv); + if (err != 0) + { + LOG_ERR("Failed to create async EQs\n"); + } + + return err; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_aux/eq.h b/src/net/drivers/net/ethernet/dinghai/en_aux/eq.h new file mode 100644 index 0000000..c9d2444 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_aux/eq.h @@ -0,0 +1,24 @@ +#ifndef __DINGHAI_EN_AUX_EQ_H__ +#define __DINGHAI_EN_AUX_EQ_H__ + +#include "../en_aux.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZXDH_AUX_ASYNC_EQ_NUM 4 +struct dh_aux_eq_table { + struct dh_eq_async async_eq_tbl[ZXDH_AUX_ASYNC_EQ_NUM]; +}; + +int32_t dh_aux_eq_table_init(struct zxdh_en_priv *en_priv); +int32_t dh_aux_eq_table_create(struct zxdh_en_priv *en_priv); +void dh_aux_eq_table_destroy(struct zxdh_en_priv *en_priv); +void dh_aux_eq_table_cleanup(struct zxdh_en_priv *en_priv); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_aux/events.c b/src/net/drivers/net/ethernet/dinghai/en_aux/events.c new file mode 100644 index 0000000..1dd5fee --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_aux/events.c @@ -0,0 +1,824 @@ +#include +#include +#include +#include +#include +#include +#include +#include "events.h" +#include "en_cmd.h" +#include "../msg_common.h" +#include "../en_np/table/include/dpp_tbl_api.h" +#include "../zxdh_tools/zxdh_tools_netlink.h" +#include "dcbnl/en_dcbnl_api.h" +#include "zxic_common.h" +#include +#include +#include +#include +#include +#include // 对于VLAN设备 +#include // 对于bonding设备 +#include + +static int32_t pf2vf_notifier(struct notifier_block *, unsigned long, void *); +static int32_t riscv2aux_notifier(struct notifier_block *, unsigned long, void *); + +void rx_mode_set_handler(struct work_struct *work); + +static struct dh_nb aux_events[] = { + {.nb.notifier_call = pf2vf_notifier, .event_type = DH_EVENT_TYPE_NOTIFY_PF_TO_VF}, + {.nb.notifier_call = riscv2aux_notifier, .event_type = DH_EVENT_TYPE_NOTIFY_RISCV_TO_AUX}, +}; + +static int32_t do_pf_vf_inet6_update_mac_to_np(struct zxdh_en_device *en_dev, const struct in6_addr *ipv6_addr, unsigned long action) +{ + int32_t ret = 0; + struct in6_addr sol_addr={0}; + uint8_t mcast_mac[ETH_ALEN]; + + // 打印IPv6地址,使用%pI6c格式化IPv6地址,确保正确显示 + LOG_INFO("IPv6 address changed on interface %s, %s address: %pI6c\n", + en_dev->netdev->name, (action == 1) ? "add" : (action == 2) ? "del" : "unknown action with", ipv6_addr); + // Calculate the multicast MAC address from the IPv6 address + addrconf_addr_solict_mult(ipv6_addr, &sol_addr); + ipv6_eth_mc_map(&sol_addr, mcast_mac); + LOG_INFO("Multicast MAC Address: %pM\n", mcast_mac); + + switch (action) { + case NETDEV_UP: + { + ret = zxdh_ip6mac_add(en_dev, ipv6_addr->s6_addr32, mcast_mac); + if (ret != 0) + { + LOG_ERR("zxdh_ip6mac_add failed"); + } + break; + } + case NETDEV_DOWN: + { + ret = zxdh_ip6mac_del(en_dev, ipv6_addr->s6_addr32, mcast_mac); + if (ret != 0) + { + LOG_ERR("zxdh_ip6mac_del failed"); + } + break; + } + default: + break; + } + return ret; +} + +static int32_t do_bond_master_inet6_update_mac_to_np(struct net_device *notifier_dev, const struct in6_addr *ipv6_addr, struct zxdh_en_device *en_dev, unsigned long action) +{ + int32_t ret = 0; + struct list_head *iter = NULL; + struct slave *slave_dev = NULL; + struct bonding *bond = netdev_priv(notifier_dev); + + // 遍历所有slave设备 + if (!bond_has_slaves(bond)) + { + LOG_INFO("Bond device %s don't have slave\n", notifier_dev->name); + return 0; + } + + bond_for_each_slave(bond, slave_dev, iter) + { + if (strcmp(en_dev->netdev->name, slave_dev->dev->name) != 0) + { + continue; + } + LOG_INFO("Bond device %s have slave device: %s\n", notifier_dev->name, slave_dev->dev->name); + ret = do_pf_vf_inet6_update_mac_to_np(en_dev, ipv6_addr, action); + if (ret != 0) + { + return ret; + } + } + return 0; +} + +static int32_t inet6_addr_change_notifier(struct notifier_block *nb, unsigned long action, void *data) +{ + struct inet6_ifaddr *ifa = NULL; + struct net_device *notifier_dev = NULL; //触发事件的网络设备 + struct zxdh_en_device *en_dev = container_of(nb, struct zxdh_en_device, ipv6_notifier); //处理此回调函数的设备 + + if(data == NULL) + { + LOG_ERR("data is NULL"); + return NOTIFY_OK; + } + + ifa = (struct inet6_ifaddr *)data; + notifier_dev = ifa->idev->dev; + + if (notifier_dev == NULL) + { + LOG_ERR("notifier_dev is NULL"); + return NOTIFY_OK; + } + + // 检查是否为vlan设备 + if (is_vlan_dev(notifier_dev)) + notifier_dev = vlan_dev_real_dev(notifier_dev); + + // 检查是否为bond master设备 + if (netif_is_bond_master(notifier_dev)) + return do_bond_master_inet6_update_mac_to_np(notifier_dev, &ifa->addr, en_dev, action); + + // 检查是否为自定义设备 + if (strcmp(en_dev->netdev->name, notifier_dev->name) == 0) + return do_pf_vf_inet6_update_mac_to_np(en_dev, &ifa->addr, action); + + return NOTIFY_OK; +} + +static void vf_link_info_update_handler(struct work_struct *_work) +{ + struct zxdh_en_device *en_dev = container_of(_work, struct zxdh_en_device, vf_link_info_update_work); + union zxdh_msg msg = {0}; + struct zxdh_vf_item *vf_item = NULL; + int32_t err = 0; + uint16_t vf_idx = 0; + struct pci_dev *pdev = NULL; + uint16_t num_vfs = 0; + bool pf_link_up = false; + + ZXDH_AUX_INIT_COMP_CHECK(en_dev); + pf_link_up = en_dev->ops->get_pf_link_up(en_dev->parent); + pdev = en_dev->ops->get_pdev(en_dev->parent); + num_vfs = pci_num_vf(pdev); + + msg.payload.hdr_vf.op_code = ZXDH_SET_VF_LINK_STATE; + msg.payload.link_state_msg.is_link_force_set = FALSE; + + msg.payload.link_state_msg.link_up = pf_link_up; + msg.payload.link_state_msg.speed = en_dev->speed; + msg.payload.link_state_msg.autoneg_enable = en_dev->autoneg_enable; + msg.payload.link_state_msg.supported_speed_modes = en_dev->supported_speed_modes; + msg.payload.link_state_msg.advertising_speed_modes = en_dev->advertising_speed_modes; + + for (vf_idx = 0; vf_idx < num_vfs; vf_idx++) + { + vf_item = en_dev->ops->get_vf_item(en_dev->parent, vf_idx); + msg.payload.hdr_vf.dst_pcie_id = FIND_VF_PCIE_ID(en_dev->pcie_id, vf_idx); + if(vf_item->is_probed) + { + msg.payload.link_state_msg.link_forced = vf_item->link_forced; + err = zxdh_send_command_to_specify(en_dev, MODULE_PF_BAR_MSG_TO_VF, &msg, &msg); + if (err != 0) + { + LOG_ERR("failed to update VF[%d]\n", vf_idx); + } + } + } +} + +static void link_info_irq_update_vf_handler(struct work_struct *_work) +{ + struct zxdh_en_device *en_dev = container_of(_work, struct zxdh_en_device, link_info_irq_update_vf_work); + struct zxdh_vf_item *vf_item = NULL; + int32_t err = 0; + uint16_t vf_idx = 0; + struct pci_dev *pdev = NULL; + uint16_t num_vfs = 0; + bool pf_link_up = en_dev->ops->get_pf_link_up(en_dev->parent); + uint16_t func_no = 0; + uint16_t pf_no = FIND_PF_ID(en_dev->pcie_id); + union zxdh_msg msg = {0}; + + LOG_INFO("is called\n"); + ZXDH_AUX_INIT_COMP_CHECK(en_dev); + msg.payload.hdr_to_agt.op_code = AGENT_DEV_STATUS_NOTIFY; + msg.payload.hdr_to_agt.pcie_id = en_dev->pcie_id; + pdev = en_dev->ops->get_pdev(en_dev->parent); + num_vfs = pci_num_vf(pdev); + for (vf_idx = 0; vf_idx < num_vfs; vf_idx++) + { + vf_item = en_dev->ops->get_vf_item(en_dev->parent, vf_idx); + if(vf_item->link_forced == FALSE && vf_item->is_probed) + { + func_no = GET_FUNC_NO(pf_no, vf_idx); + LOG_INFO("vf_idx:%d, func_no=0x%x\n",vf_idx,func_no); + msg.payload.pcie_msix_msg.func_no[msg.payload.pcie_msix_msg.num++] = func_no; + en_dev->ops->set_vf_link_info(en_dev->parent, vf_idx, pf_link_up ? 1 : 0); + } + } + LOG_INFO("msg.payload.pcie_msix_msg.num:%d\n",msg.payload.pcie_msix_msg.num); + if(msg.payload.pcie_msix_msg.num > 0) + { + err = zxdh_send_command_to_specify(en_dev, MODULE_MAC, &msg, &msg); + if (err != 0) + { + LOG_ERR("failed to update VF link info\n"); + } + } +} + +static void link_info_irq_process_handler(struct work_struct *_work) +{ + struct zxdh_en_device *en_dev = container_of(_work, struct zxdh_en_device, link_info_irq_process_work); + int32_t ret = 0; + union zxdh_msg msg = {0}; + struct link_info_struct link_info_val = {0}; + + ZXDH_AUX_INIT_COMP_CHECK(en_dev); + + msg.payload.hdr_to_agt.op_code = AGENT_MAC_LINK_INFO_GET; + msg.payload.hdr_to_agt.phyport = en_dev->phy_port; + ret = zxdh_send_command_to_specify(en_dev, MODULE_MAC, &msg, &msg); + if (ret != 0) + { + LOG_ERR("get speed and duplex from agent failed: %d\n", ret); + return; + } + en_dev->speed = msg.reps.mac_set_msg.speed; + en_dev->duplex = msg.reps.mac_set_msg.duplex; + LOG_DEBUG("netdev:%s, phy_port:0x%x, speed:%d, duplex:0x%x\n", en_dev->netdev->name, en_dev->phy_port, en_dev->speed, en_dev->duplex); + + if(en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + link_info_val.speed = en_dev->speed; + link_info_val.autoneg_enable = en_dev->autoneg_enable; + link_info_val.supported_speed_modes = en_dev->supported_speed_modes; + link_info_val.advertising_speed_modes = en_dev->advertising_speed_modes; + link_info_val.duplex = en_dev->duplex; + + en_dev->ops->update_pf_link_info(en_dev->parent, &link_info_val); + + //zxdh_port_th_update(en_dev); + } + + return; +} + +static void link_info_irq_update_np_work_handler(struct work_struct *_work) +{ + struct zxdh_en_device *en_dev = container_of(_work, struct zxdh_en_device, link_info_irq_update_np_work); + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + ZXDH_AUX_INIT_COMP_CHECK(en_dev); + if (!en_dev->ops->is_bond(en_dev->parent)) + { + if (!netif_running(en_dev->netdev)) + { + return; + } + if(en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_VF) + { + zxdh_vf_egr_port_attr_set(en_dev, EGR_FLAG_VPORT_IS_UP, en_dev->link_up, 0); + } + else + { + dpp_egr_port_attr_set(&pf_info, EGR_FLAG_VPORT_IS_UP, en_dev->link_up); + } + return; + } + + if (!en_dev->link_up) + { + dpp_panel_attr_set(&pf_info, en_dev->phy_port, PANEL_FLAG_IS_UP, 0); + } + else + { + if (en_dev->netdev->flags & IFF_UP) + { + dpp_panel_attr_set(&pf_info, en_dev->phy_port, PANEL_FLAG_IS_UP, 1); + } + } +} + +static void en_aux_spoof_check(struct zxdh_en_device *en_dev) +{ + uint64_t ssvpc = 0; + uint16_t en_aux_pf_id = 0; + uint32_t ret = 0; + uint16_t num_vfs = 0; + struct pci_dev *pdev = NULL; + struct dh_core_dev *dh_dev = NULL; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + dh_dev = en_dev->parent; + pdev = en_dev->ops->get_pdev(dh_dev); + num_vfs = pci_num_vf(pdev); + + if (!IS_PF(en_dev->vport)) + { + return; + } + if (num_vfs == 0) + { + return; + } + + en_aux_pf_id = DH_AUX_PF_ID_OFFSET(en_dev->vport); + // spoof static register clear to 0 after read + ret = dpp_stat_spoof_packet_drop_cnt_get(&pf_info, en_aux_pf_id, 1, &ssvpc); + if (ret != 0) + { + LOG_ERR("Failed to get spoof check dropped packets number.\n"); + return; + } + if (!ssvpc) + { + return; + } + LOG_INFO("%llu Spoofed packets detected in EP%d, PF%d\n", ssvpc, EPID(en_dev->vport), FUNC_NUM(en_dev->vport)); + return; +} + +static void en_aux_service_task(struct work_struct *_work) +{ + struct zxdh_en_device *en_dev = container_of(_work, struct zxdh_en_device, service_task); + + ZXDH_AUX_INIT_COMP_CHECK(en_dev); + en_aux_spoof_check(en_dev); +} + +static void en_aux_service_timer(struct timer_list *t) +{ + unsigned long next_event_offset = HZ * 2; + struct zxdh_en_device *en_dev = from_timer(en_dev, t, service_timer); + struct zxdh_en_priv *en_priv = container_of(en_dev, struct zxdh_en_priv, edev); + + /* Reset the timer */ + mod_timer(&en_dev->service_timer, next_event_offset + jiffies); + queue_work(en_priv->events->wq, &en_dev->service_task); +} + +static void en_aux_service_riscv_task(struct work_struct *_work) +{ + int32_t retval = 0; + union zxdh_msg msg = {0}; + + time64_t time64; + struct rtc_time tm; + unsigned long next_event_offset = HZ * 259200; + + struct zxdh_en_device *en_dev = container_of(_work, struct zxdh_en_device, service_riscv_task); + + if (!IS_PF(en_dev->vport)) + { + return; + } + + msg.payload.hdr_to_cmn.pcie_id = en_dev->pcie_id;; + msg.payload.hdr_to_cmn.write_bytes = 9; + msg.payload.hdr_to_cmn.type = RISC_SERVER_TIME; + msg.payload.hdr_to_cmn.field = 0; + + time64 = ktime_get_real_seconds(); + time64 += 28800;//CST比UST晚八个小时 + rtc_time64_to_tm(time64, &tm); + + msg.payload.time_cfg_msg.tmmng_type = 0xF0; + msg.payload.time_cfg_msg.dir = 0x2; + msg.payload.time_cfg_msg.year = tm.tm_year + 1900; + msg.payload.time_cfg_msg.month = tm.tm_mon + 1; + msg.payload.time_cfg_msg.day = tm.tm_mday; + msg.payload.time_cfg_msg.hour = tm.tm_hour; + msg.payload.time_cfg_msg.min = tm.tm_min; + msg.payload.time_cfg_msg.sec = tm.tm_sec; + + + LOG_INFO("send msg timer to riscv:%d-%d-%d %d:%d:%d\n", msg.payload.time_cfg_msg.year, msg.payload.time_cfg_msg.month, msg.payload.time_cfg_msg.day, msg.payload.time_cfg_msg.hour, msg.payload.time_cfg_msg.min, msg.payload.time_cfg_msg.sec); + ZXDH_AUX_INIT_COMP_CHECK(en_dev); + + retval = zxdh_send_command_to_specify(en_dev, MODULE_PF_TIMER_TO_RISC_MSG, &msg, &msg); + if (retval != 0) + { + LOG_ERR("zxdh_send_command_to_riscv failed: %d\n", retval); + } + + mod_timer(&en_dev->service_riscv_timer, next_event_offset + jiffies); +} + +static void en_aux_service_riscv_timer(struct timer_list *t) +{ + unsigned long next_event_offset = HZ * 60; + struct zxdh_en_device *en_dev = from_timer(en_dev, t, service_riscv_timer); + struct zxdh_en_priv *en_priv = container_of(en_dev, struct zxdh_en_priv, edev); + + /* Reset the timer */ + mod_timer(&en_dev->service_riscv_timer, next_event_offset + jiffies); + queue_work(en_priv->events->wq, &en_dev->service_riscv_task); +} + +static void pf2vf_msg_proc_work_handler(struct work_struct *_work) +{ + struct zxdh_en_device *en_dev = container_of(_work, struct zxdh_en_device, pf2vf_msg_proc_work); + uint64_t virt_addr = 0; + + LOG_INFO("is called\n"); + ZXDH_AUX_INIT_COMP_CHECK(en_dev); + virt_addr = en_dev->ops->get_bar_virt_addr(en_dev->parent, 0) + ZXDH_BAR_MSG_OFFSET + ZXDH_BAR_PFVF_MSG_OFFSET; + zxdh_bar_irq_recv(MSG_CHAN_END_PF, MSG_CHAN_END_VF, virt_addr, en_dev); +} + +static int32_t pf2vf_notifier(struct notifier_block *nb, unsigned long type, void *data) +{ + struct dh_event_nb *event_nb = dh_nb_cof(nb, struct dh_event_nb, nb); + struct zxdh_en_priv *en_priv = (struct zxdh_en_priv *)event_nb->ctx; + + LOG_INFO("is called\n"); + queue_work(en_priv->events->wq, &en_priv->edev.pf2vf_msg_proc_work); + + return NOTIFY_OK; +} + +static void riscv2aux_msg_proc_work_handler(struct work_struct *_work) +{ + struct zxdh_en_device *en_dev = container_of(_work, struct zxdh_en_device, riscv2aux_msg_proc_work); + uint64_t virt_addr = 0; + uint16_t src = MSG_CHAN_END_RISC; + uint16_t dst = MSG_CHAN_END_PF; + + LOG_INFO("is called\n"); + ZXDH_AUX_INIT_COMP_CHECK(en_dev); + virt_addr = en_dev->ops->get_bar_virt_addr(en_dev->parent, 0) + ZXDH_BAR_MSG_OFFSET; + zxdh_bar_irq_recv(src, dst, virt_addr, en_dev); +} + +static int32_t riscv2aux_notifier(struct notifier_block *nb, unsigned long type, void *data) +{ + struct dh_event_nb *event_nb = dh_nb_cof(nb, struct dh_event_nb, nb); + struct zxdh_en_priv *en_priv = (struct zxdh_en_priv *)event_nb->ctx; + LOG_INFO("is called\n"); + queue_work(en_priv->events->wq, &en_priv->edev.riscv2aux_msg_proc_work); + + return NOTIFY_OK; +} + +void pf_notify_vf_reset_handler(struct work_struct *work) +{ + int32_t ret = 0; + struct zxdh_en_device *en_dev = container_of(work, struct zxdh_en_device, pf_notify_vf_reset_work); + struct net_device *netdev = en_dev->netdev; + + LOG_INFO("pf_notify_vf_reset_handler is called\n"); + ZXDH_AUX_INIT_COMP_CHECK(en_dev); + ret = zxdh_vf_get_mac(netdev); + if (ret != 0) + { + LOG_ERR("zxdh_vf_get_mac failed: %d\n", ret); + } +} + +typedef uint32_t (*zxdh_pf_msg_func)(zxdh_msg_info *msg, zxdh_reps_info *reps, struct zxdh_en_device *en_dev); + +typedef struct +{ + zxdh_msg_op_code op_code; + uint8_t proc_name[ZXDH_MSG_TYPE_CNT_MAX]; + zxdh_pf_msg_func msg_proc; +} zxdh_pf_msg_proc; + +static uint32_t zxdh_set_vf_link_state(zxdh_msg_info *msg, zxdh_reps_info *reps, struct zxdh_en_device *en_dev) +{ + uint32_t ret = 0; + uint16_t vf_idx = msg->hdr_vf.dst_pcie_id & (0xff); + + if(!msg->link_state_msg.is_link_force_set) + { + en_dev->speed = msg->link_state_msg.speed; + en_dev->autoneg_enable = msg->link_state_msg.autoneg_enable; + en_dev->supported_speed_modes = msg->link_state_msg.supported_speed_modes; + en_dev->advertising_speed_modes = msg->link_state_msg.advertising_speed_modes; + if(msg->link_state_msg.link_forced) + { + return 0; + } + } + + en_dev->ops->set_pf_link_up(en_dev->parent, msg->link_state_msg.link_up); + if(en_dev->ops->get_pf_link_up(en_dev->parent)) + { + netif_carrier_on(en_dev->netdev); + } + else + { + netif_carrier_off(en_dev->netdev); + } + LOG_INFO("[VF GET MSG FROM PF]--VF[%d] link_state[%s] update success!\n", vf_idx, en_dev->ops->get_pf_link_up(en_dev->parent)?"TRUE":"FALSE"); + return ret; +} + +static uint32_t zxdh_set_vf_reset(zxdh_msg_info *msg, zxdh_reps_info *reps, struct zxdh_en_device *en_dev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(en_dev->netdev); + queue_work(en_priv->events->wq, &en_priv->edev.pf_notify_vf_reset_work); + return 0; +} + +static uint32_t zxdh_set_vf_vlan(zxdh_msg_info *msg, zxdh_reps_info *reps, struct zxdh_en_device *edev) +{ + uint32_t ret = 0; + /* update local var*/ + edev->vlan_dev.vlan_id = msg->vf_vlan_msg.vlan_id; + edev->vlan_dev.qos = msg->vf_vlan_msg.qos; + edev->vlan_dev.protcol = msg->vf_vlan_msg.protocl; + + return ret; +} + +static uint32_t zxdh_pf_get_vf_queue(zxdh_msg_info *msg, zxdh_reps_info *reps, struct zxdh_en_device *edev) +{ + uint32_t ret = 0; + uint32_t vir_queue_start; + uint32_t vir_queue_num; + uint32_t queue_index; + uint32_t queue_num; + uint32_t max_queue_num = edev->curr_queue_pairs; + + PLCR_LOG_INFO("vf's edev->vport = 0x%x\n", edev->vport); + PLCR_LOG_INFO("vf's max_queue_num(pairs) = 0x%x\n", max_queue_num); + PLCR_LOG_INFO("edev->device_id = %x\n", edev->device_id); + PLCR_LOG_INFO("edev->rq[0].vq->phy_index = %x\n", edev->rq[0].vq->phy_index); + PLCR_LOG_INFO("edev->sq[0].vq->phy_index = %x\n", edev->sq[0].vq->phy_index); + + vir_queue_start = msg->plcr_pf_get_vf_queue_info_msg.vir_queue_start; + vir_queue_num = msg->plcr_pf_get_vf_queue_info_msg.vir_queue_num; + + PLCR_LOG_INFO("vir_queue_start = 0x%x\n", vir_queue_start); + PLCR_LOG_INFO("vir_queue_num = 0x%x\n", vir_queue_num); + + if(max_queue_num > (vir_queue_num + vir_queue_num)) + { + max_queue_num = vir_queue_num + vir_queue_num; + } + + for(queue_index=vir_queue_start, queue_num = 0; queue_indexplcr_pf_get_vf_queue_info_rsp.phy_rxq[queue_num] = edev->rq[queue_num].vq->phy_index; + reps->plcr_pf_get_vf_queue_info_rsp.phy_txq[queue_num] = edev->sq[queue_num].vq->phy_index; + } + + reps->plcr_pf_get_vf_queue_info_rsp.phy_queue_num = queue_num; + + PLCR_LOG_INFO("queue_num = 0x%x\n", queue_num); + + return ret; +} + +zxdh_pf_msg_proc pf_msg_proc[] = +{ + {ZXDH_SET_VF_LINK_STATE, "set_vf_link_state", zxdh_set_vf_link_state}, + {ZXDH_SET_VF_RESET, "set_vf_reset", zxdh_set_vf_reset}, + {ZXDH_PF_SET_VF_VLAN, "pf_set_vf_vlan", zxdh_set_vf_vlan}, + {ZXDH_PF_GET_VF_QUEUE_INFO, "pf_get_vf_queue_info", zxdh_pf_get_vf_queue}, +}; + +int32_t zxdh_vf_msg_recv_func(void *pay_load, uint16_t len, void *reps_buffer, uint16_t *reps_len, void *dev) +{ + zxdh_msg_info *msg = (zxdh_msg_info *)pay_load; + zxdh_reps_info *reps = (zxdh_reps_info *)reps_buffer; + struct zxdh_en_device *en_dev = (struct zxdh_en_device *)dev; + int32_t ret = 0; + int32_t i = 0; + int32_t num = 0; + + LOG_INFO("is called\n"); + if (len != sizeof(union zxdh_msg)) + { + LOG_ERR("invalid data_len\n"); + return -1; + } + + if (en_dev == NULL) + { + LOG_ERR("dev is NULL\n"); + return -1; + } + + num = sizeof(pf_msg_proc)/sizeof(zxdh_pf_msg_proc); + + for (i = 0; i < num; i++) + { + *reps_len = sizeof(union zxdh_msg); + if (pf_msg_proc[i].op_code == msg->hdr_vf.op_code) + { + LOG_INFO("%s is called", pf_msg_proc[i].proc_name); + ret = pf_msg_proc[i].msg_proc(msg, reps, en_dev); + if (ret != 0) + { + reps->flag = ZXDH_REPS_FAIL; + LOG_ERR("%s failed, ret: %d\n", pf_msg_proc[i].proc_name, ret); + return -1; + } + reps->flag = ZXDH_REPS_SUCC; + return 0; + } + } + + LOG_ERR("invalid op_code: [%u]\n", msg->hdr_vf.op_code); + return -2; +} + +int32_t dh_aux_ipv6_notifier_init(struct zxdh_en_priv *en_priv) +{ + int32_t ret = 0; + struct zxdh_en_device *en_dev = &en_priv->edev; + en_dev->ipv6_notifier.notifier_call = inet6_addr_change_notifier; + en_dev->ipv6_notifier.priority = 0; + ret = dh_inet6_addr_change_notifier_register(&(en_dev->ipv6_notifier)); + if (ret) + { + LOG_ERR("Failed to register inet6addr_notifier, ret:%d\n",ret); + return ret; + } + LOG_INFO("netdev:%s ipv6_notifier_init success\n", en_dev->netdev->name); + return ret; +} + +int32_t dh_aux_events_init(struct zxdh_en_priv *en_priv) +{ + struct dh_events *events = NULL; + struct zxdh_en_device *en_dev = &en_priv->edev; + int32_t i = 0; + int32_t ret = 0; + uint32_t evt_num = ARRAY_SIZE(aux_events); + + if (!en_dev->ops->if_init(en_dev->parent)) + { + evt_num -= 1; + } + + events = kzalloc((sizeof(*events) + evt_num * sizeof(struct dh_event_nb)), GFP_KERNEL); + if (unlikely(events == NULL)) + { + LOG_ERR("events kzalloc failed: %p\n", events); + ret = -ENOMEM; + goto err_events_kzalloc; + } + + events->evt_num = evt_num; + events->dev = NULL; + en_priv->events = events; + events->wq = create_singlethread_workqueue("dh_aux_events"); + if (!events->wq) + { + LOG_ERR("events->wq create_singlethread_workqueue failed: %p\n", events->wq); + ret = -ENOMEM; + goto err_create_wq; + } + + INIT_WORK(&en_dev->vf_link_info_update_work, vf_link_info_update_handler); + INIT_WORK(&en_dev->link_info_irq_update_vf_work, link_info_irq_update_vf_handler); + INIT_WORK(&en_dev->link_info_irq_process_work, link_info_irq_process_handler); + INIT_WORK(&en_dev->link_info_irq_update_np_work, link_info_irq_update_np_work_handler); + INIT_WORK(&en_dev->rx_mode_set_work, rx_mode_set_handler); + INIT_WORK(&en_dev->pf2vf_msg_proc_work, pf2vf_msg_proc_work_handler); + INIT_WORK(&en_dev->pf_notify_vf_reset_work, pf_notify_vf_reset_handler); + INIT_WORK(&en_dev->service_task, en_aux_service_task); + INIT_WORK(&en_dev->service_riscv_task, en_aux_service_riscv_task); + INIT_WORK(&en_dev->riscv2aux_msg_proc_work, riscv2aux_msg_proc_work_handler); + + timer_setup(&en_dev->service_timer, en_aux_service_timer, 0); + ret = mod_timer(&en_dev->service_timer, jiffies); + if (ret) + { + LOG_ERR("timer add failed\n"); + goto err_mod_timer; + } + + timer_setup(&en_dev->service_riscv_timer, en_aux_service_riscv_timer, 0); + ret = mod_timer(&en_dev->service_riscv_timer, jiffies); + if (ret) + { + LOG_ERR("timer add failed\n"); + goto err_riscv_timer; + } + + for (i = 0; i < evt_num; i++) + { + events->notifiers[i].nb = aux_events[i]; + events->notifiers[i].ctx = en_priv; + dh_eq_notifier_register(&en_priv->eq_table, &events->notifiers[i].nb); + } + + return ret; + +err_riscv_timer: + del_timer(&en_dev->service_riscv_timer); +err_mod_timer: + del_timer(&en_dev->service_timer); + destroy_workqueue(events->wq); +err_create_wq: + kfree(events); +err_events_kzalloc: + return ret; +} + +void dh_aux_events_uninit(struct zxdh_en_priv *en_priv) +{ + struct dh_events *events = en_priv->events; + struct zxdh_en_device *en_dev = &en_priv->edev; + int32_t i = 0; + + for (i = events->evt_num - 1; i >= 0 ; i--) + { + dh_eq_notifier_unregister(&en_priv->eq_table, &events->notifiers[i].nb); + } + + del_timer(&en_dev->service_timer); + del_timer(&en_dev->service_riscv_timer); + destroy_workqueue(en_priv->events->wq); + kfree(en_priv->events); + + return; +} + +static int32_t mgr_test_cnt(void *data, uint16_t len, void *reps, uint16_t *reps_len, void *dev) +{ + uint8_t *pay_load = (uint8_t *)data; + uint8_t *reps_buffer = (uint8_t *)reps; + uint16_t idx = 0; + uint16_t sum = 0; + + if (reps_buffer == NULL) + { + return 0; + } + + for (idx = 0; idx < len; idx++) + { + sum += pay_load[idx]; + } + + reps_buffer[0] = (uint8_t)sum; + reps_buffer[1] = (uint8_t)(sum >> 8); + *reps_len = 2; + return 0; +} + +static int32_t msgq_test_func(void *data, uint16_t len, void *reps, uint16_t *reps_len, void *dev) +{ + if (reps == NULL) + { + return 0; + } + + *reps_len = len; + return 0; +} + +int32_t dh_aux_msg_recv_func_register(void) +{ + int32_t ret = 0; + + ret = zxdh_bar_chan_msg_recv_register(MODULE_PF_BAR_MSG_TO_VF, zxdh_vf_msg_recv_func); + if (0 != ret) + { + LOG_ERR("event_id[%d] register failed: %d\n", MODULE_PF_BAR_MSG_TO_VF, ret); + return ret; + } + + ret = zxdh_bar_chan_msg_recv_register(MODULE_DHTOOL, zxdh_tools_sendto_user_netlink); + if (0 != ret) + { + LOG_ERR("event_id[%d] register failed: %d\n", MODULE_DHTOOL, ret); + goto unregister_pf_to_vf; + } + + ret = zxdh_bar_chan_msg_recv_register(MODULE_DEMO, mgr_test_cnt); + if (0 != ret) + { + LOG_ERR("event_id[%d] register failed: %d\n", MODULE_MSGQ, ret); + goto unregister_dhtool; + } + + ret = zxdh_bar_chan_msg_recv_register(MODULE_MSGQ, msgq_test_func); + if (0 != ret) + { + LOG_ERR("event_id[%d] register failed: %d\n", MODULE_MSGQ, ret); + goto unregister_demo; + } + + return ret; +unregister_demo: + zxdh_bar_chan_msg_recv_unregister(MODULE_DEMO); +unregister_dhtool: + zxdh_bar_chan_msg_recv_unregister(MODULE_DHTOOL); +unregister_pf_to_vf: + zxdh_bar_chan_msg_recv_unregister(MODULE_PF_BAR_MSG_TO_VF); + return ret; +} + +void dh_aux_msg_recv_func_unregister(void) +{ + zxdh_bar_chan_msg_recv_unregister(MODULE_MSGQ); + zxdh_bar_chan_msg_recv_unregister(MODULE_DEMO); + zxdh_bar_chan_msg_recv_unregister(MODULE_DHTOOL); + zxdh_bar_chan_msg_recv_unregister(MODULE_PF_BAR_MSG_TO_VF); + return; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_aux/events.h b/src/net/drivers/net/ethernet/dinghai/en_aux/events.h new file mode 100644 index 0000000..5734856 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_aux/events.h @@ -0,0 +1,24 @@ +#ifndef __ZXDH_PF_EVENTS_H__ +#define __ZXDH_PF_EVENTS_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "en_aux.h" +#include "../en_np/table/include/dpp_tbl_comm.h" + +#define DH_AUX_PF_ID_OFFSET(vport) (EPID(vport) * 8 + FUNC_NUM(vport)) + +int32_t dh_aux_events_init(struct zxdh_en_priv *en_priv); +void dh_aux_events_uninit(struct zxdh_en_priv *en_priv); +int32_t dh_aux_msg_recv_func_register(void); +void dh_aux_msg_recv_func_unregister(void); +int32_t dh_aux_ipv6_notifier_init(struct zxdh_en_priv *en_priv); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_aux/priv_queue.c b/src/net/drivers/net/ethernet/dinghai/en_aux/priv_queue.c new file mode 100644 index 0000000..e29058e --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_aux/priv_queue.c @@ -0,0 +1,812 @@ + +#include +#include +#include +#include +#include "priv_queue.h" + +static void poll_timer_callback(struct timer_list *this_timer) +{ + struct msgq_dev *msgq_dev = from_timer(msgq_dev, this_timer, poll_timer); + struct msg_buff *this_msg_buff = NULL; + uint16_t i = 0; + uint32_t tx_timeouts = 0; + + if (msgq_dev == NULL) + { + LOG_ERR("msgq_dev is NULL\n"); + return; + } + + for (i = 0; i < MSGQ_MAX_MSG_BUFF_NUM; ++i) + { + if (msgq_dev->free_cnt == 0) + { + msgq_dev->timer_in_use = false; + return; + } + this_msg_buff = &msgq_dev->msg_buff_ring[i]; + + if (!this_msg_buff->using || !this_msg_buff->need_free) + { + continue; + } + + if (this_msg_buff->timeout_cnt == 0) + { + *(this_msg_buff->data_len) = 0; + this_msg_buff->data = NULL; + msgq_dev->free_cnt--; + tx_timeouts++; + LOG_ERR("msg[%d] get callback out of time\n", i); + this_msg_buff->using = false; + continue; + } + this_msg_buff->timeout_cnt--; + } + + u64_stats_update_begin(&msgq_dev->sq_priv->stats.syncp); + msgq_dev->sq_priv->stats.tx_timeouts += tx_timeouts; + u64_stats_update_end(&msgq_dev->sq_priv->stats.syncp); + + mod_timer(this_timer, jiffies + msecs_to_jiffies(TIMER_DELAY_US)); +} + +static uint32_t msgq_get_mergeable_buf_len(struct receive_queue *rq, struct ewma_pkt_len *avg_pkt_len) +{ + const size_t hdr_len = PRIV_HEADER_LEN; + uint32_t len = 0; + + len = hdr_len + clamp_t(uint32_t, ewma_pkt_len_read(avg_pkt_len), rq->min_buf_len, PAGE_SIZE - hdr_len); + + return ALIGN(len, L1_CACHE_BYTES); +} + +static int32_t msgq_add_recvbuf_mergeable(struct receive_queue *rq, gfp_t gfp) +{ + struct page_frag *alloc_frag = &rq->alloc_frag; + char *buf = NULL; + void *ctx = NULL; + int32_t err = 0; + uint32_t len = 0; + uint32_t hole = 0; + + len = msgq_get_mergeable_buf_len(rq, &rq->mrg_avg_pkt_len); + if (unlikely(!skb_page_frag_refill(len, alloc_frag, gfp))) + { + return -ENOMEM; + } + + buf = (char *)page_address(alloc_frag->page) + alloc_frag->offset; + get_page(alloc_frag->page); + alloc_frag->offset += len; + hole = alloc_frag->size - alloc_frag->offset; + if (hole < len) + { + len += hole; + alloc_frag->offset += hole; + } + + sg_init_one(rq->sg, buf, len); + ctx = (void *)(unsigned long)len; + err = virtqueue_add_inbuf_ctx(rq->vq, rq->sg, 1, buf, ctx, gfp); + if (err < 0) + { + put_page(virt_to_head_page(buf)); + } + + return err; +} + +static bool msgq_try_fill_recv(struct receive_queue *rq, gfp_t gfp) +{ + int32_t err = 0; + bool oom = 0; + unsigned long flags = 0; + + do + { + err = msgq_add_recvbuf_mergeable(rq, gfp); + oom = err == -ENOMEM; + if (err) + { + break; + } + } while (rq->vq->num_free); + + if (virtqueue_kick_prepare_packed(rq->vq) && virtqueue_notify(rq->vq)) + { + flags = u64_stats_update_begin_irqsave(&rq->stats.syncp); + rq->stats.kicks++; + u64_stats_update_end_irqrestore(&rq->stats.syncp, flags); + } + + return !oom; +} + +uint32_t msgq_mergeable_min_buf_len(struct virtqueue *vq) +{ + const uint32_t hdr_len = PRIV_HEADER_LEN; + uint32_t rq_size = virtqueue_get_vring_size(vq); + uint32_t min_buf_len = DIV_ROUND_UP(BUFF_LEN, rq_size); + + return max(max(min_buf_len, hdr_len) - hdr_len, (uint32_t)GOOD_PACKET_LEN); +} + +static int32_t msgq_privq_init(struct msgq_dev *msgq_dev, struct net_device *netdev) +{ + struct receive_queue *rq = msgq_dev->rq_priv; + struct send_queue *sq = msgq_dev->sq_priv; + + rq->pages = NULL; + rq->min_buf_len = msgq_mergeable_min_buf_len(rq->vq); + netif_napi_add(netdev, &rq->napi, zxdh_msgq_poll, NAPI_POLL_WEIGHT); + netif_tx_napi_add(netdev, &sq->napi, NULL, NAPI_POLL_WEIGHT); + + sg_init_table(rq->sg, ARRAY_SIZE(rq->sg)); + ewma_pkt_len_init(&rq->mrg_avg_pkt_len); + sg_init_table(sq->sg, ARRAY_SIZE(sq->sg)); + + u64_stats_init(&rq->stats.syncp); + u64_stats_init(&sq->stats.syncp); + + if (!msgq_try_fill_recv(rq, GFP_KERNEL)) + { + LOG_ERR("msgq_try_fill_recv failed\n"); + ZXDH_FREE_PTR(msgq_dev); + return MSGQ_RET_ERR_CHANNEL_NOT_READY; + } + + msgq_dev->msgq_enable = true; + virtnet_napi_enable(rq->vq, &rq->napi); + LOG_INFO("zxdh_msgq_init success\n"); + return MSGQ_RET_OK; +} + +int32_t zxdh_msgq_init(struct zxdh_en_device *en_dev) +{ + struct msgq_dev *msgq_dev = NULL; + int32_t idx = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + en_dev->msgq_dev = kzalloc(sizeof(struct msgq_dev), GFP_KERNEL); + ZXDH_CHECK_PTR_RETURN(en_dev->msgq_dev); + + idx = en_dev->max_queue_pairs - ZXDH_PQ_PAIRS_NUM; + msgq_dev = (struct msgq_dev *)en_dev->msgq_dev; + msgq_dev->sq_priv = &en_dev->sq[idx]; + msgq_dev->rq_priv = &en_dev->rq[idx]; + msgq_dev->msgq_vfid = (uint16_t)VQM_VFID(en_dev->vport); + msgq_dev->msgq_rqid = (uint16_t)msgq_dev->rq_priv->vq->phy_index; + + dpp_vport_create_by_vqm_vfid(&pf_info, RISCV_COMMON_VFID); + spin_lock_init(&msgq_dev->sn_lock); + spin_lock_init(&msgq_dev->tx_lock); + mutex_init(&msgq_dev->mlock); + timer_setup(&msgq_dev->poll_timer, poll_timer_callback, 0); + + return msgq_privq_init(msgq_dev, en_dev->netdev); +} + +void zxdh_msgq_exit(struct zxdh_en_device *en_dev) +{ + struct msgq_dev *msgq_dev = (struct msgq_dev *)en_dev->msgq_dev; + + if (msgq_dev == NULL) + { + LOG_ERR("msgq_dev is null!\n"); + return; + } + + msgq_dev->msgq_enable = false; + napi_disable(&msgq_dev->rq_priv->napi); + del_timer(&msgq_dev->poll_timer); + + ZXDH_FREE_PTR(msgq_dev); + LOG_INFO("zxdh_msg_chan_pkt remove success\n"); +} + +void msgq_print_data(uint8_t *buf, uint32_t len, uint8_t flag) +{ + uint32_t print_len = 0; + + if (flag == MSGQ_PRINT_HDR) + { + print_len = PRIV_HEADER_LEN; + } + else if (flag == MSGQ_PRINT_128B) + { + print_len = len > 128 ? 128 : len; + } + else if (flag == MSGQ_PRINT_ALL) + { + print_len = len; + } + print_data(buf, print_len); +} + +static int32_t zxdh_msg_para_check(struct msgq_pkt_info *msg, struct reps_info *reps) +{ + ZXDH_CHECK_PTR_RETURN(msg); + ZXDH_CHECK_PTR_RETURN(msg->addr); + + if ((msg->len == 0) || (msg->len > MSGQ_MAX_ADDR_LEN)) + { + LOG_ERR("invalid data_len: %d\n", msg->len); + goto free_addr; + } + + if (msg->event_id >= MSG_MODULE_NUM) + { + LOG_ERR("invalid event_id\n"); + goto free_addr; + } + + if (msg->no_reps) + { + return MSGQ_RET_OK; + } + + ZXDH_CHECK_PTR_GOTO_ERR(reps, free_addr); + ZXDH_CHECK_PTR_GOTO_ERR(reps->addr, free_addr); + if (reps->len == 0) + { + LOG_ERR("invalid reps_len: %d\n", reps->len); + goto free_addr; + } + + return MSGQ_RET_OK; +free_addr: + ZXDH_FREE_PTR(msg->addr); + return MSGQ_RET_ERR_INVALID_PARA; +} + +static int32_t zxdh_sequence_num_get(struct msgq_dev *msgq_dev, uint16_t *sequence_num) +{ + uint16_t sn = 0; + uint16_t loop = 0; + + spin_lock(&msgq_dev->sn_lock); + sn = msgq_dev->sequence_num; + + for (loop = 0; loop < MSGQ_MAX_MSG_BUFF_NUM; loop++) + { + if (!msgq_dev->msg_buff_ring[sn].using) + { + *sequence_num = sn; + msgq_dev->msg_buff_ring[sn].using = true; + msgq_dev->msg_buff_ring[sn].valid = false; + msgq_dev->free_cnt++; + SEQUENCE_NUM_ADD(sn); + break; + } + SEQUENCE_NUM_ADD(sn); + } + + msgq_dev->sequence_num = sn; + spin_unlock(&msgq_dev->sn_lock); + + if (loop == MSGQ_MAX_MSG_BUFF_NUM) + { + return MSGQ_RET_ERR_CHAN_BUSY; + } + + return MSGQ_RET_OK; +} + +static int32_t page_send_cmd(struct send_queue *sq, uint8_t *buf, uint16_t buf_len, uint8_t print) +{ + uint16_t i = 0; + int32_t err = 0; + uint16_t total_sg = 0; + uint16_t last_buff_len = 0; + + if (print != 0) + { + LOG_DEBUG("send pkt start\n"); + msgq_print_data(buf, buf_len, print); + } + + total_sg = buf_len / BUFF_LEN; + last_buff_len = buf_len % BUFF_LEN; + if (last_buff_len != 0) + { + total_sg += 1; + } + + sg_init_table(sq->sg, total_sg); + for (i = 0; i < total_sg; ++i) + { + if (i == (total_sg - 1)) + { + sg_set_buf(&sq->sg[i], buf + (i * BUFF_LEN), ((last_buff_len != 0) ? (last_buff_len) : (BUFF_LEN))); + } + else + { + sg_set_buf(&sq->sg[i], buf + (i * BUFF_LEN), BUFF_LEN); + } + } + + err = virtqueue_add_outbuf(sq->vq, sq->sg, total_sg, buf, GFP_ATOMIC); + ZXDH_CHECK_RET_GOTO_ERR(err, free_addr, "virtqueue_add_outbuf failed: %d\n", err); + + if (virtqueue_kick_prepare_packed(sq->vq) && virtqueue_notify(sq->vq)) + { + u64_stats_update_begin(&sq->stats.syncp); + sq->stats.kicks++; + u64_stats_update_end(&sq->stats.syncp); + } + return err; + +free_addr: + return MSGQ_RET_ERR_VQ_BROKEN; +} + +static int32_t zxdh_msgq_pkt_send(struct msgq_dev *msgq_dev, \ + struct msgq_pkt_info *pkt_info, uint16_t sn) +{ + struct priv_queues_net_hdr *hdr = (struct priv_queues_net_hdr *)pkt_info->addr; + void *buf = NULL; + uint32_t len = 0; + + if (spin_trylock(&msgq_dev->tx_lock)) + { + while ((buf = virtqueue_get_buf(msgq_dev->sq_priv->vq, &len)) != NULL) + { + ZXDH_FREE_PTR(buf); + }; + spin_unlock(&msgq_dev->tx_lock); + } + + memset(hdr, 0, PRIV_HEADER_LEN); + hdr->tx_port = TX_PORT_NP; + hdr->pd_len = PRIV_HEADER_LEN / 2; + hdr->pi_hdr.pi_type = DEFAULT_PI_TYPE; + hdr->pi_hdr.pkt_type = CONTROL_MSG_TYPE; + hdr->pi_hdr.vfid_dst = htons(RISCV_COMMON_VFID); + hdr->pi_hdr.qid_dst = htons(RISCV_COMMON_QID); + hdr->pi_hdr.vfid_src = htons(msgq_dev->msgq_vfid); + hdr->pi_hdr.qid_src = htons(msgq_dev->msgq_rqid); + hdr->pi_hdr.event_id = pkt_info->event_id; + hdr->pi_hdr.sequence_num = sn; + if (sn == NO_REPS_SEQUENCE_NUM) + { + hdr->pi_hdr.msg_type = NO_REPS_MSG; + } + if (msgq_dev->loopback) + { + hdr->pi_hdr.event_id = MODULE_MSGQ; + hdr->pi_hdr.vfid_dst = hdr->pi_hdr.vfid_src; + hdr->pi_hdr.qid_dst = hdr->pi_hdr.qid_src; + } + + return page_send_cmd(msgq_dev->sq_priv, pkt_info->addr, \ + pkt_info->len, msgq_dev->print_flag); +} + +int32_t zxdh_msgq_send_cmd(struct msgq_dev *msgq_dev, \ + struct msgq_pkt_info *pkt_info, struct reps_info *reps) +{ + uint16_t sn = NO_REPS_SEQUENCE_NUM; + uint16_t sync_poll_cnt = 0; + int32_t err = 0; + int32_t i = 0; + uint32_t tx_timeouts = 0; + uint32_t tx_errs = 0; + + err = zxdh_msg_para_check(pkt_info, reps); + ZXDH_CHECK_RET_GOTO_ERR(err, tx_err, "zxdh_msg_para_check failed: %d\n", err); + + ZXDH_CHECK_PTR_GOTO_ERR(msgq_dev, free_addr); + CHECK_CHANNEL_USABLE(msgq_dev, err, free_addr); + + if (!pkt_info->no_reps) + { + err = zxdh_sequence_num_get(msgq_dev, &sn); + ZXDH_CHECK_RET_GOTO_ERR(err, free_addr, \ + "zxdh_sequence_num_get failed: %d\n", err); + } + + mutex_lock(&msgq_dev->mlock); + err = zxdh_msgq_pkt_send(msgq_dev, pkt_info, sn); + mutex_unlock(&msgq_dev->mlock); + ZXDH_CHECK_RET_GOTO_ERR(err, free_addr, "zxdh_msgq_pkt_send failed: %d\n", err); + + if (pkt_info->no_reps) + { + return MSGQ_RET_OK; + } + + msgq_dev->msg_buff_ring[sn].data = &reps->addr; + msgq_dev->msg_buff_ring[sn].data_len = &reps->len; + msgq_dev->msg_buff_ring[sn].timeout_cnt = pkt_info->timeout_us / TIMER_DELAY_US; + if (!pkt_info->is_async) + { + sync_poll_cnt = pkt_info->timeout_us / 10; + for (i = 0; i < sync_poll_cnt; ++i) + { + usleep_range(5, 10); + if (!msgq_dev->msg_buff_ring[sn].using && + msgq_dev->msg_buff_ring[sn].valid) + { + return MSGQ_RET_OK; + } + } + err = MSGQ_RET_ERR_CALLBACK_OUT_OF_TIME; + goto free_sn; + } + else + { + msgq_dev->msg_buff_ring[sn].need_free = true; + if (!msgq_dev->timer_in_use) + { + mod_timer(&msgq_dev->poll_timer, jiffies + usecs_to_jiffies(TIMER_DELAY_US)); + msgq_dev->timer_in_use = true; + } + } + return MSGQ_RET_OK; + +free_addr: + ZXDH_FREE_PTR(pkt_info->addr); +tx_err: + tx_errs++; +free_sn: + if ((sn != NO_REPS_SEQUENCE_NUM) && (sn < MSGQ_MAX_MSG_BUFF_NUM)) + { + LOG_ERR("timeout, sn[%d] is free\n", sn); + msgq_dev->msg_buff_ring[sn].using = false; + tx_timeouts++; + msgq_dev->free_cnt--; + } + u64_stats_update_begin(&msgq_dev->sq_priv->stats.syncp); + msgq_dev->sq_priv->stats.xdp_tx_drops += tx_errs; + msgq_dev->sq_priv->stats.tx_timeouts += tx_timeouts; + u64_stats_update_end(&msgq_dev->sq_priv->stats.syncp); + return err; +} + +static void zxdh_swap_dst_and_src(uint16_t *dst, uint16_t *src) +{ + uint16_t temp = 0; + + temp = *dst; + *dst = *src; + *src = temp; +} + +static int32_t zxdh_pi_header_check(struct pi_header *hdr) +{ + if (hdr->pi_type != DEFAULT_PI_TYPE) + { + LOG_ERR("INVALID_PI_TYPE: %d\n", hdr->pi_type); + return MSGQ_RET_ERR_CALLBACK_FAIL; + } + + if (hdr->pkt_type != CONTROL_MSG_TYPE) + { + LOG_ERR("INVALID_PKT_TYPE: %d\n", hdr->pkt_type); + return MSGQ_RET_ERR_CALLBACK_FAIL; + } + + if (hdr->msg_type > NO_REPS_MSG) + { + LOG_ERR("INVALID_MSG_TYPE: %d\n", hdr->msg_type); + return MSGQ_RET_ERR_CALLBACK_FAIL; + } + + if (hdr->event_id >= MSG_MODULE_NUM) + { + LOG_ERR("INVALID_MSG_MODULE_ID: %d\n", hdr->event_id); + return MSGQ_RET_ERR_CALLBACK_FAIL; + } + + if (hdr->err_code != MSGQ_RET_OK) + { + LOG_ERR("MSG_ERR_CODE: %d\n", hdr->err_code); + return MSGQ_RET_ERR_CALLBACK_FAIL; + } + + return MSGQ_RET_OK; +} + +static void rx_free_pages(struct msgq_dev *msgq_dev, void *buf, uint32_t len) +{ + if (msgq_dev->print_flag == MSGQ_PRINT_ALL) + { + print_data((uint8_t *)buf, len); + LOG_DEBUG("buf: 0x%llx refcnt: %d\n", (uint64_t)buf, \ + page_ref_count(virt_to_head_page(buf))); + } + put_page(virt_to_head_page(buf)); +} + +static int32_t zxdh_response_msg_handle(struct msgq_dev *msgq_dev, \ + struct virtnet_rq_stats *stats, uint16_t num_buf, void *buf, uint32_t len) +{ + struct priv_queues_net_hdr *hdr = (struct priv_queues_net_hdr *)buf; + uint16_t sn = hdr->pi_hdr.sequence_num; + int32_t err = MSGQ_RET_OK; + struct msg_buff *tmp_buff = NULL; + uint32_t max_len = 0; + uint32_t pkt_len = 0; + + if (sn >= MSGQ_MAX_MSG_BUFF_NUM) + { + LOG_ERR("INVALID_SEQUENCE_NUM: %d\n", sn); + err = MSGQ_RET_ERR; + goto put_page; + } + + tmp_buff = &msgq_dev->msg_buff_ring[sn]; + if (!tmp_buff->using) + { + LOG_ERR("buff[%d] is free\n", sn); + err = MSGQ_RET_ERR_CALLBACK_OUT_OF_TIME; + goto put_page; + } + ZXDH_CHECK_PTR_GOTO_ERR(*tmp_buff->data, put_page); + + max_len = *(tmp_buff->data_len); + pkt_len = len - PRIV_HEADER_LEN; + if (pkt_len > max_len) + { + LOG_ERR("buf_len: %d > tmp_buff->data_len: %d\n", pkt_len, max_len); + err = MSGQ_RET_ERR_REPS_LEN_NOT_ENOUGH; + goto put_page; + } + + memcpy(*tmp_buff->data, (uint8_t *)buf + PRIV_HEADER_LEN, pkt_len); + while (--num_buf != 0) + { + rx_free_pages(msgq_dev, buf, len); + buf = virtqueue_get_buf(msgq_dev->rq_priv->vq, &len); + if (unlikely(buf == NULL)) + { + LOG_ERR("msgq rx error: %dth buffers missing\n", num_buf); + stats->drops++; + err = MSGQ_RET_ERR_RX_INVALID_NUM_BUF; + goto out; + } + + if ((len + pkt_len) > max_len) + { + LOG_ERR("buf_len: %d > tmp_buff->data_len: %d\n", len + pkt_len, max_len); + err = MSGQ_RET_ERR_REPS_LEN_NOT_ENOUGH; + goto put_page; + } + + stats->bytes += len; + memcpy((*tmp_buff->data) + pkt_len, buf, len); + pkt_len += len; + } + *(tmp_buff->data_len) = pkt_len; + tmp_buff->valid = true; + stats->xdp_drops--; + +put_page: + put_page(virt_to_head_page(buf)); +out: + if (tmp_buff != NULL) + { + tmp_buff->using = false; + tmp_buff->data = NULL; + msgq_dev->free_cnt--; + } + return err; +} + +static int32_t zxdh_callback_msg_handle(struct zxdh_en_device *en_dev, \ + uint8_t *buf_addr, uint32_t buf_len) +{ + struct msgq_dev *msgq_dev = (struct msgq_dev *)en_dev->msgq_dev; + int32_t err = BAR_MSG_ERR_MODULE_NOEXIST; + uint8_t *reps_addr = NULL; + uint16_t reps_len = MAX_PACKET_LEN; + uint16_t hdr_len = PRIV_HEADER_LEN; + struct priv_queues_net_hdr *hdr = NULL; + + hdr = (struct priv_queues_net_hdr *)buf_addr; + if (hdr->pi_hdr.msg_type == NO_REPS_MSG) + { + return call_msg_recv_func_tbl(hdr->pi_hdr.event_id, \ + buf_addr + hdr_len, buf_len - hdr_len, NULL, 0, en_dev); + } + + reps_addr = kzalloc(MSGQ_MAX_ADDR_LEN, GFP_ATOMIC); + ZXDH_CHECK_PTR_RETURN(reps_addr); + memcpy(reps_addr, buf_addr, hdr_len); + hdr = (struct priv_queues_net_hdr *)reps_addr; + + if (hdr->pi_hdr.event_id < MSG_MODULE_NUM) + { + err = call_msg_recv_func_tbl(hdr->pi_hdr.event_id, \ + buf_addr + hdr_len, buf_len - hdr_len, \ + reps_addr + hdr_len, &reps_len, en_dev); + hdr->pi_hdr.msg_type = ACK_MSG; + } + + if (err == BAR_MSG_ERR_MODULE_NOEXIST) + { + hdr->pi_hdr.err_code = ERR_CODE_EVENT_UNREGIST; + } + else if ((err != MSGQ_RET_OK) || (reps_len > MAX_PACKET_LEN)) + { + LOG_ERR("get reps failed, reps_len:%d\n", reps_len); + hdr->pi_hdr.err_code = ERR_CODE_EVENT_FAIL; + } + + zxdh_swap_dst_and_src(&hdr->pi_hdr.vfid_dst, &hdr->pi_hdr.vfid_src); + zxdh_swap_dst_and_src(&hdr->pi_hdr.qid_dst, &hdr->pi_hdr.qid_src); + + return page_send_cmd(msgq_dev->sq_priv, \ + reps_addr, reps_len + hdr_len, msgq_dev->print_flag); +} + +static void msgq_receive_buf(struct zxdh_en_device *en_dev, struct receive_queue *rq, + void *buf, uint32_t len, void **ctx, struct virtnet_rq_stats *stats) +{ + struct net_device *netdev = en_dev->netdev; + struct priv_queues_net_hdr *hdr = (struct priv_queues_net_hdr *)buf; + uint16_t num_buf = vqm16_to_cpu(netdev, hdr->num_buffers); + struct msgq_dev *msgq_dev = (struct msgq_dev *)en_dev->msgq_dev; + int32_t err = MSGQ_RET_OK; + uint8_t *tmp_addr = NULL; + uint32_t tmp_addr_len = len; + bool free_tmp_addr = false; + + if (msgq_dev->print_flag != 0) + { + LOG_DEBUG("receive pkt start, num_buf: %d\n", num_buf); + msgq_print_data((uint8_t *)buf, len, msgq_dev->print_flag); + } + + stats->xdp_drops++; + err = zxdh_pi_header_check(&hdr->pi_hdr); + ZXDH_CHECK_RET_GOTO_ERR(err, free_pages, "invalid pi_header\n"); + + if (hdr->pi_hdr.msg_type == ACK_MSG) + { + err = zxdh_response_msg_handle(msgq_dev, stats, num_buf, buf, len); + goto free_addr; + } + else if (num_buf == 1) + { + err = zxdh_callback_msg_handle(en_dev, (uint8_t *)buf, len); + } + else + { + tmp_addr = kzalloc(MSGQ_MAX_ADDR_LEN, GFP_ATOMIC); + ZXDH_CHECK_PTR_GOTO_ERR(tmp_addr, free_pages); + memcpy(tmp_addr, buf, tmp_addr_len); + free_tmp_addr = true; + while (--num_buf != 0) + { + rx_free_pages(msgq_dev, buf, len); + buf = virtqueue_get_buf_ctx_packed(rq->vq, &len, ctx); + if (unlikely(buf == NULL)) + { + LOG_ERR("msgq rx error: %dth buffers missing\n", num_buf); + stats->drops++; + goto free_addr; + } + + memcpy(tmp_addr + tmp_addr_len, buf, len); + tmp_addr_len += len; + } + err = zxdh_callback_msg_handle(en_dev, tmp_addr, tmp_addr_len); + } + stats->xdp_drops--; + +free_pages: + put_page(virt_to_head_page(buf)); +free_addr: + if (free_tmp_addr) + { + ZXDH_FREE_PTR(tmp_addr); + } + stats->bytes += tmp_addr_len; + return; +} + +static int32_t zxdh_msgq_receive(struct receive_queue *rq, int32_t budget) +{ + struct zxdh_en_device *en_dev = netdev_priv(rq->vq->vdev); + struct virtnet_rq_stats stats = {}; + uint32_t len = 0; + void *buf = NULL; + int32_t i = 0; + void *ctx = NULL; + uint64_t *item = NULL; + + while (stats.packets < budget && (buf = virtqueue_get_buf_ctx_packed(rq->vq, &len, &ctx))) + { + msgq_receive_buf(en_dev, rq, buf, len, &ctx, &stats); + stats.packets++; + } + + if (rq->vq->num_free > min((uint32_t)budget, virtqueue_get_vring_size(rq->vq)) / 2) + { + if (!msgq_try_fill_recv(rq, GFP_ATOMIC)) + { + LOG_ERR("msgq_try_fill_recv failed\n"); + } + } + + u64_stats_update_begin(&rq->stats.syncp); + for (i = 0; i < VIRTNET_RQ_STATS_LEN; i++) + { + size_t offset = virtnet_rq_stats_desc[i].offset; + item = (uint64_t *)((uint8_t *)&rq->stats + offset); + *item += *(uint64_t *)((uint8_t *)&stats + offset); + } + u64_stats_update_end(&rq->stats.syncp); + + return stats.packets; +} + +static void free_old_xmit_bufs(struct net_device *netdev, struct send_queue *sq) +{ + uint32_t len = 0; + uint32_t packets = 0; + uint32_t bytes = 0; + void *buf = NULL; + + while ((buf = virtqueue_get_buf(sq->vq, &len)) != NULL) + { + bytes += len; + packets++; + ZXDH_FREE_PTR(buf); + } + + if (!packets) + { + return; + } + + u64_stats_update_begin(&sq->stats.syncp); + sq->stats.bytes += bytes; + sq->stats.packets += packets; + u64_stats_update_end(&sq->stats.syncp); +} + +static void msgq_poll_cleantx(struct receive_queue *rq) +{ + struct zxdh_en_priv *en_priv = netdev_priv(rq->vq->vdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct msgq_dev *msgq_dev = (struct msgq_dev *)en_dev->msgq_dev; + struct send_queue *sq = msgq_dev->sq_priv; + + if (!sq->napi.weight) + { + return; + } + + if (spin_trylock(&msgq_dev->tx_lock)) + { + free_old_xmit_bufs(en_dev->netdev, sq); + spin_unlock(&msgq_dev->tx_lock); + } +} + +int zxdh_msgq_poll(struct napi_struct *napi, int budget) +{ + struct receive_queue *rq = container_of(napi, struct receive_queue, napi); + struct zxdh_en_device *en_dev = netdev_priv(rq->vq->vdev); + struct msgq_dev *msgq_dev = (struct msgq_dev *)en_dev->msgq_dev; + uint32_t received = 0; + + if (msgq_dev->msgq_enable) + { + msgq_poll_cleantx(rq); + received = zxdh_msgq_receive(rq, budget); + } + + if (received < budget) + { + virtqueue_napi_complete(napi, rq->vq, received); + } + + return received; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_aux/priv_queue.h b/src/net/drivers/net/ethernet/dinghai/en_aux/priv_queue.h new file mode 100644 index 0000000..3ad57da --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_aux/priv_queue.h @@ -0,0 +1,225 @@ +#ifndef __ZXDH_PRIV_QUEUE_H__ +#define __ZXDH_PRIV_QUEUE_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include "queue.h" +#include "../en_aux.h" +#include "../../dinghai/en_np/table/include/dpp_tbl_api.h" + +#define MSGQ_TEST 1 + +#define MSGQ_RET_OK 0 +#define MSGQ_RET_ERR (-1) +#define MSGQ_RET_ERR_NULL_PTR (-2) +#define MSGQ_RET_ERR_INVALID_PARA (-3) +#define MSGQ_RET_ERR_CHANNEL_NOT_READY (-5) +#define MSGQ_RET_ERR_CHAN_BUSY (-6) +#define MSGQ_RET_ERR_VQ_BROKEN (-7) +#define MSGQ_RET_ERR_CALLBACK_OUT_OF_TIME (-8) +#define MSGQ_RET_ERR_CALLBACK_FAIL (-9) +#define MSGQ_RET_ERR_REPS_LEN_NOT_ENOUGH (-10) +#define MSGQ_RET_ERR_RX_INVALID_NUM_BUF (-11) + +struct reps_info +{ + uint32_t len; + uint8_t *addr; +}; + +struct msgq_pkt_info +{ + uint32_t timeout_us; + uint16_t event_id; + bool is_async; + bool no_reps; + uint8_t msg_priority; + uint8_t rsv; + uint32_t len; + uint8_t *addr; +} __attribute__((packed)); + +/* msg_chan_pkt Definitions */ +#define MAX_PACKET_LEN (MSGQ_MAX_ADDR_LEN - PRIV_HEADER_LEN) +#define MSGQ_MAX_ADDR_LEN 14000 +#define NO_REPS_SEQUENCE_NUM 0x8000 + +#define TIMER_DELAY_US 100 +#define MSGQ_MAX_MSG_BUFF_NUM 1024 +#define BUFF_LEN 4096 + +#define PRIV_HEADER_LEN sizeof(struct priv_queues_net_hdr) +#define DEFAULT_PI_TYPE 0x00 /*NP*/ +#define CONTROL_MSG_TYPE 0x1f +#define NEED_REPS_MSG 0x00 +#define ACK_MSG 0x01 +#define NO_REPS_MSG 0x02 + +#define RISCV_COMMON_VFID (1192) +#define RISCV_COMMON_QID (4092) + +enum msgq_err_code +{ + ERR_CODE_INVALID_EVENTID = 1, + ERR_CODE_EVENT_UNREGIST, + ERR_CODE_INVALID_ACK, + ERR_CODE_EVENT_FAIL, + ERR_CODE_INVALID_REPS_LEN, + ERR_CODE_PEER_BROKEN, +}; + +struct pi_header +{ + uint8_t pi_type; + uint8_t pkt_type; + uint16_t event_id; + uint16_t vfid_dst; + uint16_t qid_dst; + uint16_t vfid_src; + uint16_t qid_src; + uint16_t sequence_num; + uint8_t msg_priority; + uint8_t msg_type; + uint8_t err_code; + uint8_t rsv[3]; +}; + +struct msgq_pi_info +{ + uint16_t event_id; + uint16_t vfid_dst; + uint16_t qid_dst; + uint16_t vfid_src; + uint16_t qid_src; + uint16_t sequence_num; +} __attribute__((packed)); + +struct priv_queues_net_hdr +{ + uint8_t tx_port; + uint8_t pd_len; + uint8_t num_buffers; + uint8_t rsv; + struct pi_header pi_hdr; +}; + +struct msg_buff +{ + bool using; + bool valid; + bool need_free; + uint32_t timeout_cnt; + uint8_t **data; + uint32_t *data_len; +} __attribute__((packed)); + +#define MSGQ_PRINT_HDR 1 +#define MSGQ_PRINT_128B 2 +#define MSGQ_PRINT_ALL 3 +#define MSGQ_PRINT_STA 4 + +struct msgq_dev +{ + bool msgq_enable; + bool timer_in_use; + bool loopback; + uint8_t print_flag; + uint16_t sequence_num; + uint16_t free_cnt; + uint16_t msgq_vfid; + uint16_t msgq_rqid; + struct send_queue *sq_priv; + struct receive_queue *rq_priv; + struct mutex mlock; + struct spinlock sn_lock; + struct spinlock tx_lock; + struct msg_buff msg_buff_ring[MSGQ_MAX_MSG_BUFF_NUM]; + struct timer_list poll_timer; +} __attribute__((packed)); + +#define CHECK_CHANNEL_USABLE(msgq, ret, err) \ +do \ +{ \ + if (!(msgq)->msgq_enable) \ + { \ + LOG_ERR("msgq unable\n"); \ + ret = MSGQ_RET_ERR_CHANNEL_NOT_READY; \ + goto err; \ + } \ +} while (0) + +#define ZXDH_CHECK_RET_RETURN(ret, fmt, arg...) \ +do \ +{ \ + if ((ret) != MSGQ_RET_OK) \ + { \ + LOG_ERR(fmt, ##arg); \ + return (ret); \ + } \ +} while (0) + +#define ZXDH_CHECK_RET_GOTO_ERR(ret, err, fmt, arg...) \ +do \ +{ \ + if ((ret) != MSGQ_RET_OK) \ + { \ + LOG_ERR(fmt, ##arg); \ + goto err; \ + } \ +} while (0) + +#define ZXDH_CHECK_PTR_RETURN(ptr) \ +do \ +{ \ + if (unlikely((ptr) == NULL)) \ + { \ + LOG_ERR("null pointer\n"); \ + return MSGQ_RET_ERR_NULL_PTR; \ + } \ +} while (0) + +#define ZXDH_CHECK_PTR_GOTO_ERR(ptr, err) \ +do \ +{ \ + if (unlikely((ptr) == NULL)) \ + { \ + LOG_ERR("null pointer\n"); \ + goto err; \ + } \ +} while (0) + +#define ZXDH_FREE_PTR(ptr) \ +do \ +{ \ + if ((ptr) != NULL) \ + { \ + kfree(ptr); \ + (ptr) = NULL; \ + } \ +} while (0) + +#define SEQUENCE_NUM_ADD(id) \ +do \ +{ \ + (id)++; \ + (id) %= MSGQ_MAX_MSG_BUFF_NUM; \ +} while (0) + +int32_t zxdh_msgq_init(struct zxdh_en_device *en_dev); +void zxdh_msgq_exit(struct zxdh_en_device *en_dev); +int32_t print_data(uint8_t *data, uint32_t len); +int32_t zxdh_msgq_send_cmd(struct msgq_dev *msgq_dev, struct msgq_pkt_info *pkt_info, struct reps_info *reps); +int zxdh_msgq_poll(struct napi_struct *napi, int budget); + +#ifdef __cplusplus +} +#endif + +#endif /* __ZXDH_PRIV_QUEUE_H__ */ diff --git a/src/net/drivers/net/ethernet/dinghai/en_aux/queue.c b/src/net/drivers/net/ethernet/dinghai/en_aux/queue.c new file mode 100644 index 0000000..1493e6d --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_aux/queue.c @@ -0,0 +1,2913 @@ +#include +#include +#include +#include +#include +#include +#include +#include "../en_aux.h" +#include "queue.h" +#ifdef TIME_STAMP_1588 +#include "en_1588_pkt_proc.h" +#endif +#ifdef ZXDH_MSGQ +#include "priv_queue.h" +#endif + +static uint32_t features_table[] = +{ + ZXDH_NET_F_MRG_RXBUF, ZXDH_NET_F_STATUS, ZXDH_NET_F_CTRL_VQ, ZXDH_NET_F_MQ, \ + ZXDH_RING_F_INDIRECT_DESC, ZXDH_RING_F_EVENT_IDX, ZXDH_F_VERSION_1, ZXDH_F_RING_PACKED +}; + +void zxdh_print_vring_info(struct virtqueue *vq, uint32_t desc_index, uint32_t desc_num) +{ + struct vring_virtqueue *vvq = to_vvq(vq); + struct vring_packed_desc *desc = NULL; + uint32_t i = 0; + + LOG_INFO("phy_index : %d\n", vq->phy_index); + LOG_INFO("num free : %d\n", vq->num_free); + LOG_INFO("vring address : 0x%llx\n", (uint64_t)&vvq->packed.vring); + LOG_INFO("vring size : %d\n", vvq->packed.vring.num); + LOG_INFO("last_used_idx : %d\n", vvq->last_used_idx); + LOG_INFO("avail_wrap_counter: %d\n", vvq->packed.avail_wrap_counter); + LOG_INFO("used_wrap_counter : %d\n", vvq->packed.used_wrap_counter); + LOG_INFO("next_avail_idx : %d\n", vvq->packed.next_avail_idx); + LOG_INFO("free head : %d\n", vvq->free_head); + LOG_INFO("driver->flags : 0x%x\n", vvq->packed.vring.driver->flags); + LOG_INFO("driver->off_wrap : %d\n", vvq->packed.vring.driver->off_wrap); + LOG_INFO("device->flags : 0x%x\n", vvq->packed.vring.device->flags); + LOG_INFO("device->off_wrap : %d\n", vvq->packed.vring.device->off_wrap); + LOG_INFO("DESC[x]:\tDESC_ADDR\t[BUFFER_ADDR]\t\t[LEN]\t\t[ID]\t[FLAG]\n"); + + desc = vvq->packed.vring.desc; + for (i = desc_index; i < desc_num; i++) + { + LOG_INFO("DESC[%d] 0x%llx:\t0x%016llx\t0x%08x\t%8d\t0x%x\n", \ + i, (uint64_t)desc, desc->addr, desc->len, desc->id, desc->flags); + desc++; + } + + return; +} + +/* enable irq handlers */ +void zxdh_vp_enable_cbs(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + int32_t i = 0; + + for (i = 0; i< en_dev->channels_num; i++) + { + en_dev->ops->switch_vqs_channel(en_dev->parent, i, 1); + } +} + +/* disable irq handlers */ +void zxdh_vp_disable_cbs(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + int32_t i = 0; + + for (i = 0; i< en_dev->channels_num; i++) + { + en_dev->ops->switch_vqs_channel(en_dev->parent, i, 0); + } +} + +void zxdh_vp_reset(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + + /* 0 status means a reset. */ + en_dev->ops->set_status(en_dev->parent, 0); + + /* After writing 0 to device_status, the driver MUST wait for a read of + * device_status to return 0 before reinitializing the device. + * This will flush out the status write, and flush in device writes, + * including MSI-X interrupts, if any. + */ + LOG_INFO("vp reset: get_status start\n"); + while (en_dev->ops->get_status(en_dev->parent) != 0) + { + msleep(1); + } + LOG_INFO("vp reset: get_status stop\n"); + + return; +} + +void zxdh_add_status(struct net_device *netdev, uint32_t status) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + uint8_t dev_status = 0; + + might_sleep(); + + dev_status = en_dev->ops->get_status(en_dev->parent); + + en_dev->ops->set_status(en_dev->parent, (dev_status | status)); + + return; +} + +bool zxdh_has_status(struct net_device *netdev, uint32_t sbit) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + uint8_t dev_status = 0; + + dev_status = en_dev->ops->get_status(en_dev->parent); + + return (dev_status & sbit); +} + +void zxdh_pf_features_init(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + uint32_t i = 0; + uint64_t features = 0; + + en_dev->device_feature = en_dev->ops->get_features(en_dev->parent); + en_dev->device_feature |= BIT(34); + en_dev->driver_feature = 0; + + for (i = 0; i < ARRAY_SIZE(features_table); i++) + { + features = features_table[i]; + en_dev->driver_feature |= (1ULL << features); + } + en_dev->guest_feature = en_dev->device_feature & 0xfffffff5dfffffff; + LOG_INFO("device_feature: 0x%llx, guest_feature: 0x%llx\n", en_dev->device_feature, en_dev->guest_feature); + en_dev->ops->set_features(en_dev->parent, en_dev->guest_feature); + + return; +} + +bool zxdh_has_feature(struct net_device *netdev, uint32_t fbit) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + + return en_dev->guest_feature & BIT_ULL(fbit); +} + +int32_t vq2txq(struct virtqueue *vq) +{ + return (vq->index - 1) / 2; +} + +int32_t txq2vq(int32_t txq) +{ + return txq * 2 + 1; +} +int32_t vq2rxq(struct virtqueue *vq) +{ + return vq->index / 2; +} + +int32_t rxq2vq(int32_t rxq) +{ + return rxq * 2; +} + +inline void vqm_mb(bool weak_barriers) +{ + if (weak_barriers) + { + virt_mb(); + } + else + { + mb(); + } +} + +inline void vqm_rmb(bool weak_barriers) +{ + if (weak_barriers) + { + virt_rmb(); + } + else + { + dma_rmb(); + } +} + +inline void vqm_wmb(bool weak_barriers) +{ + if (weak_barriers) + { + virt_wmb(); + } + else + { + dma_wmb(); + } +} + +void vring_del_virtqueue(struct virtqueue *_vq) +{ + struct zxdh_en_priv *en_priv = netdev_priv(_vq->vdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct vring_virtqueue *vq = to_vvq(_vq); + + spin_lock(&en_dev->vqs_list_lock); + list_del(&_vq->list); + spin_unlock(&en_dev->vqs_list_lock); + + if (vq->we_own_ring) + { + vring_free_queue(vq->vq.vdev, + vq->packed.ring_size_in_bytes, + vq->packed.vring.desc, + vq->packed.ring_dma_addr); + + vring_free_queue(vq->vq.vdev, + vq->packed.event_size_in_bytes, + vq->packed.vring.driver, + vq->packed.driver_event_dma_addr); + + vring_free_queue(vq->vq.vdev, + vq->packed.event_size_in_bytes, + vq->packed.vring.device, + vq->packed.device_event_dma_addr); + + kfree(vq->packed.desc_state); + vq->packed.desc_state = NULL; + kfree(vq->packed.desc_extra); + vq->packed.desc_extra = NULL; + } + + kfree(vq); + vq = NULL; +} + +void del_vq(struct zxdh_pci_vq_info *info) +{ + struct virtqueue *vq = info->vq; + struct zxdh_en_priv *en_priv = netdev_priv(vq->vdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + + en_dev->ops->vq_unbind_channel(en_dev->parent, vq->phy_index); + + en_dev->ops->vp_modern_unmap_vq_notify(en_dev->parent, vq->priv); + + vring_del_virtqueue(vq); +} + +void vp_del_vq(struct virtqueue *vq) +{ + struct zxdh_en_priv *en_priv = netdev_priv(vq->vdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct zxdh_pci_vq_info *info = en_dev->vqs[vq->index]; + unsigned long flags; + + spin_lock_irqsave(&en_dev->lock, flags); + list_del(&info->node); + spin_unlock_irqrestore(&en_dev->lock, flags); + + del_vq(info); + kfree(info); + en_dev->vqs[vq->index] = NULL; +} + +void vp_detach_vqs(void *para) +{ + struct net_device *netdev = para; + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct virtqueue *vq; + struct virtqueue *n; + + list_for_each_entry_safe(vq, n, &en_dev->vqs_list, list) + { + vp_del_vq(vq); + } +} + +void vp_del_vqs(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + + vp_detach_vqs(netdev); + + kfree(en_dev->vqs); + en_dev->vqs = NULL; +} + +/** + * virtqueue_get_vring_size - return the size of the virtqueue's vring + * @_vq: the struct virtqueue containing the vring of interest. + * + * Returns the size of the vring. This is mainly used for boasting to + * userspace. Unlike other operations, this need not be serialized. + */ +uint32_t virtqueue_get_vring_size(struct virtqueue *_vq) +{ + struct vring_virtqueue *vq = to_vvq(_vq); + + return vq->packed.vring.num; +} + +dma_addr_t virtqueue_get_desc_addr(struct virtqueue *_vq) +{ + struct vring_virtqueue *vq = to_vvq(_vq); + + BUG_ON(!vq->we_own_ring); + + return vq->packed.ring_dma_addr; +} + +dma_addr_t virtqueue_get_avail_addr(struct virtqueue *_vq) +{ + struct vring_virtqueue *vq = to_vvq(_vq); + + BUG_ON(!vq->we_own_ring); + + return vq->packed.driver_event_dma_addr; +} + +dma_addr_t virtqueue_get_used_addr(struct virtqueue *_vq) +{ + struct vring_virtqueue *vq = to_vvq(_vq); + + BUG_ON(!vq->we_own_ring); + + return vq->packed.device_event_dma_addr; +} + +bool vqm_has_dma_quirk(struct net_device *netdev) +{ + /* + * Note the reverse polarity of the quirk feature (compared to most + * other features), this is for compatibility with legacy systems. + */ + return !zxdh_has_feature(netdev, ZXDH_F_ACCESS_PLATFORM); +} + +bool vring_use_dma_api(struct net_device *netdev) +{ + if (!vqm_has_dma_quirk(netdev)) + { + return true; + } + + /* Otherwise, we are left to guess. */ + /* + * In theory, it's possible to have a buggy QEMU-supposed + * emulated Q35 IOMMU and Xen enabled at the same time. On + * such a configuration, zxdh has never worked and will + * not work without an even larger kludge. Instead, enable + * the DMA API if we're a Xen guest, which at least allows + * all of the sensible Xen configurations to work correctly. + */ + if (xen_domain()) + { + return true; + } + + return false; +} + +void vring_free_queue(struct net_device *netdev, size_t size, void *queue, dma_addr_t dma_handle) +{ + if (vring_use_dma_api(netdev)) + { + dma_free_coherent(netdev->dev.parent, size, queue, dma_handle); + } + else + { + free_pages_exact(queue, PAGE_ALIGN(size)); + } +} + +void *vring_alloc_queue(struct net_device *netdev, size_t size, dma_addr_t *dma_handle, gfp_t flag) +{ + if (vring_use_dma_api(netdev)) + { + return dma_alloc_coherent(netdev->dev.parent, size, dma_handle, flag); + } + else + { + void *queue = alloc_pages_exact(PAGE_ALIGN(size), flag); + + if (queue) + { + phys_addr_t phys_addr = virt_to_phys(queue); + *dma_handle = (dma_addr_t)phys_addr; + + /* + * Sanity check: make sure we dind't truncate + * the address. The only arches I can find that + * have 64-bit phys_addr_t but 32-bit dma_addr_t + * are certain non-highmem MIPS and x86 + * configurations, but these configurations + * should never allocate physical pages above 32 + * bits, so this is fine. Just in case, throw a + * warning and abort if we end up with an + * unrepresentable address. + */ + if (WARN_ON_ONCE(*dma_handle != phys_addr)) + { + free_pages_exact(queue, PAGE_ALIGN(size)); + return NULL; + } + } + return queue; + } +} + +struct vring_desc_extra *vring_alloc_desc_extra(struct vring_virtqueue *vq, uint32_t num) +{ + struct vring_desc_extra *desc_extra = NULL; + uint32_t i = 0; + + desc_extra = kmalloc_array(num, sizeof(struct vring_desc_extra), GFP_KERNEL); + if (unlikely(desc_extra == NULL)) + { + LOG_ERR("desc_extra kmalloc_array failed\n"); + return NULL; + } + + memset(desc_extra, 0, num * sizeof(struct vring_desc_extra)); + + for (i = 0; i < num - 1; i++) + { + desc_extra[i].next = i + 1; + } + + return desc_extra; +} + +struct virtqueue *vring_create_virtqueue_packed(uint32_t index, + uint32_t num, + uint32_t vring_align, + struct net_device *netdev, + bool weak_barriers, + bool may_reduce_num, + bool context, + bool (*notify)(struct virtqueue *), + void (*callback)(struct virtqueue *), + const char *name) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct vring_virtqueue *vq = NULL; + struct vring_packed_desc *ring = NULL; + struct vring_packed_desc_event *driver = NULL; + struct vring_packed_desc_event *device = NULL; + dma_addr_t ring_dma_addr; + dma_addr_t driver_event_dma_addr; + dma_addr_t device_event_dma_addr; + size_t ring_size_in_bytes; + size_t event_size_in_bytes; + + ring_size_in_bytes = num * sizeof(struct vring_packed_desc); + + ring = vring_alloc_queue(netdev, ring_size_in_bytes, &ring_dma_addr, GFP_KERNEL|__GFP_NOWARN|__GFP_ZERO); + if (unlikely(ring == NULL)) + { + LOG_ERR("ring vring_alloc_queue failed\n"); + goto err_ring; + } + + event_size_in_bytes = sizeof(struct vring_packed_desc_event); + + driver = vring_alloc_queue(netdev, event_size_in_bytes, &driver_event_dma_addr, GFP_KERNEL|__GFP_NOWARN|__GFP_ZERO); + if (unlikely(driver == NULL)) + { + LOG_ERR("driver vring_alloc_queue failed\n"); + goto err_driver; + } + + device = vring_alloc_queue(netdev, event_size_in_bytes, &device_event_dma_addr, GFP_KERNEL|__GFP_NOWARN|__GFP_ZERO); + if (unlikely(device == NULL)) + { + LOG_ERR("device vring_alloc_queue failed\n"); + goto err_device; + } + + vq = kmalloc(sizeof(*vq), GFP_KERNEL); + if (unlikely(vq == NULL)) + { + LOG_ERR("vq kmalloc failed\n"); + goto err_vq; + } + + vq->vq.callback = callback; + vq->vq.vdev = netdev; + vq->vq.name = name; + vq->vq.num_free = num; + vq->vq.index = index; + vq->we_own_ring = true; + vq->notify = notify; + vq->weak_barriers = weak_barriers; + vq->broken = false; + vq->last_used_idx = 0; + vq->event_triggered = false; + vq->num_added = 0; + vq->packed_ring = true; + vq->use_dma_api = vring_use_dma_api(netdev); +#ifdef DEBUG + vq->in_use = false; + vq->last_add_time_valid = false; +#endif + + vq->indirect = zxdh_has_feature(netdev, ZXDH_RING_F_INDIRECT_DESC) && !context; + vq->event = zxdh_has_feature(netdev, ZXDH_RING_F_EVENT_IDX); + + if (zxdh_has_feature(netdev, ZXDH_F_ORDER_PLATFORM)) + { + vq->weak_barriers = false; + } + + vq->packed.ring_dma_addr = ring_dma_addr; + vq->packed.driver_event_dma_addr = driver_event_dma_addr; + vq->packed.device_event_dma_addr = device_event_dma_addr; + + vq->packed.ring_size_in_bytes = ring_size_in_bytes; + vq->packed.event_size_in_bytes = event_size_in_bytes; + + vq->packed.vring.num = num; + vq->packed.vring.desc = ring; + vq->packed.vring.driver = driver; + vq->packed.vring.device = device; + + vq->packed.next_avail_idx = 0; + vq->packed.avail_wrap_counter = 1; + vq->packed.used_wrap_counter = 1; + vq->packed.event_flags_shadow = 0; + vq->packed.avail_used_flags = 1 << VRING_PACKED_DESC_F_AVAIL; + + vq->packed.desc_state = kmalloc_array(num, sizeof(struct vring_desc_state_packed), GFP_KERNEL); + if (unlikely(vq->packed.desc_state == NULL)) + { + LOG_ERR("vq->packed.desc_state kmalloc_array failed\n"); + goto err_desc_state; + } + + memset(vq->packed.desc_state, 0, num * sizeof(struct vring_desc_state_packed)); + + /* Put everything in free lists. */ + vq->free_head = 0; + + vq->packed.desc_extra = vring_alloc_desc_extra(vq, num); + if (unlikely(vq->packed.desc_extra == NULL)) + { + LOG_ERR("vq->packed.desc_extra vring_alloc_desc_extra failed\n"); + goto err_desc_extra; + } + + /* No callback? Tell other side not to bother us. */ + if (!callback) + { + vq->packed.event_flags_shadow = VRING_PACKED_EVENT_FLAG_DISABLE; + vq->packed.vring.driver->flags = cpu_to_le16(vq->packed.event_flags_shadow); + } + + spin_lock(&en_dev->vqs_list_lock); + list_add_tail(&vq->vq.list, &en_dev->vqs_list); + spin_unlock(&en_dev->vqs_list_lock); + + return &vq->vq; + +err_desc_extra: + kfree(vq->packed.desc_state); + vq->packed.desc_state = NULL; +err_desc_state: + kfree(vq); + vq = NULL; +err_vq: + vring_free_queue(netdev, event_size_in_bytes, device, device_event_dma_addr); +err_device: + vring_free_queue(netdev, event_size_in_bytes, driver, driver_event_dma_addr); +err_driver: + vring_free_queue(netdev, ring_size_in_bytes, ring, ring_dma_addr); +err_ring: + return NULL; +} + +/* the notify function used when creating a virt queue */ +bool vp_notify(struct virtqueue *vq) +{ + /* we write the queue's selector into the notification register to + * signal the other end */ + iowrite16(vq->phy_index, (void __iomem *)vq->priv); + + return true; +} + +struct virtqueue *vp_setup_vq(struct net_device *netdev, unsigned index, + void (*callback)(struct virtqueue *vq), + const char *name, bool ctx, uint16_t channel_num) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct zxdh_pci_vq_info *info = kmalloc(sizeof *info, GFP_KERNEL); + struct virtqueue *vq = NULL; + struct virtqueue *n = NULL; + unsigned long flags; + uint16_t num = 0; + int32_t err = 0; + struct dh_vq_handler vq_handler; + + /* fill out our structure that represents an active queue */ + if (unlikely(info == NULL)) + { + LOG_ERR("info kmalloc failed\n"); + return ERR_PTR(-ENOMEM); + } + + /*if (index >= en_dev->ops->get_queue_num(en_dev->parent)) + { + LOG_ERR("index over queue nums\n"); + return ERR_PTR(-ENOENT); + }*/ + + /* Check if queue is either not available or already active. */ + num = en_dev->ops->get_queue_size(en_dev->parent, en_dev->phy_index[index]); + // if (!num || zxdh_get_queue_enable(en_dev, en_dev->phy_index[index])) + // { + // return ERR_PTR(-ENOENT); + // } + num = ZXDH_PF_MIN_DESC_NUM; + + if (num & (num - 1)) + { + LOG_ERR("bad queue size %u\n", num); + err = -ENOMEM; + goto out_info; + } + + /* create the vring */ + vq = vring_create_virtqueue_packed(index, num, SMP_CACHE_BYTES, en_dev->netdev, + true, true, ctx, vp_notify, callback, name); + if (vq == NULL) + { + LOG_ERR("create the vring failed\n"); + err = -ENOMEM; + goto out_info; + } + + /* activate the queue */ + en_dev->ops->activate_phy_vq(en_dev->parent, en_dev->phy_index[index], virtqueue_get_vring_size(vq), virtqueue_get_desc_addr(vq), virtqueue_get_avail_addr(vq), virtqueue_get_used_addr(vq)); + + vq->priv = (void __force *)en_dev->ops->vp_modern_map_vq_notify(en_dev->parent, en_dev->phy_index[index], NULL); + if (!vq->priv) + { + LOG_ERR("vp_modern_map_vq_notify failed\n"); + err = -ENOMEM; + goto err_map_notify; + } + + vq->phy_index = en_dev->phy_index[index]; + vq->index = index; + info->channel_num = channel_num; + + memset(&vq_handler, 0, sizeof(struct dh_vq_handler)); + vq_handler.callback = dh_eq_vqs_vring_int; + if (channel_num < (en_dev->ops->get_channels_num(en_dev->parent))) + { + err = en_dev->ops->vqs_channel_bind_handler(en_dev->parent, channel_num, &vq_handler); + if (err < 0) + { + LOG_ERR("vqs_channel_bind_handler failed: %d\n", err); + goto err_vqs_channel_bind_handler; + } + } + + if (channel_num >= (en_dev->ops->get_channels_num(en_dev->parent))) + { + channel_num = en_dev->ops->get_channels_num(en_dev->parent) - 1; + } + err = en_dev->ops->vq_bind_channel(en_dev->parent, channel_num, en_dev->phy_index[index]); + if (err < 0) + { + LOG_ERR("vq_bind_channel failed: %d\n", err); + goto err_vq_bind_channel; + } + + if (callback) + { + spin_lock_irqsave(&en_dev->lock, flags); + err = en_dev->ops->vqs_bind_eqs(en_dev->parent, channel_num, &info->node); + spin_unlock_irqrestore(&en_dev->lock, flags); + if (err < 0) + { + LOG_ERR("vqs_bind_eqs failed: %d\n", err); + goto err_vqs_bind_eqs; + } + } + else + { + INIT_LIST_HEAD(&info->node); + } + + info->vq = vq; + en_dev->vqs[index] = info; + return vq; + +err_vqs_bind_eqs: + list_for_each_entry_safe(vq, n, &en_dev->vqs_list, list) + { + en_dev->ops->vq_unbind_channel(en_dev->parent, vq->phy_index); + } +err_vq_bind_channel: + if (channel_num < (en_dev->ops->get_channels_num(en_dev->parent))) + { + en_dev->ops->vqs_channel_unbind_handler(en_dev->parent, channel_num); + } +err_vqs_channel_bind_handler: + en_dev->ops->vp_modern_unmap_vq_notify(en_dev->parent, (void __iomem __force *)vq->priv); +err_map_notify: + vring_del_virtqueue(vq); +out_info: + kfree(info); + en_dev->vqs[index] = NULL; + return ERR_PTR(err); +} + +uint32_t get_mergeable_buf_len(struct receive_queue *rq, struct ewma_pkt_len *avg_pkt_len, uint32_t room) +{ + const size_t hdr_len = sizeof(struct zxdh_net_hdr); + uint32_t len = 0; + + if (room) + { + return PAGE_SIZE - room; + } + + len = hdr_len + clamp_t(uint32_t, ewma_pkt_len_read(avg_pkt_len), rq->min_buf_len, PAGE_SIZE - hdr_len); + + return ALIGN(len, L1_CACHE_BYTES); +} + +/* + * The DMA ops on various arches are rather gnarly right now, and + * making all of the arch DMA ops work on the vring device itself + * is a mess. For now, we use the parent device for DMA ops. + */ +static inline struct device *vring_dma_dev(const struct vring_virtqueue *vq) +{ + return vq->vq.vdev->dev.parent; //todo +} + +/* Map one sg entry. */ +dma_addr_t vring_map_one_sg(const struct vring_virtqueue *vq, struct scatterlist *sg, enum dma_data_direction direction) +{ + if (!vq->use_dma_api) + { + return (dma_addr_t)sg_phys(sg); + } + + /* + * We can't use dma_map_sg, because we don't use scatterlists in + * the way it expects (we don't guarantee that the scatterlist + * will exist for the lifetime of the mapping). + */ + return dma_map_page(vring_dma_dev(vq), sg_page(sg), sg->offset, sg->length, direction); +} + +dma_addr_t vring_map_single(const struct vring_virtqueue *vq, + void *cpu_addr, size_t size, + enum dma_data_direction direction) +{ + if (!vq->use_dma_api) + { + return (dma_addr_t)virt_to_phys(cpu_addr); + } + + return dma_map_single(vring_dma_dev(vq), cpu_addr, size, direction); +} + +int32_t vring_mapping_error(const struct vring_virtqueue *vq, dma_addr_t addr) +{ + if (!vq->use_dma_api) + { + return 0; + } + + return dma_mapping_error(vring_dma_dev(vq), addr); +} + +/* + * Packed ring specific functions - *_packed(). + */ +void vring_unmap_state_packed(const struct vring_virtqueue *vq, struct vring_desc_extra *state) +{ + uint16_t flags = 0; + + if (!vq->use_dma_api) + { + return; + } + + flags = state->flags; + if (flags & VRING_DESC_F_INDIRECT) + { + dma_unmap_single(vring_dma_dev(vq), + state->addr, state->len, + (flags & VRING_DESC_F_WRITE) ? + DMA_FROM_DEVICE : DMA_TO_DEVICE); + } + else + { + dma_unmap_page(vring_dma_dev(vq), + state->addr, state->len, + (flags & VRING_DESC_F_WRITE) ? + DMA_FROM_DEVICE : DMA_TO_DEVICE); + } +} + +void vring_unmap_desc_packed(const struct vring_virtqueue *vq, struct vring_packed_desc *desc) +{ + uint16_t flags = 0; + + if (!vq->use_dma_api) + { + return; + } + + flags = le16_to_cpu(desc->flags); + + if (flags & VRING_DESC_F_INDIRECT) + { + dma_unmap_single(vring_dma_dev(vq), + le64_to_cpu(desc->addr), + le32_to_cpu(desc->len), + (flags & VRING_DESC_F_WRITE) ? + DMA_FROM_DEVICE : DMA_TO_DEVICE); + } + else + { + dma_unmap_page(vring_dma_dev(vq), + le64_to_cpu(desc->addr), + le32_to_cpu(desc->len), + (flags & VRING_DESC_F_WRITE) ? + DMA_FROM_DEVICE : DMA_TO_DEVICE); + } +} + +void *mergeable_len_to_ctx(uint32_t truesize, uint32_t headroom) +{ + return (void *)(unsigned long)((headroom << MRG_CTX_HEADER_SHIFT) | truesize); +} + +inline bool virtqueue_use_indirect(struct virtqueue *_vq, unsigned int total_sg) +{ + struct vring_virtqueue *vq = to_vvq(_vq); + + /* + * If the host supports indirect descriptor tables, and we have multiple + * buffers, then go indirect. FIXME: tune this threshold + */ + return (vq->indirect && total_sg > 1 && vq->vq.num_free); +} + +struct vring_packed_desc *alloc_indirect_packed(unsigned int total_sg, gfp_t gfp) +{ + struct vring_packed_desc *desc = NULL; + + /* + * We require lowmem mappings for the descriptors because + * otherwise virt_to_phys will give us bogus addresses in the + * virtqueue. + */ + gfp &= ~__GFP_HIGHMEM; + + desc = kmalloc_array(total_sg, sizeof(struct vring_packed_desc), gfp); + + return desc; +} + +int virtqueue_add_indirect_packed(struct vring_virtqueue *vq, + struct scatterlist *sgs[], + unsigned int total_sg, + unsigned int out_sgs, + unsigned int in_sgs, + void *data, + gfp_t gfp) +{ + struct vring_packed_desc *desc = NULL; + struct scatterlist *sg = NULL; + uint32_t i = 0; + uint32_t n = 0; + uint32_t err_idx = 0; + uint16_t head = 0; + uint16_t id = 0; + dma_addr_t addr; + + head = vq->packed.next_avail_idx; + desc = alloc_indirect_packed(total_sg, gfp); + if (desc == NULL) + { + LOG_ERR("desc alloc_indirect_packed failed\n"); + return -ENOMEM; + } + + if (unlikely(vq->vq.num_free < 1)) + { + LOG_DEBUG("can't add buf len 1 - avail = 0\n"); + kfree(desc); + END_USE(vq); + return -ENOSPC; + } + + i = 0; + id = vq->free_head; + BUG_ON(id == vq->packed.vring.num); + + for (n = 0; n < out_sgs + in_sgs; n++) + { + for (sg = sgs[n]; sg; sg = sg_next(sg)) + { + addr = vring_map_one_sg(vq, sg, n < out_sgs ? DMA_TO_DEVICE : DMA_FROM_DEVICE); + if (vring_mapping_error(vq, addr)) + { + LOG_ERR("vring_map_one_sg error\n"); + goto unmap_release; + } + + desc[i].flags = cpu_to_le16(n < out_sgs ? 0 : VRING_DESC_F_WRITE); + desc[i].addr = cpu_to_le64(addr); + desc[i].len = cpu_to_le32(sg->length); + i++; + } + } + + /* Now that the indirect table is filled in, map it. */ + addr = vring_map_single(vq, desc, total_sg * sizeof(struct vring_packed_desc), DMA_TO_DEVICE); + if (vring_mapping_error(vq, addr)) + { + LOG_ERR("vring_map_single error\n"); + goto unmap_release; + } + + vq->packed.vring.desc[head].addr = cpu_to_le64(addr); + vq->packed.vring.desc[head].len = cpu_to_le32(total_sg * sizeof(struct vring_packed_desc)); + vq->packed.vring.desc[head].id = cpu_to_le16(id); + + if (vq->use_dma_api) + { + vq->packed.desc_extra[id].addr = addr; + vq->packed.desc_extra[id].len = total_sg * sizeof(struct vring_packed_desc); + vq->packed.desc_extra[id].flags = VRING_DESC_F_INDIRECT | vq->packed.avail_used_flags; + } + + /* + * A driver MUST NOT make the first descriptor in the list + * available before all subsequent descriptors comprising + * the list are made available. + */ + vqm_wmb(vq->weak_barriers); + vq->packed.vring.desc[head].flags = cpu_to_le16(VRING_DESC_F_INDIRECT | vq->packed.avail_used_flags); + + /* We're using some buffers from the free list. */ + vq->vq.num_free -= 1; + + /* Update free pointer */ + n = head + 1; + if (n >= vq->packed.vring.num) + { + n = 0; + vq->packed.avail_wrap_counter ^= 1; + vq->packed.avail_used_flags ^= + 1 << VRING_PACKED_DESC_F_AVAIL | + 1 << VRING_PACKED_DESC_F_USED; + } + vq->packed.next_avail_idx = n; + vq->free_head = vq->packed.desc_extra[id].next; + + /* Store token and indirect buffer state. */ + vq->packed.desc_state[id].num = 1; + vq->packed.desc_state[id].data = data; + vq->packed.desc_state[id].indir_desc = desc; + vq->packed.desc_state[id].last = id; + + vq->num_added += 1; + + //LOG_DEBUG("added buffer head %i to %p\n", head, vq); + END_USE(vq); + + return 0; + +unmap_release: + err_idx = i; + + for (i = 0; i < err_idx; i++) + { + vring_unmap_desc_packed(vq, &desc[i]); + } + + kfree(desc); + + END_USE(vq); + return -ENOMEM; +} + +int32_t virtqueue_add_packed(struct virtqueue *_vq, + struct scatterlist *sgs[], + uint32_t total_sg, + uint32_t out_sgs, + uint32_t in_sgs, + void *data, + void *ctx, + gfp_t gfp) +{ + struct vring_virtqueue *vq = to_vvq(_vq); + struct vring_packed_desc *desc = NULL; + struct scatterlist *sg = NULL; + uint32_t i = 0; + uint32_t n = 0; + uint32_t c = 0; + uint32_t descs_used = 0; + uint32_t err_idx = 0; + __le16 head_flags = 0; + __le16 flags = 0; + uint16_t head = 0; + uint16_t id = 0; + uint16_t prev = 0; + uint16_t curr = 0; + uint16_t avail_used_flags = 0; + int32_t err = 0; + + START_USE(vq); + + BUG_ON(data == NULL); + BUG_ON(ctx && vq->indirect); + + if (unlikely(vq->broken)) + { + LOG_ERR("vq->broken\n"); + END_USE(vq); + return -EIO; + } + + LAST_ADD_TIME_UPDATE(vq); + + BUG_ON(total_sg == 0); + + if (virtqueue_use_indirect(_vq, total_sg)) + { + err = virtqueue_add_indirect_packed(vq, sgs, total_sg, out_sgs, in_sgs, data, gfp); + if (err != -ENOMEM) + { + END_USE(vq); + return err; + } + /* fall back on direct */ + } + + head = vq->packed.next_avail_idx; + avail_used_flags = vq->packed.avail_used_flags; + + WARN_ON_ONCE(total_sg > vq->packed.vring.num && !vq->indirect); + + desc = vq->packed.vring.desc; + i = head; + descs_used = total_sg; + + if (unlikely(vq->vq.num_free < descs_used)) + { + LOG_ERR("can't add buf len %i - avail = %i\n", descs_used, vq->vq.num_free); + END_USE(vq); + return -ENOSPC; + } + + id = vq->free_head; + BUG_ON(id == vq->packed.vring.num); + + curr = id; + c = 0; + for (n = 0; n < out_sgs + in_sgs; n++) + { + for (sg = sgs[n]; sg; sg = sg_next(sg)) + { + dma_addr_t addr = vring_map_one_sg(vq, sg, n < out_sgs ? DMA_TO_DEVICE : DMA_FROM_DEVICE); + if (vring_mapping_error(vq, addr)) + { + LOG_ERR("vring_map_one_sg error\n"); + goto unmap_release; + } + + flags = cpu_to_le16(vq->packed.avail_used_flags | + (++c == total_sg ? 0 : VRING_DESC_F_NEXT) | + (n < out_sgs ? 0 : VRING_DESC_F_WRITE)); + + desc[i].addr = cpu_to_le64(addr); + desc[i].len = cpu_to_le32(sg->length); + desc[i].id = cpu_to_le16(id); + + if (i == head) + { + head_flags = flags; + } + else + { + desc[i].flags = flags; + } + + if (unlikely(vq->use_dma_api)) + { + vq->packed.desc_extra[curr].addr = addr; + vq->packed.desc_extra[curr].len = sg->length; + vq->packed.desc_extra[curr].flags = le16_to_cpu(flags); + } + prev = curr; + curr = vq->packed.desc_extra[curr].next; + + if ((unlikely(++i >= vq->packed.vring.num))) + { + i = 0; + vq->packed.avail_used_flags ^= + 1 << VRING_PACKED_DESC_F_AVAIL | + 1 << VRING_PACKED_DESC_F_USED; + } + } + } + + if (i < head) + { + vq->packed.avail_wrap_counter ^= 1; + } + + /* We're using some buffers from the free list. */ + vq->vq.num_free -= descs_used; + + /* Update free pointer */ + vq->packed.next_avail_idx = i; + vq->free_head = curr; + + /* Store token. */ + vq->packed.desc_state[id].num = descs_used; + vq->packed.desc_state[id].data = data; + vq->packed.desc_state[id].indir_desc = ctx; + vq->packed.desc_state[id].last = prev; + + /* + * A driver MUST NOT make the first descriptor in the list + * available before all subsequent descriptors comprising + * the list are made available. + */ + vqm_wmb(vq->weak_barriers); + vq->packed.vring.desc[head].flags = head_flags; + vq->num_added += descs_used; + + //LOG_INFO("added buffer head %i to %p\n", head, vq); + END_USE(vq); + + return 0; + +unmap_release: + err_idx = i; + i = head; + curr = vq->free_head; + + vq->packed.avail_used_flags = avail_used_flags; + + for (n = 0; n < total_sg; n++) + { + if (i == err_idx) + { + break; + } + + vring_unmap_state_packed(vq, &vq->packed.desc_extra[curr]); + curr = vq->packed.desc_extra[curr].next; + i++; + if (i >= vq->packed.vring.num) + { + i = 0; + } + } + + END_USE(vq); + return -EIO; +} + +/** + * virtqueue_add_inbuf_ctx - expose input buffers to other end + * @vq: the struct virtqueue we're talking about. + * @sg: scatterlist (must be well-formed and terminated!) + * @num: the number of entries in @sg writable by other side + * @data: the token identifying the buffer. + * @ctx: extra context for the token + * @gfp: how to do memory allocations (if necessary). + * + * Caller must ensure we don't call this with other virtqueue operations + * at the same time (except where noted). + * + * Returns zero or a negative error (ie. ENOSPC, ENOMEM, EIO). + */ +int32_t virtqueue_add_inbuf_ctx(struct virtqueue *vq, + struct scatterlist *sg, uint32_t num, + void *data, + void *ctx, + gfp_t gfp) +{ + return virtqueue_add_packed(vq, &sg, num, 0, 1, data, ctx, gfp); +} + +bool is_used_desc_packed(struct vring_virtqueue *vq, uint16_t idx, bool used_wrap_counter) +{ + bool avail = false; + bool used = false; + uint16_t flags = 0; + + flags = le16_to_cpu(vq->packed.vring.desc[idx].flags); + avail = !!(flags & (1 << VRING_PACKED_DESC_F_AVAIL)); + used = !!(flags & (1 << VRING_PACKED_DESC_F_USED)); + + return avail == used && used == used_wrap_counter; +} + +bool virtqueue_poll_packed(struct virtqueue *_vq, uint16_t off_wrap) +{ + struct vring_virtqueue *vq = to_vvq(_vq); + bool wrap_counter = false; + uint16_t used_idx = 0; + + wrap_counter = off_wrap >> VRING_PACKED_EVENT_F_WRAP_CTR; + used_idx = off_wrap & ~(1 << VRING_PACKED_EVENT_F_WRAP_CTR); + + return is_used_desc_packed(vq, used_idx, wrap_counter); +} + +/** + * virtqueue_poll - query pending used buffers + * @_vq: the struct virtqueue we're talking about. + * @last_used_idx: virtqueue state (from call to virtqueue_enable_cb_prepare). + * + * Returns "true" if there are pending used buffers in the queue. + * + * This does not need to be serialized. + */ +bool virtqueue_poll(struct virtqueue *_vq, unsigned last_used_idx) +{ + struct vring_virtqueue *vq = to_vvq(_vq); + + if (unlikely(vq->broken)) + { + LOG_ERR("vq->broken\n"); + return false; + } + + vqm_mb(vq->weak_barriers); + return virtqueue_poll_packed(_vq, last_used_idx); +} + +unsigned virtqueue_enable_cb_prepare_packed(struct virtqueue *_vq) +{ + struct vring_virtqueue *vq = to_vvq(_vq); + + START_USE(vq); + + /* + * We optimistically turn back on interrupts, then check if there was + * more to do. + */ + if (vq->event) + { + vq->packed.vring.driver->off_wrap = + cpu_to_le16(vq->last_used_idx | (vq->packed.used_wrap_counter << VRING_PACKED_EVENT_F_WRAP_CTR)); + /* + * We need to update event offset and event wrap + * counter first before updating event flags. + */ + vqm_wmb(vq->weak_barriers); + } + + if (vq->packed.event_flags_shadow == VRING_PACKED_EVENT_FLAG_DISABLE) + { + vq->packed.event_flags_shadow = vq->event ? + VRING_PACKED_EVENT_FLAG_DESC : + VRING_PACKED_EVENT_FLAG_ENABLE; + vq->packed.vring.driver->flags = cpu_to_le16(vq->packed.event_flags_shadow); + } + + END_USE(vq); + return vq->last_used_idx | ((uint16_t)vq->packed.used_wrap_counter << VRING_PACKED_EVENT_F_WRAP_CTR); +} + +int32_t virtqueue_enable_cb_prepare(struct virtqueue *_vq) +{ + struct vring_virtqueue *vq = to_vvq(_vq); + + if (vq->event_triggered) + { + vq->event_triggered = false; + } + + return virtqueue_enable_cb_prepare_packed(_vq); +} + +bool more_used_packed(struct vring_virtqueue *vq) +{ + return is_used_desc_packed(vq, vq->last_used_idx, vq->packed.used_wrap_counter); +} + +void detach_buf_packed(struct vring_virtqueue *vq, uint32_t id, void **ctx) +{ + struct vring_desc_state_packed *state = NULL; + struct vring_packed_desc *desc = NULL; + uint32_t i = 0; + uint32_t curr = 0; + + state = &vq->packed.desc_state[id]; + + /* Clear data ptr. */ + state->data = NULL; + + vq->packed.desc_extra[state->last].next = vq->free_head; + vq->free_head = id; + vq->vq.num_free += state->num; + + if (unlikely(vq->use_dma_api)) + { + curr = id; + for (i = 0; i < state->num; i++) + { + vring_unmap_state_packed(vq, &vq->packed.desc_extra[curr]); + curr = vq->packed.desc_extra[curr].next; + } + } + + if (vq->indirect) + { + uint32_t len; + + /* Free the indirect table, if any, now that it's unmapped. */ + desc = state->indir_desc; + if (!desc) + { + return; + } + + if (vq->use_dma_api) + { + len = vq->packed.desc_extra[id].len; + for (i = 0; i < len / sizeof(struct vring_packed_desc); i++) + { + vring_unmap_desc_packed(vq, &desc[i]); + } + } + kfree(desc); + state->indir_desc = NULL; + } + else if (ctx) + { + *ctx = state->indir_desc; + } +} + +void *virtqueue_get_buf_ctx_packed(struct virtqueue *_vq, uint32_t *len, void **ctx) +{ + struct vring_virtqueue *vq = to_vvq(_vq); + uint16_t last_used = 0; + uint16_t id = 0; + void *ret = NULL; + + START_USE(vq); + + if (unlikely(vq->broken)) + { + END_USE(vq); + return NULL; + } + + if (!more_used_packed(vq)) + { + //LOG_ERR("no more buffers in queue\n"); + END_USE(vq); + return NULL; + } + + /* Only get used elements after they have been exposed by host. */ + vqm_rmb(vq->weak_barriers); + + last_used = vq->last_used_idx; + id = le16_to_cpu(vq->packed.vring.desc[last_used].id); + *len = le32_to_cpu(vq->packed.vring.desc[last_used].len); + + if (unlikely(id >= vq->packed.vring.num)) + { + zxdh_print_vring_info(_vq, 0, vq->packed.vring.num); + BAD_RING(vq, "id %u out of range\n", id); + return NULL; + } + if (unlikely(!vq->packed.desc_state[id].data)) + { + zxdh_print_vring_info(_vq, 0, vq->packed.vring.num); + BAD_RING(vq, "id %u is not a head!\n", id); + return NULL; + } + + /* detach_buf_packed clears data, so grab it now. */ + ret = vq->packed.desc_state[id].data; + detach_buf_packed(vq, id, ctx); + + vq->last_used_idx += vq->packed.desc_state[id].num; + if (unlikely(vq->last_used_idx >= vq->packed.vring.num)) + { + vq->last_used_idx -= vq->packed.vring.num; + vq->packed.used_wrap_counter ^= 1; + } + + /* + * If we expect an interrupt for the next entry, tell host + * by writing event index and flush out the write before + * the read in the next get_buf call. + */ + if (vq->packed.event_flags_shadow == VRING_PACKED_EVENT_FLAG_DESC) + vqm_store_mb(vq->weak_barriers, + &vq->packed.vring.driver->off_wrap, + cpu_to_le16(vq->last_used_idx | + (vq->packed.used_wrap_counter << + VRING_PACKED_EVENT_F_WRAP_CTR))); + + LAST_ADD_TIME_INVALID(vq); + + END_USE(vq); + return ret; +} + +void *virtqueue_get_buf(struct virtqueue *_vq, uint32_t *len) +{ + return virtqueue_get_buf_ctx_packed(_vq, len, NULL); +} + +/* + * private is used to chain pages for big packets, put the whole + * most recent used list in the beginning for reuse + */ +void give_pages(struct receive_queue *rq, struct page *page) +{ + struct page *end = NULL; + + /* Find end of list, sew whole thing into vi->rq.pages. */ + for (end = page; end->private; end = (struct page *)end->private); + end->private = (unsigned long)rq->pages; + rq->pages = page; +} + +void free_old_xmit_skbs(struct net_device *netdev, struct send_queue *sq, bool in_napi) +{ + uint32_t len = 0; + uint32_t packets = 0; + uint32_t bytes = 0; + void *ptr = NULL; + + while ((ptr = virtqueue_get_buf(sq->vq, &len)) != NULL) + { + struct sk_buff *skb = ptr; + + //LOG_DEBUG("sent skb %p\n", skb); + + bytes += skb->len; + napi_consume_skb(skb, in_napi); + packets++; + } + + /* Avoid overhead when no packets have been processed + * happens when called speculatively from start_xmit. + */ + if (!packets) + { + return; + } + + u64_stats_update_begin(&sq->stats.syncp); + sq->stats.bytes += bytes; + sq->stats.packets += packets; + netdev->stats.tx_bytes += bytes; + netdev->stats.tx_packets += packets; + u64_stats_update_end(&sq->stats.syncp); +} + +void virtqueue_disable_cb_packed(struct virtqueue *_vq) +{ + struct vring_virtqueue *vq = to_vvq(_vq); + + if (vq->packed.event_flags_shadow != VRING_PACKED_EVENT_FLAG_DISABLE) + { + vq->packed.event_flags_shadow = VRING_PACKED_EVENT_FLAG_DISABLE; + vq->packed.vring.driver->flags = cpu_to_le16(vq->packed.event_flags_shadow); + } +} + +/** + * virtqueue_disable_cb - disable callbacks + * @_vq: the struct virtqueue we're talking about. + * + * Note that this is not necessarily synchronous, hence unreliable and only + * useful as an optimization. + * + * Unlike other operations, this need not be serialized. + */ +void virtqueue_disable_cb(struct virtqueue *_vq) +{ + struct vring_virtqueue *vq = to_vvq(_vq); + + /* If device triggered an event already it won't trigger one again: + * no need to disable. + */ + if (vq->event_triggered) + { + return; + } + + virtqueue_disable_cb_packed(_vq); +} + +void virtqueue_napi_schedule(struct napi_struct *napi, struct virtqueue *vq) +{ + if (napi_schedule_prep(napi)) + { + virtqueue_disable_cb(vq); + __napi_schedule(napi); + } +} + +void virtnet_napi_enable(struct virtqueue *vq, struct napi_struct *napi) +{ + napi_enable(napi); + + /* If all buffers were filled by other side before we napi_enabled, we + * won't get another interrupt, so process any outstanding packets now. + * Call local_bh_enable after to trigger softIRQ processing. + */ + local_bh_disable(); + virtqueue_napi_schedule(napi, vq); + local_bh_enable(); +} + +void virtnet_napi_tx_enable(struct net_device *netdev, struct virtqueue *vq, struct napi_struct *napi) +{ + if (!napi->weight) + { + return; + } + + virtnet_napi_enable(vq, napi); + + return; +} + +void virtnet_napi_tx_disable(struct napi_struct *napi) +{ + if (napi->weight) + { + napi_disable(napi); + } +} + +int virtnet_poll_tx(struct napi_struct *napi, int budget) +{ + struct send_queue *sq = container_of(napi, struct send_queue, napi); + struct zxdh_en_priv *en_priv = netdev_priv(sq->vq->vdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + uint32_t index = vq2txq(sq->vq); + struct netdev_queue *txq = NULL; + int32_t opaque = 0; + bool done = false; + + txq = netdev_get_tx_queue(en_dev->netdev, index); + __netif_tx_lock(txq, raw_smp_processor_id()); + virtqueue_disable_cb(sq->vq); + free_old_xmit_skbs(en_dev->netdev, sq, true); + + if (sq->vq->num_free >= 2 + MAX_SKB_FRAGS) + { + netif_tx_wake_queue(txq); + } + + opaque = virtqueue_enable_cb_prepare(sq->vq); + + done = napi_complete_done(napi, 0); + + if (!done) + { + virtqueue_disable_cb(sq->vq); + } + + __netif_tx_unlock(txq); + + if (done) + { + if (unlikely(virtqueue_poll(sq->vq, opaque))) + { + if (napi_schedule_prep(napi)) + { + __netif_tx_lock(txq, raw_smp_processor_id()); + virtqueue_disable_cb(sq->vq); + __netif_tx_unlock(txq); + __napi_schedule(napi); + } + } + } + + return 0; +} + +bool virtqueue_enable_cb_delayed_packed(struct virtqueue *_vq) +{ + struct vring_virtqueue *vq = to_vvq(_vq); + uint16_t used_idx = 0; + uint16_t wrap_counter = 0; + uint16_t bufs = 0; + + START_USE(vq); + + /* + * We optimistically turn back on interrupts, then check if there was + * more to do. + */ + + if (vq->event) + { + /* TODO: tune this threshold */ + bufs = (vq->packed.vring.num - vq->vq.num_free) * 3 / 4; + wrap_counter = vq->packed.used_wrap_counter; + + used_idx = vq->last_used_idx + bufs; + if (used_idx >= vq->packed.vring.num) + { + used_idx -= vq->packed.vring.num; + wrap_counter ^= 1; + } + + vq->packed.vring.driver->off_wrap = cpu_to_le16(used_idx | + (wrap_counter << VRING_PACKED_EVENT_F_WRAP_CTR)); + + /* + * We need to update event offset and event wrap + * counter first before updating event flags. + */ + vqm_wmb(vq->weak_barriers); + } + + if (vq->packed.event_flags_shadow == VRING_PACKED_EVENT_FLAG_DISABLE) + { + vq->packed.event_flags_shadow = vq->event ? + VRING_PACKED_EVENT_FLAG_DESC : + VRING_PACKED_EVENT_FLAG_ENABLE; + vq->packed.vring.driver->flags = cpu_to_le16(vq->packed.event_flags_shadow); + } + + /* + * We need to update event suppression structure first + * before re-checking for more used buffers. + */ + vqm_mb(vq->weak_barriers); + + if (is_used_desc_packed(vq, vq->last_used_idx, vq->packed.used_wrap_counter)) + { + END_USE(vq); + return false; + } + + END_USE(vq); + return true; +} +uint16_t __vqm16_to_cpu(bool little_endian, __vqm16 val) +{ + if (little_endian) + { + return le16_to_cpu((__force __le16)val); + } + else + { + return be16_to_cpu((__force __be16)val); + } +} + +static inline bool zxdh_legacy_is_little_endian(void) +{ +#ifdef __LITTLE_ENDIAN + return true; +#else + return false; +#endif +} + +bool zxdh_is_little_endian(struct net_device *dev) +{ + return zxdh_has_feature(dev, ZXDH_F_VERSION_1) || zxdh_legacy_is_little_endian(); +} + +/* Memory accessors */ +uint16_t vqm16_to_cpu(struct net_device *netdev, __vqm16 val) +{ + return __vqm16_to_cpu(zxdh_is_little_endian(netdev), val); +} + +uint32_t mergeable_ctx_to_headroom(void *mrg_ctx) +{ + return (unsigned long)mrg_ctx >> MRG_CTX_HEADER_SHIFT; +} + +uint32_t mergeable_ctx_to_truesize(void *mrg_ctx) +{ + return (unsigned long)mrg_ctx & ((1 << MRG_CTX_HEADER_SHIFT) - 1); +} + +/** + * virtqueue_enable_cb_delayed - restart callbacks after disable_cb. + * @_vq: the struct virtqueue we're talking about. + * + * This re-enables callbacks but hints to the other side to delay + * interrupts until most of the available buffers have been processed; + * it returns "false" if there are many pending buffers in the queue, + * to detect a possible race between the driver checking for more work, + * and enabling callbacks. + * + * Caller must ensure we don't call this with other virtqueue + * operations at the same time (except where noted). + */ +bool virtqueue_enable_cb_delayed(struct virtqueue *_vq) +{ + struct vring_virtqueue *vq = to_vvq(_vq); + + if (vq->event_triggered) + { + vq->event_triggered = false; + } + + return virtqueue_enable_cb_delayed_packed(_vq); +} + +void virtnet_poll_cleantx(struct receive_queue *rq) +{ + struct zxdh_en_priv *en_priv = netdev_priv(rq->vq->vdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + uint32_t index = vq2rxq(rq->vq); + struct send_queue *sq = &en_dev->sq[index]; + struct netdev_queue *txq = netdev_get_tx_queue(en_dev->netdev, index); + + if (!sq->napi.weight) + { + return; + } + + if (__netif_tx_trylock(txq)) + { + do + { + virtqueue_disable_cb(sq->vq); + free_old_xmit_skbs(en_dev->netdev, sq, true); + } while (unlikely(!virtqueue_enable_cb_delayed(sq->vq))); + + if (sq->vq->num_free >= 2 + MAX_SKB_FRAGS) + { + netif_tx_wake_queue(txq); + } + + __netif_tx_unlock(txq); + } +} + +inline struct zxdh_net_hdr *skb_vnet_hdr(struct sk_buff *skb) +{ + return (struct zxdh_net_hdr *)skb->cb; +} + +/* Called from bottom half context */ +struct sk_buff *page_to_skb(struct zxdh_en_device *en_dev, + struct receive_queue *rq, + struct page *page, uint32_t offset, + uint32_t len, uint32_t truesize, + uint32_t metasize, uint32_t headroom) +{ + struct sk_buff *skb = NULL; + struct zxdh_net_hdr *hdr = NULL; + uint32_t copy = 0; + uint32_t hdr_len = 0; + struct page *page_to_free = NULL; + int32_t tailroom = 0; + int32_t shinfo_size = 0; + char *p = NULL; + char *hdr_p = NULL; + char *buf = NULL; + uint32_t hdr_len_tmp = 0; + + p = page_address(page) + offset; + hdr_p = p; + + hdr_len = (((struct zxdh_net_hdr *)hdr_p)->pd_len) * HDR_2B_UNIT; + + /* If headroom is not 0, there is an offset between the beginning of the + * data and the allocated space, otherwise the data and the allocated + * space are aligned. + * + * Buffers with headroom use PAGE_SIZE as alloc size, see + * add_recvbuf_mergeable() + get_mergeable_buf_len() + */ + truesize = headroom ? PAGE_SIZE : truesize; + tailroom = truesize - headroom; + buf = p - headroom; + + len -= hdr_len; + offset += hdr_len; + p += hdr_len; + tailroom -= hdr_len + len; + + shinfo_size = SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); + + /* copy small packet so we can reuse these pages */ + if (!NET_IP_ALIGN && len > GOOD_COPY_LEN && tailroom >= shinfo_size) + { + skb = build_skb(buf, truesize); + if (unlikely(!skb)) + { + LOG_ERR("build_skb is null\n"); + return NULL; + } + + skb_reserve(skb, p - buf); + skb_put(skb, len); + + page = (struct page *)page->private; + if (page) + { + give_pages(rq, page); + } + goto ok; + } + + /* copy small packet so we can reuse these pages for small data */ + skb = napi_alloc_skb(&rq->napi, GOOD_COPY_LEN); + if (unlikely(!skb)) + { + LOG_ERR("napi_alloc_skb is null\n"); + return NULL; + } + + /* Copy all frame if it fits skb->head */ + if (len <= skb_tailroom(skb)) + { + copy = len; + } + else + { + copy = ETH_HLEN + metasize; + } + skb_put_data(skb, p, copy); + + len -= copy; + offset += copy; + + if (len) + { + skb_add_rx_frag(skb, 0, page, offset, len, truesize); + } + else + { + page_to_free = page; + } + +ok: + hdr = skb_vnet_hdr(skb); + hdr_len_tmp = hdr_len > 48 ? 48 : hdr_len; //todo + memcpy(hdr, hdr_p, hdr_len_tmp); + //memcpy(hdr, hdr_p, hdr_len); + + if (page_to_free) + { + put_page(page_to_free); + } + + if (metasize) + { + __skb_pull(skb, metasize); + skb_metadata_set(skb, metasize); + } + + return skb; +} +/** + * virtqueue_add_outbuf - expose output buffers to other end + * @vq: the struct virtqueue we're talking about. + * @sg: scatterlist (must be well-formed and terminated!) + * @num: the number of entries in @sg readable by other side + * @data: the token identifying the buffer. + * @gfp: how to do memory allocations (if necessary). + * + * Caller must ensure we don't call this with other virtqueue operations + * at the same time (except where noted). + * + * Returns zero or a negative error (ie. ENOSPC, ENOMEM, EIO). + */ +int32_t virtqueue_add_outbuf(struct virtqueue *vq, struct scatterlist *sg, uint32_t num, void *data, gfp_t gfp) +{ + return virtqueue_add_packed(vq, &sg, num, 1, 0, data, NULL, gfp); +} + +struct sk_buff *receive_mergeable(struct net_device *netdev, + struct zxdh_en_device *en_dev, + struct receive_queue *rq, + void *buf, + void *ctx, + uint32_t len, + struct virtnet_rq_stats *stats) +{ + struct zxdh_net_hdr *hdr = buf; + uint16_t num_buf = vqm16_to_cpu(netdev, hdr->num_buffers); + struct page *page = virt_to_head_page(buf); + int32_t offset = buf - page_address(page); + struct sk_buff *head_skb = NULL; + struct sk_buff *curr_skb = NULL; + uint32_t truesize = mergeable_ctx_to_truesize(ctx); + uint32_t headroom = mergeable_ctx_to_headroom(ctx); + uint32_t metasize = 0; + + stats->bytes += (len - (hdr->pd_len * HDR_2B_UNIT)); + netdev->stats.rx_bytes += (len - (hdr->pd_len * HDR_2B_UNIT)); + + if (unlikely(len > truesize)) + { + LOG_ERR("%s: rx error: len %u exceeds truesize %lu\n", netdev->name, len, (unsigned long)ctx); + netdev->stats.rx_length_errors++; + netdev->stats.rx_errors++; + goto err_skb; + } + + head_skb = page_to_skb(en_dev, rq, page, offset, len, truesize, metasize, headroom); + curr_skb = head_skb; + + if (unlikely(!curr_skb)) + { + LOG_ERR("page_to_skb is null\n"); + goto err_skb; + } + while (--num_buf) + { + int32_t num_skb_frags; + + buf = virtqueue_get_buf_ctx_packed(rq->vq, &len, &ctx); + if (unlikely(!buf)) + { + LOG_ERR("%s: rx error: %d buffers out of %d missing\n", netdev->name, num_buf, vqm16_to_cpu(netdev, hdr->num_buffers)); + netdev->stats.rx_length_errors++; + netdev->stats.rx_errors++; + goto err_buf; + } + + stats->bytes += len; + netdev->stats.rx_bytes += len; + page = virt_to_head_page(buf); + + truesize = mergeable_ctx_to_truesize(ctx); + if (unlikely(len > truesize)) + { + LOG_ERR("%s: rx error: len %u exceeds truesize %lu\n", netdev->name, len, (unsigned long)ctx); + netdev->stats.rx_length_errors++; + netdev->stats.rx_errors++; + goto err_skb; + } + + num_skb_frags = skb_shinfo(curr_skb)->nr_frags; + if (unlikely(num_skb_frags == MAX_SKB_FRAGS)) + { + struct sk_buff *nskb = alloc_skb(0, GFP_ATOMIC); + + if (unlikely(!nskb)) + { + LOG_ERR("alloc_skb is null\n"); + goto err_skb; + } + if (curr_skb == head_skb) + { + skb_shinfo(curr_skb)->frag_list = nskb; + } + else + { + curr_skb->next = nskb; + } + curr_skb = nskb; + head_skb->truesize += nskb->truesize; + num_skb_frags = 0; + } + + if (curr_skb != head_skb) + { + head_skb->data_len += len; + head_skb->len += len; + head_skb->truesize += truesize; + } + offset = buf - page_address(page); + + if (skb_can_coalesce(curr_skb, num_skb_frags, page, offset)) + { + put_page(page); + skb_coalesce_rx_frag(curr_skb, num_skb_frags - 1, len, truesize); + } + else + { + skb_add_rx_frag(curr_skb, num_skb_frags, page, offset, len, truesize); + } + } + + ewma_pkt_len_add(&rq->mrg_avg_pkt_len, head_skb->len); + return head_skb; + +err_skb: + put_page(page); + while (num_buf-- > 1) + { + buf = virtqueue_get_buf(rq->vq, &len); + if (unlikely(!buf)) + { + LOG_ERR("%s: rx error: %d buffers missing\n", netdev->name, num_buf); + netdev->stats.rx_length_errors++; + netdev->stats.rx_errors++; + break; + } + stats->bytes += len; + page = virt_to_head_page(buf); + put_page(page); + } +err_buf: + stats->drops++; + netdev->stats.rx_dropped++; + dev_kfree_skb(head_skb); + return NULL; +} + +static bool is_dev_configed_vlan(struct zxdh_en_device *en_dev) +{ + return (en_dev->vlan_dev.vlan_id != 0); +} + +void receive_buf(struct zxdh_en_device *en_dev, struct receive_queue *rq, + void *buf, uint32_t len, void **ctx, + struct virtnet_rq_stats *stats) +{ + bool vlan_striped, qinq_striped; + struct net_device *netdev = en_dev->netdev; + struct sk_buff *skb = NULL; + struct zxdh_net_hdr_rcv *hdr_rcv = (struct zxdh_net_hdr_rcv *)buf; + +#ifdef TIME_STAMP_1588 + int32_t ret = 0; +#endif + + if (unlikely(len < (hdr_rcv->pd_len * HDR_2B_UNIT) + ETH_HLEN)) + { + LOG_ERR("%s: short packet %i\n", netdev->name, len); + netdev->stats.rx_length_errors++; + netdev->stats.rx_errors++; + + put_page(virt_to_head_page(buf)); + return; + } + + skb = receive_mergeable(netdev, en_dev, rq, buf, ctx, len, stats); + + if (unlikely(!skb)) + { + LOG_ERR("skb receive_mergeable null\n"); + return; + } + + /* rx packet contain the strip label & open rxvlan offloading*/ + vlan_striped = hdr_rcv->pd_hdr.flags & RX_VLAN_STRIPED_MASK && !is_dev_configed_vlan(en_dev); + qinq_striped = hdr_rcv->pd_hdr.flags & RX_QINQ_STRIPED_MASK; + if ((netdev->features & NETIF_F_HW_VLAN_CTAG_RX) && (vlan_striped || qinq_striped)) + { + u16 vid = htons(hdr_rcv->pd_hdr.striped_ctci) & RX_TPID_VLAN_ID_MASK; + __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), vid); + } + + if ((netdev->features & NETIF_F_RXCSUM) && !(hdr_rcv->pi_hdr.error_code[1] & PI_HDR_L4_CHKSUM_ERROR_CODE) + && !(hdr_rcv->pi_hdr.error_code[0] & PI_HDR_L3_CHKSUM_ERROR_CODE) && !(hdr_rcv->pd_hdr.flags & OUTER_IP_CHKSUM_ERROT_CODE)) + { + skb->ip_summed = CHECKSUM_UNNECESSARY; + } + else + { + skb->ip_summed = CHECKSUM_NONE; + } + +#ifdef TIME_STAMP_1588 + ret = pkt_1588_proc_rcv(skb, hdr_rcv, en_dev->clock_no, en_dev); + if ((ret != PTP_SUCCESS) && (ret != IS_NOT_PTP_MSG)) + { + LOG_ERR("pkt_1588_proc_rcv err!!!\n"); + return; + } +#endif + + skb_record_rx_queue(skb, vq2rxq(rq->vq)); + skb->protocol = eth_type_trans(skb, netdev); + + //LOG_INFO("receiving skb proto 0x%04x len %i type %i\n", ntohs(skb->protocol), skb->len, skb->pkt_type); + + napi_gro_receive(&rq->napi, skb); + return; +} + +/** + * virtqueue_notify - second half of split virtqueue_kick call. + * @_vq: the struct virtqueue + * + * This does not need to be serialized. + * + * Returns false if host notify failed or queue is broken, otherwise true. + */ +bool virtqueue_notify(struct virtqueue *_vq) +{ + struct vring_virtqueue *vq = to_vvq(_vq); + + if (unlikely(vq->broken)) + { + LOG_ERR("vq->broken\n"); + return false; + } + + /* Prod other side to tell it about changes. */ + if (!vq->notify(_vq)) + { + LOG_ERR("vq->notify(_vq) failed\n"); + vq->broken = true; + return false; + } + + return true; +} + +int32_t add_recvbuf_mergeable(struct zxdh_en_device *en_dev, struct receive_queue *rq, gfp_t gfp) +{ + struct page_frag *alloc_frag = &rq->alloc_frag; + uint32_t headroom = 0; + uint32_t tailroom = 0; + uint32_t room = SKB_DATA_ALIGN(headroom + tailroom); + char *buf = NULL; + void *ctx = NULL; + int32_t err = 0; + uint32_t len = 0; + uint32_t hole = 0; + + /* Extra tailroom is needed to satisfy XDP's assumption. This + * means rx frags coalescing won't work, but consider we've + * disabled GSO for XDP, it won't be a big issue. + */ + len = get_mergeable_buf_len(rq, &rq->mrg_avg_pkt_len, room); + if (unlikely(!skb_page_frag_refill(len + room, alloc_frag, gfp))) + { + LOG_ERR("skb_page_frag_refill failed\n"); + return -ENOMEM; + } + + buf = (char *)page_address(alloc_frag->page) + alloc_frag->offset; + buf += headroom; /* advance address leaving hole at front of pkt */ + get_page(alloc_frag->page); + alloc_frag->offset += len + room; + hole = alloc_frag->size - alloc_frag->offset; + if (hole < len + room) + { + /* To avoid internal fragmentation, if there is very likely not + * enough space for another buffer, add the remaining space to + * the current buffer. + */ + len += hole; + alloc_frag->offset += hole; + } + + sg_init_one(rq->sg, buf, len); + ctx = mergeable_len_to_ctx(len, headroom); + err = virtqueue_add_inbuf_ctx(rq->vq, rq->sg, 1, buf, ctx, gfp); + if (err < 0) + { + put_page(virt_to_head_page(buf)); + } + + return err; +} + +/* Assuming a given event_idx value from the other side, if + * we have just incremented index from old to new_idx, + * should we trigger an event? */ +int32_t vring_need_event(__u16 event_idx, __u16 new_idx, __u16 old) +{ + /* Note: Xen has similar logic for notification hold-off + * in include/xen/interface/io/ring.h with req_event and req_prod + * corresponding to event_idx + 1 and new_idx respectively. + * Note also that req_event and req_prod in Xen start at 1, + * event indexes in custom queue start at 0. */ + return (__u16)(new_idx - event_idx - 1) < (__u16)(new_idx - old); +} + +bool virtqueue_kick_prepare_packed(struct virtqueue *_vq) +{ + struct vring_virtqueue *vq = to_vvq(_vq); + uint16_t new = 0; + uint16_t old = 0; + uint16_t off_wrap = 0; + uint16_t flags = 0; + uint16_t wrap_counter = 0; + uint16_t event_idx = 0; + bool needs_kick = false; + union + { + struct + { + __le16 off_wrap; + __le16 flags; + }; + uint32_t u32; + } snapshot; + + START_USE(vq); + + /* + * We need to expose the new flags value before checking notification + * suppressions. + */ + vqm_mb(vq->weak_barriers); + + old = vq->packed.next_avail_idx - vq->num_added; + new = vq->packed.next_avail_idx; + vq->num_added = 0; + + snapshot.u32 = *(uint32_t *)vq->packed.vring.device; + flags = le16_to_cpu(snapshot.flags); + + LAST_ADD_TIME_CHECK(vq); + LAST_ADD_TIME_INVALID(vq); + + if (flags != VRING_PACKED_EVENT_FLAG_DESC) + { + needs_kick = (flags != VRING_PACKED_EVENT_FLAG_DISABLE); + goto out; + } + + off_wrap = le16_to_cpu(snapshot.off_wrap); + + wrap_counter = off_wrap >> VRING_PACKED_EVENT_F_WRAP_CTR; + event_idx = off_wrap & ~(1 << VRING_PACKED_EVENT_F_WRAP_CTR); + if (wrap_counter != vq->packed.avail_wrap_counter) + { + event_idx -= vq->packed.vring.num; + } + + needs_kick = vring_need_event(event_idx, new, old); +out: + END_USE(vq); + return needs_kick; +} + +/* + * Returns false if we couldn't fill entirely (OOM). + * + * Normally run in the receive path, but can also be run from ndo_open + * before we're receiving packets, or from refill_work which is + * careful to disable receiving (using napi_disable). + */ +bool try_fill_recv(struct net_device *netdev, struct receive_queue *rq, gfp_t gfp) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + int32_t err = 0; + bool oom = 0; + unsigned long flags = 0; + + do + { + err = add_recvbuf_mergeable(en_dev, rq, gfp); + oom = err == -ENOMEM; + if (err) + { + break; + } + } while (rq->vq->num_free); + + if (virtqueue_kick_prepare_packed(rq->vq) && virtqueue_notify(rq->vq)) + { + flags = u64_stats_update_begin_irqsave(&rq->stats.syncp); + rq->stats.kicks++; + u64_stats_update_end_irqrestore(&rq->stats.syncp, flags); + } + + return !oom; +} + +int32_t virtnet_receive(struct receive_queue *rq, int32_t budget) +{ + struct net_device *netdev = rq->vq->vdev; + struct zxdh_en_priv *en_priv = netdev_priv(rq->vq->vdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct virtnet_rq_stats stats = {}; + uint32_t len = 0; + void *buf = NULL; + int32_t i = 0; + void *ctx = NULL; + + while (stats.packets < budget && (buf = virtqueue_get_buf_ctx_packed(rq->vq, &len, &ctx))) + { + receive_buf(en_dev, rq, buf, len, ctx, &stats); + stats.packets++; + netdev->stats.rx_packets++; + } + + if (rq->vq->num_free > min((uint32_t)budget, virtqueue_get_vring_size(rq->vq)) / 2) + { + if (!try_fill_recv(rq->vq->vdev, rq, GFP_ATOMIC)) + { + schedule_delayed_work(&en_dev->refill, 0); + } + } + + u64_stats_update_begin(&rq->stats.syncp); + for (i = 0; i < VIRTNET_RQ_STATS_LEN; i++) + { + size_t offset = virtnet_rq_stats_desc[i].offset; + uint64_t *item; + + item = (uint64_t *)((uint8_t *)&rq->stats + offset); + *item += *(uint64_t *)((uint8_t *)&stats + offset); + } + u64_stats_update_end(&rq->stats.syncp); + + return stats.packets; +} + +void virtqueue_napi_complete(struct napi_struct *napi, struct virtqueue *vq, int32_t processed) +{ + int32_t opaque = 0; + + opaque = virtqueue_enable_cb_prepare(vq); + if (napi_complete_done(napi, processed)) + { + if (unlikely(virtqueue_poll(vq, opaque))) + { + virtqueue_napi_schedule(napi, vq); + } + } + else + { + virtqueue_disable_cb(vq); + } +} + +int virtnet_poll(struct napi_struct *napi, int budget) +{ + struct receive_queue *rq = container_of(napi, struct receive_queue, napi); + uint32_t received = 0; + + virtnet_poll_cleantx(rq); + + received = virtnet_receive(rq, budget); + + /* Out of packets? */ + if (received < budget) + { + virtqueue_napi_complete(napi, rq->vq, received); + } + + return received; +} + +int32_t virtnet_alloc_queues(struct zxdh_en_device *en_dev) +{ + int32_t i = 0; + + en_dev->sq = kcalloc(en_dev->max_queue_pairs, sizeof(*en_dev->sq), GFP_KERNEL); + if (unlikely(en_dev->sq == NULL)) + { + LOG_ERR("en_dev->sq kcalloc failed\n"); + goto err_sq; + } + + en_dev->rq = kcalloc(en_dev->max_queue_pairs, sizeof(*en_dev->rq), GFP_KERNEL); + if (unlikely(en_dev->rq == NULL)) + { + LOG_ERR("en_dev->rq kcalloc failed\n"); + goto err_rq; + } + + INIT_DELAYED_WORK(&en_dev->refill, refill_work); + + for (i = 0; i < en_dev->curr_queue_pairs; i++) + { + en_dev->rq[i].pages = NULL; + netif_napi_add(en_dev->netdev, &en_dev->rq[i].napi, virtnet_poll, NAPI_POLL_WEIGHT); + netif_tx_napi_add(en_dev->netdev, &en_dev->sq[i].napi, virtnet_poll_tx, NAPI_POLL_WEIGHT); + + sg_init_table(en_dev->rq[i].sg, ARRAY_SIZE(en_dev->rq[i].sg)); + ewma_pkt_len_init(&en_dev->rq[i].mrg_avg_pkt_len); + sg_init_table(en_dev->sq[i].sg, ARRAY_SIZE(en_dev->sq[i].sg)); + + u64_stats_init(&en_dev->rq[i].stats.syncp); + u64_stats_init(&en_dev->sq[i].stats.syncp); + } + + return 0; + +err_rq: + kfree(en_dev->sq); + en_dev->sq = NULL; +err_sq: + return -ENOMEM; +} + +/** + * virtqueue_set_affinity - setting affinity for a virtqueue + * @vq: the virtqueue + * @cpu_mask: the cpu no. + * + * Pay attention the function are best-effort: the affinity hint may not be set + * due to config support, irq type and sharing. + * + */ +int32_t virtqueue_set_affinity(struct virtqueue *vq, const struct cpumask *cpu_mask) +{ + if (!vq->callback) + { + LOG_ERR("vq->callback is null\n"); + return -EINVAL; + } + + return 0; +} + +void refill_work(struct work_struct *work) +{ + int32_t i = 0; + bool still_empty = false; + struct zxdh_en_device *en_dev = container_of(work, struct zxdh_en_device, refill.work); + + for (i = 0; i < en_dev->curr_queue_pairs; i++) + { + struct receive_queue *rq = &en_dev->rq[i]; + + napi_disable(&rq->napi); + still_empty = !try_fill_recv(en_dev->netdev, rq, GFP_KERNEL); + virtnet_napi_enable(rq->vq, &rq->napi); + + /* In theory, this can happen: if we don't get any buffers in + * we will *never* try to fill again. + */ + if (still_empty) + { + schedule_delayed_work(&en_dev->refill, HZ/2); + } + } +} + +int32_t dh_eq_vqs_vring_int(struct notifier_block *nb, unsigned long action, void *data) +{ + struct dh_eq_vq *eq_vq = container_of(nb, struct dh_eq_vq, irq_nb); + struct dh_eq_vqs *eq_vqs = container_of(eq_vq, struct dh_eq_vqs, vq_s); + struct list_head *item = NULL; + struct zxdh_pci_vq_info *info = NULL; + struct vring_virtqueue *vq = NULL; + + list_for_each(item, &eq_vqs->vqs) + { + info = list_entry(item, struct zxdh_pci_vq_info, node); + + vq = to_vvq(info->vq); + if (!more_used_packed(vq)) + { + continue; + } + + if (unlikely(vq->broken)) + { + LOG_ERR("vq:%d is broken\n", info->vq->phy_index); + continue; + } + + /* Just a hint for performance: so it's ok that this can be racy! */ + if (vq->event) + { + vq->event_triggered = true; + } + + if (vq->vq.callback) + { + vq->vq.callback(&vq->vq); + } + } + + return 0; +} + +static DEFINE_SPINLOCK(vp_find_lock); + +int32_t vp_find_vqs_msix(struct net_device *netdev, unsigned nvqs, + struct virtqueue *vqs[], vq_callback_t *callbacks[], + const char * const names[], const bool *ctx) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + int32_t err = 0; + uint16_t qidx = 0; + int32_t phy_index = -1; + + en_dev->vqs = kcalloc(nvqs, sizeof(*en_dev->vqs), GFP_KERNEL); + if (unlikely(en_dev->vqs == NULL)) + { + LOG_ERR("en_dev->vqs kcalloc failed\n"); + return -ENOMEM; + } + + spin_lock(&vp_find_lock); + for (qidx = 0; qidx < nvqs; ++qidx) + { + phy_index = en_dev->ops->get_phy_vq(en_dev->parent, qidx); + if(phy_index < 0) + { + LOG_ERR("get_phy_vq failed: %d\n", phy_index); + err = phy_index; + goto err; + } + en_dev->phy_index[qidx] = phy_index; + + vqs[qidx] = vp_setup_vq(netdev, qidx, callbacks[qidx], names[qidx], ctx ? ctx[qidx] : false, qidx); + if (IS_ERR_OR_NULL(vqs[qidx])) + { + err = PTR_ERR(vqs[qidx]); + LOG_ERR("vp_setup_vq failed: %d\n", err); + goto err; + } + + en_dev->ops->set_queue_enable(en_dev->parent, phy_index, true); + } + spin_unlock(&vp_find_lock); + return 0; + +err: + en_dev->ops->release_phy_vq(en_dev->parent, en_dev->phy_index, qidx+1); + spin_unlock(&vp_find_lock); + vp_del_vqs(netdev); + return err; +} + +/* How large should a single buffer be so a queue full of these can fit at + * least one full packet? + * Logic below assumes the mergeable buffer header is used. + */ +uint32_t mergeable_min_buf_len(struct zxdh_en_device *en_dev, struct virtqueue *vq) +{ + const uint32_t hdr_len = sizeof(struct zxdh_net_hdr); + uint32_t rq_size = virtqueue_get_vring_size(vq); + uint32_t packet_len = en_dev->netdev->max_mtu; + uint32_t buf_len = hdr_len + ETH_HLEN + VLAN_HLEN + packet_len; + uint32_t min_buf_len = DIV_ROUND_UP(buf_len, rq_size); + + return max(max(min_buf_len, hdr_len) - hdr_len, (uint32_t)GOOD_PACKET_LEN); +} + +void zxdh_en_recv_pkts(struct virtqueue *rvq) +{ + struct zxdh_en_priv *en_priv = netdev_priv(rvq->vdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct receive_queue *rq = &en_dev->rq[vq2rxq(rvq)]; + + virtqueue_napi_schedule(&rq->napi, rvq); +} + +void zxdh_en_xmit_pkts(struct virtqueue *tvq) +{ + struct zxdh_en_priv *en_priv = netdev_priv(tvq->vdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct napi_struct *napi = &en_dev->sq[vq2txq(tvq)].napi; + + /* Suppress further interrupts. */ + virtqueue_disable_cb(tvq); + + if (napi->weight) + { + virtqueue_napi_schedule(napi, tvq); + } + else + { + /* We were probably waiting for more output buffers. */ + netif_wake_subqueue(en_dev->netdev, vq2txq(tvq)); + en_dev->hw_stats.q_stats[vq2txq(tvq)].q_tx_wake++; + } +} + +int32_t virtnet_find_vqs(struct zxdh_en_device *en_dev) +{ + vq_callback_t **callbacks = NULL; + struct virtqueue **vqs = NULL; + int32_t ret = -ENOMEM; + int32_t i = 0; + int32_t total_vqs = 0; + const char **names = NULL; + bool *ctx = NULL; + + total_vqs = en_dev->max_queue_pairs * 2; + + /* Allocate space for find_vqs parameters */ + vqs = kcalloc(total_vqs, sizeof(*vqs), GFP_KERNEL); + if (unlikely(vqs == NULL)) + { + LOG_ERR("vqs kcalloc failed\n"); + goto err_vq; + } + + callbacks = kmalloc_array(total_vqs, sizeof(*callbacks), GFP_KERNEL); + if (unlikely(callbacks == NULL)) + { + LOG_ERR("callbacks kmalloc_array failed\n"); + goto err_callback; + } + + names = kmalloc_array(total_vqs, sizeof(*names), GFP_KERNEL); + if (unlikely(names == NULL)) + { + LOG_ERR("names kmalloc_array failed\n"); + goto err_names; + } + + ctx = kcalloc(total_vqs, sizeof(*ctx), GFP_KERNEL); + if (unlikely(ctx == NULL)) + { + LOG_ERR("ctx kmalloc failed\n"); + goto err_ctx; + } + + /* Allocate/initialize parameters for services send/receive virtqueues */ + for (i = 0; i < en_dev->max_queue_pairs; i++) + { + callbacks[rxq2vq(i)] = zxdh_en_recv_pkts; + callbacks[txq2vq(i)] = zxdh_en_xmit_pkts; + sprintf(en_dev->rq[i].name, "input.%d", i); + sprintf(en_dev->sq[i].name, "output.%d", i); + names[rxq2vq(i)] = en_dev->rq[i].name; + names[txq2vq(i)] = en_dev->sq[i].name; + if (ctx) + { + ctx[rxq2vq(i)] = true; + } + } + + ret = vp_find_vqs_msix(en_dev->netdev, total_vqs, vqs, callbacks, names, ctx); + if (ret) + { + LOG_ERR("vp_find_vqs_msix failed: %d\n", ret); + goto err_find; + } + + for (i = 0; i < en_dev->max_queue_pairs; i++) + { + en_dev->rq[i].vq = vqs[rxq2vq(i)]; + en_dev->rq[i].min_buf_len = mergeable_min_buf_len(en_dev, en_dev->rq[i].vq); + en_dev->sq[i].vq = vqs[txq2vq(i)]; + } + +err_find: + kfree(ctx); + ctx = NULL; +err_ctx: + kfree(names); + names = NULL; +err_names: + kfree(callbacks); + callbacks = NULL; +err_callback: + kfree(vqs); + vqs = NULL; +err_vq: + return ret; +} + +void virtnet_free_queues(struct zxdh_en_device *en_dev) +{ + int32_t i = 0; + + for (i = 0; i < en_dev->max_queue_pairs; i++) + { + netif_napi_del(&en_dev->rq[i].napi); + netif_napi_del(&en_dev->sq[i].napi); + } + + /* We called __netif_napi_del(), + * we need to respect an RCU grace period before freeing zxdev->rq + */ + synchronize_net(); + + kfree(en_dev->rq); + kfree(en_dev->sq); +} + +void *virtqueue_detach_unused_buf_packed(struct virtqueue *_vq) +{ + struct vring_virtqueue *vq = to_vvq(_vq); + uint32_t i = 0; + void *buf = NULL; + + START_USE(vq); + + for (i = 0; i < vq->packed.vring.num; i++) + { + if (!vq->packed.desc_state[i].data) + { + continue; + } + + /* detach_buf clears data, so grab it now. */ + buf = vq->packed.desc_state[i].data; + detach_buf_packed(vq, i, NULL); + END_USE(vq); + return buf; + } + + /* That should have freed everything. */ + BUG_ON(vq->vq.num_free != vq->packed.vring.num); + + END_USE(vq); + return NULL; +} + +void zxdh_free_unused_bufs(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct virtqueue *vq = NULL; + void *buf = NULL; + int32_t i = 0; + + for (i = 0; i < en_dev->max_queue_pairs; i++) + { + vq = en_dev->sq[i].vq; + while ((buf = virtqueue_detach_unused_buf_packed(vq)) != NULL) + { +#ifdef ZXDH_MSGQ + if (i == (en_dev->max_queue_pairs - 1)) + { + NEED_MSGQ(en_dev) + { + ZXDH_FREE_PTR(buf); + continue; + } + } +#endif + dev_kfree_skb(buf); + } + } + + for (i = 0; i < en_dev->max_queue_pairs; i++) + { + vq = en_dev->rq[i].vq; + while ((buf = virtqueue_detach_unused_buf_packed(vq)) != NULL) + { + put_page(virt_to_head_page(buf)); + } + } +} + +struct page *get_a_page(struct receive_queue *rq, gfp_t gfp_mask) +{ + struct page *p = rq->pages; + + if (p) + { + rq->pages = (struct page *)p->private; + /* clear private here, it is used to chain pages */ + p->private = 0; + } + else + { + p = alloc_page(gfp_mask); + } + return p; +} + +void _free_receive_bufs(struct zxdh_en_device *en_dev) +{ + int32_t i = 0; + + for (i = 0; i < en_dev->max_queue_pairs; i++) + { + while (en_dev->rq[i].pages) + { + __free_pages(get_a_page(&en_dev->rq[i], GFP_KERNEL), 0); + } + } +} + +void zxdh_free_receive_bufs(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + + rtnl_lock(); + _free_receive_bufs(en_dev); + rtnl_unlock(); +} + +void zxdh_free_receive_page_frags(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + int32_t i = 0; + + for (i = 0; i < en_dev->max_queue_pairs; i++) + { + if (en_dev->rq[i].alloc_frag.page) + { + put_page(en_dev->rq[i].alloc_frag.page); + } + } +} + +void zxdh_virtnet_del_vqs(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + + vp_del_vqs(netdev); + en_dev->ops->vqs_unbind_eqs(en_dev->parent, (en_dev->max_queue_pairs * 2 - 1)); + en_dev->ops->vqs_channel_unbind_handler(en_dev->parent, (en_dev->max_queue_pairs * 2 - 1)); + virtnet_free_queues(en_dev); +} + +void zxdh_vqs_uninit(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + + zxdh_vp_reset(netdev); + + cancel_delayed_work_sync(&en_dev->refill); + zxdh_free_unused_bufs(netdev); + zxdh_free_receive_bufs(netdev); + zxdh_free_receive_page_frags(netdev); + zxdh_virtnet_del_vqs(netdev); + en_dev->ops->release_phy_vq(en_dev->parent, en_dev->phy_index, en_dev->max_queue_pairs*2); +} + +int32_t zxdh_vqs_init(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + int32_t ret = 0; + + en_dev->hdr_len = sizeof(struct zxdh_net_hdr); + en_dev->any_header_sg = zxdh_has_feature(netdev, ZXDH_F_ANY_LAYOUT); + en_dev->netdev->needed_headroom = en_dev->hdr_len; + en_dev->max_queue_pairs = max_pairs; + memset(en_dev->phy_index, 0xFF, sizeof(en_dev->phy_index)); + + if (en_dev->ops->is_bond(en_dev->parent)) + { + en_dev->max_queue_pairs = ZXDH_BOND_ETH_MQ_PAIRS_NUM; + } + en_dev->curr_queue_pairs = en_dev->max_queue_pairs; + +#ifdef ZXDH_MSGQ + IS_MSGQ_DEV(en_dev) + { + en_dev->need_msgq = true; + en_dev->max_queue_pairs += ZXDH_PQ_PAIRS_NUM; + LOG_INFO("max_queue_pairs: %d\n", en_dev->max_queue_pairs); + } +#endif + + INIT_LIST_HEAD(&en_dev->vqs_list); + spin_lock_init(&en_dev->vqs_list_lock); + + INIT_LIST_HEAD(&en_dev->virtqueues); + spin_lock_init(&en_dev->lock); + + /* Allocate services send & receive queues */ + ret = virtnet_alloc_queues(en_dev); + if (ret) + { + LOG_ERR("virtnet_alloc_queues failed: %d\n", ret); + return ret; + } + + ret = virtnet_find_vqs(en_dev); + if (ret) + { + LOG_ERR("virtnet_find_vqs failed: %d\n", ret); + goto err_find_vqs; + } + + rtnl_lock(); + netif_set_real_num_tx_queues(en_dev->netdev, en_dev->curr_queue_pairs); + rtnl_unlock(); + rtnl_lock(); + netif_set_real_num_rx_queues(en_dev->netdev, en_dev->curr_queue_pairs); + rtnl_unlock(); + + return 0; + +err_find_vqs: + virtnet_free_queues(en_dev); + return ret; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_aux/queue.h b/src/net/drivers/net/ethernet/dinghai/en_aux/queue.h new file mode 100644 index 0000000..0c370d7 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_aux/queue.h @@ -0,0 +1,830 @@ +#ifndef __ZXDH_QUEUE_H__ +#define __ZXDH_QUEUE_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/*======================================================== + * 是否走1588处理流程(1588pd头宏开关): + * 在提交代码时候这里注释掉,在使用1588功能时需要打开。 + *=========================================================*/ +// #define TIME_STAMP_1588 + +/*======================================================== + * 是否打开依赖PTP驱动的接口调用代码: + * 在提交代码时候这里注释掉,在实际调试时需要打开。 + *=========================================================*/ +#define PTP_DRIVER_INTERFACE_EN + +/**======================================================== + * 是否打开依赖os时间戳补丁接口的代码: + * 在提交代码时候这里注释掉,在实际调试时需要打开。 + *=========================================================*/ +/* #define CGEL_TSTAMP_2_PATCH_EN TODO 补丁不可用*/ + +/* 判断两个值是否相等,相等表示出错,打印信息后返回指定值 */ +#define CHECK_EQUAL_ERR(a, b, c, fmt, arg...) \ +do { \ + if (unlikely(a == b)) \ + { \ + LOG_ERR(fmt, ##arg); \ + return c; \ + } \ +} while(0) + +/* 判断两个值是否不等,不等表示出错,打印信息后返回指定值 */ +#define CHECK_UNEQUAL_ERR(a, b, c, fmt, arg...) \ +do { \ + if (unlikely(a != b)) \ + { \ + LOG_ERR(fmt, ##arg); \ + return c; \ + } \ +} while(0) + +#define ZXDH_MQ_PAIRS_NUM 8 +#define ZXDH_PQ_PAIRS_NUM 1 +#define ZXDH_MAX_PAIRS_NUM 128 +#define ZXDH_BOND_ETH_MQ_PAIRS_NUM 1 +#define ZXDH_MAX_QUEUES_NUM 4096 +#define ZXDH_PF_MAX_BAR_VAL 0x5 +#define ZXDH_PF_BAR0 0 +#define ZXDH_PF_MAX_DESC_NUM (32 * 1024) +#define ZXDH_PF_MIN_DESC_NUM 1024 +#define ZXDH_INDIR_RQT_SIZE 256 +#define ZXDH_NET_HASH_KEY_SIZE 40 + +#define VQM_HOST_BAR_OFFSET 0x0 +#define PHY_VQ_REG_OFFSET 0x5000 +#define LOCK_VQ_REG_OFFSET 0x90 +#define ZXDH_PHY_REG_BITS 32 +#define ZXDH_PF_LOCK_ENABLE_MASK 0x1 +#define ZXDH_PF_RELEASE_LOCK_VAL 0 +#define ZXDH_PF_GET_PHY_INDEX_DONE 1 +#define ZXDH_PF_GET_PHY_INDEX_BIT 1 +#define ZXDH_PF_WAIT_COUNT 2048 +#define ZXDH_PF_DELAY_US 10 +#define ZXDH_PF_RQ_TYPE 0 +#define ZXDH_PF_TQ_TYPE 1 +#define ZXDH_PF_POWER_INDEX2 2 + +#define MSG_PAYLOAD_FIX_FIELD 8 +#define MSG_CHAN_PF_MODULE_ID 0 +#define MSG_PAYLOAD_TYPE_WRITE 1 +#define MSG_PAYLOAD_FIELD_MSG_CHL 2 +#define MSG_PAYLOAD_FIELD_DATA_CHL 3 +#define MSG_PAYLOAD_MSG_CHL_SLEN 4 +#define MSG_RECV_BUF_LEN 6 + +#define ZXDH_MAC_NUM 6 +#define ZXDH_MAX_MTU 14000 +#define ZXDH_DEFAULT_MTU 1500 + +/* The feature bitmap for zxdh net */ +#define ZXDH_NET_F_MRG_RXBUF 15 /* Host can merge receive buffers. */ +#define ZXDH_NET_F_STATUS 16 /* net_config.status available */ +#define ZXDH_NET_F_CTRL_VQ 17 /* Control channel available */ +#define ZXDH_NET_F_MQ 22 /* Device supports Receive Flow Steering */ +#define ZXDH_F_ANY_LAYOUT 27 /* Can the device handle any descriptor layout? */ +#define ZXDH_RING_F_INDIRECT_DESC 28 /* We support indirect buffer descriptors */ + +/* The Guest publishes the used index for which it expects an interrupt + * at the end of the avail ring. Host should ignore the avail->flags field. */ +/* The Host publishes the avail index for which it expects a kick + * at the end of the used ring. Guest should ignore the used->flags field. */ +#define ZXDH_RING_F_EVENT_IDX 29 + +#define ZXDH_F_VERSION_1 32 /* v1.0 compliant */ + +/* + * If clear - device has the platform DMA (e.g. IOMMU) bypass quirk feature. + * If set - use platform DMA tools to access the memory. + * + * Note the reverse polarity (compared to most other features), + * this is for compatibility with legacy systems. + */ +#define ZXDH_F_ACCESS_PLATFORM 33 + +/* This feature indicates support for the packed virtqueue layout. */ +#define ZXDH_F_RING_PACKED 34 + +/* + * This feature indicates that memory accesses by the driver and the + * device are ordered in a way described by the platform. + */ +#define ZXDH_F_ORDER_PLATFORM 36 + +/* This marks a buffer as continuing via the next field. */ +#define VRING_DESC_F_NEXT 1 +/* This marks a buffer as write-only (otherwise read-only). */ +#define VRING_DESC_F_WRITE 2 +/* This means the buffer contains a list of buffer descriptors. */ +#define VRING_DESC_F_INDIRECT 4 + +/* + * Mark a descriptor as available or used in packed ring. + * Notice: they are defined as shifts instead of shifted values. + */ +#define VRING_PACKED_DESC_F_AVAIL 7 +#define VRING_PACKED_DESC_F_USED 15 + +/* The Host uses this in used->flags to advise the Guest: don't kick me when + * you add a buffer. It's unreliable, so it's simply an optimization. Guest + * will still kick if it's out of buffers. */ +#define VRING_USED_F_NO_NOTIFY 1 +/* The Guest uses this in avail->flags to advise the Host: don't interrupt me + * when you consume a buffer. It's unreliable, so it's simply an + * optimization. */ +#define VRING_AVAIL_F_NO_INTERRUPT 1 + +/* Enable events in packed ring. */ +#define VRING_PACKED_EVENT_FLAG_ENABLE 0x0 +/* Disable events in packed ring. */ +#define VRING_PACKED_EVENT_FLAG_DISABLE 0x1 +/* + * Enable events for a specific descriptor in packed ring. + * (as specified by Descriptor Ring Change Event Offset/Wrap Counter). + * Only valid if ZXDH_RING_F_EVENT_IDX has been negotiated. + */ +#define VRING_PACKED_EVENT_FLAG_DESC 0x2 + +/* + * Wrap counter bit shift in event suppression structure + * of packed ring. + */ +#define VRING_PACKED_EVENT_F_WRAP_CTR 15 + +/* Alignment requirements for vring elements */ +#define VRING_AVAIL_ALIGN_SIZE 2 +#define VRING_USED_ALIGN_SIZE 4 +#define VRING_DESC_ALIGN_SIZE 16 + +#define MRG_CTX_HEADER_SHIFT 22 + + +/* FIXME: MTU in config. */ +#define GOOD_PACKET_LEN (ETH_HLEN + VLAN_HLEN + ETH_DATA_LEN) +#define GOOD_COPY_LEN 128 + + +#define TX_PORT_NP 0x00 +#define TX_PORT_DRS 0x01 +#define TX_PORT_DTP 0x02 +#define HDR_2B_UNIT 2 +#define ENABLE_PI_FLAG_32B 0x1 +#define DISABLE_PI_FIELD_PARSE 0x80 +#define IPV4_TYPE 0x0 +#define IPV6_TYPE 0x1 +#define NOT_IP_TYPE 0x2 +#define PKT_SRC_NP 0x0 +#define PKT_SRC_CPU 0x1 +#define PCODE_IP 0x1 +#define PCODE_TCP 0x2 +#define PCODE_UDP 0x3 +#define INVALID_ETH_PORT_ID 0xff +#define ETH_MTU_4B_UNIT 4 +#define IP_FRG_CSUM_FLAG 0x8000 +#define NOT_IP_FRG_CSUM_FLAG 0x6000 +#define TCP_FRG_CSUM_FLAG 0x24 +#define NOT_TCP_FRG_CSUM_FLAG 0x30 +#define HDR_2B_UNIT 2 + +#define HDR_BUFFER_LEN 100 +#define IP_BASE_HLEN 20 +#define IPV6_BASE_HLEN 40 +#define TCP_BASE_HLEN 20 + +#define OUTER_IP_CHECKSUM_OFFSET (12) +#define INNER_IP_CHECKSUM_OFFSET (15) +#define INNER_L4_CHECKSUM_OFFSET (2) +#define PI_HDR_L3_CHKSUM_ERROR_CODE (0xff) +#define PI_HDR_L4_CHKSUM_ERROR_CODE (0xff) +#define OUTER_IP_CHKSUM_ERROT_CODE (0x20) + +#define RX_VLAN_STRIPED_MASK (1 << 4) +#define RX_QINQ_STRIPED_MASK (1 << 14) +#define RX_TPID_VLAN_ID_MASK (0xfff) + +/* PD header offload flags */ +#define PANELID_EN (1 << 15) + +/* PD header sk_prio */ +#define ZXDH_DCBNL_SET_SK_PRIO(sk_prio) ((0x7 & sk_prio) << 8) + +/* + * __vqm{16,32,64} have the following meaning: + * - __u{16,32,64} for zxdh devices in legacy mode, accessed in native endian + * - __le{16,32,64} for standard-compliant zxdh devices + */ +typedef __u16 __bitwise __vqm16; +typedef __u32 __bitwise __vqm32; +typedef __u64 __bitwise __vqm64; + + +/* Constants for MSI-X */ +/* Use first vector for configuration changes, second and the rest for + * virtqueues Thus, we need at least 2 vectors for MSI. */ +enum +{ + VP_MSIX_CONFIG_VECTOR = 0, + VP_MSIX_VQ_VECTOR = 1, +}; + + +struct vring_packed_desc_event +{ + /* Descriptor Ring Change Event Offset/Wrap Counter. */ + __le16 off_wrap; + /* Descriptor Ring Change Event Flags. */ + __le16 flags; +}; + +struct vring_packed_desc +{ + /* Buffer Address. */ + __le64 addr; + /* Buffer Length. */ + __le32 len; + /* Buffer ID. */ + __le16 id; + /* The flags depending on descriptor type. */ + __le16 flags; +}; + +struct vring_desc_state_packed +{ + void *data; /* Data for callback. */ + struct vring_packed_desc *indir_desc; /* Indirect descriptor, if any. */ + uint16_t num; /* Descriptor list length. */ + uint16_t last; /* The last desc state in a list. */ +}; + +struct vring_desc_extra +{ + dma_addr_t addr; /* Buffer DMA addr. */ + uint32_t len; /* Buffer length. */ + uint16_t flags; /* Descriptor flags. */ + uint16_t next; /* The next desc state in a list. */ +}; + +union pkt_type_t +{ + uint8_t pkt_type; + struct + { + uint8_t pkt_code:5; + uint8_t pkt_src:1; + uint8_t ip_type:2; + }type_ctx; +}__attribute__((packed)); + +struct pi_net_hdr +{ + uint8_t bttl_pi_len; + union pkt_type_t pt; + uint16_t vlan_id; + uint32_t ipv6_exp_flags; + uint16_t hdr_l3_offset; + uint16_t hdr_l4_offset; + uint8_t eth_port_id; + uint8_t pkt_action_flag2; + uint16_t pkt_action_flag1; + uint8_t sa_index[8]; + uint8_t error_code[2]; + uint8_t rsv[6]; +}__attribute__((packed)); + +struct pd_net_hdr_tx +{ +#define TXCAP_STAG_INSERT_EN_BIT (1 << 14) +#define TXCAP_CTAG_INSERT_EN_BIT (1 << 13) +#define DELAY_STATISTICS_INSERT_EN_BIT (1 << 7) + uint16_t ol_flag; + uint8_t rsv; + uint8_t panel_id; + uint8_t tag_idx; + uint8_t tag_data; + uint16_t vfid; + struct { + uint16_t tpid; + uint16_t tci; + } svlan; + struct { + uint16_t tpid; + uint16_t tci; + } cvlan; +}__attribute__((packed)); + + +struct pd_net_hdr_rx +{ +#define RX_PD_HEAD_VLAN_STRIP_BIT (1 << 28) + uint32_t flags; + uint32_t rss_hash; + uint32_t fd; + uint16_t striped_stci; + uint16_t striped_ctci; + uint8_t tag_idx; + uint8_t tag_data; + uint16_t src_port; + uint16_t outer_pkt_type; + uint16_t inner_pkt_type; +}__attribute__((packed)); + +/* zxdh net header */ +struct zxdh_net_hdr +{ + uint8_t tx_port; //bit7:2 rsv; bit1:0 00:np, 01:DRS, 10:DTP + uint8_t pd_len; //bit7 rsv; bit6:0 L2报文前的描述符长度,以2B为单位 + uint8_t num_buffers; //表示接收方向num buffers字段 + uint8_t rsv; //保留 + + struct pi_net_hdr pi_hdr; + struct pd_net_hdr_tx pd_hdr; +}__attribute__((packed)); + +struct zxdh_net_1588_hdr +{ + uint8_t tx_port; //bit7:2 rsv; bit1:0 00:np, 01:DRS, 10:DTP + uint8_t pd_len; //bit7 rsv; bit6:0 L2报文前的描述符长度,以2B为单位 + uint8_t num_buffers; //表示接收方向num buffers字段 + uint8_t rsv; //保留 + + struct pi_net_hdr pi_hdr; + struct pd_net_hdr_tx pd_hdr; + + uint8_t ptp_type[3]; /* 低bit0-16预留,bit17-19 pkt_type, bit23 ptp_udp */ + uint8_t ts_offset; + uint32_t cpu_tx; + uint8_t port; /* egress_port/ingress_port, L4报文此字段无用 */ + uint8_t rsv1[4]; + uint8_t sec_1588_key[3]; +}__attribute__((packed)); + +struct zxdh_net_hdr_rcv +{ + uint8_t tx_port; //bit7:2 rsv; bit1:0 00:np, 01:DRS, 10:DTP + uint8_t pd_len; //bit7 rsv; bit6:0 L2报文前的描述符长度,以2B为单位 + uint8_t num_buffers; //表示接收方向num buffers字段 + uint8_t rsv; //保留 + + struct pi_net_hdr pi_hdr; + struct pd_net_hdr_rx pd_hdr; +}__attribute__((packed)); + +struct zxdh_net_1588_hdr_rcv +{ + uint8_t tx_port; //bit7:2 rsv; bit1:0 00:np, 01:DRS, 10:DTP + uint8_t pd_len; //bit7 rsv; bit6:0 L2报文前的描述符长度,以2B为单位 + uint8_t num_buffers; //表示接收方向num buffers字段 + uint8_t rsv; //保留 + + struct pi_net_hdr pi_hdr; + struct pd_net_hdr_rx pd_hdr; + + uint8_t egress_port; + uint8_t ptp_type[2]; /* 低bit0-8预留,bit9-11 pkt_type, bit 12-14预留,bit15 ptp_udp */ + uint8_t ts_offset; + uint32_t rx_ts; +}__attribute__((packed)); + +#ifdef DEBUG +/* For development, we want to crash whenever the ring is screwed. */ +#define BAD_RING(_vq, fmt, args...) \ + do { \ + LOG_ERR("%s:"fmt, (_vq)->vq.name, ##args); \ + BUG(); \ + } while (0) +/* Caller is supposed to guarantee no reentry. */ +#define START_USE(_vq) \ + do { \ + if ((_vq)->in_use) \ + panic("%s:in_use = %i\n", \ + (_vq)->vq.name, (_vq)->in_use); \ + (_vq)->in_use = __LINE__; \ + } while (0) +#define END_USE(_vq) \ + do { BUG_ON(!(_vq)->in_use); (_vq)->in_use = 0; } while(0) +#define LAST_ADD_TIME_UPDATE(_vq) \ + do { \ + ktime_t now = ktime_get(); \ + \ + /* No kick or get, with .1 second between? Warn. */ \ + if ((_vq)->last_add_time_valid) \ + WARN_ON(ktime_to_ms(ktime_sub(now, \ + (_vq)->last_add_time)) > 100); \ + (_vq)->last_add_time = now; \ + (_vq)->last_add_time_valid = true; \ + } while (0) +#define LAST_ADD_TIME_CHECK(_vq) \ + do { \ + if ((_vq)->last_add_time_valid) { \ + WARN_ON(ktime_to_ms(ktime_sub(ktime_get(), \ + (_vq)->last_add_time)) > 100); \ + } \ + } while (0) +#define LAST_ADD_TIME_INVALID(_vq) \ + ((_vq)->last_add_time_valid = false) +#else +#define BAD_RING(_vq, fmt, args...) \ + do { \ + LOG_ERR("%s:"fmt, (_vq)->vq.name, ##args); \ + (_vq)->broken = true; \ + } while (0) +#define START_USE(vq) +#define END_USE(vq) +#define LAST_ADD_TIME_UPDATE(vq) +#define LAST_ADD_TIME_CHECK(vq) +#define LAST_ADD_TIME_INVALID(vq) +#endif + + +#define vqm_store_mb(weak_barriers, p, v) \ +do { \ + if (weak_barriers) { \ + virt_store_mb(*p, v); \ + } else { \ + WRITE_ONCE(*p, v); \ + mb(); \ + } \ +} while (0) \ + + +/* This is the PCI capability header: */ +struct zxdh_pci_cap +{ + __u8 cap_vndr; /* Generic PCI field: PCI_CAP_ID_VNDR */ + __u8 cap_next; /* Generic PCI field: next ptr. */ + __u8 cap_len; /* Generic PCI field: capability length */ + __u8 cfg_type; /* Identifies the structure. */ + __u8 bar; /* Where to find it. */ + __u8 id; /* Multiple capabilities of the same type */ + __u8 padding[2]; /* Pad to full dword. */ + __le32 offset; /* Offset within bar. */ + __le32 length; /* Length of the structure, in bytes. */ +}; + +struct zxdh_pci_notify_cap +{ + struct zxdh_pci_cap cap; + __le32 notify_off_multiplier; /* Multiplier for queue_notify_off. */ +}; + +struct virtqueue +{ + struct list_head list; + void (*callback)(struct virtqueue *vq); + const char *name; + struct net_device *vdev; + uint32_t index; + uint32_t phy_index; + uint32_t num_free; + void *priv; +}; + +/* custom queue ring descriptors: 16 bytes. These can chain together via "next". */ +struct vring_desc +{ + /* Address (guest-physical). */ + uint64_t addr; + /* Length. */ + uint32_t len; + /* The flags as indicated above. */ + uint16_t flags; + /* We chain unused descriptors via this, too */ + uint16_t next; +}; + +struct vring_avail +{ + uint16_t flags; + uint16_t idx; + uint16_t ring[]; +}; + +/* u32 is used here for ids for padding reasons. */ +struct vring_used_elem +{ + /* Index of start of used descriptor chain. */ + uint32_t id; + /* Total length of the descriptor chain which was used (written to) */ + uint32_t len; +}; + +typedef struct vring_used_elem __attribute__((aligned(VRING_USED_ALIGN_SIZE))) + vring_used_elem_t; + +struct vring_used +{ + uint16_t flags; + uint16_t idx; + vring_used_elem_t ring[]; +}; + +typedef struct vring_desc __attribute__((aligned(VRING_DESC_ALIGN_SIZE))) + vring_desc_t; +typedef struct vring_avail __attribute__((aligned(VRING_AVAIL_ALIGN_SIZE))) + vring_avail_t; +typedef struct vring_used __attribute__((aligned(VRING_USED_ALIGN_SIZE))) + vring_used_t; + +struct vring +{ + uint32_t num; + + vring_desc_t *desc; + + vring_avail_t *avail; + + vring_used_t *used; +}; + +struct vring_virtqueue +{ + struct virtqueue vq; + + /* Is this a packed ring? */ + bool packed_ring; + + /* Is DMA API used? */ + bool use_dma_api; + + /* Can we use weak barriers? */ + bool weak_barriers; + + /* Other side has made a mess, don't try any more. */ + bool broken; + + /* Host supports indirect buffers */ + bool indirect; + + /* Host publishes avail event idx */ + bool event; + + /* Head of free buffer list. */ + uint32_t free_head; + /* Number we've added since last sync. */ + uint32_t num_added; + + /* Last used index we've seen. */ + uint16_t last_used_idx; + + /* Hint for event idx: already triggered no need to disable. */ + bool event_triggered; + + /* Available for packed ring */ + struct + { + /* Actual memory layout for this queue. */ + struct + { + uint32_t num; + struct vring_packed_desc *desc; + struct vring_packed_desc_event *driver; + struct vring_packed_desc_event *device; + } vring; + + /* Driver ring wrap counter. */ + bool avail_wrap_counter; + + /* Device ring wrap counter. */ + bool used_wrap_counter; + + /* Avail used flags. */ + uint16_t avail_used_flags; + + /* Index of the next avail descriptor. */ + uint16_t next_avail_idx; + + /* + * Last written value to driver->flags in + * guest byte order. + */ + uint16_t event_flags_shadow; + + /* Per-descriptor state. */ + struct vring_desc_state_packed *desc_state; + struct vring_desc_extra *desc_extra; + + /* DMA address and size information */ + dma_addr_t ring_dma_addr; + dma_addr_t driver_event_dma_addr; + dma_addr_t device_event_dma_addr; + size_t ring_size_in_bytes; + size_t event_size_in_bytes; + } packed; + + /* How to notify other side. FIXME: commonalize hcalls! */ + bool (*notify)(struct virtqueue *vq); + + /* DMA, allocation, and size information */ + bool we_own_ring; + +#ifdef DEBUG + /* They're supposed to lock for us. */ + uint32_t in_use; + + /* Figure out if their kicks are too delayed. */ + bool last_add_time_valid; + ktime_t last_add_time; +#endif +}; + +struct zxdh_pci_vq_info +{ + /* the actual virtqueue */ + struct virtqueue *vq; + + /* the list node for the virtqueues list */ + struct list_head node; + + /* channel num map 1-1 to vector*/ + unsigned channel_num; +}; + +struct virtnet_stat_desc +{ + char desc[ETH_GSTRING_LEN]; + size_t offset; +}; + +struct virtnet_sq_stats +{ + struct u64_stats_sync syncp; + uint64_t packets; + uint64_t bytes; + uint64_t xdp_tx; + uint64_t xdp_tx_drops; + uint64_t kicks; + uint64_t tx_timeouts; +}; + +struct virtnet_rq_stats +{ + struct u64_stats_sync syncp; + uint64_t packets; + uint64_t bytes; + uint64_t drops; + uint64_t xdp_packets; + uint64_t xdp_tx; + uint64_t xdp_redirects; + uint64_t xdp_drops; + uint64_t kicks; +}; +#define VIRTNET_SQ_STAT(m) offsetof(struct virtnet_sq_stats, m) +#define VIRTNET_RQ_STAT(m) offsetof(struct virtnet_rq_stats, m) + +static const struct virtnet_stat_desc virtnet_sq_stats_desc[] = +{ + { "packets", VIRTNET_SQ_STAT(packets) }, + { "bytes", VIRTNET_SQ_STAT(bytes) }, + { "xdp_tx", VIRTNET_SQ_STAT(xdp_tx) }, + { "xdp_tx_drops", VIRTNET_SQ_STAT(xdp_tx_drops) }, + { "kicks", VIRTNET_SQ_STAT(kicks) }, + { "tx_timeouts", VIRTNET_SQ_STAT(tx_timeouts) }, +}; + +static const struct virtnet_stat_desc virtnet_rq_stats_desc[] = +{ + { "packets", VIRTNET_RQ_STAT(packets) }, + { "bytes", VIRTNET_RQ_STAT(bytes) }, + { "drops", VIRTNET_RQ_STAT(drops) }, + { "xdp_packets", VIRTNET_RQ_STAT(xdp_packets) }, + { "xdp_tx", VIRTNET_RQ_STAT(xdp_tx) }, + { "xdp_redirects", VIRTNET_RQ_STAT(xdp_redirects) }, + { "xdp_drops", VIRTNET_RQ_STAT(xdp_drops) }, + { "kicks", VIRTNET_RQ_STAT(kicks) }, +}; + +#define VIRTNET_SQ_STATS_LEN ARRAY_SIZE(virtnet_sq_stats_desc) +#define VIRTNET_RQ_STATS_LEN ARRAY_SIZE(virtnet_rq_stats_desc) + +/* RX packet size EWMA. The average packet size is used to determine the packet + * buffer size when refilling RX rings. As the entire RX ring may be refilled + * at once, the weight is chosen so that the EWMA will be insensitive to short- + * term, transient changes in packet size. + */ +DECLARE_EWMA(pkt_len, 0, 64) + + +/* Internal representation of a send virtqueue */ +struct send_queue +{ + /* Virtqueue associated with this send _queue */ + struct virtqueue *vq; + + /* TX: fragments + linear part + custom queue header */ + struct scatterlist sg[MAX_SKB_FRAGS + 2]; + + /* Name of the send queue: output.$index */ + char name[40]; + + struct virtnet_sq_stats stats; + + struct napi_struct napi; + + uint8_t hdr_buf[HDR_BUFFER_LEN]; +}; + +/* Internal representation of a receive virtqueue */ +struct receive_queue +{ + /* Virtqueue associated with this receive_queue */ + struct virtqueue *vq; + + struct napi_struct napi; + + struct bpf_prog __rcu *xdp_prog; + + struct virtnet_rq_stats stats; + + /* Chain pages by the private ptr. */ + struct page *pages; + + /* Average packet length for mergeable receive buffers. */ + struct ewma_pkt_len mrg_avg_pkt_len; //todo + + /* Page frag for packet buffer allocation. */ + struct page_frag alloc_frag; + + /* RX: fragments + linear part + custom queue header */ + struct scatterlist sg[MAX_SKB_FRAGS + 2]; + + /* Min single buffer size for mergeable buffers case. */ + uint32_t min_buf_len; + + /* Name of this receive queue: input.$index */ + char name[40]; + + struct xdp_rxq_info xdp_rxq; +}; + +#define to_vvq(_vq) container_of(_vq, struct vring_virtqueue, vq) + +typedef void vq_callback_t(struct virtqueue *); + + +void zxdh_print_vring_info(struct virtqueue *vq, uint32_t desc_index, uint32_t desc_num); +void virtnet_napi_enable(struct virtqueue *vq, struct napi_struct *napi); +void virtnet_napi_tx_enable(struct net_device *netdev, struct virtqueue *vq, struct napi_struct *napi); +void virtnet_napi_tx_disable(struct napi_struct *napi); +void refill_work(struct work_struct *work); +int virtnet_poll(struct napi_struct *napi, int budget); +int virtnet_poll_tx(struct napi_struct *napi, int budget); +int32_t txq2vq(int32_t txq); +int32_t rxq2vq(int32_t rxq); +uint16_t vqm16_to_cpu(struct net_device *netdev, __vqm16 val); +uint8_t vp_get_status(struct net_device *netdev); +void vp_set_status(struct net_device *netdev, uint8_t status); +void vp_set_reset_status(struct net_device *netdev, uint8_t status); +void zxdh_add_status(struct net_device *netdev, uint32_t status); +void zxdh_vp_enable_cbs(struct net_device *netdev); +void zxdh_vp_disable_cbs(struct net_device *netdev); +void zxdh_vp_reset(struct net_device *netdev); +void vring_free_queue(struct net_device *netdev, size_t size, void *queue, dma_addr_t dma_handle); +netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *netdev); +bool try_fill_recv(struct net_device *netdev, struct receive_queue *rq, gfp_t gfp); +inline struct zxdh_net_hdr *skb_vnet_hdr(struct sk_buff *skb); +int32_t virtqueue_add_outbuf(struct virtqueue *vq, struct scatterlist *sg, uint32_t num, void *data, gfp_t gfp); +void virtqueue_disable_cb(struct virtqueue *_vq); +void free_old_xmit_skbs(struct net_device *netdev, struct send_queue *sq, bool in_napi); +bool virtqueue_enable_cb_delayed(struct virtqueue *_vq); +bool virtqueue_kick_prepare_packed(struct virtqueue *_vq); +bool virtqueue_notify(struct virtqueue *_vq); +void zxdh_pf_features_init(struct net_device *netdev); +bool zxdh_has_feature(struct net_device *netdev, uint32_t fbit); +bool zxdh_has_status(struct net_device *netdev, uint32_t sbit); +void zxdh_free_unused_bufs(struct net_device *netdev); +void zxdh_free_receive_bufs(struct net_device *netdev); +void zxdh_free_receive_page_frags(struct net_device *netdev); +void zxdh_virtnet_del_vqs(struct net_device *netdev); +void zxdh_vqs_uninit(struct net_device *netdev); +int32_t zxdh_vqs_init(struct net_device *netdev); +int32_t dh_eq_vqs_vring_int(struct notifier_block *nb, unsigned long action, void *data); +int32_t vq2rxq(struct virtqueue *vq); +void *virtqueue_get_buf(struct virtqueue *_vq, uint32_t *len); +void *virtqueue_get_buf_ctx_packed(struct virtqueue *_vq, uint32_t *len, void **ctx); +uint32_t virtqueue_get_vring_size(struct virtqueue *_vq); +void virtqueue_napi_complete(struct napi_struct *napi, struct virtqueue *vq, int32_t processed); +int32_t virtqueue_add_inbuf_ctx(struct virtqueue *vq, + struct scatterlist *sg, uint32_t num, + void *data, + void *ctx, + gfp_t gfp); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_ethtool/ethtool.c b/src/net/drivers/net/ethernet/dinghai/en_ethtool/ethtool.c new file mode 100644 index 0000000..3794403 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_ethtool/ethtool.c @@ -0,0 +1,1997 @@ +#include +#include +#include +#include +#include +#include +#include "../en_aux/queue.h" +#include "../en_aux.h" +#include "../en_aux/en_cmd.h" +#include "../en_np/table/include/dpp_tbl_api.h" +#include "ethtool.h" +#include "linux/dinghai/dh_cmd.h" +#include "../msg_common.h" + +MODULE_LICENSE("Dual BSD/GPL"); + +#define PF_DRV_NAME "zxdh_pf" +#define VF_DRV_NAME "zxdh_vf" +#define DRV_NAME(VPORT) (IS_PF(VPORT) ? PF_DRV_NAME : VF_DRV_NAME) +#define ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NBITS 32 +#define MAX_DRV_NAME_LEN 32 +#define MAX_DRV_VERSION_LEN 32 +#define PCI_BUS(PCI_BDF) ((PCI_BDF >> 8) & 0xff) + +#define ZXDH_EN_LINK_MODE_ADD(ks, name, sup) \ +do \ +{ \ + if (sup) \ + { \ + ethtool_link_ksettings_add_link_mode((ks), supported, name); \ + } \ + else \ + { \ + ethtool_link_ksettings_add_link_mode((ks), advertising, name); \ + } \ +} while (0) + +#define ZXDH_EN_SPEED_MODE_TO_ETHTOOL(en_dev, bit, sup) \ + sup ? ((en_dev->supported_speed_modes) & BIT(bit)) == BIT(bit) : \ + ((en_dev->advertising_speed_modes) & BIT(bit)) == BIT(bit) + +#define GET_FEC_LINK_FLAG (0) +#define GET_FEC_CFG_FLAG (1) +#define GET_FEC_CAP_FLAG (2) + +static const uint32_t fec_2_ethtool_fecparam[] = +{ + [SPM_FEC_NONE] = ETHTOOL_FEC_OFF, + [SPM_FEC_BASER] = ETHTOOL_FEC_BASER, + [SPM_FEC_RS528] = ETHTOOL_FEC_RS, + [SPM_FEC_RS544] = ETHTOOL_FEC_RS, +}; + +static uint32_t zxdh_en_fec_to_ethtool_fecparam(uint32_t fec_mode, uint32_t flag) +{ + int32_t i; + uint32_t fecparam_cap = 0; + + if(!fec_mode) + { + if(flag == GET_FEC_LINK_FLAG) + return ETHTOOL_FEC_NONE; + else if(flag == GET_FEC_CFG_FLAG) + return ETHTOOL_FEC_AUTO; + } + + for(i = 0; i < ARRAY_SIZE(fec_2_ethtool_fecparam); i++) + { + if(fec_mode & BIT(i)) + { + fecparam_cap |= fec_2_ethtool_fecparam[i]; + } + } + + if(flag == GET_FEC_CAP_FLAG) + fecparam_cap |= ETHTOOL_FEC_AUTO; + + return fecparam_cap; +} + +static void zxdh_en_fec_to_link_ksettings(uint32_t fec_mode, + struct ethtool_link_ksettings *ks, + bool sup) +{ + if(fec_mode & BIT(SPM_FEC_NONE)) + ZXDH_EN_LINK_MODE_ADD(ks, FEC_NONE, sup); + if(fec_mode & BIT(SPM_FEC_BASER)) + ZXDH_EN_LINK_MODE_ADD(ks, FEC_BASER, sup); + if(fec_mode & BIT(SPM_FEC_RS528) || + fec_mode & BIT(SPM_FEC_RS544)) + ZXDH_EN_LINK_MODE_ADD(ks, FEC_RS, sup); +} + +static void zxdh_en_fec_link_ksettings_get(struct zxdh_en_device *en_dev, + struct ethtool_link_ksettings *ks) +{ + int32_t ret; + uint32_t fec_cap; + uint32_t fec_active; + + ret = zxdh_en_fec_mode_get(en_dev, &fec_cap, NULL, &fec_active); + if(ret) + { + LOG_ERR("zxdh_en_fec_mode_get failed!\n"); + return; + } + //LOG_INFO("fec_cap=0x%x, fec_active=0x%x\n", fec_cap, fec_active); + + zxdh_en_fec_to_link_ksettings(fec_cap, ks, true); + zxdh_en_fec_to_link_ksettings(fec_active, ks, false); + + return; +} + +static void zxdh_en_pause_link_ksettings_get(struct zxdh_en_device *en_dev, + struct ethtool_link_ksettings *ks) +{ + int32_t err; + uint32_t fc_mode; + + err = zxdh_en_fc_mode_get(en_dev, &fc_mode); + if(err != 0) + { + LOG_ERR("zxdh_en_fc_mode_get failed!\n"); + return; + } + + ZXDH_EN_LINK_MODE_ADD(ks, Pause, true); + + if(fc_mode == BIT(SPM_FC_PAUSE_FULL)) + ZXDH_EN_LINK_MODE_ADD(ks, Pause, false); + else if(fc_mode == BIT(SPM_FC_PAUSE_RX) || fc_mode == BIT(SPM_FC_PAUSE_TX)) + ZXDH_EN_LINK_MODE_ADD(ks, Asym_Pause, false); + + return; +} + +static void zxdh_en_phytype_to_ethtool(struct zxdh_en_device *en_dev, struct ethtool_link_ksettings *ks, bool sup) +{ + //0x20000020020 + if (ZXDH_EN_SPEED_MODE_TO_ETHTOOL(en_dev, SPM_SPEED_1X_1G, sup)) + { + ZXDH_EN_LINK_MODE_ADD(ks, 1000baseT_Full, sup); + ZXDH_EN_LINK_MODE_ADD(ks, 1000baseKX_Full, sup); + ZXDH_EN_LINK_MODE_ADD(ks, 1000baseX_Full, sup); + } + + //0x5C0000081000 + if (ZXDH_EN_SPEED_MODE_TO_ETHTOOL(en_dev, SPM_SPEED_1X_10G, sup)) + { + ZXDH_EN_LINK_MODE_ADD(ks, 10000baseT_Full, sup); + ZXDH_EN_LINK_MODE_ADD(ks, 10000baseKR_Full, sup); + ZXDH_EN_LINK_MODE_ADD(ks, 10000baseCR_Full, sup); + ZXDH_EN_LINK_MODE_ADD(ks, 10000baseSR_Full, sup); + ZXDH_EN_LINK_MODE_ADD(ks, 10000baseLR_Full, sup); + ZXDH_EN_LINK_MODE_ADD(ks, 10000baseER_Full, sup); + } + + //0x380000000 + if (ZXDH_EN_SPEED_MODE_TO_ETHTOOL(en_dev, SPM_SPEED_1X_25G, sup)) + { + ZXDH_EN_LINK_MODE_ADD(ks, 25000baseCR_Full, sup); + ZXDH_EN_LINK_MODE_ADD(ks, 25000baseKR_Full, sup); + ZXDH_EN_LINK_MODE_ADD(ks, 25000baseSR_Full, sup); + } + + //0x10C00000000 + if (ZXDH_EN_SPEED_MODE_TO_ETHTOOL(en_dev, SPM_SPEED_1X_50G, sup)) + { + ZXDH_EN_LINK_MODE_ADD(ks, 50000baseCR2_Full, sup); + ZXDH_EN_LINK_MODE_ADD(ks, 50000baseKR2_Full, sup); + ZXDH_EN_LINK_MODE_ADD(ks, 50000baseSR2_Full, sup); + } + + //0x7800000 + if (ZXDH_EN_SPEED_MODE_TO_ETHTOOL(en_dev, SPM_SPEED_4X_40G, sup)) + { + ZXDH_EN_LINK_MODE_ADD(ks, 40000baseKR4_Full, sup); + ZXDH_EN_LINK_MODE_ADD(ks, 40000baseCR4_Full, sup); + ZXDH_EN_LINK_MODE_ADD(ks, 40000baseSR4_Full, sup); + ZXDH_EN_LINK_MODE_ADD(ks, 40000baseLR4_Full, sup); + } + + //0xF000000000 + if (ZXDH_EN_SPEED_MODE_TO_ETHTOOL(en_dev, SPM_SPEED_4X_100G, sup)) + { + ZXDH_EN_LINK_MODE_ADD(ks, 100000baseKR4_Full, sup); + ZXDH_EN_LINK_MODE_ADD(ks, 100000baseSR4_Full, sup); + ZXDH_EN_LINK_MODE_ADD(ks, 100000baseCR4_Full, sup); + ZXDH_EN_LINK_MODE_ADD(ks, 100000baseLR4_ER4_Full, sup); + } + + //0x1E00000000000000 + if (ZXDH_EN_SPEED_MODE_TO_ETHTOOL(en_dev, SPM_SPEED_2X_100G, sup)) + { + ZXDH_EN_LINK_MODE_ADD(ks, 100000baseKR2_Full, sup); + ZXDH_EN_LINK_MODE_ADD(ks, 100000baseSR2_Full, sup); + ZXDH_EN_LINK_MODE_ADD(ks, 100000baseCR2_Full, sup); + ZXDH_EN_LINK_MODE_ADD(ks, 100000baseLR2_ER2_FR2_Full, sup); + } + + return; +} + +static void zxdh_en_ethtool_to_phytype(struct ethtool_link_ksettings *ks, uint32_t *speed_modes) +{ + if (ethtool_link_ksettings_test_link_mode(ks, advertising, 1000baseT_Full)) + { + *speed_modes |= BIT(SPM_SPEED_1X_1G); + } + + if (ethtool_link_ksettings_test_link_mode(ks, advertising, 10000baseT_Full)) + { + *speed_modes |= BIT(SPM_SPEED_1X_10G); + } + + if (ethtool_link_ksettings_test_link_mode(ks, advertising, 25000baseCR_Full)) + { + *speed_modes |= BIT(SPM_SPEED_1X_25G); + } + + if (ethtool_link_ksettings_test_link_mode(ks, advertising, 50000baseCR2_Full)) + { + *speed_modes |= BIT(SPM_SPEED_1X_50G); + } + + if (ethtool_link_ksettings_test_link_mode(ks, advertising, 40000baseKR4_Full)) + { + *speed_modes |= BIT(SPM_SPEED_4X_40G); + } + + if (ethtool_link_ksettings_test_link_mode(ks, advertising, 100000baseKR4_Full)) + { + *speed_modes |= BIT(SPM_SPEED_4X_100G); + } + + if (ethtool_link_ksettings_test_link_mode(ks, advertising, 100000baseKR2_Full)) + { + *speed_modes |= BIT(SPM_SPEED_2X_100G); + } + + return; +} + +static int32_t zxdh_en_speed_to_speed_modes(uint32_t speed, uint32_t *speed_modes, uint32_t sup_modes) +{ + switch (speed) + { + case SPEED_1000: + { + *speed_modes |= BIT(SPM_SPEED_1X_1G); + break; + } + case SPEED_10000: + { + *speed_modes |= BIT(SPM_SPEED_1X_10G); + break; + } + case SPEED_25000: + { + *speed_modes |= BIT(SPM_SPEED_1X_25G); + break; + } + case SPEED_40000: + { + *speed_modes |= BIT(SPM_SPEED_4X_40G); + break; + } + case SPEED_50000: + { + *speed_modes |= BIT(SPM_SPEED_1X_50G); + break; + } + case SPEED_100000: + { + *speed_modes |= BIT(SPM_SPEED_2X_100G); + *speed_modes |= BIT(SPM_SPEED_4X_100G); + break; + } + default: + { + return -EINVAL; + } + } + + *speed_modes &= sup_modes; + if (*speed_modes == 0) + { + return -EINVAL; + } + + return 0; +} + +static int32_t zxdh_en_get_link_ksettings(struct net_device *netdev, + struct ethtool_link_ksettings *ks) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + + ethtool_link_ksettings_zero_link_mode(ks, supported); + ethtool_link_ksettings_zero_link_mode(ks, advertising); + + ks->base.port = PORT_FIBRE; + ks->base.autoneg = en_dev->autoneg_enable; + ethtool_link_ksettings_add_link_mode(ks, supported, FIBRE); + ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg); + + if (en_dev->autoneg_enable == AUTONEG_ENABLE) + { + ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg); + } + + ks->base.speed = en_dev->speed; + if ((!netif_running(netdev)) || (!netif_carrier_ok(netdev))) + { + ks->base.speed = SPEED_UNKNOWN; + } + ks->base.duplex = ks->base.speed == SPEED_UNKNOWN ? DUPLEX_UNKNOWN : DUPLEX_FULL; + + zxdh_en_phytype_to_ethtool(en_dev, ks, true); + zxdh_en_phytype_to_ethtool(en_dev, ks, false); + + if(en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + zxdh_en_fec_link_ksettings_get(en_dev, ks); + zxdh_en_pause_link_ksettings_get(en_dev, ks); + } + + return 0; +} + +static int32_t zxdh_en_set_link_ksettings(struct net_device *netdev, + const struct ethtool_link_ksettings *ks) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct ethtool_link_ksettings safe_ks; + uint32_t advertising_link_modes = 0; + uint32_t off_speed_modes = 0; + uint32_t on_speed_modes = 0; + int32_t err = 0; + + if(en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_VF) + { + return 0; + } + if (ks->base.duplex == DUPLEX_HALF) + { + return -ENAVAIL; + } + + memset(&safe_ks, 0, sizeof(safe_ks)); + ethtool_link_ksettings_zero_link_mode(&safe_ks, supported); + ethtool_link_ksettings_zero_link_mode(&safe_ks, advertising); + + if (ks->base.autoneg == AUTONEG_DISABLE) + { + err = zxdh_en_speed_to_speed_modes(ks->base.speed, &off_speed_modes, + en_dev->supported_speed_modes); + LOG_DEBUG("set speed: %d, off_speed_modes: 0x%x\n", ks->base.speed, off_speed_modes); + if (err != 0) + { + LOG_ERR("zxdh_en_speed_to_speed_mode failed: %d\n", err); + return -EOPNOTSUPP; + } + + advertising_link_modes = off_speed_modes; + } + else + { + zxdh_en_phytype_to_ethtool(en_dev, &safe_ks, true); + if (!bitmap_intersects(ks->link_modes.advertising, + safe_ks.link_modes.supported, __ETHTOOL_LINK_MODE_MASK_NBITS)) + { + LOG_ERR("link_mode not supported\n"); + return -EOPNOTSUPP; + } + + bitmap_and(safe_ks.link_modes.advertising, ks->link_modes.advertising, + safe_ks.link_modes.supported, __ETHTOOL_LINK_MODE_MASK_NBITS); + zxdh_en_ethtool_to_phytype(&safe_ks, &on_speed_modes); + LOG_DEBUG("on_speed_modes: 0x%x\n", on_speed_modes); + advertising_link_modes = on_speed_modes; + } + + if ((advertising_link_modes == en_dev->advertising_speed_modes) && + (ks->base.autoneg == en_dev->autoneg_enable)) + { + LOG_DEBUG("nothing changed\n"); + return 0; + } + + safe_ks.base.speed = en_dev->speed; + en_dev->speed = SPEED_UNKNOWN; + LOG_INFO("autoneg %d, link_modes: 0x%x\n", ks->base.autoneg, advertising_link_modes); + err = zxdh_en_autoneg_set(en_dev, ks->base.autoneg, advertising_link_modes); + if (err != 0) + { + en_dev->speed = safe_ks.base.speed; + LOG_ERR("zxdh_en_autoneg_set failed: %d\n", err); + return err; + } + else + { + en_dev->autoneg_enable = ks->base.autoneg; + en_dev->advertising_speed_modes = advertising_link_modes; + en_dev->link_up = false; + netif_carrier_off(netdev); + en_dev->ops->set_pf_link_up(en_dev->parent, FALSE); //TODO:是否需要更新pf信息? + queue_work(en_priv->events->wq, &en_priv->edev.vf_link_info_update_work); + queue_work(en_priv->events->wq, &en_priv->edev.link_info_irq_update_np_work); + } + + return err; +} + +static uint32_t zxdh_en_get_link(struct net_device *netdev) +{ + return netif_carrier_ok(netdev) ? 1 : 0; +} + +static int zxdh_en_get_eeprom_len(struct net_device *netdev) +{ + return 0; +} + +static int zxdh_en_get_eeprom(struct net_device *netdev, struct ethtool_eeprom *eeprom, u8 *bytes) +{ + return 0; +} + +static int zxdh_en_set_eeprom(struct net_device *netdev, struct ethtool_eeprom *eeprom, u8 *bytes) +{ + return 0; +} + +static void zxdh_en_get_ringparam(struct net_device *netdev, struct ethtool_ringparam *ring) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + + ring->rx_max_pending = ZXDH_PF_MAX_DESC_NUM; + ring->tx_max_pending = ZXDH_PF_MAX_DESC_NUM; + ring->rx_pending = en_dev->ops->get_queue_size(en_dev->parent, en_dev->phy_index[0]); + ring->tx_pending = en_dev->ops->get_queue_size(en_dev->parent, en_dev->phy_index[1]); + + return; +} + +static int zxdh_en_set_ringparam(struct net_device *netdev, struct ethtool_ringparam *ring) +{ + LOG_ERR("not supported\n"); + return -1; +} + +static void zxdh_en_get_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *pause) +{ + int32_t err; + uint32_t fc_mode; + struct zxdh_en_device *en_dev = netdev_priv(netdev); + + if(en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_VF) + { + return; + } + + err = zxdh_en_fc_mode_get(en_dev, &fc_mode); + if(err != 0) + { + LOG_ERR("zxdh_en_fc_mode_get failed!\n"); + return; + } + + pause->autoneg = 0; + + switch(fc_mode) + { + case BIT(SPM_FC_PAUSE_FULL): + { + pause->rx_pause = 1; + pause->tx_pause = 1; + break; + } + case BIT(SPM_FC_PAUSE_RX): + { + pause->rx_pause = 1; + pause->tx_pause = 0; + break; + } + case BIT(SPM_FC_PAUSE_TX): + { + pause->rx_pause = 0; + pause->tx_pause = 1; + break; + } + default: + { + pause->rx_pause = 0; + pause->tx_pause = 0; + break; + } + } + + return; +} + +static int32_t zxdh_en_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *pause) +{ + int32_t err; + uint32_t fc_mode_cur; + uint32_t fc_mode_cfg; + struct zxdh_en_device *en_dev = netdev_priv(netdev); + + if(en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_VF) + { + return -EOPNOTSUPP; + } + + if(pause->autoneg) + { + LOG_ERR("not support pause autoneg!\n"); + return -EOPNOTSUPP; + } + + err = zxdh_en_fc_mode_get(en_dev, &fc_mode_cur); + if(err != 0) + { + LOG_ERR("zxdh_en_fc_mode_get failed!\n"); + return err; + } + + if((pause->rx_pause || pause->tx_pause) && (fc_mode_cur == BIT(SPM_FC_PFC_FULL))) + { + LOG_ERR("warning, ethtool cfg pause on, this will lead to pfc off!\n"); + } + + if(pause->rx_pause && pause->tx_pause) + { + fc_mode_cfg = BIT(SPM_FC_PAUSE_FULL); + } + else if(pause->rx_pause) + { + fc_mode_cfg = BIT(SPM_FC_PAUSE_RX); + } + else if(pause->tx_pause) + { + fc_mode_cfg = BIT(SPM_FC_PAUSE_TX); + } + else + { + if(fc_mode_cur == BIT(SPM_FC_PFC_FULL)) + fc_mode_cfg = BIT(SPM_FC_PFC_FULL); + else + fc_mode_cfg = BIT(SPM_FC_NONE); + } + + if(fc_mode_cfg != fc_mode_cur) + { + err = zxdh_en_fc_mode_set(en_dev, fc_mode_cfg); + if(err != 0) + { + LOG_ERR("zxdh_en_fc_mode_set failed!\n"); + return err; + } + } + + return 0; +} + +static int32_t zxdh_en_get_fecparam(struct net_device *netdev, struct ethtool_fecparam *fecparam) +{ + int32_t err; + uint32_t fec_cfg; + uint32_t fec_active; + struct zxdh_en_device *en_dev = netdev_priv(netdev); + + if(en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_VF) + { + return -EOPNOTSUPP; + } + + err = zxdh_en_fec_mode_get(en_dev, NULL, &fec_cfg, &fec_active); + if(err != 0) + { + LOG_ERR("zxdh_en_fec_mode_get failed!\n"); + return err; + } + + fecparam->fec = zxdh_en_fec_to_ethtool_fecparam(fec_cfg, GET_FEC_CFG_FLAG); + fecparam->active_fec = zxdh_en_fec_to_ethtool_fecparam(fec_active, GET_FEC_LINK_FLAG); + + //LOG_INFO("fec_cfg=0x%x, fecparam->fec=0x%x, fec_active=0x%x, fecparam->active_fec=0x%x\n", + // fec_cfg, fecparam->fec, fec_active, fecparam->active_fec); + + return 0; +} + +static int32_t zxdh_en_set_fecparam(struct net_device *netdev, struct ethtool_fecparam *fecparam) +{ + int32_t i; + int32_t err; + uint32_t fec_cap; + uint32_t fec_cfg = 0; + uint32_t fecparam_cap; + struct zxdh_en_device *en_dev = netdev_priv(netdev); + + if(en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_VF) + { + return -EOPNOTSUPP; + } + + err = zxdh_en_fec_mode_get(en_dev, &fec_cap, NULL, NULL); + if(err != 0) + { + LOG_ERR("zxdh_en_fec_mode_get failed!\n"); + return err; + } + fecparam_cap = zxdh_en_fec_to_ethtool_fecparam(fec_cap, GET_FEC_CAP_FLAG); + + if((fecparam->fec | fecparam_cap) != fecparam_cap) + { + LOG_ERR("fecparam->fec 0x%x unsupport !\n", fecparam->fec); + return -EOPNOTSUPP; + } + + for(i = 0; i < ARRAY_SIZE(fec_2_ethtool_fecparam); i++) + { + if(fecparam->fec == fec_2_ethtool_fecparam[i]) + { + fec_cfg |= BIT(i); + } + } + + if(!fec_cfg && (fecparam->fec != ETHTOOL_FEC_AUTO)) + { + LOG_ERR("fecparam->fec 0x%x unsupport !\n", fecparam->fec); + return -EOPNOTSUPP; + } + + //LOG_INFO("fecparam_cap=0x%x, fec_cap=0x%x, fecparam->fec=0x%x, fec_cfg=0x%x\n", + // fecparam_cap, fec_cap, fecparam->fec, fec_cfg); + + err = zxdh_en_fec_mode_set(en_dev, fec_cfg); + if(err != 0) + { + LOG_ERR("zxdh_en_fec_mode_set failed!\n"); + return err; + } + + return 0; +} + +static int32_t zxdh_en_get_module_info(struct net_device *netdev, struct ethtool_modinfo *modinfo) +{ + uint32_t read_bytes; + uint8_t data[2] = {0}; + struct zxdh_en_module_eeprom_param query = {0}; + struct zxdh_en_device *en_dev = netdev_priv(netdev); + + if(en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_VF) + { + return -EOPNOTSUPP; + } + + query.i2c_addr = SFF_I2C_ADDRESS_LOW; + query.page = 0; + query.offset = 0; + query.length = 2; + read_bytes = zxdh_en_module_eeprom_read(en_dev, &query, data); + if(read_bytes != query.length) + { + LOG_ERR("zxdh_en_module_eeprom_read failed!\n"); + return -EIO; + } + + switch(data[0]) + { + case ZXDH_MODULE_ID_SFP: + modinfo->type = ETH_MODULE_SFF_8472; + modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN; + break; + case ZXDH_MODULE_ID_QSFP: + modinfo->type = ETH_MODULE_SFF_8436; + modinfo->eeprom_len = ETH_MODULE_SFF_8436_MAX_LEN; + break; + case ZXDH_MODULE_ID_QSFP_PLUS: + case ZXDH_MODULE_ID_QSFP28: + if(data[1] < 3) + { + modinfo->type = ETH_MODULE_SFF_8436; + modinfo->eeprom_len = ETH_MODULE_SFF_8436_MAX_LEN; + } + else + { + modinfo->type = ETH_MODULE_SFF_8636; + modinfo->eeprom_len = ETH_MODULE_SFF_8636_MAX_LEN; + } + break; + default: + LOG_ERR("can not recognize module identifier 0x%x!\n", data[0]); + return -EINVAL; + } + + return 0; +} + +static int32_t zxdh_en_get_module_eeprom(struct net_device *netdev, struct ethtool_eeprom *ee, u8 *data) +{ + struct zxdh_en_module_eeprom_param query = {0}; + struct zxdh_en_device *en_dev = netdev_priv(netdev); + uint32_t offset = ee->offset; + uint32_t length = ee->len; + uint8_t identifier; + uint32_t offset_boundary = 0; + uint32_t total_read_bytes = 0; + uint32_t read_bytes = 0; + + if(en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_VF) + { + return -EOPNOTSUPP; + } + + //LOG_INFO("offset %u, len %u\n", ee->offset, ee->len); + + if(!ee->len) + return -EINVAL; + + memset(data, 0, ee->len); + + query.i2c_addr = SFF_I2C_ADDRESS_LOW; + query.bank = 0; + query.page = 0; + query.offset = 0; + query.length = 1; + read_bytes = zxdh_en_module_eeprom_read(en_dev, &query, &identifier); + if(read_bytes != query.length) + { + LOG_ERR("zxdh_en_module_eeprom_read failed!\n"); + return -EIO; + } + + while(total_read_bytes < ee->len) + { + if(identifier == ZXDH_MODULE_ID_SFP) + { + if(offset < 256) + { + query.i2c_addr = SFF_I2C_ADDRESS_LOW; + query.page = 0; + query.offset = offset; + } + else + { + query.i2c_addr = SFF_I2C_ADDRESS_HIGH; + query.page = 0; + query.offset = offset - 256; + } + offset_boundary = (query.offset < 128) ? 128 : 256; + query.length = ((query.offset + length) > offset_boundary) ? (offset_boundary - query.offset) : length; + } + else if(identifier == ZXDH_MODULE_ID_QSFP || + identifier == ZXDH_MODULE_ID_QSFP_PLUS || + identifier == ZXDH_MODULE_ID_QSFP28) + { + query.i2c_addr = SFF_I2C_ADDRESS_LOW; + if(offset < 256) + { + query.page = 0; + query.offset = offset; + } + else + { + query.page = (offset - 256) / 128 + 1; + query.offset = offset - 128 * query.page; + } + offset_boundary = (query.offset < 128) ? 128 : 256; + query.length = ((query.offset + length) > offset_boundary) ? (offset_boundary - query.offset) : length; + } + else + { + LOG_ERR("can not recognize module identifier 0x%x!\n", identifier); + return -EINVAL; + } + + read_bytes = zxdh_en_module_eeprom_read(en_dev, &query, data + total_read_bytes); + if(read_bytes != query.length) + { + LOG_ERR("zxdh_en_module_eeprom_read failed!\n"); + return -EIO; + } + + total_read_bytes += read_bytes; + offset += read_bytes; + length -= read_bytes; + } + + return 0; +} + +#ifdef HAVE_ETHTOOL_GET_MODULE_EEPROM_BY_PAGE +static int32_t zxdh_en_get_module_eeprom_by_page(struct net_device *netdev, + const struct ethtool_module_eeprom *page_data, + struct netlink_ext_ack *extack) +{ + struct zxdh_en_module_eeprom_param query = {0}; + struct zxdh_en_device *en_dev = netdev_priv(netdev); + uint32_t read_bytes = 0; + + if(en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_VF) + { + return -EOPNOTSUPP; + } + + //LOG_INFO("offset %u, length %u, page %u, bank %u, i2c_address %u\n", + // page_data->offset, page_data->length, page_data->page, page_data->bank, page_data->i2c_address); + + if(!page_data->length) + return -EINVAL; + + memset(page_data->data, 0, page_data->length); + + query.i2c_addr = page_data->i2c_address; + query.bank = page_data->bank; + query.page = page_data->page; + query.offset = page_data->offset; + query.length = page_data->length; + read_bytes = zxdh_en_module_eeprom_read(en_dev, &query, page_data->data); + if(read_bytes != query.length) + { + LOG_ERR("zxdh_en_module_eeprom_read failed!\n"); + return -EIO; + } + + return read_bytes; +} +#endif + +static void zxdh_en_diag_test(struct net_device *netdev, struct ethtool_test *eth_test, u64 *data) +{ + +} + +static int32_t zxdh_lldp_enable_proc(struct net_device *netdev, bool enable) +{ + int32_t ret = 0; + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + + ret = zxdh_lldp_enable_set(&en_priv->edev, enable); + if (0 != ret) + { + LOG_ERR("%s lldp failed!\n", enable ? "enable" : "disable"); + return ret; + } + + return ret; +} + +static int32_t zxdh_sshd_enable_proc(struct net_device *netdev, bool enable) +{ + int32_t ret = 0; + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + + ret = zxdh_sshd_enable_set(&en_priv->edev, enable); + if (0 != ret) + { + LOG_ERR("%s riscv sshd failed!\n", enable ? "enable" : "disable"); + return ret; + } + + return ret; +} + +typedef int32_t (*zxdh_pflag_handler)(struct net_device *netdev, bool enable); + +struct flag_desc +{ + uint8_t name[ETH_GSTRING_LEN]; + uint32_t bitno; + zxdh_pflag_handler handler; +}; + +#define ZXDH_PRIV_DESC(_name, _bitno, _handler) \ +{ \ + .name = _name, \ + .bitno = _bitno, \ + .handler = _handler, \ +} + +static const struct flag_desc zxdh_gstrings_priv_flags[] = +{ + ZXDH_PRIV_DESC("enable_lldp", ZXDH_PFLAG_ENABLE_LLDP, zxdh_lldp_enable_proc), + ZXDH_PRIV_DESC("enable_sshd", ZXDH_PFLAG_ENABLE_SSHD, zxdh_sshd_enable_proc), + ZXDH_PRIV_DESC("debug_ip", ZXDH_PFLAG_IP, NULL), +}; + +#define ZXDH_PRIV_FALG_ARRAY_SIZE ARRAY_SIZE(zxdh_gstrings_priv_flags) + +static void zxdh_en_get_strings(struct net_device *netdev, u32 stringset, u8 *data) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + uint16_t i = 0; + int8_t ip[20] = {0}; + uint8_t is_zios = 0; + int32_t ret = 0; + + switch (stringset) + { + case ETH_SS_STATS: + { + snprintf(data, ETH_GSTRING_LEN, "rx_packets");//get stat from netdev->stats + ZXDH_ADD_STRING(data, "tx_packets"); + ZXDH_ADD_STRING(data, "rx_bytes"); + ZXDH_ADD_STRING(data, "tx_bytes"); + ZXDH_ADD_STRING(data, "tx_queue_wake"); + ZXDH_ADD_STRING(data, "tx_queue_stopped"); + ZXDH_ADD_STRING(data, "tx_queue_dropped"); + + ZXDH_ADD_STRING(data, "rx_vport_packets");//get stat from np & vqm + ZXDH_ADD_STRING(data, "tx_vport_packets"); + ZXDH_ADD_STRING(data, "rx_vport_bytes"); + ZXDH_ADD_STRING(data, "tx_vport_bytes"); + ZXDH_ADD_STRING(data, "rx_vport_dropped"); + ZXDH_ADD_STRING(data, "rx_vport_broadcast_packets"); + ZXDH_ADD_STRING(data, "tx_vport_broadcast_packets"); + ZXDH_ADD_STRING(data, "rx_vport_mtu_drop_packets"); + ZXDH_ADD_STRING(data, "tx_vport_mtu_drop_packets"); + ZXDH_ADD_STRING(data, "rx_vport_mtu_drop_bytes"); + ZXDH_ADD_STRING(data, "tx_vport_mtu_drop_bytes"); + ZXDH_ADD_STRING(data, "rx_vport_plcr_drop_packets"); + ZXDH_ADD_STRING(data, "tx_vport_plcr_drop_packets"); + ZXDH_ADD_STRING(data, "rx_vport_plcr_drop_bytes"); + ZXDH_ADD_STRING(data, "tx_vport_plcr_drop_bytes"); + + ZXDH_ADD_STRING(data, "rx_packets_phy");//get stat from mac + ZXDH_ADD_STRING(data, "tx_packets_phy"); + ZXDH_ADD_STRING(data, "rx_bytes_phy"); + ZXDH_ADD_STRING(data, "tx_bytes_phy"); + ZXDH_ADD_STRING(data, "rx_errors_phy"); + ZXDH_ADD_STRING(data, "tx_errors_phy"); + ZXDH_ADD_STRING(data, "rx_drop_phy"); + ZXDH_ADD_STRING(data, "tx_drop_phy"); + ZXDH_ADD_STRING(data, "rx_multicast_phy"); + ZXDH_ADD_STRING(data, "tx_multicast_phy"); + ZXDH_ADD_STRING(data, "rx_broadcast_phy"); + ZXDH_ADD_STRING(data, "tx_broadcast_phy"); + ZXDH_ADD_STRING(data, "rx_size_64_phy"); + ZXDH_ADD_STRING(data, "rx_size_65_127"); + ZXDH_ADD_STRING(data, "rx_size_128_255"); + ZXDH_ADD_STRING(data, "rx_size_256_511"); + ZXDH_ADD_STRING(data, "rx_size_512_1023"); + ZXDH_ADD_STRING(data, "rx_size_1024_1518"); + ZXDH_ADD_STRING(data, "rx_size_1519_mru"); + ZXDH_ADD_STRING(data, "rx_pause"); + ZXDH_ADD_STRING(data, "tx_pause"); + + for (i = 0; i < en_dev->curr_queue_pairs; i++) + { + ZXDH_ADD_QUEUE_STRING(data, "rx_pkts", i); + ZXDH_ADD_QUEUE_STRING(data, "tx_pkts", i); + ZXDH_ADD_QUEUE_STRING(data, "rx_bytes", i); + ZXDH_ADD_QUEUE_STRING(data, "tx_bytes", i); + ZXDH_ADD_QUEUE_STRING(data, "tx_stopped", i); + ZXDH_ADD_QUEUE_STRING(data, "tx_wake", i); + ZXDH_ADD_QUEUE_STRING(data, "tx_dropped", i); + } + break; + } + case ETH_SS_PRIV_FLAGS: + { + for (i = 0; i < ZXDH_NUM_PFLAGS; i++) + { + strncpy(data + i * ETH_GSTRING_LEN, zxdh_gstrings_priv_flags[i].name, ETH_GSTRING_LEN); + } + + /* 获取riscv的os类型 */ + ret = zxdh_riscv_os_type_get(en_dev, &is_zios); + if (ret != 0) + { + LOG_ERR("zxdh_riscv_os_type_get failed"); + break; + } + + /* 修改登录方式 */ + if (is_zios == ZIOS_TYPE) + { + strncpy(data + ZXDH_PFLAG_ENABLE_SSHD * ETH_GSTRING_LEN, "enable_telnetd", ETH_GSTRING_LEN); + } + + /* 获取debug口的ip地址*/ + ret = zxdh_debug_ip_get(en_dev, ip); + if (ret != 0) + { + LOG_ERR("ip get failed"); + break; + } + strncpy(data + ZXDH_PFLAG_IP * ETH_GSTRING_LEN, ip, ETH_GSTRING_LEN); + break; + } + default: + { + LOG_ERR("invalid para\n"); + break; + } + } + + return; +} + +static int32_t zxdh_handle_pflag(struct net_device *netdev, + uint32_t wanted_flags, + enum zxdh_priv_flag flag) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + bool enable = !!(wanted_flags & BIT(flag)); + uint32_t changes = wanted_flags ^ en_priv->edev.pflags; + int32_t err = 0; + + /* 判断设置的值是否改变&改变的位是否为flag位 */ + if (!(changes & BIT(flag))) + { + return 0; + } + + if (flag == ZXDH_PFLAG_IP) + { + LOG_INFO("debug ip can not be changed"); + return 0; + } + + err = zxdh_gstrings_priv_flags[flag].handler(netdev, enable); + if (0 != err) + { + LOG_ERR("%s private flag '%s' failed err %d\n", \ + enable ? "Enable" : "Disable", zxdh_gstrings_priv_flags[flag].name, err); + return err; + } + + ZXDH_SET_PFLAG(en_priv->edev.pflags, flag, enable); + + if (flag == ZXDH_PFLAG_ENABLE_SSHD) /* 同步debug的ip状态*/ + { + ZXDH_SET_PFLAG(en_priv->edev.pflags, ZXDH_PFLAG_IP, enable); + } + return 0; +} + + +static int32_t zxdh_en_set_priv_flags(struct net_device *netdev, uint32_t pflags) +{ + enum zxdh_priv_flag pflag = 0; + int32_t err = 0; + + for (pflag = 0; pflag < ZXDH_NUM_PFLAGS; pflag++) + { + err = zxdh_handle_pflag(netdev, pflags, pflag); + if (0 != err) + { + break; + } + } + + return err; +} + +static uint32_t zxdh_en_get_priv_flags(struct net_device *netdev) +{ + int32_t ret = 0; + uint32_t flag_lldp = 0; + uint32_t lldp_mask = 0; + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + + ret = zxdh_lldp_enable_get(&en_priv->edev, &flag_lldp); + if ((ret != 0) && (flag_lldp != 0) && (flag_lldp != 1)) + { + LOG_ERR("zxdh_lldp_enable_get err, ret(%d), flag_lldp(%u).\n", ret, flag_lldp); + return en_priv->edev.pflags; + } + + flag_lldp = flag_lldp << ZXDH_PFLAG_ENABLE_LLDP; + + lldp_mask = 0xFFFFFFFF ^ BIT(ZXDH_PFLAG_ENABLE_LLDP); + en_priv->edev.pflags = (en_priv->edev.pflags & lldp_mask) | flag_lldp; + + return en_priv->edev.pflags; +} + +static int zxdh_en_get_regs_len(struct net_device *netdev) +{ +#define ZXDH_REGS_LEN (128 * 1024) + return ZXDH_REGS_LEN * sizeof(uint32_t); +} + +static void zxdh_en_get_regs(struct net_device *netdev, struct ethtool_regs *regs, void *p) +{ + +} + +static void zxdh_en_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + + wol->supported = en_dev->wol_support; + if (wol->supported == 0) + { + return; + } + wol->wolopts = en_dev->wolopts; +} + +static int zxdh_en_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) +{ + return 0; +} + +static uint32_t zxdh_en_get_msglevel(struct net_device *netdev) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + + return en_dev->msglevel; +} + +static void zxdh_en_set_msglevel(struct net_device *netdev, uint32_t data) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + en_dev->msglevel = data; +} + +static int zxdh_en_nway_reset(struct net_device *netdev) +{ + return 0; +} + +#ifdef HAVE_ETHTOOL_SET_PHYS_ID +static int zxdh_en_set_phys_id(struct net_device *netdev, enum ethtool_phys_id_state state) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + union zxdh_msg msg = {0}; + + switch (state) + { + case ETHTOOL_ID_ACTIVE: + { + msg.payload.mac_set_msg.blink_enable = 1; + break; + } + case ETHTOOL_ID_INACTIVE: + { + msg.payload.mac_set_msg.blink_enable = 0; + break; + } + default: + return -EOPNOTSUPP; + } + msg.payload.hdr_to_agt.op_code = AGENT_MAC_LED_BLINK; + msg.payload.hdr_to_agt.phyport = en_dev->phy_port; + LOG_DEBUG("send phyport %d, blink_enable=%d\n", en_dev->phy_port, msg.payload.mac_set_msg.blink_enable); + + return zxdh_send_command_to_specify(en_dev, MODULE_MAC, &msg, &msg); +} +#else +static int zxdh_en_phys_id(struct net_device *netdev, u32 data) +{ + return 0; +} +#endif /* HAVE_ETHTOOL_SET_PHYS_ID */ + +int32_t zxdh_en_self_test_num(void) +{ + return 0; +} + +#ifdef HAVE_ETHTOOL_GET_SSET_COUNT +static int32_t zxdh_en_get_sset_count(struct net_device *netdev, int sset) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + + switch (sset) + { + case ETH_SS_STATS: + { + return ZXDH_NET_PF_STATS_NUM(en_dev); + } + case ETH_SS_PRIV_FLAGS: + { + return ZXDH_NUM_PFLAGS; + } + case ETH_SS_TEST: + { + return zxdh_en_self_test_num(); + } + default: + { + return -EOPNOTSUPP; + } + } + + return 0; +} +#endif + +static void zxdh_en_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + int32_t ret = 0; + uint8_t drv_name_len = 0; + uint8_t drv_version[MAX_DRV_VERSION_LEN] = {0}; + uint8_t drv_version_len = 0; + uint16_t vport = 0; + + ret = en_dev->ops->get_pf_drv_msg(en_dev->parent, drv_version, &drv_version_len); + if (drv_version_len > MAX_DRV_NAME_LEN) + { + LOG_ERR("drv_version_len(%hhu) greater than %u", drv_version_len, MAX_DRV_NAME_LEN); + drv_version_len = MAX_DRV_NAME_LEN; + } + + vport = en_dev->vport; + drv_name_len = sizeof(DRV_NAME(vport)); + if (drv_name_len > MAX_DRV_NAME_LEN) + { + LOG_ERR("drv_name_len(%hhu) greater than %u", drv_name_len, MAX_DRV_NAME_LEN); + drv_name_len = MAX_DRV_NAME_LEN; + } + + memcpy(drvinfo->driver, DRV_NAME(vport), drv_name_len); + memcpy(drvinfo->version, drv_version, drv_version_len); + + strlcpy(drvinfo->bus_info, dev_name(en_dev->parent->parent->device), sizeof(drvinfo->bus_info)); + + drvinfo->n_priv_flags = ZXDH_NUM_PFLAGS; + drvinfo->n_stats = ZXDH_NET_PF_STATS_NUM(en_dev); + drvinfo->eedump_len = zxdh_en_get_eeprom_len(netdev); + drvinfo->regdump_len = zxdh_en_get_regs_len(netdev); + drvinfo->testinfo_len = zxdh_en_self_test_num(); + + memcpy(drvinfo->fw_version, en_dev->fw_version, en_dev->fw_version_len); +} + +int32_t zxdh_stats_update(struct zxdh_en_device *en_dev) +{ + uint16_t i = 0; + int32_t ret = 0; + + ret = zxdh_vport_stats_get(en_dev); + if (ret != 0) + { + LOG_ERR("zxdh_mac_stats_get failed, ret: %d\n", ret); + return -1; + } + + ret = zxdh_mac_stats_get(en_dev); + if (ret != 0) + { + LOG_ERR("zxdh_mac_stats_get failed, ret: %d\n", ret); + return -1; + } + + memset(&en_dev->hw_stats.netdev_stats, 0, sizeof(en_dev->hw_stats.netdev_stats)); + for (i = 0; i < en_dev->curr_queue_pairs; i++) + { + /* queue software statistics */ + en_dev->hw_stats.q_stats[i].q_rx_pkts = en_dev->rq[i].stats.packets; + en_dev->hw_stats.q_stats[i].q_tx_pkts = en_dev->sq[i].stats.packets; + en_dev->hw_stats.q_stats[i].q_rx_bytes = en_dev->rq[i].stats.bytes; + en_dev->hw_stats.q_stats[i].q_tx_bytes = en_dev->sq[i].stats.bytes; + + en_dev->hw_stats.netdev_stats.rx_packets += en_dev->rq[i].stats.packets; + en_dev->hw_stats.netdev_stats.tx_packets += en_dev->sq[i].stats.packets; + en_dev->hw_stats.netdev_stats.rx_bytes += en_dev->rq[i].stats.bytes; + en_dev->hw_stats.netdev_stats.tx_bytes += en_dev->sq[i].stats.bytes; + en_dev->hw_stats.netdev_stats.tx_queue_wake += en_dev->hw_stats.q_stats[i].q_tx_wake; + en_dev->hw_stats.netdev_stats.tx_queue_stopped += en_dev->hw_stats.q_stats[i].q_tx_stopped; + en_dev->hw_stats.netdev_stats.tx_queue_dropped += en_dev->hw_stats.q_stats[i].q_tx_dropped; + } + + return ret; +} + +static void zxdh_en_get_ethtool_stats(struct net_device *netdev, struct ethtool_stats *stats, u64 *data) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + uint32_t offset = ZXDH_NETDEV_STATS_NUM + ZXDH_MAC_STATS_NUM + ZXDH_VPORT_STATS_NUM; + + zxdh_stats_update(en_dev); + memcpy(data, &en_dev->hw_stats, ZXDH_NET_PF_STATS_NUM(en_dev) * sizeof(uint64_t)); + memcpy(data + offset, en_dev->hw_stats.q_stats, (en_dev->curr_queue_pairs * ZXDH_QUEUE_STATS_NUM) * sizeof(uint64_t)); + + return; +} + +static int zxdh_en_get_coalesce(struct net_device *netdev, struct ethtool_coalesce *ec) +{ + return 0; +} + +static int zxdh_en_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *ec) +{ + return 0; +} + +static int zxdh_en_get_ts_info(struct net_device *netdev, struct ethtool_ts_info *info) +{ + return 0; +} + +#ifdef CONFIG_PM_RUNTIME +static int zxdh_en_ethtool_begin(struct net_device *netdev) +{ + return 0; +} + +static void zxdh_en_ethtool_complete(struct net_device *netdev) +{ + +} +#endif + +#ifndef HAVE_NDO_SET_FEATURES +static int zxdh_en_get_rx_csum(struct net_device *netdev) +{ + return 0; +} + +static int zxdh_en_set_rx_csum(struct net_device *netdev, u32 data) +{ + return 0; +} + +static int zxdh_en_set_tx_csum(struct net_device *netdev, u32 data) +{ + return 0; +} + +#ifdef NETIF_F_TSO +static int zxdh_en_set_tso(struct net_device *netdev, u32 data) +{ + return 0; +} +#endif /* NETIF_F_TSO */ + +#ifdef ETHTOOL_GFLAGS +static int zxdh_en_set_flags(struct net_device *netdev, u32 data) +{ + return 0; +} +#endif /* ETHTOOL_GFLAGS */ +#endif /* HAVE_NDO_SET_FEATURES */ + +static int zxdh_en_get_eee(struct net_device *netdev, struct ethtool_eee *edata) +{ + return 0; +} + +static int zxdh_en_set_eee(struct net_device *netdev, struct ethtool_eee *edata) +{ + return 0; +} +#ifdef ETHTOOL_GRXFHINDIR +#ifdef HAVE_ETHTOOL_GRXFHINDIR_SIZE +static u32 zxdh_en_get_rxfh_indir_size(struct net_device *netdev) +{ + return ZXDH_INDIR_RQT_SIZE; +} + +static u32 zxdh_en_get_rxfh_key_size(struct net_device *netdev) +{ + return ZXDH_NET_HASH_KEY_SIZE; +} + +#if (defined(ETHTOOL_GRSSH) && !defined(HAVE_ETHTOOL_GSRSSH)) +#ifdef HAVE_RXFH_HASHFUNC +static int zxdh_en_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key, u8 *hfunc) +#else +static int zxdh_en_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key) +#endif /* HAVE_RXFH_HASHFUNC */ +#else +static int zxdh_en_get_rxfh_indir(struct net_device *netdev, u32 *indir) +#endif /* HAVE_ETHTOOL_GSRSSH */ +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + union zxdh_msg msg = {0}; + int32_t ret = 0; + uint8_t func = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + LOG_INFO("zxdh_en_get_rxfh start\n"); + if (indir != NULL) + { + memcpy(indir, en_dev->indir_rqt, sizeof(uint32_t) * ZXDH_INDIR_RQT_SIZE); + } + + if (key != NULL) + { + LOG_INFO("get key is called\n"); + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + ret = dpp_thash_key_get(&pf_info, key, ZXDH_NET_HASH_KEY_SIZE); + } + else + { + msg.payload.hdr.op_code = ZXDH_THASH_KEY_GET; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.hdr.pcie_id = en_dev->pcie_id; + ret = en_dev->ops->msg_send_cmd(en_dev->parent, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg, true); + if (ret == 0) + { + memcpy(key, msg.reps.thash_key_set_msg.key_map, ZXDH_NET_HASH_KEY_SIZE); + } + } + } + + if (hfunc != NULL) + { + func = en_dev->hash_func; + switch (func) + { + case ZXDH_FUNC_TOP: + { + *hfunc = ETH_RSS_HASH_TOP; + break; + } + case ZXDH_FUNC_XOR: + { + *hfunc = ETH_RSS_HASH_XOR; + break; + } + case ZXDH_FUNC_CRC32: + { + *hfunc = ETH_RSS_HASH_CRC32; + break; + } + default: + { + return -EOPNOTSUPP; + } + } + } + + return ret; +} +#else +static int zxdh_en_get_rxfh_indir(struct net_device *netdev, struct ethtool_rxfh_indir *indir) +{ + return 0; +} +#endif /* HAVE_ETHTOOL_GRXFHINDIR_SIZE */ +#endif /* ETHTOOL_GRXFHINDIR */ + +static int32_t zxdh_indir_to_queue_map(struct zxdh_en_device *en_dev, const uint32_t *indir) +{ + uint32_t *queue_map = NULL; + int32_t err = 0; + uint16_t i = 0; + uint16_t j = 0; + + queue_map = kzalloc(ZXDH_INDIR_RQT_SIZE * sizeof(uint32_t), GFP_KERNEL); + if (queue_map == NULL) + { + LOG_ERR("queue_map is NULL\n"); + return -ENOMEM; + } + for (i = 0; i < ZXDH_INDIR_RQT_SIZE; i++) + { + j = indir[i]; + queue_map[i] = en_dev->phy_index[2 * j]; + } + err = zxdh_rxfh_set(en_dev, queue_map); + kfree(queue_map); + if (err != 0) + { + LOG_ERR("zxdh_rxfh_set failed: %d\n", err); + return err; + } + + memcpy(en_dev->indir_rqt, indir, ZXDH_INDIR_RQT_SIZE * sizeof(uint32_t)); + + return err; +} + +#ifdef HAVE_ETHTOOL_GRXFHINDIR_SIZE +#if (defined(ETHTOOL_GRSSH) && !defined(HAVE_ETHTOOL_GSRSSH)) +#ifdef HAVE_RXFH_HASHFUNC +static int zxdh_en_set_rxfh(struct net_device *netdev, const u32 *indir, const u8 *key, const u8 hfunc) +#else +static int zxdh_en_set_rxfh(struct net_device *netdev, const u32 *indir, const u8 *key) +#endif /* HAVE_RXFH_HASHFUNC */ +#else +static int zxdh_en_set_rxfh_indir(struct net_device *netdev, const u32 *indir) +#endif /* HAVE_ETHTOOL_GSRSSH */ +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + union zxdh_msg msg = {0}; + int32_t ret = 0; + uint8_t func = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + LOG_INFO("zxdh_en_set_rxfh_indir start\n"); + switch (hfunc) + { + case ETH_RSS_HASH_NO_CHANGE: + { + break; + } + case ETH_RSS_HASH_TOP: + { + func = ZXDH_FUNC_TOP; + break; + } + case ETH_RSS_HASH_XOR: + { + func = ZXDH_FUNC_XOR; + break; + } + case ETH_RSS_HASH_CRC32: + { + func = ZXDH_FUNC_CRC32; + break; + } + default: + { + return -EOPNOTSUPP; + } + } + + if ((hfunc != ETH_RSS_HASH_NO_CHANGE) && (func != en_dev->hash_func)) + { + LOG_DEBUG("func: %u\n", func); + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + ret = dpp_vport_hash_funcs_set(&pf_info, func); + } + else + { + msg.payload.hdr.op_code = ZXDH_HASH_FUNC_SET; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.hdr.pcie_id = en_dev->pcie_id; + msg.payload.hfunc_set_msg.func = func; + ret = en_dev->ops->msg_send_cmd(en_dev->parent, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg, true); + } + if (ret != 0) + { + LOG_ERR("hunc set failed: %d", ret); + return ret; + } + en_dev->hash_func = func; + } + + if (indir != NULL) + { + LOG_DEBUG("set indir is called\n"); + ret = zxdh_indir_to_queue_map(en_dev, indir); + if (ret != 0) + { + LOG_ERR("indir set failed: %d", ret); + return ret; + } + } + + if (key != NULL) + { + LOG_DEBUG("set thash key is called\n"); + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + ret = dpp_thash_key_set(&pf_info, (uint8_t *)key, ZXDH_NET_HASH_KEY_SIZE); + } + else + { + memset(&msg, 0, sizeof(union zxdh_msg)); + msg.payload.hdr.op_code = ZXDH_THASH_KEY_SET; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.hdr.pcie_id = en_dev->pcie_id; + memcpy(msg.payload.thash_key_set_msg.key_map, key, ZXDH_NET_HASH_KEY_SIZE); + ret = en_dev->ops->msg_send_cmd(en_dev->parent, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg, true); + } + } + + return ret; +} +#else +static int zxdh_en_set_rxfh_indir(struct net_device *netdev, struct ethtool_cmd *ecmd) +{ + return 0; +} +#endif +#ifdef ETHTOOL_GCHANNELS +static void zxdh_en_get_channels(struct net_device *netdev, struct ethtool_channels *ch) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + union zxdh_msg msg = {0}; + int32_t err = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + ch->max_combined = max_pairs; + ch->combined_count = en_dev->curr_queue_pairs; + + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + err = dpp_rxfh_get(&pf_info, msg.payload.rxfh_set_msg.queue_map, ZXDH_INDIR_RQT_SIZE); + if (err != 0) + { + LOG_ERR("dpp_rxfh_get failed: %d\n", err); + return; + } + + LOG_DEBUG("*******pf_queue_map*******\n"); + zxdh_u32_array_print(msg.payload.rxfh_set_msg.queue_map, ZXDH_INDIR_RQT_SIZE); + } + else + { + msg.payload.hdr.op_code = ZXDH_RXFH_GET; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.hdr.pcie_id = en_dev->pcie_id; + err = en_dev->ops->msg_send_cmd(en_dev->parent, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg, true); + if (err != 0) + { + LOG_ERR("dpp_rxfh_get failed: %d\n", err); + return; + } + + LOG_DEBUG("*******vf_queue_map*******\n"); + zxdh_u32_array_print(msg.reps.rxfh_get_msg.queue_map, ZXDH_INDIR_RQT_SIZE); + } +} +#endif /* ETHTOOL_GCHANNELS */ + +int32_t zxdh_num_channels_changed(struct zxdh_en_device *en_dev, uint16_t num_changed) +{ + uint32_t indir[ZXDH_INDIR_RQT_SIZE] = {0}; + int32_t err = 0; + uint16_t i = 0; + + if (!netif_is_rxfh_configured(en_dev->netdev)) + { + LOG_INFO("indir_is_default\n"); + for (i = 0; i < ZXDH_INDIR_RQT_SIZE; ++i) + { + indir[i] = i % num_changed; + } + + err = zxdh_indir_to_queue_map(en_dev, indir); + if (err != 0) + { + LOG_ERR("zxdh_indir_to_queue_map failed: %d\n", err); + return err; + } + } + + en_dev->curr_queue_pairs = num_changed; + + return err; +} + +#ifdef ETHTOOL_SCHANNELS +static int zxdh_en_set_channels(struct net_device *netdev, struct ethtool_channels *ch) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + int32_t ret = 0; + + LOG_INFO("zxdh_en_set_channels start\n"); + /* verify that the number of channels does not invalidate any current + * flow director rules + */ + //TODO + + /* We don't support separate rx/tx channels. + * We don't allow setting 'other' channels. + */ + if (ch->rx_count || ch->tx_count || ch->other_count) + { + LOG_ERR("not supported\n"); + return -EINVAL; + } + + if ((ch->combined_count > max_pairs) || (ch->combined_count == 0)) + { + LOG_ERR("invalid para\n"); + return -EINVAL; + } + + if (ch->combined_count == en_dev->curr_queue_pairs) + { + return 0; + } + + ret = zxdh_num_channels_changed(en_dev, ch->combined_count); + if (ret != 0) + { + LOG_ERR("zxdh_num_channels_changed failed: %d\n", ret); + return -1; + } + + netif_set_real_num_tx_queues(netdev, en_dev->curr_queue_pairs); + netif_set_real_num_rx_queues(netdev, en_dev->curr_queue_pairs); + + return 0; +} +#endif + +static int zxdh_en_get_rxnfc(struct net_device *netdev, struct ethtool_rxnfc *cmd, +#ifdef HAVE_ETHTOOL_GET_RXNFC_VOID_RULE_LOCS + void *rule_locs) +#else + u32 *rule_locs) +#endif +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + union zxdh_msg msg = {0}; + uint32_t hash_mode = 0; + int32_t ret = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + LOG_INFO("zxdh_en_get_rxnfc start\n"); + if (cmd->cmd == ETHTOOL_GRXRINGS) + { + cmd->data = en_dev->curr_queue_pairs; + return 0; + } + + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + ret = dpp_rx_flow_hash_get(&pf_info, &hash_mode); + } + else + { + msg.payload.hdr.op_code = ZXDH_RX_FLOW_HASH_GET; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.hdr.pcie_id = en_dev->pcie_id; + ret = en_dev->ops->msg_send_cmd(en_dev->parent, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg, true); + hash_mode = msg.reps.rx_flow_hash_set_msg.hash_mode; + } + if (ret != 0) + { + return ret; + } + + LOG_DEBUG("hash_mode: %u\n", hash_mode); + switch (hash_mode) + { + case ZXDH_NET_RX_FLOW_HASH_MV: + { + cmd->data = RXH_L2DA + RXH_VLAN; + break; + } + case ZXDH_NET_RX_FLOW_HASH_SDT: + { + cmd->data = RXH_L3_PROTO + RXH_IP_SRC + RXH_IP_DST; + break; + } + case ZXDH_NET_RX_FLOW_HASH_SDFNT: + { + cmd->data = RXH_L3_PROTO + RXH_IP_SRC + RXH_IP_DST + RXH_L4_B_0_1 + RXH_L4_B_2_3; + break; + } + default: + { + LOG_ERR("invalid hash_mode\n"); + return -1; + } + } + + return 0; +} + +static int zxdh_en_set_rxnfc(struct net_device *netdev, struct ethtool_rxnfc *cmd) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + union zxdh_msg msg = {0}; + uint32_t hash_mode = 0; + int32_t ret = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = en_dev->slot_id; + pf_info.vport = en_dev->vport; + + LOG_INFO("zxdh_en_set_rxnfc start\n"); + switch (cmd->data) + { + /* input parameter mv */ + case (RXH_L2DA + RXH_VLAN): + { + hash_mode = ZXDH_NET_RX_FLOW_HASH_MV; + break; + } + /* input parameter sdt */ + case (RXH_L3_PROTO + RXH_IP_SRC + RXH_IP_DST): + { + hash_mode = ZXDH_NET_RX_FLOW_HASH_SDT; + break; + } + /* input parameter sdfnt */ + case (RXH_L3_PROTO + RXH_IP_SRC + RXH_IP_DST + RXH_L4_B_0_1 + RXH_L4_B_2_3): + { + hash_mode = ZXDH_NET_RX_FLOW_HASH_SDFNT; + break; + } + default: + { + LOG_ERR("invalid para, support mv, sdt, sdfnt\n"); + return -EOPNOTSUPP; + } + } + + LOG_DEBUG("hash_mode: %u\n", hash_mode); + if (en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) + { + ret = dpp_rx_flow_hash_set(&pf_info, hash_mode); + } + else + { + msg.payload.hdr.op_code = ZXDH_RX_FLOW_HASH_SET; + msg.payload.hdr.vport = en_dev->vport; + msg.payload.hdr.pcie_id = en_dev->pcie_id; + msg.payload.rx_flow_hash_set_msg.hash_mode = hash_mode; + ret = en_dev->ops->msg_send_cmd(en_dev->parent, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg, true); + } + + return ret; +} + +static const struct ethtool_ops zxdh_en_ethtool_ops = +{ +#ifdef HAVE_ETHTOOL_COALESCE_PARAMS_SUPPORT + .supported_coalesce_params = ETHTOOL_COALESCE_MAX_FRAMES, //ETHTOOL_COALESCE_USECS, +#endif + .get_drvinfo = zxdh_en_get_drvinfo, + .get_link_ksettings = zxdh_en_get_link_ksettings, + .set_link_ksettings = zxdh_en_set_link_ksettings, + .get_regs_len = zxdh_en_get_regs_len, + .get_regs = zxdh_en_get_regs, + .get_wol = zxdh_en_get_wol, + .set_wol = zxdh_en_set_wol, + .get_msglevel = zxdh_en_get_msglevel, + .set_msglevel = zxdh_en_set_msglevel, + .nway_reset = zxdh_en_nway_reset, + .get_link = zxdh_en_get_link, + .get_eeprom_len = zxdh_en_get_eeprom_len, + .get_eeprom = zxdh_en_get_eeprom, + .set_eeprom = zxdh_en_set_eeprom, + .get_ringparam = zxdh_en_get_ringparam, + .set_ringparam = zxdh_en_set_ringparam, + .get_pauseparam = zxdh_en_get_pauseparam, + .set_pauseparam = zxdh_en_set_pauseparam, + .get_fecparam = zxdh_en_get_fecparam, + .set_fecparam = zxdh_en_set_fecparam, + .get_module_info = zxdh_en_get_module_info, + .get_module_eeprom = zxdh_en_get_module_eeprom, +#ifdef HAVE_ETHTOOL_GET_MODULE_EEPROM_BY_PAGE + .get_module_eeprom_by_page = zxdh_en_get_module_eeprom_by_page, +#endif + .self_test = zxdh_en_diag_test, + .get_strings = zxdh_en_get_strings, + .get_priv_flags = zxdh_en_get_priv_flags, + .set_priv_flags = zxdh_en_set_priv_flags, +#ifndef HAVE_RHEL6_ETHTOOL_OPS_EXT_STRUCT +#ifdef HAVE_ETHTOOL_SET_PHYS_ID + .set_phys_id = zxdh_en_set_phys_id, +#else + .phys_id = zxdh_en_phys_id, +#endif /* HAVE_ETHTOOL_SET_PHYS_ID */ +#endif /* HAVE_RHEL6_ETHTOOL_OPS_EXT_STRUCT */ + +#ifdef HAVE_ETHTOOL_GET_SSET_COUNT + .get_sset_count = zxdh_en_get_sset_count, +#else + .get_stats_count = zxdh_en_get_stats_count, + .self_test_count = zxdh_en_diag_test_count, +#endif + .get_ethtool_stats = zxdh_en_get_ethtool_stats, + +#ifdef HAVE_ETHTOOL_GET_PERM_ADDR + .get_perm_addr = ethtool_op_get_perm_addr, +#endif + .get_coalesce = zxdh_en_get_coalesce, + .set_coalesce = zxdh_en_set_coalesce, +#ifndef HAVE_RHEL6_ETHTOOL_OPS_EXT_STRUCT +#ifdef HAVE_ETHTOOL_GET_TS_INFO + .get_ts_info = zxdh_en_get_ts_info, +#endif /* HAVE_ETHTOOL_GET_TS_INFO */ +#endif /* HAVE_RHEL6_ETHTOOL_OPS_EXT_STRUCT */ +#ifdef CONFIG_PM_RUNTIME + .begin = zxdh_en_ethtool_begin, + .complete = zxdh_en_ethtool_complete, +#endif /* CONFIG_PM_RUNTIME */ +#ifndef HAVE_NDO_SET_FEATURES + .get_rx_csum = zxdh_en_get_rx_csum, + .set_rx_csum = zxdh_en_set_rx_csum, + .get_tx_csum = ethtool_op_get_tx_csum, + .set_tx_csum = zxdh_en_set_tx_csum, + .get_sg = ethtool_op_get_sg, + .set_sg = ethtool_op_set_sg, +#ifdef NETIF_F_TSO + .get_tso = ethtool_op_get_tso, + .set_tso = zxdh_en_set_tso, +#endif +#ifdef ETHTOOL_GFLAGS + .get_flags = ethtool_op_get_flags, + .set_flags = zxdh_en_set_flags, +#endif /* ETHTOOL_GFLAGS */ +#endif /* HAVE_NDO_SET_FEATURES */ +#ifdef ETHTOOL_GADV_COAL + .get_advcoal = zxdh_en_get_adv_coal, + .set_advcoal = zxdh_en_set_dmac_coal, +#endif /* ETHTOOL_GADV_COAL */ +#ifndef HAVE_RHEL6_ETHTOOL_OPS_EXT_STRUCT +#ifdef ETHTOOL_GEEE + .get_eee = zxdh_en_get_eee, +#endif +#ifdef ETHTOOL_SEEE + .set_eee = zxdh_en_set_eee, +#endif +#ifdef ETHTOOL_GRXFHINDIR +#ifdef HAVE_ETHTOOL_GRXFHINDIR_SIZE + .get_rxfh_indir_size = zxdh_en_get_rxfh_indir_size, + .get_rxfh_key_size = zxdh_en_get_rxfh_key_size, +#endif /* HAVE_ETHTOOL_GRSFHINDIR_SIZE */ +#if (defined(ETHTOOL_GRSSH) && !defined(HAVE_ETHTOOL_GSRSSH)) + .get_rxfh = zxdh_en_get_rxfh, +#else + .get_rxfh_indir = zxdh_en_get_rxfh_indir, +#endif /* HAVE_ETHTOOL_GSRSSH */ +#endif /* ETHTOOL_GRXFHINDIR */ +#ifdef ETHTOOL_SRXFHINDIR +#if (defined(ETHTOOL_GRSSH) && !defined(HAVE_ETHTOOL_GSRSSH)) + .set_rxfh = zxdh_en_set_rxfh, +#else + .set_rxfh_indir = zxdh_en_set_rxfh_indir, +#endif /* HAVE_ETHTOOL_GSRSSH */ +#endif /* ETHTOOL_SRXFHINDIR */ +#ifdef ETHTOOL_GCHANNELS + .get_channels = zxdh_en_get_channels, +#endif /* ETHTOOL_GCHANNELS */ +#ifdef ETHTOOL_SCHANNELS + .set_channels = zxdh_en_set_channels, +#endif /* ETHTOOL_SCHANNELS */ +#endif /* HAVE_RHEL6_ETHTOOL_OPS_EXT_STRUCT */ +#ifdef ETHTOOL_GRXFH + .get_rxnfc = zxdh_en_get_rxnfc, + .set_rxnfc = zxdh_en_set_rxnfc, +#endif +}; + +#ifdef HAVE_RHEL6_ETHTOOL_OPS_EXT_STRUCT +static const struct ethtool_ops_ext zxdh_en_ethtool_ops_ext = +{ + .size = sizeof(struct ethtool_ops_ext), + .get_ts_info = zxdh_en_get_ts_info, + .set_phys_id = zxdh_en_set_phys_id, + .get_eee = zxdh_en_get_eee, + .set_eee = zxdh_en_set_eee, +#ifdef HAVE_ETHTOOL_GRXFHINDIR_SIZE + .get_rxfh_indir_size = zxdh_en_get_rxfh_indir_size, +#endif /* HAVE_ETHTOOL_GRSFHINDIR_SIZE */ + .get_rxfh_indir = zxdh_en_get_rxfh_indir, + .set_rxfh_indir = zxdh_en_set_rxfh_indir, + .get_channels = zxdh_en_get_channels, + .set_channels = zxdh_en_set_channels, +}; + +void zxdh_en_set_ethtool_ops_ext(struct net_device *netdev) +{ + netdev->ethtool_ops = &zxdh_en_ethtool_ops; + set_ethtool_ops_ext(netdev, &zxdh_en_ethtool_ops_ext); +} +#else +void zxdh_en_set_ethtool_ops(struct net_device *netdev) +{ + netdev->ethtool_ops = &zxdh_en_ethtool_ops; +} +#endif /* HAVE_RHEL6_ETHTOOL_OPS_EXT_STRUCT */ + diff --git a/src/net/drivers/net/ethernet/dinghai/en_ethtool/ethtool.h b/src/net/drivers/net/ethernet/dinghai/en_ethtool/ethtool.h new file mode 100644 index 0000000..fb8fb3d --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_ethtool/ethtool.h @@ -0,0 +1,68 @@ +#ifndef __ZXDH_EN_ETHTOOL_H__ +#define __ZXDH_EN_ETHTOOL_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +enum zxdh_priv_flag +{ + ZXDH_PFLAG_ENABLE_LLDP, + ZXDH_PFLAG_ENABLE_SSHD, + ZXDH_PFLAG_IP=2, + ZXDH_NUM_PFLAGS, /* Keep last */ +}; + +#define ZXDH_SET_PFLAG(pflags, flag, enable) \ + do \ + { \ + if (enable) \ + { \ + pflags |= BIT(flag); \ + } \ + else \ + { \ + pflags &= ~(BIT(flag)); \ + } \ + } while (0) + +#define ZXDH_ADD_STRING(data, str) \ +do \ +{ \ + data += ETH_GSTRING_LEN; \ + snprintf(data, ETH_GSTRING_LEN, str); \ +} while (0) + +#define ZXDH_ADD_QUEUE_STRING(data, str, i) \ +do \ +{ \ + data += ETH_GSTRING_LEN; \ + snprintf(data, ETH_GSTRING_LEN, "queue[%u]_%s", i, str); \ +} while (0) + +#define ZXDH_NETDEV_STATS_NUM (sizeof(struct zxdh_en_netdev_stats) / sizeof(uint64_t)) +#define ZXDH_VPORT_STATS_NUM (sizeof(struct zxdh_en_vport_stats) / sizeof(uint64_t)) +#define ZXDH_MAC_STATS_NUM (sizeof(struct zxdh_en_phy_stats) / sizeof(uint64_t)) +#define ZXDH_QUEUE_STATS_NUM (sizeof(struct zxdh_en_queue_stats) / sizeof(uint64_t)) + +#define ZXDH_NET_PF_STATS_NUM(en_dev) \ + (ZXDH_NETDEV_STATS_NUM + ZXDH_MAC_STATS_NUM + ZXDH_VPORT_STATS_NUM + \ + en_dev->curr_queue_pairs * ZXDH_QUEUE_STATS_NUM) + +#define ZXDH_GET_PFLAG(pflags, flag) (!!(pflags & (BIT(flag)))) + +#ifdef HAVE_RHEL6_ETHTOOL_OPS_EXT_STRUCT +void zxdh_en_set_ethtool_ops_ext(struct net_device *netdev); +#else +void zxdh_en_set_ethtool_ops(struct net_device *netdev); +#endif /* HAVE_RHEL6_ETHTOOL_OPS_EXT_STRUCT */ + +#define ZIOS_TYPE 0XAA +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_mpf.c b/src/net/drivers/net/ethernet/dinghai/en_mpf.c new file mode 100755 index 0000000..1b65f40 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_mpf.c @@ -0,0 +1,301 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "./en_mpf/events.h" +#include "./en_mpf/eq.h" +#include "./en_mpf/irq.h" +#include "en_mpf.h" +#include "en_mpf/cfg_sf.h" + +MODULE_LICENSE("Dual BSD/GPL"); + +uint32_t dh_debug_mask; +module_param_named(debug_mask, dh_debug_mask, uint, 0644); +MODULE_PARM_DESC(debug_mask, "debug mask: 1 = dump cmd data, 2 = dump cmd exec time, 3 = both. Default=0"); + +extern struct devlink_ops dh_mpf_devlink_ops; +extern struct dh_core_devlink_ops dh_mpf_core_devlink_ops; + +int32_t dh_mpf_pci_init(struct dh_core_dev *dev) +{ + int32_t ret = 0; + struct dh_en_mpf_dev *mpf_dev = NULL; + + pci_set_drvdata(dev->pdev, dev); + + ret = pci_enable_device(dev->pdev); + if (ret != 0) + { + dev_err(dev->device, "pci_enable_device failed: %d\n", ret); + return -ENOMEM; + } + + ret = dma_set_mask_and_coherent(dev->device, DMA_BIT_MASK(64)); + if (ret != 0) + { + ret = dma_set_mask_and_coherent(dev->device, DMA_BIT_MASK(32)); + if (ret != 0) + { + dev_err(dev->device, "dma_set_mask_and_coherent failed: %d\n", ret); + goto err_pci; + } + } + + ret = pci_request_selected_regions(dev->pdev, pci_select_bars(dev->pdev, IORESOURCE_MEM), "dh-mpf"); + if (ret != 0) + { + dev_err(dev->device, "pci_request_selected_regions failed: %d\n", ret); + goto err_pci; + } + + pci_enable_pcie_error_reporting(dev->pdev); + pci_set_master(dev->pdev); + ret = pci_save_state(dev->pdev); + if (ret != 0) + { + dev_err(dev->device, "pci_save_state failed: %d\n", ret); + goto err_pci_save_state; + } + + mpf_dev = dh_core_priv(dev); + mpf_dev->pci_ioremap_addr = (uint64_t)ioremap(pci_resource_start(dev->pdev, 0), pci_resource_len(dev->pdev, 0)); + LOG_INFO("pci_ioremap_addr=0x%llx, ioremap(0x%llx, 0x%llx)\n", mpf_dev->pci_ioremap_addr, pci_resource_start(dev->pdev, 0), pci_resource_len(dev->pdev, 0)); + if (mpf_dev->pci_ioremap_addr == 0) + { + ret = -1; + LOG_ERR("ioremap(0x%llx, 0x%llx) failed\n", pci_resource_start(dev->pdev, 0), pci_resource_len(dev->pdev, 0)); + goto err_pci_save_state; + } + + return 0; + +err_pci_save_state: + pci_disable_pcie_error_reporting(dev->pdev); + pci_release_selected_regions(dev->pdev, pci_select_bars(dev->pdev, IORESOURCE_MEM)); +err_pci: + pci_disable_device(dev->pdev); + return ret; +} + +static const struct pci_device_id dh_mpf_pci_table[] = { + { PCI_DEVICE(ZXDH_MPF_VENDOR_ID, ZXDH_MPF_DEVICE_ID), 0 }, + { 0, } +}; + +MODULE_DEVICE_TABLE(pci, dh_mpf_pci_table); + +void dh_mpf_pci_close(struct dh_core_dev *dev) +{ + struct dh_en_mpf_dev *mpf_dev = NULL; + + mpf_dev = dh_core_priv(dev); + iounmap((void *)mpf_dev->pci_ioremap_addr); + pci_disable_pcie_error_reporting(dev->pdev); + pci_release_selected_regions(dev->pdev, pci_select_bars(dev->pdev, IORESOURCE_MEM)); + pci_disable_device(dev->pdev); + + return; +} + +static int32_t dh_mpf_probe(struct pci_dev *pdev, const struct pci_device_id *id) +{ + struct dh_core_dev *dh_dev = NULL; + struct devlink *devlink = NULL; + int32_t err = 0; + + LOG_INFO("mpf driver start to probe\n"); + + devlink = zxdh_devlink_alloc(&pdev->dev, &dh_mpf_devlink_ops, sizeof(struct dh_en_mpf_dev)); + if (devlink == NULL) + { + dev_err(&pdev->dev, "devlink alloc failed\n"); + return -ENOMEM; + } + + dh_dev = devlink_priv(devlink); + dh_dev->device = &pdev->dev; + dh_dev->pdev = pdev; + dh_dev->devlink_ops = &dh_mpf_core_devlink_ops; + + err = dh_mpf_pci_init(dh_dev); + if (err != 0) + { + dev_err(&pdev->dev, "dh_mpf_pci_init failed: %d\n", err); + goto err_devlink_cleanup; + } + + err = dh_mpf_irq_table_init(dh_dev); + if (err != 0) + { + dh_err(dh_dev, "Failed to alloc IRQs\n"); + goto err_pci; + } + + err = dh_mpf_eq_table_init(dh_dev); + if (err != 0) + { + dh_err(dh_dev, "Failed to alloc IRQs\n"); + goto err_eq_table_init; + } + + err = dh_mpf_irq_table_create(dh_dev); + if (err != 0) + { + dh_err(dh_dev, "Failed to alloc IRQs\n"); + goto err_irq_table_create; + } + + err = dh_mpf_eq_table_create(dh_dev); + if (err != 0) + { + dh_err(dh_dev, "Failed to alloc EQs\n"); + goto err_eq_table_create; + } + + err = dh_mpf_events_init(dh_dev); + if (err != 0) + { + dh_err(dh_dev, "failed to initialize events\n"); + goto err_events_init_cleanup; + } + +#ifdef HAVE_DEVLINK_REGISTER_GET_1_PARAMS + zxdh_devlink_register(devlink); +#else + zxdh_devlink_register(devlink, &pdev->dev); +#endif + + LOG_INFO("mpf driver probe completed\n"); + return 0; + +err_events_init_cleanup: + dh_mpf_eq_table_destroy(dh_dev); +err_eq_table_create: + dh_mpf_irq_table_destroy(dh_dev); +err_irq_table_create: + dh_eq_table_cleanup(dh_dev); +err_eq_table_init: + dh_irq_table_cleanup(dh_dev); +err_pci: + dh_mpf_pci_close(dh_dev); +err_devlink_cleanup: + zxdh_devlink_free(devlink); + return err; +} + +static void dh_mpf_remove(struct pci_dev *pdev) +{ + struct dh_core_dev *dh_dev = pci_get_drvdata(pdev); + struct devlink *devlink = priv_to_devlink(dh_dev); + LOG_INFO("mpf driver start to remove"); + + zxdh_devlink_unregister(devlink); + dh_mpf_events_uninit(dh_dev); + dh_mpf_eq_table_destroy(dh_dev); + dh_mpf_irq_table_destroy(dh_dev); + dh_eq_table_cleanup(dh_dev); + dh_irq_table_cleanup(dh_dev); + dh_mpf_pci_close(dh_dev); + zxdh_devlink_free(devlink); + + pci_set_drvdata(pdev, NULL); + LOG_INFO("mpf driver remove completed\n"); +} + +static int32_t dh_mpf_suspend(struct pci_dev *pdev, pm_message_t state) +{ + + return 0; +} + +static int32_t dh_mpf_resume(struct pci_dev *pdev) +{ + + return 0; +} + +static void dh_mpf_shutdown(struct pci_dev *pdev) +{ + dh_mpf_remove(pdev); +} + +static pci_ers_result_t dh_pci_err_detected(struct pci_dev *pdev, + pci_channel_state_t state) +{ + return PCI_ERS_RESULT_NONE; +} + +static pci_ers_result_t dh_mpf_pci_slot_reset(struct pci_dev *pdev) +{ + return PCI_ERS_RESULT_NONE; +} + +static void dh_mpf_pci_resume(struct pci_dev *pdev) +{ + +} + +static const struct pci_error_handlers dh_mpf_err_handler = { + .error_detected = dh_pci_err_detected, + .slot_reset = dh_mpf_pci_slot_reset, + .resume = dh_mpf_pci_resume +}; + +static struct pci_driver dh_mpf_driver = { + .name = KBUILD_MODNAME, + .id_table = dh_mpf_pci_table, + .probe = dh_mpf_probe, + .remove = dh_mpf_remove, + .suspend = dh_mpf_suspend, + .resume = dh_mpf_resume, + .shutdown = dh_mpf_shutdown, + .err_handler = &dh_mpf_err_handler, +}; + +static int32_t __init init(void) +{ + int32_t err = 0; + + err = pci_register_driver(&dh_mpf_driver); + if (err != 0) + { + LOG_ERR("pci_register_driver failed: %d\n", err); + return err; + } + +#ifdef CONFIG_ZXDH_SF + err = zxdh_mpf_sf_driver_register(); + if (err != 0) + { + LOG_ERR("zxdh_en_sf_driver_register failed: %d\n", err); + goto err_sf; + } +#endif + + LOG_INFO("zxdh_mpf driver init success\n"); + + return 0; + +err_sf: + pci_unregister_driver(&dh_mpf_driver); + return err; +} + +static void __exit cleanup(void) +{ +#ifdef CONFIG_ZXDH_SF + zxdh_mpf_sf_driver_uregister(); +#endif + pci_unregister_driver(&dh_mpf_driver); + + LOG_INFO("zxdh_mpf driver remove success\n"); +} + +module_init(init); +module_exit(cleanup); diff --git a/src/net/drivers/net/ethernet/dinghai/en_mpf.h b/src/net/drivers/net/ethernet/dinghai/en_mpf.h new file mode 100755 index 0000000..cd1ee3c --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_mpf.h @@ -0,0 +1,32 @@ +#ifndef __ZXDH_EN_MPF_H__ +#define __ZXDH_EN_MPF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#define ZXDH_MPF_VENDOR_ID 0x1111 +#define ZXDH_MPF_DEVICE_ID 0x1041 + +#define ZXDH_BAR1_CHAN_OFFSET 0x2000//0x7801000 +#define ZXDH_BAR2_CHAN_OFFSET 0x3000//0x7802000 + +struct dh_en_mpf_dev { + uint16_t ep_bdf; + uint16_t pcie_id; + uint16_t vport; + + uint64_t pci_ioremap_addr; + + struct work_struct dh_np_sdk_from_risc; + struct work_struct dh_np_sdk_from_pf; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* __ZXDH_EN_MPF_H__ */ \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_mpf/cfg_sf.c b/src/net/drivers/net/ethernet/dinghai/en_mpf/cfg_sf.c new file mode 100755 index 0000000..1ddde92 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_mpf/cfg_sf.c @@ -0,0 +1,54 @@ +#include +#include +#include + +#include "cfg_sf.h" + +static int32_t zxdh_cfg_resume(struct zxdh_auxiliary_device *adev) +{ + return 0; +} + +static int32_t zxdh_cfg_suspend(struct zxdh_auxiliary_device *adev, pm_message_t state) +{ + return 0; +} + +static int32_t zxdh_cfg_probe(struct zxdh_auxiliary_device *adev, + const struct zxdh_auxiliary_device_id *id) +{ + struct cfg_sf_dev * __attribute__((unused)) cfg_sf_dev = container_of(adev, struct cfg_sf_dev, adev); + + return 0; +} + +static int32_t zxdh_cfg_remove(struct zxdh_auxiliary_device *adev) +{ + return 0; +} + +static const struct zxdh_auxiliary_device_id zxdh_cfg_id_table[] = { + { .name = ZXDH_EN_SF_NAME ".mpf_cfg", }, + {}, +}; + +//MODULE_DEVICE_TABLE(auxiliary_zxdh_id_table, zxdh_cfg_id_table); + +static struct zxdh_auxiliary_driver zxdh_cfg_driver = { + .name = "mpf_cfg", + .probe = zxdh_cfg_probe, + .remove = zxdh_cfg_remove, + .suspend = zxdh_cfg_suspend, + .resume = zxdh_cfg_resume, + .id_table = zxdh_cfg_id_table, +}; + +int32_t zxdh_mpf_sf_driver_register(void) +{ + return zxdh_auxiliary_driver_register(&zxdh_cfg_driver);; +} + +void zxdh_mpf_sf_driver_uregister(void) +{ + zxdh_auxiliary_driver_unregister(&zxdh_cfg_driver);; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_mpf/cfg_sf.h b/src/net/drivers/net/ethernet/dinghai/en_mpf/cfg_sf.h new file mode 100755 index 0000000..ec0fdd0 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_mpf/cfg_sf.h @@ -0,0 +1,30 @@ +#ifndef __ZXDH_MPF_CFG_SF_H__ +#define __ZXDH_MPF_CFG_SF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +struct cfg_sf_ops { + +}; + +struct cfg_sf_dev { + struct zxdh_auxiliary_device adev; + struct dh_core_dev *dh_dev; + struct cfg_sf_ops *ops; +}; + +int32_t zxdh_mpf_sf_driver_register(void); +void zxdh_mpf_sf_driver_uregister(void); + + +#ifdef __cplusplus +} +#endif + + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_mpf/devlink.c b/src/net/drivers/net/ethernet/dinghai/en_mpf/devlink.c new file mode 100755 index 0000000..e89a752 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_mpf/devlink.c @@ -0,0 +1,130 @@ +#include +#include +#include "devlink.h" + +struct devlink_ops dh_mpf_devlink_ops = { + +}; + +enum { + DH_MPF_PARAMS_MAX, +}; + +static int32_t __attribute__((unused)) sample_check(struct dh_core_dev *dev) +{ + return 1; +} + +enum dh_mpf_devlink_param_id { + DH_MPF_DEVLINK_PARAM_ID_BASE = DEVLINK_PARAM_GENERIC_ID_MAX, + DH_MPF_DEVLINK_PARAM_ID_SAMPLE, +}; + + +static int32_t dh_devlink_sample_set(struct devlink *devlink, uint32_t id, + struct devlink_param_gset_ctx *ctx) +{ + struct dh_core_dev * __attribute__((unused)) dev = devlink_priv(devlink); + + return 0; +} + +static int32_t dh_devlink_sample_get(struct devlink *devlink, uint32_t id, + struct devlink_param_gset_ctx *ctx) +{ + struct dh_core_dev * __attribute__((unused)) dev = devlink_priv(devlink); + + return 0; +} + +#ifdef HAVE_DEVLINK_PARAM_REGISTER +static const struct devlink_params { + const char *name; + int32_t (*check)(struct dh_core_dev *dev); + struct devlink_param param; +} devlink_params[] = { + [DH_MPF_PARAMS_MAX] = { .name = "sample", + .check = &sample_check, + .param = DEVLINK_PARAM_DRIVER(DH_MPF_DEVLINK_PARAM_ID_SAMPLE, + "sample", DEVLINK_PARAM_TYPE_BOOL, + BIT(DEVLINK_PARAM_CMODE_RUNTIME),dh_devlink_sample_get, + dh_devlink_sample_set, + NULL), + } +}; + +static int32_t params_register(struct devlink *devlink) +{ + int32_t i = 0; + int32_t err = 0; + struct dh_core_dev *dh_dev = devlink_priv(devlink); + + for (i = 0; i < ARRAY_SIZE(devlink_params); i++) + { + if(devlink_params[i].check(dh_dev)) + { + err = devlink_param_register(devlink, &devlink_params[i].param); + if (err) + { + goto rollback; + } + } + } + + return 0; + +rollback: + if (i == 0) + { + return err; + } + + for (; i > 0; i--) + { + devlink_param_unregister(devlink, &devlink_params[i].param); + } + + return err; +} + +static int32_t params_unregister(struct devlink *devlink) +{ + int32_t i = 0; + + for (i = 0; i < ARRAY_SIZE(devlink_params); i++) + { + devlink_param_unregister(devlink, &devlink_params[i].param); + } + + return 0; +} +#else +static struct devlink_param devlink_params [] = { + [DH_MPF_PARAMS_MAX] = DEVLINK_PARAM_DRIVER(DH_MPF_DEVLINK_PARAM_ID_SAMPLE, + "sample", DEVLINK_PARAM_TYPE_BOOL, + BIT(DEVLINK_PARAM_CMODE_RUNTIME),dh_devlink_sample_get, + dh_devlink_sample_set, + NULL), +}; + +static int32_t params_register(struct devlink *devlink) +{ + struct dh_core_dev * __attribute__((unused)) dh_dev = devlink_priv(devlink); + int32_t err = 0; + + err = devlink_params_register(devlink, devlink_params, ARRAY_SIZE(devlink_params)); + + return err; +} +static int32_t params_unregister(struct devlink *devlink) +{ + devlink_params_unregister(devlink, devlink_params, ARRAY_SIZE(devlink_params)); + + return 0; +} +#endif + +struct dh_core_devlink_ops dh_mpf_core_devlink_ops = { + .params_register = params_register, + .params_unregister = params_unregister +}; diff --git a/src/net/drivers/net/ethernet/dinghai/en_mpf/devlink.h b/src/net/drivers/net/ethernet/dinghai/en_mpf/devlink.h new file mode 100755 index 0000000..a45fd10 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_mpf/devlink.h @@ -0,0 +1,16 @@ +#ifndef __ZXDH_MPF_DEVLINK_H__ +#define __ZXDH_MPF_DEVLINK_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + + + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_mpf/eq.c b/src/net/drivers/net/ethernet/dinghai/en_mpf/eq.c new file mode 100755 index 0000000..0d8b612 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_mpf/eq.c @@ -0,0 +1,235 @@ +#include +#include +#include +#include +#include "irq.h" +#include "eq.h" +#include "../en_mpf.h" + +struct dh_mpf_eq_table { + struct dh_irq **comp_irqs; + struct dh_irq *async_risc_irq; + struct dh_irq *async_pf_irq; + struct dh_eq_async async_risc_eq; + struct dh_eq_async async_pf_eq; +}; + +static int32_t create_async_eqs(struct dh_core_dev *dev); + +static int32_t __attribute__((unused)) create_eq_map(struct dh_eq_param *param) +{ + int32_t err = 0; + + /* inform device*/ + return err; +} + +int32_t dh_mpf_eq_table_init(struct dh_core_dev *dev) +{ + struct dh_eq_table *eq_table; + struct dh_mpf_eq_table *table_priv = NULL; + int32_t err = 0; + + eq_table = &dev->eq_table; + + table_priv = kvzalloc(sizeof(*table_priv), GFP_KERNEL); + if (unlikely(table_priv == NULL)) + { + err = -ENOMEM; + goto err_table_priv; + } + + dh_eq_table_init(dev, table_priv); + + return 0; + +err_table_priv: + kvfree(eq_table); + return err; +} + +/*todo*/ +int32_t dh_eq_get_comp_eqs(struct dh_core_dev *dev) +{ + return 0; +} + +static int32_t create_comp_eqs(struct dh_core_dev *dev) +{ + return 0; +} + +static int32_t destroy_async_eq(struct dh_core_dev *dev) +{ + struct dh_eq_table *eq_table = &dev->eq_table; + + mutex_lock(&eq_table->lock); + /*unmap inform device*/ + mutex_unlock(&eq_table->lock); + + return 0; +} + +static void cleanup_async_eq(struct dh_core_dev *dev, + struct dh_eq_async *eq, const char *name) +{ + dh_eq_disable(dev, &eq->core, &eq->irq_nb); +} + +static void destroy_async_eqs(struct dh_core_dev *dev) +{ + struct dh_eq_table *table = &dev->eq_table; + struct dh_mpf_eq_table *table_priv = table->priv; + + cleanup_async_eq(dev, &table_priv->async_risc_eq, "riscv"); + cleanup_async_eq(dev, &table_priv->async_pf_eq, "pf"); + destroy_async_eq(dev); + dh_irqs_release_vectors(&table_priv->async_risc_irq, 1); + dh_irqs_release_vectors(&table_priv->async_pf_irq, 1); +} + +void destroy_comp_eqs(struct dh_core_dev *dev) +{ + +} + +void dh_mpf_eq_table_destroy(struct dh_core_dev *dev) +{ + destroy_comp_eqs(dev); + destroy_async_eqs(dev); +} + +int32_t dh_mpf_eq_table_create(struct dh_core_dev *dev) +{ + int32_t err = 0; + + err = create_async_eqs(dev); + if (err != 0) + { + dh_err(dev, "Failed to create async EQs\n"); + goto err_async_eqs; + } + + err = create_comp_eqs(dev); + if (err != 0) + { + dh_err(dev, "Failed to create completion EQs\n"); + goto err_comp_eqs; + } + + return 0; + +err_comp_eqs: + destroy_async_eqs(dev); +err_async_eqs: + return err; +} + +/*create eventq*/ +static int32_t create_async_eq(struct dh_core_dev *dev, struct dh_irq *risc, struct dh_irq *pf) +{ + struct dh_eq_table *eq_table = &dev->eq_table; + struct dh_en_mpf_dev *mpf_dev = dh_core_priv(dev); + struct msix_para in = {0}; + int32_t err = 0; + + in.vector_risc = risc->index; + in.vector_pfvf = pf->index; + in.vector_mpf = 0xff; + in.driver_type = MSG_CHAN_END_PF;//TODO + in.pdev = dev->pdev; + in.virt_addr = mpf_dev->pci_ioremap_addr + ZXDH_BAR1_CHAN_OFFSET; + + mutex_lock(&eq_table->lock); + + err = zxdh_bar_enable_chan(&in, &mpf_dev->vport); + + mutex_unlock(&eq_table->lock); + + return err; +} + +static int32_t dh_eq_async_riscv_int(struct notifier_block *nb, unsigned long action, void *data) +{ + struct dh_eq_async *eq_riscv_async = container_of(nb, struct dh_eq_async, irq_nb); + struct dh_core_dev *dev = (struct dh_core_dev *)eq_riscv_async->priv; + struct dh_eq_table *eq_table = &dev->eq_table; + + atomic_notifier_call_chain(&eq_table->nh[DH_EVENT_TYPE_NOTIFY_RISC_TO_MPF], DH_EVENT_TYPE_NOTIFY_RISC_TO_MPF, NULL); + + return 0; +} + +static int32_t dh_eq_async_mpf_int(struct notifier_block *nb, unsigned long action, void *data) +{ + struct dh_eq_async *eq_riscv_async = container_of(nb, struct dh_eq_async, irq_nb); + struct dh_core_dev *dev = (struct dh_core_dev *)eq_riscv_async->priv; + struct dh_eq_table *eq_table = &dev->eq_table; + + atomic_notifier_call_chain(&eq_table->nh[DH_EVENT_TYPE_NOTIFY_PF_TO_MPF], DH_EVENT_TYPE_NOTIFY_PF_TO_MPF, NULL); + + return 0; +} + +static int32_t create_async_eqs(struct dh_core_dev *dev) +{ + struct dh_eq_table *table = &dev->eq_table; + struct dh_mpf_eq_table *table_priv = table->priv; + struct dh_eq_param param = {}; + int32_t err = 0; + + dh_dbg(dev, "start\r\n"); + table_priv->async_risc_irq = dh_mpf_async_irq_request(dev); + if (IS_ERR_OR_NULL(table_priv->async_risc_irq)) + { + dh_err(dev, "Failed to get async_risc_irq\n"); + return PTR_ERR(table_priv->async_risc_irq); + } + + table_priv->async_pf_irq = dh_mpf_async_irq_request(dev); + if (IS_ERR_OR_NULL(table_priv->async_pf_irq)) + { + err = PTR_ERR(table_priv->async_pf_irq); + dh_err(dev, "Failed to get async_pf_irq\n"); + goto err_irq_request; + } + + err = create_async_eq(dev, table_priv->async_risc_irq, table_priv->async_pf_irq); + if (err != 0) + { + dh_err(dev, "Failed to create async_eq\n"); + goto err_create_async_eq; + } + + param = (struct dh_eq_param) { + .irq = table_priv->async_risc_irq, + .nent = 10, + .event_type = DH_EVENT_QUEUE_TYPE_RISCV /* used for inform dpu */ + }; + err = setup_async_eq(dev, &table_priv->async_risc_eq, ¶m, dh_eq_async_riscv_int, "riscv", dev); + if (err != 0) + { + dh_err(dev, "Failed to setup async_risc_eq\n"); + goto err_setup_async_eq; + } + + param.irq = table_priv->async_pf_irq, + err = setup_async_eq(dev, &table_priv->async_pf_eq, ¶m, dh_eq_async_mpf_int, "pf", dev); + if (err != 0) + { + dh_err(dev, "Failed to setup async_pf_eq\n"); + goto cleanup_async_eq; + } + + return 0; + +cleanup_async_eq: + cleanup_async_eq(dev, &table_priv->async_risc_eq, "riscv"); +err_setup_async_eq: + destroy_async_eq(dev); +err_create_async_eq: + dh_irqs_release_vectors(&table_priv->async_pf_irq, 1); +err_irq_request: + dh_irqs_release_vectors(&table_priv->async_risc_irq, 1); + return err; +} \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_mpf/eq.h b/src/net/drivers/net/ethernet/dinghai/en_mpf/eq.h new file mode 100755 index 0000000..4aaaaae --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_mpf/eq.h @@ -0,0 +1,19 @@ +#ifndef __ZXDH_MPF_EQ_H__ +#define __ZXDH_MPF_EQ_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +int32_t dh_mpf_eq_table_init(struct dh_core_dev *dev); + +int32_t dh_mpf_eq_table_create(struct dh_core_dev *dev); +void dh_mpf_eq_table_destroy(struct dh_core_dev *dev); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_mpf/events.c b/src/net/drivers/net/ethernet/dinghai/en_mpf/events.c new file mode 100755 index 0000000..35aaf52 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_mpf/events.c @@ -0,0 +1,132 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "events.h" +#include "../en_mpf.h" + +static int32_t riscv_notifier(struct notifier_block *nb, unsigned long type, void *data); +static int32_t pf_notifier(struct notifier_block *nb, unsigned long type, void *data); + +static struct dh_nb mpf_events[] = { + {.nb.notifier_call = riscv_notifier, .event_type = DH_EVENT_TYPE_NOTIFY_RISC_TO_MPF}, + {.nb.notifier_call = pf_notifier, .event_type = DH_EVENT_TYPE_NOTIFY_PF_TO_MPF} +}; + +static int32_t riscv_notifier(struct notifier_block *nb, unsigned long type, void *data) +{ + struct dh_event_nb *event_nb = dh_nb_cof(nb, struct dh_event_nb, nb); + struct dh_core_dev *dh_dev = (struct dh_core_dev *)event_nb->ctx; + struct dh_en_mpf_dev *mpf_dev = dh_core_priv(dh_dev); + + zxdh_events_work_enqueue(dh_dev, &mpf_dev->dh_np_sdk_from_risc); + + return NOTIFY_OK; +} + +static int32_t pf_notifier(struct notifier_block *nb, unsigned long type, void *data) +{ + struct dh_event_nb *event_nb = dh_nb_cof(nb, struct dh_event_nb, nb); + struct dh_core_dev *dh_dev = (struct dh_core_dev *)event_nb->ctx; + struct dh_en_mpf_dev *mpf_dev = dh_core_priv(dh_dev); + + zxdh_events_work_enqueue(dh_dev, &mpf_dev->dh_np_sdk_from_pf); + + return NOTIFY_OK; +} + +void np_sdk_handler_from_risc(struct work_struct *p_work) +{ + struct dh_en_mpf_dev *mpf_dev = container_of(p_work, struct dh_en_mpf_dev, dh_np_sdk_from_risc); + + LOG_INFO("is called\n"); + zxdh_bar_irq_recv(MSG_CHAN_END_RISC, MSG_CHAN_END_MPF, mpf_dev->pci_ioremap_addr + ZXDH_BAR1_CHAN_OFFSET, NULL); + return; +} + +void np_sdk_handler_from_pf(struct work_struct *p_work) +{ + struct dh_en_mpf_dev *mpf_dev = container_of(p_work, struct dh_en_mpf_dev, dh_np_sdk_from_pf); + + LOG_INFO("is called\n"); + zxdh_bar_irq_recv(MSG_CHAN_END_PF, MSG_CHAN_END_MPF, mpf_dev->pci_ioremap_addr + ZXDH_BAR2_CHAN_OFFSET, NULL); + return; +} + +void zxdh_events_start(struct dh_core_dev *dev) +{ + struct dh_events *events = dev->events; + int32_t i; + int32_t err; + + for (i = 0; i < ARRAY_SIZE(mpf_events); i++) + { + events->notifiers[i].nb = mpf_events[i]; + events->notifiers[i].ctx = dev; + err = dh_eq_notifier_register(&dev->eq_table, &events->notifiers[i].nb); + if (err != 0) + { + LOG_ERR("i: %d, err: %d.\n", i, err); + } + } +} + +int32_t dh_mpf_events_init(struct dh_core_dev *dev) +{ + struct dh_events *events = NULL; + struct dh_en_mpf_dev *mpf_dev = dh_core_priv(dev); + int32_t ret = 0; + + events = kzalloc((sizeof(*events) + ARRAY_SIZE(mpf_events) * sizeof(struct dh_event_nb)), GFP_KERNEL); + if (unlikely(events == NULL)) + { + LOG_ERR("events kzalloc failed: %p\n", events); + ret = -ENOMEM; + goto err_events_kzalloc; + } + + events->evt_num = ARRAY_SIZE(mpf_events); + events->dev = dev; + dev->events = events; + events->wq = create_singlethread_workqueue("dh_mpf_events"); + if (!events->wq) + { + LOG_ERR("events->wq create_singlethread_workqueue failed: %p\n", events->wq); + ret = -ENOMEM; + goto err_create_wq; + } + + INIT_WORK(&mpf_dev->dh_np_sdk_from_risc, np_sdk_handler_from_risc); + INIT_WORK(&mpf_dev->dh_np_sdk_from_pf, np_sdk_handler_from_pf); + + zxdh_events_start(dev); + + return 0; + +err_create_wq: + kfree(events); +err_events_kzalloc: + return ret; +} + +void dh_events_stop(struct dh_core_dev *dev) +{ + struct dh_events *events = dev->events; + int32_t i = 0; + + for (i = ARRAY_SIZE(mpf_events) - 1; i >= 0 ; i--) + { + dh_eq_notifier_unregister(&dev->eq_table, &events->notifiers[i].nb); + } + + zxdh_events_cleanup(dev); +} + +void dh_mpf_events_uninit(struct dh_core_dev *dev) +{ + return dh_events_stop(dev); +} \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_mpf/events.h b/src/net/drivers/net/ethernet/dinghai/en_mpf/events.h new file mode 100755 index 0000000..496097e --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_mpf/events.h @@ -0,0 +1,18 @@ +#ifndef __ZXDH_MPF_EVENTS_H__ +#define __ZXDH_MPF_EVENTS_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +int32_t dh_mpf_events_init(struct dh_core_dev *dev); +void dh_mpf_events_uninit(struct dh_core_dev *dev); +void zxdh_events_start(struct dh_core_dev *dev); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_mpf/irq.c b/src/net/drivers/net/ethernet/dinghai/en_mpf/irq.c new file mode 100755 index 0000000..a1ccaab --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_mpf/irq.c @@ -0,0 +1,171 @@ +#include +#include +#include +#include "irq.h" + +#define ZXDH_MPF_ASYNC_IRQ_MIN_COMP 0 +#define ZXDH_MPF_ASYNC_IRQ_MAX_COMP 1 + +#define ZXDH_MPF_COMP_IRQ_MIN_COMP 0 +#define ZXDH_MPF_COMP_IRQ_MAX_COMP 1 + +#ifndef CONFIG_DINGHAI_ZF_MPF +#define ZXDH_MPF_ASYNC_IRQ_NUM 2 +#else +#define ZXDH_MPF_ASYNC_IRQ_NUM 6 +#endif + +struct dh_mpf_irq_table { + struct dh_irq_pool *mpf_comp_pool; + struct dh_irq_pool *mpf_async_pool; +}; + +struct dh_irq_range { + int32_t start; + int32_t size; +}; + +static struct dh_irq_range zxdh_get_mpf_range(struct dh_core_dev *dev) +{ + struct dh_irq_range tmp = { + .start = 0, + .size = ZXDH_MPF_ASYNC_IRQ_NUM + }; + + return tmp; +} +static struct dh_irq_range zxdh_get_comp_mpf_range(struct dh_core_dev *dev) +{ + struct dh_irq_range tmp = { + .start = ZXDH_MPF_ASYNC_IRQ_NUM + 1, + .size = ZXDH_MPF_ASYNC_IRQ_NUM + 1 + }; + + return tmp; +} + +static int32_t irq_pools_init(struct dh_core_dev *dev) +{ + struct dh_irq_table *table = &dev->irq_table; + int32_t err = 0; + struct dh_irq_range irq_range; + struct dh_mpf_irq_table * mpf_irq_table = table->priv; + + /* init mpf_pool */ + irq_range = zxdh_get_mpf_range(dev); + + mpf_irq_table->mpf_async_pool = irq_pool_alloc(dev, irq_range.start, irq_range.size, "zxdh_mpf_msg", + ZXDH_MPF_ASYNC_IRQ_MIN_COMP, + ZXDH_MPF_ASYNC_IRQ_MAX_COMP); + if (IS_ERR_OR_NULL(mpf_irq_table->mpf_async_pool)) + { + return PTR_ERR(mpf_irq_table->mpf_async_pool); + } + + /* init sf_comp_pool */ + irq_range = zxdh_get_comp_mpf_range(dev); + + mpf_irq_table->mpf_comp_pool = irq_pool_alloc(dev, irq_range.start, + irq_range.size, "zxdh_mpf_comp", + ZXDH_MPF_COMP_IRQ_MIN_COMP, + ZXDH_MPF_COMP_IRQ_MAX_COMP); + if (IS_ERR_OR_NULL(mpf_irq_table->mpf_comp_pool)) + { + err = PTR_ERR(mpf_irq_table->mpf_comp_pool); + goto err_mpf_comp; + } + + mpf_irq_table->mpf_comp_pool->irqs_per_cpu = kcalloc(nr_cpu_ids, sizeof(u16), GFP_KERNEL); + if (unlikely(mpf_irq_table->mpf_comp_pool->irqs_per_cpu == NULL)) + { + err = -ENOMEM; + goto err_irqs_per_cpu; + } + + return 0; + +err_irqs_per_cpu: + irq_pool_free(mpf_irq_table->mpf_comp_pool); +err_mpf_comp: + irq_pool_free(mpf_irq_table->mpf_async_pool); + return err; +} + +static void irq_pools_destroy(struct dh_irq_table *table) +{ + struct dh_mpf_irq_table *mpf_irq_table = (struct dh_mpf_irq_table *)table->priv; + + irq_pool_free(mpf_irq_table->mpf_comp_pool); + irq_pool_free(mpf_irq_table->mpf_async_pool); +} + +/*todo*/ +static int32_t zxdh_get_total_vec(struct dh_core_dev *dev) +{ + return ZXDH_MPF_ASYNC_IRQ_NUM; +} + +int32_t dh_mpf_irq_table_create(struct dh_core_dev *dev) +{ + int32_t total_vec = 0; + int32_t err = 0; + + total_vec = zxdh_get_total_vec(dev); + + total_vec = pci_alloc_irq_vectors(dev->pdev, total_vec, total_vec, PCI_IRQ_MSIX); + if (total_vec < 0) + { + dh_err(dev, "pci_alloc_irq_vectors failed: %d\n", total_vec); + return total_vec; + } + + err = irq_pools_init(dev); + if (err != 0) + { + pci_free_irq_vectors(dev->pdev); + } + + return err; +} + +void dh_mpf_irq_table_destroy(struct dh_core_dev *dev) +{ + struct dh_irq_table *table = &dev->irq_table; + + /* There are cases where IRQs still will be in used when we reaching + * to here. Hence, making sure all the irqs are released. + */ + irq_pools_destroy(table); + pci_free_irq_vectors(dev->pdev); +} + +struct dh_irq *dh_mpf_async_irq_request(struct dh_core_dev *dev) +{ + struct dh_irq_table *table = &dev->irq_table; + struct dh_mpf_irq_table *mpf_irq_table = (struct dh_mpf_irq_table *)table->priv; + + struct dh_irq *irq = zxdh_get_irq_of_pool(dev, mpf_irq_table->mpf_async_pool); + if (IS_ERR_OR_NULL(irq)) + dh_err(dev, "irq=0x%llx\r\n", (unsigned long long)irq); + dh_dbg(dev, "end\r\n"); + return irq; +} + +/* irq_table API */ +int32_t dh_mpf_irq_table_init(struct dh_core_dev *dev) +{ + struct dh_irq_table *irq_table; + struct dh_mpf_irq_table * mpf_irq_table = NULL; + + irq_table = &dev->irq_table; + + mpf_irq_table = kvzalloc(sizeof(*mpf_irq_table), GFP_KERNEL); + if (unlikely(mpf_irq_table == NULL)) + { + return -ENOMEM; + } + + irq_table->priv = mpf_irq_table; + + return 0; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_mpf/irq.h b/src/net/drivers/net/ethernet/dinghai/en_mpf/irq.h new file mode 100755 index 0000000..8cb582b --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_mpf/irq.h @@ -0,0 +1,20 @@ +#ifndef __ZXDH_MPF_IRQ_H__ +#define __ZXDH_MPF_IRQ_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +struct dh_irq *dh_mpf_async_irq_request(struct dh_core_dev *dev); +void dh_mpf_irq_table_destroy(struct dh_core_dev *dev); +int32_t dh_mpf_irq_table_create(struct dh_core_dev *dev); +int32_t dh_mpf_irq_table_init(struct dh_core_dev *dev); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_mpf/tc.c b/src/net/drivers/net/ethernet/dinghai/en_mpf/tc.c new file mode 100755 index 0000000..e69de29 diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/.clang-format b/src/net/drivers/net/ethernet/dinghai/en_np/.clang-format new file mode 100644 index 0000000..983c4fc --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/.clang-format @@ -0,0 +1,176 @@ +--- +# 语言: None, Cpp, Java, JavaScript, ObjC, Proto, TableGen, TextProto +Language: Cpp +# BasedOnStyle: LLVM +# 访问说明符(public、private等)的偏移 +AccessModifierOffset: -4 +# 开括号(开圆括号、开尖括号、开方括号)后的对齐: Align, DontAlign, AlwaysBreak(总是在开括号后换行) +AlignAfterOpenBracket: Align +# 连续赋值时,对齐所有等号 +AlignConsecutiveAssignments: true +# 连续声明时,对齐所有声明的变量名 +AlignConsecutiveDeclarations: false +# 左对齐逃脱换行(使用反斜杠换行)的反斜杠 +AlignEscapedNewlinesLeft: true +# 水平对齐二元和三元表达式的操作数 +AlignOperands: true +# 对齐连续的尾随的注释 +AlignTrailingComments: true +# 允许函数声明的所有参数在放在下一行 +AllowAllParametersOfDeclarationOnNextLine: false +# 允许短的块放在同一行 +AllowShortBlocksOnASingleLine: false +# 允许短的case标签放在同一行 +AllowShortCaseLabelsOnASingleLine: false +# 允许短的函数放在同一行: None, InlineOnly(定义在类中), Empty(空函数), Inline(定义在类中,空函数), All +AllowShortFunctionsOnASingleLine: Empty +# 允许短的if语句保持在同一行 +AllowShortIfStatementsOnASingleLine: false +# 允许短的循环保持在同一行 +AllowShortLoopsOnASingleLine: false +# 总是在定义返回类型后换行(deprecated) +AlwaysBreakAfterDefinitionReturnType: None +# 总是在返回类型后换行: None, All, TopLevel(顶级函数,不包括在类中的函数), +# AllDefinitions(所有的定义,不包括声明), TopLevelDefinitions(所有的顶级函数的定义) +AlwaysBreakAfterReturnType: None +# 总是在多行string字面量前换行 +AlwaysBreakBeforeMultilineStrings: false +# 总是在template声明后换行 +AlwaysBreakTemplateDeclarations: true +# false表示函数实参要么都在同一行,要么都各自一行 +BinPackArguments: true +# false表示所有形参要么都在同一行,要么都各自一行 +BinPackParameters: true +# 大括号换行,只有当BreakBeforeBraces设置为Custom时才有效 +BraceWrapping: + # class定义后面 + AfterClass: false + # 控制语句后面 + AfterControlStatement: false + # enum定义后面 + AfterEnum: false + # 函数定义后面 + AfterFunction: false + # 命名空间定义后面 + AfterNamespace: false + # ObjC定义后面 + AfterObjCDeclaration: false + # struct定义后面 + AfterStruct: false + # union定义后面 + AfterUnion: false + # catch之前 + BeforeCatch: true + # else之前 + BeforeElse: true + # 缩进大括号 + IndentBraces: false +# 在二元运算符前换行: None(在操作符后换行), NonAssignment(在非赋值的操作符前换行), All(在操作符前换行) +BreakBeforeBinaryOperators: NonAssignment +# 在大括号前换行: Attach(始终将大括号附加到周围的上下文), Linux(除函数、命名空间和类定义,与Attach类似), +# Mozilla(除枚举、函数、记录定义,与Attach类似), Stroustrup(除函数定义、catch、else,与Attach类似), +# Allman(总是在大括号前换行), GNU(总是在大括号前换行,并对于控制语句的大括号增加额外的缩进), WebKit(在函数前换行), Custom +# 注:这里认为语句块也属于函数 +BreakBeforeBraces: Allman +# 在三元运算符前换行 +BreakBeforeTernaryOperators: true +# 在构造函数的初始化列表的逗号前换行 +BreakConstructorInitializersBeforeComma: false +# 每行字符的限制,0表示没有限制 +ColumnLimit: 120 +# 描述具有特殊意义的注释的正则表达式,它不应该被分割为多行或以其它方式改变 +CommentPragmas: '^ IWYU pragma:' +# 构造函数的初始化列表要么都在同一行,要么都各自一行 +ConstructorInitializerAllOnOneLineOrOnePerLine: false +# 构造函数的初始化列表的缩进宽度 +ConstructorInitializerIndentWidth: 4 +# 延续的行的缩进宽度 +ContinuationIndentWidth: 4 +# 去除C++11的列表初始化的大括号{后和}前的空格 +Cpp11BracedListStyle: true +# 继承最常用的指针和引用的对齐方式 +DerivePointerAlignment: false +# 关闭格式化 +DisableFormat: false +# 自动检测函数的调用和定义是否被格式为每行一个参数(Experimental) +ExperimentalAutoDetectBinPacking: false +# 宏对齐 使用VSCode所带的clang-format 在linux下也可以支持这个属性:) +AlignConsecutiveMacros: true +# 需要被解读为foreach循环而不是函数调用的宏 +ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] +# 对#include进行排序,匹配了某正则表达式的#include拥有对应的优先级,匹配不到的则默认优先级为INT_MAX(优先级越小排序越靠前), +# 可以定义负数优先级从而保证某些#include永远在最前面 +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + - Regex: '^(<|"(gtest|isl|json)/)' + Priority: 3 + - Regex: '.*' + Priority: 1 +# 缩进case标签 +IndentCaseLabels: true +# 缩进宽度 +IndentWidth: 4 +# 函数返回类型换行时,缩进函数声明或函数定义的函数名 +IndentWrappedFunctionNames: false +# 保留在块开始处的空行 +KeepEmptyLinesAtTheStartOfBlocks: true +# 开始一个块的宏的正则表达式 +MacroBlockBegin: '' +# 结束一个块的宏的正则表达式 +MacroBlockEnd: '' +# 连续空行的最大数量 +MaxEmptyLinesToKeep: 1 +# 命名空间的缩进: None, Inner(缩进嵌套的命名空间中的内容), All +NamespaceIndentation: Inner +# 使用ObjC块时缩进宽度 +ObjCBlockIndentWidth: 4 +# 在ObjC的@property后添加一个空格 +ObjCSpaceAfterProperty: false +# 在ObjC的protocol列表前添加一个空格 +ObjCSpaceBeforeProtocolList: true +# 在call(后对函数调用换行的penalty +PenaltyBreakBeforeFirstCallParameter: 19 +# 在一个注释中引入换行的penalty +PenaltyBreakComment: 300 +# 第一次在<<前换行的penalty +PenaltyBreakFirstLessLess: 120 +# 在一个字符串字面量中引入换行的penalty +PenaltyBreakString: 1000 +# 对于每个在行字符数限制之外的字符的penalty +PenaltyExcessCharacter: 1000000 +# 将函数的返回类型放到它自己的行的penalty +PenaltyReturnTypeOnItsOwnLine: 60 +# 指针和引用的对齐: Left, Right, Middle +PointerAlignment: Right +# 允许重新排版注释 +ReflowComments: true +# 允许排序#include +SortIncludes: false +# 在C风格类型转换后添加空格 +SpaceAfterCStyleCast: false +# 在赋值运算符之前添加空格 +SpaceBeforeAssignmentOperators: true +# 开圆括号之前添加一个空格: Never, ControlStatements, Always +SpaceBeforeParens: ControlStatements +# 在空的圆括号中添加空格 +SpaceInEmptyParentheses: false +# 在尾随的评论前添加的空格数(只适用于//) +SpacesBeforeTrailingComments: 2 +# 在尖括号的<后和>前添加空格 +SpacesInAngles: false +# 在容器(ObjC和JavaScript的数组和字典等)字面量中添加空格 +SpacesInContainerLiterals: false +# 在C风格类型转换的括号中添加空格 +SpacesInCStyleCastParentheses: false +# 在圆括号的(后和)前添加空格 +SpacesInParentheses: false +# 在方括号的[后和]前添加空格,lamda表达式和未指明大小的数组的声明不受影响 +SpacesInSquareBrackets: false +# 标准: Cpp03, Cpp11, Auto +Standard: Cpp03 +# tab宽度 +TabWidth: 4 +# 使用tab字符: Never, ForIndentation, ForContinuationAndIndentation, Always +UseTab: Never +... diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/.gitignore b/src/net/drivers/net/ethernet/dinghai/en_np/.gitignore new file mode 100644 index 0000000..8e5814e --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/.gitignore @@ -0,0 +1,13 @@ +*.o.cmd +*.o +*.o.d +*.ko.cmd +*.symvers +*.ko +*.mod.c +*.order +*.symvers.cmd +*.mod.cmd +*.order.cmd +*.mod +.tmp_versions/ diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/Makefile b/src/net/drivers/net/ethernet/dinghai/en_np/Makefile new file mode 100644 index 0000000..973d07b --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/Makefile @@ -0,0 +1,21 @@ +subdirs := en_np/agent/ +subdirs += en_np/cmd/ +subdirs += en_np/comm/ +subdirs += en_np/driver/ +subdirs += en_np/init/ +subdirs += en_np/netlink/ +subdirs += en_np/sdk/ +subdirs += en_np/table/ +subdirs += en_np/qos/ +subdirs += en_np/fc/ + +dinghai_root := $(CWD)/drivers/net/ethernet/dinghai +include $(dinghai_root)/en_np/Makefile.include + +src_files := +include $(foreach subdir, $(subdirs), $(dinghai_root)/$(subdir)Kbuild.include) +obj_files := $(src_files:.c=.o) + +obj-$(CONFIG_DINGHAI_NP) += zxdh_np.o +zxdh_np-y := $(obj_files) +# zxdh_np-$(CONFIG_DINGHAI_DH_CMD) += dh_cmd.o cmd/msg_chan_netlink.o cmd/msg_chan_lock.o diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/Makefile.include b/src/net/drivers/net/ethernet/dinghai/en_np/Makefile.include new file mode 100644 index 0000000..2ad68fe --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/Makefile.include @@ -0,0 +1,58 @@ +abs_include := -I$(dinghai_root)/en_np/agent/include +abs_include += -I$(dinghai_root)/en_np/cmd/include +abs_include += -I$(dinghai_root)/en_np/comm/include +abs_include += -I$(dinghai_root)/en_np/driver/include +abs_include += -I$(dinghai_root)/en_np/init/include +abs_include += -I$(dinghai_root)/en_np/netlink/include +abs_include += -I$(dinghai_root)/en_np/sdk/include/api +abs_include += -I$(dinghai_root)/en_np/sdk/include/dev/chip +abs_include += -I$(dinghai_root)/en_np/sdk/include/dev/init +abs_include += -I$(dinghai_root)/en_np/sdk/include/dev/module/cfg +abs_include += -I$(dinghai_root)/en_np/sdk/include/dev/module/dbg +abs_include += -I$(dinghai_root)/en_np/sdk/include/dev/module/ddos +abs_include += -I$(dinghai_root)/en_np/sdk/include/dev/module/dma +abs_include += -I$(dinghai_root)/en_np/sdk/include/dev/module/nppu +abs_include += -I$(dinghai_root)/en_np/sdk/include/dev/module/oam +abs_include += -I$(dinghai_root)/en_np/sdk/include/dev/module/ppu +abs_include += -I$(dinghai_root)/en_np/sdk/include/dev/module/se +abs_include += -I$(dinghai_root)/en_np/sdk/include/dev/module/table/sdt +abs_include += -I$(dinghai_root)/en_np/sdk/include/dev/module/table/se +abs_include += -I$(dinghai_root)/en_np/sdk/include/dev/module/tm +abs_include += -I$(dinghai_root)/en_np/sdk/include/dev/reg +abs_include += -I$(dinghai_root)/en_np/sdk/include/diag +abs_include += -I$(dinghai_root)/en_np/table/include +abs_include += -I$(dinghai_root)/en_np/qos/include +abs_include += -I$(dinghai_root)/en_np/fc/include + +abs_include += -I$(dinghai_root)/../../../../include/linux/dinghai +# ZF_MPF delete -msse -msse2 +# ccflags-y += $(abs_include) -DMACRO_CPU64 -DDPP_FOR_PCIE -DDPP_FLOW_HW_INIT +ccflags-y += $(abs_include) -DMACRO_CPU64 -DDPP_FOR_PCIE + +# ifeq (${ARCH},arm64) +# ccflags-y += -DDPP_FOR_AARCH64 +# endif + +dpp-rm-files := *.ko +dpp-rm-files += *.mod.c +dpp-rm-files += *.symvers +dpp-rm-files += *.order +dpp-rm-files += *.o +dpp-rm-files += .*.cmd +dpp-rm-files += .tmp_versions +dpp-rm-files += *.mod +export dpp-rm-files + +clean := -f $(DPP_KO_MAKEFILE_DIR)/Makefile.clean obj + +# echo command. +# Short version is used, if $(quiet) equals `quiet_', otherwise full one. +echo-cmd = $(if $($(quiet)cmd_$(1)), echo ' $($(quiet)cmd_$(1))';) + +# sink stdout for 'make -s' + redirect := + quiet_redirect := +silent_redirect := exec >/dev/null; + +# printing commands +cmd = @set -e; $(echo-cmd) $($(quiet)redirect) $(cmd_$(1)) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/agent/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/agent/Kbuild.include new file mode 100644 index 0000000..2c53485 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/agent/Kbuild.include @@ -0,0 +1,4 @@ +cur_dir := en_np/agent/ +subdirs := source/ +src_files += +include $(foreach subdir, $(subdirs), $(dinghai_root)/$(cur_dir)$(subdir)/Kbuild.include) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/agent/include/dpp_agent_channel.h b/src/net/drivers/net/ethernet/dinghai/en_np/agent/include/dpp_agent_channel.h new file mode 100644 index 0000000..5bc1759 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/agent/include/dpp_agent_channel.h @@ -0,0 +1,158 @@ +#ifndef DPP_AGENT_CHANNEL_H +#define DPP_AGENT_CHANNEL_H + +#include "zxic_common.h" +#include "dpp_dev.h" +#include "dpp_type_api.h" + +#define BUFFER_LEN_MAX (256) +#define REG_REPS_LEN (8) +#define CHANNEL_REPS_LEN (4) +#define NP_AGENT_ID (16) +#define MSG_REP_OFFSET (4) +#define MSG_REP_VALID (0Xff) +#define MSG_REP_LEN_OFFSET (1) +#define SCHE_RSP_LEN (2) +#define SCHE_REQ_VALID (0Xffff) +#define PROFILEID_REQ_VALID (0Xffff) +#define EPID_LEVEL (4) + +#pragma pack(1) + +typedef enum dpp_agent_msg_type +{ + DPP_REG_MSG = 0, + DPP_DTB_MSG, + DPP_TM_MSG, + DPP_PLCR_MSG, + DPP_TLB_MSG, + DPP_FLR_MSG, + DPP_RESET_MSG, + DPP_MSG_MAX +} MSG_TYPE_E; + +typedef enum dpp_agent_msg_oper +{ + DPP_WR = 0, + DPP_RD, + DPP_WR_RD_MAX +} MSG_OPER_E; + +typedef enum dpp_msg_dtb_oper +{ + QUEUE_REQUEST = 0, + QUEUE_RELEASE = 1, +} MSG_DTB_OPER_E; + +typedef enum dpp_msg_tm_oper +{ + SEID_REQUEST = 0, + SEID_RELEASE = 1, + SEID_QUERY = 2 +} MSG_TM_OPER_E; + +typedef enum dpp_msg_plcr_oper +{ + PROFILEID_REQUEST = 0, + PROFILEID_RELEASE = 1, +} MSG_PLCR_OPER_E; +typedef enum dpp_cosq_sche_type +{ + FQ_SCHE = 0, + FQ2_SCHE = 1, + FQ4_SCHE = 2, + FQ8_SCHE = 3, + SP_SCHE = 4, + WFQ_SCHE = 5, + WFQ2_SCHE = 6, + WFQ4_SCHE = 7, + WFQ8_SCHE = 8, + FLOW_SCHE = 9, + SCHE_TYPE = 10 +} DPP_COSQ_SCHE_TYPE; + +typedef enum dpp_agent_msg_csflag +{ + DPP_CS_ADDR_FLAG = 0, + DPP_CS_REGNO_FLAG, + DPP_CS_FLAG_MAX +} MSG_CSFLAG_E; + +typedef struct dpp_agent_channel_reg_msg +{ + ZXIC_UINT8 devId; + ZXIC_UINT8 type; + ZXIC_UINT8 subtype; + ZXIC_UINT8 oper; + ZXIC_UINT32 reg_no; + ZXIC_UINT32 addr; + ZXIC_UINT32 val_len; + ZXIC_UINT32 val[32]; +} DPP_AGENT_CHANNEL_REG_MSG_T; + +typedef struct dpp_agent_channel_dtb_msg +{ + ZXIC_UINT8 devId; + ZXIC_UINT8 type; + ZXIC_UINT8 oper; + ZXIC_UINT8 rsv; + ZXIC_UINT8 name[32]; + ZXIC_UINT32 vport; + ZXIC_UINT32 queue_id; +} DPP_AGENT_CHANNEL_DTB_MSG_T; +typedef struct dpp_agent_channel_tm_msg +{ + ZXIC_UINT8 devId; + ZXIC_UINT8 type; + ZXIC_UINT8 oper; + ZXIC_UINT8 num; + ZXIC_UINT32 port; + ZXIC_UINT32 vport; + ZXIC_UINT32 sche_level; + ZXIC_UINT32 sche_type; + ZXIC_UINT32 se_id; +} DPP_AGENT_CHANNEL_TM_MSG_T; +typedef struct dpp_agent_channel_plcr_msg +{ + ZXIC_UINT8 devId; + ZXIC_UINT8 type; + ZXIC_UINT8 oper; + ZXIC_UINT8 rsv; + ZXIC_UINT32 vport; + ZXIC_UINT32 car_type; + ZXIC_UINT32 profile_id; +} DPP_AGENT_CHANNEL_PLCR_MSG_T; +typedef struct dpp_agent_channel_msg +{ + ZXIC_UINT32 msg_len; + ZXIC_VOID *msg; +} DPP_AGENT_CHANNEL_MSG_T; + +#pragma pack() + +DPP_STATUS dpp_agent_channel_init(ZXIC_VOID); +DPP_STATUS dpp_agent_channel_exit(ZXIC_VOID); +DPP_STATUS dpp_agent_channel_sync_send(DPP_DEV_T *dev, DPP_AGENT_CHANNEL_MSG_T *pMsg, + ZXIC_UINT32 *pData, ZXIC_UINT32 rep_len); +DPP_STATUS dpp_agent_channel_reg_sync_send(DPP_DEV_T *dev, DPP_AGENT_CHANNEL_REG_MSG_T *pMsg, + ZXIC_UINT32 *pData, ZXIC_UINT32 rep_len); +DPP_STATUS dpp_agent_channel_reg_write(DPP_DEV_T *dev, ZXIC_UINT32 reg_type, ZXIC_UINT32 reg_no, + ZXIC_UINT32 reg_width, ZXIC_UINT32 addr, ZXIC_UINT32 *pData); +DPP_STATUS dpp_agent_channel_reg_read(DPP_DEV_T *dev, ZXIC_UINT32 reg_type, ZXIC_UINT32 reg_no, + ZXIC_UINT32 reg_width, ZXIC_UINT32 addr, ZXIC_UINT32 *pData); +DPP_STATUS dpp_agent_channel_dtb_sync_send(DPP_DEV_T *dev, DPP_AGENT_CHANNEL_DTB_MSG_T *pMsg, + ZXIC_UINT32 *pData, ZXIC_UINT32 rep_len); +DPP_STATUS dpp_agent_channel_dtb_queue_request(DPP_DEV_T *dev, ZXIC_CONST ZXIC_UINT8 *p_name, ZXIC_UINT32 vport_info, ZXIC_UINT32 *p_queue_id); +DPP_STATUS dpp_agent_channel_dtb_queue_release(DPP_DEV_T *dev, ZXIC_CONST ZXIC_UINT8 *p_name, ZXIC_UINT32 queue_id); + +DPP_STATUS dpp_agent_channel_tm_sync_send(DPP_DEV_T *dev, DPP_AGENT_CHANNEL_TM_MSG_T *pMsg, ZXIC_UINT32 *pData, ZXIC_UINT32 rep_len); +DPP_STATUS dpp_agent_channel_tm_seid_request(DPP_DEV_T *dev, ZXIC_UINT32 port, ZXIC_UINT32 vport, ZXIC_UINT32 sche_level, ZXIC_UINT32 sche_type, ZXIC_UINT32 num, ZXIC_UINT32 *p_se_id); +DPP_STATUS dpp_agent_channel_tm_seid_release(DPP_DEV_T *dev, ZXIC_UINT32 port, ZXIC_UINT32 vport, ZXIC_UINT32 sche_level, ZXIC_UINT32 sche_type, ZXIC_UINT32 num, ZXIC_UINT32 se_id); + +DPP_STATUS dpp_agent_channel_tm_base_node_get(DPP_DEV_T *dev, ZXIC_UINT32 port, ZXIC_UINT32 vport, ZXIC_UINT32 *p_se_id); + +DPP_STATUS dpp_agent_channel_plcr_sync_send(DPP_DEV_T *dev, DPP_AGENT_CHANNEL_PLCR_MSG_T *pMsg, ZXIC_UINT32 *pData, ZXIC_UINT32 rep_len); +DPP_STATUS dpp_agent_channel_plcr_profileid_request(DPP_DEV_T *dev, ZXIC_UINT32 vport, ZXIC_UINT32 car_type, ZXIC_UINT32 *p_profileid); +DPP_STATUS dpp_agent_channel_plcr_profileid_release(DPP_DEV_T *dev, ZXIC_UINT32 vport, ZXIC_UINT32 car_type, ZXIC_UINT32 profileid); + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/agent/source/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/agent/source/Kbuild.include new file mode 100644 index 0000000..557a672 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/agent/source/Kbuild.include @@ -0,0 +1,2 @@ +cur_dir := en_np/agent/source/ +src_files += $(addprefix $(cur_dir),$(notdir $(wildcard $(dinghai_root)/$(cur_dir)*.c))) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/agent/source/dpp_agent_channel.c b/src/net/drivers/net/ethernet/dinghai/en_np/agent/source/dpp_agent_channel.c new file mode 100644 index 0000000..e280cb7 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/agent/source/dpp_agent_channel.c @@ -0,0 +1,476 @@ +#include "dpp_agent_channel.h" +#include "dh_cmd.h" +#include "dpp_dev.h" + +DPP_STATUS dpp_agent_channel_init() +{ + // zxdh_bar_msg_chan_init(); + return DPP_OK; +} + +DPP_STATUS dpp_agent_channel_exit() +{ + // zxdh_bar_msg_chan_remove(); + return DPP_OK; +} + +DPP_STATUS dpp_agent_channel_reg_sync_send(DPP_DEV_T *dev, DPP_AGENT_CHANNEL_REG_MSG_T *pMsg, + ZXIC_UINT32 *pData, ZXIC_UINT32 rep_len) +{ + DPP_STATUS ret = DPP_OK; + DPP_AGENT_CHANNEL_MSG_T agentMsg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(pMsg); + + agentMsg.msg = (ZXIC_VOID *)pMsg; + agentMsg.msg_len = sizeof(DPP_AGENT_CHANNEL_REG_MSG_T); + + ret = dpp_agent_channel_sync_send(dev, &agentMsg, pData, rep_len); + if (DPP_OK != ret) + { + ZXIC_COMM_TRACE_ERROR("%s: dpp_agent_channel_sync_send failed\n", __FUNCTION__); + return DPP_ERR; + } + + ret = *pData; + if (DPP_OK != ret) + { + ZXIC_COMM_TRACE_ERROR("%s: dpp_agent_channel_sync_send failed in buffer\n", __FUNCTION__); + return DPP_ERR; + } + + return DPP_OK; +} + +DPP_STATUS dpp_agent_channel_sync_send(DPP_DEV_T *dev, DPP_AGENT_CHANNEL_MSG_T *pMsg, + ZXIC_UINT32 *pData, ZXIC_UINT32 rep_len) +{ + DPP_STATUS ret = DPP_OK; + ZXIC_UINT8 *reply_ptr = NULL; + ZXIC_UINT16 reply_msg_len = 0; + ZXIC_UINT32 *recv_buffer = NULL; + + struct zxdh_pci_bar_msg in = {0}; + struct zxdh_msg_recviver_mem result = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(pMsg); + + recv_buffer = (ZXIC_UINT32 *)kmalloc(rep_len + CHANNEL_REPS_LEN, GFP_KERNEL); + ZXIC_COMM_CHECK_POINT(recv_buffer); + ZXIC_COMM_MEMSET(recv_buffer, 0, rep_len + CHANNEL_REPS_LEN); + + in.virt_addr = DEV_PCIE_MSG_ADDR(dev); + in.payload_addr = pMsg->msg; + in.payload_len = pMsg->msg_len; + in.src = MSG_CHAN_END_PF; + in.dst = MSG_CHAN_END_RISC; + in.event_id = NP_AGENT_ID; + in.src_pcieid = DEV_PCIE_ID(dev); + + result.buffer_len = rep_len + CHANNEL_REPS_LEN; + result.recv_buffer = recv_buffer; + + ZXIC_COMM_TRACE_DEBUG("%s: in.virt_addr 0x%llx.\n", __FUNCTION__, in.virt_addr); + + ret = zxdh_bar_chan_sync_msg_send(&in, &result); + ZXIC_COMM_CHECK_RC_MEMORY_FREE(ret, "zxdh_bar_chan_sync_msg_send", recv_buffer); + + reply_ptr = (ZXIC_UINT8 *)(result.recv_buffer); + if (MSG_REP_VALID == *reply_ptr) + { + reply_msg_len = *(ZXIC_UINT16 *)(reply_ptr + MSG_REP_LEN_OFFSET); + memcpy(pData, reply_ptr + MSG_REP_OFFSET, ((reply_msg_len > rep_len) ? rep_len : reply_msg_len)); + + kfree(recv_buffer); + return DPP_OK; + } + + kfree(recv_buffer); + + ZXIC_COMM_TRACE_ERROR("%s: zxdh_bar_chan_sync_msg_send failed.\n", __FUNCTION__); + + return DPP_ERR; +} + +DPP_STATUS dpp_agent_channel_reg_write(DPP_DEV_T *dev, ZXIC_UINT32 reg_type, ZXIC_UINT32 reg_no, + ZXIC_UINT32 reg_width, ZXIC_UINT32 addr, ZXIC_UINT32 *pData) +{ + DPP_STATUS ret = 0; + ZXIC_UINT32 resp_len = 0; + ZXIC_UINT8 *resp_buffer = NULL; + + DPP_AGENT_CHANNEL_REG_MSG_T msgcfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(pData); + + msgcfg.devId = 0; + msgcfg.type = DPP_REG_MSG; + msgcfg.subtype = reg_type; + msgcfg.oper = DPP_WR; + msgcfg.reg_no = reg_no; + msgcfg.addr = addr; + msgcfg.val_len = reg_width / 4; + memcpy(msgcfg.val, pData, reg_width); + + resp_len = reg_width + 4; + resp_buffer = (ZXIC_UINT8 *)kmalloc(resp_len, GFP_KERNEL); + ZXIC_COMM_CHECK_POINT(resp_buffer); + + memset(resp_buffer, 0, resp_len); + + ret = dpp_agent_channel_reg_sync_send(dev, &msgcfg, (ZXIC_UINT32 *)resp_buffer, resp_len); + + if (DPP_OK != ret) + { + ZXIC_COMM_TRACE_ERROR("%s: dpp_agent_channel_reg_sync_send failed\n", __FUNCTION__); + kfree(resp_buffer); + return DPP_ERR; + } + + if (DPP_OK != *((ZXIC_UINT32 *)resp_buffer)) + { + ZXIC_COMM_TRACE_ERROR("%s: dpp_agent_channel_reg_sync_send failed in buffer\n", __FUNCTION__); + kfree(resp_buffer); + return DPP_ERR; + } + + memcpy(pData, resp_buffer + 4, reg_width); + + kfree(resp_buffer); + + return DPP_OK; +} + +DPP_STATUS dpp_agent_channel_reg_read(DPP_DEV_T *dev, ZXIC_UINT32 reg_type, ZXIC_UINT32 reg_no, ZXIC_UINT32 reg_width, ZXIC_UINT32 addr, + ZXIC_UINT32 *pData) +{ + DPP_STATUS ret = 0; + ZXIC_UINT32 resp_len = 0; + ZXIC_UINT8 *resp_buffer = NULL; + + DPP_AGENT_CHANNEL_REG_MSG_T msgcfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(pData); + + msgcfg.devId = 0; + msgcfg.type = DPP_REG_MSG; + msgcfg.subtype = reg_type; + msgcfg.oper = DPP_RD; + msgcfg.reg_no = reg_no; + msgcfg.addr = addr; + msgcfg.val_len = reg_width / 4; + + resp_len = reg_width + 4; + resp_buffer = (ZXIC_UINT8 *)kmalloc(resp_len, GFP_KERNEL); + ZXIC_COMM_CHECK_POINT(resp_buffer); + + memset(resp_buffer, 0, resp_len); + + ret = dpp_agent_channel_reg_sync_send(dev, &msgcfg, (ZXIC_UINT32 *)resp_buffer, resp_len); + + if (DPP_OK != ret) + { + ZXIC_COMM_TRACE_ERROR("%s: dpp_agent_channel_reg_sync_send failed\n", __FUNCTION__); + kfree(resp_buffer); + return DPP_ERR; + } + + if (DPP_OK != *((ZXIC_UINT32 *)resp_buffer)) + { + ZXIC_COMM_TRACE_ERROR("%s: dpp_agent_channel_reg_sync_send failed in buffer\n", __FUNCTION__); + kfree(resp_buffer); + return DPP_ERR; + } + + memcpy(pData, resp_buffer + 4, reg_width); + + kfree(resp_buffer); + + return DPP_OK; +} + +DPP_STATUS dpp_agent_channel_dtb_sync_send(DPP_DEV_T *dev, DPP_AGENT_CHANNEL_DTB_MSG_T *pMsg, ZXIC_UINT32 *pData, ZXIC_UINT32 rep_len) +{ + DPP_STATUS ret = DPP_OK; + + DPP_AGENT_CHANNEL_MSG_T agentMsg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(pMsg); + ZXIC_COMM_CHECK_POINT(pData); + + agentMsg.msg = (ZXIC_VOID *)pMsg; + agentMsg.msg_len = sizeof(DPP_AGENT_CHANNEL_DTB_MSG_T); + + ret = dpp_agent_channel_sync_send(dev, &agentMsg, pData, rep_len); + if (DPP_OK != ret) + { + ZXIC_COMM_TRACE_ERROR("%s: dpp_agent_channel_sync_send failed\n", __FUNCTION__); + return DPP_ERR; + } + + return DPP_OK; +} + +DPP_STATUS dpp_agent_channel_dtb_queue_request(DPP_DEV_T *dev, ZXIC_CONST ZXIC_UINT8 *p_name, ZXIC_UINT32 vport_info, ZXIC_UINT32 *p_queue_id) +{ + DPP_STATUS ret = DPP_OK; + ZXIC_UINT32 rsp_buff[2] = {0}; + ZXIC_UINT32 msg_result = 0; + ZXIC_UINT32 queue_id = 0; + + DPP_AGENT_CHANNEL_DTB_MSG_T msgcfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + + msgcfg.devId = DEV_ID(dev); + msgcfg.type = DPP_DTB_MSG; + msgcfg.oper = QUEUE_REQUEST; + ZXIC_COMM_MEMCPY(msgcfg.name, p_name, ZXIC_COMM_STRLEN(p_name)); + msgcfg.vport = vport_info; + + ZXIC_COMM_TRACE_INFO("%s: msgcfg.name = %s.\n", __FUNCTION__, msgcfg.name); + + ret = dpp_agent_channel_dtb_sync_send(dev, &msgcfg, rsp_buff, ZXIC_SIZEOF(rsp_buff)); + ZXIC_COMM_CHECK_RC_NO_ASSERT(ret, "dpp_agent_channel_dtb_sync_send"); + + msg_result = rsp_buff[0]; + queue_id = rsp_buff[1]; + + ZXIC_COMM_TRACE_INFO("%s: msg_result: %d.\n", __FUNCTION__, msg_result); + ZXIC_COMM_TRACE_INFO("%s: queue_id: %d.\n", __FUNCTION__, queue_id); + + *p_queue_id = queue_id; + + return msg_result; +} + +DPP_STATUS dpp_agent_channel_dtb_queue_release(DPP_DEV_T *dev, ZXIC_CONST ZXIC_UINT8 *p_name, ZXIC_UINT32 queue_id) +{ + DPP_STATUS ret = DPP_OK; + ZXIC_UINT32 msg_result = 0; + ZXIC_UINT32 rsp_buff[2] = {0}; + + DPP_AGENT_CHANNEL_DTB_MSG_T msgcfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + + msgcfg.devId = DEV_ID(dev); + msgcfg.type = DPP_DTB_MSG; + msgcfg.oper = QUEUE_RELEASE; + msgcfg.queue_id = queue_id; + ZXIC_COMM_MEMCPY(msgcfg.name, p_name, ZXIC_COMM_STRLEN(p_name)); + + ZXIC_COMM_TRACE_INFO("%s: msgcfg.name = %s.\n", __FUNCTION__, msgcfg.name); + + ret = dpp_agent_channel_dtb_sync_send(dev, &msgcfg, rsp_buff, ZXIC_SIZEOF(rsp_buff)); + ZXIC_COMM_CHECK_RC_NO_ASSERT(ret, "dpp_agent_channel_dtb_sync_send"); + + msg_result = rsp_buff[0]; + ZXIC_COMM_TRACE_INFO("%s: msg_result: %d.\n", __FUNCTION__, msg_result); + + return msg_result; +} + +DPP_STATUS dpp_agent_channel_tm_sync_send(DPP_DEV_T *dev, DPP_AGENT_CHANNEL_TM_MSG_T *pMsg, ZXIC_UINT32 *pData, ZXIC_UINT32 rep_len) +{ + DPP_STATUS ret = DPP_OK; + DPP_AGENT_CHANNEL_MSG_T agentMsg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(pMsg); + ZXIC_COMM_CHECK_POINT(pData); + + agentMsg.msg = (ZXIC_VOID *)pMsg; + agentMsg.msg_len = sizeof(DPP_AGENT_CHANNEL_TM_MSG_T); + + ret = dpp_agent_channel_sync_send(dev, &agentMsg, pData, rep_len); + + if (DPP_OK != ret) + { + ZXIC_COMM_TRACE_ERROR("%s: dpp_agent_channel_sync_send failed\n", __FUNCTION__); + return DPP_ERR; + } + + // ret = *(ZXIC_UINT8 *)pData; + // if (DPP_OK != ret) + // { + // ZXIC_COMM_TRACE_ERROR("%s: dpp_agent_channel_tm_sync_send failed in buffer\n", __FUNCTION__); + // return DPP_ERR; + // } + + return DPP_OK; +} + +DPP_STATUS dpp_agent_channel_tm_seid_request(DPP_DEV_T *dev, ZXIC_UINT32 port, ZXIC_UINT32 vport, ZXIC_UINT32 sche_level, ZXIC_UINT32 sche_type, ZXIC_UINT32 num, ZXIC_UINT32 *p_se_id) +{ + DPP_STATUS ret = DPP_OK; + ZXIC_UINT32 resp_buffer[2] = {0}; + + DPP_AGENT_CHANNEL_TM_MSG_T msgcfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(p_se_id); + + msgcfg.devId = 0; + msgcfg.type = DPP_TM_MSG; + msgcfg.oper = SEID_REQUEST; + msgcfg.port = port; + msgcfg.vport = vport; + msgcfg.sche_level = sche_level; + msgcfg.sche_type = sche_type; + msgcfg.num = num; + msgcfg.se_id = SCHE_REQ_VALID; + + if (FLOW_SCHE != sche_type) + { + msgcfg.num = 1; + } + + ret = dpp_agent_channel_tm_sync_send(dev, &msgcfg, resp_buffer, sizeof(resp_buffer)); + ZXIC_COMM_CHECK_RC_NO_ASSERT(ret, "dpp_agent_channel_tm_sync_send"); + + memcpy(p_se_id, resp_buffer, sizeof(ZXIC_UINT32)*SCHE_RSP_LEN); + + return ret; +} + +DPP_STATUS dpp_agent_channel_tm_seid_release(DPP_DEV_T *dev, ZXIC_UINT32 port, ZXIC_UINT32 vport, ZXIC_UINT32 sche_level, ZXIC_UINT32 sche_type, ZXIC_UINT32 num, ZXIC_UINT32 se_id) +{ + DPP_STATUS ret = DPP_OK; + ZXIC_UINT32 resp_buffer[2] = {0}; + + DPP_AGENT_CHANNEL_TM_MSG_T msgcfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + + msgcfg.devId = 0; + msgcfg.type = DPP_TM_MSG; + msgcfg.oper = SEID_RELEASE; + msgcfg.port = port; + msgcfg.vport = vport; + msgcfg.sche_level = sche_level; + msgcfg.sche_type = sche_type; + msgcfg.num = num; + msgcfg.se_id = se_id; + + if (FLOW_SCHE != sche_type) + { + msgcfg.num = 1; + } + + ret = dpp_agent_channel_tm_sync_send(dev, &msgcfg, resp_buffer, sizeof(resp_buffer)); + ZXIC_COMM_CHECK_RC_NO_ASSERT(ret, "dpp_agent_channel_tm_sync_send"); + + ret = *(ZXIC_UINT8*)resp_buffer; + + return ret; +} + +DPP_STATUS dpp_agent_channel_tm_base_node_get(DPP_DEV_T *dev, ZXIC_UINT32 port, ZXIC_UINT32 vport, ZXIC_UINT32 *p_se_id) +{ + DPP_STATUS ret = DPP_OK; + ZXIC_UINT32 resp_buffer[2] = {0}; + + DPP_AGENT_CHANNEL_TM_MSG_T msgcfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(p_se_id); + + msgcfg.devId = 0; + msgcfg.type = DPP_TM_MSG; + msgcfg.oper = SEID_QUERY; + msgcfg.port = port; + msgcfg.vport = vport; + msgcfg.sche_level = EPID_LEVEL; + msgcfg.sche_type = WFQ_SCHE; + msgcfg.num = 1; + msgcfg.se_id = SCHE_REQ_VALID; + + ret = dpp_agent_channel_tm_sync_send(dev, &msgcfg, resp_buffer, sizeof(resp_buffer)); + ZXIC_COMM_CHECK_RC_NO_ASSERT(ret, "dpp_agent_channel_tm_sync_send"); + + memcpy(p_se_id, resp_buffer, sizeof(ZXIC_UINT32)*SCHE_RSP_LEN); + + return ret; +} + +DPP_STATUS dpp_agent_channel_plcr_sync_send(DPP_DEV_T *dev, DPP_AGENT_CHANNEL_PLCR_MSG_T *pMsg, ZXIC_UINT32 *pData, ZXIC_UINT32 rep_len) +{ + DPP_STATUS ret = DPP_OK; + DPP_AGENT_CHANNEL_MSG_T agentMsg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(pMsg); + + agentMsg.msg = (ZXIC_VOID *)pMsg; + agentMsg.msg_len = sizeof(DPP_AGENT_CHANNEL_PLCR_MSG_T); + + ret = dpp_agent_channel_sync_send(dev, &agentMsg, pData, rep_len); + if (DPP_OK != ret) + { + ZXIC_COMM_TRACE_ERROR("%s: dpp_agent_channel_sync_send failed\n", __FUNCTION__); + return DPP_ERR; + } + + // ret = *(ZXIC_UINT8*)pData; + // if (DPP_OK != ret) + // { + // ZXIC_COMM_TRACE_ERROR("%s: dpp_agent_channel_sync_send failed in buffer\n", __FUNCTION__); + // return DPP_ERR; + // } + + return DPP_OK; +} + +DPP_STATUS dpp_agent_channel_plcr_profileid_request(DPP_DEV_T *dev, ZXIC_UINT32 vport, ZXIC_UINT32 car_type, ZXIC_UINT32 *p_profileid) +{ + DPP_STATUS ret = DPP_OK; + ZXIC_UINT32 resp_buffer[2] = {0}; + + DPP_AGENT_CHANNEL_PLCR_MSG_T msgcfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(p_profileid); + + msgcfg.devId = 0; + msgcfg.type = DPP_PLCR_MSG; + msgcfg.oper = PROFILEID_REQUEST; + msgcfg.vport = vport; + msgcfg.car_type = car_type; + msgcfg.profile_id = PROFILEID_REQ_VALID; + + ret = dpp_agent_channel_plcr_sync_send(dev, &msgcfg, resp_buffer, sizeof(resp_buffer)); + ZXIC_COMM_CHECK_RC_NO_ASSERT(ret, "dpp_agent_channel_plcr_sync_send"); + + memcpy(p_profileid, resp_buffer, sizeof(ZXIC_UINT32)*SCHE_RSP_LEN); + + return ret; +} + +DPP_STATUS dpp_agent_channel_plcr_profileid_release(DPP_DEV_T *dev, ZXIC_UINT32 vport, ZXIC_UINT32 car_type, ZXIC_UINT32 profileid) +{ + DPP_STATUS ret = DPP_OK; + ZXIC_UINT32 resp_buffer[2] = {0}; + + DPP_AGENT_CHANNEL_PLCR_MSG_T msgcfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + + msgcfg.devId = 0; + msgcfg.type = DPP_PLCR_MSG; + msgcfg.oper = PROFILEID_RELEASE; + msgcfg.vport = vport; + msgcfg.profile_id = profileid; + + ret = dpp_agent_channel_plcr_sync_send(dev, &msgcfg, resp_buffer, sizeof(resp_buffer)); + ZXIC_COMM_CHECK_RC_NO_ASSERT(ret, "dpp_agent_channel_plcr_sync_send"); + + ret = *(ZXIC_UINT8*)resp_buffer; + + return ret; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/cmd/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/cmd/Kbuild.include new file mode 100644 index 0000000..8b4d1a2 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/cmd/Kbuild.include @@ -0,0 +1,4 @@ +cur_dir := en_np/cmd/ +subdirs := source/ +src_files += +include $(foreach subdir, $(subdirs), $(dinghai_root)/$(cur_dir)$(subdir)/Kbuild.include) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/cmd/include/dpp_cmd_init.h b/src/net/drivers/net/ethernet/dinghai/en_np/cmd/include/dpp_cmd_init.h new file mode 100644 index 0000000..1f3e6bf --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/cmd/include/dpp_cmd_init.h @@ -0,0 +1,16 @@ +//generate function cmdlist from symbol file + +#ifndef DPP_CMD_INIT_H +#define DPP_CMD_INIT_H + +#include "zxic_common.h" + +#define MSG_ID_MSG_DPP_CMD_SHELL ((ZXIC_UINT32)(100)) +typedef struct { + ZXIC_UINT32 msgId; + ZXIC_UINT8 command[256]; +} T_MSG_CMD_SHELL; + +ZXIC_UINT32 dpp_cmd_init(ZXIC_VOID); + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/cmd/include/dpp_cmd_shell.h b/src/net/drivers/net/ethernet/dinghai/en_np/cmd/include/dpp_cmd_shell.h new file mode 100644 index 0000000..a12705a --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/cmd/include/dpp_cmd_shell.h @@ -0,0 +1,49 @@ +//generate function cmdlist from symbol file + +#ifndef DPP_CMD_SHELL_H +#define DPP_CMD_SHELL_H + +#include "zxic_common.h" +#include "dpp_dtb.h" +#include "dpp_tbl_diag.h" + +typedef struct +{ + ZXIC_CHAR *name; + ZXIC_CHAR *doc; + ZXIC_VOID *func; +} DPP_COMMAND; + +ZXIC_UINT32 dpp_cmd_help(ZXIC_VOID); + +DPP_COMMAND dpp_commands[] = { + { "dpp_cmd_help", "none", dpp_cmd_help}, + { "zxic_comm_set_print_level", "debug_level", zxic_comm_set_print_level }, + { "zxic_comm_set_print_en", "enable", zxic_comm_set_print_en }, + { "diag_dpp_vport_mac_add", "slot vport mac0...5", diag_dpp_vport_mac_add }, + { "diag_dpp_vport_mac_del", "slot vport mac0...5", diag_dpp_vport_mac_del }, + { "diag_dpp_vport_mac_prt", "slot vport", diag_dpp_vport_mac_prt }, + { "diag_dpp_vport_mc_mac_add", "slot vport mac0...5", diag_dpp_vport_mc_mac_add }, + { "diag_dpp_vport_mc_mac_del", "slot vport mac0...5", diag_dpp_vport_mc_mac_del }, + { "diag_dpp_vport_mc_mac_prt", "slot vport", diag_dpp_vport_mc_mac_prt }, + { "diag_dpp_vport_table_set", "slot vport attr value", diag_dpp_vport_table_set }, + { "diag_dpp_vport_table_prt", "slot vport", diag_dpp_vport_table_prt }, + { "diag_dpp_vport_panel_table_set", "slot vport panel_id attr value", diag_dpp_vport_panel_table_set }, + { "diag_dpp_vport_panel_table_prt", "slot vport panel_id", diag_dpp_vport_panel_table_prt }, + { "diag_dpp_vport_bc_table_set", "slot vport enable", diag_dpp_vport_bc_table_set }, + { "diag_dpp_vport_bc_table_prt", "slot vport", diag_dpp_vport_bc_table_prt }, + { "diag_dpp_vport_uc_promisc_table_set", "slot vport enable", diag_dpp_vport_uc_promisc_table_set }, + { "diag_dpp_vport_uc_promisc_table_prt", "slot vport", diag_dpp_vport_uc_promisc_table_prt }, + { "diag_dpp_vport_mc_promisc_table_set", "slot vport enable", diag_dpp_vport_mc_promisc_table_set }, + { "diag_dpp_vport_mc_promisc_table_prt", "slot vport", diag_dpp_vport_mc_promisc_table_prt }, + { "dpp_dtb_prt_disable", "none", dpp_dtb_prt_disable }, + { "dpp_dtb_prt_enable", "none", dpp_dtb_prt_enable }, + { "dpp_dtb_debug_fun_enable", "none", dpp_dtb_debug_fun_enable }, + { "dpp_dtb_debug_fun_disable", "none", dpp_dtb_debug_fun_disable }, + { "dpp_dtb_soft_perf_test_set", "value", dpp_dtb_soft_perf_test_set }, + { "dpp_dtb_hardware_perf_test_set", "value", dpp_dtb_hardware_perf_test_set }, + { "dpp_dtb_down_table_overtime_set", "times_s", dpp_dtb_down_table_overtime_set }, + { "dpp_dtb_dump_table_overtime_set", "times_s", dpp_dtb_dump_table_overtime_set }, +}; + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/cmd/source/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/cmd/source/Kbuild.include new file mode 100644 index 0000000..8101b6a --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/cmd/source/Kbuild.include @@ -0,0 +1,2 @@ +cur_dir := en_np/cmd/source/ +src_files += $(addprefix $(cur_dir),$(notdir $(wildcard $(dinghai_root)/$(cur_dir)*.c))) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/cmd/source/dpp_cmd_init.c b/src/net/drivers/net/ethernet/dinghai/en_np/cmd/source/dpp_cmd_init.c new file mode 100644 index 0000000..4e9ac09 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/cmd/source/dpp_cmd_init.c @@ -0,0 +1,33 @@ +#include "zxic_common.h" +#include "dpp_netlink.h" +#include "dpp_cmd_init.h" + +extern ZXIC_CHAR* dpp_cmd_trim(ZXIC_CHAR* line); +extern ZXIC_UINT32 dpp_cmd_exec(ZXIC_CHAR* line); + +ZXIC_UINT32 dpp_cmd_msg_proc(ZXIC_VOID *msg_body, ZXIC_UINT32 msg_len, ZXIC_VOID **resp, ZXIC_UINT32 *reps_len) +{ + ZXIC_CHAR *line = NULL; + T_MSG_CMD_SHELL *msg = (T_MSG_CMD_SHELL*)(msg_body); + + ZXIC_COMM_CHECK_POINT(msg); + + line = dpp_cmd_trim(msg->command); + ZXIC_COMM_CHECK_POINT(line); + + if (*line) + { + ZXIC_COMM_PRINT("---------------------------------------------------\n"); + dpp_cmd_exec(line); + ZXIC_COMM_PRINT("---------------------------------------------------\n"); + } + + return DPP_OK; +} + +ZXIC_UINT32 dpp_cmd_init(ZXIC_VOID) +{ + dpp_netlink_regist_msg_proc_fun(MSG_ID_MSG_DPP_CMD_SHELL, dpp_cmd_msg_proc); + + return DPP_OK; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/cmd/source/dpp_cmd_shell.c b/src/net/drivers/net/ethernet/dinghai/en_np/cmd/source/dpp_cmd_shell.c new file mode 100644 index 0000000..f96bf02 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/cmd/source/dpp_cmd_shell.c @@ -0,0 +1,296 @@ +#include "linux/string.h" +#include "zxic_common.h" +#include "dpp_cmd_shell.h" + +#ifndef whitespace +#define whitespace(c) (((c) == ' ') || ((c) == '\t')) +#endif + +#define DPP_CMD_ARG_NUM_MAX (15) + +ZXIC_UINT32 dpp_cmd_help(ZXIC_VOID) +{ + ZXIC_UINT32 i = 0; + ZXIC_UINT32 list_index = 0; + + list_index = sizeof(dpp_commands) / sizeof(dpp_commands[0]); + + for (i = 0; i < list_index; i++) + { + ZXIC_COMM_PRINT("%-40s | %s\n", dpp_commands[i].name, dpp_commands[i].doc); + } + + return DPP_OK; +} + +ZXIC_UINT32 dpp_cmd_atoi(ZXIC_CHAR* str) +{ + ZXIC_UINT32 n = 0; + ZXIC_SINT32 rc = 0; + + if(str == NULL) + { + return 0x0; + } + + if((str[0] == '0') && (str[1] == 'x')) + { + rc = sscanf(str, "0x%x", &n); + } + else if((str[0] == '0') && (str[1] == 'X')) + { + rc = sscanf(str, "0X%x", &n); + } + else + { + rc = sscanf(str, "%u", &n); + } + + if (rc < 0) + { + return 0; + } + + return n; +} + +DPP_COMMAND* dpp_cmd_find(ZXIC_CHAR* name) +{ + ZXIC_UINT32 i = 0; + ZXIC_UINT32 list_index = 0; + + list_index = sizeof(dpp_commands) / sizeof(dpp_commands[0]); + + for (i = 0; i < list_index; i++) + { + if (strcmp(name, dpp_commands[i].name) == 0) + { + return (&dpp_commands[i]); + } + } + + return ((DPP_COMMAND *)NULL); +} + +ZXIC_UINT32 dpp_cmd_strtok(ZXIC_CHAR *str, ZXIC_CHAR** arg_v, ZXIC_UINT32* arg_num) +{ + ZXIC_CHAR* p_tok = NULL; + ZXIC_CONST ZXIC_CHAR* delim = " ();\t"; + ZXIC_UINT32 i = 0; + + ZXIC_COMM_CHECK_POINT(str); + ZXIC_COMM_CHECK_POINT(arg_v); + ZXIC_COMM_CHECK_POINT(arg_num); + + ZXIC_COMM_MEMSET(arg_v, 0, DPP_CMD_ARG_NUM_MAX * sizeof(ZXIC_CHAR*)); + + p_tok = strsep(&str, delim); + ZXIC_COMM_CHECK_POINT(p_tok); + + arg_v[0] = p_tok; + + i = 1; + while (p_tok && (i < DPP_CMD_ARG_NUM_MAX)) + { + p_tok = strsep(&str, delim); + if (p_tok == NULL) + { + break; + } + arg_v[i++] = p_tok; + } + + *arg_num = i; + + return DPP_OK; +} + +ZXIC_CHAR* dpp_cmd_trim(ZXIC_CHAR* line) +{ + ZXIC_CHAR* s; + ZXIC_CHAR* t; + + ZXIC_COMM_CHECK_POINT_RETURN_NULL(line); + + for (s = line; whitespace(*s); s++) + ; + + if (*s == 0) + { + return (s); + } + + t = s + strlen(s) - 1; + while ((t > s) && whitespace(*t)) + t--; + *++t = '\0'; + + return s; +} + +ZXIC_UINT32 dpp_cmd_exec(ZXIC_CHAR* line) +{ + ZXIC_UINT32 i = 0; + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 arg_num = 0; + ZXIC_UINT32 len = 0; + ZXIC_CHAR* word = 0; + ZXIC_CHAR* arg_v[DPP_CMD_ARG_NUM_MAX] = {0}; + DPP_COMMAND* command = NULL; + + ZXIC_UINT32 (*func0)(ZXIC_VOID); + ZXIC_UINT32 (*func1)(ZXIC_UINT32); + ZXIC_UINT32 (*func2)(ZXIC_UINT32, ZXIC_UINT32); + ZXIC_UINT32 (*func3)(ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32); + ZXIC_UINT32 (*func4)(ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32); + ZXIC_UINT32 (*func5)(ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32); + ZXIC_UINT32 (*func6)(ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32); + ZXIC_UINT32 (*func7)(ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32); + ZXIC_UINT32 (*func8)(ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32); + ZXIC_UINT32 (*func9)(ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32); + ZXIC_UINT32 (*func10)(ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32); + ZXIC_UINT32 (*func11)(ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, + ZXIC_UINT32); + ZXIC_UINT32 (*func12)(ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, ZXIC_UINT32, + ZXIC_UINT32, ZXIC_UINT32); + + ZXIC_COMM_CHECK_POINT(line); + + len = ZXIC_COMM_STRLEN(line); + if(0 == len) + { + ZXIC_COMM_PRINT("%s: len is 0.\n", __FUNCTION__); + return DPP_OK; + } + + i = 0; + while(line[i % (len + 1)] && whitespace(line[i % (len + 1)])) + { + i++; + } + word = line + i; + + while(line[i % (len + 1)] && !whitespace(line[i % (len + 1)])) + { + i++; + } + + if(line[i % (len + 1)]) + { + line[i++] = '\0'; + } + + command = dpp_cmd_find(word); + ZXIC_COMM_CHECK_POINT(command); + ZXIC_COMM_CHECK_POINT(command->func); + + while(whitespace(line[i % (len + 1)])) + { + i++; + } + + word = line + i; + + rc = dpp_cmd_strtok(word, arg_v, &arg_num); + ZXIC_COMM_CHECK_RC(rc, "dpp_cmd_strtok"); + ZXIC_COMM_CHECK_INDEX(arg_num, 0, DPP_CMD_ARG_NUM_MAX); + + switch (arg_num) + { + case 0: + { + func0 = command->func; + ((*(func0)) ()); + break; + } + case 1: + { + func1 = command->func; + ((*(func1)) (dpp_cmd_atoi(arg_v[0]))); + break; + } + case 2: + { + func2 = command->func; + ((*(func2)) (dpp_cmd_atoi(arg_v[0]), dpp_cmd_atoi(arg_v[1]))); + break; + } + case 3: + { + func3 = command->func; + ((*(func3)) (dpp_cmd_atoi(arg_v[0]), dpp_cmd_atoi(arg_v[1]), dpp_cmd_atoi(arg_v[2]))); + break; + } + case 4: + { + func4 = command->func; + ((*(func4)) (dpp_cmd_atoi(arg_v[0]), dpp_cmd_atoi(arg_v[1]), dpp_cmd_atoi(arg_v[2]), dpp_cmd_atoi(arg_v[3]))); + break; + } + case 5: + { + func5 = command->func; + ((*(func5)) (dpp_cmd_atoi(arg_v[0]), dpp_cmd_atoi(arg_v[1]), dpp_cmd_atoi(arg_v[2]), dpp_cmd_atoi(arg_v[3]), dpp_cmd_atoi(arg_v[4]))); + break; + } + case 6: + { + func6 = command->func; + ((*(func6)) (dpp_cmd_atoi(arg_v[0]), dpp_cmd_atoi(arg_v[1]), dpp_cmd_atoi(arg_v[2]), dpp_cmd_atoi(arg_v[3]), dpp_cmd_atoi(arg_v[4]), + dpp_cmd_atoi(arg_v[5]))); + break; + } + case 7: + { + func7 = command->func; + ((*(func7)) (dpp_cmd_atoi(arg_v[0]), dpp_cmd_atoi(arg_v[1]), dpp_cmd_atoi(arg_v[2]), dpp_cmd_atoi(arg_v[3]), dpp_cmd_atoi(arg_v[4]), + dpp_cmd_atoi(arg_v[5]), dpp_cmd_atoi(arg_v[6]))); + break; + } + case 8: + { + func8 = command->func; + ((*(func8)) (dpp_cmd_atoi(arg_v[0]), dpp_cmd_atoi(arg_v[1]), dpp_cmd_atoi(arg_v[2]), dpp_cmd_atoi(arg_v[3]), dpp_cmd_atoi(arg_v[4]), + dpp_cmd_atoi(arg_v[5]), dpp_cmd_atoi(arg_v[6]), dpp_cmd_atoi(arg_v[7]))); + break; + } + case 9: + { + func9 = command->func; + ((*(func9)) (dpp_cmd_atoi(arg_v[0]), dpp_cmd_atoi(arg_v[1]), dpp_cmd_atoi(arg_v[2]), dpp_cmd_atoi(arg_v[3]), dpp_cmd_atoi(arg_v[4]), + dpp_cmd_atoi(arg_v[5]), dpp_cmd_atoi(arg_v[6]), dpp_cmd_atoi(arg_v[7]), dpp_cmd_atoi(arg_v[8]))); + break; + } + case 10: + { + func10 = command->func; + ((*(func10)) (dpp_cmd_atoi(arg_v[0]), dpp_cmd_atoi(arg_v[1]), dpp_cmd_atoi(arg_v[2]), dpp_cmd_atoi(arg_v[3]), dpp_cmd_atoi(arg_v[4]), + dpp_cmd_atoi(arg_v[5]), dpp_cmd_atoi(arg_v[6]), dpp_cmd_atoi(arg_v[7]), dpp_cmd_atoi(arg_v[8]), dpp_cmd_atoi(arg_v[9]))); + break; + } + case 11: + { + func11 = command->func; + ((*(func11)) (dpp_cmd_atoi(arg_v[0]), dpp_cmd_atoi(arg_v[1]), dpp_cmd_atoi(arg_v[2]), dpp_cmd_atoi(arg_v[3]), dpp_cmd_atoi(arg_v[4]), + dpp_cmd_atoi(arg_v[5]), dpp_cmd_atoi(arg_v[6]), dpp_cmd_atoi(arg_v[7]), dpp_cmd_atoi(arg_v[8]), dpp_cmd_atoi(arg_v[9]), + dpp_cmd_atoi(arg_v[10]))); + break; + } + case 12: + { + func12 = command->func; + ((*(func12)) (dpp_cmd_atoi(arg_v[0]), dpp_cmd_atoi(arg_v[1]), dpp_cmd_atoi(arg_v[2]), dpp_cmd_atoi(arg_v[3]), dpp_cmd_atoi(arg_v[4]), + dpp_cmd_atoi(arg_v[5]), dpp_cmd_atoi(arg_v[6]), dpp_cmd_atoi(arg_v[7]), dpp_cmd_atoi(arg_v[8]), dpp_cmd_atoi(arg_v[9]), + dpp_cmd_atoi(arg_v[10]),dpp_cmd_atoi(arg_v[11]))); + break; + } + default: + { + ZXIC_COMM_PRINT("%s: err [arg_num:%d] oversize.\n", __FUNCTION__, arg_num); + break; + } + + } + + return DPP_OK; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/comm/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/comm/Kbuild.include new file mode 100644 index 0000000..a4b84d0 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/comm/Kbuild.include @@ -0,0 +1,4 @@ +cur_dir := en_np/comm/ +subdirs := source/ +src_files += +include $(foreach subdir, $(subdirs), $(dinghai_root)/$(cur_dir)$(subdir)/Kbuild.include) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_avl_tree.h b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_avl_tree.h new file mode 100644 index 0000000..a4c829c --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_avl_tree.h @@ -0,0 +1,97 @@ +/********************************************************************* + * 版权所有 (C)2012, 深圳市中兴通讯股份有限公司。 + * + * 文件名称:zxic_avl_tree.h + * 文件标识: + * 内容摘要:// 本文件从pfe_index 移植过来 + * 其它说明:// 其它内容的说明 + * 当前版本: + * 作 者: + * 完成日期: + * + * 修 改: 蒋文明10124041 2012.04.26移植到NSE项目 + ********************************************************************/ +#ifndef __ZXIC_COMM_AVL_TREE_H__ +#define __ZXIC_COMM_AVL_TREE_H__ + + +/* Since the trees are balanced, their heignse will never be large. */ +#define avl_maxheight 41 /* why this? a small exercise */ +#define heightoftree(tree) ((tree) == NULL ? 0 : (tree)->avl_height) + +struct _ZXIC_AVL_CFG; +struct _ZXIC_AVL_NODE; + +#define ZXIC_LIST_ENTRY(ptr, type, member) \ + ((type *)((ZXIC_UINT8 *)(ptr)-(((unsigned long)(&((type *)64)->member)) - 64))) + +#define ZXIC_GET_AVL_KEY_ADDR(p_avl_cfg,key_index) \ + ((p_avl_cfg->p_key_base)+(p_avl_cfg->key_len*(key_index))); + +typedef ZXIC_SINT32 (*ZXIC_KEY_CMP_FUNC)(void *p_new_key, void *p_old_key, ZXIC_UINT32 key_len); + +typedef struct _ZXIC_AVL_NODE +{ + void *p_key; + //void *p_owner; /*the owner of this node*/ + ZXIC_UINT32 result; /*该节点的索引*/ + ZXIC_SINT32 avl_height; + struct _ZXIC_AVL_NODE *p_avl_left; + struct _ZXIC_AVL_NODE *p_avl_right; + D_NODE avl_node_list;/*the data is owner*/ +} ZXIC_AVL_NODE; + +typedef struct _ZXIC_AVL_CFG +{ + + ZXIC_AVL_NODE *p_root; + ZXIC_UINT32 avl_node_num; /*avl 中已使用节点的数目*/ + D_HEAD avl_node_list_head; /*avl 线索化节点的头节点*/ + ZXIC_UINT32 key_len; + ZXIC_UINT32 item_num; + ZXIC_KEY_CMP_FUNC avl_cmp_func; + ZXIC_UINT8 *p_key_base; + ZXIC_AVL_NODE *p_avl_node_base; + ZXIC_LISTSTACK_MANGER *p_avl_node_liststack; + + ZXIC_UINT32 is_dynamic; /*是否支持avl 的节点动态生成,1:支持;0:不支持*/ + ZXIC_UINT32 is_init; + +} ZXIC_AVL_CFG; + + + +ZXIC_RTN32 zxic_comm_avl_init(ZXIC_AVL_CFG* p_avl_cfg, /* avl配置*/ + ZXIC_UINT32 item_num, /* 插入键值的数目,如果为0表示动态申请节点*/ + ZXIC_UINT32 key_length, /* 插入键值的长度,以字节为单位*/ + ZXIC_KEY_CMP_FUNC avl_cmp_func); /* 键值比较函数,使用默认比较函数可以为NULL, + 如果按整型比较,需要用户提供比较函数*/ +ZXIC_RTN32 zxic_comm_avl_insert(ZXIC_AVL_CFG* p_avl_cfg, + void* p_new_key, + ZXIC_UINT32* p_index); + +ZXIC_RTN32 zxic_comm_avl_remove(ZXIC_AVL_CFG* p_avl_cfg, + void* p_delete_key, + void* p_out); + +ZXIC_RTN32 zxic_comm_avl_find(ZXIC_AVL_CFG* p_avl_cfg, + void* p_find_key, + void* p_out); + +ZXIC_RTN32 zxic_comm_avl_destroy(ZXIC_AVL_CFG* p_avl_cfg ); + + + + +ZXIC_UINT32 ic_comm_avl_get_node_num(ZXIC_AVL_CFG* p_avl_cfg); +ZXIC_UINT32 ic_comm_avl_is_none(ZXIC_AVL_CFG* p_avl_cfg); +ZXIC_RTN32 ic_comm_avl_get_1st_key(ZXIC_AVL_CFG* p_avl_cfg, void *p_key_out); +ZXIC_RTN32 ic_comm_avl_get_last_key(ZXIC_AVL_CFG* p_avl_cfg, void *p_key_out); +ZXIC_RTN32 ic_comm_avl_get_1st_node(ZXIC_AVL_CFG* p_avl_cfg, ZXIC_AVL_NODE** p_node_out); +ZXIC_RTN32 ic_comm_avl_get_last_node(ZXIC_AVL_CFG* p_avl_cfg, ZXIC_AVL_NODE** p_node_out); + +ZXIC_RTN32 zxic_comm_avl_show_info(ZXIC_AVL_CFG* p_avl_cfg); + +#endif/*__ZXIC_AVL_TREE_H__*/ + + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_double_link.h b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_double_link.h new file mode 100644 index 0000000..2b6afbd --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_double_link.h @@ -0,0 +1,109 @@ +/***************************************************************************** + * 版权所有 (C)2008-2010, 深圳市中兴通讯股份有限公司。 + * + * 文件名称: zxic_comm_double_link.h + * 文件标识: + * 内容摘要: 双链表实现 + * 其它说明: + * 当前版本: V1.00.10 + * 作 者: + * 完成日期: 2012年2月14日 + * 当前责任人-1:ChenWei188471 + * 当前责任人-2: + * 历史责任人-3: + * + * 修改记录: + * 修改日期: 版 本 号 修 改 人 修改内容 + 1 20120214 V1.00.10 ChenWei188471 创建 + 2 + *****************************************************************************/ + +#ifndef _ZXIC_COMM_DOUBLE_LINK_H +#define _ZXIC_COMM_DOUBLE_LINK_H +#define TEST_NUMBER (255) + + + + +/************************************************************************** + * double_link api * + **************************************************************************/ +typedef struct _d_node +{ + void *data; + struct _d_node *prev; + struct _d_node *next; +}D_NODE; + +typedef struct _d_head +{ + ZXIC_UINT32 used; + ZXIC_UINT32 maxnum; + D_NODE *p_next; + D_NODE *p_prev; +}D_HEAD; + +typedef ZXIC_SINT32 (*CMP_FUNC)(D_NODE* data1,D_NODE* data2,void* ); + +typedef ZXIC_RTN32 (*fun_free)(void *); + +ZXIC_RTN32 zxic_comm_double_link_insert_1st (D_NODE *newnode, D_HEAD *head); +ZXIC_RTN32 zxic_comm_double_link_insert_aft (D_NODE *newnode, D_NODE *oldnode,D_HEAD*head); +ZXIC_RTN32 zxic_comm_double_link_insert_pre (D_NODE *newnode, D_NODE *oldnode,D_HEAD*head); +ZXIC_RTN32 zxic_comm_double_link_insert_last(D_NODE *newnode, D_HEAD *head); +ZXIC_RTN32 zxic_comm_double_link_merge_list (D_HEAD *d_list, D_HEAD *s_list); + +ZXIC_RTN32 zxic_comm_double_link_insert_sort(D_NODE *newnode, D_HEAD *head, CMP_FUNC fuc,void*); + +ZXIC_RTN32 zxic_comm_double_link_search (D_NODE *data, D_HEAD *head); +ZXIC_RTN32 zxic_comm_double_link_del (D_NODE *data, D_HEAD *head); +ZXIC_RTN32 zxic_comm_double_link_init (ZXIC_UINT32 elmemtnum, D_HEAD *head); +ZXIC_RTN32 zxic_comm_double_link_insert_merge(D_NODE *p_newnode,D_HEAD *p_head,ZXIC_UINT32 is_head); + +/*fun指向的是释放dnode指向的空间,如果没有,可以传NULL*/ +ZXIC_RTN32 zxic_comm_dlink_release(D_HEAD *p_head,fun_free fun); +ZXIC_SINT32 zxic_comm_double_link_default_cmp_fuc(D_NODE* p_data1,D_NODE* p_data2,void*); + +ZXIC_RTN32 zxic_comm_double_link_del_pos(D_HEAD *p_head,void* cmp_data,fun_free fun); +ZXIC_RTN32 zxic_comm_double_link_insert_cmp(D_HEAD *p_head, void* cmp_data, ZXIC_UINT32 *is_same); + +#define INIT_D_NODE(ptr,pdata) \ + do{\ + (ptr)->data = pdata;\ + (ptr)->prev = NULL;\ + (ptr)->next = NULL;\ + }while(0) + + +/*add by lius +将0转 换成(TYPE*),结构以内存空间首地址0作为起始地址,则成员地址为偏移地址;*/ +#define MEM_OFF(type,member) \ + (ZXIC_COMM_PTR_TO_VAL(&(((type*)0)->member))) + +/*根据当前双链表的指针,找到本节点的指针*/ +#define STRUCT_ENTRY_POINT(ptr, type, member) \ + ((type *)(ZXIC_COMM_PTR_TO_VAL(ptr)-MEM_OFF(type,member))) + +/* 不依据0,找结构体首地址 */ +#define MEM_OFF_NOT_NULL(type,member) \ + (ZXIC_COMM_PTR_TO_VAL(&(((type*)4)->member)) - ZXIC_COMM_PTR_TO_VAL(((type*)4))) + +/* 为了消除原STRUCT_ENTRY_POINT中“直接解引用 NULL”的coverity */ +#define GET_STRUCT_ENTRY_POINT(ptr, type, member) \ + ((type *)(ZXIC_COMM_PTR_TO_VAL(ptr)-MEM_OFF_NOT_NULL(type,member))) + +#define DLINK_IS_FULL(p_dlink) \ + ((p_dlink)->used == (p_dlink)->maxnum) + + +ZXIC_RTN32 zxic_comm_double_link_sort (D_HEAD *p_head, CMP_FUNC cmp_fuc); +ZXIC_RTN32 zxic_comm_double_link_swap (D_NODE *p_pre, D_NODE *p_next); +ZXIC_RTN32 zxic_comm_double_link_test (ZXIC_VOID ); +ZXIC_RTN32 zxic_comm_double_link_print (D_HEAD *p_head); +ZXIC_RTN32 zxic_comm_double_link_del_by_data(D_HEAD *p_head,ZXIC_VOID* cmp_data,fun_free fun); +ZXIC_RTN32 zxic_comm_double_link_del_by_info(D_HEAD *p_head, void* cmp_data, CMP_FUNC cmp_fuc, ZXIC_UINT32 *p_deled_num); + + + +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_doublelink_index.h b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_doublelink_index.h new file mode 100644 index 0000000..c966195 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_doublelink_index.h @@ -0,0 +1,166 @@ +/***************************************************************************** + * 版权所有 (C)2008-2010, 深圳市中兴通讯股份有限公司。 + * + * 文件名称:zxic_doublelink_index.h + * 文件标识: + * 内容摘要:zxic_doublelink_index.c 的头文件, 这里定义了.c文件需要用到的数据结构, + 并且申明了提供外部模块调用的接口函数 + * 其它说明: 其它内容的说明 + * 当前版本: + * 作 者:HuangHe(170389) Z T E 中兴 + * 完成日期:2009-02-16 + * 当前责任人-1:HuangHe Z T E 中兴 + * 当前责任人-2: + * 历史责任人-3: + * + * 修改记录: + * 修改日期: 版 本 号 修 改 人 修改内容 + 1 yyyymmdd V*.* 姓名工号 + 2 + *****************************************************************************/ +#ifndef __ZXIC_COMM_DOUBLELINK_INDEX_H__ +#define __ZXIC_COMM_DOUBLELINK_INDEX_H__ + +/************************** include head files *****************************/ + +/************************** type define *****************************/ +#define DOUBLELINK_CHECKSUM ((ZXIC_UINT32)(0xAABBBAAB)) + + +/************************** const variables **************************/ +#define DOUBLELINK_INVALID_PREVIOUS (0x0) +#define DOUBLELINK_INVALID_NEXT (0x0) +#define DOUBLELINK_USED_FLAG ((ZXIC_UINT32)(0xffffffff)) +#define DOUBLELINK_LASTEST_ELEMENT ((ZXIC_UINT32)(0x0ffffffe)) + +/************************************************************************** + * double_link_index api * + **************************************************************************/ + +/** + * NAME: DLINK_NODE + * + * DESCRIPTION: Structure Node the information of the doublelink. + **/ +typedef struct +{ + ZXIC_UINT32 dw_next_node; /*后一个节点*/ + ZXIC_UINT32 dw_pre_node; /*前一个节点*/ + ZXIC_UINT32 dw_self_node; /*当前一个节点*/ + +}DLINK_NODE; + +/** + * NAME: FTMCOMM_DOUBLELINK_MANGER + * + * DESCRIPTION: Structure containing the information required by the + * implementation of the doublelink. +**/ + +typedef struct _FtmComm_DoubleLink_Manager +{ + /* + * p_array is a pointer to the array of elements used to track which + * indexes have been allocated. + */ + DLINK_NODE *p_array; + + /* + * numElements is the number of indexes managed by this instance of the + * index_pool. + */ + ZXIC_UINT32 capacity; + + /* + * currFreeElement stores a free element for where to alloc next free element. + * This helps prevent looping over a large sections of the array each time + * a new index is allocated. + */ + ZXIC_UINT32 free_num; + + ZXIC_UINT32 used_num; + + ZXIC_UINT32 first_used; + + ZXIC_UINT32 last_used; + + ZXIC_UINT32 first_free; + + ZXIC_UINT32 last_free; + /* + * offset is an adjustment value, allowing the caller to prevent certain + * indexes from being allocated. This value is only meaningful to the + * client, and does not affect how the indexes are managed within the + * doublelink. + */ + ZXIC_UINT32 offset; + + ZXIC_UINT32 check_sum; /*用来检查传入的地址是否是双链表管理结构地址*/ + +}ZXIC_DOUBLELINK_MANGER; + + +ZXIC_RTN32 zxic_comm_dlink_manage_create(ZXIC_UINT32 dw_element_num, + ZXIC_UINT32 dw_offset, + ZXIC_DOUBLELINK_MANGER **p_dlink); + + +ZXIC_RTN32 zxic_comm_dlink_alloc (ZXIC_DOUBLELINK_MANGER *p_dlink, + ZXIC_UINT32 *index); + + +ZXIC_RTN32 zxic_comm_dlink_free (ZXIC_DOUBLELINK_MANGER *p_dlink, + ZXIC_UINT32 index); + + +ZXIC_RTN32 zxic_comm_dlink_get_next (ZXIC_DOUBLELINK_MANGER *p_dlink, + ZXIC_UINT32 dw_index, + ZXIC_UINT32 *p_next_index); + + +ZXIC_RTN32 zxic_comm_dlink_manage_clear (ZXIC_DOUBLELINK_MANGER *p_dlink); + + +ZXIC_RTN32 zxic_comm_dlink_get_previous (ZXIC_DOUBLELINK_MANGER *p_dlink, + ZXIC_UINT32 dw_index, + ZXIC_UINT32 *p_pre_index); + +ZXIC_RTN32 zxic_comm_dlink_is_used (ZXIC_DOUBLELINK_MANGER *p_dlink, + ZXIC_UINT32 dw_index, + ZXIC_UINT8 *p_is_used); + + +ZXIC_RTN32 zxic_comm_dlink_first_free (ZXIC_DOUBLELINK_MANGER *p_dlink, + ZXIC_UINT32 *p_index); + + +ZXIC_RTN32 zxic_comm_dlink_first_used (ZXIC_DOUBLELINK_MANGER *p_dlink, + ZXIC_UINT32 *p_index); + + + +ZXIC_RTN32 zxic_comm_dlink_manage_reset (ZXIC_DOUBLELINK_MANGER *p_dlink); + +ZXIC_RTN32 zxic_comm_dlink_get_curr_info (ZXIC_DOUBLELINK_MANGER *p_dlink, + ZXIC_UINT32 *p_free_num, + ZXIC_UINT32 *p_curr_free_index); + +ZXIC_RTN32 zxic_comm_dlink_last_used (ZXIC_DOUBLELINK_MANGER *p_dlink, + ZXIC_UINT32 *p_index); + +ZXIC_RTN32 zxic_comm_dlink_used_num (ZXIC_DOUBLELINK_MANGER *p_dlink, + ZXIC_UINT32 *p_num); + +ZXIC_RTN32 zxic_comm_dlink_show_node_info (ZXIC_DOUBLELINK_MANGER *p_dlink, + ZXIC_UINT32 dw_node_index); + +ZXIC_RTN32 zxic_comm_dlink_show_current_status(ZXIC_DOUBLELINK_MANGER *p_dlink); + + +ZXIC_RTN32 zxic_comm_dlink_self_test(ZXIC_VOID); + + + +#endif + + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_index_ctrl.h b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_index_ctrl.h new file mode 100644 index 0000000..9b887af --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_index_ctrl.h @@ -0,0 +1,77 @@ +/********************************************************************* +* 版权所有 (C)2001, 深圳市中兴通讯股份有限公司。 +* +* 文件名称: +* 文件标识: +* 内容摘要: +* 其它说明: +* +* +* 当前版本: +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT : 100% +* 作 者: +* 完成日期:2010-10-29 +********************************************************************/ +#ifndef _ZXIC_COMM_INDEX_CONTROLLER_H_ +#define _ZXIC_COMM_INDEX_CONTROLLER_H_ + +//#include "zxic_common.h" +//#include "zxic_comm_rb_tree.h" +//#include "zxic_comm_double_link.h" + + +#define ZXIC_INDEX_EXPAND_MAX_NUM (900) +#define INDEX_KEY_LENGTH (4) +typedef struct zxic_index_ctrl_cfg +{ + + ZXIC_UINT32 index_cursor_current ; + ZXIC_UINT32 index_cursor_last ; + ZXIC_UINT32 index_cursor_max_cur ; + ZXIC_UINT32 index_ctrl_is_init ; + ZXIC_UINT32* p_index_buf ; + + ZXIC_RB_CFG index_ctrl_rb_tree ; + ZXIC_RB_CFG rcd_ctrl_rb_tree ; + + D_HEAD *p_index_ctrl_link ; +}ZXIC_INDEX_CTRL_CFG; + +typedef struct _zxic_index_api_params +{ + ZXIC_UINT32 zxic_expand_num ; /*the expand num of this item */ + ZXIC_UINT32 zxic_opera_mode ; /*0:add;1:del;2:sch */ + ZXIC_UINT32 zxic_rsp_isexit ; /*the rsp of whether is exit */ + ZXIC_UINT32 *p_zxic_out_index ; /*the address of response */ + ZXIC_VOID *p_zxic_data ; /*the data of inserting in tcam*/ + +} ZXIC_INDEX_API_PARAMS; + +typedef enum functionNo /* 接口提供的表操作类型 */ +{ + INDEX_CTRL_ADD, + INDEX_CTRL_ADD_FROM_LAST, + INDEX_CTRL_DEL, + INDEX_CTRL_SEARCH, + INDEX_CTRL_UNDEFINED +}FUNCTION_NO; + + + + +ZXIC_RTN32 zxic_comm_indexctrl_get_free_index(ZXIC_INDEX_CTRL_CFG *p_table_info,ZXIC_UINT32 func_type,ZXIC_UINT32 *p_free_index_num); +ZXIC_RTN32 zxic_comm_indexctrl_add_from_last(ZXIC_INDEX_CTRL_CFG *p_table_info,ZXIC_VOID *data,ZXIC_UINT32 expand_num,ZXIC_UINT32 *out_index); +ZXIC_RTN32 zxic_comm_indexctrl_sch(ZXIC_INDEX_CTRL_CFG *p_table_info,ZXIC_VOID *data,ZXIC_UINT32 *p_is_exit,ZXIC_UINT32 *out_index); +ZXIC_RTN32 zxic_comm_indexctrl_extcommand(ZXIC_INDEX_API_PARAMS *p_zxic_api_params,ZXIC_INDEX_CTRL_CFG *p_table_info) ; +ZXIC_RTN32 zxic_comm_indexctrl_add(ZXIC_INDEX_CTRL_CFG *p_table_info,ZXIC_VOID *data,ZXIC_UINT32 expand_num,ZXIC_UINT32 *out_index); +ZXIC_RTN32 zxic_comm_indexctrl_init(ZXIC_INDEX_CTRL_CFG *p_table_info,ZXIC_UINT32 index_max_num,ZXIC_UINT32 table_key_len); +ZXIC_RTN32 zxic_comm_indexctrl_getindex_from_last(ZXIC_INDEX_CTRL_CFG *p_table_info,ZXIC_UINT32 *p_index_out); +ZXIC_RTN32 zxic_comm_indexctrl_del(ZXIC_INDEX_CTRL_CFG *p_table_info,ZXIC_VOID *data,ZXIC_UINT32 *out_index); +ZXIC_RTN32 zxic_comm_indexctrl_getindex(ZXIC_INDEX_CTRL_CFG *p_table_info,ZXIC_UINT32 *p_index_out); +ZXIC_SINT32 zxic_comm_indexctrl_cmp_key(ZXIC_VOID *new_key, ZXIC_VOID *old_key,ZXIC_UINT32 key_len); + + +#endif + + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_index_fill.h b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_index_fill.h new file mode 100644 index 0000000..3dcf520 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_index_fill.h @@ -0,0 +1,69 @@ +/***************************************************************************** + * 版权所有 (C)2001-2015, 深圳市中兴通讯股份有限公司。 + * + * 文件名称: zxic_index_fill.h + * 文件标识: + * 内容摘要: 索引空位填充源代码头文件 + * 其它说明: + * 当前版本: + * 作 者: ChenWei10088471 + * 完成日期: + * 当前责任人-1: + * 当前责任人-2: + * + * DEPARTMENT : ASIC_FPGA_R&D_Dept + * MANUAL_PERCENT : 100% + *****************************************************************************/ + +#ifndef _ZXIC_COMM_INDEX_FILL_H +#define _ZXIC_COMM_INDEX_FILL_H + + +typedef ZXIC_RTN32 (*INDEXFILL_SWAP_FUNC)(ZXIC_UINT32 old_index,ZXIC_UINT32 new_index,ZXIC_VOID *p_cfg); + + +typedef struct +{ + ZXIC_RB_TN rb_node; + ZXIC_UINT32 position; + ZXIC_UINT32 usednum; +}INDEX_FILL_NODE; + +typedef struct +{ + ZXIC_RB_CFG fill_rb; + ZXIC_UINT32 index_num; + INDEX_FILL_NODE *fill_node; + INDEXFILL_SWAP_FUNC swap_fun; + ZXIC_UINT32 total_used; +}INDEX_FILL_CFG; + +ZXIC_RTN32 ic_comm_node_data_free(void *p_data); + + +ZXIC_RTN32 zxic_comm_indexfill_init(INDEX_FILL_CFG *p_fill_cfg, + ZXIC_UINT32 index_num, + ZXIC_KEY_CMP_FUNC p_cmp_fun, + INDEXFILL_SWAP_FUNC p_swap_fun, + ZXIC_UINT32 key_len); + +ZXIC_RTN32 zxic_comm_indexfill_free(INDEX_FILL_CFG *p_fill_cfg, + ZXIC_UINT32 free_index, + ZXIC_VOID* p_rb_key, + ZXIC_UINT32 *out_index); + +ZXIC_RTN32 zxic_comm_indexfill_destroy(INDEX_FILL_CFG *p_fill_cfg); + +ZXIC_RTN32 zxic_comm_indexfill_store(INDEX_FILL_CFG *p_fill_cfg, ZXIC_UINT32 *p_size, ZXIC_UINT8 **p_data_buff); + +ZXIC_RTN32 zxic_comm_indexfill_show_all_position(INDEX_FILL_CFG *p_fill_cfg); +ZXIC_RTN32 zxic_comm_indexfill_clear(INDEX_FILL_CFG *p_fill_cfg); + +#define ICMINF_GET_NODE_LASTPOS(p_inf_node) \ + ((p_inf_node)->position + (p_inf_node)->usednum -1) + +#define ICMINF_GET_NODE_FSTPOS(p_inf_node) \ + ((p_inf_node)->position) + +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_index_fill_type.h b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_index_fill_type.h new file mode 100644 index 0000000..ae4f64a --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_index_fill_type.h @@ -0,0 +1,96 @@ +/***************************************************************************** + * 版权所有 (C)2001-2015, 深圳市中兴通讯股份有限公司。 + * + * 文件名称: zxic_index_fill.h + * 文件标识: + * 内容摘要: 索引空位填充源代码头文件 + * 其它说明: + * 当前版本: + * 作 者: ChenWei10088471 + * 完成日期: + * 当前责任人-1: + * 当前责任人-2: + * + * DEPARTMENT : ASIC_FPGA_R&D_Dept + * MANUAL_PERCENT : 100% + *****************************************************************************/ + +#ifndef _ZXIC_COMM_INDEX_FILL_TYPE_H +#define _ZXIC_COMM_INDEX_FILL_TYPE_H + +typedef ZXIC_RTN32 (*INDEXFILL_TYPE_SWAP_FUNC)(ZXIC_UINT32 old_index,ZXIC_UINT32 new_index,ZXIC_VOID *p_cfg); + +typedef struct +{ + ZXIC_UINT32 is_used; /* 0空闲,1已分配 */ + ZXIC_UINT32 prio; +}INDEX_FILL_TYPE_INDEX_STATUS; /* is_used==0时,不关心prio */ + +typedef struct +{ + ZXIC_RB_TN prio_rb_node; /* prio_rb_tree中的节点 */ + ZXIC_RB_CFG idx_rb_cfg; /* 以index为key,详细记录每个prio的每个index信息 */ + ZXIC_UINT32 prio; /* prio值*/ +}INDEX_FILL_TYPE_PRIO_NODE; + +typedef struct { + ZXIC_UINT32 prio; +} SSP4_INDEX_FILL_TYPE_PRIO_RB_KEY; /* prio红黑树的key */ + +typedef struct +{ + ZXIC_RB_CFG prio_rb; /* 每type的prio红黑树,以prio为key */ + D_HEAD mv_list_head; /* 同type的移位链表 */ + ZXIC_VOID *p_cfg; /* type相关的其他参数定义,外部自行定义 */ +}INDEX_FILL_TYPE_MNG_CFG; + +typedef struct +{ + ZXIC_UINT32 index_num; /* 本池的索引数量 */ + ZXIC_UINT32 total_used; /* 本池已使用的索引数量 */ + ZXIC_UINT32 prio_max; /* 最大优先级范围 */ + ZXIC_UINT32 global_max_num; /* 全局最大数量*/ + INDEX_FILL_TYPE_INDEX_STATUS *p_idx_status; /* 全局索引池状态位记录数组指针 */ + INDEXFILL_TYPE_SWAP_FUNC swap_fun; /* 向前或者向后挤压时的移位操作函数 */ +}INDEX_FILL_TYPE_INDEX_POOL_CFG; /* 多种type共享的索引池 */ + + + +ZXIC_UINT32 zxic_comm_indexfill_type_idx_status_get(INDEX_FILL_TYPE_INDEX_STATUS *index_status, + ZXIC_UINT32 index, + ZXIC_UINT32 *used_status_flag, + ZXIC_UINT32 *used_status_prio); + + +ZXIC_UINT32 zxic_comm_indexfill_type_idx_status_set(INDEX_FILL_TYPE_INDEX_STATUS *index_status, + ZXIC_UINT32 index, + ZXIC_UINT32 prio, + ZXIC_UINT32 used_flag); + +ZXIC_RTN32 zxic_comm_indexfill_type_init(INDEX_FILL_TYPE_INDEX_POOL_CFG *p_fill_type_index_pool_cfg, + ZXIC_UINT32 index_num, + ZXIC_UINT32 prio_max, + ZXIC_UINT32 global_max_num, + INDEXFILL_TYPE_SWAP_FUNC p_swap_fun); + +ZXIC_RTN32 zxic_comm_indexfill_type_rb_init(INDEX_FILL_TYPE_MNG_CFG *p_fill_type_mng_cfg); + +/* 多张type共享的索引记录 */ +/* 每种type,一个prio红黑树管理结构,一个prio+index红黑树管理结构 */ +ZXIC_RTN32 zxic_comm_indexfill_type_alloc(INDEX_FILL_TYPE_INDEX_POOL_CFG *p_fill_type_index_pool_cfg, + INDEX_FILL_TYPE_MNG_CFG *p_fill_type_mng_cfg, + ZXIC_UINT32 prio, + ZXIC_UINT32 *out_index); +/* 多张type共享的索引记录 */ +/* 每种type,一个prio红黑树管理结构,一个prio+index红黑树管理结构 */ +ZXIC_RTN32 zxic_comm_indexfill_type_free(INDEX_FILL_TYPE_INDEX_POOL_CFG *p_fill_type_index_pool_cfg, + INDEX_FILL_TYPE_MNG_CFG *p_fill_type_mng_cfg, + ZXIC_UINT32 free_index, + ZXIC_UINT32 *out_index); + +ZXIC_RTN32 zxic_comm_indexfill_type_show_all_position(INDEX_FILL_TYPE_INDEX_POOL_CFG *p_fill_type_index_pool_cfg, + INDEX_FILL_TYPE_MNG_CFG *p_fill_type_mng_cfg); + + +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_index_reserve.h b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_index_reserve.h new file mode 100644 index 0000000..3a6e8ac --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_index_reserve.h @@ -0,0 +1,78 @@ +/***************************************************************************** + * 版权所有 (C)2001-2015, 深圳市中兴通讯股份有限公司。 + * + * 文件名称: zxic_index_reserve.h + * 文件标识: + * 内容摘要: 索引预留算法源代码头文件 + * 其它说明: + * 当前版本: + * 作 者: ChenWei10088471 + * 完成日期: + * 当前责任人-1: + * 当前责任人-2: + * + * DEPARTMENT : ASIC_FPGA_R&D_Dept + * MANUAL_PERCENT : 100% + *****************************************************************************/ +#ifndef _ZXIC_COMM_INDEX_RESERVE_H +#define _ZXIC_COMM_INDEX_RESERVE_H + +#define CMP_MODE_LOW (0) +#define CMP_MODE_HIGH (1) +typedef ZXIC_UINT32 (*SWAP_FUNC)(ZXIC_UINT32 old_index,ZXIC_UINT32 new_index); +typedef ZXIC_UINT32 (*LOCAL_SWAP_FUNC)(ZXIC_VOID *p_cfg,ZXIC_UINT32 old_index,ZXIC_UINT32 new_index); + +typedef struct +{ + ZXIC_UINT32 head_curr; + ZXIC_UINT32 tail_curr; +}INDEX_CURR; + +typedef struct +{ + ZXIC_UINT32 old_handle; + ZXIC_UINT32 new_handle; +}INR_SWAP_NODE; + +typedef struct _index_res_cfg +{ + ZXIC_UINT32 total_num; + ZXIC_UINT32 space_num; + ZXIC_UINT32* index_prop; + ZXIC_RB_CFG* index_usedrb; + ZXIC_RB_CFG* index_freerb; + ZXIC_RB_TN* index_node; + SWAP_FUNC swap_fun; + LOCAL_SWAP_FUNC local_fun; + INDEX_CURR* index_curr; + D_HEAD swap_list; + ZXIC_UINT32 total_used; + ZXIC_UINT32 is_init; + ZXIC_UINT32 indexres_id; +}INDEX_RES_CFG; +ZXIC_VOID zxic_comm_rb_tn_relation_clear(ZXIC_RB_TN *rb_tn_node); + +ZXIC_RTN32 zxic_comm_indexres_init(INDEX_RES_CFG *p_indexres_cfg, /*配置句柄*/ + ZXIC_UINT32 arg_total_num, /*索引总数*/ + ZXIC_UINT32 arg_space_num, /*空间总数*/ + ZXIC_UINT32* arg_index_prop, /*空间大小,若用户提供,则按用户提供的进行空间分配,否则平均分配所有空间*/ + SWAP_FUNC p_swap_fun, + LOCAL_SWAP_FUNC local_fun); /*重排函数,注册则调用,否则不调*/ + +ZXIC_RTN32 zxic_comm_indexres_alloc(INDEX_RES_CFG *p_indexres_cfg, /*配置句柄*/ + ZXIC_UINT32 space_val, /*空间序列*/ + ZXIC_UINT32 *out_index); /*出参,分配的索引*/ + +ZXIC_RTN32 zxic_comm_indexres_free(INDEX_RES_CFG *p_indexres_cfg, + ZXIC_UINT32 space_val, + ZXIC_UINT32 free_index); + +ZXIC_RTN32 zxic_comm_indexres_destory(INDEX_RES_CFG *p_indexres_cfg); + +ZXIC_RTN32 zxic_comm_indexres_reset(INDEX_RES_CFG *p_indexres_cfg); + +ZXIC_RTN32 zxic_comm_indexres_showinfo(INDEX_RES_CFG *p_indexres_cfg);/*重置整个索引空间,恢复到最初的配置状态,注意,此时所有的索引都需要在未使用状态*/ + + +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_liststack.h b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_liststack.h new file mode 100644 index 0000000..cac0dda --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_liststack.h @@ -0,0 +1,95 @@ +/***************************************************************************** + * 版权所有 (C)2001-2005, 深圳市中兴通讯股份有限公司。 + * + * 文件名称: Rtm_ListStack.h + * 文件标识: + * 内容摘要: 链表栈管理头文件 + * 其它说明: 释放的元素放到队头 + * 当前版本: ZXR10 V2.6 + * 作 者: 郑纪伟 + * 完成日期: 2006-9-27 10:34 + * 当前责任人-1: + * 当前责任人-2: + * + * 修改记录1: + * 修改日期:2006-9-27 10:34 + * 版 本 号:ZXR10 V2.6 + * 修 改 人:郑纪伟 + * 修改内容:创建 + * + *修改记录2: + * 修改文件名称:ftmcomm_liststack.h + * 修改日期:2008-10-16 15:14 + * 版 本 号:ZXR10 V2.6 + * 修 改 人:HuangHe 170389 + * 修改内容:移植到T8000项目使用 + *修改记录3: + * 修改文件名称:zxic_liststack.h + * 修改日期:2012-03-15 15:14 + * 版 本 号:ZXR10 V2.6 + * 修 改 人:JiangWenming 12010401 + * 修改内容:移植到NSE项目使用 + * + *****************************************************************************/ +#ifndef __ZXIC_COMM_LIST_STACK_H__ +#define __ZXIC_COMM_LIST_STACK_H__ + + +/************************************************************************** + * 宏定义 * + **************************************************************************/ + +#define LISTSTACK_MAX_ELEMENT ((ZXIC_UINT32)(0x0ffffffe)) +#define LISTSTACK_INVALID_INDEX (0) +#define ALLOC_NUMBER (0x3) +/************************************************************************** + * liststack api * + **************************************************************************/ + +typedef struct _s_freelink +{ + ZXIC_UINT32 index; + ZXIC_UINT32 next; +}ZXIC_COMM_FREELINK; + + +typedef struct _s_List_Stack_Manager +{ + ZXIC_COMM_FREELINK *p_array; + + ZXIC_UINT32 capacity; + + ZXIC_UINT32 p_head; + + ZXIC_UINT32 free_num; + ZXIC_UINT32 used_num; + +}ZXIC_LISTSTACK_MANGER; + +/* +**zxic_comm_liststack_creat: +*/ + +ZXIC_RTN32 zxic_comm_liststack_creat (ZXIC_UINT32 element_num, + ZXIC_LISTSTACK_MANGER **p_list); + +/* +**NOTE:index allocated from 0: +*/ +ZXIC_RTN32 zxic_comm_liststack_alloc (ZXIC_LISTSTACK_MANGER *p_list, + ZXIC_UINT32 *index); +ZXIC_RTN32 zxic_comm_liststack_free (ZXIC_LISTSTACK_MANGER* p_list, + ZXIC_UINT32 index); +ZXIC_RTN32 zxic_comm_liststack_destroy(ZXIC_LISTSTACK_MANGER* p_list); +ZXIC_RTN32 zxic_comm_liststack_alloc_spec_index(ZXIC_LISTSTACK_MANGER* p_list, ZXIC_UINT32 index); + +ZXIC_RTN32 zxic_comm_liststack_show_used(ZXIC_LISTSTACK_MANGER* p_list, ZXIC_UINT32 line_number ); +ZXIC_RTN32 zxic_comm_liststack_show_free (ZXIC_LISTSTACK_MANGER* p_list, ZXIC_UINT32 line_number ); + + + +#endif /* end "_FTMCOMM_LIST_STACK_H" */ + + + + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_rb_tree.h b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_rb_tree.h new file mode 100644 index 0000000..cc3787c --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_rb_tree.h @@ -0,0 +1,128 @@ +/***************************************************************************** + * 版权所有 (C)2001-2015, 深圳市中兴通讯股份有限公司。 + * + * 文件名称: zxic_comm_rb_tree.h + * 文件标识: + * 内容摘要: + * 其它说明: + * 当前版本: + * 作 者: ChenWei10088471 + * 完成日期: + * 当前责任人-1: + * 当前责任人-2: + * + * DEPARTMENT : ASIC_FPGA_R&D_Dept + * MANUAL_PERCENT : 100% + *****************************************************************************/ + +#ifndef _ZXIC_COMM_RB_TREE_H +#define _ZXIC_COMM_RB_TREE_H + +#include "zxic_comm_double_link.h" +#include "zxic_comm_liststack.h" + +#define ZXIC_RBT_RED (0x1) +#define ZXIC_RBT_BLACK (0x2) +#define ZXIC_RBT_MAX_DEPTH (128) + +typedef ZXIC_SINT32 (*ZXIC_RB_CMPFUN)(ZXIC_VOID *p_new,ZXIC_VOID *p_old,ZXIC_UINT32 keysize); + + +typedef struct _rb_tn +{ + ZXIC_VOID *p_key; + ZXIC_UINT32 color_lsv; /*last 2 bits indicate color, bit2-31 if dynamic=0 indicate list val*/ + struct _rb_tn *p_left; + struct _rb_tn *p_right; + struct _rb_tn *p_parent; + D_NODE tn_ln; +}ZXIC_RB_TN; + +typedef struct _rb_cfg +{ + ZXIC_UINT32 key_size; + ZXIC_UINT32 is_dynamic; /* 1 - customer manage memory;0 - alloc all memory*/ + ZXIC_RB_TN *p_root; /* rb tree root node */ + D_HEAD tn_list; + ZXIC_RB_CMPFUN p_cmpfun; + ZXIC_LISTSTACK_MANGER *p_lsm; /* list stack manage*/ + ZXIC_UINT8 *p_keybase; + ZXIC_RB_TN *p_tnbase; + ZXIC_UINT32 is_init; +}ZXIC_RB_CFG; + + + +#define GET_TN_COLOR(p_tn) \ + ((p_tn == NULL) ? ZXIC_RBT_BLACK :(p_tn)->color_lsv & 0x3) + +#define SET_TN_COLOR(p_tn,color) \ + do{\ + (p_tn)->color_lsv &= 0xfffffffc;\ + (p_tn)->color_lsv |= (color & 0x3);\ + }while(0) + + + +#define GET_TN_LSV(p_tn) \ + ((p_tn)->color_lsv >> 2 ) + +#define SET_TN_LSV(p_tn,list_val) \ + do{\ + (p_tn)->color_lsv &= 0x3;\ + (p_tn)->color_lsv |= ((list_val) << 2); \ + }while(0) + + +/*init the rb node ,be careful init_color is red*/ +#define INIT_RBT_TN(p_tn,p_newkey) \ + do{\ + (p_tn)->p_key = p_newkey; \ + (p_tn)->color_lsv= 0; \ + (p_tn)->p_left = NULL; \ + (p_tn)->p_right = NULL; \ + (p_tn)->p_parent = NULL; \ + INIT_D_NODE(&((p_tn)->tn_ln),(p_tn));\ + }while(0) + +ZXIC_RTN32 zxic_comm_rb_init(ZXIC_RB_CFG *p_rb_cfg, + ZXIC_UINT32 total_num, + ZXIC_UINT32 key_size, + ZXIC_RB_CMPFUN cmpfun); + + +ZXIC_RTN32 zxic_comm_rb_insert(ZXIC_RB_CFG *p_rb_cfg, + ZXIC_VOID *p_key, + ZXIC_VOID *out_val); + +ZXIC_RTN32 zxic_comm_rb_delete(ZXIC_RB_CFG *p_rb_cfg, + ZXIC_VOID *p_key, + ZXIC_VOID *out_val); + +ZXIC_RTN32 zxic_comm_rb_search(ZXIC_RB_CFG *p_rb_cfg, + ZXIC_VOID *p_key, + ZXIC_VOID *out_val); + +ZXIC_RTN32 zxic_comm_rb_destroy(ZXIC_RB_CFG *p_rb_cfg); + +ZXIC_RB_TN *zxic_comm_rb_get_1st_tn(ZXIC_RB_CFG *p_rb_cfg); + +ZXIC_RB_TN *zxic_comm_rb_get_last_tn(ZXIC_RB_CFG *p_rb_cfg); + +ZXIC_RTN32 zxic_comm_rb_get_1st_key(ZXIC_RB_CFG* p_rb_cfg, ZXIC_VOID *p_key_out); + +ZXIC_RTN32 zxic_comm_rb_get_last_key(ZXIC_RB_CFG* p_rb_cfg, ZXIC_VOID *p_key_out); + +ZXIC_RTN32 zxic_comm_rb_insert_spec_index(ZXIC_RB_CFG *p_rb_cfg, ZXIC_VOID *p_key, ZXIC_UINT32 in_idx); + + +#define ZXIC_RBT_RC_BASE (0x1000) + +#define ZXIC_RBT_RC_UPDATE (ZXIC_RBT_RC_BASE | 0x1) +#define ZXIC_RBT_RC_SRHFAIL (ZXIC_RBT_RC_BASE | 0x2) +#define ZXIC_RBT_RC_FULL (ZXIC_RBT_RC_BASE | 0x3) +#define ZXIC_RBT_ISEMPTY_ERR (ZXIC_RBT_RC_BASE | 0x4) +#define ZXIC_RBT_PARA_INVALID (ZXIC_RBT_RC_BASE | 0x5) + +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_socket.h b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_socket.h new file mode 100644 index 0000000..aff6ef3 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_socket.h @@ -0,0 +1,157 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : zxic_comm_socket.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : 王春雷 +* 完成日期 : 2014/02/08 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef _ZXIC_COMM_SOCKET_H_ +#define _ZXIC_COMM_SOCKET_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef ZXIC_OS_WIN +#include +typedef SOCKET ZXIC_SOCKET; + +#else +#include +#include +#include +#include +typedef ZXIC_SINT32 ZXIC_SOCKET; +#endif + +typedef struct sockaddr SOCKADDR; +typedef struct sockaddr_in SOCKADDR_IN; + + +#define ZXIC_SOCK_VALID (0) +#define ZXIC_SOCK_INVALID (-1) +#define ZXIC_SOCK_NUM_MAX (16) + +#define ZXIC_SOCK_INADDR_ANY (0x00000000) +#define ZXIC_SOCK_INADDR_LOOPBACK (0x7f000001) +#define ZXIC_SOCK_INADDR_BROADCAST (0xffffffff) +#define ZXIC_SOCK_INADDR_NONE (0xffffffff) + +/* socket domain */ +#define ZXIC_SOCK_AF_INET AF_INET /* internetwork: UDP, TCP, etc. */ +#define ZXIC_SOCK_AF_INET6 AF_INET6 /* Internetwork Version 6 */ + +/* socket type */ +#define ZXIC_SOCK_STREAM SOCK_STREAM /* stream socket */ +#define ZXIC_SOCK_DGRAM SOCK_DGRAM /* datagram socket */ +#define ZXIC_SOCK_RAW SOCK_RAW /* raw-protocol interface */ +#define ZXIC_SOCK_RDM SOCK_RDM /* reliably-delivered message */ +#define ZXIC_SOCK_SEQPACKET SOCK_SEQPACKET /* sequenced packet stream */ + +/* socket protocol */ +#define ZXIC_SOCK_IPPROTO_IP IPPROTO_IP /* dummy for IP */ +#define ZXIC_SOCK_IPPROTO_TCP IPPROTO_TCP /* tcp */ +#define ZXIC_SOCK_IPPROTO_UDP IPPROTO_UDP /* user datagram protocol */ + +/* socket level */ +#define ZXIC_SOCK_SOL_SOCKET SOL_SOCKET /* options for socket level */ + +/* socket OptName */ +#define ZXIC_SOCK_SO_DEBUG SO_DEBUG /* turn on debugging info recording */ +#define ZXIC_SOCK_SO_ACCEPTCONN SO_ACCEPTCONN /* socket has had listen() */ +#define ZXIC_SOCK_SO_REUSEADDR SO_REUSEADDR /* allow local address reuse */ +#define ZXIC_SOCK_SO_KEEPALIVE SO_KEEPALIVE /* keep connections alive */ +#define ZXIC_SOCK_SO_DONTROUTE SO_DONTROUTE /* just use interface addresses */ +#define ZXIC_SOCK_SO_BROADCAST SO_BROADCAST /* permit sending of broadcast msgs */ +#define ZXIC_SOCK_SO_USELOOPBACK SO_USELOOPBACK /* bypass hardware when possible */ +#define ZXIC_SOCK_SO_LINGER SO_LINGER /* linger on close if data present */ +#define ZXIC_SOCK_SO_OOBINLINE SO_OOBINLINE /* leave received OOB data in line */ +#define ZXIC_SOCK_SO_SNDBUF SO_SNDBUF /* send buffer size */ +#define ZXIC_SOCK_SO_RCVBUF SO_RCVBUF /* receive buffer size */ +#define ZXIC_SOCK_SO_SNDLOWAT SO_SNDLOWAT /* send low-water mark */ +#define ZXIC_SOCK_SO_RCVLOWAT SO_RCVLOWAT /* receive low-water mark */ +#define ZXIC_SOCK_SO_SNDTIMEO SO_SNDTIMEO /* send timeout */ +#define ZXIC_SOCK_SO_RCVTIMEO SO_RCVTIMEO /* receive timeout */ +#define ZXIC_SOCK_SO_ERROR SO_ERROR /* get error status and clear */ +#define ZXIC_SOCK_SO_TYPE SO_TYPE /* get socket type */ + + +#define ZXIC_TCP_OP_NODELAY TCP_NODELAY + +typedef struct zxic_comm_sock_addr_t +{ + ZXIC_UINT32 family; + ZXIC_UINT32 port; + ZXIC_UINT32 addr; +}ZXIC_SOCK_ADDR_T; + +typedef struct zxic_comm_sock_mgr_t +{ + ZXIC_UINT32 is_init; + ZXIC_UINT32 count; + ZXIC_SOCKET socks[ZXIC_SOCK_NUM_MAX]; + ZXIC_UINT8 sock_vld[ZXIC_SOCK_NUM_MAX]; + ZXIC_MUTEX_T mutex; +}ZXIC_SOCK_MGR_T; + +/* API */ +ZXIC_RTN32 zxic_comm_sock_init(ZXIC_VOID); +ZXIC_RTN32 zxic_comm_sock_service_start(ZXIC_VOID); +ZXIC_RTN32 zxic_comm_sock_service_close(ZXIC_VOID); +ZXIC_RTN32 zxic_comm_sock_create(ZXIC_SOCKET *p_socket, + ZXIC_SINT32 domain, + ZXIC_SINT32 type, + ZXIC_SINT32 protocol); + +ZXIC_RTN32 zxic_comm_sock_set_opt(ZXIC_SOCKET sock, + ZXIC_SINT32 level, + ZXIC_SINT32 opt_name, + ZXIC_VOID *p_opt_val, + ZXIC_UINT32 opt_len); + +ZXIC_RTN32 zxic_comm_sock_get_opt(ZXIC_SOCKET sock, + ZXIC_SINT32 level, + ZXIC_SINT32 opt_name, + ZXIC_VOID *p_opt_val, + ZXIC_UINT32 *p_opt_len); + +ZXIC_RTN32 zxic_comm_sock_bind_listen(ZXIC_SOCKET sock, + ZXIC_SOCK_ADDR_T *p_sock_addr); + +ZXIC_RTN32 zxic_comm_sock_accpet(ZXIC_SOCKET listen_sock, + ZXIC_SOCKET *p_cnnt_sock, + ZXIC_SOCK_ADDR_T *p_sock_addr); + +ZXIC_RTN32 zxic_comm_sock_connect(ZXIC_SOCKET sock, + ZXIC_SOCK_ADDR_T *p_sock_addr); + +ZXIC_SINT32 zxic_comm_sock_send(ZXIC_SOCKET sock, + ZXIC_CHAR *p_buf, + ZXIC_SINT32 len, + ZXIC_SINT32 flag); + +ZXIC_SINT32 zxic_comm_sock_recv(ZXIC_SOCKET sock, + ZXIC_CHAR *p_buf, + ZXIC_SINT32 len, + ZXIC_SINT32 flag); + +ZXIC_RTN32 zxic_comm_sock_close(ZXIC_SOCKET sock); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_thread.h b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_thread.h new file mode 100644 index 0000000..f07d090 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_comm_thread.h @@ -0,0 +1,95 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : zxic_comm_thread.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : 王春雷 +* 完成日期 : 2014/02/08 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef _ZXIC_COMM_THREAD_H_ +#define _ZXIC_COMM_THREAD_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef ZXIC_OS_LINUX +#include +#include +#endif + +#define THREAD_NAME_MAX (64) +#define ZXIC_THREAD_TIME_INFINITE (0xFFFFFFFF) /* Infinite timeout */ + +typedef ZXIC_VOID* (*ZXIC_THREAD_FUNC) (ZXIC_VOID*); + +/* Thread ID */ +typedef struct zxic_comm_thread_id_t +{ +#ifdef ZXIC_OS_WIN + HANDLE id; +#else + //pthread_t id; + int id; +#endif +}ZXIC_THREAD_ID_T; + +/* Thread CreateFlag */ +#define ZXIC_THREAD_FLAG_DETACH (1 << 0) +#define ZXIC_THREAD_FLAG_EXPLICIT_SCHED (1 << 1) + +typedef struct zxic_comm_thread_info_t +{ + ZXIC_CHAR name[THREAD_NAME_MAX]; /* 线程名 */ + ZXIC_UINT32 priority; /* 优先级 */ + ZXIC_UINT32 stack_size; /* 初始栈大小,以字节为单位 */ + ZXIC_UINT32 create_flag; /* 线程标志 */ + ZXIC_THREAD_ID_T id; /* 线程ID */ + ZXIC_THREAD_FUNC thread_func; /* 线程函数 */ + ZXIC_VOID* p_arg; /* 线程入参 */ + ZXIC_UINT32 is_valid; /* 是否有效 */ +}ZXIC_THREAD_INFO_T; + +/* API */ +ZXIC_RTN32 zxic_comm_thread_info_init(ZXIC_VOID); +ZXIC_RTN32 zxic_comm_thread_info_add(ZXIC_THREAD_ID_T* p_thread_id, + ZXIC_CONST ZXIC_CHAR* p_name, + ZXIC_UINT32 priority, + ZXIC_UINT32 stack_size, + ZXIC_UINT32 create_flag, + ZXIC_THREAD_FUNC p_thread_func, + ZXIC_VOID* p_arg, + ZXIC_UINT32* p_info_index); +ZXIC_RTN32 zxic_comm_thread_info_del(ZXIC_THREAD_ID_T *p_thread_id); +ZXIC_RTN32 zxic_comm_thread_info_print(ZXIC_VOID); + +ZXIC_RTN32 zxic_comm_thread_create(ZXIC_CONST ZXIC_CHAR *p_name, + ZXIC_UINT32 priority, + ZXIC_UINT32 stack_size, + ZXIC_UINT32 create_flag, + ZXIC_THREAD_FUNC thread_func, + ZXIC_VOID *p_arg, + ZXIC_THREAD_ID_T *p_thread_id); + +ZXIC_RTN32 zxic_comm_thread_exit(ZXIC_VOID); +ZXIC_RTN32 zxic_comm_thread_wait(ZXIC_THREAD_ID_T *p_thread_id, ZXIC_DWORD wait_time); +ZXIC_RTN32 zxic_comm_thread_close_handle(ZXIC_THREAD_ID_T *p_thread_id); + +#ifdef __cplusplus +} +#endif + + +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_common.h b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_common.h new file mode 100644 index 0000000..59ea706 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_common.h @@ -0,0 +1,2674 @@ +/************************************************************** +* 版权所有 (C)2013-2020, 深圳市中兴通讯股份有限公司 +* 文件名称 : zxic_common.h +* 文件标识 : +* 内容摘要 : 大部分的项目,只需要感知这一个头文件即可, + 其包括了变量定义/打印/日志/参数校验/互斥锁/bit流拼接等常用定义和功能 +* 其它说明 : 编译宏:ZXIC_OS_WIN/ZXIC_RELEASE/MACRO_CPU64 +* 当前版本 : +* 作 者 : +* 完成日期 : 2020/07/20 +* DEPARTMENT: 有线开发四部-系统软件团队 +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ +#ifndef __ZXIC_COMMON_H__ +#define __ZXIC_COMMON_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* +编译宏说明 +ZXIC_OS_WIN :若不导入该宏,则默认为 ZXIC_OS_LINUX +ZXIC_RELEASE:若不导入该宏,则默认为 ZXIC_DEBUG +MACRO_CPU64 :若不导入该宏,则默认为32位操作系统 +*/ + +#include "zxic_private_top.h" +#include "zxic_private.h" +//#include +//#include +//#include +#include +#include +//#include +//#include +#include +//#include +#include +//#include + +#ifdef ZXIC_OS_WIN /* 编译宏导入 */ +#include +#include +#include +#include +#pragma warning (disable:4996) +#else +#include +#include +#include +//#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif + +#if ZXIC_REAL("数据类型定义") +/* 无符号整数 */ +#define ZXIC_UINT8 unsigned char +#define ZXIC_UINT16 unsigned short + +#ifndef ZXIC_UINT32 +#define ZXIC_UINT32 unsigned int +#endif + +#ifndef ZXIC_UINT64 +#define ZXIC_UINT64 unsigned long long +#endif +#define ZXIC_DWORD unsigned long /* 慎用,注意:WIN系统:32bits LINUX系统:64bits */ +#define ZXIC_SIZE_T size_t /* 32位系统:uint32 64位系统:uint64 */ + +/* 有符号整数 */ +#define ZXIC_CHAR char /* char默认为unsigned还是signed取决于编译器,定义字符可用 */ +#define ZXIC_SINT8 signed char +#define ZXIC_SINT16 signed short + +#ifndef ZXIC_SINT32 +#define ZXIC_SINT32 signed int +#endif + +#ifndef ZXIC_SINT64 +#define ZXIC_SINT64 signed long long +#endif + +#define ZXIC_SDWORD long + +/* 浮点数 */ +//#define ZXIC_FLOAT float +//#define ZXIC_DOUBLE double +//#define ZXIC_LDOUBLE long double +#define ZXIC_FLOAT int +#define ZXIC_DOUBLE long +#define ZXIC_LDOUBLE long long + +/* 文件类型 */ +typedef struct file ZXIC_FILE; + +/* */ +#define ZXIC_VOL volatile +#define ZXIC_VOID void +#define ZXIC_CONST const +#define ZXIC_RTN32 ZXIC_UINT32 + +#ifdef MACRO_CPU64 /* 64位系统编译宏导入,慎重修改 */ +#define ZXIC_ADDR_T ZXIC_UINT64 +#define ZXIC_SIZEOF(x) (sizeof(x) & 0xFFFFFFFFU) /* 在64位环境下,sizeof的长度是64b */ +#define ZXIC_SIZEOF_T(x) ((ZXIC_UINT32)(sizeof(x) & 0xFFFFFFFF)) + +#else +#define ZXIC_ADDR_T ZXIC_UINT32 +#define ZXIC_SIZEOF(x) (sizeof(x)) +#define ZXIC_SIZEOF_T(x) (sizeof(x)) +#endif + +/* 特殊变量 */ +#define ZXIC_NULL (0) +#define ZXIC_OK (0U) /* 后面加U,防止32位系统64位系统常量的默认长度不一致 */ +#define ZXIC_ERR (1U) +#define ZXIC_TRUE (1U) +#define ZXIC_FALSE (0U) +#define ZXIC_UINT8_MAX (0xFFU) +#define ZXIC_UINT32_MAX (0xFFFFFFFFU) +#define ZXIC_ULONG_MAX (0xFFFFFFFFFFFFFFFFUL) +#define ZXIC_SINT_MAX (0x7FFFFFFF) +#define ZXIC_SINT_MIN (-ZXIC_SINT_MAX - 1) + + +#define ZXIC_UINT64_MASK (0xFFFFFFFFFFFFFFFFULL) +#define ZXIC_UINT32_MASK (0xFFFFFFFFU) +#define ZXIC_UINT16_MASK (0xFFFFU) +#define ZXIC_UINT8_MASK (0xFFU) +#endif /* END 数据类型定义 */ + +#if ZXIC_REAL("宏函数定义") +#define ZXIC_COMM_MEMCMP ic_comm_memcmp +#define ZXIC_COMM_MEMSET memset +#define ZXIC_COMM_MEMMOVE memmove +#define ZXIC_COMM_MEMSET_S ic_comm_memset_s +#define ZXIC_COMM_MEMCPY ic_comm_memcpy +#define ZXIC_COMM_MEMCPY_S ic_comm_memcpy_s +#define ZXIC_COMM_STRLEN strlen +#define ZXIC_COMM_STRNLEN strnlen +#define ZXIC_COMM_STRNLEN_S ic_comm_strnlen_s +#define ZXIC_COMM_STRCPY strcpy +#define ZXIC_COMM_STRCPY_S ic_comm_strcpy_s +#define ZXIC_COMM_STRNCPY strncpy +#define ZXIC_COMM_STRNCPY_S ic_comm_strncpy_s +#define ZXIC_COMM_STRCMP strcmp +#define ZXIC_COMM_STRNCMP ic_comm_strncmp +#define ZXIC_COMM_STRTOK strtok +#define ZXIC_COMM_STRTOK_S ic_comm_strtok_s +#define ZXIC_COMM_STRCAT_S ic_comm_strcat_s +#define ZXIC_COMM_STRNCAT_S ic_comm_strncat_s + +//#define ZXIC_COMM_FOPEN fopen +#define ZXIC_COMM_FOPEN filp_open +//#define ZXIC_COMM_FCLOSE fclose +#define ZXIC_COMM_FCLOSE(a) filp_close(a,NULL) +#define ZXIC_COMM_FGETS fgets +#define ZXIC_COMM_FPUTS fputs +#define ZXIC_COMM_FREAD fread + +// #define ZXIC_COMM_FPRINTF fprintf +// #define ZXIC_COMM_FPRINTF(a,b,c) printk(b,c) +#define ZXIC_COMM_SSCANF ic_comm_sscanf +#define ZXIC_COMM_FSCANF (void)fscanf +#define ZXIC_COMM_SNPRINTF_S ic_comm_snprintf_s +#define ZXIC_COMM_VSNPRINTF_S ic_comm_vsnprintf_s + +#define ZXIC_COMM_TIME time +#define ZXIC_COMM_ATOI atoi + +#ifdef ZXIC_OS_WIN +#define ZXIC_COMM_ACCESS _access +#define ZXIC_COMM_SNPRINTF _snprintf +#define ZXIC_COMM_VSNPRINTF _vsnprintf +#define ZXIC_COMM_GETPID _getpid +#else +#define ZXIC_COMM_ACCESS kern_path +/*#define ZXIC_COMM_SNPRINTF snprintf*/ +#define ZXIC_COMM_SNPRINTF(a,b,c...) __snprintf_chk(a,b,0,b,c) +#define ZXIC_COMM_VSNPRINTF vsnprintf +#define ZXIC_COMM_GETPID getpid +#endif + +#ifdef MACRO_CPU64 /* 64位系统编译宏导入,慎重修改 */ +#define ZXIC_COMM_PTR_TO_VAL(p) ((ZXIC_UINT64)(p)) +#define ZXIC_COMM_VAL_TO_PTR(v) ((ZXIC_VOID *)((ZXIC_UINT64)(v))) +#define ZXIC_SSIZE_T ZXIC_SINT64 +#else +#define ZXIC_COMM_PTR_TO_VAL(p) ((ZXIC_UINT32)(p)) +#define ZXIC_COMM_VAL_TO_PTR(v) ((ZXIC_VOID *)(long)((ZXIC_UINT32)(v))) +#define ZXIC_SSIZE_T ZXIC_SINT32 + +#endif + +#ifdef ZXIC_OS_WIN +#define ZXIC_COMM_STRCASECMP stricmp +#else +#define ZXIC_COMM_STRCASECMP strcasecmp +#endif + +#define ZXIC_COMM_FFLUSH (ZXIC_VOID)fflush +#define ZXIC_COMM_SPRINTF (ZXIC_VOID)sprintf + + + +#ifdef ZXIC_RELEASE /* 编译宏控制,默认编译为DEBUG版本 */ +#define ZXIC_COMM_ASSERT(x) +#else + #ifdef ZXIC_FOR_FUZZER + #define ZXIC_COMM_ASSERT(x) + #else + #define ZXIC_COMM_ASSERT(x) + #endif +#endif + +#endif /* END 宏函数定义 */ + +#define ZXIC_COMM_MEMORY_MAX_B_SIZE (200 * 1024 * 1024) /* 200M */ +#define ZXIC_COMM_STRNLEN_MAX (0xffffffff) + +#if ZXIC_REAL("打印-print") +#if ZXIC_REAL("开关") +ZXIC_VOID zxic_comm_set_print_en (ZXIC_UINT32 enable); +ZXIC_RTN32 zxic_comm_get_print_en (ZXIC_VOID); +ZXIC_VOID zxic_comm_set_print_level(ZXIC_TRACE_LEVEL debug_level); +ZXIC_RTN32 zxic_comm_get_print_level(ZXIC_VOID); +#endif +#if ZXIC_REAL("功能") +ZXIC_VOID ZXIC_COMM_PRINT(ZXIC_CONST ZXIC_CHAR *format, ...); +ZXIC_VOID ZXIC_COMM_TRACE_ERROR(ZXIC_CONST ZXIC_CHAR *format, ...); +ZXIC_VOID ZXIC_COMM_TRACE_INFO(ZXIC_CONST ZXIC_CHAR *format, ...); +ZXIC_VOID ZXIC_COMM_TRACE_DEBUG(ZXIC_CONST ZXIC_CHAR *format, ...); +ZXIC_VOID ZXIC_COMM_TRACE_ALL(ZXIC_CONST ZXIC_CHAR *format, ...); + +ZXIC_VOID ZXIC_COMM_TRACE_DEV_ERROR(ZXIC_UINT32 dev_id, ZXIC_CONST ZXIC_CHAR *format, ...); +ZXIC_VOID ZXIC_COMM_TRACE_DEV_INFO(ZXIC_UINT32 dev_id, ZXIC_CONST ZXIC_CHAR *format, ...); +ZXIC_VOID ZXIC_COMM_TRACE_DEV_DEBUG(ZXIC_UINT32 dev_id,ZXIC_CONST ZXIC_CHAR *format, ...); +ZXIC_VOID ZXIC_COMM_TRACE_DEV_ALL(ZXIC_UINT32 dev_id, ZXIC_CONST ZXIC_CHAR *format, ...); + +ZXIC_VOID ZXIC_COMM_DBGCNT64_PRINT (ZXIC_CONST ZXIC_CHAR * name, ZXIC_UINT64 value); +ZXIC_VOID ZXIC_COMM_DBGCNT32_PRINT (ZXIC_CONST ZXIC_CHAR * name, ZXIC_UINT32 value); +ZXIC_VOID ZXIC_COMM_DBGCNT32_PAR_PRINT (ZXIC_CONST ZXIC_CHAR * name, ZXIC_UINT32 parm, ZXIC_UINT32 value); + +#endif +#endif + +#if ZXIC_REAL("互斥锁") +ZXIC_RTN32 zxic_comm_mutex_create (ZXIC_MUTEX_T *p_mutex); +ZXIC_RTN32 zxic_comm_mutex_lock (ZXIC_MUTEX_T *p_mutex); +ZXIC_RTN32 zxic_comm_mutex_unlock (ZXIC_MUTEX_T *p_mutex); +ZXIC_RTN32 zxic_comm_mutex_destroy(ZXIC_MUTEX_T *p_mutex); +#endif + +#if ZXIC_REAL("信号量") +ZXIC_RTN32 zxic_comm_sem_create(ZXIC_SEM_T *p_sem, ZXIC_SINT32 share, ZXIC_SINT32 IniCount, ZXIC_SINT32 MaxCount); +ZXIC_RTN32 zxic_comm_sem_release(ZXIC_SEM_T *p_sem); +ZXIC_RTN32 zxic_comm_sem_wait(ZXIC_SEM_T *p_sem); +#endif + +#if ZXIC_REAL("参数检查") + +#if ZXIC_REAL("NO DEV_ID & ASSERT") +#define ZXIC_COMM_CHECK_RC(rc,becall)\ + do{\ + if(ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,becall);\ + ZXIC_COMM_ASSERT(0);\ + return rc;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_RC_MEMORY_FREE(rc, becall, ptr)\ + do{\ + if (ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXICP %s:%d [ErrorCode:0x%x], %s Call %s Fail!\n", __FILE__, __LINE__, rc, __FUNCTION__, becall);\ + ZXIC_COMM_FREE(ptr);\ + ZXIC_COMM_ASSERT(0);\ + return rc;\ + }\ + } while(0) + +#define ZXIC_COMM_CHECK_POINT(point)\ + do{\ + if(ZXIC_NULL == (point))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_POINT_NULL;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_POINT_MEMORY_FREE(point, ptr)\ + do{\ + if(ZXIC_NULL == (point))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_POINT_NULL;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_POINT_EMEMORY_FREE2PTR(point, ptr0, ptr1)\ + do{\ + if(ZXIC_NULL == (point))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + ZXIC_COMM_FREE(ptr0);\ + ZXIC_COMM_FREE(ptr1);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_POINT_NULL;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_POINT_RETURN_NULL(point)\ + do{\ + if(ZXIC_NULL == (point))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_NULL;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_INDEX(val,min,max)\ + do{\ + if(ZXIC_PAR_CHK_INVALID_INDEX == zxic_comm_index_check(val, min, max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + else if(ZXIC_PAR_CHK_INVALID_RANGE == zxic_comm_index_check(val, min, max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_RANGE;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_EQUAL(val,equal)\ + do{\ + if(val == equal)\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [equal=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, equal, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_EQUAL_RETURN_OK(val,equal)\ + do{\ + if(val == equal)\ + {\ + return ZXIC_OK;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_NOT_EQUAL(val,equal)\ + do{\ + if(val != equal)\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [equal=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, equal, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_UPPER(val,max)\ + do{\ + if((val) > (max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, max, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_LOWER(val,min)\ + do{\ + if((val) < (min))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_BOTH(val,min,max)\ + do{\ + if(((val) < (min)) || ((val) > (max)))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_UPPER_MEMORY_FREE(val,max,ptr)\ + do{\ + if((val) > (max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_LOWER_MEMORY_FREE(val,min,ptr)\ + do{\ + if((val) < (min))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_BOTH_MEMORY_FREE(val,min,max,ptr)\ + do{\ + if(((val) < (min)) || ((val) > (max)))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_MEMORY_FREE(val0,val1,ptr)\ + do{\ + if((ZXIC_UINT32_MAX - (val0)) < (val1))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW(val0,val1)\ + do{\ + if((ZXIC_UINT32_MAX - (val0)) < (val1))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + + +#define ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_64(val0,val1)\ +do{\ + if((ZXIC_ULONG_MAX - (val0)) < (val1))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%016llx] INVALID] [val1=0x%016llx] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ +}while(0) + +#define ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_UNLOCK(val0, val1, mutex)\ + do{\ + if((ZXIC_UINT32_MAX - (val0)) < (val1))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + if(0 != zxic_comm_mutex_unlock(mutex))\ + {\ + ZXIC_COMM_TRACE_ERROR("File: [%s],Function:[%s],Line:%u mutex unlock failed!-->Return ERROR\n", __FILE__, __FUNCTION__, __LINE__);\ + }\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW(val0,val1)\ + do{\ + if((val0) < (val1))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW_64(val0,val1)\ +do{\ + if((val0) < (val1))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%016llx] INVALID] [val1=0x%016llx] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ +}while(0) + +#define ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW_UNLOCK(val0, val1, mutex)\ +do{\ +if((val0) < (val1))\ +{\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + if(0 != zxic_comm_mutex_unlock(mutex))\ + {\ + ZXIC_COMM_TRACE_ERROR("File: [%s],Function:[%s],Line:%u mutex unlock failed!-->Return ERROR\n", __FILE__, __FUNCTION__, __LINE__);\ + }\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ +}\ +}while(0) + +#define ZXIC_COMM_CHECK_INDEX_MUL_OVERFLOW(val0,val1)\ +do{\ + if(((val0) > 0) && ((ZXIC_UINT32_MAX / (val0)) < (val1)))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ +}while(0) +#define ZXIC_COMM_CHECK_INDEX_MUL_OVERFLOW_64(val0,val1)\ +do{\ + if(((val0) > 0) && ((ZXIC_ULONG_MAX / (val0)) < (val1)))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%016llx] INVALID] [val1=0x%016llx] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ +}while(0) + +#define ZXIC_COMM_CHECK_INDEX_MUL_OVERFLOW_UNLOCK(val0, val1, mutex)\ +do{\ + if(((val0) > 0) && ((ZXIC_UINT32_MAX / (val0)) < (val1)))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + if(0 != zxic_comm_mutex_unlock(mutex))\ + {\ + ZXIC_COMM_TRACE_ERROR("File: [%s],Function:[%s],Line:%u mutex unlock failed!-->Return ERROR\n", __FILE__, __FUNCTION__, __LINE__);\ + }\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ +}while(0) + +#define ZXIC_COMM_CHECK_INDEX_RETURN_NULL(val,min,max)\ + do{\ + if(ZXIC_PAR_CHK_INVALID_INDEX == zxic_comm_index_check(val, min, max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_NULL;\ + }\ + else if(ZXIC_PAR_CHK_INVALID_RANGE == zxic_comm_index_check(val, min, max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_NULL;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_RC_UNLOCK(rc, becall, mutex)\ + do{\ + if(ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,becall);\ + if(0 != zxic_comm_mutex_unlock(mutex))\ + { \ + ZXIC_COMM_TRACE_ERROR("File: [%s],Function:[%s],Line:%u mutex unlock failed!-->Return ERROR\n", __FILE__, __FUNCTION__, __LINE__);\ + } \ + ZXIC_COMM_ASSERT(0);\ + return rc;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_RC_CLOSE_FP(rc, becall, fp)\ + do{\ + if(ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,becall);\ + if(ZXIC_COMM_FCLOSE(fp))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d !-- %s close file Fail!\n",__FILE__,__LINE__,__FUNCTION__);\ + }\ + ZXIC_COMM_ASSERT(0);\ + return rc;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_POINT_CLOSE_FP(point, fp)\ + do{\ + if(NULL == (point))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + if (ZXIC_COMM_FCLOSE(fp))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d !-- %s close file Fail!\n",__FILE__,__LINE__,__FUNCTION__);\ + }\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_POINT_NULL;\ + }\ + }while(0)\ + + +#define ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_RETURN(val0, val1)\ + do{\ + if((0xFFFFFFFF - (val0)) < (val1))\ + {\ + ZXIC_COMM_TRACE_ERROR("ICM %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + return;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW_RETURN(val0, val1)\ + do{\ + if(val0 < val1)\ + {\ + ZXIC_COMM_TRACE_ERROR("ICM %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + return;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_CLOSE_FP_NO_ASSERT(dev_id, val0, val1, fp)\ + do{\ + if((0xFFFFFFFF - (val0)) < (val1))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "ICM %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + if (ZXIC_COMM_FCLOSE(fp))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n ICM %s:%d !-- %s close file Fail!\n",__FILE__,__LINE__,__FUNCTION__);\ + }\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_CLOSE_FP_NO_ASSERT(dev_id, val0, val1, fp)\ + do{\ + if((val0 > 0) && ((0xFFFFFFFF / (val0)) < (val1)))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "ICM %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + if (ZXIC_COMM_FCLOSE(fp))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n ICM %s:%d !-- %s close file Fail!\n",__FILE__,__LINE__,__FUNCTION__);\ + }\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#endif + +#if ZXIC_REAL("NO DEV_ID & NO ASSERT") +#define ZXIC_COMM_CHECK_RC_NO_ASSERT(rc,becall)\ + do{\ + if(ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,becall);\ + return rc;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_RC_NO_ASSERT_UNLOCK(rc, becall, mutex)\ + do{\ + if(ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,becall);\ + if(0 != zxic_comm_mutex_unlock(mutex))\ + { \ + ZXIC_COMM_TRACE_ERROR("File: [%s],Function:[%s],Line:%u mutex unlock failed!-->Return ERROR\n", __FILE__, __FUNCTION__, __LINE__);\ + } \ + return rc;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, becall, ptr)\ + do{\ + if (ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXICP %s:%d [ErrorCode:0x%x], %s Call %s Fail!\n", __FILE__, __LINE__, rc, __FUNCTION__, becall);\ + ZXIC_COMM_FREE(ptr);\ + return rc;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_RC_MEMORY_FREE2PTR_NO_ASSERT(rc, becall, ptr1, ptr2)\ + do{\ + if (ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXICP %s:%d [ErrorCode:0x%x], %s Call %s Fail!\n", __FILE__, __LINE__, rc, __FUNCTION__, becall);\ + ZXIC_COMM_FREE(ptr1);\ + ZXIC_COMM_FREE(ptr2);\ + return rc;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_RC_MEMORY_FREE3PTR_NO_ASSERT(rc, becall, ptr1, ptr2, ptr3)\ + do{\ + if (ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXICP %s:%d [ErrorCode:0x%x], %s Call %s Fail!\n", __FILE__, __LINE__, rc, __FUNCTION__, becall);\ + ZXIC_COMM_FREE(ptr1);\ + ZXIC_COMM_FREE(ptr2);\ + ZXIC_COMM_FREE(ptr3);\ + return rc;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_POINT_NO_ASSERT(point)\ + do{\ + if(ZXIC_NULL == (point))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + return ZXIC_PAR_CHK_POINT_NULL;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_POINT_CLOSE_FP_NO_ASSERT(point, fp)\ + do{\ + if(NULL == (point))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + if (ZXIC_COMM_FCLOSE(fp))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d !-- %s close file Fail!\n",__FILE__,__LINE__,__FUNCTION__);\ + }\ + return ZXIC_PAR_CHK_POINT_NULL;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_POINT_MEMORY_FREE_NO_ASSERT(point,ptr)\ + do{\ + if(ZXIC_NULL == (point))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + return ZXIC_PAR_CHK_POINT_NULL;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_POINT_MEMORY_FREE2PTR_NO_ASSERT(point, ptr1, ptr2)\ + do{\ + if(ZXIC_NULL == (point))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + ZXIC_COMM_FREE(ptr1);\ + ZXIC_COMM_FREE(ptr2);\ + return ZXIC_PAR_CHK_POINT_NULL;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_POINT_MEMORY_FREE3PTR_NO_ASSERT(point, ptr1, ptr2, ptr3)\ + do{\ + if(ZXIC_NULL == (point))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + ZXIC_COMM_FREE(ptr1);\ + ZXIC_COMM_FREE(ptr2);\ + ZXIC_COMM_FREE(ptr3);\ + return ZXIC_PAR_CHK_POINT_NULL;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_INDEX_NO_ASSERT(val,min,max)\ + do{\ + if(ZXIC_PAR_CHK_INVALID_INDEX == zxic_comm_index_check(val, min, max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + else if(ZXIC_PAR_CHK_INVALID_RANGE == zxic_comm_index_check(val, min, max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + return ZXIC_PAR_CHK_INVALID_RANGE;\ + }\ + }while (0) + +#define ZXIC_COMM_CHECK_INDEX_NO_ASSERT_UNLOCK(val, min, max, mutex)\ + do{\ + if(ZXIC_PAR_CHK_INVALID_INDEX == zxic_comm_index_check(val, min, max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + if(0 != zxic_comm_mutex_unlock(mutex))\ + { \ + ZXIC_COMM_TRACE_ERROR("File: [%s],Function:[%s],Line:%u mutex unlock failed!-->Return ERROR\n", __FILE__, __FUNCTION__, __LINE__);\ + } \ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + else if(ZXIC_PAR_CHK_INVALID_RANGE == zxic_comm_index_check(val, min, max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + if(0 != zxic_comm_mutex_unlock(mutex))\ + { \ + ZXIC_COMM_TRACE_ERROR("File: [%s],Function:[%s],Line:%u mutex unlock failed!-->Return ERROR\n", __FILE__, __FUNCTION__, __LINE__);\ + } \ + return ZXIC_PAR_CHK_INVALID_RANGE;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_INDEX_UPPER_NO_ASSERT(val, max)\ + do{\ + if((val) > (max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, max, __FUNCTION__);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_INDEX_UPPER_NO_ASSERT_UNLOCK(val, max, mutex)\ + do{\ + if((val) > (max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, max, __FUNCTION__);\ + if(0 != zxic_comm_mutex_unlock(mutex))\ + { \ + ZXIC_COMM_TRACE_ERROR("File: [%s],Function:[%s],Line:%u mutex unlock failed!-->Return ERROR\n", __FILE__, __FUNCTION__, __LINE__);\ + } \ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_UPPER_MEMORY_FREE_NO_ASSERT(val, max, ptr)\ + do{\ + if((val) > (max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_INDEX_LOWER_NO_ASSERT(val,min)\ + do{\ + if((val) < (min))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, __FUNCTION__);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_INDEX_LOWER_NO_ASSERT_UNLOCK(val, min, mutex)\ + do{\ + if((val) < (min))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, __FUNCTION__);\ + if(0 != zxic_comm_mutex_unlock(mutex))\ + { \ + ZXIC_COMM_TRACE_ERROR("File: [%s],Function:[%s],Line:%u mutex unlock failed!-->Return ERROR\n", __FILE__, __FUNCTION__, __LINE__);\ + } \ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_INDEX_LOWER_MEMORY_FREE_NO_ASSERT(val,min,ptr)\ + do{\ + if((val) < (min))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_BOTH_NO_ASSERT(val, min, max)\ + do{\ + if(((val) < (min)) || ((val) > (max)))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_INDEX_BOTH_NO_ASSERT_UNLOCK(val, min, max, mutex)\ + do{\ + if(((val) < (min)) || ((val) > (max)))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + if(0 != zxic_comm_mutex_unlock(mutex))\ + { \ + ZXIC_COMM_TRACE_ERROR("File: [%s],Function:[%s],Line:%u mutex unlock failed!-->Return ERROR\n", __FILE__, __FUNCTION__, __LINE__);\ + } \ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_BOTH_MEMORY_FREE_NO_ASSERT(val, min, max, ptr)\ + do{\ + if(((val) < (min)) || ((val) > (max)))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(val0, val1)\ + do{\ + if((ZXIC_UINT32_MAX - (val0)) < (val1))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_64_NO_ASSERT(val0,val1)\ + do{\ + if((ZXIC_ULONG_MAX - (val0)) < (val1))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT_UNLOCK(val0, val1, mutex)\ +do{\ + if((ZXIC_UINT32_MAX - (val0)) < (val1))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + if(0 != zxic_comm_mutex_unlock(mutex))\ + {\ + ZXIC_COMM_TRACE_ERROR("File: [%s],Function:[%s],Line:%u mutex unlock failed!-->Return ERROR\n", __FILE__, __FUNCTION__, __LINE__);\ + }\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ +}while(0) + +#define ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW_NO_ASSERT(val0, val1)\ + do{\ + if((val0) < (val1))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW_NO_ASSERT_UNLOCK(val0, val1, mutex)\ + do{\ + if((val0) < (val1))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + if(0 != zxic_comm_mutex_unlock(mutex))\ + {\ + ZXIC_COMM_TRACE_ERROR("File: [%s],Function:[%s],Line:%u mutex unlock failed!-->Return ERROR\n", __FILE__, __FUNCTION__, __LINE__);\ + }\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_INDEX_MUL_OVERFLOW_NO_ASSERT(val0, val1)\ + do{\ + if(((val0) > 0) && ((ZXIC_UINT32_MAX / (val0)) < (val1)))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_INDEX_MUL_OVERFLOW_NO_ASSERT_UNLOCK(val0, val1, mutex)\ + do{\ + if(((val0) > 0) && ((ZXIC_UINT32_MAX / (val0)) < (val1)))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + if(0 != zxic_comm_mutex_unlock(mutex))\ + {\ + ZXIC_COMM_TRACE_ERROR("File: [%s],Function:[%s],Line:%u mutex unlock failed!-->Return ERROR\n", __FILE__, __FUNCTION__, __LINE__);\ + }\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_RETURN_VOID_NO_ASSERT(val,min,max)\ + do{\ + if(ZXIC_PAR_CHK_INVALID_INDEX == zxic_comm_index_check(val, min, max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + return ;\ + }\ + else if(ZXIC_PAR_CHK_INVALID_RANGE == zxic_comm_index_check(val, min, max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + return ;\ + }\ + }while (0) + +#define ZXIC_COMM_CHECK_INDEX_RETURN_NULL_NO_ASSERT(val,min,max)\ + do{\ + if(ZXIC_PAR_CHK_INVALID_INDEX == zxic_comm_index_check(val, min, max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + return ZXIC_NULL;\ + }\ + else if(ZXIC_PAR_CHK_INVALID_RANGE == zxic_comm_index_check(val, min, max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + return ZXIC_NULL;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_INDEX_CLOSE_FP_NO_ASSERT(val,min,max,fp)\ + do{\ + if(ZXIC_PAR_CHK_INVALID_INDEX == zxic_comm_index_check(val, min, max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + if (ZXIC_COMM_FCLOSE(fp))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d !-- %s close file Fail!\n",__FILE__,__LINE__,__FUNCTION__);\ + }\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + else if(ZXIC_PAR_CHK_INVALID_RANGE == zxic_comm_index_check(val, min, max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + if (ZXIC_COMM_FCLOSE(fp))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d !-- %s close file Fail!\n",__FILE__,__LINE__,__FUNCTION__);\ + }\ + return ZXIC_PAR_CHK_INVALID_RANGE;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_INDEX_MEMORY_FREE_NO_ASSERT(val,min,max,ptr)\ + do{\ + if(ZXIC_PAR_CHK_INVALID_INDEX == zxic_comm_index_check(val, min, max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + else if(ZXIC_PAR_CHK_INVALID_RANGE == zxic_comm_index_check(val, min, max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + return ZXIC_PAR_CHK_INVALID_RANGE;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_MEMORY_FREE2PTR_NO_ASSERT(val, min, max, ptr1, ptr2)\ + do{\ + if(ZXIC_PAR_CHK_INVALID_INDEX == zxic_comm_index_check(val, min, max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr1);\ + ZXIC_COMM_FREE(ptr2);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + else if(ZXIC_PAR_CHK_INVALID_RANGE == zxic_comm_index_check(val, min, max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr1);\ + ZXIC_COMM_FREE(ptr2);\ + return ZXIC_PAR_CHK_INVALID_RANGE;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_MEMORY_FREE3PTR_NO_ASSERT(val, min, max, ptr1, ptr2, ptr3)\ + do{\ + if(ZXIC_PAR_CHK_INVALID_INDEX == zxic_comm_index_check(val, min, max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr1);\ + ZXIC_COMM_FREE(ptr2);\ + ZXIC_COMM_FREE(ptr3);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + else if(ZXIC_PAR_CHK_INVALID_RANGE == zxic_comm_index_check(val, min, max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr1);\ + ZXIC_COMM_FREE(ptr2);\ + ZXIC_COMM_FREE(ptr3);\ + return ZXIC_PAR_CHK_INVALID_RANGE;\ + }\ + }while(0) + +#endif + +#if ZXIC_REAL("DEV_ID & ASSERT") + +#define ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, becall)\ + do{\ + if(ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ZXIC %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,becall);\ + ZXIC_COMM_ASSERT(0);\ + return rc;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_RC_NULL(dev_id,rc,becall)\ + do{\ + if(ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,becall);\ + ZXIC_COMM_ASSERT(0);\ + return NULL;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_RC_UNLOCK(dev_id,rc, becall, mutex)\ + do{\ + if(ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ZXIC %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,becall);\ + if(0 != zxic_comm_mutex_unlock(mutex))\ + { \ + ZXIC_COMM_TRACE_ERROR("File: [%s],Function:[%s],Line:%u mutex unlock failed!-->Return ERROR\n", __FILE__, __FUNCTION__, __LINE__);\ + } \ + ZXIC_COMM_ASSERT(0);\ + return rc;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_RC_CLOSE_FP(dev_id, rc, becall, fp)\ + do{\ + if(ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n ZXIC %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,becall);\ + if(ZXIC_COMM_FCLOSE(fp))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d !-- %s close file Fail!\n",__FILE__,__LINE__,__FUNCTION__);\ + }\ + ZXIC_COMM_ASSERT(0);\ + return rc;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_RC_MEMORY_FREE(dev_id, rc, becall, ptr)\ + do{\ + if (ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n ZXICP %s:%d [ErrorCode:0x%x], %s Call %s Fail!\n", __FILE__, __LINE__, rc, __FUNCTION__, becall);\ + ZXIC_COMM_FREE(ptr);\ + ZXIC_COMM_ASSERT(0);\ + return rc;\ + }\ + } while (0) + +#define ZXIC_COMM_CHECK_DEV_POINT(dev_id, point)\ + do{\ + if(NULL == (point))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_POINT_NULL;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_POINT_MEMORY_FREE(dev_id, point, ptr)\ + do{\ + if(ZXIC_NULL == (point))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_POINT_NULL;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_POINT_EMEMORY_FREE2PTR(dev_id, point, ptr0, ptr1)\ + do{\ + if(ZXIC_NULL == (point))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + ZXIC_COMM_FREE(ptr0);\ + ZXIC_COMM_FREE(ptr1);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_POINT_NULL;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_POINT_RETURN_NULL(dev_id,point)\ + do{\ + if(NULL == (point))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_NULL;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_POINT_UNLOCK(dev_id,point,mutex)\ + do{\ + if(NULL == (point))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + if(0 != zxic_comm_mutex_unlock(mutex))\ + { \ + ZXIC_COMM_TRACE_ERROR("File: [%s],Function:[%s],Line:%u mutex unlock failed!-->Return ERROR\n", __FILE__, __FUNCTION__, __LINE__);\ + } \ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_POINT_NULL;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_POINT_CLOSE_FP(dev_id, point, fp)\ + do{\ + if(NULL == (point))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + if (ZXIC_COMM_FCLOSE(fp))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n ZXIC %s:%d !-- %s close file Fail!\n",__FILE__,__LINE__,__FUNCTION__);\ + }\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_POINT_NULL;\ + }\ + }while(0)\ + +#define ZXIC_COMM_CHECK_DEV_INDEX(dev_id,val,min,max)\ + do{\ + if(ZXIC_PAR_CHK_INVALID_INDEX == zxic_comm_dev_index_check(dev_id, val, min, max))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + else if(ZXIC_PAR_CHK_INVALID_RANGE == zxic_comm_dev_index_check(dev_id, val, min, max))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_RANGE;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_UPPER(dev_id,val,max)\ + do{\ + if((val) > (max))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, max, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_LOWER(dev_id,val,min)\ + do{\ + if((val) < (min))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_BOTH(dev_id,val,min,max)\ + do{\ + if(((val) < (min)) || ((val) > (max)))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_UPPER_MEMORY_FREE(dev_id,val,max,ptr)\ + do{\ + if((val) > (max))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_LOWER_MEMORY_FREE(dev_id,val,min,ptr)\ + do{\ + if((val) < (min))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_BOTH_MEMORY_FREE(dev_id,val,min,max,ptr)\ + do{\ + if(((val) < (min)) || ((val) > (max)))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_RETURN_NULL(dev_id,val,min,max)\ + do{\ + if(ZXIC_PAR_CHK_INVALID_INDEX == zxic_comm_index_check(val, min, max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_NULL;\ + }\ + else if(ZXIC_PAR_CHK_INVALID_RANGE == zxic_comm_index_check(val, min, max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_NULL;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_ID(dev_id)\ + do{\ + if(ZXIC_PAR_CHK_INVALID_INDEX == zxic_comm_index_check(dev_id, 0, zxic_comm_channel_max_get() - 1))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, dev_id, 0, zxic_comm_channel_max_get() - 1, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + else if(ZXIC_PAR_CHK_INVALID_RANGE == zxic_comm_index_check(dev_id, 0, zxic_comm_channel_max_get() - 1))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, dev_id, 0, zxic_comm_channel_max_get() - 1, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_RANGE;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW(dev_id,val0,val1)\ + do{\ + if((ZXIC_UINT32_MAX - (val0)) < (val1))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_64(dev_id,val0,val1)\ + do{\ + if((ZXIC_ULONG_MAX - (val0)) < (val1))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[val0=0x%016llx] INVALID] [val1=0x%016llx] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_SUB_OVERFLOW(dev_id, val0, val1)\ + do{\ + if((val0) < (val1))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW(dev_id,val0,val1)\ + do{\ + if(((val0) > 0) && ((ZXIC_UINT32_MAX / (val0)) < (val1)))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_64(dev_id, val0, val1)\ + do{\ + if(((val0) > 0) && ((0xFFFFFFFFFFFFFFFF / (val0)) < (val1)))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[val0=0x%016llx] INVALID] [val1=0x%016llx] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + + +#endif + +#if ZXIC_REAL("DEV_ID & NO ASSERT") +#define ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id,rc,becall)\ + do{\ + if(ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ZXIC %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,becall);\ + return rc;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(dev_id,rc, becall, mutex)\ + do{\ + if(ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ZXIC %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,becall);\ + if(0 != zxic_comm_mutex_unlock(mutex))\ + { \ + ZXIC_COMM_TRACE_ERROR("File: [%s],Function:[%s],Line:%u mutex unlock failed!-->Return ERROR\n", __FILE__, __FUNCTION__, __LINE__);\ + } \ + return rc;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_RC_CLOSE_FP_NO_ASSERT(dev_id, rc, becall, fp)\ + do{\ + if(ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ZXIC %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,becall);\ + if (ZXIC_COMM_FCLOSE(fp))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n ZXIC %s:%d !-- %s close file Fail!\n",__FILE__,__LINE__,__FUNCTION__);\ + }\ + return rc;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_RC_MEMORY_FREE_NO_ASSERT(dev_id, rc, becall, ptr)\ +do{\ + if (ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n ZXICP %s:%d [ErrorCode:0x%x], %s Call %s Fail!\n", __FILE__, __LINE__, rc, __FUNCTION__, becall);\ + ZXIC_COMM_FREE(ptr);\ + return rc;\ + }\ +} while (0) +#define ZXIC_COMM_CHECK_DEV_RC_MEMORY_FREE2PTR_NO_ASSERT(dev_id, rc, becall, ptr1, ptr2)\ +do{\ + if (ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n ZXICP %s:%d [ErrorCode:0x%x], %s Call %s Fail!\n", __FILE__, __LINE__, rc, __FUNCTION__, becall);\ + ZXIC_COMM_FREE(ptr1);\ + ZXIC_COMM_FREE(ptr2);\ + return rc;\ + }\ +} while (0) +#define ZXIC_COMM_CHECK_DEV_RC_MEMORY_FREE3PTR_NO_ASSERT(dev_id, rc, becall, ptr1, ptr2, ptr3)\ +do{\ + if (ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n ZXICP %s:%d [ErrorCode:0x%x], %s Call %s Fail!\n", __FILE__, __LINE__, rc, __FUNCTION__, becall);\ + ZXIC_COMM_FREE(ptr1);\ + ZXIC_COMM_FREE(ptr2);\ + ZXIC_COMM_FREE(ptr3);\ + return rc;\ + }\ +} while (0) + +#define ZXIC_COMM_CHECK_DEV_POINT_NO_ASSERT(dev_id,point)\ + do{\ + if(NULL == (point))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + return ZXIC_PAR_CHK_POINT_NULL;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_POINT_RETURN_NULL_NO_ASSERT(dev_id,point)\ + do{\ + if(ZXIC_NULL == (point))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + return ZXIC_NULL;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_POINT_CLOSE_FP_NO_ASSERT(dev_id, point, fp)\ + do{\ + if(NULL == (point))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + if (ZXIC_COMM_FCLOSE(fp))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n ZXIC %s:%d !-- %s close file Fail!\n",__FILE__,__LINE__,__FUNCTION__);\ + }\ + return ZXIC_PAR_CHK_POINT_NULL;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_POINT_MEMORY_FREE_NO_ASSERT(dev_id,point,ptr)\ + do{\ + if(ZXIC_NULL == (point))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + return ZXIC_PAR_CHK_POINT_NULL;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_POINT_MEMORY_FREE2PTR_NO_ASSERT(dev_id, point, ptr1, ptr2)\ + do{\ + if(ZXIC_NULL == (point))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + ZXIC_COMM_FREE(ptr1);\ + ZXIC_COMM_FREE(ptr2);\ + return ZXIC_PAR_CHK_POINT_NULL;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_POINT_MEMORY_FREE3PTR_NO_ASSERT(dev_id, point, ptr1, ptr2, ptr3)\ + do{\ + if(ZXIC_NULL == (point))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + ZXIC_COMM_FREE(ptr1);\ + ZXIC_COMM_FREE(ptr2);\ + ZXIC_COMM_FREE(ptr3);\ + return ZXIC_PAR_CHK_POINT_NULL;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id,val,min,max)\ + do{\ + if(ZXIC_PAR_CHK_INVALID_INDEX == zxic_comm_dev_index_check(dev_id, val, min, max))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + else if(ZXIC_PAR_CHK_INVALID_RANGE == zxic_comm_dev_index_check(dev_id, val, min, max))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + return ZXIC_PAR_CHK_INVALID_RANGE;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT_UNLOCK(dev_id, val, min, max, mutex)\ + do{\ + if(ZXIC_PAR_CHK_INVALID_INDEX == zxic_comm_dev_index_check(dev_id, val, min, max))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + if(0 != zxic_comm_mutex_unlock(mutex))\ + { \ + ZXIC_COMM_TRACE_ERROR("File: [%s],Function:[%s],Line:%u mutex unlock failed!-->Return ERROR\n", __FILE__, __FUNCTION__, __LINE__);\ + } \ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + else if(ZXIC_PAR_CHK_INVALID_RANGE == zxic_comm_dev_index_check(dev_id, val, min, max))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + if(0 != zxic_comm_mutex_unlock(mutex))\ + { \ + ZXIC_COMM_TRACE_ERROR("File: [%s],Function:[%s],Line:%u mutex unlock failed!-->Return ERROR\n", __FILE__, __FUNCTION__, __LINE__);\ + } \ + return ZXIC_PAR_CHK_INVALID_RANGE;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_UPPER_NO_ASSERT(dev_id,val,max)\ + do{\ + if((val) > (max))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, max, __FUNCTION__);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_UPPER_NO_ASSERT_UNLOCK(dev_id, val, max, mutex)\ + do{\ + if((val) > (max))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, max, __FUNCTION__);\ + if(0 != zxic_comm_mutex_unlock(mutex))\ + { \ + ZXIC_COMM_TRACE_ERROR("File: [%s],Function:[%s],Line:%u mutex unlock failed!-->Return ERROR\n", __FILE__, __FUNCTION__, __LINE__);\ + } \ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_UPPER_MEMORY_FREE_NO_ASSERT(dev_id,val,max,ptr)\ + do{\ + if((val) > (max))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + + +#define ZXIC_COMM_CHECK_DEV_INDEX_LOWER_NO_ASSERT(dev_id,val,min)\ + do{\ + if((val) < (min))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, __FUNCTION__);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_LOWER_NO_ASSERT_UNLOCK(dev_id, val, min, mutex)\ + do{\ + if((val) < (min))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, __FUNCTION__);\ + if(0 != zxic_comm_mutex_unlock(mutex))\ + { \ + ZXIC_COMM_TRACE_ERROR("File: [%s],Function:[%s],Line:%u mutex unlock failed!-->Return ERROR\n", __FILE__, __FUNCTION__, __LINE__);\ + } \ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_LOWER_MEMORY_FREE_NO_ASSERT(dev_id,val,min,ptr)\ + do{\ + if((val) < (min))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + + +#define ZXIC_COMM_CHECK_DEV_INDEX_BOTH_NO_ASSERT(dev_id,val,min,max)\ + do{\ + if(((val) < (min)) || ((val) > (max)))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_BOTH_NO_ASSERT_UNLOCK(dev_id, val, min, max, mutex)\ + do{\ + if(((val) < (min)) || ((val) > (max)))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + if(0 != zxic_comm_mutex_unlock(mutex))\ + { \ + ZXIC_COMM_TRACE_ERROR("File: [%s],Function:[%s],Line:%u mutex unlock failed!-->Return ERROR\n", __FILE__, __FUNCTION__, __LINE__);\ + } \ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_BOTH_MEMORY_FREE_NO_ASSERT(dev_id,val,min,max,ptr)\ + do{\ + if(((val) < (min)) || ((val) > (max)))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_RETURN_NULL_NO_ASSERT(dev_id,val,min,max)\ + do{\ + if(ZXIC_PAR_CHK_INVALID_INDEX == zxic_comm_index_check(val, min, max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + return ZXIC_NULL;\ + }\ + else if(ZXIC_PAR_CHK_INVALID_RANGE == zxic_comm_index_check(val, min, max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + return ZXIC_NULL;\ + }\ + }while(0) + + +#define ZXIC_COMM_CHECK_DEV_INDEX_MEMORY_FREE_NO_ASSERT(dev_id,val,min,max,ptr)\ + do{\ + if(ZXIC_PAR_CHK_INVALID_INDEX == zxic_comm_dev_index_check(dev_id, val, min, max))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + else if(ZXIC_PAR_CHK_INVALID_RANGE == zxic_comm_dev_index_check(dev_id, val, min, max))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + return ZXIC_PAR_CHK_INVALID_RANGE;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_MEMORY_FREE2PTR_NO_ASSERT(dev_id, val, min, max, ptr1, ptr2)\ + do{\ + if(ZXIC_PAR_CHK_INVALID_INDEX == zxic_comm_dev_index_check(dev_id, val, min, max))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr1);\ + ZXIC_COMM_FREE(ptr2);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + else if(ZXIC_PAR_CHK_INVALID_RANGE == zxic_comm_dev_index_check(dev_id, val, min, max))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr1);\ + ZXIC_COMM_FREE(ptr2);\ + return ZXIC_PAR_CHK_INVALID_RANGE;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_MEMORY_FREE3PTR_NO_ASSERT(dev_id, val, min, max, ptr1, ptr2, ptr3)\ + do{\ + if(ZXIC_PAR_CHK_INVALID_INDEX == zxic_comm_dev_index_check(dev_id, val, min, max))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr1);\ + ZXIC_COMM_FREE(ptr2);\ + ZXIC_COMM_FREE(ptr3);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + else if(ZXIC_PAR_CHK_INVALID_RANGE == zxic_comm_dev_index_check(dev_id, val, min, max))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr1);\ + ZXIC_COMM_FREE(ptr2);\ + ZXIC_COMM_FREE(ptr3);\ + return ZXIC_PAR_CHK_INVALID_RANGE;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_ID_NO_ASSERT(dev_id)\ + do{\ + if(ZXIC_PAR_CHK_INVALID_INDEX == zxic_comm_index_check(dev_id, 0, zxic_comm_channel_max_get() - 1))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, dev_id, 0, zxic_comm_channel_max_get() - 1, __FUNCTION__);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + else if(ZXIC_PAR_CHK_INVALID_RANGE == zxic_comm_index_check(dev_id, 0, zxic_comm_channel_max_get() - 1))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, dev_id, 0, zxic_comm_channel_max_get() - 1, __FUNCTION__);\ + return ZXIC_PAR_CHK_INVALID_RANGE;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_ID_RETURN_NULL_NO_ASSERT(dev_id)\ + do{\ + if(ZXIC_PAR_CHK_INVALID_INDEX == zxic_comm_index_check(dev_id, 0, zxic_comm_channel_max_get() - 1))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, dev_id, 0, zxic_comm_channel_max_get() - 1, __FUNCTION__);\ + return ZXIC_NULL;\ + }\ + else if(ZXIC_PAR_CHK_INVALID_RANGE == zxic_comm_index_check(dev_id, 0, zxic_comm_channel_max_get() - 1))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, dev_id, 0, zxic_comm_channel_max_get() - 1, __FUNCTION__);\ + return ZXIC_NULL;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_SUB_OVERFLOW_NO_ASSERT(dev_id, val0, val1)\ + do{\ + if((val0) < (val1))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_SUB_OVERFLOW_NO_ASSERT_UNLOCK(dev_id, val0, val1, mutex)\ + do{\ + if((val0) < (val1))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + if(0 != zxic_comm_mutex_unlock(mutex))\ + {\ + ZXIC_COMM_TRACE_ERROR("File: [%s],Function:[%s],Line:%u mutex unlock failed!-->Return ERROR\n", __FILE__, __FUNCTION__, __LINE__);\ + }\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(dev_id,val0,val1)\ + do{\ + if((ZXIC_UINT32_MAX - (val0)) < (val1))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT_UNLOCK(dev_id,val0,val1,mutex)\ + do{\ + if((ZXIC_UINT32_MAX - (val0)) < (val1))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + if(0 != zxic_comm_mutex_unlock(mutex))\ + {\ + ZXIC_COMM_TRACE_ERROR("File: [%s],Function:[%s],Line:%u mutex unlock failed!-->Return ERROR\n", __FILE__, __FUNCTION__, __LINE__);\ + }\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_64_NO_ASSERT(dev_id,val0,val1)\ + do{\ + if((ZXIC_ULONG_MAX - (val0)) < (val1))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[val0=0x%016llx] INVALID] [val1=0x%016llx] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id,val0,val1)\ + do{\ + if(((val0) > 0) && ((ZXIC_UINT32_MAX / (val0)) < (val1)))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT_UNLOCK(dev_id,val0,val1,mutex)\ + do{\ + if(((val0) > 0) && ((ZXIC_UINT32_MAX / (val0)) < (val1)))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + if(0 != zxic_comm_mutex_unlock(mutex))\ + {\ + ZXIC_COMM_TRACE_ERROR("File: [%s],Function:[%s],Line:%u mutex unlock failed!-->Return ERROR\n", __FILE__, __FUNCTION__, __LINE__);\ + }\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_64_NO_ASSERT(dev_id,val0,val1)\ + do{\ + if(((val0) > 0) && ((ZXIC_ULONG_MAX/ (val0)) < (val1)))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#endif +#if ZXIC_REAL("return no code") +#define ZXIC_COMM_CHECK_RC_RETURN_NONE(rc,becall)\ + do{\ + if(ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,becall);\ + ZXIC_COMM_ASSERT(0);\ + return;\ + }\ + }while(0) + +/* 不带返回值,用于VOID类型函数 */ +#define ZXIC_COMM_CHECK_POINT_RETURN_NONE(point)\ + do{\ + if(ZXIC_NULL == (point))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_RETURN_NONE(val0,val1)\ + do{\ + if((ZXIC_UINT32_MAX - (val0)) < (val1))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW_RETURN_NONE(val0,val1)\ + do{\ + if((val0) < (val1))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_MUL_OVERFLOW_RETURN_NONE(val0,val1)\ + do{\ + if(((val0) > 0) && ((ZXIC_UINT32_MAX / (val0)) < (val1)))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_UPPER_RETURN_NONE(val,max)\ + do{\ + if((val) > (max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, max, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_LOWER_RETURN_NONE(val,min)\ + do{\ + if((val) < (min))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_BOTH_RETURN_NONE(val,min,max)\ + do{\ + if(((val) < (min)) || ((val) > (max)))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_UPPER_MEMORY_FREE_RETURN_NONE(val,max,ptr)\ + do{\ + if((val) > (max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + ZXIC_COMM_ASSERT(0);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_LOWER_MEMORY_FREE_RETURN_NONE(val,min,ptr)\ + do{\ + if((val) < (min))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + ZXIC_COMM_ASSERT(0);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_BOTH_MEMORY_FREE_RETURN_NONE(val,min,max,ptr)\ + do{\ + if(((val) < (min)) || ((val) > (max)))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + ZXIC_COMM_ASSERT(0);\ + return;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_RC_RETURN_NONE(dev_id, rc, becall)\ + do{\ + if(ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ZXIC %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,becall);\ + ZXIC_COMM_ASSERT(0);\ + return;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_POINT_RETURN_NONE(dev_id,point)\ + do{\ + if(NULL == (point))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_UPPER_RETURN_NONE(dev_id,val,max)\ + do{\ + if((val) > (max))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, max, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_LOWER_RETURN_NONE(dev_id,val,min)\ + do{\ + if((val) < (min))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_BOTH_RETURN_NONE(dev_id,val,min,max)\ + do{\ + if(((val) < (min)) || ((val) > (max)))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_UPPER_MEMORY_FREE_RETURN_NONE(dev_id,val,max,ptr)\ + do{\ + if((val) > (max))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + ZXIC_COMM_ASSERT(0);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_LOWER_MEMORY_FREE_RETURN_NONE(dev_id,val,min,ptr)\ + do{\ + if((val) < (min))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + ZXIC_COMM_ASSERT(0);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_BOTH_MEMORY_FREE_RETURN_NONE(dev_id,val,min,max,ptr)\ + do{\ + if(((val) < (min)) || ((val) > (max)))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + ZXIC_COMM_ASSERT(0);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_RETURN_NONE(dev_id,val0,val1)\ + do{\ + if((ZXIC_UINT32_MAX - (val0)) < (val1))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_64_RETURN_NONE(dev_id,val0,val1)\ + do{\ + if((ZXIC_ULONG_MAX - (val0)) < (val1))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[val0=0x%016llx] INVALID] [val1=0x%016llx] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_SUB_OVERFLOW_RETURN_NONE(dev_id, val0, val1)\ + do{\ + if((val0) < (val1))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_RETURN_NONE(dev_id,val0,val1)\ + do{\ + if(((val0) > 0) && ((ZXIC_UINT32_MAX / (val0)) < (val1)))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return;\ + }\ + }while(0) +#endif + +#if ZXIC_REAL("return no code & no assert") +#define ZXIC_COMM_CHECK_RC_RETURN_NONE_NO_ASSERT(rc,becall)\ + do{\ + if(ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,becall);\ + return;\ + }\ + }while(0) + +/* 不带返回值,用于VOID类型函数 */ +#define ZXIC_COMM_CHECK_POINT_RETURN_NONE_NO_ASSERT(point)\ + do{\ + if(ZXIC_NULL == (point))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_RETURN_NONE_NO_ASSERT(val0,val1)\ + do{\ + if((ZXIC_UINT32_MAX - (val0)) < (val1))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW_RETURN_NONE_NO_ASSERT(val0,val1)\ + do{\ + if((val0) < (val1))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_MUL_OVERFLOW_RETURN_NONE_NO_ASSERT(val0,val1)\ + do{\ + if(((val0) > 0) && ((ZXIC_UINT32_MAX / (val0)) < (val1)))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_UPPER_RETURN_NONE_NO_ASSERT(val,max)\ + do{\ + if((val) > (max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, max, __FUNCTION__);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_LOWER_RETURN_NONE_NO_ASSERT(val,min)\ + do{\ + if((val) < (min))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, __FUNCTION__);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_BOTH_RETURN_NONE_NO_ASSERT(val,min,max)\ + do{\ + if(((val) < (min)) || ((val) > (max)))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_UPPER_MEMORY_FREE_RETURN_NONE_NO_ASSERT(val,max,ptr)\ + do{\ + if((val) > (max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_LOWER_MEMORY_FREE_RETURN_NONE_NO_ASSERT(val,min,ptr)\ + do{\ + if((val) < (min))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_BOTH_MEMORY_FREE_RETURN_NONE_NO_ASSERT(val,min,max,ptr)\ + do{\ + if(((val) < (min)) || ((val) > (max)))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + return;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_RC_RETURN_NONE_NO_ASSERT(dev_id, rc, becall)\ + do{\ + if(ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ZXIC %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,becall);\ + return;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_POINT_RETURN_NONE_NO_ASSERT(dev_id,point)\ + do{\ + if(NULL == (point))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + return;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_UPPER_RETURN_NONE_NO_ASSERT(dev_id,val,max)\ + do{\ + if((val) > (max))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, max, __FUNCTION__);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_LOWER_RETURN_NONE_NO_ASSERT(dev_id,val,min)\ + do{\ + if((val) < (min))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, __FUNCTION__);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_BOTH_RETURN_NONE_NO_ASSERT(dev_id,val,min,max)\ + do{\ + if(((val) < (min)) || ((val) > (max)))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_UPPER_MEMORY_FREE_RETURN_NONE_NO_ASSERT(dev_id,val,max,ptr)\ + do{\ + if((val) > (max))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_LOWER_MEMORY_FREE_RETURN_NONE_NO_ASSERT(dev_id,val,min,ptr)\ + do{\ + if((val) < (min))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_BOTH_MEMORY_FREE_RETURN_NONE_NO_ASSERT(dev_id,val,min,max,ptr)\ + do{\ + if(((val) < (min)) || ((val) > (max)))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + ZXIC_COMM_FREE(ptr);\ + return;\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_RETURN_NONE_NO_ASSERT(dev_id,val0,val1)\ + do{\ + if((ZXIC_UINT32_MAX - (val0)) < (val1))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + return;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_SUB_OVERFLOW_RETURN_NONE_NO_ASSERT(dev_id, val0, val1)\ + do{\ + if((val0) < (val1))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + return;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_RETURN_NONE_NO_ASSERT(dev_id,val0,val1)\ + do{\ + if(((val0) > 0) && ((ZXIC_UINT32_MAX / (val0)) < (val1)))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + return;\ + }\ + }while(0) +#endif + +#if ZXIC_REAL("no return") +#define ZXIC_COMM_CHECK_RC_NONE(rc,becall)\ + do{\ + if(ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,becall);\ + ZXIC_COMM_ASSERT(0);\ + }\ + }while(0) + +/* 不带返回值,用于VOID类型函数 */ +#define ZXIC_COMM_CHECK_POINT_NONE(point)\ + do{\ + if(ZXIC_NULL == (point))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + }\ + }while(0) + +/* 不带返回值,用于VOID类型函数 */ +#define ZXIC_COMM_CHECK_INDEX_NONE(val,min,max)\ + do{\ + if (ZXIC_OK != zxic_comm_index_check(val, min, max));\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_UPPER_NONE(val,max)\ + do{\ + if((val) > (max))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, max, __FUNCTION__);\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NONE(val0,val1)\ + do{\ + if((ZXIC_UINT32_MAX - (val0)) < (val1))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW_NONE(val0,val1)\ + do{\ + if((val0) < (val1))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_MUL_OVERFLOW_NONE(val0,val1)\ + do{\ + if(((val0) > 0) && ((ZXIC_UINT32_MAX / (val0)) < (val1)))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val0, val1, __FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_LOWER_NONE(val,min)\ + do{\ + if((val) < (min))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, __FUNCTION__);\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_INDEX_BOTH_NONE(val,min,max)\ + do{\ + if(((val) < (min)) || ((val) > (max)))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_RC_NONE(dev_id, rc, becall)\ + do{\ + if(ZXIC_OK != rc)\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ZXIC %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,becall);\ + ZXIC_COMM_ASSERT(0);\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_POINT_NONE(dev_id,point)\ + do{\ + if(NULL == (point))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_DEV_INDEX_NONE(dev_id,val,min,max)\ + do{\ + if(ZXIC_PAR_CHK_INVALID_INDEX == zxic_comm_dev_index_check(dev_id, val, min, max))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + }\ + else if(ZXIC_PAR_CHK_INVALID_RANGE == zxic_comm_dev_index_check(dev_id, val, min, max))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_UPPER_NONE(dev_id,val,max)\ + do{\ + if((val) > (max))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, max, __FUNCTION__);\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_LOWER_NONE(dev_id,val,min)\ + do{\ + if((val) < (min))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, __FUNCTION__);\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_INDEX_BOTH_NONE(dev_id,val,min,max)\ + do{\ + if(((val) < (min)) || ((val) > (max)))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__);\ + }\ + }while(0) +#define ZXIC_COMM_CHECK_DEV_RC_INT(dev_id,check_rc,rc,becall)\ + do{\ + if(check_rc < 0)\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ICM %s:%d [ErrorCode:0x%x] [rc:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,check_rc, rc,__FUNCTION__,becall);\ + ZXIC_COMM_ASSERT(0);\ + return rc;\ + }\ + }while(0) + +#endif +#if ZXIC_REAL("no print") +#define ZXIC_COMM_CHECK_RC_NO_PRINT(rc,error_code)\ +do{\ + if(ZXIC_OK != rc)\ + {\ + ZXIC_COMM_ASSERT(0);\ + return error_code;\ + }\ +}while(0) +#define ZXIC_COMM_CHECK_RC_UNLOCK_NO_PRINT(rc, p_mutex, error_code)\ +do{\ + if(ZXIC_OK != rc)\ + {\ + (ZXIC_VOID)zxic_comm_mutex_unlock(p_mutex);\ + ZXIC_COMM_ASSERT(0);\ + return error_code;\ + }\ +}while(0) + +#define ZXIC_COMM_CHECK_POINT_NO_PRINT(point)\ +do{\ + if(ZXIC_NULL == (point))\ + {\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_POINT_NULL;\ + }\ +}while(0) +#define ZXIC_COMM_CHECK_POINT_NO_PRINT_UNLOCK(point,p_mutex)\ +do{\ + if(ZXIC_NULL == (point))\ + {\ + (ZXIC_VOID)zxic_comm_mutex_unlock(p_mutex);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_POINT_NULL;\ + }\ +}while(0) + +#define ZXIC_COMM_CHECK_RC_POINT_NO_PRINT(point,rc)\ + do{\ + if(ZXIC_NULL == (point))\ + {\ + ZXIC_COMM_ASSERT(0);\ + return rc;\ + }\ + }while(0) + +#define ZXIC_COMM_CHECK_INDEX_NO_PRINT_UNLOCK(val,min,max,p_mutex)\ +do{\ + if(ZXIC_PAR_CHK_INVALID_INDEX == zxic_comm_index_check(val, min, max))\ + {\ + (ZXIC_VOID)zxic_comm_mutex_unlock(p_mutex);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + else if(ZXIC_PAR_CHK_INVALID_RANGE == zxic_comm_index_check(val, min, max))\ + {\ + (ZXIC_VOID)zxic_comm_mutex_unlock(p_mutex);\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_RANGE;\ + }\ +}while(0) +#define ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW_NO_PRINT_UNLOCK(val0, val1, mutex)\ + do{\ + if((val0) < (val1))\ + {\ + if(0 != zxic_comm_mutex_unlock(mutex))\ + {\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_PARA;\ + }\ + ZXIC_COMM_ASSERT(0);\ + return ZXIC_PAR_CHK_INVALID_INDEX;\ + }\ + }while(0) + +#endif +#endif /* ZXIC_REAL("参数检查") */ + + +//#ifdef ZXIC_FOR_LLT +#if ZXIC_REAL("UT_TEST") +#define ZXIC_CHECK_DEV_UT_RC(dev_id, rc, val, becall)\ + do{\ + if (val != rc)\ + {\ + ZXIC_COMM_PRINT("\n ZXICP %s:%d [ErrorCode:0x%x], %s Call %s Fail!\n", __FILE__, __LINE__, rc, __FUNCTION__, becall);\ + zxic_comm_ut_detail_trace_dev_error(dev_id, "\n ZXICP %s:%d [ErrorCode:0x%x], %s Call %s Fail!\n", __FILE__, __LINE__, rc, __FUNCTION__, becall);\ + return ZXIC_E_LLT_CHECK;\ + }\ + } while (0) +#endif + +#if ZXIC_REAL("字节序") +/* DWORD变量字节序转换 */ +#define ZXIC_COMM_CONVERT32(dw_data) \ + ((((dw_data)&0xff)<<24)|(((dw_data)&0xff00)<<8)\ + |(((dw_data)&0xff0000)>>8)|(((dw_data)&0xff000000)>>24)) +/* WORD变量字节序转换 */ +#define ZXIC_COMM_CONVERT16(w_data) \ + ((((w_data)&0xff)<<8)|(((w_data)&0xff00)>>8)) + +/* WORD变量字节序转换 */ +#define ZXIC_COMM_CONVERT32_16b(w_data) \ + ((((w_data)&0xffff)<<16)|(((w_data)&0xffff0000)>>16)) + +ZXIC_VOID zxic_comm_swap_en_set(ZXIC_UINT32 enable); +ZXIC_RTN32 zxic_comm_swap_en_get(ZXIC_VOID); +ZXIC_RTN32 zxic_comm_is_big_endian(ZXIC_VOID); +ZXIC_RTN32 zxic_comm_endian_prt(ZXIC_VOID); +ZXIC_VOID zxic_comm_swap(ZXIC_UINT8 *p_uc_data, ZXIC_UINT32 dw_byte_len); +ZXIC_VOID zxic_comm_swap_16b(ZXIC_UINT8 *p_uc_data, ZXIC_UINT32 dw_byte_len); +ZXIC_UINT64 ZXIC_COMM_COUNTER64_BUILD(ZXIC_UINT32 hi, ZXIC_UINT32 lo); +#endif + +#if ZXIC_REAL("内存") +ZXIC_UINT32 zxic_comm_get_malloc_num(ZXIC_VOID); +ZXIC_UINT32 zxic_comm_get_malloc_size(ZXIC_VOID); +ZXIC_VOID zxic_clr_malloc_num(ZXIC_VOID); + +#define ZXIC_COMM_FREE(p_data) \ +do{\ + ic_comm_free_record();\ + kfree(p_data);\ + p_data = ZXIC_NULL; \ +}while(0) + +#define ZXIC_COMM_MALLOC(size) ic_comm_malloc_memory(size) + +#define ZXIC_COMM_ALLOC_MEMORY(ptr,size) \ + do{\ + (ptr) = ZXIC_COMM_MALLOC(size);\ + ZXIC_COMM_CHECK_POINT(ptr);\ + ZXIC_COMM_MEMSET((ptr),0,size);\ + }while(0) +#define ZXIC_COMM_ALLOC_MEMORY_DEV(dev_id,ptr,size) \ + do{\ + (ptr) = ZXIC_COMM_MALLOC(size);\ + ZXIC_COMM_CHECK_DEV_POINT(dev_id,ptr);\ + ZXIC_COMM_MEMSET((ptr),0,size);\ + }while(0) + + +#endif + +#if ZXIC_REAL("延时") +// ZXIC_VOID zxic_comm_sleep(ZXIC_UINT32 milliseconds); +ZXIC_VOID zxic_comm_msleep(ZXIC_UINT32 millisecond); +ZXIC_VOID zxic_comm_udelay(ZXIC_UINT32 microseconds); +ZXIC_VOID zxic_comm_delay(ZXIC_UINT32 milliseconds); +ZXIC_DOUBLE zxic_comm_get_ticks_s(ZXIC_VOID); +ZXIC_DOUBLE zxic_comm_get_ticks_ms(ZXIC_VOID); +ZXIC_DOUBLE zxic_get_ticks_uses(ZXIC_VOID); +#endif + +#if ZXIC_REAL("bit操作") + +/* ZXIC_UINT32 写某几bit的值 */ +#define ZXIC_COMM_MASK_BIT(intType,_bitNum_)\ + (( intType )( 0x1U << (_bitNum_) )) + +#define ZXIC_COMM_GET_BIT_MASK( _intType_, _bitQnt_ )\ + ( (_intType_)( ( (_bitQnt_) < 32 ) \ + ? ( (_intType_) ZXIC_COMM_MASK_BIT( _intType_ , ( (_bitQnt_) & 0x1F ) ) - 1 ) \ + : ((_intType_)(0xffffffff)) ) ) + +#define ZXIC_COMM_UINT32_WRITE_BITS( _uiDst_, _uiSrc_, _uiStartPos_, _uiLen_ )\ +do{\ + ( _uiDst_ ) = ( ( _uiDst_ ) & ~( ZXIC_COMM_GET_BIT_MASK( ZXIC_UINT32 , ( _uiLen_ ) ) << ( _uiStartPos_ ) ) ) |\ + ( ( ( _uiSrc_ ) & ZXIC_COMM_GET_BIT_MASK( ZXIC_UINT32 , ( _uiLen_ ) ) ) << ( _uiStartPos_ ) );\ +}while(0) + +#define ZXIC_COMM_UINT32_WRITE_BITS_ZERO(_uiDst_, _uiStartPos_, _uiLen_ )\ +do{\ + ( _uiDst_ ) = ( ( _uiDst_ ) & ~( ZXIC_COMM_GET_BIT_MASK( ZXIC_UINT32 , ( _uiLen_ ) ) << ( _uiStartPos_ ) ) );\ +}while(0) + +#define ZXIC_COMM_UINT32_GET_BITS(_uiDst_ ,_uiSrc_, _uiStartPos_, _uiLen_)\ +do{\ + ( _uiDst_ ) =( ( (_uiSrc_) >> (_uiStartPos_) ) & \ + ( ZXIC_COMM_GET_BIT_MASK( ZXIC_UINT32 , (_uiLen_) ) ) );\ + }while(0) + +#define ZXIC_COMM_UINT32_GET_RETURN_BITS(_uiSrc_, _uiStartPos_, _uiLen_)\ + ( ( (_uiSrc_) >> (_uiStartPos_) ) & \ + ( ZXIC_COMM_GET_BIT_MASK( ZXIC_UINT32 , (_uiLen_) ) ) )\ + +/* ZXIC_UINT64 写某几bit的值 */ +#define ZXIC_COMM_MASK_BIT_64(intType,_bitNum_)\ + (( intType )( 0x1ULL << (_bitNum_) )) + +#define ZXIC_COMM_GET_64_BIT_MASK( _intType_, _bitQnt_ )\ + ( (_intType_)( ( (_bitQnt_) < 64 ) \ + ? ( (_intType_) ZXIC_COMM_MASK_BIT_64( _intType_ , ( (_bitQnt_) & 0x3F ) ) - 1 ) \ + : ((_intType_)(0xFFFFFFFFFFFFFFFFULL)) ) ) + +#define ZXIC_COMM_UINT64_WRITE_BITS( _uiDst_, _uiSrc_, _uiStartPos_, _uiLen_ )\ +do{\ + ( _uiDst_ ) = ( ( _uiDst_ ) & ~( ZXIC_COMM_GET_64_BIT_MASK( ZXIC_UINT64 , ( _uiLen_ ) ) << ( _uiStartPos_ ) ) ) |\ + ( ( ( _uiSrc_ ) & ZXIC_COMM_GET_64_BIT_MASK( ZXIC_UINT64 , ( _uiLen_ ) ) ) << ( _uiStartPos_ ) );\ +}while(0) + +/* Base type for declarations */ +#define ZXIC_COMM_BITDCL ZXIC_UINT32 +#define ZXIC_COMM_BITWID (32) + +/* (internal) Number of ZXICP_BITDCLs needed to contain _max bits */ +#define NPE_BITDCLSIZE(_max) (((_max) + ZXIC_COMM_BITWID - 1) / ZXIC_COMM_BITWID) + +/* Size for giving to malloc and memset to handle _max bits */ +#define ZXIC_COMM_BITALLOCSIZE(_max) (NPE_BITDCLSIZE(_max) * sizeof (ZXIC_COMM_BITDCL)) + + +/* (internal) Generic operation macro on bit array _a, with bit _b */ +#define NPE_BITOP(_a, _b, _op) (((_a)[(_b) / ZXIC_COMM_BITWID]) _op (1U << ((_b) % ZXIC_COMM_BITWID))) + +/* Specific operations */ +#define ZXIC_COMM_BITGET(_a, _b) NPE_BITOP(_a, _b, &) +#define ZXIC_COMM_BITSET(_a, _b) NPE_BITOP(_a, _b, |=) +#define ZXIC_COMM_BITCLR(_a, _b) NPE_BITOP(_a, _b, &= ~) + + +ZXIC_RTN32 zxic_comm_bit_count(ZXIC_UINT32 data); +ZXIC_RTN32 zxic_comm_read_bits(ZXIC_UINT8 * p_base, ZXIC_UINT32 base_size_bit, ZXIC_UINT32 * p_data, ZXIC_UINT32 start_bit, ZXIC_UINT32 end_bit); +ZXIC_RTN32 zxic_comm_write_bits(ZXIC_UINT8 * p_base, ZXIC_UINT32 base_size_bit, ZXIC_UINT32 data, ZXIC_UINT32 start_bit, ZXIC_UINT32 end_bit); +ZXIC_RTN32 zxic_comm_write_bits_ex(ZXIC_UINT8 * p_base, ZXIC_UINT32 base_size_bit, ZXIC_UINT32 data, ZXIC_UINT32 msb_start_pos, ZXIC_UINT32 len); +ZXIC_RTN32 zxic_comm_read_bits_ex(ZXIC_UINT8 * p_base, ZXIC_UINT32 base_size_bit, ZXIC_UINT32 * p_data, ZXIC_UINT32 msb_start_pos, ZXIC_UINT32 len); +ZXIC_RTN32 zxic_comm_write_bits_op(ZXIC_UINT8* p_src_dat, ZXIC_UINT32 src_size_bit, ZXIC_UINT32 input_data, ZXIC_UINT32 start_bit, ZXIC_UINT32 end_bit); +ZXIC_RTN32 zxic_comm_read_bits_op(ZXIC_UINT8* p_src_dat, ZXIC_UINT32 src_size_bit, ZXIC_UINT32* p_out_data, ZXIC_UINT32 start_bit, ZXIC_UINT32 end_bit); +#endif + +#if ZXIC_REAL("算数运算") +ZXIC_UINT64 zxic_comm_get_gcd (ZXIC_UINT64 a, ZXIC_UINT64 b); +ZXIC_RTN32 zxic_comm_multi_big_integer(ZXIC_CONST ZXIC_CHAR* num1,ZXIC_CONST ZXIC_CHAR* num2,ZXIC_CHAR* str_num); +ZXIC_RTN32 zxic_comm_div_big_integer(ZXIC_CONST ZXIC_CHAR *num1,ZXIC_CONST ZXIC_CHAR *num2,ZXIC_UINT32 *quo_val); +ZXIC_SINT32 zxic_comm_sub_stract(ZXIC_SINT32 *p1,ZXIC_SINT32 *p2,ZXIC_SINT32 len1,ZXIC_SINT32 len2 ); +ZXIC_SINT32 zxic_comm_cmpm_calc(ZXIC_UINT64 cm_cal, ZXIC_UINT64 pm_cal, ZXIC_UINT32* cm, ZXIC_UINT32* pm); +ZXIC_VOID zxic_comm_pm_cm_cal(ZXIC_UINT64 cm_y, ZXIC_UINT64 pm_y, ZXIC_UINT32* cm, ZXIC_UINT32* pm); +#endif + +#if ZXIC_REAL("字符串") +ZXIC_RTN32 zxic_comm_strcasecmp(ZXIC_CHAR *str1, ZXIC_CHAR* str2); +ZXIC_UINT8 zxic_comm_char_to_hex(ZXIC_UINT8 c); +ZXIC_DWORD zxic_comm_ipaddr_to_dword(ZXIC_CONST ZXIC_CHAR *p_addr); +ZXIC_RTN32 zxic_comm_char_to_number(ZXIC_CHAR a, ZXIC_CHAR b, ZXIC_UINT8 *number); +ZXIC_CHAR *zxic_comm_strlower(ZXIC_CHAR *str); +ZXIC_RTN32 ic_comm_check_str_size(ZXIC_CHAR* str); +ZXIC_SIZE_T ic_comm_getAbsValue(ZXIC_UINT8* dest, ZXIC_CONST ZXIC_UINT8* src); +ZXIC_VOID ic_comm_memset_s(void* dest, ZXIC_SIZE_T dmax, ZXIC_UINT8 c, ZXIC_SIZE_T n); +ZXIC_SINT32 ic_comm_memcmp(void* str1, const void* str2, ZXIC_SIZE_T n); +ZXIC_SINT32 ic_comm_strncmp(const ZXIC_CHAR* str1, const ZXIC_CHAR* str2, ZXIC_SIZE_T n); + + +#endif + +#if ZXIC_REAL("dma内存分配") +#define ZXIC_DMA_PHY_ADDR dma_addr_t +ZXIC_RTN32 zxic_comm_dma_mem_malloc(ZXIC_ADDR_T *vir_addr,ZXIC_ADDR_T *phy_addr,ZXIC_UINT32 dma_size); +ZXIC_RTN32 zxic_comm_dma_mem_free(ZXIC_ADDR_T vir_addr,ZXIC_ADDR_T phy_addr,ZXIC_UINT32 dma_size); +#endif + +#if ZXIC_REAL("OTHER") +#define MIN_VAL(x,y) ((x)<=(y) ? (x) : (y)) +#define MAX_VAL(x,y) ((x)<=(y) ? (y) : (x)) +#define ZXIC_COMM_DM_TO_X(d, m) ((d) & ~(m)) +#define ZXIC_COMM_DM_TO_Y(d, m) (~(d) & ~(m)) +#define ZXIC_COMM_XY_TO_MASK(x, y) (~(x) & ~(y)) +#define ZXIC_COMM_XY_TO_DATA(x, y) (x) /* valid only when mask is 0 */ +#define ZXIC_RD_CNT_MAX (50) + +/* 新增常用数据掩码 */ +#define ZXIC_COMM_WORD64_MASK (0xFFFFFFFFFFFFFFFFULL) +#define ZXIC_COMM_WORD32_MASK (0xFFFFFFFFU) +#define ZXIC_COMM_WORD16_MASK (0xFFFFU) +#define ZXIC_COMM_BYTE_MASK (0xFFU) + +ZXIC_RTN32 ZXIC_COMM_GET_MASK_VALUE(ZXIC_UINT32 total, ZXIC_UINT32 masklen); +ZXIC_UINT32 zxic_comm_random(ZXIC_VOID); +ZXIC_VOID zxic_comm_channel_max_set(ZXIC_UINT32 dev_max); + +ZXIC_RTN32 zxic_comm_channel_max_get(ZXIC_VOID); + +ZXIC_VOID zxic_comm_dbgcnt64_select_print(const ZXIC_CHAR * name, ZXIC_UINT64 value, ZXIC_UINT32 prt_mode); + +ZXIC_VOID zxic_comm_dbgcnt64_select_par_print(const ZXIC_CHAR * name, ZXIC_UINT32 parm, ZXIC_UINT64 value, ZXIC_UINT32 prt_mode); + +ZXIC_VOID zxic_comm_dbgcnt32_select_print(const ZXIC_CHAR * name, ZXIC_UINT32 value, ZXIC_UINT32 prt_mode); + +ZXIC_VOID zxic_comm_dbgcnt32_select_par_print(const ZXIC_CHAR * name, ZXIC_UINT32 parm, ZXIC_UINT32 value, ZXIC_UINT32 prt_mode); + +#define ZXIC_COMM_CHECK_ADD_CNT(x,y) (((0xffffffff - (x)) < (y)) ? ((y) - (0xffffffff - (x)) - 1) : ((x) + (y))) +#define ZXIC_COMM_CHECK_ADD_CNT_WORD64(x,y) (((0xffffffffffffffff - (x)) < (y)) ? ((y) - (0xffffffffffffffff - (x)) - 1) : ((x) + (y))) +#endif + +#if ZXIC_REAL("UT_TEST") + +ZXIC_VOID zxic_comm_ut_detail_info_trace(const ZXIC_CHAR *format, ...); + +ZXIC_VOID zxic_comm_ut_result_info_trace(const ZXIC_CHAR *format, ...); + +ZXIC_VOID zxic_comm_ut_detail_trace_error(const ZXIC_CHAR *format, ...); + +ZXIC_VOID zxic_comm_ut_detail_trace_dev_error(ZXIC_UINT32 dev_id, const ZXIC_CHAR *format, ...); + +#endif + + + + +#if ZXIC_REAL("头文件") +#include "zxic_comm_double_link.h" +#include "zxic_comm_doublelink_index.h" +#include "zxic_comm_liststack.h" +#include "zxic_comm_avl_tree.h" +#include "zxic_comm_rb_tree.h" +#include "zxic_comm_index_ctrl.h" +#include "zxic_comm_index_reserve.h" +#include "zxic_comm_index_fill.h" +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* end __ZXIC_COMMON_H__ */ + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_private.h b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_private.h new file mode 100644 index 0000000..76a4e7a --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_private.h @@ -0,0 +1,117 @@ +/************************************************************** +* 版权所有 (C)2013-2020, 深圳市中兴通讯股份有限公司 +* 文件名称 : +* 文件标识 : +* 内容摘要 : 集合几个文件用到的定义,不对外部开放 +* 其它说明 : +* 当前版本 : +* 作 者 : +* 完成日期 : 2020/07/20 +* DEPARTMENT: 有线开发四部-系统软件团队 +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ +#ifndef __ZXIC_PRIVATE_H__ +#define __ZXIC_PRIVATE_H__ + +#if ZXIC_REAL("日志相关") +#include +#include +#include +#define ZXIC_TRACE_LOG_FILE_GZ_MAX_CNT (50) /* 最大压缩后日志文件数 */ + +typedef struct zxic_log_file_info +{ + char fname[50]; + struct file *p_log_fp; + unsigned int f_size; /* 日志文件大小上限,以字节为单位 */ +}ZXIC_LOG_FILE_INFO; + + +#endif /* ZXIC_REAL("日志相关") */ + +#if ZXIC_REAL("打印相关") + typedef enum + { + ZXIC_TRACE_PRINT = 0, + ZXIC_TRACE_ERROR_PRINT = 1, + ZXIC_TRACE_INFO_PRINT , + ZXIC_TRACE_DEBUG_PRINT , + ZXIC_TRACE_ALL_PRINT , + ZXIC_TRACE_INVALID_PRINT + } ZXIC_TRACE_LEVEL; + + typedef enum zxic_log_file_type_e + { + ZXIC_LOG_SDK = 0, /*SDK日常配置记录*/ + ZXIC_LOG_INIT = 1, /*初始化日志记录*/ + ZXIC_LOG_LIF = 2, /*LIF日志记录*/ + ZXIC_LOG_SERDES = 3, /*SERDES日志记录*/ + ZXIC_LOG_SE_ERAM = 4, /*SE ERAM日志记录*/ + ZXIC_LOG_SE_HBM = 5, /*SE HBM日志记录*/ + ZXIC_LOG_SE_OTHER = 6, /*SE other (se 部分模块)日志记录*/ + ZXIC_LOG_REG = 7, /*寄存器和打桩信息日志记录,特殊使用*/ + ZXIC_LOG_DEBUG = 8, /*打印,诊断计数打印等日志记录*/ + ZXIC_LOG_DUMP = 9, /*捞数据日志记录,特殊使用*/ + ZXIC_LOG_SE_LPM_SAMPLE_V4 = 10, /*SE LPM_V4样本打印记录*/ + ZXIC_LOG_SE_LPM_SAMPLE_V6 = 11, /*SE LPM_V4样本打印记录*/ + ZXIC_LOG_UT_DETAIL = 12, /* ut check 失败信息 */ + ZXIC_LOG_UT_RESULT = 13, /* utcheck 统计信息 */ + ZXIC_LOG_SE_HASH = 14, /*SE HASH日志记录*/ + ZXIC_LOG_SE_ACL = 15, /*SE ACL日志记录*/ + ZXIC_LOG_SLT = 16, /*SLT 日志记录*/ + ZXIC_LOG_SDS_COMM = 17, /*SERDES COMM 库日志记录 */ + ZXIC_LOG_THREAD = 31, /*多线程log打印,注意多线程占用了31b~26b*/ + ZXIC_LOG_MAX, + } ZXIC_LOG_FILE_TYPE_E; + +#define ZXIC_THREAD_ID_NUM_MAX (2048) + +#define ZXIC_MALLOC_MAX_B_SIZE (0xC800000U) /* 200M */ + +#endif /* ZXIC_REAL("打印相关") */ + +#if ZXIC_REAL("互斥锁相关") +typedef struct zxic_mutex_t +{ +#ifdef ZXIC_OS_WIN + HANDLE mutex; +#else + struct mutex mutex; +#endif +}ZXIC_MUTEX_T; +#endif + +#if ZXIC_REAL("信号量相关") +typedef struct zxic_sem_t +{ + #ifdef ZXIC_OS_WIN + HANDLE sem; + #else + struct semaphore sem; + #endif +}ZXIC_SEM_T; +#endif + +void *ic_comm_sdk_print_regist(void); +unsigned int ic_comm_callback_print_get(void* pExcCall); +unsigned int ic_comm_callback_err_log_get(void* pExcCall); +void ic_comm_set_os_callback(ZXIC_OS_CALLBACK *p_os_cb); +void ic_comm_malloc_record(unsigned int size); +void ic_comm_free_record(void); +/***********************************************************/ +/** 从path_name所指的目录中查找符合参数的执行文件,找到后便执行该文件, + 然后将第二个参数argv传给该欲执行的文件,请参照execv用法,异常时候返回-1 +* @return +* @remark 无 +* @see +* @author pj @date 2020/03/30 +************************************************************/ +int zxic_system(const char *path_name, char *const argv[]); + +#endif /* end __ZXIC_COMMON_TOP_H__ */ diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_private_top.h b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_private_top.h new file mode 100644 index 0000000..1951518 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_private_top.h @@ -0,0 +1,194 @@ +/************************************************************** +* 版权所有 (C)2013-2020, 深圳市中兴通讯股份有限公司 +* 文件名称 : zxic_comm_top.h +* 文件标识 : +* 内容摘要 :提供少许 common.h 开头就要用到的宏 +* 其它说明 : 项目线不需要感知 +* 当前版本 : +* 作 者 : +* 完成日期 : 2020/07/20 +* DEPARTMENT: 有线开发四部-系统软件团队 +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ +#ifndef __ZXIC_PRIVATE_TOP_H__ +#define __ZXIC_PRIVATE_TOP_H__ + +//#include +//#include +//#include +#include +#include +//#include +//#include +#include +//#include +#include +#include + +#define ZXIC_REAL(x) (1U) /* 用于#if 对同一类的代码进行 分段 */ +#define ZXIC_NOREAL(x) (0U) /* 用于#if 对同一类的代码进行 分段 */ + +#ifndef ZXIC_OS_WIN /* 操作系统类型导入,编译宏控制 */ +#define ZXIC_OS_LINUX /* 默认为LINUX操作系统 */ +#endif + +#if ZXIC_REAL("内存") +typedef void* (*ZXIC_OS_MEM_MALLOC)(unsigned int mem_size); +typedef void (*ZXIC_OS_MEM_FREE)(void *p_free); + +typedef struct _zxic_os_callback +{ + ZXIC_OS_MEM_MALLOC p_mem_malloc; + ZXIC_OS_MEM_FREE p_mem_free; +} ZXIC_OS_CALLBACK; +#endif + +#if ZXIC_REAL("大小端") +/*大小端序专用*/ +typedef union zxic_endian_u +{ + unsigned int a; + unsigned char b; +} ZXIC_ENDIAN_U; +#endif + +#if ZXIC_REAL("异常返回值宏定义") +#define ZXIC_RC_BASE (0x1000U) + +/* bit_stream */ +#define ZXIC_BIT_STREAM_BASE (ZXIC_RC_BASE | 0x100) +#define ZXIC_BIT_STREAM_INDEX_ERR (ZXIC_BIT_STREAM_BASE | 0x001) +#define ZXIC_BIT_STREAM_DATA_TOO_BIG (ZXIC_BIT_STREAM_BASE | 0x002) + +/* parameter check */ +#define ZXIC_PARAMETER_CHK_BASE (ZXIC_RC_BASE | 0x200) +#define ZXIC_PAR_CHK_POINT_NULL (ZXIC_PARAMETER_CHK_BASE | 0x001) +#define ZXIC_PAR_CHK_ARGIN_ZERO (ZXIC_PARAMETER_CHK_BASE | 0x002) +#define ZXIC_PAR_CHK_ARGIN_OVERFLOW (ZXIC_PARAMETER_CHK_BASE | 0x003) +#define ZXIC_PAR_CHK_ARGIN_ERROR (ZXIC_PARAMETER_CHK_BASE | 0x004) +#define ZXIC_PAR_CHK_INVALID_INDEX (ZXIC_PARAMETER_CHK_BASE | 0x005) +#define ZXIC_PAR_CHK_INVALID_RANGE (ZXIC_PARAMETER_CHK_BASE | 0x006) +#define ZXIC_PAR_CHK_INVALID_DEV_ID (ZXIC_PARAMETER_CHK_BASE | 0x007) +#define ZXIC_PAR_CHK_INVALID_PARA (ZXIC_PARAMETER_CHK_BASE | 0x008) + +/* mutex lock */ +#define ZXIC_MUTEX_LOCK_BASE (ZXIC_RC_BASE | 0x300) +#define ZXIC_MUTEX_LOCK_INIT_FAIL (ZXIC_MUTEX_LOCK_BASE | 0x001) +#define ZXIC_MUTEX_LOCK_LOCK_FAIL (ZXIC_MUTEX_LOCK_BASE | 0x002) +#define ZXIC_MUTEX_LOCK_ULOCK_FAIL (ZXIC_MUTEX_LOCK_BASE | 0X003) +#define ZXIC_MUTEX_LOCK_DESTROY_FAIL (ZXIC_MUTEX_LOCK_BASE | 0X004) + +/* thread */ +#define ZXIC_THREAD_BASE (ZXIC_RC_BASE | 0x400) +#define ZXIC_THREAD_INFO_ADD_FAIL (ZXIC_THREAD_BASE | 0x001) +#define ZXIC_THREAD_CREATE_FAIL (ZXIC_THREAD_BASE | 0x002) + +/* socket */ +#define ZXIC_SOCKET_BASE (ZXIC_RC_BASE | 0x400) +#define ZXIC_SOKET_SERVICE_START_FAIL (ZXIC_THREAD_BASE | 0x001) +#define ZXIC_SOKET_SERVICE_CLOSE_FAIL (ZXIC_THREAD_BASE | 0x002) +#define ZXIC_SOKET_SET_PARA_FAIL (ZXIC_THREAD_BASE | 0x003) +#define ZXIC_SOKET_CREATE_FAIL (ZXIC_THREAD_BASE | 0x004) +#define ZXIC_SOKET_BIND_LISTEN_FAIL (ZXIC_THREAD_BASE | 0x005) +#define ZXIC_SOKET_CONNECT_FAIL (ZXIC_THREAD_BASE | 0x006) +#define ZXIC_SOKET_CLOSE_FAIL (ZXIC_THREAD_BASE | 0x007) +#define ZXIC_SOKET_GET_PARA_FAIL (ZXIC_THREAD_BASE | 0x008) + + +/* double link */ +#define ZXIC_DOUBLE_LINK_BASE (ZXIC_RC_BASE | 0x500) +#define ZXIC_DOUBLE_LINK_ELEMENT_NUM_ERR (ZXIC_DOUBLE_LINK_BASE | 0x001) +#define ZXIC_DOUBLE_LINK_MALLOC_FAIL (ZXIC_DOUBLE_LINK_BASE | 0x002) +#define ZXIC_DOUBLE_LINK_POINT_NULL (ZXIC_DOUBLE_LINK_BASE | 0x003) +#define ZXIC_DOUBLE_LINK_CHK_SUM_ERR (ZXIC_DOUBLE_LINK_BASE | 0x004) +#define ZXIC_DOUBLE_LINK_NO_EXIST_FREENODE (ZXIC_DOUBLE_LINK_BASE | 0x005) +#define ZXIC_DOUBLE_LINK_FREE_INDX_INVALID (ZXIC_DOUBLE_LINK_BASE | 0x006) +#define ZXIC_DOUBLE_LINK_NO_EXIST_PRENODE (ZXIC_DOUBLE_LINK_BASE | 0x007) +#define ZXIC_DOUBLE_LINK_INPUT_INDX_INVALID (ZXIC_DOUBLE_LINK_BASE | 0x008) +#define ZXIC_DOUBLE_LINK_INIT_ELEMENT_NUM_ERR (ZXIC_DOUBLE_LINK_BASE | 0x009) + + +/* index ctrl */ +#define ZXIC_INDEX_CTRL_BASE (ZXIC_RC_BASE | 0x600) +#define ZXIC_INDEX_CTRL_TREE_FULL (ZXIC_INDEX_CTRL_BASE | 0x001) +#define ZXIC_INDEX_CTRL_SAME_RECORD (ZXIC_INDEX_CTRL_BASE | 0x002) +#define ZXIC_INDEX_CTRL_OPER_MODE_ERR (ZXIC_INDEX_CTRL_BASE | 0x003) + +/* index reverse */ +#define ZXIC_INDEX_RSV_BASE (ZXIC_RC_BASE | 0x700) +#define ZXIC_INDEX_RESERVE_GET_INDX_FAIL (ZXIC_INDEX_RSV_BASE | 0x001) +#define ZXIC_INDEX_RESERVE_BORROW_HIG_FAIL (ZXIC_INDEX_RSV_BASE | 0x002) +#define ZXIC_INDEX_RESERVE_BORROW_LOW_FAIL (ZXIC_INDEX_RSV_BASE | 0x003) +#define ZXIC_INDEX_RESERVE_ALLOCI_INDX_FAIL (ZXIC_INDEX_RSV_BASE | 0x004) +#define ZXIC_INDEX_RESERVE_FREE_INDX_FAIL (ZXIC_INDEX_RSV_BASE | 0x005) +#define ZXIC_INDEX_RESERVE_RESET_INDX_FAIL (ZXIC_INDEX_RSV_BASE | 0x006) + +/* list stack */ +#define ZXIC_LIST_STACK_BASE (ZXIC_RC_BASE | 0x800) +#define ZXIC_LIST_STACK_ELEMENT_NUM_ERR (ZXIC_LIST_STACK_BASE | 0x001) +#define ZXIC_LIST_STACK_POINT_NULL (ZXIC_LIST_STACK_BASE | 0x002) +#define ZXIC_LIST_STACK_ALLOC_MEMORY_FAIL (ZXIC_LIST_STACK_BASE | 0x003) +#define ZXIC_LIST_STACK_ISEMPTY_ERR (ZXIC_LIST_STACK_BASE | 0x004) +#define ZXIC_LIST_STACK_FREE_INDEX_INVALID (ZXIC_LIST_STACK_BASE | 0x005) +#define ZXIC_LIST_STACK_ALLOC_INDEX_INVALID (ZXIC_LIST_STACK_BASE | 0x006) +#define ZXIC_LIST_STACK_ALLOC_INDEX_USED (ZXIC_LIST_STACK_BASE | 0x007) + +/* avl tree */ +#define ZXIC_AVL_TREE_BASE (ZXIC_RC_BASE | 0x900) +#define ZXIC_AVL_TREE_INVALID_INDEX (ZXIC_AVL_TREE_BASE | 0x001) +#define ZXIC_AVL_TREE_SORT_INIT_INPUT_PARA_ERR (ZXIC_AVL_TREE_BASE | 0x002) +#define ZXIC_AVL_TREE_SORT_ISEMPTY_ERR (ZXIC_AVL_TREE_BASE | 0x003) +#define ZXIC_AVL_TREE_SORT_INSERT_SAME_KEY (ZXIC_AVL_TREE_BASE | 0x004) +#define ZXIC_AVL_TREE_SORT_IS_FULL (ZXIC_AVL_TREE_BASE | 0x005) +#define ZXIC_AVL_TREE_KEY_SIZE_ERR (ZXIC_AVL_TREE_BASE | 0x006) + +/* index fill */ +#define ZXIC_INDEX_FILL_BASE (ZXIC_RC_BASE | 0xA00) +#define ZXIC_INDEX_FILL_FULL (ZXIC_INDEX_FILL_BASE | 0x001) +#define ZXIC_INDEX_DEL_FAIL (ZXIC_INDEX_FILL_BASE | 0x002) + +#define ZXIC_COMM_LOG_BASE (ZXIC_RC_BASE | 0xB00) +#define ZXIC_COMM_LOG_MUTEX_CREATE_FAIL (ZXIC_COMM_LOG_BASE | 0x001) +#define ZXIC_COMM_LOG_MUTEX_LOCK_FAIL (ZXIC_COMM_LOG_BASE | 0x002) +#define ZXIC_COMM_LOG_FILE_RENAME_FAIL (ZXIC_COMM_LOG_BASE | 0x003) +#define ZXIC_COMM_LOG_FILE_DELETE_FAIL (ZXIC_COMM_LOG_BASE | 0x004) + +/* index fill type */ +#define ZXIC_INDEX_FILL_TYPE_BASE (ZXIC_RC_BASE | 0xC00) +#define ZXIC_INDEX_FILL_TYPE_FULL (ZXIC_INDEX_FILL_TYPE_BASE | 0x001) +#define ZXIC_INDEX_DEL_TYPE_FAIL (ZXIC_INDEX_FILL_TYPE_BASE | 0x002) + +#define ZXIC_COMM_C_INVALID_PARAM (ZXIC_COMM_LOG_BASE | 0x005) + +#define ZXIC_E_LLT_CHECK (25) +#define ZXIC_E_LLT_ASSERT (26) + +#endif /* END 返回值宏定义 */ + +#if ZXIC_REAL("") +signed int ic_comm_snprintf_s(char *buffer, size_t sizeofbuf, size_t count, const char *format, ...); +signed int ic_comm_vsnprintf_s(char *buffer, size_t sizeofbuf, size_t count, const char *format, va_list ap); +signed int ic_comm_sscanf(const char * src, const char * format, ...); +char *ic_comm_strcpy_s( char *pcDst, size_t dwMaxSize, const char *pcSrc); +char *ic_comm_strncpy_s( char *pcDst, size_t dwMaxSize, const char *pcSrc, size_t dwCount ); +unsigned int ic_comm_memcpy(void* dest, const void* src, size_t n); +unsigned int ic_comm_memcpy_s(void* dest, size_t dest_len, const void* src, size_t n); +char *ic_comm_strcat_s( char *pcDst, size_t dwMaxSize, const char *pcSrc ); +char *ic_comm_strncat_s( char *pcDst, size_t dwMaxSize, const char *pcSrc, size_t dwCount ); +size_t ic_comm_strnlen_s( const char *str, size_t MaxCount); +char* ic_comm_strtok_s(char* string_org, const char* demial, char** context); +ZXIC_OS_CALLBACK* zxic_comm_get_os_callback(void); +void* ic_comm_malloc_memory(unsigned int size); +void ic_comm_free_record(void); +unsigned int zxic_comm_index_check(unsigned int val, unsigned int min, unsigned int max); +unsigned int zxic_comm_dev_index_check(unsigned int dev_id, unsigned int val, unsigned int min, unsigned int max); +unsigned int zxic_comm_index_check(unsigned int val, unsigned int min, unsigned int max); +#endif + +#endif /* end __ZXIC_COMMON_TOP_H__ */ diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_slt.h b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_slt.h new file mode 100644 index 0000000..d23ebcc --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/comm/include/zxic_slt.h @@ -0,0 +1,751 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : zxic_slt.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : PJ +* 完成日期 : 2022/03/26 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef __ZXIC_SLT_H__ +#define __ZXIC_SLT_H__ + +#ifdef __cplusplus +extern "C" { +#endif + + +#define ZXIC_SLT_CASE_PASS (0U) +#define ZXIC_SLT_CASE_FAILURE (1U) + +#define ZXIC_SLT_ERR_INFO_LEN (255U) +#define ZXIC_SLT_CASE_MAX_NUM (255U) +#define ZXIC_SLT_DEV_ID_MAX_NUM (4U) +#define ZXIC_SLT_CHIP_ID_LEN (3U) + +/* 封装类型,不同产品含义不同,暂时定义最大支持5个*/ +#define ZXIC_SLT_MAX_ENCAP (5U) + + +/* BIN_CODE 编码*/ +#define ZXIC_SLT_BIN_CODE_PASS ZXIC_SLT_CASE_PASS +#define ZXIC_SLT_BIN_CODE_SERDES_FAIL (1U)/* sredes类检测*/ +#define ZXIC_SLT_BIN_CODE_FLOW_FAIL (2U)/* pvt类检测 FLOW通流类*/ +#define ZXIC_SLT_BIN_CODE_RAM_FAIL (3U)/* RAM类检测*/ +#define ZXIC_SLT_BIN_CODE_HBM_DDR_FAIL (4U)/* hbm类检测*/ +#define ZXIC_SLT_BIN_CODE_OTHER_FAIL (5U)/* PLL EFUSE PCIE RISCV */ +#define ZXIC_SLT_BIN_CODE_MIX_FAIL (6U)/* 上述多种类型的混合*/ + + + + +/* 测试用例全集case_no定义*/ +typedef enum zxic_slt_case_no_e +{ + ZXIC_SLT_CASE_PLL_LOCK_STATUS_CHECK = (0x08U), + /* efuse锁定相关测试用例 */ + ZXIC_SLT_CASE_EFUSE_CHECK = (0x09U), + + + + + /* serdes用例编号范围0x10~0x7f*/ + /* lifx(LIF0 LIF1 LIF2)接口serdes prbs相关测试用例 0x10~0x2f*/ + ZXIC_SLT_CASE_SERDES_LIFX_PRBS_1G = (0x10U), + ZXIC_SLT_CASE_SERDES_LIFX_PRBS_3G = (0x11U), + ZXIC_SLT_CASE_SERDES_LIFX_PRBS_5G = (0x12U), + ZXIC_SLT_CASE_SERDES_LIFX_PRBS_6G = (0x13U), + ZXIC_SLT_CASE_SERDES_LIFX_PRBS_9G = (0x14U), + ZXIC_SLT_CASE_SERDES_LIFX_PRBS_10G = (0x15U), + ZXIC_SLT_CASE_SERDES_LIFX_PRBS_12G = (0x16U), + ZXIC_SLT_CASE_SERDES_LIFX_PRBS_15G = (0x17U), + ZXIC_SLT_CASE_SERDES_LIFX_PRBS_20G = (0x18U), + ZXIC_SLT_CASE_SERDES_LIFX_PRBS_25G = (0x19U), + ZXIC_SLT_CASE_SERDES_LIFX_PRBS_26G = (0x1aU), + ZXIC_SLT_CASE_SERDES_LIFX_PRBS_27G = (0x1bU), + ZXIC_SLT_CASE_SERDES_LIFX_PRBS_28G = (0x1cU), + ZXIC_SLT_CASE_SERDES_LIFX_PRBS_30G = (0x1dU), + ZXIC_SLT_CASE_SERDES_LIFX_PRBS_50G = (0x1fU), + ZXIC_SLT_CASE_SERDES_LIFX_PRBS_51G = (0x20U), + ZXIC_SLT_CASE_SERDES_LIFX_PRBS_53G = (0x21U), + ZXIC_SLT_CASE_SERDES_LIFX_PRBS_55G = (0x22U), + ZXIC_SLT_CASE_SERDES_LIFX_PRBS_56G = (0x23U), + ZXIC_SLT_CASE_SERDES_LIFX_PRBS_57G = (0x24U), + ZXIC_SLT_CASE_SERDES_LIFX_PRBS_98G = (0x25U), + ZXIC_SLT_CASE_SERDES_LIFX_PRBS_106G = (0x26U), + ZXIC_SLT_CASE_SERDES_LIFX_PRBS_111G = (0x27U), + ZXIC_SLT_CASE_SERDES_LIFX_PRBS_112G = (0x28U), + + + /* lifc接口serdes相关测试用例 0x30~0x37*/ + ZXIC_SLT_CASE_SERDES_LIFC_PRBS_1G = (0x30U), + ZXIC_SLT_CASE_SERDES_LIFC_PRBS_10G = (0x31U), + ZXIC_SLT_CASE_SERDES_LIFC_PRBS_25G = (0x32U), + ZXIC_SLT_CASE_SERDES_LIFC_PRBS_53G = (0x33U), + + /* lifc eth 接口发包测试相关测试用例 0x38~0x3f*/ + ZXIC_SLT_CASE_PORT_LIFC_SD_1G = (0x38U), + ZXIC_SLT_CASE_PORT_LIFC_SD_10G = (0x39U), + ZXIC_SLT_CASE_PORT_LIFC_SD_25G = (0x3aU), + ZXIC_SLT_CASE_PORT_LIFC_SD_53G = (0x3bU), + + /* 外部查找的interlaken-la接口*/ + ZXIC_SLT_CASE_SERDES_INTERLAKEN_LA = (0x3fU), + + + /* lif0 eth 接口发包测试相关测试用例 0x40~0x5f*/ + ZXIC_SLT_CASE_PORT_LIFO_SD_1G = (0x40U), + ZXIC_SLT_CASE_PORT_LIFO_SD_5G = (0x41U), + ZXIC_SLT_CASE_PORT_LIFO_SD_10G = (0x42U), + ZXIC_SLT_CASE_PORT_LIFO_SD_12G = (0x43U), + ZXIC_SLT_CASE_PORT_LIFO_SD_25G = (0x44U), + ZXIC_SLT_CASE_PORT_LIFO_SD_26G = (0x45U), + ZXIC_SLT_CASE_PORT_LIFO_SD_51G = (0x46U), + ZXIC_SLT_CASE_PORT_LIFO_SD_53G = (0x47U), + ZXIC_SLT_CASE_PORT_LIFO_SD_106G = (0x48U), + ZXIC_SLT_CASE_PORT_LIFO_SD_112G = (0x49U), + ZXIC_SLT_CASE_PORT_LIFO_SD_20G = (0x4AU), + + + /* lif0 intlk接口发包测试相关测试用例 0x60~0x6f*/ + ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_3G = (0x60U), + ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_6G = (0x61U), + ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_10G = (0x62U), + ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_12G = (0x63U), + ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_25G = (0x64U), + ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_28G = (0x65U), + ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_30G = (0x66U), + ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_50G = (0x67U), + ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_51G = (0x68U), + ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_53G = (0x69U), + ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_56G = (0x6aU), + ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_106G = (0x6bU), + ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_112G = (0x6cU), + + + /* 交换侧lif1 FEC测试相关测试用例 0x70~0x7f*/ + ZXIC_SLT_CASE_SERDES_LIF1_FEC_25G = (0x70U), + ZXIC_SLT_CASE_SERDES_LIF1_FEC_26G = (0x71U), + ZXIC_SLT_CASE_SERDES_LIF1_FEC_28G = (0x72U), + ZXIC_SLT_CASE_SERDES_LIF1_FEC_50G = (0x73U), + ZXIC_SLT_CASE_SERDES_LIF1_FEC_53G = (0x74U), + ZXIC_SLT_CASE_SERDES_LIF1_FEC_56G = (0x75U), + ZXIC_SLT_CASE_SERDES_LIF1_FEC_98G = (0x76U), + ZXIC_SLT_CASE_SERDES_LIF1_FEC_106G = (0x77U), + ZXIC_SLT_CASE_SERDES_LIF1_FEC_112G = (0x78U), + + + + + /*片内ram用例编号范围0x80~0x87*/ + /* CPU可读写寄存器测试用例 */ + ZXIC_SLT_CASE_REG_CPU_W_R = (0x80U), + /* CPU可读写ram测试用例 */ + ZXIC_SLT_CASE_RAM_CPU_W_R = (0x81U), + /* RAM表项读写测试(微码)*/ + ZXIC_SLT_CASE_RAM_MC_W_R = (0x82U), + /* RAM表项读写测试 memtest86(微码)*/ + ZXIC_SLT_CASE_RAM_MC_MEMTEST86 = (0x83U), + + + + + /* HBM/DDR用例编号范围 0x90~0x9f*/ + /*mbist测试*/ + ZXIC_SLT_CASE_HBM_DDR_CTRL_BIST = (0x90U), + /* HBM/DDR表项CPU读写测试*/ + ZXIC_SLT_CASE_HBM_DDR_CPU_W_R = (0x91U), + /* HBM/DDR表项读写测试(微码)*/ + ZXIC_SLT_CASE_HBM_DDR_MC_W_R = (0x92U), + /* HBM/DDR表项读写测试 memtest86(微码)*/ + ZXIC_SLT_CASE_HBM_DDR_MC_MEMTEST86 = (0x93U), + /* HBM/DDR TM覆盖测试*/ + ZXIC_SLT_CASE_HBM_DDR_TM_TEST = (0x94U), + + + + + + /* 发流测试和全业务PVT测试用例编号范围 0xa0~0xaf*/ + /* 数据路径测试用例 */ + ZXIC_SLT_CASE_PKT_FLOW_NOM = (0xA0U), + /* OAM发包测试用例 */ + ZXIC_SLT_CASE_OAM_SEND_PKT = (0xA1U), + /* se查表全集测试 */ + ZXIC_SLT_CASE_PKT_FLOW_SE_FULL = (0xA2U), + /* tm全队列测试用例 */ + ZXIC_SLT_CASE_PKT_FLOW_TM_FULL = (0xA3U), + /* LIFC口测试用例 */ + ZXIC_SLT_CASE_PKT_FLOW_LIFC = (0xA4U), + + /* 芯片PVT 功耗、温度和电压测试用例 */ + ZXIC_SLT_CASE_PVT_EXCEED_POWER_TEST = (0xA8U), + ZXIC_SLT_CASE_PVT_EXCEED_TEM_VOLT_TEST = (0xA9U), + ZXIC_SLT_CASE_PVT_EXCEED_HBM_TEMPER_TEST = (0xAaU), + + + + + + /* 其他测试用例编号范围0xb0~0xff*/ + /* 调压测试*/ + ZXIC_SLT_CASE_VOLT_TEST = (0xB0U), + /* 时钟频偏测试 */ + ZXIC_SLT_CASE_CLK_TEST = (0xB1U), + + /* PCIE压力测试 */ + ZXIC_SLT_CASE_PCIE_W_R_TEST = (0xB2U), + /* 下述两个测试用例必须放在最后执行 */ + /* PCIE建链测试 */ + ZXIC_SLT_CASE_PCIE_TEST = (0xB3U), + /* RISCV测试用例 */ + ZXIC_SLT_CASE_RISCV_W_R_TEST = (0xB4U), + + ZXIC_SLT_CASE_MAX, +} ZXIC_SLT_CASE_NO_E; + + +#if ZXIC_REAL("ERR_CODE") +#define ZXIC_SLT_RC_BASE (0x100U) + + + #define ZXIC_SLT_TEST_CASE_FNC_POINT_NULL (ZXIC_SLT_RC_BASE | 0x1) + #define ZXIC_SLT_CASE_PLL_LOCK_STATUS_CHECK_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PLL_LOCK_STATUS_CHECK) + #define ZXIC_SLT_CASE_EFUSE_CHECK_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_EFUSE_CHECK) + + /* lifx*/ + #define ZXIC_SLT_CASE_SERDES_LIFX_PRBS_1G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFX_PRBS_1G) + #define ZXIC_SLT_CASE_SERDES_LIFX_PRBS_3G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFX_PRBS_3G) + #define ZXIC_SLT_CASE_SERDES_LIFX_PRBS_5G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFX_PRBS_5G) + #define ZXIC_SLT_CASE_SERDES_LIFX_PRBS_6G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFX_PRBS_6G) + #define ZXIC_SLT_CASE_SERDES_LIFX_PRBS_9G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFX_PRBS_9G) + #define ZXIC_SLT_CASE_SERDES_LIFX_PRBS_10G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFX_PRBS_10G) + #define ZXIC_SLT_CASE_SERDES_LIFX_PRBS_12G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFX_PRBS_12G) + #define ZXIC_SLT_CASE_SERDES_LIFX_PRBS_15G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFX_PRBS_15G) + #define ZXIC_SLT_CASE_SERDES_LIFX_PRBS_20G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFX_PRBS_20G) + #define ZXIC_SLT_CASE_SERDES_LIFX_PRBS_25G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFX_PRBS_25G) + #define ZXIC_SLT_CASE_SERDES_LIFX_PRBS_26G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFX_PRBS_26G) + #define ZXIC_SLT_CASE_SERDES_LIFX_PRBS_27G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFX_PRBS_27G) + #define ZXIC_SLT_CASE_SERDES_LIFX_PRBS_28G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFX_PRBS_28G) + #define ZXIC_SLT_CASE_SERDES_LIFX_PRBS_30G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFX_PRBS_30G) + #define ZXIC_SLT_CASE_SERDES_LIFX_PRBS_50G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFX_PRBS_50G) + #define ZXIC_SLT_CASE_SERDES_LIFX_PRBS_51G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFX_PRBS_51G) + #define ZXIC_SLT_CASE_SERDES_LIFX_PRBS_53G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFX_PRBS_53G) + #define ZXIC_SLT_CASE_SERDES_LIFX_PRBS_55G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFX_PRBS_55G) + #define ZXIC_SLT_CASE_SERDES_LIFX_PRBS_56G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFX_PRBS_56G) + #define ZXIC_SLT_CASE_SERDES_LIFX_PRBS_57G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFX_PRBS_57G) + #define ZXIC_SLT_CASE_SERDES_LIFX_PRBS_98G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFX_PRBS_98G) + #define ZXIC_SLT_CASE_SERDES_LIFX_PRBS_106G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFX_PRBS_106G) + #define ZXIC_SLT_CASE_SERDES_LIFX_PRBS_111G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFX_PRBS_111G) + #define ZXIC_SLT_CASE_SERDES_LIFX_PRBS_112G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFX_PRBS_112G) + + /* lifc*/ + #define ZXIC_SLT_CASE_SERDES_LIFC_PRBS_1G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFC_PRBS_1G) + #define ZXIC_SLT_CASE_SERDES_LIFC_PRBS_10G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFC_PRBS_10G) + #define ZXIC_SLT_CASE_SERDES_LIFC_PRBS_25G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFC_PRBS_25G) + #define ZXIC_SLT_CASE_SERDES_LIFC_PRBS_53G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIFC_PRBS_53G) + + /* lifc */ + #define ZXIC_SLT_CASE_PORT_LIFC_SD_1G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFC_SD_1G ) + #define ZXIC_SLT_CASE_PORT_LIFC_SD_10G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFC_SD_10G) + #define ZXIC_SLT_CASE_PORT_LIFC_SD_25G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFC_SD_25G) + #define ZXIC_SLT_CASE_PORT_LIFC_SD_53G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFC_SD_53G) + + /* lif0 ETH*/ + #define ZXIC_SLT_CASE_PORT_LIFO_SD_1G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFO_SD_1G) + #define ZXIC_SLT_CASE_PORT_LIFO_SD_5G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFO_SD_5G) + #define ZXIC_SLT_CASE_PORT_LIFO_SD_10G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFO_SD_10G) + #define ZXIC_SLT_CASE_PORT_LIFO_SD_12G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFO_SD_12G) + #define ZXIC_SLT_CASE_PORT_LIFO_SD_25G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFO_SD_25G) + #define ZXIC_SLT_CASE_PORT_LIFO_SD_26G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFO_SD_26G) + #define ZXIC_SLT_CASE_PORT_LIFO_SD_51G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFO_SD_51G) + #define ZXIC_SLT_CASE_PORT_LIFO_SD_53G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFO_SD_53G) + #define ZXIC_SLT_CASE_PORT_LIFO_SD_106G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFO_SD_106G) + #define ZXIC_SLT_CASE_PORT_LIFO_SD_112G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFO_SD_112G) + #define ZXIC_SLT_CASE_PORT_LIFO_SD_20G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFO_SD_20G) + + /* lif0 intlk*/ + #define ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_3G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_3G ) + #define ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_6G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_6G ) + #define ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_10G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_10G ) + #define ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_12G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_12G ) + #define ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_25G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_25G ) + #define ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_28G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_28G ) + #define ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_30G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_30G ) + #define ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_50G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_50G ) + #define ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_51G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_51G ) + #define ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_53G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_53G ) + #define ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_56G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_56G ) + #define ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_106G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_106G) + #define ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_112G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PORT_LIFO_SD_ILK_112G ) + + +/* lif1*/ +#define ZXIC_SLT_CASE_SERDES_LIF1_FEC_25G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIF1_FEC_25G) +#define ZXIC_SLT_CASE_SERDES_LIF1_FEC_26G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIF1_FEC_26G) +#define ZXIC_SLT_CASE_SERDES_LIF1_FEC_28G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIF1_FEC_28G) +#define ZXIC_SLT_CASE_SERDES_LIF1_FEC_50G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIF1_FEC_50G) +#define ZXIC_SLT_CASE_SERDES_LIF1_FEC_53G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIF1_FEC_53G) +#define ZXIC_SLT_CASE_SERDES_LIF1_FEC_56G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIF1_FEC_56G) +#define ZXIC_SLT_CASE_SERDES_LIF1_FEC_98G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIF1_FEC_98G) +#define ZXIC_SLT_CASE_SERDES_LIF1_FEC_106G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIF1_FEC_106G) +#define ZXIC_SLT_CASE_SERDES_LIF1_FEC_112G_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_LIF1_FEC_112G) + +/* 外部查找的interlaken-la接口*/ +#define ZXIC_SLT_CASE_SERDES_INTELAKEN_LA_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_SERDES_INTELAKEN_LA) + + + /*片内ram读写测试*/ + #define ZXIC_SLT_CASE_RAM_CPU_W_R_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_RAM_CPU_W_R ) + #define ZXIC_SLT_CASE_REG_CPU_W_R_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_REG_CPU_W_R ) + #define ZXIC_SLT_CASE_RAM_MC_W_R_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_RAM_MC_W_R ) + #define ZXIC_SLT_CASE_RAM_MC_MEMTEST86_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_RAM_MC_MEMTEST86 ) + + /* HBM/DDR */ + #define ZXIC_SLT_CASE_HBM_DDR_CTRL_BIST_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_HBM_DDR_CTRL_BIST ) + #define ZXIC_SLT_CASE_HBM_DDR_MC_W_R_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_HBM_DDR_MC_W_R ) + #define ZXIC_SLT_CASE_HBM_DDR_MC_MEMTEST86_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_HBM_DDR_MC_MEMTEST86 ) + #define ZXIC_SLT_CASE_HBM_DDR_CPU_W_R_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_HBM_DDR_CPU_W_R ) + #define ZXIC_SLT_CASE_HBM_DDR_TM_TEST_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_HBM_DDR_TM_TEST ) + + + /* 发流测试和全业务PVT测试*/ + #define ZXIC_SLT_CASE_PKT_FLOW_NOM_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PKT_FLOW_NOM ) + #define ZXIC_SLT_CASE_OAM_SEND_PKT_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_OAM_SEND_PKT ) + #define ZXIC_SLT_CASE_PKT_FLOW_SE_FULL_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PKT_FLOW_SE_FULL ) + #define ZXIC_SLT_CASE_PKT_FLOW_TM_FULL_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PKT_FLOW_TM_FULL ) + #define ZXIC_SLT_CASE_PKT_FLOW_LIFC_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PKT_FLOW_LIFC ) + + #define ZXIC_SLT_CASE_PVT_EXCEED_POWER_TEST_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PVT_EXCEED_POWER_TEST ) + #define ZXIC_SLT_CASE_PVT_EXCEED_TEM_VOLT_TEST_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PVT_EXCEED_TEM_VOLT_TEST ) + #define ZXIC_SLT_CASE_PVT_EXCEED_HBM_TEMPER_TEST_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PVT_EXCEED_HBM_TEMPER_TEST) + + + #define ZXIC_SLT_CASE_PCIE_TEST_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PCIE_TEST ) + #define ZXIC_SLT_CASE_PCIE_W_R_TEST_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_PCIE_W_R_TEST ) + #define ZXIC_SLT_CASE_RISCV_W_R_TEST_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_RISCV_W_R_TEST) + #define ZXIC_SLT_CASE_VOLT_TEST_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_VOLT_TEST ) + #define ZXIC_SLT_CASE_CLK_TEST_FAIL (ZXIC_SLT_RC_BASE | ZXIC_SLT_CASE_CLK_TEST) + +#endif + + +typedef struct zxic_slt_err_info_mng_t +{ + ZXIC_UINT32 err_code; /*参见ERR_CODE定义*/ + const ZXIC_CHAR * err_info; +} ZXIC_SLT_ERR_INFO_MNG_T; + + +typedef struct zxic_slt_init_ctrl_t +{ + ZXIC_ADDR_T pcie_vir_baddr; /**< @brief PCIe映射虚拟基地址*/ + ZXIC_ADDR_T riscv_vir_baddr; /**< @brief RISCV映射虚拟基地址 */ + ZXIC_ADDR_T dma_vir_baddr; /**< @brief DMA映射虚拟地址*/ + ZXIC_ADDR_T dma_phy_baddr; /**< @brief DMA内存物理地址*/ +}ZXIC_SLT_INIT_CTRL_T; + + +typedef struct zxic_slt_case_para_t + +{ + ZXIC_UINT32 chip_id[ZXIC_SLT_CHIP_ID_LEN]; /* 返回对应芯片ID */ + ZXIC_UINT32 case_num; /* 返回执行SLT 用例数 */ + ZXIC_UINT32 case_no[ZXIC_SLT_CASE_MAX_NUM]; /* 返回执行SLT 用例编号列表 */ + ZXIC_UINT32 case_result[ZXIC_SLT_CASE_MAX_NUM]; /* 返回执行SLT 用例对应结果,成功返回值或错误码 */ + ZXIC_UINT32 bin_code; /* 返回 SLT 执行分BIN码 */ + ZXIC_DOUBLE temp; /* 返回 SLT 用例测试前初始温度 */ + ZXIC_DOUBLE volt; /* 返回 SLT 用例测试前核电压 */ + +} ZXIC_SLT_CASE_PARA_T; + + + +/*case 函数标准定义*/ +typedef ZXIC_RTN32 (*ZXIC_SLT_INST_CASE_FN)(ZXIC_UINT32 device_id); + +typedef struct zxic_slt_case_mng_t +{ + const ZXIC_CHAR * case_name; /*用例名称*/ + ZXIC_UINT32 case_no; /*参见ZXIC_SLT_CASE_NO_E定义*/ + ZXIC_SLT_INST_CASE_FN inst_case_fn; /*单个case函数指针*/ +} ZXIC_SLT_CASE_MNG_T; + + + +/* 功耗类型定义*/ +typedef enum zxic_slt_power_type_t +{ + ZXIC_SLT_POWER_VCC_SSP4_CORE = (0x0U), + ZXIC_SLT_POWER_VCC0V75_SSP4_SERDES_DVDD = (0x1U), + ZXIC_SLT_POWER_VCC0V75_SSP4_SERDES_AVDDL = (0x2U), + ZXIC_SLT_POWER_VCC1V2_SSP4_SERDES_AVDDH = (0x3U), + ZXIC_SLT_POWER_VCC1V2_SSP4_HBM_VDDQ = (0x4U), + + ZXIC_SLT_POWER_VCC0V75_SSP4_AVDD = (0x5U), + ZXIC_SLT_POWER_VCC1V2_SSP4_AVDD = (0x6U), + ZXIC_SLT_POWER_VCC1V2_SSP4_GPIO_DVDD = (0x7U), + ZXIC_SLT_POWER_VCC2V5_SSP4_VPP = (0x8U), + + ZXIC_SLT_POWER_TYPE_MAX, + +}ZXIC_SLT_POWER_TYPE_T; + +typedef struct zxic_slt_power_t +{ + + ZXIC_DOUBLE volt; /* 电压值 */ + ZXIC_DOUBLE cur; /* 电流值 */ + ZXIC_UINT32 type; /* 功耗编码,参见ZXIC_SLT_POWER_TYPE_T定义 */ +}ZXIC_SLT_POWER_T; + +typedef struct zxic_slt_power_para_t +{ + ZXIC_SLT_POWER_T *p_para; + ZXIC_UINT32 num; /* 有效功耗个数 */ +}ZXIC_SLT_POWER_PARA_T; + + + +/* 电压类型定义*/ +typedef enum zxic_slt_volt_type_t +{ + ZXIC_SLT_VOLT_VCC_SSP4_CORE = (0x0U), + ZXIC_SLT_VOLT_VCC0V75_SSP4_SERDES_DVDD = (0x1U), + ZXIC_SLT_VOLT_VCC0V75_SSP4_SERDES_AVDDL = (0x2U), + ZXIC_SLT_VOLT_VCC1V2_SSP4_SERDES_AVDDH = (0x3U), + ZXIC_SLT_VOLT_VCC1V2_SSP4_HBM_VDDQ = (0x4U), + + ZXIC_SLT_VOLT_TYPE_MAX, + +}ZXIC_SLT_VOLT_TYPE_T; + +typedef struct zxic_slt_volt_t +{ + + ZXIC_UINT32 percent; /* 调压上下浮动值,百分比*100,例如上调1%,传入数值1*/ + ZXIC_UINT32 flag; /* 正偏:0 负偏:1 */ + ZXIC_UINT32 vol_type; /* 电压类型,参见ZXIC_SLT_VOLT_TYPE_T定义 */ +}ZXIC_SLT_VOLT_T; + +typedef struct zxic_slt_volt_para_t +{ + ZXIC_SLT_VOLT_T *p_para; + ZXIC_UINT32 num; /* 有效调压个数 */ +}ZXIC_SLT_VOLT_PARA_T; + + + +/* 时钟类型定义*/ +typedef enum zxic_slt_clk_type_t +{ + ZXIC_SLT_CLK_AU5327_A = (0x0U),/*SSP4 SOCKET 单板AU5327#1 HOST_100M*/ + ZXIC_SLT_CLK_AU5327_B = (0x1U),/*SSP4 SOCKET 单板AU5327#1 PLL_SYS_CLK/SERDES 156.25M*/ + ZXIC_SLT_CLK_AU5327_C = (0x2U),/*SSP4 SOCKET 单板AU5327#1 PLL_LOCAL_CLK 156.25M*/ + ZXIC_SLT_CLK_AU5327_D = (0x3U),/*SSP4 SOCKET 单板AU5327#1 PLL_TS_CLK 125M*/ + + ZXIC_SLT_CLK_TYPE_MAX, + + +}ZXIC_SLT_CLK_TYPE_T; + +typedef struct zxic_slt_clk_t +{ + + ZXIC_UINT32 value; /* 时钟拉偏值,单位HZ(PPM),1PPM = 1HZ(1MHZ=1000KHZ=1000000HZ)*/ + ZXIC_UINT32 flag; /* 正偏:0 负偏:1 */ + ZXIC_UINT32 clk_type; /* 时钟类型,参见ZXIC_SLT_CLK_TYPE_T定义 */ +}ZXIC_SLT_CLK_T; + +typedef struct zxic_slt_clk_para_t +{ + ZXIC_SLT_CLK_T *p_para; + ZXIC_UINT32 num; /* 有效拉偏时钟个数 */ +}ZXIC_SLT_CLK_PARA_T; + + + +#if ZXIC_REAL("define_for_bsp") +/***********************************************************/ +/** 功耗获取函数 +* @param ZXIC_SLT_CASE_GETPOWER_FN +* @param device_id +* @param p_para +* +* @return +* @remark 无 +* @see +* @author PJ @date 2022/04/28 +************************************************************/ +typedef ZXIC_RTN32 (*ZXIC_SLT_CASE_GETPOWER_FN)(ZXIC_UINT32 device_id, ZXIC_SLT_POWER_PARA_T *p_para); + + +/***********************************************************/ +/** riscv测试函数 +* @param ZXIC_SLT_CASE_RISCV_FN +* @param device_id +* @param reg_addr 寄存器地址 +* @param wr_data 写入寄存器的值 +* @param rd_data 期望从寄存器中读出的值 +* +* @return +* @remark 无 +* @see +* @author PJ @date 2022/04/28 +************************************************************/ +typedef ZXIC_RTN32 (*ZXIC_SLT_CASE_RISCV_FN)(ZXIC_UINT32 device_id, ZXIC_UINT32 reg_addr, ZXIC_UINT32 wr_data, ZXIC_UINT32 rd_data); + + +/***********************************************************/ +/** PCIE测试函数 +* @param ZXIC_SLT_CASE_PCIE_FN +* @param device_id +* @param times pcie建链测试次数 +* +* @return +* @remark 无 +* @see +* @author PJ @date 2022/04/28 +************************************************************/ +typedef ZXIC_RTN32 (*ZXIC_SLT_CASE_PCIE_FN)(ZXIC_UINT32 device_id, ZXIC_UINT32 times); + + +/***********************************************************/ +/** 调电压函数 +* @param ZXIC_SLT_CASE_ADJUST_VOLT_FN +* @param device_id +* @param p_para +* +* @return +* @remark 无 +* @see +* @author PJ @date 2022/04/28 +************************************************************/ +typedef ZXIC_RTN32 (*ZXIC_SLT_CASE_ADJUST_VOLT_FN)(ZXIC_UINT32 device_id,ZXIC_SLT_VOLT_PARA_T *p_para); + + +/***********************************************************/ +/** 调时钟函数 +* @param ZXIC_SLT_CASE_ADJUST_CLK_FN +* @param device_id +* @param p_para +* +* @return +* @remark 无 +* @see +* @author PJ @date 2022/04/28 +************************************************************/ +typedef ZXIC_RTN32 (*ZXIC_SLT_CASE_ADJUST_CLK_FN)(ZXIC_UINT32 device_id,ZXIC_SLT_CLK_PARA_T *p_para); + + +/*BSP回调函数定义*/ +typedef struct zxic_slt_bsp_register_fn_t +{ + ZXIC_SLT_CASE_GETPOWER_FN zxic_slt_power_fn; + ZXIC_SLT_CASE_RISCV_FN zxic_slt_riscv_fn; + ZXIC_SLT_CASE_PCIE_FN zxic_slt_pcie_fn; + ZXIC_SLT_CASE_ADJUST_VOLT_FN zxic_slt_volt_fn; + ZXIC_SLT_CASE_ADJUST_CLK_FN zxic_slt_clk_fn; + +} ZXIC_SLT_BSP_REGISTER_FN_T; + +#endif + +#if ZXIC_REAL("define_for_sdk") +/***********************************************************/ +/** 初始化函数 +* @param ZXIC_SLT_INIT_FN +* @param device_id +* @param chip_type 用于区分不同封装类型 +* @param p_init_ctrl 参见ZXIC_SLT_INIT_CTRL_T定义 +* +* @return +* @remark 无 +* @see +* @author PJ @date 2022/04/22 +************************************************************/ +typedef ZXIC_RTN32 (*ZXIC_SLT_INIT_FN)(ZXIC_UINT32 device_id,ZXIC_UINT32 chip_type,ZXIC_SLT_INIT_CTRL_T *p_init_ctrl); + + + + +/* Chip_ID 组成结构说明: +** Chip_ID = efuse里面的wafer批次号+wafer片号+x坐标+Y坐标组合而成 +** wafer批次号: 48bit lot_id5~0 +** wafer片号: 5bit wafer_no +** x坐标: 8bit x_addr +** Y坐标: 8bit y_addr +** chip_id2 = lot_id5[7:3] +** chip_id1 = lot_id5[2:0] + lot_id4 + lot_id3 + lot_id2 + lot_id1[7:3] +** chip_id0 = lot_id1[2:0] + lot_id0 + wafer_no[4:0] + x_addr + y_addr*/ + +/***********************************************************/ +/** 执行测试用例之前的预处理函数,用来获取chip_id,温度,电压信息 +* @param ZXIC_SLT_PRE_FN +* @param device_id +* @param chip_type 用于区分不同封装类型 +* @param p_chip_id 返回芯片的chip_id信息(参见上述格式说明) +* @param p_temp 返回 SLT 用例测试前初始温度 +* @param p_volt 返回 SLT 用例测试前核电压 +* +* @return +* @remark 无 +* @see +* @author PJ @date 2022/03/29 +************************************************************/ +typedef ZXIC_RTN32 (*ZXIC_SLT_PRE_FN)(ZXIC_UINT32 device_id,ZXIC_UINT32 chip_type,ZXIC_UINT32 *p_chip_id, ZXIC_DOUBLE *p_temp,ZXIC_DOUBLE *p_volt); + +/***********************************************************/ +/** 用例执行函数 +* @param ZXIC_SLT_ALL_CASE_FN +* @param device_id +* @param chip_type 用于区分不同封装类型 +* @param p_case_num 返回执行SLT 用例数 +* @param p_case_no 返回执行SLT 用例编号列表 +* @param p_case_result 返回执行SLT 用例对应结果,成功返回值或错误码 +* +* @return +* @remark 无 +* @see +* @author PJ @date 2022/03/29 +************************************************************/ +typedef ZXIC_RTN32 (*ZXIC_SLT_ALL_CASE_FN)(ZXIC_UINT32 device_id,ZXIC_UINT32 chip_type,ZXIC_UINT32 *p_case_num,ZXIC_UINT32 *p_case_no,ZXIC_UINT32 *p_case_result); + +/*SDK回调函数定义*/ +typedef struct zxic_slt_register_fn_t +{ + ZXIC_SLT_INIT_FN zxic_slt_init_fn; /* 初始化函数 */ + ZXIC_SLT_PRE_FN zxic_slt_pre_fn; /* 预处理函数 */ + ZXIC_SLT_ALL_CASE_FN zxic_slt_all_case_fn; /* 用例执行函数*/ + +} ZXIC_SLT_REGISTER_FN_T; + +#endif + + + +#if ZXIC_REAL("fn for sdk") +/***********************************************************/ +/** 回调功能注册函数,不区分芯片ID,仅注册一次即可,提供给SDK设置 +* @return +* @remark 无 +* @see +* @author PJ @date 2020/05/03 +************************************************************/ +ZXIC_RTN32 zxic_slt_register_fn_set(ZXIC_SLT_REGISTER_FN_T *pExcCall); + +/***********************************************************/ +/** 获取POWER函数 +* @param pExcCall +* +* @return +* @remark 无 +* @see +* @author PJ @date 2020/05/03 +************************************************************/ +ZXIC_RTN32 zxic_slt_callback_getpower(ZXIC_VOID *pExcCall); + +/***********************************************************/ +/** 获取MODI函数 +* @param pExcCall +* +* @return +* @remark 无 +* @see +* @author PJ @date 2020/05/03 +************************************************************/ +ZXIC_RTN32 zxic_slt_callback_riscv(ZXIC_VOID *pExcCall); + +/***********************************************************/ +/** 获PCIE函数 +* @param pExcCall +* +* @return +* @remark 无 +* @see +* @author PJ @date 2020/05/03 +************************************************************/ +ZXIC_RTN32 zxic_slt_callback_pcie(ZXIC_VOID *pExcCall); + +/***********************************************************/ +/** 获取VOLT函数 +* @param pExcCall +* +* @return +* @remark 无 +* @see +* @author PJ @date 2020/05/03 +************************************************************/ +ZXIC_RTN32 zxic_slt_callback_adjust_volt(ZXIC_VOID *pExcCall); + +/***********************************************************/ +/** 获取CLK函数 +* @param pExcCall +* +* @return +* @remark 无 +* @see +* @author PJ @date 2020/05/03 +************************************************************/ +ZXIC_RTN32 zxic_slt_callback_adjust_clk(ZXIC_VOID *pExcCall); + + +#endif + + +#if ZXIC_REAL("fn for bsp") + +/***********************************************************/ +/** 回调功能注册函数,不区分芯片ID,仅注册一次即可,提供给SDK设置 +* @return +* @remark 无 +* @see +* @author PJ @date 2020/05/03 +************************************************************/ +ZXIC_RTN32 zxic_slt_bsp_register_fn_set(ZXIC_SLT_BSP_REGISTER_FN_T *pExcCall); + + +/***********************************************************/ +/** 设置是否删除log标记,提供给BSP调用 +* @return +* @remark 无 +* @see +* @author PJ @date 2020/05/03 +************************************************************/ +ZXIC_VOID zxic_slt_log_rm_flag_set(ZXIC_UINT32 log_rm_flag); + + +/***********************************************************/ +/** 执行SDK SLT 所有用例测试,提供给BSP调用 +* @param dev_id +* @param chip_type 芯片封装类型 +* @param p_init_ctrl 详细参见ZXIC_SLT_INIT_CTRL_T说明 +* @param p_case_para 详细参见ZXIC_SLT_CASE_PARA_T说明 +* +* @return +* @remark 无 +* @see +* @author PJ @date 2022/03/29 +************************************************************/ +ZXIC_RTN32 zxic_slt_all_case_test(ZXIC_UINT32 dev_id,ZXIC_UINT32 chip_type, ZXIC_SLT_INIT_CTRL_T *p_init_ctrl,ZXIC_SLT_CASE_PARA_T *p_case_para); + +#endif + + + +#ifdef __cplusplus +} +#endif + +#endif /* end __ZXIC_SLT_H__ */ + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/Kbuild.include new file mode 100644 index 0000000..540959a --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/Kbuild.include @@ -0,0 +1,2 @@ +cur_dir := en_np/comm/source/ +src_files += $(addprefix $(cur_dir),$(notdir $(wildcard $(dinghai_root)/$(cur_dir)*.c))) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_comm_double_link.c b/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_comm_double_link.c new file mode 100644 index 0000000..9a36d06 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_comm_double_link.c @@ -0,0 +1,605 @@ +/***************************************************************************** + * 版权所有 (C)2008-2010, 深圳市中兴通讯股份有限公司。 + * + * 文件名称: zxic_comm_double_link.c + * 文件标识: + * 内容摘要: 双链表实现 + * 其它说明: + * 当前版本: V1.00.10 + * 作 者: + * 完成日期: 2012年2月14日 + * 当前责任人-1:ChenWei188471 + * 当前责任人-2: + * 历史责任人-3: + * + * 修改记录: + * 修改日期: 版 本 号 修 改 人 修改内容 + 1 20120214 V1.00.10 ChenWei188471 创建 + 2 + *****************************************************************************/ + +#include "zxic_common.h" +#include "zxic_comm_double_link.h" + +/*当前节点都插在头节点之后,新插入的节点永远在第一个*/ +ZXIC_RTN32 zxic_comm_double_link_insert_1st(D_NODE *p_newnode,D_HEAD *p_head) +{ + ZXIC_COMM_CHECK_POINT(p_newnode); + ZXIC_COMM_CHECK_POINT(p_head); + + ZXIC_COMM_CHECK_INDEX((p_head->used+1), 1, p_head->maxnum); + + ZXIC_COMM_ASSERT(!(!p_head->p_next&& p_head->p_prev)); + ZXIC_COMM_ASSERT(!(p_head->p_next && !p_head->p_prev)); + + p_newnode->next = p_head->p_next; + p_newnode->prev = NULL;/*新节点前驱为NULL*/ + + if(p_head->p_next) + { + p_head->p_next->prev = p_newnode; + } + else + { + p_head->p_prev = p_newnode; + } + + p_head->p_next = p_newnode; + p_head->used++; + + + return ZXIC_OK; +} + +/*目的是配合sort函数实现相同节点无需重复写入*/ +ZXIC_RTN32 zxic_comm_double_link_insert_cmp(D_HEAD *p_head, void* cmp_data, ZXIC_UINT32 *is_same) +{ + D_NODE *p_dn = 0; + + *is_same = 0; + + p_dn = p_head->p_next; + + while(p_dn) + { + if(*(ZXIC_UINT32*)cmp_data == *(ZXIC_UINT32*)p_dn->data) + { + *is_same = 1; + + break; + } + + p_dn = p_dn->next; + } + + return ZXIC_OK; +} + +ZXIC_RTN32 zxic_comm_double_link_insert_merge(D_NODE *p_newnode,D_HEAD *p_head,ZXIC_UINT32 is_head) +{ + D_NODE *p_dn = 0; + ZXIC_UINT32 is_same = 0; + + p_dn = p_head->p_next; + + while(p_dn) + { + if(p_dn->data == p_newnode->data) + { + is_same = 1; + break; + } + + p_dn = p_dn->next; + } + + if(! is_same ) + { + if (is_head) + { + return zxic_comm_double_link_insert_1st(p_newnode, p_head); + } + else + { + return zxic_comm_double_link_insert_last(p_newnode, p_head); + } + } + + return ZXIC_OK; + +} + +/* 在OLD节点之后插入 */ +ZXIC_RTN32 zxic_comm_double_link_insert_aft(D_NODE *p_newnode,D_NODE *p_oldnode,D_HEAD*p_head) +{ + + + ZXIC_COMM_CHECK_POINT(p_newnode); + ZXIC_COMM_CHECK_POINT(p_oldnode); + ZXIC_COMM_CHECK_POINT(p_head); + + ZXIC_COMM_CHECK_INDEX((p_head->used+1), 1, p_head->maxnum); + + ZXIC_COMM_ASSERT(!(!p_head->p_next&& p_head->p_prev)); + ZXIC_COMM_ASSERT(!(p_head->p_next && !p_head->p_prev)); + + p_newnode->next = p_oldnode->next; + p_newnode->prev = p_oldnode; + + if(p_oldnode->next) + { + p_oldnode->next->prev = p_newnode; + } + else + { + p_head->p_prev = p_newnode; + } + + p_oldnode->next = p_newnode; + p_head->used++; + + return ZXIC_OK; +} + +/* 在OLD节点前插入 */ +ZXIC_RTN32 zxic_comm_double_link_insert_pre(D_NODE *p_newnode,D_NODE *p_oldnode,D_HEAD*p_head) +{ + + ZXIC_COMM_CHECK_POINT(p_newnode); + ZXIC_COMM_CHECK_POINT(p_oldnode); + ZXIC_COMM_CHECK_POINT(p_head); + + ZXIC_COMM_CHECK_INDEX((p_head->used+1), 1, p_head->maxnum); + + ZXIC_COMM_ASSERT(!(!p_head->p_next&& p_head->p_prev)); + ZXIC_COMM_ASSERT(!(p_head->p_next && !p_head->p_prev)); + + p_newnode->next = p_oldnode; + p_newnode->prev = p_oldnode->prev; + + if(p_oldnode->prev) + { + p_oldnode->prev->next = p_newnode; + } + else + { + p_head->p_next = p_newnode; + } + + p_oldnode->prev = p_newnode; + p_head->used++; + + return ZXIC_OK; +} +ZXIC_RTN32 zxic_comm_double_link_insert_last(D_NODE *p_newnode,D_HEAD* p_head) +{ + D_NODE *p_dnode = NULL; + + ZXIC_COMM_CHECK_POINT(p_newnode); + ZXIC_COMM_CHECK_POINT(p_head); + + ZXIC_COMM_CHECK_INDEX((p_head->used+1), 1, p_head->maxnum); + + ZXIC_COMM_ASSERT(!(!p_head->p_next&& p_head->p_prev)); + ZXIC_COMM_ASSERT(!(p_head->p_next && !p_head->p_prev)); + + + p_dnode = p_head->p_prev; + + + if(!p_dnode) + { + p_head->p_next = p_newnode; + p_head->p_prev = p_newnode; + p_newnode->next = NULL; + p_newnode->prev = NULL; + } + else + { + p_newnode->prev = p_dnode; + p_newnode->next = NULL; + p_head->p_prev = p_newnode; + p_dnode->next = p_newnode; + } + + p_head->used++; + + return ZXIC_OK; +} +ZXIC_RTN32 zxic_comm_double_link_del(D_NODE *delnode,D_HEAD *p_head) +{ + D_NODE *next = NULL; + D_NODE *pre = NULL; + + ZXIC_COMM_CHECK_POINT(delnode); + ZXIC_COMM_CHECK_POINT(p_head); + + ZXIC_COMM_CHECK_INDEX(p_head->used, 1, p_head->maxnum); + + next = delnode->next; + pre = delnode->prev; + + if(next) + { + next->prev = delnode->prev; + } + else + { + p_head->p_prev= delnode->prev; + } + + if(pre) + { + pre->next = delnode->next; + } + else + { + p_head->p_next = delnode->next; + } + + p_head->used--; + delnode->next = NULL; + delnode->prev = NULL; + return ZXIC_OK; +} + + +ZXIC_RTN32 zxic_comm_double_link_init(ZXIC_UINT32 elmemtnum,D_HEAD *p_head) +{ + ZXIC_UINT32 err_code = 0; + + + ZXIC_COMM_CHECK_POINT(p_head); + + if(elmemtnum == 0 ) + { + err_code = ZXIC_DOUBLE_LINK_INIT_ELEMENT_NUM_ERR; + ZXIC_COMM_TRACE_ERROR("\nError:[0x%x] zxic_doule_link_init Element Num Err !",err_code); + return err_code; + } + + p_head->maxnum = elmemtnum; + p_head->used = 0; + p_head->p_next = NULL; + p_head->p_prev = NULL; + + return ZXIC_OK; +} + +ZXIC_RTN32 zxic_comm_dlink_release(D_HEAD *p_head,fun_free fun) +{ + ZXIC_UINT32 rc = 0; + D_NODE *p_node = NULL; + + ZXIC_COMM_CHECK_POINT(p_head); + + while(p_head->used) + { + p_node = p_head->p_next; + + if(NULL != fun) + { + rc = fun(p_node->data); + ZXIC_COMM_CHECK_RC(rc, "fun"); + } + + rc = zxic_comm_double_link_del(p_node,p_head); + ZXIC_COMM_CHECK_RC(rc, "zxic_comm_double_link_del"); + + ZXIC_COMM_FREE(p_node); + } + + return ZXIC_OK; +} +/*connetc the s_list to d_list */ + +ZXIC_RTN32 zxic_comm_double_link_merge_list(D_HEAD *d_list,D_HEAD *s_list) +{ + if(d_list->p_prev) + { + d_list->p_prev->next = s_list->p_next; + } + else + { + ZXIC_COMM_ASSERT(!d_list->p_next); + d_list->p_next = s_list->p_next; + } + + if(s_list->p_next) + { + ZXIC_COMM_ASSERT(s_list->p_prev); + s_list->p_next->prev = d_list->p_prev; + d_list->p_prev = s_list->p_prev; + } + + d_list->used += s_list->used; + + return ZXIC_OK; +} +/********************************************************************* + * 函数名称:zxic_comm_double_link_insert_sort + * 功能描述: + * 函数功能简介 + * 插入排序, + * 输入参数: + * 输出参数: + * 返 回 值:ZXIC_RTN32 + * 全局变量: + * 注 释: +============================================================ + * 修改记录: + * 修改日期 版本号 修改人 修改内容 +============================================================ + * 2012-03-19 jiangwenming + + ******************************************************************/ +ZXIC_RTN32 zxic_comm_double_link_insert_sort(D_NODE *p_newnode,D_HEAD *p_head,CMP_FUNC cmp_fuc,void* cmp_data) +{ + D_NODE* pre_node = NULL; + + ZXIC_COMM_CHECK_POINT(p_head); + ZXIC_COMM_CHECK_POINT(p_newnode); + + if(NULL == cmp_fuc ) + { + cmp_fuc = zxic_comm_double_link_default_cmp_fuc; + } + + ZXIC_COMM_CHECK_INDEX((p_head->used+1), 1, p_head->maxnum); + + /*此时表中的数据,已经排序了,再插入时,只需从表头开始比较,然后插入适当位置*/ + if( 0 == p_head->used ) + { + return zxic_comm_double_link_insert_1st(p_newnode,p_head); + } + else + { + pre_node = p_head->p_next; + + while(NULL!=pre_node) + { + /*新节点的键值小于等于当前的键值*/ + if(cmp_fuc(p_newnode,pre_node,cmp_data) <= 0) + { + return zxic_comm_double_link_insert_pre(p_newnode,pre_node,p_head); + } + else + { + pre_node = pre_node->next; + } + } + + /*循环结束后,说明插入的节点大于链表中的所有节点,需要在尾部插入*/ + return zxic_comm_double_link_insert_last(p_newnode,p_head); + } +} + + +/********************************************************************* + * 函数名称:zxic_comm_double_link_del_pos + * 功能描述: + * 函数功能简介 + * 根据node中指定的信息删除节点 + * 输入参数: + * 输出参数: + * 返 回 值:ZXIC_RTN32 + * 全局变量: + * 注 释: 根据指定的信息,可能会删除多个 +============================================================ + * 修改记录: + * 修改日期 版本号 修改人 修改内容 +============================================================ + * 2020-11-11 徐晨曦 + + ******************************************************************/ +ZXIC_RTN32 zxic_comm_double_link_del_by_info(D_HEAD *p_head, void* cmp_data, CMP_FUNC cmp_fuc, ZXIC_UINT32 *p_deled_num) +{ + ZXIC_UINT32 rc = 0; + ZXIC_UINT32 is_same = 0; + + D_NODE *p; + D_NODE *p_cur_node = ZXIC_NULL; + + if(NULL == cmp_fuc ) + { + cmp_fuc = zxic_comm_double_link_default_cmp_fuc; + } + + p = p_head->p_next; + + while(p) + { + /*新节点的键值等于当前的键值*/ + if(cmp_fuc(cmp_data, p,cmp_data) == 0) + { + rc = zxic_comm_double_link_del(p, p_head); + ZXIC_COMM_CHECK_RC(rc, "zxic_comm_double_link_del"); + + p_cur_node = p; + p = p->next; + + ZXIC_COMM_FREE(p_cur_node); + is_same ++; + continue; + } + + p = p->next; + } + + if(0 == is_same) + { + return ZXIC_ERR; + } + + *p_deled_num = is_same; + + ZXIC_COMM_TRACE_DEBUG(" DOUBLE LINK DEL NUM %d \n", is_same); + + return ZXIC_OK; +} + +/********************************************************************* + * 函数名称:zxic_comm_double_link_del_pos + * 功能描述: + * 函数功能简介 + * 删除指定位置的数据 + * 输入参数: + * 输出参数: + * 返 回 值:ZXIC_RTN32 + * 全局变量: + * 注 释: +============================================================ + * 修改记录: + * 修改日期 版本号 修改人 修改内容 +============================================================ + * 2012-03-19 jiangwenming + + ******************************************************************/ +ZXIC_RTN32 zxic_comm_double_link_del_pos(D_HEAD *p_head,void* cmp_data,fun_free fun) +{ + ZXIC_UINT32 rc = 0; + ZXIC_UINT32 is_same = 0; + + D_NODE *p; + + p = p_head->p_next; + + while(p) + { + if(*(ZXIC_UINT32*)cmp_data == *(ZXIC_UINT32*)p->data) + { + is_same = 1; + + break; + } + + p = p->next; + } + + if(is_same) + { + rc = zxic_comm_double_link_del(p, p_head); + ZXIC_COMM_CHECK_RC(rc, "zxic_comm_double_link_del"); + + if(NULL != fun) + { + rc = fun(p->data); + ZXIC_COMM_CHECK_RC(rc, "fun"); + } + + ZXIC_COMM_FREE(p); + } + + return ZXIC_OK; +} + +/********************************************************************* + * 函数名称:zxic_comm_double_link_swap + * 功能描述: + * 函数功能简介 + * 交换链表中的两个节点 + * 输入参数: + * 输出参数: + * 返 回 值:ZXIC_RTN32 + * 全局变量: + * 注 释: +============================================================ + * 修改记录: + * 修改日期 版本号 修改人 修改内容 +============================================================ + * 2012-03-19 jiangwenming + + ******************************************************************/ +ZXIC_RTN32 zxic_comm_double_link_print(D_HEAD *p_head) +{ + + D_NODE *p_pre = NULL; + D_NODE *p_next = NULL; + + ZXIC_COMM_CHECK_POINT(p_head); + /*正向打印*/ + p_next = p_head->p_next; + ZXIC_COMM_PRINT("*************sequ order***********\n"); + + while(p_next) + { + ZXIC_COMM_PRINT("==>%d",*(ZXIC_UINT32*)(p_next->data)); + p_next=p_next->next; + } + + /*反向打印*/ + ZXIC_COMM_PRINT("\n\n*************reverve order***********\n"); + p_pre=p_head->p_prev; + + while(p_pre != NULL) + { + ZXIC_COMM_PRINT("==>%d",*(ZXIC_UINT32*)(p_pre->data)); + p_pre = p_pre->prev; + } + + return ZXIC_OK; + +} + +ZXIC_SINT32 zxic_comm_double_link_default_cmp_fuc(D_NODE* p_data1,D_NODE* p_data2,void* p_data) +{ + ZXIC_UINT32 data1= *(ZXIC_UINT32*)p_data1->data; + ZXIC_UINT32 data2= *(ZXIC_UINT32*)p_data2->data; + + if(data1>data2) + { + return 1; + } + else if(data1==data2) + { + return 0; + } + else + { + return -1; + } +} + +ZXIC_RTN32 zxic_comm_double_link_del_by_data(D_HEAD *p_head,ZXIC_VOID* cmp_data,fun_free fun) +{ + ZXIC_UINT32 rc = 0; + ZXIC_UINT32 is_same = 0; + + D_NODE *p; + + p = p_head->p_next; + + while(p) + { + if(cmp_data == p->data) + { + is_same = 1; + + break; + } + p = p->next; + } + + if(is_same) + { + rc = zxic_comm_double_link_del(p,p_head); + ZXIC_COMM_CHECK_RC(rc, "zxic_comm_double_link_del"); + if(NULL != fun) + { + rc = fun(p->data); + ZXIC_COMM_CHECK_RC(rc, "fun"); + } + + ZXIC_COMM_FREE(p); + } + else + { + ZXIC_COMM_TRACE_ERROR("\nError:data not exist. FUNCTION : %s!\n", __FUNCTION__); + } + + return ZXIC_OK; +} + + + + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_comm_index_fill.c b/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_comm_index_fill.c new file mode 100644 index 0000000..c3d1da4 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_comm_index_fill.c @@ -0,0 +1,420 @@ +/***************************************************************************** + * 版权所有 (C)2001-2015, 深圳市中兴通讯股份有限公司。 + * + * 文件名称: zxic_index_fill.c + * 文件标识: + * 内容摘要: 索引空位填充源代码头文件 + * 其它说明: + * 当前版本: + * 作 者: ChenWei10088471 + * 完成日期: + * 当前责任人-1: + * 当前责任人-2: + * + * DEPARTMENT : ASIC_FPGA_R&D_Dept + * MANUAL_PERCENT : 100% + *****************************************************************************/ +#include "zxic_common.h" +#include "zxic_comm_index_fill.h" +#include "zxic_comm_double_link.h" + +/***********************************************************/ +/** 释放数据节点 +* @param p_data +* +* @return +* @remark 无 +* @see +* @author ChenWei10088471 @date 2014/02/07 +************************************************************/ +ZXIC_RTN32 ic_comm_node_data_free(void *p_data) +{ + ZXIC_COMM_CHECK_POINT(p_data); + ZXIC_COMM_FREE(p_data); + + return ZXIC_OK; +} + +ZXIC_RTN32 zxic_comm_indexfill_init(INDEX_FILL_CFG *p_fill_cfg,ZXIC_UINT32 index_num,ZXIC_KEY_CMP_FUNC p_cmp_fun,INDEXFILL_SWAP_FUNC p_swap_fun,ZXIC_UINT32 key_len) +{ + ZXIC_UINT32 rtn = 0; + + p_fill_cfg->index_num = index_num; + p_fill_cfg->total_used = 0; + p_fill_cfg->swap_fun = p_swap_fun; + + rtn = zxic_comm_rb_init(&p_fill_cfg->fill_rb,0,key_len,p_cmp_fun); + ZXIC_COMM_CHECK_RC(rtn,"zxic_comm_rb_init"); + + return ZXIC_OK; +} +/* 前向挤压 */ +ZXIC_RTN32 zxic_comm_indexfill_handle_position_right(INDEX_FILL_CFG *p_fill_cfg,INDEX_FILL_NODE* p_start,INDEX_FILL_NODE* p_end) +{ + ZXIC_UINT32 rtn = 0; + + INDEX_FILL_NODE *p_cur_node = p_start; + INDEX_FILL_NODE *p_nxt_node = (INDEX_FILL_NODE *)STRUCT_ENTRY_POINT(p_cur_node->rb_node.tn_ln.next,ZXIC_RB_TN,tn_ln); + INDEX_FILL_NODE *p_pre_node = NULL; + + while(p_cur_node != p_end) + { + if(ICMINF_GET_NODE_LASTPOS(p_cur_node) + 1 < ICMINF_GET_NODE_FSTPOS(p_nxt_node)) + { + break; + } + else + { + p_cur_node = p_nxt_node; + + if(p_cur_node->rb_node.tn_ln.next) + { + p_nxt_node = (INDEX_FILL_NODE *)STRUCT_ENTRY_POINT(p_cur_node->rb_node.tn_ln.next,ZXIC_RB_TN,tn_ln); + } + } + } + + ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW(p_fill_cfg->index_num, 1); + if(p_cur_node == p_end && p_fill_cfg->index_num - 1 == ICMINF_GET_NODE_LASTPOS(p_end)) + { + return ZXIC_INDEX_FILL_FULL; + } + + p_pre_node = (INDEX_FILL_NODE *)STRUCT_ENTRY_POINT(p_cur_node->rb_node.tn_ln.prev,ZXIC_RB_TN,tn_ln); + + while(p_cur_node != p_start) + { + if(p_fill_cfg->swap_fun) + { + rtn = p_fill_cfg->swap_fun(ICMINF_GET_NODE_FSTPOS(p_cur_node),ICMINF_GET_NODE_LASTPOS(p_cur_node) + 1,p_fill_cfg); + } + + ICMINF_GET_NODE_FSTPOS(p_cur_node) = ICMINF_GET_NODE_FSTPOS(p_cur_node) + 1; + + p_cur_node = p_pre_node; + + if(p_cur_node->rb_node.tn_ln.prev) + { + p_pre_node = (INDEX_FILL_NODE *)STRUCT_ENTRY_POINT(p_cur_node->rb_node.tn_ln.prev,ZXIC_RB_TN,tn_ln); + } + } + + if(p_fill_cfg->swap_fun) + { + rtn = p_fill_cfg->swap_fun(ICMINF_GET_NODE_FSTPOS(p_start),ICMINF_GET_NODE_LASTPOS(p_start)+1,p_fill_cfg); + } + + ICMINF_GET_NODE_FSTPOS(p_start) = ICMINF_GET_NODE_FSTPOS(p_start) + 1; + + return rtn; +} +/* 后向挤压 */ +ZXIC_RTN32 zxic_comm_indexfill_handle_position_left(INDEX_FILL_CFG *p_fill_cfg,INDEX_FILL_NODE* p_start,INDEX_FILL_NODE* p_end) +{ + ZXIC_UINT32 rtn = 0; + + INDEX_FILL_NODE *p_cur_node = p_start; + INDEX_FILL_NODE *p_nxt_node = (INDEX_FILL_NODE *)STRUCT_ENTRY_POINT(p_cur_node->rb_node.tn_ln.prev,ZXIC_RB_TN,tn_ln); + INDEX_FILL_NODE *p_pre_node = NULL; + + while(p_cur_node != p_end) + { + ZXIC_COMM_CHECK_POINT(p_nxt_node); + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW(p_nxt_node->position, p_nxt_node->usednum); + ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW((p_nxt_node->position + p_nxt_node->usednum), 1); + + if(ICMINF_GET_NODE_FSTPOS(p_cur_node) -1 > ICMINF_GET_NODE_LASTPOS(p_nxt_node)) + { + break; + } + else + { + p_cur_node = p_nxt_node; + + if(p_cur_node->rb_node.tn_ln.prev) + { + p_nxt_node = (INDEX_FILL_NODE *)STRUCT_ENTRY_POINT(p_cur_node->rb_node.tn_ln.prev,ZXIC_RB_TN,tn_ln); + } + } + } + + if(p_cur_node == p_end && 0 == ICMINF_GET_NODE_FSTPOS(p_end)) + { + return ZXIC_INDEX_FILL_FULL; + } + + p_pre_node = (INDEX_FILL_NODE *)STRUCT_ENTRY_POINT(p_cur_node->rb_node.tn_ln.next,ZXIC_RB_TN,tn_ln); + + while(p_cur_node != p_start) + { + if(p_fill_cfg->swap_fun)/*将最后一个移动到本节点第一个*/ + { + rtn = p_fill_cfg->swap_fun(ICMINF_GET_NODE_LASTPOS(p_cur_node),ICMINF_GET_NODE_FSTPOS(p_cur_node)-1,p_fill_cfg); + + } + + ICMINF_GET_NODE_FSTPOS(p_cur_node) = ICMINF_GET_NODE_FSTPOS(p_cur_node)-1; + + p_cur_node = p_pre_node; + + if(p_cur_node->rb_node.tn_ln.next) + { + p_pre_node = (INDEX_FILL_NODE *)STRUCT_ENTRY_POINT(p_cur_node->rb_node.tn_ln.next,ZXIC_RB_TN,tn_ln); + } + } + + if(p_fill_cfg->swap_fun) + { + rtn = p_fill_cfg->swap_fun(ICMINF_GET_NODE_LASTPOS(p_start),ICMINF_GET_NODE_FSTPOS(p_start)-1,p_fill_cfg); + } + + ICMINF_GET_NODE_FSTPOS(p_start) = ICMINF_GET_NODE_FSTPOS(p_start) -1; + + return rtn; +} + +ZXIC_RTN32 zxic_comm_indexfill_free(INDEX_FILL_CFG *p_fill_cfg,ZXIC_UINT32 free_index,ZXIC_VOID* p_rb_key,ZXIC_UINT32 *out_index) +{ + ZXIC_UINT32 rtn = 0; + ZXIC_RB_TN *p_rb_out = NULL; + INDEX_FILL_NODE *p_inf_node = NULL; + + rtn = zxic_comm_rb_search(&p_fill_cfg->fill_rb, p_rb_key, &p_rb_out); + + if ((!p_rb_out)||(rtn!=ZXIC_OK) ) + { + ZXIC_COMM_TRACE_ERROR("\n srh fail ,the key is not exist"); + return ZXIC_INDEX_DEL_FAIL; + } + + p_inf_node = (INDEX_FILL_NODE *)p_rb_out; + + ZXIC_COMM_ASSERT(p_inf_node->usednum); + + ZXIC_COMM_CHECK_INDEX(free_index,ICMINF_GET_NODE_FSTPOS(p_inf_node),ICMINF_GET_NODE_LASTPOS(p_inf_node)); + + *out_index = free_index; + + if(free_index == ICMINF_GET_NODE_FSTPOS(p_inf_node)) + { + p_inf_node->position++; + } + else if(free_index != ICMINF_GET_NODE_LASTPOS(p_inf_node)) + { + *out_index = ICMINF_GET_NODE_FSTPOS(p_inf_node); + + if(p_fill_cfg->swap_fun) + { + p_fill_cfg->swap_fun(ICMINF_GET_NODE_FSTPOS(p_inf_node), free_index, p_fill_cfg); + } + + p_inf_node->position++; + } + else + { + ZXIC_COMM_TRACE_DEBUG("\n Free the last position,do nothing \n"); + } + + p_inf_node->usednum--; + + if(p_inf_node->usednum == 0) + { + rtn = zxic_comm_rb_delete(&p_fill_cfg->fill_rb,p_rb_key,&p_rb_out); + ZXIC_COMM_CHECK_RC(rtn,"zxic_comm_rb_delete"); + + if(!p_rb_out) + { + ZXIC_COMM_TRACE_ERROR("\n srh fail ,the key is not exist"); + return ZXIC_INDEX_DEL_FAIL; + } + + ZXIC_COMM_FREE(p_inf_node->rb_node.p_key); + + ZXIC_COMM_FREE(p_inf_node); + } + else + { + /*ICMINF_GET_NODE_FSTPOS(p_inf_node) = ICMINF_GET_NODE_FSTPOS(p_inf_node)-1;*/ + } + + ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW(p_fill_cfg->total_used, 1); + p_fill_cfg->total_used--; + + return ZXIC_OK; +} + +ZXIC_RTN32 zxic_comm_indexfill_destroy(INDEX_FILL_CFG *p_fill_cfg) +{ + ZXIC_UINT32 rtn = 0; + + rtn = zxic_comm_dlink_release(&p_fill_cfg->fill_rb.tn_list,ic_comm_node_data_free); + ZXIC_COMM_CHECK_RC(rtn,"zxic_comm_dlink_release"); + + ZXIC_COMM_MEMSET(p_fill_cfg,0,ZXIC_SIZEOF(INDEX_FILL_CFG)); + + return ZXIC_OK; +} + +ZXIC_RTN32 zxic_comm_indexfill_show_all_position(INDEX_FILL_CFG *p_fill_cfg) +{ + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + D_NODE *p_node = NULL; + INDEX_FILL_NODE *p_inf_node = NULL; + + p_node = p_fill_cfg->fill_rb.tn_list.p_next; + + ZXIC_COMM_PRINT("\n *************************Used Position*************************\n"); + + while(p_node) + { + ZXIC_COMM_PRINT("\n ==== Num [%d ] ==== :",i); + + p_inf_node = (INDEX_FILL_NODE *)(STRUCT_ENTRY_POINT(p_node,ZXIC_RB_TN,tn_ln)); + + for(j = 0 ;j < p_inf_node->usednum;j++) + { + ZXIC_COMM_PRINT(" %d ",ICMINF_GET_NODE_FSTPOS(p_inf_node)+ j); + + if (j != 0 && j % 8 == 0) + { + ZXIC_COMM_PRINT("\n "); + } + } + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW(i, 1); + i++; + + p_node = p_node->next; + } + + ZXIC_COMM_PRINT("\n*******End*******\n"); + + return ZXIC_OK; + +} + +ZXIC_RTN32 zxic_comm_indexfill_store(INDEX_FILL_CFG *p_fill_cfg, ZXIC_UINT32 *p_size, ZXIC_UINT8 **p_data_buff) +{ + ZXIC_UINT32 rtn = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 used_node_num = 0; + ZXIC_UINT32 rb_node_size = 0; + ZXIC_UINT32 max_index_num = 0; + ZXIC_UINT32 buff_offset = 0; + ZXIC_UINT32 tmp_val = 0; + D_NODE *p_node = NULL; + INDEX_FILL_NODE *p_inf_node = NULL; + ZXIC_UINT8 *p_item_buff = NULL; + ZXIC_UINT32 item_buff_offset = 0; + /* + | used_node_num | rb_node_size | max_index_num |//head + | node_start_index | node_used_num | rb_key ... ... |//item + */ + + ZXIC_COMM_CHECK_POINT(p_fill_cfg); + ZXIC_COMM_CHECK_POINT(p_size); + //item size + rb_node_size = p_fill_cfg->fill_rb.key_size + 8;/*sizeof(ZXIC_UINT32) + sizeof(ZXIC_UINT32);*/ + max_index_num = p_fill_cfg->index_num; + + p_node = p_fill_cfg->fill_rb.tn_list.p_next; + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW(used_node_num, 1); + while(p_node) + { + //p_inf_node = (INDEX_FILL_NODE *)(STRUCT_ENTRY_POINT(p_node,ZXIC_RB_TN,tn_ln)); + used_node_num++; + p_node = p_node->next; + } + tmp_val = ZXIC_SIZEOF(ZXIC_UINT32) * 3; + ZXIC_COMM_CHECK_INDEX_MUL_OVERFLOW(rb_node_size, used_node_num); + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW(tmp_val, rb_node_size * used_node_num); + *p_size = tmp_val + rb_node_size * used_node_num; + + *p_data_buff = (ZXIC_UINT8 *)ZXIC_COMM_MALLOC(*p_size); + ZXIC_COMM_CHECK_POINT(*p_data_buff); + ZXIC_COMM_MEMSET(*p_data_buff, 0, *p_size); + + buff_offset = 0; + + ZXIC_COMM_MEMCPY_S(*p_data_buff + buff_offset, ZXIC_SIZEOF(ZXIC_UINT32), &used_node_num, ZXIC_SIZEOF(ZXIC_UINT32)); + buff_offset += ZXIC_SIZEOF(ZXIC_UINT32); + ZXIC_COMM_MEMCPY_S(*p_data_buff + buff_offset, ZXIC_SIZEOF(ZXIC_UINT32), &rb_node_size, ZXIC_SIZEOF(ZXIC_UINT32)); + buff_offset += ZXIC_SIZEOF(ZXIC_UINT32); + ZXIC_COMM_MEMCPY_S(*p_data_buff + buff_offset, ZXIC_SIZEOF(ZXIC_UINT32), &max_index_num, ZXIC_SIZEOF(ZXIC_UINT32)); + buff_offset += ZXIC_SIZEOF(ZXIC_UINT32); + + p_item_buff = (ZXIC_UINT8 *)ZXIC_COMM_MALLOC(rb_node_size); + ZXIC_COMM_CHECK_POINT(p_item_buff); + ZXIC_COMM_MEMSET(p_item_buff, 0, rb_node_size); + + for(i = 0; i < used_node_num; i++) + { + if(0 == i) + { + p_node = p_fill_cfg->fill_rb.tn_list.p_next; + ZXIC_COMM_CHECK_POINT_MEMORY_FREE(p_node, p_item_buff); + } + else + { + p_node = p_node->next; + ZXIC_COMM_CHECK_POINT_MEMORY_FREE(p_node, p_item_buff); + } + item_buff_offset = 0; + + p_inf_node = (INDEX_FILL_NODE *)(STRUCT_ENTRY_POINT(p_node,ZXIC_RB_TN,tn_ln)); + + ZXIC_COMM_MEMCPY_S(p_item_buff + item_buff_offset, ZXIC_SIZEOF(ZXIC_UINT32), &(p_inf_node->position), ZXIC_SIZEOF(ZXIC_UINT32)); + item_buff_offset += ZXIC_SIZEOF(ZXIC_UINT32); + ZXIC_COMM_MEMCPY_S(p_item_buff + item_buff_offset, ZXIC_SIZEOF(ZXIC_UINT32), &(p_inf_node->usednum), ZXIC_SIZEOF(ZXIC_UINT32)); + item_buff_offset += ZXIC_SIZEOF(ZXIC_UINT32); + ZXIC_COMM_MEMCPY_S(p_item_buff + item_buff_offset, p_fill_cfg->fill_rb.key_size, p_inf_node->rb_node.p_key, p_fill_cfg->fill_rb.key_size); + + ZXIC_COMM_MEMCPY_S(*p_data_buff + buff_offset, rb_node_size, p_item_buff, rb_node_size); + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_MEMORY_FREE(buff_offset, rb_node_size, p_item_buff); + buff_offset += rb_node_size; + } + + ZXIC_COMM_ASSERT(buff_offset == *p_size); + + ZXIC_COMM_FREE(p_item_buff); + + return rtn; +} + +ZXIC_RTN32 zxic_comm_indexfill_clear(INDEX_FILL_CFG *p_fill_cfg) +{ + ZXIC_UINT32 rtn = 0; + ZXIC_UINT32 key_len = p_fill_cfg->fill_rb.key_size; + ZXIC_KEY_CMP_FUNC p_cmp_fun = p_fill_cfg->fill_rb.p_cmpfun; + INDEX_FILL_NODE *fill_node; + D_NODE *p_curnode = NULL; + void *cur_data; + p_curnode = p_fill_cfg->fill_rb.tn_list.p_next; + + while(p_curnode) + { + cur_data = p_curnode->data; + p_curnode = p_curnode->next; + fill_node = cur_data; + ZXIC_COMM_FREE(fill_node->rb_node.p_key); + ZXIC_COMM_FREE(fill_node); + + } + + rtn = zxic_comm_rb_destroy(&p_fill_cfg->fill_rb); + ZXIC_COMM_CHECK_RC(rtn, "zxic_comm_rb_destroy"); + + rtn = zxic_comm_rb_init(&p_fill_cfg->fill_rb, 0, key_len, p_cmp_fun); + ZXIC_COMM_CHECK_RC(rtn, "zxic_comm_rb_init"); + + + p_fill_cfg->total_used = 0; + + + return ZXIC_OK; +} + + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_comm_liststack.c b/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_comm_liststack.c new file mode 100644 index 0000000..ae40a07 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_comm_liststack.c @@ -0,0 +1,431 @@ +/***************************************************************************** + * 版权所有 (C)2001-2006, 深圳市中兴通讯股份有限公司。 + * + * 文件名称: Rtm_ListStack.c + * 文件标识: + * 内容摘要: 链表栈管理文件 + + * 其它说明: 链表栈的管理方式,后进先出,释放的元素挂到队头 + + * 当前版本: ZXR10 V2.6 + * 作 者: 郑纪伟 + * 完成日期: 2006-9-27 10:34 + * 当前责任人-1: + * 当前责任人-2: + * + * 修改记录1: + * 修改日期:2006-9-27 10:34 + * 版 本 号:ZXR10 V2.6 + * 修 改 人:郑纪伟 + * 修改内容:创建 + * + * 修改记录2: + * 文件名称:ftmcomm_liststack.c + * 修改日期:2008-10-16 15:08 + * 版 本 号:ZXR10 V2.6 + * 修 改 人:HuangHe 170389 + * 修改内容:移植到T8000项目使用 + * + *修改记录3: + * 修改文件名称:zxic_liststack.c + * 修改日期:2012-03-15 15:14 + * 版 本 号:ZXR10 V2.6 + * 修 改 人:JiangWenming 12010401 + * 修改内容:移植到NSE项目使用 + * + *****************************************************************************/ +#include "zxic_common.h" + + +ZXIC_RTN32 zxic_comm_liststack_creat(ZXIC_UINT32 element_num, ZXIC_LISTSTACK_MANGER** p_list) +{ + ZXIC_LISTSTACK_MANGER* p_local_list = NULL; + ZXIC_UINT32 dw_list_size = 0; + ZXIC_UINT32 dw_manage_size = 0; + ZXIC_UINT32 dw_actual_element_num = 0; + ZXIC_UINT32 i = 0; + + /*611002174859 zj068187 检查双重指针*/ + if (NULL == p_list) + { + ZXIC_COMM_PRINT("\n p_list is NULL!\n"); + return ZXIC_LIST_STACK_POINT_NULL; + + } + if(element_num <= 0) + { + *p_list = NULL; + ZXIC_COMM_PRINT( "\n FtmComm_ListStackCreat_dwElementNum <=0"); + return ZXIC_LIST_STACK_ELEMENT_NUM_ERR; + + } + + if(element_num>LISTSTACK_MAX_ELEMENT-1) + { + dw_actual_element_num = LISTSTACK_MAX_ELEMENT; + } + else + { + dw_actual_element_num = element_num + 1; /*10124041 index from 0*/ + } + + + + dw_list_size = (dw_actual_element_num * ZXIC_SIZEOF(ZXIC_COMM_FREELINK))&0xffffffff; + dw_manage_size = (ZXIC_SIZEOF(ZXIC_LISTSTACK_MANGER) + dw_list_size)&0xffffffff; + + p_local_list = (ZXIC_LISTSTACK_MANGER*)ZXIC_COMM_MALLOC(dw_manage_size); + + if(p_local_list == NULL) + { + *p_list = NULL; + ZXIC_COMM_PRINT( "\n zxic_comm_liststack_creat Fail \n"); + return ZXIC_LIST_STACK_ALLOC_MEMORY_FAIL; + + } + + ZXIC_COMM_MEMSET(p_local_list,0,dw_manage_size); + + p_local_list->p_array = (ZXIC_COMM_FREELINK*)((ZXIC_UINT8 *)p_local_list+ZXIC_SIZEOF(ZXIC_LISTSTACK_MANGER)); + + p_local_list->capacity = dw_actual_element_num; + p_local_list->free_num = dw_actual_element_num - 1; /* for index = 0 is reserved */ + p_local_list->used_num = 0; + + for(i=1; i<(dw_actual_element_num-1); i++) + { + p_local_list->p_array[i].index = i; + p_local_list->p_array[i].next = i+1; + } + + p_local_list->p_array[0].index = 0; + p_local_list->p_array[0].next = 0; + + p_local_list->p_array[dw_actual_element_num-1].index = dw_actual_element_num-1; + p_local_list->p_array[dw_actual_element_num-1].next = 0xffffffff; + + p_local_list->p_head = p_local_list->p_array[1].index; + + *p_list = p_local_list; + + return ZXIC_OK; + +} + + +ZXIC_RTN32 zxic_comm_liststack_alloc (ZXIC_LISTSTACK_MANGER* p_list,ZXIC_UINT32 *p_index) +{ + ZXIC_UINT32 dw_alloc_index = 0; + ZXIC_UINT32 dw_next_free = 0; + + if(p_list == NULL) + { + *p_index = LISTSTACK_INVALID_INDEX; + ZXIC_COMM_PRINT("\n zxic_comm_liststack_alloc! ERROR LINE:%d\n ",__LINE__); + return ZXIC_LIST_STACK_POINT_NULL; + + } + + if((p_list->p_head) == LISTSTACK_INVALID_INDEX) + { + *p_index = LISTSTACK_INVALID_INDEX; + + /*ZXIC_COMM_PRINT("\n zxic_comm_liststack_alloc is full! LINE:%d\n ",__LINE__);*/ + return ZXIC_LIST_STACK_ISEMPTY_ERR; + + } + + dw_alloc_index = p_list->p_head; + + dw_next_free = p_list->p_array[dw_alloc_index].next; + p_list->p_array[dw_alloc_index].next = LISTSTACK_INVALID_INDEX; + + if(dw_next_free != 0xffffffff) /* ZXIC_UINT32 - 1 为0xffffffff*/ + { + p_list->p_head = p_list->p_array[dw_next_free].index; + } + else + { + p_list->p_head = LISTSTACK_INVALID_INDEX; + } + + *p_index = dw_alloc_index - 1; /*减1是为了使索引从0开始分配*/ + + p_list->free_num--; + p_list->used_num++; + + /*分配一个条目后,判断队列是否变为空,若变为空,则头指向无效索引*/ + if((p_list->free_num == 0) || (p_list->used_num == (p_list->capacity-1))) + { + /*ZXIC_COMM_PRINT("\n zxic_comm_liststack_alloc! ERROR LINE:%d\n ",__LINE__);*/ + p_list->p_head = LISTSTACK_INVALID_INDEX; + } + + return ZXIC_OK; + +} + +ZXIC_RTN32 zxic_comm_liststack_free (ZXIC_LISTSTACK_MANGER* p_list,ZXIC_UINT32 index) +{ + ZXIC_UINT32 dw_free_index = 0; + ZXIC_UINT32 dw_prev_free = 0; + ZXIC_UINT32 dw_index = 0; + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW(index, 1); + dw_index = index + 1; /*加1是为了使索引从0开始分配*/ + + if(p_list == NULL) + { + + ZXIC_COMM_PRINT("\n zxic_comm_liststack_free is null! LINE:%d\n ",__LINE__); + return ZXIC_LIST_STACK_POINT_NULL; + } + + + + if (dw_index >= p_list->capacity) + { + + ZXIC_COMM_PRINT("\n zxic_comm_liststack_free is null! LINE:%d\n ",__LINE__); + return ZXIC_LIST_STACK_FREE_INDEX_INVALID; + + } + + if(p_list->p_array[dw_index].next != LISTSTACK_INVALID_INDEX) + { + return ZXIC_OK; + } + + dw_free_index = dw_index; + dw_prev_free = p_list->p_head; + + if(dw_prev_free != 0) + { + p_list->p_array[dw_free_index].next = p_list->p_array[dw_prev_free].index; + } + else + { + p_list->p_array[dw_free_index].next = 0xffffffff; + } + + /* 释放的元素挂到队头*/ + p_list->p_head = p_list->p_array[dw_free_index].index; + + p_list->free_num++; + p_list->used_num--; + + return ZXIC_OK; + +} + +ZXIC_RTN32 zxic_comm_liststack_alloc_spec_index(ZXIC_LISTSTACK_MANGER* p_list, ZXIC_UINT32 index) +{ + ZXIC_UINT32 dw_free_index = 0; + ZXIC_UINT32 dw_index = 0; + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW(index, 1); + dw_index = index + 1; //加1是为了使索引从0开始分配 + if(p_list == NULL) + { + ZXIC_COMM_PRINT("\n zxic_comm_liststack_alloc_spec_index: address is full! ERROR LINE:%d\n ",__LINE__); + return ZXIC_LIST_STACK_POINT_NULL; + } + + if((p_list->p_head) == LISTSTACK_INVALID_INDEX) + { + //ZXIC_COMM_PRINT("\n zxic_comm_liststack_alloc is full! LINE:%d\n ",__LINE__); + return ZXIC_LIST_STACK_ISEMPTY_ERR; + + } + + if(dw_index >= p_list->capacity) + { + ZXIC_COMM_PRINT("\n zxic_comm_liststack_alloc_spec_index: input invalid index! LINE:%d\n ",__LINE__); + return ZXIC_LIST_STACK_ALLOC_INDEX_INVALID; + } + + if(p_list->p_array[dw_index].next == LISTSTACK_INVALID_INDEX) + { + ZXIC_COMM_PRINT("\n zxic_comm_liststack_alloc_spec_index: index is used, not alloc again! LINE:%d\n ",__LINE__); + return ZXIC_LIST_STACK_ALLOC_INDEX_USED; + } + else + { + if(p_list->p_head == dw_index) + { + if(p_list->p_array[dw_index].next != 0xffffffff) + { + p_list->p_head = p_list->p_array[dw_index].next; + } + else + { + p_list->p_head = LISTSTACK_INVALID_INDEX; + } + } + else + { + dw_free_index = p_list->p_head; + while(p_list->p_array[dw_free_index].next != 0xffffffff) + { + if(p_list->p_array[dw_free_index].next == dw_index) + { + p_list->p_array[dw_free_index].next = p_list->p_array[dw_index].next; + break; + } + dw_free_index = p_list->p_array[dw_free_index].next; + } + } + + p_list->p_array[dw_index].next = LISTSTACK_INVALID_INDEX; + p_list->free_num--; + p_list->used_num++; + } + + /*分配一个条目后,判断队列是否变为空,若变为空,则头指向无效索引*/ + if((p_list->free_num == 0) || (p_list->used_num == (p_list->capacity-1))) + { + //ZXIC_COMM_PRINT("\n zxic_comm_liststack_alloc! ERROR LINE:%d\n ",__LINE__); + p_list->p_head = LISTSTACK_INVALID_INDEX; + } + + return ZXIC_OK; + +} + + +ZXIC_RTN32 zxic_comm_liststack_destroy(ZXIC_LISTSTACK_MANGER* p_list) +{ + if(p_list == NULL) + { + ZXIC_COMM_PRINT("\n zxic_comm_liststack_destroy! LINE:%d\n ",__LINE__); + return ZXIC_LIST_STACK_POINT_NULL; + } + ZXIC_COMM_FREE(p_list); + + return ZXIC_OK; + +} + +ZXIC_RTN32 zxic_comm_liststack_showlist_info (ZXIC_LISTSTACK_MANGER* p_list) +{ + ZXIC_COMM_PRINT( "\n\t List: 0x%p", (void*)p_list ); + ZXIC_COMM_PRINT( "\n\t Array: 0x%p", (void*)p_list->p_array ); + ZXIC_COMM_PRINT( "\n\t capacity: 0x%x", p_list->capacity ); + ZXIC_COMM_PRINT( "\n\t p_head: 0x%x", p_list->p_head ); + ZXIC_COMM_PRINT( "\n\t free_num: 0x%x", p_list->free_num ); + ZXIC_COMM_PRINT( "\n\t used_num: 0x%x\n", p_list->used_num ); + + return 0; +} + +ZXIC_RTN32 zxic_comm_liststack_show_used(ZXIC_LISTSTACK_MANGER* p_list, ZXIC_UINT32 line_number ) +{ + ZXIC_RTN32 rc = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 used_number = 0; + ZXIC_UINT32 dw_index = 0; + ZXIC_UINT32 dw_last_free_idx = 0; + + if(p_list == NULL) + { + ZXIC_COMM_PRINT ( "\n Please Input Param!" ); + return 0; + } + + if ( line_number == 0 ) + { + line_number = 32; + } + + rc = zxic_comm_liststack_showlist_info ( p_list ); + ZXIC_COMM_CHECK_RC(rc, "zxic_comm_liststack_showlist_info"); + ZXIC_COMM_PRINT ( "\n" ); + + /*611002175032 zj068187 begin*/ + if(LISTSTACK_INVALID_INDEX == p_list->p_head) + { + ZXIC_COMM_PRINT("\n The index are all used!\n"); + } + + dw_index = p_list->p_head; + ZXIC_COMM_CHECK_INDEX_UPPER(dw_index, (p_list->capacity - 1)); + while(LISTSTACK_INVALID_INDEX != p_list->p_array[dw_index].next) + { + dw_index = p_list->p_array[dw_index].next; + ZXIC_COMM_CHECK_INDEX_UPPER(dw_index, (p_list->capacity - 1)); + } + + dw_last_free_idx = p_list->p_array[dw_index].index; + /*611002175032 zj068187 end*/ + + for ( i = 1; i < p_list->capacity; i++ ) + { + /*611002175032 zj068187 modify*/ + if((LISTSTACK_INVALID_INDEX == p_list->p_array[i].next) + &&(dw_last_free_idx != p_list->p_array[i].index)) + { + ZXIC_COMM_PRINT ( " 0x%x", i ); + used_number++; + + if ( ( used_number % line_number ) == 0 ) + { + ZXIC_COMM_PRINT ( "\n" ); + } + } + } + + ZXIC_COMM_PRINT ( "\n used_number: 0x%x", used_number ); + + return ZXIC_OK; +} + +ZXIC_RTN32 zxic_comm_liststack_show_free (ZXIC_LISTSTACK_MANGER* p_list, ZXIC_UINT32 line_number ) +{ + ZXIC_RTN32 rc = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 index = 0; + ZXIC_UINT32 free_number = 0; + + if(p_list == NULL) + { + ZXIC_COMM_PRINT ( "\n Please Input Param!" ); + return 0; + } + + if ( line_number == 0 ) + { + line_number = 32; + } + + rc = zxic_comm_liststack_showlist_info ( p_list ); + ZXIC_COMM_CHECK_RC(rc, "zxic_comm_liststack_showlist_info"); + ZXIC_COMM_PRINT ( "\n" ); + + index = p_list->p_head; + + for ( i = p_list->capacity - 1; i != 0; i-- ) + { + if ( index != LISTSTACK_INVALID_INDEX ) + { + ZXIC_COMM_PRINT ( " 0x%x", index ); + free_number++; + + index = p_list->p_array[index].next; + + if ( ( free_number % line_number ) == 0 ) + { + ZXIC_COMM_PRINT ( "\n" ); + } + } + else + { + break; + } + } + + ZXIC_COMM_PRINT ( "\n free_number: 0x%x", free_number ); + + return ZXIC_OK; +} + + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_comm_mutex_lock.c b/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_comm_mutex_lock.c new file mode 100644 index 0000000..91529d7 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_comm_mutex_lock.c @@ -0,0 +1,179 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : zxic_sal.c +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : 王春雷 +* 完成日期 : 2014/02/07 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#include "zxic_common.h" +#include "zxic_private.h" + +#ifdef ZXIC_OS_WIN +#define ZXIC_MUTEX_WAITTIME_MAX (INFINITE) /* 互斥锁最大等待时间 */ +#else +#define ZXIC_MUTEX_WAITTIME_MAX (5000) /* 互斥锁最大等待时间:5000ms */ +#endif + +/***********************************************************/ +/** 初始化互斥量 +* @param p_mutex 互斥量 +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/02/07 +************************************************************/ +ZXIC_RTN32 zxic_comm_mutex_create(ZXIC_MUTEX_T *p_mutex) +{ + // ZXIC_SINT32 rc = 0; + + ZXIC_COMM_CHECK_POINT(p_mutex); + +#ifdef ZXIC_OS_WIN + p_mutex->mutex = CreateMutex(ZXIC_NULL, ZXIC_FALSE, ZXIC_NULL); + if(p_mutex->mutex == 0) + { + ZXIC_COMM_TRACE_ERROR("\nErrCode[ 0x%x ]: Create mutex failed.", ZXIC_MUTEX_LOCK_INIT_FAIL); + return ZXIC_MUTEX_LOCK_INIT_FAIL; + } +#else + /*rc = pthread_mutex_init(&p_mutex->mutex, NULL); + if(rc != 0) + { + ZXIC_COMM_TRACE_ERROR("\nErrCode[ 0x%x ]: Create mutex failed", ZXIC_MUTEX_LOCK_INIT_FAIL); + return ZXIC_MUTEX_LOCK_INIT_FAIL; + }*/ + mutex_init(&p_mutex->mutex); +#endif + + return ZXIC_OK; +} + +/***********************************************************/ +/** 互斥量加锁 +* @param p_mutex +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/02/07 +************************************************************/ +ZXIC_RTN32 zxic_comm_mutex_lock(ZXIC_MUTEX_T *p_mutex) +{ + ZXIC_SINT32 rc = 0; +#ifndef ZXIC_FOR_FUZZER + ZXIC_COMM_CHECK_POINT(p_mutex); + + #ifdef ZXIC_OS_WIN + switch(WaitForSingleObject(p_mutex->mutex, ZXIC_MUTEX_WAITTIME_MAX)) + { + case (WAIT_OBJECT_0): + { + /* wait mutex success. */ + break; + } + default: + { + ZXIC_COMM_TRACE_ERROR("\nErrCode[ 0x%x ]: WaitForSingleObject failed.", ZXIC_MUTEX_LOCK_LOCK_FAIL); + ZXIC_COMM_ASSERT(0); + return ZXIC_MUTEX_LOCK_LOCK_FAIL; + } + } + #else + /*rc = pthread_mutex_lock(&p_mutex->mutex); + if(rc != 0) + { + ZXIC_COMM_TRACE_ERROR("\nErrCode[ 0x%x ]: Get mutex lock fail.", ZXIC_MUTEX_LOCK_LOCK_FAIL); + //ZXIC_COMM_ASSERT(0); + //return ZXIC_MUTEX_LOCK_LOCK_FAIL; + return rc; + }*/ + mutex_lock(&p_mutex->mutex); + #endif +#endif + + return rc; +} + +/***********************************************************/ +/** 互斥量解锁 +* @param p_mutex +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/02/07 +************************************************************/ +ZXIC_RTN32 zxic_comm_mutex_unlock(ZXIC_MUTEX_T *p_mutex) +{ + ZXIC_SINT32 rc = 0; +#ifndef ZXIC_FOR_FUZZER + + ZXIC_COMM_CHECK_POINT(p_mutex); + + #ifdef ZXIC_OS_WIN + if(!ReleaseMutex(p_mutex->mutex)) + { + ZXIC_COMM_TRACE_ERROR("\nErrCode[ 0x%x ]: ReleaseMutex failed.", ZXIC_MUTEX_LOCK_ULOCK_FAIL); + return ZXIC_MUTEX_LOCK_ULOCK_FAIL; + } + #else + /*rc = pthread_mutex_unlock(&p_mutex->mutex); + if(rc != 0) + { + ZXIC_COMM_TRACE_ERROR("\nErrCode[ 0x%x ]: Release mutex lock fail.", ZXIC_MUTEX_LOCK_ULOCK_FAIL); + return ZXIC_MUTEX_LOCK_ULOCK_FAIL; + }*/ + mutex_unlock(&p_mutex->mutex); + #endif +#endif + + return rc; +} + +/***********************************************************/ +/** 销毁互斥量 +* @param p_mutex +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/02/07 +************************************************************/ +ZXIC_RTN32 zxic_comm_mutex_destroy(ZXIC_MUTEX_T *p_mutex) +{ + // ZXIC_SINT32 rc = 0; + + ZXIC_COMM_CHECK_POINT(p_mutex); + +#ifdef ZXIC_OS_WIN + if(p_mutex->mutex == 0) + { + ZXIC_COMM_TRACE_ERROR("\nErrCode[ 0x%x ]: Destroy mutex failed.", ZXIC_MUTEX_LOCK_DESTROY_FAIL); + return ZXIC_MUTEX_LOCK_DESTROY_FAIL; + } + CloseHandle(p_mutex->mutex); +#else + /*rc = pthread_mutex_destroy(&p_mutex->mutex); + if(rc != 0) + { + ZXIC_COMM_TRACE_ERROR("\nErrCode[ 0x%x ]: Destroy mutex fail", ZXIC_MUTEX_LOCK_DESTROY_FAIL); + return ZXIC_MUTEX_LOCK_DESTROY_FAIL; + }*/ + mutex_destroy(&p_mutex->mutex); +#endif + + return ZXIC_OK; +} \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_comm_print.c b/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_comm_print.c new file mode 100644 index 0000000..64a6f74 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_comm_print.c @@ -0,0 +1,446 @@ +/************************************************************** +* 版权所有 (C)2013-2020, 深圳市中兴通讯股份有限公司 +* 文件名称 : zxic_comm_print.c +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : xuchenxi_10235594 +* 完成日期 : 2020/07/20 +* DEPARTMENT: 有线开发四部-系统软件团队 +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ +#include "zxic_common.h" +#include "zxic_private.h" +#include "log.h" + +#if ZXIC_REAL("全局变量定义") +ZXIC_UINT32 g_zxic_print_level = ZXIC_TRACE_ERROR_PRINT; /*打印级别,默认为INFO*/ +ZXIC_UINT32 g_zxic_print_en = 1; /*界面打印控制开关*/ +#endif + +#if ZXIC_REAL("开关") +/***********************************************************/ +/** 设置打印开关,决定ZXIC_COMM_PRINT等调试打印函数是否输出到屏幕 +* @param enable 0-不打印到屏幕,1-打印到屏幕 +* +* @return +* @remark 无 +* @see +* @author zhaisyu @date 2018/10/25 +************************************************************/ +ZXIC_VOID zxic_comm_set_print_en(ZXIC_UINT32 enable) +{ + g_zxic_print_en = enable; +} + +ZXIC_RTN32 zxic_comm_get_print_en(ZXIC_VOID) +{ + return g_zxic_print_en; +} + +/***********************************************************/ +/** 设置Debug打印级别 +* @param debug_level 0打印级别最低,4打印级别最高,即打印的东西最多 +* +* @return +* @remark 无 +* @see +* @author ChenWei10088471 @date 2014/02/07 +************************************************************/ +ZXIC_VOID zxic_comm_set_print_level(ZXIC_UINT32 debug_level) +{ + g_zxic_print_level = debug_level; +} + +/***********************************************************/ +/** 获取Debug打印级别 +* @param ZXIC_VOID +* +* @return +* @remark 无 +* @see +* @author ChenWei10088471 @date 2014/02/07 +************************************************************/ +ZXIC_RTN32 zxic_comm_get_print_level(ZXIC_VOID) +{ + return g_zxic_print_level; +} + +#endif + +#if ZXIC_REAL("打印函数") +ZXIC_VOID ZXIC_COMM_PRINT(ZXIC_CONST ZXIC_CHAR *format, ...) +{ + va_list ap; + ZXIC_CHAR szBuffer[1024]; + + ZXIC_COMM_ASSERT(format); + + va_start(ap, format); + { + ZXIC_COMM_VSNPRINTF_S(szBuffer, ZXIC_SIZEOF(szBuffer), ZXIC_SIZEOF(szBuffer), format, ap); + if (g_zxic_print_en) + { + DH_LOG_INFO(MODULE_NP, "%s", szBuffer); + } + } + va_end(ap); +} + +/***********************************************************/ +/** Error信息打印函数 +* @param format +* +* @return +* @remark 无 +* @see +* @author ChenWei10088471 @date 2014/02/07 +************************************************************/ +ZXIC_VOID ZXIC_COMM_TRACE_ERROR(ZXIC_CONST ZXIC_CHAR *format, ...) +{ + va_list ap; + ZXIC_CHAR szBuffer[1024]; + + ZXIC_COMM_ASSERT(format); + + if (zxic_comm_get_print_level() == 0 || zxic_comm_get_print_level() >= ZXIC_TRACE_INVALID_PRINT) + { + return; + } + + va_start(ap, format); + { + ZXIC_COMM_VSNPRINTF_S(szBuffer, ZXIC_SIZEOF(szBuffer), 1024, format, ap); + if (zxic_comm_get_print_en()) + { + DH_LOG_ERR(MODULE_NP, "%s", szBuffer); + } + } + va_end(ap); +} + +/***********************************************************/ +/** Info信息打印函数 +* @param format +* +* @return +* @remark 无 +* @see +* @author ChenWei10088471 @date 2014/02/07 +************************************************************/ +ZXIC_VOID ZXIC_COMM_TRACE_INFO(ZXIC_CONST ZXIC_CHAR *format, ...) +{ + va_list ap; + ZXIC_CHAR szBuffer[1024]; + + ZXIC_COMM_ASSERT(format); + + if (zxic_comm_get_print_level() == 0 || zxic_comm_get_print_level() >= ZXIC_TRACE_INVALID_PRINT) + { + return; + } + + if (zxic_comm_get_print_level() >= ZXIC_TRACE_INFO_PRINT) + { + va_start(ap, format); + { + ZXIC_COMM_VSNPRINTF_S(szBuffer, ZXIC_SIZEOF(szBuffer), 1024, format, ap); + if (zxic_comm_get_print_en()) + { + DH_LOG_INFO(MODULE_NP, "%s", szBuffer); + } + } + va_end(ap); + } +} + +/***********************************************************/ +/** Debug信息打印函数 +* @param format +* +* @return +* @remark 无 +* @see +* @author ChenWei10088471 @date 2014/02/07 +************************************************************/ +ZXIC_VOID ZXIC_COMM_TRACE_DEBUG(ZXIC_CONST ZXIC_CHAR *format, ...) +{ + va_list ap; + ZXIC_CHAR szBuffer[1024]; + + ZXIC_COMM_ASSERT(format); + + if (zxic_comm_get_print_level() == 0 || zxic_comm_get_print_level() >= ZXIC_TRACE_INVALID_PRINT) + { + return; + } + + if (zxic_comm_get_print_level() >= ZXIC_TRACE_DEBUG_PRINT) + { + va_start(ap, format); + { + ZXIC_COMM_VSNPRINTF_S(szBuffer, ZXIC_SIZEOF(szBuffer), 1024, format, ap); + if (zxic_comm_get_print_en()) + { + DH_LOG_DEBUG(MODULE_NP, "%s", szBuffer); + } + } + va_end(ap); + } +} + +/***********************************************************/ +/** 所有调试信息打印函数 +* @param format +* +* @return +* @remark 无 +* @see +* @author ChenWei10088471 @date 2014/02/07 +************************************************************/ +ZXIC_VOID ZXIC_COMM_TRACE_ALL(ZXIC_CONST ZXIC_CHAR *format, ...) +{ + va_list ap; + ZXIC_CHAR szBuffer[1024]; + + ZXIC_COMM_ASSERT(format); + + if (zxic_comm_get_print_level() == 0 || zxic_comm_get_print_level() >= ZXIC_TRACE_INVALID_PRINT) + { + return; + } + + if (zxic_comm_get_print_level() >= ZXIC_TRACE_ALL_PRINT) + { + va_start(ap, format); + { + ZXIC_COMM_VSNPRINTF_S(szBuffer, ZXIC_SIZEOF(szBuffer), 1024, format, ap); + if (zxic_comm_get_print_en()) + { + DH_LOG_DEBUG(MODULE_NP, "%s", szBuffer); + } + } + va_end(ap); + } +} + +/***********************************************************/ +/** 支持多芯片的Error信息打印函数 +* 打印级别为1及以上时执行打印 +* @param dev_id +* @param format +* +* @return +* @remark 无 +* @see +* @author xcx @date 2020/07/20 +************************************************************/ +ZXIC_VOID ZXIC_COMM_TRACE_DEV_ERROR(ZXIC_UINT32 dev_id, ZXIC_CONST ZXIC_CHAR *format, ...) +{ + va_list ap; + ZXIC_CHAR szBuffer[768 - 32] = {0}; + ZXIC_CHAR devBuffer[1024] = {0}; + + ZXIC_COMM_ASSERT(format); + + if (zxic_comm_get_print_level() == 0 || zxic_comm_get_print_level() >= ZXIC_TRACE_INVALID_PRINT || dev_id > 3) + { + return; + } + + if (zxic_comm_get_print_level() >= ZXIC_TRACE_ERROR_PRINT) + { + ZXIC_COMM_SNPRINTF_S(devBuffer, ZXIC_SIZEOF(devBuffer), ZXIC_SIZEOF(devBuffer), "Dev_id[%u]_ERROR: ", dev_id); + + va_start(ap, format); + { + ZXIC_COMM_VSNPRINTF_S(szBuffer, ZXIC_SIZEOF(szBuffer), ZXIC_SIZEOF(szBuffer), format, ap); + ZXIC_COMM_STRNCAT_S(devBuffer, 1024, szBuffer, ZXIC_COMM_STRNLEN_S(szBuffer, ZXIC_SIZEOF(szBuffer))); + + if (zxic_comm_get_print_en()) + { + DH_LOG_ERR(MODULE_NP, "%s", devBuffer); + } + } + va_end(ap); + } +} + +/***********************************************************/ +/** 支持多芯片的Info信息打印函数 +* 打印级别为2及以上时执行打印 +* @param dev_id +* @param format +* +* @return +* @remark 无 +* @see +* @author wcl @date 2018/09/08 +************************************************************/ +ZXIC_VOID ZXIC_COMM_TRACE_DEV_INFO(ZXIC_UINT32 dev_id, ZXIC_CONST ZXIC_CHAR *format, ...) +{ + va_list ap; + ZXIC_CHAR szBuffer[768 - 32] = {0}; + ZXIC_CHAR devBuffer[1024] = {0}; + + ZXIC_COMM_ASSERT(format); + + if (zxic_comm_get_print_level() == 0 || zxic_comm_get_print_level() >= ZXIC_TRACE_INVALID_PRINT || dev_id > 3) + { + return; + } + + if (zxic_comm_get_print_level() >= ZXIC_TRACE_INFO_PRINT) + { + ZXIC_COMM_SNPRINTF_S(devBuffer, ZXIC_SIZEOF(devBuffer), ZXIC_SIZEOF(devBuffer), "Dev_id[%u]_INFO: ", dev_id); + + va_start(ap, format); + { + ZXIC_COMM_VSNPRINTF_S(szBuffer, ZXIC_SIZEOF(szBuffer), ZXIC_SIZEOF(szBuffer), format, ap); + ZXIC_COMM_STRNCAT_S(devBuffer, 1024, szBuffer, ZXIC_COMM_STRNLEN_S(szBuffer, ZXIC_SIZEOF(szBuffer))); + + if (zxic_comm_get_print_en()) + { + DH_LOG_INFO(MODULE_NP, "%s", devBuffer); + } + } + va_end(ap); + } +} + +/***********************************************************/ +/** 支持多芯片的Debug信息打印函数 +* @param dev_id +* @param format +* +* @return +* @remark 无 +* @see +* @author wcl @date 2018/09/08 +************************************************************/ +ZXIC_VOID ZXIC_COMM_TRACE_DEV_DEBUG(ZXIC_UINT32 dev_id,ZXIC_CONST ZXIC_CHAR *format, ...) +{ + va_list ap; + ZXIC_CHAR szBuffer[768 - 32] = {0}; + ZXIC_CHAR devBuffer[1024] = {0}; + + ZXIC_COMM_ASSERT(format); + + if (zxic_comm_get_print_level() == 0 || zxic_comm_get_print_level() >= ZXIC_TRACE_INVALID_PRINT || dev_id > 3) + { + return; + } + + if (zxic_comm_get_print_level() >= ZXIC_TRACE_DEBUG_PRINT) + { + ZXIC_COMM_SNPRINTF_S(devBuffer, ZXIC_SIZEOF(devBuffer), ZXIC_SIZEOF(devBuffer), "Dev_id[%u]_DEBUG: ", dev_id); + + va_start(ap, format); + { + ZXIC_COMM_VSNPRINTF_S(szBuffer, ZXIC_SIZEOF(szBuffer), ZXIC_SIZEOF(szBuffer), format, ap); + ZXIC_COMM_STRNCAT_S(devBuffer, 1024, szBuffer, ZXIC_COMM_STRNLEN_S(szBuffer, ZXIC_SIZEOF(szBuffer))); + + if (zxic_comm_get_print_en()) + { + DH_LOG_DEBUG(MODULE_NP, "%s", devBuffer); + } + } + va_end(ap); + } +} + +/***********************************************************/ +/** 支持多芯片的所有调试信息打印函数 +* @param dev_id +* @param format +* +* @return +* @remark 无 +* @see +* @author wcl @date 2018/09/08 +************************************************************/ +ZXIC_VOID ZXIC_COMM_TRACE_DEV_ALL(ZXIC_UINT32 dev_id, ZXIC_CONST ZXIC_CHAR *format, ...) +{ + va_list ap; + ZXIC_CHAR szBuffer[768 - 32] = {0}; + ZXIC_CHAR devBuffer[1024] = {0}; + + ZXIC_COMM_ASSERT(format); + + if (zxic_comm_get_print_level() == 0 || zxic_comm_get_print_level() >= ZXIC_TRACE_INVALID_PRINT || dev_id > 3) + { + return; + } + + if (zxic_comm_get_print_level() >= ZXIC_TRACE_ALL_PRINT) + { + ZXIC_COMM_SNPRINTF_S(devBuffer, ZXIC_SIZEOF(devBuffer), ZXIC_SIZEOF(devBuffer), "Dev_id[%u]_ALL:", dev_id); + + va_start(ap, format); + { + ZXIC_COMM_VSNPRINTF_S(szBuffer, ZXIC_SIZEOF(szBuffer), ZXIC_SIZEOF(szBuffer), format, ap); + ZXIC_COMM_STRNCAT_S(devBuffer, 1024, szBuffer, ZXIC_COMM_STRNLEN_S(szBuffer, ZXIC_SIZEOF(szBuffer))); + + if (zxic_comm_get_print_en()) + { + DH_LOG_DEBUG(MODULE_NP, "%s", devBuffer); + } + } + va_end(ap); + } +} +#endif + +#if ZXIC_REAL("") + +ZXIC_VOID ZXIC_COMM_DBGCNT64_PRINT(ZXIC_CONST ZXIC_CHAR * name, ZXIC_UINT64 value) +{ + ZXIC_CHAR temp_buff[50] = {0}; + + if (-1 == ZXIC_COMM_SNPRINTF_S(temp_buff, 50, 50, "0x%016llx", value)) + { + return; + } + + ZXIC_COMM_PRINT("%-50s : %18s\n", name, temp_buff); +} + +ZXIC_VOID ZXIC_COMM_DBGCNT32_PRINT(ZXIC_CONST ZXIC_CHAR * name, ZXIC_UINT32 value) +{ + ZXIC_CHAR temp_buff[50] = {0}; + + if (-1 == ZXIC_COMM_SNPRINTF_S(temp_buff, 50, 50, "0x%08x", value)) + { + return; + } + + ZXIC_COMM_PRINT("%-50s : %18s\n", name, temp_buff); +} + +/** 双参数打印 */ +ZXIC_VOID ZXIC_COMM_DBGCNT32_PAR_PRINT(ZXIC_CONST ZXIC_CHAR * name, ZXIC_UINT32 parm, ZXIC_UINT32 value) +{ + ZXIC_CHAR temp_buff[50] = {0}; + ZXIC_CHAR vlaue_buff[18] = {0}; + + if (-1 == ZXIC_COMM_SNPRINTF_S(temp_buff, 50, 50, name, parm)) + { + return; + } + + if (-1 == ZXIC_COMM_SNPRINTF_S(vlaue_buff, 18, 18, "0x%08x", value)) + { + return; + } + + ZXIC_COMM_PRINT("%-50s : %18s\n", temp_buff, vlaue_buff); +} + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_comm_rb_tree.c b/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_comm_rb_tree.c new file mode 100644 index 0000000..5ae63c9 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_comm_rb_tree.c @@ -0,0 +1,1059 @@ +/***************************************************************************** + * 版权所有 (C)2001-2015, 深圳市中兴通讯股份有限公司。 + * + * 文件名称: zxic_comm_rb_tree.c + * 文件标识: + * 内容摘要: + * 其它说明: + * 当前版本: + * 作 者: ChenWei10088471 + * 完成日期: + * 当前责任人-1: + * 当前责任人-2: + * + * DEPARTMENT : ASIC_FPGA_R&D_Dept + * MANUAL_PERCENT : 100% + *****************************************************************************/ +#include "zxic_common.h" +#include "zxic_comm_rb_tree.h" +#include "zxic_comm_double_link.h" + +ZXIC_SINT32 zxic_comm_rb_def_cmp(ZXIC_VOID *p_new, ZXIC_VOID *p_old, ZXIC_UINT32 key_size) +{ + return ZXIC_COMM_MEMCMP(p_new, p_old, key_size); +} + +ZXIC_RTN32 zxic_comm_rb_init(ZXIC_RB_CFG *p_rb_cfg, + ZXIC_UINT32 total_num, + ZXIC_UINT32 key_size, + ZXIC_RB_CMPFUN cmpfun ) +{ + ZXIC_UINT32 rtn = ZXIC_OK; + ZXIC_UINT32 malloc_size = 0; + ZXIC_UINT32 memset_size = 0; + + ZXIC_COMM_CHECK_POINT(p_rb_cfg); + if (p_rb_cfg->is_init) + { + ZXIC_COMM_TRACE_ERROR("\n zxic_comm_rb_init already init!"); + return ZXIC_OK; + } + + p_rb_cfg->key_size = key_size; + p_rb_cfg->p_root = NULL; + + if (cmpfun) + { + p_rb_cfg->p_cmpfun = cmpfun; + } + else + { + p_rb_cfg->p_cmpfun = zxic_comm_rb_def_cmp; + } + + if (total_num) + { + p_rb_cfg->is_dynamic = 0; + + rtn = zxic_comm_double_link_init(total_num, &p_rb_cfg->tn_list); + ZXIC_COMM_CHECK_RC(rtn, "zxic_comm_double_link_init"); + + rtn = zxic_comm_liststack_creat(total_num, &p_rb_cfg->p_lsm); + ZXIC_COMM_CHECK_RC(rtn, "zxic_comm_liststack_creat"); + + p_rb_cfg->p_keybase = (ZXIC_UINT8 *)ZXIC_COMM_MALLOC(total_num * p_rb_cfg->key_size); + ZXIC_COMM_CHECK_POINT(p_rb_cfg->p_keybase); + memset_size = total_num * p_rb_cfg->key_size; + ZXIC_COMM_MEMSET(p_rb_cfg->p_keybase, 0, memset_size); + + malloc_size = (ZXIC_SIZEOF(ZXIC_RB_TN) * total_num) & ZXIC_UINT32_MASK; + + p_rb_cfg->p_tnbase = (ZXIC_RB_TN*)ZXIC_COMM_MALLOC(malloc_size); + ZXIC_COMM_CHECK_POINT(p_rb_cfg->p_tnbase); + ZXIC_COMM_MEMSET(p_rb_cfg->p_tnbase, 0, total_num * ZXIC_SIZEOF(ZXIC_RB_TN)); + } + else /*totalnum = 0 indicate that customer manage the memory*/ + { + p_rb_cfg->is_dynamic = 1; + + rtn = zxic_comm_double_link_init(0xFFFFFFFF, &p_rb_cfg->tn_list); + ZXIC_COMM_CHECK_RC(rtn, "zxic_comm_double_link_init"); + } + p_rb_cfg->is_init = 1; + + return ZXIC_OK; +} + +ZXIC_RTN32 zxic_comm_rb_destroy(ZXIC_RB_CFG *p_rb_cfg) +{ + ZXIC_UINT32 rtn = 0; + + ZXIC_COMM_CHECK_POINT(p_rb_cfg); + /*静态才使用*/ + if (0 == p_rb_cfg->is_dynamic) + { + zxic_comm_liststack_destroy(p_rb_cfg->p_lsm); + } + if (NULL != p_rb_cfg->p_keybase) + { + ZXIC_COMM_FREE(p_rb_cfg->p_keybase); + p_rb_cfg->p_keybase = NULL; + } + + if (NULL != p_rb_cfg->p_tnbase) + { + ZXIC_COMM_FREE(p_rb_cfg->p_tnbase); + p_rb_cfg->p_tnbase = NULL; + } + + ZXIC_COMM_MEMSET(p_rb_cfg, 0, ZXIC_SIZEOF(ZXIC_RB_CFG)); + + return rtn; +} + +ZXIC_VOID zxic_comm_rb_swich_color(ZXIC_RB_TN *p_tn1, ZXIC_RB_TN *p_tn2) +{ + ZXIC_UINT32 color1, color2; + + ZXIC_COMM_CHECK_POINT_NONE(p_tn1); + ZXIC_COMM_CHECK_POINT_NONE(p_tn2); + + color1 = GET_TN_COLOR(p_tn1); + color2 = GET_TN_COLOR(p_tn2); + + SET_TN_COLOR(p_tn1, color2); + SET_TN_COLOR(p_tn2, color1); + + return; +} + + +ZXIC_RB_TN* zxic_comm_rb_get_brotn(ZXIC_RB_TN *p_cur_tn) +{ + ZXIC_COMM_CHECK_POINT_RETURN_NULL(p_cur_tn); + ZXIC_COMM_CHECK_POINT_RETURN_NULL(p_cur_tn->p_parent); + + return (p_cur_tn->p_parent->p_left == p_cur_tn) ? p_cur_tn->p_parent->p_right : p_cur_tn->p_parent->p_left; +} + + +ZXIC_RTN32 zxic_comm_rb_handle_ins(ZXIC_RB_CFG *p_rb_cfg, + ZXIC_RB_TN ***stack_tn, + ZXIC_UINT32 stack_top) +{ + ZXIC_RB_TN **pp_cur_tn = NULL; + ZXIC_RB_TN *p_cur_tn = NULL; + ZXIC_RB_TN **pp_tmp_tn = NULL; + ZXIC_RB_TN *p_tmp_tn = NULL; + + ZXIC_COMM_CHECK_POINT(p_rb_cfg); + ZXIC_COMM_CHECK_POINT(stack_tn); + + while (stack_top > 0) + { + pp_cur_tn = stack_tn[stack_top]; + p_cur_tn = *pp_cur_tn; + + if (!p_cur_tn->p_parent) /*root must be black*/ + { + SET_TN_COLOR(p_cur_tn, ZXIC_RBT_BLACK); + break; + } + else if (GET_TN_COLOR(p_cur_tn->p_parent) == ZXIC_RBT_RED) + { + ZXIC_RB_TN *p_unc_tn = zxic_comm_rb_get_brotn(p_cur_tn->p_parent); + + ZXIC_COMM_ASSERT(p_cur_tn->p_parent == *stack_tn[stack_top - 1]); + + if (GET_TN_COLOR(p_unc_tn) == ZXIC_RBT_RED) /*unc is red,so we change the black of parent and unc*/ + { + ZXIC_COMM_ASSERT(p_unc_tn); + SET_TN_COLOR(p_cur_tn->p_parent, ZXIC_RBT_BLACK); + SET_TN_COLOR(p_unc_tn, ZXIC_RBT_BLACK); + + ZXIC_COMM_ASSERT(p_cur_tn->p_parent->p_parent == *stack_tn[stack_top - 2]); + + SET_TN_COLOR(p_cur_tn->p_parent->p_parent, ZXIC_RBT_RED); + stack_top -= 2; + } + else /*we need shift ,p_cur_tn->parent->parent*/ + { + ZXIC_RB_TN *p_bro_tn = NULL; + + pp_tmp_tn = stack_tn[stack_top - 2]; + p_tmp_tn = *pp_tmp_tn; + + + if (p_cur_tn->p_parent == p_tmp_tn->p_left && p_cur_tn == p_cur_tn->p_parent->p_left) + { + *pp_tmp_tn = p_cur_tn->p_parent; + + p_bro_tn = zxic_comm_rb_get_brotn(p_cur_tn); + p_cur_tn->p_parent->p_parent = p_tmp_tn->p_parent; + + p_tmp_tn->p_left = p_bro_tn; + p_tmp_tn->p_parent = p_cur_tn->p_parent; + p_cur_tn->p_parent->p_right = p_tmp_tn; + + if (p_bro_tn) + { + p_bro_tn->p_parent = p_tmp_tn; + } + + zxic_comm_rb_swich_color(*pp_tmp_tn, p_tmp_tn); + } + else if (p_cur_tn->p_parent == p_tmp_tn->p_left && p_cur_tn == p_cur_tn->p_parent->p_right) + { + *pp_tmp_tn = p_cur_tn; + + p_cur_tn->p_parent->p_right = p_cur_tn->p_left; + + if (p_cur_tn->p_left) + { + p_cur_tn->p_left->p_parent = p_cur_tn->p_parent; + } + + p_cur_tn->p_parent->p_parent = p_cur_tn; + p_tmp_tn->p_left = p_cur_tn->p_right; + + if (p_cur_tn->p_right) + { + p_cur_tn->p_right->p_parent = p_tmp_tn; + } + + p_cur_tn->p_left = p_cur_tn->p_parent; + p_cur_tn->p_right = p_tmp_tn; + + p_cur_tn->p_parent = p_tmp_tn->p_parent; + p_tmp_tn->p_parent = p_cur_tn; + + zxic_comm_rb_swich_color(*pp_tmp_tn, p_tmp_tn); + } + else if (p_cur_tn->p_parent == p_tmp_tn->p_right && p_cur_tn == p_cur_tn->p_parent->p_right) + { + *pp_tmp_tn = p_cur_tn->p_parent; + p_bro_tn = zxic_comm_rb_get_brotn(p_cur_tn); + + p_cur_tn->p_parent->p_parent = p_tmp_tn->p_parent; + + p_tmp_tn->p_right = p_cur_tn->p_parent->p_left; + p_tmp_tn->p_parent = p_cur_tn->p_parent; + p_cur_tn->p_parent->p_left = p_tmp_tn; + + if (p_bro_tn) + { + p_bro_tn->p_parent = p_tmp_tn; + } + + zxic_comm_rb_swich_color(*pp_tmp_tn, p_tmp_tn); + } + else + { + *pp_tmp_tn = p_cur_tn; + p_cur_tn->p_parent->p_left = p_cur_tn->p_right; + + if (p_cur_tn->p_right) + { + p_cur_tn->p_right->p_parent = p_cur_tn->p_parent; + } + + p_cur_tn->p_parent->p_parent = p_cur_tn; + p_tmp_tn->p_right = p_cur_tn->p_left; + + if (p_cur_tn->p_left) + { + p_cur_tn->p_left->p_parent = p_tmp_tn; + } + + p_cur_tn->p_right = p_cur_tn->p_parent; + p_cur_tn->p_left = p_tmp_tn; + + p_cur_tn->p_parent = p_tmp_tn->p_parent; + p_tmp_tn->p_parent = p_cur_tn; + + zxic_comm_rb_swich_color(*pp_tmp_tn, p_tmp_tn); + + } + + /*change color*/ + + /* SET_TN_COLOR(p_cur_tn->p_parent,ZXIC_RBT_BLACK); + SET_TN_COLOR(p_tmp_tn,ZXIC_RBT_RED); */ + break; + } + } + else /*parent is black ,nothing to do ,end*/ + { + break; + } + } + + return ZXIC_OK; +} + + +ZXIC_RTN32 zxic_comm_rb_insert(ZXIC_RB_CFG *p_rb_cfg, + ZXIC_VOID *p_key, + ZXIC_VOID *out_val) +{ + ZXIC_UINT32 rtn = 0; + ZXIC_UINT32 stack_top = 1; + ZXIC_SINT32 cmprtn = 0; + ZXIC_UINT32 lsm_out = 0; + + ZXIC_RB_TN **stack_tn[ZXIC_RBT_MAX_DEPTH] = {0}; + //ZXIC_RB_TN **pp_tmp_tn = NULL; + ZXIC_RB_TN *p_cur_tn = NULL; + ZXIC_RB_TN *p_pre_tn = NULL; + ZXIC_RB_TN **pp_cur_tn = NULL; + ZXIC_VOID *p_cur_key = NULL; + ZXIC_RB_TN *p_ins_tn = p_key; + + ZXIC_COMM_CHECK_POINT(p_rb_cfg); + ZXIC_COMM_CHECK_POINT(p_key); + + p_cur_key = p_rb_cfg->is_dynamic ? ((ZXIC_RB_TN*)p_key)->p_key : p_key; + + pp_cur_tn = &p_rb_cfg->p_root; + + for (;;) + { + p_cur_tn = *pp_cur_tn; + + if (!p_cur_tn) /*find the insert position*/ + { + if (p_rb_cfg->is_dynamic == 0) + { + rtn = zxic_comm_liststack_alloc(p_rb_cfg->p_lsm, &lsm_out); + + if (rtn == ZXIC_LIST_STACK_ISEMPTY_ERR) + { + return ZXIC_RBT_RC_FULL; + } + + ZXIC_COMM_CHECK_RC(rtn, "zxic_comm_liststack_alloc"); + + p_ins_tn = p_rb_cfg->p_tnbase + lsm_out; + + ZXIC_COMM_CHECK_INDEX_MUL_OVERFLOW( p_rb_cfg->key_size, lsm_out); + INIT_RBT_TN(p_ins_tn, p_rb_cfg->key_size * lsm_out + p_rb_cfg->p_keybase); + + ZXIC_COMM_MEMCPY_S(p_ins_tn->p_key, p_rb_cfg->key_size, p_key, p_rb_cfg->key_size); + + SET_TN_LSV(p_ins_tn, lsm_out); + + if (out_val) + { + *((ZXIC_UINT32*)out_val) = lsm_out; + } + } + else + { + INIT_D_NODE(&p_ins_tn->tn_ln, p_ins_tn); + } + + /*all insert tn color set to red*/ + SET_TN_COLOR(p_ins_tn, ZXIC_RBT_RED); + + /*insert list*/ + if (cmprtn < 0) + { + rtn = zxic_comm_double_link_insert_pre(&p_ins_tn->tn_ln, &p_pre_tn->tn_ln, &p_rb_cfg->tn_list); + ZXIC_COMM_CHECK_RC(rtn, "zxic_comm_double_link_insert_pre"); + } + else if (cmprtn > 0) + { + rtn = zxic_comm_double_link_insert_aft(&p_ins_tn->tn_ln, &p_pre_tn->tn_ln, &p_rb_cfg->tn_list); + ZXIC_COMM_CHECK_RC(rtn, "zxic_comm_double_link_insert_aft"); + } + else + { + /*first insert*/ + ZXIC_COMM_ASSERT(!p_pre_tn); + + rtn = zxic_comm_double_link_insert_1st(&p_ins_tn->tn_ln, &p_rb_cfg->tn_list); + ZXIC_COMM_CHECK_RC(rtn, "zxic_comm_double_link_insert_1st"); + } + + /*get out loop */ + break; + } + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW(stack_top, 1); + stack_tn[stack_top++] = pp_cur_tn; + p_pre_tn = p_cur_tn; + cmprtn = p_rb_cfg->p_cmpfun(p_cur_key, p_cur_tn->p_key, p_rb_cfg->key_size); + + if (cmprtn > 0) + { + pp_cur_tn = &p_cur_tn->p_right; + } + else if (cmprtn < 0) + { + pp_cur_tn = &p_cur_tn->p_left; + } + else + { + ZXIC_COMM_TRACE_ALL("info ,rb_key is same \n"); + + if (p_rb_cfg->is_dynamic) + { + if (out_val) + { + *((ZXIC_RB_TN**)out_val) = p_cur_tn; + } + } + else + { + if (out_val) + { + *((ZXIC_UINT32*)out_val) = GET_TN_LSV(p_cur_tn); + } + } + + return ZXIC_RBT_RC_UPDATE; + } + } + + /*handle parenet ptr*/ + //pp_tmp_tn = stack_tn[stack_top - 1]; + + /*p_ins_tn->p_parent = stack_top != 1 ? *pp_tmp_tn : NULL;*/ + p_ins_tn->p_parent = (stack_top != 1) ? *stack_tn[stack_top - 1] : NULL; + + stack_tn[stack_top] = pp_cur_tn; + + *pp_cur_tn = p_ins_tn; + + rtn = zxic_comm_rb_handle_ins(p_rb_cfg, stack_tn, stack_top); + ZXIC_COMM_CHECK_RC(rtn, "zxic_comm_rb_handle_ins"); + + /* 新插入时也返回 */ + if (p_rb_cfg->is_dynamic) + { + if (out_val) + { + *((ZXIC_RB_TN**)out_val) = p_ins_tn; + } + } + + return ZXIC_OK; +} + + + +ZXIC_RTN32 zxic_comm_rb_handle_del(ZXIC_RB_CFG *p_rb_cfg, + ZXIC_RB_TN***stack_tn, + ZXIC_UINT32 stack_top) +{ + ZXIC_RB_TN **pp_cur_tn = NULL; + ZXIC_RB_TN *p_cur_tn = NULL; + ZXIC_RB_TN *p_tmp_tn = NULL; + ZXIC_RB_TN *p_unc_tn = NULL; + ZXIC_RB_TN *p_par_tn = NULL; + + ZXIC_COMM_CHECK_POINT(p_rb_cfg); + ZXIC_COMM_CHECK_POINT(stack_tn); + + while (stack_top > 1 ) + { + pp_cur_tn = stack_tn[stack_top]; + p_cur_tn = *pp_cur_tn; + + p_par_tn = *stack_tn[stack_top - 1]; + + if (p_cur_tn && p_cur_tn->p_parent) + { + p_unc_tn = zxic_comm_rb_get_brotn(p_cur_tn); + } + else if (p_cur_tn && !p_cur_tn->p_parent) + { + ZXIC_COMM_ASSERT(p_par_tn == p_cur_tn->p_parent); + + SET_TN_COLOR(p_cur_tn, ZXIC_RBT_BLACK); + + break; + } + else + { + ZXIC_COMM_ASSERT(!p_cur_tn); + + if (p_par_tn) + { + p_unc_tn = p_par_tn->p_left ? p_par_tn->p_left : p_par_tn->p_right; + } + else + { + break; + } + } + + if (p_unc_tn) + { + ZXIC_COMM_ASSERT(p_unc_tn->p_parent == p_par_tn); + } + + if (GET_TN_COLOR(p_unc_tn) == ZXIC_RBT_RED) /*shift */ + { + ZXIC_COMM_CHECK_INDEX_BOTH(stack_top, 1, (ZXIC_RBT_MAX_DEPTH - 2)); + if (p_unc_tn == p_par_tn->p_left) /*shift right */ + { + *stack_tn[stack_top - 1] = p_unc_tn; + p_unc_tn->p_parent = p_par_tn->p_parent; + p_par_tn->p_left = p_unc_tn->p_right; + + if (p_unc_tn->p_right) + { + p_unc_tn->p_right->p_parent = p_par_tn; + } + + p_par_tn->p_parent = p_unc_tn; + p_unc_tn->p_right = p_par_tn; + + stack_tn[stack_top++] = &p_unc_tn->p_right; + ZXIC_COMM_CHECK_INDEX_UPPER(stack_top, (ZXIC_RBT_MAX_DEPTH - 1)); + stack_tn[stack_top] = &p_par_tn->p_right; + } + else /*shift left*/ + { + ZXIC_COMM_ASSERT(p_unc_tn == p_par_tn->p_right); + *stack_tn[stack_top - 1] = p_unc_tn; + p_unc_tn->p_parent = p_par_tn->p_parent; + p_par_tn->p_right = p_unc_tn->p_left; + + if (p_unc_tn->p_left) + { + p_unc_tn->p_left->p_parent = p_par_tn; + } + + p_par_tn->p_parent = p_unc_tn; + p_unc_tn->p_left = p_par_tn; + + stack_tn[stack_top++] = &p_unc_tn->p_left; + ZXIC_COMM_CHECK_INDEX_UPPER(stack_top, (ZXIC_RBT_MAX_DEPTH - 1)); + stack_tn[stack_top] = &p_par_tn->p_left; + } + + zxic_comm_rb_swich_color(p_unc_tn, p_par_tn); + } + else if (!p_unc_tn) + { + /*this branch will never run ,consider too much*/ + ZXIC_COMM_ASSERT(0); + ZXIC_COMM_ASSERT(GET_TN_COLOR(p_par_tn) == ZXIC_RBT_RED); + + SET_TN_COLOR(p_par_tn, ZXIC_RBT_BLACK); + + break; + } + else + { + if (GET_TN_COLOR(p_unc_tn->p_left) == ZXIC_RBT_BLACK && GET_TN_COLOR(p_unc_tn->p_right) == ZXIC_RBT_BLACK) + { + if (GET_TN_COLOR(p_unc_tn->p_parent) == ZXIC_RBT_BLACK) + { + SET_TN_COLOR(p_unc_tn, ZXIC_RBT_RED); + stack_top--; + } + else + { + ZXIC_COMM_ASSERT(GET_TN_COLOR(p_unc_tn->p_parent) == ZXIC_RBT_RED); + + zxic_comm_rb_swich_color(p_unc_tn->p_parent, p_unc_tn); + + break; + } + } + else if (p_unc_tn == p_par_tn->p_right) + { + if (GET_TN_COLOR(p_unc_tn->p_right) == ZXIC_RBT_RED) /*shift left*/ + { + *stack_tn[stack_top - 1] = p_unc_tn; + p_unc_tn->p_parent = p_par_tn->p_parent; + p_par_tn->p_right = p_unc_tn->p_left; + + if (p_unc_tn->p_left) + { + p_unc_tn->p_left->p_parent = p_par_tn; + } + + p_par_tn->p_parent = p_unc_tn; + p_unc_tn->p_left = p_par_tn; + + zxic_comm_rb_swich_color(p_unc_tn, p_par_tn); + + SET_TN_COLOR(p_unc_tn->p_right, ZXIC_RBT_BLACK); + + break; + } + else + { + ZXIC_COMM_ASSERT(GET_TN_COLOR(p_unc_tn->p_left) == ZXIC_RBT_RED); + + p_tmp_tn = p_unc_tn->p_left; + + p_par_tn->p_right = p_tmp_tn; + p_tmp_tn->p_parent = p_par_tn; + p_unc_tn->p_left = p_tmp_tn->p_right; + + if (p_tmp_tn->p_right) + { + p_tmp_tn->p_right->p_parent = p_unc_tn; + } + + p_tmp_tn->p_right = p_unc_tn; + p_unc_tn->p_parent = p_tmp_tn; + + zxic_comm_rb_swich_color(p_tmp_tn, p_unc_tn); + } + } + else + { + ZXIC_COMM_ASSERT(p_unc_tn == p_par_tn->p_left); + + if (GET_TN_COLOR(p_unc_tn->p_left) == ZXIC_RBT_RED) /*shift right*/ + { + *stack_tn[stack_top - 1] = p_unc_tn; + p_unc_tn->p_parent = p_par_tn->p_parent; + p_par_tn->p_left = p_unc_tn->p_right; + + if (p_unc_tn->p_right) + { + p_unc_tn->p_right->p_parent = p_par_tn; + } + + p_par_tn->p_parent = p_unc_tn; + p_unc_tn->p_right = p_par_tn; + + zxic_comm_rb_swich_color(p_unc_tn, p_par_tn); + + SET_TN_COLOR(p_unc_tn->p_left, ZXIC_RBT_BLACK); + break; + } + else + { + ZXIC_COMM_ASSERT(GET_TN_COLOR(p_unc_tn->p_right) == ZXIC_RBT_RED); + + p_tmp_tn = p_unc_tn->p_right; + + p_par_tn->p_left = p_tmp_tn; + p_tmp_tn->p_parent = p_par_tn; + p_unc_tn->p_right = p_tmp_tn->p_left; + + if (p_tmp_tn->p_left) + { + p_tmp_tn->p_left->p_parent = p_unc_tn; + } + + p_tmp_tn->p_left = p_unc_tn; + p_unc_tn->p_parent = p_tmp_tn; + + zxic_comm_rb_swich_color(p_tmp_tn, p_unc_tn); + } + } + } + } + + return ZXIC_OK; +} + +ZXIC_RTN32 zxic_comm_rb_delete(ZXIC_RB_CFG *p_rb_cfg, + ZXIC_VOID *p_key, + ZXIC_VOID *out_val) +{ + ZXIC_UINT32 rtn = 0; + ZXIC_UINT32 stack_top = 1; + ZXIC_SINT32 cmprtn = 0; + ZXIC_UINT32 rsv_stack = 0; + ZXIC_UINT32 del_is_red = 0; + + ZXIC_RB_TN **stack_tn[ZXIC_RBT_MAX_DEPTH] = {0}; + ZXIC_RB_TN *p_cur_tn = NULL; + ZXIC_RB_TN **pp_cur_tn = NULL; + ZXIC_VOID *p_cur_key = NULL; + ZXIC_RB_TN *p_rsv_tn = NULL; + ZXIC_RB_TN *p_del_tn = NULL; + + ZXIC_COMM_CHECK_POINT(p_rb_cfg); + ZXIC_COMM_CHECK_POINT(out_val); + + p_cur_key = p_key; + + pp_cur_tn = &p_rb_cfg->p_root; + + for (;;) + { + p_cur_tn = *pp_cur_tn; + + if (!p_cur_tn) + { + /*ZXIC_COMM_TRACE_ERROR("\n error ,the key is not exist !");*/ + return ZXIC_RBT_RC_SRHFAIL; + } + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW(stack_top, 1); + stack_tn[stack_top++] = pp_cur_tn; + + cmprtn = p_rb_cfg->p_cmpfun(p_cur_key, p_cur_tn->p_key, p_rb_cfg->key_size); + + if (cmprtn > 0) + { + pp_cur_tn = &p_cur_tn->p_right; + } + else if (cmprtn < 0) + { + pp_cur_tn = &p_cur_tn->p_left; + } + else + { + ZXIC_COMM_TRACE_ALL(" find the key!\n"); + + break; + } + } + ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW(stack_top, 1); + rsv_stack = stack_top - 1; /*save stack pos*/ + p_rsv_tn = p_cur_tn; + + pp_cur_tn = &p_cur_tn->p_right; + p_cur_tn = *pp_cur_tn; + + if (p_cur_tn) + { + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW(stack_top, 1); + stack_tn[stack_top++] = pp_cur_tn; + + pp_cur_tn = &p_cur_tn->p_left; + p_cur_tn = *pp_cur_tn; + + while (p_cur_tn) + { + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW(stack_top, 1); + stack_tn[stack_top++] = pp_cur_tn; + pp_cur_tn = &p_cur_tn->p_left; + p_cur_tn = *pp_cur_tn; + } + + /*get the del tn*/ + ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW(stack_top, 1); + p_del_tn = *stack_tn[stack_top - 1]; + + /*set tn is left child to cur place*/ + *stack_tn[stack_top - 1] = p_del_tn->p_right; + + if (p_del_tn->p_right) + { + p_del_tn->p_right->p_parent = p_del_tn->p_parent; + } + + /*rsv the del tn info for delete*/ + if (GET_TN_COLOR(p_del_tn) == ZXIC_RBT_RED) + { + del_is_red = 1; + } + + /*replace the delete val*/ + ZXIC_COMM_CHECK_INDEX_UPPER(rsv_stack, (ZXIC_RBT_MAX_DEPTH - 2)); + *stack_tn[rsv_stack] = p_del_tn; + + stack_tn[rsv_stack + 1] = &p_del_tn->p_right; + + SET_TN_COLOR(p_del_tn, GET_TN_COLOR(p_rsv_tn)); + p_del_tn->p_parent = p_rsv_tn->p_parent; + + p_del_tn->p_left = p_rsv_tn->p_left; + + if (p_rsv_tn->p_left) + { + p_rsv_tn->p_left->p_parent = p_del_tn; + } + + p_del_tn->p_right = p_rsv_tn->p_right; + + if (p_rsv_tn->p_right) + { + p_rsv_tn->p_right->p_parent = p_del_tn; + } + } + else + { + if (GET_TN_COLOR(p_rsv_tn) == ZXIC_RBT_RED) + { + del_is_red = 1; + } + + ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW(stack_top, 1); + *stack_tn[stack_top - 1] = p_rsv_tn->p_left; + + if (p_rsv_tn->p_left) + { + p_rsv_tn->p_left->p_parent = p_rsv_tn->p_parent; + } + } + + ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW(stack_top, 1); + stack_top--; + ZXIC_COMM_CHECK_INDEX_UPPER(stack_top, (ZXIC_RBT_MAX_DEPTH - 1)); + if (GET_TN_COLOR(*stack_tn[stack_top]) == ZXIC_RBT_RED) + { + SET_TN_COLOR(*stack_tn[stack_top], ZXIC_RBT_BLACK); + } + else if (!del_is_red) /*del node is red ,do nothing*/ + { + rtn = zxic_comm_rb_handle_del(p_rb_cfg, stack_tn, stack_top); + ZXIC_COMM_CHECK_RC(rtn, "zxic_comm_rb_handle_del"); + } + + /*clear the node from the list */ + rtn = zxic_comm_double_link_del(&p_rsv_tn->tn_ln, &p_rb_cfg->tn_list); + ZXIC_COMM_CHECK_RC(rtn, "zxic_comm_double_link_del"); + + if (p_rb_cfg->is_dynamic) + { + *(ZXIC_RB_TN**)out_val = p_rsv_tn; + } + else + { + rtn = zxic_comm_liststack_free(p_rb_cfg->p_lsm, GET_TN_LSV(p_rsv_tn)); + ZXIC_COMM_CHECK_RC(rtn, "zxic_comm_liststack_free"); + + *(ZXIC_UINT32*)out_val = GET_TN_LSV(p_rsv_tn); + + ZXIC_COMM_MEMSET(p_rsv_tn->p_key, 0, p_rb_cfg->key_size); + ZXIC_COMM_MEMSET(p_rsv_tn, 0, ZXIC_SIZEOF(ZXIC_RB_TN)); + } + + return ZXIC_OK; +} + +/* 注意此处传入的p_key和insert时候传入的p_key不是同一个东西 */ +ZXIC_RTN32 zxic_comm_rb_search(ZXIC_RB_CFG *p_rb_cfg, + ZXIC_VOID *p_key, + ZXIC_VOID *out_val) +{ + ZXIC_SINT32 cmprtn = 0; + ZXIC_RB_TN *p_cur_tn = NULL; + + ZXIC_COMM_CHECK_POINT(p_rb_cfg); + ZXIC_COMM_CHECK_POINT(p_key); + ZXIC_COMM_CHECK_POINT(out_val); + + p_cur_tn = p_rb_cfg->p_root; + + while (p_cur_tn) + { + cmprtn = p_rb_cfg->p_cmpfun(p_key, p_cur_tn->p_key, p_rb_cfg->key_size); + + if (cmprtn > 0) + { + p_cur_tn = p_cur_tn->p_right; + } + else if (cmprtn < 0) + { + p_cur_tn = p_cur_tn->p_left; + } + else + { + break; + } + } + + if (!p_cur_tn) + { + ZXIC_COMM_TRACE_ALL("rb srh fail \n"); + return ZXIC_RBT_RC_SRHFAIL; + } + + if (p_rb_cfg->is_dynamic) + { + *(ZXIC_RB_TN**)out_val = p_cur_tn; + } + else + { + *(ZXIC_UINT32*)out_val = GET_TN_LSV(p_cur_tn); + } + + return ZXIC_OK; +} + +ZXIC_SINT32 zxic_comm_rb_is_none(ZXIC_RB_CFG* p_rb_cfg) +{ + ZXIC_COMM_CHECK_POINT(p_rb_cfg); + + if (0 == p_rb_cfg->tn_list.used) + { + return 1; + } + else + { + return 0; + } +} + +ZXIC_RB_TN *zxic_comm_rb_get_1st_tn(ZXIC_RB_CFG *p_rb_cfg) +{ + ZXIC_COMM_CHECK_POINT_RETURN_NULL(p_rb_cfg); + + return (p_rb_cfg->p_root) ? p_rb_cfg->tn_list.p_next->data : NULL; +} + +ZXIC_RTN32 zxic_comm_rb_get_1st_key(ZXIC_RB_CFG* p_rb_cfg, ZXIC_VOID *p_key_out) +{ + D_NODE *rb_list_node = NULL; + ZXIC_RB_TN *p_rb_node = NULL; + + ZXIC_COMM_CHECK_POINT(p_rb_cfg); + ZXIC_COMM_CHECK_POINT(p_key_out); + + if (zxic_comm_rb_is_none(p_rb_cfg)) + { + return ZXIC_RBT_ISEMPTY_ERR; + } + + rb_list_node = p_rb_cfg->tn_list.p_next; + ZXIC_COMM_CHECK_POINT(rb_list_node); + + p_rb_node = (ZXIC_RB_TN *)rb_list_node->data; + ZXIC_COMM_CHECK_POINT(p_rb_node); + + ZXIC_COMM_MEMCPY_S(p_key_out, p_rb_cfg->key_size, p_rb_node->p_key, p_rb_cfg->key_size); + + return ZXIC_OK; +} + +ZXIC_RB_TN *zxic_comm_rb_get_last_tn(ZXIC_RB_CFG *p_rb_cfg) +{ + ZXIC_COMM_CHECK_POINT_RETURN_NULL(p_rb_cfg); + + return (p_rb_cfg->p_root) ? p_rb_cfg->tn_list.p_prev->data : NULL; +} + +ZXIC_RTN32 zxic_comm_rb_get_last_key(ZXIC_RB_CFG* p_rb_cfg, ZXIC_VOID *p_key_out) +{ + D_NODE *p_rb_list_node = NULL; + ZXIC_RB_TN *p_rb_node = NULL; + + ZXIC_COMM_CHECK_POINT(p_rb_cfg); + + if (zxic_comm_rb_is_none(p_rb_cfg)) + { + return ZXIC_RBT_ISEMPTY_ERR; + } + + p_rb_list_node = p_rb_cfg->tn_list.p_prev; + + p_rb_node = (ZXIC_RB_TN *)p_rb_list_node->data; + ZXIC_COMM_MEMCPY_S(p_key_out, p_rb_cfg->key_size, p_rb_node->p_key, p_rb_cfg->key_size); + + return ZXIC_OK; +} + +/* 不支持动态内存分配模式, 此函数仅用于CPU软复位 */ +ZXIC_RTN32 zxic_comm_rb_insert_spec_index(ZXIC_RB_CFG *p_rb_cfg, ZXIC_VOID *p_key, ZXIC_UINT32 in_idx) +{ + ZXIC_UINT32 rtn = 0; + ZXIC_UINT32 stack_top = 1; + ZXIC_SINT32 cmprtn = 0; + + ZXIC_RB_TN **stack_tn[ZXIC_RBT_MAX_DEPTH] = {0}; + //ZXIC_RB_TN **pp_tmp_tn = NULL; + ZXIC_RB_TN *p_cur_tn = NULL; + ZXIC_RB_TN *p_pre_tn = NULL; + ZXIC_RB_TN **pp_cur_tn = NULL; + ZXIC_VOID *p_cur_key = NULL; + ZXIC_RB_TN *p_ins_tn = p_key; + + ZXIC_COMM_CHECK_POINT(p_rb_cfg); + ZXIC_COMM_CHECK_POINT(p_key); + + if (p_rb_cfg->is_dynamic) + { + ZXIC_COMM_PRINT("zxic_comm_rb_insert_spec_index: dynamic mode is not support ! Error"); + return ZXIC_RBT_PARA_INVALID; + } + + p_cur_key = p_key; + + pp_cur_tn = &p_rb_cfg->p_root; + + for (;;) + { + p_cur_tn = *pp_cur_tn; + + if (!p_cur_tn) /*find the insert position*/ + { + rtn = zxic_comm_liststack_alloc_spec_index(p_rb_cfg->p_lsm, in_idx); + ZXIC_COMM_CHECK_RC(rtn, "zxic_comm_liststack_alloc_spec_index"); + + p_ins_tn = p_rb_cfg->p_tnbase + in_idx; + + ZXIC_COMM_CHECK_INDEX_MUL_OVERFLOW(p_rb_cfg->key_size, in_idx); + INIT_RBT_TN(p_ins_tn, p_rb_cfg->key_size * in_idx + p_rb_cfg->p_keybase); + + ZXIC_COMM_MEMCPY_S(p_ins_tn->p_key, p_rb_cfg->key_size, p_key, p_rb_cfg->key_size); + + SET_TN_LSV(p_ins_tn, in_idx); + + /*all insert tn color set to red*/ + SET_TN_COLOR(p_ins_tn, ZXIC_RBT_RED); + + /*insert list*/ + if (cmprtn < 0) + { + rtn = zxic_comm_double_link_insert_pre(&p_ins_tn->tn_ln, &p_pre_tn->tn_ln, &p_rb_cfg->tn_list); + ZXIC_COMM_CHECK_RC(rtn, "zxic_comm_double_link_insert_pre"); + } + else if (cmprtn > 0) + { + rtn = zxic_comm_double_link_insert_aft(&p_ins_tn->tn_ln, &p_pre_tn->tn_ln, &p_rb_cfg->tn_list); + ZXIC_COMM_CHECK_RC(rtn, "zxic_comm_double_link_insert_aft"); + } + else + { + /*first insert*/ + ZXIC_COMM_ASSERT(!p_pre_tn); + + rtn = zxic_comm_double_link_insert_1st(&p_ins_tn->tn_ln, &p_rb_cfg->tn_list); + ZXIC_COMM_CHECK_RC(rtn, "zxic_comm_double_link_insert_1st"); + } + + /*get out loop */ + break; + } + + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW(stack_top, 1); + stack_tn[stack_top++] = pp_cur_tn; + p_pre_tn = p_cur_tn; + cmprtn = p_rb_cfg->p_cmpfun(p_cur_key, p_cur_tn->p_key, p_rb_cfg->key_size); + + if (cmprtn > 0) + { + pp_cur_tn = &p_cur_tn->p_right; + } + else if (cmprtn < 0) + { + pp_cur_tn = &p_cur_tn->p_left; + } + else + { + ZXIC_COMM_TRACE_ALL("info ,rb_key is same \n"); + + return ZXIC_RBT_RC_UPDATE; + } + } + + /*handle parenet ptr*/ + p_ins_tn->p_parent = (stack_top != 1) ? *stack_tn[stack_top - 1] : NULL; + + stack_tn[stack_top] = pp_cur_tn; + + *pp_cur_tn = p_ins_tn; + + rtn = zxic_comm_rb_handle_ins(p_rb_cfg, stack_tn, stack_top); + ZXIC_COMM_CHECK_RC(rtn, "zxic_comm_rb_handle_ins"); + + return ZXIC_OK; +} + + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_common.c b/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_common.c new file mode 100644 index 0000000..89306a2 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_common.c @@ -0,0 +1,1009 @@ +/************************************************************** +* 版权所有 (C)2013-2020, 深圳市中兴通讯股份有限公司 +* 文件名称 : zxic_common.c +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : xuchenxi_10235594 +* 完成日期 : 2020/07/20 +* DEPARTMENT: 有线开发四部-系统软件团队 +* MANUAL_PERCENT: 0% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ +#include "zxic_common.h" + +#if ZXIC_REAL("全局变量") +ZXIC_UINT32 g_zxic_malloc_num = 0; +ZXIC_UINT32 g_zxic_malloc_size = 0; /* 单位字节 */ +ZXIC_UINT32 g_zxic_byte_swap_en = 1; +ZXIC_UINT32 g_zxic_comm_channel_max = 4; +#endif + +#if ZXIC_REAL("内存") +/***********************************************************/ +/** 释放内存 +* @param p_data +* +* @return +* @remark 无 +* @see +* @author ChenWei10088471 @date 2014/02/07 +************************************************************/ +ZXIC_VOID ic_comm_free_record(void) +{ + if (g_zxic_malloc_num > 0) + { + g_zxic_malloc_num--; + } + else + { + ZXIC_COMM_TRACE_ERROR("Note:g_zxicp_malloc_num is zero now\n"); + } +} + +/***********************************************************/ +/** 分配内存 +* @param size +* +* @return +* @remark 无 +* @see +* @author ChenWei10088471 @date 2014/02/07 +************************************************************/ +ZXIC_VOID* ic_comm_malloc_memory(ZXIC_UINT32 size) +{ + /* 独立安全测评 限定申请内存的大小 */ + if(size > ZXIC_MALLOC_MAX_B_SIZE) + { + ZXIC_COMM_TRACE_ERROR("malloc size err, size more than 200M \n"); + return ZXIC_NULL; + } + if (g_zxic_malloc_num < ZXIC_UINT32_MAX) + { + g_zxic_malloc_num++; + } + else + { + ZXIC_COMM_TRACE_ERROR("Note:g_zxicp_malloc_num is maxvalue now, reset 0\n"); + g_zxic_malloc_num = 0; + } + + if (g_zxic_malloc_size < (ZXIC_UINT32_MAX - size)) + { + g_zxic_malloc_size += size; + } + else + { + ZXIC_COMM_TRACE_INFO("Note:g_zxic_malloc_size[0x%x] and size[0x%x] sum is over maxvalue now, reset 0\n", g_zxic_malloc_size, size); + g_zxic_malloc_size = 0; + } + return kmalloc(size,GFP_KERNEL); +} +#endif /* 内存 */ + +#if ZXIC_REAL("延时") +/***********************************************************/ +/** 毫秒级延时 +* @param milliseconds +* +* @return +* @remark 无 +* @see +* @author ChenWei10088471 @date 2014/02/07 +************************************************************/ +// ZXIC_VOID zxic_comm_sleep(ZXIC_UINT32 milliseconds) +// { +// /* 打桩测试不需要延时 modify by zhangjintao 2022.01.21 */ +// #ifndef ZXIC_FOR_LLT +// #ifdef ZXIC_OS_WIN +// Sleep(milliseconds); +// #else +// ZXIC_COMM_CHECK_INDEX_MUL_OVERFLOW_NONE((ZXIC_UINT32)milliseconds, 1000); + +// msleep(milliseconds); +// #endif +// #endif +// } + +/***********************************************************/ +/** 微秒级延时,互坼锁中使用 +* @param milliseconds +* +* @return +* @remark +* @see +* @author fyl @date 2020/04/09 +************************************************************/ +ZXIC_VOID zxic_comm_udelay(ZXIC_UINT32 microseconds) +{ +#ifndef ZXIC_FOR_LLT + + ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW_NONE(microseconds, 1); + + udelay(microseconds); +#endif +} + +/***********************************************************/ +/** 毫秒级延时,互坼锁中使用 +* @param milliseconds +* +* @return +* @remark 无 +* @see +* @author ChenWei10088471 @date 2014/02/07 +************************************************************/ +ZXIC_VOID zxic_comm_delay(ZXIC_UINT32 milliseconds) +{ +#ifndef ZXIC_FOR_LLT + // ZXIC_UINT32 i = 0; + + ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW_NONE(milliseconds, 1); + // while (--milliseconds != 0) + // { + // for (i = 0; i < 600; i++); + // } + mdelay(milliseconds); +#endif +} + +/***********************************************************/ +/** LINUX :毫秒级延时 + WINDOWS:毫秒级延时 +* @param millisecond +* +* @return +* @remark 无 +* @see +* @author ChenWei10088471 @date 2014/02/07 +************************************************************/ +ZXIC_VOID zxic_comm_msleep(ZXIC_UINT32 millisecond) +{ +#ifndef ZXIC_FOR_LLT +#ifdef ZXIC_OS_WIN + Sleep(millisecond); +#else + msleep(millisecond); +#endif +#endif +} + +/***********************************************************/ +/**获取时间函数,毫秒 +* @param total +* @param masklen +* +* @return +* @remark 无 +* @see +* @author ChenWei10088471 @date 2014/02/07 +************************************************************/ +ZXIC_DOUBLE zxic_comm_get_ticks_ms() +{ +#ifdef ZXIC_OS_WIN + return (ZXIC_FLOAT)GetTickCount(); +#else + struct timespec64 tv = {0}; + get_timespec64(&tv, ZXIC_NULL); + return (ZXIC_DOUBLE)1000 * tv.tv_sec + (ZXIC_DOUBLE)tv.tv_nsec / 1000; +#endif +} +#endif + +#if ZXIC_REAL("字节序") +/***********************************************************/ +/** 判断CPU的大小端字节序 +* @param ZXIC_VOID +* +* @return 0-小端;1-大端 +* @remark 无 +* @see +* @author ChenWei10088471 @date 2014/02/07 +************************************************************/ +ZXIC_RTN32 zxic_comm_is_big_endian(ZXIC_VOID) +{ + ZXIC_ENDIAN_U c_data; + + c_data.a = 1; + + if (c_data.b == 1) + { + return 0; + } + else + { + return 1; + } +} + +/***********************************************************/ +/** 字节序转换,以4字节为单位进行转序 +* @param p_uc_data +* @param dw_byte_len +* +* @return +* @remark 无 +* @see +* @author ChenWei10088471 @date 2014/02/07 +************************************************************/ +ZXIC_VOID zxic_comm_swap(ZXIC_UINT8 *p_uc_data, ZXIC_UINT32 dw_byte_len) +{ + ZXIC_UINT32 dw_byte_num = 0; + ZXIC_UINT8 uc_byte_mode = 0; + ZXIC_UINT32 uc_is_big_flag = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT16 *p_w_tmp = ZXIC_NULL; + ZXIC_UINT32 *p_dw_tmp = ZXIC_NULL; + + if (g_zxic_byte_swap_en) + { + + p_dw_tmp = (ZXIC_UINT32 *)(p_uc_data); + + uc_is_big_flag = zxic_comm_is_big_endian(); + + if (uc_is_big_flag) + { + return; + } + else + { + dw_byte_num = dw_byte_len >> 2; + uc_byte_mode = dw_byte_len % 4 & 0xff; + + for (i = 0; i < dw_byte_num; i++) + { + (*p_dw_tmp) = ZXIC_COMM_CONVERT32(*p_dw_tmp); + p_dw_tmp++; + } + + if (uc_byte_mode > 1) + { + p_w_tmp = (ZXIC_UINT16 *)(p_dw_tmp); + (*p_w_tmp) = ZXIC_COMM_CONVERT16(*p_w_tmp); + } + } + } + + return; +} + +/***********************************************************/ +/** WORD32拼装成WORD64 +* @param hi 高32bit +* @param lo 低32bit +* +* @return WORD64 +* @remark 无 +* @see +* @author pj @date 2019/10/22 +************************************************************/ +ZXIC_UINT64 ZXIC_COMM_COUNTER64_BUILD(ZXIC_UINT32 hi, ZXIC_UINT32 lo) +{ + ZXIC_UINT64 value = hi; + + value = value << 32; + value = value | lo; + + return value; +} +#endif + +#if ZXIC_REAL("bit操作") +/***********************************************************/ +/** 将数据写入缓存区的指定bit位置,一次只能写入32bit的数据 + p_base的低字节存放数据的低比特,高字节存放数据的高比特。 +* @param p_base 数据缓存区指针 +* @param base_size_bit 缓存总的bit位宽 +* @param data 数据, 比特顺序左低右高,小端比特序 +* @param start_bit 起始bit位置(必须小于结束bit位置) +* @param end_bit 结束bit位置 +* +* @return +* @remark exp: + ZXIC_UINT8 data0[4] = {0x22, 0x44, 0x66, 0x88}; + zxic_comm_write_bits(data0, 32, 0xAABBCC, 0,23); + ZXIC_COMM_PRINT("0x%02X %02X %02X %02X \n", data0[0], data0[1], data0[2], data0[3]); + 输出:0xAA BB CC 88 + +* @see +* @author ChenWei10088471 @date 2014/02/07 +************************************************************/ +ZXIC_RTN32 zxic_comm_write_bits(ZXIC_UINT8 * p_base, + ZXIC_UINT32 base_size_bit, + ZXIC_UINT32 data, + ZXIC_UINT32 start_bit, + ZXIC_UINT32 end_bit) +{ + ZXIC_UINT32 len = 0; + ZXIC_UINT32 start_byte_index = 0; + ZXIC_UINT32 end_byte_index = 0; + ZXIC_UINT8 mask_value = 0; + ZXIC_UINT32 byte_num = 0; + ZXIC_UINT32 buffer_size = 0; + + if (0 != (base_size_bit % 8)) + { + ZXIC_COMM_TRACE_ERROR("\n buffer must be:%d", __LINE__); + //assert(0); + return ZXIC_BIT_STREAM_INDEX_ERR; + } + + if (start_bit > end_bit) + { + ZXIC_COMM_TRACE_ERROR("\nend_bit cannot be less than start_bit:%d", __LINE__); + //assert(0); + return ZXIC_BIT_STREAM_INDEX_ERR; + } + + if (base_size_bit < end_bit) + { + ZXIC_COMM_TRACE_ERROR("\nend_bit exceeds the base_size!line:%d,base_size_bit:%d end_bit:%d", + __LINE__, base_size_bit, end_bit); + //assert(0); + return ZXIC_BIT_STREAM_INDEX_ERR; + } + + ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW(end_bit, start_bit); + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW(end_bit - start_bit, 1); + + len = end_bit - start_bit + 1; + buffer_size = base_size_bit / 8; + + /*寄存器位宽需要时2的次方,如不是,需要累加到最近的2的次方*/ + /*用于解决KW检查中zxic_comm_write_bits_ex出现的内存泄漏错误*/ + ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW(buffer_size, 1); + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW(buffer_size, 1); + + while (0 != (buffer_size & (buffer_size - 1))) + { + buffer_size += 1; + } + + if (buffer_size != base_size_bit / 8) + { + ZXIC_COMM_TRACE_ALL("\n buffer size[0x%x] is not 2^n: add up to [0x%x]", base_size_bit / 8, buffer_size); + } + + + + /*一次只能写32bit*/ + ZXIC_COMM_CHECK_INDEX(len, 1, 32); + + if (data > (ZXIC_UINT32)(0xffffffff >> (32 - len))) + { + ZXIC_COMM_PRINT("\nValue is too big to write in the bit field!:%d,data:%x,len:%x", + __LINE__, data, (ZXIC_UINT32)(0xffffffff >> (32 - len))); + return ZXIC_BIT_STREAM_DATA_TOO_BIG; + } + + end_byte_index = (end_bit >> 3); + start_byte_index = (start_bit >> 3); + + if (start_byte_index == end_byte_index) + { + mask_value = ((0xFE << (7 - (start_bit & 7))) & 0xff); + mask_value |= (((1 << (7 - (end_bit & 7))) - 1)& 0xff); + p_base[end_byte_index] &= mask_value; + p_base[end_byte_index] |= (((data << (7 - (end_bit & 7)))) & 0xff); + return ZXIC_OK; + } + + if (7 != (end_bit & 7)) + { + mask_value = ((0x7f >> (end_bit & 7)) & 0xff); + p_base[end_byte_index] &= mask_value; + p_base[end_byte_index] |= ((data << (7 - (end_bit & 7))) & 0xff); + end_byte_index--; + data >>= 1 + (end_bit & 7); + } + + for (byte_num = end_byte_index; byte_num > start_byte_index; byte_num--) + { + /* critical */ + p_base[byte_num & (buffer_size - 1)] = data & 0xff; + data >>= 8; + } + + mask_value = ((0xFE << (7 - (start_bit & 7))) & 0xff); + p_base[byte_num] &= mask_value; + p_base[byte_num] |= data; + + return ZXIC_OK; +} + +/***********************************************************/ +/** 从缓存区中读取指定bit位置的数据,一次最多只能读32bit +* @param p_base 数据缓存区指针 +* @param base_size_bit 缓存区总的bit位宽 +* @param p_data 返回数据的指针 +* @param start_bit 起始bit位置(必须小于结束bit位置) +* @param end_bit 结束bit位置 +* +* @return +* @remark exp: + ZXIC_UINT8 data0[4] = {0x22, 0x44, 0x66, 0x88}; + ZXIC_UINT32 test_a = 0; + zxic_comm_read_bits(data0, 32, &test_a, 0, 23); + 输出: test_a = 0x224466 +* @see +* @author ChenWei10088471 @date 2014/02/07 +************************************************************/ +ZXIC_RTN32 zxic_comm_read_bits(ZXIC_UINT8* p_base, + ZXIC_UINT32 base_size_bit, + ZXIC_UINT32* p_data, + ZXIC_UINT32 start_bit, + ZXIC_UINT32 end_bit) +{ + ZXIC_UINT32 len = 0; + ZXIC_UINT32 start_byte_index = 0; + ZXIC_UINT32 end_byte_index = 0; + ZXIC_UINT32 byte_num = 0; + ZXIC_UINT32 buffer_size = 0; + + if (0 != (base_size_bit % 8)) + { + ZXIC_COMM_TRACE_ERROR("\n buffer must be:%d", __LINE__); + return ZXIC_BIT_STREAM_INDEX_ERR; + } + + if (start_bit > end_bit) + { + ZXIC_COMM_TRACE_ERROR("\nend_bit cannot be less than start_bit:%d", __LINE__); + return ZXIC_BIT_STREAM_INDEX_ERR; + } + + if (base_size_bit < end_bit) + { + ZXIC_COMM_TRACE_ERROR("\nend_bit exceeds the base_size:%d,end_bit:%d", __LINE__, end_bit); + return ZXIC_BIT_STREAM_INDEX_ERR; + } + + len = end_bit - start_bit + 1; + buffer_size = base_size_bit / 8; + + /*寄存器位宽需要时2的次方,如不是,需要累加到最近的2的次方*/ + /*用于解决KW检查中zxic_comm_read_bits_ex出现的内存泄漏错误*/ + ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW(buffer_size, 1); + + while (0 != (buffer_size & (buffer_size - 1))) + { + buffer_size += 1; + } + + if (buffer_size != base_size_bit / 8) + { + ZXIC_COMM_TRACE_ALL("\n buffer size[0x%x] is not 2^n: add up to [0x%x]", base_size_bit / 8, buffer_size); + } + + /*先将返回的数据清零*/ + *p_data = 0; + + /*一次最多只能读32bit*/ + ZXIC_COMM_CHECK_INDEX(len, 1, 32); + + end_byte_index = (end_bit >> 3); + start_byte_index = (start_bit >> 3); + + if (start_byte_index == end_byte_index) + { + *p_data = (ZXIC_UINT32)(((p_base[start_byte_index] >> (7U - (end_bit & 7))) & (0xff >> (8U - len))) & 0xff); + return ZXIC_OK; + } + + if (start_bit & 7) + { + *p_data = (p_base[start_byte_index] & (0xff >> (start_bit & 7))) & ZXIC_UINT8_MASK; + start_byte_index++; + } + + for (byte_num = start_byte_index; byte_num < end_byte_index; byte_num++) + { + *p_data <<= 8; + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW(*p_data, p_base[byte_num]); + *p_data += p_base[byte_num]; + } + + *p_data <<= 1 + (end_bit & 7); + /* critical */ + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW(*p_data, (((p_base[byte_num & (buffer_size - 1)] & (0xff << (7 - (end_bit & 7)))) >> (7 - (end_bit & 7))) & 0xff)); + *p_data += ((p_base[byte_num & (buffer_size - 1)] & (0xff << (7 - (end_bit & 7)))) >> (7 - (end_bit & 7))) & 0xff; + + return ZXIC_OK; +} + +/***********************************************************/ +/** 比特流拼装,比特流的形式为: p_base的低字节存放 + 数据的高比特,高字节存放数据的低比特。 +* @param p_base +* @param base_size_bit +* @param data 数据, 比特顺序左高右低,大端比特序 +* @param msb_start_pos 数据最高比特的位置 +* @param len 数据长度 +* +* @return +* @remark exp: + ZXIC_UINT8 data0[4] = {0x22, 0x44, 0x66, 0x88}; + zxic_comm_write_bits_ex(data0, 32, 0x123456, 23,24); + ZXIC_COMM_PRINT("0x%02X %02X %02X %02X \n", data0[0], data0[1], data0[2], data0[3]); + 输出:0x22 12 34 56 + +* @see +* @author 王春雷 @date 2014/03/08 +************************************************************/ +ZXIC_RTN32 zxic_comm_write_bits_ex(ZXIC_UINT8 * p_base, + ZXIC_UINT32 base_size_bit, + ZXIC_UINT32 data, + ZXIC_UINT32 msb_start_pos, + ZXIC_UINT32 len) +{ + ZXIC_RTN32 rtn = ZXIC_OK; + ZXIC_COMM_CHECK_POINT(p_base); + + ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW(base_size_bit, 1); + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW(base_size_bit - 1, msb_start_pos); + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW(base_size_bit - 1 - msb_start_pos, len); + ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW(base_size_bit - 1 - msb_start_pos + len, 1); + + rtn = zxic_comm_write_bits(p_base, + base_size_bit, + data, + (base_size_bit - 1 - msb_start_pos), + (base_size_bit - 1 - msb_start_pos + len - 1)); + + return rtn; +} + +/***********************************************************/ +/** 从比特流中读取数据,比特流的形式为: p_base的低字节存放 + 数据的高比特,高字节存放数据的低比特。 +* @param p_base +* @param base_size_bit +* @param p_data +* @param msb_start_pos +* @param len +* +* @return +* @remark exp: + ZXIC_UINT8 data0[4] = {0x22, 0x44, 0x66, 0x88}; + zxic_comm_read_bits_ex(data0, 32, &test_a, 23, 24); + ZXIC_COMM_PRINT("0test_a = 0x%x \n", test_a); + 输出: 0test_a = 0x446688 + +* @see +* @author 王春雷 @date 2014/03/08 +************************************************************/ +ZXIC_RTN32 zxic_comm_read_bits_ex(ZXIC_UINT8 * p_base, + ZXIC_UINT32 base_size_bit, + ZXIC_UINT32 * p_data, + ZXIC_UINT32 msb_start_pos, + ZXIC_UINT32 len) +{ + ZXIC_RTN32 rtn = ZXIC_OK; + ZXIC_COMM_CHECK_POINT(p_base); + ZXIC_COMM_CHECK_POINT(p_data); + + ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW(base_size_bit, 1); + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW(base_size_bit - 1, msb_start_pos); + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW(base_size_bit - 1 - msb_start_pos, len); + ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW(base_size_bit - 1 - msb_start_pos + len, 1); + + rtn = zxic_comm_read_bits(p_base, + base_size_bit, + p_data, + (base_size_bit - 1 - msb_start_pos), + (base_size_bit - 1 - msb_start_pos + len - 1)); + return rtn; +} +#endif /* */ + +#if ZXIC_REAL("字符串") +/***********************************************************/ +/** +* @param buffer 目标字符串 +* @param sizeofbuf sizeofbuffer +* @param count 要拷贝字节数 +* @param format +* +* @return 待拷贝的实际字符串长度 +* @remark snprintf +* @see +* @author sj @date 2020/12/09 +************************************************************/ +ZXIC_SINT32 ic_comm_snprintf_s(ZXIC_CHAR *buffer, ZXIC_SIZE_T sizeofbuf, ZXIC_SIZE_T count, const ZXIC_CHAR *format, ...) +{ + va_list ap; + ZXIC_SINT32 ret = -1; + + if ((ZXIC_NULL == buffer)||(ZXIC_NULL == format)) + { + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__); + return ret; + } + if (!count) + { + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d[Error:count err], FUNCTION : %s!\n", __FILE__, __LINE__, __FUNCTION__); + return ret; + } + va_start(ap, format); + ret = ZXIC_COMM_VSNPRINTF_S(buffer, sizeofbuf, count, format, ap); + va_end(ap); + + if (ret == -1) + { + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d[Error:snprintf_s err], FUNCTION : %s!\n", __FILE__, __LINE__, __FUNCTION__); + } + return ret; +} +/***********************************************************/ +/** +* @param buffer 目标字符串 +* @param sizeofbuf sizeofbuffer +* @param count 要拷贝字节数 +* @param format +* +* @return 待拷贝的实际字符串长度 +* @remark vsnprintf +* @see +* @author sj @date 2020/12/09 +************************************************************/ +ZXIC_SINT32 ic_comm_vsnprintf_s(ZXIC_CHAR *buffer, ZXIC_SIZE_T sizeofbuf, ZXIC_SIZE_T count, const ZXIC_CHAR *format, va_list ap) +{ + ZXIC_SINT32 ret = -1; + + if ((ZXIC_NULL == buffer)||(ZXIC_NULL == format)) + { + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__); + return ret; + } + if (!count) + { + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d[Error:count err], FUNCTION : %s!\n", __FILE__, __LINE__, __FUNCTION__); + return ret; + } + if (count < sizeofbuf) + { + sizeofbuf = count; + } +#ifdef ZXIC_OS_WIN + ret = _vsnprintf(buffer, sizeofbuf, format, ap); +#else + ret = vsnprintf(buffer, sizeofbuf, format, ap); +#endif + if (ret == -1) + { + ZXIC_COMM_TRACE_ERROR("\n ZXIC %s:%d[Error:vsnprintf err], FUNCTION : %s!\n", __FILE__, __LINE__, __FUNCTION__); + } + return ret; +} + +/***********************************************************/ +/** +* @param pcDst    目的地址 +* @param dwMaxSize 目的长度 +* @param pcSrc    源地址 +* @param dwCount  要复制的最大字符数 +* +* @return +* @remark 将源地址的字符拷贝到目的字符数组; +* @see +* @author +************************************************************/ +ZXIC_CHAR *ic_comm_strncpy_s( ZXIC_CHAR *pcDst, size_t dwMaxSize, ZXIC_CONST ZXIC_CHAR *pcSrc, size_t dwCount ) +{ + size_t dwIndex = 1, dwCopyNum = dwCount; + ZXIC_CHAR *pcResult = pcDst; + + ZXIC_COMM_CHECK_RC_POINT_NO_PRINT(pcDst, pcResult); + ZXIC_COMM_CHECK_RC_POINT_NO_PRINT(pcSrc, pcResult); + + if (( dwMaxSize <= 1 ) || (dwMaxSize > ZXIC_COMM_MEMORY_MAX_B_SIZE) || ( dwCount == 0 ) ) + { + return pcResult; + } + + /* 计算拷贝的字符长度,不含结束符 */ + if ( dwCount >= dwMaxSize ) + { + dwCopyNum = dwMaxSize - 1; + } + + if (ic_comm_getAbsValue((unsigned ZXIC_CHAR*)pcDst, (ZXIC_CONST ZXIC_UINT8*)pcSrc) < dwCopyNum) + { + return pcResult; + } + + while ( '\0' != ( *pcDst++ = *pcSrc++ ) ) + { + /* 判断拷贝字符数是否等于dwCopyNum,等于就退出 */ + /* 由于判断放在循环体内,进行判断前已经拷贝了一次,所以i初试值为1 */ + if ( dwIndex++ >= dwCopyNum ) + { + *pcDst = '\0'; + + return pcResult; + } + } + + /* 本处的处理是为了保持和库函数中的解释一致,对于源串长度小于dwCopyNum,剩余部分全部填0 */ + while ( dwIndex++ <= dwCopyNum ) + { + *pcDst++ = '\0'; + } + + return pcResult; +} + +ZXIC_SIZE_T ic_comm_getAbsValue(ZXIC_UINT8* dest, ZXIC_CONST ZXIC_UINT8* src) +{ + return dest > src ? (dest - src) : (src - dest); +} +/***********************************************************/ +/** +* @param dest   目的地址 +* @param src  源地址 +* @param n   要复制的长度 +* +* @return +* @remark 从源地址拷贝若干字节的长度到目的内存处 +* @see +* @author +************************************************************/ +ZXIC_RTN32 ic_comm_memcpy(ZXIC_VOID* dest, ZXIC_CONST ZXIC_VOID* src, size_t n) +{ + ZXIC_COMM_CHECK_POINT(dest); + ZXIC_COMM_CHECK_POINT(src); + + /* memcpy 的大小限制在200M */ + if(n > 200 * 1024 * 1024) + { + return ZXIC_PAR_CHK_INVALID_PARA; + } + + if (ic_comm_getAbsValue((ZXIC_UINT8*)dest, (ZXIC_CONST ZXIC_UINT8*)src) < n) + { + return ZXIC_ERR; + } +#ifdef ZXIC_OS_WIN + memcpy(dest, src, n); +#else + //__memcpy_chk(dest, src, n, n); + memcpy(dest,src,n); +#endif + return ZXIC_OK; +} +/***********************************************************/ +/** +* @param dest   目的地址 +* @param dest_len 目的长度 +* @param src  源地址 +* @param n   要复制的长度 +* +* @return +* @remark 从源地址拷贝若干字节的长度到目的内存处,增加源目的长度之间的检查 +* @see +* @author +************************************************************/ +ZXIC_RTN32 ic_comm_memcpy_s(ZXIC_VOID* dest, size_t dest_len, const void* src, size_t n) +{ + ZXIC_COMM_CHECK_POINT(dest); + ZXIC_COMM_CHECK_POINT(src); + + /* memcpy 的大小限制在200M */ + if(n > 200 * 1024 * 1024) + { + return ZXIC_PAR_CHK_INVALID_PARA; + } + + if (ic_comm_getAbsValue((ZXIC_UINT8 *)dest, (ZXIC_CONST ZXIC_UINT8*)src) < n) + { + return ZXIC_PAR_CHK_ARGIN_ERROR; + } +#ifdef ZXIC_OS_WIN + if (dest_len < n) + { + return ZXIC_ERR; + } + memcpy(dest, src, n); +#else + //__memcpy_chk(dest, src, n, dest_len); + memcpy(dest, src, n); +#endif + return ZXIC_OK; +} + +/***********************************************************/ +/** +* @param pcDst    目的地址 +* @param dwMaxSize 目的长度 +* @param pcSrc    源地址 +* @param dwCount   待连接的字符数 +* +* @return +* @remark 字符串连接函数,将pcSrc的dwCount字符复制到pcDst的字符串后,覆盖"\0"; +* @see +* @author +************************************************************/ +ZXIC_CHAR *ic_comm_strncat_s( ZXIC_CHAR *pcDst, size_t dwMaxSize, ZXIC_CONST ZXIC_CHAR *pcSrc, size_t dwCount ) +{ + ZXIC_SIZE_T dwIndex = 1, dwCopyNum = 0; + ZXIC_CHAR *pcResult = pcDst; + + ZXIC_COMM_CHECK_RC_POINT_NO_PRINT(pcDst, pcResult); + ZXIC_COMM_CHECK_RC_POINT_NO_PRINT(pcSrc, pcResult); + + if (( dwMaxSize == 0 ) || (dwMaxSize > ZXIC_COMM_MEMORY_MAX_B_SIZE) || ( dwCount == 0 ) ) + { + return pcResult; + } + + /* 计算目的串的长度 */ + while ( ( *pcDst++ != '\0' ) && ( ++dwCopyNum < dwMaxSize ) ) + { + } + + if ( dwCopyNum >= dwMaxSize ) + { + return pcResult; + } + + dwCopyNum = dwMaxSize - dwCopyNum; /* 计算剩余的缓冲区长度 */ + + /* 计算拷贝的字符长度,不含结束符 */ + if ( dwCount >= dwCopyNum ) + { + dwCopyNum = dwCopyNum - 1; + } + else + { + dwCopyNum = dwCount; + } + + if (dwCopyNum == 0) /* 宋志强 修正pcDst 空间刚好满导致内存越界的问题 */ + { + return pcResult; + } + + pcDst --; + + if (ic_comm_getAbsValue((unsigned ZXIC_CHAR*)pcDst, (const unsigned ZXIC_CHAR*)pcSrc) < dwCopyNum) + { + return pcResult; + } + + while ( '\0' != ( *pcDst++ = *pcSrc++ ) ) + { + /* 判断拷贝字符数是否等于dwCopyNum,等于就退出 */ + /* 由于判断放在循环体内,进行判断前已经拷贝了一次,所以i初试值为1 */ + if ( dwIndex++ >= dwCopyNum ) + { + *pcDst = '\0'; + + return pcResult; + } + } + + /* 本处的处理是为了保持和库函数中的解释一致,对于源串长度小于dwCopyNum,剩余部分全部填0 */ + while ( dwIndex++ <= dwCopyNum ) + { + *pcDst++ = '\0'; + } + + return pcResult; +} + +/***********************************************************/ +/** +* @param str   字符串首地址 +* @param MaxCount 可返回的最大长度,若计算的长度大于该长度,则返回MaxCount; +* +* @return +* @remark 计算字符串的长度 +* @see +* @author +************************************************************/ +ZXIC_SIZE_T ic_comm_strnlen_s( const ZXIC_CHAR *str, ZXIC_SIZE_T MaxCount) +{ + return (str == 0)? 0: ZXIC_COMM_STRNLEN(str, MaxCount); +} + +ZXIC_VOID ic_comm_memset_s(void* dest, ZXIC_SIZE_T dmax, ZXIC_UINT8 c, ZXIC_SIZE_T n) +{ + if ((ZXIC_NULL == dest) || (dmax > ZXIC_COMM_MEMORY_MAX_B_SIZE) || (0 == n) || (n > dmax)) + { + ZXIC_COMM_TRACE_ERROR("zxic_memset_s para err:ptr is null or size err.\n"); + return; + } + memset(dest, c, n); +} + +ZXIC_SINT32 ic_comm_memcmp(void* str1, const void* str2, ZXIC_SIZE_T n) +{ + if ((ZXIC_NULL == str1) || (ZXIC_NULL == str2)|| (n > ZXIC_COMM_MEMORY_MAX_B_SIZE) || (0 == n)) + { + ZXIC_COMM_TRACE_ERROR("zxic_memcmp para err:ptr is null or size more than 200M.\n"); + return 0x7fffffff; + } + return memcmp(str1, str2, n); +} +#endif + +ZXIC_RTN32 zxic_comm_random() +{ + +#ifdef ZXIC_OS_WIN + /* return RtlGenRandom(); Modify by wcl, 20200424, Windows版本编译失败,先改回rand */ + return rand(); +#else + ZXIC_UINT8 buff[4] = {0}; + ZXIC_UINT32 ticks = 0; + ZXIC_UINT32 random_d = 0; + struct timespec64 tv; + ZXIC_UINT32 result_len = 0; + struct file *fd = NULL; + loff_t pos = 0; + + //fd = open("/dev/urandom", O_RDONLY); + fd = filp_open("/dev/urandom",O_RDONLY,0); + + if(NULL==fd) + { + get_timespec64(&tv, ZXIC_NULL); + ticks = ((tv.tv_sec & ZXIC_UINT32_MAX) + (tv.tv_nsec & ZXIC_UINT32_MAX)) & ZXIC_UINT32_MAX; + random_d = ticks; + } + else if ((result_len = (kernel_read(fd, buff, ZXIC_SIZEOF(buff),&pos) & 0xFFFFFFFF)) != ZXIC_SIZEOF(buff)) + { + get_timespec64(&tv, ZXIC_NULL); + ticks = ((tv.tv_sec & ZXIC_UINT32_MAX) + (tv.tv_nsec & ZXIC_UINT32_MAX)) & ZXIC_UINT32_MAX; + random_d = ticks; + filp_close(fd,NULL); + } + else + { + random_d = (((buff[0] << 24) & 0xff000000) | + ((buff[1] << 16) & 0x00ff0000) | + ((buff[2] << 8) & 0x0000ff00) | + (buff[3] & 0x000000ff)); + filp_close(fd,NULL); + } + + return random_d; +#endif + +} + +/***********************************************************/ +/** 设置最大通道数 +* @param dev_max 设置的最大设备数 +* +* @return +* @remark 无 +* @see +* @author lihk @date 2021/03/31 +************************************************************/ +ZXIC_VOID zxic_comm_channel_max_set(ZXIC_UINT32 dev_max) +{ + g_zxic_comm_channel_max = dev_max; +} + +/***********************************************************/ +/** 获取最大通道数 +* @param +* +* @return +* @remark 无 +* @see +* @author lihk @date 2021/03/31 +************************************************************/ +ZXIC_RTN32 zxic_comm_channel_max_get(ZXIC_VOID) +{ + return g_zxic_comm_channel_max; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_private_top.c b/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_private_top.c new file mode 100644 index 0000000..8e5d260 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/comm/source/zxic_private_top.c @@ -0,0 +1,148 @@ +/************************************************************** +* 版权所有 (C)2013-2020, 深圳市中兴通讯股份有限公司 +* 文件名称 : zxic_common.c +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : xuchenxi_10235594 +* 完成日期 : 2020/07/20 +* DEPARTMENT: 有线开发四部-系统软件团队 +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ +#include "zxic_private_top.h" +#include "zxic_common.h" +#include +//#include +//#include +#include +#include +#include +//#include +//#include +//#include +#include + +#ifdef ZXIC_OS_WIN +#include +#include +#include +#include +#pragma warning (disable:4996) +#else +//#include +#include +#include +#include +#include +#include +#include +#include +#endif + +#if ZXIC_REAL("参数检查函数定义") +/***********************************************************/ +/** +* @param val +* @param min +* @param max +* +* @return +* @remark 无 +* @see +* @author XXX @date 2019/07/13 +************************************************************/ +ZXIC_RTN32 zxic_comm_index_check(ZXIC_UINT32 val, ZXIC_UINT32 min, ZXIC_UINT32 max) +{ + if (min <= max) + { + if (0 == min) + { + if ((val) > (max)) + { + return ZXIC_PAR_CHK_INVALID_INDEX; + } + } + else + { + if ((val) < (min) || (val) > (max)) + { + return ZXIC_PAR_CHK_INVALID_INDEX; + } + } + } + else + { + return ZXIC_PAR_CHK_INVALID_RANGE; + } + + return ZXIC_OK; +} + +/***********************************************************/ +/** +* @param dev_id +* @param val +* @param min +* @param max +* +* @return +* @remark 无 +* @see +* @author PJ @date 2019/07/13 +************************************************************/ +ZXIC_RTN32 zxic_comm_dev_index_check(ZXIC_UINT32 dev_id, + ZXIC_UINT32 val, + ZXIC_UINT32 min, + ZXIC_UINT32 max) +{ + if (min <= max) + { + if (0 == min) + { + if ((val) > (max)) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "ZXIC %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__); + return ZXIC_PAR_CHK_INVALID_INDEX; + } + } + else + { + if ((val) < (min) || (val) > (max)) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "ZXIC %s:%d[Error:VALUE[0x%x] INVALID] [min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__); + return ZXIC_PAR_CHK_INVALID_INDEX; + } + } + } + else + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "ZXIC %s:%d[Error:RANGE INVALID] [val=0x%x,min=0x%x,max=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, val, min, max, __FUNCTION__); + return ZXIC_PAR_CHK_INVALID_RANGE; + } + + return ZXIC_OK; +} + +#endif + + + + + + + + + + + + + + + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/dpp_kshell b/src/net/drivers/net/ethernet/dinghai/en_np/dpp_kshell new file mode 100755 index 0000000000000000000000000000000000000000..96cc61d30213aaee14c387d0486377c20b472a49 GIT binary patch literal 4477496 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

  • ?Oid--2t@5P9biK%y>^fuGp=Bx5^PfGdQrTofL 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%0D4yhv@Z8%U*f6*;Ovbac^{Ft%8b-Kie2vl|j-H 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%0DNK^;7hfy>pV4 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ɲL`6KO_cn+*3yJ# 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ℜzIagj`2f$2}=SR~-NIbM4h%nL0K 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%0A7BH*PG;)^ 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

    396) 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�w2>~zRX;Sn zvQ0sz_z%-7TlRfz~^Z58Bd{y4p|^+BfOk;KbJ`$(F?cpfr|&Kubd z@*vaQ0sFJ-%NfhwWNPbVh6}`ZRsmo6SmOEO+;kOW0*{APOT09sw~Q{a1?8knp>x6L zxjF}WJUfJV%GZVc_MFUE_(v4+>^V_4nIFMl{VD8y4>xMlQ@Vsk7I^maWsu2xGOSLq z^Bt9GpbUI)%-B2nUT8Dq%R8r+W)Ebh{v7t+XSr3HlFw*wqmz_=Bl%;jH#{A)W)_tn z*2+1D0hX9zvW_xK`$rsIT|1`dMyCJlwrwzW{h$*vgOGU%>AQY=JL?CNkg0!edg)~S z2ldfCy>!YUGX?>A6rtkT%y3sC=%*AVs$>@z#V%GtiyFRSyw!+FnkF(_> zK5_`yMqm@2t1|xCn-TvDiN#+CY$LFVmX+b3w+DViRXzj zYamnmO5!%iIvjvZT3~f6v#^R21r$rMAT?4!i}6Vs`O%;Yp=XdCU2S@|*a;I}St zmUmrX5cpO93#&)%dbaH~=DqGTh4t{y!s;MD+uKv@+gF7O- z=$%g7grZC?WY$2YpYqP$oQ%^Xc5Hr_@v(JwqzW=+X`||=woL3;74g$gGy~fMtj}FE zzH9fKd-Sn9UmEqBdq{O+0uVER*AoHCrv*cSIbR-C-?Yav&b&^}%q?=hQR8$EW>TPi zV=3j+N2fK9XPFxzm%ID+%Di=7#yodJwr&sKGMoL1_+>7Dd{QVBXxVdAeQKB4?F)it z?juLhqi+y6OA(M~pHPfA%DyuFayLM3$zG%C(fDb<%hrlds56Mp+f16BkRAN$^wXSz zTsULYZ*QnWdx))d&2r`>p?>!noz{IH^h;Hcn}Xbpcy`;2v8&6Opc%6h+YD^^zT3yr zZn}W&1lH$#rSCYDcC!VtlbNG_bLRN_TxQP9eCF?jPGY}N|99`V=xUSl1KYg+sP`RW z+b^4Q6*B$-Hu->2mFCw6#hhX520nbysCO+!{831sR5XVe=({F?U3svNk2GflVtr)R z%ut}}>+yZ0SV^3H`f|u59WuRiRzhZQJ2J8TQ5R%7=OmsE^*aTbmP1EXm))mYbrCu& z+NTnqwR0$teZ;8R%dgKqT1JaLnjCgOEAXPcJh>FEUSNxvGIr`_8CZAK%yA&DK(sB5&@vSI0YUmg%j9 zeCyGps?l%kcZ7_!+;iFkzz61zstU-uJ}1t3KE|EA3(61d?S3|qB{t!n8_fg0c|l@v zR|4Au>|6F8tv!a@X(txl-A`!-zV5ih;_d==EwI0{-y5=Rc|z)79;fvz=OplR%0|_D ze)t&QlDTUrFmQTec_{%l?Tk^C>Q_I7Q5`Zb^}tV_jlK`hZvBYgk}b5TR{>kp-glE-JGZO@z-L~Nc>J?cLV1%cFS~1x@{$=!aiF^)f~UHa-;KDrjQUA1 zDUbV2oTsz_Io{hO2|3zREo8&@jjCQhdwM0B7RQ`zz&AcP>OG_B%t>PQfy~%N))@yN z*YHs6xX8`plguL~YxA`pym_4cg-{^9eN;vKZ0G5y?NA@Zz;Adwrq7Pvqj9IvN6frS zxAo)VGQQ~dPw#&5GR_#A@Fw&v`yW3dv*baf@3 z4sD?UGE1HrRWI9iWcOc3iPgI2o!Wul@+@q}ub(azy!#&YAn>bR7*#z!x(!+HPqH4< zz8J!NC>VR&ZOGVK=qnO8OlGdBPWM_D@!2JiO?zcj9cas1WeJKEERy%r>VQpuHKzU8 z*dCn(b<_rI%ipke;8*4`@3?0J@X2qEde2(hao@wZ^?P!GFJV2We^d=49k&m*v2s*u zzWAd#zzzcYE5CWkd6Ewq2eTho0(|K}j1Adw%R5`z*EIs0`|havR&xA&gwB#NlAI4> z-0OfZ+&HR^@Ua_xkVc=I8UnU_cvNBN6Ss_^A*omK)f}g$e;MQN(NXXB+M;b)UKNin z@;Lq@x`t8)`Qot{U*P)T;5OGIWc&~Ls&QX=(c0FVusVJE%MFlkjEt%YJiB!oO<&&i zS(I|JHiAl+0${YWS?L(hOpL1U_}SSBQom9M#lYtSU;3|6wYzQaQ9ZrI1h7Ltk6}@Y zj4hzHMf?-lFVt+4b|d1-`fyZL*>PF668f&xk&Nv)Us(ry_i^HL z9Hx`Gdngcr%(ncXJzu76mO-ZHKk?W4>R4*Nc85UxAF%nG6Q4u117H2gj?JNH8zBj)Bw8*Sf8^Y+w=`APdns0_a5`U zuVt6Vx_6d&8w7q}-!XN&pPzh&x+;>f#jM$AA72~uzKi74*?C&0wym?jEP%|c{l?T$ zcKlHvAZMK8ofT)>s)uaa{?kjZ9Wn!unQnU2T?Dd&S!3#9JiGNI^B#F=!5xD0RR`iT zz7h)59FRD^1o*&#iQ!o{^}sg)UuWk><^@4KJV8A z9lda1na;dk)6e)S)(;LFo7P?i?Yazd+20sTxX++WBV>|t#uDCFW7#?((+ZiZ;_K1u z6FJj8Q+<%*7-KVJhYsIyKa`h&{2n=`mf30B^^g>;2i98^@Rhk^D$B3`I9U1*_e@O- z@p)q^*AIWR;AO1I_CV9_r|{&_}uS}sXzPlA))(Zekc39Y^&LOhXUQl zj;SyDls71ju~5dzWx%dmJf=EQAsDBB3Uztc`<4S=eERm|EY^hq`-M}_39aCSm=XmxS(%cZi zGQOv+OaWha@t8W%4}XpqpS3U6%WB4a-|+~=d@rR8`0^{a@7HNp4ZyAiwgJzstw$ZLTO)NUV3f6@(^!mn8bWpf7lFc?(JjhH9zbG zvGc^AW$lOde}_Ldq|Z0H?W+v+U^^y^INQg<-pf9kEy-vvfB97QeK%` zP@f&ZSG7#9e+@&X@Ry0V2j(kdf9Ml3Gi<+S=j#CRS>h*&F9E*m?lJX@AKrRTko8p$ ze8sQF)Lg$hFnhvTz^(yy`ESNllZ}J1gAotM1bx6oTF2D&_Bw8~f2bAD=6=9B zC{Bi*DDyun3+HF5ULK%Ucb6)7mk0Kb~D*CuInp zOKV%0@&o*@^U?xr`h#OCVwcy}y*iK*<*!gz#AH0u|AM1YAsZbK3TqEQ*JTj&lZ8>M| z^$Mk;D=9LcM5VFLx*#{_(J^)JR^^ZjEIoTUEcYbvYk}Whx!KM#4n%(d>~z*XN+Hwx z*!JUR-s^!)dpu@t?)b%Ku^snAdc>~Eu7{An50bm_Al)R8Fb5 zcESAQ0~>g9Oa*NFck-`&gZl+=w&7~v`#Q(G?{Dfhob6a=25`;5wLCqhI8G0oXzqzK z-w9y49pJA6-&5x%T{+o}-oy;X#D0f>&+8gf*dB_uJF6`P<*Nz$z0S03tOq|grf#wA z(87lF`9x_)nTW0c`1ih%EuOCP8c+u-(9(W5+ADaK3Kr=Dr2S+XifMPhxrK19nM**e$@e z1G~LE&RE*@ra) zoBh(5dL&+2Pw2FqEf{A#>U3i}eUM$-JEo3|*Cq?SK81caa0vYM%VX-wcxgS)w2D&B zV1S|HJpHHGbROiA`Y>m+)3Mvhk&>3oPnk{?@Kdi&Kb=;{<-e9#I;^KY;OD$Prq;zP zPbUii=P=iVraE)GjQ;;iud;00kITY(b z?@T|vO2}=7T-+N5-UK>O06!NwIzALZ@xt3mFbOa%DJ$e0@Q83%;wWOm^0ooD2rf0!Io z-?Qz>_HnCZ)FOK)Y*!_~cTG*deJqDu%SY31kDZXK`FQ&2O+l{sKhsZd&f#ePo2Q>% zCFC|kZrbf1a)bY!M*9c8?~^fgsa;=ATXx#No;O9?{}I@~QPXQ5xsd6HjL#fr+wC8+ zk-+%0{7oBV*3B5-q4WkJ+Z&u-dg({P9z#2pUMXbPCXK5Cdt6}ZAhfr%U#z@2BMIH^ zmqTXV%yIQQw4tqhuxzJr?gys|HhpLZ@Oe8Yo(BC=7&3*s#K^dQ$&Bi84Xo~M-RXmj zb+U5NUQ)&r_Df~J&)#iZmD@V7{f6b2n78GO{|h^ow=T$*d~w{n9&V>~ocJjBOz0%= zkuQ(?->3dX!MkgBncqbJxW~9^M?T%Uk@3H-#QDy*0?c{=>!%Ddd3(l{k@H{f*A1*S zhDOMAKqlV%LDG|Q*aj1j`5&;^v&Vh!*a{sdcIK9O2>6z-jH}IdpJeMuUveX3RgTru zk3xU@)x`2r0PFy;zT@B%jm;xo=Dh~^-o3|Fo}X=03f^6BZDsuX#?|Fq+G=4O{cnIw zd1hRhxca9JCVva-FOZqEb>y}W{Y9O4{Wj~n5VDQ?jjP>l+2|hlJ^|19>LX zLAhihiuklVjF%1?SI^@)YVR(-hImYc1kbV;0H2XPy*$-Irt#}BY3Oyp6HR`kZrMpO zPi??wACefJ>nt09?*ZOZmu8*C=qSK-mMy?F9U5aN!3R)6oo>drx&J$^PPg@Kx0}@x zn~bjt5nl=Lr8(o?_i&;%^sp(LS(=eunEB2%U(P}-%iD~2`VUV$-EQEMbN}z@&iW4Y z@y&7XeN%RMj}hM}YdnVm?$n?swjziFumq+KKD#WnZQW zvQvwuFUzvEK{jvkxXOvI(TW?ofcm=yV<(Q{2tCro|Jgp zrN9rIJnp^w)AFIgXLM_08S8;9J!Rax&S_)cAa;>_M`R7KL#HO%hMm=aZRbOf%`Q)@ z46NVu0`w=}pI-eIL#6{VyV^SS@e^!Ib-*{DKK=GU*$&9|pD}$|mTeNU8D~zfEoIHc zeCDjgY_SyB{Ie6&1M|}Wd`89eblm}&9>^r3Yuecm@N3RVEdOcqFg`yw@wf|sUwd9+ zZK)dA!OFzrUIl#D`H8iq9$<4X7*`M2_Gh=H*VvZyJ2X?kuB#f4zc1)>hfwx>*z1Mk z(>hPH1Tr}njmJ6LBP;IC)$%f@Zv=KZurHy$-2Th7pLpkW*k^V^Ci7z7K69IAi7CGY z@&(o7e(%o9DQz4j^X+r<3$gxoN&GxZhmB>6xw><5&luG}X4a*N>0}kK6~M;RiOyAY zdz%SxywV4mEs*idUmQOqhfyJ8+#}mYU;);nFWY{8h@AuMB(U-3==Qn(0$|I5t*jaM z?!!dKL61`{(Ra@r9XqoCy{EDYaSUEQt}1Msj>hpTZP89?oH+Dcu^+NYSB`tnP08kP zvGb9`MY?MA#xlpxvx-okknwygDVpAu#Jd~X!TI=0k2MM*S6++xZyF+T_7GgT&_&Ly zArox=W?XwxU`AcqjISbwrWyRu*-U)sY^U3jZpR)W_|*07UwBcSMzHyjwifB6Esyav zb{m(GY@zg*{lFI9I)=vrK3s#PM-<`1QN6~`xI~;Yu4&64cj<;>w#@2`k~5)!usS-c3i#^@>M_GF}>2B z+8|%|vmL9`LCAJC?^xRO37N-YJn-{zl@wq1(py^JuM?j@xpK(0-8nrumbD3T^}oPc zu$`W}#ub!qCHgLcsdLD&o_itN&@!&>wPmAr(ylGaX|RsHl(~7HwHW^Wm($BL%UTGz zp1YpIAGtQuEq;+OT0ENk=_kjTzYG2IK>>SoAi z{d(Mcp2Kc`k1+=Qu4+~Z{QGalz2Dunu~I9#U6%q|-5R3{8!JbCip59Q16%rA-|>g3 zFOzqt+K_kZZXINo-!ne#Z&Xlr3bHM~+p%sLc|@Lr#Br#ZOwL#my} zlo8OTTOrfAddJ!?(;Q@e@0(tl>BnQfux7{7q<+gFzwY-trr##WM(&@!ewl7BWCLq= zEZyW2Fn@S(`ss4aSqRzUhsM?6e(Q1bofQQ=wy6caynWpJO)I;NY@`wB^LVYm&iZ5G zarXhA(XsuwIaJ#MY~Q2fil1=ckF>N>*b8VpBETQ@ngv=9Xon=>4`+O5^zw0jkWdTwNeDZVSYQ2qjbRdTs=cW+161aBY4zqo_j<-x}RIlfB0JpAtT)pa7 zKI#O7HHJ>zt5ei}ccCyYfWx60!@qjIw_N+fSTbLqq!?`JiU}c<)@dR)$*m`s7P0q|> zBqAreVe_V&s$inU&J~FmKOvq<#FPB?xc7W2zkmHRg6GOR7LC9py)&-fwCmo|Uub8s zSt&;b;#>!O$3VbrGx+K6jeEb3q4g#`5fkD#A+rqn z{rkA$ILD1g^uH)&0h3#tA`?N@MG3GKz&>STwf)LCaj~P8Qy>Qn+g<}?B9J-7?;D^` z?5qoA@a@27{1an5+eYkny}l@Va^FQ61b)?r<0{j(OB+8Tc)0_J{cYMQxF7H1an<2d z5Bk$Vu)*h;tp!eru4IWaAzuplS)0eb-&zdHAwQ|R*}&8S)AQePbt;|%C!6!#cqFfh z@}F$YW1X%AuM|9)7dv)qJOlZ?;5Ti99|6A){AIwpb$OLmFY9{NshGe04{K-GygYU-I>xx$-_%BlykWpJUsdWv9WH zqxIAQZ2wmy>RUGUcz2I}wUbHaaS+%@M#TFK@hEncgQe}wD#!e1?})mAdAu%am()!* zc$ND^ynUpVztFG5I^uEW+lx>j z?O+YC%MXmG0XshJuZ#ujI_U#0KRe>>hmPewU}#x1huSZ10k-szh&lrCyLBS|>LPJa znILC=AM+VtzPT0V62Zv)512+^e&orUTOZQZ6*-@&HmBoRH}#O~n-lSUzbx2IJuDXc zSOaXwVG-}SIk#;(-%Hm%bp!MBjfnSKyLMgab7)dm%tzAc@JBfjm1gJP>U)AWG9UWB zpd4V=9*#P*^rnT7vM= z3~8YYMPF-yt61oRYtgnseQf})cu~ZA4n^nXCZY;cY8Xg?n5U#A*griMZ3fT$F;BBW zOJ5xEo*B?_EZ5ecaRtCtmqgU96mxbR=Cc;qHD$1YWc=ai z%qpY(9Y2n%+JNs_5>YSNaa;J{dpgg-pDO#w{}1vV9R|g@EYxH81={|iW+-cflaO0d9r1p9 zL|@)8H%07rams~Sjbgr*xXe*<&c^ugl8Cy@P8UAw0?HJpNRK{06XqLB6 zTLWzF4N zXMX1Zms20{-r)}0FSptYodn}72euhlPn>4ncn0wR64wA+BmvwS;0k{f6Q8uu`EDLF z5nms0tAINR&u&@FyqF}`#S}38z|j5j$Fe1#hyDq)?~&l>z_=61_JWjSX=K>oB z_9YuDb$%X8R^+@0DO0n;l(R_W;t|K#HIS{pE}|}`Y(;d8P2NiI`oKGpyrL+Nd0qov z`t?!!VH@cLEe*5<#5;Ko7BHLA#sW6vTM2C4k7MSE#I_P!=whkYCSaGW zjHq-x^GDsafmQ`t-1j5zWgJB*r3{cc;x_asx5qA$hB>#0*co>xa5+DXD9Z51xcfjW0nHP4P>&lZGYS4G@QEog%UidP%|sq*fi1o#qN?!h+LNw- zsc~XjfN9;swjmwgfX$9p3xVCxOOF(~U93sY$KCBU?=j(G1^l$zIT&eh>z(#ObJGHqwh#pvH2i>N(qyfv=UcMcb)ungtEHa{6Ne~$W8nPRv@19|I3 ze`CA}as!4C}DVBkdoU)@LK? z_ja9X8<02s+1ImPv#POQ(j8Gt?6{1JqFxHYuLA!en@`&?i8;eBrdb1Q1XyohBj@zp zekK#R7T`LbkElEBID^Ns^2H{_{(;F{k3N_fXS^h_6sHsshz&R9e+ald;Lfq*GHcar z3rUw?y$t-_w$_6T;TEKrqjJEqyt%+vy#Rk`#~0PDjQ5zy9PlfE?FDu}yPa7!rr#_p zaxchaxtbx<^Ou-)2VE~Rx?tS2u}!{+Jy=x0hmp9J0MTdAuG&@%cW>W>6E zc{KBYYqVnya@r>2UtsS6R^$s))0XU-DwR#%8t^*7>oxH#3kF|IP1g0>4PN!D(YXP5 zRYp|TKlnZ1hfMu~-{kP6{x1s!9{8JCBcGR=wlX+3b@qzT+|*308sklg)Y-`RJe?OQ zKk#c_i|BVkkG)0iMlIH z%?yUM=JN1oK6vN76VdlmAhz3>{z~d?MG{h3wo_qh&PBVXW`h8Qy2(i!s)Ovp0j%dE z9&HzZEDJG(hqS`yio%(PHemk)?D1?v)c1Kh4{Y0A;2r$;h`J8Xj0bglp;Nci{~-7` zgWpd+ek|)0Xp09U`VMTN>bcph%R_-Ly&qAhkOn<3!$AgSf^9Mzyv5+pTbaYeD}lepzeBd3vcU_e;4)-I+Grzq-}@k*vlI5 zF9rWp@?&&|vbrsldfotR3$P1__0-krwrNTG3|tusJPa)Bm_OP~I%v;;cCb)1EgQ5q zK$G<2?wAVp9fVg8*)4q?w(4Uln{twXQ8=o^GDho&_+RfR4AHO0NSl1XczPk_|Y$wfp&j5qAn#3<=?hn3Y{_|o?n6}>#`Mb z^^Qi=Wn^Y=2o-ArHX* zoOwV!$MbWct7pVGy64vSVj+QPRYLx26J}kL^kUIY5Qq$5rEMW;Izf3X?-kHA0BqURJP;Oz?D(e%@?c7K7_?u!Ab2Y&a-h?-~c+q9F?PzXJ7 z+zyO7?m=8B|Bk2?#^!9_8oEwf3VJ*3|A9UKLsJIm_zcjg?^)M`0+%>+DYq^gdD-Ay z4&FO>mOiLdHze{3!ONM7s51@kI;)LUP!7Dq4X?uR=qKvITLIn=$&1z3DPDasowdNf z3Va3eSYN9&anU|{z}x+!i24S3XK1^j%pmAX#)kp$*moK9@43VY{|zvCff?x)BZDkS(a}AvgdBL=Os@0 zaNnp^K;|*|2iQLWR?Z@v8n=yCgf0kr+c@M{kA;xU{a-{qhUcy7(WGRCkFp0<3;Ywn zKSF$2+_Z9nw|bMBtKCT;6CxduKXglUjeA*;!=}ProeHBp^aFDSFz4V|>=o5c`XuOW zpi4gn+ovC)u9B|}1%3m11?v}8zk*|6Jsx|?))o7KTwq`OG@^>|%pdhv4BAegMb!WN z?IR~N7ULr!$F!G2wp&Hi^?3HAonv}-V~4coc3}4mOsK;Qc3H4m?3q5V7rcYP`?t%( z0hh7*RUnl)A6xd^im(F_40R3>#?_qqg?ehw6`(!yvfd3uv(kG*z zuyi=zHMi&1i@xfB{VT9CFGAdL+EY&Ow_Y1yHdu!pkewf#aD56jK;86$z6A7G-B2bB z-lgD4e}{SxE=`sDwFC7S>wqrfE}28S^=3YGJK{@D6y1X*>6d{2Civp( zgnyavbHJ|xF9O~;!Cu{5W!YB{9v2$YHnj>ezY9&MCd&Bf2m_kf2?ll1583}f_9V)( zyk<1XdYS_7(4-0VIC)-MzsbsrtdV5?2z%GS{$XqEYDYh`m15w&x6_0^dk||YLtEQQ z9q@TGC)5L5$9sdF2ez#?U>^tezaeM*rh10;-0Dpagc-n0%@J|3Q{TJ$yV{Fpbf!-BEXTA4^kJhR@-R8j0R z0^WOZc;f%A4+TC3?^4QnY~mbCO?u3m3vAvl6M75;IMXc#tq`=cjXcI%XVUmH@pmP7 zH-pEzWZdGf&vMaJMqk4A^tUiwqFYL7{VVV-Z^q%YDMVI8HhSqkXjM!+EtbnkO%2o zgC~(OkBPEA`Vr5!Qzz6Qp0&K8p!9QO{mXI+@^0?nA$ZX_>NWUEZ+uTgI}Cb#}K;^ zYPmW!xfqWT(6d38@9rQE+Zk_n`pwH|$9Xqm-u$HreZJSnH)E_D>zYNUwUFKI%M+>s z@px<~GidvyKnd8bz|IABmqgaMT4#j%l6)o!h>JRyM0}s@IiY@;$eg1hv^eM!9qS~2 z8P>4&novK+^H#R8ENUB4|G=&WcBV-;e*K5e#~g<`bL*aqwrqE6AYYv^q3;@x>0iVM zZuB+>>TUosdHYPLSNMX@_UgN7M(CRD=x)w(^g{LhrkZj{crpY~D>eAW@B%$~8Bgj|BZIW-PGHHe3+=(617hpDlR3Kr9weKY0+1rv&P$$VgdB;)oR&{IMG_BO_1q1{a@ z#!wn&Atu0hsv(;)cS4mhPWbVC^)T!Mh8*1;A1FSS6EvAl6Gec+Y_+Yb{qr*T;H5 zPcE8J976rP*;+NA9Yj%S{-Q494R_S#7=>$Aw8a01?-Q2-J8OqBd%0w zU%3vv>%c?zAU~$p3))qn$^H@kCT$S3%Ru|KpmbZF0<9UeO^NvN($MRnc*|~xk2)>5 zH552%G15%LKi33r@bgF1@k+$Cxx|dCp-YyQ^fu4~$4z+lJV@^ZJt>Bs2l@uklR>Y? zGyQy=HdVmY(AdFA4&Z4&#@P(WmePhXHgxMJ$7{n_H<5WN`+-8pR31N}RvMpRuRR9M z@ZISLsIyw&yH1$U=T(ruZTj%i(BWu1dGR*x7*`kKT5{rq`a&Z5uLynYH>P7bX062d z_hig7@l3sW%2BAz(+CfgRB&Nt_oiQ6C8Mi~1kY~QPwufj3 z!}=};_GDn~J+mdCRe`n}Og~07`?u5!o#GhiEy{C^urCm26u1_kx_RBQZfc_uQ|7z@a zJ3gbsubopLQ;4f>sp%_G2j^P-Yg!ZL?q##*_9F%$dMTrk*`@ZgvpOS~Riwz@}d`p)SF*7rXWNxeC}*fPFBLxmaoN2_Kg) zzN`arJ$7Z(=f~4i=q@;p7-vTNnuP2vS9!;^q$mG06u1F&89SifdG>_$l?nPapv%6J z_;`#{&|-_h%LngP@Vclg`15VsBu;|F?Zvd-8xhxMS5K(lY^C>LhdnT2UORxjyw0rg z!LOZ*ys{tY1^qVAkHWLJKHT}0j9I3DyBoL@I1kvKKSz5#Dk)yhb^lcGvrypI^%IKr z!1i(;@-hdH<)A+V`dy~I+I?y0P}B|mhv`gNrbggrUpJw?YT`K+@reHe{i~o?l8zta z?f~s#&_q`;w$8iXW8)qI{_X20^gD;hV?E+#|F8x0Py=ki_^tSB61YEC49T-3A^mxN zGxmXQoKR0NW7vg;NkJ?vG$etr3bx{z4R zmzM>vg6TbX3ZJN(PVlb;Uu+Y9lhy~??V!opKK`a%41sp|O_)ow&lMY%uJsCN%Gu(S zF~zK(<2>EX6Y71ySeLuB%}|3p0du2Ntm{wPl28R zdJ)q#KjLTo0^>Z;=aF`fJ_ASl$pXC=^a9eOb;V`3S|=wgUkPw4fs^+%V%jAvE*Sj4 zyGBQu2FRTKC$nd`l}y(R^g5YXMnJ0CSx|2skhuXeU#C4UOl_ZmTQ+GCN?Q>3Hmd{%Nhgsu+c~87Kw)bTp$yyR^S@{JmH>4 z<=#otjNl&y2R_T(4b0w8P3ZHH$ftA0iTN4???{JtZfe>ICtb$Ixlz{hB@J_)q^+;L;Xs?0BZr`ERg4P4t zOw#aUJ{v)M0yKM%gn4TP{ZY`xCS&a5TE{McW8Qj!eF@kCJnQy!o#c&vD-7O0!8^tH zDIZ@y9M9KhLO%O0%(c7h{S^Ap;2Tao5K{t77cg>0Msy>XR~<|-Fg3tj^UQ?$37)s> zuL^>g&cq)yP-mTps}phYnYv}&Qs)~$UkAD~?;tG<+QXo+%jb{!+5*~dL6bgL^2^;t z&6|BU#=$HPY|ADp|w2w$YKHU8$Y`Tp)P7thO{3`?Yvge{}n%f)~76e!L)iKj;MO;sG zo3-Mz+;rhAuxd=VXq^q|1vd1&@$0Y$>_|#K$#}xx9SYt!o~``T>HNu#h;1ePS2(Kx z?0dwb&H1#ITjI49rd0;{Ti2U$QB+q<>wG&c>be2g*)K$W0mpaEpzR9Uad_sq#~xSd z4u^e#ERl#EcLRSA@Fx&2HlmNe)6NFLI~}}ZUEZZ`U$F(eM)0D0)~C9>*}sM_0ngcw zUKYgOGPFs%$pvplPjozV4Xlo7m4JQ#=wc(#fADQx0pwMI_ZfJ5(*KaRCCXb4-hclR ztvB0$w}Q9-i(bFTK6xGJ`+#16XK#I80N#4=Ze)i1?f44s@Lta`X1C%VfR~I-#p-RIS8r_d#lRl|{J7~~w%O)O zLx1yIpJ1D4MqDrUn)x~Yrp>JZZ4+p6wh8ugAxcSl7wAcU_0rh}`$69e^m07M*1Oqc zmH`#(FzL5gs|40r!^iAh{04cM;9UjY{)|W37Eeg%{yrbPdhlpB{4qbJpf!U={nO5` zG;N~_^bXJuBwgZ(p0`~N-c#V!8X4#P2BzN%-X1U8`y@fW{vq?DPVkn1C+9~c&gdCm z=4Al<$HABR6Wbh;WZRhnJ^2-LCd6Z3K|Q2^Pi2`h?!o&V!2KN0u{vZPqoY#YXO;lp z1AH0rOmDtcWCs4M0x!^K)*^LYoufHo$Bp2ZfN!rqFdEuJ8+gZnCu>rMwhpvKpcUY6 z{xb2e7qqKD%c2cR8g#kXh&7!A zqAYI~Xq!RX3(x#9?L5#v1MMvmpyo47o5{nUW#B#e`h9EDQ0;}*0!1; z`;9jy^m~8tWebAWc}1B8=BXF5H$qnYE$q*3$6@du2QRk$(KeIr#d#|5Zsy=n^cZ>? zb4=F3aibrm`tb{137^v`vW zE&9iV`|gpu&z6aoJe^hn9W!rjz}^6?t;c-OJ3+q&blG3U*|s=#mJ>WVCUvvF!Fabo z{(i{Y?@o}OeqSi?C(!rCGj+s0C+2w$=ud%OO*-n$%5y<%p38y#3|O%X#KCoR#$5yY zP9IFD%NfUU@R2YV(i=fP3-s@j{(U`9CcPE(WuVJi1>OVW{F(K#4)ljXmoXpWcV2j; zJ#PSS2s|0rRXOib>bVX5`V{#45225WV@v!#wC&i5&su}NedC1s3!Yo-{b7y2=;Tyi^*$jzeju_@IMFsrg(TP zm%D`npLwbUehhfqo=IN``d|#5`fLOJ4bb__AH#K^{SCA)2}SF;7qmXmZa4j3)ILK$ zGPNqRB`H6!M~q?})?k+fL;srr+bThP>Gy{MUmnN&$MhZB9Lr%1@YiVKdGR)=85jOl zBEH{FME88IH#S@k`d>jmf@MIxIqRyFX#wv8@MPW#9!E>Gqju1zK<}fBw+%LEO-m7F z9y$PQ%O>pYnf2}Mlml1!#xDlb&3*u9(f<|q%;HvUzYN$nf&Du3h`e)kfI6=ReH8R! z(zV|&0!wt%2;T1h_Re!C(+YYT=uMQNZJW1SX#<_$EeFq8N1{*c1MOoa$~ zBi`IK4wA2gu%U(vIn)PV@Fqy6rYV=76c_`EGqm zSKIR{@D2iRmpFb3{gB(NsHYxalRh%zLFft1&h5X4z{>{D@$=4Dg}yTIAl3)LdyUV! zP98C$QfHaq566+EP2_|3FYul>veEVyyxq1%+H)1Kw|?xcU(y>uzbOvA1@wj(I_;(% z^dEvQ-{V02Y}2L-FlO~>m^p}R3*tKRKbQwlzcJ@ALKoWoz(U!-Vfr}_VT`qTLOp5f zWSi-i264(geg>F+J>vS;f6aPnjGx7r1`8FLo&hTL)ef02eKMgA!L#@b)3$m*KLGSH zL&x!+X#InCW*i>dP~Z>n-QYQ6Thh`&yBjp7#~3?sf6KDgJ0fh2XsaymKcK z&JZ}mB=Oai;Q#Y~7>kR9Ztr!V9lOPxJHY#9IMOcTfF{sy0ewGWVaLu|{2I`I20Gg) z>6}+G?Jm$C0sRiwk8_PliY|U-5d8fPTEa3jFw5Qlwdj;I)SA?ONpS+CQ&;c-#vgDSww32buT zo7`r5DG1)?*Ix3F&RWEE$c#o@GG{)SzHuE5SQ4xJj>*K=)k1CcPf? z^Fg0WnJaXgqWv|4emm$pla3#0Ye2gJG?~BQZ_0Oq_A}6&F>vr$eGkV5&|d^y&H)(t zFlZ6b>^*@kplt;0d|>!vI%$t!y)fiWI}5afK|4%P8kYy!e9%~a{wP}l+P6Rxy&75t zXp2FUzQ@pNK|2dH@nMG62-;PkaXiT%<5&gSZJ^0{xfuT#Jk{y{v@UvpeHz$>6gKxo zFpfdcH-UZu>9AR=eH`yrFHSNNJF5fbOxmQ+(0Xja`yM8-dBDyE_J_vrxbap5U$O0m z*h*lVcG{%R$;6i9{Af9ffo%fzRbc;yXWIBS+e>NiVZZjm`WQf5r_J1?e#W@)BW)72 zH$Xd8DColxCOwKZ_?a;ToJ_e>MonqmPGpQn$TMq z0mSXR>5K9nLwiiwq&k>Uf1R~?Ri?{S3)%ld_Rye~-DVv(%n0JVL)?5&KV69H?cFx1 zm&_W(Hsh)ZDxavtpUiq3`@Ub=|Dio`IRCdmhHS^rv7%~9aJaty8&sOb?7E_ZX)`v2_^eY-{@mA z*I{k+8=E})(xm5sepw8ic2NrYMWBBl&$NqpYcklmi=945AF>j%H$zs&Nz%VuCw&O} zo;BdT?ZhiQz1hjUbc45N&L+=%nlb~R?*_W8gW&7|#${Yile9L2R|?*I;B;HmCsWu? z)Bl8ZCGf;==(LX4qXn(sT=2)hclHOjQHO=8rCcG2Yrf)p8W30g;hXdv!oM9o#RL0iVMVU3ArCNeM4L$K$HajO;Vf_Ab6xL*TzbwYNHuMzl^gK-r< zfwli5H>n8I+@7DR2)-6CDvHvEnh{r3?k0C0=`)ADE7rGAwhyvzK=x%*rg-*;>(I6` zK(2etdJ^d#wMl(5k@bR_P=?PjUc{vPg(ZmZxNjT#1C6#?16m7ctS62`d2XGy+6a0Z z=*}50XC9mjUK@B%gZHj!&-T2Uhmb-yp#^7prb;qqAAnqC{wBSqh_sx2RY@BEZ2|uV z@C&!^CqgrjL=Ik5jk!8Z-q|he#2E4zj4h4c;@20N0#3Fuj;%UT^Sre(D#W$?*%CE%Sif0Mf}MhImpK|dYz{Ya2; z<$U>+2kWo_ybAD+w0XF1@Iu@PNPa8$SAu^`44eo2<2el!2IYH6|PJlmK%UFtVQFq-Ed7 zc=-$gv+dUb`{)AnKlD=$*8O%+=tv@oYXz>aXp?$@ZEI`X<00TO!Ri6-vST-?r}6CK z^qsPgFi~P6!0fu%%paY&ScdB*TY^dJLOj4+Z^xtWp1g)A<|!AL7lAp+&bzsvHB_j} z$a-G_+*FBa&rW)vv)<~!Q{eg4dkgqqI?lh|*MXk{{<(ap)Gx(2z|9X-oZ`ajxNfK8f*jdk@UpUFk6R|FF2M#ylp2Y>cXK?}VSuEx~i^aTW zabaq~rSV#i__u1r(}Z|-VxB(#eXfDeHSoCxKG(qK8u(lTpKIWA4ScSF&o%J520quo z|F1RBcX)x6uhoP_n`CD$@ao=r7qVa<9UgdamEcMZf5E3UarM&n!wZG}fC>L-!atd? z%Y-kO@MROeZo+p>IBddACUg>8{hp40oeBF)7&hT&CfxJy8h4}#PcUJH34dt9pPF#3 z37<3J+a{bcValM6Z$A@$&xB{nD9;$K4ik@P57P(KQUq2`#Rn%6CQ2CQWGvU z;k73Gi3zKQwA^a*cee=#O}NE`Y5y?soA788o@~MkOt{>Hzck?kCVb9>e>dU3O}Og^ zI^F|JIM;;VH{m5FY%%$~!Tf!v2_G+Jq;V(6I|A+;Ggr z^7xJk!zK)TPt*4@VXg`1oA4A9UXgi)$e;7FJ{@y~374DjE)%w!@C6gTXTm8Hro5u% z4>aLC6P{(lYfbnQ6aLDAa#Aj@Y2FSf{{>?;n!oqjQ^#k-|33=`zjlCQ3fs&>&x2Zjv7oDsU92$SohDpu!pBUw-h^+MaM*+& zn{Z}!fkeHB2@f>kQ6?-h;i)EEYQn2cxWa^YnsBuVA2Z>46TV@>VH19A!kGt~^i6o6 z36C;ikqJ*V;ZhS`ZNe2MywilMP577z*PHMS6Aqj3V-wE&x=G)J2b%CG6Be29R1+>W z;ngNwVZu92xY~q|nQ*-c-!S2@2|qUB%tK82COpuDN13q5gr}NtsR^$(;R+MpX~NYe ze9VOFP56chhfVmg31`kR>6`FC6CP#4A`_l!!lfp>+Jq}ic&7W;ngNwVZu92xY~q|nQ*-c-!S2@2|qUB%)?CjCOpuD zN13q5gr}NtsR^$(;R+MpX~NYee9VOFP56chhfVmg31@!8q;J9lO?Z?Ei%fW`374Ai zY7?$7;hiR2ZNkS)xZZ?sm~hyHADeJyj!EBy2b%CG6Be29R1+>W;ngPGo)ZgC>i%lb zjCUu@-vRU6Z2rzXuUII~c!2TpU+`aAzTw;P`Duoq>BHa0@cX_IU;a?TuQ)6||7gQ+ zJt#hZvEg_5#Q%MVpBG<#slz`vKL0Ai&+$orx#73|B)-w$n;U8r91wQ<_hM(!fKf~}RKZu|HRSw@L|4oLU z=2QNM48P&-Gvn*ek@w;M)$m*IiZB0n!*9AOe*JCUZ>gkPS`(k2xxeOjT^64|;lzJ_ ze17tWx_$ynbFtv>u3 zN8ZOijyCnzzSH8k_FZoHIidLc%MHI~MtuIQhCjG#eE#nYzalk0ztc&7R($>jhwmdl z=J0*ePny#9-}l+cam&B2!!KDFmw%|?7upbMJIW>{2^W?ZWHFU5!WI|dU7)dRPamq?* zBCM2#PV1COVG-{8{?6*sB__BPM2h5HM+?-BVG z+>7A0&)r4;+9%xe#rkdIUIe$da#!ml>#uC#o({LRbGP8eSKM8AD9Pu;gPlBo{W-ip zN%p@6-1>>!Y6F`OYGLfqS~hFX27}`ABm9E#x(i=cgkd zO7c0#NBKM-zypaF!b|1=rVd&w(3~`aWEfcoE!@^sm)R`tu~d1nZ|& zrKYsmRcLARdu5_aJhg;!6 z$i2SEOT0DQ-NW-eMPA~g;N}lJpDWg9ANRSU{sHd!$m{#L7sA!U+>7D%kK9x1C)cM_ z$o)exzwfyhz@6{7AAyIGe6jH4uL3Cl_xqWfit>D1`?p@&CK<>lD z__rqiC*}Y4Hw~_};OBe3$j{~VSHYEe+;_m;`n>*Lxc(yV?-bl0&b{=-WPQySxZeqP zCEgMqO8gnPA{jp&=P&BY#~+5g*Mj@2aH~1@<#4?r_W&N<%RLkQX`Q)e!^3*qkD$KV ziMxlq*@gRgW17815w?W?O&pkpulJuX_Fj*f(vOaxLU+KZ?kA^z~xX%~;N%CvpUU#0~ z2{(Fj{|O%7#r+c8m3ZoZ$^I+P@Vt)o(VB42gvS!sQC~NC-a$TW%H46rE%W{ z5ANZfFV?p{_ur6Lp5=Z8Zau)g%GG3l;%?j-_uosbc(+ zy#BjzRpMX5HOc#Rg!NU1@b}Yw$a{mi$8hU;?kV`oBi2p4{~B=nem?*E;O_N2pVBC~ zKSeilH<8yXaDQHm-;2NB=%}wt>Q6#Gmee z;A#n;_fg-h%sqsMDcmoizFwMpvFQH>?x{-u|9vlDmE+zFZal~LuLIn*xLa_u*<YW4Qi1_tYlI{wOE8FU0uqG45;O zmc)09`AL3$<`=kehS$FgH&1cTK>v}#_uq#5$!`Js|9wB@iTq_=zd)?dMeZ>?xWv8E z^~w2D8}jR`5!{iie+Rg7n%B>QhZ3I(k90nMYSU!@jX!w(rJ}zR+&96kf4HZke()Ff zL&)nf_Y3ei;;xoR);Icv`@Qh^2=}%k{}jLfcY*tV^ZanQ@iX_?@IdnYZXVo}+`l)& z<7at)``~U7AK$|Io5kFZBOm_By=2K`eT_8!{^p>*_ZH84;(WcyJ%C&DxkvEeZSE<} zlJl$Oa<7E`Ey?}8EPzn5ec{QjOJ#;?oWhgQl>tlb!Jss|T%smtCui~B!4_9-~g~vYkjhMe9+24b3?+uS=3+8>%ReaB>o9Jka)J3pTu+Fs^tEd4>u(qVtnsY-hYwkuO2@irEf^~SNVqL z3o*X;HTN3Gn`^m00M{h_Wx_+r{=Ni{CHK#{aHl7q-}`W*3O~P}!p$lC=PSR5+mpB# zV|{#^yVfGPKH`boGvKDf{e&2Q8uuGg@cuN9dlu?@!@1|cqY>Qm;Oa>31;Qoui{RP> zp09@fz0ut7hr3Jp{H~N_H0S4Mtf>D0uRjy6kKy%~!qxkE{mr7k zY@XNAU;HxnOwqr@51_t1i1+V^`Y-VMd2m~G4Acz^20$FC08X7TZx!@b$u zpA|0IzoEj%@_dN-8It@oet$IJ#w_kxB0rUTF5H%Qfyhtc z`C_;`o4fWPu8-;5O?W(wyCd=v_uFf^z3{L-|NioX@Xp*zm%;mC7w&h! z-LBj-Fn=?X`vb_E?Yq$Lw=?0vX70n`;hp^cn7`_y;zKYio5o3 zGCx1&o+12S?whbbepP<{4v76*#P|0M+_}W-m%S-D-(eMger)t-U*!2*xO;(n0Qdgm zo`&(&R=ocRdF2b9zaROyIqyH^5v>1R+)d>DJGiGIZ`9yESmagi8OUqpxlc!4Yr=hr z@S)t-!>u9QvoO9@pL-5m-^th47yTD-FNAyBxfjFzE!_8^|EMkR?<72^#JzMmJpVd! zuMSr`^6|CS$@#Eu=lT1Q4{P!3uOmDz#q$H;y5#;mQFwKppAWaM@%~qf{B=CP8y;QH zy$Bwc* z+5cz|_iAuw2>0f2&E#&vgAv>Z!0k-#6X0eK?hE1iMDCx!)lu9F;My?mzX%`8{T$rS z;(n8g``>u(SvY_8=iF-|uS>q)agp~w=J|YazE^XPM1BqTlt=M=Ucz06n@hP{aPK|t zIdEIz`S9?4o-cx1A97dQCjDy?H{i-fo__%AZ?5H@3HLwcJ`%2e#(f@KS-{;we?dO? zm16u<{`?DstK194_`Ue^B?sf{-MRmbyiu9gPpOccfAbFh{#XU>-pxHt_>(>8=UX5B zSsl0+!ZnGfw8Q(w!#v*_<2(28{<^~TmOO96%_q3)7+;lmCfx4G^A6mTxDPiZ^&@yF z$*UPypGWxk>2TlVZo%~jxjQ1C!QF$0owygk4T;BaRpP0SCG%4r=k*P^Ey>Rj``>|I zpC7F*Z-$tOmHk0RPz@5W9zZ`B9aW59<^C)-i@#OlnYx1AZ z$$)F?cs>iRujl=LiT=!u++F02&v|`c_y(R2g@4Zd0LHhz;QkLhT+Th^mgIctpK{mW z(P!Krf*T(9XW-#lKL0GZCi(a4ufR>ozrSA$SJ(6U>)_EL?z`cx!yX<9P>eNPa)SYjArV-{0jTU&wtk z+#SR{gnOGT`hJ#%_0wzc>o-E)xt;q}c$~_;a+PHLBaM3o#y6Jm{_7(j&g0%19!q{d zoF($JdEUnOaXH>!E?kNE{s!>yIQJOtT;Z;DNX~D3k$VO_D9QU9Bj)!8pWhs~{tov% zk*~t*Z-xhN@w|=xT*>eM*oVA7n1B8_E_@TOe;Mu`;9l|8Vp4J)t7x48zhV?TV^ZF+8ZX@mvJlMtS`|wET`69R?=}&zI=dV1^8^X(Rx8Z69 z?w)X!`!%dj(1Lr2e0Ur8V&S)Q*Pc!0=ibUa18!^FZMad3doEnB!95V;f5Z2$2(C(= zziOAHe^ruChuhb9{Vcen@cvx5as&5#xL<;M40o^Nu4N|uN2R!D!oBOc=fH!K+yl6M z6ZcqnS?-lnllM#gA?{jNtp8~K^KW&L4`1TmR`>+&&x!HJa32phhH-yg)E~#)hr5IL z_g4ny7yZWH-@ifLT-#0g|Ni^Gzd!7#7~ki979OqOe&cP)`kTwR*MK|Axi^FR?{R+u z?t0vN!-Lh_N5jpz+^55}Rovf&`%AcIVg198xNk<@{*e1&xW1Ts5!_kH{kp2j`ulHk zuL@V+;ocY?zs0>B+?1?uA9$F{^P|N03%SpQJM*}&fGd*x7jRpW58;NSzoWv>bf(wG zDY#qoDD~@ZPu4#=!Tnaa(Y!6q>u~iF&rkX@cNzM`u!c~_yghEU%dVl zxFebW0(cnn{KxS45#HYxxZj`qez@C$`w6%rS)UTslJ)Z>^Gk(?XL$cQ+&RtNfcwpO zf6u~=65OAM+jn!HDDs#1_-C#p^YhE{yoI-<+|P^g zpW)BHO8C2h+G{-D2p&%3-bwu3!8zQA!c9qj23#G_^Pb30=I-M8V2|_f?==RJ`P~b5B>ks!8}PsTjxL#h8{}0hxcc~ zjaRw%LVeBUZX+K{^5c-V=kom9V*YP%Uk49f=e`f_OXlyQKl3e~KQ6{!!u|R?lKX@C zKKE3(vWR;lxUr1;7R6_w&L7?l)=4{=^?}uMT%V;@%Xl?BQ<0{R7?+3R}avvq?|Hge5JU-8T z2|WCedp{ID-1>+A|DSYtcpd-$Z=K+N z8SVq&rX)WFZb*D7+`hv5-zdgU;p6WUu5kBpe>Wr^!tHB({1_fy<^DIuSIhG8Z>WX+ zxx&|9gR57$KL~gKkklUm_avU$eZc?T9|FnvuOaV9#!pAym(>4Q^e^$R;J#%1 zU*VR-mAjJlRpXBI^ViLATjF=ZV~MB3{WH9NJ9yNPfBx$ZcOT(Df0qSU-sbx|NsRvy z_XTk8WA2~9gAcjyfydjq{|Q%ja98e5*57=W`)zP_8TY1eXEFBFb756Q0{eA9*aMk6060U^Yudkh~um3&wRJi&k|M%%s&!)=Klfx8mF0JkL9 zNBOj5{S`^R9^9AY+rdpqzNc`>{tkyb8~FN86ZwGqJ8*X!_fO%P5tDUFm`M(<$83;Ko$$rpQY?8}3cw`H7fcIGX!xxce%15B2Sd z+za6G4DLmu|LNS-p2_+cIo#9Xfy6W6{$!qa;PF`Q3o-v_4EH?b9f$kpV*Os>z8|hh z&gU87sr>!>`g@b>%eaC6|J%y&uoU;2aODE;uOVFhgL^x;{X6%*aOX7lVWR#??$hA< z3GR!<_{X__3XdiIe=F)s`uhWJ?&I~(!j<2+-&8NzANNo0_rQ%q+*`uUU${R5_m6NN z2Dg6ZJ_YVZ+~0x6lJVEWBT4@u+&jqY|0?o(xySJE9QV@oll67};m(iTuWOL3uOc~L zmEqoveEhm_{Ti>|79L*Z-WTpl^4ai6;p4mTpbYo-;F{$8ZGl_Y^ZX&Wm%{xVJS^h# zyP;vSzPiM3gIkjG)es*4#=n1k93Du#KiqEGmA>DNgewO38F0Tn_XWad^1qMzF+7^h zJ%ERU_}@=G1h@Ne|3|pRy_}w`zc!7JUtRcg?mFCkm3wQr-;Iyo8?H-ytf>Dy&ligK zo9DO}3-8PQb<_`D;r*`=p38k5Ty4YaZ-;x2aNh?H-{AF6!R-ayFT%CClJ&JD`I>O&Bc5*t*H&=P#rf6N zaSw#Q&OL$$`P@@_C-*Ps6Yje3HQY1d<|^(ET=|^)6PUlfo_m&9KZ#F)n_uvJ9>$M0 zabJpj@E!LJV*DxGL)5pw;$937CHohmz9-2agIk~R`l(j3f8jjt2HckT71R%Ncs>hx z)#dKO%~{+F;Q9>iG2DBbyV@t2pD*#-nyubGFU^(|b zaP=MTIT+vC&fSOWA@@Y+L&IU?bcs;Q0_9=W#y{S9f#2u355w zk!1Zt%->nS^D*38#67ida(=Y8xL3pY##Zi4;odgx7q3g|s~!0FcTXc9?&UrJ9?a!F z9v)5Qz5s5P;Ql#W-NXHBxKhYHf_snhpC7mYcT4kpI@UiP!=L||aOY+24&0i^Jr5pE z<{rY09PY(%?Hu1kT_gr{%hI;|rIl;YH)c>1%TEC?K=p^?{ zxP6v;4%|4+Js+-3;OiT~{n6Z0`X~MQtGMfM>pUO7;{D0}!}*iDF8p`ynW*nh;^RAT zWjgmfxIL5m6Byqp~9y}V!=hqq@Jixs>+|>B^ zBjJX`=fEwAFBkcde1A8?gAv?+gqy>;{|i@NIIKR z@%0-AcOK&P=Zo2-KM68lq|`+vB9 zhaSJazQp*-5bi$+@6Y{jc)X5#O3P&bwC>zBxLuK-pXPA$NuD?1@x9!ihx_+%pAL7^ zxi5ix2KUe5Q3LLK;o5_IeklX-d^^kcFAc7x^6MiL?o{CU9JpPD=kwvN%JW5V;})Jz z%}V5yZ>2nU z4Icl&`_nMKbDVoR^2YVNen+^wo#*?&qvkySGF&Ok^BL$*y~uqI^3D|QE8uZ9_w8c* ztNi@^1UL3_zX*>u@%rT+O7=%@!RKEa?(X7w8}ru`o_|o}v$#J4*XnZ573c2-?!%Dx zJ97_^56|%aXCfb_@cg@Qrz-b+(SH^0`{7YF?kC0glJ~EmL~{LwWBC4F72``jKi%Fc z*5GMpVq)5$^CIVT&v0ZD-`)!+>79<#4m~Z{doTt*2i4PJqPYB;_eIo zlzXa?oG(lA`JxHjlz1n&)0fvD0#~2o{wmzHxG#n4lJPgey*@nuBixqci$#6O=g;yF zO9m)B50B%eC3AiiqUU2m#e!dE^zxoR9FC(wK%v~9b_k;Jj&p}=*&EHSn zha081r=h-Gl6!!>EBX9pBJYjm{T)Ew|Brt^b`~BNb1(l$vcGW!-rv1&w<7lpcyKfK z{_t=W?|-atk9#)euUzB(yU0g3@bOo|6^Ube5 z-Vm-n%iY8IF?;a)R{`9Ld4KIuKlqr}?+^FZaDN4EFXp}w9v|i7e+GA!^L!}sE4d#R zUWfbjk79lAB& z`*%LScaZlb&!_cpPvRM`xKvFj_}UhE4NL~ zhyO75hVY<0_dL}1p5PwBou|3Sa9h$}dyH>vY zCfsx3eq-+Sa6Wv==l3>ndl}!qZg5xUK2Z1-?o;93VeX6IzU1>uAm%rV&u=~Q_90&X zd$=z7e)+iYyZQ5{bVhQ0#dq=hdv)Qb`1lXNBgyw09pSp<-#>JN`;zbHUx0@apDM=p zc>hb_+7j;T;od3kd*SwC?x*4ALhdP#CF^U<;$9Q(%;4Ta_qqX#;O-CHFN*P}aKE{Ivc9&% zJss!68qd8p^6CWc4~qKpxaXBl&Y$}$_b$krllbp<9ST=o;XYaTRPGDm{$%cJ;np&+y#M2Hb1rua>+8SH{R;B>3GP)pB>Sh0<6a*gl;*!5(}0H(?+jON;Q4`YRpMiX zuj);Ie)KiCC&|AD_a*)X+>!VmG5$*y9lr?fO7fTCkz{?!bxhVjmbeD@Yw-Es5BFZ+ z-U%Lz;yw`WPUJoj9_4VKFY3G8SBv^@bKeQ~?&5w#)NjT8oT&dO_nV%;`R>TQ7ToB} zy#?Iu&izTa*Oz-1+{)rU5$>dOUns_}!#y7!NY39bcqsA1qJA@ezAwP-*4!&}O4iqs z)V~LAOZ*|YA#oFKO8hyvCh?JQUE(=#r9c1owR7QNO@9Ag0gvwFz7ei|%>RAuUUEL|)>P;7%7_|F1I1^Igy9 zJ`Z^{jr#|pzijTCMgC>(2jI~c+&!$X-H`ifeqvtb$I@9xVDLZKJO2A9_RUy@OTUN*Wm8`+?T`kHQWR7ejajPkG#>E`vJK3 z825jKm*%cMoveRcz`X(7`<8oz{=FUCH{X=pKa4NAcR+n(GWRUFKaTrE(cft9xp3z$ z?w`PeXZZ8uTexz8pYPw{VSir#5?t%ey+Y??{grdPenYs`hv(ai{8sM0;NdXtFT?F2 z++BFEjr&r#H-h_mxc(ydy>M0X{BKh(IX_;+^FJYPYy9_@o`HvD_}`zr?wMr$!(aK| zudWC;|KVN}uHVVWS6)o|*Is^#etyy5>PYSeT*>Bc!DC5%2kuSh`BvyZ7|lHod3_@H z0=PASdr#C?Cvz`CK9tOFIP!|a^EqPu>+{dI%ixB@H^WVd{|L7vt`1N3H+q%#r^Brr z?wN2+l6OS?X*{1N@)AFf{=&MLCo(7NGayQ_b z#5=={J9)k@`g3Yk00!iuxn@&;KlhN29o} zfh#X^-vReVa6brlhI0Q09uDDNA~V?^XBhXY@L)9ed*PPD-N5>Jleo7G0R_YAo51F!F5e4{MCzb`^Q_=DfyK8LI2`0qd63-^BK`9I)x8J@oe zj~?g!-P#rV+ktySc$~q#9o)Q+drx@Si2De5(2o17V*JkB--K&VasNcr@5KE(c=#lD zANy-b=6@J@qXo~Of!nRQUxizbaj8?H$9 zcM3di$j8rx>yL0>33pm@-vIYpasLi(NzTtHcqBPLH+IMKsT_a5sR>uhb2s48-%rx_ z>n?EZEcZch>pb_#aPJ)Vg`&PBzgEtgkQ0$EdGM zyaw{Rq`vx6@_ddZ`TLQNFY*4Kgd3&#{-&e8Bk`fg+ogDZ8eEa&Gf`ic0xF_)nJ(KxrMlH`AZ>yrEhcpy0+<$K}zP|VloZs8ZXKLGdt<^B{rmaK0UT)&R5 z&t$kQIbRFJ_!9qE_yykISMXSJe>)<^m*mfj`jY(3y>b7SktYUrBzp7+;cK0grFu^*6y) zi64af68{$-mgV)!^-0#>mgMh-$CCSBOSspKzu$F)`_FN=v3@~c?!AyVEbb%VdNcm{ zY8pJMVbb@zT)3%mUjcWz@%u*rH=gCbAMSVNenR*-?$?Ar%Rk>%?VIeM`xMVNggZ}i zZwog&aqkHaP3|v=d`Ipx;qiXHzOJ}_B>q0~c2{0M5Z;CRA$XL@JztFfAooJJ_W*b0 z<>dbAH|Ks9<6A2Ca?d6EXO-ukhWg$DzJ3{SRpM!=Z%e*^ZUy%n@awA!-0a5B-w1d( zhxa!JuFc}U5+41{{R@$gxqk6#N^*i^Da7E$+;bs%wUmoTcHs(H6t`}|9j-~- zge%i{-iAjK&xPw#c|L&KlKfJvk3EU!H^Acw+z-G#hx=K0C|Uoq{gd+*OU_>!+?I@A zg!x&E`T0__ll=)7ac_lwId08|Gnsc6!%vz;rCk{=6(`+dj$7uaCHp#Y6Fw~b4PP;4)@1#e-^Gwd<5JY%k#6~ zk)*%(;Kq+Uze)H$?)%{058R93!CvmyWhLulN%p5a+&;kbcf(_ew}iV(c>cvo$^9oN z7DX zSKL!a0s-CFjGCcxAX!jz2%^z^$^}9~AXp=i_&W2XncP z7UN&w{+g(Nj{AFX?;q~@IDcjl_d>WcmAf(~x&G}b+&7Bx|Kq-2_$BUV;94>F8wV%* z7kB5^XHB>j@w@@If8jp(zvTK;$MXG6!~Cu3Jf8tKr*ZFv@pXmQ9|jMHanC~iun+ef zxZ8_+p76okb1=S{#eD@_?azIi$dBfJ6dsM@ehqHD%)R=MWdEI^+?&AFA>7-Gyv03B zl;<( zUJI_>#=RxnNag+v+$+g_0NlNW`vkZp>F+JLD#@>c2Nik!9b)`S+<$@_lKek#$Kd$_ z@qBuSyJ}cLxZ1Vo2NWS0F;r2paKNB9j!`*@F68{$c={5QK|0ep^xL=0bcW|%xBKE%y_j+(Q zjeA?TTAO<}xL%9c`<%H?&XJL zed}_s4cF%L^I^c-F4iHus^ZST^*O)|Dq4MuS9+Q6YiVf{!;FT;m$kU(=mSd9`{VRy_|b7>IZYV zt1l({=Sn;c9=JUJsK`saugJf~^Aq6y9PSI?&R^VDi}5AC9qvi|M|e=3Umrzq)8pfx z7vs<7o{jxc^0?>1&6V8q;ob+_ZyK5GpEZyB-Edvv55cvCJb&#P-Y*t#?}B{r6Zb;& z@BYHQSj_Kd?y2MP{mUut>G0?@cMGnZ;YPZRx1d?7rzo!4Ij53BL_*G+J{63-tJ<5%SV zFWh^af4(d~HrYS@R-R9TYgM>EBJ%0nyTQE&xQ`ItoO^)%Gw$a;ON{?C_qXBU6Wmw9 zgRb0nz@2W~e}dGCJpYo&SLZ%Uj9-`g zGI%VxKWq?QmFM@uBgyb$0+*4mk=I6Z6eGJymp3QweTv^0@ z4cu7F-N5+nJKVG2o}~VFs2@r8-$h<~lh@A|W9_#l6f# ztp5n^>ZIg+y92qW!_6%2ccH%8ll#MPyEpgVaHkjd@gn~m_qlM(;%=e;a5(oIF~7mw zeYiS=d!cYiePwd8zTxvcp9XgaabJP?`I7hJ&2U%Zhv3G&{Qdo3xGnK=PI7)siQfZP z>hb!Iz*UL&fa?+;CB~QdT(~9ikKnGvcff6l{{q(}|Nh1l`)Bk0%Z8gTa`)h>zaC zfO`^e4fiG91@2tnzn^w6+?4n@c;xf`X2Ju>_zU5F0ndL9_rBu353cX${+AekANLz4 zCF>hi;lF>W23-A@=bOXLv)nriAHwSo68$o3* zho5r42sbx!SEeS{pYl0(4X%B{z0Blfe~f(Y)!^3Me0}eQ`xUvjf!me1_k;%r`S{sz z^8okP;mQ{7tKs@)?z`b}$h~T*WPQT#xF1E{zn#zT3f%mHKi_VflGN9$@_bWxw3m-> zivGUm-X3|sIgho(p#$;{H0u*Dmn+`Ecb7_X4pRHeo({Jp_dg4+4&!+j9`)y* z54Zbpk3{``+*76}{d)ts>+rA(_ZC=Rr#E*KdClT(!;K!?pGE!n8ScY{Kg)eKJlM|9 z*D|=dmHT>l^ey)vM1D8-GjQi??q#PX=hNNA{T{gU8}~=y<}vOr);Ic-yASt&=l+}+ z{{;6(ODFxS$GMM2-rB_dHF)$T_xIq6q`8mzFha%sEdol8A3yCAIrgN_{J=y>GLGF#<=4HOW z8Nx4d?+rI@;Ppqq-T!$0HMn|}`v)R_jl1@0vj1i~{`~t2d0XZE8OVn>a<|}mS?<4x z{>yRCL0&U>f5pg0Kk@lh$Vv9kKFqx?JczirhI>c2_kgPxxf?em<45PXzl3~PiqC(x zaE1GFxKV=pM!0!*XZrhR^2Gl2vKZ*NsxZi>M72%_~hZsL<#{HI8asSo1$0FZ| zyNt zOU_Ex-zmraR(Mp3dwsa4ac>6?OLBidB^f{J#P_$S$V<-e%VPXayuN|!L#@Hx64#H! z9k_ct&*#CdYTRd{Kdm+Qm2m%I?mOX18uwq|>J!{A!0kHR%g;{M->uEPCfpg!y}9u2 z+@FH$-M9~iN2R$>fh(_bUnJ^(#@&beJ-P1^d5Ir`+pqDwGACI-`y#(T)PU==c)lgv zoyz@bxYm{X5V$At9Julp&wFt7Q|=o@{Yw1%zYyo&Ys>S+a82U7QD2kP*JdTpKSlEV z%z)eN`1plleigZ&hC4TNFY#KkziJkD4IVY+{vh0vcsJpa`Dek6Tlo6hn7{cbA3ql! zw&5PYtsl7;!QDgL)!E7Z=!dzd!-GQZ*_faG1NS%K&VKF|>RY?GyYQ%hdm!=>kKyJ{ zp4a9i^Y?z{Zo$&UjSn~dxDSS82=fG`==ZpN; zJYNKlB>R`@CjCbd&u73@iD$$8qdcDnH-6zB!j&(%7sK^0xTnoc`nNW6H{s46?hag$ zxG(bG@_Yohzu~UVOZwA(<8HvsU%A`xSd#bP&M}@ZfZLn7$8c{GckT70|4_0&8F2M` zp3jE6A@@9ymv|vu`HtsP-oXC<$vqwJ{=q#9t`~97g$KWL58%-j?nQ7_;;C;Y{Tl(# z8*o>$zH4#+_P6r9g}kzZ`}fF)jriXm{uS;@{{GD=xOs-xzs^mb@5*uRmErLv?)BkX zCI0)H9})Gda_=tcSK~e!uBLLI4G$V}UkP_AbKeSgPxAR4gquxx{x^6iS-*2){0cl@ zdM?)g3Ln2JJU+o)hg%YVSky1i$A1#;soeX)?Q4Ae&bKAkhx0G@(a484@cKD$^Dgdh z!HqiHSHhJB+_%BKJGk$K+jnyR1MU>_`JIP{r@0@jI_Q7j8*4H5lzGYi>!tYkslu=4 z?uh%-fWGwm>G~qypL=_F@ErH&;c+kS4&0Y`u5gRz*TD7O+;_u+zTERLf2#}s`>i27 z%;bI)_1&BJ-|svPH+1ePuP6KGG~#{-Je1^{iu`Rn-xlsy<=!3cR_8th9@pUh3S6(o zeI7jc=UIBbmWX^~p8piCZQ=Qy@Ng^l!*D<5eqQ+3+$+A3?2o#eyAHP{{y5y(%kweL zmmP8+fP7rYeKK6%&wUA8JIH;5@Lk;Z!R^1epN4w@_p2g*miw)5ChKc{$NfII^)2@& z;Ochn1L6Ko?hf4D!ToKxvxoayQD3tE-@&bKc>W|@In2G}Tgm!pe{!!5w|?c`OyukF z>+3PNSDt%MxLJ$)3vmB#?o;7LL+*> zzUICZt{&t52|SLt?}i(Haz6@pf8~Aw9-QWW^V`Y#>LT&c&s z!h&RfT#b7@cvypbJCSe5y{E|E#eI~>zsRqTY4GT7p0~vPsTTJ)#rSi0{Z(*nHus%y zeIEB?aL46-1s=W5-9i8Eo7}4|O!miH!M!QmmADBHBt8`GOWYIJpTuV%uYJn)l_u$c^+`oi}L%H`XldO+*ANT#pJFU2% zgj>V;`u!)yZ^QFdmL%gV63@c^s892}EBq<$`EcWL?h!oB;I5;;uoL%=aLeJ|1MW@a zJ{Yc!;_H`^n_R!qIPMdX*EVv`6+VLd2XOZ`-ro+m^9a9we}-EI_p@+Ya($HalKppE z@_ZGz+Jbv+xGlNAJP0=)=K1z;OOo#kHzht=)R*`?xGV9G;OZLw{vN=+Ros7oM_ag` zg2w^(lJ6$#A8hAd18!~Oo`&;jZ|0r>_cn1)7vqoR=d%smZOZr0gd6vB?+w?pdHomQ z;Z@$>Ot>QP_u;<6ub=Jk=o+t|CDyMb&%0v%N^n1l`gT9=m*8=4?v<7%`>)-|y%F5H zfqN%-)Q5W(+`XRrGol@L0 z;O>52zbD-Of%|abhq%v#o09wQ0(f+Q=Y6Ck+&jYE+I)X4xY>*Q7~$Qx7i0aRbA0^Nx0C0;_AmE0 zP~Ygm>#u@aDg67N_3-Eh?mOUiD}I072iGLex8Fs5$^U;UhAV@4{}tX#_E#Oiy)In8 ziF*dzF2j8QT*=}-5gu0NzDVRHz8)S_=lO%eQ@N*O|Km#BGsXFk_&L-!%kzAt70LQK z<+wM3s};FF0XHge9}L%3?m2MlX71UTpMNX&TzFK4`+KPGe!-vrU%>q@x$lE3lKe@y zHNuGHoChs)?M*vI?3?fqo`xmW%G*KZ;BMsVXG z_iXHcbeMZC-2IVzzBoVi`1*Im_|^rU9}HK^@b?b~?%v3~5aXL?d3|MJa{pBR<~|Sg z{eQWy68-gx{A z_l8>&x#x)S`*P2NJAJqp2!Dlp3^&JfPhFJkzcY@z0S_l|&w>XMcj2a_zkIkM@$pzc z+v4LdgonMjN2srj=AN=RnZKFMeLd={levEf51!?I8m@KbUh1Rd{8~?O*U_K-40jXm zOV&Rd?n&H(JN#L99ULEsS+Hp^Z8}+$&hP%tS4~2Vgao5ma z*p<5hS2MX=Vt#LMpN8?Hm$)wz{g2=tz_p>=e}?NrxL*?a!Q5~CI5~g%Anr}z#z5{* z!QKAcbHw^R&)r5oet|z9e36&ze<9qK+&`2h$@#M+J_+MHJ$Zj=$lE=*n{cf=_r+p; zZ0;N2`Y`SX;l?QL|H9*u+_TZ2DtZ2Ra7E$;a9!fDn7_nRJ=|Xeaz+HV8_qPfB{MHuZPv+hR9_8@*-QmG>?!)2sEbcSm z=1lI(#rSi$Zx;FX+<%6LWBB||!xhQ<-37QN`Tnis>SX_dhxq6JN^o;0-`~1$L*fq$ zU;PCA`K)emdoQp55w*qe#Z0f!{c?_1Gu%G`;Wr&x&I4yzTjTYPuADj$h|gP z`>ZWp9|Iom=Kp^FY2mN&-#XRfP3?* z$@Q-u;(iKwe=qmz)?oejalc*oCGHL3!FSvrhWkHo?*e!Ca~}$izvn&yZeQU(2X0*E zKOejd9$n;~57%$&LC@a-xK)dP{yhbEs&KysSF3Zc^hvTm>RsIHz}-Xq{;1>m;1+T> z;lTm!tx?}P%-u#lZrq)&j|+DiarfcsE?&P7?(g8PEXDILpL=igZ*1c}Uaap1?i%WA z`?+Vp?Y-O=it#_={yE%T%Y7f*54oR#JA1g7U7MVr@Eh)FaAi05M}=SJZe#xLMeZ&< zxWK))=2G-BLgS!O}s&ik5 z`c_Tu4)SI?cMl#lu_HL_iAxp4>yK!-wRiVaF5~k^W4jSmaLCkpZh&$?o#dx z;MyYYYvAFV+;@rbEA#dH32yzu^MAw5zqyy*kgTuzGxs~;%1_)|!ku;8O}M|7dp|M$ zLGF$i{{Z(K+`r;N?s@P?QhyQZ8xhZc3Xde~^9|fN$@9hH`SBO`qsZ%rx&H?b4spMA zW3qqxe(v|dgMHjP!Q;K$2g9B3xlf0imHFr6T(}~6zO03ZlHZTF1@7L$&;J3q5%B&_ z!0k=kufmn{+$(;Otgm~Sdp)>6k9%9;A@}Ft&Q9(HIKS>n?hf+CGVVpln+v%wLSB*F zf7Zi;i#)Hsm%P9DUvbyr?hfuIJlM|N7WKDr{{j8kjrsX-D`Ni&c>Zs(ens3}j2~|0 z?!(P3+)ICn`|EGqHMrfGe|~#F+#JV!BHSLs zeG%N1oS*e@YcJ35gDV#IKjB_??w5sc=3YKX&Y%4p_gZj&J@@>`x=^4dDL6+}py#-rW1bgJ#^vz+=hz zdJXQ~!Sf#6AHe-%xK)GuR=6uUUxo1SS)PyKYCG;XZA;cSe3JWJ!n<;B3Aa0N&xD(u zx!a<|Db-1>~qW6#GaPK|t8$|s)?%%`X34Hw1aCZyOE8COxH7@eJj_0#F zhKSlks+)M08 z);Ic_`yFuSD);7a_X>9t`=hMl`}?%0e~ssDS4p3jAw<9I%R`)~35 zF|mGcaK8kP=W(z26|Vns++&O%59R&ULq0Cc^KIeLo80@rLrMSY%4Ge6Q9Pdx_h062 z!Obz;9k`p#eVpjO0{1uI+FMN7^`mILZ&f@t1d3zSWKEFoZPFT&F9&YD!1KNse z&s%USo9A6ozc0@RaN}w2Fo4&6e+Un6;rVT%{xF_*(Vv#W^Z9VEH1`M|mg25_ zjQuOgU4wh$xM#rKvD|IAK9Rc%x5smjus-n&?mqI-RK9+fkk?-2`4D+6hv#o8NY1A> zo#$iGe|_$$tCICKb?ye-`;Pm)7~gHg{SkQd1NSV{cW3bPp95E4<(>!Er}FwC+?>R{ z81B5nJ#}@mKDNWXE9R$65h!<)Gmz=I!o{iAU8824*%|1kH| zud#l=aL>p7+2whE5j-BwJ!MUDeuHw{b$DEsdnVl3&iiYE{*7(ivyoQ{x#z-Fn~(nl z>U*1bK0w~=&;P#WK;+F+JYR%-T$PWX@(J#L5}$zj{%t(J5N?0Q{ZqK}IrlV-@0{TM zXTY^0?t4%_{(}1-aN{HHm*ILU@2~RiB1&i@f$V_b=h zcmCww4Q~IzJreV)#^;x^Ho1QM+qsVt^ULS;XTzgUxG#f;lJ74!!sD|%zekLJh5N5? zr4;w`aO(v=ze?XG`{xeh-Vmc&0E`WnZ1{oCRCMPC12xN?{|($&#Qk@;_ZMHkiy~i# zpYICaCHtq$Qj0;|}g4;9+HceP?3*-JyK`v&Hzg^89;nRdW4j zqrP&1_m?aD9QS*2;i?)$~~i@0Z?e`_)K7uYV`*MD8O7Vz`m1|H1k-W_gk z(|)8-94n+MleiCVBofgc~RM z{My6q6Wsg4t>fHB!~IIUzc=A=dG4#=&S$*-*Km6s_dnoKHD15Ofn-g9oSi`%4H9_weyMi}^|3@1BRNDSZ5C zaQhuz-xEHUd$E|`LGG!aCF>jIb5Dm`pL5U0_}JDF&-a8oe{#>n{DUjpM8 zMf47$gK4r&Zx+3S2oO3EgkFLm6w^gB9R!5lL~lvBGuq!^Wq60Z_k8Dk_uO;-d(P{f zcb|Qqo!y;X$&zfDwrkg?xd+X!quyMQ=I_C+)o7mjvUdKAyJ=n++_Z=0b-*q8XxZYxONKQ4lsXVCYD zSK#(&x<1)e?f9Ff(L5)(VLa`x0&bl`*Ea{ZucIHI2ZGzy(tHNEa}CYcf;(2z`~bK? z@&1()4Ao73DQcx#&bz`Z}y zJjHcwd^&s6yfC=AFU<`*we#y~PxJbyw{)a=H^FT*&nNt?Xx;+c(vs#Az|HMw?gqEE zrTHarV-K1q+J*h^M)R_QccytaaC;}3&jWXNrMU;(+lA&2z#YA4o?*Ave^XDI*8#Uo zq`4j3HHqf)gnvBEW5A8$X#O7DK7r<@JzD?$3jbJ)FW+>!elfVoN%K1JJECcB2RA7A zJaF?gx;_TnIECi#!EIA%o^P+V|2{?iR_vcAlCD1oZW}}M7V!HA)BFYM?L%pv{DyXa zu@9oT1Acpdn!CmJ?KJm++Xm7+(I49JaSWij8Qe0O<~DHuNSZqZ52v{Y+%=5mesJFi znrGOj_1~c27I1e2U2g}sI%r-H=f|JT8hG9yKYu6-?%qq+HvzZprnw#5x{Kyh!R>o! zz8c(ghUR~Q8@)7lVgGF>Xzl^`AEUVs+;@oPi98rz2Wfr-{qr86`A4z;9-3#ksa-#| zeKao(?$}RrGy3N`O7j-r<`|kchTnXJ=5}!ZMVe0ox89)ndT`@4njZuAoum0*;P$gL z{}&|f;;8qWqIn%~_eq+!1vl)Z`7m(DcABpi=WiR$XQAG^ zh31>VjhktH3f%rX%^wT@TAIhZr5#`E8k)zT{~kBZ{owwMG|vLRVKvQ5fjfSs`H$eP z4K(irZdyp4{-l1MDz6Ep3QXs@`5`y(7Y75H#_aO z;PKU3lje4CM;)5Gzzy|i?iD;obpxN|*Kgi~o3qnA!=KvYztKc<3%EZs&F$chEHtlz z(??LlV z;PzoOPx-KOpx^FpG|vz2Rq(3d#;$aI8*rDRelWO4!K1+~18Dy;aKGaC>=C>(U4IeW zW2gBOa9bamCwSC3aQw`Q(=#Jn<9l z{Fo-u+>CmY;`nAqy?ZiUUk=<7PV;7>z7Ne?VEbmp{`Ez@%TCu1MZLE_&8MK=H-P4A zME}Rpd>;H3h2JCmgXsDj;KrUb{~O$@*uQj7we#m6L)RApxAmiWeQ@hQns)&=DC(oY z&5HfoA;!-w+P_5f?+wlOfV&ku7TkY_u73$`zen@r&$Q!byifDI;EoqGw}6`z+xKDr zjf(wmje5&pw11fJ-=+B+aI?a{8QlGdu0IZLQ}jR4A?^O*_tW(cP;Y-t^Z3uT<7vbE5=U+aNk4P-wfRSlIC`BgJOJ50rx1*&l+%R|C;3U z&%NNb9u|_ju>Y10G(V4ee@~h}26wihc>=$7{;XD-X9KtOrMUlwBzsVrQnCP z>(kwV=IK#y??dw<;NG@0uM2Ka9N!M$o(6Qi1Ki()=8HsqGn(%L_co__EV!#1%}qEy zW`+NW@VB7r6Tj4szw1Yu=Mh}7e^tOOUFrJf;O?e0?=R|qqWKhXTR)mF2R9F(`7Us4 zYnopGH#MU9Gf}VTf09?)@iQroZ!U0aE81@Xw_UGk;FJ9NMFVh`;`M=6V*7v5^<6~0 z;`M=WaAR${f6?G(1z!Q~s72Qw5PT5*`p0E(yMkLVzD;##zYW}~=${{clj8U#c-@&D zb%VjLIQ|phx2>TcA2XxgQ zGR^CNds@+aAdatDas5vK_bIO5#e&zjkmKJCZc~h354iv4f3M#VX5(=Z+@auCg#Q*@ z{~X+;;PKvS*PkgJeSb*{Zc%JMJGfPG{~wCuZ&2{cs5dKk3vkzIdjI->`>N4A65P3* zK0mX-JwCerS8%I>?*MnKqwjA=!7Zz3ei_`TsDBRb{)Mjp0PbB$^F;5o^J`m6^W5O> zWi&4eZd^h0%HU4L<8MQ7kAmC4U5fEJ4BV&S)4)x)73UA!rr>{y?JKxXY+u1YiR~+% zpQU+^Fp9S|kru{x}mx8|pHz%{eVD<0X4+p0 z+@W}XuOYa(8eMM_+gJ2I9NevVe3~k@ui(qTE%oT_?-Scs@U!3^1)qn<2U}g*zXRN- z`2FD$xIJ8x*`6xc>%SZv}TArnwE=q4<1TZ*b#Nx_%V6MZu?m`?k~d%fVguX}$y8 zuHeVO9WUwnYv4`=e=7JLy58`&c7832&(Ea+w<(^#&}S?f84o&^!aU zxh}nb1;DN6>H5mx_H{IG25#6vbHg$1_dBzqz8C6UH|Y8?!he$HOTpcnXub{HdYI-X z!Oam>$@BXN+_ajm5BnF#zd}v2J`K44Ak7Pcn-0^w8n{it+lcKe_)u`i8QLEW?pjUr zRp3qq-!J@Y==$s6hK)3T2kzNG^Y1=)4jfmDV*A;^t>@_a^5FhWG;auQ+ClR!f^Vn! zXmICNn$HEdo~8LFaQjZ09~Rr+M)MosentOZgF6(*KaoMZKAno=lNsFLrng@L+~lCI z9}}*BZxqd~;Qlc*cYqtm(R>HELvj5+5PSk%Z#u5+zhyklTY$SGY2HX2AD4x^{(FGi zm(qL!{I<^Y@pXfHJJI|SxVz}U;U0)X5)0*ZsaFdPZPH?w^?-2Eh<3B;1-xBoWs|(y#jOIH8Pfb6*T*CHU zrRnwx^9iUo7ozz~)O)MZJbsAQfA2t= zrw8}cqInT;=O6U>uK{lK(7YA6MZpJxyA^yIxJ%LhW#Hy4^!E3HJL1ti7TlDK=58E+ z*8%$Z@oUr@>eBoY>fJ-=rn4i)SJB8@%L1v z>#g7x1-FCSYSHyha8pg1A3*;c6={A2+}EAv@4&5!^PehA+do?wy1odwaSVNa-D3YI z(Y!wD4UK4jM{s)unmfSFb7}u2Y~S?@%?)R;f8A*R68Qa!-u{6r{Ny+?k)|C$WDf1vj0=@heW(KNiQY7|rX5`oc8t2JR?F zb0@f^2+cjBz7WlQ;65|W6P?rc&ry`-iQ{S9t9bt|AL{)>>G6>R^)>~s1nwJ5*S7#S zwW9miAKdT*&8G@~W16oK{w_54fE(M=+=~5ocA)uCaC0QRe^=qRm8a|9fjh(K`qc4p z{z7S94BY;de*Rb;+?|rHZw~HK)Xx*={~hh$0d7>h|J+|}{|R01L%l16?%x#Do0HId zDY!@B-wp0naKm}+`1%z5BI+HA=Wma|O=;-Tv47UIG@pceM?IR`QEzNQb0@f=EzOt1Z)ivJ?cnD6 zH1~oVo6`J|;2mkc1O0O<`tJjGDEgo1f_DDh)9Cv{{Dc~}%%gdBaF>Et0yoU1>sx@E z74-waeTx2>(SNUkPZRz{^!C?+I~DvexM3k(e+%5CsBeM(xfK2TTWo(e?RTKwwuI&x z5^3khJcs5b!Hu(M-Vofc=zni;hoXNj^v|Q%zX_04+Qrr_!Mx%0lI!QxLv^y3jZm({u;RX z2+f~?+hS-QFNt>i4997n3EXm&=4No~F`CyB^@{Dc0JkapeZYO=>DNEUft!2M_t&{% z`%~%HUt=)-EpKSPS@iEE%};{ckI?)fxLe`(i|g+>-Tw@+xIf&dd0D{^(%c5_-avB) zxcw^4SA$zm(L4s+d!FVGz>T|T{u#%|dy+nWX_IRE?|4D;5`s^rd0lYVY?`+RH_xK^ zNN`g$&1Vb$FElq^)cWsRNAt4a<^wd}1i$S*%};?FKGXcJsE6@lwBLr~=SW1?JHf5*>G9_Q_gtp^4+P&zbK@oL z_?Q%*&tH!ITc6VPyTC1q`%78)EsFDh9`(j)wBLq$a}Ij{pP}9{j=sMp{7&0H<8+$m z1b0lJc@=Q;4>WHE?sd@p>jmzMpm~(ozJf0VcPm~W-X!WX(BtzYxG4wCZ-YCR()=~J zO;K-5t{q=PCc3@=xZ``8PY~x8nPSiJ``7*Kn zJTza8^Y89J^L?mym!x@&7(bP1eiik;<}`l;ZvUC)sf^n3_u6Ql2i!fK=9R!L^Jv~e z_(#%wFt~p{%_oC9BWS)H+%S#iyTDyNX?|X8zc0=GV*9gco;0O){A`11{s8CCFplQ= zQSa?Ya|^h?6U|$R?a!onqRU$U?A_`6vl-mcgXS&3eTvV|^%4D3e12~{xceym`0oPu zhSQIaL$Q7HD4Op=y`?<;`;8aewuR<*!JSv>{)ME{j-Tf`&9i{JcGLdi;P%ZluLJH= zd_Jfxxak*(`e7WMuSG;acKSMZ@? z{}sF!>dlJJ*Np=At)jO-9o(jP{b3`xaVcGY5ZtNweA{(!*L1r6J-BB!&F5kNO$%tA zCXIIfTvKRX1l&E1=5@h6%V^#X+_I47;o!Dtn$H6FJ8Ax#@QygsXE6!h2aEs#n_X77j z>G3lL+&G%<{}OPY;`P5B;GSOe^N+J)`&DTF6XCx{KmQ3$uN^$~CjTMN^?A?kg9)Bg5? zEB0>)xV;kXp9XFyL-VEJ&JXnVcYxbc)Abj?tr_Y2(**3lqYlmesCT`me}7qxded8) z$ACLi(f79p;P&t7?HjLYwiGKV-kIQI)Xc0^!;tH=%3>KxhddY#ru0J1pkvhK6`}!Ak8mMh_lMgKhLzg59oq23=sZ+{TDHIn8| zaF2uLYr%aAzwes1|0YHM4x-+uI6gPQ9SZ&t+#OE$FHIJ0`vyh5;kw2xivAT5^@{zk z3vN^JPT*d}`5guBA5Hgvo~R#2^UdHM1&;x@D)=36gMxnqH;t6c z3Vs^gH;wk+2lpuWXK;(ce+m2NRlI-reKzg*+H%p4uVul#6Y2Y}72Kux`z6B-oIeH6 z2X2a@x8DbTr{eR;6Gi{Z)BRf^>J@w+xW6o2e+}GNiso+wSNKzzwEcI^q|a{=aPMrI z*B15jXx;|gU7GIS0C4LPx_$zx+P!O48e}32s;He+O{4qJB8IwH)oA2X3B0_iqchX%@{-f*a@3{0_KH zF+M+lTNl&y$#ZDO&ryc%e;#m?;`~8w6S4R#7W^N~L)p6dSj0yScZrF&P1CeK zihbhy!`s2@iS^~V7%xWLH}bO;g0~|af$hwIlkW(d0^4D2-apRyTs4VtBkmt!8>;mU zMn)|E-3Pu6v7NxSOmXY*<$U7HdGNjk`e$YhOI#hxzA!!>cyKP(3DodqY!c2uVr4%q z|6LZS4M6QjAWxyK!)pV%KW^LFVf!5L^6lU-e&*}y9gj3@ozH9%{o^&F&6;1P|MZzH z756*wxR;hK6CS=U58e-XU)ZAmOya&M9v{;&Dm*5IpraiC*jzr=l6JU;W~U)CQZ3bkb{GgxpR6_2Ol90dI1*a|oi!Y>{- z#q+1&V{Ksf4}Q4?PvUV*JfGp+75y>IVu{p$@wg?Pzwq(=W&L^j>nFhayk904`ymY^ z@w~u~=LZRc*I)hh`r>(j5zhy?j`xSxnM$!1{DI@emN~JW7xTalTG&oHSa?|Q75P5% zI(D!eEVnR?i>3V5!28ep?qDlD;0-qMZE4FAd|AfJwPlIEEaTUWwk+|NWl6p)OY&ve zXts=Z!{LbAhU3e!xNSsySr)gA$S=#{wh{GZS==_pux0!>IXrRO82e>e+&1_S)7FdI z#`rJG;8@zA)JY{4v zoa#V-`SIh&nx9HOM)`T;=ZUYw&jUa1Nm=mw&vz`6vtYOM!1a-m%~P>R&4S;L`Ms3i zWB5Ic-+%bFGO_rcMP?RRSn%g5*;w%Y$iWtUnd;2z7HH4I`~l`==WENqtf**AzgSRWWabd3((JV;+h5bj;ZW5SSjt?;e=H!hG`m z&Kh7p`7yV><2MC^VPH((z?>f&zTAN2QMI*te!lqmu)NjQpMd539P)GJdZR5LH>)Sh z42IExqs)$VZmoV);EG}AA*Ys)2%LR`q5dbWKf?lN-C)>Nrca>Wj?vN*>vw}MF?>G< zwrVg;K;8)cRLH9sOaYGxc{b#F{qyAz{o{LVFg!vYj{Z)=eh)!^79t;v?f--I2V#Fj zf7?s_t@^*&-#{mVe(3doe#KsawFd=8JiC^#|4jl{3cGIpKOP_9?-98A{?GklobgWb zYu)on8#ilk9QpX;%Pm;G1&5jk9OLceR_%Na#dyny z>p_ga;#0NjWiWUd@IlCHA|HtBsXp>v;Ej;?1Q*v^M{sd{b};axZ!mPh`Yo}3U}4Y? zz2hUUpW*O}>n$ADgSg&?V*g*`dKv_tH??*=1_aKQ!62@;zUZIc_J`qo4TmoZ`7rcn z5^{08rz01~TO5ymfk&929Y^#3@9k$huHA3Ncnd==#+%&3|6Bdj9(4@{z3mr&uRRWl z^D`UgU!0#M$i?|7ZPdoY5ZvFIxwTx3UrSjn&w~3QzrXPK-<`4><2yQ6s=cmB$)Ca| z#xLlqW=i2W7Jl@fU%PEgkSgg&Uq^Ei!*8{xHGk9kL;Quwn_I?MzIV)ebHVz1^L4UcxdOjh# zTjjl(z2~NKj@#37y{mkzYPNGZUPnyXpU-eP=ja#XYyXwLSNQ?UHk>K!*pszvtMdbX zPjk0Qi;z>d@;Xwt+?FhR(RwLI6-!?A`HLKe!JS^L>i>O~RPRdWzEvz$N5|*ssUIB5 zXfNe#(Kn|tw2NWE`li+A6wX^ZW1AXL1B&-DlzMz6ZO48$N<=nE^=IQ8-5u80#ebM< zPBbTNUasTT#zPG~J00FJF{V)2Ee-ytKC9YDNAi{tsjvJ!yh5e=v+um?Kg6*tYl@mh zU6GZ4t@-Ej*be;-2XoeWHe%L=N<}RX!phCG8aCJ7SvPrfOwmgNPu|WD)y#1*{NLMc zb}uc|sNcP6!+&q*7+T4`W%d0o`HziuhqhYYiaoz8lkL;FVg;&)FZ^Zix%!Sgn|o!f z)^=8ozdK}(T=ZuHL-pu_n^X4qGy9;fWpaFeRm1QkX60Xhl`fy_S@-rGZrrKrnE2*) z!|kEH^LFi3??8uKe>xUsZ9jZc311J>rW>`Ympp9vH)kI2<%HY2ui5hEo+;i5L!(Zs z#})dyL9gPwmj4=(=BT4&%jbnh_s!UM_r3`U?sd9kNbz_}!Na%rbd9$vMV=!AuRD6g zzH-ctecWm4FS*98sBzJ8X!^)l+oV+O)2;7+cx=$Q=ZOoeq8lOr~1?=JAS@nT-N5D`uWaSIv%h2*Ufhm413pq*CD3&z&h8?9XR;! z{i%*i)9W2w*fMARX0Z=DExtJ3F(mfj(mwI8G&pr>U#>kzA`Ph?N0qEpZ0e7-ug@BD zuufD&=}HIQrs?XraJ1{5sdrn93u$5)+opDtxv`cGa|@5_HYMcm+DVgcPSNMw)n5C1 zuNpcrVt)7!u3Ht#c^h|sbkdS&UdS&o>3?mpZPBHt{dzxbpJ8#tkvG=wl13iC+G${| zA4Buajp(-d#?SxWD1PH}xbeH3WoLwZ7d_v<;Zf)7gGX1`aN?*tWccH5KizyW^mIi1 ztUo-xyfq?gY|+1`94dMuQG-%Xrajyjv1$6UwZrDe9-V3Fxc;{fyF$*dzZX(qL&UL6 zHR~j+GjUzS^Q?Ol&NSsZu(HkRLfz+Y44IVk<9bh;0s9NJ_-jg%H7i1LcN+MyRGmo& zw>RH>qTtSD5tf!E8g&_Q{Yd2|^LxE%NC>%ICVH#V5l<55VL$L;Fm%2D_3fnsBy^~>}rqD{+q4Hp0Q zT!k7?a^v37S%QbyhD!wa4i^(S=25o*= zBmQ?`ulE=x|5jo5k%%jAx~B3s`uHMm^6Sqttve91FUGWUdFKr;Hzs}C@Yi0JkPSJP zPhHZ~wC`bThvVZ%)QpJ9`d6Nlwjq0L=j!(S>xYIBU0e3Bm#sK$=cnu03La`*FC?^6 z;j29pUEbCIQpw3V3jG{WE_U$svtvhWKI!>=U0B7oA*~-58yvBz;HDaf<|VZyYZ~%u z{XWycr)Rg^JbtQv)y$0|=1hM-Iq&7M+nb-d`*`Ei0TI48i3>G5FmL6ukDesa{|pWp z8`EHXg14uC&G-57+9xMRgcOMOoO!jj^zz?d?0t0d`ml(Go5zQ{mb7=3e?6yOfeqb4 z1{$u7$e8-z>akB!_DH(7cSOoc3oq8oJ9AyKhvkoTo7y$vkMOh+`-b<}IQM?9Np%-@ z2)SCjae*fdD{aVnyLN%OqjE+x-t6xD^N-d^!=`=rU|XL&A!VZ9ok}z;;Y9!BJasO# zEfg{@X4t%ca{oJ}=U989*A4PV{PU)AiH#}OMBjG&ygGH|vLT0ScP^EFQL^!E=3Sdm zyhx>p<>5J&)L8xVnDdL@ti;({w1Q}%w^r|$%}_{H$3im+w&&!@SI68 zOFtV!vUSRI(0TQNv)C`c<^SV(+KBL$ZTkNCeBaC+tHw;celuIdg{300yi-&wL~ zQ?rLHm&OaJ`Zz)N@D7<4CfpacW@vOsM6TGX2l6-nao)6D`4Uf<9v0Or{LfnXPF-9* z<8+hVYa$YaC9XZ@>F|$^b>ANw`u(v@$-;g$B-uUf*I^qS2aEjtcv<48KP&xcygsAI zhQ#~he@b>HL)iQ1bm=-}o4j({<;bgr_h*S(yt&cdG6k>wTIJfB;SFA-k1GD==HmlH zaxY(T_H%{4w^D`u6f@5ezA^xPhYT0vzjm|l!UgBGecRu;I&Bv~`>`|Gr7QfZ% z!m(YQKMiiRGs+e=^Raj1(~GMXht91yZ{Ez#QEy}C#{c7vf63$->C1jv-Z!e{^o&jF z?@PSUxTxyTE5G*$tGK@H`wWxY&YM5K$E8Yt4v$KhHU7WL5`1#ziFo=x^SM!B9dcG{ z_Okf;nZJ!W++y^dfng^*od`?Vr`ep6lbjjazUmjXy5;26O^xh%WmLcL z*DcRwxfgk6YfQ#c)#`-Ri}|fx4`=mBeKs^Km!|QLQAOW8cwKHqnu+&UcbY$>L+vQX z<}SaSc>i?Dh+m6eZr;CI*xl&tiI<+(75!#;#$k`Pdcxjy`lZq@|CBkfdDPT@j;}lv zHKXO-IWLad_E#AGYn#=xPe)bC+S3zn_WXmcLH;Zg#~ur7k+V?GpO&3ElHY!HZ=W|; zqdHC>()(GVo~P$@YrVMP-5X&E)|(IS%~0_~w%$W36}oUfY|Z08oONm(Iy$Cf_L1Km zIumsw_Ctm5?K6&j*ComI+a+H`?b@7ZQTLwFmp(QwTJg_ZZ^LdzH!M@W-KDDoeu}rq zmFDj-d(8g!r^B+}c+j%(wTO5hqSC$@cWhCa!Pncj9yX%Ozz1PPYF|H*d)K)OH){Ob zx^}0hQT4+YbR9fxOzclpFZ`XW>HVm`Dy1nFb#~;r6Ah#G#IJEXEW*%af%jekZ_RqE zGhbb`JSx$fO&7ZURr_6zJhyLr-2Q7=@0hovN_vg2*X2AqYX123VF#jz=G#Bz;R|!& zrImNgT@$rxbCswWJN|gNGvAga?e6agTV&`owqU96KPE7j_+!+&y-^=3-&Fx z+9Qc2+so3kqfA*_-~3!_^|L!EdhVN^U};oz%d-=cWNP$yXh@~c?sN;n9(9_Xqh*l< z4_?Ge*Y2k-lcUbWp33E0zTDR!^Yqb!2Tu#z@_1tO?{i<@Ig)YL&9t?~gnhq0;pJM# zzq{8u{gb67n@2>Anr`Wz_H(Pd7g8Om^223EXsg;G?uu*DkNkP{^U}SKj*YAmUhDh5 zi!GzhZa6q6`G@F8XQh}Q7wq3TyzcTDu|*$F3VmaUzIXJ^v!R|}cMgu3zcBLD=JP)L z(E9e#e^hS%aN?5CbFN0}Lm=H5!QA@W|! za*rNdS<(HEx!cP`mR%KDH|zF2S;n>Lm3#iJA#O%dJ&&8cT06#EzuKF1TdO>N654nD)s^io9c^&=(?4&retH<0 zWcs4y$(}6v(fV&}vk#NshZf6uB+=IP6>2`e*J#kCh5tl0&FWZwuUW5JUG9Wm*uCyu z}%@|W4wD6zjTNgQfDb4Q%4u)=vUeWZ@(!wpb?w{6l zM*01b=QiK@Jb7JstBMC#zAo}l^~n7#ZO6AQc$a>7#$xsqPiuv)=#ARZO?rjm;Z2i`SAM3Bn)Gme3 zIC(>xNb~fU<~5`L&KR5IxckB4pCXsWj_A@lXZ*}R##`(^I<;}=$Hx^;rbyp7+rf}+ z);uHZp;Mxd^%$9~;ddoU&D@l**PzIUo2TwCQZ_^KUFIDrJGCAiS?f*M+^d~#CCy&> zS)-aigooygsZnu)bz7p<6%M`lrDD&>4B^?z7rUO?kUnR%Gf{>5gpRD;VtR*%HNuwU z>E6$mxl`y_L+p{cTlXf2pRY=>{mI%#Zm%@G*TINK@uw6{Gd|`9Bb>#HQo4Q2wAJ{fy){Hzn3hEA%DTzf3c{E z{0?j1V$lM*kF|LWKz@_8c}zflgSC0gL4KXJFR@sU{32^#V6h+hdDix_IFI}^XDsd` z_pmmPc;QD7k&kC>2a8R}N3-@w7Wo!TYl|kNCqi z-jB8IEHWVP%i1;;`H{C{?Y1n+A#cOlKeMQfycKIVX3-LPBi8288M&3U>#!J%yf$lF zSWHA-g|*ADSctqdYxCHMycBEm_yc)K*5+{vc?s4wvABsm8*3X`_>rez?c^-NMrix{ z9cvp{q(%OjyZnVQn6zkpIovJZd8U#M%#7G)I1)wePX$g8VLP^B9c$FV^NU z4*4C{_Oh6Z{4{HOSS&}rkF{Ma+{l-*wu8l9ut+gd8^1hn!6K)WS3v#~V?3H6Z_e60 zdLVDc+Ex}0Em$iAA zkk?^t9%Yc%W^En~kk?}E8Z6o)ug=;Q7U9T6f1{C${%$}n`uitx(cjC+MSq_o|I**l z|Lt!kCSer)+u+Y(=3zqqJ!|u@;`w4G*5*+jJR@uKXo@@oYxC%VJUwgk7>fFItj!}5 zJS}UdWU&Ofk+pfau)gU3PH@rx)5t~tA0ik1k2gl!AJPA8$VLClAs79(A{YJdf?V`} z6mrr3dB{cow;~t)_aaZh_Jzkiv+Hji`2!&uwE;t}%C>`h)CACdpd+B}ks z)B5`lYxBs2{BPFgQ2_ZT*5*+e`A62~(G>Xy)_%vL3-Y(D&0`euH>}NL4)WKm?PswT z`E%Ch@dxr}tj!}9`BT>B@e279*5;9Nyw?B6tj!|_@<*)Aqa^Z&tj(hq@&~NV<0s_z zS)0cI#WVAAo6Rh&7%hLtE|nV1M(}Z%_AK7W!B~qgX`}SYx9@|ev!3#Y(yT*+B^;- zzrfl&t|C9r+B{w$KgZfU5>3?lf0ng*n2?`gZ60Njds&;u1N7%KYx8ITeu}kubV7cT zwRt#@pI~hsi;*8^Z61l7+V+pJHV-rMqpZ#2cdQ@7+C0u6Kf>A`7LSncW9=O*{zbl> zwO6x9HA(ZYV(kem@*p42+B_;DAII7}njjy`+B~`=AH&)_Mk9}6Z633cN3u4Lb;u)F zn}-LvgSB~FKt7tac|1ZsinV!sMn00Yd8C=F^?w9w^T>~UIBWB$j69sRc{D*jjJ0`m zLq3$Xd9=Xs9l{xlk>Fifo5wulU09pP@5no|Hjh)tJFzy8hsZm!Hjj8ywElKrZ64W> zw`Xl0<&fK0n@1Dm?O2;fZ{%%Ro5y(MZCIPfGUTmUo5ybCKeINE3&>lsHjn4XTe3Ef z#8b8YwP0-?Ig$Uw+B_;FZ_e60S|V@8+B^m#Z_3&{qLDXYZ60fpH)d@fhmbd7Z5}s~ zTUndO2jmS|n@8$tTK^ibHjl!{e`IYQwUPh8+C17Lug}^%h9j@X+B{|>uglszenVb| zwRs#xUYoToEY2gZ!rEpQw~-fRZ4-+Z$g{Dwfkiyr5BT37Ias7b&OcMmry6Uu{oyY! zW?%))g7Wn26VSbb@46Y%kukAr)lc=eBylgx6=Ll2R{DU+hCtZ%7riRS#y@y6uuO#wDHV8eH!fZO1bdy zam6Q-!e@dn30o)F=aX`l2Bt6jyM^B0BJd?;YX|%Ih47zT@_7}$itr_qd?p>ATjBc= zKK_~K;QsJ?Rd9~(eYt*}3SS5K_}^m$*IN`meqHj(qVV;FkN<5)u+O3JvBiPOr0|V~ z&nWqvIzEHKHyJ+uHz&dU^XT||ztiJo4t)IYSAuQ)3|E?z3C*Q9FGWO%k^``K-;p2a!6YS&TLi9zr_+0pWo3-O7 z_irD3;%^GY{&Ls1d@hCWEPVWLhl2Yj->-S!_$2ygQ~2(~mw~Mt?33@;0a=jGr0{)! zkN-_muus0f3LhT_e6qOd@rT^8Ga+ zVL$kJ=aXjx?HgN58_)djwt{_M-CqNixbf~(_!h&*{{}4BC*NP8`*Qu*6~2$~@xLbv z_R05G*=JSwlGfJtm;Y^Auus0f%09Egml-~jC+@GpBj&XJXx$v14zH0F0lYHX-Dm-E?d`5+@Iehsg zpSZsYkC+Ree;qykdcape@`?Ma@QAtac@@4<@D-GN;{GZ;VlI4cg>MFYg(RQ2zY33- z3!hWrTLoWX$tUiw!XxIwXIJ=2<9=U6@`?Ma@QAtaSrxuB=wDIEC+>&BBj&D_G@`?MQ@QAta*%iJ&;43Zp#Qjis#9a8S3g2n? z%1AzOKNKD@7e2GX=Yy}TzUX2MrB z$j56e$l2`6|19Cl`8ng0Yc)Oo9^rmpjjbcjFR!yAXS4tKIOCID;rj?*b+%5h&xV}M zNS{^VOOjuEzE%VEeEU4?$k~kanH9e8;j4*y;d3BoGty^N_zJ>T3-!Y1)baUO(dQ%2 zX6=4ZJIKeHfqfR|lILO)*M|o_V?yoqVgu&OF<$Dh0&zZgEw7_|y#IW1DSUHMcMkBn z>}Rkq40!+s{oucc@yYh9w!d=!HlTm?*gC;J-u_nqEDGNq`07i(_zIuspJ654zjN^Y zAo*0UABf}UT|xWq!1tr%lV9&;I4}vHTjBczUjw#w@bOE8T(iXe6h5cIm!yq0{`e>g z_NiV!5I(!Ymk~a3KjG{1Fu~7efi|BD#@kkfuMm8V*gB$ryv~B0%}AeF;VTJWW7L1? z18aO4e|#aEzA)A{DttBJYr@tE?jOJ4zUA{Tr^ick_?pVTuy6ak3SW2ln#n%aInh4{ zV|)tUU$??H7{2Cg{r~JQyFk9>b1HnJ;rmJUu>t)ppIzab2ww}?#|HGbd{%{T27E1L zAA13d@`?MiN#R=oUn|+iUT_jVel7DU_v zUpn|YO1?xoKCi-;AHGhK>bD|}}7__G*sKKMDz5agq-H>bi^5xy>xFQ1OjuJF}? zudC!MtK+jOd`;o&Ci&{<_{<7lNBFu+z7{$@qr%r8z8;dVn~u-#qQ_qZe0)@k^UIos zp+P>Li%DF+UWIQue7#sfurFN4=T`WZ!Pi^zjnMHq6~5o#>m&I_>iFym-(L9oO1@D# zKC8la96r0`8?ECrD}0yX>nHgfIzFSqcOSm~k}pEX=U+;Xzc=s=kbIFkKCi+T)=s-W z50rdSIzG3;mlD1~l5dQT&#CZbgKx0p8>{29D}06F8zT9}>G-S)Uq$$aO1|+rKC{AC zAHHFdZ-S1`sPMIdFI@6X)baV3(BrQ=e8VN*Bpshu;TsCy2+22D$LCh~#=|#K@=ek4 zITgNn@QspuQ+0fHg>Nlx;E5k3Cw@J*I{3v_&5 zg>N)`QzYL)9iLm_n+D%h$+t+y=T!KX!#7RxE!Oeb6~1loMN7WtIzFqycN{*aK7+zn1HQSE?}oz1UUmyizIk;2 zTEjO_^4(PU#P5S{g|8QU^Ch28$LCb|hQYT$^4(JS#QCr&d=ubXDEV$Hd}4o13g2A# z7D>K4IzEHKw+_C=lJB0v$Hyq2TyyF3y92%@Y@Oiod|%-c`)gPDPQbTR@;%V;Srxup z@VO-4Lmi)4;d=|;GRgNy$7fXdl6BDTSHDQU$2va$9Qu4@f{)YS^YKK-=T-O$!nZ>5 zJ=O8K6~40Yt(1JvbbL;QuMT{_N1xTukX4Q zzHRWWmwl!e8)8|(BGQzjzD_`bs`kV@1KKQnNb$n)pFGVNq{&zs~vHvvi z&Fjsm@MVPWPstaeon4obdI9iLa>D-7Qu$rq;Mb1Qsh;5#h&;_3LD3SU+D zjz~VEj?b>}S>cP3d?|H&R)wz}d`Bf;DjlC$;p+q6G0B%&$7fXdM#6Vo@}<%7`JMFm zn*!en$!F5>c@@5e@ST)=*>!wwg>Nl%k$(K{dXIJ=Q;PXnpTsl6h z!gmqAGm_7&<1;IK_uxA#`HJcIj0)cy_|8eb;yONmG(G;}b=L0B=OteW9iLa>OAX%z z$yZXx=T`V~z!xj|3`Y9#Lp*;pUrHUHTj8@G=AUe0|LaWhrPA>^6+S0?cY}O^Yd(A2{eXP^Md2HZ{k<3D zV@>vt;NpCN96!YU#j5Zvgzr9E|3AO4>iEnG-wy2WgCJj^4>{xdNA0gs; zkmHBgU#G&Cq^ov6cq;iqbbNM&FBg2zBwwhG&#LfMh3~oK3)AtL6~1=x`6Zvh{O#js zRQLwM_d@c8==l7T>G3xSzL%0ORLAF4_x-%;d=t#TgjI|$7fae5_Hq9k9U$Up^ne2@R{IyFZmMb_>2l)Iru(EzQj5{|0H_+ zHG%J=-AGNN7F7ZT(P>{`h!iS+op3SX$?3(@g;6+RpGH!R2(*xyod{iF8Rt?+$7|KbJt z0{d4w&PVO9Q{hY5UAw=;mwX{QKD)wK5WWPGFI2~8Rru<_mr(MB>G;eFpX-ozy(N-- z2FtgPpHboKg8n6zeN}0n_NE!NrQZ>$)>z;_LXF3Sa6T+WjT9HlYB{Zd`5+@Cw%E8Us4^PKaw6Vqv6XS`S|AszqP+!g>N2w871F$IzG3;_d9%< zBwunJpHtyG1>g6QFNKcJuJGN5FSF$1_dM$OWn;_v=CiZb8(kHl4;p-2dN%FCeBYo57 z52yP#4!-P?FRhNxtMDy^FNfqyr{i-gd~W!1O1|_uKBvN0HLrF)a!I}nIzGF?*9^Yg zk}so<&#Lep!v5xwe3^87W`*xEe0e1wzYeJDgRK^rj0)dV`0`1<%sM{*Fnauj=F!ea ze#w_b$LCe}(!*Ck@@3WWxfQ;dIKKrYAHOes>-aepzE$uQl6)o|pIzbW4qsu(mtDta zRrp51S48sV(D9iSKK2E+tdf1#k>ty%<1;FJ3vqtM|F>q^z?4hJ=O0Rszcug`llqri z$LCe}cEVR&^5xO-xfQG=FZ=-f0^N{D*3DmA6qRjxfQ;m@Kuw1jdXlYg|8NT z)g@nJ9iLs{YX@Hq$=5{3XI1!y!dFxBHP!K%6~5{4)slS8bbLmIZ!LWM`)q>8UvnLw ze-J%h4#3C1D<|0Zla9};@LhqAe-}@%&!*#ZD|~O^}#*%b1HnPdTGB8^6wG~ z_I1$l*%iJb@bT{|3ifr>@mUqVdhqe@LJIbE((#!UzAo_b?^+7>b=L726~0LL_;)!4 z`?~1(`~&In=Yr2F`MT=(yb9kR@bT}W3hp0&6yUi$vDE^TTj9F~AOEhaU|)Au^(~)M z;rj?5|1PayUk@FhUE#~nTN}^(ySjpXeCfCPXI1!0!^gi1EZEme$7fdfn!?AwYb@B; zTgPWq`1-@gzsoGx$KS>H*8chj(BsbuAOEhjU|(MypI70VfcLlfcd-Tg>^eTT!nYbe z{#|duzJ5ABr@|KlAO9}7U|)Y7pIzbGh~vk z1^be+8lKA&TP-m8`)lV{_Qk-*ziThpr~CS@!gmqAc9Ku`^<9PU9(*>*r}z4cQ{j69 zAO9}G;QiHm{l%{E#qXotU-)+&2K!X6zli6j7KJZ8e1Y#$WM__P1C#3Y7vVD~eEH$y z-_;o0KNGX^T%N@Cy#46$QUN~xU68@P>`e46pIhOp4Ilrm$zWd&9iLO-dw}b=tK`#r zJ;JW=HA4ToNj}}*_Z7ab@O77bdcRMb6~0mM^^kmezpok7hlze)>5Blx&c-aYG zFUeO%=lpsVz8Ls=OTMx?KDWXb3tu0}S5C+0RQPVe*H`il)bZIBzE|+sgM6&XCr2V} zZZNFZ8hkmJ!3v)pj~h136ZX~aSN*>78RLBX!2~XGe=#Y1Y2fQ0>BEB%j{<@%~=)czFZgSjngNe!N%V3$tt2?>Nb)_kO%v;Y$hMc*&>t ze!NrR%Ld;B$*1>zyj|fd4Bte_r}uumRpF}u-z3SW_kO%t;j0VZWXY%Ze!NlPYXRRB z$*1>zyuT+s{<^|9Rr2ZmKIm2W2E#W^^6C9P=vMf~!WS+1RKE|h)dG`K;hP1YQ}U^P z9~3^j!nYj0=|MhTV`3rhSNvYcC%&8qpR5Ys@9@oFEAo0#V`lAd`OFI60r+N0K8ude zsPLVEZiGOU=<#<4zS)w`7UUDp%f+!^$lz7@KEO98$j8^$eLYs;i{DSXpU#zh zy06D7d>P=IC;9BGkK+9D{)&n3GoS1VUs3qxOFq5V>#Pc2efSngKE2oL%nDye_!dgO z0c@YXwZBG%&jH^e$*1@Gpuamk{+#eF4)U?4VNg*2#B(6NoClx03g0sLmPo!KtVZlF z<#Q{1o8em;;Hy zoQ}_~@O6T3mE;?*w^s7a(DC`Z z(&KM7eCs6NOdX$B;oAh?ddW9S$LCh~PHxi9#|FtaTgT^A_zt6g8ztWy9iLs{yA0oN zl5eh#&#LexiqZDhE&1jteB%CRQuywnf14!Ve1(s#7MT29=<#A0pxv)FOTGm2nQDEM|tK97#i-H!}o{eJEY^YDtvzU_DR0OIzF?)7dBA4zj!3y5gngV;Y$bK ze#sZ3am%UyS5Ct>ZH)eB0nVD*3!RK7U7g{GEXBnB;q* z@P)DEd~&ILtN17142I*9?$yY(g=TP|0R?x=FCCOJ&;bV&f zlU3oHg8p5We3f*3W`*x+8?Ap=BwuA6pHbmkjQ(Afd=?#_zb$=!x4?Hz@>SLGc@@6H z@LiXD)pUGrh3_hSHzeN=3ZEE%4u#JT-%ZK)qr%4)2PT`smu#?h|MN+{1`1yy_*`x1 z^N|6*TavG#j?dSc_T`4}c94%X4b~u^5q;vzdGN`t@Rfn@4(dgX4LPr+d`^Y04t#$} zKD&<3uJE;h@2=!y-Kr`ce=WR|Y+|c?*ev3kMAg(_zX>hOW|7r-@~tcjf78(;b5Ob;adyeqpy99zvZ(j zd^_NK{I##iw|o|b?*x2LzVBUrzX5eC?}C`PgcK$)xZ_U(tSF zc=@%j-nV=Pg|8_3_v&k3{crhvE$Q=74!+kxKE6W^G zDSS=fdn@@Ob$kwmuMK?fB%k;^QQV$tEw)-;#_}0PqS@Ma`6RCVAg)bv~{Ec0HteG}2 zO@SZjmzm)H=Jft%&SvnzZFhiZ>+@q>KYKAGZPf2pHc`SLJqzyzNgpYwKMo&mlDU-`^&pGWT$ z=M#@_u4dZ#m3_J3OZb(~LiSIb54*xw623%V`K)oip#HJd0+U7Is{&u*uY9&RU#__Q z75y_Re2w8t66E96{C5O?y~vaB`I~CT&x`Zm!MqE6NhP1&=UKf9-$?k9Nj|;Lv$_?& zdGLKF`S|OG-`ZcN!k0al_WD6`$*1>uR=dJi3ceJQPw(@rR)w!Fd`8Kq_jy*c!uKed zw!bMQpWf$LjS62I^e>g<%b;^U{7vZb*AKqbl27mRtX_q0EPQDspWf$L-3s4l9KW=Z zPw(@rPK9qX#&bH!r}ueQyTW$_zVwn$@AIryh3^J@86=^eTL!dDr-%#tsMj?b;|HH9yWOmDF#JQEQ+8Q z6hXN~op8k*MNus3E+_^?P;O~a6oaBDmMe;4P!z?YDC#WA73Kcf%rlz*(|PiHKOb31 zcfb9;@B6&(%+7AM@S4cm#PA~FHJlT#w++eLRCrx?>uyEiZ3}NB@~q#7^@Vo;yp74* zOw^Z*pC`QI;5CzH{eG=0ytCo;BhNMJbA)#TyiLg4((o$#r{~4R`^`2bZ!5!#g!eG& z>rdX+h8GGig0~rY0}L+^-k0z;CvRKB^M$tn-WKF-XLz3QmOnRMZ!US&Yn;99&#v&Y z@U|pxd&6^tw;jB#$lJm2D*L79&qMyUCT~Z>i-fm7>Kj1bK*I}#cRajp$lJ;A0^yB< zw=H=)8=fz`vGBGdZx_S!gm*W*7V>h2=L)X`Z+r4~H9SXn@59@Hyxk11GB`bdKf~LR zyxk2i5}uDd4vTu6+^6+*iZ(qZUgm)IaLF5fKyij;o!rOzq z{R}S<-ktFFByWGi^M&^`yuHXf!0rjc#-gC!y7{0P{Rv_ z_g{F2kav{f1;U$)JReHlnTF>Jui>Tm_0Yq}JInAq;kCkRBX6YPxx(||9ZufahUW-x z<@4kH?+EhFF}zA^dj5*2?@01S8D1p3eyDFKdFKf)xqg+|E4{uw;2lNY`NB(HFDvYs z?i~g1X!0%)-k;Y?g!gxNe<816c&_j+ftM%mLc?=}cO$%G$h*k!Dtn}l-#ze-CGTRx zi-h+SyyJR!)iJ+onMLQjxvuZ4t@`t1K0@KW3U3&BUkb15Zr!aQypP}=Pu|8|ACQ!s zkLO_Ytj`nPckup7-oh>;&07L?MtC(B#QVVsiau+f#DT|_ddMS$h+F`^1_=3?{xC6F}$4ceup=LylV|F zE4+q6yuX}5-dMxS2yaVxXOefF;gxqw&)+`q&LZ!6!z&5z1b8FKyTR~^!n+9G**(1K z8aQ;R^!1jkkAm>V!8?b%*9|W(yvN|3OP;rM@Ac(`7r`6V!|Pu8*+pKw6U1MWJ*T{D z`uxs;cOH3tgqMt8NqE1*JD)=2d23|Tz3Tg7s;#h1x;FvdCFHG{P4|-gdBU3l?;qr?Wq7XeUV!&c@)`}#5#CIA z9ptTTc$ER^EpK{yer6S>3V}ivUg^Bv?PC(Ez`a2;9W`H_J$V;?;vbA>ks-nhlQC3^K7;oS=F7WN9gdzCHH z^Y;k6TiNTXuD9`vg!dx6e=X)M*{c@{?>%_M#XM(`S6F<01L1uG@3zIf`d&R>c)!ED zeKD`0SI-mPilgKGVEkgmKCD*GK?IFu9^6(^K(VunwKDO|Vgg0@q`c_!v)u!Z6c&EaJpXltcMrTtsT{mlw* zE?%E`j=ZIXm-M%?N&0*^FQ3x=H~yQvTEmNk*NOg4BX1eQ3xzis-t*+GVt9e@-hlT4 zdCM7|FT8Kyy+~f2;d#Pa@}Kc~n@-;H!t1(QcgqT|5#CGWtzdZNe(8A`0Pkh;9N{JT z3x#(eyjRFu$?yWd%w( z`dr~X1n>35yry0~M|dy8ix%^m7kQcZjHBoHRhrZD@+rJG$jfCH9e>l#Un1cxfcGYO zuHl8kTcIOfZ*P(38D1c~7VM`p$;%s_FT6awx5@Jj&l6q;ym!be7@jMG?YX-h1R-V|WGOodNHC@~#zLb&XV; zC%h}+eL&vWYDo#8pcE5ZAayz7P6b+_(T-Y9)OK7jWTc{dndQFuSY z`Y$orS@lKOJObK!kSUQu{S zeT5Cu>+|5vCGR%jCG~m2`wQ~&6?wNCo-4ew;eAcsc*ApqcP+ec$eUnzmG#rd?>>0* z$h*VvBH_IV?_2WjG`vuFpTPSMd3PCJAiUq;eMjCz!}Eo=>Sgi%S0V3i!}El<1-$Rc zyT|Zc;q49Y2lDPUJV$uP!TXWCNrqQhFFk+f!JALseTEka?*@23k$1o0g~EFf-p}Mc zV0eM>UV-;t@`+wc%Jb72k#g19x^;vcxzl9ua95Jd)V+C;cX4?H}WPM zUL~8Jzy07XB<~T!i-dOqyx+-t)bK*#72y3r-eZOr2(J^~|HzwSc)svLc$p>Q^Y7&N z`nchF!kZ4S4|z`*o-4dEyuRc;X?TwC7QkDAys3s)S$BM<+W7O_oH6nGs3Gqu!;6I1 z3~x#Do;JKtcsY1Wk@t+@1;T5Cw={Vr!}Epb!>c9lS;O;$cPYGO$a~K4T;bggZ&~vG zZFr9Go`km?dD9H9vd;KSwQ>Gt!mA_idBcl@_bt5T$$P=@Lg6iSMZ7*%An!%P3xu~W zycNltZg{@%THrb4y<~Wv@D7Bx5_vBho-4eQ;H^yFD~9I??_zkXkT=8dDr=9=R2%1S z9K3q+UNyW(c#ptamAuysFBINu@Kz)5b;ApU_a(g5$%_on7hdMdczraG_lDtl!dnC0 z8sxocc&_lag107lZyBB=ynW%VMcz!qt2BED~@P382K6xJ)o+CUT*PAvV zZ?@r8)*7FwHqKusye9HKG`vW7C3qW>_mSa+!dvC4cz@Z5yi9ZN*V_Z(tqX5s^7M;q8w4HX*OZ@EqYC0&i3DmNdM|n&Z3s#rZo4 zUVrkI5?}8&IRZ1C3pkKTfy*3 z!dniXC%p}MD;i!=c($n zvcmfb-VWr|8(v0uZ=t_ClDDeil^e#V=5H+4$3XH{GrW@U?uWM%d8->Ba;-rnT(GrX+u?t-@ud7BtsMtB#!8?U#0$=lTM%Bzh}&EL&fzk|u^Z+Io) zJ%#@6N8VQ*HeG_owyZ;)coxOZ!~!Y!z&5zNO+f!H`?%u!aE(_KgjDayn^t? z!22h8V+=1ZyxZY*kQW$UPIw`_OUWB+cv;~+4ev7YIt?!)yw~AfPTn}fE3YsQw^`Y{P@)T9SUzOc_qUu3GaA#*O52P@QT7a1K#!I zO*g!P@GgOO19>wHFE707;B}H08D36!cfh-myqSiV72YH8ZX$1%;bnyPJiMF9n{9aI zy78&`i{OnTuWWcF;e7<}7V!^;bAb$CVc z>I^R@yngU*BhN9stndcHyPdpx!^;TIgEyYM2E!{aH$F9g$HALGUZdfagm)IaJIKo# zUQu|L!Ml^ZCc`TT?R8+ zZ+Cbhd4mlvC%i-8JxHEscv<1K!+VIlA%>R`-Y9qvlhdF=I<(algS%ucqQSD zhxZ71dBZCT?@@S2!aE#ZiM%m}mlNIz@SY_vFubhr&VctEc_qWk2=7vO|0Zvm;gy#jpPIj0;7ucM zy5W_C_aMCI$(vz#Md3XU?*;NA!z&2yJ$NsYH`DO)!uuB9bn<2yUQT#@ZjASQB-U7qR3GX&|Z;-dp@Up^t1m2tEWtQyydPGKeFTs0@yc)wR zFF8Ine;>k|NnWktm4x>_ytm1#GrXekmb@w658ffqF}#BC)`0gedG&^u7v5&@W|7xm zcsb$i3hzDg8VxTiyhGrcczeM6f;`Xg3c@=a-k0PJF}%F+ zPKGy^yf(wj3GYI9Uy(P|@Up_Y4&K+~Z`@G`>N1KyA1jWxV-pYf^rI~?A8@;VK#B)pU1{Y2h4!z&8!LU=!uS2VnW@UDaR zU-BjxUS4>2!&^Y!M8nGo?;baPKl(4^Wt`rhFJy)HByc)yH2=6&~zmew{UO6*9 zHGl8ITS#7=;gy8<1-#$Mt2ex&@P2~#2YC&KR}kKEx5WF^|Hx}Jyu9$%hgbcu`{Z{M zsso)hyqxehhu4R^Cd11LZzp(t$s1sJ8R1RuGrT)TOOV%Mc;)}yo|?aXP+tvs0}Zbv zyo2B^NnXzIiozQPZz=Ky8D2qnqu?z~UaR5dh1UVEmb}4+mlNJtc*~II8D3U+x4~PM zydj2{5#D3)mLspt@XCLr=kGOmb>s~-ypr(dz+0ZYyx|pv_Zz$w$Qx#O1>r4sYrOxh zNM5_)<%PF4JcqpDhL;mwe|RgA=Nn#Dc)P({nYlle_z6DByXJIm4x>TytTcBWyzalcsb$i2yZ>|Lc_}n?;v>VlQ-G$GQv9v-Uj5A46poK zdj8IX*F@el!z&5zDtH@`H{I}x!n+mTM&!*fyn^sTcpH-!8D3s^C3wx`%{086@ZN&g zkGxrimla+a-X`SDHoT1R=EK{Ryg7zf{xv;+zt3y$eqPd_y!nP#65cY!c)!|=yak3= z6yDnKHYabP;T43p8N4mX%dC`sePhY)(dqgkydB`V?78V)a*h-Il0F}Mz}u3%tl@>i zI|$xZgHN47y)AM&Ryc~I*h8GF% zCV0D&H_q@v;f3&aBd=(9f$(00w>xy@D3(#j^X*j+ZWyt^5z;{N8zYY<+Nfr9Y1M}5bT*C@PXK0M*=2k%(&vWDjh?{Ij> zk=G==q`w*AwZj`mUf0Jbrsg^EN@Lq#=B6$N1uUtv5Zw|bZ$SVo2YaPbzyL9gdcz+{rn&D-? zP4_Z)#OrrBdD9Iq_f5LD0=$#Sn<2b4(B1OfbgvQKDdgpZ_viS1neH{iJC(dahL`<3 z-5UVUC$H7;a-XGpIe333Z?N$G9KUk9HyGY&}u3JYRS#!z+;2VR)YK)`xc?d1DOE72a0xE+Q{5JV$srco&nG z>yv)Imh3N;S?T#Z7~W{|1{q!?yuZS`guGV63x#(!ynm24*zf}3je+-1@;t-yh4(Lb z9pnu$JWqHJ!Ml{aHp6p;_dLAI$Qx>Sj__u|yPUkd;Z@#E&)+xj#*jD6@FL;;0q+X( z+6^xh-b#1H`_+}?4L7_%cunxGBF{HGUwAF>0`f)}o+rG)@UA9rq~W>3%fq{dyitbd z2yXZeqM2+)Q4kHod=z z7YOg+lVfijc{RfO^LnE2UWIoHd9}hz>T`rQ8{Vzt)frx8X8L@rj`8~!d5+;l!dnks zk-U1t3x&5SyxYiYFuXu`+rYb>yhg+Gg|`d5@#JL<&lBF>@FtMgWO%Od4u*FJdCkIG z4(m7jR(f8JhIc1<{e@QxFaKt`H*HM(eww?;bA^|z4_9~(!kb9m0K;>HcPqTR$!jsZ z${XqZy&T>>_Qc4bK(cWAN@L zZ?NGx!g~YW1LS#zSBcW+w+t^NZ;0VV!ut;1gXFatUMRdj;5|g%P{Rv^xBT7l@$zBv z@`mRNuMys4@`f3nC%jGJJwjf);km-w0p6qJ4HsUre#@_?=VfnrkCEpKuP^q~qVSG{ zH-)?r!t1(QcgqRyBzTXLH`4IRuci0*Y&`>F7bf%h_bQw^{D zQhI++gZBz~CE+EGq!}EoAD7^Q` zn_+mK@J@pFK6#Phxxzai-UsB(G(1Om*T9=i-Ymnbl+yEZ54;b_n{RlL@ScSC5qS#? zFBIOZ@IEGQq2UF>`xsuCyv(xc`)RV?eBpf$?-TNB49^qZ5|iTn;8XHy4bK%`a{c); z@-j~E{dI(wTz{TJUXAdQ<9X?s^!z2)pFbzBR(Q#L1j1VZ zlDwSZWrep9yt(8R46poj`uJ@F?<@A!NbhelexdO8f%i3eqYW<*-ZAjLA#Z+T@Adh@ zI|JT4@)j7LC%j~Rd`n)YsrUL^;U(+iKjhU2FIgYur_$#)Ss&k#S1Y_^eoMl;4C7ZJ zFVmdf-z?5wN>8NMcRjrC$;(;ZW9i-mct4O=u)N9X-eh<`l2@|42h+W0;ms#+n((^r z*4^^Ldkx-CX-p}OK2rsEGBfNR={!3m?cvq&H|7N-_JoZhp+I3rRczNL^ zumAQTufgzg!b@KN?Mq&x;bn!Fy#Bicd0E5D2rqg4w}!kX!z)ir&)*97#pk6!dr&CS%#Mr-a+t|C2zLyx|U^k zE8mqqzemGcj=Zwr6@+&ZygKsc7+zL*XTn>ayt#%~x--4M7r|SBym`V)_R~Ok$@%k& z&cp65bu~)+TSD;f2C0!CQyCoZ$t+ z`vBg$c%JZ9d>~$L>ybCu@Lb_F!&{#`&+r`K?Fw%L^5z&`Wqf-6 z4uIFx!|OhVZN6x~PtFOdx5@D>65jFfHY6|C!|VFp-R@TP`r`kK!aD=rMm@alhitK^ zJ`mkEiI*2%2fU5Rt1-N+@NS0JOkST$1GCWUs-@)6Ayk^65g|}oF?+2Tc*Wd6Q;jIa8iymJ09J-70TtJ|E zuD8l<>3K=6N4Pz_?uQRpd?oY`++aKyWs6aUap7NH^uXW_cXkndwA7{7kYT$x^I&4bA|U7 zyj{o}ZFr9GzJiw{uV{FcThsIM2fSU$n_zg6@YZ-RK7Q;*-bBL-g*W$=`1cofCvTGB z1;VSH5qpEk3k}Z~-Ztp(9^_3nJWqK0!rPO)Ov|G6k(xi@4TZNCc{PUT2=8Qgt>o1j zUgehb{G9`DZ}RF4FB0A*@b)3kF}zTC*TCDCyn4e6gm(+P!Q?do&+o

    yg+z2!#kQh$MAgN-2?A0JXd(r;T=O> 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

    VgA(~+45+4>-fgKzMs6MzrZ(aze4*I+J^&X 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 XV$~d(wr9$vhb86T%4g_Ebr}6WYq7iu literal 0 HcmV?d00001 diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/driver/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/driver/Kbuild.include new file mode 100644 index 0000000..3327213 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/driver/Kbuild.include @@ -0,0 +1,4 @@ +cur_dir := en_np/driver/ +subdirs := source/ +src_files += +include $(foreach subdir, $(subdirs), $(dinghai_root)/$(cur_dir)$(subdir)/Kbuild.include) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/driver/include/dpp_drv_acl.h b/src/net/drivers/net/ethernet/dinghai/en_np/driver/include/dpp_drv_acl.h new file mode 100644 index 0000000..340d346 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/driver/include/dpp_drv_acl.h @@ -0,0 +1,85 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_drv_acl.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : +* 完成日期 : 2014/01/27 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef DPP_DRV_ACL_H +#define DPP_DRV_ACL_H + +#include "zxic_common.h" +#include "dpp_apt_se_api.h" + +/* etcam级联地址划分 */ +#define ZXDH_FD_AS_ERAM_BAADDR (ZXIC_UINT32)(0x38000) +#define ZXDH_FD_AS_ERAM_DEPTH (ZXIC_UINT32)(2048) + +#define ZXDH_IPSEC_ENC_AS_ERAM_BAADDR (ZXIC_UINT32)(0x38B00) +#define ZXDH_IPSEC_ENC_AS_ERAM_DEPTH (ZXIC_UINT32)(1024) + +/* etcam表项 0~7 */ +#define ZXDH_ACL_FD_CFG_ID (ZXIC_UINT32)(0) +#define ZXDH_ACL_TBL_ID1 (ZXIC_UINT32)(1) +#define ZXDH_ACL_TBL_ID2 (ZXIC_UINT32)(2) +#define ZXDH_ACL_TBL_ID3 (ZXIC_UINT32)(3) +#define ZXDH_ACL_TBL_ID4 (ZXIC_UINT32)(4) +#define ZXDH_ACL_TBL_ID5 (ZXIC_UINT32)(5) +#define ZXDH_ACL_TBL_ID6 (ZXIC_UINT32)(6) +#define ZXDH_ACL_TBL_ID7 (ZXIC_UINT32)(7) + +typedef struct zxdh_ipsec_enc_key +{ + ZXIC_UINT8 dip[16]; + ZXIC_UINT8 sip[16]; + ZXIC_UINT32 rsv2; + ZXIC_UINT32 rsv1; +}ZXDH_IPSEC_ENC_KEY; + +typedef struct zxdh_ipsec_enc_mask +{ + ZXIC_UINT8 dip[16]; + ZXIC_UINT8 sip[16]; + ZXIC_UINT32 rsv2; + ZXIC_UINT32 rsv1; +}ZXDH_IPSEC_ENC_MASK; + +typedef struct zxdh_ipsec_enc_entry +{ + ZXIC_UINT32 sa_id; + ZXIC_UINT32 rsv; + ZXIC_UINT32 hit_flag; +}ZXDH_IPSEC_ENC_ENTRY; + +typedef struct zxdh_ipsec_enc_t +{ + ZXIC_UINT32 index; + ZXDH_IPSEC_ENC_KEY key; + ZXDH_IPSEC_ENC_MASK mask; + ZXDH_IPSEC_ENC_ENTRY entry; +} ZXDH_IPSEC_ENC_T; + +ZXIC_UINT32 dpp_apt_set_ipsec_enc_data(ZXIC_VOID *pData,DPP_ACL_ENTRY_EX_T *aclEntry); +ZXIC_UINT32 dpp_apt_get_ipsec_enc_data(ZXIC_VOID *pData,DPP_ACL_ENTRY_EX_T *aclEntry); + +typedef struct dpp_acl_init_t +{ + ZXIC_UINT32 tbl_num; + DPP_APT_ACL_TABLE_T *acl; +} DPP_ACL_INIT_T; + +extern DPP_ACL_INIT_T g_aclTable; + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/driver/include/dpp_drv_eram.h b/src/net/drivers/net/ethernet/dinghai/en_np/driver/include/dpp_drv_eram.h new file mode 100644 index 0000000..5b3f058 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/driver/include/dpp_drv_eram.h @@ -0,0 +1,262 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_drv_eram.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : +* 完成日期 : 2014/01/27 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef DPP_DRV_ERAM_H +#define DPP_DRV_ERAM_H + +#include "zxic_common.h" +#include "dpp_apt_se_api.h" + +#define ZXDH_VXLAN_ERAM_BAADDR ((ZXIC_UINT32)(0x8000)) +#define ZXDH_VXLAN_ERAM_DEPTH ((ZXIC_UINT32)(2)) + +#define ZXDH_VPORT_ATTR_ERAM_BAADDR ((ZXIC_UINT32)(0x8001)) +#define ZXDH_VPORT_ATTR_ERAM_DEPTH ((ZXIC_UINT32)(1280)) + +#define ZXDH_PANEL_PORT_ATTR_ERAM_BAADDR ((ZXIC_UINT32)(0x87F9)) +#define ZXDH_PANEL_PORT_ATTR_ERAM_DEPTH ((ZXIC_UINT32)(16)) + +#define ZXDH_RSS_TO_VQID_ERAM_BAADDR ((ZXIC_UINT32)(0x8809)) +#define ZXDH_RSS_TO_VQID_ERAM_DEPTH ((ZXIC_UINT32)(38144)) + +#define ZXDH_VLAN_FILTER_ERAM_BAADDR ((ZXIC_UINT32)(0x11D09)) +#define ZXDH_VLAN_FILTER_ERAM_DEPTH ((ZXIC_UINT32)(71680)) + +#define ZXDH_LAG_ERAM_BAADDR ((ZXIC_UINT32)(0x23509)) +#define ZXDH_LAG_ERAM_DEPTH ((ZXIC_UINT32)(8)) + +#define ZXDH_BC_ERAM_BAADDR ((ZXIC_UINT32)(0x2350D)) +#define ZXDH_BC_ERAM_DEPTH ((ZXIC_UINT32)(256)) + +#define ZXDH_STAT_PPU_ERAM_BAADDR ((ZXIC_UINT32)(0x68000)) +#define ZXDH_STAT_PPU_ERAM_DEPTH ((ZXIC_UINT32)(0x1C000)) // 此数值以64bit为单位 + +#define ZXDH_DSCP_TO_UP_ERAM_BAADDR ((ZXIC_UINT32)(0x2370D)) +#define ZXDH_DSCP_TO_UP_ERAM_DEPTH ((ZXIC_UINT32)(1024)) + +#define ZXDH_UP_TO_TC_ERAM_BAADDR ((ZXIC_UINT32)(0x2390D)) +#define ZXDH_UP_TO_TC_ERAM_DEPTH ((ZXIC_UINT32)(128)) + +#define ZXDH_VHCA_ERAM_BAADDR ((ZXIC_UINT32)(0x40000)) +#define ZXDH_VHCA_ERAM_DEPTH ((ZXIC_UINT32)(0x800)) + +#define ZXDH_UC_PROMISC_ERAM_BAADDR ((ZXIC_UINT32)(0x2398E)) +#define ZXDH_UC_PROMISC_ERAM_DEPTH ((ZXIC_UINT32)(256)) + +#define ZXDH_MC_PROMISC_ERAM_BAADDR ((ZXIC_UINT32)(0x23A8E)) +#define ZXDH_MC_PROMISC_ERAM_DEPTH ((ZXIC_UINT32)(256)) + +typedef struct zxdh_vxlan_t +{ + ZXIC_UINT64 port : 16; + ZXIC_UINT64 rsv : 47; + ZXIC_UINT64 hit_flag : 1; +} ZXDH_VXLAN_T; + +typedef struct zxdh_vport_t +{ + ZXIC_UINT32 tpid/* : 16; */; + ZXIC_UINT32 vhca/* : 10; */; + ZXIC_UINT32 uplink_port/* : 6; */; + + ZXIC_UINT32 rss_hash_factor/* : 8; */; + ZXIC_UINT32 hash_alg/* : 4; */; + ZXIC_UINT32 panel_id/* : 4; */; + + ZXIC_UINT32 lag_id/* : 3; */; + ZXIC_UINT32 pf_vqm_vfid/* : 11; */; + ZXIC_UINT32 rsv3/* : 2; */; + + ZXIC_UINT32 mtu/* : 16; */; + + ZXIC_UINT32 port_base_qid/* : 12; */; + ZXIC_UINT32 hash_search_index/* : 3; */; + ZXIC_UINT32 rsv1/* : 1; */; + + ZXIC_UINT32 tm_enable/* : 1; */; + ZXIC_UINT32 ingress_meter_enable/* : 1; */; + ZXIC_UINT32 egress_meter_enable/* : 1; */; + ZXIC_UINT32 ingress_meter_mode/* : 1; */; + ZXIC_UINT32 egress_meter_mode/* : 1; */; + ZXIC_UINT32 fd_enable/* : 1; */; + ZXIC_UINT32 vepa_enable/* : 1; */; + ZXIC_UINT32 spoof_check_enable/* : 1; */; + + ZXIC_UINT32 inline_sec_offload/* : 1; */; + ZXIC_UINT32 ovs_enable/* : 1; */; + ZXIC_UINT32 lag_enable/* : 1; */; + ZXIC_UINT32 is_passthrough/* : 1; */; + ZXIC_UINT32 is_vf/* : 1; */; + ZXIC_UINT32 virtion_version/* : 2; */; + ZXIC_UINT32 virtio_enable/* : 1; */; + + ZXIC_UINT32 accelerator_offload_flag/* : 1; */; + ZXIC_UINT32 lro_offload/* : 1; */; + ZXIC_UINT32 ip_fragment_offload/* : 1; */; + ZXIC_UINT32 tcp_udp_checksum_offload/* : 1; */; + ZXIC_UINT32 ip_checksum_offload/* : 1; */; + ZXIC_UINT32 outer_ip_checksum_offload/* : 1; */; + ZXIC_UINT32 is_up/* : 1; */; + ZXIC_UINT32 allmulticast_enable/* : 1; */; + + ZXIC_UINT32 hw_bond_enable/* : 1; */; + ZXIC_UINT32 rdma_offload_enable/* : 1; */; + ZXIC_UINT32 vlan_filter_enable/* : 1; */; + ZXIC_UINT32 vlan_strip_offload/* : 1; */; + ZXIC_UINT32 qinq_vlan_strip_offload/* : 1; */; + ZXIC_UINT32 rss_enable/* : 1; */; + ZXIC_UINT32 mtu_offload_enable/* : 1; */; + ZXIC_UINT32 hit_flag/*: 1; */; +} ZXDH_VPORT_T; + +typedef struct zxdh_panel_port_t +{ + ZXIC_UINT32 rsv7 /* : 16; */; + ZXIC_UINT32 ovs_pf_vfid /* : 11; */; + ZXIC_UINT32 rsv6 /* : 5; */; + ZXIC_UINT32 pf_memport_qid /* : 12; */; + ZXIC_UINT32 rsv5 /* : 4; */; + ZXIC_UINT32 bond_pf_vqm_vfid /* : 11; */; + ZXIC_UINT32 rsv4 /* : 2; */; + ZXIC_UINT32 is_up /* : 1; */; + ZXIC_UINT32 bond_link_up /* : 1; */; + ZXIC_UINT32 hw_bond_enable /* : 1; */; + ZXIC_UINT32 mtu /* : 16; */; + ZXIC_UINT32 mtu_offload_enable /* : 1; */; + ZXIC_UINT32 rsv3 /* : 3; */; + ZXIC_UINT32 tm_base_queue /* : 12; */; + ZXIC_UINT32 ptp_port_vfid /* : 11; */; + ZXIC_UINT32 rsv2 /* : 5; */; + ZXIC_UINT32 pf_vqm_vfid /* : 11 */; + ZXIC_UINT32 tm_shape_enable /* : 1; */; + ZXIC_UINT32 ptp_tc_enable /* : 2; */; + ZXIC_UINT32 trust_mode /* : 1; */; + ZXIC_UINT32 hit_flag /* : 1; */; +} ZXDH_PANEL_PORT_T; + +typedef struct zxdh_dscp_to_up_t +{ + ZXIC_UINT32 rsv2 /* : 32; */; + ZXIC_UINT32 up /* : 3; */; + ZXIC_UINT32 rsv1 /* : 28; */; + ZXIC_UINT32 hit_flag /* : 1; */; +} ZXDH_DSCP_TO_UP_T; + +typedef struct zxdh_up_to_tc_t +{ + ZXIC_UINT32 rsv2 /* : 32; */; + ZXIC_UINT32 tc /* : 3; */; + ZXIC_UINT32 rsv1 /* : 28; */; + ZXIC_UINT32 hit_flag /* : 1; */; +} ZXDH_UP_TO_TC_T; + +typedef struct zxdh_rss_to_vqid_t +{ + ZXIC_UINT32 vqm_qid[8]; + ZXIC_UINT32 hit_flag; +} ZXDH_RSS_TO_VQID_T; + +typedef struct zxdh_vlan_filter_t +{ + ZXIC_UINT8 vport_bitmap[15]; + ZXIC_UINT8 rsv : 7; + ZXIC_UINT8 hit_flag : 1; + +} ZXDH_VLAN_FILTER_T; + +typedef struct zxdh_lag_t +{ + ZXIC_UINT32 member_bitmap; + ZXIC_UINT32 rsv2; + ZXIC_UINT32 hash_factor; + ZXIC_UINT32 bond_mode; + ZXIC_UINT32 member_num; + ZXIC_UINT32 rsv1; + ZXIC_UINT32 hit_flag; +} ZXDH_LAG_T; + +typedef struct zxdh_bc_t +{ + ZXIC_UINT64 bc_bitmap; + ZXIC_UINT32 rsv2; + ZXIC_UINT32 rsv1; + ZXIC_UINT32 hit_flag; +} ZXDH_BC_T; + +typedef struct zxdh_promisc_t +{ + ZXIC_UINT64 bitmap; + ZXIC_UINT32 rsv2; + ZXIC_UINT32 rsv1; + ZXIC_UINT32 pf_enable; + ZXIC_UINT32 hit_flag; +} ZXDH_PROMISC_T; + +typedef struct zxdh_vhca_t +{ + ZXIC_UINT32 rsv2; + ZXIC_UINT32 vqm_vfid; + ZXIC_UINT32 rsv1; + ZXIC_UINT32 valid; +} ZXDH_VHCA_T; + +/*************eram call back ****************/ +ZXIC_UINT32 dpp_apt_set_vxlan_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]); +ZXIC_UINT32 dpp_apt_get_vxlan_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]); + +ZXIC_UINT32 dpp_apt_set_vport_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]); +ZXIC_UINT32 dpp_apt_get_vport_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]); + +ZXIC_UINT32 dpp_apt_set_panel_port_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]); +ZXIC_UINT32 dpp_apt_get_panel_port_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]); + +ZXIC_UINT32 dpp_apt_set_dscp_to_up_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]); +ZXIC_UINT32 dpp_apt_get_dscp_to_up_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]); + +ZXIC_UINT32 dpp_apt_set_up_to_tc_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]); +ZXIC_UINT32 dpp_apt_get_up_to_tc_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]); + +ZXIC_UINT32 dpp_apt_set_rss_to_vqid_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]); +ZXIC_UINT32 dpp_apt_get_rss_to_vqid_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]); + +ZXIC_UINT32 dpp_apt_set_vlan_filter_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]); +ZXIC_UINT32 dpp_apt_get_vlan_filter_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]); + +ZXIC_UINT32 dpp_apt_set_lag_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]); +ZXIC_UINT32 dpp_apt_get_lag_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]); + +ZXIC_UINT32 dpp_apt_set_bc_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]); +ZXIC_UINT32 dpp_apt_get_bc_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]); + +ZXIC_UINT32 dpp_apt_set_promisc_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]); +ZXIC_UINT32 dpp_apt_get_promisc_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]); + +ZXIC_UINT32 dpp_apt_set_vhca_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]); +ZXIC_UINT32 dpp_apt_get_vhca_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]); + + +typedef struct dpp_eram_init_t +{ + ZXIC_UINT32 tbl_num; + DPP_APT_ERAM_TABLE_T *eram; +} DPP_ERAM_INIT_T; + +extern DPP_ERAM_INIT_T g_eRamTable; + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/driver/include/dpp_drv_hash.h b/src/net/drivers/net/ethernet/dinghai/en_np/driver/include/dpp_drv_hash.h new file mode 100644 index 0000000..8b30f8f --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/driver/include/dpp_drv_hash.h @@ -0,0 +1,97 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_drv_hash.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : +* 完成日期 : 2014/01/27 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ +#ifndef DPP_DRV_HASH_H +#define DPP_DRV_HASH_H + +#include "zxic_common.h" +#include "dpp_apt_se_api.h" + +#define ZXDH_L2ENTRY_KEEPALIVE_ERAM_BAADDR (ZXIC_UINT32)(0x0) /* L2转发表保活标志表 */ + +/* hash-function for hash tbl */ +#define ZXDH_HASH_FUNC0 (ZXIC_UINT8)(0) +#define ZXDH_HASH_FUNC1 (ZXIC_UINT8)(1) +#define ZXDH_HASH_FUNC2 (ZXIC_UINT8)(2) +#define ZXDH_HASH_FUNC3 (ZXIC_UINT8)(3) + +/* L2 forward */ +typedef struct zxdh_l2_fwd_key +{ + ZXIC_UINT8 dmac_addr[6]; /**< @brief key */ + ZXIC_UINT16 rsv /* : 16; */; +} ZXDH_L2_FWD_KEY; + +typedef struct zxdh_l2_fwd_entry +{ + ZXIC_UINT32 vqm_vfid /* : 11;*/; + ZXIC_UINT32 rsv /* : 20; */; + ZXIC_UINT32 hit_flag /* : 1; */; +}ZXDH_L2_FWD_ENTRY; + +typedef struct zxdh_l2_fwd_t +{ + ZXDH_L2_FWD_KEY key; + ZXDH_L2_FWD_ENTRY entry; +} ZXDH_L2_ENTRY_T; + +/* multicast */ +typedef struct zxdh_mc_key +{ + ZXIC_UINT8 mc_mac[6]; + ZXIC_UINT32 group_id; + ZXIC_UINT32 rsv; +}ZXDH_MC_KEY; + +typedef struct zxdh_mc_entry +{ + ZXIC_UINT64 mc_bitmap; + ZXIC_UINT32 rsv2; + ZXIC_UINT32 rsv1; + ZXIC_UINT32 mc_pf_enable; + ZXIC_UINT32 hit_flag; +}ZXDH_MC_ENTRY; + +typedef struct zxdh_mc_t +{ + ZXDH_MC_KEY key; + ZXDH_MC_ENTRY entry; +} ZXDH_MC_T; + +ZXIC_UINT32 dpp_apt_set_l2entry_data(ZXIC_VOID *pData, DPP_HASH_ENTRY *pEntry); +ZXIC_UINT32 dpp_apt_get_l2entry_data(ZXIC_VOID *pData, DPP_HASH_ENTRY *pEntry); + +ZXIC_UINT32 dpp_apt_set_mc_data(ZXIC_VOID *pData, DPP_HASH_ENTRY *pEntry); +ZXIC_UINT32 dpp_apt_get_mc_data(ZXIC_VOID *pData, DPP_HASH_ENTRY *pEntry); + +typedef struct dpp_hash_init_t +{ + ZXIC_UINT32 func_num; + DPP_APT_HASH_FUNC_RES_T *func; + ZXIC_UINT32 bulk_num; + DPP_APT_HASH_BULK_RES_T *bulk; + ZXIC_UINT32 ser_num; + DPP_APT_HASH_TABLE_T *ser; +} DPP_HASH_INIT_T; + +extern DPP_HASH_INIT_T g_hashTable; + +DPP_STATUS dpp_apt_dtb_hash_table_unicast_mac_dump(DPP_DEV_T *dev, ZXIC_UINT32 queue_id, ZXIC_UINT32 sdt_no, ZXDH_L2_ENTRY_T *pHashDataArr, ZXIC_UINT32 *p_entry_num); +DPP_STATUS dpp_apt_dtb_hash_table_multicast_mac_dump(DPP_DEV_T *dev, ZXIC_UINT32 queue_id, ZXIC_UINT32 sdt_no, ZXDH_MC_T *pHashDataArr, ZXIC_UINT32 *p_entry_num); + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/driver/include/dpp_drv_init.h b/src/net/drivers/net/ethernet/dinghai/en_np/driver/include/dpp_drv_init.h new file mode 100644 index 0000000..57da29a --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/driver/include/dpp_drv_init.h @@ -0,0 +1,33 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_drv_init.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : +* 完成日期 : 2014/01/27 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef DPP_DRV_INIT_H +#define DPP_DRV_INIT_H + +#include "zxic_common.h" +#include "dpp_type_api.h" +#include "dpp_dev.h" + +DPP_STATUS dpp_flow_init(DPP_DEV_T *dev); +DPP_STATUS dpp_flow_uninit(ZXIC_UINT32 dev_id); + +DPP_STATUS dpp_flow_data_all_flush(DPP_DEV_T *dev, ZXIC_UINT32 queue_id); + +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/driver/include/dpp_drv_sdt.h b/src/net/drivers/net/ethernet/dinghai/en_np/driver/include/dpp_drv_sdt.h new file mode 100644 index 0000000..4c8ca49 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/driver/include/dpp_drv_sdt.h @@ -0,0 +1,62 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_drv_sdt.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : +* 完成日期 : 2014/01/27 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ +#ifndef DPP_DRV_SDT_H +#define DPP_DRV_SDT_H + +#include "zxic_common.h" + +/*************SDT配置***************************/ +/* eram直接表 */ +#define ZXDH_SDT_VXLAN_ATTR_TABLE (ZXIC_UINT32)(0) +#define ZXDH_SDT_VPORT_ATTR_TABLE (ZXIC_UINT32)(1) +#define ZXDH_SDT_PANEL_PORT_ATTR_TABLE (ZXIC_UINT32)(2) +#define ZXDH_SDT_RSS_TO_VQID_TABLE (ZXIC_UINT32)(3) +#define ZXDH_SDT_VLAN_FILTER_TABLE (ZXIC_UINT32)(4) +#define ZXDH_SDT_LAG_TABLE (ZXIC_UINT32)(5) +#define ZXDH_SDT_BC_TABLE (ZXIC_UINT32)(6) +#define ZXDH_SDT_DSCP_TO_UP_TABLE (ZXIC_UINT32)(7) +#define ZXDH_SDT_UP_TO_TC_TABLE (ZXIC_UINT32)(8) +#define ZXDH_SDT_VHCA_TABLE (ZXIC_UINT32)(50) +#define ZXDH_SDT_UC_PROMISC_TABLE (ZXIC_UINT32)(10) +#define ZXDH_SDT_MC_PROMISC_TABLE (ZXIC_UINT32)(11) + +/* hash表 */ +#define ZXDH_SDT_L2_ENTRY_TABLE_PHYPORT0 (ZXIC_UINT32)(64) +#define ZXDH_SDT_L2_ENTRY_TABLE_PHYPORT1 (ZXIC_UINT32)(65) +#define ZXDH_SDT_L2_ENTRY_TABLE_PHYPORT2 (ZXIC_UINT32)(66) +#define ZXDH_SDT_L2_ENTRY_TABLE_PHYPORT3 (ZXIC_UINT32)(67) +#define ZXDH_SDT_L2_ENTRY_TABLE_PHYPORT4 (ZXIC_UINT32)(68) +#define ZXDH_SDT_L2_ENTRY_TABLE_PHYPORT5 (ZXIC_UINT32)(69) + +#define ZXDH_SDT_MC_TABLE_PHYPORT0 (ZXIC_UINT32)(76) +#define ZXDH_SDT_MC_TABLE_PHYPORT1 (ZXIC_UINT32)(77) +#define ZXDH_SDT_MC_TABLE_PHYPORT2 (ZXIC_UINT32)(78) +#define ZXDH_SDT_MC_TABLE_PHYPORT3 (ZXIC_UINT32)(79) +#define ZXDH_SDT_MC_TABLE_PHYPORT4 (ZXIC_UINT32)(80) +#define ZXDH_SDT_MC_TABLE_PHYPORT5 (ZXIC_UINT32)(81) + +/* etcam表 */ +#define ZXDH_SDT_FD_CFG_TABLE (ZXIC_UINT32)(130) +#define ZXDH_SDT_IPSEC_ENC_TABLE (ZXIC_UINT32)(131) + +/* 抓包使能 */ +#define ZXDH_SDT_CLUTH_DISABLE (ZXIC_UINT32)(0) +#define ZXDH_SDT_CLUTH_ENABLE (ZXIC_UINT32)(1) + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/driver/source/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/driver/source/Kbuild.include new file mode 100644 index 0000000..e99b0f3 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/driver/source/Kbuild.include @@ -0,0 +1,2 @@ +cur_dir := en_np/driver/source/ +src_files += $(addprefix $(cur_dir),$(notdir $(wildcard $(dinghai_root)/$(cur_dir)*.c))) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/driver/source/dpp_drv_acl.c b/src/net/drivers/net/ethernet/dinghai/en_np/driver/source/dpp_drv_acl.c new file mode 100644 index 0000000..a0f1354 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/driver/source/dpp_drv_acl.c @@ -0,0 +1,162 @@ +#include "dpp_apt_se_api.h" +#include "dpp_se_api.h" +#include "dpp_se_diag.h" +#include "dpp_drv_sdt.h" +#include "dpp_drv_acl.h" + +static DPP_APT_ACL_TABLE_T g_aclSdtTable[] = +{ + { + ZXDH_SDT_FD_CFG_TABLE, + { // sdt表 + DPP_SDT_TBLT_eTCAM, /** <@brief 查找表项类型 DPP_SDT_TABLE_TYPE_E */ + 0, /** <@brief etcam通道 */ + DPP_ACL_KEY_640b, /** <@brief etcam键值长度 DPP_ACL_KEY_MODE_E */ + ZXDH_ACL_TBL_ID2, /** <@brief etcam表项号 */ + DPP_ETCAM_NO_AS_RSP_MODE_32, /** <@brief handle模式返回位宽,非级联 0:默认32bit */ + 1, /** <@brief 级联eram使能 */ + ZXDH_FD_AS_ERAM_BAADDR, /** <@brief 级联eram基地址 */ + DPP_ACL_AS_MODE_128b, /** <@brief 级联返回位宽 DPP_ACL_AS_MODE_E */ + ZXDH_FD_AS_ERAM_DEPTH, /** <@brief 表项深度,越界检查 */ + 0, /** <@brief 抓包使能 */ + }, + { // res表 + DPP_ACL_PRI_SPECIFY, /** <@brief pri_mode */ + 2048, /** <@brief entry_num */ + 4, /** <@brief block_num */ + {2,3,4,5,0,0,0,0}, /** <@brief block_index */ + }, + NULL, /** <@brief 结构体转换为码流 */ + NULL, /** <@brief 码流转换为结构体 */ + }, + { + ZXDH_SDT_IPSEC_ENC_TABLE, + { // sdt表 + DPP_SDT_TBLT_eTCAM, /** <@brief 查找表项类型 DPP_SDT_TABLE_TYPE_E */ + 0, /** <@brief etcam通道 */ + DPP_ACL_KEY_320b, /** <@brief etcam键值长度 DPP_ACL_KEY_MODE_E */ + ZXDH_ACL_TBL_ID3, /** <@brief etcam表项号 */ + DPP_ETCAM_NO_AS_RSP_MODE_32, /** <@brief handle模式返回位宽,非级联 0:默认32bit */ + 1, /** <@brief 级联eram使能 */ + ZXDH_IPSEC_ENC_AS_ERAM_BAADDR, /** <@brief 级联eram基地址 */ + DPP_ACL_AS_MODE_64b, /** <@brief 级联返回位宽 DPP_ACL_AS_MODE_E */ + ZXDH_IPSEC_ENC_AS_ERAM_DEPTH, /** <@brief 表项深度,越界检查 */ + 0, /** <@brief 抓包使能 */ + }, + { // res表 + DPP_ACL_PRI_SPECIFY, /** <@brief pri_mode */ + 256, /** <@brief entry_num */ + 1, /** <@brief block_num */ + {6,0,0,0,0,0,0,0}, /** <@brief block_index */ + }, + dpp_apt_set_ipsec_enc_data, /** <@brief 结构体转换为码流 */ + dpp_apt_get_ipsec_enc_data, /** <@brief 码流转换为结构体 */ + }, +}; + +ZXIC_UINT32 dpp_apt_set_ipsec_enc_data(ZXIC_VOID *pData, DPP_ACL_ENTRY_EX_T *aclEntry) +{ + ZXIC_UINT32 key_data = 0; + ZXIC_UINT32 key_mask = 0; + ZXIC_UINT32 rst = 0; + + ZXDH_IPSEC_ENC_T *ipsec_enc_table = pData; + + ZXIC_COMM_CHECK_POINT(aclEntry); + ZXIC_COMM_CHECK_POINT(ipsec_enc_table); + + aclEntry->pri = ipsec_enc_table->index; + + if(aclEntry->key_data) + { + ZXIC_COMM_UINT32_WRITE_BITS(key_data, ipsec_enc_table->key.rsv1, 0, 32); + zxic_comm_swap((ZXIC_UINT8 *)&key_data, sizeof(ZXIC_UINT32)); + ZXIC_COMM_MEMCPY(aclEntry->key_data, &key_data, sizeof(ZXIC_UINT32)); + + ZXIC_COMM_UINT32_WRITE_BITS(key_data, ipsec_enc_table->key.rsv2, 0, 32); + zxic_comm_swap((ZXIC_UINT8 *)&key_data, sizeof(ZXIC_UINT32)); + ZXIC_COMM_MEMCPY(aclEntry->key_data + 4, &key_data, sizeof(ZXIC_UINT32)); + + ZXIC_COMM_MEMCPY(aclEntry->key_data + 8, ipsec_enc_table->key.sip, 16); + ZXIC_COMM_MEMCPY(aclEntry->key_data + 24, ipsec_enc_table->key.dip, 16); + } + + if(aclEntry->key_mask) + { + ZXIC_COMM_UINT32_WRITE_BITS(key_mask, ipsec_enc_table->mask.rsv1, 0, 32); + zxic_comm_swap((ZXIC_UINT8 *)&key_mask, sizeof(ZXIC_UINT32)); + ZXIC_COMM_MEMCPY(aclEntry->key_mask, &key_mask, sizeof(ZXIC_UINT32)); + + ZXIC_COMM_UINT32_WRITE_BITS(key_mask, ipsec_enc_table->mask.rsv2, 0, 32); + zxic_comm_swap((ZXIC_UINT8 *)&key_mask, sizeof(ZXIC_UINT32)); + ZXIC_COMM_MEMCPY(aclEntry->key_mask + 4, &key_mask, sizeof(ZXIC_UINT32)); + + ZXIC_COMM_MEMCPY(aclEntry->key_mask + 8, ipsec_enc_table->mask.sip, 16); + ZXIC_COMM_MEMCPY(aclEntry->key_mask + 24, ipsec_enc_table->mask.dip, 16); + } + + if(aclEntry->p_as_rslt) + { + ZXIC_COMM_UINT32_WRITE_BITS(rst, ipsec_enc_table->entry.hit_flag, 31, 1); + ZXIC_COMM_UINT32_WRITE_BITS(rst, ipsec_enc_table->entry.rsv, 0, 31); + zxic_comm_swap((ZXIC_UINT8 *)&rst, sizeof(ZXIC_UINT32)); + ZXIC_COMM_MEMCPY(aclEntry->p_as_rslt, &rst, sizeof(ZXIC_UINT32)); + + ZXIC_COMM_UINT32_WRITE_BITS(rst, ipsec_enc_table->entry.sa_id, 0, 32); + zxic_comm_swap((ZXIC_UINT8 *)&rst, sizeof(ZXIC_UINT32)); + ZXIC_COMM_MEMCPY(aclEntry->p_as_rslt + 4, &rst, sizeof(ZXIC_UINT32)); + } + + return DPP_OK; +} + +ZXIC_UINT32 dpp_apt_get_ipsec_enc_data(ZXIC_VOID *pData, DPP_ACL_ENTRY_EX_T *aclEntry) +{ + ZXDH_IPSEC_ENC_T *ipsec_enc_table = pData; + + ZXIC_COMM_CHECK_POINT(aclEntry); + ZXIC_COMM_CHECK_POINT(ipsec_enc_table); + + ipsec_enc_table->index = aclEntry->pri; + + if(aclEntry->key_data) + { + zxic_comm_swap(aclEntry->key_data, sizeof(ZXIC_UINT32)); + ZXIC_COMM_UINT32_GET_BITS(ipsec_enc_table->key.rsv1, *(ZXIC_UINT32 *)(aclEntry->key_data), 0, 32); + + zxic_comm_swap(aclEntry->key_data + 4, sizeof(ZXIC_UINT32)); + ZXIC_COMM_UINT32_GET_BITS(ipsec_enc_table->key.rsv2, *(ZXIC_UINT32 *)(aclEntry->key_data + 4), 0, 32); + + ZXIC_COMM_MEMCPY(ipsec_enc_table->key.sip, aclEntry->key_data + 8, 16); + ZXIC_COMM_MEMCPY(ipsec_enc_table->key.dip, aclEntry->key_data + 24, 16); + } + + if(aclEntry->key_mask) + { + zxic_comm_swap(aclEntry->key_mask, sizeof(ZXIC_UINT32)); + ZXIC_COMM_UINT32_GET_BITS(ipsec_enc_table->mask.rsv1, *(ZXIC_UINT32 *)(aclEntry->key_mask), 0, 32); + + zxic_comm_swap(aclEntry->key_mask + 4, sizeof(ZXIC_UINT32)); + ZXIC_COMM_UINT32_GET_BITS(ipsec_enc_table->mask.rsv2, *(ZXIC_UINT32 *)(aclEntry->key_mask + 4), 0, 32); + + ZXIC_COMM_MEMCPY(ipsec_enc_table->mask.sip, aclEntry->key_mask + 8, 16); + ZXIC_COMM_MEMCPY(ipsec_enc_table->mask.dip, aclEntry->key_mask + 24, 16); + } + + if(aclEntry->p_as_rslt) + { + zxic_comm_swap(aclEntry->p_as_rslt, sizeof(ZXIC_UINT32)); + ZXIC_COMM_UINT32_GET_BITS(ipsec_enc_table->entry.hit_flag, *(ZXIC_UINT32 *)(aclEntry->p_as_rslt), 31, 1); + ZXIC_COMM_UINT32_GET_BITS(ipsec_enc_table->entry.rsv, *(ZXIC_UINT32 *)(aclEntry->p_as_rslt), 0, 31); + + zxic_comm_swap(aclEntry->p_as_rslt + 4, sizeof(ZXIC_UINT32)); + ZXIC_COMM_UINT32_GET_BITS(ipsec_enc_table->entry.sa_id, *(ZXIC_UINT32 *)(aclEntry->p_as_rslt + 4), 0, 32); + } + + return DPP_OK; +} + +DPP_ACL_INIT_T g_aclTable = { + .tbl_num = sizeof(g_aclSdtTable) / sizeof(DPP_APT_ACL_TABLE_T), + .acl = g_aclSdtTable, +}; diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/driver/source/dpp_drv_eram.c b/src/net/drivers/net/ethernet/dinghai/en_np/driver/source/dpp_drv_eram.c new file mode 100644 index 0000000..22eeb50 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/driver/source/dpp_drv_eram.c @@ -0,0 +1,675 @@ +#include "dpp_apt_se_api.h" +#include "dpp_se_api.h" +#include "dpp_drv_sdt.h" +#include "dpp_drv_eram.h" + +static DPP_APT_ERAM_TABLE_T g_eRamSdtTable[] = +{ + { + ZXDH_SDT_VXLAN_ATTR_TABLE, + { + DPP_SDT_TBLT_eRAM, /** <@brief 查找表项类型 */ + ERAM128_TBL_64b, /** <@brief eRam返回位宽 */ + ZXDH_VXLAN_ERAM_BAADDR, /** <@brief eRam表项基地址,128bit为单位 */ + ZXDH_VXLAN_ERAM_DEPTH, /** <@brief 表项深度,作为越界检查使用 */ + ZXDH_SDT_CLUTH_DISABLE /** <@brief 抓包使能 */ + }, + ERAM128_OPR_64b, /** 操作位宽 */ + RD_MODE_HOLD, /** 所有表项都为:RD_MODE_HOLD */ + dpp_apt_set_vxlan_data, + dpp_apt_get_vxlan_data + }, + { + ZXDH_SDT_VPORT_ATTR_TABLE, + { + DPP_SDT_TBLT_eRAM, + ERAM128_TBL_128b, + ZXDH_VPORT_ATTR_ERAM_BAADDR, + ZXDH_VPORT_ATTR_ERAM_DEPTH, + ZXDH_SDT_CLUTH_DISABLE + }, + ERAM128_OPR_128b, + RD_MODE_HOLD, + dpp_apt_set_vport_data, + dpp_apt_get_vport_data + }, + { + ZXDH_SDT_PANEL_PORT_ATTR_TABLE, + { + DPP_SDT_TBLT_eRAM, + ERAM128_TBL_128b, + ZXDH_PANEL_PORT_ATTR_ERAM_BAADDR, + ZXDH_PANEL_PORT_ATTR_ERAM_DEPTH, + ZXDH_SDT_CLUTH_DISABLE + }, + ERAM128_OPR_128b, + RD_MODE_HOLD, + dpp_apt_set_panel_port_data, + dpp_apt_get_panel_port_data + }, + { + ZXDH_SDT_RSS_TO_VQID_TABLE, + { + DPP_SDT_TBLT_eRAM, + ERAM128_TBL_128b, + ZXDH_RSS_TO_VQID_ERAM_BAADDR, + ZXDH_RSS_TO_VQID_ERAM_DEPTH, + ZXDH_SDT_CLUTH_DISABLE + }, + ERAM128_OPR_128b, + RD_MODE_HOLD, + dpp_apt_set_rss_to_vqid_data, + dpp_apt_get_rss_to_vqid_data + }, + { + ZXDH_SDT_VLAN_FILTER_TABLE, + { + DPP_SDT_TBLT_eRAM, + ERAM128_TBL_128b, + ZXDH_VLAN_FILTER_ERAM_BAADDR, + ZXDH_VLAN_FILTER_ERAM_DEPTH, + ZXDH_SDT_CLUTH_DISABLE + }, + ERAM128_OPR_128b, + RD_MODE_HOLD, + dpp_apt_set_vlan_filter_data, + dpp_apt_get_vlan_filter_data + }, + { + ZXDH_SDT_LAG_TABLE, + { + DPP_SDT_TBLT_eRAM, + ERAM128_TBL_64b, + ZXDH_LAG_ERAM_BAADDR, + ZXDH_LAG_ERAM_DEPTH, + ZXDH_SDT_CLUTH_DISABLE + }, + ERAM128_OPR_64b, + RD_MODE_HOLD, + dpp_apt_set_lag_data, + dpp_apt_get_lag_data + }, + { + ZXDH_SDT_BC_TABLE, + { + DPP_SDT_TBLT_eRAM, + ERAM128_TBL_128b, + ZXDH_BC_ERAM_BAADDR, + ZXDH_BC_ERAM_DEPTH, + ZXDH_SDT_CLUTH_DISABLE + }, + ERAM128_OPR_128b, + RD_MODE_HOLD, + dpp_apt_set_bc_data, + dpp_apt_get_bc_data + }, + { + ZXDH_SDT_DSCP_TO_UP_TABLE, + { + DPP_SDT_TBLT_eRAM, + ERAM128_TBL_64b, + ZXDH_DSCP_TO_UP_ERAM_BAADDR, + ZXDH_DSCP_TO_UP_ERAM_DEPTH, + ZXDH_SDT_CLUTH_DISABLE + }, + ERAM128_OPR_64b, + RD_MODE_HOLD, + dpp_apt_set_dscp_to_up_data, + dpp_apt_get_dscp_to_up_data + }, + { + ZXDH_SDT_UP_TO_TC_TABLE, + { + DPP_SDT_TBLT_eRAM, + ERAM128_TBL_64b, + ZXDH_UP_TO_TC_ERAM_BAADDR, + ZXDH_UP_TO_TC_ERAM_DEPTH, + ZXDH_SDT_CLUTH_DISABLE + }, + ERAM128_OPR_64b, + RD_MODE_HOLD, + dpp_apt_set_up_to_tc_data, + dpp_apt_get_up_to_tc_data + }, + { + ZXDH_SDT_VHCA_TABLE, + { + DPP_SDT_TBLT_eRAM, + ERAM128_TBL_64b, + ZXDH_VHCA_ERAM_BAADDR, + ZXDH_VHCA_ERAM_DEPTH, + ZXDH_SDT_CLUTH_DISABLE + }, + ERAM128_OPR_64b, + RD_MODE_HOLD, + dpp_apt_set_vhca_data, + dpp_apt_get_vhca_data + }, + { + ZXDH_SDT_UC_PROMISC_TABLE, + { + DPP_SDT_TBLT_eRAM, + ERAM128_TBL_128b, + ZXDH_UC_PROMISC_ERAM_BAADDR, + ZXDH_UC_PROMISC_ERAM_DEPTH, + ZXDH_SDT_CLUTH_DISABLE + }, + ERAM128_OPR_128b, + RD_MODE_HOLD, + dpp_apt_set_promisc_data, + dpp_apt_get_promisc_data + }, + { + ZXDH_SDT_MC_PROMISC_TABLE, + { + DPP_SDT_TBLT_eRAM, + ERAM128_TBL_128b, + ZXDH_MC_PROMISC_ERAM_BAADDR, + ZXDH_MC_PROMISC_ERAM_DEPTH, + ZXDH_SDT_CLUTH_DISABLE + }, + ERAM128_OPR_128b, + RD_MODE_HOLD, + dpp_apt_set_promisc_data, + dpp_apt_get_promisc_data + }, +}; + +DPP_ERAM_INIT_T g_eRamTable = { + .tbl_num = sizeof(g_eRamSdtTable) / sizeof(DPP_APT_ERAM_TABLE_T), + .eram = g_eRamSdtTable, +}; + +ZXIC_UINT32 dpp_apt_set_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4], ZXIC_UINT32 size) +{ + if (pData == NULL) + { + return DPP_ERR; + } + memcpy(buff, pData, size); + return DPP_OK; +} + +ZXIC_UINT32 dpp_apt_get_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4],ZXIC_UINT32 size) +{ + if (pData == NULL) + { + return DPP_ERR; + } + memcpy(pData, buff, size); + return DPP_OK; +} + +ZXIC_UINT32 dpp_apt_set_vxlan_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]) +{ + return dpp_apt_set_data(pData, buff, sizeof(ZXDH_VXLAN_T)); +} + +ZXIC_UINT32 dpp_apt_get_vxlan_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]) +{ + return dpp_apt_get_data(pData, buff, sizeof(ZXDH_VXLAN_T)); +} + +ZXIC_UINT32 dpp_apt_set_vport_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]) +{ + ZXDH_VPORT_T *port_attr = (ZXDH_VPORT_T *)pData; + + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->hit_flag, 31, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->mtu_offload_enable, 30, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->rss_enable, 29, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->qinq_vlan_strip_offload, 28, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->vlan_strip_offload, 27, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->vlan_filter_enable, 26, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->rdma_offload_enable, 25, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->hw_bond_enable, 24, 1); + + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->allmulticast_enable, 23, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->is_up, 22, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->outer_ip_checksum_offload, 21, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->ip_checksum_offload, 20, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->tcp_udp_checksum_offload, 19, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->ip_fragment_offload, 18, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->lro_offload, 17, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->accelerator_offload_flag, 16, 1); + + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->virtio_enable, 15, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->virtion_version, 13, 2); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->is_vf, 12, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->is_passthrough, 11, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->lag_enable, 10, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->ovs_enable, 9, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->inline_sec_offload, 8, 1); + + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->spoof_check_enable, 7, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->vepa_enable, 6, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->fd_enable, 5, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->egress_meter_mode, 4, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->ingress_meter_mode, 3, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->egress_meter_enable, 2, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->ingress_meter_enable, 1, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], port_attr->tm_enable, 0, 1); + + ZXIC_COMM_UINT32_WRITE_BITS(buff[1], port_attr->rsv1, 31, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[1], port_attr->hash_search_index, 28, 3); + ZXIC_COMM_UINT32_WRITE_BITS(buff[1], port_attr->port_base_qid, 16, 12); + + ZXIC_COMM_UINT32_WRITE_BITS(buff[1], port_attr->mtu, 0, 16); + + ZXIC_COMM_UINT32_WRITE_BITS(buff[2], port_attr->rsv3, 30, 2); + ZXIC_COMM_UINT32_WRITE_BITS(buff[2], port_attr->pf_vqm_vfid, 19, 11); + ZXIC_COMM_UINT32_WRITE_BITS(buff[2], port_attr->lag_id, 16, 3); + + ZXIC_COMM_UINT32_WRITE_BITS(buff[2], port_attr->panel_id, 12, 4); + ZXIC_COMM_UINT32_WRITE_BITS(buff[2], port_attr->hash_alg, 8, 4); + ZXIC_COMM_UINT32_WRITE_BITS(buff[2], port_attr->rss_hash_factor, 0, 8); + + ZXIC_COMM_UINT32_WRITE_BITS(buff[3], port_attr->uplink_port, 26, 6); + ZXIC_COMM_UINT32_WRITE_BITS(buff[3], port_attr->vhca, 16, 10); + ZXIC_COMM_UINT32_WRITE_BITS(buff[3], port_attr->tpid, 0, 16); + + + return DPP_OK; +} + +ZXIC_UINT32 dpp_apt_get_vport_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]) +{ + ZXDH_VPORT_T *port_attr = (ZXDH_VPORT_T *)pData; + + ZXIC_COMM_UINT32_GET_BITS(port_attr->hit_flag, buff[0], 31, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->mtu_offload_enable, buff[0], 30, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->rss_enable, buff[0], 29, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->qinq_vlan_strip_offload, buff[0], 28, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->vlan_strip_offload, buff[0], 27, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->vlan_filter_enable, buff[0], 26, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->rdma_offload_enable, buff[0], 25, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->hw_bond_enable, buff[0], 24, 1); + + ZXIC_COMM_UINT32_GET_BITS(port_attr->allmulticast_enable, buff[0], 23, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->is_up, buff[0], 22, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->outer_ip_checksum_offload, buff[0], 21, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->ip_checksum_offload, buff[0], 20, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->tcp_udp_checksum_offload, buff[0], 19, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->ip_fragment_offload, buff[0], 18, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->lro_offload, buff[0], 17, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->accelerator_offload_flag, buff[0], 16, 1); + + ZXIC_COMM_UINT32_GET_BITS(port_attr->virtio_enable, buff[0], 15, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->virtion_version, buff[0], 13, 2); + ZXIC_COMM_UINT32_GET_BITS(port_attr->is_vf, buff[0], 12, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->is_passthrough, buff[0], 11, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->lag_enable, buff[0], 10, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->ovs_enable, buff[0], 9, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->inline_sec_offload, buff[0], 8, 1); + + ZXIC_COMM_UINT32_GET_BITS(port_attr->spoof_check_enable, buff[0], 7, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->vepa_enable, buff[0], 6, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->fd_enable, buff[0], 5, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->egress_meter_mode, buff[0], 4, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->ingress_meter_mode, buff[0], 3, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->egress_meter_enable, buff[0], 2, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->ingress_meter_enable, buff[0], 1, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->tm_enable, buff[0], 0, 1); + + ZXIC_COMM_UINT32_GET_BITS(port_attr->rsv1, buff[1], 31, 1); + ZXIC_COMM_UINT32_GET_BITS(port_attr->hash_search_index, buff[1], 28, 3); + ZXIC_COMM_UINT32_GET_BITS(port_attr->port_base_qid, buff[1], 16, 12); + + ZXIC_COMM_UINT32_GET_BITS(port_attr->mtu, buff[1], 0, 16); + + ZXIC_COMM_UINT32_GET_BITS(port_attr->rsv3, buff[2], 30, 2); + ZXIC_COMM_UINT32_GET_BITS(port_attr->pf_vqm_vfid, buff[2], 19, 11); + ZXIC_COMM_UINT32_GET_BITS(port_attr->lag_id, buff[2], 16, 3); + + ZXIC_COMM_UINT32_GET_BITS(port_attr->panel_id, buff[2], 12, 4); + ZXIC_COMM_UINT32_GET_BITS(port_attr->hash_alg, buff[2], 8, 4); + ZXIC_COMM_UINT32_GET_BITS(port_attr->rss_hash_factor, buff[2], 0, 8); + + ZXIC_COMM_UINT32_GET_BITS(port_attr->uplink_port, buff[3], 26, 6); + ZXIC_COMM_UINT32_GET_BITS(port_attr->vhca, buff[3], 16, 10); + ZXIC_COMM_UINT32_GET_BITS(port_attr->tpid, buff[3], 0, 16); + + return DPP_OK; + +} + +ZXIC_UINT32 dpp_apt_set_panel_port_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]) +{ + ZXDH_PANEL_PORT_T* attr = (ZXDH_PANEL_PORT_T*)pData; + + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], attr->hit_flag, 31, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], attr->trust_mode, 30, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], attr->ptp_tc_enable, 28, 2); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], attr->tm_shape_enable, 27, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], attr->pf_vqm_vfid, 16, 11); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], attr->rsv2, 11, 5); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], attr->ptp_port_vfid, 0, 11); + ZXIC_COMM_UINT32_WRITE_BITS(buff[1], attr->tm_base_queue, 20, 12); + ZXIC_COMM_UINT32_WRITE_BITS(buff[1], attr->rsv3, 17, 3); + ZXIC_COMM_UINT32_WRITE_BITS(buff[1], attr->mtu_offload_enable, 16, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[1], attr->mtu, 0, 16); + + ZXIC_COMM_UINT32_WRITE_BITS(buff[2], attr->hw_bond_enable, 31, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[2], attr->bond_link_up, 30, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[2], attr->is_up, 29, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[2], attr->rsv4, 27, 2); + ZXIC_COMM_UINT32_WRITE_BITS(buff[2], attr->bond_pf_vqm_vfid, 16, 11); + ZXIC_COMM_UINT32_WRITE_BITS(buff[2], attr->rsv5, 12, 4); + ZXIC_COMM_UINT32_WRITE_BITS(buff[2], attr->pf_memport_qid, 0, 12); + + ZXIC_COMM_UINT32_WRITE_BITS(buff[3], attr->rsv6, 27, 5); + ZXIC_COMM_UINT32_WRITE_BITS(buff[3], attr->ovs_pf_vfid, 16, 11); + ZXIC_COMM_UINT32_WRITE_BITS(buff[3], attr->rsv7, 0, 16); + + return DPP_OK; +} + +ZXIC_UINT32 dpp_apt_get_panel_port_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]) +{ + ZXDH_PANEL_PORT_T* attr = (ZXDH_PANEL_PORT_T*)pData; + + ZXIC_COMM_UINT32_GET_BITS(attr->hit_flag, buff[0], 31, 1); + ZXIC_COMM_UINT32_GET_BITS(attr->trust_mode, buff[0], 30, 1); + ZXIC_COMM_UINT32_GET_BITS(attr->ptp_tc_enable, buff[0], 28, 2); + ZXIC_COMM_UINT32_GET_BITS(attr->tm_shape_enable, buff[0], 27, 1); + ZXIC_COMM_UINT32_GET_BITS(attr->pf_vqm_vfid, buff[0], 16, 11); + ZXIC_COMM_UINT32_GET_BITS(attr->rsv2, buff[0], 11, 5); + ZXIC_COMM_UINT32_GET_BITS(attr->ptp_port_vfid, buff[0], 0, 11); + ZXIC_COMM_UINT32_GET_BITS(attr->tm_base_queue, buff[1], 20, 12); + ZXIC_COMM_UINT32_GET_BITS(attr->rsv3, buff[1], 17, 3); + ZXIC_COMM_UINT32_GET_BITS(attr->mtu_offload_enable, buff[1], 16, 1); + ZXIC_COMM_UINT32_GET_BITS(attr->mtu, buff[1], 0, 16); + + ZXIC_COMM_UINT32_GET_BITS(attr->hw_bond_enable, buff[2], 31, 1); + ZXIC_COMM_UINT32_GET_BITS(attr->bond_link_up, buff[2], 30, 1); + ZXIC_COMM_UINT32_GET_BITS(attr->is_up, buff[2], 29, 1); + ZXIC_COMM_UINT32_GET_BITS(attr->rsv4, buff[2], 27, 2); + ZXIC_COMM_UINT32_GET_BITS(attr->bond_pf_vqm_vfid, buff[2], 16, 11); + ZXIC_COMM_UINT32_GET_BITS(attr->rsv5, buff[2], 12, 4); + ZXIC_COMM_UINT32_GET_BITS(attr->pf_memport_qid, buff[2], 0, 12); + + ZXIC_COMM_UINT32_GET_BITS(attr->rsv6, buff[3], 27, 5); + ZXIC_COMM_UINT32_GET_BITS(attr->ovs_pf_vfid, buff[3], 16, 11); + ZXIC_COMM_UINT32_GET_BITS(attr->rsv7, buff[3], 0, 16); + + return DPP_OK; +} + +ZXIC_UINT32 dpp_apt_set_dscp_to_up_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]) +{ + ZXDH_DSCP_TO_UP_T* attr = (ZXDH_DSCP_TO_UP_T*)pData; + + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], attr->hit_flag, 31, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], attr->rsv1, 3, 28); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], attr->up, 0, 3); + + ZXIC_COMM_UINT32_WRITE_BITS(buff[1], attr->rsv2, 0, 32); + + return DPP_OK; +} + +ZXIC_UINT32 dpp_apt_get_dscp_to_up_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]) +{ + ZXDH_DSCP_TO_UP_T* attr = (ZXDH_DSCP_TO_UP_T*)pData; + + ZXIC_COMM_UINT32_GET_BITS(attr->hit_flag, buff[0], 31, 1); + ZXIC_COMM_UINT32_GET_BITS(attr->rsv1, buff[0], 3, 28); + ZXIC_COMM_UINT32_GET_BITS(attr->up, buff[0], 0, 3); + + ZXIC_COMM_UINT32_GET_BITS(attr->rsv2, buff[1], 0, 32); + + return DPP_OK; +} + +ZXIC_UINT32 dpp_apt_set_up_to_tc_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]) +{ + ZXDH_UP_TO_TC_T* attr = (ZXDH_UP_TO_TC_T*)pData; + + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], attr->hit_flag, 31, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], attr->rsv1, 3, 28); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], attr->tc, 0, 3); + + ZXIC_COMM_UINT32_WRITE_BITS(buff[1], attr->rsv2, 0, 32); + + return DPP_OK; +} + +ZXIC_UINT32 dpp_apt_get_up_to_tc_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]) +{ + ZXDH_UP_TO_TC_T* attr = (ZXDH_UP_TO_TC_T*)pData; + + ZXIC_COMM_UINT32_GET_BITS(attr->hit_flag, buff[0], 31, 1); + ZXIC_COMM_UINT32_GET_BITS(attr->rsv1, buff[0], 3, 28); + ZXIC_COMM_UINT32_GET_BITS(attr->tc, buff[0], 0, 3); + + ZXIC_COMM_UINT32_GET_BITS(attr->rsv2, buff[1], 0, 32); + + return DPP_OK; +} + +ZXIC_UINT32 dpp_apt_set_rss_to_vqid_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]) +{ + ZXDH_RSS_TO_VQID_T *attr = (ZXDH_RSS_TO_VQID_T*)pData; + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], attr->hit_flag, 31, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], attr->vqm_qid[0], 16, 15); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], attr->vqm_qid[1], 0, 16); + + ZXIC_COMM_UINT32_WRITE_BITS(buff[1], attr->vqm_qid[2], 16, 16); + ZXIC_COMM_UINT32_WRITE_BITS(buff[1], attr->vqm_qid[3], 0, 16); + + ZXIC_COMM_UINT32_WRITE_BITS(buff[2], attr->vqm_qid[4], 16, 16); + ZXIC_COMM_UINT32_WRITE_BITS(buff[2], attr->vqm_qid[5], 0, 16); + + ZXIC_COMM_UINT32_WRITE_BITS(buff[3], attr->vqm_qid[6], 16, 16); + ZXIC_COMM_UINT32_WRITE_BITS(buff[3], attr->vqm_qid[7], 0, 16); + + return DPP_OK; +} + +ZXIC_UINT32 dpp_apt_get_rss_to_vqid_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]) +{ + ZXDH_RSS_TO_VQID_T *attr = (ZXDH_RSS_TO_VQID_T*)pData; + + ZXIC_COMM_UINT32_GET_BITS(attr->hit_flag, buff[0], 31, 1); + ZXIC_COMM_UINT32_GET_BITS(attr->vqm_qid[0], buff[0], 16, 15); + ZXIC_COMM_UINT32_GET_BITS(attr->vqm_qid[1], buff[0], 0, 16); + + ZXIC_COMM_UINT32_GET_BITS(attr->vqm_qid[2], buff[1],16, 16); + ZXIC_COMM_UINT32_GET_BITS(attr->vqm_qid[3], buff[1], 0, 16); + + ZXIC_COMM_UINT32_GET_BITS(attr->vqm_qid[4], buff[2], 16, 16); + ZXIC_COMM_UINT32_GET_BITS(attr->vqm_qid[5], buff[2], 0, 16); + + ZXIC_COMM_UINT32_GET_BITS(attr->vqm_qid[6], buff[3], 16, 16); + ZXIC_COMM_UINT32_GET_BITS(attr->vqm_qid[7], buff[3], 0, 16); + + return DPP_OK; +} + +ZXIC_UINT32 dpp_apt_set_vlan_filter_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]) +{ + ZXDH_VLAN_FILTER_T *vlan_filter_table = (ZXDH_VLAN_FILTER_T *)pData; + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], vlan_filter_table->hit_flag, 31, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], vlan_filter_table->rsv, 24, 7); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], vlan_filter_table->vport_bitmap[0], 16, 8); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], vlan_filter_table->vport_bitmap[1], 8, 8); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], vlan_filter_table->vport_bitmap[2], 0, 8); + + ZXIC_COMM_UINT32_WRITE_BITS(buff[1], vlan_filter_table->vport_bitmap[3], 24, 8); + ZXIC_COMM_UINT32_WRITE_BITS(buff[1], vlan_filter_table->vport_bitmap[4], 16, 8); + ZXIC_COMM_UINT32_WRITE_BITS(buff[1], vlan_filter_table->vport_bitmap[5], 8, 8); + ZXIC_COMM_UINT32_WRITE_BITS(buff[1], vlan_filter_table->vport_bitmap[6], 0, 8); + + ZXIC_COMM_UINT32_WRITE_BITS(buff[2], vlan_filter_table->vport_bitmap[7], 24, 8); + ZXIC_COMM_UINT32_WRITE_BITS(buff[2], vlan_filter_table->vport_bitmap[8], 16, 8); + ZXIC_COMM_UINT32_WRITE_BITS(buff[2], vlan_filter_table->vport_bitmap[9], 8, 8); + ZXIC_COMM_UINT32_WRITE_BITS(buff[2], vlan_filter_table->vport_bitmap[10], 0, 8); + + ZXIC_COMM_UINT32_WRITE_BITS(buff[3], vlan_filter_table->vport_bitmap[11], 24, 8); + ZXIC_COMM_UINT32_WRITE_BITS(buff[3], vlan_filter_table->vport_bitmap[12], 16, 8); + ZXIC_COMM_UINT32_WRITE_BITS(buff[3], vlan_filter_table->vport_bitmap[13], 8, 8); + ZXIC_COMM_UINT32_WRITE_BITS(buff[3], vlan_filter_table->vport_bitmap[14], 0, 8); + return DPP_OK; +} + +ZXIC_UINT32 dpp_apt_get_vlan_filter_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]) +{ + ZXDH_VLAN_FILTER_T *vlan_filter_table = (ZXDH_VLAN_FILTER_T *)pData; + ZXIC_COMM_UINT32_GET_BITS(vlan_filter_table->hit_flag, buff[0], 31, 1); + ZXIC_COMM_UINT32_GET_BITS(vlan_filter_table->rsv, buff[0], 24, 7); + ZXIC_COMM_UINT32_GET_BITS(vlan_filter_table->vport_bitmap[0], buff[0], 16, 8); + ZXIC_COMM_UINT32_GET_BITS(vlan_filter_table->vport_bitmap[1], buff[0], 8, 8); + ZXIC_COMM_UINT32_GET_BITS(vlan_filter_table->vport_bitmap[2], buff[0], 0, 8); + + ZXIC_COMM_UINT32_GET_BITS(vlan_filter_table->vport_bitmap[3], buff[1], 24, 8); + ZXIC_COMM_UINT32_GET_BITS(vlan_filter_table->vport_bitmap[4], buff[1], 16, 8); + ZXIC_COMM_UINT32_GET_BITS(vlan_filter_table->vport_bitmap[5], buff[1], 8, 8); + ZXIC_COMM_UINT32_GET_BITS(vlan_filter_table->vport_bitmap[6], buff[1], 0, 8); + + ZXIC_COMM_UINT32_GET_BITS(vlan_filter_table->vport_bitmap[7], buff[2], 24, 8); + ZXIC_COMM_UINT32_GET_BITS(vlan_filter_table->vport_bitmap[8], buff[2], 16, 8); + ZXIC_COMM_UINT32_GET_BITS(vlan_filter_table->vport_bitmap[9], buff[2], 8, 8); + ZXIC_COMM_UINT32_GET_BITS(vlan_filter_table->vport_bitmap[10], buff[2], 0, 8); + + ZXIC_COMM_UINT32_GET_BITS(vlan_filter_table->vport_bitmap[11], buff[3], 24, 8); + ZXIC_COMM_UINT32_GET_BITS(vlan_filter_table->vport_bitmap[12], buff[3], 16, 8); + ZXIC_COMM_UINT32_GET_BITS(vlan_filter_table->vport_bitmap[13], buff[3], 8, 8); + ZXIC_COMM_UINT32_GET_BITS(vlan_filter_table->vport_bitmap[14], buff[3], 0, 8); + return DPP_OK; +} + +ZXIC_UINT32 dpp_apt_set_lag_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]) +{ + ZXDH_LAG_T *lag_entry = (ZXDH_LAG_T *)pData; + + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], lag_entry->hit_flag, 31, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], lag_entry->rsv1, 27, 4); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], lag_entry->member_num, 24, 3); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], lag_entry->bond_mode, 16, 8); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], lag_entry->hash_factor, 8, 8); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], lag_entry->rsv2, 0, 8); + + ZXIC_COMM_UINT32_WRITE_BITS(buff[1], lag_entry->rsv2, 16, 16); + ZXIC_COMM_UINT32_WRITE_BITS(buff[1], lag_entry->member_bitmap, 0, 16); + + return DPP_OK; +} + +ZXIC_UINT32 dpp_apt_get_lag_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]) +{ + ZXDH_LAG_T *lag_entry = (ZXDH_LAG_T *)pData; + + ZXIC_COMM_UINT32_GET_BITS(lag_entry->hit_flag, buff[0], 31, 1); + ZXIC_COMM_UINT32_GET_BITS(lag_entry->rsv1, buff[0], 27, 4); + ZXIC_COMM_UINT32_GET_BITS(lag_entry->member_num, buff[0], 24, 3); + ZXIC_COMM_UINT32_GET_BITS(lag_entry->bond_mode, buff[0], 16, 8); + ZXIC_COMM_UINT32_GET_BITS(lag_entry->hash_factor, buff[0], 8, 8); + ZXIC_COMM_UINT32_GET_BITS(lag_entry->rsv2, buff[0], 0, 8); + + ZXIC_COMM_UINT32_GET_BITS(lag_entry->rsv2, buff[1], 16, 16); + ZXIC_COMM_UINT32_GET_BITS(lag_entry->member_bitmap, buff[1], 0, 16); + + return DPP_OK; +} + +ZXIC_UINT32 dpp_apt_set_bc_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]) +{ + ZXIC_UINT32 bc_bitmap = 0; + ZXDH_BC_T *bc_entry = (ZXDH_BC_T *)pData; + + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], bc_entry->hit_flag, 31, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], bc_entry->rsv1, 0, 31); + + ZXIC_COMM_UINT32_WRITE_BITS(buff[1], bc_entry->rsv2, 0, 32); + + bc_bitmap = bc_entry->bc_bitmap >> 32; + ZXIC_COMM_UINT32_WRITE_BITS(buff[2], bc_bitmap, 0, 32); + + bc_bitmap = bc_entry->bc_bitmap; + ZXIC_COMM_UINT32_WRITE_BITS(buff[3], bc_bitmap, 0, 32); + + return DPP_OK; +} + +ZXIC_UINT32 dpp_apt_get_bc_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]) +{ + ZXIC_UINT32 bc_bitmap = 0; + ZXDH_BC_T *bc_entry = (ZXDH_BC_T *)pData; + + ZXIC_COMM_UINT32_GET_BITS(bc_entry->hit_flag, buff[0], 31, 1); + ZXIC_COMM_UINT32_GET_BITS(bc_entry->rsv1, buff[0], 0, 31); + + ZXIC_COMM_UINT32_GET_BITS(bc_entry->rsv2, buff[1], 0, 32); + + ZXIC_COMM_UINT32_GET_BITS(bc_bitmap, buff[2], 0, 32); + bc_entry->bc_bitmap = (((ZXIC_UINT64)bc_bitmap) << 32); + + ZXIC_COMM_UINT32_GET_BITS(bc_bitmap, buff[3], 0, 32); + bc_entry->bc_bitmap |= bc_bitmap; + + return DPP_OK; +} + +ZXIC_UINT32 dpp_apt_set_promisc_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]) +{ + ZXIC_UINT32 bitmap = 0; + ZXDH_PROMISC_T *promisc_entry = (ZXDH_PROMISC_T *)pData; + + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], promisc_entry->hit_flag, 31, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], promisc_entry->pf_enable, 30, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], promisc_entry->rsv1, 0, 30); + + ZXIC_COMM_UINT32_WRITE_BITS(buff[1], promisc_entry->rsv2, 0, 32); + + bitmap = promisc_entry->bitmap >> 32; + ZXIC_COMM_UINT32_WRITE_BITS(buff[2], bitmap, 0, 32); + + bitmap = promisc_entry->bitmap; + ZXIC_COMM_UINT32_WRITE_BITS(buff[3], bitmap, 0, 32); + + return DPP_OK; +} + +ZXIC_UINT32 dpp_apt_get_promisc_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]) +{ + ZXIC_UINT32 bitmap = 0; + ZXDH_PROMISC_T *promisc_entry = (ZXDH_PROMISC_T *)pData; + + ZXIC_COMM_UINT32_GET_BITS(promisc_entry->hit_flag, buff[0], 31, 1); + ZXIC_COMM_UINT32_GET_BITS(promisc_entry->pf_enable, buff[0], 30, 1); + ZXIC_COMM_UINT32_GET_BITS(promisc_entry->rsv1, buff[0], 0, 30); + + ZXIC_COMM_UINT32_GET_BITS(promisc_entry->rsv2, buff[1], 0, 32); + + ZXIC_COMM_UINT32_GET_BITS(bitmap, buff[2], 0, 32); + promisc_entry->bitmap = (((ZXIC_UINT64)bitmap) << 32); + + ZXIC_COMM_UINT32_GET_BITS(bitmap, buff[3], 0, 32); + promisc_entry->bitmap |= bitmap; + + return DPP_OK; +} + +ZXIC_UINT32 dpp_apt_set_vhca_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]) +{ + ZXDH_VHCA_T *vhca_entry = (ZXDH_VHCA_T *)pData; + + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], vhca_entry->valid, 31, 1); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], vhca_entry->rsv1, 11, 20); + ZXIC_COMM_UINT32_WRITE_BITS(buff[0], vhca_entry->vqm_vfid, 0, 11); + + ZXIC_COMM_UINT32_WRITE_BITS(buff[1], vhca_entry->rsv2, 0, 32); + return DPP_OK; +} + +ZXIC_UINT32 dpp_apt_get_vhca_data(ZXIC_VOID *pData, ZXIC_UINT32 buff[4]) +{ + ZXDH_VHCA_T *vhca_entry = (ZXDH_VHCA_T *)pData; + + ZXIC_COMM_UINT32_GET_BITS(vhca_entry->valid, buff[0], 31, 1); + ZXIC_COMM_UINT32_GET_BITS(vhca_entry->rsv1, buff[0], 11, 20); + ZXIC_COMM_UINT32_GET_BITS(vhca_entry->vqm_vfid, buff[0], 0, 11); + + ZXIC_COMM_UINT32_GET_BITS(vhca_entry->rsv2, buff[1], 0, 32); + + return DPP_OK; +} \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/driver/source/dpp_drv_hash.c b/src/net/drivers/net/ethernet/dinghai/en_np/driver/source/dpp_drv_hash.c new file mode 100644 index 0000000..84d7319 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/driver/source/dpp_drv_hash.c @@ -0,0 +1,588 @@ +#include "dpp_apt_se_api.h" +#include "dpp_se_api.h" +#include "dpp_apt_se.h" +#include "dpp_sdt.h" +#include "dpp_hash.h" +#include "dpp_dtb_table.h" +#include "dpp_drv_sdt.h" +#include "dpp_drv_hash.h" +#include "dpp_kernel_init.h" + +static DPP_APT_HASH_TABLE_T g_hashSdtTable[] = +{ + { + ZXDH_SDT_L2_ENTRY_TABLE_PHYPORT0, + { + DPP_SDT_TBLT_HASH, + ZXDH_HASH_FUNC0, + HASH_KEY_128b, + 8, // rsv(16) + mac(48) + 0, + 0, + 0, + ZXDH_L2ENTRY_KEEPALIVE_ERAM_BAADDR, + DPP_SDT_RSP_32b, // hit-flag(1) + rsv(20) + VQM_VFID(11) + ZXDH_SDT_CLUTH_DISABLE + }, + 0, + dpp_apt_set_l2entry_data, + dpp_apt_get_l2entry_data + }, + { + ZXDH_SDT_L2_ENTRY_TABLE_PHYPORT1, + { + DPP_SDT_TBLT_HASH, + ZXDH_HASH_FUNC0, + HASH_KEY_128b, + 8, // rsv(16) + mac(48) + 1, + 0, + 0, + ZXDH_L2ENTRY_KEEPALIVE_ERAM_BAADDR, + DPP_SDT_RSP_32b, // hit-flag(1) + rsv(20) + VQM_VFID(11) + ZXDH_SDT_CLUTH_DISABLE + }, + 0, + dpp_apt_set_l2entry_data, + dpp_apt_get_l2entry_data + }, + { + ZXDH_SDT_L2_ENTRY_TABLE_PHYPORT2, + { + DPP_SDT_TBLT_HASH, + ZXDH_HASH_FUNC0, + HASH_KEY_128b, + 8, // rsv(16) + mac(48) + 2, + 0, + 0, + ZXDH_L2ENTRY_KEEPALIVE_ERAM_BAADDR, + DPP_SDT_RSP_32b, // hit-flag(1) + rsv(20) + VQM_VFID(11) + ZXDH_SDT_CLUTH_DISABLE + }, + 0, + dpp_apt_set_l2entry_data, + dpp_apt_get_l2entry_data + }, + { + ZXDH_SDT_L2_ENTRY_TABLE_PHYPORT3, + { + DPP_SDT_TBLT_HASH, + ZXDH_HASH_FUNC0, + HASH_KEY_128b, + 8, // rsv(16) + mac(48) + 3, + 0, + 0, + ZXDH_L2ENTRY_KEEPALIVE_ERAM_BAADDR, + DPP_SDT_RSP_32b, // hit-flag(1) + rsv(20) + VQM_VFID(11) + ZXDH_SDT_CLUTH_DISABLE + }, + 0, + dpp_apt_set_l2entry_data, + dpp_apt_get_l2entry_data + }, + { + ZXDH_SDT_L2_ENTRY_TABLE_PHYPORT4, + { + DPP_SDT_TBLT_HASH, + ZXDH_HASH_FUNC0, + HASH_KEY_128b, + 8, // rsv(16) + mac(48) + 4, + 0, + 0, + ZXDH_L2ENTRY_KEEPALIVE_ERAM_BAADDR, + DPP_SDT_RSP_32b, // hit-flag(1) + rsv(20) + VQM_VFID(11) + ZXDH_SDT_CLUTH_DISABLE + }, + 0, + dpp_apt_set_l2entry_data, + dpp_apt_get_l2entry_data + }, + { + ZXDH_SDT_L2_ENTRY_TABLE_PHYPORT5, + { + DPP_SDT_TBLT_HASH, + ZXDH_HASH_FUNC0, + HASH_KEY_128b, + 8, // rsv(16) + mac(48) + 5, + 0, + 0, + ZXDH_L2ENTRY_KEEPALIVE_ERAM_BAADDR, + DPP_SDT_RSP_32b, // hit-flag(1) + rsv(20) + VQM_VFID(11) + ZXDH_SDT_CLUTH_DISABLE + }, + 0, + dpp_apt_set_l2entry_data, + dpp_apt_get_l2entry_data + }, + { + ZXDH_SDT_MC_TABLE_PHYPORT0, + { + DPP_SDT_TBLT_HASH, + ZXDH_HASH_FUNC0, + HASH_KEY_256b, + 8, // rsv(14) + vf_group_id(2) + MC_MAC(48) + 12, + 0, + 0, + 0, + DPP_SDT_RSP_128b, // hit_flag(1) + rsv(63) + MC_BITMAP(64) + ZXDH_SDT_CLUTH_DISABLE + }, + 0, + dpp_apt_set_mc_data, + dpp_apt_get_mc_data + }, + { + ZXDH_SDT_MC_TABLE_PHYPORT1, + { + DPP_SDT_TBLT_HASH, + ZXDH_HASH_FUNC0, + HASH_KEY_256b, + 8, // rsv(14) + vf_group_id(2) + MC_MAC(48) + 13, + 0, + 0, + 0, + DPP_SDT_RSP_128b, // hit_flag(1) + rsv(63) + MC_BITMAP(64) + ZXDH_SDT_CLUTH_DISABLE + }, + 0, + dpp_apt_set_mc_data, + dpp_apt_get_mc_data + }, + { + ZXDH_SDT_MC_TABLE_PHYPORT2, + { + DPP_SDT_TBLT_HASH, + ZXDH_HASH_FUNC0, + HASH_KEY_256b, + 8, // rsv(14) + vf_group_id(2) + MC_MAC(48) + 14, + 0, + 0, + 0, + DPP_SDT_RSP_128b, // hit_flag(1) + rsv(63) + MC_BITMAP(64) + ZXDH_SDT_CLUTH_DISABLE + }, + 0, + dpp_apt_set_mc_data, + dpp_apt_get_mc_data + }, + { + ZXDH_SDT_MC_TABLE_PHYPORT3, + { + DPP_SDT_TBLT_HASH, + ZXDH_HASH_FUNC0, + HASH_KEY_256b, + 8, // rsv(14) + vf_group_id(2) + MC_MAC(48) + 15, + 0, + 0, + 0, + DPP_SDT_RSP_128b, // hit_flag(1) + rsv(63) + MC_BITMAP(64) + ZXDH_SDT_CLUTH_DISABLE + }, + 0, + dpp_apt_set_mc_data, + dpp_apt_get_mc_data + }, + { + ZXDH_SDT_MC_TABLE_PHYPORT4, + { + DPP_SDT_TBLT_HASH, + ZXDH_HASH_FUNC0, + HASH_KEY_256b, + 8, // rsv(14) + vf_group_id(2) + MC_MAC(48) + 16, + 0, + 0, + 0, + DPP_SDT_RSP_128b, // hit_flag(1) + rsv(63) + MC_BITMAP(64) + ZXDH_SDT_CLUTH_DISABLE + }, + 0, + dpp_apt_set_mc_data, + dpp_apt_get_mc_data + }, + { + ZXDH_SDT_MC_TABLE_PHYPORT5, + { + DPP_SDT_TBLT_HASH, + ZXDH_HASH_FUNC0, + HASH_KEY_256b, + 8, // rsv(14) + vf_group_id(2) + MC_MAC(48) + 17, + 0, + 0, + 0, + DPP_SDT_RSP_128b, // hit_flag(1) + rsv(63) + MC_BITMAP(64) + ZXDH_SDT_CLUTH_DISABLE + }, + 0, + dpp_apt_set_mc_data, + dpp_apt_get_mc_data + } +}; + +DPP_APT_HASH_FUNC_RES_T func_res[] = { + /*func_id | zblk_num | zblk_bitmap | ddr_dis*/ + {0, 10, 0x000003FF, 1}, /*混合,zblock0~zblock9*/ +}; + +DPP_APT_HASH_BULK_RES_T bulk_res[] = { + /*funcid, bulkid, zcell_num, zreg_num, ddr_baddr, ddr_item_num, ddr_width_mode, ddr_crc_sel, ddr_ecc_en*/ + {0, 0, 19, 19, 0, 0, DDR_WIDTH_512b, 0, 0}, + {0, 1, 10, 10, 0, 0, DDR_WIDTH_512b, 0, 0}, + {0, 2, 0, 0, 0, 0, DDR_WIDTH_512b, 0, 0}, + {0, 3, 2, 2, 0, 0, DDR_WIDTH_512b, 0, 0}, + {0, 4, 2, 2, 0, 0, DDR_WIDTH_512b, 0, 0}, + {0, 5, 3, 3, 0, 0, DDR_WIDTH_512b, 0, 0}, + {0, 6, 2, 2, 0, 0, DDR_WIDTH_512b, 0, 0}, + {0, 7, 2, 2, 0, 0, DDR_WIDTH_512b, 0, 0}, +}; + +DPP_HASH_INIT_T g_hashTable = { + .func_num = sizeof(func_res) / sizeof(DPP_APT_HASH_FUNC_RES_T), + .func = func_res, + .bulk_num = sizeof(bulk_res) / sizeof(DPP_APT_HASH_BULK_RES_T), + .bulk = bulk_res, + .ser_num = sizeof(g_hashSdtTable) / sizeof(DPP_APT_HASH_TABLE_T), + .ser = g_hashSdtTable, +}; + +ZXIC_UINT32 dpp_apt_set_l2entry_data(ZXIC_VOID *pData, DPP_HASH_ENTRY *pEntry) +{ + ZXIC_UINT32 key = 0; + ZXIC_UINT32 rst = 0; + ZXDH_L2_ENTRY_T *pL2Entry = NULL; + + ZXIC_COMM_CHECK_POINT(pData); + ZXIC_COMM_CHECK_POINT(pEntry); + ZXIC_COMM_CHECK_POINT(pEntry->p_key); + ZXIC_COMM_CHECK_POINT(pEntry->p_rst); + + pL2Entry = (ZXDH_L2_ENTRY_T *)pData; + ZXIC_COMM_UINT32_WRITE_BITS(key, pL2Entry->key.rsv, 16, 16); + + zxic_comm_swap((ZXIC_UINT8 *)&key,sizeof(ZXIC_UINT32)); + ZXIC_COMM_MEMCPY(pEntry->p_key+1,&key,sizeof(ZXIC_UINT32)); + + ZXIC_COMM_MEMCPY(pEntry->p_key + 3, pL2Entry->key.dmac_addr, 6); + + ZXIC_COMM_UINT32_WRITE_BITS(rst, pL2Entry->entry.hit_flag, 31, 1); + ZXIC_COMM_UINT32_WRITE_BITS(rst, pL2Entry->entry.rsv, 11, 20); + ZXIC_COMM_UINT32_WRITE_BITS(rst, pL2Entry->entry.vqm_vfid, 0, 11); + + zxic_comm_swap((ZXIC_UINT8 *)&rst,sizeof(ZXIC_UINT32)); + ZXIC_COMM_MEMCPY(pEntry->p_rst,&rst,sizeof(ZXIC_UINT32)); + + return DPP_OK; +} + +ZXIC_UINT32 dpp_apt_get_l2entry_data(ZXIC_VOID *pData, DPP_HASH_ENTRY *pEntry) +{ + ZXDH_L2_ENTRY_T *pL2Entry = NULL; + + ZXIC_UINT32 key = 0; + + ZXIC_COMM_CHECK_POINT(pData); + ZXIC_COMM_CHECK_POINT(pEntry); + ZXIC_COMM_CHECK_POINT(pEntry->p_rst); + + pL2Entry = (ZXDH_L2_ENTRY_T *)pData; + + key = *(ZXIC_UINT32 *)(pEntry->p_key + 1); + zxic_comm_swap((ZXIC_UINT8 *)&key,sizeof(ZXIC_UINT32)); + ZXIC_COMM_UINT32_GET_BITS(pL2Entry->key.rsv, key, 16, 16); + + ZXIC_COMM_MEMCPY(pL2Entry->key.dmac_addr, pEntry->p_key + 3, 6); + + zxic_comm_swap(pEntry->p_rst, sizeof(ZXIC_UINT32)); + ZXIC_COMM_UINT32_GET_BITS(pL2Entry->entry.hit_flag, *(ZXIC_UINT32 *)pEntry->p_rst, 31, 1); + ZXIC_COMM_UINT32_GET_BITS(pL2Entry->entry.rsv, *(ZXIC_UINT32 *)pEntry->p_rst, 11, 20); + ZXIC_COMM_UINT32_GET_BITS(pL2Entry->entry.vqm_vfid, *(ZXIC_UINT32 *)pEntry->p_rst, 0, 11); + + return DPP_OK; +} + +ZXIC_UINT32 dpp_apt_set_mc_data(ZXIC_VOID *pData, DPP_HASH_ENTRY *pEntry) +{ + ZXIC_UINT32 key = 0; + ZXIC_UINT32 rst = 0; + + ZXDH_MC_T *mc_table = NULL; + + ZXIC_COMM_CHECK_POINT(pData); + ZXIC_COMM_CHECK_POINT(pEntry); + ZXIC_COMM_CHECK_POINT(pEntry->p_key); + ZXIC_COMM_CHECK_POINT(pEntry->p_rst); + + mc_table = (ZXDH_MC_T *)pData; + + ZXIC_COMM_UINT32_WRITE_BITS(key, mc_table->key.rsv, 18, 14); + ZXIC_COMM_UINT32_WRITE_BITS(key, mc_table->key.group_id, 16, 2); + + zxic_comm_swap((ZXIC_UINT8 *)&key, sizeof(ZXIC_UINT32)); + ZXIC_COMM_MEMCPY(pEntry->p_key + 1, &key, sizeof(ZXIC_UINT32)); + + ZXIC_COMM_MEMCPY(pEntry->p_key + 3, mc_table->key.mc_mac, 6); + + ZXIC_COMM_UINT32_WRITE_BITS(rst, mc_table->entry.hit_flag, 31, 1); + ZXIC_COMM_UINT32_WRITE_BITS(rst, mc_table->entry.mc_pf_enable, 30, 1); + ZXIC_COMM_UINT32_WRITE_BITS(rst, mc_table->entry.rsv1, 0, 30); + zxic_comm_swap((ZXIC_UINT8 *)&rst, sizeof(ZXIC_UINT32)); + ZXIC_COMM_MEMCPY(pEntry->p_rst, &rst, sizeof(ZXIC_UINT32)); + + ZXIC_COMM_UINT32_WRITE_BITS(rst, mc_table->entry.rsv2, 0, 32); + zxic_comm_swap((ZXIC_UINT8 *)&rst, sizeof(ZXIC_UINT32)); + ZXIC_COMM_MEMCPY(pEntry->p_rst + 4, &rst, sizeof(ZXIC_UINT32)); + + rst = mc_table->entry.mc_bitmap >> 32; + zxic_comm_swap((ZXIC_UINT8 *)&rst, sizeof(ZXIC_UINT32)); + ZXIC_COMM_MEMCPY(pEntry->p_rst + 8, &rst, sizeof(ZXIC_UINT32)); + + rst = mc_table->entry.mc_bitmap; + zxic_comm_swap((ZXIC_UINT8 *)&rst, sizeof(ZXIC_UINT32)); + ZXIC_COMM_MEMCPY(pEntry->p_rst + 12, &rst, sizeof(ZXIC_UINT32)); + + return DPP_OK; +} + +ZXIC_UINT32 dpp_apt_get_mc_data(ZXIC_VOID *pData, DPP_HASH_ENTRY *pEntry) +{ + ZXIC_UINT32 key = 0; + ZXIC_UINT32 rst = 0; + + ZXDH_MC_T *mc_table = NULL; + + ZXIC_COMM_CHECK_POINT(pData); + ZXIC_COMM_CHECK_POINT(pEntry); + ZXIC_COMM_CHECK_POINT(pEntry->p_key); + ZXIC_COMM_CHECK_POINT(pEntry->p_rst); + + mc_table = (ZXDH_MC_T *)pData; + + key = *(ZXIC_UINT32 *)(pEntry->p_key + 1); + zxic_comm_swap((ZXIC_UINT8 *)&key, sizeof(ZXIC_UINT32)); + ZXIC_COMM_UINT32_GET_BITS(mc_table->key.rsv, key, 18, 14); + ZXIC_COMM_UINT32_GET_BITS(mc_table->key.group_id, key, 16, 2); + + ZXIC_COMM_MEMCPY(mc_table->key.mc_mac, pEntry->p_key + 3, 6); + + zxic_comm_swap(pEntry->p_rst, sizeof(ZXIC_UINT32)); + ZXIC_COMM_UINT32_GET_BITS(mc_table->entry.hit_flag, *(ZXIC_UINT32 *)pEntry->p_rst, 31, 1); + ZXIC_COMM_UINT32_GET_BITS(mc_table->entry.mc_pf_enable, *(ZXIC_UINT32 *)pEntry->p_rst, 30, 1); + ZXIC_COMM_UINT32_GET_BITS(mc_table->entry.rsv1, *(ZXIC_UINT32 *)pEntry->p_rst, 0, 30); + + zxic_comm_swap(pEntry->p_rst + 4, sizeof(ZXIC_UINT32)); + ZXIC_COMM_UINT32_GET_BITS(mc_table->entry.rsv2, *(ZXIC_UINT32 *)(pEntry->p_rst + 4), 0, 32); + + zxic_comm_swap(pEntry->p_rst + 8, sizeof(ZXIC_UINT32)); + ZXIC_COMM_UINT32_GET_BITS(rst, *(ZXIC_UINT32 *)(pEntry->p_rst + 8), 0, 32); + mc_table->entry.mc_bitmap = (((ZXIC_UINT64)rst) << 32); + + zxic_comm_swap(pEntry->p_rst + 12, sizeof(ZXIC_UINT32)); + ZXIC_COMM_UINT32_GET_BITS(rst, *(ZXIC_UINT32 *)(pEntry->p_rst + 12), 24, 8); + mc_table->entry.mc_bitmap |= rst; + + return DPP_OK; +} + +DPP_STATUS dpp_apt_dtb_hash_table_unicast_mac_dump(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + ZXDH_L2_ENTRY_T *pHashDataArr, + ZXIC_UINT32 *p_entry_num) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 max_item_num = DTB_DUMP_UNICAST_MAC_DUMP_NUM; + ZXIC_UINT32 index = 0; + ZXIC_UINT32 entryNum = 0; + ZXIC_UINT8* pDumpData = NULL; + ZXIC_UINT8 *pKey = NULL; + ZXIC_UINT8 *pRst = NULL; + + ZXIC_UINT32 dma_size = 0; + ZXIC_UINT64 dma_phy_addr = 0; + ZXIC_UINT64 dma_vir_addr = 0; + + DPP_HASH_ENTRY *p_dump_hash_entry = NULL; + DPP_HASH_ENTRY *p_temp_entry = NULL; + DPP_SDTTBL_HASH_T sdt_hash_info = {0}; /*SDT内容*/ + SE_APT_CALLBACK_T *pAptCallback = NULL; + ZXDH_L2_ENTRY_T *p_l2_mac_entry = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(pHashDataArr); + ZXIC_COMM_CHECK_POINT(p_entry_num); + + //从sdt_no中获取SDT配置 + rc = dpp_soft_sdt_tbl_get(DEV_ID(dev), sdt_no, &sdt_hash_info); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_soft_sdt_tbl_get"); + + pAptCallback = dpp_apt_get_func(DEV_ID(dev), sdt_no); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), pAptCallback); + + //分配空间 + pDumpData = (ZXIC_UINT8 *)ZXIC_COMM_MALLOC(max_item_num * sizeof(DPP_HASH_ENTRY)); + ZXIC_COMM_CHECK_POINT_NO_ASSERT(pDumpData); + pKey = (ZXIC_UINT8 *)ZXIC_COMM_MALLOC(max_item_num * HASH_KEY_MAX); + ZXIC_COMM_CHECK_POINT_MEMORY_FREE_NO_ASSERT(pKey, pDumpData); + pRst = (ZXIC_UINT8 *)ZXIC_COMM_MALLOC(max_item_num * HASH_RST_MAX); + ZXIC_COMM_CHECK_POINT_MEMORY_FREE2PTR_NO_ASSERT(pRst, pKey, pDumpData); + + ZXIC_COMM_MEMSET(pDumpData, 0x0, max_item_num * sizeof(DPP_HASH_ENTRY)); + ZXIC_COMM_MEMSET(pKey, 0x0, max_item_num * HASH_KEY_MAX); + ZXIC_COMM_MEMSET(pRst, 0x0, max_item_num * HASH_RST_MAX); + + p_dump_hash_entry = (DPP_HASH_ENTRY *)pDumpData; + for(index = 0; index < max_item_num; index++) + { + p_temp_entry = p_dump_hash_entry + index; + p_temp_entry->p_key = pKey + index * HASH_KEY_MAX; + p_temp_entry->p_rst = pRst + index * HASH_RST_MAX; + } + + rc = dtb_sdt_dump_dma_alloc(dev, DTB_SDT_DUMP_SIZE, &dma_phy_addr, &dma_vir_addr); + ZXIC_COMM_CHECK_RC_MEMORY_FREE3PTR_NO_ASSERT(rc, "dtb_sdt_dump_dma_alloc", pRst, pKey, pDumpData); + + rc = dpp_dtb_dump_sdt_addr_set(dev, queue_id, sdt_no, dma_phy_addr, dma_vir_addr, DTB_SDT_DUMP_SIZE); + ZXIC_COMM_CHECK_RC_MEMORY_FREE3PTR_NO_ASSERT(rc, "dpp_dtb_dump_sdt_addr_set", pRst, pKey, pDumpData); + + rc = dpp_dtb_hash_table_only_zcam_dump(dev, queue_id, sdt_no, pDumpData, &entryNum); + + dpp_dtb_dump_sdt_addr_get(dev, queue_id, sdt_no, &dma_phy_addr, &dma_vir_addr, &dma_size); + dtb_sdt_dump_dma_release(dev, dma_size, dma_phy_addr, dma_vir_addr); + dpp_dtb_dump_sdt_addr_clear(dev, queue_id, sdt_no); + + if(rc != DPP_OK) + { + ZXIC_COMM_FREE(pKey); + ZXIC_COMM_FREE(pRst); + ZXIC_COMM_FREE(pDumpData); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_hash_table_only_zcam_dump"); + } + + ZXIC_COMM_TRACE_INFO("dpp_dtb_hash_table_only_zcam_dump unicast entry_num: %d\n", entryNum); + + for(index = 0; index < entryNum; index++) + { + p_temp_entry = p_dump_hash_entry + index; + p_l2_mac_entry = pHashDataArr + index; + // //打印数据 + dpp_dtb_data_print(p_temp_entry->p_key, DPP_GET_ACTU_KEY_BY_SIZE(sdt_hash_info.key_size) + 1); + dpp_dtb_data_print(p_temp_entry->p_rst, 4 * (0x1 << sdt_hash_info.rsp_mode)); + + rc = pAptCallback->se_func_info.hashFunc.hash_get_func(p_l2_mac_entry, p_temp_entry); + ZXIC_COMM_CHECK_DEV_RC_MEMORY_FREE3PTR_NO_ASSERT(DEV_ID(dev), rc, "hash_set_func", pRst, pKey, pDumpData); + } + + *p_entry_num = entryNum; + + ZXIC_COMM_FREE(pKey); + ZXIC_COMM_FREE(pRst); + ZXIC_COMM_FREE(pDumpData); + + return DPP_OK; +} + +DPP_STATUS dpp_apt_dtb_hash_table_multicast_mac_dump(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + ZXDH_MC_T *pHashDataArr, + ZXIC_UINT32 *p_entry_num) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 max_item_num = DTB_DUMP_MULTICAST_MAC_DUMP_NUM; + ZXIC_UINT32 index = 0; + ZXIC_UINT32 entryNum = 0; + ZXIC_UINT8* pDumpData = NULL; + ZXIC_UINT8 *pKey = NULL; + ZXIC_UINT8 *pRst = NULL; + + ZXIC_UINT32 dma_size = 0; + ZXIC_UINT64 dma_phy_addr = 0; + ZXIC_UINT64 dma_vir_addr = 0; + + DPP_HASH_ENTRY *p_dump_hash_entry = NULL; + DPP_HASH_ENTRY *p_temp_entry = NULL; + DPP_SDTTBL_HASH_T sdt_hash_info = {0}; /*SDT内容*/ + SE_APT_CALLBACK_T *pAptCallback = NULL; + ZXDH_MC_T *p_multicast_mac_data = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(pHashDataArr); + ZXIC_COMM_CHECK_POINT(p_entry_num); + + //从sdt_no中获取SDT配置 + rc = dpp_soft_sdt_tbl_get(DEV_ID(dev), sdt_no, &sdt_hash_info); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_soft_sdt_tbl_get"); + + pAptCallback = dpp_apt_get_func(DEV_ID(dev), sdt_no); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), pAptCallback); + + //分配空间 + pDumpData = (ZXIC_UINT8 *)ZXIC_COMM_MALLOC(max_item_num * sizeof(DPP_HASH_ENTRY)); + ZXIC_COMM_CHECK_POINT_NO_ASSERT(pDumpData); + pKey = (ZXIC_UINT8 *)ZXIC_COMM_MALLOC(max_item_num * HASH_KEY_MAX); + ZXIC_COMM_CHECK_POINT_MEMORY_FREE_NO_ASSERT(pKey, pDumpData); + pRst = (ZXIC_UINT8 *)ZXIC_COMM_MALLOC(max_item_num * HASH_RST_MAX); + ZXIC_COMM_CHECK_POINT_MEMORY_FREE2PTR_NO_ASSERT(pRst, pKey, pDumpData); + + ZXIC_COMM_MEMSET(pDumpData, 0x0, max_item_num * sizeof(DPP_HASH_ENTRY)); + ZXIC_COMM_MEMSET(pKey, 0x0, max_item_num * HASH_KEY_MAX); + ZXIC_COMM_MEMSET(pRst, 0x0, max_item_num * HASH_RST_MAX); + + p_dump_hash_entry = (DPP_HASH_ENTRY *)pDumpData; + for(index = 0; index < max_item_num; index++) + { + p_temp_entry = p_dump_hash_entry + index; + p_temp_entry->p_key = pKey + index * HASH_KEY_MAX; + p_temp_entry->p_rst = pRst + index * HASH_RST_MAX; + } + + rc = dtb_sdt_dump_dma_alloc(dev, DTB_SDT_DUMP_SIZE, &dma_phy_addr, &dma_vir_addr); + ZXIC_COMM_CHECK_RC_MEMORY_FREE3PTR_NO_ASSERT(rc, "dtb_sdt_dump_dma_alloc", pRst, pKey, pDumpData); + + rc = dpp_dtb_dump_sdt_addr_set(dev, queue_id, sdt_no, dma_phy_addr, dma_vir_addr, DTB_SDT_DUMP_SIZE); + ZXIC_COMM_CHECK_RC_MEMORY_FREE3PTR_NO_ASSERT(rc, "dpp_dtb_dump_sdt_addr_set", pRst, pKey, pDumpData); + + rc = dpp_dtb_hash_table_only_zcam_dump(dev, queue_id, sdt_no, pDumpData, &entryNum); + + dpp_dtb_dump_sdt_addr_get(dev, queue_id, sdt_no, &dma_phy_addr, &dma_vir_addr, &dma_size); + dtb_sdt_dump_dma_release(dev, dma_size, dma_phy_addr, dma_vir_addr); + dpp_dtb_dump_sdt_addr_clear(dev, queue_id, sdt_no); + + if(rc != DPP_OK) + { + ZXIC_COMM_FREE(pKey); + ZXIC_COMM_FREE(pRst); + ZXIC_COMM_FREE(pDumpData); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_hash_table_only_zcam_dump"); + } + ZXIC_COMM_TRACE_INFO("dpp_dtb_hash_table_only_zcam_dump multicast entry_num: %d\n", entryNum); + + for(index = 0; index < entryNum; index++) + { + p_temp_entry = p_dump_hash_entry + index; + p_multicast_mac_data = pHashDataArr + index; + // //打印数据 + dpp_dtb_data_print(p_temp_entry->p_key, DPP_GET_ACTU_KEY_BY_SIZE(sdt_hash_info.key_size) + 1); + dpp_dtb_data_print(p_temp_entry->p_rst, 4 * (0x1 << sdt_hash_info.rsp_mode)); + + rc = pAptCallback->se_func_info.hashFunc.hash_get_func(p_multicast_mac_data, p_temp_entry); + ZXIC_COMM_CHECK_DEV_RC_MEMORY_FREE3PTR_NO_ASSERT(DEV_ID(dev), rc, "hash_get_func", pRst, pKey, pDumpData); + } + + *p_entry_num = entryNum; + + ZXIC_COMM_FREE(pKey); + ZXIC_COMM_FREE(pRst); + ZXIC_COMM_FREE(pDumpData); + + return DPP_OK; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/driver/source/dpp_drv_init.c b/src/net/drivers/net/ethernet/dinghai/en_np/driver/source/dpp_drv_init.c new file mode 100644 index 0000000..af3057d --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/driver/source/dpp_drv_init.c @@ -0,0 +1,115 @@ +#include "dpp_apt_se_api.h" +#include "dpp_stat_api.h" +#include "dpp_drv_init.h" +#include "dpp_drv_acl.h" +#include "dpp_drv_hash.h" +#include "dpp_drv_eram.h" +#include "dpp_hash.h" +#include "dpp_apt_se.h" + +#define DPP_FLOW_INIT_START ((ZXIC_UINT32)(0)) +#define DPP_FLOW_INIT_SUCCESS ((ZXIC_UINT32)(1)) + +#define DPP_FLOW_INIT_STATUS_CHECK()\ + do{\ + if(DPP_FLOW_INIT_SUCCESS != dpp_flow_init_status)\ + {\ + return DPP_OK;\ + }\ + }while(0) + +#define DPP_FLOW_INIT_SUCCESS_STATUS_CHECK()\ + do{\ + if(DPP_FLOW_INIT_SUCCESS == dpp_flow_init_status)\ + {\ + return DPP_OK;\ + }\ + }while(0) + +ZXIC_UINT32 dpp_flow_init_status = DPP_FLOW_INIT_START; + +DPP_STATUS dpp_flow_init_status_set(ZXIC_UINT32 status) +{ + ZXIC_COMM_CHECK_INDEX(status, DPP_FLOW_INIT_START, DPP_FLOW_INIT_SUCCESS); + + dpp_flow_init_status = status; + + return DPP_OK; +} + +DPP_STATUS dpp_flow_init(DPP_DEV_T *dev) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(dev); + DPP_FLOW_INIT_SUCCESS_STATUS_CHECK(); + + ZXIC_COMM_PRINT("[%s] start.\n", __FUNCTION__); + + // hash init + rc = dpp_apt_hash_global_res_init(dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_hash_global_res_init"); + + rc = dpp_apt_hash_func_res_init(DEV_ID(dev), g_hashTable.func_num, g_hashTable.func); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_hash_func_res_init"); + + rc = dpp_apt_hash_bulk_res_init(DEV_ID(dev), g_hashTable.bulk_num, g_hashTable.bulk); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_hash_bulk_res_init"); + + // tbl-res must be initialized after fun-res and buld-res + rc = dpp_apt_hash_tbl_res_init(dev, g_hashTable.ser_num, g_hashTable.ser); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_hash_tbl_res_init"); + + // eram init + rc = dpp_apt_eram_res_init(dev, g_eRamTable.tbl_num, g_eRamTable.eram); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_eram_res_init"); + + // init acl + rc = dpp_apt_acl_res_init(dev, g_aclTable.tbl_num, g_aclTable.acl); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_acl_res_init"); + +#ifdef DPP_FLOW_HW_INIT + rc = dpp_stat_ppu_eram_baddr_set(dev, ZXDH_STAT_PPU_ERAM_BAADDR); + ZXIC_COMM_CHECK_RC(rc, "dpp_stat_ppu_eram_baddr_set"); + + rc = dpp_stat_ppu_eram_depth_set(dev, (ZXDH_STAT_PPU_ERAM_DEPTH / 2)); //表项深度以128bit为单位 + ZXIC_COMM_CHECK_RC(rc, "dpp_stat_ppu_eram_depth_set"); +#endif + + rc = dpp_flow_init_status_set(DPP_FLOW_INIT_SUCCESS); + ZXIC_COMM_CHECK_RC(rc, "dpp_flow_init_status_set"); + + ZXIC_COMM_PRINT("[%s] success.\n", __FUNCTION__); + + return DPP_OK; +} + +DPP_STATUS dpp_flow_uninit(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + + DPP_FLOW_INIT_STATUS_CHECK(); + + ZXIC_COMM_PRINT("[%s] start.\n", __FUNCTION__); + + rc = dpp_hash_soft_uninstall(dev_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_hash_soft_uninstall"); + + rc = dpp_acl_res_destroy(dev_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_acl_res_destroy"); + + ZXIC_COMM_PRINT("[%s] success.\n", __FUNCTION__); + + return DPP_OK; +} + +DPP_STATUS dpp_flow_data_all_flush(DPP_DEV_T *dev, ZXIC_UINT32 queue_id) +{ + DPP_STATUS rc = DPP_OK; + + rc = dpp_apt_hash_func_flush_hardware_all(dev, g_hashTable.func_num, g_hashTable.func, queue_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_apt_hash_func_flush_hardware"); + + return rc; +} + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/fc/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/fc/Kbuild.include new file mode 100644 index 0000000..e1fac1d --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/fc/Kbuild.include @@ -0,0 +1,4 @@ +cur_dir := en_np/fc/ +subdirs := source/ +src_files += +include $(foreach subdir, $(subdirs), $(dinghai_root)/$(cur_dir)$(subdir)/Kbuild.include) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/fc/include/dpp_drv_fc.h b/src/net/drivers/net/ethernet/dinghai/en_np/fc/include/dpp_drv_fc.h new file mode 100644 index 0000000..fd15607 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/fc/include/dpp_drv_fc.h @@ -0,0 +1,65 @@ +#ifndef _DPP_DRV_FC_H_ +#define _DPP_DRV_FC_H_ + +#include "zxic_common.h" +#include "dpp_pbu.h" +#include "dpp_pbu_api.h" +#include "dpp_drv_qos.h" + +/***********************************************************/ +/**对外接口 配置基于vport的端口指针阈值 +* @param vport_id--vport号 +* @param port_id 端口号 +* @param p_para 端口阈值 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_port_th_set(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 port_id, + DPP_PBU_PORT_TH_PARA_T *p_para); + +/***********************************************************/ +/** 读取端口的阈值 +* @param vport_id--vport号 +* @param port_id 端口号 +* @param p_para 端口阈值 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_port_th_get(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 port_id, + DPP_PBU_PORT_TH_PARA_T *p_para); + +/***********************************************************/ +/**对外接口 配置基于vport的端口指定端口按cos优先级起pfc流控的优先级流控指针阈值 +* @param vport_id--vport号 +* @param port_id 端口号 +* @param p_para cos阈值,要求高优先级的阈值不小于低优先级的阈值 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_port_cos_th_set(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 port_id, + DPP_PBU_PORT_COS_TH_PARA_T *p_para); + +/***********************************************************/ +/** 读取指定端口中各cos的优先级流控指针阈值,仅对lif0的48个通道有效 +* @param vport_id--vport号 +* @param port_id 端口号 +* @param p_para cos阈值,要求高优先级的阈值不小于低优先级的阈值 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_port_cos_th_get(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 port_id, + DPP_PBU_PORT_COS_TH_PARA_T *p_para); + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/fc/source/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/fc/source/Kbuild.include new file mode 100644 index 0000000..c97776c --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/fc/source/Kbuild.include @@ -0,0 +1,2 @@ +cur_dir := en_np/fc/source/ +src_files += $(addprefix $(cur_dir),$(notdir $(wildcard $(dinghai_root)/$(cur_dir)*.c))) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/fc/source/dpp_drv_fc.c b/src/net/drivers/net/ethernet/dinghai/en_np/fc/source/dpp_drv_fc.c new file mode 100755 index 0000000..31b10b3 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/fc/source/dpp_drv_fc.c @@ -0,0 +1,138 @@ +#include "dpp_drv_fc.h" + +/***********************************************************/ +/**对外接口 配置基于vport的端口指针阈值 +* @param vport_id--vport号 +* @param port_id 端口号 +* @param p_para 端口阈值 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_port_th_set(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 port_id, + DPP_PBU_PORT_TH_PARA_T *p_para) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, port_id, 0, DPP_TM_PP_NUM - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_para); + + ret = dpp_pbu_port_th_set(&dev, port_id, p_para); + ZXIC_COMM_CHECK_RC(ret, "dpp_pbu_port_th_set"); + + return ret; +} +EXPORT_SYMBOL(dpp_port_th_set); + +/***********************************************************/ +/** 读取端口的阈值 +* @param vport_id--vport号 +* @param port_id 端口号 +* @param p_para 端口阈值 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_port_th_get(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 port_id, + DPP_PBU_PORT_TH_PARA_T *p_para) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, port_id, 0, DPP_TM_PP_NUM - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_para); + + ret = dpp_pbu_port_th_get(&dev, port_id, p_para); + ZXIC_COMM_CHECK_RC(ret, "dpp_pbu_port_th_get"); + + return ret; +} +EXPORT_SYMBOL(dpp_port_th_get); + +/***********************************************************/ +/**对外接口 配置基于vport的端口指定端口按cos优先级起pfc流控的优先级流控指针阈值 +* @param vport_id--vport号 +* @param port_id 端口号 +* @param p_para cos阈值,要求高优先级的阈值不小于低优先级的阈值 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_port_cos_th_set(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 port_id, + DPP_PBU_PORT_COS_TH_PARA_T *p_para) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, port_id, 0, DPP_TM_PP_NUM - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_para); + + ret = dpp_pbu_port_cos_th_set(&dev, port_id, p_para); + ZXIC_COMM_CHECK_RC(ret, "dpp_pbu_port_cos_th_set"); + + return ret; +} +EXPORT_SYMBOL(dpp_port_cos_th_set); + +/***********************************************************/ +/** 读取指定端口中各cos的优先级流控指针阈值,仅对lif0的48个通道有效 +* @param vport_id--vport号 +* @param port_id 端口号 +* @param p_para cos阈值,要求高优先级的阈值不小于低优先级的阈值 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_port_cos_th_get(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 port_id, + DPP_PBU_PORT_COS_TH_PARA_T *p_para) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, port_id, 0, DPP_TM_PP_NUM - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_para); + + ret = dpp_pbu_port_cos_th_get(&dev, port_id, p_para); + ZXIC_COMM_CHECK_RC(ret, "dpp_pbu_port_cos_th_get"); + + return ret; +} +EXPORT_SYMBOL(dpp_port_cos_th_get); + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/init/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/init/Kbuild.include new file mode 100644 index 0000000..09f56ad --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/init/Kbuild.include @@ -0,0 +1,4 @@ +cur_dir := en_np/init/ +subdirs := source/ +src_files += +include $(foreach subdir, $(subdirs), $(dinghai_root)/$(cur_dir)$(subdir)/Kbuild.include) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/init/include/dpp_np_init.h b/src/net/drivers/net/ethernet/dinghai/en_np/init/include/dpp_np_init.h new file mode 100644 index 0000000..25f7eec --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/init/include/dpp_np_init.h @@ -0,0 +1,11 @@ +#ifndef _DPP_NP_INIT_H_ +#define _DPP_NP_INIT_H_ + +#include +#include "zxic_common.h" +#include "dpp_dev.h" + +ZXIC_UINT32 dpp_vport_register(DPP_PF_INFO_T* pf_info, struct pci_dev *p_dev); +ZXIC_UINT32 dpp_vport_unregister(DPP_PF_INFO_T* pf_info); + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/init/source/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/init/source/Kbuild.include new file mode 100644 index 0000000..7515849 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/init/source/Kbuild.include @@ -0,0 +1,2 @@ +cur_dir := en_np/init/source/ +src_files += $(addprefix $(cur_dir),$(notdir $(wildcard $(dinghai_root)/$(cur_dir)*.c))) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/init/source/dpp_np_init.c b/src/net/drivers/net/ethernet/dinghai/en_np/init/source/dpp_np_init.c new file mode 100644 index 0000000..4c47e5f --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/init/source/dpp_np_init.c @@ -0,0 +1,169 @@ +#include "zxic_common.h" +#include "dpp_np_init.h" +#include "dpp_dev.h" +#include "dpp_dtb.h" +#include "dpp_init.h" +#include "dpp_kernel_init.h" +#include "dpp_netlink.h" +#include "dpp_dtb_table_api.h" +#include "dpp_drv_init.h" +#include "dpp_tbl_comm.h" +#include "dpp_apt_se.h" +#include "dpp_cmd_init.h" +#include "dpp_agent_channel.h" +#include "dpp_hash.h" +#include "dpp_sdt_mgr.h" + +ZXIC_UINT32 dpp_vport_register(DPP_PF_INFO_T* pf_info, struct pci_dev *p_dev) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(pf_info); + ZXIC_COMM_CHECK_POINT(p_dev); + ZXIC_COMM_CHECK_INDEX_EQUAL_RETURN_OK(IS_PF(pf_info->vport), 0); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x register start.\n", __FUNCTION__, + pf_info->slot, pf_info->vport); + + rc = dpp_dev_pcie_channel_add(dev_id, pf_info, p_dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_pcie_channel_add"); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_init(&dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_init"); + +#ifdef DPP_FLOW_HW_INIT + rc = dpp_flow_init(&dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_flow_init"); +#endif + + rc = dpp_apt_dtb_res_init(&dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_res_init"); + + rc = dpp_vport_mgr_init(pf_info); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_mgr_init"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x register success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_vport_register); + +ZXIC_UINT32 dpp_vport_unregister(DPP_PF_INFO_T* pf_info) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(pf_info); + ZXIC_COMM_CHECK_INDEX_EQUAL_RETURN_OK(IS_PF(pf_info->vport), 0); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x unregister start.\n", __FUNCTION__, + pf_info->slot, pf_info->vport); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + rc = dpp_dtb_queue_release(&dev, "pf", queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_release"); + + rc = dpp_dtb_queue_dma_mem_release(&dev, queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_dma_mem_release"); + + rc = dpp_dev_pcie_channel_del(dev_id, pf_info); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_pcie_channel_del"); + + rc = dpp_vport_mgr_release(pf_info); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_mgr_release"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x unregister success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_vport_unregister); + +static DPP_SYS_INIT_CTRL_T g_np_sys_init = { + .device_type = DPP_DEV_TYPE_CHIP, + .flags = DPP_DEV_ACCESS_TYPE_PCIE << 0, +}; + +static int __init dpp_np_init(void) +{ + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 rc = DPP_OK; + +#ifndef DPP_FLOW_HW_INIT + DPP_DEV_T dev = {dev_id, {0, 0, 0, 0, 0}}; +#endif + + ZXIC_COMM_PRINT("[%s] start.\n", __FUNCTION__); + + rc = dpp_init(dev_id, &g_np_sys_init); + ZXIC_COMM_CHECK_RC(rc, "dpp_init"); + +#ifndef DPP_FLOW_HW_INIT + rc = dpp_flow_init(&dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_flow_init"); +#endif + + rc = dpp_agent_channel_init(); + ZXIC_COMM_CHECK_RC(rc, "dpp_agent_channel_init"); + + rc = dpp_netlink_init(); + ZXIC_COMM_CHECK_RC(rc, "dpp_netlink_init"); + + rc = dpp_cmd_init(); + ZXIC_COMM_CHECK_RC(rc, "dpp_cmd_init"); + + ZXIC_COMM_PRINT("[%s] success.\n", __FUNCTION__); + + return DPP_OK; +} + +ZXIC_UINT32 dpp_np_online_uninstall(void) +{ + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 rc = DPP_OK; + + rc = dpp_flow_uninit(dev_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_flow_uninit"); + + rc = dpp_dtb_mgr_destory_all(); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_mgr_destory"); + + rc = dpp_sdt_mgr_destroy(dev_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_sdt_mgr_destroy"); + + rc = dpp_dev_del(dev_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dev_del"); + + return DPP_OK; +} + +static void __exit dpp_np_exit(void) +{ + ZXIC_COMM_PRINT("[%s] start.\n", __FUNCTION__); + + dpp_netlink_exit(); + dpp_agent_channel_exit(); + dpp_np_online_uninstall(); + + ZXIC_COMM_PRINT("[%s] success.\n", __FUNCTION__); +} + +module_init(dpp_np_init); +module_exit(dpp_np_exit); + +MODULE_LICENSE("GPL"); diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/netlink/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/netlink/Kbuild.include new file mode 100644 index 0000000..70b1d52 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/netlink/Kbuild.include @@ -0,0 +1,4 @@ +cur_dir := en_np/netlink/ +subdirs := source/ +src_files += +include $(foreach subdir, $(subdirs), $(dinghai_root)/$(cur_dir)$(subdir)/Kbuild.include) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/netlink/include/dpp_netlink.h b/src/net/drivers/net/ethernet/dinghai/en_np/netlink/include/dpp_netlink.h new file mode 100644 index 0000000..8989efe --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/netlink/include/dpp_netlink.h @@ -0,0 +1,30 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_netlink.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : +* 完成日期 : 2014/01/27 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef DPP_NETLINK_H +#define DPP_NETLINK_H + +#include "zxic_common.h" +#include "dpp_type_api.h" + +ZXIC_SINT32 dpp_netlink_init(ZXIC_VOID); +ZXIC_VOID dpp_netlink_exit(ZXIC_VOID); +DPP_STATUS dpp_netlink_regist_msg_proc_fun(ZXIC_UINT32 id, ZXIC_VOID *ptr); + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/netlink/source/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/netlink/source/Kbuild.include new file mode 100644 index 0000000..2405820 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/netlink/source/Kbuild.include @@ -0,0 +1,2 @@ +cur_dir := en_np/netlink/source/ +src_files += $(addprefix $(cur_dir),$(notdir $(wildcard $(dinghai_root)/$(cur_dir)*.c))) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/netlink/source/dpp_netlink.c b/src/net/drivers/net/ethernet/dinghai/en_np/netlink/source/dpp_netlink.c new file mode 100644 index 0000000..78f77e4 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/netlink/source/dpp_netlink.c @@ -0,0 +1,205 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "dpp_netlink.h" + +#define DPP_NETLINK_PROTOCOL ((ZXIC_UINT32)(29)) +#define DPP_NETLINK_GROUP_ID ((ZXIC_UINT32)(1)) +#define DPP_NETLINK_MAX_PROC ((ZXIC_UINT32)(2048)) + +typedef DPP_STATUS (*DPP_NETLINK_PROC_PTR)(ZXIC_VOID *msg_body, ZXIC_UINT32 msg_len, ZXIC_VOID **resp, ZXIC_UINT32 *reps_len); + +static struct sock *dpp_netlink_sk; +static DPP_NETLINK_PROC_PTR dpp_netlink_proc_ptr[DPP_NETLINK_MAX_PROC] = {0}; + +static DPP_STATUS dpp_netlink_send_ack_msg(ZXIC_VOID *data, ZXIC_UINT32 len) +{ + struct sk_buff *skb = NULL; + struct nlmsghdr *nlh = NULL; + ZXIC_SINT32 rtn = DPP_OK; + + if (data == NULL) + { + ZXIC_COMM_PRINT("%s: data invalid.\n", __FUNCTION__); + return DPP_ERR; + } + + skb = alloc_skb(NLMSG_SPACE(len), GFP_KERNEL); + if (skb == NULL) + { + ZXIC_COMM_PRINT("%s: alloc_skb failed.\n", __FUNCTION__); + return DPP_ERR; + } + + nlh = nlmsg_put(skb, 0, 0, 0, len, 0); + if (nlh == NULL) + { + ZXIC_COMM_PRINT("%s: nlmsg_put failed.\n", __FUNCTION__); + return DPP_ERR; + } + + nlh->nlmsg_flags = NLM_F_ACK; + memcpy(NLMSG_DATA(nlh), data, len); + + rtn = nlmsg_multicast(dpp_netlink_sk, skb, 0, DPP_NETLINK_GROUP_ID, 0); + if (rtn < 0) + { + ZXIC_COMM_PRINT("%s: nlmsg_multicast failed, rtn %d.\n", __FUNCTION__, rtn); + return DPP_ERR; + } + return DPP_OK; +} + +static DPP_STATUS dpp_netlink_dispach_msg(struct nlmsghdr *nlh) +{ + ZXIC_UINT8 *data = NULL; + ZXIC_UINT32 id = 0; + ZXIC_UINT32 len = 0; + ZXIC_UINT8 *req = NULL; + ZXIC_VOID *resp = NULL; + ZXIC_UINT32 resp_len = 0; + ZXIC_UINT32 rtn = DPP_OK; + + DPP_NETLINK_PROC_PTR ptr = NULL; + + if (nlh == NULL) + { + ZXIC_COMM_PRINT("%s: nlh invalid.\n", __FUNCTION__); + return DPP_ERR; + } + + id = *(ZXIC_UINT32 *)NLMSG_DATA(nlh); + len = nlh->nlmsg_len - NLMSG_HDRLEN; + req = (ZXIC_UINT8 *)NLMSG_DATA(nlh); + if (id > (DPP_NETLINK_MAX_PROC - 1)) + { + ZXIC_COMM_PRINT("%s: id %u invalid.\n", __FUNCTION__, id); + return DPP_ERR; + } + + ptr = dpp_netlink_proc_ptr[id]; + if (ptr == NULL) + { + ZXIC_COMM_PRINT("%s: ptr invalid.\n", __FUNCTION__); + return DPP_ERR; + } + + rtn = ptr(req, len, &resp, &resp_len); + if (rtn != DPP_OK) + { + kfree(resp); + ZXIC_COMM_PRINT("%s: proc id %u failed.\n", __FUNCTION__, id); + return rtn; + } + + data = (ZXIC_UINT8 *)kmalloc(NLMSG_ALIGN(resp_len) + sizeof(ZXIC_UINT32), GFP_KERNEL); + if (data == NULL) + { + kfree(resp); + ZXIC_COMM_PRINT("%s: kmalloc failed.\n", __FUNCTION__); + return DPP_ERR; + } + memcpy(data, &rtn, sizeof(ZXIC_UINT32)); + + if (resp != NULL) + { + memcpy(data + sizeof(ZXIC_UINT32), resp, resp_len); + } + + dpp_netlink_send_ack_msg(data, NLMSG_ALIGN(resp_len) + sizeof(ZXIC_UINT32)); + + kfree(data); + kfree(resp); + + return DPP_OK; +} + +static ZXIC_VOID dpp_netlink_recv_msg(struct sk_buff *__skb) +{ + struct sk_buff *skb; + struct nlmsghdr *nlh; + ZXIC_UINT32 rtn = DPP_ERR; + + skb = skb_get(__skb); + if (skb == NULL) + { + ZXIC_COMM_PRINT("%s: get skb failed.\n", __FUNCTION__); + return; + } + + nlh = nlmsg_hdr(skb); + if ((nlh == NULL) || !NLMSG_OK(nlh, skb->len)) + { + kfree_skb(skb); + ZXIC_COMM_PRINT("%s: skb format invalid.\n", __FUNCTION__); + return; + } + + if ((nlh->nlmsg_flags & NLM_F_REQUEST) != 0) + { + if (dpp_netlink_dispach_msg(nlh) != DPP_OK) + { + dpp_netlink_send_ack_msg((ZXIC_UINT8 *)&rtn, sizeof(ZXIC_UINT32)); + ZXIC_COMM_PRINT("%s: dpp_netlink_dispach_msg failed.\n", __FUNCTION__); + } + kfree_skb(skb); + return; + } + + kfree_skb(skb); + ZXIC_COMM_PRINT("%s: nlmsg_flags 0x%04x invalid.\n", __FUNCTION__, nlh->nlmsg_flags); + return; +} + +DPP_STATUS dpp_netlink_regist_msg_proc_fun(ZXIC_UINT32 id, ZXIC_VOID *ptr) +{ + if (ptr == NULL) + { + ZXIC_COMM_PRINT("%s: ptr invalid.\n", __FUNCTION__); + return DPP_ERR; + } + if (id > (DPP_NETLINK_MAX_PROC - 1)) + { + ZXIC_COMM_PRINT("%s: id %u invalid.\n", __FUNCTION__, id); + return DPP_ERR; + } + dpp_netlink_proc_ptr[id] = ptr; + return DPP_OK; +} + +ZXIC_SINT32 dpp_netlink_init(ZXIC_VOID) +{ + struct netlink_kernel_cfg cfg = { + .input = dpp_netlink_recv_msg, + }; + + ZXIC_COMM_PRINT("[%s] start.\n", __FUNCTION__); + + // dpp_netlink_sk = netlink_kernel_create(get_net_ns_by_pid(1), DPP_NETLINK_PROTOCOL, &cfg); + dpp_netlink_sk = netlink_kernel_create(&init_net, DPP_NETLINK_PROTOCOL, &cfg); + if (!dpp_netlink_sk) + { + ZXIC_COMM_PRINT("%s: create socket failed.\n", __FUNCTION__); + return DPP_ERR; + } + + ZXIC_COMM_PRINT("[%s] success.\n", __FUNCTION__); + + return DPP_OK; +} + +ZXIC_VOID dpp_netlink_exit(ZXIC_VOID) +{ + ZXIC_COMM_PRINT("[%s] start.\n", __FUNCTION__); + netlink_kernel_release(dpp_netlink_sk); + ZXIC_COMM_PRINT("[%s] success.\n", __FUNCTION__); +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/qos/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/qos/Kbuild.include new file mode 100644 index 0000000..2e54261 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/qos/Kbuild.include @@ -0,0 +1,4 @@ +cur_dir := en_np/qos/ +subdirs := source/ +src_files += +include $(foreach subdir, $(subdirs), $(dinghai_root)/$(cur_dir)$(subdir)/Kbuild.include) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/qos/include/dpp_drv_qos.h b/src/net/drivers/net/ethernet/dinghai/en_np/qos/include/dpp_drv_qos.h new file mode 100644 index 0000000..8916bb0 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/qos/include/dpp_drv_qos.h @@ -0,0 +1,568 @@ +/************************************************************** +* TM调度器资源分配如下 +* FQ +*fq_num: 1280 : 0, 1, 2 ... 0x4ff +*fq2_num: 1024 : 0x500, 0x502, 0x504 ... 0xcfe +*fq4_num: 1024 : 0xd00, 0xd04, 0xd08 ... 0x1cfc +*fq8_num: 1120 : 0x1d00, 0x1d08, 0x1d10 ... 0x3ff8 +* SP-WFQ +*sp_num: 128 : 0x4000, 0x4001, 0x4002 ... 0x407f +*wfq_num: 2048 : 0x4080, 0x4081, 0x4082 ... 0x487f +*wfq2_num: 256 : 0x4880, 0x4882, 0x4884 ... 0x4a7e +*wfq4_num: 256 : 0x4a80, 0x4a84, 0x4a88 ... 0x4e7c +*wfq8_num: 688 : 0x4e80, 0x4e88, 0x4e90 ... 0x63f8 +* +*队列资源分配如下 +*flow id 0~0xf 预留 0队列用于MR复制队列, 0x10~0xfff 通用队列 + +* PLCR profileid资源分配如下 +* 一级CAR +* flowid:32K, profileid:512 +* 一级CAR +* flowid:4K, profileid:128 +* 一级CAR +* flowid:1K, profileid:32 +***************************************************************/ +#ifndef _DPP_DRV_QOS_H_ +#define _DPP_DRV_QOS_H_ + +#include "zxic_common.h" +#include "dpp_tm.h" +#include "dpp_tm_api.h" +#include "dpp_stat_car.h" +#include "dpp_stat_api.h" +#include "dpp_agent_channel.h" + +/****************************************************************************** + * 宏定义 * + *****************************************************************************/ +#define DPP_VPORT_NUM_MAX (0x7fff) +#define DPP_CRDT_LEVEL_MAX (7) +#define DPP_SCHE_TYPE_MAX (10) + +#define DPP_TM_PORT_WIDTH (56) +#define DPP_TM_VPORT_WIDTH (32) +#define DPP_TM_LEVEL_WIDTH (28) +#define DPP_TM_TYPE_WIDTH (24) + +#define G_SCH_ID_LEN (8) + +#define CAR_TYPE_MAX (4) + +#define G_PROFILE_ID_LEN (8) + +/* Get Real port */ +#define DPP_TM_CRDT_PP_PORT_GET(_gsch_id, _pp_port) \ + ((_pp_port) = ((_gsch_id >> DPP_TM_PORT_WIDTH) & 0xffff)) + +/* Get Real vport */ +#define DPP_TM_CRDT_VPORT_GET(_gsch_id, _vport) \ + ((_vport) = ((_gsch_id >> DPP_TM_VPORT_WIDTH) & 0xffff)) + +/* Get Real level */ +#define DPP_TM_CRDT_LEVEL_GET(_gsch_id,_sche_level) \ + ((_sche_level) = ((_gsch_id >> DPP_TM_LEVEL_WIDTH) & 0xf)) + +/* Get Real type */ +#define DPP_TM_CRDT_TYPE_GET(_gsch_id,_sche_type) \ + ((_sche_type) = ((_gsch_id >> DPP_TM_TYPE_WIDTH) & 0xf)) + +/* Get Real se_id */ +#define DPP_TM_CRDT_SE_ID_GET(_gsch_id,_se_id) \ + ((_se_id) = ((_gsch_id & 0xffff))) + +/* Get Real profile */ +#define DPP_CAR_PROFILE_ID_GET(_profile_id,_profileid) \ + ((_profileid) = ((_profile_id & 0xffff))) + +/****************************************************************************** + * 类型定义 * + *****************************************************************************/ + +/****************************************************************************** + * 接口定义 * + *****************************************************************************/ +/***********************************************************/ +/**对外接口 TM资源申请 +* @param vport_id--vport号 +* @param pp_port--端口0~9 +* @param numq--申请id个数 1 +* @param level--挂接层级 +* @param flags--se_id类型 +* @param gsch_id--调度单元号 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_cosq_gsch_id_add(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 pp_port, + ZXIC_UINT32 numq, + ZXIC_UINT32 level, + ZXIC_UINT32 flags, + ZXIC_UINT64 *p_gsch_id); + +/***********************************************************/ +/**对外接口 TM资源释放 +* @param vport_id--vport号 +* @param pp_port--端口0~9 +* @param gsch_id--调度单元号 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_cosq_gsch_id_delete(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 pp_port, + ZXIC_UINT64 gsch_id); + +/***********************************************************/ +/**对外接口 读取TM根节点 +* @param vport_id--vport号 +* @param pp_port--端口0~9 +* @param gsch_id--调度单元号 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_sch_base_node_get(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 pp_port, + ZXIC_UINT64 *gsch_id); + +/***********************************************************/ +/**对外接口 配置se->pp->dev挂接关系 +* @param vport_id--vport号 +* @param se_id--调度器号 +* @param pp_id-端口号 +* @param weight-权重1 +* @param sp_mapping-优先级0-7 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_crdt_se_pp_link_set(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 se_id, + ZXIC_UINT32 pp_id, + ZXIC_UINT32 weight, + ZXIC_UINT32 sp_mapping); + +/***********************************************************/ +/**对外接口 配置se->se层次化挂接关系 +* @param vport_id--vport号 +* @param se_id--调度器号 +* @param se_linkid--上级调度器号 +* @param se_weight -权重 +* @param se_sp-优先级0-7 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_crdt_se_link_set(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 se_id, + ZXIC_UINT32 se_linkid, + ZXIC_UINT32 se_weight, + ZXIC_UINT32 se_sp); + +/***********************************************************/ +/**对外接口 配置flow级流队列挂接关系 +* @param vport_id--vport号 +* @param flow_id--0~4095 +* @param c_linkid--c桶se_id +* @param c_weight--c桶权重 +* @param c_sp--c桶优先级 +* @param mode--0-单桶 1-双桶 +* @param e_linkid--e桶se_id +* @param e_weight--e桶权重 +* @param e_sp--e桶优先级 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_crdt_flow_link_set(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 c_linkid, + ZXIC_UINT32 c_weight, + ZXIC_UINT32 c_sp, + ZXIC_UINT32 mode, + ZXIC_UINT32 e_linkid, + ZXIC_UINT32 e_weight, + ZXIC_UINT32 e_sp); + +/***********************************************************/ +/**对外接口 删除flow级流队列挂接关系 +* @param vport_id--vport号 +* @param id_s--起始flowid +* @param id_e--终止flowid +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_crdt_del_flow_link_set(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 id_s, + ZXIC_UINT32 id_e); + +/***********************************************************/ +/**对外接口 删除调度器挂接关系 +* @param vport_id--vport号 +* @param id_s--起始seid +* @param id_e--终止seid +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_crdt_del_se_link_set(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 id_s, + ZXIC_UINT32 id_e); + +/***********************************************************/ +/**对外接口 配置端口级整形 +* @param vport_id--vport号 +* @param pp_port--端口0~9 +* @param cir 单位Kb +* @param cbs 单位KB +* @param c_en c桶使能 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_port_shape_set(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 pp_port, + ZXIC_UINT32 cir, + ZXIC_UINT32 cbs, + ZXIC_UINT32 c_en); + +/***********************************************************/ +/**对外接口 读取端口级整形 +* @param vport_id--vport号 +* @param pp_port--端口0~9 +* @param p_para 整形信息:cir/cbs/en +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_port_shape_get(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 pp_port, + DPP_TM_SHAPE_PP_PARA_T *p_para); + +/***********************************************************/ +/**对外接口 配置调度器整形 +* @param vport_id vport号 +* @param se_id 调度器编号号 +* @param pir pir总速率,单位Kb,范围同cir +* @param pbs pbs总桶深,单位KB,范围同cbs +* @param db_en 整形模式,0-单桶,1-双桶,仅FQ8/WFQ8有效 +* @param cir 调度器cir速率,单位Kb +* @param cbs 调度器cbs桶深,单位KB +* 注:cbs=0 表示关闭整形,即不限速 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_se_shape_set(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 se_id, + ZXIC_UINT32 pir, + ZXIC_UINT32 pbs, + ZXIC_UINT32 db_en, + ZXIC_UINT32 cir, + ZXIC_UINT32 cbs); + +/***********************************************************/ +/**对外接口 配置flow整形 +* @param vport_id vport号 +* @param flow_id 流队列号 +* @param cir cir速率,单位Kb +* @param cbs cbs桶深,单位KB +* 注:cbs=0 表示关闭整形,即不限速 +* @param db_en 双桶整形使能,0-单桶,1-双桶 +* @param eir eir速率,单位Kb +* @param ebs ebs桶深,单位KB +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_flow_shape_set(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 cir, + ZXIC_UINT32 cbs, + ZXIC_UINT32 db_en, + ZXIC_UINT32 eir, + ZXIC_UINT32 ebs); + +/***********************************************************/ +/**对外接口 配置流队列挂接到端口号 +* @param vport_id vport号 +* @param flow_id 流队列号 +* @param port 端口0~9 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_flow_map_port_set(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 port); + +/***********************************************************/ +/**对外接口 读取流队列挂接的端口号 +* @param vport_id vport号 +* @param flowid 流队列号 +* @param port 端口0~9 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_flow_map_port_get(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 *p_port); + +/***********************************************************/ +/**对外接口 配置TD门限值 +* @param vport_id vport号 +* @param flow_id 流队列号 +* @param td_th 配置的丢弃门限值 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_flow_td_th_set(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 td_th); + +/***********************************************************/ +/**对外接口 读取TD门限值 +* @param vport_id vport号 +* @param flow_id 流队列号 +* @param p_td_th 配置的丢弃门限值 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_flow_td_th_get(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 *p_td_th); + +/***********************************************************/ +/**对外接口 设置block值 +* @param vport_id vport号 +* @param size 配置block值 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_blk_size_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 size); + +/***********************************************************/ +/**对外接口 配置全局pfc使能状态 +* @param vport_id vport号 +* @param pfc_en 使能开关 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_qmu_pfc_en_set(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 pfc_en); + +/***********************************************************/ +/**对外接口 读取全局pfc使能状态 +* @param vport_id vport号 +* @param p_pfc_en 使能开关 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_qmu_pfc_en_get(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 *p_pfc_en); + +/***********************************************************/ +/**对外接口 配置物理端口pfc使能状态 +* @param vport_id vport号 +* @param port_id 端口0~9 +* @param port_en 使能开关 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_qmu_port_pfc_set(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 port_id, + ZXIC_UINT32 port_en); + +/***********************************************************/ +/**对外接口 读取物理端口pfc使能状态 +* @param vport_id vport号 +* @param port_id 端口0~9 +* @param p_port_en 使能开关 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_qmu_port_pfc_get(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 port_id, + ZXIC_UINT32 *p_port_en); + + +/***********************************************************/ +/**对外接口 申请profile_id资源 +* @param vport_id vport号 +* @param numq 申请id个数 1 +* @param flags car类型 +* @param profile_id 限速模版号 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_car_profile_id_add(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 flags, + ZXIC_UINT64 *profile_id); + +/***********************************************************/ +/**对外接口 释放profile_id资源 +* @param vport_id vport号 +* @param flags car类型 +* @param profile_id 限速模版号 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_car_profile_id_delete(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 flags, + ZXIC_UINT64 profile_id); + +/***********************************************************/ +/**对外接口 配置flow_id和profile_id的绑定关系,并配置限速模板使能 +* @param vport_id vport号 +* @param car_type car模式 +* @param flow_id 队列号 +* @param drop_flag 丢弃标志 +* @param plcr_en 限速使能 +* @param profile_id 模板编号 +* +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_car_queue_cfg_set(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 car_type, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 drop_flag, + ZXIC_UINT32 plcr_en, + ZXIC_UINT32 profile_id); + +/***********************************************************/ +/**对外接口 查询flow_id和profile_id的绑定关系 +* @param vport_id vport号 +* @param car_type car模式 +* @param flow_id 队列号 +* @param p_drop_flag 丢弃标志 +* @param p_plcr_en 限速使能 +* @param p_profile_id 模板编号 +* +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_car_queue_cfg_get(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 car_type, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 *p_drop_flag, + ZXIC_UINT32 *p_plcr_en, + ZXIC_UINT32 *p_profile_id); + +/***********************************************************/ +/**对外接口 配置profile_id限速模版 +* @param vport_id vport号 +* @param car_type car模式 +* @param pkt_sign 限速模式0-字节;1-包 +* @param profile_id 模板编号 +* @param p_car_profile_cfg 限速参数 +* +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_car_profile_cfg_set(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 car_type, + ZXIC_UINT32 pkt_sign, + ZXIC_UINT32 profile_id, + ZXIC_VOID* p_car_profile_cfg); + +/***********************************************************/ +/**对外接口 查询profile_id限速模版参数 +* @param vport_id vport号 +* @param car_type car模式 +* @param pkt_sign 限速模式0-字节;1-包 +* @param profile_id 模板编号 +* @param p_car_profile_cfg 限速参数 +* +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_car_profile_cfg_get(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 car_type, + ZXIC_UINT32 pkt_sign, + ZXIC_UINT32 profile_id, + ZXIC_VOID* p_car_profile_cfg); + +/***********************************************************/ +/**对外接口 配置队列映射关系 +* @param dev_id 设备号 +* @param car_type car模式类型,参见STAT_CAR_TYPE_E +* @param flow_id 队列号 +* @param map_flow_id 映射队列号 +* @param map_sp 映射sp +* +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_car_queue_map_set(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 car_type, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 map_flow_id, + ZXIC_UINT32 map_sp); + +/***********************************************************/ +/**对外接口 配置队列映射关系 +* @param dev_id 设备号 +* @param car_type car模式类型,参见STAT_CAR_TYPE_E +* @param flow_id 队列号 +* @param map_flow_id 映射队列号 +* @param map_sp 映射sp +* +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_car_queue_map_get(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 car_type, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 *p_map_flow_id, + ZXIC_UINT32 *p_map_sp); + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/qos/source/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/qos/source/Kbuild.include new file mode 100644 index 0000000..80d2a08 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/qos/source/Kbuild.include @@ -0,0 +1,2 @@ +cur_dir := en_np/qos/source/ +src_files += $(addprefix $(cur_dir),$(notdir $(wildcard $(dinghai_root)/$(cur_dir)*.c))) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/qos/source/dpp_drv_qos.c b/src/net/drivers/net/ethernet/dinghai/en_np/qos/source/dpp_drv_qos.c new file mode 100644 index 0000000..3ee97d6 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/qos/source/dpp_drv_qos.c @@ -0,0 +1,1100 @@ +/************************************************************** + * 文件名称 : dpp_drv_qos.c + * 文件标识 : + * 内容摘要 : QOS出口调度树资源维护 + * 其它说明 : + * 当前版本 : 1.0 + * 作 者 : sun + * 完成日期 : + ***************************************************************/ + +/****************************************************************************** + * 头文件 * + *****************************************************************************/ +#include "dpp_drv_qos.h" + +/***********************************************************/ +/**对外接口 TM资源申请 + * @param vport_id--vport号 + * @param pp_port--端口0~9 + * @param numq--申请id个数 1 + * @param level--挂接层级 + * @param flags--se_id类型 + * @param gsch_id--调度单元号 + * @return + * @remark 无 + * @see + * @author sun @date 2023/11/17 + ************************************************************/ +DPP_STATUS dpp_cosq_gsch_id_add(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 pp_port, ZXIC_UINT32 numq, ZXIC_UINT32 level, + ZXIC_UINT32 flags, ZXIC_UINT64 *p_gsch_id) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 num = 0; + ZXIC_UINT32 *gsch_id = ZXIC_NULL; + ZXIC_UINT32 gsch_id_h = 0; + ZXIC_UINT32 gsch_id_l = 0; + ZXIC_UINT64 temp_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + gsch_id = (ZXIC_UINT32 *)kmalloc(G_SCH_ID_LEN, GFP_KERNEL); + ZXIC_COMM_CHECK_POINT(gsch_id); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC_MEMORY_FREE(ret, "dpp_dev_get", gsch_id); + + ZXIC_COMM_CHECK_DEV_INDEX_MEMORY_FREE_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX, gsch_id); + ZXIC_COMM_CHECK_DEV_INDEX_MEMORY_FREE_NO_ASSERT(dev_id, pp_port, 0, DPP_TM_PP_NUM - 1, gsch_id); + ZXIC_COMM_CHECK_DEV_INDEX_MEMORY_FREE_NO_ASSERT(dev_id, level, 0, DPP_CRDT_LEVEL_MAX, gsch_id); + ZXIC_COMM_CHECK_DEV_INDEX_MEMORY_FREE_NO_ASSERT(dev_id, flags, 0, DPP_SCHE_TYPE_MAX, gsch_id); + num = ((flags == FLOW_SCHE) ? numq : 1); + + ret = dpp_agent_channel_tm_seid_request(&dev, pp_port, pf_info->vport, level, flags, num, gsch_id); + ZXIC_COMM_CHECK_RC_MEMORY_FREE(ret, "dpp_agent_channel_tm_seid_request", gsch_id); + + gsch_id_h = *(gsch_id + 1); + gsch_id_l = *gsch_id; + + temp_id = ((ZXIC_UINT64)gsch_id_h) << 32 | ((ZXIC_UINT64)gsch_id_l); + + if (DPP_OK != (ZXIC_UINT32)(temp_id >> 56)) + { + kfree(gsch_id); + return DPP_ERR; + } + + *p_gsch_id = temp_id; + kfree(gsch_id); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_cosq_gsch_id_add); + +/***********************************************************/ +/**对外接口 TM资源释放 + * @param vport_id--vport号 + * @param pp_port--端口0~9 + * @param gsch_id--调度单元号 + * @return + * @remark 无 + * @see + * @author sun @date 2023/11/17 + ************************************************************/ +DPP_STATUS dpp_cosq_gsch_id_delete(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 pp_port, ZXIC_UINT64 gsch_id) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 sche_level = 0; + ZXIC_UINT32 sche_type = 0; + ZXIC_UINT32 num = 1; + ZXIC_UINT32 se_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pp_port, 0, DPP_TM_PP_NUM - 1); + + DPP_TM_CRDT_LEVEL_GET(gsch_id, sche_level); + DPP_TM_CRDT_TYPE_GET(gsch_id, sche_type); + DPP_TM_CRDT_SE_ID_GET(gsch_id, se_id); + + ret = dpp_agent_channel_tm_seid_release(&dev, pp_port, pf_info->vport, sche_level, sche_type, num, se_id); + ZXIC_COMM_CHECK_RC(ret, "dpp_agent_channel_tm_seid_release"); + + // if (DPP_OK != ret) + // { + // return DPP_ERR; + // } + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_cosq_gsch_id_delete); + +/***********************************************************/ +/**对外接口 读取TM根节点 + * @param vport_id--vport号 + * @param pp_port--端口0~9 + * @param gsch_id--调度单元号 + * @return + * @remark 无 + * @see + * @author sun @date 2023/11/17 + ************************************************************/ +DPP_STATUS dpp_sch_base_node_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 pp_port, ZXIC_UINT64 *p_gsch_id) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 *gsch_id = ZXIC_NULL; + ZXIC_UINT32 gsch_id_h = 0; + ZXIC_UINT32 gsch_id_l = 0; + ZXIC_UINT64 temp_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + gsch_id = (ZXIC_UINT32 *)kmalloc(G_SCH_ID_LEN, GFP_KERNEL); + ZXIC_COMM_CHECK_POINT(gsch_id); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC_MEMORY_FREE(ret, "dpp_dev_get", gsch_id); + + ZXIC_COMM_CHECK_DEV_INDEX_MEMORY_FREE_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX, gsch_id); + ZXIC_COMM_CHECK_DEV_INDEX_MEMORY_FREE_NO_ASSERT(dev_id, pp_port, 0, DPP_TM_PP_NUM - 1, gsch_id); + + ret = dpp_agent_channel_tm_base_node_get(&dev, pp_port, pf_info->vport, gsch_id); + ZXIC_COMM_CHECK_RC_MEMORY_FREE(ret, "dpp_agent_channel_tm_base_node_get", gsch_id); + + gsch_id_h = *(gsch_id + 1); + gsch_id_l = *gsch_id; + + temp_id = ((ZXIC_UINT64)gsch_id_h) << 32 | ((ZXIC_UINT64)gsch_id_l); + if (DPP_OK != (ZXIC_UINT32)(temp_id >> 56)) + { + kfree(gsch_id); + return DPP_ERR; + } + + *p_gsch_id = temp_id; + kfree(gsch_id); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_sch_base_node_get); + +/***********************************************************/ +/**对外接口 配置se->pp->dev挂接关系 + * @param vport_id--vport号 + * @param se_id--调度器号 + * @param pp_id-端口号 + * @param weight-权重1 + * @param sp_mapping-优先级0-7 + * @return + * @remark 无 + * @see + * @author sun @date 2023/11/17 + ************************************************************/ +DPP_STATUS dpp_crdt_se_pp_link_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 se_id, ZXIC_UINT32 pp_id, ZXIC_UINT32 weight, + ZXIC_UINT32 sp_mapping) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, se_id, 0, DPP_ETM_FQSPWFQ_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pp_id, 0, DPP_TM_PP_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, weight, 0, DPP_TM_SCH_WEIGHT_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, sp_mapping, DPP_TM_SCH_SP_0, DPP_TM_SCH_SP_8); + + ret = dpp_tm_crdt_se_pp_link_set(&dev, se_id, pp_id, weight, sp_mapping); + ZXIC_COMM_CHECK_RC(ret, "dpp_tm_crdt_se_pp_link_set"); + + return ret; +} +EXPORT_SYMBOL(dpp_crdt_se_pp_link_set); + +/***********************************************************/ +/**对外接口 配置se->se层次化挂接关系 + * @param vport_id--vport号 + * @param se_id--调度器号 + * @param se_linkid--上级调度器号 + * @param se_weight -权重 + * @param se_sp-优先级0-7 + * @return + * @remark 无 + * @see + * @author sun @date 2023/11/17 + ************************************************************/ +DPP_STATUS dpp_crdt_se_link_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 se_id, ZXIC_UINT32 se_linkid, ZXIC_UINT32 se_weight, + ZXIC_UINT32 se_sp) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, se_id, 0, DPP_ETM_FQSPWFQ_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, se_linkid, 0, DPP_ETM_FQSPWFQ_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, se_weight, 0, DPP_TM_SCH_WEIGHT_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, se_sp, DPP_TM_SCH_SP_0, DPP_TM_SCH_SP_8); + + ret = dpp_tm_crdt_se_link_set(&dev, se_id, se_linkid, se_weight, se_sp); + ZXIC_COMM_CHECK_RC(ret, "dpp_tm_crdt_se_link_set"); + + return ret; +} +EXPORT_SYMBOL(dpp_crdt_se_link_set); + +/***********************************************************/ +/**对外接口 配置flow级流队列挂接关系 + * @param vport_id--vport号 + * @param flow_id--0~4095 + * @param c_linkid--c桶se_id + * @param c_weight--c桶权重 + * @param c_sp--c桶优先级 + * @param mode--0-单桶 1-双桶 + * @param e_linkid--e桶se_id + * @param e_weight--e桶权重 + * @param e_sp--e桶优先级 + * @return + * @remark 无 + * @see + * @author sun @date 2023/11/17 + ************************************************************/ +DPP_STATUS dpp_crdt_flow_link_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 flow_id, ZXIC_UINT32 c_linkid, ZXIC_UINT32 c_weight, + ZXIC_UINT32 c_sp, ZXIC_UINT32 mode, ZXIC_UINT32 e_linkid, ZXIC_UINT32 e_weight, + ZXIC_UINT32 e_sp) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + + ret = dpp_tm_crdt_flow_link_set(&dev, flow_id, c_linkid, c_weight, c_sp, mode, e_linkid, e_weight, e_sp); + ZXIC_COMM_CHECK_RC(ret, "dpp_tm_crdt_flow_link_set"); + + return ret; +} +EXPORT_SYMBOL(dpp_crdt_flow_link_set); + +/***********************************************************/ +/**对外接口 删除flow级流队列挂接关系 + * @param vport_id--vport号 + * @param id_s--起始flowid + * @param id_e--终止flowid + * @return + * @remark 无 + * @see + * @author sun @date 2023/11/17 + ************************************************************/ +DPP_STATUS dpp_crdt_del_flow_link_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 id_s, ZXIC_UINT32 id_e) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, id_s, 0, DPP_ETM_CRDT_NUM); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, id_e, 0, DPP_ETM_CRDT_NUM); + + ret = dpp_tm_crdt_del_flow_link_set(&dev, id_s, id_e); + ZXIC_COMM_CHECK_RC(ret, "dpp_tm_crdt_del_flow_link_set"); + + return ret; +} +EXPORT_SYMBOL(dpp_crdt_del_flow_link_set); + +/***********************************************************/ +/**对外接口 删除调度器挂接关系 + * @param vport_id--vport号 + * @param id_s--起始seid + * @param id_e--终止seid + * @return + * @remark 无 + * @see + * @author sun @date 2023/11/17 + ************************************************************/ +DPP_STATUS dpp_crdt_del_se_link_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 id_s, ZXIC_UINT32 id_e) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, id_s, 0, DPP_ETM_FQSPWFQ_NUM); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, id_e, 0, DPP_ETM_FQSPWFQ_NUM); + + ret = dpp_tm_crdt_del_se_link_set(&dev, id_s, id_e); + ZXIC_COMM_CHECK_RC(ret, "dpp_tm_crdt_del_se_link_set"); + + return ret; +} +EXPORT_SYMBOL(dpp_crdt_del_se_link_set); + +/***********************************************************/ +/**对外接口 配置端口级整形 + * @param vport_id--vport号 + * @param pp_port--端口0~9 + * @param cir 单位Kb + * @param cbs 单位KB + * @param c_en c桶使能 + * @return + * @remark 无 + * @see + * @author sun @date 2023/11/17 + ************************************************************/ +DPP_STATUS dpp_port_shape_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 pp_port, ZXIC_UINT32 cir, ZXIC_UINT32 cbs, + ZXIC_UINT32 c_en) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pp_port, 0, DPP_TM_PP_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, c_en, 0, 1); + + ret = dpp_tm_shape_pp_para_wr(&dev, pp_port, cir, cbs, c_en); + ZXIC_COMM_CHECK_RC(ret, "dpp_tm_shape_pp_para_wr"); + + return ret; +} +EXPORT_SYMBOL(dpp_port_shape_set); + +/***********************************************************/ +/**对外接口 读取端口级整形 + * @param vport_id--vport号 + * @param pp_port--端口0~9 + * @param p_para 整形信息:cir/cbs/en + * @return + * @remark 无 + * @see + * @author sun @date 2023/11/17 + ************************************************************/ +DPP_STATUS dpp_port_shape_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 pp_port, DPP_TM_SHAPE_PP_PARA_T *p_para) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + DPP_TM_SHAPE_PP_PARA_T pp_shap_para = {0}; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pp_port, 0, DPP_TM_PP_NUM - 1); + + ret = dpp_tm_shape_pp_para_get(&dev, pp_port, &pp_shap_para); + ZXIC_COMM_CHECK_RC(ret, "dpp_tm_shape_pp_para_get"); + + p_para->c_en = pp_shap_para.c_en; + p_para->cir = pp_shap_para.cir; + p_para->cbs = pp_shap_para.cbs; + + return ret; +} +EXPORT_SYMBOL(dpp_port_shape_get); + +/***********************************************************/ +/**对外接口 配置调度器整形 + * @param vport_id vport号 + * @param se_id 调度器编号号 + * @param pir pir总速率,单位Kb,范围同cir + * @param pbs pbs总桶深,单位KB,范围同cbs + * @param db_en 整形模式,0-单桶,1-双桶,仅FQ8/WFQ8有效 + * @param cir 调度器cir速率,单位Kb + * @param cbs 调度器cbs桶深,单位KB + * 注:cbs=0 表示关闭整形,即不限速 + * @return + * @remark 无 + * @see + * @author sun @date 2023/11/17 + ************************************************************/ +DPP_STATUS dpp_se_shape_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 se_id, ZXIC_UINT32 pir, ZXIC_UINT32 pbs, + ZXIC_UINT32 db_en, ZXIC_UINT32 cir, ZXIC_UINT32 cbs) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + + ret = dpp_tm_shape_se_para_set(&dev, se_id, pir, pbs, db_en, cir, cbs); + ZXIC_COMM_CHECK_RC(ret, "dpp_tm_shape_se_para_set"); + + return ret; +} +EXPORT_SYMBOL(dpp_se_shape_set); + +/***********************************************************/ +/**对外接口 配置flow整形 + * @param vport_id vport号 + * @param flow_id 流队列号 + * @param cir cir速率,单位Kb + * @param cbs cbs桶深,单位KB + * 注:cbs=0 表示关闭整形,即不限速 + * @param db_en 双桶整形使能,0-单桶,1-双桶 + * @param eir eir速率,单位Kb + * @param ebs ebs桶深,单位KB + * @return + * @remark 无 + * @see + * @author sun @date 2023/11/17 + ************************************************************/ +DPP_STATUS dpp_flow_shape_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 flow_id, ZXIC_UINT32 cir, ZXIC_UINT32 cbs, + ZXIC_UINT32 db_en, ZXIC_UINT32 eir, ZXIC_UINT32 ebs) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + + ret = dpp_tm_shape_flow_para_set(&dev, flow_id, cir, cbs, db_en, eir, ebs); + ZXIC_COMM_CHECK_RC(ret, "dpp_tm_shape_flow_para_set"); + + return ret; +} +EXPORT_SYMBOL(dpp_flow_shape_set); + +/***********************************************************/ +/**对外接口 配置流队列挂接到端口号 + * @param vport_id vport号 + * @param flow_id 流队列号 + * @param port 端口0~9 + * @return + * @remark 无 + * @see + * @author sun @date 2023/11/17 + ************************************************************/ +DPP_STATUS dpp_flow_map_port_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 flow_id, ZXIC_UINT32 port) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + + ret = dpp_tm_cgavd_q_map_pp_set(&dev, flow_id, port); + ZXIC_COMM_CHECK_RC(ret, "dpp_tm_cgavd_q_map_pp_set"); + + return ret; +} +EXPORT_SYMBOL(dpp_flow_map_port_set); + +/***********************************************************/ +/**对外接口 读取流队列挂接的端口号 + * @param vport_id vport号 + * @param flowid 流队列号 + * @param port 端口0~9 + * @return + * @remark 无 + * @see + * @author sun @date 2023/11/17 + ************************************************************/ +DPP_STATUS dpp_flow_map_port_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 flow_id, ZXIC_UINT32 *p_port) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 pp_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + + ret = dpp_tm_cgavd_q_map_pp_get(&dev, flow_id, &pp_id); + ZXIC_COMM_CHECK_RC(ret, "dpp_tm_cgavd_q_map_pp_get"); + + *p_port = pp_id; + + return ret; +} +EXPORT_SYMBOL(dpp_flow_map_port_get); + +/***********************************************************/ +/**对外接口 配置TD门限值 + * @param vport_id vport号 + * @param flow_id 流队列号 + * @param td_th 配置的丢弃门限值 + * @return + * @remark 无 + * @see + * @author sun @date 2023/11/17 + ************************************************************/ +DPP_STATUS dpp_flow_td_th_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 flow_id, ZXIC_UINT32 td_th) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + + ret = dpp_tm_cgavd_td_th_set(&dev, QUEUE_LEVEL, flow_id, td_th); + ZXIC_COMM_CHECK_RC(ret, "dpp_tm_cgavd_td_th_set"); + + return ret; +} +EXPORT_SYMBOL(dpp_flow_td_th_set); + +/***********************************************************/ +/**对外接口 读取TD门限值 + * @param vport_id vport号 + * @param flow_id 流队列号 + * @param p_td_th 配置的丢弃门限值 + * @return + * @remark 无 + * @see + * @author sun @date 2023/11/17 + ************************************************************/ +DPP_STATUS dpp_flow_td_th_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 flow_id, ZXIC_UINT32 *p_td_th) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 td_th = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + + ret = dpp_tm_cgavd_td_th_get(&dev, QUEUE_LEVEL, flow_id, &td_th); + ZXIC_COMM_CHECK_RC(ret, "dpp_tm_cgavd_td_th_get"); + + *p_td_th = td_th; + + return ret; +} +EXPORT_SYMBOL(dpp_flow_td_th_get); + +/***********************************************************/ +/**对外接口 设置block值 +* @param vport_id vport号 +* @param size 配置block值 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_blk_size_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 size) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + ret = dpp_tm_cfgmt_blk_size_set(&dev, size); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, ret, "dpp_tm_cfgmt_blk_size_set"); + + return ret; +} +EXPORT_SYMBOL(dpp_blk_size_set); + +/***********************************************************/ +/**对外接口 配置全局pfc使能状态 + * @param vport_id vport号 + * @param pfc_en 使能开关 + * @return + * @remark 无 + * @see + * @author sun @date 2023/11/17 + ************************************************************/ +DPP_STATUS dpp_qmu_pfc_en_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 pfc_en) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pfc_en, 0, 1); + + ret = dpp_tm_qmu_pfc_en_set(&dev, pfc_en); + ZXIC_COMM_CHECK_RC(ret, "dpp_tm_qmu_pfc_en_set"); + + return ret; +} +EXPORT_SYMBOL(dpp_qmu_pfc_en_set); + +/***********************************************************/ +/**对外接口 读取全局pfc使能状态 + * @param vport_id vport号 + * @param p_pfc_en 使能开关 + * @return + * @remark 无 + * @see + * @author sun @date 2023/11/17 + ************************************************************/ +DPP_STATUS dpp_qmu_pfc_en_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 *p_pfc_en) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 pfc_en = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pfc_en, 0, 1); + + ret = dpp_tm_qmu_pfc_en_get(&dev, &pfc_en); + ZXIC_COMM_CHECK_RC(ret, "dpp_tm_qmu_pfc_en_set"); + + *p_pfc_en = pfc_en; + + return ret; +} +EXPORT_SYMBOL(dpp_qmu_pfc_en_get); + +/***********************************************************/ +/**对外接口 配置物理端口pfc使能状态 + * @param vport_id vport号 + * @param port_id 端口0~9 + * @param port_en 使能开关 + * @return + * @remark 无 + * @see + * @author sun @date 2023/11/17 + ************************************************************/ +DPP_STATUS dpp_qmu_port_pfc_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 port_id, ZXIC_UINT32 port_en) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, port_id, 0, DPP_TM_PP_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, port_en, 0, 1); + + ret = dpp_tm_qmu_port_pfc_make_set(&dev, port_id, port_en); + ZXIC_COMM_CHECK_RC(ret, "dpp_tm_qmu_port_pfc_make_set"); + + return ret; +} +EXPORT_SYMBOL(dpp_qmu_port_pfc_set); + +/***********************************************************/ +/**对外接口 读取物理端口pfc使能状态 + * @param vport_id vport号 + * @param port_id 端口0~9 + * @param p_port_en 使能开关 + * @return + * @remark 无 + * @see + * @author sun @date 2023/11/17 + ************************************************************/ +DPP_STATUS dpp_qmu_port_pfc_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 port_id, ZXIC_UINT32 *p_port_en) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 port_en = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, port_id, 0, DPP_TM_PP_NUM - 1); + + ret = dpp_tm_qmu_port_pfc_make_get(&dev, port_id, &port_en); + ZXIC_COMM_CHECK_RC(ret, "dpp_tm_qmu_port_pfc_make_get"); + + *p_port_en = port_en; + + return ret; +} +EXPORT_SYMBOL(dpp_qmu_port_pfc_get); + + +/***********************************************************/ +/**对外接口 申请profile_id资源 +* @param vport_id vport号 +* @param flags car类型 +* @param p_profile_id 限速模版号 +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_car_profile_id_add(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 flags, + ZXIC_UINT64 *p_profile_id) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 *profile_id = ZXIC_NULL; + ZXIC_UINT32 profile_id_h = 0; + ZXIC_UINT32 profile_id_l = 0; + ZXIC_UINT64 temp_profile_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + profile_id = (ZXIC_UINT32 *)kmalloc(G_PROFILE_ID_LEN, GFP_KERNEL); + ZXIC_COMM_CHECK_POINT(profile_id); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC_MEMORY_FREE(ret, "dpp_dev_get", profile_id); + + ZXIC_COMM_CHECK_DEV_INDEX_MEMORY_FREE_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX, profile_id); + ZXIC_COMM_CHECK_DEV_INDEX_MEMORY_FREE_NO_ASSERT(dev_id, flags, 0, CAR_TYPE_MAX, profile_id); + + ret = dpp_agent_channel_plcr_profileid_request(&dev, pf_info->vport, flags, profile_id); + ZXIC_COMM_CHECK_RC_MEMORY_FREE(ret, "dpp_agent_channel_plcr_profileid_request", profile_id); + + profile_id_h = *(profile_id + 1); + profile_id_l = *profile_id; + + temp_profile_id = ((ZXIC_UINT64)profile_id_l) << 32 | ((ZXIC_UINT64)profile_id_h); + + if (DPP_OK != (ZXIC_UINT32)(temp_profile_id >> 56)) + { + kfree(profile_id); + return DPP_ERR; + } + + *p_profile_id = temp_profile_id; + kfree(profile_id); + + return ret; +} +EXPORT_SYMBOL(dpp_car_profile_id_add); + +/***********************************************************/ +/**对外接口 释放profile_id资源 +* @param vport_id vport号 +* @param flags car类型 +* @param profile_id 限速模版号 + * @return + * @remark 无 + * @see + * @author sun @date 2023/11/17 + ************************************************************/ +DPP_STATUS dpp_car_profile_id_delete(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 flags, ZXIC_UINT64 profile_id) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 profileid = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + DPP_CAR_PROFILE_ID_GET(profile_id, profileid); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, flags, 0, CAR_TYPE_MAX); + + ret = dpp_agent_channel_plcr_profileid_release(&dev, pf_info->vport, flags, profileid); + ZXIC_COMM_CHECK_RC(ret, "dpp_agent_channel_plcr_profileid_release"); + + // if (DPP_OK != ret) + // { + // return DPP_ERR; + // } + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_car_profile_id_delete); + +/***********************************************************/ +/**对外接口 配置flow_id和profile_id的绑定关系,并配置限速模板使能 +* @param vport_id vport号 +* @param car_type car模式 +* @param flow_id 队列号 +* @param drop_flag 丢弃标志 +* @param plcr_en 限速使能 +* @param profile_id 模板编号 +* +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_car_queue_cfg_set(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 car_type, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 drop_flag, + ZXIC_UINT32 plcr_en, + ZXIC_UINT32 profile_id) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + + ret = dpp_stat_car_queue_cfg_set(&dev, car_type, flow_id, drop_flag, plcr_en, profile_id); + ZXIC_COMM_CHECK_RC(ret, "dpp_stat_car_queue_cfg_set"); + + return ret; + +} +EXPORT_SYMBOL(dpp_car_queue_cfg_set); + +/***********************************************************/ +/**对外接口 查询flow_id和profile_id的绑定关系 +* @param vport_id vport号 +* @param car_type car模式 +* @param flow_id 队列号 +* @param p_drop_flag 丢弃标志 +* @param p_plcr_en 限速使能 +* @param p_profile_id 模板编号 +* +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_car_queue_cfg_get(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 car_type, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 *p_drop_flag, + ZXIC_UINT32 *p_plcr_en, + ZXIC_UINT32 *p_profile_id) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_CHECK_DEV_POINT(0, p_drop_flag); + ZXIC_COMM_CHECK_DEV_POINT(0, p_plcr_en); + ZXIC_COMM_CHECK_DEV_POINT(0, p_profile_id); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + + ret = dpp_stat_car_queue_cfg_get(&dev, car_type, flow_id, p_drop_flag, p_plcr_en, p_profile_id); + ZXIC_COMM_CHECK_RC(ret, "dpp_stat_car_queue_cfg_get"); + + return ret; +} +EXPORT_SYMBOL(dpp_car_queue_cfg_get); + +/***********************************************************/ +/**对外接口 配置profile_id限速模版 +* @param dev_id +* @param car_type +* @param pkt_sign +* @param profile_id +* @param p_car_profile_cfg +* +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_car_profile_cfg_set(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 car_type, + ZXIC_UINT32 pkt_sign, + ZXIC_UINT32 profile_id, + ZXIC_VOID* p_car_profile_cfg) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_car_profile_cfg); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + + ret = dpp_stat_car_profile_cfg_set(&dev, car_type, pkt_sign, profile_id, p_car_profile_cfg); + ZXIC_COMM_CHECK_RC(ret, "dpp_stat_car_queue_cfg_set"); + + return ret; +} +EXPORT_SYMBOL(dpp_car_profile_cfg_set); + +/***********************************************************/ +/**对外接口 查询profile_id限速模版参数 +* @param vport_id vport号 +* @param car_type car模式 +* @param pkt_sign 限速模式0-字节;1-包 +* @param profile_id 模板编号 +* @param p_car_profile_cfg 限速参数 +* +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_car_profile_cfg_get(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 car_type, + ZXIC_UINT32 pkt_sign, + ZXIC_UINT32 profile_id, + ZXIC_VOID* p_car_profile_cfg) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_car_profile_cfg); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + + ret = dpp_stat_car_profile_cfg_get(&dev, car_type, pkt_sign, profile_id, p_car_profile_cfg); + ZXIC_COMM_CHECK_RC(ret, "dpp_stat_car_profile_cfg_get"); + + return ret; +} +EXPORT_SYMBOL(dpp_car_profile_cfg_get); + +/***********************************************************/ +/**对外接口 配置队列映射关系 +* @param dev_id 设备号 +* @param car_type car模式类型,参见STAT_CAR_TYPE_E +* @param flow_id 队列号 +* @param map_flow_id 映射队列号 +* @param map_sp 映射sp +* +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_car_queue_map_set(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 car_type, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 map_flow_id, + ZXIC_UINT32 map_sp) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + + ret = dpp_stat_car_queue_map_set(&dev, car_type, flow_id, map_flow_id, map_sp); + ZXIC_COMM_CHECK_RC(ret, "dpp_stat_car_queue_map_set"); + + return ret; +} +EXPORT_SYMBOL(dpp_car_queue_map_set); + +/***********************************************************/ +/**对外接口 配置队列映射关系 +* @param dev_id 设备号 +* @param car_type car模式类型,参见STAT_CAR_TYPE_E +* @param flow_id 队列号 +* @param map_flow_id 映射队列号 +* @param map_sp 映射sp +* +* @return +* @remark 无 +* @see +* @author sun @date 2023/11/17 +************************************************************/ +DPP_STATUS dpp_car_queue_map_get(DPP_PF_INFO_T* pf_info, + ZXIC_UINT32 car_type, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 *p_map_flow_id, + ZXIC_UINT32 *p_map_sp) +{ + DPP_STATUS ret = DPP_OK; + DPP_DEV_T dev = {0}; + ZXIC_UINT32 dev_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ret = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(ret, "dpp_dev_get"); + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_map_flow_id); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_map_sp); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pf_info->vport, 0, DPP_VPORT_NUM_MAX); + + ret = dpp_stat_car_queue_map_get(&dev, car_type, flow_id, p_map_flow_id, p_map_sp); + ZXIC_COMM_CHECK_RC(ret, "dpp_stat_car_queue_map_get"); + + return ret; +} +EXPORT_SYMBOL(dpp_car_queue_map_get); diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/Kbuild.include new file mode 100644 index 0000000..71babb3 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/Kbuild.include @@ -0,0 +1,4 @@ +cur_dir := en_np/sdk/ +subdirs := source/ +src_files += +include $(foreach subdir, $(subdirs), $(dinghai_root)/$(cur_dir)$(subdir)/Kbuild.include) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_apt_se_api.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_apt_se_api.h new file mode 100644 index 0000000..8094f4a --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_apt_se_api.h @@ -0,0 +1,303 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_apt_se_api.h +* 文件标识 : +* 内容摘要 : SE适配业务接口数据结构和函数声明 +* 其它说明 : +* 当前版本 : +* 作 者 : chenqin00181032 +* 完成日期 : 2022/02/22 +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef _DPP_APT_SE_API_H_ +#define _DPP_APT_SE_API_H_ + +#include "zxic_common.h" + +#if ZXIC_REAL("header file") +#include "dpp_dev.h" +#include "dpp_se_api.h" +#include "dpp_etcam.h" +#include "dpp_se.h" +#endif + + +#if ZXIC_REAL("data struct define") +typedef ZXIC_UINT32 (*DPP_APT_ACL_ENTRY_SET_FUNC)(ZXIC_VOID *pData,DPP_ACL_ENTRY_EX_T *aclEntry); +typedef ZXIC_UINT32 (*DPP_APT_ACL_ENTRY_GET_FUNC)(ZXIC_VOID *pData,DPP_ACL_ENTRY_EX_T *aclEntry); + +typedef ZXIC_UINT32 (*DPP_APT_ERAM_SET_FUNC)(ZXIC_VOID *pData,ZXIC_UINT32 buf[4]); +typedef ZXIC_UINT32 (*DPP_APT_ERAM_GET_FUNC)(ZXIC_VOID *pData,ZXIC_UINT32 buf[4]); + +typedef ZXIC_UINT32 (*DPP_APT_HASH_ENTRY_SET_FUNC)(ZXIC_VOID *pData,DPP_HASH_ENTRY *pEntry); +typedef ZXIC_UINT32 (*DPP_APT_HASH_ENTRY_GET_FUNC)(ZXIC_VOID *pData,DPP_HASH_ENTRY *pEntry); + +typedef ZXIC_UINT32 (*DPP_APT_LPM_ENTRY_SET_FUNC)(ZXIC_VOID *pData,ZXIC_VOID *pEntry); +typedef ZXIC_UINT32 (*DPP_APT_LPM_ENTRY_GET_FUNC)(ZXIC_VOID *pData,ZXIC_VOID *pEntry); + +typedef ZXIC_UINT32 (*DPP_APT_DDR_SET_FUNC)(ZXIC_VOID *pData,ZXIC_UINT32 buf[DPP_DIR_TBL_BUF_MAX_NUM]); +typedef ZXIC_UINT32 (*DPP_APT_DDR_GET_FUNC)(ZXIC_VOID *pData,ZXIC_UINT32 buf[DPP_DIR_TBL_BUF_MAX_NUM]); + +typedef struct dpp_apt_eram_table_t +{ + ZXIC_UINT32 sdtNo; /** <@brief sdt no 0~255 */ + DPP_SDTTBL_ERAM_T eRamSdt; /** <@brief eRam属性*/ + ZXIC_UINT32 opr_mode; /**cpu读写位宽模式DPP_ERAM128_OPR_MODE_E 0:128b 1:64b 2:1b 3:32b <@*/ + ZXIC_UINT32 rd_mode; /*读清模式DPP_ERAM128_RD_CLR_MODE_E,0:正常读 1:读清模式*/ + DPP_APT_ERAM_SET_FUNC eram_set_func; /** <@brief 结构体转换为码流 */ + DPP_APT_ERAM_GET_FUNC eram_get_func; /** <@brief 码流转换为结构体 */ +} DPP_APT_ERAM_TABLE_T; + +typedef struct dpp_apt_ddr_table_t +{ + ZXIC_UINT32 sdtNo; /** <@brief sdt no 0~255 */ + DPP_SDTTBL_DDR3_T eDdrSdt; /** <@brief DDR属性*/ + ZXIC_UINT32 ddr_table_depth;/** <@brief DDR表项深度,单位与读写模式一致*/ + DPP_APT_DDR_SET_FUNC ddr_set_func; /** <@brief 结构体转换为码流 */ + DPP_APT_DDR_GET_FUNC ddr_get_func; /** <@brief 码流转换为结构体 */ +} DPP_APT_DDR_TABLE_T; + +typedef struct dpp_apt_acl_res_t +{ + ZXIC_UINT32 pri_mode; /** <@brief1:显式优先级,2:隐式优先级,以条目下发顺序作为优先级,3:用户指定每个条目在tcam中的存放索引*/ + ZXIC_UINT32 entry_num; /** <@brief 可配置的条目数*/ + ZXIC_UINT32 block_num; /** <@brief 最大8个 */ + ZXIC_UINT32 block_index[DPP_ETCAM_BLOCK_NUM]; /** <@brief 0~7 */ +} DPP_APT_ACL_RES_T; + +typedef struct dpp_apt_acl_table_t +{ + ZXIC_UINT32 sdtNo; /** <@brief sdt no 0~255 */ + DPP_SDTTBL_ETCAM_T aclSdt; /** <@brief acl属性*/ + DPP_APT_ACL_RES_T aclRes; /** <@brief acl资源*/ + DPP_APT_ACL_ENTRY_SET_FUNC acl_set_func; /** <@brief 结构体转换为码流 */ + DPP_APT_ACL_ENTRY_GET_FUNC acl_get_func; /** <@brief 码流转换为结构体 */ +} DPP_APT_ACL_TABLE_T; + +typedef struct dpp_apt_hash_table_t +{ + ZXIC_UINT32 sdtNo; /** <@brief sdt no 0~255 */ + DPP_SDTTBL_HASH_T hashSdt; /** <@brief hash sdt属性*/ + ZXIC_UINT32 tbl_flag; /**< @brief 业务表初始化标记(bit0:老化保活置位使能,bit1:硬件学习使能,bit2:微码写表使能)*/ + DPP_APT_HASH_ENTRY_SET_FUNC hash_set_func; /** <@brief 结构体转换为码流,转换时预留一个字节,从第1字节开始填充 */ + DPP_APT_HASH_ENTRY_GET_FUNC hash_get_func; /** <@brief 码流转换为结构体 */ +} DPP_APT_HASH_TABLE_T; + +typedef struct dpp_apt_hash_func_res_t +{ + ZXIC_UINT32 func_id; /**< @brief hash引擎id 0~3*/ + ZXIC_UINT32 zblk_num; /**< @brief 0~32*/ + ZXIC_UINT32 zblk_bitmap; /**< @brief 置1的bit位表示分配的block编号 */ + ZXIC_UINT32 ddr_dis; /** <@brief 0:混合模式,1:纯片内模式*/ +} DPP_APT_HASH_FUNC_RES_T; + +typedef struct dpp_apt_hash_bulk_res_t +{ + ZXIC_UINT32 func_id; /**< @brief 0~3*/ + ZXIC_UINT32 bulk_id; /**< @brief 0~7*/ + ZXIC_UINT32 zcell_num; /**< @brief 0~128*/ + ZXIC_UINT32 zreg_num; /**< @brief 0~128*/ + ZXIC_UINT32 ddr_baddr; /**< @brief 分配给hash的DDR空间的硬件基地址,单位2k*256bit*/ + ZXIC_UINT32 ddr_item_num; /**< @brief 分配给hash的DDR空间单元数目,以256bit为一个单元(根据分配的基地址和单元数目确定分配的DDR空间大小)*/ + DPP_HASH_DDR_WIDTH_MODE ddr_width_mode; /**< @brief 分配给hash的DDR空间物理存储位宽模式,0:无效值,1:256bit 2:512bit*/ + ZXIC_UINT32 ddr_crc_sel; /**< @brief 选择一个DDR CRC多项式,取值范围0~3,0~3分别对应一个CRC多项式*/ + ZXIC_UINT32 ddr_ecc_en; /**< @brief DDR ECC使能: 0-不使能,1-使能*/ +} DPP_APT_HASH_BULK_RES_T; + +#define DTB_DUMP_UNICAST_MAC_DUMP_NUM (32 * 257) +#define DTB_DUMP_MULTICAST_MAC_DUMP_NUM (32 * 257) +#endif + +#if ZXIC_REAL("SE APT FUNCTION") + +/***********************************************************/ +/** eram表资源初始化 +* @param dev_id 设备号 +* @param tbl_num 需初始化的eram表个数 +* @param pEramTbl eram资源信息,包括SDT配置信息,直接表读取位宽和结构体码流转换回调函数 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_eram_res_init(DPP_DEV_T *dev,ZXIC_UINT32 tbl_num,DPP_APT_ERAM_TABLE_T *pEramTbl); + +/***********************************************************/ +/** DDR表资源初始化 +* @param dev_id 设备号 +* @param tbl_num 需初始化的DDR表个数 +* @param pDdrTbl ddr资源信息,包括SDT配置信息,直接表读取位宽和结构体码流转换回调函数 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/07/26 +************************************************************/ +DPP_STATUS dpp_apt_ddr_res_init(DPP_DEV_T *dev,ZXIC_UINT32 tbl_num,DPP_APT_DDR_TABLE_T *pDdrTbl); + +/***********************************************************/ +/** acl资源初始化 +* @param dev_id 设备号 +* @param tbl_num etcam对应的sdt表个数 +* @param pAclTblRes acl表资源信息,包括SDT配置信息,acl资源(条目数,存放方式和占用的block)和结构体码流转换回调函数 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_acl_res_init(DPP_DEV_T *dev,ZXIC_UINT32 tbl_num,DPP_APT_ACL_TABLE_T *pAclTblRes); + +/***********************************************************/ +/** hash表全局资源初始化 +* @param dev_id 设备号 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_hash_global_res_init(DPP_DEV_T *dev); + +/***********************************************************/ +/** hash引擎初始化 +* @param dev_id 设备号 +* @param func_num 需初始化的hash引擎个数 1~4 +* @param pHashFuncRes 每个hash引擎分配的zblock个数和编号,以及分配模式(混合模式或者纯片内模式) +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_hash_func_res_init(ZXIC_UINT32 dev_id,ZXIC_UINT32 func_num,DPP_APT_HASH_FUNC_RES_T *pHashFuncRes); + +/***********************************************************/ +/** hash引擎初始化(删除硬件数据) +* @param dev_id 设备号 +* @param func_num 需初始化的hash引擎个数 1~4 +* @param pHashFuncRes 每个hash引擎分配的zblock个数和编号,以及分配模式(混合模式或者纯片内模式) +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_hash_func_flush_hardware_all(DPP_DEV_T *dev, + ZXIC_UINT32 func_num, + DPP_APT_HASH_FUNC_RES_T *pHashFuncRes, + ZXIC_UINT32 queue_id); + +/***********************************************************/ +/** hash引擎bulk空间初始化 +* @param dev_id 设备号 +* @param bulk_num 需初始化的bulk表个数 1~32 +* @param pBulkRes zcell和zreg资源占用信息,如果是混合模式,需进行DDR资源分配 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_hash_bulk_res_init(ZXIC_UINT32 dev_id,ZXIC_UINT32 bulk_num,DPP_APT_HASH_BULK_RES_T *pBulkRes); + +/***********************************************************/ +/** hash业务表属性初始化 +* @param dev_id 设备号 +* @param tbl_num 需初始化的业务表表个数 1~128 +* @param pHashTbl sdt配置信息,初始化标记和业务结构体码流转换函数 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_hash_tbl_res_init(DPP_DEV_T *dev,ZXIC_UINT32 tbl_num,DPP_APT_HASH_TABLE_T *pHashTbl); + +/***********************************************************/ +/** dtb eram表项插入/更新 +* @param dev_id 设备号 +* @param sdt_no SDT号 0~255 +* @param index 条目index,索引范围随wrt_mode模式不同 +* @param pData 插入表项内容,由业务确定 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_dtb_eram_insert(DPP_DEV_T *dev,ZXIC_UINT32 queue_id,ZXIC_UINT32 sdt_no,ZXIC_UINT32 index,void *pData); + +/***********************************************************/ +/** eram表项数据获取,从软件缓存中获取 +* @param dev_id 设备号 +* @param sdt_no SDT号 0~255 +* @param index 条目index,索引范围随wrt_mode模式不同 +* @param pData 出参,返回业务表项内容 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_dtb_eram_get(DPP_DEV_T *dev, ZXIC_UINT32 queue_id, ZXIC_UINT32 sdt_no, ZXIC_UINT32 index, void *pData); + +/***********************************************************/ +/** eram表项删除,软件维护删除 +* @param dev_id 设备号 +* @param sdt_no SDT号 0~255 +* @param index 条目index,索引范围随wrt_mode模式不同 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_dtb_eram_clear(DPP_DEV_T *dev,ZXIC_UINT32 queue_id,ZXIC_UINT32 sdt_no,ZXIC_UINT32 index); + +/***********************************************************/ +/** dtb hash表项插入/更新 +* @param dev_id 设备号 +* @param sdt_no sdt号 0~255 +* @param pData 插入hash表项信息,由业务确定 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_dtb_hash_insert(DPP_DEV_T *dev,ZXIC_UINT32 queue_id,ZXIC_UINT32 sdt_no,void *pData); + +/***********************************************************/ +/** dtb hash表项删除 +* @param dev_id 设备号 +* @param sdt_no sdt号 0~255 +* @param pData 删除hash表项信息,由业务传入 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_dtb_hash_delete(DPP_DEV_T *dev,ZXIC_UINT32 queue_id,ZXIC_UINT32 sdt_no,void *pData); + +/***********************************************************/ +/** acl表项插入/更新 +* @param dev_id 设备号 +* @param sdt_no sdt号 0~255 +* @param pData 业务插入表项内容,具体结构体由业务确定(结构体的第一个字段必须为index),SDK不感知 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_dtb_acl_entry_insert(DPP_DEV_T *dev,ZXIC_UINT32 queue_id, ZXIC_UINT32 sdt_no, void *pData); + +/***********************************************************/ +/** 释放sdt资源以及适配资源 +* @param dev_id 设备号 +* @param sdt_no sdt号 +* @return +* @remark 无 +* @see +* @author cq @date 2023/11/09 +************************************************************/ +DPP_STATUS dpp_apt_sdt_res_deinit(DPP_DEV_T *dev, ZXIC_UINT32 sdt_no); +#endif + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_dtb_table_api.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_dtb_table_api.h new file mode 100644 index 0000000..3bcc5c4 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_dtb_table_api.h @@ -0,0 +1,213 @@ +#ifndef _DPP_DTB_TABLE_API_H_ +#define _DPP_DTB_TABLE_API_H_ + +#ifdef __cplusplus +extern "C"{ +#endif + +#include "dpp_dev.h" +#include "zxic_common.h" + +#define DPP_DTB_DUMP_ZCAM_TYPE (ZXIC_UINT32)(0) +#define DPP_DTB_DUMP_DDR_TYPE (ZXIC_UINT32)(1) + +typedef struct dpp_dtb_user_entry_t +{ + ZXIC_UINT32 sdt_no; /*流表sdt号*/ + ZXIC_VOID* p_entry_data; /*该流表的数据,数据结构见各表的结构体定义*/ +}DPP_DTB_USER_ENTRY_T; + +typedef struct dpp_dtb_eram_entry_info_t +{ + ZXIC_UINT32 index; /*条目index,根据wrt_mode模式为单位的的index,支持1/64/128bit */ + ZXIC_UINT32 *p_data; /*写入的表项信息 */ +}DPP_DTB_ERAM_ENTRY_INFO_T; + +typedef struct dpp_dtb_ddr_entry_info_t +{ + ZXIC_UINT32 index; /*条目index,根据wrt_mode模式定义的index,支持128/256/384/512bit*/ + ZXIC_UINT32 *p_data; /*写入的表项信息*/ +}DPP_DTB_DDR_ENTRY_INFO_T; + +typedef struct dpp_dtb_hash_entry_info_t +{ + ZXIC_UINT8 *p_actu_key; /*实际的键值,对于一种表来说键值长度是固定的,在初始化时,会通过dpp_hash_tbl_id_info_init进行配置*/ + ZXIC_UINT8 *p_rst; /*hash表结果 result的长度由当前业务结果位宽决定*/ +}DPP_DTB_HASH_ENTRY_INFO_T; + +typedef struct dpp_dtb_acl_entry_info_t +{ + ZXIC_UINT32 handle; /*条目索引*/ + ZXIC_UINT8 *key_data; /*键值data部分 按mode的长度,支持640bit/320bit/160bit/80bit*/ + ZXIC_UINT8 *key_mask; /*键值mask部分 长度与data相同*/ + ZXIC_UINT8 *p_as_rslt; /*关联结果,仅使能关联查找情况有效 支持1/64/128bit*/ +}DPP_DTB_ACL_ENTRY_INFO_T; + +typedef struct dpp_dtb_dump_index_t +{ + ZXIC_UINT32 index; /*index*/ + ZXIC_UINT32 index_type; /*index类型 */ +}DPP_DTB_DUMP_INDEX_T; + +typedef struct dtb_queue_dma_addr_info +{ + ZXIC_UINT32 slot_id; /*np所在的槽位号*/ + ZXIC_UINT32 queue_id; /*队列号*/ + ZXIC_UINT32 dma_size; /*该队列申请的dma大小*/ + ZXIC_UINT64 dma_phy_addr; /* dma 物理地址*/ + ZXIC_UINT64 dma_vir_addr; /* dma 内核虚拟地址*/ +}DTB_QUEUE_DMA_ADDR_INFO; + +/*dump地址信息获取*/ +ZXIC_UINT32 dpp_dtb_dump_sdt_addr_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + ZXIC_UINT64 *phy_addr, + ZXIC_UINT64 *vir_addr, + ZXIC_UINT32 *size); + +/***********************************************************/ +/** DTB通道申请 +* @param devId NP设备号 +* @param pName 申请DTB通道的唯一设备名(最大32字符) +* @param pQueueId 申请到的DTB通道编号 +* @return +* @remark 无 +* @see +* @author cbb @date 2023/07/03 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_requst(DPP_DEV_T *dev, ZXIC_CONST ZXIC_UINT8* pName, + ZXIC_UINT16 vPort, + ZXIC_UINT32 *pQueueId); + +/***********************************************************/ +/** DTB通道释放 +* @param devId NP设备号 +* @param pName 要释放DTB通道的唯一设备名(最大32字符) +* @param pQueueId 要释放的DTB通道编号 +* @return +* @remark 无 +* @see +* @author cbb @date 2023/07/03 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_release(DPP_DEV_T *dev, ZXIC_CONST ZXIC_UINT8* pName, + ZXIC_UINT32 queueId); + +/***********************************************************/ +/** DTB通道用户信息配置 +* @param devId NP设备号 +* @param queueId DTB通道编号 +* @param vPort vport信息 +* @param vector 中断号 +* @return +* @remark 无 +* @see +* @author cbb @date 2023/07/03 +************************************************************/ +ZXIC_UINT32 dpp_dtb_user_info_set(DPP_DEV_T *dev, + ZXIC_UINT32 queueId, + ZXIC_UINT16 vPort, + ZXIC_UINT32 vector); + +/***********************************************************/ +/** DTB通道下表空间地址设置,空间大小[32*(16+16*1024)B] +* @param devId NP设备号 +* @param queueId DTB通道编号 +* @param phyAddr 物理地址 +* @param virAddr 虚拟地址 +* @return +* @remark 无 +* @see +* @author cbb @date 2023/07/03 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_down_table_addr_set(DPP_DEV_T *dev, + ZXIC_UINT32 queueId, + ZXIC_UINT64 phyAddr, + ZXIC_UINT64 virAddr); + +/***********************************************************/ +/** DTB通道dump空间地址设置,空间大小[32*(16+16*1024)B] +* @param devId NP设备号 +* @param pName 要释放DTB通道的设备名 +* @param phyAddr 物理地址 +* @param virAddr 虚拟地址 +* @return +* @remark 无 +* @see +* @author cbb @date 2023/07/03 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_dump_table_addr_set(DPP_DEV_T *dev, + ZXIC_UINT32 queueId, + ZXIC_UINT64 phyAddr, + ZXIC_UINT64 virAddr); + +/***********************************************************/ +/** 大批量dump一个流表使用的地址空间配置 +* @param devId NP设备号 +* @param queueId DTB队列编号 +* @param sdtNo 流表std号 +* @param phyAddr 物理地址 +* @param virAddr 虚拟地址 +* @param size (最大64MB) +* @return +* @remark 无 +* @see +* @author cbb @date 2023/07/03 +************************************************************/ +ZXIC_UINT32 dpp_dtb_dump_sdt_addr_set(DPP_DEV_T *dev, + ZXIC_UINT32 queueId, + ZXIC_UINT32 sdtNo, + ZXIC_UINT64 phyAddr, + ZXIC_UINT64 virAddr, + ZXIC_UINT32 size); + +/***********************************************************/ +/** 清除大批量dump一个流表使用的地址空间配置 +* @param devId NP设备号 +* @param queueId DTB队列编号 +* @param sdtNo 流表std号 +* @return +* @remark 无 +* @see +* @author cbb @date 2023/07/03 +************************************************************/ +ZXIC_UINT32 dpp_dtb_dump_sdt_addr_clear(DPP_DEV_T *dev, + ZXIC_UINT32 queueId, + ZXIC_UINT32 sdtNo); + +/***********************************************************/ +/** 释放当前sdt下的所有流表(硬件方式) +* (适用于进程启动后,仅配置流表资源,软件未配置流表,但需要删除硬件上已配置流表的场景) +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no sdt号 +* @return +* @remark 无 +* @see +* @author cq @date 2023/12/04 +************************************************************/ +DPP_STATUS dpp_dtb_hash_offline_delete(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no); + + +/***********************************************************/ +/** 释放当前sdt下的所有流表(硬件方式) +* (适用于进程正常退出前删除表项,软件上有存储表项) +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no sdt号 +* @return +* @remark 无 +* @see +* @author cq @date 2023/12/04 +************************************************************/ +DPP_STATUS dpp_dtb_hash_online_delete(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_pbu_api.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_pbu_api.h new file mode 100644 index 0000000..f558605 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_pbu_api.h @@ -0,0 +1,145 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_pbu_api.h +* 文件标识 : pbu模块对外数据类型定义和接口函数声明 +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : djf +* 完成日期 : 2015/02/04 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef _DPP_PBU_API_H_ +#define _DPP_PBU_API_H_ + +#include "dpp_module.h" + +#if ZXIC_REAL("data struct define") +typedef struct dpp_pbu_mc_cos_para_t +{ + ZXIC_UINT32 mc_cos_th[8]; /**< @brief cos0~7的mc指针阈值*/ + ZXIC_UINT32 mc_cos_mode[8]; /**< @brief cos0~7的mc指针溢出处理模式*/ +} DPP_PBU_MC_COS_PARA_T; + + +typedef struct dpp_pbu_port_th_para_t +{ + ZXIC_UINT32 lif_th; /**< @brief lif阈值*/ + ZXIC_UINT32 lif_prv; /**< @brief lif私有阈值*/ + ZXIC_UINT32 idma_prv; /**< @brief idma私有阈值*/ + ZXIC_UINT32 idma_th_cos0; /**< @brief idma cos0指针阈值*/ + ZXIC_UINT32 idma_th_cos1; /**< @brief idma cos1指针阈值*/ + ZXIC_UINT32 idma_th_cos2; /**< @brief idma cos2指针阈值*/ + ZXIC_UINT32 idma_th_cos3; /**< @brief idma cos3指针阈值*/ + ZXIC_UINT32 idma_th_cos4; /**< @brief idma cos4指针阈值*/ + ZXIC_UINT32 idma_th_cos5; /**< @brief idma cos5指针阈值*/ + ZXIC_UINT32 idma_th_cos6; /**< @brief idma cos6指针阈值*/ + ZXIC_UINT32 idma_th_cos7; /**< @brief idma cos7指针阈值*/ +} DPP_PBU_PORT_TH_PARA_T; + +typedef struct dpp_pbu_port_cos_th_para_t +{ + ZXIC_UINT32 cos_th[8]; /**< @brief 各cos对应的阈值,要求高优先级的阈值不小于低优先级的阈值 */ +} DPP_PBU_PORT_COS_TH_PARA_T; + + +typedef struct dpp_pbu_global_th_t +{ + ZXIC_UINT32 idma_public_th;/**< @brief idma总的共有指针*/ + ZXIC_UINT32 lif_public_th;/**< @brief lif总的共有指针*/ + ZXIC_UINT32 idma_total_th;/**< @brief idma总的指针阈值,最大支持16384*/ + ZXIC_UINT32 lif_total_th;/**< @brief lif总的指针阈值,最大支持16384*/ + ZXIC_UINT32 mc_total_th;/**< @brief 组播总的指针阈值*/ +} DPP_PBU_GLOBAL_TH_T; + + + + + + +#endif//struct + + +#if ZXIC_REAL("function declaration") +#if 0 +/***********************************************************/ +/** 全局公共使用指针阈值总体配置 +* @param dev_id 芯片ID 0~3 +* @param p_global_th 参见DPP_PBU_GLOBAL_TH_T详细定义 +* +* @return +* @remark 无 +* @see +* @author pj @date 2019/12/04 +************************************************************/ +DPP_STATUS dpp_pbu_global_th_set(ZXIC_UINT32 dev_id, + DPP_PBU_GLOBAL_TH_T *p_global_th); + +#endif +/***********************************************************/ +/** 配置基于端口的指针阈值 +* @param dev_id 设备编号 +* @param port_id 端口号 +* @param p_para 端口阈值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/07/09 +************************************************************/ +DPP_STATUS dpp_pbu_port_th_set(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + DPP_PBU_PORT_TH_PARA_T *p_para); + +/***********************************************************/ +/** 配置指定端口按cos优先级起pfc流控的优先级流控指针阈值,仅对lif0的48个通道有效 +* @param dev_id 设备编号 +* @param port_id 端口号 +* @param p_para cos阈值,要求高优先级的阈值不小于低优先级的阈值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/07/09 +************************************************************/ +DPP_STATUS dpp_pbu_port_cos_th_set(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + DPP_PBU_PORT_COS_TH_PARA_T *p_para); + +#if 0 +/***********************************************************/ +/** pbu初始化函数 +* @param dev_id 设备编号 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/07/09 +************************************************************/ +DPP_STATUS dpp_pbu_init(ZXIC_UINT32 dev_id); + +/***********************************************************/ +/** 配置基于cos的mc复制指针阈值和mc指针溢出处理模式 +* @param dev_id 设备编号 +* @param p_para cos0~7的mc指针阈值和mc指针溢出处理模式 0-wait 1-disc +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/04/14 +************************************************************/ +DPP_STATUS dpp_pbu_mc_cos_para_set(ZXIC_UINT32 dev_id, + DPP_PBU_MC_COS_PARA_T *p_para); +#endif +#endif//function +#endif + + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_ppu_api.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_ppu_api.h new file mode 100755 index 0000000..45f5875 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_ppu_api.h @@ -0,0 +1,393 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_ppu_api.h +* 文件标识 : +* 内容摘要 : PPU模块对外数据结构和函数声明 +* 其它说明 : +* 当前版本 : +* 作 者 : wcl +* 完成日期 : 2015/02/13 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef _DPP_PPU_API_H_ +#define _DPP_PPU_API_H_ + + +#if ZXIC_REAL("header file") +#include "dpp_module.h" + +#endif + +#if ZXIC_REAL("data struct define") + +/** mcode version time */ +typedef struct dpp_version_t +{ + /*对应微码伪指令 version = expr_a.expr_b.expr_c*/ + ZXIC_UINT32 version_a; /**< @brief expr_a*/ + ZXIC_UINT32 version_b; /**< @brief expr_b*/ + ZXIC_UINT32 version_c; /**< @brief xpr_c*/ + + /*对应微码编译版本的时间 年/月/日/小时*/ + ZXIC_UINT32 year; + ZXIC_UINT32 month; + ZXIC_UINT32 day; + ZXIC_UINT32 hour; +}DPP_VERSION_T; + +/** SDT表数据*/ +typedef struct dpp_sdt_tbl_data_t +{ + ZXIC_UINT32 data_high32; /**< @brief SDT表数据高32bit*/ + ZXIC_UINT32 data_low32; /**< @brief SDT表数据低32bit*/ +}DPP_SDT_TBL_DATA_T; + +#endif + +#if ZXIC_REAL("interrupt data struct define") +/** PPU 指令RAM ECC错误中断原因*/ +typedef struct dpp_ppu_ram_parity_err_t +{ + ZXIC_UINT32 instrmem2_bank3_parity_err; /**< @brief 指令RAM instrmem2 BANK3 parity 错误*/ + ZXIC_UINT32 instrmem2_bank2_parity_err; /**< @brief 指令RAM instrmem2 BANK2 parity 错误*/ + ZXIC_UINT32 instrmem2_bank1_parity_err; /**< @brief 指令RAM instrmem2 BANK1 parity 错误*/ + ZXIC_UINT32 instrmem2_bank0_parity_err; /**< @brief 指令RAM instrmem2 BANK0 parity 错误*/ + ZXIC_UINT32 instrmem1_bank3_parity_err; /**< @brief 指令RAM instrmem1 BANK3 parity 错误*/ + ZXIC_UINT32 instrmem1_bank2_parity_err; /**< @brief 指令RAM instrmem1 BANK2 parity 错误*/ + ZXIC_UINT32 instrmem1_bank1_parity_err; /**< @brief 指令RAM instrmem1 BANK1 parity 错误*/ + ZXIC_UINT32 instrmem1_bank0_parity_err; /**< @brief 指令RAM instrmem1 BANK0 parity 错误*/ + ZXIC_UINT32 instrmem0_bank3_parity_err; /**< @brief 指令RAM instrmem0 BANK3 parity 错误*/ + ZXIC_UINT32 instrmem0_bank2_parity_err; /**< @brief 指令RAM instrmem0 BANK2 parity 错误*/ + ZXIC_UINT32 instrmem0_bank1_parity_err; /**< @brief 指令RAM instrmem0 BANK1 parity 错误*/ + ZXIC_UINT32 instrmem0_bank0_parity_err; /**< @brief 指令RAM instrmem0 BANK0 parity 错误*/ +}DPP_PPU_RAM_PARITY_ERR_T; + +/** PPU ME指令RAM ECC错误中断原因*/ +typedef struct dpp_ppu_me_interrupt_t +{ + ZXIC_UINT32 me7_interrupt_mask ; /**< @brief me7core的中断掩码*/ + ZXIC_UINT32 me6_interrupt_mask ; /**< @brief me6core的中断掩码*/ + ZXIC_UINT32 me5_interrupt_mask ; /**< @brief me5core的中断掩码*/ + ZXIC_UINT32 me4_interrupt_mask ; /**< @brief me4core的中断掩码*/ + ZXIC_UINT32 me3_interrupt_mask ; /**< @brief me3core的中断掩码*/ + ZXIC_UINT32 me2_interrupt_mask ; /**< @brief me2core的中断掩码*/ + ZXIC_UINT32 me1_interrupt_mask ; /**< @brief me1core的中断掩码*/ + ZXIC_UINT32 me0_interrupt_mask ; /**< @brief me0core的中断掩码*/ + +}DPP_PPU_ME_INTERRUPT_T; + +/** cluster mex的错误中断原因*/ +typedef struct dpp_ppu_cluster_600m_mex_fifo_int_t +{ + ZXIC_UINT32 ppu_se_ikey_afifo_underflow; /**< @brief se片内表key fifo读空中断*/ + ZXIC_UINT32 ppu_se_ekey_afifo_underflow; /**< @brief se片外表key fifo读空中断*/ + ZXIC_UINT32 ppu_sta_key_afifo_underflow; /**< @brief 统计计数key fifo读空中断*/ + ZXIC_UINT32 ppu_cluster_mf_in_overflow; /**< @brief metafram接收 fifo满写中断*/ + ZXIC_UINT32 ppu_ese_rsp_afifo_overflow; /**< @brief se片外表 rsp fifo满写中断*/ + ZXIC_UINT32 ppu_ise_rsp_afifo_overflow; /**< @brief se片内表 rsp fifo满写中断*/ + ZXIC_UINT32 ppu_sta_rsp_afifo_overflow; /**< @brief 统计计数 rsp fifo满写中断*/ +}DPP_PPU_CLUSTER_600M_MEX_FIFO_INT_T; + +/** cluster mex的错误中断原因*/ +typedef struct dpp_ppu_cluster_1200m_mex_fifo_int_t +{ + ZXIC_UINT32 ppu_se_key_afifo_32x54_wrapper_overflow_flag; /**< @brief ppu_se_key_afifo_32x54_wrapper满写中断掩码*/ + ZXIC_UINT32 ppu_se_key_afifo_32x665_wrapper_overflow_flag; /**< @brief ppu_se_key_afifo_32x665_wrapper满写中断掩码*/ + ZXIC_UINT32 ppu_sta_key_afifo_32x110_wrapper_overflow_flag; /**< @brief ppu_sta_key_afifo_32x110_wrapper满写中断掩码*/ + ZXIC_UINT32 ppu_cluster_mf_in_afifo_16x2048_wrapper_underflow_flag; /**< @brief ppu_cluster_mf_in_afifo_32x2048_wrapper读空中断掩码*/ + ZXIC_UINT32 ppu_pbu_mcode_pf_rsp_fifo_32x13_wrapper_overflow_flag; /**< @brief ppu_pbu_mcode_pf_rsp_fifo满写中断掩码*/ + ZXIC_UINT32 ppu_pbu_mcode_pf_rsp_fifo_32x13_wrapper_underflow_flag; /**< @brief ppu_pbu_mcode_pf_rsp_fifo_32x13_wrapper读空中断掩码*/ + ZXIC_UINT32 ppu_coprocess_rsp_fifo_32x77_wrapper_overflow_flag; /**< @brief ppu_coprocess_rsp_fifo_32x77_wrapper满写中断掩码*/ + ZXIC_UINT32 ppu_coprocess_rsp_fifo_32x77_wrapper_underflow_flag; /**< @brief ppu_coprocess_rsp_fifo_32x77_wrapper读空中断掩码*/ + ZXIC_UINT32 ppu_coprocess_rsp_fwft_fifo_128x78_wrapper_overflow_flag; /**< @brief ppu_coprocess_rsp_fwft_fifo_128x78_wrapper满写中断掩码*/ + ZXIC_UINT32 ppu_coprocess_rsp_fwft_fifo_128x78_wrapper_underflow_flag; /**< @brief ppu_coprocess_rsp_fwft_fifo_128x78_wrapper读空中断掩码*/ + ZXIC_UINT32 ppu_ese_rsp_afifo_64x271_wrapper_u0_underflow_flag; /**< @brief ppu_ese_rsp_afifo_64x271_wrapper_u0满写中断掩码*/ + + ZXIC_UINT32 ese_rsp_ram_free_ptr_u0_overflow_flag; /**< @brief ese_rsp_ram_free_ptr_u0满写中断掩码*/ + ZXIC_UINT32 ese_rsp_ram_free_ptr_u0_underflow_flag; /**< @brief ese_rsp_ram_free_ptr_u0读空中断掩码*/ + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u0_overflow_flag; /**< @brief ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u0满写中断掩码*/ + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u0_underflow_flag; /**< @brief ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u0读空中断掩码*/ + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u1_overflow_flag; /**< @brief ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u1满写中断掩码*/ + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u1_underflow_flag; /**< @brief ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u1读空中断掩码*/ + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u2_overflow_flag; /**< @brief ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u2满写中断掩码*/ + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u2_underflow_flag; /**< @brief ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u2读空中断掩码*/ + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u3_overflow_flag; /**< @brief ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u3满写中断标记*/ + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u3_underflow_flag; /**< @brief ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u3读空中断标记*/ + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u4_overflow_flag; /**< @brief ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u4满写中断标记*/ + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u4_underflow_flag; /**< @brief ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u4读空中断标记*/ + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u5_overflow_flag; /**< @brief ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u5满写中断标记*/ + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u5_underflow_flag; /**< @brief ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u5读空中断标记*/ + ZXIC_UINT32 ppu_ise_rsp_afifo_64x143_wrapper_u0_underflow_flag; /**< @brief ppu_ise_rsp_afifo_64x143_wrapper_u0读空中断标记*/ + ZXIC_UINT32 ise_rsp_ram_free_ptr_u0_overflow_flag; /**< @brief ise_rsp_ram_free_ptr_u0满写中断标记 */ + ZXIC_UINT32 ise_rsp_ram_free_ptr_u0_underflow_flag; /**< @brief ise_rsp_ram_free_ptr_u0读空中断标记*/ + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u0_overflow_flag; /**< @brief ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u0满写中断标记*/ + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u0_underflow_flag; /**< @brief ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u0读空中断标记*/ + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u1_overflow_flag; /**< @brief ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u1满写中断标记*/ + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u1_underflow_flag; /**< @brief ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u1读空中断标记*/ + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u2_overflow_flag; /**< @brief ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u2满写中断标记*/ + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u2_underflow_flag; /**< @brief ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u2读空中断标记*/ + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u3_overflow_flag; /**< @brief ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u3满写中断标记*/ + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u3_underflow_flag; /**< @brief ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u3读空中断标记*/ + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u4_overflow_flag; /**< @brief ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u4满写中断标记*/ + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u4_underflow_flag; /**< @brief ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u4读空中断标记*/ + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u5_overflow_flag; /**< @brief ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u5满写中断标记*/ + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u5_underflow_flag; /**< @brief ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u5读空中断标记*/ + ZXIC_UINT32 ppu_sta_rsp_afifo_64x79_wrapper_underflow_flag; /**< @brief ppu_sta_rsp_afifo_64x79_wrapper读空中断标记*/ + ZXIC_UINT32 ppu_sta_rsp_fwft_fifo_128x79_wrapper_overflow_flag; /**< @brief ppu_sta_rsp_fwft_fifo_128x79_wrapper满写中断标记*/ + ZXIC_UINT32 ppu_sta_rsp_fwft_fifo_128x79_wrapper_underflow_flag; /**< @brief ppu_sta_rsp_fwft_fifo_128x79_wrapper读空中断标记*/ +}DPP_PPU_CLUSTER_1200M_MEX_FIFO_INT_T; + +typedef struct dpp_ppu_ppu_ram_err_t +{ + ZXIC_UINT32 dup_freeptr_fwft_fifo_128x7_wrapper_u0_parity_err_flag; /**< @brief dup_freeptr_fwft_fifo_128x7_wrapper_u0_parity_err中断标记*/ + ZXIC_UINT32 free_global_num_fwft_fifo_8192x13_wrapper_u0_parity_err_flag; /**< @brief free_global_num_fwft_fifo_8192x13_wrapper_u0_parity_err中断标记*/ + ZXIC_UINT32 ppu_mccnt_fifo_32x15_wrapper_u0_parity_err_flag; /**< @brief ppu_mccnt_fifo_32x15_wrapper_u0_parity_err中断标记*/ + ZXIC_UINT32 ppu_reorder_link_table_ram_1r1w_8192x13_wrapper_u1_parity_err_flag; /**< @brief ppu_reorder_link_table_ram_1r1w_8192x13_wrapper_u1_parity_err中断标记*/ + ZXIC_UINT32 ppu_reorder_link_table_ram_1r1w_8192x13_wrapper_u0_parity_err_flag; /**< @brief ppu_reorder_link_table_ram_1r1w_8192x13_wrapper_u0_parity_err中断标记*/ +}DPP_PPU_PPU_RAM_ERR_T; + +typedef struct dpp_ppu_cls_ram_err_600m_t +{ + ZXIC_UINT32 ppu_sdt_table_ram_2rw_256x64_wrapper_parity_errb_flag; /**< @brief ppu_sdt_table_ram_2rw_256x64_wrapper_parity_errb中断标记*/ + ZXIC_UINT32 ppu_sdt_table_ram_2rw_256x64_wrapper_parity_erra_flag; /**< @brief ppu_sdt_table_ram_2rw_256x64_wrapper_parity_errba中断标记*/ +}DPP_PPU_CLS_RAM_ERR_600M_T; + +/** cluster mex的错误中断原因*/ +typedef struct dpp_ppu_cluster_me_fifo_int_t +{ + ZXIC_UINT32 me_except_refetch_pc_overflow_flag; /**< @brief me_except_refetch_pc满写中断标记*/ + ZXIC_UINT32 me_except_refetch_pc_underflow_flag; /**< @brief me_except_refetch_pc读空中断标记*/ + + ZXIC_UINT32 me_free_pkt_q_overflow_flag; /**< @brief me_free_pkt_q满写中断状态*/ + ZXIC_UINT32 me_free_pkt_q_underflow_flag; /**< @brief me_free_pkt_q读空中断状态*/ + ZXIC_UINT32 me_free_thread_q_overflow_flag; /**< @brief me_free_thread_q满写中断状态*/ + ZXIC_UINT32 me_free_thread_q_underflow_flag; /**< @brief me_free_thread_q读空中断状态*/ + ZXIC_UINT32 me_pkt_in_overflow_flag; /**< @brief me_pkt_in_满写中断状态*/ + ZXIC_UINT32 me_pkt_in_underflow_flag; /**< @brief me_pkt_in_读空中断状态*/ + ZXIC_UINT32 me_rdy_q_overflow_flag; /**< @brief me_rdy_q满写中断状态*/ + ZXIC_UINT32 me_rdy_q_underflow_flag; /**< @brief me_rdy_q读空中断状态*/ + ZXIC_UINT32 me_pkt_out_q_overflow_flag; /**< @brief me_pkt_out_q满写中断状态*/ + ZXIC_UINT32 me_pkt_out_q_underflow_flag; /**< @brief me_pkt_out_q读空中断状态*/ + ZXIC_UINT32 me_continue_q_overflow_flag; /**< @brief me_continue_q满写中断状态*/ + ZXIC_UINT32 me_continue_q_underflow_flag; /**< @brief me_continue_q读空中断状态*/ + ZXIC_UINT32 me_esrh_q_overflow_flag; /**< @brief me_esrh_q满写中断状态*/ + ZXIC_UINT32 me_esrh_q_underflow_flag; /**< @brief me_esrh_q读空中断状态*/ + ZXIC_UINT32 me_isrh_q_overflow_flag; /**< @brief me_isrh_q满写中断状态*/ + ZXIC_UINT32 me_isrh_q_underflow_flag; /**< @brief me_isrh_q读空中断状态*/ + ZXIC_UINT32 me_cache_miss_q_overflow_flag; /**< @brief me_cache_miss_q满写中断状态*/ + ZXIC_UINT32 me_cache_miss_q_underflow_flag; /**< @brief me_cache_miss_q读空中断状态*/ + ZXIC_UINT32 me_base_q_u0_overflow_flag; /**< @brief me_base_q_u0满写中断状态*/ + ZXIC_UINT32 me_base_q_u0_underflow_flag; /**< @brief me_base_q_u0读空中断状态*/ + ZXIC_UINT32 me_base_q_u1_overflow_flag; /**< @brief me_base_q_u1满写中断状态*/ + ZXIC_UINT32 me_base_q_u1_underflow_flag; /**< @brief me_base_q_u1读空中断状态*/ + ZXIC_UINT32 me_base_q_u2_overflow_flag; /**< @brief me_base_q_u2满写中断状态*/ + ZXIC_UINT32 me_base_q_u2_underflow_flag; /**< @brief me_base_q_u2读空中断状态*/ + ZXIC_UINT32 me_base_q_u3_overflow_flag; /**< @brief me_base_q_u3满写中断状态*/ + ZXIC_UINT32 me_base_q_u3_underflow_flag; /**< @brief me_base_q_u3读空中断状态*/ + ZXIC_UINT32 me_reg_pc_q_overflow_flag; /**< @brief me_reg_pc_q满写中断状态*/ + ZXIC_UINT32 me_reg_pc_q_underflow_flag; /**< @brief me_reg_pc_q读空中断状态*/ + ZXIC_UINT32 me_branch_q_overflow_flag; /**< @brief me_branch_q满写中断状态*/ + ZXIC_UINT32 me_branch_q_underflow_flag; /**< @brief me_branch_q读空中断状态*/ + ZXIC_UINT32 me_pkt_base_q_overflow_flag; /**< @brief me_pkt_base_q满写中断状态*/ + ZXIC_UINT32 me_pkt_base_q_underflow_flag; /**< @brief me_pkt_base_q读空中断状态*/ +}DPP_PPU_CLUSTER_ME_FIFO_INT_T; + + +typedef struct dpp_ppu_ppu_isu_ppu_demux_fifo_int_t +{ + ZXIC_UINT32 isu_in_para_fwft_fifo_32x81_wrapper_u0_overflow_flag; /**< @brief isu_in_para_fwft_fifo_32x81_wrapper_u0_overflow中断标记*/ + ZXIC_UINT32 isu_in_para_fwft_fifo_32x81_wrapper_u0_underflow_flag; /**< @brief isu_in_para_fwft_fifo_32x81_wrapper_u0_underflow中断标记*/ + ZXIC_UINT32 isu_in_fifo_64x81_wrapper_u0_overflow_flag; /**< @brief isu_in_fifo_64x81_wrapper_u0_overflow中断标记*/ + ZXIC_UINT32 isu_in_fifo_64x81_wrapper_u0_underflow_flag; /**< @brief isu_in_fifo_64x81_wrapper_u0_underflow中断标记*/ +}DPP_PPU_PPU_ISU_PPU_DEMUX_FIFO_INT_T; + +typedef struct dpp_ppu_ppu_ppu_multicast_fifo_int_t +{ + ZXIC_UINT32 pf_req_fwft_fifo_16x36_wrapper_u0_overflow_flag; /**< @brief pf_req_fwft_fifo_16x36_wrapper_u0_overflow中断标记*/ + ZXIC_UINT32 pf_req_fwft_fifo_16x36_wrapper_u0_underflow_flag; /**< @brief pf_req_fwft_fifo_16x36_wrapper_u0_underflow中断标记*/ + ZXIC_UINT32 pf_rsp_fwft_fifo_32x34_wrapper_u0_overflow_flag; /**< @brief pf_rsp_fwft_fifo_32x34_wrapper_u0_overflow中断标记*/ + ZXIC_UINT32 pf_rsp_fwft_fifo_32x34_wrapper_u0_underflow_flag; /**< @brief pf_rsp_fwft_fifo_32x34_wrapper_u0_underflow中断标记*/ + ZXIC_UINT32 dup_para_fwft_fifo_16x35_wrapper_u0_overflow_flag; /**< @brief dup_para_fwft_fifo_16x35_wrapper_u0_overflow中断标记*/ + ZXIC_UINT32 dup_para_fwft_fifo_16x35_wrapper_u0_underflow_flag; /**< @brief dup_para_fwft_fifo_16x35_wrapper_u0_underflow中断标记*/ + ZXIC_UINT32 se_mc_rsp_fwft_fifo_32x17_wrapper_u0_overflow_flag; /**< @brief se_mc_rsp_fwft_fifo_32x17_wrapper_u0_overflow中断标记*/ + ZXIC_UINT32 se_mc_rsp_fwft_fifo_32x17_wrapper_u0_underflow_flag; /**< @brief se_mc_rsp_fwft_fifo_32x17_wrapper_u0_underflow中断标记*/ + ZXIC_UINT32 sa_para_fwft_fifo_64x17_wrapper_u0_overflow_flag; /**< @brief sa_para_fwft_fifo_64x17_wrapper_u0_overflow中断标记*/ + ZXIC_UINT32 sa_para_fwft_fifo_64x17_wrapper_u0_underflow_flag; /**< @brief sa_para_fwft_fifo_64x17_wrapper_u0_underflow中断标记*/ + ZXIC_UINT32 group_id_fifo_64x16_wrapper_u0_overflow_flag; /**< @brief group_id_fifo_64x16_wrapper_u0_overflow中断标记*/ + ZXIC_UINT32 group_id_fifo_64x16_wrapper_u0_underflow_flag; /**< @brief group_id_fifo_64x16_wrapper_u0_underflow中断标记*/ + ZXIC_UINT32 isu_mc_para_fwft_fifo_128x34_wrapper_u0_overflow_flag; /**< @brief isu_mc_para_fwft_fifo_128x34_wrapper_u0_overflow中断标记*/ + ZXIC_UINT32 isu_mc_para_fwft_fifo_128x34_wrapper_u0_underflow_flag; /**< @brief isu_mc_para_fwft_fifo_128x34_wrapper_u0_underflow中断标记*/ + ZXIC_UINT32 dup_freeptr_fwft_fifo_128x7_wrapper_u0_overflow_flag; /**< @brief dup_freeptr_fwft_fifo_128x7_wrapper_u0_overflow中断标记*/ + ZXIC_UINT32 dup_freeptr_fwft_fifo_128x7_wrapper_u0_underflow_flag; /**< @brief dup_freeptr_fwft_fifo_128x7_wrapper_u0_underflow中断标记*/ + ZXIC_UINT32 car_flag_fifo_32x1_wrapper_overflow_flag; /**< @brief car_flag_fifo_32x1_wrapper_overflow中断标记*/ + ZXIC_UINT32 car_flag_fifo_32x1_wrapper_underflow_flag; /**< @brief car_flag_fifo_32x1_wrapper_underflow中断标记*/ +}DPP_PPU_PPU_PPU_MULTICAST_FIFO_INT_T; + +typedef struct dpp_ppu_ppu_ppu_in_schedule_fifo_int_t +{ + ZXIC_UINT32 free_global_num_fwft_fifo_8192x13_wrapper_u0_overflow_flag; /**< @brief free_global_num_fwft_fifo_8192x13_满写中断标记*/ + ZXIC_UINT32 free_global_num_fwft_fifo_8192x13_wrapper_u0_underflow_flag; /**< @brief free_global_num_fwft_fifo_8192x13_空读中断标记*/ + ZXIC_UINT32 mc_mf_fifo_16x2048_wrapper_u0_overflow_flag; /**< @brief mc_mf_fifo_16x2048_满写中断标记*/ + ZXIC_UINT32 mc_mf_fifo_16x2048_wrapper_u0_underflow_flag; /**< @brief mc_mf_fifo_16x2048_空读中断标记*/ + ZXIC_UINT32 uc_mf_fifo_96x2048_wrapper_u0_overflow_flag; /**< @brief uc_mf_fifo_96x2048_满写中断标记*/ + ZXIC_UINT32 uc_mf_fifo_96x2048_wrapper_u0_underflow_flag; /**< @brief uc_mf_fifo_96x2048_空读中断标记*/ +}DPP_PPU_PPU_PPU_IN_SCHEDULE_FIFO_INT_T; + +typedef struct dpp_ppu_ppu_ppu_mf_out_fifo_int_t +{ + ZXIC_UINT32 ppu_cluster5_mf_out_afifo_16x2048_wrapper_overflow_flag; /**< @brief cluster5发送描述符fifo满写中断标记*/ + ZXIC_UINT32 ppu_cluster5_mf_out_afifo_16x2048_wrapper_underflow_flag; /**< @brief cluster5发送描述符fifo空读中断标记*/ + ZXIC_UINT32 ppu_cluster4_mf_out_afifo_16x2048_wrapper_overflow_flag; /**< @brief cluster4发送描述符fifo满写中断标记*/ + ZXIC_UINT32 ppu_cluster4_mf_out_afifo_16x2048_wrapper_underflow_flag; /**< @brief cluster4发送描述符fifo空读中断标记*/ + ZXIC_UINT32 ppu_cluster3_mf_out_afifo_16x2048_wrapper_overflow_flag; /**< @brief cluster3发送描述符fifo满写中断标记*/ + ZXIC_UINT32 ppu_cluster3_mf_out_afifo_16x2048_wrapper_underflow_flag; /**< @brief cluster3发送描述符fifo空读中断标记*/ + ZXIC_UINT32 ppu_cluster2_mf_out_afifo_16x2048_wrapper_overflow_flag; /**< @brief cluster2发送描述符fifo满写中断标记*/ + ZXIC_UINT32 ppu_cluster2_mf_out_afifo_16x2048_wrapper_underflow_flag; /**< @brief cluster2发送描述符fifo空读中断标记*/ + ZXIC_UINT32 ppu_cluster1_mf_out_afifo_16x2048_wrapper_overflow_flag; /**< @brief cluster1发送描述符fifo满写中断标记*/ + ZXIC_UINT32 ppu_cluster1_mf_out_afifo_16x2048_wrapper_underflow_flag; /**< @brief cluster1发送描述符fifo空读中断标记*/ + ZXIC_UINT32 ppu_cluster0_mf_out_afifo_16x2048_wrapper_overflow_flag; /**< @brief cluster0发送描述符fifo满写中断标记*/ + ZXIC_UINT32 ppu_cluster0_mf_out_afifo_16x2048_wrapper_underflow_flag; /**< @brief cluster0发送描述符fifo空读中断标记*/ +}DPP_PPU_PPU_PPU_MF_OUT_FIFO_INT_T; + +typedef struct dpp_ppu_ppu_pbu_mcode_pf_req_schedule_fifo_int_t +{ + ZXIC_UINT32 ppu_cluster5_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_flag; /**< @brief cluster5指针预取fifo满写中断标记*/ + ZXIC_UINT32 ppu_cluster4_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_flag; /**< @brief cluster4指针预取fifo满写中断标记*/ + ZXIC_UINT32 ppu_cluster3_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_flag; /**< @brief cluster3指针预取fifo满写中断标记*/ + ZXIC_UINT32 ppu_cluster2_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_flag; /**< @brief cluster2指针预取fifo满写中断标记*/ + ZXIC_UINT32 ppu_cluster1_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_flag; /**< @brief cluster1指针预取fifo满写中断标记*/ + ZXIC_UINT32 ppu_cluster0_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_flag; /**< @brief cluster0指针预取fifo满写中断标记*/ + ZXIC_UINT32 ppu_cluster5_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_flag; /**< @brief cluster5指针预取fifo空读中断标记*/ + ZXIC_UINT32 ppu_cluster4_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_flag; /**< @brief cluster4指针预取fifo空读中断标记*/ + ZXIC_UINT32 ppu_cluster3_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_flag; /**< @brief cluster3指针预取fifo空读中断标记*/ + ZXIC_UINT32 ppu_cluster2_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_flag; /**< @brief cluster2指针预取fifo空读中断标记*/ + ZXIC_UINT32 ppu_cluster1_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_flag; /**< @brief cluster1指针预取fifo空读中断标记*/ + ZXIC_UINT32 ppu_cluster0_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_flag; /**< @brief cluster0指针预取fifo空读中断标记*/ +}DPP_PPU_PPU_PBU_MCODE_PF_REQ_SCHEDULE_FIFO_INT_T; + +typedef struct dpp_ppu_ppu_pbu_mcode_pf_rsp_schedule_fifo_int_t +{ + ZXIC_UINT32 ppu_pbu_mcode_pf_rsp_afifo_64x16_wrapper_u0r_underflow_flag; /**< @brief ppu微码申请指针返回fifo空读中断标记*/ + ZXIC_UINT32 ppu_pbu_mcode_pf_rsp_afifo_64x16_wrapper_u0_overflow_flag; /**< @brief ppu微码申请指针返回fifo满写中断标记*/ +}DPP_PPU_PPU_PBU_MCODE_PF_RSP_SCHEDULE_FIFO_INT_T; + +typedef struct dpp_ppu_ppu_ppu_mccnt_fifo_int_t +{ + ZXIC_UINT32 ppu_mccnt_fifo_32x15_wrapper_u0_overflow_flag; /**< @brief ppu_mccnt_fifo_32x15_wrapper_u0_overflow中断标记*/ + ZXIC_UINT32 ppu_mccnt_fifo_32x15_wrapper_u0_underflow_flag; /**< @brief ppu_mccnt_fifo_32x15_wrapper_u0_underflow中断标记*/ + ZXIC_UINT32 ppu_wb_data_fifo_32x2048_wrapper_u0_overflow_flag; /**< @brief ppu_wb_data_fifo_32x2048_wrapper_u0_overflow中断标记*/ + ZXIC_UINT32 ppu_wb_data_fifo_32x2048_wrapper_u0_underflow_flag; /**< @brief ppu_wb_data_fifo_32x2048_wrapper_u0_underflow中断标记*/ + ZXIC_UINT32 mccnt_rsp_fifo_32x1_wrapper_u0_overflow_flag; /**< @brief mccnt_rsp_fifo_32x1_wrapper_u0_overflow中断标记*/ + ZXIC_UINT32 mccnt_rsp_fifo_32x1_wrapper_u0_underflow_flag; /**< @brief mccnt_rsp_fifo_32x1_wrapper_u0_underflow中断标记*/ +}DPP_PPU_PPU_PPU_MCCNT_FIFO_INT_T; + +typedef struct dpp_ppu_ppu_coprocessor_fifo_int_t +{ + ZXIC_UINT32 ppu_cop_random_mod_para_delay_fifo_48x16_wrapper_overflow_flag; /**< @brief 协处理random_mod参数fifo错误满写中断标记*/ + ZXIC_UINT32 ppu_cop_random_mod_para_delay_fifo_48x16_wrapper_underflow_flag; /**< @brief 协处理random_mod参数fifo错误空读中断标记*/ + + ZXIC_UINT32 ppu_cop_result_fwft_fifo_80x80_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 ppu_cop_result_fwft_fifo_80x80_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 ppu_cop_delay_fifo_48x16_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 ppu_cop_delay_fifo_48x16_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 ppu_cop_delay_fifo_16x48_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 ppu_cop_delay_fifo_16x48_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 ppu_cop_delay_fifo_16x32_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 ppu_cop_delay_fifo_16x32_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 ppu_cop_result_fwft_fifo_96x80_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 ppu_cop_result_fwft_fifo_96x80_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 ppu_cop_delay_fifo_16x16_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 ppu_cop_delay_fifo_16x16_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 ppu_cop_result_fwft_fifo_32x80_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 ppu_cop_result_fwft_fifo_32x80_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 ppu_cop_result_fwft_fifo_16x80_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 ppu_cop_result_fwft_fifo_16x80_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec5_cop_key_crc_fifo_32x625_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec5_cop_key_crc_fifo_32x625_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec5_cop_key_checksum_fifo_32x180_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec5_cop_key_checksum_fifo_32x180_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec5_cop_key_mul_fifo_32x52_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec5_cop_key_mul_fifo_32x52_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec5_cop_key_random_mod_fifo_32x44_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec5_cop_key_random_mod_fifo_32x44_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec4_cop_key_crc_fifo_32x625_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec4_cop_key_crc_fifo_32x625_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec4_cop_key_checksum_fifo_32x180_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec4_cop_key_checksum_fifo_32x180_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec4_cop_key_mul_fifo_32x52_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec4_cop_key_mul_fifo_32x52_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec4_cop_key_random_mod_fifo_32x44_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec4_cop_key_random_mod_fifo_32x44_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + + ZXIC_UINT32 mec3_cop_key_crc_fifo_32x625_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec3_cop_key_crc_fifo_32x625_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec3_cop_key_checksum_fifo_32x180_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec3_cop_key_checksum_fifo_32x180_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec3_cop_key_mul_fifo_32x52_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec3_cop_key_mul_fifo_32x52_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec3_cop_key_random_mod_fifo_32x44_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec3_cop_key_random_mod_fifo_32x44_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec2_cop_key_crc_fifo_32x625_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec2_cop_key_crc_fifo_32x625_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec2_cop_key_checksum_fifo_32x180_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec2_cop_key_checksum_fifo_32x180_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec2_cop_key_mul_fifo_32x52_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec2_cop_key_mul_fifo_32x52_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec2_cop_key_random_mod_fifo_32x44_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec2_cop_key_random_mod_fifo_32x44_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec1_cop_key_crc_fifo_32x625_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec1_cop_key_crc_fifo_32x625_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec1_cop_key_checksum_fifo_32x180_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec1_cop_key_checksum_fifo_32x180_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec1_cop_key_mul_fifo_32x52_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec1_cop_key_mul_fifo_32x52_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec1_cop_key_random_mod_fifo_32x44_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec1_cop_key_random_mod_fifo_32x44_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec0_cop_key_crc_fifo_32x625_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec0_cop_key_crc_fifo_32x625_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec0_cop_key_checksum_fifo_32x180_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec0_cop_key_checksum_fifo_32x180_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec0_cop_key_mul_fifo_32x52_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec0_cop_key_mul_fifo_32x52_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec0_cop_key_random_mod_fifo_32x44_wrapper_overflow_flag; /**< @brief fifo错误中断标记*/ + ZXIC_UINT32 mec0_cop_key_random_mod_fifo_32x44_wrapper_underflow_flag; /**< @brief fifo错误中断标记*/ +}DPP_PPU_PPU_COPROCESSOR_FIFO_INT_T; + + +typedef struct dpp_ppu_ppu_cos_meter_cfg_t +{ + ZXIC_UINT32 cbs; /**< @brief 0~7队列CBS配置*/ + ZXIC_UINT32 pbs; /**< @brief 0~7队列PBS配置*/ + ZXIC_UINT32 green_action; /**< @brief 0~7队列绿色报文动作配置,关闭CAR使能的时候,需要同时将该动作置为1*/ + ZXIC_UINT32 yellow_action; /**< @brief 0~7队列黄色报文动作配置*/ + ZXIC_UINT32 red_action; /**< @brief 0~7队列红色报文动作配置*/ + ZXIC_UINT32 cir; /**< @brief 0~7队列CIR配置,单位Mpps,0x24a对应600Mpps,按照线性变化*/ + ZXIC_UINT32 pir; /**< @brief 0~7队列PIR配置,单位Mpps,0x24a对应600Mpps,按照线性变化*/ + ZXIC_UINT32 car_en; /**< @brief 0~7队列CAR使能配置*/ +}DPP_PPU_PPU_COS_METER_CFG_T; + +#endif + +/***********************************************************/ +/** 配置SDT表 +* @param dev_id 设备号,范围0~3 +* @param cluster_id me cluster编号,范围0~7 +* @param index 地址,即sdt表号,范围0~255 +* @param p_sdt_data sdt表数据 +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/03/18 +************************************************************/ +DPP_STATUS dpp_ppu_sdt_tbl_write(DPP_DEV_T *dev, ZXIC_UINT32 cluster_id, ZXIC_UINT32 index, DPP_SDT_TBL_DATA_T *p_sdt_data); + +#endif /* dpp_ppu_api.h */ diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_reg_api.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_reg_api.h new file mode 100755 index 0000000..b87c69e --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_reg_api.h @@ -0,0 +1,183 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_reg.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : wcl +* 完成日期 : 2014/02/12 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef _DPP_REG_API_H_ +#define _DPP_REG_API_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "dpp_dev.h" +#include "dpp_reg_struct.h" + +/** 所有上层模块不需要直接使用该全局变量*/ +extern DPP_REG_T g_dpp_reg_info[]; + +/** public*/ +#define DPP_REG(no) (g_dpp_reg_info[no]) +#define DPP_REG_NAME(no) ((DPP_REG(no)).reg_name) +#define DPP_REG_NO(no) ((DPP_REG(no)).reg_no) +#define DPP_REG_MODULE_NO(no) ((DPP_REG(no)).module_no) +#define DPP_REG_FLAGS(no) ((DPP_REG(no)).flags) +#define DPP_REG_TYPE(no) ((DPP_REG(no)).array_type) +#define DPP_REG_ADDR(no) ((DPP_REG(no)).addr) +#define DPP_REG_WIDTH(no) ((DPP_REG(no)).width) +#define DPP_REG_M_SIZE(no) ((DPP_REG(no)).m_size) +#define DPP_REG_N_SIZE(no) ((DPP_REG(no)).n_size) +#define DPP_REG_M_STEP(no) ((DPP_REG(no)).m_step) +#define DPP_REG_N_STEP(no) ((DPP_REG(no)).n_step) +#define DPP_REG_FIELD_NUM(no) ((DPP_REG(no)).field_num) +#define DPP_REG_FIELD_NAME(no, field_no) (((DPP_REG(no)).p_fields+field_no)->p_name) + +typedef enum dpp_bar_4k_e +{ + BAR_4K_DTB = 0, /**< @brief 0*/ + BAR_4K_ETCAM, /**< @brief 1*/ + BAR_4K_CLS0, /**< @brief 2*/ + BAR_4K_CLS1, /**< @brief 3*/ + BAR_4K_CLS2, /**< @brief 4*/ + BAR_4K_CLS3, /**< @brief 5*/ + BAR_4K_CLS4, /**< @brief 6*/ + BAR_4K_CLS5, /**< @brief 7*/ + BAR_4K_SE, /**< @brief 8*/ + BAR_4K_SMMU1, /**< @brief 9*/ + BAR_4K_MAX +} DPP_BAR_4K_E; + +typedef struct +{ + ZXIC_UINT32 reg_module; /*DPP_MODULE_E*/ + ZXIC_UINT32 index_4k; /*BAR NP空间映射4K相对索引*/ + ZXIC_UINT32 addr_offset; /*寄存器偏移,用于计算BAR映射空间位置*/ +}DPP_REG_OFFSET_ADDR; + +/***********************************************************/ +/** 获取寄存器属性 +* @param reg_no 寄存器编号 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 王春雷 @date 2014/04/17 +************************************************************/ +DPP_REG_T* dpp_reg_info_get(ZXIC_UINT32 reg_no); + +/***********************************************************/ +/** 通用寄存器写函数 +* @param dev_id 设备号,支持多芯片 +* @param reg_no 寄存器编号 +* @param m_offset 二元寄存器的m偏移 +* @param n_offset 一元寄存器或二元寄存器的n偏移 +* @param p_data 数据指针 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 王春雷 @date 2014/02/12 +************************************************************/ +DPP_STATUS dpp_reg_write(DPP_DEV_T *dev, ZXIC_UINT32 reg_no, ZXIC_UINT32 m_offset, ZXIC_UINT32 n_offset, ZXIC_VOID *p_data); + +/***********************************************************/ +/** 通用寄存器读函数 +* @param dev_id 设备号,支持多芯片 +* @param reg_no 寄存器编号 +* @param m_offset 二元寄存器的m偏移 +* @param n_offset 一元寄存器或二元寄存器的n偏移 +* @param p_data 数据指针 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 王春雷 @date 2014/02/12 +************************************************************/ +DPP_STATUS dpp_reg_read(DPP_DEV_T *dev, ZXIC_UINT32 reg_no, ZXIC_UINT32 m_offset, ZXIC_UINT32 n_offset, ZXIC_VOID *p_data); + +/***********************************************************/ +/** 根据寄存器编号获得寄存器芯片内绝对地址 +* @param reg_no +* @param m_offset +* @param n_offset +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/03/19 +************************************************************/ +ZXIC_UINT32 dpp_reg_get_reg_addr(ZXIC_UINT32 reg_no, ZXIC_UINT32 m_offset, ZXIC_UINT32 n_offset); + +/***********************************************************/ +/** 通过寄存器编号配置寄存器,仅适用于32bit位宽 + 的常规寄存器 +* @param dev_id 设备号 +* @param reg_no 寄存器编号 +* @param m_offset 二元寄存器的m偏移 +* @param n_offset 一元寄存器或二元寄存器的n偏移 +* @param data 数据,32bit +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 王春雷 @date 2015/01/21 +************************************************************/ +DPP_STATUS dpp_reg_write32(DPP_DEV_T *dev, ZXIC_UINT32 reg_no, ZXIC_UINT32 data); + +/***********************************************************/ +/** 通过寄存器编号读取寄存器的值,仅适用于32bit位宽的常规寄存器 +* @param dev_id 设备号 +* @param reg_no 寄存器编号 +* @param m_offset 二元寄存器的m偏移 +* @param n_offset 一元寄存器或二元寄存器的n偏移 +* @param p_data 出参,返回读取寄存器数值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 石金锋 @date 2015/03/09 +************************************************************/ +DPP_STATUS dpp_reg_read32(DPP_DEV_T *dev, ZXIC_UINT32 reg_no, ZXIC_UINT32 m_offset, ZXIC_UINT32 n_offset, ZXIC_UINT32 *p_data); +/***********************************************************/ +/** 判断是否为4K寄存器 +* @param reg_module +* +* @return +* @remark 无 +* @see +* @author cq @date 2023/11/29 +************************************************************/ +BOOLEAN dpp_4k_reg(ZXIC_UINT32 reg_module); +/***********************************************************/ +/** 获取NP对应模块的映射地址偏移(riscv或者非4K寄存器不做转换,host根据映射情况做转换) +* @param dev_id +* @param reg_module +* @param flags 标志位,DPP_REG_FLAG_INDIRECT DPP_REG_FLAG_DIRECT +* @param addr +* +* @return 映射地址 +* @remark 无 +* @see +* @author cq @date 2023/11/29 +************************************************************/ +ZXIC_UINT32 dpp_reg_addr_convert(ZXIC_UINT32 dev_id, ZXIC_UINT32 reg_module,ZXIC_UINT32 flags, ZXIC_UINT32 addr); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_se_api.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_se_api.h new file mode 100755 index 0000000..db5715c --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_se_api.h @@ -0,0 +1,1386 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_se_api.h +* 文件标识 : se模块对外数据类型定义和接口函数声明 +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : wcl +* 完成日期 : 2015/01/30 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ +#ifndef _DPP_SE_API_H_ +#define _DPP_SE_API_H_ + +#if ZXIC_REAL("header file") + #include "dpp_type_api.h" /* xcx_0619 */ +#endif + +#if ZXIC_REAL("data struct define") + +/** DPP+ 所有eram block 大小都变为2M ~深度是16K */ +#define SE_SMMU0_ERAM_BLOCK_NUM (32) +#define SE_SMMU0_ERAM_ADDR_NUM_PER_BLOCK (0x4000) +#define SE_SMMU0_ERAM_ADDR_NUM_TOTAL (SE_SMMU0_ERAM_BLOCK_NUM * SE_SMMU0_ERAM_ADDR_NUM_PER_BLOCK) + +#define DPP_DDR4_PER_BANK_BADDR_SETP (0x800)/* 8G X16 */ +#define DPP_DDR4_BANK_NUM (64) +#define DPP_DDR4_PER_BANK_BADDR_CONV(ddr4_phy_type) \ + (DPP_DDR4_PER_BANK_BADDR_SETP*(4U>>ddr4_phy_type)) + +/*普通上送上送类型*/ +typedef enum dpp_dma_ecc_en_e +{ + DMA_ECC_DISABLE = 0, + DMA_ECC_ENABLE = 1, +} DPP_DMA_ECC_EN_E; + +/** eRam表读请模式 */ +typedef enum dpp_eram128_rd_clr_mode_e +{ + RD_MODE_HOLD = 0, /**< @brief 正常读,读完数据不清空 */ + RD_MODE_CLEAR = 1, /**< @brief 读清模式,返回eram中的值 */ +} DPP_ERAM128_RD_CLR_MODE_E; + +/** eRam表cpu读写位宽模式*/ +typedef enum dpp_eram128_opr_mode_e +{ + ERAM128_OPR_128b = 0, /**< @brief 128bit模式读写eRam, 支持128bit读清模式*/ + ERAM128_OPR_64b = 1, /**< @brief 64bit模式读写eRam, 支持64bit 读清模式*/ + ERAM128_OPR_1b = 2, /**< @brief 1bit模式读写eRam, 不支持1bit 读清模式*/ + ERAM128_OPR_32b = 3 /**< @brief 32bit模式读eRam, 不能用于写,支持32bit 读清模式*/ +} DPP_ERAM128_OPR_MODE_E; + +/** eRam直接表位宽模式,也可用于eRam做结果表时的位宽 */ +typedef enum dpp_eram128_tbl_mode_e +{ + ERAM128_TBL_1b = 0, /**< @brief 1bit eRam片内直接表 */ + ERAM128_TBL_32b = 1, /**< @brief 32bit eRam片内直接表 */ + ERAM128_TBL_64b = 2, /**< @brief 64bit eRam片内直接表 */ + ERAM128_TBL_128b = 3, /**< @brief 128bit eRam片内直接表 */ + ERAM128_TBL_2b = 4, /**< @brief 2bit eRam片内直接表 */ + ERAM128_TBL_4b = 5, /**< @brief 4bit eRam片内直接表 */ + ERAM128_TBL_8b = 6, /**< @brief 8bit eRam片内直接表 */ + ERAM128_TBL_16b = 7 /**< @brief 16bit eRam片内直接表 */ +} DPP_ERAM128_TBL_MODE_E; + +/** eRam查表通道*/ +typedef enum smmu0_empty_type_e +{ + SMMU0_EMPTY_CLS0 = 0, /**< @brief PPU cluster0通道*/ + SMMU0_EMPTY_CLS1 = 1, /**< @brief PPU cluster1通道*/ + SMMU0_EMPTY_CLS2 = 2, /**< @brief PPU cluster2通道*/ + SMMU0_EMPTY_CLS3 = 3, /**< @brief PPU cluster3通道*/ + SMMU0_EMPTY_CLS4 = 4, /**< @brief PPU cluster4通道*/ + SMMU0_EMPTY_CLS5 = 5, /**< @brief PPU cluster5通道*/ + SMMU0_EMPTY_CLS6 = 6, /**< @brief PPU cluster6通道*/ + SMMU0_EMPTY_CLS7 = 7, /**< @brief PPU cluster7通道*/ + SMMU0_EMPTY_MCAST = 8, /**< @brief 组播复制表通道*/ + SMMU0_EMPTY_ODMA = 9, /**< @brief ODMA保序计数通道*/ +} SMMU0_EMPTY_TYPE_E; + +/** 组播报文类型*/ +typedef enum smmu0_mcast_tbl_type_e +{ + MCAST_TDM = 0, /**< @brief TDM组播报文*/ + MCAST_DATA = 1, /**< @brief 数据组播报文*/ + + MCAST_INVALID, /**< @brief 无效值 */ +} SMMU0_MCAST_TBL_TYPE_E; + +/** 调试计数读清模式 */ +typedef enum se_dbg_cnt_read_mode_e +{ + SE_DBG_CNT_READ_UNCLR = 0, /**< @brief 非读清模式 */ + SE_DBG_CNT_READ_CLR, /**< @brief 读清模式 */ +} SE_DBG_CNT_READ_MODE_E; + +/** 调试计数溢出模式 */ +typedef enum se_dbg_cnt_overflow_mode_e +{ + SE_DBG_CNT_OVERFLOW_UNREVERSE = 0, /**< @brief 溢出保持 */ + SE_DBG_CNT_OVERFLOW_REVERSE, /**< @brief 溢出翻转 */ +} SE_DBG_CNT_OVERFLOW_MODE_E; + +/** DDR颗粒类型*/ +typedef enum se_ddr_phy_cfg_type_e +{ + DPP_SE_DDR_PHY_32G_16 = 0, /**< @brief DDR颗粒每组32G容量,x16颗粒*/ + DPP_SE_DDR_PHY_16G_16, /**< @brief DDR颗粒每组16G容量,x16颗粒*/ + DPP_SE_DDR_PHY_8G_16, /**< @brief DDR颗粒每组8G容量,x16颗粒*/ + DPP_SE_DDR_PHY_4G_16, /**< @brief DDR颗粒每组4G容量,x16颗粒*/ + DPP_SE_DDR_PHY_32G_8, /**< @brief DDR颗粒每组32G容量,x8颗粒*/ + DPP_SE_DDR_PHY_16G_8, /**< @brief DDR颗粒每组16G容量,x8颗粒*/ + DPP_SE_DDR_PHY_8G_8, /**< @brief DDR颗粒每组8G容量,x8颗粒*/ + DPP_SE_DDR_PHY_4G_8, /**< @brief DDR颗粒每组4G容量,x8颗粒*/ + DPP_SE_DDR_PHY_MAX, +} SE_DDR_PHY_CFG_TYPE_E; + +/** DDR表写数据位宽模式*/ +typedef enum smmu1_ddr_wrt_mode_e +{ + SMMU1_DDR_WRT_128b = 0, /**< @brief 128bit模式写DDR*/ + SMMU1_DDR_WRT_256b = 1, /**< @brief 256bit模式写DDR*/ + SMMU1_DDR_WRT_384b = 2, /**< @brief 384bit模式写DDR*/ + SMMU1_DDR_WRT_512b = 3, /**< @brief 512bit模式写DDR*/ +} SMMU1_DDR_WRT_MODE_E; + +/** DDR表的共享模式 */ +typedef enum smmu1_ddr_share_mode_e +{ + SMMU1_DDR_SHARE_NO_SHARE = 0, /**< @brief SE 占用整个DDR*/ + SMMU1_DDR_SHARE_1_2 = 1, /**< @brief SE 占用1/2 DDR*/ + SMMU1_DDR_SHARE_1_4 = 2, /**< @brief SE 占用1/4 DDR*/ + SMMU1_DDR_SHARE_1_8 = 3, /**< @brief SE 占用1/8 DDR*/ + SMMU1_DDR_SHARE_MAX +} SMMU1_DDR_SHARE_MODE_E; + +/** 占用smmu1的表类型 */ +typedef enum smmu1_ddr_tbl_type_e +{ + SMMU1_DDR_TBL_TYPE_DIR_TBL = 0, /**< @brief 片外直接表 */ + SMMU1_DDR_TBL_TYPE_HASH_TBL = 1, /**< @brief HASH占用表 */ + SMMU1_DDR_TBL_TYPE_LPM_TBL = 2, /**< @brief LPM 占用表 */ + SMMU1_DDR_TBL_TYPE_OAM_TBL = 3, /**< @brief OAM 占用表 */ + SMMU1_DDR_TBL_TYPE_FTM_TBL = 4, /**< @brief FTM 占用表 */ + SMMU1_DDR_TBL_TYPE_ETM_TBL = 5, /**< @brief ETM 占用表 */ + SMMU1_DDR_TBL_TYPE_MAX +} SMMU1_DDR_TBL_TYPE_E; + +typedef enum cmmu_rd_mode_e +{ + CMMU_RD_MODE_29_35 = 0, + CMMU_RD_MODE_32 = 1, + CMMU_RD_MODE_64 = 2, + CMMU_RD_MODE_128 = 3, + CMMU_RD_MODE_MAX, +} CMMU_RD_OPR_MODE_E; + +/** CMMU读请模式 */ +typedef enum cmmu_rd_clr_mode_e +{ + CMMU_RD_CLR_MODE_UNCLR = 0, /**< @brief 正常读,读完数据不清空 */ + CMMU_RD_CLR_MODE_CLR = 1, /**< @brief 读清模式*/ + CMMU_RD_CLR_MODE_MAX, +} CMMU_RD_CLR_MODE_E; + +/** DDR表读数据位宽模式*/ +typedef enum smmu1_ddr_srh_mode_e +{ + SMMU1_DDR_SRH_128b = 0, /**< @brief 访问DDR,以128bit模式返回数据*/ + SMMU1_DDR_SRH_256b, /**< @brief 访问DDR,以256bit模式返回数据*/ + SMMU1_DDR_SRH_512b, /**< @brief 访问DDR,以512bit模式返回数据*/ + SMMU1_DDR_SRH_MAX +} SMMU1_DDR_SRH_MODE_E; + +/** DDR地址映射参数*/ +typedef struct se_ddr_addr_map_info_t +{ + ZXIC_UINT32 is_inited; /**< @brief 用于检测此结构体是否已经经过初始化 0xAA-已经初始化 其他值-未初始化 */ + ZXIC_UINT32 ddr_phy_type; /**< @brief DDR颗粒类型 0-32G,x16颗粒,1-16G,x16颗粒,2-8G,x16颗粒 */ + ZXIC_UINT32 se_use_bank_num; /**< @brief SE使用的bank数目 */ + ZXIC_UINT32 bank_used_sate[64]; /**< @brief 表示64个bank的使用状态 0-不存在 1-SE使用 2-PUB使用 3-FTM使用 4-ETM使用 */ +} SE_DDR_ADDR_MAP_INFO_T; + +/** se从ppu接收的查表请求排空状态*/ +typedef struct dpp_se_ept_flag_t +{ + ZXIC_UINT32 ppu5_ept_flag; /**< @brief se从ppu通道5接收的查表请求排空状态*/ + ZXIC_UINT32 ppu4_ept_flag; /**< @brief se从ppu通道4接收的查表请求排空状态*/ + ZXIC_UINT32 ppu3_ept_flag; /**< @brief se从ppu通道3接收的查表请求排空状态*/ + ZXIC_UINT32 ppu2_ept_flag; /**< @brief se从ppu通道2接收的查表请求排空状态*/ + ZXIC_UINT32 ppu1_ept_flag; /**< @brief se从ppu通道1接收的查表请求排空状态*/ + ZXIC_UINT32 ppu0_ept_flag; /**< @brief se从ppu通道0接收的查表请求排空状态*/ +} DPP_SE_EPT_FLAG_T; + +/** smmu0(eRam)各通道查表请求排空状态*/ +typedef struct dpp_smmu0_ept_flag_t +{ + ZXIC_UINT32 ept_flag8; /**< @brief odam请求排空状态*/ + ZXIC_UINT32 ept_flag7; /**< @brief odam tdm请求排空状态*/ + ZXIC_UINT32 ept_flag6; /**< @brief sa组播份数表请求排空状态*/ + ZXIC_UINT32 ept_flag5; /**< @brief ppu通道5查表请求排空状态*/ + ZXIC_UINT32 ept_flag4; /**< @brief ppu通道4查表请求排空状态*/ + ZXIC_UINT32 ept_flag3; /**< @brief ppu通道3查表请求排空状态*/ + ZXIC_UINT32 ept_flag2; /**< @brief ppu通道2查表请求排空状态*/ + ZXIC_UINT32 ept_flag1; /**< @brief ppu通道1查表请求排空状态*/ + ZXIC_UINT32 ept_flag0; /**< @brief ppu通道0查表请求排空状态*/ +} DPP_SMMU0_EPT_FLAG_T; + +/** SMMU0保序FIFO写满读空中断原因*/ +typedef struct dpp_se_smmu0_int0_t +{ + ZXIC_UINT32 dma_ordfifo; /**< @brief DMA保序fifo 写满读空标志*/ + ZXIC_UINT32 odma_ordfifo; /**< @brief ODMA保序fifo 写满读空标志*/ + ZXIC_UINT32 mcast_ordfifo; /**< @brief MCAST保序fifo 写满读空标志*/ +} DPP_SE_SMMU0_INT0_T; + +/* 数据组播报文类型 */ +typedef struct data_mcast_t_ +{ + ZXIC_UINT8 valid; /**< @brief valid 表示是否可用 */ + ZXIC_UINT8 rsv; /**< @brief rsv 保留位,字节对齐使用,勿需关心 */ + ZXIC_UINT16 mc_cnt; /**< @brief mc_cnt 16bit */ +} DATA_MCAST_T; + +/* TDM 组播报文类型 */ +typedef struct tdm_mcast_t_ +{ + ZXIC_UINT8 valid; /**< @brief valid 表示是否可用 */ + ZXIC_UINT8 rsv; /**< @brief rsv 保留位,字节对齐使用,勿需关心 */ + ZXIC_UINT8 bitmap[6]; /**< @brief bitmap[0]是最高位,bitmap[2]是最低位 */ +} TDM_MCAST_T; + +#endif + +#if ZXIC_REAL("eTcam data struct define") + +#endif + +#if ZXIC_REAL("interrupt data struct define") +/** SMMU0 中断状态 */ +typedef struct dpp_se_smmu0_int_t +{ + ZXIC_UINT32 smmu0_int0; + ZXIC_UINT32 smmu0_int1; + ZXIC_UINT32 smmu0_int2; + ZXIC_UINT32 smmu0_int3; + ZXIC_UINT32 smmu0_int4; + ZXIC_UINT32 smmu0_int5; + ZXIC_UINT32 smmu0_int6; + ZXIC_UINT32 smmu0_int7; + ZXIC_UINT32 smmu0_int8; + ZXIC_UINT32 smmu0_int9; + ZXIC_UINT32 smmu0_int10; + ZXIC_UINT32 smmu0_int11; + ZXIC_UINT32 smmu0_int12; + ZXIC_UINT32 smmu0_int13; + ZXIC_UINT32 smmu0_int14; + ZXIC_UINT32 smmu0_int15; + ZXIC_UINT32 smmu0_int16; + ZXIC_UINT32 smmu0_int17; + ZXIC_UINT32 smmu0_int18; + ZXIC_UINT32 smmu0_int19; + ZXIC_UINT32 smmu0_int20; + ZXIC_UINT32 smmu0_int21; + ZXIC_UINT32 smmu0_int22; + ZXIC_UINT32 smmu0_int23; + ZXIC_UINT32 smmu0_int24; + ZXIC_UINT32 smmu0_int25; + ZXIC_UINT32 smmu0_int26; + ZXIC_UINT32 smmu0_int27; + ZXIC_UINT32 smmu0_int28; + ZXIC_UINT32 smmu0_int29; + ZXIC_UINT32 smmu0_int30; + ZXIC_UINT32 smmu0_int31; + ZXIC_UINT32 smmu0_int32; + ZXIC_UINT32 smmu0_int33; + ZXIC_UINT32 smmu0_int34; + ZXIC_UINT32 smmu0_int35; + ZXIC_UINT32 smmu0_int36; + ZXIC_UINT32 smmu0_int37; + ZXIC_UINT32 smmu0_int38; + +}DPP_SE_SMMU0_INT_T; + +/** SMMU0 模块总的中断状态 */ +typedef struct dpp_smmu0_brief_int_t +{ + ZXIC_UINT32 smmu0_int14_unmask_flag; + ZXIC_UINT32 smmu0_int13_unmask_flag; + ZXIC_UINT32 smmu0_int12_unmask_flag; + ZXIC_UINT32 smmu0_int11_unmask_flag; + ZXIC_UINT32 smmu0_int10_unmask_flag; + ZXIC_UINT32 smmu0_int9_unmask_flag; + ZXIC_UINT32 smmu0_int8_unmask_flag; + ZXIC_UINT32 smmu0_int7_unmask_flag; + ZXIC_UINT32 smmu0_int6_unmask_flag; + ZXIC_UINT32 smmu0_int5_unmask_flag; + ZXIC_UINT32 smmu0_int4_unmask_flag; + ZXIC_UINT32 smmu0_int3_unmask_flag; + ZXIC_UINT32 smmu0_int2_unmask_flag; + ZXIC_UINT32 smmu0_int1_unmask_flag; + ZXIC_UINT32 smmu0_int0_unmask_flag; +} DPP_SMMU0_BRIEF_INT_T; + +/** SE 模块总的中断状态 */ +typedef struct dpp_se_int_status_t +{ + ZXIC_UINT32 as_int_unmask_flag; /**< @brief 级联查找模块(AS)总中断状态 */ + ZXIC_UINT32 kschd_int_unmask_flag; /**< @brief 键值调度模块(KSCHD)总中断状态 */ + ZXIC_UINT32 rschd_int_unmask_flag; /**< @brief 返回调度模块(RSCHD)总中断状态 */ + ZXIC_UINT32 smmu1_int_unmask_flag; /**< @brief SMMU1 中断总中断状态 */ + ZXIC_UINT32 cmmu_int_unmask_flag; /**< @brief CMMU 总中断状态 */ + ZXIC_UINT32 parser_int_unmask_flag; /**< @brief 解析模块(parse)总中断状态 */ +} DPP_SE_INT_STATUS_T; + +/** se解析模块中断状态 */ +typedef struct dpp_se_parser_int_t +{ + ZXIC_UINT32 parser_int_en; + ZXIC_UINT32 parser_int_mask; + ZXIC_UINT32 parser_int_status; +} DPP_SE_PARSER_INT_T; + +/** key调度模块(KSCHD)中断状态 */ +typedef struct dpp_se_kschd_int_t +{ + ZXIC_UINT32 kschd_int_0; + ZXIC_UINT32 kschd_int_1; + ZXIC_UINT32 kschd_int_2; + ZXIC_UINT32 kschd_int_3; + ZXIC_UINT32 kschd_int_4; +} DPP_SE_KSCHD_INT_T; + +/** rsp调度模块(RSCHD)中断状态 */ +typedef struct dpp_se_rschd_int_t +{ + ZXIC_UINT32 port0_int; + ZXIC_UINT32 port1_int; +} DPP_SE_RSCHD_INT_T; + +/** 关联查找(AS)模块的中断原因*/ +typedef struct dpp_se_as_int_t +{ + ZXIC_UINT32 as_int_0; + ZXIC_UINT32 as_int_1; + ZXIC_UINT32 as_int_2; +} DPP_SE_AS_INT_T; + +/** cmmu 模块中断*/ +typedef struct dpp_se_cmmu_int_t +{ + ZXIC_UINT32 cmmu_int12; + ZXIC_UINT32 cmmu_int11; + ZXIC_UINT32 cmmu_int10; + ZXIC_UINT32 cmmu_int9; + ZXIC_UINT32 cmmu_int8; + ZXIC_UINT32 cmmu_int7; + ZXIC_UINT32 cmmu_int6; + ZXIC_UINT32 cmmu_int5; + ZXIC_UINT32 cmmu_int4; + ZXIC_UINT32 cmmu_int3; + ZXIC_UINT32 cmmu_int2; + ZXIC_UINT32 cmmu_int1; + ZXIC_UINT32 cmmu_int0; +} DPP_SE_CMMU_INT_T; + +/** ALG 模块中断*/ +typedef struct dpp_se_alg_int_t +{ + ZXIC_UINT32 wr_rsp_fifo_ovfl_int; /**< @brief 写返回缓存ptr fifo 溢出中断上报 */ + ZXIC_UINT32 init_rd_cft_int; /**< @brief 初始化过程中出现读命令,冲突中断 */ + ZXIC_UINT32 schd_lpm_fifo_parity_err_int; /**< @brief 调度lpm缓存FIFO奇偶校验错误上报 */ + ZXIC_UINT32 schd_hash3_fifo_parity_err_int; /**< @brief 调度hash3缓存FIFO奇偶校验错误上报 */ + ZXIC_UINT32 schd_hash2_fifo_parity_err_int; /**< @brief 调度hash2缓存FIFO奇偶校验错误上报 */ + ZXIC_UINT32 schd_hash1_fifo_parity_err_int; /**< @brief 调度hash1缓存FIFO奇偶校验错误上报 */ + ZXIC_UINT32 schd_hash0_fifo_parity_err_int; /**< @brief 调度hash0缓存FIFO奇偶校验错误上报 */ + ZXIC_UINT32 schd_learn_fifo_parity_err_int; /**< @brief 调度学习缓存FIFO奇偶校验错误上报 */ + ZXIC_UINT32 schd_lpm_fifo_ovfl_int; /**< @brief 调度lpm键值缓存FIFO溢出中断上报 */ + ZXIC_UINT32 schd_hash3_fifo_ovfl_int; /**< @brief 调度hash3键值缓存FIFO溢出中断上报 */ + ZXIC_UINT32 schd_hash2_fifo_unfl_int; /**< @brief 调度hash2键值缓存FIFO溢出中断上报 */ + ZXIC_UINT32 schd_hash1_fifo_ovfl_int; /**< @brief 调度hash1键值缓存FIFO溢出中断上报 */ + ZXIC_UINT32 schd_hash0_fifo_ovfl_int; /**< @brief 调度hash0键值缓存FIFO溢出中断上报 */ + ZXIC_UINT32 schd_learn_fifo_ovfl_int; /**< @brief 调度学习命令缓存FIFO溢出中断上报 */ + + ZXIC_UINT32 zblk31_parity_int; /**< @brief zblock31 parity 中断 */ + ZXIC_UINT32 zblk30_parity_int; /**< @brief zblock30 parity 中断 */ + ZXIC_UINT32 zblk29_parity_int; /**< @brief zblock29 parity 中断 */ + ZXIC_UINT32 zblk28_parity_int; /**< @brief zblock28 parity 中断 */ + ZXIC_UINT32 zblk27_parity_int; /**< @brief zblock27 parity 中断 */ + ZXIC_UINT32 zblk26_parity_int; /**< @brief zblock26 parity 中断 */ + ZXIC_UINT32 zblk25_parity_int; /**< @brief zblock25 parity 中断 */ + ZXIC_UINT32 zblk24_parity_int; /**< @brief zblock24 parity 中断 */ + ZXIC_UINT32 zblk23_parity_int; /**< @brief zblock23 parity 中断 */ + ZXIC_UINT32 zblk22_parity_int; /**< @brief zblock22 parity 中断 */ + ZXIC_UINT32 zblk21_parity_int; /**< @brief zblock21 parity 中断 */ + ZXIC_UINT32 zblk20_parity_int; /**< @brief zblock20 parity 中断 */ + ZXIC_UINT32 zblk19_parity_int; /**< @brief zblock19 parity 中断 */ + ZXIC_UINT32 zblk18_parity_int; /**< @brief zblock18 parity 中断 */ + ZXIC_UINT32 zblk17_parity_int; /**< @brief zblock17 parity 中断 */ + ZXIC_UINT32 zblk16_parity_int; /**< @brief zblock16 parity 中断 */ + ZXIC_UINT32 zblk15_parity_int; /**< @brief zblock15 parity 中断 */ + ZXIC_UINT32 zblk14_parity_int; /**< @brief zblock14 parity 中断 */ + ZXIC_UINT32 zblk13_parity_int; /**< @brief zblock13 parity 中断 */ + ZXIC_UINT32 zblk12_parity_int; /**< @brief zblock12 parity 中断 */ + ZXIC_UINT32 zblk11_parity_int; /**< @brief zblock11 parity 中断 */ + ZXIC_UINT32 zblk10_parity_int; /**< @brief zblock10 parity 中断 */ + ZXIC_UINT32 zblk9_parity_int; /**< @brief zblock9 parity 中断 */ + ZXIC_UINT32 zblk8_parity_int; /**< @brief zblock8 parity 中断 */ + ZXIC_UINT32 zblk7_parity_int; /**< @brief zblock7 parity 中断 */ + ZXIC_UINT32 zblk6_parity_int; /**< @brief zblock6 parity 中断 */ + ZXIC_UINT32 zblk5_parity_int; /**< @brief zblock5 parity 中断 */ + ZXIC_UINT32 zblk4_parity_int; /**< @brief zblock4 parity 中断 */ + ZXIC_UINT32 zblk3_parity_int; /**< @brief zblock3 parity 中断 */ + ZXIC_UINT32 zblk2_parity_int; /**< @brief zblock2 parity 中断 */ + ZXIC_UINT32 zblk1_parity_int; /**< @brief zblock1 parity 中断 */ + ZXIC_UINT32 zblk0_parity_int; /**< @brief zblock0 parity 中断 */ + + ZXIC_UINT32 zcam_hash_p0_err_int; /**< @brief hash0 ZCAM查找出错中断 */ + ZXIC_UINT32 hash0_agree_int_fifo_ovf_int; /**< @brief hash0 汇聚fifo 片内通道溢出中断 */ + ZXIC_UINT32 hash0_agree_ext_fifo_ovf_int; /**< @brief hash0 汇聚fifo 片外通道parity中断 */ + ZXIC_UINT32 hash0_agree_ext_fifo_parity_err_int; /**< @brief hash0 汇聚fifo 片外通道溢出中断*/ + ZXIC_UINT32 hash0_agree_int_fifo_parity_err_int; /**< @brief hash0 汇聚fifo 片内通道parity中断 */ + ZXIC_UINT32 hash0_key_fifo_ovfl_int; /**< @brief hash0 片外键值缓存FIFO 溢出中断 */ + ZXIC_UINT32 hash0_sreq_fifo_ovfl_int; /**< @brief hash0 片外读地址缓存FIFO溢出中断 */ + ZXIC_UINT32 hash0_key_fifo_parity_err_int; /**< @brief hash0 片外键值缓存FIFO parity err中断 */ + + ZXIC_UINT32 zcam_hash_p1_err_int; /**< @brief hash1 ZCAM查找出错中断 */ + ZXIC_UINT32 hash1_agree_int_fifo_ovf_int; /**< @brief hash1 汇聚fifo 片内通道溢出中断 */ + ZXIC_UINT32 hash1_agree_ext_fifo_ovf_int; /**< @brief hash1 汇聚fifo 片外通道parity中断 */ + ZXIC_UINT32 hash1_agree_ext_fifo_parity_err_int; /**< @brief hash1 汇聚fifo 片外通道溢出中断*/ + ZXIC_UINT32 hash1_agree_int_fifo_parity_err_int; /**< @brief hash1 汇聚fifo 片内通道parity中断 */ + ZXIC_UINT32 hash1_key_fifo_ovfl_int; /**< @brief hash1 片外键值缓存FIFO 溢出中断 */ + ZXIC_UINT32 hash1_sreq_fifo_ovfl_int; /**< @brief hash1 片外读地址缓存FIFO溢出中断 */ + ZXIC_UINT32 hash1_key_fifo_parity_err_int; /**< @brief hash1 片外键值缓存FIFO parity err中断 */ + + ZXIC_UINT32 zcam_hash_p2_err_int; /**< @brief hash2 ZCAM查找出错中断 */ + ZXIC_UINT32 hash2_agree_int_fifo_ovf_int; /**< @brief hash2 汇聚fifo 片内通道溢出中断 */ + ZXIC_UINT32 hash2_agree_ext_fifo_ovf_int; /**< @brief hash2 汇聚fifo 片外通道parity中断 */ + ZXIC_UINT32 hash2_agree_ext_fifo_parity_err_int; /**< @brief hash2 汇聚fifo 片外通道溢出中断*/ + ZXIC_UINT32 hash2_agree_int_fifo_parity_err_int; /**< @brief hash2 汇聚fifo 片内通道parity中断 */ + ZXIC_UINT32 hash2_key_fifo_ovfl_int; /**< @brief hash2 片外键值缓存FIFO 溢出中断 */ + ZXIC_UINT32 hash2_sreq_fifo_ovfl_int; /**< @brief hash2 片外读地址缓存FIFO溢出中断 */ + ZXIC_UINT32 hash2_key_fifo_parity_err_int; /**< @brief hash2 片外键值缓存FIFO parity err中断 */ + + ZXIC_UINT32 zcam_hash_p3_err_int; /**< @brief hash3 ZCAM查找出错中断 */ + ZXIC_UINT32 hash3_agree_int_fifo_ovf_int; /**< @brief hash3 汇聚fifo 片内通道溢出中断 */ + ZXIC_UINT32 hash3_agree_ext_fifo_ovf_int; /**< @brief hash3 汇聚fifo 片外通道parity中断 */ + ZXIC_UINT32 hash3_agree_ext_fifo_parity_err_int; /**< @brief hash3 汇聚fifo 片外通道溢出中断*/ + ZXIC_UINT32 hash3_agree_int_fifo_parity_err_int; /**< @brief hash3 汇聚fifo 片内通道parity中断 */ + ZXIC_UINT32 hash3_key_fifo_ovfl_int; /**< @brief hash3 片外键值缓存FIFO 溢出中断 */ + ZXIC_UINT32 hash3_sreq_fifo_ovfl_int; /**< @brief hash3 片外读地址缓存FIFO溢出中断 */ + ZXIC_UINT32 hash3_key_fifo_parity_err_int; /**< @brief hash3 片外键值缓存FIFO parity err中断 */ + + ZXIC_UINT32 zcam_lpm_err_int; /**< @brief lpm ZCAM查找出错中断 */ + ZXIC_UINT32 lpm_as_int_rsp_fifo_ovfl_int; /**< @brief lpm as 片内查找结果缓存FIFO溢出中断 */ + ZXIC_UINT32 lpm_as_req_fifo_ovfl_int; /**< @brief lpm as 查找ddr 地址 FIFO溢出中断 */ + ZXIC_UINT32 lpm_ext_ddr_rsp_fifo_parity_int; /**< @brief lpm ext ddr rsp FIFO parity中断 */ + ZXIC_UINT32 lpm_ext_v6_key_parity_int; /**< @brief lpm ext v6 key FIFO parity中断 */ + ZXIC_UINT32 lpm_ext_v4_key_parity_int; /**< @brief lpm ext v4 key FIFO parity中断 */ + ZXIC_UINT32 lpm_ext_addr_fifo_ovfl_int; /**< @brief lpm ext ddr3 地址溢出中断 */ + ZXIC_UINT32 lpm_ext_v4_fifo_ovfl_int; /**< @brief lpm ext v4 key溢出中断 */ + ZXIC_UINT32 lpm_ext_v6_fifo_ovfl_int; /**< @brief lpm ext v6 key溢出中断 */ + ZXIC_UINT32 lpm_ext_ddr_rsp_ovf_int; /**< @brief lpm ext ddr返回缓存fifo溢出中断 */ +} DPP_SE_ALG_INT_T; + +/** ALG 模块对外总中断*/ +typedef struct dpp_se_alg_brief_int_t +{ + ZXIC_UINT32 schd_int_unmask_flag; /**<@brief alg模块调度状态 */ + ZXIC_UINT32 zblk_parity_int_unmask_flag; /**<@brief alg模块zblock奇偶校验中断 */ + ZXIC_UINT32 hash0_int_unmask_flag; /**<@brief alg模块hash0中断状态 */ + ZXIC_UINT32 hash1_int_unmask_flag; /**<@brief alg模块hash1中断状态 */ + ZXIC_UINT32 hash2_int_unmask_flag; /**<@brief alg模块hash2中断状态 */ + ZXIC_UINT32 hash3_int_unmask_flag; /**<@brief alg模块hash3中断状态 */ + ZXIC_UINT32 lpm_int_unmask_flag; /**<@brief alg模块lpm中断状态 */ +} DPP_SE_ALG_BRIEF_INT_T; + +/** SMMU1 中断 */ +typedef struct dpp_se_smmu1_int_t +{ + ZXIC_UINT32 smmu1_int0; + ZXIC_UINT32 smmu1_int1; + ZXIC_UINT32 smmu1_int2; + ZXIC_UINT32 smmu1_int3; + ZXIC_UINT32 smmu1_int4; + ZXIC_UINT32 smmu1_int5; + ZXIC_UINT32 smmu1_int6; + ZXIC_UINT32 smmu1_int7; + ZXIC_UINT32 smmu1_int8; + ZXIC_UINT32 smmu1_int9; + ZXIC_UINT32 smmu1_int10; + ZXIC_UINT32 smmu1_int11; + ZXIC_UINT32 smmu1_int12; + ZXIC_UINT32 smmu1_int13; + ZXIC_UINT32 smmu1_int14; + ZXIC_UINT32 smmu1_int15; + ZXIC_UINT32 smmu1_int16; + ZXIC_UINT32 smmu1_int17; +} DPP_SE_SMMU1_INT_T; + +typedef struct dpp_etcam_intr_t +{ + ZXIC_UINT32 etcam_int_33; + ZXIC_UINT32 etcam_int_32; + ZXIC_UINT32 etcam_int_31; + ZXIC_UINT32 etcam_int_30; + ZXIC_UINT32 etcam_int_29; + ZXIC_UINT32 etcam_int_28; + ZXIC_UINT32 etcam_int_27; + ZXIC_UINT32 etcam_int_26; + ZXIC_UINT32 etcam_int_25; + ZXIC_UINT32 etcam_int_24; + ZXIC_UINT32 etcam_int_23; + ZXIC_UINT32 etcam_int_22; + ZXIC_UINT32 etcam_int_21; + ZXIC_UINT32 etcam_int_20; + ZXIC_UINT32 etcam_int_19; + ZXIC_UINT32 etcam_int_18; + ZXIC_UINT32 etcam_int_17; + ZXIC_UINT32 etcam_int_16; + ZXIC_UINT32 etcam_int_15; + ZXIC_UINT32 etcam_int_14; + ZXIC_UINT32 etcam_int_13; + ZXIC_UINT32 etcam_int_12; + ZXIC_UINT32 etcam_int_11; + ZXIC_UINT32 etcam_int_10; + ZXIC_UINT32 etcam_int_9; + ZXIC_UINT32 etcam_int_8; + ZXIC_UINT32 etcam_int_7; + ZXIC_UINT32 etcam_int_6; + ZXIC_UINT32 etcam_int_5; + ZXIC_UINT32 etcam_int_4; + ZXIC_UINT32 etcam_int_3; + ZXIC_UINT32 etcam_int_2; + ZXIC_UINT32 etcam_int_1; + ZXIC_UINT32 etcam_int_0; +} DPP_ETCAM_INTR_T; + +typedef struct dpp_se_stat_int_t +{ + ZXIC_UINT32 stat_int0; + ZXIC_UINT32 stat_int1; + ZXIC_UINT32 stat_int2; + ZXIC_UINT32 stat_int3; + ZXIC_UINT32 stat_int4; + ZXIC_UINT32 stat_int5; +} DPP_SE_STAT_INT_T; + +#endif + +#if ZXIC_REAL("macro function define") + +#endif + +#if ZXIC_REAL("function declaration") +/***********************************************************/ +/** 读eRam +* @param dev_id 设备号 +* @param base_addr 基地址,以128bit为单位 +* @param index 条目索引,支持128、64、32和1bit的索引值 +* @param rd_mode 读eRam模式, 取值参照ERAM128_OPR_MODE_E定义,读清模式下不支持1bit模式 +* @param rd_clr_mode eRam读清模式, 取值参照ERAM128_RD_CLR_MODE_E定义 +* @param p_data 返回数据缓存的指针 +* +* @return +* @remark 无 +* @see +* @author wcl @date 2015/01/30 +************************************************************/ +DPP_STATUS dpp_se_smmu0_ind_read(DPP_DEV_T *dev, ZXIC_UINT32 base_addr, ZXIC_UINT32 index, ZXIC_UINT32 rd_mode, ZXIC_UINT32 rd_clr_mode, ZXIC_UINT32 *p_data); + +#endif + +#if ZXIC_REAL("Hash & LPM data struct and function") + +/** lpm&hash算法模块硬件读写函数指针类型 */ +typedef DPP_STATUS (*WRITE32_FUN)(ZXIC_UINT32 dev_id, ZXIC_UINT32 addr, ZXIC_UINT32 write_data); +typedef DPP_STATUS (*READ32_FUN) (ZXIC_UINT32 dev_id, ZXIC_UINT32 addr, ZXIC_UINT32 *read_data); + +/** 前缀匹配路由关联结果表写硬件函数指针类型*/ +typedef DPP_STATUS (*LPM_AS_RSLT_WRT_FUNCTION)(ZXIC_UINT32 dev_id, ZXIC_UINT32 as_type, ZXIC_UINT32 tbl_id, ZXIC_UINT32 index, ZXIC_UINT8 *p_data); + +#define SE_ZGRP_NUM (4) +#define SE_ZBLK_NUM (32) +#define SE_ZCELL_NUM (4) +#define SE_ZCELL_TOTAL_NUM (SE_ZBLK_NUM * SE_ZCELL_NUM) +#define SE_ZREG_NUM (4) +#define SE_RAM_DEPTH (512) +#define MAX_FUN_NUM (8) +#define SE_ALG_BANK_NUM (29) + +#define LPM_THREAD_HW_WRITE_EN (0) /* ??????????????? */ +#if LPM_THREAD_HW_WRITE_EN +#define ROUTE_DEV_CHANNEL_MAX (4) /* ?????? NPE_DEV_CHANNEL_MAX ??????? */ +#define MAX_ITEM_INFO_BAK_NUM (0x100) +#endif +/* +* zcell/zreg 基本存储单元的配置信息,512bit为单位, +* zcell包含512个基本存储单元,zreg包含4个基本存储单元, +* 每个单元可以存储1个512bit条目、2个256bit条目或4个128bit条目, +* 本结构体不感知内部存储条目的位宽,hash中键值中的key_type可以 +* 可以获取表项的位宽信息 +*/ +typedef struct se_item_cfg +{ + D_HEAD item_list; /** 基本存储单元双链表头节点,可以存放放在本单元内的具体表项条目*/ + ZXIC_UINT32 item_index; /** 基本存储单元所处的索引值 */ + ZXIC_UINT32 hw_addr; /** 基本存储单元物理的地址 */ + ZXIC_UINT32 bulk_id; + ZXIC_UINT32 item_type; /** 基本存储单元的存储类型,包括片外或片内,参见SE_ITEM_TYPE */ + ZXIC_UINT8 wrt_mask; /** 基本存储单元写入的掩码,4bit,每bit表示待写入的128bit位置 */ + ZXIC_UINT8 valid; /** 基本存储单元是否被占用,0-未被占用,1-被占用 */ + ZXIC_UINT8 pad[2]; +} SE_ITEM_CFG; + +/** zcell属性标志*/ +#define DPP_ZCELL_FLAG_IS_MONO (1) /**< @brief ZCELL是否被独占: 0-未被独占,1-已经被独占*/ + +/** zcell属性标志*/ +#define DPP_ZREG_FLAG_IS_MONO (1) /**< @brief ZREG是否被独占: 0-未被独占,1-已经被独占*/ + +/* zcell 的配置信息*/ +typedef struct se_zcell_cfg +{ + ZXIC_UINT8 flag; /* zcell属性标志,各比特的含义见上面DPP_ZCELL_FLAG_MODE等的定义 */ + ZXIC_UINT32 bulk_id; /* zcell所属空间ID */ + ZXIC_UINT32 zcell_idx; /* zcell 的索引值, 高6bit为zblock的索引 */ + ZXIC_UINT16 mask_len; /* 掩码长度 */ + ZXIC_UINT8 is_used; /* 本zcell是否被占用*/ + ZXIC_UINT8 is_share; /* 是否共享block中的zcell*/ + ZXIC_UINT32 item_used; + SE_ITEM_CFG item_info[SE_RAM_DEPTH]; /* 本zcell的基本存储单元配置*/ + + D_NODE zcell_dn; /* 双链表节点,初始化其data指针指向SE_ZCELL_CFG实例自身,然后插入双链表中*/ + ZXIC_AVL_NODE zcell_avl; /* 本hash程序未使用, 平衡二叉树节点*/ +} SE_ZCELL_CFG; +/* zreg 的配置信息*/ +typedef struct se_zreg_cfg +{ + ZXIC_UINT8 flag; /* z属性标志,各比特的含义见上面DPP_ZCELL_FLAG_MODE等的定义 */ + ZXIC_UINT8 pad[3]; + ZXIC_UINT32 bulk_id; /* zcell所属空间ID */ + SE_ITEM_CFG item_info; /* zreg 存储的表条目配置*/ +} SE_ZREG_CFG; +/* zblock 的配置信息*/ +typedef struct se_zblk_cfg +{ + ZXIC_UINT32 zblk_idx; /* 统一编址,范围0~31 */ + ZXIC_UINT16 is_used; /* 本zblock 是否被占用 */ + ZXIC_UINT16 zcell_bm; /* 本hash程序未使用 */ + ZXIC_UINT16 hash_arg; /* hash crc算法的因子 */ + ZXIC_UINT16 pad; + + SE_ZCELL_CFG zcell_info[SE_ZCELL_NUM]; /* 本block的4个zcell配置 */ + SE_ZREG_CFG zreg_info[SE_ZREG_NUM]; /* 本block的4个zreg配置*/ + + D_NODE zblk_dn; /* 指向本实例的双链表节点 */ + +} SE_ZBLK_CFG; +/* alg表类型配置,包括4路hash引擎和v4 和 v6 lpm表项*/ +typedef struct func_id_info +{ + ZXIC_VOID *fun_ptr; + ZXIC_UINT8 fun_type; /* 业务类型 参见 SE_FUN_TYPE */ + ZXIC_UINT8 fun_id; + ZXIC_UINT8 is_used; + ZXIC_UINT8 pad; +} FUNC_ID_INFO; + +typedef struct ddr_mem +{ + ZXIC_UINT32 total_num; + ZXIC_UINT32 base_addr; + ZXIC_UINT32 base_addr_offset; + ZXIC_UINT32 ecc_en; + ZXIC_UINT32 bank_num; + ZXIC_UINT32 bank_info[SE_ALG_BANK_NUM]; + ZXIC_UINT32 share_type; /* DDR bank共享模式 */ + ZXIC_UINT32 item_used; + ZXIC_LISTSTACK_MANGER *p_ddr_mng; +} DDR_MEM; + +typedef struct share_ram +{ + ZXIC_UINT32 zblk_array[SE_ZBLK_NUM]; + D_HEAD zblk_list; + D_HEAD zcell_free_list; + ZXIC_UINT32 def_route_num; + + ZXIC_RB_CFG def_rb; + struct def_route_info *p_dr_info; + + DDR_MEM ddr4_info; + DDR_MEM ddr6_info; +} SHARE_RAM; + +/** 算法模块管理数据结构,用户仅需创建实例变量,然后将指针传给初始化函数dpp_se_init()和dpp_se_client_init()即可,不需要单独赋值成员变量*/ +typedef struct dpp_se_cfg +{ + SE_ZBLK_CFG zblk_info[SE_ZBLK_NUM]; + + FUNC_ID_INFO fun_info[MAX_FUN_NUM]; + + SHARE_RAM route_shareram; + ZXIC_UINT32 reg_base; + + WRITE32_FUN p_write32_fun; + READ32_FUN p_read32_fun; + + ZXIC_UINT32 lpm_flags; + + ZXIC_VOID *p_client; + + DPP_DEV_T *dev; + ZXIC_UINT32 dev_id; + + LPM_AS_RSLT_WRT_FUNCTION p_as_rslt_wrt_fun; /* dpp_se_lpm_as_rslt_write */ + +#if LPM_THREAD_HW_WRITE_EN + // ZXIC_UINT32 mutex_location; /* dpp_route_cfg ?? cache mutex???????????route mode */ + ZXIC_MUTEX_T cache_index_mutex[MAX_ITEM_INFO_BAK_NUM]; /* cache每个节点锁 */ + ZXIC_UINT32 thread_hw_write_is_create; /* ??????????????? ???????? add by lining for thread_hw_write */ + ZXIC_LISTSTACK_MANGER *p_thread_liststack_mng; +#endif + +} DPP_SE_CFG; + +/** hash物理存储位宽类型*/ +typedef enum dpp_hash_ddr_width_mode +{ + DDR_WIDTH_INVALID = 0, + DDR_WIDTH_256b, /**< @brief 256bit位宽模式*/ + DDR_WIDTH_512b, /**< @brief 512bit位宽模式*/ +} DPP_HASH_DDR_WIDTH_MODE; + +/** hash条目类型*/ +typedef enum dpp_hash_key_type +{ + HASH_KEY_INVALID = 0, /**< @brief 无效类型*/ + HASH_KEY_128b, /**< @brief 128bit位宽类型*/ + HASH_KEY_256b, /**< @brief 256bit位宽类型*/ + HASH_KEY_512b, /**< @brief 512bit位宽类型*/ +} DPP_HASH_KEY_TYPE; + +/** hash ddr resource cfg info*/ +typedef struct dpp_hash_ddr_resc_cfg_t +{ + ZXIC_UINT32 ddr_width_mode; /**< @brief 分配给hash的DDR空间物理存储位宽模式,取值参考DPP_HASH_DDR_WIDTH_MODE的定义*/ + ZXIC_UINT32 ddr_crc_sel; /**< @brief 选择一个DDR CRC多项式,取值范围0~3,0~3分别对应一个CRC多项式*/ + ZXIC_UINT32 ddr_item_num; /**< @brief 分配给hash的DDR空间单元数目,以256bit为一个单元*/ + ZXIC_UINT32 ddr_baddr; /**< @brief 分配给hash的DDR空间的硬件基地址,以2k*256bit为单位*/ + ZXIC_UINT32 ddr_ecc_en; /**< @brief DDR ECC使能: 0-不使能,1-使能*/ +} DPP_HASH_DDR_RESC_CFG_T; + +/** hash search mode */ +typedef enum dpp_hash_srh_mode +{ + HASH_SRH_MODE_SOFT = 1, /**< @brief 查软件 */ + HASH_SRH_MODE_HDW = 2, /**< @brief 查硬件 */ +} DPP_HASH_SRH_MODE; + +/** hash tbl_flag */ +#define HASH_TBL_FLAG_AGE (1<<0) /**< @brief 老化保活置位使能: 0-不使能;1-使能*/ +#define HASH_TBL_FLAG_LEARN (1<<1) /**< @brief 硬件学习使能: 0-不使能;1-使能*/ +#define HASH_TBL_FLAG_MC_WRT (1<<2) /**< @brief 微码写表使能: 0-不使能,1-使能 */ + +/** hash条目*/ +typedef struct dpp_hash_entry +{ + ZXIC_UINT8 *p_key; /**< @brief 键值,格式详见各操作函数的说明*/ + ZXIC_UINT8 *p_rst; /**< @brief 结果*/ +} DPP_HASH_ENTRY; + + +/** 前缀路由业务初始化标志*/ +#define LPM_FLAG_RT_HANDLE_START (0) /**< @brief 是否使能级联结果表查找: 0-不使能,1-使能*/ +#define LPM_FLAG_RT_HANDLE_WIDTH (1) +#define LPM4_FLAG_DDR_EN_START (1) /**< @brief 是否使能ipv4片外查找模式: 0-不使能,1-使能 */ +#define LPM4_FLAG_DDR_EN_WIDTH (1) +#define LPM6_FLAG_DDR_EN_START (2) /**< @brief 是否使能ipv6片外查找模式: 0-不使能,1-使能 */ +#define LPM6_FLAG_DDR_EN_WIDTH (1) +#define LPM4_FLAG_DDR_SEL_START (3) /**< @brief 是否为ipv4非线速模式: 0-线速,1-非线速 */ +#define LPM4_FLAG_DDR_SEL_WIDTH (1) +#define LPM6_FLAG_DDR_SEL_START (4) /**< @brief 是否为ipv6非线速模式: 0-线速,1-非线速 */ +#define LPM6_FLAG_DDR_SEL_WIDTH (1) +#define LPM_FLAG_AS_MODE_START (5) /**< @brief 级联结果表模式: 1-级联DDR,0-级联eRam */ +#define LPM_FLAG_AS_MODE_WIDTH (1) + +/** 前缀匹配路由级联DDR结果表返回位宽模式*/ +typedef enum dpp_route_as_rsp_len_e +{ + DPP_ROUTE_AS_128b = 0, /**< @brief 返回128bit模式*/ + DPP_ROUTE_AS_256b = 1, /**< @brief 返回256bit模式*/ + DPP_ROUTE_AS_384b = 2, /**< @brief 返回384bit模式*/ + DPP_ROUTE_AS_512b = 3 /**< @brief 返回512bit模式*/ +} DPP_ROUTE_AS_RSP_LEN_E; + +/** 前缀匹配路由业务ID*/ +typedef enum dpp_route_id_e +{ + DPP_ROUTE_V4_ID = 4, /**< @brief route ipv4 ID*/ + DPP_ROUTE_V6_ID = 5, /**< @brief route ipv6 ID*/ +} DPP_ROUTE_ID_E; + +/** 前缀匹配路由业务模式*/ +typedef enum dpp_route_mode_e +{ + DPP_ROUTE_MODE_IPV4 = 1UL, /**< @brief ipv4路由模式*/ + DPP_ROUTE_MODE_IPV6 /**< @brief ipv6路由模式*/ +} DPP_ROUTE_MODE_E; + +/** 前缀匹配路由DDR空间占用模式*/ +typedef enum dpp_route_ddr_use_mode_e +{ + DPP_ROUTE_DDR_USE_MINOR = 1, /**< @brief DDR使用量较少*/ + DPP_ROUTE_DDR_USE_MIDDLE = 2, /**< @brief DDR使用量中等*/ + DPP_ROUTE_DDR_USE_MAJOR = 3, /**< @brief DDR使用量较多*/ +} DPP_ROUTE_DDR_USE_MODE_E; + +/** 前缀匹配路由调试查找模式*/ +typedef enum dpp_route_srh_mode_e +{ + DPP_ROUTE_SRH_MODE_LP = 1, /**< @brief 前缀匹配查找模式*/ + DPP_ROUTE_SRH_MODE_EQUAL = 2, /**< @brief 精确匹配查找模式*/ +} DPP_ROUTE_SRH_MODE_E; + +/** 前缀匹配路由硬件资源 */ +typedef struct dpp_route_resource_t +{ + ZXIC_UINT32 zblk_num; /**< @brief LPM ipv4和ipv6共享的zblock数目*/ + ZXIC_UINT32 *zblk_idx; /**< @brief LPM ipv4和ipv6共享的zblock编号数组*/ + ZXIC_UINT32 ddr4_item_num; /**< @brief 分配给ipv4前缀查找的ddr存储条目数,以256bit为单位*/ + ZXIC_UINT32 ddr4_baddr; /**< @brief 分配给ipv4前缀查找的ddr存储空间的基地址,以4K*128bit为单位*/ + ZXIC_UINT32 ddr4_base_offset; /**< @brief ipv4前缀查找相对于片外ddr存储空间基地址的偏移量,以256bit为单位*/ + ZXIC_UINT32 ddr4_ecc_en; /**< @brief 固定配为1,分配给ipv4前缀查找的ddr存储空间的ECC校验使能标志*/ + ZXIC_UINT32 ddr4_bank_num; /**< @brief ipv4前缀查找的ddr存储空间bank复制份数 */ + ZXIC_UINT32 *ddr4_bank_info; /**< @brief ipv4前缀查找的ddr存储空间bank号,数组传入,支持离散分配*/ + ZXIC_UINT32 ddr4_share_type; /**< @brief ipv4前缀查找的ddr存储空间bank共享模式,参见SMMU1_DDR_SHARE_MODE_E*/ + ZXIC_UINT32 ddr6_item_num; /**< @brief 分配给ipv6前缀查找的ddr存储条目数,以256bit为单位*/ + ZXIC_UINT32 ddr6_baddr; /**< @brief 分配给ipv6前缀查找的ddr存储空间的基地址,以4K*128bit为单位*/ + ZXIC_UINT32 ddr6_base_offset; /**< @brief ipv6前缀查找相对于片外ddr存储空间基地址的偏移量,以256bit为单位*/ + ZXIC_UINT32 ddr6_ecc_en; /**< @brief 固定配为1,分配给ipv4前缀查找的ddr存储空间的ECC校验使能标志*/ + ZXIC_UINT32 ddr6_bank_num; /**< @brief ipv6前缀查找的ddr存储空间bank复制份数 */ + ZXIC_UINT32 *ddr6_bank_info; /**< @brief ipv6前缀查找的ddr存储空间bank号,数组传入,支持离散分配*/ + ZXIC_UINT32 ddr6_share_type; /**< @brief ipv6前缀查找的ddr存储空间bank共享模式,参见SMMU1_DDR_SHARE_MODE_E*/ +} DPP_ROUTE_RESOURCE_T; + +/** 前缀匹配路由级联片内eRam结果表属性 */ +typedef struct dpp_route_as_eram_t +{ + ZXIC_UINT32 baddr; /**< @brief LPM级联eRam结果基地址*/ + ZXIC_UINT32 rsp_mode; /**< @brief LPM级联eRam结果位宽模式,取值参照ERAM128_TBL_MODE_E的定义*/ +} DPP_ROUTE_AS_ERAM_T; + +/** 前缀匹配路由级联片外DDR结果表属性 */ +typedef struct dpp_route_as_ddr_t +{ + ZXIC_UINT32 baddr; /**< @brief 分配给级联ddr结果表空间的基地址,以4K*128bit为单位*/ + ZXIC_UINT32 rsp_len; /**< @brief LPM级联DDR结果位宽模式,取值参照DPP_ROUTE_AS_RSP_LEN_E的定义*/ + ZXIC_UINT32 ecc_en; /**< @brief 级联结果表DDR空间ECC校验使能标志: 0-不使能,1-使能*/ +} DPP_ROUTE_AS_DDR_T; + +typedef union dpp_route_as_rslttbl_u +{ + DPP_ROUTE_AS_ERAM_T as_eram_cfg; /**< @brief LPM级联eRam结果表空间属性*/ + DPP_ROUTE_AS_DDR_T as_ddr_cfg; /**< @brief LPM级联DDR结果表空间属性*/ +} DPP_ROUTE_AS_RSLTTBL_U; + +/** 前缀匹配IPv4键值*/ +typedef struct dpp_route_ipv4_key_t +{ + ZXIC_UINT32 vpnid; /**< @brief vpnid,16bit*/ + ZXIC_UINT32 mask_len; /**< @brief IP地址的掩码长度,最小为0(表示默认路由),最大为32*/ + ZXIC_UINT32 ipv4_addr; /**< @brief IP地址,32bit*/ +} DPP_ROUTE_IPV4_KEY_T; + +/** 前缀匹配IPv4单个路由条目*/ +typedef struct dpp_route_entry_ipv4_t +{ + DPP_ROUTE_IPV4_KEY_T route_key; /**< @brief 键值*/ + ZXIC_UINT32 route_handle; /**< @brief 键值匹配后,继续查转发结果表的索引*/ + ZXIC_UINT8 *p_as_rslt; /**< @brief 转发结果,仅在使能lpm关联结果查找的情况下有效 */ +} DPP_ROUTE_ENTRY_IPV4_T; + +/** 前缀匹配IPv6键值*/ +typedef struct dpp_route_ipv6_key_t +{ + ZXIC_UINT32 vpnid; /**< @brief vpnid,16bit*/ + ZXIC_UINT32 mask_len; /**< @brief IP地址的掩码长度,最小为0(表示默认路由),最大为128*/ + ZXIC_UINT32 ipaddr[4]; /**< @brief IP地址,128bit*/ +} DPP_ROUTE_IPV6_KEY_T; + +/** 前缀匹配IPv6单个路由条目*/ +typedef struct dpp_route_entry_ipv6_t +{ + DPP_ROUTE_IPV6_KEY_T route_key; /**< @brief 键值*/ + ZXIC_UINT32 route_handle; /**< @brief 键值匹配后,继续查转发结果表的索引*/ + ZXIC_UINT8 *p_as_rslt; /**< @brief 转发结果,仅在使能lpm关联结果查找的情况下有效 */ +} DPP_ROUTE_ENTRY_IPV6_T; + +/* 在HASH进行初始化的时候,需要存储的参数 */ +typedef struct dpp_hash_soft_reset_stor_dat +{ + /* 参照dpp_hash_init()的参数 */ + ZXIC_UINT32 ddr_dis_flag[4]; /**< @brief 4个HASH引擎是否DISABLE DDR标志 */ + ZXIC_UINT32 zblk_num[4]; /**< @brief 4个HASH引擎使用的zblk数量 */ + ZXIC_UINT32 *zblk_idx_start[4]; /**< @brief 4个HASH引擎使用的起始zblk index */ + + /* 参照dpp_hash_bulk_init()的参数 */ + ZXIC_UINT32 ddr_item_num[4][8]; /**< @brief 每个bulk空间存放的ddr item数 */ + ZXIC_UINT32 ddr_base_addr[4]; /**< @brief 每个hash引擎基地址 */ + ZXIC_UINT32 ddr_bank_cp[4]; /**< @brief 每个hash引擎bank copy数量 */ + ZXIC_UINT32 ddr_ecc_en[4]; /**< @brief ddr是否开启ecc使能 */ + + /* ZXIC_UINT32 ddr_width_mode[4]; */ /**< @brief ddr存储位宽 */ + /* ZXIC_UINT32 ddr_crc_sel[4]; */ /**< @brief ddr多项式选择 */ + /* ZXIC_UINT32 ddr_share_type[4]; */ /**< @brief ddr 共享类型 */ + + ZXIC_UINT32 hash_id_valid; /** HASH引擎是否已经初始化标志 */ +} DPP_HASH_SOFT_RESET_STOR_DAT; + + + +/***********************************************************/ +/** 初始化算法管理数据结构,不包含用户自定义的数据指针 +* @param p_se_cfg 算法管理数据结构指针 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wcl @date 2015/05/20 +************************************************************/ +DPP_STATUS dpp_se_init(DPP_DEV_T *dev, DPP_SE_CFG *p_se_cfg); + +/***********************************************************/ +/** 初始化算法管理数据结构用户自定义的数据指针,当前仅用于传入设备号的值 +* @param p_se_cfg 算法管理数据结构指针 +* @param p_client 用户自定义的数据指针 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wcl @date 2015/05/20 +************************************************************/ +DPP_STATUS dpp_se_client_init(DPP_SE_CFG *p_se_cfg, ZXIC_VOID *p_client); + +/***********************************************************/ +/** 单个hash引擎初始化 +* @param p_se_cfg 算法模块公共管理数据结构指针 +* @param fun_id hash引擎号 +* @param zblk_num 分配给此hash引擎的zblock数目 +* @param zblk_idx 分配给此hash引擎的zblock编号 +* @param ddr_dis DDR关闭位,0-不关闭片外DDR, 1-关闭片外DDR +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wcl @date 2015/05/15 +************************************************************/ +DPP_STATUS dpp_hash_init(DPP_SE_CFG *p_se_cfg, + ZXIC_UINT32 fun_id, + ZXIC_UINT32 zblk_num, + ZXIC_UINT32 *zblk_idx, + ZXIC_UINT32 ddr_dis); + +/***********************************************************/ +/** 初始化单个hash引擎内的某个业务表,此接口支持为该业务表分配独占的zcell。 +* 必须先初始化hash引擎,再初始化业务表。 +* @param p_se_cfg 算法模块公共管理数据结构指针 +* @param fun_id hash引擎号 +* @param bulk_id 每个Hash引擎资源划分的空间ID号 +* @param p_ddr_resc_cfg 分配给hash引擎此资源空间的ddr资源属性 +* @param zcell_num 分配给hash引擎此资源空间的zcell数量 +* @param zreg_num 分配给hash引擎此资源空间的zreg数量 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wcl @date 2015/05/15 +************************************************************/ +DPP_STATUS dpp_hash_bulk_init(DPP_SE_CFG *p_se_cfg, + ZXIC_UINT32 fun_id, + ZXIC_UINT32 bulk_id, + DPP_HASH_DDR_RESC_CFG_T *p_ddr_resc_cfg, + ZXIC_UINT32 zcell_num, + ZXIC_UINT32 zreg_num); + +/***********************************************************/ +/** 初始化单个hash引擎内的某个业务表,此接口支持为该业务表分配独占的zcell。 +* 必须先初始化hash引擎,如果是片内+片外模式还必须先初始化dpp_hash_ddr_bulk_init, +* 再初始化业务表。 +* @param p_se_cfg 算法模块公共管理数据结构指针 +* @param fun_id hash引擎号 +* @param tbl_id 业务表 +* @param tbl_flag 初始化标记, bitmap的形式使用,如:HASH_TBL_FLAG_AGE等 +* @param key_type hash条目类型,取值参照DPP_HASH_KEY_TYPE的定义 +* @param actu_key_size 业务键值有效长度: 8bit*N,N=1~48 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wcl @date 2015/05/15 +************************************************************/ +DPP_STATUS dpp_hash_tbl_id_info_init(DPP_SE_CFG *p_se_cfg, + ZXIC_UINT32 fun_id, + ZXIC_UINT32 tbl_id, + ZXIC_UINT32 tbl_flag, + ZXIC_UINT32 key_type, + ZXIC_UINT32 actu_key_size); + +#endif + +#if ZXIC_REAL("eTcam data struct and function") +typedef DPP_STATUS (*ACL_AS_RSLT_WRT_FUNCTION)(ZXIC_UINT32 dev_id, ZXIC_UINT32 base_addr, ZXIC_UINT32 index, ZXIC_UINT32 as_mode, ZXIC_UINT8 *p_data); +#define DPP_ACL_TBL_ID_NUM (8U) +#define DPP_ACL_ETCAM_ID_NUM (1U) +#define DPP_ACL_BLOCK_NUM (8U) + +/** eTcam条目位宽模式*/ +typedef enum dpp_etcam_entry_mode_e +{ + DPP_ETCAM_KEY_640b = 0, + DPP_ETCAM_KEY_320b = 1, + DPP_ETCAM_KEY_160b = 2, + DPP_ETCAM_KEY_80b = 3, + DPP_ETCAM_KEY_INVALID, +} DPP_ETCAM_ENTRY_MODE_E; + +/** eTcam操作类型*/ +typedef enum dpp_etcam_opr_type_e +{ + DPP_ETCAM_OPR_DM = 0, /**< @brief data & mask类型*/ + DPP_ETCAM_OPR_XY = 1, /**< @brief X & Y类型*/ +} DPP_ETCAM_OPR_TYPE_E; + +/** eTcam条目格式*/ +typedef struct dpp_etcam_entry_t +{ + ZXIC_UINT32 mode; /**< @brief 条目位宽模式: 2'b00-640bit,2'b01-320bit,2'b10-160bit,2'b11-80bit*/ + ZXIC_UINT8 *p_data; /**< @brief 键值*/ + ZXIC_UINT8 *p_mask; /**< @brief 掩码*/ +} DPP_ETCAM_ENTRY_T; + +/** ACL键值位宽模式*/ +typedef enum dpp_acl_key_mode_e +{ + DPP_ACL_KEY_640b = 0, /**< @brief 640bit键值位宽*/ + DPP_ACL_KEY_320b, /**< @brief 320bit键值位宽*/ + DPP_ACL_KEY_160b, /**< @brief 160bit键值位宽*/ + DPP_ACL_KEY_80b, /**< @brief 80bit键值位宽*/ + DPP_ACL_KEY_INVALID, +} DPP_ACL_KEY_MODE_E; + +/** ACL关联查找结果表位宽模式*/ +typedef enum dpp_acl_as_mode_e +{ + DPP_ACL_AS_MODE_16b = 0, + DPP_ACL_AS_MODE_32b = 1, + DPP_ACL_AS_MODE_64b = 2, /**< @brief 64bit结果位宽*/ + DPP_ACL_AS_MODE_128b = 3, /**< @brief 128bit结果位宽*/ + DPP_ACL_AS_MODE_INVALID, +} DPP_ACL_AS_MODE_E; + +/** ACL调试查找模式*/ +typedef enum dpp_acl_srh_mode_e +{ + DPP_ACL_SRH_SOFT = 0, /**< @brief 查软件*/ + DPP_ACL_SRH_HARDWARE = 1, /**< @brief 查硬件*/ +} DPP_ACL_SRH_MODE_E; + +/** ACL条目*/ +typedef struct dpp_acl_entry_t +{ + ZXIC_UINT32 handle; /**< @brief 条目索引*/ + ZXIC_UINT8 *key_data; /**< @brief 键值data部分*/ + ZXIC_UINT8 *key_mask; /**< @brief 键值mask部分: 0为关心,1为不关心*/ + ZXIC_UINT8 *p_as_rslt; /**< @brief 关联结果,仅使能关联查找情况有效*/ +} DPP_ACL_ENTRY_T; + +typedef struct dpp_acl_block_info_t +{ + ZXIC_UINT32 is_used; + ZXIC_UINT32 tbl_id; + ZXIC_UINT32 idx_base; +} DPP_ACL_BLOCK_INFO_T; + +typedef struct dpp_acl_etcamid_cfg_t +{ + ZXIC_UINT32 is_valid; + ZXIC_UINT32 as_enable; /* eTcam自动关联eRam结果表使能: 0-不使能,1-使能 */ + ZXIC_UINT32 as_idx_offset; /* 关联结果表基地址偏移,以128bit为单位 */ + ZXIC_UINT32 as_eRam_base; /* eTcam自动关联的eRam block的基地址,以128bit为单位 */ + D_HEAD tbl_list; +} DPP_ACL_ETCAMID_CFG_T; + +typedef struct dpp_acl_key_info_t +{ + ZXIC_UINT32 handle; + ZXIC_UINT32 pri; + ZXIC_UINT8 key[0]; /* data+mask */ +} DPP_ACL_KEY_INFO_T; + +/** ACL初始化使能标志*/ +#define DPP_ACL_FLAG_ETCAM0_EN (1<<0) /**< @brief 开启eTcam端口0: 0-不开启,1-开启.*/ +#define DPP_ACL_FLAG_ETCAM0_AS (1<<2) /**< @brief 开启eTcam端口0的关联结果查找: 0-不开启,1-开启.*/ +//#define DPP_ACL_FLAG_ETCAM1_AS (1<<3) /**< @brief 开启eTcam端口1的关联结果查找: 0-不开启,1-开启.*/ + +typedef DPP_STATUS (*ACL_TBL_AS_DDR_WR_FUN)(ZXIC_UINT32 dev_id, ZXIC_UINT32 tbl_type, ZXIC_UINT32 tbl_id, ZXIC_UINT32 dir_tbl_share_type, ZXIC_UINT32 dir_tbl_base_addr, ZXIC_UINT32 ecc_en, ZXIC_UINT32 index, ZXIC_UINT32 as_mode, ZXIC_UINT8 *p_data); +typedef DPP_STATUS (*ACL_TBL_AS_DDR_RD_FUN)(ZXIC_UINT32 dev_id, ZXIC_UINT32 base_addr, ZXIC_UINT32 index, ZXIC_UINT32 as_mode, ZXIC_UINT8 *p_data); + +/** */ +typedef struct dpp_acl_tbl_cfg_t +{ + ZXIC_UINT32 tbl_type; + ZXIC_UINT32 table_id; + ZXIC_UINT8 is_as_ddr; + ZXIC_UINT8 ddr_bankcp_info; + ZXIC_UINT32 dir_tbl_share_type; + ZXIC_UINT8 ddr_ecc_en; + ZXIC_UINT32 pri_mode; + ZXIC_UINT32 key_mode; + ZXIC_UINT32 entry_num; + ZXIC_UINT32 block_num; + ZXIC_UINT32 *block_array; + ZXIC_UINT32 is_used; + ZXIC_UINT32 as_mode; + ZXIC_UINT32 as_idx_base; + ZXIC_UINT32 as_enable; /* eTcam自动关联eRam结果表使能: 0-不使能,1-使能 */ + ZXIC_UINT32 as_eRam_base; /* eTcam自动关联的eRam block的基地址,以128bit为单位 */ + ZXIC_UINT32 ddr_baddr; + ZXIC_UINT32 idx_offset; /* 相对于ddr_baddr的基地址的索引偏移,以as_mode对应的数据位宽为单位 */ + ACL_TBL_AS_DDR_WR_FUN p_as_ddr_wr_fun; + ACL_TBL_AS_DDR_RD_FUN p_as_ddr_rd_fun; + D_NODE entry_dn; + INDEX_FILL_CFG index_mng; + ZXIC_RB_CFG acl_rb; + DPP_ACL_KEY_INFO_T **acl_key_buff; + ZXIC_UINT8 *as_rslt_buff; +} DPP_ACL_TBL_CFG_T; + +/** ACL公共管理数据结构*/ +typedef struct dpp_acl_cfg_t +{ + ZXIC_VOID *p_client; + DPP_DEV_T *dev; + ZXIC_UINT32 dev_id; + ZXIC_UINT32 flags; + ACL_AS_RSLT_WRT_FUNCTION p_as_rslt_write_fun; + ACL_AS_RSLT_WRT_FUNCTION p_as_rslt_read_fun; + DPP_ACL_BLOCK_INFO_T acl_blocks[DPP_ACL_BLOCK_NUM]; + DPP_ACL_ETCAMID_CFG_T acl_etcamids; + DPP_ACL_TBL_CFG_T acl_tbls[DPP_ACL_TBL_ID_NUM]; +} DPP_ACL_CFG_T; + +/**< @brief ACL公共管理数据结构*/ +typedef struct dpp_acl_cfg_ex_t +{ + ZXIC_VOID *p_client; + DPP_DEV_T *dev; + ZXIC_UINT32 dev_id; + ZXIC_UINT32 flags; + ACL_AS_RSLT_WRT_FUNCTION p_as_rslt_write_fun; + ACL_AS_RSLT_WRT_FUNCTION p_as_rslt_read_fun; + DPP_ACL_BLOCK_INFO_T acl_blocks[DPP_ACL_BLOCK_NUM]; + DPP_ACL_ETCAMID_CFG_T acl_etcamids; + DPP_ACL_TBL_CFG_T acl_tbls[DPP_ACL_TBL_ID_NUM]; +}DPP_ACL_CFG_EX_T; + +/** acl优先级模式*/ +typedef enum dpp_acl_pri_mode_e +{ + DPP_ACL_PRI_EXPLICIT = 1, /**< @brief 显示优先级*/ + DPP_ACL_PRI_IMPLICIT, /**< @brief 隐式优先级,以条目下发顺序作为优先级*/ + DPP_ACL_PRI_SPECIFY, /**< @brief 用户指定每个条目的在tcam中的存放索引*/ + DPP_ACL_PRI_INVALID, +} DPP_ACL_PRI_MODE_E; + +/** */ +typedef struct dpp_acl_entry_ex_t +{ + ZXIC_UINT32 idx_val; /**< @brief 一次插入单个acl条目时有效,返回单个索引*/ + D_HEAD idx_list; /**< @brief 一次插入多个acl条目时有效,返回多个索引*/ + ZXIC_UINT32 pri; /* PRI_EXPLICIT: pri is priority, PRI_IMPLICIT: pri is invalid, PRI_SPECIFY: pri is handle */ + ZXIC_UINT8 *key_data; + ZXIC_UINT8 *key_mask; + ZXIC_UINT8 *p_as_rslt; +} DPP_ACL_ENTRY_EX_T; + +/***********************************************************/ +/** eTcam模块初始化 +* @param dev_id 设备号 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wcl @date 2015/07/24 +************************************************************/ +DPP_STATUS dpp_etcam_init(ZXIC_UINT32 dev_id); + +/***********************************************************/ +/** +* @param p_acl_cfg ACL公共管理数据结构指针 +* @param p_client 用户自定义的数据指针 +* @param flags +* @param p_as_wrt_fun 关联结果写硬件表回调函数指针 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yxh @date 2017/12/15 +************************************************************/ +DPP_STATUS dpp_acl_cfg_init_ex(DPP_DEV_T *dev, + DPP_ACL_CFG_EX_T *p_acl_cfg, + ZXIC_VOID *p_client, + ZXIC_UINT32 flags, + ACL_AS_RSLT_WRT_FUNCTION p_as_wrt_fun); + +/***********************************************************/ +/** acl业务表初始化,注意分配给一个table的多个block_idx + 必须按从小到大的顺序给定。支持多个优先级模式,暂不对外开放。 +* @param p_acl_cfg ACL公共管理数据结构指针 +* @param table_id 业务表号 +* @param as_enable 是否使能关联结果查找,0-不使能,1-使能 +* @param entry_num 最大条目数 +* @param pri_mode ACL优先级模式 +* @param key_mode ACL键值位宽模式, 取值参照DPP_ACL_KEY_MODE_E的定义 +* @param as_mode ACL关联查找结果表位宽模式 +* @param as_baddr 基地址 +* @param block_num 分配给当前业务表号的block数目 +* @param p_block_idx 分配给当前业务表号的block编号数组 +* +* @return +* @remark 无 +* @see +* @author wcl @date 2014/12/23 +************************************************************/ +DPP_STATUS dpp_acl_tbl_init_ex(DPP_ACL_CFG_EX_T *p_acl_cfg, + ZXIC_UINT32 table_id, + ZXIC_UINT32 as_enable, + ZXIC_UINT32 entry_num, + DPP_ACL_PRI_MODE_E pri_mode, + ZXIC_UINT32 key_mode, + DPP_ACL_AS_MODE_E as_mode, + ZXIC_UINT32 as_baddr, + ZXIC_UINT32 block_num, + ZXIC_UINT32 *p_block_idx); +DPP_STATUS dpp_acl_res_destroy(ZXIC_UINT32 dev_id); + +#endif + +#if ZXIC_REAL("SDT data struct and function") +/** SDT属性中的表类型 */ +typedef enum dpp_sdt_table_type_e +{ + DPP_SDT_TBLT_INVALID = 0, /**< @brief 无效类型*/ + DPP_SDT_TBLT_eRAM = 1, /**< @brief eRAM直接表类型*/ + DPP_SDT_TBLT_DDR3 = 2, /**< @brief DDR3直接表类型*/ + DPP_SDT_TBLT_HASH = 3, /**< @brief Hash表类型*/ + DPP_SDT_TBLT_LPM = 4, /**< @brief LPM表类型*/ + DPP_SDT_TBLT_eTCAM = 5, /**< @brief 片内Tcam表类型*/ + DPP_SDT_TBLT_PORTTBL = 6, /**< @brief 物理端口属性表*/ + DPP_SDT_TBLT_MAX = 7, +} DPP_SDT_TABLE_TYPE_E; + +/** 返回位宽模式*/ +typedef enum dpp_sdt_rsp_mode_e +{ + DPP_SDT_RSP_32b = 0, /** 返回32bit位宽表结果*/ + DPP_SDT_RSP_64b = 1, /** 返回64bit位宽表结果*/ + DPP_SDT_RSP_128b = 2, /** 返回128bit位宽表结果*/ + DPP_SDT_RSP_256b = 3, /** 返回256bit位宽表结果*/ +} DPP_SDT_RSP_MODE_E; + +/** eRam直接表SDT属性*/ +typedef struct dpp_sdt_tbl_eram_t +{ + ZXIC_UINT32 table_type; /** <@brief 查找表项类型 */ + ZXIC_UINT32 eram_mode; /** <@brief eRam返回位宽 */ + ZXIC_UINT32 eram_base_addr; /** <@brief eRam表项基地址,128bit为单位 */ + ZXIC_UINT32 eram_table_depth; /** <@brief 表项深度,作为越界检查使用 */ + ZXIC_UINT32 eram_clutch_en; /** <@brief 抓包使能 */ +} DPP_SDTTBL_ERAM_T; + +/** DDR3直接表SDT属性*/ +typedef struct dpp_sdt_tbl_ddr3_t +{ + ZXIC_UINT32 table_type; /** <@brief 查找表项类型 */ + ZXIC_UINT32 ddr3_base_addr; /** <@brief ddr 基地址 */ + ZXIC_UINT32 ddr3_share_type; /** <@brief ddr 共享类型 */ + ZXIC_UINT32 ddr3_rw_len; /** <@brief 表项返回/写入位宽 */ + ZXIC_UINT32 ddr3_sdt_num; /** <@brief SDT表号/复制信息ram的表号 */ + ZXIC_UINT32 ddr3_ecc_en; /** <@brief ecc使能 */ + ZXIC_UINT32 ddr3_clutch_en; /** <@brief 抓包使能 */ +} DPP_SDTTBL_DDR3_T; + +/** HASH表SDT属性*/ +typedef struct dpp_sdt_tbl_hash_t +{ + ZXIC_UINT32 table_type; /** <@brief 查找表项类型 */ + ZXIC_UINT32 hash_id; /** <@brief 访问hash的引擎 */ + ZXIC_UINT32 hash_table_width; /** <@brief hash 表项存储位宽 */ + ZXIC_UINT32 key_size; /** <@brief hash 键值长度 */ + ZXIC_UINT32 hash_table_id; /** <@brief hash 逻辑表号 */ + ZXIC_UINT32 learn_en; /** <@brief 硬件学习使能 */ + ZXIC_UINT32 keep_alive; /** <@brief 保活标志使能 */ + ZXIC_UINT32 keep_alive_baddr; /** <@brief 保活标志基地址 */ + ZXIC_UINT32 rsp_mode; /** <@brief 表项返回数据位宽 */ + ZXIC_UINT32 hash_clutch_en; /** <@brief 抓包使能 */ +} DPP_SDTTBL_HASH_T; + +/** LPM表SDT属性*/ +typedef struct dpp_sdt_tbl_lpm_t +{ + ZXIC_UINT32 table_type; /** <@brief 查找表项类型 */ + ZXIC_UINT32 lpm_v46_id; /** <@brief ipv4/ipv6标志 */ + ZXIC_UINT32 rsp_mode; /** <@brief 表项返回数据位宽 */ + ZXIC_UINT32 lpm_table_depth; /** <@brief 表项深度,越界检查 */ + ZXIC_UINT32 lpm_clutch_en; /** <@brief 抓包使能 */ +} DPP_SDTTBL_LPM_T; + +/** eTCAM表SDT属性*/ +typedef struct dpp_sdt_tbl_etcam_t +{ + ZXIC_UINT32 table_type; /** <@brief 查找表项类型 */ + ZXIC_UINT32 etcam_id; /** <@brief etcam通道 */ + ZXIC_UINT32 etcam_key_mode; /** <@brief etcam键值长度 */ + ZXIC_UINT32 etcam_table_id; /** <@brief etcam表项号 */ + ZXIC_UINT32 no_as_rsp_mode; /** <@brief handle模式返回位宽 */ + ZXIC_UINT32 as_en; /** <@brief 级联eram使能 */ + ZXIC_UINT32 as_eram_baddr; /** <@brief 级联eram基地址 */ + ZXIC_UINT32 as_rsp_mode; /** <@brief 级联返回位宽 */ + ZXIC_UINT32 etcam_table_depth; /** <@brief 表项深度,越界检查 */ + ZXIC_UINT32 etcam_clutch_en; /** <@brief 抓包使能 */ +} DPP_SDTTBL_ETCAM_T; + +/** 物理端口属性表SDT属性*/ +typedef struct dpp_sdt_tbl_porttbl_t +{ + ZXIC_UINT32 table_type; /** <@brief 查找表项类型 */ + ZXIC_UINT32 porttbl_clutch_en; /** <@brief 抓包使能 */ +} DPP_SDTTBL_PORTTBL_T; + +/***********************************************************/ +/** 初始化SDT表配置管理 +* @param dev_num 设备数目 +* @param dev_id_array 设备dev_id数组 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wcl @date 2015/07/13 +************************************************************/ +DPP_STATUS dpp_sdt_init(ZXIC_UINT32 dev_num, ZXIC_UINT32 *dev_id_array); + +/***********************************************************/ +/** 写SDT属性表条目到硬件表,同时向8个cluster写入 +* @param dev_id 设备号 +* @param sdt_no 业务表对应的sdt号 +* @param table_type SDT属性中的表类型,取值参考DPP_SDT_TABLE_TYPE_E的定义(仅添加操作时有效) +* @param p_sdt_info 写入的SDT属性(仅添加操作时有效)。由table_type确定此ZXIC_VOID型指针对应的数据结构, 包括: \n +* DPP_SDTTBL_ERAM_T、DPP_SDTTBL_DDR3_T、DPP_SDTTBL_HASH_T、DPP_SDTTBL_LPM_T、\n +* DPP_SDTTBL_ETCAM_T、DPP_SDTTBL_XTCAM_T、DPP_SDTTBL_PORTTBL_T。 +* @param opr_type 操作类型: 0-添加条目,1-删除条目. +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wcl @date 2015/07/11 +************************************************************/ +DPP_STATUS dpp_sdt_tbl_write(DPP_DEV_T *dev, + ZXIC_UINT32 sdt_no, + ZXIC_UINT32 table_type, + ZXIC_VOID *p_sdt_info, + ZXIC_UINT32 opr_type); + +#endif + +#endif /*dpp_se_api.h*/ diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_stat_api.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_stat_api.h new file mode 100755 index 0000000..5737757 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_stat_api.h @@ -0,0 +1,533 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_stat_api.h +* 文件标识 : stat计数模块对外数据类型定义和接口函数声明 +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : xjw +* 完成日期 : 2015/02/09 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef _DPP_STAT_API_H_ +#define _DPP_STAT_API_H_ + + +#if ZXIC_REAL("header file") + +#include "dpp_dev.h" + +#endif + +#if ZXIC_REAL("data struct define") +/** STAT模块TM模式*/ +typedef enum stat_tm_mode_e +{ + STAT_TM_MODE_ETM = 0, /**< @brief 上行TM */ + STAT_TM_MODE_FTM = 1, /**< @brief 下行TM */ + STAT_TM_MODE_MAX +}STAT_TM_MODE_E; + +/** TM统计端口选择 */ +typedef enum stat_tm_port_mode_e +{ + STAT_TM_PORT_MODE_0_1 = 0, /**< @brief 端口0~1 */ + STAT_TM_PORT_MODE_2_3 = 1, /**< @brief 端口2~3 */ + STAT_TM_PORT_MODE_MAX, +}STAT_TM_PORT_MODE_E; + +/**TM统计计数模式选择 */ +typedef enum stat_tm_cnt_mode_e +{ + STAT_TM_CNT_MODE_MIX = 0, /**< @brief 混合模式 */ + STAT_TM_CNT_MODE_INNER = 1, /**< @brief 内部模式 */ + STAT_TM_CNT_MODE_MAX +}STAT_TM_CNT_MODE_E; + +/* TM计数器类型,共支持20种 */ +typedef enum tm_stat_type_e { + + TM_STAT_ENQUE_PKT = 0, /**< @brief 入队包计数*/ + TM_STAT_ENQUE_VALID_PKT = 1, /**< @brief 入队VALID包计数*/ + TM_STAT_ENQUE_DROP_PKT = 2, /**< @brief 入队丢弃包计数*/ + TM_STAT_ENQUE_TD_PKT = 3, /**< @brief 入队TD包计数*/ + TM_STAT_ENQUE_WRED_PKT = 4, /**< @brief 入队WRED包计数*/ + TM_STAT_ENQUE_DP0_PKT = 5, /**< @brief 入队DP0包计数*/ + TM_STAT_ENQUE_DP1_PKT = 6, /**< @brief 入队DP1包计数*/ + TM_STAT_ENQUE_DP2_PKT = 7, /**< @brief 入队DP2包计数*/ + TM_STAT_ENQUE_DP3_PKT = 8, /**< @brief 入队DP3包计数*/ + TM_STAT_ENQUE_DP4_PKT = 9, /**< @brief 入队DP4包计数*/ + TM_STAT_ENQUE_DP5_PKT = 10, /**< @brief 入队DP5包计数*/ + TM_STAT_ENQUE_DP6_PKT = 11, /**< @brief 入队DP6包计数*/ + TM_STAT_ENQUE_DP7_PKT = 12, /**< @brief 入队DP7包计数*/ + TM_STAT_ENQUE_BLOCK_PKT = 13, /**< @brief 入队BLOCK包计数*/ + TM_STAT_ENQUE_DISABLE_PKT = 14, /**< @brief 入队DISABLE包计数*/ + TM_STAT_DEQUE_PKT = 15, /**< @brief 出队包计数*/ + TM_STAT_DEQUE_VALID_PKT = 16, /**< @brief 出队VALID包计数*/ + TM_STAT_DEQUE_DISCARD_PKT = 17, /**< @brief 出队DISCARD包计数*/ + TM_STAT_DEQUE_CLEAR_PKT = 18, /**< @brief 出队CLEAR包计数*/ + TM_STAT_DEQUE_AGE_PKT = 19, /**< @brief 出队AGE包计数*/ + TM_STAT_TYPE_UNEN = 20, /**< @brief 不使能的时候,需配置成这个*/ + TM_STAT_TYPE_MAX +} TM_STAT_TYPE_E; + +/** car的监管类型 */ +typedef enum stat_car_type_e +{ + STAT_CAR_A_TYPE = 0, /**< @brief A级CAR*/ + STAT_CAR_B_TYPE, /**< @brief B级CAR*/ + STAT_CAR_C_TYPE, /**< @brief C级CAR*/ + STAT_CAR_MAX_TYPE +}STAT_CAR_TYPE_E; + +/** car监管队列配置*/ +typedef struct stat_car_queue_cfg_t +{ + ZXIC_UINT32 queue_id; /**< @brief 队列号*/ + ZXIC_UINT32 plcr_en; /**< @brief CAR使能*/ + ZXIC_UINT32 drop_flag; /**< @brief 丢弃标记*/ + ZXIC_VOID * profile_cfg; /**< @brief carA的包模式时,结构体类型是DPP_STAT_CAR_PKT_PROFILE_CFG_T,其余模式组合时,结构体类型DPP_STAT_CAR_PROFILE_CFG_T*/ +}STAT_CAR_QUEUE_CFG_T; + +/** stat模块计数模式设置*/ +typedef struct stat_count_cfg_t +{ + ZXIC_UINT32 rd_mode; /**< @brief 0:计数器在CPU读的下一拍自动清理,1:不自动清零*/ + ZXIC_UINT32 overflow_mode; /**< @brief 0:计数器达到最大值后,一直保持最大值,1:计数器累积到最高1bit为1,最高1bit始终为1,而其余为继续计数*/ +}STAT_COUNT_CFG_T; + +/** stat 的smmu1属性 */ +typedef struct dpp_stat_smmu1_cfg_t +{ + ZXIC_UINT32 baddr; /**< @brief 基地址*/ +}DPP_STAT_SMMU1_CFG_T; + +/** stat模块公共配置 */ +typedef struct dpp_stat_comm_cfg_t +{ + DPP_STAT_SMMU1_CFG_T stat_smmu1_cfg[DPP_DEV_CHANNEL_MAX]; /**< @brief stat 的smmu1属性*/ + ZXIC_UINT32 is_init[DPP_DEV_CHANNEL_MAX]; /**< @brief 初始化选择*/ +}DPP_STAT_COMM_CFG_T; + +/** stat模块tm统计配置 */ +typedef struct dpp_stat_tm_cfg_t +{ + ZXIC_UINT32 tm_en; /**< @brief TM统计使能 */ + ZXIC_UINT32 mov_en; /**< @brief 搬移使能*/ + ZXIC_UINT32 eram_en; /**< @brief 片内计数使能*/ + ZXIC_UINT32 ftm_pkt_en; /**< @brief ftm包计数使能*/ + ZXIC_UINT32 etm_pkt_en; /**< @brief etm包计数使能*/ + ZXIC_UINT32 ftm_port_type[4]; /**< @brief ftm包计数端口类型选择 参考 TM_STAT_TYPE_E */ + ZXIC_UINT32 etm_port_type[4]; /**< @brief etm包计数端口类型选择 参考 TM_STAT_TYPE_E */ + ZXIC_UINT32 etm_start_queue_id; /**< @brief etm起始队列号*/ + ZXIC_UINT32 etm_queue_depth_mode; /**< @brief etm队列深度*/ + DPP_STAT_SMMU1_CFG_T ftm_smmu1_cfg; /**< @brief ftm统计的smmu1属性*/ + DPP_STAT_SMMU1_CFG_T etm_smmu1_cfg; /**< @brief etm统计的smmu1属性*/ + ZXIC_UINT32 is_init[DPP_DEV_CHANNEL_MAX]; /**< @brief 初始化选择*/ +}DPP_STAT_TM_CFG_T; + +/** TM 统计计数信息 */ +typedef struct dpp_stat_tm_cnt_t +{ + ZXIC_UINT32 tm_cnt_en; /**< @brief tm计数使能*/ + ZXIC_UINT32 tm_mode; /**< @brief TM统计模式:0-ftm, 1-etm*/ + ZXIC_UINT32 tm_flow_id; /**< @brief TM统计流号*/ + ZXIC_UINT32 tm_stat_type; /**< @brief TM统计端口类型*/ + ZXIC_UINT32 is_tm_byte_en; /**< @brief TM统计字节计数使能*/ + ZXIC_UINT32 is_eram_en; /**< @brief TM统计片内计数使能*/ + ZXIC_UINT64 tm_cnt; /**< @brief TM计数结果*/ +}DPP_STAT_TM_CNT_T; + +/** STAT 中断状态 */ +typedef struct dpp_stat_brief_int_t +{ + ZXIC_UINT32 etcam_int; /**< @brief etcam模块中断 */ + ZXIC_UINT32 stat_sch_int; /**< @brief stat sch剩余部分的中断状态 */ +}DPP_STAT_BRIEF_INT_T; + +/** STAT fifo中断状态选择 */ +typedef struct dpp_stat_sch_intr_t +{ + ZXIC_UINT32 hardware_rsv; /**< @brief 系统保留,用户无需关心*/ + ZXIC_UINT32 oam0_ord_fifo_int; /**< @brief oam0保序模块中断*/ + ZXIC_UINT32 oam2_ord_fifo_int; /**< @brief oam2保序模块中断*/ + ZXIC_UINT32 oam3_ord_fifo_int; /**< @brief oam3保序模块中断*/ + ZXIC_UINT32 ddr_sch_fifo_int; /**< @brief ddr调度中断*/ + ZXIC_UINT32 plcr_sch_fifo_int; /**< @brief plcr调度中断*/ + ZXIC_UINT32 stat_schd_fifo_int; /**< @brief stat模块key调度中断*/ + ZXIC_UINT32 stat_rschd_fifo_int; /**< @brief stat模块rsp调度中断*/ +}DPP_STAT_SCH_INTR_T; + +/*stat 计数类型*/ +typedef enum stat_cnt_mode_e +{ + STAT_64_MODE = 0, /**< @brief 64bit位宽模式*/ + STAT_128_MODE = 1, /**< @brief 128bit位宽模式*/ + STAT_MAX_MODE, +}STAT_CNT_MODE_E; + +/**DPP STAT读清模式选择 */ +typedef enum stat_rd_clr_mode_e +{ + STAT_RD_CLR_MODE_UNCLR = 0, /**< @brief 不读请*/ + STAT_RD_CLR_MODE_CLR = 1, /**< @brief 读清*/ + STAT_RD_CLR_MODE_MAX, +}STAT_RD_CLR_MODE_E; + +/* car 优先级 */ +typedef enum dpp_car_priority_e +{ + DPP_CAR_PRI0 = 0, /**< @brief CAR优先级0配置*/ + DPP_CAR_PRI1 = 1, /**< @brief CAR优先级1配置*/ + DPP_CAR_PRI2 = 2, /**< @brief CAR优先级2配置*/ + DPP_CAR_PRI3 = 3, /**< @brief CAR优先级3配置*/ + DPP_CAR_PRI4 = 4, /**< @brief CAR优先级4配置*/ + DPP_CAR_PRI5 = 5, /**< @brief CAR优先级5配置*/ + DPP_CAR_PRI6 = 6, /**< @brief CAR优先级6配置*/ + DPP_CAR_PRI7 = 7, /**< @brief CAR优先级7配置*/ + DPP_CAR_PRI_MAX +}DPP_CAR_PRIORITY_E; + +/** car 监管模板参数设置的参数 */ +typedef struct dpp_stat_car_profile_cfg_t +{ + ZXIC_UINT32 profile_id; /**< @brief car模板号*/ + ZXIC_UINT32 pkt_sign; /**< @brief 包限速选择标志*/ + ZXIC_UINT32 cd; /**< @brief CD算法标志/令牌桶算法标志 0:srtcm 1:trtcm 2:MEF10.1*/ + ZXIC_UINT32 cf; /**< @brief CF溢出耦合标志,0:不溢出,1:溢出*/ + ZXIC_UINT32 cm; /**< @brief CM色盲/色敏标志,0:色盲模式,1:色敏模式 */ + ZXIC_UINT32 cir; /**< @brief C令牌桶添加速率(0~X, X Gbps/64kbps),最小值为64Kbps,步长为64Kbps*/ + ZXIC_UINT32 cbs; /**< @brief C桶桶深(XM),配置范围为0~XMByte-1,步长为1Byte*/ + ZXIC_UINT32 eir; /**< @brief E令牌桶添加速率(0~X, XGbps/64kbps),最小值为64Kbps,步长为64Kbps*/ + ZXIC_UINT32 ebs; /**< @brief E桶桶深(XM),配置范围为0~XMByte-1,步长为1Byte*/ + ZXIC_UINT32 random_disc_e; /**< @brief 仅carB、carC支持 */ + ZXIC_UINT32 random_disc_c; /**< @brief 仅carB、carC支持 */ + ZXIC_UINT32 c_pri[DPP_CAR_PRI_MAX]; /**< @brief 仅pri 1~7是有效值*/ + ZXIC_UINT32 e_green_pri[DPP_CAR_PRI_MAX]; /**< @brief 仅pri 1~7是有效值*/ + ZXIC_UINT32 e_yellow_pri[DPP_CAR_PRI_MAX]; +}DPP_STAT_CAR_PROFILE_CFG_T; + +/* car 独占smmu0的模式 */ +typedef enum dpp_car_smmu0_mono_mode_e +{ + CAR_SMMU0_MONO_MODE_NONE = 0, /**< @brief CAR不独占smmu0*/ + CAR_SMMU0_MONO_MODE_1 = 1, /**< @brief CAR独占1片smmu0*/ + CAR_SMMU0_MONO_MODE_2 = 2, /**< @brief CAR独占2片smmu0*/ + CAR_SMMU0_MONO_MODE_MAX +}DPP_CAR_SMMU0_MONO_MODE_E; + +/* TM统计的读清模式 */ +typedef enum stat_tm_clr_mode_e +{ + STAT_TM_CLR_MODE_UNCLR = 0, /**< @brief TM统计不读请*/ + STAT_TM_CLR_MODE_CLR = 1, /**< @brief TM统计读请*/ + STAT_TM_CLR_MODE_MAX, +}STAT_TM_CLR_MODE_E; + +/** car A 队列设置的参数 */ +typedef struct dpp_stat_car_a_queue_cfg_t +{ + ZXIC_UINT32 flow_id; + ZXIC_UINT32 drop_flag; + ZXIC_UINT32 plcr_en; + ZXIC_UINT32 profile_id; + ZXIC_UINT64 tq; + ZXIC_UINT32 ted; + ZXIC_UINT32 tcd; + ZXIC_UINT32 tei; + ZXIC_UINT32 tci; +}DPP_STAT_CAR_A_QUEUE_CFG_T; + +#endif + +#if ZXIC_REAL("macro function define") + +#endif + + +#if ZXIC_REAL("function declaration") +/***********************************************************/ +/** stat公共配置初始化 +* @param dev_id +* @param p_dpp_stat_comm_cfg +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/07/14 +************************************************************/ +DPP_STATUS dpp_stat_comm_init(ZXIC_UINT32 dev_id, DPP_STAT_COMM_CFG_T * p_dpp_stat_comm_cfg); + +/***********************************************************/ +/** 设置ppu统计 ERAM基地址 +* @param dev_id 设备号 +* @param ppu_eram_baddr ppu统计eRam基地址,128bit为单位 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/03/31 +************************************************************/ +DPP_STATUS dpp_stat_ppu_eram_baddr_set(DPP_DEV_T *dev, ZXIC_UINT32 ppu_eram_baddr); + +/***********************************************************/ +/** 设置ppu统计片内深度 +* @param dev_id 设备号 +* @param ppu_eram_depth ppu统计片内深度 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/03/31 +************************************************************/ +DPP_STATUS dpp_stat_ppu_eram_depth_set(DPP_DEV_T *dev, ZXIC_UINT32 ppu_eram_depth); + +/***********************************************************/ +/** 设置ppu统计 DDR基地址 +* @param dev_id 设备号 +* @param ppu_ddr_baddr ppu统计DDR基地址 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/03/31 +************************************************************/ +DPP_STATUS dpp_stat_ppu_ddr_baddr_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 ppu_ddr_baddr); + +/***********************************************************/ +/** TM配置初始化 +* @param dev_id +* @param p_stat_tm_cfg +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/08/03 +************************************************************/ +DPP_STATUS dpp_stat_tm_init(ZXIC_UINT32 dev_id, DPP_STAT_TM_CFG_T *p_stat_tm_cfg); + +/***********************************************************/ +/** 配置Etm 统计类型 +* @param dev_id 设备号 +* @param etm_port0_type 统计类型0 +* @param etm_port1_type 统计类型1 +* @param etm_port2_type 统计类型2 +* @param etm_port3_type 统计类型3 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/03/31 +************************************************************/ +DPP_STATUS dpp_stat_etm_port_type_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 etm_port0_type, + ZXIC_UINT32 etm_port1_type, + ZXIC_UINT32 etm_port2_type, + ZXIC_UINT32 etm_port3_type); + +/***********************************************************/ +/** 配置Ftm 统计类型 +* @param dev_id 设备号 +* @param ftm_port0_type 统计类型0 +* @param ftm_port1_type 统计类型1 +* @param ftm_port2_type 统计类型2 +* @param ftm_port3_type 统计类型3 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/03/31 +************************************************************/ +DPP_STATUS dpp_stat_ftm_port_type_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 ftm_port0_type, + ZXIC_UINT32 ftm_port1_type, + ZXIC_UINT32 ftm_port2_type, + ZXIC_UINT32 ftm_port3_type); + + + +/***********************************************************/ +/** car硬件初始化 +* @param dev_id 设备号 +* @param car_type car编号 +* @param car_type car模式,参见STAT_CAR_TYPE_E +* @param car_mono_mode car独占mono模式 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/27 +************************************************************/ +DPP_STATUS dpp_stat_car_hardware_init(ZXIC_UINT32 dev_id, + ZXIC_UINT32 car_type, + ZXIC_UINT32 car_mono_mode); + +/***********************************************************/ +/** 配置car的层级模式 +* @param dev_id +* @param mode 2 - 三级car, 第一级支持16K +* 1 - 两级car, 第一级扩展为17K +* 0 - 一级car, 第一级扩展为21K +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/09/28 +************************************************************/ +DPP_STATUS dpp_stat_car_en_mode_set(DPP_DEV_T *dev, ZXIC_UINT32 mode); + +/***********************************************************/ +/** car A 字节限速监管模板设定 +* @param dev_id 设备 car号 +* @param profile_id 监管模板号 +* @param p_cara_profile_cfg 监管模板配置 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/05 +************************************************************/ +DPP_STATUS dpp_stat_cara_profile_cfg_set(DPP_DEV_T *dev, + ZXIC_UINT32 profile_id, + DPP_STAT_CAR_PROFILE_CFG_T* p_cara_profile_cfg); + +/***********************************************************/ +/** 获取car A的流设置 +* @param dev_id 设备 car编号 +* @param flow_id 流号 +* @param p_cara_queue_cfg car A流配置信息 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/05 +************************************************************/ +DPP_STATUS dpp_stat_cara_queue_cfg_get(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + DPP_STAT_CAR_A_QUEUE_CFG_T* p_cara_queue_cfg); + +/***********************************************************/ +/** car A的流设置 +* @param dev_id 设备 car编号 +* @param flow_id 流号 +* @param drop_flag 丢弃标志 +* @param plcr_en 监管使能 +* @param profile_id 监管模板号 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/05 +************************************************************/ +DPP_STATUS dpp_stat_cara_queue_cfg_set(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 drop_flag, + ZXIC_UINT32 plcr_en, + ZXIC_UINT32 profile_id); + +/***********************************************************/ +/** stat模块常用函数列表 +* @param dev_id +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 刘硕10181552 @date 2016/02/03 +************************************************************/ +DPP_STATUS dpp_stat_help(ZXIC_UINT32 dev_id); + +/***********************************************************/ +/** stat 模块上电初始化 +* @param dev_id +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2017/07/20 +************************************************************/ +DPP_STATUS dpp_stat_module_init(ZXIC_UINT32 dev_id); + +/***********************************************************/ +/** ppu stat读统计结果配置 +* @param dev_id 设备号 +* @param rd_mode 读取位宽模式,参见STAT_CNT_MODE_E,0-64bit,1-128bit +* @param index 索引,具体位宽参见rd_mode +* @param p_data 出参,读取的数据 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author xhj @date 2018/02/01 +************************************************************/ +DPP_STATUS dpp_stat_ppu_cnt_set(ZXIC_UINT32 dev_id, + STAT_CNT_MODE_E rd_mode, + ZXIC_UINT32 index, + ZXIC_UINT32 *p_data); + +/***********************************************************/ +/** ppu计数值获取 +* @param dev_id 设备号 +* @param rd_mode 读取位宽模式,参见STAT_CNT_MODE_E,0-64bit,1-128bit +* @param index 索引,具体位宽参见rd_mode +* @param clr_mode 读清模式,参见STAT_RD_CLR_MODE_E,0-不读清,1-读清 +* @param p_data 出参,读取的数据 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/07/11 +************************************************************/ +DPP_STATUS dpp_stat_ppu_cnt_get(DPP_DEV_T *dev, + STAT_CNT_MODE_E rd_mode, + ZXIC_UINT32 index, + ZXIC_UINT32 clr_mode, + ZXIC_UINT32 *p_data); + +/***********************************************************/ +/** TM计数值获取 +* @param dev_id 设备号 +* @param tm_mode tm模式,0-ftm,1-etm 参见STAT_TM_MODE_E +* @param only_pkt_num_en 全包模式使能 +* @param port_mode 端口位置模式,参见STAT_TM_PORT_MODE_E +* @param cnt_mode 计数模式,0-片内计数,1-混合计数 +* @param clr_mode 读清模式,0-非读清,1-读清 +* @param index 索引值 +* @param p_data 数据 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/07/19 +************************************************************/ +DPP_STATUS dpp_stat_tm_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 tm_mode, + ZXIC_UINT32 only_pkt_num_en, + ZXIC_UINT32 port_mode, + ZXIC_UINT32 cnt_mode, + ZXIC_UINT32 clr_mode, + ZXIC_UINT32 index, + ZXIC_UINT32 *p_data); + +/***********************************************************/ +/** CMMU配置信息、ppu stat 统计计数配置打印 +* @param dev_id +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 刘硕10181552 @date 2016/01/20 +************************************************************/ +DPP_STATUS diag_dpp_stat_ppu_cfg_prt(ZXIC_UINT32 dev_id); + +#endif +#endif /*dpp_stat_api.h*/ + + + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_tm_api.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_tm_api.h new file mode 100755 index 0000000..9da623f --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_tm_api.h @@ -0,0 +1,1209 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_tm_api.h +* 文件标识 : tm模块对外数据类型定义和接口函数声明 +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : djf +* 完成日期 : 2015/02/04 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ +#ifndef _DPP_TM_API_H_ +#define _DPP_TM_API_H_ + + +#if ZXIC_REAL("header file") +#include "dpp_module.h" +#endif + +#if ZXIC_REAL("macro") +#define DPP_TM_SA_NUM (128) +#define DPP_TM_PP_NUM (64)/**< @brief TM内部逻辑端口数 */ +#define DPP_ETM_Q_NUM (9216)/**< @ETM qmu支持9K物理队列 */ +#define DPP_FTM_Q_NUM (2048)/**< @FTM qmu支持2k队列 */ +#define DPP_ETM_CRDT_NUM (0x47FF) /*etm 支持的crdt流队列逻辑编号cir+eir=18K */ +#define DPP_FTM_CRDT_NUM (0xFFF) /*ftm 支持的crdt流队列逻辑编号cir+eir=4K */ +#define DPP_ETM_MID_SE_NUM (6144)/**< @ETM中间级共享0x17FF调度单元 */ +#define DPP_FTM_MID_SE_NUM (512)/**< @FTM 中间级共享0x1FF调度单元 */ +#define DPP_ETM_MID_WFQFQ_NUM (8 * 6144)/**< @brief 中间级共享8 * 6144调度器 */ +#define DPP_FTM_MID_WFQFQ_NUM (8 * 512)/**< @brief 中间级共享8 * 512调度器 */ + + +#define DPP_ETM_WFQSP_OFFSET (0x4000) /*etm sp-wfq调度器相对于fq调度器编号偏移*/ +#define DPP_ETM_FQ_NUM (16*1024) /*etm fq调度器个数*/ +#define DPP_ETM_WFQSP_NUM (9*1024) /*etm sp8和wfq调度器个数*/ +#define DPP_ETM_FQSPWFQ_NUM (25*1024) /*etm fq-sp-wfq调度器总个数*/ +#define DPP_FTM_WFQSP_NUM (1920+64) /*ftm sp8和wfq调度器个数+64个端口*/ +#define DPP_ETM_SCH_DEL_NUM (0xABFF) /*etm-crdt要删除的流和调度器编号*/ +#define DPP_FTM_SCH_DEL_NUM (0x177F) /*ftm-crdt要删除的流和调度器编号*/ + +#define DPP_TM_INVALID_PORT (0xFFFF) /* 定义crdt无效端口号,用于判定crdt挂接状态 */ +#define DPP_FTM_DELETED_LINK_ID (0x7FF) /**定义ftm已被删除的link_id**/ +#define DPP_ETM_DELETED_LINK_ID (0x7FFF) /**定义etm已被删除的link_id**/ + + + +/* ftm/etm调度器往端口级挂接link_id偏移 */ +#define DPP_FTM_PORT_LINKID_BASE (0x780) +#define DPP_ETM_PORT_LINKID_BASE (0x7F80) +/**SHAP模块se_id编号基址(非从0开始)**/ +#define DPP_FTM_SHAP_SEID_BASE (0x1000) +#define DPP_ETM_SHAP_SEID_BASE (0x4800) + + + +/**< @brief TD */ +#define DPP_TM_Q_TD_TH_MAX (8192)/**< @brief Kbyte */ +#define DPP_TM_PP_TD_TH_MAX (8192)/**< @brief Kbyte */ +#define DPP_TM_SYS_TD_TH_MAX (8192)/**< @brief Kbyte */ + +#define DPP_TM_Q_AVG_Q_LEN_MAX (8192)/**< @brief Kbyte */ +#define DPP_TM_PP_AVG_Q_LEN_MAX (8192)/**< @brief Kbyte */ +#define DPP_TM_SYS_AVG_Q_LEN_MAX (8192)/**< @brief Kbyte */ + +/**< @brief WRED */ +#define DPP_TM_Q_WRED_NUM (32)/**< @brief 队列级WRED组数 */ +#define DPP_TM_Q_WRED_TH_MAX (8192)/**< @brief Kbyte */ +#define DPP_TM_Q_WRED_MAX_TH_MAX (8192)/**< @brief Kbyte */ +#define DPP_TM_Q_WRED_MIN_TH_MAX (8192)/**< @brief Kbyte */ +#define DPP_TM_Q_WRED_MAX_CFG_PARA (0xffffffff) + +#define DPP_TM_PP_WRED_NUM (8)/**< @brief 端口级WRED组数 */ +#define DPP_TM_PP_WRED_TH_MAX (8192)/**< @brief Kbyte */ +#define DPP_TM_PP_WRED_MAX_TH_MAX (8192)/**< @brief Kbyte */ +#define DPP_TM_PP_WRED_MIN_TH_MAX (8192)/**< @brief Kbyte */ +#define DPP_TM_PP_WRED_MAX_CFG_PARA (0xffffffff) + +/**< @brief GRED */ +#define DPP_TM_SYS_GRED_TH_MAX (8192)/**< @brief Kbyte */ +#define DPP_TM_SYS_GRED_MAX_TH_MAX (8192)/**< @brief Kbyte */ +#define DPP_TM_SYS_GRED_MIN_TH_MAX (8192)/**< @brief Kbyte */ +#define DPP_TM_SYS_GRED_MID_TH_MAX (8192)/**< @brief Kbyte */ + +#define DPP_TM_DP_NUM (8)/**< @brief DP曲线数 */ +#define DPP_TM_RED_P_MIN (1) +#define DPP_TM_RED_P_MAX (100) +#define DPP_TM_CGAVD_WEIGHT_MAX (15) +#define DPP_TM_CGAVD_MOVE_PROFILE_NUM (16) + + +#define DPP_TM_SCH_WEIGHT_INVALID (0) /**< @brief WFQ权重,FQ时weight是无效的 */ +#define DPP_TM_SCH_WEIGHT_MIN (1) +#define DPP_TM_SCH_WEIGHT_MAX (511) +#define DPP_TM_SCH_SP_NUM (8) + +#define DPP_ETM_MID_SHAPE_PROFILE_NUM (512)/**< ETM中间级整形策略数 */ +#define DPP_FTM_MID_SHAPE_PROFILE_NUM (64)/**< FTM中间级整形策略数 */ +#define DPP_ETM_FLOW_SHAPE_PROFILE_NUM (512)/**< ETM 流级整形策略数 */ +#define DPP_FTM_FLOW_SHAPE_PROFILE_NUM (128)/**< FTM 流级整形策略数 */ + +#define DPP_TM_SHAPE_CIR_MIN (0) /**< @brief kbps */ +#define DPP_TM_SHAPE_CIR_MAX (800 * 1000 * 1000) /**< @brief kbps:用户可配最大整形 */ +#define DPP_TM_SHAPE_CBS_MIN (0) /**< @brief kbyte */ +#define DPP_TM_SHAPE_CBS_MAX (128 * 1024) /**< @brief kbyte:用户可配最大桶深 128M */ + + +/**< CBS写入寄存器最大值为0x7FF */ +#define DPP_TM_SHAPE_CBS_REG_MIN (0) /**< @brief kbyte */ +#define DPP_TM_SHAPE_CBS_REG_MAX (0x7FF) /**< @brief kbyte */ + +#define DPP_TM_SYS_HZ (1000*1000*1000) /* 系统主频1000MHz */ + +#define DPP_TM_TC_NUM (8) + +#endif + + +#if ZXIC_REAL("data struct define") +/**< @brief 内置TM工作模式 */ +typedef enum dpp_tm_work_mode_e +{ + DPP_TM_WORK_MODE_TM = 0, + DPP_TM_WORK_MODE_SA, + DPP_TM_WORK_MODE_INVALID +} DPP_TM_WORK_MODE_E; + +/**< @brief QMU工作模式 */ +typedef enum dpp_tm_qmu_work_mode_e +{ + DPP_TM_QMU_WORK_MODE_2M = 0, /**< @brief 2M节点工作模式 */ + DPP_TM_QMU_WORK_MODE_4M, /**< @brief 4M节点工作模式 */ + DPP_TM_QMU_WORK_MODE_INVALID +} DPP_TM_QMU_WORK_MODE_E; + +/**< @brief QMU DDR随机模式 */ +typedef enum dpp_tm_qmu_ddr_random_mode_e +{ + DPP_TM_QMU_DDR_NOT_RANDOM = 0, /**< @brief DDR不随机模式 */ + DPP_TM_QMU_DDR_RANDOM, /**< @brief DDR随机模式 */ + DPP_TM_QMU_DDR_RANDOM_MODE_INVALID +} DPP_TM_QMU_DDR_RANDOM_MODE_E; + +/**< @brief 计数模式寄存器 */ +typedef struct dpp_tm_cnt_mode_t +{ + + ZXIC_UINT32 fc_count_mode; /**< @brief 计数流控模式 */ + ZXIC_UINT32 count_rd_mode; /**< @brief 计数读模式 */ + ZXIC_UINT32 count_overflow_mode; /**< @brief 计数溢出模式 */ +} DPP_TM_CNT_MODE_T; + +/**< @brief 中断信息 */ +typedef struct dpp_tm_int_t +{ + + ZXIC_UINT32 shap_int; + ZXIC_UINT32 crdt_int; + ZXIC_UINT32 mmu_int; + ZXIC_UINT32 qmu_int; + ZXIC_UINT32 cgavd_int; + ZXIC_UINT32 olif_int; + ZXIC_UINT32 cfgmt_int; +} DPP_TM_INT_T; + + +/**< @brief 拥塞避免层次 */ +typedef enum dpp_tm_cgavd_level_e +{ + QUEUE_LEVEL = 0, /**< @brief 流队列级 */ + PP_LEVEL, /**< @brief 端口级 */ + SYS_LEVEL, /**< @brief 系统级 */ + SA_LEVEL, /**< @brief SA队列不可达拥塞避免 */ + INVALID_LEVEL +} DPP_TM_CGAVD_LEVEL_E; + +/**< @brief dp选取值 */ +typedef enum dpp_tm_cgavd_dp_sel_e +{ + DP_SEL_DP = 0, /**< @brief 选tm头中dp字段作为cgavd的dp */ + DP_SEL_TC, /**< @brief 选tm头中tc字段作为cgavd的dp */ + DP_SEL_PKT_LEN, /**< @brief 选tm头中pkt[2:0]字段作为cgavd的dp */ + INVALID_DP +} DPP_TM_CGAVD_DP_SEL_E; + +/**< @brief 拥塞避免模式 */ +typedef enum dpp_tm_cgavd_method_e +{ + TD_METHOD = 0, /**< @brief TD模式 */ + WRED_GRED_METHOD, /**< @brief 流级和端口级为WRED模式,系统级为GRED模式 */ + INVALID_METHOD +} DPP_TM_CGAVD_METHOD_E; + +/**< @brief WRED DP曲线配置参数 */ +typedef struct dpp_tm_wred_dp_line_para_t +{ + ZXIC_UINT32 max_th; /**< @brief 平均队列深度上限阈值 */ + ZXIC_UINT32 min_th; /**< @brief 平均队列深度下限阈值 */ + ZXIC_UINT32 max_p; /**< @brief 最大丢弃概率 */ + ZXIC_UINT32 weight; /**< @brief 平均队列深度计算权重 */ + ZXIC_UINT32 q_len_th; /**< @brief 队列深度阈值 */ +} DPP_TM_WRED_DP_LINE_PARA_T; + +/**< @brief GRED DP曲线配置参数 */ +typedef struct dpp_tm_gred_dp_line_para_t +{ + ZXIC_UINT32 max_th; /**< @brief 第2段平均队列深度上限阈值 */ + ZXIC_UINT32 mid_th; /**< @brief 第1段平均队列深度上限阈值 */ + ZXIC_UINT32 min_th; /**< @brief 第1段平均队列深度下限阈值 */ + ZXIC_UINT32 max_p; /**< @brief 最大丢弃概率 */ + ZXIC_UINT32 weight; /**< @brief 平均队列深度计算权重 */ + ZXIC_UINT32 q_len_th; /**< @brief 队列深度阈值 */ +} DPP_TM_GRED_DP_LINE_PARA_T; + +/**< @brief CRDT调度层次 */ +typedef enum dpp_tm_sch_level_e +{ + DPP_TM_SCH_LEVEL_Q = 1, + DPP_TM_SCH_LEVEL_VC = 2, + DPP_TM_SCH_LEVEL_VCG = 3, + DPP_TM_SCH_LEVEL_VP = 4, + DPP_TM_SCH_LEVEL_PP = 5, + DPP_TM_SCH_LEVEL_INVALID +} DPP_TM_SCH_LEVEL_E; + +/**< @brief SP_ID */ +typedef enum dpp_tm_sch_sp_e +{ + DPP_TM_SCH_SP_0 = 0, + DPP_TM_SCH_SP_1 = 1, + DPP_TM_SCH_SP_2 = 2, + DPP_TM_SCH_SP_3 = 3, + DPP_TM_SCH_SP_4 = 4, + DPP_TM_SCH_SP_5 = 5, + DPP_TM_SCH_SP_6 = 6, + DPP_TM_SCH_SP_7 = 7, + DPP_TM_SCH_SP_8 = 8, + DPP_TM_SCH_SP_INVALID +} DPP_TM_SCH_SP_E; + +/**< @brief 调度单元挂接参数 */ +typedef struct dpp_tm_sch_para_t +{ + ZXIC_UINT32 level_id; /**< @brief 当前为中间级时,vc:0 vcg:1 vp:2 para_get已加2供调用*/ + DPP_TM_SCH_LEVEL_E se_last_level; /**< @brief 挂接到的上级层次 */ + ZXIC_UINT32 se_id; /**< @brief 挂接到的上级调度单元ID */ + DPP_TM_SCH_SP_E c_sp_id; /**< @brief C桶挂接到的SPID,SP0~SP7 */ + DPP_TM_SCH_SP_E e_sp_id; /**< @brief E桶挂接到的SPID,SP0~SP7 */ + ZXIC_UINT32 sp_relay; /**< @brief 队列优先级传递标志,FLOW级时表示FLOW_WORK_MODE */ + ZXIC_UINT32 c_sp_weight; /**< @brief C桶挂接到的调度器是WFQ的话,WFQ的权重 */ + ZXIC_UINT32 e_sp_weight; /**< @brief E桶挂接到的调度器是WFQ的话,WFQ的权重 */ +} DPP_TM_SCH_PARA_T; + +/**< @brief 调度器参数 */ +typedef struct dpp_tm_wfqfq_t +{ + ZXIC_UINT32 wfqfq_id[8]; /**< @brief 本级调度单元下挂接的8个调度器ID,FQ/WFQ,由ID号区分 */ +} DPP_TM_WFQFQ_T; + +/**< @brief 流队列挂接参数 */ +typedef struct dpp_tm_sch_flow_para_t +{ + ZXIC_UINT32 c_linkid; /**< @brief c桶要挂接到的上级调度器id */ + ZXIC_UINT32 c_weight; /**< @brief c桶挂接到上级调度器的权重[1~511] */ + ZXIC_UINT32 c_sp; /**< @brief c桶挂接到上级调度器的sp优先级,有效值[0-8],共9级,优先级依次降低 */ + ZXIC_UINT32 mode; /**< @brief 挂接模式:0-单桶 1-双桶。配置单桶时无需关注后续参数,配0即可 */ + ZXIC_UINT32 e_linkid; /**< @brief e桶要挂接到的上级调度器id */ + ZXIC_UINT32 e_weight; /**< @brief e桶挂接到上级调度器的权重[1~511] */ + ZXIC_UINT32 e_sp; /**< @brief e桶挂接到上级调度器的sp优先级,有效值[0-8],共9级,优先级依次降低 */ +} DPP_TM_SCH_FLOW_PARA_T; + +/**< @brief 调度单元挂接参数:非优先级传递 */ +typedef struct dpp_tm_sch_se_para_t +{ + ZXIC_UINT32 se_linkid; /**< @brief 要挂接到的上级调度器id */ + ZXIC_UINT32 cp_token_en; /**< @brief 调度器cp双桶使能开关,仅fq8/wfq8支持 */ + ZXIC_UINT32 se_weight; /**< @brief 挂接到上级调度器的权重[1~511] */ + ZXIC_UINT32 se_sp; /**< @brief 挂接到上级调度器的sp优先级,有效值[0-8],共9级,优先级依次降低 */ +} DPP_TM_SCH_SE_PARA_T; + +/**< @brief 调度单元挂接参数:优先级传递开启 */ +typedef struct dpp_tm_sch_se_para_insw_t +{ + ZXIC_UINT32 se_linkid; /**< @brief 要挂接到的上级调度器id */ + ZXIC_UINT32 cp_token_en; /**< @brief 调度器cp双桶使能开关,仅fq8/wfq8支持 */ + ZXIC_UINT32 se_sp; /**< @brief 挂接到上级调度器的sp优先级,有效值[0-8],共9级,优先级依次降低 */ + ZXIC_UINT32 se_weight[8]; /**< @brief WFQ8中各调度器权重值[1~511],若是WFQ2/4 只取前面对应值,后面无效 */ +} DPP_TM_SCH_SE_PARA_INSW_T; + +typedef enum dpp_tm_sch_port_linkid_t +{ + DPP_TM_PP_LINKID_PORT0 = 0x7F80, + DPP_TM_PP_LINKID_PORT1 = 0x7F81, + DPP_TM_PP_LINKID_PORT2 = 0x7F82, + DPP_TM_PP_LINKID_PORT3 = 0x7F83, + DPP_TM_PP_LINKID_PORT4 = 0x7F84, + DPP_TM_PP_LINKID_PORT5 = 0x7F85, + DPP_TM_PP_LINKID_PORT6 = 0x7F86, + DPP_TM_PP_LINKID_PORT7 = 0x7F87, + DPP_TM_PP_LINKID_PORT8 = 0x7F88, + DPP_TM_PP_LINKID_PORT9 = 0x7F89, + DPP_TM_PP_LINKID_PORT10 = 0x7F8A, + DPP_TM_PP_LINKID_PORT11 = 0x7F8B, + DPP_TM_PP_LINKID_PORT12 = 0x7F8C, + DPP_TM_PP_LINKID_PORT13 = 0x7F8D, + DPP_TM_PP_LINKID_PORT14 = 0x7F8E, + DPP_TM_PP_LINKID_PORT15 = 0x7F8F, + DPP_TM_PP_LINKID_PORT16 = 0x7F90, + DPP_TM_PP_LINKID_PORT17 = 0x7F91, + DPP_TM_PP_LINKID_PORT18 = 0x7F92, + DPP_TM_PP_LINKID_PORT19 = 0x7F93, + DPP_TM_PP_LINKID_PORT20 = 0x7F94, + DPP_TM_PP_LINKID_PORT21 = 0x7F95, + DPP_TM_PP_LINKID_PORT22 = 0x7F96, + DPP_TM_PP_LINKID_PORT23 = 0x7F97, + DPP_TM_PP_LINKID_PORT24 = 0x7F98, + DPP_TM_PP_LINKID_PORT25 = 0x7F99, + DPP_TM_PP_LINKID_PORT26 = 0x7F9A, + DPP_TM_PP_LINKID_PORT27 = 0x7F9B, + DPP_TM_PP_LINKID_PORT28 = 0x7F9C, + DPP_TM_PP_LINKID_PORT29 = 0x7F9D, + DPP_TM_PP_LINKID_PORT30 = 0x7F9E, + DPP_TM_PP_LINKID_PORT31 = 0x7F9F, + DPP_TM_PP_LINKID_PORT32 = 0x7FA0, + DPP_TM_PP_LINKID_PORT33 = 0x7FA1, + DPP_TM_PP_LINKID_PORT34 = 0x7FA2, + DPP_TM_PP_LINKID_PORT35 = 0x7FA3, + DPP_TM_PP_LINKID_PORT36 = 0x7FA4, + DPP_TM_PP_LINKID_PORT37 = 0x7FA5, + DPP_TM_PP_LINKID_PORT38 = 0x7FA6, + DPP_TM_PP_LINKID_PORT39 = 0x7FA7, + DPP_TM_PP_LINKID_PORT40 = 0x7FA8, + DPP_TM_PP_LINKID_PORT41 = 0x7FA9, + DPP_TM_PP_LINKID_PORT42 = 0x7FAA, + DPP_TM_PP_LINKID_PORT43 = 0x7FAB, + DPP_TM_PP_LINKID_PORT44 = 0x7FAC, + DPP_TM_PP_LINKID_PORT45 = 0x7FAD, + DPP_TM_PP_LINKID_PORT46 = 0x7FAE, + DPP_TM_PP_LINKID_PORT47 = 0x7FAF, + DPP_TM_PP_LINKID_PORT48 = 0x7FB0, + DPP_TM_PP_LINKID_PORT49 = 0x7FB1, + DPP_TM_PP_LINKID_PORT50 = 0x7FB2, + DPP_TM_PP_LINKID_PORT51 = 0x7FB3, + DPP_TM_PP_LINKID_PORT52 = 0x7FB4, + DPP_TM_PP_LINKID_PORT53 = 0x7FB5, + DPP_TM_PP_LINKID_PORT54 = 0x7FB6, + DPP_TM_PP_LINKID_PORT55 = 0x7FB7, + DPP_TM_PP_LINKID_PORT56 = 0x7FB8, + DPP_TM_PP_LINKID_PORT57 = 0x7FB9, + DPP_TM_PP_LINKID_PORT58 = 0x7FBA, + DPP_TM_PP_LINKID_PORT59 = 0x7FBB, + DPP_TM_PP_LINKID_PORT60 = 0x7FBC, + DPP_TM_PP_LINKID_PORT61 = 0x7FBD, + DPP_TM_PP_LINKID_PORT62 = 0x7FBE, + DPP_TM_PP_LINKID_PORT63 = 0x7FBF, + DPP_TM_PP_LINKID_INVALID +} DPP_TM_SCH_PORT_LINKID_T; +typedef enum dpp_tm_shape_flag_e +{ + DPP_TM_SHAPE_FLAG_CIR = 0, + DPP_TM_SHAPE_FLAG_EIR = 1, + DPP_TM_SHAPE_FLAG_INVALID +} DPP_TM_SHAPE_FLAG_E; + +/**< @brief 整形令牌桶模式 */ +typedef enum dpp_tm_shape_mode_e +{ + DPP_TM_SINGLE_MIX_BUCKET = 0, /**< @brief 单桶/组合流 */ + DPP_TM_DUAL_BUCKET = 1, /**< @brief 双桶 */ + DPP_TM_DUAL_PIPE = 2, /**< @brief 被双桶 */ + DPP_TM_SHAPE_MODE_INVALID +} DPP_TM_SHAPE_MODE_E; + +/**< @brief 整形profile参数 */ +typedef struct dpp_tm_shape_profile_t +{ + ZXIC_UINT32 cir; + ZXIC_UINT32 cbs; + ZXIC_UINT32 eir; + ZXIC_UINT32 ebs; +} DPP_TM_SHAPE_PROFILE_T; + +/**< @brief 端口级整形参数 */ +typedef struct dpp_tm_shape_pp_para_t +{ + ZXIC_UINT32 cir; + ZXIC_UINT32 cbs; + ZXIC_UINT32 c_en; +} DPP_TM_SHAPE_PP_PARA_T; + +/**< @brief 调度单元整形参数 */ +typedef struct dpp_tm_shape_para_t +{ + ZXIC_UINT32 class_id; /**< @brief 当前中间级所属层次,vc:1 vcg:2 vp:3 */ + ZXIC_UINT32 profile_id; + ZXIC_UINT32 c_en; + ZXIC_UINT32 e_en; + DPP_TM_SHAPE_MODE_E mode; +} DPP_TM_SHAPE_PARA_T; + +/**< @brief 整形参数 */ +typedef struct dpp_tm_shape_t +{ + ZXIC_UINT32 mid_level; /**< @brief 当前中间级所属层次,vc:1 vcg:2 vp:3 */ + ZXIC_UINT32 cir; + ZXIC_UINT32 cbs; + ZXIC_UINT32 eir; + ZXIC_UINT32 ebs; + ZXIC_UINT32 c_en; + ZXIC_UINT32 e_en; + ZXIC_UINT32 mode; +} DPP_TM_SHAPE_T; + +typedef struct dpp_tm_shape_para +{ + ZXIC_UINT32 shape_cir; + ZXIC_UINT32 shape_cbs; + ZXIC_UINT32 shape_num; +} DPP_TM_SHAPE_PARA_TABLE; + + +/**< @brief TM初始化参数 */ +typedef struct dpp_tm_init_para_t +{ + DPP_TM_WORK_MODE_E tm_sa_mode; /**< @brief TM或SA模式 */ + DPP_TM_QMU_WORK_MODE_E qmu_mode; /**< @brief QMU 2M或4M节点模式 */ + ZXIC_UINT32 case_num; /**< @brief 四组QMU初始化场景编号为1-4;ddr*bank:1:4x2;2:4x4;3:8x2;4:4x8.*/ + DPP_TM_QMU_DDR_RANDOM_MODE_E ddr_random_mode; /**< @brief ddr随机模式 */ + ZXIC_UINT32 block_size; /**< @brief block模式,128/256/512/1024 */ + ZXIC_UINT32 local_sa_id; /**< @brief SA模式时,本地sa_id*/ +} DPP_TM_INIT_PARA_T; + + +/* TM ASIC初始化信息配置 */ +typedef struct dpp_tm_asic_init_info_t +{ + ZXIC_UINT32 blk_size; /**< @brief qmu配置的block大小 256B/512B[default]/1024B */ + ZXIC_UINT32 case_num; /**< @brief 四组QMU初始化场景编号为1-4;ddr*bank:1:4x2;2:4x4;3:8x2;4:4x8. */ + ZXIC_UINT32 imem_omem; /**< @brief 0:片内外混合; 1:纯片内;2:纯片外 */ + ZXIC_UINT32 mode; /**< @brief TM工作模式 0:TM模式; 1:SA模式 */ +} DPP_TM_ASIC_INIT_INFO_T; + +#endif + +#if ZXIC_REAL("function declaration") + + + +/***********************************************************/ +/** 读取block长度模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_size block长度模式,256/512/1024 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/04/09 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_blk_size_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_size); + + +/***********************************************************/ +/** 配置内置TM的工作模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param mode 配置的值,0-TM模式,1-SA模式 +*ETM仅工作在TM模式,FTM可以工作TM或SA模式 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/25 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_sa_work_mode_set(DPP_DEV_T *dev, DPP_TM_WORK_MODE_E mode); + + +/***********************************************************/ +/** 配置各级搬移功能使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 要配置的拥塞避免层次号,0:队列级,1:端口级,2:系统级 +* @param en 使能标记,0-不使能,1-使能 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2016/10/18 +************************************************************/ +#ifdef ETM_REAL +DPP_STATUS dpp_tm_cgavd_move_en_set(ZXIC_UINT32 dev_id, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 en); + +/***********************************************************/ +/** 配置各级搬移门限 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* @param id 队列号或端口号,系统级时,id参数无效 +* @param value 端口级和系统级时,为搬移门限值,单位为NPPU存包的单位,256B; + 流级时为搬移profile_id,0~15 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2016/10/18 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_move_th_set(ZXIC_UINT32 dev_id, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + ZXIC_UINT32 value); + +/***********************************************************/ +/** 配置flow级的搬移策略 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param move_profile flow级的搬移门限分组索引,0~15 +* @param th flow级的搬移门限,单位为KB; +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2016/10/18 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_flow_move_profile_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 move_profile, + ZXIC_UINT32 th); +#endif + +/***********************************************************/ +/** 配置端口共享的搬移门限 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param th 端口共享的搬移门限,单位为NPPU存包的单位,256B; +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2016/10/18 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_port_share_th_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 th); + +/***********************************************************/ +/** 配置各级拥塞避免功能使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 要配置的拥塞避免层次号,0:队列级,1:端口级,2:系统级 +* @param en 使能标记,0-不使能,1-使能 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/28 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_en_set(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 en); + +/***********************************************************/ +/** 配置拥塞避免算法 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* @param id 队列号或端口号,系统级时,id参数无效 +* @param method 配置的拥塞避免算法,0:TD,1:WRED/GRED +* 配置TD算法时,先配TD阈值,再配置TD算法 +* 配置WRED算法时,先配置流级或端口级的平均队列深度,再配置WRED算法 +* 配置GRED算法时,先配置系统级的平均队列深度,在配置成GRED算法 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark +* @see +* @author taq @date 2015/04/14 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_method_set(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + DPP_TM_CGAVD_METHOD_E method); + +/***********************************************************/ +/** 配置TD拥塞避免模式下的丢弃门限值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* @param id 队列号或端口号,系统级时,id参数无效 +* @param td_th 配置的丢弃门限值,用户配置门限值单位为Kbyte,需要转化为Block单位写入寄存器 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/17 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_td_th_set(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + ZXIC_UINT32 td_th); + +/***********************************************************/ +/** 配置指定端口或队列绑定的WRED GROUP ID +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level WRED支持层次号,0:队列级,1:端口级 +* @param id 队列号或端口号 +* @param wred_id 配置的WRED GROUP ID +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/17 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_wred_id_set(ZXIC_UINT32 dev_id, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + ZXIC_UINT32 wred_id); + +/***********************************************************/ +/** 配置TM模式下流队列挂接的端口号;SA模式下流队列映射的目的芯片ID +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param q_id 队列号 +* @param pp_id 配置的端口号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/18 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_q_map_pp_set(DPP_DEV_T *dev, + ZXIC_UINT32 q_id, + ZXIC_UINT32 pp_id); + +/***********************************************************/ +/** 配置TM模式tc到flow的映射 +* @param dev_id 设备编号 +* @param tc_id itmd tc优先级(0~7) +* @param flow_id 映射的flowid号 (0~4095) +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author sun @date 2023/07/04 +************************************************************/ +DPP_STATUS dpp_tm_tc_map_flow_set(DPP_DEV_T *dev, + ZXIC_UINT32 tc_id, + ZXIC_UINT32 flow_id); + +/***********************************************************/ +/** 配置指定端口或队列是否支持动态门限机制 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level WRED支持层次号,0:队列级,1:端口级 +* @param id 队列号或端口号 +* @param en 配置的值,0-不支持动态门限机制,1-支持动态门限机制 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/17 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_dyn_th_en_set(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + ZXIC_UINT32 en); + +/***********************************************************/ +/** 配置强制片内或片外 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param en 1:使能 +* @param mode 1 :omem 强制片外 0:imem 强制片内 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2017/10/14 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_imem_omem_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 en, + ZXIC_UINT32 mode); + + +/***********************************************************/ +/** 读取QMU队列授权价值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_credit_value 授权价值,默认值是400Byte +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/04/14 +************************************************************/ +DPP_STATUS dpp_tm_qmu_credit_value_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_credit_value); + +/****************************************************************************** +*包老化配置 +* @param: dev_id: 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* aging_en: 包老化使能:1表示包老化功能使能;0表示包老化功能关闭。 +* aging_interval: 普通老化两次的间隔配置 +* aging_step_interval: 普通老化的老化时间的步进配置值 +* aging_start_qnum: 老化起始队列 +* aging_end_qnum: 老化结束队列 +* aging_req_aful_th: 普通老化FIFO的将满阈值 +* aging_pkt_num: 一次老化的包个数 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/05/10 +************************************************************/ +DPP_STATUS dpp_tm_qmu_pkt_aging_set(DPP_DEV_T *dev, + ZXIC_UINT32 aging_en, + ZXIC_UINT32 aging_interval, + ZXIC_UINT32 aging_step_interval, + ZXIC_UINT32 aging_start_qnum, + ZXIC_UINT32 aging_end_qnum, + ZXIC_UINT32 aging_pkt_num, + ZXIC_UINT32 aging_req_aful_th); + +/****************************************************************************** +*配置老化一个包的时间,一次老化一个包,老化队列范围为可配 +* @param: dev_id: 设备索引编号 +* @param tm_type 0: etm; 1: ftm; +* aging_en: 包老化使能:1表示包老化功能使能;0表示包老化功能关闭。 +* aging_time: 老化一个包的时间,单位ms + aging_que_start:老化起始队列 + aging_que_start:老化终止队列 +老化时间=2*aging_interval*step_interval*q_num +aging_interval = (aging_time * 600000) / (2 * 1 * DPP_TM_Q_NUM); +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/12/08 +************************************************************/ +DPP_STATUS dpp_tm_qmu_pkt_age_time_set(DPP_DEV_T *dev, + ZXIC_UINT32 aging_en, + ZXIC_UINT32 aging_time, + ZXIC_UINT32 aging_que_start, + ZXIC_UINT32 aging_que_end); + + +/***********************************************************/ +/** 分配etm调度器资源:fq/fq2/fq4/fq8 个数,(共16K= 16384) +* @param dev_id 设备编号 +* @param fq_num FQ调度器个数,须是8的倍数 +* @param fq2_num FQ2调度器个数,须是4的倍数 +* @param fq4_num FQ4调度器个数,须是2的倍数 +* @param fq8_num FQ8调度器个数 +* 调度器总数不能超过:16K= 16384 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/26 +************************************************************/ +DPP_STATUS dpp_etm_crdt_fq_set(DPP_DEV_T *dev, + ZXIC_UINT32 fq_num, + ZXIC_UINT32 fq2_num, + ZXIC_UINT32 fq4_num, + ZXIC_UINT32 fq8_num); + +/***********************************************************/ +/** 分配TM调度器资源:sp/wfq/wfq2/wfq4/wfq8 个数,(etm共9K=9216,ftm共1920个) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param sp_num SP调度器个数,须是8的倍数 +* @param wfq_num WFQ调度器个数,须是8的倍数 +* @param wfq2_num WFQ2调度器个数,须是4的倍数 +* @param wfq4_num WFQ4调度器个数,须是2的倍数 +* @param wfq8_num WFQ8调度器个数 +* 调度器总数不能超过:ETM= 9216; FTM= 1920 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/26 +************************************************************/ +DPP_STATUS dpp_tm_crdt_wfqsp_set(DPP_DEV_T *dev, + ZXIC_UINT32 sp_num, + ZXIC_UINT32 wfq_num, + ZXIC_UINT32 wfq2_num, + ZXIC_UINT32 wfq4_num, + ZXIC_UINT32 wfq8_num); + +/***********************************************************/ +/** 配置flow级流队列的挂接关系(flow到上级调度器的挂接) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param flow_id 流队列号 +* @param c_linkid c桶要挂接到的上级调度器id +* @param c_weight c桶挂接到上级调度器的权重[1~511] +* @param c_sp c桶挂接到上级调度器的sp优先级,有效值[0-8],共9级,优先级依次降低 +* @param mode 挂接模式:0-单桶 1-双桶。配置单桶时无需关注后续参数,配0即可 +* @param e_linkid e桶要挂接到的上级调度器id +* @param e_weight e桶挂接到上级调度器的权重[1~511] +* @param e_sp e桶挂接到上级调度器的sp优先级,有效值[0-8],共9级,优先级依次降低 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_flow_link_set(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 c_linkid, + ZXIC_UINT32 c_weight, + ZXIC_UINT32 c_sp, + ZXIC_UINT32 mode, + ZXIC_UINT32 e_linkid, + ZXIC_UINT32 e_weight, + ZXIC_UINT32 e_sp); + +/***********************************************************/ +/** 配置调度器层次化QOS的挂接关系:非优先级传递 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param se_id 本级调度器id +* @param se_linkid 要挂接到的上级调度器id +* @param se_weight 挂接到上级调度器的权重[1~511] +* @param se_sp 挂接到上级调度器的sp优先级,有效值[0-8],共9级,优先级依次降低 +* @param se_insw 优先级传递使能:0-关 1-开. 该参数不传递直接配0 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_se_link_set(DPP_DEV_T *dev, + ZXIC_UINT32 se_id, + ZXIC_UINT32 se_linkid, + ZXIC_UINT32 se_weight, + ZXIC_UINT32 se_sp); + +/***********************************************************/ +/** 配置调度器层次化QOS的挂接关系:优先级传递 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param se_id 本级调度器id +* @param se_linkid 要挂接到的上级调度器id +* @param se_weight WFQ2/4/8中各调度器权重值[1~511],取相等的值 +* @param se_sp 挂接到上级调度器的sp优先级,有效值[0-7],共8级,优先级依次降低 +* @param se_insw 优先级传递使能:0-关 1-开. 该参数不传递直接配1 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_se_link_insw_set(DPP_DEV_T *dev, + ZXIC_UINT32 se_id, + ZXIC_UINT32 se_linkid, + ZXIC_UINT32 se_weight, + ZXIC_UINT32 se_sp); + +/***********************************************************/ +/** 配置调度器层次化QOS的挂接关系:优先级传递,单个调度器挂接 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param se_id 本级调度器id +* @param se_linkid 要挂接到的上级调度器id +* @param se_weight WFQ8中对应调度器权重值[1~511] +* @param se_sp 挂接到上级调度器的sp优先级,有效值[0-7],共8级,优先级依次降低 +* @param se_insw 优先级传递使能:0-关 1-开. 该参数不传递直接配1 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_se_link_insw_single_set(DPP_DEV_T *dev, + ZXIC_UINT32 se_id, + ZXIC_UINT32 se_linkid, + ZXIC_UINT32 se_weight, + ZXIC_UINT32 se_sp); + +/***********************************************************/ +/** 删除流挂接关系 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param id_s 要删除的流号或调度器起始id +* @param id_e 要删除的流号或调度器终止id +* ETM范围:0--0x47FF; FTM范围:0-0xFFF +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_del_flow_link_set(DPP_DEV_T *dev, ZXIC_UINT32 id_s, ZXIC_UINT32 id_e); + +/***********************************************************/ +/** 删除调度器挂接关系(调度器编号从0开始) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param se_id_s 要删除的起始调度器id +* @param se_id_e 要删除的终止调度器id +* ETM范围:0--0x63FF; FTM范围:0-0x77F +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_del_se_link_set(DPP_DEV_T *dev, ZXIC_UINT32 id_s, ZXIC_UINT32 id_e); + +/***********************************************************/ +/** 配置se->pp->dev挂接关系 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param se_id 往端口挂接的调度器id +* @param pp_id [0-63] +* @param weight [1-511] +* @param sp_mapping 0~7 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/3/4 +************************************************************/ +DPP_STATUS dpp_tm_crdt_se_pp_link_set(DPP_DEV_T *dev, + ZXIC_UINT32 se_id, + ZXIC_UINT32 pp_id, + ZXIC_UINT32 weight, + ZXIC_UINT32 sp_mapping); + +/***********************************************************/ +/** +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param que_id queue id +* @param en 1:过滤E桶队列CRS状态为SLOW的入链请求;0:E桶队列CRS SLOW正常入链; +* +* @return +* @remark 无 +* @see +* @author XXX @date 2019/05/08 +************************************************************/ +DPP_STATUS dpp_tm_crdt_eir_crs_filter_en_set(DPP_DEV_T *dev, ZXIC_UINT32 que_id, ZXIC_UINT32 en); + + +/***********************************************************/ +/** 清除整形表格里面的值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/07/16 +************************************************************/ +DPP_STATUS dpp_tm_clr_shape_para(DPP_DEV_T *dev); + +/***********************************************************/ +/** 配置流队列双桶整形使能及模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param db_en 双桶整形使能 +* @param mode 0:c+e模式,1:c+p模式 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_tm_shape_flow_db_en_set(DPP_DEV_T *dev, ZXIC_UINT32 db_en, ZXIC_UINT32 mode); + +/***********************************************************/ +/** 配置流级整形参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param flow_id 流队列号 ETM:0-9215,FTM:0-2047 +* @param cir cir速率,单位Kb,范围[64Kb - 160Gb] +* @param cbs cbs桶深,单位KB,范围[1KB - 64M] +* 注:cbs=0 表示关闭整形,即不限速 +* @param db_en 双桶整形使能,0-单桶,1-双桶 +* @param eir eir速率,单位Kb,范围同cir +* @param ebs ebs桶深,单位Kb,范围同cbs +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_tm_shape_flow_para_set(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 cir, + ZXIC_UINT32 cbs, + ZXIC_UINT32 db_en, + ZXIC_UINT32 eir, + ZXIC_UINT32 ebs); + + +/***********************************************************/ +/** tm配置调度器整形参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param se_id 调度器编号号 ETM:0x4800-0xABFF,FTM:0x1000-0x177F +* @param pir pir总速率,单位Kb,范围同cir +* @param pbs pbs总桶深,单位Kb,范围同cbs +* @param db_en 整形模式,0-单桶,1-双桶,仅FQ8/WFQ8有效 +* @param cir [0-3]调度器cir速率,单位Kb,范围[64Kb - 160Gb] +* @param cbs [0-3]调度器cbs桶深,单位KB,范围[1KB - 64M] +* 注:cbs=0 表示关闭整形,即不限速 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_tm_shape_se_para_set(DPP_DEV_T *dev, + ZXIC_UINT32 se_id, + ZXIC_UINT32 pir, + ZXIC_UINT32 pbs, + ZXIC_UINT32 db_en, + ZXIC_UINT32 cir, + ZXIC_UINT32 cbs); + + +/***********************************************************/ +/** 写入端口级整形信息 +* @param tm_type 0-ETM,1-FTM +* @param port_id 端口号0-63 +* @param cir +* @param cbs +* @param c_en c桶使能 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/03 +************************************************************/ +DPP_STATUS dpp_tm_shape_pp_para_wr(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + ZXIC_UINT32 cir, + ZXIC_UINT32 cbs, + ZXIC_UINT32 c_en); + +/***********************************************************/ +/** 配置端口级整形参数 更改整形转换公式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param port_id 端口号 +* @param p_para 整形信息:CIR/CBS/EN +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/04/15 +************************************************************/ +DPP_STATUS dpp_tm_shape_pp_para_set(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + const DPP_TM_SHAPE_PP_PARA_T *p_para); + +/***********************************************************/ +/** 配置轮转扫描使能和扫描速率 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param scan_en 轮转扫描使能。0:关闭,1:开启 +* @param scan_rate 轮转扫描速率,配置扫描周期不得少于256个周期 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/10 +************************************************************/ +DPP_STATUS dpp_tm_qmu_scan_rate_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 scan_en, + ZXIC_UINT32 scan_rate); + +/***********************************************************/ +/** 配置CMD_SW分端口(qmu出端口)整形速率和使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param shape_cir 整形值,单位Mbps,范围[0-160000] +* @param shape_cbs 桶深, 单位B,范围[0-0x1EE00] +* @param shape_en 整形使能 +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author whuashan 2020-3-17 +************************************************************/ +DPP_STATUS dpp_tm_qmu_egress_shape_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 port_id, + ZXIC_UINT32 shape_cir, + ZXIC_UINT32 shape_cbs, + ZXIC_UINT32 shape_en); + + +/***********************************************************/ +/** 配置WRED丢弃曲线对应的参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level WRED支持层次号,0:队列级,1:端口级 +* @param wred_id 队列级共支持16个WRED组0-15,端口级支持8组0-7 +* @param dp 共支持8个dp,取值0-7 +* @param p_para 配置的WRED组参数值,包含以下五个参数 + max_th 平均队列深度上限阈值 + min_th 平均队列深度下限阈值 + max_p 最大丢弃概率 + weight 平均队列深度计算权重 + q_len_th 队列深度阈值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author taq @date 2015/04/20 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_wred_dp_line_para_set(ZXIC_UINT32 dev_id, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 wred_id, + ZXIC_UINT32 dp, + DPP_TM_WRED_DP_LINE_PARA_T *p_para); + + +/***********************************************************/ +/** 配置各级WRED丢弃曲线对应的参数 +* @param tm_type 0-ETM,1-FTM +* @param level WRED支持层次号,0:队列级,1:端口级 +* @param wred_id 队列级共支持16个WRED组0-15,端口级支持8组0-7 +* @param dp 共支持8个dp,取值0-7 +* @param max_th 平均队列深度上限阈值 +* @param min_th 平均队列深度下限阈值 +* @param max_p 最大丢弃概率 +* @param weight 平均队列深度计算权重 +* @param q_len_th 队列深度阈值 +* @param flag 忽略乘法里的当前包长和最大包长比标志位:1为忽略 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2015/11/9 +************************************************************/ +DPP_STATUS dpp_tm_wred_dp_line_para_flag_wr(ZXIC_UINT32 dev_id, + ZXIC_UINT32 level, + ZXIC_UINT32 wred_id, + ZXIC_UINT32 dp, + ZXIC_UINT32 max_th, + ZXIC_UINT32 min_th, + ZXIC_UINT32 max_p, + ZXIC_UINT32 weight, + ZXIC_UINT32 q_len_th, + ZXIC_UINT32 flag); + +/***********************************************************/ +/** 配置CPU设置的报文长度是否参与计算丢弃概率的使能 +* @param tm_type 0-ETM,1-FTM +* @param flag 忽略乘法里的当前包长和最大包长比标志位:1为忽略 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2015/11/9 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_wred_pke_len_calc_sign_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 flag); + + +/***********************************************************/ +/** TMMU TM纯片内模式配置 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param imem_en 1纯片内 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 说明:高有效,表示使能打开,TMMU不会再发起对MMU的读写操作,用户需要保证Cache PD全部命中。 +* @see +* @author wush @date 2017/10/14 +************************************************************/ +DPP_STATUS dpp_tm_tmmu_imem_en_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 imem_en); + +/***********************************************************/ +/** TMMU 强制DDR RDY配置 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param ddr_force_rdy 1、如果bit【0】配置为1,则QMU看到的DDR0 RDY一直为1。 + 2、bit【0】代表DDR0,bit【7】代表DDR7。 + 3、纯片内模式需要配置为8'hff,排除DDR干扰。 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark +* @see +* @author wush @date 2017/10/14 +************************************************************/ +DPP_STATUS dpp_tm_tmmu_ddr_force_rdy_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 ddr_force_rdy); + +/***********************************************************/ +/** 写一片连续的TM寄存器 +* @param module_id 区分TM子模块 +* @param first_addr 起始寄存器的地址 +* @param reg_num 总共读取的寄存器数 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/07/26 +************************************************************/ +DPP_STATUS dpp_tm_wr_more_reg(ZXIC_UINT32 dev_id, ZXIC_UINT32 module_id, ZXIC_UINT32 first_addr, ZXIC_UINT32 first_data, ZXIC_UINT32 data_step, ZXIC_UINT32 reg_num); + +/***********************************************************/ +/** 打印tm诊断常用函数信息 +* +* @return +* @remark 无 +* @see +* @author 张明月 @date 2015/10/21 +************************************************************/ +DPP_STATUS dpp_tm_help(ZXIC_UINT32 dev_id); + +/***********TM CPU软复位接口 End*************/ + + +#endif/***function declaration***/ + +#endif/****_DPP_TM_H_****/ + + + + + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_type_api.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_type_api.h new file mode 100755 index 0000000..5b988e8 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/api/dpp_type_api.h @@ -0,0 +1,415 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_error.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : +* 完成日期 : 2014/01/27 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef _DPP_TYPE_API_H_ +#define _DPP_TYPE_API_H_ + +#ifdef __cplusplus +extern "C" { +#endif + + +//#define DPP_FOR_IDE /* IDE仿真器Driver编译控制宏,通过VC工具导入,不允许手动更改此行 */ +//#define DPP_FOR_LLT /* DPP 打桩控制宏,通过Makefile编译脚本导入,不允许手动更改此行 "make ssp4_test_64 DPPLLT=1"*/ + + +#ifndef DPP_FOR_LLT +/* write hardware enable */ +#define DPP_HW_OPR_EN (1) +#else +/* write hardware disable */ +#define DPP_HW_OPR_EN (1) +#endif + +#ifndef DPP_FOR_LLT + #ifndef DPP_FOR_RISCV + #ifndef DPP_FOR_PCIE + /* dev VPCI enalbe */ + #define DPP_DEV_VPCI_EN (1) + #else + #define DPP_DEV_VPCI_EN (0) + #endif + #else + #define DPP_DEV_VPCI_EN (0) + #endif +#else + #define DPP_DEV_VPCI_EN (0) +#endif + + +/* CPU软复位调试时开启 */ +#define DPP_CPU_SOFT_RESET (0) + +#if defined(ZXIC_OS_WIN) +#define DPP_OS_WIN32 +#elif defined(ZXIC_OS_LINUX) +#define DPP_OS_LINUX +#endif + + +#ifdef ZXIC_OS_WIN +#define SDT_FILE_PATH "..\\tools\\midware\\table_info.txt" +#else +#define SDT_FILE_PATH "table_info.txt" +#endif + + +#ifndef BOOL +#define BOOL int +#endif + +#ifndef BOOLEAN +#define BOOLEAN unsigned char +#endif + +#ifndef DPP_STATUS +#define DPP_STATUS ZXIC_UINT32 +#endif + +#ifndef DPP_OK +#define DPP_OK (0) +#endif + +#ifndef DPP_ERR +#define DPP_ERR (1) +#endif + + +#define DPP_RD_CNT_MAX (100) /* 最大读完成状态次数 */ + +#define DPP_PRT_BIT_LEN_1 (1) +#define DPP_PRT_BIT_LEN_2 (2) +#define DPP_PRT_BIT_LEN_8 (8) +#define DPP_PRT_BIT_LEN_16 (16) +#define DPP_PRT_BIT_LEN_32 (32) + + +/* agent module error code */ +#define DPP_RC_AGENT_BASE (0x100) +#define DPP_RC_AGENT_INVALID_PARAMS (DPP_RC_AGENT_BASE | 0x0) +#define DPP_RC_AGENT_INVALID_RANGES (DPP_RC_AGENT_BASE | 0x1) +#define DPP_RC_AGENT_CALL_FUN_FAIL (DPP_RC_AGENT_BASE | 0x2) +#define DPP_RC_AGENT_GET_POINTER_FAIL (DPP_RC_AGENT_BASE | 0x3) +#define DPP_RC_AGENT_SEND_MSG_FAIL (DPP_RC_AGENT_BASE | 0x4) +#define DPP_RC_AGENT_MSG_TYPE_INVALID (DPP_RC_AGENT_BASE | 0x5) + +/* common module error code */ +#define DPP_RC_COMMON_BASE (0x200) +#define DPP_RC_COMMON_INVALID_PARAMS (DPP_RC_COMMON_BASE | 0x0) +#define DPP_RC_COMMON_INVALID_RANGES (DPP_RC_COMMON_BASE | 0x1) +#define DPP_RC_COMMON_CALL_FUN_FAIL (DPP_RC_COMMON_BASE | 0x2) +#define DPP_RC_COMMON_GET_POINTER_FAIL (DPP_RC_COMMON_BASE | 0x3) +#define DPP_RC_COMMON_SEND_MSG_FAIL (DPP_RC_COMMON_BASE | 0x4) +#define DPP_RC_COMMON_MSG_TYPE_INVALID (DPP_RC_COMMON_BASE | 0x5) +#define DPP_RC_COMMON_MEMCPY_S_INVALID_PTR (DPP_RC_COMMON_BASE | 0x6) +#define DPP_RC_COMMON_MEMCPY_S_MEM_OVERLAP (DPP_RC_COMMON_BASE | 0x7) +#define DPP_RC_COMMON_CLOSE_FAIL (DPP_RC_COMMON_BASE | 0x8) + +/* config module error code */ +#define DPP_RC_CONFIG_BASE (0x300) +#define DPP_RC_CONFIG_PARA_INVALID (DPP_RC_CONFIG_BASE | 0x0) +#define DPP_RC_CONFIG_MSG_TYPE_INVALID (DPP_RC_CONFIG_BASE | 0x1) +#define DPP_RC_CONFIG_MEM_NO_INVALID (DPP_RC_CONFIG_BASE | 0x2) + +/* debug module error code */ +#define DPP_RC_DBG_BASE (0x400) +#define DPP_RC_DBG_INVALID_PARAMS (DPP_RC_DBG_BASE | 0x0) +#define DPP_RC_DBG_INVALID_RANGES (DPP_RC_DBG_BASE | 0x1) +#define DPP_RC_DBG_CALL_FUN_FAIL (DPP_RC_DBG_BASE | 0x2) +#define DPP_RC_DBG_GET_POINTER_FAIL (DPP_RC_DBG_BASE | 0x3) +#define DPP_RC_DBG_SEND_MSG_FAIL (DPP_RC_DBG_BASE | 0x4) +#define DPP_RC_DBG_MEM_NOT_ALLOC (DPP_RC_DBG_BASE | 0x5) + +/* download module error code */ +#define DPP_RC_LOAD_BASE (0x500) +#define DPP_RC_LOAD_INVALID_PARAMS (DPP_RC_LOAD_BASE | 0x0) +#define DPP_RC_LOAD_INVALID_RANGES (DPP_RC_LOAD_BASE | 0x1) +#define DPP_RC_LOAD_CALL_FUN_FAIL (DPP_RC_LOAD_BASE | 0x2) +#define DPP_RC_LOAD_GET_POINTER_FAIL (DPP_RC_LOAD_BASE | 0x3) +#define DPP_RC_LOAD_MSG_SEND_FAIL (DPP_RC_LOAD_BASE | 0x4) +#define DPP_RC_LOAD_MSG_TYPE_INVALID (DPP_RC_LOAD_BASE | 0x5) +#define DPP_RC_LOAD_DEV_NOT_EXIST (DPP_RC_LOAD_BASE | 0x6) + +/* device module error code */ +#define DPP_RC_DEV_BASE (0x600) +#define DPP_RC_DEV_PARA_INVALID (DPP_RC_DEV_BASE | 0x0) +#define DPP_RC_DEV_RANGE_INVALID (DPP_RC_DEV_BASE | 0x1) +#define DPP_RC_DEV_CALL_FUNC_FAIL (DPP_RC_DEV_BASE | 0x2) +#define DPP_RC_DEV_TYPE_INVALID (DPP_RC_DEV_BASE | 0x3) +#define DPP_RC_DEV_CONNECT_FAIL (DPP_RC_DEV_BASE | 0x4) +#define DPP_RC_DEV_MSG_INVALID (DPP_RC_DEV_BASE | 0x5) +#define DPP_RC_DEV_NOT_EXIST (DPP_RC_DEV_BASE | 0x6) +#define DPP_RC_DEV_MGR_NOT_INIT (DPP_RC_DEV_BASE | 0x7) +#define DPP_RC_DEV_CFG_NOT_INIT (DPP_RC_DEV_BASE | 0x8) + +/* env(xOS) module error code */ +#define DPP_RC_ENV_BASE (0x700) +#define DPP_RC_ENV_PARA_INVALID (DPP_RC_ENV_BASE | 0x0) +#define DPP_RC_ENV_RANGE_INVALID (DPP_RC_ENV_BASE | 0x1) +#define DPP_RC_ENV_CALL_FUNC_FAIL (DPP_RC_ENV_BASE | 0x2) +#define DPP_RC_ENV_SOCKET_FAIL (DPP_RC_ENV_BASE | 0x3) +#define DPP_RC_ENV_SOCKET_FULL (DPP_RC_ENV_BASE | 0x4) +#define DPP_RC_ENV_THREAD_FAIL (DPP_RC_ENV_BASE | 0x5) +#define DPP_RC_ENV_NOT_INIT (DPP_RC_ENV_BASE | 0x6) +#define DPP_RC_ENV_TABLE_FULL (DPP_RC_ENV_BASE | 0x7) +#define DPP_RC_ENV_MUTEX_FAIL (DPP_RC_ENV_BASE | 0x8) +#define DPP_RC_ENV_SOCKET_NOT_EXIST (DPP_RC_ENV_BASE | 0x9) + +/* table module error code */ +#define DPP_RC_TABLE_BASE (0x800) +#define DPP_RC_TABLE_PARA_INVALID (DPP_RC_TABLE_BASE | 0x0) +#define DPP_RC_TABLE_RANGE_INVALID (DPP_RC_TABLE_BASE | 0x1) +#define DPP_RC_TABLE_CALL_FUNC_FAIL (DPP_RC_TABLE_BASE | 0x2) +#define DPP_RC_TABLE_SDT_MSG_INVALID (DPP_RC_TABLE_BASE | 0x3) +#define DPP_RC_TABLE_SDT_MGR_INVALID (DPP_RC_TABLE_BASE | 0x4) +#define DPP_RC_TABLE_IF_VALUE_FAIL (DPP_RC_TABLE_BASE | 0x5) + + +/* stat module error code */ +#define DPP_RC_STAT_BASE (0x900) +#define DPP_RC_STAT_INIT_ERR (DPP_RC_STAT_BASE | 0x1) +#define DPP_RC_STAT_TM_INIT_ERR (DPP_RC_STAT_BASE | 0x2) +#define DPP_RC_STAT_TM_DIS_EN (DPP_RC_STAT_BASE | 0x3) +#define DPP_RC_STAT_TM_TYPE_ERR (DPP_RC_STAT_BASE | 0xe) /* TM 计数类型错误*/ +#define DPP_RC_STAT_TM_DEPTH_ERR (DPP_RC_STAT_BASE | 0xf) /* TM 计数深度错误*/ + +/* appl module error code */ +#define DPP_RC_APPL_BASE (0xa00) +#define DPP_RC_APPL_PARA_INVALID (DPP_RC_APPL_BASE | 0x0) +#define DPP_RC_APPL_RANGE_INVALID (DPP_RC_APPL_BASE | 0x1) +#define DPP_RC_APPL_CALL_FUNC_FAIL (DPP_RC_APPL_BASE | 0x2) + +/* reg module error code */ +#define DPP_RC_MODULE_BASE (0xb00) +#define DPP_RC_MODULE_PARA_INVALID (DPP_RC_MODULE_BASE | 0x0) +#define DPP_RC_MODULE_RANGE_INVALID (DPP_RC_MODULE_BASE | 0x1) +#define DPP_RC_MODULE_CALL_FUNC_FAIL (DPP_RC_MODULE_BASE | 0x2) +#define DPP_RC_MODULE_ENUM_TYPE_FAIL (DPP_RC_MODULE_BASE | 0x3) +#define DPP_RC_MODULE_BCDR_WR_FAIL (DPP_RC_MODULE_BASE | 0x4) + +/* reg module error code */ +#define DPP_RC_REG_BASE (0xc00) +#define DPP_RC_REG_PARA_INVALID (DPP_RC_REG_BASE | 0x0) +#define DPP_RC_REG_RANGE_INVALID (DPP_RC_REG_BASE | 0x1) +#define DPP_RC_REG_CALL_FUNC_FAIL (DPP_RC_REG_BASE | 0x2) +#define DPP_RC_REG_FIELD_OVERFLOW (DPP_RC_REG_BASE | 0x3) + +/* DTB module error code */ +#define DPP_RC_DTB_BASE (0xd00) +#define DPP_RC_DTB_MGR_EXIST (DPP_RC_DTB_BASE | 0x0) +#define DPP_RC_DTB_MGR_NOT_EXIST (DPP_RC_DTB_BASE | 0x1) +#define DPP_RC_DTB_QUEUE_RES_EMPTY (DPP_RC_DTB_BASE | 0x2) +#define DPP_RC_DTB_QUEUE_BUFF_SIZE_ERR (DPP_RC_DTB_BASE | 0x3) +#define DPP_RC_DTB_QUEUE_ITEM_HW_EMPTY (DPP_RC_DTB_BASE | 0x4) +#define DPP_RC_DTB_QUEUE_ITEM_SW_EMPTY (DPP_RC_DTB_BASE | 0x5) +#define DPP_RC_DTB_TAB_UP_BUFF_EMPTY (DPP_RC_DTB_BASE | 0x6) +#define DPP_RC_DTB_TAB_DOWN_BUFF_EMPTY (DPP_RC_DTB_BASE | 0x7) +#define DPP_RC_DTB_TAB_UP_TRANS_ERR (DPP_RC_DTB_BASE | 0x8) +#define DPP_RC_DTB_TAB_DOWN_TRANS_ERR (DPP_RC_DTB_BASE | 0x9) +#define DPP_RC_DTB_QUEUE_IS_WORKING (DPP_RC_DTB_BASE | 0xa) +#define DPP_RC_DTB_QUEUE_IS_NOT_INIT (DPP_RC_DTB_BASE | 0xb) +#define DPP_RC_DTB_MEMORY_ALLOC_ERR (DPP_RC_DTB_BASE | 0xc) +#define DPP_RC_DTB_PARA_INVALID (DPP_RC_DTB_BASE | 0xd) +#define DPP_RC_DMA_RANGE_INVALID (DPP_RC_DTB_BASE | 0xe) +#define DPP_RC_DMA_RCV_DATA_EMPTY (DPP_RC_DTB_BASE | 0xf) +#define DPP_RC_DTB_LPM_INSERT_FAIL (DPP_RC_DTB_BASE | 0x10) +#define DPP_RC_DTB_LPM_DELETE_FAIL (DPP_RC_DTB_BASE | 0x11) +#define DPP_RC_DTB_DOWN_LEN_INVALID (DPP_RC_DTB_BASE | 0x12) +#define DPP_RC_DTB_DOWN_HASH_CONFLICT (DPP_RC_DTB_BASE | 0x13) //3347 +#define DPP_RC_DTB_QUEUE_NOT_ALLOC (DPP_RC_DTB_BASE | 0x14) +#define DPP_RC_DTB_QUEUE_NAME_ERROR (DPP_RC_DTB_BASE | 0x15) +#define DPP_RC_DTB_DUMP_SIZE_SMALL (DPP_RC_DTB_BASE | 0x16) +#define DPP_RC_DTB_SEARCH_VPORT_QUEUE_ZERO (DPP_RC_DTB_BASE | 0x17) +#define DPP_RC_DTB_QUEUE_NOT_ENABLE (DPP_RC_DTB_BASE | 0x18) +#define DPP_RC_DTB_OPEN_DEBUG_MODE (DPP_RC_DTB_BASE | 0x19) +#define DPP_RC_DTB_OVER_TIME (DPP_RC_DTB_BASE | 0x1a) //3354 + +/* lif module error code */ +#define DPP_RC_LIF_BASE (0xe00) +#define DPP_RC_LIF_PARA_INVALID (DPP_RC_LIF_BASE | 0x0) +#define DPP_RC_LIF_RANGE_INVALID (DPP_RC_LIF_BASE | 0x1) +#define DPP_RC_LIF_CALL_FUNC_FAIL (DPP_RC_LIF_BASE | 0x2) +#define DPP_RC_LIF_OPER_MODE_ERR (DPP_RC_LIF_BASE | 0x3) +#define DPP_RC_SERDES_ARRAY_OVERFLOW (DPP_RC_LIF_BASE | 0x4) +#define DPP_RC_RCV_PLL_LOCK_TIMEOUT (DPP_RC_LIF_BASE | 0x5) +#define DPP_RC_LIF_TIMEOUT (DPP_RC_LIF_BASE | 0x7) +#define DPP_RC_LIF_NO_PORT (DPP_RC_LIF_BASE | 0x8) +#define DPP_RC_BCDR_PARA_ERR (DPP_RC_LIF_BASE | 0x9) +#define DPP_RC_LIF_NOT_SUPPORT (DPP_RC_LIF_BASE | 0xa) + +/* ddr module error code */ +#define DPP_RC_DDR_BASE (0x1000) +#define DPP_RC_DDR_TIME_OUT (DPP_RC_DDR_BASE | 0x0) +#define DPP_RC_DDR_TRAIN_FAIL (DPP_RC_DDR_BASE | 0x1) +#define DPP_RC_DDR_TYPE_ERR (DPP_RC_DDR_BASE | 0x2) +#define DPP_RC_DDR_LOGCHK_ERR (DPP_RC_DDR_BASE | 0x3) +#define DPP_RC_DDR_PARA_ERR (DPP_RC_DDR_BASE | 0x4) +#define DPP_RC_DDR_DAMAGED (DPP_RC_DDR_BASE | 0x5) +#define DPP_RC_DDR_DISABLE (DPP_RC_DDR_BASE | 0x6) +#define DPP_RC_DDR_ARRAY_OVERFLOW (DPP_RC_DDR_BASE | 0x7) +#define DPP_RC_DDR_INVAL_TRAIN_MODE (DPP_RC_DDR_BASE | 0x8) +#define DPP_RC_DDR_INVAL_VREF_MODE (DPP_RC_DDR_BASE | 0x9) +#define DPP_RC_DDR_INTR_ERR (DPP_RC_DDR_BASE | 0xa) +#define DPP_RC_DDR_BIST_FAIL (DPP_RC_DDR_BASE | 0xb) +#define DPP_RC_DDR_SOFTCHK_FAIL (DPP_RC_DDR_BASE | 0xb) +#define DPP_RC_DDR_PLL_LOCK_TIMEOUT (DPP_RC_DDR_BASE | 0x0) + +/* tlb module error code */ +#define DPP_RC_TLB_BASE (0x2000) +#define DPP_RC_TLB_MGR_EXIST (DPP_RC_TLB_BASE | 0x0) +#define DPP_RC_TLB_MGR_NOT_EXIST (DPP_RC_TLB_BASE | 0x1) + +/* se alg error code */ +#define DPP_SE_RC_BASE (0x50000) +#define DPP_SE_RC_ZBLK_FULL (DPP_SE_RC_CFG_BASE | 0x1) +#define DPP_SE_RC_FUN_INVALID (DPP_SE_RC_CFG_BASE | 0x2) +#define DPP_SE_RC_PARA_INVALID (DPP_SE_RC_CFG_BASE | 0x3) + +#define DPP_SE_RC_CFG_BASE (DPP_SE_RC_BASE | 0x1000) +#define DPP_SE_RC_ACL_BASE (DPP_SE_RC_BASE | 0x2000) +#define DPP_SE_RC_LPM_BASE (DPP_SE_RC_BASE | 0x3000) +#define DPP_LPM_TBL_INVALID (DPP_SE_RC_LPM_BASE | 0x01) +#define DPP_LPM_MODE_INVALID (DPP_SE_RC_LPM_BASE | 0x02) +#define DPP_LPM_FUNID_INVALID (DPP_SE_RC_LPM_BASE | 0x03) +#define DPP_LPM_RAM_FULL (DPP_SE_RC_LPM_BASE | 0x04) +#define DPP_LPM_UPDATE (DPP_SE_RC_LPM_BASE | 0x05) +#define DPP_LPM_SRHFAIL (DPP_SE_RC_LPM_BASE | 0x06) +#define DPP_LPM_KEY_INVALID (DPP_SE_RC_LPM_BASE | 0x07) +#define DPP_LPM_DEF_REG_FULL (DPP_SE_RC_LPM_BASE | 0x08) /*16组默认路由寄存器插满*/ +#define DPP_LPM_DEF_REG_NO_HIT (DPP_SE_RC_LPM_BASE | 0x09) /*16组默认路由寄存器未匹配删除条目*/ +#define DPP_LPM_DEF_REG_UPDATE (DPP_SE_RC_LPM_BASE | 0x0A) +#define DPP_LPM_DIV_GO_ON (DPP_SE_RC_LPM_BASE | 0x0B) +#define DPP_LPM_DDR_FULL (DPP_SE_RC_LPM_BASE | 0x0C) +#define DPP_LPM_DDR_PARA_INVALID (DPP_SE_RC_LPM_BASE | 0x0D) + +#define DPP_SE_RC_HASH_BASE (DPP_SE_RC_BASE | 0x4000) +#define DPP_HASH_RC_INVALID_FUNCINFO (DPP_SE_RC_HASH_BASE | 0x1) +#define DPP_HASH_RC_INVALID_ZBLCK (DPP_SE_RC_HASH_BASE | 0x2) +#define DPP_HASH_RC_INVALID_ZCELL (DPP_SE_RC_HASH_BASE | 0x3) +#define DPP_HASH_RC_INVALID_KEY (DPP_SE_RC_HASH_BASE | 0x4) +#define DPP_HASH_RC_INVALID_TBL_ID_INFO (DPP_SE_RC_HASH_BASE | 0x5) +#define DPP_HASH_RC_RB_TREE_FULL (DPP_SE_RC_HASH_BASE | 0x6) +#define DPP_HASH_RC_INVALID_KEY_TYPE (DPP_SE_RC_HASH_BASE | 0x7) +#define DPP_HASH_RC_ADD_UPDATE (DPP_SE_RC_HASH_BASE | 0x8) +#define DPP_HASH_RC_DEL_SRHFAIL (DPP_SE_RC_HASH_BASE | 0x9) +#define DPP_HASH_RC_ITEM_FULL (DPP_SE_RC_HASH_BASE | 0xa) +#define DPP_HASH_RC_INVALID_DDR_WIDTH_MODE (DPP_SE_RC_HASH_BASE | 0xb) +#define DPP_HASH_RC_INVALID_PARA (DPP_SE_RC_HASH_BASE | 0xc) +#define DPP_HASH_RC_TBL_FULL (DPP_SE_RC_HASH_BASE | 0xd) +#define DPP_HASH_RC_SRH_FAIL (DPP_SE_RC_HASH_BASE | 0xe) +#define DPP_HASH_RC_MATCH_ITEM_FAIL (DPP_SE_RC_HASH_BASE | 0xf) +#define DPP_HASH_RC_DDR_WIDTH_MODE_ERR (DPP_SE_RC_HASH_BASE | 0x10) +#define DPP_HASH_RC_INVALID_ITEM_TYPE (DPP_SE_RC_HASH_BASE | 0x11) +#define DPP_HASH_RC_REPEAT_INIT (DPP_SE_RC_HASH_BASE | 0x12) + +#define DPP_SE_RC_ETCAM_BASE (DPP_SE_RC_BASE | 0x5000) +#define DPP_ETCAM_RC_TBL_INVALID (DPP_SE_RC_ETCAM_BASE | 0x1) +#define DPP_ETCAM_RC_TBL_OVERFLOW (DPP_SE_RC_ETCAM_BASE | 0x2) + +#define DPP_ACL_RC_BASE (0x60000) +#define DPP_ACL_RC_INVALID_TBLID (DPP_ACL_RC_BASE | 0x0) +#define DPP_ACL_RC_INVALID_BLOCKNUM (DPP_ACL_RC_BASE | 0x1) +#define DPP_ACL_RC_INVALID_BLOCKID (DPP_ACL_RC_BASE | 0x2) +#define DPP_ACL_RC_TBL_NOT_INIT (DPP_ACL_RC_BASE | 0x3) +#define DPP_ACL_RC_ETCAMID_NOT_INIT (DPP_ACL_RC_BASE | 0x4) +#define DPP_ACL_RC_AS_ERAM_NOT_ENOUGH (DPP_ACL_RC_BASE | 0x5) +#define DPP_ACL_RC_RB_TREE_FULL (DPP_ACL_RC_BASE | 0x6) +#define DPP_ACL_RC_TABLE_FULL (DPP_ACL_RC_BASE | 0x7) +#define DPP_ACL_RC_INVALID_PARA (DPP_ACL_RC_BASE | 0x8) +#define DPP_ACL_RC_DEL_SRHFAIL (DPP_ACL_RC_BASE | 0x9) +#define DPP_ACL_RC_TABLE_UPDATE (DPP_ACL_RC_BASE | 0xa) +#define DPP_ACL_RC_SRH_FAIL (DPP_ACL_RC_BASE | 0xb) + +#define DPP_SE_RC_CAR_BASE (0x1100) +#define DPP_RC_CAR_TIME_OUT (DPP_SE_RC_CAR_BASE | 0x1) +#define DPP_RC_CAR_QUEUE_OUTRANGE (DPP_SE_RC_CAR_BASE | 0x2) +#define DPP_RC_CAR_RB_TREE_FULL (DPP_SE_RC_CAR_BASE | 0x3) +#define DPP_RC_CAR_RB_TREE_UPDATE (DPP_SE_RC_CAR_BASE | 0x4) +#define DPP_RC_CAR_RB_TREE_DEL_FAIL (DPP_SE_RC_CAR_BASE | 0x5) +#define DPP_RC_CAR_RB_TREE_SRH_FAIL (DPP_SE_RC_CAR_BASE | 0x6) +#define DPP_RC_CAR_RB_TREE_GET_FAIL (DPP_SE_RC_CAR_BASE | 0x7) +#define DPP_RC_CAR_INIT_FAIL (DPP_SE_RC_CAR_BASE | 0x8) +#define DPP_RC_CAR_UN_INIT (DPP_SE_RC_CAR_BASE | 0x9) +#define DPP_RC_CAR_PROFILE_UNSET (DPP_SE_RC_CAR_BASE | 0xa) +#define DPP_RC_CAR_LISTSTACK_MNG_FULL (DPP_SE_RC_CAR_BASE | 0xb) + + +/*system critical item check error code*/ +#define DPP_SYSTEM_CHECK_RC_BASE (0x70000) +#define DPP_SYSTEM_CHECK_CRM_RC_BASE (DPP_SYSTEM_CHECK_RC_BASE | 0x1000) +#define DPP_SYSTEM_CHECK_LIF0_RC_BASE (DPP_SYSTEM_CHECK_RC_BASE | 0x2000) +#define DPP_SYSTEM_CHECK_PKTRX_RC_BASE (DPP_SYSTEM_CHECK_RC_BASE | 0x3000) +#define DPP_SYSTEM_CHECK_PBU_RC_BASE (DPP_SYSTEM_CHECK_RC_BASE | 0x4000) +#define DPP_SYSTEM_CHECK_PPU_RC_BASE (DPP_SYSTEM_CHECK_RC_BASE | 0x5000) +#define DPP_SYSTEM_CHECK_ODMA_RC_BASE (DPP_SYSTEM_CHECK_RC_BASE | 0x6000) +#define DPP_SYSTEM_CHECK_CFG_RC_BASE (DPP_SYSTEM_CHECK_RC_BASE | 0x7000) +#define DPP_SYSTEM_CHECK_TM_RC_BASE (DPP_SYSTEM_CHECK_RC_BASE | 0x8000) +#define DPP_SYSTEM_CHECK_TM_READY_RC_BASE (DPP_SYSTEM_CHECK_RC_BASE | 0x100) +#define DPP_SYSTEM_CHECK_TM_SAIP_RC_BASE (DPP_SYSTEM_CHECK_RC_BASE | 0x200) +#define DPP_SYSTEM_CHECK_TM_ILIF_RC_BASE (DPP_SYSTEM_CHECK_TM_RC_BASE | 0x300) +#define DPP_SYSTEM_CHECK_TM_OLIF_RC_BASE (DPP_SYSTEM_CHECK_TM_RC_BASE | 0x400) +#define DPP_SYSTEM_CHECK_TM_TMMU_RC_BASE (DPP_SYSTEM_CHECK_TM_RC_BASE | 0x500) +#define DPP_SYSTEM_CHECK_TM_SHAPE_RC_BASE (DPP_SYSTEM_CHECK_TM_RC_BASE | 0x600) +#define DPP_SYSTEM_CHECK_TM_CRDT_RC_BASE (DPP_SYSTEM_CHECK_TM_RC_BASE | 0x700) +#define DPP_SYSTEM_CHECK_TM_CGAVD_RC_BASE (DPP_SYSTEM_CHECK_TM_RC_BASE | 0x800) +#define DPP_SYSTEM_CHECK_TM_QMU_RC_BASE (DPP_SYSTEM_CHECK_TM_RC_BASE | 0x900) + +/*system critical item check error code*/ +#define DPP_SERDES_CHECK_RC_BASE (0x80000) +#define DPP_SERDES_CHECK_PLL_BASE (DPP_SERDES_CHECK_RC_BASE | 0x1000) +#define DPP_SERDES_CHECK_PLL_A_BASE (DPP_SERDES_CHECK_PLL_BASE | 0x100) +#define DPP_SERDES_CHECK_PLL_B_BASE (DPP_SERDES_CHECK_PLL_BASE | 0x200) +#define DPP_SERDES_CHECK_PHYREADY_BASE (DPP_SERDES_CHECK_RC_BASE | 0x2000) +#define DPP_SERDES_CHECK_TX_PHYREADY_BASE (DPP_SERDES_CHECK_PHYREADY_BASE | 0x100) +#define DPP_SERDES_CHECK_RX_PHYREADY_BASE (DPP_SERDES_CHECK_PHYREADY_BASE | 0x200) +#define DPP_SERDES_CHECK_BERTOK_BASE (DPP_SERDES_CHECK_RC_BASE | 0x3000) + +/*TM RAM检测项返回错误码定义*/ +#define DPP_TM_CHECK_RC_BASE (0x100000) +#define DPP_TM_CHECK_RAM_RC_BASE (DPP_TM_CHECK_RC_BASE|0x100000) +#define DPP_RC_TM_CRDT_INS_BUSY (DPP_TM_CHECK_RC_BASE|0x100) + +/*SAIP RAM检测项返回错误码定义*/ +#define DPP_SA_CHECK_RC_BASE (0x110000) +#define DPP_SA_CHECK_RAM_RC_BASE (DPP_SA_CHECK_RC_BASE|0x110000) + +/*soft reset check error code*/ +#define DPP_SOFT_RESET_CHECK_BASE (0x1300) +#define DPP_SOFT_RESET_CHECK_WR_FAIL (DPP_SOFT_RESET_CHECK_BASE | 0x0) +#define DPP_SOFT_RESET_CHECK_RD_FAIL (DPP_SOFT_RESET_CHECK_BASE | 0x1) +#define DPP_SOFT_RESET_CHECK_WR_SIZE_ERR (DPP_SOFT_RESET_CHECK_BASE | 0x2) +#define DPP_SOFT_RESET_CHECK_RD_SIZE_ERR (DPP_SOFT_RESET_CHECK_BASE | 0x3) +#define DPP_SOFT_RESET_CHECK_BACKUP_ERR (DPP_SOFT_RESET_CHECK_BASE | 0x4) + +//add by yinxh at 2018-1-15 +//soft interrupt check error code +#define DPP_SOFT_INT_CHECK_BASE (0x1400) +#define DPP_SOFT_INT_CHECK_INVALID (DPP_SOFT_INT_CHECK_BASE | 0x0) +#define DPP_SOFT_INT_CHECK_NOT_INIT (DPP_SOFT_INT_CHECK_BASE | 0x1) +#define DPP_SOFT_INT_CHECK_SRH_FAIL (DPP_SOFT_INT_CHECK_BASE | 0x2) +#define DPP_SOFT_INT_CHECK_RB_TREE_FULL (DPP_SOFT_INT_CHECK_BASE | 0x3) + + +#ifdef __cplusplus +} +#endif + +#endif + + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/chip/dpp_dev.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/chip/dpp_dev.h new file mode 100755 index 0000000..7dd9990 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/chip/dpp_dev.h @@ -0,0 +1,223 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_dev.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : 王春雷 +* 完成日期 : 2014/02/10 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: 代码规范性修改 +* 修改日期: 2014/02/10 +* 版 本 号: +* 修 改 人: 丁金凤 +* 修改内容: +***************************************************************/ + +#ifndef _DPP_DEV_H_ +#define _DPP_DEV_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "zxic_common.h" +#include "dpp_type_api.h" + +#define DPP_KEYSIG_DEBUG (1) +#define DPP_DEV_CHANNEL_MAX (2) /* 最多支持6个芯片 */ +#define DPP_DEV_PPU_CLS_MAX (6) /* 芯片支持4级cluster */ +#define DPP_DEV_PPU_INSTR_REG_NUM (3) /* 芯片支持4级cluster 共2个指令空间*/ + +#define DPP_DEV_ME_MAX (8) /* 每级cluster支持8个me */ +#define DPP_DEV_SDT_ID_MAX (256U) +#define DPP_DTB_QUEUE_MAX (128) + +#define DPP_CHIP_DPP (0x279221) + +#define X86_ADDR_2_ARRCH64(X86_ADDR) (((X86_ADDR & (~0xFFFF)) << 4) | (X86_ADDR & 0xFFFF)) + +#define DPP_PCIE_SLOT_MAX (256) +#define DPP_PCIE_CHANNEL_MAX (128) +#define DPP_PCIE_CHANNEL_ID(VPORT) (((VPORT & 0x7000) | (VPORT & 0x0700)) >> 8) + +#define DEV_ID(DEV) (((DPP_DEV_T *)(DEV))->device_id) +#define DEV_PCIE_SLOT(DEV) (((DPP_DEV_T *)(DEV))->pcie_channel.slot) +#define DEV_PCIE_VPORT(DEV) (((DPP_DEV_T *)(DEV))->pcie_channel.vport) +#define DEV_PCIE_DEV(DEV) (((DPP_DEV_T *)(DEV))->pcie_channel.device) +#define DEV_PCIE_ADDR(DEV) (((DPP_DEV_T *)(DEV))->pcie_channel.base_addr) +#define DEV_PCIE_OFFSET_ADDR(DEV) (((DPP_DEV_T *)(DEV))->pcie_channel.offset_addr) +#define DEV_PCIE_ID(DEV) (((DPP_DEV_T *)(DEV))->pcie_channel.pcie_id) +#define DEV_PCIE_MUTEX(DEV) (((DPP_DEV_T *)(DEV))->pcie_channel.oper_mutex) + +#define DEV_PCIE_MSG_OFFSET_ADDR (0x2000) +#define DEV_PCIE_MSG_ADDR(DEV) (DEV_PCIE_ADDR(DEV) + DEV_PCIE_MSG_OFFSET_ADDR) +#define DEV_PCIE_REG_ADDR(DEV) (DEV_PCIE_ADDR(DEV) + DEV_PCIE_OFFSET_ADDR(DEV) - SYS_NP_BASE_ADDR1) + +typedef struct dpp_pf_info_t +{ + ZXIC_UINT16 slot; + ZXIC_UINT16 vport; +} DPP_PF_INFO_T; + +typedef struct dpp_pcie_channel_t +{ + ZXIC_UINT16 slot; + ZXIC_UINT16 vport; + ZXIC_UINT16 pcie_id; + ZXIC_ADDR_T base_addr; + ZXIC_ADDR_T offset_addr; + struct pci_dev* device; + ZXIC_MUTEX_T* oper_mutex; +} DPP_PCIE_CHANNEL_T; + +typedef struct dpp_dev_t +{ + ZXIC_UINT32 device_id; + DPP_PCIE_CHANNEL_T pcie_channel; +} DPP_DEV_T; + +/** 底层设备硬件读写接口指针*/ +typedef DPP_STATUS (*DPP_DEV_WRITE_FUNC)(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 size, ZXIC_UINT32 *p_data); +typedef DPP_STATUS (*DPP_DEV_READ_FUNC)(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 size, ZXIC_UINT32 *p_data); +typedef DPP_STATUS (*DPP_ACCESS_SWITCH_FUNC)(ZXIC_UINT32 dev_id, ZXIC_UINT32 access_type); + +/** 设备访问类型*/ +typedef enum dpp_dev_access_type_e +{ + DPP_DEV_ACCESS_TYPE_PCIE = 0, /**< @brief PCIe访问*/ + DPP_DEV_ACCESS_TYPE_RISCV = 1, /**< @brief RISCV访问*/ +} DPP_DEV_ACCESS_TYPE_E; + +/** 设备类型*/ +typedef enum dpp_dev_type_e +{ + DPP_DEV_TYPE_SIM = 0, /**< @brief 仿真器设备*/ + DPP_DEV_TYPE_VCS = 1, /**< @brief VCS设备*/ + DPP_DEV_TYPE_CHIP = 2, /**< @brief asci芯片设备*/ + DPP_DEV_TYPE_FPGA = 3, /**< @brief fpga设备*/ + DPP_DEV_TYPE_PCIE_ACC = 4, + DPP_DEV_TYPE_INVALID, +} DPP_DEV_TYPE_E; + +/** 设备版本*/ +typedef enum dpp_chip_version_e +{ + DPP_CHIP_VERSION_DPP = 0U, /**< @brief DPP */ + DPP_CHIP_VERSION_DPP_P = 1U, /**< @brief DPP+ */ + DPP_CHIP_VERSION_INVALID, +} DPP_CHIP_VERSION_E; + +/** 互斥锁类型*/ +typedef enum dpp_dev_mutex_type_e +{ + DPP_DEV_MUTEX_T_REG = 0, /**< @brief 寄存器操作互斥锁 */ + DPP_DEV_MUTEX_T_OAM = 1, /**< @brief OAM模块操作互斥锁 */ + DPP_DEV_MUTEX_T_ETM = 2, /**< @brief ETM模块操作互斥锁 */ + DPP_DEV_MUTEX_T_DDR = 4, /**< @brief DDR模块操作互斥锁 */ + DPP_DEV_MUTEX_T_IND = 5, /**< @brief RAM间接读写操作互斥锁 */ + DPP_DEV_MUTEX_T_ETCAM = 6, /**< @brief ETCAM间接读写操作互斥锁*/ + DPP_DEV_MUTEX_T_MMU = 7, /**< @brief MMU间接读写操作互斥锁 */ + DPP_DEV_MUTEX_T_CAR0 = 8, /**< @brief CAR0模块操作互斥锁 */ + DPP_DEV_MUTEX_T_ALG = 9, /**< @brief ALG间接读写操作互斥锁 */ + DPP_DEV_MUTEX_T_NPPU = 10, /**< @brief nppu间接读写操作互斥锁 */ + DPP_DEV_MUTEX_T_SMMU0 = 11, /**< @brief smmu0 模块操作互斥锁 */ + DPP_DEV_MUTEX_T_SMMU1 = 12, /**< @brief smmu1 模块操作互斥锁 */ + DPP_DEV_MUTEX_T_ETM_2ND = 13, /**< @brief ETM模块二层间接表操作互斥锁 */ + DPP_DEV_MUTEX_T_LPM = 14, /**< @brief LPM模块操作互斥锁 */ + DPP_DEV_MUTEX_T_CRM_TEMP = 15, /**< @brief 温度获取操作互斥锁 */ + DPP_DEV_MUTEX_T_SIM = 16, /**< @brief 仿真器socket通信操作互斥锁 */ + DPP_DEV_MUTEX_T_DTB = 17, /**< @brief DTB队列操作互斥锁 */ + DPP_DEV_MUTEX_T_MAX +} DPP_DEV_MUTEX_TYPE_E; + +typedef enum module_init_e +{ + MODULE_INIT_NPPU = 0, /**< @brief 01:pktrx 0x2:pbu 0x4:odma*/ + MODULE_INIT_PPU, + MODULE_INIT_SE, /**< @brief corresponding bits indicacte SE submodule, 0:smmu0 1:smmu1 2:alg 3:as 4:etcam 5:stat 6:reg_fifo 31:SE_init_done*/ + MODULE_INIT_ETM, /**< @brief bit31:tm bit0:olif bit1:cgavd bit2:tmmu bit3:shap bit4:crdt bit5:qmu */ + MODULE_INIT_DLB, + MODULE_INIT_TRPG, + MODULE_INIT_TSN, + MODULE_INIT_MAX +} MODULE_INIT_E; + +typedef struct dpp_dev_cfg_t +{ + ZXIC_UINT32 device_id; /* 设备号 */ + DPP_DEV_TYPE_E dev_type; /* 设备类型: 0-SIM, 1-VCS, 2-CHIP(ASIC), 3-FPGA. */ + ZXIC_UINT32 chip_ver; /* 设备类型: 0-DPP, 1-DPP+ */ + ZXIC_UINT32 access_type; /* 访问类型: 0-PCIe, 1-RISCV. */ + ZXIC_ADDR_T pcie_addr; /* PCIe映射地址 */ + ZXIC_ADDR_T riscv_addr; /* RISCV映射地址 */ + ZXIC_ADDR_T dma_vir_addr; /* DMA空间映射地址 */ + ZXIC_ADDR_T dma_phy_addr; /* 芯片地址相对偏移 */ + ZXIC_UINT32 init_flags[MODULE_INIT_MAX]; + DPP_DEV_WRITE_FUNC p_pcie_write_fun; /** PCIe硬件写回调函数 */ + DPP_DEV_READ_FUNC p_pcie_read_fun; /** PCIe硬件读回调函数 */ + DPP_DEV_WRITE_FUNC p_riscv_write_fun; /** RISCV硬件写回调函数 */ + DPP_DEV_READ_FUNC p_riscv_read_fun; /** RISCV硬件读回调函数 */ + ZXIC_MUTEX_T reg_opr_mutex; /** 寄存器操作互斥量 */ + ZXIC_MUTEX_T oam_mutex; /** OAM硬件操作互斥锁 */ + ZXIC_MUTEX_T etm_mutex; /** ETM硬件操作互斥锁 */ + ZXIC_MUTEX_T ddr_mutex; /** DDR硬件操作互斥锁 */ + ZXIC_MUTEX_T ind_mutex; /** RAM间接操作互斥锁 */ + ZXIC_MUTEX_T etcam_mutex; /** ETCAM硬件操作互斥锁 */ + ZXIC_MUTEX_T car0_mutex; /** CAR0硬件操作互斥锁 */ + ZXIC_MUTEX_T alg_mutex; /** alg硬件操作互斥锁*/ + ZXIC_MUTEX_T nppu_mutex; /** nppu硬件操作互斥锁*/ + ZXIC_MUTEX_T smmu0_mutex; /** smmu0 硬件操作互斥锁*/ + ZXIC_MUTEX_T smmu1_mutex; /** smmu1 硬件操作互斥锁*/ + ZXIC_MUTEX_T etm_2nd_mutex; /** ETM 二层间接表 硬件操作互斥锁*/ + ZXIC_MUTEX_T lpm_mutex; /** lpm配置 操作互斥锁*/ + ZXIC_MUTEX_T crm_temp_mutex; /** 温度获取 操作互斥锁*/ + ZXIC_MUTEX_T sim_mutex; /** 仿真器socket通信 操作互斥锁*/ + ZXIC_MUTEX_T dtb_mutex; /** DTB操作互斥锁*/ + ZXIC_MUTEX_T dtb_queue_mutex[DPP_DTB_QUEUE_MAX]; /* DTB模块队列操作互斥锁 */ + DPP_PCIE_CHANNEL_T pcie_channel[DPP_PCIE_SLOT_MAX][DPP_PCIE_CHANNEL_MAX]; +} DPP_DEV_CFG_T; + +typedef struct dpp_dev_mngr_t +{ + ZXIC_UINT32 device_num; /* 设备数目 */ + ZXIC_UINT32 is_init; + DPP_DEV_CFG_T *p_dev_array[DPP_DEV_CHANNEL_MAX]; +} DPP_DEV_MGR_T; + +DPP_STATUS dpp_dev_init(ZXIC_VOID); +DPP_STATUS dpp_dev_add(ZXIC_UINT32 dev_id, + DPP_DEV_TYPE_E dev_type, + DPP_DEV_ACCESS_TYPE_E access_type, + ZXIC_ADDR_T pcie_addr, + ZXIC_ADDR_T riscv_addr, + ZXIC_ADDR_T dma_vir_addr, + ZXIC_ADDR_T dma_phy_addr, + DPP_DEV_WRITE_FUNC p_pcie_write_fun, + DPP_DEV_READ_FUNC p_pcie_read_fun, + DPP_DEV_WRITE_FUNC p_riscv_write_fun, + DPP_DEV_READ_FUNC p_riscv_read_fun); +DPP_STATUS dpp_dev_del(ZXIC_UINT32 dev_id); +DPP_STATUS dpp_dev_get(ZXIC_UINT32 dev_id, DPP_PF_INFO_T* pf_info, DPP_DEV_T *dev); +DPP_STATUS dpp_dev_pcie_channel_add(ZXIC_UINT32 dev_id, DPP_PF_INFO_T* pf_info, struct pci_dev* p_dev); +DPP_STATUS dpp_dev_pcie_channel_del(ZXIC_UINT32 dev_id, DPP_PF_INFO_T* pf_info); +ZXIC_UINT32 dpp_dev_get_dev_type(ZXIC_UINT32 dev_id); +ZXIC_UINT32 dpp_dev_chip_version_get(ZXIC_UINT32 dev_id); +DPP_STATUS dpp_dev_init_flag_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 module_id, ZXIC_UINT32 flag); +DPP_STATUS dpp_dev_init_flag_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 module_id, ZXIC_UINT32 *p_flag); +DPP_STATUS dpp_dev_opr_mutex_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 type, ZXIC_MUTEX_T **p_mutex_out); +DPP_STATUS dpp_dev_dtb_opr_mutex_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 type, ZXIC_UINT32 index, ZXIC_MUTEX_T **p_mutex_out); +DPP_STATUS dpp_dev_pcie_default_write(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 size, ZXIC_UINT32 *p_data); +DPP_STATUS dpp_dev_pcie_default_read(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 size, ZXIC_UINT32 *p_data); +DPP_STATUS dpp_dev_write_channel(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 size, ZXIC_UINT32 *p_data); +DPP_STATUS dpp_dev_read_channel(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 size, ZXIC_UINT32 *p_data); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/chip/dpp_init.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/chip/dpp_init.h new file mode 100755 index 0000000..c959437 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/chip/dpp_init.h @@ -0,0 +1,66 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_init.h +* 文件标识 : +* 内容摘要 : 芯片初始化头文件 +* 其它说明 : +* 当前版本 : +* 作 者 : wcl +* 完成日期 : 2015/03/17 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ +#ifndef _DPP_INIT_H_ +#define _DPP_INIT_H_ + +/** 系统初始化标志*/ +#define DPP_INIT_FLAG_ACCESS_TYPE (1<<0) /**< @brief 访问模式: 0-PCRISCV1-MDIO*/ +#define DPP_INIT_FLAG_SERDES_DOWN_TP (1<<1) /**< @brief serdes加载方式: 0-组播,1-单播*/ +#define DPP_INIT_FLAG_DDR_BACKDOOR (1<<2) /**< @brief DDR3校准: 0-校准,1-不校准*/ +#define DPP_INIT_FLAG_SA_MODE (1<<3) /**< @brief SA工作模式: 0-内置sa,1-非SA模式*/ +#define DPP_INIT_FLAG_SA_MESH (1<<4) /**< @brief SA mesh模式: 0-非mesh,1-mesh*/ +#define DPP_INIT_FLAG_SA_SERDES_MODE (1<<5) /**< @brief SA serdes编码方式: 0-64B/66B; 1-8B/10B */ +#define DPP_INIT_FLAG_INT_DEST_MODE (1<<6) /**< @brief 中断上报方式: 0-PCIe; 1-LocalBus(管脚)*/ +#define DPP_INIT_FLAG_LIF0_MODE (1<<7) /**< @brief 0: PON模式 1: QSGMII模式*/ +#define DPP_INIT_FLAG_DMA_ENABLE (1<<8) /**< @brief DMA使能: 0-使能,1-不使能*/ +#define DPP_INIT_FLAG_TM_IMEM_FLAG (1<<9) /**< @brief TM片内外模式: 0-片外,1-片内*/ + +/** dpp sdk系统初始化控制结构*/ +typedef struct dpp_sys_init_ctrl_t +{ + DPP_DEV_TYPE_E device_type; /**< @brief 设备类型,取值参考DPP_DEV_TYPE_E的定义*/ + ZXIC_UINT32 flags; /**< @brief 初始化标志,按bitmap使用,*/ + ZXIC_UINT32 sa_id; /**< @brief 内置sa模式下,sa的ID,范围0~127*/ + ZXIC_UINT32 case_num; /**< @brief TM四组QMU初始化场景编号为1-8;ddr*bank:1:4x2;2:4x4;3:8x2;4:4x8.*/ + ZXIC_UINT32 lif0_port_type; /**< @brief LIF0是PON口模式下,lif0的PON端口类型,详见DPP_LIF0_PON_TYPE_E */ + ZXIC_UINT32 lif1_port_type; /**< @brief 非内置SA模式下,lif1的端口类型,详见DPP_LIF1_PORT_MODE_E */ + ZXIC_ADDR_T pcie_vir_baddr; /**< @brief PCIe映射虚拟基地址*/ + ZXIC_ADDR_T riscv_vir_baddr; /**< @brief RISCV映射虚拟基地址 */ + ZXIC_ADDR_T dma_vir_baddr; /**< @brief DMA映射虚拟地址*/ + ZXIC_ADDR_T dma_phy_baddr; /**< @brief DMA内存物理地址*/ + DPP_DEV_WRITE_FUNC pcie_write_fun; /**< @brief PCIe硬件写回调函数 */ + DPP_DEV_READ_FUNC pcie_read_fun; /**< @brief PCIe硬件读回调函数*/ + DPP_DEV_WRITE_FUNC riscv_write_fun; /**< @brief RISCV硬件写回调函数 */ + DPP_DEV_READ_FUNC riscv_read_fun; /**< @brief RISCV硬件读回调函数*/ + DPP_ACCESS_SWITCH_FUNC access_switch_fun; /**< @brief PCIe/RISCV切换回调函数*/ +} DPP_SYS_INIT_CTRL_T; + +/***********************************************************/ +/** 芯片上电初始,完整版本 +* @param dev_id 设备号 +* @param p_init_ctrl 系统初始化控制数据结构,由用户完成实例化和成员赋值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wcl @date 2015/03/26 +************************************************************/ +DPP_STATUS dpp_init(ZXIC_UINT32 dev_id, DPP_SYS_INIT_CTRL_T *p_init_ctrl); + +#endif /* dpp_init.h */ diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/init/dpp_kernel_init.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/init/dpp_kernel_init.h new file mode 100644 index 0000000..c989094 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/init/dpp_kernel_init.h @@ -0,0 +1,19 @@ +#ifndef _DPP_KERNEL_INIT_H_ +#define _DPP_KERNEL_INIT_H_ + +#include "zxic_common.h" +#include "dpp_dtb_table_api.h" + +ZXIC_SINT32 dpp_dtb_queue_dma_mem_alloc(DPP_DEV_T *dev, ZXIC_UINT32 queue_id, ZXIC_UINT32 size); +ZXIC_SINT32 dpp_dtb_queue_dma_mem_get(DPP_DEV_T *dev, ZXIC_UINT32 queue_id, DTB_QUEUE_DMA_ADDR_INFO *dmaAddrInfo); +ZXIC_SINT32 dpp_dtb_queue_dma_mem_release(DPP_DEV_T *dev, ZXIC_UINT32 queue_id); +ZXIC_SINT32 dtb_sdt_dump_dma_alloc(DPP_DEV_T *dev, + ZXIC_UINT32 dma_size, + ZXIC_UINT64 * p_dma_phy_addr, + ZXIC_UINT64 * p_dma_vir_addr); + +ZXIC_SINT32 dtb_sdt_dump_dma_release(DPP_DEV_T *dev, + ZXIC_UINT32 dma_size, + ZXIC_UINT64 dma_phy_addr, + ZXIC_UINT64 dma_vir_addr); +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/dma/dpp_dtb.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/dma/dpp_dtb.h new file mode 100755 index 0000000..e40be24 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/dma/dpp_dtb.h @@ -0,0 +1,696 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_dtb.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : zab +* 完成日期 : 2022/08/26 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ +#ifndef _DPP_DTB_H_ +#define _DPP_DTB_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "dpp_dtb_cfg.h" + +#define DPP_DTB_QUEUE_ITEM_NUM_MAX (32) + +#define DPP_DTB_ITEM_ACK_SIZE (16) +#define DPP_DTB_ITEM_BUFF_SIZE (16 * 1024) +#define DPP_DTB_ITEM_SIZE (16 + 16 * 1024) +#define DPP_DTB_TAB_UP_SIZE ((16 + 16 * 1024) * 32) +#define DPP_DTB_TAB_DOWN_SIZE ((16 + 16 * 1024) * 32) + +#define DPP_DTB_TAB_UP_ACK_VLD_MASK (0x555555) +#define DPP_DTB_TAB_DOWN_ACK_VLD_MASK (0x5a5a5a) +#define DPP_DTB_TAB_ACK_IS_USING_MASK (0x11111100) +#define DPP_DTB_TAB_ACK_UNUSED_MASK (0x0) +#define DPP_DTB_TAB_ACK_SUCCESS_MASK (0xff) +#define DPP_DTB_TAB_ACK_FAILED_MASK (0x1) +#define DPP_DTB_TAB_ACK_CHECK_VALUE (0x12345678) + +#define DPP_DTB_TAB_ACK_VLD_SHIFT (104) +#define DPP_DTB_TAB_ACK_STATUS_SHIFT (96) + +#define DPP_DTB_TAB_UP_PHY_ADDR_GET(SLOT_ID, DEV_ID, QUEUE_ID, INDEX) \ + (p_dpp_dtb_mgr[SLOT_ID][DEV_ID]->queue_info[QUEUE_ID].tab_up.start_phy_addr + INDEX * p_dpp_dtb_mgr[SLOT_ID][DEV_ID]->queue_info[QUEUE_ID].tab_up.item_size) +#define DPP_DTB_TAB_UP_USER_PHY_ADDR_GET(SLOT_ID, DEV_ID, QUEUE_ID, INDEX) \ + (p_dpp_dtb_mgr[SLOT_ID][DEV_ID]->queue_info[QUEUE_ID].tab_up.user_addr[INDEX].phy_addr) +#define DPP_DTB_TAB_UP_USER_PHY_ADDR_FLAG_GET(SLOT_ID, DEV_ID, QUEUE_ID, INDEX) \ + (p_dpp_dtb_mgr[SLOT_ID][DEV_ID]->queue_info[QUEUE_ID].tab_up.user_addr[INDEX].user_flag) +#define DPP_DTB_TAB_UP_USER_ADDR_FLAG_SET(SLOT_ID, DEV_ID, QUEUE_ID, INDEX, VAL) \ + do {\ + p_dpp_dtb_mgr[SLOT_ID][DEV_ID]->queue_info[QUEUE_ID].tab_up.user_addr[INDEX].user_flag = VAL;\ + }while(0) +#define DPP_DTB_TAB_DOWN_PHY_ADDR_GET(SLOT_ID, DEV_ID, QUEUE_ID, INDEX) \ + (p_dpp_dtb_mgr[SLOT_ID][DEV_ID]->queue_info[QUEUE_ID].tab_down.start_phy_addr + INDEX * p_dpp_dtb_mgr[SLOT_ID][DEV_ID]->queue_info[QUEUE_ID].tab_down.item_size) +#define DPP_DTB_TAB_UP_VIR_ADDR_GET(SLOT_ID, DEV_ID, QUEUE_ID, INDEX) \ + (p_dpp_dtb_mgr[SLOT_ID][DEV_ID]->queue_info[QUEUE_ID].tab_up.start_vir_addr + INDEX * p_dpp_dtb_mgr[SLOT_ID][DEV_ID]->queue_info[QUEUE_ID].tab_up.item_size) +#define DPP_DTB_TAB_UP_USER_VIR_ADDR_GET(SLOT_ID, DEV_ID, QUEUE_ID, INDEX) \ + (p_dpp_dtb_mgr[SLOT_ID][DEV_ID]->queue_info[QUEUE_ID].tab_up.user_addr[INDEX].vir_addr) +#define DPP_DTB_TAB_DOWN_VIR_ADDR_GET(SLOT_ID, DEV_ID, QUEUE_ID, INDEX) \ + (p_dpp_dtb_mgr[SLOT_ID][DEV_ID]->queue_info[QUEUE_ID].tab_down.start_vir_addr + INDEX * p_dpp_dtb_mgr[SLOT_ID][DEV_ID]->queue_info[QUEUE_ID].tab_down.item_size) +#define DPP_DTB_TAB_UP_WR_INDEX_GET(SLOT_ID, DEV_ID, QUEUE_ID) \ + (p_dpp_dtb_mgr[SLOT_ID][DEV_ID]->queue_info[QUEUE_ID].tab_up.wr_index) +#define DPP_DTB_TAB_UP_RD_INDEX_GET(SLOT_ID, DEV_ID, QUEUE_ID) \ + (p_dpp_dtb_mgr[SLOT_ID][DEV_ID]->queue_info[QUEUE_ID].tab_up.rd_index) +#define DPP_DTB_TAB_DOWN_WR_INDEX_GET(SLOT_ID, DEV_ID, QUEUE_ID) \ + (p_dpp_dtb_mgr[SLOT_ID][DEV_ID]->queue_info[QUEUE_ID].tab_down.wr_index) +#define DPP_DTB_TAB_DOWN_RD_INDEX_GET(SLOT_ID, DEV_ID, QUEUE_ID) \ + (p_dpp_dtb_mgr[SLOT_ID][DEV_ID]->queue_info[QUEUE_ID].tab_down.rd_index) +#define DPP_DTB_TAB_UP_DATA_LEN_GET(SLOT_ID, DEV_ID, QUEUE_ID, INDEX) \ + (p_dpp_dtb_mgr[SLOT_ID][DEV_ID]->queue_info[QUEUE_ID].tab_up.data_len[INDEX]) +#define DPP_DTB_QUEUE_INIT_FLAG_GET(SLOT_ID, DEV_ID, QUEUE_ID) \ + (p_dpp_dtb_mgr[SLOT_ID][DEV_ID]->queue_info[QUEUE_ID].init_flag) +#define DPP_DTB_QUEUE_VPORT_GET(SLOT_ID, DEV_ID, QUEUE_ID) \ + (p_dpp_dtb_mgr[SLOT_ID][DEV_ID]->queue_info[QUEUE_ID].vport) + +#define DPP_BDRING_ITEM_SIZE (16) + +#define DPP_UP_MAC_BD_ITEM_NUM (0XFF) + +#define DPP_BD_ITEM_NUM_MAX (0XFF) +#define DPP_UP_BD_BUFF_SIZE_MAX (4 * 1024) + +#define DPP_UP_MAC_BD_ITEM_SIZE ((DPP_UP_MAC_BD_ITEM_NUM + 1) * DPP_BDRING_ITEM_SIZE) +#define DPP_UP_MAC_BUFF_SIZE (16 * 1024) +#define DPP_UP_MAC_BD_BUFF_SIZE (DPP_UP_MAC_BD_ITEM_NUM * DPP_UP_MAC_BUFF_SIZE) +#define DPP_UP_MAC_BD_TOTAL_SIZE (DPP_UP_MAC_BD_ITEM_SIZE + DPP_UP_MAC_BD_BUFF_SIZE) +#define DPP_DMA_BUFF_SIZE (4*1024*1024) + +#define DPP_DMA_BD_VLD_MSK (0x80000000) +#define DPP_DMA_BD_DATA_LEN_MSK (0x7FF) + +#define DPP_EP_ID_MAX (16) + +#define DPP_DTB_LEN_MIN (1) +#define DPP_DTB_DOWN_LEN (0x3FF) + +#define DPP_DMA_HASH_KEY_OFFSET (6) +#define DPP_DMA_HASH_ITEM_MAX (64) +#define DPP_DMA_HASH_KEY_RST (DPP_DMA_HASH_ITEM_MAX-DPP_DMA_HASH_KEY_OFFSET) + +#define DPP_DMA_SENDTYPE_START_BIT (23) +#define DPP_DMA_SENDTYPE_BIT_NUM (2) +#define DPP_DMA_VALID_START_BIT (23) +#define DPP_DMA_VALID_BIT_NUM (1) +#define DPP_DMA_HASHID_START_BIT (21) +#define DPP_DMA_HASHID_BIT_NUM (2) +#define DPP_DMA_TBLID_START_BIT (16) +#define DPP_DMA_TBLID_BIT_NUM (2) + +typedef struct dpp_dtb_queue_cfg_t +{ + ZXIC_ADDR_T up_start_phy_addr; + ZXIC_ADDR_T up_start_vir_addr; + ZXIC_ADDR_T down_start_phy_addr; + ZXIC_ADDR_T down_start_vir_addr; + + ZXIC_UINT32 up_item_size; + ZXIC_UINT32 down_item_size; +}DPP_DTB_QUEUE_CFG_T; + +typedef struct dpp_dtb_tab_up_user_addr_t +{ + ZXIC_UINT32 user_flag; + + ZXIC_ADDR_T phy_addr; + ZXIC_ADDR_T vir_addr; +}DPP_DTB_TAB_UP_USER_ADDR_T; + +typedef struct dpp_dtb_tab_up_info_t +{ + ZXIC_ADDR_T start_phy_addr; + ZXIC_ADDR_T start_vir_addr; + ZXIC_UINT32 item_size; + + ZXIC_UINT32 wr_index; + ZXIC_UINT32 rd_index; + + ZXIC_UINT32 data_len[DPP_DTB_QUEUE_ITEM_NUM_MAX]; + DPP_DTB_TAB_UP_USER_ADDR_T user_addr[DPP_DTB_QUEUE_ITEM_NUM_MAX]; +}DPP_DTB_TAB_UP_INFO_T; + +typedef struct dpp_dtb_tab_down_info_t +{ + ZXIC_ADDR_T start_phy_addr; + ZXIC_ADDR_T start_vir_addr; + ZXIC_UINT32 item_size; + + ZXIC_UINT32 wr_index; + ZXIC_UINT32 rd_index; +}DPP_DTB_TAB_DOWN_INFO_T; + +typedef struct dpp_dtb_queue_info_t +{ + ZXIC_UINT32 init_flag; + ZXIC_UINT32 slot_id; + ZXIC_UINT32 vport; + ZXIC_UINT32 vector; + + DPP_DTB_TAB_UP_INFO_T tab_up; + DPP_DTB_TAB_DOWN_INFO_T tab_down; +}DPP_DTB_QUEUE_INFO_T; + +typedef struct dpp_dtb_mgr_t +{ + DPP_DTB_QUEUE_INFO_T queue_info[DPP_DTB_QUEUE_NUM_MAX]; +} DPP_DTB_MGR_T; + +typedef enum dpp_dtb_dir_type_e +{ + DPP_DTB_DIR_DOWN_TYPE = 0, + DPP_DTB_DIR_UP_TYPE = 1, + DPP_DTB_DIR_TYPE_MAX, +} DPP_DTB_DIR_TYPE_E; + + +typedef enum dpp_dtb_tab_up_user_addr_type_e +{ + DPP_DTB_TAB_UP_NOUSER_ADDR_TYPE = 0, + DPP_DTB_TAB_UP_USER_ADDR_TYPE = 1, + DPP_DTB_TAB_UP_USER_ADDR_TYPE_MAX, +} DPP_DTB_TAB_UP_USER_ADDR_TYPE_E; + +typedef enum dpp_dma_send_type_e +{ + DMA_LEARN_HASH = 0, + DMA_DEL_HASH = 1, + DMA_UPDATE_HASH = 2, + DMA_ADD_HASH = 3, + DMA_SEND_TYPE_MAX +}DPP_DMA_SEND_TYPE_E; + +/* 单个通道BD表管理结构体 */ +typedef struct dpp_dma_bd_t +{ + ZXIC_ADDR_T bd_phy_addr; /* BD表物理地址 */ + ZXIC_ADDR_T bd_vir_addr; /* BD表进程空间虚拟地址 */ + ZXIC_ADDR_T buff_phy_addr; /* BD表指向的BUFF物理地址 */ + ZXIC_ADDR_T buff_vir_addr; /* BD表指向的BUFF进程空间虚拟地址 */ + ZXIC_UINT32 bd_index; /* BD表当前使用index */ +} DPP_DMA_BD_T; + +/* 单个设备BD表管理结构体 */ +typedef struct dpp_dma_mgr_t +{ + ZXIC_UINT32 init; + ZXIC_UINT32 endian_flag; /* DMA数据通道大小端,0-小端,1-大端 */ + DPP_DMA_BD_T up_mac; +} DPP_DMA_MGR_T; + +/**使能dtb调试函数*/ +ZXIC_UINT32 dpp_dtb_debug_fun_enable(ZXIC_VOID); + +/**去使能dtb调试函数*/ +ZXIC_UINT32 dpp_dtb_debug_fun_disable(ZXIC_VOID); + +/**获取dtb调试函数*/ +ZXIC_UINT32 dpp_dtb_debug_fun_get(ZXIC_VOID); + +/**使能dtb打印函数*/ +ZXIC_UINT32 dpp_dtb_prt_enable(ZXIC_VOID); + +/**去使能dtb打印函数*/ +ZXIC_UINT32 dpp_dtb_prt_disable(ZXIC_VOID); + +/**获取dtb打印函数*/ +ZXIC_UINT32 dpp_dtb_prt_get(ZXIC_VOID); + +ZXIC_UINT32 dpp_dtb_soft_perf_test_set(ZXIC_UINT32 value); + +ZXIC_UINT32 dpp_dtb_soft_perf_test_get(ZXIC_VOID); + +ZXIC_UINT32 dpp_dtb_hardware_perf_test_set(ZXIC_UINT32 value); + +ZXIC_UINT32 dpp_dtb_hardware_perf_test_get(ZXIC_VOID); + +ZXIC_UINT32 dpp_dtb_down_table_overtime_set(ZXIC_UINT32 times_s); +ZXIC_UINT32 dpp_dtb_down_table_overtime_get(ZXIC_VOID); + +ZXIC_UINT32 dpp_dtb_dump_table_overtime_set(ZXIC_UINT32 times_s); +ZXIC_UINT32 dpp_dtb_dump_table_overtime_get(ZXIC_VOID); + +#if ZXIC_REAL("MGR") +/***********************************************************/ +/** 创建DTB的管理结构 +* @param dev_id 设备号,支持多芯片 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_mgr_create(ZXIC_UINT32 slot_id, ZXIC_UINT32 dev_id); + +/***********************************************************/ +/** 注销DTB的管理结构 +* @param dev_id 设备号,支持多芯片 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_mgr_destory_all(ZXIC_VOID); +ZXIC_UINT32 dpp_dtb_mgr_destory(ZXIC_UINT32 slot_id, ZXIC_UINT32 dev_id); + +/***********************************************************/ +/** 重置DTB管理结构 +* @param dev_id 设备号,支持多芯片 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_mgr_reset(ZXIC_UINT32 slot_id, ZXIC_UINT32 dev_id); + +/***********************************************************/ +/** 获取DMA管理结构 +* @param dev_id 设备号,支持多芯片 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +DPP_DTB_MGR_T *dpp_dtb_mgr_get(ZXIC_UINT32 slot_id, ZXIC_UINT32 dev_id); +#endif + +#if ZXIC_REAL("ACK_RW") +/***********************************************************/ +/** 读取BD表条目信息 +* @param dev_id 芯片的id号 +* @param queue_id 队列号,范围0-127 +* @param dir_flag 方向,1-上送表项,0-下发表项 +* @param index 条目索引,范围0-31 +* @param pos 一个item里面的4个32位,pos对应的是第几个ZXICP_WORD32, +* 取值为0,1,2,3 +* @param p_data 读取的数据,大端格式 +* +* @return +* @remark 无 +* @see +* @author zab @date 2019/11/2 +************************************************************/ +ZXIC_UINT32 dpp_dtb_item_ack_rd(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 dir_flag, + ZXIC_UINT32 index, + ZXIC_UINT32 pos, + ZXIC_UINT32 *p_data); + +/***********************************************************/ +/** 向BD表条目指定位置写入值 +* @param dev_id 芯片的id号 +* @param queue_id 队列号,范围0-127 +* @param dir_flag 方向,1-上送表项,0-下发表项 +* @param index 条目索引,范围0-31 +* @param pos 一个item里面的4个32位,pos对应的是第几个ZXICP_WORD32, +* 取值为0,1,2,3 +* @param data 读取的数据,大端格式 +* +* @return +* @remark 无 +* @see +* @author zab @date 2019/11/2 +************************************************************/ +ZXIC_UINT32 dpp_dtb_item_ack_wr(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 dir_flag, + ZXIC_UINT32 index, + ZXIC_UINT32 pos, + ZXIC_UINT32 data); +#endif + +#if ZXIC_REAL("BUFF_RW") +/***********************************************************/ +/** 读取dtb条目指向BUFF的数据 +* @param dev_id 芯片的id号 +* @param queue_id 队列号,范围0-127 +* @param dir_flag 方向,1-上送表项,0-下发表项 +* @param index 条目索引,范围0-31 +* @param pos 相对BUFF起始地址的偏移,单位32bit; +* @param p_data 读取的数据,大端格式 +* @param len 读取数据长度,单位32bit; +* +* @return +* @remark 无 +* @see +* @author zab @date 2019/11/2 +************************************************************/ +ZXIC_UINT32 dpp_dtb_item_buff_rd(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 dir_flag, + ZXIC_UINT32 index, + ZXIC_UINT32 pos, + ZXIC_UINT32 len, + ZXIC_UINT32 *p_data); + +/***********************************************************/ +/** 向BD表条目指向的BUFF指定位置写入值 +* @param dev_id 芯片的id号 +* @param queue_id 队列号,范围0-127 +* @param dir_flag 方向,1-上送表项,0-下发表项 +* @param index 条目索引,范围0-31 +* @param pos 相对BUFF起始地址的偏移,单位32bit; +* @param p_data 读取的数据,大端格式 +* @param len 写入数据长度,单位32bit; +* +* @return +* @remark 无 +* @see +* @author zab @date 2019/11/2 +************************************************************/ +ZXIC_UINT32 dpp_dtb_item_buff_wr(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 dir_flag, + ZXIC_UINT32 index, + ZXIC_UINT32 pos, + ZXIC_UINT32 len, + ZXIC_UINT32 *p_data); +#endif + +#if ZXIC_REAL("API") +/***********************************************************/ +/** 配置下发配置数据信息 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列号,范围0-31 +* @param int_flag 中断标志,0-无,1-有 +* @param data_len 数据长度,单位32bit; +* @param p_data 待下发数据 +* @param p_item_index 返回使用的条目编号 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_tab_down_info_set(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 int_flag, + ZXIC_UINT32 data_len, + ZXIC_UINT32 *p_data, + ZXIC_UINT32 *p_item_index); + +/***********************************************************/ +/** 一个元素down成功状态检查 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列号,范围0-31 +* @param element_id 条目编号 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_tab_down_success_status_check(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 element_id); + +/***********************************************************/ +/** dump队列空闲条目获取 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列号,范围0-31 +* @param p_item_index 返回使用的条目编号 +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_tab_up_free_item_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 *p_item_index); + +/***********************************************************/ +/** 获取dump指定条目物理地址 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列编号,范围:0-127 +* @param item_index 条目编号,范围0-31 +* @param p_phy_haddr 物理地址高32bit +* @param p_phy_laddr 物理地址低32bit +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_tab_up_item_addr_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 item_index, + ZXIC_UINT32 *p_phy_haddr, + ZXIC_UINT32 *p_phy_laddr); + +/***********************************************************/ +/** 获取指定dump条目一定地址偏移的物理地址 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列编号,范围:0-127 +* @param item_index 条目编号,范围0-31 +* @param p_phy_haddr 物理地址高32bit +* @param p_phy_laddr 物理地址低32bit +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_tab_up_item_offset_addr_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 item_index, + ZXIC_UINT32 addr_offset, + ZXIC_UINT32 *p_phy_haddr, + ZXIC_UINT32 *p_phy_laddr); + +/***********************************************************/ +/** 设置dump指定条目空间地址,用于用户自定义空间传输 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列编号,范围:0-127 +* @param item_index 条目编号,范围0-31 +* @param phy_haddr 物理地址高 +* @param vir_laddr 虚拟地址低 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_tab_up_item_user_addr_set(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 item_index, + ZXIC_ADDR_T phy_addr, + ZXIC_ADDR_T vir_addr); + +/***********************************************************/ +/** 清除用户dump指定条目空间地址 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列编号,范围:0-127 +* @param item_index 条目编号,范围0-31 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_tab_up_item_user_addr_clr(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 item_index); + +/***********************************************************/ +/** dump配置描述符信息设置 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列号,范围0-31 +* @param item_index 返回使用的条目编号 +* @param int_flag 中断标志,0-无,1-有 +* @param data_len 数据长度,单位32bit; +* @param desc_len 描述符长度,单位32bit; +* @param p_desc_data 待下发描述符 +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_tab_up_info_set(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 item_index, + ZXIC_UINT32 int_flag, + ZXIC_UINT32 data_len, + ZXIC_UINT32 desc_len, + ZXIC_UINT32 *p_desc_data); + +/***********************************************************/ +/** 一个元素dump成功状态检查 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列号,范围0-31 +* @param element_id 条目编号 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_tab_up_success_status_check(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 element_id); + +/***********************************************************/ +/** 获取dump数据 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列号,范围0-31 +* @param item_index 数据对应的的条目编号 +* @param data_len 数据长度,单位32bit; +* @param p_data dump数据 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_tab_up_data_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 item_index, + ZXIC_UINT32 data_len, + ZXIC_UINT32 *p_data); + +/***********************************************************/ +/** dtb初始化 +* @param dev_id 设备号,支持多芯片 +* +* @return +* @remark 无 +* @see +* @author zab @date 2022/08/30 +************************************************************/ +ZXIC_UINT32 dpp_dtb_init(DPP_DEV_T *dev); + +/***********************************************************/ +/** dtb队列down初始化 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列号 +* @param p_queue_cfg 队列配置参数,具体见DPP_DTB_QUEUE_CFG_T结构体类型 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_down_init(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + DPP_DTB_QUEUE_CFG_T *p_queue_cfg); + +/***********************************************************/ +/** dtb队列dump初始化 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列号 +* @param p_queue_cfg 队列配置参数,具体见DPP_DTB_QUEUE_CFG_T结构体类型 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_dump_init(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + DPP_DTB_QUEUE_CFG_T *p_queue_cfg); + +/***********************************************************/ +/** dtb队列down 空间地址配置 +* @param channelId dtb通道号 +* @param phyAddr down物理地址 +* @param virAddr down虚拟地址 +* @param size 空间大小 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_down_channel_addr_set(DPP_DEV_T *dev, + ZXIC_UINT32 channelId, + ZXIC_UINT64 phyAddr, + ZXIC_UINT64 virAddr, + ZXIC_UINT32 size); + +/***********************************************************/ +/** dtb队列dump 空间地址配置 +* @param channelId dtb通道号 +* @param phyAddr dump物理地址 +* @param virAddr dump虚拟地址 +* @param size 空间大小 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_dump_channel_addr_set(DPP_DEV_T *dev, + ZXIC_UINT32 channelId, + ZXIC_UINT64 phyAddr, + ZXIC_UINT64 virAddr, + ZXIC_UINT32 size); + +/***********************************************************/ +/** 释放队列资源 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 分配到的队列号; +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_id_free(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id); + +/***********************************************************/ +/** 根据vport查找相应的队列号 +* @param dev_id 设备号,支持多芯片 +* @param vport vport信息 +* @param p_queue_arr 找到到队列数组 +* @param p_num 找到的队列个数 +* @return +* @remark 无 +* @see +* @author cbb @date 2023/09/13 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_id_search_by_vport(DPP_DEV_T *dev, + ZXIC_UINT32 *p_queue_arr, + ZXIC_UINT32 *p_num); + +/***********************************************************/ +/** 根据vport查找相应的队列号 +* @param dev_id 设备号,支持多芯片 +* @param vport vport信息 +* @param p_queue_arr 找到到队列数组 +* @param p_num 找到的队列个数 +* @return +* @remark 无 +* @see +* @author cbb @date 2023/09/13 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_id_get(ZXIC_UINT32 dev_id, DPP_PF_INFO_T* pf_info, ZXIC_UINT32 *queue); + +#endif + +#if ZXIC_REAL("DMA") + +#endif + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/dma/dpp_dtb_cfg.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/dma/dpp_dtb_cfg.h new file mode 100755 index 0000000..08fdd24 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/dma/dpp_dtb_cfg.h @@ -0,0 +1,439 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_dtb_cfg.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : zab +* 完成日期 : 2022/08/23 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ +#ifndef _DPP_DTB_CFG_H_ +#define _DPP_DTB_CFG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "dpp_dev.h" + +#define DPP_DEV_SLOT_MAX (256) +#define DPP_DTB_QUEUE_NUM_MAX (128) +#define DPP_DTB_TRAF_CTRL_RAM_SIZE (256) +#define DPP_DTB_TRAF_CTRL_RAM_5_SIZE (64) +#define DPP_DTB_DUMP_PD_RAM_SIZE (2048) +#define DPP_DTB_RD_CTRL_RAM_SIZE (4096) +#define DPP_DTB_RD_TABLE_RAM_SIZE (8192) +#define DPP_DTB_CMD_MAN_RAM_SIZE (16384) + +/*vport格式 +15 |14 13 12 | 11 |10 9 8|7 6 5 4 3 2 1 0| +rsv| ep_id |func_active|func_num| vfunc_num | +*/ +#define VPORT_EPID_BT_START (12) /*EPID起始位*/ +#define VPORT_EPID_BT_LEN (3) /*EPID长度*/ +#define VPORT_FUNC_ACTIVE_BT_START (11) /*FUNC_ACTIVE起始位*/ +#define VPORT_FUNC_ACTIVE_BT_LEN (1) /*FUNC_ACTIVE长度*/ +#define VPORT_FUNC_NUM_BT_START (8) /*FUNC_NUM起始位*/ +#define VPORT_FUNC_NUM_BT_LEN (3) /*FUNC_NUM长度*/ +#define VPORT_VFUNC_NUM_BT_START (0) /*FUNC_NUM起始位*/ +#define VPORT_VFUNC_NUM_BT_LEN (8) /*FUNC_NUM长度*/ + +typedef struct dpp_dtb_queue_item_info_t +{ + ZXIC_UINT32 cmd_vld; + ZXIC_UINT32 cmd_type; + ZXIC_UINT32 int_en; + ZXIC_UINT32 data_len; + ZXIC_UINT32 data_laddr; + ZXIC_UINT32 data_hddr; +} DPP_DTB_QUEUE_ITEM_INFO_T; + +typedef struct dpp_dtb_queue_vm_info_t +{ + ZXIC_UINT32 dbi_en; + ZXIC_UINT32 queue_en; + ZXIC_UINT32 epid; + ZXIC_UINT32 vfunc_num; + ZXIC_UINT32 vector; + ZXIC_UINT32 func_num; + ZXIC_UINT32 vfunc_active; +} DPP_DTB_QUEUE_VM_INFO_T; + +#if ZXIC_REAL("DTB_CFG") +/***********************************************************/ +/** DTB队列元素信息配置 +* @param dev_id 芯片id +* @param queue_id 队列ID,范围0-127 +* @param p_item_info 队列元素配置信息 +* +* @return +* @remark 无 +* @see +* @author zab @date 2018/08/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_item_info_set(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + DPP_DTB_QUEUE_ITEM_INFO_T *p_item_info); + +/***********************************************************/ +/** 获取DTB队列中剩余未使用的条目数量 +* @param dev_id 芯片id +* @param queue_id 队列ID,范围0-127 +* @param p_item_num 剩余未使用条目数量 +* +* @return +* @remark 无 +* @see +* @author zab @date 2018/08/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_unused_item_num_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 *p_item_num); + +/***********************************************************/ +/** 配置队列VM相关信息 +* @param dev_id 芯片id +* @param queue_id 队列ID,范围0-127 +* @param p_vm_info VM配置信息 +* +* @return +* @remark 无 +* @see +* @author zab @date 2018/08/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_vm_info_set(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + DPP_DTB_QUEUE_VM_INFO_T *p_vm_info); + + +/***********************************************************/ +/** 获取队列VM配置信息 +* @param dev_id оƬid +* @param queue_id 队列ID,范围0-127 +* @param p_vm_info VM配置信息 +* +* @return +* @remark 无 +* @see +* @author zab @date 2018/08/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_vm_info_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + DPP_DTB_QUEUE_VM_INFO_T *p_vm_info); + +/***********************************************************/ +/** 配置队列使能 +* @param dev_id 芯片id +* @param queue_id 队列ID,范围0-127 +* @param enable 1:队列使能,0:队列去使能 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2023/09/27 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_enable_set(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 enable); + +/***********************************************************/ +/** 获取队列使能状态 +* @param dev_id 芯片id +* @param queue_id 队列ID,范围0-127 +* @param enable 1:队列使能,0:队列去使能 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2023/09/27 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_enable_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 *enable); + + +/***********************************************************/ +/** 配置 dtb 完成中断事件状态 +* @param dev_id 芯片id +* @param queue_id 队列ID,范围0-127 +* @param state 中断事件状态,1-发生中断,0-无中断发生 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/12 +************************************************************/ +ZXIC_UINT32 dpp_dtb_finish_interrupt_event_state_set(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 state); + + +/***********************************************************/ +/** 清除 dtb 完成中断事件状态 +* @param dev_id 芯片id +* @param queue_id 队列ID,范围0-127 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/12 +************************************************************/ +ZXIC_UINT32 dpp_dtb_finish_interrupt_event_state_clr(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id); + +ZXIC_UINT32 dpp_dtb_debug_mode_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_debug_mode); + +ZXIC_UINT32 dpp_dtb_mode_is_debug(DPP_DEV_T *dev); + +/***********************************************************/ +/** 读取axi 最近一次读表相关信息 +* @param dev_id 芯片id +* @param p_last_rd_table_addr_h axim最近一次读表高地址 +* @param p_last_rd_table_addr_l axim最近一次读表低地址 +* @param p_last_rd_table_len axim最近一次读表长度 +* @param p_last_rd_table_user axim最近一次读表USER信号 +* @param p_last_rd_table_onload_cnt axim最近一次读表在线计数 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/09 +************************************************************/ +ZXIC_UINT32 dpp_dtb_axi_last_rd_table_info_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_last_rd_table_addr_h, + ZXIC_UINT32 *p_last_rd_table_addr_l, + ZXIC_UINT32 *p_last_rd_table_len, + ZXIC_UINT32 *p_last_rd_table_user, + ZXIC_UINT32 *p_last_rd_table_onload_cnt + ); + +/***********************************************************/ +/** 读表通道错误次数统计 +* @param dev_id 芯片id +* @param p_axi_rd_table_resp_err_cnt 读表通道返回错误次数 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/09 +************************************************************/ +ZXIC_UINT32 dpp_dtb_axi_rd_table_resp_err_cnt_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_axi_rd_table_resp_err_cnt + ); + +/***********************************************************/ +/** 读取axi 最近一次读PD相关信息 +* @param dev_id 芯片id +* @param p_last_rd_pd_addr_h axim最近一次读PD高地址 +* @param p_last_rd_pd_addr_l axim最近一次读PD低地址 +* @param p_last_rd_pd_len axim最近一次读PD长度 +* @param p_last_rd_pd_user axim最近一次读PD USER信号 +* @param p_last_rd_pd_onload_cnt axim最近一次读PD在线计数 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/09 +************************************************************/ +ZXIC_UINT32 dpp_dtb_axi_last_rd_pd_info_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_last_rd_pd_addr_h, + ZXIC_UINT32 *p_last_rd_pd_addr_l, + ZXIC_UINT32 *p_last_rd_pd_len, + ZXIC_UINT32 *p_last_rd_pd_user, + ZXIC_UINT32 *p_last_rd_pd_onload_cnt + ); + +/***********************************************************/ +/** 读PD通道错误次数统计 +* @param dev_id 芯片id +* @param p_axi_rd_pd_resp_err_cnt 读PD通道返回错误次数 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/09 +************************************************************/ +ZXIC_UINT32 dpp_dtb_axi_rd_pd_resp_err_cnt_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_axi_rd_pd_resp_err_cnt + ); + +/***********************************************************/ +/** 读取axim 最近一次写控制相关信息 +* @param dev_id 芯片id +* @param p_last_wr_ctrl_addr_h axim最近一次写控制高地址 +* @param p_last_wr_ctrl_addr_l axim最近一次写控制低地址 +* @param p_last_wr_ctrl_len axim最近一次写控制长度 +* @param p_last_wr_ctrl_user axim最近一次写控制 USER信号 +* @param p_last_wr_ctrl_onload_cnt axim最近一次写控制在线计数 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/09 +************************************************************/ +ZXIC_UINT32 dpp_dtb_axi_last_wr_ctrl_info_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_last_wr_ctrl_addr_h, + ZXIC_UINT32 *p_last_wr_ctrl_addr_l, + ZXIC_UINT32 *p_last_wr_ctrl_len, + ZXIC_UINT32 *p_last_wr_ctrl_user, + ZXIC_UINT32 *p_last_wr_ctrl_onload_cnt + ); + +/***********************************************************/ +/** 获取写控制通道错误次数统计 +* @param dev_id 芯片id +* @param p_axi_wr_ctrl_resp_err_cnt 写控制通道返回错误次数 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/09 +************************************************************/ +ZXIC_UINT32 dpp_dtb_axi_wr_ctrl_resp_err_cnt_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_axi_wr_ctrl_resp_err_cnt + ); + +/***********************************************************/ +/** 读取axim 最近一次写DDR相关信息 +* @param dev_id 芯片id +* @param p_last_wr_ddr_addr_h axim最近一次写控制高地址 +* @param p_last_wr_ddr_addr_l axim最近一次写控制低地址 +* @param p_last_wr_ddr_len axim最近一次写控制长度 +* @param p_last_wr_ddr_user axim最近一次写控制 USER信号 +* @param p_last_wr_ddr_onload_cnt axim最近一次写控制在线计数 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/09 +************************************************************/ +ZXIC_UINT32 dpp_dtb_axi_last_wr_ddr_info_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_last_wr_ddr_addr_h, + ZXIC_UINT32 *p_last_wr_ddr_addr_l, + ZXIC_UINT32 *p_last_wr_ddr_len, + ZXIC_UINT32 *p_last_wr_ddr_user, + ZXIC_UINT32 *p_last_wr_ddr_onload_cnt + ) ; + +/***********************************************************/ +/** 获取写DDR通道错误次数统计 +* @param dev_id 芯片id +* @param p_axi_wr_ddr_resp_err_cnt 写DDR通道返回错误次数 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/09 +************************************************************/ +ZXIC_UINT32 dpp_dtb_axi_wr_ddr_resp_err_cnt_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_axi_wr_ddr_resp_err_cnt + ) ; + +/***********************************************************/ +/** 读取axim 最近一次写完成相关信息 +* @param dev_id 芯片id +* @param p_last_wr_fin_addr_h axim最近一次写控制高地址 +* @param p_last_wr_fin_addr_l axim最近一次写控制低地址 +* @param p_last_wr_fin_len axim最近一次写控制长度 +* @param p_last_wr_fin_user axim最近一次写控制 USER信号 +* @param p_last_wr_fin_onload_cnt axim最近一次写控制在线计数 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/09 +************************************************************/ +ZXIC_UINT32 dpp_dtb_axi_last_wr_fin_info_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_last_wr_fin_addr_h, + ZXIC_UINT32 *p_last_wr_fin_addr_l, + ZXIC_UINT32 *p_last_wr_fin_len, + ZXIC_UINT32 *p_last_wr_fin_user, + ZXIC_UINT32 *p_last_wr_fin_onload_cnt + ) ; + +/***********************************************************/ +/** 获取写完成通道错误次数统计 +* @param dev_id 芯片id +* @param p_axi_wr_fin_resp_err_cnt 写完成通道返回错误次数 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/09 +************************************************************/ +ZXIC_UINT32 dpp_dtb_axi_wr_fin_resp_err_cnt_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_axi_wr_fin_resp_err_cnt + ) ; + +/***********************************************************/ +/** 读取 DTB 各通道状态机 +* @param dev_id 芯片id +* @param p_wr_ctrl_state_info 写控制状态机 +* @param p_rd_table_state_info 读表状态机 +* @param p_rd_pd_state_info 读描述符数据状态机 +* @param p_wr_ddr_state_info 写数据到ddr的状态机 +* @param p_wr_fin_state_info 写结束标志的状态机 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/09 +************************************************************/ +ZXIC_UINT32 dpp_dtb_state_info_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_wr_ctrl_state_info, + ZXIC_UINT32 *p_rd_table_state_info, + ZXIC_UINT32 *p_rd_pd_state_info, + ZXIC_UINT32 *p_wr_ddr_state_info, + ZXIC_UINT32 *p_dump_cmd_state_info + ); + +/***********************************************************/ +/** 各通道错误统计打印 +* @param dev_id 芯片的id号 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/11 +************************************************************/ +ZXIC_UINT32 diag_dpp_dtb_channels_axi_resp_err_cnt_prt(DPP_DEV_T *dev); + +/***********************************************************/ +/** AXIM最近一次操作信息记录打印 +* @param dev_id 芯片的id号 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/11 +************************************************************/ +ZXIC_UINT32 diag_dpp_dtb_axi_last_operate_info_prt(DPP_DEV_T *dev); + +/***********************************************************/ +/** DTB 各通道状态机信息获取 +* @param dev_id 芯片的id号 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/11 +************************************************************/ +ZXIC_UINT32 diag_dpp_dtb_channels_state_info_prt(DPP_DEV_T *dev); + +#endif + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/nppu/dpp_pbu.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/nppu/dpp_pbu.h new file mode 100644 index 0000000..e2d3fc0 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/nppu/dpp_pbu.h @@ -0,0 +1,458 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_pbu.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : djf +* 完成日期 : 2014/04/14 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ +#ifndef _DPP_PBU_H_ +#define _DPP_PBU_H_ + +#include "dpp_nppu_reg.h" +#include "dpp_pbu_api.h" + +#if ZXIC_REAL("macro") +/****************************************************************************** + * START: 宏定义 * + *****************************************************************************/ +#define DPP_PBU_IND_CMD_WRT_FLAG (0) +#define DPP_PBU_IND_CMD_RD_FLAG (1) + +#define PBU_FILE_PATH ("sa500t_pbu_output.txt") +#define PBU_FILE_PATH_RAM ("sa500t_pbu_output_ram.txt") + +#define DPP_PBU_PORT_NUM (119) /** 物理端口号个数(0-128) */ +#define DPP_PBU_PORT_TH_MAX (16380) /** IDMA指针阈值最大值 */ + +#define DPP_PBU_LIF0_PORT_NUM (48) /** lif0 48个通道对应的物理端口号个数(0-47) */ +#define DPP_PBU_LIF1_PORT_NUM (56) /** lif1 8个通道对应的物理端口号个数(48~55) */ +#define DPP_PBU_TM_LOOP_PORT_NUM (113) /** TM还回通道113 */ + + +#define DPP_PBU_COS_NUM (8) /** COS个数*/ +#define DPP_PBU_ALL_FTM_LINK_TH_NUM (6) /** COS个数*/ +#define DPP_PBU_IDMA_MAX_TH (16380) /** IDMA指针阈值最大值 */ +#define DPP_PBU_LIF_MAX_TH (16384) /** LIF指针阈值最大值 */ +#define DPP_PBU_MC_MAX_TH (16380) /** 组播指针阈值最大值 */ +#define DPP_PBU_PORT_COS_MAX_TH (16380) /** 单个端口指针阈值最大值 */ +#define DPP_PBU_MC_MAX_DIFF_TH (255) /** 组播指针申请逻辑复制和微码复制直接的阈值差最大值 */ +#define DPP_PBU_MC_MIN_DIFF_TH (5) /** 组播指针申请逻辑复制和微码复制直接的阈值差最小值 */ +#define DPP_PBU_CAP_DATA_MODE_MIN (0) /** PBU抓包数据模式最小值 */ +#define DPP_PBU_CAP_DATA_MODE_MAX (12) /** PBU抓包数据模式最大值 */ + +#define DPP_PBU_CAP_FILTER_ADDR (0x185) +#define DPP_PBU_CAP_PKT_NUM (64) /** 抓包的最大分片个数 */ + +/****************************************************************************** + * END: 宏定义 * + *****************************************************************************/ +#endif + + +#if ZXIC_REAL("struct") + + +typedef enum npe_pbu_ptr_rotate_e{ + DPP_PBU_TOTAL_PTR_ROTATE = 0X1, /**< @brief 全局指针翻转*/ + DPP_PBU_MC_PTR_ROTATE = 0X2, /**< @brief 组播指针翻转*/ + DPP_PBU_PORT_PTR_ROTATE = 0X4, /**< @brief 端口指针翻转*/ + +}DPP_PBU_PTR_ROTATE_E; + + +/****************************************************************************** + * START: 类型定义 * + *****************************************************************************/ +typedef struct dpp_pbu_cnt_para_t +{ + ZXIC_UINT32 total_cnt; /* 总指针计数 */ + ZXIC_UINT32 idma_pub_cnt; /* idma共享指针计数 */ + ZXIC_UINT32 lif_pub_cnt; /* lif共享指针计数 */ + ZXIC_UINT32 mc_total_cnt; /* mc总指针计数 */ +} DPP_PBU_CNT_PARA_T; +/* +typedef struct dpp_pbu_module_fc_rdy_t +{ + ZXIC_UINT32 pbu_oam_send_fc_rdy; + ZXIC_UINT32 pbu_lif_ctrl_rdy; + ZXIC_UINT32 pbu_odma_fc_rdy; + ZXIC_UINT32 pbu_tm_fc_rdy; + ZXIC_UINT32 pbu_idma_cos_rdy; +}DPP_PBU_MODULE_FC_RDY_T; +*/ + +typedef struct dpp_mf_info_t +{ + ZXIC_CHAR* name; + ZXIC_UINT32 start_bit; + ZXIC_UINT32 end_bit; +}DPP_MF_INFO_T; + + +typedef enum dpp_pbu_ind_mem_id_e +{ + DPP_PBU_IDMATH_RAM= 0, /**< @brief 端口阈值RAM,可读可写 */ + DPP_PBU_MACTH_RAM = 1, /**< @brief 端口COS阈值RAM,可读可写 */ + DPP_PBU_CFG_IND_MEM_ID_INVALID = 2, /**< @brief PBU CFG模块使用的内部表的个数 */ +} DPP_PBU_CFG_IND_MEM_ID_E; + +typedef enum dpp_pbu_stat_ind_mem_id_e +{ + DPP_PBU_PORT_CNT = 1, /**< @brief 端口的指针计数,只读 */ + DPP_PBU_STAT = 2, /**< @brief PBU调试计数,只读 */ + DPP_PBU_IFB_CFG = 3, /**< @brief IFB中192字节报文,只读 */ + DPP_PBU_CAPTURE_CFG = 4, /**< @brief 报文抓包 可读可写 */ + DPP_PBU_PORT_PUB_CNT = 5, + DPP_PBU_IND_MEM_ID_INVALID = 6, /**< @brief PBU模块使用的内部表的个数*/ +} DPP_PBU_STAT_IND_MEM_ID_E; + +typedef enum dpp_idma_stat_ind_mem_id_e +{ + DPP_IDMA_STAT_RAM = 0, + DPP_IDMA_DEBUG_RAM = 1, + DPP_IDMA_IND_MEM_ID_INVALID = 2, /**< @brief IDMA模块使用的内部表的个数*/ +} DPP_IDMA_STAT_IND_MEM_ID_E; + +typedef enum dpp_pbu_other_cnt_id_e +{ + DPP_PBU_IDMA_PTR_REQ_CNT = 0, /**< @brief idma指针申请计数,含无效申请 */ + DPP_PBU_IDMA_RFD_WR_CNT = 1, /**< @brief idma写RFD计数 */ + DPP_PBU_IDMA_IFB_WR1_CNT = 2, /**< @brief idma写ifb高64字节计数 */ + DPP_PBU_IDMA_IFB_WR2_CNT = 3, /**< @brief idma写ifb低128字节计数 */ + DPP_PBU_PPU_IFB_RD_CNT = 4, /**< @brief ppu读ifb申请计数 */ + DPP_PBU_IFB_PPU_RDRSP_CNT = 5, /**< @brief ifb返回给ppu包头计数 */ + DPP_PBU_ODMA_RECY_PTR_CNT = 6, /**< @brief odma指针回收个数 */ + DPP_PBU_PPU_PF_REQ0_CNT = 7, /**< @brief ppu微码复制申请指针计数 */ + DPP_PBU_PBU_PF_RSP0_CNT = 8, /**< @brief pbu返回微码复制申请指针计数 */ + DPP_PBU_PPU_PF_REQ1_CNT = 9, /**< @brief ppu逻辑复制申请指针计数 */ + DPP_PBU_PBU_PF_RSP1_CNT = 10, /**< @brief pbu返回逻辑复制申请指针计数 */ + DPP_PBU_PPU_USE_PTR_CNT = 11, /**< @brief idma有效申请指针计数 */ + DPP_PBU_PPU_WRBK_CNT = 12, /**< @brief ppu回写计数 */ + DPP_PBU_PPU_REORDER_RSP_CNT = 13, /**< @brief pbu返回ppu回写参数计数 */ + DPP_PBU_SE_PBU_KEY_VLD_CNT = 14, /**< @brief 深度解析请求计数 */ + DPP_PBU_PBU_SE_RSP_VLD_CNT = 15, /**< @brief 深度解析返回计数 */ + DPP_PBU_ODMA_IFB_RD1_CNT = 16, /**< @brief odma读ifb接口1读请求计数 */ + DPP_PBU_ODMA_IFB_RD2_CNT = 17, /**< @brief odma读ifb接口2读请求计数 */ + DPP_PBU_IDMA_O_ISU_PKT_CNT = 18, /**< @brief idma输出报文总计数 */ + DPP_PBU_IDMA_O_ISU_EPKT_CNT = 19, /**< @brief idma输出带error标记的报文总计数 */ + DPP_PBU_IDMA_DISPKT_CNT = 20, /**< @brief idma丢弃报文总数 */ + DPP_PBU_OTHER_CNT_ID_INVALID, /**< @brief PBU模块other计数的个数*/ +} DPP_PBU_OTHER_CNT_ID_E; + + +typedef struct dpp_pbu_port_ptr_cnt_t +{ + ZXIC_UINT32 peak_port_cnt; /**< @brief 端口指针峰值 */ + ZXIC_UINT32 current_port_cnt;/**< @brief 端口指针占用 */ +} DPP_PBU_PORT_PTR_CNT_T; + +typedef struct dpp_pbu_ifb_data_t +{ + ZXIC_UINT32 pbu_ifb_data[64];/**< @brief ifb数据 */ +} DPP_PBU_IFB_DATA_T; + + +typedef struct dpp_pbu_all_ftm_link_th_t +{ + ZXIC_UINT32 total_congest_th[7]; /**< @brief 拥塞阈值*/ +} DPP_PBU_ALL_FTM_LINK_TH_T; + +typedef struct +{ + ZXIC_UINT32 pbu_lif_group0_pfc_rdy[12]; +} DPP_PBU_LIF_GROUP_PFC_RDY; + + + +/****************************************************************************** + * END: 类型定义 * + *****************************************************************************/ +#endif + +#if 1 +/****************************************************************************** + * START: 函数声明 * + *****************************************************************************/ +#if 0 +DPP_STATUS dpp_pbu_idma_public_th_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 th); +DPP_STATUS dpp_pbu_idma_public_th_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_th); +DPP_STATUS dpp_pbu_lif_public_th_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 th); +DPP_STATUS dpp_pbu_lif_public_th_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_th); +DPP_STATUS dpp_pbu_idma_total_th_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 th); +DPP_STATUS dpp_pbu_idma_total_th_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_th); +DPP_STATUS dpp_pbu_lif_total_th_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 th); +DPP_STATUS dpp_pbu_lif_total_th_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_th); +DPP_STATUS dpp_pbu_mc_total_th_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 th); +DPP_STATUS dpp_pbu_mc_total_th_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_th); + +DPP_STATUS dpp_pbu_mc_cos_para_get(ZXIC_UINT32 dev_id, + DPP_PBU_MC_COS_PARA_T *p_para); +DPP_STATUS dpp_pbu_sa_ip_en_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 en); +DPP_STATUS dpp_pbu_sa_ip_en_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_en); +DPP_STATUS dpp_pbu_cnt_ovfl_mode_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 mode); +DPP_STATUS dpp_pbu_cnt_ovfl_mode_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_mode); +DPP_STATUS dpp_pbu_cnt_rdclr_mode_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 mode); +DPP_STATUS dpp_pbu_cnt_rdclr_mode_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_mode); +DPP_STATUS dpp_pbu_mc_diff_th_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 th); +DPP_STATUS dpp_pbu_mc_diff_th_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_th); +DPP_STATUS dpp_pbu_peak_port_cnt_clr_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 port_no, ZXIC_UINT32 peak_port_cnt_clr); +DPP_STATUS dpp_pbu_peak_port_cnt_clr_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 port_no, ZXIC_UINT32* p_peak_port_cnt_clr); +DPP_STATUS dpp_pbu_all_ftm_crdt_th_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 port_no, DPP_NPPU_PBU_CFG_ALL_FTM_CRDT_TH_T* p_all_ftm_crdt_th); +DPP_STATUS dpp_pbu_all_ftm_crdt_th_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 port_no, DPP_NPPU_PBU_CFG_ALL_FTM_CRDT_TH_T* p_all_ftm_crdt_th); +DPP_STATUS dpp_pbu_all_ftm_link_th_set(ZXIC_UINT32 dev_id, + DPP_PBU_ALL_FTM_LINK_TH_T *p_para); +DPP_STATUS dpp_pbu_all_ftm_link_th_get(ZXIC_UINT32 dev_id, + DPP_PBU_ALL_FTM_LINK_TH_T *p_para); +DPP_STATUS dpp_pbu_ftm_total_congest_th_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 total_congest_th); +DPP_STATUS dpp_pbu_ftm_total_congest_th_get(ZXIC_UINT32 dev_id, ZXIC_UINT32* total_congest_th); +DPP_STATUS dpp_pbu_crdt_mode_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 crdt_mode); +DPP_STATUS dpp_pbu_crdt_mode_get(ZXIC_UINT32 dev_id, ZXIC_UINT32* p_crdt_mode); +DPP_STATUS dpp_pbu_ind_reg_mode_status_check(ZXIC_UINT32 dev_id, ZXIC_UINT32 sub_module_ind_status_reg, ZXIC_UINT32 sleep_time); +DPP_STATUS dpp_pbu_ind_cmd_reg_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 mem_addr, + ZXIC_UINT32 mem_id, + ZXIC_UINT32 wrt_rd_flag); +DPP_STATUS dpp_pbu_ind_data_reg_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 len, + ZXIC_UINT32 *p_data, + ZXIC_UINT32 data_reg_base); +DPP_STATUS dpp_pbu_ind_data_reg_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 len, + ZXIC_UINT32 *p_data, + ZXIC_UINT32 data_reg_base); +DPP_STATUS dpp_pbu_cfg_ind_wrt(ZXIC_UINT32 dev_id, + ZXIC_UINT32 mem_addr, + DPP_PBU_CFG_IND_MEM_ID_E mem_id, + ZXIC_UINT32 len, + ZXIC_UINT32 *p_data); +DPP_STATUS dpp_pbu_cfg_ind_rd(ZXIC_UINT32 dev_id, + ZXIC_UINT32 mem_addr, + DPP_PBU_CFG_IND_MEM_ID_E mem_id, + ZXIC_UINT32 len, + ZXIC_UINT32 *p_data); +#endif +DPP_STATUS dpp_pbu_port_th_get(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + DPP_PBU_PORT_TH_PARA_T *p_para); +DPP_STATUS dpp_pbu_port_cos_th_get(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + DPP_PBU_PORT_COS_TH_PARA_T *p_para); +#if 0 +DPP_STATUS dpp_pbu_cnt_clr_all(ZXIC_UINT32 dev_id); +DPP_STATUS dpp_pbu_int_flag_prt(ZXIC_UINT32 dev_id); +DPP_STATUS dpp_pbu_stat_cnt_para_get(ZXIC_UINT32 dev_id, + DPP_PBU_CNT_PARA_T *p_para); +DPP_STATUS dpp_pbu_stat_thram_init_done_check(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_rdy); +DPP_STATUS dpp_pbu_stat_fptr_init_done_check(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_rdy); +DPP_STATUS dpp_pbu_fc_rdy_get(ZXIC_UINT32 dev_id, + DPP_NPPU_PBU_STAT_PBU_FC_RDY_T* p_pbu_module_fc); +DPP_STATUS dpp_pbu_lif_fc_rdy_get(ZXIC_UINT32 dev_id, + DPP_NPPU_PBU_STAT_PBU_LIF_GROUP0_RDY0_T* p_pbu_group0_rdy0); +DPP_STATUS dpp_pbu_lif_pfc_rdy_get(ZXIC_UINT32 dev_id, DPP_PBU_LIF_GROUP_PFC_RDY *p_lif_group0_pfc_rdy); +DPP_STATUS dpp_pbu_pktrx_mr_pfc_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_pbu_pktrx_mr_pfc); +DPP_STATUS dpp_pbu_stat_reg_mode_status_check(ZXIC_UINT32 dev_id, ZXIC_UINT32 sub_module_ind_status_reg, ZXIC_UINT32 sleep_time); +DPP_STATUS dpp_pbu_stat_ind_cmd_reg_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 mem_addr, + ZXIC_UINT32 mem_id, + ZXIC_UINT32 wrt_rd_flag); +DPP_STATUS dpp_pbu_stat_ind_data_reg_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 len, + ZXIC_UINT32 *p_data); +DPP_STATUS dpp_pbu_stat_ind_data_reg_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 len, + ZXIC_UINT32 *p_data); +DPP_STATUS dpp_pbu_stat_ind_wrt(ZXIC_UINT32 dev_id, + ZXIC_UINT32 mem_addr, + DPP_PBU_STAT_IND_MEM_ID_E mem_id, + ZXIC_UINT32 len, + ZXIC_UINT32 *p_data); +DPP_STATUS dpp_pbu_stat_ind_rd(ZXIC_UINT32 dev_id, + ZXIC_UINT32 mem_addr, + DPP_PBU_STAT_IND_MEM_ID_E mem_id, + ZXIC_UINT32 len, + ZXIC_UINT32 *p_data); +DPP_STATUS dpp_pbu_stat_port_ptr_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 port_id, + DPP_PBU_PORT_PTR_CNT_T *p_port_ptr_cnt); +DPP_STATUS dpp_pbu_stat_ifb_req_vld_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_cnt); +DPP_STATUS dpp_pbu_stat_ifb_rsp_vld_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_cnt); +DPP_STATUS dpp_pbu_stat_odma_recy_ptr_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_cnt); +DPP_STATUS dpp_pbu_stat_mcode_pf_req_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_cnt); +DPP_STATUS dpp_pbu_stat_mcode_pf_rsp_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_cnt); +DPP_STATUS dpp_pbu_stat_logic_pf_req_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_cnt); +DPP_STATUS dpp_pbu_stat_logic_pf_rsp_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_cnt); +DPP_STATUS dpp_pbu_stat_ppu_use_ptr_pulse_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_cnt); +DPP_STATUS dpp_pbu_stat_ppu_wb_vld_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_cnt); +DPP_STATUS dpp_pbu_stat_ppu_reorder_para_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_cnt); +DPP_STATUS dpp_pbu_stat_se_dpi_key_vld_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_cnt); +DPP_STATUS dpp_pbu_stat_se_dpi_rsp_vld_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_cnt); +DPP_STATUS dpp_pbu_stat_odma_ifb_rd1_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_cnt); +DPP_STATUS dpp_pbu_stat_odma_ifb_rd2_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_cnt); +DPP_STATUS dpp_pbu_stat_mcode_pf_no_rsp_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_cnt); +DPP_STATUS dpp_pbu_stat_logic_pf_no_rsp_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_cnt); +DPP_STATUS dpp_pbu_stat_ifb_data_get(ZXIC_UINT32 dev_id, + DPP_PBU_IFB_DATA_T *p_data); +DPP_STATUS dpp_pbu_stat_port_public_ptr_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 port_no, + ZXIC_UINT32 *p_cnt); +DPP_STATUS dpp_idma_cfg_cnt_ovfl_mode_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 mode); +DPP_STATUS dpp_idma_cfg_cnt_ovfl_mode_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_mode); +DPP_STATUS dpp_idma_cfg_cnt_rdclr_mode_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 mode); +DPP_STATUS dpp_idma_cfg_cnt_rdclr_mode_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_mode); +DPP_STATUS dpp_idma_stat_ind_reg_mode_status_check(ZXIC_UINT32 dev_id, ZXIC_UINT32 sub_module_ind_status_reg, ZXIC_UINT32 sleep_time); +DPP_STATUS dpp_idma_stat_ind_cmd_reg_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 mem_addr, + ZXIC_UINT32 mem_id, + ZXIC_UINT32 wrt_rd_flag); +DPP_STATUS dpp_idma_stat_ind_data_reg_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_data); +DPP_STATUS dpp_idma_stat_ind_data_reg_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_data); +DPP_STATUS dpp_idma_stat_ind_wrt(ZXIC_UINT32 dev_id, + ZXIC_UINT32 mem_addr, + DPP_IDMA_STAT_IND_MEM_ID_E mem_id, + ZXIC_UINT32 *p_data); +DPP_STATUS dpp_idma_stat_ind_rd(ZXIC_UINT32 dev_id, + ZXIC_UINT32 mem_addr, + DPP_IDMA_STAT_IND_MEM_ID_E mem_id, + ZXIC_UINT32 *p_data); +DPP_STATUS dpp_idma_stat_to_isu_total_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_cnt); +DPP_STATUS dpp_idma_stat_to_isu_err_total_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_cnt); +DPP_STATUS dpp_idma_stat_disc_total_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_cnt); +DPP_STATUS dpp_idma_stat_port_to_isu_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 port_no, + ZXIC_UINT32 *p_cnt); +DPP_STATUS dpp_idma_stat_port_to_isu_err_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 port_no, + ZXIC_UINT32 *p_cnt); +DPP_STATUS dpp_idma_stat_port_disc_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 port_no, + ZXIC_UINT32 *p_cnt); +DPP_STATUS dpp_pbu_cap_data_mode_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 mod_data); +DPP_STATUS dpp_pbu_pkt_capture_start(ZXIC_UINT32 dev_id, ZXIC_UINT32 pkt_num); +DPP_STATUS dpp_pbu_pkt_capture_stop(ZXIC_UINT32 dev_id); +DPP_STATUS dpp_pbu_pkt_capture_mode_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 mode); +DPP_STATUS dpp_pbu_pkt_capture_cnt(ZXIC_UINT32 dev_id, ZXIC_UINT32* pkt_num); +DPP_STATUS dpp_pbu_pkt_capture_dbg_print(ZXIC_UINT32 dev_id); +DPP_STATUS dpp_pbu_pkt_capture_cnt_print(ZXIC_UINT32 dev_id); +DPP_STATUS dpp_pbu_pkt_capture_print_one(ZXIC_UINT32 dev_id, ZXIC_UINT32 pkt_no); +DPP_STATUS dpp_pbu_pkt_capture_print(ZXIC_UINT32 dev_id, + ZXIC_UINT32 pkt_start_no, + ZXIC_UINT32 pkt_end_no); +DPP_STATUS dpp_pbu_pkt_capture_print_all(ZXIC_UINT32 dev_id); +DPP_STATUS dpp_pbu_pkt_capture_filter_set_bit(ZXIC_UINT32 dev_id, + ZXIC_UINT32 bit_no, + ZXIC_UINT32 filter_mode + ); +DPP_STATUS dpp_pbu_pkt_capture_filter_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 bit_start_no, + ZXIC_UINT32 bit_end_no, + ZXIC_UINT32 filter_mode); +DPP_STATUS dpp_pbu_pkt_capture_filter_mask_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 start, ZXIC_UINT32 end, ZXIC_UINT32 mask, ZXIC_UINT32 data); +DPP_STATUS dpp_pbu_pkt_capture_filter_pkt_mask_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 start, ZXIC_UINT32 end, ZXIC_UINT32 mask, ZXIC_UINT32 data); +DPP_STATUS dpp_pbu_pkt_capture_filter_sport_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 port); +DPP_STATUS dpp_pbu_pkt_capture_filter_dport_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 port); +DPP_STATUS dpp_pbu_pkt_capture_filter_clr_bit(ZXIC_UINT32 dev_id, + ZXIC_UINT32 bit_no); +DPP_STATUS dpp_pbu_pkt_capture_filter_clr(ZXIC_UINT32 dev_id, + ZXIC_UINT32 bit_start_no, + ZXIC_UINT32 bit_end_no); +DPP_STATUS dpp_pbu_pkt_capture_filter_clr_all(ZXIC_UINT32 dev_id); +/***********************************************************/ +/** 抓包报文分片打印by mf bit +* @param dev_id 芯片ID +* @param pkt_no 要打印的分片号 +* +* @return +* @remark 无 +* @see +* @author czd @date 2015/04/29 +************************************************************/ +DPP_STATUS dpp_pbu_pkt_capture_print_one_mf_by_bit(ZXIC_UINT32 dev_id, ZXIC_UINT32 pkt_no); + +DPP_STATUS dpp_pbu_glb_mgr_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_flag, + ZXIC_UINT32 *p_size, + ZXIC_UINT8 **pp_data_buff); +DPP_STATUS dpp_pbu_glb_mgr_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 size, + ZXIC_UINT8 *p_data_buff); +DPP_STATUS dpp_pbu_glb_size_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_size); + +ZXIC_UINT32 sim_soc_mf_field_print(ZXIC_UINT8 *pkt_buff); + + +DPP_STATUS dpp_pbu_pkt_capture_print_mf_by_bit(ZXIC_UINT32 dev_id, + ZXIC_UINT32 pkt_start_no, + ZXIC_UINT32 pkt_end_no); +DPP_STATUS dpp_pbu_pkt_capture_print_one_simple_mf_by_bit(ZXIC_UINT32 dev_id, ZXIC_UINT32 pkt_no); + +DPP_STATUS dpp_pbu_pkt_capture_print_all_mf_by_bit(ZXIC_UINT32 dev_id); + +#endif + +/****************************************************************************** + * END: 函数声明 * + *****************************************************************************/ +#endif + +#endif /* _DPP_PBU_H_ */ +/* 必须有个空行,否则可能编不过 */ + + + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/ppu/dpp_ppu.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/ppu/dpp_ppu.h new file mode 100755 index 0000000..3a07989 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/ppu/dpp_ppu.h @@ -0,0 +1,104 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_ppu.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : 王春雷 +* 完成日期 : 2014/03/18 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef _DPP_PPU_H_ +#define _DPP_PPU_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "dpp_module.h" +#include "dpp_ppu_api.h" +#include "dpp_ppu_reg.h" +#include "zxic_comm_thread.h" + +#define PPU_CLS_ME_NUM (8) +#define PPU_INSTR_MEM_NUM (3) /*ppu中的微码指令空间数量 2个cluster 共用一个指令空间*/ +#define PPU_INSTR_REG_NUM (4) /*ppu中指令空间中的数据寄存器数目*/ +#define PPU_INSTR_NUM_MAX (32*1024) /* xjw mod at 18.6.2 from 16k to 32k */ +#define PPU_SDT_IDX_MIN (0) +#define PPU_SDT_IDX_MAX (255) +#define PPU_DUP_IDX_MIN (0) +#define PPU_DUP_IDX_MAX (63) +#define PPU_INSTR_COL_MAX (4) + +/** ME指令调试中断*/ +#define PPU_ME0_INT_BT_START (0) +#define PPU_ME0_INT_BT_LEN (1) +#define PPU_ME1_INT_BT_START (1) +#define PPU_ME1_INT_BT_LEN (1) +#define PPU_ME2_INT_BT_START (2) +#define PPU_ME2_INT_BT_LEN (1) +#define PPU_ME3_INT_BT_START (3) +#define PPU_ME3_INT_BT_LEN (1) +#define PPU_ME4_INT_BT_START (4) +#define PPU_ME4_INT_BT_LEN (1) +#define PPU_ME5_INT_BT_START (5) +#define PPU_ME5_INT_BT_LEN (1) +#define PPU_ME6_INT_BT_START (6) +#define PPU_ME6_INT_BT_LEN (1) +#define PPU_ME7_INT_BT_START (7) +#define PPU_ME7_INT_BT_LEN (1) + +#define DPP_FPGA_MAX_FLOWTCAM_NUM (32) +#define DPP_PPU_CLS_0_BIT_MAP (1<<0) /*bit0 = 1 代表cluster0 启动*/ +#define DPP_PPU_CLS_1_BIT_MAP (1<<1) /*bit1 = 1 代表cluster1 启动*/ +#define DPP_PPU_CLS_2_BIT_MAP (1<<2) /*bit2 = 1 代表cluster2 启动*/ +#define DPP_PPU_CLS_3_BIT_MAP (1<<3) /*bit3 = 1 代表cluster3 启动*/ +#define DPP_PPU_CLS_4_BIT_MAP (1<<4) /*bit4 = 1 代表cluster4 启动*/ +#define DPP_PPU_CLS_5_BIT_MAP (1<<5) /*bit5 = 1 代表cluster5 启动*/ + +#define DPP_PPU_CLS_ALL_START (0x3F) /*打开所有cluster*/ + +/*该结构在ppu初始化的时候生成 全局不可修改*/ +typedef struct dpp_ppu_cls_bitmap_t +{ + ZXIC_UINT32 cls_use[DPP_PPU_CLUSTER_NUM]; /*记录配置生效的 cluster 由bitmap解析获得*/ + ZXIC_UINT32 instr_mem[PPU_INSTR_MEM_NUM]; /*记录配置生效的 指令空间索引号, 每两个cluster 共享一个指令空间*/ +} DPP_PPU_CLS_BITMAP_T; + +typedef struct dpp_ppu_ppu_cop_thash_rsk_t +{ + ZXIC_UINT32 rsk_319_288; + ZXIC_UINT32 rsk_287_256; + ZXIC_UINT32 rsk_255_224; + ZXIC_UINT32 rsk_223_192; + ZXIC_UINT32 rsk_191_160; + ZXIC_UINT32 rsk_159_128; + ZXIC_UINT32 rsk_127_096; + ZXIC_UINT32 rsk_095_064; + ZXIC_UINT32 rsk_063_032; + ZXIC_UINT32 rsk_031_000; + +} DPP_PPU_PPU_COP_THASH_RSK_T; + +ZXIC_UINT32 dpp_ppu_cls_use_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 cluster_id, ZXIC_UINT32 flag); +ZXIC_UINT32 dpp_ppu_cls_use_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 cluster_id); +ZXIC_UINT32 dpp_ppu_instr_mem_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 mem_id, ZXIC_UINT32 flag); +ZXIC_UINT32 dpp_ppu_parse_cls_bitmap(ZXIC_UINT32 dev_id, ZXIC_UINT32 bitmap); + +DPP_STATUS dpp_ppu_ppu_cop_thash_rsk_set(DPP_DEV_T *dev, DPP_PPU_PPU_COP_THASH_RSK_T *p_para); +DPP_STATUS dpp_ppu_ppu_cop_thash_rsk_get(DPP_DEV_T *dev, DPP_PPU_PPU_COP_THASH_RSK_T *p_ppu_cop_thash_rsk); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/se/dpp_apt_se.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/se/dpp_apt_se.h new file mode 100755 index 0000000..cf59470 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/se/dpp_apt_se.h @@ -0,0 +1,111 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_apt_se.h +* 文件标识 : +* 内容摘要 : SE适配业务接口数据结构和函数声明 +* 其它说明 : +* 当前版本 : +* 作 者 : chenqin00181032 +* 完成日期 : 2022/02/22 +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef _DPP_APT_SE_H_ +#define _DPP_APT_SE_H_ + +#include "dpp_apt_se_api.h" + +#define SDT_OPER_ADD (ZXIC_UINT32)(0) +#define SDT_OPER_DEL (ZXIC_UINT32)(1) + +#define SDT_DDR_RW_128BIT (ZXIC_UINT32)(0) +#define SDT_DDR_RW_256BIT (ZXIC_UINT32)(1) +#define SDT_DDR_RW_512BIT (ZXIC_UINT32)(2) + +#define DDR_128BIT_BYTE (ZXIC_UINT32)(16) + +#define ERAM_ENTRY_SOFT_MAX (ZXIC_UINT32)(16) /*eram最大位宽128bit*/ +#define HASH_ENTRY_SOFT_MAX (ZXIC_UINT32)(64) /*hash最大位宽512bit*/ +#define ACL_ENTRY_SOFT_MAX (ZXIC_UINT32)(160) /*acl最大位宽640bit key+640bit mask*/ + +typedef struct se_apt_eram_func_t +{ + ZXIC_UINT32 opr_mode; /**cpu读写位宽模式DPP_ERAM128_OPR_MODE_E 0:128b 1:64b 2:1b 3:32b <@*/ + ZXIC_UINT32 rd_mode; /*读清模式DPP_ERAM128_RD_CLR_MODE_E,0:正常读 1:读清模式*/ + DPP_APT_ERAM_SET_FUNC eram_set_func; + DPP_APT_ERAM_GET_FUNC eram_get_func; +}SE_APT_ERAM_FUNC_T; + +typedef struct se_apt_ddr_func_t +{ + ZXIC_UINT32 ddr_tbl_depth; /*ddr表项深度,单位与ddr读写模式一致*/ + DPP_APT_DDR_SET_FUNC ddr_set_func; + DPP_APT_DDR_GET_FUNC ddr_get_func; +}SE_APT_DDR_FUNC_T; + +typedef struct se_apt_acl_func_t +{ + DPP_APT_ACL_ENTRY_SET_FUNC acl_set_func; + DPP_APT_ACL_ENTRY_GET_FUNC acl_get_func; +}SE_APT_ACL_FUNC_T; + +typedef struct se_apt_hash_func_t +{ + DPP_APT_HASH_ENTRY_SET_FUNC hash_set_func; + DPP_APT_HASH_ENTRY_GET_FUNC hash_get_func; +}SE_APT_HASH_FUNC_T; + +typedef struct se_apt_lpm_func_t +{ + DPP_APT_LPM_ENTRY_SET_FUNC lpm_set_func; + DPP_APT_LPM_ENTRY_GET_FUNC lpm_get_func; +}SE_APT_LPM_FUNC_T; +typedef struct se_apt_callback_t +{ + ZXIC_UINT32 sdtNo; /** <@brief sdt no 0~255 */ + ZXIC_UINT32 table_type; /** <@brief 查找表项类型 */ + + union + { + SE_APT_ERAM_FUNC_T eramFunc; + SE_APT_DDR_FUNC_T ddrFunc; + SE_APT_ACL_FUNC_T aclFunc; + SE_APT_HASH_FUNC_T hashFunc; + SE_APT_LPM_FUNC_T lpmFunc; + }se_func_info; +}SE_APT_CALLBACK_T; + +typedef struct se_apt_eram_soft_t +{ + ZXIC_UINT32 index; + ZXIC_UINT32 buff[ERAM_ENTRY_SOFT_MAX/4]; +}SE_APT_ERAM_SOFT_T; + +typedef struct se_apt_eram_hash_t +{ + ZXIC_UINT32 index; + ZXIC_UINT8 aucData[HASH_ENTRY_SOFT_MAX]; +}SE_APT_HASH_SOFT_T; + +typedef struct se_apt_eram_acl_t +{ + ZXIC_UINT32 index; + ZXIC_UINT8 aucData[ACL_ENTRY_SOFT_MAX]; +}SE_APT_ACL_SOFT_T; + +ZXIC_SINT32 dpp_apt_table_key_cmp(void *p_new_key, void *p_old_key, ZXIC_UINT32 key_len); +SE_APT_CALLBACK_T *dpp_apt_get_func(ZXIC_UINT32 dev_id,ZXIC_UINT32 sdt_no); +DPP_STATUS dpp_apt_set_callback(ZXIC_UINT32 dev_id, ZXIC_UINT32 sdt_no, ZXIC_UINT32 table_type,ZXIC_VOID *pData); +DPP_STATUS dpp_apt_sw_list_insert(ZXIC_RB_CFG *rb_cfg,void *pData,ZXIC_UINT32 len); +DPP_STATUS dpp_apt_sw_list_search(ZXIC_RB_CFG *rb_cfg,void *pData,ZXIC_UINT32 len); +DPP_STATUS dpp_apt_sw_list_delete(ZXIC_RB_CFG *rb_cfg,void *pData,ZXIC_UINT32 len); +DPP_STATUS dpp_apt_get_zblock_index(ZXIC_UINT32 zblock_bitmap,ZXIC_UINT32 *zblk_idx); +DPP_STATUS dpp_apt_dtb_res_init(DPP_DEV_T *dev); +DPP_STATUS dpp_apt_se_callback_init(ZXIC_UINT32 dev_id); +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/se/dpp_etcam.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/se/dpp_etcam.h new file mode 100755 index 0000000..588b815 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/se/dpp_etcam.h @@ -0,0 +1,157 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_etcam.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : 王春雷 +* 完成日期 : 2014/04/03 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef _DPP_ETCAM_H_ +#define _DPP_ETCAM_H_ + +#ifdef __cplusplus +extern "C"{ +#endif + +#define DPP_ETCAM_BLOCK_NUM (8) /* eTcam中Block的数目 16:dpp+的etcam block 数目 */ +#define DPP_ETCAM_TBLID_NUM (8) /* eTcam支持的业务表号 */ +#define DPP_ETCAM_RAM_NUM (8) /* Block内部RAM的个数 */ +#define DPP_ETCAM_RAM_WIDTH (80U) /* Block内部单个RAM的宽度,比特为单位 */ + +#ifdef DPP_FPGA_TEST_BAORD_SA500FT +#define DPP_ETCAM_RAM_DEPTH (16U) /* Block内部单个RAM的深度 */ +#else +#define DPP_ETCAM_RAM_DEPTH (512U) /* Block内部单个RAM的深度 */ +#endif + +#define DPP_ETCAM_WR_MASK_MAX (((ZXIC_UINT32)1<> 12) +#define DPP_SMMU1_TOTAL_BANK_NUM (8) +#define DPP_SMMU1_TOTAL_MAX_ADDR (0xffffffff) +#define DPP_SMMU1_TOTAL_MAX_BADDR (DPP_SMMU1_TOTAL_MAX_ADDR >> 12) +#define DPP_SMMU1_BADDR_MASK (0x7ffff800) +#define DPP_SMMU1_DDR_GROUP_NUM (1) +#define DPP_SMMU1_BANK_COPY_MAX_NUM (16) +#define DPP_SMMU1_READ_REG_MAX_NUM (16) +#define DPP_DIR_TBL_BUF_MAX_NUM (DPP_SMMU1_READ_REG_MAX_NUM) + +/*hash ext crc cfg*/ +#define HASH_ECC_EN_BT_START (2) +#define HASH_ECC_EN_BT_WIDTH (1) +#define HASH_BANK_COPY_BT_START (3) +#define HASH_BANK_COPY_BT_WIDTH (3) +#define HASH_BASE_ADDR_BT_START (6) +#define HASH_BASE_ADDR_BT_WIDTH (15) +/*hash learn tbl cfg*/ +#define LEARN_HASH_TBL_BT_START (0) +#define LEARN_HASH_TBL_BT_WIDTH (19) + +#define DPP_SMMU0_MCAST_TBL_MAX_GROUP (0xffff) + +#define DPP_SMMU0_CAR0_MONO_POS (0) +#define DPP_SMMU0_CAR0_MONO_LEN (1) +#define DPP_SMMU0_CAR0_EN_POS (1) +#define DPP_SMMU0_CAR0_EN_LEN (1) +#define DPP_SMMU0_CAR1_MONO_POS (2) +#define DPP_SMMU0_CAR1_MONO_LEN (1) +#define DPP_SMMU0_CAR1_EN_POS (3) +#define DPP_SMMU0_CAR1_EN_LEN (1) + +#define DPP_SMMU0_LPM_AS_TBL_ID_MAX (7) +#define DPP_SMMU0_LPM_AS_TBL_ID_NUM (8) + +#define DPP_SMMU0_MCAST_DATA_VLD_POS (16) +#define DPP_SMMU0_MCAST_DATA_VLD_LEN (1) +#define DPP_SMMU0_MCAST_CNT_POS (0) +#define DPP_SMMU0_MCAST_CNT_LEN (16) + +#define DPP_SMMU0_INDIER_RDWR_OFFSET_NUM (4) +#define DPP_SMMU0_READ_REG_MAX_NUM (4) + +/** SMMU0 调度 fifo ecc 使能标志 */ +#define DPP_SMMU0_PPU_FIFO_POS (12) +#define DPP_SMMU0_PPU_FIFO_LEN (8) +#define DPP_SMMU0_STAT_FIFO_POS (11) +#define DPP_SMMU0_STAT_FIFO_LEN (1) +#define DPP_SMMU0_DMA_FIFO_POS (10) +#define DPP_SMMU0_DMA_FIFO_LEN (1) +#define DPP_SMMU0_ODMA_FIFO_POS (6) +#define DPP_SMMU0_ODMA_FIFO_LEN (4) +#define DPP_SMMU0_MCAST_FIFO_POS (5) +#define DPP_SMMU0_MCAST_FIFO_LEN (1) +#define DPP_SMMU0_ETCAM_FIFO_POS (1) +#define DPP_SMMU0_ETCAM_FIFO_LEN (4) +#define DPP_SMMU0_LPM_FIFO_POS (0) +#define DPP_SMMU0_LPM_FIFO_LEN (1) + +#define DPP_SMMU0_CTRL_ECC_CFG_POS (0) +#define DPP_SMMU0_CTRL_ECC_CFG_LEN (3) + +#define DPP_SMMU0_RSCHD_RAM_POS (0) +#define DPP_SMMU0_RSCHD_RAM_LEN (1) + +#define DPP_SMMU0_ERAM_ECC_CFG_POS (0) +#define DPP_SMMU0_ERAM_ECC_CFG_LEN (24) + +#define DPP_SMMU0_WR_ARB_ECC_CFG_POS (0) +#define DPP_SMMU0_WR_ARB_ECC_CFG_LEN (1) + +/* smmu0 int0 reg bit define */ +#define SMMU0_INT0_DMA_ORDFIFO_START (0) +#define SMMU0_INT0_DMA_ORDFIFO_LEN (1) +#define SMMU0_INT0_ODMA_ORDFIFO_START (1) +#define SMMU0_INT0_ODMA_ORDFIFO_LEN (1) +#define SMMU0_INT0_MCAST_ORDFIFO_START (2) +#define SMMU0_INT0_MCAST_ORDFIFO_LEN (1) + +#define DPP_ERAM128_BADDR_MASK (0x3FFFF80)/* modified for dpp+ 25bit 2018-09-27*/ + +#define DPP_SE_SMMU1_MAX_BADDR_NO_SHARE ((1<<20)-1) +#define DPP_SE_SMMU1_MAX_BADDR_SHARE ((1<<13)-1) +#define DPP_SE_SMMU1_MAX_ADDR ((1<<30)-1) + +#define DPP_SE_SMMU1_BANK_NUM_POS (16) +#define DPP_SE_SMMU1_BANK_NUM_LEN (5) + +#define DPP_SE_SMMU1_SHARE_TYPE_POS (21) +#define DPP_SE_SMMU1_SHARE_TYPE_LEN (2) + +#define DPP_SE_SMMU1_RR_STATE_POS (0) +#define DPP_SE_SMMU1_RR_STATE_LEN (15) + +#define DPP_SE_CFG_PPU_INFO_POS (0) +#define DPP_SE_CFG_PPU_INFO_LEN (12) + +#define DPP_SE_CFG_DPI_FLAG_POS (12) +#define DPP_SE_CFG_DPI_FLAG_LEN (1) + +#define DPP_SE_CFG_WR_FLAG_POS (13) +#define DPP_SE_CFG_WR_FLAG_LEN (1) + + +/** 中断相关 */ +#define DPP_SE_ALG_SCHD_INT_NUM (14) +#define DPP_SE_ALG_ZBLK_ECC_INT_NUM (32) +#define DPP_SE_ALG_HASH0_INT_NUM (8) +#define DPP_SE_ALG_HASH1_INT_NUM (8) +#define DPP_SE_ALG_HASH2_INT_NUM (8) +#define DPP_SE_ALG_HASH3_INT_NUM (8) +#define DPP_SE_ALG_LPM_INT_NUM (10) + +#define DPP_SMMU0_CLS_NUM (6) +#define DPP_SMMU0_STAT_NUM (10) +#define DPP_SMMU0_AS_ETCAM_NUM (DPP_ETCAM_ID_NUM) +#define DPP_SMMU0_PLCR_NUM (1) +#define DPP_SMMU0_ERAM_BLOCK_NUM (32) + +#define DPP_SMMU1_SCH_CNT (4)/*sch 调度次数 完成6->4调度*/ +//#define DPP_SMMU1_GRP_CNT (DPP_SMMU1_DDR_GRP_NUM) +#define DPP_SMMU1_GRP_CNT (8) /*与reg n_size保持一�?*/ +#define DPP_SMMU1_DIR_CHANNEL_CNT (4) + +#define DPP_PARSE_MEX_CHANNEL_NUM (6) +#define DPP_PARSE_KSCHD_CHANNEL_NUM (6) +#define DPP_RSCHD_PPU_CHANNEL_NUM (6) + +typedef enum smmu1_stat_type_e +{ + STAT_TYPE_PPU = 0, + STAT_TYPE_OAM = 1, + STAT_TYPE_MAX, +}SMMU1_STAT_TYPE_E; + +typedef enum alg_lpm_type_e +{ + ALG_LPM_V4 = 1, + ALG_LPM_V6 = 2, + ALG_LPM_V4_AS = 3, + ALG_LPM_V6_AS = 4, + ALG_LPM_MAX +}ALG_LPM_TYPE_E; + +typedef enum se_ddr_bank_info_e +{ + SE_DDR_BKINFO_LPM4 = 0, + SE_DDR_BKINFO_LPM6 = 1, + SE_DDR_BKINFO_LPM4_AS = 2, + SE_DDR_BKINFO_LPM6_AS = 3, +}SE_DDR_BANK_INFO_E; + +typedef enum alg_zblk_serv_type_e +{ + ALG_ZBLK_SERV_LPM = 0, + ALG_ZBLK_SERV_HASH, +}ALG_ZBLK_SERV_TYPE_E; + +typedef enum cmmu_ddr3_bank_enable_e +{ + CMMU_DDR3_BANK_DISABLE = 0, + CMMU_DDR3_BANK_ENABLE, +}CMMU_DDR3_BANK_ENABLE_E; + +/** TM统计读片外位�? */ +typedef enum stat_tm_rd_ddr_mode_e +{ + STAT_TM_RD_DDR_MODE_128 = 0, + STAT_TM_RD_DDR_MODE_256 = 1, + STAT_TM_RD_DDR_MODE_512 = 2, + STAT_TM_RD_DDR_MODE_MAX, +}STAT_TM_RD_DDR_MODE_E; + +typedef enum stat_tm_rd_clr_mode_e +{ + STAT_TM_RD_CLR_MODE_UNCLR = 0, /**< @brief 正常读,读完数据不清�? */ + STAT_TM_RD_CLR_MODE_CLR = 1, /**< @brief 读清模式*/ + STAT_TM_RD_CLR_MODE_MAX, +}STAT_TM_RD_CLR_MODE_E; + +typedef enum se_ddr_map_flag_e +{ + VIR_TO_PHY_FLAG = 0, /**< @brief 虚拟地址/bank到物理地址/bank的映�? */ + PHY_TO_VIR_FLAG = 1, /**< @brief 物理地址/bank到虚拟地址/bank的映�? */ +}SE_DDR_MAP_FLAG_E; + +/** module se*/ +typedef enum module_init_se_e +{ + MODULE_INIT_SE_SMMU0 = 0, + MODULE_INIT_SE_SMMU1, + MODULE_INIT_SE_ALG, + MODULE_INIT_SE_AS, + MODULE_INIT_SE_ETCAM, + MODULE_INIT_SE_STAT, + MODULE_INIT_SE_FIFO, + MODULE_INIT_SE_MAX +} MODULE_INIT_SE_E; + +typedef struct smmu1_kschd_hash_ddr_cfg_t +{ + ZXIC_UINT32 baddr; + ZXIC_UINT32 crcen; + ZXIC_UINT32 mode; +}SMMU1_KSCHD_HASH_DDR_CFG_T; + +typedef struct smmu1_kschd_lpm_ddr_cfg_t +{ + ZXIC_UINT32 baddr; + ZXIC_UINT32 bankcopy; + ZXIC_UINT32 crcen; + ZXIC_UINT32 flag; /* 0-256, 1-384 */ + ZXIC_UINT32 as_baddr; + ZXIC_UINT32 as_bankcopy; + ZXIC_UINT32 as_crcen; + ZXIC_UINT32 as_mode; +}SMMU1_KSCHD_LPM_DDR_CFG_T; + +typedef struct dpp_lpm_as_eram_info_t +{ + ZXIC_UINT32 as_baddr; + ZXIC_UINT32 as_mode; +}DPP_LPM_AS_ERAM_INFO_T; + +typedef struct dpp_lpm_res_info_t +{ + DPP_LPM_AS_ERAM_INFO_T as_eram_info[DPP_SMMU0_LPM_AS_TBL_ID_NUM]; + ZXIC_UINT32 v4_ddr_baddr; + ZXIC_UINT32 v4_as_ddr_baddr; + ZXIC_UINT32 v4_as_rsp_len; + ZXIC_UINT32 v6_ddr_baddr; + ZXIC_UINT32 v6_as_ddr_baddr; + ZXIC_UINT32 v6_as_rsp_len; +}DPP_LPM_RES_INFO_T; + +/*--------------------------------------------------------调试打印计数--------------------------------------------------------*/ + +/*smmu0 调试打印计数 开�?*/ +typedef struct dpp_smmu0_dbg_cnt_t +{ + ZXIC_UINT32 smmu0_rcv_as_age_req_cnt; + ZXIC_UINT32 smmu0_rcv_parse_req_cnt; + ZXIC_UINT32 smmu0_cpu_ind_rd_rsp_cnt; + ZXIC_UINT32 smmu0_cpu_ind_rd_req_cnt; + ZXIC_UINT32 smmu0_cpu_ind_wr_req_cnt; + + ZXIC_UINT32 smmu0_to_plcr_rsp_cnt[DPP_SMMU0_PLCR_NUM]; + ZXIC_UINT32 smmu0_rcv_plcr_req_cnt[DPP_SMMU0_PLCR_NUM]; + + ZXIC_UINT32 smmu0_to_lpm_as_rsp_cnt; + ZXIC_UINT32 smmu0_rcv_lpm_as_req_cnt; + + ZXIC_UINT32 smmu0_to_as_etacm_rsp_cnt[DPP_SMMU0_AS_ETCAM_NUM];/* 与fc是反�? */ + ZXIC_UINT32 smmu0_rcv_as_etacm_req_cnt[DPP_SMMU0_AS_ETCAM_NUM]; + + ZXIC_UINT32 smmu0_to_ppu_mc_rsp_cnt; + ZXIC_UINT32 smmu0_rcv_ppu_mc_req_cnt; + ZXIC_UINT32 smmu0_to_odma_tdm_mc_rsp_cnt; + ZXIC_UINT32 smmu0_rcv_odma_tdm_mc_req_cnt; + ZXIC_UINT32 smmu0_to_odma_rsp_cnt; + ZXIC_UINT32 smmu0_rcv_odma_req_cnt; + ZXIC_UINT32 smmu0_to_dma_rsp_cnt; + ZXIC_UINT32 smmu0_rcv_dma_req_cnt; + + ZXIC_UINT32 smmu0_to_stat_rsp_cnt[DPP_SMMU0_STAT_NUM]; + ZXIC_UINT32 smmu0_rcv_stat_req_cnt[DPP_SMMU0_STAT_NUM]; + ZXIC_UINT32 smmu0_to_ppu_rsp_cnt[DPP_SMMU0_CLS_NUM]; + ZXIC_UINT32 smmu0_rcv_ppu_req_cnt[DPP_SMMU0_CLS_NUM]; + + ZXIC_UINT32 smmu0_rcv_ftm_stat_req0_cnt; + ZXIC_UINT32 smmu0_rcv_ftm_stat_req1_cnt; + ZXIC_UINT32 smmu0_rcv_etm_stat_req0_cnt; + ZXIC_UINT32 smmu0_rcv_etm_stat_req1_cnt; + + ZXIC_UINT32 smmu0_block_rd_cnt[DPP_SMMU0_ERAM_BLOCK_NUM]; + ZXIC_UINT32 smmu0_block_wr_cnt[DPP_SMMU0_ERAM_BLOCK_NUM]; + +}DPP_SMMU0_DBG_CNT_T; + +typedef struct dpp_smmu0_dbg_fc_cnt_t +{ + ZXIC_UINT32 smmu0_to_as_age_req_fc_cnt; + ZXIC_UINT32 smmu0_to_parse_req_fc_cnt; + ZXIC_UINT32 smmu0_rcv_wr_arb_cpu_fc_cnt; + ZXIC_UINT32 smmu0_to_as_lpm_req_fc_cnt; + ZXIC_UINT32 smmu0_rcv_as_lpm_rsp_fc_cnt; + ZXIC_UINT32 smmu0_to_as_etacm_req_fc_cnt[DPP_SMMU0_AS_ETCAM_NUM]; + ZXIC_UINT32 smmu0_rcv_as_etacm_rsp_fc_cnt[DPP_SMMU0_AS_ETCAM_NUM]; + ZXIC_UINT32 smmu0_to_ppu_mc_req_fc_cnt; + ZXIC_UINT32 smmu0_rcv_ppu_mc_rsp_fc_cnt; + ZXIC_UINT32 smmu0_rcv_odma_tdm_mc_rsp_fc_cnt; + ZXIC_UINT32 smmu0_to_odma_tdm_mc_req_fc_cnt; + ZXIC_UINT32 smmu0_to_odma_req_fc_cnt; + ZXIC_UINT32 smmu0_to_dma_req_fc_cnt; + ZXIC_UINT32 smmu0_to_stat_req_fc_cnt[DPP_SMMU0_STAT_NUM]; + ZXIC_UINT32 smmu0_rcv_stat_rsp_fc_cnt[DPP_SMMU0_STAT_NUM]; + ZXIC_UINT32 smmu0_to_ppu_req_fc_cnt[DPP_SMMU0_CLS_NUM]; + ZXIC_UINT32 smmu0_rcv_ppu_rsp_fc_cnt[DPP_SMMU0_CLS_NUM]; +}DPP_SMMU0_DBG_FC_CNT_T; +/*smmu0 调试打印计数 结束*/ + +/*smmu1 计数�?*/ +typedef struct dpp_smmu1_dbg_cnt_t +{ + ZXIC_UINT32 ctrl_to_cash_fc_cnt[DPP_SMMU1_GRP_CNT]; + ZXIC_UINT32 cash_to_ctrl_req_cnt[DPP_SMMU1_GRP_CNT]; + ZXIC_UINT32 rschd_to_cache_fc_cnt[DPP_SMMU1_GRP_CNT]; + ZXIC_UINT32 cash_to_cache_rsp_cnt[DPP_SMMU1_GRP_CNT]; + ZXIC_UINT32 cash_to_ctrl_fc_cnt[DPP_SMMU1_GRP_CNT]; + ZXIC_UINT32 ctrl_to_cash_rsp_cnt[DPP_SMMU1_GRP_CNT]; + ZXIC_UINT32 kschd_to_cache_req_cnt[DPP_SMMU1_GRP_CNT]; + ZXIC_UINT32 cache_to_kschd_fc_cnt[DPP_SMMU1_GRP_CNT]; + ZXIC_UINT32 dma_to_smmu1_rd_req_cnt; + ZXIC_UINT32 oam_to_kschd_req_cnt; + ZXIC_UINT32 oam_rr_state_rsp_cnt; + ZXIC_UINT32 oam_clash_info_cnt; + ZXIC_UINT32 oam_to_rr_req_cnt; + ZXIC_UINT32 lpm_as_to_kschd_req_cnt; + ZXIC_UINT32 lpm_as_rr_state_rsp_cnt; + ZXIC_UINT32 lpm_as_clash_info_cnt; + ZXIC_UINT32 lpm_as_to_rr_req_cnt; + ZXIC_UINT32 lpm_to_kschd_req_cnt; + ZXIC_UINT32 lpm_rr_state_rsp_cnt; + ZXIC_UINT32 lpm_clash_info_cnt; + ZXIC_UINT32 lpm_to_rr_req_cnt; + ZXIC_UINT32 hash_to_kschd_req_cnt[DPP_HASH_ID_NUM]; + ZXIC_UINT32 hash_rr_state_rsp_cnt[DPP_HASH_ID_NUM]; + ZXIC_UINT32 hash_clash_info_cnt[DPP_HASH_ID_NUM]; + ZXIC_UINT32 hash_to_rr_req_cnt[DPP_HASH_ID_NUM]; + ZXIC_UINT32 dir_to_kschd_req_cnt[DPP_SMMU1_DIR_CHANNEL_CNT]; + ZXIC_UINT32 dir_clash_info_cnt[DPP_SMMU1_DIR_CHANNEL_CNT]; + ZXIC_UINT32 dir_tbl_wr_req_cnt; + ZXIC_UINT32 warbi_to_dir_tbl_warbi_fc_cnt; + ZXIC_UINT32 dir_to_bank_rr_req_cnt[DPP_SMMU1_DIR_CHANNEL_CNT]; + ZXIC_UINT32 kschd_to_dir_fc_cnt[DPP_SMMU1_DIR_CHANNEL_CNT]; + ZXIC_UINT32 dir_rr_state_rsp_cnt[DPP_SMMU1_DIR_CHANNEL_CNT]; + ZXIC_UINT32 wr_done_to_warbi_fc_cnt; + ZXIC_UINT32 wr_done_ptr_req_cnt; + ZXIC_UINT32 ctrl_to_warbi_fc_cnt[DPP_SMMU1_GRP_CNT]; + ZXIC_UINT32 warbi_to_ctrl_wr_req_cnt[DPP_SMMU1_GRP_CNT]; + ZXIC_UINT32 warbi_to_cash_wr_req_cnt[DPP_SMMU1_GRP_CNT]; + ZXIC_UINT32 warbi_to_cpu_wr_fc_cnt; + ZXIC_UINT32 cpu_wr_req_cnt; + ZXIC_UINT32 ctrl_to_cpu_rd_rsp_cnt[DPP_SMMU1_GRP_CNT]; + ZXIC_UINT32 cpu_to_ctrl_rd_req_cnt[DPP_SMMU1_GRP_CNT]; + ZXIC_UINT32 cpu_rd_dir_tbl_rsp_cnt; + ZXIC_UINT32 cpu_to_dir_tbl_rd_wr_req_cnt; + ZXIC_UINT32 smmu1_to_mmu_rsp_fc_cnt[DPP_SMMU1_GRP_CNT]; + ZXIC_UINT32 mmu_to_smmu1_rd_rsp_cnt[DPP_SMMU1_GRP_CNT]; + ZXIC_UINT32 mmu_to_smmu1_rd_fc_cnt[DPP_SMMU1_GRP_CNT]; + ZXIC_UINT32 smmu1_to_mmu_rd_req_cnt[DPP_SMMU1_GRP_CNT]; + ZXIC_UINT32 mmu_to_smmu1_wr_fc_cnt[DPP_SMMU1_GRP_CNT]; + ZXIC_UINT32 smmu1_to_mmu_wr_req_cnt[DPP_SMMU1_GRP_CNT]; + ZXIC_UINT32 se_to_smmu1_wr_rsp_fc_cnt; + ZXIC_UINT32 smmu1_to_se_wr_rsp_cnt; + ZXIC_UINT32 ddr_wr_rsp_cnt[DPP_SMMU1_GRP_CNT]; + ZXIC_UINT32 smmu1_to_as_fc_cnt; + ZXIC_UINT32 as_to_smmu1_wr_req_cnt; + ZXIC_UINT32 smmu1_to_se_parser_fc_cnt; + ZXIC_UINT32 se_parser_to_smmu1_req_cnt;/* 微码写ddr直接�? */ + ZXIC_UINT32 smmu1_to_etm_wr_fc_cnt; + ZXIC_UINT32 etm_wr_req_cnt; + ZXIC_UINT32 smmu1_to_ftm_wr_fc_cnt; + ZXIC_UINT32 ftm_wr_req_cnt; + ZXIC_UINT32 smmu1_to_state_wr_fc_cnt; + ZXIC_UINT32 state_wr_req_cnt; + ZXIC_UINT32 se_to_dma_rsp_cnt; + ZXIC_UINT32 se_to_dma_fc_cnt; + ZXIC_UINT32 oam_to_smmu1_fc_cnt; + ZXIC_UINT32 smmu1_to_oam_rsp_cnt; + ZXIC_UINT32 smmu1_to_oam_fc_cnt; + ZXIC_UINT32 oam_to_smmu1_req_cnt; + ZXIC_UINT32 smmu1_to_etm_rsp_cnt; + ZXIC_UINT32 smmu1_to_ftm_rsp_cnt; + ZXIC_UINT32 smmu1_to_etm_fc_cnt; + ZXIC_UINT32 etm_to_smmu1_req_cnt; + ZXIC_UINT32 smmu1_to_ftm_fc_cnt; + ZXIC_UINT32 ftm_to_smmu1_req_cnt; + ZXIC_UINT32 smmu1_to_stat_rsp_cnt; + ZXIC_UINT32 smmu1_to_stat_fc_cnt; + ZXIC_UINT32 stat_to_smmu1_req_cnt; /* cmmu */ + ZXIC_UINT32 lpm_as_to_smmu1_fc_cnt; + ZXIC_UINT32 lpm_to_smmu1_fc_cnt; + ZXIC_UINT32 smmu1_to_lpm_as_rsp_cnt; + ZXIC_UINT32 smmu1_to_lpm_rsp_cnt; + ZXIC_UINT32 smmu1_to_lpm_as_fc_cnt; + ZXIC_UINT32 smmu1_to_lpm_fc_cnt; + ZXIC_UINT32 lpm_as_to_smmu1_req_cnt; + ZXIC_UINT32 lpm_to_smmu1_req_cnt; + ZXIC_UINT32 hash_to_smmu1_fc_cnt[DPP_HASH_ID_NUM]; + ZXIC_UINT32 smmu1_to_hash_rsp_cnt[DPP_HASH_ID_NUM]; + ZXIC_UINT32 smmu1_to_hash_fc_cnt[DPP_HASH_ID_NUM]; + ZXIC_UINT32 hash_to_smmu1_cnt[DPP_HASH_ID_NUM]; + ZXIC_UINT32 se_to_smmu1_dir_rsp_fc_cnt[DPP_SMMU1_DIR_CHANNEL_CNT]; + ZXIC_UINT32 smmu1_to_se_dir_rsp_cnt[DPP_SMMU1_DIR_CHANNEL_CNT]; + ZXIC_UINT32 smmu1_to_se_dir_fc_cnt[DPP_SMMU1_DIR_CHANNEL_CNT]; + ZXIC_UINT32 se_to_smmu1_dir_cnt[DPP_SMMU1_DIR_CHANNEL_CNT]; + ZXIC_UINT32 cache_to_rschd_rsp_cnt[DPP_SMMU1_GRP_CNT]; +}DPP_SMMU1_DBG_CNT_T; + +/*parser 计数�?*/ +typedef struct se_parser_dbg_cnt_t +{ + ZXIC_UINT32 mex_req_cnt[DPP_PARSE_MEX_CHANNEL_NUM]; + ZXIC_UINT32 kschd_req_cnt[DPP_PARSE_KSCHD_CHANNEL_NUM]; + ZXIC_UINT32 kschd_parser_fc_cnt[DPP_PARSE_KSCHD_CHANNEL_NUM]; + ZXIC_UINT32 se_ppu_mex_fc_cnt[DPP_PARSE_MEX_CHANNEL_NUM]; + ZXIC_UINT32 smmu0_marc_fc_cnt; + ZXIC_UINT32 smmu0_marc_key_cnt; + ZXIC_UINT32 smmu1_key_cnt; + ZXIC_UINT32 smmu1_parser_fc_cnt; + ZXIC_UINT32 marc_tab_type_err_mex_cnt[DPP_PARSE_MEX_CHANNEL_NUM]; + ZXIC_UINT32 eram_fulladdr_drop_cnt; +}SE_PARSER_DBG_CNT_T; + +/*kschd 计数�?*/ +typedef struct se_kschd_dbg_cnt_t +{ + ZXIC_UINT32 parser_kschd_key_cnt[DPP_PARSE_KSCHD_CHANNEL_NUM]; + ZXIC_UINT32 kschd_smmu1_key_cnt[DPP_SMMU1_SCH_CNT]; + ZXIC_UINT32 kschd_to_as_hash0_key_cnt; + ZXIC_UINT32 kschd_to_as_hash1_key_cnt; + ZXIC_UINT32 kschd_to_as_hash2_key_cnt; + ZXIC_UINT32 kschd_to_as_hash3_key_cnt; + ZXIC_UINT32 kschd_to_as_lpm_key_cnt; + ZXIC_UINT32 kschd_to_as_etacm0_key_cnt; + ZXIC_UINT32 kschd_to_as_etacm1_key_cnt; + ZXIC_UINT32 kschd_to_as_pbu_key_cnt; + ZXIC_UINT32 kschd_to_parser_fc_cnt[DPP_PARSE_KSCHD_CHANNEL_NUM]; + ZXIC_UINT32 smmu1_kschd_fc_cnt[DPP_SMMU1_SCH_CNT]; + ZXIC_UINT32 kschd_rcv_as_hash0_fc_cnt; + ZXIC_UINT32 kschd_rcv_as_hash1_fc_cnt; + ZXIC_UINT32 kschd_rcv_as_hash2_fc_cnt; + ZXIC_UINT32 kschd_rcv_as_hash3_fc_cnt; + ZXIC_UINT32 kschd_rcv_as_lpm_fc_cnt; + ZXIC_UINT32 kschd_rcv_as_etacm0_fc_cnt; + ZXIC_UINT32 kschd_rcv_as_etacm1_fc_cnt; + ZXIC_UINT32 kschd_rcv_as_pbu_fc_cnt; +}SE_KSCHD_DBG_CNT_T; + +/*rschd 计数�?*/ +typedef struct se_rschd_dbg_cnt_t +{ + ZXIC_UINT32 se_ppu_mex_rsp_cnt[DPP_RSCHD_PPU_CHANNEL_NUM]; + ZXIC_UINT32 rschd_rcv_as_hash0_rsp_cnt; + ZXIC_UINT32 rschd_rcv_as_hash1_rsp_cnt; + ZXIC_UINT32 rschd_rcv_as_hash2_rsp_cnt; + ZXIC_UINT32 rschd_rcv_as_hash3_rsp_cnt; + ZXIC_UINT32 rschd_rcv_as_lpm_rsp_cnt; + ZXIC_UINT32 rschd_rcv_as_etacm0_rsp_cnt; + ZXIC_UINT32 rschd_rcv_as_etacm1_rsp_cnt; + ZXIC_UINT32 rschd_rcv_as_pbu_rsp_cnt; + ZXIC_UINT32 smmu1_rschd_rsp_cnt[DPP_SMMU1_SCH_CNT]; + ZXIC_UINT32 ppu_se_mex_fc_cnt[DPP_RSCHD_PPU_CHANNEL_NUM]; + ZXIC_UINT32 rschd_to_as_hash0_fc_cnt; + ZXIC_UINT32 rschd_to_as_hash1_fc_cnt; + ZXIC_UINT32 rschd_to_as_hash2_fc_cnt; + ZXIC_UINT32 rschd_to_as_hash3_fc_cnt; + ZXIC_UINT32 rschd_to_as_lpm_fc_cnt; + ZXIC_UINT32 rschd_to_as_etacm0_fc_cnt; + ZXIC_UINT32 rschd_to_as_etacm1_fc_cnt; + ZXIC_UINT32 rschd_to_as_pbu_fc_cnt; + ZXIC_UINT32 rschd_smmu1_rdy_cnt[DPP_SMMU1_SCH_CNT]; + ZXIC_UINT32 rschd_rcv_smmu0_wr_done_cnt; + ZXIC_UINT32 rschd_to_smmu0_wr_done_fc_cnt; + ZXIC_UINT32 rschd_rcv_smmu1_wr_done_cnt; + ZXIC_UINT32 rschd_to_smmu1_wr_done_fc_cnt; + ZXIC_UINT32 rschd_rcv_alg_wr_done_cnt; + ZXIC_UINT32 rschd_to_alg_wr_done_fc_cnt; +}SE_RSCHD_DBG_CNT_T; + +/*cmmu 计数�?*/ +typedef struct se_cmmu_dbg_cnt_t +{ + ZXIC_UINT32 stat_cmmu_req_cnt; + ZXIC_UINT32 cmmu_stat_fc_cnt; + ZXIC_UINT32 smmu1_cmmu_wr_fc_cnt; + ZXIC_UINT32 smmu1_cmmu_rd_fc_cnt; +}SE_CMMU_DBG_CNT_T; +/*cmmu req计数�? 结束*/ + +/*se_as模块 计数�?*/ +typedef struct se_as_dbg_cnt_t +{ + ZXIC_UINT32 hash_wr_req_cnt[DPP_HASH_ID_NUM]; + ZXIC_UINT32 smmu0_etcam_fc_cnt[DPP_ETCAM_ID_NUM]; + ZXIC_UINT32 etcam_smmu0_req_cnt[DPP_ETCAM_ID_NUM]; + ZXIC_UINT32 smmu0_etcam_rsp_cnt[DPP_ETCAM_ID_NUM]; + ZXIC_UINT32 as_hla_hash_key_cnt[DPP_HASH_ID_NUM]; + ZXIC_UINT32 as_hla_lpm_key_cnt; + ZXIC_UINT32 alg_as_hash_rsp_cnt[DPP_HASH_ID_NUM]; + ZXIC_UINT32 alg_as_hash_smf_rsp_cnt[DPP_HASH_ID_NUM];/* 命中计数 */ + ZXIC_UINT32 alg_as_lpm_rsp_cnt; + ZXIC_UINT32 alg_as_lpm_smf_rsp_cnt;/* 命中计数 */ + ZXIC_UINT32 as_pbu_key_cnt; + ZXIC_UINT32 pbu_se_dpi_rsp_dat_cnt; + ZXIC_UINT32 as_etcam_ctrl_req_cnt[DPP_ETCAM_ID_NUM]; + ZXIC_UINT32 etcam_ctrl_as_index_cnt[DPP_ETCAM_ID_NUM];/* 有效返回计数 */ + ZXIC_UINT32 etcam_ctrl_as_hit_cnt[DPP_ETCAM_ID_NUM]; + ZXIC_UINT32 as_smmu0_req_cnt; + ZXIC_UINT32 learn_hla_wr_cnt;/* 硬件学习 */ + ZXIC_UINT32 as_smmu1_req_cnt; + ZXIC_UINT32 se_cfg_mac_dat_cnt;/* 到DMA计数 */ + ZXIC_UINT32 alg_as_hash_fc_cnt[DPP_HASH_ID_NUM]; + ZXIC_UINT32 alg_as_lpm_fc_cnt; + ZXIC_UINT32 as_alg_hash_fc_cnt[DPP_HASH_ID_NUM]; + ZXIC_UINT32 as_alg_lpm_fc_cnt; + ZXIC_UINT32 as_pbu_fc_cnt; + ZXIC_UINT32 pbu_se_dpi_key_fc_cnt; + ZXIC_UINT32 as_etcam_ctrl_fc_cnt[DPP_ETCAM_ID_NUM]; + ZXIC_UINT32 etcam_ctrl_as_fc_cnt[DPP_ETCAM_ID_NUM]; + ZXIC_UINT32 smmu0_as_mac_age_fc_cnt; + ZXIC_UINT32 alg_learn_fc_cnt; + ZXIC_UINT32 smmu1_as_fc_cnt; + ZXIC_UINT32 cfg_se_mac_fc_cnt; +}SE_AS_DBG_CNT_T; + + +/* hash 是否响应dma流控使能*/ +typedef enum se_as_hash_dma_fc_en_e +{ + HASH_EN_DMA_FC = 0, + HASH_UN_EN_DMA_FC = 1, +}SE_AS_HASH_DMA_FC_EN_E; +/*se_as模块 计数�? 结束*/ + +/** alg模块调试计数*/ +typedef struct se_alg_dbg_cnt_t +{ + ZXIC_UINT32 hash_key_cnt[4]; + ZXIC_UINT32 hash_rsp_cnt[4]; + ZXIC_UINT32 hash_hit_cnt[4]; + ZXIC_UINT32 hash_space_vld_cnt[4]; + ZXIC_UINT32 hash_ddr3_req_vld_cnt[4]; + ZXIC_UINT32 hash_ddr3_rsp_vld_cnt[4]; + + ZXIC_UINT32 lpm_key_cnt; + ZXIC_UINT32 lpm_rsp_cnt; + ZXIC_UINT32 lpm_hit_cnt; + ZXIC_UINT32 lpm_key_ddr3_req_vld_cnt; /**< @brief LPM_SMMU1_P4口用于键�?*/ + ZXIC_UINT32 lpm_key_ddr3_rsp_vld_cnt; /**< @brief LPM_SMMU1_P4口用于键�?*/ + ZXIC_UINT32 lpm_as_ddr3_req_vld_cnt; /**< @brief LPM_SMMU1_P5口用于关联结�?*/ + ZXIC_UINT32 lpm_as_ddr3_rsp_vld_cnt; /**< @brief LPM_SMMU1_P5口用于关联结�?*/ +}SE_ALG_DBG_CNT_T; + +typedef struct se_alg_dbg_excp_cnt_t +{ + ZXIC_UINT32 schd_learn_fifo_int_cnt; + ZXIC_UINT32 schd_hash_fifo_int_cnt[4]; + ZXIC_UINT32 schd_lpm_fifo_int_cnt; + ZXIC_UINT32 schd_learn_fifo_parity_err_cnt; + ZXIC_UINT32 schd_hash_fifo_parity_err_cnt[4]; + ZXIC_UINT32 schd_lpm_fifo_parity_err_cnt; + ZXIC_UINT32 rd_init_cft_cnt; /**< @brief 初始化过程中出现的CPU读命令冲突计�?*/ + ZXIC_UINT32 zblk_ecc_err_cnt[32]; /**< @brief 32个zblock的ecc错误计数*/ + ZXIC_UINT32 zcam_hash_parity_err_cnt[4]; /**< @brief 4个hash业务口的parity错误计数*/ + ZXIC_UINT32 zcam_lpm_err_cnt; /**< @brief LPM业务口错误计�?*/ + + ZXIC_UINT32 hash_sreq_fifo_parity_err_cnt[4]; + ZXIC_UINT32 hash_sreq_fifo_int_cnt[4]; + ZXIC_UINT32 hash_key_fifo_int_cnt[4]; + ZXIC_UINT32 hash_int_rsp_fifo_parity_err_cnt[4]; + ZXIC_UINT32 hash_ext_rsp_fifo_parity_err_cnt[4]; + ZXIC_UINT32 hash_ext_rsp_fifo_int_cnt[4]; + ZXIC_UINT32 hash_int_rsp_fifo_int_cnt[4]; + + ZXIC_UINT32 lpm_ext_rsp_fifo_int_cnt; + ZXIC_UINT32 lpm_ext_v6_fifo_int_cnt; + ZXIC_UINT32 lpm_ext_v4_fifo_int_cnt; + ZXIC_UINT32 lpm_ext_addr_fifo_int_cnt; + ZXIC_UINT32 lpm_ext_v4_fifo_parity_err_cnt; + ZXIC_UINT32 lpm_ext_v6_fifo_parity_err_cnt; + ZXIC_UINT32 lpm_ext_rsp_fifo_parity_err_cnt; + ZXIC_UINT32 lpm_as_req_fifo_int_cnt; + ZXIC_UINT32 lpm_as_int_rsp_fifo_int_cnt; +}SE_ALG_DBG_EXCP_CNT_T; + + +#define LPM_HW_DAT_BUFF_SIZE_MAX (16 * 1024) +typedef enum { + LPM_DAT_WR_TYPE_DMA = 1UL, + LPM_DAT_WR_TYPE_REG = 2UL, +}LPM_DAT_WR_TYPE; + +typedef enum { + LPM_DAT_ZECLL = 1UL, + LPM_DAT_ZREG = 2UL, + LPM_DAT_DDR = 3UL, + LPM_DAT_DDR_RST = 4UL, + LPM_DAT_ERAM_RST = 5UL, + LPM_DAT_TYPE_MAX, +}ROUTE_DAT_TYPE; + +typedef struct _lpm_hw_dat_ddr +{ + ZXIC_UINT32 dat_type; /* ROUTE_DAT_TYPE :LPM_DAT_DDR/LPM_DAT_DDR_RST */ + ZXIC_UINT32 v4v6_flag; /* ALG_LPM_TYPE_E */ + ZXIC_UINT32 lpm_wr_vld; /* 0-WR 1-RD */ + ZXIC_UINT32 tbl_id; /* 对应复制通道 */ + ZXIC_UINT32 base_addr; /* 19b */ + ZXIC_UINT32 index; /* by rw_len */ + ZXIC_UINT32 ecc_en; + ZXIC_UINT32 rw_len; /* SMMU1_DDR_WRT_MODE_E */ + ZXIC_UINT8 data[512/8]; /* 左对�? */ +}ROUTE_HW_DAT_DDR; + +typedef struct _lpm_hw_dat_zcam +{ + ZXIC_UINT32 dat_type; /* ROUTE_DAT_TYPE :LPM_DAT_ZREG/LPM_DAT_ZECLL */ + ZXIC_UINT32 ram_reg_flag; /* 0-reg 1-cell */ + ZXIC_UINT32 rw_addr; /* by 512b */ + ZXIC_UINT8 data[512/8]; /* 左对�? */ +}ROUTE_HW_DAT_ZCAM; + +typedef struct _lpm_hw_dat_eram +{ + ZXIC_UINT32 dat_type; /* ROUTE_DAT_TYPE :LPM_DAT_ERAM_RST */ + ZXIC_UINT32 base_addr; /* by 128b */ + ZXIC_UINT32 index; /* by rw_len*/ + ZXIC_UINT32 rw_len; /* DPP_ERAM128_TBL_MODE_E */ + ZXIC_UINT8 data[128/8];/* 左对�? */ +}ROUTE_HW_DAT_ERAM; + +typedef struct ppu_stat_cfg_t +{ + ZXIC_UINT32 eram_baddr; /*片内统计基地址,单位128bit*/ + ZXIC_UINT32 eram_depth; /*片内深度,单位128bit*/ + ZXIC_UINT32 ddr_base_addr; /*片外统计基地址(PPU和OAM的片外计数共用此基地址),单位2k*256bit*/ + ZXIC_UINT32 ppu_addr_offset; /*PPU统计偏移地址,单位128bit*/ +}PPU_STAT_CFG_T; + +/***********************************************************/ +/** dpp hash的smmu1属性设�? +* @param dev_id 设备�? +* @param hash_id hash引擎�? +* @param tbl_id hash表号 +* @param ecc_en ecc使能 +* @param baddr ddr基地址 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark �? +* @see +* @author ls @date 2016/04/12 +************************************************************/ +DPP_STATUS dpp_se_smmu1_hash_tbl_cfg_set(DPP_DEV_T *dev, + ZXIC_UINT32 hash_id, + ZXIC_UINT32 tbl_id, + ZXIC_UINT32 ecc_en, + ZXIC_UINT32 baddr); + +/** 获取hash算法访问DDR空间的属性,从软件获取(待优化) +* @param dev_id 设备号 +* @param hash_id hash引擎号 +* @param bulk_id Hash引擎存储资源划分块数的ID号 +* @param p_ecc_en 使能ECC校验 +* @param p_base_addr DDR空间基地址 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author tf @date 2016/06/15 +************************************************************/ +DPP_STATUS dpp_se_smmu1_hash_tbl_soft_cfg_get(DPP_DEV_T *dev, + ZXIC_UINT32 hash_id, + ZXIC_UINT32 bulk_id, + ZXIC_UINT32 *p_ecc_en, + ZXIC_UINT32 *p_base_addr); + +DPP_STATUS dpp_se_zblk_serv_cfg_set(DPP_DEV_T *dev, ZXIC_UINT32 zblk_idx, ZXIC_UINT32 serv_sel, ZXIC_UINT32 hash_id, ZXIC_UINT32 enable); + +DPP_STATUS dpp_se_zcell_mono_cfg_set(DPP_DEV_T *dev, + ZXIC_UINT32 zblk_idx, + ZXIC_UINT32 zcell0_tbl_id, + ZXIC_UINT32 zcell0_mono_flag, + ZXIC_UINT32 zcell1_tbl_id, + ZXIC_UINT32 zcell1_mono_flag, + ZXIC_UINT32 zcell2_tbl_id, + ZXIC_UINT32 zcell2_mono_flag, + ZXIC_UINT32 zcell3_tbl_id, + ZXIC_UINT32 zcell3_mono_flag); + +DPP_STATUS dpp_se_zcell_mono_cfg_get(DPP_DEV_T *dev, + ZXIC_UINT32 zblk_idx, + ZXIC_UINT32 *zcell0_tbl_id, + ZXIC_UINT32 *zcell0_mono_flag, + ZXIC_UINT32 *zcell1_tbl_id, + ZXIC_UINT32 *zcell1_mono_flag, + ZXIC_UINT32 *zcell2_tbl_id, + ZXIC_UINT32 *zcell2_mono_flag, + ZXIC_UINT32 *zcell3_tbl_id, + ZXIC_UINT32 *zcell3_mono_flag); + +DPP_STATUS dpp_se_zreg_mono_cfg_set(DPP_DEV_T *dev, + ZXIC_UINT32 zblk_idx, + ZXIC_UINT32 zreg0_tbl_id, + ZXIC_UINT32 zreg0_mono_flag, + ZXIC_UINT32 zreg1_tbl_id, + ZXIC_UINT32 zreg1_mono_flag, + ZXIC_UINT32 zreg2_tbl_id, + ZXIC_UINT32 zreg2_mono_flag, + ZXIC_UINT32 zreg3_tbl_id, + ZXIC_UINT32 zreg3_mono_flag); + +DPP_STATUS dpp_se_zreg_mono_cfg_get(DPP_DEV_T *dev, + ZXIC_UINT32 zblk_idx, + ZXIC_UINT32 *zreg0_tbl_id, + ZXIC_UINT32 *zreg0_mono_flag, + ZXIC_UINT32 *zreg1_tbl_id, + ZXIC_UINT32 *zreg1_mono_flag, + ZXIC_UINT32 *zreg2_tbl_id, + ZXIC_UINT32 *zreg2_mono_flag, + ZXIC_UINT32 *zreg3_tbl_id, + ZXIC_UINT32 *zreg3_mono_flag); +DPP_STATUS dpp_se_hash_zcam_mono_flags_set(DPP_DEV_T *dev, + ZXIC_UINT32 hash0_mono_flag, + ZXIC_UINT32 hash1_mono_flag, + ZXIC_UINT32 hash2_mono_flag, + ZXIC_UINT32 hash3_mono_flag); + +DPP_STATUS dpp_se_hash_zcam_mono_flags_get(DPP_DEV_T *dev, + ZXIC_UINT32 *hash0_mono_flag, + ZXIC_UINT32 *hash1_mono_flag, + ZXIC_UINT32 *hash2_mono_flag, + ZXIC_UINT32 *hash3_mono_flag); + +DPP_STATUS dpp_se_hash_ext_cfg_set(DPP_DEV_T *dev, ZXIC_UINT32 hash_id, ZXIC_UINT32 ext_mode, ZXIC_UINT32 flag); +DPP_STATUS dpp_se_hash_ext_cfg_get(DPP_DEV_T *dev, ZXIC_UINT32 hash_id, ZXIC_UINT32 *p_content_type, ZXIC_UINT32 *p_flag); +DPP_STATUS dpp_se_hash_tbl_depth_set(DPP_DEV_T *dev, + ZXIC_UINT32 hash_id, + ZXIC_UINT32 hash_tbl0_depth, + ZXIC_UINT32 hash_tbl1_depth, + ZXIC_UINT32 hash_tbl2_depth, + ZXIC_UINT32 hash_tbl3_depth, + ZXIC_UINT32 hash_tbl4_depth, + ZXIC_UINT32 hash_tbl5_depth, + ZXIC_UINT32 hash_tbl6_depth, + ZXIC_UINT32 hash_tbl7_depth); +DPP_STATUS dpp_se_hash_tbl_depth_get(DPP_DEV_T *dev, + ZXIC_UINT32 hash_id, + ZXIC_UINT32 *hash_tbl0_depth, + ZXIC_UINT32 *hash_tbl1_depth, + ZXIC_UINT32 *hash_tbl2_depth, + ZXIC_UINT32 *hash_tbl3_depth, + ZXIC_UINT32 *hash_tbl4_depth, + ZXIC_UINT32 *hash_tbl5_depth, + ZXIC_UINT32 *hash_tbl6_depth, + ZXIC_UINT32 *hash_tbl7_depth); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/se/dpp_stat_car.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/se/dpp_stat_car.h new file mode 100755 index 0000000..afa4ca5 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/se/dpp_stat_car.h @@ -0,0 +1,1047 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_stat_car.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : ls +* 完成日期 : 2016/04/05 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ +#ifndef _DPP_STAT_CAR_H_ +#define _DPP_STAT_CAR_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "dpp_dev.h" +#include "dpp_stat_api.h" + + +#define DPP_CAR_ID_MAX (1) + +#define DPP_CAR_DEBUG_SWITCH (0) + +#define DPP_CAR_A_FLOW_ID_MAX (0x7fff) /*car A支持动态配置暂取32K, 后续待修改*/ +#define DPP_CAR_B_FLOW_ID_MAX (0xfff) +#define DPP_CAR_C_FLOW_ID_MAX (0x3ff) +#define DPP_CAR_A_FLOW_ID_NUM (0x8000) /*car A支持动态配置暂取32K, 后续待修改*/ +#define DPP_CAR_B_FLOW_ID_NUM (0x1000) +#define DPP_CAR_C_FLOW_ID_NUM (0x400) + +#define DPP_CAR_PROFILE_ID_TOTAL ((0x200 + 0x80 + 0x20) * DPP_CAR_ID_MAX) + +#define DPP_CAR_PKT_PROFILE_ID_MAX (0x200) /* 512 */ +#define DPP_CAR_A_PROFILE_ID_MAX (0x1ff) +#define DPP_CAR_B_PROFILE_ID_MAX (0x7f) +#define DPP_CAR_C_PROFILE_ID_MAX (0x1f) + +#define DPP_CAR_B_PROFILE_ID_RANDOM_MAX (0x1f) +#define DPP_CAR_C_PROFILE_ID_RANDOM_MAX (0x7) +#define DPP_CAR_RANDOM_OFFSET_VAL (7) + +#define DPP_CAR_MAX_CBS_VALUE ((1<<27) - 1) +#define DPP_CAR_MAX_EBS_VALUE ((1<<27) - 1) +#define DPP_CAR_MAX_CIR_VALUE ((1<<23) - 1) +#define DPP_CAR_MAX_EIR_VALUE ((1<<23) - 1) +#define DPP_CAR_MAX_PRI_VALUE ((1<<5) - 1) + +#define DPP_CAR_QUEUQ_CFG_TQ_LEN (64) +#define DPP_CAR_QUEUQ_CFG_TQ_HIGH_13BIT_POS (44) +#define DPP_CAR_QUEUQ_CFG_TQ_HIGH_13BIT_LEN (13) +#define DPP_CAR_QUEUQ_CFG_TQ_LOW_32BIT_POS (31) +#define DPP_CAR_QUEUQ_CFG_TQ_LOW_32BIT_LEN (32) + +#define DPP_CAR_PROFILE_CFG_ZXIC_UINT8 (28) +#define DPP_CAR_PROFILE_CFG_ZXIC_UINT32 (DPP_CAR_PROFILE_CFG_ZXIC_UINT8>>2) +#define DPP_CAR_PROFILE_CFG_WIDTH (DPP_CAR_PROFILE_CFG_ZXIC_UINT8<<3) + +#define DPP_CAR_QUEUE_CFG_ZXIC_UINT8 (4) +#define DPP_CAR_QUEUE_CFG_WIDTH (DPP_CAR_QUEUE_CFG_ZXIC_UINT8<<3) + +#define DPP_CAR_PROFILE_CFG_CAR_TYPE_POS (1) +#define DPP_CAR_PROFILE_CFG_CAR_TYPE_LEN (2) +#define DPP_CAR_PROFILE_CFG_PKT_SIGN_POS (2) +#define DPP_CAR_PROFILE_CFG_PKT_SIGN_LEN (1) +#define DPP_CAR_PROFILE_CFG_CD_POS (4) +#define DPP_CAR_PROFILE_CFG_CD_LEN (2) +#define DPP_CAR_PROFILE_CFG_CF_POS (5) +#define DPP_CAR_PROFILE_CFG_CF_LEN (1) +#define DPP_CAR_PROFILE_CFG_CM_POS (6) +#define DPP_CAR_PROFILE_CFG_CM_LEN (1) +#define DPP_CAR_PROFILE_CFG_EIR_POS (28) +#define DPP_CAR_PROFILE_CFG_EIR_LEN (22) +#define DPP_CAR_PROFILE_CFG_CIR_POS (50) +#define DPP_CAR_PROFILE_CFG_CIR_LEN (22) +#define DPP_CAR_PROFILE_CFG_EBS_POS (77) +#define DPP_CAR_PROFILE_CFG_EBS_LEN (27) +#define DPP_CAR_PROFILE_CFG_CBS_POS (104) +#define DPP_CAR_PROFILE_CFG_CBS_LEN (27) +#define DPP_CAR_PROFILE_CFG_C_PRI1_POS (139) +#define DPP_CAR_PROFILE_CFG_C_PRI1_LEN (5) +#define DPP_CAR_PROFILE_CFG_E_G_PRI1_POS (174) +#define DPP_CAR_PROFILE_CFG_E_G_PRI1_LEN (5) +#define DPP_CAR_PROFILE_CFG_E_Y_PRI0_POS (214) +#define DPP_CAR_PROFILE_CFG_E_Y_PRI0_LEN (5) + +#define DPP_CAR_PKT_PROFILE_CFG_CAR_TYPE_POS (1) +#define DPP_CAR_PKT_PROFILE_CFG_CAR_TYPE_LEN (2) +#define DPP_CAR_PKT_PROFILE_CFG_PKT_SIGN_POS (2) +#define DPP_CAR_PKT_PROFILE_CFG_PKT_SIGN_LEN (1) +#define DPP_CAR_PKT_PROFILE_CFG_CIR_POS (32) +#define DPP_CAR_PKT_PROFILE_CFG_CIR_LEN (30) +#define DPP_CAR_PKT_PROFILE_CFG_CBS_POS (46) +#define DPP_CAR_PKT_PROFILE_CFG_CBS_LEN (14) +#define DPP_CAR_PKT_PROFILE_CFG_C_PRI0_POS (86) +#define DPP_CAR_PKT_PROFILE_CFG_C_PRI0_LEN (5) + +#define DPP_CAR_QUEUE_CFG_CAR_TYPE_POS (1) +#define DPP_CAR_QUEUE_CFG_CAR_TYPE_LEN (2) +#define DPP_CAR_QUEUE_CFG_PKT_SIGN_POS (2) +#define DPP_CAR_QUEUE_CFG_PKT_SIGN_LEN (1) +#define DPP_CAR_QUEUE_CFG_QUEUE_ID_POS (16) +#define DPP_CAR_QUEUE_CFG_QUEUE_ID_LEN (14) + +/* car 算法模式 */ +typedef enum dpp_car_cd_mode_e +{ + CAR_CD_MODE_SRTCM = 0, + CAR_CD_MODE_TRTCM, + CAR_CD_MODE_MEF10_1, + CAR_CD_MODE_INVALID +}DPP_CAR_CD_MODE_E; + +/* car 读清模式*/ +typedef enum dpp_car_rd_mode_e +{ + CAR_READ_NOT_CLEAR = 0, + CAR_READ_AND_CLEAR = 1, +}DPP_CAR_RD_MODE_E; + +/* car 翻转模式 */ +typedef enum dpp_car_overflow_mode_e +{ + CAR_KEEP_COUNT = 0, + CAR_RE_COUNT = 1, +}DPP_CAR_OVERFLOW_MODE_E; + +/** QVOS翻转模式 */ +typedef enum dpp_car_qvos_mode_e +{ + CAR_QVOS_MODE_OVERFLOW_0 = 0, + CAR_QVOS_MODE_OVERFLOW_1 = 1, + CAR_QVOS_MODE_OVERFLOW_2 = 2, + CAR_QVOS_MODE_OVERFLOW_MAX +}DPP_CAR_QVOS_MODE_E; + +typedef enum dpp_car_en_mode_e +{ + DPP_CAR_EN_MODE_BOTH_EN = 0, + DPP_CAR_EN_MODE_A_EN = 1, + DPP_CAR_EN_MODE_A_B_EN = 2, + DPP_CAR_EN_MODE_INVALID +}DPP_CAR_EN_MODE_E; + +typedef enum dpp_car_cfg_operate_mode_e +{ + CAR_OPERATE_MODE_ADD = 0, + CAR_OPERATE_MODE_DEL = 1, + CAR_OPERATE_MODE_SRH = 2, + CAR_OPERATE_MODE_GET = 3, + CAR_OPERATE_MODE_MAX, +}DPP_CAR_CFG_OPERATE_MODE_E; + +typedef struct dpp_stat_car_dbg_cnt_t +{ + ZXIC_UINT32 pkt_input_total_cnt; + ZXIC_UINT32 pkt_input_green_cnt; + ZXIC_UINT32 pkt_input_yellow_cnt; + ZXIC_UINT32 pkt_input_red_cnt; + ZXIC_UINT32 pkt_output_total_cnt; + ZXIC_UINT32 pkt_output_green_cnt; + ZXIC_UINT32 pkt_output_yellow_cnt; + ZXIC_UINT32 pkt_output_red_cnt; + ZXIC_UINT32 pkt_fc_dbg_cnt; + ZXIC_UINT32 pkt_size_cnt; +}DPP_STAT_CAR_DBG_CNT_T; + +/** car 包监管模板参数设置的参数 */ +typedef struct dpp_stat_car_pkt_profile_cfg_t +{ + ZXIC_UINT32 profile_id; + ZXIC_UINT32 pkt_sign; + ZXIC_UINT32 cir; + ZXIC_UINT32 cbs; + ZXIC_UINT32 pri[DPP_CAR_PRI_MAX]; /**< @brief pri 0~7是有效值*/ +}DPP_STAT_CAR_PKT_PROFILE_CFG_T; + +/** car A包队列设置的参数 */ +typedef struct dpp_stat_car_a_pkt_queue_cfg_t +{ + ZXIC_UINT32 flow_id; + ZXIC_UINT32 drop_flag; + ZXIC_UINT32 plcr_en; + ZXIC_UINT32 profile_id; + ZXIC_UINT64 tq; + ZXIC_UINT64 dc; + ZXIC_UINT32 tc; +}DPP_STAT_CAR_A_PKT_QUEUE_CFG_T; + +/** car B 队列设置的参数 */ +typedef struct dpp_stat_car_b_queue_cfg_t +{ + ZXIC_UINT32 flow_id; + ZXIC_UINT32 drop_flag; + ZXIC_UINT32 plcr_en; + ZXIC_UINT32 profile_id; + ZXIC_UINT64 tq; + ZXIC_UINT32 tce_flag; + ZXIC_UINT32 tce; + ZXIC_UINT32 tc; + ZXIC_UINT32 te; +}DPP_STAT_CAR_B_QUEUE_CFG_T; + +/** car C 队列设置的参数 */ +typedef struct dpp_stat_car_c_queue_cfg_t +{ + ZXIC_UINT32 flow_id; + ZXIC_UINT32 drop_flag; + ZXIC_UINT32 plcr_en; + ZXIC_UINT32 profile_id; + ZXIC_UINT64 tq; + ZXIC_UINT32 tce_flag; + ZXIC_UINT32 tce; + ZXIC_UINT32 tc; + ZXIC_UINT32 te; +}DPP_STAT_CAR_C_QUEUE_CFG_T; + +/* profile配置键值 */ +typedef struct dpp_car_profile_rb_key_t +{ + /**carprofile: + car_type[2]+pkt_sign[1]+cd[2]+cf[1]+cm[1]+eir[22]+cir[22]+ebs[27]+cbs[27]+cpri[35]+e_g_pri[35]+e_y_pri[40]+0[9]*/ + /**carpktprofile: + car_type[2]+pkt_sign[1]+cir[30]+cbs[14]+c_pri[32]+0[115]*/ + ZXIC_UINT32 profile_cfg[DPP_CAR_PROFILE_CFG_ZXIC_UINT32]; + ZXIC_UINT32 is_static; /* 是否静态,静态的profile必须由用户手动删除,待实现 */ + ZXIC_UINT32 use_count; +}DPP_CAR_PROFILE_RB_KEY_T; + +/* profile id与profile 配置节点关系键值 */ +typedef struct dpp_car_profile_id_rb_key_t +{ + ZXIC_UINT32 profile_id; + void * p_car_node; + ZXIC_UINT32 is_used; +}DPP_CAR_PROFILE_ID_RB_KEY_T; + +/* 队列和profile id绑定关系键值 */ +typedef struct dpp_car_queue_rb_key_t +{ /** carqueue + car_type[2]+pkt_sign[1]+queue_id[14]+15[0]*/ + ZXIC_UINT8 profile_cfg[DPP_CAR_QUEUE_CFG_ZXIC_UINT8]; + ZXIC_UINT32 is_used; + ZXIC_UINT32 profile_id; +}DPP_CAR_QUEUE_RB_KEY_T; + +/* 红黑树管理 */ +typedef struct dpp_car_rb_mng_t +{ + ZXIC_UINT32 init_en; + ZXIC_UINT32 total_num; + ZXIC_UINT32 key_size; /** 单个红黑树节点空间的大小 */ + ZXIC_RB_CMPFUN p_cmpfun; + ZXIC_RB_CMPFUN p_id_cmpfun; + ZXIC_RB_CFG * p_plcr_rb; + ZXIC_RB_CFG * p_plcr_id_rb; /** 由id反查car的配置 的红黑树结构 */ + ZXIC_LISTSTACK_MANGER *p_liststack_mng; /** 索引分配 */ +}DPP_CAR_RB_MNG_T; + +/* profile管理 */ +typedef struct dpp_car_profile_mng_t +{ + ZXIC_UINT32 is_init; + DPP_CAR_RB_MNG_T *p_car_a_rb_profile_mng; + DPP_CAR_RB_MNG_T *p_car_b_rb_profile_mng; + DPP_CAR_RB_MNG_T *p_car_c_rb_profile_mng; +}DPP_CAR_PROFILE_MNG_T; + +/* 队列管理 */ +typedef struct dpp_car_queue_mng_t +{ + ZXIC_UINT32 is_init; + DPP_CAR_RB_MNG_T *p_car_rb_queue_mng; /** 不同的car*/ +}DPP_CAR_QUEUE_MNG_T; + +/* car配置信息 */ +typedef struct dpp_car_cfg_t +{ + ZXIC_UINT32 is_init[DPP_DEV_CHANNEL_MAX]; + ZXIC_UINT32 car0_mono_mode[DPP_DEV_CHANNEL_MAX]; + DPP_CAR_QUEUE_MNG_T * p_car_queue_mng[DPP_DEV_CHANNEL_MAX]; + DPP_CAR_PROFILE_MNG_T * p_car_profile_mng[DPP_DEV_CHANNEL_MAX]; +}DPP_CAR_CFG_T; + +/* car软复位需要存储的参数 */ +typedef struct dpp_car_soft_reset_item_t +{ + ZXIC_UINT32 flow_id; + ZXIC_UINT32 profile_id; +}DPP_CAR_SOFT_RESET_ITEM_T; + +typedef struct dpp_car_soft_reset_data_t +{ + ZXIC_UINT8 car_pkt_sign[DPP_CAR_PKT_PROFILE_ID_MAX]; /* */ + + ZXIC_UINT32 is_init; /* car是否初始化标志位 */ + ZXIC_UINT32 car0_pkt_num; /* */ + + ZXIC_UINT32 cara_flow_num; /* car0已配置过的流ID数目 */ + ZXIC_UINT32 carb_flow_num; /* car0已配置过的流ID数目 */ + ZXIC_UINT32 carc_flow_num; /* car0已配置过的流ID数目 */ + + DPP_CAR_SOFT_RESET_ITEM_T cara_item[DPP_CAR_A_FLOW_ID_NUM]; + DPP_CAR_SOFT_RESET_ITEM_T carb_item[DPP_CAR_B_FLOW_ID_NUM]; + DPP_CAR_SOFT_RESET_ITEM_T carc_item[DPP_CAR_C_FLOW_ID_NUM]; + +}DPP_CAR_SOFT_RESET_DATA_T; + +typedef struct dpp_car_random_ram_t +{ + ZXIC_UINT32 p1; /* 第一档丢弃概率(百分比),取值0-100,推荐为1(百分比) */ + ZXIC_UINT32 p2; /* 第二档丢弃概率(百分比),取值0-100,推荐为10(百分比) */ + ZXIC_UINT32 p3; /* 第三档丢弃概率(百分比),取值0-100,推荐为50(百分比) */ + ZXIC_UINT32 tc; /* 桶深,即CBS或EBS */ + ZXIC_UINT32 t1; /* 桶深的低水线,取值0-CBS/EBS,推荐是70%的桶深 */ + ZXIC_UINT32 t2; /* 桶深的中水线,取值0-CBS/EBS,推荐是85%的桶深 */ + ZXIC_UINT32 t3; /* 桶深的高水线,取值0-CBS/EBS,推荐是95%的桶深 */ +}DPP_CAR_RANDOM_RAM_T; + +typedef struct dpp_car_soft_reset_queue_t +{ + ZXIC_UINT32 car_type; + ZXIC_UINT32 flow_id; + ZXIC_UINT32 drop_flag; + ZXIC_UINT32 plcr_en; + ZXIC_UINT32 profile_id; + +}DPP_CAR_SOFT_RESET_QUEUE_T; + +/***********************************************************/ +/** car A包限速监管模板设定 +* @param dev_id 设备号 car号 +* @param profile_id 监管模板号 +* @param p_cara_profile_cfg 监管模板配置 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/05 +************************************************************/ +DPP_STATUS dpp_stat_cara_pkt_profile_cfg_set(DPP_DEV_T *dev, + ZXIC_UINT32 profile_id, + DPP_STAT_CAR_PKT_PROFILE_CFG_T* p_cara_profile_cfg); + +/***********************************************************/ +/** 获取car A 包长监管流配置 +* @param dev_id 设备号 car号 +* @param flow_id 流号 +* @param p_cara_queue_cfg car A流配置信息 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/05 +************************************************************/ +DPP_STATUS dpp_stat_cara_pkt_queue_cfg_get(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + DPP_STAT_CAR_A_PKT_QUEUE_CFG_T* p_cara_queue_cfg); + +/***********************************************************/ +/** 配置car B 概率丢弃配置参数 +* @param dev_id +* @param profile_id +* @param p_random_ram +* +* @return +* @remark 无 +* @see +* @author YXH @date 2019/04/01 +************************************************************/ +DPP_STATUS dpp_stat_carb_random_ram_set(DPP_DEV_T *dev, + ZXIC_UINT32 profile_id, + DPP_CAR_RANDOM_RAM_T *p_random_ram_e, + DPP_CAR_RANDOM_RAM_T *p_random_ram_c); + +/***********************************************************/ +/** 获取car B 概率丢弃配置参数 +* @param dev_id +* @param profile_id +* @param p_random_ram +* +* @return +* @remark 无 +* @see +* @author YXH @date 2019/04/01 +************************************************************/ +DPP_STATUS dpp_stat_carb_random_ram_get(DPP_DEV_T *dev, + ZXIC_UINT32 profile_id, + DPP_CAR_RANDOM_RAM_T *p_random_ram_e, + DPP_CAR_RANDOM_RAM_T *p_random_ram_c); + +/***********************************************************/ +/** 配置car C 概率丢弃配置参数 +* @param dev_id +* @param profile_id +* @param p_random_ram +* +* @return +* @remark 无 +* @see +* @author YXH @date 2019/04/01 +************************************************************/ +DPP_STATUS dpp_stat_carc_random_ram_set(DPP_DEV_T *dev, + ZXIC_UINT32 profile_id, + DPP_CAR_RANDOM_RAM_T *p_random_ram_e, + DPP_CAR_RANDOM_RAM_T *p_random_ram_c); + +/***********************************************************/ +/** 获取car B 概率丢弃配置参数 +* @param dev_id +* @param profile_id +* @param p_random_ram +* +* @return +* @remark 无 +* @see +* @author YXH @date 2019/04/01 +************************************************************/ +DPP_STATUS dpp_stat_carc_random_ram_get(DPP_DEV_T *dev, + ZXIC_UINT32 profile_id, + DPP_CAR_RANDOM_RAM_T *p_random_ram_e, + DPP_CAR_RANDOM_RAM_T *p_random_ram_c); + +/***********************************************************/ +/** 获取car的包长偏移 +* @param dev_id +* @param p_pkt_size_off +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author wll @date 2019/06/06 +************************************************************/ +DPP_STATUS dpp_stat_car_pkt_size_offset_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_pkt_size_off); + +/***********************************************************/ +/** 配置cara的最大包长 +* @param dev_id +* @param max_pkt_size +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author wll @date 2019/06/06 +************************************************************/ +DPP_STATUS dpp_stat_cara_max_pkt_size_set(DPP_DEV_T *dev, + ZXIC_UINT32 max_pkt_size); + +/***********************************************************/ +/** 获取cara的最大包长 +* @param dev_id +* @param p_max_pkt_size +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author wll @date 2019/06/06 +************************************************************/ +DPP_STATUS dpp_stat_cara_max_pkt_size_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_max_pkt_size); + +/***********************************************************/ +/** 配置carb的最大包长 +* @param dev_id +* @param max_pkt_size +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author wll @date 2019/06/06 +************************************************************/ +DPP_STATUS dpp_stat_carb_max_pkt_size_set(DPP_DEV_T *dev, + ZXIC_UINT32 max_pkt_size); + +/***********************************************************/ +/** 获取carb的最大包长 +* @param dev_id +* @param p_max_pkt_size +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author wll @date 2019/06/06 +************************************************************/ +DPP_STATUS dpp_stat_carb_max_pkt_size_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_max_pkt_size); + +/***********************************************************/ +/** 配置carc的最大包长 +* @param dev_id +* @param max_pkt_size +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author wll @date 2019/06/06 +************************************************************/ +DPP_STATUS dpp_stat_carc_max_pkt_size_set(DPP_DEV_T *dev, + ZXIC_UINT32 max_pkt_size); + +/***********************************************************/ +/** 获取carc的最大包长 +* @param dev_id +* @param p_max_pkt_size +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author wll @date 2019/06/06 +************************************************************/ +DPP_STATUS dpp_stat_carc_max_pkt_size_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_max_pkt_size); + +/***********************************************************/ +/** 获取最大包长 +* @param dev_id +* @param car_type +* @param p_max_pkt_len +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author wll @date 2019/06/06 +************************************************************/ +DPP_STATUS dpp_stat_car_max_pkt_size_get(DPP_DEV_T *dev, + ZXIC_UINT32 car_type, + ZXIC_UINT32 *p_max_pkt_len); + +/***********************************************************/ +/** 配置car的包长偏移 +* @param dev_id +* @param pkt_size_off +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author wll @date 2019/06/06 +************************************************************/ +DPP_STATUS dpp_stat_car_pkt_size_offset_set(DPP_DEV_T *dev, + ZXIC_UINT32 pkt_size_off); + +/***********************************************************/ +/** 配置最大包长 +* @param dev_id +* @param car_type +* @param max_pkt_size +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author wll @date 2019/06/06 +************************************************************/ +DPP_STATUS dpp_stat_car_max_pkt_size_set(DPP_DEV_T *dev, + ZXIC_UINT32 car_type, + ZXIC_UINT32 max_pkt_size); + +/***********************************************************/ +/** car 模块流配置 +* @param dev_id +* @param car_type +* @param flow_id +* @param drop_flag +* @param plcr_en +* @param profile_id +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/05/06 +************************************************************/ +DPP_STATUS dpp_stat_car_queue_cfg_set(DPP_DEV_T *dev, + ZXIC_UINT32 car_type, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 drop_flag, + ZXIC_UINT32 plcr_en, + ZXIC_UINT32 profile_id); + +/***********************************************************/ +/** car profile硬件写入 +* @param dev_id +* @param car_type +* @param pkt_sign +* @param profile_id +* @param p_car_profile_cfg +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/05/06 +************************************************************/ +DPP_STATUS dpp_stat_car_profile_cfg_set(DPP_DEV_T *dev, + ZXIC_UINT32 car_type, + ZXIC_UINT32 pkt_sign, + ZXIC_UINT32 profile_id, + ZXIC_VOID* p_car_profile_cfg); + +/***********************************************************/ +/** car 队列映射关系配置 +* @param dev_id 设备号 0:上行CAR限速 1:下行CAR限速 +* @param car_type 0:A级car,1:B级car,2:C级car +* @param flow_id 流号 +* @param map_flow_id 映射后的流号 +* @param map_sp 映射后的优先级 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/09/27 +************************************************************/ +DPP_STATUS dpp_stat_car_queue_map_set(DPP_DEV_T *dev, + ZXIC_UINT32 car_type, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 map_flow_id, + ZXIC_UINT32 map_sp); + +/***********************************************************/ +/** +* @param dev_id +* @param car_type +* @param pkt_sign +* @param flow_id +* @param p_data +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/09/27 +************************************************************/ +DPP_STATUS dpp_stat_car_queue_get(DPP_DEV_T *dev, + ZXIC_UINT32 car_type, + ZXIC_UINT32 pkt_sign, + ZXIC_UINT32 flow_id, + ZXIC_VOID* p_data); +/***********************************************************/ +/** car 模块流配置获取 +* @param dev_id +* @param car_type +* @param flow_id +* @param p_drop_flag +* @param p_plcr_en +* @param p_profile_id +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/08/19 +************************************************************/ +DPP_STATUS dpp_stat_car_queue_cfg_get(DPP_DEV_T *dev, + ZXIC_UINT32 car_type, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 *p_drop_flag, + ZXIC_UINT32 *p_plcr_en, + ZXIC_UINT32 *p_profile_id); + +DPP_STATUS dpp_stat_car_profile_cfg_get(DPP_DEV_T *dev, + ZXIC_UINT32 car_type, + ZXIC_UINT32 pkt_sign, + ZXIC_UINT32 profile_id, + ZXIC_VOID* p_car_profile_cfg); + +/***********************************************************/ +/** +* @param dev_id 设备ID car ID +* @param profile_id 模板ID +* @param p_random_ram_e E桶概率丢弃配置参数 +* @param p_random_ram_c C桶概率丢弃配置参数 +* +* @return +* @remark 无 +* @see +* @author YXH @date 2019/04/01 +************************************************************/ +DPP_STATUS dpp_stat_car_random_ram_set(DPP_DEV_T *dev, + ZXIC_UINT32 car_type, + ZXIC_UINT32 profile_id, + DPP_CAR_RANDOM_RAM_T *p_random_ram_e, + DPP_CAR_RANDOM_RAM_T *p_random_ram_c); + +/***********************************************************/ +/** +* @param dev_id 设备ID car ID +* @param profile_id 模板ID +* @param p_random_ram_e E桶概率丢弃配置参数 +* @param p_random_ram_c C桶概率丢弃配置参数 +* +* @return +* @remark 无 +* @see +* @author YXH @date 2019/04/01 +************************************************************/ +DPP_STATUS dpp_stat_car_random_ram_get(DPP_DEV_T *dev, + ZXIC_UINT32 car_type, + ZXIC_UINT32 profile_id, + DPP_CAR_RANDOM_RAM_T *p_random_ram_e, + DPP_CAR_RANDOM_RAM_T *p_random_ram_c); + +/***********************************************************/ +/** 获取 car 流号的绑定关系 +* @param dev_id +* @param car_type +* @param flow_id +* @param p_map_flow_id +* @param p_map_sp +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/09/27 +************************************************************/ +DPP_STATUS dpp_stat_car_queue_map_get(DPP_DEV_T *dev, + ZXIC_UINT32 car_type, + ZXIC_UINT32 flow_id, + ZXIC_UINT32* p_map_flow_id, + ZXIC_UINT32* p_map_sp); + +/***********************************************************/ +/** car 模块调试计数 获取 +* @param dev_id +* @param car_type +* @param p_car_dbg_cnt +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/09/27 +************************************************************/ +DPP_STATUS dpp_stat_car_dbg_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 car_type, + DPP_STAT_CAR_DBG_CNT_T *p_car_dbg_cnt); +/***********************************************************/ +/** +* @param dev_id +* @param car_type +* @param overflow_mode +* @param rd_mode +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/09/27 +************************************************************/ +DPP_STATUS dpp_stat_car_dbg_cnt_mode_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 car_type, + ZXIC_UINT32 overflow_mode, + ZXIC_UINT32 rd_mode); +/***********************************************************/ +/** +* @param dev_id +* @param car_type +* @param p_overflow_mode +* @param p_rd_mode +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/09/27 +************************************************************/ +DPP_STATUS dpp_stat_car_dbg_cnt_mode_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 car_type, + ZXIC_UINT32* p_overflow_mode, + ZXIC_UINT32* p_rd_mode); + +/***********************************************************/ +/** car 模块初始化 +* @param dev_id +* @param p_car_cfg +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/05/05 +************************************************************/ +DPP_STATUS dpp_stat_car_init(ZXIC_UINT32 dev_id, + DPP_CAR_CFG_T *p_car_cfg); + + +/***********************************************************/ +/** STAT CAR复位获取全局变量大小函数 +* @param dev_id +* @param p_size +* +* @return +* @remark 无 +* @see +* @author yxh @date 2018/06/26 +************************************************************/ +DPP_STATUS dpp_stat_car_glb_size_get(DPP_DEV_T *dev, ZXIC_UINT32* p_size); + +/***********************************************************/ +/** STAT CAR复位设置全局变量函数 +* @param dev_id 设备号 +* @param size 大小,字节数 +* @param p_data_buff 全局变量数据 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author yxh @date 2018/06/26 +************************************************************/ +DPP_STATUS dpp_stat_car_glb_mgr_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 size, ZXIC_UINT8 *p_data_buff); + +/***********************************************************/ +/** STAT CAR复位获取全局变量函数 +* @param dev_id 设备号 +* @param p_flag 释放使能,1-需要手动free,0-不需要手动free +* @param p_size 数据大小 +* @param pp_data_buff 全局变量数据 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author yxh @date 2018/06/26 +************************************************************/ +DPP_STATUS dpp_stat_car_glb_mgr_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_flag, + ZXIC_UINT32 *p_size, + ZXIC_UINT8 **pp_data_buff); + +DPP_STATUS dpp_stat_queue_rb_root_prt(ZXIC_RB_CFG *p_rb_cfg); +DPP_STATUS dpp_stat_car_profile_id_rb_root_prt(ZXIC_UINT32 dev_id, ZXIC_RB_CFG *p_rb_cfg); + +/***********************************************************/ +/** 配置car A的qvos溢出模式 +* @param dev_id 设备号 car编号 +* @param flow_id 流号 +* @param qvos_mode 溢出模式,参见DPP_CAR_QVOS_MODE_E +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_cara_queue_qvos_set(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 qvos_mode); + +/***********************************************************/ +/** 获取car A的qvos溢出模式 +* @param dev_id 设备号 car编号 +* @param flow_id 流号 +* @param p_qvos_mode qvos溢出模式 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_cara_queue_qvos_get(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 *p_qvos_mode); + +/***********************************************************/ +/** car A指定队列模式配置,仅用于调试 +* @param dev_id 设备号 car编号 +* @param global_en 全局队列使能,0-不使能,1-使能 +* @param sp_en 优先级队列使能,0-不使能,1-使能 +* @param appoint_sp 指定的优先级 +* @param appoint_queue 指定的队列号 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_cara_queue_appoint_mode_set(DPP_DEV_T *dev, + ZXIC_UINT32 global_en, + ZXIC_UINT32 sp_en, + ZXIC_UINT32 appoint_sp, + ZXIC_UINT32 appoint_queue); + +/***********************************************************/ +/** 获取car A指定队列模式的配置 +* @param dev_id 设备号 car编号 +* @param p_global_en 全局队列使能,0-不使能,1-使能 +* @param p_sp_en 优先级队列使能,0-不使能,1-使能 +* @param p_appoint_sp 指定的优先级 +* @param p_appoint_queue 指定的队列号 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/07 +************************************************************/ +DPP_STATUS dpp_stat_cara_queue_appoint_mode_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_global_en, + ZXIC_UINT32 *p_sp_en, + ZXIC_UINT32 *p_appoint_sp, + ZXIC_UINT32 *p_appoint_queue); + +/***********************************************************/ +/** 配置car B的qvos溢出模式 +* @param dev_id 设备号 car编号 +* @param flow_id 流号 +* @param qvos_mode 溢出模式,参见DPP_CAR_QVOS_MODE_E +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_carb_queue_qvos_set(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 qvos_mode); + +/***********************************************************/ +/** 获取car B的qvos溢出模式 +* @param dev_id 设备号 car编号 +* @param flow_id 流号 +* @param p_qvos_mode qvos溢出模式 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_carb_queue_qvos_get(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 *p_qvos_mode); + +/***********************************************************/ +/** car B指定队列模式配置,仅用于调试 +* @param dev_id 设备号 car编号 +* @param global_en 全局队列使能,0-不使能,1-使能 +* @param sp_en 优先级队列使能,0-不使能,1-使能 +* @param appoint_sp 指定的优先级 +* @param appoint_queue 指定的队列号 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_carb_queue_appoint_mode_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 global_en, + ZXIC_UINT32 sp_en, + ZXIC_UINT32 appoint_sp, + ZXIC_UINT32 appoint_queue); +/***********************************************************/ +/** 获取car B指定队列模式的配置 +* @param dev_id 设备号 car编号 +* @param p_global_en 全局队列使能,0-不使能,1-使能 +* @param p_sp_en 优先级队列使能,0-不使能,1-使能 +* @param p_appoint_sp 指定的优先级 +* @param p_appoint_queue 指定的队列号 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/07 +************************************************************/ +DPP_STATUS dpp_stat_carb_queue_appoint_mode_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_global_en, + ZXIC_UINT32 *p_sp_en, + ZXIC_UINT32 *p_appoint_sp, + ZXIC_UINT32 *p_appoint_queue); + +/***********************************************************/ +/** 配置car C的qvos溢出模式 +* @param dev_id 设备号 car编号 +* @param flow_id 流号 +* @param qvos_mode 溢出模式,参见DPP_CAR_QVOS_MODE_E +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_carc_queue_qvos_set(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 qvos_mode); + +/***********************************************************/ +/** 获取car C的qvos溢出模式 +* @param dev_id 设备号 car编号 +* @param flow_id 流号 +* @param p_qvos_mode qvos溢出模式 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_carc_queue_qvos_get(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 *p_qvos_mode); + +/***********************************************************/ +/** car C指定队列模式配置,仅用于调试 +* @param dev_id 设备号 car编号 +* @param global_en 全局队列使能,0-不使能,1-使能 +* @param sp_en 优先级队列使能,0-不使能,1-使能 +* @param appoint_sp 指定的优先级 +* @param appoint_queue 指定的队列号 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_carc_queue_appoint_mode_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 global_en, + ZXIC_UINT32 sp_en, + ZXIC_UINT32 appoint_sp, + ZXIC_UINT32 appoint_queue); + +/***********************************************************/ +/** 获取car C指定队列模式的配置 +* @param dev_id 设备号 car编号 +* @param p_global_en 全局队列使能,0-不使能,1-使能 +* @param p_sp_en 优先级队列使能,0-不使能,1-使能 +* @param p_appoint_sp 指定的优先级 +* @param p_appoint_queue 指定的队列号 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/07 +************************************************************/ +DPP_STATUS dpp_stat_carc_queue_appoint_mode_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_global_en, + ZXIC_UINT32 *p_sp_en, + ZXIC_UINT32 *p_appoint_sp, + ZXIC_UINT32 *p_appoint_queue); + +/***********************************************************/ +/** +* @param dev_id +* @param p_mode +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/09/28 +************************************************************/ +DPP_STATUS dpp_stat_car_en_mode_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_mode); + +#ifdef __cplusplus +} +#endif + +#endif + + + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/se/dpp_stat_cfg.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/se/dpp_stat_cfg.h new file mode 100755 index 0000000..bd4a1cf --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/se/dpp_stat_cfg.h @@ -0,0 +1,196 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_stat_cfg.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : ls +* 完成日期 : 2016/03/29 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ +#ifndef _DPP_STAT_CFG_H_ +#define _DPP_STAT_CFG_H_ + +#ifdef __cplusplus +extern "C" { +#endif +#include "dpp_stat_api.h" + +#if ZXIC_REAL("Variable definition") + +#define DPP_STAT_TM_PORT_MAX (4) +#define DPP_STAT_ETM_ADDR_MAX (9*1024) +#define DPP_STAT_FTM_ADDR_MAX (2048) +#define DPP_STAT_IND_WR_MODE (0) +#define DPP_STAT_IND_RD_MODE (1) +#define DPP_STAT_TM_MOV_PERIOD_MAX (0xff) + +#define DPP_STAT_WIDTH_3_MAX_VALUE ((1<<3) - 1) +#define DPP_STAT_WIDTH_4_MAX_VALUE ((1<<4) - 1) +#define DPP_STAT_PPU_ERAM_DEPTH_MAX (0x7ffff) +#define DPP_STAT_PPU_ERAM_BADDR_MAX (0x7ffff) +#define DPP_STAT_PPU_DDR_BADDR_MAX (0x4ffffff) + +#define DPP_STAT_OAM_ERAM_BADDR_MAX (0x7ffff) +#define DPP_STAT_OAM_DDR_BADDR_MAX (0x4ffffff) + +#define DPP_STAT_PLCR_ERAM_BADDR_MAX (0x7ffff) +#define DPP_STAT_PLCR_ID (0) + +#define DPP_STAT_TM_FLAG_FTM_PKT_EN (0) +#define DPP_STAT_TM_FLAG_ETM_PKT_EN (1) +#define DPP_STAT_TM_FLAG_ERAM_EN (2) + +#define DPP_STAT_PPU_STAT_CHANNEL_NUM (16) +#define DPP_STAT_PPU_MEX_NUM (6) +#define CMMU_DDR_DIR_CPY_NUM (15) + + +/** stat TM类型 */ +typedef enum dpp_stat_tm_type_e +{ + DPP_STAT_TM_TYPE_ETM = 0, /*<@brief FTM模式 */ + DPP_STAT_TM_TYPE_FTM = 1, /*<@brief ETM模式 */ + DPP_STAT_TM_TYPE_MAX +}DPP_STAT_TM_TYPE_E; + + +typedef enum dpp_stat_tm_store_mode_e +{ + DPP_STAT_TM_STORE_MODE_ERAM = 0, /* 片内存储模式 */ + DPP_STAT_TM_STORE_MODE_MIX = 1, /* 混合存储模式 */ + DPP_STAT_TM_STORE_MODE_MAX, +}DPP_STAT_TM_STORE_MODE_E; + +typedef enum dpp_stat_etm_depth_mode_e +{ + DPP_STAT_ETM_DEPTH_ERAM_1K = 0, + DPP_STAT_ETM_DEPTH_ERAM_4K = 1, + DPP_STAT_ETM_DEPTH_ERAM_5K = 2, + DPP_STAT_ETM_DEPTH_ERAM_8K = 3, + DPP_STAT_ETM_DEPTH_ERAM_9K = 4, + DPP_STAT_ETM_DEPTH_MIX_2K = 5, + DPP_STAT_ETM_DEPTH_MIX_8K = 6, + DPP_STAT_ETM_DEPTH_MIX_9K = 7, + DPP_STAT_ETM_DEPTH_MAX, +}DPP_STAT_ETM_DEPTH_MODE_E; + +typedef enum stat_store_mode_e +{ + STAT_STORE_MODE_IN_ERAM = 0, + STAT_STORE_MODE_IN_DDR = 1, + STAT_STORE_MODE_MAX, +}STAT_STORE_MODE_E; + +typedef enum stat_oam_type_e +{ + STAT_OAM_TYPE_ERAM = 0, + STAT_OAM_TYPE_LM_ERAM = 1, + STAT_OAM_TYPE_DDR = 2, + STAT_OAM_TYPE_MAX, +}STAT_OAM_TYPE_E; + +typedef struct dpp_stat_dbg_cnt_t +{ + ZXIC_UINT32 stat_to_smmu0_rsp_fc_cnt[DPP_STAT_PPU_STAT_CHANNEL_NUM]; + ZXIC_UINT32 stat_rcv_smmu0_req_fc_cnt[DPP_STAT_PPU_STAT_CHANNEL_NUM]; + ZXIC_UINT32 stat_to_ppu_req_fc_cnt[DPP_STAT_PPU_MEX_NUM]; + ZXIC_UINT32 stat_rcv_ppu_rsp_fc_cnt[DPP_STAT_PPU_MEX_NUM]; + ZXIC_UINT32 stat_rcv_se_etm_wr_fc_cnt; + ZXIC_UINT32 stat_rcv_se_etm_rd_fc_cnt; + ZXIC_UINT32 stat_rcv_se_ftm_wr_fc_cnt; + ZXIC_UINT32 stat_rcv_se_ftm_rd_fc_cnt; + ZXIC_UINT32 stat_to_etm_deq_fc_cnt; + ZXIC_UINT32 stat_to_etm_enq_fc_cnt; + ZXIC_UINT32 stat_to_ftm_deq_fc_cnt; + ZXIC_UINT32 stat_to_ftm_enq_fc_cnt; + ZXIC_UINT32 stat_to_oam_lm_fc_cnt; + ZXIC_UINT32 stat_rcv_oam_lm_fc_cnt; + ZXIC_UINT32 stat_to_oam_fc_cnt; + ZXIC_UINT32 stat_rcv_cmmu_fc_cnt; + ZXIC_UINT32 stat_to_cmmu_req_cnt; + ZXIC_UINT32 stat_rcv_smmu0_rsp_cnt[DPP_STAT_PPU_STAT_CHANNEL_NUM]; + ZXIC_UINT32 stat_to_smmu0_req_cnt[DPP_STAT_PPU_STAT_CHANNEL_NUM]; + ZXIC_UINT32 stat_plcr_rcv_smmu0_rsp1_cnt; + ZXIC_UINT32 stat_plcr_rcv_smmu0_rsp0_cnt; + ZXIC_UINT32 stat_plcr_to_smmu0_req1_cnt; + ZXIC_UINT32 stat_plcr_to_smmu0_req0_cnt; + ZXIC_UINT32 stat_to_ppu_mex_rsp_cnt[DPP_STAT_PPU_MEX_NUM]; + ZXIC_UINT32 stat_oam_lm_rsp_cnt; + ZXIC_UINT32 stat_rcv_oam_lm_req_cnt; + ZXIC_UINT32 stat_rcv_oam_req_cnt; + ZXIC_UINT32 stat_rcv_ppu_mex_key_cnt[DPP_STAT_PPU_MEX_NUM]; + ZXIC_UINT32 stat_rcv_se_etm_rsp_cnt; + ZXIC_UINT32 stat_rcv_etm_se_wr_req_cnt; + ZXIC_UINT32 stat_rcv_etm_se_rd_req_cnt; + ZXIC_UINT32 stat_rcv_se_ftm_rsp_cnt; + ZXIC_UINT32 stat_to_ftm_se_wr_req_cnt; + ZXIC_UINT32 stat_to_ftm_se_rd_req_cnt; + ZXIC_UINT32 stat_rcv_ftm_smmu0_req_cnt0; + ZXIC_UINT32 stat_rcv_ftm_smmu0_req_cnt1; + ZXIC_UINT32 stat_rcv_etm_smmu0_req_cnt0; + ZXIC_UINT32 stat_rcv_etm_smmu0_req_cnt1; + ZXIC_UINT32 ppu_no_exist_opcd_ex_cnt[DPP_STAT_PPU_MEX_NUM]; + ZXIC_UINT32 stat_rcv_tm_eram_cpu_rsp_cnt; + ZXIC_UINT32 cpu_rd_eram_req_cnt; + ZXIC_UINT32 cpu_wr_eram_req_cnt; + ZXIC_UINT32 tm_stat_ddr_cpu_rsp_cnt; + ZXIC_UINT32 cpu_rd_ddr_req_cnt; + ZXIC_UINT32 cpu_wr_ddr_req_cnt; +}DPP_STAT_DBG_CNT_T; + +#endif + +/***********************************************************/ +/** 获取ppu统计片内深度 +* @param dev_id 设备号 +* @param p_ppu_eram_depth ppu统计片内深度 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/03/31 +************************************************************/ +DPP_STATUS dpp_stat_ppu_eram_depth_get(DPP_DEV_T *dev, + ZXIC_UINT32* p_ppu_eram_depth); + + +/***********************************************************/ +/** 获取ppu统计 ERAM基地址 +* @param dev_id 设备号 +* @param p_ppu_eram_baddr ppu统计片内基地址 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/03/31 +************************************************************/ +DPP_STATUS dpp_stat_ppu_eram_baddr_get(DPP_DEV_T *dev, + ZXIC_UINT32* p_ppu_eram_baddr); + +/***********************************************************/ +/** 获取ppu统计 ddr基地址 +* @param dev_id 设备号 +* @param p_ppu_ddr_baddr ppu统计片外基地址 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/03/31 +************************************************************/ +DPP_STATUS dpp_stat_ppu_ddr_baddr_get(DPP_DEV_T *dev, + ZXIC_UINT32* p_ppu_ddr_baddr); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/sdt/dpp_sdt.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/sdt/dpp_sdt.h new file mode 100755 index 0000000..4bfd745 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/sdt/dpp_sdt.h @@ -0,0 +1,164 @@ +/********************************************************************* +* 版权所有 (C)2013, 深圳市中兴通讯股份有限公司。 +* +* 文件名称: +* 文件标识: +* 内容摘要: +* 其它说明: +* +* +* 当前版本: +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT : 100% +* 作 者: 王春雷10111187 +* 完成日期: 2013-9-2 +********************************************************************/ + +#ifndef _DPP_SDT_H_ +#define _DPP_SDT_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "dpp_ppu.h" + +/** SDT属性表高32bit中各比特字段的位宽定义*/ +#define DPP_SDT_H_TBL_TYPE_BT_POS (29) +#define DPP_SDT_H_TBL_TYPE_BT_LEN (3) + +#define DPP_SDT_H_ERAM_MODE_BT_POS (26) +#define DPP_SDT_H_ERAM_MODE_BT_LEN (3) +#define DPP_SDT_H_ERAM_BASE_ADDR_BT_POS (7) +#define DPP_SDT_H_ERAM_BASE_ADDR_BT_LEN (19) +#define DPP_SDT_L_ERAM_TABLE_DEPTH_BT_POS (1) +#define DPP_SDT_L_ERAM_TABLE_DEPTH_BT_LEN (22) + +#define DPP_SDT_H_DDR3_BASE_ADDR_BT_POS (9) +#define DPP_SDT_H_DDR3_BASE_ADDR_BT_LEN (20) +#define DPP_SDT_H_DDR3_SHARE_TYPE_BT_POS (7) +#define DPP_SDT_H_DDR3_SHARE_TYPE_BT_LEN (2) +#define DPP_SDT_H_DDR3_RW_LEN_BT_POS (5) +#define DPP_SDT_H_DDR3_RW_LEN_BT_LEN (2) +#define DPP_SDT_H_DDR3_SDT_NUM_BT_POS (0) +#define DPP_SDT_H_DDR3_SDT_NUM_BT_LEN (5) +#define DPP_SDT_L_DDR3_SDT_NUM_BT_POS (29) +#define DPP_SDT_L_DDR3_SDT_NUM_BT_LEN (3) +#define DPP_SDT_L_DDR3_ECC_EN_BT_POS (28) +#define DPP_SDT_L_DDR3_ECC_EN_BT_LEN (1) + +#define DPP_SDT_H_HASH_ID_BT_POS (27) +#define DPP_SDT_H_HASH_ID_BT_LEN (2) +#define DPP_SDT_H_HASH_TABLE_WIDTH_BT_POS (25) +#define DPP_SDT_H_HASH_TABLE_WIDTH_BT_LEN (2) +#define DPP_SDT_H_HASH_KEY_SIZE_BT_POS (19) +#define DPP_SDT_H_HASH_KEY_SIZE_BT_LEN (6) +#define DPP_SDT_H_HASH_TABLE_ID_BT_POS (14) +#define DPP_SDT_H_HASH_TABLE_ID_BT_LEN (5) +#define DPP_SDT_H_LEARN_EN_BT_POS (13) +#define DPP_SDT_H_LEARN_EN_BT_LEN (1) +#define DPP_SDT_H_KEEP_ALIVE_BT_POS (12) +#define DPP_SDT_H_KEEP_ALIVE_BT_LEN (1) +#define DPP_SDT_H_KEEP_ALIVE_BADDR_BT_POS (0) +#define DPP_SDT_H_KEEP_ALIVE_BADDR_BT_LEN (12) +#define DPP_SDT_L_KEEP_ALIVE_BADDR_BT_POS (25) +#define DPP_SDT_L_KEEP_ALIVE_BADDR_BT_LEN (7) +#define DPP_SDT_L_RSP_MODE_BT_POS (23) +#define DPP_SDT_L_RSP_MODE_BT_LEN (2) + +#define DPP_SDT_H_LPM_V46ID_BT_POS (28) +#define DPP_SDT_H_LPM_V46ID_BT_LEN (1) +#define DPP_SDT_H_LPM_RSP_MODE_BT_POS (0) +#define DPP_SDT_H_LPM_RSP_MODE_BT_LEN (2) +#define DPP_SDT_L_LPM_TABLE_DEPTH_BT_POS (1) +#define DPP_SDT_L_LPM_TABLE_DEPTH_BT_LEN (30) + +#define DPP_SDT_H_ETCAM_ID_BT_POS (27) +#define DPP_SDT_H_ETCAM_ID_BT_LEN (1) +#define DPP_SDT_H_ETCAM_KEY_MODE_BT_POS (25) +#define DPP_SDT_H_ETCAM_KEY_MODE_BT_LEN (2) +#define DPP_SDT_H_ETCAM_TABLE_ID_BT_POS (21) +#define DPP_SDT_H_ETCAM_TABLE_ID_BT_LEN (4) +#define DPP_SDT_H_ETCAM_NOAS_RSP_MODE_BT_POS (19) +#define DPP_SDT_H_ETCAM_NOAS_RSP_MODE_BT_LEN (2) +#define DPP_SDT_H_ETCAM_AS_EN_BT_POS (18) +#define DPP_SDT_H_ETCAM_AS_EN_BT_LEN (1) +#define DPP_SDT_H_ETCAM_AS_ERAM_BADDR_BT_POS (0) +#define DPP_SDT_H_ETCAM_AS_ERAM_BADDR_BT_LEN (18) +#define DPP_SDT_L_ETCAM_AS_ERAM_BADDR_BT_POS (31) +#define DPP_SDT_L_ETCAM_AS_ERAM_BADDR_BT_LEN (1) +#define DPP_SDT_L_ETCAM_AS_RSP_MODE_BT_POS (28) +#define DPP_SDT_L_ETCAM_AS_RSP_MODE_BT_LEN (3) +#define DPP_SDT_L_ETCAM_TABLE_DEPTH_BT_POS (1) +#define DPP_SDT_L_ETCAM_TABLE_DEPTH_BT_LEN (20) + +#define DPP_SDT_L_CLUTCH_EN_BT_POS (0) +#define DPP_SDT_L_CLUTCH_EN_BT_LEN (1) + +#define DPP_SDT_TBL_TYPE_NUM (8) + +/***********************************************************/ +/** 解析从硬件读取的64bit SDT属性 +* @param sdt_hig32 硬件表中存储的SDT属性高32bit +* @param sdt_low32 硬件表中存储的SDT属性低32bit +* @param p_sdt_info 解析之后的SDT属性,根据SDT属性中的table_type确定此ZXIC_VOID型指针对应的数据结构, 包括: \n +* DPP_SDTTBL_ERAM_T、DPP_SDTTBL_DDR3_T、DPP_SDTTBL_HASH_T、DPP_SDTTBL_LPM_T、\n +* DPP_SDTTBL_ETCAM_T、DPP_SDTTBL_PORTTBL_T。 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 王春雷 @date 2015/07/13 +************************************************************/ +DPP_STATUS dpp_sdt_tbl_data_parser(ZXIC_UINT32 dev_id, ZXIC_UINT32 sdt_hig32, ZXIC_UINT32 sdt_low32, ZXIC_VOID *p_sdt_info); + +/***********************************************************/ +/** 从软件缓存中获取table data信息 +* @param dev_id 设备号 +* @param sdt_no 业务表对应的sdt号,0-255 +* @param p_sdt_data sdt表信息 +* +* @return +* @remark 无 +* @see +* @author lim @date 2020/04/16 +************************************************************/ +DPP_STATUS dpp_sdt_tbl_data_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 sdt_no, DPP_SDT_TBL_DATA_T *p_sdt_data); + +/***********************************************************/ +/** 将sdt信息保存在软件缓存中 +* @param dev_id 设备号 +* @param sdt_no 业务表对应的sdt号 +* @param table_type SDT属性中的表类型,取值参考DPP_SDT_TABLE_TYPE_E的定义 +* @param p_sdt_info 写入的SDT表信息。 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author lim @date 2020/04/16 +************************************************************/ +DPP_STATUS dpp_soft_sdt_tbl_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 sdt_no, + ZXIC_UINT32 table_type, + DPP_SDT_TBL_DATA_T *p_sdt_info); + +/***********************************************************/ +/** 从软件缓存中获取sdt信息 +* @param device_id 设备号 +* @param sdt_no 业务表对应的sdt号 +* @param p_sdt_info 写入的SDT属性。由table_type确定此ZXIC_VOID型指针对应的数据结构, 包括: \n +* DPP_SDTTBL_ERAM_T、DPP_SDTTBL_DDR_T、DPP_SDTTBL_HASH_T、DPP_SDTTBL_LPM_T、 +* DPP_SDTTBL_ETCAM_T。 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author lim @date 2020/04/16 +************************************************************/ +DPP_STATUS dpp_soft_sdt_tbl_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 sdt_no, ZXIC_VOID *p_sdt_info); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/sdt/dpp_sdt_def.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/sdt/dpp_sdt_def.h new file mode 100755 index 0000000..4b8e895 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/sdt/dpp_sdt_def.h @@ -0,0 +1,143 @@ +/********************************************************************* +* 版权所有 (C)2001, 深圳市中兴通讯股份有限公司。 +* +* 文件名称: +* 文件标识: +* 内容摘要: +* 其它说明: +* +* +* 当前版本: +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT : 100% +* 作 者: 石金锋 +* 完成日期:2012-09-21 +********************************************************************/ +#ifndef _DPP_SDT_DEF_H_ +#define _DPP_SDT_DEF_H_ + + +typedef enum dpp_tbl_type_e +{ + TblType_Invalid = 0, + TblType_Eram128 = 1, + TblType_DDR3 = 2, + TblType_HASH = 3, + TblType_LPM = 4, + TblType_eTcam = 5, + TblType_PORTTBL = 6, + TblType_MAX = 7 +} DPP_TBL_TYPE_E; + +typedef enum dpp_eram128_mode_e +{ + Eram128Mode_1BITS = 0, + Eram128Mode_32BITS = 1, + Eram128Mode_64BITS = 2, + Eram128Mode_128BITS = 3, + Eram128Mode_2BITS = 4,/** Add By LiuShuo @ 2016年2月24日15:56:39*/ + Eram128Mode_4BITS = 5, + Eram128Mode_8BITS = 6, + Eram128Mode_16BITS = 7, + Eram128Mode_MAX = 8 +} DPP_ERAM128_MODE_E; + +typedef enum dpp_dde3_mode_e +{ + DDR3Mode_128BITS = 0, + DDR3Mode_256BITS = 1, + DDR3Mode_512BITS = 2, + DDR3Mode_MAX = 3 +} DPP_DDR3_MODE_E; +/** DDR3 共享模式 */ +typedef enum dpp_ddr3_share_mode_e +{ + DDR_SHARE_MODE_NONE = 0, /** <@brief 不共享模式 */ + DDR_SHARE_MODE_1_2 = 1, /** <@brief 1/2共享模式 */ + DDR_SHARE_MODE_1_4 = 2, /** <@brief 1/4共享模式 */ + DDR_SHARE_MODE_1_8 = 3, /** <@brief 1/8共享模式 */ + DDR_SHARE_MODE_MAX = 4, /** <@brief 不可用 */ +} DPP_DDR3_SHARE_MODE_E; + +typedef enum dpp_ddr3_copy_type_e +{ + DDR3_COPY_TYPE_INN_0 = 0, + DDR3_COPY_TYPE_INN_2 = 1, + DDR3_COPY_TYPE_INN_4 = 2, + DDR3_COPY_TYPE_INN_8 = 3, + DDR3_COPY_TYPE_OUT_0 = 4, + DDR3_COPY_TYPE_OUT_1 = 5, + DDR3_COPY_TYPE_OUT_2 = 7, +} DPP_DDR3_COPY_TYPE_E; + +/** 仿真器表项操作特殊定制,仅用于操作仿真器设备*/ +#define HASH_SIM_ADD_ADDR (0xFFFFFFF4) +#define HASH_SIM_DEL_ADDR (0xFFFFFFF8) +#define LPM_SIM_ADD_ADDR (0xFFFFFFE4) +#define LPM_SIM_DEL_ADDR (0xFFFFFFE8) +#define ETCAM_SIM_ADD_ADDR (0xFFFFFFD4) +#define ETCAM_SIM_DEL_ADDR (0xFFFFFFD8) + +typedef struct dpp_sdt_smmu0_t +{ + ZXIC_UINT32 *p_data; /*输入,输出数据地址 */ + ZXIC_UINT32 wr_rd_flag; /*0: Write 1: Read */ + ZXIC_UINT32 tbl_index; /*表项索引 */ + ZXIC_UINT32 tbl_base_addr; /*表项基地址 */ + ZXIC_UINT32 mode; /*参见DPP_ERAM128_MODE_E */ + ZXIC_UINT32 tbl_depth; /*表项的深度,越界检测 */ +} DPP_SDT_SMMU0_T; + +typedef struct dpp_sdt_smmu1_t +{ + ZXIC_UINT32 *p_data; /*输入,输出数据地址 */ + ZXIC_UINT32 crc_chk_en; /*Crc效验使能 */ + ZXIC_UINT32 wr_rd_flag; /*0: Write 1: Read */ + ZXIC_UINT32 ddr_share_type; /*参见DPP_DDR3_SHARE_MODE_E */ + ZXIC_UINT32 tbl_index; /*表项索引 */ + ZXIC_UINT32 tbl_base_addr; /*DDR3片内基地址 */ + ZXIC_UINT32 ddr_mode; /*参见DPP_DDR3_MODE_E */ + ZXIC_UINT32 sdt_no; /*SDT表号 */ +} DPP_SDT_SMMU1_T; + +typedef struct dpp_sdt_hash_t +{ + ZXIC_UINT32 id; /* hash引擎号 */ + ZXIC_UINT32 tbl_id; /* hash业务号 */ + ZXIC_UINT32 *p_data; + ZXIC_UINT32 addr; + ZXIC_UINT32 length; /* 数据长度,以4字节为单位 */ + ZXIC_UINT32 key_size; /* 键值长度,以字节为单位 */ + ZXIC_UINT32 key_type; /* 表项存储位宽 */ + ZXIC_UINT32 rsp_mode; + ZXIC_UINT32 wr_rd_flag; /* 0: Write 1: Read */ +} DPP_SDT_HASH_T; + +typedef struct dpp_sdt_lpm_t +{ + ZXIC_UINT32 *p_data; + ZXIC_UINT32 addr; + ZXIC_UINT32 length; /* 数据长度,以4字节为单位 */ + ZXIC_UINT32 wr_rd_flag; /* 0: Write 1: Read */ + ZXIC_UINT32 v46_flag; /* 1:ipv4, 0:ipv6 */ +} DPP_SDT_LPM_T; + +typedef struct dpp_sdt_etcam_t +{ + ZXIC_UINT32 id; /* etcam号 */ + ZXIC_UINT32 tbl_id; /* 业务号 */ + ZXIC_UINT32 *p_data; + ZXIC_UINT32 length; /* 数据长度,以4字节为单位 */ + ZXIC_UINT32 addr; + ZXIC_UINT32 wr_rd_flag; /* 0: Write 1: Read */ + ZXIC_UINT32 key_mode; + ZXIC_UINT32 rsp_mode; + ZXIC_UINT32 as_en; + ZXIC_UINT32 as_eram_baddr; + ZXIC_UINT32 as_rsp_mode; +} DPP_SDT_ETCAM_T; + +#endif + + + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/sdt/dpp_sdt_mgr.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/sdt/dpp_sdt_mgr.h new file mode 100755 index 0000000..fa7f714 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/sdt/dpp_sdt_mgr.h @@ -0,0 +1,147 @@ +/********************************************************************* +* 版权所有 (C)2013, 深圳市中兴通讯股份有限公司。 +* +* 文件名称: +* 文件标识: +* 内容摘要: +* 其它说明: +* +* +* 当前版本: +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT : 100% +* 作 者: 王春雷10111187 +* 完成日期: 2013-9-2 +********************************************************************/ + +#ifndef _DPP_SDT_MGR_H_ +#define _DPP_SDT_MGR_H_ + +#include "dpp_sdt_def.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define DPP_SDT_CFG_LEN (2) + +#define DPP_SDT_VALID (1) +#define DPP_SDT_INVALID (0) + +#define DPP_SDT_WRITE (0) +#define DPP_SDT_READ (1) + +#define DPP_SDT_MAX_BUFF (18) + +#define DPP_TBL_DATA_MAX (50) + +typedef enum dpp_opr_type_e +{ + DPP_TABLE_UPDATE = 0, + DPP_TABLE_DELETE = 1, + DPP_TABLE_SEARCH = 2, +} DPP_OPR_TYEP_E; + +/** eRam SDT变量获取中间结构 */ +typedef struct dpp_eram128_params_t +{ + ZXIC_UINT32 tbl_base_addr; /** 表项基地址,128bit为单位 */ + DPP_ERAM128_MODE_E eram128_mode; /** 表项位宽模式 */ + ZXIC_UINT32 tbl_depth; /** 表项深度值。越界检测 */ + ZXIC_UINT32 count; /** 表示写入数据的长度,以32bit为单位*/ +} DPP_ERAM128_PARAMS_T; + +/** DDR3 SDT变量获取中间结构 */ +typedef struct dpp_ddr3_params_t +{ + ZXIC_UINT32 base_addr; /** 表项基地址,以4K*128bit 为单位 */ + ZXIC_UINT32 crc_check; /** ECC校验使能位 */ + DPP_DDR3_MODE_E ddr3_mode; /** DDR位宽模式 */ + ZXIC_UINT32 tbl_share_mode; /** bank 共享模式 */ + ZXIC_UINT32 wr_rd_count; /** 表示写入数据的长度,以32bit为单位 */ +} DPP_DDR3_PARAMS_T; + +typedef enum dpp_hash_key_width_e +{ + HashKey_Invalid = 0, + HashKey_128b, + HashKey_256b, + HashKey_512b, + HashKey_MAX +} DPP_HASH_KEY_WIDTH_E; + +/** HASH SDT变量获取中间结构 */ +typedef struct dpp_hash_params_t +{ + ZXIC_UINT8 hash_id; /** hash引擎号 */ + ZXIC_UINT8 key_tbl_width; /** hash表项存储位宽, */ + ZXIC_UINT8 key_size; /** hash键值长度,以8bit为单位,1~48 */ + ZXIC_UINT8 table_id; /** hash逻辑表号 */ + ZXIC_UINT8 rsp_mode; /** 返回数据宽度 0:32 1:64 2:128 3:256*/ +} DPP_HASH_PARAMS_T; + +typedef struct dpp_lpm_params_t +{ + ZXIC_UINT8 v46_flag; /* 1:Ipv4, 0:Ipv6 */ + ZXIC_UINT8 count; /* 以4字节为单位 */ + ZXIC_UINT8 pad[2]; /* 字节对齐 */ +} DPP_LPM_PARAMS_T; + +typedef struct dpp_etcam_params_t +{ + ZXIC_UINT8 id; + ZXIC_UINT8 table_id; + ZXIC_UINT8 key_mode; + ZXIC_UINT8 rsp_mode; + ZXIC_UINT8 as_en; + ZXIC_UINT32 as_baddr; + ZXIC_UINT8 as_rsp_mode; +} DPP_ETCAM_PARAMS_T; + +typedef ZXIC_UINT32 (*dpp_sdt_mgr_smmu0_mux_fun_ptr)(ZXIC_UINT32 dev_id, DPP_SDT_SMMU0_T *p_sdt_smmu0); +typedef ZXIC_UINT32 (*dpp_sdt_mgr_smmu1_mux_fun_ptr)(ZXIC_UINT32 dev_id, DPP_SDT_SMMU1_T *p_sdt_smmu1); +typedef ZXIC_UINT32 (*dpp_sdt_mgr_hash_mux_fun_ptr)(ZXIC_UINT32 dev_id, DPP_SDT_HASH_T *p_sdt_hash); +typedef ZXIC_UINT32 (*dpp_sdt_mgr_lpm_mux_fun_ptr)(ZXIC_UINT32 dev_id, DPP_SDT_LPM_T *p_sdt_lpm); +typedef ZXIC_UINT32 (*dpp_sdt_mgr_etcam_mux_fun_ptr)(ZXIC_UINT32 dev_id, DPP_SDT_ETCAM_T *p_sdt_etcam); + +typedef struct dpp_sdt_item_t +{ + ZXIC_UINT32 valid; + ZXIC_UINT32 table_cfg[DPP_SDT_CFG_LEN]; +} DPP_SDT_ITEM_T; + +typedef struct dpp_sdt_soft_table_t +{ + ZXIC_UINT32 device_id; + DPP_SDT_ITEM_T sdt_array[DPP_DEV_SDT_ID_MAX]; +} DPP_SDT_SOFT_TABLE_T; + +typedef struct dpp_sdt_mgr_t +{ + ZXIC_UINT32 channel_num; + ZXIC_UINT32 is_init; + DPP_SDT_SOFT_TABLE_T* sdt_tbl_array[DPP_DEV_CHANNEL_MAX]; + dpp_sdt_mgr_smmu0_mux_fun_ptr p_sdt_mgr_smmu0_mux; + dpp_sdt_mgr_smmu1_mux_fun_ptr p_sdt_mgr_smmu1_mux; + dpp_sdt_mgr_hash_mux_fun_ptr p_sdt_mgr_hash_mux; + dpp_sdt_mgr_lpm_mux_fun_ptr p_sdt_mgr_lpm_mux; + dpp_sdt_mgr_etcam_mux_fun_ptr p_sdt_mgr_etcam_mux; +} DPP_SDT_MGR_T; + +ZXIC_UINT32 dpp_sdt_mgr_init(ZXIC_VOID); +ZXIC_UINT32 dpp_sdt_mgr_create(ZXIC_UINT32 dev_id); +ZXIC_UINT32 dpp_sdt_mgr_destroy(ZXIC_UINT32 dev_id); + +DPP_STATUS dpp_sdt_mgr_sdt_item_add(ZXIC_UINT32 dev_id, ZXIC_UINT32 sdt_no, ZXIC_UINT32 sdt_hig32, ZXIC_UINT32 sdt_low32); +DPP_STATUS dpp_sdt_mgr_sdt_item_srh(ZXIC_UINT32 dev_id, ZXIC_UINT32 sdt_no, ZXIC_UINT32 *p_sdt_hig32, ZXIC_UINT32 *p_sdt_low32); +DPP_STATUS dpp_sdt_mgr_sdt_item_del(ZXIC_UINT32 dev_id, ZXIC_UINT32 sdt_no); + +ZXIC_UINT32 dpp_sdt_mgr_get_as_table_en(ZXIC_UINT32 *table_cfg, ZXIC_UINT32 *p_as_en); +ZXIC_UINT32 dpp_sdt_mgr_get_as_table_type(ZXIC_UINT32 *table_cfg, DPP_TBL_TYPE_E *p_as_type); +ZXIC_UINT32 dpp_sdt_mgr_get_ddr3_page(ZXIC_UINT32 copy_type, ZXIC_UINT32 copy_position, ZXIC_UINT32 *p_page); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/se/dpp_acl.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/se/dpp_acl.h new file mode 100755 index 0000000..b8ae672 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/se/dpp_acl.h @@ -0,0 +1,103 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_acl.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : 王春雷 +* 完成日期 : 2014/12/17 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ +#ifndef _DPP_ACL_H_ +#define _DPP_ACL_H_ + +#include "dpp_se_api.h" + +#define DPP_ACL_TBL_ID_MIN (0) +#define DPP_ACL_TBL_ID_MAX (7) +#define DPP_ACL_ETCAM_ID_MIN (0) +#define DPP_ACL_ETCAM_ID_MAX (0) + +#define DPP_ACL_ENTRY_MAX_GET(key_mode, block_num) \ + ((block_num) * DPP_ETCAM_RAM_DEPTH * (1U<<(key_mode))) + +#define DPP_ACL_AS_RSLT_SIZE_GET(mode) \ + (((mode)==DPP_ACL_AS_MODE_128b)?(128/8):(((mode)==DPP_ACL_AS_MODE_64b)?(64/8):(((mode)==DPP_ACL_AS_MODE_32b)?\ + (32/8):(((mode)==DPP_ACL_AS_MODE_16b)?(16/8):(0))))) + +/** 仅内部调试接口使用*/ +#define DPP_ACL_AS_RSLT_SIZE_GET_EX(mode) (2U<<(mode)) + + +/** ACL关联查找结果表位宽模式,仅调试用*/ +typedef enum dpp_acl_as_mode_ex_e +{ + DPP_ACL_AS_MODE_EX_64b = 1, /**< @brief 64bit结果位宽*/ + DPP_ACL_AS_MODE_EX_128b = 2, /**< @brief 128bit结果位宽*/ + DPP_ACL_AS_MODE_EX_256b = 3, /**< @brief 256bit结果位宽,仅当关联结果表为DDR时有效*/ + DPP_ACL_AS_MODE_EX_INVALID, +}DPP_ACL_AS_MODE_EX_E; + +/***********************************************************/ +/** 初始化ACL公共管理数据结构 +* @param p_acl_cfg ACL公共管理数据结构指针 +* @param p_client 用户自定义数据指针,目前仅为传入dev_id的值 +* @param flags ACL初始化使能标志,详见DPP_ACL_FLAG_ETCAM0_EN等的定义 +* @param p_as_wrt_fun 关联结果G从布s表回调函数指针 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wcl @date 2015/05/20 +************************************************************/ +DPP_STATUS dpp_acl_cfg_init(DPP_ACL_CFG_T *p_acl_cfg, + ZXIC_VOID *p_client, + ZXIC_UINT32 flags, + ACL_AS_RSLT_WRT_FUNCTION p_as_wrt_fun); + +/***********************************************************/ +/** 获取ACL公共管理数据结构 +* @param p_acl_cfg ACL公共管理配置结构指针 +* +* @return DPP_OK-成功,DPP_ERR-失败 +************************************************************/ +DPP_STATUS dpp_acl_cfg_get(DPP_ACL_CFG_EX_T **p_acl_cfg); + +/***********************************************************/ +/** 初始化ACL业务表属G? +* @param p_acl_cfg ACL公共管理数据结构指针 +* @param table_id 业务表号,取值范围0~15 +* @param as_enable 是否使能关联结果查找,0-不使能,1-使能 +* @param entry_num 最大条目数 +* @param key_mode 键值位宽模式,取值参照DPP_ACL_KEY_MODE_E的定义 +* @param as_mode 关联结果位宽模式,取值参照DPP_ACL_AS_MODE_E的定义 +* @param block_num 分配给当前业务表号的block数目 +* @param p_block_idx 分配给当前业务表号的block编号数组 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wcl @date 2015/05/20 +************************************************************/ +DPP_STATUS dpp_acl_tbl_init(DPP_ACL_CFG_T *p_acl_cfg, + ZXIC_UINT32 table_id, + ZXIC_UINT32 as_enable, + ZXIC_UINT32 entry_num, + DPP_ACL_KEY_MODE_E key_mode, + DPP_ACL_AS_MODE_E as_mode, + ZXIC_UINT32 block_num, + ZXIC_UINT32 *p_block_idx); + +DPP_STATUS dpp_acl_hdw_addr_get(DPP_ACL_TBL_CFG_T *p_tbl_cfg, ZXIC_UINT32 handle, ZXIC_UINT32 *p_block_idx, ZXIC_UINT32 *p_addr, ZXIC_UINT32 *p_wr_mask); +#endif + + + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/se/dpp_dtb_table.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/se/dpp_dtb_table.h new file mode 100644 index 0000000..e5f4ac1 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/se/dpp_dtb_table.h @@ -0,0 +1,720 @@ +#ifndef _DPP_DTB_TABLE_H_ +#define _DPP_DTB_TABLE_H_ + +#ifdef __cplusplus +extern "C"{ +#endif + +#include "dpp_dev.h" +#include "dpp_hash.h" +#include "dpp_etcam.h" +#include "dpp_dtb_table_api.h" + +#define DISABLE (0) +#define ENABLE (1) + +#define DTB_DOWN_TABLE_CMD (0) +#define DTB_DUMP_TABLE_CMD (1) + +#define DTB_QUEUE_MAX (128) +#define DTB_QUEUE_ELEMENT_MAX (32) +#define DTB_DATA_SIZE_BIT (16*1024*8) +#define DPP_DTB_TABLE_DATA_BUFF_SIZE (1024*16) +#define DPP_DTB_TABLE_DUMP_INFO_BUFF_SIZE (1024*4) +#define DTB_TABLE_CMD_SIZE_BIT (128) +#define DTB_TABLE_CMD_SIZE_BYTE (16) +#define DTB_ERAM_DATA_SIZE_1b (128) +#define DTB_ERAM_DATA_SIZE_64b (128) +#define DTB_ERAM_DATA_SIZE_128b (256) +#define DTB_ERAM_ENTRY_CNT_MAX_1b (DTB_DATA_SIZE_BIT / DTB_ERAM_DATA_SIZE_1b) +#define DTB_ERAM_ENTRY_CNT_MAX_64b (DTB_DATA_SIZE_BIT / DTB_ERAM_DATA_SIZE_64b) +#define DTB_ERAM_ENTRY_CNT_MAX_128b (DTB_DATA_SIZE_BIT / DTB_ERAM_DATA_SIZE_128b) +#define DTB_ZCAM_LEN_SIZE (5) /*单位16字节*/ +#define DTB_ETCAM_LEN_SIZE (6) /*单位16字节*/ +#define DTB_MC_HASH_LEN_SIZE (5) /*单位16字节*/ +#define DTB_ZCAM_DATA_SIZE (ZXIC_UINT32)(64) +#define DTB_DMUP_DATA_MAX (ZXIC_UINT32)(4*1024*1024) +#define DTB_DUMP_DDR_ITEMS_MAX (0x10000) + +#define DTB_SDT_DUMP_SIZE (0x400000) //4MB + +#define DTB_TABLE_VALID (1) +#define DTB_LEN_POS_SETP (16) /*DTB len 单位16字节 */ + +#define LPM_IPV4 (1) +#define LPM_IPV6 (0) +#define LPM_ENABLE (1) +#define LPM_DISABLE (0) + +#define DTB_TABLE_MODE_ERAM (0) +#define DTB_TABLE_MODE_DDR (1) +#define DTB_TABLE_MODE_ZCAM (2) +#define DTB_TABLE_MODE_ETCAM (3) +#define DTB_TABLE_MODE_MC_HASH (4) + +#define DTB_DUMP_MODE_ERAM (0) +#define DTB_DUMP_MODE_DDR (1) +#define DTB_DUMP_MODE_ZCAM (2) +#define DTB_DUMP_MODE_ETCAM (3) + +#define DTB_ITEM_ADD_OR_UPDATE (0) +#define DTB_ITEM_DELETE (1) + +/* DTB 表信息管理 */ +/*表顺序与g_dpp_dtb_table_info中顺序一致*/ +typedef enum dpp_dtb_table_info_e +{ + DTB_TABLE_DDR = 0, + DTB_TABLE_ERAM_1 = 1, + DTB_TABLE_ERAM_64 = 2, + DTB_TABLE_ERAM_128 = 3, + DTB_TABLE_ZCAM = 4, + DTB_TABLE_ETCAM = 5, + DTB_TABLE_MC_HASH = 6, + DTB_TABLE_ENUM_MAX +}DPP_DTB_TABLE_INFO_E; + +typedef enum dpp_dtb_dump_info_e +{ + DTB_DUMP_ERAM = 0, + DTB_DUMP_DDR = 1, + DTB_DUMP_ZCAM = 2, + DTB_DUMP_ETCAM = 3, + DTB_DUMP_ENUM_MAX +}DPP_DTB_DUMP_INFO_E; + +typedef enum dpp_dtb_dump_zcam_width_e +{ + DTB_DUMP_ZCAM_128b = 0, + DTB_DUMP_ZCAM_256b = 1, + DTB_DUMP_ZCAM_512b = 2, + DTB_DUMP_ZCAM_RSV = 3, +}DPP_DTB_DUMP_ZCAM_WIDTH_E; + +typedef enum dpp_dtb_dump_etcam_width_e +{ + DTB_DUMP_ETCAM_80b = 0, + DTB_DUMP_ETCAM_160b = 1, + DTB_DUMP_ETCAM_320b = 2, + DTB_DUMP_ETCAM_640b = 3, + DTB_DUMP_ETCAM_MAX +}DPP_DTB_DUMP_ETCAM_WIDTH_E; + +/* DTB下表格式字段定义 */ +typedef struct dpp_dtb_ddr_table_form_t +{ + ZXIC_UINT32 valid; /* 有效标识 1有效*/ + ZXIC_UINT32 type_mode; /* DDR:0x1 */ + ZXIC_UINT32 rw_len; /*数据长度 00:128 01:256 10:384 11:512*/ + ZXIC_UINT32 v46_flag; /*1:IPV4 0:IPV6*/ + ZXIC_UINT32 lpm_wr_vld; /*lpm表写有效标识*/ + ZXIC_UINT32 baddr; /*表基地址*/ + ZXIC_UINT32 ecc_en; /* ECC 使能*/ + ZXIC_UINT32 rw_addr; /*以数据宽度为单位的index*/ +}DPP_DTB_DDR_TABLE_FORM_T; + +typedef struct dpp_dtb_eram_table_form_t +{ + ZXIC_UINT32 valid; /* 有效标识 1有效*/ + ZXIC_UINT32 type_mode; /* ERAM:0x0 */ + ZXIC_UINT32 data_mode; /*数据长度 00:128 01:64 10:1*/ + ZXIC_UINT32 cpu_wr; /*CPU写使能*/ + ZXIC_UINT32 cpu_rd; /*CPU读使能*/ + ZXIC_UINT32 cpu_rd_mode; /*CPU读模式 0:读 1:读清*/ + ZXIC_UINT32 addr; /*访问eram 1bit为单位*/ + ZXIC_UINT32 data_h; /*数据高32bit*/ + ZXIC_UINT32 data_l; /*数据低32bit*/ +}DPP_DTB_ERAM_TABLE_FORM_T; + +typedef struct dpp_dtb_zcam_table_form_t +{ + ZXIC_UINT32 valid; /* 有效标识 1有效*/ + ZXIC_UINT32 type_mode; /* zcam:0x2 */ + ZXIC_UINT32 ram_reg_flag; /* ram reg 标识 */ + ZXIC_UINT32 zgroup_id; /* zgroup id */ + ZXIC_UINT32 zblock_id; /* zblock id */ + ZXIC_UINT32 zcell_id; /* zcell id */ + ZXIC_UINT32 mask; /* 掩码 */ + ZXIC_UINT32 sram_addr; /* ram地址 */ + +}DPP_DTB_ZCAM_TABLE_FORM_T; + +typedef struct dpp_dtb_etcam_table_form_t +{ + ZXIC_UINT32 valid; /* 有效标识 1有效*/ + ZXIC_UINT32 type_mode; /* etcam:0x3 */ + ZXIC_UINT32 block_sel; /*block索引 0 - 7*/ + ZXIC_UINT32 init_en; /*初始化使能 高有效*/ + ZXIC_UINT32 row_or_col_msk; /* 1 write row mask reg 0:write col mask reg*/ + ZXIC_UINT32 vben; /* enable the valid bit addressed by addr*/ + ZXIC_UINT32 reg_tcam_flag; /* 1:配置内部row_col_mask寄存器 0:读写tcam*/ + ZXIC_UINT32 uload; /*使能标识删除对应addr的表项条目,(80bit为单位,含义与wr_mode一一对应)*/ + ZXIC_UINT32 rd_wr; /*读写标志 0写 1读*/ + ZXIC_UINT32 wr_mode; /*写入掩码,最高8bit,对应bit为1代表对应的80bit的数据*/ + ZXIC_UINT32 data_or_mask; /*数据或掩码标志 1:写x(data),0:写y(mask)*/ + ZXIC_UINT32 addr; /*etcam地址(0-511)*/ + ZXIC_UINT32 vbit; /*valid bit input*/ + +}DPP_DTB_ETCAM_TABLE_FORM_T; + +typedef struct dpp_dtb_mc_hash_table_form_t +{ + ZXIC_UINT32 valid; /* 有效标识 1有效 */ + ZXIC_UINT32 type_mode; /* 微码写hash 0x4 */ + ZXIC_UINT32 std_h; /* sdt信息高32bit */ + ZXIC_UINT32 std_l; /* sdt信息低32bit */ +}DPP_DTB_MC_HASH_TABLE_FORM_T; + +/* DTB DUMP表格式 */ +typedef struct dpp_dtb_eram_dump_form_t +{ + ZXIC_UINT32 valid; /* 有效标识 1有效 */ + ZXIC_UINT32 up_type; /* 00:eram */ + ZXIC_UINT32 base_addr; /* 128bit为单位 */ + ZXIC_UINT32 tb_depth; /* 表项深度,每条条目位宽128bit */ + ZXIC_UINT32 tb_dst_addr_h; /* 数据目的地址高32bit */ + ZXIC_UINT32 tb_dst_addr_l; /* 数据目的地址低32bit */ + +}DPP_DTB_ERAM_DUMP_FORM_T; + +typedef struct dpp_dtb_ddr_dump_form_t +{ + ZXIC_UINT32 valid; + ZXIC_UINT32 up_type; /* 01:ddr */ + ZXIC_UINT32 base_addr; /* 128bit为单位 */ + ZXIC_UINT32 tb_depth; /* 表项深度,每条条目位宽512bit */ + ZXIC_UINT32 tb_dst_addr_h; + ZXIC_UINT32 tb_dst_addr_l; + +}DPP_DTB_DDR_DUMP_FORM_T; + +typedef struct dpp_dtb_zcam_dump_form_t +{ + ZXIC_UINT32 valid; + ZXIC_UINT32 up_type; /* 10:zcam */ + ZXIC_UINT32 zgroup_id; /* */ + ZXIC_UINT32 zblock_id; /* */ + ZXIC_UINT32 ram_reg_flag; + ZXIC_UINT32 z_reg_cell_id; + ZXIC_UINT32 sram_addr; + ZXIC_UINT32 tb_depth; /* 表项深度 */ + ZXIC_UINT32 tb_width; /* 表项宽度 */ + ZXIC_UINT32 tb_dst_addr_h; + ZXIC_UINT32 tb_dst_addr_l; + + +}DPP_DTB_ZCAM_DUMP_FORM_T; +typedef struct dpp_dtb_etcam_dump_form_t +{ + ZXIC_UINT32 valid; + ZXIC_UINT32 up_type; /* 11:etcam */ + ZXIC_UINT32 block_sel; /* block num */ + ZXIC_UINT32 addr; /* 640bit位单位 */ + ZXIC_UINT32 rd_mode; /* 读模式,共8bit,每bit控制ram中对应位置的80bit数据是否有效*/ + ZXIC_UINT32 data_or_mask; /* data:1 mask:0*/ + ZXIC_UINT32 tb_depth; /* dump出数据深度,以640bit为单位 */ + ZXIC_UINT32 tb_width; /* dump出数据宽度 00:80bit 01:160bit 10:320bit 11:640bit */ + ZXIC_UINT32 tb_dst_addr_h; /* dma地址高32bit */ + ZXIC_UINT32 tb_dst_addr_l; /* dma地址低32bit */ +}DPP_DTB_ETCAM_DUMP_FORM_T; + +typedef struct etcam_dump_info_t +{ + ZXIC_UINT32 block_sel; /* block index 0-7 */ + ZXIC_UINT32 addr; /* 单个block的RAM地址,范围0~511 640bit为单位 */ + ZXIC_UINT32 rd_mode; /* 读模式,共8bit,每bit控制ram中对应位置的80bit数据是否有效 */ + ZXIC_UINT32 data_or_mask; /* data:1 mask:0 参照DPP_ETCAM_DATA_TYPE_E定义*/ + ZXIC_UINT32 tb_depth; /* dump出表深度,以640bit为单位 */ + ZXIC_UINT32 tb_width; /* dump出数据宽度 00:80bit 01:160bit 10:320bit 11:640bit */ +}ETCAM_DUMP_INFO_T; + +/* 表信息结构 */ +typedef struct dpp_dtb_field_t +{ + ZXIC_CHAR *p_name; /* 字段名 */ + ZXIC_UINT16 lsb_pos; /* 最低比特位置,以寄存器列表为准*/ + ZXIC_UINT16 len; /* 字段长度,以比特为单位 */ +}DPP_DTB_FIELD_T; + +typedef struct dpp_dtb_table_t +{ + ZXIC_CHAR *table_type; /* 表类型名称*/ + ZXIC_UINT32 table_no; /* 表编号 */ + ZXIC_UINT32 field_num; /* 包含的字段个数 */ + DPP_DTB_FIELD_T *p_fields; /* 表格式所有字段 */ +}DPP_DTB_TABLE_T; + +typedef struct dpp_dtb_entry_t +{ + ZXIC_UINT8 *cmd; /* 命令 128bit 即 16B*/ + ZXIC_UINT8 *data; /* 数据 */ + ZXIC_UINT32 data_in_cmd_flag; /*eram 1/64 bit模式时使用,1表示data在cmd中*/ + ZXIC_UINT32 data_size; /* 数据长度,以字节为单位 */ +}DPP_DTB_ENTRY_T; + +typedef struct dpp_dtb_cmd_t +{ + ZXIC_UINT32 queue_id; /*队列id*/ + ZXIC_UINT32 dtb_phy_addr_hi32; /*dtb描述符物理地址高32bit*/ + ZXIC_UINT32 dtb_phy_addr_lo32; /*dtb描述符物理地址低32bit*/ + ZXIC_UINT32 cmd_type; /*0为流表下发命令,1为流表dump命令*/ + ZXIC_UINT32 int_enable; /* 中断使能 */ + ZXIC_UINT32 dtb_len; /* 指示配表内容或dump描述符长度,以16字节为单位 */ +}DPP_DTB_CMD_T; + + +typedef struct dpp_dtb_mc_hash_key_t +{ + ZXIC_UINT32 hash_key[16]; +}DPP_DTB_MC_HASH_KEY_T; + +typedef struct dpp_dtb_mixed_table_t +{ + ZXIC_UINT32 down_cmd_len; /**down描述符长度,字节为单位*/ + ZXIC_UINT32 dump_cmd_len; /**dump描述符长度,字节为单位*/ + ZXIC_UINT32 down_buff_offset; /**down buff 偏移,字节为单位*/ + ZXIC_UINT32 dump_buff_offset; /**dump buff 偏移,字节为单位*/ + ZXIC_UINT8 * p_down_cmd_buff; /**指向下表描述符空间,空间为16KB*/ + ZXIC_UINT8 * p_dump_cmd_buff; /**指向dump描述符空间,空间为4KB*/ +}DPP_DTB_MIXED_TABLE_T; + +typedef struct dpp_dtb_mc_hash_entry_info_t +{ + ZXIC_UINT32 delete_en; /* delete 浣胯兘 */ + ZXIC_UINT32 dma_en; /* dma 浣胯兘 */ + ZXIC_UINT32 *p_data; /*hash 鏉$洰鎸囬拡 闀垮害512bit*/ +}DPP_DTB_MC_HASH_ENTRY_INFO_T; + +/** dtb 中断配置 +* @param int_enable 中断使能 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_interrupt_status_set(ZXIC_UINT32 int_enable); + +/** dtb 中断获取 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +ZXIC_UINT32 dpp_dtb_interrupt_status_get(ZXIC_VOID); + +/** dtb cmd 大小端设置 +* @param int_enable 中断使能 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_cmd_endian_status_set(ZXIC_UINT32 endian); + +/** dtb cmd 大小端获取 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_cmd_endian_status_get(ZXIC_VOID); + +/** dtb写smmu0中的数据,数据长度不限 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param smmu0_base_addr smmu0基地址,以128bit为单位 +* @param smmu0_wr_mode smmu0写模式,参考DPP_ERAM128_OPR_MODE_E,仅支持128bit、64bit、1bit模式 +* @param entry_num 下发的条目数 +* @param p_entry_arr 待下发表项内容结构体数组指针 +* @param element_id 返回下表使用的元素id +* @return +* @remark 无 +* @see +* @author cbb @date 2024/01/04 +************************************************************/ +DPP_STATUS dpp_dtb_smmu0_data_write(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 smmu0_base_addr, + ZXIC_UINT32 smmu0_wr_mode, + ZXIC_UINT32 entry_num, + DPP_DTB_ERAM_ENTRY_INFO_T *p_entry_arr, + ZXIC_UINT32 *element_id); + +/** dtb flush smmu0中的数据,大数据量 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param smmu0_base_addr smmu0基地址,以128bit为单位 +* @param smmu0_wr_mode smmu0写模式,参考DPP_ERAM128_OPR_MODE_E,仅支持128bit、64bit、1bit模式 +* @param start_index flush开始的条目 +* @param entry_num 下发的条目数 +* @param element_id 返回下表使用的元素id +* @return +* @remark 无 +* @see +* @author cbb @date 2024/01/04 +************************************************************/ +DPP_STATUS dpp_dtb_smmu0_flush(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 smmu0_base_addr, + ZXIC_UINT32 smmu0_wr_mode, + ZXIC_UINT32 start_index, + ZXIC_UINT32 entry_num, + ZXIC_UINT32 *element_id); + +/** dtb写eRam表 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no eram表sdt表号 +* @param entry_cnt 下发的条目数 +* @param p_entry_arr 待下发表项内容结构体数组指针 +* @param element_id 返回下表使用的元素id +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_eram_dma_write(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + ZXIC_UINT32 entry_num, + DPP_DTB_ERAM_ENTRY_INFO_T *p_entry_arr, + ZXIC_UINT32 *element_id); + +/** dtb写HASH表,在插入条目时如果冲突,则对冲突条目进行记录 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no hash表sdt表号 +* @param entry_cnt 下发的条目数 +* @param p_entry_arr 待下发表项内容结构体数组指针 +* @param element_id 返回下表使用的元素id +* @return +* @remark 无 是否是有一个写不成功就返回,还是继续进行下一个条目并记录错误的条目 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_hash_dma_insert(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + ZXIC_UINT32 entry_num, + DPP_DTB_HASH_ENTRY_INFO_T *p_arr_hash_entry, + ZXIC_UINT32 *element_id); + +/** dtb删除HASH表 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no hash表sdt表号 +* @param entry_cnt 删除的条目数 +* @param p_entry_arr 待下发表项内容结构体数组指针 +* @param element_id 返回下表使用的元素id +* @return +* @remark 无 +* @see +* @author @date 2023/03/14 +************************************************************/ +DPP_STATUS dpp_dtb_hash_dma_delete(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + ZXIC_UINT32 entry_num, + DPP_DTB_HASH_ENTRY_INFO_T *p_arr_hash_entry, + ZXIC_UINT32 *element_id); + +/** dtb写ACL表 (SPECIFY模式,条目中指定handle,支持级联64bit/128bit) +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no ACL表sdt表号 +* @param entry_num 下发的条目数 +* @param p_acl_entry_arr 待下发表项内容结构体数组指针 +* @param element_id 返回下表使用的元素id +* @return +* @remark 无 是否是有一个写不成功就返回,还是继续进行下一个条目并记录错误的条目 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_acl_dma_insert(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + ZXIC_UINT32 entry_num, + DPP_DTB_ACL_ENTRY_INFO_T *p_acl_entry_arr, + ZXIC_UINT32 *element_id + ); + + +/** dtb dump eram直接表表项内容 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no eram表sdt表号 +* @param p_dump_eram_entry eram数据结构,数据已分配相应内存 +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_eram_data_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + DPP_DTB_ERAM_ENTRY_INFO_T *p_dump_eram_entry); + +/** dtb dump eram直接表表项内容 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no eram表sdt表号 +* @param p_dump_eram_entry eram数据结构,数据已分配相应内存 +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_eram_stat_data_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 base_addr, + ZXIC_UINT32 rd_mode, + ZXIC_UINT32 index, + ZXIC_UINT32 *p_data); + +/***********************************************************/ +/** 配置数据获取模式 +* @param srh_mode 0:软件获取 1:硬件获取 +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/02 +************************************************************/ +ZXIC_VOID dpp_dtb_srh_mode_set(ZXIC_UINT32 srh_mode); + +/** 获取查找方式 +* @param +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/02 +************************************************************/ +ZXIC_UINT32 dpp_dtb_srh_mode_get(ZXIC_VOID); + +/** 根据键值查找hash表 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列id +* @param sdt_no 0~255 +* @param p_dtb_hash_entry 出参,返回描述符信息 +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/02 +************************************************************/ + +ZXIC_UINT32 dpp_dtb_hash_data_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + DPP_DTB_HASH_ENTRY_INFO_T *p_dtb_hash_entry); + +/** dtb 通过key和mask获取ACL表级联结果 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no eram表sdt表号 +* @param p_dump_acl_entry etcam 数据结构,数据已分配相应内存,需要输入key和mask +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_acl_data_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + DPP_DTB_ACL_ENTRY_INFO_T *p_dump_acl_entry); + +/** dtb etcam 数据get接口,通过handle值获取etcam数据 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no eram表sdt表号 +* @param p_dump_acl_entry etcam 数据结构,数据已分配相应内存 +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_etcam_data_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + DPP_DTB_ACL_ENTRY_INFO_T *p_dump_acl_entry); + + +/***********************************************************/ +/** flush当前hash引擎占用的ZCAM空间 +* @param p_se_cfg 全局数据结构 +* @param queue_id 队列id +* @param fun_id hash引擎0~3 +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/02 +************************************************************/ +DPP_STATUS dpp_dtb_zcam_space_clr(DPP_DEV_T *dev, + DPP_SE_CFG *p_se_cfg, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 fun_id); + +/***********************************************************/ +/** flush指定eram空间 +* @param dev_id 设备id +* @param queue_id 队列id +* @param sdt_no sdt号 +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/02 +************************************************************/ +DPP_STATUS dpp_dtb_eram_table_flush(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no); + +/***********************************************************/ +/** flush指定hash空间(DDR/ZCAM) +* @param dev_id 设备id +* @param queue_id 队列id +* @param sdt_no sdt号 +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/02 +************************************************************/ +DPP_STATUS dpp_dtb_hash_table_flush(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no); + +/***********************************************************/ +/** 清除hash表资源(硬件和软件,硬件通过dtb方式清除) +* @param dev_id 设备id +* @param queue_id 队列id +* @param hash_id hash引擎 0~3 +* @return +* @remark 无 +* @see +* @author cq @date 2023/09/26 +************************************************************/ +DPP_STATUS dpp_dtb_hash_all_entry_delete(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 hash_id); + +/***********************************************************/ +/** DTB etcam 整个流表清空Flush +* @param devId NP设备号 +* @param queueId DTB队列编号 +* @param sdtNo 流表std号 +* @return +* @remark 无 +* @see +* @author cbb @date 2023/07/03 +************************************************************/ +DPP_STATUS dpp_dtb_etcam_table_flush(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no); + +/** dtb dump eram直接表表项内容 支持64bit/128bit +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no eram表sdt表号 +* @param start_index 要dump的起始index,单位是sdt_no该表的mode +* @param p_dump_data_arr 本次dump出的数据,数据格式与下表格式相同 +* @param entry_num 本次dump实际的条目数 +* @param next_start_index 下次dump是开始的index +* @param finish_flag 整个表dump完成标志,1表示完成,0表示未完成 +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ + DPP_STATUS dpp_dtb_eram_table_dump(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + DPP_DTB_DUMP_INDEX_T start_index, + DPP_DTB_ERAM_ENTRY_INFO_T* p_dump_data_arr, + ZXIC_UINT32 *entry_num, + DPP_DTB_DUMP_INDEX_T *next_start_index, + ZXIC_UINT32 *finish_flag); + +/***********************************************************/ +/** 只dump hash表的zcam内容 +* @param dev_id 设备id +* @param queue_id 队列id 0~127 +* @param sdt_no sdt号 0~255 +* @param pDumpData 出参,dump数据,内存由用户分配,结构体DPP_DTB_HASH_ENTRY_INFO_T +* @param entryNum 出参,dump出的有效hash条目 +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/22 +************************************************************/ +DPP_STATUS dpp_dtb_hash_table_only_zcam_dump(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + ZXIC_UINT8* pDumpData, + ZXIC_UINT32 *entryNum); + +/** dtb dump etcam直接表表项内容 级联eram支持64bit/128bit +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no acl表sdt表号 +* @param start_index 要dump的起始index,单位是sdt_no该表的mode +* @param p_dump_data_arr 本次dump出的数据,数据格式与下表格式相同 +* @param entry_num 本次dump实际的条目数 +* @param next_start_index 下次dump是开始的index +* @param finish_flag 整个表dump完成标志,1表示完成,0表示未完成 +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ + DPP_STATUS dpp_dtb_acl_table_dump(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + DPP_DTB_DUMP_INDEX_T start_index, + DPP_DTB_ACL_ENTRY_INFO_T* p_dump_data_arr, + ZXIC_UINT32 *entry_num, + DPP_DTB_DUMP_INDEX_T *next_start_index, + ZXIC_UINT32 *finish_flag); + +ZXIC_VOID dpp_data_buff_print(ZXIC_UINT8 *buff, ZXIC_UINT32 size); +ZXIC_VOID dpp_acl_data_print(ZXIC_UINT8 *p_data, ZXIC_UINT8 *p_mask, ZXIC_UINT32 etcam_mode); +ZXIC_VOID dpp_dtb_data_print(ZXIC_UINT8 *p_data, ZXIC_UINT32 len); + +ZXIC_UINT32 dpp_ddr_index_calc(ZXIC_UINT32 index, + ZXIC_UINT32 width_mode, + ZXIC_UINT32 key_type, + ZXIC_UINT32 byte_offset); + +DPP_STATUS dpp_dtb_hash_dma_delete_hardware(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + ZXIC_UINT32 entry_num, + DPP_DTB_HASH_ENTRY_INFO_T *p_arr_hash_entry, + ZXIC_UINT32 *element_id); + +ZXIC_UINT32 dpp_dtb_hash_zcam_delete_hardware(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + HASH_ENTRY_CFG *p_hash_entry_cfg, + DPP_HASH_ENTRY *p_hash_entry, + DPP_DTB_ENTRY_T *p_entry, + ZXIC_UINT8 *p_srh_succ); + +DPP_STATUS dpp_dtb_se_zcam_dma_dump(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 addr, + ZXIC_UINT32 tb_width, + ZXIC_UINT32 depth, + ZXIC_UINT32 *p_data, + ZXIC_UINT32 *element_id); + +ZXIC_UINT32 dpp_dtb_hash_data_parse(ZXIC_UINT32 item_type, + ZXIC_UINT32 key_by_size, + DPP_HASH_ENTRY *p_entry, + ZXIC_UINT8 *p_item_data, + ZXIC_UINT8 *p_data_offset); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/se/dpp_hash.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/se/dpp_hash.h new file mode 100755 index 0000000..e2a986c --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/se/dpp_hash.h @@ -0,0 +1,402 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_hash.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : wcl +* 完成日期 : 2014/02/14 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef _DPP_HASH_H_ +#define _DPP_HASH_H_ + +#include "dpp_se_cfg.h" + +#define HASH_FUNC_ID_MIN (0) +#define HASH_FUNC_ID_NUM (4) + +#define HASH_DDR_CRC_NUM (4) + +#define HASH_KEY_MAX (49) /* 最大键值长度,以字节为单位 */ +#define HASH_RST_MAX (32) /* 最大结果长度,以字节为单位 */ +#define HASH_ENTRY_POS_STEP (16) + +#define HASH_TBL_ID_NUM (32) /* 每个Hash引擎中的最大业务表数目 */ +#define HASH_BULK_NUM (8) /* 每个Hash引擎DDR资源划分的块数 */ + + +#define HASH_ACTU_KEY_MIN (1) /* 业务实际键值长度 */ +#define HASH_ACTU_KEY_MAX (48) +#define HASH_ACTU_KEY_STEP (1) /* actual key的长度单位: 1字节 */ +#define HASH_KEY_CTR_SIZE (1) /* key中控制信息的长度, 1字节 */ +#define ITEM_ENTRY_NUM_2 (2) +#define ITEM_ENTRY_NUM_4 (4) + +#define HASH_DDR_ITEM_MIN (1<<14) +#define HASH_DDR_ITEM_MAX (1<<26) + +#define HASH_ZBLK_ID_MAX (31) + +/* hash ext cfg reg */ +#define HASH_EXT_MODE_BT_START (1) +#define HASH_EXT_MODE_BT_WIDTH (8) +#define HASH_EXT_FLAG_BT_START (0) +#define HASH_EXT_FLAG_BT_WIDTH (1) + +/* hash tbl30 depth reg */ +#define HASH_TBL0_DEPTH_BT_START (0) +#define HASH_TBL0_DEPTH_BT_WIDTH (8) +#define HASH_TBL1_DEPTH_BT_START (8) +#define HASH_TBL1_DEPTH_BT_WIDTH (8) +#define HASH_TBL2_DEPTH_BT_START (16) +#define HASH_TBL2_DEPTH_BT_WIDTH (8) +#define HASH_TBL3_DEPTH_BT_START (24) +#define HASH_TBL3_DEPTH_BT_WIDTH (8) + +/* hash tbl74 depth reg*/ +#define HASH_TBL4_DEPTH_BT_START (0) +#define HASH_TBL4_DEPTH_BT_WIDTH (8) +#define HASH_TBL5_DEPTH_BT_START (8) +#define HASH_TBL5_DEPTH_BT_WIDTH (8) +#define HASH_TBL6_DEPTH_BT_START (16) +#define HASH_TBL6_DEPTH_BT_WIDTH (8) +#define HASH_TBL7_DEPTH_BT_START (24) +#define HASH_TBL7_DEPTH_BT_WIDTH (8) + +/* hash ext crc cfg*/ +#define TBL0_EXT_CRC_CFG_BT_START (0) +#define TBL0_EXT_CRC_CFG_BT_WIDTH (2) +#define TBL1_EXT_CRC_CFG_BT_START (2) +#define TBL1_EXT_CRC_CFG_BT_WIDTH (2) +#define TBL2_EXT_CRC_CFG_BT_START (4) +#define TBL2_EXT_CRC_CFG_BT_WIDTH (2) +#define TBL3_EXT_CRC_CFG_BT_START (6) +#define TBL3_EXT_CRC_CFG_BT_WIDTH (2) +#define TBL4_EXT_CRC_CFG_BT_START (8) +#define TBL4_EXT_CRC_CFG_BT_WIDTH (2) +#define TBL5_EXT_CRC_CFG_BT_START (10) +#define TBL5_EXT_CRC_CFG_BT_WIDTH (2) +#define TBL6_EXT_CRC_CFG_BT_START (12) +#define TBL6_EXT_CRC_CFG_BT_WIDTH (2) +#define TBL7_EXT_CRC_CFG_BT_START (14) +#define TBL7_EXT_CRC_CFG_BT_WIDTH (2) + +/* hash mono flags*/ +#define HASH0_MONO_FLAG_BT_START (0) +#define HASH0_MONO_FLAG_BT_WIDTH (8) +#define HASH1_MONO_FLAG_BT_START (8) +#define HASH1_MONO_FLAG_BT_WIDTH (8) +#define HASH2_MONO_FLAG_BT_START (16) +#define HASH2_MONO_FLAG_BT_WIDTH (8) +#define HASH3_MONO_FLAG_BT_START (24) +#define HASH3_MONO_FLAG_BT_WIDTH (8) + +/* hash zcell mono*/ +#define ZCELL0_BULK_ID_BT_START (2) +#define ZCELL0_BULK_ID_BT_WIDTH (3) +#define ZCELL0_MONO_FLAG_BT_START (3) +#define ZCELL0_MONO_FLAG_BT_WIDTH (1) +#define ZCELL1_BULK_ID_BT_START (10) +#define ZCELL1_BULK_ID_BT_WIDTH (3) +#define ZCELL1_MONO_FLAG_BT_START (11) +#define ZCELL1_MONO_FLAG_BT_WIDTH (1) +#define ZCELL2_BULK_ID_BT_START (18) +#define ZCELL2_BULK_ID_BT_WIDTH (3) +#define ZCELL2_MONO_FLAG_BT_START (19) +#define ZCELL2_MONO_FLAG_BT_WIDTH (1) +#define ZCELL3_BULK_ID_BT_START (26) +#define ZCELL3_BULK_ID_BT_WIDTH (3) +#define ZCELL3_MONO_FLAG_BT_START (27) +#define ZCELL3_MONO_FLAG_BT_WIDTH (1) + +/* hash zreg mono */ +#define ZREG0_BULK_ID_BT_START (2) +#define ZREG0_BULK_ID_BT_WIDTH (3) +#define ZREG0_MONO_FLAG_BT_START (3) +#define ZREG0_MONO_FLAG_BT_WIDTH (1) +#define ZREG1_BULK_ID_BT_START (10) +#define ZREG1_BULK_ID_BT_WIDTH (3) +#define ZREG1_MONO_FLAG_BT_START (11) +#define ZREG1_MONO_FLAG_BT_WIDTH (1) +#define ZREG2_BULK_ID_BT_START (18) +#define ZREG2_BULK_ID_BT_WIDTH (3) +#define ZREG2_MONO_FLAG_BT_START (19) +#define ZREG2_MONO_FLAG_BT_WIDTH (1) +#define ZREG3_BULK_ID_BT_START (26) +#define ZREG3_BULK_ID_BT_WIDTH (3) +#define ZREG3_MONO_FLAG_BT_START (27) +#define ZREG3_MONO_FLAG_BT_WIDTH (1) + +#define OPR_CLR (0) +#define OPR_WR (1) + +#define OBTAIN_CONFLICT_KEY (0) + +/* HASH soft reset*/ +#define HASH_ARG_NUM_PER_BULK (8) /* 每个bulk 需要记录的参数数目 */ +#define HASH_ARG_NUM_PER_TBL (4) /* 每个表 需要记录的参数数目 */ +#define HASH_INIT_NUM (8) /* HASH引擎初始化参数数目 */ +#define HASH_BULK_INIT_NUM (1+HASH_BULK_NUM*HASH_ARG_NUM_PER_BULK+3) /* 1-bulk_valid +3是为了凑够4的倍数 */ +#define HASH_TBL_INIT_NUM (1+HASH_TBL_ID_NUM*HASH_ARG_NUM_PER_TBL+3) /* 1-tbl_valid +3是为了凑够4的整数倍 */ + +typedef struct dpp_hash_table_stat +{ + ZXIC_FLOAT ddr; + ZXIC_FLOAT zcell; + ZXIC_FLOAT zreg; + ZXIC_FLOAT sum; +}DPP_HASH_TABLE_STAT; + +typedef struct dpp_hash_zreg_mono_stat +{ + ZXIC_UINT32 zblk_id; + ZXIC_UINT32 zreg_id; +}DPP_HASH_ZREG_MONO_STAT; + +typedef struct dpp_hash_bulk_zcam_stat +{ + ZXIC_UINT32 zcell_mono_idx[SE_ZBLK_NUM*SE_ZCELL_NUM]; + DPP_HASH_ZREG_MONO_STAT zreg_mono_id[SE_ZBLK_NUM][SE_ZREG_NUM]; +}DPP_HASH_BULK_ZCAM_STAT; + +typedef struct dpp_hash_stat +{ + ZXIC_UINT32 insert_ok; + ZXIC_UINT32 insert_fail; + ZXIC_UINT32 insert_same; + ZXIC_UINT32 insert_ddr; + ZXIC_UINT32 insert_zcell; + ZXIC_UINT32 insert_zreg; + + ZXIC_UINT32 delete_ok; + ZXIC_UINT32 delete_fail; + + ZXIC_UINT32 search_ok; + ZXIC_UINT32 search_fail; + + ZXIC_UINT32 zblock_num; + ZXIC_UINT32 zblock_array[SE_ZBLK_NUM]; + + DPP_HASH_TABLE_STAT insert_table[HASH_TBL_ID_NUM]; + DPP_HASH_BULK_ZCAM_STAT *p_bulk_zcam_mono[HASH_BULK_NUM]; +}DPP_HASH_STAT; + +typedef enum dpp_hash_itme_pos +{ + HASH_ITEM_POS_0 = 0, + HASH_ITEM_POS_1 = 1, + HASH_ITEM_POS_2 = 2, + HASH_ITEM_POS_3 = 3, + HASH_ITEM_POS_MAX = 4, +}DPP_HASH_ITME_POS; + +typedef enum dpp_hash_item_inst_mode +{ + HASH_ITEM_INSERT_LAST = 0, + HASH_ITEM_INSERT_1ST, + HASH_ITEM_INSERT_NULL +}DPP_HASH_ITEM_INST_MODE; + +/* hash 表项信息 */ +typedef struct dpp_hash_tbl_info +{ + ZXIC_UINT32 fun_id; + ZXIC_UINT32 actu_key_size; /**< @brief 实际键值长度,以1字节为单位 */ + ZXIC_UINT32 key_type; /**< @brief 表项长度类型: 1-128bit, 2-256bit, 3-512bit */ + ZXIC_UINT8 is_init; /**< @brief 是否初始化*/ + ZXIC_UINT8 mono_zcell; /**< @brief 是否有独占的zcell*/ + ZXIC_UINT8 zcell_num; /**< @brief 独占的zcell的数目*/ + ZXIC_UINT8 mono_zreg; /**< @brief 是否有独占的zcell*/ + ZXIC_UINT8 zreg_num; /**< @brief 独占的zcell的数目*/ + ZXIC_UINT8 is_age; /* 硬件老化标志,业务表支持硬件老化 */ + ZXIC_UINT8 is_lrn; /* 硬件学习标志,业务表支持硬件学习 */ + ZXIC_UINT8 is_mc_wrt; /* 微码写表标志,业务表支持微码写表 */ + //ZXIC_UINT8 pad[3]; +}DPP_HASH_TBL_ID_INFO; + +typedef struct dpp_hash_rbkey_info +{ + ZXIC_UINT8 key[HASH_KEY_MAX]; + ZXIC_UINT8 rst[HASH_RST_MAX]; + D_NODE entry_dn; + SE_ITEM_CFG *p_item_info; +/* ZXIC_UINT32 rb_idx;*/ + ZXIC_UINT32 entry_size; /* 条目宽度,以字节为单位 */ + ZXIC_UINT32 entry_pos; /* 条目在item中的起始位置,以128bit为偏移单位 */ +}DPP_HASH_RBKEY_INFO; + +/* DDR*/ +typedef struct hash_ddr_cfg +{ + ZXIC_UINT32 bulk_use; /**< @brief 该hash引擎bulk空间是否已经使用*/ + ZXIC_UINT32 ddr_baddr; /**< @brief 分配给hash的DDR空间的硬件基地址*/ + ZXIC_UINT32 ddr_ecc_en; /**< @brief DDR ECC使能: 0-不使能,1-使能*/ + ZXIC_UINT32 item_num; /**< @brief 硬件分配的ddr存储单元数目,以位宽为单位*/ + ZXIC_UINT32 bulk_id; /**< @brief DDR空间编号*/ + ZXIC_UINT32 hash_ddr_arg; /**< @brief hash ddr CRC 计算式*/ + ZXIC_UINT32 width_mode; /**< @brief ddr3 位宽*/ + ZXIC_UINT32 hw_baddr; /**< @brief ddr3 存储单元起始偏移,以256bit为单位*/ + ZXIC_UINT32 zcell_num; /*cpu 软复位 存储记录该参数*/ + ZXIC_UINT32 zreg_num; /*cpu 软复位 存储记录该参数*/ + + SE_ITEM_CFG **p_item_array; /**< @brief 指向数组指针的指针*/ +}HASH_DDR_CFG; + +#define HASH_ADDR_EXT_FLAG_BT_OFF (31) +#define HASH_ADDR_WRT_MASK_BT_OFF (27) +#define HASH_ADDR_BT_OFF (1) +#define HASH_ADDR_DDR_BT_LEN (26) +#define HASH_ADDR_ZCAM_BT_LEN (17) +typedef struct dpp_hash_wrt_lrn_rsp +{ + ZXIC_UINT8 space_vld; /* 仅硬件学习时此标志有效 */ + ZXIC_UINT8 ext_flag; /* 软件模拟硬件学习标志位*/ + ZXIC_UINT8 wrt_mask; + ZXIC_UINT8 width_flag; + ZXIC_UINT32 lrn_addr; +}DPP_HASH_WRT_LRN_RSP; + +typedef struct dpp_hash_cfg +{ + ZXIC_UINT32 fun_id; + ZXIC_UINT8 ddr_valid; /* 是否使用DDR表项 */ + ZXIC_UINT8 pad[3]; + HASH_FUNCTION32 p_hash32_fun; + HASH_FUNCTION p_hash16_fun; + + HASH_DDR_CFG *p_bulk_ddr_info[HASH_BULK_NUM]; /* 每个DDR空间的配置*/ + ZXIC_UINT8 bulk_ram_mono[HASH_BULK_NUM]; /* 每个ZCAM空间独占标志*/ + SHARE_RAM hash_shareram; /* 共享的ZCAM资源 */ + DPP_SE_CFG *p_se_info; + + ZXIC_RB_CFG hash_rb; + ZXIC_RB_CFG ddr_cfg_rb; + DPP_HASH_STAT hash_stat; +}DPP_HASH_CFG; + +typedef struct hash_entry_cfg +{ + ZXIC_UINT32 fun_id; + ZXIC_UINT8 bulk_id; + ZXIC_UINT8 table_id; + ZXIC_UINT8 key_type; + ZXIC_UINT8 rsp_mode; + ZXIC_UINT32 actu_key_size; + ZXIC_UINT32 key_by_size; + ZXIC_UINT32 rst_by_size; + DPP_SE_CFG *p_se_cfg; + DPP_HASH_CFG *p_hash_cfg; + DPP_HASH_RBKEY_INFO *p_rbkey_new; + ZXIC_RB_TN *p_rb_tn_new; +}HASH_ENTRY_CFG; + +#define DPP_GET_HASH_KEY_CTRL(valid, type, tbl_id) (((valid & 0x1) << 7) | ((type & 0x3) << 5) | (tbl_id & 0x1f)) +#define DPP_GET_HASH_TBL_ID(p_key) ((p_key)[0] & 0x1F) +#define DPP_GET_HASH_KEY_TYPE(p_key) (((p_key)[0] >> 5) & 0x3) +#define DPP_GET_HASH_KEY_VALID(p_key) (((p_key)[0] >> 7) & 0x1) + +/** 根据hash的类型获取其字节数,返回值包括16B,32B和64B,或者0*/ +#define DPP_GET_HASH_ENTRY_SIZE(key_type) \ + ((key_type == HASH_KEY_128b)?16U: \ + ((key_type == HASH_KEY_256b)?32U: \ + ((key_type == HASH_KEY_512b)?64U:0))) + +#define DPP_GET_ACTU_KEY_BY_SIZE(actu_key_size) \ + (actu_key_size * HASH_ACTU_KEY_STEP) + +#define DPP_GET_KEY_SIZE(actu_key_size) \ + (DPP_GET_ACTU_KEY_BY_SIZE(actu_key_size) + HASH_KEY_CTR_SIZE) +#define DPP_GET_RST_SIZE(key_type, actu_key_size) \ + ((DPP_GET_HASH_ENTRY_SIZE(key_type) != 0)? \ + (DPP_GET_HASH_ENTRY_SIZE(key_type) - DPP_GET_ACTU_KEY_BY_SIZE(actu_key_size) - HASH_KEY_CTR_SIZE): 0xFF) /* modify coverity kfr 2022.05.31 */ + +#define DPP_GET_HASH_RB_KEY(p_hash_rb, idx) \ + ((p_hash_rb)->p_keybase + ((p_hash_rb)->key_size * (idx))) + +#define DPP_GET_DDR_WR_MODE(key_type) ((key_type == HASH_KEY_512b)?key_type : (key_type - 1)) + +/** 根据条目位宽和起始的位置获取写入掩码 */ +#define DPP_GET_HASH_ENTRY_MASK(entry_size, entry_pos) \ + ((((1U << (entry_size/16U)) - 1U) << (4U - entry_size/16U - entry_pos)) & 0xF) + +DPP_STATUS dpp_hash_zblkcfg_write(DPP_SE_CFG *p_se_cfg, ZXIC_UINT32 fun_id, SE_ZBLK_CFG *p_zblk_cfg); + +DPP_STATUS dpp_hash_bulk_mono_flags_write(DPP_SE_CFG *p_se_cfg, ZXIC_UINT32 hash_id, ZXIC_UINT32 bulk_id); + +DPP_STATUS dpp_hash_zcell_mono_write(DPP_SE_CFG *p_se_cfg, SE_ZCELL_CFG *p_zcell_cfg); + +DPP_STATUS dpp_hash_zreg_mono_write(DPP_SE_CFG *p_se_cfg, + ZXIC_UINT32 tbl_id, + ZXIC_UINT32 zblk_idx, + ZXIC_UINT32 zreg_id); + +DPP_STATUS dpp_hash_ext_cfg_write(DPP_SE_CFG *p_se_cfg, + ZXIC_UINT32 fun_id, + ZXIC_UINT32 bulk_id, + HASH_DDR_CFG *p_ddr_cfg); + +DPP_STATUS dpp_hash_ext_cfg_clr(DPP_SE_CFG *p_se_cfg, ZXIC_UINT32 fun_id); + +DPP_STATUS dpp_hash_tbl_depth_write(DPP_SE_CFG *p_se_cfg, + ZXIC_UINT32 fun_id, + ZXIC_UINT32 bulk_id, + HASH_DDR_CFG *p_ddr_cfg); + +DPP_STATUS dpp_hash_tbl_depth_clr(DPP_SE_CFG *p_se_cfg, ZXIC_UINT32 fun_id); + +DPP_STATUS dpp_hash_tbl_crc_poly_write(DPP_SE_CFG *p_se_cfg, + ZXIC_UINT32 fun_id, + ZXIC_UINT32 bulk_id, + ZXIC_UINT32 crc_sel); + +ZXIC_SINT32 dpp_hash_rb_key_cmp(ZXIC_VOID *p_new, ZXIC_VOID *p_old, ZXIC_UINT32 key_size); + +DPP_STATUS dpp_hash_insrt_to_item(DPP_HASH_CFG *p_hash_cfg, + DPP_HASH_RBKEY_INFO *p_rbkey, + SE_ITEM_CFG *p_item, + ZXIC_UINT32 item_idx, + ZXIC_UINT32 item_type, + ZXIC_UINT32 insrt_key_type); + +DPP_STATUS dpp_hash_red_black_node_alloc(DPP_DEV_T *dev,ZXIC_RB_TN **p_rb_tn_new,DPP_HASH_RBKEY_INFO **p_rbkey_new); + +DPP_STATUS dpp_hash_rb_insert(DPP_DEV_T *dev,HASH_ENTRY_CFG *p_hash_entry_cfg,DPP_HASH_ENTRY *p_entry); + +DPP_STATUS dpp_hash_set_crc_key(DPP_DEV_T *dev,HASH_ENTRY_CFG *p_hash_entry_cfg,DPP_HASH_ENTRY *p_entry,ZXIC_UINT8 *p_temp_key); + +DPP_STATUS dpp_hash_insert_ddr(DPP_DEV_T *dev,HASH_ENTRY_CFG *p_hash_entry_cfg,ZXIC_UINT8 *p_temp_key,ZXIC_UINT8 *p_end_flag); + +DPP_STATUS dpp_hash_insert_zcell(DPP_DEV_T *dev,DPP_SE_CFG *p_se_cfg,HASH_ENTRY_CFG *p_hash_entry_cfg,ZXIC_UINT8 *p_temp_key,ZXIC_UINT8 *p_end_flag); + +DPP_STATUS dpp_hash_insert_zreg(DPP_DEV_T *dev,HASH_ENTRY_CFG *p_hash_entry_cfg,ZXIC_UINT8 *p_temp_key,ZXIC_UINT8 *p_end_flag); + +/***********************************************************/ +/** 清除hash引擎的所有hash表项(清除软件配置) +* @param p_se_cfg +* @param hash_id +* @param bulk_id +* +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/18 +************************************************************/ +DPP_STATUS dpp_hash_soft_all_entry_delete(DPP_SE_CFG *p_se_cfg,ZXIC_UINT32 hash_id); + +DPP_STATUS dpp_hash_get_hash_info_from_sdt(ZXIC_UINT32 dev_id, ZXIC_UINT32 sdt_no, HASH_ENTRY_CFG *p_hash_entry_cfg); + +DPP_STATUS dpp_hash_soft_uninstall(ZXIC_UINT32 dev_id); + +DPP_STATUS dpp_one_hash_soft_uninstall(ZXIC_UINT32 dev_id,ZXIC_UINT32 hash_id); + +#endif /* dpp_hash.h */ diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/se/dpp_hash_crc.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/se/dpp_hash_crc.h new file mode 100755 index 0000000..33fde70 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/se/dpp_hash_crc.h @@ -0,0 +1,16 @@ +#ifndef _DPP_HASH_CRC_H_ +#define _DPP_HASH_CRC_H_ + +#define MAX_CRC_WIDTH (20) + +ZXIC_UINT32 dpp_crc32_calc(ZXIC_UINT8 *pInputKey,ZXIC_UINT32 dwByteNum,ZXIC_UINT32 dwCrcPoly); + +ZXIC_UINT16 dpp_crc16_calc(ZXIC_UINT8 *pInputKey,ZXIC_UINT32 dwByteNum,ZXIC_UINT16 dwCrcPoly); + +ZXIC_UINT16 dpp_crc16_get_idx(ZXIC_UINT16 crc_val); + +ZXIC_UINT16 dpp_crc16_table_lookup(ZXIC_UINT8 *pInputKey, ZXIC_UINT32 dwByteNum, ZXIC_UINT16 dwCrcPoly); + +#endif + + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/se/dpp_se_cfg.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/se/dpp_se_cfg.h new file mode 100755 index 0000000..7f66a22 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/table/se/dpp_se_cfg.h @@ -0,0 +1,279 @@ +/***************************************************************************** + * 版权所有 (C)2001-2015, 深圳市中兴通讯股份有限公司。 + * + * 文件名称: dpp_se_cfg.h + * 文件标识: SE配置部分头文件 + * 内容摘要: + * 其它说明: + * 当前版本: + * 作 者: ChenWei10088471 + * 完成日期: + * 当前责任人-1: + * 当前责任人-2: + * + * DEPARTMENT : ASIC_FPGA_R&D_Dept + * MANUAL_PERCENT : 100% + *****************************************************************************/ + +#ifndef _DPP_SE_CFG_H_ +#define _DPP_SE_CFG_H_ + +#include "dpp_se_api.h" + + +#define DPP_WRITE_FILE_EN (0) + +#define LPM_OPTIMIZE_EZXIC_VOLUTION_TIME_SET_EN (0) + +#define SE_ITEM_WIDTH_MAX (64) /* 单条item最大宽度, 以字节为单位 */ +#define SE_ENTRY_WIDTH_MAX (64) /* 单条entry最大宽度, 以字节为单位 */ + +#define SE_RAM_WIDTH (512) + +#define IPV4_DDR_WIDTH (256) +#define IPV6_DDR_WIDTH (512) +#define IPV6_DDR_WIDTH_LR (384) /*线速宽度为384*/ + +#define ROUTE_DEFAULT_REG_NUM (8) +#define ZBLK_LAST_INDREG_ADDR (0x15) +#define ZBLK_ECC_STATU_REG_ADDR (0x11) +#define ZBLK_HASH_LIST_REG0_ADDR (0xd) +#define ZBLK_HASH_LIST_REG3_ADDR (0x10) + +#define ZCELL_ADDR_BT_START (0) +#define ZCELL_ADDR_BT_WIDTH (9) +#define ZCELL_IDX_BT_START (9) +#define ZCELL_IDX_BT_WIDTH (2) +#define ZBLK_IDX_BT_START (11) +#define ZBLK_IDX_BT_WIDTH (3) +#define ZGRP_IDX_BT_START (14) +#define ZGRP_IDX_BT_WIDTH (2) +#define REG_SRAM_FLAG_BT_START (16) +#define REG_SRAM_FLAG_BT_WIDTH (1) +#define ZBLK_WRT_MASK_BT_START (17) +#define ZBLK_WRT_MASK_BT_WIDTH (4) + +#define ZBLK_NUM_PER_ZGRP (8) + +/*片外部分*/ +#define SE_DDR_WIDTH (128) + + +struct def_route_info; + + +/*HASH 函数部分*/ +typedef ZXIC_UINT16 (*HASH_FUNCTION)(ZXIC_UINT8 *pkey,ZXIC_UINT32 width,ZXIC_UINT16 arg); +typedef ZXIC_UINT32 (*HASH_FUNCTION32)(ZXIC_UINT8 *pkey,ZXIC_UINT32 width,ZXIC_UINT32 arg); + +typedef ZXIC_UINT32 (*WR_PROCESS) (ZXIC_UINT8*p_buff, ZXIC_UINT32 size); + + +typedef enum file_type +{ + FILE_TYPE_REG = 0, + FILE_TYPE_RAM, + FILE_TYPE_ZBLK_CFG, + FILE_TYPE_ZCELL_CFG, + FILE_TYPE_DEF_ROUTE, + FILE_TYPE_DDR256, + FILE_TYPE_DDR512, + FILE_TYPE_V6CMP_CFG, + FILE_TYPE_V4CMP_CFG, + FILE_TYPE_DDR128, +}FILE_TYPE; + +typedef enum se_item_type +{ + ITEM_INVALID = 0, + ITEM_RAM, + ITEM_DDR_256, + ITEM_DDR_512, + ITEM_REG, +}SE_ITEM_TYPE; + + +typedef enum se_fun_type +{ + FUN_HASH = 1, + FUN_LPM, + FUN_ACL, + FUN_MAX +}SE_FUN_TYPE; + + +typedef struct file_info +{ + ZXIC_FILE *fp; + ZXIC_UINT32 f_status; /*1 open, 0 close*/ +}FILE_INFO; + +typedef struct file_mng +{ + ZXIC_RB_CFG rb_fn; + FILE_INFO *p_fi; +}SE_FILE_MNG; + + +#define ZBLK_CFG_BASE (0x8000) +#define SERVICE_REG_ADDR (0) +#define MASK_REG_ADDR (1) +#define DEFAULT_REG_ADDR (5) +#define V6CMP_REG_ADDR (0x12) +#define V4CMP_REG_ADDR (0x13) + +#define GET_ZBLK_IDX(zcell_idx) \ + (((zcell_idx) & 0x7F) >> 2) + +#define GET_ZCELL_IDX(zcell_idx) \ + ((zcell_idx) & 0x3) + +#define DPP_SE_GET_ZBLK_CFG(p_se,zblk_idx) \ + (&(((DPP_SE_CFG*)(p_se))->zblk_info[zblk_idx])) + +#define DPP_SE_GET_ZCELL_CFG(p_se,zcell_idx) \ + (&(((DPP_SE_CFG*)(p_se))->zblk_info[GET_ZBLK_IDX(zcell_idx)].zcell_info[GET_ZCELL_IDX(zcell_idx)])) + +#define DPP_GET_FUN_INFO(p_se,fun_id) \ + (&(((DPP_SE_CFG*)(p_se))->fun_info[fun_id])) + + +#define ZBLK_CHECK_FULL(p_zblk_cfg) \ + (((((SE_ZBLK_CFG*)(p_zblk_cfg))->zcell_bm & 0xF )== 0xF ) ? 1 : 0 ) + +#define GET_ZCELL_CRC_VAL(zcell_id, crc16_val) \ + (((crc16_val) >> (zcell_id)) & (SE_RAM_DEPTH - 1)) + +#define ZBLK_ADDR_CONV(zblk_idx) \ + (((zblk_idx) / ZBLK_NUM_PER_ZGRP) * (1 << ZBLK_IDX_BT_WIDTH) + (zblk_idx)%ZBLK_NUM_PER_ZGRP) + +#define ZCELL_ADDR_CONV(zcell_idx) \ + ((ZBLK_ADDR_CONV(((zcell_idx) >> ZCELL_IDX_BT_WIDTH) & ((1<<(ZBLK_IDX_BT_WIDTH+ZGRP_IDX_BT_WIDTH))-1)) << ZCELL_IDX_BT_WIDTH) | ((zcell_idx) & ((1<is_used)\ + {\ + ZXIC_COMM_TRACE_ERROR("\n Error[0x%x],is_used Fun_id is invalid,(p_func_id)->is_used is [%d]",DPP_SE_RC_FUN_INVALID,(p_func_id)->is_used);\ + return DPP_SE_RC_FUN_INVALID;\ + }\ + else if ((p_func_id)->fun_id != (id))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n Error[0x%x],fun_id != (id) Fun_id is invalid;p_func_id->fun_id is [%d]",DPP_SE_RC_FUN_INVALID,(p_func_id)->fun_id);\ + return DPP_SE_RC_FUN_INVALID;\ + }\ + else if (!(p_func_id)->fun_ptr)\ + {\ + ZXIC_COMM_TRACE_ERROR("\n Error[0x%x],fun_ptr Fun_id is invalid",DPP_SE_RC_FUN_INVALID);\ + return DPP_SE_RC_FUN_INVALID;\ + }\ + else if ((p_func_id)->fun_type != (type))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n Error[0x%x],type Fun_id is invalid",DPP_SE_RC_FUN_INVALID);\ + return DPP_SE_RC_FUN_INVALID;\ + }\ + }while (0) + +#define DPP_SE_CHECK_FUN_MEMORY_FREE(p_func_id,id,type,ptr) \ + do{\ + if (!(p_func_id)->is_used)\ + {\ + ZXIC_COMM_TRACE_ERROR("\n Error[0x%x],is_used Fun_id is invalid,(p_func_id)->is_used is [%d]",DPP_SE_RC_FUN_INVALID,(p_func_id)->is_used);\ + ZXIC_COMM_FREE(ptr);\ + return DPP_SE_RC_FUN_INVALID;\ + }\ + else if ((p_func_id)->fun_id != (id))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n Error[0x%x],fun_id != (id) Fun_id is invalid;p_func_id->fun_id is [%d]",DPP_SE_RC_FUN_INVALID,(p_func_id)->fun_id);\ + ZXIC_COMM_FREE(ptr);\ + return DPP_SE_RC_FUN_INVALID;\ + }\ + else if (!(p_func_id)->fun_ptr)\ + {\ + ZXIC_COMM_TRACE_ERROR("\n Error[0x%x],fun_ptr Fun_id is invalid",DPP_SE_RC_FUN_INVALID);\ + ZXIC_COMM_FREE(ptr);\ + return DPP_SE_RC_FUN_INVALID;\ + }\ + else if ((p_func_id)->fun_type != (type))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n Error[0x%x],type Fun_id is invalid",DPP_SE_RC_FUN_INVALID);\ + ZXIC_COMM_FREE(ptr);\ + return DPP_SE_RC_FUN_INVALID;\ + }\ + }while (0) + +#define DPP_SE_CHECK_FUN_MUTEX_UNLOCK(p_func_id, id, type, mutex) \ +do{\ + if (!(p_func_id)->is_used)\ + {\ + ZXIC_COMM_TRACE_ERROR("\n Error[0x%x],is_used Fun_id is invalid,(p_func_id)->is_used is [%d]", DPP_SE_RC_FUN_INVALID,(p_func_id)->is_used);\ + zxic_comm_mutex_unlock(mutex);\ + return DPP_SE_RC_FUN_INVALID;\ + }\ + else if ((p_func_id)->fun_id != (id))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n Error[0x%x],fun_id != (id) Fun_id is invalid;p_func_id->fun_id is [%d]", DPP_SE_RC_FUN_INVALID,(p_func_id)->fun_id);\ + zxic_comm_mutex_unlock(mutex);\ + return DPP_SE_RC_FUN_INVALID;\ + }\ + else if (!(p_func_id)->fun_ptr)\ + {\ + ZXIC_COMM_TRACE_ERROR("\n Error[0x%x],fun_ptr Fun_id is invalid", DPP_SE_RC_FUN_INVALID);\ + zxic_comm_mutex_unlock(mutex);\ + return DPP_SE_RC_FUN_INVALID;\ + }\ + else if ((p_func_id)->fun_type != (type))\ + {\ + ZXIC_COMM_TRACE_ERROR("\n Error[0x%x],type Fun_id is invalid", DPP_SE_RC_FUN_INVALID);\ + zxic_comm_mutex_unlock(mutex);\ + return DPP_SE_RC_FUN_INVALID;\ + }\ + }while (0) + + +#define DPP_SE_HW_POS(x) (SE_RAM_WIDTH - 1 -(x)) + +#define DPP_SE_ZBLK_OUT_DDR_V6_START (0) +#define DPP_SE_ZBLK_OUT_DDR_V6_END (0) + +#define DPP_SE_ZBLK_OUT_DDR_V4_START (0) +#define DPP_SE_ZBLK_OUT_DDR_V4_END (0) + +#define DPP_SE_ZBLK_SERVICE_TYPE_START (3) +#define DPP_SE_ZBLK_SERVICE_TYPE_END (3) + +#define DPP_SE_ZBLK_HASH_CHAN_START (2) +#define DPP_SE_ZBLK_HASH_CHAN_END (1) + +#define DPP_SE_ZBLK_HW_POS_EN_START (0) +#define DPP_SE_ZBLK_HW_POS_EN_END (0) + +#endif + + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/tm/dpp_tm.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/tm/dpp_tm.h new file mode 100755 index 0000000..35c2a90 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/module/tm/dpp_tm.h @@ -0,0 +1,4917 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_tm.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : djf +* 完成日期 : 2014/02/25 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ +#ifndef _DPP_ETM_H_ +#define _DPP_ETM_H_ + + +#include "dpp_tm_api.h" +#include "dpp_etm_reg.h" +#if ZXIC_REAL("ETM_MACRO") +/****************************************************************************** + * START: 宏定义 * + *****************************************************************************/ +#define ETM_WRITE_CHECK (1) +#define DPP_TM_CGAVD_KILO_UL (1024)/* Kbyte和byte换算 */ +#define DPP_TM_CGAVD_TD_MAX (16*512) +/* CIR颗粒度: bps */ +#define DPP_TM_SHAPE_CIR_STEP ((ZXIC_DOUBLE) 400 * 1000 * 1000 * 1000 / 0x3FFFFFE) +//#define DPP_TM_SHAPE_CIR_STEP (160069565217 / 0x3FFFFFE) +/* EIR颗粒度: bps */ +//define DPP_TM_SHAPE_EIR_STEP ((ZXIC_FLOAT) 160 * 1000 * 1000 * 1000 / 0x3FFFFFE) +#define DPP_TM_SHAPE_EIR_STEP (160 * 1000 * 1000 * 1000 / 0x3FFFFFE) +#define DPP_TM_SHAPE_DEFAULT_CBS (20)/*寄存器写入CBS的最小值,小于该值时,整形不准*/ +#define DPP_TM_KILO_UL (1024) +#define DPP_TM_KILO_ULL (1000) +#define DPP_TM_QMU_PORT_SHAP_MAG (1.03) +#define DPP_ETM_SA_EGRS_MAX_PORTID (66) +/*cfgmt_byte_mode:0:block mode 1:byte mode*/ +#define DPP_TM_CGAVD_BLOCK_MODE (0) +#define DPP_TM_CGAVD_ZXIC_UINT8_MODE (1) + +/*shap整形模板最大值:每2K流或调度器一一映射一块令牌桶资源,每块资源拥有0-127个模板*/ +/*ETM 0xABFF/2K = 21 */ +#define DPP_ETM_SHAP_TABEL_ID_MAX (22) +/*FTM 0x17FF/2K = 2 */ +#define DPP_FTM_SHAP_TABEL_ID_MAX (3) +#define DPP_TM_SHAP_MAP_ID_MAX (128) + +/****************************************************************************** + * END: 宏定义 * + *****************************************************************************/ +#endif /* ETM_MACRO */ + + + +#if ZXIC_REAL("ETM_STRUCT") +/****************************************************************************** + * START: 类型定义 * + *****************************************************************************/ +/* block长度模式 */ +typedef enum dpp_tm_blk_size_e +{ + DPP_ETM_BLK_SIZE_128_B = 0, + DPP_ETM_BLK_SIZE_256_B, + DPP_ETM_BLK_SIZE_512_B, + DPP_ETM_BLK_SIZE_1024_B, + DPP_ETM_BLK_SIZE_INVALID +} DPP_ETM_BLK_SIZE_E; + +/* 动态门限放大因子参数 */ +typedef struct dpp_tm_amplify_gene_para_t +{ + ZXIC_UINT32 amplify_gene[16]; +} DPP_ETM_AMPLIFY_GENE_PARA_T; + +/* 等价包长阈值 */ +typedef struct dpp_tm_equal_pkt_len_th_para_t +{ + ZXIC_UINT32 equal_pkt_len_th[7]; +} DPP_ETM_EQUAL_PKT_LEN_TH_PARA_T; + +/* 等价包长*/ +typedef struct dpp_tm_equal_pkt_len_para_t +{ + ZXIC_UINT32 equal_pkt_len[8]; +} DPP_ETM_EQUAL_PKT_LEN_PARA_T; + +/*ETM_STRUCT_STAT */ +typedef enum dpp_tm_cgavd_stat_qnum_e +{ + DPP_ETM_CGAVD_STAT_QNUM1 = 0, + DPP_ETM_CGAVD_STAT_QNUM2 = 1, + DPP_ETM_CGAVD_STAT_QNUM_INVALID +} DPP_ETM_CGAVD_STAT_QNUM_E; + +typedef enum dpp_tm_cgavd_stat_mode_e +{ + DPP_ETM_CGAVD_STAT_ALL_QUEUE = 0, + DPP_ETM_CGAVD_STAT_ONE_QUEUE = 1, + DPP_ETM_CGAVD_STAT_MODE_INVALID +} DPP_ETM_CGAVD_STAT_MODE_E; + + +typedef struct dpp_tm_cgavd_stat_para_t +{ + DPP_ETM_CGAVD_STAT_MODE_E mode; + ZXIC_UINT32 q_id; +} DPP_ETM_CGAVD_STAT_PARA_T; + +typedef struct dpp_tm_cgavd_stat_info_t +{ + DPP_ETM_CGAVD_STAT_MODE_E mode; + ZXIC_UINT32 q_id; + ZXIC_UINT32 lif_in_pkt_num; + ZXIC_UINT32 enqueue_pkt_num; + ZXIC_UINT32 dequeue_pkt_num; + ZXIC_UINT32 td_drop_pkt_num; + ZXIC_UINT32 wred_drop_pkt_num; + ZXIC_UINT32 wred_dpi_pkt_num[8]; + ZXIC_UINT32 gred_drop_pkt_num; + ZXIC_UINT32 gred_dpi_pkt_num[8]; +} DPP_ETM_CGAVD_STAT_INFO_T; + +typedef struct dpp_tm_qmu_stat_info_t +{ + ZXIC_UINT32 fc_cnt_mode; + ZXIC_UINT32 mmu_qmu_wr_fc_cnt; + ZXIC_UINT32 mmu_qmu_rd_fc_cnt; + ZXIC_UINT32 qmu_cgavd_fc_cnt; + ZXIC_UINT32 cgavd_qmu_pkt_cnt; + ZXIC_UINT32 cgavd_qmu_pktlen_all; + ZXIC_UINT32 cgavd_qmu_drop_tap; + ZXIC_UINT32 last_drop_qnum; + ZXIC_UINT32 crdt_qmu_credit_cnt; + ZXIC_UINT32 qmu_to_qsch_report_cnt; + ZXIC_UINT32 qmu_to_cgavd_report_cnt; + ZXIC_UINT32 qmu_crdt_crs_normal_cnt; + ZXIC_UINT32 qmu_crdt_crs_off_cnt; + ZXIC_UINT32 qsch_qlist_shedule_cnt; + ZXIC_UINT32 qsch_qlist_sch_ept_cnt; + ZXIC_UINT32 qmu_to_mmu_blk_wr_cnt; + ZXIC_UINT32 qmu_to_csw_blk_rd_cnt; + ZXIC_UINT32 qmu_to_mmu_sop_wr_cnt; + ZXIC_UINT32 qmu_to_mmu_eop_wr_cnt; + ZXIC_UINT32 qmu_to_mmu_drop_wr_cnt; + ZXIC_UINT32 qmu_to_csw_sop_rd_cnt; + ZXIC_UINT32 qmu_to_csw_eop_rd_cnt; + ZXIC_UINT32 qmu_to_csw_drop_rd_cnt; + ZXIC_UINT32 mmu_to_qmu_wr_release_cnt; + ZXIC_UINT32 mmu_to_qmu_rd_release_cnt; +} DPP_ETM_QMU_STAT_INFO_T; + +typedef struct dpp_tm_qmu_spec_q_stat_info_t +{ + ZXIC_UINT32 observe_portfc_spec; + ZXIC_UINT32 spec_lif_portfc_count; + ZXIC_UINT32 observe_qnum_set; + ZXIC_UINT32 spec_q_pkt_received; + ZXIC_UINT32 spec_q_pkt_dropped; + ZXIC_UINT32 spec_q_pkt_scheduled; + ZXIC_UINT32 spec_q_wr_cmd_sent; + ZXIC_UINT32 spec_q_rd_cmd_sent; + ZXIC_UINT32 spec_q_pkt_enq; + ZXIC_UINT32 spec_q_pkt_deq; + ZXIC_UINT32 spec_q_crdt_uncon_received; + ZXIC_UINT32 spec_q_crdt_cong_received; + ZXIC_UINT32 spec_q_crs_normal_cnt; + ZXIC_UINT32 spec_q_crs_off_cnt; +} DPP_ETM_QMU_SPEC_Q_STAT_INFO_T; + +typedef struct dpp_tm_qmu_spec_bat_stat_info_t +{ + ZXIC_UINT32 observe_batch_set; + ZXIC_UINT32 spec_bat_pkt_received; + ZXIC_UINT32 spec_bat_pkt_dropped; + ZXIC_UINT32 spec_bat_blk_scheduled; + ZXIC_UINT32 spec_bat_wr_cmd_sent; + ZXIC_UINT32 spec_bat_rd_cmd_sent; + ZXIC_UINT32 spec_bat_pkt_enq; + ZXIC_UINT32 spec_bat_pkt_deq; + ZXIC_UINT32 spec_bat_crdt_uncon_received; + ZXIC_UINT32 spec_bat_crdt_cong_received; + ZXIC_UINT32 spec_bat_crs_normal_cnt; + ZXIC_UINT32 spec_bat_crs_off_cnt; +} DPP_ETM_QMU_SPEC_BAT_STAT_INFO_T; + +typedef struct qmu_port_shape_para +{ + ZXIC_UINT32 shape_value_amplified; + ZXIC_UINT32 token_add_num; + ZXIC_UINT32 token_gap; +} QMU_PORT_SHAPE_PARA; + +/*etm 实际使用的ddr_attach、bank_num、depth(mmu中看到的)*/ +typedef struct dpp_etm_qmu_init_para +{ + ZXIC_UINT32 etm_mmu_ddr_attach; + ZXIC_UINT32 etm_mmu_bank_num; + ZXIC_UINT32 etm_mmu_depth; +} DPP_ETM_QMU_INIT_PARA; + +/*ftm 实际使用的ddr_attach、bank_num、depth(mmu中看到的)*/ +typedef struct dpp_ftm_qmu_init_para +{ + ZXIC_UINT32 ftm_mmu_ddr_attach; + ZXIC_UINT32 ftm_mmu_bank_num; + ZXIC_UINT32 ftm_mmu_depth; +} DPP_FTM_QMU_INIT_PARA; + +typedef struct dpp_tm_crdt_spwfq_start_num_t +{ + ZXIC_UINT32 start_num_fq; + ZXIC_UINT32 start_num_fq2; + ZXIC_UINT32 start_num_fq4; + ZXIC_UINT32 start_num_fq8; + ZXIC_UINT32 start_num_sp; + ZXIC_UINT32 start_num_wfq; + ZXIC_UINT32 start_num_wfq2; + ZXIC_UINT32 start_num_wfq4; + ZXIC_UINT32 start_num_wfq8; +} DPP_TM_CRDT_SPWFQ_START_NUM_T; + + +/****************************************************************************** + * END: 类型定义 * + *****************************************************************************/ +#endif + + + +#if ZXIC_REAL("ETM_FUNCTION") +/****************************************************************************** + * START: 函数声明 * + *****************************************************************************/ +/***********************************************************/ +/** 打印指定的全局数组值以及清空全局数组 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param para_x 数组index_x +* @param para_y 数组index_y +* @param clear_flag 清空shape全局数组 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark +* @see +* @author xuhb @date 2019/06/10 +************************************************************/ +DPP_STATUS dpp_tm_shape_para_array_prt(ZXIC_UINT32 dev_id, + ZXIC_UINT32 para_x, + ZXIC_UINT32 para_y, + ZXIC_UINT32 clear_flag); + +DPP_STATUS dpp_tm_qmu_qlist_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 ddr_num, + ZXIC_UINT32 bank_num_para, + ZXIC_UINT32 bank_vld, + ZXIC_UINT32 gene_para); + +DPP_STATUS dpp_tm_cgavd_td_th_together_wr(DPP_DEV_T *dev, + ZXIC_UINT32 level, + ZXIC_UINT32 id, + ZXIC_UINT32 td_th, + ZXIC_UINT32 num); + + +DPP_STATUS dpp_tm_cgavd_td_th_together_get(DPP_DEV_T *dev, + ZXIC_UINT32 level, + ZXIC_UINT32 id, + ZXIC_UINT32 num); + +DPP_STATUS dpp_tm_cgavd_dyn_th_en_set_more(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + ZXIC_UINT32 en, + ZXIC_UINT32 num); + +/***********************************************************/ +/** 配置基于优先级的QMU接收NPPU数据的fifo阈值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param sp 优先级0~7 +* @param th 指定优先级的fifo阈值0~511,单位为fifo条目,fifo深度512 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2016/10/18 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_move_drop_sp_th_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 sp, + ZXIC_UINT32 th); + + +DPP_STATUS dpp_tm_wred_dp_line_para_wr(ZXIC_UINT32 dev_id, + ZXIC_UINT32 level, + ZXIC_UINT32 wred_id, + ZXIC_UINT32 dp, + ZXIC_UINT32 max_th, + ZXIC_UINT32 min_th, + ZXIC_UINT32 max_p, + ZXIC_UINT32 weight, + ZXIC_UINT32 q_len_th); + + +DPP_STATUS dpp_tm_gred_dp_line_para_wr(ZXIC_UINT32 dev_id, + ZXIC_UINT32 dp, + ZXIC_UINT32 max_th, + ZXIC_UINT32 mid_th, + ZXIC_UINT32 min_th, + ZXIC_UINT32 max_p, + ZXIC_UINT32 weight, + ZXIC_UINT32 q_len_th); + +DPP_STATUS dpp_tm_crdt_idle_check(DPP_DEV_T *dev); + +/***********************************************************/ +/** 获取各调度器的起始编号(etm共25K=25600,ftm共1920个) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_spwfq_start_num 调度器起始编号结构体 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/28 +************************************************************/ +DPP_STATUS dpp_tm_crdt_wfqsp_get(DPP_DEV_T *dev, + DPP_TM_CRDT_SPWFQ_START_NUM_T *p_spwfq_start_num); + +/***********************************************************/ +/** 获取调度器挂接配置参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param se_id 调度器编号 +* @param p_se_para_tbl 调度器参数 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_se_para_get(DPP_DEV_T *dev, ZXIC_UINT32 se_id, DPP_ETM_CRDT_SE_PARA_TBL_T *p_se_para_tbl); + + + +/***********************************************************/ +/** 配置QMU工作模式,2M节点或4M节点 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param mode 0-第一种工作模式2M节点,1-第二种工作模式4M节点 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/25 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_qmu_work_mode_set(DPP_DEV_T *dev, DPP_TM_QMU_WORK_MODE_E mode); + +/***********************************************************/ +/** 读取QMU工作模式,2M节点或4M节点 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_mode 0-第一种工作模式2M节点,1-第二种工作模式4M节点 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/25 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_qmu_work_mode_get(DPP_DEV_T *dev, DPP_TM_QMU_WORK_MODE_E *p_mode); + +/***********************************************************/ +/** 配置本地sa_id,SA模式下需要配置 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param sa_id 配置的sa_id值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/25 ftm模式下使用 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_local_sa_id_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 sa_id); + +/***********************************************************/ +/** 读取本地sa_id,SA模式下有效 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_sa_id 读取的sa_id值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/25 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_local_sa_id_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_sa_id); + +/***********************************************************/ +/** CPU设置的各级队列深度配置 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* @param q_len_use_cpu_set_en 0:选取RAM中读出的队列深度; +* @param 1:选取q_len_cpu_set值 +* @param q_len_cpu_set CPU设置的各级队列深度,单位为block。 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/06/19 +************************************************************/ +DPP_STATUS dpp_tm_q_len_use_cpu_set(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 q_len_use_cpu_set_en, + ZXIC_UINT32 q_len_cpu_set); + +/***********************************************************/ +/** CPU设置的各级平均队列深度配置 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* @param q_avg_len_use_cpu_set_en 0:选取RAM中读出的队列深度; +* @param 1:选取q_avg_len_cpu_set值 +* @param q_avg_len_cpu_set CPU设置的各级平均队列深度。 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/06/19 +************************************************************/ +DPP_STATUS dpp_tm_q_avg_len_use_cpu_set(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 q_avg_len_use_cpu_set_en, + ZXIC_UINT32 q_avg_len_cpu_set); + +/***********************************************************/ +/** 配置QMU查询队列Qos开关 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param q_id: 队列号 +* @param qos_sign: qos开关 0:关闭 1:开启 +* @param +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/07/03 +************************************************************/ +DPP_STATUS dpp_tm_qmu_qos_sign_set(DPP_DEV_T *dev, + ZXIC_UINT32 q_id, + ZXIC_UINT32 qos_sign); + +/***********************************************************/ +/** 配置授权分发使能或者关闭 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param en 配置的值,0-关闭授权分发,1-使能授权分发 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/25 +************************************************************/ +DPP_STATUS dpp_tm_crdt_credit_en_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 en); + +/***********************************************************/ +/** 读取授权分发使能或者关闭 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_en 读出的值,0-关闭授权分发,1-使能授权分发 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/25 +************************************************************/ +DPP_STATUS dpp_tm_crdt_credit_en_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_en); + +/***********************************************************/ +/** 配置授权产生间隔 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param crdt_space_choose 授权发送间隔 0:固定16个周期 1:查表 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/10 +************************************************************/ +DPP_STATUS dpp_tm_crdt_space_choose_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 crdt_space_choose); + +/***********************************************************/ +/** 获得授权产生间隔 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param crdt_space_choose 授权发送间隔 0:固定16个周期 1:查表 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/10 +************************************************************/ +DPP_STATUS dpp_tm_crdt_space_choose_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_crdt_space_choose); + +/***********************************************************/ +/** 配置端口拥塞令牌桶使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param port_id 端口号:0~63 +* @param port_en 端口拥塞令牌桶使能,1表示不使用拥塞令牌桶的授权,0表示可以使用拥塞令牌桶授权 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/11 +************************************************************/ +DPP_STATUS dpp_tm_crdt_port_congest_en_set(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + ZXIC_UINT32 port_en); + +/***********************************************************/ +/** 获得端口拥塞令牌桶使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param port_id 端口号:0~120 +* @param p_port_en 端口拥塞令牌桶使能,1表示不使用拥塞令牌桶的授权,0表示可以使用拥塞令牌桶授权 +* +* @return +* @remark 无 +* @see +* @author djf @date 2015/03/11 +************************************************************/ +DPP_STATUS dpp_tm_crdt_port_congest_en_get(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + ZXIC_UINT32 *p_port_en); + +/***********************************************************/ +/** 流级中间级补充扫描机制使能配置 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param renew_scan_flow:0为不开启补充扫描 others:开启补充扫描,扫描间隔 +* @param renew_scan_mid:0为不开启补充扫描 others:开启补充扫描,扫描间隔 +* @param +* @return +* @remark 无 +* @see +* @author yjd @date 2015/07/03 +************************************************************/ +DPP_STATUS dpp_tm_crdt_renew_scan_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 renew_scan_flow, + ZXIC_UINT32 renew_scan_mid); + +/***********************************************************/ +/** 获取流级中间级补充扫描机制使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param renew_scan_flow:0为不开启补充扫描 others:开启补充扫描,扫描间隔 +* @param renew_scan_mid:0为不开启补充扫描 others:开启补充扫描,扫描间隔 +* @param +* @return +* @remark 无 +* @see +* @author yjd @date 2015/07/03 +************************************************************/ +DPP_STATUS dpp_tm_crdt_renew_scan_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *renew_scan_flow, + ZXIC_UINT32 *renew_scan_mid); + + +/***********************************************************/ +/**cpu配置flow_id的crs强制为normal或者off开关使能,用于检测SA模式下队列到授权流的多对一问题 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param flow_id:流号(和授权流号一一对应) +* en 强制配置crs的使能,0-不使能,1-使能 +* crs_value:强制配置crs的值2'b00:off; 2'b01:low; 2'b10:normal; +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/04/25 +************************************************************/ +DPP_STATUS dpp_tm_crdt_crs_sheild_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 flow_id, ZXIC_UINT32 en, ZXIC_UINT32 crs_value); + + +/***********************************************************/ +/**获取flow_id的crs强制为normal或者off开关使能,用于检测SA模式下队列到授权流的多对一问题 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param flow_id:流号(和授权流号一一对应) +* en 强制配置crs的使能,0-不使能,1-使能 +* crs_value:强制配置crs的值2'b00:off; 2'b01:low; 2'b10:normal; +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/04/25 +************************************************************/ +DPP_STATUS dpp_tm_crdt_crs_sheild_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_flow_id, ZXIC_UINT32 *p_en, ZXIC_UINT32 *p_crs_value); + +/***********************************************************/ +/** 控制授权速率的门限 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param index 0~6 +* @param rci_grade_th_0_data +* +* @return +* @remark 无 +* @see +* @author wush @date 2017/10/17 +************************************************************/ +DPP_STATUS dpp_tm_crdt_rci_grade_th_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 index, ZXIC_UINT32 rci_grade_th_0_data); + +DPP_STATUS dpp_tm_crdt_rci_grade_th_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 index, ZXIC_UINT32 *p_rci_grade_th_0_data); + + +/***********************************************************/ +/** 控制授权间隔的门限,建议大于等于0XF,不可取0; +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param index 0~7 +* @param asm_interval_0_data 控制授权间隔的门限,建议大于等于0XF,不可取0; +* +* @return +* @remark 无 +* @see +* @author wush @date 2017/10/17 +************************************************************/ +DPP_STATUS dpp_tm_crdt_asm_interval_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 index, ZXIC_UINT32 asm_interval_0_data); + +DPP_STATUS dpp_tm_crdt_asm_interval_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 index, ZXIC_UINT32 *p_asm_interval_0_data); + + +/***********************************************************/ +/** rci的级别 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_rci_grade_data +* +* @return +* @remark 无 +* @see +* @author wush @date 2017/10/17 +************************************************************/ +DPP_STATUS dpp_tm_crdt_rci_grade_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_rci_grade_data); + +DPP_STATUS dpp_tm_crdt_rci_value_r_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_crdt_rci_value_r_data); + +DPP_STATUS dpp_tm_crdt_interval_now_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_crdt_interval_now_data); + + +/***********************************************************/ +/** 配置crdt interval使能, +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param crdt_interval_en_cfg_data 授权分发间隔使能,1打开,0关闭 +* +* @return +* @remark 无 +* @see +* @author wush @date 2017/03/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_interval_en_cfg_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 crdt_interval_en_cfg_data); + +/***********************************************************/ +/**配置拥塞状态(有效链路数+UCN等级)到授权产生间隔的映射表 +* @param dev_id 设备编号 +* @param valid_serdes_num 有效的链路数(0~32) +* @param ucn_level UCN等级(0~7) +* @param cr_clk 授权产生间隔(0~0x3fffff) +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2017/03/28 +************************************************************/ +DPP_STATUS dpp_tm_crdt_cfgmt_interval_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 valid_serdes_num, + ZXIC_UINT32 ucn_level, + ZXIC_UINT32 cr_clk); + +/***********************************************************/ +/** 读取crdt interval使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param crdt_interval_en_cfg_data 授权分发间隔使能,1打开,0关闭 +* +* @return +* @remark 无 +* @see +* @author wush @date 2017/03/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_interval_en_cfg_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_crdt_interval_en_cfg_data); + + +/***********************************************************/ +/** 屏蔽ucn/asm_rdy的时能信号 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param ucn_rdy_shield_en 是否屏蔽ucn_rdy信号,1屏蔽,0不屏蔽 +* @param asm_rdy_shield_en 是否屏蔽asm_rdy信号,1屏蔽,0不屏蔽 +* +* @return +* @remark 无 +* @see +* @author wush @date 2017/10/17 +************************************************************/ +DPP_STATUS dpp_tm_crdt_ucn_asm_rdy_shield_en_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 ucn_rdy_shield_en, ZXIC_UINT32 asm_rdy_shield_en); + +DPP_STATUS dpp_tm_crdt_ucn_asm_rdy_shield_en_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_ucn_rdy_shield_en, ZXIC_UINT32 *p_asm_rdy_shield_en); + + +/***********************************************************/ +/** 配置QMU队列授权价值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param credit_value 授权价值,默认值是400Byte +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_qmu_credit_value_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 credit_value); + +/***********************************************************/ +/** QMU DDR随机模式时,DDR随机组配置 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param ddr_num ddr组数,1-6组 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_qmu_ddr_rand_grp_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 ddr_num); + +/***********************************************************/ +/** 配置QMU DDR BANK随机模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param ddr_random 模式:0-轮询模式;1-随机模式 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_qmu_ddr_random_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 ddr_random); + +/***********************************************************/ +/** QMU配置完成寄存器,在QMU链表和DDR随机模式寄存器写入后,将此寄存器写1,完成QMU配置 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_qmu_cfg_done_set(ZXIC_UINT32 dev_id); + + +/***********************************************************/ +/** 配置CRS的e桶产生的crbal门限值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param index crs组数:0~15 +* @param crs_th CRS产生的crbal门限值 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author xuhb @date 2021/02/14 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crs_eir_th_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 index, + ZXIC_UINT32 crs_th); + + +/***********************************************************/ +/** 配置CRS产生的crbal门限值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param index crs组数:0~15 +* @param crs_th CRS产生的crbal门限值 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/11 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crs_th_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 index, + ZXIC_UINT32 crs_th); + +/***********************************************************/ +/** 配置CRS产生的空队列确保门限值 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param que_type 队列类型编号(0~15) +* @param empty_que_ack_th 空队列确保授权门限 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/09 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crs_th2_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 que_type, + ZXIC_UINT32 empty_que_ack_th); + +/***********************************************************/ +/** 配置QMU端口间交织模式 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param pkt_blk_mode 交织模式: 1-按包交织; 0-按block交织SA模式只能配置为1 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author szq @date 2015/03/25 +************************************************************/ +DPP_STATUS dpp_tm_qmu_pkt_blk_mode_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 pkt_blk_mode); + +/***********************************************************/ +/** 获取QMU端口间交织模式 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param p_pkt_blk_mode 交织模式: 0-按包交织; 1-按block交织SA模式只能配置为1 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author szq @date 2015/03/25 +************************************************************/ +DPP_STATUS dpp_tm_qmu_pkt_blk_mode_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_pkt_blk_mode); + +/***********************************************************/ +/** 配置读命令老化使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param aged_en 读命令老化使能:0:不使能;1:使能 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/11 +************************************************************/ +DPP_STATUS dpp_tm_qmu_wr_aged_en_set(DPP_DEV_T *dev, ZXIC_UINT32 aged_en); + +/***********************************************************/ +/** 配置读命令老化速率 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param scan_time 读命令老化速率(扫描间隔时间) +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/11 +************************************************************/ +DPP_STATUS dpp_tm_qmu_wr_aged_scan_time_set(DPP_DEV_T *dev, ZXIC_UINT32 scan_time); + +/***********************************************************/ +/** 获得读命令老化速率 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_scan_time 读命令老化速率(扫描间隔时间) +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/11 +************************************************************/ +DPP_STATUS dpp_tm_qmu_wr_aged_scan_time_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_scan_time); + + +/***********************************************************/ +/** 配置QMU队列到目的SAId的映射ETM 模式没有, +FTM 模式才有1024个。 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param que_id 队列号 +* @param dest_said 目的said +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author szq @date 2015/04/08 +************************************************************/ +DPP_STATUS dpp_tm_qmu_qcfg_dest_id_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 que_id, ZXIC_UINT32 dest_said); + + +/***********************************************************/ +/** 获取QMU队列到目的SAId的映射ETM 模式没有, +FTM 模式才有1024个。 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param que_id 队列号 +* @param p_dest_said 目的said +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author szq @date 2015/04/08 +************************************************************/ +DPP_STATUS dpp_tm_qmu_qcfg_dest_id_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 que_id, ZXIC_UINT32 *p_dest_said); + +/***********************************************************/ +/** 配置出队暂存使用的进程总数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param used_inall 出队暂存使用的进程总数=19-N,默认3表示使用16个进程 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/18 +************************************************************/ +DPP_STATUS dpp_tm_qmu_pid_use_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 used_inall); + +/***********************************************************/ +/** 获得出队暂存使用的进程总数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_used_inall 出队暂存使用的进程总数=19-N,默认3表示使用16个进程 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/23 +************************************************************/ +DPP_STATUS dpp_tm_qmu_pid_use_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_used_inall); + +/***********************************************************/ +/** 配置出队暂存自回加进程总数阈值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param round_th 出队暂存自回加进程总数阈值=19-N,默认4表示使用15个进程就自回加 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/18 +************************************************************/ +DPP_STATUS dpp_tm_qmu_pid_round_th_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 round_th); + +/***********************************************************/ +/** 获得出队暂存自回加进程总数阈值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_round_th 出队暂存自回加进程总数阈值=19-N,默认4表示使用15个进程就自回加 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/23 +************************************************************/ + +DPP_STATUS dpp_tm_qmu_pid_round_th_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_round_th); + +/***********************************************************/ +/** 配置CRS发送强制使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param en 配置的值,0-不使能,1-使能 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crs_force_en_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 en); + +/***********************************************************/ +/** 配置CRS发送强制的队列 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param q_id 队列号 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crs_force_q_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 q_id); + + +/***********************************************************/ +/** 配置CRS发送强置的状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param crs_state CRS发送强置的状态 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/18 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crs_force_state_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 crs_state); + +/***********************************************************/ +/** 配置特定队列发送特定CRS +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param qnum 队列号 +* qcfg_qsch_crs_force_crs:CRS状态(0:off;1:normal。) + qcfg_qsch_crs_force_en:CRS发送强置使能(0:不使能;1:使能。) +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_qmu_qnum_crs_force(ZXIC_UINT32 dev_id, + ZXIC_UINT32 qnum, + ZXIC_UINT32 qcfg_qsch_crs_force_crs, + ZXIC_UINT32 qcfg_qsch_crs_force_en); + + +/***********************************************************/ +/** 配置CRS状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param qnum 队列号 +* @param state +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/19 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crs_state_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 qnum, + ZXIC_UINT32 state); + +/***********************************************************/ +/** 获得CRS状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param qnum 队列号 +* @param p_state +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/23 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crs_state_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 qnum, + ZXIC_UINT32 *p_state); + +/***********************************************************/ +/** 配置自动授权队列范围 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param first_que 自授权起始队列号 +* @param last_que 自授权终止队列号 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/19 +************************************************************/ +DPP_STATUS dpp_tm_qmu_auto_credit_que_set(DPP_DEV_T *dev, + ZXIC_UINT32 first_que, + ZXIC_UINT32 last_que); + +/***********************************************************/ +/** 获得自动授权队列范围 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_first_que 自授权起始队列号 +* @param p_last_que 自授权终止队列号 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/23 +************************************************************/ +DPP_STATUS dpp_tm_qmu_auto_credit_que_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_first_que, + ZXIC_UINT32 *p_last_que); + +/***********************************************************/ +/** 配置自动授权开启使能及扫描速率 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param auto_crdt_en 自动授权开启使能,默认关闭。0:关闭;1:开启 +* @param auto_crdt_rate 自授权速率配置 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/19 +************************************************************/ +DPP_STATUS dpp_tm_qmu_auto_credit_rate_set(DPP_DEV_T *dev, + ZXIC_UINT32 auto_crdt_en, + ZXIC_UINT32 auto_crdt_rate); + +/***********************************************************/ +/** 获得自动授权开启使能及扫描速率 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_auto_crdt_en 自动授权开启使能,默认关闭。0:关闭;1:开启 +* @param p_auto_crdt_rate 自授权速率配置 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/23 +************************************************************/ +DPP_STATUS dpp_tm_qmu_auto_credit_rate_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_auto_crdt_en, + ZXIC_UINT32 *p_auto_crdt_rate); + +/***********************************************************/ +/** 配置授权丢弃使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param all_drop_en 所有授权丢弃使能:1:允许丢弃所有授权;0:仅允许丢弃拥塞授权 +* @param drop_en 授权丢弃使能:1:允许丢弃授权;0:禁止丢弃授权 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/23 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crbal_drop_en_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 all_drop_en, + ZXIC_UINT32 drop_en); + +/***********************************************************/ +/** 获得授权丢弃使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_all_drop_en 所有授权丢弃使能:1:允许丢弃所有授权;0:仅允许丢弃拥塞授权 +* @param p_drop_en 授权丢弃使能:1:允许丢弃授权;0:禁止丢弃授权 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/23 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crbal_drop_en_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_all_drop_en, + ZXIC_UINT32 *p_drop_en); + +/***********************************************************/ +/**设置自然拥塞反压门限值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param +* @return +* @remark 无 +* @see +* @author yjd @date 2015/07/16 +************************************************************/ +DPP_STATUS dpp_tm_qmu_qcfg_csch_congest_th_set(DPP_DEV_T *dev, ZXIC_UINT32 port_id, ZXIC_UINT32 qmu_congest_th); + +/***********************************************************/ +/**获取自然拥塞反压门限值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param +* @return +* @remark 无 +* @see +* @author yjd @date 2015/07/16 +************************************************************/ +DPP_STATUS dpp_tm_qmu_qcfg_csch_congest_th_get(DPP_DEV_T *dev, ZXIC_UINT32 port_id, ZXIC_UINT32 *p_qmu_congest_th); + +/***********************************************************/ +/**设置CMD_SCH分优先级反压门限值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param +* @return +* @remark 无 +* @see +* @author yjd @date 2015/07/16 +************************************************************/ +DPP_STATUS dpp_tm_qmu_qcfg_csch_sp_fc_th_set(DPP_DEV_T *dev, ZXIC_UINT32 port_id, ZXIC_UINT32 q_pri, ZXIC_UINT32 qmu_sp_fc_th); + +/***********************************************************/ +/**获取自然拥塞反压门限值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param +* @return +* @remark 无 +* @see +* @author yjd @date 2015/07/16 +************************************************************/ +DPP_STATUS dpp_tm_qmu_qcfg_csch_sp_fc_th_get(DPP_DEV_T *dev, ZXIC_UINT32 port_id, ZXIC_UINT32 q_pri, ZXIC_UINT32 *p_qmu_sp_fc_th); + +/***********************************************************/ +/** 配置QMU需要检测流控的端口号 +* @param dev_id 设备号 +* @param tm_type 0-ETM,1-FTM +* @param port_id 端口号 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/05/07 +************************************************************/ +DPP_STATUS dpp_tm_qmu_observe_portfc_set(DPP_DEV_T *dev, ZXIC_UINT32 port_id); + +/***********************************************************/ +/** 配置pfc使能 +* @param dev_id 设备编号 +* @param pfc_en 配置的值,0-不使能pfc,1-使能pfc +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author lsy @date 2022/08/22 +************************************************************/ +DPP_STATUS dpp_tm_qmu_pfc_en_set(DPP_DEV_T *dev, ZXIC_UINT32 pfc_en); + +/***********************************************************/ +/** 读取pfc使能 +* @param dev_id 设备编号 +* @param pfc_en 配置的值,0-不使能pfc,1-使能pfc +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author lsy @date 2022/08/22 +************************************************************/ +DPP_STATUS dpp_tm_qmu_pfc_en_get(DPP_DEV_T *dev, ZXIC_UINT32 *pfc_en); + +/***********************************************************/ +/** 配置端口pfc掩码 +* @param dev_id 设备编号 +* @param port_id 端口号:0~63 +* @param port_en 端口掩码配置,1pfc模式下该端口接收olif的优先级反压, +* 0pfc模式下该端口不接受olif的优先级反压,并将反压信号全部置1 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author lsy @date 2022/08/22 +************************************************************/ +DPP_STATUS dpp_tm_qmu_port_pfc_make_set(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + ZXIC_UINT32 port_en); + +/***********************************************************/ +/** 获得端口pfc掩码 +* @param dev_id 设备编号 +* @param port_id 端口号:0~63 +* @param port_en 端口掩码配置,1pfc模式下该端口接收olif的优先级反压, +* 0pfc模式下该端口不接受olif的优先级反压,并将反压信号全部置1 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author lsy @date 2022/08/22 +************************************************************/ +DPP_STATUS dpp_tm_qmu_port_pfc_make_get(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + ZXIC_UINT32 *p_port_en); + + + +/***********************************************************/ +/** QMU初始化配置场景一:4组*2bank,MMU开启rotatjon,MMU实际分配4~7组,每组2~3bank +* @param dev_id 设备编号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_1(ZXIC_UINT32 dev_id); + + +/***********************************************************/ +/** QMU初始化配置场景一:4组*2bank,MMU开启rotatjon,MMU实际分配0~3组,每组2~3bank +* @param dev_id 设备编号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_ftm_qmu_init_set_1(ZXIC_UINT32 dev_id); + + +/***********************************************************/ +/** QMU初始化配置场景一ddr4模式,开启MMU/IP rotatjon,tm看到4组*2bank,对应DDR分配4~7组,每组2~3bank************* +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_1(ZXIC_UINT32 dev_id); + + +/***********************************************************/ +/** QMU初始化配置场景二:ddr3模式,tm看到4组*4bank,对应DDR分配4~7组,每组2~3,6~7bank +* @param dev_id 设备编号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_2(ZXIC_UINT32 dev_id); + + +/***********************************************************/ +/** QMU初始化配置场景二:ddr3模式,tm看到4组*4bank,对应DDR分配0~3组,每组2~3,6~7bank* +* @param dev_id 设备编号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_ftm_qmu_init_set_2(ZXIC_UINT32 dev_id); + + +/***********************************************************/ +/** QMU初始化配置场景二:ddr3模式,tm看到4组*4bank,对应DDR分配4~7组,每组2~3,6~7bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_2(ZXIC_UINT32 dev_id); + + +/***********************************************************/ +/** QMU初始化配置场景二:ddr3模式,tm看到4组*4bank,对应DDR分配4~7组,每组2~3,6~7bank +* depth=64,代表16k +* @param dev_id 设备编号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_pd16k_2(ZXIC_UINT32 dev_id, ZXIC_UINT32 depth); + + +/***********************************************************/ +/** QMU初始化配置场景二:ddr3模式,8组*8bank +* depth=64,代表16k +* @param dev_id 设备编号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author sun @date 2023/04/12 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_chuk32(ZXIC_UINT32 dev_id, ZXIC_UINT32 depth); + +/***********************************************************/ +/** QMU初始化配置场景二:ddr3模式,tm看到4组*4bank,对应DDR分配0~3组,每组2~3,6~7bank* +* @param dev_id 设备编号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_ftm_qmu_init_set_pd16k_2(ZXIC_UINT32 dev_id, ZXIC_UINT32 depth); + + +/***********************************************************/ +/** QMU初始化配置场景二:ddr3模式,tm看到4组*4bank,对应DDR分配4~7组,每组2~3,6~7bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_pd16k_2(ZXIC_UINT32 dev_id, ZXIC_UINT32 depth); + +/***********************************************************/ +/** QMU初始化配置场景:ddr3模式,8组ddr*8bank +* @param dev_id 设备编号 +* @param depth bank depth +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author sun @date 2023/04/12 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_chuk32(ZXIC_UINT32 dev_id, ZXIC_UINT32 depth); + + +/***********************************************************/ +/** QMU初始化配置场景三:8组*2bank,MMU开启rotatjon,MMU实际分配0~7组,每组6~7bank +* @param dev_id 设备编号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_3(ZXIC_UINT32 dev_id); + +/***********************************************************/ +/** QMU初始化配置场景三:8组*2bank,MMU开启rotatjon,MMU实际分配0~3组,每组2~3bank +* @param dev_id 设备编号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_ftm_qmu_init_set_3(ZXIC_UINT32 dev_id); + +/***********************************************************/ +/** QMU初始化配置场景三ETM: 8组*2bank,MMU开启rotatjon,MMU实际分配0~7组,每组6~7bank +* FTM: 8组*2bank,MMU开启rotatjon,MMU实际分配0~3组,每组2~3bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_3(ZXIC_UINT32 dev_id); + + +/***********************************************************/ +/**场景4:TM共享2组ddr:FTM为2、4组ddr的01bank,ETM为2、4组ddr 23bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/06/06 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_4(ZXIC_UINT32 dev_id); + +/***********************************************************/ +/**场景4:TM共享2组ddr:FTM为2、4组ddr的01bank,ETM为2、4组ddr 23bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/06/06 +************************************************************/ +DPP_STATUS dpp_ftm_qmu_init_set_4(ZXIC_UINT32 dev_id); + +/***********************************************************/ +/**场景4:TM共享2组ddr:FTM为2、4组ddr的01bank,ETM为2、4组ddr 23bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/06/06 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_4(ZXIC_UINT32 dev_id); + + +/***********************************************************/ +/** 场景5:TM共享4组ddr:FTM为1234组ddr的01bank,ETM为1234组ddr 23bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/06/06 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_5(ZXIC_UINT32 dev_id); + + +/***********************************************************/ +/** 场景5:TM共享4组ddr:FTM为1234组ddr的01bank,ETM为1234组ddr 23bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/06/06 +************************************************************/ +DPP_STATUS dpp_ftm_qmu_init_set_5(ZXIC_UINT32 dev_id); + + +/***********************************************************/ +/** 场景5:TM共享4组ddr:FTM为1234组ddr的01bank,ETM为1234组ddr 23bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/06/06 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_5(ZXIC_UINT32 dev_id); + + +/***********************************************************/ +/** QMU初始化配置场景6:4组*2bank,MMU实际分配ftm:4,6,7,9组(01bank); etm:4,6,7,9组(23bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/05/13 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_6(ZXIC_UINT32 dev_id); + +/***********************************************************/ +/** QMU初始化配置场景6:4组*2bank,MMU实际分配ftm:4,6,7,9组(01bank); etm:4,6,7,9组(23bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/05/13 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_6(ZXIC_UINT32 dev_id); + + +/***********************************************************/ +/** QMU初始化配置场景6:4组*2bank,MMU实际分配ftm:4,6,7,9组(01bank); etm:4,6,7,9组(23bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/05/13 +************************************************************/ +DPP_STATUS dpp_ftm_qmu_init_set_6(ZXIC_UINT32 dev_id); + +/***********************************************************/ +/** QMU初始化配置场景6:4组*4bank,MMU实际分配1,2(ftm); 5,6(etm)组,每组2~3 6~7bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_7(ZXIC_UINT32 dev_id); + +/***********************************************************/ +/** QMU初始化配置场景6:4组*4bank,MMU实际分配5~6组,每组2~3 6~7bank +* @param dev_id 设备编号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_7(ZXIC_UINT32 dev_id); + + +/***********************************************************/ +/** QMU初始化配置场景6:4组*4bank,MMU实际分配1~2组,每组2~3 6~7bank +* @param dev_id 设备编号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_ftm_qmu_init_set_7(ZXIC_UINT32 dev_id); + + +/***********************************************************/ +/** QMU初始化配置场景6:4组*4bank,MMU实际分配1,2(ftm); 5,6(etm)组,每组2~3 6~7bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_8(ZXIC_UINT32 dev_id); + +/***********************************************************/ +/** QMU初始化配置场景6:4组*4bank,MMU实际分配5~6组,每组2~3 6~7bank +* @param dev_id 设备编号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_8(ZXIC_UINT32 dev_id); + + +/***********************************************************/ +/** QMU初始化配置场景6:4组*4bank,MMU实际分配1~2组,每组2~3 6~7bank +* @param dev_id 设备编号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_ftm_qmu_init_set_8(ZXIC_UINT32 dev_id); + + +/***********************************************************/ +/** QMU初始化配置场景9:4组*2bank,MMU实际分配ftm:6,7,8,9组(01bank); etm:6,7,8,9组(23bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/09/28 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_9(ZXIC_UINT32 dev_id); + +/***********************************************************/ +/** QMU初始化配置场景9:4组*2bank,MMU实际分配ftm:6,7,8,9组(01bank); etm:6,7,8,9组(23bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/09/28 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_9(ZXIC_UINT32 dev_id); + + +/***********************************************************/ +/** QMU初始化配置场景9:4组*2bank,MMU实际分配ftm:6,7,8,9组(01bank); etm:6,7,8,9组(23bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/09/28 +************************************************************/ +DPP_STATUS dpp_ftm_qmu_init_set_9(ZXIC_UINT32 dev_id); + +/***********************************************************/ +/** QMU初始化配置场景10:独享2组*8bank,MMU实际分配1,2; etm or ftm使用0-7bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/12/16 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_10(ZXIC_UINT32 dev_id); + +/***********************************************************/ +/** QMU初始化配置场景10:独享2组*8bank,MMU实际分配1,2; etm or ftm使用0-7bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/12/16 +************************************************************/ +DPP_STATUS dpp_ftm_qmu_init_set_10(ZXIC_UINT32 dev_id); + +/***********************************************************/ +/** QMU初始化配置场景10:独享2组*8bank,MMU实际分配1,2; etm or ftm使用0-7bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/12/16 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_10(ZXIC_UINT32 dev_id); + + +/***********************************************************/ +/**场景11:TM共享2组ddr:FTM为ddr_no1、ddr_no2组ddr的01bank,ETM为ddr_no1、ddr_no2组ddr 23bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/06/06 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_11(ZXIC_UINT32 dev_id, ZXIC_UINT32 ddr_no1, ZXIC_UINT32 ddr_no2); + +/***********************************************************/ +/**场景11:TM共享2组ddr:FTM为ddr_no1、ddr_no2组ddr的01bank,ETM为ddr_no1、ddr_no2组ddr 23bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/06/06 +************************************************************/ +DPP_STATUS dpp_ftm_qmu_init_set_11(ZXIC_UINT32 dev_id, ZXIC_UINT32 ddr_no1, ZXIC_UINT32 ddr_no2); + +/***********************************************************/ +/**场景4:TM共享2组ddr:FTM为ddr_no1,ddr_no2组ddr的01bank,ETM为ddr_no1,ddr_no2组ddr 23bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/06/06 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_11(ZXIC_UINT32 dev_id, ZXIC_UINT32 ddr_no1, ZXIC_UINT32 ddr_no2); + + +/***********************************************************/ +/** +QMU/MMU初始化配置场景12:每个tm只用1组*4bank,MMU实际分配ftm:0-9中指定组(4567bank); etm:0-9中指定组(0123bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/4/14 +************************************************************/ +DPP_STATUS dpp_ftm_qmu_init_set_12(ZXIC_UINT32 dev_id, ZXIC_UINT32 ftm_ddr_no); + + +/***********************************************************/ +/** +QMU/MMU初始化配置场景15:每个tm只用1组*4bank,MMU实际分配ftm:0-9中指定组(4567bank); etm:0-9中指定组(0123bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/4/14 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_12(ZXIC_UINT32 dev_id, ZXIC_UINT32 ddr_no); + + + +/***********************************************************/ +/** QMU初始化配置场景13:TM独享4组ddr:FTM为指定4组ddr的0~7bank, + ETM为指定4组ddr 0~7bank +* @param dev_id 设备编号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_13(ZXIC_UINT32 dev_id, ZXIC_UINT32 ddr_no); + +/***********************************************************/ +/** QMU初始化配置场景13:TM独享4组ddr:FTM为指定4组ddr的0~7bank, + ETM为指定4组ddr 0~7bank +* @param dev_id 设备编号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_ftm_qmu_init_set_13(ZXIC_UINT32 dev_id, ZXIC_UINT32 ddr_no); + + +/***********************************************************/ +/** QMU/MMU初始化配置场景13:TM独享4组ddr:FTM为指定4组ddr的0~7bank + ETM为指定4组ddr的0-7bank +* MMU开启rotatjon +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_13(ZXIC_UINT32 dev_id, ZXIC_UINT32 ddr_no); + + +/** QMU/MMU初始化配置场景14:每个tm只用1组*8bank,MMU实际分配ftm:0-9中指定组(0-7bank); etm:0-9中指定组(0-7bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/4/14 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_14(ZXIC_UINT32 dev_id, ZXIC_UINT32 etm_ddr_no, ZXIC_UINT32 ftm_ddr_no); + + +/** QMU/MMU初始化配置场景14:每个tm只用1组*8bank,MMU实际分配ftm:0-9中指定组(0-7bank); etm:0-9中指定组(0-7bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/4/14 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_14(ZXIC_UINT32 dev_id, ZXIC_UINT32 etm_ddr_no); + + +/** QMU/MMU初始化配置场景14:每个tm只用1组*8bank,MMU实际分配ftm:0-9中指定组(0-7bank); etm:0-9中指定组(0-7bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/4/14 +************************************************************/ +DPP_STATUS dpp_ftm_qmu_init_set_14(ZXIC_UINT32 dev_id, ZXIC_UINT32 ftm_ddr_no); + + +/** QMU/MMU初始化配置场景15:每个tm只用1组*4bank,MMU实际分配ftm:0-9中指定组(0123bank); etm:0-9中指定组(0123bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/4/14 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_15(ZXIC_UINT32 dev_id, ZXIC_UINT32 etm_ddr_no, ZXIC_UINT32 ftm_ddr_no); + + +/** QMU/MMU初始化配置场景15:每个tm只用1组*4bank,MMU实际分配ftm:0-9中指定组(0123bank); etm:0-9中指定组(0123bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/4/14 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_15(ZXIC_UINT32 dev_id, ZXIC_UINT32 etm_ddr_no); + + +/** QMU/MMU初始化配置场景15:每个tm只用1组*4bank,MMU实际分配ftm:0-9中指定组(0123bank); etm:0-9中指定组(0123bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/4/14 +************************************************************/ +DPP_STATUS dpp_ftm_qmu_init_set_15(ZXIC_UINT32 dev_id, ZXIC_UINT32 ftm_ddr_no); + + +/***********************************************************/ +/** QMU初始化配置场景16:独享2组*8bank,MMU实际分配1,2; etm or ftm使用0-7bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/12/16 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_16(ZXIC_UINT32 dev_id, ZXIC_UINT32 etm_ddr_no, ZXIC_UINT32 ftm_ddr_no); + +/***********************************************************/ +/** QMU初始化配置场景16:独享2组*8bank,MMU实际分配1,2; etm or ftm使用0-7bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/12/16 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_16(ZXIC_UINT32 dev_id, ZXIC_UINT32 ftm_ddr_no); + +/***********************************************************/ +/** QMU初始化配置场景16:独享2组*8bank,MMU实际分配1,2; etm or ftm使用0-7bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/12/16 +************************************************************/ +DPP_STATUS dpp_ftm_qmu_init_set_16(ZXIC_UINT32 dev_id, ZXIC_UINT32 etm_ddr_no); + +/***********************************************************/ +/** 64k队列的简单挂接函数配置 +*flow0~65535 -> ses0~4095 -> pp0 +:具体为flow0~15挂接到ses0的sp0,flow16~31挂接到ses1的sp0,以此类推 +* ses到PP的挂接都是挂接于pp0的sp0 +*@param dev_id 设备编号 +* port_id端口号 +* @ +* @return +* @remark 无 +* @see +* @author cy @date 2015/06/30 +************************************************************/ +DPP_STATUS dpp_tm_crdt_sch_64k_test(ZXIC_UINT32 dev_id, ZXIC_UINT32 port_id); + + +/***********************************************************/ +/** 把整数分解成(指定位长)最高有效数和(2的)指数位数的形式,data=p_remdata*2^(p_exp) +* @param data 需要转换前的数 +* @param rembitsum 余数的位数 +* @param p_remdata 余数大小 +* @param p_exp 指数大小 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/27 +************************************************************/ +DPP_STATUS dpp_tm_rem_and_exp_translate(ZXIC_UINT32 data, + ZXIC_UINT32 rembitsum, + ZXIC_UINT32 *p_remdata, + ZXIC_UINT32 *p_exp); + +/***********************************************************/ +/** 配置统计计数寄存器的统计方式 +* @param dev_id 设备编号 +* @param qnum 支持2组统计寄存器,0-qnum1,1-qnum2 +* @param mode 统计方式,0-统计全部队列,1-统计指定q_id +* @param q_id mode=1时生效,统计该队列的信息 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_stat_q_set(ZXIC_UINT32 dev_id, + DPP_ETM_CGAVD_STAT_QNUM_E qnum, + DPP_ETM_CGAVD_STAT_MODE_E mode, + ZXIC_UINT32 q_id); + +/***********************************************************/ +/** 读取统计计数寄存器的计数信息 +* @param dev_id 设备编号 +* @param qnum 支持2组统计寄存器,0-qnum1,1-qnum2 +* @param p_para 获得的统计信息 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_stat_q_get(ZXIC_UINT32 dev_id, + DPP_ETM_CGAVD_STAT_QNUM_E qnum, + DPP_ETM_CGAVD_STAT_INFO_T *p_para); + +/***********************************************************/ +/** 配置等价包长 +* @param dev_id +* @param tm_type 0-ETM,1-FTM +* @param p_equal_pkt_len 等价包长 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/28 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_equal_pkt_len_para_set(DPP_DEV_T *dev, + DPP_ETM_EQUAL_PKT_LEN_PARA_T *p_equal_pkt_len); + +/***********************************************************/ +/** 读取等价包长 +* @param dev_id +* @param tm_type 0-ETM,1-FTM +* @param p_equal_pkt_len 等价包长 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/28 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_equal_pkt_len_para_get(DPP_DEV_T *dev, + DPP_ETM_EQUAL_PKT_LEN_PARA_T *p_equal_pkt_len); + +/***********************************************************/ +/** 动态门限放大因子参数配置 +* @param dev_id +* @param tm_type 0-ETM,1-FTM +* @param p_amplify_gene_para 动态门限放大因子参数 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/28 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_amplify_gene_para_set(DPP_DEV_T *dev, + DPP_ETM_AMPLIFY_GENE_PARA_T *p_amplify_gene_para); + + +/***********************************************************/ +/** 动态门限放大因子参数获取 +* @param dev_id +* @param tm_type 0-ETM,1-FTM +* @param p_amplify_gene_para 动态门限放大因子参数 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/28 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_amplify_gene_para_get(DPP_DEV_T *dev, + DPP_ETM_AMPLIFY_GENE_PARA_T *p_amplify_gene_para); + +/***********************************************************/ +/** 配置等价包长阈值 +* @param dev_id +* @param tm_type 0-ETM,1-FTM +* @param p_equal_pkt_len_th 等价包长阈值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/28 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_equal_pkt_len_th_para_set(DPP_DEV_T *dev, + DPP_ETM_EQUAL_PKT_LEN_TH_PARA_T *p_equal_pkt_len_th); + +/***********************************************************/ +/** 配置QMU DDR BANK随机模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_ddr_random 模式:0-轮询模式;1-随机模式 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_qmu_ddr_random_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_ddr_random); + +/***********************************************************/ +/** 读取等价包长阈值 +* @param dev_id +* @param tm_type 0-ETM,1-FTM +* @param p_equal_pkt_len_th 等价包长阈值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/28 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_equal_pkt_len_th_para_get(DPP_DEV_T *dev, + DPP_ETM_EQUAL_PKT_LEN_TH_PARA_T *p_equal_pkt_len_th); + + + +/***********************************************************/ +/** 读取全部队列的计数信息 +* @param dev_id 设备编号* +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 使用第2组统计寄存器进行统计 +* @see +* @author yjd @date 2015/07/04 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_stat_q_all_get_diag(ZXIC_UINT32 dev_id); + +/***********************************************************/ +/** 读取某一队列统计计数寄存器的计数信息 +* @param dev_id 设备编号 +* @param q_id 统计该队列的信息 +* 使用第1组统计寄存器进行统计 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/07/04 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_stat_q_single_get_diag(ZXIC_UINT32 dev_id); + + + +/***********************************************************/ +/** 配置默认队列使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param en 配置的值,0-不使能默认队列,1-使能默认队列, +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2016/08/16 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_default_queue_en_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 en); + +/***********************************************************/ +/** 读取默认队列使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_en 读取的值,0-不使能默认队列,1-使能默认队列, +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2016/08/16 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_default_queue_en_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_en); + + +/***********************************************************/ +/** 配置默认队列起始末尾 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param def_start_que 起始默认队列block/byte单位 +* @param def_finish_que 结束默认队列block/byte单位 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2016/08/16 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_default_queue_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 def_start_queue, ZXIC_UINT32 def_finish_queue); + +/***********************************************************/ +/** 读取默认队列起始末尾值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_def_start_que 默认队列起始值block/byte单位 +* @param p_def_finish_que 默认队列结束值block/byte单位 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2016/08/16 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_default_queue_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_def_start_queue, ZXIC_UINT32 *p_def_finish_queue); + +/***********************************************************/ +/** 配置协议队列使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param en 配置的值,0-不使能默认队列,1-使能默认队列, +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2016/08/16 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_protocol_queue_en_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 en); + +/***********************************************************/ +/** 读取协议队列使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_en 读取的值,0-不使能通用门限,1-使能通用门限, +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2016/08/16 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_protocol_queue_en_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_en); + +/***********************************************************/ +/** 配置协议队列起始末尾 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param protocol_start_que 起始协议队列block/byte单位 +*@param protocol_-finish_que 末尾协议队列block/byte单位 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2016/08/16 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_protocol_queue_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 protocol_start_que, ZXIC_UINT32 protocol_finish_que); + +/***********************************************************/ +/** 读取协议队列起始末尾值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_protocol_start_que 协议认队列起始值block/byte单位 +* @param p_protocol_finish_que 协议认队列末尾值block/byte单位 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2016/08/16 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_protocol_queue_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_protocol_start_que, ZXIC_UINT32 *p_protocol_finish_que); + + +/***********************************************************/ +/** 配置QMU需要统计的队列组 +* @param dev_id 设备号 +* @param tm_type 0-ETM,1-FTM +* @param batch_id 队列组 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/05/07 +************************************************************/ +DPP_STATUS dpp_tm_qmu_observe_batch_set(DPP_DEV_T *dev, ZXIC_UINT32 batch_id); + +/***********************************************************/ +/** 配置QMU需要统计的队列号 +* @param dev_id 设备号 +* @param tm_type 0-ETM,1-FTM +* @param q_id 队列号 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/05/07 +************************************************************/ +DPP_STATUS dpp_tm_qmu_observe_qnum_set(DPP_DEV_T *dev, ZXIC_UINT32 q_id); + +/***********************************************************/ +/** 配置授权盈余初始化值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param crbal_initial_value 授权盈余初始化值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crbal_initial_value_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 crbal_initial_value); + +/***********************************************************/ +/** 配置等价包长使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param en 使能标记,0-不使能,1-使能 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/28 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_equal_pkt_len_en_set(DPP_DEV_T *dev, ZXIC_UINT32 en); + +/***********************************************************/ +/** 读取等价包长使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_en 使能标记,0-不使能,1-使能 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/28 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_equal_pkt_len_en_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_en); + + +/***********************************************************/ +/** 读取指定队列获得授权个数(只打印授权非零的队列号) +* @param dev_id 设备编号 +* @param ackflow_start 授权起始流号 +* @param ackflow_end 授权终止流号 +* @param sleep_time_ms 等待时间 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2017/01/19 +************************************************************/ +DPP_STATUS dpp_etm_crdt_traffic_diag(ZXIC_UINT32 dev_id, + ZXIC_UINT32 ackflow_start, + ZXIC_UINT32 ackflow_end, + ZXIC_UINT32 sleep_time_ms); + +/***********************************************************/ +/** 读取指定队列获得授权个数(只打印授权非零的队列号) +* @param dev_id 设备编号 +* @param ackflow_start 授权起始流号 +* @param ackflow_end 授权终止流号 +* @param sleep_time_ms 等待时间 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2017/01/19 +************************************************************/ +DPP_STATUS dpp_ftm_crdt_traffic_diag(ZXIC_UINT32 dev_id, + ZXIC_UINT32 ackflow_start, + ZXIC_UINT32 ackflow_end, + ZXIC_UINT32 sleep_time_ms); + + +/***********************************************************/ +/** 读取指定队列获得授权个数(只打印授权非零的队列号) +* @param dev_id 设备编号 +* @param tm_type 0-ETM, 1FTM +* @param ackflow_start 授权流起始 +* @param ackflow_end 授权流终止 +* @param sleep_time_ms 等待时间 +* +* @return +* @remark 无 +* @see +* @author wush @date 2017/01/24 +************************************************************/ +DPP_STATUS diag_dpp_tm_crdt_traffic_diag(ZXIC_UINT32 dev_id, + ZXIC_UINT32 ackflow_start, + ZXIC_UINT32 ackflow_end, + ZXIC_UINT32 sleep_time_ms); + +/***********************************************************/ +/** +* @param dev_id +* @param tm_type +* @param i_or_e_sel +* @param port_or_dest_id_sel +* @param start_id +* @param start_port_dest_id +* @param num +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xjw @date 2018/02/01 +************************************************************/ +DPP_STATUS dpp_tm_olif_stat_set_mul(ZXIC_UINT32 dev_id, + ZXIC_UINT32 i_or_e_sel, + ZXIC_UINT32 port_or_dest_id_sel, + ZXIC_UINT32 start_id, + ZXIC_UINT32 start_port_dest_id, + ZXIC_UINT32 num); + + +/****************************************************************************** + * END: 函数声明 * + *****************************************************************************/ +#endif + + +#if ZXIC_REAL("ETM_STAT") + + +/***********************************************************/ +/** 打印dpp tm所有模块中断状态 +* @param tm_type 0-ETM,1-FTM +* @param dev_id 设备编号 +* @param +* @param +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/07/09 +************************************************************/ +DPP_STATUS diag_dpp_tm_int(ZXIC_UINT32 dev_id); + +/***********************************************************/ +/** 获取tm.c中qmu_init_set中配置的case_num +* @param tm_type 0-ETM,1-FTM +* @param dev_id 设备编号 +* @param +* @param +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/04/15 +************************************************************/ +DPP_STATUS dpp_tm_case_no_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *case_no); + +/***********************************************************/ +/** 配置dpp tm所有模块中断屏蔽 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param int_mask_flag 0:不屏蔽 1:屏蔽 +* @param +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/07/09 +************************************************************/ +DPP_STATUS dpp_tm_int_mask_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 int_mask_flag); + +/***********************************************************/ +/** 读取基于优先级的QMU接收NPPU数据的fifo阈值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param sp 优先级0~7 +* @param p_th 指定优先级的fifo阈值0~511,单位为fifo条目,fifo深度512 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2016/10/18 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_move_drop_sp_th_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 sp, + ZXIC_UINT32 *p_th); + +/***********************************************************/ +/** 打印cgavd模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_mode 0:block mode 1:byte mode +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/07/29 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_cfg_mode_get_diag(ZXIC_UINT32 dev_id); + + +/***********************************************************/ +/** 打印cgavd TD阈值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* @param id 队列号或端口号,系统级时,id参数无效 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/08/01 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_td_byte_block_th_get_diag(ZXIC_UINT32 dev_id, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id); + +/***********************************************************/ +/** QMU MMU 配置清除 +* @param dev_id +* @param tm_type +* +* @return +* @remark 无 +* @see +* @author XXX @date 2020/04/13 +************************************************************/ +DPP_STATUS dpp_tm_qmu_mmu_cfg_clr(ZXIC_UINT32 dev_id); + +/***********************************************************/ +/** 读取QMU所有队列的统计信息 +* @param dev_id 设备编号 +* @param p_para 获得的统计信息 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_qmu_stat_get(ZXIC_UINT32 dev_id, DPP_ETM_QMU_STAT_INFO_T *p_para); + +/***********************************************************/ +/** 读取QMU指定队列的计数信息 +* @param dev_id 设备编号 +* @param p_para 获得的统计信息 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_qmu_spec_q_stat_get(ZXIC_UINT32 dev_id, DPP_ETM_QMU_SPEC_Q_STAT_INFO_T *p_para); + +/***********************************************************/ +/** 读取QMU指定队列组的计数信息 +* @param dev_id 设备编号 +* @param p_para 获得的统计信息 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_qmu_spec_bat_stat_get(ZXIC_UINT32 dev_id, DPP_ETM_QMU_SPEC_BAT_STAT_INFO_T *p_para); + +/***********************************************************/ +/** 配置QMU流控计数模式 +* @param dev_id 设备号 +* @param tm_type 0-ETM,1-FTM +* @param mode 流控模式,0-电平流控;1-边沿流控 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/05/07 +************************************************************/ +DPP_STATUS dpp_tm_qmu_fc_cnt_mode_set(DPP_DEV_T *dev, ZXIC_UINT32 mode); + +/***********************************************************/ +/** 读取QMU流控计数模式 +* @param dev_id 设备号 +* @param tm_type 0-ETM,1-FTM +* @param p_mode 流控模式,0-电平流控;1-边沿流控 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/05/07 +************************************************************/ +DPP_STATUS dpp_tm_qmu_fc_cnt_mode_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_mode); + +/***********************************************************/ +/** 打印block长度 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/07/20 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_blk_size_get_diag(ZXIC_UINT32 dev_id); + + +/***********************************************************/ +/** 打印队列空标志查询 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param qnum 配置的队列号 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author cy @date 2016/06/20 +************************************************************/ +DPP_STATUS dpp_tm_qlist_ept_flag_get_diag(ZXIC_UINT32 dev_id, ZXIC_UINT32 qnum); + + +/***********************************************************/ +/** 获得队列空标志查询 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param qnum 配置的队列号 +* @param p_value 队列空标志查询 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author cy @date 2016/06/20 +************************************************************/ +DPP_STATUS dpp_tm_qlist_ept_flag_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 qnum, + ZXIC_UINT32 *p_value); + + +/***********************************************************/ +/** 获得队列深度计数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param qnum 配置的队列号 +* @param p_value 队列深度计数 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author cy @date 2016/06/20 +************************************************************/ +DPP_STATUS dpp_tm_qlist_r_bcnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 qnum, + ZXIC_UINT32 *p_value); + + +/***********************************************************/ +/** 打印队列深度计数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param qnum 配置的队列号 +* @param p_value 队列深度计数 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author cy @date 2016/06/20 +************************************************************/ +DPP_STATUS dpp_tm_qlist_r_bcnt_get_diag(ZXIC_UINT32 dev_id, ZXIC_UINT32 qnum); + +/***********************************************************/ +/** CMDSCH中分端口分优先级的BLOCK计数 +* @param dev_id 设备编号 +* @param pri +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author sun @date 2023/09/19 +************************************************************/ +DPP_STATUS dpp_tm_csch_r_block_cnt_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 pri, ZXIC_UINT32 *p_value); + +/***********************************************************/ +/** 打印CMDSCH中分端口分优先级的BLOCK计数 +* @param dev_id 设备编号 +* @param port +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author sun @date 2023/09/19 +************************************************************/ +DPP_STATUS dpp_tm_csch_r_block_cnt_diag(ZXIC_UINT32 dev_id, ZXIC_UINT32 port); + +/***********************************************************/ +/** 打印队列入链状态 +* @param dev_id 设备编号 +* @param flow_id +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author sun @date 2023/09/19 +************************************************************/ +DPP_STATUS dpp_tm_crdt_flow_link_state_get_diag(ZXIC_UINT32 dev_id, ZXIC_UINT32 flow_id); + +/***********************************************************/ +/** 打印调度器入链状态 +* @param dev_id 设备编号 +* @param flow_id +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author sun @date 2023/09/19 +************************************************************/ +DPP_STATUS dpp_tm_crdt_se_link_state_get_diag(ZXIC_UINT32 dev_id, ZXIC_UINT32 se_id); + +/***********************************************************/ +/** 打印olif的fifo是否空状态 +* @param dev_id 设备编号 +* @param +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author sun @date 2023/09/19 +************************************************************/ +DPP_STATUS dpp_tm_olif_fifo_empty_state_get_diag(ZXIC_UINT32 dev_id); + +/***********************************************************/ +/** 授权个数统计寄存器清零 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author taq @date 2015/06/19 +************************************************************/ +DPP_STATUS dpp_tm_crdt_clr_diag(ZXIC_UINT32 dev_id); + +/***********************************************************/ +/**cpu配置flow_id的crs强制为normal或者off开关使能,用于检测SA模式下队列到授权流的多对一问题 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param flow_id:流号(和授权流号一一对应) +* en 强制配置crs的使能,0-不使能,1-使能 +* crs_value:强制配置crs的值2'b00:off; 2'b01:low; 2'b10:normal; +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/04/25 +************************************************************/ +DPP_STATUS dpp_tm_crdt_crs_sheild_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 flow_id, ZXIC_UINT32 en, ZXIC_UINT32 crs_value); + + +/***********************************************************/ +/**获取flow_id的crs强制为normal或者off开关使能,用于检测SA模式下队列到授权流的多对一问题 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param flow_id:流号(和授权流号一一对应) +* en 强制配置crs的使能,0-不使能,1-使能 +* crs_value:强制配置crs的值2'b00:off; 2'b01:low; 2'b10:normal; +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/04/25 +************************************************************/ +DPP_STATUS dpp_tm_crdt_crs_sheild_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_flow_id, ZXIC_UINT32 *p_en, ZXIC_UINT32 *p_crs_value); + + +/***********************************************************/ +/** 获得拥塞状态(有效链路数+UCN等级)到授权产生间隔的映射表 +* @param dev_id 设备编号 +* @param valid_serdes_num 有效的链路数(0~32 +* @param ucn_level UCN等级(0~7) +* @param p_cr_clk UCN等级(0~7) +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2017/03/28 +************************************************************/ +DPP_STATUS dpp_tm_crdt_cfgmt_interval_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 valid_serdes_num, + ZXIC_UINT32 ucn_level, + ZXIC_UINT32 *p_cr_clk); + +/***********************************************************/ +/**每隔10s获取crs状态的个数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param +* @return +* @remark 无 +* @see +* @author zmy @date 2015/08/07 +************************************************************/ +DPP_STATUS dpp_tm_crs_statics(ZXIC_UINT32 dev_id, ZXIC_UINT32 que_id); + + +/***********************************************************/ +/** 统计QMU发送和CRDT模块指定授权流接收的CRS计数(10s内) +* @param dev_id 设备编号 +* @param que_id QMU队列号 +* @param ackflow_id 授权流号 +* @param valid_flag 0:队列发送和授权流接收都统计; 1:只关注队列发送,2:只关注授权流接收。 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2017/05/12 +************************************************************/ +DPP_STATUS dpp_tm_crs_cnt_prt(ZXIC_UINT32 dev_id, ZXIC_UINT32 que_id, ZXIC_UINT32 ackflow_id, ZXIC_UINT32 valid_flag); + + +/***********************************************************/ +/** 带停流的统计QMU发送和CRDT模块指定授权流接收的CRS计数 +* @param dev_id 设备编号 +* @param que_id QMU队列号 +* @param ackflow_id 授权流号 +* @param valid_flag 0:默认队列发送和授权流接收都统计,此时队列授权都在本板; +* 1:只关注队列发送,2:只关注授权流接收,需要与源端队列停流配合使用, + 先停流,运行该函数;或者直接不停流得到的是某段时间的计数。 +* @param sleep_time 统计多长时间内的crs计数 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2017/05/12 +************************************************************/ +DPP_STATUS dpp_tm_crs_cnt_prt_1(ZXIC_UINT32 dev_id, + ZXIC_UINT32 que_id, + ZXIC_UINT32 ackflow_id, + ZXIC_UINT32 valid_flag, + ZXIC_UINT32 sleep_time); + +/***********************************************************/ +/** 读取qlist入队及出队状态监控 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2015/08/26 +************************************************************/ +DPP_STATUS dpp_tm_qmu_qlist_state_query(ZXIC_UINT32 dev_id); + + +/***********************************************************/ +/** 打印被指定统计的第0~15个端口消耗的令牌个数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM + +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 统计时间为2s,其中c桶统计1s,e桶统计1s +* @see +* @author whuashan @date 2019/03/15 +************************************************************/ +DPP_STATUS dpp_tm_shape_token_dec_cnt_diag(ZXIC_UINT32 dev_id); + +/***********************************************************/ +/** 打印被指定统计的第0~15个端口接收的令牌个数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 统计时间为2s,其中c桶统计1s,e桶统计1s +* @see +* @author whuashan @date 2019/03/15 +************************************************************/ +DPP_STATUS dpp_tm_shape_token_dist_cnt_diag(ZXIC_UINT32 dev_id); + + +/***********************************************************/ +/** 配置olif统计组信息 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param id olif统计组号 +* @param all_or_by_port 0-统计所有,1-统计某一端口或某一dest_id +* @param i_or_e_sel 10-统计片外,01-统计片内,其他值-统计所有 +* @param port_or_dest_id_sel 0-统计port,1-统计dest_id +* @param port_dest_id port号或dest_id号 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/04/21 +************************************************************/ +DPP_STATUS dpp_tm_olif_stat_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 id, + ZXIC_UINT32 all_or_by_port, + ZXIC_UINT32 i_or_e_sel, + ZXIC_UINT32 port_or_dest_id_sel, + ZXIC_UINT32 port_dest_id); + + +/***********************************************************/ +/** 查看CRDT接收到和发送的某端口拥塞授权总数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param pp_id 0~63 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/12/08 +************************************************************/ +DPP_STATUS diag_dpp_tm_crdt_port_congest_credit_cnt(ZXIC_UINT32 dev_id, ZXIC_UINT32 pp_id); + +#endif /*ETM_STAT */ + + +#if ZXIC_REAL("TM_REG") +/***********************************************************/ +/** 写TM寄存器 +* @param module_id 区分TM子模块 +* @param addr 基于子模块的地址 +* @param data 写入的数据 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/07/26 +************************************************************/ +DPP_STATUS dpp_tm_wr_reg(ZXIC_UINT32 dev_id, ZXIC_UINT32 module_id, ZXIC_UINT32 addr, ZXIC_UINT32 data); + + +/***********************************************************/ +/** 读TM寄存器 +* @param module_id 区分TM子模块 +* @param addr 基于子模块的地址 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/07/26 +************************************************************/ +DPP_STATUS dpp_tm_rd_reg(ZXIC_UINT32 dev_id, ZXIC_UINT32 module_id, ZXIC_UINT32 addr); + + +/***********************************************************/ +/** 读一片连续的TM寄存器 +* @param module_id 区分TM子模块 +* @param first_addr 起始寄存器的地址 +* @param reg_num 总共读取的寄存器数 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2017/07/26 +************************************************************/ +DPP_STATUS dpp_tm_rd_more_reg(ZXIC_UINT32 dev_id, ZXIC_UINT32 module_id, ZXIC_UINT32 first_addr, ZXIC_UINT32 reg_num); + +/***********************************************************/ +/** 写tm模块二层间接寄存器(仅crdt/shap模块使用) +* @param module_id 区分TM子模块 +* @param addr 基于子模块的地址 +* @param data 写入的数据 +* +* @return +* @remark 无 +* @see +* @author whuashan @date 2019/02/25 +************************************************************/ +DPP_STATUS dpp_tm_ind_wr_reg(ZXIC_UINT32 dev_id, ZXIC_UINT32 module_id, ZXIC_UINT32 addr, ZXIC_UINT64 data); + +/***********************************************************/ +/** 读tm模块二层间接寄存器(仅crdt/shap模块使用) +* @param module_id 区分TM子模块 +* @param addr 基于子模块的地址 +* +* @return +* @remark 无 +* @see +* @author whuashan @date 2019/02/25 +************************************************************/ +DPP_STATUS dpp_tm_ind_rd_reg(ZXIC_UINT32 dev_id, ZXIC_UINT32 module_id, ZXIC_UINT32 addr); +#endif /*TM_REG */ + +#if ZXIC_REAL("TM_CFGMT") +/***********************************************************/ +/** 校验子系统初始化就绪,所有子系统均初始化就绪,p_rdy值为1 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_rdy 初始化就绪标记,1-就绪,0-未就绪 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/04/09 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_subsystem_rdy_check(ZXIC_UINT32 dev_id); + + +/***********************************************************/ +/** cpu读写通道验证,其读出值等于写入值。读出值不等于写入值时,返回err +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/04/09 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_cpu_check(DPP_DEV_T *dev); + + +/***********************************************************/ +/** 读取内置TM的工作模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_mode 读取的值,0-TM模式,1-SA模式 +*ETM仅工作在TM模式,FTM可以工作TM或SA模式 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/25 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_sa_work_mode_get(DPP_DEV_T *dev, DPP_TM_WORK_MODE_E *p_mode); + + +/***********************************************************/ +/** 配置ddr3挂接组数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param ddr_num ddr组数,1-6组 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/04/09 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_ddr_attach_set(DPP_DEV_T *dev, ZXIC_UINT32 ddr_num); + + +/***********************************************************/ +/** 读取ddr3挂接组数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_ddr_num ddr组数,1-6组 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/04/09 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_ddr_attach_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_ddr_num); + +DPP_STATUS dpp_qmu_init_info(ZXIC_UINT32 dev_id); + +/***********************************************************/ +/** 配置包存储的CRC功能是否使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param en 配置的值,0-禁止CRC功能,1-允许CRC功能 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/25 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_crc_en_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 en); + + +/***********************************************************/ +/** 配置qmu端口转换使能,SA模式下需要配置 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param en 配置的使能值,0-不使能,1-使能 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/25 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_port_transfer_en_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 en); + + +/***********************************************************/ +/** 读取qmu端口转换使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_en 读取的使能值,0-不使能,1-使能 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/25 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_port_transfer_en_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_en); + + +/***********************************************************/ +/** 读取包存储的CRC功能是否使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_en 读取的值,0-禁止CRC功能,1-允许CRC功能 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/25 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_crc_en_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_en); + + +/***********************************************************/ +/** 配置block长度模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param size block长度模式:256/512/1024 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/04/09 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_blk_size_set(DPP_DEV_T *dev, ZXIC_UINT32 size); + + +/***********************************************************/ +/** 配置计数模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_mode 计数模式 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/04/09 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_cnt_mode_set(ZXIC_UINT32 dev_id, DPP_TM_CNT_MODE_T *p_mode); + + +/***********************************************************/ +/** 读取计数模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_mode 计数模式 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/04/09 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_cnt_mode_get(ZXIC_UINT32 dev_id, DPP_TM_CNT_MODE_T *p_mode); + + +/***********************************************************/ +/** 配置中断屏蔽 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_para 中断屏蔽 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/04/09 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_int_mask_set(ZXIC_UINT32 dev_id, DPP_TM_INT_T *p_para); + + +/***********************************************************/ +/** 读取中断屏蔽 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_para 中断屏蔽 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/04/09 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_int_mask_get(ZXIC_UINT32 dev_id, DPP_TM_INT_T *p_para); + + +/***********************************************************/ +/** 读取中断状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_para 中断状态 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/04/09 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_int_state_get(ZXIC_UINT32 dev_id, DPP_TM_INT_T *p_para); + +/***********************************************************/ +/** 配置tm时钟门控是否使能 +* @param dev_id 设备编号 +* @param en 配置的值,0-禁止tm时钟门控,1-使能tm时钟门控 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author lsy @date 2022/08/22 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_clkgate_en_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 en); + +/***********************************************************/ +/** 读取tm时钟门控是否使能 +* @param dev_id 设备编号 +* @param en 配置的值,0-禁止tm时钟门控,1-使能tm时钟门控 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author lsy @date 2022/08/22 + +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_clkgate_en_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_en); + +/***********************************************************/ +/** 配置tm软复位是否使能 +* @param dev_id 设备编号 +* @param en 配置的值,0-禁止tm软复位,1-使能tm软复位 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author lsy @date 2022/08/22 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_softrst_en_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 en); + +/***********************************************************/ +/** 读取tm软复位是否使能 +* @param dev_id 设备编号 +* @param en 配置的值,0-禁止tm软复位,1-使能tm软复位 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author lsy @date 2022/08/22 + +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_softrst_en_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_en); + +#endif /*TM_CFGMT */ + +#if ZXIC_REAL("TM_CGAVD") +/***********************************************************/ +/** 读取各级搬移功能使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 要配置的拥塞避免层次号,0:队列级,1:端口级,2:系统级 +* @param p_en 读出的使能标记,0-不使能,1-使能 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2016/10/18 +************************************************************/ +#ifdef ETM_REAL +DPP_STATUS dpp_tm_cgavd_move_en_get(ZXIC_UINT32 dev_id, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 *p_en); + +/***********************************************************/ +/** 配置各级搬移门限 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* @param id 队列号或端口号,系统级时,id参数无效 +* @param value 端口级和系统级时,为搬移门限值,单位为NPPU存包的单位,256B; + 流级时为搬移profile_id,0~15 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2016/10/18 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_move_th_set(ZXIC_UINT32 dev_id, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + ZXIC_UINT32 value); + +/***********************************************************/ +/** 读取各级搬移门限 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* @param id 队列号或端口号,系统级时,id参数无效 +* @param p_value 端口级和系统级时,为搬移门限值,单位为NPPU存包的单位,256B; + 流级时为搬移profile_id,0~15 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2016/10/18 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_move_th_get(ZXIC_UINT32 dev_id, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + ZXIC_UINT32 *p_value); + +/***********************************************************/ +/** 读取flow级的搬移策略 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param move_profile flow级的搬移门限分组索引,0~15 +* @param p_th flow级的搬移门限,单位为KB; +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2016/10/18 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_flow_move_profile_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 move_profile, + ZXIC_UINT32 *p_th); +#endif +/***********************************************************/ +/** 读取端口共享的搬移门限 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_th 端口共享的搬移门限,单位为NPPU存包的单位,256B; +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2016/10/18 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_port_share_th_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_th); + +/***********************************************************/ +/** 读取各级拥塞避免功能使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 要读取的拥塞避免层次号,0:队列级,1:端口级,2:系统级 +* @param p_en 读出的使能标记,0-不使能,1-使能 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/28 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_en_get(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 *p_en); + +/***********************************************************/ +/** dp选取来源 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 要配置的拥塞避免层次号,0:队列级,1:端口级,2:系统级 +* @param dp_sel dp选取来源,0-dp,1-tc,2-pkt_len[2:0] +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2017/03/14 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_dp_sel_set(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + DPP_TM_CGAVD_DP_SEL_E dp_sel); + +/***********************************************************/ +/** 读取拥塞避免算法 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* @param id 队列号或端口号,系统级时,id参数无效 +* @param p_method 配置的拥塞避免算法,0:TD,1:WRED/GRED +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/17 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_method_get(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + DPP_TM_CGAVD_METHOD_E *p_method); + + +/***********************************************************/ +/** 流队列级队列深度的获取 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param que_id 队列号 +* p_len 队列深度以KB为单位 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/06/19 +************************************************************/ +DPP_STATUS dpp_tm_flow_que_len_get(DPP_DEV_T *dev, + ZXIC_UINT32 que_id, + ZXIC_UINT32 *p_len); + +/***********************************************************/ +/** 端口级队列深度的获取 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param pp_id 队列号 +* pp_len 队列深度以KB为单位 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/06/19 +************************************************************/ +DPP_STATUS dpp_tm_port_que_len_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 pp_id, + ZXIC_UINT32 *pp_len); + +/***********************************************************/ +/** 系统级队列深度的获取 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param sys_len 系统级深度以block为单位 +* sys_protocol_len 系统级包含协议队列深度以KB为单位 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/06/19 +************************************************************/ +DPP_STATUS dpp_tm_sys_que_len_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *sys_len, + ZXIC_UINT32 *sys_protocol_len); + +/***********************************************************/ +/** 读取TD拥塞避免模式下的丢弃门限值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* @param id 队列号或端口号,系统级时,id参数无效 +* @param p_td_th 配置的丢弃门限值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/17 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_td_th_get(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + ZXIC_UINT32 *p_td_th); + +/***********************************************************/ +/** 读取指定端口或队列绑定的WRED GROUP ID +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level WRED支持层次号,0:队列级,1:端口级 +* @param id 队列号或端口号 +* @param p_wred_id 配置的WRED GROUP ID +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/17 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_wred_id_get(ZXIC_UINT32 dev_id, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + ZXIC_UINT32 *p_wred_id); + +/***********************************************************/ +/** 读取WRED丢弃曲线对应的参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level WRED支持层次号,0:队列级,1:端口级 +* @param wred_id 队列级共支持16个WRED组0-15,端口级支持8组0-7 +* @param dp 共支持8个dp,取值0-7 +* @param p_para 配置的WRED组参数值,包含以下五个参数 + max_th 平均队列深度上限阈值 + min_th 平均队列深度下限阈值 + max_p 最大丢弃概率 + weight 平均队列深度计算权重 + q_len_th 队列深度阈值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author taq @date 2015/04/20 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_wred_dp_line_para_get(ZXIC_UINT32 dev_id, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 wred_id, + ZXIC_UINT32 dp, + DPP_TM_WRED_DP_LINE_PARA_T *p_para); + +/***********************************************************/ +/** 配置系统级GRED丢弃曲线对应的参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param dp 共支持8个dp,取值0-7 +* @param p_para 配置的GRED丢弃曲线参数值,包含以下六个参数 + max_th 平均队列深度上限阈值 + mid_th 平均队列深度中间阈值 + min_th 平均队列深度下限阈值 + max_p 最大丢弃概率 + weight 平均队列深度计算权重 + q_len_th 队列深度阈值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author taq @date 2015/04/20 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_gred_dp_line_para_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 dp, + DPP_TM_GRED_DP_LINE_PARA_T *p_para); + +/***********************************************************/ +/** 配置系统级阶梯TD 丢弃曲线对应的参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param dp 共支持8个dp,取值0-7 +* @param td_th TD 门限 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/08/02 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_ladtd_dp_line_para_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 dp, + ZXIC_UINT32 td_th); + + +/***********************************************************/ +/** 读取系统级GRED丢弃曲线对应的参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param dp 共支持8个dp,取值0-7 +* @param p_para 配置的GRED丢弃曲线参数值,包含以下六个参数 + max_th 平均队列深度上限阈值 + mid_th 平均队列深度中间阈值 + min_th 平均队列深度下限阈值 + max_p 最大丢弃概率 + weight 平均队列深度计算权重 + q_len_th 队列深度阈值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author taq @date 2015/04/20 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_gred_dp_line_para_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 dp, + DPP_TM_GRED_DP_LINE_PARA_T *p_para); + +/***********************************************************/ +/** 读取指定端口或队列是否支持动态门限机制 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level WRED支持层次号,0:队列级,1:端口级 +* @param id 队列号或端口号 +* @param p_en 读取的值,0-不支持动态门限机制,1-支持动态门限机制 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/17 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_dyn_th_en_get(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + ZXIC_UINT32 *p_en); + +/***********************************************************/ +/** 配置通用门限使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param en 配置的值,0-不使能通用门限,1-使能通用门限, +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/17 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_uniform_th_en_set(DPP_DEV_T *dev, ZXIC_UINT32 en); + +/***********************************************************/ +/** 读取通用门限使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_en 读取的值,0-不使能通用门限,1-使能通用门限, +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/17 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_uniform_th_en_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_en); + +/***********************************************************/ +/** 配置通用门限 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param th 通用门限值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/17 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_uniform_th_set(DPP_DEV_T *dev, ZXIC_UINT32 th); + +/***********************************************************/ +/** 读取通用门限 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_th 通用门限值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/17 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_uniform_th_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_th); + +/***********************************************************/ +/** 配置流队列所属优先级 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param q_id 队列号 +* @param pri 配置的优先级,0~7 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/17 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_q_pri_set(DPP_DEV_T *dev, + ZXIC_UINT32 q_id, + ZXIC_UINT32 pri); + +/***********************************************************/ +/** 读取TM模式下流队列挂接的端口号;SA模式下流队列映射的目的芯片ID +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param q_id 队列号 +* @param p_pp_id 读取的端口号 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/18 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_q_map_pp_get(DPP_DEV_T *dev, + ZXIC_UINT32 q_id, + ZXIC_UINT32 *p_pp_id); + +/***********************************************************/ +/** 读取配置TM模式tc到flow的映射 +* @param dev_id 设备编号 +* @param tc_id itmd tc优先级(0~7) +* @param flow_id 读取映射的flowid号 (0~4095) +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author sun @date 2023/07/04 +************************************************************/ +DPP_STATUS dpp_tm_tc_map_flow_get(DPP_DEV_T *dev, + ZXIC_UINT32 tc_id, + ZXIC_UINT32 *flow_id); + +/***********************************************************/ +/** 获取强制片内或片外 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param en 1:使能 +* @param mode 1 :omem 强制片外 0:imem 强制片内 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2017/10/14 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_imem_omem_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_en, + ZXIC_UINT32 *p_mode); + +/***********************************************************/ +/** 连续配置各级搬移门限 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* @param start_id 为起始 队列号或端口号,系统级时,id参数无效 +* @param value 端口级和系统级时,为搬移门限值,单位为NPPU存包的单位,256B; + 流级时为搬移profile_id,0~15 +* @param num 为队列或端口个数 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2016/11/19 +************************************************************/ +#ifdef ETM_REAL +DPP_STATUS dpp_tm_cgavd_move_th_together_wr(ZXIC_UINT32 dev_id, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 start_id, + ZXIC_UINT32 value, + ZXIC_UINT32 num); +#endif +/***********************************************************/ +/** 系统级缓存使用上下限阈值配置 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param th_h: 系统级缓存使用上限阈值 +* @param th_l: 系统级缓存使用下限阈值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/07/03 +************************************************************/ +DPP_STATUS dpp_tm_sys_window_th_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 th_h, + ZXIC_UINT32 th_l); + +/***********************************************************/ +/** 配置cgavd强制反压 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param cgavd_fc: 0:不强制反压 1:强制反压 +* @param +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/07/03 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_cfg_fc_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 cgavd_fc); + +/***********************************************************/ +/** 获取cgavd强制反压状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param cgavd_fc: 0:不强制反压 1:强制反压 +* @param +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/07/03 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_cfg_fc_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *cgavd_fc); + +/***********************************************************/ +/** 配置cgavd强制不反压 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param cgavd_no_fc: 0:不强制 1:强制不反压 +* @param +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/07/03 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_cfg_no_fc_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 cgavd_no_fc); + +/***********************************************************/ +/** 获取cgavd强制不反压状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param cgavd_no_fc: 0:不强制 1:强制不反压 +* @param +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/07/03 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_cfg_no_fc_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *cgavd_no_fc); + + +/***********************************************************/ +/** 配置cgavd平均队列深度归零 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param en: 0:关闭 1:使能 +* @param +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/08/05 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_avg_qlen_return_zero_en_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 en); +#endif /*TM_CGAVD */ + +/** crdt ram初始化 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/22 +************************************************************/ +DPP_STATUS dpp_tm_crdt_ram_init(ZXIC_UINT32 dev_id); + +/***********************************************************/ +/** 获取调度器类型 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param se_id 调度器编号 +* @param item_num 调度器中包含的子调度器个数 +* @param sch_type_num 调度器类型编号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/26 +************************************************************/ +DPP_STATUS dpp_tm_crdt_sch_type_get(DPP_DEV_T *dev, ZXIC_UINT32 se_id, ZXIC_UINT32 *item_num, ZXIC_UINT32 *sch_type_num); + +/***********************************************************/ +/** 配置flow级流队列的挂接关系(flow到上级调度器的挂接) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param flow_id 流队列号 +* @param c_linkid c桶要挂接到的上级调度器id +* @param c_weight c桶挂接到上级调度器的权重[1~511] +* @param c_sp c桶挂接到上级调度器的sp优先级,有效值[0-8],共9级,优先级依次降低 +* @param mode 挂接模式:0-单桶 1-双桶。配置单桶时无需关注后续参数,配0即可 +* @param e_linkid e桶要挂接到的上级调度器id +* @param e_weight e桶挂接到上级调度器的权重[1~511] +* @param e_sp e桶挂接到上级调度器的sp优先级,有效值[0-8],共9级,优先级依次降低 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_flow_link_wr(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + DPP_TM_SCH_FLOW_PARA_T *p_flow_para); + +/***********************************************************/ +/** 批量配置flow级流队列的挂接关系 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param flow_id_s 起始流队列号 +* @param flow_id_e 终止流队列号 +* @param c_linkid c桶要挂接到的上级调度器id +* @param c_weight c桶挂接到上级调度器的权重[1~511] +* @param c_sp c桶挂接到上级调度器的sp优先级,有效值[0-8],共9级,优先级依次降低 +* @param mode 挂接模式:0-单桶 1-双桶。配置单桶时无需关注后续参数,配0即可 +* @param e_linkid e桶要挂接到的上级调度器id +* @param e_weight e桶挂接到上级调度器的权重[1~511] +* @param e_sp e桶挂接到上级调度器的sp优先级,有效值[0-8],共9级,优先级依次降低 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_flow_link_more_set(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id_s, + ZXIC_UINT32 flow_id_e, + ZXIC_UINT32 c_linkid, + ZXIC_UINT32 c_weight, + ZXIC_UINT32 c_sp, + ZXIC_UINT32 mode, + ZXIC_UINT32 e_linkid, + ZXIC_UINT32 e_weight, + ZXIC_UINT32 e_sp); + +/***********************************************************/ +/** 配置调度器层次化QOS的挂接关系:非优先级传递 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param se_id 本级调度器id +* @param se_linkid 要挂接到的上级调度器id +* @param se_weight 挂接到上级调度器的权重[1~511] +* @param se_sp 挂接到上级调度器的sp优先级,有效值[0-8],共9级,优先级依次降低 +* @param se_insw 优先级传递使能:0-关 1-开。该参数不传递直接配0 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_se_link_wr(DPP_DEV_T *dev, + ZXIC_UINT32 se_id, + DPP_TM_SCH_SE_PARA_T *p_sch_se_para); + + +/***********************************************************/ +/** 配置调度器层次化QOS的挂接关系:优先级传递 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param se_id 本级调度器id +* @param se_linkid 要挂接到的上级调度器id +* @param se_sp 挂接到上级调度器的sp优先级,有效值[0-3],最多4级,优先级按调度单元分配, +* 每个调度单元内部调度器优先级相同! +* @param se_weight0-7 WFQ8中各调度器权重值[1~511],若是WFQ2/4 只取前面对应值,后面无效 +* @param se_insw 优先级传递使能:0-关 1-开. 该参数不传递直接配1 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_se_link_insw_wr(DPP_DEV_T *dev, + ZXIC_UINT32 se_id, + DPP_TM_SCH_SE_PARA_INSW_T *p_sch_se_para_insw); + +/***********************************************************/ +/** 获取流队列入链状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param flow_id 流队列号 +* @param link_state 0-未入链 1-在调度器链表中 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_flow_link_state_get(DPP_DEV_T *dev, ZXIC_UINT32 flow_id, ZXIC_UINT32 *link_state); + +/***********************************************************/ +/** 获取调度器入链状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param se_id 调度器编号 +* @param link_state 0-未入链 1-在调度器链表中 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_se_link_state_get(DPP_DEV_T *dev, ZXIC_UINT32 se_id, ZXIC_UINT32 *link_state); + +/***********************************************************/ +/** 判断crdt流删除命令是否空闲 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_del_cmd_idle(DPP_DEV_T *dev); + +/***********************************************************/ +/** 删除流/调度器挂接关系 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param id 要删除的流号或调度器id +* ETM范围:0--0xABFF; FTM范围:0-0x177F +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_del_link_set(DPP_DEV_T *dev, ZXIC_UINT32 id); + + + + +/***********************************************************/ +/** 获取pp->dev挂接关系 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param pp_id 0~63 +* @param p_weight 0~127 +* @param p_sp_mapping 0~7 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/04/20 +************************************************************/ +DPP_STATUS dpp_tm_crdt_pp_para_get(DPP_DEV_T *dev, + ZXIC_UINT32 pp_id, + ZXIC_UINT32 *p_weight, + ZXIC_UINT32 *p_sp_mapping); + +/***********************************************************/ +/** +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param que_id_s 起始队列号 +* @param que_id_e 终止队列号 +* @param en 1:过滤E桶队列CRS状态为SLOW的入链请求;0:E桶队列CRS SLOW正常入链; +* +* @return +* @remark 无 +* @see +* @author XXX @date 2019/05/08 +************************************************************/ +DPP_STATUS dpp_tm_crdt_eir_crs_filter_en_more_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 que_id_s, ZXIC_UINT32 que_id_e, ZXIC_UINT32 en); + + +/***********************************************************/ +/** +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param que_id queue id +* @param p_en +* +* @return +* @remark 无 +* @see +* @author XXX @date 2019/05/08 +************************************************************/ +DPP_STATUS dpp_tm_crdt_eir_crs_filter_en_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 que_id, ZXIC_UINT32 *p_en); + +/***********************************************************/ +/** +* @param dev_id +* @param tm_type +* @param que_id +* +* @return +* @remark 无 +* @see +* @author XXX @date 2019/05/08 +************************************************************/ +DPP_STATUS dpp_tm_crdt_eir_crs_filter_en_get_diag(ZXIC_UINT32 dev_id, ZXIC_UINT32 que_id); + + +/***********************************************************/ +/** 打印指定的全局数组值以及清空全局数组 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param para_x 数组index_x +* @param para_y 数组index_y +* @param clear_flag 清空shape全局数组 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark +* @see +* @author xuhb @date 2019/06/10 +************************************************************/ +DPP_STATUS dpp_tm_shape_para_array_prt(ZXIC_UINT32 dev_id, ZXIC_UINT32 para_x, ZXIC_UINT32 para_y, ZXIC_UINT32 clear_flag); + + +/***********************************************************/ +/** 配置shap模块中 crd_grain授权价值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param credit_value 授权价值,默认值是0x5feByte +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/08/13 +************************************************************/ +DPP_STATUS dpp_tm_shap_crd_grain_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 credit_value); + + +/***********************************************************/ +/** shap ram初始化 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/22 +************************************************************/ +DPP_STATUS dpp_tm_shap_ram_init(ZXIC_UINT32 dev_id); + +/***********************************************************/ +/** 获取流队列双桶整形使能及模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param db_en 双桶整形使能 +* @param mode 0:c+e模式,1:c+p模式 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_tm_shape_flow_db_en_get(DPP_DEV_T *dev, ZXIC_UINT32 *db_en, ZXIC_UINT32 *mode); + +/***********************************************************/ +/** 配置桶深最小单位配置:共8档:0-7 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param token_grain 3’d0:最小单位为128K +* 3’d1:最小单位为64k +* 3’d2:最小单位为32k +* 3’d3:最小单位为16k +* 3’d4:最小单位为8k +* 3’d5:最小单位为4k +* 3’d6:最小单位为2k +* 3’d7:最小单位为1k +* 默认为0,即128K +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_tm_shape_token_grain_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 token_grain); + +/***********************************************************/ +/** 获取桶深最小单位配置:共8档:0-7 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param token_grain 3’d0:最小单位为128K +* 3’d1:最小单位为64k +* 3’d2:最小单位为32k +* 3’d3:最小单位为16k +* 3’d4:最小单位为8k +* 3’d5:最小单位为4k +* 3’d6:最小单位为2k +* 3’d7:最小单位为1k +* 默认为0,即128K +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_tm_shape_token_grain_get(DPP_DEV_T *dev, ZXIC_UINT32 *token_grain); + +/***********************************************************/ +/** 配置流或调度器映射到整形参数表的某个ID +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param id 流或调度器编号ETM:0-ABFF,FTM:0-177F +* @param profile_id 整形参数表:[0-127] +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_tm_shape_map_table_set(DPP_DEV_T *dev, ZXIC_UINT32 id, ZXIC_UINT32 profile_id); + +/***********************************************************/ +/** 获取流或调度器映射到整形参数表的配置ID +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param id 流或调度器编号ETM:0-ABFF,FTM:0-177F +* @param profile_id 整形参数表:[0-127] +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_tm_shape_map_table_get(DPP_DEV_T *dev, ZXIC_UINT32 id, ZXIC_UINT32 *profile_id); + +/***********************************************************/ +/** 获取流级整形参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param flow_id 流队列号 ETM:0-9215,FTM:0-2047 +* @param cir cir速率,单位Kb,范围[64Kb - 160Gb] +* @param cbs cbs桶深,单位KB,范围[1KB - 64M] +* 注:cbs=0 表示关闭整形,即不限速 +* @param mode_e 整形模式,0-获取c桶参数,1-获取对应e桶参数 +* @param p_para_id 整形模板索引:ETM=[0-AFF],FTM=[0-17F] +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_tm_shape_flow_para_get(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 mode, + ZXIC_UINT32 *p_para_id, + DPP_TM_SHAPE_PARA_TABLE *p_flow_para_tbl); + + +/***********************************************************/ +/** etm配置流级整形参数 +* @param dev_id 设备编号 +* @param flow_id 流队列号 ETM:0-9215,FTM:0-2047 +* @param cir cir速率,单位Kb,范围[64Kb - 160Gb] +* @param cbs cbs桶深,单位KB,范围[1KB - 64M] +* @param db_en 双桶整形使能,0-单桶,1-双桶 +* @param eir eir速率,单位Kb,范围同cir +* @param ebs ebs桶深,单位Kb,范围同cbs +* 注:cbs=0 表示关闭整形,即不限速 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_etm_shape_flow_para_set(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 cir, + ZXIC_UINT32 cbs, + ZXIC_UINT32 db_en, + ZXIC_UINT32 eir, + ZXIC_UINT32 ebs); + +/***********************************************************/ +/** 获取调度单元整形参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param se_id 调度器单元号 ETM:0-63FF,FTM:0-77F +* @param cir cir速率,单位Kb,范围[64Kb - 160Gb] +* @param cbs cbs桶深,单位KB,范围[1KB - 64M] +* @param mode 整形模式,0-获取p桶参数,1-获取对应c桶参数(仅FQ8/WFQ8支持) +* @param p_para_id 整形模板索引:ETM=[0-AFF],FTM=[0-17F] +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_tm_shape_se_para_get(DPP_DEV_T *dev, + ZXIC_UINT32 se_id, + ZXIC_UINT32 mode, + ZXIC_UINT32 *p_para_id, + DPP_TM_SHAPE_PARA_TABLE *p_se_para_tbl); + + + +/***********************************************************/ +/** ftm配置调度器整形参数 +* @param dev_id 设备编号 +* @param se_id 调度器编号号 ETM:0x4800-0xABFF,FTM:0x1000-0x177F +* @param pir pir总速率,单位Kb,范围同cir +* @param pbs pbs总桶深,单位Kb,范围同cbs +* @param db_en 整形模式,0-单桶,1-双桶,仅FQ8/WFQ8有效 +* @param cir [0-3]调度器cir速率,单位Kb,范围[64Kb - 160Gb] +* @param cbs [0-3]调度器cbs桶深,单位KB,范围[1KB - 64M] +* 注:cbs=0 表示关闭整形,即不限速 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_ftm_shape_se_para_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 se_id, + ZXIC_UINT32 pir, + ZXIC_UINT32 pbs, + ZXIC_UINT32 db_en, + ZXIC_UINT32 cir, + ZXIC_UINT32 cbs); + +/***********************************************************/ +/** etm配置调度器整形参数 +* @param dev_id 设备编号 +* @param se_id 调度器编号号 ETM:0x4800-0xABFF,FTM:0x1000-0x177F +* @param pir pir总速率,单位Kb,范围同cir +* @param pbs pbs总桶深,单位Kb,范围同cbs +* @param db_en 整形模式,0-单桶,1-双桶,仅FQ8/WFQ8有效 +* @param cir [0-3]调度器cir速率,单位Kb,范围[64Kb - 160Gb] +* @param cbs [0-3]调度器cbs桶深,单位KB,范围[1KB - 64M] +* 注:cbs=0 表示关闭整形,即不限速 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_etm_shape_se_para_set(DPP_DEV_T *dev, + ZXIC_UINT32 se_id, + ZXIC_UINT32 pir, + ZXIC_UINT32 pbs, + ZXIC_UINT32 db_en, + ZXIC_UINT32 cir, + ZXIC_UINT32 cbs); + + +/***********************************************************/ +/** 写入流/调度器整形参数配置表 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param map_id 整形参数表中模板索引id ETM:0-AFF,FTM:0-17F +* @param cir 整形速率(c/e桶统一) +* @param cbs 桶深 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_tm_shape_para_set(DPP_DEV_T *dev, + ZXIC_UINT32 total_para_id, + ZXIC_UINT32 cir, + ZXIC_UINT32 cbs); + +/***********************************************************/ +/** 读取流/调度器整形参数配置表 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param total_para_id 整形参数表中模板索引id ETM:0-AFF,FTM:0-17F +* @param cir 整形速率(c/e桶统一) +* @param cbs 桶深 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_tm_shape_para_get(DPP_DEV_T *dev, + ZXIC_UINT32 total_para_id, + DPP_TM_SHAPE_PARA_TABLE *p_shap_para_tbl); + +/***********************************************************/ +/** 配置第0~15个被统计得到令牌个数的端口号 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param port_id 被统计得到令牌个数的端口号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/3/15 STM模式下使用 +************************************************************/ +DPP_STATUS dpp_tm_shape_token_pp_cfg(ZXIC_UINT32 dev_id, + ZXIC_UINT32 port_id); + +/***********************************************************/ +/** 打印各级及指定被统计的第0~15个授权流得到的授权个数 stm模式下使用 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/06/19 +************************************************************/ +DPP_STATUS dpp_tm_crdt_ackcnt_diag(ZXIC_UINT32 dev_id, ZXIC_UINT32 delay_ms); + +/***********************************************************/ +/** 读取端口级整形参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param port_id 端口号 +* @param p_para 整形信息:CIR/CBS/EN +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/04/15 +************************************************************/ +DPP_STATUS dpp_tm_shape_pp_para_get(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + DPP_TM_SHAPE_PP_PARA_T *p_para); + +/***********************************************************/ +/** 配置SA模式下各个版本的授权价值 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param sa_ver_id 版本号(0~7) +* @param sa_credit_value 授权价值 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author szq @date 2015/03/25 +************************************************************/ +DPP_STATUS dpp_tm_qmu_sa_credit_value_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 sa_ver_id, + ZXIC_UINT32 sa_credit_value); + +/***********************************************************/ +/** 获取SA模式下各个版本的授权价值 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param sa_ver_id 版本号(0~7) +* @param p_sa_credit_value 授权价值 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author szq @date 2015/03/25 +************************************************************/ +DPP_STATUS dpp_tm_qmu_sa_credit_value_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 sa_ver_id, + ZXIC_UINT32 *p_sa_credit_value); + +/***********************************************************/ +/** 配置CRS发送的速率 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param sent_cyc CRS发送的间隔(单位:时钟周期) +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author szq @date 2015/03/25 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crs_sent_rate_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 sent_cyc); + +/***********************************************************/ +/** 获取CRS发送的速率 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param p_sent_cyc CRS发送的间隔(单位:时钟周期) +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author szq @date 2015/03/25 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crs_sent_rate_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_sent_cyc); + +/***********************************************************/ +/** 配置CRS过滤使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param en 配置的值,0-不使能过滤,1-使能过滤 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crs_filter_en_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 en); + + +/***********************************************************/ +/** 配置多播授权令牌添加个数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param token_add_num 令牌添加时,每次增加的令牌数目,取值范围为1~255,默认为1;禁止配置为0,配置为0时,将不会产生授权。 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/09 +************************************************************/ +DPP_STATUS dpp_tm_qmu_mul_token_gen_num_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 token_add_num); + +/***********************************************************/ +/** 配置多播授权整形桶参数和使能参数 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param q3_lb_control_en 3号队列整形功能开启使能。0:关闭;1:开启。 +* @param q012_lb_control_en 0~2号队列整形功能开启使能。0:关闭;1:开启。 +* @param q3_lb_max_cnt 3号队列整形桶桶深。 +* @param q012_lb_max_cnt 0~2号队列整形桶桶深。 +* @param q3_lb_add_rate 3号队列令牌添加速率,时钟周期为单位。不可配置为0,配置为0整形使能时,不能产生队列3授权调度信号。 +* @param q012_lb_add_rate 0~2号队列令牌添加速率,以时钟周期单位。不可配置为0,配置为0并整形使能时,不能产生队列0、1、2授权调度信号。 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/09 +************************************************************/ +DPP_STATUS dpp_tm_qmu_mul_ack_lb_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 q3_lb_control_en, + ZXIC_UINT32 q012_lb_control_en, + ZXIC_UINT32 q3_lb_max_cnt, + ZXIC_UINT32 q012_lb_max_cnt, + ZXIC_UINT32 q3_lb_add_rate, + ZXIC_UINT32 q012_lb_add_rate); + +/***********************************************************/ +/** 配置0,1号队列挂接1或2号MCN漏桶信息 +* @param tm_type 0-ETM,1-FTM +* @param dev_id 设备索引编号 +* @param mcn_lb_sel 0:0,1号队列挂接1号MCN漏桶 1:0,1号队列挂接2号MCN漏桶 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/09 +************************************************************/ +DPP_STATUS dpp_tm_qmu_mcn_lb_sel_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 mcn_lb_sel); + +/***********************************************************/ +/** 配置多播队列0~2的授权输出SP、DWRR +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param sp_or_dwrr SP、DWRR模式选择。0:SP;1:DWRR。 +* @param dwrr_w0 0号队列DWRR权重(0~127) +* @param dwrr_w1 1号队列DWRR权重(0~127) +* @param dwrr_w2 2号队列DWRR权重(0~127) +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/09 +************************************************************/ +DPP_STATUS dpp_tm_qmu_mul_sp_dwrr_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 sp_or_dwrr, + ZXIC_UINT32 dwrr_w0, + ZXIC_UINT32 dwrr_w1, + ZXIC_UINT32 dwrr_w2); + +/***********************************************************/ +/** 配置分目的SA整形打开或关闭 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param shap_en 分目的SA整形使能开关 0:表示关闭 1:表示打开 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/09 +************************************************************/ +DPP_STATUS dpp_tm_qmu_dest_sa_shap_en_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 shap_en); + +/***********************************************************/ +/** 获得轮转扫描使能和扫描速率 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param scan_en 轮转扫描使能。0:关闭,1:开启 +* @param scan_rate 轮转扫描速率,配置扫描周期不得少于256个周期 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/10 +************************************************************/ +DPP_STATUS dpp_tm_qmu_scan_rate_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_scan_en, + ZXIC_UINT32 *p_scan_rate); + +/***********************************************************/ +/** 配置轮转扫描队列范围 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param first_que 起始队列号 +* @param last_que 终止队列号 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author whuashan @date 2019/09/10 +************************************************************/ +DPP_STATUS dpp_tm_qmu_scan_que_range_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 first_que, + ZXIC_UINT32 last_que); + +/***********************************************************/ +/** 获取轮转扫描队列范围 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param first_que 起始队列号 +* @param last_que 终止队列号 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author whuashan @date 2019/09/10 +************************************************************/ +DPP_STATUS dpp_tm_qmu_scan_que_range_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *first_que, + ZXIC_UINT32 *last_que); + +/***********************************************************/ +/** 获取QMU清空状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_clr_done_flag 队列是否清空完成 +* +* @return +* @remark 无 +* @see +* @author szq @date 2015/05/21 +************************************************************/ +DPP_STATUS dpp_tm_qmu_qlist_qcfg_clr_done_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_clr_done_flag); + + +/***********************************************************/ +/** 配置qsch调度分端口整形速率和使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param shape_en 整形使能 +* @param token_add_num [23:12]:添加令牌数目 +* @param token_gap [11:0]:添加令牌间隔,其中实际间隔为配置间隔+1 +* @param token_depth 桶深,单位B,范围[0-0x1EE00] +*公式:(600*8*token_num)/(gap+1) = X Mbps +* 主频= 600 MHz +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author xuhb 2020-5-15 +************************************************************/ +DPP_STATUS dpp_tm_qmu_qsch_port_shape_set(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + ZXIC_UINT32 token_add_num, + ZXIC_UINT32 token_gap, + ZXIC_UINT32 token_depth, + ZXIC_UINT32 shape_en); + +/***********************************************************/ +/** 配置CMD_SW分端口整形速率和使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param shape_en 整形使能 +* @param token_add_num [23:12]:添加令牌数目 +* @param token_gap [11:0]:添加令牌间隔,其中实际间隔为配置间隔+1 +* @param token_depth 桶深,单位B,范围[0-0x1EE00] +*公式:(600*8*token_num)/(gap+1) = X Mbps +* 主频= 600 MHz +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author whuashan 2020-3-17 +************************************************************/ +DPP_STATUS dpp_tm_qmu_port_shape_set(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + ZXIC_UINT32 token_add_num, + ZXIC_UINT32 token_gap, + ZXIC_UINT32 token_depth, + ZXIC_UINT32 shape_en); + +/***********************************************************/ +/** 获得CMD_SW分端口整形速率和使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_shape_en 整形使能 +* @param p_token_add_num [23:12]:添加令牌数目 +* @param p_token_gap [11:0]:添加令牌间隔,其中实际间隔为配置间隔+1 +* @param p_token_depth 桶深,单位B +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author whuashan 2020-3-17 +************************************************************/ +DPP_STATUS dpp_tm_qmu_port_shape_get(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + ZXIC_UINT32 *p_token_add_num, + ZXIC_UINT32 *p_token_gap, + ZXIC_UINT32 *p_token_depth, + ZXIC_UINT32 *p_shape_en); + +/***********************************************************/ +/** 获取CMD_SW分端口整形速率和使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param shape_vlue 整形值,单位Mbps +* @param shape_en 整形使能 +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author zmy @20151217 +************************************************************/ +DPP_STATUS dpp_tm_qmu_egress_shape_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 port_id, + ZXIC_UINT32 *shape_value, + ZXIC_UINT32 *shape_en); + + +/***********************************************************/ +/** 配置需要检测的特定队列号 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param qnum 需要检测统计的特定的队列号 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/18 +************************************************************/ +DPP_STATUS dpp_tm_qmu_spec_qnum_set(DPP_DEV_T *dev, ZXIC_UINT32 qnum); + +/***********************************************************/ +/** 获得特定的队列号 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_qnum 需要检测统计的特定的队列号 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/23 +************************************************************/ +DPP_STATUS dpp_tm_qmu_spec_qnum_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_qnum); + +/***********************************************************/ +/** 配置需要检测的队列组 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param group_num 需要检测统计的特定的队列组。这里按取q的低3bit +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/18 +************************************************************/ +DPP_STATUS dpp_tm_qmu_spec_group_set(DPP_DEV_T *dev, ZXIC_UINT32 group_num); + +/***********************************************************/ +/** 获得需要检测的队列组 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_group_num 需要检测统计的特定的队列组。这里按取q的低3bit +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/23 +************************************************************/ +DPP_STATUS dpp_tm_qmu_spec_group_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_group_num); + + +/***********************************************************/ +/** 配置队列授权盈余 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param qnum 配置的队列号 +* @param value 授权盈余 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/18 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crbal_value_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 qnum, + ZXIC_UINT32 value); + +/***********************************************************/ +/** 获得队列授权盈余 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param qnum 配置的队列号 +* @param p_value 授权盈余 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/23 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crbal_value_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 qnum, + ZXIC_UINT32 *p_value); + +/***********************************************************/ +/** 配置分目的SA整形桶深上、下限参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param max_value 分目的SA整形桶深上限,必须配置为正值 +* @param min_value 分目的SA整形桶深下限,必须配置为负值 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/18 +************************************************************/ +DPP_STATUS dpp_tm_qmu_dest_sa_shape_para_set(ZXIC_UINT32 dev_id, + ZXIC_SINT32 max_value, + ZXIC_SINT32 min_value); + +/***********************************************************/ +/** 获得分目的SA整形桶深上、下限参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_max_value 分目的SA整形桶深上限,必须配置为正值 +* @param p_min_value 分目的SA整形桶深下限,必须配置为负值 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/23 +************************************************************/ +DPP_STATUS dpp_tm_qmu_dest_sa_shape_para_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_max_value, + ZXIC_UINT32 *p_min_value); + +/***********************************************************/ +/** 获取特定队列发送的crs normal的个数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param 注 须先设置统计的特定队列 +* @param +* @return +* @remark 无 +* @see +* @author yjd @date 2015/07/09 +************************************************************/ +DPP_STATUS dpp_tm_qmu_spec_q_crs_normal_cnt(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_que_crs_normal_cnt); + +/***********************************************************/ +/** 获取特定队列发送的crs off的个数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param 注 须先设置统计的特定队列 +* @param +* @return +* @remark 无 +* @see +* @author yjd @date 2015/07/09 +************************************************************/ +DPP_STATUS dpp_tm_qmu_spec_q_crs_off_cnt(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_que_crs_off_cnt); + +/***********************************************************/ +/** QMU初始化配置场景 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param case_no 四组QMU初始化场景编号为1-4;ddr*bank:1:4x2;2:4x4;3:8x2;4:4x8. +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 case_no); + +/***********************************************************/ +/** TMMU TM纯片内模式配置获取 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_imem_en 1纯片内 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2017/10/14 +************************************************************/ +DPP_STATUS dpp_tm_tmmu_imem_en_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_imem_en); + +/***********************************************************/ +/** TMMU 强制DDR RDY配置获取 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_ddr_force_rdy 1、如果bit【0】配置为1,则QMU看到的DDR0 RDY一直为1。 + 2、bit【0】代表DDR0,bit【7】代表DDR7。 + 3、纯片内模式需要配置为8'hff,排除DDR干扰。 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2017/10/14 +************************************************************/ +DPP_STATUS dpp_tm_tmmu_ddr_force_rdy_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_ddr_force_rdy); + +DPP_STATUS dpp_tm_mr_init(ZXIC_UINT32 dev_id); +/***********************************************************/ +/** 配置TM模式下初始化代码 +* @param dev_id +* @param tm_type 0-ETM,1-FTM +* @param p_tm_init_info 配置TM模式下初始化信息包括以下 +* blk_size 配置qmu block大小 +* case_num 四组QMU初始化场景编号为1-4;ddr*bank:1:4x2;2:4x4;3:8x2;4:4x8. +* imem_omem; 0:片内外混合; 1:纯片内;2:纯片外 +* mode 0:TM 1:SA +* +* @return +* @remark 无 +* @see +* @author szq @date 2015/03/26 +************************************************************/ +DPP_STATUS dpp_tm_asic_init(ZXIC_UINT32 dev_id, DPP_TM_ASIC_INIT_INFO_T *p_tm_asic_init_info); + +/***********************************************************/ +/** 配置TM模式下初始化代码 +* @param dev_id +* @param tm_type 0-ETM,1-FTM +* @param p_tm_init_info 配置TM模式下初始化信息包括以下 +* blk_size 配置qmu block大小 +* case_num 四组QMU初始化场景编号为1-4;ddr*bank:1:4x2;2:4x4;3:8x2;4:4x8. +* imem_omem; 0:片内外混合; 1:纯片内;2:纯片外 +* mode 0:TM 1:SA +* +* @return +* @remark 无 +* @see +* @author szq @date 2015/03/26 +************************************************************/ +DPP_STATUS dpp_tm_asic_init_diag(ZXIC_UINT32 dev_id, ZXIC_UINT32 blk_size, ZXIC_UINT32 case_num, ZXIC_UINT32 imem_omem, ZXIC_UINT32 mode); + +/**************************************************************************** +* 函数名称: dpp_tm_avg_que_len_get +* 功能描述: 各级平均队列深度获取 +* 输入参数: dev_id: 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* cgavd_level: 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* que_id: 本级别层次内的队列编号。 +* 输出参数: p_avg_len: 平均队列深度,单位为BLOCK。 +* 返 回 值: DPP_OK-成功,DPP_ERR-失败 +* 其它说明: +* author cy @date 2015/06/29 +*****************************************************************************/ +DPP_STATUS dpp_tm_avg_que_len_get(ZXIC_UINT32 dev_id, + DPP_TM_CGAVD_LEVEL_E cgavd_level, + ZXIC_UINT32 que_id, + ZXIC_UINT32 *p_avg_len); + +/***********************************************************/ +/** 获取配置CPU设置的报文长度是否参与计算丢弃概率的使能 +* @param tm_type 0-ETM,1-FTM +* @param flag 忽略乘法里的当前包长和最大包长比标志位:1为忽略 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2015/11/9 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_wred_pke_len_calc_sign_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_flag); + +/***********************************************************/ +/** 配置配置cgavd模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param mode 0:block mode 1:byte mode +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/07/28 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_cfg_mode_set(DPP_DEV_T *dev, + ZXIC_UINT32 mode); + + +/***********************************************************/ +/** 配置配置cgavd模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_mode 0:block mode 1:byte mode +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/07/29 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_cfg_mode_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_mode); + + +/***********************************************************/ +/** 配置TD拥塞避免模式下的丢弃门限值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* @param id 队列号或端口号,系统级时,id参数无效 +* @param byte_block_th 配置的丢弃门限值,ZXIC_UINT8/BLOCK单位写入寄存器 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/07/29 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_td_byte_block_th_set(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + ZXIC_UINT32 byte_block_th); + + +/***********************************************************/ +/** 读取TD拥塞避免模式下的丢弃门限值字节模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* @param id 队列号或端口号,系统级时,id参数无效 +* @param p_byte_block_th 配置的丢弃门限值ZXIC_UINT8/BLOCK单位 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/07/29 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_td_byte_block_th_get(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + ZXIC_UINT32 *p_byte_block_th); + + +/***********************************************************/ +/** 配置通用门限block模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param byte_block_uni_th 通用门限值block/byte单位 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/08/01 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_uniform_byte_block_th_set(DPP_DEV_T *dev, ZXIC_UINT32 byte_block_uni_th); + +/***********************************************************/ +/** 读取通用门限 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_byte_block_uni_th 通用门限值block/byte单位 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/08/01 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_uniform_byte_block_th_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_byte_block_uni_th); + + + +/***********TM CPU软复位接口 Begin*************/ +/***********************************************************/ +/** 设置TM的全局变量,shape_para只保存profile被使用的数量,整形相关参数从寄存器中重新读取 +* @param dev_id +* @param size data_buff的长度 +* @param p_data_buff 需要恢复的内容 +* +* @return +* @remark 无 +* @see +* @author XXX @date 2018/06/25 +************************************************************/ +DPP_STATUS dpp_tm_glb_mgr_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 size, ZXIC_UINT8 *p_data_buff); + +/***********************************************************/ +/** 获取TM的全局变量,shape_para只保存profile被使用的数量,整形相关参数从寄存器中重新读取 +* @param dev_id +* @param p_flag 上层释放data_buff的标志,1:需要上层free,0:不需要上层free +* @param p_size data_buff的长度 +* @param pp_data_buff 二级指针(指向函数内部malloc空间的地址) +* +* @return +* @remark 无 +* @see +* @author XXX @date 2018/06/25 +************************************************************/ +DPP_STATUS dpp_tm_glb_mgr_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_flag, ZXIC_UINT32 *p_size, ZXIC_UINT8 **pp_data_buff); + +/***********************************************************/ +/** 获取TM的全局变量,shape_para只保存profile被使用的数量,整形相关参数从寄存器中重新读取 +* @param dev_id +* @param p_size data_buff的长度 +* +* @return +* @remark 无 +* @see +* @author XXX @date 2018/06/25 +************************************************************/ +DPP_STATUS dpp_tm_glb_size_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_size); + + +/***********************************************************/ +/** 配置tm授权价值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param credit_value 授权价值,默认值是0x5feByte +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/08/13 +************************************************************/ +DPP_STATUS dpp_tm_credit_value_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 credit_value); + +/***********************************************************/ +/** 获取全局数组中用户实际配置的整形值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param flow_id 流队列号 ETM:0-9215,FTM:0-2047 +* @param cir cir速率,单位Kb,范围[64Kb - 160Gb] +* @param cbs cbs桶深,单位KB,范围[1KB - 64M] +* 注:cbs=0 表示关闭整形,即不限速 +* @param mode_e 整形模式,0-获取c桶参数,1-获取对应e桶参数 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark +* @see +* @author xuhb @date 2019/06/10 +************************************************************/ +DPP_STATUS dpp_tm_shape_flow_para_array_get(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 mode, + DPP_TM_SHAPE_PARA_TABLE *p_flow_para_tbl); + + +#endif +/* 必须有个空行,否则可能编不过 */ + + + + + + + + + + + + + + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_axi_reg.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_axi_reg.h new file mode 100644 index 0000000..12bb803 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_axi_reg.h @@ -0,0 +1,50 @@ + +#ifndef _DPP_AXI_REG_H_ +#define _DPP_AXI_REG_H_ + +#ifdef __cplusplus +extern "C"{ +#endif + +typedef struct dpp_axi_axi_conv_cfg_epid_v_func_num_t +{ + ZXIC_UINT32 user_en; + ZXIC_UINT32 cfg_epid; + ZXIC_UINT32 cfg_vfunc_num; + ZXIC_UINT32 cfg_func_num; + ZXIC_UINT32 cfg_vfunc_active; +}DPP_AXI_AXI_CONV_CFG_EPID_V_FUNC_NUM_T; + +typedef struct dpp_axi_axi_conv_info_axim_rw_hsk_cnt_t +{ + ZXIC_UINT32 axim_rd_handshake_cnt; + ZXIC_UINT32 axim_wr_handshake_cnt; +}DPP_AXI_AXI_CONV_INFO_AXIM_RW_HSK_CNT_T; + +typedef struct dpp_axi_axi_conv_info_axim_last_wr_id_t +{ + ZXIC_UINT32 axim_rd_id; + ZXIC_UINT32 axim_wr_id; +}DPP_AXI_AXI_CONV_INFO_AXIM_LAST_WR_ID_T; + +typedef struct dpp_axi_axi_conv_info_axim_last_wr_addr_h_t +{ + ZXIC_UINT32 aximlastwraddrhigh; +}DPP_AXI_AXI_CONV_INFO_AXIM_LAST_WR_ADDR_H_T; + +typedef struct dpp_axi_axi_conv_info_axim_last_wr_addr_l_t +{ + ZXIC_UINT32 aximlastrdaddrlow; +}DPP_AXI_AXI_CONV_INFO_AXIM_LAST_WR_ADDR_L_T; + +typedef struct dpp_axi_axi_conv_cfg_debug_info_clr_en_t +{ + ZXIC_UINT32 cfg_global_clr_en; +}DPP_AXI_AXI_CONV_CFG_DEBUG_INFO_CLR_EN_T; + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_cfg_reg.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_cfg_reg.h new file mode 100644 index 0000000..fa2fd7f --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_cfg_reg.h @@ -0,0 +1,1248 @@ + +#ifndef _DPP_CFG_REG_H_ +#define _DPP_CFG_REG_H_ + +#ifdef __cplusplus +extern "C"{ +#endif + +typedef struct dpp_cfg_pcie_int_repeat_t +{ + ZXIC_UINT32 int_repeat; +}DPP_CFG_PCIE_INT_REPEAT_T; + +typedef struct dpp_cfg_dma_dma_up_size_t +{ + ZXIC_UINT32 dma_up_size; +}DPP_CFG_DMA_DMA_UP_SIZE_T; + +typedef struct dpp_cfg_csr_soc_wr_time_out_thresh_t +{ + ZXIC_UINT32 soc_wr_time_out_thresh; +}DPP_CFG_CSR_SOC_WR_TIME_OUT_THRESH_T; + +typedef struct dpp_cfg_pcie_pcie_ddr_switch_t +{ + ZXIC_UINT32 pcie_ddr_switch; +}DPP_CFG_PCIE_PCIE_DDR_SWITCH_T; + +typedef struct dpp_cfg_pcie_user0_int_en_t +{ + ZXIC_UINT32 user_int_en; +}DPP_CFG_PCIE_USER0_INT_EN_T; + +typedef struct dpp_cfg_pcie_user0_int_mask_t +{ + ZXIC_UINT32 user_int_mask; +}DPP_CFG_PCIE_USER0_INT_MASK_T; + +typedef struct dpp_cfg_pcie_user0_int_status_t +{ + ZXIC_UINT32 user_int_status; +}DPP_CFG_PCIE_USER0_INT_STATUS_T; + +typedef struct dpp_cfg_pcie_user1_int_en_t +{ + ZXIC_UINT32 user_int_en; +}DPP_CFG_PCIE_USER1_INT_EN_T; + +typedef struct dpp_cfg_pcie_user1_int_mask_t +{ + ZXIC_UINT32 user_int_mask; +}DPP_CFG_PCIE_USER1_INT_MASK_T; + +typedef struct dpp_cfg_pcie_user1_int_status_t +{ + ZXIC_UINT32 user_int_status; +}DPP_CFG_PCIE_USER1_INT_STATUS_T; + +typedef struct dpp_cfg_pcie_user2_int_en_t +{ + ZXIC_UINT32 user_int_en; +}DPP_CFG_PCIE_USER2_INT_EN_T; + +typedef struct dpp_cfg_pcie_user2_int_mask_t +{ + ZXIC_UINT32 user_int_mask; +}DPP_CFG_PCIE_USER2_INT_MASK_T; + +typedef struct dpp_cfg_pcie_user2_int_status_t +{ + ZXIC_UINT32 user_int_status; +}DPP_CFG_PCIE_USER2_INT_STATUS_T; + +typedef struct dpp_cfg_pcie_ecc_1b_int_en_t +{ + ZXIC_UINT32 ecc_1b_int_en; +}DPP_CFG_PCIE_ECC_1B_INT_EN_T; + +typedef struct dpp_cfg_pcie_ecc_1b_int_mask_t +{ + ZXIC_UINT32 ecc_1b_int_mask; +}DPP_CFG_PCIE_ECC_1B_INT_MASK_T; + +typedef struct dpp_cfg_pcie_ecc_1b_int_status_t +{ + ZXIC_UINT32 ecc_1b_int_status; +}DPP_CFG_PCIE_ECC_1B_INT_STATUS_T; + +typedef struct dpp_cfg_pcie_ecc_2b_int_en_t +{ + ZXIC_UINT32 ecc_2b_int_en; +}DPP_CFG_PCIE_ECC_2B_INT_EN_T; + +typedef struct dpp_cfg_pcie_ecc_2b_int_mask_t +{ + ZXIC_UINT32 ecc_2b_int_mask; +}DPP_CFG_PCIE_ECC_2B_INT_MASK_T; + +typedef struct dpp_cfg_pcie_ecc_2b_int_status_t +{ + ZXIC_UINT32 ecc_2b_int_status; +}DPP_CFG_PCIE_ECC_2B_INT_STATUS_T; + +typedef struct dpp_cfg_pcie_cfg_int_status_t +{ + ZXIC_UINT32 cfg_int_status; +}DPP_CFG_PCIE_CFG_INT_STATUS_T; + +typedef struct dpp_cfg_pcie_i_core_to_cntl_t +{ + ZXIC_UINT32 i_core_to_cntl; +}DPP_CFG_PCIE_I_CORE_TO_CNTL_T; + +typedef struct dpp_cfg_pcie_test_in_low_t +{ + ZXIC_UINT32 test_in_low; +}DPP_CFG_PCIE_TEST_IN_LOW_T; + +typedef struct dpp_cfg_pcie_test_in_high_t +{ + ZXIC_UINT32 test_in_high; +}DPP_CFG_PCIE_TEST_IN_HIGH_T; + +typedef struct dpp_cfg_pcie_local_interrupt_out_t +{ + ZXIC_UINT32 local_interrupt_out; +}DPP_CFG_PCIE_LOCAL_INTERRUPT_OUT_T; + +typedef struct dpp_cfg_pcie_pl_ltssm_t +{ + ZXIC_UINT32 pl_ltssm; +}DPP_CFG_PCIE_PL_LTSSM_T; + +typedef struct dpp_cfg_pcie_test_out0_t +{ + ZXIC_UINT32 test_out0; +}DPP_CFG_PCIE_TEST_OUT0_T; + +typedef struct dpp_cfg_pcie_test_out1_t +{ + ZXIC_UINT32 test_out1; +}DPP_CFG_PCIE_TEST_OUT1_T; + +typedef struct dpp_cfg_pcie_test_out2_t +{ + ZXIC_UINT32 test_out2; +}DPP_CFG_PCIE_TEST_OUT2_T; + +typedef struct dpp_cfg_pcie_test_out3_t +{ + ZXIC_UINT32 test_out3; +}DPP_CFG_PCIE_TEST_OUT3_T; + +typedef struct dpp_cfg_pcie_test_out4_t +{ + ZXIC_UINT32 test_out4; +}DPP_CFG_PCIE_TEST_OUT4_T; + +typedef struct dpp_cfg_pcie_test_out5_t +{ + ZXIC_UINT32 test_out5; +}DPP_CFG_PCIE_TEST_OUT5_T; + +typedef struct dpp_cfg_pcie_test_out6_t +{ + ZXIC_UINT32 test_out6; +}DPP_CFG_PCIE_TEST_OUT6_T; + +typedef struct dpp_cfg_pcie_test_out7_t +{ + ZXIC_UINT32 test_out7; +}DPP_CFG_PCIE_TEST_OUT7_T; + +typedef struct dpp_cfg_pcie_sync_o_core_status_t +{ + ZXIC_UINT32 sync_o_core_status; +}DPP_CFG_PCIE_SYNC_O_CORE_STATUS_T; + +typedef struct dpp_cfg_pcie_sync_o_alert_dbe_t +{ + ZXIC_UINT32 sync_o_alert_dbe; +}DPP_CFG_PCIE_SYNC_O_ALERT_DBE_T; + +typedef struct dpp_cfg_pcie_sync_o_alert_sbe_t +{ + ZXIC_UINT32 sync_o_alert_sbe; +}DPP_CFG_PCIE_SYNC_O_ALERT_SBE_T; + +typedef struct dpp_cfg_pcie_sync_o_link_loopback_en_t +{ + ZXIC_UINT32 sync_o_link_loopback_en; +}DPP_CFG_PCIE_SYNC_O_LINK_LOOPBACK_EN_T; + +typedef struct dpp_cfg_pcie_sync_o_local_fs_lf_valid_t +{ + ZXIC_UINT32 sync_o_local_fs_lf_valid; +}DPP_CFG_PCIE_SYNC_O_LOCAL_FS_LF_VALID_T; + +typedef struct dpp_cfg_pcie_sync_o_rx_idle_detect_t +{ + ZXIC_UINT32 sync_o_rx_idle_detect; +}DPP_CFG_PCIE_SYNC_O_RX_IDLE_DETECT_T; + +typedef struct dpp_cfg_pcie_sync_o_rx_rdy_t +{ + ZXIC_UINT32 sync_o_rx_rdy; +}DPP_CFG_PCIE_SYNC_O_RX_RDY_T; + +typedef struct dpp_cfg_pcie_sync_o_tx_rdy_t +{ + ZXIC_UINT32 sync_o_tx_rdy; +}DPP_CFG_PCIE_SYNC_O_TX_RDY_T; + +typedef struct dpp_cfg_pcie_pcie_link_up_cnt_t +{ + ZXIC_UINT32 pcie_link_up_cnt; +}DPP_CFG_PCIE_PCIE_LINK_UP_CNT_T; + +typedef struct dpp_cfg_pcie_test_out_pcie0_t +{ + ZXIC_UINT32 test_out_pcie0; +}DPP_CFG_PCIE_TEST_OUT_PCIE0_T; + +typedef struct dpp_cfg_pcie_test_out_pcie1_t +{ + ZXIC_UINT32 test_out_pcie1; +}DPP_CFG_PCIE_TEST_OUT_PCIE1_T; + +typedef struct dpp_cfg_pcie_test_out_pcie2_t +{ + ZXIC_UINT32 test_out_pcie2; +}DPP_CFG_PCIE_TEST_OUT_PCIE2_T; + +typedef struct dpp_cfg_pcie_test_out_pcie3_t +{ + ZXIC_UINT32 test_out_pcie3; +}DPP_CFG_PCIE_TEST_OUT_PCIE3_T; + +typedef struct dpp_cfg_pcie_test_out_pcie4_t +{ + ZXIC_UINT32 test_out_pcie4; +}DPP_CFG_PCIE_TEST_OUT_PCIE4_T; + +typedef struct dpp_cfg_pcie_test_out_pcie5_t +{ + ZXIC_UINT32 test_out_pcie5; +}DPP_CFG_PCIE_TEST_OUT_PCIE5_T; + +typedef struct dpp_cfg_pcie_test_out_pcie6_t +{ + ZXIC_UINT32 test_out_pcie6; +}DPP_CFG_PCIE_TEST_OUT_PCIE6_T; + +typedef struct dpp_cfg_pcie_test_out_pcie7_t +{ + ZXIC_UINT32 test_out_pcie7; +}DPP_CFG_PCIE_TEST_OUT_PCIE7_T; + +typedef struct dpp_cfg_pcie_test_out_pcie8_t +{ + ZXIC_UINT32 test_out_pcie8; +}DPP_CFG_PCIE_TEST_OUT_PCIE8_T; + +typedef struct dpp_cfg_pcie_test_out_pcie9_t +{ + ZXIC_UINT32 test_out_pcie9; +}DPP_CFG_PCIE_TEST_OUT_PCIE9_T; + +typedef struct dpp_cfg_pcie_test_out_pcie10_t +{ + ZXIC_UINT32 test_out_pcie10; +}DPP_CFG_PCIE_TEST_OUT_PCIE10_T; + +typedef struct dpp_cfg_pcie_test_out_pcie11_t +{ + ZXIC_UINT32 test_out_pcie11; +}DPP_CFG_PCIE_TEST_OUT_PCIE11_T; + +typedef struct dpp_cfg_pcie_test_out_pcie12_t +{ + ZXIC_UINT32 test_out_pcie12; +}DPP_CFG_PCIE_TEST_OUT_PCIE12_T; + +typedef struct dpp_cfg_pcie_test_out_pcie13_t +{ + ZXIC_UINT32 test_out_pcie13; +}DPP_CFG_PCIE_TEST_OUT_PCIE13_T; + +typedef struct dpp_cfg_pcie_test_out_pcie14_t +{ + ZXIC_UINT32 test_out_pcie14; +}DPP_CFG_PCIE_TEST_OUT_PCIE14_T; + +typedef struct dpp_cfg_pcie_test_out_pcie15_t +{ + ZXIC_UINT32 test_out_pcie15; +}DPP_CFG_PCIE_TEST_OUT_PCIE15_T; + +typedef struct dpp_cfg_pcie_int_repeat_en_t +{ + ZXIC_UINT32 int_repeat_en; +}DPP_CFG_PCIE_INT_REPEAT_EN_T; + +typedef struct dpp_cfg_pcie_dbg_awid_axi_mst_t +{ + ZXIC_UINT32 dbg_awid_axi_mst; +}DPP_CFG_PCIE_DBG_AWID_AXI_MST_T; + +typedef struct dpp_cfg_pcie_dbg_awaddr_axi_mst0_t +{ + ZXIC_UINT32 dbg_awaddr_axi_mst0; +}DPP_CFG_PCIE_DBG_AWADDR_AXI_MST0_T; + +typedef struct dpp_cfg_pcie_dbg_awaddr_axi_mst1_t +{ + ZXIC_UINT32 dbg_awaddr_axi_mst1; +}DPP_CFG_PCIE_DBG_AWADDR_AXI_MST1_T; + +typedef struct dpp_cfg_pcie_dbg_awlen_axi_mst_t +{ + ZXIC_UINT32 dbg_awlen_axi_mst; +}DPP_CFG_PCIE_DBG_AWLEN_AXI_MST_T; + +typedef struct dpp_cfg_pcie_dbg_awsize_axi_mst_t +{ + ZXIC_UINT32 dbg_awid_axi_mst; +}DPP_CFG_PCIE_DBG_AWSIZE_AXI_MST_T; + +typedef struct dpp_cfg_pcie_dbg_awburst_axi_mst_t +{ + ZXIC_UINT32 dbg_awburst_axi_mst; +}DPP_CFG_PCIE_DBG_AWBURST_AXI_MST_T; + +typedef struct dpp_cfg_pcie_dbg_awlock_axi_mst_t +{ + ZXIC_UINT32 dbg_awlock_axi_mst; +}DPP_CFG_PCIE_DBG_AWLOCK_AXI_MST_T; + +typedef struct dpp_cfg_pcie_dbg_awcache_axi_mst_t +{ + ZXIC_UINT32 dbg_awcache_axi_mst; +}DPP_CFG_PCIE_DBG_AWCACHE_AXI_MST_T; + +typedef struct dpp_cfg_pcie_dbg_awprot_axi_mst_t +{ + ZXIC_UINT32 dbg_awprot_axi_mst; +}DPP_CFG_PCIE_DBG_AWPROT_AXI_MST_T; + +typedef struct dpp_cfg_pcie_dbg_wid_axi_mst_t +{ + ZXIC_UINT32 dbg_wid_axi_mst; +}DPP_CFG_PCIE_DBG_WID_AXI_MST_T; + +typedef struct dpp_cfg_pcie_dbg_wdata_axi_mst0_t +{ + ZXIC_UINT32 dbg_wdata_axi_mst0; +}DPP_CFG_PCIE_DBG_WDATA_AXI_MST0_T; + +typedef struct dpp_cfg_pcie_dbg_wdata_axi_mst1_t +{ + ZXIC_UINT32 dbg_wdata_axi_mst1; +}DPP_CFG_PCIE_DBG_WDATA_AXI_MST1_T; + +typedef struct dpp_cfg_pcie_dbg_wdata_axi_mst2_t +{ + ZXIC_UINT32 dbg_wdata_axi_mst2; +}DPP_CFG_PCIE_DBG_WDATA_AXI_MST2_T; + +typedef struct dpp_cfg_pcie_dbg_wdata_axi_mst3_t +{ + ZXIC_UINT32 dbg_wdata_axi_mst3; +}DPP_CFG_PCIE_DBG_WDATA_AXI_MST3_T; + +typedef struct dpp_cfg_pcie_dbg_wstrb_axi_mst_t +{ + ZXIC_UINT32 dbg_wstrb_axi_mst; +}DPP_CFG_PCIE_DBG_WSTRB_AXI_MST_T; + +typedef struct dpp_cfg_pcie_dbg_wlast_axi_mst_t +{ + ZXIC_UINT32 dbg_wlast_axi_mst; +}DPP_CFG_PCIE_DBG_WLAST_AXI_MST_T; + +typedef struct dpp_cfg_pcie_dbg_arid_axi_mst_t +{ + ZXIC_UINT32 dbg_arid_axi_mst; +}DPP_CFG_PCIE_DBG_ARID_AXI_MST_T; + +typedef struct dpp_cfg_pcie_dbg_araddr_axi_mst0_t +{ + ZXIC_UINT32 dbg_araddr_axi_mst0; +}DPP_CFG_PCIE_DBG_ARADDR_AXI_MST0_T; + +typedef struct dpp_cfg_pcie_dbg_araddr_axi_mst1_t +{ + ZXIC_UINT32 dbg_araddr_axi_mst1; +}DPP_CFG_PCIE_DBG_ARADDR_AXI_MST1_T; + +typedef struct dpp_cfg_pcie_dbg_arlen_axi_mst_t +{ + ZXIC_UINT32 dbg_arlen_axi_mst; +}DPP_CFG_PCIE_DBG_ARLEN_AXI_MST_T; + +typedef struct dpp_cfg_pcie_dbg_arsize_axi_mst_t +{ + ZXIC_UINT32 dbg_arsize_axi_mst; +}DPP_CFG_PCIE_DBG_ARSIZE_AXI_MST_T; + +typedef struct dpp_cfg_pcie_dbg_arburst_axi_mst_t +{ + ZXIC_UINT32 dbg_arburst_axi_mst; +}DPP_CFG_PCIE_DBG_ARBURST_AXI_MST_T; + +typedef struct dpp_cfg_pcie_dbg_arlock_axi_mst_t +{ + ZXIC_UINT32 dbg_arlock_axi_mst; +}DPP_CFG_PCIE_DBG_ARLOCK_AXI_MST_T; + +typedef struct dpp_cfg_pcie_dbg_arcache_axi_mst_t +{ + ZXIC_UINT32 dbg_arcache_axi_mst; +}DPP_CFG_PCIE_DBG_ARCACHE_AXI_MST_T; + +typedef struct dpp_cfg_pcie_dbg_arprot_axi_mst_t +{ + ZXIC_UINT32 dbg_arprot_axi_mst; +}DPP_CFG_PCIE_DBG_ARPROT_AXI_MST_T; + +typedef struct dpp_cfg_pcie_dbg_rdata_axi_mst0_t +{ + ZXIC_UINT32 dbg_rdata_axi_mst0; +}DPP_CFG_PCIE_DBG_RDATA_AXI_MST0_T; + +typedef struct dpp_cfg_pcie_dbg_rdata_axi_mst1_t +{ + ZXIC_UINT32 dbg_rdata_axi_mst1; +}DPP_CFG_PCIE_DBG_RDATA_AXI_MST1_T; + +typedef struct dpp_cfg_pcie_dbg_rdata_axi_mst2_t +{ + ZXIC_UINT32 dbg_rdata_axi_mst2; +}DPP_CFG_PCIE_DBG_RDATA_AXI_MST2_T; + +typedef struct dpp_cfg_pcie_dbg_rdata_axi_mst3_t +{ + ZXIC_UINT32 dbg_rdata_axi_mst3; +}DPP_CFG_PCIE_DBG_RDATA_AXI_MST3_T; + +typedef struct dpp_cfg_pcie_axi_mst_state_t +{ + ZXIC_UINT32 axi_mst_state; +}DPP_CFG_PCIE_AXI_MST_STATE_T; + +typedef struct dpp_cfg_pcie_axi_cfg_state_t +{ + ZXIC_UINT32 axi_cfg_state; +}DPP_CFG_PCIE_AXI_CFG_STATE_T; + +typedef struct dpp_cfg_pcie_axi_slv_rd_state_t +{ + ZXIC_UINT32 axi_slv_rd_state; +}DPP_CFG_PCIE_AXI_SLV_RD_STATE_T; + +typedef struct dpp_cfg_pcie_axi_slv_wr_state_t +{ + ZXIC_UINT32 axi_slv_wr_state; +}DPP_CFG_PCIE_AXI_SLV_WR_STATE_T; + +typedef struct dpp_cfg_pcie_axim_delay_en_t +{ + ZXIC_UINT32 axim_delay_en; +}DPP_CFG_PCIE_AXIM_DELAY_EN_T; + +typedef struct dpp_cfg_pcie_axim_delay_t +{ + ZXIC_UINT32 axim_delay; +}DPP_CFG_PCIE_AXIM_DELAY_T; + +typedef struct dpp_cfg_pcie_axim_speed_wr_t +{ + ZXIC_UINT32 axim_speed_wr; +}DPP_CFG_PCIE_AXIM_SPEED_WR_T; + +typedef struct dpp_cfg_pcie_axim_speed_rd_t +{ + ZXIC_UINT32 axim_speed_rd; +}DPP_CFG_PCIE_AXIM_SPEED_RD_T; + +typedef struct dpp_cfg_pcie_dbg_awaddr_axi_slv0_t +{ + ZXIC_UINT32 dbg_awaddr_axi_slv0; +}DPP_CFG_PCIE_DBG_AWADDR_AXI_SLV0_T; + +typedef struct dpp_cfg_pcie_dbg_awaddr_axi_slv1_t +{ + ZXIC_UINT32 dbg_awaddr_axi_slv1; +}DPP_CFG_PCIE_DBG_AWADDR_AXI_SLV1_T; + +typedef struct dpp_cfg_pcie_dbg0_wdata_axi_slv0_t +{ + ZXIC_UINT32 dbg0_wdata_axi_slv0; +}DPP_CFG_PCIE_DBG0_WDATA_AXI_SLV0_T; + +typedef struct dpp_cfg_pcie_dbg0_wdata_axi_slv1_t +{ + ZXIC_UINT32 dbg0_wdata_axi_slv1; +}DPP_CFG_PCIE_DBG0_WDATA_AXI_SLV1_T; + +typedef struct dpp_cfg_pcie_dbg0_wdata_axi_slv2_t +{ + ZXIC_UINT32 dbg0_wdata_axi_slv2; +}DPP_CFG_PCIE_DBG0_WDATA_AXI_SLV2_T; + +typedef struct dpp_cfg_pcie_dbg0_wdata_axi_slv3_t +{ + ZXIC_UINT32 dbg0_wdata_axi_slv3; +}DPP_CFG_PCIE_DBG0_WDATA_AXI_SLV3_T; + +typedef struct dpp_cfg_pcie_dbg1_wdata_axi_slv0_t +{ + ZXIC_UINT32 dbg1_wdata_axi_slv0; +}DPP_CFG_PCIE_DBG1_WDATA_AXI_SLV0_T; + +typedef struct dpp_cfg_pcie_dbg1_wdata_axi_slv1_t +{ + ZXIC_UINT32 dbg1_wdata_axi_slv1; +}DPP_CFG_PCIE_DBG1_WDATA_AXI_SLV1_T; + +typedef struct dpp_cfg_pcie_dbg1_wdata_axi_slv2_t +{ + ZXIC_UINT32 dbg1_wdata_axi_slv2; +}DPP_CFG_PCIE_DBG1_WDATA_AXI_SLV2_T; + +typedef struct dpp_cfg_pcie_dbg1_wdata_axi_slv3_t +{ + ZXIC_UINT32 dbg1_wdata_axi_slv3; +}DPP_CFG_PCIE_DBG1_WDATA_AXI_SLV3_T; + +typedef struct dpp_cfg_pcie_dbg2_wdata_axi_slv0_t +{ + ZXIC_UINT32 dbg2_wdata_axi_slv0; +}DPP_CFG_PCIE_DBG2_WDATA_AXI_SLV0_T; + +typedef struct dpp_cfg_pcie_dbg2_wdata_axi_slv1_t +{ + ZXIC_UINT32 dbg2_wdata_axi_slv1; +}DPP_CFG_PCIE_DBG2_WDATA_AXI_SLV1_T; + +typedef struct dpp_cfg_pcie_dbg2_wdata_axi_slv2_t +{ + ZXIC_UINT32 dbg2_wdata_axi_slv2; +}DPP_CFG_PCIE_DBG2_WDATA_AXI_SLV2_T; + +typedef struct dpp_cfg_pcie_dbg2_wdata_axi_slv3_t +{ + ZXIC_UINT32 dbg2_wdata_axi_slv3; +}DPP_CFG_PCIE_DBG2_WDATA_AXI_SLV3_T; + +typedef struct dpp_cfg_pcie_dbg3_wdata_axi_slv0_t +{ + ZXIC_UINT32 dbg3_wdata_axi_slv0; +}DPP_CFG_PCIE_DBG3_WDATA_AXI_SLV0_T; + +typedef struct dpp_cfg_pcie_dbg3_wdata_axi_slv1_t +{ + ZXIC_UINT32 dbg3_wdata_axi_slv1; +}DPP_CFG_PCIE_DBG3_WDATA_AXI_SLV1_T; + +typedef struct dpp_cfg_pcie_dbg3_wdata_axi_slv2_t +{ + ZXIC_UINT32 dbg3_wdata_axi_slv2; +}DPP_CFG_PCIE_DBG3_WDATA_AXI_SLV2_T; + +typedef struct dpp_cfg_pcie_dbg3_wdata_axi_slv3_t +{ + ZXIC_UINT32 dbg3_wdata_axi_slv3; +}DPP_CFG_PCIE_DBG3_WDATA_AXI_SLV3_T; + +typedef struct dpp_cfg_pcie_dbg4_wdata_axi_slv0_t +{ + ZXIC_UINT32 dbg4_wdata_axi_slv0; +}DPP_CFG_PCIE_DBG4_WDATA_AXI_SLV0_T; + +typedef struct dpp_cfg_pcie_dbg4_wdata_axi_slv1_t +{ + ZXIC_UINT32 dbg4_wdata_axi_slv1; +}DPP_CFG_PCIE_DBG4_WDATA_AXI_SLV1_T; + +typedef struct dpp_cfg_pcie_dbg4_wdata_axi_slv2_t +{ + ZXIC_UINT32 dbg4_wdata_axi_slv2; +}DPP_CFG_PCIE_DBG4_WDATA_AXI_SLV2_T; + +typedef struct dpp_cfg_pcie_dbg4_wdata_axi_slv3_t +{ + ZXIC_UINT32 dbg4_wdata_axi_slv3; +}DPP_CFG_PCIE_DBG4_WDATA_AXI_SLV3_T; + +typedef struct dpp_cfg_pcie_dbg5_wdata_axi_slv0_t +{ + ZXIC_UINT32 dbg5_wdata_axi_slv0; +}DPP_CFG_PCIE_DBG5_WDATA_AXI_SLV0_T; + +typedef struct dpp_cfg_pcie_dbg5_wdata_axi_slv1_t +{ + ZXIC_UINT32 dbg5_wdata_axi_slv1; +}DPP_CFG_PCIE_DBG5_WDATA_AXI_SLV1_T; + +typedef struct dpp_cfg_pcie_dbg5_wdata_axi_slv2_t +{ + ZXIC_UINT32 dbg5_wdata_axi_slv2; +}DPP_CFG_PCIE_DBG5_WDATA_AXI_SLV2_T; + +typedef struct dpp_cfg_pcie_dbg5_wdata_axi_slv3_t +{ + ZXIC_UINT32 dbg5_wdata_axi_slv3; +}DPP_CFG_PCIE_DBG5_WDATA_AXI_SLV3_T; + +typedef struct dpp_cfg_pcie_dbg6_wdata_axi_slv0_t +{ + ZXIC_UINT32 dbg6_wdata_axi_slv0; +}DPP_CFG_PCIE_DBG6_WDATA_AXI_SLV0_T; + +typedef struct dpp_cfg_pcie_dbg6_wdata_axi_slv1_t +{ + ZXIC_UINT32 dbg6_wdata_axi_slv1; +}DPP_CFG_PCIE_DBG6_WDATA_AXI_SLV1_T; + +typedef struct dpp_cfg_pcie_dbg6_wdata_axi_slv2_t +{ + ZXIC_UINT32 dbg6_wdata_axi_slv2; +}DPP_CFG_PCIE_DBG6_WDATA_AXI_SLV2_T; + +typedef struct dpp_cfg_pcie_dbg6_wdata_axi_slv3_t +{ + ZXIC_UINT32 dbg6_wdata_axi_slv3; +}DPP_CFG_PCIE_DBG6_WDATA_AXI_SLV3_T; + +typedef struct dpp_cfg_pcie_dbg7_wdata_axi_slv0_t +{ + ZXIC_UINT32 dbg7_wdata_axi_slv0; +}DPP_CFG_PCIE_DBG7_WDATA_AXI_SLV0_T; + +typedef struct dpp_cfg_pcie_dbg7_wdata_axi_slv1_t +{ + ZXIC_UINT32 dbg7_wdata_axi_slv1; +}DPP_CFG_PCIE_DBG7_WDATA_AXI_SLV1_T; + +typedef struct dpp_cfg_pcie_dbg7_wdata_axi_slv2_t +{ + ZXIC_UINT32 dbg7_wdata_axi_slv2; +}DPP_CFG_PCIE_DBG7_WDATA_AXI_SLV2_T; + +typedef struct dpp_cfg_pcie_dbg7_wdata_axi_slv3_t +{ + ZXIC_UINT32 dbg7_wdata_axi_slv3; +}DPP_CFG_PCIE_DBG7_WDATA_AXI_SLV3_T; + +typedef struct dpp_cfg_pcie_dbg8_wdata_axi_slv0_t +{ + ZXIC_UINT32 dbg8_wdata_axi_slv0; +}DPP_CFG_PCIE_DBG8_WDATA_AXI_SLV0_T; + +typedef struct dpp_cfg_pcie_dbg8_wdata_axi_slv1_t +{ + ZXIC_UINT32 dbg8_wdata_axi_slv1; +}DPP_CFG_PCIE_DBG8_WDATA_AXI_SLV1_T; + +typedef struct dpp_cfg_pcie_dbg8_wdata_axi_slv2_t +{ + ZXIC_UINT32 dbg8_wdata_axi_slv2; +}DPP_CFG_PCIE_DBG8_WDATA_AXI_SLV2_T; + +typedef struct dpp_cfg_pcie_dbg8_wdata_axi_slv3_t +{ + ZXIC_UINT32 dbg8_wdata_axi_slv3; +}DPP_CFG_PCIE_DBG8_WDATA_AXI_SLV3_T; + +typedef struct dpp_cfg_pcie_dbg9_wdata_axi_slv0_t +{ + ZXIC_UINT32 dbg9_wdata_axi_slv0; +}DPP_CFG_PCIE_DBG9_WDATA_AXI_SLV0_T; + +typedef struct dpp_cfg_pcie_dbg9_wdata_axi_slv1_t +{ + ZXIC_UINT32 dbg9_wdata_axi_slv1; +}DPP_CFG_PCIE_DBG9_WDATA_AXI_SLV1_T; + +typedef struct dpp_cfg_pcie_dbg9_wdata_axi_slv2_t +{ + ZXIC_UINT32 dbg9_wdata_axi_slv2; +}DPP_CFG_PCIE_DBG9_WDATA_AXI_SLV2_T; + +typedef struct dpp_cfg_pcie_dbg9_wdata_axi_slv3_t +{ + ZXIC_UINT32 dbg9_wdata_axi_slv3; +}DPP_CFG_PCIE_DBG9_WDATA_AXI_SLV3_T; + +typedef struct dpp_cfg_pcie_dbg_awlen_axi_slv_t +{ + ZXIC_UINT32 dbg_awlen_axi_slv; +}DPP_CFG_PCIE_DBG_AWLEN_AXI_SLV_T; + +typedef struct dpp_cfg_pcie_dbg_wlast_axi_slv_t +{ + ZXIC_UINT32 dbg_wlast_axi_slv; +}DPP_CFG_PCIE_DBG_WLAST_AXI_SLV_T; + +typedef struct dpp_cfg_pcie_dbg_araddr_axi_slv0_t +{ + ZXIC_UINT32 dbg5_wdata_axi_slv1; +}DPP_CFG_PCIE_DBG_ARADDR_AXI_SLV0_T; + +typedef struct dpp_cfg_pcie_dbg_araddr_axi_slv1_t +{ + ZXIC_UINT32 dbg5_wdata_axi_slv2; +}DPP_CFG_PCIE_DBG_ARADDR_AXI_SLV1_T; + +typedef struct dpp_cfg_pcie_dbg0_rdata_axi_slv0_t +{ + ZXIC_UINT32 dbg5_wdata_axi_slv3; +}DPP_CFG_PCIE_DBG0_RDATA_AXI_SLV0_T; + +typedef struct dpp_cfg_pcie_dbg0_rdata_axi_slv1_t +{ + ZXIC_UINT32 dbg6_wdata_axi_slv0; +}DPP_CFG_PCIE_DBG0_RDATA_AXI_SLV1_T; + +typedef struct dpp_cfg_pcie_dbg0_rdata_axi_slv2_t +{ + ZXIC_UINT32 dbg6_wdata_axi_slv1; +}DPP_CFG_PCIE_DBG0_RDATA_AXI_SLV2_T; + +typedef struct dpp_cfg_pcie_dbg0_rdata_axi_slv3_t +{ + ZXIC_UINT32 dbg6_wdata_axi_slv2; +}DPP_CFG_PCIE_DBG0_RDATA_AXI_SLV3_T; + +typedef struct dpp_cfg_pcie_dbg1_rdata_axi_slv0_t +{ + ZXIC_UINT32 dbg6_wdata_axi_slv3; +}DPP_CFG_PCIE_DBG1_RDATA_AXI_SLV0_T; + +typedef struct dpp_cfg_pcie_dbg1_rdata_axi_slv1_t +{ + ZXIC_UINT32 dbg7_wdata_axi_slv0; +}DPP_CFG_PCIE_DBG1_RDATA_AXI_SLV1_T; + +typedef struct dpp_cfg_pcie_dbg1_rdata_axi_slv2_t +{ + ZXIC_UINT32 dbg7_wdata_axi_slv1; +}DPP_CFG_PCIE_DBG1_RDATA_AXI_SLV2_T; + +typedef struct dpp_cfg_pcie_dbg1_rdata_axi_slv3_t +{ + ZXIC_UINT32 dbg7_wdata_axi_slv2; +}DPP_CFG_PCIE_DBG1_RDATA_AXI_SLV3_T; + +typedef struct dpp_cfg_pcie_dbg_rlast_axi_slv_t +{ + ZXIC_UINT32 dbg_rlast_axi_slv; +}DPP_CFG_PCIE_DBG_RLAST_AXI_SLV_T; + +typedef struct dpp_cfg_dma_dma_enable_t +{ + ZXIC_UINT32 dma_enable; +}DPP_CFG_DMA_DMA_ENABLE_T; + +typedef struct dpp_cfg_dma_up_req_t +{ + ZXIC_UINT32 up_req; +}DPP_CFG_DMA_UP_REQ_T; + +typedef struct dpp_cfg_dma_dma_up_current_state_t +{ + ZXIC_UINT32 dma_up_current_state; +}DPP_CFG_DMA_DMA_UP_CURRENT_STATE_T; + +typedef struct dpp_cfg_dma_dma_up_req_ack_t +{ + ZXIC_UINT32 dma_up_req_ack; +}DPP_CFG_DMA_DMA_UP_REQ_ACK_T; + +typedef struct dpp_cfg_dma_dma_done_latch_t +{ + ZXIC_UINT32 done_latch; +}DPP_CFG_DMA_DMA_DONE_LATCH_T; + +typedef struct dpp_cfg_dma_dma_up_cpu_addr_low32_t +{ + ZXIC_UINT32 dma_up_cpu_addr_low; +}DPP_CFG_DMA_DMA_UP_CPU_ADDR_LOW32_T; + +typedef struct dpp_cfg_dma_dma_up_cpu_addr_high32_t +{ + ZXIC_UINT32 dma_up_cpu_addr_high; +}DPP_CFG_DMA_DMA_UP_CPU_ADDR_HIGH32_T; + +typedef struct dpp_cfg_dma_dma_up_se_addr_t +{ + ZXIC_UINT32 dma_up_se_addr; +}DPP_CFG_DMA_DMA_UP_SE_ADDR_T; + +typedef struct dpp_cfg_dma_dma_done_int_t +{ + ZXIC_UINT32 dma_done_int; +}DPP_CFG_DMA_DMA_DONE_INT_T; + +typedef struct dpp_cfg_dma_sp_cfg_t +{ + ZXIC_UINT32 sp_cfg; +}DPP_CFG_DMA_SP_CFG_T; + +typedef struct dpp_cfg_dma_dma_ing_t +{ + ZXIC_UINT32 dma_ing; +}DPP_CFG_DMA_DMA_ING_T; + +typedef struct dpp_cfg_dma_rd_timeout_thresh_t +{ + ZXIC_UINT32 rd_timeout_thresh; +}DPP_CFG_DMA_RD_TIMEOUT_THRESH_T; + +typedef struct dpp_cfg_dma_dma_tab_sta_up_fifo_gap_t +{ + ZXIC_UINT32 dma_tab_sta_up_fifo_gap; +}DPP_CFG_DMA_DMA_TAB_STA_UP_FIFO_GAP_T; + +typedef struct dpp_cfg_dma_cfg_mac_tim_t +{ + ZXIC_UINT32 cfg_mac_tim; +}DPP_CFG_DMA_CFG_MAC_TIM_T; + +typedef struct dpp_cfg_dma_cfg_mac_num_t +{ + ZXIC_UINT32 cfg_mac_num; +}DPP_CFG_DMA_CFG_MAC_NUM_T; + +typedef struct dpp_cfg_dma_init_bd_addr_t +{ + ZXIC_UINT32 init_bd_addr; +}DPP_CFG_DMA_INIT_BD_ADDR_T; + +typedef struct dpp_cfg_dma_mac_up_bd_addr1_low32_t +{ + ZXIC_UINT32 mac_up_bd_addr1_low32; +}DPP_CFG_DMA_MAC_UP_BD_ADDR1_LOW32_T; + +typedef struct dpp_cfg_dma_mac_up_bd_addr1_high32_t +{ + ZXIC_UINT32 mac_up_bd_addr1_high32; +}DPP_CFG_DMA_MAC_UP_BD_ADDR1_HIGH32_T; + +typedef struct dpp_cfg_dma_mac_up_bd_addr2_low32_t +{ + ZXIC_UINT32 mac_up_bd_addr2_low32; +}DPP_CFG_DMA_MAC_UP_BD_ADDR2_LOW32_T; + +typedef struct dpp_cfg_dma_mac_up_bd_addr2_high32_t +{ + ZXIC_UINT32 mac_up_bd_addr2_high32; +}DPP_CFG_DMA_MAC_UP_BD_ADDR2_HIGH32_T; + +typedef struct dpp_cfg_dma_cfg_mac_max_num_t +{ + ZXIC_UINT32 cfg_mac_max_num; +}DPP_CFG_DMA_CFG_MAC_MAX_NUM_T; + +typedef struct dpp_cfg_dma_dma_wbuf_ff_empty_t +{ + ZXIC_UINT32 dma_wbuf_ff_empty; +}DPP_CFG_DMA_DMA_WBUF_FF_EMPTY_T; + +typedef struct dpp_cfg_dma_dma_wbuf_state_t +{ + ZXIC_UINT32 dma_wbuf_state; +}DPP_CFG_DMA_DMA_WBUF_STATE_T; + +typedef struct dpp_cfg_dma_dma_mac_bd_addr_low32_t +{ + ZXIC_UINT32 dma_mac_bd_addr_low32; +}DPP_CFG_DMA_DMA_MAC_BD_ADDR_LOW32_T; + +typedef struct dpp_cfg_dma_dma_mac_bd_addr_high32_t +{ + ZXIC_UINT32 dma_mac_bd_addr_high32; +}DPP_CFG_DMA_DMA_MAC_BD_ADDR_HIGH32_T; + +typedef struct dpp_cfg_dma_mac_up_enable_t +{ + ZXIC_UINT32 mac_up_enable; +}DPP_CFG_DMA_MAC_UP_ENABLE_T; + +typedef struct dpp_cfg_dma_mac_endian_t +{ + ZXIC_UINT32 mac_endian; +}DPP_CFG_DMA_MAC_ENDIAN_T; + +typedef struct dpp_cfg_dma_up_endian_t +{ + ZXIC_UINT32 up_endian; +}DPP_CFG_DMA_UP_ENDIAN_T; + +typedef struct dpp_cfg_dma_dma_up_rd_cnt_latch_t +{ + ZXIC_UINT32 dma_up_rd_cnt_latch; +}DPP_CFG_DMA_DMA_UP_RD_CNT_LATCH_T; + +typedef struct dpp_cfg_dma_dma_up_rcv_cnt_latch_t +{ + ZXIC_UINT32 dma_up_rcv_cnt_latch; +}DPP_CFG_DMA_DMA_UP_RCV_CNT_LATCH_T; + +typedef struct dpp_cfg_dma_dma_up_cnt_latch_t +{ + ZXIC_UINT32 dma_up_cnt_latch; +}DPP_CFG_DMA_DMA_UP_CNT_LATCH_T; + +typedef struct dpp_cfg_dma_cpu_rd_bd_pulse_t +{ + ZXIC_UINT32 cpu_rd_bd_pulse; +}DPP_CFG_DMA_CPU_RD_BD_PULSE_T; + +typedef struct dpp_cfg_dma_cpu_bd_threshold_t +{ + ZXIC_UINT32 cpu_bd_threshold; +}DPP_CFG_DMA_CPU_BD_THRESHOLD_T; + +typedef struct dpp_cfg_dma_cpu_bd_used_cnt_t +{ + ZXIC_UINT32 cpu_bd_used_cnt; +}DPP_CFG_DMA_CPU_BD_USED_CNT_T; + +typedef struct dpp_cfg_dma_dma_up_rcv_status_t +{ + ZXIC_UINT32 dma_up_rcv_status; +}DPP_CFG_DMA_DMA_UP_RCV_STATUS_T; + +typedef struct dpp_cfg_dma_slv_rid_err_en_t +{ + ZXIC_UINT32 slv_rid_err_en; +}DPP_CFG_DMA_SLV_RID_ERR_EN_T; + +typedef struct dpp_cfg_dma_slv_rresp_err_en_t +{ + ZXIC_UINT32 slv_rresp_err_en; +}DPP_CFG_DMA_SLV_RRESP_ERR_EN_T; + +typedef struct dpp_cfg_dma_se_rdbk_ff_full_t +{ + ZXIC_UINT32 se_rdbk_ff_full; +}DPP_CFG_DMA_SE_RDBK_FF_FULL_T; + +typedef struct dpp_cfg_dma_dma_up_data_count_t +{ + ZXIC_UINT32 dma_up_data_count; +}DPP_CFG_DMA_DMA_UP_DATA_COUNT_T; + +typedef struct dpp_cfg_dma_dma_mwr_fifo_afull_gap_t +{ + ZXIC_UINT32 dma_mwr_fifo_afull_gap; +}DPP_CFG_DMA_DMA_MWR_FIFO_AFULL_GAP_T; + +typedef struct dpp_cfg_dma_dma_info_fifo_afull_gap_t +{ + ZXIC_UINT32 dma_mwr_fifo_afull_gap; +}DPP_CFG_DMA_DMA_INFO_FIFO_AFULL_GAP_T; + +typedef struct dpp_cfg_dma_dma_rd_timeout_set_t +{ + ZXIC_UINT32 dma_rd_timeout_set; +}DPP_CFG_DMA_DMA_RD_TIMEOUT_SET_T; + +typedef struct dpp_cfg_dma_dma_bd_dat_err_en_t +{ + ZXIC_UINT32 dma_bd_dat_err_en; +}DPP_CFG_DMA_DMA_BD_DAT_ERR_EN_T; + +typedef struct dpp_cfg_dma_dma_repeat_cnt_t +{ + ZXIC_UINT32 dma_repeat_cnt; +}DPP_CFG_DMA_DMA_REPEAT_CNT_T; + +typedef struct dpp_cfg_dma_dma_rd_timeout_en_t +{ + ZXIC_UINT32 dma_rd_timeout_en; +}DPP_CFG_DMA_DMA_RD_TIMEOUT_EN_T; + +typedef struct dpp_cfg_dma_dma_repeat_read_t +{ + ZXIC_UINT32 dma_repeat_read; +}DPP_CFG_DMA_DMA_REPEAT_READ_T; + +typedef struct dpp_cfg_dma_dma_repeat_read_en_t +{ + ZXIC_UINT32 dma_repeat_read_en; +}DPP_CFG_DMA_DMA_REPEAT_READ_EN_T; + +typedef struct dpp_cfg_dma_bd_ctl_state_t +{ + ZXIC_UINT32 bd_ctl_state; +}DPP_CFG_DMA_BD_CTL_STATE_T; + +typedef struct dpp_cfg_dma_dma_done_int_cnt_wr_t +{ + ZXIC_UINT32 dma_done_int_cnt_wr; +}DPP_CFG_DMA_DMA_DONE_INT_CNT_WR_T; + +typedef struct dpp_cfg_dma_dma_done_int_cnt_mac_t +{ + ZXIC_UINT32 dma_done_int_cnt_mac; +}DPP_CFG_DMA_DMA_DONE_INT_CNT_MAC_T; + +typedef struct dpp_cfg_dma_current_mac_num_t +{ + ZXIC_UINT32 current_mac_num; +}DPP_CFG_DMA_CURRENT_MAC_NUM_T; + +typedef struct dpp_cfg_dma_cfg_mac_afifo_afull_t +{ + ZXIC_UINT32 cfg_mac_afifo_afull; +}DPP_CFG_DMA_CFG_MAC_AFIFO_AFULL_T; + +typedef struct dpp_cfg_dma_dma_mac_ff_full_t +{ + ZXIC_UINT32 dma_mac_ff_full; +}DPP_CFG_DMA_DMA_MAC_FF_FULL_T; + +typedef struct dpp_cfg_dma_user_axi_mst_t +{ + ZXIC_UINT32 user_en; + ZXIC_UINT32 cfg_epid; + ZXIC_UINT32 cfg_vfunc_num; + ZXIC_UINT32 cfg_func_num; + ZXIC_UINT32 cfg_vfunc_active; +}DPP_CFG_DMA_USER_AXI_MST_T; + +typedef struct dpp_cfg_csr_sbus_state_t +{ + ZXIC_UINT32 sbus_state; +}DPP_CFG_CSR_SBUS_STATE_T; + +typedef struct dpp_cfg_csr_mst_debug_en_t +{ + ZXIC_UINT32 mst_debug_en; +}DPP_CFG_CSR_MST_DEBUG_EN_T; + +typedef struct dpp_cfg_csr_sbus_command_sel_t +{ + ZXIC_UINT32 sbus_command_sel; +}DPP_CFG_CSR_SBUS_COMMAND_SEL_T; + +typedef struct dpp_cfg_csr_soc_rd_time_out_thresh_t +{ + ZXIC_UINT32 soc_rd_time_out_thresh; +}DPP_CFG_CSR_SOC_RD_TIME_OUT_THRESH_T; + +typedef struct dpp_cfg_csr_big_little_byte_order_t +{ + ZXIC_UINT32 big_little_byte_order; +}DPP_CFG_CSR_BIG_LITTLE_BYTE_ORDER_T; + +typedef struct dpp_cfg_csr_ecc_bypass_read_t +{ + ZXIC_UINT32 ecc_bypass_read; +}DPP_CFG_CSR_ECC_BYPASS_READ_T; + +typedef struct dpp_cfg_csr_ahb_async_wr_fifo_afull_gap_t +{ + ZXIC_UINT32 ahb_async_wr_fifo_afull_gap; +}DPP_CFG_CSR_AHB_ASYNC_WR_FIFO_AFULL_GAP_T; + +typedef struct dpp_cfg_csr_ahb_async_rd_fifo_afull_gap_t +{ + ZXIC_UINT32 ahb_async_rd_fifo_afull_gap; +}DPP_CFG_CSR_AHB_ASYNC_RD_FIFO_AFULL_GAP_T; + +typedef struct dpp_cfg_csr_ahb_async_cpl_fifo_afull_gap_t +{ + ZXIC_UINT32 ahb_async_cpl_fifo_afull_gap; +}DPP_CFG_CSR_AHB_ASYNC_CPL_FIFO_AFULL_GAP_T; + +typedef struct dpp_cfg_csr_mst_debug_data0_high26_t +{ + ZXIC_UINT32 mst_debug_data0_high26; +}DPP_CFG_CSR_MST_DEBUG_DATA0_HIGH26_T; + +typedef struct dpp_cfg_csr_mst_debug_data0_low32_t +{ + ZXIC_UINT32 mst_debug_data0_low32; +}DPP_CFG_CSR_MST_DEBUG_DATA0_LOW32_T; + +typedef struct dpp_cfg_csr_mst_debug_data1_high26_t +{ + ZXIC_UINT32 mst_debug_data1_high26; +}DPP_CFG_CSR_MST_DEBUG_DATA1_HIGH26_T; + +typedef struct dpp_cfg_csr_mst_debug_data1_low32_t +{ + ZXIC_UINT32 mst_debug_data1_low32; +}DPP_CFG_CSR_MST_DEBUG_DATA1_LOW32_T; + +typedef struct dpp_cfg_csr_mst_debug_data2_high26_t +{ + ZXIC_UINT32 mst_debug_data2_high26; +}DPP_CFG_CSR_MST_DEBUG_DATA2_HIGH26_T; + +typedef struct dpp_cfg_csr_mst_debug_data2_low32_t +{ + ZXIC_UINT32 mst_debug_data2_low32; +}DPP_CFG_CSR_MST_DEBUG_DATA2_LOW32_T; + +typedef struct dpp_cfg_csr_mst_debug_data3_high26_t +{ + ZXIC_UINT32 mst_debug_data3_high26; +}DPP_CFG_CSR_MST_DEBUG_DATA3_HIGH26_T; + +typedef struct dpp_cfg_csr_mst_debug_data3_low32_t +{ + ZXIC_UINT32 mst_debug_data3_low32; +}DPP_CFG_CSR_MST_DEBUG_DATA3_LOW32_T; + +typedef struct dpp_cfg_csr_mst_debug_data4_high26_t +{ + ZXIC_UINT32 mst_debug_data4_high26; +}DPP_CFG_CSR_MST_DEBUG_DATA4_HIGH26_T; + +typedef struct dpp_cfg_csr_mst_debug_data4_low32_t +{ + ZXIC_UINT32 mst_debug_data4_low32; +}DPP_CFG_CSR_MST_DEBUG_DATA4_LOW32_T; + +typedef struct dpp_cfg_csr_mst_debug_data5_high26_t +{ + ZXIC_UINT32 mst_debug_data5_high26; +}DPP_CFG_CSR_MST_DEBUG_DATA5_HIGH26_T; + +typedef struct dpp_cfg_csr_mst_debug_data5_low32_t +{ + ZXIC_UINT32 mst_debug_data5_low32; +}DPP_CFG_CSR_MST_DEBUG_DATA5_LOW32_T; + +typedef struct dpp_cfg_csr_mst_debug_data6_high26_t +{ + ZXIC_UINT32 mst_debug_data6_high26; +}DPP_CFG_CSR_MST_DEBUG_DATA6_HIGH26_T; + +typedef struct dpp_cfg_csr_mst_debug_data6_low32_t +{ + ZXIC_UINT32 mst_debug_data6_low32; +}DPP_CFG_CSR_MST_DEBUG_DATA6_LOW32_T; + +typedef struct dpp_cfg_csr_mst_debug_data7_high26_t +{ + ZXIC_UINT32 mst_debug_data7_high26; +}DPP_CFG_CSR_MST_DEBUG_DATA7_HIGH26_T; + +typedef struct dpp_cfg_csr_mst_debug_data7_low32_t +{ + ZXIC_UINT32 mst_debug_data7_low32; +}DPP_CFG_CSR_MST_DEBUG_DATA7_LOW32_T; + +typedef struct dpp_cfg_csr_mst_debug_data8_high26_t +{ + ZXIC_UINT32 mst_debug_data8_high26; +}DPP_CFG_CSR_MST_DEBUG_DATA8_HIGH26_T; + +typedef struct dpp_cfg_csr_mst_debug_data8_low32_t +{ + ZXIC_UINT32 mst_debug_data8_low32; +}DPP_CFG_CSR_MST_DEBUG_DATA8_LOW32_T; + +typedef struct dpp_cfg_csr_mst_debug_data9_high26_t +{ + ZXIC_UINT32 mst_debug_data9_high26; +}DPP_CFG_CSR_MST_DEBUG_DATA9_HIGH26_T; + +typedef struct dpp_cfg_csr_mst_debug_data9_low32_t +{ + ZXIC_UINT32 mst_debug_data9_low32; +}DPP_CFG_CSR_MST_DEBUG_DATA9_LOW32_T; + +typedef struct dpp_cfg_csr_mst_debug_data10_high26_t +{ + ZXIC_UINT32 mst_debug_data10_high26; +}DPP_CFG_CSR_MST_DEBUG_DATA10_HIGH26_T; + +typedef struct dpp_cfg_csr_mst_debug_data10_low32_t +{ + ZXIC_UINT32 mst_debug_data10_low32; +}DPP_CFG_CSR_MST_DEBUG_DATA10_LOW32_T; + +typedef struct dpp_cfg_csr_mst_debug_data11_high26_t +{ + ZXIC_UINT32 mst_debug_data11_high26; +}DPP_CFG_CSR_MST_DEBUG_DATA11_HIGH26_T; + +typedef struct dpp_cfg_csr_mst_debug_data11_low32_t +{ + ZXIC_UINT32 mst_debug_data11_low32; +}DPP_CFG_CSR_MST_DEBUG_DATA11_LOW32_T; + +typedef struct dpp_cfg_csr_mst_debug_data12_high26_t +{ + ZXIC_UINT32 mst_debug_data12_high26; +}DPP_CFG_CSR_MST_DEBUG_DATA12_HIGH26_T; + +typedef struct dpp_cfg_csr_mst_debug_data12_low32_t +{ + ZXIC_UINT32 mst_debug_data12_low32; +}DPP_CFG_CSR_MST_DEBUG_DATA12_LOW32_T; + +typedef struct dpp_cfg_csr_mst_debug_data13_high26_t +{ + ZXIC_UINT32 mst_debug_data13_high26; +}DPP_CFG_CSR_MST_DEBUG_DATA13_HIGH26_T; + +typedef struct dpp_cfg_csr_mst_debug_data13_low32_t +{ + ZXIC_UINT32 mst_debug_data13_low32; +}DPP_CFG_CSR_MST_DEBUG_DATA13_LOW32_T; + +typedef struct dpp_cfg_csr_mst_debug_data14_high26_t +{ + ZXIC_UINT32 mst_debug_data14_high26; +}DPP_CFG_CSR_MST_DEBUG_DATA14_HIGH26_T; + +typedef struct dpp_cfg_csr_mst_debug_data14_low32_t +{ + ZXIC_UINT32 mst_debug_data14_low32; +}DPP_CFG_CSR_MST_DEBUG_DATA14_LOW32_T; + +typedef struct dpp_cfg_csr_mst_debug_data15_high26_t +{ + ZXIC_UINT32 mst_debug_data15_high26; +}DPP_CFG_CSR_MST_DEBUG_DATA15_HIGH26_T; + +typedef struct dpp_cfg_csr_mst_debug_data15_low32_t +{ + ZXIC_UINT32 mst_debug_data15_low32; +}DPP_CFG_CSR_MST_DEBUG_DATA15_LOW32_T; + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_dtb4k_reg.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_dtb4k_reg.h new file mode 100644 index 0000000..5ae6c12 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_dtb4k_reg.h @@ -0,0 +1,47 @@ + +#ifndef _DPP_DTB4K_REG_H_ +#define _DPP_DTB4K_REG_H_ + +#ifdef __cplusplus +extern "C"{ +#endif + +typedef struct dpp_dtb4k_dtb_enq_cfg_queue_dtb_addr_h_0_127_t +{ + ZXIC_UINT32 cfg_queue_dtb_addr_h; +}DPP_DTB4K_DTB_ENQ_CFG_QUEUE_DTB_ADDR_H_0_127_T; + +typedef struct dpp_dtb4k_dtb_enq_cfg_queue_dtb_addr_l_0_127_t +{ + ZXIC_UINT32 cfg_queue_dtb_addr_l; +}DPP_DTB4K_DTB_ENQ_CFG_QUEUE_DTB_ADDR_L_0_127_T; + +typedef struct dpp_dtb4k_dtb_enq_cfg_queue_dtb_len_0_127_t +{ + ZXIC_UINT32 cfg_dtb_cmd_type; + ZXIC_UINT32 cfg_dtb_cmd_int_en; + ZXIC_UINT32 cfg_queue_dtb_len; +}DPP_DTB4K_DTB_ENQ_CFG_QUEUE_DTB_LEN_0_127_T; + +typedef struct dpp_dtb4k_dtb_enq_info_queue_buf_space_left_0_127_t +{ + ZXIC_UINT32 info_queue_buf_space_left; +}DPP_DTB4K_DTB_ENQ_INFO_QUEUE_BUF_SPACE_LEFT_0_127_T; + +typedef struct dpp_dtb4k_dtb_enq_cfg_epid_v_func_num_0_127_t +{ + ZXIC_UINT32 dbi_en; + ZXIC_UINT32 queue_en; + ZXIC_UINT32 cfg_epid; + ZXIC_UINT32 cfg_vfunc_num; + ZXIC_UINT32 cfg_vector; + ZXIC_UINT32 cfg_func_num; + ZXIC_UINT32 cfg_vfunc_active; +}DPP_DTB4K_DTB_ENQ_CFG_EPID_V_FUNC_NUM_0_127_T; + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_dtb_reg.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_dtb_reg.h new file mode 100644 index 0000000..b0989ce --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_dtb_reg.h @@ -0,0 +1,599 @@ + +#ifndef _DPP_DTB_REG_H_ +#define _DPP_DTB_REG_H_ + +#ifdef __cplusplus +extern "C"{ +#endif + +typedef struct dpp_dtb_dtb_cfg_cfg_eram_wr_interval_cnt_t +{ + ZXIC_UINT32 cfg_eram_wr_interval_cnt; +}DPP_DTB_DTB_CFG_CFG_ERAM_WR_INTERVAL_CNT_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_zcam_wr_interval_cnt_t +{ + ZXIC_UINT32 cfg_zcam_wr_interval_cnt; +}DPP_DTB_DTB_CFG_CFG_ZCAM_WR_INTERVAL_CNT_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_tcam_wr_interval_cnt_t +{ + ZXIC_UINT32 cfg_zcam_wr_interval_cnt; +}DPP_DTB_DTB_CFG_CFG_TCAM_WR_INTERVAL_CNT_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_ddr_wr_interval_cnt_t +{ + ZXIC_UINT32 cfg_ddr_wr_interval_cnt; +}DPP_DTB_DTB_CFG_CFG_DDR_WR_INTERVAL_CNT_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_hash_wr_interval_cnt_t +{ + ZXIC_UINT32 cfg_hash_wr_interval_cnt; +}DPP_DTB_DTB_CFG_CFG_HASH_WR_INTERVAL_CNT_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_eram_rd_interval_cnt_t +{ + ZXIC_UINT32 cfg_eram_rd_interval_cnt; +}DPP_DTB_DTB_CFG_CFG_ERAM_RD_INTERVAL_CNT_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_zcam_rd_interval_cnt_t +{ + ZXIC_UINT32 cfg_zcam_rd_interval_cnt; +}DPP_DTB_DTB_CFG_CFG_ZCAM_RD_INTERVAL_CNT_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_tcam_rd_interval_cnt_t +{ + ZXIC_UINT32 cfg_tcam_rd_interval_cnt; +}DPP_DTB_DTB_CFG_CFG_TCAM_RD_INTERVAL_CNT_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_ddr_rd_interval_cnt_t +{ + ZXIC_UINT32 cfg_ddr_rd_interval_cnt; +}DPP_DTB_DTB_CFG_CFG_DDR_RD_INTERVAL_CNT_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_dtb_queue_lock_state_0_3_t +{ + ZXIC_UINT32 cfg_dtb_queue_lock_state; +}DPP_DTB_DTB_CFG_CFG_DTB_QUEUE_LOCK_STATE_0_3_T; + +typedef struct dpp_dtb_dtb_axim0_w_convert_0_mode_t +{ + ZXIC_UINT32 w_convert_mode; +}DPP_DTB_DTB_AXIM0_W_CONVERT_0_MODE_T; + +typedef struct dpp_dtb_dtb_axim0_r_convert_0_mode_t +{ + ZXIC_UINT32 r_convert_mode; +}DPP_DTB_DTB_AXIM0_R_CONVERT_0_MODE_T; + +typedef struct dpp_dtb_dtb_axim0_aximr_os_t +{ + ZXIC_UINT32 aximr_os; +}DPP_DTB_DTB_AXIM0_AXIMR_OS_T; + +typedef struct dpp_dtb_dtb_axim1_w_convert_1_mode_t +{ + ZXIC_UINT32 w_convert_mode; +}DPP_DTB_DTB_AXIM1_W_CONVERT_1_MODE_T; + +typedef struct dpp_dtb_dtb_axim1_r_convert_1_mode_t +{ + ZXIC_UINT32 r_convert_mode; +}DPP_DTB_DTB_AXIM1_R_CONVERT_1_MODE_T; + +typedef struct dpp_dtb_dtb_axis_axis_convert_mode_t +{ + ZXIC_UINT32 w_r_convert_mode; +}DPP_DTB_DTB_AXIS_AXIS_CONVERT_MODE_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_finish_int_event0_t +{ + ZXIC_UINT32 cfg_finish_int_event0; +}DPP_DTB_DTB_CFG_CFG_FINISH_INT_EVENT0_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_finish_int_event1_t +{ + ZXIC_UINT32 cfg_finish_int_event1; +}DPP_DTB_DTB_CFG_CFG_FINISH_INT_EVENT1_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_finish_int_event2_t +{ + ZXIC_UINT32 cfg_finish_int_event2; +}DPP_DTB_DTB_CFG_CFG_FINISH_INT_EVENT2_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_finish_int_event3_t +{ + ZXIC_UINT32 cfg_finish_int_event3; +}DPP_DTB_DTB_CFG_CFG_FINISH_INT_EVENT3_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_finish_int_maks0_t +{ + ZXIC_UINT32 cfg_finish_int_mask0; +}DPP_DTB_DTB_CFG_CFG_FINISH_INT_MAKS0_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_finish_int_maks1_t +{ + ZXIC_UINT32 cfg_finish_int_mask1; +}DPP_DTB_DTB_CFG_CFG_FINISH_INT_MAKS1_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_finish_int_maks2_t +{ + ZXIC_UINT32 cfg_finish_int_mask2; +}DPP_DTB_DTB_CFG_CFG_FINISH_INT_MAKS2_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_finish_int_maks3_t +{ + ZXIC_UINT32 cfg_finish_int_mask3; +}DPP_DTB_DTB_CFG_CFG_FINISH_INT_MAKS3_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_finish_int_test0_t +{ + ZXIC_UINT32 cfg_finish_int_test0; +}DPP_DTB_DTB_CFG_CFG_FINISH_INT_TEST0_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_finish_int_test1_t +{ + ZXIC_UINT32 cfg_finish_int_test1; +}DPP_DTB_DTB_CFG_CFG_FINISH_INT_TEST1_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_finish_int_test2_t +{ + ZXIC_UINT32 cfg_finish_int_test2; +}DPP_DTB_DTB_CFG_CFG_FINISH_INT_TEST2_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_finish_int_test3_t +{ + ZXIC_UINT32 cfg_finish_int_test3; +}DPP_DTB_DTB_CFG_CFG_FINISH_INT_TEST3_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_dtb_int_to_riscv_sel_t +{ + ZXIC_UINT32 cfg_dtb_int_to_riscv_sel0; +}DPP_DTB_DTB_CFG_CFG_DTB_INT_TO_RISCV_SEL_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_dtb_ep_int_msix_enable_t +{ + ZXIC_UINT32 cfg_dtb_ep_int_msix_enable; +}DPP_DTB_DTB_CFG_CFG_DTB_EP_INT_MSIX_ENABLE_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_dtb_ep_doorbell_addr_h_0_15_t +{ + ZXIC_UINT32 cfg_dtb_ep_doorbell_addr_h_0_15; +}DPP_DTB_DTB_CFG_CFG_DTB_EP_DOORBELL_ADDR_H_0_15_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_dtb_ep_doorbell_addr_l_0_15_t +{ + ZXIC_UINT32 cfg_dtb_ep_doorbell_addr_l_0_15; +}DPP_DTB_DTB_CFG_CFG_DTB_EP_DOORBELL_ADDR_L_0_15_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_dtb_debug_mode_en_t +{ + ZXIC_UINT32 cfg_dtb_debug_mode_en; +}DPP_DTB_DTB_CFG_CFG_DTB_DEBUG_MODE_EN_T; + +typedef struct dpp_dtb_dtb_cfg_info_axi_last_rd_table_addr_high_t +{ + ZXIC_UINT32 info_axi_last_rd_table_addr_high; +}DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_ADDR_HIGH_T; + +typedef struct dpp_dtb_dtb_cfg_info_axi_last_rd_table_addr_low_t +{ + ZXIC_UINT32 info_axi_last_rd_table_addr_low; +}DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_ADDR_LOW_T; + +typedef struct dpp_dtb_dtb_cfg_info_axi_last_rd_table_len_t +{ + ZXIC_UINT32 info_axi_last_rd_table_len; +}DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_LEN_T; + +typedef struct dpp_dtb_dtb_cfg_info_axi_last_rd_table_user_t +{ + ZXIC_UINT32 info_rd_table_user_en; + ZXIC_UINT32 info_rd_table_epid; + ZXIC_UINT32 info_rd_table_vfunc_num; + ZXIC_UINT32 info_rd_table_func_num; + ZXIC_UINT32 info_rd_table_vfunc_active; +}DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_USER_T; + +typedef struct dpp_dtb_dtb_cfg_info_axi_last_rd_table_onload_cnt_t +{ + ZXIC_UINT32 info_axi_last_rd_table_onload_cnt; +}DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_ONLOAD_CNT_T; + +typedef struct dpp_dtb_dtb_cfg_cnt_axi_rd_table_resp_err_t +{ + ZXIC_UINT32 cnt_axi_rd_table_resp_err; +}DPP_DTB_DTB_CFG_CNT_AXI_RD_TABLE_RESP_ERR_T; + +typedef struct dpp_dtb_dtb_cfg_info_axi_last_rd_pd_addr_high_t +{ + ZXIC_UINT32 info_axi_last_rd_pd_addr_high; +}DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_ADDR_HIGH_T; + +typedef struct dpp_dtb_dtb_cfg_info_axi_last_rd_pd_addr_low_t +{ + ZXIC_UINT32 info_axi_last_rd_pd_addr_low; +}DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_ADDR_LOW_T; + +typedef struct dpp_dtb_dtb_cfg_info_axi_last_rd_pd_len_t +{ + ZXIC_UINT32 info_axi_last_rd_pd_len; +}DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_LEN_T; + +typedef struct dpp_dtb_dtb_cfg_info_axi_last_rd_pd_user_t +{ + ZXIC_UINT32 info_rd_pd_user_en; + ZXIC_UINT32 info_rd_pd_epid; + ZXIC_UINT32 info_rd_pd_vfunc_num; + ZXIC_UINT32 info_rd_pd_func_num; + ZXIC_UINT32 info_rd_pd_vfunc_active; +}DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_USER_T; + +typedef struct dpp_dtb_dtb_cfg_info_axi_last_rd_pd_onload_cnt_t +{ + ZXIC_UINT32 info_axi_last_rd_pd_onload_cnt; +}DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_ONLOAD_CNT_T; + +typedef struct dpp_dtb_dtb_cfg_cnt_axi_rd_pd_resp_err_t +{ + ZXIC_UINT32 cnt_axi_rd_pd_resp_err; +}DPP_DTB_DTB_CFG_CNT_AXI_RD_PD_RESP_ERR_T; + +typedef struct dpp_dtb_dtb_cfg_info_axi_last_wr_ctrl_addr_high_t +{ + ZXIC_UINT32 info_axi_last_wr_ctrl_addr_high; +}DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_ADDR_HIGH_T; + +typedef struct dpp_dtb_dtb_cfg_info_axi_last_wr_ctrl_addr_low_t +{ + ZXIC_UINT32 info_axi_last_wr_ctrl_addr_low; +}DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_ADDR_LOW_T; + +typedef struct dpp_dtb_dtb_cfg_info_axi_last_wr_ctrl_len_t +{ + ZXIC_UINT32 info_axi_last_wr_ctrl_len; +}DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_LEN_T; + +typedef struct dpp_dtb_dtb_cfg_info_axi_last_wr_ctrl_user_t +{ + ZXIC_UINT32 info_wr_ctrl_user_en; + ZXIC_UINT32 info_wr_ctrl_epid; + ZXIC_UINT32 info_wr_ctrl_vfunc_num; + ZXIC_UINT32 info_wr_ctrl_func_num; + ZXIC_UINT32 info_wr_ctrl_vfunc_active; +}DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_USER_T; + +typedef struct dpp_dtb_dtb_cfg_info_axi_last_wr_ctrl_onload_cnt_t +{ + ZXIC_UINT32 info_axi_last_wr_ctrl_onload_cnt; +}DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_ONLOAD_CNT_T; + +typedef struct dpp_dtb_dtb_cfg_cnt_axi_wr_ctrl_resp_err_t +{ + ZXIC_UINT32 cnt_axi_wr_ctrl_resp_err; +}DPP_DTB_DTB_CFG_CNT_AXI_WR_CTRL_RESP_ERR_T; + +typedef struct dpp_dtb_dtb_cfg_info_axi_last_wr_ddr_addr_high_t +{ + ZXIC_UINT32 info_axi_last_wr_ddr_addr_high; +}DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_ADDR_HIGH_T; + +typedef struct dpp_dtb_dtb_cfg_info_axi_last_wr_ddr_addr_low_t +{ + ZXIC_UINT32 info_axi_last_wr_ddr_addr_low; +}DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_ADDR_LOW_T; + +typedef struct dpp_dtb_dtb_cfg_info_axi_last_wr_ddr_len_t +{ + ZXIC_UINT32 info_axi_last_wr_ddr_len; +}DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_LEN_T; + +typedef struct dpp_dtb_dtb_cfg_info_axi_last_wr_ddr_user_t +{ + ZXIC_UINT32 info_wr_ddr_user_en; + ZXIC_UINT32 info_wr_ddr_epid; + ZXIC_UINT32 info_wr_ddr_vfunc_num; + ZXIC_UINT32 info_wr_ddr_func_num; + ZXIC_UINT32 info_wr_ddr_vfunc_active; +}DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_USER_T; + +typedef struct dpp_dtb_dtb_cfg_info_axi_last_wr_ddr_onload_cnt_t +{ + ZXIC_UINT32 info_axi_last_wr_ddr_onload_cnt; +}DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_ONLOAD_CNT_T; + +typedef struct dpp_dtb_dtb_cfg_cnt_axi_wr_ddr_resp_err_t +{ + ZXIC_UINT32 cnt_axi_wr_ddr_resp_err; +}DPP_DTB_DTB_CFG_CNT_AXI_WR_DDR_RESP_ERR_T; + +typedef struct dpp_dtb_dtb_cfg_info_axi_last_wr_fin_addr_high_t +{ + ZXIC_UINT32 info_axi_last_wr_fin_addr_high; +}DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_ADDR_HIGH_T; + +typedef struct dpp_dtb_dtb_cfg_info_axi_last_wr_fin_addr_low_t +{ + ZXIC_UINT32 info_axi_last_wr_fin_addr_low; +}DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_ADDR_LOW_T; + +typedef struct dpp_dtb_dtb_cfg_info_axi_last_wr_fin_len_t +{ + ZXIC_UINT32 info_axi_last_wr_fin_len; +}DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_LEN_T; + +typedef struct dpp_dtb_dtb_cfg_info_axi_last_wr_fin_user_t +{ + ZXIC_UINT32 info_wr_fin_user_en; + ZXIC_UINT32 info_wr_fin_epid; + ZXIC_UINT32 info_wr_fin_vfunc_num; + ZXIC_UINT32 info_wr_fin_func_num; + ZXIC_UINT32 info_wr_fin_vfunc_active; +}DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_USER_T; + +typedef struct dpp_dtb_dtb_cfg_info_axi_last_wr_fin_onload_cnt_t +{ + ZXIC_UINT32 info_axi_last_wr_fin_onload_cnt; +}DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_ONLOAD_CNT_T; + +typedef struct dpp_dtb_dtb_cfg_cnt_axi_wr_fin_resp_err_t +{ + ZXIC_UINT32 cnt_axi_wr_fin_resp_err; +}DPP_DTB_DTB_CFG_CNT_AXI_WR_FIN_RESP_ERR_T; + +typedef struct dpp_dtb_dtb_cfg_cnt_dtb_wr_smmu0_table_high_t +{ + ZXIC_UINT32 cnt_dtb_wr_smmu0_table_high; +}DPP_DTB_DTB_CFG_CNT_DTB_WR_SMMU0_TABLE_HIGH_T; + +typedef struct dpp_dtb_dtb_cfg_cnt_dtb_wr_smmu0_table_low_t +{ + ZXIC_UINT32 cnt_dtb_wr_smmu0_table_low; +}DPP_DTB_DTB_CFG_CNT_DTB_WR_SMMU0_TABLE_LOW_T; + +typedef struct dpp_dtb_dtb_cfg_cnt_dtb_wr_smmu1_table_high_t +{ + ZXIC_UINT32 cnt_dtb_wr_smmu1_table_high; +}DPP_DTB_DTB_CFG_CNT_DTB_WR_SMMU1_TABLE_HIGH_T; + +typedef struct dpp_dtb_dtb_cfg_cnt_dtb_wr_smmu1_table_low_t +{ + ZXIC_UINT32 cnt_dtb_wr_smmu1_table_low; +}DPP_DTB_DTB_CFG_CNT_DTB_WR_SMMU1_TABLE_LOW_T; + +typedef struct dpp_dtb_dtb_cfg_cnt_dtb_wr_zcam_table_high_t +{ + ZXIC_UINT32 cnt_dtb_wr_zcam_table_high; +}DPP_DTB_DTB_CFG_CNT_DTB_WR_ZCAM_TABLE_HIGH_T; + +typedef struct dpp_dtb_dtb_cfg_cnt_dtb_wr_zcam_table_low_t +{ + ZXIC_UINT32 cnt_dtb_wr_zcam_table_low; +}DPP_DTB_DTB_CFG_CNT_DTB_WR_ZCAM_TABLE_LOW_T; + +typedef struct dpp_dtb_dtb_cfg_cnt_dtb_wr_etcam_table_high_t +{ + ZXIC_UINT32 cnt_dtb_wr_etcam_table_high; +}DPP_DTB_DTB_CFG_CNT_DTB_WR_ETCAM_TABLE_HIGH_T; + +typedef struct dpp_dtb_dtb_cfg_cnt_dtb_wr_etcam_table_low_t +{ + ZXIC_UINT32 cnt_dtb_wr_etcam_table_low; +}DPP_DTB_DTB_CFG_CNT_DTB_WR_ETCAM_TABLE_LOW_T; + +typedef struct dpp_dtb_dtb_cfg_cnt_dtb_wr_hash_table_high_t +{ + ZXIC_UINT32 cnt_dtb_wr_hash_table_high; +}DPP_DTB_DTB_CFG_CNT_DTB_WR_HASH_TABLE_HIGH_T; + +typedef struct dpp_dtb_dtb_cfg_cnt_dtb_wr_hash_table_low_t +{ + ZXIC_UINT32 cnt_dtb_wr_hash_table_low; +}DPP_DTB_DTB_CFG_CNT_DTB_WR_HASH_TABLE_LOW_T; + +typedef struct dpp_dtb_dtb_cfg_cnt_dtb_rd_smmu0_table_high_t +{ + ZXIC_UINT32 cnt_dtb_rd_smmu0_table_high; +}DPP_DTB_DTB_CFG_CNT_DTB_RD_SMMU0_TABLE_HIGH_T; + +typedef struct dpp_dtb_dtb_cfg_cnt_dtb_rd_smmu0_table_low_t +{ + ZXIC_UINT32 cnt_dtb_rd_smmu0_table_low; +}DPP_DTB_DTB_CFG_CNT_DTB_RD_SMMU0_TABLE_LOW_T; + +typedef struct dpp_dtb_dtb_cfg_cnt_dtb_rd_smmu1_table_high_t +{ + ZXIC_UINT32 cnt_dtb_rd_smmu1_table_high; +}DPP_DTB_DTB_CFG_CNT_DTB_RD_SMMU1_TABLE_HIGH_T; + +typedef struct dpp_dtb_dtb_cfg_cnt_dtb_rd_smmu1_table_low_t +{ + ZXIC_UINT32 cnt_dtb_rd_smmu1_table_low; +}DPP_DTB_DTB_CFG_CNT_DTB_RD_SMMU1_TABLE_LOW_T; + +typedef struct dpp_dtb_dtb_cfg_cnt_dtb_rd_zcam_table_high_t +{ + ZXIC_UINT32 cnt_dtb_rd_zcam_table_high; +}DPP_DTB_DTB_CFG_CNT_DTB_RD_ZCAM_TABLE_HIGH_T; + +typedef struct dpp_dtb_dtb_cfg_cnt_dtb_rd_zcam_table_low_t +{ + ZXIC_UINT32 cnt_dtb_rd_zcam_table_low; +}DPP_DTB_DTB_CFG_CNT_DTB_RD_ZCAM_TABLE_LOW_T; + +typedef struct dpp_dtb_dtb_cfg_cnt_dtb_rd_etcam_table_high_t +{ + ZXIC_UINT32 cnt_dtb_rd_etcam_table_high; +}DPP_DTB_DTB_CFG_CNT_DTB_RD_ETCAM_TABLE_HIGH_T; + +typedef struct dpp_dtb_dtb_cfg_cnt_dtb_rd_etcam_table_low_t +{ + ZXIC_UINT32 cnt_dtb_rd_etcam_table_low; +}DPP_DTB_DTB_CFG_CNT_DTB_RD_ETCAM_TABLE_LOW_T; + +typedef struct dpp_dtb_dtb_cfg_info_wr_ctrl_state_t +{ + ZXIC_UINT32 info_wr_ctrl_state; +}DPP_DTB_DTB_CFG_INFO_WR_CTRL_STATE_T; + +typedef struct dpp_dtb_dtb_cfg_info_rd_table_state_t +{ + ZXIC_UINT32 info_rd_table_state; +}DPP_DTB_DTB_CFG_INFO_RD_TABLE_STATE_T; + +typedef struct dpp_dtb_dtb_cfg_info_rd_pd_state_t +{ + ZXIC_UINT32 info_rd_pd_state; +}DPP_DTB_DTB_CFG_INFO_RD_PD_STATE_T; + +typedef struct dpp_dtb_dtb_cfg_info_dump_cmd_state_t +{ + ZXIC_UINT32 info_dump_cmd_state; +}DPP_DTB_DTB_CFG_INFO_DUMP_CMD_STATE_T; + +typedef struct dpp_dtb_dtb_cfg_info_wr_ddr_state_t +{ + ZXIC_UINT32 info_wr_ddr_state; +}DPP_DTB_DTB_CFG_INFO_WR_DDR_STATE_T; + +typedef struct dpp_dtb_dtb_cfg_cfg_dtb_debug_info_clr_t +{ + ZXIC_UINT32 cfg_dtb_debug_info_clr; +}DPP_DTB_DTB_CFG_CFG_DTB_DEBUG_INFO_CLR_T; + +typedef struct dpp_dtb_ddos_cfg_ddos_stat_dump_thrd_0_15_t +{ + ZXIC_UINT32 cfg_ddos_stat_dump_thrd; +}DPP_DTB_DDOS_CFG_DDOS_STAT_DUMP_THRD_0_15_T; + +typedef struct dpp_dtb_ddos_cfg_ddos_stat_dump_thrd_comp_en_t +{ + ZXIC_UINT32 cfg_ddos_stat_dump_thrd_comp_en; +}DPP_DTB_DDOS_CFG_DDOS_STAT_DUMP_THRD_COMP_EN_T; + +typedef struct dpp_dtb_ddos_cfg_ddos_dump_stat_num_t +{ + ZXIC_UINT32 cfg_ddos_dump_stat_num; +}DPP_DTB_DDOS_CFG_DDOS_DUMP_STAT_NUM_T; + +typedef struct dpp_dtb_ddos_cfg_ddos_even_hash_table_baddr_t +{ + ZXIC_UINT32 cfg_ddos_even_hash_table_baddr; +}DPP_DTB_DDOS_CFG_DDOS_EVEN_HASH_TABLE_BADDR_T; + +typedef struct dpp_dtb_ddos_cfg_ddos_odd_hash_table_baddr_t +{ + ZXIC_UINT32 cfg_ddos_odd_hash_table_baddr; +}DPP_DTB_DDOS_CFG_DDOS_ODD_HASH_TABLE_BADDR_T; + +typedef struct dpp_dtb_ddos_cfg_ddos_stat_index_offset_t +{ + ZXIC_UINT32 cfg_ddos_stat_index_offset; +}DPP_DTB_DDOS_CFG_DDOS_STAT_INDEX_OFFSET_T; + +typedef struct dpp_dtb_ddos_cfg_ddos_ns_flag_cnt_t +{ + ZXIC_UINT32 cfg_ddos_ns_flag_cnt; +}DPP_DTB_DDOS_CFG_DDOS_NS_FLAG_CNT_T; + +typedef struct dpp_dtb_ddos_cfg_ddos_even_stat_table_baddr_t +{ + ZXIC_UINT32 cfg_ddos_even_stat_table_baddr; +}DPP_DTB_DDOS_CFG_DDOS_EVEN_STAT_TABLE_BADDR_T; + +typedef struct dpp_dtb_ddos_cfg_ddos_odd_stat_table_baddr_t +{ + ZXIC_UINT32 cfg_ddos_odd_stat_table_baddr; +}DPP_DTB_DDOS_CFG_DDOS_ODD_STAT_TABLE_BADDR_T; + +typedef struct dpp_dtb_ddos_cfg_ddos_even_stat_dump_daddr_h_t +{ + ZXIC_UINT32 cfg_ddos_even_stat_dump_daddr_h; +}DPP_DTB_DDOS_CFG_DDOS_EVEN_STAT_DUMP_DADDR_H_T; + +typedef struct dpp_dtb_ddos_cfg_ddos_even_stat_dump_daddr_l_t +{ + ZXIC_UINT32 cfg_ddos_even_stat_dump_daddr_l; +}DPP_DTB_DDOS_CFG_DDOS_EVEN_STAT_DUMP_DADDR_L_T; + +typedef struct dpp_dtb_ddos_cfg_ddos_odd_stat_dump_daddr_h_t +{ + ZXIC_UINT32 cfg_ddos_odd_stat_dump_daddr_h; +}DPP_DTB_DDOS_CFG_DDOS_ODD_STAT_DUMP_DADDR_H_T; + +typedef struct dpp_dtb_ddos_cfg_ddos_odd_stat_dump_daddr_l_t +{ + ZXIC_UINT32 cfg_ddos_odd_stat_dump_daddr_l; +}DPP_DTB_DDOS_CFG_DDOS_ODD_STAT_DUMP_DADDR_L_T; + +typedef struct dpp_dtb_ddos_cfg_ddos_work_mode_enable_t +{ + ZXIC_UINT32 cfg_ddos_mode_work_enable; +}DPP_DTB_DDOS_CFG_DDOS_WORK_MODE_ENABLE_T; + +typedef struct dpp_dtb_ddos_cfg_ddos_stat_table_len_t +{ + ZXIC_UINT32 cfg_ddos_stat_table_len; +}DPP_DTB_DDOS_CFG_DDOS_STAT_TABLE_LEN_T; + +typedef struct dpp_dtb_ddos_cfg_ddos_hash_table_len_t +{ + ZXIC_UINT32 cfg_ddos_hash_table_len; +}DPP_DTB_DDOS_CFG_DDOS_HASH_TABLE_LEN_T; + +typedef struct dpp_dtb_dtb_ram_traf_ctrl_ram0_0_255_t +{ + ZXIC_UINT32 traf_ctrl_ram0_0_255; +}DPP_DTB_DTB_RAM_TRAF_CTRL_RAM0_0_255_T; + +typedef struct dpp_dtb_dtb_ram_traf_ctrl_ram1_0_255_t +{ + ZXIC_UINT32 traf_ctrl_ram1_0_255; +}DPP_DTB_DTB_RAM_TRAF_CTRL_RAM1_0_255_T; + +typedef struct dpp_dtb_dtb_ram_traf_ctrl_ram2_0_255_t +{ + ZXIC_UINT32 traf_ctrl_ram2_0_255; +}DPP_DTB_DTB_RAM_TRAF_CTRL_RAM2_0_255_T; + +typedef struct dpp_dtb_dtb_ram_traf_ctrl_ram3_0_255_t +{ + ZXIC_UINT32 traf_ctrl_ram3_0_255; +}DPP_DTB_DTB_RAM_TRAF_CTRL_RAM3_0_255_T; + +typedef struct dpp_dtb_dtb_ram_traf_ctrl_ram4_0_255_t +{ + ZXIC_UINT32 traf_ctrl_ram4_0_255; +}DPP_DTB_DTB_RAM_TRAF_CTRL_RAM4_0_255_T; + +typedef struct dpp_dtb_dtb_ram_traf_ctrl_ram5_0_63_t +{ + ZXIC_UINT32 traf_ctrl_ram5_0_63; +}DPP_DTB_DTB_RAM_TRAF_CTRL_RAM5_0_63_T; + +typedef struct dpp_dtb_dtb_ram_dump_pd_ram_0_2047_t +{ + ZXIC_UINT32 dump_pd_ram_0_2047; +}DPP_DTB_DTB_RAM_DUMP_PD_RAM_0_2047_T; + +typedef struct dpp_dtb_dtb_ram_rd_ctrl_ram_0_4095_t +{ + ZXIC_UINT32 rd_ctrl_ram_0_4095; +}DPP_DTB_DTB_RAM_RD_CTRL_RAM_0_4095_T; + +typedef struct dpp_dtb_dtb_ram_rd_table_ram_0_8191_t +{ + ZXIC_UINT32 rd_table_ram_0_8191; +}DPP_DTB_DTB_RAM_RD_TABLE_RAM_0_8191_T; + +typedef struct dpp_dtb_dtb_ram_dtb_cmd_man_ram_0_16383_t +{ + ZXIC_UINT32 dtb_cmd_man_ram_0_16383; +}DPP_DTB_DTB_RAM_DTB_CMD_MAN_RAM_0_16383_T; + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_etm_reg.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_etm_reg.h new file mode 100644 index 0000000..60d7491 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_etm_reg.h @@ -0,0 +1,4926 @@ + +#ifndef _DPP_ETM_REG_H_ +#define _DPP_ETM_REG_H_ + +#ifdef __cplusplus +extern "C"{ +#endif + +typedef struct dpp_etm_cfgmt_cpu_check_reg_t +{ + ZXIC_UINT32 cpu_check_reg; +}DPP_ETM_CFGMT_CPU_CHECK_REG_T; + +typedef struct dpp_etm_cfgmt_cfgmt_blksize_t +{ + ZXIC_UINT32 cfgmt_blksize; +}DPP_ETM_CFGMT_CFGMT_BLKSIZE_T; + +typedef struct dpp_etm_cfgmt_reg_int_state_reg_t +{ + ZXIC_UINT32 shap_int; + ZXIC_UINT32 crdt_int; + ZXIC_UINT32 mmu_int; + ZXIC_UINT32 qmu_int; + ZXIC_UINT32 cgavd_int; + ZXIC_UINT32 olif_int; + ZXIC_UINT32 cfgmt_int_buf; +}DPP_ETM_CFGMT_REG_INT_STATE_REG_T; + +typedef struct dpp_etm_cfgmt_reg_int_mask_reg_t +{ + ZXIC_UINT32 shap_int_mask; + ZXIC_UINT32 crdt_int_mask; + ZXIC_UINT32 tmmu_int_mask; + ZXIC_UINT32 qmu_int_mask; + ZXIC_UINT32 cgavd_int_mask; + ZXIC_UINT32 olif_int_mask; + ZXIC_UINT32 cfgmt_int_buf_mask; +}DPP_ETM_CFGMT_REG_INT_MASK_REG_T; + +typedef struct dpp_etm_cfgmt_timeout_limit_t +{ + ZXIC_UINT32 timeout_limit; +}DPP_ETM_CFGMT_TIMEOUT_LIMIT_T; + +typedef struct dpp_etm_cfgmt_subsystem_rdy_reg_t +{ + ZXIC_UINT32 olif_rdy; + ZXIC_UINT32 qmu_rdy; + ZXIC_UINT32 cgavd_rdy; + ZXIC_UINT32 tmmu_rdy; + ZXIC_UINT32 shap_rdy; + ZXIC_UINT32 crdt_rdy; +}DPP_ETM_CFGMT_SUBSYSTEM_RDY_REG_T; + +typedef struct dpp_etm_cfgmt_subsystem_en_reg_t +{ + ZXIC_UINT32 subsystem_en_buf_31_28; + ZXIC_UINT32 subsystem_en_buf_25_0; +}DPP_ETM_CFGMT_SUBSYSTEM_EN_REG_T; + +typedef struct dpp_etm_cfgmt_cfgmt_int_reg_t +{ + ZXIC_UINT32 cfgmt_int_buf; +}DPP_ETM_CFGMT_CFGMT_INT_REG_T; + +typedef struct dpp_etm_cfgmt_qmu_work_mode_t +{ + ZXIC_UINT32 qmu_work_mode; +}DPP_ETM_CFGMT_QMU_WORK_MODE_T; + +typedef struct dpp_etm_cfgmt_cfgmt_ddr_attach_t +{ + ZXIC_UINT32 cfgmt_ddr_attach; +}DPP_ETM_CFGMT_CFGMT_DDR_ATTACH_T; + +typedef struct dpp_etm_cfgmt_cnt_mode_reg_t +{ + ZXIC_UINT32 cfgmt_fc_count_mode; + ZXIC_UINT32 cfgmt_count_rd_mode; + ZXIC_UINT32 cfgmt_count_overflow_mode; +}DPP_ETM_CFGMT_CNT_MODE_REG_T; + +typedef struct dpp_etm_cfgmt_clkgate_en_t +{ + ZXIC_UINT32 clkgate_en; +}DPP_ETM_CFGMT_CLKGATE_EN_T; + +typedef struct dpp_etm_cfgmt_softrst_en_t +{ + ZXIC_UINT32 softrst_en; +}DPP_ETM_CFGMT_SOFTRST_EN_T; + +typedef struct dpp_etm_olif_imem_prog_full_t +{ + ZXIC_UINT32 imem_prog_full_assert; + ZXIC_UINT32 imem_prog_full_negate; +}DPP_ETM_OLIF_IMEM_PROG_FULL_T; + +typedef struct dpp_etm_olif_qmu_para_prog_full_t +{ + ZXIC_UINT32 qmu_para_prog_full_assert; + ZXIC_UINT32 qmu_para_prog_full_negate; +}DPP_ETM_OLIF_QMU_PARA_PROG_FULL_T; + +typedef struct dpp_etm_olif_olif_int_mask_t +{ + ZXIC_UINT32 emem_dat_sop_err_mask; + ZXIC_UINT32 emem_dat_eop_err_mask; + ZXIC_UINT32 imem_dat_sop_err_mask; + ZXIC_UINT32 imem_dat_eop_err_mask; + ZXIC_UINT32 crcram_parity_err_mask; + ZXIC_UINT32 emem_fifo_ecc_mask; + ZXIC_UINT32 imem_fifo_ecc_mask; + ZXIC_UINT32 emem_fifo_ovf_mask; + ZXIC_UINT32 emem_fifo_udf_mask; + ZXIC_UINT32 imem_fifo_ovf_mask; + ZXIC_UINT32 imem_fifo_udf_mask; + ZXIC_UINT32 para_fifo_ecc_mask; + ZXIC_UINT32 para_fifo_ovf_mask; + ZXIC_UINT32 para_fifo_udf_mask; + ZXIC_UINT32 itmh_ecc_single_err_mask; + ZXIC_UINT32 itmh_ecc_double_err_mask; + ZXIC_UINT32 order_fifo_parity_err_mask; + ZXIC_UINT32 order_fifo_ovf_mask; + ZXIC_UINT32 order_fifo_udf_mask; +}DPP_ETM_OLIF_OLIF_INT_MASK_T; + +typedef struct dpp_etm_olif_itmhram_parity_err_2_int_t +{ + ZXIC_UINT32 emem_dat_sop_err; + ZXIC_UINT32 emem_dat_eop_err; + ZXIC_UINT32 imem_dat_sop_err; + ZXIC_UINT32 imem_dat_eop_err; + ZXIC_UINT32 crcram_parity_err_1_int; + ZXIC_UINT32 emem_fifo_ecc_single_err_int; + ZXIC_UINT32 emem_fifo_ecc_double_err_int; + ZXIC_UINT32 imem_fifo_ecc_single_err_int; + ZXIC_UINT32 imem_fifo_ecc_double_err_int; + ZXIC_UINT32 emem_fifo_ovf_int; + ZXIC_UINT32 emem_fifo_udf_int; + ZXIC_UINT32 imem_fifo_ovf_int; + ZXIC_UINT32 imem_fifo_udf_int; + ZXIC_UINT32 para_fifo_ecc_single_err_int; + ZXIC_UINT32 para_fifo_ecc_double_err_int; + ZXIC_UINT32 para_fifo_ovf_int; + ZXIC_UINT32 para_fifo_udf_int; + ZXIC_UINT32 itmh_ecc_single_err_int; + ZXIC_UINT32 itmh_ecc_double_err_int; + ZXIC_UINT32 order_fifo_parity_err_int; + ZXIC_UINT32 order_fifo_ovf_int; + ZXIC_UINT32 order_fifo_udf_int; +}DPP_ETM_OLIF_ITMHRAM_PARITY_ERR_2_INT_T; + +typedef struct dpp_etm_olif_lif0_port_rdy_mask_h_t +{ + ZXIC_UINT32 lif0_port_rdy_mask_h; +}DPP_ETM_OLIF_LIF0_PORT_RDY_MASK_H_T; + +typedef struct dpp_etm_olif_lif0_port_rdy_mask_l_t +{ + ZXIC_UINT32 lif0_port_rdy_mask_l; +}DPP_ETM_OLIF_LIF0_PORT_RDY_MASK_L_T; + +typedef struct dpp_etm_olif_lif0_port_rdy_cfg_h_t +{ + ZXIC_UINT32 lif0_port_rdy_cfg_h; +}DPP_ETM_OLIF_LIF0_PORT_RDY_CFG_H_T; + +typedef struct dpp_etm_olif_lif0_port_rdy_cfg_l_t +{ + ZXIC_UINT32 lif0_port_rdy_cfg_l; +}DPP_ETM_OLIF_LIF0_PORT_RDY_CFG_L_T; + +typedef struct dpp_etm_olif_lif0_link_rdy_mask_cfg_t +{ + ZXIC_UINT32 lif0_link_rdy_mask; + ZXIC_UINT32 lif0_link_rdy_cfg; +}DPP_ETM_OLIF_LIF0_LINK_RDY_MASK_CFG_T; + +typedef struct dpp_etm_olif_tm_lif_stat_cfg_t +{ + ZXIC_UINT32 all_or_by_port; + ZXIC_UINT32 i_or_e_sel; + ZXIC_UINT32 port_or_dest_id_sel; + ZXIC_UINT32 port_dest_id; +}DPP_ETM_OLIF_TM_LIF_STAT_CFG_T; + +typedef struct dpp_etm_olif_tm_lif_sop_stat_t +{ + ZXIC_UINT32 tm_lif_sop_stat; +}DPP_ETM_OLIF_TM_LIF_SOP_STAT_T; + +typedef struct dpp_etm_olif_tm_lif_eop_stat_t +{ + ZXIC_UINT32 tm_lif_eop_stat; +}DPP_ETM_OLIF_TM_LIF_EOP_STAT_T; + +typedef struct dpp_etm_olif_tm_lif_vld_stat_t +{ + ZXIC_UINT32 tm_lif_vld_stat; +}DPP_ETM_OLIF_TM_LIF_VLD_STAT_T; + +typedef struct dpp_etm_cgavd_prog_full_assert_cfg_t +{ + ZXIC_UINT32 prog_full_assert_cfg; + ZXIC_UINT32 prog_full_negate_cfg; +}DPP_ETM_CGAVD_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_etm_cgavd_cgavd_int_t +{ + ZXIC_UINT32 cgavd_int; +}DPP_ETM_CGAVD_CGAVD_INT_T; + +typedef struct dpp_etm_cgavd_cgavd_ram_err_t +{ + ZXIC_UINT32 flow_qnum_intb; + ZXIC_UINT32 flow_qnum_inta; + ZXIC_UINT32 pp_qlen_inta; + ZXIC_UINT32 pp_qlen_intb; + ZXIC_UINT32 pp_tdth_int; + ZXIC_UINT32 flow_tdth_inta; + ZXIC_UINT32 flow_tdth_intb; + ZXIC_UINT32 flow_qlen_inta; + ZXIC_UINT32 flow_qlen_intb; + ZXIC_UINT32 qmu_cgavd_fifo_uv_int; + ZXIC_UINT32 qmu_cgavd_fifo_ov_int; + ZXIC_UINT32 pds_deal_fifo_ov_int; + ZXIC_UINT32 pds_deal_fifo_uv_int; +}DPP_ETM_CGAVD_CGAVD_RAM_ERR_T; + +typedef struct dpp_etm_cgavd_cgavd_int_mask_t +{ + ZXIC_UINT32 cgavd_int_mask; +}DPP_ETM_CGAVD_CGAVD_INT_MASK_T; + +typedef struct dpp_etm_cgavd_cgavd_ram_err_int_mask_t +{ + ZXIC_UINT32 flow_qnum_inta_mask; + ZXIC_UINT32 flow_qnum_intb_mask; + ZXIC_UINT32 pp_qlen_inta_mask; + ZXIC_UINT32 pp_qlen_intb_mask; + ZXIC_UINT32 pp_tdth_int_mask; + ZXIC_UINT32 flow_tdth_inta_mask; + ZXIC_UINT32 flow_tdth_intb_mask; + ZXIC_UINT32 flow_qlen_inta_mask; + ZXIC_UINT32 flow_qlen_intb_mask; + ZXIC_UINT32 qmu_cgavd_fifo_uv_int_mask; + ZXIC_UINT32 qmu_cgavd_fifo_ov_int_mask; + ZXIC_UINT32 pds_deal_fifo_ov_int_mask; + ZXIC_UINT32 pds_deal_fifo_uv_int_mask; +}DPP_ETM_CGAVD_CGAVD_RAM_ERR_INT_MASK_T; + +typedef struct dpp_etm_cgavd_cfgmt_byte_mode_t +{ + ZXIC_UINT32 cfgmt_byte_mode; +}DPP_ETM_CGAVD_CFGMT_BYTE_MODE_T; + +typedef struct dpp_etm_cgavd_avg_qlen_return_zero_en_t +{ + ZXIC_UINT32 avg_qlen_return_zero_en; +}DPP_ETM_CGAVD_AVG_QLEN_RETURN_ZERO_EN_T; + +typedef struct dpp_etm_cgavd_flow_wred_q_len_th_t +{ + ZXIC_UINT32 flow_wred_q_len_th; +}DPP_ETM_CGAVD_FLOW_WRED_Q_LEN_TH_T; + +typedef struct dpp_etm_cgavd_flow_wq_t +{ + ZXIC_UINT32 wq_flow; +}DPP_ETM_CGAVD_FLOW_WQ_T; + +typedef struct dpp_etm_cgavd_flow_wred_max_th_t +{ + ZXIC_UINT32 flow_wred_max_th; +}DPP_ETM_CGAVD_FLOW_WRED_MAX_TH_T; + +typedef struct dpp_etm_cgavd_flow_wred_min_th_t +{ + ZXIC_UINT32 flow_wred_min_th; +}DPP_ETM_CGAVD_FLOW_WRED_MIN_TH_T; + +typedef struct dpp_etm_cgavd_flow_wred_cfg_para_t +{ + ZXIC_UINT32 flow_wred_cfg_para; +}DPP_ETM_CGAVD_FLOW_WRED_CFG_PARA_T; + +typedef struct dpp_etm_cgavd_pp_avg_q_len_t +{ + ZXIC_UINT32 pp_avg_q_len; +}DPP_ETM_CGAVD_PP_AVG_Q_LEN_T; + +typedef struct dpp_etm_cgavd_pp_td_th_t +{ + ZXIC_UINT32 pp_td_th; +}DPP_ETM_CGAVD_PP_TD_TH_T; + +typedef struct dpp_etm_cgavd_pp_ca_mtd_t +{ + ZXIC_UINT32 pp_ca_mtd; +}DPP_ETM_CGAVD_PP_CA_MTD_T; + +typedef struct dpp_etm_cgavd_pp_wred_grp_th_en_t +{ + ZXIC_UINT32 pp_wred_grp; + ZXIC_UINT32 pp_wred_grp_th_en; +}DPP_ETM_CGAVD_PP_WRED_GRP_TH_EN_T; + +typedef struct dpp_etm_cgavd_pp_wred_q_len_th_t +{ + ZXIC_UINT32 pp_wred_q_len_th; +}DPP_ETM_CGAVD_PP_WRED_Q_LEN_TH_T; + +typedef struct dpp_etm_cgavd_pp_wq_t +{ + ZXIC_UINT32 wq_pp; +}DPP_ETM_CGAVD_PP_WQ_T; + +typedef struct dpp_etm_cgavd_pp_wred_max_th_t +{ + ZXIC_UINT32 pp_wred_max_th; +}DPP_ETM_CGAVD_PP_WRED_MAX_TH_T; + +typedef struct dpp_etm_cgavd_pp_wred_min_th_t +{ + ZXIC_UINT32 pp_wred_min_th; +}DPP_ETM_CGAVD_PP_WRED_MIN_TH_T; + +typedef struct dpp_etm_cgavd_pp_cfg_para_t +{ + ZXIC_UINT32 pp_cfg_para; +}DPP_ETM_CGAVD_PP_CFG_PARA_T; + +typedef struct dpp_etm_cgavd_sys_avg_q_len_t +{ + ZXIC_UINT32 sys_avg_q_len; +}DPP_ETM_CGAVD_SYS_AVG_Q_LEN_T; + +typedef struct dpp_etm_cgavd_sys_td_th_t +{ + ZXIC_UINT32 sys_td_th; +}DPP_ETM_CGAVD_SYS_TD_TH_T; + +typedef struct dpp_etm_cgavd_sys_cgavd_metd_t +{ + ZXIC_UINT32 sys_cgavd_metd; +}DPP_ETM_CGAVD_SYS_CGAVD_METD_T; + +typedef struct dpp_etm_cgavd_sys_cfg_q_grp_para_t +{ + ZXIC_UINT32 gred_q_len_th_sys; +}DPP_ETM_CGAVD_SYS_CFG_Q_GRP_PARA_T; + +typedef struct dpp_etm_cgavd_sys_wq_t +{ + ZXIC_UINT32 wq_sys; +}DPP_ETM_CGAVD_SYS_WQ_T; + +typedef struct dpp_etm_cgavd_gred_max_th_t +{ + ZXIC_UINT32 gred_max_th; +}DPP_ETM_CGAVD_GRED_MAX_TH_T; + +typedef struct dpp_etm_cgavd_gred_mid_th_t +{ + ZXIC_UINT32 gred_mid_th; +}DPP_ETM_CGAVD_GRED_MID_TH_T; + +typedef struct dpp_etm_cgavd_gred_min_th_t +{ + ZXIC_UINT32 gred_min_th; +}DPP_ETM_CGAVD_GRED_MIN_TH_T; + +typedef struct dpp_etm_cgavd_gred_cfg_para0_t +{ + ZXIC_UINT32 gred_cfg_para0; +}DPP_ETM_CGAVD_GRED_CFG_PARA0_T; + +typedef struct dpp_etm_cgavd_gred_cfg_para1_t +{ + ZXIC_UINT32 gred_cfg_para1; +}DPP_ETM_CGAVD_GRED_CFG_PARA1_T; + +typedef struct dpp_etm_cgavd_gred_cfg_para2_t +{ + ZXIC_UINT32 gred_cfg_para2; +}DPP_ETM_CGAVD_GRED_CFG_PARA2_T; + +typedef struct dpp_etm_cgavd_sys_window_th_h_t +{ + ZXIC_UINT32 sys_window_th_h; +}DPP_ETM_CGAVD_SYS_WINDOW_TH_H_T; + +typedef struct dpp_etm_cgavd_sys_window_th_l_t +{ + ZXIC_UINT32 sys_window_th_l; +}DPP_ETM_CGAVD_SYS_WINDOW_TH_L_T; + +typedef struct dpp_etm_cgavd_amplify_gene0_t +{ + ZXIC_UINT32 amplify_gene0; +}DPP_ETM_CGAVD_AMPLIFY_GENE0_T; + +typedef struct dpp_etm_cgavd_amplify_gene1_t +{ + ZXIC_UINT32 amplify_gene1; +}DPP_ETM_CGAVD_AMPLIFY_GENE1_T; + +typedef struct dpp_etm_cgavd_amplify_gene2_t +{ + ZXIC_UINT32 amplify_gene2; +}DPP_ETM_CGAVD_AMPLIFY_GENE2_T; + +typedef struct dpp_etm_cgavd_amplify_gene3_t +{ + ZXIC_UINT32 amplify_gene3; +}DPP_ETM_CGAVD_AMPLIFY_GENE3_T; + +typedef struct dpp_etm_cgavd_amplify_gene4_t +{ + ZXIC_UINT32 amplify_gene4; +}DPP_ETM_CGAVD_AMPLIFY_GENE4_T; + +typedef struct dpp_etm_cgavd_amplify_gene5_t +{ + ZXIC_UINT32 amplify_gene5; +}DPP_ETM_CGAVD_AMPLIFY_GENE5_T; + +typedef struct dpp_etm_cgavd_amplify_gene6_t +{ + ZXIC_UINT32 amplify_gene6; +}DPP_ETM_CGAVD_AMPLIFY_GENE6_T; + +typedef struct dpp_etm_cgavd_amplify_gene7_t +{ + ZXIC_UINT32 amplify_gene7; +}DPP_ETM_CGAVD_AMPLIFY_GENE7_T; + +typedef struct dpp_etm_cgavd_amplify_gene8_t +{ + ZXIC_UINT32 amplify_gene8; +}DPP_ETM_CGAVD_AMPLIFY_GENE8_T; + +typedef struct dpp_etm_cgavd_amplify_gene9_t +{ + ZXIC_UINT32 amplify_gene9; +}DPP_ETM_CGAVD_AMPLIFY_GENE9_T; + +typedef struct dpp_etm_cgavd_amplify_gene10_t +{ + ZXIC_UINT32 amplify_gene10; +}DPP_ETM_CGAVD_AMPLIFY_GENE10_T; + +typedef struct dpp_etm_cgavd_amplify_gene11_t +{ + ZXIC_UINT32 amplify_gene11; +}DPP_ETM_CGAVD_AMPLIFY_GENE11_T; + +typedef struct dpp_etm_cgavd_amplify_gene12_t +{ + ZXIC_UINT32 amplify_gene12; +}DPP_ETM_CGAVD_AMPLIFY_GENE12_T; + +typedef struct dpp_etm_cgavd_amplify_gene13_t +{ + ZXIC_UINT32 amplify_gene13; +}DPP_ETM_CGAVD_AMPLIFY_GENE13_T; + +typedef struct dpp_etm_cgavd_amplify_gene14_t +{ + ZXIC_UINT32 amplify_gene14; +}DPP_ETM_CGAVD_AMPLIFY_GENE14_T; + +typedef struct dpp_etm_cgavd_amplify_gene15_t +{ + ZXIC_UINT32 amplify_gene15; +}DPP_ETM_CGAVD_AMPLIFY_GENE15_T; + +typedef struct dpp_etm_cgavd_equal_pkt_len_en_t +{ + ZXIC_UINT32 equal_pkt_len_en; +}DPP_ETM_CGAVD_EQUAL_PKT_LEN_EN_T; + +typedef struct dpp_etm_cgavd_equal_pkt_len_th0_t +{ + ZXIC_UINT32 equal_pkt_len_th0; +}DPP_ETM_CGAVD_EQUAL_PKT_LEN_TH0_T; + +typedef struct dpp_etm_cgavd_equal_pkt_len_th1_t +{ + ZXIC_UINT32 equal_pkt_len_th1; +}DPP_ETM_CGAVD_EQUAL_PKT_LEN_TH1_T; + +typedef struct dpp_etm_cgavd_equal_pkt_len_th2_t +{ + ZXIC_UINT32 equal_pkt_len_th2; +}DPP_ETM_CGAVD_EQUAL_PKT_LEN_TH2_T; + +typedef struct dpp_etm_cgavd_equal_pkt_len_th3_t +{ + ZXIC_UINT32 equal_pkt_len_th3; +}DPP_ETM_CGAVD_EQUAL_PKT_LEN_TH3_T; + +typedef struct dpp_etm_cgavd_equal_pkt_len_th4_t +{ + ZXIC_UINT32 equal_pkt_len_th4; +}DPP_ETM_CGAVD_EQUAL_PKT_LEN_TH4_T; + +typedef struct dpp_etm_cgavd_equal_pkt_len_th5_t +{ + ZXIC_UINT32 equal_pkt_len_th5; +}DPP_ETM_CGAVD_EQUAL_PKT_LEN_TH5_T; + +typedef struct dpp_etm_cgavd_equal_pkt_len_th6_t +{ + ZXIC_UINT32 equal_pkt_len_th6; +}DPP_ETM_CGAVD_EQUAL_PKT_LEN_TH6_T; + +typedef struct dpp_etm_cgavd_equal_pkt_len0_t +{ + ZXIC_UINT32 equal_pkt_len0; +}DPP_ETM_CGAVD_EQUAL_PKT_LEN0_T; + +typedef struct dpp_etm_cgavd_equal_pkt_len1_t +{ + ZXIC_UINT32 equal_pkt_len1; +}DPP_ETM_CGAVD_EQUAL_PKT_LEN1_T; + +typedef struct dpp_etm_cgavd_equal_pkt_len2_t +{ + ZXIC_UINT32 equal_pkt_len2; +}DPP_ETM_CGAVD_EQUAL_PKT_LEN2_T; + +typedef struct dpp_etm_cgavd_equal_pkt_len3_t +{ + ZXIC_UINT32 equal_pkt_len3; +}DPP_ETM_CGAVD_EQUAL_PKT_LEN3_T; + +typedef struct dpp_etm_cgavd_equal_pkt_len4_t +{ + ZXIC_UINT32 equal_pkt_len4; +}DPP_ETM_CGAVD_EQUAL_PKT_LEN4_T; + +typedef struct dpp_etm_cgavd_equal_pkt_len5_t +{ + ZXIC_UINT32 equal_pkt_len5; +}DPP_ETM_CGAVD_EQUAL_PKT_LEN5_T; + +typedef struct dpp_etm_cgavd_equal_pkt_len6_t +{ + ZXIC_UINT32 equal_pkt_len6; +}DPP_ETM_CGAVD_EQUAL_PKT_LEN6_T; + +typedef struct dpp_etm_cgavd_equal_pkt_len7_t +{ + ZXIC_UINT32 equal_pkt_len7; +}DPP_ETM_CGAVD_EQUAL_PKT_LEN7_T; + +typedef struct dpp_etm_cgavd_flow_cpu_set_avg_len_t +{ + ZXIC_UINT32 flow_cpu_set_avg_len; +}DPP_ETM_CGAVD_FLOW_CPU_SET_AVG_LEN_T; + +typedef struct dpp_etm_cgavd_flow_cpu_set_q_len_t +{ + ZXIC_UINT32 flow_cpu_set_q_len; +}DPP_ETM_CGAVD_FLOW_CPU_SET_Q_LEN_T; + +typedef struct dpp_etm_cgavd_pp_cpu_set_avg_q_len_t +{ + ZXIC_UINT32 pp_cpu_set_avg_q_len; +}DPP_ETM_CGAVD_PP_CPU_SET_AVG_Q_LEN_T; + +typedef struct dpp_etm_cgavd_pp_cpu_set_q_len_t +{ + ZXIC_UINT32 pp_cpu_set_q_len; +}DPP_ETM_CGAVD_PP_CPU_SET_Q_LEN_T; + +typedef struct dpp_etm_cgavd_sys_cpu_set_avg_len_t +{ + ZXIC_UINT32 sys_cpu_set_avg_len; +}DPP_ETM_CGAVD_SYS_CPU_SET_AVG_LEN_T; + +typedef struct dpp_etm_cgavd_sys_cpu_set_q_len_t +{ + ZXIC_UINT32 sys_cpu_set_q_len; +}DPP_ETM_CGAVD_SYS_CPU_SET_Q_LEN_T; + +typedef struct dpp_etm_cgavd_pke_len_calc_sign_t +{ + ZXIC_UINT32 pke_len_calc_sign; +}DPP_ETM_CGAVD_PKE_LEN_CALC_SIGN_T; + +typedef struct dpp_etm_cgavd_rd_cpu_or_ram_t +{ + ZXIC_UINT32 cpu_sel_sys_q_len_en; + ZXIC_UINT32 cpu_sel_sys_avg_q_len_en; + ZXIC_UINT32 cpu_sel_pp_q_len_en; + ZXIC_UINT32 cpu_sel_pp_avg_q_len_en; + ZXIC_UINT32 cpu_sel_flow_q_len_en; + ZXIC_UINT32 cpu_sel_flow_avg_q_len_en; +}DPP_ETM_CGAVD_RD_CPU_OR_RAM_T; + +typedef struct dpp_etm_cgavd_q_len_update_disable_t +{ + ZXIC_UINT32 q_len_sys_update_en; + ZXIC_UINT32 q_len_pp_update_en; + ZXIC_UINT32 q_len_flow_update_en; +}DPP_ETM_CGAVD_Q_LEN_UPDATE_DISABLE_T; + +typedef struct dpp_etm_cgavd_cgavd_dp_sel_t +{ + ZXIC_UINT32 flow_dp_sel_high; + ZXIC_UINT32 flow_dp_sel_mid; + ZXIC_UINT32 flow_dp_sel_low; + ZXIC_UINT32 pp_dp_sel_high; + ZXIC_UINT32 pp_dp_sel_mid; + ZXIC_UINT32 pp_dp_sel_low; + ZXIC_UINT32 sys_dp_sel_high; + ZXIC_UINT32 sys_dp_sel_mid; + ZXIC_UINT32 sys_dp_sel_low; +}DPP_ETM_CGAVD_CGAVD_DP_SEL_T; + +typedef struct dpp_etm_cgavd_cgavd_sub_en_t +{ + ZXIC_UINT32 cgavd_sa_sub_en; + ZXIC_UINT32 cgavd_sys_sub_en; + ZXIC_UINT32 cgavd_pp_sub_en; + ZXIC_UINT32 cgavd_flow_sub_en; +}DPP_ETM_CGAVD_CGAVD_SUB_EN_T; + +typedef struct dpp_etm_cgavd_default_start_queue_t +{ + ZXIC_UINT32 default_start_queue; +}DPP_ETM_CGAVD_DEFAULT_START_QUEUE_T; + +typedef struct dpp_etm_cgavd_default_finish_queue_t +{ + ZXIC_UINT32 default_finish_queue; +}DPP_ETM_CGAVD_DEFAULT_FINISH_QUEUE_T; + +typedef struct dpp_etm_cgavd_protocol_start_queue_t +{ + ZXIC_UINT32 protocol_start_queue; +}DPP_ETM_CGAVD_PROTOCOL_START_QUEUE_T; + +typedef struct dpp_etm_cgavd_protocol_finish_queue_t +{ + ZXIC_UINT32 protocol_finish_queue; +}DPP_ETM_CGAVD_PROTOCOL_FINISH_QUEUE_T; + +typedef struct dpp_etm_cgavd_uniform_td_th_t +{ + ZXIC_UINT32 uniform_td_th; +}DPP_ETM_CGAVD_UNIFORM_TD_TH_T; + +typedef struct dpp_etm_cgavd_uniform_td_th_en_t +{ + ZXIC_UINT32 uniform_td_th_en; +}DPP_ETM_CGAVD_UNIFORM_TD_TH_EN_T; + +typedef struct dpp_etm_cgavd_cgavd_cfg_fc_t +{ + ZXIC_UINT32 cgavd_cfg_fc; +}DPP_ETM_CGAVD_CGAVD_CFG_FC_T; + +typedef struct dpp_etm_cgavd_cgavd_cfg_no_fc_t +{ + ZXIC_UINT32 cgavd_cfg_no_fc; +}DPP_ETM_CGAVD_CGAVD_CFG_NO_FC_T; + +typedef struct dpp_etm_cgavd_cgavd_force_imem_omem_t +{ + ZXIC_UINT32 imem_omem_force_en; + ZXIC_UINT32 choose_imem_omem; +}DPP_ETM_CGAVD_CGAVD_FORCE_IMEM_OMEM_T; + +typedef struct dpp_etm_cgavd_cgavd_sys_q_len_l_t +{ + ZXIC_UINT32 cgavd_sys_q_len_l; +}DPP_ETM_CGAVD_CGAVD_SYS_Q_LEN_L_T; + +typedef struct dpp_etm_cgavd_default_queue_en_t +{ + ZXIC_UINT32 default_queue_en; +}DPP_ETM_CGAVD_DEFAULT_QUEUE_EN_T; + +typedef struct dpp_etm_cgavd_protocol_queue_en_t +{ + ZXIC_UINT32 protocol_queue_en; +}DPP_ETM_CGAVD_PROTOCOL_QUEUE_EN_T; + +typedef struct dpp_etm_cgavd_cfg_tc_flowid_dat_t +{ + ZXIC_UINT32 cfg_tc_flowid_dat; +}DPP_ETM_CGAVD_CFG_TC_FLOWID_DAT_T; + +typedef struct dpp_etm_cgavd_flow_td_th_t +{ + ZXIC_UINT32 flow_td_th; +}DPP_ETM_CGAVD_FLOW_TD_TH_T; + +typedef struct dpp_etm_cgavd_flow_ca_mtd_t +{ + ZXIC_UINT32 flow_ca_mtd; +}DPP_ETM_CGAVD_FLOW_CA_MTD_T; + +typedef struct dpp_etm_cgavd_flow_dynamic_th_en_t +{ + ZXIC_UINT32 flow_dynamic_th_en; +}DPP_ETM_CGAVD_FLOW_DYNAMIC_TH_EN_T; + +typedef struct dpp_etm_cgavd_pp_num_t +{ + ZXIC_UINT32 pp_num; +}DPP_ETM_CGAVD_PP_NUM_T; + +typedef struct dpp_etm_cgavd_flow_q_len_t +{ + ZXIC_UINT32 flow_q_len; +}DPP_ETM_CGAVD_FLOW_Q_LEN_T; + +typedef struct dpp_etm_cgavd_flow_wred_grp_t +{ + ZXIC_UINT32 flow_wred_grp; +}DPP_ETM_CGAVD_FLOW_WRED_GRP_T; + +typedef struct dpp_etm_cgavd_flow_avg_q_len_t +{ + ZXIC_UINT32 flow_avg_q_len; +}DPP_ETM_CGAVD_FLOW_AVG_Q_LEN_T; + +typedef struct dpp_etm_cgavd_qos_sign_t +{ + ZXIC_UINT32 qos_sign_flow_cfg_din; +}DPP_ETM_CGAVD_QOS_SIGN_T; + +typedef struct dpp_etm_cgavd_q_pri_t +{ + ZXIC_UINT32 qpri_flow_cfg_din; +}DPP_ETM_CGAVD_Q_PRI_T; + +typedef struct dpp_etm_cgavd_odma_tm_itmd_rd_low_t +{ + ZXIC_UINT32 odma_tm_itmd_low; +}DPP_ETM_CGAVD_ODMA_TM_ITMD_RD_LOW_T; + +typedef struct dpp_etm_cgavd_odma_tm_itmd_rd_mid_t +{ + ZXIC_UINT32 odma_tm_itmd_mid; +}DPP_ETM_CGAVD_ODMA_TM_ITMD_RD_MID_T; + +typedef struct dpp_etm_cgavd_odma_tm_itmd_rd_high_t +{ + ZXIC_UINT32 odma_tm_itmd_high; +}DPP_ETM_CGAVD_ODMA_TM_ITMD_RD_HIGH_T; + +typedef struct dpp_etm_cgavd_cgavd_stat_pkt_len_t +{ + ZXIC_UINT32 expect_deq_pkt_len; + ZXIC_UINT32 expect_enq_pkt_len; +}DPP_ETM_CGAVD_CGAVD_STAT_PKT_LEN_T; + +typedef struct dpp_etm_cgavd_cgavd_stat_qnum_t +{ + ZXIC_UINT32 cgavd_unexcept_qnum; + ZXIC_UINT32 cgavd_except_qnum; +}DPP_ETM_CGAVD_CGAVD_STAT_QNUM_T; + +typedef struct dpp_etm_cgavd_cgavd_stat_dp_t +{ + ZXIC_UINT32 cgavd_stat_dp; +}DPP_ETM_CGAVD_CGAVD_STAT_DP_T; + +typedef struct dpp_etm_cgavd_flow_num0_t +{ + ZXIC_UINT32 flow_num0; +}DPP_ETM_CGAVD_FLOW_NUM0_T; + +typedef struct dpp_etm_cgavd_flow_num1_t +{ + ZXIC_UINT32 flow_num1; +}DPP_ETM_CGAVD_FLOW_NUM1_T; + +typedef struct dpp_etm_cgavd_flow_num2_t +{ + ZXIC_UINT32 flow_num2; +}DPP_ETM_CGAVD_FLOW_NUM2_T; + +typedef struct dpp_etm_cgavd_flow_num3_t +{ + ZXIC_UINT32 flow_num3; +}DPP_ETM_CGAVD_FLOW_NUM3_T; + +typedef struct dpp_etm_cgavd_flow_num4_t +{ + ZXIC_UINT32 flow_num4; +}DPP_ETM_CGAVD_FLOW_NUM4_T; + +typedef struct dpp_etm_cgavd_flow0_imem_cnt_t +{ + ZXIC_UINT32 flow0_imem_cnt; +}DPP_ETM_CGAVD_FLOW0_IMEM_CNT_T; + +typedef struct dpp_etm_cgavd_flow1_imem_cnt_t +{ + ZXIC_UINT32 flow1_imem_cnt; +}DPP_ETM_CGAVD_FLOW1_IMEM_CNT_T; + +typedef struct dpp_etm_cgavd_flow2_imem_cnt_t +{ + ZXIC_UINT32 flow2_imem_cnt; +}DPP_ETM_CGAVD_FLOW2_IMEM_CNT_T; + +typedef struct dpp_etm_cgavd_flow3_imem_cnt_t +{ + ZXIC_UINT32 flow3_imem_cnt; +}DPP_ETM_CGAVD_FLOW3_IMEM_CNT_T; + +typedef struct dpp_etm_cgavd_flow4_imem_cnt_t +{ + ZXIC_UINT32 flow4_imem_cnt; +}DPP_ETM_CGAVD_FLOW4_IMEM_CNT_T; + +typedef struct dpp_etm_cgavd_flow0_drop_cnt_t +{ + ZXIC_UINT32 flow0_drop_cnt; +}DPP_ETM_CGAVD_FLOW0_DROP_CNT_T; + +typedef struct dpp_etm_cgavd_flow1_drop_cnt_t +{ + ZXIC_UINT32 flow1_drop_cnt; +}DPP_ETM_CGAVD_FLOW1_DROP_CNT_T; + +typedef struct dpp_etm_cgavd_flow2_drop_cnt_t +{ + ZXIC_UINT32 flow2_drop_cnt; +}DPP_ETM_CGAVD_FLOW2_DROP_CNT_T; + +typedef struct dpp_etm_cgavd_flow3_drop_cnt_t +{ + ZXIC_UINT32 flow3_drop_cnt; +}DPP_ETM_CGAVD_FLOW3_DROP_CNT_T; + +typedef struct dpp_etm_cgavd_flow4_drop_cnt_t +{ + ZXIC_UINT32 flow4_drop_cnt; +}DPP_ETM_CGAVD_FLOW4_DROP_CNT_T; + +typedef struct dpp_etm_cgavd_fc_count_mode_t +{ + ZXIC_UINT32 fc_count_mode; +}DPP_ETM_CGAVD_FC_COUNT_MODE_T; + +typedef struct dpp_etm_cgavd_qmu_cgavd_fc_num_t +{ + ZXIC_UINT32 qmu_cgavd_fc_state; + ZXIC_UINT32 qmu_cgavd_fc_num; +}DPP_ETM_CGAVD_QMU_CGAVD_FC_NUM_T; + +typedef struct dpp_etm_cgavd_cgavd_odma_fc_num_t +{ + ZXIC_UINT32 cgavd_lif_fc_state; + ZXIC_UINT32 cgavd_lif_fc_num; +}DPP_ETM_CGAVD_CGAVD_ODMA_FC_NUM_T; + +typedef struct dpp_etm_cgavd_cfg_offset_t +{ + ZXIC_UINT32 cfg_offset; +}DPP_ETM_CGAVD_CFG_OFFSET_T; + +typedef struct dpp_etm_tmmu_tmmu_init_done_t +{ + ZXIC_UINT32 tmmu_init_done; +}DPP_ETM_TMMU_TMMU_INIT_DONE_T; + +typedef struct dpp_etm_tmmu_tmmu_int_mask_1_t +{ + ZXIC_UINT32 imem_enq_rd_fifo_full_mask; + ZXIC_UINT32 imem_enq_rd_fifo_overflow_mask; + ZXIC_UINT32 imem_enq_rd_fifo_underflow_mask; + ZXIC_UINT32 imem_enq_drop_fifo_full_mask; + ZXIC_UINT32 imem_enq_drop_fifo_overflow_mask; + ZXIC_UINT32 imem_enq_drop_fifo_underflow_mask; + ZXIC_UINT32 imem_deq_rd_fifo_full_mask; + ZXIC_UINT32 imem_deq_rd_fifo_overflow_mask; + ZXIC_UINT32 imem_deq_rd_fifo_underflow_mask; + ZXIC_UINT32 imem_deq_drop_fifo_full_mask; + ZXIC_UINT32 imem_deq_drop_fifo_overflow_mask; + ZXIC_UINT32 imem_deq_drop_fifo_underflow_mask; + ZXIC_UINT32 dma_data_fifo_full_mask; + ZXIC_UINT32 dma_data_fifo_overflow_mask; + ZXIC_UINT32 dma_data_fifo_underflow_mask; + ZXIC_UINT32 wr_cmd_fifo_full_mask; + ZXIC_UINT32 wr_cmd_fifo_overflow_mask; + ZXIC_UINT32 wr_cmd_fifo_underflow_mask; + ZXIC_UINT32 cached_pd_fifo_full_mask; + ZXIC_UINT32 cached_pd_fifo_overflow_mask; + ZXIC_UINT32 cached_pd_fifo_underflow_mask; + ZXIC_UINT32 emem_pd_fifo_full_mask; + ZXIC_UINT32 emem_pd_fifo_overflow_mask; + ZXIC_UINT32 emem_pd_fifo_underflow_mask; + ZXIC_UINT32 pd_order_fifo_full_mask; + ZXIC_UINT32 pd_order_fifo_overflow_mask; + ZXIC_UINT32 pd_order_fifo_underflow_mask; +}DPP_ETM_TMMU_TMMU_INT_MASK_1_T; + +typedef struct dpp_etm_tmmu_tmmu_int_mask_2_t +{ + ZXIC_UINT32 dma_data_fifo_parity_err_mask; + ZXIC_UINT32 imem_enq_rd_fifo_ecc_single_err_mask; + ZXIC_UINT32 imem_enq_rd_fifo_ecc_double_err_mask; + ZXIC_UINT32 imem_enq_drop_fifo_ecc_single_err_mask; + ZXIC_UINT32 imem_enq_drop_fifo_ecc_double_err_mask; + ZXIC_UINT32 imem_deq_rd_fifo_ecc_single_err_mask; + ZXIC_UINT32 imem_deq_rd_fifo_ecc_double_err_mask; + ZXIC_UINT32 imem_deq_drop_fifo_ecc_single_err_mask; + ZXIC_UINT32 imem_deq_drop_fifo_ecc_double_err_mask; + ZXIC_UINT32 wr_cmd_fifo_ecc_single_err_mask; + ZXIC_UINT32 wr_cmd_fifo_ecc_double_err_mask; + ZXIC_UINT32 pd_cache_ram_ecc_single_err_mask; + ZXIC_UINT32 pd_cache_ram_ecc_double_err_mask; + ZXIC_UINT32 cached_pd_fifo_ecc_single_err_mask; + ZXIC_UINT32 cached_pd_fifo_ecc_double_err_mask; + ZXIC_UINT32 emem_pd_fifo_ecc_single_err_mask; + ZXIC_UINT32 emem_pd_fifo_ecc_double_err_mask; +}DPP_ETM_TMMU_TMMU_INT_MASK_2_T; + +typedef struct dpp_etm_tmmu_cfgmt_tm_pure_imem_en_t +{ + ZXIC_UINT32 cfgmt_tm_pure_imem_en; +}DPP_ETM_TMMU_CFGMT_TM_PURE_IMEM_EN_T; + +typedef struct dpp_etm_tmmu_cfgmt_force_ddr_rdy_cfg_t +{ + ZXIC_UINT32 cfgmt_force_ddr_rdy_cfg; +}DPP_ETM_TMMU_CFGMT_FORCE_DDR_RDY_CFG_T; + +typedef struct dpp_etm_tmmu_pd_order_fifo_aful_th_t +{ + ZXIC_UINT32 pd_order_fifo_aful_th; +}DPP_ETM_TMMU_PD_ORDER_FIFO_AFUL_TH_T; + +typedef struct dpp_etm_tmmu_cached_pd_fifo_aful_th_t +{ + ZXIC_UINT32 cached_pd_fifo_aful_th; +}DPP_ETM_TMMU_CACHED_PD_FIFO_AFUL_TH_T; + +typedef struct dpp_etm_tmmu_wr_cmd_fifo_aful_th_t +{ + ZXIC_UINT32 wr_cmd_fifo_aful_th; +}DPP_ETM_TMMU_WR_CMD_FIFO_AFUL_TH_T; + +typedef struct dpp_etm_tmmu_imem_enq_rd_fifo_aful_th_t +{ + ZXIC_UINT32 imem_enq_rd_fifo_aful_th; +}DPP_ETM_TMMU_IMEM_ENQ_RD_FIFO_AFUL_TH_T; + +typedef struct dpp_etm_tmmu_imem_enq_drop_fifo_aful_th_t +{ + ZXIC_UINT32 imem_enq_drop_fifo_aful_th; +}DPP_ETM_TMMU_IMEM_ENQ_DROP_FIFO_AFUL_TH_T; + +typedef struct dpp_etm_tmmu_imem_deq_drop_fifo_aful_th_t +{ + ZXIC_UINT32 imem_deq_drop_fifo_aful_th; +}DPP_ETM_TMMU_IMEM_DEQ_DROP_FIFO_AFUL_TH_T; + +typedef struct dpp_etm_tmmu_imem_deq_rd_fifo_aful_th_t +{ + ZXIC_UINT32 imem_deq_rd_fifo_aful_th; +}DPP_ETM_TMMU_IMEM_DEQ_RD_FIFO_AFUL_TH_T; + +typedef struct dpp_etm_tmmu_tmmu_states_1_t +{ + ZXIC_UINT32 imem_enq_rd_fifo_full; + ZXIC_UINT32 imem_enq_rd_fifo_overflow; + ZXIC_UINT32 imem_enq_rd_fifo_underflow; + ZXIC_UINT32 imem_enq_drop_fifo_full; + ZXIC_UINT32 imem_enq_drop_fifo_overflow; + ZXIC_UINT32 imem_enq_drop_fifo_underflow; + ZXIC_UINT32 imem_deq_rd_fifo_full; + ZXIC_UINT32 imem_deq_rd_fifo_overflow; + ZXIC_UINT32 imem_deq_rd_fifo_underflow; + ZXIC_UINT32 imem_deq_drop_fifo_full; + ZXIC_UINT32 imem_deq_drop_fifo_overflow; + ZXIC_UINT32 imem_deq_drop_fifo_underflow; + ZXIC_UINT32 dma_data_fifo_full; + ZXIC_UINT32 dma_data_fifo_overflow; + ZXIC_UINT32 dma_data_fifo_underflow; + ZXIC_UINT32 wr_cmd_fifo_full; + ZXIC_UINT32 wr_cmd_fifo_overflow; + ZXIC_UINT32 wr_cmd_fifo_underflow; + ZXIC_UINT32 cached_pd_fifo_full; + ZXIC_UINT32 cached_pd_fifo_overflow; + ZXIC_UINT32 cached_pd_fifo_underflow; + ZXIC_UINT32 emem_pd_fifo_full; + ZXIC_UINT32 emem_pd_fifo_overflow; + ZXIC_UINT32 emem_pd_fifo_underflow; + ZXIC_UINT32 pd_order_fifo_full; + ZXIC_UINT32 pd_order_fifo_overflow; + ZXIC_UINT32 pd_order_fifo_underflow; +}DPP_ETM_TMMU_TMMU_STATES_1_T; + +typedef struct dpp_etm_tmmu_tmmu_states_2_t +{ + ZXIC_UINT32 dma_data_fifo_parity_err; + ZXIC_UINT32 imem_enq_rd_fifo_ecc_single_err; + ZXIC_UINT32 imem_enq_rd_fifo_ecc_double_err; + ZXIC_UINT32 imem_enq_drop_fifo_ecc_single_err; + ZXIC_UINT32 imem_enq_drop_fifo_ecc_double_err; + ZXIC_UINT32 imem_deq_rd_fifo_ecc_single_err; + ZXIC_UINT32 imem_deq_rd_fifo_ecc_double_err; + ZXIC_UINT32 imem_deq_drop_fifo_ecc_single_err; + ZXIC_UINT32 imem_deq_drop_fifo_ecc_double_err; + ZXIC_UINT32 wr_cmd_fifo_ecc_single_err; + ZXIC_UINT32 wr_cmd_fifo_ecc_double_err; + ZXIC_UINT32 pd_cache_ram_ecc_single_err; + ZXIC_UINT32 pd_cache_ram_ecc_double_err; + ZXIC_UINT32 cached_pd_fifo_ecc_single_err; + ZXIC_UINT32 cached_pd_fifo_ecc_double_err; + ZXIC_UINT32 emem_pd_fifo_ecc_single_err; + ZXIC_UINT32 emem_pd_fifo_ecc_double_err; +}DPP_ETM_TMMU_TMMU_STATES_2_T; + +typedef struct dpp_etm_shap_shap_ind_cmd_t +{ + ZXIC_UINT32 rd; + ZXIC_UINT32 mem_id; + ZXIC_UINT32 addr; +}DPP_ETM_SHAP_SHAP_IND_CMD_T; + +typedef struct dpp_etm_shap_shap_ind_sta_t +{ + ZXIC_UINT32 indirectaccessdone; +}DPP_ETM_SHAP_SHAP_IND_STA_T; + +typedef struct dpp_etm_shap_shap_ind_data0_t +{ + ZXIC_UINT32 indirectdata0; +}DPP_ETM_SHAP_SHAP_IND_DATA0_T; + +typedef struct dpp_etm_shap_shap_ind_data1_t +{ + ZXIC_UINT32 indirectdata1; +}DPP_ETM_SHAP_SHAP_IND_DATA1_T; + +typedef struct dpp_etm_shap_full_threshold_t +{ + ZXIC_UINT32 full_threshold; +}DPP_ETM_SHAP_FULL_THRESHOLD_T; + +typedef struct dpp_etm_shap_empty_threshold_t +{ + ZXIC_UINT32 empty_threshold; +}DPP_ETM_SHAP_EMPTY_THRESHOLD_T; + +typedef struct dpp_etm_shap_shap_sta_init_cfg_t +{ + ZXIC_UINT32 sta_ram_init_done; + ZXIC_UINT32 sta_ram_init_en; +}DPP_ETM_SHAP_SHAP_STA_INIT_CFG_T; + +typedef struct dpp_etm_shap_shap_cfg_init_cfg_t +{ + ZXIC_UINT32 cfg_ram_init_done; + ZXIC_UINT32 cfg_ram_init_en; +}DPP_ETM_SHAP_SHAP_CFG_INIT_CFG_T; + +typedef struct dpp_etm_shap_token_mode_switch_t +{ + ZXIC_UINT32 token_mode_switch; +}DPP_ETM_SHAP_TOKEN_MODE_SWITCH_T; + +typedef struct dpp_etm_shap_token_grain_t +{ + ZXIC_UINT32 token_grain; +}DPP_ETM_SHAP_TOKEN_GRAIN_T; + +typedef struct dpp_etm_shap_crd_grain_t +{ + ZXIC_UINT32 crd_grain; +}DPP_ETM_SHAP_CRD_GRAIN_T; + +typedef struct dpp_etm_shap_shap_stat_ctrl_t +{ + ZXIC_UINT32 shap_stat_ctrl; +}DPP_ETM_SHAP_SHAP_STAT_CTRL_T; + +typedef struct dpp_etm_shap_token_stat_id_t +{ + ZXIC_UINT32 token_stat_id; +}DPP_ETM_SHAP_TOKEN_STAT_ID_T; + +typedef struct dpp_etm_shap_token_stat_t +{ + ZXIC_UINT32 token_stat; +}DPP_ETM_SHAP_TOKEN_STAT_T; + +typedef struct dpp_etm_shap_shap_stat_clk_cnt_t +{ + ZXIC_UINT32 shap_stat_clk_cnt; +}DPP_ETM_SHAP_SHAP_STAT_CLK_CNT_T; + +typedef struct dpp_etm_shap_shap_bucket_map_tbl_t +{ + ZXIC_UINT32 shap_map; +}DPP_ETM_SHAP_SHAP_BUCKET_MAP_TBL_T; + +typedef struct dpp_etm_shap_bkt_para_tbl_t +{ + ZXIC_UINT32 bucket_depth; + ZXIC_UINT32 bucket_rate; +}DPP_ETM_SHAP_BKT_PARA_TBL_T; + +typedef struct dpp_etm_crdt_credit_en_t +{ + ZXIC_UINT32 credit_en; +}DPP_ETM_CRDT_CREDIT_EN_T; + +typedef struct dpp_etm_crdt_crt_inter1_t +{ + ZXIC_UINT32 crd_inter1; +}DPP_ETM_CRDT_CRT_INTER1_T; + +typedef struct dpp_etm_crdt_db_token_t +{ + ZXIC_UINT32 db_token; +}DPP_ETM_CRDT_DB_TOKEN_T; + +typedef struct dpp_etm_crdt_crs_flt_cfg_t +{ + ZXIC_UINT32 crs_flt_cfg; +}DPP_ETM_CRDT_CRS_FLT_CFG_T; + +typedef struct dpp_etm_crdt_th_sp_t +{ + ZXIC_UINT32 th_sp; +}DPP_ETM_CRDT_TH_SP_T; + +typedef struct dpp_etm_crdt_th_wfq_fq_t +{ + ZXIC_UINT32 th_fq; + ZXIC_UINT32 th_wfq; +}DPP_ETM_CRDT_TH_WFQ_FQ_T; + +typedef struct dpp_etm_crdt_th_wfq2_fq2_t +{ + ZXIC_UINT32 th_fq2; + ZXIC_UINT32 th_wfq2; +}DPP_ETM_CRDT_TH_WFQ2_FQ2_T; + +typedef struct dpp_etm_crdt_th_wfq4_fq4_t +{ + ZXIC_UINT32 th_fq4; + ZXIC_UINT32 th_wfq4; +}DPP_ETM_CRDT_TH_WFQ4_FQ4_T; + +typedef struct dpp_etm_crdt_cfg_state_t +{ + ZXIC_UINT32 cfg_state; +}DPP_ETM_CRDT_CFG_STATE_T; + +typedef struct dpp_etm_crdt_crdt_ind_cmd_t +{ + ZXIC_UINT32 rd; + ZXIC_UINT32 mem_id; + ZXIC_UINT32 addr; +}DPP_ETM_CRDT_CRDT_IND_CMD_T; + +typedef struct dpp_etm_crdt_crdt_ind_sta_t +{ + ZXIC_UINT32 indirectaccessdone; +}DPP_ETM_CRDT_CRDT_IND_STA_T; + +typedef struct dpp_etm_crdt_crdt_ind_data0_t +{ + ZXIC_UINT32 indirectdata0; +}DPP_ETM_CRDT_CRDT_IND_DATA0_T; + +typedef struct dpp_etm_crdt_crdt_ind_data1_t +{ + ZXIC_UINT32 indirectdata1; +}DPP_ETM_CRDT_CRDT_IND_DATA1_T; + +typedef struct dpp_etm_crdt_crdt_state_t +{ + ZXIC_UINT32 crdt_int; + ZXIC_UINT32 crdt_rdy; +}DPP_ETM_CRDT_CRDT_STATE_T; + +typedef struct dpp_etm_crdt_stat_que_id_0_t +{ + ZXIC_UINT32 stat_que_id_0; +}DPP_ETM_CRDT_STAT_QUE_ID_0_T; + +typedef struct dpp_etm_crdt_stat_que_id_1_t +{ + ZXIC_UINT32 stat_que_id_1; +}DPP_ETM_CRDT_STAT_QUE_ID_1_T; + +typedef struct dpp_etm_crdt_stat_que_id_2_t +{ + ZXIC_UINT32 stat_que_id_2; +}DPP_ETM_CRDT_STAT_QUE_ID_2_T; + +typedef struct dpp_etm_crdt_stat_que_id_3_t +{ + ZXIC_UINT32 stat_que_id_3; +}DPP_ETM_CRDT_STAT_QUE_ID_3_T; + +typedef struct dpp_etm_crdt_stat_que_id_4_t +{ + ZXIC_UINT32 stat_que_id_4; +}DPP_ETM_CRDT_STAT_QUE_ID_4_T; + +typedef struct dpp_etm_crdt_stat_que_id_5_t +{ + ZXIC_UINT32 stat_que_id_5; +}DPP_ETM_CRDT_STAT_QUE_ID_5_T; + +typedef struct dpp_etm_crdt_stat_que_id_6_t +{ + ZXIC_UINT32 stat_que_id_6; +}DPP_ETM_CRDT_STAT_QUE_ID_6_T; + +typedef struct dpp_etm_crdt_stat_que_id_7_t +{ + ZXIC_UINT32 stat_que_id_7; +}DPP_ETM_CRDT_STAT_QUE_ID_7_T; + +typedef struct dpp_etm_crdt_stat_que_id_8_t +{ + ZXIC_UINT32 stat_que_id_8; +}DPP_ETM_CRDT_STAT_QUE_ID_8_T; + +typedef struct dpp_etm_crdt_stat_que_id_9_t +{ + ZXIC_UINT32 stat_que_id_9; +}DPP_ETM_CRDT_STAT_QUE_ID_9_T; + +typedef struct dpp_etm_crdt_stat_que_id_10_t +{ + ZXIC_UINT32 stat_que_id_10; +}DPP_ETM_CRDT_STAT_QUE_ID_10_T; + +typedef struct dpp_etm_crdt_stat_que_id_11_t +{ + ZXIC_UINT32 stat_que_id_11; +}DPP_ETM_CRDT_STAT_QUE_ID_11_T; + +typedef struct dpp_etm_crdt_stat_que_id_12_t +{ + ZXIC_UINT32 stat_que_id_12; +}DPP_ETM_CRDT_STAT_QUE_ID_12_T; + +typedef struct dpp_etm_crdt_stat_que_id_13_t +{ + ZXIC_UINT32 stat_que_id_13; +}DPP_ETM_CRDT_STAT_QUE_ID_13_T; + +typedef struct dpp_etm_crdt_stat_que_id_14_t +{ + ZXIC_UINT32 stat_que_id_14; +}DPP_ETM_CRDT_STAT_QUE_ID_14_T; + +typedef struct dpp_etm_crdt_stat_que_id_15_t +{ + ZXIC_UINT32 stat_que_id_15; +}DPP_ETM_CRDT_STAT_QUE_ID_15_T; + +typedef struct dpp_etm_crdt_stat_que_credit_t +{ + ZXIC_UINT32 stat_que_credit_cnt; +}DPP_ETM_CRDT_STAT_QUE_CREDIT_T; + +typedef struct dpp_etm_crdt_crdt_cfg_ram_init_t +{ + ZXIC_UINT32 cfg_ram_init_done; + ZXIC_UINT32 cfg_ram_init_en; +}DPP_ETM_CRDT_CRDT_CFG_RAM_INIT_T; + +typedef struct dpp_etm_crdt_crdt_sta_ram_init_t +{ + ZXIC_UINT32 sta_ram_init_done; + ZXIC_UINT32 sta_ram_init_en; +}DPP_ETM_CRDT_CRDT_STA_RAM_INIT_T; + +typedef struct dpp_etm_crdt_crs_que_id_t +{ + ZXIC_UINT32 crs_que_id; +}DPP_ETM_CRDT_CRS_QUE_ID_T; + +typedef struct dpp_etm_crdt_qmu_crs_end_state_t +{ + ZXIC_UINT32 qmu_crs_end_state; +}DPP_ETM_CRDT_QMU_CRS_END_STATE_T; + +typedef struct dpp_etm_crdt_shap_rdy_t +{ + ZXIC_UINT32 shap_rdy; +}DPP_ETM_CRDT_SHAP_RDY_T; + +typedef struct dpp_etm_crdt_shap_int_reg_t +{ + ZXIC_UINT32 pp_c_token_min_int; +}DPP_ETM_CRDT_SHAP_INT_REG_T; + +typedef struct dpp_etm_crdt_shap_int_mask_reg_t +{ + ZXIC_UINT32 pp_c_token_min_int_mask; +}DPP_ETM_CRDT_SHAP_INT_MASK_REG_T; + +typedef struct dpp_etm_crdt_token_state_almost_empty_th_t +{ + ZXIC_UINT32 token_state_almost_empty_th; +}DPP_ETM_CRDT_TOKEN_STATE_ALMOST_EMPTY_TH_T; + +typedef struct dpp_etm_crdt_token_state_empty_th_t +{ + ZXIC_UINT32 token_state_empty_th; +}DPP_ETM_CRDT_TOKEN_STATE_EMPTY_TH_T; + +typedef struct dpp_etm_crdt_full_th_t +{ + ZXIC_UINT32 token_state_full_th; +}DPP_ETM_CRDT_FULL_TH_T; + +typedef struct dpp_etm_crdt_pp_c_level_shap_en_t +{ + ZXIC_UINT32 pp_c_level_shap_en; +}DPP_ETM_CRDT_PP_C_LEVEL_SHAP_EN_T; + +typedef struct dpp_etm_crdt_enq_token_th_t +{ + ZXIC_UINT32 enq_token_th; +}DPP_ETM_CRDT_ENQ_TOKEN_TH_T; + +typedef struct dpp_etm_crdt_pp_tokenq_level1_qstate_weight_cir_t +{ + ZXIC_UINT32 pp_pp_q_state_cir; + ZXIC_UINT32 pp_pp_q_weight_wfq_l1_cir; +}DPP_ETM_CRDT_PP_TOKENQ_LEVEL1_QSTATE_WEIGHT_CIR_T; + +typedef struct dpp_etm_crdt_pp_idle_weight_level1_cir_t +{ + ZXIC_UINT32 pp_idle_q_weight_wfq_l1_cir; +}DPP_ETM_CRDT_PP_IDLE_WEIGHT_LEVEL1_CIR_T; + +typedef struct dpp_etm_crdt_rci_grade_th_0_cfg_t +{ + ZXIC_UINT32 rci_grade_th_0_cfg; +}DPP_ETM_CRDT_RCI_GRADE_TH_0_CFG_T; + +typedef struct dpp_etm_crdt_rci_grade_th_1_cfg_t +{ + ZXIC_UINT32 rci_grade_th_1_cfg; +}DPP_ETM_CRDT_RCI_GRADE_TH_1_CFG_T; + +typedef struct dpp_etm_crdt_rci_grade_th_2_cfg_t +{ + ZXIC_UINT32 rci_grade_th_2_cfg; +}DPP_ETM_CRDT_RCI_GRADE_TH_2_CFG_T; + +typedef struct dpp_etm_crdt_rci_grade_th_3_cfg_t +{ + ZXIC_UINT32 rci_grade_th_3_cfg; +}DPP_ETM_CRDT_RCI_GRADE_TH_3_CFG_T; + +typedef struct dpp_etm_crdt_rci_grade_th_4_cfg_t +{ + ZXIC_UINT32 rci_grade_th_4_cfg; +}DPP_ETM_CRDT_RCI_GRADE_TH_4_CFG_T; + +typedef struct dpp_etm_crdt_rci_grade_th_5_cfg_t +{ + ZXIC_UINT32 rci_grade_th_5_cfg; +}DPP_ETM_CRDT_RCI_GRADE_TH_5_CFG_T; + +typedef struct dpp_etm_crdt_rci_grade_th_6_cfg_t +{ + ZXIC_UINT32 rci_grade_th_6_cfg; +}DPP_ETM_CRDT_RCI_GRADE_TH_6_CFG_T; + +typedef struct dpp_etm_crdt_flow_del_cmd_t +{ + ZXIC_UINT32 flow_del_busy; + ZXIC_UINT32 flow_alt_cmd; + ZXIC_UINT32 flow_alt_ind; +}DPP_ETM_CRDT_FLOW_DEL_CMD_T; + +typedef struct dpp_etm_crdt_cnt_clr_t +{ + ZXIC_UINT32 cnt_clr; +}DPP_ETM_CRDT_CNT_CLR_T; + +typedef struct dpp_etm_crdt_crdt_int_bus_t +{ + ZXIC_UINT32 ldstr_fifo15_ovf_int; + ZXIC_UINT32 ldstr_fifo14_ovf_int; + ZXIC_UINT32 ldstr_fifo13_ovf_int; + ZXIC_UINT32 ldstr_fifo12_ovf_int; + ZXIC_UINT32 ldstr_fifo11_ovf_int; + ZXIC_UINT32 ldstr_fifo10_ovf_int; + ZXIC_UINT32 ldstr_fifo9_ovf_int; + ZXIC_UINT32 ldstr_fifo8_ovf_int; + ZXIC_UINT32 ldstr_fifo7_ovf_int; + ZXIC_UINT32 ldstr_fifo6_ovf_int; + ZXIC_UINT32 ldstr_fifo5_ovf_int; + ZXIC_UINT32 ldstr_fifo4_ovf_int; + ZXIC_UINT32 ldstr_fifo3_ovf_int; + ZXIC_UINT32 ldstr_fifo2_ovf_int; + ZXIC_UINT32 ldstr_fifo1_ovf_int; + ZXIC_UINT32 ldstr_fifo0_ovf_int; + ZXIC_UINT32 cfg_del_err_int; + ZXIC_UINT32 flwin_secrs_fifo_ovf_int; + ZXIC_UINT32 flwin_voqcrs_fifo_ovf_int; +}DPP_ETM_CRDT_CRDT_INT_BUS_T; + +typedef struct dpp_etm_crdt_crdt_int_mask_t +{ + ZXIC_UINT32 crdt_int_mask; +}DPP_ETM_CRDT_CRDT_INT_MASK_T; + +typedef struct dpp_etm_crdt_cfg_weight_together_t +{ + ZXIC_UINT32 cfg_weight_together; +}DPP_ETM_CRDT_CFG_WEIGHT_TOGETHER_T; + +typedef struct dpp_etm_crdt_weight_t +{ + ZXIC_UINT32 c_weight; + ZXIC_UINT32 e_weight; +}DPP_ETM_CRDT_WEIGHT_T; + +typedef struct dpp_etm_crdt_dev_sp_state_t +{ + ZXIC_UINT32 dev_sp_state; +}DPP_ETM_CRDT_DEV_SP_STATE_T; + +typedef struct dpp_etm_crdt_dev_crs_t +{ + ZXIC_UINT32 dev_crs; +}DPP_ETM_CRDT_DEV_CRS_T; + +typedef struct dpp_etm_crdt_congest_token_disable_31_0_t +{ + ZXIC_UINT32 congest_token_disable_31_0; +}DPP_ETM_CRDT_CONGEST_TOKEN_DISABLE_31_0_T; + +typedef struct dpp_etm_crdt_congest_token_disable_63_32_t +{ + ZXIC_UINT32 congest_token_disable_63_32; +}DPP_ETM_CRDT_CONGEST_TOKEN_DISABLE_63_32_T; + +typedef struct dpp_etm_crdt_crdt_interval_en_cfg_t +{ + ZXIC_UINT32 crdt_interval_en; +}DPP_ETM_CRDT_CRDT_INTERVAL_EN_CFG_T; + +typedef struct dpp_etm_crdt_q_token_staue_cfg_t +{ + ZXIC_UINT32 test_token_q_id; +}DPP_ETM_CRDT_Q_TOKEN_STAUE_CFG_T; + +typedef struct dpp_etm_crdt_q_token_dist_cnt_t +{ + ZXIC_UINT32 q_token_dist_counter; +}DPP_ETM_CRDT_Q_TOKEN_DIST_CNT_T; + +typedef struct dpp_etm_crdt_q_token_dec_cnt_t +{ + ZXIC_UINT32 q_token_dec_counter; +}DPP_ETM_CRDT_Q_TOKEN_DEC_CNT_T; + +typedef struct dpp_etm_crdt_pp_weight_ram_t +{ + ZXIC_UINT32 pp_c_weight; +}DPP_ETM_CRDT_PP_WEIGHT_RAM_T; + +typedef struct dpp_etm_crdt_pp_cbs_shape_en_ram_t +{ + ZXIC_UINT32 pp_cbs; + ZXIC_UINT32 pp_c_shap_en; +}DPP_ETM_CRDT_PP_CBS_SHAPE_EN_RAM_T; + +typedef struct dpp_etm_crdt_pp_next_pc_q_state_ram_t +{ + ZXIC_UINT32 pp_next_pc; + ZXIC_UINT32 pp_token_num; + ZXIC_UINT32 pp_q_state; +}DPP_ETM_CRDT_PP_NEXT_PC_Q_STATE_RAM_T; + +typedef struct dpp_etm_crdt_dev_interval_t +{ + ZXIC_UINT32 dev_interval; +}DPP_ETM_CRDT_DEV_INTERVAL_T; + +typedef struct dpp_etm_crdt_dev_wfq_cnt_t +{ + ZXIC_UINT32 dev_wfq_cnt; +}DPP_ETM_CRDT_DEV_WFQ_CNT_T; + +typedef struct dpp_etm_crdt_dev_wfq_state_t +{ + ZXIC_UINT32 dev_wfq_state; +}DPP_ETM_CRDT_DEV_WFQ_STATE_T; + +typedef struct dpp_etm_crdt_dev_active_head_ptr_t +{ + ZXIC_UINT32 dev_active_head_ptr; +}DPP_ETM_CRDT_DEV_ACTIVE_HEAD_PTR_T; + +typedef struct dpp_etm_crdt_dev_active_tail_ptr_t +{ + ZXIC_UINT32 dev_active_tail_ptr; +}DPP_ETM_CRDT_DEV_ACTIVE_TAIL_PTR_T; + +typedef struct dpp_etm_crdt_dev_unactive_head_ptr_t +{ + ZXIC_UINT32 dev_unactive_head_ptr; +}DPP_ETM_CRDT_DEV_UNACTIVE_HEAD_PTR_T; + +typedef struct dpp_etm_crdt_dev_unactive_tail_ptr_t +{ + ZXIC_UINT32 dev_unactive_tail_ptr; +}DPP_ETM_CRDT_DEV_UNACTIVE_TAIL_PTR_T; + +typedef struct dpp_etm_crdt_pp_weight_t +{ + ZXIC_UINT32 pp_weight; +}DPP_ETM_CRDT_PP_WEIGHT_T; + +typedef struct dpp_etm_crdt_pp_que_state_t +{ + ZXIC_UINT32 pp_enque_flag; + ZXIC_UINT32 pp_cir; + ZXIC_UINT32 pp_congest_cir; + ZXIC_UINT32 pp_crs; + ZXIC_UINT32 dev_sp; +}DPP_ETM_CRDT_PP_QUE_STATE_T; + +typedef struct dpp_etm_crdt_pp_next_ptr_t +{ + ZXIC_UINT32 pp_next_ptr; +}DPP_ETM_CRDT_PP_NEXT_PTR_T; + +typedef struct dpp_etm_crdt_pp_cfg_t +{ + ZXIC_UINT32 pp_cfg; +}DPP_ETM_CRDT_PP_CFG_T; + +typedef struct dpp_etm_crdt_pp_up_ptr_t +{ + ZXIC_UINT32 pp_up_ptr; +}DPP_ETM_CRDT_PP_UP_PTR_T; + +typedef struct dpp_etm_crdt_credit_drop_num_t +{ + ZXIC_UINT32 credit_drop_num; +}DPP_ETM_CRDT_CREDIT_DROP_NUM_T; + +typedef struct dpp_etm_crdt_se_id_lv0_t +{ + ZXIC_UINT32 se_id_out_lv0; +}DPP_ETM_CRDT_SE_ID_LV0_T; + +typedef struct dpp_etm_crdt_se_id_lv1_t +{ + ZXIC_UINT32 se_id_out_lv1; +}DPP_ETM_CRDT_SE_ID_LV1_T; + +typedef struct dpp_etm_crdt_se_id_lv2_t +{ + ZXIC_UINT32 se_id_out_lv2; +}DPP_ETM_CRDT_SE_ID_LV2_T; + +typedef struct dpp_etm_crdt_se_id_lv3_t +{ + ZXIC_UINT32 se_id_out_lv3; +}DPP_ETM_CRDT_SE_ID_LV3_T; + +typedef struct dpp_etm_crdt_se_id_lv4_t +{ + ZXIC_UINT32 se_id_out_lv4; +}DPP_ETM_CRDT_SE_ID_LV4_T; + +typedef struct dpp_etm_crdt_que_id_t +{ + ZXIC_UINT32 que_id_out; +}DPP_ETM_CRDT_QUE_ID_T; + +typedef struct dpp_etm_crdt_se_info_lv0_t +{ + ZXIC_UINT32 se_shape_lv0; + ZXIC_UINT32 se_ins_out_lv0; + ZXIC_UINT32 se_state_out_lv0; + ZXIC_UINT32 se_new_state_out_lv0; +}DPP_ETM_CRDT_SE_INFO_LV0_T; + +typedef struct dpp_etm_crdt_se_info_lv1_t +{ + ZXIC_UINT32 se_shape_lv1; + ZXIC_UINT32 se_ins_out_lv1; + ZXIC_UINT32 se_state_out_lv1; + ZXIC_UINT32 se_new_state_out_lv1; +}DPP_ETM_CRDT_SE_INFO_LV1_T; + +typedef struct dpp_etm_crdt_se_info_lv2_t +{ + ZXIC_UINT32 se_shape_lv2; + ZXIC_UINT32 se_ins_out_lv2; + ZXIC_UINT32 se_state_out_lv2; + ZXIC_UINT32 se_new_state_out_lv2; +}DPP_ETM_CRDT_SE_INFO_LV2_T; + +typedef struct dpp_etm_crdt_se_info_lv3_t +{ + ZXIC_UINT32 se_shape_lv3; + ZXIC_UINT32 se_ins_out_lv3; + ZXIC_UINT32 se_state_out_lv3; + ZXIC_UINT32 se_new_state_out_lv3; +}DPP_ETM_CRDT_SE_INFO_LV3_T; + +typedef struct dpp_etm_crdt_se_info_lv4_t +{ + ZXIC_UINT32 se_shape_lv4; + ZXIC_UINT32 se_ins_out_lv4; + ZXIC_UINT32 se_state_out_lv4; + ZXIC_UINT32 se_new_state_out_lv4; +}DPP_ETM_CRDT_SE_INFO_LV4_T; + +typedef struct dpp_etm_crdt_que_state_t +{ + ZXIC_UINT32 que_state_out; +}DPP_ETM_CRDT_QUE_STATE_T; + +typedef struct dpp_etm_crdt_eir_off_in_advance_t +{ + ZXIC_UINT32 eir_crs_filter; +}DPP_ETM_CRDT_EIR_OFF_IN_ADVANCE_T; + +typedef struct dpp_etm_crdt_double_level_shap_prevent_t +{ + ZXIC_UINT32 double_level_shap_prevent; +}DPP_ETM_CRDT_DOUBLE_LEVEL_SHAP_PREVENT_T; + +typedef struct dpp_etm_crdt_add_store_cycle_t +{ + ZXIC_UINT32 add_store_cycle; +}DPP_ETM_CRDT_ADD_STORE_CYCLE_T; + +typedef struct dpp_etm_crdt_tflag2_wr_flag_sum_t +{ + ZXIC_UINT32 tflag2_wr_flag_sum; +}DPP_ETM_CRDT_TFLAG2_WR_FLAG_SUM_T; + +typedef struct dpp_etm_crdt_flowque_para_tbl_t +{ + ZXIC_UINT32 flowque_link; + ZXIC_UINT32 flowque_w; + ZXIC_UINT32 flowque_pri; +}DPP_ETM_CRDT_FLOWQUE_PARA_TBL_T; + +typedef struct dpp_etm_crdt_se_para_tbl_t +{ + ZXIC_UINT32 se_insw; + ZXIC_UINT32 se_link; + ZXIC_UINT32 cp_token_en; + ZXIC_UINT32 se_w; + ZXIC_UINT32 se_pri; +}DPP_ETM_CRDT_SE_PARA_TBL_T; + +typedef struct dpp_etm_crdt_flowque_ins_tbl_t +{ + ZXIC_UINT32 flowque_ins; +}DPP_ETM_CRDT_FLOWQUE_INS_TBL_T; + +typedef struct dpp_etm_crdt_se_ins_tbl_t +{ + ZXIC_UINT32 se_ins_flag; + ZXIC_UINT32 se_ins_priority; +}DPP_ETM_CRDT_SE_INS_TBL_T; + +typedef struct dpp_etm_crdt_eir_crs_filter_tbl_t +{ + ZXIC_UINT32 eir_crs_filter; +}DPP_ETM_CRDT_EIR_CRS_FILTER_TBL_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_cfg_done_t +{ + ZXIC_UINT32 qcfg_qlist_cfg_done; +}DPP_ETM_QMU_QCFG_QLIST_CFG_DONE_T; + +typedef struct dpp_etm_qmu_qcfg_qsch_credit_value_t +{ + ZXIC_UINT32 qcfg_qsch_credit_value; +}DPP_ETM_QMU_QCFG_QSCH_CREDIT_VALUE_T; + +typedef struct dpp_etm_qmu_qcfg_qsch_crbal_init_value_t +{ + ZXIC_UINT32 qcfg_qsch_crbal_init_value; +}DPP_ETM_QMU_QCFG_QSCH_CRBAL_INIT_VALUE_T; + +typedef struct dpp_etm_qmu_qcfg_qsch_crbal_init_mask_t +{ + ZXIC_UINT32 qcfg_qsch_crbal_init_mask; +}DPP_ETM_QMU_QCFG_QSCH_CRBAL_INIT_MASK_T; + +typedef struct dpp_etm_qmu_cmdsch_rd_cmd_aful_th_t +{ + ZXIC_UINT32 cmdsch_rd_cmd_aful_th; +}DPP_ETM_QMU_CMDSCH_RD_CMD_AFUL_TH_T; + +typedef struct dpp_etm_qmu_cfg_port_fc_interval_t +{ + ZXIC_UINT32 cfg_port_fc_interval; +}DPP_ETM_QMU_CFG_PORT_FC_INTERVAL_T; + +typedef struct dpp_etm_qmu_qcfg_csch_aged_cfg_t +{ + ZXIC_UINT32 qcfg_csch_aged_cfg; +}DPP_ETM_QMU_QCFG_CSCH_AGED_CFG_T; + +typedef struct dpp_etm_qmu_qcfg_csch_aged_scan_time_t +{ + ZXIC_UINT32 qcfg_csch_aged_scan_time; +}DPP_ETM_QMU_QCFG_CSCH_AGED_SCAN_TIME_T; + +typedef struct dpp_etm_qmu_qcfg_qmu_qlist_state_query_t +{ + ZXIC_UINT32 pkt_age_req_fifo_afull; + ZXIC_UINT32 rd_release_fwft_afull; + ZXIC_UINT32 drop_imem_fwft_afull; + ZXIC_UINT32 pkt_age_req_fifo_empty; + ZXIC_UINT32 rd_release_fwft_empty; + ZXIC_UINT32 drop_imem_fwft_empty; + ZXIC_UINT32 mmu_qmu_sop_rd_rdy; + ZXIC_UINT32 big_fifo_empty; + ZXIC_UINT32 qmu_mmu_rd_release_rdy; + ZXIC_UINT32 xsw_qmu_crs_rdy; + ZXIC_UINT32 mmu_qmu_rdy; + ZXIC_UINT32 mmu_ql_wr_rdy; + ZXIC_UINT32 mmu_ql_rd_rdy; + ZXIC_UINT32 csw_ql_rdy; + ZXIC_UINT32 ql_init_done; + ZXIC_UINT32 free_addr_ready; + ZXIC_UINT32 bank_group_afull; + ZXIC_UINT32 pds_fwft_empty; + ZXIC_UINT32 enq_rpt_fwft_afull; +}DPP_ETM_QMU_QCFG_QMU_QLIST_STATE_QUERY_T; + +typedef struct dpp_etm_qmu_cfgmt_qsch_crbal_drop_en_t +{ + ZXIC_UINT32 cfgmt_qsch_all_crbal_drop_en; + ZXIC_UINT32 cfgmt_qsch_crbal_drop_en; +}DPP_ETM_QMU_CFGMT_QSCH_CRBAL_DROP_EN_T; + +typedef struct dpp_etm_qmu_cfgmt_wlist_qnum_fifo_aful_th_t +{ + ZXIC_UINT32 cfgmt_wlist_qnum_fifo_aful_th; +}DPP_ETM_QMU_CFGMT_WLIST_QNUM_FIFO_AFUL_TH_T; + +typedef struct dpp_etm_qmu_qcfg_csw_pkt_blk_mode_t +{ + ZXIC_UINT32 qcfg_csw_pkt_blk_mode; +}DPP_ETM_QMU_QCFG_CSW_PKT_BLK_MODE_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_ram_init_cancel_t +{ + ZXIC_UINT32 qcfg_qlist_ram_init_cancel; +}DPP_ETM_QMU_QCFG_QLIST_RAM_INIT_CANCEL_T; + +typedef struct dpp_etm_qmu_qcfg_qsch_crbal_transfer_mode_t +{ + ZXIC_UINT32 qcfg_qsch_crbal_transfer_mode; + ZXIC_UINT32 qcfg_qsch_crbal_transfer_value; +}DPP_ETM_QMU_QCFG_QSCH_CRBAL_TRANSFER_MODE_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_qclr_interval_t +{ + ZXIC_UINT32 qcfg_qlist_qclr_interval; +}DPP_ETM_QMU_QCFG_QLIST_QCLR_INTERVAL_T; + +typedef struct dpp_etm_qmu_qcfg_qsch_qclr_rate_t +{ + ZXIC_UINT32 qcfg_qsch_qclr_rate; +}DPP_ETM_QMU_QCFG_QSCH_QCLR_RATE_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_ddr_random_t +{ + ZXIC_UINT32 qcfg_qlist_ddr_random; +}DPP_ETM_QMU_QCFG_QLIST_DDR_RANDOM_T; + +typedef struct dpp_etm_qmu_cfgmt_qlist_pds_fifo_afull_th_t +{ + ZXIC_UINT32 cfgmt_qlist_pds_fifo_afull_th; +}DPP_ETM_QMU_CFGMT_QLIST_PDS_FIFO_AFULL_TH_T; + +typedef struct dpp_etm_qmu_cfgmt_sop_cmd_fifo_afull_th_t +{ + ZXIC_UINT32 cfgmt_sop_cmd_fifo_afull_th; +}DPP_ETM_QMU_CFGMT_SOP_CMD_FIFO_AFULL_TH_T; + +typedef struct dpp_etm_qmu_cfgmt_non_sop_cmd_fifo_afull_th_t +{ + ZXIC_UINT32 cfgmt_non_sop_cmd_fifo_afull_th; +}DPP_ETM_QMU_CFGMT_NON_SOP_CMD_FIFO_AFULL_TH_T; + +typedef struct dpp_etm_qmu_cfgmt_mmu_data_fifo_afull_th_t +{ + ZXIC_UINT32 cfgmt_mmu_data_fifo_afull_th; +}DPP_ETM_QMU_CFGMT_MMU_DATA_FIFO_AFULL_TH_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_bank_ept_th_t +{ + ZXIC_UINT32 qcfg_qlist_bank_ept_th; +}DPP_ETM_QMU_QCFG_QLIST_BANK_EPT_TH_T; + +typedef struct dpp_etm_qmu_random_bypass_en_t +{ + ZXIC_UINT32 random_bypass_en; +}DPP_ETM_QMU_RANDOM_BYPASS_EN_T; + +typedef struct dpp_etm_qmu_cfgmt_crs_spd_bypass_t +{ + ZXIC_UINT32 cfgmt_crs_spd_bypass; +}DPP_ETM_QMU_CFGMT_CRS_SPD_BYPASS_T; + +typedef struct dpp_etm_qmu_cfgmt_crs_interval_t +{ + ZXIC_UINT32 cfgmt_crs_interval; +}DPP_ETM_QMU_CFGMT_CRS_INTERVAL_T; + +typedef struct dpp_etm_qmu_cfg_qsch_auto_credit_control_en_t +{ + ZXIC_UINT32 cfg_qsch_auto_credit_control_en; +}DPP_ETM_QMU_CFG_QSCH_AUTO_CREDIT_CONTROL_EN_T; + +typedef struct dpp_etm_qmu_cfg_qsch_autocrfrstque_t +{ + ZXIC_UINT32 cfg_qsch_autocrfrstque; +}DPP_ETM_QMU_CFG_QSCH_AUTOCRFRSTQUE_T; + +typedef struct dpp_etm_qmu_cfg_qsch_autocrlastque_t +{ + ZXIC_UINT32 cfg_qsch_autocrlastque; +}DPP_ETM_QMU_CFG_QSCH_AUTOCRLASTQUE_T; + +typedef struct dpp_etm_qmu_cfg_qsch_autocreditrate_t +{ + ZXIC_UINT32 cfg_qsch_autocreditrate; +}DPP_ETM_QMU_CFG_QSCH_AUTOCREDITRATE_T; + +typedef struct dpp_etm_qmu_cfg_qsch_scanfrstque_t +{ + ZXIC_UINT32 cfg_qsch_scanfrstque; +}DPP_ETM_QMU_CFG_QSCH_SCANFRSTQUE_T; + +typedef struct dpp_etm_qmu_cfg_qsch_scanlastque_t +{ + ZXIC_UINT32 cfg_qsch_scanlastque; +}DPP_ETM_QMU_CFG_QSCH_SCANLASTQUE_T; + +typedef struct dpp_etm_qmu_cfg_qsch_scanrate_t +{ + ZXIC_UINT32 cfg_qsch_scanrate; +}DPP_ETM_QMU_CFG_QSCH_SCANRATE_T; + +typedef struct dpp_etm_qmu_cfg_qsch_scan_en_t +{ + ZXIC_UINT32 cfg_qsch_scan_en; +}DPP_ETM_QMU_CFG_QSCH_SCAN_EN_T; + +typedef struct dpp_etm_qmu_cfgmt_qsch_rd_credit_fifo_rate_t +{ + ZXIC_UINT32 cfgmt_qsch_rd_credit_fifo_rate; +}DPP_ETM_QMU_CFGMT_QSCH_RD_CREDIT_FIFO_RATE_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_bdep_t +{ + ZXIC_UINT32 qcfg_qlist_bdep; +}DPP_ETM_QMU_QCFG_QLIST_BDEP_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_bhead_t +{ + ZXIC_UINT32 bank_vld; + ZXIC_UINT32 qcfg_qlist_bhead; +}DPP_ETM_QMU_QCFG_QLIST_BHEAD_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_btail_t +{ + ZXIC_UINT32 qcfg_qlist_btail; +}DPP_ETM_QMU_QCFG_QLIST_BTAIL_T; + +typedef struct dpp_etm_qmu_qcfg_qsch_shap_param_t +{ + ZXIC_UINT32 qcfg_qsch_shap_en; + ZXIC_UINT32 qcfg_qsch_shap_param1; + ZXIC_UINT32 qcfg_qsch_shap_param2; +}DPP_ETM_QMU_QCFG_QSCH_SHAP_PARAM_T; + +typedef struct dpp_etm_qmu_qcfg_qsch_shap_token_t +{ + ZXIC_UINT32 qcfg_qsch_shap_token; +}DPP_ETM_QMU_QCFG_QSCH_SHAP_TOKEN_T; + +typedef struct dpp_etm_qmu_qcfg_qsch_shap_offset_t +{ + ZXIC_UINT32 qcfg_qsch_shap_offset; +}DPP_ETM_QMU_QCFG_QSCH_SHAP_OFFSET_T; + +typedef struct dpp_etm_qmu_qcfg_qsch_crs_eir_th_t +{ + ZXIC_UINT32 qcfg_qsch_crs_eir_th; +}DPP_ETM_QMU_QCFG_QSCH_CRS_EIR_TH_T; + +typedef struct dpp_etm_qmu_qcfg_qsch_crs_th1_t +{ + ZXIC_UINT32 qcfg_qsch_crs_th1; +}DPP_ETM_QMU_QCFG_QSCH_CRS_TH1_T; + +typedef struct dpp_etm_qmu_qcfg_qsch_crs_th2_t +{ + ZXIC_UINT32 qcfg_qsch_crs_th2; +}DPP_ETM_QMU_QCFG_QSCH_CRS_TH2_T; + +typedef struct dpp_etm_qmu_qcfg_csch_congest_th_t +{ + ZXIC_UINT32 qcfg_csch_congest_th; +}DPP_ETM_QMU_QCFG_CSCH_CONGEST_TH_T; + +typedef struct dpp_etm_qmu_qcfg_csch_sp_fc_th_t +{ + ZXIC_UINT32 qcfg_csch_sp_fc_th; +}DPP_ETM_QMU_QCFG_CSCH_SP_FC_TH_T; + +typedef struct dpp_etm_qmu_qcfg_csw_shap_parameter_t +{ + ZXIC_UINT32 qcfg_csw_shap_en; + ZXIC_UINT32 qcfg_csw_shap_parameter; +}DPP_ETM_QMU_QCFG_CSW_SHAP_PARAMETER_T; + +typedef struct dpp_etm_qmu_cfgmt_rd_release_aful_th_t +{ + ZXIC_UINT32 cfgmt_rd_release_aful_th; +}DPP_ETM_QMU_CFGMT_RD_RELEASE_AFUL_TH_T; + +typedef struct dpp_etm_qmu_cfgmt_drop_imem_release_fifo_aful_th_t +{ + ZXIC_UINT32 cfgmt_drop_imem_release_fifo_aful_th; +}DPP_ETM_QMU_CFGMT_DROP_IMEM_RELEASE_FIFO_AFUL_TH_T; + +typedef struct dpp_etm_qmu_cfgmt_nnh_rd_buf_aful_th_t +{ + ZXIC_UINT32 cfgmt_nnh_rd_buf_aful_th; +}DPP_ETM_QMU_CFGMT_NNH_RD_BUF_AFUL_TH_T; + +typedef struct dpp_etm_qmu_cfg_pid_use_inall_t +{ + ZXIC_UINT32 cfgmt_nod_rd_buf_0_aful_th; +}DPP_ETM_QMU_CFG_PID_USE_INALL_T; + +typedef struct dpp_etm_qmu_cfg_pid_round_th_t +{ + ZXIC_UINT32 cfgmt_nod_rd_buf_1_aful_th; +}DPP_ETM_QMU_CFG_PID_ROUND_TH_T; + +typedef struct dpp_etm_qmu_cfgmt_credit_fifo_afull_th_t +{ + ZXIC_UINT32 cfgmt_credit_fifo_afull_th; +}DPP_ETM_QMU_CFGMT_CREDIT_FIFO_AFULL_TH_T; + +typedef struct dpp_etm_qmu_cfgmt_scan_fifo_afull_th_t +{ + ZXIC_UINT32 cfgmt_scan_fifo_afull_th; +}DPP_ETM_QMU_CFGMT_SCAN_FIFO_AFULL_TH_T; + +typedef struct dpp_etm_qmu_cfgmt_small_fifo_aful_th_t +{ + ZXIC_UINT32 cfgmt_small_fifo_aful_th; +}DPP_ETM_QMU_CFGMT_SMALL_FIFO_AFUL_TH_T; + +typedef struct dpp_etm_qmu_cfgmt_free_addr_fifo_aful_th_t +{ + ZXIC_UINT32 cfgmt_free_addr_fifo_aful_th; +}DPP_ETM_QMU_CFGMT_FREE_ADDR_FIFO_AFUL_TH_T; + +typedef struct dpp_etm_qmu_cfgmt_enq_rpt_fifo_aful_th_t +{ + ZXIC_UINT32 cfgmt_enq_rpt_fifo_aful_th; +}DPP_ETM_QMU_CFGMT_ENQ_RPT_FIFO_AFUL_TH_T; + +typedef struct dpp_etm_qmu_qcfg_csw_shap_token_depth_t +{ + ZXIC_UINT32 qcfg_csw_shap_token_depth; +}DPP_ETM_QMU_QCFG_CSW_SHAP_TOKEN_DEPTH_T; + +typedef struct dpp_etm_qmu_qcfg_csw_shap_offset_value_t +{ + ZXIC_UINT32 qcfg_csw_shap_offset_value; +}DPP_ETM_QMU_QCFG_CSW_SHAP_OFFSET_VALUE_T; + +typedef struct dpp_etm_qmu_qcfg_csw_fc_offset_value_t +{ + ZXIC_UINT32 qcfg_csw_fc_offset_value; +}DPP_ETM_QMU_QCFG_CSW_FC_OFFSET_VALUE_T; + +typedef struct dpp_etm_qmu_qmu_init_done_state_t +{ + ZXIC_UINT32 csch_qcfg_init_done; + ZXIC_UINT32 qsch_qcfg_init_done; + ZXIC_UINT32 qlist_qcfg_init_done; + ZXIC_UINT32 qcsr_ram_init_done; +}DPP_ETM_QMU_QMU_INIT_DONE_STATE_T; + +typedef struct dpp_etm_qmu_csw_qcfg_port_shap_rdy_0_t +{ + ZXIC_UINT32 csw_qcfg_port_shap_rdy_0; +}DPP_ETM_QMU_CSW_QCFG_PORT_SHAP_RDY_0_T; + +typedef struct dpp_etm_qmu_csw_qcfg_port_shap_rdy_1_t +{ + ZXIC_UINT32 csw_qcfg_port_shap_rdy_1; +}DPP_ETM_QMU_CSW_QCFG_PORT_SHAP_RDY_1_T; + +typedef struct dpp_etm_qmu_qlist_cfgmt_ram_init_done_t +{ + ZXIC_UINT32 qlist_qcfg_qds_ram_init_done; + ZXIC_UINT32 qlist_qcfg_chk_ram_init_done; + ZXIC_UINT32 qlist_qcfg_ept_ram_init_done; + ZXIC_UINT32 qlist_qcfg_cti_ram_init_done; + ZXIC_UINT32 qlist_qcfg_cto_ram_init_done; + ZXIC_UINT32 qlist_qcfg_bcnt_ram_init_done; + ZXIC_UINT32 qlist_qcfg_biu_ram_init_done; + ZXIC_UINT32 qlist_qcfg_baram_init_done; +}DPP_ETM_QMU_QLIST_CFGMT_RAM_INIT_DONE_T; + +typedef struct dpp_etm_qmu_qlist_cfgmt_ram_ecc_err_t +{ + ZXIC_UINT32 qds_ram_parity_err; + ZXIC_UINT32 qcsr_qnum_fifo_parity_err; + ZXIC_UINT32 sa_id_ram_parity_err; + ZXIC_UINT32 enq_rpt_fifo_parity_err; + ZXIC_UINT32 bcnts_parity_err; + ZXIC_UINT32 baram_parity_err_a; + ZXIC_UINT32 baram_parity_err_b; + ZXIC_UINT32 bcntm_ram_parity_err; + ZXIC_UINT32 biu_ram_single_ecc_err; + ZXIC_UINT32 chk_ram_single_ecc_err; + ZXIC_UINT32 cmd_sch_cmd_ram_single_ecc_err; + ZXIC_UINT32 cmd_sch_list_ram_single_ecc_err; + ZXIC_UINT32 cmd_sch_hp_ram_single_ecc_err; + ZXIC_UINT32 cmd_sch_tp_ram_single_ecc_err; + ZXIC_UINT32 cmd_sch_enq_active_ram_single_ecc_err; + ZXIC_UINT32 cmd_sch_deq_active_ram_single_ecc_err; + ZXIC_UINT32 cmd_sch_empty_ram_single_ecc_err; + ZXIC_UINT32 cmd_sch_eop_ram_single_ecc_err; + ZXIC_UINT32 cmd_sch_blkcnt_ram_single_ecc_err; + ZXIC_UINT32 biu_ram_double_ecc_err; + ZXIC_UINT32 chk_ram_double_ecc_err; + ZXIC_UINT32 cmd_sch_cmd_ram_double_ecc_err; + ZXIC_UINT32 cmd_sch_list_ram_double_ecc_err; + ZXIC_UINT32 cmd_sch_hp_ram_double_ecc_err; + ZXIC_UINT32 cmd_sch_tp_ram_double_ecc_err; + ZXIC_UINT32 cmd_sch_enq_active_ram_double_ecc_err; + ZXIC_UINT32 cmd_sch_deq_active_ram_double_ecc_err; + ZXIC_UINT32 cmd_sch_empty_ram_double_ecc_err; + ZXIC_UINT32 cmd_sch_eop_ram_double_ecc_err; + ZXIC_UINT32 cmd_sch_blkcnt_ram_double_ecc_err; +}DPP_ETM_QMU_QLIST_CFGMT_RAM_ECC_ERR_T; + +typedef struct dpp_etm_qmu_qlist_cfgmt_ram_slot_err_t +{ + ZXIC_UINT32 qds_ram_enq_rd_slot_err; + ZXIC_UINT32 qds_ram_deq_rd_slot_err; + ZXIC_UINT32 qds_ram_enq_wr_slot_err; + ZXIC_UINT32 qds_ram_deq_wr_slot_err; + ZXIC_UINT32 chk_ram_enq_rd_slot_err; + ZXIC_UINT32 chk_ram_deq_rd_slot_err; + ZXIC_UINT32 chk_ram_enq_wr_slot_err; + ZXIC_UINT32 chk_ram_deq_wr_slot_err; + ZXIC_UINT32 ept_ram_enq_rd_slot_err; + ZXIC_UINT32 ept_ram_deq_rd_slot_err; + ZXIC_UINT32 ept_ram_enq_wr_slot_err; + ZXIC_UINT32 ept_ram_deq_wr_slot_err; + ZXIC_UINT32 cti_ram_enq_rd_slot_err; + ZXIC_UINT32 cti_ram_deq_rd_slot_err; + ZXIC_UINT32 cti_ram_enq_wr_slot_err; + ZXIC_UINT32 cti_ram_deq_wr_slot_err; + ZXIC_UINT32 cto_ram_enq_rd_slot_err; + ZXIC_UINT32 cto_ram_deq_rd_slot_err; + ZXIC_UINT32 cto_ram_enq_wr_slot_err; + ZXIC_UINT32 cto_ram_deq_wr_slot_err; +}DPP_ETM_QMU_QLIST_CFGMT_RAM_SLOT_ERR_T; + +typedef struct dpp_etm_qmu_qsch_cfgmt_ram_ecc_t +{ + ZXIC_UINT32 crbal_rama_parity_error; + ZXIC_UINT32 crbal_ramb_parity_error; + ZXIC_UINT32 crs_ram_parity_error; + ZXIC_UINT32 wlist_flag_ram_single_ecc_err; + ZXIC_UINT32 wlist_next_single_ecc_err; + ZXIC_UINT32 wlist_wactive_ram_single_ecc_err; + ZXIC_UINT32 wlist_ractive_ram_single_ecc_err; + ZXIC_UINT32 wlist_tp1_ram_single_ecc_err; + ZXIC_UINT32 wlist_tp2_ram_single_ecc_err; + ZXIC_UINT32 wlist_empty1_ram_single_ecc_err_a; + ZXIC_UINT32 wlist_empty1_ram_single_ecc_err_b; + ZXIC_UINT32 wlist_empty2_ram_single_ecc_err_a; + ZXIC_UINT32 wlist_empty2_ram_single_ecc_err_b; + ZXIC_UINT32 wlist_hp_ram_single_ecc_err_a; + ZXIC_UINT32 wlist_hp_ram_single_ecc_err_b; + ZXIC_UINT32 wlist_flag_ram_double_ecc_err; + ZXIC_UINT32 wlist_next_double_ecc_err; + ZXIC_UINT32 wlist_wactive_ram_double_ecc_err; + ZXIC_UINT32 wlist_ractive_ram_double_ecc_err; + ZXIC_UINT32 wlist_tp1_ram_double_ecc_err; + ZXIC_UINT32 wlist_tp2_ram_double_ecc_err; + ZXIC_UINT32 wlist_empty1_ram_double_ecc_err_a; + ZXIC_UINT32 wlist_empty1_ram_double_ecc_err_b; + ZXIC_UINT32 wlist_empty2_ram_double_ecc_err_a; + ZXIC_UINT32 wlist_empty2_ram_double_ecc_err_b; + ZXIC_UINT32 wlist_hp_ram_double_ecc_err_a; + ZXIC_UINT32 wlist_hp_ram_double_ecc_err_b; +}DPP_ETM_QMU_QSCH_CFGMT_RAM_ECC_T; + +typedef struct dpp_etm_qmu_qlist_cfgmt_fifo_state_t +{ + ZXIC_UINT32 pkt_age_req_fifo_overflow; + ZXIC_UINT32 pkt_age_req_fifo_underflow; + ZXIC_UINT32 qcsr_big_fifo_ovfl; + ZXIC_UINT32 qcsr_small_fifo_overflow; + ZXIC_UINT32 enq_rpt_fifo_overflow; + ZXIC_UINT32 enq_rpt_fifo_underflow; + ZXIC_UINT32 pds_fwft_overflow; + ZXIC_UINT32 pds_fwft_underflow; + ZXIC_UINT32 free_addr_fifo_overflow; + ZXIC_UINT32 free_addr_fifo_underflow; + ZXIC_UINT32 rd_release_fwft_overflow; + ZXIC_UINT32 rd_release_fwft_underflow; + ZXIC_UINT32 pid_free_list_overflow; + ZXIC_UINT32 pid_free_list_underflow; + ZXIC_UINT32 pid_prp_list_overflow; + ZXIC_UINT32 pid_prp_list_underflow; + ZXIC_UINT32 pid_rdy_list_overflow; + ZXIC_UINT32 pid_rdy_list_underflow; + ZXIC_UINT32 drop_imem_release_fwft_overflow; + ZXIC_UINT32 drop_imem_release_fwft_underflow; + ZXIC_UINT32 nnh_rd_buf_fifo_overflow; + ZXIC_UINT32 nnh_rd_buf_fifo_underflow; + ZXIC_UINT32 nod_rd_buf_0_fifo_overflow; + ZXIC_UINT32 nod_rd_buf_0_fifo_underflow; + ZXIC_UINT32 nod_rd_buf_1_fifo_overflow; + ZXIC_UINT32 nod_rd_buf_1_fifo_underflow; +}DPP_ETM_QMU_QLIST_CFGMT_FIFO_STATE_T; + +typedef struct dpp_etm_qmu_qlist_qcfg_clr_done_t +{ + ZXIC_UINT32 qlist_qcfg_clr_done; +}DPP_ETM_QMU_QLIST_QCFG_CLR_DONE_T; + +typedef struct dpp_etm_qmu_qmu_int_mask1_t +{ + ZXIC_UINT32 qmu_int_mask1; +}DPP_ETM_QMU_QMU_INT_MASK1_T; + +typedef struct dpp_etm_qmu_qmu_int_mask2_t +{ + ZXIC_UINT32 qmu_int_mask2; +}DPP_ETM_QMU_QMU_INT_MASK2_T; + +typedef struct dpp_etm_qmu_qmu_int_mask3_t +{ + ZXIC_UINT32 qmu_int_mask3; +}DPP_ETM_QMU_QMU_INT_MASK3_T; + +typedef struct dpp_etm_qmu_qmu_int_mask4_t +{ + ZXIC_UINT32 qmu_int_mask4; +}DPP_ETM_QMU_QMU_INT_MASK4_T; + +typedef struct dpp_etm_qmu_qmu_int_mask5_t +{ + ZXIC_UINT32 qmu_int_mask5; +}DPP_ETM_QMU_QMU_INT_MASK5_T; + +typedef struct dpp_etm_qmu_qmu_int_mask6_t +{ + ZXIC_UINT32 qmu_int_mask6; +}DPP_ETM_QMU_QMU_INT_MASK6_T; + +typedef struct dpp_etm_qmu_cmd_sch_cfgmt_fifo_state_t +{ + ZXIC_UINT32 nsop_fifo_parity_err; + ZXIC_UINT32 cmdsch_rd_cmd_fifo_parity_err; + ZXIC_UINT32 sop_fifo_afull; + ZXIC_UINT32 sop_fifo_empty; + ZXIC_UINT32 sop_fifo_overflow; + ZXIC_UINT32 sop_fifo_underflow; + ZXIC_UINT32 mmu_data_fifo_afull; + ZXIC_UINT32 mmu_data_fifo_empty; + ZXIC_UINT32 mmudat_fifo_overflow; + ZXIC_UINT32 mmudat_fifo_underflow; + ZXIC_UINT32 non_sop_fifo_afull; + ZXIC_UINT32 non_sop_fifo_empty; + ZXIC_UINT32 nsop_fifo_overflow; + ZXIC_UINT32 nsop_fifo_underflow; + ZXIC_UINT32 cmdsch_rd_cmd_fifo_afull; + ZXIC_UINT32 cmdsch_rd_cmd_fifo_empty; + ZXIC_UINT32 cmdsch_rd_cmd_fifo_overflow; + ZXIC_UINT32 cmdsch_rd_cmd_fifo_underflow; + ZXIC_UINT32 wlist_qnum_fifo_overflow; + ZXIC_UINT32 wlist_qnum_fifo_underflow; + ZXIC_UINT32 qsch_scan_fifo_overflow; + ZXIC_UINT32 qsch_scan_fifo_underflow; + ZXIC_UINT32 qsch_credit_fifo_overflow; + ZXIC_UINT32 qsch_credit_fifo_underflow; + ZXIC_UINT32 qsch_credit_fifo2_overflow; + ZXIC_UINT32 qsch_credit_fifo2_underflow; +}DPP_ETM_QMU_CMD_SCH_CFGMT_FIFO_STATE_T; + +typedef struct dpp_etm_qmu_qlist_r_bcnt_t +{ + ZXIC_UINT32 qlist_r_bcnt; +}DPP_ETM_QMU_QLIST_R_BCNT_T; + +typedef struct dpp_etm_qmu_qsch_rw_crbal_t +{ + ZXIC_UINT32 qsch_rw_crbal; +}DPP_ETM_QMU_QSCH_RW_CRBAL_T; + +typedef struct dpp_etm_qmu_qsch_rw_crs_t +{ + ZXIC_UINT32 qsch_rw_crs; +}DPP_ETM_QMU_QSCH_RW_CRS_T; + +typedef struct dpp_etm_qmu_qsch_r_wlist_empty_t +{ + ZXIC_UINT32 qsch_r_wlist_empty; +}DPP_ETM_QMU_QSCH_R_WLIST_EMPTY_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_baram_rd_t +{ + ZXIC_UINT32 qcfg_qlist_baram_rd; +}DPP_ETM_QMU_QCFG_QLIST_BARAM_RD_T; + +typedef struct dpp_etm_qmu_qcfg_qsch_crbal_fb_rw_t +{ + ZXIC_UINT32 qcfg_qlist_crbal_fb_rw; +}DPP_ETM_QMU_QCFG_QSCH_CRBAL_FB_RW_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_grp0_bank_t +{ + ZXIC_UINT32 qcfg_qlist_grp0_bank_wr; +}DPP_ETM_QMU_QCFG_QLIST_GRP0_BANK_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_grp1_bank_t +{ + ZXIC_UINT32 qcfg_qlist_grp1_bank_wr; +}DPP_ETM_QMU_QCFG_QLIST_GRP1_BANK_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_grp2_bank_t +{ + ZXIC_UINT32 qcfg_qlist_grp2_bank_wr; +}DPP_ETM_QMU_QCFG_QLIST_GRP2_BANK_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_grp3_bank_t +{ + ZXIC_UINT32 qcfg_qlist_grp3_bank_wr; +}DPP_ETM_QMU_QCFG_QLIST_GRP3_BANK_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_grp4_bank_t +{ + ZXIC_UINT32 qcfg_qlist_grp4_bank_wr; +}DPP_ETM_QMU_QCFG_QLIST_GRP4_BANK_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_grp5_bank_t +{ + ZXIC_UINT32 qcfg_qlist_grp5_bank_wr; +}DPP_ETM_QMU_QCFG_QLIST_GRP5_BANK_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_grp6_bank_t +{ + ZXIC_UINT32 qcfg_qlist_grp6_bank_wr; +}DPP_ETM_QMU_QCFG_QLIST_GRP6_BANK_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_grp7_bank_t +{ + ZXIC_UINT32 qcfg_qlist_grp7_bank_wr; +}DPP_ETM_QMU_QCFG_QLIST_GRP7_BANK_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_grp_t +{ + ZXIC_UINT32 qcfg_qlist_grp_wr; +}DPP_ETM_QMU_QCFG_QLIST_GRP_T; + +typedef struct dpp_etm_qmu_cfgmt_active_to_bank_cfg_t +{ + ZXIC_UINT32 cfgmt_active_to_bank_cfg; +}DPP_ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFG_T; + +typedef struct dpp_etm_qmu_cfgmt_ddr_in_mmu_cfg_t +{ + ZXIC_UINT32 cfgmt_ddr_in_mmu_cfg; +}DPP_ETM_QMU_CFGMT_DDR_IN_MMU_CFG_T; + +typedef struct dpp_etm_qmu_cfgmt_ddr_in_qmu_cfg_t +{ + ZXIC_UINT32 cfgmt_ddr_in_qmu_cfg; +}DPP_ETM_QMU_CFGMT_DDR_IN_QMU_CFG_T; + +typedef struct dpp_etm_qmu_cfgmt_bank_to_mmu_cfg_t +{ + ZXIC_UINT32 cfgmt_bank_in_mmu_cfg; +}DPP_ETM_QMU_CFGMT_BANK_TO_MMU_CFG_T; + +typedef struct dpp_etm_qmu_cfgmt_bank_to_qmu_cfg_t +{ + ZXIC_UINT32 cfgmt_bank_in_qmu_cfg; +}DPP_ETM_QMU_CFGMT_BANK_TO_QMU_CFG_T; + +typedef struct dpp_etm_qmu_cfgmt_grp_ram_n_clr_thd_t +{ + ZXIC_UINT32 cfgmt_grp_ram_n_clr_thd; +}DPP_ETM_QMU_CFGMT_GRP_RAM_N_CLR_THD_T; + +typedef struct dpp_etm_qmu_cfgmt_age_pkt_num_t +{ + ZXIC_UINT32 cfgmt_age_pkt_num; +}DPP_ETM_QMU_CFGMT_AGE_PKT_NUM_T; + +typedef struct dpp_etm_qmu_cfgmt_age_multi_interval_t +{ + ZXIC_UINT32 cfgmt_age_multi_interval; +}DPP_ETM_QMU_CFGMT_AGE_MULTI_INTERVAL_T; + +typedef struct dpp_etm_qmu_cfgmt_qmu_pkt_age_en_t +{ + ZXIC_UINT32 cfgmt_qmu_pkt_age_en; +}DPP_ETM_QMU_CFGMT_QMU_PKT_AGE_EN_T; + +typedef struct dpp_etm_qmu_cfgmt_qmu_pkt_age_interval_t +{ + ZXIC_UINT32 cfgmt_qmu_pkt_age_interval; +}DPP_ETM_QMU_CFGMT_QMU_PKT_AGE_INTERVAL_T; + +typedef struct dpp_etm_qmu_cfgmt_qmu_pkt_age_start_end_t +{ + ZXIC_UINT32 cfgmt_qmu_pkt_age_end; + ZXIC_UINT32 cfgmt_qmu_pkt_age_start; +}DPP_ETM_QMU_CFGMT_QMU_PKT_AGE_START_END_T; + +typedef struct dpp_etm_qmu_cfgmt_pkt_age_req_aful_th_t +{ + ZXIC_UINT32 cfgmt_pkt_age_req_aful_th; +}DPP_ETM_QMU_CFGMT_PKT_AGE_REQ_AFUL_TH_T; + +typedef struct dpp_etm_qmu_cfgmt_pkt_age_step_interval_t +{ + ZXIC_UINT32 cfgmt_pkt_age_step_interval; +}DPP_ETM_QMU_CFGMT_PKT_AGE_STEP_INTERVAL_T; + +typedef struct dpp_etm_qmu_cfgmt_qmu_imem_age_mode_t +{ + ZXIC_UINT32 cfgmt_qmu_imem_age_en; + ZXIC_UINT32 cfgmt_qmu_imem_age_qlen_en; + ZXIC_UINT32 cfgmt_qmu_imem_age_time_en; +}DPP_ETM_QMU_CFGMT_QMU_IMEM_AGE_MODE_T; + +typedef struct dpp_etm_qmu_cfgmt_qmu_imem_qlen_age_interval_t +{ + ZXIC_UINT32 cfgmt_qmu_imem_qlen_age_interval; +}DPP_ETM_QMU_CFGMT_QMU_IMEM_QLEN_AGE_INTERVAL_T; + +typedef struct dpp_etm_qmu_cfgmt_qmu_imem_time_age_interval_t +{ + ZXIC_UINT32 cfgmt_qmu_imem_time_age_interval; +}DPP_ETM_QMU_CFGMT_QMU_IMEM_TIME_AGE_INTERVAL_T; + +typedef struct dpp_etm_qmu_cfgmt_qmu_imem_qlen_age_thd_t +{ + ZXIC_UINT32 cfgmt_qmu_imem_qlen_age_thd; +}DPP_ETM_QMU_CFGMT_QMU_IMEM_QLEN_AGE_THD_T; + +typedef struct dpp_etm_qmu_cfgmt_imem_age_step_interval_t +{ + ZXIC_UINT32 cfgmt_imem_age_step_interval; +}DPP_ETM_QMU_CFGMT_IMEM_AGE_STEP_INTERVAL_T; + +typedef struct dpp_etm_qmu_cfgmt_qmu_ecc_bypass_read_t +{ + ZXIC_UINT32 cfgmt_qmu_ecc_bypass_read; +}DPP_ETM_QMU_CFGMT_QMU_ECC_BYPASS_READ_T; + +typedef struct dpp_etm_qmu_cfgmt_qmu_resp_stat_fc_en_t +{ + ZXIC_UINT32 cfgmt_qmu_resp_stat_fc_en; +}DPP_ETM_QMU_CFGMT_QMU_RESP_STAT_FC_EN_T; + +typedef struct dpp_etm_qmu_cfgmt_qmu_bank_xoff_pds_mode_t +{ + ZXIC_UINT32 cfgmt_qmu_bank_xoff_pds_mode; +}DPP_ETM_QMU_CFGMT_QMU_BANK_XOFF_PDS_MODE_T; + +typedef struct dpp_etm_qmu_cfgmt_qmu_stat_offset_t +{ + ZXIC_UINT32 cfgmt_qmu_stat_offset; +}DPP_ETM_QMU_CFGMT_QMU_STAT_OFFSET_T; + +typedef struct dpp_etm_qmu_fc_cnt_mode_t +{ + ZXIC_UINT32 fc_cnt_mode; +}DPP_ETM_QMU_FC_CNT_MODE_T; + +typedef struct dpp_etm_qmu_mmu_qmu_wr_fc_cnt_t +{ + ZXIC_UINT32 mmu_qmu_wr_fc_cnt; +}DPP_ETM_QMU_MMU_QMU_WR_FC_CNT_T; + +typedef struct dpp_etm_qmu_mmu_qmu_rd_fc_cnt_t +{ + ZXIC_UINT32 mmu_qmu_rd_fc_cnt; +}DPP_ETM_QMU_MMU_QMU_RD_FC_CNT_T; + +typedef struct dpp_etm_qmu_qmu_cgavd_fc_cnt_t +{ + ZXIC_UINT32 qmu_cgavd_fc_cnt; +}DPP_ETM_QMU_QMU_CGAVD_FC_CNT_T; + +typedef struct dpp_etm_qmu_cgavd_qmu_pkt_cnt_t +{ + ZXIC_UINT32 cgavd_qmu_pkt_cnt; +}DPP_ETM_QMU_CGAVD_QMU_PKT_CNT_T; + +typedef struct dpp_etm_qmu_cgavd_qmu_pktlen_all_t +{ + ZXIC_UINT32 cgavd_qmu_pktlen_all; +}DPP_ETM_QMU_CGAVD_QMU_PKTLEN_ALL_T; + +typedef struct dpp_etm_qmu_observe_portfc_spec_t +{ + ZXIC_UINT32 observe_portfc_spec; +}DPP_ETM_QMU_OBSERVE_PORTFC_SPEC_T; + +typedef struct dpp_etm_qmu_spec_lif_portfc_count_t +{ + ZXIC_UINT32 spec_lif_portfc_count; +}DPP_ETM_QMU_SPEC_LIF_PORTFC_COUNT_T; + +typedef struct dpp_etm_qmu_cfgmt_qmu_pfc_en_t +{ + ZXIC_UINT32 cfgmt_qmu_pfc_en; +}DPP_ETM_QMU_CFGMT_QMU_PFC_EN_T; + +typedef struct dpp_etm_qmu_cfgmt_qmu_pfc_mask_1_t +{ + ZXIC_UINT32 cfgmt_qmu_pfc_mask_1; +}DPP_ETM_QMU_CFGMT_QMU_PFC_MASK_1_T; + +typedef struct dpp_etm_qmu_cfgmt_qmu_pfc_mask_2_t +{ + ZXIC_UINT32 cfgmt_qmu_pfc_mask_2; +}DPP_ETM_QMU_CFGMT_QMU_PFC_MASK_2_T; + +typedef struct dpp_etm_cfgmt_chip_version_reg_t +{ + ZXIC_UINT32 chip_version_reg; + ZXIC_UINT32 chip_sub_reg; + ZXIC_UINT32 chip_type_reg; +}DPP_ETM_CFGMT_CHIP_VERSION_REG_T; + +typedef struct dpp_etm_cfgmt_chip_date_reg_t +{ + ZXIC_UINT32 chip_date_reg; +}DPP_ETM_CFGMT_CHIP_DATE_REG_T; + +typedef struct dpp_etm_cfgmt_cfgmt_crc_en_t +{ + ZXIC_UINT32 cfgmt_crc_en; +}DPP_ETM_CFGMT_CFGMT_CRC_EN_T; + +typedef struct dpp_etm_cfgmt_cfg_port_transfer_en_t +{ + ZXIC_UINT32 cfg_port_transfer_en; +}DPP_ETM_CFGMT_CFG_PORT_TRANSFER_EN_T; + +typedef struct dpp_etm_cfgmt_tm_sa_work_mode_t +{ + ZXIC_UINT32 tm_sa_work_mode; +}DPP_ETM_CFGMT_TM_SA_WORK_MODE_T; + +typedef struct dpp_etm_cfgmt_local_sa_id_t +{ + ZXIC_UINT32 local_sa_id; +}DPP_ETM_CFGMT_LOCAL_SA_ID_T; + +typedef struct dpp_etm_olif_olif_rdy_t +{ + ZXIC_UINT32 cfgmt_block_mode; + ZXIC_UINT32 cfgmt_count_overflow_mode; + ZXIC_UINT32 cfgmt_count_rd_mode; + ZXIC_UINT32 olif_rdy; +}DPP_ETM_OLIF_OLIF_RDY_T; + +typedef struct dpp_etm_olif_emem_prog_full_t +{ + ZXIC_UINT32 emem_prog_full_assert; + ZXIC_UINT32 emem_prog_full_negate; +}DPP_ETM_OLIF_EMEM_PROG_FULL_T; + +typedef struct dpp_etm_olif_port_order_fifo_full_t +{ + ZXIC_UINT32 port_order_fifo_full_assert; + ZXIC_UINT32 port_order_fifo_full_negate; +}DPP_ETM_OLIF_PORT_ORDER_FIFO_FULL_T; + +typedef struct dpp_etm_olif_olif_release_last_t +{ + ZXIC_UINT32 olif_release_last_addr; + ZXIC_UINT32 olif_release_last_bank; +}DPP_ETM_OLIF_OLIF_RELEASE_LAST_T; + +typedef struct dpp_etm_olif_olif_fifo_empty_state_t +{ + ZXIC_UINT32 qmu_para_fifo_empty; + ZXIC_UINT32 emem_empty; + ZXIC_UINT32 imem_empty; +}DPP_ETM_OLIF_OLIF_FIFO_EMPTY_STATE_T; + +typedef struct dpp_etm_olif_qmu_olif_release_fc_cnt_t +{ + ZXIC_UINT32 qmu_olif_release_fc_cnt; +}DPP_ETM_OLIF_QMU_OLIF_RELEASE_FC_CNT_T; + +typedef struct dpp_etm_olif_olif_qmu_link_fc_cnt_t +{ + ZXIC_UINT32 olif_qmu_link_fc_cnt; +}DPP_ETM_OLIF_OLIF_QMU_LINK_FC_CNT_T; + +typedef struct dpp_etm_olif_lif0_link_fc_cnt_t +{ + ZXIC_UINT32 lif0_link_fc_cnt; +}DPP_ETM_OLIF_LIF0_LINK_FC_CNT_T; + +typedef struct dpp_etm_olif_olif_tmmu_fc_cnt_t +{ + ZXIC_UINT32 olif_tmmu_fc_cnt; +}DPP_ETM_OLIF_OLIF_TMMU_FC_CNT_T; + +typedef struct dpp_etm_olif_olif_mmu_fc_cnt_t +{ + ZXIC_UINT32 olif_mmu_fc_cnt; +}DPP_ETM_OLIF_OLIF_MMU_FC_CNT_T; + +typedef struct dpp_etm_olif_olif_qmu_port_rdy_h_t +{ + ZXIC_UINT32 olif_qmu_port_rdy_h; +}DPP_ETM_OLIF_OLIF_QMU_PORT_RDY_H_T; + +typedef struct dpp_etm_olif_olif_qmu_port_rdy_l_t +{ + ZXIC_UINT32 olif_qmu_port_rdy_l; +}DPP_ETM_OLIF_OLIF_QMU_PORT_RDY_L_T; + +typedef struct dpp_etm_olif_lif0_port_rdy_h_t +{ + ZXIC_UINT32 lif0_port_rdy_h; +}DPP_ETM_OLIF_LIF0_PORT_RDY_H_T; + +typedef struct dpp_etm_olif_lif0_port_rdy_l_t +{ + ZXIC_UINT32 lif0_port_rdy_l; +}DPP_ETM_OLIF_LIF0_PORT_RDY_L_T; + +typedef struct dpp_etm_olif_qmu_olif_rd_sop_cnt_t +{ + ZXIC_UINT32 qmu_olif_rd_sop_cnt; +}DPP_ETM_OLIF_QMU_OLIF_RD_SOP_CNT_T; + +typedef struct dpp_etm_olif_qmu_olif_rd_eop_cnt_t +{ + ZXIC_UINT32 qmu_olif_rd_eop_cnt; +}DPP_ETM_OLIF_QMU_OLIF_RD_EOP_CNT_T; + +typedef struct dpp_etm_olif_qmu_olif_rd_vld_cnt_t +{ + ZXIC_UINT32 qmu_olif_rd_vld_cnt; +}DPP_ETM_OLIF_QMU_OLIF_RD_VLD_CNT_T; + +typedef struct dpp_etm_olif_qmu_olif_rd_blk_cnt_t +{ + ZXIC_UINT32 qmu_olif_rd_blk_cnt; +}DPP_ETM_OLIF_QMU_OLIF_RD_BLK_CNT_T; + +typedef struct dpp_etm_olif_mmu_tm_data_sop_cnt_t +{ + ZXIC_UINT32 mmu_tm_data_sop_cnt; +}DPP_ETM_OLIF_MMU_TM_DATA_SOP_CNT_T; + +typedef struct dpp_etm_olif_mmu_tm_data_eop_cnt_t +{ + ZXIC_UINT32 mmu_tm_data_eop_cnt; +}DPP_ETM_OLIF_MMU_TM_DATA_EOP_CNT_T; + +typedef struct dpp_etm_olif_mmu_tm_data_vld_cnt_t +{ + ZXIC_UINT32 mmu_tm_data_vld_cnt; +}DPP_ETM_OLIF_MMU_TM_DATA_VLD_CNT_T; + +typedef struct dpp_etm_olif_odma_tm_data_sop_cnt_t +{ + ZXIC_UINT32 odma_tm_data_sop_cnt; +}DPP_ETM_OLIF_ODMA_TM_DATA_SOP_CNT_T; + +typedef struct dpp_etm_olif_odma_tm_data_eop_cnt_t +{ + ZXIC_UINT32 odma_tm_data_eop_cnt; +}DPP_ETM_OLIF_ODMA_TM_DATA_EOP_CNT_T; + +typedef struct dpp_etm_olif_odma_tm_deq_vld_cnt_t +{ + ZXIC_UINT32 odma_tm_deq_vld_cnt; +}DPP_ETM_OLIF_ODMA_TM_DEQ_VLD_CNT_T; + +typedef struct dpp_etm_olif_olif_qmu_release_vld_cnt_t +{ + ZXIC_UINT32 olif_qmu_release_vld_cnt; +}DPP_ETM_OLIF_OLIF_QMU_RELEASE_VLD_CNT_T; + +typedef struct dpp_etm_olif_emem_dat_vld_cnt_t +{ + ZXIC_UINT32 emem_dat_vld_cnt; +}DPP_ETM_OLIF_EMEM_DAT_VLD_CNT_T; + +typedef struct dpp_etm_olif_imem_dat_vld_cnt_t +{ + ZXIC_UINT32 imem_dat_vld_cnt; +}DPP_ETM_OLIF_IMEM_DAT_VLD_CNT_T; + +typedef struct dpp_etm_olif_emem_dat_rd_cnt_t +{ + ZXIC_UINT32 emem_dat_rd_cnt; +}DPP_ETM_OLIF_EMEM_DAT_RD_CNT_T; + +typedef struct dpp_etm_olif_imem_dat_rd_cnt_t +{ + ZXIC_UINT32 imem_dat_rd_cnt; +}DPP_ETM_OLIF_IMEM_DAT_RD_CNT_T; + +typedef struct dpp_etm_olif_qmu_olif_rd_sop_emem_cnt_t +{ + ZXIC_UINT32 qmu_olif_rd_sop_emem_cnt; +}DPP_ETM_OLIF_QMU_OLIF_RD_SOP_EMEM_CNT_T; + +typedef struct dpp_etm_olif_qmu_olif_rd_vld_emem_cnt_t +{ + ZXIC_UINT32 qmu_olif_rd_vld_emem_cnt; +}DPP_ETM_OLIF_QMU_OLIF_RD_VLD_EMEM_CNT_T; + +typedef struct dpp_etm_olif_cpu_last_wr_addr_t +{ + ZXIC_UINT32 cpu_last_wr_addr; +}DPP_ETM_OLIF_CPU_LAST_WR_ADDR_T; + +typedef struct dpp_etm_olif_cpu_last_wr_data_t +{ + ZXIC_UINT32 cpu_last_wr_data; +}DPP_ETM_OLIF_CPU_LAST_WR_DATA_T; + +typedef struct dpp_etm_olif_cpu_last_rd_addr_t +{ + ZXIC_UINT32 cpu_last_rd_addr; +}DPP_ETM_OLIF_CPU_LAST_RD_ADDR_T; + +typedef struct dpp_etm_olif_qmu_olif_last_port_t +{ + ZXIC_UINT32 qmu_olif_last_port; +}DPP_ETM_OLIF_QMU_OLIF_LAST_PORT_T; + +typedef struct dpp_etm_olif_qmu_olif_last_addr_t +{ + ZXIC_UINT32 qmu_olif_last_addr; +}DPP_ETM_OLIF_QMU_OLIF_LAST_ADDR_T; + +typedef struct dpp_etm_olif_qmu_olif_last_bank_t +{ + ZXIC_UINT32 qmu_olif_last_bank; +}DPP_ETM_OLIF_QMU_OLIF_LAST_BANK_T; + +typedef struct dpp_etm_olif_tm_lif_byte_stat_t +{ + ZXIC_UINT32 tm_lif_byte_stat; +}DPP_ETM_OLIF_TM_LIF_BYTE_STAT_T; + +typedef struct dpp_etm_olif_tm_lif_err_stat_t +{ + ZXIC_UINT32 tm_lif_err_stat; +}DPP_ETM_OLIF_TM_LIF_ERR_STAT_T; + +typedef struct dpp_etm_cgavd_port_share_cnt_t +{ + ZXIC_UINT32 port_share_cnt; +}DPP_ETM_CGAVD_PORT_SHARE_CNT_T; + +typedef struct dpp_etm_cgavd_total_imem_cnt_t +{ + ZXIC_UINT32 total_imem_cnt; +}DPP_ETM_CGAVD_TOTAL_IMEM_CNT_T; + +typedef struct dpp_etm_cgavd_pp_q_len_t +{ + ZXIC_UINT32 pp_q_len; +}DPP_ETM_CGAVD_PP_Q_LEN_T; + +typedef struct dpp_etm_cgavd_sys_q_len_t +{ + ZXIC_UINT32 sys_q_len; +}DPP_ETM_CGAVD_SYS_Q_LEN_T; + +typedef struct dpp_etm_cgavd_cgavd_cfg_error_warning_t +{ + ZXIC_UINT32 error_correction_11; + ZXIC_UINT32 error_correction_10; + ZXIC_UINT32 error_correction_9; + ZXIC_UINT32 error_correction_8; + ZXIC_UINT32 error_correction_7; + ZXIC_UINT32 error_correction_6; + ZXIC_UINT32 error_correction5; + ZXIC_UINT32 error_correction_4; + ZXIC_UINT32 error_correction_3; + ZXIC_UINT32 error_correction_2; + ZXIC_UINT32 error_correction_1; + ZXIC_UINT32 error_correction_0; +}DPP_ETM_CGAVD_CGAVD_CFG_ERROR_WARNING_T; + +typedef struct dpp_etm_cgavd_mult_qlen_th_en_t +{ + ZXIC_UINT32 mult_qlen_th; +}DPP_ETM_CGAVD_MULT_QLEN_TH_EN_T; + +typedef struct dpp_etm_cgavd_mult_qlen_th_t +{ + ZXIC_UINT32 mult_qlen_th; +}DPP_ETM_CGAVD_MULT_QLEN_TH_T; + +typedef struct dpp_etm_cgavd_cgavd_cfg_move_t +{ + ZXIC_UINT32 cfgmt_sys_move_en; + ZXIC_UINT32 cfgmt_port_move_en; + ZXIC_UINT32 cfgmt_flow_move_en; +}DPP_ETM_CGAVD_CGAVD_CFG_MOVE_T; + +typedef struct dpp_etm_cgavd_cfgmt_total_th_t +{ + ZXIC_UINT32 cfgmt_total_th; +}DPP_ETM_CGAVD_CFGMT_TOTAL_TH_T; + +typedef struct dpp_etm_cgavd_cfgmt_port_share_th_t +{ + ZXIC_UINT32 cfgmt_port_share_th; +}DPP_ETM_CGAVD_CFGMT_PORT_SHARE_TH_T; + +typedef struct dpp_etm_cgavd_sa_unreach_state_t +{ + ZXIC_UINT32 sa_unreach_state; +}DPP_ETM_CGAVD_SA_UNREACH_STATE_T; + +typedef struct dpp_etm_cgavd_mv_port_th_t +{ + ZXIC_UINT32 port_th; +}DPP_ETM_CGAVD_MV_PORT_TH_T; + +typedef struct dpp_etm_cgavd_mv_drop_sp_th_t +{ + ZXIC_UINT32 mvdrop_sp_th; +}DPP_ETM_CGAVD_MV_DROP_SP_TH_T; + +typedef struct dpp_etm_cgavd_cgavd_state_warning_t +{ + ZXIC_UINT32 deq_q_num_warning; + ZXIC_UINT32 deq_pkt_len_warning; + ZXIC_UINT32 enq_pkt_dp_warning; + ZXIC_UINT32 unenq_q_num_warning; + ZXIC_UINT32 enq_q_num_warning; + ZXIC_UINT32 enq_pkt_len_warning; +}DPP_ETM_CGAVD_CGAVD_STATE_WARNING_T; + +typedef struct dpp_etm_cgavd_tmmu_cgavd_dma_fifo_cnt_t +{ + ZXIC_UINT32 tmmu_cgavd_dma_fifo_cnt; +}DPP_ETM_CGAVD_TMMU_CGAVD_DMA_FIFO_CNT_T; + +typedef struct dpp_etm_cgavd_tmmu_cgavd_dma_fifo_cnt_max_t +{ + ZXIC_UINT32 tmmu_cgavd_dma_fifo_cnt_max; +}DPP_ETM_CGAVD_TMMU_CGAVD_DMA_FIFO_CNT_MAX_T; + +typedef struct dpp_etm_cgavd_imem_total_cnt_t +{ + ZXIC_UINT32 imem_total_cnt; +}DPP_ETM_CGAVD_IMEM_TOTAL_CNT_T; + +typedef struct dpp_etm_cgavd_imem_total_cnt_max_t +{ + ZXIC_UINT32 imem_total_cnt_max; +}DPP_ETM_CGAVD_IMEM_TOTAL_CNT_MAX_T; + +typedef struct dpp_etm_cgavd_flow0_omem_cnt_t +{ + ZXIC_UINT32 flow0_omem_cnt; +}DPP_ETM_CGAVD_FLOW0_OMEM_CNT_T; + +typedef struct dpp_etm_cgavd_flow1_omem_cnt_t +{ + ZXIC_UINT32 flow1_omem_cnt; +}DPP_ETM_CGAVD_FLOW1_OMEM_CNT_T; + +typedef struct dpp_etm_cgavd_flow2_omem_cnt_t +{ + ZXIC_UINT32 flow2_omem_cnt; +}DPP_ETM_CGAVD_FLOW2_OMEM_CNT_T; + +typedef struct dpp_etm_cgavd_flow3_omem_cnt_t +{ + ZXIC_UINT32 flow3_omem_cnt; +}DPP_ETM_CGAVD_FLOW3_OMEM_CNT_T; + +typedef struct dpp_etm_cgavd_flow4_omem_cnt_t +{ + ZXIC_UINT32 flow4_omem_cnt; +}DPP_ETM_CGAVD_FLOW4_OMEM_CNT_T; + +typedef struct dpp_etm_cgavd_appoint_flow_num_message_1_t +{ + ZXIC_UINT32 appoint_flow_num_en_1; + ZXIC_UINT32 appoint_flow_num_1; +}DPP_ETM_CGAVD_APPOINT_FLOW_NUM_MESSAGE_1_T; + +typedef struct dpp_etm_cgavd_appoint_flow_num_message_2_t +{ + ZXIC_UINT32 appoint_flow_num_en_2; + ZXIC_UINT32 appoint_flow_num_2; +}DPP_ETM_CGAVD_APPOINT_FLOW_NUM_MESSAGE_2_T; + +typedef struct dpp_etm_cgavd_odma_cgavd_pkt_num_1_t +{ + ZXIC_UINT32 odma_cgavd_pkt_num_1; +}DPP_ETM_CGAVD_ODMA_CGAVD_PKT_NUM_1_T; + +typedef struct dpp_etm_cgavd_odma_cgavd_byte_num_1_t +{ + ZXIC_UINT32 odma_cgavd_byte_num_1; +}DPP_ETM_CGAVD_ODMA_CGAVD_BYTE_NUM_1_T; + +typedef struct dpp_etm_cgavd_cgavd_enqueue_pkt_num_1_t +{ + ZXIC_UINT32 cgavd_enqueue_pkt_num_1; +}DPP_ETM_CGAVD_CGAVD_ENQUEUE_PKT_NUM_1_T; + +typedef struct dpp_etm_cgavd_cgavd_dequeue_pkt_num_1_t +{ + ZXIC_UINT32 cgavd_dequeue_pkt_num_1; +}DPP_ETM_CGAVD_CGAVD_DEQUEUE_PKT_NUM_1_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_pkt_imem_num_1_t +{ + ZXIC_UINT32 cgavd_qmu_pkt_imem_num_1; +}DPP_ETM_CGAVD_CGAVD_QMU_PKT_IMEM_NUM_1_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_pkt_omem_num_1_t +{ + ZXIC_UINT32 cgavd_qmu_pkt_omem_num_1; +}DPP_ETM_CGAVD_CGAVD_QMU_PKT_OMEM_NUM_1_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_byte_imem_num_1_t +{ + ZXIC_UINT32 cgavd_qmu_byte_imem_1; +}DPP_ETM_CGAVD_CGAVD_QMU_BYTE_IMEM_NUM_1_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_byte_omem_num_1_t +{ + ZXIC_UINT32 cgavd_qmu_byte_omem_1; +}DPP_ETM_CGAVD_CGAVD_QMU_BYTE_OMEM_NUM_1_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_pkt_drop_num_1_t +{ + ZXIC_UINT32 cgavd_qmu_pkt_drop_num_1; +}DPP_ETM_CGAVD_CGAVD_QMU_PKT_DROP_NUM_1_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_byte_drop_num_1_t +{ + ZXIC_UINT32 cgavd_qmu_byte_drop_num_1; +}DPP_ETM_CGAVD_CGAVD_QMU_BYTE_DROP_NUM_1_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_forbid_drop_num_1_t +{ + ZXIC_UINT32 cgavd_qmu_forbid_drop_num_1; +}DPP_ETM_CGAVD_CGAVD_QMU_FORBID_DROP_NUM_1_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_flow_td_drop_num_1_t +{ + ZXIC_UINT32 cgavd_qmu_flow_td_drop_num_1; +}DPP_ETM_CGAVD_CGAVD_QMU_FLOW_TD_DROP_NUM_1_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_flow_wred_drop_num_1_t +{ + ZXIC_UINT32 cgavd_qmu_flow_wred_drop_num_1; +}DPP_ETM_CGAVD_CGAVD_QMU_FLOW_WRED_DROP_NUM_1_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_flow_wred_dp_drop_num_1_t +{ + ZXIC_UINT32 cgavd_qmu_flow_wred_dp_drop_num1; +}DPP_ETM_CGAVD_CGAVD_QMU_FLOW_WRED_DP_DROP_NUM_1_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_pp_td_num_1_t +{ + ZXIC_UINT32 cgavd_qmu_pp_td_num_1; +}DPP_ETM_CGAVD_CGAVD_QMU_PP_TD_NUM_1_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_pp_wred_drop_num_1_t +{ + ZXIC_UINT32 cgavd_qmu_pp_wred_drop_num_1; +}DPP_ETM_CGAVD_CGAVD_QMU_PP_WRED_DROP_NUM_1_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_pp_wred_dp_drop_num_1_t +{ + ZXIC_UINT32 cgavd_qmu_pp_wred_dp_drop_num1; +}DPP_ETM_CGAVD_CGAVD_QMU_PP_WRED_DP_DROP_NUM_1_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_sys_td_drop_num_1_t +{ + ZXIC_UINT32 cgavd_qmu_sys_td_drop_num_1; +}DPP_ETM_CGAVD_CGAVD_QMU_SYS_TD_DROP_NUM_1_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_sys_gred_drop_num_1_t +{ + ZXIC_UINT32 cgavd_qmu_sys_gred_drop_num_1; +}DPP_ETM_CGAVD_CGAVD_QMU_SYS_GRED_DROP_NUM_1_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_sys_gred_dp_drop_num1_t +{ + ZXIC_UINT32 cgavd_qmu_sys_gred_dp_drop_num1; +}DPP_ETM_CGAVD_CGAVD_QMU_SYS_GRED_DP_DROP_NUM1_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_sa_drop_num_1_t +{ + ZXIC_UINT32 cgavd_qmu_sa_drop_num_1; +}DPP_ETM_CGAVD_CGAVD_QMU_SA_DROP_NUM_1_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_move_drop_num_1_t +{ + ZXIC_UINT32 cgavd_qmu_move_drop_num_1; +}DPP_ETM_CGAVD_CGAVD_QMU_MOVE_DROP_NUM_1_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_tm_mult_drop_num_1_t +{ + ZXIC_UINT32 cgavd_qmu_tm_mult_drop_num_1; +}DPP_ETM_CGAVD_CGAVD_QMU_TM_MULT_DROP_NUM_1_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_tm_error_drop_num_1_t +{ + ZXIC_UINT32 cgavd_qmu_tm_error_drop_num_1; +}DPP_ETM_CGAVD_CGAVD_QMU_TM_ERROR_DROP_NUM_1_T; + +typedef struct dpp_etm_cgavd_odma_cgavd_pkt_num_2_t +{ + ZXIC_UINT32 odma_cgavd_pkt_num_2; +}DPP_ETM_CGAVD_ODMA_CGAVD_PKT_NUM_2_T; + +typedef struct dpp_etm_cgavd_odma_cgavd_byte_num_2_t +{ + ZXIC_UINT32 odma_cgavd_byte_num_2; +}DPP_ETM_CGAVD_ODMA_CGAVD_BYTE_NUM_2_T; + +typedef struct dpp_etm_cgavd_cgavd_enqueue_pkt_num_2_t +{ + ZXIC_UINT32 cgavd_enqueue_pkt_num_2; +}DPP_ETM_CGAVD_CGAVD_ENQUEUE_PKT_NUM_2_T; + +typedef struct dpp_etm_cgavd_cgavd_dequeue_pkt_num_2_t +{ + ZXIC_UINT32 cgavd_dequeue_pkt_num_2; +}DPP_ETM_CGAVD_CGAVD_DEQUEUE_PKT_NUM_2_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_pkt_imem_num_2_t +{ + ZXIC_UINT32 cgavd_qmu_pkt_imem_num_2; +}DPP_ETM_CGAVD_CGAVD_QMU_PKT_IMEM_NUM_2_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_pkt_omem_num_2_t +{ + ZXIC_UINT32 cgavd_qmu_pkt_omem_num_2; +}DPP_ETM_CGAVD_CGAVD_QMU_PKT_OMEM_NUM_2_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_byte_imem_num_2_t +{ + ZXIC_UINT32 cgavd_qmu_byte_imem_num_2; +}DPP_ETM_CGAVD_CGAVD_QMU_BYTE_IMEM_NUM_2_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_byte_omem_num_2_t +{ + ZXIC_UINT32 cgavd_qmu_byte_omem_num_2; +}DPP_ETM_CGAVD_CGAVD_QMU_BYTE_OMEM_NUM_2_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_pkt_drop_num_2_t +{ + ZXIC_UINT32 cgavd_qmu_pkt_drop_num_2; +}DPP_ETM_CGAVD_CGAVD_QMU_PKT_DROP_NUM_2_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_byte_drop_num_2_t +{ + ZXIC_UINT32 cgavd_qmu_byte_drop_num_2; +}DPP_ETM_CGAVD_CGAVD_QMU_BYTE_DROP_NUM_2_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_forbid_drop_num_2_t +{ + ZXIC_UINT32 cgavd_qmu_forbid_drop_num_2; +}DPP_ETM_CGAVD_CGAVD_QMU_FORBID_DROP_NUM_2_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_flow_td_drop_num_2_t +{ + ZXIC_UINT32 cgavd_qmu_flow_td_drop_num_2; +}DPP_ETM_CGAVD_CGAVD_QMU_FLOW_TD_DROP_NUM_2_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_flow_wred_drop_num_2_t +{ + ZXIC_UINT32 cgavd_qmu_flow_wred_drop_num_2; +}DPP_ETM_CGAVD_CGAVD_QMU_FLOW_WRED_DROP_NUM_2_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_flow_wred_dp_drop_num_2_t +{ + ZXIC_UINT32 cgavd_qmu_flow_wred_dp_drop_num_2; +}DPP_ETM_CGAVD_CGAVD_QMU_FLOW_WRED_DP_DROP_NUM_2_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_pp_td_num_2_t +{ + ZXIC_UINT32 cgavd_qmu_pp_td_num_2; +}DPP_ETM_CGAVD_CGAVD_QMU_PP_TD_NUM_2_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_pp_wred_drop_num_2_t +{ + ZXIC_UINT32 cgavd_qmu_pp_wred_drop_num_2; +}DPP_ETM_CGAVD_CGAVD_QMU_PP_WRED_DROP_NUM_2_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_pp_wred_dp_drop_num_2_t +{ + ZXIC_UINT32 cgavd_qmu_pp_wred_dp_drop_num_2; +}DPP_ETM_CGAVD_CGAVD_QMU_PP_WRED_DP_DROP_NUM_2_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_sys_td_drop_num_2_t +{ + ZXIC_UINT32 cgavd_qmu_sys_td_drop_num_2; +}DPP_ETM_CGAVD_CGAVD_QMU_SYS_TD_DROP_NUM_2_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_sys_gred_drop_num_2_t +{ + ZXIC_UINT32 cgavd_qmu_sys_gred_drop_num_2; +}DPP_ETM_CGAVD_CGAVD_QMU_SYS_GRED_DROP_NUM_2_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_sys_gred_dp_drop_num_2_t +{ + ZXIC_UINT32 cgavd_qmu_sys_gred_dp_drop_num_2; +}DPP_ETM_CGAVD_CGAVD_QMU_SYS_GRED_DP_DROP_NUM_2_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_sa_drop_num_2_t +{ + ZXIC_UINT32 cgavd_qmu_sa_drop_num_2; +}DPP_ETM_CGAVD_CGAVD_QMU_SA_DROP_NUM_2_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_move_drop_num_2_t +{ + ZXIC_UINT32 cgavd_qmu_move_drop_num_2; +}DPP_ETM_CGAVD_CGAVD_QMU_MOVE_DROP_NUM_2_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_tm_mult_drop_num_2_t +{ + ZXIC_UINT32 cgavd_qmu_tm_mult_drop_num_2; +}DPP_ETM_CGAVD_CGAVD_QMU_TM_MULT_DROP_NUM_2_T; + +typedef struct dpp_etm_cgavd_cgavd_qmu_tm_error_drop_num_2_t +{ + ZXIC_UINT32 cgavd_qmu_tm_error_drop_num_2; +}DPP_ETM_CGAVD_CGAVD_QMU_TM_ERROR_DROP_NUM_2_T; + +typedef struct dpp_etm_cgavd_move_flow_th_profile_t +{ + ZXIC_UINT32 move_drop_profile; +}DPP_ETM_CGAVD_MOVE_FLOW_TH_PROFILE_T; + +typedef struct dpp_etm_cgavd_move_flow_th_t +{ + ZXIC_UINT32 move_drop_flow_th; +}DPP_ETM_CGAVD_MOVE_FLOW_TH_T; + +typedef struct dpp_etm_tmmu_emem_pd_fifo_aful_th_t +{ + ZXIC_UINT32 emem_pd_fifo_aful_th; +}DPP_ETM_TMMU_EMEM_PD_FIFO_AFUL_TH_T; + +typedef struct dpp_etm_tmmu_dma_data_fifo_aful_th_t +{ + ZXIC_UINT32 dma_data_fifo_aful_th; +}DPP_ETM_TMMU_DMA_DATA_FIFO_AFUL_TH_T; + +typedef struct dpp_etm_tmmu_tmmu_states_0_t +{ + ZXIC_UINT32 tm_odma_pkt_rdy; + ZXIC_UINT32 dma_data_fifo_empty; + ZXIC_UINT32 imem_enq_rd_fifo_empty; + ZXIC_UINT32 imem_enq_drop_fifo_empty; + ZXIC_UINT32 imem_deq_rd_fifo_empty; + ZXIC_UINT32 imem_deq_drop_fifo_empty; + ZXIC_UINT32 wr_cmd_fifo_empty; + ZXIC_UINT32 cached_pd_fifo_empty; + ZXIC_UINT32 emem_pd_fifo_empty; + ZXIC_UINT32 pd_order_fifo_empty; + ZXIC_UINT32 odma_tm_data_rdy; + ZXIC_UINT32 odma_tm_discard_rdy; + ZXIC_UINT32 olif_tmmu_rdy; + ZXIC_UINT32 mmu_tm_cmd_wr_rdy; + ZXIC_UINT32 mmu_tm_data_wr_rdy; + ZXIC_UINT32 mmu_tm_rd_rdy; + ZXIC_UINT32 mmu_tm_sop_rd_rdy; + ZXIC_UINT32 qmu_tmmu_sop_data_rdy; + ZXIC_UINT32 tmmu_cmdsw_imem_release_rdy; + ZXIC_UINT32 imem_age_release_rdy; + ZXIC_UINT32 tmmu_qmu_wr_rdy; + ZXIC_UINT32 tmmu_qmu_rdy_7; + ZXIC_UINT32 tmmu_qmu_rdy_6; + ZXIC_UINT32 tmmu_qmu_rdy_5; + ZXIC_UINT32 tmmu_qmu_rdy_4; + ZXIC_UINT32 tmmu_qmu_rdy_3; + ZXIC_UINT32 tmmu_qmu_rdy_2; + ZXIC_UINT32 tmmu_qmu_rdy_1; + ZXIC_UINT32 tmmu_qmu_rdy_0; + ZXIC_UINT32 tmmu_qmu_rd_rdy; + ZXIC_UINT32 tmmu_qmu_sop_rd_rdy; +}DPP_ETM_TMMU_TMMU_STATES_0_T; + +typedef struct dpp_etm_tmmu_qmu_tmmu_wr_sop_cnt_t +{ + ZXIC_UINT32 qmu_tmmu_wr_sop_cnt; +}DPP_ETM_TMMU_QMU_TMMU_WR_SOP_CNT_T; + +typedef struct dpp_etm_tmmu_qmu_tmmu_wr_eop_cnt_t +{ + ZXIC_UINT32 qmu_tmmu_wr_eop_cnt; +}DPP_ETM_TMMU_QMU_TMMU_WR_EOP_CNT_T; + +typedef struct dpp_etm_tmmu_qmu_tmmu_wr_drop_cnt_t +{ + ZXIC_UINT32 qmu_tmmu_wr_drop_cnt; +}DPP_ETM_TMMU_QMU_TMMU_WR_DROP_CNT_T; + +typedef struct dpp_etm_tmmu_qmu_tmmu_wr_emem_cnt_t +{ + ZXIC_UINT32 qmu_tmmu_wr_emem_cnt; +}DPP_ETM_TMMU_QMU_TMMU_WR_EMEM_CNT_T; + +typedef struct dpp_etm_tmmu_qmu_tmmu_wr_imem_cnt_t +{ + ZXIC_UINT32 qmu_tmmu_wr_imem_cnt; +}DPP_ETM_TMMU_QMU_TMMU_WR_IMEM_CNT_T; + +typedef struct dpp_etm_tmmu_tmmu_mmu_wr_sop_cnt_t +{ + ZXIC_UINT32 tmmu_mmu_wr_sop_cnt; +}DPP_ETM_TMMU_TMMU_MMU_WR_SOP_CNT_T; + +typedef struct dpp_etm_tmmu_tmmu_mmu_wr_eop_cnt_t +{ + ZXIC_UINT32 tmmu_mmu_wr_eop_cnt; +}DPP_ETM_TMMU_TMMU_MMU_WR_EOP_CNT_T; + +typedef struct dpp_etm_tmmu_qmu_tmmu_rd_sop_cnt_t +{ + ZXIC_UINT32 qmu_tmmu_rd_sop_cnt; +}DPP_ETM_TMMU_QMU_TMMU_RD_SOP_CNT_T; + +typedef struct dpp_etm_tmmu_qmu_tmmu_rd_eop_cnt_t +{ + ZXIC_UINT32 qmu_tmmu_rd_eop_cnt; +}DPP_ETM_TMMU_QMU_TMMU_RD_EOP_CNT_T; + +typedef struct dpp_etm_tmmu_qmu_tmmu_rd_drop_cnt_t +{ + ZXIC_UINT32 qmu_tmmu_rd_drop_cnt; +}DPP_ETM_TMMU_QMU_TMMU_RD_DROP_CNT_T; + +typedef struct dpp_etm_tmmu_qmu_tmmu_rd_emem_cnt_t +{ + ZXIC_UINT32 qmu_tmmu_rd_emem_cnt; +}DPP_ETM_TMMU_QMU_TMMU_RD_EMEM_CNT_T; + +typedef struct dpp_etm_tmmu_qmu_tmmu_rd_imem_cnt_t +{ + ZXIC_UINT32 qmu_tmmu_rd_imem_cnt; +}DPP_ETM_TMMU_QMU_TMMU_RD_IMEM_CNT_T; + +typedef struct dpp_etm_tmmu_tmmu_mmu_rd_sop_cnt_t +{ + ZXIC_UINT32 tmmu_mmu_rd_sop_cnt; +}DPP_ETM_TMMU_TMMU_MMU_RD_SOP_CNT_T; + +typedef struct dpp_etm_tmmu_tmmu_mmu_rd_eop_cnt_t +{ + ZXIC_UINT32 tmmu_mmu_rd_eop_cnt; +}DPP_ETM_TMMU_TMMU_MMU_RD_EOP_CNT_T; + +typedef struct dpp_etm_tmmu_tmmu_odma_in_sop_cnt_t +{ + ZXIC_UINT32 tmmu_odma_in_sop_cnt; +}DPP_ETM_TMMU_TMMU_ODMA_IN_SOP_CNT_T; + +typedef struct dpp_etm_tmmu_tmmu_odma_in_eop_cnt_t +{ + ZXIC_UINT32 tmmu_odma_in_eop_cnt; +}DPP_ETM_TMMU_TMMU_ODMA_IN_EOP_CNT_T; + +typedef struct dpp_etm_tmmu_tmmu_odma_vld_cnt_t +{ + ZXIC_UINT32 tmmu_odma_vld_cnt; +}DPP_ETM_TMMU_TMMU_ODMA_VLD_CNT_T; + +typedef struct dpp_etm_tmmu_qmu_pd_in_cnt_t +{ + ZXIC_UINT32 qmu_pd_in_cnt; +}DPP_ETM_TMMU_QMU_PD_IN_CNT_T; + +typedef struct dpp_etm_tmmu_tmmu_pd_hit_cnt_t +{ + ZXIC_UINT32 tmmu_pd_hit_cnt; +}DPP_ETM_TMMU_TMMU_PD_HIT_CNT_T; + +typedef struct dpp_etm_tmmu_tmmu_pd_out_cnt_t +{ + ZXIC_UINT32 tmmu_pd_out_cnt; +}DPP_ETM_TMMU_TMMU_PD_OUT_CNT_T; + +typedef struct dpp_etm_tmmu_tmmu_wr_cmd_fifo_wr_cnt_t +{ + ZXIC_UINT32 tmmu_wr_cmd_fifo_wr_cnt; +}DPP_ETM_TMMU_TMMU_WR_CMD_FIFO_WR_CNT_T; + +typedef struct dpp_etm_tmmu_tmmu_imem_age_cnt_t +{ + ZXIC_UINT32 tmmu_imem_age_cnt; +}DPP_ETM_TMMU_TMMU_IMEM_AGE_CNT_T; + +typedef struct dpp_etm_tmmu_tmmu_cmdsch_rd_cnt_t +{ + ZXIC_UINT32 tmmu_cmdsch_rd_cnt; +}DPP_ETM_TMMU_TMMU_CMDSCH_RD_CNT_T; + +typedef struct dpp_etm_tmmu_tmmu_cmdsch_drop_cnt_t +{ + ZXIC_UINT32 tmmu_cmdsch_drop_cnt; +}DPP_ETM_TMMU_TMMU_CMDSCH_DROP_CNT_T; + +typedef struct dpp_etm_tmmu_tmmu_cmdsw_drop_cnt_t +{ + ZXIC_UINT32 tmmu_cmdsw_drop_cnt; +}DPP_ETM_TMMU_TMMU_CMDSW_DROP_CNT_T; + +typedef struct dpp_etm_tmmu_tmmu_odma_enq_rd_cnt_t +{ + ZXIC_UINT32 tmmu_odma_enq_rd_cnt; +}DPP_ETM_TMMU_TMMU_ODMA_ENQ_RD_CNT_T; + +typedef struct dpp_etm_tmmu_tmmu_odma_enq_drop_cnt_t +{ + ZXIC_UINT32 tmmu_odma_enq_drop_cnt; +}DPP_ETM_TMMU_TMMU_ODMA_ENQ_DROP_CNT_T; + +typedef struct dpp_etm_tmmu_tmmu_odma_imem_age_cnt_t +{ + ZXIC_UINT32 tmmu_odma_imem_age_cnt; +}DPP_ETM_TMMU_TMMU_ODMA_IMEM_AGE_CNT_T; + +typedef struct dpp_etm_tmmu_tmmu_odma_deq_rd_cnt_t +{ + ZXIC_UINT32 tmmu_odma_deq_rd_cnt; +}DPP_ETM_TMMU_TMMU_ODMA_DEQ_RD_CNT_T; + +typedef struct dpp_etm_tmmu_tmmu_odma_deq_drop_cnt_t +{ + ZXIC_UINT32 tmmu_odma_deq_drop_cnt; +}DPP_ETM_TMMU_TMMU_ODMA_DEQ_DROP_CNT_T; + +typedef struct dpp_etm_tmmu_olif_tmmu_xoff_cnt_t +{ + ZXIC_UINT32 olif_tmmu_xoff_cnt; +}DPP_ETM_TMMU_OLIF_TMMU_XOFF_CNT_T; + +typedef struct dpp_etm_tmmu_odma_tm_data_xoff_cnt_t +{ + ZXIC_UINT32 odma_tm_data_xoff_cnt; +}DPP_ETM_TMMU_ODMA_TM_DATA_XOFF_CNT_T; + +typedef struct dpp_etm_tmmu_tm_odma_pkt_xoff_cnt_t +{ + ZXIC_UINT32 tm_odma_pkt_xoff_cnt; +}DPP_ETM_TMMU_TM_ODMA_PKT_XOFF_CNT_T; + +typedef struct dpp_etm_tmmu_tm_state_3_t +{ + ZXIC_UINT32 tmmu_qmu_rdy_9; + ZXIC_UINT32 tmmu_qmu_rdy_8; +}DPP_ETM_TMMU_TM_STATE_3_T; + +typedef struct dpp_etm_tmmu_cfgmt_pd_cache_cmd_t +{ + ZXIC_UINT32 cfgmt_pd_cache_addr; +}DPP_ETM_TMMU_CFGMT_PD_CACHE_CMD_T; + +typedef struct dpp_etm_tmmu_cfgmt_pd_cache_rd_done_t +{ + ZXIC_UINT32 cfgmt_pd_cache_rd_done; +}DPP_ETM_TMMU_CFGMT_PD_CACHE_RD_DONE_T; + +typedef struct dpp_etm_tmmu_cfgmt_pd_cache_rd_data_0_t +{ + ZXIC_UINT32 cfgmt_pd_cache_rd_data_0; +}DPP_ETM_TMMU_CFGMT_PD_CACHE_RD_DATA_0_T; + +typedef struct dpp_etm_tmmu_cfgmt_pd_cache_rd_data_1_t +{ + ZXIC_UINT32 cfgmt_pd_cache_rd_data_1; +}DPP_ETM_TMMU_CFGMT_PD_CACHE_RD_DATA_1_T; + +typedef struct dpp_etm_tmmu_cfgmt_pd_cache_rd_data_2_t +{ + ZXIC_UINT32 cfgmt_pd_cache_rd_data_2; +}DPP_ETM_TMMU_CFGMT_PD_CACHE_RD_DATA_2_T; + +typedef struct dpp_etm_tmmu_cfgmt_pd_cache_rd_data_3_t +{ + ZXIC_UINT32 cfgmt_pd_cache_rd_data_3; +}DPP_ETM_TMMU_CFGMT_PD_CACHE_RD_DATA_3_T; + +typedef struct dpp_etm_tmmu_cfgmt_tmmu_to_odma_para_t +{ + ZXIC_UINT32 cfgmt_tmmu_to_odma_para; +}DPP_ETM_TMMU_CFGMT_TMMU_TO_ODMA_PARA_T; + +typedef struct dpp_etm_tmmu_cfgmt_dma_data_fifo_cnt_t +{ + ZXIC_UINT32 cfgmt_dma_data_fifo_cnt; +}DPP_ETM_TMMU_CFGMT_DMA_DATA_FIFO_CNT_T; + +typedef struct dpp_etm_tmmu_cfgmt_cache_tag_bit0_offset_t +{ + ZXIC_UINT32 cfgmt_cache_tag_bit0_offset; +}DPP_ETM_TMMU_CFGMT_CACHE_TAG_BIT0_OFFSET_T; + +typedef struct dpp_etm_tmmu_cfgmt_cache_tag_bit1_offset_t +{ + ZXIC_UINT32 cfgmt_cache_tag_bit1_offset; +}DPP_ETM_TMMU_CFGMT_CACHE_TAG_BIT1_OFFSET_T; + +typedef struct dpp_etm_tmmu_cfgmt_cache_tag_bit2_offset_t +{ + ZXIC_UINT32 cfgmt_cache_tag_bit2_offset; +}DPP_ETM_TMMU_CFGMT_CACHE_TAG_BIT2_OFFSET_T; + +typedef struct dpp_etm_tmmu_cfgmt_cache_tag_bit3_offset_t +{ + ZXIC_UINT32 cfgmt_cache_tag_bit3_offset; +}DPP_ETM_TMMU_CFGMT_CACHE_TAG_BIT3_OFFSET_T; + +typedef struct dpp_etm_tmmu_cfgmt_cache_tag_bit4_offset_t +{ + ZXIC_UINT32 cfgmt_cache_tag_bit4_offset; +}DPP_ETM_TMMU_CFGMT_CACHE_TAG_BIT4_OFFSET_T; + +typedef struct dpp_etm_tmmu_cfgmt_cache_tag_bit5_offset_t +{ + ZXIC_UINT32 cfgmt_cache_tag_bit5_offset; +}DPP_ETM_TMMU_CFGMT_CACHE_TAG_BIT5_OFFSET_T; + +typedef struct dpp_etm_tmmu_cfgmt_cache_index_bit0_offset_t +{ + ZXIC_UINT32 cfgmt_cache_index_bit0_offset; +}DPP_ETM_TMMU_CFGMT_CACHE_INDEX_BIT0_OFFSET_T; + +typedef struct dpp_etm_tmmu_cfgmt_cache_index_bit1_offset_t +{ + ZXIC_UINT32 cfgmt_cache_index_bit1_offset; +}DPP_ETM_TMMU_CFGMT_CACHE_INDEX_BIT1_OFFSET_T; + +typedef struct dpp_etm_tmmu_cfgmt_cache_index_bit2_offset_t +{ + ZXIC_UINT32 cfgmt_cache_index_bit2_offset; +}DPP_ETM_TMMU_CFGMT_CACHE_INDEX_BIT2_OFFSET_T; + +typedef struct dpp_etm_tmmu_cfgmt_cache_index_bit3_offset_t +{ + ZXIC_UINT32 cfgmt_cache_index_bit3_offset; +}DPP_ETM_TMMU_CFGMT_CACHE_INDEX_BIT3_OFFSET_T; + +typedef struct dpp_etm_tmmu_cfgmt_cache_index_bit4_offset_t +{ + ZXIC_UINT32 cfgmt_cache_index_bit4_offset; +}DPP_ETM_TMMU_CFGMT_CACHE_INDEX_BIT4_OFFSET_T; + +typedef struct dpp_etm_tmmu_cfgmt_cache_index_bit5_offset_t +{ + ZXIC_UINT32 cfgmt_cache_index_bit5_offset; +}DPP_ETM_TMMU_CFGMT_CACHE_INDEX_BIT5_OFFSET_T; + +typedef struct dpp_etm_tmmu_cfgmt_cache_index_bit6_offset_t +{ + ZXIC_UINT32 cfgmt_cache_index_bit6_offset; +}DPP_ETM_TMMU_CFGMT_CACHE_INDEX_BIT6_OFFSET_T; + +typedef struct dpp_etm_tmmu_cfgmt_cache_index_bit7_offset_t +{ + ZXIC_UINT32 cfgmt_cache_index_bit7_offset; +}DPP_ETM_TMMU_CFGMT_CACHE_INDEX_BIT7_OFFSET_T; + +typedef struct dpp_etm_tmmu_cfgmt_cache_index_bit8_offset_t +{ + ZXIC_UINT32 cfgmt_cache_index_bit8_offset; +}DPP_ETM_TMMU_CFGMT_CACHE_INDEX_BIT8_OFFSET_T; + +typedef struct dpp_etm_tmmu_cfgmt_cache_index_bit9_offset_t +{ + ZXIC_UINT32 cfgmt_cache_index_bit9_offset; +}DPP_ETM_TMMU_CFGMT_CACHE_INDEX_BIT9_OFFSET_T; + +typedef struct dpp_etm_tmmu_cfgmt_cache_index_bit10_offset_t +{ + ZXIC_UINT32 cfgmt_cache_index_bit10_offset; +}DPP_ETM_TMMU_CFGMT_CACHE_INDEX_BIT10_OFFSET_T; + +typedef struct dpp_etm_tmmu_cfgmt_cache_index_bit11_offset_t +{ + ZXIC_UINT32 cfgmt_cache_index_bit11_offset; +}DPP_ETM_TMMU_CFGMT_CACHE_INDEX_BIT11_OFFSET_T; + +typedef struct dpp_etm_tmmu_cfgmt_cache_index_bit12_offset_t +{ + ZXIC_UINT32 cfgmt_cache_index_bit12_offset; +}DPP_ETM_TMMU_CFGMT_CACHE_INDEX_BIT12_OFFSET_T; + +typedef struct dpp_etm_shap_bktfull_fifo_full_flagregister_t +{ + ZXIC_UINT32 bktfull_fifo_full_flag_core; +}DPP_ETM_SHAP_BKTFULL_FIFO_FULL_FLAGREGISTER_T; + +typedef struct dpp_etm_shap_fifo_full_regregister_t +{ + ZXIC_UINT32 fifo_full_reg; +}DPP_ETM_SHAP_FIFO_FULL_REGREGISTER_T; + +typedef struct dpp_etm_shap_fifo_empty_regregister_t +{ + ZXIC_UINT32 fifo_empty_reg; +}DPP_ETM_SHAP_FIFO_EMPTY_REGREGISTER_T; + +typedef struct dpp_etm_shap_fifo_almost_full_regregister_t +{ + ZXIC_UINT32 fifo_almost_full_reg; +}DPP_ETM_SHAP_FIFO_ALMOST_FULL_REGREGISTER_T; + +typedef struct dpp_etm_shap_fifo_almost_empty_regregister_t +{ + ZXIC_UINT32 fifo_almost_empty_reg; +}DPP_ETM_SHAP_FIFO_ALMOST_EMPTY_REGREGISTER_T; + +typedef struct dpp_etm_crdt_credit_space_select_t +{ + ZXIC_UINT32 credit_space_select; +}DPP_ETM_CRDT_CREDIT_SPACE_SELECT_T; + +typedef struct dpp_etm_crdt_stat_space_max_t +{ + ZXIC_UINT32 stat_space_max; +}DPP_ETM_CRDT_STAT_SPACE_MAX_T; + +typedef struct dpp_etm_crdt_stat_space_min_t +{ + ZXIC_UINT32 stat_space_min; +}DPP_ETM_CRDT_STAT_SPACE_MIN_T; + +typedef struct dpp_etm_crdt_stat_space_credit_t +{ + ZXIC_UINT32 stat_space_credit; +}DPP_ETM_CRDT_STAT_SPACE_CREDIT_T; + +typedef struct dpp_etm_crdt_stat_que_step8_credit_t +{ + ZXIC_UINT32 stat_que_step8_credit; +}DPP_ETM_CRDT_STAT_QUE_STEP8_CREDIT_T; + +typedef struct dpp_etm_crdt_special_que_t +{ + ZXIC_UINT32 special_que_id; +}DPP_ETM_CRDT_SPECIAL_QUE_T; + +typedef struct dpp_etm_crdt_special_que_credit_t +{ + ZXIC_UINT32 special_que_credit; +}DPP_ETM_CRDT_SPECIAL_QUE_CREDIT_T; + +typedef struct dpp_etm_crdt_lif_congest_credit_cnt_t +{ + ZXIC_UINT32 lif_congest_credit_cnt; +}DPP_ETM_CRDT_LIF_CONGEST_CREDIT_CNT_T; + +typedef struct dpp_etm_crdt_lif_port_congest_credit_cnt_t +{ + ZXIC_UINT32 lif_port_congest_credit_cnt; +}DPP_ETM_CRDT_LIF_PORT_CONGEST_CREDIT_CNT_T; + +typedef struct dpp_etm_crdt_crdt_congest_credit_cnt_t +{ + ZXIC_UINT32 crdt_congest_credit_cnt; +}DPP_ETM_CRDT_CRDT_CONGEST_CREDIT_CNT_T; + +typedef struct dpp_etm_crdt_crdt_port_congest_credit_cnt_t +{ + ZXIC_UINT32 crdt_port_congest_credit_cnt; +}DPP_ETM_CRDT_CRDT_PORT_CONGEST_CREDIT_CNT_T; + +typedef struct dpp_etm_crdt_congest_port_id_t +{ + ZXIC_UINT32 congest_port_id; +}DPP_ETM_CRDT_CONGEST_PORT_ID_T; + +typedef struct dpp_etm_crdt_dev_link_control_t +{ + ZXIC_UINT32 dev_link_control; +}DPP_ETM_CRDT_DEV_LINK_CONTROL_T; + +typedef struct dpp_etm_crdt_crdt_sa_port_rdy_t +{ + ZXIC_UINT32 crdt_sa_port_rdy; +}DPP_ETM_CRDT_CRDT_SA_PORT_RDY_T; + +typedef struct dpp_etm_crdt_crdt_congest_mode_select_t +{ + ZXIC_UINT32 crdt_congest_mode_selectr; +}DPP_ETM_CRDT_CRDT_CONGEST_MODE_SELECT_T; + +typedef struct dpp_etm_crdt_fifo_out_all_crs_normal_cnt_t +{ + ZXIC_UINT32 fifo_out_all_crs_normal_cnt; +}DPP_ETM_CRDT_FIFO_OUT_ALL_CRS_NORMAL_CNT_T; + +typedef struct dpp_etm_crdt_fifo_out_all_crs_off_cnt_t +{ + ZXIC_UINT32 fifo_out_all_crs_off_cnt; +}DPP_ETM_CRDT_FIFO_OUT_ALL_CRS_OFF_CNT_T; + +typedef struct dpp_etm_crdt_fifo_out_que_crs_normal_cnt_t +{ + ZXIC_UINT32 fifo_out_que_crs_normal_cnt; +}DPP_ETM_CRDT_FIFO_OUT_QUE_CRS_NORMAL_CNT_T; + +typedef struct dpp_etm_crdt_fifo_out_que_crs_off_cnt_t +{ + ZXIC_UINT32 fifo_out_que_crs_off_cnt; +}DPP_ETM_CRDT_FIFO_OUT_QUE_CRS_OFF_CNT_T; + +typedef struct dpp_etm_crdt_mode_add_60g_t +{ + ZXIC_UINT32 mode_add_60g; +}DPP_ETM_CRDT_MODE_ADD_60G_T; + +typedef struct dpp_etm_crdt_pp_token_add_t +{ + ZXIC_UINT32 pp_token_add_cir; +}DPP_ETM_CRDT_PP_TOKEN_ADD_T; + +typedef struct dpp_etm_crdt_pp_cir_token_total_dist_cnt_t +{ + ZXIC_UINT32 pp_cir_token_total_dist_counter; +}DPP_ETM_CRDT_PP_CIR_TOKEN_TOTAL_DIST_CNT_T; + +typedef struct dpp_etm_crdt_pp_cir_token_total_dec_cnt_t +{ + ZXIC_UINT32 pp_cir_token_total_dec_counter; +}DPP_ETM_CRDT_PP_CIR_TOKEN_TOTAL_DEC_CNT_T; + +typedef struct dpp_etm_crdt_dev_credit_cnt_t +{ + ZXIC_UINT32 dev_credit_cnt; +}DPP_ETM_CRDT_DEV_CREDIT_CNT_T; + +typedef struct dpp_etm_crdt_no_credit_cnt1_t +{ + ZXIC_UINT32 no_credit_cnt1; +}DPP_ETM_CRDT_NO_CREDIT_CNT1_T; + +typedef struct dpp_etm_crdt_no_credit_cnt2_t +{ + ZXIC_UINT32 no_credit_cnt2; +}DPP_ETM_CRDT_NO_CREDIT_CNT2_T; + +typedef struct dpp_etm_crdt_asm_interval_0_cfg_t +{ + ZXIC_UINT32 asm_interval_0_cfg; +}DPP_ETM_CRDT_ASM_INTERVAL_0_CFG_T; + +typedef struct dpp_etm_crdt_asm_interval_1_cfg_t +{ + ZXIC_UINT32 asm_interval_1_cfg; +}DPP_ETM_CRDT_ASM_INTERVAL_1_CFG_T; + +typedef struct dpp_etm_crdt_asm_interval_2_cfg_t +{ + ZXIC_UINT32 asm_interval_2_cfg; +}DPP_ETM_CRDT_ASM_INTERVAL_2_CFG_T; + +typedef struct dpp_etm_crdt_asm_interval_3_cfg_t +{ + ZXIC_UINT32 asm_interval_3_cfg; +}DPP_ETM_CRDT_ASM_INTERVAL_3_CFG_T; + +typedef struct dpp_etm_crdt_asm_interval_4_cfg_t +{ + ZXIC_UINT32 asm_interval_4_cfg; +}DPP_ETM_CRDT_ASM_INTERVAL_4_CFG_T; + +typedef struct dpp_etm_crdt_asm_interval_5cfg_t +{ + ZXIC_UINT32 asm_interval_5_cfg; +}DPP_ETM_CRDT_ASM_INTERVAL_5CFG_T; + +typedef struct dpp_etm_crdt_asm_interval_6_cfg_t +{ + ZXIC_UINT32 asm_interval_6_cfg; +}DPP_ETM_CRDT_ASM_INTERVAL_6_CFG_T; + +typedef struct dpp_etm_crdt_asm_interval_7_cfg_t +{ + ZXIC_UINT32 asm_interval_7_cfg; +}DPP_ETM_CRDT_ASM_INTERVAL_7_CFG_T; + +typedef struct dpp_etm_crdt_crdt_total_congest_mode_cfg_t +{ + ZXIC_UINT32 crdt_total_congest_mode_cfg; +}DPP_ETM_CRDT_CRDT_TOTAL_CONGEST_MODE_CFG_T; + +typedef struct dpp_etm_crdt_rci_fifo_ini_deep_cfg_t +{ + ZXIC_UINT32 rci_fifo_ini_deep_cfg; +}DPP_ETM_CRDT_RCI_FIFO_INI_DEEP_CFG_T; + +typedef struct dpp_etm_crdt_crdt_ecc_t +{ + ZXIC_UINT32 seinfo_wfq_single_ecc_err; + ZXIC_UINT32 seinfo_wfq_double_ecc_err; + ZXIC_UINT32 seinfo_fq_single_ecc_err; + ZXIC_UINT32 seinfo_fq_double_ecc_err; + ZXIC_UINT32 ecc_bypass; +}DPP_ETM_CRDT_CRDT_ECC_T; + +typedef struct dpp_etm_crdt_ucn_asm_rdy_shield_en_t +{ + ZXIC_UINT32 ucn_rdy_shield_en; + ZXIC_UINT32 asm_rdy_shield_en; +}DPP_ETM_CRDT_UCN_ASM_RDY_SHIELD_EN_T; + +typedef struct dpp_etm_crdt_ucn_asm_rdy_t +{ + ZXIC_UINT32 ucn_rdy; + ZXIC_UINT32 asm_rdy; +}DPP_ETM_CRDT_UCN_ASM_RDY_T; + +typedef struct dpp_etm_crdt_rci_grade_t +{ + ZXIC_UINT32 rci_grade; +}DPP_ETM_CRDT_RCI_GRADE_T; + +typedef struct dpp_etm_crdt_crdt_rci_value_r_t +{ + ZXIC_UINT32 crdt_rci_value_r; +}DPP_ETM_CRDT_CRDT_RCI_VALUE_R_T; + +typedef struct dpp_etm_crdt_crdt_interval_now_t +{ + ZXIC_UINT32 crdt_interval_now; +}DPP_ETM_CRDT_CRDT_INTERVAL_NOW_T; + +typedef struct dpp_etm_crdt_crs_sheild_flow_id_cfg_t +{ + ZXIC_UINT32 crs_sheild_flow_id_cfg; +}DPP_ETM_CRDT_CRS_SHEILD_FLOW_ID_CFG_T; + +typedef struct dpp_etm_crdt_crs_sheild_en_cfg_t +{ + ZXIC_UINT32 crs_sheild_en_cfg; +}DPP_ETM_CRDT_CRS_SHEILD_EN_CFG_T; + +typedef struct dpp_etm_crdt_crs_sheild_value_cfg_t +{ + ZXIC_UINT32 crs_sheild_value_cfg; +}DPP_ETM_CRDT_CRS_SHEILD_VALUE_CFG_T; + +typedef struct dpp_etm_crdt_test_token_calc_ctrl_t +{ + ZXIC_UINT32 test_token_calc_state; + ZXIC_UINT32 test_token_calc_trigger; +}DPP_ETM_CRDT_TEST_TOKEN_CALC_CTRL_T; + +typedef struct dpp_etm_crdt_test_token_sample_cycle_num_t +{ + ZXIC_UINT32 sample_cycle_num; +}DPP_ETM_CRDT_TEST_TOKEN_SAMPLE_CYCLE_NUM_T; + +typedef struct dpp_etm_crdt_q_state_0_7_t +{ + ZXIC_UINT32 q_token_state_7; + ZXIC_UINT32 q_token_state_6; + ZXIC_UINT32 q_token_state_5; + ZXIC_UINT32 q_token_state_4; + ZXIC_UINT32 q_token_state_3; + ZXIC_UINT32 q_token_state_2; + ZXIC_UINT32 q_token_state_1; + ZXIC_UINT32 q_token_state_0; +}DPP_ETM_CRDT_Q_STATE_0_7_T; + +typedef struct dpp_etm_crdt_q_state_8_15_t +{ + ZXIC_UINT32 q_token_state_15; + ZXIC_UINT32 q_token_state_14; + ZXIC_UINT32 q_token_state_13; + ZXIC_UINT32 q_token_state_12; + ZXIC_UINT32 q_token_state_11; + ZXIC_UINT32 q_token_state_10; + ZXIC_UINT32 q_token_state_9; + ZXIC_UINT32 q_token_state_8; +}DPP_ETM_CRDT_Q_STATE_8_15_T; + +typedef struct dpp_etm_qmu_csw_csch_rd_cmd_cnt_t +{ + ZXIC_UINT32 csw_csch_rd_cmd_cnt; +}DPP_ETM_QMU_CSW_CSCH_RD_CMD_CNT_T; + +typedef struct dpp_etm_qmu_csw_csch_rd_sop_cnt_t +{ + ZXIC_UINT32 csw_csch_rd_sop_cnt; +}DPP_ETM_QMU_CSW_CSCH_RD_SOP_CNT_T; + +typedef struct dpp_etm_qmu_csw_csch_rd_eop_cnt_t +{ + ZXIC_UINT32 csw_csch_rd_eop_cnt; +}DPP_ETM_QMU_CSW_CSCH_RD_EOP_CNT_T; + +typedef struct dpp_etm_qmu_csw_csch_rd_drop_cnt_t +{ + ZXIC_UINT32 csw_csch_rd_drop_cnt; +}DPP_ETM_QMU_CSW_CSCH_RD_DROP_CNT_T; + +typedef struct dpp_etm_qmu_csch_mmu_rd_cmd_cnt_t +{ + ZXIC_UINT32 csch_mmu_rd_cmd_cnt; +}DPP_ETM_QMU_CSCH_MMU_RD_CMD_CNT_T; + +typedef struct dpp_etm_qmu_csch_mmu_rd_sop_cnt_t +{ + ZXIC_UINT32 csch_mmu_rd_sop_cnt; +}DPP_ETM_QMU_CSCH_MMU_RD_SOP_CNT_T; + +typedef struct dpp_etm_qmu_csch_mmu_rd_eop_cnt_t +{ + ZXIC_UINT32 csch_mmu_rd_eop_cnt; +}DPP_ETM_QMU_CSCH_MMU_RD_EOP_CNT_T; + +typedef struct dpp_etm_qmu_csch_mmu_rd_drop_cnt_t +{ + ZXIC_UINT32 csch_mmu_rd_drop_cnt; +}DPP_ETM_QMU_CSCH_MMU_RD_DROP_CNT_T; + +typedef struct dpp_etm_qmu_qcfg_qsch_crs_filter_t +{ + ZXIC_UINT32 qcfg_qsch_crs_filter; +}DPP_ETM_QMU_QCFG_QSCH_CRS_FILTER_T; + +typedef struct dpp_etm_qmu_qcfg_qsch_crs_force_en_t +{ + ZXIC_UINT32 qcfg_qsch_crs_force_en; +}DPP_ETM_QMU_QCFG_QSCH_CRS_FORCE_EN_T; + +typedef struct dpp_etm_qmu_qcfg_qsch_crs_force_qnum_t +{ + ZXIC_UINT32 qcfg_qsch_crs_force_qnum; +}DPP_ETM_QMU_QCFG_QSCH_CRS_FORCE_QNUM_T; + +typedef struct dpp_etm_qmu_qcfg_qsch_crs_force_crs_t +{ + ZXIC_UINT32 qcfg_qsch_crs_force_crs; +}DPP_ETM_QMU_QCFG_QSCH_CRS_FORCE_CRS_T; + +typedef struct dpp_etm_qmu_cfgmt_oshp_sgmii_shap_mode_t +{ + ZXIC_UINT32 cfgmt_oshp_sgmii_shap_mode; +}DPP_ETM_QMU_CFGMT_OSHP_SGMII_SHAP_MODE_T; + +typedef struct dpp_etm_qmu_cfgmt_qmu_sashap_en_t +{ + ZXIC_UINT32 cfgmt_qmu_sashap_en; +}DPP_ETM_QMU_CFGMT_QMU_SASHAP_EN_T; + +typedef struct dpp_etm_qmu_cfgmt_sashap_token_max_t +{ + ZXIC_UINT32 cfgmt_sashap_token_max; +}DPP_ETM_QMU_CFGMT_SASHAP_TOKEN_MAX_T; + +typedef struct dpp_etm_qmu_cfgmt_sashap_token_min_t +{ + ZXIC_UINT32 cfgmt_sashap_token_min; +}DPP_ETM_QMU_CFGMT_SASHAP_TOKEN_MIN_T; + +typedef struct dpp_etm_qmu_cfg_qsch_q3lbaddrate_t +{ + ZXIC_UINT32 cfg_qsch_q3lbaddrate; +}DPP_ETM_QMU_CFG_QSCH_Q3LBADDRATE_T; + +typedef struct dpp_etm_qmu_cfg_qsch_q012lbaddrate_t +{ + ZXIC_UINT32 cfg_qsch_q012lbaddrate; +}DPP_ETM_QMU_CFG_QSCH_Q012LBADDRATE_T; + +typedef struct dpp_etm_qmu_cfg_qsch_q3creditlbmaxcnt_t +{ + ZXIC_UINT32 cfg_qsch_q3creditlbmaxcnt; +}DPP_ETM_QMU_CFG_QSCH_Q3CREDITLBMAXCNT_T; + +typedef struct dpp_etm_qmu_cfg_qsch_q012creditlbmaxcnt_t +{ + ZXIC_UINT32 cfg_qsch_q012creditlbmaxcnt; +}DPP_ETM_QMU_CFG_QSCH_Q012CREDITLBMAXCNT_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mul_token_gen_num_t +{ + ZXIC_UINT32 cfg_qsch_mul_token_gen_num; +}DPP_ETM_QMU_CFG_QSCH_MUL_TOKEN_GEN_NUM_T; + +typedef struct dpp_etm_qmu_cfg_qsch_q3_credit_lb_control_en_t +{ + ZXIC_UINT32 cfg_qsch_q3_credit_lb_control_en; +}DPP_ETM_QMU_CFG_QSCH_Q3_CREDIT_LB_CONTROL_EN_T; + +typedef struct dpp_etm_qmu_cfg_qsch_q012_credit_lb_control_en_t +{ + ZXIC_UINT32 cfg_qsch_q012_credit_lb_control_en; +}DPP_ETM_QMU_CFG_QSCH_Q012_CREDIT_LB_CONTROL_EN_T; + +typedef struct dpp_etm_qmu_cfg_qsch_sp_dwrr_en_t +{ + ZXIC_UINT32 cfg_qsch_sp_dwrr_en; +}DPP_ETM_QMU_CFG_QSCH_SP_DWRR_EN_T; + +typedef struct dpp_etm_qmu_cfg_qsch_q01_attach_en_t +{ + ZXIC_UINT32 cfg_qsch_q01_attach_en; +}DPP_ETM_QMU_CFG_QSCH_Q01_ATTACH_EN_T; + +typedef struct dpp_etm_qmu_cfg_qsch_w0_t +{ + ZXIC_UINT32 cfg_qsch_w0; +}DPP_ETM_QMU_CFG_QSCH_W0_T; + +typedef struct dpp_etm_qmu_cfg_qsch_w1_t +{ + ZXIC_UINT32 cfg_qsch_w1; +}DPP_ETM_QMU_CFG_QSCH_W1_T; + +typedef struct dpp_etm_qmu_cfg_qsch_w2_t +{ + ZXIC_UINT32 cfg_qsch_w2; +}DPP_ETM_QMU_CFG_QSCH_W2_T; + +typedef struct dpp_etm_qmu_cfg_qsch_lkybktmaxcnt1_t +{ + ZXIC_UINT32 cfg_qsch_lkybktmaxcnt1; +}DPP_ETM_QMU_CFG_QSCH_LKYBKTMAXCNT1_T; + +typedef struct dpp_etm_qmu_cfg_qsch_lkybktmaxcnt2_t +{ + ZXIC_UINT32 cfg_qsch_lkybktmaxcnt2; +}DPP_ETM_QMU_CFG_QSCH_LKYBKTMAXCNT2_T; + +typedef struct dpp_etm_qmu_cfg_qsch_lkybktdcrrate1_t +{ + ZXIC_UINT32 cfg_qsch_lkybktdcrrate1; +}DPP_ETM_QMU_CFG_QSCH_LKYBKTDCRRATE1_T; + +typedef struct dpp_etm_qmu_cfg_qsch_lkybktdcrrate2_t +{ + ZXIC_UINT32 cfg_qsch_lkybktdcrrate2; +}DPP_ETM_QMU_CFG_QSCH_LKYBKTDCRRATE2_T; + +typedef struct dpp_etm_qmu_cfg_qsch_lkybktdcrrate3_t +{ + ZXIC_UINT32 cfg_qsch_lkybktdcrrate3; +}DPP_ETM_QMU_CFG_QSCH_LKYBKTDCRRATE3_T; + +typedef struct dpp_etm_qmu_cfg_qsch_lkybktmaxcnt3_t +{ + ZXIC_UINT32 cfg_qsch_lkybktmaxcnt3; +}DPP_ETM_QMU_CFG_QSCH_LKYBKTMAXCNT3_T; + +typedef struct dpp_etm_qmu_cfg_qsch_qmu_mul_auto_sa_version_t +{ + ZXIC_UINT32 cfg_qsch_qmu_mul_auto_sa_version; +}DPP_ETM_QMU_CFG_QSCH_QMU_MUL_AUTO_SA_VERSION_T; + +typedef struct dpp_etm_qmu_cfg_qsch_sa_credit_value_0_t +{ + ZXIC_UINT32 cfg_qsch_sa_credit_value_0; +}DPP_ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_0_T; + +typedef struct dpp_etm_qmu_cfg_qsch_sa_credit_value_1_t +{ + ZXIC_UINT32 cfg_qsch_sa_credit_value_1; +}DPP_ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_1_T; + +typedef struct dpp_etm_qmu_cfg_qsch_sa_credit_value_2_t +{ + ZXIC_UINT32 cfg_qsch_sa_credit_value_2; +}DPP_ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_2_T; + +typedef struct dpp_etm_qmu_cfg_qsch_sa_credit_value_3_t +{ + ZXIC_UINT32 cfg_qsch_sa_credit_value_3; +}DPP_ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_3_T; + +typedef struct dpp_etm_qmu_cfg_qsch_sa_credit_value_4_t +{ + ZXIC_UINT32 cfg_qsch_sa_credit_value_4; +}DPP_ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_4_T; + +typedef struct dpp_etm_qmu_cfg_qsch_sa_credit_value_5_t +{ + ZXIC_UINT32 cfg_qsch_sa_credit_value_5; +}DPP_ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_5_T; + +typedef struct dpp_etm_qmu_cfg_qsch_sa_credit_value_6_t +{ + ZXIC_UINT32 cfg_qsch_sa_credit_value_6; +}DPP_ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_6_T; + +typedef struct dpp_etm_qmu_cfg_qsch_sa_credit_value_7_t +{ + ZXIC_UINT32 cfg_qsch_sa_credit_value_7; +}DPP_ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_7_T; + +typedef struct dpp_etm_qmu_cfg_qsch_remote_credit_fifo_almost_full_th_t +{ + ZXIC_UINT32 cfg_qsch_remote_credit_fifo_almost_full_th; +}DPP_ETM_QMU_CFG_QSCH_REMOTE_CREDIT_FIFO_ALMOST_FULL_TH_T; + +typedef struct dpp_etm_qmu_cfg_qsch_auto_credit_fifo_almost_full_th_t +{ + ZXIC_UINT32 cfg_qsch_auto_credit_fifo_almost_full_th; +}DPP_ETM_QMU_CFG_QSCH_AUTO_CREDIT_FIFO_ALMOST_FULL_TH_T; + +typedef struct dpp_etm_qmu_cfg_qsch_q3_credit_fifo_almost_full_th_t +{ + ZXIC_UINT32 cfg_qsch_q3_credit_fifo_almost_full_th; +}DPP_ETM_QMU_CFG_QSCH_Q3_CREDIT_FIFO_ALMOST_FULL_TH_T; + +typedef struct dpp_etm_qmu_cfg_qsch_q012_credit_fifo_almost_full_th_t +{ + ZXIC_UINT32 cfg_qsch_q012_credit_fifo_almost_full_th; +}DPP_ETM_QMU_CFG_QSCH_Q012_CREDIT_FIFO_ALMOST_FULL_TH_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mul_fc_res_en_t +{ + ZXIC_UINT32 cfg_qsch_mul_fc_res_en; +}DPP_ETM_QMU_CFG_QSCH_MUL_FC_RES_EN_T; + +typedef struct dpp_etm_qmu_cfgmt_mul_ovf_udf_flg_query_t +{ + ZXIC_UINT32 qsch_cfg_remote_credit_fifo_full; + ZXIC_UINT32 qsch_cfg_remote_credit_fifo_empty; + ZXIC_UINT32 qsch_cfg_remote_credit_fifo_overflow; + ZXIC_UINT32 qsch_cfg_remote_credit_fifo_underflow; + ZXIC_UINT32 qsch_cfg_auto_credit_fifo_full; + ZXIC_UINT32 qsch_cfg_auto_credit_fifo_empty; + ZXIC_UINT32 qsch_cfg_auto_credit_fifo_overflow; + ZXIC_UINT32 qsch_cfg_auto_credit_fifo_underflow; + ZXIC_UINT32 qsch_cfg_q3_credit_fifo_full; + ZXIC_UINT32 qsch_cfg_q3_credit_fifo_empty; + ZXIC_UINT32 qsch_cfg_q3_credit_fifo_overflow; + ZXIC_UINT32 qsch_cfg_q3_credit_fifo_underflow; + ZXIC_UINT32 qsch_cfg_q012_credit_fifo_full; + ZXIC_UINT32 qsch_cfg_q012_credit_fifo_empty; + ZXIC_UINT32 qsch_cfg_q012_credit_fifo_overflow; + ZXIC_UINT32 qsch_cfg_q012_credit_fifo_underflow; + ZXIC_UINT32 qsch_cfg_lkybktoverflow1; + ZXIC_UINT32 qsch_cfg_lkybktoverflow2; + ZXIC_UINT32 qsch_cfg_lkybktoverflow3; +}DPP_ETM_QMU_CFGMT_MUL_OVF_UDF_FLG_QUERY_T; + +typedef struct dpp_etm_qmu_cfgmt_mul_cng_flg_query_t +{ + ZXIC_UINT32 qsch_cfg_q3cngflag; + ZXIC_UINT32 qsch_cfg_q012cngflag; + ZXIC_UINT32 qsch_cfg_cngflag1; + ZXIC_UINT32 qsch_cfg_cngflag2; + ZXIC_UINT32 qsch_cfg_cngflag3; +}DPP_ETM_QMU_CFGMT_MUL_CNG_FLG_QUERY_T; + +typedef struct dpp_etm_qmu_qsch_cfg_lkybktval1_t +{ + ZXIC_UINT32 qsch_cfg_lkybktval1; +}DPP_ETM_QMU_QSCH_CFG_LKYBKTVAL1_T; + +typedef struct dpp_etm_qmu_qsch_cfg_lkybktval2_t +{ + ZXIC_UINT32 qsch_cfg_lkybktval2; +}DPP_ETM_QMU_QSCH_CFG_LKYBKTVAL2_T; + +typedef struct dpp_etm_qmu_qsch_cfg_lkybktval3_t +{ + ZXIC_UINT32 qsch_cfg_lkybktval3; +}DPP_ETM_QMU_QSCH_CFG_LKYBKTVAL3_T; + +typedef struct dpp_etm_qmu_qsch_cfg_q3lbval_t +{ + ZXIC_UINT32 qsch_cfg_q3lbval; +}DPP_ETM_QMU_QSCH_CFG_Q3LBVAL_T; + +typedef struct dpp_etm_qmu_qsch_cfg_q012lbval_t +{ + ZXIC_UINT32 qsch_cfg_q012lbval; +}DPP_ETM_QMU_QSCH_CFG_Q012LBVAL_T; + +typedef struct dpp_etm_qmu_qlist_cfgmt_ram_ecc_err2_t +{ + ZXIC_UINT32 qlist_imem_pd_ram_single_ecc_err; + ZXIC_UINT32 qlist_imem_pd_ram_double_ecc_err; + ZXIC_UINT32 qlist_imem_up_ptr_ram_single_ecc_err; + ZXIC_UINT32 qlist_imem_up_ptr_ram_double_ecc_err; + ZXIC_UINT32 qlist_imem_down_ptr_ram_single_ecc_err; + ZXIC_UINT32 qlist_imem_down_ptr_ram_double_ecc_err; + ZXIC_UINT32 cmdsw_sop_fifo_single_ecc_err; + ZXIC_UINT32 cmdsw_sop_fifo_double_ecc_err; + ZXIC_UINT32 cmdsw_nsop_fifo_single_ecc_err; + ZXIC_UINT32 cmdsw_nsop_fifo_double_ecc_err; + ZXIC_UINT32 cmdsw_mmudat_fifo_single_ecc_err; + ZXIC_UINT32 cmdsw_mmudat_fifo_double_ecc_err; + ZXIC_UINT32 qlist_rd_release_fwft_single_ecc_err; + ZXIC_UINT32 qlist_rd_release_fwft_double_ecc_err; + ZXIC_UINT32 qlist_drop_imem_fwft_single_ecc_err; + ZXIC_UINT32 qlist_drop_imem_fwft_double_ecc_err; +}DPP_ETM_QMU_QLIST_CFGMT_RAM_ECC_ERR2_T; + +typedef struct dpp_etm_qmu_csch_aged_cmd_cnt_t +{ + ZXIC_UINT32 csch_aged_cmd_cnt; +}DPP_ETM_QMU_CSCH_AGED_CMD_CNT_T; + +typedef struct dpp_etm_qmu_csch_qcfg_csch_congest_cnt_t +{ + ZXIC_UINT32 csch_qcfg_csch_congest_cnt; +}DPP_ETM_QMU_CSCH_QCFG_CSCH_CONGEST_CNT_T; + +typedef struct dpp_etm_qmu_csch_qcfg_qlist_csch_sop_cnt_t +{ + ZXIC_UINT32 csch_qcfg_qlist_csch_sop_cnt; +}DPP_ETM_QMU_CSCH_QCFG_QLIST_CSCH_SOP_CNT_T; + +typedef struct dpp_etm_qmu_csch_qcfg_qlist_csch_eop_cnt_t +{ + ZXIC_UINT32 csch_qcfg_qlist_csch_eop_cnt; +}DPP_ETM_QMU_CSCH_QCFG_QLIST_CSCH_EOP_CNT_T; + +typedef struct dpp_etm_qmu_csch_qcfg_csch_csw_sop_cnt_t +{ + ZXIC_UINT32 csch_qcfg_csch_csw_sop_cnt; +}DPP_ETM_QMU_CSCH_QCFG_CSCH_CSW_SOP_CNT_T; + +typedef struct dpp_etm_qmu_csch_qcfg_csch_csw_eop_cnt_t +{ + ZXIC_UINT32 csch_qcfg_csch_csw_eop_cnt; +}DPP_ETM_QMU_CSCH_QCFG_CSCH_CSW_EOP_CNT_T; + +typedef struct dpp_etm_qmu_csch_qcfg_qlist_csch_drop_cnt_t +{ + ZXIC_UINT32 csch_qcfg_qlist_csch_drop_cnt; +}DPP_ETM_QMU_CSCH_QCFG_QLIST_CSCH_DROP_CNT_T; + +typedef struct dpp_etm_qmu_csch_qcfg_csch_csw_drop_cnt_t +{ + ZXIC_UINT32 csch_qcfg_csch_csw_drop_cnt; +}DPP_ETM_QMU_CSCH_QCFG_CSCH_CSW_DROP_CNT_T; + +typedef struct dpp_etm_qmu_csw_mmu_sop_cmd_cnt_t +{ + ZXIC_UINT32 csw_mmu_sop_cmd_cnt; +}DPP_ETM_QMU_CSW_MMU_SOP_CMD_CNT_T; + +typedef struct dpp_etm_qmu_mmu_csw_sop_data_cnt_t +{ + ZXIC_UINT32 mmu_csw_sop_data_cnt; +}DPP_ETM_QMU_MMU_CSW_SOP_DATA_CNT_T; + +typedef struct dpp_etm_qmu_csw_qsch_feedb_cnt_t +{ + ZXIC_UINT32 csw_qsch_feedb_cnt; +}DPP_ETM_QMU_CSW_QSCH_FEEDB_CNT_T; + +typedef struct dpp_etm_qmu_qmu_crdt_port_fc_cnt_t +{ + ZXIC_UINT32 qmu_crdt_port_fc_cnt; +}DPP_ETM_QMU_QMU_CRDT_PORT_FC_CNT_T; + +typedef struct dpp_etm_qmu_csch_r_block_cnt_t +{ + ZXIC_UINT32 csch_r_block_cnt; +}DPP_ETM_QMU_CSCH_R_BLOCK_CNT_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_qds_head_rd_t +{ + ZXIC_UINT32 qcfg_qlist_qds_head_rd; +}DPP_ETM_QMU_QCFG_QLIST_QDS_HEAD_RD_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_qds_tail_rd_t +{ + ZXIC_UINT32 qcfg_qlist_qds_tail_rd; +}DPP_ETM_QMU_QCFG_QLIST_QDS_TAIL_RD_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_ept_rd_t +{ + ZXIC_UINT32 qcfg_qlist_ept_rd; +}DPP_ETM_QMU_QCFG_QLIST_EPT_RD_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_age_flag_rd_t +{ + ZXIC_UINT32 qcfg_qlist_age_flag_rd; +}DPP_ETM_QMU_QCFG_QLIST_AGE_FLAG_RD_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_cti_rd_t +{ + ZXIC_UINT32 qcfg_qlist_cti_rd; +}DPP_ETM_QMU_QCFG_QLIST_CTI_RD_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_cto_rd_t +{ + ZXIC_UINT32 qcfg_qlist_cto_rd; +}DPP_ETM_QMU_QCFG_QLIST_CTO_RD_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_chk_rd_t +{ + ZXIC_UINT32 qcfg_qlist_chk_rd; +}DPP_ETM_QMU_QCFG_QLIST_CHK_RD_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_nod_rd_t +{ + ZXIC_UINT32 qcfg_qlist_nod_rd; +}DPP_ETM_QMU_QCFG_QLIST_NOD_RD_T; + +typedef struct dpp_etm_qmu_qcfg_qlist_biu_rd_t +{ + ZXIC_UINT32 qcfg_qlist_biu_rd; +}DPP_ETM_QMU_QCFG_QLIST_BIU_RD_T; + +typedef struct dpp_etm_qmu_qsch_r_wlist_flag_t +{ + ZXIC_UINT32 qsch_r_wlist_flag; +}DPP_ETM_QMU_QSCH_R_WLIST_FLAG_T; + +typedef struct dpp_etm_qmu_qcfg_crs_flg_rd_t +{ + ZXIC_UINT32 qcfg_crs_flg_rd; +}DPP_ETM_QMU_QCFG_CRS_FLG_RD_T; + +typedef struct dpp_etm_qmu_cfgmt_qmu_imem_age_qds_t +{ + ZXIC_UINT32 cfgmt_qmu_imem_tp; + ZXIC_UINT32 cfgmt_qmu_imem_hp; +}DPP_ETM_QMU_CFGMT_QMU_IMEM_AGE_QDS_T; + +typedef struct dpp_etm_qmu_cfgmt_qmu_imem_age_qlen_t +{ + ZXIC_UINT32 cfgmt_qmu_imem_no_empty; + ZXIC_UINT32 cfgmt_qmu_imem_qlen; +}DPP_ETM_QMU_CFGMT_QMU_IMEM_AGE_QLEN_T; + +typedef struct dpp_etm_qmu_cfgmt_qmu_imem_pd_ram_low_t +{ + ZXIC_UINT32 cfgmt_qmu_imem_pd_ram_low; +}DPP_ETM_QMU_CFGMT_QMU_IMEM_PD_RAM_LOW_T; + +typedef struct dpp_etm_qmu_cfgmt_qmu_imem_pd_ram_high_t +{ + ZXIC_UINT32 cfgmt_qmu_imem_pd_ram_high; +}DPP_ETM_QMU_CFGMT_QMU_IMEM_PD_RAM_HIGH_T; + +typedef struct dpp_etm_qmu_cfgmt_qmu_imem_up_ptr_t +{ + ZXIC_UINT32 cfgmt_qmu_imem_up_ptr; +}DPP_ETM_QMU_CFGMT_QMU_IMEM_UP_PTR_T; + +typedef struct dpp_etm_qmu_cfgmt_qmu_imem_down_ptr_t +{ + ZXIC_UINT32 cfgmt_qmu_imem_down_ptr; +}DPP_ETM_QMU_CFGMT_QMU_IMEM_DOWN_PTR_T; + +typedef struct dpp_etm_qmu_cfgmt_qmu_imem_age_flag_t +{ + ZXIC_UINT32 cfgmt_qmu_imem_age_flag; +}DPP_ETM_QMU_CFGMT_QMU_IMEM_AGE_FLAG_T; + +typedef struct dpp_etm_qmu_cfg_qsch_lkybkt2cngth_t +{ + ZXIC_UINT32 cfg_qsch_lkybkt2cngth; +}DPP_ETM_QMU_CFG_QSCH_LKYBKT2CNGTH_T; + +typedef struct dpp_etm_qmu_cfg_qsch_lkybkt1cngth_t +{ + ZXIC_UINT32 cfg_qsch_lkybkt1cngth; +}DPP_ETM_QMU_CFG_QSCH_LKYBKT1CNGTH_T; + +typedef struct dpp_etm_qmu_cfg_qsch_lkybkt3cngth_t +{ + ZXIC_UINT32 cfg_qsch_lkybkt3cngth; +}DPP_ETM_QMU_CFG_QSCH_LKYBKT3CNGTH_T; + +typedef struct dpp_etm_qmu_cfg_qsch_rm_mul_mcn1_credit_value_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn1_credit_value; +}DPP_ETM_QMU_CFG_QSCH_RM_MUL_MCN1_CREDIT_VALUE_T; + +typedef struct dpp_etm_qmu_cfg_qsch_rm_mul_mcn2_credit_value_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn2_credit_value; +}DPP_ETM_QMU_CFG_QSCH_RM_MUL_MCN2_CREDIT_VALUE_T; + +typedef struct dpp_etm_qmu_cfg_qsch_rm_mul_mcn3_credit_value_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn3_credit_value; +}DPP_ETM_QMU_CFG_QSCH_RM_MUL_MCN3_CREDIT_VALUE_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn1_rand_ansr_seed_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn1_rand_mchsm_en; + ZXIC_UINT32 cfg_qsch_rm_mul_mcn1_rand_ansr_seed; +}DPP_ETM_QMU_RM_MUL_MCN1_RAND_ANSR_SEED_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn2_rand_ansr_seed_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn2_rand_mchsm_en; + ZXIC_UINT32 cfg_qsch_rm_mul_mcn2_rand_ansr_seed; +}DPP_ETM_QMU_RM_MUL_MCN2_RAND_ANSR_SEED_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn3_rand_ansr_seed_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn3_rand_mchsm_en; + ZXIC_UINT32 cfg_qsch_rm_mul_mcn3_rand_ansr_seed; +}DPP_ETM_QMU_RM_MUL_MCN3_RAND_ANSR_SEED_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn1_rand_ansr_th_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn1_rand_ansr_th; +}DPP_ETM_QMU_RM_MUL_MCN1_RAND_ANSR_TH_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn2_rand_ansr_th_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn2_rand_ansr_th; +}DPP_ETM_QMU_RM_MUL_MCN2_RAND_ANSR_TH_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn3_rand_ansr_th_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn3_rand_ansr_th; +}DPP_ETM_QMU_RM_MUL_MCN3_RAND_ANSR_TH_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn1_rand_hold_base_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn1_rand_mchsm_en; + ZXIC_UINT32 cfg_qsch_rm_mul_mcn1_rand_hold_base; +}DPP_ETM_QMU_RM_MUL_MCN1_RAND_HOLD_BASE_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn2_rand_hold_base_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn2_rand_mchsm_en; + ZXIC_UINT32 cfg_qsch_rm_mul_mcn2_rand_hold_base; +}DPP_ETM_QMU_RM_MUL_MCN2_RAND_HOLD_BASE_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn3_rand_hold_base_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn3_rand_mchsm_en; + ZXIC_UINT32 cfg_qsch_rm_mul_mcn3_rand_hold_base; +}DPP_ETM_QMU_RM_MUL_MCN3_RAND_HOLD_BASE_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn1_rand_sel_mask_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn1_rand_sel_mask; +}DPP_ETM_QMU_RM_MUL_MCN1_RAND_SEL_MASK_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn2_rand_sel_mask_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn2_rand_sel_mask; +}DPP_ETM_QMU_RM_MUL_MCN2_RAND_SEL_MASK_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn3_rand_sel_mask_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn3_rand_sel_mask; +}DPP_ETM_QMU_RM_MUL_MCN3_RAND_SEL_MASK_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn1_rand_sel_seed_reg0_t +{ + ZXIC_UINT32 rm_mul_mcn1_rand_sel_seed7; + ZXIC_UINT32 rm_mul_mcn1_rand_sel_seed6; + ZXIC_UINT32 rm_mul_mcn1_rand_sel_seed5; + ZXIC_UINT32 rm_mul_mcn1_rand_sel_seed4; + ZXIC_UINT32 rm_mul_mcn1_rand_sel_seed3; + ZXIC_UINT32 rm_mul_mcn1_rand_sel_seed2; + ZXIC_UINT32 rm_mul_mcn1_rand_sel_seed1; + ZXIC_UINT32 rm_mul_mcn1_rand_sel_seed0; +}DPP_ETM_QMU_RM_MUL_MCN1_RAND_SEL_SEED_REG0_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn1_rand_sel_seed_reg1_t +{ + ZXIC_UINT32 rm_mul_mcn1_rand_sel_seed8; +}DPP_ETM_QMU_RM_MUL_MCN1_RAND_SEL_SEED_REG1_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn2_rand_sel_seed_reg0_t +{ + ZXIC_UINT32 rm_mul_mcn2_rand_sel_seed7; + ZXIC_UINT32 rm_mul_mcn2_rand_sel_seed6; + ZXIC_UINT32 rm_mul_mcn2_rand_sel_seed5; + ZXIC_UINT32 rm_mul_mcn2_rand_sel_seed4; + ZXIC_UINT32 rm_mul_mcn2_rand_sel_seed3; + ZXIC_UINT32 rm_mul_mcn2_rand_sel_seed2; + ZXIC_UINT32 rm_mul_mcn2_rand_sel_seed1; + ZXIC_UINT32 rm_mul_mcn2_rand_sel_seed0; +}DPP_ETM_QMU_RM_MUL_MCN2_RAND_SEL_SEED_REG0_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn2_rand_sel_seed_reg1_t +{ + ZXIC_UINT32 rm_mul_mcn2_rand_sel_seed8; +}DPP_ETM_QMU_RM_MUL_MCN2_RAND_SEL_SEED_REG1_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn3_rand_sel_seed_reg0_t +{ + ZXIC_UINT32 rm_mul_mcn3_rand_sel_seed7; + ZXIC_UINT32 rm_mul_mcn3_rand_sel_seed6; + ZXIC_UINT32 rm_mul_mcn3_rand_sel_seed5; + ZXIC_UINT32 rm_mul_mcn3_rand_sel_seed4; + ZXIC_UINT32 rm_mul_mcn3_rand_sel_seed3; + ZXIC_UINT32 rm_mul_mcn3_rand_sel_seed2; + ZXIC_UINT32 rm_mul_mcn3_rand_sel_seed1; + ZXIC_UINT32 rm_mul_mcn3_rand_sel_seed0; +}DPP_ETM_QMU_RM_MUL_MCN3_RAND_SEL_SEED_REG0_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn3_rand_sel_seed_reg1_t +{ + ZXIC_UINT32 rm_mul_mcn3_rand_sel_seed8; +}DPP_ETM_QMU_RM_MUL_MCN3_RAND_SEL_SEED_REG1_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn1_step_wait_th1_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn1_step_wait_th1; +}DPP_ETM_QMU_RM_MUL_MCN1_STEP_WAIT_TH1_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn1_step_wait_th2_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn1_step_wait_th2; +}DPP_ETM_QMU_RM_MUL_MCN1_STEP_WAIT_TH2_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn1_step_wait_th3_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn1_step_wait_th3; +}DPP_ETM_QMU_RM_MUL_MCN1_STEP_WAIT_TH3_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn1_step_wait_th4_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn1_step_wait_th4; +}DPP_ETM_QMU_RM_MUL_MCN1_STEP_WAIT_TH4_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn1_step_wait_th5_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn1_step_wait_th5; +}DPP_ETM_QMU_RM_MUL_MCN1_STEP_WAIT_TH5_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn1_step_wait_th6_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn1_step_wait_th6; +}DPP_ETM_QMU_RM_MUL_MCN1_STEP_WAIT_TH6_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn1_step_wait_th7_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn1_step_wait_th7; +}DPP_ETM_QMU_RM_MUL_MCN1_STEP_WAIT_TH7_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn2_step_wait_th1_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn2_step_wait_th1; +}DPP_ETM_QMU_RM_MUL_MCN2_STEP_WAIT_TH1_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn2_step_wait_th2_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn2_step_wait_th2; +}DPP_ETM_QMU_RM_MUL_MCN2_STEP_WAIT_TH2_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn2_step_wait_th3_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn2_step_wait_th3; +}DPP_ETM_QMU_RM_MUL_MCN2_STEP_WAIT_TH3_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn2_step_wait_th4_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn2_step_wait_th4; +}DPP_ETM_QMU_RM_MUL_MCN2_STEP_WAIT_TH4_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn2_step_wait_th5_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn2_step_wait_th5; +}DPP_ETM_QMU_RM_MUL_MCN2_STEP_WAIT_TH5_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn2_step_wait_th6_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn2_step_wait_th6; +}DPP_ETM_QMU_RM_MUL_MCN2_STEP_WAIT_TH6_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn2_step_wait_th7_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn2_step_wait_th7; +}DPP_ETM_QMU_RM_MUL_MCN2_STEP_WAIT_TH7_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn3_step_wait_th1_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn3_step_wait_th1; +}DPP_ETM_QMU_RM_MUL_MCN3_STEP_WAIT_TH1_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn3_step_wait_th2_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn3_step_wait_th2; +}DPP_ETM_QMU_RM_MUL_MCN3_STEP_WAIT_TH2_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn3_step_wait_th3_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn3_step_wait_th3; +}DPP_ETM_QMU_RM_MUL_MCN3_STEP_WAIT_TH3_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn3_step_wait_th4_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn3_step_wait_th4; +}DPP_ETM_QMU_RM_MUL_MCN3_STEP_WAIT_TH4_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn3_step_wait_th5_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn3_step_wait_th5; +}DPP_ETM_QMU_RM_MUL_MCN3_STEP_WAIT_TH5_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn3_step_wait_th6_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn3_step_wait_th6; +}DPP_ETM_QMU_RM_MUL_MCN3_STEP_WAIT_TH6_T; + +typedef struct dpp_etm_qmu_rm_mul_mcn3step_wait_th7_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn3_step_wait_th7; +}DPP_ETM_QMU_RM_MUL_MCN3STEP_WAIT_TH7_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate0_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate0; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE0_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate1_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate1; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE1_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate2_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate2; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE2_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate3_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate3; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE3_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate4_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate4; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE4_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate5_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate5; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE5_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate6_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate6; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE6_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate7_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate7; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE7_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate8_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate8; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE8_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate9_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate9; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE9_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate10_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate10; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE10_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate11_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate11; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE11_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate12_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate12; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE12_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate13_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate13; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE13_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate14_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate14; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE14_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate15_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate15; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE15_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate16_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate16; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE16_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate17_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate17; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE17_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate18_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate18; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE18_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate19_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate19; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE19_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate20_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate20; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE20_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate21_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate21; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE21_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate22_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate22; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE22_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate23_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate23; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE23_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate24_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate24; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE24_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate25_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate25; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE25_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate26_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate26; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE26_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate27_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate27; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE27_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate28_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate28; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE28_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate29_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate29; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE29_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate30_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate30; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE30_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate31_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate31; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE31_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate32_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate32; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE32_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate33_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate33; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE33_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate34_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate34; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE34_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate35_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate35; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE35_T; + +typedef struct dpp_etm_qmu_cfg_qsch_mulcrdcntrate36_t +{ + ZXIC_UINT32 cfg_qsch_mulcrdcntrate36; +}DPP_ETM_QMU_CFG_QSCH_MULCRDCNTRATE36_T; + +typedef struct dpp_etm_qmu_cfg_qsch_rm_mul_mcn1_rand_hold_shift_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn1_rand_hold_shift; +}DPP_ETM_QMU_CFG_QSCH_RM_MUL_MCN1_RAND_HOLD_SHIFT_T; + +typedef struct dpp_etm_qmu_cfg_qsch_rm_mul_mcn2_rand_hold_shift_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn2_rand_hold_shift; +}DPP_ETM_QMU_CFG_QSCH_RM_MUL_MCN2_RAND_HOLD_SHIFT_T; + +typedef struct dpp_etm_qmu_cfg_qsch_rm_mul_mcn3_rand_hold_shift_t +{ + ZXIC_UINT32 cfg_qsch_rm_mul_mcn3_rand_hold_shift; +}DPP_ETM_QMU_CFG_QSCH_RM_MUL_MCN3_RAND_HOLD_SHIFT_T; + +typedef struct dpp_etm_qmu_last_drop_qnum_get_t +{ + ZXIC_UINT32 cgavd_qmu_drop_tap; + ZXIC_UINT32 last_drop_qnum; +}DPP_ETM_QMU_LAST_DROP_QNUM_GET_T; + +typedef struct dpp_etm_qmu_crdt_qmu_credit_cnt_t +{ + ZXIC_UINT32 crdt_qmu_credit_cnt; +}DPP_ETM_QMU_CRDT_QMU_CREDIT_CNT_T; + +typedef struct dpp_etm_qmu_qmu_to_qsch_report_cnt_t +{ + ZXIC_UINT32 qmu_to_qsch_report_cnt; +}DPP_ETM_QMU_QMU_TO_QSCH_REPORT_CNT_T; + +typedef struct dpp_etm_qmu_qmu_to_cgavd_report_cnt_t +{ + ZXIC_UINT32 qmu_to_cgavd_report_cnt; +}DPP_ETM_QMU_QMU_TO_CGAVD_REPORT_CNT_T; + +typedef struct dpp_etm_qmu_qmu_crdt_crs_normal_cnt_t +{ + ZXIC_UINT32 qmu_crdt_crs_normal_cnt; +}DPP_ETM_QMU_QMU_CRDT_CRS_NORMAL_CNT_T; + +typedef struct dpp_etm_qmu_qmu_crdt_crs_off_cnt_t +{ + ZXIC_UINT32 qmu_crdt_crs_off_cnt; +}DPP_ETM_QMU_QMU_CRDT_CRS_OFF_CNT_T; + +typedef struct dpp_etm_qmu_qsch_qlist_shedule_cnt_t +{ + ZXIC_UINT32 qsch_qlist_shedule_cnt; +}DPP_ETM_QMU_QSCH_QLIST_SHEDULE_CNT_T; + +typedef struct dpp_etm_qmu_qsch_qlist_sch_ept_cnt_t +{ + ZXIC_UINT32 qsch_qlist_sch_ept_cnt; +}DPP_ETM_QMU_QSCH_QLIST_SCH_EPT_CNT_T; + +typedef struct dpp_etm_qmu_qmu_to_mmu_blk_wr_cnt_t +{ + ZXIC_UINT32 qmu_to_mmu_blk_wr_cnt; +}DPP_ETM_QMU_QMU_TO_MMU_BLK_WR_CNT_T; + +typedef struct dpp_etm_qmu_qmu_to_csw_blk_rd_cnt_t +{ + ZXIC_UINT32 qmu_to_csw_blk_rd_cnt; +}DPP_ETM_QMU_QMU_TO_CSW_BLK_RD_CNT_T; + +typedef struct dpp_etm_qmu_qmu_to_mmu_sop_wr_cnt_t +{ + ZXIC_UINT32 qmu_to_mmu_sop_wr_cnt; +}DPP_ETM_QMU_QMU_TO_MMU_SOP_WR_CNT_T; + +typedef struct dpp_etm_qmu_qmu_to_mmu_eop_wr_cnt_t +{ + ZXIC_UINT32 qmu_to_mmu_eop_wr_cnt; +}DPP_ETM_QMU_QMU_TO_MMU_EOP_WR_CNT_T; + +typedef struct dpp_etm_qmu_qmu_to_mmu_drop_wr_cnt_t +{ + ZXIC_UINT32 qmu_to_mmu_drop_wr_cnt; +}DPP_ETM_QMU_QMU_TO_MMU_DROP_WR_CNT_T; + +typedef struct dpp_etm_qmu_qmu_to_csw_sop_rd_cnt_t +{ + ZXIC_UINT32 qmu_to_csw_sop_rd_cnt; +}DPP_ETM_QMU_QMU_TO_CSW_SOP_RD_CNT_T; + +typedef struct dpp_etm_qmu_qmu_to_csw_eop_rd_cnt_t +{ + ZXIC_UINT32 qmu_to_csw_eop_rd_cnt; +}DPP_ETM_QMU_QMU_TO_CSW_EOP_RD_CNT_T; + +typedef struct dpp_etm_qmu_qmu_to_csw_drop_rd_cnt_t +{ + ZXIC_UINT32 qmu_to_csw_drop_rd_cnt; +}DPP_ETM_QMU_QMU_TO_CSW_DROP_RD_CNT_T; + +typedef struct dpp_etm_qmu_mmu_to_qmu_wr_release_cnt_t +{ + ZXIC_UINT32 mmu_to_qmu_wr_release_cnt; +}DPP_ETM_QMU_MMU_TO_QMU_WR_RELEASE_CNT_T; + +typedef struct dpp_etm_qmu_mmu_to_qmu_rd_release_cnt_t +{ + ZXIC_UINT32 mmu_to_qmu_rd_release_cnt; +}DPP_ETM_QMU_MMU_TO_QMU_RD_RELEASE_CNT_T; + +typedef struct dpp_etm_qmu_observe_qnum_set_t +{ + ZXIC_UINT32 observe_qnum_set; +}DPP_ETM_QMU_OBSERVE_QNUM_SET_T; + +typedef struct dpp_etm_qmu_spec_q_pkt_received_t +{ + ZXIC_UINT32 spec_q_pkt_received; +}DPP_ETM_QMU_SPEC_Q_PKT_RECEIVED_T; + +typedef struct dpp_etm_qmu_spec_q_pkt_dropped_t +{ + ZXIC_UINT32 spec_q_pkt_dropped; +}DPP_ETM_QMU_SPEC_Q_PKT_DROPPED_T; + +typedef struct dpp_etm_qmu_spec_q_pkt_scheduled_t +{ + ZXIC_UINT32 spec_q_pkt_scheduled; +}DPP_ETM_QMU_SPEC_Q_PKT_SCHEDULED_T; + +typedef struct dpp_etm_qmu_spec_q_wr_cmd_sent_t +{ + ZXIC_UINT32 spec_q_wr_cmd_sent; +}DPP_ETM_QMU_SPEC_Q_WR_CMD_SENT_T; + +typedef struct dpp_etm_qmu_spec_q_rd_cmd_sent_t +{ + ZXIC_UINT32 spec_q_rd_cmd_sent; +}DPP_ETM_QMU_SPEC_Q_RD_CMD_SENT_T; + +typedef struct dpp_etm_qmu_spec_q_pkt_enq_t +{ + ZXIC_UINT32 spec_q_pkt_enq; +}DPP_ETM_QMU_SPEC_Q_PKT_ENQ_T; + +typedef struct dpp_etm_qmu_spec_q_pkt_deq_t +{ + ZXIC_UINT32 spec_q_pkt_deq; +}DPP_ETM_QMU_SPEC_Q_PKT_DEQ_T; + +typedef struct dpp_etm_qmu_spec_q_crdt_uncon_received_t +{ + ZXIC_UINT32 spec_q_crdt_uncon_received; +}DPP_ETM_QMU_SPEC_Q_CRDT_UNCON_RECEIVED_T; + +typedef struct dpp_etm_qmu_spec_q_crdt_cong_received_t +{ + ZXIC_UINT32 spec_q_crdt_cong_received; +}DPP_ETM_QMU_SPEC_Q_CRDT_CONG_RECEIVED_T; + +typedef struct dpp_etm_qmu_spec_q_crs_normal_cnt_t +{ + ZXIC_UINT32 spec_q_crs_normal_cnt; +}DPP_ETM_QMU_SPEC_Q_CRS_NORMAL_CNT_T; + +typedef struct dpp_etm_qmu_spec_q_crs_off_cnt_t +{ + ZXIC_UINT32 spec_q_crs_off_cnt; +}DPP_ETM_QMU_SPEC_Q_CRS_OFF_CNT_T; + +typedef struct dpp_etm_qmu_observe_batch_set_t +{ + ZXIC_UINT32 observe_batch_set; +}DPP_ETM_QMU_OBSERVE_BATCH_SET_T; + +typedef struct dpp_etm_qmu_spec_bat_pkt_received_t +{ + ZXIC_UINT32 spec_bat_pkt_received; +}DPP_ETM_QMU_SPEC_BAT_PKT_RECEIVED_T; + +typedef struct dpp_etm_qmu_spec_bat_pkt_dropped_t +{ + ZXIC_UINT32 spec_bat_pkt_dropped; +}DPP_ETM_QMU_SPEC_BAT_PKT_DROPPED_T; + +typedef struct dpp_etm_qmu_spec_bat_blk_scheduled_t +{ + ZXIC_UINT32 spec_bat_blk_scheduled; +}DPP_ETM_QMU_SPEC_BAT_BLK_SCHEDULED_T; + +typedef struct dpp_etm_qmu_spec_bat_wr_cmd_sent_t +{ + ZXIC_UINT32 spec_bat_wr_cmd_sent; +}DPP_ETM_QMU_SPEC_BAT_WR_CMD_SENT_T; + +typedef struct dpp_etm_qmu_spec_bat_rd_cmd_sent_t +{ + ZXIC_UINT32 spec_bat_rd_cmd_sent; +}DPP_ETM_QMU_SPEC_BAT_RD_CMD_SENT_T; + +typedef struct dpp_etm_qmu_spec_bat_pkt_enq_t +{ + ZXIC_UINT32 spec_bat_pkt_enq; +}DPP_ETM_QMU_SPEC_BAT_PKT_ENQ_T; + +typedef struct dpp_etm_qmu_spec_bat_pkt_deq_t +{ + ZXIC_UINT32 spec_bat_pkt_deq; +}DPP_ETM_QMU_SPEC_BAT_PKT_DEQ_T; + +typedef struct dpp_etm_qmu_spec_bat_crdt_uncon_received_t +{ + ZXIC_UINT32 spec_bat_crdt_uncon_received; +}DPP_ETM_QMU_SPEC_BAT_CRDT_UNCON_RECEIVED_T; + +typedef struct dpp_etm_qmu_spec_bat_crdt_cong_received_t +{ + ZXIC_UINT32 spec_bat_crdt_cong_received; +}DPP_ETM_QMU_SPEC_BAT_CRDT_CONG_RECEIVED_T; + +typedef struct dpp_etm_qmu_spec_bat_crs_normal_cnt_t +{ + ZXIC_UINT32 spec_bat_crs_normal_cnt; +}DPP_ETM_QMU_SPEC_BAT_CRS_NORMAL_CNT_T; + +typedef struct dpp_etm_qmu_spec_bat_crs_off_cnt_t +{ + ZXIC_UINT32 spec_bat_crs_off_cnt; +}DPP_ETM_QMU_SPEC_BAT_CRS_OFF_CNT_T; + +typedef struct dpp_etm_qmu_bcntm_ovfl_qnum_get_t +{ + ZXIC_UINT32 bcntm_ovfl_qnum_get; +}DPP_ETM_QMU_BCNTM_OVFL_QNUM_GET_T; + +typedef struct dpp_etm_qmu_crbal_a_ovf_qnum_get_t +{ + ZXIC_UINT32 crbal_a_ovf_qnum_get; +}DPP_ETM_QMU_CRBAL_A_OVF_QNUM_GET_T; + +typedef struct dpp_etm_qmu_crbal_b_ovf_qnum_get_t +{ + ZXIC_UINT32 crbal_b_ovf_qnum_get; +}DPP_ETM_QMU_CRBAL_B_OVF_QNUM_GET_T; + +typedef struct dpp_etm_qmu_crbal_drop_qnum_get_t +{ + ZXIC_UINT32 crbal_drop_qnum_get; +}DPP_ETM_QMU_CRBAL_DROP_QNUM_GET_T; + +typedef struct dpp_etm_qmu_deq_flg_report_cnt_t +{ + ZXIC_UINT32 deq_flg_report_cnt; +}DPP_ETM_QMU_DEQ_FLG_REPORT_CNT_T; + +typedef struct dpp_etm_qmu_spec_q_crs_get_t +{ + ZXIC_UINT32 spec_q_crs_get; +}DPP_ETM_QMU_SPEC_Q_CRS_GET_T; + +typedef struct dpp_etm_qmu_spec_q_crs_in_get_t +{ + ZXIC_UINT32 spec_q_crs_in_get; +}DPP_ETM_QMU_SPEC_Q_CRS_IN_GET_T; + +typedef struct dpp_etm_qmu_spec_q_crs_flg_csol_get_t +{ + ZXIC_UINT32 spec_q_crs_flg_csol_get; +}DPP_ETM_QMU_SPEC_Q_CRS_FLG_CSOL_GET_T; + +typedef struct dpp_etm_qmu_ept_sch_qnum_get_t +{ + ZXIC_UINT32 ept_sch_qnum_get; +}DPP_ETM_QMU_EPT_SCH_QNUM_GET_T; + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_mem_info.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_mem_info.h new file mode 100755 index 0000000..ddf091f --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_mem_info.h @@ -0,0 +1,66 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_mem.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : 王春雷 +* 完成日期 : 2014/03/20 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef _DPP_MEM_H_ +#define _DPP_MEM_H_ + +#ifdef __cplusplus +extern "C"{ +#endif + +typedef enum dpp_mem_no_e +{ + PKTRX_PHYPORT_UDF_ATTRIm = 0, + PKTRX_PHYPORT_HDW_ATTRIm = 1, + PKTRX_PHYPORT_FLOW_PCm = 2, + PKTRX_ICU_TCAMm = 3, + PKTRX_FLOWNUM_TCAMm = 4, +}DPP_MEM_NO_E; + +typedef struct dpp_mem_field_t +{ + ZXIC_SINT8 *p_name; /* 字段名 */ + ZXIC_UINT32 flags; /* 标志位 */ + ZXIC_UINT16 msb_pos; /* 最高比特位置,以寄存器列表为准*/ + ZXIC_UINT16 len; /* 字段长度,以比特为单位 */ +}DPP_MEM_FIELD_T; + + +#define DPP_MEM_FLAG_TCAM (1<<0) /* Tcam类型的表 */ +typedef struct dpp_mem_info_t +{ + ZXIC_UINT32 mem_no; + ZXIC_UINT32 module_no; + ZXIC_UINT32 flags; + ZXIC_UINT32 mem_id; /* 模块内部的mem标识 */ + ZXIC_UINT32 index_min; /* 最小索引值 */ + ZXIC_UINT32 index_max; /* 最大索引值 */ + ZXIC_UINT32 width; /* 表项宽度,以字节为单位 */ + + DPP_MEM_FIELD_T *p_fileds; /* 表项所有字段 */ + +}DPP_MEM_INFO_T; + +#ifdef __cplusplus +} +#endif + +#endif + + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_module.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_module.h new file mode 100755 index 0000000..7c48381 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_module.h @@ -0,0 +1,214 @@ +#ifndef _DPP_MODULE_H_ +#define _DPP_MODULE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "zxic_common.h" +#include "dpp_dev.h" +#include "dpp_type_api.h" + +/** for PPU*/ +#ifdef DPP_TEST_BAORD_SSP2T +#define DPP_PPU_CLUSTER_NUM (1) +#else +#define DPP_PPU_CLUSTER_NUM (6) +#endif + +#define DPP_PPU_ME_EXCEPTION_MAX (8) +#define DPP_PPU_CLUSTER_MEPERCLS_NUM (8) +#define DPP_PPU_CLUSTER_SPACE_SIZE (0x00008000) +#define DPP_MAX_CHCHK_NUM (50) + +#define DPP_TRPG_PORT_NUM (32) +#define DPP_TRPG_PORT_SPACE_SIZE (0x10000) + +#define DPP_TRPG_RAM_NUM (16) +#define DPP_TRPG_RAM_SPACE_SIZE (0x10000) + +#define DPP_TSN_PORT_NUM (4) +#define DPP_TSN_PORT_SPACE_SIZE (0x4000) + +typedef enum dpp_module_e +{ + CFG = 1, /**< @brief 1*/ + NPPU, /**< @brief 2*/ + PPU, /**< @brief 3*/ + ETM, /**< @brief 4*/ + STAT, /**< @brief 5*/ + CAR, /**< @brief 6*/ + SE, /**< @brief 7*/ + SMMU0 = SE, /**< @brief 7*/ + SMMU1 = SE, /**< @brief 7*/ + DTB, /**< @brief 8*/ + TRPG , /**< @brief 9*/ + TSN , /**< @brief 10*/ + AXI , /**< @brief 11*/ + PTPTM , /**< @brief 12*/ + DTB4K, /**< @brief 13*/ + STAT4K, /**< @brief 14*/ + PPU4K, /**< @brief 15*/ + SE4K, /**< @brief 16*/ + SMMU14K, /**< @brief 17*/ + MODULE_MAX +} DPP_MODULE_E; + +typedef enum module_tm_e +{ + MODULE_TM_CFGMT = 0, + MODULE_TM_OLIF = 1, + MODULE_TM_CGAVD = 2, + MODULE_TM_TMMU = 3, + MODULE_TM_SHAP = 4, + MODULE_TM_CRDT = 5, + MODULE_TM_QMU = 6, + MODULE_TM_MAX +} MODULE_TM_E; + +/*NP 在PICE中的偏移地址*/ +#define SYS_VF_NP_BASE_OFFSET 0X0000000000 +/*NP 在DPU中的基地址*/ + +#if DPP_DEV_VPCI_EN +#define SYS_NP_BASE_ADDR 0x6300000000 +#define SYS_NP_BASE_ADDR0 0x14000000 +#define SYS_NP_BASE_ADDR1 0x16000000 +#else +#define SYS_NP_BASE_ADDR 0x6218000000 +#define SYS_NP_BASE_ADDR0 0x00000000 +#define SYS_NP_BASE_ADDR1 0x02000000 +#endif + +/** sub system base address*/ +typedef enum sys_base_addr_e +{ + SYS_NPPU_BASE_ADDR = (SYS_NP_BASE_ADDR0 + 0x00000000), + SYS_PPU_BASE_ADDR = (SYS_NP_BASE_ADDR0 + 0x00080000), + SYS_ETM_BASE_ADDR = (SYS_NP_BASE_ADDR0 + 0x00180000), + SYS_STAT_BASE_ADDR = (SYS_NP_BASE_ADDR0 + 0x00200000), + SYS_SE_BASE_ADDR = (SYS_NP_BASE_ADDR0 + 0x00280000), + SYS_SE_SMMU0_BASE_ADDR = (SYS_NP_BASE_ADDR0 + 0x00300000), + SYS_SE_SMMU1_BASE_ADDR = (SYS_NP_BASE_ADDR0 + 0x00310000), +// SYS_TRPG_BASE_ADDR = (SYS_NP_BASE_ADDR0 + 0x00320000), + SYS_CFG_BASE_ADDR = (SYS_NP_BASE_ADDR0 + 0x00330000), + SYS_PTP0_BASE_ADDR = (SYS_NP_BASE_ADDR0 + 0x00340000), + SYS_PTP1_BASE_ADDR = (SYS_NP_BASE_ADDR0 + 0x00344000), + SYS_TSN_BASE_ADDR = (SYS_NP_BASE_ADDR0 + 0x00350000), + SYS_TRPG_BASE_ADDR = (SYS_NP_BASE_ADDR0 + 0x00400000), + + SYS_DTB_BASE_ADDR = (SYS_NP_BASE_ADDR1 + 0x00000000), + SYS_AXIM0_BASE_ADDR = (SYS_NP_BASE_ADDR1 + 0x01400000), + SYS_AXIM1_BASE_ADDR = (SYS_NP_BASE_ADDR1 + 0x01408000), + SYS_AXI_CONV_BASE_ADDR = (SYS_NP_BASE_ADDR1 + 0x01410000), + SYS_AXIS_BASE_ADDR = (SYS_NP_BASE_ADDR1 + 0x01418000), + SYS_TLB_BASE_ADDR = (SYS_NP_BASE_ADDR1 + 0x01420000), + + SYS_MAX_BASE_ADDR = 0x20000000, +} SYS_BASE_ADDR_E; + +/** module base address*/ +typedef enum module_base_addr_e +{ + /* CFG */ + MODULE_CFG_PCIE_BASE_ADDR = 0x00000000, + MODULE_CFG_DMA_BASE_ADDR = 0x00001000, + MODULE_CFG_CSR_BASE_ADDR = 0x00003000, + + /* NPPU */ + MODULE_NPPU_MR_CFG_BASE_ADDR = 0x00000000, + MODULE_NPPU_PKTRX_CFG_BASE_ADDR = 0x00000800, + MODULE_NPPU_PKTRX_STAT_BASE_ADDR = 0x00001000, + MODULE_NPPU_IDMA_CFG_BASE_ADDR = 0x00001800, + MODULE_NPPU_IDMA_STAT_BASE_ADDR = 0x00002000, + MODULE_NPPU_PBU_CFG_BASE_ADDR = 0x00002800, + MODULE_NPPU_PBU_STAT_BASE_ADDR = 0x00003000, + MODULE_NPPU_ISU_CFG_BASE_ADDR = 0x00003800, + MODULE_NPPU_ISU_STAT_BASE_ADDR = 0x00004000, + MODULE_NPPU_ODMA_CFG_BASE_ADDR = 0x00004800, + MODULE_NPPU_ODMA_STAT_BASE_ADDR = 0x00005000, + MODULE_NPPU_OAM_CFG_BASE_ADDR = 0x00005800, + MODULE_NPPU_OAM_STAT_BASE_ADDR = 0x00006000, + MODULE_NPPU_OAM_INT_IDX0_BASE_ADDR = 0x00006800, + MODULE_NPPU_OAM_INT_IDX1_BASE_ADDR = 0x00007000, + + /* PPU */ + MODULE_PPU_CSR_BASE_ADDR = 0x00000000, + MODULE_PPU_DBG_BASE_ADDR = 0x00000800, + MODULE_CLUSTER0_BASE_ADDR = 0x00008000, + MODULE_CLUSTER1_BASE_ADDR = 0x00010000, + MODULE_CLUSTER2_BASE_ADDR = 0x00018000, + MODULE_CLUSTER3_BASE_ADDR = 0x00020000, + + /* TM */ + MODULE_TM_CFGMT_BASE_ADDR = 0x00000000, + MODULE_TM_OLIF_BASE_ADDR = 0x00020000, + MODULE_TM_CGAVD_BASE_ADDR = 0x00030000, + MODULE_TM_TMMU_BASE_ADDR = 0x00040000, + MODULE_TM_SHAP_BASE_ADDR = 0x00050000, + MODULE_TM_CRDT_BASE_ADDR = 0x00060000, + MODULE_TM_QMU_BASE_ADDR = 0x00070000, + + /* STAT */ + MODULE_STAT_CAR0_BASE_ADDR = 0x00000000, + MODULE_STAT_ETCAM_BASE_ADDR = 0x00002000, + MODULE_STAT_GLBL_BASE_ADDR = 0x00003000, + + /* SE */ + MODULE_SE_ALG_BASE_ADDR = 0x00000000, + MODULE_SE_KSCHD_BASE_ADDR = 0x00004000, + MODULE_SE_RSCHD_BASE_ADDR = 0x00008000, + MODULE_SE_PARSER_BASE_ADDR = 0x0000c000, + MODULE_SE_AS_BASE_ADDR = 0x00010000, + MODULE_SE_CFG_BASE_ADDR = 0x00014000, + + /* SMMU0 */ + MODULE_SE_SMMU0_BASE_ADDR = 0x00000000, + + /* SMMU1 */ + MODULE_SE_SMMU1_BASE_ADDR = 0x00000000, + MODULE_SE_CMMU_BASE_ADDR = 0x00004000, + + /* DTB */ + MODULE_DTB_ENQ_BASE_ADDR = 0x00000000, + MODULE_DTB_CFG_BASE_ADDR = 0x01000000, + MODULE_DTB_DDOS_BASE_ADDR = 0x01010000, + MODULE_DTB_RAM_BASE_ADDR = 0x01100000, + + /* TRPG */ + MODULE_TRPG_RX_BASE_ADDR = 0x00000000, + MODULE_TRPG_TX_BASE_ADDR = 0x00400000, + MODULE_TRPG_TX_GLB_BASE_ADDR = 0x00600000, + MODULE_TRPG_TX_ETM_PORT_BASE_ADDR = 0x00610000, + MODULE_TRPG_RX_RAM_BASE_ADDR = 0x00200000, + MODULE_TRPG_TX_RAM_BASE_ADDR = 0x00620000, + MODULE_TRPG_TX_ETM_RAM_BASE_ADDR = 0x00710000, + MODULE_TRPG_TX_TODTIME_RAM_BASE_ADDR = 0x00720000, + + + + /* TSN */ + MODULE_TSN_PORT0_BASE_ADDR = 0x00000000, + MODULE_TSN_PORT1_BASE_ADDR = 0x00004000, + MODULE_TSN_PORT2_BASE_ADDR = 0x00008000, + MODULE_TSN_PORT3_BASE_ADDR = 0x0000C000, + +} MODULE_BASE_ADDR_E; + +DPP_STATUS dpp_read(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 *p_data); +DPP_STATUS dpp_write(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 *p_data); + +DPP_STATUS dpp_se_read(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 *p_data); +DPP_STATUS dpp_se_write(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 *p_data); + +DPP_STATUS dpp_se_alg_read(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 *p_data); +DPP_STATUS dpp_se_alg_write(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 *p_data); + +DPP_STATUS dpp_ppu_read(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 *p_data); +DPP_STATUS dpp_ppu_write(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 *p_data); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_nppu_reg.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_nppu_reg.h new file mode 100644 index 0000000..38d6667 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_nppu_reg.h @@ -0,0 +1,3850 @@ + +#ifndef _DPP_NPPU_REG_H_ +#define _DPP_NPPU_REG_H_ + +#ifdef __cplusplus +extern "C"{ +#endif + +typedef struct dpp_nppu_mr_cfg_cfg_shap_param_t +{ + ZXIC_UINT32 shap_en; + ZXIC_UINT32 shap_rate; +}DPP_NPPU_MR_CFG_CFG_SHAP_PARAM_T; + +typedef struct dpp_nppu_mr_cfg_cfg_shap_token_t +{ + ZXIC_UINT32 cfg_shap_plen_offset; + ZXIC_UINT32 cfg_shap_token; +}DPP_NPPU_MR_CFG_CFG_SHAP_TOKEN_T; + +typedef struct dpp_nppu_mr_cfg_idle_ptr_fifo_aful_th_t +{ + ZXIC_UINT32 idle_ptr3_fifo_aful_th; + ZXIC_UINT32 idle_ptr2_fifo_aful_th; + ZXIC_UINT32 idle_ptr1_fifo_aful_th; + ZXIC_UINT32 idle_ptr0_fifo_aful_th; +}DPP_NPPU_MR_CFG_IDLE_PTR_FIFO_AFUL_TH_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos_port_cfg_t +{ + ZXIC_UINT32 cos3_port_cfg; + ZXIC_UINT32 cos2_port_cfg; + ZXIC_UINT32 cos1_port_cfg; + ZXIC_UINT32 cos0_port_cfg; +}DPP_NPPU_MR_CFG_MR_COS_PORT_CFG_T; + +typedef struct dpp_nppu_pktrx_cfg_ind_status_t +{ + ZXIC_UINT32 ind_access_done; +}DPP_NPPU_PKTRX_CFG_IND_STATUS_T; + +typedef struct dpp_nppu_pktrx_cfg_ind_cmd_t +{ + ZXIC_UINT32 ind_rd_or_wr; + ZXIC_UINT32 ind_mem_id; + ZXIC_UINT32 ind_mem_addr; +}DPP_NPPU_PKTRX_CFG_IND_CMD_T; + +typedef struct dpp_nppu_pktrx_cfg_ind_data0_t +{ + ZXIC_UINT32 ind_dat0; +}DPP_NPPU_PKTRX_CFG_IND_DATA0_T; + +typedef struct dpp_nppu_pktrx_cfg_ind_data1_t +{ + ZXIC_UINT32 ind_dat1; +}DPP_NPPU_PKTRX_CFG_IND_DATA1_T; + +typedef struct dpp_nppu_pktrx_cfg_ind_data2_t +{ + ZXIC_UINT32 ind_dat2; +}DPP_NPPU_PKTRX_CFG_IND_DATA2_T; + +typedef struct dpp_nppu_pktrx_cfg_ind_data3_t +{ + ZXIC_UINT32 ind_dat3; +}DPP_NPPU_PKTRX_CFG_IND_DATA3_T; + +typedef struct dpp_nppu_pktrx_cfg_ind_data4_t +{ + ZXIC_UINT32 ind_dat4; +}DPP_NPPU_PKTRX_CFG_IND_DATA4_T; + +typedef struct dpp_nppu_pktrx_cfg_ind_data5_t +{ + ZXIC_UINT32 ind_dat5; +}DPP_NPPU_PKTRX_CFG_IND_DATA5_T; + +typedef struct dpp_nppu_pktrx_cfg_ind_data6_t +{ + ZXIC_UINT32 ind_dat6; +}DPP_NPPU_PKTRX_CFG_IND_DATA6_T; + +typedef struct dpp_nppu_pktrx_cfg_ind_data7_t +{ + ZXIC_UINT32 ind_dat7; +}DPP_NPPU_PKTRX_CFG_IND_DATA7_T; + +typedef struct dpp_nppu_pktrx_cfg_tcam_0_cmd_t +{ + ZXIC_UINT32 cfg_vben; + ZXIC_UINT32 cfg_vbi; + ZXIC_UINT32 cfg_t_strwc; + ZXIC_UINT32 tcam0_sm; + ZXIC_UINT32 tcam0_smen; + ZXIC_UINT32 tcam0_rm; + ZXIC_UINT32 tcam0_rmen; + ZXIC_UINT32 tcam0_enable; + ZXIC_UINT32 tcam0_flush; + ZXIC_UINT32 tcam0_unload; + ZXIC_UINT32 tcam0_unload_addr; +}DPP_NPPU_PKTRX_CFG_TCAM_0_CMD_T; + +typedef struct dpp_nppu_pktrx_cfg_tcam_1_cmd_t +{ + ZXIC_UINT32 tcam1_sm; + ZXIC_UINT32 tcam1_smen; + ZXIC_UINT32 tcam1_rm; + ZXIC_UINT32 tcam1_rmen; + ZXIC_UINT32 tcam1_enable; + ZXIC_UINT32 tcam1_flush; + ZXIC_UINT32 tcam1_unload; + ZXIC_UINT32 tcam1_unload_addr; +}DPP_NPPU_PKTRX_CFG_TCAM_1_CMD_T; + +typedef struct dpp_nppu_pktrx_cfg_port_en_0_t +{ + ZXIC_UINT32 cfg_isch_port_en_0; +}DPP_NPPU_PKTRX_CFG_PORT_EN_0_T; + +typedef struct dpp_nppu_pktrx_cfg_port_en_1_t +{ + ZXIC_UINT32 cfg_isch_port_en_1; +}DPP_NPPU_PKTRX_CFG_PORT_EN_1_T; + +typedef struct dpp_nppu_pktrx_cfg_port_en_2_t +{ + ZXIC_UINT32 cfg_isch_port_en_2; +}DPP_NPPU_PKTRX_CFG_PORT_EN_2_T; + +typedef struct dpp_nppu_pktrx_cfg_port_en_3_t +{ + ZXIC_UINT32 cfg_port_change_en_0; + ZXIC_UINT32 cfg_port_change_en_1; + ZXIC_UINT32 cfg_isch_port_en_3; +}DPP_NPPU_PKTRX_CFG_PORT_EN_3_T; + +typedef struct dpp_nppu_pktrx_cfg_cfg_port_l2_offset_mode_0_t +{ + ZXIC_UINT32 cfg_port_l2_offset_mode_0; +}DPP_NPPU_PKTRX_CFG_CFG_PORT_L2_OFFSET_MODE_0_T; + +typedef struct dpp_nppu_pktrx_cfg_cfg_port_l2_offset_mode_1_t +{ + ZXIC_UINT32 cfg_port_l2_offset_mode_1; +}DPP_NPPU_PKTRX_CFG_CFG_PORT_L2_OFFSET_MODE_1_T; + +typedef struct dpp_nppu_pktrx_cfg_cfg_port_l2_offset_mode_2_t +{ + ZXIC_UINT32 cfg_port_l2_offset_mode_2; +}DPP_NPPU_PKTRX_CFG_CFG_PORT_L2_OFFSET_MODE_2_T; + +typedef struct dpp_nppu_pktrx_cfg_cfg_port_l2_offset_mode_3_t +{ + ZXIC_UINT32 cfg_port_l2_offset_mode_3; +}DPP_NPPU_PKTRX_CFG_CFG_PORT_L2_OFFSET_MODE_3_T; + +typedef struct dpp_nppu_pktrx_cfg_port_fc_mode_0_t +{ + ZXIC_UINT32 cfg_isch_fc_mode_0; +}DPP_NPPU_PKTRX_CFG_PORT_FC_MODE_0_T; + +typedef struct dpp_nppu_pktrx_cfg_port_fc_mode_1_t +{ + ZXIC_UINT32 cfg_isch_fc_mode_1; +}DPP_NPPU_PKTRX_CFG_PORT_FC_MODE_1_T; + +typedef struct dpp_nppu_pktrx_cfg_port_fc_mode_2_t +{ + ZXIC_UINT32 cfg_isch_fc_mode_2; +}DPP_NPPU_PKTRX_CFG_PORT_FC_MODE_2_T; + +typedef struct dpp_nppu_pktrx_cfg_port_fc_mode_3_t +{ + ZXIC_UINT32 cfg_isch_fc_mode_3; +}DPP_NPPU_PKTRX_CFG_PORT_FC_MODE_3_T; + +typedef struct dpp_nppu_pktrx_cfg_port_fc_mode_4_t +{ + ZXIC_UINT32 cfg_isch_fc_mode_4; +}DPP_NPPU_PKTRX_CFG_PORT_FC_MODE_4_T; + +typedef struct dpp_nppu_pktrx_cfg_port_fc_mode_5_t +{ + ZXIC_UINT32 cfg_isch_fc_mode_5; +}DPP_NPPU_PKTRX_CFG_PORT_FC_MODE_5_T; + +typedef struct dpp_nppu_pktrx_cfg_port_fc_mode_6_t +{ + ZXIC_UINT32 cfg_isch_fc_mode_6; +}DPP_NPPU_PKTRX_CFG_PORT_FC_MODE_6_T; + +typedef struct dpp_nppu_pktrx_cfg_port_fc_mode_7_t +{ + ZXIC_UINT32 cfg_pfu_aging_en; + ZXIC_UINT32 cfg_isch_aging_en; + ZXIC_UINT32 cfg_isch_fc_mode_7; +}DPP_NPPU_PKTRX_CFG_PORT_FC_MODE_7_T; + +typedef struct dpp_nppu_pktrx_cfg_cfg_isch_aging_th_t +{ + ZXIC_UINT32 cfg_pfu_delay_cycle; + ZXIC_UINT32 cfg_isch_aging_th; +}DPP_NPPU_PKTRX_CFG_CFG_ISCH_AGING_TH_T; + +typedef struct dpp_nppu_pktrx_cfg_isch_fifo_th_0_t +{ + ZXIC_UINT32 cfg_sch_fifo3_fc_th; + ZXIC_UINT32 cfg_sch_fifo2_fc_th; + ZXIC_UINT32 cfg_sch_fifo1_fc_th; + ZXIC_UINT32 cfg_sch_fifo0_fc_th; +}DPP_NPPU_PKTRX_CFG_ISCH_FIFO_TH_0_T; + +typedef struct dpp_nppu_pktrx_cfg_isch_cfg_1_t +{ + ZXIC_UINT32 cfg_parser_max_len_en; + ZXIC_UINT32 cfg_parser_max_len; + ZXIC_UINT32 cfg_parser_min_len_en; + ZXIC_UINT32 cfg_parser_min_len; + ZXIC_UINT32 sp_sch_sel; +}DPP_NPPU_PKTRX_CFG_ISCH_CFG_1_T; + +typedef struct dpp_nppu_pktrx_cfg_tcam_0_vld_t +{ + ZXIC_UINT32 cfg_tcam0_vld; +}DPP_NPPU_PKTRX_CFG_TCAM_0_VLD_T; + +typedef struct dpp_nppu_pktrx_cfg_tcam_1_vld_t +{ + ZXIC_UINT32 cfg_tcam1_vld; +}DPP_NPPU_PKTRX_CFG_TCAM_1_VLD_T; + +typedef struct dpp_nppu_pktrx_cfg_cpu_port_en_mask_t +{ + ZXIC_UINT32 cpu_port_en_mask; +}DPP_NPPU_PKTRX_CFG_CPU_PORT_EN_MASK_T; + +typedef struct dpp_nppu_pktrx_cfg_pktrx_glbal_cfg_0_t +{ + ZXIC_UINT32 pktrx_glbal_cfg_0; +}DPP_NPPU_PKTRX_CFG_PKTRX_GLBAL_CFG_0_T; + +typedef struct dpp_nppu_pktrx_cfg_pktrx_glbal_cfg_1_t +{ + ZXIC_UINT32 pktrx_glbal_cfg_1; +}DPP_NPPU_PKTRX_CFG_PKTRX_GLBAL_CFG_1_T; + +typedef struct dpp_nppu_pktrx_cfg_pktrx_glbal_cfg_2_t +{ + ZXIC_UINT32 pktrx_glbal_cfg_2; +}DPP_NPPU_PKTRX_CFG_PKTRX_GLBAL_CFG_2_T; + +typedef struct dpp_nppu_pktrx_cfg_pktrx_glbal_cfg_3_t +{ + ZXIC_UINT32 pktrx_glbal_cfg_3; +}DPP_NPPU_PKTRX_CFG_PKTRX_GLBAL_CFG_3_T; + +typedef struct dpp_nppu_pktrx_cfg_nppu_start_t +{ + ZXIC_UINT32 nppu_start; +}DPP_NPPU_PKTRX_CFG_NPPU_START_T; + +typedef struct dpp_nppu_pktrx_stat_ind_status_t +{ + ZXIC_UINT32 ind_access_done; +}DPP_NPPU_PKTRX_STAT_IND_STATUS_T; + +typedef struct dpp_nppu_pktrx_stat_ind_cmd_t +{ + ZXIC_UINT32 ind_rd_or_wr; + ZXIC_UINT32 ind_mem_id; + ZXIC_UINT32 ind_mem_addr; +}DPP_NPPU_PKTRX_STAT_IND_CMD_T; + +typedef struct dpp_nppu_pktrx_stat_ind_data0_t +{ + ZXIC_UINT32 ind_dat0; +}DPP_NPPU_PKTRX_STAT_IND_DATA0_T; + +typedef struct dpp_nppu_idma_cfg_debug_cnt_ovfl_mode_t +{ + ZXIC_UINT32 debug_cnt_ovfl_mode; +}DPP_NPPU_IDMA_CFG_DEBUG_CNT_OVFL_MODE_T; + +typedef struct dpp_nppu_idma_stat_ind_status_t +{ + ZXIC_UINT32 ind_access_done; +}DPP_NPPU_IDMA_STAT_IND_STATUS_T; + +typedef struct dpp_nppu_idma_stat_ind_cmd_t +{ + ZXIC_UINT32 ind_rd_or_wr; + ZXIC_UINT32 ind_mem_id; + ZXIC_UINT32 ind_mem_addr; +}DPP_NPPU_IDMA_STAT_IND_CMD_T; + +typedef struct dpp_nppu_idma_stat_ind_data0_t +{ + ZXIC_UINT32 ind_data0; +}DPP_NPPU_IDMA_STAT_IND_DATA0_T; + +typedef struct dpp_nppu_pbu_cfg_ind_status_t +{ + ZXIC_UINT32 ind_access_done; +}DPP_NPPU_PBU_CFG_IND_STATUS_T; + +typedef struct dpp_nppu_pbu_cfg_ind_cmd_t +{ + ZXIC_UINT32 ind_rd_or_wr; + ZXIC_UINT32 ind_mem_id; + ZXIC_UINT32 ind_mem_addr; +}DPP_NPPU_PBU_CFG_IND_CMD_T; + +typedef struct dpp_nppu_pbu_cfg_ind_data0_t +{ + ZXIC_UINT32 ind_data0; +}DPP_NPPU_PBU_CFG_IND_DATA0_T; + +typedef struct dpp_nppu_pbu_cfg_ind_data1_t +{ + ZXIC_UINT32 ind_data1; +}DPP_NPPU_PBU_CFG_IND_DATA1_T; + +typedef struct dpp_nppu_pbu_cfg_ind_data2_t +{ + ZXIC_UINT32 ind_data2; +}DPP_NPPU_PBU_CFG_IND_DATA2_T; + +typedef struct dpp_nppu_pbu_cfg_ind_data3_t +{ + ZXIC_UINT32 ind_data3; +}DPP_NPPU_PBU_CFG_IND_DATA3_T; + +typedef struct dpp_nppu_pbu_cfg_ind_data4_t +{ + ZXIC_UINT32 ind_data4; +}DPP_NPPU_PBU_CFG_IND_DATA4_T; + +typedef struct dpp_nppu_pbu_cfg_ind_data5_t +{ + ZXIC_UINT32 ind_data5; +}DPP_NPPU_PBU_CFG_IND_DATA5_T; + +typedef struct dpp_nppu_pbu_cfg_ind_data6_t +{ + ZXIC_UINT32 ind_data6; +}DPP_NPPU_PBU_CFG_IND_DATA6_T; + +typedef struct dpp_nppu_pbu_cfg_ind_data7_t +{ + ZXIC_UINT32 ind_data7; +}DPP_NPPU_PBU_CFG_IND_DATA7_T; + +typedef struct dpp_nppu_pbu_cfg_idma_public_th_t +{ + ZXIC_UINT32 idma_public_th; +}DPP_NPPU_PBU_CFG_IDMA_PUBLIC_TH_T; + +typedef struct dpp_nppu_pbu_cfg_lif_public_th_t +{ + ZXIC_UINT32 lif_public_th; +}DPP_NPPU_PBU_CFG_LIF_PUBLIC_TH_T; + +typedef struct dpp_nppu_pbu_cfg_idma_total_th_t +{ + ZXIC_UINT32 idma_total_th; +}DPP_NPPU_PBU_CFG_IDMA_TOTAL_TH_T; + +typedef struct dpp_nppu_pbu_cfg_lif_total_th_t +{ + ZXIC_UINT32 lif_total_th; +}DPP_NPPU_PBU_CFG_LIF_TOTAL_TH_T; + +typedef struct dpp_nppu_pbu_cfg_mc_total_th_t +{ + ZXIC_UINT32 mc_total_th; +}DPP_NPPU_PBU_CFG_MC_TOTAL_TH_T; + +typedef struct dpp_nppu_pbu_cfg_mc_cos10_th_t +{ + ZXIC_UINT32 mc_cos1_mode; + ZXIC_UINT32 mc_cos0_mode; + ZXIC_UINT32 mc_cos1_th; + ZXIC_UINT32 mc_cos0_th; +}DPP_NPPU_PBU_CFG_MC_COS10_TH_T; + +typedef struct dpp_nppu_pbu_cfg_mc_cos32_th_t +{ + ZXIC_UINT32 mc_cos3_mode; + ZXIC_UINT32 mc_cos2_mode; + ZXIC_UINT32 mc_cos3_th; + ZXIC_UINT32 mc_cos2_th; +}DPP_NPPU_PBU_CFG_MC_COS32_TH_T; + +typedef struct dpp_nppu_pbu_cfg_mc_cos54_th_t +{ + ZXIC_UINT32 mc_cos5_mode; + ZXIC_UINT32 mc_cos4_mode; + ZXIC_UINT32 mc_cos5_th; + ZXIC_UINT32 mc_cos4_th; +}DPP_NPPU_PBU_CFG_MC_COS54_TH_T; + +typedef struct dpp_nppu_pbu_cfg_mc_cos76_th_t +{ + ZXIC_UINT32 mc_cos7_mode; + ZXIC_UINT32 mc_cos6_mode; + ZXIC_UINT32 mc_cos7_th; + ZXIC_UINT32 mc_cos6_th; +}DPP_NPPU_PBU_CFG_MC_COS76_TH_T; + +typedef struct dpp_nppu_pbu_cfg_debug_cnt_ovfl_mode_t +{ + ZXIC_UINT32 debug_cnt_ovfl_mode; +}DPP_NPPU_PBU_CFG_DEBUG_CNT_OVFL_MODE_T; + +typedef struct dpp_nppu_pbu_cfg_se_key_aful_negate_cfg_t +{ + ZXIC_UINT32 se_key_aful_negate_cfg; +}DPP_NPPU_PBU_CFG_SE_KEY_AFUL_NEGATE_CFG_T; + +typedef struct dpp_nppu_pbu_cfg_sa_flag_t +{ + ZXIC_UINT32 sa_flag; +}DPP_NPPU_PBU_CFG_SA_FLAG_T; + +typedef struct dpp_nppu_pbu_stat_ind_data_t +{ + ZXIC_UINT32 ind_data; +}DPP_NPPU_PBU_STAT_IND_DATA_T; + +typedef struct dpp_nppu_pbu_stat_ind_status_t +{ + ZXIC_UINT32 ind_access_done; +}DPP_NPPU_PBU_STAT_IND_STATUS_T; + +typedef struct dpp_nppu_pbu_stat_ind_cmd_t +{ + ZXIC_UINT32 ind_rd_or_wr; + ZXIC_UINT32 ind_mem_id; + ZXIC_UINT32 ind_mem_addr; +}DPP_NPPU_PBU_STAT_IND_CMD_T; + +typedef struct dpp_nppu_pbu_stat_total_cnt_t +{ + ZXIC_UINT32 total_cnt; +}DPP_NPPU_PBU_STAT_TOTAL_CNT_T; + +typedef struct dpp_nppu_pbu_stat_idma_pub_cnt_t +{ + ZXIC_UINT32 idma_pub_cnt; +}DPP_NPPU_PBU_STAT_IDMA_PUB_CNT_T; + +typedef struct dpp_nppu_pbu_stat_lif_pub_cnt_t +{ + ZXIC_UINT32 lif_pub_cnt; +}DPP_NPPU_PBU_STAT_LIF_PUB_CNT_T; + +typedef struct dpp_nppu_pbu_stat_mc_total_cnt_t +{ + ZXIC_UINT32 mc_total_cnt; +}DPP_NPPU_PBU_STAT_MC_TOTAL_CNT_T; + +typedef struct dpp_nppu_pbu_stat_pbu_thram_init_done_t +{ + ZXIC_UINT32 pbu_thram_init_done; +}DPP_NPPU_PBU_STAT_PBU_THRAM_INIT_DONE_T; + +typedef struct dpp_nppu_pbu_stat_ifb_fptr_init_done_t +{ + ZXIC_UINT32 ifb_fptr_init_done; +}DPP_NPPU_PBU_STAT_IFB_FPTR_INIT_DONE_T; + +typedef struct dpp_nppu_isu_cfg_weight_normal_uc_t +{ + ZXIC_UINT32 weight_normal_uc; +}DPP_NPPU_ISU_CFG_WEIGHT_NORMAL_UC_T; + +typedef struct dpp_nppu_isu_cfg_fabric_or_saip_t +{ + ZXIC_UINT32 fabric_or_saip; +}DPP_NPPU_ISU_CFG_FABRIC_OR_SAIP_T; + +typedef struct dpp_nppu_isu_stat_ind_status_t +{ + ZXIC_UINT32 ind_access_done; +}DPP_NPPU_ISU_STAT_IND_STATUS_T; + +typedef struct dpp_nppu_isu_stat_ind_cmd_t +{ + ZXIC_UINT32 ind_rd_or_wr; + ZXIC_UINT32 ind_mem_id; + ZXIC_UINT32 ind_mem_addr; +}DPP_NPPU_ISU_STAT_IND_CMD_T; + +typedef struct dpp_nppu_isu_stat_ind_dat0_t +{ + ZXIC_UINT32 ind_dat0; +}DPP_NPPU_ISU_STAT_IND_DAT0_T; + +typedef struct dpp_nppu_odma_cfg_ind_access_done_t +{ + ZXIC_UINT32 ind_access_done; +}DPP_NPPU_ODMA_CFG_IND_ACCESS_DONE_T; + +typedef struct dpp_nppu_odma_cfg_ind_command_t +{ + ZXIC_UINT32 ind_rd_or_wr; + ZXIC_UINT32 ind_mem_id; + ZXIC_UINT32 ind_mem_addr; +}DPP_NPPU_ODMA_CFG_IND_COMMAND_T; + +typedef struct dpp_nppu_odma_cfg_ind_dat0_t +{ + ZXIC_UINT32 ind_dat0; +}DPP_NPPU_ODMA_CFG_IND_DAT0_T; + +typedef struct dpp_nppu_odma_cfg_ind_dat1_t +{ + ZXIC_UINT32 ind_dat1; +}DPP_NPPU_ODMA_CFG_IND_DAT1_T; + +typedef struct dpp_nppu_odma_cfg_fabric_or_saip_t +{ + ZXIC_UINT32 fabric_or_saip; +}DPP_NPPU_ODMA_CFG_FABRIC_OR_SAIP_T; + +typedef struct dpp_nppu_odma_cfg_max_pkt_len_t +{ + ZXIC_UINT32 max_pkt_len; +}DPP_NPPU_ODMA_CFG_MAX_PKT_LEN_T; + +typedef struct dpp_nppu_odma_cfg_age_en_t +{ + ZXIC_UINT32 age_en; +}DPP_NPPU_ODMA_CFG_AGE_EN_T; + +typedef struct dpp_nppu_odma_cfg_age_mode_t +{ + ZXIC_UINT32 age_mode; +}DPP_NPPU_ODMA_CFG_AGE_MODE_T; + +typedef struct dpp_nppu_odma_cfg_age_value_time_t +{ + ZXIC_UINT32 age_value_time; +}DPP_NPPU_ODMA_CFG_AGE_VALUE_TIME_T; + +typedef struct dpp_nppu_odma_cfg_age_value_room_t +{ + ZXIC_UINT32 age_value_room; +}DPP_NPPU_ODMA_CFG_AGE_VALUE_ROOM_T; + +typedef struct dpp_nppu_odma_cfg_age_out_cnt_t +{ + ZXIC_UINT32 age_out_cnt; +}DPP_NPPU_ODMA_CFG_AGE_OUT_CNT_T; + +typedef struct dpp_nppu_odma_cfg_token_value_a_t +{ + ZXIC_UINT32 token_value_a; +}DPP_NPPU_ODMA_CFG_TOKEN_VALUE_A_T; + +typedef struct dpp_nppu_odma_cfg_token_value_b_t +{ + ZXIC_UINT32 token_value_b; +}DPP_NPPU_ODMA_CFG_TOKEN_VALUE_B_T; + +typedef struct dpp_nppu_odma_cfg_cfg_shap_en_p0_t +{ + ZXIC_UINT32 cfg_shap_en_p0; +}DPP_NPPU_ODMA_CFG_CFG_SHAP_EN_P0_T; + +typedef struct dpp_nppu_odma_cfg_cfg_shap_en_p1_t +{ + ZXIC_UINT32 cfg_shap_en_p1; +}DPP_NPPU_ODMA_CFG_CFG_SHAP_EN_P1_T; + +typedef struct dpp_nppu_odma_cfg_cfg_shap_en_tm_t +{ + ZXIC_UINT32 cfg_shap_en_tm; +}DPP_NPPU_ODMA_CFG_CFG_SHAP_EN_TM_T; + +typedef struct dpp_nppu_odma_stat_ind_status_t +{ + ZXIC_UINT32 ind_access_done; +}DPP_NPPU_ODMA_STAT_IND_STATUS_T; + +typedef struct dpp_nppu_odma_stat_ind_cmd_t +{ + ZXIC_UINT32 ind_rd_or_wr; + ZXIC_UINT32 ind_mem_id; + ZXIC_UINT32 ind_mem_addr; +}DPP_NPPU_ODMA_STAT_IND_CMD_T; + +typedef struct dpp_nppu_odma_stat_ind_data0_t +{ + ZXIC_UINT32 ind_dat0; +}DPP_NPPU_ODMA_STAT_IND_DATA0_T; + +typedef struct dpp_nppu_odma_stat_debug_cnt_cfg_t +{ + ZXIC_UINT32 debug_cnt_ovf_mode; + ZXIC_UINT32 debug_cnt_rdclr_mode; + ZXIC_UINT32 user_cnt_value; +}DPP_NPPU_ODMA_STAT_DEBUG_CNT_CFG_T; + +typedef struct dpp_nppu_oam_cfg_bfd_firstchk_th_t +{ + ZXIC_UINT32 bfd_firstchk_th; +}DPP_NPPU_OAM_CFG_BFD_FIRSTCHK_TH_T; + +typedef struct dpp_nppu_pbu_cfg_memid_0_pbu_fc_idmath_ram_t +{ + ZXIC_UINT32 lif_th_15; + ZXIC_UINT32 lif_prv_15; + ZXIC_UINT32 idma_prv_15; + ZXIC_UINT32 idma_th_cos0_15; + ZXIC_UINT32 idma_th_cos1_15; + ZXIC_UINT32 idma_th_cos2_15; + ZXIC_UINT32 idma_th_cos3_15; + ZXIC_UINT32 idma_th_cos4_15; + ZXIC_UINT32 idma_th_cos5_15; + ZXIC_UINT32 idma_th_cos6_15; + ZXIC_UINT32 idma_th_cos7_15; +}DPP_NPPU_PBU_CFG_MEMID_0_PBU_FC_IDMATH_RAM_T; + +typedef struct dpp_nppu_pbu_cfg_memid_1_pbu_fc_macth_ram_t +{ + ZXIC_UINT32 cos7_th; + ZXIC_UINT32 cos6_th; + ZXIC_UINT32 cos5_th; + ZXIC_UINT32 cos4_th; + ZXIC_UINT32 cos3_th; + ZXIC_UINT32 cos2_th; + ZXIC_UINT32 cos1_th; + ZXIC_UINT32 cos0_th; +}DPP_NPPU_PBU_CFG_MEMID_1_PBU_FC_MACTH_RAM_T; + +typedef struct dpp_nppu_pbu_stat_memid_1_all_kind_port_cnt_t +{ + ZXIC_UINT32 peak_port_cnt; + ZXIC_UINT32 current_port_cnt; +}DPP_NPPU_PBU_STAT_MEMID_1_ALL_KIND_PORT_CNT_T; + +typedef struct dpp_nppu_pbu_stat_memid_2_ppu_pbu_ifb_req_vld_cnt_t +{ + ZXIC_UINT32 ppu_pbu_ifb_req_vld_cnt; +}DPP_NPPU_PBU_STAT_MEMID_2_PPU_PBU_IFB_REQ_VLD_CNT_T; + +typedef struct dpp_nppu_pbu_stat_memid_2_pbu_ppu_ifb_rsp_vld_cnt_t +{ + ZXIC_UINT32 pbu_ppu_ifb_rsp_vld_cnt; +}DPP_NPPU_PBU_STAT_MEMID_2_PBU_PPU_IFB_RSP_VLD_CNT_T; + +typedef struct dpp_nppu_pbu_stat_memid_2_odma_pbu_recy_ptr_vld_cnt_t +{ + ZXIC_UINT32 odma_pbu_recy_ptr_vld_cnt; +}DPP_NPPU_PBU_STAT_MEMID_2_ODMA_PBU_RECY_PTR_VLD_CNT_T; + +typedef struct dpp_nppu_pbu_stat_memid_2_ppu_pbu_mcode_pf_req_cnt_t +{ + ZXIC_UINT32 ppu_pbu_mcode_pf_req_cnt; +}DPP_NPPU_PBU_STAT_MEMID_2_PPU_PBU_MCODE_PF_REQ_CNT_T; + +typedef struct dpp_nppu_pbu_stat_memid_2_pbu_ppu_mcode_pf_rsp_cnt_t +{ + ZXIC_UINT32 pbu_ppu_mcode_pf_rsp_cnt; +}DPP_NPPU_PBU_STAT_MEMID_2_PBU_PPU_MCODE_PF_RSP_CNT_T; + +typedef struct dpp_nppu_pbu_stat_memid_2_ppu_pbu_logic_pf_req_cnt_t +{ + ZXIC_UINT32 ppu_pbu_logic_pf_req_cnt; +}DPP_NPPU_PBU_STAT_MEMID_2_PPU_PBU_LOGIC_PF_REQ_CNT_T; + +typedef struct dpp_nppu_pbu_stat_memid_2_pbu_ppu_logic_pf_rsp_cnt_t +{ + ZXIC_UINT32 pbu_ppu_logic_pf_rsp_cnt; +}DPP_NPPU_PBU_STAT_MEMID_2_PBU_PPU_LOGIC_PF_RSP_CNT_T; + +typedef struct dpp_nppu_pbu_stat_memid_2_ppu_use_ptr_pulse_cnt_t +{ + ZXIC_UINT32 ppu_use_ptr_pulse_cnt; +}DPP_NPPU_PBU_STAT_MEMID_2_PPU_USE_PTR_PULSE_CNT_T; + +typedef struct dpp_nppu_pbu_stat_memid_2_ppu_pbu_wb_vld_cnt_t +{ + ZXIC_UINT32 ppu_pbu_wb_vld_cnt; +}DPP_NPPU_PBU_STAT_MEMID_2_PPU_PBU_WB_VLD_CNT_T; + +typedef struct dpp_nppu_pbu_stat_memid_2_pbu_ppu_reorder_para_vld_cnt_t +{ + ZXIC_UINT32 pbu_ppu_reorder_para_vld_cnt; +}DPP_NPPU_PBU_STAT_MEMID_2_PBU_PPU_REORDER_PARA_VLD_CNT_T; + +typedef struct dpp_nppu_pbu_stat_memid_2_se_pbu_dpi_key_vld_cnt_t +{ + ZXIC_UINT32 se_pbu_dpi_key_vld_cnt; +}DPP_NPPU_PBU_STAT_MEMID_2_SE_PBU_DPI_KEY_VLD_CNT_T; + +typedef struct dpp_nppu_pbu_stat_memid_2_pbu_se_dpi_rsp_datvld_cnt_t +{ + ZXIC_UINT32 pbu_se_dpi_rsp_datvld_cnt; +}DPP_NPPU_PBU_STAT_MEMID_2_PBU_SE_DPI_RSP_DATVLD_CNT_T; + +typedef struct dpp_nppu_pbu_stat_memid_2_odma_pbu_ifb_rd1_cnt_t +{ + ZXIC_UINT32 odma_pbu_ifb_rd1_cnt; +}DPP_NPPU_PBU_STAT_MEMID_2_ODMA_PBU_IFB_RD1_CNT_T; + +typedef struct dpp_nppu_pbu_stat_memid_2_odma_pbu_ifb_rd2_cnt_t +{ + ZXIC_UINT32 odma_pbu_ifb_rd2_cnt; +}DPP_NPPU_PBU_STAT_MEMID_2_ODMA_PBU_IFB_RD2_CNT_T; + +typedef struct dpp_nppu_pbu_stat_memid_2_pbu_ppu_mcode_pf_no_rsp_cnt_t +{ + ZXIC_UINT32 pbu_ppu_mcode_pf_no_rsp_cnt; +}DPP_NPPU_PBU_STAT_MEMID_2_PBU_PPU_MCODE_PF_NO_RSP_CNT_T; + +typedef struct dpp_nppu_pbu_stat_memid_2_pbu_ppu_logic_pf_no_rsp_cnt_t +{ + ZXIC_UINT32 pbu_ppu_logic_pf_no_rsp_cnt; +}DPP_NPPU_PBU_STAT_MEMID_2_PBU_PPU_LOGIC_PF_NO_RSP_CNT_T; + +typedef struct dpp_nppu_pbu_stat_memid_3_cpu_rd_ifb_data_t +{ + ZXIC_UINT32 cpu_rd_ifb_data; +}DPP_NPPU_PBU_STAT_MEMID_3_CPU_RD_IFB_DATA_T; + +typedef struct dpp_nppu_pbu_stat_memid_4_mux_sel_rgt_t +{ + ZXIC_UINT32 current_port_cnt; +}DPP_NPPU_PBU_STAT_MEMID_4_MUX_SEL_RGT_T; + +typedef struct dpp_nppu_pbu_stat_memid_5_port_pub_cnt_t +{ + ZXIC_UINT32 port_pub_cnt; +}DPP_NPPU_PBU_STAT_MEMID_5_PORT_PUB_CNT_T; + +typedef struct dpp_nppu_idma_stat_memid_1_idma_o_isu_pkt_pulse_total_cnt_t +{ + ZXIC_UINT32 idma_o_isu_pkt_pulse_total_cnt; +}DPP_NPPU_IDMA_STAT_MEMID_1_IDMA_O_ISU_PKT_PULSE_TOTAL_CNT_T; + +typedef struct dpp_nppu_idma_stat_memid_1_idma_o_isu_epkt_pulse_total_cnt_t +{ + ZXIC_UINT32 idma_o_isu_epkt_pulse_total_cnt; +}DPP_NPPU_IDMA_STAT_MEMID_1_IDMA_O_ISU_EPKT_PULSE_TOTAL_CNT_T; + +typedef struct dpp_nppu_idma_stat_memid_1_idma_dispkt_pulse_total_cnt_t +{ + ZXIC_UINT32 idma_dispkt_pulse_total_cnt; +}DPP_NPPU_IDMA_STAT_MEMID_1_IDMA_DISPKT_PULSE_TOTAL_CNT_T; + +typedef struct dpp_nppu_idma_stat_memid_0_idma_o_isu_pkt_pulse_cnt_t +{ + ZXIC_UINT32 idma_o_isu_pkt_pulse_cnt; +}DPP_NPPU_IDMA_STAT_MEMID_0_IDMA_O_ISU_PKT_PULSE_CNT_T; + +typedef struct dpp_nppu_idma_stat_memid_0_idma_o_isu_epkt_pulse_cnt_t +{ + ZXIC_UINT32 idma_o_isu_epkt_pulse_cnt; +}DPP_NPPU_IDMA_STAT_MEMID_0_IDMA_O_ISU_EPKT_PULSE_CNT_T; + +typedef struct dpp_nppu_idma_stat_memid_0_idma_dispkt_pulse_cnt_t +{ + ZXIC_UINT32 idma_dispkt_pulse_cnt; +}DPP_NPPU_IDMA_STAT_MEMID_0_IDMA_DISPKT_PULSE_CNT_T; + +typedef struct dpp_nppu_mr_cfg_ind_access_states_t +{ + ZXIC_UINT32 ind_access_done; +}DPP_NPPU_MR_CFG_IND_ACCESS_STATES_T; + +typedef struct dpp_nppu_mr_cfg_ind_access_cmd0_t +{ + ZXIC_UINT32 wr_mode; + ZXIC_UINT32 rd_or_wr; + ZXIC_UINT32 ind_access_addr0; +}DPP_NPPU_MR_CFG_IND_ACCESS_CMD0_T; + +typedef struct dpp_nppu_mr_cfg_ind_access_data0_t +{ + ZXIC_UINT32 ind_access_data0; +}DPP_NPPU_MR_CFG_IND_ACCESS_DATA0_T; + +typedef struct dpp_nppu_mr_cfg_ind_access_data1_t +{ + ZXIC_UINT32 ind_access_data1; +}DPP_NPPU_MR_CFG_IND_ACCESS_DATA1_T; + +typedef struct dpp_nppu_mr_cfg_ind_access_cmd1_t +{ + ZXIC_UINT32 ind_access_addr1; +}DPP_NPPU_MR_CFG_IND_ACCESS_CMD1_T; + +typedef struct dpp_nppu_mr_cfg_mr_init_done_t +{ + ZXIC_UINT32 mr_init_done; +}DPP_NPPU_MR_CFG_MR_INIT_DONE_T; + +typedef struct dpp_nppu_mr_cfg_cnt_mode_reg_t +{ + ZXIC_UINT32 cfgmt_count_rd_mode; + ZXIC_UINT32 cfgmt_count_overflow_mode; +}DPP_NPPU_MR_CFG_CNT_MODE_REG_T; + +typedef struct dpp_nppu_mr_cfg_cfg_ecc_bypass_read_t +{ + ZXIC_UINT32 cfg_ecc_bypass_read; +}DPP_NPPU_MR_CFG_CFG_ECC_BYPASS_READ_T; + +typedef struct dpp_nppu_mr_cfg_cfg_rep_mod_t +{ + ZXIC_UINT32 cfg_rep_mod; +}DPP_NPPU_MR_CFG_CFG_REP_MOD_T; + +typedef struct dpp_nppu_mr_cfg_block_ptr_fifo_aful_th_t +{ + ZXIC_UINT32 block_ptr3_fifo_aful_th; + ZXIC_UINT32 block_ptr2_fifo_aful_th; + ZXIC_UINT32 block_ptr1_fifo_aful_th; + ZXIC_UINT32 block_ptr0_fifo_aful_th; +}DPP_NPPU_MR_CFG_BLOCK_PTR_FIFO_AFUL_TH_T; + +typedef struct dpp_nppu_mr_cfg_pre_rcv_ptr_fifo_aful_th_t +{ + ZXIC_UINT32 pre_rcv_ptr3_fifo_aful_th; + ZXIC_UINT32 pre_rcv_ptr2_fifo_aful_th; + ZXIC_UINT32 pre_rcv_ptr1_fifo_aful_th; + ZXIC_UINT32 pre_rcv_ptr0_fifo_aful_th; +}DPP_NPPU_MR_CFG_PRE_RCV_PTR_FIFO_AFUL_TH_T; + +typedef struct dpp_nppu_mr_cfg_mgid_fifo_aful_th_t +{ + ZXIC_UINT32 mgid3_fifo_aful_th; + ZXIC_UINT32 mgid2_fifo_aful_th; + ZXIC_UINT32 mgid1_fifo_aful_th; + ZXIC_UINT32 mgid0_fifo_aful_th; +}DPP_NPPU_MR_CFG_MGID_FIFO_AFUL_TH_T; + +typedef struct dpp_nppu_mr_cfg_rep_cmd_fifo_aful_th_t +{ + ZXIC_UINT32 rep_cmd3_fifo_aful_th; + ZXIC_UINT32 rep_cmd2_fifo_aful_th; + ZXIC_UINT32 rep_cmd1_fifo_aful_th; + ZXIC_UINT32 rep_cmd0_fifo_aful_th; +}DPP_NPPU_MR_CFG_REP_CMD_FIFO_AFUL_TH_T; + +typedef struct dpp_nppu_mr_cfg_mr_int_mask_1_t +{ + ZXIC_UINT32 free_ptr0_fifo_full_mask; + ZXIC_UINT32 free_ptr1_fifo_full_mask; + ZXIC_UINT32 free_ptr2_fifo_full_mask; + ZXIC_UINT32 free_ptr3_fifo_full_mask; + ZXIC_UINT32 block_ptr0_fifo_full_mask; + ZXIC_UINT32 block_ptr1_fifo_full_mask; + ZXIC_UINT32 block_ptr2_fifo_full_mask; + ZXIC_UINT32 block_ptr3_fifo_full_mask; + ZXIC_UINT32 mgid0_fifo_full_mask; + ZXIC_UINT32 mgid1_fifo_full_mask; + ZXIC_UINT32 mgid2_fifo_full_mask; + ZXIC_UINT32 mgid3_fifo_full_mask; + ZXIC_UINT32 pre_rcv_ptr0_fifo_full_mask; + ZXIC_UINT32 pre_rcv_ptr1_fifo_full_mask; + ZXIC_UINT32 pre_rcv_ptr2_fifo_full_mask; + ZXIC_UINT32 pre_rcv_ptr3_fifo_full_mask; + ZXIC_UINT32 rep_cmd0_fifo_full_mask; + ZXIC_UINT32 rep_cmd1_fifo_full_mask; + ZXIC_UINT32 rep_cmd2_fifo_full_mask; + ZXIC_UINT32 rep_cmd3_fifo_full_mask; +}DPP_NPPU_MR_CFG_MR_INT_MASK_1_T; + +typedef struct dpp_nppu_mr_cfg_mr_int_mask_2_t +{ + ZXIC_UINT32 free_ptr0_fifo_udf_mask; + ZXIC_UINT32 free_ptr1_fifo_udf_mask; + ZXIC_UINT32 free_ptr2_fifo_udf_mask; + ZXIC_UINT32 free_ptr3_fifo_udf_mask; + ZXIC_UINT32 block_ptr0_fifo_udf_mask; + ZXIC_UINT32 block_ptr1_fifo_udf_mask; + ZXIC_UINT32 block_ptr2_fifo_udf_mask; + ZXIC_UINT32 block_ptr3_fifo_udf_mask; + ZXIC_UINT32 mgid0_fifo_udf_mask; + ZXIC_UINT32 mgid1_fifo_udf_mask; + ZXIC_UINT32 mgid2_fifo_udf_mask; + ZXIC_UINT32 mgid3_fifo_udf_mask; + ZXIC_UINT32 pre_rcv_ptr0_fifo_udf_mask; + ZXIC_UINT32 pre_rcv_ptr1_fifo_udf_mask; + ZXIC_UINT32 pre_rcv_ptr2_fifo_udf_mask; + ZXIC_UINT32 pre_rcv_ptr3_fifo_udf_mask; + ZXIC_UINT32 rep_cmd0_fifo_udf_mask; + ZXIC_UINT32 rep_cmd1_fifo_udf_mask; + ZXIC_UINT32 rep_cmd2_fifo_udf_mask; + ZXIC_UINT32 rep_cmd3_fifo_udf_mask; +}DPP_NPPU_MR_CFG_MR_INT_MASK_2_T; + +typedef struct dpp_nppu_mr_cfg_mr_int_mask_3_t +{ + ZXIC_UINT32 free_ptr0_fifo_ovf_mask; + ZXIC_UINT32 free_ptr1_fifo_ovf_mask; + ZXIC_UINT32 free_ptr2_fifo_ovf_mask; + ZXIC_UINT32 free_ptr3_fifo_ovf_mask; + ZXIC_UINT32 block_ptr0_fifo_ovf_mask; + ZXIC_UINT32 block_ptr1_fifo_ovf_mask; + ZXIC_UINT32 block_ptr2_fifo_ovf_mask; + ZXIC_UINT32 block_ptr3_fifo_ovf_mask; + ZXIC_UINT32 mgid0_fifo_ovf_mask; + ZXIC_UINT32 mgid1_fifo_ovf_mask; + ZXIC_UINT32 mgid2_fifo_ovf_mask; + ZXIC_UINT32 mgid3_fifo_ovf_mask; + ZXIC_UINT32 pre_rcv_ptr0_fifo_ovf_mask; + ZXIC_UINT32 pre_rcv_ptr1_fifo_ovf_mask; + ZXIC_UINT32 pre_rcv_ptr2_fifo_ovf_mask; + ZXIC_UINT32 pre_rcv_ptr3_fifo_ovf_mask; + ZXIC_UINT32 rep_cmd0_fifo_ovf_mask; + ZXIC_UINT32 rep_cmd1_fifo_ovf_mask; + ZXIC_UINT32 rep_cmd2_fifo_ovf_mask; + ZXIC_UINT32 rep_cmd3_fifo_ovf_mask; +}DPP_NPPU_MR_CFG_MR_INT_MASK_3_T; + +typedef struct dpp_nppu_mr_cfg_mr_int_mask_4_t +{ + ZXIC_UINT32 data_buf0_ram_parity_err_mask; + ZXIC_UINT32 data_buf1_ram_parity_err_mask; + ZXIC_UINT32 data_buf2_ram_parity_err_mask; + ZXIC_UINT32 data_buf3_ram_parity_err_mask; + ZXIC_UINT32 mlt_ecc_single_err_mask; + ZXIC_UINT32 free_ptr0_fifo_ecc_single_err_mask; + ZXIC_UINT32 free_ptr1_fifo_ecc_single_err_mask; + ZXIC_UINT32 free_ptr2_fifo_ecc_single_err_mask; + ZXIC_UINT32 free_ptr3_fifo_ecc_single_err_mask; + ZXIC_UINT32 block_ptr0_fifo_ecc_single_err_mask; + ZXIC_UINT32 block_ptr1_fifo_ecc_single_err_mask; + ZXIC_UINT32 block_ptr2_fifo_ecc_single_err_mask; + ZXIC_UINT32 block_ptr3_fifo_ecc_single_err_mask; + ZXIC_UINT32 mgid0_fifo_ecc_single_err_mask; + ZXIC_UINT32 mgid1_fifo_ecc_single_err_mask; + ZXIC_UINT32 mgid2_fifo_ecc_single_err_mask; + ZXIC_UINT32 mgid3_fifo_ecc_single_err_mask; + ZXIC_UINT32 pre_rcv_ptr0_fifo_ecc_single_err_mask; + ZXIC_UINT32 pre_rcv_ptr1_fifo_ecc_single_err_mask; + ZXIC_UINT32 pre_rcv_ptr2_fifo_ecc_single_err_mask; + ZXIC_UINT32 pre_rcv_ptr3_fifo_ecc_single_err_mask; + ZXIC_UINT32 rep_cmd0_fifo_ecc_single_err_mask; + ZXIC_UINT32 rep_cmd1_fifo_ecc_single_err_mask; + ZXIC_UINT32 rep_cmd2_fifo_ecc_single_err_mask; + ZXIC_UINT32 rep_cmd3_fifo_ecc_single_err_mask; +}DPP_NPPU_MR_CFG_MR_INT_MASK_4_T; + +typedef struct dpp_nppu_mr_cfg_mr_states_1_t +{ + ZXIC_UINT32 free_ptr0_fifo_full; + ZXIC_UINT32 free_ptr1_fifo_full; + ZXIC_UINT32 free_ptr2_fifo_full; + ZXIC_UINT32 free_ptr3_fifo_full; + ZXIC_UINT32 block_ptr0_fifo_full; + ZXIC_UINT32 block_ptr1_fifo_full; + ZXIC_UINT32 block_ptr2_fifo_full; + ZXIC_UINT32 block_ptr3_fifo_full; + ZXIC_UINT32 mgid0_fifo_full; + ZXIC_UINT32 mgid1_fifo_full; + ZXIC_UINT32 mgid2_fifo_full; + ZXIC_UINT32 mgid3_fifo_full; + ZXIC_UINT32 pre_rcv_ptr0_fifo_full; + ZXIC_UINT32 pre_rcv_ptr1_fifo_full; + ZXIC_UINT32 pre_rcv_ptr2_fifo_full; + ZXIC_UINT32 pre_rcv_ptr3_fifo_full; + ZXIC_UINT32 rep_cmd0_fifo_full; + ZXIC_UINT32 rep_cmd1_fifo_full; + ZXIC_UINT32 rep_cmd2_fifo_full; + ZXIC_UINT32 rep_cmd3_fifo_full; +}DPP_NPPU_MR_CFG_MR_STATES_1_T; + +typedef struct dpp_nppu_mr_cfg_mr_states_2_t +{ + ZXIC_UINT32 free_ptr0_fifo_udf; + ZXIC_UINT32 free_ptr1_fifo_udf; + ZXIC_UINT32 free_ptr2_fifo_udf; + ZXIC_UINT32 free_ptr3_fifo_udf; + ZXIC_UINT32 block_ptr0_fifo_udf; + ZXIC_UINT32 block_ptr1_fifo_udf; + ZXIC_UINT32 block_ptr2_fifo_udf; + ZXIC_UINT32 block_ptr3_fifo_udf; + ZXIC_UINT32 mgid0_fifo_udf; + ZXIC_UINT32 mgid1_fifo_udf; + ZXIC_UINT32 mgid2_fifo_udf; + ZXIC_UINT32 mgid3_fifo_udf; + ZXIC_UINT32 pre_rcv_ptr0_fifo_udf; + ZXIC_UINT32 pre_rcv_ptr1_fifo_udf; + ZXIC_UINT32 pre_rcv_ptr2_fifo_udf; + ZXIC_UINT32 pre_rcv_ptr3_fifo_udf; + ZXIC_UINT32 rep_cmd0_fifo_udf; + ZXIC_UINT32 rep_cmd1_fifo_udf; + ZXIC_UINT32 rep_cmd2_fifo_udf; + ZXIC_UINT32 rep_cmd3_fifo_udf; +}DPP_NPPU_MR_CFG_MR_STATES_2_T; + +typedef struct dpp_nppu_mr_cfg_mr_states_3_t +{ + ZXIC_UINT32 free_ptr0_fifo_ovf; + ZXIC_UINT32 free_ptr1_fifo_ovf; + ZXIC_UINT32 free_ptr2_fifo_ovf; + ZXIC_UINT32 free_ptr3_fifo_ovf; + ZXIC_UINT32 block_ptr0_fifo_ovf; + ZXIC_UINT32 block_ptr1_fifo_ovf; + ZXIC_UINT32 block_ptr2_fifo_ovf; + ZXIC_UINT32 block_ptr3_fifo_ovf; + ZXIC_UINT32 mgid0_fifo_ovf; + ZXIC_UINT32 mgid1_fifo_ovf; + ZXIC_UINT32 mgid2_fifo_ovf; + ZXIC_UINT32 mgid3_fifo_ovf; + ZXIC_UINT32 pre_rcv_ptr0_fifo_ovf; + ZXIC_UINT32 pre_rcv_ptr1_fifo_ovf; + ZXIC_UINT32 pre_rcv_ptr2_fifo_ovf; + ZXIC_UINT32 pre_rcv_ptr3_fifo_ovf; + ZXIC_UINT32 rep_cmd0_fifo_ovf; + ZXIC_UINT32 rep_cmd1_fifo_ovf; + ZXIC_UINT32 rep_cmd2_fifo_ovf; + ZXIC_UINT32 rep_cmd3_fifo_ovf; +}DPP_NPPU_MR_CFG_MR_STATES_3_T; + +typedef struct dpp_nppu_mr_cfg_mr_states_4_t +{ + ZXIC_UINT32 data_buf0_ram_parity_err; + ZXIC_UINT32 data_buf1_ram_parity_err; + ZXIC_UINT32 data_buf2_ram_parity_err; + ZXIC_UINT32 data_buf3_ram_parity_err; + ZXIC_UINT32 mlt_ecc_single_err; + ZXIC_UINT32 free_ptr0_fifo_ecc_single_err; + ZXIC_UINT32 free_ptr1_fifo_ecc_single_err; + ZXIC_UINT32 free_ptr2_fifo_ecc_single_err; + ZXIC_UINT32 free_ptr3_fifo_ecc_single_err; + ZXIC_UINT32 block_ptr0_fifo_ecc_single_err; + ZXIC_UINT32 block_ptr1_fifo_ecc_single_err; + ZXIC_UINT32 block_ptr2_fifo_ecc_single_err; + ZXIC_UINT32 block_ptr3_fifo_ecc_single_err; + ZXIC_UINT32 mgid0_fifo_ecc_single_err; + ZXIC_UINT32 mgid1_fifo_ecc_single_err; + ZXIC_UINT32 mgid2_fifo_ecc_single_err; + ZXIC_UINT32 mgid3_fifo_ecc_single_err; + ZXIC_UINT32 pre_rcv_ptr0_fifo_ecc_single_err; + ZXIC_UINT32 pre_rcv_ptr1_fifo_ecc_single_err; + ZXIC_UINT32 pre_rcv_ptr2_fifo_ecc_single_err; + ZXIC_UINT32 pre_rcv_ptr3_fifo_ecc_single_err; + ZXIC_UINT32 rep_cmd0_fifo_ecc_single_err; + ZXIC_UINT32 rep_cmd1_fifo_ecc_single_err; + ZXIC_UINT32 rep_cmd2_fifo_ecc_single_err; + ZXIC_UINT32 rep_cmd3_fifo_ecc_single_err; +}DPP_NPPU_MR_CFG_MR_STATES_4_T; + +typedef struct dpp_nppu_mr_cfg_mr_states_5_t +{ + ZXIC_UINT32 mlt_ecc_double_err; + ZXIC_UINT32 free_ptr0_fifo_ecc_double_err; + ZXIC_UINT32 free_ptr1_fifo_ecc_double_err; + ZXIC_UINT32 free_ptr2_fifo_ecc_double_err; + ZXIC_UINT32 free_ptr3_fifo_ecc_double_err; + ZXIC_UINT32 block_ptr0_fifo_ecc_double_err; + ZXIC_UINT32 block_ptr1_fifo_ecc_double_err; + ZXIC_UINT32 block_ptr2_fifo_ecc_double_err; + ZXIC_UINT32 block_ptr3_fifo_ecc_double_err; + ZXIC_UINT32 mgid0_fifo_ecc_double_err; + ZXIC_UINT32 mgid1_fifo_ecc_double_err; + ZXIC_UINT32 mgid2_fifo_ecc_double_err; + ZXIC_UINT32 mgid3_fifo_ecc_double_err; + ZXIC_UINT32 pre_rcv_ptr0_fifo_ecc_double_err; + ZXIC_UINT32 pre_rcv_ptr1_fifo_ecc_double_err; + ZXIC_UINT32 pre_rcv_ptr2_fifo_ecc_double_err; + ZXIC_UINT32 pre_rcv_ptr3_fifo_ecc_double_err; + ZXIC_UINT32 rep_cmd0_fifo_ecc_double_err; + ZXIC_UINT32 rep_cmd1_fifo_ecc_double_err; + ZXIC_UINT32 rep_cmd2_fifo_ecc_double_err; + ZXIC_UINT32 rep_cmd3_fifo_ecc_double_err; +}DPP_NPPU_MR_CFG_MR_STATES_5_T; + +typedef struct dpp_nppu_mr_cfg_mr_states_6_t +{ + ZXIC_UINT32 free_ptr0_fifo_empty; + ZXIC_UINT32 free_ptr1_fifo_empty; + ZXIC_UINT32 free_ptr2_fifo_empty; + ZXIC_UINT32 free_ptr3_fifo_empty; + ZXIC_UINT32 block_ptr0_fifo_empty; + ZXIC_UINT32 block_ptr1_fifo_empty; + ZXIC_UINT32 block_ptr2_fifo_empty; + ZXIC_UINT32 block_ptr3_fifo_empty; + ZXIC_UINT32 mgid0_fifo_empty; + ZXIC_UINT32 mgid1_fifo_empty; + ZXIC_UINT32 mgid2_fifo_empty; + ZXIC_UINT32 mgid3_fifo_empty; + ZXIC_UINT32 pre_rcv_ptr0_fifo_empty; + ZXIC_UINT32 pre_rcv_ptr1_fifo_empty; + ZXIC_UINT32 pre_rcv_ptr2_fifo_empty; + ZXIC_UINT32 pre_rcv_ptr3_fifo_empty; + ZXIC_UINT32 rep_cmd0_fifo_empty; + ZXIC_UINT32 rep_cmd1_fifo_empty; + ZXIC_UINT32 rep_cmd2_fifo_empty; + ZXIC_UINT32 rep_cmd3_fifo_empty; +}DPP_NPPU_MR_CFG_MR_STATES_6_T; + +typedef struct dpp_nppu_mr_cfg_mr_states_7_t +{ + ZXIC_UINT32 cos0_is_rep_busy; + ZXIC_UINT32 cos1_is_rep_busy; + ZXIC_UINT32 cos2_is_rep_busy; + ZXIC_UINT32 cos3_is_rep_busy; + ZXIC_UINT32 block_ptr0_fifo_non_sop_ren_rdy; + ZXIC_UINT32 block_ptr1_fifo_non_sop_ren_rdy; + ZXIC_UINT32 block_ptr2_fifo_non_sop_ren_rdy; + ZXIC_UINT32 block_ptr3_fifo_non_sop_ren_rdy; + ZXIC_UINT32 pre_rcv_ptr0_fifo_non_sop_ren_rdy; + ZXIC_UINT32 pre_rcv_ptr1_fifo_non_sop_ren_rdy; + ZXIC_UINT32 pre_rcv_ptr2_fifo_non_sop_ren_rdy; + ZXIC_UINT32 pre_rcv_ptr3_fifo_non_sop_ren_rdy; + ZXIC_UINT32 port_shap_rdy; + ZXIC_UINT32 mr_lif_group0_rdy_3; + ZXIC_UINT32 mr_lif_group0_rdy_2; + ZXIC_UINT32 mr_lif_group0_rdy_1; + ZXIC_UINT32 mr_lif_group0_rdy_0; + ZXIC_UINT32 pktrx_pfc_rdy_3; + ZXIC_UINT32 pktrx_pfc_rdy_2; + ZXIC_UINT32 pktrx_pfc_rdy_1; + ZXIC_UINT32 pktrx_pfc_rdy_0; + ZXIC_UINT32 pktrx_link_rdy; +}DPP_NPPU_MR_CFG_MR_STATES_7_T; + +typedef struct dpp_nppu_mr_cfg_mr_states_8_t +{ + ZXIC_UINT32 mr_head; +}DPP_NPPU_MR_CFG_MR_STATES_8_T; + +typedef struct dpp_nppu_mr_cfg_mr_sop_in_cnt_t +{ + ZXIC_UINT32 mr_sop_in_cnt; +}DPP_NPPU_MR_CFG_MR_SOP_IN_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_eop_in_cnt_t +{ + ZXIC_UINT32 mr_eop_in_cnt; +}DPP_NPPU_MR_CFG_MR_EOP_IN_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_sop_out_cnt_t +{ + ZXIC_UINT32 mr_sop_out_cnt; +}DPP_NPPU_MR_CFG_MR_SOP_OUT_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_eop_out_cnt_t +{ + ZXIC_UINT32 mr_eop_out_cnt; +}DPP_NPPU_MR_CFG_MR_EOP_OUT_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos0_in_cnt_t +{ + ZXIC_UINT32 mr_cos0_in_cnt; +}DPP_NPPU_MR_CFG_MR_COS0_IN_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos1_in_cnt_t +{ + ZXIC_UINT32 mr_cos1_in_cnt; +}DPP_NPPU_MR_CFG_MR_COS1_IN_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos2_in_cnt_t +{ + ZXIC_UINT32 mr_cos2_in_cnt; +}DPP_NPPU_MR_CFG_MR_COS2_IN_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos3_in_cnt_t +{ + ZXIC_UINT32 mr_cos3_in_cnt; +}DPP_NPPU_MR_CFG_MR_COS3_IN_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos0_out_cnt_t +{ + ZXIC_UINT32 mr_cos0_out_cnt; +}DPP_NPPU_MR_CFG_MR_COS0_OUT_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos1_out_cnt_t +{ + ZXIC_UINT32 mr_cos1_out_cnt; +}DPP_NPPU_MR_CFG_MR_COS1_OUT_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos2_out_cnt_t +{ + ZXIC_UINT32 mr_cos2_out_cnt; +}DPP_NPPU_MR_CFG_MR_COS2_OUT_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos3_out_cnt_t +{ + ZXIC_UINT32 mr_cos3_out_cnt; +}DPP_NPPU_MR_CFG_MR_COS3_OUT_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_err_in_cnt_t +{ + ZXIC_UINT32 mr_err_in_cnt; +}DPP_NPPU_MR_CFG_MR_ERR_IN_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos0_sop_in_cnt_t +{ + ZXIC_UINT32 mr_cos0_sop_in_cnt; +}DPP_NPPU_MR_CFG_MR_COS0_SOP_IN_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos0_eop_in_cnt_t +{ + ZXIC_UINT32 mr_cos0_eop_in_cnt; +}DPP_NPPU_MR_CFG_MR_COS0_EOP_IN_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos1_sop_in_cnt_t +{ + ZXIC_UINT32 mr_cos1_sop_in_cnt; +}DPP_NPPU_MR_CFG_MR_COS1_SOP_IN_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos1_eop_in_cnt_t +{ + ZXIC_UINT32 mr_cos1_eop_in_cnt; +}DPP_NPPU_MR_CFG_MR_COS1_EOP_IN_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos2_sop_in_cnt_t +{ + ZXIC_UINT32 mr_cos2_sop_in_cnt; +}DPP_NPPU_MR_CFG_MR_COS2_SOP_IN_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos2_eop_in_cnt_t +{ + ZXIC_UINT32 mr_cos2_eop_in_cnt; +}DPP_NPPU_MR_CFG_MR_COS2_EOP_IN_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos3_sop_in_cnt_t +{ + ZXIC_UINT32 mr_cos3_sop_in_cnt; +}DPP_NPPU_MR_CFG_MR_COS3_SOP_IN_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos3_eop_in_cnt_t +{ + ZXIC_UINT32 mr_cos3_eop_in_cnt; +}DPP_NPPU_MR_CFG_MR_COS3_EOP_IN_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos0_in_err_cnt_t +{ + ZXIC_UINT32 mr_cos0_in_err_cnt; +}DPP_NPPU_MR_CFG_MR_COS0_IN_ERR_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos1_in_err_cnt_t +{ + ZXIC_UINT32 mr_cos1_in_err_cnt; +}DPP_NPPU_MR_CFG_MR_COS1_IN_ERR_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos2_in_err_cnt_t +{ + ZXIC_UINT32 mr_cos2_in_err_cnt; +}DPP_NPPU_MR_CFG_MR_COS2_IN_ERR_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos3_in_err_cnt_t +{ + ZXIC_UINT32 mr_cos3_in_err_cnt; +}DPP_NPPU_MR_CFG_MR_COS3_IN_ERR_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos0_sop_out_cnt_t +{ + ZXIC_UINT32 mr_cos0_sop_out_cnt; +}DPP_NPPU_MR_CFG_MR_COS0_SOP_OUT_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos0_eop_out_cnt_t +{ + ZXIC_UINT32 mr_cos0_eop_out_cnt; +}DPP_NPPU_MR_CFG_MR_COS0_EOP_OUT_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos1_sop_out_cnt_t +{ + ZXIC_UINT32 mr_cos1_sop_out_cnt; +}DPP_NPPU_MR_CFG_MR_COS1_SOP_OUT_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos1_eop_out_cnt_t +{ + ZXIC_UINT32 mr_cos1_eop_out_cnt; +}DPP_NPPU_MR_CFG_MR_COS1_EOP_OUT_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos2_sop_out_cnt_t +{ + ZXIC_UINT32 mr_cos2_sop_out_cnt; +}DPP_NPPU_MR_CFG_MR_COS2_SOP_OUT_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos2_eop_out_cnt_t +{ + ZXIC_UINT32 mr_cos2_eop_out_cnt; +}DPP_NPPU_MR_CFG_MR_COS2_EOP_OUT_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos3_sop_out_cnt_t +{ + ZXIC_UINT32 mr_cos3_sop_out_cnt; +}DPP_NPPU_MR_CFG_MR_COS3_SOP_OUT_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_cos3_eop_out_cnt_t +{ + ZXIC_UINT32 mr_cos3_eop_out_cnt; +}DPP_NPPU_MR_CFG_MR_COS3_EOP_OUT_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_mlt_unvld_cnt_t +{ + ZXIC_UINT32 mr_mlt_unvld_cnt; +}DPP_NPPU_MR_CFG_MR_MLT_UNVLD_CNT_T; + +typedef struct dpp_nppu_mr_cfg_mr_sop_eop_match_cfg_t +{ + ZXIC_UINT32 mr_sop_eop_macth_en; + ZXIC_UINT32 mr_sop_eop_macth_dicard_th; +}DPP_NPPU_MR_CFG_MR_SOP_EOP_MATCH_CFG_T; + +typedef struct dpp_nppu_mr_cfg_mr_mlt_unvld_mgid_t +{ + ZXIC_UINT32 mr_mlt_unvld_mgid; +}DPP_NPPU_MR_CFG_MR_MLT_UNVLD_MGID_T; + +typedef struct dpp_nppu_pktrx_cfg_isch_fifo_th_1_t +{ + ZXIC_UINT32 cfg_sch_fifo7_fc_th; + ZXIC_UINT32 cfg_sch_fifo6_fc_th; + ZXIC_UINT32 cfg_sch_fifo5_fc_th; + ZXIC_UINT32 cfg_sch_fifo4_fc_th; +}DPP_NPPU_PKTRX_CFG_ISCH_FIFO_TH_1_T; + +typedef struct dpp_nppu_pktrx_cfg_isch_fifo_th_2_t +{ + ZXIC_UINT32 cfg_sch_fifo3_drop_th; + ZXIC_UINT32 cfg_sch_fifo1_drop_th; + ZXIC_UINT32 cfg_sch_fifo0_drop_th; + ZXIC_UINT32 cfg_sch_fifo8_fc_th; +}DPP_NPPU_PKTRX_CFG_ISCH_FIFO_TH_2_T; + +typedef struct dpp_nppu_pktrx_cfg_isch_fifo_th_3_t +{ + ZXIC_UINT32 cfg_sch_fifo6_drop_th; + ZXIC_UINT32 cfg_sch_fifo5_drop_th; + ZXIC_UINT32 cfg_sch_fifo4_drop_th; + ZXIC_UINT32 cfg_sch_fifo2_drop_th; +}DPP_NPPU_PKTRX_CFG_ISCH_FIFO_TH_3_T; + +typedef struct dpp_nppu_pktrx_cfg_isch_fifo_th_4_t +{ + ZXIC_UINT32 cfg_sch_fifo9_fc_th; + ZXIC_UINT32 cfg_sch_fifo9_drop_th; + ZXIC_UINT32 cfg_sch_fifo8_drop_th; + ZXIC_UINT32 cfg_sch_fifo7_drop_th; +}DPP_NPPU_PKTRX_CFG_ISCH_FIFO_TH_4_T; + +typedef struct dpp_nppu_pktrx_cfg_isch_cfg_0_t +{ + ZXIC_UINT32 cfg_sch_wrr1_weight1; +}DPP_NPPU_PKTRX_CFG_ISCH_CFG_0_T; + +typedef struct dpp_nppu_pktrx_cfg_hdu_ex_tpid_0_t +{ + ZXIC_UINT32 cfg_type0; + ZXIC_UINT32 cfg_type1; +}DPP_NPPU_PKTRX_CFG_HDU_EX_TPID_0_T; + +typedef struct dpp_nppu_pktrx_cfg_hdu_ex_tpid_1_t +{ + ZXIC_UINT32 cfg_type2; + ZXIC_UINT32 cfg_type3; +}DPP_NPPU_PKTRX_CFG_HDU_EX_TPID_1_T; + +typedef struct dpp_nppu_pktrx_cfg_hdu_int_tpid_0_t +{ + ZXIC_UINT32 cfg_inner_type0; + ZXIC_UINT32 cfg_inner_type1; +}DPP_NPPU_PKTRX_CFG_HDU_INT_TPID_0_T; + +typedef struct dpp_nppu_pktrx_cfg_hdu_int_tpid_1_t +{ + ZXIC_UINT32 cfg_inner_type2; + ZXIC_UINT32 cfg_inner_type3; +}DPP_NPPU_PKTRX_CFG_HDU_INT_TPID_1_T; + +typedef struct dpp_nppu_pktrx_cfg_hdu_hdlc_0_t +{ + ZXIC_UINT32 hdlc_cfg0_type; + ZXIC_UINT32 hdlc_cfg1_type; +}DPP_NPPU_PKTRX_CFG_HDU_HDLC_0_T; + +typedef struct dpp_nppu_pktrx_cfg_hdu_hdlc_1_t +{ + ZXIC_UINT32 hdlc_cfg2_type; + ZXIC_UINT32 hdlc_cfg3_type; +}DPP_NPPU_PKTRX_CFG_HDU_HDLC_1_T; + +typedef struct dpp_nppu_pktrx_cfg_hdu_udf_l3type_0_t +{ + ZXIC_UINT32 cfg_l3_type0; + ZXIC_UINT32 cfg_l3_type1; +}DPP_NPPU_PKTRX_CFG_HDU_UDF_L3TYPE_0_T; + +typedef struct dpp_nppu_pktrx_cfg_hdu_udf_l3type_1_t +{ + ZXIC_UINT32 cfg_l3_type2; + ZXIC_UINT32 cfg_l3_type3; +}DPP_NPPU_PKTRX_CFG_HDU_UDF_L3TYPE_1_T; + +typedef struct dpp_nppu_pktrx_cfg_hdu_udf_l3type_2_t +{ + ZXIC_UINT32 cfg_l3_type4; + ZXIC_UINT32 cfg_l3_type5; +}DPP_NPPU_PKTRX_CFG_HDU_UDF_L3TYPE_2_T; + +typedef struct dpp_nppu_pktrx_cfg_hdu_udf_l3type_3_t +{ + ZXIC_UINT32 cfg_l3_type6; + ZXIC_UINT32 cfg_l3_type7; +}DPP_NPPU_PKTRX_CFG_HDU_UDF_L3TYPE_3_T; + +typedef struct dpp_nppu_pktrx_cfg_hdu_udf_l4type_0_t +{ + ZXIC_UINT32 cfg_l4_type0; + ZXIC_UINT32 cfg_l4_type1; + ZXIC_UINT32 cfg_l4_type2; + ZXIC_UINT32 cfg_l4_type3; +}DPP_NPPU_PKTRX_CFG_HDU_UDF_L4TYPE_0_T; + +typedef struct dpp_nppu_pktrx_cfg_hdu_udf_l4type_1_t +{ + ZXIC_UINT32 cfg_l4_type4; + ZXIC_UINT32 cfg_l4_type5; + ZXIC_UINT32 cfg_l4_type6; + ZXIC_UINT32 cfg_l4_type7; +}DPP_NPPU_PKTRX_CFG_HDU_UDF_L4TYPE_1_T; + +typedef struct dpp_nppu_pktrx_cfg_hdu_udf_l4type_2_t +{ + ZXIC_UINT32 cfg_l4_type8; + ZXIC_UINT32 cfg_l4_type9; + ZXIC_UINT32 cfg_l4_type10; +}DPP_NPPU_PKTRX_CFG_HDU_UDF_L4TYPE_2_T; + +typedef struct dpp_nppu_pktrx_cfg_slot_no_cfg_t +{ + ZXIC_UINT32 cfg_parser_slot_no; +}DPP_NPPU_PKTRX_CFG_SLOT_NO_CFG_T; + +typedef struct dpp_nppu_pktrx_cfg_pktrx_int_en_0_t +{ + ZXIC_UINT32 pktrx_int_en_31; + ZXIC_UINT32 pktrx_int_en_30; + ZXIC_UINT32 pktrx_int_en_29; + ZXIC_UINT32 pktrx_int_en_28; + ZXIC_UINT32 pktrx_int_en_27; + ZXIC_UINT32 pktrx_int_en_26; + ZXIC_UINT32 pktrx_int_en_25; + ZXIC_UINT32 pktrx_int_en_24; + ZXIC_UINT32 pktrx_int_en_23; + ZXIC_UINT32 pktrx_int_en_22; + ZXIC_UINT32 pktrx_int_en_21; + ZXIC_UINT32 pktrx_int_en_20; + ZXIC_UINT32 pktrx_int_en_19; + ZXIC_UINT32 pktrx_int_en_18; + ZXIC_UINT32 pktrx_int_en_17; + ZXIC_UINT32 pktrx_int_en_16; + ZXIC_UINT32 pktrx_int_en_15; + ZXIC_UINT32 pktrx_int_en_14; + ZXIC_UINT32 pktrx_int_en_13; + ZXIC_UINT32 pktrx_int_en_12; + ZXIC_UINT32 pktrx_int_en_11; + ZXIC_UINT32 pktrx_int_en_10; + ZXIC_UINT32 pktrx_int_en_9; + ZXIC_UINT32 pktrx_int_en_8; + ZXIC_UINT32 pktrx_int_en_7; + ZXIC_UINT32 pktrx_int_en_6; + ZXIC_UINT32 pktrx_int_en_5; + ZXIC_UINT32 pktrx_int_en_4; + ZXIC_UINT32 pktrx_int_en_3; + ZXIC_UINT32 pktrx_int_en_2; + ZXIC_UINT32 pktrx_int_en_1; + ZXIC_UINT32 pktrx_int_en_0; +}DPP_NPPU_PKTRX_CFG_PKTRX_INT_EN_0_T; + +typedef struct dpp_nppu_pktrx_cfg_pktrx_int_en_1_t +{ + ZXIC_UINT32 pktrx_int_en_35; + ZXIC_UINT32 pktrx_int_en_34; + ZXIC_UINT32 pktrx_int_en_33; + ZXIC_UINT32 pktrx_int_en_32; +}DPP_NPPU_PKTRX_CFG_PKTRX_INT_EN_1_T; + +typedef struct dpp_nppu_pktrx_cfg_pktrx_int_mask_0_t +{ + ZXIC_UINT32 pktrx_int_mask_31; + ZXIC_UINT32 pktrx_int_mask_30; + ZXIC_UINT32 pktrx_int_mask_29; + ZXIC_UINT32 pktrx_int_mask_28; + ZXIC_UINT32 pktrx_int_mask_27; + ZXIC_UINT32 pktrx_int_mask_26; + ZXIC_UINT32 pktrx_int_mask_25; + ZXIC_UINT32 pktrx_int_mask_24; + ZXIC_UINT32 pktrx_int_mask_23; + ZXIC_UINT32 pktrx_int_mask_22; + ZXIC_UINT32 pktrx_int_mask_21; + ZXIC_UINT32 pktrx_int_mask_20; + ZXIC_UINT32 pktrx_int_mask_19; + ZXIC_UINT32 pktrx_int_mask_18; + ZXIC_UINT32 pktrx_int_mask_17; + ZXIC_UINT32 pktrx_int_mask_16; + ZXIC_UINT32 pktrx_int_mask_15; + ZXIC_UINT32 pktrx_int_mask_14; + ZXIC_UINT32 pktrx_int_mask_13; + ZXIC_UINT32 pktrx_int_mask_12; + ZXIC_UINT32 pktrx_int_mask_11; + ZXIC_UINT32 pktrx_int_mask_10; + ZXIC_UINT32 pktrx_int_mask_9; + ZXIC_UINT32 pktrx_int_mask_8; + ZXIC_UINT32 pktrx_int_mask_7; + ZXIC_UINT32 pktrx_int_mask_6; + ZXIC_UINT32 pktrx_int_mask_5; + ZXIC_UINT32 pktrx_int_mask_4; + ZXIC_UINT32 pktrx_int_mask_3; + ZXIC_UINT32 pktrx_int_mask_2; + ZXIC_UINT32 pktrx_int_mask_1; + ZXIC_UINT32 pktrx_int_mask_0; +}DPP_NPPU_PKTRX_CFG_PKTRX_INT_MASK_0_T; + +typedef struct dpp_nppu_pktrx_cfg_pktrx_int_mask_1_t +{ + ZXIC_UINT32 pktrx_int_mask_35; + ZXIC_UINT32 pktrx_int_mask_34; + ZXIC_UINT32 pktrx_int_mask_33; + ZXIC_UINT32 pktrx_int_mask_32; +}DPP_NPPU_PKTRX_CFG_PKTRX_INT_MASK_1_T; + +typedef struct dpp_nppu_pktrx_cfg_pktrx_int_status_t +{ + ZXIC_UINT32 int_status; +}DPP_NPPU_PKTRX_CFG_PKTRX_INT_STATUS_T; + +typedef struct dpp_nppu_pktrx_cfg_pktrx_port_rdy0_t +{ + ZXIC_UINT32 pktrx_trpgrx_r1_rdy; + ZXIC_UINT32 pktrx_trpgrx_r2_rdy; +}DPP_NPPU_PKTRX_CFG_PKTRX_PORT_RDY0_T; + +typedef struct dpp_nppu_pktrx_cfg_pktrx_lif0_pfc_rdy0_t +{ + ZXIC_UINT32 pktrx_trpgrx_r1_pfc_rdy_0; +}DPP_NPPU_PKTRX_CFG_PKTRX_LIF0_PFC_RDY0_T; + +typedef struct dpp_nppu_pktrx_cfg_pktrx_lif0_pfc_rdy1_t +{ + ZXIC_UINT32 pktrx_trpgrx_r1_pfc_rdy_1; +}DPP_NPPU_PKTRX_CFG_PKTRX_LIF0_PFC_RDY1_T; + +typedef struct dpp_nppu_pktrx_cfg_pktrx_lif0_pfc_rdy2_t +{ + ZXIC_UINT32 pktrx_trpgrx_r1_pfc_rdy_2; +}DPP_NPPU_PKTRX_CFG_PKTRX_LIF0_PFC_RDY2_T; + +typedef struct dpp_nppu_pktrx_cfg_pktrx_lif0_pfc_rdy3_t +{ + ZXIC_UINT32 pktrx_trpgrx_r2_pfc_rdy_3; +}DPP_NPPU_PKTRX_CFG_PKTRX_LIF0_PFC_RDY3_T; + +typedef struct dpp_nppu_pktrx_cfg_pktrx_lif0_pfc_rdy4_t +{ + ZXIC_UINT32 pktrx_trpgrx_r2_pfc_rdy_4; +}DPP_NPPU_PKTRX_CFG_PKTRX_LIF0_PFC_RDY4_T; + +typedef struct dpp_nppu_pktrx_cfg_pktrx_lif0_pfc_rdy5_t +{ + ZXIC_UINT32 pktrx_trpgrx_r2_pfc_rdy_5; +}DPP_NPPU_PKTRX_CFG_PKTRX_LIF0_PFC_RDY5_T; + +typedef struct dpp_nppu_pktrx_cfg_pktrx_lif0_pfc_rdy6_t +{ + ZXIC_UINT32 pktrx_trpgrx_r2_pfc_rdy_6; +}DPP_NPPU_PKTRX_CFG_PKTRX_LIF0_PFC_RDY6_T; + +typedef struct dpp_nppu_pktrx_cfg_cfg_port_l2_offset_mode_t +{ + ZXIC_UINT32 cfg_port_l2_offset_mode; +}DPP_NPPU_PKTRX_CFG_CFG_PORT_L2_OFFSET_MODE_T; + +typedef struct dpp_nppu_idma_cfg_int_ram_en_t +{ + ZXIC_UINT32 phy_sts_parity_err; + ZXIC_UINT32 ptr_buf_parity_err; +}DPP_NPPU_IDMA_CFG_INT_RAM_EN_T; + +typedef struct dpp_nppu_idma_cfg_int_ram_mask_t +{ + ZXIC_UINT32 phy_sts_parity_err; + ZXIC_UINT32 ptr_buf_parity_err; +}DPP_NPPU_IDMA_CFG_INT_RAM_MASK_T; + +typedef struct dpp_nppu_idma_cfg_int_ram_status_t +{ + ZXIC_UINT32 phy_sts_parity_err; + ZXIC_UINT32 ptr_buf_parity_err; +}DPP_NPPU_IDMA_CFG_INT_RAM_STATUS_T; + +typedef struct dpp_nppu_idma_cfg_subsys_int_mask_flag_t +{ + ZXIC_UINT32 subsys_int_mask_flag; +}DPP_NPPU_IDMA_CFG_SUBSYS_INT_MASK_FLAG_T; + +typedef struct dpp_nppu_idma_cfg_subsys_int_unmask_flag_t +{ + ZXIC_UINT32 subsys_int_unmask_flag; +}DPP_NPPU_IDMA_CFG_SUBSYS_INT_UNMASK_FLAG_T; + +typedef struct dpp_nppu_idma_cfg_debug_cnt_rdclr_mode_t +{ + ZXIC_UINT32 debug_cnt_rdclr_mode; +}DPP_NPPU_IDMA_CFG_DEBUG_CNT_RDCLR_MODE_T; + +typedef struct dpp_nppu_pbu_cfg_int_ram_en0_t +{ + ZXIC_UINT32 int_ram_en_31; + ZXIC_UINT32 int_ram_en_30; + ZXIC_UINT32 int_ram_en_29; + ZXIC_UINT32 int_ram_en_28; + ZXIC_UINT32 int_ram_en_27; + ZXIC_UINT32 int_ram_en_26; + ZXIC_UINT32 int_ram_en_25; + ZXIC_UINT32 int_ram_en_24; + ZXIC_UINT32 int_ram_en_23; + ZXIC_UINT32 int_ram_en_22; + ZXIC_UINT32 int_ram_en_21; + ZXIC_UINT32 int_ram_en_20; + ZXIC_UINT32 int_ram_en_19; + ZXIC_UINT32 int_ram_en_18; + ZXIC_UINT32 int_ram_en_17; + ZXIC_UINT32 int_ram_en_16; + ZXIC_UINT32 int_ram_en_15; + ZXIC_UINT32 int_ram_en_14; + ZXIC_UINT32 int_ram_en_13; + ZXIC_UINT32 int_ram_en_12; + ZXIC_UINT32 int_ram_en_11; + ZXIC_UINT32 int_ram_en_10; + ZXIC_UINT32 int_ram_en_9; + ZXIC_UINT32 int_ram_en_8; + ZXIC_UINT32 int_ram_en_7; + ZXIC_UINT32 int_ram_en_6; + ZXIC_UINT32 int_ram_en_5; + ZXIC_UINT32 int_ram_en_4; + ZXIC_UINT32 int_ram_en_3; + ZXIC_UINT32 int_ram_en_2; + ZXIC_UINT32 int_ram_en_1; + ZXIC_UINT32 int_ram_en_0; +}DPP_NPPU_PBU_CFG_INT_RAM_EN0_T; + +typedef struct dpp_nppu_pbu_cfg_int_ram_mask0_t +{ + ZXIC_UINT32 int_ram_mask_31; + ZXIC_UINT32 int_ram_mask_30; + ZXIC_UINT32 int_ram_mask_29; + ZXIC_UINT32 int_ram_mask_28; + ZXIC_UINT32 int_ram_mask_27; + ZXIC_UINT32 int_ram_mask_26; + ZXIC_UINT32 int_ram_mask_25; + ZXIC_UINT32 int_ram_mask_24; + ZXIC_UINT32 int_ram_mask_23; + ZXIC_UINT32 int_ram_mask_22; + ZXIC_UINT32 int_ram_mask_21; + ZXIC_UINT32 int_ram_mask_20; + ZXIC_UINT32 int_ram_mask_19; + ZXIC_UINT32 int_ram_mask_18; + ZXIC_UINT32 int_ram_mask_17; + ZXIC_UINT32 int_ram_mask_16; + ZXIC_UINT32 int_ram_mask_15; + ZXIC_UINT32 int_ram_mask_14; + ZXIC_UINT32 int_ram_mask_13; + ZXIC_UINT32 int_ram_mask_12; + ZXIC_UINT32 int_ram_mask_11; + ZXIC_UINT32 int_ram_mask_10; + ZXIC_UINT32 int_ram_mask_9; + ZXIC_UINT32 int_ram_mask_8; + ZXIC_UINT32 int_ram_mask_7; + ZXIC_UINT32 int_ram_mask_6; + ZXIC_UINT32 int_ram_mask_5; + ZXIC_UINT32 int_ram_mask_4; + ZXIC_UINT32 int_ram_mask_3; + ZXIC_UINT32 int_ram_mask_2; + ZXIC_UINT32 int_ram_mask_1; + ZXIC_UINT32 int_ram_mask_0; +}DPP_NPPU_PBU_CFG_INT_RAM_MASK0_T; + +typedef struct dpp_nppu_pbu_cfg_int_ram_status0_t +{ + ZXIC_UINT32 int_ram_status_31; + ZXIC_UINT32 int_ram_status_30; + ZXIC_UINT32 int_ram_status_29; + ZXIC_UINT32 int_ram_status_28; + ZXIC_UINT32 int_ram_status_27; + ZXIC_UINT32 int_ram_status_26; + ZXIC_UINT32 int_ram_status_25; + ZXIC_UINT32 int_ram_status_24; + ZXIC_UINT32 int_ram_status_23; + ZXIC_UINT32 int_ram_status_22; + ZXIC_UINT32 int_ram_status_21; + ZXIC_UINT32 int_ram_status_20; + ZXIC_UINT32 int_ram_status_19; + ZXIC_UINT32 int_ram_status_18; + ZXIC_UINT32 int_ram_status_17; + ZXIC_UINT32 int_ram_status_16; + ZXIC_UINT32 int_ram_status_15; + ZXIC_UINT32 int_ram_status_14; + ZXIC_UINT32 int_ram_status_13; + ZXIC_UINT32 int_ram_status_12; + ZXIC_UINT32 int_ram_status_11; + ZXIC_UINT32 int_ram_status_10; + ZXIC_UINT32 int_ram_status_9; + ZXIC_UINT32 int_ram_status_8; + ZXIC_UINT32 int_ram_status_7; + ZXIC_UINT32 int_ram_status_6; + ZXIC_UINT32 int_ram_status_5; + ZXIC_UINT32 int_ram_status_4; + ZXIC_UINT32 int_ram_status_3; + ZXIC_UINT32 int_ram_status_2; + ZXIC_UINT32 int_ram_status_1; + ZXIC_UINT32 int_ram_status_0; +}DPP_NPPU_PBU_CFG_INT_RAM_STATUS0_T; + +typedef struct dpp_nppu_pbu_cfg_int_fifo_en0_t +{ + ZXIC_UINT32 int_fifo_en_31; + ZXIC_UINT32 int_fifo_en_30; + ZXIC_UINT32 int_fifo_en_29; + ZXIC_UINT32 int_fifo_en_28; + ZXIC_UINT32 int_fifo_en_27; + ZXIC_UINT32 int_fifo_en_26; + ZXIC_UINT32 int_fifo_en_25; + ZXIC_UINT32 int_fifo_en_24; + ZXIC_UINT32 int_fifo_en_23; + ZXIC_UINT32 int_fifo_en_22; + ZXIC_UINT32 int_fifo_en_21; + ZXIC_UINT32 int_fifo_en_20; + ZXIC_UINT32 int_fifo_en_19; + ZXIC_UINT32 int_fifo_en_18; + ZXIC_UINT32 int_fifo_en_17; + ZXIC_UINT32 int_fifo_en_16; + ZXIC_UINT32 int_fifo_en_15; + ZXIC_UINT32 int_fifo_en_14; + ZXIC_UINT32 int_fifo_en_13; + ZXIC_UINT32 int_fifo_en_12; + ZXIC_UINT32 int_fifo_en_11; + ZXIC_UINT32 int_fifo_en_10; + ZXIC_UINT32 int_fifo_en_9; + ZXIC_UINT32 int_fifo_en_8; + ZXIC_UINT32 int_fifo_en_7; + ZXIC_UINT32 int_fifo_en_6; + ZXIC_UINT32 int_fifo_en_5; + ZXIC_UINT32 int_fifo_en_4; + ZXIC_UINT32 int_fifo_en_3; + ZXIC_UINT32 int_fifo_en_2; + ZXIC_UINT32 int_fifo_en_1; + ZXIC_UINT32 int_fifo_en_0; +}DPP_NPPU_PBU_CFG_INT_FIFO_EN0_T; + +typedef struct dpp_nppu_pbu_cfg_int_fifo_en1_t +{ + ZXIC_UINT32 int_fifo_en_35; + ZXIC_UINT32 int_fifo_en_34; + ZXIC_UINT32 int_fifo_en_33; + ZXIC_UINT32 int_fifo_en_32; +}DPP_NPPU_PBU_CFG_INT_FIFO_EN1_T; + +typedef struct dpp_nppu_pbu_cfg_int_fifo_mask0_t +{ + ZXIC_UINT32 int_fifo_mask_31; + ZXIC_UINT32 int_fifo_mask_30; + ZXIC_UINT32 int_fifo_mask_29; + ZXIC_UINT32 int_fifo_mask_28; + ZXIC_UINT32 int_fifo_mask_27; + ZXIC_UINT32 int_fifo_mask_26; + ZXIC_UINT32 int_fifo_mask_25; + ZXIC_UINT32 int_fifo_mask_24; + ZXIC_UINT32 int_fifo_mask_23; + ZXIC_UINT32 int_fifo_mask_22; + ZXIC_UINT32 int_fifo_mask_21; + ZXIC_UINT32 int_fifo_mask_20; + ZXIC_UINT32 int_fifo_mask_19; + ZXIC_UINT32 int_fifo_mask_18; + ZXIC_UINT32 int_fifo_mask_17; + ZXIC_UINT32 int_fifo_mask_16; + ZXIC_UINT32 int_fifo_mask_15; + ZXIC_UINT32 int_fifo_mask_14; + ZXIC_UINT32 int_fifo_mask_13; + ZXIC_UINT32 int_fifo_mask_12; + ZXIC_UINT32 int_fifo_mask_11; + ZXIC_UINT32 int_fifo_mask_10; + ZXIC_UINT32 int_fifo_mask_9; + ZXIC_UINT32 int_fifo_mask_8; + ZXIC_UINT32 int_fifo_mask_7; + ZXIC_UINT32 int_fifo_mask_6; + ZXIC_UINT32 int_fifo_mask_5; + ZXIC_UINT32 int_fifo_mask_4; + ZXIC_UINT32 int_fifo_mask_3; + ZXIC_UINT32 int_fifo_mask_2; + ZXIC_UINT32 int_fifo_mask_1; + ZXIC_UINT32 int_fifo_mask_0; +}DPP_NPPU_PBU_CFG_INT_FIFO_MASK0_T; + +typedef struct dpp_nppu_pbu_cfg_int_fifo_mask1_t +{ + ZXIC_UINT32 int_fifo_mask_35; + ZXIC_UINT32 int_fifo_mask_34; + ZXIC_UINT32 int_fifo_mask_33; + ZXIC_UINT32 int_fifo_mask_32; +}DPP_NPPU_PBU_CFG_INT_FIFO_MASK1_T; + +typedef struct dpp_nppu_pbu_cfg_int_fifo_status0_t +{ + ZXIC_UINT32 int_fifo_status_31; + ZXIC_UINT32 int_fifo_status_30; + ZXIC_UINT32 int_fifo_status_29; + ZXIC_UINT32 int_fifo_status_28; + ZXIC_UINT32 int_fifo_status_27; + ZXIC_UINT32 int_fifo_status_26; + ZXIC_UINT32 int_fifo_status_25; + ZXIC_UINT32 int_fifo_status_24; + ZXIC_UINT32 int_fifo_status_23; + ZXIC_UINT32 int_fifo_status_22; + ZXIC_UINT32 int_fifo_status_21; + ZXIC_UINT32 int_fifo_status_20; + ZXIC_UINT32 int_fifo_status_19; + ZXIC_UINT32 int_fifo_status_18; + ZXIC_UINT32 int_fifo_status_17; + ZXIC_UINT32 int_fifo_status_16; + ZXIC_UINT32 int_fifo_status_15; + ZXIC_UINT32 int_fifo_status_14; + ZXIC_UINT32 int_fifo_status_13; + ZXIC_UINT32 int_fifo_status_12; + ZXIC_UINT32 int_fifo_status_11; + ZXIC_UINT32 int_fifo_status_10; + ZXIC_UINT32 int_fifo_status_9; + ZXIC_UINT32 int_fifo_status_8; + ZXIC_UINT32 int_fifo_status_7; + ZXIC_UINT32 int_fifo_status_6; + ZXIC_UINT32 int_fifo_status_5; + ZXIC_UINT32 int_fifo_status_4; + ZXIC_UINT32 int_fifo_status_3; + ZXIC_UINT32 int_fifo_status_2; + ZXIC_UINT32 int_fifo_status_1; + ZXIC_UINT32 int_fifo_status_0; +}DPP_NPPU_PBU_CFG_INT_FIFO_STATUS0_T; + +typedef struct dpp_nppu_pbu_cfg_int_fifo_status1_t +{ + ZXIC_UINT32 int_fifo_status_35; + ZXIC_UINT32 int_fifo_status_34; + ZXIC_UINT32 int_fifo_status_33; + ZXIC_UINT32 int_fifo_status_32; +}DPP_NPPU_PBU_CFG_INT_FIFO_STATUS1_T; + +typedef struct dpp_nppu_pbu_cfg_subsys_int_mask_flag_t +{ + ZXIC_UINT32 subsys_int_mask_flag; +}DPP_NPPU_PBU_CFG_SUBSYS_INT_MASK_FLAG_T; + +typedef struct dpp_nppu_pbu_cfg_subsys_int_unmask_flag_t +{ + ZXIC_UINT32 subsys_int_unmask_flag; +}DPP_NPPU_PBU_CFG_SUBSYS_INT_UNMASK_FLAG_T; + +typedef struct dpp_nppu_pbu_cfg_sa_ip_en_t +{ + ZXIC_UINT32 sa_ip_en; +}DPP_NPPU_PBU_CFG_SA_IP_EN_T; + +typedef struct dpp_nppu_pbu_cfg_debug_cnt_rdclr_mode_t +{ + ZXIC_UINT32 debug_cnt_rdclr_mode; +}DPP_NPPU_PBU_CFG_DEBUG_CNT_RDCLR_MODE_T; + +typedef struct dpp_nppu_pbu_cfg_fptr_fifo_aful_assert_cfg_t +{ + ZXIC_UINT32 fptr_fifo_aful_assert_cfg; +}DPP_NPPU_PBU_CFG_FPTR_FIFO_AFUL_ASSERT_CFG_T; + +typedef struct dpp_nppu_pbu_cfg_fptr_fifo_aful_negate_cfg_t +{ + ZXIC_UINT32 fptr_fifo_aful_negate_cfg; +}DPP_NPPU_PBU_CFG_FPTR_FIFO_AFUL_NEGATE_CFG_T; + +typedef struct dpp_nppu_pbu_cfg_pf_fifo_aful_assert_cfg_t +{ + ZXIC_UINT32 pf_fifo_aful_assert_cfg; +}DPP_NPPU_PBU_CFG_PF_FIFO_AFUL_ASSERT_CFG_T; + +typedef struct dpp_nppu_pbu_cfg_pf_fifo_aful_negate_cfg_t +{ + ZXIC_UINT32 pf_fifo_aful_negate_cfg; +}DPP_NPPU_PBU_CFG_PF_FIFO_AFUL_NEGATE_CFG_T; + +typedef struct dpp_nppu_pbu_cfg_pf_fifo_aept_assert_cfg_t +{ + ZXIC_UINT32 pf_fifo_aept_assert_cfg; +}DPP_NPPU_PBU_CFG_PF_FIFO_AEPT_ASSERT_CFG_T; + +typedef struct dpp_nppu_pbu_cfg_pf_fifo_aept_negate_cfg_t +{ + ZXIC_UINT32 pf_fifo_aept_negate_cfg; +}DPP_NPPU_PBU_CFG_PF_FIFO_AEPT_NEGATE_CFG_T; + +typedef struct dpp_nppu_pbu_cfg_wb_aful_assert_cfg_t +{ + ZXIC_UINT32 wb_aful_assert_cfg; +}DPP_NPPU_PBU_CFG_WB_AFUL_ASSERT_CFG_T; + +typedef struct dpp_nppu_pbu_cfg_wb_aful_negate_cfg_t +{ + ZXIC_UINT32 wb_aful_negate_cfg; +}DPP_NPPU_PBU_CFG_WB_AFUL_NEGATE_CFG_T; + +typedef struct dpp_nppu_pbu_cfg_se_key_aful_assert_cfg_t +{ + ZXIC_UINT32 se_key_aful_assert_cfg; +}DPP_NPPU_PBU_CFG_SE_KEY_AFUL_ASSERT_CFG_T; + +typedef struct dpp_nppu_pbu_cfg_ifbrd_se_aful_assert_cfg_t +{ + ZXIC_UINT32 ifbrd_se_aful_assert_cfg; +}DPP_NPPU_PBU_CFG_IFBRD_SE_AFUL_ASSERT_CFG_T; + +typedef struct dpp_nppu_pbu_cfg_ifbrd_se_aful_negate_cfg_t +{ + ZXIC_UINT32 ifbrd_se_aful_negate_cfg; +}DPP_NPPU_PBU_CFG_IFBRD_SE_AFUL_NEGATE_CFG_T; + +typedef struct dpp_nppu_pbu_cfg_ifbrd_odma_aful_assert_cfg_t +{ + ZXIC_UINT32 ifbrd_odma_aful_assert_cfg; +}DPP_NPPU_PBU_CFG_IFBRD_ODMA_AFUL_ASSERT_CFG_T; + +typedef struct dpp_nppu_pbu_cfg_ifbrd_odma_aful_negate_cfg_t +{ + ZXIC_UINT32 ifbrd_odma_aful_negate_cfg; +}DPP_NPPU_PBU_CFG_IFBRD_ODMA_AFUL_NEGATE_CFG_T; + +typedef struct dpp_nppu_pbu_cfg_ifbrd_ppu_aful_assert_cfg_t +{ + ZXIC_UINT32 ifbrd_ppu_aful_assert_cfg; +}DPP_NPPU_PBU_CFG_IFBRD_PPU_AFUL_ASSERT_CFG_T; + +typedef struct dpp_nppu_pbu_cfg_ifbrd_ppu_aful_negate_cfg_t +{ + ZXIC_UINT32 ifbrd_ppu_aful_negate_cfg; +}DPP_NPPU_PBU_CFG_IFBRD_PPU_AFUL_NEGATE_CFG_T; + +typedef struct dpp_nppu_pbu_cfg_mc_logic_aful_assert_cfg_t +{ + ZXIC_UINT32 mc_logic_aful_assert_cfg; +}DPP_NPPU_PBU_CFG_MC_LOGIC_AFUL_ASSERT_CFG_T; + +typedef struct dpp_nppu_pbu_cfg_mc_logic_aful_negate_cfg_t +{ + ZXIC_UINT32 mc_logic_aful_negate_cfg; +}DPP_NPPU_PBU_CFG_MC_LOGIC_AFUL_NEGATE_CFG_T; + +typedef struct dpp_nppu_pbu_cfg_mc_logic_diff_t +{ + ZXIC_UINT32 mc_logic_diff; +}DPP_NPPU_PBU_CFG_MC_LOGIC_DIFF_T; + +typedef struct dpp_nppu_pbu_cfg_cfg_peak_port_cnt_clr_t +{ + ZXIC_UINT32 cfg_peak_port_cnt_clr; +}DPP_NPPU_PBU_CFG_CFG_PEAK_PORT_CNT_CLR_T; + +typedef struct dpp_nppu_pbu_cfg_all_ftm_crdt_th_t +{ + ZXIC_UINT32 ftm_crdt_port_cng_th; + ZXIC_UINT32 ftm_crdt_port_th; +}DPP_NPPU_PBU_CFG_ALL_FTM_CRDT_TH_T; + +typedef struct dpp_nppu_pbu_cfg_all_ftm_link_th_01_t +{ + ZXIC_UINT32 total_congest_th1; + ZXIC_UINT32 total_congest_th0; +}DPP_NPPU_PBU_CFG_ALL_FTM_LINK_TH_01_T; + +typedef struct dpp_nppu_pbu_cfg_all_ftm_link_th_23_t +{ + ZXIC_UINT32 total_congest_th3; + ZXIC_UINT32 total_congest_th2; +}DPP_NPPU_PBU_CFG_ALL_FTM_LINK_TH_23_T; + +typedef struct dpp_nppu_pbu_cfg_all_ftm_link_th_45_t +{ + ZXIC_UINT32 total_congest_th5; + ZXIC_UINT32 total_congest_th4; +}DPP_NPPU_PBU_CFG_ALL_FTM_LINK_TH_45_T; + +typedef struct dpp_nppu_pbu_cfg_all_ftm_link_th_6_t +{ + ZXIC_UINT32 total_congest_th6; +}DPP_NPPU_PBU_CFG_ALL_FTM_LINK_TH_6_T; + +typedef struct dpp_nppu_pbu_cfg_all_ftm_total_congest_th_t +{ + ZXIC_UINT32 all_ftm_total_congest_th; +}DPP_NPPU_PBU_CFG_ALL_FTM_TOTAL_CONGEST_TH_T; + +typedef struct dpp_nppu_pbu_cfg_cfg_crdt_mode_t +{ + ZXIC_UINT32 cfg_crdt_mode; +}DPP_NPPU_PBU_CFG_CFG_CRDT_MODE_T; + +typedef struct dpp_nppu_pbu_cfg_cfg_pfc_rdy_high_time_t +{ + ZXIC_UINT32 cfg_pfc_rdy_high_time; +}DPP_NPPU_PBU_CFG_CFG_PFC_RDY_HIGH_TIME_T; + +typedef struct dpp_nppu_pbu_cfg_cfg_pfc_rdy_low_time_t +{ + ZXIC_UINT32 cfg_pfc_rdy_low_time; +}DPP_NPPU_PBU_CFG_CFG_PFC_RDY_LOW_TIME_T; + +typedef struct dpp_nppu_pbu_stat_pbu_fc_rdy_t +{ + ZXIC_UINT32 pbu_oam_send_fc_rdy; + ZXIC_UINT32 pbu_odma_fc_rdy; + ZXIC_UINT32 pbu_tm_fc_rdy; + ZXIC_UINT32 pbu_idma_cos_rdy; +}DPP_NPPU_PBU_STAT_PBU_FC_RDY_T; + +typedef struct dpp_nppu_pbu_stat_pbu_lif_group0_rdy0_t +{ + ZXIC_UINT32 pbu_ipg1_rdy; + ZXIC_UINT32 pbu_ipg0_rdy; + ZXIC_UINT32 pbu_trpgrx_xge_rdy; + ZXIC_UINT32 pbu_trpgrx_cge1_rdy; + ZXIC_UINT32 pbu_trpgrx_cge0_rdy; +}DPP_NPPU_PBU_STAT_PBU_LIF_GROUP0_RDY0_T; + +typedef struct dpp_nppu_pbu_stat_pbu_lif_group0_rdy1_t +{ + ZXIC_UINT32 pbu_lif_group0_rdy1; +}DPP_NPPU_PBU_STAT_PBU_LIF_GROUP0_RDY1_T; + +typedef struct dpp_nppu_pbu_stat_pbu_lif_group1_rdy_t +{ + ZXIC_UINT32 pbu_lif_group1_rdy1; +}DPP_NPPU_PBU_STAT_PBU_LIF_GROUP1_RDY_T; + +typedef struct dpp_nppu_pbu_stat_pbu_lif_group0_pfc_rdy_t +{ + ZXIC_UINT32 pbu_lif_group0_pfc_rdy; +}DPP_NPPU_PBU_STAT_PBU_LIF_GROUP0_PFC_RDY_T; + +typedef struct dpp_nppu_pbu_stat_pbu_lif_group1_pfc_rdy_t +{ + ZXIC_UINT32 pbu_lif_group1_pfc_rdy; +}DPP_NPPU_PBU_STAT_PBU_LIF_GROUP1_PFC_RDY_T; + +typedef struct dpp_nppu_pbu_stat_pbu_sa_port_rdy_0_31_t +{ + ZXIC_UINT32 pbu_sa_port_rdy_0_31; +}DPP_NPPU_PBU_STAT_PBU_SA_PORT_RDY_0_31_T; + +typedef struct dpp_nppu_pbu_stat_pbu_sa_port_rdy_32_50_t +{ + ZXIC_UINT32 pbu_sa_port_rdy_32_50; +}DPP_NPPU_PBU_STAT_PBU_SA_PORT_RDY_32_50_T; + +typedef struct dpp_nppu_pbu_stat_pbu_pktrx_mr_pfc_rdy_t +{ + ZXIC_UINT32 pbu_pktrx_mr_pfc_rdy; +}DPP_NPPU_PBU_STAT_PBU_PKTRX_MR_PFC_RDY_T; + +typedef struct dpp_nppu_pbu_stat_pbu_ftm_crdt_port_rdy_0_31_t +{ + ZXIC_UINT32 pbu_ftm_crdt_port_rdy_0_31; +}DPP_NPPU_PBU_STAT_PBU_FTM_CRDT_PORT_RDY_0_31_T; + +typedef struct dpp_nppu_pbu_stat_pbu_ftm_crdt_port_rdy_32_47_t +{ + ZXIC_UINT32 pbu_ftm_crdt_port_rdy_32_47; +}DPP_NPPU_PBU_STAT_PBU_FTM_CRDT_PORT_RDY_32_47_T; + +typedef struct dpp_nppu_pbu_stat_pbu_ftm_crdt_port_cng_rdy_0_31_t +{ + ZXIC_UINT32 pbu_ftm_crdt_port_cng_rdy_0_31; +}DPP_NPPU_PBU_STAT_PBU_FTM_CRDT_PORT_CNG_RDY_0_31_T; + +typedef struct dpp_nppu_pbu_stat_pbu_ftm_crdt_port_cng_rdy_32_47_t +{ + ZXIC_UINT32 pbu_ftm_crdt_port_cng_rdy_32_47; +}DPP_NPPU_PBU_STAT_PBU_FTM_CRDT_PORT_CNG_RDY_32_47_T; + +typedef struct dpp_nppu_pbu_stat_pbu_ftm_crdt_sys_info_t +{ + ZXIC_UINT32 pbu_ftm_crdt_sys_info; +}DPP_NPPU_PBU_STAT_PBU_FTM_CRDT_SYS_INFO_T; + +typedef struct dpp_nppu_isu_cfg_weight_normal_mc_t +{ + ZXIC_UINT32 weight_normal_mc; +}DPP_NPPU_ISU_CFG_WEIGHT_NORMAL_MC_T; + +typedef struct dpp_nppu_isu_cfg_weight_sa_mc_t +{ + ZXIC_UINT32 weight_sa_mc; +}DPP_NPPU_ISU_CFG_WEIGHT_SA_MC_T; + +typedef struct dpp_nppu_isu_cfg_weight_etm_t +{ + ZXIC_UINT32 weight_etm; +}DPP_NPPU_ISU_CFG_WEIGHT_ETM_T; + +typedef struct dpp_nppu_isu_cfg_weight_lp_mc_t +{ + ZXIC_UINT32 weight_lp_mc; +}DPP_NPPU_ISU_CFG_WEIGHT_LP_MC_T; + +typedef struct dpp_nppu_isu_cfg_weight_oam_t +{ + ZXIC_UINT32 weight_oam; +}DPP_NPPU_ISU_CFG_WEIGHT_OAM_T; + +typedef struct dpp_nppu_isu_cfg_weight_lif_ctrl1_t +{ + ZXIC_UINT32 weight_lif_ctrl1; +}DPP_NPPU_ISU_CFG_WEIGHT_LIF_CTRL1_T; + +typedef struct dpp_nppu_isu_cfg_weight_lif_ctrl2_t +{ + ZXIC_UINT32 weight_lif_ctrl2; +}DPP_NPPU_ISU_CFG_WEIGHT_LIF_CTRL2_T; + +typedef struct dpp_nppu_isu_cfg_ecc_bypass_read_t +{ + ZXIC_UINT32 eccbypass; +}DPP_NPPU_ISU_CFG_ECC_BYPASS_READ_T; + +typedef struct dpp_nppu_isu_cfg_isu_int_mask_t +{ + ZXIC_UINT32 isu_int_mask; +}DPP_NPPU_ISU_CFG_ISU_INT_MASK_T; + +typedef struct dpp_nppu_isu_cfg_cfg_crdt_cycle_t +{ + ZXIC_UINT32 cfg_cycle; +}DPP_NPPU_ISU_CFG_CFG_CRDT_CYCLE_T; + +typedef struct dpp_nppu_isu_cfg_cfg_crdt_value_t +{ + ZXIC_UINT32 cfg_value; +}DPP_NPPU_ISU_CFG_CFG_CRDT_VALUE_T; + +typedef struct dpp_nppu_isu_cfg_isu_int_en_t +{ + ZXIC_UINT32 isu_int_en; +}DPP_NPPU_ISU_CFG_ISU_INT_EN_T; + +typedef struct dpp_nppu_isu_cfg_isu_ppu_fifo_fc_t +{ + ZXIC_UINT32 isu_ppu_fifo_fc; +}DPP_NPPU_ISU_CFG_ISU_PPU_FIFO_FC_T; + +typedef struct dpp_nppu_isu_cfg_isu_int_status_t +{ + ZXIC_UINT32 isu_int_status_26; + ZXIC_UINT32 isu_int_status_25; + ZXIC_UINT32 isu_int_status_24; + ZXIC_UINT32 isu_int_status_23; + ZXIC_UINT32 isu_int_status_22; + ZXIC_UINT32 isu_int_status_21; + ZXIC_UINT32 isu_int_status_20; + ZXIC_UINT32 isu_int_status_19; + ZXIC_UINT32 isu_int_status_18; + ZXIC_UINT32 isu_int_status_17; + ZXIC_UINT32 isu_int_status_16; + ZXIC_UINT32 isu_int_status_15; + ZXIC_UINT32 isu_int_status_14; + ZXIC_UINT32 isu_int_status_13; + ZXIC_UINT32 isu_int_status_12; + ZXIC_UINT32 isu_int_status_11; + ZXIC_UINT32 isu_int_status_10; + ZXIC_UINT32 isu_int_status_9; + ZXIC_UINT32 isu_int_status_8; + ZXIC_UINT32 isu_int_status_7; + ZXIC_UINT32 isu_int_status_6; + ZXIC_UINT32 isu_int_status_5; + ZXIC_UINT32 isu_int_status_4; + ZXIC_UINT32 isu_int_status_3; + ZXIC_UINT32 isu_int_status_2; + ZXIC_UINT32 isu_int_status_1; + ZXIC_UINT32 isu_int_status_0; +}DPP_NPPU_ISU_CFG_ISU_INT_STATUS_T; + +typedef struct dpp_nppu_isu_cfg_fd_prog_full_assert_cfg_t +{ + ZXIC_UINT32 fd_prog_full_assert_cfg; +}DPP_NPPU_ISU_CFG_FD_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_nppu_isu_cfg_fd_prog_full_negate_cfg_t +{ + ZXIC_UINT32 fd_prog_full_negate_cfg; +}DPP_NPPU_ISU_CFG_FD_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_nppu_isu_cfg_lp_prog_full_assert_cfg_t +{ + ZXIC_UINT32 lp_prog_ept_assert_cfg; +}DPP_NPPU_ISU_CFG_LP_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_nppu_isu_cfg_lp_prog_full_negate_cfg_t +{ + ZXIC_UINT32 lp_prog_ept_negate_cfg; +}DPP_NPPU_ISU_CFG_LP_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_nppu_isu_stat_debug_cnt_dat0_t +{ + ZXIC_UINT32 debug_cnt_dat0; +}DPP_NPPU_ISU_STAT_DEBUG_CNT_DAT0_T; + +typedef struct dpp_nppu_isu_stat_debug_cnt_dat1_t +{ + ZXIC_UINT32 debug_cnt_dat1; +}DPP_NPPU_ISU_STAT_DEBUG_CNT_DAT1_T; + +typedef struct dpp_nppu_isu_stat_debug_cnt_dat2_t +{ + ZXIC_UINT32 debug_cnt_dat2; +}DPP_NPPU_ISU_STAT_DEBUG_CNT_DAT2_T; + +typedef struct dpp_nppu_isu_stat_debug_cnt_dat3_t +{ + ZXIC_UINT32 debug_cnt_dat3; +}DPP_NPPU_ISU_STAT_DEBUG_CNT_DAT3_T; + +typedef struct dpp_nppu_isu_stat_debug_cnt_dat4_t +{ + ZXIC_UINT32 debug_cnt_dat4; +}DPP_NPPU_ISU_STAT_DEBUG_CNT_DAT4_T; + +typedef struct dpp_nppu_isu_stat_debug_cnt_dat5_t +{ + ZXIC_UINT32 debug_cnt_dat5; +}DPP_NPPU_ISU_STAT_DEBUG_CNT_DAT5_T; + +typedef struct dpp_nppu_isu_stat_debug_cnt_dat6_t +{ + ZXIC_UINT32 debug_cnt_dat6; +}DPP_NPPU_ISU_STAT_DEBUG_CNT_DAT6_T; + +typedef struct dpp_nppu_isu_stat_debug_cnt_dat7_t +{ + ZXIC_UINT32 debug_cnt_dat7; +}DPP_NPPU_ISU_STAT_DEBUG_CNT_DAT7_T; + +typedef struct dpp_nppu_isu_stat_debug_cnt_dat8_t +{ + ZXIC_UINT32 debug_cnt_dat8; +}DPP_NPPU_ISU_STAT_DEBUG_CNT_DAT8_T; + +typedef struct dpp_nppu_isu_stat_debug_cnt_dat9_t +{ + ZXIC_UINT32 debug_cnt_dat9; +}DPP_NPPU_ISU_STAT_DEBUG_CNT_DAT9_T; + +typedef struct dpp_nppu_isu_stat_debug_cnt_dat10_t +{ + ZXIC_UINT32 debug_cnt_dat10; +}DPP_NPPU_ISU_STAT_DEBUG_CNT_DAT10_T; + +typedef struct dpp_nppu_isu_stat_debug_cnt_dat11_t +{ + ZXIC_UINT32 debug_cnt_dat11; +}DPP_NPPU_ISU_STAT_DEBUG_CNT_DAT11_T; + +typedef struct dpp_nppu_isu_stat_debug_cnt_dat12_t +{ + ZXIC_UINT32 debug_cnt_dat12; +}DPP_NPPU_ISU_STAT_DEBUG_CNT_DAT12_T; + +typedef struct dpp_nppu_isu_stat_debug_cnt_dat13_t +{ + ZXIC_UINT32 debug_cnt_dat13; +}DPP_NPPU_ISU_STAT_DEBUG_CNT_DAT13_T; + +typedef struct dpp_nppu_isu_stat_debug_cnt_dat14_t +{ + ZXIC_UINT32 debug_cnt_dat14; +}DPP_NPPU_ISU_STAT_DEBUG_CNT_DAT14_T; + +typedef struct dpp_nppu_isu_stat_debug_cnt_dat15_t +{ + ZXIC_UINT32 debug_cnt_dat15; +}DPP_NPPU_ISU_STAT_DEBUG_CNT_DAT15_T; + +typedef struct dpp_nppu_isu_stat_debug_cnt_dat16_t +{ + ZXIC_UINT32 debug_cnt_dat16; +}DPP_NPPU_ISU_STAT_DEBUG_CNT_DAT16_T; + +typedef struct dpp_nppu_isu_stat_debug_cnt_dat17_t +{ + ZXIC_UINT32 debug_cnt_dat17; +}DPP_NPPU_ISU_STAT_DEBUG_CNT_DAT17_T; + +typedef struct dpp_nppu_isu_stat_debug_cnt_dat18_t +{ + ZXIC_UINT32 debug_cnt_dat18; +}DPP_NPPU_ISU_STAT_DEBUG_CNT_DAT18_T; + +typedef struct dpp_nppu_isu_stat_debug_cnt_dat19_t +{ + ZXIC_UINT32 debug_cnt_dat18; +}DPP_NPPU_ISU_STAT_DEBUG_CNT_DAT19_T; + +typedef struct dpp_nppu_isu_stat_debug_cnt_cfg_t +{ + ZXIC_UINT32 debug_cnt_ovf_mode; + ZXIC_UINT32 debug_cnt_rdclr_mode; + ZXIC_UINT32 user_cnt_value; +}DPP_NPPU_ISU_STAT_DEBUG_CNT_CFG_T; + +typedef struct dpp_nppu_odma_cfg_exsa_tdm_offset_t +{ + ZXIC_UINT32 exsa_tdm_offset; +}DPP_NPPU_ODMA_CFG_EXSA_TDM_OFFSET_T; + +typedef struct dpp_nppu_odma_cfg_ecc_bypass_readt_t +{ + ZXIC_UINT32 ecc_bypass_read; +}DPP_NPPU_ODMA_CFG_ECC_BYPASS_READT_T; + +typedef struct dpp_nppu_odma_cfg_odma_int_en_0_t +{ + ZXIC_UINT32 odma_int_en_31; + ZXIC_UINT32 odma_int_en_30; + ZXIC_UINT32 odma_int_en_29; + ZXIC_UINT32 odma_int_en_28; + ZXIC_UINT32 odma_int_en_27; + ZXIC_UINT32 odma_int_en_26; + ZXIC_UINT32 odma_int_en_25; + ZXIC_UINT32 odma_int_en_24; + ZXIC_UINT32 odma_int_en_22; + ZXIC_UINT32 odma_int_en_21; + ZXIC_UINT32 odma_int_en_18; +}DPP_NPPU_ODMA_CFG_ODMA_INT_EN_0_T; + +typedef struct dpp_nppu_odma_cfg_odma_int_en_1_t +{ + ZXIC_UINT32 odma_int_en_63; + ZXIC_UINT32 odma_int_en_62; + ZXIC_UINT32 odma_int_en_61; + ZXIC_UINT32 odma_int_en_59; + ZXIC_UINT32 odma_int_en_58; + ZXIC_UINT32 odma_int_en_57; + ZXIC_UINT32 odma_int_en_56; + ZXIC_UINT32 odma_int_en_55; + ZXIC_UINT32 odma_int_en_54; + ZXIC_UINT32 odma_int_en_53; + ZXIC_UINT32 odma_int_en_52; + ZXIC_UINT32 odma_int_en_51; + ZXIC_UINT32 odma_int_en_49; + ZXIC_UINT32 odma_int_en_47; + ZXIC_UINT32 odma_int_en_45; + ZXIC_UINT32 odma_int_en_39; + ZXIC_UINT32 odma_int_en_38; + ZXIC_UINT32 odma_int_en_37; + ZXIC_UINT32 odma_int_en_36; + ZXIC_UINT32 odma_int_en_35; + ZXIC_UINT32 odma_int_en_34; + ZXIC_UINT32 odma_int_en_33; + ZXIC_UINT32 odma_int_en_32; +}DPP_NPPU_ODMA_CFG_ODMA_INT_EN_1_T; + +typedef struct dpp_nppu_odma_cfg_odma_int_en_2_t +{ + ZXIC_UINT32 odma_int_en_91; + ZXIC_UINT32 odma_int_en_88; + ZXIC_UINT32 odma_int_en_85; + ZXIC_UINT32 odma_int_en_82; + ZXIC_UINT32 odma_int_en_79; + ZXIC_UINT32 odma_int_en_75; + ZXIC_UINT32 odma_int_en_74; + ZXIC_UINT32 odma_int_en_71; + ZXIC_UINT32 odma_int_en_65; + ZXIC_UINT32 odma_int_en_64; +}DPP_NPPU_ODMA_CFG_ODMA_INT_EN_2_T; + +typedef struct dpp_nppu_odma_cfg_odma_int_en_3_t +{ + ZXIC_UINT32 odma_int_en_115; + ZXIC_UINT32 odma_int_en_114; + ZXIC_UINT32 odma_int_en_112; + ZXIC_UINT32 odma_int_en_110; + ZXIC_UINT32 odma_int_en_109; + ZXIC_UINT32 odma_int_en_108; + ZXIC_UINT32 odma_int_en_107; + ZXIC_UINT32 odma_int_en_106; + ZXIC_UINT32 odma_int_en_102; + ZXIC_UINT32 odma_int_en_101; + ZXIC_UINT32 odma_int_en_100; + ZXIC_UINT32 odma_int_en_98; + ZXIC_UINT32 odma_int_en_96; +}DPP_NPPU_ODMA_CFG_ODMA_INT_EN_3_T; + +typedef struct dpp_nppu_odma_cfg_odma_int_mask_0_t +{ + ZXIC_UINT32 odma_int_mask_31; + ZXIC_UINT32 odma_int_mask_30; + ZXIC_UINT32 odma_int_mask_29; + ZXIC_UINT32 odma_int_mask_28; + ZXIC_UINT32 odma_int_mask_27; + ZXIC_UINT32 odma_int_mask_26; + ZXIC_UINT32 odma_int_mask_25; + ZXIC_UINT32 odma_int_mask_24; + ZXIC_UINT32 odma_int_mask_22; + ZXIC_UINT32 odma_int_mask_21; + ZXIC_UINT32 odma_int_mask_18; +}DPP_NPPU_ODMA_CFG_ODMA_INT_MASK_0_T; + +typedef struct dpp_nppu_odma_cfg_odma_int_mask_1_t +{ + ZXIC_UINT32 odma_int_mask_63; + ZXIC_UINT32 odma_int_mask_62; + ZXIC_UINT32 odma_int_mask_61; + ZXIC_UINT32 odma_int_mask_59; + ZXIC_UINT32 odma_int_mask_58; + ZXIC_UINT32 odma_int_mask_57; + ZXIC_UINT32 odma_int_mask_56; + ZXIC_UINT32 odma_int_mask_55; + ZXIC_UINT32 odma_int_mask_54; + ZXIC_UINT32 odma_int_mask_53; + ZXIC_UINT32 odma_int_mask_52; + ZXIC_UINT32 odma_int_mask_51; + ZXIC_UINT32 odma_int_mask_50; + ZXIC_UINT32 odma_int_mask_49; + ZXIC_UINT32 odma_int_mask_47; + ZXIC_UINT32 odma_int_mask_45; + ZXIC_UINT32 odma_int_mask_39; + ZXIC_UINT32 odma_int_mask_38; + ZXIC_UINT32 odma_int_mask_37; + ZXIC_UINT32 odma_int_mask_36; + ZXIC_UINT32 odma_int_mask_35; + ZXIC_UINT32 odma_int_mask_34; + ZXIC_UINT32 odma_int_mask_33; + ZXIC_UINT32 odma_int_mask_32; +}DPP_NPPU_ODMA_CFG_ODMA_INT_MASK_1_T; + +typedef struct dpp_nppu_odma_cfg_odma_int_mask_2_t +{ + ZXIC_UINT32 odma_int_mask_91; + ZXIC_UINT32 odma_int_mask_88; + ZXIC_UINT32 odma_int_mask_85; + ZXIC_UINT32 odma_int_mask_82; + ZXIC_UINT32 odma_int_mask_79; + ZXIC_UINT32 odma_int_mask_75; + ZXIC_UINT32 odma_int_mask_74; + ZXIC_UINT32 odma_int_mask_71; + ZXIC_UINT32 odma_int_mask_65; + ZXIC_UINT32 odma_int_mask_64; +}DPP_NPPU_ODMA_CFG_ODMA_INT_MASK_2_T; + +typedef struct dpp_nppu_odma_cfg_odma_int_mask_3_t +{ + ZXIC_UINT32 odma_int_mask_115; + ZXIC_UINT32 odma_int_mask_114; + ZXIC_UINT32 odma_int_mask_112; + ZXIC_UINT32 odma_int_mask_110; + ZXIC_UINT32 odma_int_mask_109; + ZXIC_UINT32 odma_int_mask_108; + ZXIC_UINT32 odma_int_mask_107; + ZXIC_UINT32 odma_int_mask_106; + ZXIC_UINT32 odma_int_mask_102; + ZXIC_UINT32 odma_int_mask_101; + ZXIC_UINT32 odma_int_mask_100; + ZXIC_UINT32 odma_int_mask_98; + ZXIC_UINT32 odma_int_mask_96; +}DPP_NPPU_ODMA_CFG_ODMA_INT_MASK_3_T; + +typedef struct dpp_nppu_odma_cfg_odma_int_status_0_t +{ + ZXIC_UINT32 odma_int_status_31; + ZXIC_UINT32 odma_int_status_30; + ZXIC_UINT32 odma_int_status_29; + ZXIC_UINT32 odma_int_status_28; + ZXIC_UINT32 odma_int_status_27; + ZXIC_UINT32 odma_int_status_26; + ZXIC_UINT32 odma_int_status_25; + ZXIC_UINT32 odma_int_status_24; + ZXIC_UINT32 odma_int_status_22; + ZXIC_UINT32 odma_int_status_21; + ZXIC_UINT32 odma_int_status_18; +}DPP_NPPU_ODMA_CFG_ODMA_INT_STATUS_0_T; + +typedef struct dpp_nppu_odma_cfg_odma_int_status_1_t +{ + ZXIC_UINT32 odma_int_status_63; + ZXIC_UINT32 odma_int_status_62; + ZXIC_UINT32 odma_int_status_61; + ZXIC_UINT32 odma_int_status_59; + ZXIC_UINT32 odma_int_status_58; + ZXIC_UINT32 odma_int_status_57; + ZXIC_UINT32 odma_int_status_56; + ZXIC_UINT32 odma_int_status_55; + ZXIC_UINT32 odma_int_status_54; + ZXIC_UINT32 odma_int_status_53; + ZXIC_UINT32 odma_int_status_52; + ZXIC_UINT32 odma_int_status_51; + ZXIC_UINT32 odma_int_status_49; + ZXIC_UINT32 odma_int_status_47; + ZXIC_UINT32 odma_int_status_45; + ZXIC_UINT32 odma_int_status_39; + ZXIC_UINT32 odma_int_status_38; + ZXIC_UINT32 odma_int_status_37; + ZXIC_UINT32 odma_int_status_36; + ZXIC_UINT32 odma_int_status_35; + ZXIC_UINT32 odma_int_status_34; + ZXIC_UINT32 odma_int_status_33; + ZXIC_UINT32 odma_int_status_32; +}DPP_NPPU_ODMA_CFG_ODMA_INT_STATUS_1_T; + +typedef struct dpp_nppu_odma_cfg_odma_int_status_2_t +{ + ZXIC_UINT32 odma_int_status_91; + ZXIC_UINT32 odma_int_status_88; + ZXIC_UINT32 odma_int_status_85; + ZXIC_UINT32 odma_int_status_82; + ZXIC_UINT32 odma_int_status_79; + ZXIC_UINT32 odma_int_status_75; + ZXIC_UINT32 odma_int_status_74; + ZXIC_UINT32 odma_int_status_71; + ZXIC_UINT32 odma_int_status_65; + ZXIC_UINT32 odma_int_status_64; +}DPP_NPPU_ODMA_CFG_ODMA_INT_STATUS_2_T; + +typedef struct dpp_nppu_odma_cfg_odma_int_status_3_t +{ + ZXIC_UINT32 odma_int_status_117; + ZXIC_UINT32 odma_int_status_116; + ZXIC_UINT32 odma_int_status_115; + ZXIC_UINT32 odma_int_status_114; + ZXIC_UINT32 odma_int_status_112; + ZXIC_UINT32 odma_int_status_110; + ZXIC_UINT32 odma_int_status_109; + ZXIC_UINT32 odma_int_status_108; + ZXIC_UINT32 odma_int_status_107; + ZXIC_UINT32 odma_int_status_106; + ZXIC_UINT32 odma_int_status_102; + ZXIC_UINT32 odma_int_status_101; + ZXIC_UINT32 odma_int_status_100; + ZXIC_UINT32 odma_int_status_98; + ZXIC_UINT32 odma_int_status_96; +}DPP_NPPU_ODMA_CFG_ODMA_INT_STATUS_3_T; + +typedef struct dpp_nppu_odma_cfg_sp_tdm_err_nor_cfg_t +{ + ZXIC_UINT32 sp_tdm_err_nor_cfg; +}DPP_NPPU_ODMA_CFG_SP_TDM_ERR_NOR_CFG_T; + +typedef struct dpp_nppu_odma_cfg_etm_dis_ptr_prog_full_cfg_a_t +{ + ZXIC_UINT32 etm_dis_ptr_prog_full_cfg_a; +}DPP_NPPU_ODMA_CFG_ETM_DIS_PTR_PROG_FULL_CFG_A_T; + +typedef struct dpp_nppu_odma_cfg_etm_dis_ptr_prog_full_cfg_n_t +{ + ZXIC_UINT32 etm_dis_ptr_prog_full_cfg_n; +}DPP_NPPU_ODMA_CFG_ETM_DIS_PTR_PROG_FULL_CFG_N_T; + +typedef struct dpp_nppu_odma_cfg_ftm_dis_ptr_prog_full_cfg_a_t +{ + ZXIC_UINT32 ftm_dis_ptr_prog_full_cfg_a; +}DPP_NPPU_ODMA_CFG_FTM_DIS_PTR_PROG_FULL_CFG_A_T; + +typedef struct dpp_nppu_odma_cfg_ftm_dis_ptr_prog_full_cfg_n_t +{ + ZXIC_UINT32 ftm_dis_ptr_prog_full_cfg_n; +}DPP_NPPU_ODMA_CFG_FTM_DIS_PTR_PROG_FULL_CFG_N_T; + +typedef struct dpp_nppu_odma_cfg_tm_dis_fifo_prog_full_cfg_a_t +{ + ZXIC_UINT32 tm_dis_fifo_prog_full_cfg_a; +}DPP_NPPU_ODMA_CFG_TM_DIS_FIFO_PROG_FULL_CFG_A_T; + +typedef struct dpp_nppu_odma_cfg_tm_dis_fifo_prog_full_cfg_n_t +{ + ZXIC_UINT32 tm_dis_fifo_prog_full_cfg_n; +}DPP_NPPU_ODMA_CFG_TM_DIS_FIFO_PROG_FULL_CFG_N_T; + +typedef struct dpp_nppu_odma_cfg_err_prog_full_cfg_a_t +{ + ZXIC_UINT32 err_prog_full_cfg_a; +}DPP_NPPU_ODMA_CFG_ERR_PROG_FULL_CFG_A_T; + +typedef struct dpp_nppu_odma_cfg_err_prog_full_cfg_n_t +{ + ZXIC_UINT32 err_prog_full_cfg_n; +}DPP_NPPU_ODMA_CFG_ERR_PROG_FULL_CFG_N_T; + +typedef struct dpp_nppu_odma_cfg_tdmuc_prog_full_cfg_a_t +{ + ZXIC_UINT32 tdmuc_prog_full_cfg_a; +}DPP_NPPU_ODMA_CFG_TDMUC_PROG_FULL_CFG_A_T; + +typedef struct dpp_nppu_odma_cfg_tdmuc_prog_full_cfg_n_t +{ + ZXIC_UINT32 tdmuc_prog_full_cfg_n; +}DPP_NPPU_ODMA_CFG_TDMUC_PROG_FULL_CFG_N_T; + +typedef struct dpp_nppu_odma_cfg_tdmmc_groupid_prog_full_cfg_a_t +{ + ZXIC_UINT32 tdmmc_groupid_prog_full_cfg_a; +}DPP_NPPU_ODMA_CFG_TDMMC_GROUPID_PROG_FULL_CFG_A_T; + +typedef struct dpp_nppu_odma_cfg_tdmmc_groupid_prog_full_cfg_n_t +{ + ZXIC_UINT32 tdmmc_groupid_prog_full_cfg_n; +}DPP_NPPU_ODMA_CFG_TDMMC_GROUPID_PROG_FULL_CFG_N_T; + +typedef struct dpp_nppu_odma_cfg_tdmmc_no_bitmap_prog_full_cfg_a_t +{ + ZXIC_UINT32 tdmmc_no_bitmap_prog_full_cfg_a; +}DPP_NPPU_ODMA_CFG_TDMMC_NO_BITMAP_PROG_FULL_CFG_A_T; + +typedef struct dpp_nppu_odma_cfg_tdmmc_no_bitmap_prog_full_cfg_n_t +{ + ZXIC_UINT32 tdmmc_no_bitmap_prog_full_cfg_n; +}DPP_NPPU_ODMA_CFG_TDMMC_NO_BITMAP_PROG_FULL_CFG_N_T; + +typedef struct dpp_nppu_odma_cfg_tdmmc_prog_full_cfg_a_t +{ + ZXIC_UINT32 tdmmc_prog_full_cfg_a; +}DPP_NPPU_ODMA_CFG_TDMMC_PROG_FULL_CFG_A_T; + +typedef struct dpp_nppu_odma_cfg_tdmmc_prog_full_cfg_n_t +{ + ZXIC_UINT32 tdmmc_prog_full_cfg_n; +}DPP_NPPU_ODMA_CFG_TDMMC_PROG_FULL_CFG_N_T; + +typedef struct dpp_nppu_odma_cfg_desc_prog_full_cfg_a_t +{ + ZXIC_UINT32 desc_prog_full_cfg_a; +}DPP_NPPU_ODMA_CFG_DESC_PROG_FULL_CFG_A_T; + +typedef struct dpp_nppu_odma_cfg_desc_prog_full_cfg_n_t +{ + ZXIC_UINT32 desc_prog_full_cfg_n; +}DPP_NPPU_ODMA_CFG_DESC_PROG_FULL_CFG_N_T; + +typedef struct dpp_nppu_odma_cfg_dly_prog_full_cfg_a_t +{ + ZXIC_UINT32 dly_prog_full_cfg_a; +}DPP_NPPU_ODMA_CFG_DLY_PROG_FULL_CFG_A_T; + +typedef struct dpp_nppu_odma_cfg_dly_prog_full_cfg_n_t +{ + ZXIC_UINT32 dly_prog_full_cfg_n; +}DPP_NPPU_ODMA_CFG_DLY_PROG_FULL_CFG_N_T; + +typedef struct dpp_nppu_odma_cfg_rsp_prog_full_cfg_a_t +{ + ZXIC_UINT32 rsp_prog_full_cfg_a; +}DPP_NPPU_ODMA_CFG_RSP_PROG_FULL_CFG_A_T; + +typedef struct dpp_nppu_odma_cfg_rsp_prog_full_cfg_n_t +{ + ZXIC_UINT32 rsp_prog_full_cfg_n; +}DPP_NPPU_ODMA_CFG_RSP_PROG_FULL_CFG_N_T; + +typedef struct dpp_nppu_odma_cfg_nor_prog_full_cfg_a_t +{ + ZXIC_UINT32 nor_prog_full_cfg_a; +}DPP_NPPU_ODMA_CFG_NOR_PROG_FULL_CFG_A_T; + +typedef struct dpp_nppu_odma_cfg_nor_prog_full_cfg_n_t +{ + ZXIC_UINT32 nor_prog_full_cfg_n; +}DPP_NPPU_ODMA_CFG_NOR_PROG_FULL_CFG_N_T; + +typedef struct dpp_nppu_odma_cfg_etm_nor_prog_full_cfg_a_t +{ + ZXIC_UINT32 etm_nor_prog_full_cfg_a; +}DPP_NPPU_ODMA_CFG_ETM_NOR_PROG_FULL_CFG_A_T; + +typedef struct dpp_nppu_odma_cfg_etm_nor_prog_full_cfg_n_t +{ + ZXIC_UINT32 etm_nor_prog_full_cfg_n; +}DPP_NPPU_ODMA_CFG_ETM_NOR_PROG_FULL_CFG_N_T; + +typedef struct dpp_nppu_odma_cfg_ftm_nor_prog_full_cfg_a_t +{ + ZXIC_UINT32 ftm_nor_prog_full_cfg_a; +}DPP_NPPU_ODMA_CFG_FTM_NOR_PROG_FULL_CFG_A_T; + +typedef struct dpp_nppu_odma_cfg_ftm_nor_prog_full_cfg_n_t +{ + ZXIC_UINT32 ftm_nor_prog_full_cfg_n; +}DPP_NPPU_ODMA_CFG_FTM_NOR_PROG_FULL_CFG_N_T; + +typedef struct dpp_nppu_odma_cfg_etm_prog_full_cfg_a_t +{ + ZXIC_UINT32 etm_prog_full_cfg_a; +}DPP_NPPU_ODMA_CFG_ETM_PROG_FULL_CFG_A_T; + +typedef struct dpp_nppu_odma_cfg_etm_prog_full_cfg_n_t +{ + ZXIC_UINT32 etm_prog_full_cfg_n; +}DPP_NPPU_ODMA_CFG_ETM_PROG_FULL_CFG_N_T; + +typedef struct dpp_nppu_odma_cfg_ftm_prog_full_cfg_a_t +{ + ZXIC_UINT32 ftm_prog_full_cfg_a; +}DPP_NPPU_ODMA_CFG_FTM_PROG_FULL_CFG_A_T; + +typedef struct dpp_nppu_odma_cfg_ftm_prog_full_cfg_n_t +{ + ZXIC_UINT32 ftm_prog_full_cfg_n; +}DPP_NPPU_ODMA_CFG_FTM_PROG_FULL_CFG_N_T; + +typedef struct dpp_nppu_odma_cfg_etm_nrdcnt_prog_full_cfg_a_t +{ + ZXIC_UINT32 etm_nrdcnt_prog_full_cfg_a; +}DPP_NPPU_ODMA_CFG_ETM_NRDCNT_PROG_FULL_CFG_A_T; + +typedef struct dpp_nppu_odma_cfg_etm_nrdcnt_prog_full_cfg_n_t +{ + ZXIC_UINT32 etm_nrdcnt_prog_full_cfg_n; +}DPP_NPPU_ODMA_CFG_ETM_NRDCNT_PROG_FULL_CFG_N_T; + +typedef struct dpp_nppu_odma_cfg_ftm_nrdcnt_prog_full_cfg_a_t +{ + ZXIC_UINT32 ftm_nrdcnt_prog_full_cfg_a; +}DPP_NPPU_ODMA_CFG_FTM_NRDCNT_PROG_FULL_CFG_A_T; + +typedef struct dpp_nppu_odma_cfg_ftm_nrdcnt_prog_full_cfg_n_t +{ + ZXIC_UINT32 ftm_nrdcnt_prog_full_cfg_n; +}DPP_NPPU_ODMA_CFG_FTM_NRDCNT_PROG_FULL_CFG_N_T; + +typedef struct dpp_nppu_odma_cfg_pp_prog_full_cfg_a_t +{ + ZXIC_UINT32 pp_prog_full_cfg_a; +}DPP_NPPU_ODMA_CFG_PP_PROG_FULL_CFG_A_T; + +typedef struct dpp_nppu_odma_cfg_pp_prog_full_cfg_n_t +{ + ZXIC_UINT32 pp_prog_full_cfg_n; +}DPP_NPPU_ODMA_CFG_PP_PROG_FULL_CFG_N_T; + +typedef struct dpp_nppu_odma_cfg_tm_weight_t +{ + ZXIC_UINT32 tm_weight; +}DPP_NPPU_ODMA_CFG_TM_WEIGHT_T; + +typedef struct dpp_nppu_odma_cfg_pp_weight_t +{ + ZXIC_UINT32 pp_weight; +}DPP_NPPU_ODMA_CFG_PP_WEIGHT_T; + +typedef struct dpp_nppu_odma_cfg_ifbcmd_prog_full_cfg_a_t +{ + ZXIC_UINT32 ifbcmd_prog_full_cfg_a; +}DPP_NPPU_ODMA_CFG_IFBCMD_PROG_FULL_CFG_A_T; + +typedef struct dpp_nppu_odma_cfg_ifbcmd_prog_full_cfg_n_t +{ + ZXIC_UINT32 ifbcmd_prog_full_cfg_n; +}DPP_NPPU_ODMA_CFG_IFBCMD_PROG_FULL_CFG_N_T; + +typedef struct dpp_nppu_odma_cfg_mccnt_prog_full_cfg_a_t +{ + ZXIC_UINT32 mccnt_prog_full_cfg_a; +}DPP_NPPU_ODMA_CFG_MCCNT_PROG_FULL_CFG_A_T; + +typedef struct dpp_nppu_odma_cfg_mccnt_prog_full_cfg_n_t +{ + ZXIC_UINT32 mccnt_prog_full_cfg_n; +}DPP_NPPU_ODMA_CFG_MCCNT_PROG_FULL_CFG_N_T; + +typedef struct dpp_nppu_odma_cfg_int_or_pon_t +{ + ZXIC_UINT32 int_or_pon; +}DPP_NPPU_ODMA_CFG_INT_OR_PON_T; + +typedef struct dpp_nppu_odma_cfg_quemng_cnt_in_err_cnt_t +{ + ZXIC_UINT32 quemng_cnt_in_err_cnt; +}DPP_NPPU_ODMA_CFG_QUEMNG_CNT_IN_ERR_CNT_T; + +typedef struct dpp_nppu_odma_cfg_lif0_port_eop_cnt_t +{ + ZXIC_UINT32 lif0_port_eop_cnt; +}DPP_NPPU_ODMA_CFG_LIF0_PORT_EOP_CNT_T; + +typedef struct dpp_nppu_odma_cfg_lif1_port_eop_cnt_t +{ + ZXIC_UINT32 lif1_port_eop_cnt; +}DPP_NPPU_ODMA_CFG_LIF1_PORT_EOP_CNT_T; + +typedef struct dpp_nppu_odma_cfg_lifc_port0_eop_cnt_t +{ + ZXIC_UINT32 lifc_port0_eop_cnt; +}DPP_NPPU_ODMA_CFG_LIFC_PORT0_EOP_CNT_T; + +typedef struct dpp_nppu_odma_cfg_lifc_port1_eop_cnt_t +{ + ZXIC_UINT32 lifc_port1_eop_cnt; +}DPP_NPPU_ODMA_CFG_LIFC_PORT1_EOP_CNT_T; + +typedef struct dpp_nppu_odma_cfg_fptr_fifo_prog_ept_cfg_n_t +{ + ZXIC_UINT32 fptr_fifo_prog_ept_cfg_n; +}DPP_NPPU_ODMA_CFG_FPTR_FIFO_PROG_EPT_CFG_N_T; + +typedef struct dpp_nppu_odma_cfg_isu_fifo_prog_full_cfg_a_t +{ + ZXIC_UINT32 isu_fifo_prog_full_cfg_a; +}DPP_NPPU_ODMA_CFG_ISU_FIFO_PROG_FULL_CFG_A_T; + +typedef struct dpp_nppu_odma_cfg_isu_fifo_prog_full_cfg_n_t +{ + ZXIC_UINT32 isu_fifo_prog_full_cfg_n; +}DPP_NPPU_ODMA_CFG_ISU_FIFO_PROG_FULL_CFG_N_T; + +typedef struct dpp_nppu_oam_cfg_ind_access_done_t +{ + ZXIC_UINT32 ind_access_done; +}DPP_NPPU_OAM_CFG_IND_ACCESS_DONE_T; + +typedef struct dpp_nppu_oam_cfg_ind_access_command_t +{ + ZXIC_UINT32 ind_rd_or_wr; + ZXIC_UINT32 ind_mem_mask; + ZXIC_UINT32 ind_mem_id; + ZXIC_UINT32 ind_mem_addr; +}DPP_NPPU_OAM_CFG_IND_ACCESS_COMMAND_T; + +typedef struct dpp_nppu_oam_cfg_ind_dat0_t +{ + ZXIC_UINT32 ind_dat0; +}DPP_NPPU_OAM_CFG_IND_DAT0_T; + +typedef struct dpp_nppu_oam_cfg_ind_dat1_t +{ + ZXIC_UINT32 ind_dat1; +}DPP_NPPU_OAM_CFG_IND_DAT1_T; + +typedef struct dpp_nppu_oam_cfg_ind_dat2_t +{ + ZXIC_UINT32 ind_dat2; +}DPP_NPPU_OAM_CFG_IND_DAT2_T; + +typedef struct dpp_nppu_oam_cfg_ind_dat3_t +{ + ZXIC_UINT32 ind_dat3; +}DPP_NPPU_OAM_CFG_IND_DAT3_T; + +typedef struct dpp_nppu_oam_cfg_oam_tx_main_en_t +{ + ZXIC_UINT32 oam_tx_main_en; +}DPP_NPPU_OAM_CFG_OAM_TX_MAIN_EN_T; + +typedef struct dpp_nppu_oam_cfg_tx_total_num_t +{ + ZXIC_UINT32 tx_total_num; +}DPP_NPPU_OAM_CFG_TX_TOTAL_NUM_T; + +typedef struct dpp_nppu_oam_cfg_oam_chk_main_en_t +{ + ZXIC_UINT32 oam_chk_main_en; +}DPP_NPPU_OAM_CFG_OAM_CHK_MAIN_EN_T; + +typedef struct dpp_nppu_oam_cfg_chk_total_num0_t +{ + ZXIC_UINT32 chk_total_num0; +}DPP_NPPU_OAM_CFG_CHK_TOTAL_NUM0_T; + +typedef struct dpp_nppu_oam_cfg_ma_chk_main_en_t +{ + ZXIC_UINT32 oam_chk_main_en; +}DPP_NPPU_OAM_CFG_MA_CHK_MAIN_EN_T; + +typedef struct dpp_nppu_oam_cfg_chk_total_num1_t +{ + ZXIC_UINT32 chk_total_num0; +}DPP_NPPU_OAM_CFG_CHK_TOTAL_NUM1_T; + +typedef struct dpp_nppu_oam_cfg_tx_stat_en_t +{ + ZXIC_UINT32 tx_stat_en; +}DPP_NPPU_OAM_CFG_TX_STAT_EN_T; + +typedef struct dpp_nppu_oam_cfg_rec_stat_en_t +{ + ZXIC_UINT32 rec_stat_en; +}DPP_NPPU_OAM_CFG_REC_STAT_EN_T; + +typedef struct dpp_nppu_oam_cfg_stat_oam_rdy_mask_t +{ + ZXIC_UINT32 stat_oam_rdy_mask; +}DPP_NPPU_OAM_CFG_STAT_OAM_RDY_MASK_T; + +typedef struct dpp_nppu_oam_cfg_session_grading0_t +{ + ZXIC_UINT32 session_grading0; +}DPP_NPPU_OAM_CFG_SESSION_GRADING0_T; + +typedef struct dpp_nppu_oam_cfg_session_grading1_t +{ + ZXIC_UINT32 session_grading1; +}DPP_NPPU_OAM_CFG_SESSION_GRADING1_T; + +typedef struct dpp_nppu_oam_cfg_session_grading2_t +{ + ZXIC_UINT32 session_grading2; +}DPP_NPPU_OAM_CFG_SESSION_GRADING2_T; + +typedef struct dpp_nppu_oam_cfg_session_grading3_t +{ + ZXIC_UINT32 session_grading3; +}DPP_NPPU_OAM_CFG_SESSION_GRADING3_T; + +typedef struct dpp_nppu_oam_cfg_bfd_chk_haddr_t +{ + ZXIC_UINT32 bfd_chk_haddr; +}DPP_NPPU_OAM_CFG_BFD_CHK_HADDR_T; + +typedef struct dpp_nppu_oam_cfg_ethccm_chk_haddr_t +{ + ZXIC_UINT32 ethccm_chk_haddr; +}DPP_NPPU_OAM_CFG_ETHCCM_CHK_HADDR_T; + +typedef struct dpp_nppu_oam_cfg_tpbfd_chk_haddr_t +{ + ZXIC_UINT32 tpbfd_chk_haddr; +}DPP_NPPU_OAM_CFG_TPBFD_CHK_HADDR_T; + +typedef struct dpp_nppu_oam_cfg_tpoam_ccm_chk_haddr_t +{ + ZXIC_UINT32 tpoam_ccm_chk_haddr; +}DPP_NPPU_OAM_CFG_TPOAM_CCM_CHK_HADDR_T; + +typedef struct dpp_nppu_oam_cfg_bfd_tx_haddr_t +{ + ZXIC_UINT32 bfd_tx_haddr; +}DPP_NPPU_OAM_CFG_BFD_TX_HADDR_T; + +typedef struct dpp_nppu_oam_cfg_ethccm_tx_haddr_t +{ + ZXIC_UINT32 ethccm_tx_haddr; +}DPP_NPPU_OAM_CFG_ETHCCM_TX_HADDR_T; + +typedef struct dpp_nppu_oam_cfg_tpbfd_tx_haddr_t +{ + ZXIC_UINT32 tpbfd_tx_haddr; +}DPP_NPPU_OAM_CFG_TPBFD_TX_HADDR_T; + +typedef struct dpp_nppu_oam_cfg_tpoam_ccm_tx_haddr_t +{ + ZXIC_UINT32 tpoam_ccm_tx_haddr; +}DPP_NPPU_OAM_CFG_TPOAM_CCM_TX_HADDR_T; + +typedef struct dpp_nppu_oam_cfg_ethccm_ma_chk_haddr_t +{ + ZXIC_UINT32 ethccm_ma_chk_haddr; +}DPP_NPPU_OAM_CFG_ETHCCM_MA_CHK_HADDR_T; + +typedef struct dpp_nppu_oam_cfg_tpccm_ma_chk_haddr_t +{ + ZXIC_UINT32 tpccm_ma_chk_haddr; +}DPP_NPPU_OAM_CFG_TPCCM_MA_CHK_HADDR_T; + +typedef struct dpp_nppu_oam_cfg_groupnum_ram_clr_t +{ + ZXIC_UINT32 groupnum_ram_clr; +}DPP_NPPU_OAM_CFG_GROUPNUM_RAM_CLR_T; + +typedef struct dpp_nppu_oam_cfg_index_ram0_clr_t +{ + ZXIC_UINT32 index_ram0_clr; +}DPP_NPPU_OAM_CFG_INDEX_RAM0_CLR_T; + +typedef struct dpp_nppu_oam_cfg_index_ram1_clr_t +{ + ZXIC_UINT32 index_ram1_clr; +}DPP_NPPU_OAM_CFG_INDEX_RAM1_CLR_T; + +typedef struct dpp_nppu_oam_cfg_rmep_ram_clr_t +{ + ZXIC_UINT32 rmep_ram_clr; +}DPP_NPPU_OAM_CFG_RMEP_RAM_CLR_T; + +typedef struct dpp_nppu_oam_cfg_ma_ram_clr_t +{ + ZXIC_UINT32 ma_ram_clr; +}DPP_NPPU_OAM_CFG_MA_RAM_CLR_T; + +typedef struct dpp_nppu_oam_cfg_ram_init_done_t +{ + ZXIC_UINT32 ram_init_done; +}DPP_NPPU_OAM_CFG_RAM_INIT_DONE_T; + +typedef struct dpp_nppu_oam_cfg_rec_bfd_debug_en_t +{ + ZXIC_UINT32 rec_bfd_debug_en; +}DPP_NPPU_OAM_CFG_REC_BFD_DEBUG_EN_T; + +typedef struct dpp_nppu_oam_cfg_oam_session_int_t +{ + ZXIC_UINT32 tpma_int; + ZXIC_UINT32 ethma_int; + ZXIC_UINT32 bfd_int; + ZXIC_UINT32 ethoam_int; + ZXIC_UINT32 tpbfd_int; + ZXIC_UINT32 tpoam_int; +}DPP_NPPU_OAM_CFG_OAM_SESSION_INT_T; + +typedef struct dpp_nppu_oam_cfg_pon_int_t +{ + ZXIC_UINT32 fifo_int; + ZXIC_UINT32 pon_protect_int; +}DPP_NPPU_OAM_CFG_PON_INT_T; + +typedef struct dpp_nppu_oam_cfg_oam_int_clr_t +{ + ZXIC_UINT32 oam_int_clr; +}DPP_NPPU_OAM_CFG_OAM_INT_CLR_T; + +typedef struct dpp_nppu_oam_cfg_type_int_clr0_t +{ + ZXIC_UINT32 tpma_int_clr; + ZXIC_UINT32 ethma_int_clr; + ZXIC_UINT32 bfd_int_clr; + ZXIC_UINT32 ethoam_int_clr; + ZXIC_UINT32 tpbfd_int_clr; + ZXIC_UINT32 tpoam_int_clr; +}DPP_NPPU_OAM_CFG_TYPE_INT_CLR0_T; + +typedef struct dpp_nppu_oam_cfg_type_int_clr1_t +{ + ZXIC_UINT32 fifo_int_clr; + ZXIC_UINT32 pon_protect_int_clr; +}DPP_NPPU_OAM_CFG_TYPE_INT_CLR1_T; + +typedef struct dpp_nppu_oam_cfg_interrupt_mask_t +{ + ZXIC_UINT32 fifo_interrupt_mask; + ZXIC_UINT32 pon_protect_interruptmask; + ZXIC_UINT32 tpma_interrupt_mask; + ZXIC_UINT32 ethma_interrupt_mask; + ZXIC_UINT32 bfd_interrupt_mask; + ZXIC_UINT32 ethoam_interrupt_mask; + ZXIC_UINT32 tpbfd_interrupt_mask; + ZXIC_UINT32 tpoam_interrupt_mask; +}DPP_NPPU_OAM_CFG_INTERRUPT_MASK_T; + +typedef struct dpp_nppu_oam_cfg_int0_index_t +{ + ZXIC_UINT32 int0_index0; +}DPP_NPPU_OAM_CFG_INT0_INDEX_T; + +typedef struct dpp_nppu_oam_cfg_int1_index_t +{ + ZXIC_UINT32 int1_index0; +}DPP_NPPU_OAM_CFG_INT1_INDEX_T; + +typedef struct dpp_nppu_oam_cfg_int0_index_region_t +{ + ZXIC_UINT32 int0_index_region; +}DPP_NPPU_OAM_CFG_INT0_INDEX_REGION_T; + +typedef struct dpp_nppu_oam_cfg_int1_index_region_t +{ + ZXIC_UINT32 int1_index_region; +}DPP_NPPU_OAM_CFG_INT1_INDEX_REGION_T; + +typedef struct dpp_nppu_oam_cfg_bdiinfo_fwft_fifo_th_t +{ + ZXIC_UINT32 bdiinfo_fwft_fifo_th; +}DPP_NPPU_OAM_CFG_BDIINFO_FWFT_FIFO_TH_T; + +typedef struct dpp_nppu_oam_cfg_recsec_fwft_fifo_th_t +{ + ZXIC_UINT32 recsec_fwft_fifo_th; +}DPP_NPPU_OAM_CFG_RECSEC_FWFT_FIFO_TH_T; + +typedef struct dpp_nppu_oam_cfg_timing_chk_info0_fwft_fifo_th_t +{ + ZXIC_UINT32 timing_chk_info0_fwft_fifo_th; +}DPP_NPPU_OAM_CFG_TIMING_CHK_INFO0_FWFT_FIFO_TH_T; + +typedef struct dpp_nppu_oam_cfg_recma_fwft_fifo_th_t +{ + ZXIC_UINT32 recma_fwft_fifo_th; +}DPP_NPPU_OAM_CFG_RECMA_FWFT_FIFO_TH_T; + +typedef struct dpp_nppu_oam_cfg_timing_chk_info1_fwft_fifo_th_t +{ + ZXIC_UINT32 timing_chk_info1_fwft_fifo_th; +}DPP_NPPU_OAM_CFG_TIMING_CHK_INFO1_FWFT_FIFO_TH_T; + +typedef struct dpp_nppu_oam_cfg_oam_txinst_fifo_th_t +{ + ZXIC_UINT32 oam_txinst_fifo_th; +}DPP_NPPU_OAM_CFG_OAM_TXINST_FIFO_TH_T; + +typedef struct dpp_nppu_oam_cfg_oam_rdinfo_fwft_fifo_th_t +{ + ZXIC_UINT32 oam_rdinfo_fwft_fifo_th; +}DPP_NPPU_OAM_CFG_OAM_RDINFO_FWFT_FIFO_TH_T; + +typedef struct dpp_nppu_oam_cfg_lm_cnt_fwft_fifo_th_t +{ + ZXIC_UINT32 lm_cnt_fwft_fifo_th; +}DPP_NPPU_OAM_CFG_LM_CNT_FWFT_FIFO_TH_T; + +typedef struct dpp_nppu_oam_cfg_oam_pkt_fifo_th_t +{ + ZXIC_UINT32 oam_pkt_fifo_th; +}DPP_NPPU_OAM_CFG_OAM_PKT_FIFO_TH_T; + +typedef struct dpp_nppu_oam_cfg_reclm_stat_fifo_th_t +{ + ZXIC_UINT32 reclm_stat_fifo_th; +}DPP_NPPU_OAM_CFG_RECLM_STAT_FIFO_TH_T; + +typedef struct dpp_nppu_oam_cfg_txlm_stat_fifo_th_t +{ + ZXIC_UINT32 txlm_stat_fifo_th; +}DPP_NPPU_OAM_CFG_TXLM_STAT_FIFO_TH_T; + +typedef struct dpp_nppu_oam_cfg_oam_chk_fwft_fifo_th_t +{ + ZXIC_UINT32 oam_chk_fwft_fifo_th; +}DPP_NPPU_OAM_CFG_OAM_CHK_FWFT_FIFO_TH_T; + +typedef struct dpp_nppu_oam_cfg_txoam_stat_fifo_th_t +{ + ZXIC_UINT32 txoam_stat_fifo_th; +}DPP_NPPU_OAM_CFG_TXOAM_STAT_FIFO_TH_T; + +typedef struct dpp_nppu_oam_cfg_recoam_stat_fifo_th_t +{ + ZXIC_UINT32 recoam_stat_fifo_th; +}DPP_NPPU_OAM_CFG_RECOAM_STAT_FIFO_TH_T; + +typedef struct dpp_nppu_oam_cfg_txpkt_data_fwft_fifo_th_t +{ + ZXIC_UINT32 txpkt_data_fwft_fifo_th; +}DPP_NPPU_OAM_CFG_TXPKT_DATA_FWFT_FIFO_TH_T; + +typedef struct dpp_nppu_oam_cfg_tstpkt_fwft_fifo_th_t +{ + ZXIC_UINT32 tstpkt_fwft_fifo_th; +}DPP_NPPU_OAM_CFG_TSTPKT_FWFT_FIFO_TH_T; + +typedef struct dpp_nppu_oam_cfg_tst_txinst_fwft_fifo_th_t +{ + ZXIC_UINT32 tst_txinst_fwft_fifo_th; +}DPP_NPPU_OAM_CFG_TST_TXINST_FWFT_FIFO_TH_T; + +typedef struct dpp_nppu_oam_cfg_tstrx_main_en_t +{ + ZXIC_UINT32 tstrx_main_en; +}DPP_NPPU_OAM_CFG_TSTRX_MAIN_EN_T; + +typedef struct dpp_nppu_oam_cfg_tsttx_cfg_para_tbl2_t +{ + ZXIC_UINT32 ddr_self_test_tx_en; + ZXIC_UINT32 tm_self_test_tx_en; + ZXIC_UINT32 fast_aging_tx_en; + ZXIC_UINT32 timing_aging_tx_en; + ZXIC_UINT32 backgroud_flow_tx_en; + ZXIC_UINT32 tsttx_tx_en; + ZXIC_UINT32 tx_freq; + ZXIC_UINT32 tx_offset; +}DPP_NPPU_OAM_CFG_TSTTX_CFG_PARA_TBL2_T; + +typedef struct dpp_nppu_oam_cfg_tsttx_cfg_para_tbl1_t +{ + ZXIC_UINT32 tx_count; +}DPP_NPPU_OAM_CFG_TSTTX_CFG_PARA_TBL1_T; + +typedef struct dpp_nppu_oam_cfg_tsttx_cfg_para_tbl0_t +{ + ZXIC_UINT32 fast_tx_mode_en; + ZXIC_UINT32 tsttx_tx_head_len; + ZXIC_UINT32 tsttx_tx_interval; +}DPP_NPPU_OAM_CFG_TSTTX_CFG_PARA_TBL0_T; + +typedef struct dpp_nppu_oam_cfg_tstrx_cfg_para_t +{ + ZXIC_UINT32 tstrx_session_num; + ZXIC_UINT32 tstrx_session_en; +}DPP_NPPU_OAM_CFG_TSTRX_CFG_PARA_T; + +typedef struct dpp_nppu_oam_cfg_fifo_status_int_en_0_t +{ + ZXIC_UINT32 fifo_status_int_en_31; + ZXIC_UINT32 fifo_status_int_en_30; + ZXIC_UINT32 fifo_status_int_en_29; + ZXIC_UINT32 fifo_status_int_en_28; + ZXIC_UINT32 fifo_status_int_en_27; + ZXIC_UINT32 fifo_status_int_en_26; + ZXIC_UINT32 fifo_status_int_en_25; + ZXIC_UINT32 fifo_status_int_en_24; + ZXIC_UINT32 fifo_status_int_en_23; + ZXIC_UINT32 fifo_status_int_en_22; + ZXIC_UINT32 fifo_status_int_en_21; + ZXIC_UINT32 fifo_status_int_en_20; + ZXIC_UINT32 fifo_status_int_en_19; + ZXIC_UINT32 fifo_status_int_en_18; + ZXIC_UINT32 fifo_status_int_en_17; + ZXIC_UINT32 fifo_status_int_en_16; + ZXIC_UINT32 fifo_status_int_en_15; + ZXIC_UINT32 fifo_status_int_en_14; + ZXIC_UINT32 fifo_status_int_en_13; + ZXIC_UINT32 fifo_status_int_en_12; + ZXIC_UINT32 fifo_status_int_en_11; + ZXIC_UINT32 fifo_status_int_en_10; + ZXIC_UINT32 fifo_status_int_en_9; + ZXIC_UINT32 fifo_status_int_en_8; + ZXIC_UINT32 fifo_status_int_en_7; + ZXIC_UINT32 fifo_status_int_en_6; + ZXIC_UINT32 fifo_status_int_en_5; + ZXIC_UINT32 fifo_status_int_en_4; + ZXIC_UINT32 fifo_status_int_en_3; + ZXIC_UINT32 fifo_status_int_en_2; + ZXIC_UINT32 fifo_status_int_en_1; + ZXIC_UINT32 fifo_status_int_en_0; +}DPP_NPPU_OAM_CFG_FIFO_STATUS_INT_EN_0_T; + +typedef struct dpp_nppu_oam_cfg_fifo_status_int_en_1_t +{ + ZXIC_UINT32 fifo_status_int_en_41; + ZXIC_UINT32 fifo_status_int_en_40; + ZXIC_UINT32 fifo_status_int_en_39; + ZXIC_UINT32 fifo_status_int_en_38; + ZXIC_UINT32 fifo_status_int_en_37; + ZXIC_UINT32 fifo_status_int_en_36; + ZXIC_UINT32 fifo_status_int_en_35; + ZXIC_UINT32 fifo_status_int_en_34; + ZXIC_UINT32 fifo_status_int_en_33; + ZXIC_UINT32 fifo_status_int_en_32; +}DPP_NPPU_OAM_CFG_FIFO_STATUS_INT_EN_1_T; + +typedef struct dpp_nppu_oam_cfg_fifo_status_int_mask_0_t +{ + ZXIC_UINT32 fifo_status_int_mask_31; + ZXIC_UINT32 fifo_status_int_mask_30; + ZXIC_UINT32 fifo_status_int_mask_29; + ZXIC_UINT32 fifo_status_int_mask_28; + ZXIC_UINT32 fifo_status_int_mask_27; + ZXIC_UINT32 fifo_status_int_mask_26; + ZXIC_UINT32 fifo_status_int_mask_25; + ZXIC_UINT32 fifo_status_int_mask_24; + ZXIC_UINT32 fifo_status_int_mask_23; + ZXIC_UINT32 fifo_status_int_mask_22; + ZXIC_UINT32 fifo_status_int_mask_21; + ZXIC_UINT32 fifo_status_int_mask_20; + ZXIC_UINT32 fifo_status_int_mask_19; + ZXIC_UINT32 fifo_status_int_mask_18; + ZXIC_UINT32 fifo_status_int_mask_17; + ZXIC_UINT32 fifo_status_int_mask_16; + ZXIC_UINT32 fifo_status_int_mask_15; + ZXIC_UINT32 fifo_status_int_mask_14; + ZXIC_UINT32 fifo_status_int_mask_13; + ZXIC_UINT32 fifo_status_int_mask_12; + ZXIC_UINT32 fifo_status_int_mask_11; + ZXIC_UINT32 fifo_status_int_mask_10; + ZXIC_UINT32 fifo_status_int_mask_9; + ZXIC_UINT32 fifo_status_int_mask_8; + ZXIC_UINT32 fifo_status_int_mask_7; + ZXIC_UINT32 fifo_status_int_mask_6; + ZXIC_UINT32 fifo_status_int_mask_5; + ZXIC_UINT32 fifo_status_int_mask_4; + ZXIC_UINT32 fifo_status_int_mask_3; + ZXIC_UINT32 fifo_status_int_mask_2; + ZXIC_UINT32 fifo_status_int_mask_1; + ZXIC_UINT32 fifo_status_int_mask_0; +}DPP_NPPU_OAM_CFG_FIFO_STATUS_INT_MASK_0_T; + +typedef struct dpp_nppu_oam_cfg_fifo_status_int_mask_1_t +{ + ZXIC_UINT32 fifo_status_int_mask_41; + ZXIC_UINT32 fifo_status_int_mask_40; + ZXIC_UINT32 fifo_status_int_mask_39; + ZXIC_UINT32 fifo_status_int_mask_38; + ZXIC_UINT32 fifo_status_int_mask_37; + ZXIC_UINT32 fifo_status_int_mask_36; + ZXIC_UINT32 fifo_status_int_mask_35; + ZXIC_UINT32 fifo_status_int_mask_34; + ZXIC_UINT32 fifo_status_int_mask_33; + ZXIC_UINT32 fifo_status_int_mask_32; +}DPP_NPPU_OAM_CFG_FIFO_STATUS_INT_MASK_1_T; + +typedef struct dpp_nppu_oam_cfg_fifo_status_int_status_t +{ + ZXIC_UINT32 fifo_status_int_status; +}DPP_NPPU_OAM_CFG_FIFO_STATUS_INT_STATUS_T; + +typedef struct dpp_nppu_oam_cfg_main_frequency_t +{ + ZXIC_UINT32 main_frequency; +}DPP_NPPU_OAM_CFG_MAIN_FREQUENCY_T; + +typedef struct dpp_nppu_oam_cfg_oam_cfg_type_t +{ + ZXIC_UINT32 oam_cfg_type; +}DPP_NPPU_OAM_CFG_OAM_CFG_TYPE_T; + +typedef struct dpp_nppu_oam_cfg_fst_swch_eth_head0_t +{ + ZXIC_UINT32 fst_swch_eth_head; +}DPP_NPPU_OAM_CFG_FST_SWCH_ETH_HEAD0_T; + +typedef struct dpp_nppu_oam_cfg_fst_swch_eth_head1_t +{ + ZXIC_UINT32 fst_swch_eth_head1; +}DPP_NPPU_OAM_CFG_FST_SWCH_ETH_HEAD1_T; + +typedef struct dpp_nppu_oam_cfg_fst_swch_eth_head2_t +{ + ZXIC_UINT32 fst_swch_eth_head2; +}DPP_NPPU_OAM_CFG_FST_SWCH_ETH_HEAD2_T; + +typedef struct dpp_nppu_oam_cfg_fst_swch_eth_head3_t +{ + ZXIC_UINT32 fst_swch_eth_head3; +}DPP_NPPU_OAM_CFG_FST_SWCH_ETH_HEAD3_T; + +typedef struct dpp_nppu_oam_cfg_oam_fs_txinst_fifo_th_t +{ + ZXIC_UINT32 oam_fs_txinst_fifo_th; +}DPP_NPPU_OAM_CFG_OAM_FS_TXINST_FIFO_TH_T; + +typedef struct dpp_nppu_oam_cfg_oam_ma_fs_txinst_fifo_th_t +{ + ZXIC_UINT32 oam_ma_fs_txinst_fifo_th; +}DPP_NPPU_OAM_CFG_OAM_MA_FS_TXINST_FIFO_TH_T; + +typedef struct dpp_nppu_oam_cfg_pon_int_ram_clr_t +{ + ZXIC_UINT32 pon_int_ram_clr; +}DPP_NPPU_OAM_CFG_PON_INT_RAM_CLR_T; + +typedef struct dpp_nppu_oam_cfg_pon_p_int_index_t +{ + ZXIC_UINT32 pon_p_int_index; +}DPP_NPPU_OAM_CFG_PON_P_INT_INDEX_T; + +typedef struct dpp_nppu_oam_cfg_pon_protect_pkt_fifo_th_t +{ + ZXIC_UINT32 pon_protect_pkt_fifo_th; +}DPP_NPPU_OAM_CFG_PON_PROTECT_PKT_FIFO_TH_T; + +typedef struct dpp_nppu_oam_cfg_pon_laser_off_en_t +{ + ZXIC_UINT32 pon_laser_off_en; +}DPP_NPPU_OAM_CFG_PON_LASER_OFF_EN_T; + +typedef struct dpp_nppu_oam_cfg_pon_prtct_pkt_tx_en_t +{ + ZXIC_UINT32 pon_prtct_pkt_tx_en; +}DPP_NPPU_OAM_CFG_PON_PRTCT_PKT_TX_EN_T; + +typedef struct dpp_nppu_oam_cfg_cfg_pon_master_t +{ + ZXIC_UINT32 cfg_pon_master; +}DPP_NPPU_OAM_CFG_CFG_PON_MASTER_T; + +typedef struct dpp_nppu_oam_cfg_level_mode_t +{ + ZXIC_UINT32 level_mode; +}DPP_NPPU_OAM_CFG_LEVEL_MODE_T; + +typedef struct dpp_nppu_oam_cfg_interrupt_en_t +{ + ZXIC_UINT32 interrupt_en; +}DPP_NPPU_OAM_CFG_INTERRUPT_EN_T; + +typedef struct dpp_nppu_oam_cfg_pon_laser_on_en_t +{ + ZXIC_UINT32 pon_laser_on_en; +}DPP_NPPU_OAM_CFG_PON_LASER_ON_EN_T; + +typedef struct dpp_nppu_oam_cfg_ti_pon_sd_t +{ + ZXIC_UINT32 ti_pon_sd; +}DPP_NPPU_OAM_CFG_TI_PON_SD_T; + +typedef struct dpp_nppu_oam_cfg_ti_pon_los_t +{ + ZXIC_UINT32 ti_pon_los; +}DPP_NPPU_OAM_CFG_TI_PON_LOS_T; + +typedef struct dpp_nppu_oam_cfg_ind_dat4_t +{ + ZXIC_UINT32 ind_dat4; +}DPP_NPPU_OAM_CFG_IND_DAT4_T; + +typedef struct dpp_nppu_oam_cfg_ind_dat5_t +{ + ZXIC_UINT32 ind_dat5; +}DPP_NPPU_OAM_CFG_IND_DAT5_T; + +typedef struct dpp_nppu_oam_cfg_ind_dat6_t +{ + ZXIC_UINT32 ind_dat6; +}DPP_NPPU_OAM_CFG_IND_DAT6_T; + +typedef struct dpp_nppu_oam_cfg_ind_dat7_t +{ + ZXIC_UINT32 ind_dat7; +}DPP_NPPU_OAM_CFG_IND_DAT7_T; + +typedef struct dpp_nppu_oam_cfg_ind_dat8_t +{ + ZXIC_UINT32 ind_dat8; +}DPP_NPPU_OAM_CFG_IND_DAT8_T; + +typedef struct dpp_nppu_oam_cfg_ind_dat9_t +{ + ZXIC_UINT32 ind_dat9; +}DPP_NPPU_OAM_CFG_IND_DAT9_T; + +typedef struct dpp_nppu_oam_cfg_ind_dat10_t +{ + ZXIC_UINT32 ind_dat10; +}DPP_NPPU_OAM_CFG_IND_DAT10_T; + +typedef struct dpp_nppu_oam_cfg_ind_dat11_t +{ + ZXIC_UINT32 ind_dat11; +}DPP_NPPU_OAM_CFG_IND_DAT11_T; + +typedef struct dpp_nppu_oam_cfg_ind_dat12_t +{ + ZXIC_UINT32 ind_dat12; +}DPP_NPPU_OAM_CFG_IND_DAT12_T; + +typedef struct dpp_nppu_oam_cfg_ind_dat13_t +{ + ZXIC_UINT32 ind_dat13; +}DPP_NPPU_OAM_CFG_IND_DAT13_T; + +typedef struct dpp_nppu_oam_cfg_ind_dat14_t +{ + ZXIC_UINT32 ind_dat14; +}DPP_NPPU_OAM_CFG_IND_DAT14_T; + +typedef struct dpp_nppu_oam_cfg_ind_dat15_t +{ + ZXIC_UINT32 ind_dat15; +}DPP_NPPU_OAM_CFG_IND_DAT15_T; + +typedef struct dpp_nppu_oam_cfg_oam_2544_pkt_fifo_th_t +{ + ZXIC_UINT32 oam_2544_pkt_fifo_th; +}DPP_NPPU_OAM_CFG_OAM_2544_PKT_FIFO_TH_T; + +typedef struct dpp_nppu_oam_cfg_txinfo_ram_clr_t +{ + ZXIC_UINT32 txinfo_ram_clr; +}DPP_NPPU_OAM_CFG_TXINFO_RAM_CLR_T; + +typedef struct dpp_nppu_oam_cfg_txinfo_ram_init_done_t +{ + ZXIC_UINT32 txinfo_ram_init_done; +}DPP_NPPU_OAM_CFG_TXINFO_RAM_INIT_DONE_T; + +typedef struct dpp_nppu_oam_cfg_fifo_status_int_status40_t +{ + ZXIC_UINT32 fifo_status_int_status40; +}DPP_NPPU_OAM_CFG_FIFO_STATUS_INT_STATUS40_T; + +typedef struct dpp_nppu_oam_cfg_fifo_status_int_status41_t +{ + ZXIC_UINT32 fifo_status_int_status41; +}DPP_NPPU_OAM_CFG_FIFO_STATUS_INT_STATUS41_T; + +typedef struct dpp_nppu_oam_cfg_oam_2544_fun_en_t +{ + ZXIC_UINT32 oam_2544_fun_en; +}DPP_NPPU_OAM_CFG_OAM_2544_FUN_EN_T; + +typedef struct dpp_nppu_oam_cfg_oam_2544_stat_clr_t +{ + ZXIC_UINT32 oam_2544_stat_clr; +}DPP_NPPU_OAM_CFG_OAM_2544_STAT_CLR_T; + +typedef struct dpp_nppu_oam_cfg_txdis_default_t +{ + ZXIC_UINT32 txdis_default; +}DPP_NPPU_OAM_CFG_TXDIS_DEFAULT_T; + +typedef struct dpp_nppu_oam_cfg_txdis_default_en_t +{ + ZXIC_UINT32 txdis_default_en; +}DPP_NPPU_OAM_CFG_TXDIS_DEFAULT_EN_T; + +typedef struct dpp_nppu_oam_cfg_tpbfd_firstchk_th_t +{ + ZXIC_UINT32 tpbfd_firstchk_th; +}DPP_NPPU_OAM_CFG_TPBFD_FIRSTCHK_TH_T; + +typedef struct dpp_nppu_oam_cfg_ethccm_firstchk_th_t +{ + ZXIC_UINT32 ethccm_firstchk_th; +}DPP_NPPU_OAM_CFG_ETHCCM_FIRSTCHK_TH_T; + +typedef struct dpp_nppu_oam_cfg_tpccm_firstchk_th_t +{ + ZXIC_UINT32 tpccm_firstchk_th; +}DPP_NPPU_OAM_CFG_TPCCM_FIRSTCHK_TH_T; + +typedef struct dpp_nppu_oam_stat_txstat_req_cnt_t +{ + ZXIC_UINT32 txstat_req_cnt; +}DPP_NPPU_OAM_STAT_TXSTAT_REQ_CNT_T; + +typedef struct dpp_nppu_oam_stat_chkstat_req_cnt_t +{ + ZXIC_UINT32 chkstat_req_cnt; +}DPP_NPPU_OAM_STAT_CHKSTAT_REQ_CNT_T; + +typedef struct dpp_nppu_oam_stat_stat_oam_fc_cnt_t +{ + ZXIC_UINT32 stat1_oam_fc_cnt; +}DPP_NPPU_OAM_STAT_STAT_OAM_FC_CNT_T; + +typedef struct dpp_nppu_oam_stat_bfdseq_req_cnt_t +{ + ZXIC_UINT32 bfdseq_req_cnt; +}DPP_NPPU_OAM_STAT_BFDSEQ_REQ_CNT_T; + +typedef struct dpp_nppu_oam_stat_lmcnt_req_cnt_t +{ + ZXIC_UINT32 lmcnt_req_cnt; +}DPP_NPPU_OAM_STAT_LMCNT_REQ_CNT_T; + +typedef struct dpp_nppu_oam_stat_stat_oam_lm_rsp_cnt_t +{ + ZXIC_UINT32 stat2_rsp_cnt; +}DPP_NPPU_OAM_STAT_STAT_OAM_LM_RSP_CNT_T; + +typedef struct dpp_nppu_oam_stat_stat_oam_lm_fc_cnt_t +{ + ZXIC_UINT32 stat2_oam_fc_cnt; +}DPP_NPPU_OAM_STAT_STAT_OAM_LM_FC_CNT_T; + +typedef struct dpp_nppu_oam_stat_se_req_cnt_t +{ + ZXIC_UINT32 se_req_cnt; +}DPP_NPPU_OAM_STAT_SE_REQ_CNT_T; + +typedef struct dpp_nppu_oam_stat_se_rsp_cnt_t +{ + ZXIC_UINT32 se_rsp_cnt; +}DPP_NPPU_OAM_STAT_SE_RSP_CNT_T; + +typedef struct dpp_nppu_oam_stat_se_oam_fc_cnt_t +{ + ZXIC_UINT32 se_oam_fc_cnt; +}DPP_NPPU_OAM_STAT_SE_OAM_FC_CNT_T; + +typedef struct dpp_nppu_oam_stat_oam_se_fc_cnt_t +{ + ZXIC_UINT32 oam_se_fc_cnt; +}DPP_NPPU_OAM_STAT_OAM_SE_FC_CNT_T; + +typedef struct dpp_nppu_oam_stat_oam_pktrx_sop_cnt_t +{ + ZXIC_UINT32 oam_pktrx_sop_cnt; +}DPP_NPPU_OAM_STAT_OAM_PKTRX_SOP_CNT_T; + +typedef struct dpp_nppu_oam_stat_oam_pktrx_eop_cnt_t +{ + ZXIC_UINT32 oam_pktrx_eop_cnt; +}DPP_NPPU_OAM_STAT_OAM_PKTRX_EOP_CNT_T; + +typedef struct dpp_nppu_oam_stat_pktrx_oam_fc_cnt_t +{ + ZXIC_UINT32 pktrx_oam_fc_cnt; +}DPP_NPPU_OAM_STAT_PKTRX_OAM_FC_CNT_T; + +typedef struct dpp_nppu_oam_stat_pktrx_oam_tst_fc_cnt_t +{ + ZXIC_UINT32 pktrx_oam_tst_fc_cnt; +}DPP_NPPU_OAM_STAT_PKTRX_OAM_TST_FC_CNT_T; + +typedef struct dpp_nppu_oam_stat_odma_oam_sop_cnt_t +{ + ZXIC_UINT32 odma_oam_sop_cnt; +}DPP_NPPU_OAM_STAT_ODMA_OAM_SOP_CNT_T; + +typedef struct dpp_nppu_oam_stat_odma_oam_eop_cnt_t +{ + ZXIC_UINT32 odma_oam_eop_cnt; +}DPP_NPPU_OAM_STAT_ODMA_OAM_EOP_CNT_T; + +typedef struct dpp_nppu_oam_stat_oam_odma_fc_cnt_t +{ + ZXIC_UINT32 oam_odma_fc_cnt; +}DPP_NPPU_OAM_STAT_OAM_ODMA_FC_CNT_T; + +typedef struct dpp_nppu_oam_stat_rec_ma_pkt_illegal_cnt_t +{ + ZXIC_UINT32 rec_ma_pkt_illegal_cnt; +}DPP_NPPU_OAM_STAT_REC_MA_PKT_ILLEGAL_CNT_T; + +typedef struct dpp_nppu_oam_stat_rec_rmep_pkt_illegal_cnt_t +{ + ZXIC_UINT32 rec_rmep_pkt_illegal_cnt; +}DPP_NPPU_OAM_STAT_REC_RMEP_PKT_ILLEGAL_CNT_T; + +typedef struct dpp_nppu_oam_stat_rec_eth_ais_pkt_cnt_t +{ + ZXIC_UINT32 rec_eth_ais_pkt_cnt; +}DPP_NPPU_OAM_STAT_REC_ETH_AIS_PKT_CNT_T; + +typedef struct dpp_nppu_oam_stat_rec_tp_ais_pkt_cnt_t +{ + ZXIC_UINT32 rec_tp_ais_pkt_cnt; +}DPP_NPPU_OAM_STAT_REC_TP_AIS_PKT_CNT_T; + +typedef struct dpp_nppu_oam_stat_rec_tp_csf_pkt_cnt_t +{ + ZXIC_UINT32 rec_tp_csf_pkt_cnt; +}DPP_NPPU_OAM_STAT_REC_TP_CSF_PKT_CNT_T; + +typedef struct dpp_nppu_oam_stat_rec_eth_level_defect_cnt_t +{ + ZXIC_UINT32 rec_eth_level_defect_cnt; +}DPP_NPPU_OAM_STAT_REC_ETH_LEVEL_DEFECT_CNT_T; + +typedef struct dpp_nppu_oam_stat_rec_eth_megid_defect_cnt_t +{ + ZXIC_UINT32 rec_eth_megid_defect_cnt; +}DPP_NPPU_OAM_STAT_REC_ETH_MEGID_DEFECT_CNT_T; + +typedef struct dpp_nppu_oam_stat_rec_eth_mepid_defect_cnt_t +{ + ZXIC_UINT32 rec_eth_mepid_defect_cnt; +}DPP_NPPU_OAM_STAT_REC_ETH_MEPID_DEFECT_CNT_T; + +typedef struct dpp_nppu_oam_stat_rec_eth_interval_defect_cnt_t +{ + ZXIC_UINT32 rec_eth_interval_defect_cnt; +}DPP_NPPU_OAM_STAT_REC_ETH_INTERVAL_DEFECT_CNT_T; + +typedef struct dpp_nppu_oam_stat_rec_sess_unenable_cnt_t +{ + ZXIC_UINT32 rec_sess_unenable_cnt; +}DPP_NPPU_OAM_STAT_REC_SESS_UNENABLE_CNT_T; + +typedef struct dpp_nppu_oam_stat_oam_2544_rd_pkt_cnt_t +{ + ZXIC_UINT32 oam_2544_rd_pkt_cnt; +}DPP_NPPU_OAM_STAT_OAM_2544_RD_PKT_CNT_T; + +typedef struct dpp_nppu_oam_stat_debug_cnt_clr_t +{ + ZXIC_UINT32 debug_cnt_clr; +}DPP_NPPU_OAM_STAT_DEBUG_CNT_CLR_T; + +typedef struct dpp_nppu_oam_stat_oam_pktrx_catch_data_t +{ + ZXIC_UINT32 oam_pktrx_catch_data; +}DPP_NPPU_OAM_STAT_OAM_PKTRX_CATCH_DATA_T; + +typedef struct dpp_nppu_oam_stat_odma_oam_catch_data_t +{ + ZXIC_UINT32 odma_oam_catch_data; +}DPP_NPPU_OAM_STAT_ODMA_OAM_CATCH_DATA_T; + +typedef struct dpp_nppu_oam_stat_tst_session_tx_cnt_t +{ + ZXIC_UINT32 tst_session_tx_cnt; +}DPP_NPPU_OAM_STAT_TST_SESSION_TX_CNT_T; + +typedef struct dpp_nppu_oam_stat_tst_session_rx_cnt_t +{ + ZXIC_UINT32 tst_session_rx_cnt; +}DPP_NPPU_OAM_STAT_TST_SESSION_RX_CNT_T; + +typedef struct dpp_nppu_oam_stat_tstrx_lost_cnt_t +{ + ZXIC_UINT32 tstrx_lost_cnt; +}DPP_NPPU_OAM_STAT_TSTRX_LOST_CNT_T; + +typedef struct dpp_nppu_oam_stat_bfdseq_wr_cnt_t +{ + ZXIC_UINT32 bfdseq_wr_cnt; +}DPP_NPPU_OAM_STAT_BFDSEQ_WR_CNT_T; + +typedef struct dpp_nppu_oam_stat_bfdtime_wr_cnt_t +{ + ZXIC_UINT32 bfdtime_wr_cnt; +}DPP_NPPU_OAM_STAT_BFDTIME_WR_CNT_T; + +typedef struct dpp_nppu_oam_stat_lmcnt_wr_cnt_t +{ + ZXIC_UINT32 lmcnt_wr_cnt; +}DPP_NPPU_OAM_STAT_LMCNT_WR_CNT_T; + +typedef struct dpp_nppu_oam_stat_oam_fs_pkt_cnt_t +{ + ZXIC_UINT32 oam_fs_pkt_cnt; +}DPP_NPPU_OAM_STAT_OAM_FS_PKT_CNT_T; + +typedef struct dpp_nppu_oam_stat_oam_ma_fs_pkt_cnt_t +{ + ZXIC_UINT32 lmcnt_wr_cnt; +}DPP_NPPU_OAM_STAT_OAM_MA_FS_PKT_CNT_T; + +typedef struct dpp_nppu_oam_stat_rec_tp_level_defect_cnt_t +{ + ZXIC_UINT32 rec_tp_level_defect_cnt; +}DPP_NPPU_OAM_STAT_REC_TP_LEVEL_DEFECT_CNT_T; + +typedef struct dpp_nppu_oam_stat_rec_tp_megid_defect_cnt_t +{ + ZXIC_UINT32 rec_tp_megid_defect_cnt; +}DPP_NPPU_OAM_STAT_REC_TP_MEGID_DEFECT_CNT_T; + +typedef struct dpp_nppu_oam_stat_rec_tp_mepid_defect_cnt_t +{ + ZXIC_UINT32 rec_tp_mepid_defect_cnt; +}DPP_NPPU_OAM_STAT_REC_TP_MEPID_DEFECT_CNT_T; + +typedef struct dpp_nppu_oam_stat_rec_tp_interval_defect_cnt_t +{ + ZXIC_UINT32 rec_tp_interval_defect_cnt; +}DPP_NPPU_OAM_STAT_REC_TP_INTERVAL_DEFECT_CNT_T; + +typedef struct dpp_nppu_oam_stat_rd_reg_clear_mode_t +{ + ZXIC_UINT32 rd_clear_mode_cfg; +}DPP_NPPU_OAM_STAT_RD_REG_CLEAR_MODE_T; + +typedef struct dpp_nppu_oam_stat_rd_data_reg_clear_mode_t +{ + ZXIC_UINT32 rd_data_reg_clear_mode_cfg; +}DPP_NPPU_OAM_STAT_RD_DATA_REG_CLEAR_MODE_T; + +typedef struct dpp_nppu_oam_cfg_indir_oam_int_status_ram_0_t +{ + ZXIC_UINT32 bfd_diag_value_bit4; + ZXIC_UINT32 bfd_diag_value_bit3; + ZXIC_UINT32 bfd_diag_value_bit2; + ZXIC_UINT32 bfd_diag_value_bit1; + ZXIC_UINT32 bfd_diag_value_bit0; + ZXIC_UINT32 dloc_int; + ZXIC_UINT32 drdi_int; +}DPP_NPPU_OAM_CFG_INDIR_OAM_INT_STATUS_RAM_0_T; + +typedef struct dpp_nppu_oam_cfg_indir_oam_int_status_ram1_t +{ + ZXIC_UINT32 sticky_error_level_defect; + ZXIC_UINT32 sticky_error_megid_defect; + ZXIC_UINT32 sticky_error_mepid_defect; + ZXIC_UINT32 sticky_error_inter_defect; + ZXIC_UINT32 sticky_ais_defect; + ZXIC_UINT32 sticky_csf_defect; + ZXIC_UINT32 current_error_level_defect; + ZXIC_UINT32 current_error_megid_defect; + ZXIC_UINT32 current_error_mepid_defect; + ZXIC_UINT32 current_error_inter_defect; + ZXIC_UINT32 current_ais_defect; + ZXIC_UINT32 current_csf_defect; +}DPP_NPPU_OAM_CFG_INDIR_OAM_INT_STATUS_RAM1_T; + +typedef struct dpp_nppu_oam_cfg_indir_tst_pkt_tx_para_ram_t +{ + ZXIC_UINT32 ddr_self_test_tx_en; + ZXIC_UINT32 tm_self_test_tx_en; + ZXIC_UINT32 fast_aging_tx_en; + ZXIC_UINT32 timing_aging_tx_en; + ZXIC_UINT32 backgroud_flow_tx_en; + ZXIC_UINT32 tsttx_session_en; + ZXIC_UINT32 tx_freq; + ZXIC_UINT32 tx_offset; + ZXIC_UINT32 tx_count; + ZXIC_UINT32 fast_tx_mode_en; + ZXIC_UINT32 tsttx_pkthead_len; + ZXIC_UINT32 tsttx_interval; +}DPP_NPPU_OAM_CFG_INDIR_TST_PKT_TX_PARA_RAM_T; + +typedef struct dpp_nppu_oam_cfg_indir_groupnumram_t +{ + ZXIC_UINT32 mep_down_num; +}DPP_NPPU_OAM_CFG_INDIR_GROUPNUMRAM_T; + +typedef struct dpp_nppu_oam_cfg_indir_oam_tx_tbl_ram_t +{ + ZXIC_UINT32 oam_tx_en; + ZXIC_UINT32 oam_tx_type; + ZXIC_UINT32 oam_fetch_len; + ZXIC_UINT32 bfd_seq_tx_en; + ZXIC_UINT32 tx_para; + ZXIC_UINT32 oam_tx_interval; + ZXIC_UINT32 hd_ena_flag; + ZXIC_UINT32 last_tx_time; +}DPP_NPPU_OAM_CFG_INDIR_OAM_TX_TBL_RAM_T; + +typedef struct dpp_nppu_oam_cfg_indir_oam_chk_tbl_ram_t +{ + ZXIC_UINT32 fast_switch_en; + ZXIC_UINT32 oam_chk_en; + ZXIC_UINT32 oam_chk_type; + ZXIC_UINT32 ccm_predel_flag; + ZXIC_UINT32 lm_chk_en; + ZXIC_UINT32 ccm_group_id; + ZXIC_UINT32 oam_chk_internal; + ZXIC_UINT32 fist_chk_flag; + ZXIC_UINT32 last_chk_time; +}DPP_NPPU_OAM_CFG_INDIR_OAM_CHK_TBL_RAM_T; + +typedef struct dpp_nppu_oam_cfg_indir_oam_ma_chk_tbl_ram_t +{ + ZXIC_UINT32 ma_fast_switch_en; + ZXIC_UINT32 ma_chk_en; + ZXIC_UINT32 ma_type; + ZXIC_UINT32 error_level_defect_en; + ZXIC_UINT32 error_megid_defect_en; + ZXIC_UINT32 error_mepid_defect_en; + ZXIC_UINT32 error_inter_defect_en; + ZXIC_UINT32 ais_defect_en; + ZXIC_UINT32 csf_defect_en; + ZXIC_UINT32 error_level_defect_ccm; + ZXIC_UINT32 error_megid_defect_ccm; + ZXIC_UINT32 error_mepid_defect_ccm; + ZXIC_UINT32 error_inter_defect_ccm; + ZXIC_UINT32 ais_defect_ccm; + ZXIC_UINT32 csf_defect_ccm; + ZXIC_UINT32 ma_predel_en; + ZXIC_UINT32 error_level_defect_ts; + ZXIC_UINT32 error_megid_defect_ts; + ZXIC_UINT32 error_mepid_defect_ts; + ZXIC_UINT32 error_inter_defect_ts; + ZXIC_UINT32 ais_defect_ts; + ZXIC_UINT32 csf_defect_ts; +}DPP_NPPU_OAM_CFG_INDIR_OAM_MA_CHK_TBL_RAM_T; + +typedef struct dpp_nppu_oam_cfg_indir_oam_2544_tx_ram_t +{ + ZXIC_UINT32 tx_en_2544; + ZXIC_UINT32 tx_cfg_times_2544; + ZXIC_UINT32 current_times; + ZXIC_UINT32 slice_num; + ZXIC_UINT32 pkt_mty; +}DPP_NPPU_OAM_CFG_INDIR_OAM_2544_TX_RAM_T; + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_pci.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_pci.h new file mode 100755 index 0000000..7d8a027 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_pci.h @@ -0,0 +1,37 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_pci.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : 石金锋 +* 完成日期 : 2014/02/10 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: 代码规范性修改 +* 修改日期: 2014/02/10 +* 版 本 号: +* 修 改 人: 丁金凤 +* 修改内容: +***************************************************************/ + +#ifndef _DPP_PCI_H_ +#define _DPP_PCI_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "dpp_dev.h" +#include "dpp_module.h" + +ZXIC_UINT32 dpp_pci_write32(DPP_DEV_T *dev, ZXIC_ADDR_T abs_addr, ZXIC_UINT32 *p_data); +ZXIC_UINT32 dpp_pci_read32(DPP_DEV_T *dev, ZXIC_ADDR_T abs_addr, ZXIC_UINT32 *p_data); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_ppu4k_reg.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_ppu4k_reg.h new file mode 100644 index 0000000..468a042 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_ppu4k_reg.h @@ -0,0 +1,45 @@ + +#ifndef _DPP_PPU4K_REG_H_ +#define _DPP_PPU4K_REG_H_ + +#ifdef __cplusplus +extern "C"{ +#endif + +typedef struct dpp_ppu4k_cluster_wr_high_data_r_mex_t +{ + ZXIC_UINT32 wr_high_data_r_mex; +}DPP_PPU4K_CLUSTER_WR_HIGH_DATA_R_MEX_T; + +typedef struct dpp_ppu4k_cluster_wr_low_data_r_mex_t +{ + ZXIC_UINT32 wr_low_data_r_mex; +}DPP_PPU4K_CLUSTER_WR_LOW_DATA_R_MEX_T; + +typedef struct dpp_ppu4k_cluster_addr_r_mex_t +{ + ZXIC_UINT32 operate_type; + ZXIC_UINT32 addr_r_mex; +}DPP_PPU4K_CLUSTER_ADDR_R_MEX_T; + +typedef struct dpp_ppu4k_cluster_sdt_tbl_ind_access_done_t +{ + ZXIC_UINT32 rd_addr_r_mex; +}DPP_PPU4K_CLUSTER_SDT_TBL_IND_ACCESS_DONE_T; + +typedef struct dpp_ppu4k_cluster_rd_high_data_r_mex_t +{ + ZXIC_UINT32 rd_high_data_r_mex; +}DPP_PPU4K_CLUSTER_RD_HIGH_DATA_R_MEX_T; + +typedef struct dpp_ppu4k_cluster_rd_low_data_r_mex_t +{ + ZXIC_UINT32 rd_low_data_r_mex; +}DPP_PPU4K_CLUSTER_RD_LOW_DATA_R_MEX_T; + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_ppu_reg.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_ppu_reg.h new file mode 100644 index 0000000..c604dc8 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_ppu_reg.h @@ -0,0 +1,4308 @@ + +#ifndef _DPP_PPU_REG_H_ +#define _DPP_PPU_REG_H_ + +#ifdef __cplusplus +extern "C"{ +#endif + +typedef struct dpp_ppu_ppu_test_r_t +{ + ZXIC_UINT32 test_r; +}DPP_PPU_PPU_TEST_R_T; + +typedef struct dpp_ppu_ppu_ppu_debug_en_r_t +{ + ZXIC_UINT32 debug_en_r; +}DPP_PPU_PPU_PPU_DEBUG_EN_R_T; + +typedef struct dpp_ppu_ppu_csr_dup_table_wr_data_t +{ + ZXIC_UINT32 item_vld; + ZXIC_UINT32 flownum_vld; + ZXIC_UINT32 start_pc; + ZXIC_UINT32 flownum; +}DPP_PPU_PPU_CSR_DUP_TABLE_WR_DATA_T; + +typedef struct dpp_ppu_ppu_csr_dup_table_rd_data_t +{ + ZXIC_UINT32 item_vld; + ZXIC_UINT32 flownum_vld; + ZXIC_UINT32 start_pc; + ZXIC_UINT32 flownum; +}DPP_PPU_PPU_CSR_DUP_TABLE_RD_DATA_T; + +typedef struct dpp_ppu_ppu_csr_dup_table_addr_t +{ + ZXIC_UINT32 csr_dup_table_operation; + ZXIC_UINT32 csr_dup_table_addr; +}DPP_PPU_PPU_CSR_DUP_TABLE_ADDR_T; + +typedef struct dpp_ppu_ppu_ppu_debug_vld_t +{ + ZXIC_UINT32 ppu_debug_vld; +}DPP_PPU_PPU_PPU_DEBUG_VLD_T; + +typedef struct dpp_ppu_ppu_cop_thash_rsk_319_288_t +{ + ZXIC_UINT32 rsk_319_288; +}DPP_PPU_PPU_COP_THASH_RSK_319_288_T; + +typedef struct dpp_ppu_ppu_cop_thash_rsk_287_256_t +{ + ZXIC_UINT32 rsk_287_256; +}DPP_PPU_PPU_COP_THASH_RSK_287_256_T; + +typedef struct dpp_ppu_ppu_cop_thash_rsk_255_224_t +{ + ZXIC_UINT32 rsk_255_224; +}DPP_PPU_PPU_COP_THASH_RSK_255_224_T; + +typedef struct dpp_ppu_ppu_cop_thash_rsk_223_192_t +{ + ZXIC_UINT32 rsk_223_192; +}DPP_PPU_PPU_COP_THASH_RSK_223_192_T; + +typedef struct dpp_ppu_ppu_cop_thash_rsk_191_160_t +{ + ZXIC_UINT32 rsk_191_160; +}DPP_PPU_PPU_COP_THASH_RSK_191_160_T; + +typedef struct dpp_ppu_ppu_cop_thash_rsk_159_128_t +{ + ZXIC_UINT32 rsk_159_128; +}DPP_PPU_PPU_COP_THASH_RSK_159_128_T; + +typedef struct dpp_ppu_ppu_cop_thash_rsk_127_096_t +{ + ZXIC_UINT32 rsk_127_096; +}DPP_PPU_PPU_COP_THASH_RSK_127_096_T; + +typedef struct dpp_ppu_ppu_cop_thash_rsk_095_064_t +{ + ZXIC_UINT32 rsk_095_064; +}DPP_PPU_PPU_COP_THASH_RSK_095_064_T; + +typedef struct dpp_ppu_ppu_cop_thash_rsk_063_032_t +{ + ZXIC_UINT32 rsk_063_032; +}DPP_PPU_PPU_COP_THASH_RSK_063_032_T; + +typedef struct dpp_ppu_ppu_cop_thash_rsk_031_000_t +{ + ZXIC_UINT32 rsk_031_000; +}DPP_PPU_PPU_COP_THASH_RSK_031_000_T; + +typedef struct dpp_ppu_ppu_cfg_ipv4_ipid_start_value_t +{ + ZXIC_UINT32 cfg_ipv4_ipid_start_value; +}DPP_PPU_PPU_CFG_IPV4_IPID_START_VALUE_T; + +typedef struct dpp_ppu_ppu_cfg_ipv4_ipid_end_value_t +{ + ZXIC_UINT32 cfg_ipv4_ipid_end_value; +}DPP_PPU_PPU_CFG_IPV4_IPID_END_VALUE_T; + +typedef struct dpp_ppu_ppu_cluster_mf_in_en_t +{ + ZXIC_UINT32 cluster_mf_in_en; +}DPP_PPU_PPU_CLUSTER_MF_IN_EN_T; + +typedef struct dpp_ppu_ppu_ppu_empty_t +{ + ZXIC_UINT32 ppu_empty; +}DPP_PPU_PPU_PPU_EMPTY_T; + +typedef struct dpp_ppu_ppu_instrmem_w_addr_t +{ + ZXIC_UINT32 instrmem_w_addr; +}DPP_PPU_PPU_INSTRMEM_W_ADDR_T; + +typedef struct dpp_ppu_ppu_instrmem_w_data_191_160_t +{ + ZXIC_UINT32 instrmem_w_data_191_160; +}DPP_PPU_PPU_INSTRMEM_W_DATA_191_160_T; + +typedef struct dpp_ppu_ppu_instrmem_w_data_159_128_t +{ + ZXIC_UINT32 instrmem_w_data_159_128; +}DPP_PPU_PPU_INSTRMEM_W_DATA_159_128_T; + +typedef struct dpp_ppu_ppu_instrmem_w_data_127_96_t +{ + ZXIC_UINT32 instrmem_w_data_127_96; +}DPP_PPU_PPU_INSTRMEM_W_DATA_127_96_T; + +typedef struct dpp_ppu_ppu_instrmem_w_data_95_64_t +{ + ZXIC_UINT32 instrmem_w_data_95_64; +}DPP_PPU_PPU_INSTRMEM_W_DATA_95_64_T; + +typedef struct dpp_ppu_ppu_instrmem_w_data_63_32_t +{ + ZXIC_UINT32 instrmem_w_data_63_32; +}DPP_PPU_PPU_INSTRMEM_W_DATA_63_32_T; + +typedef struct dpp_ppu_ppu_instrmem_w_data_31_0_t +{ + ZXIC_UINT32 instrmem_w_data_31_0; +}DPP_PPU_PPU_INSTRMEM_W_DATA_31_0_T; + +typedef struct dpp_ppu_ppu_isu_fwft_mf_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 isu_fwft_mf_fifo_prog_full_assert_cfg; +}DPP_PPU_PPU_ISU_FWFT_MF_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_isu_fwft_mf_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 isu_fwft_mf_fifo_prog_full_negate_cfg; +}DPP_PPU_PPU_ISU_FWFT_MF_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_int_1200m_mask_t +{ + ZXIC_UINT32 me7_interrupt_mask; + ZXIC_UINT32 me6_interrupt_mask; + ZXIC_UINT32 me5_interrupt_mask; + ZXIC_UINT32 me4_interrupt_mask; + ZXIC_UINT32 me3_interrupt_mask; + ZXIC_UINT32 me2_interrupt_mask; + ZXIC_UINT32 me1_interrupt_mask; + ZXIC_UINT32 me0_interrupt_mask; +}DPP_PPU_CLUSTER_INT_1200M_MASK_T; + +typedef struct dpp_ppu_ppu_interrupt_en_r_t +{ + ZXIC_UINT32 interrupt_en_r; +}DPP_PPU_PPU_INTERRUPT_EN_R_T; + +typedef struct dpp_ppu_ppu_mec_host_interrupt_t +{ + ZXIC_UINT32 mec_host_interrupt; +}DPP_PPU_PPU_MEC_HOST_INTERRUPT_T; + +typedef struct dpp_ppu_ppu_dbg_rtl_date_t +{ + ZXIC_UINT32 dbg_rtl_date; +}DPP_PPU_PPU_DBG_RTL_DATE_T; + +typedef struct dpp_ppu_ppu_dup_start_num_cfg_t +{ + ZXIC_UINT32 dup_start_num_cfg; +}DPP_PPU_PPU_DUP_START_NUM_CFG_T; + +typedef struct dpp_ppu_ppu_debug_data_write_complete_t +{ + ZXIC_UINT32 debug_data_write_complete; +}DPP_PPU_PPU_DEBUG_DATA_WRITE_COMPLETE_T; + +typedef struct dpp_ppu_ppu_uc_mc_wrr_cfg_t +{ + ZXIC_UINT32 uc_mc_wrr_cfg; +}DPP_PPU_PPU_UC_MC_WRR_CFG_T; + +typedef struct dpp_ppu_ppu_debug_pkt_send_en_t +{ + ZXIC_UINT32 debug_pkt_send_en; +}DPP_PPU_PPU_DEBUG_PKT_SEND_EN_T; + +typedef struct dpp_ppu_ppu_dup_tbl_ind_access_done_t +{ + ZXIC_UINT32 dup_tbl_ind_access_done; +}DPP_PPU_PPU_DUP_TBL_IND_ACCESS_DONE_T; + +typedef struct dpp_ppu_ppu_isu_ppu_demux_fifo_interrupt_mask_t +{ + ZXIC_UINT32 isu_in_para_fwft_fifo_32x81_wrapper_u0_overflow_mask; + ZXIC_UINT32 isu_in_para_fwft_fifo_32x81_wrapper_u0_underflow_mask; + ZXIC_UINT32 isu_in_fifo_64x81_wrapper_u0_overflow_mask; + ZXIC_UINT32 isu_in_fifo_64x81_wrapper_u0_underflow_mask; +}DPP_PPU_PPU_ISU_PPU_DEMUX_FIFO_INTERRUPT_MASK_T; + +typedef struct dpp_ppu_ppu_ppu_multicast_fifo_interrupt_mask_t +{ + ZXIC_UINT32 ppu_pktrx_mc_ptr_fifo_16384x17_wrapper_u0_underflow_mask; + ZXIC_UINT32 ppu_pktrx_mc_ptr_fifo_16384x17_wrapper_u0_overflow_mask; + ZXIC_UINT32 pf_req_fwft_fifo_16x36_wrapper_u0_overflow_mask; + ZXIC_UINT32 pf_req_fwft_fifo_16x36_wrapper_u0_underflow_mask; + ZXIC_UINT32 pf_rsp_fwft_fifo_32x34_wrapper_u0_overflow_mask; + ZXIC_UINT32 pf_rsp_fwft_fifo_32x34_wrapper_u0_underflow_mask; + ZXIC_UINT32 dup_para_fwft_fifo_16x35_wrapper_u0_overflow_mask; + ZXIC_UINT32 dup_para_fwft_fifo_16x35_wrapper_u0_underflow_mask; + ZXIC_UINT32 se_mc_rsp_fwft_fifo_32x17_wrapper_u0_overflow_mask; + ZXIC_UINT32 se_mc_rsp_fwft_fifo_32x17_wrapper_u0_underflow_mask; + ZXIC_UINT32 sa_para_fwft_fifo_64x17_wrapper_u0_overflow_mask; + ZXIC_UINT32 sa_para_fwft_fifo_64x17_wrapper_u0_underflow_mask; + ZXIC_UINT32 group_id_fifo_64x16_wrapper_u0_overflow_mask; + ZXIC_UINT32 group_id_fifo_64x16_wrapper_u0_underflow_mask; + ZXIC_UINT32 isu_mc_para_fwft_fifo_128x34_wrapper_u0_overflow_mask; + ZXIC_UINT32 isu_mc_para_fwft_fifo_128x34_wrapper_u0_underflow_mask; + ZXIC_UINT32 dup_freeptr_fwft_fifo_128x7_wrapper_u0_overflow_mask; + ZXIC_UINT32 dup_freeptr_fwft_fifo_128x7_wrapper_u0_underflow_mask; + ZXIC_UINT32 car_flag_fifo_32x1_wrapper_overflow_mask; + ZXIC_UINT32 car_flag_fifo_32x1_wrapper_underflow_mask; +}DPP_PPU_PPU_PPU_MULTICAST_FIFO_INTERRUPT_MASK_T; + +typedef struct dpp_ppu_ppu_ppu_in_schedule_fifo_interrupt_mask_t +{ + ZXIC_UINT32 free_global_num_fwft_fifo_8192x13_wrapper_u0_overflow_mask; + ZXIC_UINT32 free_global_num_fwft_fifo_8192x13_wrapper_u0_underflow_mask; + ZXIC_UINT32 mc_mf_fifo_16x2048_wrapper_u0_overflow_mask; + ZXIC_UINT32 mc_mf_fifo_16x2048_wrapper_u0_underflow_mask; + ZXIC_UINT32 uc_mf_fifo_96x2048_wrapper_u0_overflow_mask; + ZXIC_UINT32 uc_mf_fifo_96x2048_wrapper_u0_underflow_mask; +}DPP_PPU_PPU_PPU_IN_SCHEDULE_FIFO_INTERRUPT_MASK_T; + +typedef struct dpp_ppu_ppu_ppu_mf_out_fifo_interrupt_mask_t +{ + ZXIC_UINT32 ppu_cluster5_mf_out_afifo_32x2048_wrapper_overflow_mask; + ZXIC_UINT32 ppu_cluster5_mf_out_afifo_32x2048_wrapper_underflow_mask; + ZXIC_UINT32 ppu_cluster4_mf_out_afifo_32x2048_wrapper_overflow_mask; + ZXIC_UINT32 ppu_cluster4_mf_out_afifo_32x2048_wrapper_underflow_mask; + ZXIC_UINT32 ppu_cluster3_mf_out_afifo_32x2048_wrapper_overflow_mask; + ZXIC_UINT32 ppu_cluster3_mf_out_afifo_32x2048_wrapper_underflow_mask; + ZXIC_UINT32 ppu_cluster2_mf_out_afifo_32x2048_wrapper_overflow_mask; + ZXIC_UINT32 ppu_cluster2_mf_out_afifo_32x2048_wrapper_underflow_mask; + ZXIC_UINT32 ppu_cluster1_mf_out_afifo_32x2048_wrapper_overflow_mask; + ZXIC_UINT32 ppu_cluster1_mf_out_afifo_32x2048_wrapper_underflow_mask; + ZXIC_UINT32 ppu_cluster0_mf_out_afifo_32x2048_wrapper_overflow_mask; + ZXIC_UINT32 ppu_cluster0_mf_out_afifo_32x2048_wrapper_underflow_mask; +}DPP_PPU_PPU_PPU_MF_OUT_FIFO_INTERRUPT_MASK_T; + +typedef struct dpp_ppu_ppu_pbu_mcode_pf_req_schedule_fifo_interrupt_mask_t +{ + ZXIC_UINT32 ppu_cluster5_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_mask; + ZXIC_UINT32 ppu_cluster4_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_mask; + ZXIC_UINT32 ppu_cluster3_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_mask; + ZXIC_UINT32 ppu_cluster2_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_mask; + ZXIC_UINT32 ppu_cluster1_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_mask; + ZXIC_UINT32 ppu_cluster0_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_mask; + ZXIC_UINT32 ppu_cluster5_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_mask; + ZXIC_UINT32 ppu_cluster4_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_mask; + ZXIC_UINT32 ppu_cluster3_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_mask; + ZXIC_UINT32 ppu_cluster2_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_mask; + ZXIC_UINT32 ppu_cluster1_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_mask; + ZXIC_UINT32 ppu_cluster0_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_mask; +}DPP_PPU_PPU_PBU_MCODE_PF_REQ_SCHEDULE_FIFO_INTERRUPT_MASK_T; + +typedef struct dpp_ppu_ppu_pbu_mcode_pf_rsp_schedule_fifo_interrupt_mask_t +{ + ZXIC_UINT32 ppu_pbu_mcode_pf_rsp_afifo_64x16_wrapper_u0r_underflow_mask; + ZXIC_UINT32 ppu_pbu_mcode_pf_rsp_afifo_64x16_wrapper_u0_overflow_mask; +}DPP_PPU_PPU_PBU_MCODE_PF_RSP_SCHEDULE_FIFO_INTERRUPT_MASK_T; + +typedef struct dpp_ppu_ppu_ppu_mccnt_fifo_interrupt_mask_t +{ + ZXIC_UINT32 ppu_mccnt_fifo_32x15_wrapper_u0_overflow_mask; + ZXIC_UINT32 ppu_mccnt_fifo_32x15_wrapper_u0_underflow_mask; + ZXIC_UINT32 ppu_wb_data_fifo_32x2048_wrapper_u0_overflow_mask; + ZXIC_UINT32 ppu_wb_data_fifo_32x2048_wrapper_u0_underflow_mask; + ZXIC_UINT32 mccnt_rsp_fifo_32x1_wrapper_u0_overflow_mask; + ZXIC_UINT32 mccnt_rsp_fifo_32x1_wrapper_u0_underflow_mask; +}DPP_PPU_PPU_PPU_MCCNT_FIFO_INTERRUPT_MASK_T; + +typedef struct dpp_ppu_ppu_coprocessor_fifo_interrupt_mask_l_t +{ + ZXIC_UINT32 mec3_cop_key_crc_fifo_32x625_wrapper_overflow_flg_mask; + ZXIC_UINT32 mec3_cop_key_crc_fifo_32x625_wrapper_underflow_flg_mask; + ZXIC_UINT32 mec3_cop_key_checksum_fifo_32x180_wrapper_overflow_flg_mask; + ZXIC_UINT32 mec3_cop_key_checksum_fifo_32x180_wrapper_underflow_flg_mask; + ZXIC_UINT32 mec3_cop_key_mul_fifo_32x52_wrapper_overflow_flg_mask; + ZXIC_UINT32 mec3_cop_key_mul_fifo_32x52_wrapper_underflow_flg_mask; + ZXIC_UINT32 mec3_cop_key_random_mod_fifo_32x44_wrapper_overflow_flg_mask; + ZXIC_UINT32 mec3_cop_key_random_mod_fifo_32x44_wrapper_underflow_flg_mask; + ZXIC_UINT32 mec2_cop_key_crc_fifo_32x625_wrapper_overflow_flg_mask; + ZXIC_UINT32 mec2_cop_key_crc_fifo_32x625_wrapper_underflow_flg_mask; + ZXIC_UINT32 mec2_cop_key_checksum_fifo_32x180_wrapper_overflow_flg_mask; + ZXIC_UINT32 mec2_cop_key_checksum_fifo_32x180_wrapper_underflow_flg_mask; + ZXIC_UINT32 mec2_cop_key_mul_fifo_32x52_wrapper_overflow_flg_mask; + ZXIC_UINT32 mec2_cop_key_mul_fifo_32x52_wrapper_underflow_flg_mask; + ZXIC_UINT32 mec2_cop_key_random_mod_fifo_32x44_wrapper_overflow_flg_mask; + ZXIC_UINT32 mec2_cop_key_random_mod_fifo_32x44_wrapper_underflow_flg_mask; + ZXIC_UINT32 mec1_cop_key_crc_fifo_32x625_wrapper_overflow_flg_mask; + ZXIC_UINT32 mec1_cop_key_crc_fifo_32x625_wrapper_underflow_flg_mask; + ZXIC_UINT32 mec1_cop_key_checksum_fifo_32x180_wrapper_overflow_flg_mask; + ZXIC_UINT32 mec1_cop_key_checksum_fifo_32x180_wrapper_underflow_flg_mask; + ZXIC_UINT32 mec1_cop_key_mul_fifo_32x52_wrapper_overflow_flg_mask; + ZXIC_UINT32 mec1_cop_key_mul_fifo_32x52_wrapper_underflow_flg_mask; + ZXIC_UINT32 mec1_cop_key_random_mod_fifo_32x44_wrapper_overflow_flg_mask; + ZXIC_UINT32 mec1_cop_key_random_mod_fifo_32x44_wrapper_underflow_flg_mask; + ZXIC_UINT32 mec0_cop_key_crc_fifo_32x625_wrapper_overflow_flg_mask; + ZXIC_UINT32 mec0_cop_key_crc_fifo_32x625_wrapper_underflow_flg_mask; + ZXIC_UINT32 mec0_cop_key_checksum_fifo_32x180_wrapper_overflow_flg_mask; + ZXIC_UINT32 mec0_cop_key_checksum_fifo_32x180_wrapper_underflow_flg_mask; + ZXIC_UINT32 mec0_cop_key_mul_fifo_32x52_wrapper_overflow_flg_mask; + ZXIC_UINT32 mec0_cop_key_mul_fifo_32x52_wrapper_underflow_flg_mask; + ZXIC_UINT32 mec0_cop_key_random_mod_fifo_32x44_wrapper_overflow_flg_mask; + ZXIC_UINT32 mec0_cop_key_random_mod_fifo_32x44_wrapper_underflow_flg_mask; +}DPP_PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_MASK_L_T; + +typedef struct dpp_ppu_ppu_coprocessor_fifo_interrupt_mask_m_t +{ + ZXIC_UINT32 ppu_cop_result_fwft_fifo_80x80_wrapper_overflow_mask; + ZXIC_UINT32 ppu_cop_result_fwft_fifo_80x80_wrapper_underflow_mask; + ZXIC_UINT32 ppu_cop_delay_fifo_48x16_wrapper_overflow_mask; + ZXIC_UINT32 ppu_cop_delay_fifo_48x16_wrapper_underflow_mask; + ZXIC_UINT32 ppu_cop_delay_fifo_16x48_wrapper_overflow_mask; + ZXIC_UINT32 ppu_cop_delay_fifo_16x48_wrapper_underflow_mask; + ZXIC_UINT32 ppu_cop_delay_fifo_16x32_wrapper_overflow_mask; + ZXIC_UINT32 ppu_cop_delay_fifo_16x32_wrapper_underflow_mask; + ZXIC_UINT32 ppu_cop_result_fwft_fifo_96x80_wrapper_overflow_mask; + ZXIC_UINT32 ppu_cop_result_fwft_fifo_96x80_wrapper_underflow_mask; + ZXIC_UINT32 ppu_cop_delay_fifo_16x16_wrapper_overflow_mask; + ZXIC_UINT32 ppu_cop_delay_fifo_16x16_wrapper_underflow_mask; + ZXIC_UINT32 ppu_cop_result_fwft_fifo_32x80_wrapper_overflow_mask; + ZXIC_UINT32 ppu_cop_result_fwft_fifo_32x80_wrapper_underflow_mask; + ZXIC_UINT32 ppu_cop_result_fwft_fifo_16x80_wrapper_overflow_mask; + ZXIC_UINT32 ppu_cop_result_fwft_fifo_16x80_wrapper_underflow_mask; + ZXIC_UINT32 mec5_cop_key_crc_fifo_32x625_wrapper_overflow_flg_mask; + ZXIC_UINT32 mec5_cop_key_crc_fifo_32x625_wrapper_underflow_flg_mask; + ZXIC_UINT32 mec5_cop_key_checksum_fifo_32x180_wrapper_overflow_flg_mask; + ZXIC_UINT32 mec5_cop_key_checksum_fifo_32x180_wrapper_underflow_flg_mask; + ZXIC_UINT32 mec5_cop_key_mul_fifo_32x52_wrapper_overflow_flg_mask; + ZXIC_UINT32 mec5_cop_key_mul_fifo_32x52_wrapper_underflow_flg_mask; + ZXIC_UINT32 mec5_cop_key_random_mod_fifo_32x44_wrapper_overflow_flg_mask; + ZXIC_UINT32 mec5_cop_key_random_mod_fifo_32x44_wrapper_underflow_flg_mask; + ZXIC_UINT32 mec4_cop_key_crc_fifo_32x625_wrapper_overflow_flg_mask; + ZXIC_UINT32 mec4_cop_key_crc_fifo_32x625_wrapper_underflow_flg_mask; + ZXIC_UINT32 mec4_cop_key_checksum_fifo_32x180_wrapper_overflow_flg_mask; + ZXIC_UINT32 mec4_cop_key_checksum_fifo_32x180_wrapper_underflow_flg_mask; + ZXIC_UINT32 mec4_cop_key_mul_fifo_32x52_wrapper_overflow_flg_mask; + ZXIC_UINT32 mec4_cop_key_mul_fifo_32x52_wrapper_underflow_flg_mask; + ZXIC_UINT32 mec4_cop_key_random_mod_fifo_32x44_wrapper_overflow_flg_mask; + ZXIC_UINT32 mec4_cop_key_random_mod_fifo_32x44_wrapper_underflow_flg_mask; +}DPP_PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_MASK_M_T; + +typedef struct dpp_ppu_ppu_coprocessor_fifo_interrupt_mask_h_t +{ + ZXIC_UINT32 coprocessor_fwft_fifo_16x80_wrapper_overflow_mask; + ZXIC_UINT32 coprocessor_fwft_fifo_16x80_wrapper_underflow_mask; + ZXIC_UINT32 ppu_cop_random_mod_para_delay_fifo_48x16_wrapper_overflow_mask; + ZXIC_UINT32 ppu_cop_random_mod_para_delay_fifo_48x16_wrapper_underflow_mask; +}DPP_PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_MASK_H_T; + +typedef struct dpp_ppu_ppu_ppu_ram_check_err_mask_t +{ + ZXIC_UINT32 parity_err_mask; +}DPP_PPU_PPU_PPU_RAM_CHECK_ERR_MASK_T; + +typedef struct dpp_ppu_ppu_instrmem_fifo_interrupt_mask_t +{ + ZXIC_UINT32 instrmem2_wr_fifo_ovf_mask; + ZXIC_UINT32 instrmem2_wr_fifo_udf_mask; + ZXIC_UINT32 instrmem2_rd_fifo_ovf_mask; + ZXIC_UINT32 instrmem2_rd_fifo_udf_mask; + ZXIC_UINT32 instrmem1_wr_fifo_ovf_mask; + ZXIC_UINT32 instrmem1_wr_fifo_udf_mask; + ZXIC_UINT32 instrmem1_rd_fifo_ovf_mask; + ZXIC_UINT32 instrmem1_rd_fifo_udf_mask; + ZXIC_UINT32 instrmem0_wr_fifo_ovf_mask; + ZXIC_UINT32 instrmem0_wr_fifo_udf_mask; + ZXIC_UINT32 instrmem0_rd_fifo_ovf_mask; + ZXIC_UINT32 instrmem0_rd_fifo_udf_mask; +}DPP_PPU_PPU_INSTRMEM_FIFO_INTERRUPT_MASK_T; + +typedef struct dpp_ppu_ppu_isu_ppu_demux_fifo_interrupt_sta_t +{ + ZXIC_UINT32 isu_in_para_fwft_fifo_32x81_wrapper_u0_overflow_sta; + ZXIC_UINT32 isu_in_para_fwft_fifo_32x81_wrapper_u0_underflow_sta; + ZXIC_UINT32 isu_in_fifo_64x81_wrapper_u0_overflow_sta; + ZXIC_UINT32 isu_in_fifo_64x81_wrapper_u0_underflow_sta; +}DPP_PPU_PPU_ISU_PPU_DEMUX_FIFO_INTERRUPT_STA_T; + +typedef struct dpp_ppu_ppu_ppu_multicast_fifo_interrupt_sta_t +{ + ZXIC_UINT32 ppu_pktrx_mc_ptr_fifo_16384x17_wrapper_u0_overflow_sta; + ZXIC_UINT32 ppu_pktrx_mc_ptr_fifo_16384x17_wrapper_u0_underflow_sta; + ZXIC_UINT32 pf_req_fwft_fifo_16x36_wrapper_u0_overflow_sta; + ZXIC_UINT32 pf_req_fwft_fifo_16x36_wrapper_u0_underflow_sta; + ZXIC_UINT32 pf_rsp_fwft_fifo_32x34_wrapper_u0_overflow_sta; + ZXIC_UINT32 pf_rsp_fwft_fifo_32x34_wrapper_u0_underflow_sta; + ZXIC_UINT32 dup_para_fwft_fifo_16x35_wrapper_u0_overflow_sta; + ZXIC_UINT32 dup_para_fwft_fifo_16x35_wrapper_u0_underflow_sta; + ZXIC_UINT32 se_mc_rsp_fwft_fifo_32x17_wrapper_u0_overflow_sta; + ZXIC_UINT32 se_mc_rsp_fwft_fifo_32x17_wrapper_u0_underflow_sta; + ZXIC_UINT32 sa_para_fwft_fifo_64x17_wrapper_u0_overflow_sta; + ZXIC_UINT32 sa_para_fwft_fifo_64x17_wrapper_u0_underflow_sta; + ZXIC_UINT32 group_id_fifo_64x16_wrapper_u0_overflow_sta; + ZXIC_UINT32 group_id_fifo_64x16_wrapper_u0_underflow_sta; + ZXIC_UINT32 isu_mc_para_fwft_fifo_128x34_wrapper_u0_overflow_sta; + ZXIC_UINT32 isu_mc_para_fwft_fifo_128x34_wrapper_u0_underflow_sta; + ZXIC_UINT32 dup_freeptr_fwft_fifo_128x7_wrapper_u0_overflow_sta; + ZXIC_UINT32 dup_freeptr_fwft_fifo_128x7_wrapper_u0_underflow_sta; + ZXIC_UINT32 car_flag_fifo_32x1_wrapper_overflow_sta; + ZXIC_UINT32 car_flag_fifo_32x1_wrapper_underflow_sta; +}DPP_PPU_PPU_PPU_MULTICAST_FIFO_INTERRUPT_STA_T; + +typedef struct dpp_ppu_ppu_ppu_in_schedule_fifo_interrupt_sta_t +{ + ZXIC_UINT32 free_global_num_fwft_fifo_8192x13_wrapper_u0_overflow_sta; + ZXIC_UINT32 free_global_num_fwft_fifo_8192x13_wrapper_u0_underflow_sta; + ZXIC_UINT32 mc_mf_fifo_16x2048_wrapper_u0_overflow_sta; + ZXIC_UINT32 mc_mf_fifo_16x2048_wrapper_u0_underflow_sta; + ZXIC_UINT32 uc_mf_fifo_96x2048_wrapper_u0_overflow_sta; + ZXIC_UINT32 uc_mf_fifo_96x2048_wrapper_u0_underflow_sta; +}DPP_PPU_PPU_PPU_IN_SCHEDULE_FIFO_INTERRUPT_STA_T; + +typedef struct dpp_ppu_ppu_ppu_mf_out_fifo_interrupt_sta_t +{ + ZXIC_UINT32 ppu_cluster5_mf_out_afifo_32x2048_wrapper_overflow_sta; + ZXIC_UINT32 ppu_cluster5_mf_out_afifo_32x2048_wrapper_underflow_sta; + ZXIC_UINT32 ppu_cluster4_mf_out_afifo_32x2048_wrapper_overflow_sta; + ZXIC_UINT32 ppu_cluster4_mf_out_afifo_32x2048_wrapper_underflow_sta; + ZXIC_UINT32 ppu_cluster3_mf_out_afifo_32x2048_wrapper_overflow_sta; + ZXIC_UINT32 ppu_cluster3_mf_out_afifo_32x2048_wrapper_underflow_sta; + ZXIC_UINT32 ppu_cluster2_mf_out_afifo_32x2048_wrapper_overflow_sta; + ZXIC_UINT32 ppu_cluster2_mf_out_afifo_32x2048_wrapper_underflow_sta; + ZXIC_UINT32 ppu_cluster1_mf_out_afifo_32x2048_wrapper_overflow_sta; + ZXIC_UINT32 ppu_cluster1_mf_out_afifo_32x2048_wrapper_underflow_sta; + ZXIC_UINT32 ppu_cluster0_mf_out_afifo_32x2048_wrapper_overflow_sta; + ZXIC_UINT32 ppu_cluster0_mf_out_afifo_32x2048_wrapper_underflow_sta; +}DPP_PPU_PPU_PPU_MF_OUT_FIFO_INTERRUPT_STA_T; + +typedef struct dpp_ppu_ppu_pbu_mcode_pf_req_schedule_fifo_interrupt_sta_t +{ + ZXIC_UINT32 ppu_cluster5_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_sta; + ZXIC_UINT32 ppu_cluster4_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_sta; + ZXIC_UINT32 ppu_cluster3_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_sta; + ZXIC_UINT32 ppu_cluster2_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_sta; + ZXIC_UINT32 ppu_cluster1_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_sta; + ZXIC_UINT32 ppu_cluster0_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_sta; + ZXIC_UINT32 ppu_cluster5_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_sta; + ZXIC_UINT32 ppu_cluster4_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_sta; + ZXIC_UINT32 ppu_cluster3_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_sta; + ZXIC_UINT32 ppu_cluster2_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_sta; + ZXIC_UINT32 ppu_cluster1_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_sta; + ZXIC_UINT32 ppu_cluster0_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_sta; +}DPP_PPU_PPU_PBU_MCODE_PF_REQ_SCHEDULE_FIFO_INTERRUPT_STA_T; + +typedef struct dpp_ppu_ppu_pbu_mcode_pf_rsp_schedule_fifo_interrupt_sta_t +{ + ZXIC_UINT32 ppu_pbu_mcode_pf_rsp_afifo_64x16_wrapper_u0r_underflow_sta; + ZXIC_UINT32 ppu_pbu_mcode_pf_rsp_afifo_64x16_wrapper_u0_overflow_sta; +}DPP_PPU_PPU_PBU_MCODE_PF_RSP_SCHEDULE_FIFO_INTERRUPT_STA_T; + +typedef struct dpp_ppu_ppu_ppu_mccnt_fifo_interrupt_sta_t +{ + ZXIC_UINT32 ppu_mccnt_fifo_32x15_wrapper_u0_overflow_sta; + ZXIC_UINT32 ppu_mccnt_fifo_32x15_wrapper_u0_underflow_sta; + ZXIC_UINT32 ppu_wb_data_fifo_32x2048_wrapper_u0_overflow_sta; + ZXIC_UINT32 ppu_wb_data_fifo_32x2048_wrapper_u0_underflow_sta; + ZXIC_UINT32 mccnt_rsp_fifo_32x1_wrapper_u0_overflow_sta; + ZXIC_UINT32 mccnt_rsp_fifo_32x1_wrapper_u0_underflow_sta; +}DPP_PPU_PPU_PPU_MCCNT_FIFO_INTERRUPT_STA_T; + +typedef struct dpp_ppu_ppu_coprocessor_fifo_interrupt_sta_l_t +{ + ZXIC_UINT32 mec3_cop_key_crc_fifo_32x625_wrapper_overflow_flg_sta; + ZXIC_UINT32 mec3_cop_key_crc_fifo_32x625_wrapper_underflow_flg_sta; + ZXIC_UINT32 mec3_cop_key_checksum_fifo_32x180_wrapper_overflow_flg_sta; + ZXIC_UINT32 mec3_cop_key_checksum_fifo_32x180_wrapper_underflow_flg_sta; + ZXIC_UINT32 mec3_cop_key_mul_fifo_32x52_wrapper_overflow_flg_sta; + ZXIC_UINT32 mec3_cop_key_mul_fifo_32x52_wrapper_underflow_flg_sta; + ZXIC_UINT32 mec3_cop_key_random_mod_fifo_32x44_wrapper_overflow_flg_sta; + ZXIC_UINT32 mec3_cop_key_random_mod_fifo_32x44_wrapper_underflow_flg_sta; + ZXIC_UINT32 mec2_cop_key_crc_fifo_32x625_wrapper_overflow_flg_sta; + ZXIC_UINT32 mec2_cop_key_crc_fifo_32x625_wrapper_underflow_flg_sta; + ZXIC_UINT32 mec2_cop_key_checksum_fifo_32x180_wrapper_overflow_flg_sta; + ZXIC_UINT32 mec2_cop_key_checksum_fifo_32x180_wrapper_underflow_flg_sta; + ZXIC_UINT32 mec2_cop_key_mul_fifo_32x52_wrapper_overflow_flg_sta; + ZXIC_UINT32 mec2_cop_key_mul_fifo_32x52_wrapper_underflow_flg_sta; + ZXIC_UINT32 mec2_cop_key_random_mod_fifo_32x44_wrapper_overflow_flg_sta; + ZXIC_UINT32 mec2_cop_key_random_mod_fifo_32x44_wrapper_underflow_flg_sta; + ZXIC_UINT32 mec1_cop_key_crc_fifo_32x625_wrapper_overflow_flg_sta; + ZXIC_UINT32 mec1_cop_key_crc_fifo_32x625_wrapper_underflow_flg_sta; + ZXIC_UINT32 mec1_cop_key_checksum_fifo_32x180_wrapper_overflow_flg_sta; + ZXIC_UINT32 mec1_cop_key_checksum_fifo_32x180_wrapper_underflow_flg_sta; + ZXIC_UINT32 mec1_cop_key_mul_fifo_32x52_wrapper_overflow_flg_sta; + ZXIC_UINT32 mec1_cop_key_mul_fifo_32x52_wrapper_underflow_flg_sta; + ZXIC_UINT32 mec1_cop_key_random_mod_fifo_32x44_wrapper_overflow_flg_sta; + ZXIC_UINT32 mec1_cop_key_random_mod_fifo_32x44_wrapper_underflow_flg_sta; + ZXIC_UINT32 mec0_cop_key_crc_fifo_32x625_wrapper_overflow_flg_sta; + ZXIC_UINT32 mec0_cop_key_crc_fifo_32x625_wrapper_underflow_flg_sta; + ZXIC_UINT32 mec0_cop_key_checksum_fifo_32x180_wrapper_overflow_flg_sta; + ZXIC_UINT32 mec0_cop_key_checksum_fifo_32x180_wrapper_underflow_flg_sta; + ZXIC_UINT32 mec0_cop_key_mul_fifo_32x52_wrapper_overflow_flg_sta; + ZXIC_UINT32 mec0_cop_key_mul_fifo_32x52_wrapper_underflow_flg_sta; + ZXIC_UINT32 mec0_cop_key_random_mod_fifo_32x44_wrapper_overflow_flg_sta; + ZXIC_UINT32 mec0_cop_key_random_mod_fifo_32x44_wrapper_underflow_flg_sta; +}DPP_PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_STA_L_T; + +typedef struct dpp_ppu_ppu_coprocessor_fifo_interrupt_sta_m_t +{ + ZXIC_UINT32 ppu_cop_result_fwft_fifo_80x80_wrapper_overflow_sta; + ZXIC_UINT32 ppu_cop_result_fwft_fifo_80x80_wrapper_underflow_sta; + ZXIC_UINT32 ppu_cop_delay_fifo_48x16_wrapper_overflow_sta; + ZXIC_UINT32 ppu_cop_delay_fifo_48x16_wrapper_underflow_sta; + ZXIC_UINT32 ppu_cop_delay_fifo_16x48_wrapper_overflow_sta; + ZXIC_UINT32 ppu_cop_delay_fifo_16x48_wrapper_underflow_sta; + ZXIC_UINT32 ppu_cop_delay_fifo_16x32_wrapper_overflow_sta; + ZXIC_UINT32 ppu_cop_delay_fifo_16x32_wrapper_underflow_sta; + ZXIC_UINT32 ppu_cop_result_fwft_fifo_96x80_wrapper_overflow_sta; + ZXIC_UINT32 ppu_cop_result_fwft_fifo_96x80_wrapper_underflow_sta; + ZXIC_UINT32 ppu_cop_delay_fifo_16x16_wrapper_overflow_sta; + ZXIC_UINT32 ppu_cop_delay_fifo_16x16_wrapper_underflow_sta; + ZXIC_UINT32 ppu_cop_result_fwft_fifo_32x80_wrapper_overflow_sta; + ZXIC_UINT32 ppu_cop_result_fwft_fifo_32x80_wrapper_underflow_sta; + ZXIC_UINT32 ppu_cop_result_fwft_fifo_16x80_wrapper_overflow_sta; + ZXIC_UINT32 ppu_cop_result_fwft_fifo_16x80_wrapper_underflow_sta; + ZXIC_UINT32 mec5_cop_key_crc_fifo_32x625_wrapper_overflow_flg_sta; + ZXIC_UINT32 mec5_cop_key_crc_fifo_32x625_wrapper_underflow_flg_sta; + ZXIC_UINT32 mec5_cop_key_checksum_fifo_32x180_wrapper_overflow_flg_sta; + ZXIC_UINT32 mec5_cop_key_checksum_fifo_32x180_wrapper_underflow_flg_sta; + ZXIC_UINT32 mec5_cop_key_mul_fifo_32x52_wrapper_overflow_flg_sta; + ZXIC_UINT32 mec5_cop_key_mul_fifo_32x52_wrapper_underflow_flg_sta; + ZXIC_UINT32 mec5_cop_key_random_mod_fifo_32x44_wrapper_overflow_flg_sta; + ZXIC_UINT32 mec5_cop_key_random_mod_fifo_32x44_wrapper_underflow_flg_sta; + ZXIC_UINT32 mec4_cop_key_crc_fifo_32x625_wrapper_overflow_flg_sta; + ZXIC_UINT32 mec4_cop_key_crc_fifo_32x625_wrapper_underflow_flg_sta; + ZXIC_UINT32 mec4_cop_key_checksum_fifo_32x180_wrapper_overflow_flg_sta; + ZXIC_UINT32 mec4_cop_key_checksum_fifo_32x180_wrapper_underflow_flg_sta; + ZXIC_UINT32 mec4_cop_key_mul_fifo_32x52_wrapper_overflow_flg_sta; + ZXIC_UINT32 mec4_cop_key_mul_fifo_32x52_wrapper_underflow_flg_sta; + ZXIC_UINT32 mec4_cop_key_random_mod_fifo_32x44_wrapper_overflow_flg_sta; + ZXIC_UINT32 mec4_cop_key_random_mod_fifo_32x44_wrapper_underflow_flg_sta; +}DPP_PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_STA_M_T; + +typedef struct dpp_ppu_ppu_coprocessor_fifo_interrupt_sta_h_t +{ + ZXIC_UINT32 ppu_cop_random_mod_para_delay_fifo_48x16_wrapper_overflow_sta; + ZXIC_UINT32 ppu_cop_random_mod_para_delay_fifo_48x16_wrapper_underflow_sta; +}DPP_PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_STA_H_T; + +typedef struct dpp_ppu_ppu_instrmem_fifo_interrupt_sta_t +{ + ZXIC_UINT32 instrmem1_wr_fifo_ovf_sta; + ZXIC_UINT32 instrmem1_wr_fifo_udf_sta; + ZXIC_UINT32 instrmem1_rd_fifo_ovf_sta; + ZXIC_UINT32 instrmem1_rd_fifo_udf_sta; + ZXIC_UINT32 instrmem0_wr_fifo_ovf_sta; + ZXIC_UINT32 instrmem0_wr_fifo_udf_sta; + ZXIC_UINT32 instrmem0_rd_fifo_ovf_sta; + ZXIC_UINT32 instrmem0_rd_fifo_udf_sta; +}DPP_PPU_PPU_INSTRMEM_FIFO_INTERRUPT_STA_T; + +typedef struct dpp_ppu_ppu_ppu_ram_check_ecc_err_flag_1_t +{ + ZXIC_UINT32 ecc_single_err_sa_para_fifo_int_flag; + ZXIC_UINT32 ecc_double_err_sa_para_fifo_int_flag; + ZXIC_UINT32 ecc_single_err_dup_para_fifo_int_flag; + ZXIC_UINT32 ecc_double_err_dup_para_fifo_int_flag; + ZXIC_UINT32 ecc_single_err_pf_rsp_fifo_int_flag; + ZXIC_UINT32 ecc_double_err_pf_rsp_fifo_int_flag; + ZXIC_UINT32 ecc_single_err_pf_req_fifo_int_flag; + ZXIC_UINT32 ecc_double_err_pf_req_fifo_int_flag; + ZXIC_UINT32 ecc_single_err_ppu_reorder_link_ram0_int_flag; + ZXIC_UINT32 ecc_double_err_ppu_reorder_link_ram0_int_flag; + ZXIC_UINT32 ecc_single_err_ppu_reorder_link_ram1_int_flag; + ZXIC_UINT32 ecc_double_err_ppu_reorder_link_ram1_int_flag; + ZXIC_UINT32 ecc_single_err_ppu_reorder_link_flag_array_ram0_int_flag; + ZXIC_UINT32 ecc_single_err_ppu_reorder_link_flag_array_ram1_int_flag; + ZXIC_UINT32 ecc_single_err_ppu_reorder_ifb_ram_int_flag; + ZXIC_UINT32 ecc_double_err_ppu_reorder_ifb_ram_int_flag; + ZXIC_UINT32 ecc_single_err_ppu_reorder_flag_array_ram0_int_flag; + ZXIC_UINT32 ecc_single_err_ppu_reorder_flag_array_ram1_int_flag; + ZXIC_UINT32 ecc_single_err_ppu_reorder_flag_ram0_int_flag; + ZXIC_UINT32 ecc_single_err_ppu_reorder_flag_ram1_int_flag; + ZXIC_UINT32 ecc_single_err_uc_mf_fifo_int_flag; + ZXIC_UINT32 ecc_double_err_uc_mf_fifo_int_flag; + ZXIC_UINT32 ecc_single_err_mc_mf_fifo_int_flag; + ZXIC_UINT32 ecc_double_err_mc_mf_fifo_int_flag; + ZXIC_UINT32 ecc_single_err_free_global_num_fifo_int_flag; + ZXIC_UINT32 ecc_double_err_free_global_num_fifo_int_flag; +}DPP_PPU_PPU_PPU_RAM_CHECK_ECC_ERR_FLAG_1_T; + +typedef struct dpp_ppu_ppu_isu_ppu_demux_fifo_interrupt_flag_t +{ + ZXIC_UINT32 isu_in_para_fwft_fifo_32x81_wrapper_u0_overflow_flag; + ZXIC_UINT32 isu_in_para_fwft_fifo_32x81_wrapper_u0_underflow_flag; + ZXIC_UINT32 isu_in_fifo_64x81_wrapper_u0_overflow_flag; + ZXIC_UINT32 isu_in_fifo_64x81_wrapper_u0_underflow_flag; +}DPP_PPU_PPU_ISU_PPU_DEMUX_FIFO_INTERRUPT_FLAG_T; + +typedef struct dpp_ppu_ppu_ppu_multicast_fifo_interrupt_flag_t +{ + ZXIC_UINT32 ppu_pktrx_mc_ptr_fifo_16384x17_wrapper_u0_overflow_flag; + ZXIC_UINT32 ppu_pktrx_mc_ptr_fifo_16384x17_wrapper_u0_underflow_flag; + ZXIC_UINT32 pf_req_fwft_fifo_16x36_wrapper_u0_overflow_flag; + ZXIC_UINT32 pf_req_fwft_fifo_16x36_wrapper_u0_underflow_flag; + ZXIC_UINT32 pf_rsp_fwft_fifo_32x34_wrapper_u0_overflow_flag; + ZXIC_UINT32 pf_rsp_fwft_fifo_32x34_wrapper_u0_underflow_flag; + ZXIC_UINT32 dup_para_fwft_fifo_16x35_wrapper_u0_overflow_flag; + ZXIC_UINT32 dup_para_fwft_fifo_16x35_wrapper_u0_underflow_flag; + ZXIC_UINT32 se_mc_rsp_fwft_fifo_32x17_wrapper_u0_overflow_flag; + ZXIC_UINT32 se_mc_rsp_fwft_fifo_32x17_wrapper_u0_underflow_flag; + ZXIC_UINT32 sa_para_fwft_fifo_64x17_wrapper_u0_overflow_flag; + ZXIC_UINT32 sa_para_fwft_fifo_64x17_wrapper_u0_underflow_flag; + ZXIC_UINT32 group_id_fifo_64x16_wrapper_u0_overflow_flag; + ZXIC_UINT32 group_id_fifo_64x16_wrapper_u0_underflow_flag; + ZXIC_UINT32 isu_mc_para_fwft_fifo_128x34_wrapper_u0_overflow_flag; + ZXIC_UINT32 isu_mc_para_fwft_fifo_128x34_wrapper_u0_underflow_flag; + ZXIC_UINT32 dup_freeptr_fwft_fifo_128x7_wrapper_u0_overflow_flag; + ZXIC_UINT32 dup_freeptr_fwft_fifo_128x7_wrapper_u0_underflow_flag; + ZXIC_UINT32 car_flag_fifo_32x1_wrapper_overflow_flag; + ZXIC_UINT32 car_flag_fifo_32x1_wrapper_underflow_flag; +}DPP_PPU_PPU_PPU_MULTICAST_FIFO_INTERRUPT_FLAG_T; + +typedef struct dpp_ppu_ppu_ppu_in_schedule_fifo_interrupt_flag_t +{ + ZXIC_UINT32 free_global_num_fwft_fifo_8192x13_wrapper_u0_overflow_flag; + ZXIC_UINT32 free_global_num_fwft_fifo_8192x13_wrapper_u0_underflow_flag; + ZXIC_UINT32 mc_mf_fifo_16x2048_wrapper_u0_overflow_flag; + ZXIC_UINT32 mc_mf_fifo_16x2048_wrapper_u0_underflow_flag; + ZXIC_UINT32 uc_mf_fifo_96x2048_wrapper_u0_overflow_flag; + ZXIC_UINT32 uc_mf_fifo_96x2048_wrapper_u0_underflow_flag; +}DPP_PPU_PPU_PPU_IN_SCHEDULE_FIFO_INTERRUPT_FLAG_T; + +typedef struct dpp_ppu_ppu_ppu_mf_out_fifo_interrupt_flag_t +{ + ZXIC_UINT32 ppu_cluster5_mf_out_afifo_32x2048_wrapper_overflow_flag; + ZXIC_UINT32 ppu_cluster5_mf_out_afifo_32x2048_wrapper_underflow_flag; + ZXIC_UINT32 ppu_cluster4_mf_out_afifo_32x2048_wrapper_overflow_flag; + ZXIC_UINT32 ppu_cluster4_mf_out_afifo_32x2048_wrapper_underflow_flag; + ZXIC_UINT32 ppu_cluster3_mf_out_afifo_32x2048_wrapper_overflow_flag; + ZXIC_UINT32 ppu_cluster3_mf_out_afifo_32x2048_wrapper_underflow_flag; + ZXIC_UINT32 ppu_cluster2_mf_out_afifo_32x2048_wrapper_overflow_flag; + ZXIC_UINT32 ppu_cluster2_mf_out_afifo_32x2048_wrapper_underflow_flag; + ZXIC_UINT32 ppu_cluster1_mf_out_afifo_32x2048_wrapper_overflow_flag; + ZXIC_UINT32 ppu_cluster1_mf_out_afifo_32x2048_wrapper_underflow_flag; + ZXIC_UINT32 ppu_cluster0_mf_out_afifo_32x2048_wrapper_overflow_flag; + ZXIC_UINT32 ppu_cluster0_mf_out_afifo_32x2048_wrapper_underflow_flag; +}DPP_PPU_PPU_PPU_MF_OUT_FIFO_INTERRUPT_FLAG_T; + +typedef struct dpp_ppu_ppu_pbu_mcode_pf_req_schedule_fifo_interrupt_flag_t +{ + ZXIC_UINT32 ppu_cluster5_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_flag; + ZXIC_UINT32 ppu_cluster4_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_flag; + ZXIC_UINT32 ppu_cluster3_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_flag; + ZXIC_UINT32 ppu_cluster2_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_flag; + ZXIC_UINT32 ppu_cluster1_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_flag; + ZXIC_UINT32 ppu_cluster0_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_flag; + ZXIC_UINT32 ppu_cluster5_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_flag; + ZXIC_UINT32 ppu_cluster4_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_flag; + ZXIC_UINT32 ppu_cluster3_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_flag; + ZXIC_UINT32 ppu_cluster2_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_flag; + ZXIC_UINT32 ppu_cluster1_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_flag; + ZXIC_UINT32 ppu_cluster0_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_flag; +}DPP_PPU_PPU_PBU_MCODE_PF_REQ_SCHEDULE_FIFO_INTERRUPT_FLAG_T; + +typedef struct dpp_ppu_ppu_pbu_mcode_pf_rsp_schedule_fifo_interrupt_flag_t +{ + ZXIC_UINT32 ppu_pbu_mcode_pf_rsp_afifo_64x16_wrapper_u0r_underflow_flag; + ZXIC_UINT32 ppu_pbu_mcode_pf_rsp_afifo_64x16_wrapper_u0_overflow_flag; +}DPP_PPU_PPU_PBU_MCODE_PF_RSP_SCHEDULE_FIFO_INTERRUPT_FLAG_T; + +typedef struct dpp_ppu_ppu_ppu_mccnt_fifo_interrupt_flag_t +{ + ZXIC_UINT32 ppu_mccnt_fifo_32x15_wrapper_u0_overflow_flag; + ZXIC_UINT32 ppu_mccnt_fifo_32x15_wrapper_u0_underflow_flag; + ZXIC_UINT32 ppu_wb_data_fifo_32x2048_wrapper_u0_overflow_flag; + ZXIC_UINT32 ppu_wb_data_fifo_32x2048_wrapper_u0_underflow_flag; + ZXIC_UINT32 mccnt_rsp_fifo_32x1_wrapper_u0_overflow_flag; + ZXIC_UINT32 mccnt_rsp_fifo_32x1_wrapper_u0_underflow_flag; +}DPP_PPU_PPU_PPU_MCCNT_FIFO_INTERRUPT_FLAG_T; + +typedef struct dpp_ppu_ppu_coprocessor_fifo_interrupt_flag_l_t +{ + ZXIC_UINT32 mec3_cop_key_crc_fifo_32x625_wrapper_overflow_flag; + ZXIC_UINT32 mec3_cop_key_crc_fifo_32x625_wrapper_underflow_flag; + ZXIC_UINT32 mec3_cop_key_checksum_fifo_32x180_wrapper_overflow_flag; + ZXIC_UINT32 mec3_cop_key_checksum_fifo_32x180_wrapper_underflow_flag; + ZXIC_UINT32 mec3_cop_key_mul_fifo_32x52_wrapper_overflow_flag; + ZXIC_UINT32 mec3_cop_key_mul_fifo_32x52_wrapper_underflow_flag; + ZXIC_UINT32 mec3_cop_key_random_mod_fifo_32x44_wrapper_overflow_flag; + ZXIC_UINT32 mec3_cop_key_random_mod_fifo_32x44_wrapper_underflow_flag; + ZXIC_UINT32 mec2_cop_key_crc_fifo_32x625_wrapper_overflow_flag; + ZXIC_UINT32 mec2_cop_key_crc_fifo_32x625_wrapper_underflow_flag; + ZXIC_UINT32 mec2_cop_key_checksum_fifo_32x180_wrapper_overflow_flag; + ZXIC_UINT32 mec2_cop_key_checksum_fifo_32x180_wrapper_underflow_flag; + ZXIC_UINT32 mec2_cop_key_mul_fifo_32x52_wrapper_overflow_flag; + ZXIC_UINT32 mec2_cop_key_mul_fifo_32x52_wrapper_underflow_flag; + ZXIC_UINT32 mec2_cop_key_random_mod_fifo_32x44_wrapper_overflow_flag; + ZXIC_UINT32 mec2_cop_key_random_mod_fifo_32x44_wrapper_underflow_flag; + ZXIC_UINT32 mec1_cop_key_crc_fifo_32x625_wrapper_overflow_flag; + ZXIC_UINT32 mec1_cop_key_crc_fifo_32x625_wrapper_underflow_flag; + ZXIC_UINT32 mec1_cop_key_checksum_fifo_32x180_wrapper_overflow_flag; + ZXIC_UINT32 mec1_cop_key_checksum_fifo_32x180_wrapper_underflow_flag; + ZXIC_UINT32 mec1_cop_key_mul_fifo_32x52_wrapper_overflow_flag; + ZXIC_UINT32 mec1_cop_key_mul_fifo_32x52_wrapper_underflow_flag; + ZXIC_UINT32 mec1_cop_key_random_mod_fifo_32x44_wrapper_overflow_flag; + ZXIC_UINT32 mec1_cop_key_random_mod_fifo_32x44_wrapper_underflow_flag; + ZXIC_UINT32 mec0_cop_key_crc_fifo_32x625_wrapper_overflow_flag; + ZXIC_UINT32 mec0_cop_key_crc_fifo_32x625_wrapper_underflow_flag; + ZXIC_UINT32 mec0_cop_key_checksum_fifo_32x180_wrapper_overflow_flag; + ZXIC_UINT32 mec0_cop_key_checksum_fifo_32x180_wrapper_underflow_flag; + ZXIC_UINT32 mec0_cop_key_mul_fifo_32x52_wrapper_overflow_flag; + ZXIC_UINT32 mec0_cop_key_mul_fifo_32x52_wrapper_underflow_flag; + ZXIC_UINT32 mec0_cop_key_random_mod_fifo_32x44_wrapper_overflow_flag; + ZXIC_UINT32 mec0_cop_key_random_mod_fifo_32x44_wrapper_underflow_flag; +}DPP_PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_FLAG_L_T; + +typedef struct dpp_ppu_ppu_coprocessor_fifo_interrupt_flag_m_t +{ + ZXIC_UINT32 ppu_cop_result_fwft_fifo_80x80_wrapper_overflow_flag; + ZXIC_UINT32 ppu_cop_result_fwft_fifo_80x80_wrapper_underflow_flag; + ZXIC_UINT32 ppu_cop_delay_fifo_48x16_wrapper_overflow_flag; + ZXIC_UINT32 ppu_cop_delay_fifo_48x16_wrapper_underflow_flag; + ZXIC_UINT32 ppu_cop_delay_fifo_16x48_wrapper_overflow_flag; + ZXIC_UINT32 ppu_cop_delay_fifo_16x48_wrapper_underflow_flag; + ZXIC_UINT32 ppu_cop_delay_fifo_16x32_wrapper_overflow_flag; + ZXIC_UINT32 ppu_cop_delay_fifo_16x32_wrapper_underflow_flag; + ZXIC_UINT32 ppu_cop_result_fwft_fifo_96x80_wrapper_overflow_flag; + ZXIC_UINT32 ppu_cop_result_fwft_fifo_96x80_wrapper_underflow_flag; + ZXIC_UINT32 ppu_cop_delay_fifo_16x16_wrapper_overflow_flag; + ZXIC_UINT32 ppu_cop_delay_fifo_16x16_wrapper_underflow_flag; + ZXIC_UINT32 ppu_cop_result_fwft_fifo_32x80_wrapper_overflow_flag; + ZXIC_UINT32 ppu_cop_result_fwft_fifo_32x80_wrapper_underflow_flag; + ZXIC_UINT32 ppu_cop_result_fwft_fifo_16x80_wrapper_overflow_flag; + ZXIC_UINT32 ppu_cop_result_fwft_fifo_16x80_wrapper_underflow_flag; + ZXIC_UINT32 mec5_cop_key_crc_fifo_32x625_wrapper_overflow_flag; + ZXIC_UINT32 mec5_cop_key_crc_fifo_32x625_wrapper_underflow_flag; + ZXIC_UINT32 mec5_cop_key_checksum_fifo_32x180_wrapper_overflow_flag; + ZXIC_UINT32 mec5_cop_key_checksum_fifo_32x180_wrapper_underflow_flag; + ZXIC_UINT32 mec5_cop_key_mul_fifo_32x52_wrapper_overflow_flag; + ZXIC_UINT32 mec5_cop_key_mul_fifo_32x52_wrapper_underflow_flag; + ZXIC_UINT32 mec5_cop_key_random_mod_fifo_32x44_wrapper_overflow_flag; + ZXIC_UINT32 mec5_cop_key_random_mod_fifo_32x44_wrapper_underflow_flag; + ZXIC_UINT32 mec4_cop_key_crc_fifo_32x625_wrapper_overflow_flag; + ZXIC_UINT32 mec4_cop_key_crc_fifo_32x625_wrapper_underflow_flag; + ZXIC_UINT32 mec4_cop_key_checksum_fifo_32x180_wrapper_overflow_flag; + ZXIC_UINT32 mec4_cop_key_checksum_fifo_32x180_wrapper_underflow_flag; + ZXIC_UINT32 mec4_cop_key_mul_fifo_32x52_wrapper_overflow_flag; + ZXIC_UINT32 mec4_cop_key_mul_fifo_32x52_wrapper_underflow_flag; + ZXIC_UINT32 mec4_cop_key_random_mod_fifo_32x44_wrapper_overflow_flag; + ZXIC_UINT32 mec4_cop_key_random_mod_fifo_32x44_wrapper_underflow_flag; +}DPP_PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_FLAG_M_T; + +typedef struct dpp_ppu_ppu_coprocessor_fifo_interrupt_flag_h_t +{ + ZXIC_UINT32 ppu_cop_random_mod_para_delay_fifo_48x16_wrapper_overflow_flag; + ZXIC_UINT32 ppu_cop_random_mod_para_delay_fifo_48x16_wrapper_underflow_flag; +}DPP_PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_FLAG_H_T; + +typedef struct dpp_ppu_ppu_instrmem_fifo_interrupt_flag_t +{ + ZXIC_UINT32 instrmem2_wr_fifo_ovf_flag; + ZXIC_UINT32 instrmem2_wr_fifo_udf_flag; + ZXIC_UINT32 instrmem2_rd_fifo_ovf_flag; + ZXIC_UINT32 instrmem2_rd_fifo_udf_flag; + ZXIC_UINT32 instrmem1_wr_fifo_ovf_flag; + ZXIC_UINT32 instrmem1_wr_fifo_udf_flag; + ZXIC_UINT32 instrmem1_rd_fifo_ovf_flag; + ZXIC_UINT32 instrmem1_rd_fifo_udf_flag; + ZXIC_UINT32 instrmem0_wr_fifo_ovf_flag; + ZXIC_UINT32 instrmem0_wr_fifo_udf_flag; + ZXIC_UINT32 instrmem0_rd_fifo_ovf_flag; + ZXIC_UINT32 instrmem0_rd_fifo_udf_flag; +}DPP_PPU_PPU_INSTRMEM_FIFO_INTERRUPT_FLAG_T; + +typedef struct dpp_ppu_ppu_instrmem_ram_int_out_t +{ + ZXIC_UINT32 instrmem2_bank3_ram_parity_err_int_out; + ZXIC_UINT32 instrmem2_bank2_ram_parity_err_int_out; + ZXIC_UINT32 instrmem2_bank1_ram_parity_err_int_out; + ZXIC_UINT32 instrmem2_bank0_ram_parity_err_int_out; + ZXIC_UINT32 instrmem1_bank3_ram_parity_err_int_out; + ZXIC_UINT32 instrmem1_bank2_ram_parity_err_int_out; + ZXIC_UINT32 instrmem1_bank1_ram_parity_err_int_out; + ZXIC_UINT32 instrmem1_bank0_ram_parity_err_int_out; + ZXIC_UINT32 instrmem0_bank3_ram_parity_err_int_out; + ZXIC_UINT32 instrmem0_bank2_ram_parity_err_int_out; + ZXIC_UINT32 instrmem0_bank1_ram_parity_err_int_out; + ZXIC_UINT32 instrmem0_bank0_ram_parity_err_int_out; +}DPP_PPU_PPU_INSTRMEM_RAM_INT_OUT_T; + +typedef struct dpp_ppu_ppu_instrmem_ram_int_mask_t +{ + ZXIC_UINT32 instrmem2_bank3_ram_parity_err_mask; + ZXIC_UINT32 instrmem2_bank2_ram_parity_err_mask; + ZXIC_UINT32 instrmem2_bank1_ram_parity_err_mask; + ZXIC_UINT32 instrmem2_bank0_ram_parity_err_mask; + ZXIC_UINT32 instrmem1_bank3_ram_parity_err_mask; + ZXIC_UINT32 instrmem1_bank2_ram_parity_err_mask; + ZXIC_UINT32 instrmem1_bank1_ram_parity_err_mask; + ZXIC_UINT32 instrmem1_bank0_ram_parity_err_mask; + ZXIC_UINT32 instrmem0_bank3_ram_parity_err_mask; + ZXIC_UINT32 instrmem0_bank2_ram_parity_err_mask; + ZXIC_UINT32 instrmem0_bank1_ram_parity_err_mask; + ZXIC_UINT32 instrmem0_bank0_ram_parity_err_mask; +}DPP_PPU_PPU_INSTRMEM_RAM_INT_MASK_T; + +typedef struct dpp_ppu_ppu_instrmem_ram_int_stat_t +{ + ZXIC_UINT32 instrmem2_bank3_ram_parity_errstat; + ZXIC_UINT32 instrmem2_bank2_ram_parity_errstat; + ZXIC_UINT32 instrmem2_bank1_ram_parity_errstat; + ZXIC_UINT32 instrmem2_bank0_ram_parity_errstat; + ZXIC_UINT32 instrmem1_bank3_ram_parity_errstat; + ZXIC_UINT32 instrmem1_bank2_ram_parity_errstat; + ZXIC_UINT32 instrmem1_bank1_ram_parity_errstat; + ZXIC_UINT32 instrmem1_bank0_ram_parity_errstat; + ZXIC_UINT32 instrmem0_bank3_ram_parity_errstat; + ZXIC_UINT32 instrmem0_bank2_ram_parity_errstat; + ZXIC_UINT32 instrmem0_bank1_ram_parity_errstat; + ZXIC_UINT32 instrmem0_bank0_ram_parity_errstat; +}DPP_PPU_PPU_INSTRMEM_RAM_INT_STAT_T; + +typedef struct dpp_ppu_ppu_instrmem_ram_int_flag_t +{ + ZXIC_UINT32 instrmem2_bank3_ram_parity_err_flag; + ZXIC_UINT32 instrmem2_bank2_ram_parity_err_flag; + ZXIC_UINT32 instrmem2_bank1_ram_parity_err_flag; + ZXIC_UINT32 instrmem2_bank0_ram_parity_err_flag; + ZXIC_UINT32 instrmem1_bank3_ram_parity_err_flag; + ZXIC_UINT32 instrmem1_bank2_ram_parity_err_flag; + ZXIC_UINT32 instrmem1_bank1_ram_parity_err_flag; + ZXIC_UINT32 instrmem1_bank0_ram_parity_err_flag; + ZXIC_UINT32 instrmem0_bank3_ram_parity_err_flag; + ZXIC_UINT32 instrmem0_bank2_ram_parity_err_flag; + ZXIC_UINT32 instrmem0_bank1_ram_parity_err_flag; + ZXIC_UINT32 instrmem0_bank0_ram_parity_err_flag; +}DPP_PPU_PPU_INSTRMEM_RAM_INT_FLAG_T; + +typedef struct dpp_ppu_ppu_ppu_count_cfg_t +{ + ZXIC_UINT32 ppu_count_overflow_mode; + ZXIC_UINT32 ppu_count_rd_mode; +}DPP_PPU_PPU_PPU_COUNT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_statics_cfg_t +{ + ZXIC_UINT32 csr_statics_mc_type; + ZXIC_UINT32 csr_statics_bufnum; + ZXIC_UINT32 csr_statics_portnum1; + ZXIC_UINT32 csr_statics_portnum0; +}DPP_PPU_PPU_PPU_STATICS_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_statics_wb_cfg_t +{ + ZXIC_UINT32 csr_statics_wb_halt_send_type; + ZXIC_UINT32 csr_statics_wb_mf_type; + ZXIC_UINT32 csr_statics_wb_halt_continue_end; + ZXIC_UINT32 csr_statics_wb_dup_flag; + ZXIC_UINT32 csr_statics_wb_last_flag; + ZXIC_UINT32 csr_statics_wb_dis_flag; +}DPP_PPU_PPU_PPU_STATICS_WB_CFG_T; + +typedef struct dpp_ppu_ppu_wr_table_self_rsp_en_cfg_t +{ + ZXIC_UINT32 wr_table_self_rsp_en_cfg; +}DPP_PPU_PPU_WR_TABLE_SELF_RSP_EN_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_random_arbiter_8to1_cfg_t +{ + ZXIC_UINT32 ppu_random_arbiter_8to1_cfg; +}DPP_PPU_PPU_PPU_RANDOM_ARBITER_8TO1_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_reorder_bypass_flow_num_cfg_t +{ + ZXIC_UINT32 ppu_reorder_bypass_flow_num_cfg; +}DPP_PPU_PPU_PPU_REORDER_BYPASS_FLOW_NUM_CFG_T; + +typedef struct dpp_ppu_ppu_cos_meter_cfg_h_t +{ + ZXIC_UINT32 cbs; + ZXIC_UINT32 pbs; + ZXIC_UINT32 green_action; + ZXIC_UINT32 yellow_action; + ZXIC_UINT32 red_action; +}DPP_PPU_PPU_COS_METER_CFG_H_T; + +typedef struct dpp_ppu_ppu_cos_meter_cfg_l_t +{ + ZXIC_UINT32 cir; + ZXIC_UINT32 pir; + ZXIC_UINT32 car_en; +}DPP_PPU_PPU_COS_METER_CFG_L_T; + +typedef struct dpp_ppu_ppu_instrmem_rdy_t +{ + ZXIC_UINT32 instrmem_rdy; +}DPP_PPU_PPU_INSTRMEM_RDY_T; + +typedef struct dpp_ppu_ppu_instrmem_addr_t +{ + ZXIC_UINT32 instrmem_operate; + ZXIC_UINT32 instrmem_addr; +}DPP_PPU_PPU_INSTRMEM_ADDR_T; + +typedef struct dpp_ppu_ppu_instrmem_ind_access_done_t +{ + ZXIC_UINT32 instrmem_ind_access_done; +}DPP_PPU_PPU_INSTRMEM_IND_ACCESS_DONE_T; + +typedef struct dpp_ppu_ppu_instrmem_instr0_data_l_t +{ + ZXIC_UINT32 instrmem_instr0_data_l; +}DPP_PPU_PPU_INSTRMEM_INSTR0_DATA_L_T; + +typedef struct dpp_ppu_ppu_instrmem_instr0_data_h_t +{ + ZXIC_UINT32 instrmem_instr0_data_h; +}DPP_PPU_PPU_INSTRMEM_INSTR0_DATA_H_T; + +typedef struct dpp_ppu_ppu_instrmem_instr1_data_l_t +{ + ZXIC_UINT32 instrmem_instr1_data_l; +}DPP_PPU_PPU_INSTRMEM_INSTR1_DATA_L_T; + +typedef struct dpp_ppu_ppu_instrmem_instr1_data_h_t +{ + ZXIC_UINT32 instrmem_instr1_data_h; +}DPP_PPU_PPU_INSTRMEM_INSTR1_DATA_H_T; + +typedef struct dpp_ppu_ppu_instrmem_instr2_data_l_t +{ + ZXIC_UINT32 instrmem_instr2_data_l; +}DPP_PPU_PPU_INSTRMEM_INSTR2_DATA_L_T; + +typedef struct dpp_ppu_ppu_instrmem_instr2_data_h_t +{ + ZXIC_UINT32 instrmem_instr2_data_h; +}DPP_PPU_PPU_INSTRMEM_INSTR2_DATA_H_T; + +typedef struct dpp_ppu_ppu_instrmem_instr3_data_l_t +{ + ZXIC_UINT32 instrmem_instr3_data_l; +}DPP_PPU_PPU_INSTRMEM_INSTR3_DATA_L_T; + +typedef struct dpp_ppu_ppu_instrmem_instr3_data_h_t +{ + ZXIC_UINT32 instrmem_instr3_data_h; +}DPP_PPU_PPU_INSTRMEM_INSTR3_DATA_H_T; + +typedef struct dpp_ppu_ppu_instrmem_read_instr0_data_l_t +{ + ZXIC_UINT32 instrmem_read_instr0_data_l; +}DPP_PPU_PPU_INSTRMEM_READ_INSTR0_DATA_L_T; + +typedef struct dpp_ppu_ppu_instrmem_read_instr0_data_h_t +{ + ZXIC_UINT32 instrmem_read_instr0_data_h; +}DPP_PPU_PPU_INSTRMEM_READ_INSTR0_DATA_H_T; + +typedef struct dpp_ppu_ppu_instrmem_read_instr1_data_l_t +{ + ZXIC_UINT32 instrmem_read_instr1_data_l; +}DPP_PPU_PPU_INSTRMEM_READ_INSTR1_DATA_L_T; + +typedef struct dpp_ppu_ppu_instrmem_read_instr1_data_h_t +{ + ZXIC_UINT32 instrmem_read_instr1_data_h; +}DPP_PPU_PPU_INSTRMEM_READ_INSTR1_DATA_H_T; + +typedef struct dpp_ppu_ppu_instrmem_read_instr2_data_l_t +{ + ZXIC_UINT32 instrmem_read_instr2_data_l; +}DPP_PPU_PPU_INSTRMEM_READ_INSTR2_DATA_L_T; + +typedef struct dpp_ppu_ppu_instrmem_read_instr2_data_h_t +{ + ZXIC_UINT32 instrmem_read_instr2_data_h; +}DPP_PPU_PPU_INSTRMEM_READ_INSTR2_DATA_H_T; + +typedef struct dpp_ppu_ppu_instrmem_read_instr3_data_l_t +{ + ZXIC_UINT32 instrmem_read_instr3_data_l; +}DPP_PPU_PPU_INSTRMEM_READ_INSTR3_DATA_L_T; + +typedef struct dpp_ppu_ppu_instrmem_read_instr3_data_h_t +{ + ZXIC_UINT32 instrmem_read_instr3_data_h; +}DPP_PPU_PPU_INSTRMEM_READ_INSTR3_DATA_H_T; + +typedef struct dpp_ppu_ppu_se_ppu_mc_srh_fc_cnt_h_t +{ + ZXIC_UINT32 se_ppu_mc_srh_fc_cnt_h; +}DPP_PPU_PPU_SE_PPU_MC_SRH_FC_CNT_H_T; + +typedef struct dpp_ppu_ppu_se_ppu_mc_srh_fc_cnt_l_t +{ + ZXIC_UINT32 se_ppu_mc_srh_fc_cnt_l; +}DPP_PPU_PPU_SE_PPU_MC_SRH_FC_CNT_L_T; + +typedef struct dpp_ppu_ppu_ppu_se_mc_srh_fc_cnt_h_t +{ + ZXIC_UINT32 ppu_se_mc_srh_fc_cnt_h; +}DPP_PPU_PPU_PPU_SE_MC_SRH_FC_CNT_H_T; + +typedef struct dpp_ppu_ppu_ppu_se_mc_srh_fc_cnt_l_t +{ + ZXIC_UINT32 ppu_se_mc_srh_fc_cnt_l; +}DPP_PPU_PPU_PPU_SE_MC_SRH_FC_CNT_L_T; + +typedef struct dpp_ppu_ppu_ppu_se_mc_srh_vld_cnt_h_t +{ + ZXIC_UINT32 ppu_se_mc_srh_vld_cnt_h; +}DPP_PPU_PPU_PPU_SE_MC_SRH_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_ppu_se_mc_srh_vld_cnt_l_t +{ + ZXIC_UINT32 ppu_se_mc_srh_vld_cnt_l; +}DPP_PPU_PPU_PPU_SE_MC_SRH_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_se_ppu_mc_srh_vld_cnt_h_t +{ + ZXIC_UINT32 se_ppu_mc_srh_vld_cnt_h; +}DPP_PPU_PPU_SE_PPU_MC_SRH_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_se_ppu_mc_srh_vld_cnt_l_t +{ + ZXIC_UINT32 se_ppu_mc_srh_vld_cnt_l; +}DPP_PPU_PPU_SE_PPU_MC_SRH_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_pbu_ppu_logic_pf_fc_cnt_h_t +{ + ZXIC_UINT32 pbu_ppu_logic_pf_fc_cnt_h; +}DPP_PPU_PPU_PBU_PPU_LOGIC_PF_FC_CNT_H_T; + +typedef struct dpp_ppu_ppu_pbu_ppu_logic_pf_fc_cnt_l_t +{ + ZXIC_UINT32 pbu_ppu_logic_pf_fc_cnt_l; +}DPP_PPU_PPU_PBU_PPU_LOGIC_PF_FC_CNT_L_T; + +typedef struct dpp_ppu_ppu_ppu_pbu_logic_rsp_fc_cnt_h_t +{ + ZXIC_UINT32 ppu_pbu_logic_rsp_fc_cnt_h; +}DPP_PPU_PPU_PPU_PBU_LOGIC_RSP_FC_CNT_H_T; + +typedef struct dpp_ppu_ppu_ppu_pbu_logic_rsp_fc_cnt_l_t +{ + ZXIC_UINT32 ppu_pbu_logic_rsp_fc_cnt_l; +}DPP_PPU_PPU_PPU_PBU_LOGIC_RSP_FC_CNT_L_T; + +typedef struct dpp_ppu_ppu_ppu_pbu_logic_pf_req_vld_cnt_h_t +{ + ZXIC_UINT32 ppu_pbu_logic_pf_req_vld_cnt_h; +}DPP_PPU_PPU_PPU_PBU_LOGIC_PF_REQ_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_ppu_pbu_logic_pf_req_vld_cnt_l_t +{ + ZXIC_UINT32 ppu_pbu_logic_pf_req_vld_cnt_l; +}DPP_PPU_PPU_PPU_PBU_LOGIC_PF_REQ_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_pbu_ppu_logic_pf_rsp_vld_cnt_h_t +{ + ZXIC_UINT32 pbu_ppu_logic_pf_rsp_vld_cnt_h; +}DPP_PPU_PPU_PBU_PPU_LOGIC_PF_RSP_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_pbu_ppu_logic_pf_rsp_vld_cnt_l_t +{ + ZXIC_UINT32 pbu_ppu_logic_pf_rsp_vld_cnt_l; +}DPP_PPU_PPU_PBU_PPU_LOGIC_PF_RSP_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_pbu_ppu_ifb_rd_fc_cnt_h_t +{ + ZXIC_UINT32 pbu_ppu_ifb_rd_fc_cnt_h; +}DPP_PPU_PPU_PBU_PPU_IFB_RD_FC_CNT_H_T; + +typedef struct dpp_ppu_ppu_pbu_ppu_ifb_rd_fc_cnt_l_t +{ + ZXIC_UINT32 pbu_ppu_ifb_rd_fc_cnt_l; +}DPP_PPU_PPU_PBU_PPU_IFB_RD_FC_CNT_L_T; + +typedef struct dpp_ppu_ppu_pbu_ppu_wb_fc_cnt_h_t +{ + ZXIC_UINT32 pbu_ppu_wb_fc_cnt_h; +}DPP_PPU_PPU_PBU_PPU_WB_FC_CNT_H_T; + +typedef struct dpp_ppu_ppu_pbu_ppu_wb_fc_cnt_l_t +{ + ZXIC_UINT32 pbu_ppu_wb_fc_cnt_l; +}DPP_PPU_PPU_PBU_PPU_WB_FC_CNT_L_T; + +typedef struct dpp_ppu_ppu_ppu_pbu_mcode_pf_req_vld_cnt_h_t +{ + ZXIC_UINT32 ppu_pbu_mcode_pf_req_vld_cnt_h; +}DPP_PPU_PPU_PPU_PBU_MCODE_PF_REQ_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_ppu_pbu_mcode_pf_req_vld_cnt_l_t +{ + ZXIC_UINT32 ppu_pbu_mcode_pf_req_vld_cnt_l; +}DPP_PPU_PPU_PPU_PBU_MCODE_PF_REQ_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_pbu_ppu_mcode_pf_rsp_vld_cnt_h_t +{ + ZXIC_UINT32 pbu_ppu_mcode_pf_rsp_vld_cnt_h; +}DPP_PPU_PPU_PBU_PPU_MCODE_PF_RSP_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_pbu_ppu_mcode_pf_rsp_vld_cnt_l_t +{ + ZXIC_UINT32 pbu_ppu_mcode_pf_rsp_vld_cnt_l; +}DPP_PPU_PPU_PBU_PPU_MCODE_PF_RSP_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_odma_ppu_para_fc_cnt_h_t +{ + ZXIC_UINT32 odma_ppu_para_fc_cnt_h; +}DPP_PPU_PPU_ODMA_PPU_PARA_FC_CNT_H_T; + +typedef struct dpp_ppu_ppu_odma_ppu_para_fc_cnt_l_t +{ + ZXIC_UINT32 odma_ppu_para_fc_cnt_l; +}DPP_PPU_PPU_ODMA_PPU_PARA_FC_CNT_L_T; + +typedef struct dpp_ppu_ppu_odma_ppu_mccnt_wr_fc_cnt_h_t +{ + ZXIC_UINT32 odma_ppu_mccnt_wr_fc_cnt_h; +}DPP_PPU_PPU_ODMA_PPU_MCCNT_WR_FC_CNT_H_T; + +typedef struct dpp_ppu_ppu_odma_ppu_mccnt_wr_fc_cnt_l_t +{ + ZXIC_UINT32 odma_ppu_mccnt_wr_fc_cnt_l; +}DPP_PPU_PPU_ODMA_PPU_MCCNT_WR_FC_CNT_L_T; + +typedef struct dpp_ppu_ppu_ppu_odma_mccnt_wr_vld_cnt_h_t +{ + ZXIC_UINT32 ppu_odma_mccnt_wr_vld_cnt_h; +}DPP_PPU_PPU_PPU_ODMA_MCCNT_WR_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_ppu_odma_mccnt_wr_vld_cnt_l_t +{ + ZXIC_UINT32 ppu_odma_mccnt_wr_vld_cnt_l; +}DPP_PPU_PPU_PPU_ODMA_MCCNT_WR_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_odma_ppu_mccnt_rsp_vld_cnt_h_t +{ + ZXIC_UINT32 odma_ppu_mccnt_rsp_vld_cnt_h; +}DPP_PPU_PPU_ODMA_PPU_MCCNT_RSP_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_odma_ppu_mccnt_rsp_vld_cnt_l_t +{ + ZXIC_UINT32 odma_ppu_mccnt_rsp_vld_cnt_l; +}DPP_PPU_PPU_ODMA_PPU_MCCNT_RSP_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_ppu_pktrx_uc_fc_cnt_h_t +{ + ZXIC_UINT32 ppu_pktrx_uc_fc_cnt_h; +}DPP_PPU_PPU_PPU_PKTRX_UC_FC_CNT_H_T; + +typedef struct dpp_ppu_ppu_ppu_pktrx_uc_fc_cnt_l_t +{ + ZXIC_UINT32 ppu_pktrx_uc_fc_cnt_l; +}DPP_PPU_PPU_PPU_PKTRX_UC_FC_CNT_L_T; + +typedef struct dpp_ppu_ppu_ppu_pktrx_mc_fc_cnt_h_t +{ + ZXIC_UINT32 ppu_pktrx_mc_fc_cnt_h; +}DPP_PPU_PPU_PPU_PKTRX_MC_FC_CNT_H_T; + +typedef struct dpp_ppu_ppu_ppu_pktrx_mc_fc_cnt_l_t +{ + ZXIC_UINT32 ppu_pktrx_mc_fc_cnt_l; +}DPP_PPU_PPU_PPU_PKTRX_MC_FC_CNT_L_T; + +typedef struct dpp_ppu_ppu_pktrx_ppu_desc_vld_cnt_h_t +{ + ZXIC_UINT32 pktrx_ppu_desc_vld_cnt_h; +}DPP_PPU_PPU_PKTRX_PPU_DESC_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_pktrx_ppu_desc_vld_cnt_l_t +{ + ZXIC_UINT32 pktrx_ppu_desc_vld_cnt_l; +}DPP_PPU_PPU_PKTRX_PPU_DESC_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_ppu_pbu_ifb_req_vld_cnt_h_t +{ + ZXIC_UINT32 ppu_pbu_ifb_req_vld_cnt_h; +}DPP_PPU_PPU_PPU_PBU_IFB_REQ_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_ppu_pbu_ifb_req_vld_cnt_l_t +{ + ZXIC_UINT32 ppu_pbu_ifb_req_vld_cnt_l; +}DPP_PPU_PPU_PPU_PBU_IFB_REQ_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_pbu_ppu_ifb_rsp_vld_cnt_h_t +{ + ZXIC_UINT32 pbu_ppu_ifb_rsp_vld_cnt_h; +}DPP_PPU_PPU_PBU_PPU_IFB_RSP_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_pbu_ppu_ifb_rsp_vld_cnt_l_t +{ + ZXIC_UINT32 pbu_ppu_ifb_rsp_vld_cnt_l; +}DPP_PPU_PPU_PBU_PPU_IFB_RSP_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_ppu_pbu_wb_vld_cnt_h_t +{ + ZXIC_UINT32 ppu_pbu_wb_vld_cnt_h; +}DPP_PPU_PPU_PPU_PBU_WB_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_ppu_pbu_wb_vld_cnt_l_t +{ + ZXIC_UINT32 ppu_pbu_wb_vld_cnt_l; +}DPP_PPU_PPU_PPU_PBU_WB_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_pbu_ppu_reorder_para_vld_cnt_h_t +{ + ZXIC_UINT32 pbu_ppu_reorder_para_vld_cnt_h; +}DPP_PPU_PPU_PBU_PPU_REORDER_PARA_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_pbu_ppu_reorder_para_vld_cnt_l_t +{ + ZXIC_UINT32 pbu_ppu_reorder_para_vld_cnt_l; +}DPP_PPU_PPU_PBU_PPU_REORDER_PARA_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_ppu_odma_para_vld_cnt_h_t +{ + ZXIC_UINT32 ppu_odma_para_vld_cnt_h; +}DPP_PPU_PPU_PPU_ODMA_PARA_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_ppu_odma_para_vld_cnt_l_t +{ + ZXIC_UINT32 ppu_odma_para_vld_cnt_l; +}DPP_PPU_PPU_PPU_ODMA_PARA_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_statics_isu_ppu_mc_vld_cnt_h_t +{ + ZXIC_UINT32 statics_isu_ppu_mc_vld_cnt_h; +}DPP_PPU_PPU_STATICS_ISU_PPU_MC_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_statics_isu_ppu_mc_vld_cnt_l_t +{ + ZXIC_UINT32 statics_isu_ppu_mc_vld_cnt_l; +}DPP_PPU_PPU_STATICS_ISU_PPU_MC_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_statics_isu_ppu_mc_loop_vld_cnt_h_t +{ + ZXIC_UINT32 statics_isu_ppu_mc_loop_vld_cnt_h; +}DPP_PPU_PPU_STATICS_ISU_PPU_MC_LOOP_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_statics_isu_ppu_mc_loop_vld_cnt_l_t +{ + ZXIC_UINT32 statics_isu_ppu_mc_loop_vld_cnt_l; +}DPP_PPU_PPU_STATICS_ISU_PPU_MC_LOOP_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_statics_isu_ppu_uc_vld_cnt_h_t +{ + ZXIC_UINT32 statics_isu_ppu_uc_vld_cnt_h; +}DPP_PPU_PPU_STATICS_ISU_PPU_UC_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_statics_isu_ppu_uc_vld_cnt_l_t +{ + ZXIC_UINT32 statics_isu_ppu_uc_vld_cnt_l; +}DPP_PPU_PPU_STATICS_ISU_PPU_UC_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_statics_isu_ppu_uc_bufnumis0_vld_cnt_h_t +{ + ZXIC_UINT32 statics_isu_ppu_uc_bufnumis0_vld_cnt_h; +}DPP_PPU_PPU_STATICS_ISU_PPU_UC_BUFNUMIS0_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_statics_isu_ppu_uc_bufnumis0_vld_cnt_l_t +{ + ZXIC_UINT32 statics_isu_ppu_uc_bufnumis0_vld_cnt_l; +}DPP_PPU_PPU_STATICS_ISU_PPU_UC_BUFNUMIS0_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_statics_demux_schedule_mc_vld_cnt_h_t +{ + ZXIC_UINT32 statics_demux_schedule_mc_vld_cnt_h; +}DPP_PPU_PPU_STATICS_DEMUX_SCHEDULE_MC_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_statics_demux_schedule_mc_vld_cnt_l_t +{ + ZXIC_UINT32 statics_demux_schedule_mc_vld_cnt_l; +}DPP_PPU_PPU_STATICS_DEMUX_SCHEDULE_MC_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_statics_demux_schedule_mc_bufnumis0_vld_cnt_h_t +{ + ZXIC_UINT32 statics_demux_schedule_mc_bufnumis0_vld_cnt_h; +}DPP_PPU_PPU_STATICS_DEMUX_SCHEDULE_MC_BUFNUMIS0_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_statics_demux_schedule_mc_bufnumis0_vld_cnt_l_t +{ + ZXIC_UINT32 statics_demux_schedule_mc_bufnumis0_vld_cnt_l; +}DPP_PPU_PPU_STATICS_DEMUX_SCHEDULE_MC_BUFNUMIS0_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_statics_demux_schedule_mc_srcportis0_vld_cnt_h_t +{ + ZXIC_UINT32 statics_demux_schedule_mc_srcportis0_vld_cnt_h; +}DPP_PPU_PPU_STATICS_DEMUX_SCHEDULE_MC_SRCPORTIS0_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_statics_demux_schedule_mc_srcportis0_vld_cnt_l_t +{ + ZXIC_UINT32 statics_demux_schedule_mc_srcportis0_vld_cnt_l; +}DPP_PPU_PPU_STATICS_DEMUX_SCHEDULE_MC_SRCPORTIS0_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_statics_demux_schedule_mc_srcportis1_vld_cnt_h_t +{ + ZXIC_UINT32 statics_demux_schedule_mc_srcportis1_vld_cnt_h; +}DPP_PPU_PPU_STATICS_DEMUX_SCHEDULE_MC_SRCPORTIS1_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_statics_demux_schedule_mc_srcportis1_vld_cnt_l_t +{ + ZXIC_UINT32 statics_demux_schedule_mc_srcportis1_vld_cnt_l; +}DPP_PPU_PPU_STATICS_DEMUX_SCHEDULE_MC_SRCPORTIS1_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_statics_demux_schedule_uc_vld_cnt_h_t +{ + ZXIC_UINT32 statics_demux_schedule_uc_vld_cnt_h; +}DPP_PPU_PPU_STATICS_DEMUX_SCHEDULE_UC_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_statics_demux_schedule_uc_vld_cnt_l_t +{ + ZXIC_UINT32 statics_demux_schedule_uc_vld_cnt_l; +}DPP_PPU_PPU_STATICS_DEMUX_SCHEDULE_UC_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_statics_demux_schedule_uc_bufnumis0_vld_cnt_h_t +{ + ZXIC_UINT32 statics_demux_schedule_uc_bufnumis0_vld_cnt_h; +}DPP_PPU_PPU_STATICS_DEMUX_SCHEDULE_UC_BUFNUMIS0_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_statics_demux_schedule_uc_bufnumis0_vld_cnt_l_t +{ + ZXIC_UINT32 statics_demux_schedule_uc_bufnumis0_vld_cnt_l; +}DPP_PPU_PPU_STATICS_DEMUX_SCHEDULE_UC_BUFNUMIS0_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_statics_demux_schedule_uc_srcportis0_vld_cnt_h_t +{ + ZXIC_UINT32 statics_demux_schedule_uc_srcportis0_vld_cnt_h; +}DPP_PPU_PPU_STATICS_DEMUX_SCHEDULE_UC_SRCPORTIS0_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_statics_demux_schedule_uc_srcportis0_vld_cnt_l_t +{ + ZXIC_UINT32 statics_demux_schedule_uc_srcportis0_vld_cnt_l; +}DPP_PPU_PPU_STATICS_DEMUX_SCHEDULE_UC_SRCPORTIS0_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_statics_demux_schedule_uc_srcportis1_vld_cnt_h_t +{ + ZXIC_UINT32 statics_demux_schedule_uc_srcportis1_vld_cnt_h; +}DPP_PPU_PPU_STATICS_DEMUX_SCHEDULE_UC_SRCPORTIS1_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_statics_demux_schedule_uc_srcportis1_vld_cnt_l_t +{ + ZXIC_UINT32 statics_demux_schedule_uc_srcportis1_vld_cnt_l; +}DPP_PPU_PPU_STATICS_DEMUX_SCHEDULE_UC_SRCPORTIS1_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_statics_ppu_wb_vld_cnt_h_t +{ + ZXIC_UINT32 statics_ppu_wb_vld_cnt_h; +}DPP_PPU_PPU_STATICS_PPU_WB_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_statics_ppu_wb_vld_cnt_l_t +{ + ZXIC_UINT32 statics_ppu_wb_vld_cnt_l; +}DPP_PPU_PPU_STATICS_PPU_WB_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_statics_ppu_wb_bufnumis0_vld_cnt_h_t +{ + ZXIC_UINT32 statics_ppu_wb_bufnumis0_vld_cnt_h; +}DPP_PPU_PPU_STATICS_PPU_WB_BUFNUMIS0_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_statics_ppu_wb_bufnumis0_vld_cnt_l_t +{ + ZXIC_UINT32 statics_ppu_wb_bufnumis0_vld_cnt_l; +}DPP_PPU_PPU_STATICS_PPU_WB_BUFNUMIS0_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_statics_ppu_wb_srcportis0_vld_cnt_h_t +{ + ZXIC_UINT32 statics_ppu_wb_srcportis0_vld_cnt_h; +}DPP_PPU_PPU_STATICS_PPU_WB_SRCPORTIS0_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_statics_ppu_wb_srcportis0_vld_cnt_l_t +{ + ZXIC_UINT32 statics_ppu_wb_srcportis0_vld_cnt_l; +}DPP_PPU_PPU_STATICS_PPU_WB_SRCPORTIS0_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_statics_ppu_wb_srcportis1_vld_cnt_h_t +{ + ZXIC_UINT32 statics_ppu_wb_srcportis1_vld_cnt_h; +}DPP_PPU_PPU_STATICS_PPU_WB_SRCPORTIS1_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_statics_ppu_wb_srcportis1_vld_cnt_l_t +{ + ZXIC_UINT32 statics_ppu_wb_srcportis1_vld_cnt_l; +}DPP_PPU_PPU_STATICS_PPU_WB_SRCPORTIS1_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_statics_ppu_wb_halt_send_type_vld_cnt_h_t +{ + ZXIC_UINT32 statics_ppu_wb_halt_send_type_vld_cnt_h; +}DPP_PPU_PPU_STATICS_PPU_WB_HALT_SEND_TYPE_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_statics_ppu_wb_halt_send_type_vld_cnt_l_t +{ + ZXIC_UINT32 statics_ppu_wb_halt_send_type_vld_cnt_l; +}DPP_PPU_PPU_STATICS_PPU_WB_HALT_SEND_TYPE_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_statics_ppu_wb_mf_type_vld_cnt_h_t +{ + ZXIC_UINT32 statics_ppu_wb_mf_type_vld_cnt_h; +}DPP_PPU_PPU_STATICS_PPU_WB_MF_TYPE_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_statics_ppu_wb_mf_type_vld_cnt_l_t +{ + ZXIC_UINT32 statics_ppu_wb_mf_type_vld_cnt_l; +}DPP_PPU_PPU_STATICS_PPU_WB_MF_TYPE_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_statics_ppu_wb_halt_continue_end_vld_cnt_h_t +{ + ZXIC_UINT32 statics_ppu_wb_halt_continue_end_vld_cnt_h; +}DPP_PPU_PPU_STATICS_PPU_WB_HALT_CONTINUE_END_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_statics_ppu_wb_halt_continue_end_vld_cnt_l_t +{ + ZXIC_UINT32 statics_ppu_wb_halt_continue_end_vld_cnt_l; +}DPP_PPU_PPU_STATICS_PPU_WB_HALT_CONTINUE_END_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_statics_ppu_wb_dup_flag_vld_cnt_h_t +{ + ZXIC_UINT32 statics_ppu_wb_dup_flag_vld_cnt_h; +}DPP_PPU_PPU_STATICS_PPU_WB_DUP_FLAG_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_statics_ppu_wb_dup_flag_vld_cnt_l_t +{ + ZXIC_UINT32 statics_ppu_wb_dup_flag_vld_cnt_l; +}DPP_PPU_PPU_STATICS_PPU_WB_DUP_FLAG_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_statics_ppu_wb_last_flag_vld_cnt_h_t +{ + ZXIC_UINT32 statics_ppu_wb_last_flag_vld_cnt_h; +}DPP_PPU_PPU_STATICS_PPU_WB_LAST_FLAG_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_statics_ppu_wb_last_flag_vld_cnt_l_t +{ + ZXIC_UINT32 statics_ppu_wb_last_flag_vld_cnt_l; +}DPP_PPU_PPU_STATICS_PPU_WB_LAST_FLAG_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_statics_ppu_wb_dis_flag_vld_cnt_h_t +{ + ZXIC_UINT32 statics_ppu_wb_dis_flag_vld_cnt_h; +}DPP_PPU_PPU_STATICS_PPU_WB_DIS_FLAG_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_statics_ppu_wb_dis_flag_vld_cnt_l_t +{ + ZXIC_UINT32 statics_ppu_wb_dis_flag_vld_cnt_l; +}DPP_PPU_PPU_STATICS_PPU_WB_DIS_FLAG_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_statics_pbu_ppu_reorder_halt_send_type_vld_cnt_h_t +{ + ZXIC_UINT32 statics_pbu_ppu_reorder_halt_send_type_vld_cnt_h; +}DPP_PPU_PPU_STATICS_PBU_PPU_REORDER_HALT_SEND_TYPE_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_statics_pbu_ppu_reorder_halt_send_type_vld_cnt_l_t +{ + ZXIC_UINT32 statics_pbu_ppu_reorder_halt_send_type_vld_cnt_l; +}DPP_PPU_PPU_STATICS_PBU_PPU_REORDER_HALT_SEND_TYPE_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_statics_pbu_ppu_reorder_mf_type_vld_cnt_h_t +{ + ZXIC_UINT32 statics_pbu_ppu_reorder_mf_type_vld_cnt_h; +}DPP_PPU_PPU_STATICS_PBU_PPU_REORDER_MF_TYPE_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_statics_pbu_ppu_reorder_mf_type_vld_cnt_l_t +{ + ZXIC_UINT32 statics_pbu_ppu_reorder_mf_type_vld_cnt_l; +}DPP_PPU_PPU_STATICS_PBU_PPU_REORDER_MF_TYPE_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_statics_pbu_ppu_reorder_halt_continue_end_vld_cnt_h_t +{ + ZXIC_UINT32 statics_pbu_ppu_reorder_halt_continue_end_vld_cnt_h; +}DPP_PPU_PPU_STATICS_PBU_PPU_REORDER_HALT_CONTINUE_END_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_statics_pbu_ppu_reorder_halt_continue_end_vld_cnt_l_t +{ + ZXIC_UINT32 statics_pbu_ppu_reorder_halt_continue_end_vld_cnt_l; +}DPP_PPU_PPU_STATICS_PBU_PPU_REORDER_HALT_CONTINUE_END_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_car_green_pkt_vld_cnt_h_t +{ + ZXIC_UINT32 car_green_pkt_vld_cnt_h; +}DPP_PPU_PPU_CAR_GREEN_PKT_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_car_green_pkt_vld_cnt_l_t +{ + ZXIC_UINT32 car_green_pkt_vld_cnt_l; +}DPP_PPU_PPU_CAR_GREEN_PKT_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_car_yellow_pkt_vld_cnt_h_t +{ + ZXIC_UINT32 car_yellow_pkt_vld_cnt_h; +}DPP_PPU_PPU_CAR_YELLOW_PKT_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_car_yellow_pkt_vld_cnt_l_t +{ + ZXIC_UINT32 car_yellow_pkt_vld_cnt_l; +}DPP_PPU_PPU_CAR_YELLOW_PKT_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_car_red_pkt_vld_cnt_h_t +{ + ZXIC_UINT32 car_red_pkt_vld_cnt_h; +}DPP_PPU_PPU_CAR_RED_PKT_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_car_red_pkt_vld_cnt_l_t +{ + ZXIC_UINT32 car_red_pkt_vld_cnt_l; +}DPP_PPU_PPU_CAR_RED_PKT_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_car_drop_pkt_vld_cnt_h_t +{ + ZXIC_UINT32 car_drop_pkt_vld_cnt_h; +}DPP_PPU_PPU_CAR_DROP_PKT_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_car_drop_pkt_vld_cnt_l_t +{ + ZXIC_UINT32 car_drop_pkt_vld_cnt_l; +}DPP_PPU_PPU_CAR_DROP_PKT_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_ppu_pktrx_mc_ptr_vld_cnt_h_t +{ + ZXIC_UINT32 ppu_pktrx_mc_ptr_vld_cnt_h; +}DPP_PPU_PPU_PPU_PKTRX_MC_PTR_VLD_CNT_H_T; + +typedef struct dpp_ppu_ppu_ppu_pktrx_mc_ptr_vld_cnt_l_t +{ + ZXIC_UINT32 ppu_pktrx_mc_ptr_vld_cnt_l; +}DPP_PPU_PPU_PPU_PKTRX_MC_PTR_VLD_CNT_L_T; + +typedef struct dpp_ppu_ppu_isu_ppu_loopback_fc_cnt_h_t +{ + ZXIC_UINT32 ppu_pktrx_mc_ptr_vld_cnt_h; +}DPP_PPU_PPU_ISU_PPU_LOOPBACK_FC_CNT_H_T; + +typedef struct dpp_ppu_ppu_isu_ppu_loopback_fc_cnt_l_t +{ + ZXIC_UINT32 ppu_pktrx_mc_ptr_vld_cnt_l; +}DPP_PPU_PPU_ISU_PPU_LOOPBACK_FC_CNT_L_T; + +typedef struct dpp_ppu_ppu_ppu_culster_pbu_mcode_pf_req_prog_full_assert_cfg_t +{ + ZXIC_UINT32 ppu_culster_pbu_mcode_pf_req_prog_full_assert_cfg; +}DPP_PPU_PPU_PPU_CULSTER_PBU_MCODE_PF_REQ_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_culster_pbu_mcode_pf_req_prog_full_negate_cfg_t +{ + ZXIC_UINT32 ppu_culster_pbu_mcode_pf_req_prog_full_negate_cfg; +}DPP_PPU_PPU_PPU_CULSTER_PBU_MCODE_PF_REQ_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_culster_pbu_mcode_pf_req_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 ppu_culster_pbu_mcode_pf_req_prog_empty_assert_cfg; +}DPP_PPU_PPU_PPU_CULSTER_PBU_MCODE_PF_REQ_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_culster_pbu_mcode_pf_req_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 ppu_culster_pbu_mcode_pf_req_prog_empty_negate_cfg; +}DPP_PPU_PPU_PPU_CULSTER_PBU_MCODE_PF_REQ_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_pbu_mcode_pf_rsp_prog_full_assert_cfg_t +{ + ZXIC_UINT32 ppu_pbu_mcode_pf_rsp_prog_full_assert_cfg; +}DPP_PPU_PPU_PPU_PBU_MCODE_PF_RSP_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_pbu_mcode_pf_rsp_prog_full_negate_cfg_t +{ + ZXIC_UINT32 ppu_pbu_mcode_pf_rsp_prog_full_negate_cfg; +}DPP_PPU_PPU_PPU_PBU_MCODE_PF_RSP_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_pbu_mcode_pf_rsp_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 ppu_pbu_mcode_pf_rsp_prog_empty_assert_cfg; +}DPP_PPU_PPU_PPU_PBU_MCODE_PF_RSP_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_pbu_mcode_pf_rsp_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 ppu_pbu_mcode_pf_rsp_prog_empty_negate_cfg; +}DPP_PPU_PPU_PPU_PBU_MCODE_PF_RSP_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_mccnt_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 mccnt_fifo_prog_full_assert_cfg; +}DPP_PPU_PPU_MCCNT_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_mccnt_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 mccnt_fifo_prog_full_negate_cfg; +}DPP_PPU_PPU_MCCNT_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_mccnt_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 mccnt_fifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_MCCNT_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_mccnt_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 mccnt_fifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_MCCNT_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_uc_mf_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 uc_mf_fifo_prog_full_assert_cfg; +}DPP_PPU_PPU_UC_MF_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_uc_mf_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 uc_mf_fifo_prog_full_negate_cfg; +}DPP_PPU_PPU_UC_MF_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_uc_mf_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 uc_mf_fifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_UC_MF_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_uc_mf_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 uc_mf_fifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_UC_MF_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_mc_mf_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 mc_mf_fifo_prog_full_assert_cfg; +}DPP_PPU_PPU_MC_MF_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_mc_mf_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 mc_mf_fifo_prog_full_negate_cfg; +}DPP_PPU_PPU_MC_MF_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_mc_mf_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 mc_mf_fifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_MC_MF_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_mc_mf_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 mc_mf_fifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_MC_MF_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_isu_mf_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 isu_mf_fifo_prog_full_assert_cfg; +}DPP_PPU_PPU_ISU_MF_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_isu_mf_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 isu_mf_fifo_prog_full_negate_cfg; +}DPP_PPU_PPU_ISU_MF_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_isu_mf_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 isu_mf_fifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_ISU_MF_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_isu_mf_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 isu_mf_fifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_ISU_MF_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_isu_fwft_mf_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 isu_fwft_mf_fifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_ISU_FWFT_MF_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_isu_fwft_mf_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 isu_fwft_mf_fifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_ISU_FWFT_MF_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_isu_mc_para_mf_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 isu_mc_para_mf_fifo_prog_full_assert_cfg; +}DPP_PPU_PPU_ISU_MC_PARA_MF_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_isu_mc_para_mf_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 isu_mc_para_mf_fifo_prog_full_negate_cfg; +}DPP_PPU_PPU_ISU_MC_PARA_MF_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_isu_mc_para_mf_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 isu_mc_para_mf_fifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_ISU_MC_PARA_MF_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_isu_mc_para_mf_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 isu_mc_para_mf_fifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_ISU_MC_PARA_MF_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_group_id_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 group_id_fifo_prog_full_assert_cfg; +}DPP_PPU_PPU_GROUP_ID_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_group_id_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 group_id_fifo_prog_full_negate_cfg; +}DPP_PPU_PPU_GROUP_ID_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_group_id_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 group_id_fifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_GROUP_ID_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_group_id_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 group_id_fifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_GROUP_ID_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_sa_para_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 sa_para_fifo_prog_full_assert_cfg; +}DPP_PPU_PPU_SA_PARA_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_sa_para_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 sa_para_fifo_prog_full_negate_cfg; +}DPP_PPU_PPU_SA_PARA_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_sa_para_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 sa_para_fifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_SA_PARA_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_sa_para_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 sa_para_fifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_SA_PARA_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_se_mc_rsp_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 se_mc_rsp_fifo_prog_full_assert_cfg; +}DPP_PPU_PPU_SE_MC_RSP_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_se_mc_rsp_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 se_mc_rsp_fifo_prog_full_negate_cfg; +}DPP_PPU_PPU_SE_MC_RSP_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_se_mc_rsp_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 se_mc_rsp_fifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_SE_MC_RSP_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_se_mc_rsp_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 se_mc_rsp_fifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_SE_MC_RSP_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_dup_para_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 dup_para_fifo_prog_full_assert_cfg; +}DPP_PPU_PPU_DUP_PARA_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_dup_para_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 dup_para_fifo_prog_full_negate_cfg; +}DPP_PPU_PPU_DUP_PARA_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_dup_para_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 dup_para_fifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_DUP_PARA_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_dup_para_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 dup_para_fifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_DUP_PARA_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_pf_rsp_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 pf_rsp_fifo_prog_full_assert_cfg; +}DPP_PPU_PPU_PF_RSP_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_pf_rsp_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 pf_rsp_fifo_prog_full_negate_cfg; +}DPP_PPU_PPU_PF_RSP_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_pf_rsp_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 pf_rsp_fifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_PF_RSP_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_pf_rsp_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 pf_rsp_fifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_PF_RSP_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_dup_freeptr_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 dup_freeptr_fifo_prog_full_assert_cfg; +}DPP_PPU_PPU_DUP_FREEPTR_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_dup_freeptr_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 dup_freeptr_fifo_prog_full_negate_cfg; +}DPP_PPU_PPU_DUP_FREEPTR_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_dup_freeptr_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 dup_freeptr_fifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_DUP_FREEPTR_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_dup_freeptr_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 dup_freeptr_fifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_DUP_FREEPTR_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_pf_req_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 pf_req_fifo_prog_full_assert_cfg; +}DPP_PPU_PPU_PF_REQ_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_pf_req_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 pf_req_fifo_prog_full_negate_cfg; +}DPP_PPU_PPU_PF_REQ_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_pf_req_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 pf_req_fifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_PF_REQ_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_pf_req_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 pf_req_fifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_PF_REQ_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_car_flag_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 car_flag_fifo_prog_full_assert_cfg; +}DPP_PPU_PPU_CAR_FLAG_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_car_flag_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 car_flag_fifo_prog_full_negate_cfg; +}DPP_PPU_PPU_CAR_FLAG_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_car_flag_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 car_flag_fifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_CAR_FLAG_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_car_flag_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 car_flag_fifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_CAR_FLAG_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cluster_mf_out_afifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 ppu_cluster_mf_out_afifo_prog_full_assert_cfg; +}DPP_PPU_PPU_PPU_CLUSTER_MF_OUT_AFIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cluster_mf_out_afifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 ppu_cluster_mf_out_afifo_prog_full_negate_cfg; +}DPP_PPU_PPU_PPU_CLUSTER_MF_OUT_AFIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cluster_mf_out_afifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 ppu_cluster_mf_out_afifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_PPU_CLUSTER_MF_OUT_AFIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cluster_mf_out_afifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 ppu_cluster_mf_out_afifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_PPU_CLUSTER_MF_OUT_AFIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_key_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 ppu_cop_key_fifo_prog_full_assert_cfg; +}DPP_PPU_PPU_PPU_COP_KEY_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_key_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 ppu_cop_key_fifo_prog_full_negate_cfg; +}DPP_PPU_PPU_PPU_COP_KEY_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_key_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 ppu_cop_key_fifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_PPU_COP_KEY_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_key_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 ppu_cop_key_fifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_PPU_COP_KEY_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_random_mod_para_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 ppu_cop_random_mod_para_fifo_prog_full_assert_cfg; +}DPP_PPU_PPU_PPU_COP_RANDOM_MOD_PARA_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_random_mod_para_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 ppu_cop_random_mod_para_fifo_prog_full_negate_cfg; +}DPP_PPU_PPU_PPU_COP_RANDOM_MOD_PARA_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_random_mod_para_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 ppu_cop_random_mod_para_fifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_PPU_COP_RANDOM_MOD_PARA_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_random_mod_para_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 ppu_cop_random_mod_para_fifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_PPU_COP_RANDOM_MOD_PARA_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_random_mod_result_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 ppu_cop_random_mod_result_fifo_prog_full_assert_cfg; +}DPP_PPU_PPU_PPU_COP_RANDOM_MOD_RESULT_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_random_mod_result_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 ppu_cop_random_mod_result_fifo_prog_full_negate_cfg; +}DPP_PPU_PPU_PPU_COP_RANDOM_MOD_RESULT_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_random_mod_result_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 ppu_cop_random_mod_result_fifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_PPU_COP_RANDOM_MOD_RESULT_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_random_mod_result_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 ppu_cop_random_mod_result_fifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_PPU_COP_RANDOM_MOD_RESULT_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_checksum_result_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 ppu_cop_checksum_result_fifo_prog_full_assert_cfg; +}DPP_PPU_PPU_PPU_COP_CHECKSUM_RESULT_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_checksum_result_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 ppu_cop_checksum_result_fifo_prog_full_negate_cfg; +}DPP_PPU_PPU_PPU_COP_CHECKSUM_RESULT_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_checksum_result_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 ppu_cop_checksum_result_fifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_PPU_COP_CHECKSUM_RESULT_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_checksum_result_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 ppu_cop_checksum_result_fifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_PPU_COP_CHECKSUM_RESULT_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_crc_first_para_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 ppu_cop_crc_first_para_fifo_prog_full_assert_cfg; +}DPP_PPU_PPU_PPU_COP_CRC_FIRST_PARA_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_crc_first_para_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 ppu_cop_crc_first_para_fifo_prog_full_negate_cfg; +}DPP_PPU_PPU_PPU_COP_CRC_FIRST_PARA_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_crc_first_para_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 ppu_cop_crc_first_para_fifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_PPU_COP_CRC_FIRST_PARA_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_crc_first_para_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 ppu_cop_crc_first_para_fifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_PPU_COP_CRC_FIRST_PARA_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_crc_bypass_delay_prog_full_assert_cfg_t +{ + ZXIC_UINT32 ppu_cop_crc_bypass_delay_prog_full_assert_cfg; +}DPP_PPU_PPU_PPU_COP_CRC_BYPASS_DELAY_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_crc_bypass_delay_prog_full_negate_cfg_t +{ + ZXIC_UINT32 ppu_cop_crc_bypass_delay_prog_full_negate_cfg; +}DPP_PPU_PPU_PPU_COP_CRC_BYPASS_DELAY_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_crc_bypass_delay_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 ppu_cop_crc_bypass_delay_prog_empty_assert_cfg; +}DPP_PPU_PPU_PPU_COP_CRC_BYPASS_DELAY_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_crc_bypass_delay_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 ppu_cop_crc_bypass_delay_prog_empty_negate_cfg; +}DPP_PPU_PPU_PPU_COP_CRC_BYPASS_DELAY_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_crc_second_para_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 ppu_cop_crc_second_para_fifo_prog_full_assert_cfg; +}DPP_PPU_PPU_PPU_COP_CRC_SECOND_PARA_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_crc_second_para_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 ppu_cop_crc_second_para_fifo_prog_full_negate_cfg; +}DPP_PPU_PPU_PPU_COP_CRC_SECOND_PARA_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_crc_second_para_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 ppu_cop_crc_second_para_fifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_PPU_COP_CRC_SECOND_PARA_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_crc_second_para_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 ppu_cop_crc_second_para_fifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_PPU_COP_CRC_SECOND_PARA_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_crc_result_fwft_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 ppu_cop_crc_result_fwft_fifo_prog_full_assert_cfg; +}DPP_PPU_PPU_PPU_COP_CRC_RESULT_FWFT_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_crc_result_fwft_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 ppu_cop_crc_result_fwft_fifo_prog_full_negate_cfg; +}DPP_PPU_PPU_PPU_COP_CRC_RESULT_FWFT_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_crc_result_fwft_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 ppu_cop_crc_result_fwft_fifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_PPU_COP_CRC_RESULT_FWFT_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_crc_result_fwft_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 ppu_cop_crc_result_fwft_fifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_PPU_COP_CRC_RESULT_FWFT_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_multiply_para_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 ppu_cop_multiply_para_fifo_prog_full_assert_cfg; +}DPP_PPU_PPU_PPU_COP_MULTIPLY_PARA_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_multiply_para_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 ppu_cop_multiply_para_fifo_prog_full_negate_cfg; +}DPP_PPU_PPU_PPU_COP_MULTIPLY_PARA_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_multiply_para_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 ppu_cop_multiply_para_fifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_PPU_COP_MULTIPLY_PARA_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_multiply_para_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 ppu_cop_multiply_para_fifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_PPU_COP_MULTIPLY_PARA_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_multiply_para_result_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 ppu_cop_multiply_para_result_fifo_prog_full_assert_cfg; +}DPP_PPU_PPU_PPU_COP_MULTIPLY_PARA_RESULT_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_multiply_para_result_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 ppu_cop_multiply_para_result_fifo_prog_full_negate_cfg; +}DPP_PPU_PPU_PPU_COP_MULTIPLY_PARA_RESULT_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_multiply_para_result_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 ppu_cop_multiply_para_result_fifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_PPU_COP_MULTIPLY_PARA_RESULT_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_cop_multiply_para_result_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 ppu_cop_multiply_para_result_fifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_PPU_COP_MULTIPLY_PARA_RESULT_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_free_global_num_fwft_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 free_global_num_fwft_fifo_prog_full_assert_cfg; +}DPP_PPU_PPU_FREE_GLOBAL_NUM_FWFT_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_free_global_num_fwft_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 free_global_num_fwft_fifo_prog_full_negate_cfg; +}DPP_PPU_PPU_FREE_GLOBAL_NUM_FWFT_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_free_global_num_fwft_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 free_global_num_fwft_fifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_FREE_GLOBAL_NUM_FWFT_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_free_global_num_fwft_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 free_global_num_fwft_fifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_FREE_GLOBAL_NUM_FWFT_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_pktrx_mc_ptr_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 ppu_pktrx_mc_ptr_fifo_prog_full_assert_cfg; +}DPP_PPU_PPU_PPU_PKTRX_MC_PTR_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_pktrx_mc_ptr_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 ppu_pktrx_mc_ptr_fifo_prog_full_negate_cfg; +}DPP_PPU_PPU_PPU_PKTRX_MC_PTR_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_pktrx_mc_ptr_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 ppu_pktrx_mc_ptr_fifo_prog_empty_assert_cfg; +}DPP_PPU_PPU_PPU_PKTRX_MC_PTR_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_ppu_ppu_pktrx_mc_ptr_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 ppu_pktrx_mc_ptr_fifo_prog_empty_negate_cfg; +}DPP_PPU_PPU_PPU_PKTRX_MC_PTR_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_ppu_pkt_data0_t +{ + ZXIC_UINT32 pkt_data0; +}DPP_PPU_PPU_PKT_DATA0_T; + +typedef struct dpp_ppu_ppu_pkt_data1_t +{ + ZXIC_UINT32 pkt_data1; +}DPP_PPU_PPU_PKT_DATA1_T; + +typedef struct dpp_ppu_ppu_pkt_data2_t +{ + ZXIC_UINT32 pkt_data2; +}DPP_PPU_PPU_PKT_DATA2_T; + +typedef struct dpp_ppu_ppu_pkt_data3_t +{ + ZXIC_UINT32 pkt_data3; +}DPP_PPU_PPU_PKT_DATA3_T; + +typedef struct dpp_ppu_ppu_pkt_data4_t +{ + ZXIC_UINT32 pkt_data4; +}DPP_PPU_PPU_PKT_DATA4_T; + +typedef struct dpp_ppu_ppu_pkt_data5_t +{ + ZXIC_UINT32 pkt_data5; +}DPP_PPU_PPU_PKT_DATA5_T; + +typedef struct dpp_ppu_ppu_pkt_data6_t +{ + ZXIC_UINT32 pkt_data6; +}DPP_PPU_PPU_PKT_DATA6_T; + +typedef struct dpp_ppu_ppu_pkt_data7_t +{ + ZXIC_UINT32 pkt_data7; +}DPP_PPU_PPU_PKT_DATA7_T; + +typedef struct dpp_ppu_ppu_pkt_data8_t +{ + ZXIC_UINT32 pkt_data8; +}DPP_PPU_PPU_PKT_DATA8_T; + +typedef struct dpp_ppu_ppu_pkt_data9_t +{ + ZXIC_UINT32 pkt_data9; +}DPP_PPU_PPU_PKT_DATA9_T; + +typedef struct dpp_ppu_ppu_pkt_data10_t +{ + ZXIC_UINT32 pkt_data10; +}DPP_PPU_PPU_PKT_DATA10_T; + +typedef struct dpp_ppu_ppu_pkt_data11_t +{ + ZXIC_UINT32 pkt_data11; +}DPP_PPU_PPU_PKT_DATA11_T; + +typedef struct dpp_ppu_ppu_pkt_data12_t +{ + ZXIC_UINT32 pkt_data12; +}DPP_PPU_PPU_PKT_DATA12_T; + +typedef struct dpp_ppu_ppu_pkt_data13_t +{ + ZXIC_UINT32 pkt_data13; +}DPP_PPU_PPU_PKT_DATA13_T; + +typedef struct dpp_ppu_ppu_pkt_data14_t +{ + ZXIC_UINT32 pkt_data14; +}DPP_PPU_PPU_PKT_DATA14_T; + +typedef struct dpp_ppu_ppu_pkt_data15_t +{ + ZXIC_UINT32 pkt_data15; +}DPP_PPU_PPU_PKT_DATA15_T; + +typedef struct dpp_ppu_ppu_pkt_data16_t +{ + ZXIC_UINT32 pkt_data16; +}DPP_PPU_PPU_PKT_DATA16_T; + +typedef struct dpp_ppu_ppu_pkt_data17_t +{ + ZXIC_UINT32 pkt_data17; +}DPP_PPU_PPU_PKT_DATA17_T; + +typedef struct dpp_ppu_ppu_pkt_data18_t +{ + ZXIC_UINT32 pkt_data18; +}DPP_PPU_PPU_PKT_DATA18_T; + +typedef struct dpp_ppu_ppu_pkt_data19_t +{ + ZXIC_UINT32 pkt_data19; +}DPP_PPU_PPU_PKT_DATA19_T; + +typedef struct dpp_ppu_ppu_pkt_data20_t +{ + ZXIC_UINT32 pkt_data20; +}DPP_PPU_PPU_PKT_DATA20_T; + +typedef struct dpp_ppu_ppu_pkt_data21_t +{ + ZXIC_UINT32 pkt_data21; +}DPP_PPU_PPU_PKT_DATA21_T; + +typedef struct dpp_ppu_ppu_pkt_data22_t +{ + ZXIC_UINT32 pkt_data22; +}DPP_PPU_PPU_PKT_DATA22_T; + +typedef struct dpp_ppu_ppu_pkt_data23_t +{ + ZXIC_UINT32 pkt_data23; +}DPP_PPU_PPU_PKT_DATA23_T; + +typedef struct dpp_ppu_ppu_pkt_data24_t +{ + ZXIC_UINT32 pkt_data24; +}DPP_PPU_PPU_PKT_DATA24_T; + +typedef struct dpp_ppu_ppu_pkt_data25_t +{ + ZXIC_UINT32 pkt_data25; +}DPP_PPU_PPU_PKT_DATA25_T; + +typedef struct dpp_ppu_ppu_pkt_data26_t +{ + ZXIC_UINT32 pkt_data26; +}DPP_PPU_PPU_PKT_DATA26_T; + +typedef struct dpp_ppu_ppu_pkt_data27_t +{ + ZXIC_UINT32 pkt_data27; +}DPP_PPU_PPU_PKT_DATA27_T; + +typedef struct dpp_ppu_ppu_pkt_data28_t +{ + ZXIC_UINT32 pkt_data28; +}DPP_PPU_PPU_PKT_DATA28_T; + +typedef struct dpp_ppu_ppu_pkt_data29_t +{ + ZXIC_UINT32 pkt_data29; +}DPP_PPU_PPU_PKT_DATA29_T; + +typedef struct dpp_ppu_ppu_pkt_data30_t +{ + ZXIC_UINT32 pkt_data30; +}DPP_PPU_PPU_PKT_DATA30_T; + +typedef struct dpp_ppu_ppu_pkt_data31_t +{ + ZXIC_UINT32 pkt_data31; +}DPP_PPU_PPU_PKT_DATA31_T; + +typedef struct dpp_ppu_ppu_pkt_data32_t +{ + ZXIC_UINT32 pkt_data32; +}DPP_PPU_PPU_PKT_DATA32_T; + +typedef struct dpp_ppu_ppu_pkt_data33_t +{ + ZXIC_UINT32 pkt_data33; +}DPP_PPU_PPU_PKT_DATA33_T; + +typedef struct dpp_ppu_ppu_pkt_data34_t +{ + ZXIC_UINT32 pkt_data34; +}DPP_PPU_PPU_PKT_DATA34_T; + +typedef struct dpp_ppu_ppu_pkt_data35_t +{ + ZXIC_UINT32 pkt_data35; +}DPP_PPU_PPU_PKT_DATA35_T; + +typedef struct dpp_ppu_ppu_pkt_data36_t +{ + ZXIC_UINT32 pkt_data36; +}DPP_PPU_PPU_PKT_DATA36_T; + +typedef struct dpp_ppu_ppu_pkt_data37_t +{ + ZXIC_UINT32 pkt_data37; +}DPP_PPU_PPU_PKT_DATA37_T; + +typedef struct dpp_ppu_ppu_pkt_data38_t +{ + ZXIC_UINT32 pkt_data38; +}DPP_PPU_PPU_PKT_DATA38_T; + +typedef struct dpp_ppu_ppu_pkt_data39_t +{ + ZXIC_UINT32 pkt_data39; +}DPP_PPU_PPU_PKT_DATA39_T; + +typedef struct dpp_ppu_ppu_pkt_data40_t +{ + ZXIC_UINT32 pkt_data40; +}DPP_PPU_PPU_PKT_DATA40_T; + +typedef struct dpp_ppu_ppu_pkt_data41_t +{ + ZXIC_UINT32 pkt_data41; +}DPP_PPU_PPU_PKT_DATA41_T; + +typedef struct dpp_ppu_ppu_pkt_data42_t +{ + ZXIC_UINT32 pkt_data42; +}DPP_PPU_PPU_PKT_DATA42_T; + +typedef struct dpp_ppu_ppu_pkt_data43_t +{ + ZXIC_UINT32 pkt_data43; +}DPP_PPU_PPU_PKT_DATA43_T; + +typedef struct dpp_ppu_ppu_pkt_data44_t +{ + ZXIC_UINT32 pkt_data44; +}DPP_PPU_PPU_PKT_DATA44_T; + +typedef struct dpp_ppu_ppu_pkt_data45_t +{ + ZXIC_UINT32 pkt_data45; +}DPP_PPU_PPU_PKT_DATA45_T; + +typedef struct dpp_ppu_ppu_pkt_data46_t +{ + ZXIC_UINT32 pkt_data46; +}DPP_PPU_PPU_PKT_DATA46_T; + +typedef struct dpp_ppu_ppu_pkt_data47_t +{ + ZXIC_UINT32 pkt_data47; +}DPP_PPU_PPU_PKT_DATA47_T; + +typedef struct dpp_ppu_ppu_pkt_data48_t +{ + ZXIC_UINT32 pkt_data48; +}DPP_PPU_PPU_PKT_DATA48_T; + +typedef struct dpp_ppu_ppu_pkt_data49_t +{ + ZXIC_UINT32 pkt_data49; +}DPP_PPU_PPU_PKT_DATA49_T; + +typedef struct dpp_ppu_ppu_pkt_data50_t +{ + ZXIC_UINT32 pkt_data50; +}DPP_PPU_PPU_PKT_DATA50_T; + +typedef struct dpp_ppu_ppu_pkt_data51_t +{ + ZXIC_UINT32 pkt_data51; +}DPP_PPU_PPU_PKT_DATA51_T; + +typedef struct dpp_ppu_ppu_pkt_data52_t +{ + ZXIC_UINT32 pkt_data52; +}DPP_PPU_PPU_PKT_DATA52_T; + +typedef struct dpp_ppu_ppu_pkt_data53_t +{ + ZXIC_UINT32 pkt_data53; +}DPP_PPU_PPU_PKT_DATA53_T; + +typedef struct dpp_ppu_ppu_pkt_data54_t +{ + ZXIC_UINT32 pkt_data54; +}DPP_PPU_PPU_PKT_DATA54_T; + +typedef struct dpp_ppu_ppu_pkt_data55_t +{ + ZXIC_UINT32 pkt_data55; +}DPP_PPU_PPU_PKT_DATA55_T; + +typedef struct dpp_ppu_ppu_pkt_data56_t +{ + ZXIC_UINT32 pkt_data56; +}DPP_PPU_PPU_PKT_DATA56_T; + +typedef struct dpp_ppu_ppu_pkt_data57_t +{ + ZXIC_UINT32 pkt_data57; +}DPP_PPU_PPU_PKT_DATA57_T; + +typedef struct dpp_ppu_ppu_pkt_data58_t +{ + ZXIC_UINT32 pkt_data58; +}DPP_PPU_PPU_PKT_DATA58_T; + +typedef struct dpp_ppu_ppu_pkt_data59_t +{ + ZXIC_UINT32 pkt_data59; +}DPP_PPU_PPU_PKT_DATA59_T; + +typedef struct dpp_ppu_ppu_pkt_data60_t +{ + ZXIC_UINT32 pkt_data60; +}DPP_PPU_PPU_PKT_DATA60_T; + +typedef struct dpp_ppu_ppu_pkt_data61_t +{ + ZXIC_UINT32 pkt_data61; +}DPP_PPU_PPU_PKT_DATA61_T; + +typedef struct dpp_ppu_ppu_pkt_data62_t +{ + ZXIC_UINT32 pkt_data62; +}DPP_PPU_PPU_PKT_DATA62_T; + +typedef struct dpp_ppu_ppu_pkt_data63_t +{ + ZXIC_UINT32 pkt_data63; +}DPP_PPU_PPU_PKT_DATA63_T; + +typedef struct dpp_ppu_ppu_pkt_data64_t +{ + ZXIC_UINT32 pkt_data64; +}DPP_PPU_PPU_PKT_DATA64_T; + +typedef struct dpp_ppu_ppu_pkt_data65_t +{ + ZXIC_UINT32 pkt_data65; +}DPP_PPU_PPU_PKT_DATA65_T; + +typedef struct dpp_ppu_ppu_pkt_data66_t +{ + ZXIC_UINT32 pkt_data66; +}DPP_PPU_PPU_PKT_DATA66_T; + +typedef struct dpp_ppu_ppu_pkt_data67_t +{ + ZXIC_UINT32 pkt_data67; +}DPP_PPU_PPU_PKT_DATA67_T; + +typedef struct dpp_ppu_ppu_pkt_data68_t +{ + ZXIC_UINT32 pkt_data68; +}DPP_PPU_PPU_PKT_DATA68_T; + +typedef struct dpp_ppu_ppu_pkt_data69_t +{ + ZXIC_UINT32 pkt_data69; +}DPP_PPU_PPU_PKT_DATA69_T; + +typedef struct dpp_ppu_ppu_pkt_data70_t +{ + ZXIC_UINT32 pkt_data70; +}DPP_PPU_PPU_PKT_DATA70_T; + +typedef struct dpp_ppu_ppu_pkt_data71_t +{ + ZXIC_UINT32 pkt_data71; +}DPP_PPU_PPU_PKT_DATA71_T; + +typedef struct dpp_ppu_ppu_pkt_data72_t +{ + ZXIC_UINT32 pkt_data72; +}DPP_PPU_PPU_PKT_DATA72_T; + +typedef struct dpp_ppu_ppu_pkt_data73_t +{ + ZXIC_UINT32 pkt_data73; +}DPP_PPU_PPU_PKT_DATA73_T; + +typedef struct dpp_ppu_ppu_pkt_data74_t +{ + ZXIC_UINT32 pkt_data74; +}DPP_PPU_PPU_PKT_DATA74_T; + +typedef struct dpp_ppu_ppu_pkt_data75_t +{ + ZXIC_UINT32 pkt_data75; +}DPP_PPU_PPU_PKT_DATA75_T; + +typedef struct dpp_ppu_ppu_pkt_data76_t +{ + ZXIC_UINT32 pkt_data76; +}DPP_PPU_PPU_PKT_DATA76_T; + +typedef struct dpp_ppu_ppu_pkt_data77_t +{ + ZXIC_UINT32 pkt_data77; +}DPP_PPU_PPU_PKT_DATA77_T; + +typedef struct dpp_ppu_ppu_pkt_data78_t +{ + ZXIC_UINT32 pkt_data78; +}DPP_PPU_PPU_PKT_DATA78_T; + +typedef struct dpp_ppu_ppu_pkt_data79_t +{ + ZXIC_UINT32 pkt_data79; +}DPP_PPU_PPU_PKT_DATA79_T; + +typedef struct dpp_ppu_ppu_pkt_data80_t +{ + ZXIC_UINT32 pkt_data80; +}DPP_PPU_PPU_PKT_DATA80_T; + +typedef struct dpp_ppu_ppu_pkt_data81_t +{ + ZXIC_UINT32 pkt_data81; +}DPP_PPU_PPU_PKT_DATA81_T; + +typedef struct dpp_ppu_ppu_pkt_data82_t +{ + ZXIC_UINT32 pkt_data82; +}DPP_PPU_PPU_PKT_DATA82_T; + +typedef struct dpp_ppu_ppu_pkt_data83_t +{ + ZXIC_UINT32 pkt_data83; +}DPP_PPU_PPU_PKT_DATA83_T; + +typedef struct dpp_ppu_ppu_pkt_data84_t +{ + ZXIC_UINT32 pkt_data84; +}DPP_PPU_PPU_PKT_DATA84_T; + +typedef struct dpp_ppu_ppu_pkt_data85_t +{ + ZXIC_UINT32 pkt_data85; +}DPP_PPU_PPU_PKT_DATA85_T; + +typedef struct dpp_ppu_ppu_pkt_data86_t +{ + ZXIC_UINT32 pkt_data86; +}DPP_PPU_PPU_PKT_DATA86_T; + +typedef struct dpp_ppu_ppu_pkt_data87_t +{ + ZXIC_UINT32 pkt_data87; +}DPP_PPU_PPU_PKT_DATA87_T; + +typedef struct dpp_ppu_ppu_pkt_data88_t +{ + ZXIC_UINT32 pkt_data88; +}DPP_PPU_PPU_PKT_DATA88_T; + +typedef struct dpp_ppu_ppu_pkt_data89_t +{ + ZXIC_UINT32 pkt_data89; +}DPP_PPU_PPU_PKT_DATA89_T; + +typedef struct dpp_ppu_ppu_pkt_data90_t +{ + ZXIC_UINT32 pkt_data90; +}DPP_PPU_PPU_PKT_DATA90_T; + +typedef struct dpp_ppu_ppu_pkt_data91_t +{ + ZXIC_UINT32 pkt_data91; +}DPP_PPU_PPU_PKT_DATA91_T; + +typedef struct dpp_ppu_ppu_pkt_data92_t +{ + ZXIC_UINT32 pkt_data92; +}DPP_PPU_PPU_PKT_DATA92_T; + +typedef struct dpp_ppu_ppu_pkt_data93_t +{ + ZXIC_UINT32 pkt_data93; +}DPP_PPU_PPU_PKT_DATA93_T; + +typedef struct dpp_ppu_ppu_pkt_data94_t +{ + ZXIC_UINT32 pkt_data94; +}DPP_PPU_PPU_PKT_DATA94_T; + +typedef struct dpp_ppu_ppu_pkt_data95_t +{ + ZXIC_UINT32 pkt_data95; +}DPP_PPU_PPU_PKT_DATA95_T; + +typedef struct dpp_ppu_ppu_pkt_data96_t +{ + ZXIC_UINT32 pkt_data96; +}DPP_PPU_PPU_PKT_DATA96_T; + +typedef struct dpp_ppu_ppu_pkt_data97_t +{ + ZXIC_UINT32 pkt_data97; +}DPP_PPU_PPU_PKT_DATA97_T; + +typedef struct dpp_ppu_ppu_pkt_data98_t +{ + ZXIC_UINT32 pkt_data98; +}DPP_PPU_PPU_PKT_DATA98_T; + +typedef struct dpp_ppu_ppu_pkt_data99_t +{ + ZXIC_UINT32 pkt_data99; +}DPP_PPU_PPU_PKT_DATA99_T; + +typedef struct dpp_ppu_ppu_pkt_data100_t +{ + ZXIC_UINT32 pkt_data100; +}DPP_PPU_PPU_PKT_DATA100_T; + +typedef struct dpp_ppu_ppu_pkt_data101_t +{ + ZXIC_UINT32 pkt_data101; +}DPP_PPU_PPU_PKT_DATA101_T; + +typedef struct dpp_ppu_ppu_pkt_data102_t +{ + ZXIC_UINT32 pkt_data102; +}DPP_PPU_PPU_PKT_DATA102_T; + +typedef struct dpp_ppu_ppu_pkt_data103_t +{ + ZXIC_UINT32 pkt_data103; +}DPP_PPU_PPU_PKT_DATA103_T; + +typedef struct dpp_ppu_ppu_pkt_data104_t +{ + ZXIC_UINT32 pkt_data104; +}DPP_PPU_PPU_PKT_DATA104_T; + +typedef struct dpp_ppu_ppu_pkt_data105_t +{ + ZXIC_UINT32 pkt_data105; +}DPP_PPU_PPU_PKT_DATA105_T; + +typedef struct dpp_ppu_ppu_pkt_data106_t +{ + ZXIC_UINT32 pkt_data106; +}DPP_PPU_PPU_PKT_DATA106_T; + +typedef struct dpp_ppu_ppu_pkt_data107_t +{ + ZXIC_UINT32 pkt_data107; +}DPP_PPU_PPU_PKT_DATA107_T; + +typedef struct dpp_ppu_ppu_pkt_data108_t +{ + ZXIC_UINT32 pkt_data108; +}DPP_PPU_PPU_PKT_DATA108_T; + +typedef struct dpp_ppu_ppu_pkt_data109_t +{ + ZXIC_UINT32 pkt_data109; +}DPP_PPU_PPU_PKT_DATA109_T; + +typedef struct dpp_ppu_ppu_pkt_data110_t +{ + ZXIC_UINT32 pkt_data110; +}DPP_PPU_PPU_PKT_DATA110_T; + +typedef struct dpp_ppu_ppu_pkt_data111_t +{ + ZXIC_UINT32 pkt_data111; +}DPP_PPU_PPU_PKT_DATA111_T; + +typedef struct dpp_ppu_ppu_pkt_data112_t +{ + ZXIC_UINT32 pkt_data112; +}DPP_PPU_PPU_PKT_DATA112_T; + +typedef struct dpp_ppu_ppu_pkt_data113_t +{ + ZXIC_UINT32 pkt_data113; +}DPP_PPU_PPU_PKT_DATA113_T; + +typedef struct dpp_ppu_ppu_pkt_data114_t +{ + ZXIC_UINT32 pkt_data114; +}DPP_PPU_PPU_PKT_DATA114_T; + +typedef struct dpp_ppu_ppu_pkt_data115_t +{ + ZXIC_UINT32 pkt_data115; +}DPP_PPU_PPU_PKT_DATA115_T; + +typedef struct dpp_ppu_ppu_pkt_data116_t +{ + ZXIC_UINT32 pkt_data116; +}DPP_PPU_PPU_PKT_DATA116_T; + +typedef struct dpp_ppu_ppu_pkt_data117_t +{ + ZXIC_UINT32 pkt_data117; +}DPP_PPU_PPU_PKT_DATA117_T; + +typedef struct dpp_ppu_ppu_pkt_data118_t +{ + ZXIC_UINT32 pkt_data118; +}DPP_PPU_PPU_PKT_DATA118_T; + +typedef struct dpp_ppu_ppu_pkt_data119_t +{ + ZXIC_UINT32 pkt_data119; +}DPP_PPU_PPU_PKT_DATA119_T; + +typedef struct dpp_ppu_ppu_pkt_data120_t +{ + ZXIC_UINT32 pkt_data120; +}DPP_PPU_PPU_PKT_DATA120_T; + +typedef struct dpp_ppu_ppu_pkt_data121_t +{ + ZXIC_UINT32 pkt_data121; +}DPP_PPU_PPU_PKT_DATA121_T; + +typedef struct dpp_ppu_ppu_pkt_data122_t +{ + ZXIC_UINT32 pkt_data122; +}DPP_PPU_PPU_PKT_DATA122_T; + +typedef struct dpp_ppu_ppu_pkt_data123_t +{ + ZXIC_UINT32 pkt_data123; +}DPP_PPU_PPU_PKT_DATA123_T; + +typedef struct dpp_ppu_ppu_pkt_data124_t +{ + ZXIC_UINT32 pkt_data124; +}DPP_PPU_PPU_PKT_DATA124_T; + +typedef struct dpp_ppu_ppu_pkt_data125_t +{ + ZXIC_UINT32 pkt_data125; +}DPP_PPU_PPU_PKT_DATA125_T; + +typedef struct dpp_ppu_ppu_pkt_data126_t +{ + ZXIC_UINT32 pkt_data126; +}DPP_PPU_PPU_PKT_DATA126_T; + +typedef struct dpp_ppu_ppu_pkt_data127_t +{ + ZXIC_UINT32 pkt_data127; +}DPP_PPU_PPU_PKT_DATA127_T; + +typedef struct dpp_ppu_ppu_spr0_t +{ + ZXIC_UINT32 spr0; +}DPP_PPU_PPU_SPR0_T; + +typedef struct dpp_ppu_ppu_spr1_t +{ + ZXIC_UINT32 spr1; +}DPP_PPU_PPU_SPR1_T; + +typedef struct dpp_ppu_ppu_spr2_t +{ + ZXIC_UINT32 spr2; +}DPP_PPU_PPU_SPR2_T; + +typedef struct dpp_ppu_ppu_spr3_t +{ + ZXIC_UINT32 spr3; +}DPP_PPU_PPU_SPR3_T; + +typedef struct dpp_ppu_ppu_spr4_t +{ + ZXIC_UINT32 spr4; +}DPP_PPU_PPU_SPR4_T; + +typedef struct dpp_ppu_ppu_spr5_t +{ + ZXIC_UINT32 spr5; +}DPP_PPU_PPU_SPR5_T; + +typedef struct dpp_ppu_ppu_spr6_t +{ + ZXIC_UINT32 spr6; +}DPP_PPU_PPU_SPR6_T; + +typedef struct dpp_ppu_ppu_spr7_t +{ + ZXIC_UINT32 spr7; +}DPP_PPU_PPU_SPR7_T; + +typedef struct dpp_ppu_ppu_spr8_t +{ + ZXIC_UINT32 spr8; +}DPP_PPU_PPU_SPR8_T; + +typedef struct dpp_ppu_ppu_spr9_t +{ + ZXIC_UINT32 spr9; +}DPP_PPU_PPU_SPR9_T; + +typedef struct dpp_ppu_ppu_spr10_t +{ + ZXIC_UINT32 spr10; +}DPP_PPU_PPU_SPR10_T; + +typedef struct dpp_ppu_ppu_spr11_t +{ + ZXIC_UINT32 spr11; +}DPP_PPU_PPU_SPR11_T; + +typedef struct dpp_ppu_ppu_spr12_t +{ + ZXIC_UINT32 spr12; +}DPP_PPU_PPU_SPR12_T; + +typedef struct dpp_ppu_ppu_spr13_t +{ + ZXIC_UINT32 spr13; +}DPP_PPU_PPU_SPR13_T; + +typedef struct dpp_ppu_ppu_spr14_t +{ + ZXIC_UINT32 spr14; +}DPP_PPU_PPU_SPR14_T; + +typedef struct dpp_ppu_ppu_spr15_t +{ + ZXIC_UINT32 spr15; +}DPP_PPU_PPU_SPR15_T; + +typedef struct dpp_ppu_ppu_spr16_t +{ + ZXIC_UINT32 spr16; +}DPP_PPU_PPU_SPR16_T; + +typedef struct dpp_ppu_ppu_spr17_t +{ + ZXIC_UINT32 spr17; +}DPP_PPU_PPU_SPR17_T; + +typedef struct dpp_ppu_ppu_spr18_t +{ + ZXIC_UINT32 spr18; +}DPP_PPU_PPU_SPR18_T; + +typedef struct dpp_ppu_ppu_spr19_t +{ + ZXIC_UINT32 spr19; +}DPP_PPU_PPU_SPR19_T; + +typedef struct dpp_ppu_ppu_spr20_t +{ + ZXIC_UINT32 spr20; +}DPP_PPU_PPU_SPR20_T; + +typedef struct dpp_ppu_ppu_spr21_t +{ + ZXIC_UINT32 spr21; +}DPP_PPU_PPU_SPR21_T; + +typedef struct dpp_ppu_ppu_spr22_t +{ + ZXIC_UINT32 spr22; +}DPP_PPU_PPU_SPR22_T; + +typedef struct dpp_ppu_ppu_spr23_t +{ + ZXIC_UINT32 spr23; +}DPP_PPU_PPU_SPR23_T; + +typedef struct dpp_ppu_ppu_spr24_t +{ + ZXIC_UINT32 spr24; +}DPP_PPU_PPU_SPR24_T; + +typedef struct dpp_ppu_ppu_spr25_t +{ + ZXIC_UINT32 spr25; +}DPP_PPU_PPU_SPR25_T; + +typedef struct dpp_ppu_ppu_spr26_t +{ + ZXIC_UINT32 spr26; +}DPP_PPU_PPU_SPR26_T; + +typedef struct dpp_ppu_ppu_spr27_t +{ + ZXIC_UINT32 spr27; +}DPP_PPU_PPU_SPR27_T; + +typedef struct dpp_ppu_ppu_spr28_t +{ + ZXIC_UINT32 spr28; +}DPP_PPU_PPU_SPR28_T; + +typedef struct dpp_ppu_ppu_spr29_t +{ + ZXIC_UINT32 spr29; +}DPP_PPU_PPU_SPR29_T; + +typedef struct dpp_ppu_ppu_spr30_t +{ + ZXIC_UINT32 spr30; +}DPP_PPU_PPU_SPR30_T; + +typedef struct dpp_ppu_ppu_spr31_t +{ + ZXIC_UINT32 spr31; +}DPP_PPU_PPU_SPR31_T; + +typedef struct dpp_ppu_ppu_rsp0_t +{ + ZXIC_UINT32 rsp0; +}DPP_PPU_PPU_RSP0_T; + +typedef struct dpp_ppu_ppu_rsp1_t +{ + ZXIC_UINT32 rsp1; +}DPP_PPU_PPU_RSP1_T; + +typedef struct dpp_ppu_ppu_rsp2_t +{ + ZXIC_UINT32 rsp2; +}DPP_PPU_PPU_RSP2_T; + +typedef struct dpp_ppu_ppu_rsp3_t +{ + ZXIC_UINT32 rsp3; +}DPP_PPU_PPU_RSP3_T; + +typedef struct dpp_ppu_ppu_rsp4_t +{ + ZXIC_UINT32 rsp4; +}DPP_PPU_PPU_RSP4_T; + +typedef struct dpp_ppu_ppu_rsp5_t +{ + ZXIC_UINT32 rsp5; +}DPP_PPU_PPU_RSP5_T; + +typedef struct dpp_ppu_ppu_rsp6_t +{ + ZXIC_UINT32 rsp6; +}DPP_PPU_PPU_RSP6_T; + +typedef struct dpp_ppu_ppu_rsp7_t +{ + ZXIC_UINT32 rsp7; +}DPP_PPU_PPU_RSP7_T; + +typedef struct dpp_ppu_ppu_rsp8_t +{ + ZXIC_UINT32 rsp8; +}DPP_PPU_PPU_RSP8_T; + +typedef struct dpp_ppu_ppu_rsp9_t +{ + ZXIC_UINT32 rsp9; +}DPP_PPU_PPU_RSP9_T; + +typedef struct dpp_ppu_ppu_rsp10_t +{ + ZXIC_UINT32 rsp10; +}DPP_PPU_PPU_RSP10_T; + +typedef struct dpp_ppu_ppu_rsp11_t +{ + ZXIC_UINT32 rsp11; +}DPP_PPU_PPU_RSP11_T; + +typedef struct dpp_ppu_ppu_rsp12_t +{ + ZXIC_UINT32 rsp12; +}DPP_PPU_PPU_RSP12_T; + +typedef struct dpp_ppu_ppu_rsp13_t +{ + ZXIC_UINT32 rsp13; +}DPP_PPU_PPU_RSP13_T; + +typedef struct dpp_ppu_ppu_rsp14_t +{ + ZXIC_UINT32 rsp14; +}DPP_PPU_PPU_RSP14_T; + +typedef struct dpp_ppu_ppu_rsp15_t +{ + ZXIC_UINT32 rsp15; +}DPP_PPU_PPU_RSP15_T; + +typedef struct dpp_ppu_ppu_rsp16_t +{ + ZXIC_UINT32 rsp16; +}DPP_PPU_PPU_RSP16_T; + +typedef struct dpp_ppu_ppu_rsp17_t +{ + ZXIC_UINT32 rsp17; +}DPP_PPU_PPU_RSP17_T; + +typedef struct dpp_ppu_ppu_rsp18_t +{ + ZXIC_UINT32 rsp18; +}DPP_PPU_PPU_RSP18_T; + +typedef struct dpp_ppu_ppu_rsp19_t +{ + ZXIC_UINT32 rsp19; +}DPP_PPU_PPU_RSP19_T; + +typedef struct dpp_ppu_ppu_rsp20_t +{ + ZXIC_UINT32 rsp20; +}DPP_PPU_PPU_RSP20_T; + +typedef struct dpp_ppu_ppu_rsp21_t +{ + ZXIC_UINT32 rsp21; +}DPP_PPU_PPU_RSP21_T; + +typedef struct dpp_ppu_ppu_rsp22_t +{ + ZXIC_UINT32 rsp22; +}DPP_PPU_PPU_RSP22_T; + +typedef struct dpp_ppu_ppu_rsp23_t +{ + ZXIC_UINT32 rsp23; +}DPP_PPU_PPU_RSP23_T; + +typedef struct dpp_ppu_ppu_rsp24_t +{ + ZXIC_UINT32 rsp24; +}DPP_PPU_PPU_RSP24_T; + +typedef struct dpp_ppu_ppu_rsp25_t +{ + ZXIC_UINT32 rsp25; +}DPP_PPU_PPU_RSP25_T; + +typedef struct dpp_ppu_ppu_rsp26_t +{ + ZXIC_UINT32 rsp26; +}DPP_PPU_PPU_RSP26_T; + +typedef struct dpp_ppu_ppu_rsp27_t +{ + ZXIC_UINT32 rsp27; +}DPP_PPU_PPU_RSP27_T; + +typedef struct dpp_ppu_ppu_rsp28_t +{ + ZXIC_UINT32 rsp28; +}DPP_PPU_PPU_RSP28_T; + +typedef struct dpp_ppu_ppu_rsp29_t +{ + ZXIC_UINT32 rsp29; +}DPP_PPU_PPU_RSP29_T; + +typedef struct dpp_ppu_ppu_rsp30_t +{ + ZXIC_UINT32 rsp30; +}DPP_PPU_PPU_RSP30_T; + +typedef struct dpp_ppu_ppu_rsp31_t +{ + ZXIC_UINT32 rsp31; +}DPP_PPU_PPU_RSP31_T; + +typedef struct dpp_ppu_ppu_key0_t +{ + ZXIC_UINT32 key0; +}DPP_PPU_PPU_KEY0_T; + +typedef struct dpp_ppu_ppu_key1_t +{ + ZXIC_UINT32 key1; +}DPP_PPU_PPU_KEY1_T; + +typedef struct dpp_ppu_ppu_key2_t +{ + ZXIC_UINT32 key2; +}DPP_PPU_PPU_KEY2_T; + +typedef struct dpp_ppu_ppu_key3_t +{ + ZXIC_UINT32 key3; +}DPP_PPU_PPU_KEY3_T; + +typedef struct dpp_ppu_ppu_key4_t +{ + ZXIC_UINT32 key4; +}DPP_PPU_PPU_KEY4_T; + +typedef struct dpp_ppu_ppu_key5_t +{ + ZXIC_UINT32 key5; +}DPP_PPU_PPU_KEY5_T; + +typedef struct dpp_ppu_ppu_key6_t +{ + ZXIC_UINT32 key6; +}DPP_PPU_PPU_KEY6_T; + +typedef struct dpp_ppu_ppu_key7_t +{ + ZXIC_UINT32 key7; +}DPP_PPU_PPU_KEY7_T; + +typedef struct dpp_ppu_ppu_key8_t +{ + ZXIC_UINT32 key8; +}DPP_PPU_PPU_KEY8_T; + +typedef struct dpp_ppu_ppu_key9_t +{ + ZXIC_UINT32 key9; +}DPP_PPU_PPU_KEY9_T; + +typedef struct dpp_ppu_ppu_key10_t +{ + ZXIC_UINT32 key10; +}DPP_PPU_PPU_KEY10_T; + +typedef struct dpp_ppu_ppu_key11_t +{ + ZXIC_UINT32 key11; +}DPP_PPU_PPU_KEY11_T; + +typedef struct dpp_ppu_ppu_key12_t +{ + ZXIC_UINT32 key12; +}DPP_PPU_PPU_KEY12_T; + +typedef struct dpp_ppu_ppu_key13_t +{ + ZXIC_UINT32 key13; +}DPP_PPU_PPU_KEY13_T; + +typedef struct dpp_ppu_ppu_key14_t +{ + ZXIC_UINT32 key14; +}DPP_PPU_PPU_KEY14_T; + +typedef struct dpp_ppu_ppu_key15_t +{ + ZXIC_UINT32 key15; +}DPP_PPU_PPU_KEY15_T; + +typedef struct dpp_ppu_ppu_key16_t +{ + ZXIC_UINT32 key16; +}DPP_PPU_PPU_KEY16_T; + +typedef struct dpp_ppu_ppu_key17_t +{ + ZXIC_UINT32 key17; +}DPP_PPU_PPU_KEY17_T; + +typedef struct dpp_ppu_ppu_key18_t +{ + ZXIC_UINT32 key18; +}DPP_PPU_PPU_KEY18_T; + +typedef struct dpp_ppu_ppu_key19_t +{ + ZXIC_UINT32 key19; +}DPP_PPU_PPU_KEY19_T; + +typedef struct dpp_ppu_ppu_flag_t +{ + ZXIC_UINT32 me_num; + ZXIC_UINT32 thread_num; + ZXIC_UINT32 flag; +}DPP_PPU_PPU_FLAG_T; + +typedef struct dpp_ppu_cluster_int_1200m_flag_t +{ + ZXIC_UINT32 me7_interrupt_flag; + ZXIC_UINT32 me6_interrupt_flag; + ZXIC_UINT32 me5_interrupt_flag; + ZXIC_UINT32 me4_interrupt_flag; + ZXIC_UINT32 me3_interrupt_flag; + ZXIC_UINT32 me2_interrupt_flag; + ZXIC_UINT32 me1_interrupt_flag; + ZXIC_UINT32 me0_interrupt_flag; +}DPP_PPU_CLUSTER_INT_1200M_FLAG_T; + +typedef struct dpp_ppu_cluster_bp_instr_l_t +{ + ZXIC_UINT32 bp_instr_l; +}DPP_PPU_CLUSTER_BP_INSTR_L_T; + +typedef struct dpp_ppu_cluster_bp_instr_h_t +{ + ZXIC_UINT32 bp_instr_h; +}DPP_PPU_CLUSTER_BP_INSTR_H_T; + +typedef struct dpp_ppu_cluster_bp_addr_t +{ + ZXIC_UINT32 bp_addr; +}DPP_PPU_CLUSTER_BP_ADDR_T; + +typedef struct dpp_ppu_cluster_drr_t +{ + ZXIC_UINT32 drr; +}DPP_PPU_CLUSTER_DRR_T; + +typedef struct dpp_ppu_cluster_dsr_t +{ + ZXIC_UINT32 dsr; +}DPP_PPU_CLUSTER_DSR_T; + +typedef struct dpp_ppu_cluster_dbg_rtl_date_t +{ + ZXIC_UINT32 dbg_rtl_date; +}DPP_PPU_CLUSTER_DBG_RTL_DATE_T; + +typedef struct dpp_ppu_cluster_me_continue_t +{ + ZXIC_UINT32 me_continue; +}DPP_PPU_CLUSTER_ME_CONTINUE_T; + +typedef struct dpp_ppu_cluster_me_step_t +{ + ZXIC_UINT32 me_step; +}DPP_PPU_CLUSTER_ME_STEP_T; + +typedef struct dpp_ppu_cluster_me_refresh_t +{ + ZXIC_UINT32 me_refresh; +}DPP_PPU_CLUSTER_ME_REFRESH_T; + +typedef struct dpp_ppu_cluster_drr_clr_t +{ + ZXIC_UINT32 drr_clr; +}DPP_PPU_CLUSTER_DRR_CLR_T; + +typedef struct dpp_ppu_cluster_me_busy_thresold_t +{ + ZXIC_UINT32 me_busy_thresold; +}DPP_PPU_CLUSTER_ME_BUSY_THRESOLD_T; + +typedef struct dpp_ppu_cluster_int_1200m_sta_t +{ + ZXIC_UINT32 me7_interrupt_sta; + ZXIC_UINT32 me6_interrupt_sta; + ZXIC_UINT32 me5_interrupt_sta; + ZXIC_UINT32 me4_interrupt_sta; + ZXIC_UINT32 me3_interrupt_sta; + ZXIC_UINT32 me2_interrupt_sta; + ZXIC_UINT32 me1_interrupt_sta; + ZXIC_UINT32 me0_interrupt_sta; +}DPP_PPU_CLUSTER_INT_1200M_STA_T; + +typedef struct dpp_ppu_cluster_int_1200m_me_fifo_mask_l_t +{ + ZXIC_UINT32 me_free_pkt_q_overflow_mask; + ZXIC_UINT32 me_free_pkt_q_underflow_mask; + ZXIC_UINT32 me_free_thread_q_overflow_mask; + ZXIC_UINT32 me_free_thread_q_underflow_mask; + ZXIC_UINT32 me_pkt_in_overflow_mask; + ZXIC_UINT32 me_pkt_in_underflow_mask; + ZXIC_UINT32 me_rdy_q_overflow_mask; + ZXIC_UINT32 me_rdy_q_underflow_mask; + ZXIC_UINT32 me_pkt_out_q_overflow_mask; + ZXIC_UINT32 me_pkt_out_q_underflow_mask; + ZXIC_UINT32 me_continue_q_overflow_mask; + ZXIC_UINT32 me_continue_q_underflow_mask; + ZXIC_UINT32 me_esrh_q_overflow_mask; + ZXIC_UINT32 me_esrh_q_underflow_mask; + ZXIC_UINT32 me_isrh_q_overflow_mask; + ZXIC_UINT32 me_isrh_q_underflow_mask; + ZXIC_UINT32 me_cache_miss_q_overflow_mask; + ZXIC_UINT32 me_cache_miss_q_underflow_mask; + ZXIC_UINT32 me_base_q_u0_overflow_mask; + ZXIC_UINT32 me_base_q_u0_underflow_mask; + ZXIC_UINT32 me_base_q_u1_overflow_mask; + ZXIC_UINT32 me_base_q_u1_underflow_mask; + ZXIC_UINT32 me_base_q_u2_overflow_mask; + ZXIC_UINT32 me_base_q_u2_underflow_mask; + ZXIC_UINT32 me_base_q_u3_overflow_mask; + ZXIC_UINT32 me_base_q_u3_underflow_mask; + ZXIC_UINT32 me_reg_pc_q_overflow_mask; + ZXIC_UINT32 me_reg_pc_q_underflow_mask; + ZXIC_UINT32 me_branch_q_overflow_mask; + ZXIC_UINT32 me_branch_q_underflow_mask; + ZXIC_UINT32 me_pkt_base_q_overflow_mask; + ZXIC_UINT32 me_pkt_base_q_underflow_mask; +}DPP_PPU_CLUSTER_INT_1200M_ME_FIFO_MASK_L_T; + +typedef struct dpp_ppu_cluster_int_1200m_me_fifo_mask_h_t +{ + ZXIC_UINT32 me_except_refetch_pc_overflow_mask; + ZXIC_UINT32 me_except_refetch_pc_underflow_mask; +}DPP_PPU_CLUSTER_INT_1200M_ME_FIFO_MASK_H_T; + +typedef struct dpp_ppu_cluster_me_fifo_interrupt_flag_l_t +{ + ZXIC_UINT32 me_free_pkt_q_overflow_flag; + ZXIC_UINT32 me_free_pkt_q_underflow_flag; + ZXIC_UINT32 me_free_thread_q_overflow_flag; + ZXIC_UINT32 me_free_thread_q_underflow_flag; + ZXIC_UINT32 me_pkt_in_overflow_flag; + ZXIC_UINT32 me_pkt_in_underflow_flag; + ZXIC_UINT32 me_rdy_q_overflow_flag; + ZXIC_UINT32 me_rdy_q_underflow_flag; + ZXIC_UINT32 me_pkt_out_q_overflow_flag; + ZXIC_UINT32 me_pkt_out_q_underflow_flag; + ZXIC_UINT32 me_continue_q_overflow_flag; + ZXIC_UINT32 me_continue_q_underflow_flag; + ZXIC_UINT32 me_esrh_q_overflow_flag; + ZXIC_UINT32 me_esrh_q_underflow_flag; + ZXIC_UINT32 me_isrh_q_overflow_flag; + ZXIC_UINT32 me_isrh_q_underflow_flag; + ZXIC_UINT32 me_cache_miss_q_overflow_flag; + ZXIC_UINT32 me_cache_miss_q_underflow_flag; + ZXIC_UINT32 me_base_q_u0_overflow_flag; + ZXIC_UINT32 me_base_q_u0_underflow_flag; + ZXIC_UINT32 me_base_q_u1_overflow_flag; + ZXIC_UINT32 me_base_q_u1_underflow_flag; + ZXIC_UINT32 me_base_q_u2_overflow_flag; + ZXIC_UINT32 me_base_q_u2_underflow_flag; + ZXIC_UINT32 me_base_q_u3_overflow_flag; + ZXIC_UINT32 me_base_q_u3_underflow_flag; + ZXIC_UINT32 me_reg_pc_q_overflow_flag; + ZXIC_UINT32 me_reg_pc_q_underflow_flag; + ZXIC_UINT32 me_branch_q_overflow_flag; + ZXIC_UINT32 me_branch_q_underflow_flag; + ZXIC_UINT32 me_pkt_base_q_overflow_flag; + ZXIC_UINT32 me_pkt_base_q_underflow_flag; +}DPP_PPU_CLUSTER_ME_FIFO_INTERRUPT_FLAG_L_T; + +typedef struct dpp_ppu_cluster_me_fifo_interrupt_flag_h_t +{ + ZXIC_UINT32 me_except_refetch_pc_overflow_flag; + ZXIC_UINT32 me_except_refetch_pc_underflow_flag; +}DPP_PPU_CLUSTER_ME_FIFO_INTERRUPT_FLAG_H_T; + +typedef struct dpp_ppu_cluster_me_fifo_interrupt_sta_l_t +{ + ZXIC_UINT32 me_free_pkt_q_overflow_sta; + ZXIC_UINT32 me_free_pkt_q_underflow_sta; + ZXIC_UINT32 me_free_thread_q_overflow_sta; + ZXIC_UINT32 me_free_thread_q_underflow_sta; + ZXIC_UINT32 me_pkt_in_overflow_sta; + ZXIC_UINT32 me_pkt_in_underflow_sta; + ZXIC_UINT32 me_rdy_q_overflow_sta; + ZXIC_UINT32 me_rdy_q_underflow_sta; + ZXIC_UINT32 me_pkt_out_q_overflow_sta; + ZXIC_UINT32 me_pkt_out_q_underflow_sta; + ZXIC_UINT32 me_continue_q_overflow_sta; + ZXIC_UINT32 me_continue_q_underflow_sta; + ZXIC_UINT32 me_esrh_q_overflow_sta; + ZXIC_UINT32 me_esrh_q_underflow_sta; + ZXIC_UINT32 me_isrh_q_overflow_sta; + ZXIC_UINT32 me_isrh_q_underflow_sta; + ZXIC_UINT32 me_cache_miss_q_overflow_sta; + ZXIC_UINT32 me_cache_miss_q_underflow_sta; + ZXIC_UINT32 me_base_q_u0_overflow_sta; + ZXIC_UINT32 me_base_q_u0_underflow_sta; + ZXIC_UINT32 me_base_q_u1_overflow_sta; + ZXIC_UINT32 me_base_q_u1_underflow_sta; + ZXIC_UINT32 me_base_q_u2_overflow_sta; + ZXIC_UINT32 me_base_q_u2_underflow_sta; + ZXIC_UINT32 me_base_q_u3_overflow_sta; + ZXIC_UINT32 me_base_q_u3_underflow_sta; + ZXIC_UINT32 me_reg_pc_q_overflow_sta; + ZXIC_UINT32 me_reg_pc_q_underflow_sta; + ZXIC_UINT32 me_branch_q_overflow_sta; + ZXIC_UINT32 me_branch_q_underflow_sta; + ZXIC_UINT32 me_pkt_base_q_overflow_sta; + ZXIC_UINT32 me_pkt_base_q_underflow_sta; +}DPP_PPU_CLUSTER_ME_FIFO_INTERRUPT_STA_L_T; + +typedef struct dpp_ppu_cluster_me_fifo_interrupt_sta_h_t +{ + ZXIC_UINT32 me_except_refetch_pc_overflow_sta; + ZXIC_UINT32 me_except_refetch_pc_underflow_sta; +}DPP_PPU_CLUSTER_ME_FIFO_INTERRUPT_STA_H_T; + +typedef struct dpp_ppu_cluster_int_1200m_cluster_mex_fifo_mask_l_t +{ + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u3_overflow_mask; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u3_underflow_mask; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u4_overflow_mask; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u4_underflow_mask; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u5_overflow_mask; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u5_underflow_mask; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u6_overflow_mask; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u6_underflow_mask; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u7_overflow_mask; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u7_underflow_mask; + ZXIC_UINT32 ppu_ise_rsp_afifo_64x143_wrapper_u0_underflow_mask; + ZXIC_UINT32 ise_rsp_ram_free_ptr_u0_overflow_mask; + ZXIC_UINT32 ise_rsp_ram_free_ptr_u0_underflow_mask; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u0_overflow_mask; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u0_underflow_mask; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u1_overflow_mask; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u1_underflow_mask; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u2_overflow_mask; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u2_underflow_mask; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u3_overflow_mask; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u3_underflow_mask; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u4_overflow_mask; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u4_underflow_mask; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u5_overflow_mask; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u5_underflow_mask; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u6_overflow_mask; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u6_underflow_mask; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u7_overflow_mask; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u7_underflow_mask; + ZXIC_UINT32 ppu_sta_rsp_afifo_64x79_wrapper_underflow_mask; + ZXIC_UINT32 ppu_sta_rsp_fwft_fifo_128x79_wrapper_overflow_mask; + ZXIC_UINT32 ppu_sta_rsp_fwft_fifo_128x79_wrapper_underflow_mask; +}DPP_PPU_CLUSTER_INT_1200M_CLUSTER_MEX_FIFO_MASK_L_T; + +typedef struct dpp_ppu_cluster_int_1200m_cluster_mex_fifo_mask_h_t +{ + ZXIC_UINT32 ppu_se_key_afifo_32x54_wrapper_overflow_mask; + ZXIC_UINT32 ppu_se_key_afifo_32x665_wrapper_overflow_mask; + ZXIC_UINT32 ppu_sta_key_afifo_32x110_wrapper_overflow_mask; + ZXIC_UINT32 ppu_cluster_mf_in_afifo_32x2048_wrapper_underflow_mask; + ZXIC_UINT32 ppu_pbu_mcode_pf_rsp_fifo_32x13_wrapper_overflow_mask; + ZXIC_UINT32 ppu_pbu_mcode_pf_rsp_fifo_32x13_wrapper_underflow_mask; + ZXIC_UINT32 ppu_coprocess_rsp_fifo_32x77_wrapper_overflow_mask; + ZXIC_UINT32 ppu_coprocess_rsp_fifo_32x77_wrapper_underflow_mask; + ZXIC_UINT32 ppu_coprocess_rsp_fwft_fifo_128x78_wrapper_overflow_mask; + ZXIC_UINT32 ppu_coprocess_rsp_fwft_fifo_128x78_wrapper_underflow_mask; + ZXIC_UINT32 ppu_ese_rsp_afifo_64x271_wrapper_u0_underflow_mask; + ZXIC_UINT32 ese_rsp_ram_free_ptr_u0_overflow_mask; + ZXIC_UINT32 ese_rsp_ram_free_ptr_u0_underflow_mask; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u0_overflow_mask; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u0_underflow_mask; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u1_overflow_mask; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u1_underflow_mask; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u2_overflow_mask; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u2_underflow_mask; +}DPP_PPU_CLUSTER_INT_1200M_CLUSTER_MEX_FIFO_MASK_H_T; + +typedef struct dpp_ppu_cluster_int_1200m_cluster_mex_fifo_flag_l_t +{ + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u3_overflow_flag; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u3_underflow_flag; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u4_overflow_flag; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u4_underflow_flag; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u5_overflow_flag; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u5_underflow_flag; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u6_overflow_flag; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u6_underflow_flag; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u7_overflow_flag; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u7_underflow_flag; + ZXIC_UINT32 ppu_ise_rsp_afifo_64x143_wrapper_u0_underflow_flag; + ZXIC_UINT32 ise_rsp_ram_free_ptr_u0_overflow_flag; + ZXIC_UINT32 ise_rsp_ram_free_ptr_u0_underflow_flag; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u0_overflow_flag; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u0_underflow_flag; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u1_overflow_flag; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u1_underflow_flag; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u2_overflow_flag; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u2_underflow_flag; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u3_overflow_flag; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u3_underflow_flag; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u4_overflow_flag; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u4_underflow_flag; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u5_overflow_flag; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u5_underflow_flag; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u6_overflow_flag; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u6_underflow_flag; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u7_overflow_flag; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u7_underflow_flag; + ZXIC_UINT32 ppu_sta_rsp_afifo_64x79_wrapper_underflow_flag; + ZXIC_UINT32 ppu_sta_rsp_fwft_fifo_128x79_wrapper_overflow_flag; + ZXIC_UINT32 ppu_sta_rsp_fwft_fifo_128x79_wrapper_underflow_flag; +}DPP_PPU_CLUSTER_INT_1200M_CLUSTER_MEX_FIFO_FLAG_L_T; + +typedef struct dpp_ppu_cluster_int_1200m_cluster_mex_fifo_flag_h_t +{ + ZXIC_UINT32 ppu_se_key_afifo_32x54_wrapper_overflow_flag; + ZXIC_UINT32 ppu_se_key_afifo_32x665_wrapper_overflow_flag; + ZXIC_UINT32 ppu_sta_key_afifo_32x110_wrapper_overflow_flag; + ZXIC_UINT32 ppu_cluster_mf_in_afifo_32x2048_wrapper_underflow_flag; + ZXIC_UINT32 ppu_pbu_mcode_pf_rsp_fifo_32x13_wrapper_overflow_flag; + ZXIC_UINT32 ppu_pbu_mcode_pf_rsp_fifo_32x13_wrapper_underflow_flag; + ZXIC_UINT32 ppu_coprocess_rsp_fifo_32x77_wrapper_overflow_flag; + ZXIC_UINT32 ppu_coprocess_rsp_fifo_32x77_wrapper_underflow_flag; + ZXIC_UINT32 ppu_coprocess_rsp_fwft_fifo_128x78_wrapper_overflow_flag; + ZXIC_UINT32 ppu_coprocess_rsp_fwft_fifo_128x78_wrapper_underflow_flag; + ZXIC_UINT32 ppu_ese_rsp_afifo_64x271_wrapper_u0_underflow_flag; + ZXIC_UINT32 ese_rsp_ram_free_ptr_u0_overflow_flag; + ZXIC_UINT32 ese_rsp_ram_free_ptr_u0_underflow_flag; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u0_overflow_flag; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u0_underflow_flag; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u1_overflow_flag; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u1_underflow_flag; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u2_overflow_flag; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u2_underflow_flag; +}DPP_PPU_CLUSTER_INT_1200M_CLUSTER_MEX_FIFO_FLAG_H_T; + +typedef struct dpp_ppu_cluster_int_1200m_cluster_mex_fifo_stat_l_t +{ + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u3_overflow_stat; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u3_underflow_stat; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u4_overflow_stat; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u4_underflow_stat; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u5_overflow_stat; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u5_underflow_stat; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u6_overflow_stat; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u6_underflow_stat; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u7_overflow_stat; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u7_underflow_stat; + ZXIC_UINT32 ppu_ise_rsp_afifo_64x143_wrapper_u0_underflow_stat; + ZXIC_UINT32 ise_rsp_ram_free_ptr_u0_overflow_stat; + ZXIC_UINT32 ise_rsp_ram_free_ptr_u0_underflow_stat; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u0_overflow_stat; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u0_underflow_stat; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u1_overflow_stat; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u1_underflow_stat; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u2_overflow_stat; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u2_underflow_stat; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u3_overflow_stat; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u3_underflow_stat; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u4_overflow_stat; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u4_underflow_stat; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u5_overflow_stat; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u5_underflow_stat; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u6_overflow_stat; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u6_underflow_stat; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u7_overflow_stat; + ZXIC_UINT32 ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u7_underflow_stat; + ZXIC_UINT32 ppu_sta_rsp_afifo_64x79_wrapper_underflow_stat; + ZXIC_UINT32 ppu_sta_rsp_fwft_fifo_128x79_wrapper_overflow_stat; + ZXIC_UINT32 ppu_sta_rsp_fwft_fifo_128x79_wrapper_underflow_stat; +}DPP_PPU_CLUSTER_INT_1200M_CLUSTER_MEX_FIFO_STAT_L_T; + +typedef struct dpp_ppu_cluster_int_1200m_cluster_mex_fifo_stat_h_t +{ + ZXIC_UINT32 ppu_se_key_afifo_32x54_wrapper_overflow_stat; + ZXIC_UINT32 ppu_se_key_afifo_32x665_wrapper_overflow_stat; + ZXIC_UINT32 ppu_sta_key_afifo_32x110_wrapper_overflow_stat; + ZXIC_UINT32 ppu_cluster_mf_in_afifo_32x2048_wrapper_underflow_stat; + ZXIC_UINT32 ppu_pbu_mcode_pf_rsp_fifo_32x13_wrapper_overflow_stat; + ZXIC_UINT32 ppu_pbu_mcode_pf_rsp_fifo_32x13_wrapper_underflow_stat; + ZXIC_UINT32 ppu_coprocess_rsp_fifo_32x77_wrapper_overflow_stat; + ZXIC_UINT32 ppu_coprocess_rsp_fifo_32x77_wrapper_underflow_stat; + ZXIC_UINT32 ppu_coprocess_rsp_fwft_fifo_128x78_wrapper_overflow_stat; + ZXIC_UINT32 ppu_coprocess_rsp_fwft_fifo_128x78_wrapper_underflow_stat; + ZXIC_UINT32 ppu_ese_rsp_afifo_64x271_wrapper_u0_underflow_stat; + ZXIC_UINT32 ese_rsp_ram_free_ptr_u0_overflow_stat; + ZXIC_UINT32 ese_rsp_ram_free_ptr_u0_underflow_stat; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u0_overflow_stat; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u0_underflow_stat; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u1_overflow_stat; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u1_underflow_stat; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u2_overflow_stat; + ZXIC_UINT32 ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u2_underflow_stat; +}DPP_PPU_CLUSTER_INT_1200M_CLUSTER_MEX_FIFO_STAT_H_T; + +typedef struct dpp_ppu_cluster_ppu_statics_wb_exception_cfg_t +{ + ZXIC_UINT32 csr_statics_wb_exception_code5; + ZXIC_UINT32 csr_statics_wb_exception_code4; + ZXIC_UINT32 csr_statics_wb_exception_code3; + ZXIC_UINT32 csr_statics_wb_exception_code2; + ZXIC_UINT32 csr_statics_wb_exception_code1; + ZXIC_UINT32 csr_statics_wb_exception_code0; +}DPP_PPU_CLUSTER_PPU_STATICS_WB_EXCEPTION_CFG_T; + +typedef struct dpp_ppu_cluster_thread_switch_en_t +{ + ZXIC_UINT32 thread_switch_en; +}DPP_PPU_CLUSTER_THREAD_SWITCH_EN_T; + +typedef struct dpp_ppu_cluster_is_me_not_idle_t +{ + ZXIC_UINT32 me7_is_not_idle; + ZXIC_UINT32 me6_is_not_idle; + ZXIC_UINT32 me5_is_not_idle; + ZXIC_UINT32 me4_is_not_idle; + ZXIC_UINT32 me3_is_not_idle; + ZXIC_UINT32 me2_is_not_idle; + ZXIC_UINT32 me1_is_not_idle; + ZXIC_UINT32 me0_is_not_idle; +}DPP_PPU_CLUSTER_IS_ME_NOT_IDLE_T; + +typedef struct dpp_ppu_cluster_ppu_cluster_mf_in_afifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 ppu_cluster_mf_in_afifo_prog_empty_assert_cfg; +}DPP_PPU_CLUSTER_PPU_CLUSTER_MF_IN_AFIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_cluster_mf_in_afifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 ppu_cluster_mf_in_afifo_prog_empty_negate_cfg; +}DPP_PPU_CLUSTER_PPU_CLUSTER_MF_IN_AFIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_ese_rsp_afifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 ese_rsp_afifo_prog_empty_assert_cfg; +}DPP_PPU_CLUSTER_ESE_RSP_AFIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_ese_rsp_afifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 ese_rsp_afifo_prog_empty_negate_cfg; +}DPP_PPU_CLUSTER_ESE_RSP_AFIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_ise_rsp_afifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 ise_rsp_afifo_prog_empty_assert_cfg; +}DPP_PPU_CLUSTER_ISE_RSP_AFIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_ise_rsp_afifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 ise_rsp_afifo_prog_empty_negate_cfg; +}DPP_PPU_CLUSTER_ISE_RSP_AFIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_rsp_ptr_fwft_fifo0_prog_full_assert_cfg_t +{ + ZXIC_UINT32 ppu_rsp_ptr_fwft_fifo0_prog_full_assert_cfg; +}DPP_PPU_CLUSTER_PPU_RSP_PTR_FWFT_FIFO0_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_rsp_ptr_fwft_fifo0_prog_full_negate_cfg_t +{ + ZXIC_UINT32 ppu_rsp_ptr_fwft_fifo0_prog_full_negate_cfg; +}DPP_PPU_CLUSTER_PPU_RSP_PTR_FWFT_FIFO0_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_rsp_ptr_fwft_fifo0_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 ppu_rsp_ptr_fwft_fifo0_prog_empty_assert_cfg; +}DPP_PPU_CLUSTER_PPU_RSP_PTR_FWFT_FIFO0_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_rsp_ptr_fwft_fifo0_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 ppu_rsp_ptr_fwft_fifo0_prog_empty_negate_cfg; +}DPP_PPU_CLUSTER_PPU_RSP_PTR_FWFT_FIFO0_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_rsp_ptr_fwft_fifo1_prog_full_assert_cfg_t +{ + ZXIC_UINT32 ppu_rsp_ptr_fwft_fifo1_prog_full_assert_cfg; +}DPP_PPU_CLUSTER_PPU_RSP_PTR_FWFT_FIFO1_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_rsp_ptr_fwft_fifo1_prog_full_negate_cfg_t +{ + ZXIC_UINT32 ppu_rsp_ptr_fwft_fifo1_prog_full_negate_cfg; +}DPP_PPU_CLUSTER_PPU_RSP_PTR_FWFT_FIFO1_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_rsp_ptr_fwft_fifo1_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 ppu_rsp_ptr_fwft_fifo1_prog_empty_assert_cfg; +}DPP_PPU_CLUSTER_PPU_RSP_PTR_FWFT_FIFO1_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_rsp_ptr_fwft_fifo1_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 ppu_rsp_ptr_fwft_fifo1_prog_empty_negate_cfg; +}DPP_PPU_CLUSTER_PPU_RSP_PTR_FWFT_FIFO1_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_sta_rsp_afifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 sta_rsp_afifo_prog_empty_assert_cfg; +}DPP_PPU_CLUSTER_STA_RSP_AFIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_sta_rsp_afifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 sta_rsp_afifo_prog_empty_negate_cfg; +}DPP_PPU_CLUSTER_STA_RSP_AFIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_sta_rsp_fwft_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 ppu_sta_rsp_fwft_fifo_prog_full_assert_cfg; +}DPP_PPU_CLUSTER_PPU_STA_RSP_FWFT_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_sta_rsp_fwft_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 ppu_sta_rsp_fwft_fifo_prog_full_negate_cfg; +}DPP_PPU_CLUSTER_PPU_STA_RSP_FWFT_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_sta_rsp_fwft_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 ppu_sta_rsp_fwft_fifo_prog_empty_assert_cfg; +}DPP_PPU_CLUSTER_PPU_STA_RSP_FWFT_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_sta_rsp_fwft_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 ppu_sta_rsp_fwft_fifo_prog_empty_negate_cfg; +}DPP_PPU_CLUSTER_PPU_STA_RSP_FWFT_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_cop_rsp_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 cop_rsp_fifo_prog_full_assert_cfg; +}DPP_PPU_CLUSTER_COP_RSP_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_cop_rsp_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 cop_rsp_fifo_prog_full_negate_cfg; +}DPP_PPU_CLUSTER_COP_RSP_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_cop_rsp_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 cop_rsp_fifo_prog_empty_assert_cfg; +}DPP_PPU_CLUSTER_COP_RSP_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_cop_rsp_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 cop_rsp_fifo_prog_empty_negate_cfg; +}DPP_PPU_CLUSTER_COP_RSP_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_mcode_pf_rsp_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 mcode_pf_rsp_fifo_prog_full_assert_cfg; +}DPP_PPU_CLUSTER_MCODE_PF_RSP_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_mcode_pf_rsp_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 mcode_pf_rsp_fifo_prog_full_negate_cfg; +}DPP_PPU_CLUSTER_MCODE_PF_RSP_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_mcode_pf_rsp_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 mcode_pf_rsp_fifo_prog_empty_assert_cfg; +}DPP_PPU_CLUSTER_MCODE_PF_RSP_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_mcode_pf_rsp_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 mcode_pf_rsp_fifo_prog_empty_negate_cfg; +}DPP_PPU_CLUSTER_MCODE_PF_RSP_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_cop_rsp_fwft_fifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 ppu_cop_rsp_fwft_fifo_prog_full_assert_cfg; +}DPP_PPU_CLUSTER_PPU_COP_RSP_FWFT_FIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_cop_rsp_fwft_fifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 ppu_cop_rsp_fwft_fifo_prog_full_negate_cfg; +}DPP_PPU_CLUSTER_PPU_COP_RSP_FWFT_FIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_cop_rsp_fwft_fifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 ppu_cop_rsp_fwft_fifo_prog_empty_assert_cfg; +}DPP_PPU_CLUSTER_PPU_COP_RSP_FWFT_FIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_cop_rsp_fwft_fifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 ppu_cop_rsp_fwft_fifo_prog_empty_negate_cfg; +}DPP_PPU_CLUSTER_PPU_COP_RSP_FWFT_FIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_ise_key_afifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 ppu_ise_key_afifo_prog_full_assert_cfg; +}DPP_PPU_CLUSTER_PPU_ISE_KEY_AFIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_ise_key_afifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 ppu_ise_key_afifo_prog_full_negate_cfg; +}DPP_PPU_CLUSTER_PPU_ISE_KEY_AFIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_ese_key_afifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 ppu_ese_key_afifo_prog_full_assert_cfg; +}DPP_PPU_CLUSTER_PPU_ESE_KEY_AFIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_ese_key_afifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 ppu_ese_key_afifo_prog_full_negate_cfg; +}DPP_PPU_CLUSTER_PPU_ESE_KEY_AFIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_sta_key_afifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 ppu_sta_key_afifo_prog_full_assert_cfg; +}DPP_PPU_CLUSTER_PPU_STA_KEY_AFIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_sta_key_afifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 ppu_sta_key_afifo_prog_full_negate_cfg; +}DPP_PPU_CLUSTER_PPU_STA_KEY_AFIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_int_600m_cluster_mex_fifo_mask_t +{ + ZXIC_UINT32 ppu_se_key_afifo_32x54_wrapper_underflow_mask; + ZXIC_UINT32 ppu_se_key_afifo_32x665_wrapper_underflow_mask; + ZXIC_UINT32 ppu_sta_key_afifo_32x110_wrapper_underflow_mask; + ZXIC_UINT32 ppu_cluster_mf_in_afifo_32x2048_wrapper_overflow_mask; + ZXIC_UINT32 ppu_ese_rsp_afifo_64x271_wrapper_u0_overflow_mask; + ZXIC_UINT32 ppu_ise_rsp_afifo_64x143_wrapper_u0_overflow_mask; + ZXIC_UINT32 ppu_sta_rsp_afifo_64x79_wrapper_overflow_mask; +}DPP_PPU_CLUSTER_INT_600M_CLUSTER_MEX_FIFO_MASK_T; + +typedef struct dpp_ppu_cluster_cluster_mex_fifo_600m_interrupt_flag_t +{ + ZXIC_UINT32 ppu_se_key_afifo_32x54_wrapper_underflow_flag; + ZXIC_UINT32 ppu_se_key_afifo_32x665_wrapper_underflow_flag; + ZXIC_UINT32 ppu_sta_key_afifo_32x110_wrapper_underflow_flag; + ZXIC_UINT32 ppu_cluster_mf_in_afifo_32x2048_wrapper_overflow_flag; + ZXIC_UINT32 ppu_ese_rsp_afifo_64x271_wrapper_u0_overflow_flag; + ZXIC_UINT32 ppu_ise_rsp_afifo_64x143_wrapper_u0_overflow_flag; + ZXIC_UINT32 ppu_sta_rsp_afifo_64x79_wrapper_overflow_flag; +}DPP_PPU_CLUSTER_CLUSTER_MEX_FIFO_600M_INTERRUPT_FLAG_T; + +typedef struct dpp_ppu_cluster_cluster_mex_fifo_600m_interrupt_sta_t +{ + ZXIC_UINT32 ppu_se_key_afifo_32x54_wrapper_underflow_sta; + ZXIC_UINT32 ppu_se_key_afifo_32x665_wrapper_underflow_sta; + ZXIC_UINT32 ppu_sta_key_afifo_32x110_wrapper_underflow_sta; + ZXIC_UINT32 ppu_cluster_mf_in_afifo_32x2048_wrapper_overflow_sta; + ZXIC_UINT32 ppu_ese_rsp_afifo_64x271_wrapper_u0_overflow_sta; + ZXIC_UINT32 ppu_ise_rsp_afifo_64x143_wrapper_u0_overflow_sta; + ZXIC_UINT32 ppu_sta_rsp_afifo_64x79_wrapper_overflow_sta; +}DPP_PPU_CLUSTER_CLUSTER_MEX_FIFO_600M_INTERRUPT_STA_T; + +typedef struct dpp_ppu_cluster_mex_cnt_cfg_t +{ + ZXIC_UINT32 csr_count_overflow_mode; + ZXIC_UINT32 csr_count_rd_mode; +}DPP_PPU_CLUSTER_MEX_CNT_CFG_T; + +typedef struct dpp_ppu_cluster_int_600m_cluster_mex_ram_ecc_error_interrupt_mask_t +{ + ZXIC_UINT32 ppu_sta_key_ram_1r1w_32x110_ecc_double_err_mask; + ZXIC_UINT32 ppu_se_key_afifo_32x665_ecc_double_err_mask; + ZXIC_UINT32 ppu_se_key_afifo_32x54_ecc_double_err_mask; + ZXIC_UINT32 ppu_sta_key_ram_1r1w_32x110_ecc_single_err_flag; + ZXIC_UINT32 ppu_se_key_afifo_32x665_ecc_single_err_mask; + ZXIC_UINT32 ppu_se_key_afifo_32x54_ecc_single_err_mask; +}DPP_PPU_CLUSTER_INT_600M_CLUSTER_MEX_RAM_ECC_ERROR_INTERRUPT_MASK_T; + +typedef struct dpp_ppu_cluster_cluster_mex_ram_600m_ecc_error_interrupt_flag_t +{ + ZXIC_UINT32 ppu_sta_key_ram_1r1w_32x110_ecc_double_err_flag; + ZXIC_UINT32 ppu_se_key_afifo_32x665_ecc_double_err_flag; + ZXIC_UINT32 ppu_se_key_afifo_32x54_ecc_double_err_flag; + ZXIC_UINT32 ppu_sta_key_ram_1r1w_32x110_ecc_single_err_flag; + ZXIC_UINT32 ppu_se_key_afifo_32x665_ecc_single_err_flag; + ZXIC_UINT32 ppu_se_key_afifo_32x54_ecc_single_err_flag; +}DPP_PPU_CLUSTER_CLUSTER_MEX_RAM_600M_ECC_ERROR_INTERRUPT_FLAG_T; + +typedef struct dpp_ppu_cluster_cluster_mex_ram_600m_ecc_error_interrupt_sta_t +{ + ZXIC_UINT32 ppu_sta_key_ram_1r1w_32x110_ecc_double_err_stat; + ZXIC_UINT32 ppu_se_key_afifo_32x665_ecc_double_err_stat; + ZXIC_UINT32 ppu_se_key_afifo_32x54_ecc_double_err_stat; + ZXIC_UINT32 ppu_sta_key_ram_1r1w_32x110_ecc_single_err_stat; + ZXIC_UINT32 ppu_se_key_afifo_32x665_ecc_single_err_stat; + ZXIC_UINT32 ppu_se_key_afifo_32x54_ecc_single_err_stat; +}DPP_PPU_CLUSTER_CLUSTER_MEX_RAM_600M_ECC_ERROR_INTERRUPT_STA_T; + +typedef struct dpp_ppu_cluster_ppu_cluster_mf_in_afifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 ppu_cluster_mf_in_afifo_prog_full_assert_cfg; +}DPP_PPU_CLUSTER_PPU_CLUSTER_MF_IN_AFIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_cluster_mf_in_afifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 ppu_cluster_mf_in_afifo_prog_full_negate_cfg; +}DPP_PPU_CLUSTER_PPU_CLUSTER_MF_IN_AFIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_ese_rsp_afifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 ese_rsp_afifo_prog_full_assert_cfg; +}DPP_PPU_CLUSTER_ESE_RSP_AFIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_ese_rsp_afifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 ese_rsp_afifo_prog_full_negate_cfg; +}DPP_PPU_CLUSTER_ESE_RSP_AFIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_ise_rsp_afifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 ise_rsp_afifo_prog_full_assert_cfg; +}DPP_PPU_CLUSTER_ISE_RSP_AFIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_ise_rsp_afifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 ise_rsp_afifo_prog_full_negate_cfg; +}DPP_PPU_CLUSTER_ISE_RSP_AFIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_sta_rsp_afifo_prog_full_assert_cfg_t +{ + ZXIC_UINT32 sta_rsp_afifo_prog_full_assert_cfg; +}DPP_PPU_CLUSTER_STA_RSP_AFIFO_PROG_FULL_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_sta_rsp_afifo_prog_full_negate_cfg_t +{ + ZXIC_UINT32 sta_rsp_afifo_prog_full_negate_cfg; +}DPP_PPU_CLUSTER_STA_RSP_AFIFO_PROG_FULL_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_ise_key_afifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 ppu_ise_key_afifo_prog_empty_assert_cfg; +}DPP_PPU_CLUSTER_PPU_ISE_KEY_AFIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_ise_key_afifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 ppu_ise_key_afifo_prog_empty_negate_cfg; +}DPP_PPU_CLUSTER_PPU_ISE_KEY_AFIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_ese_key_afifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 ppu_ese_key_afifo_prog_empty_assert_cfg; +}DPP_PPU_CLUSTER_PPU_ESE_KEY_AFIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_ese_key_afifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 ppu_ese_key_afifo_prog_empty_negate_cfg; +}DPP_PPU_CLUSTER_PPU_ESE_KEY_AFIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_sta_key_afifo_prog_empty_assert_cfg_t +{ + ZXIC_UINT32 ppu_sta_key_afifo_prog_empty_assert_cfg; +}DPP_PPU_CLUSTER_PPU_STA_KEY_AFIFO_PROG_EMPTY_ASSERT_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_sta_key_afifo_prog_empty_negate_cfg_t +{ + ZXIC_UINT32 ppu_sta_key_afifo_prog_empty_negate_cfg; +}DPP_PPU_CLUSTER_PPU_STA_KEY_AFIFO_PROG_EMPTY_NEGATE_CFG_T; + +typedef struct dpp_ppu_cluster_ppu_cluster_mf_vld_cnt_h_t +{ + ZXIC_UINT32 ppu_cluster_mf_vld_cnt_h; +}DPP_PPU_CLUSTER_PPU_CLUSTER_MF_VLD_CNT_H_T; + +typedef struct dpp_ppu_cluster_ppu_cluster_mf_vld_cnt_l_t +{ + ZXIC_UINT32 ppu_cluster_mf_vld_cnt_l; +}DPP_PPU_CLUSTER_PPU_CLUSTER_MF_VLD_CNT_L_T; + +typedef struct dpp_ppu_cluster_cluster_ise_key_out_vld_cnt_t +{ + ZXIC_UINT32 cluster_ise_key_out_vld_cnt; +}DPP_PPU_CLUSTER_CLUSTER_ISE_KEY_OUT_VLD_CNT_T; + +typedef struct dpp_ppu_cluster_ise_cluster_rsp_in_vld_cnt_t +{ + ZXIC_UINT32 ise_cluster_rsp_in_vld_cnt; +}DPP_PPU_CLUSTER_ISE_CLUSTER_RSP_IN_VLD_CNT_T; + +typedef struct dpp_ppu_cluster_cluster_ese_key_out_vld_cnt_t +{ + ZXIC_UINT32 cluster_ese_key_out_vld_cnt; +}DPP_PPU_CLUSTER_CLUSTER_ESE_KEY_OUT_VLD_CNT_T; + +typedef struct dpp_ppu_cluster_ese_cluster_rsp_in_vld_cnt_t +{ + ZXIC_UINT32 ese_cluster_rsp_in_vld_cnt; +}DPP_PPU_CLUSTER_ESE_CLUSTER_RSP_IN_VLD_CNT_T; + +typedef struct dpp_ppu_cluster_cluster_stat_cmd_vld_cnt_t +{ + ZXIC_UINT32 cluster_stat_cmd_vld_cnt; +}DPP_PPU_CLUSTER_CLUSTER_STAT_CMD_VLD_CNT_T; + +typedef struct dpp_ppu_cluster_stat_cluster_rsp_vld_cnt_t +{ + ZXIC_UINT32 stat_cluster_rsp_vld_cnt; +}DPP_PPU_CLUSTER_STAT_CLUSTER_RSP_VLD_CNT_T; + +typedef struct dpp_ppu_cluster_mex_debug_key_vld_cnt_t +{ + ZXIC_UINT32 mex_debug_key_vld_cnt; +}DPP_PPU_CLUSTER_MEX_DEBUG_KEY_VLD_CNT_T; + +typedef struct dpp_ppu_cluster_ise_cluster_key_fc_cnt_t +{ + ZXIC_UINT32 ise_cluster_key_fc_cnt; +}DPP_PPU_CLUSTER_ISE_CLUSTER_KEY_FC_CNT_T; + +typedef struct dpp_ppu_cluster_ese_cluster_key_fc_cnt_t +{ + ZXIC_UINT32 ese_cluster_key_fc_cnt; +}DPP_PPU_CLUSTER_ESE_CLUSTER_KEY_FC_CNT_T; + +typedef struct dpp_ppu_cluster_cluster_ise_rsp_fc_cnt_t +{ + ZXIC_UINT32 cluster_ise_rsp_fc_cnt; +}DPP_PPU_CLUSTER_CLUSTER_ISE_RSP_FC_CNT_T; + +typedef struct dpp_ppu_cluster_cluster_ese_rsp_fc_cnt_t +{ + ZXIC_UINT32 cluster_ese_rsp_fc_cnt; +}DPP_PPU_CLUSTER_CLUSTER_ESE_RSP_FC_CNT_T; + +typedef struct dpp_ppu_cluster_stat_cluster_cmd_fc_cnt_t +{ + ZXIC_UINT32 stat_cluster_cmd_fc_cnt; +}DPP_PPU_CLUSTER_STAT_CLUSTER_CMD_FC_CNT_T; + +typedef struct dpp_ppu_cluster_cluster_stat_rsp_fc_cnt_t +{ + ZXIC_UINT32 cluster_stat_rsp_fc_cnt; +}DPP_PPU_CLUSTER_CLUSTER_STAT_RSP_FC_CNT_T; + +typedef struct dpp_ppu_cluster_cluster_ppu_mf_vld_cnt_l_t +{ + ZXIC_UINT32 cluster_ppu_mf_vld_cnt_l; +}DPP_PPU_CLUSTER_CLUSTER_PPU_MF_VLD_CNT_L_T; + +typedef struct dpp_ppu_cluster_cluster_ppu_mf_vld_cnt_h_t +{ + ZXIC_UINT32 cluster_ppu_mf_vld_cnt_h; +}DPP_PPU_CLUSTER_CLUSTER_PPU_MF_VLD_CNT_H_T; + +typedef struct dpp_ppu_cluster_cluster_cop_key_vld_cnt_l_t +{ + ZXIC_UINT32 cluster_cop_key_vld_cnt_l; +}DPP_PPU_CLUSTER_CLUSTER_COP_KEY_VLD_CNT_L_T; + +typedef struct dpp_ppu_cluster_cluster_cop_key_vld_cnt_h_t +{ + ZXIC_UINT32 cluster_cop_key_vld_cnt_h; +}DPP_PPU_CLUSTER_CLUSTER_COP_KEY_VLD_CNT_H_T; + +typedef struct dpp_ppu_cluster_cop_cluster_rsp_vld_cnt_l_t +{ + ZXIC_UINT32 cop_cluster_rsp_vld_cnt_l; +}DPP_PPU_CLUSTER_COP_CLUSTER_RSP_VLD_CNT_L_T; + +typedef struct dpp_ppu_cluster_cop_cluster_rsp_vld_cnt_h_t +{ + ZXIC_UINT32 cop_cluster_rsp_vld_cnt_h; +}DPP_PPU_CLUSTER_COP_CLUSTER_RSP_VLD_CNT_H_T; + +typedef struct dpp_ppu_cluster_mex_me_pkt_in_sop_cnt_l_t +{ + ZXIC_UINT32 mex_me_pkt_in_sop_cnt_l; +}DPP_PPU_CLUSTER_MEX_ME_PKT_IN_SOP_CNT_L_T; + +typedef struct dpp_ppu_cluster_mex_me_pkt_in_sop_cnt_h_t +{ + ZXIC_UINT32 mex_me_pkt_in_sop_cnt_h; +}DPP_PPU_CLUSTER_MEX_ME_PKT_IN_SOP_CNT_H_T; + +typedef struct dpp_ppu_cluster_mex_me_pkt_in_eop_cnt_l_t +{ + ZXIC_UINT32 mex_me_pkt_in_eop_cnt_l; +}DPP_PPU_CLUSTER_MEX_ME_PKT_IN_EOP_CNT_L_T; + +typedef struct dpp_ppu_cluster_mex_me_pkt_in_eop_cnt_h_t +{ + ZXIC_UINT32 mex_me_pkt_in_eop_cnt_h; +}DPP_PPU_CLUSTER_MEX_ME_PKT_IN_EOP_CNT_H_T; + +typedef struct dpp_ppu_cluster_mex_me_pkt_in_vld_cnt_l_t +{ + ZXIC_UINT32 mex_me_pkt_in_vld_cnt_l; +}DPP_PPU_CLUSTER_MEX_ME_PKT_IN_VLD_CNT_L_T; + +typedef struct dpp_ppu_cluster_mex_me_pkt_in_vld_cnt_h_t +{ + ZXIC_UINT32 mex_me_pkt_in_vld_cnt_h; +}DPP_PPU_CLUSTER_MEX_ME_PKT_IN_VLD_CNT_H_T; + +typedef struct dpp_ppu_cluster_me_mex_pkt_out_sop_cnt_l_t +{ + ZXIC_UINT32 me_mex_pkt_out_sop_cnt_l; +}DPP_PPU_CLUSTER_ME_MEX_PKT_OUT_SOP_CNT_L_T; + +typedef struct dpp_ppu_cluster_me_mex_pkt_out_sop_cnt_h_t +{ + ZXIC_UINT32 me_mex_pkt_out_sop_cnt_h; +}DPP_PPU_CLUSTER_ME_MEX_PKT_OUT_SOP_CNT_H_T; + +typedef struct dpp_ppu_cluster_me_mex_pkt_out_eop_cnt_l_t +{ + ZXIC_UINT32 me_mex_pkt_out_eop_cnt_l; +}DPP_PPU_CLUSTER_ME_MEX_PKT_OUT_EOP_CNT_L_T; + +typedef struct dpp_ppu_cluster_me_mex_pkt_out_eop_cnt_h_t +{ + ZXIC_UINT32 me_mex_pkt_out_eop_cnt_h; +}DPP_PPU_CLUSTER_ME_MEX_PKT_OUT_EOP_CNT_H_T; + +typedef struct dpp_ppu_cluster_me_mex_pkt_out_vld_cnt_l_t +{ + ZXIC_UINT32 me_mex_pkt_out_vld_cnt_l; +}DPP_PPU_CLUSTER_ME_MEX_PKT_OUT_VLD_CNT_L_T; + +typedef struct dpp_ppu_cluster_me_mex_pkt_out_vld_cnt_h_t +{ + ZXIC_UINT32 me_mex_pkt_out_vld_cnt_h; +}DPP_PPU_CLUSTER_ME_MEX_PKT_OUT_VLD_CNT_H_T; + +typedef struct dpp_ppu_cluster_me_mex_i_key_out_sop_cnt_l_t +{ + ZXIC_UINT32 me_mex_i_key_out_sop_cnt_l; +}DPP_PPU_CLUSTER_ME_MEX_I_KEY_OUT_SOP_CNT_L_T; + +typedef struct dpp_ppu_cluster_me_mex_i_key_out_sop_cnt_h_t +{ + ZXIC_UINT32 me_mex_i_key_out_sop_cnt_h; +}DPP_PPU_CLUSTER_ME_MEX_I_KEY_OUT_SOP_CNT_H_T; + +typedef struct dpp_ppu_cluster_me_mex_i_key_out_eop_cnt_l_t +{ + ZXIC_UINT32 me_mex_i_key_out_eop_cnt_l; +}DPP_PPU_CLUSTER_ME_MEX_I_KEY_OUT_EOP_CNT_L_T; + +typedef struct dpp_ppu_cluster_me_mex_i_key_out_eop_cnt_h_t +{ + ZXIC_UINT32 me_mex_i_key_out_eop_cnt_h; +}DPP_PPU_CLUSTER_ME_MEX_I_KEY_OUT_EOP_CNT_H_T; + +typedef struct dpp_ppu_cluster_me_mex_i_key_out_vld_cnt_l_t +{ + ZXIC_UINT32 me_mex_i_key_out_vld_cnt_l; +}DPP_PPU_CLUSTER_ME_MEX_I_KEY_OUT_VLD_CNT_L_T; + +typedef struct dpp_ppu_cluster_me_mex_i_key_out_vld_cnt_h_t +{ + ZXIC_UINT32 me_mex_i_key_out_vld_cnt_h; +}DPP_PPU_CLUSTER_ME_MEX_I_KEY_OUT_VLD_CNT_H_T; + +typedef struct dpp_ppu_cluster_me_mex_e_key_out_sop_cnt_l_t +{ + ZXIC_UINT32 me_mex_e_key_out_sop_cnt_l; +}DPP_PPU_CLUSTER_ME_MEX_E_KEY_OUT_SOP_CNT_L_T; + +typedef struct dpp_ppu_cluster_me_mex_e_key_out_sop_cnt_h_t +{ + ZXIC_UINT32 me_mex_e_key_out_sop_cnt_h; +}DPP_PPU_CLUSTER_ME_MEX_E_KEY_OUT_SOP_CNT_H_T; + +typedef struct dpp_ppu_cluster_me_mex_e_key_out_eop_cnt_l_t +{ + ZXIC_UINT32 me_mex_e_key_out_eop_cnt_l; +}DPP_PPU_CLUSTER_ME_MEX_E_KEY_OUT_EOP_CNT_L_T; + +typedef struct dpp_ppu_cluster_me_mex_e_key_out_eop_cnt_h_t +{ + ZXIC_UINT32 me_mex_e_key_out_eop_cnt_h; +}DPP_PPU_CLUSTER_ME_MEX_E_KEY_OUT_EOP_CNT_H_T; + +typedef struct dpp_ppu_cluster_me_mex_e_key_out_vld_cnt_l_t +{ + ZXIC_UINT32 me_mex_e_key_out_vld_cnt_l; +}DPP_PPU_CLUSTER_ME_MEX_E_KEY_OUT_VLD_CNT_L_T; + +typedef struct dpp_ppu_cluster_me_mex_e_key_out_vld_cnt_h_t +{ + ZXIC_UINT32 me_mex_e_key_out_vld_cnt_h; +}DPP_PPU_CLUSTER_ME_MEX_E_KEY_OUT_VLD_CNT_H_T; + +typedef struct dpp_ppu_cluster_me_mex_demux_ise_key_vld_cnt_l_t +{ + ZXIC_UINT32 me_mex_demux_ise_key_vld_cnt_l; +}DPP_PPU_CLUSTER_ME_MEX_DEMUX_ISE_KEY_VLD_CNT_L_T; + +typedef struct dpp_ppu_cluster_me_mex_demux_ise_key_vld_cnt_h_t +{ + ZXIC_UINT32 me_mex_demux_ise_key_vld_cnt_h; +}DPP_PPU_CLUSTER_ME_MEX_DEMUX_ISE_KEY_VLD_CNT_H_T; + +typedef struct dpp_ppu_cluster_me_mex_demux_ese_key_vld_cnt_l_t +{ + ZXIC_UINT32 me_mex_demux_ese_key_vld_cnt_l; +}DPP_PPU_CLUSTER_ME_MEX_DEMUX_ESE_KEY_VLD_CNT_L_T; + +typedef struct dpp_ppu_cluster_me_mex_demux_ese_key_vld_cnt_h_t +{ + ZXIC_UINT32 me_mex_demux_ese_key_vld_cnt_h; +}DPP_PPU_CLUSTER_ME_MEX_DEMUX_ESE_KEY_VLD_CNT_H_T; + +typedef struct dpp_ppu_cluster_me_mex_demux_sta_key_vld_cnt_l_t +{ + ZXIC_UINT32 me_mex_demux_sta_key_vld_cnt_l; +}DPP_PPU_CLUSTER_ME_MEX_DEMUX_STA_KEY_VLD_CNT_L_T; + +typedef struct dpp_ppu_cluster_me_mex_demux_sta_key_vld_cnt_h_t +{ + ZXIC_UINT32 me_mex_demux_sta_key_vld_cnt_h; +}DPP_PPU_CLUSTER_ME_MEX_DEMUX_STA_KEY_VLD_CNT_H_T; + +typedef struct dpp_ppu_cluster_me_mex_demux_cop_key_vld_cnt_l_t +{ + ZXIC_UINT32 me_mex_demux_cop_key_vld_cnt_l; +}DPP_PPU_CLUSTER_ME_MEX_DEMUX_COP_KEY_VLD_CNT_L_T; + +typedef struct dpp_ppu_cluster_me_mex_demux_cop_key_vld_cnt_h_t +{ + ZXIC_UINT32 me_mex_demux_cop_key_vld_cnt_h; +}DPP_PPU_CLUSTER_ME_MEX_DEMUX_COP_KEY_VLD_CNT_H_T; + +typedef struct dpp_ppu_cluster_mex_me_demux_ise_rsp_vld_cnt_l_t +{ + ZXIC_UINT32 mex_me_demux_ise_rsp_vld_cnt_l; +}DPP_PPU_CLUSTER_MEX_ME_DEMUX_ISE_RSP_VLD_CNT_L_T; + +typedef struct dpp_ppu_cluster_mex_me_demux_ise_rsp_vld_cnt_h_t +{ + ZXIC_UINT32 mex_me_demux_ise_rsp_vld_cnt_h; +}DPP_PPU_CLUSTER_MEX_ME_DEMUX_ISE_RSP_VLD_CNT_H_T; + +typedef struct dpp_ppu_cluster_mex_me_demux_ese_rsp_vld_cnt_l_t +{ + ZXIC_UINT32 mex_me_demux_ese_rsp_vld_cnt_l; +}DPP_PPU_CLUSTER_MEX_ME_DEMUX_ESE_RSP_VLD_CNT_L_T; + +typedef struct dpp_ppu_cluster_mex_me_demux_ese_rsp_vld_cnt_h_t +{ + ZXIC_UINT32 mex_me_demux_ese_rsp_vld_cnt_h; +}DPP_PPU_CLUSTER_MEX_ME_DEMUX_ESE_RSP_VLD_CNT_H_T; + +typedef struct dpp_ppu_cluster_mex_me_demux_sta_rsp_vld_cnt_l_t +{ + ZXIC_UINT32 mex_me_demux_sta_rsp_vld_cnt_l; +}DPP_PPU_CLUSTER_MEX_ME_DEMUX_STA_RSP_VLD_CNT_L_T; + +typedef struct dpp_ppu_cluster_mex_me_demux_sta_rsp_vld_cnt_h_t +{ + ZXIC_UINT32 mex_me_demux_sta_rsp_vld_cnt_h; +}DPP_PPU_CLUSTER_MEX_ME_DEMUX_STA_RSP_VLD_CNT_H_T; + +typedef struct dpp_ppu_cluster_mex_me_demux_cop_rsp_vld_cnt_l_t +{ + ZXIC_UINT32 mex_me_demux_cop_rsp_vld_cnt_l; +}DPP_PPU_CLUSTER_MEX_ME_DEMUX_COP_RSP_VLD_CNT_L_T; + +typedef struct dpp_ppu_cluster_mex_me_demux_cop_rsp_vld_cnt_h_t +{ + ZXIC_UINT32 mex_me_demux_cop_rsp_vld_cnt_h; +}DPP_PPU_CLUSTER_MEX_ME_DEMUX_COP_RSP_VLD_CNT_H_T; + +typedef struct dpp_ppu_cluster_me_exception_code0_cnt_l_t +{ + ZXIC_UINT32 me_exception_code0_cnt_l; +}DPP_PPU_CLUSTER_ME_EXCEPTION_CODE0_CNT_L_T; + +typedef struct dpp_ppu_cluster_me_exception_code0_cnt_h_t +{ + ZXIC_UINT32 me_exception_code0_cnt_h; +}DPP_PPU_CLUSTER_ME_EXCEPTION_CODE0_CNT_H_T; + +typedef struct dpp_ppu_cluster_me_exception_code1_cnt_l_t +{ + ZXIC_UINT32 me_exception_code1_cnt_l; +}DPP_PPU_CLUSTER_ME_EXCEPTION_CODE1_CNT_L_T; + +typedef struct dpp_ppu_cluster_me_exception_code1_cnt_h_t +{ + ZXIC_UINT32 me_exception_code1_cnt_h; +}DPP_PPU_CLUSTER_ME_EXCEPTION_CODE1_CNT_H_T; + +typedef struct dpp_ppu_cluster_me_exception_code2_cnt_l_t +{ + ZXIC_UINT32 me_exception_code2_cnt_l; +}DPP_PPU_CLUSTER_ME_EXCEPTION_CODE2_CNT_L_T; + +typedef struct dpp_ppu_cluster_me_exception_code2_cnt_h_t +{ + ZXIC_UINT32 me_exception_code2_cnt_h; +}DPP_PPU_CLUSTER_ME_EXCEPTION_CODE2_CNT_H_T; + +typedef struct dpp_ppu_cluster_me_exception_code3_cnt_l_t +{ + ZXIC_UINT32 me_exception_code3_cnt_l; +}DPP_PPU_CLUSTER_ME_EXCEPTION_CODE3_CNT_L_T; + +typedef struct dpp_ppu_cluster_me_exception_code3_cnt_h_t +{ + ZXIC_UINT32 me_exception_code3_cnt_h; +}DPP_PPU_CLUSTER_ME_EXCEPTION_CODE3_CNT_H_T; + +typedef struct dpp_ppu_cluster_me_exception_code4_cnt_l_t +{ + ZXIC_UINT32 me_exception_code4_cnt_l; +}DPP_PPU_CLUSTER_ME_EXCEPTION_CODE4_CNT_L_T; + +typedef struct dpp_ppu_cluster_me_exception_code4_cnt_h_t +{ + ZXIC_UINT32 me_exception_code4_cnt_h; +}DPP_PPU_CLUSTER_ME_EXCEPTION_CODE4_CNT_H_T; + +typedef struct dpp_ppu_cluster_me_exception_code5_cnt_l_t +{ + ZXIC_UINT32 me_exception_code5_cnt_l; +}DPP_PPU_CLUSTER_ME_EXCEPTION_CODE5_CNT_L_T; + +typedef struct dpp_ppu_cluster_me_exception_code5_cnt_h_t +{ + ZXIC_UINT32 me_exception_code5_cnt_h; +}DPP_PPU_CLUSTER_ME_EXCEPTION_CODE5_CNT_H_T; + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_ptptm_reg.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_ptptm_reg.h new file mode 100644 index 0000000..db871f4 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_ptptm_reg.h @@ -0,0 +1,895 @@ + +#ifndef _DPP_PTPTM_REG_H_ +#define _DPP_PTPTM_REG_H_ + +#ifdef __cplusplus +extern "C"{ +#endif + +typedef struct dpp_ptptm_ptp_top_pp1s_interrupt_t +{ + ZXIC_UINT32 int_state; + ZXIC_UINT32 int_test; + ZXIC_UINT32 int_clr; + ZXIC_UINT32 int_en; +}DPP_PTPTM_PTP_TOP_PP1S_INTERRUPT_T; + +typedef struct dpp_ptptm_ptp_top_pp1s_external_select_t +{ + ZXIC_UINT32 pp1s_external_select; +}DPP_PTPTM_PTP_TOP_PP1S_EXTERNAL_SELECT_T; + +typedef struct dpp_ptptm_ptp_top_pp1s_out_select_t +{ + ZXIC_UINT32 pp1s_out_sel; +}DPP_PTPTM_PTP_TOP_PP1S_OUT_SELECT_T; + +typedef struct dpp_ptptm_ptp_top_test_pp1s_select_t +{ + ZXIC_UINT32 test_pp1s_sel; +}DPP_PTPTM_PTP_TOP_TEST_PP1S_SELECT_T; + +typedef struct dpp_ptptm_ptp_top_local_pp1s_en_t +{ + ZXIC_UINT32 local_pp1s_en; +}DPP_PTPTM_PTP_TOP_LOCAL_PP1S_EN_T; + +typedef struct dpp_ptptm_ptp_top_local_pp1s_adjust_t +{ + ZXIC_UINT32 local_pp1s_adjust_sel; + ZXIC_UINT32 local_pp1s_adjust_en; +}DPP_PTPTM_PTP_TOP_LOCAL_PP1S_ADJUST_T; + +typedef struct dpp_ptptm_ptp_top_local_pp1s_adjust_value_t +{ + ZXIC_UINT32 local_pp1s_adjust_value; +}DPP_PTPTM_PTP_TOP_LOCAL_PP1S_ADJUST_VALUE_T; + +typedef struct dpp_ptptm_ptp_top_pp1s_to_np_select_t +{ + ZXIC_UINT32 pp1s_to_np_sel; +}DPP_PTPTM_PTP_TOP_PP1S_TO_NP_SELECT_T; + +typedef struct dpp_ptptm_ptp_top_pd_u1_sel_t +{ + ZXIC_UINT32 pd_u1_sel1; + ZXIC_UINT32 pd_u1_sel0; +}DPP_PTPTM_PTP_TOP_PD_U1_SEL_T; + +typedef struct dpp_ptptm_ptp_top_pd_u1_pd0_shift_t +{ + ZXIC_UINT32 pd_u1_pd0_shift; +}DPP_PTPTM_PTP_TOP_PD_U1_PD0_SHIFT_T; + +typedef struct dpp_ptptm_ptp_top_pd_u1_pd1_shift_t +{ + ZXIC_UINT32 pd_u1_pd1_shift; +}DPP_PTPTM_PTP_TOP_PD_U1_PD1_SHIFT_T; + +typedef struct dpp_ptptm_ptp_top_pd_u1_result_t +{ + ZXIC_UINT32 pd_u1_result_sign; + ZXIC_UINT32 pd_u1_overflow; + ZXIC_UINT32 pd_u1_result; +}DPP_PTPTM_PTP_TOP_PD_U1_RESULT_T; + +typedef struct dpp_ptptm_ptp_top_pd_u2_sel_t +{ + ZXIC_UINT32 pd_u2_sel1; + ZXIC_UINT32 pd_u2_sel0; +}DPP_PTPTM_PTP_TOP_PD_U2_SEL_T; + +typedef struct dpp_ptptm_ptp_top_pd_u2_pd0_shift_t +{ + ZXIC_UINT32 pd_u2_pd0_shift; +}DPP_PTPTM_PTP_TOP_PD_U2_PD0_SHIFT_T; + +typedef struct dpp_ptptm_ptp_top_pd_u2_pd1_shift_t +{ + ZXIC_UINT32 pd_u2_pd1_shift; +}DPP_PTPTM_PTP_TOP_PD_U2_PD1_SHIFT_T; + +typedef struct dpp_ptptm_ptp_top_pd_u2_result_t +{ + ZXIC_UINT32 pd_u2_result_sign; + ZXIC_UINT32 pd_u2_overflow; + ZXIC_UINT32 pd_u2_result; +}DPP_PTPTM_PTP_TOP_PD_U2_RESULT_T; + +typedef struct dpp_ptptm_ptp_top_tsn_group_nanosecond_delay0_t +{ + ZXIC_UINT32 tsn_group_nanosecond_delay0; +}DPP_PTPTM_PTP_TOP_TSN_GROUP_NANOSECOND_DELAY0_T; + +typedef struct dpp_ptptm_ptp_top_tsn_group_fracnanosecond_delay0_t +{ + ZXIC_UINT32 tsn_group_fracnanosecond_delay0; +}DPP_PTPTM_PTP_TOP_TSN_GROUP_FRACNANOSECOND_DELAY0_T; + +typedef struct dpp_ptptm_ptp_top_tsn_group_nanosecond_delay1_t +{ + ZXIC_UINT32 tsn_group_nanosecond_delay1; +}DPP_PTPTM_PTP_TOP_TSN_GROUP_NANOSECOND_DELAY1_T; + +typedef struct dpp_ptptm_ptp_top_tsn_group_fracnanosecond_delay1_t +{ + ZXIC_UINT32 tsn_group_fracnanosecond_delay1; +}DPP_PTPTM_PTP_TOP_TSN_GROUP_FRACNANOSECOND_DELAY1_T; + +typedef struct dpp_ptptm_ptp_top_tsn_group_nanosecond_delay2_t +{ + ZXIC_UINT32 tsn_group_nanosecond_delay2; +}DPP_PTPTM_PTP_TOP_TSN_GROUP_NANOSECOND_DELAY2_T; + +typedef struct dpp_ptptm_ptp_top_tsn_group_fracnanosecond_delay2_t +{ + ZXIC_UINT32 tsn_group_fracnanosecond_delay2; +}DPP_PTPTM_PTP_TOP_TSN_GROUP_FRACNANOSECOND_DELAY2_T; + +typedef struct dpp_ptptm_ptp_top_tsn_group_nanosecond_delay3_t +{ + ZXIC_UINT32 tsn_group_nanosecond_delay3; +}DPP_PTPTM_PTP_TOP_TSN_GROUP_NANOSECOND_DELAY3_T; + +typedef struct dpp_ptptm_ptp_top_tsn_group_fracnanosecond_delay3_t +{ + ZXIC_UINT32 tsn_group_fracnanosecond_delay3; +}DPP_PTPTM_PTP_TOP_TSN_GROUP_FRACNANOSECOND_DELAY3_T; + +typedef struct dpp_ptptm_ptp_top_tsn_ptp1588_rdma_nanosecond_delay_t +{ + ZXIC_UINT32 ptp1588_rdma_nanosecond_delay; +}DPP_PTPTM_PTP_TOP_TSN_PTP1588_RDMA_NANOSECOND_DELAY_T; + +typedef struct dpp_ptptm_ptp_top_ptp1588_rdma_fracnanosecond_delay_t +{ + ZXIC_UINT32 ptp1588_rdma_fracnanosecond_delay; +}DPP_PTPTM_PTP_TOP_PTP1588_RDMA_FRACNANOSECOND_DELAY_T; + +typedef struct dpp_ptptm_ptp_top_ptp1588_np_nanosecond_delay_t +{ + ZXIC_UINT32 ptp1588_np_nanosecond_delay; +}DPP_PTPTM_PTP_TOP_PTP1588_NP_NANOSECOND_DELAY_T; + +typedef struct dpp_ptptm_ptp_top_ptp1588_np_fracnanosecond_delay_t +{ + ZXIC_UINT32 ptp1588_np_fracnanosecond_delay; +}DPP_PTPTM_PTP_TOP_PTP1588_NP_FRACNANOSECOND_DELAY_T; + +typedef struct dpp_ptptm_ptp_top_time_sync_period_t +{ + ZXIC_UINT32 time_sync_period; +}DPP_PTPTM_PTP_TOP_TIME_SYNC_PERIOD_T; + +typedef struct dpp_ptptm_ptptm_module_id_t +{ + ZXIC_UINT32 module_id; +}DPP_PTPTM_PTPTM_MODULE_ID_T; + +typedef struct dpp_ptptm_ptptm_module_version_t +{ + ZXIC_UINT32 module_major_version; + ZXIC_UINT32 module_minor_version; +}DPP_PTPTM_PTPTM_MODULE_VERSION_T; + +typedef struct dpp_ptptm_ptptm_module_date_t +{ + ZXIC_UINT32 year; + ZXIC_UINT32 month; + ZXIC_UINT32 date; +}DPP_PTPTM_PTPTM_MODULE_DATE_T; + +typedef struct dpp_ptptm_ptptm_interrupt_status_t +{ + ZXIC_UINT32 pps_in_status; + ZXIC_UINT32 fifo_almost_full_status; + ZXIC_UINT32 fifo_no_empty_status; + ZXIC_UINT32 trigger_output_status; + ZXIC_UINT32 trigger_input_status; +}DPP_PTPTM_PTPTM_INTERRUPT_STATUS_T; + +typedef struct dpp_ptptm_ptptm_interrupt_event_t +{ + ZXIC_UINT32 pps_in_event; + ZXIC_UINT32 fifo_almost_full_event; + ZXIC_UINT32 fifo_no_empty_event; + ZXIC_UINT32 trigger_output_event; + ZXIC_UINT32 trigger_input_event; +}DPP_PTPTM_PTPTM_INTERRUPT_EVENT_T; + +typedef struct dpp_ptptm_ptptm_interrupt_mask_t +{ + ZXIC_UINT32 pps_in_event_mask; + ZXIC_UINT32 fifo_almost_full_event_mask; + ZXIC_UINT32 fifo_no_empty_event_mask; + ZXIC_UINT32 trigger_output_event_mask; + ZXIC_UINT32 trigger_input_eventt_mask; +}DPP_PTPTM_PTPTM_INTERRUPT_MASK_T; + +typedef struct dpp_ptptm_ptptm_interrupt_test_t +{ + ZXIC_UINT32 trigger_pps_in_event_test; + ZXIC_UINT32 trigger_fifo_almost_full_event_test; + ZXIC_UINT32 trigger_fifo_no_empty_event_test; + ZXIC_UINT32 trigger_output_event_test; + ZXIC_UINT32 trigger_input_event_test; +}DPP_PTPTM_PTPTM_INTERRUPT_TEST_T; + +typedef struct dpp_ptptm_ptptm_hw_clock_cycle_integer_t +{ + ZXIC_UINT32 integeral_nanosecond_of_hw_clock_cycle; +}DPP_PTPTM_PTPTM_HW_CLOCK_CYCLE_INTEGER_T; + +typedef struct dpp_ptptm_ptptm_hw_clock_cycle_fraction_t +{ + ZXIC_UINT32 fractional_nanosecond_of_hw_clock_cycle; +}DPP_PTPTM_PTPTM_HW_CLOCK_CYCLE_FRACTION_T; + +typedef struct dpp_ptptm_ptptm_ptp_clock_cycle_integer_t +{ + ZXIC_UINT32 integeral_nanosecond_of_ptp_clock_cycle; +}DPP_PTPTM_PTPTM_PTP_CLOCK_CYCLE_INTEGER_T; + +typedef struct dpp_ptptm_ptptm_ptp_clock_cycle_fraction_t +{ + ZXIC_UINT32 fractional_nanosecond_of_ptp_clock_cycle; +}DPP_PTPTM_PTPTM_PTP_CLOCK_CYCLE_FRACTION_T; + +typedef struct dpp_ptptm_ptptm_ptp_configuration_t +{ + ZXIC_UINT32 trig_oe; + ZXIC_UINT32 hw_time_update_en; + ZXIC_UINT32 ptp1588_tod_time_update_en; + ZXIC_UINT32 timer_enable; + ZXIC_UINT32 pps_output_enable; + ZXIC_UINT32 pp1_output_enable; + ZXIC_UINT32 pp2_output_enable; + ZXIC_UINT32 enable_writing_timestamps_to_the_fifo; + ZXIC_UINT32 l2s_time_output_select; + ZXIC_UINT32 reserved_9; + ZXIC_UINT32 pps_input_select; + ZXIC_UINT32 pp_output_select; + ZXIC_UINT32 reserved_6; + ZXIC_UINT32 timer_run_mode; + ZXIC_UINT32 update_command_select; + ZXIC_UINT32 trigger_out_enable; + ZXIC_UINT32 trigger_in_enable; + ZXIC_UINT32 timer_capture_slave_mode; +}DPP_PTPTM_PTPTM_PTP_CONFIGURATION_T; + +typedef struct dpp_ptptm_ptptm_timer_control_t +{ + ZXIC_UINT32 ptpmoutputsynchroningstate; + ZXIC_UINT32 ptp1588_fifo_read_command; + ZXIC_UINT32 adjust_the_timer; +}DPP_PTPTM_PTPTM_TIMER_CONTROL_T; + +typedef struct dpp_ptptm_ptptm_pps_income_delay_t +{ + ZXIC_UINT32 pps_income_delay_nanosecond; + ZXIC_UINT32 pps_income_delay_frac_nanosecond; +}DPP_PTPTM_PTPTM_PPS_INCOME_DELAY_T; + +typedef struct dpp_ptptm_ptptm_clock_cycle_update_t +{ + ZXIC_UINT32 tsn3_clock_cycle_update_enable; + ZXIC_UINT32 tsn2_clock_cycle_update_enable; + ZXIC_UINT32 tsn1_clock_cycle_update_enable; + ZXIC_UINT32 tsn0_clock_cycle_update_enable; + ZXIC_UINT32 ptp1588_clock_cycle_update_enable; +}DPP_PTPTM_PTPTM_CLOCK_CYCLE_UPDATE_T; + +typedef struct dpp_ptptm_ptptm_cycle_time_of_output_period_pulse_1_t +{ + ZXIC_UINT32 clock_number_of_output_period_pulse_1; +}DPP_PTPTM_PTPTM_CYCLE_TIME_OF_OUTPUT_PERIOD_PULSE_1_T; + +typedef struct dpp_ptptm_ptptm_cycle_time_of_output_period_pulse_2_t +{ + ZXIC_UINT32 clock_number_of_output_period_pulse_2; +}DPP_PTPTM_PTPTM_CYCLE_TIME_OF_OUTPUT_PERIOD_PULSE_2_T; + +typedef struct dpp_ptptm_ptptm_timer_latch_en_t +{ + ZXIC_UINT32 latch_the_timer_en; +}DPP_PTPTM_PTPTM_TIMER_LATCH_EN_T; + +typedef struct dpp_ptptm_ptptm_timer_latch_sel_t +{ + ZXIC_UINT32 timer_latch_sel; +}DPP_PTPTM_PTPTM_TIMER_LATCH_SEL_T; + +typedef struct dpp_ptptm_ptptm_trigger_in_tod_nanosecond_t +{ + ZXIC_UINT32 trigger_in_tod_nanosecond; +}DPP_PTPTM_PTPTM_TRIGGER_IN_TOD_NANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_trigger_in_lower_tod_second_t +{ + ZXIC_UINT32 trigger_in_lower_tod_second; +}DPP_PTPTM_PTPTM_TRIGGER_IN_LOWER_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_trigger_in_high_tod_second_t +{ + ZXIC_UINT32 trigger_in_high_tod_second; +}DPP_PTPTM_PTPTM_TRIGGER_IN_HIGH_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_trigger_in_fracnanosecond_t +{ + ZXIC_UINT32 trigger_in_fracnanosecond; +}DPP_PTPTM_PTPTM_TRIGGER_IN_FRACNANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_trigger_in_hardware_time_low_t +{ + ZXIC_UINT32 trigger_in_hardware_time_low; +}DPP_PTPTM_PTPTM_TRIGGER_IN_HARDWARE_TIME_LOW_T; + +typedef struct dpp_ptptm_ptptm_trigger_in_hardware_time_high_t +{ + ZXIC_UINT32 trigger_in_hardware_time_high; +}DPP_PTPTM_PTPTM_TRIGGER_IN_HARDWARE_TIME_HIGH_T; + +typedef struct dpp_ptptm_ptptm_trigger_out_tod_nanosecond_t +{ + ZXIC_UINT32 trigger_out_tod_nanosecond; +}DPP_PTPTM_PTPTM_TRIGGER_OUT_TOD_NANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_trigger_out_lower_tod_second_t +{ + ZXIC_UINT32 trigger_out_lower_tod_second; +}DPP_PTPTM_PTPTM_TRIGGER_OUT_LOWER_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_trigger_out_high_tod_second_t +{ + ZXIC_UINT32 trigger_out_high_tod_second; +}DPP_PTPTM_PTPTM_TRIGGER_OUT_HIGH_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_trigger_out_hardware_time_low_t +{ + ZXIC_UINT32 trigger_out_hardware_time_low; +}DPP_PTPTM_PTPTM_TRIGGER_OUT_HARDWARE_TIME_LOW_T; + +typedef struct dpp_ptptm_ptptm_trigger_out_hardware_time_high_t +{ + ZXIC_UINT32 trigger_out_hardware_time_high; +}DPP_PTPTM_PTPTM_TRIGGER_OUT_HARDWARE_TIME_HIGH_T; + +typedef struct dpp_ptptm_ptptm_adjust_tod_nanosecond_t +{ + ZXIC_UINT32 adjust_tod_nanosecond; +}DPP_PTPTM_PTPTM_ADJUST_TOD_NANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_adjust_lower_tod_second_t +{ + ZXIC_UINT32 adjust_lower_tod_second; +}DPP_PTPTM_PTPTM_ADJUST_LOWER_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_adjust_high_tod_second_t +{ + ZXIC_UINT32 adjust_high_tod_second; +}DPP_PTPTM_PTPTM_ADJUST_HIGH_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_adjust_fracnanosecond_t +{ + ZXIC_UINT32 adjust_fracnanosecond; +}DPP_PTPTM_PTPTM_ADJUST_FRACNANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_adjust_hardware_time_low_t +{ + ZXIC_UINT32 adjust_hardware_time_low; +}DPP_PTPTM_PTPTM_ADJUST_HARDWARE_TIME_LOW_T; + +typedef struct dpp_ptptm_ptptm_adjust_hardware_time_high_t +{ + ZXIC_UINT32 adjust_hardware_time_high; +}DPP_PTPTM_PTPTM_ADJUST_HARDWARE_TIME_HIGH_T; + +typedef struct dpp_ptptm_ptptm_latch_tod_nanosecond_t +{ + ZXIC_UINT32 latch_tod_nanosecond; +}DPP_PTPTM_PTPTM_LATCH_TOD_NANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_latch_lower_tod_second_t +{ + ZXIC_UINT32 latch_lower_tod_second; +}DPP_PTPTM_PTPTM_LATCH_LOWER_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_latch_high_tod_second_t +{ + ZXIC_UINT32 latch_high_tod_second; +}DPP_PTPTM_PTPTM_LATCH_HIGH_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_latch_fracnanosecond_t +{ + ZXIC_UINT32 latch_fracnanosecond; +}DPP_PTPTM_PTPTM_LATCH_FRACNANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_latch_hardware_time_low_t +{ + ZXIC_UINT32 latch_hardware_time_low; +}DPP_PTPTM_PTPTM_LATCH_HARDWARE_TIME_LOW_T; + +typedef struct dpp_ptptm_ptptm_latch_hardware_time_high_t +{ + ZXIC_UINT32 latch_hardware_time_high; +}DPP_PTPTM_PTPTM_LATCH_HARDWARE_TIME_HIGH_T; + +typedef struct dpp_ptptm_ptptm_real_tod_nanosecond_t +{ + ZXIC_UINT32 real_tod_nanosecond; +}DPP_PTPTM_PTPTM_REAL_TOD_NANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_real_lower_tod_second_t +{ + ZXIC_UINT32 real_lower_tod_second; +}DPP_PTPTM_PTPTM_REAL_LOWER_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_real_high_tod_second_t +{ + ZXIC_UINT32 real_high_tod_second; +}DPP_PTPTM_PTPTM_REAL_HIGH_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_real_hardware_time_low_t +{ + ZXIC_UINT32 real_hardware_time_low; +}DPP_PTPTM_PTPTM_REAL_HARDWARE_TIME_LOW_T; + +typedef struct dpp_ptptm_ptptm_real_hardware_time_high_t +{ + ZXIC_UINT32 real_hardware_time_high; +}DPP_PTPTM_PTPTM_REAL_HARDWARE_TIME_HIGH_T; + +typedef struct dpp_ptptm_ptptm_ptp1588_event_message_port_t +{ + ZXIC_UINT32 ptp1588_event_message_port; +}DPP_PTPTM_PTPTM_PTP1588_EVENT_MESSAGE_PORT_T; + +typedef struct dpp_ptptm_ptptm_ptp1588_event_message_timestamp_low_t +{ + ZXIC_UINT32 ptp1588_event_message_timestamp_low; +}DPP_PTPTM_PTPTM_PTP1588_EVENT_MESSAGE_TIMESTAMP_LOW_T; + +typedef struct dpp_ptptm_ptptm_ptp1588_event_message_timestamp_high_t +{ + ZXIC_UINT32 ptp1588_event_message_timestamp_high; +}DPP_PTPTM_PTPTM_PTP1588_EVENT_MESSAGE_TIMESTAMP_HIGH_T; + +typedef struct dpp_ptptm_ptptm_ptp1588_event_message_fifo_status_t +{ + ZXIC_UINT32 fifo_full; + ZXIC_UINT32 fifo_empty; + ZXIC_UINT32 timestamps_count; +}DPP_PTPTM_PTPTM_PTP1588_EVENT_MESSAGE_FIFO_STATUS_T; + +typedef struct dpp_ptptm_ptptm_pp1s_latch_tod_nanosecond_t +{ + ZXIC_UINT32 latch_1588tod_nanosecond; +}DPP_PTPTM_PTPTM_PP1S_LATCH_TOD_NANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_pp1s_latch_lower_tod_second_t +{ + ZXIC_UINT32 latch_lower_1588tod_second; +}DPP_PTPTM_PTPTM_PP1S_LATCH_LOWER_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_pp1s_latch_high_tod_second_t +{ + ZXIC_UINT32 latch_high_1588tod_second; +}DPP_PTPTM_PTPTM_PP1S_LATCH_HIGH_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_pp1s_latch_fracnanosecond_t +{ + ZXIC_UINT32 latch_1588fracnanosecond; +}DPP_PTPTM_PTPTM_PP1S_LATCH_FRACNANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn_time_configuration_t +{ + ZXIC_UINT32 tsn_pps_enable; + ZXIC_UINT32 tsn_timer_enable; + ZXIC_UINT32 tsn_timer_run_mode; + ZXIC_UINT32 timer_capture_slave_mode; +}DPP_PTPTM_PTPTM_TSN_TIME_CONFIGURATION_T; + +typedef struct dpp_ptptm_ptptm_tsn_timer_control_t +{ + ZXIC_UINT32 adjust_the_tsn3_timer; + ZXIC_UINT32 adjust_the_tsn2_timer; + ZXIC_UINT32 adjust_the_tsn1_timer; + ZXIC_UINT32 adjust_the_tsn0_timer; +}DPP_PTPTM_PTPTM_TSN_TIMER_CONTROL_T; + +typedef struct dpp_ptptm_ptptm_tsn0_clock_cycle_integer_t +{ + ZXIC_UINT32 integeral_nanosecond_of_tsn0_clock_cycle; +}DPP_PTPTM_PTPTM_TSN0_CLOCK_CYCLE_INTEGER_T; + +typedef struct dpp_ptptm_ptptm_tsn0_clock_cycle_fraction_t +{ + ZXIC_UINT32 fractional_nanosecond_of_tsn0_clock_cycle; +}DPP_PTPTM_PTPTM_TSN0_CLOCK_CYCLE_FRACTION_T; + +typedef struct dpp_ptptm_ptptm_tsn1_clock_cycle_integer_t +{ + ZXIC_UINT32 integeral_nanosecond_of_tsn1_clock_cycle; +}DPP_PTPTM_PTPTM_TSN1_CLOCK_CYCLE_INTEGER_T; + +typedef struct dpp_ptptm_ptptm_tsn1_clock_cycle_fraction_t +{ + ZXIC_UINT32 fractional_nanosecond_of_tsn1_clock_cycle; +}DPP_PTPTM_PTPTM_TSN1_CLOCK_CYCLE_FRACTION_T; + +typedef struct dpp_ptptm_ptptm_tsn2_clock_cycle_integer_t +{ + ZXIC_UINT32 integeral_nanosecond_of_tsn2_clock_cycle; +}DPP_PTPTM_PTPTM_TSN2_CLOCK_CYCLE_INTEGER_T; + +typedef struct dpp_ptptm_ptptm_tsn2_clock_cycle_fraction_t +{ + ZXIC_UINT32 fractional_nanosecond_of_tsn2_clock_cycle; +}DPP_PTPTM_PTPTM_TSN2_CLOCK_CYCLE_FRACTION_T; + +typedef struct dpp_ptptm_ptptm_tsn3_clock_cycle_integer_t +{ + ZXIC_UINT32 integeral_nanosecond_of_tsn3_clock_cycle; +}DPP_PTPTM_PTPTM_TSN3_CLOCK_CYCLE_INTEGER_T; + +typedef struct dpp_ptptm_ptptm_tsn3_clock_cycle_fraction_t +{ + ZXIC_UINT32 fractional_nanosecond_of_tsn3_clock_cycle; +}DPP_PTPTM_PTPTM_TSN3_CLOCK_CYCLE_FRACTION_T; + +typedef struct dpp_ptptm_ptptm_tsn0_adjust_tod_nanosecond_t +{ + ZXIC_UINT32 tsn0_adjust_tod_nanosecond; +}DPP_PTPTM_PTPTM_TSN0_ADJUST_TOD_NANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn0_adjust_lower_tod_second_t +{ + ZXIC_UINT32 tsn0_adjust_lower_tod_second; +}DPP_PTPTM_PTPTM_TSN0_ADJUST_LOWER_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn0_adjust_high_tod_second_t +{ + ZXIC_UINT32 tsn0_adjust_high_tod_second; +}DPP_PTPTM_PTPTM_TSN0_ADJUST_HIGH_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn0_adjust_fracnanosecond_t +{ + ZXIC_UINT32 tsn0_adjust_fracnanosecond; +}DPP_PTPTM_PTPTM_TSN0_ADJUST_FRACNANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn1_adjust_tod_nanosecond_t +{ + ZXIC_UINT32 tsn1_adjust_tod_nanosecond; +}DPP_PTPTM_PTPTM_TSN1_ADJUST_TOD_NANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn1_adjust_lower_tod_second_t +{ + ZXIC_UINT32 tsn1_adjust_lower_tod_second; +}DPP_PTPTM_PTPTM_TSN1_ADJUST_LOWER_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn1_adjust_high_tod_second_t +{ + ZXIC_UINT32 tsn1_adjust_high_tod_second; +}DPP_PTPTM_PTPTM_TSN1_ADJUST_HIGH_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn1_adjust_fracnanosecond_t +{ + ZXIC_UINT32 tsn1_adjust_fracnanosecond; +}DPP_PTPTM_PTPTM_TSN1_ADJUST_FRACNANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn2_adjust_tod_nanosecond_t +{ + ZXIC_UINT32 tsn2_adjust_tod_nanosecond; +}DPP_PTPTM_PTPTM_TSN2_ADJUST_TOD_NANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn2_adjust_lower_tod_second_t +{ + ZXIC_UINT32 tsn2_adjust_lower_tod_second; +}DPP_PTPTM_PTPTM_TSN2_ADJUST_LOWER_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn2_adjust_high_tod_second_t +{ + ZXIC_UINT32 tsn2_adjust_high_tod_second; +}DPP_PTPTM_PTPTM_TSN2_ADJUST_HIGH_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn2_adjust_fracnanosecond_t +{ + ZXIC_UINT32 tsn2_adjust_fracnanosecond; +}DPP_PTPTM_PTPTM_TSN2_ADJUST_FRACNANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn3_adjust_tod_nanosecond_t +{ + ZXIC_UINT32 tsn3_adjust_tod_nanosecond; +}DPP_PTPTM_PTPTM_TSN3_ADJUST_TOD_NANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn3_adjust_lower_tod_second_t +{ + ZXIC_UINT32 tsn3_adjust_lower_tod_second; +}DPP_PTPTM_PTPTM_TSN3_ADJUST_LOWER_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn3_adjust_high_tod_second_t +{ + ZXIC_UINT32 tsn3_adjust_high_tod_second; +}DPP_PTPTM_PTPTM_TSN3_ADJUST_HIGH_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn3_adjust_fracnanosecond_t +{ + ZXIC_UINT32 tsn3_adjust_fracnanosecond; +}DPP_PTPTM_PTPTM_TSN3_ADJUST_FRACNANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn0_latch_tod_nanosecond_t +{ + ZXIC_UINT32 tsn0_latch_tod_nanosecond; +}DPP_PTPTM_PTPTM_TSN0_LATCH_TOD_NANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn0_latch_lower_tod_second_t +{ + ZXIC_UINT32 tsn0_latch_lower_tod_second; +}DPP_PTPTM_PTPTM_TSN0_LATCH_LOWER_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn0_latch_high_tod_second_t +{ + ZXIC_UINT32 tsn0_latch_high_tod_second; +}DPP_PTPTM_PTPTM_TSN0_LATCH_HIGH_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn0_latch_fracnanosecond_t +{ + ZXIC_UINT32 tsn0_latch_fracnanosecond; +}DPP_PTPTM_PTPTM_TSN0_LATCH_FRACNANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn1_latch_tod_nanosecond_t +{ + ZXIC_UINT32 tsn1_latch_tod_nanosecond; +}DPP_PTPTM_PTPTM_TSN1_LATCH_TOD_NANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn1_latch_lower_tod_second_t +{ + ZXIC_UINT32 tsn1_latch_lower_tod_second; +}DPP_PTPTM_PTPTM_TSN1_LATCH_LOWER_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn1_latch_high_tod_second_t +{ + ZXIC_UINT32 tsn1_latch_high_tod_second; +}DPP_PTPTM_PTPTM_TSN1_LATCH_HIGH_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn1_latch_fracnanosecond_t +{ + ZXIC_UINT32 tsn1_latch_fracnanosecond; +}DPP_PTPTM_PTPTM_TSN1_LATCH_FRACNANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn2_latch_tod_nanosecond_t +{ + ZXIC_UINT32 tsn2_latch_tod_nanosecond; +}DPP_PTPTM_PTPTM_TSN2_LATCH_TOD_NANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn2_latch_lower_tod_second_t +{ + ZXIC_UINT32 tsn2_latch_lower_tod_second; +}DPP_PTPTM_PTPTM_TSN2_LATCH_LOWER_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn2_latch_high_tod_second_t +{ + ZXIC_UINT32 tsn2_latch_high_tod_second; +}DPP_PTPTM_PTPTM_TSN2_LATCH_HIGH_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn2_latch_fracnanosecond_t +{ + ZXIC_UINT32 tsn2_latch_fracnanosecond; +}DPP_PTPTM_PTPTM_TSN2_LATCH_FRACNANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn3_latch_tod_nanosecond_t +{ + ZXIC_UINT32 tsn3_latch_tod_nanosecond; +}DPP_PTPTM_PTPTM_TSN3_LATCH_TOD_NANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn3_latch_lower_tod_second_t +{ + ZXIC_UINT32 tsn3_latch_lower_tod_second; +}DPP_PTPTM_PTPTM_TSN3_LATCH_LOWER_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn3_latch_high_tod_second_t +{ + ZXIC_UINT32 tsn3_latch_high_tod_second; +}DPP_PTPTM_PTPTM_TSN3_LATCH_HIGH_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn3_latch_fracnanosecond_t +{ + ZXIC_UINT32 tsn3_latch_fracnanosecond; +}DPP_PTPTM_PTPTM_TSN3_LATCH_FRACNANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_pp1s_latch_tsn0_tod_nanosecond_t +{ + ZXIC_UINT32 latch_tsn0_tod_nanosecond; +}DPP_PTPTM_PTPTM_PP1S_LATCH_TSN0_TOD_NANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_pp1s_latch_tsn0_lower_tod_second_t +{ + ZXIC_UINT32 latch_lower_tsn0_tod_second; +}DPP_PTPTM_PTPTM_PP1S_LATCH_TSN0_LOWER_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_pp1s_latch_tsn0_high_tod_second_t +{ + ZXIC_UINT32 latch_high_tsn0_tod_second; +}DPP_PTPTM_PTPTM_PP1S_LATCH_TSN0_HIGH_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_pp1s_latch_tsn0_fracnanosecond_t +{ + ZXIC_UINT32 latch_tsn0_fracnanosecond; +}DPP_PTPTM_PTPTM_PP1S_LATCH_TSN0_FRACNANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_pp1s_latch_tsn1_tod_nanosecond_t +{ + ZXIC_UINT32 latch_tsn1_tod_nanosecond; +}DPP_PTPTM_PTPTM_PP1S_LATCH_TSN1_TOD_NANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_pp1s_latch_tsn1_lower_tod_second_t +{ + ZXIC_UINT32 latch_lower_tsn1_tod_second; +}DPP_PTPTM_PTPTM_PP1S_LATCH_TSN1_LOWER_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_pp1s_latch_tsn1_high_tod_second_t +{ + ZXIC_UINT32 latch_high_tsn1_tod_second; +}DPP_PTPTM_PTPTM_PP1S_LATCH_TSN1_HIGH_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_pp1s_latch_tsn1_fracnanosecond_t +{ + ZXIC_UINT32 latch_tsn1_fracnanosecond; +}DPP_PTPTM_PTPTM_PP1S_LATCH_TSN1_FRACNANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_pp1s_latch_tsn2_tod_nanosecond_t +{ + ZXIC_UINT32 latch_tsn2_tod_nanosecond; +}DPP_PTPTM_PTPTM_PP1S_LATCH_TSN2_TOD_NANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_pp1s_latch_tsn2_lower_tod_second_t +{ + ZXIC_UINT32 latch_lower_tsn2_tod_second; +}DPP_PTPTM_PTPTM_PP1S_LATCH_TSN2_LOWER_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_pp1s_latch_tsn2_high_tod_second_t +{ + ZXIC_UINT32 latch_high_tsn2_tod_second; +}DPP_PTPTM_PTPTM_PP1S_LATCH_TSN2_HIGH_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_pp1s_latch_tsn2_fracnanosecond_t +{ + ZXIC_UINT32 latch_tsn2_fracnanosecond; +}DPP_PTPTM_PTPTM_PP1S_LATCH_TSN2_FRACNANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_pp1s_latch_tsn3_tod_nanosecond_t +{ + ZXIC_UINT32 latch_tsn3_tod_nanosecond; +}DPP_PTPTM_PTPTM_PP1S_LATCH_TSN3_TOD_NANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_pp1s_latch_tsn3_lower_tod_second_t +{ + ZXIC_UINT32 latch_lower_tsn3_tod_second; +}DPP_PTPTM_PTPTM_PP1S_LATCH_TSN3_LOWER_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_pp1s_latch_tsn3_high_tod_second_t +{ + ZXIC_UINT32 latch_high_tsn3_tod_second; +}DPP_PTPTM_PTPTM_PP1S_LATCH_TSN3_HIGH_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_pp1s_latch_tsn3_fracnanosecond_t +{ + ZXIC_UINT32 latch_tsn3_fracnanosecond; +}DPP_PTPTM_PTPTM_PP1S_LATCH_TSN3_FRACNANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn0_real_tod_nanosecond_t +{ + ZXIC_UINT32 tsn0_real_tod_nanosecond; +}DPP_PTPTM_PTPTM_TSN0_REAL_TOD_NANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn0_real_lower_tod_second_t +{ + ZXIC_UINT32 tsn0_real_lower_tod_second; +}DPP_PTPTM_PTPTM_TSN0_REAL_LOWER_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn0_real_high_tod_second_t +{ + ZXIC_UINT32 tsn0_real_high_tod_second; +}DPP_PTPTM_PTPTM_TSN0_REAL_HIGH_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn1_real_tod_nanosecond_t +{ + ZXIC_UINT32 tsn1_real_tod_nanosecond; +}DPP_PTPTM_PTPTM_TSN1_REAL_TOD_NANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn1_real_lower_tod_second_t +{ + ZXIC_UINT32 tsn1_real_lower_tod_second; +}DPP_PTPTM_PTPTM_TSN1_REAL_LOWER_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn1_real_high_tod_second_t +{ + ZXIC_UINT32 tsn1_real_high_tod_second; +}DPP_PTPTM_PTPTM_TSN1_REAL_HIGH_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn2_real_tod_nanosecond_t +{ + ZXIC_UINT32 tsn2_real_tod_nanosecond; +}DPP_PTPTM_PTPTM_TSN2_REAL_TOD_NANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn2_real_lower_tod_second_t +{ + ZXIC_UINT32 tsn2_real_lower_tod_second; +}DPP_PTPTM_PTPTM_TSN2_REAL_LOWER_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn2_real_high_tod_second_t +{ + ZXIC_UINT32 tsn2_real_high_tod_second; +}DPP_PTPTM_PTPTM_TSN2_REAL_HIGH_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn3_real_tod_nanosecond_t +{ + ZXIC_UINT32 tsn3_real_tod_nanosecond; +}DPP_PTPTM_PTPTM_TSN3_REAL_TOD_NANOSECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn3_real_lower_tod_second_t +{ + ZXIC_UINT32 tsn3_real_lower_tod_second; +}DPP_PTPTM_PTPTM_TSN3_REAL_LOWER_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_tsn3_real_high_tod_second_t +{ + ZXIC_UINT32 tsn3_real_high_tod_second; +}DPP_PTPTM_PTPTM_TSN3_REAL_HIGH_TOD_SECOND_T; + +typedef struct dpp_ptptm_ptptm_real_ptp_clock_cycle_integer_t +{ + ZXIC_UINT32 integeral_nanosecond_of_real_ptp_clock_cycle; +}DPP_PTPTM_PTPTM_REAL_PTP_CLOCK_CYCLE_INTEGER_T; + +typedef struct dpp_ptptm_ptptm_real_ptp_clock_cycle_fraction_t +{ + ZXIC_UINT32 fractional_nanosecond_of_real_ptp_clock_cycle; +}DPP_PTPTM_PTPTM_REAL_PTP_CLOCK_CYCLE_FRACTION_T; + +typedef struct dpp_ptptm_ptptm_real_tsn0_clock_cycle_integer_t +{ + ZXIC_UINT32 integeral_nanosecond_of_real_tsn0_clock_cycle; +}DPP_PTPTM_PTPTM_REAL_TSN0_CLOCK_CYCLE_INTEGER_T; + +typedef struct dpp_ptptm_ptptm_real_tsn0_clock_cycle_fraction_t +{ + ZXIC_UINT32 fractional_nanosecond_of_real_tsn0_clock_cycle; +}DPP_PTPTM_PTPTM_REAL_TSN0_CLOCK_CYCLE_FRACTION_T; + +typedef struct dpp_ptptm_ptptm_real_tsn1_clock_cycle_integer_t +{ + ZXIC_UINT32 integeral_nanosecond_of_real_tsn1_clock_cycle; +}DPP_PTPTM_PTPTM_REAL_TSN1_CLOCK_CYCLE_INTEGER_T; + +typedef struct dpp_ptptm_ptptm_real_tsn1_clock_cycle_fraction_t +{ + ZXIC_UINT32 fractional_nanosecond_of_real_tsn1_clock_cycle; +}DPP_PTPTM_PTPTM_REAL_TSN1_CLOCK_CYCLE_FRACTION_T; + +typedef struct dpp_ptptm_ptptm_real_tsn2_clock_cycle_integer_t +{ + ZXIC_UINT32 integeral_nanosecond_of_real_tsn2_clock_cycle; +}DPP_PTPTM_PTPTM_REAL_TSN2_CLOCK_CYCLE_INTEGER_T; + +typedef struct dpp_ptptm_ptptm_real_tsn2_clock_cycle_fraction_t +{ + ZXIC_UINT32 fractional_nanosecond_of_real_tsn2_clock_cycle; +}DPP_PTPTM_PTPTM_REAL_TSN2_CLOCK_CYCLE_FRACTION_T; + +typedef struct dpp_ptptm_ptptm_real_tsn3_clock_cycle_integer_t +{ + ZXIC_UINT32 integeral_nanosecond_of_real_tsn3_clock_cycle; +}DPP_PTPTM_PTPTM_REAL_TSN3_CLOCK_CYCLE_INTEGER_T; + +typedef struct dpp_ptptm_ptptm_real_tsn3_clock_cycle_fraction_t +{ + ZXIC_UINT32 fractional_nanosecond_of_real_tsn3_clock_cycle; +}DPP_PTPTM_PTPTM_REAL_TSN3_CLOCK_CYCLE_FRACTION_T; + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_reg.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_reg.h new file mode 100755 index 0000000..19d4591 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_reg.h @@ -0,0 +1,62 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_reg.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : 王春雷 +* 完成日期 : 2014/03/18 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef _DPP_REG_H_ +#define _DPP_REG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "dpp_reg_struct.h" +#include "dpp_reg_info.h" +#include "dpp_reg_api.h" +#include "dpp_module.h" + + +#include "dpp_cfg_reg.h" +#include "dpp_etm_reg.h" +#include "dpp_nppu_reg.h" +#include "dpp_ppu_reg.h" +#include "dpp_smmu0_reg.h" +#include "dpp_smmu1_reg.h" +#include "dpp_se_reg.h" +#include "dpp_stat_reg.h" +#include "dpp_axi_reg.h" +#include "dpp_dtb_reg.h" +#include "dpp_trpg_reg.h" +#include "dpp_tsn_reg.h" +#include "dpp_ptptm_reg.h" + + +#include "zxic_comm_socket.h" +#include "zxic_comm_thread.h" + + + +#ifdef __cplusplus +} +#endif + +#endif + + + + + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_reg_info.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_reg_info.h new file mode 100644 index 0000000..6a46639 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_reg_info.h @@ -0,0 +1,4458 @@ + +#ifndef _DPP_REG_INFO_H_ +#define _DPP_REG_INFO_H_ + +#ifdef __cplusplus +extern "C"{ +#endif + +typedef enum dpp_reg_info_e +{ + ETM_CFGMT_CPU_CHECK_REGr = 0, + ETM_CFGMT_CFGMT_BLKSIZEr = 1, + ETM_CFGMT_REG_INT_STATE_REGr = 2, + ETM_CFGMT_REG_INT_MASK_REGr = 3, + ETM_CFGMT_TIMEOUT_LIMITr = 4, + ETM_CFGMT_SUBSYSTEM_RDY_REGr = 5, + ETM_CFGMT_SUBSYSTEM_EN_REGr = 6, + ETM_CFGMT_CFGMT_INT_REGr = 7, + ETM_CFGMT_QMU_WORK_MODEr = 8, + ETM_CFGMT_CFGMT_DDR_ATTACHr = 9, + ETM_CFGMT_CNT_MODE_REGr = 10, + ETM_CFGMT_CLKGATE_ENr = 11, + ETM_CFGMT_SOFTRST_ENr = 12, + ETM_OLIF_IMEM_PROG_FULLr = 13, + ETM_OLIF_QMU_PARA_PROG_FULLr = 14, + ETM_OLIF_OLIF_INT_MASKr = 15, + ETM_OLIF_ITMHRAM_PARITY_ERR_2_INTr = 16, + ETM_OLIF_LIF0_PORT_RDY_MASK_Hr = 17, + ETM_OLIF_LIF0_PORT_RDY_MASK_Lr = 18, + ETM_OLIF_LIF0_PORT_RDY_CFG_Hr = 19, + ETM_OLIF_LIF0_PORT_RDY_CFG_Lr = 20, + ETM_OLIF_LIF0_LINK_RDY_MASK_CFGr = 21, + ETM_OLIF_TM_LIF_STAT_CFGr = 22, + ETM_OLIF_TM_LIF_SOP_STATr = 23, + ETM_OLIF_TM_LIF_EOP_STATr = 24, + ETM_OLIF_TM_LIF_VLD_STATr = 25, + ETM_CGAVD_PROG_FULL_ASSERT_CFGr = 26, + ETM_CGAVD_CGAVD_INTr = 27, + ETM_CGAVD_CGAVD_RAM_ERRr = 28, + ETM_CGAVD_CGAVD_INT_MASKr = 29, + ETM_CGAVD_CGAVD_RAM_ERR_INT_MASKr = 30, + ETM_CGAVD_CFGMT_BYTE_MODEr = 31, + ETM_CGAVD_AVG_QLEN_RETURN_ZERO_ENr = 32, + ETM_CGAVD_FLOW_WRED_Q_LEN_THr = 33, + ETM_CGAVD_FLOW_WQr = 34, + ETM_CGAVD_FLOW_WRED_MAX_THr = 35, + ETM_CGAVD_FLOW_WRED_MIN_THr = 36, + ETM_CGAVD_FLOW_WRED_CFG_PARAr = 37, + ETM_CGAVD_PP_AVG_Q_LENr = 38, + ETM_CGAVD_PP_TD_THr = 39, + ETM_CGAVD_PP_CA_MTDr = 40, + ETM_CGAVD_PP_WRED_GRP_TH_ENr = 41, + ETM_CGAVD_PP_WRED_Q_LEN_THr = 42, + ETM_CGAVD_PP_WQr = 43, + ETM_CGAVD_PP_WRED_MAX_THr = 44, + ETM_CGAVD_PP_WRED_MIN_THr = 45, + ETM_CGAVD_PP_CFG_PARAr = 46, + ETM_CGAVD_SYS_AVG_Q_LENr = 47, + ETM_CGAVD_SYS_TD_THr = 48, + ETM_CGAVD_SYS_CGAVD_METDr = 49, + ETM_CGAVD_SYS_CFG_Q_GRP_PARAr = 50, + ETM_CGAVD_SYS_WQr = 51, + ETM_CGAVD_GRED_MAX_THr = 52, + ETM_CGAVD_GRED_MID_THr = 53, + ETM_CGAVD_GRED_MIN_THr = 54, + ETM_CGAVD_GRED_CFG_PARA0r = 55, + ETM_CGAVD_GRED_CFG_PARA1r = 56, + ETM_CGAVD_GRED_CFG_PARA2r = 57, + ETM_CGAVD_SYS_WINDOW_TH_Hr = 58, + ETM_CGAVD_SYS_WINDOW_TH_Lr = 59, + ETM_CGAVD_AMPLIFY_GENE0r = 60, + ETM_CGAVD_AMPLIFY_GENE1r = 61, + ETM_CGAVD_AMPLIFY_GENE2r = 62, + ETM_CGAVD_AMPLIFY_GENE3r = 63, + ETM_CGAVD_AMPLIFY_GENE4r = 64, + ETM_CGAVD_AMPLIFY_GENE5r = 65, + ETM_CGAVD_AMPLIFY_GENE6r = 66, + ETM_CGAVD_AMPLIFY_GENE7r = 67, + ETM_CGAVD_AMPLIFY_GENE8r = 68, + ETM_CGAVD_AMPLIFY_GENE9r = 69, + ETM_CGAVD_AMPLIFY_GENE10r = 70, + ETM_CGAVD_AMPLIFY_GENE11r = 71, + ETM_CGAVD_AMPLIFY_GENE12r = 72, + ETM_CGAVD_AMPLIFY_GENE13r = 73, + ETM_CGAVD_AMPLIFY_GENE14r = 74, + ETM_CGAVD_AMPLIFY_GENE15r = 75, + ETM_CGAVD_EQUAL_PKT_LEN_ENr = 76, + ETM_CGAVD_EQUAL_PKT_LEN_TH0r = 77, + ETM_CGAVD_EQUAL_PKT_LEN_TH1r = 78, + ETM_CGAVD_EQUAL_PKT_LEN_TH2r = 79, + ETM_CGAVD_EQUAL_PKT_LEN_TH3r = 80, + ETM_CGAVD_EQUAL_PKT_LEN_TH4r = 81, + ETM_CGAVD_EQUAL_PKT_LEN_TH5r = 82, + ETM_CGAVD_EQUAL_PKT_LEN_TH6r = 83, + ETM_CGAVD_EQUAL_PKT_LEN0r = 84, + ETM_CGAVD_EQUAL_PKT_LEN1r = 85, + ETM_CGAVD_EQUAL_PKT_LEN2r = 86, + ETM_CGAVD_EQUAL_PKT_LEN3r = 87, + ETM_CGAVD_EQUAL_PKT_LEN4r = 88, + ETM_CGAVD_EQUAL_PKT_LEN5r = 89, + ETM_CGAVD_EQUAL_PKT_LEN6r = 90, + ETM_CGAVD_EQUAL_PKT_LEN7r = 91, + ETM_CGAVD_FLOW_CPU_SET_AVG_LENr = 92, + ETM_CGAVD_FLOW_CPU_SET_Q_LENr = 93, + ETM_CGAVD_PP_CPU_SET_AVG_Q_LENr = 94, + ETM_CGAVD_PP_CPU_SET_Q_LENr = 95, + ETM_CGAVD_SYS_CPU_SET_AVG_LENr = 96, + ETM_CGAVD_SYS_CPU_SET_Q_LENr = 97, + ETM_CGAVD_PKE_LEN_CALC_SIGNr = 98, + ETM_CGAVD_RD_CPU_OR_RAMr = 99, + ETM_CGAVD_Q_LEN_UPDATE_DISABLEr = 100, + ETM_CGAVD_CGAVD_DP_SELr = 101, + ETM_CGAVD_CGAVD_SUB_ENr = 102, + ETM_CGAVD_DEFAULT_START_QUEUEr = 103, + ETM_CGAVD_DEFAULT_FINISH_QUEUEr = 104, + ETM_CGAVD_PROTOCOL_START_QUEUEr = 105, + ETM_CGAVD_PROTOCOL_FINISH_QUEUEr = 106, + ETM_CGAVD_UNIFORM_TD_THr = 107, + ETM_CGAVD_UNIFORM_TD_TH_ENr = 108, + ETM_CGAVD_CGAVD_CFG_FCr = 109, + ETM_CGAVD_CGAVD_CFG_NO_FCr = 110, + ETM_CGAVD_CGAVD_FORCE_IMEM_OMEMr = 111, + ETM_CGAVD_CGAVD_SYS_Q_LEN_Lr = 112, + ETM_CGAVD_DEFAULT_QUEUE_ENr = 113, + ETM_CGAVD_PROTOCOL_QUEUE_ENr = 114, + ETM_CGAVD_CFG_TC_FLOWID_DATr = 115, + ETM_CGAVD_FLOW_TD_THr = 116, + ETM_CGAVD_FLOW_CA_MTDr = 117, + ETM_CGAVD_FLOW_DYNAMIC_TH_ENr = 118, + ETM_CGAVD_PP_NUMr = 119, + ETM_CGAVD_FLOW_Q_LENr = 120, + ETM_CGAVD_FLOW_WRED_GRPr = 121, + ETM_CGAVD_FLOW_AVG_Q_LENr = 122, + ETM_CGAVD_QOS_SIGNr = 123, + ETM_CGAVD_Q_PRIr = 124, + ETM_CGAVD_ODMA_TM_ITMD_RD_LOWr = 125, + ETM_CGAVD_ODMA_TM_ITMD_RD_MIDr = 126, + ETM_CGAVD_ODMA_TM_ITMD_RD_HIGHr = 127, + ETM_CGAVD_CGAVD_STAT_PKT_LENr = 128, + ETM_CGAVD_CGAVD_STAT_QNUMr = 129, + ETM_CGAVD_CGAVD_STAT_DPr = 130, + ETM_CGAVD_FLOW_NUM0r = 131, + ETM_CGAVD_FLOW_NUM1r = 132, + ETM_CGAVD_FLOW_NUM2r = 133, + ETM_CGAVD_FLOW_NUM3r = 134, + ETM_CGAVD_FLOW_NUM4r = 135, + ETM_CGAVD_FLOW0_IMEM_CNTr = 136, + ETM_CGAVD_FLOW1_IMEM_CNTr = 137, + ETM_CGAVD_FLOW2_IMEM_CNTr = 138, + ETM_CGAVD_FLOW3_IMEM_CNTr = 139, + ETM_CGAVD_FLOW4_IMEM_CNTr = 140, + ETM_CGAVD_FLOW0_DROP_CNTr = 141, + ETM_CGAVD_FLOW1_DROP_CNTr = 142, + ETM_CGAVD_FLOW2_DROP_CNTr = 143, + ETM_CGAVD_FLOW3_DROP_CNTr = 144, + ETM_CGAVD_FLOW4_DROP_CNTr = 145, + ETM_CGAVD_FC_COUNT_MODEr = 146, + ETM_CGAVD_QMU_CGAVD_FC_NUMr = 147, + ETM_CGAVD_CGAVD_ODMA_FC_NUMr = 148, + ETM_CGAVD_CFG_OFFSETr = 149, + ETM_TMMU_TMMU_INIT_DONEr = 150, + ETM_TMMU_TMMU_INT_MASK_1r = 151, + ETM_TMMU_TMMU_INT_MASK_2r = 152, + ETM_TMMU_CFGMT_TM_PURE_IMEM_ENr = 153, + ETM_TMMU_CFGMT_FORCE_DDR_RDY_CFGr = 154, + ETM_TMMU_PD_ORDER_FIFO_AFUL_THr = 155, + ETM_TMMU_CACHED_PD_FIFO_AFUL_THr = 156, + ETM_TMMU_WR_CMD_FIFO_AFUL_THr = 157, + ETM_TMMU_IMEM_ENQ_RD_FIFO_AFUL_THr = 158, + ETM_TMMU_IMEM_ENQ_DROP_FIFO_AFUL_THr = 159, + ETM_TMMU_IMEM_DEQ_DROP_FIFO_AFUL_THr = 160, + ETM_TMMU_IMEM_DEQ_RD_FIFO_AFUL_THr = 161, + ETM_TMMU_TMMU_STATES_1r = 162, + ETM_TMMU_TMMU_STATES_2r = 163, + ETM_SHAP_SHAP_IND_CMDr = 164, + ETM_SHAP_SHAP_IND_STAr = 165, + ETM_SHAP_SHAP_IND_DATA0r = 166, + ETM_SHAP_SHAP_IND_DATA1r = 167, + ETM_SHAP_FULL_THRESHOLDr = 168, + ETM_SHAP_EMPTY_THRESHOLDr = 169, + ETM_SHAP_SHAP_STA_INIT_CFGr = 170, + ETM_SHAP_SHAP_CFG_INIT_CFGr = 171, + ETM_SHAP_TOKEN_MODE_SWITCHr = 172, + ETM_SHAP_TOKEN_GRAINr = 173, + ETM_SHAP_CRD_GRAINr = 174, + ETM_SHAP_SHAP_STAT_CTRLr = 175, + ETM_SHAP_TOKEN_STAT_IDr = 176, + ETM_SHAP_TOKEN_STATr = 177, + ETM_SHAP_SHAP_STAT_CLK_CNTr = 178, + ETM_SHAP_SHAP_BUCKET_MAP_TBLr = 179, + ETM_SHAP_BKT_PARA_TBLr = 180, + ETM_CRDT_CREDIT_ENr = 181, + ETM_CRDT_CRT_INTER1r = 182, + ETM_CRDT_DB_TOKENr = 183, + ETM_CRDT_CRS_FLT_CFGr = 184, + ETM_CRDT_TH_SPr = 185, + ETM_CRDT_TH_WFQ_FQr = 186, + ETM_CRDT_TH_WFQ2_FQ2r = 187, + ETM_CRDT_TH_WFQ4_FQ4r = 188, + ETM_CRDT_CFG_STATEr = 189, + ETM_CRDT_CRDT_IND_CMDr = 190, + ETM_CRDT_CRDT_IND_STAr = 191, + ETM_CRDT_CRDT_IND_DATA0r = 192, + ETM_CRDT_CRDT_IND_DATA1r = 193, + ETM_CRDT_CRDT_STATEr = 194, + ETM_CRDT_STAT_QUE_ID_0r = 195, + ETM_CRDT_STAT_QUE_ID_1r = 196, + ETM_CRDT_STAT_QUE_ID_2r = 197, + ETM_CRDT_STAT_QUE_ID_3r = 198, + ETM_CRDT_STAT_QUE_ID_4r = 199, + ETM_CRDT_STAT_QUE_ID_5r = 200, + ETM_CRDT_STAT_QUE_ID_6r = 201, + ETM_CRDT_STAT_QUE_ID_7r = 202, + ETM_CRDT_STAT_QUE_ID_8r = 203, + ETM_CRDT_STAT_QUE_ID_9r = 204, + ETM_CRDT_STAT_QUE_ID_10r = 205, + ETM_CRDT_STAT_QUE_ID_11r = 206, + ETM_CRDT_STAT_QUE_ID_12r = 207, + ETM_CRDT_STAT_QUE_ID_13r = 208, + ETM_CRDT_STAT_QUE_ID_14r = 209, + ETM_CRDT_STAT_QUE_ID_15r = 210, + ETM_CRDT_STAT_QUE_CREDITr = 211, + ETM_CRDT_CRDT_CFG_RAM_INITr = 212, + ETM_CRDT_CRDT_STA_RAM_INITr = 213, + ETM_CRDT_CRS_QUE_IDr = 214, + ETM_CRDT_QMU_CRS_END_STATEr = 215, + ETM_CRDT_SHAP_RDYr = 216, + ETM_CRDT_SHAP_INT_REGr = 217, + ETM_CRDT_SHAP_INT_MASK_REGr = 218, + ETM_CRDT_TOKEN_STATE_ALMOST_EMPTY_THr = 219, + ETM_CRDT_TOKEN_STATE_EMPTY_THr = 220, + ETM_CRDT_FULL_THr = 221, + ETM_CRDT_PP_C_LEVEL_SHAP_ENr = 222, + ETM_CRDT_ENQ_TOKEN_THr = 223, + ETM_CRDT_PP_TOKENQ_LEVEL1_QSTATE_WEIGHT_CIRr = 224, + ETM_CRDT_PP_IDLE_WEIGHT_LEVEL1_CIRr = 225, + ETM_CRDT_RCI_GRADE_TH_0_CFGr = 226, + ETM_CRDT_RCI_GRADE_TH_1_CFGr = 227, + ETM_CRDT_RCI_GRADE_TH_2_CFGr = 228, + ETM_CRDT_RCI_GRADE_TH_3_CFGr = 229, + ETM_CRDT_RCI_GRADE_TH_4_CFGr = 230, + ETM_CRDT_RCI_GRADE_TH_5_CFGr = 231, + ETM_CRDT_RCI_GRADE_TH_6_CFGr = 232, + ETM_CRDT_FLOW_DEL_CMDr = 233, + ETM_CRDT_CNT_CLRr = 234, + ETM_CRDT_CRDT_INT_BUSr = 235, + ETM_CRDT_CRDT_INT_MASKr = 236, + ETM_CRDT_CFG_WEIGHT_TOGETHERr = 237, + ETM_CRDT_WEIGHTr = 238, + ETM_CRDT_DEV_SP_STATEr = 239, + ETM_CRDT_DEV_CRSr = 240, + ETM_CRDT_CONGEST_TOKEN_DISABLE_31_0r = 241, + ETM_CRDT_CONGEST_TOKEN_DISABLE_63_32r = 242, + ETM_CRDT_CRDT_INTERVAL_EN_CFGr = 243, + ETM_CRDT_Q_TOKEN_STAUE_CFGr = 244, + ETM_CRDT_Q_TOKEN_DIST_CNTr = 245, + ETM_CRDT_Q_TOKEN_DEC_CNTr = 246, + ETM_CRDT_PP_WEIGHT_RAMr = 247, + ETM_CRDT_PP_CBS_SHAPE_EN_RAMr = 248, + ETM_CRDT_PP_NEXT_PC_Q_STATE_RAMr = 249, + ETM_CRDT_DEV_INTERVALr = 250, + ETM_CRDT_DEV_WFQ_CNTr = 251, + ETM_CRDT_DEV_WFQ_STATEr = 252, + ETM_CRDT_DEV_ACTIVE_HEAD_PTRr = 253, + ETM_CRDT_DEV_ACTIVE_TAIL_PTRr = 254, + ETM_CRDT_DEV_UNACTIVE_HEAD_PTRr = 255, + ETM_CRDT_DEV_UNACTIVE_TAIL_PTRr = 256, + ETM_CRDT_PP_WEIGHTr = 257, + ETM_CRDT_PP_QUE_STATEr = 258, + ETM_CRDT_PP_NEXT_PTRr = 259, + ETM_CRDT_PP_CFGr = 260, + ETM_CRDT_PP_UP_PTRr = 261, + ETM_CRDT_CREDIT_DROP_NUMr = 262, + ETM_CRDT_SE_ID_LV0r = 263, + ETM_CRDT_SE_ID_LV1r = 264, + ETM_CRDT_SE_ID_LV2r = 265, + ETM_CRDT_SE_ID_LV3r = 266, + ETM_CRDT_SE_ID_LV4r = 267, + ETM_CRDT_QUE_IDr = 268, + ETM_CRDT_SE_INFO_LV0r = 269, + ETM_CRDT_SE_INFO_LV1r = 270, + ETM_CRDT_SE_INFO_LV2r = 271, + ETM_CRDT_SE_INFO_LV3r = 272, + ETM_CRDT_SE_INFO_LV4r = 273, + ETM_CRDT_QUE_STATEr = 274, + ETM_CRDT_EIR_OFF_IN_ADVANCEr = 275, + ETM_CRDT_DOUBLE_LEVEL_SHAP_PREVENTr = 276, + ETM_CRDT_ADD_STORE_CYCLEr = 277, + ETM_CRDT_TFLAG2_WR_FLAG_SUMr = 278, + ETM_CRDT_FLOWQUE_PARA_TBLr = 279, + ETM_CRDT_SE_PARA_TBLr = 280, + ETM_CRDT_FLOWQUE_INS_TBLr = 281, + ETM_CRDT_SE_INS_TBLr = 282, + ETM_CRDT_EIR_CRS_FILTER_TBLr = 283, + ETM_QMU_QCFG_QLIST_CFG_DONEr = 284, + ETM_QMU_QCFG_QSCH_CREDIT_VALUEr = 285, + ETM_QMU_QCFG_QSCH_CRBAL_INIT_VALUEr = 286, + ETM_QMU_QCFG_QSCH_CRBAL_INIT_MASKr = 287, + ETM_QMU_CMDSCH_RD_CMD_AFUL_THr = 288, + ETM_QMU_CFG_PORT_FC_INTERVALr = 289, + ETM_QMU_QCFG_CSCH_AGED_CFGr = 290, + ETM_QMU_QCFG_CSCH_AGED_SCAN_TIMEr = 291, + ETM_QMU_QCFG_QMU_QLIST_STATE_QUERYr = 292, + ETM_QMU_CFGMT_QSCH_CRBAL_DROP_ENr = 293, + ETM_QMU_CFGMT_WLIST_QNUM_FIFO_AFUL_THr = 294, + ETM_QMU_QCFG_CSW_PKT_BLK_MODEr = 295, + ETM_QMU_QCFG_QLIST_RAM_INIT_CANCELr = 296, + ETM_QMU_QCFG_QSCH_CRBAL_TRANSFER_MODEr = 297, + ETM_QMU_QCFG_QLIST_QCLR_INTERVALr = 298, + ETM_QMU_QCFG_QSCH_QCLR_RATEr = 299, + ETM_QMU_QCFG_QLIST_DDR_RANDOMr = 300, + ETM_QMU_CFGMT_QLIST_PDS_FIFO_AFULL_THr = 301, + ETM_QMU_CFGMT_SOP_CMD_FIFO_AFULL_THr = 302, + ETM_QMU_CFGMT_NON_SOP_CMD_FIFO_AFULL_THr = 303, + ETM_QMU_CFGMT_MMU_DATA_FIFO_AFULL_THr = 304, + ETM_QMU_QCFG_QLIST_BANK_EPT_THr = 305, + ETM_QMU_RANDOM_BYPASS_ENr = 306, + ETM_QMU_CFGMT_CRS_SPD_BYPASSr = 307, + ETM_QMU_CFGMT_CRS_INTERVALr = 308, + ETM_QMU_CFG_QSCH_AUTO_CREDIT_CONTROL_ENr = 309, + ETM_QMU_CFG_QSCH_AUTOCRFRSTQUEr = 310, + ETM_QMU_CFG_QSCH_AUTOCRLASTQUEr = 311, + ETM_QMU_CFG_QSCH_AUTOCREDITRATEr = 312, + ETM_QMU_CFG_QSCH_SCANFRSTQUEr = 313, + ETM_QMU_CFG_QSCH_SCANLASTQUEr = 314, + ETM_QMU_CFG_QSCH_SCANRATEr = 315, + ETM_QMU_CFG_QSCH_SCAN_ENr = 316, + ETM_QMU_CFGMT_QSCH_RD_CREDIT_FIFO_RATEr = 317, + ETM_QMU_QCFG_QLIST_BDEPr = 318, + ETM_QMU_QCFG_QLIST_BHEADr = 319, + ETM_QMU_QCFG_QLIST_BTAILr = 320, + ETM_QMU_QCFG_QSCH_SHAP_PARAMr = 321, + ETM_QMU_QCFG_QSCH_SHAP_TOKENr = 322, + ETM_QMU_QCFG_QSCH_SHAP_OFFSETr = 323, + ETM_QMU_QCFG_QSCH_CRS_EIR_THr = 324, + ETM_QMU_QCFG_QSCH_CRS_TH1r = 325, + ETM_QMU_QCFG_QSCH_CRS_TH2r = 326, + ETM_QMU_QCFG_CSCH_CONGEST_THr = 327, + ETM_QMU_QCFG_CSCH_SP_FC_THr = 328, + ETM_QMU_QCFG_CSW_SHAP_PARAMETERr = 329, + ETM_QMU_CFGMT_RD_RELEASE_AFUL_THr = 330, + ETM_QMU_CFGMT_DROP_IMEM_RELEASE_FIFO_AFUL_THr = 331, + ETM_QMU_CFGMT_NNH_RD_BUF_AFUL_THr = 332, + ETM_QMU_CFG_PID_USE_INALLr = 333, + ETM_QMU_CFG_PID_ROUND_THr = 334, + ETM_QMU_CFGMT_CREDIT_FIFO_AFULL_THr = 335, + ETM_QMU_CFGMT_SCAN_FIFO_AFULL_THr = 336, + ETM_QMU_CFGMT_SMALL_FIFO_AFUL_THr = 337, + ETM_QMU_CFGMT_FREE_ADDR_FIFO_AFUL_THr = 338, + ETM_QMU_CFGMT_ENQ_RPT_FIFO_AFUL_THr = 339, + ETM_QMU_QCFG_CSW_SHAP_TOKEN_DEPTHr = 340, + ETM_QMU_QCFG_CSW_SHAP_OFFSET_VALUEr = 341, + ETM_QMU_QCFG_CSW_FC_OFFSET_VALUEr = 342, + ETM_QMU_QMU_INIT_DONE_STATEr = 343, + ETM_QMU_CSW_QCFG_PORT_SHAP_RDY_0r = 344, + ETM_QMU_CSW_QCFG_PORT_SHAP_RDY_1r = 345, + ETM_QMU_QLIST_CFGMT_RAM_INIT_DONEr = 346, + ETM_QMU_QLIST_CFGMT_RAM_ECC_ERRr = 347, + ETM_QMU_QLIST_CFGMT_RAM_SLOT_ERRr = 348, + ETM_QMU_QSCH_CFGMT_RAM_ECCr = 349, + ETM_QMU_QLIST_CFGMT_FIFO_STATEr = 350, + ETM_QMU_QLIST_QCFG_CLR_DONEr = 351, + ETM_QMU_QMU_INT_MASK1r = 352, + ETM_QMU_QMU_INT_MASK2r = 353, + ETM_QMU_QMU_INT_MASK3r = 354, + ETM_QMU_QMU_INT_MASK4r = 355, + ETM_QMU_QMU_INT_MASK5r = 356, + ETM_QMU_QMU_INT_MASK6r = 357, + ETM_QMU_CMD_SCH_CFGMT_FIFO_STATEr = 358, + ETM_QMU_QLIST_R_BCNTr = 359, + ETM_QMU_QSCH_RW_CRBALr = 360, + ETM_QMU_QSCH_RW_CRSr = 361, + ETM_QMU_QSCH_R_WLIST_EMPTYr = 362, + ETM_QMU_QCFG_QLIST_BARAM_RDr = 363, + ETM_QMU_QCFG_QSCH_CRBAL_FB_RWr = 364, + ETM_QMU_QCFG_QLIST_GRP0_BANKr = 365, + ETM_QMU_QCFG_QLIST_GRP1_BANKr = 366, + ETM_QMU_QCFG_QLIST_GRP2_BANKr = 367, + ETM_QMU_QCFG_QLIST_GRP3_BANKr = 368, + ETM_QMU_QCFG_QLIST_GRP4_BANKr = 369, + ETM_QMU_QCFG_QLIST_GRP5_BANKr = 370, + ETM_QMU_QCFG_QLIST_GRP6_BANKr = 371, + ETM_QMU_QCFG_QLIST_GRP7_BANKr = 372, + ETM_QMU_QCFG_QLIST_GRPr = 373, + ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFGr = 374, + ETM_QMU_CFGMT_DDR_IN_MMU_CFGr = 375, + ETM_QMU_CFGMT_DDR_IN_QMU_CFGr = 376, + ETM_QMU_CFGMT_BANK_TO_MMU_CFGr = 377, + ETM_QMU_CFGMT_BANK_TO_QMU_CFGr = 378, + ETM_QMU_CFGMT_GRP_RAM_N_CLR_THDr = 379, + ETM_QMU_CFGMT_AGE_PKT_NUMr = 380, + ETM_QMU_CFGMT_AGE_MULTI_INTERVALr = 381, + ETM_QMU_CFGMT_QMU_PKT_AGE_ENr = 382, + ETM_QMU_CFGMT_QMU_PKT_AGE_INTERVALr = 383, + ETM_QMU_CFGMT_QMU_PKT_AGE_START_ENDr = 384, + ETM_QMU_CFGMT_PKT_AGE_REQ_AFUL_THr = 385, + ETM_QMU_CFGMT_PKT_AGE_STEP_INTERVALr = 386, + ETM_QMU_CFGMT_QMU_IMEM_AGE_MODEr = 387, + ETM_QMU_CFGMT_QMU_IMEM_QLEN_AGE_INTERVALr = 388, + ETM_QMU_CFGMT_QMU_IMEM_TIME_AGE_INTERVALr = 389, + ETM_QMU_CFGMT_QMU_IMEM_QLEN_AGE_THDr = 390, + ETM_QMU_CFGMT_IMEM_AGE_STEP_INTERVALr = 391, + ETM_QMU_CFGMT_QMU_ECC_BYPASS_READr = 392, + ETM_QMU_CFGMT_QMU_RESP_STAT_FC_ENr = 393, + ETM_QMU_CFGMT_QMU_BANK_XOFF_PDS_MODEr = 394, + ETM_QMU_CFGMT_QMU_STAT_OFFSETr = 395, + ETM_QMU_FC_CNT_MODEr = 396, + ETM_QMU_MMU_QMU_WR_FC_CNTr = 397, + ETM_QMU_MMU_QMU_RD_FC_CNTr = 398, + ETM_QMU_QMU_CGAVD_FC_CNTr = 399, + ETM_QMU_CGAVD_QMU_PKT_CNTr = 400, + ETM_QMU_CGAVD_QMU_PKTLEN_ALLr = 401, + ETM_QMU_OBSERVE_PORTFC_SPECr = 402, + ETM_QMU_SPEC_LIF_PORTFC_COUNTr = 403, + ETM_QMU_CFGMT_QMU_PFC_ENr = 404, + ETM_QMU_CFGMT_QMU_PFC_MASK_1r = 405, + ETM_QMU_CFGMT_QMU_PFC_MASK_2r = 406, + CFG_PCIE_INT_REPEATr = 407, + CFG_DMA_DMA_UP_SIZEr = 408, + CFG_CSR_SOC_WR_TIME_OUT_THRESHr = 409, + NPPU_MR_CFG_CFG_SHAP_PARAMr = 410, + NPPU_MR_CFG_CFG_SHAP_TOKENr = 411, + NPPU_MR_CFG_IDLE_PTR_FIFO_AFUL_THr = 412, + NPPU_MR_CFG_MR_COS_PORT_CFGr = 413, + NPPU_PKTRX_CFG_IND_STATUSr = 414, + NPPU_PKTRX_CFG_IND_CMDr = 415, + NPPU_PKTRX_CFG_IND_DATA0r = 416, + NPPU_PKTRX_CFG_IND_DATA1r = 417, + NPPU_PKTRX_CFG_IND_DATA2r = 418, + NPPU_PKTRX_CFG_IND_DATA3r = 419, + NPPU_PKTRX_CFG_IND_DATA4r = 420, + NPPU_PKTRX_CFG_IND_DATA5r = 421, + NPPU_PKTRX_CFG_IND_DATA6r = 422, + NPPU_PKTRX_CFG_IND_DATA7r = 423, + NPPU_PKTRX_CFG_TCAM_0_CMDr = 424, + NPPU_PKTRX_CFG_TCAM_1_CMDr = 425, + NPPU_PKTRX_CFG_PORT_EN_0r = 426, + NPPU_PKTRX_CFG_PORT_EN_1r = 427, + NPPU_PKTRX_CFG_PORT_EN_2r = 428, + NPPU_PKTRX_CFG_PORT_EN_3r = 429, + NPPU_PKTRX_CFG_CFG_PORT_L2_OFFSET_MODE_0r = 430, + NPPU_PKTRX_CFG_CFG_PORT_L2_OFFSET_MODE_1r = 431, + NPPU_PKTRX_CFG_CFG_PORT_L2_OFFSET_MODE_2r = 432, + NPPU_PKTRX_CFG_CFG_PORT_L2_OFFSET_MODE_3r = 433, + NPPU_PKTRX_CFG_PORT_FC_MODE_0r = 434, + NPPU_PKTRX_CFG_PORT_FC_MODE_1r = 435, + NPPU_PKTRX_CFG_PORT_FC_MODE_2r = 436, + NPPU_PKTRX_CFG_PORT_FC_MODE_3r = 437, + NPPU_PKTRX_CFG_PORT_FC_MODE_4r = 438, + NPPU_PKTRX_CFG_PORT_FC_MODE_5r = 439, + NPPU_PKTRX_CFG_PORT_FC_MODE_6r = 440, + NPPU_PKTRX_CFG_PORT_FC_MODE_7r = 441, + NPPU_PKTRX_CFG_CFG_ISCH_AGING_THr = 442, + NPPU_PKTRX_CFG_ISCH_FIFO_TH_0r = 443, + NPPU_PKTRX_CFG_ISCH_CFG_1r = 444, + NPPU_PKTRX_CFG_TCAM_0_VLDr = 445, + NPPU_PKTRX_CFG_TCAM_1_VLDr = 446, + NPPU_PKTRX_CFG_CPU_PORT_EN_MASKr = 447, + NPPU_PKTRX_CFG_PKTRX_GLBAL_CFG_0r = 448, + NPPU_PKTRX_CFG_PKTRX_GLBAL_CFG_1r = 449, + NPPU_PKTRX_CFG_PKTRX_GLBAL_CFG_2r = 450, + NPPU_PKTRX_CFG_PKTRX_GLBAL_CFG_3r = 451, + NPPU_PKTRX_CFG_NPPU_STARTr = 452, + NPPU_PKTRX_STAT_IND_STATUSr = 453, + NPPU_PKTRX_STAT_IND_CMDr = 454, + NPPU_PKTRX_STAT_IND_DATA0r = 455, + NPPU_IDMA_CFG_DEBUG_CNT_OVFL_MODEr = 456, + NPPU_IDMA_STAT_IND_STATUSr = 457, + NPPU_IDMA_STAT_IND_CMDr = 458, + NPPU_IDMA_STAT_IND_DATA0r = 459, + NPPU_PBU_CFG_IND_STATUSr = 460, + NPPU_PBU_CFG_IND_CMDr = 461, + NPPU_PBU_CFG_IND_DATA0r = 462, + NPPU_PBU_CFG_IND_DATA1r = 463, + NPPU_PBU_CFG_IND_DATA2r = 464, + NPPU_PBU_CFG_IND_DATA3r = 465, + NPPU_PBU_CFG_IND_DATA4r = 466, + NPPU_PBU_CFG_IND_DATA5r = 467, + NPPU_PBU_CFG_IND_DATA6r = 468, + NPPU_PBU_CFG_IND_DATA7r = 469, + NPPU_PBU_CFG_IDMA_PUBLIC_THr = 470, + NPPU_PBU_CFG_LIF_PUBLIC_THr = 471, + NPPU_PBU_CFG_IDMA_TOTAL_THr = 472, + NPPU_PBU_CFG_LIF_TOTAL_THr = 473, + NPPU_PBU_CFG_MC_TOTAL_THr = 474, + NPPU_PBU_CFG_MC_COS10_THr = 475, + NPPU_PBU_CFG_MC_COS32_THr = 476, + NPPU_PBU_CFG_MC_COS54_THr = 477, + NPPU_PBU_CFG_MC_COS76_THr = 478, + NPPU_PBU_CFG_DEBUG_CNT_OVFL_MODEr = 479, + NPPU_PBU_CFG_SE_KEY_AFUL_NEGATE_CFGr = 480, + NPPU_PBU_CFG_SA_FLAGr = 481, + NPPU_PBU_STAT_IND_DATAr = 482, + NPPU_PBU_STAT_IND_STATUSr = 483, + NPPU_PBU_STAT_IND_CMDr = 484, + NPPU_PBU_STAT_TOTAL_CNTr = 485, + NPPU_PBU_STAT_IDMA_PUB_CNTr = 486, + NPPU_PBU_STAT_LIF_PUB_CNTr = 487, + NPPU_PBU_STAT_MC_TOTAL_CNTr = 488, + NPPU_PBU_STAT_PBU_THRAM_INIT_DONEr = 489, + NPPU_PBU_STAT_IFB_FPTR_INIT_DONEr = 490, + NPPU_ISU_CFG_WEIGHT_NORMAL_UCr = 491, + NPPU_ISU_CFG_FABRIC_OR_SAIPr = 492, + NPPU_ISU_STAT_IND_STATUSr = 493, + NPPU_ISU_STAT_IND_CMDr = 494, + NPPU_ISU_STAT_IND_DAT0r = 495, + NPPU_ODMA_CFG_IND_ACCESS_DONEr = 496, + NPPU_ODMA_CFG_IND_COMMANDr = 497, + NPPU_ODMA_CFG_IND_DAT0r = 498, + NPPU_ODMA_CFG_IND_DAT1r = 499, + NPPU_ODMA_CFG_FABRIC_OR_SAIPr = 500, + NPPU_ODMA_CFG_MAX_PKT_LENr = 501, + NPPU_ODMA_CFG_AGE_ENr = 502, + NPPU_ODMA_CFG_AGE_MODEr = 503, + NPPU_ODMA_CFG_AGE_VALUE_TIMEr = 504, + NPPU_ODMA_CFG_AGE_VALUE_ROOMr = 505, + NPPU_ODMA_CFG_AGE_OUT_CNTr = 506, + NPPU_ODMA_CFG_TOKEN_VALUE_Ar = 507, + NPPU_ODMA_CFG_TOKEN_VALUE_Br = 508, + NPPU_ODMA_CFG_CFG_SHAP_EN_P0r = 509, + NPPU_ODMA_CFG_CFG_SHAP_EN_P1r = 510, + NPPU_ODMA_CFG_CFG_SHAP_EN_TMr = 511, + NPPU_ODMA_STAT_IND_STATUSr = 512, + NPPU_ODMA_STAT_IND_CMDr = 513, + NPPU_ODMA_STAT_IND_DATA0r = 514, + NPPU_ODMA_STAT_DEBUG_CNT_CFGr = 515, + NPPU_OAM_CFG_BFD_FIRSTCHK_THr = 516, + NPPU_PBU_CFG_MEMID_0_PBU_FC_IDMATH_RAMr = 517, + NPPU_PBU_CFG_MEMID_1_PBU_FC_MACTH_RAMr = 518, + NPPU_PBU_STAT_MEMID_1_ALL_KIND_PORT_CNTr = 519, + NPPU_PBU_STAT_MEMID_2_PPU_PBU_IFB_REQ_VLD_CNTr = 520, + NPPU_PBU_STAT_MEMID_2_PBU_PPU_IFB_RSP_VLD_CNTr = 521, + NPPU_PBU_STAT_MEMID_2_ODMA_PBU_RECY_PTR_VLD_CNTr = 522, + NPPU_PBU_STAT_MEMID_2_PPU_PBU_MCODE_PF_REQ_CNTr = 523, + NPPU_PBU_STAT_MEMID_2_PBU_PPU_MCODE_PF_RSP_CNTr = 524, + NPPU_PBU_STAT_MEMID_2_PPU_PBU_LOGIC_PF_REQ_CNTr = 525, + NPPU_PBU_STAT_MEMID_2_PBU_PPU_LOGIC_PF_RSP_CNTr = 526, + NPPU_PBU_STAT_MEMID_2_PPU_USE_PTR_PULSE_CNTr = 527, + NPPU_PBU_STAT_MEMID_2_PPU_PBU_WB_VLD_CNTr = 528, + NPPU_PBU_STAT_MEMID_2_PBU_PPU_REORDER_PARA_VLD_CNTr = 529, + NPPU_PBU_STAT_MEMID_2_SE_PBU_DPI_KEY_VLD_CNTr = 530, + NPPU_PBU_STAT_MEMID_2_PBU_SE_DPI_RSP_DATVLD_CNTr = 531, + NPPU_PBU_STAT_MEMID_2_ODMA_PBU_IFB_RD1_CNTr = 532, + NPPU_PBU_STAT_MEMID_2_ODMA_PBU_IFB_RD2_CNTr = 533, + NPPU_PBU_STAT_MEMID_2_PBU_PPU_MCODE_PF_NO_RSP_CNTr = 534, + NPPU_PBU_STAT_MEMID_2_PBU_PPU_LOGIC_PF_NO_RSP_CNTr = 535, + NPPU_PBU_STAT_MEMID_3_CPU_RD_IFB_DATAr = 536, + NPPU_PBU_STAT_MEMID_4_MUX_SEL_RGTr = 537, + NPPU_PBU_STAT_MEMID_5_PORT_PUB_CNTr = 538, + NPPU_IDMA_STAT_MEMID_1_IDMA_O_ISU_PKT_PULSE_TOTAL_CNTr = 539, + NPPU_IDMA_STAT_MEMID_1_IDMA_O_ISU_EPKT_PULSE_TOTAL_CNTr = 540, + NPPU_IDMA_STAT_MEMID_1_IDMA_DISPKT_PULSE_TOTAL_CNTr = 541, + NPPU_IDMA_STAT_MEMID_0_IDMA_O_ISU_PKT_PULSE_CNTr = 542, + NPPU_IDMA_STAT_MEMID_0_IDMA_O_ISU_EPKT_PULSE_CNTr = 543, + NPPU_IDMA_STAT_MEMID_0_IDMA_DISPKT_PULSE_CNTr = 544, + PPU_PPU_TEST_Rr = 545, + PPU_PPU_PPU_DEBUG_EN_Rr = 546, + PPU_PPU_CSR_DUP_TABLE_WR_DATAr = 547, + PPU_PPU_CSR_DUP_TABLE_RD_DATAr = 548, + PPU_PPU_CSR_DUP_TABLE_ADDRr = 549, + PPU_PPU_PPU_DEBUG_VLDr = 550, + PPU_PPU_COP_THASH_RSK_319_288r = 551, + PPU_PPU_COP_THASH_RSK_287_256r = 552, + PPU_PPU_COP_THASH_RSK_255_224r = 553, + PPU_PPU_COP_THASH_RSK_223_192r = 554, + PPU_PPU_COP_THASH_RSK_191_160r = 555, + PPU_PPU_COP_THASH_RSK_159_128r = 556, + PPU_PPU_COP_THASH_RSK_127_096r = 557, + PPU_PPU_COP_THASH_RSK_095_064r = 558, + PPU_PPU_COP_THASH_RSK_063_032r = 559, + PPU_PPU_COP_THASH_RSK_031_000r = 560, + PPU_PPU_CFG_IPV4_IPID_START_VALUEr = 561, + PPU_PPU_CFG_IPV4_IPID_END_VALUEr = 562, + PPU_PPU_CLUSTER_MF_IN_ENr = 563, + PPU_PPU_PPU_EMPTYr = 564, + PPU_PPU_INSTRMEM_W_ADDRr = 565, + PPU_PPU_INSTRMEM_W_DATA_191_160r = 566, + PPU_PPU_INSTRMEM_W_DATA_159_128r = 567, + PPU_PPU_INSTRMEM_W_DATA_127_96r = 568, + PPU_PPU_INSTRMEM_W_DATA_95_64r = 569, + PPU_PPU_INSTRMEM_W_DATA_63_32r = 570, + PPU_PPU_INSTRMEM_W_DATA_31_0r = 571, + PPU_PPU_ISU_FWFT_MF_FIFO_PROG_FULL_ASSERT_CFGr = 572, + PPU_PPU_ISU_FWFT_MF_FIFO_PROG_FULL_NEGATE_CFGr = 573, + PPU_CLUSTER_INT_1200M_MASKr = 574, + PPU4K_CLUSTER_WR_HIGH_DATA_R_MEXr = 575, + PPU4K_CLUSTER_WR_LOW_DATA_R_MEXr = 576, + PPU4K_CLUSTER_ADDR_R_MEXr = 577, + PPU4K_CLUSTER_SDT_TBL_IND_ACCESS_DONEr = 578, + PPU4K_CLUSTER_RD_HIGH_DATA_R_MEXr = 579, + PPU4K_CLUSTER_RD_LOW_DATA_R_MEXr = 580, + SE_ALG_INIT_OKr = 581, + SE_ALG_CPU_RD_RDYr = 582, + SE_ALG_CPU_RD_DATA_TMP0r = 583, + SE_ALG_CPU_RD_DATA_TMP1r = 584, + SE_ALG_CPU_RD_DATA_TMP2r = 585, + SE_ALG_CPU_RD_DATA_TMP3r = 586, + SE_ALG_CPU_RD_DATA_TMP4r = 587, + SE_ALG_CPU_RD_DATA_TMP5r = 588, + SE_ALG_CPU_RD_DATA_TMP6r = 589, + SE_ALG_CPU_RD_DATA_TMP7r = 590, + SE_ALG_CPU_RD_DATA_TMP8r = 591, + SE_ALG_CPU_RD_DATA_TMP9r = 592, + SE_ALG_CPU_RD_DATA_TMP10r = 593, + SE_ALG_CPU_RD_DATA_TMP11r = 594, + SE_ALG_CPU_RD_DATA_TMP12r = 595, + SE_ALG_CPU_RD_DATA_TMP13r = 596, + SE_ALG_CPU_RD_DATA_TMP14r = 597, + SE_ALG_CPU_RD_DATA_TMP15r = 598, + SE_ALG_LPM_V4_CONFIG_RGTr = 599, + SE_ALG_LPM_V6_CONFIG_RGTr = 600, + SE_ALG_LPM_EXT_RSP_FIFO_U0_PFULL_ASTr = 601, + SE_AS_HASH_AGE_PAT_CFGr = 602, + SE_AS_LEARN_RDY_CFGr = 603, + SE_KSCHD_KSCHD_AS_PFUL_CFGr = 604, + SE_KSCHD_KSCHD_DIR_PFUL_CFGr = 605, + SE_KSCHD_KSCHD_AS_EPT_CFGr = 606, + SE_KSCHD_CPU_ARBI_PFUL_CFGr = 607, + SE_KSCHD_KSCHD_PBU_PFUL_CFGr = 608, + SE_RSCHD_RSCHD_DIR_PFUL_CFGr = 609, + SE_RSCHD_RSCHD_DIR_EPT_CFGr = 610, + SE4K_SE_ALG_CPU_CMD_RGTr = 611, + SE4K_SE_ALG_CPU_WR_DATA_TMP0r = 612, + SE4K_SE_ALG_CPU_WR_DATA_TMP1r = 613, + SE4K_SE_ALG_CPU_WR_DATA_TMP2r = 614, + SE4K_SE_ALG_CPU_WR_DATA_TMP3r = 615, + SE4K_SE_ALG_CPU_WR_DATA_TMP4r = 616, + SE4K_SE_ALG_CPU_WR_DATA_TMP5r = 617, + SE4K_SE_ALG_CPU_WR_DATA_TMP6r = 618, + SE4K_SE_ALG_CPU_WR_DATA_TMP7r = 619, + SE4K_SE_ALG_CPU_WR_DATA_TMP8r = 620, + SE4K_SE_ALG_CPU_WR_DATA_TMP9r = 621, + SE4K_SE_ALG_CPU_WR_DATA_TMP10r = 622, + SE4K_SE_ALG_CPU_WR_DATA_TMP11r = 623, + SE4K_SE_ALG_CPU_WR_DATA_TMP12r = 624, + SE4K_SE_ALG_CPU_WR_DATA_TMP13r = 625, + SE4K_SE_ALG_CPU_WR_DATA_TMP14r = 626, + SE4K_SE_ALG_CPU_WR_DATA_TMP15r = 627, + SE4K_SE_ALG_CPU_RD_RDYr = 628, + SE4K_SE_ALG_CPU_RD_DATA_TMP0r = 629, + SE4K_SE_ALG_CPU_RD_DATA_TMP1r = 630, + SE4K_SE_ALG_CPU_RD_DATA_TMP2r = 631, + SE4K_SE_ALG_CPU_RD_DATA_TMP3r = 632, + SE4K_SE_ALG_CPU_RD_DATA_TMP4r = 633, + SE4K_SE_ALG_CPU_RD_DATA_TMP5r = 634, + SE4K_SE_ALG_CPU_RD_DATA_TMP6r = 635, + SE4K_SE_ALG_CPU_RD_DATA_TMP7r = 636, + SE4K_SE_ALG_CPU_RD_DATA_TMP8r = 637, + SE4K_SE_ALG_CPU_RD_DATA_TMP9r = 638, + SE4K_SE_ALG_CPU_RD_DATA_TMP10r = 639, + SE4K_SE_ALG_CPU_RD_DATA_TMP11r = 640, + SE4K_SE_ALG_CPU_RD_DATA_TMP12r = 641, + SE4K_SE_ALG_CPU_RD_DATA_TMP13r = 642, + SE4K_SE_ALG_CPU_RD_DATA_TMP14r = 643, + SE4K_SE_ALG_CPU_RD_DATA_TMP15r = 644, + SE4K_SE_ALG_HASH0_EXT_CFG_RGTr = 645, + SE4K_SE_ALG_HASH1_EXT_CFG_RGTr = 646, + SE4K_SE_ALG_HASH2_EXT_CFG_RGTr = 647, + SE4K_SE_ALG_HASH3_EXT_CFG_RGTr = 648, + SE4K_SE_ALG_HASH0_TBL30_DEPTHr = 649, + SE4K_SE_ALG_HASH0_TBL74_DEPTHr = 650, + SE4K_SE_ALG_HASH1_TBL30_DEPTHr = 651, + SE4K_SE_ALG_HASH1_TBL74_DEPTHr = 652, + SE4K_SE_ALG_HASH2_TBL30_DEPTHr = 653, + SE4K_SE_ALG_HASH2_TBL74_DEPTHr = 654, + SE4K_SE_ALG_HASH3_TBL30_DEPTHr = 655, + SE4K_SE_ALG_HASH3_TBL74_DEPTHr = 656, + SE4K_SE_ALG_WR_RSP_CFGr = 657, + SE4K_SE_ALG_HASH_MONO_FLAGr = 658, + SE4K_SE_ALG_HASH10_EXT_CRC_CFGr = 659, + SE4K_SE_ALG_HASH32_EXT_CRC_CFGr = 660, + SE4K_SE_ALG_ZBLOCK_SERVICE_CONFIGUREr = 661, + SE4K_SE_ALG_ZBLOCK_HASH_ZCELL_MONOr = 662, + SE4K_SE_ALG_ZLOCK_HASH_ZREG_MONOr = 663, + SMMU0_SMMU0_INIT_DONEr = 664, + SMMU0_SMMU0_CPU_IND_WDAT0r = 665, + SMMU0_SMMU0_CPU_IND_WDAT1r = 666, + SMMU0_SMMU0_CPU_IND_WDAT2r = 667, + SMMU0_SMMU0_CPU_IND_WDAT3r = 668, + SMMU0_SMMU0_CPU_IND_CMDr = 669, + SMMU0_SMMU0_CPU_IND_RD_DONEr = 670, + SMMU0_SMMU0_CPU_IND_RDAT0r = 671, + SMMU0_SMMU0_CPU_IND_RDAT1r = 672, + SMMU0_SMMU0_CPU_IND_RDAT2r = 673, + SMMU0_SMMU0_CPU_IND_RDAT3r = 674, + SMMU0_SMMU0_CFG_PLCR_MONOr = 675, + SMMU0_SMMU0_WR_ARB_CPU_RDYr = 676, + SMMU0_SMMU0_TM_STAT_EN_CFGr = 677, + SE_SMMU1_DDR_WDAT0r = 678, + SE_SMMU1_DIR_ARBI_SER_RPFULr = 679, + SE_SMMU1_CFG_WR_ARBI_PFUL2r = 680, + SE_SMMU1_ETM_TBL_CFGr = 681, + SE_SMMU1_CFG_CASH_ADDR_PFULr = 682, + SE_SMMU1_CTRL_RFIFO_CFGr = 683, + SE_SMMU1_CACHE_REQ_FIFO_CFGr = 684, + STAT_STAT_CFG_CPU_IND_ERAM_WDAT0r = 685, + STAT_STAT_CFG_ETM_PORT_SEL_CFGr = 686, + STAT_STAT_CFG_TM_STAT_CFGr = 687, + STAT_STAT_CFG_PPU_ERAM_DEPTHr = 688, + STAT_STAT_CFG_PPU_ERAM_BASE_ADDRr = 689, + STAT_STAT_CFG_PPU_DDR_BASE_ADDRr = 690, + STAT_STAT_CFG_PLCR0_BASE_ADDRr = 691, + STAT_STAT_CFG_ETM_STAT_START_ADDR_CFGr = 692, + STAT_STAT_CFG_ETM_STAT_DEPTH_CFGr = 693, + STAT_STAT_CFG_CYCLE_MOV_EN_CFGr = 694, + STAT_ETCAM_CPU_IND_WDAT0r = 695, + STAT_ETCAM_CPU_IND_CTRL_TMP0r = 696, + STAT_ETCAM_CPU_IND_CTRL_TMP1r = 697, + STAT_ETCAM_CPU_IND_RD_DONEr = 698, + STAT_ETCAM_CPU_RDAT0r = 699, + STAT_ETCAM_CPU_RDAT1r = 700, + STAT_ETCAM_CPU_RDAT2r = 701, + STAT_ETCAM_CPU_RDAT3r = 702, + STAT_ETCAM_CPU_RDAT4r = 703, + STAT_ETCAM_CPU_RDAT5r = 704, + STAT_ETCAM_CPU_RDAT6r = 705, + STAT_ETCAM_CPU_RDAT7r = 706, + STAT_ETCAM_CPU_RDAT8r = 707, + STAT_ETCAM_CPU_RDAT9r = 708, + STAT_ETCAM_CPU_RDAT10r = 709, + STAT_ETCAM_CPU_RDAT11r = 710, + STAT_ETCAM_CPU_RDAT12r = 711, + STAT_ETCAM_CPU_RDAT13r = 712, + STAT_ETCAM_CPU_RDAT14r = 713, + STAT_ETCAM_CPU_RDAT15r = 714, + STAT_ETCAM_CPU_RDAT16r = 715, + STAT_ETCAM_CPU_RDAT17r = 716, + STAT_ETCAM_CPU_RDAT18r = 717, + STAT_ETCAM_CPU_RDAT19r = 718, + STAT_ETCAM_QVBOr = 719, + STAT_ETCAM_CNT_OVERFLOW_MODEr = 720, + STAT_CAR0_CARA_QUEUE_RAM0_159_0r = 721, + STAT_CAR0_CARA_PROFILE_RAM1_255_0r = 722, + STAT_CAR0_CARA_QOVS_RAM_RAM2r = 723, + STAT_CAR0_LOOK_UP_TABLE1r = 724, + STAT_CAR0_CARA_PKT_DES_I_CNTr = 725, + STAT_CAR0_CARA_GREEN_PKT_I_CNTr = 726, + STAT_CAR0_CARA_YELLOW_PKT_I_CNTr = 727, + STAT_CAR0_CARA_RED_PKT_I_CNTr = 728, + STAT_CAR0_CARA_PKT_DES_O_CNTr = 729, + STAT_CAR0_CARA_GREEN_PKT_O_CNTr = 730, + STAT_CAR0_CARA_YELLOW_PKT_O_CNTr = 731, + STAT_CAR0_CARA_RED_PKT_O_CNTr = 732, + STAT_CAR0_CARA_PKT_DES_FC_FOR_CFG_CNTr = 733, + STAT_CAR0_CARA_APPOINT_QNUM_OR_SPr = 734, + STAT_CAR0_CARA_CFGMT_COUNT_MODEr = 735, + STAT_CAR0_CARA_PKT_SIZE_CNTr = 736, + STAT_CAR0_CARA_PLCR_INIT_DONTr = 737, + STAT_CAR0_CARB_QUEUE_RAM0_159_0r = 738, + STAT_CAR0_CARB_PROFILE_RAM1_255_0r = 739, + STAT_CAR0_CARB_QOVS_RAM_RAM2r = 740, + STAT_CAR0_LOOK_UP_TABLE2r = 741, + STAT_CAR0_CARB_PKT_DES_I_CNTr = 742, + STAT_CAR0_CARB_GREEN_PKT_I_CNTr = 743, + STAT_CAR0_CARB_YELLOW_PKT_I_CNTr = 744, + STAT_CAR0_CARB_RED_PKT_I_CNTr = 745, + STAT_CAR0_CARB_PKT_DES_O_CNTr = 746, + STAT_CAR0_CARB_GREEN_PKT_O_CNTr = 747, + STAT_CAR0_CARB_YELLOW_PKT_O_CNTr = 748, + STAT_CAR0_CARB_RED_PKT_O_CNTr = 749, + STAT_CAR0_CARB_PKT_DES_FC_FOR_CFG_CNTr = 750, + STAT_CAR0_CARB_APPOINT_QNUM_OR_SPr = 751, + STAT_CAR0_CARB_CFGMT_COUNT_MODEr = 752, + STAT_CAR0_CARB_PKT_SIZE_CNTr = 753, + STAT_CAR0_CARB_PLCR_INIT_DONTr = 754, + STAT_CAR0_CARC_QUEUE_RAM0_159_0r = 755, + STAT_CAR0_CARC_PROFILE_RAM1_255_0r = 756, + STAT_CAR0_CARC_QOVS_RAM_RAM2r = 757, + STAT_CAR0_CARC_PKT_DES_I_CNTr = 758, + STAT_CAR0_CARC_GREEN_PKT_I_CNTr = 759, + STAT_CAR0_CARC_YELLOW_PKT_I_CNTr = 760, + STAT_CAR0_CARC_RED_PKT_I_CNTr = 761, + STAT_CAR0_CARC_PKT_DES_O_CNTr = 762, + STAT_CAR0_CARC_GREEN_PKT_O_CNTr = 763, + STAT_CAR0_CARC_YELLOW_PKT_O_CNTr = 764, + STAT_CAR0_CARC_RED_PKT_O_CNTr = 765, + STAT_CAR0_CARC_PKT_DES_FC_FOR_CFG_CNTr = 766, + STAT_CAR0_CARC_APPOINT_QNUM_OR_SPr = 767, + STAT_CAR0_CARC_CFGMT_COUNT_MODEr = 768, + STAT_CAR0_CARC_PKT_SIZE_CNTr = 769, + STAT_CAR0_CARC_PLCR_INIT_DONTr = 770, + STAT_CAR0_CARB_RANDOM_RAMr = 771, + STAT_CAR0_CARC_RANDOM_RAMr = 772, + STAT_CAR0_CARA_BEGIN_FLOW_IDr = 773, + STAT_CAR0_CARB_BEGIN_FLOW_IDr = 774, + STAT_CAR0_CARC_BEGIN_FLOW_IDr = 775, + STAT_CAR0_PROG_FULL_ASSERT_CFG_Wr = 776, + STAT_CAR0_PROG_FULL_NEGATE_CFG_Wr = 777, + STAT_CAR0_TIMEOUT_LIMITr = 778, + STAT_CAR0_PKT_DES_FIFO_OVERFLOWr = 779, + STAT_CAR0_PKT_DES_FIFO_UNDERFLOWr = 780, + STAT_CAR0_PKT_DES_FIFO_PROG_FULLr = 781, + STAT_CAR0_PKT_DES_FIFO_PROG_EMPTYr = 782, + STAT_CAR0_PKT_DES_FIFO_FULLr = 783, + STAT_CAR0_PKT_DES_FIFO_EMPTYr = 784, + STAT_CAR0_PKT_SIZE_OFFSETr = 785, + STAT_CAR0_CAR_PLCR_INIT_DONTr = 786, + STAT_CAR0_MAX_PKT_SIZE_Ar = 787, + STAT_CAR0_MAX_PKT_SIZE_Br = 788, + STAT_CAR0_MAX_PKT_SIZE_Cr = 789, + STAT_CAR0_CAR_HIERARCHY_MODEr = 790, + STAT_CAR0_PROG_EMPTY_ASSERT_CFG_Wr = 791, + STAT_CAR0_PROG_EMPTY_NEGATE_CFG_Wr = 792, + STAT_CAR0_PKT_DES_FIFO_OVF_INTr = 793, + STAT_CAR0_PKT_DES_FIFO_DATA_COUNTr = 794, + STAT_CAR0_PKT_DES_FIFO_UDF_INTr = 795, + STAT_CAR0_CARA_QUEUE_RAM0_159_0_PKTr = 796, + STAT_CAR0_CARA_PROFILE_RAM1_255_0_PKTr = 797, + STAT4K_ETCAM_BLOCK0_7_PORT_ID_CFGr = 798, + STAT4K_ETCAM_BLOCK0_3_BASE_ADDR_CFGr = 799, + STAT4K_ETCAM_BLOCK4_7_BASE_ADDR_CFGr = 800, + DTB_DTB_CFG_CFG_ERAM_WR_INTERVAL_CNTr = 801, + DTB_DTB_CFG_CFG_ZCAM_WR_INTERVAL_CNTr = 802, + DTB_DTB_CFG_CFG_TCAM_WR_INTERVAL_CNTr = 803, + DTB_DTB_CFG_CFG_DDR_WR_INTERVAL_CNTr = 804, + DTB_DTB_CFG_CFG_HASH_WR_INTERVAL_CNTr = 805, + DTB_DTB_CFG_CFG_ERAM_RD_INTERVAL_CNTr = 806, + DTB_DTB_CFG_CFG_ZCAM_RD_INTERVAL_CNTr = 807, + DTB_DTB_CFG_CFG_TCAM_RD_INTERVAL_CNTr = 808, + DTB_DTB_CFG_CFG_DDR_RD_INTERVAL_CNTr = 809, + DTB_DTB_CFG_CFG_DTB_QUEUE_LOCK_STATE_0_3r = 810, + DTB_DTB_AXIM0_W_CONVERT_0_MODEr = 811, + DTB_DTB_AXIM0_R_CONVERT_0_MODEr = 812, + DTB_DTB_AXIM0_AXIMR_OSr = 813, + DTB_DTB_AXIM1_W_CONVERT_1_MODEr = 814, + DTB_DTB_AXIM1_R_CONVERT_1_MODEr = 815, + DTB_DTB_AXIS_AXIS_CONVERT_MODEr = 816, + DTB4K_DTB_ENQ_CFG_QUEUE_DTB_ADDR_H_0_127r = 817, + DTB4K_DTB_ENQ_CFG_QUEUE_DTB_ADDR_L_0_127r = 818, + DTB4K_DTB_ENQ_CFG_QUEUE_DTB_LEN_0_127r = 819, + DTB4K_DTB_ENQ_INFO_QUEUE_BUF_SPACE_LEFT_0_127r = 820, + DTB4K_DTB_ENQ_CFG_EPID_V_FUNC_NUM_0_127r = 821, + TRPG_TRPG_RX_PORT_CPU_TRPG_MS_ENr = 822, + TRPG_TRPG_RX_PORT_CPU_TRPG_PORT_ENr = 823, + TRPG_TRPG_RX_PORT_CPU_TRPG_LOOK_ENr = 824, + TRPG_TRPG_RX_PORT_CPU_TRPGRX_RAM_ALMOST_FULLr = 825, + TRPG_TRPG_RX_PORT_CPU_TRPGRX_RAM_TEST_ENr = 826, + TRPG_TRPG_RX_PORT_CPU_TRPGRX_INMOD_PFC_RDY_ENr = 827, + TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_NUM_Hr = 828, + TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_NUM_Lr = 829, + TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_BYTE_NUM_Hr = 830, + TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_BYTE_NUM_Lr = 831, + TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_CNT_CLRr = 832, + TRPG_TRPG_RX_PORT_CPU_TRPGRX_FC_CLK_FREQr = 833, + TRPG_TRPG_RX_PORT_CPU_TRPGRX_FC_ENr = 834, + TRPG_TRPG_RX_PORT_CPU_TRPGRX_FC_TOKEN_ADD_NUMr = 835, + TRPG_TRPG_RX_PORT_CPU_TRPGRX_FC_TOKEN_MAX_NUMr = 836, + TRPG_TRPG_RX_PORT_CPU_TRPGRX_PORT_STATE_INFOr = 837, + TRPG_TRPG_RX_PORT_CPU_TRPGRX_RAM_PAST_MAX_DEPr = 838, + TRPG_TRPG_RX_PORT_CPU_TRPGRX_RAM_PAST_MAX_DEP_CLRr = 839, + TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_PAST_MAX_LENr = 840, + TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_PAST_MAX_LEN_CLRr = 841, + TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_PAST_MIN_LENr = 842, + TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_PAST_MIN_LEN_CLRr = 843, + TRPG_TRPG_RX_RAM_TRPG_RX_DATA_RAMr = 844, + TRPG_TRPG_RX_RAM_TRPG_RX_INFO_RAMr = 845, + TRPG_TRPG_TX_PORT_CPU_TRPG_MS_ENr = 846, + TRPG_TRPG_TX_PORT_CPU_TRPG_PORT_ENr = 847, + TRPG_TRPG_TX_PORT_CPU_TRPG_LOOK_ENr = 848, + TRPG_TRPG_TX_PORT_CPU_TRPGTX_RAM_ALMOST_FULLr = 849, + TRPG_TRPG_TX_PORT_CPU_TRPGTX_RAM_TEST_ENr = 850, + TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_NUM_Hr = 851, + TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_NUM_Lr = 852, + TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_BYTE_NUM_Hr = 853, + TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_BYTE_NUM_Lr = 854, + TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_CNT_CLRr = 855, + TRPG_TRPG_TX_PORT_CPU_TRPGTX_FC_CLK_FREQr = 856, + TRPG_TRPG_TX_PORT_CPU_TRPGTX_FC_ENr = 857, + TRPG_TRPG_TX_PORT_CPU_TRPGTX_FC_TOKEN_ADD_NUMr = 858, + TRPG_TRPG_TX_PORT_CPU_TRPGTX_FC_TOKEN_MAX_NUMr = 859, + TRPG_TRPG_TX_PORT_CPU_TRPGTX_PORT_STATE_INFOr = 860, + TRPG_TRPG_TX_PORT_CPU_TRPGTX_RAM_PAST_MAX_DEPr = 861, + TRPG_TRPG_TX_PORT_CPU_TRPGTX_RAM_PAST_MAX_DEP_CLRr = 862, + TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_PAST_MAX_LENr = 863, + TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_PAST_MAX_LEN_CLRr = 864, + TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_PAST_MIN_LENr = 865, + TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_PAST_MIN_LEN_CLRr = 866, + TRPG_TRPG_TX_ETM_PORT_CPU_TRPGTX_ETM_RAM_ALMOST_FULLr = 867, + TRPG_TRPG_TX_ETM_PORT_CPU_TRPGTX_ETM_RAM_TEST_ENr = 868, + TRPG_TRPG_TX_GLB_CPU_TODTIME_UPDATE_INT_MASKr = 869, + TRPG_TRPG_TX_GLB_CPU_TODTIME_UPDATE_INT_CLRr = 870, + TRPG_TRPG_TX_GLB_CPU_TODTIME_RAM_TEST_ENr = 871, + TRPG_TRPG_TX_RAM_TRPG_TX_DATA_RAMr = 872, + TRPG_TRPG_TX_RAM_TRPG_TX_INFO_RAMr = 873, + TRPG_TRPG_TX_ETM_RAM_TRPG_TX_ETM_DATA_RAMr = 874, + TRPG_TRPG_TX_ETM_RAM_TRPG_TX_ETM_INFO_RAMr = 875, + ETM_CFGMT_CHIP_VERSION_REGr = 876, + ETM_CFGMT_CHIP_DATE_REGr = 877, + ETM_CFGMT_CFGMT_CRC_ENr = 878, + ETM_CFGMT_CFG_PORT_TRANSFER_ENr = 879, + ETM_CFGMT_TM_SA_WORK_MODEr = 880, + ETM_CFGMT_LOCAL_SA_IDr = 881, + ETM_OLIF_OLIF_RDYr = 882, + ETM_OLIF_EMEM_PROG_FULLr = 883, + ETM_OLIF_PORT_ORDER_FIFO_FULLr = 884, + ETM_OLIF_OLIF_RELEASE_LASTr = 885, + ETM_OLIF_OLIF_FIFO_EMPTY_STATEr = 886, + ETM_OLIF_QMU_OLIF_RELEASE_FC_CNTr = 887, + ETM_OLIF_OLIF_QMU_LINK_FC_CNTr = 888, + ETM_OLIF_LIF0_LINK_FC_CNTr = 889, + ETM_OLIF_OLIF_TMMU_FC_CNTr = 890, + ETM_OLIF_OLIF_MMU_FC_CNTr = 891, + ETM_OLIF_OLIF_QMU_PORT_RDY_Hr = 892, + ETM_OLIF_OLIF_QMU_PORT_RDY_Lr = 893, + ETM_OLIF_LIF0_PORT_RDY_Hr = 894, + ETM_OLIF_LIF0_PORT_RDY_Lr = 895, + ETM_OLIF_QMU_OLIF_RD_SOP_CNTr = 896, + ETM_OLIF_QMU_OLIF_RD_EOP_CNTr = 897, + ETM_OLIF_QMU_OLIF_RD_VLD_CNTr = 898, + ETM_OLIF_QMU_OLIF_RD_BLK_CNTr = 899, + ETM_OLIF_MMU_TM_DATA_SOP_CNTr = 900, + ETM_OLIF_MMU_TM_DATA_EOP_CNTr = 901, + ETM_OLIF_MMU_TM_DATA_VLD_CNTr = 902, + ETM_OLIF_ODMA_TM_DATA_SOP_CNTr = 903, + ETM_OLIF_ODMA_TM_DATA_EOP_CNTr = 904, + ETM_OLIF_ODMA_TM_DEQ_VLD_CNTr = 905, + ETM_OLIF_OLIF_QMU_RELEASE_VLD_CNTr = 906, + ETM_OLIF_EMEM_DAT_VLD_CNTr = 907, + ETM_OLIF_IMEM_DAT_VLD_CNTr = 908, + ETM_OLIF_EMEM_DAT_RD_CNTr = 909, + ETM_OLIF_IMEM_DAT_RD_CNTr = 910, + ETM_OLIF_QMU_OLIF_RD_SOP_EMEM_CNTr = 911, + ETM_OLIF_QMU_OLIF_RD_VLD_EMEM_CNTr = 912, + ETM_OLIF_CPU_LAST_WR_ADDRr = 913, + ETM_OLIF_CPU_LAST_WR_DATAr = 914, + ETM_OLIF_CPU_LAST_RD_ADDRr = 915, + ETM_OLIF_QMU_OLIF_LAST_PORTr = 916, + ETM_OLIF_QMU_OLIF_LAST_ADDRr = 917, + ETM_OLIF_QMU_OLIF_LAST_BANKr = 918, + ETM_OLIF_TM_LIF_BYTE_STATr = 919, + ETM_OLIF_TM_LIF_ERR_STATr = 920, + ETM_CGAVD_PORT_SHARE_CNTr = 921, + ETM_CGAVD_TOTAL_IMEM_CNTr = 922, + ETM_CGAVD_PP_Q_LENr = 923, + ETM_CGAVD_SYS_Q_LENr = 924, + ETM_CGAVD_CGAVD_CFG_ERROR_WARNINGr = 925, + ETM_CGAVD_MULT_QLEN_TH_ENr = 926, + ETM_CGAVD_MULT_QLEN_THr = 927, + ETM_CGAVD_CGAVD_CFG_MOVEr = 928, + ETM_CGAVD_CFGMT_TOTAL_THr = 929, + ETM_CGAVD_CFGMT_PORT_SHARE_THr = 930, + ETM_CGAVD_SA_UNREACH_STATEr = 931, + ETM_CGAVD_MV_PORT_THr = 932, + ETM_CGAVD_MV_DROP_SP_THr = 933, + ETM_CGAVD_CGAVD_STATE_WARNINGr = 934, + ETM_CGAVD_TMMU_CGAVD_DMA_FIFO_CNTr = 935, + ETM_CGAVD_TMMU_CGAVD_DMA_FIFO_CNT_MAXr = 936, + ETM_CGAVD_IMEM_TOTAL_CNTr = 937, + ETM_CGAVD_IMEM_TOTAL_CNT_MAXr = 938, + ETM_CGAVD_FLOW0_OMEM_CNTr = 939, + ETM_CGAVD_FLOW1_OMEM_CNTr = 940, + ETM_CGAVD_FLOW2_OMEM_CNTr = 941, + ETM_CGAVD_FLOW3_OMEM_CNTr = 942, + ETM_CGAVD_FLOW4_OMEM_CNTr = 943, + ETM_CGAVD_APPOINT_FLOW_NUM_MESSAGE_1r = 944, + ETM_CGAVD_APPOINT_FLOW_NUM_MESSAGE_2r = 945, + ETM_CGAVD_ODMA_CGAVD_PKT_NUM_1r = 946, + ETM_CGAVD_ODMA_CGAVD_BYTE_NUM_1r = 947, + ETM_CGAVD_CGAVD_ENQUEUE_PKT_NUM_1r = 948, + ETM_CGAVD_CGAVD_DEQUEUE_PKT_NUM_1r = 949, + ETM_CGAVD_CGAVD_QMU_PKT_IMEM_NUM_1r = 950, + ETM_CGAVD_CGAVD_QMU_PKT_OMEM_NUM_1r = 951, + ETM_CGAVD_CGAVD_QMU_BYTE_IMEM_NUM_1r = 952, + ETM_CGAVD_CGAVD_QMU_BYTE_OMEM_NUM_1r = 953, + ETM_CGAVD_CGAVD_QMU_PKT_DROP_NUM_1r = 954, + ETM_CGAVD_CGAVD_QMU_BYTE_DROP_NUM_1r = 955, + ETM_CGAVD_CGAVD_QMU_FORBID_DROP_NUM_1r = 956, + ETM_CGAVD_CGAVD_QMU_FLOW_TD_DROP_NUM_1r = 957, + ETM_CGAVD_CGAVD_QMU_FLOW_WRED_DROP_NUM_1r = 958, + ETM_CGAVD_CGAVD_QMU_FLOW_WRED_DP_DROP_NUM_1r = 959, + ETM_CGAVD_CGAVD_QMU_PP_TD_NUM_1r = 960, + ETM_CGAVD_CGAVD_QMU_PP_WRED_DROP_NUM_1r = 961, + ETM_CGAVD_CGAVD_QMU_PP_WRED_DP_DROP_NUM_1r = 962, + ETM_CGAVD_CGAVD_QMU_SYS_TD_DROP_NUM_1r = 963, + ETM_CGAVD_CGAVD_QMU_SYS_GRED_DROP_NUM_1r = 964, + ETM_CGAVD_CGAVD_QMU_SYS_GRED_DP_DROP_NUM1r = 965, + ETM_CGAVD_CGAVD_QMU_SA_DROP_NUM_1r = 966, + ETM_CGAVD_CGAVD_QMU_MOVE_DROP_NUM_1r = 967, + ETM_CGAVD_CGAVD_QMU_TM_MULT_DROP_NUM_1r = 968, + ETM_CGAVD_CGAVD_QMU_TM_ERROR_DROP_NUM_1r = 969, + ETM_CGAVD_ODMA_CGAVD_PKT_NUM_2r = 970, + ETM_CGAVD_ODMA_CGAVD_BYTE_NUM_2r = 971, + ETM_CGAVD_CGAVD_ENQUEUE_PKT_NUM_2r = 972, + ETM_CGAVD_CGAVD_DEQUEUE_PKT_NUM_2r = 973, + ETM_CGAVD_CGAVD_QMU_PKT_IMEM_NUM_2r = 974, + ETM_CGAVD_CGAVD_QMU_PKT_OMEM_NUM_2r = 975, + ETM_CGAVD_CGAVD_QMU_BYTE_IMEM_NUM_2r = 976, + ETM_CGAVD_CGAVD_QMU_BYTE_OMEM_NUM_2r = 977, + ETM_CGAVD_CGAVD_QMU_PKT_DROP_NUM_2r = 978, + ETM_CGAVD_CGAVD_QMU_BYTE_DROP_NUM_2r = 979, + ETM_CGAVD_CGAVD_QMU_FORBID_DROP_NUM_2r = 980, + ETM_CGAVD_CGAVD_QMU_FLOW_TD_DROP_NUM_2r = 981, + ETM_CGAVD_CGAVD_QMU_FLOW_WRED_DROP_NUM_2r = 982, + ETM_CGAVD_CGAVD_QMU_FLOW_WRED_DP_DROP_NUM_2r = 983, + ETM_CGAVD_CGAVD_QMU_PP_TD_NUM_2r = 984, + ETM_CGAVD_CGAVD_QMU_PP_WRED_DROP_NUM_2r = 985, + ETM_CGAVD_CGAVD_QMU_PP_WRED_DP_DROP_NUM_2r = 986, + ETM_CGAVD_CGAVD_QMU_SYS_TD_DROP_NUM_2r = 987, + ETM_CGAVD_CGAVD_QMU_SYS_GRED_DROP_NUM_2r = 988, + ETM_CGAVD_CGAVD_QMU_SYS_GRED_DP_DROP_NUM_2r = 989, + ETM_CGAVD_CGAVD_QMU_SA_DROP_NUM_2r = 990, + ETM_CGAVD_CGAVD_QMU_MOVE_DROP_NUM_2r = 991, + ETM_CGAVD_CGAVD_QMU_TM_MULT_DROP_NUM_2r = 992, + ETM_CGAVD_CGAVD_QMU_TM_ERROR_DROP_NUM_2r = 993, + ETM_CGAVD_MOVE_FLOW_TH_PROFILEr = 994, + ETM_CGAVD_MOVE_FLOW_THr = 995, + ETM_TMMU_EMEM_PD_FIFO_AFUL_THr = 996, + ETM_TMMU_DMA_DATA_FIFO_AFUL_THr = 997, + ETM_TMMU_TMMU_STATES_0r = 998, + ETM_TMMU_QMU_TMMU_WR_SOP_CNTr = 999, + ETM_TMMU_QMU_TMMU_WR_EOP_CNTr = 1000, + ETM_TMMU_QMU_TMMU_WR_DROP_CNTr = 1001, + ETM_TMMU_QMU_TMMU_WR_EMEM_CNTr = 1002, + ETM_TMMU_QMU_TMMU_WR_IMEM_CNTr = 1003, + ETM_TMMU_TMMU_MMU_WR_SOP_CNTr = 1004, + ETM_TMMU_TMMU_MMU_WR_EOP_CNTr = 1005, + ETM_TMMU_QMU_TMMU_RD_SOP_CNTr = 1006, + ETM_TMMU_QMU_TMMU_RD_EOP_CNTr = 1007, + ETM_TMMU_QMU_TMMU_RD_DROP_CNTr = 1008, + ETM_TMMU_QMU_TMMU_RD_EMEM_CNTr = 1009, + ETM_TMMU_QMU_TMMU_RD_IMEM_CNTr = 1010, + ETM_TMMU_TMMU_MMU_RD_SOP_CNTr = 1011, + ETM_TMMU_TMMU_MMU_RD_EOP_CNTr = 1012, + ETM_TMMU_TMMU_ODMA_IN_SOP_CNTr = 1013, + ETM_TMMU_TMMU_ODMA_IN_EOP_CNTr = 1014, + ETM_TMMU_TMMU_ODMA_VLD_CNTr = 1015, + ETM_TMMU_QMU_PD_IN_CNTr = 1016, + ETM_TMMU_TMMU_PD_HIT_CNTr = 1017, + ETM_TMMU_TMMU_PD_OUT_CNTr = 1018, + ETM_TMMU_TMMU_WR_CMD_FIFO_WR_CNTr = 1019, + ETM_TMMU_TMMU_IMEM_AGE_CNTr = 1020, + ETM_TMMU_TMMU_CMDSCH_RD_CNTr = 1021, + ETM_TMMU_TMMU_CMDSCH_DROP_CNTr = 1022, + ETM_TMMU_TMMU_CMDSW_DROP_CNTr = 1023, + ETM_TMMU_TMMU_ODMA_ENQ_RD_CNTr = 1024, + ETM_TMMU_TMMU_ODMA_ENQ_DROP_CNTr = 1025, + ETM_TMMU_TMMU_ODMA_IMEM_AGE_CNTr = 1026, + ETM_TMMU_TMMU_ODMA_DEQ_RD_CNTr = 1027, + ETM_TMMU_TMMU_ODMA_DEQ_DROP_CNTr = 1028, + ETM_TMMU_OLIF_TMMU_XOFF_CNTr = 1029, + ETM_TMMU_ODMA_TM_DATA_XOFF_CNTr = 1030, + ETM_TMMU_TM_ODMA_PKT_XOFF_CNTr = 1031, + ETM_TMMU_TM_STATE_3r = 1032, + ETM_TMMU_CFGMT_PD_CACHE_CMDr = 1033, + ETM_TMMU_CFGMT_PD_CACHE_RD_DONEr = 1034, + ETM_TMMU_CFGMT_PD_CACHE_RD_DATA_0r = 1035, + ETM_TMMU_CFGMT_PD_CACHE_RD_DATA_1r = 1036, + ETM_TMMU_CFGMT_PD_CACHE_RD_DATA_2r = 1037, + ETM_TMMU_CFGMT_PD_CACHE_RD_DATA_3r = 1038, + ETM_TMMU_CFGMT_TMMU_TO_ODMA_PARAr = 1039, + ETM_TMMU_CFGMT_DMA_DATA_FIFO_CNTr = 1040, + ETM_TMMU_CFGMT_CACHE_TAG_BIT0_OFFSETr = 1041, + ETM_TMMU_CFGMT_CACHE_TAG_BIT1_OFFSETr = 1042, + ETM_TMMU_CFGMT_CACHE_TAG_BIT2_OFFSETr = 1043, + ETM_TMMU_CFGMT_CACHE_TAG_BIT3_OFFSETr = 1044, + ETM_TMMU_CFGMT_CACHE_TAG_BIT4_OFFSETr = 1045, + ETM_TMMU_CFGMT_CACHE_TAG_BIT5_OFFSETr = 1046, + ETM_TMMU_CFGMT_CACHE_INDEX_BIT0_OFFSETr = 1047, + ETM_TMMU_CFGMT_CACHE_INDEX_BIT1_OFFSETr = 1048, + ETM_TMMU_CFGMT_CACHE_INDEX_BIT2_OFFSETr = 1049, + ETM_TMMU_CFGMT_CACHE_INDEX_BIT3_OFFSETr = 1050, + ETM_TMMU_CFGMT_CACHE_INDEX_BIT4_OFFSETr = 1051, + ETM_TMMU_CFGMT_CACHE_INDEX_BIT5_OFFSETr = 1052, + ETM_TMMU_CFGMT_CACHE_INDEX_BIT6_OFFSETr = 1053, + ETM_TMMU_CFGMT_CACHE_INDEX_BIT7_OFFSETr = 1054, + ETM_TMMU_CFGMT_CACHE_INDEX_BIT8_OFFSETr = 1055, + ETM_TMMU_CFGMT_CACHE_INDEX_BIT9_OFFSETr = 1056, + ETM_TMMU_CFGMT_CACHE_INDEX_BIT10_OFFSETr = 1057, + ETM_TMMU_CFGMT_CACHE_INDEX_BIT11_OFFSETr = 1058, + ETM_TMMU_CFGMT_CACHE_INDEX_BIT12_OFFSETr = 1059, + ETM_SHAP_BKTFULL_FIFO_FULL_FLAGREGISTERr = 1060, + ETM_SHAP_FIFO_FULL_REGREGISTERr = 1061, + ETM_SHAP_FIFO_EMPTY_REGREGISTERr = 1062, + ETM_SHAP_FIFO_ALMOST_FULL_REGREGISTERr = 1063, + ETM_SHAP_FIFO_ALMOST_EMPTY_REGREGISTERr = 1064, + ETM_CRDT_CREDIT_SPACE_SELECTr = 1065, + ETM_CRDT_STAT_SPACE_MAXr = 1066, + ETM_CRDT_STAT_SPACE_MINr = 1067, + ETM_CRDT_STAT_SPACE_CREDITr = 1068, + ETM_CRDT_STAT_QUE_STEP8_CREDITr = 1069, + ETM_CRDT_SPECIAL_QUEr = 1070, + ETM_CRDT_SPECIAL_QUE_CREDITr = 1071, + ETM_CRDT_LIF_CONGEST_CREDIT_CNTr = 1072, + ETM_CRDT_LIF_PORT_CONGEST_CREDIT_CNTr = 1073, + ETM_CRDT_CRDT_CONGEST_CREDIT_CNTr = 1074, + ETM_CRDT_CRDT_PORT_CONGEST_CREDIT_CNTr = 1075, + ETM_CRDT_CONGEST_PORT_IDr = 1076, + ETM_CRDT_DEV_LINK_CONTROLr = 1077, + ETM_CRDT_CRDT_SA_PORT_RDYr = 1078, + ETM_CRDT_CRDT_CONGEST_MODE_SELECTr = 1079, + ETM_CRDT_FIFO_OUT_ALL_CRS_NORMAL_CNTr = 1080, + ETM_CRDT_FIFO_OUT_ALL_CRS_OFF_CNTr = 1081, + ETM_CRDT_FIFO_OUT_QUE_CRS_NORMAL_CNTr = 1082, + ETM_CRDT_FIFO_OUT_QUE_CRS_OFF_CNTr = 1083, + ETM_CRDT_MODE_ADD_60Gr = 1084, + ETM_CRDT_PP_TOKEN_ADDr = 1085, + ETM_CRDT_PP_CIR_TOKEN_TOTAL_DIST_CNTr = 1086, + ETM_CRDT_PP_CIR_TOKEN_TOTAL_DEC_CNTr = 1087, + ETM_CRDT_DEV_CREDIT_CNTr = 1088, + ETM_CRDT_NO_CREDIT_CNT1r = 1089, + ETM_CRDT_NO_CREDIT_CNT2r = 1090, + ETM_CRDT_ASM_INTERVAL_0_CFGr = 1091, + ETM_CRDT_ASM_INTERVAL_1_CFGr = 1092, + ETM_CRDT_ASM_INTERVAL_2_CFGr = 1093, + ETM_CRDT_ASM_INTERVAL_3_CFGr = 1094, + ETM_CRDT_ASM_INTERVAL_4_CFGr = 1095, + ETM_CRDT_ASM_INTERVAL_5CFGr = 1096, + ETM_CRDT_ASM_INTERVAL_6_CFGr = 1097, + ETM_CRDT_ASM_INTERVAL_7_CFGr = 1098, + ETM_CRDT_CRDT_TOTAL_CONGEST_MODE_CFGr = 1099, + ETM_CRDT_RCI_FIFO_INI_DEEP_CFGr = 1100, + ETM_CRDT_CRDT_ECCr = 1101, + ETM_CRDT_UCN_ASM_RDY_SHIELD_ENr = 1102, + ETM_CRDT_UCN_ASM_RDYr = 1103, + ETM_CRDT_RCI_GRADEr = 1104, + ETM_CRDT_CRDT_RCI_VALUE_Rr = 1105, + ETM_CRDT_CRDT_INTERVAL_NOWr = 1106, + ETM_CRDT_CRS_SHEILD_FLOW_ID_CFGr = 1107, + ETM_CRDT_CRS_SHEILD_EN_CFGr = 1108, + ETM_CRDT_CRS_SHEILD_VALUE_CFGr = 1109, + ETM_CRDT_TEST_TOKEN_CALC_CTRLr = 1110, + ETM_CRDT_TEST_TOKEN_SAMPLE_CYCLE_NUMr = 1111, + ETM_CRDT_Q_STATE_0_7r = 1112, + ETM_CRDT_Q_STATE_8_15r = 1113, + ETM_QMU_CSW_CSCH_RD_CMD_CNTr = 1114, + ETM_QMU_CSW_CSCH_RD_SOP_CNTr = 1115, + ETM_QMU_CSW_CSCH_RD_EOP_CNTr = 1116, + ETM_QMU_CSW_CSCH_RD_DROP_CNTr = 1117, + ETM_QMU_CSCH_MMU_RD_CMD_CNTr = 1118, + ETM_QMU_CSCH_MMU_RD_SOP_CNTr = 1119, + ETM_QMU_CSCH_MMU_RD_EOP_CNTr = 1120, + ETM_QMU_CSCH_MMU_RD_DROP_CNTr = 1121, + ETM_QMU_QCFG_QSCH_CRS_FILTERr = 1122, + ETM_QMU_QCFG_QSCH_CRS_FORCE_ENr = 1123, + ETM_QMU_QCFG_QSCH_CRS_FORCE_QNUMr = 1124, + ETM_QMU_QCFG_QSCH_CRS_FORCE_CRSr = 1125, + ETM_QMU_CFGMT_OSHP_SGMII_SHAP_MODEr = 1126, + ETM_QMU_CFGMT_QMU_SASHAP_ENr = 1127, + ETM_QMU_CFGMT_SASHAP_TOKEN_MAXr = 1128, + ETM_QMU_CFGMT_SASHAP_TOKEN_MINr = 1129, + ETM_QMU_CFG_QSCH_Q3LBADDRATEr = 1130, + ETM_QMU_CFG_QSCH_Q012LBADDRATEr = 1131, + ETM_QMU_CFG_QSCH_Q3CREDITLBMAXCNTr = 1132, + ETM_QMU_CFG_QSCH_Q012CREDITLBMAXCNTr = 1133, + ETM_QMU_CFG_QSCH_MUL_TOKEN_GEN_NUMr = 1134, + ETM_QMU_CFG_QSCH_Q3_CREDIT_LB_CONTROL_ENr = 1135, + ETM_QMU_CFG_QSCH_Q012_CREDIT_LB_CONTROL_ENr = 1136, + ETM_QMU_CFG_QSCH_SP_DWRR_ENr = 1137, + ETM_QMU_CFG_QSCH_Q01_ATTACH_ENr = 1138, + ETM_QMU_CFG_QSCH_W0r = 1139, + ETM_QMU_CFG_QSCH_W1r = 1140, + ETM_QMU_CFG_QSCH_W2r = 1141, + ETM_QMU_CFG_QSCH_LKYBKTMAXCNT1r = 1142, + ETM_QMU_CFG_QSCH_LKYBKTMAXCNT2r = 1143, + ETM_QMU_CFG_QSCH_LKYBKTDCRRATE1r = 1144, + ETM_QMU_CFG_QSCH_LKYBKTDCRRATE2r = 1145, + ETM_QMU_CFG_QSCH_LKYBKTDCRRATE3r = 1146, + ETM_QMU_CFG_QSCH_LKYBKTMAXCNT3r = 1147, + ETM_QMU_CFG_QSCH_QMU_MUL_AUTO_SA_VERSIONr = 1148, + ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_0r = 1149, + ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_1r = 1150, + ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_2r = 1151, + ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_3r = 1152, + ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_4r = 1153, + ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_5r = 1154, + ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_6r = 1155, + ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_7r = 1156, + ETM_QMU_CFG_QSCH_REMOTE_CREDIT_FIFO_ALMOST_FULL_THr = 1157, + ETM_QMU_CFG_QSCH_AUTO_CREDIT_FIFO_ALMOST_FULL_THr = 1158, + ETM_QMU_CFG_QSCH_Q3_CREDIT_FIFO_ALMOST_FULL_THr = 1159, + ETM_QMU_CFG_QSCH_Q012_CREDIT_FIFO_ALMOST_FULL_THr = 1160, + ETM_QMU_CFG_QSCH_MUL_FC_RES_ENr = 1161, + ETM_QMU_CFGMT_MUL_OVF_UDF_FLG_QUERYr = 1162, + ETM_QMU_CFGMT_MUL_CNG_FLG_QUERYr = 1163, + ETM_QMU_QSCH_CFG_LKYBKTVAL1r = 1164, + ETM_QMU_QSCH_CFG_LKYBKTVAL2r = 1165, + ETM_QMU_QSCH_CFG_LKYBKTVAL3r = 1166, + ETM_QMU_QSCH_CFG_Q3LBVALr = 1167, + ETM_QMU_QSCH_CFG_Q012LBVALr = 1168, + ETM_QMU_QLIST_CFGMT_RAM_ECC_ERR2r = 1169, + ETM_QMU_CSCH_AGED_CMD_CNTr = 1170, + ETM_QMU_CSCH_QCFG_CSCH_CONGEST_CNTr = 1171, + ETM_QMU_CSCH_QCFG_QLIST_CSCH_SOP_CNTr = 1172, + ETM_QMU_CSCH_QCFG_QLIST_CSCH_EOP_CNTr = 1173, + ETM_QMU_CSCH_QCFG_CSCH_CSW_SOP_CNTr = 1174, + ETM_QMU_CSCH_QCFG_CSCH_CSW_EOP_CNTr = 1175, + ETM_QMU_CSCH_QCFG_QLIST_CSCH_DROP_CNTr = 1176, + ETM_QMU_CSCH_QCFG_CSCH_CSW_DROP_CNTr = 1177, + ETM_QMU_CSW_MMU_SOP_CMD_CNTr = 1178, + ETM_QMU_MMU_CSW_SOP_DATA_CNTr = 1179, + ETM_QMU_CSW_QSCH_FEEDB_CNTr = 1180, + ETM_QMU_QMU_CRDT_PORT_FC_CNTr = 1181, + ETM_QMU_CSCH_R_BLOCK_CNTr = 1182, + ETM_QMU_QCFG_QLIST_QDS_HEAD_RDr = 1183, + ETM_QMU_QCFG_QLIST_QDS_TAIL_RDr = 1184, + ETM_QMU_QCFG_QLIST_EPT_RDr = 1185, + ETM_QMU_QCFG_QLIST_AGE_FLAG_RDr = 1186, + ETM_QMU_QCFG_QLIST_CTI_RDr = 1187, + ETM_QMU_QCFG_QLIST_CTO_RDr = 1188, + ETM_QMU_QCFG_QLIST_CHK_RDr = 1189, + ETM_QMU_QCFG_QLIST_NOD_RDr = 1190, + ETM_QMU_QCFG_QLIST_BIU_RDr = 1191, + ETM_QMU_QSCH_R_WLIST_FLAGr = 1192, + ETM_QMU_QCFG_CRS_FLG_RDr = 1193, + ETM_QMU_CFGMT_QMU_IMEM_AGE_QDSr = 1194, + ETM_QMU_CFGMT_QMU_IMEM_AGE_QLENr = 1195, + ETM_QMU_CFGMT_QMU_IMEM_PD_RAM_LOWr = 1196, + ETM_QMU_CFGMT_QMU_IMEM_PD_RAM_HIGHr = 1197, + ETM_QMU_CFGMT_QMU_IMEM_UP_PTRr = 1198, + ETM_QMU_CFGMT_QMU_IMEM_DOWN_PTRr = 1199, + ETM_QMU_CFGMT_QMU_IMEM_AGE_FLAGr = 1200, + ETM_QMU_CFG_QSCH_LKYBKT2CNGTHr = 1201, + ETM_QMU_CFG_QSCH_LKYBKT1CNGTHr = 1202, + ETM_QMU_CFG_QSCH_LKYBKT3CNGTHr = 1203, + ETM_QMU_CFG_QSCH_RM_MUL_MCN1_CREDIT_VALUEr = 1204, + ETM_QMU_CFG_QSCH_RM_MUL_MCN2_CREDIT_VALUEr = 1205, + ETM_QMU_CFG_QSCH_RM_MUL_MCN3_CREDIT_VALUEr = 1206, + ETM_QMU_RM_MUL_MCN1_RAND_ANSR_SEEDr = 1207, + ETM_QMU_RM_MUL_MCN2_RAND_ANSR_SEEDr = 1208, + ETM_QMU_RM_MUL_MCN3_RAND_ANSR_SEEDr = 1209, + ETM_QMU_RM_MUL_MCN1_RAND_ANSR_THr = 1210, + ETM_QMU_RM_MUL_MCN2_RAND_ANSR_THr = 1211, + ETM_QMU_RM_MUL_MCN3_RAND_ANSR_THr = 1212, + ETM_QMU_RM_MUL_MCN1_RAND_HOLD_BASEr = 1213, + ETM_QMU_RM_MUL_MCN2_RAND_HOLD_BASEr = 1214, + ETM_QMU_RM_MUL_MCN3_RAND_HOLD_BASEr = 1215, + ETM_QMU_RM_MUL_MCN1_RAND_SEL_MASKr = 1216, + ETM_QMU_RM_MUL_MCN2_RAND_SEL_MASKr = 1217, + ETM_QMU_RM_MUL_MCN3_RAND_SEL_MASKr = 1218, + ETM_QMU_RM_MUL_MCN1_RAND_SEL_SEED_REG0r = 1219, + ETM_QMU_RM_MUL_MCN1_RAND_SEL_SEED_REG1r = 1220, + ETM_QMU_RM_MUL_MCN2_RAND_SEL_SEED_REG0r = 1221, + ETM_QMU_RM_MUL_MCN2_RAND_SEL_SEED_REG1r = 1222, + ETM_QMU_RM_MUL_MCN3_RAND_SEL_SEED_REG0r = 1223, + ETM_QMU_RM_MUL_MCN3_RAND_SEL_SEED_REG1r = 1224, + ETM_QMU_RM_MUL_MCN1_STEP_WAIT_TH1r = 1225, + ETM_QMU_RM_MUL_MCN1_STEP_WAIT_TH2r = 1226, + ETM_QMU_RM_MUL_MCN1_STEP_WAIT_TH3r = 1227, + ETM_QMU_RM_MUL_MCN1_STEP_WAIT_TH4r = 1228, + ETM_QMU_RM_MUL_MCN1_STEP_WAIT_TH5r = 1229, + ETM_QMU_RM_MUL_MCN1_STEP_WAIT_TH6r = 1230, + ETM_QMU_RM_MUL_MCN1_STEP_WAIT_TH7r = 1231, + ETM_QMU_RM_MUL_MCN2_STEP_WAIT_TH1r = 1232, + ETM_QMU_RM_MUL_MCN2_STEP_WAIT_TH2r = 1233, + ETM_QMU_RM_MUL_MCN2_STEP_WAIT_TH3r = 1234, + ETM_QMU_RM_MUL_MCN2_STEP_WAIT_TH4r = 1235, + ETM_QMU_RM_MUL_MCN2_STEP_WAIT_TH5r = 1236, + ETM_QMU_RM_MUL_MCN2_STEP_WAIT_TH6r = 1237, + ETM_QMU_RM_MUL_MCN2_STEP_WAIT_TH7r = 1238, + ETM_QMU_RM_MUL_MCN3_STEP_WAIT_TH1r = 1239, + ETM_QMU_RM_MUL_MCN3_STEP_WAIT_TH2r = 1240, + ETM_QMU_RM_MUL_MCN3_STEP_WAIT_TH3r = 1241, + ETM_QMU_RM_MUL_MCN3_STEP_WAIT_TH4r = 1242, + ETM_QMU_RM_MUL_MCN3_STEP_WAIT_TH5r = 1243, + ETM_QMU_RM_MUL_MCN3_STEP_WAIT_TH6r = 1244, + ETM_QMU_RM_MUL_MCN3STEP_WAIT_TH7r = 1245, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE0r = 1246, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE1r = 1247, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE2r = 1248, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE3r = 1249, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE4r = 1250, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE5r = 1251, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE6r = 1252, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE7r = 1253, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE8r = 1254, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE9r = 1255, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE10r = 1256, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE11r = 1257, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE12r = 1258, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE13r = 1259, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE14r = 1260, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE15r = 1261, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE16r = 1262, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE17r = 1263, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE18r = 1264, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE19r = 1265, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE20r = 1266, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE21r = 1267, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE22r = 1268, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE23r = 1269, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE24r = 1270, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE25r = 1271, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE26r = 1272, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE27r = 1273, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE28r = 1274, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE29r = 1275, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE30r = 1276, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE31r = 1277, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE32r = 1278, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE33r = 1279, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE34r = 1280, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE35r = 1281, + ETM_QMU_CFG_QSCH_MULCRDCNTRATE36r = 1282, + ETM_QMU_CFG_QSCH_RM_MUL_MCN1_RAND_HOLD_SHIFTr = 1283, + ETM_QMU_CFG_QSCH_RM_MUL_MCN2_RAND_HOLD_SHIFTr = 1284, + ETM_QMU_CFG_QSCH_RM_MUL_MCN3_RAND_HOLD_SHIFTr = 1285, + ETM_QMU_LAST_DROP_QNUM_GETr = 1286, + ETM_QMU_CRDT_QMU_CREDIT_CNTr = 1287, + ETM_QMU_QMU_TO_QSCH_REPORT_CNTr = 1288, + ETM_QMU_QMU_TO_CGAVD_REPORT_CNTr = 1289, + ETM_QMU_QMU_CRDT_CRS_NORMAL_CNTr = 1290, + ETM_QMU_QMU_CRDT_CRS_OFF_CNTr = 1291, + ETM_QMU_QSCH_QLIST_SHEDULE_CNTr = 1292, + ETM_QMU_QSCH_QLIST_SCH_EPT_CNTr = 1293, + ETM_QMU_QMU_TO_MMU_BLK_WR_CNTr = 1294, + ETM_QMU_QMU_TO_CSW_BLK_RD_CNTr = 1295, + ETM_QMU_QMU_TO_MMU_SOP_WR_CNTr = 1296, + ETM_QMU_QMU_TO_MMU_EOP_WR_CNTr = 1297, + ETM_QMU_QMU_TO_MMU_DROP_WR_CNTr = 1298, + ETM_QMU_QMU_TO_CSW_SOP_RD_CNTr = 1299, + ETM_QMU_QMU_TO_CSW_EOP_RD_CNTr = 1300, + ETM_QMU_QMU_TO_CSW_DROP_RD_CNTr = 1301, + ETM_QMU_MMU_TO_QMU_WR_RELEASE_CNTr = 1302, + ETM_QMU_MMU_TO_QMU_RD_RELEASE_CNTr = 1303, + ETM_QMU_OBSERVE_QNUM_SETr = 1304, + ETM_QMU_SPEC_Q_PKT_RECEIVEDr = 1305, + ETM_QMU_SPEC_Q_PKT_DROPPEDr = 1306, + ETM_QMU_SPEC_Q_PKT_SCHEDULEDr = 1307, + ETM_QMU_SPEC_Q_WR_CMD_SENTr = 1308, + ETM_QMU_SPEC_Q_RD_CMD_SENTr = 1309, + ETM_QMU_SPEC_Q_PKT_ENQr = 1310, + ETM_QMU_SPEC_Q_PKT_DEQr = 1311, + ETM_QMU_SPEC_Q_CRDT_UNCON_RECEIVEDr = 1312, + ETM_QMU_SPEC_Q_CRDT_CONG_RECEIVEDr = 1313, + ETM_QMU_SPEC_Q_CRS_NORMAL_CNTr = 1314, + ETM_QMU_SPEC_Q_CRS_OFF_CNTr = 1315, + ETM_QMU_OBSERVE_BATCH_SETr = 1316, + ETM_QMU_SPEC_BAT_PKT_RECEIVEDr = 1317, + ETM_QMU_SPEC_BAT_PKT_DROPPEDr = 1318, + ETM_QMU_SPEC_BAT_BLK_SCHEDULEDr = 1319, + ETM_QMU_SPEC_BAT_WR_CMD_SENTr = 1320, + ETM_QMU_SPEC_BAT_RD_CMD_SENTr = 1321, + ETM_QMU_SPEC_BAT_PKT_ENQr = 1322, + ETM_QMU_SPEC_BAT_PKT_DEQr = 1323, + ETM_QMU_SPEC_BAT_CRDT_UNCON_RECEIVEDr = 1324, + ETM_QMU_SPEC_BAT_CRDT_CONG_RECEIVEDr = 1325, + ETM_QMU_SPEC_BAT_CRS_NORMAL_CNTr = 1326, + ETM_QMU_SPEC_BAT_CRS_OFF_CNTr = 1327, + ETM_QMU_BCNTM_OVFL_QNUM_GETr = 1328, + ETM_QMU_CRBAL_A_OVF_QNUM_GETr = 1329, + ETM_QMU_CRBAL_B_OVF_QNUM_GETr = 1330, + ETM_QMU_CRBAL_DROP_QNUM_GETr = 1331, + ETM_QMU_DEQ_FLG_REPORT_CNTr = 1332, + ETM_QMU_SPEC_Q_CRS_GETr = 1333, + ETM_QMU_SPEC_Q_CRS_IN_GETr = 1334, + ETM_QMU_SPEC_Q_CRS_FLG_CSOL_GETr = 1335, + ETM_QMU_EPT_SCH_QNUM_GETr = 1336, + CFG_PCIE_PCIE_DDR_SWITCHr = 1337, + CFG_PCIE_USER0_INT_ENr = 1338, + CFG_PCIE_USER0_INT_MASKr = 1339, + CFG_PCIE_USER0_INT_STATUSr = 1340, + CFG_PCIE_USER1_INT_ENr = 1341, + CFG_PCIE_USER1_INT_MASKr = 1342, + CFG_PCIE_USER1_INT_STATUSr = 1343, + CFG_PCIE_USER2_INT_ENr = 1344, + CFG_PCIE_USER2_INT_MASKr = 1345, + CFG_PCIE_USER2_INT_STATUSr = 1346, + CFG_PCIE_ECC_1B_INT_ENr = 1347, + CFG_PCIE_ECC_1B_INT_MASKr = 1348, + CFG_PCIE_ECC_1B_INT_STATUSr = 1349, + CFG_PCIE_ECC_2B_INT_ENr = 1350, + CFG_PCIE_ECC_2B_INT_MASKr = 1351, + CFG_PCIE_ECC_2B_INT_STATUSr = 1352, + CFG_PCIE_CFG_INT_STATUSr = 1353, + CFG_PCIE_I_CORE_TO_CNTLr = 1354, + CFG_PCIE_TEST_IN_LOWr = 1355, + CFG_PCIE_TEST_IN_HIGHr = 1356, + CFG_PCIE_LOCAL_INTERRUPT_OUTr = 1357, + CFG_PCIE_PL_LTSSMr = 1358, + CFG_PCIE_TEST_OUT0r = 1359, + CFG_PCIE_TEST_OUT1r = 1360, + CFG_PCIE_TEST_OUT2r = 1361, + CFG_PCIE_TEST_OUT3r = 1362, + CFG_PCIE_TEST_OUT4r = 1363, + CFG_PCIE_TEST_OUT5r = 1364, + CFG_PCIE_TEST_OUT6r = 1365, + CFG_PCIE_TEST_OUT7r = 1366, + CFG_PCIE_SYNC_O_CORE_STATUSr = 1367, + CFG_PCIE_SYNC_O_ALERT_DBEr = 1368, + CFG_PCIE_SYNC_O_ALERT_SBEr = 1369, + CFG_PCIE_SYNC_O_LINK_LOOPBACK_ENr = 1370, + CFG_PCIE_SYNC_O_LOCAL_FS_LF_VALIDr = 1371, + CFG_PCIE_SYNC_O_RX_IDLE_DETECTr = 1372, + CFG_PCIE_SYNC_O_RX_RDYr = 1373, + CFG_PCIE_SYNC_O_TX_RDYr = 1374, + CFG_PCIE_PCIE_LINK_UP_CNTr = 1375, + CFG_PCIE_TEST_OUT_PCIE0r = 1376, + CFG_PCIE_TEST_OUT_PCIE1r = 1377, + CFG_PCIE_TEST_OUT_PCIE2r = 1378, + CFG_PCIE_TEST_OUT_PCIE3r = 1379, + CFG_PCIE_TEST_OUT_PCIE4r = 1380, + CFG_PCIE_TEST_OUT_PCIE5r = 1381, + CFG_PCIE_TEST_OUT_PCIE6r = 1382, + CFG_PCIE_TEST_OUT_PCIE7r = 1383, + CFG_PCIE_TEST_OUT_PCIE8r = 1384, + CFG_PCIE_TEST_OUT_PCIE9r = 1385, + CFG_PCIE_TEST_OUT_PCIE10r = 1386, + CFG_PCIE_TEST_OUT_PCIE11r = 1387, + CFG_PCIE_TEST_OUT_PCIE12r = 1388, + CFG_PCIE_TEST_OUT_PCIE13r = 1389, + CFG_PCIE_TEST_OUT_PCIE14r = 1390, + CFG_PCIE_TEST_OUT_PCIE15r = 1391, + CFG_PCIE_INT_REPEAT_ENr = 1392, + CFG_PCIE_DBG_AWID_AXI_MSTr = 1393, + CFG_PCIE_DBG_AWADDR_AXI_MST0r = 1394, + CFG_PCIE_DBG_AWADDR_AXI_MST1r = 1395, + CFG_PCIE_DBG_AWLEN_AXI_MSTr = 1396, + CFG_PCIE_DBG_AWSIZE_AXI_MSTr = 1397, + CFG_PCIE_DBG_AWBURST_AXI_MSTr = 1398, + CFG_PCIE_DBG_AWLOCK_AXI_MSTr = 1399, + CFG_PCIE_DBG_AWCACHE_AXI_MSTr = 1400, + CFG_PCIE_DBG_AWPROT_AXI_MSTr = 1401, + CFG_PCIE_DBG_WID_AXI_MSTr = 1402, + CFG_PCIE_DBG_WDATA_AXI_MST0r = 1403, + CFG_PCIE_DBG_WDATA_AXI_MST1r = 1404, + CFG_PCIE_DBG_WDATA_AXI_MST2r = 1405, + CFG_PCIE_DBG_WDATA_AXI_MST3r = 1406, + CFG_PCIE_DBG_WSTRB_AXI_MSTr = 1407, + CFG_PCIE_DBG_WLAST_AXI_MSTr = 1408, + CFG_PCIE_DBG_ARID_AXI_MSTr = 1409, + CFG_PCIE_DBG_ARADDR_AXI_MST0r = 1410, + CFG_PCIE_DBG_ARADDR_AXI_MST1r = 1411, + CFG_PCIE_DBG_ARLEN_AXI_MSTr = 1412, + CFG_PCIE_DBG_ARSIZE_AXI_MSTr = 1413, + CFG_PCIE_DBG_ARBURST_AXI_MSTr = 1414, + CFG_PCIE_DBG_ARLOCK_AXI_MSTr = 1415, + CFG_PCIE_DBG_ARCACHE_AXI_MSTr = 1416, + CFG_PCIE_DBG_ARPROT_AXI_MSTr = 1417, + CFG_PCIE_DBG_RDATA_AXI_MST0r = 1418, + CFG_PCIE_DBG_RDATA_AXI_MST1r = 1419, + CFG_PCIE_DBG_RDATA_AXI_MST2r = 1420, + CFG_PCIE_DBG_RDATA_AXI_MST3r = 1421, + CFG_PCIE_AXI_MST_STATEr = 1422, + CFG_PCIE_AXI_CFG_STATEr = 1423, + CFG_PCIE_AXI_SLV_RD_STATEr = 1424, + CFG_PCIE_AXI_SLV_WR_STATEr = 1425, + CFG_PCIE_AXIM_DELAY_ENr = 1426, + CFG_PCIE_AXIM_DELAYr = 1427, + CFG_PCIE_AXIM_SPEED_WRr = 1428, + CFG_PCIE_AXIM_SPEED_RDr = 1429, + CFG_PCIE_DBG_AWADDR_AXI_SLV0r = 1430, + CFG_PCIE_DBG_AWADDR_AXI_SLV1r = 1431, + CFG_PCIE_DBG0_WDATA_AXI_SLV0r = 1432, + CFG_PCIE_DBG0_WDATA_AXI_SLV1r = 1433, + CFG_PCIE_DBG0_WDATA_AXI_SLV2r = 1434, + CFG_PCIE_DBG0_WDATA_AXI_SLV3r = 1435, + CFG_PCIE_DBG1_WDATA_AXI_SLV0r = 1436, + CFG_PCIE_DBG1_WDATA_AXI_SLV1r = 1437, + CFG_PCIE_DBG1_WDATA_AXI_SLV2r = 1438, + CFG_PCIE_DBG1_WDATA_AXI_SLV3r = 1439, + CFG_PCIE_DBG2_WDATA_AXI_SLV0r = 1440, + CFG_PCIE_DBG2_WDATA_AXI_SLV1r = 1441, + CFG_PCIE_DBG2_WDATA_AXI_SLV2r = 1442, + CFG_PCIE_DBG2_WDATA_AXI_SLV3r = 1443, + CFG_PCIE_DBG3_WDATA_AXI_SLV0r = 1444, + CFG_PCIE_DBG3_WDATA_AXI_SLV1r = 1445, + CFG_PCIE_DBG3_WDATA_AXI_SLV2r = 1446, + CFG_PCIE_DBG3_WDATA_AXI_SLV3r = 1447, + CFG_PCIE_DBG4_WDATA_AXI_SLV0r = 1448, + CFG_PCIE_DBG4_WDATA_AXI_SLV1r = 1449, + CFG_PCIE_DBG4_WDATA_AXI_SLV2r = 1450, + CFG_PCIE_DBG4_WDATA_AXI_SLV3r = 1451, + CFG_PCIE_DBG5_WDATA_AXI_SLV0r = 1452, + CFG_PCIE_DBG5_WDATA_AXI_SLV1r = 1453, + CFG_PCIE_DBG5_WDATA_AXI_SLV2r = 1454, + CFG_PCIE_DBG5_WDATA_AXI_SLV3r = 1455, + CFG_PCIE_DBG6_WDATA_AXI_SLV0r = 1456, + CFG_PCIE_DBG6_WDATA_AXI_SLV1r = 1457, + CFG_PCIE_DBG6_WDATA_AXI_SLV2r = 1458, + CFG_PCIE_DBG6_WDATA_AXI_SLV3r = 1459, + CFG_PCIE_DBG7_WDATA_AXI_SLV0r = 1460, + CFG_PCIE_DBG7_WDATA_AXI_SLV1r = 1461, + CFG_PCIE_DBG7_WDATA_AXI_SLV2r = 1462, + CFG_PCIE_DBG7_WDATA_AXI_SLV3r = 1463, + CFG_PCIE_DBG8_WDATA_AXI_SLV0r = 1464, + CFG_PCIE_DBG8_WDATA_AXI_SLV1r = 1465, + CFG_PCIE_DBG8_WDATA_AXI_SLV2r = 1466, + CFG_PCIE_DBG8_WDATA_AXI_SLV3r = 1467, + CFG_PCIE_DBG9_WDATA_AXI_SLV0r = 1468, + CFG_PCIE_DBG9_WDATA_AXI_SLV1r = 1469, + CFG_PCIE_DBG9_WDATA_AXI_SLV2r = 1470, + CFG_PCIE_DBG9_WDATA_AXI_SLV3r = 1471, + CFG_PCIE_DBG_AWLEN_AXI_SLVr = 1472, + CFG_PCIE_DBG_WLAST_AXI_SLVr = 1473, + CFG_PCIE_DBG_ARADDR_AXI_SLV0r = 1474, + CFG_PCIE_DBG_ARADDR_AXI_SLV1r = 1475, + CFG_PCIE_DBG0_RDATA_AXI_SLV0r = 1476, + CFG_PCIE_DBG0_RDATA_AXI_SLV1r = 1477, + CFG_PCIE_DBG0_RDATA_AXI_SLV2r = 1478, + CFG_PCIE_DBG0_RDATA_AXI_SLV3r = 1479, + CFG_PCIE_DBG1_RDATA_AXI_SLV0r = 1480, + CFG_PCIE_DBG1_RDATA_AXI_SLV1r = 1481, + CFG_PCIE_DBG1_RDATA_AXI_SLV2r = 1482, + CFG_PCIE_DBG1_RDATA_AXI_SLV3r = 1483, + CFG_PCIE_DBG_RLAST_AXI_SLVr = 1484, + CFG_DMA_DMA_ENABLEr = 1485, + CFG_DMA_UP_REQr = 1486, + CFG_DMA_DMA_UP_CURRENT_STATEr = 1487, + CFG_DMA_DMA_UP_REQ_ACKr = 1488, + CFG_DMA_DMA_DONE_LATCHr = 1489, + CFG_DMA_DMA_UP_CPU_ADDR_LOW32r = 1490, + CFG_DMA_DMA_UP_CPU_ADDR_HIGH32r = 1491, + CFG_DMA_DMA_UP_SE_ADDRr = 1492, + CFG_DMA_DMA_DONE_INTr = 1493, + CFG_DMA_SP_CFGr = 1494, + CFG_DMA_DMA_INGr = 1495, + CFG_DMA_RD_TIMEOUT_THRESHr = 1496, + CFG_DMA_DMA_TAB_STA_UP_FIFO_GAPr = 1497, + CFG_DMA_CFG_MAC_TIMr = 1498, + CFG_DMA_CFG_MAC_NUMr = 1499, + CFG_DMA_INIT_BD_ADDRr = 1500, + CFG_DMA_MAC_UP_BD_ADDR1_LOW32r = 1501, + CFG_DMA_MAC_UP_BD_ADDR1_HIGH32r = 1502, + CFG_DMA_MAC_UP_BD_ADDR2_LOW32r = 1503, + CFG_DMA_MAC_UP_BD_ADDR2_HIGH32r = 1504, + CFG_DMA_CFG_MAC_MAX_NUMr = 1505, + CFG_DMA_DMA_WBUF_FF_EMPTYr = 1506, + CFG_DMA_DMA_WBUF_STATEr = 1507, + CFG_DMA_DMA_MAC_BD_ADDR_LOW32r = 1508, + CFG_DMA_DMA_MAC_BD_ADDR_HIGH32r = 1509, + CFG_DMA_MAC_UP_ENABLEr = 1510, + CFG_DMA_MAC_ENDIANr = 1511, + CFG_DMA_UP_ENDIANr = 1512, + CFG_DMA_DMA_UP_RD_CNT_LATCHr = 1513, + CFG_DMA_DMA_UP_RCV_CNT_LATCHr = 1514, + CFG_DMA_DMA_UP_CNT_LATCHr = 1515, + CFG_DMA_CPU_RD_BD_PULSEr = 1516, + CFG_DMA_CPU_BD_THRESHOLDr = 1517, + CFG_DMA_CPU_BD_USED_CNTr = 1518, + CFG_DMA_DMA_UP_RCV_STATUSr = 1519, + CFG_DMA_SLV_RID_ERR_ENr = 1520, + CFG_DMA_SLV_RRESP_ERR_ENr = 1521, + CFG_DMA_SE_RDBK_FF_FULLr = 1522, + CFG_DMA_DMA_UP_DATA_COUNTr = 1523, + CFG_DMA_DMA_MWR_FIFO_AFULL_GAPr = 1524, + CFG_DMA_DMA_INFO_FIFO_AFULL_GAPr = 1525, + CFG_DMA_DMA_RD_TIMEOUT_SETr = 1526, + CFG_DMA_DMA_BD_DAT_ERR_ENr = 1527, + CFG_DMA_DMA_REPEAT_CNTr = 1528, + CFG_DMA_DMA_RD_TIMEOUT_ENr = 1529, + CFG_DMA_DMA_REPEAT_READr = 1530, + CFG_DMA_DMA_REPEAT_READ_ENr = 1531, + CFG_DMA_BD_CTL_STATEr = 1532, + CFG_DMA_DMA_DONE_INT_CNT_WRr = 1533, + CFG_DMA_DMA_DONE_INT_CNT_MACr = 1534, + CFG_DMA_CURRENT_MAC_NUMr = 1535, + CFG_DMA_CFG_MAC_AFIFO_AFULLr = 1536, + CFG_DMA_DMA_MAC_FF_FULLr = 1537, + CFG_DMA_USER_AXI_MSTr = 1538, + CFG_CSR_SBUS_STATEr = 1539, + CFG_CSR_MST_DEBUG_ENr = 1540, + CFG_CSR_SBUS_COMMAND_SELr = 1541, + CFG_CSR_SOC_RD_TIME_OUT_THRESHr = 1542, + CFG_CSR_BIG_LITTLE_BYTE_ORDERr = 1543, + CFG_CSR_ECC_BYPASS_READr = 1544, + CFG_CSR_AHB_ASYNC_WR_FIFO_AFULL_GAPr = 1545, + CFG_CSR_AHB_ASYNC_RD_FIFO_AFULL_GAPr = 1546, + CFG_CSR_AHB_ASYNC_CPL_FIFO_AFULL_GAPr = 1547, + CFG_CSR_MST_DEBUG_DATA0_HIGH26r = 1548, + CFG_CSR_MST_DEBUG_DATA0_LOW32r = 1549, + CFG_CSR_MST_DEBUG_DATA1_HIGH26r = 1550, + CFG_CSR_MST_DEBUG_DATA1_LOW32r = 1551, + CFG_CSR_MST_DEBUG_DATA2_HIGH26r = 1552, + CFG_CSR_MST_DEBUG_DATA2_LOW32r = 1553, + CFG_CSR_MST_DEBUG_DATA3_HIGH26r = 1554, + CFG_CSR_MST_DEBUG_DATA3_LOW32r = 1555, + CFG_CSR_MST_DEBUG_DATA4_HIGH26r = 1556, + CFG_CSR_MST_DEBUG_DATA4_LOW32r = 1557, + CFG_CSR_MST_DEBUG_DATA5_HIGH26r = 1558, + CFG_CSR_MST_DEBUG_DATA5_LOW32r = 1559, + CFG_CSR_MST_DEBUG_DATA6_HIGH26r = 1560, + CFG_CSR_MST_DEBUG_DATA6_LOW32r = 1561, + CFG_CSR_MST_DEBUG_DATA7_HIGH26r = 1562, + CFG_CSR_MST_DEBUG_DATA7_LOW32r = 1563, + CFG_CSR_MST_DEBUG_DATA8_HIGH26r = 1564, + CFG_CSR_MST_DEBUG_DATA8_LOW32r = 1565, + CFG_CSR_MST_DEBUG_DATA9_HIGH26r = 1566, + CFG_CSR_MST_DEBUG_DATA9_LOW32r = 1567, + CFG_CSR_MST_DEBUG_DATA10_HIGH26r = 1568, + CFG_CSR_MST_DEBUG_DATA10_LOW32r = 1569, + CFG_CSR_MST_DEBUG_DATA11_HIGH26r = 1570, + CFG_CSR_MST_DEBUG_DATA11_LOW32r = 1571, + CFG_CSR_MST_DEBUG_DATA12_HIGH26r = 1572, + CFG_CSR_MST_DEBUG_DATA12_LOW32r = 1573, + CFG_CSR_MST_DEBUG_DATA13_HIGH26r = 1574, + CFG_CSR_MST_DEBUG_DATA13_LOW32r = 1575, + CFG_CSR_MST_DEBUG_DATA14_HIGH26r = 1576, + CFG_CSR_MST_DEBUG_DATA14_LOW32r = 1577, + CFG_CSR_MST_DEBUG_DATA15_HIGH26r = 1578, + CFG_CSR_MST_DEBUG_DATA15_LOW32r = 1579, + NPPU_MR_CFG_IND_ACCESS_STATESr = 1580, + NPPU_MR_CFG_IND_ACCESS_CMD0r = 1581, + NPPU_MR_CFG_IND_ACCESS_DATA0r = 1582, + NPPU_MR_CFG_IND_ACCESS_DATA1r = 1583, + NPPU_MR_CFG_IND_ACCESS_CMD1r = 1584, + NPPU_MR_CFG_MR_INIT_DONEr = 1585, + NPPU_MR_CFG_CNT_MODE_REGr = 1586, + NPPU_MR_CFG_CFG_ECC_BYPASS_READr = 1587, + NPPU_MR_CFG_CFG_REP_MODr = 1588, + NPPU_MR_CFG_BLOCK_PTR_FIFO_AFUL_THr = 1589, + NPPU_MR_CFG_PRE_RCV_PTR_FIFO_AFUL_THr = 1590, + NPPU_MR_CFG_MGID_FIFO_AFUL_THr = 1591, + NPPU_MR_CFG_REP_CMD_FIFO_AFUL_THr = 1592, + NPPU_MR_CFG_MR_INT_MASK_1r = 1593, + NPPU_MR_CFG_MR_INT_MASK_2r = 1594, + NPPU_MR_CFG_MR_INT_MASK_3r = 1595, + NPPU_MR_CFG_MR_INT_MASK_4r = 1596, + NPPU_MR_CFG_MR_STATES_1r = 1597, + NPPU_MR_CFG_MR_STATES_2r = 1598, + NPPU_MR_CFG_MR_STATES_3r = 1599, + NPPU_MR_CFG_MR_STATES_4r = 1600, + NPPU_MR_CFG_MR_STATES_5r = 1601, + NPPU_MR_CFG_MR_STATES_6r = 1602, + NPPU_MR_CFG_MR_STATES_7r = 1603, + NPPU_MR_CFG_MR_STATES_8r = 1604, + NPPU_MR_CFG_MR_SOP_IN_CNTr = 1605, + NPPU_MR_CFG_MR_EOP_IN_CNTr = 1606, + NPPU_MR_CFG_MR_SOP_OUT_CNTr = 1607, + NPPU_MR_CFG_MR_EOP_OUT_CNTr = 1608, + NPPU_MR_CFG_MR_COS0_IN_CNTr = 1609, + NPPU_MR_CFG_MR_COS1_IN_CNTr = 1610, + NPPU_MR_CFG_MR_COS2_IN_CNTr = 1611, + NPPU_MR_CFG_MR_COS3_IN_CNTr = 1612, + NPPU_MR_CFG_MR_COS0_OUT_CNTr = 1613, + NPPU_MR_CFG_MR_COS1_OUT_CNTr = 1614, + NPPU_MR_CFG_MR_COS2_OUT_CNTr = 1615, + NPPU_MR_CFG_MR_COS3_OUT_CNTr = 1616, + NPPU_MR_CFG_MR_ERR_IN_CNTr = 1617, + NPPU_MR_CFG_MR_COS0_SOP_IN_CNTr = 1618, + NPPU_MR_CFG_MR_COS0_EOP_IN_CNTr = 1619, + NPPU_MR_CFG_MR_COS1_SOP_IN_CNTr = 1620, + NPPU_MR_CFG_MR_COS1_EOP_IN_CNTr = 1621, + NPPU_MR_CFG_MR_COS2_SOP_IN_CNTr = 1622, + NPPU_MR_CFG_MR_COS2_EOP_IN_CNTr = 1623, + NPPU_MR_CFG_MR_COS3_SOP_IN_CNTr = 1624, + NPPU_MR_CFG_MR_COS3_EOP_IN_CNTr = 1625, + NPPU_MR_CFG_MR_COS0_IN_ERR_CNTr = 1626, + NPPU_MR_CFG_MR_COS1_IN_ERR_CNTr = 1627, + NPPU_MR_CFG_MR_COS2_IN_ERR_CNTr = 1628, + NPPU_MR_CFG_MR_COS3_IN_ERR_CNTr = 1629, + NPPU_MR_CFG_MR_COS0_SOP_OUT_CNTr = 1630, + NPPU_MR_CFG_MR_COS0_EOP_OUT_CNTr = 1631, + NPPU_MR_CFG_MR_COS1_SOP_OUT_CNTr = 1632, + NPPU_MR_CFG_MR_COS1_EOP_OUT_CNTr = 1633, + NPPU_MR_CFG_MR_COS2_SOP_OUT_CNTr = 1634, + NPPU_MR_CFG_MR_COS2_EOP_OUT_CNTr = 1635, + NPPU_MR_CFG_MR_COS3_SOP_OUT_CNTr = 1636, + NPPU_MR_CFG_MR_COS3_EOP_OUT_CNTr = 1637, + NPPU_MR_CFG_MR_MLT_UNVLD_CNTr = 1638, + NPPU_MR_CFG_MR_SOP_EOP_MATCH_CFGr = 1639, + NPPU_MR_CFG_MR_MLT_UNVLD_MGIDr = 1640, + NPPU_PKTRX_CFG_ISCH_FIFO_TH_1r = 1641, + NPPU_PKTRX_CFG_ISCH_FIFO_TH_2r = 1642, + NPPU_PKTRX_CFG_ISCH_FIFO_TH_3r = 1643, + NPPU_PKTRX_CFG_ISCH_FIFO_TH_4r = 1644, + NPPU_PKTRX_CFG_ISCH_CFG_0r = 1645, + NPPU_PKTRX_CFG_HDU_EX_TPID_0r = 1646, + NPPU_PKTRX_CFG_HDU_EX_TPID_1r = 1647, + NPPU_PKTRX_CFG_HDU_INT_TPID_0r = 1648, + NPPU_PKTRX_CFG_HDU_INT_TPID_1r = 1649, + NPPU_PKTRX_CFG_HDU_HDLC_0r = 1650, + NPPU_PKTRX_CFG_HDU_HDLC_1r = 1651, + NPPU_PKTRX_CFG_HDU_UDF_L3TYPE_0r = 1652, + NPPU_PKTRX_CFG_HDU_UDF_L3TYPE_1r = 1653, + NPPU_PKTRX_CFG_HDU_UDF_L3TYPE_2r = 1654, + NPPU_PKTRX_CFG_HDU_UDF_L3TYPE_3r = 1655, + NPPU_PKTRX_CFG_HDU_UDF_L4TYPE_0r = 1656, + NPPU_PKTRX_CFG_HDU_UDF_L4TYPE_1r = 1657, + NPPU_PKTRX_CFG_HDU_UDF_L4TYPE_2r = 1658, + NPPU_PKTRX_CFG_SLOT_NO_CFGr = 1659, + NPPU_PKTRX_CFG_PKTRX_INT_EN_0r = 1660, + NPPU_PKTRX_CFG_PKTRX_INT_EN_1r = 1661, + NPPU_PKTRX_CFG_PKTRX_INT_MASK_0r = 1662, + NPPU_PKTRX_CFG_PKTRX_INT_MASK_1r = 1663, + NPPU_PKTRX_CFG_PKTRX_INT_STATUSr = 1664, + NPPU_PKTRX_CFG_PKTRX_PORT_RDY0r = 1665, + NPPU_PKTRX_CFG_PKTRX_LIF0_PFC_RDY0r = 1666, + NPPU_PKTRX_CFG_PKTRX_LIF0_PFC_RDY1r = 1667, + NPPU_PKTRX_CFG_PKTRX_LIF0_PFC_RDY2r = 1668, + NPPU_PKTRX_CFG_PKTRX_LIF0_PFC_RDY3r = 1669, + NPPU_PKTRX_CFG_PKTRX_LIF0_PFC_RDY4r = 1670, + NPPU_PKTRX_CFG_PKTRX_LIF0_PFC_RDY5r = 1671, + NPPU_PKTRX_CFG_PKTRX_LIF0_PFC_RDY6r = 1672, + NPPU_PKTRX_CFG_CFG_PORT_L2_OFFSET_MODEr = 1673, + NPPU_IDMA_CFG_INT_RAM_ENr = 1674, + NPPU_IDMA_CFG_INT_RAM_MASKr = 1675, + NPPU_IDMA_CFG_INT_RAM_STATUSr = 1676, + NPPU_IDMA_CFG_SUBSYS_INT_MASK_FLAGr = 1677, + NPPU_IDMA_CFG_SUBSYS_INT_UNMASK_FLAGr = 1678, + NPPU_IDMA_CFG_DEBUG_CNT_RDCLR_MODEr = 1679, + NPPU_PBU_CFG_INT_RAM_EN0r = 1680, + NPPU_PBU_CFG_INT_RAM_MASK0r = 1681, + NPPU_PBU_CFG_INT_RAM_STATUS0r = 1682, + NPPU_PBU_CFG_INT_FIFO_EN0r = 1683, + NPPU_PBU_CFG_INT_FIFO_EN1r = 1684, + NPPU_PBU_CFG_INT_FIFO_MASK0r = 1685, + NPPU_PBU_CFG_INT_FIFO_MASK1r = 1686, + NPPU_PBU_CFG_INT_FIFO_STATUS0r = 1687, + NPPU_PBU_CFG_INT_FIFO_STATUS1r = 1688, + NPPU_PBU_CFG_SUBSYS_INT_MASK_FLAGr = 1689, + NPPU_PBU_CFG_SUBSYS_INT_UNMASK_FLAGr = 1690, + NPPU_PBU_CFG_SA_IP_ENr = 1691, + NPPU_PBU_CFG_DEBUG_CNT_RDCLR_MODEr = 1692, + NPPU_PBU_CFG_FPTR_FIFO_AFUL_ASSERT_CFGr = 1693, + NPPU_PBU_CFG_FPTR_FIFO_AFUL_NEGATE_CFGr = 1694, + NPPU_PBU_CFG_PF_FIFO_AFUL_ASSERT_CFGr = 1695, + NPPU_PBU_CFG_PF_FIFO_AFUL_NEGATE_CFGr = 1696, + NPPU_PBU_CFG_PF_FIFO_AEPT_ASSERT_CFGr = 1697, + NPPU_PBU_CFG_PF_FIFO_AEPT_NEGATE_CFGr = 1698, + NPPU_PBU_CFG_WB_AFUL_ASSERT_CFGr = 1699, + NPPU_PBU_CFG_WB_AFUL_NEGATE_CFGr = 1700, + NPPU_PBU_CFG_SE_KEY_AFUL_ASSERT_CFGr = 1701, + NPPU_PBU_CFG_IFBRD_SE_AFUL_ASSERT_CFGr = 1702, + NPPU_PBU_CFG_IFBRD_SE_AFUL_NEGATE_CFGr = 1703, + NPPU_PBU_CFG_IFBRD_ODMA_AFUL_ASSERT_CFGr = 1704, + NPPU_PBU_CFG_IFBRD_ODMA_AFUL_NEGATE_CFGr = 1705, + NPPU_PBU_CFG_IFBRD_PPU_AFUL_ASSERT_CFGr = 1706, + NPPU_PBU_CFG_IFBRD_PPU_AFUL_NEGATE_CFGr = 1707, + NPPU_PBU_CFG_MC_LOGIC_AFUL_ASSERT_CFGr = 1708, + NPPU_PBU_CFG_MC_LOGIC_AFUL_NEGATE_CFGr = 1709, + NPPU_PBU_CFG_MC_LOGIC_DIFFr = 1710, + NPPU_PBU_CFG_CFG_PEAK_PORT_CNT_CLRr = 1711, + NPPU_PBU_CFG_ALL_FTM_CRDT_THr = 1712, + NPPU_PBU_CFG_ALL_FTM_LINK_TH_01r = 1713, + NPPU_PBU_CFG_ALL_FTM_LINK_TH_23r = 1714, + NPPU_PBU_CFG_ALL_FTM_LINK_TH_45r = 1715, + NPPU_PBU_CFG_ALL_FTM_LINK_TH_6r = 1716, + NPPU_PBU_CFG_ALL_FTM_TOTAL_CONGEST_THr = 1717, + NPPU_PBU_CFG_CFG_CRDT_MODEr = 1718, + NPPU_PBU_CFG_CFG_PFC_RDY_HIGH_TIMEr = 1719, + NPPU_PBU_CFG_CFG_PFC_RDY_LOW_TIMEr = 1720, + NPPU_PBU_STAT_PBU_FC_RDYr = 1721, + NPPU_PBU_STAT_PBU_LIF_GROUP0_RDY0r = 1722, + NPPU_PBU_STAT_PBU_LIF_GROUP0_RDY1r = 1723, + NPPU_PBU_STAT_PBU_LIF_GROUP1_RDYr = 1724, + NPPU_PBU_STAT_PBU_LIF_GROUP0_PFC_RDYr = 1725, + NPPU_PBU_STAT_PBU_LIF_GROUP1_PFC_RDYr = 1726, + NPPU_PBU_STAT_PBU_SA_PORT_RDY_0_31r = 1727, + NPPU_PBU_STAT_PBU_SA_PORT_RDY_32_50r = 1728, + NPPU_PBU_STAT_PBU_PKTRX_MR_PFC_RDYr = 1729, + NPPU_PBU_STAT_PBU_FTM_CRDT_PORT_RDY_0_31r = 1730, + NPPU_PBU_STAT_PBU_FTM_CRDT_PORT_RDY_32_47r = 1731, + NPPU_PBU_STAT_PBU_FTM_CRDT_PORT_CNG_RDY_0_31r = 1732, + NPPU_PBU_STAT_PBU_FTM_CRDT_PORT_CNG_RDY_32_47r = 1733, + NPPU_PBU_STAT_PBU_FTM_CRDT_SYS_INFOr = 1734, + NPPU_ISU_CFG_WEIGHT_NORMAL_MCr = 1735, + NPPU_ISU_CFG_WEIGHT_SA_MCr = 1736, + NPPU_ISU_CFG_WEIGHT_ETMr = 1737, + NPPU_ISU_CFG_WEIGHT_LP_MCr = 1738, + NPPU_ISU_CFG_WEIGHT_OAMr = 1739, + NPPU_ISU_CFG_WEIGHT_LIF_CTRL1r = 1740, + NPPU_ISU_CFG_WEIGHT_LIF_CTRL2r = 1741, + NPPU_ISU_CFG_ECC_BYPASS_READr = 1742, + NPPU_ISU_CFG_ISU_INT_MASKr = 1743, + NPPU_ISU_CFG_CFG_CRDT_CYCLEr = 1744, + NPPU_ISU_CFG_CFG_CRDT_VALUEr = 1745, + NPPU_ISU_CFG_ISU_INT_ENr = 1746, + NPPU_ISU_CFG_ISU_PPU_FIFO_FCr = 1747, + NPPU_ISU_CFG_ISU_INT_STATUSr = 1748, + NPPU_ISU_CFG_FD_PROG_FULL_ASSERT_CFGr = 1749, + NPPU_ISU_CFG_FD_PROG_FULL_NEGATE_CFGr = 1750, + NPPU_ISU_CFG_LP_PROG_FULL_ASSERT_CFGr = 1751, + NPPU_ISU_CFG_LP_PROG_FULL_NEGATE_CFGr = 1752, + NPPU_ISU_STAT_DEBUG_CNT_DAT0r = 1753, + NPPU_ISU_STAT_DEBUG_CNT_DAT1r = 1754, + NPPU_ISU_STAT_DEBUG_CNT_DAT2r = 1755, + NPPU_ISU_STAT_DEBUG_CNT_DAT3r = 1756, + NPPU_ISU_STAT_DEBUG_CNT_DAT4r = 1757, + NPPU_ISU_STAT_DEBUG_CNT_DAT5r = 1758, + NPPU_ISU_STAT_DEBUG_CNT_DAT6r = 1759, + NPPU_ISU_STAT_DEBUG_CNT_DAT7r = 1760, + NPPU_ISU_STAT_DEBUG_CNT_DAT8r = 1761, + NPPU_ISU_STAT_DEBUG_CNT_DAT9r = 1762, + NPPU_ISU_STAT_DEBUG_CNT_DAT10r = 1763, + NPPU_ISU_STAT_DEBUG_CNT_DAT11r = 1764, + NPPU_ISU_STAT_DEBUG_CNT_DAT12r = 1765, + NPPU_ISU_STAT_DEBUG_CNT_DAT13r = 1766, + NPPU_ISU_STAT_DEBUG_CNT_DAT14r = 1767, + NPPU_ISU_STAT_DEBUG_CNT_DAT15r = 1768, + NPPU_ISU_STAT_DEBUG_CNT_DAT16r = 1769, + NPPU_ISU_STAT_DEBUG_CNT_DAT17r = 1770, + NPPU_ISU_STAT_DEBUG_CNT_DAT18r = 1771, + NPPU_ISU_STAT_DEBUG_CNT_DAT19r = 1772, + NPPU_ISU_STAT_DEBUG_CNT_CFGr = 1773, + NPPU_ODMA_CFG_EXSA_TDM_OFFSETr = 1774, + NPPU_ODMA_CFG_ECC_BYPASS_READTr = 1775, + NPPU_ODMA_CFG_ODMA_INT_EN_0r = 1776, + NPPU_ODMA_CFG_ODMA_INT_EN_1r = 1777, + NPPU_ODMA_CFG_ODMA_INT_EN_2r = 1778, + NPPU_ODMA_CFG_ODMA_INT_EN_3r = 1779, + NPPU_ODMA_CFG_ODMA_INT_MASK_0r = 1780, + NPPU_ODMA_CFG_ODMA_INT_MASK_1r = 1781, + NPPU_ODMA_CFG_ODMA_INT_MASK_2r = 1782, + NPPU_ODMA_CFG_ODMA_INT_MASK_3r = 1783, + NPPU_ODMA_CFG_ODMA_INT_STATUS_0r = 1784, + NPPU_ODMA_CFG_ODMA_INT_STATUS_1r = 1785, + NPPU_ODMA_CFG_ODMA_INT_STATUS_2r = 1786, + NPPU_ODMA_CFG_ODMA_INT_STATUS_3r = 1787, + NPPU_ODMA_CFG_SP_TDM_ERR_NOR_CFGr = 1788, + NPPU_ODMA_CFG_ETM_DIS_PTR_PROG_FULL_CFG_Ar = 1789, + NPPU_ODMA_CFG_ETM_DIS_PTR_PROG_FULL_CFG_Nr = 1790, + NPPU_ODMA_CFG_FTM_DIS_PTR_PROG_FULL_CFG_Ar = 1791, + NPPU_ODMA_CFG_FTM_DIS_PTR_PROG_FULL_CFG_Nr = 1792, + NPPU_ODMA_CFG_TM_DIS_FIFO_PROG_FULL_CFG_Ar = 1793, + NPPU_ODMA_CFG_TM_DIS_FIFO_PROG_FULL_CFG_Nr = 1794, + NPPU_ODMA_CFG_ERR_PROG_FULL_CFG_Ar = 1795, + NPPU_ODMA_CFG_ERR_PROG_FULL_CFG_Nr = 1796, + NPPU_ODMA_CFG_TDMUC_PROG_FULL_CFG_Ar = 1797, + NPPU_ODMA_CFG_TDMUC_PROG_FULL_CFG_Nr = 1798, + NPPU_ODMA_CFG_TDMMC_GROUPID_PROG_FULL_CFG_Ar = 1799, + NPPU_ODMA_CFG_TDMMC_GROUPID_PROG_FULL_CFG_Nr = 1800, + NPPU_ODMA_CFG_TDMMC_NO_BITMAP_PROG_FULL_CFG_Ar = 1801, + NPPU_ODMA_CFG_TDMMC_NO_BITMAP_PROG_FULL_CFG_Nr = 1802, + NPPU_ODMA_CFG_TDMMC_PROG_FULL_CFG_Ar = 1803, + NPPU_ODMA_CFG_TDMMC_PROG_FULL_CFG_Nr = 1804, + NPPU_ODMA_CFG_DESC_PROG_FULL_CFG_Ar = 1805, + NPPU_ODMA_CFG_DESC_PROG_FULL_CFG_Nr = 1806, + NPPU_ODMA_CFG_DLY_PROG_FULL_CFG_Ar = 1807, + NPPU_ODMA_CFG_DLY_PROG_FULL_CFG_Nr = 1808, + NPPU_ODMA_CFG_RSP_PROG_FULL_CFG_Ar = 1809, + NPPU_ODMA_CFG_RSP_PROG_FULL_CFG_Nr = 1810, + NPPU_ODMA_CFG_NOR_PROG_FULL_CFG_Ar = 1811, + NPPU_ODMA_CFG_NOR_PROG_FULL_CFG_Nr = 1812, + NPPU_ODMA_CFG_ETM_NOR_PROG_FULL_CFG_Ar = 1813, + NPPU_ODMA_CFG_ETM_NOR_PROG_FULL_CFG_Nr = 1814, + NPPU_ODMA_CFG_FTM_NOR_PROG_FULL_CFG_Ar = 1815, + NPPU_ODMA_CFG_FTM_NOR_PROG_FULL_CFG_Nr = 1816, + NPPU_ODMA_CFG_ETM_PROG_FULL_CFG_Ar = 1817, + NPPU_ODMA_CFG_ETM_PROG_FULL_CFG_Nr = 1818, + NPPU_ODMA_CFG_FTM_PROG_FULL_CFG_Ar = 1819, + NPPU_ODMA_CFG_FTM_PROG_FULL_CFG_Nr = 1820, + NPPU_ODMA_CFG_ETM_NRDCNT_PROG_FULL_CFG_Ar = 1821, + NPPU_ODMA_CFG_ETM_NRDCNT_PROG_FULL_CFG_Nr = 1822, + NPPU_ODMA_CFG_FTM_NRDCNT_PROG_FULL_CFG_Ar = 1823, + NPPU_ODMA_CFG_FTM_NRDCNT_PROG_FULL_CFG_Nr = 1824, + NPPU_ODMA_CFG_PP_PROG_FULL_CFG_Ar = 1825, + NPPU_ODMA_CFG_PP_PROG_FULL_CFG_Nr = 1826, + NPPU_ODMA_CFG_TM_WEIGHTr = 1827, + NPPU_ODMA_CFG_PP_WEIGHTr = 1828, + NPPU_ODMA_CFG_IFBCMD_PROG_FULL_CFG_Ar = 1829, + NPPU_ODMA_CFG_IFBCMD_PROG_FULL_CFG_Nr = 1830, + NPPU_ODMA_CFG_MCCNT_PROG_FULL_CFG_Ar = 1831, + NPPU_ODMA_CFG_MCCNT_PROG_FULL_CFG_Nr = 1832, + NPPU_ODMA_CFG_INT_OR_PONr = 1833, + NPPU_ODMA_CFG_QUEMNG_CNT_IN_ERR_CNTr = 1834, + NPPU_ODMA_CFG_LIF0_PORT_EOP_CNTr = 1835, + NPPU_ODMA_CFG_LIF1_PORT_EOP_CNTr = 1836, + NPPU_ODMA_CFG_LIFC_PORT0_EOP_CNTr = 1837, + NPPU_ODMA_CFG_LIFC_PORT1_EOP_CNTr = 1838, + NPPU_ODMA_CFG_FPTR_FIFO_PROG_EPT_CFG_Nr = 1839, + NPPU_ODMA_CFG_ISU_FIFO_PROG_FULL_CFG_Ar = 1840, + NPPU_ODMA_CFG_ISU_FIFO_PROG_FULL_CFG_Nr = 1841, + NPPU_OAM_CFG_IND_ACCESS_DONEr = 1842, + NPPU_OAM_CFG_IND_ACCESS_COMMANDr = 1843, + NPPU_OAM_CFG_IND_DAT0r = 1844, + NPPU_OAM_CFG_IND_DAT1r = 1845, + NPPU_OAM_CFG_IND_DAT2r = 1846, + NPPU_OAM_CFG_IND_DAT3r = 1847, + NPPU_OAM_CFG_OAM_TX_MAIN_ENr = 1848, + NPPU_OAM_CFG_TX_TOTAL_NUMr = 1849, + NPPU_OAM_CFG_OAM_CHK_MAIN_ENr = 1850, + NPPU_OAM_CFG_CHK_TOTAL_NUM0r = 1851, + NPPU_OAM_CFG_MA_CHK_MAIN_ENr = 1852, + NPPU_OAM_CFG_CHK_TOTAL_NUM1r = 1853, + NPPU_OAM_CFG_TX_STAT_ENr = 1854, + NPPU_OAM_CFG_REC_STAT_ENr = 1855, + NPPU_OAM_CFG_STAT_OAM_RDY_MASKr = 1856, + NPPU_OAM_CFG_SESSION_GRADING0r = 1857, + NPPU_OAM_CFG_SESSION_GRADING1r = 1858, + NPPU_OAM_CFG_SESSION_GRADING2r = 1859, + NPPU_OAM_CFG_SESSION_GRADING3r = 1860, + NPPU_OAM_CFG_BFD_CHK_HADDRr = 1861, + NPPU_OAM_CFG_ETHCCM_CHK_HADDRr = 1862, + NPPU_OAM_CFG_TPBFD_CHK_HADDRr = 1863, + NPPU_OAM_CFG_TPOAM_CCM_CHK_HADDRr = 1864, + NPPU_OAM_CFG_BFD_TX_HADDRr = 1865, + NPPU_OAM_CFG_ETHCCM_TX_HADDRr = 1866, + NPPU_OAM_CFG_TPBFD_TX_HADDRr = 1867, + NPPU_OAM_CFG_TPOAM_CCM_TX_HADDRr = 1868, + NPPU_OAM_CFG_ETHCCM_MA_CHK_HADDRr = 1869, + NPPU_OAM_CFG_TPCCM_MA_CHK_HADDRr = 1870, + NPPU_OAM_CFG_GROUPNUM_RAM_CLRr = 1871, + NPPU_OAM_CFG_INDEX_RAM0_CLRr = 1872, + NPPU_OAM_CFG_INDEX_RAM1_CLRr = 1873, + NPPU_OAM_CFG_RMEP_RAM_CLRr = 1874, + NPPU_OAM_CFG_MA_RAM_CLRr = 1875, + NPPU_OAM_CFG_RAM_INIT_DONEr = 1876, + NPPU_OAM_CFG_REC_BFD_DEBUG_ENr = 1877, + NPPU_OAM_CFG_OAM_SESSION_INTr = 1878, + NPPU_OAM_CFG_PON_INTr = 1879, + NPPU_OAM_CFG_OAM_INT_CLRr = 1880, + NPPU_OAM_CFG_TYPE_INT_CLR0r = 1881, + NPPU_OAM_CFG_TYPE_INT_CLR1r = 1882, + NPPU_OAM_CFG_INTERRUPT_MASKr = 1883, + NPPU_OAM_CFG_INT0_INDEXr = 1884, + NPPU_OAM_CFG_INT1_INDEXr = 1885, + NPPU_OAM_CFG_INT0_INDEX_REGIONr = 1886, + NPPU_OAM_CFG_INT1_INDEX_REGIONr = 1887, + NPPU_OAM_CFG_BDIINFO_FWFT_FIFO_THr = 1888, + NPPU_OAM_CFG_RECSEC_FWFT_FIFO_THr = 1889, + NPPU_OAM_CFG_TIMING_CHK_INFO0_FWFT_FIFO_THr = 1890, + NPPU_OAM_CFG_RECMA_FWFT_FIFO_THr = 1891, + NPPU_OAM_CFG_TIMING_CHK_INFO1_FWFT_FIFO_THr = 1892, + NPPU_OAM_CFG_OAM_TXINST_FIFO_THr = 1893, + NPPU_OAM_CFG_OAM_RDINFO_FWFT_FIFO_THr = 1894, + NPPU_OAM_CFG_LM_CNT_FWFT_FIFO_THr = 1895, + NPPU_OAM_CFG_OAM_PKT_FIFO_THr = 1896, + NPPU_OAM_CFG_RECLM_STAT_FIFO_THr = 1897, + NPPU_OAM_CFG_TXLM_STAT_FIFO_THr = 1898, + NPPU_OAM_CFG_OAM_CHK_FWFT_FIFO_THr = 1899, + NPPU_OAM_CFG_TXOAM_STAT_FIFO_THr = 1900, + NPPU_OAM_CFG_RECOAM_STAT_FIFO_THr = 1901, + NPPU_OAM_CFG_TXPKT_DATA_FWFT_FIFO_THr = 1902, + NPPU_OAM_CFG_TSTPKT_FWFT_FIFO_THr = 1903, + NPPU_OAM_CFG_TST_TXINST_FWFT_FIFO_THr = 1904, + NPPU_OAM_CFG_TSTRX_MAIN_ENr = 1905, + NPPU_OAM_CFG_TSTTX_CFG_PARA_TBL2r = 1906, + NPPU_OAM_CFG_TSTTX_CFG_PARA_TBL1r = 1907, + NPPU_OAM_CFG_TSTTX_CFG_PARA_TBL0r = 1908, + NPPU_OAM_CFG_TSTRX_CFG_PARAr = 1909, + NPPU_OAM_CFG_FIFO_STATUS_INT_EN_0r = 1910, + NPPU_OAM_CFG_FIFO_STATUS_INT_EN_1r = 1911, + NPPU_OAM_CFG_FIFO_STATUS_INT_MASK_0r = 1912, + NPPU_OAM_CFG_FIFO_STATUS_INT_MASK_1r = 1913, + NPPU_OAM_CFG_FIFO_STATUS_INT_STATUSr = 1914, + NPPU_OAM_CFG_MAIN_FREQUENCYr = 1915, + NPPU_OAM_CFG_OAM_CFG_TYPEr = 1916, + NPPU_OAM_CFG_FST_SWCH_ETH_HEAD0r = 1917, + NPPU_OAM_CFG_FST_SWCH_ETH_HEAD1r = 1918, + NPPU_OAM_CFG_FST_SWCH_ETH_HEAD2r = 1919, + NPPU_OAM_CFG_FST_SWCH_ETH_HEAD3r = 1920, + NPPU_OAM_CFG_OAM_FS_TXINST_FIFO_THr = 1921, + NPPU_OAM_CFG_OAM_MA_FS_TXINST_FIFO_THr = 1922, + NPPU_OAM_CFG_PON_INT_RAM_CLRr = 1923, + NPPU_OAM_CFG_PON_P_INT_INDEXr = 1924, + NPPU_OAM_CFG_PON_PROTECT_PKT_FIFO_THr = 1925, + NPPU_OAM_CFG_PON_LASER_OFF_ENr = 1926, + NPPU_OAM_CFG_PON_PRTCT_PKT_TX_ENr = 1927, + NPPU_OAM_CFG_CFG_PON_MASTERr = 1928, + NPPU_OAM_CFG_LEVEL_MODEr = 1929, + NPPU_OAM_CFG_INTERRUPT_ENr = 1930, + NPPU_OAM_CFG_PON_LASER_ON_ENr = 1931, + NPPU_OAM_CFG_TI_PON_SDr = 1932, + NPPU_OAM_CFG_TI_PON_LOSr = 1933, + NPPU_OAM_CFG_IND_DAT4r = 1934, + NPPU_OAM_CFG_IND_DAT5r = 1935, + NPPU_OAM_CFG_IND_DAT6r = 1936, + NPPU_OAM_CFG_IND_DAT7r = 1937, + NPPU_OAM_CFG_IND_DAT8r = 1938, + NPPU_OAM_CFG_IND_DAT9r = 1939, + NPPU_OAM_CFG_IND_DAT10r = 1940, + NPPU_OAM_CFG_IND_DAT11r = 1941, + NPPU_OAM_CFG_IND_DAT12r = 1942, + NPPU_OAM_CFG_IND_DAT13r = 1943, + NPPU_OAM_CFG_IND_DAT14r = 1944, + NPPU_OAM_CFG_IND_DAT15r = 1945, + NPPU_OAM_CFG_OAM_2544_PKT_FIFO_THr = 1946, + NPPU_OAM_CFG_TXINFO_RAM_CLRr = 1947, + NPPU_OAM_CFG_TXINFO_RAM_INIT_DONEr = 1948, + NPPU_OAM_CFG_FIFO_STATUS_INT_STATUS40r = 1949, + NPPU_OAM_CFG_FIFO_STATUS_INT_STATUS41r = 1950, + NPPU_OAM_CFG_OAM_2544_FUN_ENr = 1951, + NPPU_OAM_CFG_OAM_2544_STAT_CLRr = 1952, + NPPU_OAM_CFG_TXDIS_DEFAULTr = 1953, + NPPU_OAM_CFG_TXDIS_DEFAULT_ENr = 1954, + NPPU_OAM_CFG_TPBFD_FIRSTCHK_THr = 1955, + NPPU_OAM_CFG_ETHCCM_FIRSTCHK_THr = 1956, + NPPU_OAM_CFG_TPCCM_FIRSTCHK_THr = 1957, + NPPU_OAM_STAT_TXSTAT_REQ_CNTr = 1958, + NPPU_OAM_STAT_CHKSTAT_REQ_CNTr = 1959, + NPPU_OAM_STAT_STAT_OAM_FC_CNTr = 1960, + NPPU_OAM_STAT_BFDSEQ_REQ_CNTr = 1961, + NPPU_OAM_STAT_LMCNT_REQ_CNTr = 1962, + NPPU_OAM_STAT_STAT_OAM_LM_RSP_CNTr = 1963, + NPPU_OAM_STAT_STAT_OAM_LM_FC_CNTr = 1964, + NPPU_OAM_STAT_SE_REQ_CNTr = 1965, + NPPU_OAM_STAT_SE_RSP_CNTr = 1966, + NPPU_OAM_STAT_SE_OAM_FC_CNTr = 1967, + NPPU_OAM_STAT_OAM_SE_FC_CNTr = 1968, + NPPU_OAM_STAT_OAM_PKTRX_SOP_CNTr = 1969, + NPPU_OAM_STAT_OAM_PKTRX_EOP_CNTr = 1970, + NPPU_OAM_STAT_PKTRX_OAM_FC_CNTr = 1971, + NPPU_OAM_STAT_PKTRX_OAM_TST_FC_CNTr = 1972, + NPPU_OAM_STAT_ODMA_OAM_SOP_CNTr = 1973, + NPPU_OAM_STAT_ODMA_OAM_EOP_CNTr = 1974, + NPPU_OAM_STAT_OAM_ODMA_FC_CNTr = 1975, + NPPU_OAM_STAT_REC_MA_PKT_ILLEGAL_CNTr = 1976, + NPPU_OAM_STAT_REC_RMEP_PKT_ILLEGAL_CNTr = 1977, + NPPU_OAM_STAT_REC_ETH_AIS_PKT_CNTr = 1978, + NPPU_OAM_STAT_REC_TP_AIS_PKT_CNTr = 1979, + NPPU_OAM_STAT_REC_TP_CSF_PKT_CNTr = 1980, + NPPU_OAM_STAT_REC_ETH_LEVEL_DEFECT_CNTr = 1981, + NPPU_OAM_STAT_REC_ETH_MEGID_DEFECT_CNTr = 1982, + NPPU_OAM_STAT_REC_ETH_MEPID_DEFECT_CNTr = 1983, + NPPU_OAM_STAT_REC_ETH_INTERVAL_DEFECT_CNTr = 1984, + NPPU_OAM_STAT_REC_SESS_UNENABLE_CNTr = 1985, + NPPU_OAM_STAT_OAM_2544_RD_PKT_CNTr = 1986, + NPPU_OAM_STAT_DEBUG_CNT_CLRr = 1987, + NPPU_OAM_STAT_OAM_PKTRX_CATCH_DATAr = 1988, + NPPU_OAM_STAT_ODMA_OAM_CATCH_DATAr = 1989, + NPPU_OAM_STAT_TST_SESSION_TX_CNTr = 1990, + NPPU_OAM_STAT_TST_SESSION_RX_CNTr = 1991, + NPPU_OAM_STAT_TSTRX_LOST_CNTr = 1992, + NPPU_OAM_STAT_BFDSEQ_WR_CNTr = 1993, + NPPU_OAM_STAT_BFDTIME_WR_CNTr = 1994, + NPPU_OAM_STAT_LMCNT_WR_CNTr = 1995, + NPPU_OAM_STAT_OAM_FS_PKT_CNTr = 1996, + NPPU_OAM_STAT_OAM_MA_FS_PKT_CNTr = 1997, + NPPU_OAM_STAT_REC_TP_LEVEL_DEFECT_CNTr = 1998, + NPPU_OAM_STAT_REC_TP_MEGID_DEFECT_CNTr = 1999, + NPPU_OAM_STAT_REC_TP_MEPID_DEFECT_CNTr = 2000, + NPPU_OAM_STAT_REC_TP_INTERVAL_DEFECT_CNTr = 2001, + NPPU_OAM_STAT_RD_REG_CLEAR_MODEr = 2002, + NPPU_OAM_STAT_RD_DATA_REG_CLEAR_MODEr = 2003, + NPPU_OAM_CFG_INDIR_OAM_INT_STATUS_RAM_0r = 2004, + NPPU_OAM_CFG_INDIR_OAM_INT_STATUS_RAM1r = 2005, + NPPU_OAM_CFG_INDIR_TST_PKT_TX_PARA_RAMr = 2006, + NPPU_OAM_CFG_INDIR_GROUPNUMRAMr = 2007, + NPPU_OAM_CFG_INDIR_OAM_TX_TBL_RAMr = 2008, + NPPU_OAM_CFG_INDIR_OAM_CHK_TBL_RAMr = 2009, + NPPU_OAM_CFG_INDIR_OAM_MA_CHK_TBL_RAMr = 2010, + NPPU_OAM_CFG_INDIR_OAM_2544_TX_RAMr = 2011, + PPU_PPU_INTERRUPT_EN_Rr = 2012, + PPU_PPU_MEC_HOST_INTERRUPTr = 2013, + PPU_PPU_DBG_RTL_DATEr = 2014, + PPU_PPU_DUP_START_NUM_CFGr = 2015, + PPU_PPU_DEBUG_DATA_WRITE_COMPLETEr = 2016, + PPU_PPU_UC_MC_WRR_CFGr = 2017, + PPU_PPU_DEBUG_PKT_SEND_ENr = 2018, + PPU_PPU_DUP_TBL_IND_ACCESS_DONEr = 2019, + PPU_PPU_ISU_PPU_DEMUX_FIFO_INTERRUPT_MASKr = 2020, + PPU_PPU_PPU_MULTICAST_FIFO_INTERRUPT_MASKr = 2021, + PPU_PPU_PPU_IN_SCHEDULE_FIFO_INTERRUPT_MASKr = 2022, + PPU_PPU_PPU_MF_OUT_FIFO_INTERRUPT_MASKr = 2023, + PPU_PPU_PBU_MCODE_PF_REQ_SCHEDULE_FIFO_INTERRUPT_MASKr = 2024, + PPU_PPU_PBU_MCODE_PF_RSP_SCHEDULE_FIFO_INTERRUPT_MASKr = 2025, + PPU_PPU_PPU_MCCNT_FIFO_INTERRUPT_MASKr = 2026, + PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_MASK_Lr = 2027, + PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_MASK_Mr = 2028, + PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_MASK_Hr = 2029, + PPU_PPU_PPU_RAM_CHECK_ERR_MASKr = 2030, + PPU_PPU_INSTRMEM_FIFO_INTERRUPT_MASKr = 2031, + PPU_PPU_ISU_PPU_DEMUX_FIFO_INTERRUPT_STAr = 2032, + PPU_PPU_PPU_MULTICAST_FIFO_INTERRUPT_STAr = 2033, + PPU_PPU_PPU_IN_SCHEDULE_FIFO_INTERRUPT_STAr = 2034, + PPU_PPU_PPU_MF_OUT_FIFO_INTERRUPT_STAr = 2035, + PPU_PPU_PBU_MCODE_PF_REQ_SCHEDULE_FIFO_INTERRUPT_STAr = 2036, + PPU_PPU_PBU_MCODE_PF_RSP_SCHEDULE_FIFO_INTERRUPT_STAr = 2037, + PPU_PPU_PPU_MCCNT_FIFO_INTERRUPT_STAr = 2038, + PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_STA_Lr = 2039, + PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_STA_Mr = 2040, + PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_STA_Hr = 2041, + PPU_PPU_INSTRMEM_FIFO_INTERRUPT_STAr = 2042, + PPU_PPU_PPU_RAM_CHECK_ECC_ERR_FLAG_1r = 2043, + PPU_PPU_ISU_PPU_DEMUX_FIFO_INTERRUPT_FLAGr = 2044, + PPU_PPU_PPU_MULTICAST_FIFO_INTERRUPT_FLAGr = 2045, + PPU_PPU_PPU_IN_SCHEDULE_FIFO_INTERRUPT_FLAGr = 2046, + PPU_PPU_PPU_MF_OUT_FIFO_INTERRUPT_FLAGr = 2047, + PPU_PPU_PBU_MCODE_PF_REQ_SCHEDULE_FIFO_INTERRUPT_FLAGr = 2048, + PPU_PPU_PBU_MCODE_PF_RSP_SCHEDULE_FIFO_INTERRUPT_FLAGr = 2049, + PPU_PPU_PPU_MCCNT_FIFO_INTERRUPT_FLAGr = 2050, + PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_FLAG_Lr = 2051, + PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_FLAG_Mr = 2052, + PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_FLAG_Hr = 2053, + PPU_PPU_INSTRMEM_FIFO_INTERRUPT_FLAGr = 2054, + PPU_PPU_INSTRMEM_RAM_INT_OUTr = 2055, + PPU_PPU_INSTRMEM_RAM_INT_MASKr = 2056, + PPU_PPU_INSTRMEM_RAM_INT_STATr = 2057, + PPU_PPU_INSTRMEM_RAM_INT_FLAGr = 2058, + PPU_PPU_PPU_COUNT_CFGr = 2059, + PPU_PPU_PPU_STATICS_CFGr = 2060, + PPU_PPU_PPU_STATICS_WB_CFGr = 2061, + PPU_PPU_WR_TABLE_SELF_RSP_EN_CFGr = 2062, + PPU_PPU_PPU_RANDOM_ARBITER_8TO1_CFGr = 2063, + PPU_PPU_PPU_REORDER_BYPASS_FLOW_NUM_CFGr = 2064, + PPU_PPU_COS_METER_CFG_Hr = 2065, + PPU_PPU_COS_METER_CFG_Lr = 2066, + PPU_PPU_INSTRMEM_RDYr = 2067, + PPU_PPU_INSTRMEM_ADDRr = 2068, + PPU_PPU_INSTRMEM_IND_ACCESS_DONEr = 2069, + PPU_PPU_INSTRMEM_INSTR0_DATA_Lr = 2070, + PPU_PPU_INSTRMEM_INSTR0_DATA_Hr = 2071, + PPU_PPU_INSTRMEM_INSTR1_DATA_Lr = 2072, + PPU_PPU_INSTRMEM_INSTR1_DATA_Hr = 2073, + PPU_PPU_INSTRMEM_INSTR2_DATA_Lr = 2074, + PPU_PPU_INSTRMEM_INSTR2_DATA_Hr = 2075, + PPU_PPU_INSTRMEM_INSTR3_DATA_Lr = 2076, + PPU_PPU_INSTRMEM_INSTR3_DATA_Hr = 2077, + PPU_PPU_INSTRMEM_READ_INSTR0_DATA_Lr = 2078, + PPU_PPU_INSTRMEM_READ_INSTR0_DATA_Hr = 2079, + PPU_PPU_INSTRMEM_READ_INSTR1_DATA_Lr = 2080, + PPU_PPU_INSTRMEM_READ_INSTR1_DATA_Hr = 2081, + PPU_PPU_INSTRMEM_READ_INSTR2_DATA_Lr = 2082, + PPU_PPU_INSTRMEM_READ_INSTR2_DATA_Hr = 2083, + PPU_PPU_INSTRMEM_READ_INSTR3_DATA_Lr = 2084, + PPU_PPU_INSTRMEM_READ_INSTR3_DATA_Hr = 2085, + PPU_PPU_SE_PPU_MC_SRH_FC_CNT_Hr = 2086, + PPU_PPU_SE_PPU_MC_SRH_FC_CNT_Lr = 2087, + PPU_PPU_PPU_SE_MC_SRH_FC_CNT_Hr = 2088, + PPU_PPU_PPU_SE_MC_SRH_FC_CNT_Lr = 2089, + PPU_PPU_PPU_SE_MC_SRH_VLD_CNT_Hr = 2090, + PPU_PPU_PPU_SE_MC_SRH_VLD_CNT_Lr = 2091, + PPU_PPU_SE_PPU_MC_SRH_VLD_CNT_Hr = 2092, + PPU_PPU_SE_PPU_MC_SRH_VLD_CNT_Lr = 2093, + PPU_PPU_PBU_PPU_LOGIC_PF_FC_CNT_Hr = 2094, + PPU_PPU_PBU_PPU_LOGIC_PF_FC_CNT_Lr = 2095, + PPU_PPU_PPU_PBU_LOGIC_RSP_FC_CNT_Hr = 2096, + PPU_PPU_PPU_PBU_LOGIC_RSP_FC_CNT_Lr = 2097, + PPU_PPU_PPU_PBU_LOGIC_PF_REQ_VLD_CNT_Hr = 2098, + PPU_PPU_PPU_PBU_LOGIC_PF_REQ_VLD_CNT_Lr = 2099, + PPU_PPU_PBU_PPU_LOGIC_PF_RSP_VLD_CNT_Hr = 2100, + PPU_PPU_PBU_PPU_LOGIC_PF_RSP_VLD_CNT_Lr = 2101, + PPU_PPU_PBU_PPU_IFB_RD_FC_CNT_Hr = 2102, + PPU_PPU_PBU_PPU_IFB_RD_FC_CNT_Lr = 2103, + PPU_PPU_PBU_PPU_WB_FC_CNT_Hr = 2104, + PPU_PPU_PBU_PPU_WB_FC_CNT_Lr = 2105, + PPU_PPU_PPU_PBU_MCODE_PF_REQ_VLD_CNT_Hr = 2106, + PPU_PPU_PPU_PBU_MCODE_PF_REQ_VLD_CNT_Lr = 2107, + PPU_PPU_PBU_PPU_MCODE_PF_RSP_VLD_CNT_Hr = 2108, + PPU_PPU_PBU_PPU_MCODE_PF_RSP_VLD_CNT_Lr = 2109, + PPU_PPU_ODMA_PPU_PARA_FC_CNT_Hr = 2110, + PPU_PPU_ODMA_PPU_PARA_FC_CNT_Lr = 2111, + PPU_PPU_ODMA_PPU_MCCNT_WR_FC_CNT_Hr = 2112, + PPU_PPU_ODMA_PPU_MCCNT_WR_FC_CNT_Lr = 2113, + PPU_PPU_PPU_ODMA_MCCNT_WR_VLD_CNT_Hr = 2114, + PPU_PPU_PPU_ODMA_MCCNT_WR_VLD_CNT_Lr = 2115, + PPU_PPU_ODMA_PPU_MCCNT_RSP_VLD_CNT_Hr = 2116, + PPU_PPU_ODMA_PPU_MCCNT_RSP_VLD_CNT_Lr = 2117, + PPU_PPU_PPU_PKTRX_UC_FC_CNT_Hr = 2118, + PPU_PPU_PPU_PKTRX_UC_FC_CNT_Lr = 2119, + PPU_PPU_PPU_PKTRX_MC_FC_CNT_Hr = 2120, + PPU_PPU_PPU_PKTRX_MC_FC_CNT_Lr = 2121, + PPU_PPU_PKTRX_PPU_DESC_VLD_CNT_Hr = 2122, + PPU_PPU_PKTRX_PPU_DESC_VLD_CNT_Lr = 2123, + PPU_PPU_PPU_PBU_IFB_REQ_VLD_CNT_Hr = 2124, + PPU_PPU_PPU_PBU_IFB_REQ_VLD_CNT_Lr = 2125, + PPU_PPU_PBU_PPU_IFB_RSP_VLD_CNT_Hr = 2126, + PPU_PPU_PBU_PPU_IFB_RSP_VLD_CNT_Lr = 2127, + PPU_PPU_PPU_PBU_WB_VLD_CNT_Hr = 2128, + PPU_PPU_PPU_PBU_WB_VLD_CNT_Lr = 2129, + PPU_PPU_PBU_PPU_REORDER_PARA_VLD_CNT_Hr = 2130, + PPU_PPU_PBU_PPU_REORDER_PARA_VLD_CNT_Lr = 2131, + PPU_PPU_PPU_ODMA_PARA_VLD_CNT_Hr = 2132, + PPU_PPU_PPU_ODMA_PARA_VLD_CNT_Lr = 2133, + PPU_PPU_STATICS_ISU_PPU_MC_VLD_CNT_Hr = 2134, + PPU_PPU_STATICS_ISU_PPU_MC_VLD_CNT_Lr = 2135, + PPU_PPU_STATICS_ISU_PPU_MC_LOOP_VLD_CNT_Hr = 2136, + PPU_PPU_STATICS_ISU_PPU_MC_LOOP_VLD_CNT_Lr = 2137, + PPU_PPU_STATICS_ISU_PPU_UC_VLD_CNT_Hr = 2138, + PPU_PPU_STATICS_ISU_PPU_UC_VLD_CNT_Lr = 2139, + PPU_PPU_STATICS_ISU_PPU_UC_BUFNUMIS0_VLD_CNT_Hr = 2140, + PPU_PPU_STATICS_ISU_PPU_UC_BUFNUMIS0_VLD_CNT_Lr = 2141, + PPU_PPU_STATICS_DEMUX_SCHEDULE_MC_VLD_CNT_Hr = 2142, + PPU_PPU_STATICS_DEMUX_SCHEDULE_MC_VLD_CNT_Lr = 2143, + PPU_PPU_STATICS_DEMUX_SCHEDULE_MC_BUFNUMIS0_VLD_CNT_Hr = 2144, + PPU_PPU_STATICS_DEMUX_SCHEDULE_MC_BUFNUMIS0_VLD_CNT_Lr = 2145, + PPU_PPU_STATICS_DEMUX_SCHEDULE_MC_SRCPORTIS0_VLD_CNT_Hr = 2146, + PPU_PPU_STATICS_DEMUX_SCHEDULE_MC_SRCPORTIS0_VLD_CNT_Lr = 2147, + PPU_PPU_STATICS_DEMUX_SCHEDULE_MC_SRCPORTIS1_VLD_CNT_Hr = 2148, + PPU_PPU_STATICS_DEMUX_SCHEDULE_MC_SRCPORTIS1_VLD_CNT_Lr = 2149, + PPU_PPU_STATICS_DEMUX_SCHEDULE_UC_VLD_CNT_Hr = 2150, + PPU_PPU_STATICS_DEMUX_SCHEDULE_UC_VLD_CNT_Lr = 2151, + PPU_PPU_STATICS_DEMUX_SCHEDULE_UC_BUFNUMIS0_VLD_CNT_Hr = 2152, + PPU_PPU_STATICS_DEMUX_SCHEDULE_UC_BUFNUMIS0_VLD_CNT_Lr = 2153, + PPU_PPU_STATICS_DEMUX_SCHEDULE_UC_SRCPORTIS0_VLD_CNT_Hr = 2154, + PPU_PPU_STATICS_DEMUX_SCHEDULE_UC_SRCPORTIS0_VLD_CNT_Lr = 2155, + PPU_PPU_STATICS_DEMUX_SCHEDULE_UC_SRCPORTIS1_VLD_CNT_Hr = 2156, + PPU_PPU_STATICS_DEMUX_SCHEDULE_UC_SRCPORTIS1_VLD_CNT_Lr = 2157, + PPU_PPU_STATICS_PPU_WB_VLD_CNT_Hr = 2158, + PPU_PPU_STATICS_PPU_WB_VLD_CNT_Lr = 2159, + PPU_PPU_STATICS_PPU_WB_BUFNUMIS0_VLD_CNT_Hr = 2160, + PPU_PPU_STATICS_PPU_WB_BUFNUMIS0_VLD_CNT_Lr = 2161, + PPU_PPU_STATICS_PPU_WB_SRCPORTIS0_VLD_CNT_Hr = 2162, + PPU_PPU_STATICS_PPU_WB_SRCPORTIS0_VLD_CNT_Lr = 2163, + PPU_PPU_STATICS_PPU_WB_SRCPORTIS1_VLD_CNT_Hr = 2164, + PPU_PPU_STATICS_PPU_WB_SRCPORTIS1_VLD_CNT_Lr = 2165, + PPU_PPU_STATICS_PPU_WB_HALT_SEND_TYPE_VLD_CNT_Hr = 2166, + PPU_PPU_STATICS_PPU_WB_HALT_SEND_TYPE_VLD_CNT_Lr = 2167, + PPU_PPU_STATICS_PPU_WB_MF_TYPE_VLD_CNT_Hr = 2168, + PPU_PPU_STATICS_PPU_WB_MF_TYPE_VLD_CNT_Lr = 2169, + PPU_PPU_STATICS_PPU_WB_HALT_CONTINUE_END_VLD_CNT_Hr = 2170, + PPU_PPU_STATICS_PPU_WB_HALT_CONTINUE_END_VLD_CNT_Lr = 2171, + PPU_PPU_STATICS_PPU_WB_DUP_FLAG_VLD_CNT_Hr = 2172, + PPU_PPU_STATICS_PPU_WB_DUP_FLAG_VLD_CNT_Lr = 2173, + PPU_PPU_STATICS_PPU_WB_LAST_FLAG_VLD_CNT_Hr = 2174, + PPU_PPU_STATICS_PPU_WB_LAST_FLAG_VLD_CNT_Lr = 2175, + PPU_PPU_STATICS_PPU_WB_DIS_FLAG_VLD_CNT_Hr = 2176, + PPU_PPU_STATICS_PPU_WB_DIS_FLAG_VLD_CNT_Lr = 2177, + PPU_PPU_STATICS_PBU_PPU_REORDER_HALT_SEND_TYPE_VLD_CNT_Hr = 2178, + PPU_PPU_STATICS_PBU_PPU_REORDER_HALT_SEND_TYPE_VLD_CNT_Lr = 2179, + PPU_PPU_STATICS_PBU_PPU_REORDER_MF_TYPE_VLD_CNT_Hr = 2180, + PPU_PPU_STATICS_PBU_PPU_REORDER_MF_TYPE_VLD_CNT_Lr = 2181, + PPU_PPU_STATICS_PBU_PPU_REORDER_HALT_CONTINUE_END_VLD_CNT_Hr = 2182, + PPU_PPU_STATICS_PBU_PPU_REORDER_HALT_CONTINUE_END_VLD_CNT_Lr = 2183, + PPU_PPU_CAR_GREEN_PKT_VLD_CNT_Hr = 2184, + PPU_PPU_CAR_GREEN_PKT_VLD_CNT_Lr = 2185, + PPU_PPU_CAR_YELLOW_PKT_VLD_CNT_Hr = 2186, + PPU_PPU_CAR_YELLOW_PKT_VLD_CNT_Lr = 2187, + PPU_PPU_CAR_RED_PKT_VLD_CNT_Hr = 2188, + PPU_PPU_CAR_RED_PKT_VLD_CNT_Lr = 2189, + PPU_PPU_CAR_DROP_PKT_VLD_CNT_Hr = 2190, + PPU_PPU_CAR_DROP_PKT_VLD_CNT_Lr = 2191, + PPU_PPU_PPU_PKTRX_MC_PTR_VLD_CNT_Hr = 2192, + PPU_PPU_PPU_PKTRX_MC_PTR_VLD_CNT_Lr = 2193, + PPU_PPU_ISU_PPU_LOOPBACK_FC_CNT_Hr = 2194, + PPU_PPU_ISU_PPU_LOOPBACK_FC_CNT_Lr = 2195, + PPU_PPU_PPU_CULSTER_PBU_MCODE_PF_REQ_PROG_FULL_ASSERT_CFGr = 2196, + PPU_PPU_PPU_CULSTER_PBU_MCODE_PF_REQ_PROG_FULL_NEGATE_CFGr = 2197, + PPU_PPU_PPU_CULSTER_PBU_MCODE_PF_REQ_PROG_EMPTY_ASSERT_CFGr = 2198, + PPU_PPU_PPU_CULSTER_PBU_MCODE_PF_REQ_PROG_EMPTY_NEGATE_CFGr = 2199, + PPU_PPU_PPU_PBU_MCODE_PF_RSP_PROG_FULL_ASSERT_CFGr = 2200, + PPU_PPU_PPU_PBU_MCODE_PF_RSP_PROG_FULL_NEGATE_CFGr = 2201, + PPU_PPU_PPU_PBU_MCODE_PF_RSP_PROG_EMPTY_ASSERT_CFGr = 2202, + PPU_PPU_PPU_PBU_MCODE_PF_RSP_PROG_EMPTY_NEGATE_CFGr = 2203, + PPU_PPU_MCCNT_FIFO_PROG_FULL_ASSERT_CFGr = 2204, + PPU_PPU_MCCNT_FIFO_PROG_FULL_NEGATE_CFGr = 2205, + PPU_PPU_MCCNT_FIFO_PROG_EMPTY_ASSERT_CFGr = 2206, + PPU_PPU_MCCNT_FIFO_PROG_EMPTY_NEGATE_CFGr = 2207, + PPU_PPU_UC_MF_FIFO_PROG_FULL_ASSERT_CFGr = 2208, + PPU_PPU_UC_MF_FIFO_PROG_FULL_NEGATE_CFGr = 2209, + PPU_PPU_UC_MF_FIFO_PROG_EMPTY_ASSERT_CFGr = 2210, + PPU_PPU_UC_MF_FIFO_PROG_EMPTY_NEGATE_CFGr = 2211, + PPU_PPU_MC_MF_FIFO_PROG_FULL_ASSERT_CFGr = 2212, + PPU_PPU_MC_MF_FIFO_PROG_FULL_NEGATE_CFGr = 2213, + PPU_PPU_MC_MF_FIFO_PROG_EMPTY_ASSERT_CFGr = 2214, + PPU_PPU_MC_MF_FIFO_PROG_EMPTY_NEGATE_CFGr = 2215, + PPU_PPU_ISU_MF_FIFO_PROG_FULL_ASSERT_CFGr = 2216, + PPU_PPU_ISU_MF_FIFO_PROG_FULL_NEGATE_CFGr = 2217, + PPU_PPU_ISU_MF_FIFO_PROG_EMPTY_ASSERT_CFGr = 2218, + PPU_PPU_ISU_MF_FIFO_PROG_EMPTY_NEGATE_CFGr = 2219, + PPU_PPU_ISU_FWFT_MF_FIFO_PROG_EMPTY_ASSERT_CFGr = 2220, + PPU_PPU_ISU_FWFT_MF_FIFO_PROG_EMPTY_NEGATE_CFGr = 2221, + PPU_PPU_ISU_MC_PARA_MF_FIFO_PROG_FULL_ASSERT_CFGr = 2222, + PPU_PPU_ISU_MC_PARA_MF_FIFO_PROG_FULL_NEGATE_CFGr = 2223, + PPU_PPU_ISU_MC_PARA_MF_FIFO_PROG_EMPTY_ASSERT_CFGr = 2224, + PPU_PPU_ISU_MC_PARA_MF_FIFO_PROG_EMPTY_NEGATE_CFGr = 2225, + PPU_PPU_GROUP_ID_FIFO_PROG_FULL_ASSERT_CFGr = 2226, + PPU_PPU_GROUP_ID_FIFO_PROG_FULL_NEGATE_CFGr = 2227, + PPU_PPU_GROUP_ID_FIFO_PROG_EMPTY_ASSERT_CFGr = 2228, + PPU_PPU_GROUP_ID_FIFO_PROG_EMPTY_NEGATE_CFGr = 2229, + PPU_PPU_SA_PARA_FIFO_PROG_FULL_ASSERT_CFGr = 2230, + PPU_PPU_SA_PARA_FIFO_PROG_FULL_NEGATE_CFGr = 2231, + PPU_PPU_SA_PARA_FIFO_PROG_EMPTY_ASSERT_CFGr = 2232, + PPU_PPU_SA_PARA_FIFO_PROG_EMPTY_NEGATE_CFGr = 2233, + PPU_PPU_SE_MC_RSP_FIFO_PROG_FULL_ASSERT_CFGr = 2234, + PPU_PPU_SE_MC_RSP_FIFO_PROG_FULL_NEGATE_CFGr = 2235, + PPU_PPU_SE_MC_RSP_FIFO_PROG_EMPTY_ASSERT_CFGr = 2236, + PPU_PPU_SE_MC_RSP_FIFO_PROG_EMPTY_NEGATE_CFGr = 2237, + PPU_PPU_DUP_PARA_FIFO_PROG_FULL_ASSERT_CFGr = 2238, + PPU_PPU_DUP_PARA_FIFO_PROG_FULL_NEGATE_CFGr = 2239, + PPU_PPU_DUP_PARA_FIFO_PROG_EMPTY_ASSERT_CFGr = 2240, + PPU_PPU_DUP_PARA_FIFO_PROG_EMPTY_NEGATE_CFGr = 2241, + PPU_PPU_PF_RSP_FIFO_PROG_FULL_ASSERT_CFGr = 2242, + PPU_PPU_PF_RSP_FIFO_PROG_FULL_NEGATE_CFGr = 2243, + PPU_PPU_PF_RSP_FIFO_PROG_EMPTY_ASSERT_CFGr = 2244, + PPU_PPU_PF_RSP_FIFO_PROG_EMPTY_NEGATE_CFGr = 2245, + PPU_PPU_DUP_FREEPTR_FIFO_PROG_FULL_ASSERT_CFGr = 2246, + PPU_PPU_DUP_FREEPTR_FIFO_PROG_FULL_NEGATE_CFGr = 2247, + PPU_PPU_DUP_FREEPTR_FIFO_PROG_EMPTY_ASSERT_CFGr = 2248, + PPU_PPU_DUP_FREEPTR_FIFO_PROG_EMPTY_NEGATE_CFGr = 2249, + PPU_PPU_PF_REQ_FIFO_PROG_FULL_ASSERT_CFGr = 2250, + PPU_PPU_PF_REQ_FIFO_PROG_FULL_NEGATE_CFGr = 2251, + PPU_PPU_PF_REQ_FIFO_PROG_EMPTY_ASSERT_CFGr = 2252, + PPU_PPU_PF_REQ_FIFO_PROG_EMPTY_NEGATE_CFGr = 2253, + PPU_PPU_CAR_FLAG_FIFO_PROG_FULL_ASSERT_CFGr = 2254, + PPU_PPU_CAR_FLAG_FIFO_PROG_FULL_NEGATE_CFGr = 2255, + PPU_PPU_CAR_FLAG_FIFO_PROG_EMPTY_ASSERT_CFGr = 2256, + PPU_PPU_CAR_FLAG_FIFO_PROG_EMPTY_NEGATE_CFGr = 2257, + PPU_PPU_PPU_CLUSTER_MF_OUT_AFIFO_PROG_FULL_ASSERT_CFGr = 2258, + PPU_PPU_PPU_CLUSTER_MF_OUT_AFIFO_PROG_FULL_NEGATE_CFGr = 2259, + PPU_PPU_PPU_CLUSTER_MF_OUT_AFIFO_PROG_EMPTY_ASSERT_CFGr = 2260, + PPU_PPU_PPU_CLUSTER_MF_OUT_AFIFO_PROG_EMPTY_NEGATE_CFGr = 2261, + PPU_PPU_PPU_COP_KEY_FIFO_PROG_FULL_ASSERT_CFGr = 2262, + PPU_PPU_PPU_COP_KEY_FIFO_PROG_FULL_NEGATE_CFGr = 2263, + PPU_PPU_PPU_COP_KEY_FIFO_PROG_EMPTY_ASSERT_CFGr = 2264, + PPU_PPU_PPU_COP_KEY_FIFO_PROG_EMPTY_NEGATE_CFGr = 2265, + PPU_PPU_PPU_COP_RANDOM_MOD_PARA_FIFO_PROG_FULL_ASSERT_CFGr = 2266, + PPU_PPU_PPU_COP_RANDOM_MOD_PARA_FIFO_PROG_FULL_NEGATE_CFGr = 2267, + PPU_PPU_PPU_COP_RANDOM_MOD_PARA_FIFO_PROG_EMPTY_ASSERT_CFGr = 2268, + PPU_PPU_PPU_COP_RANDOM_MOD_PARA_FIFO_PROG_EMPTY_NEGATE_CFGr = 2269, + PPU_PPU_PPU_COP_RANDOM_MOD_RESULT_FIFO_PROG_FULL_ASSERT_CFGr = 2270, + PPU_PPU_PPU_COP_RANDOM_MOD_RESULT_FIFO_PROG_FULL_NEGATE_CFGr = 2271, + PPU_PPU_PPU_COP_RANDOM_MOD_RESULT_FIFO_PROG_EMPTY_ASSERT_CFGr = 2272, + PPU_PPU_PPU_COP_RANDOM_MOD_RESULT_FIFO_PROG_EMPTY_NEGATE_CFGr = 2273, + PPU_PPU_PPU_COP_CHECKSUM_RESULT_FIFO_PROG_FULL_ASSERT_CFGr = 2274, + PPU_PPU_PPU_COP_CHECKSUM_RESULT_FIFO_PROG_FULL_NEGATE_CFGr = 2275, + PPU_PPU_PPU_COP_CHECKSUM_RESULT_FIFO_PROG_EMPTY_ASSERT_CFGr = 2276, + PPU_PPU_PPU_COP_CHECKSUM_RESULT_FIFO_PROG_EMPTY_NEGATE_CFGr = 2277, + PPU_PPU_PPU_COP_CRC_FIRST_PARA_FIFO_PROG_FULL_ASSERT_CFGr = 2278, + PPU_PPU_PPU_COP_CRC_FIRST_PARA_FIFO_PROG_FULL_NEGATE_CFGr = 2279, + PPU_PPU_PPU_COP_CRC_FIRST_PARA_FIFO_PROG_EMPTY_ASSERT_CFGr = 2280, + PPU_PPU_PPU_COP_CRC_FIRST_PARA_FIFO_PROG_EMPTY_NEGATE_CFGr = 2281, + PPU_PPU_PPU_COP_CRC_BYPASS_DELAY_PROG_FULL_ASSERT_CFGr = 2282, + PPU_PPU_PPU_COP_CRC_BYPASS_DELAY_PROG_FULL_NEGATE_CFGr = 2283, + PPU_PPU_PPU_COP_CRC_BYPASS_DELAY_PROG_EMPTY_ASSERT_CFGr = 2284, + PPU_PPU_PPU_COP_CRC_BYPASS_DELAY_PROG_EMPTY_NEGATE_CFGr = 2285, + PPU_PPU_PPU_COP_CRC_SECOND_PARA_FIFO_PROG_FULL_ASSERT_CFGr = 2286, + PPU_PPU_PPU_COP_CRC_SECOND_PARA_FIFO_PROG_FULL_NEGATE_CFGr = 2287, + PPU_PPU_PPU_COP_CRC_SECOND_PARA_FIFO_PROG_EMPTY_ASSERT_CFGr = 2288, + PPU_PPU_PPU_COP_CRC_SECOND_PARA_FIFO_PROG_EMPTY_NEGATE_CFGr = 2289, + PPU_PPU_PPU_COP_CRC_RESULT_FWFT_FIFO_PROG_FULL_ASSERT_CFGr = 2290, + PPU_PPU_PPU_COP_CRC_RESULT_FWFT_FIFO_PROG_FULL_NEGATE_CFGr = 2291, + PPU_PPU_PPU_COP_CRC_RESULT_FWFT_FIFO_PROG_EMPTY_ASSERT_CFGr = 2292, + PPU_PPU_PPU_COP_CRC_RESULT_FWFT_FIFO_PROG_EMPTY_NEGATE_CFGr = 2293, + PPU_PPU_PPU_COP_MULTIPLY_PARA_FIFO_PROG_FULL_ASSERT_CFGr = 2294, + PPU_PPU_PPU_COP_MULTIPLY_PARA_FIFO_PROG_FULL_NEGATE_CFGr = 2295, + PPU_PPU_PPU_COP_MULTIPLY_PARA_FIFO_PROG_EMPTY_ASSERT_CFGr = 2296, + PPU_PPU_PPU_COP_MULTIPLY_PARA_FIFO_PROG_EMPTY_NEGATE_CFGr = 2297, + PPU_PPU_PPU_COP_MULTIPLY_PARA_RESULT_FIFO_PROG_FULL_ASSERT_CFGr = 2298, + PPU_PPU_PPU_COP_MULTIPLY_PARA_RESULT_FIFO_PROG_FULL_NEGATE_CFGr = 2299, + PPU_PPU_PPU_COP_MULTIPLY_PARA_RESULT_FIFO_PROG_EMPTY_ASSERT_CFGr = 2300, + PPU_PPU_PPU_COP_MULTIPLY_PARA_RESULT_FIFO_PROG_EMPTY_NEGATE_CFGr = 2301, + PPU_PPU_FREE_GLOBAL_NUM_FWFT_FIFO_PROG_FULL_ASSERT_CFGr = 2302, + PPU_PPU_FREE_GLOBAL_NUM_FWFT_FIFO_PROG_FULL_NEGATE_CFGr = 2303, + PPU_PPU_FREE_GLOBAL_NUM_FWFT_FIFO_PROG_EMPTY_ASSERT_CFGr = 2304, + PPU_PPU_FREE_GLOBAL_NUM_FWFT_FIFO_PROG_EMPTY_NEGATE_CFGr = 2305, + PPU_PPU_PPU_PKTRX_MC_PTR_FIFO_PROG_FULL_ASSERT_CFGr = 2306, + PPU_PPU_PPU_PKTRX_MC_PTR_FIFO_PROG_FULL_NEGATE_CFGr = 2307, + PPU_PPU_PPU_PKTRX_MC_PTR_FIFO_PROG_EMPTY_ASSERT_CFGr = 2308, + PPU_PPU_PPU_PKTRX_MC_PTR_FIFO_PROG_EMPTY_NEGATE_CFGr = 2309, + PPU_PPU_PKT_DATA0r = 2310, + PPU_PPU_PKT_DATA1r = 2311, + PPU_PPU_PKT_DATA2r = 2312, + PPU_PPU_PKT_DATA3r = 2313, + PPU_PPU_PKT_DATA4r = 2314, + PPU_PPU_PKT_DATA5r = 2315, + PPU_PPU_PKT_DATA6r = 2316, + PPU_PPU_PKT_DATA7r = 2317, + PPU_PPU_PKT_DATA8r = 2318, + PPU_PPU_PKT_DATA9r = 2319, + PPU_PPU_PKT_DATA10r = 2320, + PPU_PPU_PKT_DATA11r = 2321, + PPU_PPU_PKT_DATA12r = 2322, + PPU_PPU_PKT_DATA13r = 2323, + PPU_PPU_PKT_DATA14r = 2324, + PPU_PPU_PKT_DATA15r = 2325, + PPU_PPU_PKT_DATA16r = 2326, + PPU_PPU_PKT_DATA17r = 2327, + PPU_PPU_PKT_DATA18r = 2328, + PPU_PPU_PKT_DATA19r = 2329, + PPU_PPU_PKT_DATA20r = 2330, + PPU_PPU_PKT_DATA21r = 2331, + PPU_PPU_PKT_DATA22r = 2332, + PPU_PPU_PKT_DATA23r = 2333, + PPU_PPU_PKT_DATA24r = 2334, + PPU_PPU_PKT_DATA25r = 2335, + PPU_PPU_PKT_DATA26r = 2336, + PPU_PPU_PKT_DATA27r = 2337, + PPU_PPU_PKT_DATA28r = 2338, + PPU_PPU_PKT_DATA29r = 2339, + PPU_PPU_PKT_DATA30r = 2340, + PPU_PPU_PKT_DATA31r = 2341, + PPU_PPU_PKT_DATA32r = 2342, + PPU_PPU_PKT_DATA33r = 2343, + PPU_PPU_PKT_DATA34r = 2344, + PPU_PPU_PKT_DATA35r = 2345, + PPU_PPU_PKT_DATA36r = 2346, + PPU_PPU_PKT_DATA37r = 2347, + PPU_PPU_PKT_DATA38r = 2348, + PPU_PPU_PKT_DATA39r = 2349, + PPU_PPU_PKT_DATA40r = 2350, + PPU_PPU_PKT_DATA41r = 2351, + PPU_PPU_PKT_DATA42r = 2352, + PPU_PPU_PKT_DATA43r = 2353, + PPU_PPU_PKT_DATA44r = 2354, + PPU_PPU_PKT_DATA45r = 2355, + PPU_PPU_PKT_DATA46r = 2356, + PPU_PPU_PKT_DATA47r = 2357, + PPU_PPU_PKT_DATA48r = 2358, + PPU_PPU_PKT_DATA49r = 2359, + PPU_PPU_PKT_DATA50r = 2360, + PPU_PPU_PKT_DATA51r = 2361, + PPU_PPU_PKT_DATA52r = 2362, + PPU_PPU_PKT_DATA53r = 2363, + PPU_PPU_PKT_DATA54r = 2364, + PPU_PPU_PKT_DATA55r = 2365, + PPU_PPU_PKT_DATA56r = 2366, + PPU_PPU_PKT_DATA57r = 2367, + PPU_PPU_PKT_DATA58r = 2368, + PPU_PPU_PKT_DATA59r = 2369, + PPU_PPU_PKT_DATA60r = 2370, + PPU_PPU_PKT_DATA61r = 2371, + PPU_PPU_PKT_DATA62r = 2372, + PPU_PPU_PKT_DATA63r = 2373, + PPU_PPU_PKT_DATA64r = 2374, + PPU_PPU_PKT_DATA65r = 2375, + PPU_PPU_PKT_DATA66r = 2376, + PPU_PPU_PKT_DATA67r = 2377, + PPU_PPU_PKT_DATA68r = 2378, + PPU_PPU_PKT_DATA69r = 2379, + PPU_PPU_PKT_DATA70r = 2380, + PPU_PPU_PKT_DATA71r = 2381, + PPU_PPU_PKT_DATA72r = 2382, + PPU_PPU_PKT_DATA73r = 2383, + PPU_PPU_PKT_DATA74r = 2384, + PPU_PPU_PKT_DATA75r = 2385, + PPU_PPU_PKT_DATA76r = 2386, + PPU_PPU_PKT_DATA77r = 2387, + PPU_PPU_PKT_DATA78r = 2388, + PPU_PPU_PKT_DATA79r = 2389, + PPU_PPU_PKT_DATA80r = 2390, + PPU_PPU_PKT_DATA81r = 2391, + PPU_PPU_PKT_DATA82r = 2392, + PPU_PPU_PKT_DATA83r = 2393, + PPU_PPU_PKT_DATA84r = 2394, + PPU_PPU_PKT_DATA85r = 2395, + PPU_PPU_PKT_DATA86r = 2396, + PPU_PPU_PKT_DATA87r = 2397, + PPU_PPU_PKT_DATA88r = 2398, + PPU_PPU_PKT_DATA89r = 2399, + PPU_PPU_PKT_DATA90r = 2400, + PPU_PPU_PKT_DATA91r = 2401, + PPU_PPU_PKT_DATA92r = 2402, + PPU_PPU_PKT_DATA93r = 2403, + PPU_PPU_PKT_DATA94r = 2404, + PPU_PPU_PKT_DATA95r = 2405, + PPU_PPU_PKT_DATA96r = 2406, + PPU_PPU_PKT_DATA97r = 2407, + PPU_PPU_PKT_DATA98r = 2408, + PPU_PPU_PKT_DATA99r = 2409, + PPU_PPU_PKT_DATA100r = 2410, + PPU_PPU_PKT_DATA101r = 2411, + PPU_PPU_PKT_DATA102r = 2412, + PPU_PPU_PKT_DATA103r = 2413, + PPU_PPU_PKT_DATA104r = 2414, + PPU_PPU_PKT_DATA105r = 2415, + PPU_PPU_PKT_DATA106r = 2416, + PPU_PPU_PKT_DATA107r = 2417, + PPU_PPU_PKT_DATA108r = 2418, + PPU_PPU_PKT_DATA109r = 2419, + PPU_PPU_PKT_DATA110r = 2420, + PPU_PPU_PKT_DATA111r = 2421, + PPU_PPU_PKT_DATA112r = 2422, + PPU_PPU_PKT_DATA113r = 2423, + PPU_PPU_PKT_DATA114r = 2424, + PPU_PPU_PKT_DATA115r = 2425, + PPU_PPU_PKT_DATA116r = 2426, + PPU_PPU_PKT_DATA117r = 2427, + PPU_PPU_PKT_DATA118r = 2428, + PPU_PPU_PKT_DATA119r = 2429, + PPU_PPU_PKT_DATA120r = 2430, + PPU_PPU_PKT_DATA121r = 2431, + PPU_PPU_PKT_DATA122r = 2432, + PPU_PPU_PKT_DATA123r = 2433, + PPU_PPU_PKT_DATA124r = 2434, + PPU_PPU_PKT_DATA125r = 2435, + PPU_PPU_PKT_DATA126r = 2436, + PPU_PPU_PKT_DATA127r = 2437, + PPU_PPU_SPR0r = 2438, + PPU_PPU_SPR1r = 2439, + PPU_PPU_SPR2r = 2440, + PPU_PPU_SPR3r = 2441, + PPU_PPU_SPR4r = 2442, + PPU_PPU_SPR5r = 2443, + PPU_PPU_SPR6r = 2444, + PPU_PPU_SPR7r = 2445, + PPU_PPU_SPR8r = 2446, + PPU_PPU_SPR9r = 2447, + PPU_PPU_SPR10r = 2448, + PPU_PPU_SPR11r = 2449, + PPU_PPU_SPR12r = 2450, + PPU_PPU_SPR13r = 2451, + PPU_PPU_SPR14r = 2452, + PPU_PPU_SPR15r = 2453, + PPU_PPU_SPR16r = 2454, + PPU_PPU_SPR17r = 2455, + PPU_PPU_SPR18r = 2456, + PPU_PPU_SPR19r = 2457, + PPU_PPU_SPR20r = 2458, + PPU_PPU_SPR21r = 2459, + PPU_PPU_SPR22r = 2460, + PPU_PPU_SPR23r = 2461, + PPU_PPU_SPR24r = 2462, + PPU_PPU_SPR25r = 2463, + PPU_PPU_SPR26r = 2464, + PPU_PPU_SPR27r = 2465, + PPU_PPU_SPR28r = 2466, + PPU_PPU_SPR29r = 2467, + PPU_PPU_SPR30r = 2468, + PPU_PPU_SPR31r = 2469, + PPU_PPU_RSP0r = 2470, + PPU_PPU_RSP1r = 2471, + PPU_PPU_RSP2r = 2472, + PPU_PPU_RSP3r = 2473, + PPU_PPU_RSP4r = 2474, + PPU_PPU_RSP5r = 2475, + PPU_PPU_RSP6r = 2476, + PPU_PPU_RSP7r = 2477, + PPU_PPU_RSP8r = 2478, + PPU_PPU_RSP9r = 2479, + PPU_PPU_RSP10r = 2480, + PPU_PPU_RSP11r = 2481, + PPU_PPU_RSP12r = 2482, + PPU_PPU_RSP13r = 2483, + PPU_PPU_RSP14r = 2484, + PPU_PPU_RSP15r = 2485, + PPU_PPU_RSP16r = 2486, + PPU_PPU_RSP17r = 2487, + PPU_PPU_RSP18r = 2488, + PPU_PPU_RSP19r = 2489, + PPU_PPU_RSP20r = 2490, + PPU_PPU_RSP21r = 2491, + PPU_PPU_RSP22r = 2492, + PPU_PPU_RSP23r = 2493, + PPU_PPU_RSP24r = 2494, + PPU_PPU_RSP25r = 2495, + PPU_PPU_RSP26r = 2496, + PPU_PPU_RSP27r = 2497, + PPU_PPU_RSP28r = 2498, + PPU_PPU_RSP29r = 2499, + PPU_PPU_RSP30r = 2500, + PPU_PPU_RSP31r = 2501, + PPU_PPU_KEY0r = 2502, + PPU_PPU_KEY1r = 2503, + PPU_PPU_KEY2r = 2504, + PPU_PPU_KEY3r = 2505, + PPU_PPU_KEY4r = 2506, + PPU_PPU_KEY5r = 2507, + PPU_PPU_KEY6r = 2508, + PPU_PPU_KEY7r = 2509, + PPU_PPU_KEY8r = 2510, + PPU_PPU_KEY9r = 2511, + PPU_PPU_KEY10r = 2512, + PPU_PPU_KEY11r = 2513, + PPU_PPU_KEY12r = 2514, + PPU_PPU_KEY13r = 2515, + PPU_PPU_KEY14r = 2516, + PPU_PPU_KEY15r = 2517, + PPU_PPU_KEY16r = 2518, + PPU_PPU_KEY17r = 2519, + PPU_PPU_KEY18r = 2520, + PPU_PPU_KEY19r = 2521, + PPU_PPU_FLAGr = 2522, + PPU_CLUSTER_INT_1200M_FLAGr = 2523, + PPU_CLUSTER_BP_INSTR_Lr = 2524, + PPU_CLUSTER_BP_INSTR_Hr = 2525, + PPU_CLUSTER_BP_ADDRr = 2526, + PPU_CLUSTER_DRRr = 2527, + PPU_CLUSTER_DSRr = 2528, + PPU_CLUSTER_DBG_RTL_DATEr = 2529, + PPU_CLUSTER_ME_CONTINUEr = 2530, + PPU_CLUSTER_ME_STEPr = 2531, + PPU_CLUSTER_ME_REFRESHr = 2532, + PPU_CLUSTER_DRR_CLRr = 2533, + PPU_CLUSTER_ME_BUSY_THRESOLDr = 2534, + PPU_CLUSTER_INT_1200M_STAr = 2535, + PPU_CLUSTER_INT_1200M_ME_FIFO_MASK_Lr = 2536, + PPU_CLUSTER_INT_1200M_ME_FIFO_MASK_Hr = 2537, + PPU_CLUSTER_ME_FIFO_INTERRUPT_FLAG_Lr = 2538, + PPU_CLUSTER_ME_FIFO_INTERRUPT_FLAG_Hr = 2539, + PPU_CLUSTER_ME_FIFO_INTERRUPT_STA_Lr = 2540, + PPU_CLUSTER_ME_FIFO_INTERRUPT_STA_Hr = 2541, + PPU_CLUSTER_INT_1200M_CLUSTER_MEX_FIFO_MASK_Lr = 2542, + PPU_CLUSTER_INT_1200M_CLUSTER_MEX_FIFO_MASK_Hr = 2543, + PPU_CLUSTER_INT_1200M_CLUSTER_MEX_FIFO_FLAG_Lr = 2544, + PPU_CLUSTER_INT_1200M_CLUSTER_MEX_FIFO_FLAG_Hr = 2545, + PPU_CLUSTER_INT_1200M_CLUSTER_MEX_FIFO_STAT_Lr = 2546, + PPU_CLUSTER_INT_1200M_CLUSTER_MEX_FIFO_STAT_Hr = 2547, + PPU_CLUSTER_PPU_STATICS_WB_EXCEPTION_CFGr = 2548, + PPU_CLUSTER_THREAD_SWITCH_ENr = 2549, + PPU_CLUSTER_IS_ME_NOT_IDLEr = 2550, + PPU_CLUSTER_PPU_CLUSTER_MF_IN_AFIFO_PROG_EMPTY_ASSERT_CFGr = 2551, + PPU_CLUSTER_PPU_CLUSTER_MF_IN_AFIFO_PROG_EMPTY_NEGATE_CFGr = 2552, + PPU_CLUSTER_ESE_RSP_AFIFO_PROG_EMPTY_ASSERT_CFGr = 2553, + PPU_CLUSTER_ESE_RSP_AFIFO_PROG_EMPTY_NEGATE_CFGr = 2554, + PPU_CLUSTER_ISE_RSP_AFIFO_PROG_EMPTY_ASSERT_CFGr = 2555, + PPU_CLUSTER_ISE_RSP_AFIFO_PROG_EMPTY_NEGATE_CFGr = 2556, + PPU_CLUSTER_PPU_RSP_PTR_FWFT_FIFO0_PROG_FULL_ASSERT_CFGr = 2557, + PPU_CLUSTER_PPU_RSP_PTR_FWFT_FIFO0_PROG_FULL_NEGATE_CFGr = 2558, + PPU_CLUSTER_PPU_RSP_PTR_FWFT_FIFO0_PROG_EMPTY_ASSERT_CFGr = 2559, + PPU_CLUSTER_PPU_RSP_PTR_FWFT_FIFO0_PROG_EMPTY_NEGATE_CFGr = 2560, + PPU_CLUSTER_PPU_RSP_PTR_FWFT_FIFO1_PROG_FULL_ASSERT_CFGr = 2561, + PPU_CLUSTER_PPU_RSP_PTR_FWFT_FIFO1_PROG_FULL_NEGATE_CFGr = 2562, + PPU_CLUSTER_PPU_RSP_PTR_FWFT_FIFO1_PROG_EMPTY_ASSERT_CFGr = 2563, + PPU_CLUSTER_PPU_RSP_PTR_FWFT_FIFO1_PROG_EMPTY_NEGATE_CFGr = 2564, + PPU_CLUSTER_STA_RSP_AFIFO_PROG_EMPTY_ASSERT_CFGr = 2565, + PPU_CLUSTER_STA_RSP_AFIFO_PROG_EMPTY_NEGATE_CFGr = 2566, + PPU_CLUSTER_PPU_STA_RSP_FWFT_FIFO_PROG_FULL_ASSERT_CFGr = 2567, + PPU_CLUSTER_PPU_STA_RSP_FWFT_FIFO_PROG_FULL_NEGATE_CFGr = 2568, + PPU_CLUSTER_PPU_STA_RSP_FWFT_FIFO_PROG_EMPTY_ASSERT_CFGr = 2569, + PPU_CLUSTER_PPU_STA_RSP_FWFT_FIFO_PROG_EMPTY_NEGATE_CFGr = 2570, + PPU_CLUSTER_COP_RSP_FIFO_PROG_FULL_ASSERT_CFGr = 2571, + PPU_CLUSTER_COP_RSP_FIFO_PROG_FULL_NEGATE_CFGr = 2572, + PPU_CLUSTER_COP_RSP_FIFO_PROG_EMPTY_ASSERT_CFGr = 2573, + PPU_CLUSTER_COP_RSP_FIFO_PROG_EMPTY_NEGATE_CFGr = 2574, + PPU_CLUSTER_MCODE_PF_RSP_FIFO_PROG_FULL_ASSERT_CFGr = 2575, + PPU_CLUSTER_MCODE_PF_RSP_FIFO_PROG_FULL_NEGATE_CFGr = 2576, + PPU_CLUSTER_MCODE_PF_RSP_FIFO_PROG_EMPTY_ASSERT_CFGr = 2577, + PPU_CLUSTER_MCODE_PF_RSP_FIFO_PROG_EMPTY_NEGATE_CFGr = 2578, + PPU_CLUSTER_PPU_COP_RSP_FWFT_FIFO_PROG_FULL_ASSERT_CFGr = 2579, + PPU_CLUSTER_PPU_COP_RSP_FWFT_FIFO_PROG_FULL_NEGATE_CFGr = 2580, + PPU_CLUSTER_PPU_COP_RSP_FWFT_FIFO_PROG_EMPTY_ASSERT_CFGr = 2581, + PPU_CLUSTER_PPU_COP_RSP_FWFT_FIFO_PROG_EMPTY_NEGATE_CFGr = 2582, + PPU_CLUSTER_PPU_ISE_KEY_AFIFO_PROG_FULL_ASSERT_CFGr = 2583, + PPU_CLUSTER_PPU_ISE_KEY_AFIFO_PROG_FULL_NEGATE_CFGr = 2584, + PPU_CLUSTER_PPU_ESE_KEY_AFIFO_PROG_FULL_ASSERT_CFGr = 2585, + PPU_CLUSTER_PPU_ESE_KEY_AFIFO_PROG_FULL_NEGATE_CFGr = 2586, + PPU_CLUSTER_PPU_STA_KEY_AFIFO_PROG_FULL_ASSERT_CFGr = 2587, + PPU_CLUSTER_PPU_STA_KEY_AFIFO_PROG_FULL_NEGATE_CFGr = 2588, + PPU_CLUSTER_INT_600M_CLUSTER_MEX_FIFO_MASKr = 2589, + PPU_CLUSTER_CLUSTER_MEX_FIFO_600M_INTERRUPT_FLAGr = 2590, + PPU_CLUSTER_CLUSTER_MEX_FIFO_600M_INTERRUPT_STAr = 2591, + PPU_CLUSTER_MEX_CNT_CFGr = 2592, + PPU_CLUSTER_INT_600M_CLUSTER_MEX_RAM_ECC_ERROR_INTERRUPT_MASKr = 2593, + PPU_CLUSTER_CLUSTER_MEX_RAM_600M_ECC_ERROR_INTERRUPT_FLAGr = 2594, + PPU_CLUSTER_CLUSTER_MEX_RAM_600M_ECC_ERROR_INTERRUPT_STAr = 2595, + PPU_CLUSTER_PPU_CLUSTER_MF_IN_AFIFO_PROG_FULL_ASSERT_CFGr = 2596, + PPU_CLUSTER_PPU_CLUSTER_MF_IN_AFIFO_PROG_FULL_NEGATE_CFGr = 2597, + PPU_CLUSTER_ESE_RSP_AFIFO_PROG_FULL_ASSERT_CFGr = 2598, + PPU_CLUSTER_ESE_RSP_AFIFO_PROG_FULL_NEGATE_CFGr = 2599, + PPU_CLUSTER_ISE_RSP_AFIFO_PROG_FULL_ASSERT_CFGr = 2600, + PPU_CLUSTER_ISE_RSP_AFIFO_PROG_FULL_NEGATE_CFGr = 2601, + PPU_CLUSTER_STA_RSP_AFIFO_PROG_FULL_ASSERT_CFGr = 2602, + PPU_CLUSTER_STA_RSP_AFIFO_PROG_FULL_NEGATE_CFGr = 2603, + PPU_CLUSTER_PPU_ISE_KEY_AFIFO_PROG_EMPTY_ASSERT_CFGr = 2604, + PPU_CLUSTER_PPU_ISE_KEY_AFIFO_PROG_EMPTY_NEGATE_CFGr = 2605, + PPU_CLUSTER_PPU_ESE_KEY_AFIFO_PROG_EMPTY_ASSERT_CFGr = 2606, + PPU_CLUSTER_PPU_ESE_KEY_AFIFO_PROG_EMPTY_NEGATE_CFGr = 2607, + PPU_CLUSTER_PPU_STA_KEY_AFIFO_PROG_EMPTY_ASSERT_CFGr = 2608, + PPU_CLUSTER_PPU_STA_KEY_AFIFO_PROG_EMPTY_NEGATE_CFGr = 2609, + PPU_CLUSTER_PPU_CLUSTER_MF_VLD_CNT_Hr = 2610, + PPU_CLUSTER_PPU_CLUSTER_MF_VLD_CNT_Lr = 2611, + PPU_CLUSTER_CLUSTER_ISE_KEY_OUT_VLD_CNTr = 2612, + PPU_CLUSTER_ISE_CLUSTER_RSP_IN_VLD_CNTr = 2613, + PPU_CLUSTER_CLUSTER_ESE_KEY_OUT_VLD_CNTr = 2614, + PPU_CLUSTER_ESE_CLUSTER_RSP_IN_VLD_CNTr = 2615, + PPU_CLUSTER_CLUSTER_STAT_CMD_VLD_CNTr = 2616, + PPU_CLUSTER_STAT_CLUSTER_RSP_VLD_CNTr = 2617, + PPU_CLUSTER_MEX_DEBUG_KEY_VLD_CNTr = 2618, + PPU_CLUSTER_ISE_CLUSTER_KEY_FC_CNTr = 2619, + PPU_CLUSTER_ESE_CLUSTER_KEY_FC_CNTr = 2620, + PPU_CLUSTER_CLUSTER_ISE_RSP_FC_CNTr = 2621, + PPU_CLUSTER_CLUSTER_ESE_RSP_FC_CNTr = 2622, + PPU_CLUSTER_STAT_CLUSTER_CMD_FC_CNTr = 2623, + PPU_CLUSTER_CLUSTER_STAT_RSP_FC_CNTr = 2624, + PPU_CLUSTER_CLUSTER_PPU_MF_VLD_CNT_Lr = 2625, + PPU_CLUSTER_CLUSTER_PPU_MF_VLD_CNT_Hr = 2626, + PPU_CLUSTER_CLUSTER_COP_KEY_VLD_CNT_Lr = 2627, + PPU_CLUSTER_CLUSTER_COP_KEY_VLD_CNT_Hr = 2628, + PPU_CLUSTER_COP_CLUSTER_RSP_VLD_CNT_Lr = 2629, + PPU_CLUSTER_COP_CLUSTER_RSP_VLD_CNT_Hr = 2630, + PPU_CLUSTER_MEX_ME_PKT_IN_SOP_CNT_Lr = 2631, + PPU_CLUSTER_MEX_ME_PKT_IN_SOP_CNT_Hr = 2632, + PPU_CLUSTER_MEX_ME_PKT_IN_EOP_CNT_Lr = 2633, + PPU_CLUSTER_MEX_ME_PKT_IN_EOP_CNT_Hr = 2634, + PPU_CLUSTER_MEX_ME_PKT_IN_VLD_CNT_Lr = 2635, + PPU_CLUSTER_MEX_ME_PKT_IN_VLD_CNT_Hr = 2636, + PPU_CLUSTER_ME_MEX_PKT_OUT_SOP_CNT_Lr = 2637, + PPU_CLUSTER_ME_MEX_PKT_OUT_SOP_CNT_Hr = 2638, + PPU_CLUSTER_ME_MEX_PKT_OUT_EOP_CNT_Lr = 2639, + PPU_CLUSTER_ME_MEX_PKT_OUT_EOP_CNT_Hr = 2640, + PPU_CLUSTER_ME_MEX_PKT_OUT_VLD_CNT_Lr = 2641, + PPU_CLUSTER_ME_MEX_PKT_OUT_VLD_CNT_Hr = 2642, + PPU_CLUSTER_ME_MEX_I_KEY_OUT_SOP_CNT_Lr = 2643, + PPU_CLUSTER_ME_MEX_I_KEY_OUT_SOP_CNT_Hr = 2644, + PPU_CLUSTER_ME_MEX_I_KEY_OUT_EOP_CNT_Lr = 2645, + PPU_CLUSTER_ME_MEX_I_KEY_OUT_EOP_CNT_Hr = 2646, + PPU_CLUSTER_ME_MEX_I_KEY_OUT_VLD_CNT_Lr = 2647, + PPU_CLUSTER_ME_MEX_I_KEY_OUT_VLD_CNT_Hr = 2648, + PPU_CLUSTER_ME_MEX_E_KEY_OUT_SOP_CNT_Lr = 2649, + PPU_CLUSTER_ME_MEX_E_KEY_OUT_SOP_CNT_Hr = 2650, + PPU_CLUSTER_ME_MEX_E_KEY_OUT_EOP_CNT_Lr = 2651, + PPU_CLUSTER_ME_MEX_E_KEY_OUT_EOP_CNT_Hr = 2652, + PPU_CLUSTER_ME_MEX_E_KEY_OUT_VLD_CNT_Lr = 2653, + PPU_CLUSTER_ME_MEX_E_KEY_OUT_VLD_CNT_Hr = 2654, + PPU_CLUSTER_ME_MEX_DEMUX_ISE_KEY_VLD_CNT_Lr = 2655, + PPU_CLUSTER_ME_MEX_DEMUX_ISE_KEY_VLD_CNT_Hr = 2656, + PPU_CLUSTER_ME_MEX_DEMUX_ESE_KEY_VLD_CNT_Lr = 2657, + PPU_CLUSTER_ME_MEX_DEMUX_ESE_KEY_VLD_CNT_Hr = 2658, + PPU_CLUSTER_ME_MEX_DEMUX_STA_KEY_VLD_CNT_Lr = 2659, + PPU_CLUSTER_ME_MEX_DEMUX_STA_KEY_VLD_CNT_Hr = 2660, + PPU_CLUSTER_ME_MEX_DEMUX_COP_KEY_VLD_CNT_Lr = 2661, + PPU_CLUSTER_ME_MEX_DEMUX_COP_KEY_VLD_CNT_Hr = 2662, + PPU_CLUSTER_MEX_ME_DEMUX_ISE_RSP_VLD_CNT_Lr = 2663, + PPU_CLUSTER_MEX_ME_DEMUX_ISE_RSP_VLD_CNT_Hr = 2664, + PPU_CLUSTER_MEX_ME_DEMUX_ESE_RSP_VLD_CNT_Lr = 2665, + PPU_CLUSTER_MEX_ME_DEMUX_ESE_RSP_VLD_CNT_Hr = 2666, + PPU_CLUSTER_MEX_ME_DEMUX_STA_RSP_VLD_CNT_Lr = 2667, + PPU_CLUSTER_MEX_ME_DEMUX_STA_RSP_VLD_CNT_Hr = 2668, + PPU_CLUSTER_MEX_ME_DEMUX_COP_RSP_VLD_CNT_Lr = 2669, + PPU_CLUSTER_MEX_ME_DEMUX_COP_RSP_VLD_CNT_Hr = 2670, + PPU_CLUSTER_ME_EXCEPTION_CODE0_CNT_Lr = 2671, + PPU_CLUSTER_ME_EXCEPTION_CODE0_CNT_Hr = 2672, + PPU_CLUSTER_ME_EXCEPTION_CODE1_CNT_Lr = 2673, + PPU_CLUSTER_ME_EXCEPTION_CODE1_CNT_Hr = 2674, + PPU_CLUSTER_ME_EXCEPTION_CODE2_CNT_Lr = 2675, + PPU_CLUSTER_ME_EXCEPTION_CODE2_CNT_Hr = 2676, + PPU_CLUSTER_ME_EXCEPTION_CODE3_CNT_Lr = 2677, + PPU_CLUSTER_ME_EXCEPTION_CODE3_CNT_Hr = 2678, + PPU_CLUSTER_ME_EXCEPTION_CODE4_CNT_Lr = 2679, + PPU_CLUSTER_ME_EXCEPTION_CODE4_CNT_Hr = 2680, + PPU_CLUSTER_ME_EXCEPTION_CODE5_CNT_Lr = 2681, + PPU_CLUSTER_ME_EXCEPTION_CODE5_CNT_Hr = 2682, + SE_CFG_PPU_SOFT_RSTr = 2683, + SE_CFG_EPT_FLAGr = 2684, + SE_CFG_DDR_KEY_LK0_3r = 2685, + SE_CFG_DDR_KEY_LK0_2r = 2686, + SE_CFG_DDR_KEY_LK0_1r = 2687, + SE_CFG_DDR_KEY_LK0_0r = 2688, + SE_CFG_DDR_KEY_LK1_3r = 2689, + SE_CFG_DDR_KEY_LK1_2r = 2690, + SE_CFG_DDR_KEY_LK1_1r = 2691, + SE_CFG_DDR_KEY_LK1_0r = 2692, + SE_CFG_HASH_KEY_LK0_18r = 2693, + SE_CFG_HASH_KEY_LK0_17r = 2694, + SE_CFG_HASH_KEY_LK0_16r = 2695, + SE_CFG_HASH_KEY_LK0_15r = 2696, + SE_CFG_HASH_KEY_LK0_14r = 2697, + SE_CFG_HASH_KEY_LK0_13r = 2698, + SE_CFG_HASH_KEY_LK0_12r = 2699, + SE_CFG_HASH_KEY_LK0_11r = 2700, + SE_CFG_HASH_KEY_LK0_10r = 2701, + SE_CFG_HASH_KEY_LK0_9r = 2702, + SE_CFG_HASH_KEY_LK0_8r = 2703, + SE_CFG_HASH_KEY_LK0_7r = 2704, + SE_CFG_HASH_KEY_LK0_6r = 2705, + SE_CFG_HASH_KEY_LK0_5r = 2706, + SE_CFG_HASH_KEY_LK0_4r = 2707, + SE_CFG_HASH_KEY_LK0_3r = 2708, + SE_CFG_HASH_KEY_LK0_2r = 2709, + SE_CFG_HASH_KEY_LK0_1r = 2710, + SE_CFG_HASH_KEY_LK0_0r = 2711, + SE_CFG_HASH_KEY_LK1_18r = 2712, + SE_CFG_HASH_KEY_LK1_17r = 2713, + SE_CFG_HASH_KEY_LK1_16r = 2714, + SE_CFG_HASH_KEY_LK1_15r = 2715, + SE_CFG_HASH_KEY_LK1_14r = 2716, + SE_CFG_HASH_KEY_LK1_13r = 2717, + SE_CFG_HASH_KEY_LK1_12r = 2718, + SE_CFG_HASH_KEY_LK1_11r = 2719, + SE_CFG_HASH_KEY_LK1_10r = 2720, + SE_CFG_HASH_KEY_LK1_9r = 2721, + SE_CFG_HASH_KEY_LK1_8r = 2722, + SE_CFG_HASH_KEY_LK1_7r = 2723, + SE_CFG_HASH_KEY_LK1_6r = 2724, + SE_CFG_HASH_KEY_LK1_5r = 2725, + SE_CFG_HASH_KEY_LK1_4r = 2726, + SE_CFG_HASH_KEY_LK1_3r = 2727, + SE_CFG_HASH_KEY_LK1_2r = 2728, + SE_CFG_HASH_KEY_LK1_1r = 2729, + SE_CFG_HASH_KEY_LK1_0r = 2730, + SE_CFG_HASH_KEY_LK2_18r = 2731, + SE_CFG_HASH_KEY_LK2_17r = 2732, + SE_CFG_HASH_KEY_LK2_16r = 2733, + SE_CFG_HASH_KEY_LK2_15r = 2734, + SE_CFG_HASH_KEY_LK2_14r = 2735, + SE_CFG_HASH_KEY_LK2_13r = 2736, + SE_CFG_HASH_KEY_LK2_12r = 2737, + SE_CFG_HASH_KEY_LK2_11r = 2738, + SE_CFG_HASH_KEY_LK2_10r = 2739, + SE_CFG_HASH_KEY_LK2_9r = 2740, + SE_CFG_HASH_KEY_LK2_8r = 2741, + SE_CFG_HASH_KEY_LK2_7r = 2742, + SE_CFG_HASH_KEY_LK2_6r = 2743, + SE_CFG_HASH_KEY_LK2_5r = 2744, + SE_CFG_HASH_KEY_LK2_4r = 2745, + SE_CFG_HASH_KEY_LK2_3r = 2746, + SE_CFG_HASH_KEY_LK2_2r = 2747, + SE_CFG_HASH_KEY_LK2_1r = 2748, + SE_CFG_HASH_KEY_LK2_0r = 2749, + SE_CFG_HASH_KEY_LK3_18r = 2750, + SE_CFG_HASH_KEY_LK3_17r = 2751, + SE_CFG_HASH_KEY_LK3_16r = 2752, + SE_CFG_HASH_KEY_LK3_15r = 2753, + SE_CFG_HASH_KEY_LK3_14r = 2754, + SE_CFG_HASH_KEY_LK3_13r = 2755, + SE_CFG_HASH_KEY_LK3_12r = 2756, + SE_CFG_HASH_KEY_LK3_11r = 2757, + SE_CFG_HASH_KEY_LK3_10r = 2758, + SE_CFG_HASH_KEY_LK3_9r = 2759, + SE_CFG_HASH_KEY_LK3_8r = 2760, + SE_CFG_HASH_KEY_LK3_7r = 2761, + SE_CFG_HASH_KEY_LK3_6r = 2762, + SE_CFG_HASH_KEY_LK3_5r = 2763, + SE_CFG_HASH_KEY_LK3_4r = 2764, + SE_CFG_HASH_KEY_LK3_3r = 2765, + SE_CFG_HASH_KEY_LK3_2r = 2766, + SE_CFG_HASH_KEY_LK3_1r = 2767, + SE_CFG_HASH_KEY_LK3_0r = 2768, + SE_CFG_LPM_KEY_LK0_6r = 2769, + SE_CFG_LPM_KEY_LK0_5r = 2770, + SE_CFG_LPM_KEY_LK0_4r = 2771, + SE_CFG_LPM_KEY_LK0_3r = 2772, + SE_CFG_LPM_KEY_LK0_2r = 2773, + SE_CFG_LPM_KEY_LK0_1r = 2774, + SE_CFG_LPM_KEY_LK0_0r = 2775, + SE_CFG_LPM_KEY_LK1_6r = 2776, + SE_CFG_LPM_KEY_LK1_5r = 2777, + SE_CFG_LPM_KEY_LK1_4r = 2778, + SE_CFG_LPM_KEY_LK1_3r = 2779, + SE_CFG_LPM_KEY_LK1_2r = 2780, + SE_CFG_LPM_KEY_LK1_1r = 2781, + SE_CFG_LPM_KEY_LK1_0r = 2782, + SE_CFG_LPM_KEY_LK2_6r = 2783, + SE_CFG_LPM_KEY_LK2_5r = 2784, + SE_CFG_LPM_KEY_LK2_4r = 2785, + SE_CFG_LPM_KEY_LK2_3r = 2786, + SE_CFG_LPM_KEY_LK2_2r = 2787, + SE_CFG_LPM_KEY_LK2_1r = 2788, + SE_CFG_LPM_KEY_LK2_0r = 2789, + SE_CFG_LPM_KEY_LK3_6r = 2790, + SE_CFG_LPM_KEY_LK3_5r = 2791, + SE_CFG_LPM_KEY_LK3_4r = 2792, + SE_CFG_LPM_KEY_LK3_3r = 2793, + SE_CFG_LPM_KEY_LK3_2r = 2794, + SE_CFG_LPM_KEY_LK3_1r = 2795, + SE_CFG_LPM_KEY_LK3_0r = 2796, + SE_CFG_ETCAM_KEY_LK0_22r = 2797, + SE_CFG_ETCAM_KEY_LK0_21r = 2798, + SE_CFG_ETCAM_KEY_LK0_20r = 2799, + SE_CFG_ETCAM_KEY_LK0_19r = 2800, + SE_CFG_ETCAM_KEY_LK0_18r = 2801, + SE_CFG_ETCAM_KEY_LK0_17r = 2802, + SE_CFG_ETCAM_KEY_LK0_16r = 2803, + SE_CFG_ETCAM_KEY_LK0_15r = 2804, + SE_CFG_ETCAM_KEY_LK0_14r = 2805, + SE_CFG_ETCAM_KEY_LK0_13r = 2806, + SE_CFG_ETCAM_KEY_LK0_12r = 2807, + SE_CFG_ETCAM_KEY_LK0_11r = 2808, + SE_CFG_ETCAM_KEY_LK0_10r = 2809, + SE_CFG_ETCAM_KEY_LK0_9r = 2810, + SE_CFG_ETCAM_KEY_LK0_8r = 2811, + SE_CFG_ETCAM_KEY_LK0_7r = 2812, + SE_CFG_ETCAM_KEY_LK0_6r = 2813, + SE_CFG_ETCAM_KEY_LK0_5r = 2814, + SE_CFG_ETCAM_KEY_LK0_4r = 2815, + SE_CFG_ETCAM_KEY_LK0_3r = 2816, + SE_CFG_ETCAM_KEY_LK0_2r = 2817, + SE_CFG_ETCAM_KEY_LK0_1r = 2818, + SE_CFG_ETCAM_KEY_LK0_0r = 2819, + SE_CFG_ETCAM_KEY_LK1_22r = 2820, + SE_CFG_ETCAM_KEY_LK1_21r = 2821, + SE_CFG_ETCAM_KEY_LK1_20r = 2822, + SE_CFG_ETCAM_KEY_LK1_19r = 2823, + SE_CFG_ETCAM_KEY_LK1_18r = 2824, + SE_CFG_ETCAM_KEY_LK1_17r = 2825, + SE_CFG_ETCAM_KEY_LK1_16r = 2826, + SE_CFG_ETCAM_KEY_LK1_15r = 2827, + SE_CFG_ETCAM_KEY_LK1_14r = 2828, + SE_CFG_ETCAM_KEY_LK1_13r = 2829, + SE_CFG_ETCAM_KEY_LK1_12r = 2830, + SE_CFG_ETCAM_KEY_LK1_11r = 2831, + SE_CFG_ETCAM_KEY_LK1_10r = 2832, + SE_CFG_ETCAM_KEY_LK1_9r = 2833, + SE_CFG_ETCAM_KEY_LK1_8r = 2834, + SE_CFG_ETCAM_KEY_LK1_7r = 2835, + SE_CFG_ETCAM_KEY_LK1_6r = 2836, + SE_CFG_ETCAM_KEY_LK1_5r = 2837, + SE_CFG_ETCAM_KEY_LK1_4r = 2838, + SE_CFG_ETCAM_KEY_LK1_3r = 2839, + SE_CFG_ETCAM_KEY_LK1_2r = 2840, + SE_CFG_ETCAM_KEY_LK1_1r = 2841, + SE_CFG_ETCAM_KEY_LK1_0r = 2842, + SE_CFG_ETCAM_KEY_LK2_22r = 2843, + SE_CFG_ETCAM_KEY_LK2_21r = 2844, + SE_CFG_ETCAM_KEY_LK2_20r = 2845, + SE_CFG_ETCAM_KEY_LK2_19r = 2846, + SE_CFG_ETCAM_KEY_LK2_18r = 2847, + SE_CFG_ETCAM_KEY_LK2_17r = 2848, + SE_CFG_ETCAM_KEY_LK2_16r = 2849, + SE_CFG_ETCAM_KEY_LK2_15r = 2850, + SE_CFG_ETCAM_KEY_LK2_14r = 2851, + SE_CFG_ETCAM_KEY_LK2_13r = 2852, + SE_CFG_ETCAM_KEY_LK2_12r = 2853, + SE_CFG_ETCAM_KEY_LK2_11r = 2854, + SE_CFG_ETCAM_KEY_LK2_10r = 2855, + SE_CFG_ETCAM_KEY_LK2_9r = 2856, + SE_CFG_ETCAM_KEY_LK2_8r = 2857, + SE_CFG_ETCAM_KEY_LK2_7r = 2858, + SE_CFG_ETCAM_KEY_LK2_6r = 2859, + SE_CFG_ETCAM_KEY_LK2_5r = 2860, + SE_CFG_ETCAM_KEY_LK2_4r = 2861, + SE_CFG_ETCAM_KEY_LK2_3r = 2862, + SE_CFG_ETCAM_KEY_LK2_2r = 2863, + SE_CFG_ETCAM_KEY_LK2_1r = 2864, + SE_CFG_ETCAM_KEY_LK2_0r = 2865, + SE_CFG_ETCAM_KEY_LK3_22r = 2866, + SE_CFG_ETCAM_KEY_LK3_21r = 2867, + SE_CFG_ETCAM_KEY_LK3_20r = 2868, + SE_CFG_ETCAM_KEY_LK3_19r = 2869, + SE_CFG_ETCAM_KEY_LK3_18r = 2870, + SE_CFG_ETCAM_KEY_LK3_17r = 2871, + SE_CFG_ETCAM_KEY_LK3_16r = 2872, + SE_CFG_ETCAM_KEY_LK3_15r = 2873, + SE_CFG_ETCAM_KEY_LK3_14r = 2874, + SE_CFG_ETCAM_KEY_LK3_13r = 2875, + SE_CFG_ETCAM_KEY_LK3_12r = 2876, + SE_CFG_ETCAM_KEY_LK3_11r = 2877, + SE_CFG_ETCAM_KEY_LK3_10r = 2878, + SE_CFG_ETCAM_KEY_LK3_9r = 2879, + SE_CFG_ETCAM_KEY_LK3_8r = 2880, + SE_CFG_ETCAM_KEY_LK3_7r = 2881, + SE_CFG_ETCAM_KEY_LK3_6r = 2882, + SE_CFG_ETCAM_KEY_LK3_5r = 2883, + SE_CFG_ETCAM_KEY_LK3_4r = 2884, + SE_CFG_ETCAM_KEY_LK3_3r = 2885, + SE_CFG_ETCAM_KEY_LK3_2r = 2886, + SE_CFG_ETCAM_KEY_LK3_1r = 2887, + SE_CFG_ETCAM_KEY_LK3_0r = 2888, + SE_CFG_PBU_KEY_LK0_3r = 2889, + SE_CFG_PBU_KEY_LK0_2r = 2890, + SE_CFG_PBU_KEY_LK0_1r = 2891, + SE_CFG_PBU_KEY_LK0_0r = 2892, + SE_CFG_PBU_KEY_LK1_3r = 2893, + SE_CFG_PBU_KEY_LK1_2r = 2894, + SE_CFG_PBU_KEY_LK1_1r = 2895, + SE_CFG_PBU_KEY_LK1_0r = 2896, + SE_CFG_PBU_KEY_LK2_3r = 2897, + SE_CFG_PBU_KEY_LK2_2r = 2898, + SE_CFG_PBU_KEY_LK2_1r = 2899, + SE_CFG_PBU_KEY_LK2_0r = 2900, + SE_CFG_PBU_KEY_LK3_3r = 2901, + SE_CFG_PBU_KEY_LK3_2r = 2902, + SE_CFG_PBU_KEY_LK3_1r = 2903, + SE_CFG_PBU_KEY_LK3_0r = 2904, + SE_ALG_SCHD_LEARN_FIFO_PFULL_ASTr = 2905, + SE_ALG_SCHD_LEARN_FIFO_PFULL_NEGr = 2906, + SE_ALG_SCHD_HASH0_FIFO_PFULL_ASTr = 2907, + SE_ALG_SCHD_HASH0_FIFO_PFULL_NEGr = 2908, + SE_ALG_SCHD_HASH1_FIFO_PFULL_ASTr = 2909, + SE_ALG_SCHD_HASH1_FIFO_PFULL_NEGr = 2910, + SE_ALG_SCHD_HASH2_FIFO_PFULL_ASTr = 2911, + SE_ALG_SCHD_HASH2_FIFO_PFULL_NEGr = 2912, + SE_ALG_SCHD_HASH3_FIFO_PFULL_ASTr = 2913, + SE_ALG_SCHD_HASH3_FIFO_PFULL_NEGr = 2914, + SE_ALG_SCHD_LPM_FIFO_PFULL_ASTr = 2915, + SE_ALG_SCHD_LPM_FIFO_PFULL_NEGr = 2916, + SE_ALG_HASH0_KEY_FIFO_PFULL_ASTr = 2917, + SE_ALG_HASH0_KEY_FIFO_PFULL_NEGr = 2918, + SE_ALG_HASH0_SREQ_FIFO_PFULL_ASTr = 2919, + SE_ALG_HASH0_SREQ_FIFO_PFULL_NEGr = 2920, + SE_ALG_HASH0_INT_RSP_FIFO_PFULL_ASTr = 2921, + SE_ALG_HASH0_INT_RSP_FIFO_PFULL_NEGr = 2922, + SE_ALG_HASH0_EXT_RSP_FIFO_PFULL_ASTr = 2923, + SE_ALG_HASH0_EXT_RSP_FIFO_PFULL_NEGr = 2924, + SE_ALG_HASH1_KEY_FIFO_PFULL_ASTr = 2925, + SE_ALG_HASH1_KEY_FIFO_PFULL_NEGr = 2926, + SE_ALG_HASH1_SREQ_FIFO_PFULL_ASTr = 2927, + SE_ALG_HASH1_SREQ_FIFO_PFULL_NEGr = 2928, + SE_ALG_HASH1_INT_RSP_FIFO_PFULL_ASTr = 2929, + SE_ALG_HASH1_INT_RSP_FIFO_PFULL_NEGr = 2930, + SE_ALG_HASH1_EXT_RSP_FIFO_PFULL_ASTr = 2931, + SE_ALG_HASH1_EXT_RSP_FIFO_PFULL_NEGr = 2932, + SE_ALG_HASH2_KEY_FIFO_PFULL_ASTr = 2933, + SE_ALG_HASH2_KEY_FIFO_PFULL_NEGr = 2934, + SE_ALG_HASH2_SREQ_FIFO_PFULL_ASTr = 2935, + SE_ALG_HASH2_SREQ_FIFO_PFULL_NEGr = 2936, + SE_ALG_HASH2_INT_RSP_FIFO_PFULL_ASTr = 2937, + SE_ALG_HASH2_INT_RSP_FIFO_PFULL_NEGr = 2938, + SE_ALG_HASH2_EXT_RSP_FIFO_PFULL_ASTr = 2939, + SE_ALG_HASH2_EXT_RSP_FIFO_PFULL_NEGr = 2940, + SE_ALG_HASH3_KEY_FIFO_PFULL_ASTr = 2941, + SE_ALG_HASH3_KEY_FIFO_PFULL_NEGr = 2942, + SE_ALG_HASH3_SREQ_FIFO_PFULL_ASTr = 2943, + SE_ALG_HASH3_SREQ_FIFO_PFULL_NEGr = 2944, + SE_ALG_HASH3_INT_RSP_FIFO_PFULL_ASTr = 2945, + SE_ALG_HASH3_INT_RSP_FIFO_PFULL_NEGr = 2946, + SE_ALG_HASH3_EXT_RSP_FIFO_PFULL_ASTr = 2947, + SE_ALG_HASH3_EXT_RSP_FIFO_PFULL_NEGr = 2948, + SE_ALG_LPM_AS_INFOr = 2949, + SE_ALG_LPM_EXT_RSP_FIFO_U0_PFULL_NEGr = 2950, + SE_ALG_LPM_EXT_RSP_FIFO_U2_PFULL_ASTr = 2951, + SE_ALG_LPM_EXT_RSP_FIFO_U2_PFULL_NEGr = 2952, + SE_ALG_LPM_EXT_RSP_FIFO_U3_PFULL_ASTr = 2953, + SE_ALG_LPM_EXT_RSP_FIFO_U3_PFULL_NEGr = 2954, + SE_ALG_LPM_EXT_RSP_FIFO_U4_PFULL_ASTr = 2955, + SE_ALG_LPM_EXT_RSP_FIFO_U4_PFULL_NEGr = 2956, + SE_ALG_LPM_AS_RSP_FIFO_U0_PFULL_ASTr = 2957, + SE_ALG_LPM_AS_RSP_FIFO_U0_PFULL_NEGr = 2958, + SE_ALG_LPM_AS_RSP_FIFO_U1_PFULL_ASTr = 2959, + SE_ALG_LPM_AS_RSP_FIFO_U1_PFULL_NEGr = 2960, + SE_ALG_LPM_V4_DDR3_BASE_ADDRr = 2961, + SE_ALG_LPM_V6_DDR3_BASE_ADDRr = 2962, + SE_ALG_DEBUG_CNT_MODEr = 2963, + SE_ALG_HASH_P0_KEY_VLD_CNTr = 2964, + SE_ALG_HASH_P1_KEY_VLD_CNTr = 2965, + SE_ALG_HASH_P2_KEY_VLD_CNTr = 2966, + SE_ALG_HASH_P3_KEY_VLD_CNTr = 2967, + SE_ALG_LPM_P0_KEY_VLD_CNTr = 2968, + SE_ALG_HASH_P0_RSP_VLD_CNTr = 2969, + SE_ALG_HASH_P1_RSP_VLD_CNTr = 2970, + SE_ALG_HASH_P2_RSP_VLD_CNTr = 2971, + SE_ALG_HASH_P3_RSP_VLD_CNTr = 2972, + SE_ALG_LPM_P0_RSP_VLD_CNTr = 2973, + SE_ALG_HASH_P0_SMF_CNTr = 2974, + SE_ALG_HASH_P1_SMF_CNTr = 2975, + SE_ALG_HASH_P2_SMF_CNTr = 2976, + SE_ALG_HASH_P3_SMF_CNTr = 2977, + SE_ALG_LPM_P0_SMF_CNTr = 2978, + SE_ALG_HASH_P0_SPACEVLD_CNTr = 2979, + SE_ALG_HASH_P1_SPACEVLD_CNTr = 2980, + SE_ALG_HASH_P2_SPACEVLD_CNTr = 2981, + SE_ALG_HASH_P3_SPACEVLD_CNTr = 2982, + SE_ALG_SMMU1_P0_REQ_VLD_CNTr = 2983, + SE_ALG_SMMU1_P1_REQ_VLD_CNTr = 2984, + SE_ALG_SMMU1_P2_REQ_VLD_CNTr = 2985, + SE_ALG_SMMU1_P3_REQ_VLD_CNTr = 2986, + SE_ALG_SMMU1_P4_REQ_VLD_CNTr = 2987, + SE_ALG_SMMU1_P5_REQ_VLD_CNTr = 2988, + SE_ALG_SMMU1_P0_RSP_VLD_CNTr = 2989, + SE_ALG_SMMU1_P1_RSP_VLD_CNTr = 2990, + SE_ALG_SMMU1_P2_RSP_VLD_CNTr = 2991, + SE_ALG_SMMU1_P3_RSP_VLD_CNTr = 2992, + SE_ALG_SMMU1_P4_RSP_VLD_CNTr = 2993, + SE_ALG_SMMU1_P5_RSP_VLD_CNTr = 2994, + SE_ALG_SCHD_LEARN_FIFO_INT_CNTr = 2995, + SE_ALG_SCHD_HASH0_FIFO_INT_CNTr = 2996, + SE_ALG_SCHD_HASH1_FIFO_INT_CNTr = 2997, + SE_ALG_SCHD_HASH2_FIFO_INT_CNTr = 2998, + SE_ALG_SCHD_HASH3_FIFO_INT_CNTr = 2999, + SE_ALG_SCHD_LPM_FIFO_INT_CNTr = 3000, + SE_ALG_SCHD_LEARN_FIFO_PARITY_ERR_CNTr = 3001, + SE_ALG_SCHD_HASH0_FIFO_PARITY_ERR_CNTr = 3002, + SE_ALG_SCHD_HASH1_FIFO_PARITY_ERR_CNTr = 3003, + SE_ALG_SCHD_HASH2_FIFO_PARITY_ERR_CNTr = 3004, + SE_ALG_SCHD_HASH3_FIFO_PARITY_ERR_CNTr = 3005, + SE_ALG_SCHD_LPM_FIFO_PARITY_ERR_CNTr = 3006, + SE_ALG_RD_INIT_CFT_CNTr = 3007, + SE_ALG_ZGP0_ZBLK0_ECC_ERR_CNTr = 3008, + SE_ALG_ZGP0_ZBLK1_ECC_ERR_CNTr = 3009, + SE_ALG_ZGP0_ZBLK2_ECC_ERR_CNTr = 3010, + SE_ALG_ZGP0_ZBLK3_ECC_ERR_CNTr = 3011, + SE_ALG_ZGP0_ZBLK4_ECC_ERR_CNTr = 3012, + SE_ALG_ZGP0_ZBLK5_ECC_ERR_CNTr = 3013, + SE_ALG_ZGP0_ZBLK6_ECC_ERR_CNTr = 3014, + SE_ALG_ZGP0_ZBLK7_ECC_ERR_CNTr = 3015, + SE_ALG_ZGP1_ZBLK0_ECC_ERR_CNTr = 3016, + SE_ALG_ZGP1_ZBLK1_ECC_ERR_CNTr = 3017, + SE_ALG_ZGP1_ZBLK2_ECC_ERR_CNTr = 3018, + SE_ALG_ZGP1_ZBLK3_ECC_ERR_CNTr = 3019, + SE_ALG_ZGP1_ZBLK4_ECC_ERR_CNTr = 3020, + SE_ALG_ZGP1_ZBLK5_ECC_ERR_CNTr = 3021, + SE_ALG_ZGP1_ZBLK6_ECC_ERR_CNTr = 3022, + SE_ALG_ZGP1_ZBLK7_ECC_ERR_CNTr = 3023, + SE_ALG_ZGP2_ZBLK0_ECC_ERR_CNTr = 3024, + SE_ALG_ZGP2_ZBLK1_ECC_ERR_CNTr = 3025, + SE_ALG_ZGP2_ZBLK2_ECC_ERR_CNTr = 3026, + SE_ALG_ZGP2_ZBLK3_ECC_ERR_CNTr = 3027, + SE_ALG_ZGP2_ZBLK4_ECC_ERR_CNTr = 3028, + SE_ALG_ZGP2_ZBLK5_ECC_ERR_CNTr = 3029, + SE_ALG_ZGP2_ZBLK6_ECC_ERR_CNTr = 3030, + SE_ALG_ZGP2_ZBLK7_ECC_ERR_CNTr = 3031, + SE_ALG_ZGP3_ZBLK0_ECC_ERR_CNTr = 3032, + SE_ALG_ZGP3_ZBLK1_ECC_ERR_CNTr = 3033, + SE_ALG_ZGP3_ZBLK2_ECC_ERR_CNTr = 3034, + SE_ALG_ZGP3_ZBLK3_ECC_ERR_CNTr = 3035, + SE_ALG_ZGP3_ZBLK4_ECC_ERR_CNTr = 3036, + SE_ALG_ZGP3_ZBLK5_ECC_ERR_CNTr = 3037, + SE_ALG_ZGP3_ZBLK6_ECC_ERR_CNTr = 3038, + SE_ALG_ZGP3_ZBLK7_ECC_ERR_CNTr = 3039, + SE_ALG_ZCAM_HASH_P0_ERR_CNTr = 3040, + SE_ALG_ZCAM_HASH_P1_ERR_CNTr = 3041, + SE_ALG_ZCAM_HASH_P2_ERR_CNTr = 3042, + SE_ALG_ZCAM_HASH_P3_ERR_CNTr = 3043, + SE_ALG_ZCAM_LPM_ERR_CNTr = 3044, + SE_ALG_HASH0_SREQ_FIFO_PARITY_ERR_CNTr = 3045, + SE_ALG_HASH0_SREQ_FIFO_INT_CNTr = 3046, + SE_ALG_HASH0_KEY_FIFO_INT_CNTr = 3047, + SE_ALG_HASH0_INT_RSP_FIFO_PARITY_ERR_CNTr = 3048, + SE_ALG_HASH0_EXT_RSP_FIFO_PARITY_ERR_CNTr = 3049, + SE_ALG_HASH0_EXT_RSP_FIFO_INT_CNTr = 3050, + SE_ALG_HASH0_INT_RSP_FIFO_INT_CNTr = 3051, + SE_ALG_HASH1_SREQ_FIFO_PARITY_ERR_CNTr = 3052, + SE_ALG_HASH1_SREQ_FIFO_INT_CNTr = 3053, + SE_ALG_HASH1_KEY_FIFO_INT_CNTr = 3054, + SE_ALG_HASH1_INT_RSP_FIFO_PARITY_ERR_CNTr = 3055, + SE_ALG_HASH1_EXT_RSP_FIFO_PARITY_ERR_CNTr = 3056, + SE_ALG_HASH1_EXT_RSP_FIFO_INT_CNTr = 3057, + SE_ALG_HASH1_INT_RSP_FIFO_INT_CNTr = 3058, + SE_ALG_HASH2_SREQ_FIFO_PARITY_ERR_CNTr = 3059, + SE_ALG_HASH2_SREQ_FIFO_INT_CNTr = 3060, + SE_ALG_HASH2_KEY_FIFO_INT_CNTr = 3061, + SE_ALG_HASH2_INT_RSP_FIFO_PARITY_ERR_CNTr = 3062, + SE_ALG_HASH2_EXT_RSP_FIFO_PARITY_ERR_CNTr = 3063, + SE_ALG_HASH2_EXT_RSP_FIFO_INT_CNTr = 3064, + SE_ALG_HASH2_INT_RSP_FIFO_INT_CNTr = 3065, + SE_ALG_HASH3_SREQ_FIFO_PARITY_ERR_CNTr = 3066, + SE_ALG_HASH3_SREQ_FIFO_INT_CNTr = 3067, + SE_ALG_HASH3_KEY_FIFO_INT_CNTr = 3068, + SE_ALG_HASH3_INT_RSP_FIFO_PARITY_ERR_CNTr = 3069, + SE_ALG_HASH3_EXT_RSP_FIFO_PARITY_ERR_CNTr = 3070, + SE_ALG_HASH3_EXT_RSP_FIFO_INT_CNTr = 3071, + SE_ALG_HASH3_INT_RSP_FIFO_INT_CNTr = 3072, + SE_ALG_LPM_EXT_RSP_FIFO_INT_CNTr = 3073, + SE_ALG_LPM_EXT_V6_FIFO_INT_CNTr = 3074, + SE_ALG_LPM_EXT_V4_FIFO_INT_CNTr = 3075, + SE_ALG_LPM_EXT_ADDR_FIFO_INT_CNTr = 3076, + SE_ALG_LPM_EXT_V4_FIFO_PARITY_ERR_CNTr = 3077, + SE_ALG_LPM_EXT_V6_FIFO_PARITY_ERR_CNTr = 3078, + SE_ALG_LPM_EXT_RSP_FIFO_PARITY_ERR_CNTr = 3079, + SE_ALG_LPM_AS_REQ_FIFO_INT_CNTr = 3080, + SE_ALG_LPM_AS_INT_RSP_FIFO_INT_CNTr = 3081, + SE_ALG_SE_ALG_INT_STATUSr = 3082, + SE_ALG_SCHD_INT_ENr = 3083, + SE_ALG_SCHD_INT_MASKr = 3084, + SE_ALG_SCHD_INT_STATUSr = 3085, + SE_ALG_ZBLK_ECC_INT_ENr = 3086, + SE_ALG_ZBLK_ECC_INT_MASKr = 3087, + SE_ALG_ZBLK_ECC_INT_STATUSr = 3088, + SE_ALG_HASH0_INT_ENr = 3089, + SE_ALG_HASH0_INT_MASKr = 3090, + SE_ALG_HASH0_INT_STATUSr = 3091, + SE_ALG_HASH1_INT_ENr = 3092, + SE_ALG_HASH1_INT_MASKr = 3093, + SE_ALG_HASH1_INT_STATUSr = 3094, + SE_ALG_HASH2_INT_ENr = 3095, + SE_ALG_HASH2_INT_MASKr = 3096, + SE_ALG_HASH2_INT_STATUSr = 3097, + SE_ALG_HASH3_INT_ENr = 3098, + SE_ALG_HASH3_INT_MASKr = 3099, + SE_ALG_HASH3_INT_STATUSr = 3100, + SE_ALG_LPM_INT_ENr = 3101, + SE_ALG_LPM_INT_MASKr = 3102, + SE_ALG_LPM_INT_STATUSr = 3103, + SE_ALG_ZBLOCK_LPM_MASK0r = 3104, + SE_ALG_ZBLOCK_LPM_MASK1r = 3105, + SE_ALG_ZBLOCK_LPM_MASK2r = 3106, + SE_ALG_ZBLOCK_LPM_MASK3r = 3107, + SE_ALG_ZBLOCK_DEFAULT_ROUTE0r = 3108, + SE_ALG_ZBLOCK_DEFAULT_ROUTE1r = 3109, + SE_ALG_ZBLOCK_DEFAULT_ROUTE2r = 3110, + SE_ALG_ZBLOCK_DEFAULT_ROUTE3r = 3111, + SE_ALG_ZBLOCK_DEFAULT_ROUTE4r = 3112, + SE_ALG_ZBLOCK_DEFAULT_ROUTE5r = 3113, + SE_ALG_ZBLOCK_DEFAULT_ROUTE6r = 3114, + SE_ALG_ZBLOCK_DEFAULT_ROUTE7r = 3115, + SE_ALG_ZBLOCK_HASH_LISTTABLE_ITEM0r = 3116, + SE_ALG_ZBLOCK_HASH_LISTTABLE_ITEM1r = 3117, + SE_ALG_ZBLOCK_HASH_LISTTABLE_ITEM2r = 3118, + SE_ALG_ZBLOCK_HASH_LISTTABLE_ITEM3r = 3119, + SE_ALG_ZBLOCK_ECC_ERR_STATUSr = 3120, + SE_ALG_ZBLOCK_LPM_V6_SRAM_CMPr = 3121, + SE_ALG_ZBLOCK_LPM_V4_SRAM_CMPr = 3122, + SE_PARSER_KSCHD_PFUL_CFGr = 3123, + SE_PARSER_DEBUG_CNT_MODEr = 3124, + SE_PARSER_PARSER_INT_ENr = 3125, + SE_PARSER_PARSER_INT_MASKr = 3126, + SE_PARSER_PARSER_INT_STATUSr = 3127, + SE_PARSER_PARSER_INT_UNMASK_FLAGr = 3128, + SE_PARSER_ECC_BYPASS_READr = 3129, + SE_PARSER_MEX0_5_REQ_CNTr = 3130, + SE_PARSER_KSCHD_REQ0_5_CNTr = 3131, + SE_PARSER_KSCHD_PARSER_FC0_5_CNTr = 3132, + SE_PARSER_SE_PPU_MEX0_5_FC_CNTr = 3133, + SE_PARSER_SMMU0_MARC_FC_CNTr = 3134, + SE_PARSER_SMMU0_MARC_KEY_CNTr = 3135, + SE_PARSER_CMMU_KEY_CNTr = 3136, + SE_PARSER_CMMU_PARSER_FC_CNTr = 3137, + SE_PARSER_MARC_TAB_TYPE_ERR_MEX0_5_CNTr = 3138, + SE_PARSER_ERAM_FULLADDR_DROP_CNTr = 3139, + SE_AS_HASH0_PFUL_CFGr = 3140, + SE_AS_HASH1_PFUL_CFGr = 3141, + SE_AS_HASH2_PFUL_CFGr = 3142, + SE_AS_HASH3_PFUL_CFGr = 3143, + SE_AS_PBU_PFUL_CFGr = 3144, + SE_AS_LPM_PFUL_CFGr = 3145, + SE_AS_ETCAM_PFUL_CFGr = 3146, + SE_AS_AS_LEARN0_FIFO_CFGr = 3147, + SE_AS_AS_LEARN1_FIFO_CFGr = 3148, + SE_AS_AS_DMA_FIFO_CFGr = 3149, + SE_AS_AGE_PFUL_CFGr = 3150, + SE_AS_ETCAM_RSP_CFGr = 3151, + SE_AS_PBU_ECC_BYPASS_READr = 3152, + SE_AS_ETCAM0_ECC_BYPASS_READr = 3153, + SE_AS_ETCAM1_ECC_BYPASS_READr = 3154, + SE_AS_LPM_ECC_BYPASS_READr = 3155, + SE_AS_HASH_ECC_BYPASS_READr = 3156, + SE_AS_HASH_LEARN_ECC_BYPASS_READr = 3157, + SE_AS_DEBUG_CNT_MODEr = 3158, + SE_AS_AS_INT_0_ENr = 3159, + SE_AS_AS_INT_0_MASKr = 3160, + SE_AS_AS_INT_1_ENr = 3161, + SE_AS_AS_INT_1_MASKr = 3162, + SE_AS_AS_INT_2_ENr = 3163, + SE_AS_AS_INT_2_MASKr = 3164, + SE_AS_AS_INT_0_STATUSr = 3165, + SE_AS_AS_INT_1_STATUSr = 3166, + SE_AS_AS_INT_2_STATUSr = 3167, + SE_AS_SE_AS_INT_STATUSr = 3168, + SE_AS_HASH0_3_WR_REQ_CNTr = 3169, + SE_AS_SMMU0_ETCAM0_1_FC_CNTr = 3170, + SE_AS_ETCAM0_1_SMMU0_REQ_CNTr = 3171, + SE_AS_SMMU0_ETCAM0_1_RSP_CNTr = 3172, + SE_AS_AS_HLA_HASH_P0_3_KEY_CNTr = 3173, + SE_AS_AS_HLA_LPM_P0_KEY_CNTr = 3174, + SE_AS_ALG_AS_HASH_P0_3_RSP_CNTr = 3175, + SE_AS_ALG_AS_HASH_P0_3_SMF_RSP_CNTr = 3176, + SE_AS_ALG_AS_LPM_P0_RSP_CNTr = 3177, + SE_AS_ALG_AS_LPM_P0_3_SMF_RSP_CNTr = 3178, + SE_AS_AS_PBU_KEY_CNTr = 3179, + SE_AS_PBU_SE_DPI_RSP_DAT_CNTr = 3180, + SE_AS_AS_ETCAM_CTRL_REQ0_CNTr = 3181, + SE_AS_ETCAM_CTRL_AS_INDEX0_1_CNTr = 3182, + SE_AS_ETCAM_CTRL_AS_HIT0_1_CNTr = 3183, + SE_AS_AS_SMMU0_REQ_CNTr = 3184, + SE_AS_LEARN_HLA_WR_CNTr = 3185, + SE_AS_AS_SMMU1_REQ_CNTr = 3186, + SE_AS_SE_CFG_MAC_DAT_CNTr = 3187, + SE_AS_ALG_AS_HASH_P0_3_FC_CNTr = 3188, + SE_AS_ALG_AS_LPM_P0_FC_CNTr = 3189, + SE_AS_AS_ALG_HASH_P0_3_FC_CNTr = 3190, + SE_AS_AS_ALG_LPM_P0_FC_CNTr = 3191, + SE_AS_AS_PBU_FC_CNTr = 3192, + SE_AS_PBU_SE_DPI_KEY_FC_CNTr = 3193, + SE_AS_AS_ETCAM_CTRL_FC0_1_CNTr = 3194, + SE_AS_ETCAM_CTRL_AS_FC0_1_CNTr = 3195, + SE_AS_SMMU0_AS_MAC_AGE_FC_CNTr = 3196, + SE_AS_ALG_LEARN_FC_CNTr = 3197, + SE_AS_SMMU1_AS_FC_CNTr = 3198, + SE_AS_CFG_SE_MAC_FC_CNTr = 3199, + SE_KSCHD_KSCHD_CPU_RDYr = 3200, + SE_KSCHD_PPU0_ECC_BYPASS_READr = 3201, + SE_KSCHD_PBU_ECC_BYPASS_READr = 3202, + SE_KSCHD_SMMU1_ECC_BYPASS_READr = 3203, + SE_KSCHD_ASS_ECC_BYPASS_READr = 3204, + SE_KSCHD_SDT_Hr = 3205, + SE_KSCHD_SDT_Lr = 3206, + SE_KSCHD_HASH_KEY15r = 3207, + SE_KSCHD_HASH_KEY14r = 3208, + SE_KSCHD_HASH_KEY13r = 3209, + SE_KSCHD_HASH_KEY12r = 3210, + SE_KSCHD_HASH_KEY11r = 3211, + SE_KSCHD_HASH_KEY10r = 3212, + SE_KSCHD_HASH_KEY9r = 3213, + SE_KSCHD_HASH_KEY8r = 3214, + SE_KSCHD_HASH_KEY7r = 3215, + SE_KSCHD_HASH_KEY6r = 3216, + SE_KSCHD_HASH_KEY5r = 3217, + SE_KSCHD_HASH_KEY4r = 3218, + SE_KSCHD_HASH_KEY3r = 3219, + SE_KSCHD_HASH_KEY2r = 3220, + SE_KSCHD_HASH_KEY1r = 3221, + SE_KSCHD_HASH_KEY0r = 3222, + SE_KSCHD_SCHD_INT_0_ENr = 3223, + SE_KSCHD_SCHD_INT_0_MASKr = 3224, + SE_KSCHD_SCHD_INT_1_ENr = 3225, + SE_KSCHD_SCHD_INT_1_MASKr = 3226, + SE_KSCHD_SCHD_INT_2_ENr = 3227, + SE_KSCHD_SCHD_INT_2_MASKr = 3228, + SE_KSCHD_SCHD_INT_3_ENr = 3229, + SE_KSCHD_SCHD_INT_3_MASKr = 3230, + SE_KSCHD_SCHD_INT_4_ENr = 3231, + SE_KSCHD_SCHD_INT_4_MASKr = 3232, + SE_KSCHD_SCHD_INT_0_STATUSr = 3233, + SE_KSCHD_SCHD_INT_1_STATUSr = 3234, + SE_KSCHD_SCHD_INT_2_STATUSr = 3235, + SE_KSCHD_SCHD_INT_3_STATUSr = 3236, + SE_KSCHD_SCHD_INT_4_STATUSr = 3237, + SE_KSCHD_SE_KSCHD_INT_STATUSr = 3238, + SE_KSCHD_DEBUG_CNT_MODEr = 3239, + SE_KSCHD_SE_PARSER_KSCHD_KEY0_3_CNTr = 3240, + SE_KSCHD_SE_SMMU1_KEY0_3_CNTr = 3241, + SE_KSCHD_KSCHD_AS_KEY0_CNTr = 3242, + SE_KSCHD_KSCHD_AS_KEY1_CNTr = 3243, + SE_KSCHD_KSCHD_AS_KEY2_CNTr = 3244, + SE_KSCHD_KSCHD_AS_KEY3_CNTr = 3245, + SE_KSCHD_KSCHD_AS_KEY4_CNTr = 3246, + SE_KSCHD_KSCHD_AS_KEY5_CNTr = 3247, + SE_KSCHD_KSCHD_AS_KEY6_CNTr = 3248, + SE_KSCHD_KSCHD_AS_KEY9_CNTr = 3249, + SE_KSCHD_KSCHD_SE_PARSER_FC0_3_CNTr = 3250, + SE_KSCHD_SMMU1_SE_FC0_3_CNTr = 3251, + SE_KSCHD_AS_KSCHD_FC_CNT0r = 3252, + SE_KSCHD_AS_KSCHD_FC_CNT1r = 3253, + SE_KSCHD_AS_KSCHD_FC_CNT2r = 3254, + SE_KSCHD_AS_KSCHD_FC_CNT3r = 3255, + SE_KSCHD_AS_KSCHD_FC_CNT4r = 3256, + SE_KSCHD_AS_KSCHD_FC_CNT5r = 3257, + SE_KSCHD_AS_KSCHD_FC_CNT6r = 3258, + SE_KSCHD_AS_KSCHD_FC_CNT9r = 3259, + SE_RSCHD_RSCHD_HASH_PFUL_CFGr = 3260, + SE_RSCHD_RSCHD_HASH_EPT_CFGr = 3261, + SE_RSCHD_RSCHD_PBU_PFUL_CFGr = 3262, + SE_RSCHD_RSCHD_PBU_EPT_CFGr = 3263, + SE_RSCHD_RSCHD_LPM_PFUL_CFGr = 3264, + SE_RSCHD_RSCHD_LPM_EPT_CFGr = 3265, + SE_RSCHD_RSCHD_ETCAM_PFUL_CFGr = 3266, + SE_RSCHD_RSCHD_ETCAM_EPT_CFGr = 3267, + SE_RSCHD_SMMU0_WB_PFUL_CFGr = 3268, + SE_RSCHD_SMMU0_WB_EPT_CFGr = 3269, + SE_RSCHD_SMMU1_WB_PFUL_CFGr = 3270, + SE_RSCHD_SMMU1_WB_EPT_CFGr = 3271, + SE_RSCHD_ALG_WB_PFUL_CFGr = 3272, + SE_RSCHD_ALG_WB_EPT_CFGr = 3273, + SE_RSCHD_WR_RSP_VLD_ENr = 3274, + SE_RSCHD_NPPU_WB_PFUL_CFGr = 3275, + SE_RSCHD_NPPU_WB_EPT_CFGr = 3276, + SE_RSCHD_PORT0_INT_ENr = 3277, + SE_RSCHD_PORT0_INT_MASKr = 3278, + SE_RSCHD_PORT1_INT_ENr = 3279, + SE_RSCHD_PORT1_INT_MASKr = 3280, + SE_RSCHD_PORT0_INT_STATUSr = 3281, + SE_RSCHD_PORT1_INT_STATUSr = 3282, + SE_RSCHD_SE_RSCHD_INT_STATUSr = 3283, + SE_RSCHD_DEBUG_CNT_MODEr = 3284, + SE_RSCHD_SE_PPU_MEX0_5_RSP1_CNTr = 3285, + SE_RSCHD_AS_RSCHD_RSP0_CNTr = 3286, + SE_RSCHD_AS_RSCHD_RSP1_CNTr = 3287, + SE_RSCHD_AS_RSCHD_RSP2_CNTr = 3288, + SE_RSCHD_AS_RSCHD_RSP3_CNTr = 3289, + SE_RSCHD_AS_RSCHD_RSP4_CNTr = 3290, + SE_RSCHD_AS_RSCHD_RSP5_CNTr = 3291, + SE_RSCHD_AS_RSCHD_RSP6_CNTr = 3292, + SE_RSCHD_AS_RSCHD_RSP9_CNTr = 3293, + SE_RSCHD_SMMU1_SE_RSP0_3_CNTr = 3294, + SE_RSCHD_PPU_SE_MEX0_3_FC_CNTr = 3295, + SE_RSCHD_RSCHD_AS_FC_CNT0r = 3296, + SE_RSCHD_RSCHD_AS_FC_CNT1r = 3297, + SE_RSCHD_RSCHD_AS_FC_CNT2r = 3298, + SE_RSCHD_RSCHD_AS_FC_CNT3r = 3299, + SE_RSCHD_RSCHD_AS_FC_CNT4r = 3300, + SE_RSCHD_RSCHD_AS_FC_CNT5r = 3301, + SE_RSCHD_RSCHD_AS_FC_CNT6r = 3302, + SE_RSCHD_RSCHD_AS_FC_CNT9r = 3303, + SE_RSCHD_SE_SMMU1_FC0_3_CNTr = 3304, + SE_RSCHD_SMMU0_SE_WR_DONE_CNTr = 3305, + SE_RSCHD_SE_SMMU0_WR_DONE_FC_CNTr = 3306, + SE_RSCHD_SMMU1_SE_WR_RSP_CNTr = 3307, + SE_RSCHD_SE_SMMU1_WR_RSP_FC_CNTr = 3308, + SE_RSCHD_ALG_SE_WR_RSP_CNTr = 3309, + SE_RSCHD_SE_ALG_WR_RSP_FC_CNTr = 3310, + SMMU0_SMMU0_KSCHD_PFUL_CFG0r = 3311, + SMMU0_SMMU0_KSCHD_PFUL_CFG1r = 3312, + SMMU0_SMMU0_CTRL_PFUL1_CFGr = 3313, + SMMU0_SMMU0_CTRL_PFUL2_CFGr = 3314, + SMMU0_SMMU0_CTRL_PFUL3_CFGr = 3315, + SMMU0_SMMU0_RSCHD_PFUL_CFGr = 3316, + SMMU0_SMMU0_RSCHD_EPT_CFGr = 3317, + SMMU0_SMMU0_ALUCMD_PFUL_CFGr = 3318, + SMMU0_SMMU0_ALUWR_PFUL_CFGr = 3319, + SMMU0_SMMU0_WR_ARB_PFUL_CFG0r = 3320, + SMMU0_SMMU0_WR_ARB_PFUL_CFG1r = 3321, + SMMU0_SMMU0_ORD_PFUL_CFGr = 3322, + SMMU0_SMMU0_CFG_DMA_BADDRr = 3323, + SMMU0_SMMU0_CFG_ODMA0_BADDRr = 3324, + SMMU0_SMMU0_CFG_ODMA1_BADDRr = 3325, + SMMU0_SMMU0_CFG_ODMA2_BADDRr = 3326, + SMMU0_SMMU0_CFG_ODMA_TDM_BADDRr = 3327, + SMMU0_SMMU0_CFG_MCAST_BADDRr = 3328, + SMMU0_SMMU0_CFG_LPM0r = 3329, + SMMU0_SMMU0_CFG_LPM1r = 3330, + SMMU0_SMMU0_CFG_LPM2r = 3331, + SMMU0_SMMU0_CFG_LPM3r = 3332, + SMMU0_SMMU0_CFG_LPM4r = 3333, + SMMU0_SMMU0_CFG_LPM5r = 3334, + SMMU0_SMMU0_CFG_LPM6r = 3335, + SMMU0_SMMU0_CFG_LPM7r = 3336, + SMMU0_SMMU0_DEBUG_CNT_MODEr = 3337, + SMMU0_SMMU0_STAT_OVERFLOW_MODEr = 3338, + SMMU0_SMMU0_INIT_EN_CFG_TMPr = 3339, + SMMU0_SMMU0_SMMU0_INT_UNMASK_FLAGr = 3340, + SMMU0_SMMU0_SMMU0_INT0_ENr = 3341, + SMMU0_SMMU0_SMMU0_INT0_MASKr = 3342, + SMMU0_SMMU0_SMMU0_INT0_STATUSr = 3343, + SMMU0_SMMU0_SMMU0_INT1_ENr = 3344, + SMMU0_SMMU0_SMMU0_INT1_MASKr = 3345, + SMMU0_SMMU0_SMMU0_INT1_STATUSr = 3346, + SMMU0_SMMU0_SMMU0_INT2_ENr = 3347, + SMMU0_SMMU0_SMMU0_INT2_MASKr = 3348, + SMMU0_SMMU0_SMMU0_INT2_STATUSr = 3349, + SMMU0_SMMU0_SMMU0_INT3_ENr = 3350, + SMMU0_SMMU0_SMMU0_INT3_MASKr = 3351, + SMMU0_SMMU0_SMMU0_INT3_STATUSr = 3352, + SMMU0_SMMU0_SMMU0_INT4_ENr = 3353, + SMMU0_SMMU0_SMMU0_INT4_MASKr = 3354, + SMMU0_SMMU0_SMMU0_INT4_STATUSr = 3355, + SMMU0_SMMU0_SMMU0_INT5_ENr = 3356, + SMMU0_SMMU0_SMMU0_INT5_MASKr = 3357, + SMMU0_SMMU0_SMMU0_INT5_STATUSr = 3358, + SMMU0_SMMU0_SMMU0_INT6_ENr = 3359, + SMMU0_SMMU0_SMMU0_INT6_MASKr = 3360, + SMMU0_SMMU0_SMMU0_INT6_STATUSr = 3361, + SMMU0_SMMU0_SMMU0_INT7_ENr = 3362, + SMMU0_SMMU0_SMMU0_INT7_MASKr = 3363, + SMMU0_SMMU0_SMMU0_INT7_STATUSr = 3364, + SMMU0_SMMU0_SMMU0_INT8_ENr = 3365, + SMMU0_SMMU0_SMMU0_INT8_MASKr = 3366, + SMMU0_SMMU0_SMMU0_INT8_STATUSr = 3367, + SMMU0_SMMU0_SMMU0_INT9_ENr = 3368, + SMMU0_SMMU0_SMMU0_INT9_MASKr = 3369, + SMMU0_SMMU0_SMMU0_INT9_STATUSr = 3370, + SMMU0_SMMU0_SMMU0_INT10_ENr = 3371, + SMMU0_SMMU0_SMMU0_INT10_MASKr = 3372, + SMMU0_SMMU0_SMMU0_INT10_STATUSr = 3373, + SMMU0_SMMU0_SMMU0_INT11_ENr = 3374, + SMMU0_SMMU0_SMMU0_INT11_MASKr = 3375, + SMMU0_SMMU0_SMMU0_INT11_STATUSr = 3376, + SMMU0_SMMU0_SMMU0_INT12_ENr = 3377, + SMMU0_SMMU0_SMMU0_INT12_MASKr = 3378, + SMMU0_SMMU0_SMMU0_INT12_STATUSr = 3379, + SMMU0_SMMU0_SMMU0_INT13_ENr = 3380, + SMMU0_SMMU0_SMMU0_INT13_MASKr = 3381, + SMMU0_SMMU0_SMMU0_INT13_STATUSr = 3382, + SMMU0_SMMU0_SMMU0_INT14_ENr = 3383, + SMMU0_SMMU0_SMMU0_INT14_MASKr = 3384, + SMMU0_SMMU0_SMMU0_INT14_STATUSr = 3385, + SMMU0_SMMU0_SMMU0_ECC_UNMASK_FLAGr = 3386, + SMMU0_SMMU0_SMMU0_INT15_ENr = 3387, + SMMU0_SMMU0_SMMU0_INT15_MASKr = 3388, + SMMU0_SMMU0_SMMU0_INT15_STATUSr = 3389, + SMMU0_SMMU0_SMMU0_INT16_ENr = 3390, + SMMU0_SMMU0_SMMU0_INT16_MASKr = 3391, + SMMU0_SMMU0_SMMU0_INT16_STATUSr = 3392, + SMMU0_SMMU0_SMMU0_INT17_ENr = 3393, + SMMU0_SMMU0_SMMU0_INT17_MASKr = 3394, + SMMU0_SMMU0_SMMU0_INT17_STATUSr = 3395, + SMMU0_SMMU0_SMMU0_INT18_ENr = 3396, + SMMU0_SMMU0_SMMU0_INT18_MASKr = 3397, + SMMU0_SMMU0_SMMU0_INT18_STATUSr = 3398, + SMMU0_SMMU0_SMMU0_INT19_ENr = 3399, + SMMU0_SMMU0_SMMU0_INT19_MASKr = 3400, + SMMU0_SMMU0_SMMU0_INT19_STATUSr = 3401, + SMMU0_SMMU0_SMMU0_INT20_ENr = 3402, + SMMU0_SMMU0_SMMU0_INT20_MASKr = 3403, + SMMU0_SMMU0_SMMU0_INT20_STATUSr = 3404, + SMMU0_SMMU0_SMMU0_INT21_ENr = 3405, + SMMU0_SMMU0_SMMU0_INT21_MASKr = 3406, + SMMU0_SMMU0_SMMU0_INT21_STATUSr = 3407, + SMMU0_SMMU0_SMMU0_INT22_ENr = 3408, + SMMU0_SMMU0_SMMU0_INT22_MASKr = 3409, + SMMU0_SMMU0_SMMU0_INT22_STATUSr = 3410, + SMMU0_SMMU0_SMMU0_INT23_ENr = 3411, + SMMU0_SMMU0_SMMU0_INT23_MASKr = 3412, + SMMU0_SMMU0_SMMU0_INT23_STATUSr = 3413, + SMMU0_SMMU0_SMMU0_INT24_ENr = 3414, + SMMU0_SMMU0_SMMU0_INT24_MASKr = 3415, + SMMU0_SMMU0_SMMU0_INT24_STATUSr = 3416, + SMMU0_SMMU0_SMMU0_INT25_ENr = 3417, + SMMU0_SMMU0_SMMU0_INT25_MASKr = 3418, + SMMU0_SMMU0_SMMU0_INT25_STATUSr = 3419, + SMMU0_SMMU0_SMMU0_INT26_ENr = 3420, + SMMU0_SMMU0_SMMU0_INT26_MASKr = 3421, + SMMU0_SMMU0_SMMU0_INT26_STATUSr = 3422, + SMMU0_SMMU0_SMMU0_INT27_ENr = 3423, + SMMU0_SMMU0_SMMU0_INT27_MASKr = 3424, + SMMU0_SMMU0_SMMU0_INT27_STATUSr = 3425, + SMMU0_SMMU0_SMMU0_INT28_ENr = 3426, + SMMU0_SMMU0_SMMU0_INT28_MASKr = 3427, + SMMU0_SMMU0_SMMU0_INT28_STATUSr = 3428, + SMMU0_SMMU0_SMMU0_INT29_ENr = 3429, + SMMU0_SMMU0_SMMU0_INT29_MASKr = 3430, + SMMU0_SMMU0_SMMU0_INT29_STATUSr = 3431, + SMMU0_SMMU0_SMMU0_INT30_ENr = 3432, + SMMU0_SMMU0_SMMU0_INT30_MASKr = 3433, + SMMU0_SMMU0_SMMU0_INT30_STATUSr = 3434, + SMMU0_SMMU0_SMMU0_INT31_ENr = 3435, + SMMU0_SMMU0_SMMU0_INT31_MASKr = 3436, + SMMU0_SMMU0_SMMU0_INT31_STATUSr = 3437, + SMMU0_SMMU0_SMMU0_INT32_ENr = 3438, + SMMU0_SMMU0_SMMU0_INT32_MASKr = 3439, + SMMU0_SMMU0_SMMU0_INT32_STATUSr = 3440, + SMMU0_SMMU0_SMMU0_INT33_ENr = 3441, + SMMU0_SMMU0_SMMU0_INT33_MASKr = 3442, + SMMU0_SMMU0_SMMU0_INT33_STATUSr = 3443, + SMMU0_SMMU0_SMMU0_INT34_ENr = 3444, + SMMU0_SMMU0_SMMU0_INT34_MASKr = 3445, + SMMU0_SMMU0_SMMU0_INT34_STATUSr = 3446, + SMMU0_SMMU0_SMMU0_INT35_ENr = 3447, + SMMU0_SMMU0_SMMU0_INT35_MASKr = 3448, + SMMU0_SMMU0_SMMU0_INT35_STATUSr = 3449, + SMMU0_SMMU0_SMMU0_INT36_ENr = 3450, + SMMU0_SMMU0_SMMU0_INT36_MASKr = 3451, + SMMU0_SMMU0_SMMU0_INT36_STATUSr = 3452, + SMMU0_SMMU0_SMMU0_INT37_ENr = 3453, + SMMU0_SMMU0_SMMU0_INT37_MASKr = 3454, + SMMU0_SMMU0_SMMU0_INT37_STATUSr = 3455, + SMMU0_SMMU0_SMMU0_INT38_ENr = 3456, + SMMU0_SMMU0_SMMU0_INT38_MASKr = 3457, + SMMU0_SMMU0_SMMU0_INT38_STATUSr = 3458, + SMMU0_SMMU0_SMMU0_INT39_ENr = 3459, + SMMU0_SMMU0_SMMU0_INT39_MASKr = 3460, + SMMU0_SMMU0_SMMU0_INT39_STATUSr = 3461, + SMMU0_SMMU0_SMMU0_INT40_ENr = 3462, + SMMU0_SMMU0_SMMU0_INT40_MASKr = 3463, + SMMU0_SMMU0_SMMU0_INT40_STATUSr = 3464, + SMMU0_SMMU0_SMMU0_INT41_ENr = 3465, + SMMU0_SMMU0_SMMU0_INT41_MASKr = 3466, + SMMU0_SMMU0_SMMU0_INT41_STATUSr = 3467, + SMMU0_SMMU0_SMMU0_INT42_ENr = 3468, + SMMU0_SMMU0_SMMU0_INT42_MASKr = 3469, + SMMU0_SMMU0_SMMU0_INT42_STATUSr = 3470, + SMMU0_SMMU0_SMMU0_INT43_ENr = 3471, + SMMU0_SMMU0_SMMU0_INT43_MASKr = 3472, + SMMU0_SMMU0_SMMU0_INT43_STATUSr = 3473, + SMMU0_SMMU0_SMMU0_INT44_ENr = 3474, + SMMU0_SMMU0_SMMU0_INT44_MASKr = 3475, + SMMU0_SMMU0_SMMU0_INT44_STATUSr = 3476, + SMMU0_SMMU0_SMMU0_INT45_ENr = 3477, + SMMU0_SMMU0_SMMU0_INT45_MASKr = 3478, + SMMU0_SMMU0_SMMU0_INT45_STATUSr = 3479, + SMMU0_SMMU0_SMMU0_INT46_ENr = 3480, + SMMU0_SMMU0_SMMU0_INT46_MASKr = 3481, + SMMU0_SMMU0_SMMU0_INT46_STATUSr = 3482, + SMMU0_SMMU0_SMMU0_INT47_ENr = 3483, + SMMU0_SMMU0_SMMU0_INT47_MASKr = 3484, + SMMU0_SMMU0_SMMU0_INT47_STATUSr = 3485, + SMMU0_SMMU0_SMMU0_INT48_ENr = 3486, + SMMU0_SMMU0_SMMU0_INT48_MASKr = 3487, + SMMU0_SMMU0_SMMU0_INT48_STATUSr = 3488, + SMMU0_SMMU0_SMMU0_INT49_ENr = 3489, + SMMU0_SMMU0_SMMU0_INT49_MASKr = 3490, + SMMU0_SMMU0_SMMU0_INT49_STATUSr = 3491, + SMMU0_SMMU0_SMMU0_INT50_ENr = 3492, + SMMU0_SMMU0_SMMU0_INT50_MASKr = 3493, + SMMU0_SMMU0_SMMU0_INT50_STATUSr = 3494, + SMMU0_SMMU0_SMMU0_INT51_ENr = 3495, + SMMU0_SMMU0_SMMU0_INT51_MASKr = 3496, + SMMU0_SMMU0_SMMU0_INT51_STATUSr = 3497, + SMMU0_SMMU0_SMMU0_INT52_ENr = 3498, + SMMU0_SMMU0_SMMU0_INT52_MASKr = 3499, + SMMU0_SMMU0_SMMU0_INT52_STATUSr = 3500, + SMMU0_SMMU0_SMMU0_INT53_ENr = 3501, + SMMU0_SMMU0_SMMU0_INT53_MASKr = 3502, + SMMU0_SMMU0_SMMU0_INT53_STATUSr = 3503, + SMMU0_SMMU0_CTRL0_ARBITER_ECC_BYPASSr = 3504, + SMMU0_SMMU0_CTRL2_ARBITER_ECC_BYPASSr = 3505, + SMMU0_SMMU0_CTRL4_ARBITER_ECC_BYPASSr = 3506, + SMMU0_SMMU0_CTRL6_ARBITER_ECC_BYPASSr = 3507, + SMMU0_SMMU0_CTRL8_ARBITER_ECC_BYPASSr = 3508, + SMMU0_SMMU0_CTRL10_ARBITER_ECC_BYPASSr = 3509, + SMMU0_SMMU0_CTRL12_ARBITER_ECC_BYPASSr = 3510, + SMMU0_SMMU0_CTRL14_ARBITER_ECC_BYPASSr = 3511, + SMMU0_SMMU0_CTRL16_ARBITER_ECC_BYPASSr = 3512, + SMMU0_SMMU0_CTRL18_ARBITER_ECC_BYPASSr = 3513, + SMMU0_SMMU0_CTRL20_ARBITER_ECC_BYPASSr = 3514, + SMMU0_SMMU0_CTRL22_ARBITER_ECC_BYPASSr = 3515, + SMMU0_SMMU0_CTRL24_ARBITER_ECC_BYPASSr = 3516, + SMMU0_SMMU0_CTRL26_ARBITER_ECC_BYPASSr = 3517, + SMMU0_SMMU0_CTRL28_ARBITER_ECC_BYPASSr = 3518, + SMMU0_SMMU0_CTRL30_ARBITER_ECC_BYPASSr = 3519, + SMMU0_SMMU0_CTRL_REQ_ECC_BYPASSr = 3520, + SMMU0_SMMU0_CTRL_INFO_ECC_BYPASSr = 3521, + SMMU0_SMMU0_SMMU0_RSCHD_ECC_BYPASSr = 3522, + SMMU0_SMMU0_SMMU0_WR_ECC_BYPASSr = 3523, + SMMU0_SMMU0_CTRL0_ARBITER_ECC_ERRr = 3524, + SMMU0_SMMU0_CTRL1_ARBITER_ECC_ERRr = 3525, + SMMU0_SMMU0_CTRL2_ARBITER_ECC_ERRr = 3526, + SMMU0_SMMU0_CTRL3_ARBITER_ECC_ERRr = 3527, + SMMU0_SMMU0_CTRL4_ARBITER_ECC_ERRr = 3528, + SMMU0_SMMU0_CTRL5_ARBITER_ECC_ERRr = 3529, + SMMU0_SMMU0_CTRL6_ARBITER_ECC_ERRr = 3530, + SMMU0_SMMU0_CTRL7_ARBITER_ECC_ERRr = 3531, + SMMU0_SMMU0_CTRL8_ARBITER_ECC_ERRr = 3532, + SMMU0_SMMU0_CTRL9_ARBITER_ECC_ERRr = 3533, + SMMU0_SMMU0_CTRL10_ARBITER_ECC_ERRr = 3534, + SMMU0_SMMU0_CTRL11_ARBITER_ECC_ERRr = 3535, + SMMU0_SMMU0_CTRL12_ARBITER_ECC_ERRr = 3536, + SMMU0_SMMU0_CTRL13_ARBITER_ECC_ERRr = 3537, + SMMU0_SMMU0_CTRL14_ARBITER_ECC_ERRr = 3538, + SMMU0_SMMU0_CTRL15_ARBITER_ECC_ERRr = 3539, + SMMU0_SMMU0_CTRL16_ARBITER_ECC_ERRr = 3540, + SMMU0_SMMU0_CTRL17_ARBITER_ECC_ERRr = 3541, + SMMU0_SMMU0_CTRL18_ARBITER_ECC_ERRr = 3542, + SMMU0_SMMU0_CTRL19_ARBITER_ECC_ERRr = 3543, + SMMU0_SMMU0_CTRL20_ARBITER_ECC_ERRr = 3544, + SMMU0_SMMU0_CTRL21_ARBITER_ECC_ERRr = 3545, + SMMU0_SMMU0_CTRL22_ARBITER_ECC_ERRr = 3546, + SMMU0_SMMU0_CTRL23_ARBITER_ECC_ERRr = 3547, + SMMU0_SMMU0_CTRL24_ARBITER_ECC_ERRr = 3548, + SMMU0_SMMU0_CTRL25_ARBITER_ECC_ERRr = 3549, + SMMU0_SMMU0_CTRL26_ARBITER_ECC_ERRr = 3550, + SMMU0_SMMU0_CTRL27_ARBITER_ECC_ERRr = 3551, + SMMU0_SMMU0_CTRL28_ARBITER_ECC_ERRr = 3552, + SMMU0_SMMU0_CTRL29_ARBITER_ECC_ERRr = 3553, + SMMU0_SMMU0_CTRL30_ARBITER_ECC_ERRr = 3554, + SMMU0_SMMU0_CTRL31_ARBITER_ECC_ERRr = 3555, + SMMU0_SMMU0_CTRL_REQ_ECC_SINGLE_ERRr = 3556, + SMMU0_SMMU0_CTRL_REQ_ECC_DOUBLE_ERRr = 3557, + SMMU0_SMMU0_CTRL_INFO_ECC_SINGLE_ERRr = 3558, + SMMU0_SMMU0_CTRL_INFO_ECC_DOUBLE_ERRr = 3559, + SMMU0_SMMU0_SMMU0_WR_ECC_ERRr = 3560, + SMMU0_SMMU0_SMMU0_RSCHD_ECC_SINGLE_ERRr = 3561, + SMMU0_SMMU0_SMMU0_RSCHD_ECC_DOUBLE_ERRr = 3562, + SMMU0_SMMU0_ORD_FIFO_EMPTYr = 3563, + SMMU0_SMMU0_WR_ARB_FIFO_EMPTYr = 3564, + SMMU0_SMMU0_CTRL_FIFO_EMPTY0r = 3565, + SMMU0_SMMU0_CTRL_FIFO_EMPTY1r = 3566, + SMMU0_SMMU0_CTRL_FIFO_EMPTY2r = 3567, + SMMU0_SMMU0_CTRL_FIFO_EMPTY3r = 3568, + SMMU0_SMMU0_CTRL_FIFO_EMPTY4r = 3569, + SMMU0_SMMU0_CTRL_FIFO_EMPTY5r = 3570, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY0r = 3571, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY1r = 3572, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY2r = 3573, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY3r = 3574, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY4r = 3575, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY5r = 3576, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY6r = 3577, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY7r = 3578, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY8r = 3579, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY9r = 3580, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY10r = 3581, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY11r = 3582, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY12r = 3583, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY13r = 3584, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY14r = 3585, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY15r = 3586, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY16r = 3587, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY17r = 3588, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY18r = 3589, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY19r = 3590, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY20r = 3591, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY21r = 3592, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY22r = 3593, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY23r = 3594, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY24r = 3595, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY25r = 3596, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY26r = 3597, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY27r = 3598, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY28r = 3599, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY29r = 3600, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY30r = 3601, + SMMU0_SMMU0_KSCHD_FIFO_EMPTY31r = 3602, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY0r = 3603, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY1r = 3604, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY2r = 3605, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY3r = 3606, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY4r = 3607, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY5r = 3608, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY6r = 3609, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY7r = 3610, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY8r = 3611, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY9r = 3612, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY10r = 3613, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY11r = 3614, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY12r = 3615, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY13r = 3616, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY14r = 3617, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY15r = 3618, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY16r = 3619, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY17r = 3620, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY18r = 3621, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY19r = 3622, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY20r = 3623, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY21r = 3624, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY22r = 3625, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY23r = 3626, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY24r = 3627, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY25r = 3628, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY26r = 3629, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY27r = 3630, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY28r = 3631, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY29r = 3632, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY30r = 3633, + SMMU0_SMMU0_RSCHD_FIFO_EMPTY31r = 3634, + SMMU0_SMMU0_EPT_FLAGr = 3635, + SMMU0_SMMU0_PPU_SOFT_RSTr = 3636, + SMMU0_SMMU0_SMMU0_AS_MAC_AGE_FC_CNTr = 3637, + SMMU0_SMMU0_SMMU0_MARC_SE_PARSER_FC_CNTr = 3638, + SMMU0_SMMU0_WR_ARB_CPU_FC_CNTr = 3639, + SMMU0_SMMU0_SMMU0_LPM_AS_FC_CNTr = 3640, + SMMU0_SMMU0_LPM_AS_SMMU0_FC_CNTr = 3641, + SMMU0_SMMU0_SMMU0_ETCAM1_0_AS_FC_CNTr = 3642, + SMMU0_SMMU0_AS_ETCAM1_0_SMMU0_FC_CNTr = 3643, + SMMU0_SMMU0_SMMU0_PPU_MCAST_FC_CNTr = 3644, + SMMU0_SMMU0_PPU_SMMU0_MCAST_FC_CNTr = 3645, + SMMU0_SMMU0_ODMA_SMMU0_TDM_FC_RSP_FC_CNTr = 3646, + SMMU0_SMMU0_SMMU0_ODMA_TDM_FC_KEY_FC_CNTr = 3647, + SMMU0_SMMU0_SMMU0_ODMA_FC_CNTr = 3648, + SMMU0_SMMU0_SMMU0_CFG_TAB_RD_FC_CNTr = 3649, + SMMU0_SMMU0_SMMU0_STAT_FC15_0_CNTr = 3650, + SMMU0_SMMU0_STAT_SMMU0_FC15_0_CNTr = 3651, + SMMU0_SMMU0_SMMU0_PPU_MEX5_0_FC_CNTr = 3652, + SMMU0_SMMU0_PPU_SMMU0_MEX5_0_FC_CNTr = 3653, + SMMU0_SMMU0_AS_SMMU0_MAC_AGE_REQ_CNTr = 3654, + SMMU0_SMMU0_SE_PARSER_SMMU0_MARC_KEY_CNTr = 3655, + SMMU0_SMMU0_CPU_IND_RDAT_CNTr = 3656, + SMMU0_SMMU0_CPU_IND_RD_REQ_CNTr = 3657, + SMMU0_SMMU0_CPU_IND_WR_REQ_CNTr = 3658, + SMMU0_SMMU0_SMMU0_PLCR_RSP0_CNTr = 3659, + SMMU0_SMMU0_PLCR_SMMU0_REQ0_CNTr = 3660, + SMMU0_SMMU0_SMMU0_LPM_AS_RSP_CNTr = 3661, + SMMU0_SMMU0_LPM_AS_SMMU0_REQ_CNTr = 3662, + SMMU0_SMMU0_SMMU0_ETCAM1_0_AS_RSP_CNTr = 3663, + SMMU0_SMMU0_ETCAM1_0_AS_SMMU0_REQ_CNTr = 3664, + SMMU0_SMMU0_SMMU0_PPU_MCAST_RSP_CNTr = 3665, + SMMU0_SMMU0_PPU_SMMU0_MCAST_KEY_CNTr = 3666, + SMMU0_SMMU0_SMMU0_ODMA_TDM_MC_RSP_CNTr = 3667, + SMMU0_SMMU0_ODMA_SMMU0_TDM_MC_KEY_CNTr = 3668, + SMMU0_SMMU0_SMMU0_ODMA_RSP_CNTr = 3669, + SMMU0_SMMU0_ODMA_SMMU0_CMD_CNTr = 3670, + SMMU0_SMMU0_SMMU0_CFG_TAB_RDAT_CNTr = 3671, + SMMU0_SMMU0_CFG_SMMU0_TAB_RD_CNTr = 3672, + SMMU0_SMMU0_SMMU0_STAT_RSP15_0_CNTr = 3673, + SMMU0_SMMU0_STAT_SMMU0_REQ15_0_CNTr = 3674, + SMMU0_SMMU0_SMMU0_PPU_MEX5_0_RSP_CNTr = 3675, + SMMU0_SMMU0_PPU_SMMU0_MEX5_0_KEY_CNTr = 3676, + SMMU0_SMMU0_FTM_STAT_SMMU0_REQ0_CNTr = 3677, + SMMU0_SMMU0_FTM_STAT_SMMU0_REQ1_CNTr = 3678, + SMMU0_SMMU0_ETM_STAT_SMMU0_REQ0_CNTr = 3679, + SMMU0_SMMU0_ETM_STAT_SMMU0_REQ1_CNTr = 3680, + SMMU0_SMMU0_REQ_ERAM0_31_RD_CNTr = 3681, + SMMU0_SMMU0_REQ_ERAM0_31_WR_CNTr = 3682, + SE_SMMU1_DDR_WDAT1r = 3683, + SE_SMMU1_DDR_WDAT2r = 3684, + SE_SMMU1_DDR_WDAT3r = 3685, + SE_SMMU1_DDR_WDAT4r = 3686, + SE_SMMU1_DDR_WDAT5r = 3687, + SE_SMMU1_DDR_WDAT6r = 3688, + SE_SMMU1_DDR_WDAT7r = 3689, + SE_SMMU1_DDR_WDAT8r = 3690, + SE_SMMU1_DDR_WDAT9r = 3691, + SE_SMMU1_DDR_WDAT10r = 3692, + SE_SMMU1_DDR_WDAT11r = 3693, + SE_SMMU1_DDR_WDAT12r = 3694, + SE_SMMU1_DDR_WDAT13r = 3695, + SE_SMMU1_DDR_WDAT14r = 3696, + SE_SMMU1_DDR_WDAT15r = 3697, + SE_SMMU1_CNT_STAT_CACHE_ENr = 3698, + SE_SMMU1_CNT_STAT_CACHE_CLRr = 3699, + SE_SMMU1_CNT_STAT_CACHE_REQ_63_32r = 3700, + SE_SMMU1_CNT_STAT_CACHE_REQ_31_0r = 3701, + SE_SMMU1_CNT_STAT_CACHE_HIT_63_32r = 3702, + SE_SMMU1_CNT_STAT_CACHE_HIT_31_0r = 3703, + SE_SMMU1_DDR_CMD0r = 3704, + SE_SMMU1_INFO_ADDRr = 3705, + SE_SMMU1_DDR_CMD1r = 3706, + SE_SMMU1_CLR_START_ADDRr = 3707, + SE_SMMU1_CLR_END_ADDRr = 3708, + SE_SMMU1_CLR_TBL_ENr = 3709, + SE_SMMU1_DEBUG_CNT_MODEr = 3710, + SE_SMMU1_INIT_DONEr = 3711, + SE_SMMU1_CPU_RSP_RD_DONEr = 3712, + SE_SMMU1_KSCH_OAM_SP_ENr = 3713, + SE_SMMU1_CFG_CACHE_ENr = 3714, + SE_SMMU1_CACHE_AGE_ENr = 3715, + SE_SMMU1_CPU_RDAT0r = 3716, + SE_SMMU1_CPU_RDAT1r = 3717, + SE_SMMU1_CPU_RDAT2r = 3718, + SE_SMMU1_CPU_RDAT3r = 3719, + SE_SMMU1_CPU_RDAT4r = 3720, + SE_SMMU1_CPU_RDAT5r = 3721, + SE_SMMU1_CPU_RDAT6r = 3722, + SE_SMMU1_CPU_RDAT7r = 3723, + SE_SMMU1_CPU_RDAT8r = 3724, + SE_SMMU1_CPU_RDAT9r = 3725, + SE_SMMU1_CPU_RDAT10r = 3726, + SE_SMMU1_CPU_RDAT11r = 3727, + SE_SMMU1_CPU_RDAT12r = 3728, + SE_SMMU1_CPU_RDAT13r = 3729, + SE_SMMU1_CPU_RDAT14r = 3730, + SE_SMMU1_CPU_RDAT15r = 3731, + SE_SMMU1_CTRL_CPU_RD_RDYr = 3732, + SE_SMMU1_CPU_WARBI_RDY_CFGr = 3733, + SE_SMMU1_DIR_ARBI_CPU_RPFULr = 3734, + SE_SMMU1_DIR_ARBI_WPFULr = 3735, + SE_SMMU1_CFG_WR_ARBI_PFUL0r = 3736, + SE_SMMU1_CFG_WR_ARBI_PFUL1r = 3737, + SE_SMMU1_SMMU1_WDONE_PFUL_CFGr = 3738, + SE_SMMU1_STAT_RATE_CFG_CNTr = 3739, + SE_SMMU1_FTM_RATE_CFG_CNTr = 3740, + SE_SMMU1_ETM_RATE_CFG_CNTr = 3741, + SE_SMMU1_DIR_RATE_CFG_CNTr = 3742, + SE_SMMU1_HASH_RATE_CFG_CNTr = 3743, + SE_SMMU1_FTM_TBL_CFGr = 3744, + SE_SMMU1_LPM_V4_AS_TBL_CFGr = 3745, + SE_SMMU1_LPM_V4_TBL_CFGr = 3746, + SE_SMMU1_LPM_V6_TBL_CFGr = 3747, + SE_SMMU1_LPM_V6_AS_TBL_CFGr = 3748, + SE_SMMU1_DMA_TBL_CFGr = 3749, + SE_SMMU1_OAM_TBL_CFGr = 3750, + SE_SMMU1_CTRL_RPAR_CPU_PFULr = 3751, + SE_SMMU1_CFG_KSCH_DIR_PFULr = 3752, + SE_SMMU1_CFG_KSCH_HASH_PFULr = 3753, + SE_SMMU1_CFG_KSCH_LPM_PFULr = 3754, + SE_SMMU1_CFG_KSCH_LPM_AS_PFULr = 3755, + SE_SMMU1_CFG_KSCH_STAT_PFULr = 3756, + SE_SMMU1_CFG_KSCH_TM_PFULr = 3757, + SE_SMMU1_CFG_KSCH_OAM_PFULr = 3758, + SE_SMMU1_CFG_KSCH_DMA_PFULr = 3759, + SE_SMMU1_CTRL_WFIFO_CFGr = 3760, + SE_SMMU1_RSCH_HASH_PTR_CFGr = 3761, + SE_SMMU1_RSCH_LPM_PTR_CFGr = 3762, + SE_SMMU1_RSCH_LPM_AS_PTR_CFGr = 3763, + SE_SMMU1_RSCH_STAT_PTR_CFGr = 3764, + SE_SMMU1_RSCH_OAM_PTR_CFGr = 3765, + SE_SMMU1_RSCHD_FIFO_PEPT_CFGr = 3766, + SE_SMMU1_DIR_FIFO_PFUL_CFGr = 3767, + SE_SMMU1_HASH_FIFO_PFUL_CFGr = 3768, + SE_SMMU1_LPM_FIFO_PFUL_CFGr = 3769, + SE_SMMU1_LPM_AS_FIFO_PFUL_CFGr = 3770, + SE_SMMU1_STAT_FIFO_PFUL_CFGr = 3771, + SE_SMMU1_FTM_FIFO_PFUL_CFGr = 3772, + SE_SMMU1_ETM_FIFO_PFUL_CFGr = 3773, + SE_SMMU1_OAM_FIFO_PFUL_CFGr = 3774, + SE_SMMU1_DMA_FIFO_PFUL_CFGr = 3775, + SE_SMMU1_CACHE_RSP_RR_FIFO_CFGr = 3776, + SE_SMMU1_DDR_RSP_RR_FIFO_CFGr = 3777, + SE_SMMU1_CPU_CAHCE_FIFO_CFGr = 3778, + SE_SMMU1_CACHE_RSP_FIFO_CFGr = 3779, + SE_SMMU1_TEST_STATEr = 3780, + SE_SMMU1_CACHE_FIFO_EPTr = 3781, + SE_SMMU1_RR_FIFO_EPTr = 3782, + SE_SMMU1_WR_FIFO_EPTr = 3783, + SE_SMMU1_WDONE_FIFO_EPTr = 3784, + SE_SMMU1_KSCHD_FIFO_EPT0r = 3785, + SE_SMMU1_CASH_FIFO_EPTr = 3786, + SE_SMMU1_CTRL_FIFO_EPTr = 3787, + SE_SMMU1_SMMU1_RSCHD_EPT3r = 3788, + SE_SMMU1_SMMU1_RSCHD_EPT2r = 3789, + SE_SMMU1_SMMU1_RSCHD_EPT1r = 3790, + SE_SMMU1_SMMU1_RSCHD_EPT0r = 3791, + SE_SMMU1_CASH0_ECC_ERR_ADDRr = 3792, + SE_SMMU1_ARBI_CPU_WR_RDYr = 3793, + SE_SMMU1_SMMU1_INT_0_ENr = 3794, + SE_SMMU1_SMMU1_INT_0_MASKr = 3795, + SE_SMMU1_SMMU1_INT_1_ENr = 3796, + SE_SMMU1_SMMU1_INT_1_MASKr = 3797, + SE_SMMU1_SMMU1_INT_2_ENr = 3798, + SE_SMMU1_SMMU1_INT_2_MASKr = 3799, + SE_SMMU1_SMMU1_INT_3_ENr = 3800, + SE_SMMU1_SMMU1_INT_3_MASKr = 3801, + SE_SMMU1_SMMU1_INT_0_STATUSr = 3802, + SE_SMMU1_SMMU1_INT_1_STATUSr = 3803, + SE_SMMU1_SMMU1_INT_2_STATUSr = 3804, + SE_SMMU1_SMMU1_INT_3_STATUSr = 3805, + SE_SMMU1_SMMU1_INT_STATUSr = 3806, + SE_SMMU1_CTRL_TO_CASH7_0_FC_CNTr = 3807, + SE_SMMU1_CASH7_0_TO_CTRL_REQ_CNTr = 3808, + SE_SMMU1_RSCHD_TO_CACHE7_FC_CNTr = 3809, + SE_SMMU1_CASH7_TO_CACHE_RSP_CNTr = 3810, + SE_SMMU1_CASH7_TO_CTRL_FC_CNTr = 3811, + SE_SMMU1_CTRL_TO_CASH7_0_RSP_CNTr = 3812, + SE_SMMU1_KSCHD_TO_CACHE7_0_REQ_CNTr = 3813, + SE_SMMU1_CACHE7_0_TO_KSCHD_FC_CNTr = 3814, + SE_SMMU1_DMA_TO_SMMU1_RD_REQ_CNTr = 3815, + SE_SMMU1_OAM_TO_KSCHD_REQ_CNTr = 3816, + SE_SMMU1_OAM_RR_STATE_RSP_CNTr = 3817, + SE_SMMU1_OAM_CLASH_INFO_CNTr = 3818, + SE_SMMU1_OAM_TO_RR_REQ_CNTr = 3819, + SE_SMMU1_LPM_AS_TO_KSCHD_REQ_CNTr = 3820, + SE_SMMU1_LPM_AS_RR_STATE_RSP_CNTr = 3821, + SE_SMMU1_LPM_AS_CLASH_INFO_CNTr = 3822, + SE_SMMU1_LPM_AS_TO_RR_REQ_CNTr = 3823, + SE_SMMU1_LPM_TO_KSCHD_REQ_CNTr = 3824, + SE_SMMU1_LPM_RR_STATE_RSP_CNTr = 3825, + SE_SMMU1_LPM_CLASH_INFO_CNTr = 3826, + SE_SMMU1_LPM_TO_RR_REQ_CNTr = 3827, + SE_SMMU1_HASH3_0_TO_KSCHD_REQ_CNTr = 3828, + SE_SMMU1_HASH3_0_RR_STATE_RSP_CNTr = 3829, + SE_SMMU1_HASH3_0_CLASH_INFO_CNTr = 3830, + SE_SMMU1_HASH3_0_TO_RR_REQ_CNTr = 3831, + SE_SMMU1_DIR3_0_TO_KSCHD_REQ_CNTr = 3832, + SE_SMMU1_DIR3_0_CLASH_INFO_CNTr = 3833, + SE_SMMU1_DIR_TBL_WR_REQ_CNTr = 3834, + SE_SMMU1_WARBI_TO_DIR_TBL_WARBI_FC_CNTr = 3835, + SE_SMMU1_DIR3_0_TO_BANK_RR_REQ_CNTr = 3836, + SE_SMMU1_KSCHD_TO_DIR3_0_FC_CNTr = 3837, + SE_SMMU1_DIR3_0_RR_STATE_RSP_CNTr = 3838, + SE_SMMU1_WR_DONE_TO_WARBI_FC_CNTr = 3839, + SE_SMMU1_WR_DONE_PTR_REQ_CNTr = 3840, + SE_SMMU1_CTRL7_0_TO_WARBI_FC_CNTr = 3841, + SE_SMMU1_WARBI_TO_CTRL7_0_WR_REQ_CNTr = 3842, + SE_SMMU1_WARBI_TO_CASH7_0_WR_REQ_CNTr = 3843, + SE_SMMU1_WARBI_TO_CPU_WR_FC_CNTr = 3844, + SE_SMMU1_CPU_WR_REQ_CNTr = 3845, + SE_SMMU1_CTRL7_0_TO_CPU_RD_RSP_CNTr = 3846, + SE_SMMU1_CPU_TO_CTRL7_0_RD_REQ_CNTr = 3847, + SE_SMMU1_CPU_RD_DIR_TBL_RSP_CNTr = 3848, + SE_SMMU1_CPU_TO_DIR_TBL_RD_WR_REQ_CNTr = 3849, + SE_SMMU1_SMMU1_TO_MMU_7_0_RSP_FC_CNTr = 3850, + SE_SMMU1_MMU_7_0_TO_SMMU1_RD_RSP_CNTr = 3851, + SE_SMMU1_MMU_7_0_TO_SMMU1_RD_FC_CNTr = 3852, + SE_SMMU1_SMMU1_TO_MMU_7_RD_REQ_CNTr = 3853, + SE_SMMU1_MMU_7_TO_SMMU1_WR_FC_CNTr = 3854, + SE_SMMU1_SMMU1_TO_MMU_7_0_WR_REQ_CNTr = 3855, + SE_SMMU1_SE_TO_SMMU1_WR_RSP_FC_CNTr = 3856, + SE_SMMU1_SMMU1_TO_SE_WR_RSP_CNTr = 3857, + SE_SMMU1_DDR7_0_WR_RSP_CNTr = 3858, + SE_SMMU1_SMMU1_TO_AS_FC_CNTr = 3859, + SE_SMMU1_AS_TO_SMMU1_WR_REQ_CNTr = 3860, + SE_SMMU1_SMMU1_TO_SE_PARSER_FC_CNTr = 3861, + SE_SMMU1_SE_PARSER_TO_SMMU1_REQ_CNTr = 3862, + SE_SMMU1_SMMU1_TO_ETM_WR_FC_CNTr = 3863, + SE_SMMU1_ETM_WR_REQ_CNTr = 3864, + SE_SMMU1_SMMU1_TO_FTM_WR_FC_CNTr = 3865, + SE_SMMU1_FTM_WR_REQ_CNTr = 3866, + SE_SMMU1_SMMU1_TO_STATE_WR_FC_CNTr = 3867, + SE_SMMU1_STATE_WR_REQ_CNTr = 3868, + SE_SMMU1_SE_TO_DMA_RSP_CNTr = 3869, + SE_SMMU1_SE_TO_DMA_FC_CNTr = 3870, + SE_SMMU1_OAM_TO_SMMU1_FC_CNTr = 3871, + SE_SMMU1_SMMU1_TO_OAM_RSP_CNTr = 3872, + SE_SMMU1_SMMU1_TO_OAM_FC_CNTr = 3873, + SE_SMMU1_OAM_TO_SMMU1_REQ_CNTr = 3874, + SE_SMMU1_SMMU1_TO_ETM_RSP_CNTr = 3875, + SE_SMMU1_SMMU1_TO_FTM_RSP_CNTr = 3876, + SE_SMMU1_SMMU1_TO_ETM_FC_CNTr = 3877, + SE_SMMU1_ETM_TO_SMMU1_REQ_CNTr = 3878, + SE_SMMU1_SMMU1_TO_FTM_FC_CNTr = 3879, + SE_SMMU1_FTM_TO_SMMU1_REQ_CNTr = 3880, + SE_SMMU1_SMMU1_TO_STAT_RSP_CNTr = 3881, + SE_SMMU1_SMMU1_TO_STAT_FC_CNTr = 3882, + SE_SMMU1_STAT_TO_SMMU1_REQ_CNTr = 3883, + SE_SMMU1_LPM_AS_TO_SMMU1_FC_CNTr = 3884, + SE_SMMU1_LPM_TO_SMMU1_FC_CNTr = 3885, + SE_SMMU1_SMMU1_TO_LPM_AS_RSP_CNTr = 3886, + SE_SMMU1_SMMU1_TO_LPM_RSP_CNTr = 3887, + SE_SMMU1_SMMU1_TO_LPM_AS_FC_CNTr = 3888, + SE_SMMU1_SMMU1_TO_LPM_FC_CNTr = 3889, + SE_SMMU1_LPM_AS_TO_SMMU1_REQ_CNTr = 3890, + SE_SMMU1_LPM_TO_SMMU1_REQ_CNTr = 3891, + SE_SMMU1_HASH3_0_TO_SMMU1_FC_CNTr = 3892, + SE_SMMU1_SMMU1_TO_HASH3_0_RSP_CNTr = 3893, + SE_SMMU1_SMMU1_TO_HASH3_0_FC_CNTr = 3894, + SE_SMMU1_HASH3_0_TO_SMMU1_CNTr = 3895, + SE_SMMU1_SE_TO_SMMU1_DIR3_0_RSP_FC_CNTr = 3896, + SE_SMMU1_SMMU1_TO_SE_DIR3_0_RSP_CNTr = 3897, + SE_SMMU1_SMMU1_TO_SE_DIR3_0_FC_CNTr = 3898, + SE_SMMU1_SE_TO_SMMU1_DIR3_0_CNTr = 3899, + SE_SMMU1_CACHE7_0_TO_RSCHD_RSP_CNTr = 3900, + SE_CMMU_DDR_RW_ADDRr = 3901, + SE_CMMU_DDR_RW_MODEr = 3902, + SE_CMMU_CP_CMDr = 3903, + SE_CMMU_CPU_IND_RD_DONEr = 3904, + SE_CMMU_CPU_IND_RDAT0r = 3905, + SE_CMMU_CPU_IND_RDAT1r = 3906, + SE_CMMU_CPU_IND_RDAT2r = 3907, + SE_CMMU_CPU_IND_RDAT3r = 3908, + SE_CMMU_CPU_DDR_FIFO_ALMFULr = 3909, + SE_CMMU_DEBUG_CNT_MODEr = 3910, + SE_CMMU_CMMU_PFUL_CFGr = 3911, + SE_CMMU_CMMU_STAT_PFUL_CFGr = 3912, + SE_CMMU_STAT_OVERFLOW_MODEr = 3913, + SE_CMMU_CMMU_CP_FIFO_PFULr = 3914, + SE_CMMU_DDR_WR_DAT0r = 3915, + SE_CMMU_DDR_WR_DAT1r = 3916, + SE_CMMU_CMMU_INT_UNMASK_FLAGr = 3917, + SE_CMMU_CMMU_INT_ENr = 3918, + SE_CMMU_CMMU_INT_MASKr = 3919, + SE_CMMU_CMMU_INT_STATUSr = 3920, + SE_CMMU_STAT_CMMU_REQ_CNTr = 3921, + SE_CMMU_CMMU_FC0_CNTr = 3922, + SE_CMMU_CMMU_FC1_CNTr = 3923, + SE_CMMU_CMMU_FC2_CNTr = 3924, + SMMU14K_SE_SMMU1_HASH0_TBL0_CFGr = 3925, + SMMU14K_SE_SMMU1_HASH0_TBL1_CFGr = 3926, + SMMU14K_SE_SMMU1_HASH0_TBL2_CFGr = 3927, + SMMU14K_SE_SMMU1_HASH0_TBL3_CFGr = 3928, + SMMU14K_SE_SMMU1_HASH0_TBL4_CFGr = 3929, + SMMU14K_SE_SMMU1_HASH0_TBL5_CFGr = 3930, + SMMU14K_SE_SMMU1_HASH0_TBL6_CFGr = 3931, + SMMU14K_SE_SMMU1_HASH0_TBL7_CFGr = 3932, + SMMU14K_SE_SMMU1_HASH1_TBL0_CFGr = 3933, + SMMU14K_SE_SMMU1_HASH1_TBL1_CFGr = 3934, + SMMU14K_SE_SMMU1_HASH1_TBL2_CFGr = 3935, + SMMU14K_SE_SMMU1_HASH1_TBL3_CFGr = 3936, + SMMU14K_SE_SMMU1_HASH1_TBL4_CFGr = 3937, + SMMU14K_SE_SMMU1_HASH1_TBL5_CFGr = 3938, + SMMU14K_SE_SMMU1_HASH1_TBL6_CFGr = 3939, + SMMU14K_SE_SMMU1_HASH1_TBL7_CFGr = 3940, + SMMU14K_SE_SMMU1_HASH2_TBL0_CFGr = 3941, + SMMU14K_SE_SMMU1_HASH2_TBL1_CFGr = 3942, + SMMU14K_SE_SMMU1_HASH2_TBL2_CFGr = 3943, + SMMU14K_SE_SMMU1_HASH2_TBL3_CFGr = 3944, + SMMU14K_SE_SMMU1_HASH2_TBL4_CFGr = 3945, + SMMU14K_SE_SMMU1_HASH2_TBL5_CFGr = 3946, + SMMU14K_SE_SMMU1_HASH2_TBL6_CFGr = 3947, + SMMU14K_SE_SMMU1_HASH2_TBL7_CFGr = 3948, + SMMU14K_SE_SMMU1_HASH3_TBL0_CFGr = 3949, + SMMU14K_SE_SMMU1_HASH3_TBL1_CFGr = 3950, + SMMU14K_SE_SMMU1_HASH3_TBL2_CFGr = 3951, + SMMU14K_SE_SMMU1_HASH3_TBL3_CFGr = 3952, + SMMU14K_SE_SMMU1_HASH3_TBL4_CFGr = 3953, + SMMU14K_SE_SMMU1_HASH3_TBL5_CFGr = 3954, + SMMU14K_SE_SMMU1_HASH3_TBL6_CFGr = 3955, + SMMU14K_SE_SMMU1_HASH3_TBL7_CFGr = 3956, + STAT_STAT_CFG_CPU_IND_ERAM_WDAT1r = 3957, + STAT_STAT_CFG_CPU_IND_ERAM_WDAT2r = 3958, + STAT_STAT_CFG_CPU_IND_ERAM_WDAT3r = 3959, + STAT_STAT_CFG_CPU_IND_ERAM_REQ_INFOr = 3960, + STAT_STAT_CFG_CPU_IND_ERAM_RD_DONEr = 3961, + STAT_STAT_CFG_CPU_IND_ERAM_RDAT0r = 3962, + STAT_STAT_CFG_CPU_IND_ERAM_RDAT1r = 3963, + STAT_STAT_CFG_CPU_IND_ERAM_RDAT2r = 3964, + STAT_STAT_CFG_CPU_IND_ERAM_RDAT3r = 3965, + STAT_STAT_CFG_TM_ALU_ERAM_CPU_RDYr = 3966, + STAT_STAT_CFG_OAM_STAT_CFGr = 3967, + STAT_STAT_CFG_FTM_PORT_SEL_CFGr = 3968, + STAT_STAT_CFG_OAM_ERAM_BASE_ADDRr = 3969, + STAT_STAT_CFG_OAM_LM_ERAM_BASE_ADDRr = 3970, + STAT_STAT_CFG_OAM_DDR_BASE_ADDRr = 3971, + STAT_STAT_CFG_PLCR0_SCHD_PFUL_CFGr = 3972, + STAT_STAT_CFG_OAM_LM_ORD_PFUL_CFGr = 3973, + STAT_STAT_CFG_DDR_SCHD_PFUL_CFGr = 3974, + STAT_STAT_CFG_ERAM_SCHD_PFUL_CFGr = 3975, + STAT_STAT_CFG_ERAM_SCHD_PEPT_CFGr = 3976, + STAT_STAT_CFG_ERAM_SCHD_OAM_PFUL_CFGr = 3977, + STAT_STAT_CFG_ERAM_SCHD_OAM_PEPT_CFGr = 3978, + STAT_STAT_CFG_ERAM_SCHD_OAM_LM_PFUL_CFGr = 3979, + STAT_STAT_CFG_ERAM_SCHD_OAM_LM_PEPT_CFGr = 3980, + STAT_STAT_CFG_RSCHD_PFUL_CFGr = 3981, + STAT_STAT_CFG_RSCHD_PEPT_CFGr = 3982, + STAT_STAT_CFG_RSCHD_PLCR_PFUL_CFGr = 3983, + STAT_STAT_CFG_RSCHD_PLCR_PEPT_CFGr = 3984, + STAT_STAT_CFG_RSCHD_PLCR_INFO_PFUL_CFGr = 3985, + STAT_STAT_CFG_ALU_ARB_CPU_PFUL_CFGr = 3986, + STAT_STAT_CFG_ALU_ARB_USER_PFUL_CFGr = 3987, + STAT_STAT_CFG_ALU_ARB_STAT_PFUL_CFGr = 3988, + STAT_STAT_CFG_CYCMOV_DAT_PFUL_CFGr = 3989, + STAT_STAT_CFG_DDR_OPR_PFUL_CFGr = 3990, + STAT_STAT_CFG_CYCLE_MOV_PFUL_CFGr = 3991, + STAT_STAT_CFG_CNTOVF_PFUL_CFGr = 3992, + STAT_STAT_CFG_ERAM_SCHD_PLCR_PFUL_CFGr = 3993, + STAT_STAT_CFG_ERAM_SCHD_PLCR_PEPT_CFGr = 3994, + STAT_STAT_CFG_DEBUG_CNT_MODEr = 3995, + STAT_STAT_CFG_TM_MOV_PERIOD_CFGr = 3996, + STAT_STAT_CFG_ALU_DDR_CPU_REQ_PFUL_CFGr = 3997, + STAT_STAT_CFG_CYCMOV_ADDR_PFUL_CFGr = 3998, + STAT_STAT_CFG_ORD_DDR_PLCR_FIFO_EMPTYr = 3999, + STAT_STAT_CFG_TM_STAT_FIFO_EMPTYr = 4000, + STAT_STAT_CFG_ERAM_SCHD_FIFO_EMPTY_0_1r = 4001, + STAT_STAT_CFG_ERAM_SCHD_FIFO_EMPTY_2_3r = 4002, + STAT_STAT_CFG_ERAM_SCHD_FIFO_EMPTY_4_5r = 4003, + STAT_STAT_CFG_ERAM_SCHD_FIFO_EMPTY_6_7r = 4004, + STAT_STAT_CFG_ERAM_SCHD_FIFO_EMPTY_FREE_8r = 4005, + STAT_STAT_CFG_RSCHD_FIFO_EMPTY_0_3r = 4006, + STAT_STAT_CFG_RSCHD_FIFO_EMPTY_4_7r = 4007, + STAT_STAT_CFG_RSCHD_FIFO_EMPTY_8_11r = 4008, + STAT_STAT_CFG_RSCHD_FIFO_EMPTY_12_15r = 4009, + STAT_STAT_CFG_RSCHD_FIFO_EMPTY_PLCR_16_17r = 4010, + STAT_STAT_CFG_STAT_INT_UNMASK_FLAGr = 4011, + STAT_STAT_CFG_STAT_INT0_ENr = 4012, + STAT_STAT_CFG_STAT_INT0_MASKr = 4013, + STAT_STAT_CFG_STAT_INT0_STATUSr = 4014, + STAT_STAT_CFG_STAT_INT1_ENr = 4015, + STAT_STAT_CFG_STAT_INT1_MASKr = 4016, + STAT_STAT_CFG_STAT_INT1_STATUSr = 4017, + STAT_STAT_CFG_STAT_INT2_ENr = 4018, + STAT_STAT_CFG_STAT_INT2_MASKr = 4019, + STAT_STAT_CFG_STAT_INT2_STATUSr = 4020, + STAT_STAT_CFG_STAT_INT3_ENr = 4021, + STAT_STAT_CFG_STAT_INT3_MASKr = 4022, + STAT_STAT_CFG_STAT_INT3_STATUSr = 4023, + STAT_STAT_CFG_STAT_INT4_ENr = 4024, + STAT_STAT_CFG_STAT_INT4_MASKr = 4025, + STAT_STAT_CFG_STAT_INT4_STATUSr = 4026, + STAT_STAT_CFG_STAT_INT5_ENr = 4027, + STAT_STAT_CFG_STAT_INT5_MASKr = 4028, + STAT_STAT_CFG_STAT_INT5_STATUSr = 4029, + STAT_STAT_CFG_RSCHD_ECC_BYPASSr = 4030, + STAT_STAT_CFG_RSCHD_ECC_SINGLE_ERRr = 4031, + STAT_STAT_CFG_RSCHD_ECC_DOUBLE_ERRr = 4032, + STAT_STAT_CFG_CPU_IND_DDR_WDAT0r = 4033, + STAT_STAT_CFG_CPU_IND_DDR_WDAT1r = 4034, + STAT_STAT_CFG_CPU_IND_DDR_WDAT2r = 4035, + STAT_STAT_CFG_CPU_IND_DDR_WDAT3r = 4036, + STAT_STAT_CFG_CPU_IND_DDR_WDAT4r = 4037, + STAT_STAT_CFG_CPU_IND_DDR_WDAT5r = 4038, + STAT_STAT_CFG_CPU_IND_DDR_WDAT6r = 4039, + STAT_STAT_CFG_CPU_IND_DDR_WDAT7r = 4040, + STAT_STAT_CFG_CPU_IND_DDR_WDAT8r = 4041, + STAT_STAT_CFG_CPU_IND_DDR_WDAT9r = 4042, + STAT_STAT_CFG_CPU_IND_DDR_WDAT10r = 4043, + STAT_STAT_CFG_CPU_IND_DDR_WDAT11r = 4044, + STAT_STAT_CFG_CPU_IND_DDR_WDAT12r = 4045, + STAT_STAT_CFG_CPU_IND_DDR_WDAT13r = 4046, + STAT_STAT_CFG_CPU_IND_DDR_WDAT14r = 4047, + STAT_STAT_CFG_CPU_IND_DDR_WDAT15r = 4048, + STAT_STAT_CFG_CPU_IND_DDR_REQ_INFOr = 4049, + STAT_STAT_CFG_CPU_IND_DDR_RD_DONEr = 4050, + STAT_STAT_CFG_CPU_IND_DDR_RDAT0r = 4051, + STAT_STAT_CFG_CPU_IND_DDR_RDAT1r = 4052, + STAT_STAT_CFG_CPU_IND_DDR_RDAT2r = 4053, + STAT_STAT_CFG_CPU_IND_DDR_RDAT3r = 4054, + STAT_STAT_CFG_CPU_IND_DDR_RDAT4r = 4055, + STAT_STAT_CFG_CPU_IND_DDR_RDAT5r = 4056, + STAT_STAT_CFG_CPU_IND_DDR_RDAT6r = 4057, + STAT_STAT_CFG_CPU_IND_DDR_RDAT7r = 4058, + STAT_STAT_CFG_CPU_IND_DDR_RDAT8r = 4059, + STAT_STAT_CFG_CPU_IND_DDR_RDAT9r = 4060, + STAT_STAT_CFG_CPU_IND_DDR_RDAT10r = 4061, + STAT_STAT_CFG_CPU_IND_DDR_RDAT11r = 4062, + STAT_STAT_CFG_CPU_IND_DDR_RDAT12r = 4063, + STAT_STAT_CFG_CPU_IND_DDR_RDAT13r = 4064, + STAT_STAT_CFG_CPU_IND_DDR_RDAT14r = 4065, + STAT_STAT_CFG_CPU_IND_DDR_RDAT15r = 4066, + STAT_STAT_CFG_TM_ALU_DDR_CPU_RDYr = 4067, + STAT_STAT_CFG_EPT_FLAGr = 4068, + STAT_STAT_CFG_PPU_SOFT_RSTr = 4069, + STAT_STAT_CFG_STAT_SMMU0_FC15_0_CNTr = 4070, + STAT_STAT_CFG_SMMU0_STAT_FC15_0_CNTr = 4071, + STAT_STAT_CFG_SMMU0_STAT_RSP15_0_CNTr = 4072, + STAT_STAT_CFG_STAT_SMMU0_REQ15_0_CNTr = 4073, + STAT_STAT_CFG_PPU_STAT_MEC5_0_RSP_FC_CNTr = 4074, + STAT_STAT_CFG_STAT_PPU_MEC5_0_KEY_FC_CNTr = 4075, + STAT_STAT_CFG_STAT_PPU_MEC5_0_RSP_CNTr = 4076, + STAT_STAT_CFG_PPU_STAT_MEC5_0_KEY_CNTr = 4077, + STAT_STAT_CFG_PPU5_0_NO_EXIST_OPCD_EX_CNTr = 4078, + STAT_STAT_CFG_SE_ETM_STAT_WR_FC_CNTr = 4079, + STAT_STAT_CFG_SE_ETM_STAT_RD_FC_CNTr = 4080, + STAT_STAT_CFG_STAT_ETM_DEQ_FC_CNTr = 4081, + STAT_STAT_CFG_STAT_ETM_ENQ_FC_CNTr = 4082, + STAT_STAT_CFG_STAT_OAM_LM_FC_CNTr = 4083, + STAT_STAT_CFG_OAM_STAT_LM_FC_CNTr = 4084, + STAT_STAT_CFG_STAT_OAM_FC_CNTr = 4085, + STAT_STAT_CFG_CMMU_STAT_FC_CNTr = 4086, + STAT_STAT_CFG_STAT_CMMU_REQ_CNTr = 4087, + STAT_STAT_CFG_SMMU0_PLCR_RSP0_CNTr = 4088, + STAT_STAT_CFG_PLCR_SMMU0_REQ0_CNTr = 4089, + STAT_STAT_CFG_STAT_OAM_LM_RSP_CNTr = 4090, + STAT_STAT_CFG_OAM_STAT_LM_REQ_CNTr = 4091, + STAT_STAT_CFG_OAM_STAT_REQ_CNTr = 4092, + STAT_STAT_CFG_SE_ETM_STAT_RSP_CNTr = 4093, + STAT_STAT_CFG_ETM_STAT_SE_WR_REQ_CNTr = 4094, + STAT_STAT_CFG_ETM_STAT_SE_RD_REQ_CNTr = 4095, + STAT_STAT_CFG_ETM_STAT_SMMU0_REQ_CNT0r = 4096, + STAT_STAT_CFG_ETM_STAT_SMMU0_REQ_CNT1r = 4097, + STAT_STAT_CFG_TM_STAT_ERAM_CPU_RSP_CNTr = 4098, + STAT_STAT_CFG_CPU_RD_ERAM_REQ_CNTr = 4099, + STAT_STAT_CFG_CPU_WR_ERAM_REQ_CNTr = 4100, + STAT_STAT_CFG_TM_STAT_DDR_CPU_RSP_CNTr = 4101, + STAT_STAT_CFG_CPU_RD_DDR_REQ_CNTr = 4102, + STAT_STAT_CFG_CPU_WR_DDR_REQ_CNTr = 4103, + STAT_ETCAM_CPU_IND_WDAT1r = 4104, + STAT_ETCAM_CPU_IND_WDAT2r = 4105, + STAT_ETCAM_CPU_IND_WDAT3r = 4106, + STAT_ETCAM_CPU_IND_WDAT4r = 4107, + STAT_ETCAM_CPU_IND_WDAT5r = 4108, + STAT_ETCAM_CPU_IND_WDAT6r = 4109, + STAT_ETCAM_CPU_IND_WDAT7r = 4110, + STAT_ETCAM_CPU_IND_WDAT8r = 4111, + STAT_ETCAM_CPU_IND_WDAT9r = 4112, + STAT_ETCAM_CPU_IND_WDAT10r = 4113, + STAT_ETCAM_CPU_IND_WDAT11r = 4114, + STAT_ETCAM_CPU_IND_WDAT12r = 4115, + STAT_ETCAM_CPU_IND_WDAT13r = 4116, + STAT_ETCAM_CPU_IND_WDAT14r = 4117, + STAT_ETCAM_CPU_IND_WDAT15r = 4118, + STAT_ETCAM_CPU_IND_WDAT16r = 4119, + STAT_ETCAM_CPU_IND_WDAT17r = 4120, + STAT_ETCAM_CPU_IND_WDAT18r = 4121, + STAT_ETCAM_CPU_IND_WDAT19r = 4122, + STAT_ETCAM_T_STRWC_CFGr = 4123, + STAT_ETCAM_ETCAM_INT_UNMASK_FLAGr = 4124, + STAT_ETCAM_ETCAM_INT_EN0r = 4125, + STAT_ETCAM_ETCAM_INT_MASK0r = 4126, + STAT_ETCAM_ETCAM_INT_STATUSr = 4127, + STAT_ETCAM_INT_TB_INI_OKr = 4128, + STAT_ETCAM_ETCAM_CLK_ENr = 4129, + STAT_ETCAM_AS_ETCAM_REQ0_CNTr = 4130, + STAT_ETCAM_AS_ETCAM_REQ1_CNTr = 4131, + STAT_ETCAM_ETCAM_AS_INDEX0_CNTr = 4132, + STAT_ETCAM_ETCAM_AS_INDEX1_CNTr = 4133, + STAT_ETCAM_ETCAM_NOT_HIT0_CNTr = 4134, + STAT_ETCAM_ETCAM_NOT_HIT1_CNTr = 4135, + STAT_ETCAM_TABLE_ID_NOT_MATCH_CNTr = 4136, + STAT_ETCAM_TABLE_ID_CLASH01_CNTr = 4137, + STAT_ETCAM_ETCAM_CPU_FLr = 4138, + STAT_ETCAM_ETCAM_ARB_EMPTYr = 4139, + DTB_DTB_CFG_CFG_FINISH_INT_EVENT0r = 4140, + DTB_DTB_CFG_CFG_FINISH_INT_EVENT1r = 4141, + DTB_DTB_CFG_CFG_FINISH_INT_EVENT2r = 4142, + DTB_DTB_CFG_CFG_FINISH_INT_EVENT3r = 4143, + DTB_DTB_CFG_CFG_FINISH_INT_MAKS0r = 4144, + DTB_DTB_CFG_CFG_FINISH_INT_MAKS1r = 4145, + DTB_DTB_CFG_CFG_FINISH_INT_MAKS2r = 4146, + DTB_DTB_CFG_CFG_FINISH_INT_MAKS3r = 4147, + DTB_DTB_CFG_CFG_FINISH_INT_TEST0r = 4148, + DTB_DTB_CFG_CFG_FINISH_INT_TEST1r = 4149, + DTB_DTB_CFG_CFG_FINISH_INT_TEST2r = 4150, + DTB_DTB_CFG_CFG_FINISH_INT_TEST3r = 4151, + DTB_DTB_CFG_CFG_DTB_INT_TO_RISCV_SELr = 4152, + DTB_DTB_CFG_CFG_DTB_EP_INT_MSIX_ENABLEr = 4153, + DTB_DTB_CFG_CFG_DTB_EP_DOORBELL_ADDR_H_0_15r = 4154, + DTB_DTB_CFG_CFG_DTB_EP_DOORBELL_ADDR_L_0_15r = 4155, + DTB_DTB_CFG_CFG_DTB_DEBUG_MODE_ENr = 4156, + DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_ADDR_HIGHr = 4157, + DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_ADDR_LOWr = 4158, + DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_LENr = 4159, + DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_USERr = 4160, + DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_ONLOAD_CNTr = 4161, + DTB_DTB_CFG_CNT_AXI_RD_TABLE_RESP_ERRr = 4162, + DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_ADDR_HIGHr = 4163, + DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_ADDR_LOWr = 4164, + DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_LENr = 4165, + DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_USERr = 4166, + DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_ONLOAD_CNTr = 4167, + DTB_DTB_CFG_CNT_AXI_RD_PD_RESP_ERRr = 4168, + DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_ADDR_HIGHr = 4169, + DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_ADDR_LOWr = 4170, + DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_LENr = 4171, + DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_USERr = 4172, + DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_ONLOAD_CNTr = 4173, + DTB_DTB_CFG_CNT_AXI_WR_CTRL_RESP_ERRr = 4174, + DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_ADDR_HIGHr = 4175, + DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_ADDR_LOWr = 4176, + DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_LENr = 4177, + DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_USERr = 4178, + DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_ONLOAD_CNTr = 4179, + DTB_DTB_CFG_CNT_AXI_WR_DDR_RESP_ERRr = 4180, + DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_ADDR_HIGHr = 4181, + DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_ADDR_LOWr = 4182, + DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_LENr = 4183, + DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_USERr = 4184, + DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_ONLOAD_CNTr = 4185, + DTB_DTB_CFG_CNT_AXI_WR_FIN_RESP_ERRr = 4186, + DTB_DTB_CFG_CNT_DTB_WR_SMMU0_TABLE_HIGHr = 4187, + DTB_DTB_CFG_CNT_DTB_WR_SMMU0_TABLE_LOWr = 4188, + DTB_DTB_CFG_CNT_DTB_WR_SMMU1_TABLE_HIGHr = 4189, + DTB_DTB_CFG_CNT_DTB_WR_SMMU1_TABLE_LOWr = 4190, + DTB_DTB_CFG_CNT_DTB_WR_ZCAM_TABLE_HIGHr = 4191, + DTB_DTB_CFG_CNT_DTB_WR_ZCAM_TABLE_LOWr = 4192, + DTB_DTB_CFG_CNT_DTB_WR_ETCAM_TABLE_HIGHr = 4193, + DTB_DTB_CFG_CNT_DTB_WR_ETCAM_TABLE_LOWr = 4194, + DTB_DTB_CFG_CNT_DTB_WR_HASH_TABLE_HIGHr = 4195, + DTB_DTB_CFG_CNT_DTB_WR_HASH_TABLE_LOWr = 4196, + DTB_DTB_CFG_CNT_DTB_RD_SMMU0_TABLE_HIGHr = 4197, + DTB_DTB_CFG_CNT_DTB_RD_SMMU0_TABLE_LOWr = 4198, + DTB_DTB_CFG_CNT_DTB_RD_SMMU1_TABLE_HIGHr = 4199, + DTB_DTB_CFG_CNT_DTB_RD_SMMU1_TABLE_LOWr = 4200, + DTB_DTB_CFG_CNT_DTB_RD_ZCAM_TABLE_HIGHr = 4201, + DTB_DTB_CFG_CNT_DTB_RD_ZCAM_TABLE_LOWr = 4202, + DTB_DTB_CFG_CNT_DTB_RD_ETCAM_TABLE_HIGHr = 4203, + DTB_DTB_CFG_CNT_DTB_RD_ETCAM_TABLE_LOWr = 4204, + DTB_DTB_CFG_INFO_WR_CTRL_STATEr = 4205, + DTB_DTB_CFG_INFO_RD_TABLE_STATEr = 4206, + DTB_DTB_CFG_INFO_RD_PD_STATEr = 4207, + DTB_DTB_CFG_INFO_DUMP_CMD_STATEr = 4208, + DTB_DTB_CFG_INFO_WR_DDR_STATEr = 4209, + DTB_DTB_CFG_CFG_DTB_DEBUG_INFO_CLRr = 4210, + DTB_DDOS_CFG_DDOS_STAT_DUMP_THRD_0_15r = 4211, + DTB_DDOS_CFG_DDOS_STAT_DUMP_THRD_COMP_ENr = 4212, + DTB_DDOS_CFG_DDOS_DUMP_STAT_NUMr = 4213, + DTB_DDOS_CFG_DDOS_EVEN_HASH_TABLE_BADDRr = 4214, + DTB_DDOS_CFG_DDOS_ODD_HASH_TABLE_BADDRr = 4215, + DTB_DDOS_CFG_DDOS_STAT_INDEX_OFFSETr = 4216, + DTB_DDOS_CFG_DDOS_NS_FLAG_CNTr = 4217, + DTB_DDOS_CFG_DDOS_EVEN_STAT_TABLE_BADDRr = 4218, + DTB_DDOS_CFG_DDOS_ODD_STAT_TABLE_BADDRr = 4219, + DTB_DDOS_CFG_DDOS_EVEN_STAT_DUMP_DADDR_Hr = 4220, + DTB_DDOS_CFG_DDOS_EVEN_STAT_DUMP_DADDR_Lr = 4221, + DTB_DDOS_CFG_DDOS_ODD_STAT_DUMP_DADDR_Hr = 4222, + DTB_DDOS_CFG_DDOS_ODD_STAT_DUMP_DADDR_Lr = 4223, + DTB_DDOS_CFG_DDOS_WORK_MODE_ENABLEr = 4224, + DTB_DDOS_CFG_DDOS_STAT_TABLE_LENr = 4225, + DTB_DDOS_CFG_DDOS_HASH_TABLE_LENr = 4226, + DTB_DTB_RAM_TRAF_CTRL_RAM0_0_255r = 4227, + DTB_DTB_RAM_TRAF_CTRL_RAM1_0_255r = 4228, + DTB_DTB_RAM_TRAF_CTRL_RAM2_0_255r = 4229, + DTB_DTB_RAM_TRAF_CTRL_RAM3_0_255r = 4230, + DTB_DTB_RAM_TRAF_CTRL_RAM4_0_255r = 4231, + DTB_DTB_RAM_TRAF_CTRL_RAM5_0_63r = 4232, + DTB_DTB_RAM_DUMP_PD_RAM_0_2047r = 4233, + DTB_DTB_RAM_RD_CTRL_RAM_0_4095r = 4234, + DTB_DTB_RAM_RD_TABLE_RAM_0_8191r = 4235, + DTB_DTB_RAM_DTB_CMD_MAN_RAM_0_16383r = 4236, + TRPG_TRPG_RX_PORT_CPU_TRPG_MS_STr = 4237, + TRPG_TRPG_RX_PORT_CPU_TRPG_MS_INDr = 4238, + TRPG_TRPG_RX_PORT_CPU_TRPG_MS_SLAVE_INDr = 4239, + TRPG_TRPG_RX_PORT_CPU_TRPGRX_UP_WATER_LEVELr = 4240, + TRPG_TRPG_RX_PORT_CPU_TRPGRX_LOW_WATER_LEVELr = 4241, + TRPG_TRPG_TX_PORT_CPU_TRPG_MS_STr = 4242, + TRPG_TRPG_TX_PORT_CPU_TRPG_MS_INDr = 4243, + TRPG_TRPG_TX_PORT_CPU_TRPG_MS_SLAVE_INDr = 4244, + TRPG_TRPG_TX_GLB_CPU_TODTIME_UPDATE_INT_EVENTr = 4245, + TRPG_TRPG_TX_GLB_CPU_TODTIME_UPDATE_INT_TESTr = 4246, + TRPG_TRPG_TX_GLB_CPU_TODTIME_UPDATE_INT_ADDRr = 4247, + TRPG_TRPG_TX_TODTIME_RAM_TRPG_TX_TODTIME_RAMr = 4248, + TSN_TSN_PORT_CFG_TSN_TEST_REGr = 4249, + TSN_TSN_PORT_CFG_TSN_PORT_QBV_ENABLEr = 4250, + TSN_TSN_PORT_CFG_TSN_PHY_PORT_SELr = 4251, + TSN_TSN_PORT_CFG_TSN_PORT_TIME_SELr = 4252, + TSN_TSN_PORT_CFG_TSN_CLK_FREQr = 4253, + TSN_TSN_PORT_CFG_TSN_READ_RAM_Nr = 4254, + TSN_TSN_PORT_CFG_TSN_EXE_TIMEr = 4255, + TSN_TSN_PORT_CFG_TSN_PORT_ITR_SHIFTr = 4256, + TSN_TSN_PORT_CFG_TSN_PORT_BASE_TIME_Hr = 4257, + TSN_TSN_PORT_CFG_TSN_PORT_BASE_TIME_Lr = 4258, + TSN_TSN_PORT_CFG_TSN_PORT_CYCLE_TIME_Hr = 4259, + TSN_TSN_PORT_CFG_TSN_PORT_CYCLE_TIME_Lr = 4260, + TSN_TSN_PORT_CFG_TSN_PORT_GUARD_BAND_TIMEr = 4261, + TSN_TSN_PORT_CFG_TSN_PORT_DEFAULT_GATE_ENr = 4262, + TSN_TSN_PORT_CFG_TSN_PORT_CHANGE_GATE_ENr = 4263, + TSN_TSN_PORT_CFG_TSN_PORT_INIT_FINISHr = 4264, + TSN_TSN_PORT_CFG_TSN_PORT_CHANGE_ENr = 4265, + TSN_TSN_PORT_CFG_TSN_PORT_GCL_NUM0r = 4266, + TSN_TSN_PORT_CFG_TSN_PORT_GCL_NUM1r = 4267, + TSN_TSN_PORT_CFG_TSN_PORT_GCL_VALUE0r = 4268, + TSN_TSN_PORT_CFG_TSN_PORT_GCL_VALUE1r = 4269, + AXI_AXI_CONV_CFG_EPID_V_FUNC_NUMr = 4270, + AXI_AXI_CONV_INFO_AXIM_RW_HSK_CNTr = 4271, + AXI_AXI_CONV_INFO_AXIM_LAST_WR_IDr = 4272, + AXI_AXI_CONV_INFO_AXIM_LAST_WR_ADDR_Hr = 4273, + AXI_AXI_CONV_INFO_AXIM_LAST_WR_ADDR_Lr = 4274, + AXI_AXI_CONV_CFG_DEBUG_INFO_CLR_ENr = 4275, + PTPTM_PTP_TOP_PP1S_INTERRUPTr = 4276, + PTPTM_PTP_TOP_PP1S_EXTERNAL_SELECTr = 4277, + PTPTM_PTP_TOP_PP1S_OUT_SELECTr = 4278, + PTPTM_PTP_TOP_TEST_PP1S_SELECTr = 4279, + PTPTM_PTP_TOP_LOCAL_PP1S_ENr = 4280, + PTPTM_PTP_TOP_LOCAL_PP1S_ADJUSTr = 4281, + PTPTM_PTP_TOP_LOCAL_PP1S_ADJUST_VALUEr = 4282, + PTPTM_PTP_TOP_PP1S_TO_NP_SELECTr = 4283, + PTPTM_PTP_TOP_PD_U1_SELr = 4284, + PTPTM_PTP_TOP_PD_U1_PD0_SHIFTr = 4285, + PTPTM_PTP_TOP_PD_U1_PD1_SHIFTr = 4286, + PTPTM_PTP_TOP_PD_U1_RESULTr = 4287, + PTPTM_PTP_TOP_PD_U2_SELr = 4288, + PTPTM_PTP_TOP_PD_U2_PD0_SHIFTr = 4289, + PTPTM_PTP_TOP_PD_U2_PD1_SHIFTr = 4290, + PTPTM_PTP_TOP_PD_U2_RESULTr = 4291, + PTPTM_PTP_TOP_TSN_GROUP_NANOSECOND_DELAY0r = 4292, + PTPTM_PTP_TOP_TSN_GROUP_FRACNANOSECOND_DELAY0r = 4293, + PTPTM_PTP_TOP_TSN_GROUP_NANOSECOND_DELAY1r = 4294, + PTPTM_PTP_TOP_TSN_GROUP_FRACNANOSECOND_DELAY1r = 4295, + PTPTM_PTP_TOP_TSN_GROUP_NANOSECOND_DELAY2r = 4296, + PTPTM_PTP_TOP_TSN_GROUP_FRACNANOSECOND_DELAY2r = 4297, + PTPTM_PTP_TOP_TSN_GROUP_NANOSECOND_DELAY3r = 4298, + PTPTM_PTP_TOP_TSN_GROUP_FRACNANOSECOND_DELAY3r = 4299, + PTPTM_PTP_TOP_TSN_PTP1588_RDMA_NANOSECOND_DELAYr = 4300, + PTPTM_PTP_TOP_PTP1588_RDMA_FRACNANOSECOND_DELAYr = 4301, + PTPTM_PTP_TOP_PTP1588_NP_NANOSECOND_DELAYr = 4302, + PTPTM_PTP_TOP_PTP1588_NP_FRACNANOSECOND_DELAYr = 4303, + PTPTM_PTP_TOP_TIME_SYNC_PERIODr = 4304, + PTPTM_PTPTM_MODULE_IDr = 4305, + PTPTM_PTPTM_MODULE_VERSIONr = 4306, + PTPTM_PTPTM_MODULE_DATEr = 4307, + PTPTM_PTPTM_INTERRUPT_STATUSr = 4308, + PTPTM_PTPTM_INTERRUPT_EVENTr = 4309, + PTPTM_PTPTM_INTERRUPT_MASKr = 4310, + PTPTM_PTPTM_INTERRUPT_TESTr = 4311, + PTPTM_PTPTM_HW_CLOCK_CYCLE_INTEGERr = 4312, + PTPTM_PTPTM_HW_CLOCK_CYCLE_FRACTIONr = 4313, + PTPTM_PTPTM_PTP_CLOCK_CYCLE_INTEGERr = 4314, + PTPTM_PTPTM_PTP_CLOCK_CYCLE_FRACTIONr = 4315, + PTPTM_PTPTM_PTP_CONFIGURATIONr = 4316, + PTPTM_PTPTM_TIMER_CONTROLr = 4317, + PTPTM_PTPTM_PPS_INCOME_DELAYr = 4318, + PTPTM_PTPTM_CLOCK_CYCLE_UPDATEr = 4319, + PTPTM_PTPTM_CYCLE_TIME_OF_OUTPUT_PERIOD_PULSE_1r = 4320, + PTPTM_PTPTM_CYCLE_TIME_OF_OUTPUT_PERIOD_PULSE_2r = 4321, + PTPTM_PTPTM_TIMER_LATCH_ENr = 4322, + PTPTM_PTPTM_TIMER_LATCH_SELr = 4323, + PTPTM_PTPTM_TRIGGER_IN_TOD_NANOSECONDr = 4324, + PTPTM_PTPTM_TRIGGER_IN_LOWER_TOD_SECONDr = 4325, + PTPTM_PTPTM_TRIGGER_IN_HIGH_TOD_SECONDr = 4326, + PTPTM_PTPTM_TRIGGER_IN_FRACNANOSECONDr = 4327, + PTPTM_PTPTM_TRIGGER_IN_HARDWARE_TIME_LOWr = 4328, + PTPTM_PTPTM_TRIGGER_IN_HARDWARE_TIME_HIGHr = 4329, + PTPTM_PTPTM_TRIGGER_OUT_TOD_NANOSECONDr = 4330, + PTPTM_PTPTM_TRIGGER_OUT_LOWER_TOD_SECONDr = 4331, + PTPTM_PTPTM_TRIGGER_OUT_HIGH_TOD_SECONDr = 4332, + PTPTM_PTPTM_TRIGGER_OUT_HARDWARE_TIME_LOWr = 4333, + PTPTM_PTPTM_TRIGGER_OUT_HARDWARE_TIME_HIGHr = 4334, + PTPTM_PTPTM_ADJUST_TOD_NANOSECONDr = 4335, + PTPTM_PTPTM_ADJUST_LOWER_TOD_SECONDr = 4336, + PTPTM_PTPTM_ADJUST_HIGH_TOD_SECONDr = 4337, + PTPTM_PTPTM_ADJUST_FRACNANOSECONDr = 4338, + PTPTM_PTPTM_ADJUST_HARDWARE_TIME_LOWr = 4339, + PTPTM_PTPTM_ADJUST_HARDWARE_TIME_HIGHr = 4340, + PTPTM_PTPTM_LATCH_TOD_NANOSECONDr = 4341, + PTPTM_PTPTM_LATCH_LOWER_TOD_SECONDr = 4342, + PTPTM_PTPTM_LATCH_HIGH_TOD_SECONDr = 4343, + PTPTM_PTPTM_LATCH_FRACNANOSECONDr = 4344, + PTPTM_PTPTM_LATCH_HARDWARE_TIME_LOWr = 4345, + PTPTM_PTPTM_LATCH_HARDWARE_TIME_HIGHr = 4346, + PTPTM_PTPTM_REAL_TOD_NANOSECONDr = 4347, + PTPTM_PTPTM_REAL_LOWER_TOD_SECONDr = 4348, + PTPTM_PTPTM_REAL_HIGH_TOD_SECONDr = 4349, + PTPTM_PTPTM_REAL_HARDWARE_TIME_LOWr = 4350, + PTPTM_PTPTM_REAL_HARDWARE_TIME_HIGHr = 4351, + PTPTM_PTPTM_PTP1588_EVENT_MESSAGE_PORTr = 4352, + PTPTM_PTPTM_PTP1588_EVENT_MESSAGE_TIMESTAMP_LOWr = 4353, + PTPTM_PTPTM_PTP1588_EVENT_MESSAGE_TIMESTAMP_HIGHr = 4354, + PTPTM_PTPTM_PTP1588_EVENT_MESSAGE_FIFO_STATUSr = 4355, + PTPTM_PTPTM_PP1S_LATCH_TOD_NANOSECONDr = 4356, + PTPTM_PTPTM_PP1S_LATCH_LOWER_TOD_SECONDr = 4357, + PTPTM_PTPTM_PP1S_LATCH_HIGH_TOD_SECONDr = 4358, + PTPTM_PTPTM_PP1S_LATCH_FRACNANOSECONDr = 4359, + PTPTM_PTPTM_TSN_TIME_CONFIGURATIONr = 4360, + PTPTM_PTPTM_TSN_TIMER_CONTROLr = 4361, + PTPTM_PTPTM_TSN0_CLOCK_CYCLE_INTEGERr = 4362, + PTPTM_PTPTM_TSN0_CLOCK_CYCLE_FRACTIONr = 4363, + PTPTM_PTPTM_TSN1_CLOCK_CYCLE_INTEGERr = 4364, + PTPTM_PTPTM_TSN1_CLOCK_CYCLE_FRACTIONr = 4365, + PTPTM_PTPTM_TSN2_CLOCK_CYCLE_INTEGERr = 4366, + PTPTM_PTPTM_TSN2_CLOCK_CYCLE_FRACTIONr = 4367, + PTPTM_PTPTM_TSN3_CLOCK_CYCLE_INTEGERr = 4368, + PTPTM_PTPTM_TSN3_CLOCK_CYCLE_FRACTIONr = 4369, + PTPTM_PTPTM_TSN0_ADJUST_TOD_NANOSECONDr = 4370, + PTPTM_PTPTM_TSN0_ADJUST_LOWER_TOD_SECONDr = 4371, + PTPTM_PTPTM_TSN0_ADJUST_HIGH_TOD_SECONDr = 4372, + PTPTM_PTPTM_TSN0_ADJUST_FRACNANOSECONDr = 4373, + PTPTM_PTPTM_TSN1_ADJUST_TOD_NANOSECONDr = 4374, + PTPTM_PTPTM_TSN1_ADJUST_LOWER_TOD_SECONDr = 4375, + PTPTM_PTPTM_TSN1_ADJUST_HIGH_TOD_SECONDr = 4376, + PTPTM_PTPTM_TSN1_ADJUST_FRACNANOSECONDr = 4377, + PTPTM_PTPTM_TSN2_ADJUST_TOD_NANOSECONDr = 4378, + PTPTM_PTPTM_TSN2_ADJUST_LOWER_TOD_SECONDr = 4379, + PTPTM_PTPTM_TSN2_ADJUST_HIGH_TOD_SECONDr = 4380, + PTPTM_PTPTM_TSN2_ADJUST_FRACNANOSECONDr = 4381, + PTPTM_PTPTM_TSN3_ADJUST_TOD_NANOSECONDr = 4382, + PTPTM_PTPTM_TSN3_ADJUST_LOWER_TOD_SECONDr = 4383, + PTPTM_PTPTM_TSN3_ADJUST_HIGH_TOD_SECONDr = 4384, + PTPTM_PTPTM_TSN3_ADJUST_FRACNANOSECONDr = 4385, + PTPTM_PTPTM_TSN0_LATCH_TOD_NANOSECONDr = 4386, + PTPTM_PTPTM_TSN0_LATCH_LOWER_TOD_SECONDr = 4387, + PTPTM_PTPTM_TSN0_LATCH_HIGH_TOD_SECONDr = 4388, + PTPTM_PTPTM_TSN0_LATCH_FRACNANOSECONDr = 4389, + PTPTM_PTPTM_TSN1_LATCH_TOD_NANOSECONDr = 4390, + PTPTM_PTPTM_TSN1_LATCH_LOWER_TOD_SECONDr = 4391, + PTPTM_PTPTM_TSN1_LATCH_HIGH_TOD_SECONDr = 4392, + PTPTM_PTPTM_TSN1_LATCH_FRACNANOSECONDr = 4393, + PTPTM_PTPTM_TSN2_LATCH_TOD_NANOSECONDr = 4394, + PTPTM_PTPTM_TSN2_LATCH_LOWER_TOD_SECONDr = 4395, + PTPTM_PTPTM_TSN2_LATCH_HIGH_TOD_SECONDr = 4396, + PTPTM_PTPTM_TSN2_LATCH_FRACNANOSECONDr = 4397, + PTPTM_PTPTM_TSN3_LATCH_TOD_NANOSECONDr = 4398, + PTPTM_PTPTM_TSN3_LATCH_LOWER_TOD_SECONDr = 4399, + PTPTM_PTPTM_TSN3_LATCH_HIGH_TOD_SECONDr = 4400, + PTPTM_PTPTM_TSN3_LATCH_FRACNANOSECONDr = 4401, + PTPTM_PTPTM_PP1S_LATCH_TSN0_TOD_NANOSECONDr = 4402, + PTPTM_PTPTM_PP1S_LATCH_TSN0_LOWER_TOD_SECONDr = 4403, + PTPTM_PTPTM_PP1S_LATCH_TSN0_HIGH_TOD_SECONDr = 4404, + PTPTM_PTPTM_PP1S_LATCH_TSN0_FRACNANOSECONDr = 4405, + PTPTM_PTPTM_PP1S_LATCH_TSN1_TOD_NANOSECONDr = 4406, + PTPTM_PTPTM_PP1S_LATCH_TSN1_LOWER_TOD_SECONDr = 4407, + PTPTM_PTPTM_PP1S_LATCH_TSN1_HIGH_TOD_SECONDr = 4408, + PTPTM_PTPTM_PP1S_LATCH_TSN1_FRACNANOSECONDr = 4409, + PTPTM_PTPTM_PP1S_LATCH_TSN2_TOD_NANOSECONDr = 4410, + PTPTM_PTPTM_PP1S_LATCH_TSN2_LOWER_TOD_SECONDr = 4411, + PTPTM_PTPTM_PP1S_LATCH_TSN2_HIGH_TOD_SECONDr = 4412, + PTPTM_PTPTM_PP1S_LATCH_TSN2_FRACNANOSECONDr = 4413, + PTPTM_PTPTM_PP1S_LATCH_TSN3_TOD_NANOSECONDr = 4414, + PTPTM_PTPTM_PP1S_LATCH_TSN3_LOWER_TOD_SECONDr = 4415, + PTPTM_PTPTM_PP1S_LATCH_TSN3_HIGH_TOD_SECONDr = 4416, + PTPTM_PTPTM_PP1S_LATCH_TSN3_FRACNANOSECONDr = 4417, + PTPTM_PTPTM_TSN0_REAL_TOD_NANOSECONDr = 4418, + PTPTM_PTPTM_TSN0_REAL_LOWER_TOD_SECONDr = 4419, + PTPTM_PTPTM_TSN0_REAL_HIGH_TOD_SECONDr = 4420, + PTPTM_PTPTM_TSN1_REAL_TOD_NANOSECONDr = 4421, + PTPTM_PTPTM_TSN1_REAL_LOWER_TOD_SECONDr = 4422, + PTPTM_PTPTM_TSN1_REAL_HIGH_TOD_SECONDr = 4423, + PTPTM_PTPTM_TSN2_REAL_TOD_NANOSECONDr = 4424, + PTPTM_PTPTM_TSN2_REAL_LOWER_TOD_SECONDr = 4425, + PTPTM_PTPTM_TSN2_REAL_HIGH_TOD_SECONDr = 4426, + PTPTM_PTPTM_TSN3_REAL_TOD_NANOSECONDr = 4427, + PTPTM_PTPTM_TSN3_REAL_LOWER_TOD_SECONDr = 4428, + PTPTM_PTPTM_TSN3_REAL_HIGH_TOD_SECONDr = 4429, + PTPTM_PTPTM_REAL_PTP_CLOCK_CYCLE_INTEGERr = 4430, + PTPTM_PTPTM_REAL_PTP_CLOCK_CYCLE_FRACTIONr = 4431, + PTPTM_PTPTM_REAL_TSN0_CLOCK_CYCLE_INTEGERr = 4432, + PTPTM_PTPTM_REAL_TSN0_CLOCK_CYCLE_FRACTIONr = 4433, + PTPTM_PTPTM_REAL_TSN1_CLOCK_CYCLE_INTEGERr = 4434, + PTPTM_PTPTM_REAL_TSN1_CLOCK_CYCLE_FRACTIONr = 4435, + PTPTM_PTPTM_REAL_TSN2_CLOCK_CYCLE_INTEGERr = 4436, + PTPTM_PTPTM_REAL_TSN2_CLOCK_CYCLE_FRACTIONr = 4437, + PTPTM_PTPTM_REAL_TSN3_CLOCK_CYCLE_INTEGERr = 4438, + PTPTM_PTPTM_REAL_TSN3_CLOCK_CYCLE_FRACTIONr = 4439, + REG_ENUM_MAX_VALUE +}DPP_REG_INFO_E; + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_reg_struct.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_reg_struct.h new file mode 100755 index 0000000..a91092c --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_reg_struct.h @@ -0,0 +1,88 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_reg_struct.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : 石金锋 +* 完成日期 : 2014/02/10 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ +#ifndef _DPP_REG_STRUCT_H_ +#define _DPP_REG_STRUCT_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "zxic_common.h" +#include "dpp_dev.h" +#include "dpp_type_api.h" + + +typedef ZXIC_UINT32 (*DPP_REG_WRITE)(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 *p_data); +typedef ZXIC_UINT32 (*DPP_REG_READ)(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 *p_data); + + +#define DPP_FIELD_FLAG_RO (1<<0) /* 只读标志 */ +#define DPP_FIELD_FLAG_RW (1<<1) /* 读写标志 */ +#define DPP_FIELD_FLAG_RC (1<<2) /* 读清标志 */ +#define DPP_FIELD_FLAG_WO (1<<3) /* 只写标志 */ +#define DPP_FIELD_FLAG_WC (1<<4) /* 写清标志 */ + +typedef struct dpp_field_t +{ + ZXIC_CHAR *p_name; /* 字段名 */ + ZXIC_UINT32 flags; /* 标志位 */ + ZXIC_UINT16 msb_pos; /* 最高比特位置,以寄存器列表为准*/ + ZXIC_UINT16 len; /* 字段长度,以比特为单位 */ + ZXIC_UINT32 default_value; /* 缺省值 */ + ZXIC_UINT32 default_step; /* 缺省值步长*/ +}DPP_FIELD_T; + + +#define DPP_REG_FLAG_DIRECT (0<<0) /* 直接读写寄存器 */ +#define DPP_REG_FLAG_INDIRECT (1<<0) /* 间接读写寄存器 */ +#define DPP_REG_FLAG_WO (1<<1) /* 只写寄存器 */ + +#define DPP_REG_NUL_ARRAY (0<<0) /*零元寄存器序列 */ +#define DPP_REG_UNI_ARRAY (1<<0) /*一元寄存器序列 */ +#define DPP_REG_BIN_ARRAY (1<<1) /*二元寄存器序列 */ + +typedef struct dpp_reg_t +{ + ZXIC_CHAR *reg_name; /* 寄存器名称*/ + ZXIC_UINT32 reg_no; /* 寄存器的编号 */ + ZXIC_UINT32 module_no; /* 寄存器归属的模块的编号 */ + ZXIC_UINT32 flags; /* 标志位 */ + ZXIC_UINT32 array_type; /* 寄存器偏移类型*/ + ZXIC_UINT32 addr; /* 寄存器的芯片地址*/ + ZXIC_UINT32 width; /* 寄存器位宽,以字节为单位 */ + ZXIC_UINT32 m_size; /* 寄存器序列参数1的个数 */ + ZXIC_UINT32 n_size; /* 寄存器序列参数2的个数*/ + ZXIC_UINT32 m_step; /* 寄存器序列参数1的偏移步长 */ + ZXIC_UINT32 n_step; /* 寄存器序列参数2的偏移步长 */ + ZXIC_UINT32 field_num; /* 包含的字段个数 */ + DPP_FIELD_T *p_fields; /* 寄存器所有字段 */ + + DPP_REG_WRITE p_write_fun; /* 寄存器写函数 */ + DPP_REG_READ p_read_fun; /* 寄存器读函数 */ +}DPP_REG_T; + + +#ifdef __cplusplus +} +#endif + +#endif + + + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_se4k_reg.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_se4k_reg.h new file mode 100644 index 0000000..4ab258c --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_se4k_reg.h @@ -0,0 +1,334 @@ + +#ifndef _DPP_SE4K_REG_H_ +#define _DPP_SE4K_REG_H_ + +#ifdef __cplusplus +extern "C"{ +#endif + +typedef struct dpp_se4k_se_alg_cpu_cmd_rgt_t +{ + ZXIC_UINT32 rd_flag; + ZXIC_UINT32 mask; + ZXIC_UINT32 reg_sram_flag; + ZXIC_UINT32 zgroup_id; + ZXIC_UINT32 zblock_id; + ZXIC_UINT32 zcell_id; + ZXIC_UINT32 addr; +}DPP_SE4K_SE_ALG_CPU_CMD_RGT_T; + +typedef struct dpp_se4k_se_alg_cpu_wr_data_tmp0_t +{ + ZXIC_UINT32 cpu_wr_data_tmp0; +}DPP_SE4K_SE_ALG_CPU_WR_DATA_TMP0_T; + +typedef struct dpp_se4k_se_alg_cpu_wr_data_tmp1_t +{ + ZXIC_UINT32 cpu_wr_data_tmp1; +}DPP_SE4K_SE_ALG_CPU_WR_DATA_TMP1_T; + +typedef struct dpp_se4k_se_alg_cpu_wr_data_tmp2_t +{ + ZXIC_UINT32 cpu_wr_data_tmp2; +}DPP_SE4K_SE_ALG_CPU_WR_DATA_TMP2_T; + +typedef struct dpp_se4k_se_alg_cpu_wr_data_tmp3_t +{ + ZXIC_UINT32 cpu_wr_data_tmp3; +}DPP_SE4K_SE_ALG_CPU_WR_DATA_TMP3_T; + +typedef struct dpp_se4k_se_alg_cpu_wr_data_tmp4_t +{ + ZXIC_UINT32 cpu_wr_data_tmp4; +}DPP_SE4K_SE_ALG_CPU_WR_DATA_TMP4_T; + +typedef struct dpp_se4k_se_alg_cpu_wr_data_tmp5_t +{ + ZXIC_UINT32 cpu_wr_data_tmp5; +}DPP_SE4K_SE_ALG_CPU_WR_DATA_TMP5_T; + +typedef struct dpp_se4k_se_alg_cpu_wr_data_tmp6_t +{ + ZXIC_UINT32 cpu_wr_data_tmp6; +}DPP_SE4K_SE_ALG_CPU_WR_DATA_TMP6_T; + +typedef struct dpp_se4k_se_alg_cpu_wr_data_tmp7_t +{ + ZXIC_UINT32 cpu_wr_data_tmp7; +}DPP_SE4K_SE_ALG_CPU_WR_DATA_TMP7_T; + +typedef struct dpp_se4k_se_alg_cpu_wr_data_tmp8_t +{ + ZXIC_UINT32 cpu_wr_data_tmp8; +}DPP_SE4K_SE_ALG_CPU_WR_DATA_TMP8_T; + +typedef struct dpp_se4k_se_alg_cpu_wr_data_tmp9_t +{ + ZXIC_UINT32 cpu_wr_data_tmp9; +}DPP_SE4K_SE_ALG_CPU_WR_DATA_TMP9_T; + +typedef struct dpp_se4k_se_alg_cpu_wr_data_tmp10_t +{ + ZXIC_UINT32 cpu_wr_data_tmp10; +}DPP_SE4K_SE_ALG_CPU_WR_DATA_TMP10_T; + +typedef struct dpp_se4k_se_alg_cpu_wr_data_tmp11_t +{ + ZXIC_UINT32 cpu_wr_data_tmp11; +}DPP_SE4K_SE_ALG_CPU_WR_DATA_TMP11_T; + +typedef struct dpp_se4k_se_alg_cpu_wr_data_tmp12_t +{ + ZXIC_UINT32 cpu_wr_data_tmp12; +}DPP_SE4K_SE_ALG_CPU_WR_DATA_TMP12_T; + +typedef struct dpp_se4k_se_alg_cpu_wr_data_tmp13_t +{ + ZXIC_UINT32 cpu_wr_data_tmp13; +}DPP_SE4K_SE_ALG_CPU_WR_DATA_TMP13_T; + +typedef struct dpp_se4k_se_alg_cpu_wr_data_tmp14_t +{ + ZXIC_UINT32 cpu_wr_data_tmp14; +}DPP_SE4K_SE_ALG_CPU_WR_DATA_TMP14_T; + +typedef struct dpp_se4k_se_alg_cpu_wr_data_tmp15_t +{ + ZXIC_UINT32 cpu_wr_data_tmp15; +}DPP_SE4K_SE_ALG_CPU_WR_DATA_TMP15_T; + +typedef struct dpp_se4k_se_alg_cpu_rd_rdy_t +{ + ZXIC_UINT32 cpu_rd_rdy; +}DPP_SE4K_SE_ALG_CPU_RD_RDY_T; + +typedef struct dpp_se4k_se_alg_cpu_rd_data_tmp0_t +{ + ZXIC_UINT32 cpu_rd_data_tmp0; +}DPP_SE4K_SE_ALG_CPU_RD_DATA_TMP0_T; + +typedef struct dpp_se4k_se_alg_cpu_rd_data_tmp1_t +{ + ZXIC_UINT32 cpu_rd_data_tmp1; +}DPP_SE4K_SE_ALG_CPU_RD_DATA_TMP1_T; + +typedef struct dpp_se4k_se_alg_cpu_rd_data_tmp2_t +{ + ZXIC_UINT32 cpu_rd_data_tmp2; +}DPP_SE4K_SE_ALG_CPU_RD_DATA_TMP2_T; + +typedef struct dpp_se4k_se_alg_cpu_rd_data_tmp3_t +{ + ZXIC_UINT32 cpu_rd_data_tmp3; +}DPP_SE4K_SE_ALG_CPU_RD_DATA_TMP3_T; + +typedef struct dpp_se4k_se_alg_cpu_rd_data_tmp4_t +{ + ZXIC_UINT32 cpu_rd_data_tmp4; +}DPP_SE4K_SE_ALG_CPU_RD_DATA_TMP4_T; + +typedef struct dpp_se4k_se_alg_cpu_rd_data_tmp5_t +{ + ZXIC_UINT32 cpu_rd_data_tmp5; +}DPP_SE4K_SE_ALG_CPU_RD_DATA_TMP5_T; + +typedef struct dpp_se4k_se_alg_cpu_rd_data_tmp6_t +{ + ZXIC_UINT32 cpu_rd_data_tmp6; +}DPP_SE4K_SE_ALG_CPU_RD_DATA_TMP6_T; + +typedef struct dpp_se4k_se_alg_cpu_rd_data_tmp7_t +{ + ZXIC_UINT32 cpu_rd_data_tmp7; +}DPP_SE4K_SE_ALG_CPU_RD_DATA_TMP7_T; + +typedef struct dpp_se4k_se_alg_cpu_rd_data_tmp8_t +{ + ZXIC_UINT32 cpu_rd_data_tmp8; +}DPP_SE4K_SE_ALG_CPU_RD_DATA_TMP8_T; + +typedef struct dpp_se4k_se_alg_cpu_rd_data_tmp9_t +{ + ZXIC_UINT32 cpu_rd_data_tmp9; +}DPP_SE4K_SE_ALG_CPU_RD_DATA_TMP9_T; + +typedef struct dpp_se4k_se_alg_cpu_rd_data_tmp10_t +{ + ZXIC_UINT32 cpu_rd_data_tmp10; +}DPP_SE4K_SE_ALG_CPU_RD_DATA_TMP10_T; + +typedef struct dpp_se4k_se_alg_cpu_rd_data_tmp11_t +{ + ZXIC_UINT32 cpu_rd_data_tmp11; +}DPP_SE4K_SE_ALG_CPU_RD_DATA_TMP11_T; + +typedef struct dpp_se4k_se_alg_cpu_rd_data_tmp12_t +{ + ZXIC_UINT32 cpu_rd_data_tmp12; +}DPP_SE4K_SE_ALG_CPU_RD_DATA_TMP12_T; + +typedef struct dpp_se4k_se_alg_cpu_rd_data_tmp13_t +{ + ZXIC_UINT32 cpu_rd_data_tmp13; +}DPP_SE4K_SE_ALG_CPU_RD_DATA_TMP13_T; + +typedef struct dpp_se4k_se_alg_cpu_rd_data_tmp14_t +{ + ZXIC_UINT32 cpu_rd_data_tmp14; +}DPP_SE4K_SE_ALG_CPU_RD_DATA_TMP14_T; + +typedef struct dpp_se4k_se_alg_cpu_rd_data_tmp15_t +{ + ZXIC_UINT32 cpu_rd_data_tmp15; +}DPP_SE4K_SE_ALG_CPU_RD_DATA_TMP15_T; + +typedef struct dpp_se4k_se_alg_hash0_ext_cfg_rgt_t +{ + ZXIC_UINT32 hash0_ext_mode; + ZXIC_UINT32 hash0_ext_flag; +}DPP_SE4K_SE_ALG_HASH0_EXT_CFG_RGT_T; + +typedef struct dpp_se4k_se_alg_hash1_ext_cfg_rgt_t +{ + ZXIC_UINT32 hash1_ext_mode; + ZXIC_UINT32 hash1_ext_flag; +}DPP_SE4K_SE_ALG_HASH1_EXT_CFG_RGT_T; + +typedef struct dpp_se4k_se_alg_hash2_ext_cfg_rgt_t +{ + ZXIC_UINT32 hash2_ext_mode; + ZXIC_UINT32 hash2_ext_flag; +}DPP_SE4K_SE_ALG_HASH2_EXT_CFG_RGT_T; + +typedef struct dpp_se4k_se_alg_hash3_ext_cfg_rgt_t +{ + ZXIC_UINT32 hash3_ext_mode; + ZXIC_UINT32 hash3_ext_flag; +}DPP_SE4K_SE_ALG_HASH3_EXT_CFG_RGT_T; + +typedef struct dpp_se4k_se_alg_hash0_tbl30_depth_t +{ + ZXIC_UINT32 hash0_tbl3_depth; + ZXIC_UINT32 hash0_tbl2_depth; + ZXIC_UINT32 hash0_tbl1_depth; + ZXIC_UINT32 hash0_tbl0_depth; +}DPP_SE4K_SE_ALG_HASH0_TBL30_DEPTH_T; + +typedef struct dpp_se4k_se_alg_hash0_tbl74_depth_t +{ + ZXIC_UINT32 hash0_tbl7_depth; + ZXIC_UINT32 hash0_tbl6_depth; + ZXIC_UINT32 hash0_tbl5_depth; + ZXIC_UINT32 hash0_tbl4_depth; +}DPP_SE4K_SE_ALG_HASH0_TBL74_DEPTH_T; + +typedef struct dpp_se4k_se_alg_hash1_tbl30_depth_t +{ + ZXIC_UINT32 hash1_tbl3_depth; + ZXIC_UINT32 hash1_tbl2_depth; + ZXIC_UINT32 hash1_tbl1_depth; + ZXIC_UINT32 hash1_tbl0_depth; +}DPP_SE4K_SE_ALG_HASH1_TBL30_DEPTH_T; + +typedef struct dpp_se4k_se_alg_hash1_tbl74_depth_t +{ + ZXIC_UINT32 hash1_tbl7_depth; + ZXIC_UINT32 hash1_tbl6_depth; + ZXIC_UINT32 hash1_tbl5_depth; + ZXIC_UINT32 hash1_tbl4_depth; +}DPP_SE4K_SE_ALG_HASH1_TBL74_DEPTH_T; + +typedef struct dpp_se4k_se_alg_hash2_tbl30_depth_t +{ + ZXIC_UINT32 hash2_tbl3_depth; + ZXIC_UINT32 hash2_tbl2_depth; + ZXIC_UINT32 hash2_tbl1_depth; + ZXIC_UINT32 hash2_tbl0_depth; +}DPP_SE4K_SE_ALG_HASH2_TBL30_DEPTH_T; + +typedef struct dpp_se4k_se_alg_hash2_tbl74_depth_t +{ + ZXIC_UINT32 hash2_tbl7_depth; + ZXIC_UINT32 hash2_tbl6_depth; + ZXIC_UINT32 hash2_tbl5_depth; + ZXIC_UINT32 hash2_tbl4_depth; +}DPP_SE4K_SE_ALG_HASH2_TBL74_DEPTH_T; + +typedef struct dpp_se4k_se_alg_hash3_tbl30_depth_t +{ + ZXIC_UINT32 hash3_tbl3_depth; + ZXIC_UINT32 hash3_tbl2_depth; + ZXIC_UINT32 hash3_tbl1_depth; + ZXIC_UINT32 hash3_tbl0_depth; +}DPP_SE4K_SE_ALG_HASH3_TBL30_DEPTH_T; + +typedef struct dpp_se4k_se_alg_hash3_tbl74_depth_t +{ + ZXIC_UINT32 hash3_tbl7_depth; + ZXIC_UINT32 hash3_tbl6_depth; + ZXIC_UINT32 hash3_tbl5_depth; + ZXIC_UINT32 hash3_tbl4_depth; +}DPP_SE4K_SE_ALG_HASH3_TBL74_DEPTH_T; + +typedef struct dpp_se4k_se_alg_wr_rsp_cfg_t +{ + ZXIC_UINT32 wr_rsp_fifo_cfg; +}DPP_SE4K_SE_ALG_WR_RSP_CFG_T; + +typedef struct dpp_se4k_se_alg_hash_mono_flag_t +{ + ZXIC_UINT32 hash3_mono_flag; + ZXIC_UINT32 hash2_mono_flag; + ZXIC_UINT32 hash1_mono_flag; + ZXIC_UINT32 hash0_mono_flag; +}DPP_SE4K_SE_ALG_HASH_MONO_FLAG_T; + +typedef struct dpp_se4k_se_alg_hash10_ext_crc_cfg_t +{ + ZXIC_UINT32 hash1_crc_cfg; + ZXIC_UINT32 hash0_crc_cfg; +}DPP_SE4K_SE_ALG_HASH10_EXT_CRC_CFG_T; + +typedef struct dpp_se4k_se_alg_hash32_ext_crc_cfg_t +{ + ZXIC_UINT32 hash3_crc_cfg; + ZXIC_UINT32 hash2_crc_cfg; +}DPP_SE4K_SE_ALG_HASH32_EXT_CRC_CFG_T; + +typedef struct dpp_se4k_se_alg_zblock_service_configure_t +{ + ZXIC_UINT32 service_sel; + ZXIC_UINT32 hash_channel_sel; + ZXIC_UINT32 st_en; +}DPP_SE4K_SE_ALG_ZBLOCK_SERVICE_CONFIGURE_T; + +typedef struct dpp_se4k_se_alg_zblock_hash_zcell_mono_t +{ + ZXIC_UINT32 ha_zcell3_mono_flag; + ZXIC_UINT32 ha_zcell3_tbl_id; + ZXIC_UINT32 ha_zcell2_mono_flag; + ZXIC_UINT32 ha_zcell2_tbl_id; + ZXIC_UINT32 ha_zcell1_mono_flag; + ZXIC_UINT32 ha_zcell1_tbl_id; + ZXIC_UINT32 ha_zcell0_mono_flag; + ZXIC_UINT32 ha_zcell0_tbl_id; +}DPP_SE4K_SE_ALG_ZBLOCK_HASH_ZCELL_MONO_T; + +typedef struct dpp_se4k_se_alg_zlock_hash_zreg_mono_t +{ + ZXIC_UINT32 ha_zreg3_mono_flag; + ZXIC_UINT32 ha_zreg3_tbl_id; + ZXIC_UINT32 ha_zreg2_mono_flag; + ZXIC_UINT32 ha_zreg2_tbl_id; + ZXIC_UINT32 ha_zreg1_mono_flag; + ZXIC_UINT32 ha_zreg1_tbl_id; + ZXIC_UINT32 ha_zreg0_mono_flag; + ZXIC_UINT32 ha_zreg0_tbl_id; +}DPP_SE4K_SE_ALG_ZLOCK_HASH_ZREG_MONO_T; + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_se_reg.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_se_reg.h new file mode 100644 index 0000000..2328ea6 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_se_reg.h @@ -0,0 +1,3438 @@ + +#ifndef _DPP_SE_REG_H_ +#define _DPP_SE_REG_H_ + +#ifdef __cplusplus +extern "C"{ +#endif + +typedef struct dpp_se_alg_init_ok_t +{ + ZXIC_UINT32 init_ok; +}DPP_SE_ALG_INIT_OK_T; + +typedef struct dpp_se_alg_cpu_rd_rdy_t +{ + ZXIC_UINT32 cpu_rd_rdy; +}DPP_SE_ALG_CPU_RD_RDY_T; + +typedef struct dpp_se_alg_cpu_rd_data_tmp0_t +{ + ZXIC_UINT32 cpu_rd_data_tmp0; +}DPP_SE_ALG_CPU_RD_DATA_TMP0_T; + +typedef struct dpp_se_alg_cpu_rd_data_tmp1_t +{ + ZXIC_UINT32 cpu_rd_data_tmp1; +}DPP_SE_ALG_CPU_RD_DATA_TMP1_T; + +typedef struct dpp_se_alg_cpu_rd_data_tmp2_t +{ + ZXIC_UINT32 cpu_rd_data_tmp2; +}DPP_SE_ALG_CPU_RD_DATA_TMP2_T; + +typedef struct dpp_se_alg_cpu_rd_data_tmp3_t +{ + ZXIC_UINT32 cpu_rd_data_tmp3; +}DPP_SE_ALG_CPU_RD_DATA_TMP3_T; + +typedef struct dpp_se_alg_cpu_rd_data_tmp4_t +{ + ZXIC_UINT32 cpu_rd_data_tmp4; +}DPP_SE_ALG_CPU_RD_DATA_TMP4_T; + +typedef struct dpp_se_alg_cpu_rd_data_tmp5_t +{ + ZXIC_UINT32 cpu_rd_data_tmp5; +}DPP_SE_ALG_CPU_RD_DATA_TMP5_T; + +typedef struct dpp_se_alg_cpu_rd_data_tmp6_t +{ + ZXIC_UINT32 cpu_rd_data_tmp6; +}DPP_SE_ALG_CPU_RD_DATA_TMP6_T; + +typedef struct dpp_se_alg_cpu_rd_data_tmp7_t +{ + ZXIC_UINT32 cpu_rd_data_tmp7; +}DPP_SE_ALG_CPU_RD_DATA_TMP7_T; + +typedef struct dpp_se_alg_cpu_rd_data_tmp8_t +{ + ZXIC_UINT32 cpu_rd_data_tmp8; +}DPP_SE_ALG_CPU_RD_DATA_TMP8_T; + +typedef struct dpp_se_alg_cpu_rd_data_tmp9_t +{ + ZXIC_UINT32 cpu_rd_data_tmp9; +}DPP_SE_ALG_CPU_RD_DATA_TMP9_T; + +typedef struct dpp_se_alg_cpu_rd_data_tmp10_t +{ + ZXIC_UINT32 cpu_rd_data_tmp10; +}DPP_SE_ALG_CPU_RD_DATA_TMP10_T; + +typedef struct dpp_se_alg_cpu_rd_data_tmp11_t +{ + ZXIC_UINT32 cpu_rd_data_tmp11; +}DPP_SE_ALG_CPU_RD_DATA_TMP11_T; + +typedef struct dpp_se_alg_cpu_rd_data_tmp12_t +{ + ZXIC_UINT32 cpu_rd_data_tmp12; +}DPP_SE_ALG_CPU_RD_DATA_TMP12_T; + +typedef struct dpp_se_alg_cpu_rd_data_tmp13_t +{ + ZXIC_UINT32 cpu_rd_data_tmp13; +}DPP_SE_ALG_CPU_RD_DATA_TMP13_T; + +typedef struct dpp_se_alg_cpu_rd_data_tmp14_t +{ + ZXIC_UINT32 cpu_rd_data_tmp14; +}DPP_SE_ALG_CPU_RD_DATA_TMP14_T; + +typedef struct dpp_se_alg_cpu_rd_data_tmp15_t +{ + ZXIC_UINT32 cpu_rd_data_tmp15; +}DPP_SE_ALG_CPU_RD_DATA_TMP15_T; + +typedef struct dpp_se_alg_lpm_v4_config_rgt_t +{ + ZXIC_UINT32 lpm_v4_shift_sel; + ZXIC_UINT32 lpm_v4_sram_cmp_flag; + ZXIC_UINT32 lpm_v4_ddr3_addr_sel; +}DPP_SE_ALG_LPM_V4_CONFIG_RGT_T; + +typedef struct dpp_se_alg_lpm_v6_config_rgt_t +{ + ZXIC_UINT32 lpm_v6_shift_sel; + ZXIC_UINT32 lpm_v6_sram_cmp_flag; + ZXIC_UINT32 lpm_v6_ddr3_addr_sel; +}DPP_SE_ALG_LPM_V6_CONFIG_RGT_T; + +typedef struct dpp_se_alg_lpm_ext_rsp_fifo_u0_pfull_ast_t +{ + ZXIC_UINT32 lpm_ext_rsp_fifo_u0_pfull_ast; +}DPP_SE_ALG_LPM_EXT_RSP_FIFO_U0_PFULL_AST_T; + +typedef struct dpp_se_as_hash_age_pat_cfg_t +{ + ZXIC_UINT32 hash_age_pat_cfg; +}DPP_SE_AS_HASH_AGE_PAT_CFG_T; + +typedef struct dpp_se_as_learn_rdy_cfg_t +{ + ZXIC_UINT32 learn_rdy_cfg; +}DPP_SE_AS_LEARN_RDY_CFG_T; + +typedef struct dpp_se_kschd_kschd_as_pful_cfg_t +{ + ZXIC_UINT32 kschd_as_pful_cfg; +}DPP_SE_KSCHD_KSCHD_AS_PFUL_CFG_T; + +typedef struct dpp_se_kschd_kschd_dir_pful_cfg_t +{ + ZXIC_UINT32 kschd_dir_pful_cfg; +}DPP_SE_KSCHD_KSCHD_DIR_PFUL_CFG_T; + +typedef struct dpp_se_kschd_kschd_as_ept_cfg_t +{ + ZXIC_UINT32 kschd_as_ept_cfg; +}DPP_SE_KSCHD_KSCHD_AS_EPT_CFG_T; + +typedef struct dpp_se_kschd_cpu_arbi_pful_cfg_t +{ + ZXIC_UINT32 cpu_arbi_pful_cfg; +}DPP_SE_KSCHD_CPU_ARBI_PFUL_CFG_T; + +typedef struct dpp_se_kschd_kschd_pbu_pful_cfg_t +{ + ZXIC_UINT32 kschd_pbu_pful_cfg; +}DPP_SE_KSCHD_KSCHD_PBU_PFUL_CFG_T; + +typedef struct dpp_se_rschd_rschd_dir_pful_cfg_t +{ + ZXIC_UINT32 rschd_dir_pful_cfg; +}DPP_SE_RSCHD_RSCHD_DIR_PFUL_CFG_T; + +typedef struct dpp_se_rschd_rschd_dir_ept_cfg_t +{ + ZXIC_UINT32 rschd_dir_ept_cfg; +}DPP_SE_RSCHD_RSCHD_DIR_EPT_CFG_T; + +typedef struct dpp_se_cfg_ppu_soft_rst_t +{ + ZXIC_UINT32 ppu_soft_rst; +}DPP_SE_CFG_PPU_SOFT_RST_T; + +typedef struct dpp_se_cfg_ept_flag_t +{ + ZXIC_UINT32 ept_flag; +}DPP_SE_CFG_EPT_FLAG_T; + +typedef struct dpp_se_cfg_ddr_key_lk0_3_t +{ + ZXIC_UINT32 ddr_key_lk0_3; +}DPP_SE_CFG_DDR_KEY_LK0_3_T; + +typedef struct dpp_se_cfg_ddr_key_lk0_2_t +{ + ZXIC_UINT32 ddr_key_lk0_2; +}DPP_SE_CFG_DDR_KEY_LK0_2_T; + +typedef struct dpp_se_cfg_ddr_key_lk0_1_t +{ + ZXIC_UINT32 ddr_key_lk0_1; +}DPP_SE_CFG_DDR_KEY_LK0_1_T; + +typedef struct dpp_se_cfg_ddr_key_lk0_0_t +{ + ZXIC_UINT32 ddr_key_lk0_0; +}DPP_SE_CFG_DDR_KEY_LK0_0_T; + +typedef struct dpp_se_cfg_ddr_key_lk1_3_t +{ + ZXIC_UINT32 ddr_key_lk1_3; +}DPP_SE_CFG_DDR_KEY_LK1_3_T; + +typedef struct dpp_se_cfg_ddr_key_lk1_2_t +{ + ZXIC_UINT32 ddr_key_lk1_2; +}DPP_SE_CFG_DDR_KEY_LK1_2_T; + +typedef struct dpp_se_cfg_ddr_key_lk1_1_t +{ + ZXIC_UINT32 ddr_key_lk1_1; +}DPP_SE_CFG_DDR_KEY_LK1_1_T; + +typedef struct dpp_se_cfg_ddr_key_lk1_0_t +{ + ZXIC_UINT32 ddr_key_lk1_0; +}DPP_SE_CFG_DDR_KEY_LK1_0_T; + +typedef struct dpp_se_cfg_hash_key_lk0_18_t +{ + ZXIC_UINT32 hash_key_lk0_18; +}DPP_SE_CFG_HASH_KEY_LK0_18_T; + +typedef struct dpp_se_cfg_hash_key_lk0_17_t +{ + ZXIC_UINT32 hash_key_lk0_17; +}DPP_SE_CFG_HASH_KEY_LK0_17_T; + +typedef struct dpp_se_cfg_hash_key_lk0_16_t +{ + ZXIC_UINT32 hash_key_lk0_16; +}DPP_SE_CFG_HASH_KEY_LK0_16_T; + +typedef struct dpp_se_cfg_hash_key_lk0_15_t +{ + ZXIC_UINT32 hash_key_lk0_15; +}DPP_SE_CFG_HASH_KEY_LK0_15_T; + +typedef struct dpp_se_cfg_hash_key_lk0_14_t +{ + ZXIC_UINT32 hash_key_lk0_14; +}DPP_SE_CFG_HASH_KEY_LK0_14_T; + +typedef struct dpp_se_cfg_hash_key_lk0_13_t +{ + ZXIC_UINT32 hash_key_lk0_13; +}DPP_SE_CFG_HASH_KEY_LK0_13_T; + +typedef struct dpp_se_cfg_hash_key_lk0_12_t +{ + ZXIC_UINT32 hash_key_lk0_12; +}DPP_SE_CFG_HASH_KEY_LK0_12_T; + +typedef struct dpp_se_cfg_hash_key_lk0_11_t +{ + ZXIC_UINT32 hash_key_lk0_11; +}DPP_SE_CFG_HASH_KEY_LK0_11_T; + +typedef struct dpp_se_cfg_hash_key_lk0_10_t +{ + ZXIC_UINT32 hash_key_lk0_10; +}DPP_SE_CFG_HASH_KEY_LK0_10_T; + +typedef struct dpp_se_cfg_hash_key_lk0_9_t +{ + ZXIC_UINT32 hash_key_lk0_9; +}DPP_SE_CFG_HASH_KEY_LK0_9_T; + +typedef struct dpp_se_cfg_hash_key_lk0_8_t +{ + ZXIC_UINT32 hash_key_lk0_8; +}DPP_SE_CFG_HASH_KEY_LK0_8_T; + +typedef struct dpp_se_cfg_hash_key_lk0_7_t +{ + ZXIC_UINT32 hash_key_lk0_7; +}DPP_SE_CFG_HASH_KEY_LK0_7_T; + +typedef struct dpp_se_cfg_hash_key_lk0_6_t +{ + ZXIC_UINT32 hash_key_lk0_6; +}DPP_SE_CFG_HASH_KEY_LK0_6_T; + +typedef struct dpp_se_cfg_hash_key_lk0_5_t +{ + ZXIC_UINT32 hash_key_lk0_5; +}DPP_SE_CFG_HASH_KEY_LK0_5_T; + +typedef struct dpp_se_cfg_hash_key_lk0_4_t +{ + ZXIC_UINT32 hash_key_lk0_4; +}DPP_SE_CFG_HASH_KEY_LK0_4_T; + +typedef struct dpp_se_cfg_hash_key_lk0_3_t +{ + ZXIC_UINT32 hash_key_lk0_3; +}DPP_SE_CFG_HASH_KEY_LK0_3_T; + +typedef struct dpp_se_cfg_hash_key_lk0_2_t +{ + ZXIC_UINT32 hash_key_lk0_2; +}DPP_SE_CFG_HASH_KEY_LK0_2_T; + +typedef struct dpp_se_cfg_hash_key_lk0_1_t +{ + ZXIC_UINT32 hash_key_lk0_1; +}DPP_SE_CFG_HASH_KEY_LK0_1_T; + +typedef struct dpp_se_cfg_hash_key_lk0_0_t +{ + ZXIC_UINT32 hash_key_lk0_0; +}DPP_SE_CFG_HASH_KEY_LK0_0_T; + +typedef struct dpp_se_cfg_hash_key_lk1_18_t +{ + ZXIC_UINT32 hash_key_lk1_18; +}DPP_SE_CFG_HASH_KEY_LK1_18_T; + +typedef struct dpp_se_cfg_hash_key_lk1_17_t +{ + ZXIC_UINT32 hash_key_lk1_17; +}DPP_SE_CFG_HASH_KEY_LK1_17_T; + +typedef struct dpp_se_cfg_hash_key_lk1_16_t +{ + ZXIC_UINT32 hash_key_lk1_16; +}DPP_SE_CFG_HASH_KEY_LK1_16_T; + +typedef struct dpp_se_cfg_hash_key_lk1_15_t +{ + ZXIC_UINT32 hash_key_lk1_15; +}DPP_SE_CFG_HASH_KEY_LK1_15_T; + +typedef struct dpp_se_cfg_hash_key_lk1_14_t +{ + ZXIC_UINT32 hash_key_lk1_14; +}DPP_SE_CFG_HASH_KEY_LK1_14_T; + +typedef struct dpp_se_cfg_hash_key_lk1_13_t +{ + ZXIC_UINT32 hash_key_lk1_13; +}DPP_SE_CFG_HASH_KEY_LK1_13_T; + +typedef struct dpp_se_cfg_hash_key_lk1_12_t +{ + ZXIC_UINT32 hash_key_lk1_12; +}DPP_SE_CFG_HASH_KEY_LK1_12_T; + +typedef struct dpp_se_cfg_hash_key_lk1_11_t +{ + ZXIC_UINT32 hash_key_lk1_11; +}DPP_SE_CFG_HASH_KEY_LK1_11_T; + +typedef struct dpp_se_cfg_hash_key_lk1_10_t +{ + ZXIC_UINT32 hash_key_lk1_10; +}DPP_SE_CFG_HASH_KEY_LK1_10_T; + +typedef struct dpp_se_cfg_hash_key_lk1_9_t +{ + ZXIC_UINT32 hash_key_lk1_9; +}DPP_SE_CFG_HASH_KEY_LK1_9_T; + +typedef struct dpp_se_cfg_hash_key_lk1_8_t +{ + ZXIC_UINT32 hash_key_lk1_8; +}DPP_SE_CFG_HASH_KEY_LK1_8_T; + +typedef struct dpp_se_cfg_hash_key_lk1_7_t +{ + ZXIC_UINT32 hash_key_lk1_7; +}DPP_SE_CFG_HASH_KEY_LK1_7_T; + +typedef struct dpp_se_cfg_hash_key_lk1_6_t +{ + ZXIC_UINT32 hash_key_lk1_6; +}DPP_SE_CFG_HASH_KEY_LK1_6_T; + +typedef struct dpp_se_cfg_hash_key_lk1_5_t +{ + ZXIC_UINT32 hash_key_lk1_5; +}DPP_SE_CFG_HASH_KEY_LK1_5_T; + +typedef struct dpp_se_cfg_hash_key_lk1_4_t +{ + ZXIC_UINT32 hash_key_lk1_4; +}DPP_SE_CFG_HASH_KEY_LK1_4_T; + +typedef struct dpp_se_cfg_hash_key_lk1_3_t +{ + ZXIC_UINT32 hash_key_lk1_3; +}DPP_SE_CFG_HASH_KEY_LK1_3_T; + +typedef struct dpp_se_cfg_hash_key_lk1_2_t +{ + ZXIC_UINT32 hash_key_lk1_2; +}DPP_SE_CFG_HASH_KEY_LK1_2_T; + +typedef struct dpp_se_cfg_hash_key_lk1_1_t +{ + ZXIC_UINT32 hash_key_lk1_1; +}DPP_SE_CFG_HASH_KEY_LK1_1_T; + +typedef struct dpp_se_cfg_hash_key_lk1_0_t +{ + ZXIC_UINT32 hash_key_lk1_0; +}DPP_SE_CFG_HASH_KEY_LK1_0_T; + +typedef struct dpp_se_cfg_hash_key_lk2_18_t +{ + ZXIC_UINT32 hash_key_lk2_18; +}DPP_SE_CFG_HASH_KEY_LK2_18_T; + +typedef struct dpp_se_cfg_hash_key_lk2_17_t +{ + ZXIC_UINT32 hash_key_lk2_17; +}DPP_SE_CFG_HASH_KEY_LK2_17_T; + +typedef struct dpp_se_cfg_hash_key_lk2_16_t +{ + ZXIC_UINT32 hash_key_lk2_16; +}DPP_SE_CFG_HASH_KEY_LK2_16_T; + +typedef struct dpp_se_cfg_hash_key_lk2_15_t +{ + ZXIC_UINT32 hash_key_lk2_15; +}DPP_SE_CFG_HASH_KEY_LK2_15_T; + +typedef struct dpp_se_cfg_hash_key_lk2_14_t +{ + ZXIC_UINT32 hash_key_lk2_14; +}DPP_SE_CFG_HASH_KEY_LK2_14_T; + +typedef struct dpp_se_cfg_hash_key_lk2_13_t +{ + ZXIC_UINT32 hash_key_lk2_13; +}DPP_SE_CFG_HASH_KEY_LK2_13_T; + +typedef struct dpp_se_cfg_hash_key_lk2_12_t +{ + ZXIC_UINT32 hash_key_lk2_12; +}DPP_SE_CFG_HASH_KEY_LK2_12_T; + +typedef struct dpp_se_cfg_hash_key_lk2_11_t +{ + ZXIC_UINT32 hash_key_lk2_11; +}DPP_SE_CFG_HASH_KEY_LK2_11_T; + +typedef struct dpp_se_cfg_hash_key_lk2_10_t +{ + ZXIC_UINT32 hash_key_lk2_10; +}DPP_SE_CFG_HASH_KEY_LK2_10_T; + +typedef struct dpp_se_cfg_hash_key_lk2_9_t +{ + ZXIC_UINT32 hash_key_lk2_9; +}DPP_SE_CFG_HASH_KEY_LK2_9_T; + +typedef struct dpp_se_cfg_hash_key_lk2_8_t +{ + ZXIC_UINT32 hash_key_lk2_8; +}DPP_SE_CFG_HASH_KEY_LK2_8_T; + +typedef struct dpp_se_cfg_hash_key_lk2_7_t +{ + ZXIC_UINT32 hash_key_lk2_7; +}DPP_SE_CFG_HASH_KEY_LK2_7_T; + +typedef struct dpp_se_cfg_hash_key_lk2_6_t +{ + ZXIC_UINT32 hash_key_lk2_6; +}DPP_SE_CFG_HASH_KEY_LK2_6_T; + +typedef struct dpp_se_cfg_hash_key_lk2_5_t +{ + ZXIC_UINT32 hash_key_lk2_5; +}DPP_SE_CFG_HASH_KEY_LK2_5_T; + +typedef struct dpp_se_cfg_hash_key_lk2_4_t +{ + ZXIC_UINT32 hash_key_lk2_4; +}DPP_SE_CFG_HASH_KEY_LK2_4_T; + +typedef struct dpp_se_cfg_hash_key_lk2_3_t +{ + ZXIC_UINT32 hash_key_lk2_3; +}DPP_SE_CFG_HASH_KEY_LK2_3_T; + +typedef struct dpp_se_cfg_hash_key_lk2_2_t +{ + ZXIC_UINT32 hash_key_lk2_2; +}DPP_SE_CFG_HASH_KEY_LK2_2_T; + +typedef struct dpp_se_cfg_hash_key_lk2_1_t +{ + ZXIC_UINT32 hash_key_lk2_1; +}DPP_SE_CFG_HASH_KEY_LK2_1_T; + +typedef struct dpp_se_cfg_hash_key_lk2_0_t +{ + ZXIC_UINT32 hash_key_lk2_0; +}DPP_SE_CFG_HASH_KEY_LK2_0_T; + +typedef struct dpp_se_cfg_hash_key_lk3_18_t +{ + ZXIC_UINT32 hash_key_lk3_18; +}DPP_SE_CFG_HASH_KEY_LK3_18_T; + +typedef struct dpp_se_cfg_hash_key_lk3_17_t +{ + ZXIC_UINT32 hash_key_lk3_17; +}DPP_SE_CFG_HASH_KEY_LK3_17_T; + +typedef struct dpp_se_cfg_hash_key_lk3_16_t +{ + ZXIC_UINT32 hash_key_lk3_16; +}DPP_SE_CFG_HASH_KEY_LK3_16_T; + +typedef struct dpp_se_cfg_hash_key_lk3_15_t +{ + ZXIC_UINT32 hash_key_lk3_15; +}DPP_SE_CFG_HASH_KEY_LK3_15_T; + +typedef struct dpp_se_cfg_hash_key_lk3_14_t +{ + ZXIC_UINT32 hash_key_lk3_14; +}DPP_SE_CFG_HASH_KEY_LK3_14_T; + +typedef struct dpp_se_cfg_hash_key_lk3_13_t +{ + ZXIC_UINT32 hash_key_lk3_13; +}DPP_SE_CFG_HASH_KEY_LK3_13_T; + +typedef struct dpp_se_cfg_hash_key_lk3_12_t +{ + ZXIC_UINT32 hash_key_lk3_12; +}DPP_SE_CFG_HASH_KEY_LK3_12_T; + +typedef struct dpp_se_cfg_hash_key_lk3_11_t +{ + ZXIC_UINT32 hash_key_lk3_11; +}DPP_SE_CFG_HASH_KEY_LK3_11_T; + +typedef struct dpp_se_cfg_hash_key_lk3_10_t +{ + ZXIC_UINT32 hash_key_lk3_10; +}DPP_SE_CFG_HASH_KEY_LK3_10_T; + +typedef struct dpp_se_cfg_hash_key_lk3_9_t +{ + ZXIC_UINT32 hash_key_lk3_9; +}DPP_SE_CFG_HASH_KEY_LK3_9_T; + +typedef struct dpp_se_cfg_hash_key_lk3_8_t +{ + ZXIC_UINT32 hash_key_lk3_8; +}DPP_SE_CFG_HASH_KEY_LK3_8_T; + +typedef struct dpp_se_cfg_hash_key_lk3_7_t +{ + ZXIC_UINT32 hash_key_lk3_7; +}DPP_SE_CFG_HASH_KEY_LK3_7_T; + +typedef struct dpp_se_cfg_hash_key_lk3_6_t +{ + ZXIC_UINT32 hash_key_lk3_6; +}DPP_SE_CFG_HASH_KEY_LK3_6_T; + +typedef struct dpp_se_cfg_hash_key_lk3_5_t +{ + ZXIC_UINT32 hash_key_lk3_5; +}DPP_SE_CFG_HASH_KEY_LK3_5_T; + +typedef struct dpp_se_cfg_hash_key_lk3_4_t +{ + ZXIC_UINT32 hash_key_lk3_4; +}DPP_SE_CFG_HASH_KEY_LK3_4_T; + +typedef struct dpp_se_cfg_hash_key_lk3_3_t +{ + ZXIC_UINT32 hash_key_lk3_3; +}DPP_SE_CFG_HASH_KEY_LK3_3_T; + +typedef struct dpp_se_cfg_hash_key_lk3_2_t +{ + ZXIC_UINT32 hash_key_lk3_2; +}DPP_SE_CFG_HASH_KEY_LK3_2_T; + +typedef struct dpp_se_cfg_hash_key_lk3_1_t +{ + ZXIC_UINT32 hash_key_lk3_1; +}DPP_SE_CFG_HASH_KEY_LK3_1_T; + +typedef struct dpp_se_cfg_hash_key_lk3_0_t +{ + ZXIC_UINT32 hash_key_lk3_0; +}DPP_SE_CFG_HASH_KEY_LK3_0_T; + +typedef struct dpp_se_cfg_lpm_key_lk0_6_t +{ + ZXIC_UINT32 lpm_key_lk0_6; +}DPP_SE_CFG_LPM_KEY_LK0_6_T; + +typedef struct dpp_se_cfg_lpm_key_lk0_5_t +{ + ZXIC_UINT32 lpm_key_lk0_5; +}DPP_SE_CFG_LPM_KEY_LK0_5_T; + +typedef struct dpp_se_cfg_lpm_key_lk0_4_t +{ + ZXIC_UINT32 lpm_key_lk0_4; +}DPP_SE_CFG_LPM_KEY_LK0_4_T; + +typedef struct dpp_se_cfg_lpm_key_lk0_3_t +{ + ZXIC_UINT32 lpm_key_lk0_3; +}DPP_SE_CFG_LPM_KEY_LK0_3_T; + +typedef struct dpp_se_cfg_lpm_key_lk0_2_t +{ + ZXIC_UINT32 lpm_key_lk0_2; +}DPP_SE_CFG_LPM_KEY_LK0_2_T; + +typedef struct dpp_se_cfg_lpm_key_lk0_1_t +{ + ZXIC_UINT32 lpm_key_lk0_1; +}DPP_SE_CFG_LPM_KEY_LK0_1_T; + +typedef struct dpp_se_cfg_lpm_key_lk0_0_t +{ + ZXIC_UINT32 lpm_key_lk0_0; +}DPP_SE_CFG_LPM_KEY_LK0_0_T; + +typedef struct dpp_se_cfg_lpm_key_lk1_6_t +{ + ZXIC_UINT32 lpm_key_lk1_6; +}DPP_SE_CFG_LPM_KEY_LK1_6_T; + +typedef struct dpp_se_cfg_lpm_key_lk1_5_t +{ + ZXIC_UINT32 lpm_key_lk1_5; +}DPP_SE_CFG_LPM_KEY_LK1_5_T; + +typedef struct dpp_se_cfg_lpm_key_lk1_4_t +{ + ZXIC_UINT32 lpm_key_lk1_4; +}DPP_SE_CFG_LPM_KEY_LK1_4_T; + +typedef struct dpp_se_cfg_lpm_key_lk1_3_t +{ + ZXIC_UINT32 lpm_key_lk1_3; +}DPP_SE_CFG_LPM_KEY_LK1_3_T; + +typedef struct dpp_se_cfg_lpm_key_lk1_2_t +{ + ZXIC_UINT32 lpm_key_lk1_2; +}DPP_SE_CFG_LPM_KEY_LK1_2_T; + +typedef struct dpp_se_cfg_lpm_key_lk1_1_t +{ + ZXIC_UINT32 lpm_key_lk1_1; +}DPP_SE_CFG_LPM_KEY_LK1_1_T; + +typedef struct dpp_se_cfg_lpm_key_lk1_0_t +{ + ZXIC_UINT32 lpm_key_lk1_0; +}DPP_SE_CFG_LPM_KEY_LK1_0_T; + +typedef struct dpp_se_cfg_lpm_key_lk2_6_t +{ + ZXIC_UINT32 lpm_key_lk2_6; +}DPP_SE_CFG_LPM_KEY_LK2_6_T; + +typedef struct dpp_se_cfg_lpm_key_lk2_5_t +{ + ZXIC_UINT32 lpm_key_lk2_5; +}DPP_SE_CFG_LPM_KEY_LK2_5_T; + +typedef struct dpp_se_cfg_lpm_key_lk2_4_t +{ + ZXIC_UINT32 lpm_key_lk2_4; +}DPP_SE_CFG_LPM_KEY_LK2_4_T; + +typedef struct dpp_se_cfg_lpm_key_lk2_3_t +{ + ZXIC_UINT32 lpm_key_lk2_3; +}DPP_SE_CFG_LPM_KEY_LK2_3_T; + +typedef struct dpp_se_cfg_lpm_key_lk2_2_t +{ + ZXIC_UINT32 lpm_key_lk2_2; +}DPP_SE_CFG_LPM_KEY_LK2_2_T; + +typedef struct dpp_se_cfg_lpm_key_lk2_1_t +{ + ZXIC_UINT32 lpm_key_lk2_1; +}DPP_SE_CFG_LPM_KEY_LK2_1_T; + +typedef struct dpp_se_cfg_lpm_key_lk2_0_t +{ + ZXIC_UINT32 lpm_key_lk2_0; +}DPP_SE_CFG_LPM_KEY_LK2_0_T; + +typedef struct dpp_se_cfg_lpm_key_lk3_6_t +{ + ZXIC_UINT32 lpm_key_lk3_6; +}DPP_SE_CFG_LPM_KEY_LK3_6_T; + +typedef struct dpp_se_cfg_lpm_key_lk3_5_t +{ + ZXIC_UINT32 lpm_key_lk3_5; +}DPP_SE_CFG_LPM_KEY_LK3_5_T; + +typedef struct dpp_se_cfg_lpm_key_lk3_4_t +{ + ZXIC_UINT32 lpm_key_lk3_4; +}DPP_SE_CFG_LPM_KEY_LK3_4_T; + +typedef struct dpp_se_cfg_lpm_key_lk3_3_t +{ + ZXIC_UINT32 lpm_key_lk3_3; +}DPP_SE_CFG_LPM_KEY_LK3_3_T; + +typedef struct dpp_se_cfg_lpm_key_lk3_2_t +{ + ZXIC_UINT32 lpm_key_lk3_2; +}DPP_SE_CFG_LPM_KEY_LK3_2_T; + +typedef struct dpp_se_cfg_lpm_key_lk3_1_t +{ + ZXIC_UINT32 lpm_key_lk3_1; +}DPP_SE_CFG_LPM_KEY_LK3_1_T; + +typedef struct dpp_se_cfg_lpm_key_lk3_0_t +{ + ZXIC_UINT32 lpm_key_lk3_0; +}DPP_SE_CFG_LPM_KEY_LK3_0_T; + +typedef struct dpp_se_cfg_etcam_key_lk0_22_t +{ + ZXIC_UINT32 etcam_key_lk0_22; +}DPP_SE_CFG_ETCAM_KEY_LK0_22_T; + +typedef struct dpp_se_cfg_etcam_key_lk0_21_t +{ + ZXIC_UINT32 etcam_key_lk0_21; +}DPP_SE_CFG_ETCAM_KEY_LK0_21_T; + +typedef struct dpp_se_cfg_etcam_key_lk0_20_t +{ + ZXIC_UINT32 etcam_key_lk0_20; +}DPP_SE_CFG_ETCAM_KEY_LK0_20_T; + +typedef struct dpp_se_cfg_etcam_key_lk0_19_t +{ + ZXIC_UINT32 etcam_key_lk0_19; +}DPP_SE_CFG_ETCAM_KEY_LK0_19_T; + +typedef struct dpp_se_cfg_etcam_key_lk0_18_t +{ + ZXIC_UINT32 etcam_key_lk0_18; +}DPP_SE_CFG_ETCAM_KEY_LK0_18_T; + +typedef struct dpp_se_cfg_etcam_key_lk0_17_t +{ + ZXIC_UINT32 etcam_key_lk0_17; +}DPP_SE_CFG_ETCAM_KEY_LK0_17_T; + +typedef struct dpp_se_cfg_etcam_key_lk0_16_t +{ + ZXIC_UINT32 etcam_key_lk0_16; +}DPP_SE_CFG_ETCAM_KEY_LK0_16_T; + +typedef struct dpp_se_cfg_etcam_key_lk0_15_t +{ + ZXIC_UINT32 etcam_key_lk0_15; +}DPP_SE_CFG_ETCAM_KEY_LK0_15_T; + +typedef struct dpp_se_cfg_etcam_key_lk0_14_t +{ + ZXIC_UINT32 etcam_key_lk0_14; +}DPP_SE_CFG_ETCAM_KEY_LK0_14_T; + +typedef struct dpp_se_cfg_etcam_key_lk0_13_t +{ + ZXIC_UINT32 etcam_key_lk0_13; +}DPP_SE_CFG_ETCAM_KEY_LK0_13_T; + +typedef struct dpp_se_cfg_etcam_key_lk0_12_t +{ + ZXIC_UINT32 etcam_key_lk0_12; +}DPP_SE_CFG_ETCAM_KEY_LK0_12_T; + +typedef struct dpp_se_cfg_etcam_key_lk0_11_t +{ + ZXIC_UINT32 etcam_key_lk0_11; +}DPP_SE_CFG_ETCAM_KEY_LK0_11_T; + +typedef struct dpp_se_cfg_etcam_key_lk0_10_t +{ + ZXIC_UINT32 etcam_key_lk0_10; +}DPP_SE_CFG_ETCAM_KEY_LK0_10_T; + +typedef struct dpp_se_cfg_etcam_key_lk0_9_t +{ + ZXIC_UINT32 etcam_key_lk0_9; +}DPP_SE_CFG_ETCAM_KEY_LK0_9_T; + +typedef struct dpp_se_cfg_etcam_key_lk0_8_t +{ + ZXIC_UINT32 etcam_key_lk0_8; +}DPP_SE_CFG_ETCAM_KEY_LK0_8_T; + +typedef struct dpp_se_cfg_etcam_key_lk0_7_t +{ + ZXIC_UINT32 etcam_key_lk0_7; +}DPP_SE_CFG_ETCAM_KEY_LK0_7_T; + +typedef struct dpp_se_cfg_etcam_key_lk0_6_t +{ + ZXIC_UINT32 etcam_key_lk0_6; +}DPP_SE_CFG_ETCAM_KEY_LK0_6_T; + +typedef struct dpp_se_cfg_etcam_key_lk0_5_t +{ + ZXIC_UINT32 etcam_key_lk0_5; +}DPP_SE_CFG_ETCAM_KEY_LK0_5_T; + +typedef struct dpp_se_cfg_etcam_key_lk0_4_t +{ + ZXIC_UINT32 etcam_key_lk0_4; +}DPP_SE_CFG_ETCAM_KEY_LK0_4_T; + +typedef struct dpp_se_cfg_etcam_key_lk0_3_t +{ + ZXIC_UINT32 etcam_key_lk0_3; +}DPP_SE_CFG_ETCAM_KEY_LK0_3_T; + +typedef struct dpp_se_cfg_etcam_key_lk0_2_t +{ + ZXIC_UINT32 etcam_key_lk0_2; +}DPP_SE_CFG_ETCAM_KEY_LK0_2_T; + +typedef struct dpp_se_cfg_etcam_key_lk0_1_t +{ + ZXIC_UINT32 etcam_key_lk0_1; +}DPP_SE_CFG_ETCAM_KEY_LK0_1_T; + +typedef struct dpp_se_cfg_etcam_key_lk0_0_t +{ + ZXIC_UINT32 etcam_key_lk0_0; +}DPP_SE_CFG_ETCAM_KEY_LK0_0_T; + +typedef struct dpp_se_cfg_etcam_key_lk1_22_t +{ + ZXIC_UINT32 etcam_key_lk1_22; +}DPP_SE_CFG_ETCAM_KEY_LK1_22_T; + +typedef struct dpp_se_cfg_etcam_key_lk1_21_t +{ + ZXIC_UINT32 etcam_key_lk1_21; +}DPP_SE_CFG_ETCAM_KEY_LK1_21_T; + +typedef struct dpp_se_cfg_etcam_key_lk1_20_t +{ + ZXIC_UINT32 etcam_key_lk1_20; +}DPP_SE_CFG_ETCAM_KEY_LK1_20_T; + +typedef struct dpp_se_cfg_etcam_key_lk1_19_t +{ + ZXIC_UINT32 etcam_key_lk1_19; +}DPP_SE_CFG_ETCAM_KEY_LK1_19_T; + +typedef struct dpp_se_cfg_etcam_key_lk1_18_t +{ + ZXIC_UINT32 etcam_key_lk1_18; +}DPP_SE_CFG_ETCAM_KEY_LK1_18_T; + +typedef struct dpp_se_cfg_etcam_key_lk1_17_t +{ + ZXIC_UINT32 etcam_key_lk1_17; +}DPP_SE_CFG_ETCAM_KEY_LK1_17_T; + +typedef struct dpp_se_cfg_etcam_key_lk1_16_t +{ + ZXIC_UINT32 etcam_key_lk1_16; +}DPP_SE_CFG_ETCAM_KEY_LK1_16_T; + +typedef struct dpp_se_cfg_etcam_key_lk1_15_t +{ + ZXIC_UINT32 etcam_key_lk1_15; +}DPP_SE_CFG_ETCAM_KEY_LK1_15_T; + +typedef struct dpp_se_cfg_etcam_key_lk1_14_t +{ + ZXIC_UINT32 etcam_key_lk1_14; +}DPP_SE_CFG_ETCAM_KEY_LK1_14_T; + +typedef struct dpp_se_cfg_etcam_key_lk1_13_t +{ + ZXIC_UINT32 etcam_key_lk1_13; +}DPP_SE_CFG_ETCAM_KEY_LK1_13_T; + +typedef struct dpp_se_cfg_etcam_key_lk1_12_t +{ + ZXIC_UINT32 etcam_key_lk1_12; +}DPP_SE_CFG_ETCAM_KEY_LK1_12_T; + +typedef struct dpp_se_cfg_etcam_key_lk1_11_t +{ + ZXIC_UINT32 etcam_key_lk1_11; +}DPP_SE_CFG_ETCAM_KEY_LK1_11_T; + +typedef struct dpp_se_cfg_etcam_key_lk1_10_t +{ + ZXIC_UINT32 etcam_key_lk1_10; +}DPP_SE_CFG_ETCAM_KEY_LK1_10_T; + +typedef struct dpp_se_cfg_etcam_key_lk1_9_t +{ + ZXIC_UINT32 etcam_key_lk1_9; +}DPP_SE_CFG_ETCAM_KEY_LK1_9_T; + +typedef struct dpp_se_cfg_etcam_key_lk1_8_t +{ + ZXIC_UINT32 etcam_key_lk1_8; +}DPP_SE_CFG_ETCAM_KEY_LK1_8_T; + +typedef struct dpp_se_cfg_etcam_key_lk1_7_t +{ + ZXIC_UINT32 etcam_key_lk1_7; +}DPP_SE_CFG_ETCAM_KEY_LK1_7_T; + +typedef struct dpp_se_cfg_etcam_key_lk1_6_t +{ + ZXIC_UINT32 etcam_key_lk1_6; +}DPP_SE_CFG_ETCAM_KEY_LK1_6_T; + +typedef struct dpp_se_cfg_etcam_key_lk1_5_t +{ + ZXIC_UINT32 etcam_key_lk1_5; +}DPP_SE_CFG_ETCAM_KEY_LK1_5_T; + +typedef struct dpp_se_cfg_etcam_key_lk1_4_t +{ + ZXIC_UINT32 etcam_key_lk1_4; +}DPP_SE_CFG_ETCAM_KEY_LK1_4_T; + +typedef struct dpp_se_cfg_etcam_key_lk1_3_t +{ + ZXIC_UINT32 etcam_key_lk1_3; +}DPP_SE_CFG_ETCAM_KEY_LK1_3_T; + +typedef struct dpp_se_cfg_etcam_key_lk1_2_t +{ + ZXIC_UINT32 etcam_key_lk1_2; +}DPP_SE_CFG_ETCAM_KEY_LK1_2_T; + +typedef struct dpp_se_cfg_etcam_key_lk1_1_t +{ + ZXIC_UINT32 etcam_key_lk1_1; +}DPP_SE_CFG_ETCAM_KEY_LK1_1_T; + +typedef struct dpp_se_cfg_etcam_key_lk1_0_t +{ + ZXIC_UINT32 etcam_key_lk1_0; +}DPP_SE_CFG_ETCAM_KEY_LK1_0_T; + +typedef struct dpp_se_cfg_etcam_key_lk2_22_t +{ + ZXIC_UINT32 etcam_key_lk2_22; +}DPP_SE_CFG_ETCAM_KEY_LK2_22_T; + +typedef struct dpp_se_cfg_etcam_key_lk2_21_t +{ + ZXIC_UINT32 etcam_key_lk2_21; +}DPP_SE_CFG_ETCAM_KEY_LK2_21_T; + +typedef struct dpp_se_cfg_etcam_key_lk2_20_t +{ + ZXIC_UINT32 etcam_key_lk2_20; +}DPP_SE_CFG_ETCAM_KEY_LK2_20_T; + +typedef struct dpp_se_cfg_etcam_key_lk2_19_t +{ + ZXIC_UINT32 etcam_key_lk2_19; +}DPP_SE_CFG_ETCAM_KEY_LK2_19_T; + +typedef struct dpp_se_cfg_etcam_key_lk2_18_t +{ + ZXIC_UINT32 etcam_key_lk2_18; +}DPP_SE_CFG_ETCAM_KEY_LK2_18_T; + +typedef struct dpp_se_cfg_etcam_key_lk2_17_t +{ + ZXIC_UINT32 etcam_key_lk2_17; +}DPP_SE_CFG_ETCAM_KEY_LK2_17_T; + +typedef struct dpp_se_cfg_etcam_key_lk2_16_t +{ + ZXIC_UINT32 etcam_key_lk2_16; +}DPP_SE_CFG_ETCAM_KEY_LK2_16_T; + +typedef struct dpp_se_cfg_etcam_key_lk2_15_t +{ + ZXIC_UINT32 etcam_key_lk2_15; +}DPP_SE_CFG_ETCAM_KEY_LK2_15_T; + +typedef struct dpp_se_cfg_etcam_key_lk2_14_t +{ + ZXIC_UINT32 etcam_key_lk2_14; +}DPP_SE_CFG_ETCAM_KEY_LK2_14_T; + +typedef struct dpp_se_cfg_etcam_key_lk2_13_t +{ + ZXIC_UINT32 etcam_key_lk2_13; +}DPP_SE_CFG_ETCAM_KEY_LK2_13_T; + +typedef struct dpp_se_cfg_etcam_key_lk2_12_t +{ + ZXIC_UINT32 etcam_key_lk2_12; +}DPP_SE_CFG_ETCAM_KEY_LK2_12_T; + +typedef struct dpp_se_cfg_etcam_key_lk2_11_t +{ + ZXIC_UINT32 etcam_key_lk2_11; +}DPP_SE_CFG_ETCAM_KEY_LK2_11_T; + +typedef struct dpp_se_cfg_etcam_key_lk2_10_t +{ + ZXIC_UINT32 etcam_key_lk2_10; +}DPP_SE_CFG_ETCAM_KEY_LK2_10_T; + +typedef struct dpp_se_cfg_etcam_key_lk2_9_t +{ + ZXIC_UINT32 etcam_key_lk2_9; +}DPP_SE_CFG_ETCAM_KEY_LK2_9_T; + +typedef struct dpp_se_cfg_etcam_key_lk2_8_t +{ + ZXIC_UINT32 etcam_key_lk2_8; +}DPP_SE_CFG_ETCAM_KEY_LK2_8_T; + +typedef struct dpp_se_cfg_etcam_key_lk2_7_t +{ + ZXIC_UINT32 etcam_key_lk2_7; +}DPP_SE_CFG_ETCAM_KEY_LK2_7_T; + +typedef struct dpp_se_cfg_etcam_key_lk2_6_t +{ + ZXIC_UINT32 etcam_key_lk2_6; +}DPP_SE_CFG_ETCAM_KEY_LK2_6_T; + +typedef struct dpp_se_cfg_etcam_key_lk2_5_t +{ + ZXIC_UINT32 etcam_key_lk2_5; +}DPP_SE_CFG_ETCAM_KEY_LK2_5_T; + +typedef struct dpp_se_cfg_etcam_key_lk2_4_t +{ + ZXIC_UINT32 etcam_key_lk2_4; +}DPP_SE_CFG_ETCAM_KEY_LK2_4_T; + +typedef struct dpp_se_cfg_etcam_key_lk2_3_t +{ + ZXIC_UINT32 etcam_key_lk2_3; +}DPP_SE_CFG_ETCAM_KEY_LK2_3_T; + +typedef struct dpp_se_cfg_etcam_key_lk2_2_t +{ + ZXIC_UINT32 etcam_key_lk2_2; +}DPP_SE_CFG_ETCAM_KEY_LK2_2_T; + +typedef struct dpp_se_cfg_etcam_key_lk2_1_t +{ + ZXIC_UINT32 etcam_key_lk2_1; +}DPP_SE_CFG_ETCAM_KEY_LK2_1_T; + +typedef struct dpp_se_cfg_etcam_key_lk2_0_t +{ + ZXIC_UINT32 etcam_key_lk2_0; +}DPP_SE_CFG_ETCAM_KEY_LK2_0_T; + +typedef struct dpp_se_cfg_etcam_key_lk3_22_t +{ + ZXIC_UINT32 etcam_key_lk3_22; +}DPP_SE_CFG_ETCAM_KEY_LK3_22_T; + +typedef struct dpp_se_cfg_etcam_key_lk3_21_t +{ + ZXIC_UINT32 etcam_key_lk3_21; +}DPP_SE_CFG_ETCAM_KEY_LK3_21_T; + +typedef struct dpp_se_cfg_etcam_key_lk3_20_t +{ + ZXIC_UINT32 etcam_key_lk3_20; +}DPP_SE_CFG_ETCAM_KEY_LK3_20_T; + +typedef struct dpp_se_cfg_etcam_key_lk3_19_t +{ + ZXIC_UINT32 etcam_key_lk3_19; +}DPP_SE_CFG_ETCAM_KEY_LK3_19_T; + +typedef struct dpp_se_cfg_etcam_key_lk3_18_t +{ + ZXIC_UINT32 etcam_key_lk3_18; +}DPP_SE_CFG_ETCAM_KEY_LK3_18_T; + +typedef struct dpp_se_cfg_etcam_key_lk3_17_t +{ + ZXIC_UINT32 etcam_key_lk3_17; +}DPP_SE_CFG_ETCAM_KEY_LK3_17_T; + +typedef struct dpp_se_cfg_etcam_key_lk3_16_t +{ + ZXIC_UINT32 etcam_key_lk3_16; +}DPP_SE_CFG_ETCAM_KEY_LK3_16_T; + +typedef struct dpp_se_cfg_etcam_key_lk3_15_t +{ + ZXIC_UINT32 etcam_key_lk3_15; +}DPP_SE_CFG_ETCAM_KEY_LK3_15_T; + +typedef struct dpp_se_cfg_etcam_key_lk3_14_t +{ + ZXIC_UINT32 etcam_key_lk3_14; +}DPP_SE_CFG_ETCAM_KEY_LK3_14_T; + +typedef struct dpp_se_cfg_etcam_key_lk3_13_t +{ + ZXIC_UINT32 etcam_key_lk3_13; +}DPP_SE_CFG_ETCAM_KEY_LK3_13_T; + +typedef struct dpp_se_cfg_etcam_key_lk3_12_t +{ + ZXIC_UINT32 etcam_key_lk3_12; +}DPP_SE_CFG_ETCAM_KEY_LK3_12_T; + +typedef struct dpp_se_cfg_etcam_key_lk3_11_t +{ + ZXIC_UINT32 etcam_key_lk3_11; +}DPP_SE_CFG_ETCAM_KEY_LK3_11_T; + +typedef struct dpp_se_cfg_etcam_key_lk3_10_t +{ + ZXIC_UINT32 etcam_key_lk3_10; +}DPP_SE_CFG_ETCAM_KEY_LK3_10_T; + +typedef struct dpp_se_cfg_etcam_key_lk3_9_t +{ + ZXIC_UINT32 etcam_key_lk3_9; +}DPP_SE_CFG_ETCAM_KEY_LK3_9_T; + +typedef struct dpp_se_cfg_etcam_key_lk3_8_t +{ + ZXIC_UINT32 etcam_key_lk3_8; +}DPP_SE_CFG_ETCAM_KEY_LK3_8_T; + +typedef struct dpp_se_cfg_etcam_key_lk3_7_t +{ + ZXIC_UINT32 etcam_key_lk3_7; +}DPP_SE_CFG_ETCAM_KEY_LK3_7_T; + +typedef struct dpp_se_cfg_etcam_key_lk3_6_t +{ + ZXIC_UINT32 etcam_key_lk3_6; +}DPP_SE_CFG_ETCAM_KEY_LK3_6_T; + +typedef struct dpp_se_cfg_etcam_key_lk3_5_t +{ + ZXIC_UINT32 etcam_key_lk3_5; +}DPP_SE_CFG_ETCAM_KEY_LK3_5_T; + +typedef struct dpp_se_cfg_etcam_key_lk3_4_t +{ + ZXIC_UINT32 etcam_key_lk3_4; +}DPP_SE_CFG_ETCAM_KEY_LK3_4_T; + +typedef struct dpp_se_cfg_etcam_key_lk3_3_t +{ + ZXIC_UINT32 etcam_key_lk3_3; +}DPP_SE_CFG_ETCAM_KEY_LK3_3_T; + +typedef struct dpp_se_cfg_etcam_key_lk3_2_t +{ + ZXIC_UINT32 etcam_key_lk3_2; +}DPP_SE_CFG_ETCAM_KEY_LK3_2_T; + +typedef struct dpp_se_cfg_etcam_key_lk3_1_t +{ + ZXIC_UINT32 etcam_key_lk3_1; +}DPP_SE_CFG_ETCAM_KEY_LK3_1_T; + +typedef struct dpp_se_cfg_etcam_key_lk3_0_t +{ + ZXIC_UINT32 etcam_key_lk3_0; +}DPP_SE_CFG_ETCAM_KEY_LK3_0_T; + +typedef struct dpp_se_cfg_pbu_key_lk0_3_t +{ + ZXIC_UINT32 pbu_key_lk0_3; +}DPP_SE_CFG_PBU_KEY_LK0_3_T; + +typedef struct dpp_se_cfg_pbu_key_lk0_2_t +{ + ZXIC_UINT32 pbu_key_lk0_2; +}DPP_SE_CFG_PBU_KEY_LK0_2_T; + +typedef struct dpp_se_cfg_pbu_key_lk0_1_t +{ + ZXIC_UINT32 pbu_key_lk0_1; +}DPP_SE_CFG_PBU_KEY_LK0_1_T; + +typedef struct dpp_se_cfg_pbu_key_lk0_0_t +{ + ZXIC_UINT32 pbu_key_lk0_0; +}DPP_SE_CFG_PBU_KEY_LK0_0_T; + +typedef struct dpp_se_cfg_pbu_key_lk1_3_t +{ + ZXIC_UINT32 pbu_key_lk1_3; +}DPP_SE_CFG_PBU_KEY_LK1_3_T; + +typedef struct dpp_se_cfg_pbu_key_lk1_2_t +{ + ZXIC_UINT32 pbu_key_lk1_2; +}DPP_SE_CFG_PBU_KEY_LK1_2_T; + +typedef struct dpp_se_cfg_pbu_key_lk1_1_t +{ + ZXIC_UINT32 pbu_key_lk1_1; +}DPP_SE_CFG_PBU_KEY_LK1_1_T; + +typedef struct dpp_se_cfg_pbu_key_lk1_0_t +{ + ZXIC_UINT32 pbu_key_lk1_0; +}DPP_SE_CFG_PBU_KEY_LK1_0_T; + +typedef struct dpp_se_cfg_pbu_key_lk2_3_t +{ + ZXIC_UINT32 pbu_key_lk2_3; +}DPP_SE_CFG_PBU_KEY_LK2_3_T; + +typedef struct dpp_se_cfg_pbu_key_lk2_2_t +{ + ZXIC_UINT32 pbu_key_lk2_2; +}DPP_SE_CFG_PBU_KEY_LK2_2_T; + +typedef struct dpp_se_cfg_pbu_key_lk2_1_t +{ + ZXIC_UINT32 pbu_key_lk2_1; +}DPP_SE_CFG_PBU_KEY_LK2_1_T; + +typedef struct dpp_se_cfg_pbu_key_lk2_0_t +{ + ZXIC_UINT32 pbu_key_lk2_0; +}DPP_SE_CFG_PBU_KEY_LK2_0_T; + +typedef struct dpp_se_cfg_pbu_key_lk3_3_t +{ + ZXIC_UINT32 pbu_key_lk3_3; +}DPP_SE_CFG_PBU_KEY_LK3_3_T; + +typedef struct dpp_se_cfg_pbu_key_lk3_2_t +{ + ZXIC_UINT32 pbu_key_lk3_2; +}DPP_SE_CFG_PBU_KEY_LK3_2_T; + +typedef struct dpp_se_cfg_pbu_key_lk3_1_t +{ + ZXIC_UINT32 pbu_key_lk3_1; +}DPP_SE_CFG_PBU_KEY_LK3_1_T; + +typedef struct dpp_se_cfg_pbu_key_lk3_0_t +{ + ZXIC_UINT32 pbu_key_lk3_0; +}DPP_SE_CFG_PBU_KEY_LK3_0_T; + +typedef struct dpp_se_alg_schd_learn_fifo_pfull_ast_t +{ + ZXIC_UINT32 schd_learn_fifo_pfull_ast; +}DPP_SE_ALG_SCHD_LEARN_FIFO_PFULL_AST_T; + +typedef struct dpp_se_alg_schd_learn_fifo_pfull_neg_t +{ + ZXIC_UINT32 schd_learn_fifo_pfull_neg; +}DPP_SE_ALG_SCHD_LEARN_FIFO_PFULL_NEG_T; + +typedef struct dpp_se_alg_schd_hash0_fifo_pfull_ast_t +{ + ZXIC_UINT32 schd_hash0_fifo_pfull_ast; +}DPP_SE_ALG_SCHD_HASH0_FIFO_PFULL_AST_T; + +typedef struct dpp_se_alg_schd_hash0_fifo_pfull_neg_t +{ + ZXIC_UINT32 schd_hash0_fifo_pfull_neg; +}DPP_SE_ALG_SCHD_HASH0_FIFO_PFULL_NEG_T; + +typedef struct dpp_se_alg_schd_hash1_fifo_pfull_ast_t +{ + ZXIC_UINT32 schd_hash1_fifo_pfull_ast; +}DPP_SE_ALG_SCHD_HASH1_FIFO_PFULL_AST_T; + +typedef struct dpp_se_alg_schd_hash1_fifo_pfull_neg_t +{ + ZXIC_UINT32 schd_hash1_fifo_pfull_neg; +}DPP_SE_ALG_SCHD_HASH1_FIFO_PFULL_NEG_T; + +typedef struct dpp_se_alg_schd_hash2_fifo_pfull_ast_t +{ + ZXIC_UINT32 schd_hash2_fifo_pfull_ast; +}DPP_SE_ALG_SCHD_HASH2_FIFO_PFULL_AST_T; + +typedef struct dpp_se_alg_schd_hash2_fifo_pfull_neg_t +{ + ZXIC_UINT32 schd_hash2_fifo_pfull_neg; +}DPP_SE_ALG_SCHD_HASH2_FIFO_PFULL_NEG_T; + +typedef struct dpp_se_alg_schd_hash3_fifo_pfull_ast_t +{ + ZXIC_UINT32 schd_hash3_fifo_pfull_ast; +}DPP_SE_ALG_SCHD_HASH3_FIFO_PFULL_AST_T; + +typedef struct dpp_se_alg_schd_hash3_fifo_pfull_neg_t +{ + ZXIC_UINT32 schd_hash3_fifo_pfull_neg; +}DPP_SE_ALG_SCHD_HASH3_FIFO_PFULL_NEG_T; + +typedef struct dpp_se_alg_schd_lpm_fifo_pfull_ast_t +{ + ZXIC_UINT32 schd_lpm_fifo_pfull_ast; +}DPP_SE_ALG_SCHD_LPM_FIFO_PFULL_AST_T; + +typedef struct dpp_se_alg_schd_lpm_fifo_pfull_neg_t +{ + ZXIC_UINT32 schd_lpm_fifo_pfull_neg; +}DPP_SE_ALG_SCHD_LPM_FIFO_PFULL_NEG_T; + +typedef struct dpp_se_alg_hash0_key_fifo_pfull_ast_t +{ + ZXIC_UINT32 hash0_key_fifo_pfull_ast; +}DPP_SE_ALG_HASH0_KEY_FIFO_PFULL_AST_T; + +typedef struct dpp_se_alg_hash0_key_fifo_pfull_neg_t +{ + ZXIC_UINT32 hash0_key_fifo_pfull_ast; +}DPP_SE_ALG_HASH0_KEY_FIFO_PFULL_NEG_T; + +typedef struct dpp_se_alg_hash0_sreq_fifo_pfull_ast_t +{ + ZXIC_UINT32 hash0_sreq_fifo_pfull_ast; +}DPP_SE_ALG_HASH0_SREQ_FIFO_PFULL_AST_T; + +typedef struct dpp_se_alg_hash0_sreq_fifo_pfull_neg_t +{ + ZXIC_UINT32 hash0_sreq_fifo_pfull_neg; +}DPP_SE_ALG_HASH0_SREQ_FIFO_PFULL_NEG_T; + +typedef struct dpp_se_alg_hash0_int_rsp_fifo_pfull_ast_t +{ + ZXIC_UINT32 hash0_int_rsp_fifo_pfull_ast; +}DPP_SE_ALG_HASH0_INT_RSP_FIFO_PFULL_AST_T; + +typedef struct dpp_se_alg_hash0_int_rsp_fifo_pfull_neg_t +{ + ZXIC_UINT32 hash0_int_rsp_fifo_pfull_neg; +}DPP_SE_ALG_HASH0_INT_RSP_FIFO_PFULL_NEG_T; + +typedef struct dpp_se_alg_hash0_ext_rsp_fifo_pfull_ast_t +{ + ZXIC_UINT32 hash0_ext_rsp_fifo_pfull_ast; +}DPP_SE_ALG_HASH0_EXT_RSP_FIFO_PFULL_AST_T; + +typedef struct dpp_se_alg_hash0_ext_rsp_fifo_pfull_neg_t +{ + ZXIC_UINT32 hash0_ext_rsp_fifo_pfull_neg; +}DPP_SE_ALG_HASH0_EXT_RSP_FIFO_PFULL_NEG_T; + +typedef struct dpp_se_alg_hash1_key_fifo_pfull_ast_t +{ + ZXIC_UINT32 hash1_key_fifo_pfull_ast; +}DPP_SE_ALG_HASH1_KEY_FIFO_PFULL_AST_T; + +typedef struct dpp_se_alg_hash1_key_fifo_pfull_neg_t +{ + ZXIC_UINT32 hash1_key_fifo_pfull_ast; +}DPP_SE_ALG_HASH1_KEY_FIFO_PFULL_NEG_T; + +typedef struct dpp_se_alg_hash1_sreq_fifo_pfull_ast_t +{ + ZXIC_UINT32 hash1_sreq_fifo_pfull_ast; +}DPP_SE_ALG_HASH1_SREQ_FIFO_PFULL_AST_T; + +typedef struct dpp_se_alg_hash1_sreq_fifo_pfull_neg_t +{ + ZXIC_UINT32 hash1_sreq_fifo_pfull_neg; +}DPP_SE_ALG_HASH1_SREQ_FIFO_PFULL_NEG_T; + +typedef struct dpp_se_alg_hash1_int_rsp_fifo_pfull_ast_t +{ + ZXIC_UINT32 hash1_int_rsp_fifo_pfull_ast; +}DPP_SE_ALG_HASH1_INT_RSP_FIFO_PFULL_AST_T; + +typedef struct dpp_se_alg_hash1_int_rsp_fifo_pfull_neg_t +{ + ZXIC_UINT32 hash1_int_rsp_fifo_pfull_neg; +}DPP_SE_ALG_HASH1_INT_RSP_FIFO_PFULL_NEG_T; + +typedef struct dpp_se_alg_hash1_ext_rsp_fifo_pfull_ast_t +{ + ZXIC_UINT32 hash1_ext_rsp_fifo_pfull_ast; +}DPP_SE_ALG_HASH1_EXT_RSP_FIFO_PFULL_AST_T; + +typedef struct dpp_se_alg_hash1_ext_rsp_fifo_pfull_neg_t +{ + ZXIC_UINT32 hash1_ext_rsp_fifo_pfull_neg; +}DPP_SE_ALG_HASH1_EXT_RSP_FIFO_PFULL_NEG_T; + +typedef struct dpp_se_alg_hash2_key_fifo_pfull_ast_t +{ + ZXIC_UINT32 hash2_key_fifo_pfull_ast; +}DPP_SE_ALG_HASH2_KEY_FIFO_PFULL_AST_T; + +typedef struct dpp_se_alg_hash2_key_fifo_pfull_neg_t +{ + ZXIC_UINT32 hash2_key_fifo_pfull_ast; +}DPP_SE_ALG_HASH2_KEY_FIFO_PFULL_NEG_T; + +typedef struct dpp_se_alg_hash2_sreq_fifo_pfull_ast_t +{ + ZXIC_UINT32 hash2_sreq_fifo_pfull_ast; +}DPP_SE_ALG_HASH2_SREQ_FIFO_PFULL_AST_T; + +typedef struct dpp_se_alg_hash2_sreq_fifo_pfull_neg_t +{ + ZXIC_UINT32 hash2_sreq_fifo_pfull_neg; +}DPP_SE_ALG_HASH2_SREQ_FIFO_PFULL_NEG_T; + +typedef struct dpp_se_alg_hash2_int_rsp_fifo_pfull_ast_t +{ + ZXIC_UINT32 hash2_int_rsp_fifo_pfull_ast; +}DPP_SE_ALG_HASH2_INT_RSP_FIFO_PFULL_AST_T; + +typedef struct dpp_se_alg_hash2_int_rsp_fifo_pfull_neg_t +{ + ZXIC_UINT32 hash2_int_rsp_fifo_pfull_neg; +}DPP_SE_ALG_HASH2_INT_RSP_FIFO_PFULL_NEG_T; + +typedef struct dpp_se_alg_hash2_ext_rsp_fifo_pfull_ast_t +{ + ZXIC_UINT32 hash2_ext_rsp_fifo_pfull_ast; +}DPP_SE_ALG_HASH2_EXT_RSP_FIFO_PFULL_AST_T; + +typedef struct dpp_se_alg_hash2_ext_rsp_fifo_pfull_neg_t +{ + ZXIC_UINT32 hash2_ext_rsp_fifo_pfull_neg; +}DPP_SE_ALG_HASH2_EXT_RSP_FIFO_PFULL_NEG_T; + +typedef struct dpp_se_alg_hash3_key_fifo_pfull_ast_t +{ + ZXIC_UINT32 hash3_key_fifo_pfull_ast; +}DPP_SE_ALG_HASH3_KEY_FIFO_PFULL_AST_T; + +typedef struct dpp_se_alg_hash3_key_fifo_pfull_neg_t +{ + ZXIC_UINT32 hash3_key_fifo_pfull_ast; +}DPP_SE_ALG_HASH3_KEY_FIFO_PFULL_NEG_T; + +typedef struct dpp_se_alg_hash3_sreq_fifo_pfull_ast_t +{ + ZXIC_UINT32 hash3_sreq_fifo_pfull_ast; +}DPP_SE_ALG_HASH3_SREQ_FIFO_PFULL_AST_T; + +typedef struct dpp_se_alg_hash3_sreq_fifo_pfull_neg_t +{ + ZXIC_UINT32 hash3_sreq_fifo_pfull_neg; +}DPP_SE_ALG_HASH3_SREQ_FIFO_PFULL_NEG_T; + +typedef struct dpp_se_alg_hash3_int_rsp_fifo_pfull_ast_t +{ + ZXIC_UINT32 hash3_int_rsp_fifo_pfull_ast; +}DPP_SE_ALG_HASH3_INT_RSP_FIFO_PFULL_AST_T; + +typedef struct dpp_se_alg_hash3_int_rsp_fifo_pfull_neg_t +{ + ZXIC_UINT32 hash3_int_rsp_fifo_pfull_neg; +}DPP_SE_ALG_HASH3_INT_RSP_FIFO_PFULL_NEG_T; + +typedef struct dpp_se_alg_hash3_ext_rsp_fifo_pfull_ast_t +{ + ZXIC_UINT32 hash3_ext_rsp_fifo_pfull_ast; +}DPP_SE_ALG_HASH3_EXT_RSP_FIFO_PFULL_AST_T; + +typedef struct dpp_se_alg_hash3_ext_rsp_fifo_pfull_neg_t +{ + ZXIC_UINT32 hash3_ext_rsp_fifo_pfull_neg; +}DPP_SE_ALG_HASH3_EXT_RSP_FIFO_PFULL_NEG_T; + +typedef struct dpp_se_alg_lpm_as_info_t +{ + ZXIC_UINT32 lpm_as_type; + ZXIC_UINT32 lpm_as_en; +}DPP_SE_ALG_LPM_AS_INFO_T; + +typedef struct dpp_se_alg_lpm_ext_rsp_fifo_u0_pfull_neg_t +{ + ZXIC_UINT32 lpm_ext_rsp_fifo_u0_pfull_neg; +}DPP_SE_ALG_LPM_EXT_RSP_FIFO_U0_PFULL_NEG_T; + +typedef struct dpp_se_alg_lpm_ext_rsp_fifo_u2_pfull_ast_t +{ + ZXIC_UINT32 lpm_ext_rsp_fifo_u2_pfull_ast; +}DPP_SE_ALG_LPM_EXT_RSP_FIFO_U2_PFULL_AST_T; + +typedef struct dpp_se_alg_lpm_ext_rsp_fifo_u2_pfull_neg_t +{ + ZXIC_UINT32 lpm_ext_rsp_fifo_u2_pfull_neg; +}DPP_SE_ALG_LPM_EXT_RSP_FIFO_U2_PFULL_NEG_T; + +typedef struct dpp_se_alg_lpm_ext_rsp_fifo_u3_pfull_ast_t +{ + ZXIC_UINT32 lpm_ext_rsp_fifo_u3_pfull_ast; +}DPP_SE_ALG_LPM_EXT_RSP_FIFO_U3_PFULL_AST_T; + +typedef struct dpp_se_alg_lpm_ext_rsp_fifo_u3_pfull_neg_t +{ + ZXIC_UINT32 lpm_ext_rsp_fifo_u3_pfull_neg; +}DPP_SE_ALG_LPM_EXT_RSP_FIFO_U3_PFULL_NEG_T; + +typedef struct dpp_se_alg_lpm_ext_rsp_fifo_u4_pfull_ast_t +{ + ZXIC_UINT32 lpm_ext_rsp_fifo_u4_pfull_ast; +}DPP_SE_ALG_LPM_EXT_RSP_FIFO_U4_PFULL_AST_T; + +typedef struct dpp_se_alg_lpm_ext_rsp_fifo_u4_pfull_neg_t +{ + ZXIC_UINT32 lpm_ext_rsp_fifo_u4_pfull_neg; +}DPP_SE_ALG_LPM_EXT_RSP_FIFO_U4_PFULL_NEG_T; + +typedef struct dpp_se_alg_lpm_as_rsp_fifo_u0_pfull_ast_t +{ + ZXIC_UINT32 lpm_as_rsp_fifo_u0_pfull_ast; +}DPP_SE_ALG_LPM_AS_RSP_FIFO_U0_PFULL_AST_T; + +typedef struct dpp_se_alg_lpm_as_rsp_fifo_u0_pfull_neg_t +{ + ZXIC_UINT32 lpm_as_rsp_fifo_u0_pfull_neg; +}DPP_SE_ALG_LPM_AS_RSP_FIFO_U0_PFULL_NEG_T; + +typedef struct dpp_se_alg_lpm_as_rsp_fifo_u1_pfull_ast_t +{ + ZXIC_UINT32 lpm_as_rsp_fifo_u1_pfull_ast; +}DPP_SE_ALG_LPM_AS_RSP_FIFO_U1_PFULL_AST_T; + +typedef struct dpp_se_alg_lpm_as_rsp_fifo_u1_pfull_neg_t +{ + ZXIC_UINT32 lpm_as_rsp_fifo_u1_pfull_neg; +}DPP_SE_ALG_LPM_AS_RSP_FIFO_U1_PFULL_NEG_T; + +typedef struct dpp_se_alg_lpm_v4_ddr3_base_addr_t +{ + ZXIC_UINT32 lpm_v4_ddr3_base_addr; +}DPP_SE_ALG_LPM_V4_DDR3_BASE_ADDR_T; + +typedef struct dpp_se_alg_lpm_v6_ddr3_base_addr_t +{ + ZXIC_UINT32 lpm_v6_ddr3_base_addr; +}DPP_SE_ALG_LPM_V6_DDR3_BASE_ADDR_T; + +typedef struct dpp_se_alg_debug_cnt_mode_t +{ + ZXIC_UINT32 cnt_rd_mode; + ZXIC_UINT32 cnt_overflow_mode; +}DPP_SE_ALG_DEBUG_CNT_MODE_T; + +typedef struct dpp_se_alg_hash_p0_key_vld_cnt_t +{ + ZXIC_UINT32 hash_p0_key_vld_cnt; +}DPP_SE_ALG_HASH_P0_KEY_VLD_CNT_T; + +typedef struct dpp_se_alg_hash_p1_key_vld_cnt_t +{ + ZXIC_UINT32 hash_p1_key_vld_cnt; +}DPP_SE_ALG_HASH_P1_KEY_VLD_CNT_T; + +typedef struct dpp_se_alg_hash_p2_key_vld_cnt_t +{ + ZXIC_UINT32 hash_p2_key_vld_cnt; +}DPP_SE_ALG_HASH_P2_KEY_VLD_CNT_T; + +typedef struct dpp_se_alg_hash_p3_key_vld_cnt_t +{ + ZXIC_UINT32 hash_p3_key_vld_cnt; +}DPP_SE_ALG_HASH_P3_KEY_VLD_CNT_T; + +typedef struct dpp_se_alg_lpm_p0_key_vld_cnt_t +{ + ZXIC_UINT32 lpm_p0_key_vld_cnt; +}DPP_SE_ALG_LPM_P0_KEY_VLD_CNT_T; + +typedef struct dpp_se_alg_hash_p0_rsp_vld_cnt_t +{ + ZXIC_UINT32 hash_p0_rsp_vld_cnt; +}DPP_SE_ALG_HASH_P0_RSP_VLD_CNT_T; + +typedef struct dpp_se_alg_hash_p1_rsp_vld_cnt_t +{ + ZXIC_UINT32 hash_p1_rsp_vld_cnt; +}DPP_SE_ALG_HASH_P1_RSP_VLD_CNT_T; + +typedef struct dpp_se_alg_hash_p2_rsp_vld_cnt_t +{ + ZXIC_UINT32 hash_p2_rsp_vld_cnt; +}DPP_SE_ALG_HASH_P2_RSP_VLD_CNT_T; + +typedef struct dpp_se_alg_hash_p3_rsp_vld_cnt_t +{ + ZXIC_UINT32 hash_p3_rsp_vld_cnt; +}DPP_SE_ALG_HASH_P3_RSP_VLD_CNT_T; + +typedef struct dpp_se_alg_lpm_p0_rsp_vld_cnt_t +{ + ZXIC_UINT32 lpm_p0_rsp_vld_cnt; +}DPP_SE_ALG_LPM_P0_RSP_VLD_CNT_T; + +typedef struct dpp_se_alg_hash_p0_smf_cnt_t +{ + ZXIC_UINT32 hash_p0_smf_cnt; +}DPP_SE_ALG_HASH_P0_SMF_CNT_T; + +typedef struct dpp_se_alg_hash_p1_smf_cnt_t +{ + ZXIC_UINT32 hash_p1_smf_cnt; +}DPP_SE_ALG_HASH_P1_SMF_CNT_T; + +typedef struct dpp_se_alg_hash_p2_smf_cnt_t +{ + ZXIC_UINT32 hash_p2_smf_cnt; +}DPP_SE_ALG_HASH_P2_SMF_CNT_T; + +typedef struct dpp_se_alg_hash_p3_smf_cnt_t +{ + ZXIC_UINT32 hash_p3_smf_cnt; +}DPP_SE_ALG_HASH_P3_SMF_CNT_T; + +typedef struct dpp_se_alg_lpm_p0_smf_cnt_t +{ + ZXIC_UINT32 lpm_p0_smf_cnt; +}DPP_SE_ALG_LPM_P0_SMF_CNT_T; + +typedef struct dpp_se_alg_hash_p0_spacevld_cnt_t +{ + ZXIC_UINT32 hash_p0_spacevld_cnt; +}DPP_SE_ALG_HASH_P0_SPACEVLD_CNT_T; + +typedef struct dpp_se_alg_hash_p1_spacevld_cnt_t +{ + ZXIC_UINT32 hash_p1_spacevld_cnt; +}DPP_SE_ALG_HASH_P1_SPACEVLD_CNT_T; + +typedef struct dpp_se_alg_hash_p2_spacevld_cnt_t +{ + ZXIC_UINT32 hash_p2_spacevld_cnt; +}DPP_SE_ALG_HASH_P2_SPACEVLD_CNT_T; + +typedef struct dpp_se_alg_hash_p3_spacevld_cnt_t +{ + ZXIC_UINT32 hash_p3_spacevld_cnt; +}DPP_SE_ALG_HASH_P3_SPACEVLD_CNT_T; + +typedef struct dpp_se_alg_smmu1_p0_req_vld_cnt_t +{ + ZXIC_UINT32 smmu1_p0_req_vld_cnt; +}DPP_SE_ALG_SMMU1_P0_REQ_VLD_CNT_T; + +typedef struct dpp_se_alg_smmu1_p1_req_vld_cnt_t +{ + ZXIC_UINT32 smmu1_p1_req_vld_cnt; +}DPP_SE_ALG_SMMU1_P1_REQ_VLD_CNT_T; + +typedef struct dpp_se_alg_smmu1_p2_req_vld_cnt_t +{ + ZXIC_UINT32 smmu1_p2_req_vld_cnt; +}DPP_SE_ALG_SMMU1_P2_REQ_VLD_CNT_T; + +typedef struct dpp_se_alg_smmu1_p3_req_vld_cnt_t +{ + ZXIC_UINT32 smmu1_p3_req_vld_cnt; +}DPP_SE_ALG_SMMU1_P3_REQ_VLD_CNT_T; + +typedef struct dpp_se_alg_smmu1_p4_req_vld_cnt_t +{ + ZXIC_UINT32 smmu1_p4_req_vld_cnt; +}DPP_SE_ALG_SMMU1_P4_REQ_VLD_CNT_T; + +typedef struct dpp_se_alg_smmu1_p5_req_vld_cnt_t +{ + ZXIC_UINT32 smmu1_p5_req_vld_cnt; +}DPP_SE_ALG_SMMU1_P5_REQ_VLD_CNT_T; + +typedef struct dpp_se_alg_smmu1_p0_rsp_vld_cnt_t +{ + ZXIC_UINT32 smmu1_p0_rsp_vld_cnt; +}DPP_SE_ALG_SMMU1_P0_RSP_VLD_CNT_T; + +typedef struct dpp_se_alg_smmu1_p1_rsp_vld_cnt_t +{ + ZXIC_UINT32 smmu1_p1_rsp_vld_cnt; +}DPP_SE_ALG_SMMU1_P1_RSP_VLD_CNT_T; + +typedef struct dpp_se_alg_smmu1_p2_rsp_vld_cnt_t +{ + ZXIC_UINT32 smmu1_p2_rsp_vld_cnt; +}DPP_SE_ALG_SMMU1_P2_RSP_VLD_CNT_T; + +typedef struct dpp_se_alg_smmu1_p3_rsp_vld_cnt_t +{ + ZXIC_UINT32 smmu1_p3_rsp_vld_cnt; +}DPP_SE_ALG_SMMU1_P3_RSP_VLD_CNT_T; + +typedef struct dpp_se_alg_smmu1_p4_rsp_vld_cnt_t +{ + ZXIC_UINT32 smmu1_p4_rsp_vld_cnt; +}DPP_SE_ALG_SMMU1_P4_RSP_VLD_CNT_T; + +typedef struct dpp_se_alg_smmu1_p5_rsp_vld_cnt_t +{ + ZXIC_UINT32 smmu1_p5_rsp_vld_cnt; +}DPP_SE_ALG_SMMU1_P5_RSP_VLD_CNT_T; + +typedef struct dpp_se_alg_schd_learn_fifo_int_cnt_t +{ + ZXIC_UINT32 schd_learn_fifo_int_cnt; +}DPP_SE_ALG_SCHD_LEARN_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_schd_hash0_fifo_int_cnt_t +{ + ZXIC_UINT32 schd_hash0_fifo_int_cnt; +}DPP_SE_ALG_SCHD_HASH0_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_schd_hash1_fifo_int_cnt_t +{ + ZXIC_UINT32 schd_hash1_fifo_int_cnt; +}DPP_SE_ALG_SCHD_HASH1_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_schd_hash2_fifo_int_cnt_t +{ + ZXIC_UINT32 schd_hash2_fifo_int_cnt; +}DPP_SE_ALG_SCHD_HASH2_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_schd_hash3_fifo_int_cnt_t +{ + ZXIC_UINT32 schd_hash3_fifo_int_cnt; +}DPP_SE_ALG_SCHD_HASH3_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_schd_lpm_fifo_int_cnt_t +{ + ZXIC_UINT32 schd_lpm_fifo_int_cnt; +}DPP_SE_ALG_SCHD_LPM_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_schd_learn_fifo_parity_err_cnt_t +{ + ZXIC_UINT32 schd_learn_fifo_parity_err_cnt; +}DPP_SE_ALG_SCHD_LEARN_FIFO_PARITY_ERR_CNT_T; + +typedef struct dpp_se_alg_schd_hash0_fifo_parity_err_cnt_t +{ + ZXIC_UINT32 schd_hash0_fifo_parity_err_cnt; +}DPP_SE_ALG_SCHD_HASH0_FIFO_PARITY_ERR_CNT_T; + +typedef struct dpp_se_alg_schd_hash1_fifo_parity_err_cnt_t +{ + ZXIC_UINT32 schd_hash1_fifo_parity_err_cnt; +}DPP_SE_ALG_SCHD_HASH1_FIFO_PARITY_ERR_CNT_T; + +typedef struct dpp_se_alg_schd_hash2_fifo_parity_err_cnt_t +{ + ZXIC_UINT32 schd_hash2_fifo_parity_err_cnt; +}DPP_SE_ALG_SCHD_HASH2_FIFO_PARITY_ERR_CNT_T; + +typedef struct dpp_se_alg_schd_hash3_fifo_parity_err_cnt_t +{ + ZXIC_UINT32 schd_hash3_fifo_parity_err_cnt; +}DPP_SE_ALG_SCHD_HASH3_FIFO_PARITY_ERR_CNT_T; + +typedef struct dpp_se_alg_schd_lpm_fifo_parity_err_cnt_t +{ + ZXIC_UINT32 schd_lpm_fifo_parity_err_cnt; +}DPP_SE_ALG_SCHD_LPM_FIFO_PARITY_ERR_CNT_T; + +typedef struct dpp_se_alg_rd_init_cft_cnt_t +{ + ZXIC_UINT32 rd_init_cft_cnt; +}DPP_SE_ALG_RD_INIT_CFT_CNT_T; + +typedef struct dpp_se_alg_zgp0_zblk0_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp0_zblk0_ecc_err_cnt; +}DPP_SE_ALG_ZGP0_ZBLK0_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp0_zblk1_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp0_zblk1_ecc_err_cnt; +}DPP_SE_ALG_ZGP0_ZBLK1_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp0_zblk2_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp0_zblk2_ecc_err_cnt; +}DPP_SE_ALG_ZGP0_ZBLK2_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp0_zblk3_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp0_zblk3_ecc_err_cnt; +}DPP_SE_ALG_ZGP0_ZBLK3_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp0_zblk4_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp0_zblk4_ecc_err_cnt; +}DPP_SE_ALG_ZGP0_ZBLK4_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp0_zblk5_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp0_zblk5_ecc_err_cnt; +}DPP_SE_ALG_ZGP0_ZBLK5_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp0_zblk6_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp0_zblk6_ecc_err_cnt; +}DPP_SE_ALG_ZGP0_ZBLK6_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp0_zblk7_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp0_zblk7_ecc_err_cnt; +}DPP_SE_ALG_ZGP0_ZBLK7_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp1_zblk0_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp1_zblk0_ecc_err_cnt; +}DPP_SE_ALG_ZGP1_ZBLK0_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp1_zblk1_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp1_zblk1_ecc_err_cnt; +}DPP_SE_ALG_ZGP1_ZBLK1_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp1_zblk2_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp1_zblk2_ecc_err_cnt; +}DPP_SE_ALG_ZGP1_ZBLK2_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp1_zblk3_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp1_zblk3_ecc_err_cnt; +}DPP_SE_ALG_ZGP1_ZBLK3_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp1_zblk4_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp1_zblk4_ecc_err_cnt; +}DPP_SE_ALG_ZGP1_ZBLK4_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp1_zblk5_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp1_zblk5_ecc_err_cnt; +}DPP_SE_ALG_ZGP1_ZBLK5_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp1_zblk6_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp1_zblk6_ecc_err_cnt; +}DPP_SE_ALG_ZGP1_ZBLK6_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp1_zblk7_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp1_zblk7_ecc_err_cnt; +}DPP_SE_ALG_ZGP1_ZBLK7_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp2_zblk0_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp2_zblk0_ecc_err_cnt; +}DPP_SE_ALG_ZGP2_ZBLK0_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp2_zblk1_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp2_zblk1_ecc_err_cnt; +}DPP_SE_ALG_ZGP2_ZBLK1_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp2_zblk2_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp2_zblk2_ecc_err_cnt; +}DPP_SE_ALG_ZGP2_ZBLK2_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp2_zblk3_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp2_zblk3_ecc_err_cnt; +}DPP_SE_ALG_ZGP2_ZBLK3_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp2_zblk4_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp2_zblk4_ecc_err_cnt; +}DPP_SE_ALG_ZGP2_ZBLK4_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp2_zblk5_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp2_zblk5_ecc_err_cnt; +}DPP_SE_ALG_ZGP2_ZBLK5_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp2_zblk6_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp2_zblk6_ecc_err_cnt; +}DPP_SE_ALG_ZGP2_ZBLK6_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp2_zblk7_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp2_zblk7_ecc_err_cnt; +}DPP_SE_ALG_ZGP2_ZBLK7_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp3_zblk0_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp3_zblk0_ecc_err_cnt; +}DPP_SE_ALG_ZGP3_ZBLK0_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp3_zblk1_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp3_zblk1_ecc_err_cnt; +}DPP_SE_ALG_ZGP3_ZBLK1_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp3_zblk2_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp3_zblk2_ecc_err_cnt; +}DPP_SE_ALG_ZGP3_ZBLK2_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp3_zblk3_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp3_zblk3_ecc_err_cnt; +}DPP_SE_ALG_ZGP3_ZBLK3_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp3_zblk4_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp3_zblk4_ecc_err_cnt; +}DPP_SE_ALG_ZGP3_ZBLK4_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp3_zblk5_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp3_zblk5_ecc_err_cnt; +}DPP_SE_ALG_ZGP3_ZBLK5_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp3_zblk6_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp3_zblk6_ecc_err_cnt; +}DPP_SE_ALG_ZGP3_ZBLK6_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zgp3_zblk7_ecc_err_cnt_t +{ + ZXIC_UINT32 zgp3_zblk7_ecc_err_cnt; +}DPP_SE_ALG_ZGP3_ZBLK7_ECC_ERR_CNT_T; + +typedef struct dpp_se_alg_zcam_hash_p0_err_cnt_t +{ + ZXIC_UINT32 zcam_hash_p0_err_cnt; +}DPP_SE_ALG_ZCAM_HASH_P0_ERR_CNT_T; + +typedef struct dpp_se_alg_zcam_hash_p1_err_cnt_t +{ + ZXIC_UINT32 zcam_hash_p1_err_cnt; +}DPP_SE_ALG_ZCAM_HASH_P1_ERR_CNT_T; + +typedef struct dpp_se_alg_zcam_hash_p2_err_cnt_t +{ + ZXIC_UINT32 zcam_hash_p2_err_cnt; +}DPP_SE_ALG_ZCAM_HASH_P2_ERR_CNT_T; + +typedef struct dpp_se_alg_zcam_hash_p3_err_cnt_t +{ + ZXIC_UINT32 zcam_hash_p3_err_cnt; +}DPP_SE_ALG_ZCAM_HASH_P3_ERR_CNT_T; + +typedef struct dpp_se_alg_zcam_lpm_err_cnt_t +{ + ZXIC_UINT32 zcam_lpm_err_cnt; +}DPP_SE_ALG_ZCAM_LPM_ERR_CNT_T; + +typedef struct dpp_se_alg_hash0_sreq_fifo_parity_err_cnt_t +{ + ZXIC_UINT32 hash0_sreq_fifo_parity_err_cnt; +}DPP_SE_ALG_HASH0_SREQ_FIFO_PARITY_ERR_CNT_T; + +typedef struct dpp_se_alg_hash0_sreq_fifo_int_cnt_t +{ + ZXIC_UINT32 hash0_sreq_fifo_int_cnt; +}DPP_SE_ALG_HASH0_SREQ_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_hash0_key_fifo_int_cnt_t +{ + ZXIC_UINT32 hash0_key_fifo_int_cnt; +}DPP_SE_ALG_HASH0_KEY_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_hash0_int_rsp_fifo_parity_err_cnt_t +{ + ZXIC_UINT32 hash0_int_rsp_fifo_parity_err_cnt; +}DPP_SE_ALG_HASH0_INT_RSP_FIFO_PARITY_ERR_CNT_T; + +typedef struct dpp_se_alg_hash0_ext_rsp_fifo_parity_err_cnt_t +{ + ZXIC_UINT32 hash0_ext_rsp_fifo_parity_err_cnt; +}DPP_SE_ALG_HASH0_EXT_RSP_FIFO_PARITY_ERR_CNT_T; + +typedef struct dpp_se_alg_hash0_ext_rsp_fifo_int_cnt_t +{ + ZXIC_UINT32 hash0_ext_rsp_fifo_int_cnt; +}DPP_SE_ALG_HASH0_EXT_RSP_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_hash0_int_rsp_fifo_int_cnt_t +{ + ZXIC_UINT32 hash0_int_rsp_fifo_int_cnt; +}DPP_SE_ALG_HASH0_INT_RSP_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_hash1_sreq_fifo_parity_err_cnt_t +{ + ZXIC_UINT32 hash1_sreq_fifo_parity_err_cnt; +}DPP_SE_ALG_HASH1_SREQ_FIFO_PARITY_ERR_CNT_T; + +typedef struct dpp_se_alg_hash1_sreq_fifo_int_cnt_t +{ + ZXIC_UINT32 hash1_sreq_fifo_int_cnt; +}DPP_SE_ALG_HASH1_SREQ_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_hash1_key_fifo_int_cnt_t +{ + ZXIC_UINT32 hash1_key_fifo_int_cnt; +}DPP_SE_ALG_HASH1_KEY_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_hash1_int_rsp_fifo_parity_err_cnt_t +{ + ZXIC_UINT32 hash1_int_rsp_fifo_parity_err_cnt; +}DPP_SE_ALG_HASH1_INT_RSP_FIFO_PARITY_ERR_CNT_T; + +typedef struct dpp_se_alg_hash1_ext_rsp_fifo_parity_err_cnt_t +{ + ZXIC_UINT32 hash1_ext_rsp_fifo_parity_err_cnt; +}DPP_SE_ALG_HASH1_EXT_RSP_FIFO_PARITY_ERR_CNT_T; + +typedef struct dpp_se_alg_hash1_ext_rsp_fifo_int_cnt_t +{ + ZXIC_UINT32 hash1_ext_rsp_fifo_int_cnt; +}DPP_SE_ALG_HASH1_EXT_RSP_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_hash1_int_rsp_fifo_int_cnt_t +{ + ZXIC_UINT32 hash1_int_rsp_fifo_int_cnt; +}DPP_SE_ALG_HASH1_INT_RSP_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_hash2_sreq_fifo_parity_err_cnt_t +{ + ZXIC_UINT32 hash2_sreq_fifo_parity_err_cnt; +}DPP_SE_ALG_HASH2_SREQ_FIFO_PARITY_ERR_CNT_T; + +typedef struct dpp_se_alg_hash2_sreq_fifo_int_cnt_t +{ + ZXIC_UINT32 hash2_sreq_fifo_int_cnt; +}DPP_SE_ALG_HASH2_SREQ_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_hash2_key_fifo_int_cnt_t +{ + ZXIC_UINT32 hash2_key_fifo_int_cnt; +}DPP_SE_ALG_HASH2_KEY_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_hash2_int_rsp_fifo_parity_err_cnt_t +{ + ZXIC_UINT32 hash2_int_rsp_fifo_parity_err_cnt; +}DPP_SE_ALG_HASH2_INT_RSP_FIFO_PARITY_ERR_CNT_T; + +typedef struct dpp_se_alg_hash2_ext_rsp_fifo_parity_err_cnt_t +{ + ZXIC_UINT32 hash2_ext_rsp_fifo_parity_err_cnt; +}DPP_SE_ALG_HASH2_EXT_RSP_FIFO_PARITY_ERR_CNT_T; + +typedef struct dpp_se_alg_hash2_ext_rsp_fifo_int_cnt_t +{ + ZXIC_UINT32 hash2_ext_rsp_fifo_int_cnt; +}DPP_SE_ALG_HASH2_EXT_RSP_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_hash2_int_rsp_fifo_int_cnt_t +{ + ZXIC_UINT32 hash2_int_rsp_fifo_int_cnt; +}DPP_SE_ALG_HASH2_INT_RSP_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_hash3_sreq_fifo_parity_err_cnt_t +{ + ZXIC_UINT32 hash3_sreq_fifo_parity_err_cnt; +}DPP_SE_ALG_HASH3_SREQ_FIFO_PARITY_ERR_CNT_T; + +typedef struct dpp_se_alg_hash3_sreq_fifo_int_cnt_t +{ + ZXIC_UINT32 hash3_sreq_fifo_int_cnt; +}DPP_SE_ALG_HASH3_SREQ_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_hash3_key_fifo_int_cnt_t +{ + ZXIC_UINT32 hash3_key_fifo_int_cnt; +}DPP_SE_ALG_HASH3_KEY_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_hash3_int_rsp_fifo_parity_err_cnt_t +{ + ZXIC_UINT32 hash3_int_rsp_fifo_parity_err_cnt; +}DPP_SE_ALG_HASH3_INT_RSP_FIFO_PARITY_ERR_CNT_T; + +typedef struct dpp_se_alg_hash3_ext_rsp_fifo_parity_err_cnt_t +{ + ZXIC_UINT32 hash3_ext_rsp_fifo_parity_err_cnt; +}DPP_SE_ALG_HASH3_EXT_RSP_FIFO_PARITY_ERR_CNT_T; + +typedef struct dpp_se_alg_hash3_ext_rsp_fifo_int_cnt_t +{ + ZXIC_UINT32 hash3_ext_rsp_fifo_int_cnt; +}DPP_SE_ALG_HASH3_EXT_RSP_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_hash3_int_rsp_fifo_int_cnt_t +{ + ZXIC_UINT32 hash3_int_rsp_fifo_int_cnt; +}DPP_SE_ALG_HASH3_INT_RSP_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_lpm_ext_rsp_fifo_int_cnt_t +{ + ZXIC_UINT32 lpm_ext_rsp_fifo_int_cnt; +}DPP_SE_ALG_LPM_EXT_RSP_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_lpm_ext_v6_fifo_int_cnt_t +{ + ZXIC_UINT32 lpm_ext_v6_fifo_int_cnt; +}DPP_SE_ALG_LPM_EXT_V6_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_lpm_ext_v4_fifo_int_cnt_t +{ + ZXIC_UINT32 lpm_ext_v4_fifo_int_cnt; +}DPP_SE_ALG_LPM_EXT_V4_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_lpm_ext_addr_fifo_int_cnt_t +{ + ZXIC_UINT32 lpm_ext_addr_fifo_int_cnt; +}DPP_SE_ALG_LPM_EXT_ADDR_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_lpm_ext_v4_fifo_parity_err_cnt_t +{ + ZXIC_UINT32 lpm_ext_v4_fifo_parity_err_cnt; +}DPP_SE_ALG_LPM_EXT_V4_FIFO_PARITY_ERR_CNT_T; + +typedef struct dpp_se_alg_lpm_ext_v6_fifo_parity_err_cnt_t +{ + ZXIC_UINT32 lpm_ext_v6_fifo_parity_err_cnt; +}DPP_SE_ALG_LPM_EXT_V6_FIFO_PARITY_ERR_CNT_T; + +typedef struct dpp_se_alg_lpm_ext_rsp_fifo_parity_err_cnt_t +{ + ZXIC_UINT32 lpm_ext_rsp_fifo_parity_err_cnt; +}DPP_SE_ALG_LPM_EXT_RSP_FIFO_PARITY_ERR_CNT_T; + +typedef struct dpp_se_alg_lpm_as_req_fifo_int_cnt_t +{ + ZXIC_UINT32 lpm_as_req_fifo_int_cnt; +}DPP_SE_ALG_LPM_AS_REQ_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_lpm_as_int_rsp_fifo_int_cnt_t +{ + ZXIC_UINT32 lpm_as_int_rsp_fifo_int_cnt; +}DPP_SE_ALG_LPM_AS_INT_RSP_FIFO_INT_CNT_T; + +typedef struct dpp_se_alg_se_alg_int_status_t +{ + ZXIC_UINT32 schd_int_unmask_flag; + ZXIC_UINT32 zblk_ecc_int_unmask_flag; + ZXIC_UINT32 hash0_int_unmask_flag; + ZXIC_UINT32 hash1_int_unmask_flag; + ZXIC_UINT32 hash2_int_unmask_flag; + ZXIC_UINT32 hash3_int_unmask_flag; + ZXIC_UINT32 lpm_int_unmask_flag; +}DPP_SE_ALG_SE_ALG_INT_STATUS_T; + +typedef struct dpp_se_alg_schd_int_en_t +{ + ZXIC_UINT32 wr_rsp_fifo_ovfl; + ZXIC_UINT32 init_rd_cft_en; + ZXIC_UINT32 schd_lpm_fifo_parity_errl; + ZXIC_UINT32 schd_hash3_fifo_parity_err; + ZXIC_UINT32 schd_hash2_fifo_parity_err; + ZXIC_UINT32 schd_hash1_fifo_parity_err; + ZXIC_UINT32 schd_hash0_fifo_parity_err; + ZXIC_UINT32 schd_learn_fifo_parity_err; + ZXIC_UINT32 schd_lpm_fifo_ovfl; + ZXIC_UINT32 schd_hash3_fifo_ovfl; + ZXIC_UINT32 schd_hash2_fifo_unfl; + ZXIC_UINT32 schd_hash1_fifo_ovfl; + ZXIC_UINT32 schd_hash0_fifo_ovfl; + ZXIC_UINT32 schd_learn_fifo_ovfl; +}DPP_SE_ALG_SCHD_INT_EN_T; + +typedef struct dpp_se_alg_schd_int_mask_t +{ + ZXIC_UINT32 schd_int_mask; +}DPP_SE_ALG_SCHD_INT_MASK_T; + +typedef struct dpp_se_alg_schd_int_status_t +{ + ZXIC_UINT32 schd_int_status; +}DPP_SE_ALG_SCHD_INT_STATUS_T; + +typedef struct dpp_se_alg_zblk_ecc_int_en_t +{ + ZXIC_UINT32 zblk_ecc_int_en; +}DPP_SE_ALG_ZBLK_ECC_INT_EN_T; + +typedef struct dpp_se_alg_zblk_ecc_int_mask_t +{ + ZXIC_UINT32 zblk_ecc_int_mask; +}DPP_SE_ALG_ZBLK_ECC_INT_MASK_T; + +typedef struct dpp_se_alg_zblk_ecc_int_status_t +{ + ZXIC_UINT32 zblk_ecc_int_status; +}DPP_SE_ALG_ZBLK_ECC_INT_STATUS_T; + +typedef struct dpp_se_alg_hash0_int_en_t +{ + ZXIC_UINT32 zcam_hash_p0_err_en; + ZXIC_UINT32 hash0_agree_int_fifo_ovf_en; + ZXIC_UINT32 hash0_agree_ext_fifo_ovf_en; + ZXIC_UINT32 hash0_agree_ext_fifo_parity_err_en; + ZXIC_UINT32 hash0_agree_int_fifo_parity_err_en; + ZXIC_UINT32 hash0_key_fifo_ovfl_en; + ZXIC_UINT32 hash0_sreq_fifo_ovfl_en; + ZXIC_UINT32 hash0_key_fifo_parity_err_en; +}DPP_SE_ALG_HASH0_INT_EN_T; + +typedef struct dpp_se_alg_hash0_int_mask_t +{ + ZXIC_UINT32 hash0_int_mask; +}DPP_SE_ALG_HASH0_INT_MASK_T; + +typedef struct dpp_se_alg_hash0_int_status_t +{ + ZXIC_UINT32 hash0_int_status; +}DPP_SE_ALG_HASH0_INT_STATUS_T; + +typedef struct dpp_se_alg_hash1_int_en_t +{ + ZXIC_UINT32 zcam_hash_p1_err_en; + ZXIC_UINT32 hash1_agree_int_fifo_ovf_en; + ZXIC_UINT32 hash1_agree_ext_fifo_ovf_en; + ZXIC_UINT32 hash1_agree_ext_fifo_parity_err_en; + ZXIC_UINT32 hash1_agree_int_fifo_parity_err_en; + ZXIC_UINT32 hash1_key_fifo_ovfl_en; + ZXIC_UINT32 hash1_sreq_fifo_ovfl_en; + ZXIC_UINT32 hash1_key_fifo_parity_err_en; +}DPP_SE_ALG_HASH1_INT_EN_T; + +typedef struct dpp_se_alg_hash1_int_mask_t +{ + ZXIC_UINT32 hash1_int_mask; +}DPP_SE_ALG_HASH1_INT_MASK_T; + +typedef struct dpp_se_alg_hash1_int_status_t +{ + ZXIC_UINT32 hash1_int_status; +}DPP_SE_ALG_HASH1_INT_STATUS_T; + +typedef struct dpp_se_alg_hash2_int_en_t +{ + ZXIC_UINT32 zcam_hash_p2_err_en; + ZXIC_UINT32 hash2_agree_int_fifo_ovf_en; + ZXIC_UINT32 hash2_agree_ext_fifo_ovf_en; + ZXIC_UINT32 hash2_agree_ext_fifo_parity_err_en; + ZXIC_UINT32 hash2_agree_int_fifo_parity_err_en; + ZXIC_UINT32 hash2_key_fifo_ovfl_en; + ZXIC_UINT32 hash2_sreq_fifo_ovfl_en; + ZXIC_UINT32 hash2_key_fifo_parity_err_en; +}DPP_SE_ALG_HASH2_INT_EN_T; + +typedef struct dpp_se_alg_hash2_int_mask_t +{ + ZXIC_UINT32 hash2_int_mask; +}DPP_SE_ALG_HASH2_INT_MASK_T; + +typedef struct dpp_se_alg_hash2_int_status_t +{ + ZXIC_UINT32 hash2_int_status; +}DPP_SE_ALG_HASH2_INT_STATUS_T; + +typedef struct dpp_se_alg_hash3_int_en_t +{ + ZXIC_UINT32 zcam_hash_p3_err_en; + ZXIC_UINT32 hash3_agree_int_fifo_ovf_en; + ZXIC_UINT32 hash3_agree_ext_fifo_ovf_en; + ZXIC_UINT32 hash3_agree_ext_fifo_parity_err_en; + ZXIC_UINT32 hash3_agree_int_fifo_parity_err_en; + ZXIC_UINT32 hash3_key_fifo_ovfl_en; + ZXIC_UINT32 hash3_sreq_fifo_ovfl_en; + ZXIC_UINT32 hash3_key_fifo_parity_err_en; +}DPP_SE_ALG_HASH3_INT_EN_T; + +typedef struct dpp_se_alg_hash3_int_mask_t +{ + ZXIC_UINT32 hash3_int_mask; +}DPP_SE_ALG_HASH3_INT_MASK_T; + +typedef struct dpp_se_alg_hash3_int_status_t +{ + ZXIC_UINT32 hash3_int_status; +}DPP_SE_ALG_HASH3_INT_STATUS_T; + +typedef struct dpp_se_alg_lpm_int_en_t +{ + ZXIC_UINT32 zcam_lpm_err_en; + ZXIC_UINT32 lpm_as_int_rsp_fifo_ovfl_en; + ZXIC_UINT32 lpm_as_req_fifo_ovfl_en; + ZXIC_UINT32 lpm_ext_ddr_rsp_fifo_parity_en; + ZXIC_UINT32 lpm_ext_v6_key_parity_en; + ZXIC_UINT32 lpm_ext_v4_key_parity_en; + ZXIC_UINT32 lpm_ext_addr_fifo_ovfl_en; + ZXIC_UINT32 lpm_ext_v4_fifo_ovfl_en; + ZXIC_UINT32 lpm_ext_v6_fifo_ovfl_en; + ZXIC_UINT32 lpm_ext_ddr_rsp_ovf_en; +}DPP_SE_ALG_LPM_INT_EN_T; + +typedef struct dpp_se_alg_lpm_int_mask_t +{ + ZXIC_UINT32 lpm_int_mask; +}DPP_SE_ALG_LPM_INT_MASK_T; + +typedef struct dpp_se_alg_lpm_int_status_t +{ + ZXIC_UINT32 lpm_int_status; +}DPP_SE_ALG_LPM_INT_STATUS_T; + +typedef struct dpp_se_alg_zblock_lpm_mask0_t +{ + ZXIC_UINT32 vpn_id_mask; + ZXIC_UINT32 prefix0_mask; + ZXIC_UINT32 prefix1_mask; + ZXIC_UINT32 prefix2_mask; + ZXIC_UINT32 prefix3_mask; +}DPP_SE_ALG_ZBLOCK_LPM_MASK0_T; + +typedef struct dpp_se_alg_zblock_lpm_mask1_t +{ + ZXIC_UINT32 vpn_id_mask; + ZXIC_UINT32 prefix0_mask; + ZXIC_UINT32 prefix1_mask; + ZXIC_UINT32 prefix2_mask; + ZXIC_UINT32 prefix3_mask; +}DPP_SE_ALG_ZBLOCK_LPM_MASK1_T; + +typedef struct dpp_se_alg_zblock_lpm_mask2_t +{ + ZXIC_UINT32 vpn_id_mask; + ZXIC_UINT32 prefix0_mask; + ZXIC_UINT32 prefix1_mask; + ZXIC_UINT32 prefix2_mask; + ZXIC_UINT32 prefix3_mask; +}DPP_SE_ALG_ZBLOCK_LPM_MASK2_T; + +typedef struct dpp_se_alg_zblock_lpm_mask3_t +{ + ZXIC_UINT32 vpn_id_mask; + ZXIC_UINT32 prefix0_mask; + ZXIC_UINT32 prefix1_mask; + ZXIC_UINT32 prefix2_mask; + ZXIC_UINT32 prefix3_mask; +}DPP_SE_ALG_ZBLOCK_LPM_MASK3_T; + +typedef struct dpp_se_alg_zblock_default_route0_t +{ + ZXIC_UINT32 vpn_id; + ZXIC_UINT32 vpn_dresult; + ZXIC_UINT32 vpn_flag; + ZXIC_UINT32 vpn_vld; +}DPP_SE_ALG_ZBLOCK_DEFAULT_ROUTE0_T; + +typedef struct dpp_se_alg_zblock_default_route1_t +{ + ZXIC_UINT32 vpn_id; + ZXIC_UINT32 vpn_dresult; + ZXIC_UINT32 vpn_flag; + ZXIC_UINT32 vpn_vld; +}DPP_SE_ALG_ZBLOCK_DEFAULT_ROUTE1_T; + +typedef struct dpp_se_alg_zblock_default_route2_t +{ + ZXIC_UINT32 vpn_id; + ZXIC_UINT32 vpn_dresult; + ZXIC_UINT32 vpn_flag; + ZXIC_UINT32 vpn_vld; +}DPP_SE_ALG_ZBLOCK_DEFAULT_ROUTE2_T; + +typedef struct dpp_se_alg_zblock_default_route3_t +{ + ZXIC_UINT32 vpn_id; + ZXIC_UINT32 vpn_dresult; + ZXIC_UINT32 vpn_flag; + ZXIC_UINT32 vpn_vld; +}DPP_SE_ALG_ZBLOCK_DEFAULT_ROUTE3_T; + +typedef struct dpp_se_alg_zblock_default_route4_t +{ + ZXIC_UINT32 vpn_id; + ZXIC_UINT32 vpn_dresult; + ZXIC_UINT32 vpn_flag; + ZXIC_UINT32 vpn_vld; +}DPP_SE_ALG_ZBLOCK_DEFAULT_ROUTE4_T; + +typedef struct dpp_se_alg_zblock_default_route5_t +{ + ZXIC_UINT32 vpn_id; + ZXIC_UINT32 vpn_dresult; + ZXIC_UINT32 vpn_flag; + ZXIC_UINT32 vpn_vld; +}DPP_SE_ALG_ZBLOCK_DEFAULT_ROUTE5_T; + +typedef struct dpp_se_alg_zblock_default_route6_t +{ + ZXIC_UINT32 vpn_id; + ZXIC_UINT32 vpn_dresult; + ZXIC_UINT32 vpn_flag; + ZXIC_UINT32 vpn_vld; +}DPP_SE_ALG_ZBLOCK_DEFAULT_ROUTE6_T; + +typedef struct dpp_se_alg_zblock_default_route7_t +{ + ZXIC_UINT32 vpn_id; + ZXIC_UINT32 vpn_dresult; + ZXIC_UINT32 vpn_flag; + ZXIC_UINT32 vpn_vld; +}DPP_SE_ALG_ZBLOCK_DEFAULT_ROUTE7_T; + +typedef struct dpp_se_alg_zblock_hash_listtable_item0_t +{ + ZXIC_UINT32 hash_item; +}DPP_SE_ALG_ZBLOCK_HASH_LISTTABLE_ITEM0_T; + +typedef struct dpp_se_alg_zblock_hash_listtable_item1_t +{ + ZXIC_UINT32 hash_item; +}DPP_SE_ALG_ZBLOCK_HASH_LISTTABLE_ITEM1_T; + +typedef struct dpp_se_alg_zblock_hash_listtable_item2_t +{ + ZXIC_UINT32 hash_item; +}DPP_SE_ALG_ZBLOCK_HASH_LISTTABLE_ITEM2_T; + +typedef struct dpp_se_alg_zblock_hash_listtable_item3_t +{ + ZXIC_UINT32 hash_item; +}DPP_SE_ALG_ZBLOCK_HASH_LISTTABLE_ITEM3_T; + +typedef struct dpp_se_alg_zblock_ecc_err_status_t +{ + ZXIC_UINT32 sram3_ecc_err; + ZXIC_UINT32 sram2_ecc_err; + ZXIC_UINT32 sram1_ecc_err; + ZXIC_UINT32 sram0_ecc_err; +}DPP_SE_ALG_ZBLOCK_ECC_ERR_STATUS_T; + +typedef struct dpp_se_alg_zblock_lpm_v6_sram_cmp_t +{ + ZXIC_UINT32 sram_cmp_flag; +}DPP_SE_ALG_ZBLOCK_LPM_V6_SRAM_CMP_T; + +typedef struct dpp_se_alg_zblock_lpm_v4_sram_cmp_t +{ + ZXIC_UINT32 sram_cmp_flag; +}DPP_SE_ALG_ZBLOCK_LPM_V4_SRAM_CMP_T; + +typedef struct dpp_se_parser_kschd_pful_cfg_t +{ + ZXIC_UINT32 kschd_pful_assert; + ZXIC_UINT32 kschd_pful_negate; +}DPP_SE_PARSER_KSCHD_PFUL_CFG_T; + +typedef struct dpp_se_parser_debug_cnt_mode_t +{ + ZXIC_UINT32 cnt_rd_mode; + ZXIC_UINT32 cnt_overflow_mode; +}DPP_SE_PARSER_DEBUG_CNT_MODE_T; + +typedef struct dpp_se_parser_parser_int_en_t +{ + ZXIC_UINT32 parser_int_en; +}DPP_SE_PARSER_PARSER_INT_EN_T; + +typedef struct dpp_se_parser_parser_int_mask_t +{ + ZXIC_UINT32 parser_int_mask; +}DPP_SE_PARSER_PARSER_INT_MASK_T; + +typedef struct dpp_se_parser_parser_int_status_t +{ + ZXIC_UINT32 parser_int_status; +}DPP_SE_PARSER_PARSER_INT_STATUS_T; + +typedef struct dpp_se_parser_parser_int_unmask_flag_t +{ + ZXIC_UINT32 parser_int_unmask_flag; +}DPP_SE_PARSER_PARSER_INT_UNMASK_FLAG_T; + +typedef struct dpp_se_parser_ecc_bypass_read_t +{ + ZXIC_UINT32 ecc_bypass_read; +}DPP_SE_PARSER_ECC_BYPASS_READ_T; + +typedef struct dpp_se_parser_mex0_5_req_cnt_t +{ + ZXIC_UINT32 mex0_5_req_cnt; +}DPP_SE_PARSER_MEX0_5_REQ_CNT_T; + +typedef struct dpp_se_parser_kschd_req0_5_cnt_t +{ + ZXIC_UINT32 kschd_req0_5_cnt; +}DPP_SE_PARSER_KSCHD_REQ0_5_CNT_T; + +typedef struct dpp_se_parser_kschd_parser_fc0_5_cnt_t +{ + ZXIC_UINT32 kschd_parser_fc0_5_cnt; +}DPP_SE_PARSER_KSCHD_PARSER_FC0_5_CNT_T; + +typedef struct dpp_se_parser_se_ppu_mex0_5_fc_cnt_t +{ + ZXIC_UINT32 se_ppu_mex0_5_fc_cnt; +}DPP_SE_PARSER_SE_PPU_MEX0_5_FC_CNT_T; + +typedef struct dpp_se_parser_smmu0_marc_fc_cnt_t +{ + ZXIC_UINT32 smmu0_marc_fc_cnt; +}DPP_SE_PARSER_SMMU0_MARC_FC_CNT_T; + +typedef struct dpp_se_parser_smmu0_marc_key_cnt_t +{ + ZXIC_UINT32 smmu0_marc_key_cnt; +}DPP_SE_PARSER_SMMU0_MARC_KEY_CNT_T; + +typedef struct dpp_se_parser_cmmu_key_cnt_t +{ + ZXIC_UINT32 cmmu_key_cnt; +}DPP_SE_PARSER_CMMU_KEY_CNT_T; + +typedef struct dpp_se_parser_cmmu_parser_fc_cnt_t +{ + ZXIC_UINT32 cmmu_parser_fc_cnt; +}DPP_SE_PARSER_CMMU_PARSER_FC_CNT_T; + +typedef struct dpp_se_parser_marc_tab_type_err_mex0_5_cnt_t +{ + ZXIC_UINT32 marc_tab_type_err_mex0_5_cnt; +}DPP_SE_PARSER_MARC_TAB_TYPE_ERR_MEX0_5_CNT_T; + +typedef struct dpp_se_parser_eram_fulladdr_drop_cnt_t +{ + ZXIC_UINT32 eram_fulladdr_drop_cnt; +}DPP_SE_PARSER_ERAM_FULLADDR_DROP_CNT_T; + +typedef struct dpp_se_as_hash0_pful_cfg_t +{ + ZXIC_UINT32 hash0_pful_cfg; +}DPP_SE_AS_HASH0_PFUL_CFG_T; + +typedef struct dpp_se_as_hash1_pful_cfg_t +{ + ZXIC_UINT32 hash1_pful_cfg; +}DPP_SE_AS_HASH1_PFUL_CFG_T; + +typedef struct dpp_se_as_hash2_pful_cfg_t +{ + ZXIC_UINT32 hash2_pful_cfg; +}DPP_SE_AS_HASH2_PFUL_CFG_T; + +typedef struct dpp_se_as_hash3_pful_cfg_t +{ + ZXIC_UINT32 hash3_pful_cfg; +}DPP_SE_AS_HASH3_PFUL_CFG_T; + +typedef struct dpp_se_as_pbu_pful_cfg_t +{ + ZXIC_UINT32 pbu_pful_cfg; +}DPP_SE_AS_PBU_PFUL_CFG_T; + +typedef struct dpp_se_as_lpm_pful_cfg_t +{ + ZXIC_UINT32 lpm_pful_cfg; +}DPP_SE_AS_LPM_PFUL_CFG_T; + +typedef struct dpp_se_as_etcam_pful_cfg_t +{ + ZXIC_UINT32 etcam_pful_cfg; +}DPP_SE_AS_ETCAM_PFUL_CFG_T; + +typedef struct dpp_se_as_as_learn0_fifo_cfg_t +{ + ZXIC_UINT32 as_learn1_pful_negate; + ZXIC_UINT32 as_learn1_pful_asert; + ZXIC_UINT32 as_learn0_pful_negate; + ZXIC_UINT32 as_learn0_pful_asert; +}DPP_SE_AS_AS_LEARN0_FIFO_CFG_T; + +typedef struct dpp_se_as_as_learn1_fifo_cfg_t +{ + ZXIC_UINT32 as_learn3_pful_negate; + ZXIC_UINT32 as_learn3_pful_asert; + ZXIC_UINT32 as_learn2_pful_negate; + ZXIC_UINT32 as_learn2_pful_asert; +}DPP_SE_AS_AS_LEARN1_FIFO_CFG_T; + +typedef struct dpp_se_as_as_dma_fifo_cfg_t +{ + ZXIC_UINT32 as_dma_fifo_cfg; +}DPP_SE_AS_AS_DMA_FIFO_CFG_T; + +typedef struct dpp_se_as_age_pful_cfg_t +{ + ZXIC_UINT32 age_pful_cfg; +}DPP_SE_AS_AGE_PFUL_CFG_T; + +typedef struct dpp_se_as_etcam_rsp_cfg_t +{ + ZXIC_UINT32 eram_rsp_pful_negate; + ZXIC_UINT32 eram_rsp_pful_assert; + ZXIC_UINT32 etcam_rsp_pful_negate; + ZXIC_UINT32 etcam_rsp_pful_assert; +}DPP_SE_AS_ETCAM_RSP_CFG_T; + +typedef struct dpp_se_as_pbu_ecc_bypass_read_t +{ + ZXIC_UINT32 pbu_ecc_bypass_read; +}DPP_SE_AS_PBU_ECC_BYPASS_READ_T; + +typedef struct dpp_se_as_etcam0_ecc_bypass_read_t +{ + ZXIC_UINT32 etcam0_ecc_bypass_read; +}DPP_SE_AS_ETCAM0_ECC_BYPASS_READ_T; + +typedef struct dpp_se_as_etcam1_ecc_bypass_read_t +{ + ZXIC_UINT32 etcam1_ecc_bypass_read; +}DPP_SE_AS_ETCAM1_ECC_BYPASS_READ_T; + +typedef struct dpp_se_as_lpm_ecc_bypass_read_t +{ + ZXIC_UINT32 lpm_ecc_bypass_read; +}DPP_SE_AS_LPM_ECC_BYPASS_READ_T; + +typedef struct dpp_se_as_hash_ecc_bypass_read_t +{ + ZXIC_UINT32 hash3_ecc_bypass_read; + ZXIC_UINT32 hash2_ecc_bypass_read; + ZXIC_UINT32 hash1_ecc_bypass_read; + ZXIC_UINT32 hash0_ecc_bypass_read; +}DPP_SE_AS_HASH_ECC_BYPASS_READ_T; + +typedef struct dpp_se_as_hash_learn_ecc_bypass_read_t +{ + ZXIC_UINT32 hash_learn_ecc_bypass_read; +}DPP_SE_AS_HASH_LEARN_ECC_BYPASS_READ_T; + +typedef struct dpp_se_as_debug_cnt_mode_t +{ + ZXIC_UINT32 cnt_rd_mode; + ZXIC_UINT32 cnt_overflow_mode; +}DPP_SE_AS_DEBUG_CNT_MODE_T; + +typedef struct dpp_se_as_as_int_0_en_t +{ + ZXIC_UINT32 as_int_0_en; +}DPP_SE_AS_AS_INT_0_EN_T; + +typedef struct dpp_se_as_as_int_0_mask_t +{ + ZXIC_UINT32 as_int_0_mask; +}DPP_SE_AS_AS_INT_0_MASK_T; + +typedef struct dpp_se_as_as_int_1_en_t +{ + ZXIC_UINT32 as_int_1_en; +}DPP_SE_AS_AS_INT_1_EN_T; + +typedef struct dpp_se_as_as_int_1_mask_t +{ + ZXIC_UINT32 as_int_1_mask; +}DPP_SE_AS_AS_INT_1_MASK_T; + +typedef struct dpp_se_as_as_int_2_en_t +{ + ZXIC_UINT32 as_int_2_en; +}DPP_SE_AS_AS_INT_2_EN_T; + +typedef struct dpp_se_as_as_int_2_mask_t +{ + ZXIC_UINT32 as_int_2_mask; +}DPP_SE_AS_AS_INT_2_MASK_T; + +typedef struct dpp_se_as_as_int_0_status_t +{ + ZXIC_UINT32 port0_int_status; +}DPP_SE_AS_AS_INT_0_STATUS_T; + +typedef struct dpp_se_as_as_int_1_status_t +{ + ZXIC_UINT32 port1_int_status; +}DPP_SE_AS_AS_INT_1_STATUS_T; + +typedef struct dpp_se_as_as_int_2_status_t +{ + ZXIC_UINT32 port2_int_status; +}DPP_SE_AS_AS_INT_2_STATUS_T; + +typedef struct dpp_se_as_se_as_int_status_t +{ + ZXIC_UINT32 as_int_2_unmask_flag; + ZXIC_UINT32 as_int_1_unmask_flag; + ZXIC_UINT32 as_int_0_unmask_flag; +}DPP_SE_AS_SE_AS_INT_STATUS_T; + +typedef struct dpp_se_as_hash0_3_wr_req_cnt_t +{ + ZXIC_UINT32 hash0_3_wr_req_cnt; +}DPP_SE_AS_HASH0_3_WR_REQ_CNT_T; + +typedef struct dpp_se_as_smmu0_etcam0_1_fc_cnt_t +{ + ZXIC_UINT32 smmu0_etcam0_1_fc_cnt; +}DPP_SE_AS_SMMU0_ETCAM0_1_FC_CNT_T; + +typedef struct dpp_se_as_etcam0_1_smmu0_req_cnt_t +{ + ZXIC_UINT32 etcam0_1_smmu0_req_cnt; +}DPP_SE_AS_ETCAM0_1_SMMU0_REQ_CNT_T; + +typedef struct dpp_se_as_smmu0_etcam0_1_rsp_cnt_t +{ + ZXIC_UINT32 smmu0_etcam0_1_rsp_cnt; +}DPP_SE_AS_SMMU0_ETCAM0_1_RSP_CNT_T; + +typedef struct dpp_se_as_as_hla_hash_p0_3_key_cnt_t +{ + ZXIC_UINT32 as_hla_hash_p0_3_key_cnt; +}DPP_SE_AS_AS_HLA_HASH_P0_3_KEY_CNT_T; + +typedef struct dpp_se_as_as_hla_lpm_p0_key_cnt_t +{ + ZXIC_UINT32 as_hla_lpm_p0_key_cnt; +}DPP_SE_AS_AS_HLA_LPM_P0_KEY_CNT_T; + +typedef struct dpp_se_as_alg_as_hash_p0_3_rsp_cnt_t +{ + ZXIC_UINT32 alg_as_hash_p0_3_rsp_cnt; +}DPP_SE_AS_ALG_AS_HASH_P0_3_RSP_CNT_T; + +typedef struct dpp_se_as_alg_as_hash_p0_3_smf_rsp_cnt_t +{ + ZXIC_UINT32 alg_as_hash_p0_3_smf_rsp_cnt; +}DPP_SE_AS_ALG_AS_HASH_P0_3_SMF_RSP_CNT_T; + +typedef struct dpp_se_as_alg_as_lpm_p0_rsp_cnt_t +{ + ZXIC_UINT32 alg_as_lpm_p0_rsp_cnt; +}DPP_SE_AS_ALG_AS_LPM_P0_RSP_CNT_T; + +typedef struct dpp_se_as_alg_as_lpm_p0_3_smf_rsp_cnt_t +{ + ZXIC_UINT32 alg_as_lpm_p0_3_smf_rsp_cnt; +}DPP_SE_AS_ALG_AS_LPM_P0_3_SMF_RSP_CNT_T; + +typedef struct dpp_se_as_as_pbu_key_cnt_t +{ + ZXIC_UINT32 as_pbu_key_cnt; +}DPP_SE_AS_AS_PBU_KEY_CNT_T; + +typedef struct dpp_se_as_pbu_se_dpi_rsp_dat_cnt_t +{ + ZXIC_UINT32 pbu_se_dpi_rsp_dat_cnt; +}DPP_SE_AS_PBU_SE_DPI_RSP_DAT_CNT_T; + +typedef struct dpp_se_as_as_etcam_ctrl_req0_cnt_t +{ + ZXIC_UINT32 as_etcam_ctrl_req0_cnt; +}DPP_SE_AS_AS_ETCAM_CTRL_REQ0_CNT_T; + +typedef struct dpp_se_as_etcam_ctrl_as_index0_1_cnt_t +{ + ZXIC_UINT32 etcam_ctrl_as_index0_1_cnt; +}DPP_SE_AS_ETCAM_CTRL_AS_INDEX0_1_CNT_T; + +typedef struct dpp_se_as_etcam_ctrl_as_hit0_1_cnt_t +{ + ZXIC_UINT32 etcam_ctrl_as_hit0_1_cnt; +}DPP_SE_AS_ETCAM_CTRL_AS_HIT0_1_CNT_T; + +typedef struct dpp_se_as_as_smmu0_req_cnt_t +{ + ZXIC_UINT32 as_smmu0_req_cnt; +}DPP_SE_AS_AS_SMMU0_REQ_CNT_T; + +typedef struct dpp_se_as_learn_hla_wr_cnt_t +{ + ZXIC_UINT32 learn_hla_wr_cnt; +}DPP_SE_AS_LEARN_HLA_WR_CNT_T; + +typedef struct dpp_se_as_as_smmu1_req_cnt_t +{ + ZXIC_UINT32 as_smmu1_req_cnt; +}DPP_SE_AS_AS_SMMU1_REQ_CNT_T; + +typedef struct dpp_se_as_se_cfg_mac_dat_cnt_t +{ + ZXIC_UINT32 se_cfg_mac_dat_cnt; +}DPP_SE_AS_SE_CFG_MAC_DAT_CNT_T; + +typedef struct dpp_se_as_alg_as_hash_p0_3_fc_cnt_t +{ + ZXIC_UINT32 alg_as_hash_p0_3_fc_cnt; +}DPP_SE_AS_ALG_AS_HASH_P0_3_FC_CNT_T; + +typedef struct dpp_se_as_alg_as_lpm_p0_fc_cnt_t +{ + ZXIC_UINT32 alg_as_lpm_p0_fc_cnt; +}DPP_SE_AS_ALG_AS_LPM_P0_FC_CNT_T; + +typedef struct dpp_se_as_as_alg_hash_p0_3_fc_cnt_t +{ + ZXIC_UINT32 as_alg_hash_p0_3_fc_cnt; +}DPP_SE_AS_AS_ALG_HASH_P0_3_FC_CNT_T; + +typedef struct dpp_se_as_as_alg_lpm_p0_fc_cnt_t +{ + ZXIC_UINT32 as_alg_lpm_p0_fc_cnt; +}DPP_SE_AS_AS_ALG_LPM_P0_FC_CNT_T; + +typedef struct dpp_se_as_as_pbu_fc_cnt_t +{ + ZXIC_UINT32 as_pbu_fc_cnt; +}DPP_SE_AS_AS_PBU_FC_CNT_T; + +typedef struct dpp_se_as_pbu_se_dpi_key_fc_cnt_t +{ + ZXIC_UINT32 pbu_se_dpi_key_fc_cnt; +}DPP_SE_AS_PBU_SE_DPI_KEY_FC_CNT_T; + +typedef struct dpp_se_as_as_etcam_ctrl_fc0_1_cnt_t +{ + ZXIC_UINT32 as_etcam_ctrl_fc0_1_cnt; +}DPP_SE_AS_AS_ETCAM_CTRL_FC0_1_CNT_T; + +typedef struct dpp_se_as_etcam_ctrl_as_fc0_1_cnt_t +{ + ZXIC_UINT32 etcam_ctrl_as_fc0_1_cnt; +}DPP_SE_AS_ETCAM_CTRL_AS_FC0_1_CNT_T; + +typedef struct dpp_se_as_smmu0_as_mac_age_fc_cnt_t +{ + ZXIC_UINT32 smmu0_as_mac_age_fc_cnt; +}DPP_SE_AS_SMMU0_AS_MAC_AGE_FC_CNT_T; + +typedef struct dpp_se_as_alg_learn_fc_cnt_t +{ + ZXIC_UINT32 alg_learn_fc_cnt; +}DPP_SE_AS_ALG_LEARN_FC_CNT_T; + +typedef struct dpp_se_as_smmu1_as_fc_cnt_t +{ + ZXIC_UINT32 smmu1_as_fc_cnt; +}DPP_SE_AS_SMMU1_AS_FC_CNT_T; + +typedef struct dpp_se_as_cfg_se_mac_fc_cnt_t +{ + ZXIC_UINT32 cfg_se_mac_fc_cnt; +}DPP_SE_AS_CFG_SE_MAC_FC_CNT_T; + +typedef struct dpp_se_kschd_kschd_cpu_rdy_t +{ + ZXIC_UINT32 kschd_cpu_rdy; +}DPP_SE_KSCHD_KSCHD_CPU_RDY_T; + +typedef struct dpp_se_kschd_ppu0_ecc_bypass_read_t +{ + ZXIC_UINT32 ppu0_ecc_bypass_read; +}DPP_SE_KSCHD_PPU0_ECC_BYPASS_READ_T; + +typedef struct dpp_se_kschd_pbu_ecc_bypass_read_t +{ + ZXIC_UINT32 pbu_ecc_bypass_read; +}DPP_SE_KSCHD_PBU_ECC_BYPASS_READ_T; + +typedef struct dpp_se_kschd_smmu1_ecc_bypass_read_t +{ + ZXIC_UINT32 u3_smmu1_ecc_bypass_read; + ZXIC_UINT32 u2_smmu1_ecc_bypass_read; + ZXIC_UINT32 u1_smmu1_ecc_bypass_read; + ZXIC_UINT32 u0_smmu1_ecc_bypass_read; +}DPP_SE_KSCHD_SMMU1_ECC_BYPASS_READ_T; + +typedef struct dpp_se_kschd_ass_ecc_bypass_read_t +{ + ZXIC_UINT32 ass_ecc_bypass_read; +}DPP_SE_KSCHD_ASS_ECC_BYPASS_READ_T; + +typedef struct dpp_se_kschd_sdt_h_t +{ + ZXIC_UINT32 sdt_h; +}DPP_SE_KSCHD_SDT_H_T; + +typedef struct dpp_se_kschd_sdt_l_t +{ + ZXIC_UINT32 sdt_l; +}DPP_SE_KSCHD_SDT_L_T; + +typedef struct dpp_se_kschd_hash_key15_t +{ + ZXIC_UINT32 dma_en; + ZXIC_UINT32 delete_en; + ZXIC_UINT32 hash_key15; +}DPP_SE_KSCHD_HASH_KEY15_T; + +typedef struct dpp_se_kschd_hash_key14_t +{ + ZXIC_UINT32 hash_key14; +}DPP_SE_KSCHD_HASH_KEY14_T; + +typedef struct dpp_se_kschd_hash_key13_t +{ + ZXIC_UINT32 hash_key13; +}DPP_SE_KSCHD_HASH_KEY13_T; + +typedef struct dpp_se_kschd_hash_key12_t +{ + ZXIC_UINT32 hash_key12; +}DPP_SE_KSCHD_HASH_KEY12_T; + +typedef struct dpp_se_kschd_hash_key11_t +{ + ZXIC_UINT32 hash_key11; +}DPP_SE_KSCHD_HASH_KEY11_T; + +typedef struct dpp_se_kschd_hash_key10_t +{ + ZXIC_UINT32 hash_key10; +}DPP_SE_KSCHD_HASH_KEY10_T; + +typedef struct dpp_se_kschd_hash_key9_t +{ + ZXIC_UINT32 hash_key9; +}DPP_SE_KSCHD_HASH_KEY9_T; + +typedef struct dpp_se_kschd_hash_key8_t +{ + ZXIC_UINT32 hash_key8; +}DPP_SE_KSCHD_HASH_KEY8_T; + +typedef struct dpp_se_kschd_hash_key7_t +{ + ZXIC_UINT32 hash_key7; +}DPP_SE_KSCHD_HASH_KEY7_T; + +typedef struct dpp_se_kschd_hash_key6_t +{ + ZXIC_UINT32 hash_key6; +}DPP_SE_KSCHD_HASH_KEY6_T; + +typedef struct dpp_se_kschd_hash_key5_t +{ + ZXIC_UINT32 hash_key5; +}DPP_SE_KSCHD_HASH_KEY5_T; + +typedef struct dpp_se_kschd_hash_key4_t +{ + ZXIC_UINT32 hash_key4; +}DPP_SE_KSCHD_HASH_KEY4_T; + +typedef struct dpp_se_kschd_hash_key3_t +{ + ZXIC_UINT32 hash_key3; +}DPP_SE_KSCHD_HASH_KEY3_T; + +typedef struct dpp_se_kschd_hash_key2_t +{ + ZXIC_UINT32 hash_key2; +}DPP_SE_KSCHD_HASH_KEY2_T; + +typedef struct dpp_se_kschd_hash_key1_t +{ + ZXIC_UINT32 hash_key1; +}DPP_SE_KSCHD_HASH_KEY1_T; + +typedef struct dpp_se_kschd_hash_key0_t +{ + ZXIC_UINT32 hash_key0; +}DPP_SE_KSCHD_HASH_KEY0_T; + +typedef struct dpp_se_kschd_schd_int_0_en_t +{ + ZXIC_UINT32 port0_int_en; +}DPP_SE_KSCHD_SCHD_INT_0_EN_T; + +typedef struct dpp_se_kschd_schd_int_0_mask_t +{ + ZXIC_UINT32 port0_int_mask; +}DPP_SE_KSCHD_SCHD_INT_0_MASK_T; + +typedef struct dpp_se_kschd_schd_int_1_en_t +{ + ZXIC_UINT32 port1_int_en; +}DPP_SE_KSCHD_SCHD_INT_1_EN_T; + +typedef struct dpp_se_kschd_schd_int_1_mask_t +{ + ZXIC_UINT32 port1_int_mask; +}DPP_SE_KSCHD_SCHD_INT_1_MASK_T; + +typedef struct dpp_se_kschd_schd_int_2_en_t +{ + ZXIC_UINT32 port2_int_en; +}DPP_SE_KSCHD_SCHD_INT_2_EN_T; + +typedef struct dpp_se_kschd_schd_int_2_mask_t +{ + ZXIC_UINT32 port2_int_mask; +}DPP_SE_KSCHD_SCHD_INT_2_MASK_T; + +typedef struct dpp_se_kschd_schd_int_3_en_t +{ + ZXIC_UINT32 port3_int_en; +}DPP_SE_KSCHD_SCHD_INT_3_EN_T; + +typedef struct dpp_se_kschd_schd_int_3_mask_t +{ + ZXIC_UINT32 port3_int_mask; +}DPP_SE_KSCHD_SCHD_INT_3_MASK_T; + +typedef struct dpp_se_kschd_schd_int_4_en_t +{ + ZXIC_UINT32 port4_int_en; +}DPP_SE_KSCHD_SCHD_INT_4_EN_T; + +typedef struct dpp_se_kschd_schd_int_4_mask_t +{ + ZXIC_UINT32 port4_int_mask; +}DPP_SE_KSCHD_SCHD_INT_4_MASK_T; + +typedef struct dpp_se_kschd_schd_int_0_status_t +{ + ZXIC_UINT32 port0_int_status; +}DPP_SE_KSCHD_SCHD_INT_0_STATUS_T; + +typedef struct dpp_se_kschd_schd_int_1_status_t +{ + ZXIC_UINT32 port1_int_status; +}DPP_SE_KSCHD_SCHD_INT_1_STATUS_T; + +typedef struct dpp_se_kschd_schd_int_2_status_t +{ + ZXIC_UINT32 port2_int_status; +}DPP_SE_KSCHD_SCHD_INT_2_STATUS_T; + +typedef struct dpp_se_kschd_schd_int_3_status_t +{ + ZXIC_UINT32 port3_int_status; +}DPP_SE_KSCHD_SCHD_INT_3_STATUS_T; + +typedef struct dpp_se_kschd_schd_int_4_status_t +{ + ZXIC_UINT32 port4_int_status; +}DPP_SE_KSCHD_SCHD_INT_4_STATUS_T; + +typedef struct dpp_se_kschd_se_kschd_int_status_t +{ + ZXIC_UINT32 schd_int4_unmask_flag; + ZXIC_UINT32 schd_int3_unmask_flag; + ZXIC_UINT32 schd_int2_unmask_flag; + ZXIC_UINT32 schd_int1_unmask_flag; + ZXIC_UINT32 schd_int0_unmask_flag; +}DPP_SE_KSCHD_SE_KSCHD_INT_STATUS_T; + +typedef struct dpp_se_kschd_debug_cnt_mode_t +{ + ZXIC_UINT32 cnt_rd_mode; + ZXIC_UINT32 cnt_overflow_mode; +}DPP_SE_KSCHD_DEBUG_CNT_MODE_T; + +typedef struct dpp_se_kschd_se_parser_kschd_key0_3_cnt_t +{ + ZXIC_UINT32 se_parser_kschd_key0_3_cnt; +}DPP_SE_KSCHD_SE_PARSER_KSCHD_KEY0_3_CNT_T; + +typedef struct dpp_se_kschd_se_smmu1_key0_3_cnt_t +{ + ZXIC_UINT32 se_smmu1_key0_3_cnt; +}DPP_SE_KSCHD_SE_SMMU1_KEY0_3_CNT_T; + +typedef struct dpp_se_kschd_kschd_as_key0_cnt_t +{ + ZXIC_UINT32 kschd_as_key0_cnt; +}DPP_SE_KSCHD_KSCHD_AS_KEY0_CNT_T; + +typedef struct dpp_se_kschd_kschd_as_key1_cnt_t +{ + ZXIC_UINT32 kschd_as_key1_cnt; +}DPP_SE_KSCHD_KSCHD_AS_KEY1_CNT_T; + +typedef struct dpp_se_kschd_kschd_as_key2_cnt_t +{ + ZXIC_UINT32 kschd_as_key2_cnt; +}DPP_SE_KSCHD_KSCHD_AS_KEY2_CNT_T; + +typedef struct dpp_se_kschd_kschd_as_key3_cnt_t +{ + ZXIC_UINT32 kschd_as_key3_cnt; +}DPP_SE_KSCHD_KSCHD_AS_KEY3_CNT_T; + +typedef struct dpp_se_kschd_kschd_as_key4_cnt_t +{ + ZXIC_UINT32 kschd_as_key4_cnt; +}DPP_SE_KSCHD_KSCHD_AS_KEY4_CNT_T; + +typedef struct dpp_se_kschd_kschd_as_key5_cnt_t +{ + ZXIC_UINT32 kschd_as_key5_cnt; +}DPP_SE_KSCHD_KSCHD_AS_KEY5_CNT_T; + +typedef struct dpp_se_kschd_kschd_as_key6_cnt_t +{ + ZXIC_UINT32 kschd_as_key6_cnt; +}DPP_SE_KSCHD_KSCHD_AS_KEY6_CNT_T; + +typedef struct dpp_se_kschd_kschd_as_key9_cnt_t +{ + ZXIC_UINT32 kschd_as_key9_cnt; +}DPP_SE_KSCHD_KSCHD_AS_KEY9_CNT_T; + +typedef struct dpp_se_kschd_kschd_se_parser_fc0_3_cnt_t +{ + ZXIC_UINT32 kschd_se_parser_fc0_3_cnt; +}DPP_SE_KSCHD_KSCHD_SE_PARSER_FC0_3_CNT_T; + +typedef struct dpp_se_kschd_smmu1_se_fc0_3_cnt_t +{ + ZXIC_UINT32 smmu1_se_fc0_3_cnt; +}DPP_SE_KSCHD_SMMU1_SE_FC0_3_CNT_T; + +typedef struct dpp_se_kschd_as_kschd_fc_cnt0_t +{ + ZXIC_UINT32 as_kschd_fc_cnt0; +}DPP_SE_KSCHD_AS_KSCHD_FC_CNT0_T; + +typedef struct dpp_se_kschd_as_kschd_fc_cnt1_t +{ + ZXIC_UINT32 as_kschd_fc_cnt1; +}DPP_SE_KSCHD_AS_KSCHD_FC_CNT1_T; + +typedef struct dpp_se_kschd_as_kschd_fc_cnt2_t +{ + ZXIC_UINT32 as_kschd_fc_cnt2; +}DPP_SE_KSCHD_AS_KSCHD_FC_CNT2_T; + +typedef struct dpp_se_kschd_as_kschd_fc_cnt3_t +{ + ZXIC_UINT32 as_kschd_fc_cnt3; +}DPP_SE_KSCHD_AS_KSCHD_FC_CNT3_T; + +typedef struct dpp_se_kschd_as_kschd_fc_cnt4_t +{ + ZXIC_UINT32 as_kschd_fc_cnt4; +}DPP_SE_KSCHD_AS_KSCHD_FC_CNT4_T; + +typedef struct dpp_se_kschd_as_kschd_fc_cnt5_t +{ + ZXIC_UINT32 as_kschd_fc_cnt5; +}DPP_SE_KSCHD_AS_KSCHD_FC_CNT5_T; + +typedef struct dpp_se_kschd_as_kschd_fc_cnt6_t +{ + ZXIC_UINT32 as_kschd_fc_cnt6; +}DPP_SE_KSCHD_AS_KSCHD_FC_CNT6_T; + +typedef struct dpp_se_kschd_as_kschd_fc_cnt9_t +{ + ZXIC_UINT32 as_kschd_fc_cnt9; +}DPP_SE_KSCHD_AS_KSCHD_FC_CNT9_T; + +typedef struct dpp_se_rschd_rschd_hash_pful_cfg_t +{ + ZXIC_UINT32 rschd_hash_pful_cfg; +}DPP_SE_RSCHD_RSCHD_HASH_PFUL_CFG_T; + +typedef struct dpp_se_rschd_rschd_hash_ept_cfg_t +{ + ZXIC_UINT32 rschd_hash_ept_cfg; +}DPP_SE_RSCHD_RSCHD_HASH_EPT_CFG_T; + +typedef struct dpp_se_rschd_rschd_pbu_pful_cfg_t +{ + ZXIC_UINT32 rschd_pbu_pful_cfg; +}DPP_SE_RSCHD_RSCHD_PBU_PFUL_CFG_T; + +typedef struct dpp_se_rschd_rschd_pbu_ept_cfg_t +{ + ZXIC_UINT32 rschd_pbu_ept_cfg; +}DPP_SE_RSCHD_RSCHD_PBU_EPT_CFG_T; + +typedef struct dpp_se_rschd_rschd_lpm_pful_cfg_t +{ + ZXIC_UINT32 rschd_lpm_pful_cfg; +}DPP_SE_RSCHD_RSCHD_LPM_PFUL_CFG_T; + +typedef struct dpp_se_rschd_rschd_lpm_ept_cfg_t +{ + ZXIC_UINT32 rschd_lpm_ept_cfg; +}DPP_SE_RSCHD_RSCHD_LPM_EPT_CFG_T; + +typedef struct dpp_se_rschd_rschd_etcam_pful_cfg_t +{ + ZXIC_UINT32 rschd_etcam_pful_cfg; +}DPP_SE_RSCHD_RSCHD_ETCAM_PFUL_CFG_T; + +typedef struct dpp_se_rschd_rschd_etcam_ept_cfg_t +{ + ZXIC_UINT32 rschd_etcam_ept_cfg; +}DPP_SE_RSCHD_RSCHD_ETCAM_EPT_CFG_T; + +typedef struct dpp_se_rschd_smmu0_wb_pful_cfg_t +{ + ZXIC_UINT32 smmu0_wb_pful_cfg; +}DPP_SE_RSCHD_SMMU0_WB_PFUL_CFG_T; + +typedef struct dpp_se_rschd_smmu0_wb_ept_cfg_t +{ + ZXIC_UINT32 smmu0_wb_ept_cfg; +}DPP_SE_RSCHD_SMMU0_WB_EPT_CFG_T; + +typedef struct dpp_se_rschd_smmu1_wb_pful_cfg_t +{ + ZXIC_UINT32 smmu1_wb_pful_cfg; +}DPP_SE_RSCHD_SMMU1_WB_PFUL_CFG_T; + +typedef struct dpp_se_rschd_smmu1_wb_ept_cfg_t +{ + ZXIC_UINT32 smmu1_wb_ept_cfg; +}DPP_SE_RSCHD_SMMU1_WB_EPT_CFG_T; + +typedef struct dpp_se_rschd_alg_wb_pful_cfg_t +{ + ZXIC_UINT32 alg_wb_pful_cfg; +}DPP_SE_RSCHD_ALG_WB_PFUL_CFG_T; + +typedef struct dpp_se_rschd_alg_wb_ept_cfg_t +{ + ZXIC_UINT32 alg_wb_ept_cfg; +}DPP_SE_RSCHD_ALG_WB_EPT_CFG_T; + +typedef struct dpp_se_rschd_wr_rsp_vld_en_t +{ + ZXIC_UINT32 wr_rsp_vld_en; +}DPP_SE_RSCHD_WR_RSP_VLD_EN_T; + +typedef struct dpp_se_rschd_nppu_wb_pful_cfg_t +{ + ZXIC_UINT32 nppu_wb_pful_cfg; +}DPP_SE_RSCHD_NPPU_WB_PFUL_CFG_T; + +typedef struct dpp_se_rschd_nppu_wb_ept_cfg_t +{ + ZXIC_UINT32 nppu_wb_ept_cfg; +}DPP_SE_RSCHD_NPPU_WB_EPT_CFG_T; + +typedef struct dpp_se_rschd_port0_int_en_t +{ + ZXIC_UINT32 port0_int_en; +}DPP_SE_RSCHD_PORT0_INT_EN_T; + +typedef struct dpp_se_rschd_port0_int_mask_t +{ + ZXIC_UINT32 port0_int_mask; +}DPP_SE_RSCHD_PORT0_INT_MASK_T; + +typedef struct dpp_se_rschd_port1_int_en_t +{ + ZXIC_UINT32 port1_int_en; +}DPP_SE_RSCHD_PORT1_INT_EN_T; + +typedef struct dpp_se_rschd_port1_int_mask_t +{ + ZXIC_UINT32 port1_int_mask; +}DPP_SE_RSCHD_PORT1_INT_MASK_T; + +typedef struct dpp_se_rschd_port0_int_status_t +{ + ZXIC_UINT32 port0_int_status; +}DPP_SE_RSCHD_PORT0_INT_STATUS_T; + +typedef struct dpp_se_rschd_port1_int_status_t +{ + ZXIC_UINT32 port1_int_status; +}DPP_SE_RSCHD_PORT1_INT_STATUS_T; + +typedef struct dpp_se_rschd_se_rschd_int_status_t +{ + ZXIC_UINT32 port1_int_unmask_flag; + ZXIC_UINT32 port0_int_unmask_flag; +}DPP_SE_RSCHD_SE_RSCHD_INT_STATUS_T; + +typedef struct dpp_se_rschd_debug_cnt_mode_t +{ + ZXIC_UINT32 cnt_rd_mode; + ZXIC_UINT32 cnt_overflow_mode; +}DPP_SE_RSCHD_DEBUG_CNT_MODE_T; + +typedef struct dpp_se_rschd_se_ppu_mex0_5_rsp1_cnt_t +{ + ZXIC_UINT32 se_ppu_mex0_5_rsp1_cnt; +}DPP_SE_RSCHD_SE_PPU_MEX0_5_RSP1_CNT_T; + +typedef struct dpp_se_rschd_as_rschd_rsp0_cnt_t +{ + ZXIC_UINT32 as_rschd_rsp0_cnt; +}DPP_SE_RSCHD_AS_RSCHD_RSP0_CNT_T; + +typedef struct dpp_se_rschd_as_rschd_rsp1_cnt_t +{ + ZXIC_UINT32 as_rschd_rsp1_cnt; +}DPP_SE_RSCHD_AS_RSCHD_RSP1_CNT_T; + +typedef struct dpp_se_rschd_as_rschd_rsp2_cnt_t +{ + ZXIC_UINT32 as_rschd_rsp2_cnt; +}DPP_SE_RSCHD_AS_RSCHD_RSP2_CNT_T; + +typedef struct dpp_se_rschd_as_rschd_rsp3_cnt_t +{ + ZXIC_UINT32 as_rschd_rsp3_cnt; +}DPP_SE_RSCHD_AS_RSCHD_RSP3_CNT_T; + +typedef struct dpp_se_rschd_as_rschd_rsp4_cnt_t +{ + ZXIC_UINT32 as_rschd_rsp4_cnt; +}DPP_SE_RSCHD_AS_RSCHD_RSP4_CNT_T; + +typedef struct dpp_se_rschd_as_rschd_rsp5_cnt_t +{ + ZXIC_UINT32 as_rschd_rsp5_cnt; +}DPP_SE_RSCHD_AS_RSCHD_RSP5_CNT_T; + +typedef struct dpp_se_rschd_as_rschd_rsp6_cnt_t +{ + ZXIC_UINT32 as_rschd_rsp6_cnt; +}DPP_SE_RSCHD_AS_RSCHD_RSP6_CNT_T; + +typedef struct dpp_se_rschd_as_rschd_rsp9_cnt_t +{ + ZXIC_UINT32 as_rschd_rsp9_cnt; +}DPP_SE_RSCHD_AS_RSCHD_RSP9_CNT_T; + +typedef struct dpp_se_rschd_smmu1_se_rsp0_3_cnt_t +{ + ZXIC_UINT32 smmu1_se_rsp0_3_cnt; +}DPP_SE_RSCHD_SMMU1_SE_RSP0_3_CNT_T; + +typedef struct dpp_se_rschd_ppu_se_mex0_3_fc_cnt_t +{ + ZXIC_UINT32 ppu_se_mex0_3_fc_cnt; +}DPP_SE_RSCHD_PPU_SE_MEX0_3_FC_CNT_T; + +typedef struct dpp_se_rschd_rschd_as_fc_cnt0_t +{ + ZXIC_UINT32 rschd_as_fc_cnt0; +}DPP_SE_RSCHD_RSCHD_AS_FC_CNT0_T; + +typedef struct dpp_se_rschd_rschd_as_fc_cnt1_t +{ + ZXIC_UINT32 rschd_as_fc_cnt1; +}DPP_SE_RSCHD_RSCHD_AS_FC_CNT1_T; + +typedef struct dpp_se_rschd_rschd_as_fc_cnt2_t +{ + ZXIC_UINT32 rschd_as_fc_cnt2; +}DPP_SE_RSCHD_RSCHD_AS_FC_CNT2_T; + +typedef struct dpp_se_rschd_rschd_as_fc_cnt3_t +{ + ZXIC_UINT32 rschd_as_fc_cnt3; +}DPP_SE_RSCHD_RSCHD_AS_FC_CNT3_T; + +typedef struct dpp_se_rschd_rschd_as_fc_cnt4_t +{ + ZXIC_UINT32 rschd_as_fc_cnt4; +}DPP_SE_RSCHD_RSCHD_AS_FC_CNT4_T; + +typedef struct dpp_se_rschd_rschd_as_fc_cnt5_t +{ + ZXIC_UINT32 rschd_as_fc_cnt5; +}DPP_SE_RSCHD_RSCHD_AS_FC_CNT5_T; + +typedef struct dpp_se_rschd_rschd_as_fc_cnt6_t +{ + ZXIC_UINT32 rschd_as_fc_cnt6; +}DPP_SE_RSCHD_RSCHD_AS_FC_CNT6_T; + +typedef struct dpp_se_rschd_rschd_as_fc_cnt9_t +{ + ZXIC_UINT32 rschd_as_fc_cnt9; +}DPP_SE_RSCHD_RSCHD_AS_FC_CNT9_T; + +typedef struct dpp_se_rschd_se_smmu1_fc0_3_cnt_t +{ + ZXIC_UINT32 se_smmu1_fc0_3_cnt; +}DPP_SE_RSCHD_SE_SMMU1_FC0_3_CNT_T; + +typedef struct dpp_se_rschd_smmu0_se_wr_done_cnt_t +{ + ZXIC_UINT32 smmu0_se_wr_done_cnt; +}DPP_SE_RSCHD_SMMU0_SE_WR_DONE_CNT_T; + +typedef struct dpp_se_rschd_se_smmu0_wr_done_fc_cnt_t +{ + ZXIC_UINT32 se_smmu0_wr_done_fc_cnt; +}DPP_SE_RSCHD_SE_SMMU0_WR_DONE_FC_CNT_T; + +typedef struct dpp_se_rschd_smmu1_se_wr_rsp_cnt_t +{ + ZXIC_UINT32 smmu1_se_wr_rsp_cnt; +}DPP_SE_RSCHD_SMMU1_SE_WR_RSP_CNT_T; + +typedef struct dpp_se_rschd_se_smmu1_wr_rsp_fc_cnt_t +{ + ZXIC_UINT32 se_smmu1_wr_rsp_fc_cnt; +}DPP_SE_RSCHD_SE_SMMU1_WR_RSP_FC_CNT_T; + +typedef struct dpp_se_rschd_alg_se_wr_rsp_cnt_t +{ + ZXIC_UINT32 alg_se_wr_rsp_cnt; +}DPP_SE_RSCHD_ALG_SE_WR_RSP_CNT_T; + +typedef struct dpp_se_rschd_se_alg_wr_rsp_fc_cnt_t +{ + ZXIC_UINT32 se_alg_wr_rsp_fc_cnt; +}DPP_SE_RSCHD_SE_ALG_WR_RSP_FC_CNT_T; + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_smmu0_reg.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_smmu0_reg.h new file mode 100644 index 0000000..08b7a46 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_smmu0_reg.h @@ -0,0 +1,6423 @@ + +#ifndef _DPP_SMMU0_REG_H_ +#define _DPP_SMMU0_REG_H_ + +#ifdef __cplusplus +extern "C"{ +#endif + +typedef struct dpp_smmu0_smmu0_init_done_t +{ + ZXIC_UINT32 init_done; +}DPP_SMMU0_SMMU0_INIT_DONE_T; + +typedef struct dpp_smmu0_smmu0_cpu_ind_wdat0_t +{ + ZXIC_UINT32 cpu_ind_wdat0; +}DPP_SMMU0_SMMU0_CPU_IND_WDAT0_T; + +typedef struct dpp_smmu0_smmu0_cpu_ind_wdat1_t +{ + ZXIC_UINT32 cpu_ind_wdat1; +}DPP_SMMU0_SMMU0_CPU_IND_WDAT1_T; + +typedef struct dpp_smmu0_smmu0_cpu_ind_wdat2_t +{ + ZXIC_UINT32 cpu_ind_wdat2; +}DPP_SMMU0_SMMU0_CPU_IND_WDAT2_T; + +typedef struct dpp_smmu0_smmu0_cpu_ind_wdat3_t +{ + ZXIC_UINT32 cpu_ind_wdat3; +}DPP_SMMU0_SMMU0_CPU_IND_WDAT3_T; + +typedef struct dpp_smmu0_smmu0_cpu_ind_cmd_t +{ + ZXIC_UINT32 cpu_ind_rw; + ZXIC_UINT32 cpu_ind_rd_mode; + ZXIC_UINT32 cpu_req_mode; + ZXIC_UINT32 cpu_ind_addr; +}DPP_SMMU0_SMMU0_CPU_IND_CMD_T; + +typedef struct dpp_smmu0_smmu0_cpu_ind_rd_done_t +{ + ZXIC_UINT32 cpu_ind_rd_done; +}DPP_SMMU0_SMMU0_CPU_IND_RD_DONE_T; + +typedef struct dpp_smmu0_smmu0_cpu_ind_rdat0_t +{ + ZXIC_UINT32 cpu_ind_rdat0; +}DPP_SMMU0_SMMU0_CPU_IND_RDAT0_T; + +typedef struct dpp_smmu0_smmu0_cpu_ind_rdat1_t +{ + ZXIC_UINT32 cpu_ind_rdat1; +}DPP_SMMU0_SMMU0_CPU_IND_RDAT1_T; + +typedef struct dpp_smmu0_smmu0_cpu_ind_rdat2_t +{ + ZXIC_UINT32 cpu_ind_rdat2; +}DPP_SMMU0_SMMU0_CPU_IND_RDAT2_T; + +typedef struct dpp_smmu0_smmu0_cpu_ind_rdat3_t +{ + ZXIC_UINT32 cpu_ind_rdat3; +}DPP_SMMU0_SMMU0_CPU_IND_RDAT3_T; + +typedef struct dpp_smmu0_smmu0_cfg_plcr_mono_t +{ + ZXIC_UINT32 cfg_plcr_mono; +}DPP_SMMU0_SMMU0_CFG_PLCR_MONO_T; + +typedef struct dpp_smmu0_smmu0_wr_arb_cpu_rdy_t +{ + ZXIC_UINT32 wr_arb_cpu_rdy; +}DPP_SMMU0_SMMU0_WR_ARB_CPU_RDY_T; + +typedef struct dpp_smmu0_smmu0_tm_stat_en_cfg_t +{ + ZXIC_UINT32 tm_stat_en_cfg; +}DPP_SMMU0_SMMU0_TM_STAT_EN_CFG_T; + +typedef struct dpp_smmu0_smmu0_kschd_pful_cfg0_t +{ + ZXIC_UINT32 kschd_pful_assert0_1; + ZXIC_UINT32 kschd_pful_negate0_1; + ZXIC_UINT32 kschd_pful_assert0_0; + ZXIC_UINT32 kschd_pful_negate0_0; +}DPP_SMMU0_SMMU0_KSCHD_PFUL_CFG0_T; + +typedef struct dpp_smmu0_smmu0_kschd_pful_cfg1_t +{ + ZXIC_UINT32 kschd_pful_assert1_1; + ZXIC_UINT32 kschd_pful_negate1_1; + ZXIC_UINT32 kschd_pful_assert1_0; + ZXIC_UINT32 kschd_pful_negate1_0; +}DPP_SMMU0_SMMU0_KSCHD_PFUL_CFG1_T; + +typedef struct dpp_smmu0_smmu0_ctrl_pful1_cfg_t +{ + ZXIC_UINT32 ctrl_pful1_assert; + ZXIC_UINT32 ctrl_pful1_negate; +}DPP_SMMU0_SMMU0_CTRL_PFUL1_CFG_T; + +typedef struct dpp_smmu0_smmu0_ctrl_pful2_cfg_t +{ + ZXIC_UINT32 ctrl_pful2_assert; + ZXIC_UINT32 ctrl_pful2_negate; +}DPP_SMMU0_SMMU0_CTRL_PFUL2_CFG_T; + +typedef struct dpp_smmu0_smmu0_ctrl_pful3_cfg_t +{ + ZXIC_UINT32 ctrl_pful3_assert; + ZXIC_UINT32 ctrl_pful3_negate; +}DPP_SMMU0_SMMU0_CTRL_PFUL3_CFG_T; + +typedef struct dpp_smmu0_smmu0_rschd_pful_cfg_t +{ + ZXIC_UINT32 rschd_pful_assert; + ZXIC_UINT32 rschd_pful_negate; +}DPP_SMMU0_SMMU0_RSCHD_PFUL_CFG_T; + +typedef struct dpp_smmu0_smmu0_rschd_ept_cfg_t +{ + ZXIC_UINT32 rschd_ept_assert; + ZXIC_UINT32 rschd_ept_negate; +}DPP_SMMU0_SMMU0_RSCHD_EPT_CFG_T; + +typedef struct dpp_smmu0_smmu0_alucmd_pful_cfg_t +{ + ZXIC_UINT32 alucmd_pful_assert; + ZXIC_UINT32 alucmd_pful_negate; +}DPP_SMMU0_SMMU0_ALUCMD_PFUL_CFG_T; + +typedef struct dpp_smmu0_smmu0_aluwr_pful_cfg_t +{ + ZXIC_UINT32 aluwr_pful_assert; + ZXIC_UINT32 aluwr_pful_negate; +}DPP_SMMU0_SMMU0_ALUWR_PFUL_CFG_T; + +typedef struct dpp_smmu0_smmu0_wr_arb_pful_cfg0_t +{ + ZXIC_UINT32 wr_arb_pful0_assert; + ZXIC_UINT32 wr_arb_pful0_negate; +}DPP_SMMU0_SMMU0_WR_ARB_PFUL_CFG0_T; + +typedef struct dpp_smmu0_smmu0_wr_arb_pful_cfg1_t +{ + ZXIC_UINT32 wr_arb_pful1_assert; + ZXIC_UINT32 wr_arb_pful1_negate; +}DPP_SMMU0_SMMU0_WR_ARB_PFUL_CFG1_T; + +typedef struct dpp_smmu0_smmu0_ord_pful_cfg_t +{ + ZXIC_UINT32 ord_pful_assert; + ZXIC_UINT32 ord_pful_negate; +}DPP_SMMU0_SMMU0_ORD_PFUL_CFG_T; + +typedef struct dpp_smmu0_smmu0_cfg_dma_baddr_t +{ + ZXIC_UINT32 cfg_dma_baddr; +}DPP_SMMU0_SMMU0_CFG_DMA_BADDR_T; + +typedef struct dpp_smmu0_smmu0_cfg_odma0_baddr_t +{ + ZXIC_UINT32 cfg_odma0_baddr; +}DPP_SMMU0_SMMU0_CFG_ODMA0_BADDR_T; + +typedef struct dpp_smmu0_smmu0_cfg_odma1_baddr_t +{ + ZXIC_UINT32 cfg_odma1_baddr; +}DPP_SMMU0_SMMU0_CFG_ODMA1_BADDR_T; + +typedef struct dpp_smmu0_smmu0_cfg_odma2_baddr_t +{ + ZXIC_UINT32 cfg_odma2_baddr; +}DPP_SMMU0_SMMU0_CFG_ODMA2_BADDR_T; + +typedef struct dpp_smmu0_smmu0_cfg_odma_tdm_baddr_t +{ + ZXIC_UINT32 cfg_odma_tdm_baddr; +}DPP_SMMU0_SMMU0_CFG_ODMA_TDM_BADDR_T; + +typedef struct dpp_smmu0_smmu0_cfg_mcast_baddr_t +{ + ZXIC_UINT32 cfg_mcast_baddr; +}DPP_SMMU0_SMMU0_CFG_MCAST_BADDR_T; + +typedef struct dpp_smmu0_smmu0_cfg_lpm0_t +{ + ZXIC_UINT32 lpm0_rsp_mode; + ZXIC_UINT32 lpm0_baddr; +}DPP_SMMU0_SMMU0_CFG_LPM0_T; + +typedef struct dpp_smmu0_smmu0_cfg_lpm1_t +{ + ZXIC_UINT32 lpm1_rsp_mode; + ZXIC_UINT32 lpm1_baddr; +}DPP_SMMU0_SMMU0_CFG_LPM1_T; + +typedef struct dpp_smmu0_smmu0_cfg_lpm2_t +{ + ZXIC_UINT32 lpm2_rsp_mode; + ZXIC_UINT32 lpm2_baddr; +}DPP_SMMU0_SMMU0_CFG_LPM2_T; + +typedef struct dpp_smmu0_smmu0_cfg_lpm3_t +{ + ZXIC_UINT32 lpm3_rsp_mode; + ZXIC_UINT32 lpm3_baddr; +}DPP_SMMU0_SMMU0_CFG_LPM3_T; + +typedef struct dpp_smmu0_smmu0_cfg_lpm4_t +{ + ZXIC_UINT32 lpm4_rsp_mode; + ZXIC_UINT32 lpm4_baddr; +}DPP_SMMU0_SMMU0_CFG_LPM4_T; + +typedef struct dpp_smmu0_smmu0_cfg_lpm5_t +{ + ZXIC_UINT32 lpm5_rsp_mode; + ZXIC_UINT32 lpm5_baddr; +}DPP_SMMU0_SMMU0_CFG_LPM5_T; + +typedef struct dpp_smmu0_smmu0_cfg_lpm6_t +{ + ZXIC_UINT32 lpm6_rsp_mode; + ZXIC_UINT32 lpm6_baddr; +}DPP_SMMU0_SMMU0_CFG_LPM6_T; + +typedef struct dpp_smmu0_smmu0_cfg_lpm7_t +{ + ZXIC_UINT32 lpm7_rsp_mode; + ZXIC_UINT32 lpm7_baddr; +}DPP_SMMU0_SMMU0_CFG_LPM7_T; + +typedef struct dpp_smmu0_smmu0_debug_cnt_mode_t +{ + ZXIC_UINT32 cnt_rd_mode; + ZXIC_UINT32 cnt_overflow_mode; +}DPP_SMMU0_SMMU0_DEBUG_CNT_MODE_T; + +typedef struct dpp_smmu0_smmu0_stat_overflow_mode_t +{ + ZXIC_UINT32 stat_overflow_mode; +}DPP_SMMU0_SMMU0_STAT_OVERFLOW_MODE_T; + +typedef struct dpp_smmu0_smmu0_init_en_cfg_tmp_t +{ + ZXIC_UINT32 init_en_cfg_tmp31; + ZXIC_UINT32 init_en_cfg_tmp30; + ZXIC_UINT32 init_en_cfg_tmp29; + ZXIC_UINT32 init_en_cfg_tmp28; + ZXIC_UINT32 init_en_cfg_tmp27; + ZXIC_UINT32 init_en_cfg_tmp26; + ZXIC_UINT32 init_en_cfg_tmp25; + ZXIC_UINT32 init_en_cfg_tmp24; + ZXIC_UINT32 init_en_cfg_tmp23; + ZXIC_UINT32 init_en_cfg_tmp22; + ZXIC_UINT32 init_en_cfg_tmp21; + ZXIC_UINT32 init_en_cfg_tmp20; + ZXIC_UINT32 init_en_cfg_tmp19; + ZXIC_UINT32 init_en_cfg_tmp18; + ZXIC_UINT32 init_en_cfg_tmp17; + ZXIC_UINT32 init_en_cfg_tmp16; + ZXIC_UINT32 init_en_cfg_tmp15; + ZXIC_UINT32 init_en_cfg_tmp14; + ZXIC_UINT32 init_en_cfg_tmp13; + ZXIC_UINT32 init_en_cfg_tmp12; + ZXIC_UINT32 init_en_cfg_tmp11; + ZXIC_UINT32 init_en_cfg_tmp10; + ZXIC_UINT32 init_en_cfg_tmp9; + ZXIC_UINT32 init_en_cfg_tmp8; + ZXIC_UINT32 init_en_cfg_tmp7; + ZXIC_UINT32 init_en_cfg_tmp6; + ZXIC_UINT32 init_en_cfg_tmp5; + ZXIC_UINT32 init_en_cfg_tmp4; + ZXIC_UINT32 init_en_cfg_tmp3; + ZXIC_UINT32 init_en_cfg_tmp2; + ZXIC_UINT32 init_en_cfg_tmp1; + ZXIC_UINT32 init_en_cfg_tmp0; +}DPP_SMMU0_SMMU0_INIT_EN_CFG_TMP_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int_unmask_flag_t +{ + ZXIC_UINT32 smmu0_int0_31_unmask_flag; +}DPP_SMMU0_SMMU0_SMMU0_INT_UNMASK_FLAG_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int0_en_t +{ + ZXIC_UINT32 smmu0_int0_en31; + ZXIC_UINT32 smmu0_int0_en30; + ZXIC_UINT32 smmu0_int0_en29; + ZXIC_UINT32 smmu0_int0_en28; + ZXIC_UINT32 smmu0_int0_en27; + ZXIC_UINT32 smmu0_int0_en26; + ZXIC_UINT32 smmu0_int0_en25; + ZXIC_UINT32 smmu0_int0_en24; + ZXIC_UINT32 smmu0_int0_en23; + ZXIC_UINT32 smmu0_int0_en22; + ZXIC_UINT32 smmu0_int0_en21; + ZXIC_UINT32 smmu0_int0_en20; + ZXIC_UINT32 smmu0_int0_en19; + ZXIC_UINT32 smmu0_int0_en18; + ZXIC_UINT32 smmu0_int0_en17; + ZXIC_UINT32 smmu0_int0_en16; + ZXIC_UINT32 smmu0_int0_en15; + ZXIC_UINT32 smmu0_int0_en14; + ZXIC_UINT32 smmu0_int0_en13; + ZXIC_UINT32 smmu0_int0_en12; + ZXIC_UINT32 smmu0_int0_en11; + ZXIC_UINT32 smmu0_int0_en10; + ZXIC_UINT32 smmu0_int0_en9; + ZXIC_UINT32 smmu0_int0_en8; + ZXIC_UINT32 smmu0_int0_en7; + ZXIC_UINT32 smmu0_int0_en6; + ZXIC_UINT32 smmu0_int0_en5; + ZXIC_UINT32 smmu0_int0_en4; + ZXIC_UINT32 smmu0_int0_en3; + ZXIC_UINT32 smmu0_int0_en2; + ZXIC_UINT32 smmu0_int0_en1; + ZXIC_UINT32 smmu0_int0_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT0_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int0_mask_t +{ + ZXIC_UINT32 smmu0_int0_mask31; + ZXIC_UINT32 smmu0_int0_mask30; + ZXIC_UINT32 smmu0_int0_mask29; + ZXIC_UINT32 smmu0_int0_mask28; + ZXIC_UINT32 smmu0_int0_mask27; + ZXIC_UINT32 smmu0_int0_mask26; + ZXIC_UINT32 smmu0_int0_mask25; + ZXIC_UINT32 smmu0_int0_mask24; + ZXIC_UINT32 smmu0_int0_mask23; + ZXIC_UINT32 smmu0_int0_mask22; + ZXIC_UINT32 smmu0_int0_mask21; + ZXIC_UINT32 smmu0_int0_mask20; + ZXIC_UINT32 smmu0_int0_mask19; + ZXIC_UINT32 smmu0_int0_mask18; + ZXIC_UINT32 smmu0_int0_mask17; + ZXIC_UINT32 smmu0_int0_mask16; + ZXIC_UINT32 smmu0_int0_mask15; + ZXIC_UINT32 smmu0_int0_mask14; + ZXIC_UINT32 smmu0_int0_mask13; + ZXIC_UINT32 smmu0_int0_mask12; + ZXIC_UINT32 smmu0_int0_mask11; + ZXIC_UINT32 smmu0_int0_mask10; + ZXIC_UINT32 smmu0_int0_mask9; + ZXIC_UINT32 smmu0_int0_mask8; + ZXIC_UINT32 smmu0_int0_mask7; + ZXIC_UINT32 smmu0_int0_mask6; + ZXIC_UINT32 smmu0_int0_mask5; + ZXIC_UINT32 smmu0_int0_mask4; + ZXIC_UINT32 smmu0_int0_mask3; + ZXIC_UINT32 smmu0_int0_mask2; + ZXIC_UINT32 smmu0_int0_mask1; + ZXIC_UINT32 smmu0_int0_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT0_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int0_status_t +{ + ZXIC_UINT32 smmu0_int0_status31; + ZXIC_UINT32 smmu0_int0_status30; + ZXIC_UINT32 smmu0_int0_status29; + ZXIC_UINT32 smmu0_int0_status28; + ZXIC_UINT32 smmu0_int0_status27; + ZXIC_UINT32 smmu0_int0_status26; + ZXIC_UINT32 smmu0_int0_status25; + ZXIC_UINT32 smmu0_int0_status24; + ZXIC_UINT32 smmu0_int0_status23; + ZXIC_UINT32 smmu0_int0_status22; + ZXIC_UINT32 smmu0_int0_status21; + ZXIC_UINT32 smmu0_int0_status20; + ZXIC_UINT32 smmu0_int0_status19; + ZXIC_UINT32 smmu0_int0_status18; + ZXIC_UINT32 smmu0_int0_status17; + ZXIC_UINT32 smmu0_int0_status16; + ZXIC_UINT32 smmu0_int0_status15; + ZXIC_UINT32 smmu0_int0_status14; + ZXIC_UINT32 smmu0_int0_status13; + ZXIC_UINT32 smmu0_int0_status12; + ZXIC_UINT32 smmu0_int0_status11; + ZXIC_UINT32 smmu0_int0_status10; + ZXIC_UINT32 smmu0_int0_status9; + ZXIC_UINT32 smmu0_int0_status8; + ZXIC_UINT32 smmu0_int0_status7; + ZXIC_UINT32 smmu0_int0_status6; + ZXIC_UINT32 smmu0_int0_status5; + ZXIC_UINT32 smmu0_int0_status4; + ZXIC_UINT32 smmu0_int0_status3; + ZXIC_UINT32 smmu0_int0_status2; + ZXIC_UINT32 smmu0_int0_status1; + ZXIC_UINT32 smmu0_int0_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT0_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int1_en_t +{ + ZXIC_UINT32 smmu0_int1_en31; + ZXIC_UINT32 smmu0_int1_en30; + ZXIC_UINT32 smmu0_int1_en29; + ZXIC_UINT32 smmu0_int1_en28; + ZXIC_UINT32 smmu0_int1_en27; + ZXIC_UINT32 smmu0_int1_en26; + ZXIC_UINT32 smmu0_int1_en25; + ZXIC_UINT32 smmu0_int1_en24; + ZXIC_UINT32 smmu0_int1_en23; + ZXIC_UINT32 smmu0_int1_en22; + ZXIC_UINT32 smmu0_int1_en21; + ZXIC_UINT32 smmu0_int1_en20; + ZXIC_UINT32 smmu0_int1_en19; + ZXIC_UINT32 smmu0_int1_en18; + ZXIC_UINT32 smmu0_int1_en17; + ZXIC_UINT32 smmu0_int1_en16; + ZXIC_UINT32 smmu0_int1_en15; + ZXIC_UINT32 smmu0_int1_en14; + ZXIC_UINT32 smmu0_int1_en13; + ZXIC_UINT32 smmu0_int1_en12; + ZXIC_UINT32 smmu0_int1_en11; + ZXIC_UINT32 smmu0_int1_en10; + ZXIC_UINT32 smmu0_int1_en9; + ZXIC_UINT32 smmu0_int1_en8; + ZXIC_UINT32 smmu0_int1_en7; + ZXIC_UINT32 smmu0_int1_en6; + ZXIC_UINT32 smmu0_int1_en5; + ZXIC_UINT32 smmu0_int1_en4; + ZXIC_UINT32 smmu0_int1_en3; + ZXIC_UINT32 smmu0_int1_en2; + ZXIC_UINT32 smmu0_int1_en1; + ZXIC_UINT32 smmu0_int1_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT1_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int1_mask_t +{ + ZXIC_UINT32 smmu0_int1_mask31; + ZXIC_UINT32 smmu0_int1_mask30; + ZXIC_UINT32 smmu0_int1_mask29; + ZXIC_UINT32 smmu0_int1_mask28; + ZXIC_UINT32 smmu0_int1_mask27; + ZXIC_UINT32 smmu0_int1_mask26; + ZXIC_UINT32 smmu0_int1_mask25; + ZXIC_UINT32 smmu0_int1_mask24; + ZXIC_UINT32 smmu0_int1_mask23; + ZXIC_UINT32 smmu0_int1_mask22; + ZXIC_UINT32 smmu0_int1_mask21; + ZXIC_UINT32 smmu0_int1_mask20; + ZXIC_UINT32 smmu0_int1_mask19; + ZXIC_UINT32 smmu0_int1_mask18; + ZXIC_UINT32 smmu0_int1_mask17; + ZXIC_UINT32 smmu0_int1_mask16; + ZXIC_UINT32 smmu0_int1_mask15; + ZXIC_UINT32 smmu0_int1_mask14; + ZXIC_UINT32 smmu0_int1_mask13; + ZXIC_UINT32 smmu0_int1_mask12; + ZXIC_UINT32 smmu0_int1_mask11; + ZXIC_UINT32 smmu0_int1_mask10; + ZXIC_UINT32 smmu0_int1_mask9; + ZXIC_UINT32 smmu0_int1_mask8; + ZXIC_UINT32 smmu0_int1_mask7; + ZXIC_UINT32 smmu0_int1_mask6; + ZXIC_UINT32 smmu0_int1_mask5; + ZXIC_UINT32 smmu0_int1_mask4; + ZXIC_UINT32 smmu0_int1_mask3; + ZXIC_UINT32 smmu0_int1_mask2; + ZXIC_UINT32 smmu0_int1_mask1; + ZXIC_UINT32 smmu0_int1_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT1_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int1_status_t +{ + ZXIC_UINT32 smmu0_int1_status31; + ZXIC_UINT32 smmu0_int1_status30; + ZXIC_UINT32 smmu0_int1_status29; + ZXIC_UINT32 smmu0_int1_status28; + ZXIC_UINT32 smmu0_int1_status27; + ZXIC_UINT32 smmu0_int1_status26; + ZXIC_UINT32 smmu0_int1_status25; + ZXIC_UINT32 smmu0_int1_status24; + ZXIC_UINT32 smmu0_int1_status23; + ZXIC_UINT32 smmu0_int1_status22; + ZXIC_UINT32 smmu0_int1_status21; + ZXIC_UINT32 smmu0_int1_status20; + ZXIC_UINT32 smmu0_int1_status19; + ZXIC_UINT32 smmu0_int1_status18; + ZXIC_UINT32 smmu0_int1_status17; + ZXIC_UINT32 smmu0_int1_status16; + ZXIC_UINT32 smmu0_int1_status15; + ZXIC_UINT32 smmu0_int1_status14; + ZXIC_UINT32 smmu0_int1_status13; + ZXIC_UINT32 smmu0_int1_status12; + ZXIC_UINT32 smmu0_int1_status11; + ZXIC_UINT32 smmu0_int1_status10; + ZXIC_UINT32 smmu0_int1_status9; + ZXIC_UINT32 smmu0_int1_status8; + ZXIC_UINT32 smmu0_int1_status7; + ZXIC_UINT32 smmu0_int1_status6; + ZXIC_UINT32 smmu0_int1_status5; + ZXIC_UINT32 smmu0_int1_status4; + ZXIC_UINT32 smmu0_int1_status3; + ZXIC_UINT32 smmu0_int1_status2; + ZXIC_UINT32 smmu0_int1_status1; + ZXIC_UINT32 smmu0_int1_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT1_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int2_en_t +{ + ZXIC_UINT32 smmu0_int2_en31; + ZXIC_UINT32 smmu0_int2_en30; + ZXIC_UINT32 smmu0_int2_en29; + ZXIC_UINT32 smmu0_int2_en28; + ZXIC_UINT32 smmu0_int2_en27; + ZXIC_UINT32 smmu0_int2_en26; + ZXIC_UINT32 smmu0_int2_en25; + ZXIC_UINT32 smmu0_int2_en24; + ZXIC_UINT32 smmu0_int2_en23; + ZXIC_UINT32 smmu0_int2_en22; + ZXIC_UINT32 smmu0_int2_en21; + ZXIC_UINT32 smmu0_int2_en20; + ZXIC_UINT32 smmu0_int2_en19; + ZXIC_UINT32 smmu0_int2_en18; + ZXIC_UINT32 smmu0_int2_en17; + ZXIC_UINT32 smmu0_int2_en16; + ZXIC_UINT32 smmu0_int2_en15; + ZXIC_UINT32 smmu0_int2_en14; + ZXIC_UINT32 smmu0_int2_en13; + ZXIC_UINT32 smmu0_int2_en12; + ZXIC_UINT32 smmu0_int2_en11; + ZXIC_UINT32 smmu0_int2_en10; + ZXIC_UINT32 smmu0_int2_en9; + ZXIC_UINT32 smmu0_int2_en8; + ZXIC_UINT32 smmu0_int2_en7; + ZXIC_UINT32 smmu0_int2_en6; + ZXIC_UINT32 smmu0_int2_en5; + ZXIC_UINT32 smmu0_int2_en4; + ZXIC_UINT32 smmu0_int2_en3; + ZXIC_UINT32 smmu0_int2_en2; + ZXIC_UINT32 smmu0_int2_en1; + ZXIC_UINT32 smmu0_int2_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT2_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int2_mask_t +{ + ZXIC_UINT32 smmu0_int2_mask31; + ZXIC_UINT32 smmu0_int2_mask30; + ZXIC_UINT32 smmu0_int2_mask29; + ZXIC_UINT32 smmu0_int2_mask28; + ZXIC_UINT32 smmu0_int2_mask27; + ZXIC_UINT32 smmu0_int2_mask26; + ZXIC_UINT32 smmu0_int2_mask25; + ZXIC_UINT32 smmu0_int2_mask24; + ZXIC_UINT32 smmu0_int2_mask23; + ZXIC_UINT32 smmu0_int2_mask22; + ZXIC_UINT32 smmu0_int2_mask21; + ZXIC_UINT32 smmu0_int2_mask20; + ZXIC_UINT32 smmu0_int2_mask19; + ZXIC_UINT32 smmu0_int2_mask18; + ZXIC_UINT32 smmu0_int2_mask17; + ZXIC_UINT32 smmu0_int2_mask16; + ZXIC_UINT32 smmu0_int2_mask15; + ZXIC_UINT32 smmu0_int2_mask14; + ZXIC_UINT32 smmu0_int2_mask13; + ZXIC_UINT32 smmu0_int2_mask12; + ZXIC_UINT32 smmu0_int2_mask11; + ZXIC_UINT32 smmu0_int2_mask10; + ZXIC_UINT32 smmu0_int2_mask9; + ZXIC_UINT32 smmu0_int2_mask8; + ZXIC_UINT32 smmu0_int2_mask7; + ZXIC_UINT32 smmu0_int2_mask6; + ZXIC_UINT32 smmu0_int2_mask5; + ZXIC_UINT32 smmu0_int2_mask4; + ZXIC_UINT32 smmu0_int2_mask3; + ZXIC_UINT32 smmu0_int2_mask2; + ZXIC_UINT32 smmu0_int2_mask1; + ZXIC_UINT32 smmu0_int2_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT2_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int2_status_t +{ + ZXIC_UINT32 smmu0_int2_status31; + ZXIC_UINT32 smmu0_int2_status30; + ZXIC_UINT32 smmu0_int2_status29; + ZXIC_UINT32 smmu0_int2_status28; + ZXIC_UINT32 smmu0_int2_status27; + ZXIC_UINT32 smmu0_int2_status26; + ZXIC_UINT32 smmu0_int2_status25; + ZXIC_UINT32 smmu0_int2_status24; + ZXIC_UINT32 smmu0_int2_status23; + ZXIC_UINT32 smmu0_int2_status22; + ZXIC_UINT32 smmu0_int2_status21; + ZXIC_UINT32 smmu0_int2_status20; + ZXIC_UINT32 smmu0_int2_status19; + ZXIC_UINT32 smmu0_int2_status18; + ZXIC_UINT32 smmu0_int2_status17; + ZXIC_UINT32 smmu0_int2_status16; + ZXIC_UINT32 smmu0_int2_status15; + ZXIC_UINT32 smmu0_int2_status14; + ZXIC_UINT32 smmu0_int2_status13; + ZXIC_UINT32 smmu0_int2_status12; + ZXIC_UINT32 smmu0_int2_status11; + ZXIC_UINT32 smmu0_int2_status10; + ZXIC_UINT32 smmu0_int2_status9; + ZXIC_UINT32 smmu0_int2_status8; + ZXIC_UINT32 smmu0_int2_status7; + ZXIC_UINT32 smmu0_int2_status6; + ZXIC_UINT32 smmu0_int2_status5; + ZXIC_UINT32 smmu0_int2_status4; + ZXIC_UINT32 smmu0_int2_status3; + ZXIC_UINT32 smmu0_int2_status2; + ZXIC_UINT32 smmu0_int2_status1; + ZXIC_UINT32 smmu0_int2_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT2_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int3_en_t +{ + ZXIC_UINT32 smmu0_int3_en31; + ZXIC_UINT32 smmu0_int3_en30; + ZXIC_UINT32 smmu0_int3_en29; + ZXIC_UINT32 smmu0_int3_en28; + ZXIC_UINT32 smmu0_int3_en27; + ZXIC_UINT32 smmu0_int3_en26; + ZXIC_UINT32 smmu0_int3_en25; + ZXIC_UINT32 smmu0_int3_en24; + ZXIC_UINT32 smmu0_int3_en23; + ZXIC_UINT32 smmu0_int3_en22; + ZXIC_UINT32 smmu0_int3_en21; + ZXIC_UINT32 smmu0_int3_en20; + ZXIC_UINT32 smmu0_int3_en19; + ZXIC_UINT32 smmu0_int3_en18; + ZXIC_UINT32 smmu0_int3_en17; + ZXIC_UINT32 smmu0_int3_en16; + ZXIC_UINT32 smmu0_int3_en15; + ZXIC_UINT32 smmu0_int3_en14; + ZXIC_UINT32 smmu0_int3_en13; + ZXIC_UINT32 smmu0_int3_en12; + ZXIC_UINT32 smmu0_int3_en11; + ZXIC_UINT32 smmu0_int3_en10; + ZXIC_UINT32 smmu0_int3_en9; + ZXIC_UINT32 smmu0_int3_en8; + ZXIC_UINT32 smmu0_int3_en7; + ZXIC_UINT32 smmu0_int3_en6; + ZXIC_UINT32 smmu0_int3_en5; + ZXIC_UINT32 smmu0_int3_en4; + ZXIC_UINT32 smmu0_int3_en3; + ZXIC_UINT32 smmu0_int3_en2; + ZXIC_UINT32 smmu0_int3_en1; + ZXIC_UINT32 smmu0_int3_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT3_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int3_mask_t +{ + ZXIC_UINT32 smmu0_int3_mask31; + ZXIC_UINT32 smmu0_int3_mask30; + ZXIC_UINT32 smmu0_int3_mask29; + ZXIC_UINT32 smmu0_int3_mask28; + ZXIC_UINT32 smmu0_int3_mask27; + ZXIC_UINT32 smmu0_int3_mask26; + ZXIC_UINT32 smmu0_int3_mask25; + ZXIC_UINT32 smmu0_int3_mask24; + ZXIC_UINT32 smmu0_int3_mask23; + ZXIC_UINT32 smmu0_int3_mask22; + ZXIC_UINT32 smmu0_int3_mask21; + ZXIC_UINT32 smmu0_int3_mask20; + ZXIC_UINT32 smmu0_int3_mask19; + ZXIC_UINT32 smmu0_int3_mask18; + ZXIC_UINT32 smmu0_int3_mask17; + ZXIC_UINT32 smmu0_int3_mask16; + ZXIC_UINT32 smmu0_int3_mask15; + ZXIC_UINT32 smmu0_int3_mask14; + ZXIC_UINT32 smmu0_int3_mask13; + ZXIC_UINT32 smmu0_int3_mask12; + ZXIC_UINT32 smmu0_int3_mask11; + ZXIC_UINT32 smmu0_int3_mask10; + ZXIC_UINT32 smmu0_int3_mask9; + ZXIC_UINT32 smmu0_int3_mask8; + ZXIC_UINT32 smmu0_int3_mask7; + ZXIC_UINT32 smmu0_int3_mask6; + ZXIC_UINT32 smmu0_int3_mask5; + ZXIC_UINT32 smmu0_int3_mask4; + ZXIC_UINT32 smmu0_int3_mask3; + ZXIC_UINT32 smmu0_int3_mask2; + ZXIC_UINT32 smmu0_int3_mask1; + ZXIC_UINT32 smmu0_int3_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT3_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int3_status_t +{ + ZXIC_UINT32 smmu0_int3_status31; + ZXIC_UINT32 smmu0_int3_status30; + ZXIC_UINT32 smmu0_int3_status29; + ZXIC_UINT32 smmu0_int3_status28; + ZXIC_UINT32 smmu0_int3_status27; + ZXIC_UINT32 smmu0_int3_status26; + ZXIC_UINT32 smmu0_int3_status25; + ZXIC_UINT32 smmu0_int3_status24; + ZXIC_UINT32 smmu0_int3_status23; + ZXIC_UINT32 smmu0_int3_status22; + ZXIC_UINT32 smmu0_int3_status21; + ZXIC_UINT32 smmu0_int3_status20; + ZXIC_UINT32 smmu0_int3_status19; + ZXIC_UINT32 smmu0_int3_status18; + ZXIC_UINT32 smmu0_int3_status17; + ZXIC_UINT32 smmu0_int3_status16; + ZXIC_UINT32 smmu0_int3_status15; + ZXIC_UINT32 smmu0_int3_status14; + ZXIC_UINT32 smmu0_int3_status13; + ZXIC_UINT32 smmu0_int3_status12; + ZXIC_UINT32 smmu0_int3_status11; + ZXIC_UINT32 smmu0_int3_status10; + ZXIC_UINT32 smmu0_int3_status9; + ZXIC_UINT32 smmu0_int3_status8; + ZXIC_UINT32 smmu0_int3_status7; + ZXIC_UINT32 smmu0_int3_status6; + ZXIC_UINT32 smmu0_int3_status5; + ZXIC_UINT32 smmu0_int3_status4; + ZXIC_UINT32 smmu0_int3_status3; + ZXIC_UINT32 smmu0_int3_status2; + ZXIC_UINT32 smmu0_int3_status1; + ZXIC_UINT32 smmu0_int3_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT3_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int4_en_t +{ + ZXIC_UINT32 smmu0_int4_en31; + ZXIC_UINT32 smmu0_int4_en30; + ZXIC_UINT32 smmu0_int4_en29; + ZXIC_UINT32 smmu0_int4_en28; + ZXIC_UINT32 smmu0_int4_en27; + ZXIC_UINT32 smmu0_int4_en26; + ZXIC_UINT32 smmu0_int4_en25; + ZXIC_UINT32 smmu0_int4_en24; + ZXIC_UINT32 smmu0_int4_en23; + ZXIC_UINT32 smmu0_int4_en22; + ZXIC_UINT32 smmu0_int4_en21; + ZXIC_UINT32 smmu0_int4_en20; + ZXIC_UINT32 smmu0_int4_en19; + ZXIC_UINT32 smmu0_int4_en18; + ZXIC_UINT32 smmu0_int4_en17; + ZXIC_UINT32 smmu0_int4_en16; + ZXIC_UINT32 smmu0_int4_en15; + ZXIC_UINT32 smmu0_int4_en14; + ZXIC_UINT32 smmu0_int4_en13; + ZXIC_UINT32 smmu0_int4_en12; + ZXIC_UINT32 smmu0_int4_en11; + ZXIC_UINT32 smmu0_int4_en10; + ZXIC_UINT32 smmu0_int4_en9; + ZXIC_UINT32 smmu0_int4_en8; + ZXIC_UINT32 smmu0_int4_en7; + ZXIC_UINT32 smmu0_int4_en6; + ZXIC_UINT32 smmu0_int4_en5; + ZXIC_UINT32 smmu0_int4_en4; + ZXIC_UINT32 smmu0_int4_en3; + ZXIC_UINT32 smmu0_int4_en2; + ZXIC_UINT32 smmu0_int4_en1; + ZXIC_UINT32 smmu0_int4_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT4_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int4_mask_t +{ + ZXIC_UINT32 smmu0_int4_mask31; + ZXIC_UINT32 smmu0_int4_mask30; + ZXIC_UINT32 smmu0_int4_mask29; + ZXIC_UINT32 smmu0_int4_mask28; + ZXIC_UINT32 smmu0_int4_mask27; + ZXIC_UINT32 smmu0_int4_mask26; + ZXIC_UINT32 smmu0_int4_mask25; + ZXIC_UINT32 smmu0_int4_mask24; + ZXIC_UINT32 smmu0_int4_mask23; + ZXIC_UINT32 smmu0_int4_mask22; + ZXIC_UINT32 smmu0_int4_mask21; + ZXIC_UINT32 smmu0_int4_mask20; + ZXIC_UINT32 smmu0_int4_mask19; + ZXIC_UINT32 smmu0_int4_mask18; + ZXIC_UINT32 smmu0_int4_mask17; + ZXIC_UINT32 smmu0_int4_mask16; + ZXIC_UINT32 smmu0_int4_mask15; + ZXIC_UINT32 smmu0_int4_mask14; + ZXIC_UINT32 smmu0_int4_mask13; + ZXIC_UINT32 smmu0_int4_mask12; + ZXIC_UINT32 smmu0_int4_mask11; + ZXIC_UINT32 smmu0_int4_mask10; + ZXIC_UINT32 smmu0_int4_mask9; + ZXIC_UINT32 smmu0_int4_mask8; + ZXIC_UINT32 smmu0_int4_mask7; + ZXIC_UINT32 smmu0_int4_mask6; + ZXIC_UINT32 smmu0_int4_mask5; + ZXIC_UINT32 smmu0_int4_mask4; + ZXIC_UINT32 smmu0_int4_mask3; + ZXIC_UINT32 smmu0_int4_mask2; + ZXIC_UINT32 smmu0_int4_mask1; + ZXIC_UINT32 smmu0_int4_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT4_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int4_status_t +{ + ZXIC_UINT32 smmu0_int4_status31; + ZXIC_UINT32 smmu0_int4_status30; + ZXIC_UINT32 smmu0_int4_status29; + ZXIC_UINT32 smmu0_int4_status28; + ZXIC_UINT32 smmu0_int4_status27; + ZXIC_UINT32 smmu0_int4_status26; + ZXIC_UINT32 smmu0_int4_status25; + ZXIC_UINT32 smmu0_int4_status24; + ZXIC_UINT32 smmu0_int4_status23; + ZXIC_UINT32 smmu0_int4_status22; + ZXIC_UINT32 smmu0_int4_status21; + ZXIC_UINT32 smmu0_int4_status20; + ZXIC_UINT32 smmu0_int4_status19; + ZXIC_UINT32 smmu0_int4_status18; + ZXIC_UINT32 smmu0_int4_status17; + ZXIC_UINT32 smmu0_int4_status16; + ZXIC_UINT32 smmu0_int4_status15; + ZXIC_UINT32 smmu0_int4_status14; + ZXIC_UINT32 smmu0_int4_status13; + ZXIC_UINT32 smmu0_int4_status12; + ZXIC_UINT32 smmu0_int4_status11; + ZXIC_UINT32 smmu0_int4_status10; + ZXIC_UINT32 smmu0_int4_status9; + ZXIC_UINT32 smmu0_int4_status8; + ZXIC_UINT32 smmu0_int4_status7; + ZXIC_UINT32 smmu0_int4_status6; + ZXIC_UINT32 smmu0_int4_status5; + ZXIC_UINT32 smmu0_int4_status4; + ZXIC_UINT32 smmu0_int4_status3; + ZXIC_UINT32 smmu0_int4_status2; + ZXIC_UINT32 smmu0_int4_status1; + ZXIC_UINT32 smmu0_int4_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT4_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int5_en_t +{ + ZXIC_UINT32 smmu0_int5_en31; + ZXIC_UINT32 smmu0_int5_en30; + ZXIC_UINT32 smmu0_int5_en29; + ZXIC_UINT32 smmu0_int5_en28; + ZXIC_UINT32 smmu0_int5_en27; + ZXIC_UINT32 smmu0_int5_en26; + ZXIC_UINT32 smmu0_int5_en25; + ZXIC_UINT32 smmu0_int5_en24; + ZXIC_UINT32 smmu0_int5_en23; + ZXIC_UINT32 smmu0_int5_en22; + ZXIC_UINT32 smmu0_int5_en21; + ZXIC_UINT32 smmu0_int5_en20; + ZXIC_UINT32 smmu0_int5_en19; + ZXIC_UINT32 smmu0_int5_en18; + ZXIC_UINT32 smmu0_int5_en17; + ZXIC_UINT32 smmu0_int5_en16; + ZXIC_UINT32 smmu0_int5_en15; + ZXIC_UINT32 smmu0_int5_en14; + ZXIC_UINT32 smmu0_int5_en13; + ZXIC_UINT32 smmu0_int5_en12; + ZXIC_UINT32 smmu0_int5_en11; + ZXIC_UINT32 smmu0_int5_en10; + ZXIC_UINT32 smmu0_int5_en9; + ZXIC_UINT32 smmu0_int5_en8; + ZXIC_UINT32 smmu0_int5_en7; + ZXIC_UINT32 smmu0_int5_en6; + ZXIC_UINT32 smmu0_int5_en5; + ZXIC_UINT32 smmu0_int5_en4; + ZXIC_UINT32 smmu0_int5_en3; + ZXIC_UINT32 smmu0_int5_en2; + ZXIC_UINT32 smmu0_int5_en1; + ZXIC_UINT32 smmu0_int5_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT5_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int5_mask_t +{ + ZXIC_UINT32 smmu0_int5_mask31; + ZXIC_UINT32 smmu0_int5_mask30; + ZXIC_UINT32 smmu0_int5_mask29; + ZXIC_UINT32 smmu0_int5_mask28; + ZXIC_UINT32 smmu0_int5_mask27; + ZXIC_UINT32 smmu0_int5_mask26; + ZXIC_UINT32 smmu0_int5_mask25; + ZXIC_UINT32 smmu0_int5_mask24; + ZXIC_UINT32 smmu0_int5_mask23; + ZXIC_UINT32 smmu0_int5_mask22; + ZXIC_UINT32 smmu0_int5_mask21; + ZXIC_UINT32 smmu0_int5_mask20; + ZXIC_UINT32 smmu0_int5_mask19; + ZXIC_UINT32 smmu0_int5_mask18; + ZXIC_UINT32 smmu0_int5_mask17; + ZXIC_UINT32 smmu0_int5_mask16; + ZXIC_UINT32 smmu0_int5_mask15; + ZXIC_UINT32 smmu0_int5_mask14; + ZXIC_UINT32 smmu0_int5_mask13; + ZXIC_UINT32 smmu0_int5_mask12; + ZXIC_UINT32 smmu0_int5_mask11; + ZXIC_UINT32 smmu0_int5_mask10; + ZXIC_UINT32 smmu0_int5_mask9; + ZXIC_UINT32 smmu0_int5_mask8; + ZXIC_UINT32 smmu0_int5_mask7; + ZXIC_UINT32 smmu0_int5_mask6; + ZXIC_UINT32 smmu0_int5_mask5; + ZXIC_UINT32 smmu0_int5_mask4; + ZXIC_UINT32 smmu0_int5_mask3; + ZXIC_UINT32 smmu0_int5_mask2; + ZXIC_UINT32 smmu0_int5_mask1; + ZXIC_UINT32 smmu0_int5_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT5_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int5_status_t +{ + ZXIC_UINT32 smmu0_int5_status31; + ZXIC_UINT32 smmu0_int5_status30; + ZXIC_UINT32 smmu0_int5_status29; + ZXIC_UINT32 smmu0_int5_status28; + ZXIC_UINT32 smmu0_int5_status27; + ZXIC_UINT32 smmu0_int5_status26; + ZXIC_UINT32 smmu0_int5_status25; + ZXIC_UINT32 smmu0_int5_status24; + ZXIC_UINT32 smmu0_int5_status23; + ZXIC_UINT32 smmu0_int5_status22; + ZXIC_UINT32 smmu0_int5_status21; + ZXIC_UINT32 smmu0_int5_status20; + ZXIC_UINT32 smmu0_int5_status19; + ZXIC_UINT32 smmu0_int5_status18; + ZXIC_UINT32 smmu0_int5_status17; + ZXIC_UINT32 smmu0_int5_status16; + ZXIC_UINT32 smmu0_int5_status15; + ZXIC_UINT32 smmu0_int5_status14; + ZXIC_UINT32 smmu0_int5_status13; + ZXIC_UINT32 smmu0_int5_status12; + ZXIC_UINT32 smmu0_int5_status11; + ZXIC_UINT32 smmu0_int5_status10; + ZXIC_UINT32 smmu0_int5_status9; + ZXIC_UINT32 smmu0_int5_status8; + ZXIC_UINT32 smmu0_int5_status7; + ZXIC_UINT32 smmu0_int5_status6; + ZXIC_UINT32 smmu0_int5_status5; + ZXIC_UINT32 smmu0_int5_status4; + ZXIC_UINT32 smmu0_int5_status3; + ZXIC_UINT32 smmu0_int5_status2; + ZXIC_UINT32 smmu0_int5_status1; + ZXIC_UINT32 smmu0_int5_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT5_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int6_en_t +{ + ZXIC_UINT32 smmu0_int6_en31; + ZXIC_UINT32 smmu0_int6_en30; + ZXIC_UINT32 smmu0_int6_en29; + ZXIC_UINT32 smmu0_int6_en28; + ZXIC_UINT32 smmu0_int6_en27; + ZXIC_UINT32 smmu0_int6_en26; + ZXIC_UINT32 smmu0_int6_en25; + ZXIC_UINT32 smmu0_int6_en24; + ZXIC_UINT32 smmu0_int6_en23; + ZXIC_UINT32 smmu0_int6_en22; + ZXIC_UINT32 smmu0_int6_en21; + ZXIC_UINT32 smmu0_int6_en20; + ZXIC_UINT32 smmu0_int6_en19; + ZXIC_UINT32 smmu0_int6_en18; + ZXIC_UINT32 smmu0_int6_en17; + ZXIC_UINT32 smmu0_int6_en16; + ZXIC_UINT32 smmu0_int6_en15; + ZXIC_UINT32 smmu0_int6_en14; + ZXIC_UINT32 smmu0_int6_en13; + ZXIC_UINT32 smmu0_int6_en12; + ZXIC_UINT32 smmu0_int6_en11; + ZXIC_UINT32 smmu0_int6_en10; + ZXIC_UINT32 smmu0_int6_en9; + ZXIC_UINT32 smmu0_int6_en8; + ZXIC_UINT32 smmu0_int6_en7; + ZXIC_UINT32 smmu0_int6_en6; + ZXIC_UINT32 smmu0_int6_en5; + ZXIC_UINT32 smmu0_int6_en4; + ZXIC_UINT32 smmu0_int6_en3; + ZXIC_UINT32 smmu0_int6_en2; + ZXIC_UINT32 smmu0_int6_en1; + ZXIC_UINT32 smmu0_int6_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT6_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int6_mask_t +{ + ZXIC_UINT32 smmu0_int6_mask31; + ZXIC_UINT32 smmu0_int6_mask30; + ZXIC_UINT32 smmu0_int6_mask29; + ZXIC_UINT32 smmu0_int6_mask28; + ZXIC_UINT32 smmu0_int6_mask27; + ZXIC_UINT32 smmu0_int6_mask26; + ZXIC_UINT32 smmu0_int6_mask25; + ZXIC_UINT32 smmu0_int6_mask24; + ZXIC_UINT32 smmu0_int6_mask23; + ZXIC_UINT32 smmu0_int6_mask22; + ZXIC_UINT32 smmu0_int6_mask21; + ZXIC_UINT32 smmu0_int6_mask20; + ZXIC_UINT32 smmu0_int6_mask19; + ZXIC_UINT32 smmu0_int6_mask18; + ZXIC_UINT32 smmu0_int6_mask17; + ZXIC_UINT32 smmu0_int6_mask16; + ZXIC_UINT32 smmu0_int6_mask15; + ZXIC_UINT32 smmu0_int6_mask14; + ZXIC_UINT32 smmu0_int6_mask13; + ZXIC_UINT32 smmu0_int6_mask12; + ZXIC_UINT32 smmu0_int6_mask11; + ZXIC_UINT32 smmu0_int6_mask10; + ZXIC_UINT32 smmu0_int6_mask9; + ZXIC_UINT32 smmu0_int6_mask8; + ZXIC_UINT32 smmu0_int6_mask7; + ZXIC_UINT32 smmu0_int6_mask6; + ZXIC_UINT32 smmu0_int6_mask5; + ZXIC_UINT32 smmu0_int6_mask4; + ZXIC_UINT32 smmu0_int6_mask3; + ZXIC_UINT32 smmu0_int6_mask2; + ZXIC_UINT32 smmu0_int6_mask1; + ZXIC_UINT32 smmu0_int6_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT6_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int6_status_t +{ + ZXIC_UINT32 smmu0_int6_status31; + ZXIC_UINT32 smmu0_int6_status30; + ZXIC_UINT32 smmu0_int6_status29; + ZXIC_UINT32 smmu0_int6_status28; + ZXIC_UINT32 smmu0_int6_status27; + ZXIC_UINT32 smmu0_int6_status26; + ZXIC_UINT32 smmu0_int6_status25; + ZXIC_UINT32 smmu0_int6_status24; + ZXIC_UINT32 smmu0_int6_status23; + ZXIC_UINT32 smmu0_int6_status22; + ZXIC_UINT32 smmu0_int6_status21; + ZXIC_UINT32 smmu0_int6_status20; + ZXIC_UINT32 smmu0_int6_status19; + ZXIC_UINT32 smmu0_int6_status18; + ZXIC_UINT32 smmu0_int6_status17; + ZXIC_UINT32 smmu0_int6_status16; + ZXIC_UINT32 smmu0_int6_status15; + ZXIC_UINT32 smmu0_int6_status14; + ZXIC_UINT32 smmu0_int6_status13; + ZXIC_UINT32 smmu0_int6_status12; + ZXIC_UINT32 smmu0_int6_status11; + ZXIC_UINT32 smmu0_int6_status10; + ZXIC_UINT32 smmu0_int6_status9; + ZXIC_UINT32 smmu0_int6_status8; + ZXIC_UINT32 smmu0_int6_status7; + ZXIC_UINT32 smmu0_int6_status6; + ZXIC_UINT32 smmu0_int6_status5; + ZXIC_UINT32 smmu0_int6_status4; + ZXIC_UINT32 smmu0_int6_status3; + ZXIC_UINT32 smmu0_int6_status2; + ZXIC_UINT32 smmu0_int6_status1; + ZXIC_UINT32 smmu0_int6_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT6_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int7_en_t +{ + ZXIC_UINT32 smmu0_int7_en31; + ZXIC_UINT32 smmu0_int7_en30; + ZXIC_UINT32 smmu0_int7_en29; + ZXIC_UINT32 smmu0_int7_en28; + ZXIC_UINT32 smmu0_int7_en27; + ZXIC_UINT32 smmu0_int7_en26; + ZXIC_UINT32 smmu0_int7_en25; + ZXIC_UINT32 smmu0_int7_en24; + ZXIC_UINT32 smmu0_int7_en23; + ZXIC_UINT32 smmu0_int7_en22; + ZXIC_UINT32 smmu0_int7_en21; + ZXIC_UINT32 smmu0_int7_en20; + ZXIC_UINT32 smmu0_int7_en19; + ZXIC_UINT32 smmu0_int7_en18; + ZXIC_UINT32 smmu0_int7_en17; + ZXIC_UINT32 smmu0_int7_en16; + ZXIC_UINT32 smmu0_int7_en15; + ZXIC_UINT32 smmu0_int7_en14; + ZXIC_UINT32 smmu0_int7_en13; + ZXIC_UINT32 smmu0_int7_en12; + ZXIC_UINT32 smmu0_int7_en11; + ZXIC_UINT32 smmu0_int7_en10; + ZXIC_UINT32 smmu0_int7_en9; + ZXIC_UINT32 smmu0_int7_en8; + ZXIC_UINT32 smmu0_int7_en7; + ZXIC_UINT32 smmu0_int7_en6; + ZXIC_UINT32 smmu0_int7_en5; + ZXIC_UINT32 smmu0_int7_en4; + ZXIC_UINT32 smmu0_int7_en3; + ZXIC_UINT32 smmu0_int7_en2; + ZXIC_UINT32 smmu0_int7_en1; + ZXIC_UINT32 smmu0_int7_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT7_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int7_mask_t +{ + ZXIC_UINT32 smmu0_int7_mask31; + ZXIC_UINT32 smmu0_int7_mask30; + ZXIC_UINT32 smmu0_int7_mask29; + ZXIC_UINT32 smmu0_int7_mask28; + ZXIC_UINT32 smmu0_int7_mask27; + ZXIC_UINT32 smmu0_int7_mask26; + ZXIC_UINT32 smmu0_int7_mask25; + ZXIC_UINT32 smmu0_int7_mask24; + ZXIC_UINT32 smmu0_int7_mask23; + ZXIC_UINT32 smmu0_int7_mask22; + ZXIC_UINT32 smmu0_int7_mask21; + ZXIC_UINT32 smmu0_int7_mask20; + ZXIC_UINT32 smmu0_int7_mask19; + ZXIC_UINT32 smmu0_int7_mask18; + ZXIC_UINT32 smmu0_int7_mask17; + ZXIC_UINT32 smmu0_int7_mask16; + ZXIC_UINT32 smmu0_int7_mask15; + ZXIC_UINT32 smmu0_int7_mask14; + ZXIC_UINT32 smmu0_int7_mask13; + ZXIC_UINT32 smmu0_int7_mask12; + ZXIC_UINT32 smmu0_int7_mask11; + ZXIC_UINT32 smmu0_int7_mask10; + ZXIC_UINT32 smmu0_int7_mask9; + ZXIC_UINT32 smmu0_int7_mask8; + ZXIC_UINT32 smmu0_int7_mask7; + ZXIC_UINT32 smmu0_int7_mask6; + ZXIC_UINT32 smmu0_int7_mask5; + ZXIC_UINT32 smmu0_int7_mask4; + ZXIC_UINT32 smmu0_int7_mask3; + ZXIC_UINT32 smmu0_int7_mask2; + ZXIC_UINT32 smmu0_int7_mask1; + ZXIC_UINT32 smmu0_int7_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT7_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int7_status_t +{ + ZXIC_UINT32 smmu0_int7_status31; + ZXIC_UINT32 smmu0_int7_status30; + ZXIC_UINT32 smmu0_int7_status29; + ZXIC_UINT32 smmu0_int7_status28; + ZXIC_UINT32 smmu0_int7_status27; + ZXIC_UINT32 smmu0_int7_status26; + ZXIC_UINT32 smmu0_int7_status25; + ZXIC_UINT32 smmu0_int7_status24; + ZXIC_UINT32 smmu0_int7_status23; + ZXIC_UINT32 smmu0_int7_status22; + ZXIC_UINT32 smmu0_int7_status21; + ZXIC_UINT32 smmu0_int7_status20; + ZXIC_UINT32 smmu0_int7_status19; + ZXIC_UINT32 smmu0_int7_status18; + ZXIC_UINT32 smmu0_int7_status17; + ZXIC_UINT32 smmu0_int7_status16; + ZXIC_UINT32 smmu0_int7_status15; + ZXIC_UINT32 smmu0_int7_status14; + ZXIC_UINT32 smmu0_int7_status13; + ZXIC_UINT32 smmu0_int7_status12; + ZXIC_UINT32 smmu0_int7_status11; + ZXIC_UINT32 smmu0_int7_status10; + ZXIC_UINT32 smmu0_int7_status9; + ZXIC_UINT32 smmu0_int7_status8; + ZXIC_UINT32 smmu0_int7_status7; + ZXIC_UINT32 smmu0_int7_status6; + ZXIC_UINT32 smmu0_int7_status5; + ZXIC_UINT32 smmu0_int7_status4; + ZXIC_UINT32 smmu0_int7_status3; + ZXIC_UINT32 smmu0_int7_status2; + ZXIC_UINT32 smmu0_int7_status1; + ZXIC_UINT32 smmu0_int7_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT7_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int8_en_t +{ + ZXIC_UINT32 smmu0_int8_en31; + ZXIC_UINT32 smmu0_int8_en30; + ZXIC_UINT32 smmu0_int8_en29; + ZXIC_UINT32 smmu0_int8_en28; + ZXIC_UINT32 smmu0_int8_en27; + ZXIC_UINT32 smmu0_int8_en26; + ZXIC_UINT32 smmu0_int8_en25; + ZXIC_UINT32 smmu0_int8_en24; + ZXIC_UINT32 smmu0_int8_en23; + ZXIC_UINT32 smmu0_int8_en22; + ZXIC_UINT32 smmu0_int8_en21; + ZXIC_UINT32 smmu0_int8_en20; + ZXIC_UINT32 smmu0_int8_en19; + ZXIC_UINT32 smmu0_int8_en18; + ZXIC_UINT32 smmu0_int8_en17; + ZXIC_UINT32 smmu0_int8_en16; + ZXIC_UINT32 smmu0_int8_en15; + ZXIC_UINT32 smmu0_int8_en14; + ZXIC_UINT32 smmu0_int8_en13; + ZXIC_UINT32 smmu0_int8_en12; + ZXIC_UINT32 smmu0_int8_en11; + ZXIC_UINT32 smmu0_int8_en10; + ZXIC_UINT32 smmu0_int8_en9; + ZXIC_UINT32 smmu0_int8_en8; + ZXIC_UINT32 smmu0_int8_en7; + ZXIC_UINT32 smmu0_int8_en6; + ZXIC_UINT32 smmu0_int8_en5; + ZXIC_UINT32 smmu0_int8_en4; + ZXIC_UINT32 smmu0_int8_en3; + ZXIC_UINT32 smmu0_int8_en2; + ZXIC_UINT32 smmu0_int8_en1; + ZXIC_UINT32 smmu0_int8_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT8_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int8_mask_t +{ + ZXIC_UINT32 smmu0_int8_mask31; + ZXIC_UINT32 smmu0_int8_mask30; + ZXIC_UINT32 smmu0_int8_mask29; + ZXIC_UINT32 smmu0_int8_mask28; + ZXIC_UINT32 smmu0_int8_mask27; + ZXIC_UINT32 smmu0_int8_mask26; + ZXIC_UINT32 smmu0_int8_mask25; + ZXIC_UINT32 smmu0_int8_mask24; + ZXIC_UINT32 smmu0_int8_mask23; + ZXIC_UINT32 smmu0_int8_mask22; + ZXIC_UINT32 smmu0_int8_mask21; + ZXIC_UINT32 smmu0_int8_mask20; + ZXIC_UINT32 smmu0_int8_mask19; + ZXIC_UINT32 smmu0_int8_mask18; + ZXIC_UINT32 smmu0_int8_mask17; + ZXIC_UINT32 smmu0_int8_mask16; + ZXIC_UINT32 smmu0_int8_mask15; + ZXIC_UINT32 smmu0_int8_mask14; + ZXIC_UINT32 smmu0_int8_mask13; + ZXIC_UINT32 smmu0_int8_mask12; + ZXIC_UINT32 smmu0_int8_mask11; + ZXIC_UINT32 smmu0_int8_mask10; + ZXIC_UINT32 smmu0_int8_mask9; + ZXIC_UINT32 smmu0_int8_mask8; + ZXIC_UINT32 smmu0_int8_mask7; + ZXIC_UINT32 smmu0_int8_mask6; + ZXIC_UINT32 smmu0_int8_mask5; + ZXIC_UINT32 smmu0_int8_mask4; + ZXIC_UINT32 smmu0_int8_mask3; + ZXIC_UINT32 smmu0_int8_mask2; + ZXIC_UINT32 smmu0_int8_mask1; + ZXIC_UINT32 smmu0_int8_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT8_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int8_status_t +{ + ZXIC_UINT32 smmu0_int8_status31; + ZXIC_UINT32 smmu0_int8_status30; + ZXIC_UINT32 smmu0_int8_status29; + ZXIC_UINT32 smmu0_int8_status28; + ZXIC_UINT32 smmu0_int8_status27; + ZXIC_UINT32 smmu0_int8_status26; + ZXIC_UINT32 smmu0_int8_status25; + ZXIC_UINT32 smmu0_int8_status24; + ZXIC_UINT32 smmu0_int8_status23; + ZXIC_UINT32 smmu0_int8_status22; + ZXIC_UINT32 smmu0_int8_status21; + ZXIC_UINT32 smmu0_int8_status20; + ZXIC_UINT32 smmu0_int8_status19; + ZXIC_UINT32 smmu0_int8_status18; + ZXIC_UINT32 smmu0_int8_status17; + ZXIC_UINT32 smmu0_int8_status16; + ZXIC_UINT32 smmu0_int8_status15; + ZXIC_UINT32 smmu0_int8_status14; + ZXIC_UINT32 smmu0_int8_status13; + ZXIC_UINT32 smmu0_int8_status12; + ZXIC_UINT32 smmu0_int8_status11; + ZXIC_UINT32 smmu0_int8_status10; + ZXIC_UINT32 smmu0_int8_status9; + ZXIC_UINT32 smmu0_int8_status8; + ZXIC_UINT32 smmu0_int8_status7; + ZXIC_UINT32 smmu0_int8_status6; + ZXIC_UINT32 smmu0_int8_status5; + ZXIC_UINT32 smmu0_int8_status4; + ZXIC_UINT32 smmu0_int8_status3; + ZXIC_UINT32 smmu0_int8_status2; + ZXIC_UINT32 smmu0_int8_status1; + ZXIC_UINT32 smmu0_int8_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT8_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int9_en_t +{ + ZXIC_UINT32 smmu0_int8_en31; + ZXIC_UINT32 smmu0_int8_en30; + ZXIC_UINT32 smmu0_int8_en29; + ZXIC_UINT32 smmu0_int8_en28; + ZXIC_UINT32 smmu0_int8_en27; + ZXIC_UINT32 smmu0_int8_en26; + ZXIC_UINT32 smmu0_int8_en25; + ZXIC_UINT32 smmu0_int8_en24; + ZXIC_UINT32 smmu0_int8_en23; + ZXIC_UINT32 smmu0_int8_en22; + ZXIC_UINT32 smmu0_int8_en21; + ZXIC_UINT32 smmu0_int8_en20; + ZXIC_UINT32 smmu0_int9_en19; + ZXIC_UINT32 smmu0_int9_en18; + ZXIC_UINT32 smmu0_int9_en17; + ZXIC_UINT32 smmu0_int9_en16; + ZXIC_UINT32 smmu0_int9_en15; + ZXIC_UINT32 smmu0_int9_en14; + ZXIC_UINT32 smmu0_int9_en13; + ZXIC_UINT32 smmu0_int9_en12; + ZXIC_UINT32 smmu0_int9_en11; + ZXIC_UINT32 smmu0_int9_en10; + ZXIC_UINT32 smmu0_int9_en9; + ZXIC_UINT32 smmu0_int9_en8; + ZXIC_UINT32 smmu0_int9_en7; + ZXIC_UINT32 smmu0_int9_en6; + ZXIC_UINT32 smmu0_int9_en5; + ZXIC_UINT32 smmu0_int9_en4; + ZXIC_UINT32 smmu0_int9_en3; + ZXIC_UINT32 smmu0_int9_en2; + ZXIC_UINT32 smmu0_int9_en1; + ZXIC_UINT32 smmu0_int9_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT9_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int9_mask_t +{ + ZXIC_UINT32 smmu0_int9_mask0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT9_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int9_status_t +{ + ZXIC_UINT32 smmu0_int9_status0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT9_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int10_en_t +{ + ZXIC_UINT32 smmu0_int10_en31; + ZXIC_UINT32 smmu0_int10_en30; + ZXIC_UINT32 smmu0_int10_en29; + ZXIC_UINT32 smmu0_int10_en28; + ZXIC_UINT32 smmu0_int10_en27; + ZXIC_UINT32 smmu0_int10_en26; + ZXIC_UINT32 smmu0_int10_en25; + ZXIC_UINT32 smmu0_int10_en24; + ZXIC_UINT32 smmu0_int10_en23; + ZXIC_UINT32 smmu0_int10_en22; + ZXIC_UINT32 smmu0_int10_en21; + ZXIC_UINT32 smmu0_int10_en20; + ZXIC_UINT32 smmu0_int10_en19; + ZXIC_UINT32 smmu0_int10_en18; + ZXIC_UINT32 smmu0_int10_en17; + ZXIC_UINT32 smmu0_int10_en16; + ZXIC_UINT32 smmu0_int10_en15; + ZXIC_UINT32 smmu0_int10_en14; + ZXIC_UINT32 smmu0_int10_en13; + ZXIC_UINT32 smmu0_int10_en12; + ZXIC_UINT32 smmu0_int10_en11; + ZXIC_UINT32 smmu0_int10_en10; + ZXIC_UINT32 smmu0_int10_en9; + ZXIC_UINT32 smmu0_int10_en8; + ZXIC_UINT32 smmu0_int10_en7; + ZXIC_UINT32 smmu0_int10_en6; + ZXIC_UINT32 smmu0_int10_en5; + ZXIC_UINT32 smmu0_int10_en4; + ZXIC_UINT32 smmu0_int10_en3; + ZXIC_UINT32 smmu0_int10_en2; + ZXIC_UINT32 smmu0_int10_en1; + ZXIC_UINT32 smmu0_int10_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT10_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int10_mask_t +{ + ZXIC_UINT32 smmu0_int10_mask0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT10_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int10_status_t +{ + ZXIC_UINT32 smmu0_int10_status0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT10_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int11_en_t +{ + ZXIC_UINT32 smmu0_int11_en0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT11_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int11_mask_t +{ + ZXIC_UINT32 smmu0_int11_mask0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT11_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int11_status_t +{ + ZXIC_UINT32 smmu0_int11_status0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT11_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int12_en_t +{ + ZXIC_UINT32 smmu0_int12_en0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT12_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int12_mask_t +{ + ZXIC_UINT32 smmu0_int12_mask0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT12_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int12_status_t +{ + ZXIC_UINT32 smmu0_int12_status0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT12_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int13_en_t +{ + ZXIC_UINT32 smmu0_int13_en19; + ZXIC_UINT32 smmu0_int13_en18; + ZXIC_UINT32 smmu0_int13_en17; + ZXIC_UINT32 smmu0_int13_en16; + ZXIC_UINT32 smmu0_int13_en15; + ZXIC_UINT32 smmu0_int13_en14; + ZXIC_UINT32 smmu0_int13_en13; + ZXIC_UINT32 smmu0_int13_en12; + ZXIC_UINT32 smmu0_int13_en11; + ZXIC_UINT32 smmu0_int13_en10; + ZXIC_UINT32 smmu0_int13_en9; + ZXIC_UINT32 smmu0_int13_en8; + ZXIC_UINT32 smmu0_int13_en7; + ZXIC_UINT32 smmu0_int13_en6; + ZXIC_UINT32 smmu0_int13_en5; + ZXIC_UINT32 smmu0_int13_en4; + ZXIC_UINT32 smmu0_int13_en3; + ZXIC_UINT32 smmu0_int13_en2; + ZXIC_UINT32 smmu0_int13_en1; + ZXIC_UINT32 smmu0_int13_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT13_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int13_mask_t +{ + ZXIC_UINT32 smmu0_int13_mask19; + ZXIC_UINT32 smmu0_int13_mask18; + ZXIC_UINT32 smmu0_int13_mask17; + ZXIC_UINT32 smmu0_int13_mask16; + ZXIC_UINT32 smmu0_int13_mask15; + ZXIC_UINT32 smmu0_int13_mask14; + ZXIC_UINT32 smmu0_int13_mask13; + ZXIC_UINT32 smmu0_int13_mask12; + ZXIC_UINT32 smmu0_int13_mask11; + ZXIC_UINT32 smmu0_int13_mask10; + ZXIC_UINT32 smmu0_int13_mask9; + ZXIC_UINT32 smmu0_int13_mask8; + ZXIC_UINT32 smmu0_int13_mask7; + ZXIC_UINT32 smmu0_int13_mask6; + ZXIC_UINT32 smmu0_int13_mask5; + ZXIC_UINT32 smmu0_int13_mask4; + ZXIC_UINT32 smmu0_int13_mask3; + ZXIC_UINT32 smmu0_int13_mask2; + ZXIC_UINT32 smmu0_int13_mask1; + ZXIC_UINT32 smmu0_int13_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT13_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int13_status_t +{ + ZXIC_UINT32 smmu0_int13_status19; + ZXIC_UINT32 smmu0_int13_status18; + ZXIC_UINT32 smmu0_int13_status17; + ZXIC_UINT32 smmu0_int13_status16; + ZXIC_UINT32 smmu0_int13_status15; + ZXIC_UINT32 smmu0_int13_status14; + ZXIC_UINT32 smmu0_int13_status13; + ZXIC_UINT32 smmu0_int13_status12; + ZXIC_UINT32 smmu0_int13_status11; + ZXIC_UINT32 smmu0_int13_status10; + ZXIC_UINT32 smmu0_int13_status9; + ZXIC_UINT32 smmu0_int13_status8; + ZXIC_UINT32 smmu0_int13_status7; + ZXIC_UINT32 smmu0_int13_status6; + ZXIC_UINT32 smmu0_int13_status5; + ZXIC_UINT32 smmu0_int13_status4; + ZXIC_UINT32 smmu0_int13_status3; + ZXIC_UINT32 smmu0_int13_status2; + ZXIC_UINT32 smmu0_int13_status1; + ZXIC_UINT32 smmu0_int13_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT13_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int14_en_t +{ + ZXIC_UINT32 smmu0_int14_en16; + ZXIC_UINT32 smmu0_int14_en15; + ZXIC_UINT32 smmu0_int14_en14; + ZXIC_UINT32 smmu0_int14_en13; + ZXIC_UINT32 smmu0_int14_en12; + ZXIC_UINT32 smmu0_int14_en11; + ZXIC_UINT32 smmu0_int14_en10; + ZXIC_UINT32 smmu0_int14_en9; + ZXIC_UINT32 smmu0_int14_en8; + ZXIC_UINT32 smmu0_int14_en7; + ZXIC_UINT32 smmu0_int14_en6; + ZXIC_UINT32 smmu0_int14_en5; + ZXIC_UINT32 smmu0_int14_en4; + ZXIC_UINT32 smmu0_int14_en3; + ZXIC_UINT32 smmu0_int14_en2; + ZXIC_UINT32 smmu0_int14_en1; + ZXIC_UINT32 smmu0_int14_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT14_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int14_mask_t +{ + ZXIC_UINT32 smmu0_int14_mask16; + ZXIC_UINT32 smmu0_int14_mask15; + ZXIC_UINT32 smmu0_int14_mask14; + ZXIC_UINT32 smmu0_int14_mask13; + ZXIC_UINT32 smmu0_int14_mask12; + ZXIC_UINT32 smmu0_int14_mask11; + ZXIC_UINT32 smmu0_int14_mask10; + ZXIC_UINT32 smmu0_int14_mask9; + ZXIC_UINT32 smmu0_int14_mask8; + ZXIC_UINT32 smmu0_int14_mask7; + ZXIC_UINT32 smmu0_int14_mask6; + ZXIC_UINT32 smmu0_int14_mask5; + ZXIC_UINT32 smmu0_int14_mask4; + ZXIC_UINT32 smmu0_int14_mask3; + ZXIC_UINT32 smmu0_int14_mask2; + ZXIC_UINT32 smmu0_int14_mask1; + ZXIC_UINT32 smmu0_int14_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT14_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int14_status_t +{ + ZXIC_UINT32 smmu0_int14_status16; + ZXIC_UINT32 smmu0_int14_status15; + ZXIC_UINT32 smmu0_int14_status14; + ZXIC_UINT32 smmu0_int14_status13; + ZXIC_UINT32 smmu0_int14_status12; + ZXIC_UINT32 smmu0_int14_status11; + ZXIC_UINT32 smmu0_int14_status10; + ZXIC_UINT32 smmu0_int14_status9; + ZXIC_UINT32 smmu0_int14_status8; + ZXIC_UINT32 smmu0_int14_status7; + ZXIC_UINT32 smmu0_int14_status6; + ZXIC_UINT32 smmu0_int14_status5; + ZXIC_UINT32 smmu0_int14_status4; + ZXIC_UINT32 smmu0_int14_status3; + ZXIC_UINT32 smmu0_int14_status2; + ZXIC_UINT32 smmu0_int14_status1; + ZXIC_UINT32 smmu0_int14_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT14_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_ecc_unmask_flag_t +{ + ZXIC_UINT32 smmu0_int53_unmask_flag; + ZXIC_UINT32 smmu0_int52_unmask_flag; + ZXIC_UINT32 smmu0_int51_unmask_flag; + ZXIC_UINT32 smmu0_int50_unmask_flag; + ZXIC_UINT32 smmu0_int49_unmask_flag; + ZXIC_UINT32 smmu0_int48_unmask_flag; + ZXIC_UINT32 smmu0_int47_unmask_flag; + ZXIC_UINT32 smmu0_int46_unmask_flag; + ZXIC_UINT32 smmu0_int45_unmask_flag; + ZXIC_UINT32 smmu0_int44_unmask_flag; + ZXIC_UINT32 smmu0_int43_unmask_flag; + ZXIC_UINT32 smmu0_int42_unmask_flag; + ZXIC_UINT32 smmu0_int41_unmask_flag; + ZXIC_UINT32 smmu0_int40_unmask_flag; + ZXIC_UINT32 smmu0_int39_unmask_flag; + ZXIC_UINT32 smmu0_int38_unmask_flag; + ZXIC_UINT32 smmu0_int37_unmask_flag; + ZXIC_UINT32 smmu0_int36_unmask_flag; + ZXIC_UINT32 smmu0_int35_unmask_flag; + ZXIC_UINT32 smmu0_int34_unmask_flag; + ZXIC_UINT32 smmu0_int33_unmask_flag; + ZXIC_UINT32 smmu0_int32_unmask_flag; +}DPP_SMMU0_SMMU0_SMMU0_ECC_UNMASK_FLAG_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int15_en_t +{ + ZXIC_UINT32 smmu0_int15_en31; + ZXIC_UINT32 smmu0_int15_en30; + ZXIC_UINT32 smmu0_int15_en29; + ZXIC_UINT32 smmu0_int15_en28; + ZXIC_UINT32 smmu0_int15_en27; + ZXIC_UINT32 smmu0_int15_en26; + ZXIC_UINT32 smmu0_int15_en25; + ZXIC_UINT32 smmu0_int15_en24; + ZXIC_UINT32 smmu0_int15_en23; + ZXIC_UINT32 smmu0_int15_en22; + ZXIC_UINT32 smmu0_int15_en21; + ZXIC_UINT32 smmu0_int15_en20; + ZXIC_UINT32 smmu0_int15_en19; + ZXIC_UINT32 smmu0_int15_en18; + ZXIC_UINT32 smmu0_int15_en17; + ZXIC_UINT32 smmu0_int15_en16; + ZXIC_UINT32 smmu0_int15_en15; + ZXIC_UINT32 smmu0_int15_en14; + ZXIC_UINT32 smmu0_int15_en13; + ZXIC_UINT32 smmu0_int15_en12; + ZXIC_UINT32 smmu0_int15_en11; + ZXIC_UINT32 smmu0_int15_en10; + ZXIC_UINT32 smmu0_int15_en9; + ZXIC_UINT32 smmu0_int15_en8; + ZXIC_UINT32 smmu0_int15_en7; + ZXIC_UINT32 smmu0_int15_en6; + ZXIC_UINT32 smmu0_int15_en5; + ZXIC_UINT32 smmu0_int15_en4; + ZXIC_UINT32 smmu0_int15_en3; + ZXIC_UINT32 smmu0_int15_en2; + ZXIC_UINT32 smmu0_int15_en1; + ZXIC_UINT32 smmu0_int15_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT15_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int15_mask_t +{ + ZXIC_UINT32 smmu0_int15_mask31; + ZXIC_UINT32 smmu0_int15_mask30; + ZXIC_UINT32 smmu0_int15_mask29; + ZXIC_UINT32 smmu0_int15_mask28; + ZXIC_UINT32 smmu0_int15_mask27; + ZXIC_UINT32 smmu0_int15_mask26; + ZXIC_UINT32 smmu0_int15_mask25; + ZXIC_UINT32 smmu0_int15_mask24; + ZXIC_UINT32 smmu0_int15_mask23; + ZXIC_UINT32 smmu0_int15_mask22; + ZXIC_UINT32 smmu0_int15_mask21; + ZXIC_UINT32 smmu0_int15_mask20; + ZXIC_UINT32 smmu0_int15_mask19; + ZXIC_UINT32 smmu0_int15_mask18; + ZXIC_UINT32 smmu0_int15_mask17; + ZXIC_UINT32 smmu0_int15_mask16; + ZXIC_UINT32 smmu0_int15_mask15; + ZXIC_UINT32 smmu0_int15_mask14; + ZXIC_UINT32 smmu0_int15_mask13; + ZXIC_UINT32 smmu0_int15_mask12; + ZXIC_UINT32 smmu0_int15_mask11; + ZXIC_UINT32 smmu0_int15_mask10; + ZXIC_UINT32 smmu0_int15_mask9; + ZXIC_UINT32 smmu0_int15_mask8; + ZXIC_UINT32 smmu0_int15_mask7; + ZXIC_UINT32 smmu0_int15_mask6; + ZXIC_UINT32 smmu0_int15_mask5; + ZXIC_UINT32 smmu0_int15_mask4; + ZXIC_UINT32 smmu0_int15_mask3; + ZXIC_UINT32 smmu0_int15_mask2; + ZXIC_UINT32 smmu0_int15_mask1; + ZXIC_UINT32 smmu0_int15_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT15_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int15_status_t +{ + ZXIC_UINT32 smmu0_int15_status31; + ZXIC_UINT32 smmu0_int15_status30; + ZXIC_UINT32 smmu0_int15_status29; + ZXIC_UINT32 smmu0_int15_status28; + ZXIC_UINT32 smmu0_int15_status27; + ZXIC_UINT32 smmu0_int15_status26; + ZXIC_UINT32 smmu0_int15_status25; + ZXIC_UINT32 smmu0_int15_status24; + ZXIC_UINT32 smmu0_int15_status23; + ZXIC_UINT32 smmu0_int15_status22; + ZXIC_UINT32 smmu0_int15_status21; + ZXIC_UINT32 smmu0_int15_status20; + ZXIC_UINT32 smmu0_int15_status19; + ZXIC_UINT32 smmu0_int15_status18; + ZXIC_UINT32 smmu0_int15_status17; + ZXIC_UINT32 smmu0_int15_status16; + ZXIC_UINT32 smmu0_int15_status15; + ZXIC_UINT32 smmu0_int15_status14; + ZXIC_UINT32 smmu0_int15_status13; + ZXIC_UINT32 smmu0_int15_status12; + ZXIC_UINT32 smmu0_int15_status11; + ZXIC_UINT32 smmu0_int15_status10; + ZXIC_UINT32 smmu0_int15_status9; + ZXIC_UINT32 smmu0_int15_status8; + ZXIC_UINT32 smmu0_int15_status7; + ZXIC_UINT32 smmu0_int15_status6; + ZXIC_UINT32 smmu0_int15_status5; + ZXIC_UINT32 smmu0_int15_status4; + ZXIC_UINT32 smmu0_int15_status3; + ZXIC_UINT32 smmu0_int15_status2; + ZXIC_UINT32 smmu0_int15_status1; + ZXIC_UINT32 smmu0_int15_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT15_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int16_en_t +{ + ZXIC_UINT32 smmu0_int16_en31; + ZXIC_UINT32 smmu0_int16_en30; + ZXIC_UINT32 smmu0_int16_en29; + ZXIC_UINT32 smmu0_int16_en28; + ZXIC_UINT32 smmu0_int16_en27; + ZXIC_UINT32 smmu0_int16_en26; + ZXIC_UINT32 smmu0_int16_en25; + ZXIC_UINT32 smmu0_int16_en24; + ZXIC_UINT32 smmu0_int16_en23; + ZXIC_UINT32 smmu0_int16_en22; + ZXIC_UINT32 smmu0_int16_en21; + ZXIC_UINT32 smmu0_int16_en20; + ZXIC_UINT32 smmu0_int16_en19; + ZXIC_UINT32 smmu0_int16_en18; + ZXIC_UINT32 smmu0_int16_en17; + ZXIC_UINT32 smmu0_int16_en16; + ZXIC_UINT32 smmu0_int16_en15; + ZXIC_UINT32 smmu0_int16_en14; + ZXIC_UINT32 smmu0_int16_en13; + ZXIC_UINT32 smmu0_int16_en12; + ZXIC_UINT32 smmu0_int16_en11; + ZXIC_UINT32 smmu0_int16_en10; + ZXIC_UINT32 smmu0_int16_en9; + ZXIC_UINT32 smmu0_int16_en8; + ZXIC_UINT32 smmu0_int16_en7; + ZXIC_UINT32 smmu0_int16_en6; + ZXIC_UINT32 smmu0_int16_en5; + ZXIC_UINT32 smmu0_int16_en4; + ZXIC_UINT32 smmu0_int16_en3; + ZXIC_UINT32 smmu0_int16_en2; + ZXIC_UINT32 smmu0_int16_en1; + ZXIC_UINT32 smmu0_int16_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT16_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int16_mask_t +{ + ZXIC_UINT32 smmu0_int16_mask31; + ZXIC_UINT32 smmu0_int16_mask30; + ZXIC_UINT32 smmu0_int16_mask29; + ZXIC_UINT32 smmu0_int16_mask28; + ZXIC_UINT32 smmu0_int16_mask27; + ZXIC_UINT32 smmu0_int16_mask26; + ZXIC_UINT32 smmu0_int16_mask25; + ZXIC_UINT32 smmu0_int16_mask24; + ZXIC_UINT32 smmu0_int16_mask23; + ZXIC_UINT32 smmu0_int16_mask22; + ZXIC_UINT32 smmu0_int16_mask21; + ZXIC_UINT32 smmu0_int16_mask20; + ZXIC_UINT32 smmu0_int16_mask19; + ZXIC_UINT32 smmu0_int16_mask18; + ZXIC_UINT32 smmu0_int16_mask17; + ZXIC_UINT32 smmu0_int16_mask16; + ZXIC_UINT32 smmu0_int16_mask15; + ZXIC_UINT32 smmu0_int16_mask14; + ZXIC_UINT32 smmu0_int16_mask13; + ZXIC_UINT32 smmu0_int16_mask12; + ZXIC_UINT32 smmu0_int16_mask11; + ZXIC_UINT32 smmu0_int16_mask10; + ZXIC_UINT32 smmu0_int16_mask9; + ZXIC_UINT32 smmu0_int16_mask8; + ZXIC_UINT32 smmu0_int16_mask7; + ZXIC_UINT32 smmu0_int16_mask6; + ZXIC_UINT32 smmu0_int16_mask5; + ZXIC_UINT32 smmu0_int16_mask4; + ZXIC_UINT32 smmu0_int16_mask3; + ZXIC_UINT32 smmu0_int16_mask2; + ZXIC_UINT32 smmu0_int16_mask1; + ZXIC_UINT32 smmu0_int16_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT16_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int16_status_t +{ + ZXIC_UINT32 smmu0_int16_status31; + ZXIC_UINT32 smmu0_int16_status30; + ZXIC_UINT32 smmu0_int16_status29; + ZXIC_UINT32 smmu0_int16_status28; + ZXIC_UINT32 smmu0_int16_status27; + ZXIC_UINT32 smmu0_int16_status26; + ZXIC_UINT32 smmu0_int16_status25; + ZXIC_UINT32 smmu0_int16_status24; + ZXIC_UINT32 smmu0_int16_status23; + ZXIC_UINT32 smmu0_int16_status22; + ZXIC_UINT32 smmu0_int16_status21; + ZXIC_UINT32 smmu0_int16_status20; + ZXIC_UINT32 smmu0_int16_status19; + ZXIC_UINT32 smmu0_int16_status18; + ZXIC_UINT32 smmu0_int16_status17; + ZXIC_UINT32 smmu0_int16_status16; + ZXIC_UINT32 smmu0_int16_status15; + ZXIC_UINT32 smmu0_int16_status14; + ZXIC_UINT32 smmu0_int16_status13; + ZXIC_UINT32 smmu0_int16_status12; + ZXIC_UINT32 smmu0_int16_status11; + ZXIC_UINT32 smmu0_int16_status10; + ZXIC_UINT32 smmu0_int16_status9; + ZXIC_UINT32 smmu0_int16_status8; + ZXIC_UINT32 smmu0_int16_status7; + ZXIC_UINT32 smmu0_int16_status6; + ZXIC_UINT32 smmu0_int16_status5; + ZXIC_UINT32 smmu0_int16_status4; + ZXIC_UINT32 smmu0_int16_status3; + ZXIC_UINT32 smmu0_int16_status2; + ZXIC_UINT32 smmu0_int16_status1; + ZXIC_UINT32 smmu0_int16_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT16_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int17_en_t +{ + ZXIC_UINT32 smmu0_int17_en31; + ZXIC_UINT32 smmu0_int17_en30; + ZXIC_UINT32 smmu0_int17_en29; + ZXIC_UINT32 smmu0_int17_en28; + ZXIC_UINT32 smmu0_int17_en27; + ZXIC_UINT32 smmu0_int17_en26; + ZXIC_UINT32 smmu0_int17_en25; + ZXIC_UINT32 smmu0_int17_en24; + ZXIC_UINT32 smmu0_int17_en23; + ZXIC_UINT32 smmu0_int17_en22; + ZXIC_UINT32 smmu0_int17_en21; + ZXIC_UINT32 smmu0_int17_en20; + ZXIC_UINT32 smmu0_int17_en19; + ZXIC_UINT32 smmu0_int17_en18; + ZXIC_UINT32 smmu0_int17_en17; + ZXIC_UINT32 smmu0_int17_en16; + ZXIC_UINT32 smmu0_int17_en15; + ZXIC_UINT32 smmu0_int17_en14; + ZXIC_UINT32 smmu0_int17_en13; + ZXIC_UINT32 smmu0_int17_en12; + ZXIC_UINT32 smmu0_int17_en11; + ZXIC_UINT32 smmu0_int17_en10; + ZXIC_UINT32 smmu0_int17_en9; + ZXIC_UINT32 smmu0_int17_en8; + ZXIC_UINT32 smmu0_int17_en7; + ZXIC_UINT32 smmu0_int17_en6; + ZXIC_UINT32 smmu0_int17_en5; + ZXIC_UINT32 smmu0_int17_en4; + ZXIC_UINT32 smmu0_int17_en3; + ZXIC_UINT32 smmu0_int17_en2; + ZXIC_UINT32 smmu0_int17_en1; + ZXIC_UINT32 smmu0_int17_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT17_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int17_mask_t +{ + ZXIC_UINT32 smmu0_int17_mask31; + ZXIC_UINT32 smmu0_int17_mask30; + ZXIC_UINT32 smmu0_int17_mask29; + ZXIC_UINT32 smmu0_int17_mask28; + ZXIC_UINT32 smmu0_int17_mask27; + ZXIC_UINT32 smmu0_int17_mask26; + ZXIC_UINT32 smmu0_int17_mask25; + ZXIC_UINT32 smmu0_int17_mask24; + ZXIC_UINT32 smmu0_int17_mask23; + ZXIC_UINT32 smmu0_int17_mask22; + ZXIC_UINT32 smmu0_int17_mask21; + ZXIC_UINT32 smmu0_int17_mask20; + ZXIC_UINT32 smmu0_int17_mask19; + ZXIC_UINT32 smmu0_int17_mask18; + ZXIC_UINT32 smmu0_int17_mask17; + ZXIC_UINT32 smmu0_int17_mask16; + ZXIC_UINT32 smmu0_int17_mask15; + ZXIC_UINT32 smmu0_int17_mask14; + ZXIC_UINT32 smmu0_int17_mask13; + ZXIC_UINT32 smmu0_int17_mask12; + ZXIC_UINT32 smmu0_int17_mask11; + ZXIC_UINT32 smmu0_int17_mask10; + ZXIC_UINT32 smmu0_int17_mask9; + ZXIC_UINT32 smmu0_int17_mask8; + ZXIC_UINT32 smmu0_int17_mask7; + ZXIC_UINT32 smmu0_int17_mask6; + ZXIC_UINT32 smmu0_int17_mask5; + ZXIC_UINT32 smmu0_int17_mask4; + ZXIC_UINT32 smmu0_int17_mask3; + ZXIC_UINT32 smmu0_int17_mask2; + ZXIC_UINT32 smmu0_int17_mask1; + ZXIC_UINT32 smmu0_int17_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT17_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int17_status_t +{ + ZXIC_UINT32 smmu0_int17_status31; + ZXIC_UINT32 smmu0_int17_status30; + ZXIC_UINT32 smmu0_int17_status29; + ZXIC_UINT32 smmu0_int17_status28; + ZXIC_UINT32 smmu0_int17_status27; + ZXIC_UINT32 smmu0_int17_status26; + ZXIC_UINT32 smmu0_int17_status25; + ZXIC_UINT32 smmu0_int17_status24; + ZXIC_UINT32 smmu0_int17_status23; + ZXIC_UINT32 smmu0_int17_status22; + ZXIC_UINT32 smmu0_int17_status21; + ZXIC_UINT32 smmu0_int17_status20; + ZXIC_UINT32 smmu0_int17_status19; + ZXIC_UINT32 smmu0_int17_status18; + ZXIC_UINT32 smmu0_int17_status17; + ZXIC_UINT32 smmu0_int17_status16; + ZXIC_UINT32 smmu0_int17_status15; + ZXIC_UINT32 smmu0_int17_status14; + ZXIC_UINT32 smmu0_int17_status13; + ZXIC_UINT32 smmu0_int17_status12; + ZXIC_UINT32 smmu0_int17_status11; + ZXIC_UINT32 smmu0_int17_status10; + ZXIC_UINT32 smmu0_int17_status9; + ZXIC_UINT32 smmu0_int17_status8; + ZXIC_UINT32 smmu0_int17_status7; + ZXIC_UINT32 smmu0_int17_status6; + ZXIC_UINT32 smmu0_int17_status5; + ZXIC_UINT32 smmu0_int17_status4; + ZXIC_UINT32 smmu0_int17_status3; + ZXIC_UINT32 smmu0_int17_status2; + ZXIC_UINT32 smmu0_int17_status1; + ZXIC_UINT32 smmu0_int17_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT17_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int18_en_t +{ + ZXIC_UINT32 smmu0_int18_en31; + ZXIC_UINT32 smmu0_int18_en30; + ZXIC_UINT32 smmu0_int18_en29; + ZXIC_UINT32 smmu0_int18_en28; + ZXIC_UINT32 smmu0_int18_en27; + ZXIC_UINT32 smmu0_int18_en26; + ZXIC_UINT32 smmu0_int18_en25; + ZXIC_UINT32 smmu0_int18_en24; + ZXIC_UINT32 smmu0_int18_en23; + ZXIC_UINT32 smmu0_int18_en22; + ZXIC_UINT32 smmu0_int18_en21; + ZXIC_UINT32 smmu0_int18_en20; + ZXIC_UINT32 smmu0_int18_en19; + ZXIC_UINT32 smmu0_int18_en18; + ZXIC_UINT32 smmu0_int18_en17; + ZXIC_UINT32 smmu0_int18_en16; + ZXIC_UINT32 smmu0_int18_en15; + ZXIC_UINT32 smmu0_int18_en14; + ZXIC_UINT32 smmu0_int18_en13; + ZXIC_UINT32 smmu0_int18_en12; + ZXIC_UINT32 smmu0_int18_en11; + ZXIC_UINT32 smmu0_int18_en10; + ZXIC_UINT32 smmu0_int18_en9; + ZXIC_UINT32 smmu0_int18_en8; + ZXIC_UINT32 smmu0_int18_en7; + ZXIC_UINT32 smmu0_int18_en6; + ZXIC_UINT32 smmu0_int18_en5; + ZXIC_UINT32 smmu0_int18_en4; + ZXIC_UINT32 smmu0_int18_en3; + ZXIC_UINT32 smmu0_int18_en2; + ZXIC_UINT32 smmu0_int18_en1; + ZXIC_UINT32 smmu0_int18_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT18_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int18_mask_t +{ + ZXIC_UINT32 smmu0_int18_mask31; + ZXIC_UINT32 smmu0_int18_mask30; + ZXIC_UINT32 smmu0_int18_mask29; + ZXIC_UINT32 smmu0_int18_mask28; + ZXIC_UINT32 smmu0_int18_mask27; + ZXIC_UINT32 smmu0_int18_mask26; + ZXIC_UINT32 smmu0_int18_mask25; + ZXIC_UINT32 smmu0_int18_mask24; + ZXIC_UINT32 smmu0_int18_mask23; + ZXIC_UINT32 smmu0_int18_mask22; + ZXIC_UINT32 smmu0_int18_mask21; + ZXIC_UINT32 smmu0_int18_mask20; + ZXIC_UINT32 smmu0_int18_mask19; + ZXIC_UINT32 smmu0_int18_mask18; + ZXIC_UINT32 smmu0_int18_mask17; + ZXIC_UINT32 smmu0_int18_mask16; + ZXIC_UINT32 smmu0_int18_mask15; + ZXIC_UINT32 smmu0_int18_mask14; + ZXIC_UINT32 smmu0_int18_mask13; + ZXIC_UINT32 smmu0_int18_mask12; + ZXIC_UINT32 smmu0_int18_mask11; + ZXIC_UINT32 smmu0_int18_mask10; + ZXIC_UINT32 smmu0_int18_mask9; + ZXIC_UINT32 smmu0_int18_mask8; + ZXIC_UINT32 smmu0_int18_mask7; + ZXIC_UINT32 smmu0_int18_mask6; + ZXIC_UINT32 smmu0_int18_mask5; + ZXIC_UINT32 smmu0_int18_mask4; + ZXIC_UINT32 smmu0_int18_mask3; + ZXIC_UINT32 smmu0_int18_mask2; + ZXIC_UINT32 smmu0_int18_mask1; + ZXIC_UINT32 smmu0_int18_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT18_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int18_status_t +{ + ZXIC_UINT32 smmu0_int18_status31; + ZXIC_UINT32 smmu0_int18_status30; + ZXIC_UINT32 smmu0_int18_status29; + ZXIC_UINT32 smmu0_int18_status28; + ZXIC_UINT32 smmu0_int18_status27; + ZXIC_UINT32 smmu0_int18_status26; + ZXIC_UINT32 smmu0_int18_status25; + ZXIC_UINT32 smmu0_int18_status24; + ZXIC_UINT32 smmu0_int18_status23; + ZXIC_UINT32 smmu0_int18_status22; + ZXIC_UINT32 smmu0_int18_status21; + ZXIC_UINT32 smmu0_int18_status20; + ZXIC_UINT32 smmu0_int18_status19; + ZXIC_UINT32 smmu0_int18_status18; + ZXIC_UINT32 smmu0_int18_status17; + ZXIC_UINT32 smmu0_int18_status16; + ZXIC_UINT32 smmu0_int18_status15; + ZXIC_UINT32 smmu0_int18_status14; + ZXIC_UINT32 smmu0_int18_status13; + ZXIC_UINT32 smmu0_int18_status12; + ZXIC_UINT32 smmu0_int18_status11; + ZXIC_UINT32 smmu0_int18_status10; + ZXIC_UINT32 smmu0_int18_status9; + ZXIC_UINT32 smmu0_int18_status8; + ZXIC_UINT32 smmu0_int18_status7; + ZXIC_UINT32 smmu0_int18_status6; + ZXIC_UINT32 smmu0_int18_status5; + ZXIC_UINT32 smmu0_int18_status4; + ZXIC_UINT32 smmu0_int18_status3; + ZXIC_UINT32 smmu0_int18_status2; + ZXIC_UINT32 smmu0_int18_status1; + ZXIC_UINT32 smmu0_int18_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT18_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int19_en_t +{ + ZXIC_UINT32 smmu0_int19_en31; + ZXIC_UINT32 smmu0_int19_en30; + ZXIC_UINT32 smmu0_int19_en29; + ZXIC_UINT32 smmu0_int19_en28; + ZXIC_UINT32 smmu0_int19_en27; + ZXIC_UINT32 smmu0_int19_en26; + ZXIC_UINT32 smmu0_int19_en25; + ZXIC_UINT32 smmu0_int19_en24; + ZXIC_UINT32 smmu0_int19_en23; + ZXIC_UINT32 smmu0_int19_en22; + ZXIC_UINT32 smmu0_int19_en21; + ZXIC_UINT32 smmu0_int19_en20; + ZXIC_UINT32 smmu0_int19_en19; + ZXIC_UINT32 smmu0_int19_en18; + ZXIC_UINT32 smmu0_int19_en17; + ZXIC_UINT32 smmu0_int19_en16; + ZXIC_UINT32 smmu0_int19_en15; + ZXIC_UINT32 smmu0_int19_en14; + ZXIC_UINT32 smmu0_int19_en13; + ZXIC_UINT32 smmu0_int19_en12; + ZXIC_UINT32 smmu0_int19_en11; + ZXIC_UINT32 smmu0_int19_en10; + ZXIC_UINT32 smmu0_int19_en9; + ZXIC_UINT32 smmu0_int19_en8; + ZXIC_UINT32 smmu0_int19_en7; + ZXIC_UINT32 smmu0_int19_en6; + ZXIC_UINT32 smmu0_int19_en5; + ZXIC_UINT32 smmu0_int19_en4; + ZXIC_UINT32 smmu0_int19_en3; + ZXIC_UINT32 smmu0_int19_en2; + ZXIC_UINT32 smmu0_int19_en1; + ZXIC_UINT32 smmu0_int19_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT19_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int19_mask_t +{ + ZXIC_UINT32 smmu0_int19_mask31; + ZXIC_UINT32 smmu0_int19_mask30; + ZXIC_UINT32 smmu0_int19_mask29; + ZXIC_UINT32 smmu0_int19_mask28; + ZXIC_UINT32 smmu0_int19_mask27; + ZXIC_UINT32 smmu0_int19_mask26; + ZXIC_UINT32 smmu0_int19_mask25; + ZXIC_UINT32 smmu0_int19_mask24; + ZXIC_UINT32 smmu0_int19_mask23; + ZXIC_UINT32 smmu0_int19_mask22; + ZXIC_UINT32 smmu0_int19_mask21; + ZXIC_UINT32 smmu0_int19_mask20; + ZXIC_UINT32 smmu0_int19_mask19; + ZXIC_UINT32 smmu0_int19_mask18; + ZXIC_UINT32 smmu0_int19_mask17; + ZXIC_UINT32 smmu0_int19_mask16; + ZXIC_UINT32 smmu0_int19_mask15; + ZXIC_UINT32 smmu0_int19_mask14; + ZXIC_UINT32 smmu0_int19_mask13; + ZXIC_UINT32 smmu0_int19_mask12; + ZXIC_UINT32 smmu0_int19_mask11; + ZXIC_UINT32 smmu0_int19_mask10; + ZXIC_UINT32 smmu0_int19_mask9; + ZXIC_UINT32 smmu0_int19_mask8; + ZXIC_UINT32 smmu0_int19_mask7; + ZXIC_UINT32 smmu0_int19_mask6; + ZXIC_UINT32 smmu0_int19_mask5; + ZXIC_UINT32 smmu0_int19_mask4; + ZXIC_UINT32 smmu0_int19_mask3; + ZXIC_UINT32 smmu0_int19_mask2; + ZXIC_UINT32 smmu0_int19_mask1; + ZXIC_UINT32 smmu0_int19_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT19_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int19_status_t +{ + ZXIC_UINT32 smmu0_int19_status31; + ZXIC_UINT32 smmu0_int19_status30; + ZXIC_UINT32 smmu0_int19_status29; + ZXIC_UINT32 smmu0_int19_status28; + ZXIC_UINT32 smmu0_int19_status27; + ZXIC_UINT32 smmu0_int19_status26; + ZXIC_UINT32 smmu0_int19_status25; + ZXIC_UINT32 smmu0_int19_status24; + ZXIC_UINT32 smmu0_int19_status23; + ZXIC_UINT32 smmu0_int19_status22; + ZXIC_UINT32 smmu0_int19_status21; + ZXIC_UINT32 smmu0_int19_status20; + ZXIC_UINT32 smmu0_int19_status19; + ZXIC_UINT32 smmu0_int19_status18; + ZXIC_UINT32 smmu0_int19_status17; + ZXIC_UINT32 smmu0_int19_status16; + ZXIC_UINT32 smmu0_int19_status15; + ZXIC_UINT32 smmu0_int19_status14; + ZXIC_UINT32 smmu0_int19_status13; + ZXIC_UINT32 smmu0_int19_status12; + ZXIC_UINT32 smmu0_int19_status11; + ZXIC_UINT32 smmu0_int19_status10; + ZXIC_UINT32 smmu0_int19_status9; + ZXIC_UINT32 smmu0_int19_status8; + ZXIC_UINT32 smmu0_int19_status7; + ZXIC_UINT32 smmu0_int19_status6; + ZXIC_UINT32 smmu0_int19_status5; + ZXIC_UINT32 smmu0_int19_status4; + ZXIC_UINT32 smmu0_int19_status3; + ZXIC_UINT32 smmu0_int19_status2; + ZXIC_UINT32 smmu0_int19_status1; + ZXIC_UINT32 smmu0_int19_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT19_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int20_en_t +{ + ZXIC_UINT32 smmu0_int20_en31; + ZXIC_UINT32 smmu0_int20_en30; + ZXIC_UINT32 smmu0_int20_en29; + ZXIC_UINT32 smmu0_int20_en28; + ZXIC_UINT32 smmu0_int20_en27; + ZXIC_UINT32 smmu0_int20_en26; + ZXIC_UINT32 smmu0_int20_en25; + ZXIC_UINT32 smmu0_int20_en24; + ZXIC_UINT32 smmu0_int20_en23; + ZXIC_UINT32 smmu0_int20_en22; + ZXIC_UINT32 smmu0_int20_en21; + ZXIC_UINT32 smmu0_int20_en20; + ZXIC_UINT32 smmu0_int20_en19; + ZXIC_UINT32 smmu0_int20_en18; + ZXIC_UINT32 smmu0_int20_en17; + ZXIC_UINT32 smmu0_int20_en16; + ZXIC_UINT32 smmu0_int20_en15; + ZXIC_UINT32 smmu0_int20_en14; + ZXIC_UINT32 smmu0_int20_en13; + ZXIC_UINT32 smmu0_int20_en12; + ZXIC_UINT32 smmu0_int20_en11; + ZXIC_UINT32 smmu0_int20_en10; + ZXIC_UINT32 smmu0_int20_en9; + ZXIC_UINT32 smmu0_int20_en8; + ZXIC_UINT32 smmu0_int20_en7; + ZXIC_UINT32 smmu0_int20_en6; + ZXIC_UINT32 smmu0_int20_en5; + ZXIC_UINT32 smmu0_int20_en4; + ZXIC_UINT32 smmu0_int20_en3; + ZXIC_UINT32 smmu0_int20_en2; + ZXIC_UINT32 smmu0_int20_en1; + ZXIC_UINT32 smmu0_int20_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT20_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int20_mask_t +{ + ZXIC_UINT32 smmu0_int20_mask31; + ZXIC_UINT32 smmu0_int20_mask30; + ZXIC_UINT32 smmu0_int20_mask29; + ZXIC_UINT32 smmu0_int20_mask28; + ZXIC_UINT32 smmu0_int20_mask27; + ZXIC_UINT32 smmu0_int20_mask26; + ZXIC_UINT32 smmu0_int20_mask25; + ZXIC_UINT32 smmu0_int20_mask24; + ZXIC_UINT32 smmu0_int20_mask23; + ZXIC_UINT32 smmu0_int20_mask22; + ZXIC_UINT32 smmu0_int20_mask21; + ZXIC_UINT32 smmu0_int20_mask20; + ZXIC_UINT32 smmu0_int20_mask19; + ZXIC_UINT32 smmu0_int20_mask18; + ZXIC_UINT32 smmu0_int20_mask17; + ZXIC_UINT32 smmu0_int20_mask16; + ZXIC_UINT32 smmu0_int20_mask15; + ZXIC_UINT32 smmu0_int20_mask14; + ZXIC_UINT32 smmu0_int20_mask13; + ZXIC_UINT32 smmu0_int20_mask12; + ZXIC_UINT32 smmu0_int20_mask11; + ZXIC_UINT32 smmu0_int20_mask10; + ZXIC_UINT32 smmu0_int20_mask9; + ZXIC_UINT32 smmu0_int20_mask8; + ZXIC_UINT32 smmu0_int20_mask7; + ZXIC_UINT32 smmu0_int20_mask6; + ZXIC_UINT32 smmu0_int20_mask5; + ZXIC_UINT32 smmu0_int20_mask4; + ZXIC_UINT32 smmu0_int20_mask3; + ZXIC_UINT32 smmu0_int20_mask2; + ZXIC_UINT32 smmu0_int20_mask1; + ZXIC_UINT32 smmu0_int20_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT20_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int20_status_t +{ + ZXIC_UINT32 smmu0_int20_status31; + ZXIC_UINT32 smmu0_int20_status30; + ZXIC_UINT32 smmu0_int20_status29; + ZXIC_UINT32 smmu0_int20_status28; + ZXIC_UINT32 smmu0_int20_status27; + ZXIC_UINT32 smmu0_int20_status26; + ZXIC_UINT32 smmu0_int20_status25; + ZXIC_UINT32 smmu0_int20_status24; + ZXIC_UINT32 smmu0_int20_status23; + ZXIC_UINT32 smmu0_int20_status22; + ZXIC_UINT32 smmu0_int20_status21; + ZXIC_UINT32 smmu0_int20_status20; + ZXIC_UINT32 smmu0_int20_status19; + ZXIC_UINT32 smmu0_int20_status18; + ZXIC_UINT32 smmu0_int20_status17; + ZXIC_UINT32 smmu0_int20_status16; + ZXIC_UINT32 smmu0_int20_status15; + ZXIC_UINT32 smmu0_int20_status14; + ZXIC_UINT32 smmu0_int20_status13; + ZXIC_UINT32 smmu0_int20_status12; + ZXIC_UINT32 smmu0_int20_status11; + ZXIC_UINT32 smmu0_int20_status10; + ZXIC_UINT32 smmu0_int20_status9; + ZXIC_UINT32 smmu0_int20_status8; + ZXIC_UINT32 smmu0_int20_status7; + ZXIC_UINT32 smmu0_int20_status6; + ZXIC_UINT32 smmu0_int20_status5; + ZXIC_UINT32 smmu0_int20_status4; + ZXIC_UINT32 smmu0_int20_status3; + ZXIC_UINT32 smmu0_int20_status2; + ZXIC_UINT32 smmu0_int20_status1; + ZXIC_UINT32 smmu0_int20_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT20_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int21_en_t +{ + ZXIC_UINT32 smmu0_int21_en31; + ZXIC_UINT32 smmu0_int21_en30; + ZXIC_UINT32 smmu0_int21_en29; + ZXIC_UINT32 smmu0_int21_en28; + ZXIC_UINT32 smmu0_int21_en27; + ZXIC_UINT32 smmu0_int21_en26; + ZXIC_UINT32 smmu0_int21_en25; + ZXIC_UINT32 smmu0_int21_en24; + ZXIC_UINT32 smmu0_int21_en23; + ZXIC_UINT32 smmu0_int21_en22; + ZXIC_UINT32 smmu0_int21_en21; + ZXIC_UINT32 smmu0_int21_en20; + ZXIC_UINT32 smmu0_int21_en19; + ZXIC_UINT32 smmu0_int21_en18; + ZXIC_UINT32 smmu0_int21_en17; + ZXIC_UINT32 smmu0_int21_en16; + ZXIC_UINT32 smmu0_int21_en15; + ZXIC_UINT32 smmu0_int21_en14; + ZXIC_UINT32 smmu0_int21_en13; + ZXIC_UINT32 smmu0_int21_en12; + ZXIC_UINT32 smmu0_int21_en11; + ZXIC_UINT32 smmu0_int21_en10; + ZXIC_UINT32 smmu0_int21_en9; + ZXIC_UINT32 smmu0_int21_en8; + ZXIC_UINT32 smmu0_int21_en7; + ZXIC_UINT32 smmu0_int21_en6; + ZXIC_UINT32 smmu0_int21_en5; + ZXIC_UINT32 smmu0_int21_en4; + ZXIC_UINT32 smmu0_int21_en3; + ZXIC_UINT32 smmu0_int21_en2; + ZXIC_UINT32 smmu0_int21_en1; + ZXIC_UINT32 smmu0_int21_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT21_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int21_mask_t +{ + ZXIC_UINT32 smmu0_int21_mask31; + ZXIC_UINT32 smmu0_int21_mask30; + ZXIC_UINT32 smmu0_int21_mask29; + ZXIC_UINT32 smmu0_int21_mask28; + ZXIC_UINT32 smmu0_int21_mask27; + ZXIC_UINT32 smmu0_int21_mask26; + ZXIC_UINT32 smmu0_int21_mask25; + ZXIC_UINT32 smmu0_int21_mask24; + ZXIC_UINT32 smmu0_int21_mask23; + ZXIC_UINT32 smmu0_int21_mask22; + ZXIC_UINT32 smmu0_int21_mask21; + ZXIC_UINT32 smmu0_int21_mask20; + ZXIC_UINT32 smmu0_int21_mask19; + ZXIC_UINT32 smmu0_int21_mask18; + ZXIC_UINT32 smmu0_int21_mask17; + ZXIC_UINT32 smmu0_int21_mask16; + ZXIC_UINT32 smmu0_int21_mask15; + ZXIC_UINT32 smmu0_int21_mask14; + ZXIC_UINT32 smmu0_int21_mask13; + ZXIC_UINT32 smmu0_int21_mask12; + ZXIC_UINT32 smmu0_int21_mask11; + ZXIC_UINT32 smmu0_int21_mask10; + ZXIC_UINT32 smmu0_int21_mask9; + ZXIC_UINT32 smmu0_int21_mask8; + ZXIC_UINT32 smmu0_int21_mask7; + ZXIC_UINT32 smmu0_int21_mask6; + ZXIC_UINT32 smmu0_int21_mask5; + ZXIC_UINT32 smmu0_int21_mask4; + ZXIC_UINT32 smmu0_int21_mask3; + ZXIC_UINT32 smmu0_int21_mask2; + ZXIC_UINT32 smmu0_int21_mask1; + ZXIC_UINT32 smmu0_int21_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT21_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int21_status_t +{ + ZXIC_UINT32 smmu0_int21_status31; + ZXIC_UINT32 smmu0_int21_status30; + ZXIC_UINT32 smmu0_int21_status29; + ZXIC_UINT32 smmu0_int21_status28; + ZXIC_UINT32 smmu0_int21_status27; + ZXIC_UINT32 smmu0_int21_status26; + ZXIC_UINT32 smmu0_int21_status25; + ZXIC_UINT32 smmu0_int21_status24; + ZXIC_UINT32 smmu0_int21_status23; + ZXIC_UINT32 smmu0_int21_status22; + ZXIC_UINT32 smmu0_int21_status21; + ZXIC_UINT32 smmu0_int21_status20; + ZXIC_UINT32 smmu0_int21_status19; + ZXIC_UINT32 smmu0_int21_status18; + ZXIC_UINT32 smmu0_int21_status17; + ZXIC_UINT32 smmu0_int21_status16; + ZXIC_UINT32 smmu0_int21_status15; + ZXIC_UINT32 smmu0_int21_status14; + ZXIC_UINT32 smmu0_int21_status13; + ZXIC_UINT32 smmu0_int21_status12; + ZXIC_UINT32 smmu0_int21_status11; + ZXIC_UINT32 smmu0_int21_status10; + ZXIC_UINT32 smmu0_int21_status9; + ZXIC_UINT32 smmu0_int21_status8; + ZXIC_UINT32 smmu0_int21_status7; + ZXIC_UINT32 smmu0_int21_status6; + ZXIC_UINT32 smmu0_int21_status5; + ZXIC_UINT32 smmu0_int21_status4; + ZXIC_UINT32 smmu0_int21_status3; + ZXIC_UINT32 smmu0_int21_status2; + ZXIC_UINT32 smmu0_int21_status1; + ZXIC_UINT32 smmu0_int21_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT21_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int22_en_t +{ + ZXIC_UINT32 smmu0_int22_en31; + ZXIC_UINT32 smmu0_int22_en30; + ZXIC_UINT32 smmu0_int22_en29; + ZXIC_UINT32 smmu0_int22_en28; + ZXIC_UINT32 smmu0_int22_en27; + ZXIC_UINT32 smmu0_int22_en26; + ZXIC_UINT32 smmu0_int22_en25; + ZXIC_UINT32 smmu0_int22_en24; + ZXIC_UINT32 smmu0_int22_en23; + ZXIC_UINT32 smmu0_int22_en22; + ZXIC_UINT32 smmu0_int22_en21; + ZXIC_UINT32 smmu0_int22_en20; + ZXIC_UINT32 smmu0_int22_en19; + ZXIC_UINT32 smmu0_int22_en18; + ZXIC_UINT32 smmu0_int22_en17; + ZXIC_UINT32 smmu0_int22_en16; + ZXIC_UINT32 smmu0_int22_en15; + ZXIC_UINT32 smmu0_int22_en14; + ZXIC_UINT32 smmu0_int22_en13; + ZXIC_UINT32 smmu0_int22_en12; + ZXIC_UINT32 smmu0_int22_en11; + ZXIC_UINT32 smmu0_int22_en10; + ZXIC_UINT32 smmu0_int22_en9; + ZXIC_UINT32 smmu0_int22_en8; + ZXIC_UINT32 smmu0_int22_en7; + ZXIC_UINT32 smmu0_int22_en6; + ZXIC_UINT32 smmu0_int22_en5; + ZXIC_UINT32 smmu0_int22_en4; + ZXIC_UINT32 smmu0_int22_en3; + ZXIC_UINT32 smmu0_int22_en2; + ZXIC_UINT32 smmu0_int22_en1; + ZXIC_UINT32 smmu0_int22_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT22_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int22_mask_t +{ + ZXIC_UINT32 smmu0_int22_mask31; + ZXIC_UINT32 smmu0_int22_mask30; + ZXIC_UINT32 smmu0_int22_mask29; + ZXIC_UINT32 smmu0_int22_mask28; + ZXIC_UINT32 smmu0_int22_mask27; + ZXIC_UINT32 smmu0_int22_mask26; + ZXIC_UINT32 smmu0_int22_mask25; + ZXIC_UINT32 smmu0_int22_mask24; + ZXIC_UINT32 smmu0_int22_mask23; + ZXIC_UINT32 smmu0_int22_mask22; + ZXIC_UINT32 smmu0_int22_mask21; + ZXIC_UINT32 smmu0_int22_mask20; + ZXIC_UINT32 smmu0_int22_mask19; + ZXIC_UINT32 smmu0_int22_mask18; + ZXIC_UINT32 smmu0_int22_mask17; + ZXIC_UINT32 smmu0_int22_mask16; + ZXIC_UINT32 smmu0_int22_mask15; + ZXIC_UINT32 smmu0_int22_mask14; + ZXIC_UINT32 smmu0_int22_mask13; + ZXIC_UINT32 smmu0_int22_mask12; + ZXIC_UINT32 smmu0_int22_mask11; + ZXIC_UINT32 smmu0_int22_mask10; + ZXIC_UINT32 smmu0_int22_mask9; + ZXIC_UINT32 smmu0_int22_mask8; + ZXIC_UINT32 smmu0_int22_mask7; + ZXIC_UINT32 smmu0_int22_mask6; + ZXIC_UINT32 smmu0_int22_mask5; + ZXIC_UINT32 smmu0_int22_mask4; + ZXIC_UINT32 smmu0_int22_mask3; + ZXIC_UINT32 smmu0_int22_mask2; + ZXIC_UINT32 smmu0_int22_mask1; + ZXIC_UINT32 smmu0_int22_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT22_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int22_status_t +{ + ZXIC_UINT32 smmu0_int22_status31; + ZXIC_UINT32 smmu0_int22_status30; + ZXIC_UINT32 smmu0_int22_status29; + ZXIC_UINT32 smmu0_int22_status28; + ZXIC_UINT32 smmu0_int22_status27; + ZXIC_UINT32 smmu0_int22_status26; + ZXIC_UINT32 smmu0_int22_status25; + ZXIC_UINT32 smmu0_int22_status24; + ZXIC_UINT32 smmu0_int22_status23; + ZXIC_UINT32 smmu0_int22_status22; + ZXIC_UINT32 smmu0_int22_status21; + ZXIC_UINT32 smmu0_int22_status20; + ZXIC_UINT32 smmu0_int22_status19; + ZXIC_UINT32 smmu0_int22_status18; + ZXIC_UINT32 smmu0_int22_status17; + ZXIC_UINT32 smmu0_int22_status16; + ZXIC_UINT32 smmu0_int22_status15; + ZXIC_UINT32 smmu0_int22_status14; + ZXIC_UINT32 smmu0_int22_status13; + ZXIC_UINT32 smmu0_int22_status12; + ZXIC_UINT32 smmu0_int22_status11; + ZXIC_UINT32 smmu0_int22_status10; + ZXIC_UINT32 smmu0_int22_status9; + ZXIC_UINT32 smmu0_int22_status8; + ZXIC_UINT32 smmu0_int22_status7; + ZXIC_UINT32 smmu0_int22_status6; + ZXIC_UINT32 smmu0_int22_status5; + ZXIC_UINT32 smmu0_int22_status4; + ZXIC_UINT32 smmu0_int22_status3; + ZXIC_UINT32 smmu0_int22_status2; + ZXIC_UINT32 smmu0_int22_status1; + ZXIC_UINT32 smmu0_int22_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT22_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int23_en_t +{ + ZXIC_UINT32 smmu0_int23_en31; + ZXIC_UINT32 smmu0_int23_en30; + ZXIC_UINT32 smmu0_int23_en29; + ZXIC_UINT32 smmu0_int23_en28; + ZXIC_UINT32 smmu0_int23_en27; + ZXIC_UINT32 smmu0_int23_en26; + ZXIC_UINT32 smmu0_int23_en25; + ZXIC_UINT32 smmu0_int23_en24; + ZXIC_UINT32 smmu0_int23_en23; + ZXIC_UINT32 smmu0_int23_en22; + ZXIC_UINT32 smmu0_int23_en21; + ZXIC_UINT32 smmu0_int23_en20; + ZXIC_UINT32 smmu0_int23_en19; + ZXIC_UINT32 smmu0_int23_en18; + ZXIC_UINT32 smmu0_int23_en17; + ZXIC_UINT32 smmu0_int23_en16; + ZXIC_UINT32 smmu0_int23_en15; + ZXIC_UINT32 smmu0_int23_en14; + ZXIC_UINT32 smmu0_int23_en13; + ZXIC_UINT32 smmu0_int23_en12; + ZXIC_UINT32 smmu0_int23_en11; + ZXIC_UINT32 smmu0_int23_en10; + ZXIC_UINT32 smmu0_int23_en9; + ZXIC_UINT32 smmu0_int23_en8; + ZXIC_UINT32 smmu0_int23_en7; + ZXIC_UINT32 smmu0_int23_en6; + ZXIC_UINT32 smmu0_int23_en5; + ZXIC_UINT32 smmu0_int23_en4; + ZXIC_UINT32 smmu0_int23_en3; + ZXIC_UINT32 smmu0_int23_en2; + ZXIC_UINT32 smmu0_int23_en1; + ZXIC_UINT32 smmu0_int23_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT23_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int23_mask_t +{ + ZXIC_UINT32 smmu0_int23_mask31; + ZXIC_UINT32 smmu0_int23_mask30; + ZXIC_UINT32 smmu0_int23_mask29; + ZXIC_UINT32 smmu0_int23_mask28; + ZXIC_UINT32 smmu0_int23_mask27; + ZXIC_UINT32 smmu0_int23_mask26; + ZXIC_UINT32 smmu0_int23_mask25; + ZXIC_UINT32 smmu0_int23_mask24; + ZXIC_UINT32 smmu0_int23_mask23; + ZXIC_UINT32 smmu0_int23_mask22; + ZXIC_UINT32 smmu0_int23_mask21; + ZXIC_UINT32 smmu0_int23_mask20; + ZXIC_UINT32 smmu0_int23_mask19; + ZXIC_UINT32 smmu0_int23_mask18; + ZXIC_UINT32 smmu0_int23_mask17; + ZXIC_UINT32 smmu0_int23_mask16; + ZXIC_UINT32 smmu0_int23_mask15; + ZXIC_UINT32 smmu0_int23_mask14; + ZXIC_UINT32 smmu0_int23_mask13; + ZXIC_UINT32 smmu0_int23_mask12; + ZXIC_UINT32 smmu0_int23_mask11; + ZXIC_UINT32 smmu0_int23_mask10; + ZXIC_UINT32 smmu0_int23_mask9; + ZXIC_UINT32 smmu0_int23_mask8; + ZXIC_UINT32 smmu0_int23_mask7; + ZXIC_UINT32 smmu0_int23_mask6; + ZXIC_UINT32 smmu0_int23_mask5; + ZXIC_UINT32 smmu0_int23_mask4; + ZXIC_UINT32 smmu0_int23_mask3; + ZXIC_UINT32 smmu0_int23_mask2; + ZXIC_UINT32 smmu0_int23_mask1; + ZXIC_UINT32 smmu0_int23_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT23_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int23_status_t +{ + ZXIC_UINT32 smmu0_int23_status31; + ZXIC_UINT32 smmu0_int23_status30; + ZXIC_UINT32 smmu0_int23_status29; + ZXIC_UINT32 smmu0_int23_status28; + ZXIC_UINT32 smmu0_int23_status27; + ZXIC_UINT32 smmu0_int23_status26; + ZXIC_UINT32 smmu0_int23_status25; + ZXIC_UINT32 smmu0_int23_status24; + ZXIC_UINT32 smmu0_int23_status23; + ZXIC_UINT32 smmu0_int23_status22; + ZXIC_UINT32 smmu0_int23_status21; + ZXIC_UINT32 smmu0_int23_status20; + ZXIC_UINT32 smmu0_int23_status19; + ZXIC_UINT32 smmu0_int23_status18; + ZXIC_UINT32 smmu0_int23_status17; + ZXIC_UINT32 smmu0_int23_status16; + ZXIC_UINT32 smmu0_int23_status15; + ZXIC_UINT32 smmu0_int23_status14; + ZXIC_UINT32 smmu0_int23_status13; + ZXIC_UINT32 smmu0_int23_status12; + ZXIC_UINT32 smmu0_int23_status11; + ZXIC_UINT32 smmu0_int23_status10; + ZXIC_UINT32 smmu0_int23_status9; + ZXIC_UINT32 smmu0_int23_status8; + ZXIC_UINT32 smmu0_int23_status7; + ZXIC_UINT32 smmu0_int23_status6; + ZXIC_UINT32 smmu0_int23_status5; + ZXIC_UINT32 smmu0_int23_status4; + ZXIC_UINT32 smmu0_int23_status3; + ZXIC_UINT32 smmu0_int23_status2; + ZXIC_UINT32 smmu0_int23_status1; + ZXIC_UINT32 smmu0_int23_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT23_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int24_en_t +{ + ZXIC_UINT32 smmu0_int24_en31; + ZXIC_UINT32 smmu0_int24_en30; + ZXIC_UINT32 smmu0_int24_en29; + ZXIC_UINT32 smmu0_int24_en28; + ZXIC_UINT32 smmu0_int24_en27; + ZXIC_UINT32 smmu0_int24_en26; + ZXIC_UINT32 smmu0_int24_en25; + ZXIC_UINT32 smmu0_int24_en24; + ZXIC_UINT32 smmu0_int24_en23; + ZXIC_UINT32 smmu0_int24_en22; + ZXIC_UINT32 smmu0_int24_en21; + ZXIC_UINT32 smmu0_int24_en20; + ZXIC_UINT32 smmu0_int24_en19; + ZXIC_UINT32 smmu0_int24_en18; + ZXIC_UINT32 smmu0_int24_en17; + ZXIC_UINT32 smmu0_int24_en16; + ZXIC_UINT32 smmu0_int24_en15; + ZXIC_UINT32 smmu0_int24_en14; + ZXIC_UINT32 smmu0_int24_en13; + ZXIC_UINT32 smmu0_int24_en12; + ZXIC_UINT32 smmu0_int24_en11; + ZXIC_UINT32 smmu0_int24_en10; + ZXIC_UINT32 smmu0_int24_en9; + ZXIC_UINT32 smmu0_int24_en8; + ZXIC_UINT32 smmu0_int24_en7; + ZXIC_UINT32 smmu0_int24_en6; + ZXIC_UINT32 smmu0_int24_en5; + ZXIC_UINT32 smmu0_int24_en4; + ZXIC_UINT32 smmu0_int24_en3; + ZXIC_UINT32 smmu0_int24_en2; + ZXIC_UINT32 smmu0_int24_en1; + ZXIC_UINT32 smmu0_int24_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT24_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int24_mask_t +{ + ZXIC_UINT32 smmu0_int24_mask31; + ZXIC_UINT32 smmu0_int24_mask30; + ZXIC_UINT32 smmu0_int24_mask29; + ZXIC_UINT32 smmu0_int24_mask28; + ZXIC_UINT32 smmu0_int24_mask27; + ZXIC_UINT32 smmu0_int24_mask26; + ZXIC_UINT32 smmu0_int24_mask25; + ZXIC_UINT32 smmu0_int24_mask24; + ZXIC_UINT32 smmu0_int24_mask23; + ZXIC_UINT32 smmu0_int24_mask22; + ZXIC_UINT32 smmu0_int24_mask21; + ZXIC_UINT32 smmu0_int24_mask20; + ZXIC_UINT32 smmu0_int24_mask19; + ZXIC_UINT32 smmu0_int24_mask18; + ZXIC_UINT32 smmu0_int24_mask17; + ZXIC_UINT32 smmu0_int24_mask16; + ZXIC_UINT32 smmu0_int24_mask15; + ZXIC_UINT32 smmu0_int24_mask14; + ZXIC_UINT32 smmu0_int24_mask13; + ZXIC_UINT32 smmu0_int24_mask12; + ZXIC_UINT32 smmu0_int24_mask11; + ZXIC_UINT32 smmu0_int24_mask10; + ZXIC_UINT32 smmu0_int24_mask9; + ZXIC_UINT32 smmu0_int24_mask8; + ZXIC_UINT32 smmu0_int24_mask7; + ZXIC_UINT32 smmu0_int24_mask6; + ZXIC_UINT32 smmu0_int24_mask5; + ZXIC_UINT32 smmu0_int24_mask4; + ZXIC_UINT32 smmu0_int24_mask3; + ZXIC_UINT32 smmu0_int24_mask2; + ZXIC_UINT32 smmu0_int24_mask1; + ZXIC_UINT32 smmu0_int24_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT24_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int24_status_t +{ + ZXIC_UINT32 smmu0_int24_status31; + ZXIC_UINT32 smmu0_int24_status30; + ZXIC_UINT32 smmu0_int24_status29; + ZXIC_UINT32 smmu0_int24_status28; + ZXIC_UINT32 smmu0_int24_status27; + ZXIC_UINT32 smmu0_int24_status26; + ZXIC_UINT32 smmu0_int24_status25; + ZXIC_UINT32 smmu0_int24_status24; + ZXIC_UINT32 smmu0_int24_status23; + ZXIC_UINT32 smmu0_int24_status22; + ZXIC_UINT32 smmu0_int24_status21; + ZXIC_UINT32 smmu0_int24_status20; + ZXIC_UINT32 smmu0_int24_status19; + ZXIC_UINT32 smmu0_int24_status18; + ZXIC_UINT32 smmu0_int24_status17; + ZXIC_UINT32 smmu0_int24_status16; + ZXIC_UINT32 smmu0_int24_status15; + ZXIC_UINT32 smmu0_int24_status14; + ZXIC_UINT32 smmu0_int24_status13; + ZXIC_UINT32 smmu0_int24_status12; + ZXIC_UINT32 smmu0_int24_status11; + ZXIC_UINT32 smmu0_int24_status10; + ZXIC_UINT32 smmu0_int24_status9; + ZXIC_UINT32 smmu0_int24_status8; + ZXIC_UINT32 smmu0_int24_status7; + ZXIC_UINT32 smmu0_int24_status6; + ZXIC_UINT32 smmu0_int24_status5; + ZXIC_UINT32 smmu0_int24_status4; + ZXIC_UINT32 smmu0_int24_status3; + ZXIC_UINT32 smmu0_int24_status2; + ZXIC_UINT32 smmu0_int24_status1; + ZXIC_UINT32 smmu0_int24_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT24_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int25_en_t +{ + ZXIC_UINT32 smmu0_int25_en31; + ZXIC_UINT32 smmu0_int25_en30; + ZXIC_UINT32 smmu0_int25_en29; + ZXIC_UINT32 smmu0_int25_en28; + ZXIC_UINT32 smmu0_int25_en27; + ZXIC_UINT32 smmu0_int25_en26; + ZXIC_UINT32 smmu0_int25_en25; + ZXIC_UINT32 smmu0_int25_en24; + ZXIC_UINT32 smmu0_int25_en23; + ZXIC_UINT32 smmu0_int25_en22; + ZXIC_UINT32 smmu0_int25_en21; + ZXIC_UINT32 smmu0_int25_en20; + ZXIC_UINT32 smmu0_int25_en19; + ZXIC_UINT32 smmu0_int25_en18; + ZXIC_UINT32 smmu0_int25_en17; + ZXIC_UINT32 smmu0_int25_en16; + ZXIC_UINT32 smmu0_int25_en15; + ZXIC_UINT32 smmu0_int25_en14; + ZXIC_UINT32 smmu0_int25_en13; + ZXIC_UINT32 smmu0_int25_en12; + ZXIC_UINT32 smmu0_int25_en11; + ZXIC_UINT32 smmu0_int25_en10; + ZXIC_UINT32 smmu0_int25_en9; + ZXIC_UINT32 smmu0_int25_en8; + ZXIC_UINT32 smmu0_int25_en7; + ZXIC_UINT32 smmu0_int25_en6; + ZXIC_UINT32 smmu0_int25_en5; + ZXIC_UINT32 smmu0_int25_en4; + ZXIC_UINT32 smmu0_int25_en3; + ZXIC_UINT32 smmu0_int25_en2; + ZXIC_UINT32 smmu0_int25_en1; + ZXIC_UINT32 smmu0_int25_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT25_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int25_mask_t +{ + ZXIC_UINT32 smmu0_int25_mask31; + ZXIC_UINT32 smmu0_int25_mask30; + ZXIC_UINT32 smmu0_int25_mask29; + ZXIC_UINT32 smmu0_int25_mask28; + ZXIC_UINT32 smmu0_int25_mask27; + ZXIC_UINT32 smmu0_int25_mask26; + ZXIC_UINT32 smmu0_int25_mask25; + ZXIC_UINT32 smmu0_int25_mask24; + ZXIC_UINT32 smmu0_int25_mask23; + ZXIC_UINT32 smmu0_int25_mask22; + ZXIC_UINT32 smmu0_int25_mask21; + ZXIC_UINT32 smmu0_int25_mask20; + ZXIC_UINT32 smmu0_int25_mask19; + ZXIC_UINT32 smmu0_int25_mask18; + ZXIC_UINT32 smmu0_int25_mask17; + ZXIC_UINT32 smmu0_int25_mask16; + ZXIC_UINT32 smmu0_int25_mask15; + ZXIC_UINT32 smmu0_int25_mask14; + ZXIC_UINT32 smmu0_int25_mask13; + ZXIC_UINT32 smmu0_int25_mask12; + ZXIC_UINT32 smmu0_int25_mask11; + ZXIC_UINT32 smmu0_int25_mask10; + ZXIC_UINT32 smmu0_int25_mask9; + ZXIC_UINT32 smmu0_int25_mask8; + ZXIC_UINT32 smmu0_int25_mask7; + ZXIC_UINT32 smmu0_int25_mask6; + ZXIC_UINT32 smmu0_int25_mask5; + ZXIC_UINT32 smmu0_int25_mask4; + ZXIC_UINT32 smmu0_int25_mask3; + ZXIC_UINT32 smmu0_int25_mask2; + ZXIC_UINT32 smmu0_int25_mask1; + ZXIC_UINT32 smmu0_int25_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT25_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int25_status_t +{ + ZXIC_UINT32 smmu0_int25_status31; + ZXIC_UINT32 smmu0_int25_status30; + ZXIC_UINT32 smmu0_int25_status29; + ZXIC_UINT32 smmu0_int25_status28; + ZXIC_UINT32 smmu0_int25_status27; + ZXIC_UINT32 smmu0_int25_status26; + ZXIC_UINT32 smmu0_int25_status25; + ZXIC_UINT32 smmu0_int25_status24; + ZXIC_UINT32 smmu0_int25_status23; + ZXIC_UINT32 smmu0_int25_status22; + ZXIC_UINT32 smmu0_int25_status21; + ZXIC_UINT32 smmu0_int25_status20; + ZXIC_UINT32 smmu0_int25_status19; + ZXIC_UINT32 smmu0_int25_status18; + ZXIC_UINT32 smmu0_int25_status17; + ZXIC_UINT32 smmu0_int25_status16; + ZXIC_UINT32 smmu0_int25_status15; + ZXIC_UINT32 smmu0_int25_status14; + ZXIC_UINT32 smmu0_int25_status13; + ZXIC_UINT32 smmu0_int25_status12; + ZXIC_UINT32 smmu0_int25_status11; + ZXIC_UINT32 smmu0_int25_status10; + ZXIC_UINT32 smmu0_int25_status9; + ZXIC_UINT32 smmu0_int25_status8; + ZXIC_UINT32 smmu0_int25_status7; + ZXIC_UINT32 smmu0_int25_status6; + ZXIC_UINT32 smmu0_int25_status5; + ZXIC_UINT32 smmu0_int25_status4; + ZXIC_UINT32 smmu0_int25_status3; + ZXIC_UINT32 smmu0_int25_status2; + ZXIC_UINT32 smmu0_int25_status1; + ZXIC_UINT32 smmu0_int25_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT25_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int26_en_t +{ + ZXIC_UINT32 smmu0_int26_en31; + ZXIC_UINT32 smmu0_int26_en30; + ZXIC_UINT32 smmu0_int26_en29; + ZXIC_UINT32 smmu0_int26_en28; + ZXIC_UINT32 smmu0_int26_en27; + ZXIC_UINT32 smmu0_int26_en26; + ZXIC_UINT32 smmu0_int26_en25; + ZXIC_UINT32 smmu0_int26_en24; + ZXIC_UINT32 smmu0_int26_en23; + ZXIC_UINT32 smmu0_int26_en22; + ZXIC_UINT32 smmu0_int26_en21; + ZXIC_UINT32 smmu0_int26_en20; + ZXIC_UINT32 smmu0_int26_en19; + ZXIC_UINT32 smmu0_int26_en18; + ZXIC_UINT32 smmu0_int26_en17; + ZXIC_UINT32 smmu0_int26_en16; + ZXIC_UINT32 smmu0_int26_en15; + ZXIC_UINT32 smmu0_int26_en14; + ZXIC_UINT32 smmu0_int26_en13; + ZXIC_UINT32 smmu0_int26_en12; + ZXIC_UINT32 smmu0_int26_en11; + ZXIC_UINT32 smmu0_int26_en10; + ZXIC_UINT32 smmu0_int26_en9; + ZXIC_UINT32 smmu0_int26_en8; + ZXIC_UINT32 smmu0_int26_en7; + ZXIC_UINT32 smmu0_int26_en6; + ZXIC_UINT32 smmu0_int26_en5; + ZXIC_UINT32 smmu0_int26_en4; + ZXIC_UINT32 smmu0_int26_en3; + ZXIC_UINT32 smmu0_int26_en2; + ZXIC_UINT32 smmu0_int26_en1; + ZXIC_UINT32 smmu0_int26_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT26_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int26_mask_t +{ + ZXIC_UINT32 smmu0_int26_mask31; + ZXIC_UINT32 smmu0_int26_mask30; + ZXIC_UINT32 smmu0_int26_mask29; + ZXIC_UINT32 smmu0_int26_mask28; + ZXIC_UINT32 smmu0_int26_mask27; + ZXIC_UINT32 smmu0_int26_mask26; + ZXIC_UINT32 smmu0_int26_mask25; + ZXIC_UINT32 smmu0_int26_mask24; + ZXIC_UINT32 smmu0_int26_mask23; + ZXIC_UINT32 smmu0_int26_mask22; + ZXIC_UINT32 smmu0_int26_mask21; + ZXIC_UINT32 smmu0_int26_mask20; + ZXIC_UINT32 smmu0_int26_mask19; + ZXIC_UINT32 smmu0_int26_mask18; + ZXIC_UINT32 smmu0_int26_mask17; + ZXIC_UINT32 smmu0_int26_mask16; + ZXIC_UINT32 smmu0_int26_mask15; + ZXIC_UINT32 smmu0_int26_mask14; + ZXIC_UINT32 smmu0_int26_mask13; + ZXIC_UINT32 smmu0_int26_mask12; + ZXIC_UINT32 smmu0_int26_mask11; + ZXIC_UINT32 smmu0_int26_mask10; + ZXIC_UINT32 smmu0_int26_mask9; + ZXIC_UINT32 smmu0_int26_mask8; + ZXIC_UINT32 smmu0_int26_mask7; + ZXIC_UINT32 smmu0_int26_mask6; + ZXIC_UINT32 smmu0_int26_mask5; + ZXIC_UINT32 smmu0_int26_mask4; + ZXIC_UINT32 smmu0_int26_mask3; + ZXIC_UINT32 smmu0_int26_mask2; + ZXIC_UINT32 smmu0_int26_mask1; + ZXIC_UINT32 smmu0_int26_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT26_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int26_status_t +{ + ZXIC_UINT32 smmu0_int26_status31; + ZXIC_UINT32 smmu0_int26_status30; + ZXIC_UINT32 smmu0_int26_status29; + ZXIC_UINT32 smmu0_int26_status28; + ZXIC_UINT32 smmu0_int26_status27; + ZXIC_UINT32 smmu0_int26_status26; + ZXIC_UINT32 smmu0_int26_status25; + ZXIC_UINT32 smmu0_int26_status24; + ZXIC_UINT32 smmu0_int26_status23; + ZXIC_UINT32 smmu0_int26_status22; + ZXIC_UINT32 smmu0_int26_status21; + ZXIC_UINT32 smmu0_int26_status20; + ZXIC_UINT32 smmu0_int26_status19; + ZXIC_UINT32 smmu0_int26_status18; + ZXIC_UINT32 smmu0_int26_status17; + ZXIC_UINT32 smmu0_int26_status16; + ZXIC_UINT32 smmu0_int26_status15; + ZXIC_UINT32 smmu0_int26_status14; + ZXIC_UINT32 smmu0_int26_status13; + ZXIC_UINT32 smmu0_int26_status12; + ZXIC_UINT32 smmu0_int26_status11; + ZXIC_UINT32 smmu0_int26_status10; + ZXIC_UINT32 smmu0_int26_status9; + ZXIC_UINT32 smmu0_int26_status8; + ZXIC_UINT32 smmu0_int26_status7; + ZXIC_UINT32 smmu0_int26_status6; + ZXIC_UINT32 smmu0_int26_status5; + ZXIC_UINT32 smmu0_int26_status4; + ZXIC_UINT32 smmu0_int26_status3; + ZXIC_UINT32 smmu0_int26_status2; + ZXIC_UINT32 smmu0_int26_status1; + ZXIC_UINT32 smmu0_int26_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT26_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int27_en_t +{ + ZXIC_UINT32 smmu0_int27_en31; + ZXIC_UINT32 smmu0_int27_en30; + ZXIC_UINT32 smmu0_int27_en29; + ZXIC_UINT32 smmu0_int27_en28; + ZXIC_UINT32 smmu0_int27_en27; + ZXIC_UINT32 smmu0_int27_en26; + ZXIC_UINT32 smmu0_int27_en25; + ZXIC_UINT32 smmu0_int27_en24; + ZXIC_UINT32 smmu0_int27_en23; + ZXIC_UINT32 smmu0_int27_en22; + ZXIC_UINT32 smmu0_int27_en21; + ZXIC_UINT32 smmu0_int27_en20; + ZXIC_UINT32 smmu0_int27_en19; + ZXIC_UINT32 smmu0_int27_en18; + ZXIC_UINT32 smmu0_int27_en17; + ZXIC_UINT32 smmu0_int27_en16; + ZXIC_UINT32 smmu0_int27_en15; + ZXIC_UINT32 smmu0_int27_en14; + ZXIC_UINT32 smmu0_int27_en13; + ZXIC_UINT32 smmu0_int27_en12; + ZXIC_UINT32 smmu0_int27_en11; + ZXIC_UINT32 smmu0_int27_en10; + ZXIC_UINT32 smmu0_int27_en9; + ZXIC_UINT32 smmu0_int27_en8; + ZXIC_UINT32 smmu0_int27_en7; + ZXIC_UINT32 smmu0_int27_en6; + ZXIC_UINT32 smmu0_int27_en5; + ZXIC_UINT32 smmu0_int27_en4; + ZXIC_UINT32 smmu0_int27_en3; + ZXIC_UINT32 smmu0_int27_en2; + ZXIC_UINT32 smmu0_int27_en1; + ZXIC_UINT32 smmu0_int27_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT27_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int27_mask_t +{ + ZXIC_UINT32 smmu0_int27_mask31; + ZXIC_UINT32 smmu0_int27_mask30; + ZXIC_UINT32 smmu0_int27_mask29; + ZXIC_UINT32 smmu0_int27_mask28; + ZXIC_UINT32 smmu0_int27_mask27; + ZXIC_UINT32 smmu0_int27_mask26; + ZXIC_UINT32 smmu0_int27_mask25; + ZXIC_UINT32 smmu0_int27_mask24; + ZXIC_UINT32 smmu0_int27_mask23; + ZXIC_UINT32 smmu0_int27_mask22; + ZXIC_UINT32 smmu0_int27_mask21; + ZXIC_UINT32 smmu0_int27_mask20; + ZXIC_UINT32 smmu0_int27_mask19; + ZXIC_UINT32 smmu0_int27_mask18; + ZXIC_UINT32 smmu0_int27_mask17; + ZXIC_UINT32 smmu0_int27_mask16; + ZXIC_UINT32 smmu0_int27_mask15; + ZXIC_UINT32 smmu0_int27_mask14; + ZXIC_UINT32 smmu0_int27_mask13; + ZXIC_UINT32 smmu0_int27_mask12; + ZXIC_UINT32 smmu0_int27_mask11; + ZXIC_UINT32 smmu0_int27_mask10; + ZXIC_UINT32 smmu0_int27_mask9; + ZXIC_UINT32 smmu0_int27_mask8; + ZXIC_UINT32 smmu0_int27_mask7; + ZXIC_UINT32 smmu0_int27_mask6; + ZXIC_UINT32 smmu0_int27_mask5; + ZXIC_UINT32 smmu0_int27_mask4; + ZXIC_UINT32 smmu0_int27_mask3; + ZXIC_UINT32 smmu0_int27_mask2; + ZXIC_UINT32 smmu0_int27_mask1; + ZXIC_UINT32 smmu0_int27_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT27_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int27_status_t +{ + ZXIC_UINT32 smmu0_int27_status31; + ZXIC_UINT32 smmu0_int27_status30; + ZXIC_UINT32 smmu0_int27_status29; + ZXIC_UINT32 smmu0_int27_status28; + ZXIC_UINT32 smmu0_int27_status27; + ZXIC_UINT32 smmu0_int27_status26; + ZXIC_UINT32 smmu0_int27_status25; + ZXIC_UINT32 smmu0_int27_status24; + ZXIC_UINT32 smmu0_int27_status23; + ZXIC_UINT32 smmu0_int27_status22; + ZXIC_UINT32 smmu0_int27_status21; + ZXIC_UINT32 smmu0_int27_status20; + ZXIC_UINT32 smmu0_int27_status19; + ZXIC_UINT32 smmu0_int27_status18; + ZXIC_UINT32 smmu0_int27_status17; + ZXIC_UINT32 smmu0_int27_status16; + ZXIC_UINT32 smmu0_int27_status15; + ZXIC_UINT32 smmu0_int27_status14; + ZXIC_UINT32 smmu0_int27_status13; + ZXIC_UINT32 smmu0_int27_status12; + ZXIC_UINT32 smmu0_int27_status11; + ZXIC_UINT32 smmu0_int27_status10; + ZXIC_UINT32 smmu0_int27_status9; + ZXIC_UINT32 smmu0_int27_status8; + ZXIC_UINT32 smmu0_int27_status7; + ZXIC_UINT32 smmu0_int27_status6; + ZXIC_UINT32 smmu0_int27_status5; + ZXIC_UINT32 smmu0_int27_status4; + ZXIC_UINT32 smmu0_int27_status3; + ZXIC_UINT32 smmu0_int27_status2; + ZXIC_UINT32 smmu0_int27_status1; + ZXIC_UINT32 smmu0_int27_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT27_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int28_en_t +{ + ZXIC_UINT32 smmu0_int28_en31; + ZXIC_UINT32 smmu0_int28_en30; + ZXIC_UINT32 smmu0_int28_en29; + ZXIC_UINT32 smmu0_int28_en28; + ZXIC_UINT32 smmu0_int28_en27; + ZXIC_UINT32 smmu0_int28_en26; + ZXIC_UINT32 smmu0_int28_en25; + ZXIC_UINT32 smmu0_int28_en24; + ZXIC_UINT32 smmu0_int28_en23; + ZXIC_UINT32 smmu0_int28_en22; + ZXIC_UINT32 smmu0_int28_en21; + ZXIC_UINT32 smmu0_int28_en20; + ZXIC_UINT32 smmu0_int28_en19; + ZXIC_UINT32 smmu0_int28_en18; + ZXIC_UINT32 smmu0_int28_en17; + ZXIC_UINT32 smmu0_int28_en16; + ZXIC_UINT32 smmu0_int28_en15; + ZXIC_UINT32 smmu0_int28_en14; + ZXIC_UINT32 smmu0_int28_en13; + ZXIC_UINT32 smmu0_int28_en12; + ZXIC_UINT32 smmu0_int28_en11; + ZXIC_UINT32 smmu0_int28_en10; + ZXIC_UINT32 smmu0_int28_en9; + ZXIC_UINT32 smmu0_int28_en8; + ZXIC_UINT32 smmu0_int28_en7; + ZXIC_UINT32 smmu0_int28_en6; + ZXIC_UINT32 smmu0_int28_en5; + ZXIC_UINT32 smmu0_int28_en4; + ZXIC_UINT32 smmu0_int28_en3; + ZXIC_UINT32 smmu0_int28_en2; + ZXIC_UINT32 smmu0_int28_en1; + ZXIC_UINT32 smmu0_int28_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT28_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int28_mask_t +{ + ZXIC_UINT32 smmu0_int28_mask31; + ZXIC_UINT32 smmu0_int28_mask30; + ZXIC_UINT32 smmu0_int28_mask29; + ZXIC_UINT32 smmu0_int28_mask28; + ZXIC_UINT32 smmu0_int28_mask27; + ZXIC_UINT32 smmu0_int28_mask26; + ZXIC_UINT32 smmu0_int28_mask25; + ZXIC_UINT32 smmu0_int28_mask24; + ZXIC_UINT32 smmu0_int28_mask23; + ZXIC_UINT32 smmu0_int28_mask22; + ZXIC_UINT32 smmu0_int28_mask21; + ZXIC_UINT32 smmu0_int28_mask20; + ZXIC_UINT32 smmu0_int28_mask19; + ZXIC_UINT32 smmu0_int28_mask18; + ZXIC_UINT32 smmu0_int28_mask17; + ZXIC_UINT32 smmu0_int28_mask16; + ZXIC_UINT32 smmu0_int28_mask15; + ZXIC_UINT32 smmu0_int28_mask14; + ZXIC_UINT32 smmu0_int28_mask13; + ZXIC_UINT32 smmu0_int28_mask12; + ZXIC_UINT32 smmu0_int28_mask11; + ZXIC_UINT32 smmu0_int28_mask10; + ZXIC_UINT32 smmu0_int28_mask9; + ZXIC_UINT32 smmu0_int28_mask8; + ZXIC_UINT32 smmu0_int28_mask7; + ZXIC_UINT32 smmu0_int28_mask6; + ZXIC_UINT32 smmu0_int28_mask5; + ZXIC_UINT32 smmu0_int28_mask4; + ZXIC_UINT32 smmu0_int28_mask3; + ZXIC_UINT32 smmu0_int28_mask2; + ZXIC_UINT32 smmu0_int28_mask1; + ZXIC_UINT32 smmu0_int28_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT28_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int28_status_t +{ + ZXIC_UINT32 smmu0_int28_status31; + ZXIC_UINT32 smmu0_int28_status30; + ZXIC_UINT32 smmu0_int28_status29; + ZXIC_UINT32 smmu0_int28_status28; + ZXIC_UINT32 smmu0_int28_status27; + ZXIC_UINT32 smmu0_int28_status26; + ZXIC_UINT32 smmu0_int28_status25; + ZXIC_UINT32 smmu0_int28_status24; + ZXIC_UINT32 smmu0_int28_status23; + ZXIC_UINT32 smmu0_int28_status22; + ZXIC_UINT32 smmu0_int28_status21; + ZXIC_UINT32 smmu0_int28_status20; + ZXIC_UINT32 smmu0_int28_status19; + ZXIC_UINT32 smmu0_int28_status18; + ZXIC_UINT32 smmu0_int28_status17; + ZXIC_UINT32 smmu0_int28_status16; + ZXIC_UINT32 smmu0_int28_status15; + ZXIC_UINT32 smmu0_int28_status14; + ZXIC_UINT32 smmu0_int28_status13; + ZXIC_UINT32 smmu0_int28_status12; + ZXIC_UINT32 smmu0_int28_status11; + ZXIC_UINT32 smmu0_int28_status10; + ZXIC_UINT32 smmu0_int28_status9; + ZXIC_UINT32 smmu0_int28_status8; + ZXIC_UINT32 smmu0_int28_status7; + ZXIC_UINT32 smmu0_int28_status6; + ZXIC_UINT32 smmu0_int28_status5; + ZXIC_UINT32 smmu0_int28_status4; + ZXIC_UINT32 smmu0_int28_status3; + ZXIC_UINT32 smmu0_int28_status2; + ZXIC_UINT32 smmu0_int28_status1; + ZXIC_UINT32 smmu0_int28_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT28_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int29_en_t +{ + ZXIC_UINT32 smmu0_int29_en31; + ZXIC_UINT32 smmu0_int29_en30; + ZXIC_UINT32 smmu0_int29_en29; + ZXIC_UINT32 smmu0_int29_en28; + ZXIC_UINT32 smmu0_int29_en27; + ZXIC_UINT32 smmu0_int29_en26; + ZXIC_UINT32 smmu0_int29_en25; + ZXIC_UINT32 smmu0_int29_en24; + ZXIC_UINT32 smmu0_int29_en23; + ZXIC_UINT32 smmu0_int29_en22; + ZXIC_UINT32 smmu0_int29_en21; + ZXIC_UINT32 smmu0_int29_en20; + ZXIC_UINT32 smmu0_int29_en19; + ZXIC_UINT32 smmu0_int29_en18; + ZXIC_UINT32 smmu0_int29_en17; + ZXIC_UINT32 smmu0_int29_en16; + ZXIC_UINT32 smmu0_int29_en15; + ZXIC_UINT32 smmu0_int29_en14; + ZXIC_UINT32 smmu0_int29_en13; + ZXIC_UINT32 smmu0_int29_en12; + ZXIC_UINT32 smmu0_int29_en11; + ZXIC_UINT32 smmu0_int29_en10; + ZXIC_UINT32 smmu0_int29_en9; + ZXIC_UINT32 smmu0_int29_en8; + ZXIC_UINT32 smmu0_int29_en7; + ZXIC_UINT32 smmu0_int29_en6; + ZXIC_UINT32 smmu0_int29_en5; + ZXIC_UINT32 smmu0_int29_en4; + ZXIC_UINT32 smmu0_int29_en3; + ZXIC_UINT32 smmu0_int29_en2; + ZXIC_UINT32 smmu0_int29_en1; + ZXIC_UINT32 smmu0_int29_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT29_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int29_mask_t +{ + ZXIC_UINT32 smmu0_int29_mask31; + ZXIC_UINT32 smmu0_int29_mask30; + ZXIC_UINT32 smmu0_int29_mask29; + ZXIC_UINT32 smmu0_int29_mask28; + ZXIC_UINT32 smmu0_int29_mask27; + ZXIC_UINT32 smmu0_int29_mask26; + ZXIC_UINT32 smmu0_int29_mask25; + ZXIC_UINT32 smmu0_int29_mask24; + ZXIC_UINT32 smmu0_int29_mask23; + ZXIC_UINT32 smmu0_int29_mask22; + ZXIC_UINT32 smmu0_int29_mask21; + ZXIC_UINT32 smmu0_int29_mask20; + ZXIC_UINT32 smmu0_int29_mask19; + ZXIC_UINT32 smmu0_int29_mask18; + ZXIC_UINT32 smmu0_int29_mask17; + ZXIC_UINT32 smmu0_int29_mask16; + ZXIC_UINT32 smmu0_int29_mask15; + ZXIC_UINT32 smmu0_int29_mask14; + ZXIC_UINT32 smmu0_int29_mask13; + ZXIC_UINT32 smmu0_int29_mask12; + ZXIC_UINT32 smmu0_int29_mask11; + ZXIC_UINT32 smmu0_int29_mask10; + ZXIC_UINT32 smmu0_int29_mask9; + ZXIC_UINT32 smmu0_int29_mask8; + ZXIC_UINT32 smmu0_int29_mask7; + ZXIC_UINT32 smmu0_int29_mask6; + ZXIC_UINT32 smmu0_int29_mask5; + ZXIC_UINT32 smmu0_int29_mask4; + ZXIC_UINT32 smmu0_int29_mask3; + ZXIC_UINT32 smmu0_int29_mask2; + ZXIC_UINT32 smmu0_int29_mask1; + ZXIC_UINT32 smmu0_int29_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT29_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int29_status_t +{ + ZXIC_UINT32 smmu0_int29_status31; + ZXIC_UINT32 smmu0_int29_status30; + ZXIC_UINT32 smmu0_int29_status29; + ZXIC_UINT32 smmu0_int29_status28; + ZXIC_UINT32 smmu0_int29_status27; + ZXIC_UINT32 smmu0_int29_status26; + ZXIC_UINT32 smmu0_int29_status25; + ZXIC_UINT32 smmu0_int29_status24; + ZXIC_UINT32 smmu0_int29_status23; + ZXIC_UINT32 smmu0_int29_status22; + ZXIC_UINT32 smmu0_int29_status21; + ZXIC_UINT32 smmu0_int29_status20; + ZXIC_UINT32 smmu0_int29_status19; + ZXIC_UINT32 smmu0_int29_status18; + ZXIC_UINT32 smmu0_int29_status17; + ZXIC_UINT32 smmu0_int29_status16; + ZXIC_UINT32 smmu0_int29_status15; + ZXIC_UINT32 smmu0_int29_status14; + ZXIC_UINT32 smmu0_int29_status13; + ZXIC_UINT32 smmu0_int29_status12; + ZXIC_UINT32 smmu0_int29_status11; + ZXIC_UINT32 smmu0_int29_status10; + ZXIC_UINT32 smmu0_int29_status9; + ZXIC_UINT32 smmu0_int29_status8; + ZXIC_UINT32 smmu0_int29_status7; + ZXIC_UINT32 smmu0_int29_status6; + ZXIC_UINT32 smmu0_int29_status5; + ZXIC_UINT32 smmu0_int29_status4; + ZXIC_UINT32 smmu0_int29_status3; + ZXIC_UINT32 smmu0_int29_status2; + ZXIC_UINT32 smmu0_int29_status1; + ZXIC_UINT32 smmu0_int29_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT29_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int30_en_t +{ + ZXIC_UINT32 smmu0_int30_en31; + ZXIC_UINT32 smmu0_int30_en30; + ZXIC_UINT32 smmu0_int30_en29; + ZXIC_UINT32 smmu0_int30_en28; + ZXIC_UINT32 smmu0_int30_en27; + ZXIC_UINT32 smmu0_int30_en26; + ZXIC_UINT32 smmu0_int30_en25; + ZXIC_UINT32 smmu0_int30_en24; + ZXIC_UINT32 smmu0_int30_en23; + ZXIC_UINT32 smmu0_int30_en22; + ZXIC_UINT32 smmu0_int30_en21; + ZXIC_UINT32 smmu0_int30_en20; + ZXIC_UINT32 smmu0_int30_en19; + ZXIC_UINT32 smmu0_int30_en18; + ZXIC_UINT32 smmu0_int30_en17; + ZXIC_UINT32 smmu0_int30_en16; + ZXIC_UINT32 smmu0_int30_en15; + ZXIC_UINT32 smmu0_int30_en14; + ZXIC_UINT32 smmu0_int30_en13; + ZXIC_UINT32 smmu0_int30_en12; + ZXIC_UINT32 smmu0_int30_en11; + ZXIC_UINT32 smmu0_int30_en10; + ZXIC_UINT32 smmu0_int30_en9; + ZXIC_UINT32 smmu0_int30_en8; + ZXIC_UINT32 smmu0_int30_en7; + ZXIC_UINT32 smmu0_int30_en6; + ZXIC_UINT32 smmu0_int30_en5; + ZXIC_UINT32 smmu0_int30_en4; + ZXIC_UINT32 smmu0_int30_en3; + ZXIC_UINT32 smmu0_int30_en2; + ZXIC_UINT32 smmu0_int30_en1; + ZXIC_UINT32 smmu0_int30_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT30_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int30_mask_t +{ + ZXIC_UINT32 smmu0_int30_mask31; + ZXIC_UINT32 smmu0_int30_mask30; + ZXIC_UINT32 smmu0_int30_mask29; + ZXIC_UINT32 smmu0_int30_mask28; + ZXIC_UINT32 smmu0_int30_mask27; + ZXIC_UINT32 smmu0_int30_mask26; + ZXIC_UINT32 smmu0_int30_mask25; + ZXIC_UINT32 smmu0_int30_mask24; + ZXIC_UINT32 smmu0_int30_mask23; + ZXIC_UINT32 smmu0_int30_mask22; + ZXIC_UINT32 smmu0_int30_mask21; + ZXIC_UINT32 smmu0_int30_mask20; + ZXIC_UINT32 smmu0_int30_mask19; + ZXIC_UINT32 smmu0_int30_mask18; + ZXIC_UINT32 smmu0_int30_mask17; + ZXIC_UINT32 smmu0_int30_mask16; + ZXIC_UINT32 smmu0_int30_mask15; + ZXIC_UINT32 smmu0_int30_mask14; + ZXIC_UINT32 smmu0_int30_mask13; + ZXIC_UINT32 smmu0_int30_mask12; + ZXIC_UINT32 smmu0_int30_mask11; + ZXIC_UINT32 smmu0_int30_mask10; + ZXIC_UINT32 smmu0_int30_mask9; + ZXIC_UINT32 smmu0_int30_mask8; + ZXIC_UINT32 smmu0_int30_mask7; + ZXIC_UINT32 smmu0_int30_mask6; + ZXIC_UINT32 smmu0_int30_mask5; + ZXIC_UINT32 smmu0_int30_mask4; + ZXIC_UINT32 smmu0_int30_mask3; + ZXIC_UINT32 smmu0_int30_mask2; + ZXIC_UINT32 smmu0_int30_mask1; + ZXIC_UINT32 smmu0_int30_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT30_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int30_status_t +{ + ZXIC_UINT32 smmu0_int30_status31; + ZXIC_UINT32 smmu0_int30_status30; + ZXIC_UINT32 smmu0_int30_status29; + ZXIC_UINT32 smmu0_int30_status28; + ZXIC_UINT32 smmu0_int30_status27; + ZXIC_UINT32 smmu0_int30_status26; + ZXIC_UINT32 smmu0_int30_status25; + ZXIC_UINT32 smmu0_int30_status24; + ZXIC_UINT32 smmu0_int30_status23; + ZXIC_UINT32 smmu0_int30_status22; + ZXIC_UINT32 smmu0_int30_status21; + ZXIC_UINT32 smmu0_int30_status20; + ZXIC_UINT32 smmu0_int30_status19; + ZXIC_UINT32 smmu0_int30_status18; + ZXIC_UINT32 smmu0_int30_status17; + ZXIC_UINT32 smmu0_int30_status16; + ZXIC_UINT32 smmu0_int30_status15; + ZXIC_UINT32 smmu0_int30_status14; + ZXIC_UINT32 smmu0_int30_status13; + ZXIC_UINT32 smmu0_int30_status12; + ZXIC_UINT32 smmu0_int30_status11; + ZXIC_UINT32 smmu0_int30_status10; + ZXIC_UINT32 smmu0_int30_status9; + ZXIC_UINT32 smmu0_int30_status8; + ZXIC_UINT32 smmu0_int30_status7; + ZXIC_UINT32 smmu0_int30_status6; + ZXIC_UINT32 smmu0_int30_status5; + ZXIC_UINT32 smmu0_int30_status4; + ZXIC_UINT32 smmu0_int30_status3; + ZXIC_UINT32 smmu0_int30_status2; + ZXIC_UINT32 smmu0_int30_status1; + ZXIC_UINT32 smmu0_int30_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT30_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int31_en_t +{ + ZXIC_UINT32 smmu0_int31_en31; + ZXIC_UINT32 smmu0_int31_en30; + ZXIC_UINT32 smmu0_int31_en29; + ZXIC_UINT32 smmu0_int31_en28; + ZXIC_UINT32 smmu0_int31_en27; + ZXIC_UINT32 smmu0_int31_en26; + ZXIC_UINT32 smmu0_int31_en25; + ZXIC_UINT32 smmu0_int31_en24; + ZXIC_UINT32 smmu0_int31_en23; + ZXIC_UINT32 smmu0_int31_en22; + ZXIC_UINT32 smmu0_int31_en21; + ZXIC_UINT32 smmu0_int31_en20; + ZXIC_UINT32 smmu0_int31_en19; + ZXIC_UINT32 smmu0_int31_en18; + ZXIC_UINT32 smmu0_int31_en17; + ZXIC_UINT32 smmu0_int31_en16; + ZXIC_UINT32 smmu0_int31_en15; + ZXIC_UINT32 smmu0_int31_en14; + ZXIC_UINT32 smmu0_int31_en13; + ZXIC_UINT32 smmu0_int31_en12; + ZXIC_UINT32 smmu0_int31_en11; + ZXIC_UINT32 smmu0_int31_en10; + ZXIC_UINT32 smmu0_int31_en9; + ZXIC_UINT32 smmu0_int31_en8; + ZXIC_UINT32 smmu0_int31_en7; + ZXIC_UINT32 smmu0_int31_en6; + ZXIC_UINT32 smmu0_int31_en5; + ZXIC_UINT32 smmu0_int31_en4; + ZXIC_UINT32 smmu0_int31_en3; + ZXIC_UINT32 smmu0_int31_en2; + ZXIC_UINT32 smmu0_int31_en1; + ZXIC_UINT32 smmu0_int31_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT31_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int31_mask_t +{ + ZXIC_UINT32 smmu0_int31_mask31; + ZXIC_UINT32 smmu0_int31_mask30; + ZXIC_UINT32 smmu0_int31_mask29; + ZXIC_UINT32 smmu0_int31_mask28; + ZXIC_UINT32 smmu0_int31_mask27; + ZXIC_UINT32 smmu0_int31_mask26; + ZXIC_UINT32 smmu0_int31_mask25; + ZXIC_UINT32 smmu0_int31_mask24; + ZXIC_UINT32 smmu0_int31_mask23; + ZXIC_UINT32 smmu0_int31_mask22; + ZXIC_UINT32 smmu0_int31_mask21; + ZXIC_UINT32 smmu0_int31_mask20; + ZXIC_UINT32 smmu0_int31_mask19; + ZXIC_UINT32 smmu0_int31_mask18; + ZXIC_UINT32 smmu0_int31_mask17; + ZXIC_UINT32 smmu0_int31_mask16; + ZXIC_UINT32 smmu0_int31_mask15; + ZXIC_UINT32 smmu0_int31_mask14; + ZXIC_UINT32 smmu0_int31_mask13; + ZXIC_UINT32 smmu0_int31_mask12; + ZXIC_UINT32 smmu0_int31_mask11; + ZXIC_UINT32 smmu0_int31_mask10; + ZXIC_UINT32 smmu0_int31_mask9; + ZXIC_UINT32 smmu0_int31_mask8; + ZXIC_UINT32 smmu0_int31_mask7; + ZXIC_UINT32 smmu0_int31_mask6; + ZXIC_UINT32 smmu0_int31_mask5; + ZXIC_UINT32 smmu0_int31_mask4; + ZXIC_UINT32 smmu0_int31_mask3; + ZXIC_UINT32 smmu0_int31_mask2; + ZXIC_UINT32 smmu0_int31_mask1; + ZXIC_UINT32 smmu0_int31_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT31_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int31_status_t +{ + ZXIC_UINT32 smmu0_int31_status31; + ZXIC_UINT32 smmu0_int31_status30; + ZXIC_UINT32 smmu0_int31_status29; + ZXIC_UINT32 smmu0_int31_status28; + ZXIC_UINT32 smmu0_int31_status27; + ZXIC_UINT32 smmu0_int31_status26; + ZXIC_UINT32 smmu0_int31_status25; + ZXIC_UINT32 smmu0_int31_status24; + ZXIC_UINT32 smmu0_int31_status23; + ZXIC_UINT32 smmu0_int31_status22; + ZXIC_UINT32 smmu0_int31_status21; + ZXIC_UINT32 smmu0_int31_status20; + ZXIC_UINT32 smmu0_int31_status19; + ZXIC_UINT32 smmu0_int31_status18; + ZXIC_UINT32 smmu0_int31_status17; + ZXIC_UINT32 smmu0_int31_status16; + ZXIC_UINT32 smmu0_int31_status15; + ZXIC_UINT32 smmu0_int31_status14; + ZXIC_UINT32 smmu0_int31_status13; + ZXIC_UINT32 smmu0_int31_status12; + ZXIC_UINT32 smmu0_int31_status11; + ZXIC_UINT32 smmu0_int31_status10; + ZXIC_UINT32 smmu0_int31_status9; + ZXIC_UINT32 smmu0_int31_status8; + ZXIC_UINT32 smmu0_int31_status7; + ZXIC_UINT32 smmu0_int31_status6; + ZXIC_UINT32 smmu0_int31_status5; + ZXIC_UINT32 smmu0_int31_status4; + ZXIC_UINT32 smmu0_int31_status3; + ZXIC_UINT32 smmu0_int31_status2; + ZXIC_UINT32 smmu0_int31_status1; + ZXIC_UINT32 smmu0_int31_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT31_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int32_en_t +{ + ZXIC_UINT32 smmu0_int32_en31; + ZXIC_UINT32 smmu0_int32_en30; + ZXIC_UINT32 smmu0_int32_en29; + ZXIC_UINT32 smmu0_int32_en28; + ZXIC_UINT32 smmu0_int32_en27; + ZXIC_UINT32 smmu0_int32_en26; + ZXIC_UINT32 smmu0_int32_en25; + ZXIC_UINT32 smmu0_int32_en24; + ZXIC_UINT32 smmu0_int32_en23; + ZXIC_UINT32 smmu0_int32_en22; + ZXIC_UINT32 smmu0_int32_en21; + ZXIC_UINT32 smmu0_int32_en20; + ZXIC_UINT32 smmu0_int32_en19; + ZXIC_UINT32 smmu0_int32_en18; + ZXIC_UINT32 smmu0_int32_en17; + ZXIC_UINT32 smmu0_int32_en16; + ZXIC_UINT32 smmu0_int32_en15; + ZXIC_UINT32 smmu0_int32_en14; + ZXIC_UINT32 smmu0_int32_en13; + ZXIC_UINT32 smmu0_int32_en12; + ZXIC_UINT32 smmu0_int32_en11; + ZXIC_UINT32 smmu0_int32_en10; + ZXIC_UINT32 smmu0_int32_en9; + ZXIC_UINT32 smmu0_int32_en8; + ZXIC_UINT32 smmu0_int32_en7; + ZXIC_UINT32 smmu0_int32_en6; + ZXIC_UINT32 smmu0_int32_en5; + ZXIC_UINT32 smmu0_int32_en4; + ZXIC_UINT32 smmu0_int32_en3; + ZXIC_UINT32 smmu0_int32_en2; + ZXIC_UINT32 smmu0_int32_en1; + ZXIC_UINT32 smmu0_int32_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT32_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int32_mask_t +{ + ZXIC_UINT32 smmu0_int32_mask31; + ZXIC_UINT32 smmu0_int32_mask30; + ZXIC_UINT32 smmu0_int32_mask29; + ZXIC_UINT32 smmu0_int32_mask28; + ZXIC_UINT32 smmu0_int32_mask27; + ZXIC_UINT32 smmu0_int32_mask26; + ZXIC_UINT32 smmu0_int32_mask25; + ZXIC_UINT32 smmu0_int32_mask24; + ZXIC_UINT32 smmu0_int32_mask23; + ZXIC_UINT32 smmu0_int32_mask22; + ZXIC_UINT32 smmu0_int32_mask21; + ZXIC_UINT32 smmu0_int32_mask20; + ZXIC_UINT32 smmu0_int32_mask19; + ZXIC_UINT32 smmu0_int32_mask18; + ZXIC_UINT32 smmu0_int32_mask17; + ZXIC_UINT32 smmu0_int32_mask16; + ZXIC_UINT32 smmu0_int32_mask15; + ZXIC_UINT32 smmu0_int32_mask14; + ZXIC_UINT32 smmu0_int32_mask13; + ZXIC_UINT32 smmu0_int32_mask12; + ZXIC_UINT32 smmu0_int32_mask11; + ZXIC_UINT32 smmu0_int32_mask10; + ZXIC_UINT32 smmu0_int32_mask9; + ZXIC_UINT32 smmu0_int32_mask8; + ZXIC_UINT32 smmu0_int32_mask7; + ZXIC_UINT32 smmu0_int32_mask6; + ZXIC_UINT32 smmu0_int32_mask5; + ZXIC_UINT32 smmu0_int32_mask4; + ZXIC_UINT32 smmu0_int32_mask3; + ZXIC_UINT32 smmu0_int32_mask2; + ZXIC_UINT32 smmu0_int32_mask1; + ZXIC_UINT32 smmu0_int32_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT32_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int32_status_t +{ + ZXIC_UINT32 smmu0_int32_status31; + ZXIC_UINT32 smmu0_int32_status30; + ZXIC_UINT32 smmu0_int32_status29; + ZXIC_UINT32 smmu0_int32_status28; + ZXIC_UINT32 smmu0_int32_status27; + ZXIC_UINT32 smmu0_int32_status26; + ZXIC_UINT32 smmu0_int32_status25; + ZXIC_UINT32 smmu0_int32_status24; + ZXIC_UINT32 smmu0_int32_status23; + ZXIC_UINT32 smmu0_int32_status22; + ZXIC_UINT32 smmu0_int32_status21; + ZXIC_UINT32 smmu0_int32_status20; + ZXIC_UINT32 smmu0_int32_status19; + ZXIC_UINT32 smmu0_int32_status18; + ZXIC_UINT32 smmu0_int32_status17; + ZXIC_UINT32 smmu0_int32_status16; + ZXIC_UINT32 smmu0_int32_status15; + ZXIC_UINT32 smmu0_int32_status14; + ZXIC_UINT32 smmu0_int32_status13; + ZXIC_UINT32 smmu0_int32_status12; + ZXIC_UINT32 smmu0_int32_status11; + ZXIC_UINT32 smmu0_int32_status10; + ZXIC_UINT32 smmu0_int32_status9; + ZXIC_UINT32 smmu0_int32_status8; + ZXIC_UINT32 smmu0_int32_status7; + ZXIC_UINT32 smmu0_int32_status6; + ZXIC_UINT32 smmu0_int32_status5; + ZXIC_UINT32 smmu0_int32_status4; + ZXIC_UINT32 smmu0_int32_status3; + ZXIC_UINT32 smmu0_int32_status2; + ZXIC_UINT32 smmu0_int32_status1; + ZXIC_UINT32 smmu0_int32_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT32_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int33_en_t +{ + ZXIC_UINT32 smmu0_int33_en31; + ZXIC_UINT32 smmu0_int33_en30; + ZXIC_UINT32 smmu0_int33_en29; + ZXIC_UINT32 smmu0_int33_en28; + ZXIC_UINT32 smmu0_int33_en27; + ZXIC_UINT32 smmu0_int33_en26; + ZXIC_UINT32 smmu0_int33_en25; + ZXIC_UINT32 smmu0_int33_en24; + ZXIC_UINT32 smmu0_int33_en23; + ZXIC_UINT32 smmu0_int33_en22; + ZXIC_UINT32 smmu0_int33_en21; + ZXIC_UINT32 smmu0_int33_en20; + ZXIC_UINT32 smmu0_int33_en19; + ZXIC_UINT32 smmu0_int33_en18; + ZXIC_UINT32 smmu0_int33_en17; + ZXIC_UINT32 smmu0_int33_en16; + ZXIC_UINT32 smmu0_int33_en15; + ZXIC_UINT32 smmu0_int33_en14; + ZXIC_UINT32 smmu0_int33_en13; + ZXIC_UINT32 smmu0_int33_en12; + ZXIC_UINT32 smmu0_int33_en11; + ZXIC_UINT32 smmu0_int33_en10; + ZXIC_UINT32 smmu0_int33_en9; + ZXIC_UINT32 smmu0_int33_en8; + ZXIC_UINT32 smmu0_int33_en7; + ZXIC_UINT32 smmu0_int33_en6; + ZXIC_UINT32 smmu0_int33_en5; + ZXIC_UINT32 smmu0_int33_en4; + ZXIC_UINT32 smmu0_int33_en3; + ZXIC_UINT32 smmu0_int33_en2; + ZXIC_UINT32 smmu0_int33_en1; + ZXIC_UINT32 smmu0_int33_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT33_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int33_mask_t +{ + ZXIC_UINT32 smmu0_int33_mask31; + ZXIC_UINT32 smmu0_int33_mask30; + ZXIC_UINT32 smmu0_int33_mask29; + ZXIC_UINT32 smmu0_int33_mask28; + ZXIC_UINT32 smmu0_int33_mask27; + ZXIC_UINT32 smmu0_int33_mask26; + ZXIC_UINT32 smmu0_int33_mask25; + ZXIC_UINT32 smmu0_int33_mask24; + ZXIC_UINT32 smmu0_int33_mask23; + ZXIC_UINT32 smmu0_int33_mask22; + ZXIC_UINT32 smmu0_int33_mask21; + ZXIC_UINT32 smmu0_int33_mask20; + ZXIC_UINT32 smmu0_int33_mask19; + ZXIC_UINT32 smmu0_int33_mask18; + ZXIC_UINT32 smmu0_int33_mask17; + ZXIC_UINT32 smmu0_int33_mask16; + ZXIC_UINT32 smmu0_int33_mask15; + ZXIC_UINT32 smmu0_int33_mask14; + ZXIC_UINT32 smmu0_int33_mask13; + ZXIC_UINT32 smmu0_int33_mask12; + ZXIC_UINT32 smmu0_int33_mask11; + ZXIC_UINT32 smmu0_int33_mask10; + ZXIC_UINT32 smmu0_int33_mask9; + ZXIC_UINT32 smmu0_int33_mask8; + ZXIC_UINT32 smmu0_int33_mask7; + ZXIC_UINT32 smmu0_int33_mask6; + ZXIC_UINT32 smmu0_int33_mask5; + ZXIC_UINT32 smmu0_int33_mask4; + ZXIC_UINT32 smmu0_int33_mask3; + ZXIC_UINT32 smmu0_int33_mask2; + ZXIC_UINT32 smmu0_int33_mask1; + ZXIC_UINT32 smmu0_int33_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT33_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int33_status_t +{ + ZXIC_UINT32 smmu0_int33_status31; + ZXIC_UINT32 smmu0_int33_status30; + ZXIC_UINT32 smmu0_int33_status29; + ZXIC_UINT32 smmu0_int33_status28; + ZXIC_UINT32 smmu0_int33_status27; + ZXIC_UINT32 smmu0_int33_status26; + ZXIC_UINT32 smmu0_int33_status25; + ZXIC_UINT32 smmu0_int33_status24; + ZXIC_UINT32 smmu0_int33_status23; + ZXIC_UINT32 smmu0_int33_status22; + ZXIC_UINT32 smmu0_int33_status21; + ZXIC_UINT32 smmu0_int33_status20; + ZXIC_UINT32 smmu0_int33_status19; + ZXIC_UINT32 smmu0_int33_status18; + ZXIC_UINT32 smmu0_int33_status17; + ZXIC_UINT32 smmu0_int33_status16; + ZXIC_UINT32 smmu0_int33_status15; + ZXIC_UINT32 smmu0_int33_status14; + ZXIC_UINT32 smmu0_int33_status13; + ZXIC_UINT32 smmu0_int33_status12; + ZXIC_UINT32 smmu0_int33_status11; + ZXIC_UINT32 smmu0_int33_status10; + ZXIC_UINT32 smmu0_int33_status9; + ZXIC_UINT32 smmu0_int33_status8; + ZXIC_UINT32 smmu0_int33_status7; + ZXIC_UINT32 smmu0_int33_status6; + ZXIC_UINT32 smmu0_int33_status5; + ZXIC_UINT32 smmu0_int33_status4; + ZXIC_UINT32 smmu0_int33_status3; + ZXIC_UINT32 smmu0_int33_status2; + ZXIC_UINT32 smmu0_int33_status1; + ZXIC_UINT32 smmu0_int33_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT33_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int34_en_t +{ + ZXIC_UINT32 smmu0_int34_en31; + ZXIC_UINT32 smmu0_int34_en30; + ZXIC_UINT32 smmu0_int34_en29; + ZXIC_UINT32 smmu0_int34_en28; + ZXIC_UINT32 smmu0_int34_en27; + ZXIC_UINT32 smmu0_int34_en26; + ZXIC_UINT32 smmu0_int34_en25; + ZXIC_UINT32 smmu0_int34_en24; + ZXIC_UINT32 smmu0_int34_en23; + ZXIC_UINT32 smmu0_int34_en22; + ZXIC_UINT32 smmu0_int34_en21; + ZXIC_UINT32 smmu0_int34_en20; + ZXIC_UINT32 smmu0_int34_en19; + ZXIC_UINT32 smmu0_int34_en18; + ZXIC_UINT32 smmu0_int34_en17; + ZXIC_UINT32 smmu0_int34_en16; + ZXIC_UINT32 smmu0_int34_en15; + ZXIC_UINT32 smmu0_int34_en14; + ZXIC_UINT32 smmu0_int34_en13; + ZXIC_UINT32 smmu0_int34_en12; + ZXIC_UINT32 smmu0_int34_en11; + ZXIC_UINT32 smmu0_int34_en10; + ZXIC_UINT32 smmu0_int34_en9; + ZXIC_UINT32 smmu0_int34_en8; + ZXIC_UINT32 smmu0_int34_en7; + ZXIC_UINT32 smmu0_int34_en6; + ZXIC_UINT32 smmu0_int34_en5; + ZXIC_UINT32 smmu0_int34_en4; + ZXIC_UINT32 smmu0_int34_en3; + ZXIC_UINT32 smmu0_int34_en2; + ZXIC_UINT32 smmu0_int34_en1; + ZXIC_UINT32 smmu0_int34_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT34_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int34_mask_t +{ + ZXIC_UINT32 smmu0_int34_mask31; + ZXIC_UINT32 smmu0_int34_mask30; + ZXIC_UINT32 smmu0_int34_mask29; + ZXIC_UINT32 smmu0_int34_mask28; + ZXIC_UINT32 smmu0_int34_mask27; + ZXIC_UINT32 smmu0_int34_mask26; + ZXIC_UINT32 smmu0_int34_mask25; + ZXIC_UINT32 smmu0_int34_mask24; + ZXIC_UINT32 smmu0_int34_mask23; + ZXIC_UINT32 smmu0_int34_mask22; + ZXIC_UINT32 smmu0_int34_mask21; + ZXIC_UINT32 smmu0_int34_mask20; + ZXIC_UINT32 smmu0_int34_mask19; + ZXIC_UINT32 smmu0_int34_mask18; + ZXIC_UINT32 smmu0_int34_mask17; + ZXIC_UINT32 smmu0_int34_mask16; + ZXIC_UINT32 smmu0_int34_mask15; + ZXIC_UINT32 smmu0_int34_mask14; + ZXIC_UINT32 smmu0_int34_mask13; + ZXIC_UINT32 smmu0_int34_mask12; + ZXIC_UINT32 smmu0_int34_mask11; + ZXIC_UINT32 smmu0_int34_mask10; + ZXIC_UINT32 smmu0_int34_mask9; + ZXIC_UINT32 smmu0_int34_mask8; + ZXIC_UINT32 smmu0_int34_mask7; + ZXIC_UINT32 smmu0_int34_mask6; + ZXIC_UINT32 smmu0_int34_mask5; + ZXIC_UINT32 smmu0_int34_mask4; + ZXIC_UINT32 smmu0_int34_mask3; + ZXIC_UINT32 smmu0_int34_mask2; + ZXIC_UINT32 smmu0_int34_mask1; + ZXIC_UINT32 smmu0_int34_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT34_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int34_status_t +{ + ZXIC_UINT32 smmu0_int34_status31; + ZXIC_UINT32 smmu0_int34_status30; + ZXIC_UINT32 smmu0_int34_status29; + ZXIC_UINT32 smmu0_int34_status28; + ZXIC_UINT32 smmu0_int34_status27; + ZXIC_UINT32 smmu0_int34_status26; + ZXIC_UINT32 smmu0_int34_status25; + ZXIC_UINT32 smmu0_int34_status24; + ZXIC_UINT32 smmu0_int34_status23; + ZXIC_UINT32 smmu0_int34_status22; + ZXIC_UINT32 smmu0_int34_status21; + ZXIC_UINT32 smmu0_int34_status20; + ZXIC_UINT32 smmu0_int34_status19; + ZXIC_UINT32 smmu0_int34_status18; + ZXIC_UINT32 smmu0_int34_status17; + ZXIC_UINT32 smmu0_int34_status16; + ZXIC_UINT32 smmu0_int34_status15; + ZXIC_UINT32 smmu0_int34_status14; + ZXIC_UINT32 smmu0_int34_status13; + ZXIC_UINT32 smmu0_int34_status12; + ZXIC_UINT32 smmu0_int34_status11; + ZXIC_UINT32 smmu0_int34_status10; + ZXIC_UINT32 smmu0_int34_status9; + ZXIC_UINT32 smmu0_int34_status8; + ZXIC_UINT32 smmu0_int34_status7; + ZXIC_UINT32 smmu0_int34_status6; + ZXIC_UINT32 smmu0_int34_status5; + ZXIC_UINT32 smmu0_int34_status4; + ZXIC_UINT32 smmu0_int34_status3; + ZXIC_UINT32 smmu0_int34_status2; + ZXIC_UINT32 smmu0_int34_status1; + ZXIC_UINT32 smmu0_int34_status0; +}DPP_SMMU0_SMMU0_SMMU0_INT34_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int35_en_t +{ + ZXIC_UINT32 smmu0_int35_en0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT35_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int35_mask_t +{ + ZXIC_UINT32 smmu0_int35_mask0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT35_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int35_status_t +{ + ZXIC_UINT32 smmu0_int35_status0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT35_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int36_en_t +{ + ZXIC_UINT32 smmu0_int36_en0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT36_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int36_mask_t +{ + ZXIC_UINT32 smmu0_int36_mask0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT36_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int36_status_t +{ + ZXIC_UINT32 smmu0_int36_status0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT36_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int37_en_t +{ + ZXIC_UINT32 smmu0_int37_en0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT37_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int37_mask_t +{ + ZXIC_UINT32 smmu0_int37_mask0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT37_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int37_status_t +{ + ZXIC_UINT32 smmu0_int37_status0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT37_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int38_en_t +{ + ZXIC_UINT32 smmu0_int38_en0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT38_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int38_mask_t +{ + ZXIC_UINT32 smmu0_int38_mask0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT38_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int38_status_t +{ + ZXIC_UINT32 smmu0_int38_status0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT38_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int39_en_t +{ + ZXIC_UINT32 smmu0_int39_en0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT39_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int39_mask_t +{ + ZXIC_UINT32 smmu0_int39_mask0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT39_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int39_status_t +{ + ZXIC_UINT32 smmu0_int39_status0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT39_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int40_en_t +{ + ZXIC_UINT32 smmu0_int40_en0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT40_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int40_mask_t +{ + ZXIC_UINT32 smmu0_int40_mask0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT40_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int40_status_t +{ + ZXIC_UINT32 smmu0_int40_status0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT40_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int41_en_t +{ + ZXIC_UINT32 smmu0_int41_en0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT41_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int41_mask_t +{ + ZXIC_UINT32 smmu0_int41_mask0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT41_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int41_status_t +{ + ZXIC_UINT32 smmu0_int41_status0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT41_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int42_en_t +{ + ZXIC_UINT32 smmu0_int42_en0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT42_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int42_mask_t +{ + ZXIC_UINT32 smmu0_int42_mask0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT42_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int42_status_t +{ + ZXIC_UINT32 smmu0_int42_status0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT42_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int43_en_t +{ + ZXIC_UINT32 smmu0_int43_en0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT43_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int43_mask_t +{ + ZXIC_UINT32 smmu0_int43_mask0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT43_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int43_status_t +{ + ZXIC_UINT32 smmu0_int43_status0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT43_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int44_en_t +{ + ZXIC_UINT32 smmu0_int44_en0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT44_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int44_mask_t +{ + ZXIC_UINT32 smmu0_int44_mask0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT44_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int44_status_t +{ + ZXIC_UINT32 smmu0_int44_status0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT44_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int45_en_t +{ + ZXIC_UINT32 smmu0_int45_en0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT45_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int45_mask_t +{ + ZXIC_UINT32 smmu0_int45_mask0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT45_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int45_status_t +{ + ZXIC_UINT32 smmu0_int45_status0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT45_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int46_en_t +{ + ZXIC_UINT32 smmu0_int46_en0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT46_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int46_mask_t +{ + ZXIC_UINT32 smmu0_int46_mask0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT46_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int46_status_t +{ + ZXIC_UINT32 smmu0_int46_status0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT46_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int47_en_t +{ + ZXIC_UINT32 smmu0_int47_en0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT47_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int47_mask_t +{ + ZXIC_UINT32 smmu0_int47_mask0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT47_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int47_status_t +{ + ZXIC_UINT32 smmu0_int47_status0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT47_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int48_en_t +{ + ZXIC_UINT32 smmu0_int48_en0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT48_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int48_mask_t +{ + ZXIC_UINT32 smmu0_int48_mask0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT48_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int48_status_t +{ + ZXIC_UINT32 smmu0_int48_status0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT48_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int49_en_t +{ + ZXIC_UINT32 smmu0_int49_en0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT49_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int49_mask_t +{ + ZXIC_UINT32 smmu0_int49_mask0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT49_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int49_status_t +{ + ZXIC_UINT32 smmu0_int49_status0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT49_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int50_en_t +{ + ZXIC_UINT32 smmu0_int50_en0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT50_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int50_mask_t +{ + ZXIC_UINT32 smmu0_int50_mask0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT50_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int50_status_t +{ + ZXIC_UINT32 smmu0_int50_status0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT50_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int51_en_t +{ + ZXIC_UINT32 smmu0_int51_en0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT51_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int51_mask_t +{ + ZXIC_UINT32 smmu0_int51_mask0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT51_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int51_status_t +{ + ZXIC_UINT32 smmu0_int51_status0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT51_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int52_en_t +{ + ZXIC_UINT32 smmu0_int52_en0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT52_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int52_mask_t +{ + ZXIC_UINT32 smmu0_int52_mask0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT52_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int52_status_t +{ + ZXIC_UINT32 smmu0_int52_status0_31; +}DPP_SMMU0_SMMU0_SMMU0_INT52_STATUS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int53_en_t +{ + ZXIC_UINT32 smmu0_int53_en3; + ZXIC_UINT32 smmu0_int53_en2; + ZXIC_UINT32 smmu0_int53_en1; + ZXIC_UINT32 smmu0_int53_en0; +}DPP_SMMU0_SMMU0_SMMU0_INT53_EN_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int53_mask_t +{ + ZXIC_UINT32 smmu0_int53_mask3; + ZXIC_UINT32 smmu0_int53_mask2; + ZXIC_UINT32 smmu0_int53_mask1; + ZXIC_UINT32 smmu0_int53_mask0; +}DPP_SMMU0_SMMU0_SMMU0_INT53_MASK_T; + +typedef struct dpp_smmu0_smmu0_smmu0_int53_status_t +{ + ZXIC_UINT32 smmu0_int53_status15; + ZXIC_UINT32 smmu0_int53_status14; + ZXIC_UINT32 smmu0_int53_status13; + ZXIC_UINT32 smmu0_int53_status12; +}DPP_SMMU0_SMMU0_SMMU0_INT53_STATUS_T; + +typedef struct dpp_smmu0_smmu0_ctrl0_arbiter_ecc_bypass_t +{ + ZXIC_UINT32 ctrl1_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl1_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl1_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl1_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl1_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl1_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl1_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl1_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl1_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl1_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl1_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl1_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl1_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl1_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl1_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl1_arbiter_ecc_bypass_0; + ZXIC_UINT32 ctrl0_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl0_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl0_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl0_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl0_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl0_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl0_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl0_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl0_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl0_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl0_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl0_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl0_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl0_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl0_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl0_arbiter_ecc_bypass_0; +}DPP_SMMU0_SMMU0_CTRL0_ARBITER_ECC_BYPASS_T; + +typedef struct dpp_smmu0_smmu0_ctrl2_arbiter_ecc_bypass_t +{ + ZXIC_UINT32 ctrl3_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl3_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl3_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl3_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl3_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl3_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl3_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl3_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl3_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl3_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl3_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl3_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl3_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl3_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl3_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl3_arbiter_ecc_bypass_0; + ZXIC_UINT32 ctrl2_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl2_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl2_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl2_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl2_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl2_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl2_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl2_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl2_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl2_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl2_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl2_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl2_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl2_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl2_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl2_arbiter_ecc_bypass_0; +}DPP_SMMU0_SMMU0_CTRL2_ARBITER_ECC_BYPASS_T; + +typedef struct dpp_smmu0_smmu0_ctrl4_arbiter_ecc_bypass_t +{ + ZXIC_UINT32 ctrl5_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl5_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl5_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl5_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl5_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl5_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl5_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl5_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl5_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl5_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl5_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl5_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl5_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl5_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl5_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl5_arbiter_ecc_bypass_0; + ZXIC_UINT32 ctrl4_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl4_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl4_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl4_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl4_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl4_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl4_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl4_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl4_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl4_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl4_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl4_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl4_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl4_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl4_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl4_arbiter_ecc_bypass_0; +}DPP_SMMU0_SMMU0_CTRL4_ARBITER_ECC_BYPASS_T; + +typedef struct dpp_smmu0_smmu0_ctrl6_arbiter_ecc_bypass_t +{ + ZXIC_UINT32 ctrl7_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl7_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl7_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl7_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl7_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl7_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl7_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl7_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl7_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl7_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl7_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl7_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl7_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl7_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl7_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl7_arbiter_ecc_bypass_0; + ZXIC_UINT32 ctrl6_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl6_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl6_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl6_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl6_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl6_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl6_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl6_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl6_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl6_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl6_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl6_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl6_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl6_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl6_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl6_arbiter_ecc_bypass_0; +}DPP_SMMU0_SMMU0_CTRL6_ARBITER_ECC_BYPASS_T; + +typedef struct dpp_smmu0_smmu0_ctrl8_arbiter_ecc_bypass_t +{ + ZXIC_UINT32 ctrl9_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl9_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl9_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl9_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl9_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl9_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl9_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl9_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl9_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl9_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl9_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl9_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl9_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl9_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl9_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl9_arbiter_ecc_bypass_0; + ZXIC_UINT32 ctrl8_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl8_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl8_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl8_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl8_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl8_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl8_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl8_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl8_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl8_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl8_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl8_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl8_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl8_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl8_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl8_arbiter_ecc_bypass_0; +}DPP_SMMU0_SMMU0_CTRL8_ARBITER_ECC_BYPASS_T; + +typedef struct dpp_smmu0_smmu0_ctrl10_arbiter_ecc_bypass_t +{ + ZXIC_UINT32 ctrl11_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl11_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl11_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl11_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl11_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl11_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl11_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl11_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl11_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl11_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl11_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl11_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl11_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl11_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl11_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl11_arbiter_ecc_bypass_0; + ZXIC_UINT32 ctrl10_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl10_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl10_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl10_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl10_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl10_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl10_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl10_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl10_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl10_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl10_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl10_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl10_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl10_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl10_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl10_arbiter_ecc_bypass_0; +}DPP_SMMU0_SMMU0_CTRL10_ARBITER_ECC_BYPASS_T; + +typedef struct dpp_smmu0_smmu0_ctrl12_arbiter_ecc_bypass_t +{ + ZXIC_UINT32 ctrl13_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl13_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl13_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl13_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl13_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl13_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl13_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl13_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl13_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl13_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl13_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl13_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl13_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl13_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl13_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl13_arbiter_ecc_bypass_0; + ZXIC_UINT32 ctrl12_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl12_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl12_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl12_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl12_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl12_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl12_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl12_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl12_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl12_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl12_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl12_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl12_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl12_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl12_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl12_arbiter_ecc_bypass_0; +}DPP_SMMU0_SMMU0_CTRL12_ARBITER_ECC_BYPASS_T; + +typedef struct dpp_smmu0_smmu0_ctrl14_arbiter_ecc_bypass_t +{ + ZXIC_UINT32 ctrl15_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl15_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl15_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl15_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl15_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl15_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl15_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl15_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl15_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl15_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl15_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl15_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl15_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl15_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl15_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl15_arbiter_ecc_bypass_0; + ZXIC_UINT32 ctrl14_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl14_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl14_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl14_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl14_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl14_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl14_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl14_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl14_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl14_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl14_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl14_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl14_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl14_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl14_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl14_arbiter_ecc_bypass_0; +}DPP_SMMU0_SMMU0_CTRL14_ARBITER_ECC_BYPASS_T; + +typedef struct dpp_smmu0_smmu0_ctrl16_arbiter_ecc_bypass_t +{ + ZXIC_UINT32 ctrl17_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl17_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl17_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl17_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl17_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl17_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl17_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl17_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl17_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl17_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl17_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl17_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl17_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl17_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl17_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl17_arbiter_ecc_bypass_0; + ZXIC_UINT32 ctrl16_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl16_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl16_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl16_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl16_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl16_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl16_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl16_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl16_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl16_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl16_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl16_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl16_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl16_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl16_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl16_arbiter_ecc_bypass_0; +}DPP_SMMU0_SMMU0_CTRL16_ARBITER_ECC_BYPASS_T; + +typedef struct dpp_smmu0_smmu0_ctrl18_arbiter_ecc_bypass_t +{ + ZXIC_UINT32 ctrl19_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl19_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl19_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl19_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl19_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl19_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl19_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl19_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl19_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl19_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl19_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl19_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl19_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl19_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl19_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl19_arbiter_ecc_bypass_0; + ZXIC_UINT32 ctrl18_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl18_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl18_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl18_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl18_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl18_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl18_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl18_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl18_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl18_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl18_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl18_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl18_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl18_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl18_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl18_arbiter_ecc_bypass_0; +}DPP_SMMU0_SMMU0_CTRL18_ARBITER_ECC_BYPASS_T; + +typedef struct dpp_smmu0_smmu0_ctrl20_arbiter_ecc_bypass_t +{ + ZXIC_UINT32 ctrl21_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl21_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl21_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl21_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl21_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl21_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl21_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl21_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl21_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl21_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl21_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl21_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl21_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl21_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl21_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl21_arbiter_ecc_bypass_0; + ZXIC_UINT32 ctrl20_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl20_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl20_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl20_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl20_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl20_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl20_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl20_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl20_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl20_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl20_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl20_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl20_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl20_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl20_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl20_arbiter_ecc_bypass_0; +}DPP_SMMU0_SMMU0_CTRL20_ARBITER_ECC_BYPASS_T; + +typedef struct dpp_smmu0_smmu0_ctrl22_arbiter_ecc_bypass_t +{ + ZXIC_UINT32 ctrl23_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl23_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl23_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl23_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl23_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl23_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl23_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl23_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl23_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl23_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl23_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl23_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl23_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl23_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl23_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl23_arbiter_ecc_bypass_0; + ZXIC_UINT32 ctrl22_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl22_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl22_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl22_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl22_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl22_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl22_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl22_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl22_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl22_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl22_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl22_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl22_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl22_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl22_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl22_arbiter_ecc_bypass_0; +}DPP_SMMU0_SMMU0_CTRL22_ARBITER_ECC_BYPASS_T; + +typedef struct dpp_smmu0_smmu0_ctrl24_arbiter_ecc_bypass_t +{ + ZXIC_UINT32 ctrl25_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl25_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl25_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl25_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl25_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl25_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl25_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl25_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl25_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl25_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl25_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl25_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl25_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl25_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl25_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl25_arbiter_ecc_bypass_0; + ZXIC_UINT32 ctrl24_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl24_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl24_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl24_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl24_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl24_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl24_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl24_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl24_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl24_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl24_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl24_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl24_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl24_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl24_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl24_arbiter_ecc_bypass_0; +}DPP_SMMU0_SMMU0_CTRL24_ARBITER_ECC_BYPASS_T; + +typedef struct dpp_smmu0_smmu0_ctrl26_arbiter_ecc_bypass_t +{ + ZXIC_UINT32 ctrl27_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl27_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl27_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl27_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl27_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl27_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl27_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl27_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl27_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl27_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl27_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl27_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl27_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl27_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl27_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl27_arbiter_ecc_bypass_0; + ZXIC_UINT32 ctrl26_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl26_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl26_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl26_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl26_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl26_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl26_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl26_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl26_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl26_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl26_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl26_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl26_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl26_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl26_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl26_arbiter_ecc_bypass_0; +}DPP_SMMU0_SMMU0_CTRL26_ARBITER_ECC_BYPASS_T; + +typedef struct dpp_smmu0_smmu0_ctrl28_arbiter_ecc_bypass_t +{ + ZXIC_UINT32 ctrl29_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl29_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl29_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl29_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl29_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl29_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl29_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl29_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl29_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl29_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl29_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl29_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl29_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl29_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl29_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl29_arbiter_ecc_bypass_0; + ZXIC_UINT32 ctrl28_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl28_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl28_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl28_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl28_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl28_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl28_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl28_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl28_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl28_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl28_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl28_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl28_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl28_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl28_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl28_arbiter_ecc_bypass_0; +}DPP_SMMU0_SMMU0_CTRL28_ARBITER_ECC_BYPASS_T; + +typedef struct dpp_smmu0_smmu0_ctrl30_arbiter_ecc_bypass_t +{ + ZXIC_UINT32 ctrl31_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl31_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl31_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl31_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl31_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl31_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl31_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl31_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl31_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl31_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl31_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl31_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl31_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl31_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl31_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl31_arbiter_ecc_bypass_0; + ZXIC_UINT32 ctrl30_arbiter_ecc_bypass_15; + ZXIC_UINT32 ctrl30_arbiter_ecc_bypass_14; + ZXIC_UINT32 ctrl30_arbiter_ecc_bypass_13; + ZXIC_UINT32 ctrl30_arbiter_ecc_bypass_12; + ZXIC_UINT32 ctrl30_arbiter_ecc_bypass_11; + ZXIC_UINT32 ctrl30_arbiter_ecc_bypass_10; + ZXIC_UINT32 ctrl30_arbiter_ecc_bypass_9; + ZXIC_UINT32 ctrl30_arbiter_ecc_bypass_8; + ZXIC_UINT32 ctrl30_arbiter_ecc_bypass_7; + ZXIC_UINT32 ctrl30_arbiter_ecc_bypass_6; + ZXIC_UINT32 ctrl30_arbiter_ecc_bypass_5; + ZXIC_UINT32 ctrl30_arbiter_ecc_bypass_4; + ZXIC_UINT32 ctrl30_arbiter_ecc_bypass_3; + ZXIC_UINT32 ctrl30_arbiter_ecc_bypass_2; + ZXIC_UINT32 ctrl30_arbiter_ecc_bypass_1; + ZXIC_UINT32 ctrl30_arbiter_ecc_bypass_0; +}DPP_SMMU0_SMMU0_CTRL30_ARBITER_ECC_BYPASS_T; + +typedef struct dpp_smmu0_smmu0_ctrl_req_ecc_bypass_t +{ + ZXIC_UINT32 ctrl_req_ecc_bypass_0_31; +}DPP_SMMU0_SMMU0_CTRL_REQ_ECC_BYPASS_T; + +typedef struct dpp_smmu0_smmu0_ctrl_info_ecc_bypass_t +{ + ZXIC_UINT32 ctrl_info_ecc_bypass_0_31; +}DPP_SMMU0_SMMU0_CTRL_INFO_ECC_BYPASS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_rschd_ecc_bypass_t +{ + ZXIC_UINT32 smmu0_rschd_ecc_bypass_0_31; +}DPP_SMMU0_SMMU0_SMMU0_RSCHD_ECC_BYPASS_T; + +typedef struct dpp_smmu0_smmu0_smmu0_wr_ecc_bypass_t +{ + ZXIC_UINT32 smmu0_wr_ecc_bypass1; + ZXIC_UINT32 smmu0_wr_ecc_bypass0; +}DPP_SMMU0_SMMU0_SMMU0_WR_ECC_BYPASS_T; + +typedef struct dpp_smmu0_smmu0_ctrl0_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl0_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl0_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL0_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl1_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl1_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl1_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL1_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl2_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl2_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl2_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL2_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl3_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl3_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl3_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL3_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl4_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl4_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl4_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL4_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl5_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl5_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl5_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL5_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl6_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl6_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl6_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL6_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl7_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl7_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl7_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL7_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl8_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl8_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl8_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL8_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl9_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl9_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl9_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL9_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl10_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl10_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl10_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL10_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl11_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl11_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl11_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL11_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl12_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl12_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl12_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL12_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl13_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl13_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl13_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL13_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl14_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl14_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl14_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL14_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl15_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl15_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl15_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL15_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl16_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl16_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl16_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL16_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl17_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl17_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl17_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL17_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl18_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl18_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl18_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL18_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl19_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl19_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl19_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL19_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl20_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl20_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl20_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL20_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl21_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl21_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl21_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL21_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl22_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl22_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl22_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL22_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl23_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl23_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl23_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL23_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl24_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl24_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl24_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL24_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl25_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl25_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl25_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL25_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl26_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl26_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl26_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL26_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl27_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl27_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl27_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL27_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl28_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl28_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl28_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL28_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl29_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl29_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl29_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL29_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl30_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl30_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl30_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL30_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl31_arbiter_ecc_err_t +{ + ZXIC_UINT32 ctrl31_arbiter_ecc_err_31; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_30; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_29; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_28; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_27; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_26; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_25; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_24; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_23; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_22; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_21; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_20; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_19; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_18; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_17; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_16; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_15; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_14; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_13; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_12; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_11; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_10; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_9; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_8; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_7; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_6; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_5; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_4; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_3; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_2; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_1; + ZXIC_UINT32 ctrl31_arbiter_ecc_err_0; +}DPP_SMMU0_SMMU0_CTRL31_ARBITER_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl_req_ecc_single_err_t +{ + ZXIC_UINT32 ctrl_req_ecc_single_err_0_31; +}DPP_SMMU0_SMMU0_CTRL_REQ_ECC_SINGLE_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl_req_ecc_double_err_t +{ + ZXIC_UINT32 ctrl_req_ecc_double_err_0_31; +}DPP_SMMU0_SMMU0_CTRL_REQ_ECC_DOUBLE_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl_info_ecc_single_err_t +{ + ZXIC_UINT32 ctrl_info_ecc_single_err_0_31; +}DPP_SMMU0_SMMU0_CTRL_INFO_ECC_SINGLE_ERR_T; + +typedef struct dpp_smmu0_smmu0_ctrl_info_ecc_double_err_t +{ + ZXIC_UINT32 ctrl_info_ecc_double_err_0_31; +}DPP_SMMU0_SMMU0_CTRL_INFO_ECC_DOUBLE_ERR_T; + +typedef struct dpp_smmu0_smmu0_smmu0_wr_ecc_err_t +{ + ZXIC_UINT32 smmu0_wr_ecc_err_3; + ZXIC_UINT32 smmu0_wr_ecc_err_2; + ZXIC_UINT32 smmu0_wr_ecc_err_1; + ZXIC_UINT32 smmu0_wr_ecc_err_0; +}DPP_SMMU0_SMMU0_SMMU0_WR_ECC_ERR_T; + +typedef struct dpp_smmu0_smmu0_smmu0_rschd_ecc_single_err_t +{ + ZXIC_UINT32 smmu0_rschd_ecc_single_err_0_31; +}DPP_SMMU0_SMMU0_SMMU0_RSCHD_ECC_SINGLE_ERR_T; + +typedef struct dpp_smmu0_smmu0_smmu0_rschd_ecc_double_err_t +{ + ZXIC_UINT32 smmu0_rschd_ecc_double_err_0_31; +}DPP_SMMU0_SMMU0_SMMU0_RSCHD_ECC_DOUBLE_ERR_T; + +typedef struct dpp_smmu0_smmu0_ord_fifo_empty_t +{ + ZXIC_UINT32 ord_fifo_empty; +}DPP_SMMU0_SMMU0_ORD_FIFO_EMPTY_T; + +typedef struct dpp_smmu0_smmu0_wr_arb_fifo_empty_t +{ + ZXIC_UINT32 wr_arb_fifo_empty; +}DPP_SMMU0_SMMU0_WR_ARB_FIFO_EMPTY_T; + +typedef struct dpp_smmu0_smmu0_ctrl_fifo_empty0_t +{ + ZXIC_UINT32 ctrl_fifo_empty0_5; + ZXIC_UINT32 ctrl_fifo_empty0_4; + ZXIC_UINT32 ctrl_fifo_empty0_3; + ZXIC_UINT32 ctrl_fifo_empty0_2; + ZXIC_UINT32 ctrl_fifo_empty0_1; + ZXIC_UINT32 ctrl_fifo_empty0_0; +}DPP_SMMU0_SMMU0_CTRL_FIFO_EMPTY0_T; + +typedef struct dpp_smmu0_smmu0_ctrl_fifo_empty1_t +{ + ZXIC_UINT32 ctrl_fifo_empty1_5; + ZXIC_UINT32 ctrl_fifo_empty1_4; + ZXIC_UINT32 ctrl_fifo_empty1_3; + ZXIC_UINT32 ctrl_fifo_empty1_2; + ZXIC_UINT32 ctrl_fifo_empty1_1; + ZXIC_UINT32 ctrl_fifo_empty1_0; +}DPP_SMMU0_SMMU0_CTRL_FIFO_EMPTY1_T; + +typedef struct dpp_smmu0_smmu0_ctrl_fifo_empty2_t +{ + ZXIC_UINT32 ctrl_fifo_empty2_5; + ZXIC_UINT32 ctrl_fifo_empty2_4; + ZXIC_UINT32 ctrl_fifo_empty2_3; + ZXIC_UINT32 ctrl_fifo_empty2_2; + ZXIC_UINT32 ctrl_fifo_empty2_1; + ZXIC_UINT32 ctrl_fifo_empty2_0; +}DPP_SMMU0_SMMU0_CTRL_FIFO_EMPTY2_T; + +typedef struct dpp_smmu0_smmu0_ctrl_fifo_empty3_t +{ + ZXIC_UINT32 ctrl_fifo_empty3_5; + ZXIC_UINT32 ctrl_fifo_empty3_4; + ZXIC_UINT32 ctrl_fifo_empty3_3; + ZXIC_UINT32 ctrl_fifo_empty3_2; + ZXIC_UINT32 ctrl_fifo_empty3_1; + ZXIC_UINT32 ctrl_fifo_empty3_0; +}DPP_SMMU0_SMMU0_CTRL_FIFO_EMPTY3_T; + +typedef struct dpp_smmu0_smmu0_ctrl_fifo_empty4_t +{ + ZXIC_UINT32 ctrl_fifo_empty4_5; + ZXIC_UINT32 ctrl_fifo_empty4_4; + ZXIC_UINT32 ctrl_fifo_empty4_3; + ZXIC_UINT32 ctrl_fifo_empty4_2; + ZXIC_UINT32 ctrl_fifo_empty4_1; + ZXIC_UINT32 ctrl_fifo_empty4_0; +}DPP_SMMU0_SMMU0_CTRL_FIFO_EMPTY4_T; + +typedef struct dpp_smmu0_smmu0_ctrl_fifo_empty5_t +{ + ZXIC_UINT32 ctrl_fifo_empty5_1; + ZXIC_UINT32 ctrl_fifo_empty5_0; +}DPP_SMMU0_SMMU0_CTRL_FIFO_EMPTY5_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty0_t +{ + ZXIC_UINT32 kschd_fifo_empty0; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY0_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty1_t +{ + ZXIC_UINT32 kschd_fifo_empty1; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY1_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty2_t +{ + ZXIC_UINT32 kschd_fifo_empty2; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY2_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty3_t +{ + ZXIC_UINT32 kschd_fifo_empty3; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY3_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty4_t +{ + ZXIC_UINT32 kschd_fifo_empty4; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY4_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty5_t +{ + ZXIC_UINT32 kschd_fifo_empty5; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY5_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty6_t +{ + ZXIC_UINT32 kschd_fifo_empty6; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY6_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty7_t +{ + ZXIC_UINT32 kschd_fifo_empty7; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY7_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty8_t +{ + ZXIC_UINT32 kschd_fifo_empty8; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY8_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty9_t +{ + ZXIC_UINT32 kschd_fifo_empty9; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY9_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty10_t +{ + ZXIC_UINT32 kschd_fifo_empty10; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY10_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty11_t +{ + ZXIC_UINT32 kschd_fifo_empty11; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY11_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty12_t +{ + ZXIC_UINT32 kschd_fifo_empty12; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY12_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty13_t +{ + ZXIC_UINT32 kschd_fifo_empty13; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY13_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty14_t +{ + ZXIC_UINT32 kschd_fifo_empty14; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY14_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty15_t +{ + ZXIC_UINT32 kschd_fifo_empty15; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY15_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty16_t +{ + ZXIC_UINT32 kschd_fifo_empty16; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY16_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty17_t +{ + ZXIC_UINT32 kschd_fifo_empty17; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY17_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty18_t +{ + ZXIC_UINT32 kschd_fifo_empty18; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY18_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty19_t +{ + ZXIC_UINT32 kschd_fifo_empty19; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY19_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty20_t +{ + ZXIC_UINT32 kschd_fifo_empty20; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY20_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty21_t +{ + ZXIC_UINT32 kschd_fifo_empty21; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY21_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty22_t +{ + ZXIC_UINT32 kschd_fifo_empty22; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY22_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty23_t +{ + ZXIC_UINT32 kschd_fifo_empty23; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY23_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty24_t +{ + ZXIC_UINT32 kschd_fifo_empty24; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY24_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty25_t +{ + ZXIC_UINT32 kschd_fifo_empty25; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY25_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty26_t +{ + ZXIC_UINT32 kschd_fifo_empty26; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY26_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty27_t +{ + ZXIC_UINT32 kschd_fifo_empty27; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY27_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty28_t +{ + ZXIC_UINT32 kschd_fifo_empty28; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY28_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty29_t +{ + ZXIC_UINT32 kschd_fifo_empty29; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY29_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty30_t +{ + ZXIC_UINT32 kschd_fifo_empty30; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY30_T; + +typedef struct dpp_smmu0_smmu0_kschd_fifo_empty31_t +{ + ZXIC_UINT32 kschd_fifo_empty31; +}DPP_SMMU0_SMMU0_KSCHD_FIFO_EMPTY31_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty0_t +{ + ZXIC_UINT32 rschd_fifo_empty0; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY0_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty1_t +{ + ZXIC_UINT32 rschd_fifo_empty1; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY1_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty2_t +{ + ZXIC_UINT32 rschd_fifo_empty2; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY2_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty3_t +{ + ZXIC_UINT32 rschd_fifo_empty3; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY3_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty4_t +{ + ZXIC_UINT32 rschd_fifo_empty4; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY4_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty5_t +{ + ZXIC_UINT32 rschd_fifo_empty5; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY5_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty6_t +{ + ZXIC_UINT32 rschd_fifo_empty6; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY6_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty7_t +{ + ZXIC_UINT32 rschd_fifo_empty7; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY7_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty8_t +{ + ZXIC_UINT32 rschd_fifo_empty8; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY8_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty9_t +{ + ZXIC_UINT32 rschd_fifo_empty9; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY9_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty10_t +{ + ZXIC_UINT32 rschd_fifo_empty10; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY10_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty11_t +{ + ZXIC_UINT32 rschd_fifo_empty11; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY11_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty12_t +{ + ZXIC_UINT32 rschd_fifo_empty12; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY12_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty13_t +{ + ZXIC_UINT32 rschd_fifo_empty13; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY13_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty14_t +{ + ZXIC_UINT32 rschd_fifo_empty14; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY14_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty15_t +{ + ZXIC_UINT32 rschd_fifo_empty15; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY15_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty16_t +{ + ZXIC_UINT32 rschd_fifo_empty16; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY16_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty17_t +{ + ZXIC_UINT32 rschd_fifo_empty17; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY17_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty18_t +{ + ZXIC_UINT32 rschd_fifo_empty18; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY18_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty19_t +{ + ZXIC_UINT32 rschd_fifo_empty19; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY19_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty20_t +{ + ZXIC_UINT32 rschd_fifo_empty20; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY20_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty21_t +{ + ZXIC_UINT32 rschd_fifo_empty21; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY21_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty22_t +{ + ZXIC_UINT32 rschd_fifo_empty22; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY22_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty23_t +{ + ZXIC_UINT32 rschd_fifo_empty23; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY23_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty24_t +{ + ZXIC_UINT32 rschd_fifo_empty24; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY24_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty25_t +{ + ZXIC_UINT32 rschd_fifo_empty25; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY25_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty26_t +{ + ZXIC_UINT32 rschd_fifo_empty26; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY26_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty27_t +{ + ZXIC_UINT32 rschd_fifo_empty27; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY27_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty28_t +{ + ZXIC_UINT32 rschd_fifo_empty28; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY28_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty29_t +{ + ZXIC_UINT32 rschd_fifo_empty29; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY29_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty30_t +{ + ZXIC_UINT32 rschd_fifo_empty30; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY30_T; + +typedef struct dpp_smmu0_smmu0_rschd_fifo_empty31_t +{ + ZXIC_UINT32 rschd_fifo_empty31; +}DPP_SMMU0_SMMU0_RSCHD_FIFO_EMPTY31_T; + +typedef struct dpp_smmu0_smmu0_ept_flag_t +{ + ZXIC_UINT32 ept_flag8; + ZXIC_UINT32 ept_flag7; + ZXIC_UINT32 ept_flag6; + ZXIC_UINT32 ept_flag5; + ZXIC_UINT32 ept_flag4; + ZXIC_UINT32 ept_flag3; + ZXIC_UINT32 ept_flag2; + ZXIC_UINT32 ept_flag1; + ZXIC_UINT32 ept_flag0; +}DPP_SMMU0_SMMU0_EPT_FLAG_T; + +typedef struct dpp_smmu0_smmu0_ppu_soft_rst_t +{ + ZXIC_UINT32 ppu_soft_rst; +}DPP_SMMU0_SMMU0_PPU_SOFT_RST_T; + +typedef struct dpp_smmu0_smmu0_smmu0_as_mac_age_fc_cnt_t +{ + ZXIC_UINT32 smmu0_as_mac_age_fc_cnt; +}DPP_SMMU0_SMMU0_SMMU0_AS_MAC_AGE_FC_CNT_T; + +typedef struct dpp_smmu0_smmu0_smmu0_marc_se_parser_fc_cnt_t +{ + ZXIC_UINT32 smmu0_marc_se_parser_fc_cnt; +}DPP_SMMU0_SMMU0_SMMU0_MARC_SE_PARSER_FC_CNT_T; + +typedef struct dpp_smmu0_smmu0_wr_arb_cpu_fc_cnt_t +{ + ZXIC_UINT32 wr_arb_cpu_fc_cnt; +}DPP_SMMU0_SMMU0_WR_ARB_CPU_FC_CNT_T; + +typedef struct dpp_smmu0_smmu0_smmu0_lpm_as_fc_cnt_t +{ + ZXIC_UINT32 smmu0_lpm_as_fc_cnt; +}DPP_SMMU0_SMMU0_SMMU0_LPM_AS_FC_CNT_T; + +typedef struct dpp_smmu0_smmu0_lpm_as_smmu0_fc_cnt_t +{ + ZXIC_UINT32 lpm_as_smmu0_fc_cnt; +}DPP_SMMU0_SMMU0_LPM_AS_SMMU0_FC_CNT_T; + +typedef struct dpp_smmu0_smmu0_smmu0_etcam1_0_as_fc_cnt_t +{ + ZXIC_UINT32 smmu0_etcam1_0_as_fc_cnt; +}DPP_SMMU0_SMMU0_SMMU0_ETCAM1_0_AS_FC_CNT_T; + +typedef struct dpp_smmu0_smmu0_as_etcam1_0_smmu0_fc_cnt_t +{ + ZXIC_UINT32 as_etcam1_0_smmu0_fc_cnt; +}DPP_SMMU0_SMMU0_AS_ETCAM1_0_SMMU0_FC_CNT_T; + +typedef struct dpp_smmu0_smmu0_smmu0_ppu_mcast_fc_cnt_t +{ + ZXIC_UINT32 smmu0_ppu_mcast_fc_cnt; +}DPP_SMMU0_SMMU0_SMMU0_PPU_MCAST_FC_CNT_T; + +typedef struct dpp_smmu0_smmu0_ppu_smmu0_mcast_fc_cnt_t +{ + ZXIC_UINT32 ppu_smmu0_mcast_fc_cnt; +}DPP_SMMU0_SMMU0_PPU_SMMU0_MCAST_FC_CNT_T; + +typedef struct dpp_smmu0_smmu0_odma_smmu0_tdm_fc_rsp_fc_cnt_t +{ + ZXIC_UINT32 odma_smmu0_tdm_fc_rsp_fc_cnt; +}DPP_SMMU0_SMMU0_ODMA_SMMU0_TDM_FC_RSP_FC_CNT_T; + +typedef struct dpp_smmu0_smmu0_smmu0_odma_tdm_fc_key_fc_cnt_t +{ + ZXIC_UINT32 smmu0_odma_tdm_fc_key_fc_cnt; +}DPP_SMMU0_SMMU0_SMMU0_ODMA_TDM_FC_KEY_FC_CNT_T; + +typedef struct dpp_smmu0_smmu0_smmu0_odma_fc_cnt_t +{ + ZXIC_UINT32 smmu0_odma_fc_cnt; +}DPP_SMMU0_SMMU0_SMMU0_ODMA_FC_CNT_T; + +typedef struct dpp_smmu0_smmu0_smmu0_cfg_tab_rd_fc_cnt_t +{ + ZXIC_UINT32 smmu0_cfg_tab_rd_fc_cnt; +}DPP_SMMU0_SMMU0_SMMU0_CFG_TAB_RD_FC_CNT_T; + +typedef struct dpp_smmu0_smmu0_smmu0_stat_fc15_0_cnt_t +{ + ZXIC_UINT32 smmu0_stat_fc15_0_cnt; +}DPP_SMMU0_SMMU0_SMMU0_STAT_FC15_0_CNT_T; + +typedef struct dpp_smmu0_smmu0_stat_smmu0_fc15_0_cnt_t +{ + ZXIC_UINT32 stat_smmu0_fc15_0_cnt; +}DPP_SMMU0_SMMU0_STAT_SMMU0_FC15_0_CNT_T; + +typedef struct dpp_smmu0_smmu0_smmu0_ppu_mex5_0_fc_cnt_t +{ + ZXIC_UINT32 smmu0_ppu_mex5_0_fc_cnt; +}DPP_SMMU0_SMMU0_SMMU0_PPU_MEX5_0_FC_CNT_T; + +typedef struct dpp_smmu0_smmu0_ppu_smmu0_mex5_0_fc_cnt_t +{ + ZXIC_UINT32 ppu_smmu0_mex5_0_fc_cnt; +}DPP_SMMU0_SMMU0_PPU_SMMU0_MEX5_0_FC_CNT_T; + +typedef struct dpp_smmu0_smmu0_as_smmu0_mac_age_req_cnt_t +{ + ZXIC_UINT32 as_smmu0_mac_age_req_cnt; +}DPP_SMMU0_SMMU0_AS_SMMU0_MAC_AGE_REQ_CNT_T; + +typedef struct dpp_smmu0_smmu0_se_parser_smmu0_marc_key_cnt_t +{ + ZXIC_UINT32 se_parser_smmu0_marc_key_cnt; +}DPP_SMMU0_SMMU0_SE_PARSER_SMMU0_MARC_KEY_CNT_T; + +typedef struct dpp_smmu0_smmu0_cpu_ind_rdat_cnt_t +{ + ZXIC_UINT32 cpu_ind_rdat_cnt; +}DPP_SMMU0_SMMU0_CPU_IND_RDAT_CNT_T; + +typedef struct dpp_smmu0_smmu0_cpu_ind_rd_req_cnt_t +{ + ZXIC_UINT32 cpu_ind_rd_req_cnt; +}DPP_SMMU0_SMMU0_CPU_IND_RD_REQ_CNT_T; + +typedef struct dpp_smmu0_smmu0_cpu_ind_wr_req_cnt_t +{ + ZXIC_UINT32 cpu_ind_wr_req_cnt; +}DPP_SMMU0_SMMU0_CPU_IND_WR_REQ_CNT_T; + +typedef struct dpp_smmu0_smmu0_smmu0_plcr_rsp0_cnt_t +{ + ZXIC_UINT32 smmu0_plcr_rsp0_cnt; +}DPP_SMMU0_SMMU0_SMMU0_PLCR_RSP0_CNT_T; + +typedef struct dpp_smmu0_smmu0_plcr_smmu0_req0_cnt_t +{ + ZXIC_UINT32 plcr_smmu0_req0_cnt; +}DPP_SMMU0_SMMU0_PLCR_SMMU0_REQ0_CNT_T; + +typedef struct dpp_smmu0_smmu0_smmu0_lpm_as_rsp_cnt_t +{ + ZXIC_UINT32 smmu0_lpm_as_rsp_cnt; +}DPP_SMMU0_SMMU0_SMMU0_LPM_AS_RSP_CNT_T; + +typedef struct dpp_smmu0_smmu0_lpm_as_smmu0_req_cnt_t +{ + ZXIC_UINT32 lpm_as_smmu0_req_cnt; +}DPP_SMMU0_SMMU0_LPM_AS_SMMU0_REQ_CNT_T; + +typedef struct dpp_smmu0_smmu0_smmu0_etcam1_0_as_rsp_cnt_t +{ + ZXIC_UINT32 smmu0_etcam1_0_as_rsp_cnt; +}DPP_SMMU0_SMMU0_SMMU0_ETCAM1_0_AS_RSP_CNT_T; + +typedef struct dpp_smmu0_smmu0_etcam1_0_as_smmu0_req_cnt_t +{ + ZXIC_UINT32 etcam1_0_as_smmu0_req_cnt; +}DPP_SMMU0_SMMU0_ETCAM1_0_AS_SMMU0_REQ_CNT_T; + +typedef struct dpp_smmu0_smmu0_smmu0_ppu_mcast_rsp_cnt_t +{ + ZXIC_UINT32 smmu0_ppu_mcast_rsp_cnt; +}DPP_SMMU0_SMMU0_SMMU0_PPU_MCAST_RSP_CNT_T; + +typedef struct dpp_smmu0_smmu0_ppu_smmu0_mcast_key_cnt_t +{ + ZXIC_UINT32 ppu_smmu0_mcast_key_cnt; +}DPP_SMMU0_SMMU0_PPU_SMMU0_MCAST_KEY_CNT_T; + +typedef struct dpp_smmu0_smmu0_smmu0_odma_tdm_mc_rsp_cnt_t +{ + ZXIC_UINT32 smmu0_odma_tdm_mc_rsp_cnt; +}DPP_SMMU0_SMMU0_SMMU0_ODMA_TDM_MC_RSP_CNT_T; + +typedef struct dpp_smmu0_smmu0_odma_smmu0_tdm_mc_key_cnt_t +{ + ZXIC_UINT32 odma_smmu0_tdm_mc_key_cnt; +}DPP_SMMU0_SMMU0_ODMA_SMMU0_TDM_MC_KEY_CNT_T; + +typedef struct dpp_smmu0_smmu0_smmu0_odma_rsp_cnt_t +{ + ZXIC_UINT32 smmu0_odma_rsp_cnt; +}DPP_SMMU0_SMMU0_SMMU0_ODMA_RSP_CNT_T; + +typedef struct dpp_smmu0_smmu0_odma_smmu0_cmd_cnt_t +{ + ZXIC_UINT32 odma_smmu0_cmd_cnt; +}DPP_SMMU0_SMMU0_ODMA_SMMU0_CMD_CNT_T; + +typedef struct dpp_smmu0_smmu0_smmu0_cfg_tab_rdat_cnt_t +{ + ZXIC_UINT32 smmu0_cfg_tab_rdat_cnt; +}DPP_SMMU0_SMMU0_SMMU0_CFG_TAB_RDAT_CNT_T; + +typedef struct dpp_smmu0_smmu0_cfg_smmu0_tab_rd_cnt_t +{ + ZXIC_UINT32 cfg_smmu0_tab_rd_cnt; +}DPP_SMMU0_SMMU0_CFG_SMMU0_TAB_RD_CNT_T; + +typedef struct dpp_smmu0_smmu0_smmu0_stat_rsp15_0_cnt_t +{ + ZXIC_UINT32 smmu0_stat_rsp15_0_cnt; +}DPP_SMMU0_SMMU0_SMMU0_STAT_RSP15_0_CNT_T; + +typedef struct dpp_smmu0_smmu0_stat_smmu0_req15_0_cnt_t +{ + ZXIC_UINT32 stat_smmu0_req15_0_cnt; +}DPP_SMMU0_SMMU0_STAT_SMMU0_REQ15_0_CNT_T; + +typedef struct dpp_smmu0_smmu0_smmu0_ppu_mex5_0_rsp_cnt_t +{ + ZXIC_UINT32 smmu0_ppu_mex5_0_rsp_cnt; +}DPP_SMMU0_SMMU0_SMMU0_PPU_MEX5_0_RSP_CNT_T; + +typedef struct dpp_smmu0_smmu0_ppu_smmu0_mex5_0_key_cnt_t +{ + ZXIC_UINT32 ppu_smmu0_mex5_0_key_cnt; +}DPP_SMMU0_SMMU0_PPU_SMMU0_MEX5_0_KEY_CNT_T; + +typedef struct dpp_smmu0_smmu0_ftm_stat_smmu0_req0_cnt_t +{ + ZXIC_UINT32 ftm_stat_smmu0_req0_cnt; +}DPP_SMMU0_SMMU0_FTM_STAT_SMMU0_REQ0_CNT_T; + +typedef struct dpp_smmu0_smmu0_ftm_stat_smmu0_req1_cnt_t +{ + ZXIC_UINT32 ftm_stat_smmu0_req1_cnt; +}DPP_SMMU0_SMMU0_FTM_STAT_SMMU0_REQ1_CNT_T; + +typedef struct dpp_smmu0_smmu0_etm_stat_smmu0_req0_cnt_t +{ + ZXIC_UINT32 etm_stat_smmu0_req0_cnt; +}DPP_SMMU0_SMMU0_ETM_STAT_SMMU0_REQ0_CNT_T; + +typedef struct dpp_smmu0_smmu0_etm_stat_smmu0_req1_cnt_t +{ + ZXIC_UINT32 etm_stat_smmu0_req1_cnt; +}DPP_SMMU0_SMMU0_ETM_STAT_SMMU0_REQ1_CNT_T; + +typedef struct dpp_smmu0_smmu0_req_eram0_31_rd_cnt_t +{ + ZXIC_UINT32 req_eram0_31_rd_cnt; +}DPP_SMMU0_SMMU0_REQ_ERAM0_31_RD_CNT_T; + +typedef struct dpp_smmu0_smmu0_req_eram0_31_wr_cnt_t +{ + ZXIC_UINT32 req_eram0_31_wr_cnt; +}DPP_SMMU0_SMMU0_REQ_ERAM0_31_WR_CNT_T; + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_smmu14k_reg.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_smmu14k_reg.h new file mode 100644 index 0000000..734cbfb --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_smmu14k_reg.h @@ -0,0 +1,238 @@ + +#ifndef _DPP_SMMU14K_REG_H_ +#define _DPP_SMMU14K_REG_H_ + +#ifdef __cplusplus +extern "C"{ +#endif + +typedef struct dpp_smmu14k_se_smmu1_hash0_tbl0_cfg_t +{ + ZXIC_UINT32 hash0_tbl0_len; + ZXIC_UINT32 hash0_tbl0_ecc_en; + ZXIC_UINT32 hash0_tbl0_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH0_TBL0_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash0_tbl1_cfg_t +{ + ZXIC_UINT32 hash0_tbl1_len; + ZXIC_UINT32 hash0_tbl1_ecc_en; + ZXIC_UINT32 hash0_tbl1_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH0_TBL1_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash0_tbl2_cfg_t +{ + ZXIC_UINT32 hash0_tbl2_len; + ZXIC_UINT32 hash0_tbl2_ecc_en; + ZXIC_UINT32 hash0_tbl2_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH0_TBL2_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash0_tbl3_cfg_t +{ + ZXIC_UINT32 hash0_tbl3_len; + ZXIC_UINT32 hash0_tbl3_ecc_en; + ZXIC_UINT32 hash0_tbl3_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH0_TBL3_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash0_tbl4_cfg_t +{ + ZXIC_UINT32 hash0_tbl4_len; + ZXIC_UINT32 hash0_tbl4_ecc_en; + ZXIC_UINT32 hash0_tbl4_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH0_TBL4_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash0_tbl5_cfg_t +{ + ZXIC_UINT32 hash0_tbl5_len; + ZXIC_UINT32 hash0_tbl5_ecc_en; + ZXIC_UINT32 hash0_tbl5_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH0_TBL5_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash0_tbl6_cfg_t +{ + ZXIC_UINT32 hash0_tbl6_len; + ZXIC_UINT32 hash0_tbl6_ecc_en; + ZXIC_UINT32 hash0_tbl6_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH0_TBL6_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash0_tbl7_cfg_t +{ + ZXIC_UINT32 hash0_tbl7_len; + ZXIC_UINT32 hash0_tbl7_ecc_en; + ZXIC_UINT32 hash0_tbl7_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH0_TBL7_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash1_tbl0_cfg_t +{ + ZXIC_UINT32 hash1_tbl0_len; + ZXIC_UINT32 hash1_tbl0_ecc_en; + ZXIC_UINT32 hash1_tbl0_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH1_TBL0_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash1_tbl1_cfg_t +{ + ZXIC_UINT32 hash1_tbl1_len; + ZXIC_UINT32 hash1_tbl1_ecc_en; + ZXIC_UINT32 hash1_tbl1_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH1_TBL1_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash1_tbl2_cfg_t +{ + ZXIC_UINT32 hash1_tbl2_len; + ZXIC_UINT32 hash1_tbl2_ecc_en; + ZXIC_UINT32 hash1_tbl2_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH1_TBL2_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash1_tbl3_cfg_t +{ + ZXIC_UINT32 hash1_tbl3_len; + ZXIC_UINT32 hash1_tbl3_ecc_en; + ZXIC_UINT32 hash1_tbl3_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH1_TBL3_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash1_tbl4_cfg_t +{ + ZXIC_UINT32 hash1_tbl4_len; + ZXIC_UINT32 hash1_tbl4_ecc_en; + ZXIC_UINT32 hash1_tbl4_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH1_TBL4_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash1_tbl5_cfg_t +{ + ZXIC_UINT32 hash1_tbl5_len; + ZXIC_UINT32 hash1_tbl5_ecc_en; + ZXIC_UINT32 hash1_tbl5_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH1_TBL5_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash1_tbl6_cfg_t +{ + ZXIC_UINT32 hash1_tbl6_len; + ZXIC_UINT32 hash1_tbl6_ecc_en; + ZXIC_UINT32 hash1_tbl6_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH1_TBL6_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash1_tbl7_cfg_t +{ + ZXIC_UINT32 hash1_tbl7_len; + ZXIC_UINT32 hash1_tbl7_ecc_en; + ZXIC_UINT32 hash1_tbl7_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH1_TBL7_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash2_tbl0_cfg_t +{ + ZXIC_UINT32 hash2_tbl0_len; + ZXIC_UINT32 hash2_tbl0_ecc_en; + ZXIC_UINT32 hash2_tbl0_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH2_TBL0_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash2_tbl1_cfg_t +{ + ZXIC_UINT32 hash2_tbl1_len; + ZXIC_UINT32 hash2_tbl1_ecc_en; + ZXIC_UINT32 hash2_tbl1_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH2_TBL1_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash2_tbl2_cfg_t +{ + ZXIC_UINT32 hash2_tbl2_len; + ZXIC_UINT32 hash2_tbl2_ecc_en; + ZXIC_UINT32 hash2_tbl2_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH2_TBL2_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash2_tbl3_cfg_t +{ + ZXIC_UINT32 hash2_tbl3_len; + ZXIC_UINT32 hash2_tbl3_ecc_en; + ZXIC_UINT32 hash2_tbl3_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH2_TBL3_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash2_tbl4_cfg_t +{ + ZXIC_UINT32 hash2_tbl4_len; + ZXIC_UINT32 hash2_tbl4_ecc_en; + ZXIC_UINT32 hash2_tbl4_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH2_TBL4_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash2_tbl5_cfg_t +{ + ZXIC_UINT32 hash2_tbl5_len; + ZXIC_UINT32 hash2_tbl5_ecc_en; + ZXIC_UINT32 hash2_tbl5_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH2_TBL5_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash2_tbl6_cfg_t +{ + ZXIC_UINT32 hash2_tbl6_len; + ZXIC_UINT32 hash2_tbl6_ecc_en; + ZXIC_UINT32 hash2_tbl6_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH2_TBL6_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash2_tbl7_cfg_t +{ + ZXIC_UINT32 hash2_tbl7_len; + ZXIC_UINT32 hash2_tbl7_ecc_en; + ZXIC_UINT32 hash2_tbl7_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH2_TBL7_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash3_tbl0_cfg_t +{ + ZXIC_UINT32 hash3_tbl0_len; + ZXIC_UINT32 hash3_tbl0_ecc_en; + ZXIC_UINT32 hash3_tbl0_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH3_TBL0_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash3_tbl1_cfg_t +{ + ZXIC_UINT32 hash3_tbl1_len; + ZXIC_UINT32 hash3_tbl1_ecc_en; + ZXIC_UINT32 hash3_tbl1_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH3_TBL1_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash3_tbl2_cfg_t +{ + ZXIC_UINT32 hash3_tbl2_len; + ZXIC_UINT32 hash3_tbl2_ecc_en; + ZXIC_UINT32 hash3_tbl2_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH3_TBL2_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash3_tbl3_cfg_t +{ + ZXIC_UINT32 hash3_tbl3_len; + ZXIC_UINT32 hash3_tbl3_ecc_en; + ZXIC_UINT32 hash3_tbl3_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH3_TBL3_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash3_tbl4_cfg_t +{ + ZXIC_UINT32 hash3_tbl4_len; + ZXIC_UINT32 hash3_tbl4_ecc_en; + ZXIC_UINT32 hash3_tbl4_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH3_TBL4_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash3_tbl5_cfg_t +{ + ZXIC_UINT32 hash3_tbl5_len; + ZXIC_UINT32 hash3_tbl5_ecc_en; + ZXIC_UINT32 hash3_tbl5_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH3_TBL5_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash3_tbl6_cfg_t +{ + ZXIC_UINT32 hash3_tbl6_len; + ZXIC_UINT32 hash3_tbl6_ecc_en; + ZXIC_UINT32 hash3_tbl6_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH3_TBL6_CFG_T; + +typedef struct dpp_smmu14k_se_smmu1_hash3_tbl7_cfg_t +{ + ZXIC_UINT32 hash3_tbl7_len; + ZXIC_UINT32 hash3_tbl7_ecc_en; + ZXIC_UINT32 hash3_tbl7_baddr; +}DPP_SMMU14K_SE_SMMU1_HASH3_TBL7_CFG_T; + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_smmu1_reg.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_smmu1_reg.h new file mode 100644 index 0000000..72ddae5 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_smmu1_reg.h @@ -0,0 +1,1327 @@ + +#ifndef _DPP_SMMU1_REG_H_ +#define _DPP_SMMU1_REG_H_ + +#ifdef __cplusplus +extern "C"{ +#endif + +typedef struct dpp_se_smmu1_ddr_wdat0_t +{ + ZXIC_UINT32 ddr_wdat0; +}DPP_SE_SMMU1_DDR_WDAT0_T; + +typedef struct dpp_se_smmu1_dir_arbi_ser_rpful_t +{ + ZXIC_UINT32 dir_arbi_ser_rpful; +}DPP_SE_SMMU1_DIR_ARBI_SER_RPFUL_T; + +typedef struct dpp_se_smmu1_cfg_wr_arbi_pful2_t +{ + ZXIC_UINT32 hash_wr_pful; + ZXIC_UINT32 dir_wr_pful; +}DPP_SE_SMMU1_CFG_WR_ARBI_PFUL2_T; + +typedef struct dpp_se_smmu1_etm_tbl_cfg_t +{ + ZXIC_UINT32 etm_baddr; +}DPP_SE_SMMU1_ETM_TBL_CFG_T; + +typedef struct dpp_se_smmu1_cfg_cash_addr_pful_t +{ + ZXIC_UINT32 cfg_cash_addr_pful; +}DPP_SE_SMMU1_CFG_CASH_ADDR_PFUL_T; + +typedef struct dpp_se_smmu1_ctrl_rfifo_cfg_t +{ + ZXIC_UINT32 brst_fwft_fifo_prog_empty_assert; + ZXIC_UINT32 brst_fwft_fifo_prog_empty_negate; + ZXIC_UINT32 brst_fwft_fifo_prog_full_assert; + ZXIC_UINT32 brst_fwft_fifo_prog_full_negate; +}DPP_SE_SMMU1_CTRL_RFIFO_CFG_T; + +typedef struct dpp_se_smmu1_cache_req_fifo_cfg_t +{ + ZXIC_UINT32 srch_fifo_pfull_assert; + ZXIC_UINT32 srch_fifo_pfull_negate; +}DPP_SE_SMMU1_CACHE_REQ_FIFO_CFG_T; + +typedef struct dpp_se_smmu1_ddr_wdat1_t +{ + ZXIC_UINT32 ddr_wdat1; +}DPP_SE_SMMU1_DDR_WDAT1_T; + +typedef struct dpp_se_smmu1_ddr_wdat2_t +{ + ZXIC_UINT32 ddr_wdat2; +}DPP_SE_SMMU1_DDR_WDAT2_T; + +typedef struct dpp_se_smmu1_ddr_wdat3_t +{ + ZXIC_UINT32 ddr_wdat3; +}DPP_SE_SMMU1_DDR_WDAT3_T; + +typedef struct dpp_se_smmu1_ddr_wdat4_t +{ + ZXIC_UINT32 ddr_wdat4; +}DPP_SE_SMMU1_DDR_WDAT4_T; + +typedef struct dpp_se_smmu1_ddr_wdat5_t +{ + ZXIC_UINT32 ddr_wdat5; +}DPP_SE_SMMU1_DDR_WDAT5_T; + +typedef struct dpp_se_smmu1_ddr_wdat6_t +{ + ZXIC_UINT32 ddr_wdat6; +}DPP_SE_SMMU1_DDR_WDAT6_T; + +typedef struct dpp_se_smmu1_ddr_wdat7_t +{ + ZXIC_UINT32 ddr_wdat7; +}DPP_SE_SMMU1_DDR_WDAT7_T; + +typedef struct dpp_se_smmu1_ddr_wdat8_t +{ + ZXIC_UINT32 ddr_wdat8; +}DPP_SE_SMMU1_DDR_WDAT8_T; + +typedef struct dpp_se_smmu1_ddr_wdat9_t +{ + ZXIC_UINT32 ddr_wdat9; +}DPP_SE_SMMU1_DDR_WDAT9_T; + +typedef struct dpp_se_smmu1_ddr_wdat10_t +{ + ZXIC_UINT32 ddr_wdat10; +}DPP_SE_SMMU1_DDR_WDAT10_T; + +typedef struct dpp_se_smmu1_ddr_wdat11_t +{ + ZXIC_UINT32 ddr_wdat11; +}DPP_SE_SMMU1_DDR_WDAT11_T; + +typedef struct dpp_se_smmu1_ddr_wdat12_t +{ + ZXIC_UINT32 ddr_wdat12; +}DPP_SE_SMMU1_DDR_WDAT12_T; + +typedef struct dpp_se_smmu1_ddr_wdat13_t +{ + ZXIC_UINT32 ddr_wdat13; +}DPP_SE_SMMU1_DDR_WDAT13_T; + +typedef struct dpp_se_smmu1_ddr_wdat14_t +{ + ZXIC_UINT32 ddr_wdat14; +}DPP_SE_SMMU1_DDR_WDAT14_T; + +typedef struct dpp_se_smmu1_ddr_wdat15_t +{ + ZXIC_UINT32 ddr_wdat15; +}DPP_SE_SMMU1_DDR_WDAT15_T; + +typedef struct dpp_se_smmu1_cnt_stat_cache_en_t +{ + ZXIC_UINT32 cnt_stat_cache_en; +}DPP_SE_SMMU1_CNT_STAT_CACHE_EN_T; + +typedef struct dpp_se_smmu1_cnt_stat_cache_clr_t +{ + ZXIC_UINT32 cnt_stat_cache_clr; +}DPP_SE_SMMU1_CNT_STAT_CACHE_CLR_T; + +typedef struct dpp_se_smmu1_cnt_stat_cache_req_63_32_t +{ + ZXIC_UINT32 cnt_stat_cache_req_63_32; +}DPP_SE_SMMU1_CNT_STAT_CACHE_REQ_63_32_T; + +typedef struct dpp_se_smmu1_cnt_stat_cache_req_31_0_t +{ + ZXIC_UINT32 cnt_stat_cache_req_31_0; +}DPP_SE_SMMU1_CNT_STAT_CACHE_REQ_31_0_T; + +typedef struct dpp_se_smmu1_cnt_stat_cache_hit_63_32_t +{ + ZXIC_UINT32 cnt_stat_cache_hit_63_32; +}DPP_SE_SMMU1_CNT_STAT_CACHE_HIT_63_32_T; + +typedef struct dpp_se_smmu1_cnt_stat_cache_hit_31_0_t +{ + ZXIC_UINT32 cnt_stat_cache_hit_31_0; +}DPP_SE_SMMU1_CNT_STAT_CACHE_HIT_31_0_T; + +typedef struct dpp_se_smmu1_ddr_cmd0_t +{ + ZXIC_UINT32 ecc_en; + ZXIC_UINT32 rw_len; + ZXIC_UINT32 baddr; +}DPP_SE_SMMU1_DDR_CMD0_T; + +typedef struct dpp_se_smmu1_info_addr_t +{ + ZXIC_UINT32 info_addr; +}DPP_SE_SMMU1_INFO_ADDR_T; + +typedef struct dpp_se_smmu1_ddr_cmd1_t +{ + ZXIC_UINT32 rw_flag; + ZXIC_UINT32 rw_addr; +}DPP_SE_SMMU1_DDR_CMD1_T; + +typedef struct dpp_se_smmu1_clr_start_addr_t +{ + ZXIC_UINT32 clr_start_addr; +}DPP_SE_SMMU1_CLR_START_ADDR_T; + +typedef struct dpp_se_smmu1_clr_end_addr_t +{ + ZXIC_UINT32 clr_end_addr; +}DPP_SE_SMMU1_CLR_END_ADDR_T; + +typedef struct dpp_se_smmu1_clr_tbl_en_t +{ + ZXIC_UINT32 cfg_init_en; + ZXIC_UINT32 clr_tbl_en; +}DPP_SE_SMMU1_CLR_TBL_EN_T; + +typedef struct dpp_se_smmu1_debug_cnt_mode_t +{ + ZXIC_UINT32 cnt_rd_mode; + ZXIC_UINT32 cnt_overflow_mode; +}DPP_SE_SMMU1_DEBUG_CNT_MODE_T; + +typedef struct dpp_se_smmu1_init_done_t +{ + ZXIC_UINT32 cache_init_done; + ZXIC_UINT32 clr_done; + ZXIC_UINT32 init_ok; +}DPP_SE_SMMU1_INIT_DONE_T; + +typedef struct dpp_se_smmu1_cpu_rsp_rd_done_t +{ + ZXIC_UINT32 cpu_rsp_rd_done; +}DPP_SE_SMMU1_CPU_RSP_RD_DONE_T; + +typedef struct dpp_se_smmu1_ksch_oam_sp_en_t +{ + ZXIC_UINT32 ksch_oam_sp_en; +}DPP_SE_SMMU1_KSCH_OAM_SP_EN_T; + +typedef struct dpp_se_smmu1_cfg_cache_en_t +{ + ZXIC_UINT32 cfg_cache_en; +}DPP_SE_SMMU1_CFG_CACHE_EN_T; + +typedef struct dpp_se_smmu1_cache_age_en_t +{ + ZXIC_UINT32 cache_age_en; +}DPP_SE_SMMU1_CACHE_AGE_EN_T; + +typedef struct dpp_se_smmu1_cpu_rdat0_t +{ + ZXIC_UINT32 cpu_rdat0; +}DPP_SE_SMMU1_CPU_RDAT0_T; + +typedef struct dpp_se_smmu1_cpu_rdat1_t +{ + ZXIC_UINT32 cpu_rdat1; +}DPP_SE_SMMU1_CPU_RDAT1_T; + +typedef struct dpp_se_smmu1_cpu_rdat2_t +{ + ZXIC_UINT32 cpu_rdat2; +}DPP_SE_SMMU1_CPU_RDAT2_T; + +typedef struct dpp_se_smmu1_cpu_rdat3_t +{ + ZXIC_UINT32 cpu_rdat3; +}DPP_SE_SMMU1_CPU_RDAT3_T; + +typedef struct dpp_se_smmu1_cpu_rdat4_t +{ + ZXIC_UINT32 cpu_rdat4; +}DPP_SE_SMMU1_CPU_RDAT4_T; + +typedef struct dpp_se_smmu1_cpu_rdat5_t +{ + ZXIC_UINT32 cpu_rdat5; +}DPP_SE_SMMU1_CPU_RDAT5_T; + +typedef struct dpp_se_smmu1_cpu_rdat6_t +{ + ZXIC_UINT32 cpu_rdat6; +}DPP_SE_SMMU1_CPU_RDAT6_T; + +typedef struct dpp_se_smmu1_cpu_rdat7_t +{ + ZXIC_UINT32 cpu_rdat7; +}DPP_SE_SMMU1_CPU_RDAT7_T; + +typedef struct dpp_se_smmu1_cpu_rdat8_t +{ + ZXIC_UINT32 cpu_rdat8; +}DPP_SE_SMMU1_CPU_RDAT8_T; + +typedef struct dpp_se_smmu1_cpu_rdat9_t +{ + ZXIC_UINT32 cpu_rdat9; +}DPP_SE_SMMU1_CPU_RDAT9_T; + +typedef struct dpp_se_smmu1_cpu_rdat10_t +{ + ZXIC_UINT32 cpu_rdat10; +}DPP_SE_SMMU1_CPU_RDAT10_T; + +typedef struct dpp_se_smmu1_cpu_rdat11_t +{ + ZXIC_UINT32 cpu_rdat11; +}DPP_SE_SMMU1_CPU_RDAT11_T; + +typedef struct dpp_se_smmu1_cpu_rdat12_t +{ + ZXIC_UINT32 cpu_rdat12; +}DPP_SE_SMMU1_CPU_RDAT12_T; + +typedef struct dpp_se_smmu1_cpu_rdat13_t +{ + ZXIC_UINT32 cpu_rdat13; +}DPP_SE_SMMU1_CPU_RDAT13_T; + +typedef struct dpp_se_smmu1_cpu_rdat14_t +{ + ZXIC_UINT32 cpu_rdat14; +}DPP_SE_SMMU1_CPU_RDAT14_T; + +typedef struct dpp_se_smmu1_cpu_rdat15_t +{ + ZXIC_UINT32 cpu_rdat15; +}DPP_SE_SMMU1_CPU_RDAT15_T; + +typedef struct dpp_se_smmu1_ctrl_cpu_rd_rdy_t +{ + ZXIC_UINT32 ctrl_cpu_rd_rdy; +}DPP_SE_SMMU1_CTRL_CPU_RD_RDY_T; + +typedef struct dpp_se_smmu1_cpu_warbi_rdy_cfg_t +{ + ZXIC_UINT32 cpu_warbi_rdy_cfg; +}DPP_SE_SMMU1_CPU_WARBI_RDY_CFG_T; + +typedef struct dpp_se_smmu1_dir_arbi_cpu_rpful_t +{ + ZXIC_UINT32 smmu1_cfg_rpful; + ZXIC_UINT32 smmu1_cfg_wpful; +}DPP_SE_SMMU1_DIR_ARBI_CPU_RPFUL_T; + +typedef struct dpp_se_smmu1_dir_arbi_wpful_t +{ + ZXIC_UINT32 smmu1_ser_wdir_pful; + ZXIC_UINT32 smmu1_cfg_wdir_pful; +}DPP_SE_SMMU1_DIR_ARBI_WPFUL_T; + +typedef struct dpp_se_smmu1_cfg_wr_arbi_pful0_t +{ + ZXIC_UINT32 arbi_out_pful; + ZXIC_UINT32 cpu_wr_pful; +}DPP_SE_SMMU1_CFG_WR_ARBI_PFUL0_T; + +typedef struct dpp_se_smmu1_cfg_wr_arbi_pful1_t +{ + ZXIC_UINT32 tm_wr_pful; + ZXIC_UINT32 stat_wr_pful; +}DPP_SE_SMMU1_CFG_WR_ARBI_PFUL1_T; + +typedef struct dpp_se_smmu1_smmu1_wdone_pful_cfg_t +{ + ZXIC_UINT32 smmu1_wdone_pful_cfg; +}DPP_SE_SMMU1_SMMU1_WDONE_PFUL_CFG_T; + +typedef struct dpp_se_smmu1_stat_rate_cfg_cnt_t +{ + ZXIC_UINT32 stat_rate_cfg_cnt; +}DPP_SE_SMMU1_STAT_RATE_CFG_CNT_T; + +typedef struct dpp_se_smmu1_ftm_rate_cfg_cnt_t +{ + ZXIC_UINT32 ftm_rate_cfg_cnt; +}DPP_SE_SMMU1_FTM_RATE_CFG_CNT_T; + +typedef struct dpp_se_smmu1_etm_rate_cfg_cnt_t +{ + ZXIC_UINT32 etm_rate_cfg_cnt; +}DPP_SE_SMMU1_ETM_RATE_CFG_CNT_T; + +typedef struct dpp_se_smmu1_dir_rate_cfg_cnt_t +{ + ZXIC_UINT32 dir_rate_cfg_cnt; +}DPP_SE_SMMU1_DIR_RATE_CFG_CNT_T; + +typedef struct dpp_se_smmu1_hash_rate_cfg_cnt_t +{ + ZXIC_UINT32 hash_rate_cfg_cnt; +}DPP_SE_SMMU1_HASH_RATE_CFG_CNT_T; + +typedef struct dpp_se_smmu1_ftm_tbl_cfg_t +{ + ZXIC_UINT32 ftm_baddr; +}DPP_SE_SMMU1_FTM_TBL_CFG_T; + +typedef struct dpp_se_smmu1_lpm_v4_as_tbl_cfg_t +{ + ZXIC_UINT32 lpm_v4_as_rsp_len; + ZXIC_UINT32 lpm_v4_as_ecc_en; + ZXIC_UINT32 lpm_v4_as_baddr; +}DPP_SE_SMMU1_LPM_V4_AS_TBL_CFG_T; + +typedef struct dpp_se_smmu1_lpm_v4_tbl_cfg_t +{ + ZXIC_UINT32 lpm_v4_len; + ZXIC_UINT32 lpm_v4_ecc_en; + ZXIC_UINT32 lpm_v4_baddr; +}DPP_SE_SMMU1_LPM_V4_TBL_CFG_T; + +typedef struct dpp_se_smmu1_lpm_v6_tbl_cfg_t +{ + ZXIC_UINT32 lpm_v6_len; + ZXIC_UINT32 lpm_v6_ecc_en; + ZXIC_UINT32 lpm_v6_baddr; +}DPP_SE_SMMU1_LPM_V6_TBL_CFG_T; + +typedef struct dpp_se_smmu1_lpm_v6_as_tbl_cfg_t +{ + ZXIC_UINT32 lpm_v6_as_rsp_len; + ZXIC_UINT32 lpm_v6_as_ecc_en; + ZXIC_UINT32 lpm_v6_as_baddr; +}DPP_SE_SMMU1_LPM_V6_AS_TBL_CFG_T; + +typedef struct dpp_se_smmu1_dma_tbl_cfg_t +{ + ZXIC_UINT32 dma_baddr; +}DPP_SE_SMMU1_DMA_TBL_CFG_T; + +typedef struct dpp_se_smmu1_oam_tbl_cfg_t +{ + ZXIC_UINT32 oam_baddr; +}DPP_SE_SMMU1_OAM_TBL_CFG_T; + +typedef struct dpp_se_smmu1_ctrl_rpar_cpu_pful_t +{ + ZXIC_UINT32 ctrl_rpar_cpu_pful; +}DPP_SE_SMMU1_CTRL_RPAR_CPU_PFUL_T; + +typedef struct dpp_se_smmu1_cfg_ksch_dir_pful_t +{ + ZXIC_UINT32 cfg_ksch_dir_pful; +}DPP_SE_SMMU1_CFG_KSCH_DIR_PFUL_T; + +typedef struct dpp_se_smmu1_cfg_ksch_hash_pful_t +{ + ZXIC_UINT32 cfg_ksch_hash_pful; +}DPP_SE_SMMU1_CFG_KSCH_HASH_PFUL_T; + +typedef struct dpp_se_smmu1_cfg_ksch_lpm_pful_t +{ + ZXIC_UINT32 cfg_ksch_lpm_pful; +}DPP_SE_SMMU1_CFG_KSCH_LPM_PFUL_T; + +typedef struct dpp_se_smmu1_cfg_ksch_lpm_as_pful_t +{ + ZXIC_UINT32 cfg_ksch_lpm_as_pful; +}DPP_SE_SMMU1_CFG_KSCH_LPM_AS_PFUL_T; + +typedef struct dpp_se_smmu1_cfg_ksch_stat_pful_t +{ + ZXIC_UINT32 cfg_ksch_stat_pful; +}DPP_SE_SMMU1_CFG_KSCH_STAT_PFUL_T; + +typedef struct dpp_se_smmu1_cfg_ksch_tm_pful_t +{ + ZXIC_UINT32 cfg_ksch_tm_pful; +}DPP_SE_SMMU1_CFG_KSCH_TM_PFUL_T; + +typedef struct dpp_se_smmu1_cfg_ksch_oam_pful_t +{ + ZXIC_UINT32 cfg_ksch_oam_pful; +}DPP_SE_SMMU1_CFG_KSCH_OAM_PFUL_T; + +typedef struct dpp_se_smmu1_cfg_ksch_dma_pful_t +{ + ZXIC_UINT32 cfg_ksch_dma_pful; +}DPP_SE_SMMU1_CFG_KSCH_DMA_PFUL_T; + +typedef struct dpp_se_smmu1_ctrl_wfifo_cfg_t +{ + ZXIC_UINT32 ctrl_wfifo_cfg; +}DPP_SE_SMMU1_CTRL_WFIFO_CFG_T; + +typedef struct dpp_se_smmu1_rsch_hash_ptr_cfg_t +{ + ZXIC_UINT32 rsch_hash_ptr_cfg; +}DPP_SE_SMMU1_RSCH_HASH_PTR_CFG_T; + +typedef struct dpp_se_smmu1_rsch_lpm_ptr_cfg_t +{ + ZXIC_UINT32 rsch_lpm_ptr_cfg; +}DPP_SE_SMMU1_RSCH_LPM_PTR_CFG_T; + +typedef struct dpp_se_smmu1_rsch_lpm_as_ptr_cfg_t +{ + ZXIC_UINT32 rsch_lpm_as_ptr_cfg; +}DPP_SE_SMMU1_RSCH_LPM_AS_PTR_CFG_T; + +typedef struct dpp_se_smmu1_rsch_stat_ptr_cfg_t +{ + ZXIC_UINT32 rsch_stat_ptr_cfg; +}DPP_SE_SMMU1_RSCH_STAT_PTR_CFG_T; + +typedef struct dpp_se_smmu1_rsch_oam_ptr_cfg_t +{ + ZXIC_UINT32 rsch_oam_ptr_cfg; +}DPP_SE_SMMU1_RSCH_OAM_PTR_CFG_T; + +typedef struct dpp_se_smmu1_rschd_fifo_pept_cfg_t +{ + ZXIC_UINT32 rschd_fifo_pept_cfg; +}DPP_SE_SMMU1_RSCHD_FIFO_PEPT_CFG_T; + +typedef struct dpp_se_smmu1_dir_fifo_pful_cfg_t +{ + ZXIC_UINT32 dir_fifo_pful_cfg; +}DPP_SE_SMMU1_DIR_FIFO_PFUL_CFG_T; + +typedef struct dpp_se_smmu1_hash_fifo_pful_cfg_t +{ + ZXIC_UINT32 hash_fifo_pful_cfg; +}DPP_SE_SMMU1_HASH_FIFO_PFUL_CFG_T; + +typedef struct dpp_se_smmu1_lpm_fifo_pful_cfg_t +{ + ZXIC_UINT32 lpm_fifo_pful_cfg; +}DPP_SE_SMMU1_LPM_FIFO_PFUL_CFG_T; + +typedef struct dpp_se_smmu1_lpm_as_fifo_pful_cfg_t +{ + ZXIC_UINT32 lpm_as_fifo_pful_cfg; +}DPP_SE_SMMU1_LPM_AS_FIFO_PFUL_CFG_T; + +typedef struct dpp_se_smmu1_stat_fifo_pful_cfg_t +{ + ZXIC_UINT32 stat_fifo_pful_cfg; +}DPP_SE_SMMU1_STAT_FIFO_PFUL_CFG_T; + +typedef struct dpp_se_smmu1_ftm_fifo_pful_cfg_t +{ + ZXIC_UINT32 ftm_fifo_pful_cfg; +}DPP_SE_SMMU1_FTM_FIFO_PFUL_CFG_T; + +typedef struct dpp_se_smmu1_etm_fifo_pful_cfg_t +{ + ZXIC_UINT32 etm_fifo_pful_cfg; +}DPP_SE_SMMU1_ETM_FIFO_PFUL_CFG_T; + +typedef struct dpp_se_smmu1_oam_fifo_pful_cfg_t +{ + ZXIC_UINT32 oam_fifo_pful_cfg; +}DPP_SE_SMMU1_OAM_FIFO_PFUL_CFG_T; + +typedef struct dpp_se_smmu1_dma_fifo_pful_cfg_t +{ + ZXIC_UINT32 dma_fifo_pful_cfg; +}DPP_SE_SMMU1_DMA_FIFO_PFUL_CFG_T; + +typedef struct dpp_se_smmu1_cache_rsp_rr_fifo_cfg_t +{ + ZXIC_UINT32 rr_pfull_assert0; + ZXIC_UINT32 rr_pfull_negate0; +}DPP_SE_SMMU1_CACHE_RSP_RR_FIFO_CFG_T; + +typedef struct dpp_se_smmu1_ddr_rsp_rr_fifo_cfg_t +{ + ZXIC_UINT32 rr_pfull_assert1; + ZXIC_UINT32 rr_pfull_negate1; +}DPP_SE_SMMU1_DDR_RSP_RR_FIFO_CFG_T; + +typedef struct dpp_se_smmu1_cpu_cahce_fifo_cfg_t +{ + ZXIC_UINT32 smmu1_cahce_fwft_fifo_pfull_assert; + ZXIC_UINT32 smmu1_cahce_fwft_fifo_pfull_negate; +}DPP_SE_SMMU1_CPU_CAHCE_FIFO_CFG_T; + +typedef struct dpp_se_smmu1_cache_rsp_fifo_cfg_t +{ + ZXIC_UINT32 rschd_fifo_pfull_assert; + ZXIC_UINT32 rschd_fifo_pfull_negate; +}DPP_SE_SMMU1_CACHE_RSP_FIFO_CFG_T; + +typedef struct dpp_se_smmu1_test_state_t +{ + ZXIC_UINT32 test_state; +}DPP_SE_SMMU1_TEST_STATE_T; + +typedef struct dpp_se_smmu1_cache_fifo_ept_t +{ + ZXIC_UINT32 cache_fifo_ept; +}DPP_SE_SMMU1_CACHE_FIFO_EPT_T; + +typedef struct dpp_se_smmu1_rr_fifo_ept_t +{ + ZXIC_UINT32 rr_fifo_ept; +}DPP_SE_SMMU1_RR_FIFO_EPT_T; + +typedef struct dpp_se_smmu1_wr_fifo_ept_t +{ + ZXIC_UINT32 dir_arbi_ept; +}DPP_SE_SMMU1_WR_FIFO_EPT_T; + +typedef struct dpp_se_smmu1_wdone_fifo_ept_t +{ + ZXIC_UINT32 wdone_fifo_ept; +}DPP_SE_SMMU1_WDONE_FIFO_EPT_T; + +typedef struct dpp_se_smmu1_kschd_fifo_ept0_t +{ + ZXIC_UINT32 kschd_fifo_ept0; +}DPP_SE_SMMU1_KSCHD_FIFO_EPT0_T; + +typedef struct dpp_se_smmu1_cash_fifo_ept_t +{ + ZXIC_UINT32 cash_fifo_ept; +}DPP_SE_SMMU1_CASH_FIFO_EPT_T; + +typedef struct dpp_se_smmu1_ctrl_fifo_ept_t +{ + ZXIC_UINT32 ctrl_fifo_ept; +}DPP_SE_SMMU1_CTRL_FIFO_EPT_T; + +typedef struct dpp_se_smmu1_smmu1_rschd_ept3_t +{ + ZXIC_UINT32 rschd_fifo_ept3; +}DPP_SE_SMMU1_SMMU1_RSCHD_EPT3_T; + +typedef struct dpp_se_smmu1_smmu1_rschd_ept2_t +{ + ZXIC_UINT32 rschd_fifo_ept2; +}DPP_SE_SMMU1_SMMU1_RSCHD_EPT2_T; + +typedef struct dpp_se_smmu1_smmu1_rschd_ept1_t +{ + ZXIC_UINT32 rschd_fifo_ept1; +}DPP_SE_SMMU1_SMMU1_RSCHD_EPT1_T; + +typedef struct dpp_se_smmu1_smmu1_rschd_ept0_t +{ + ZXIC_UINT32 rschd_fifo_ept0; +}DPP_SE_SMMU1_SMMU1_RSCHD_EPT0_T; + +typedef struct dpp_se_smmu1_cash0_ecc_err_addr_t +{ + ZXIC_UINT32 cash0_ecc_err_addr; +}DPP_SE_SMMU1_CASH0_ECC_ERR_ADDR_T; + +typedef struct dpp_se_smmu1_arbi_cpu_wr_rdy_t +{ + ZXIC_UINT32 arbi_cpu_wr_rdy; +}DPP_SE_SMMU1_ARBI_CPU_WR_RDY_T; + +typedef struct dpp_se_smmu1_smmu1_int_0_en_t +{ + ZXIC_UINT32 smmu1_int_0_en; +}DPP_SE_SMMU1_SMMU1_INT_0_EN_T; + +typedef struct dpp_se_smmu1_smmu1_int_0_mask_t +{ + ZXIC_UINT32 smmu1_int_0_mask; +}DPP_SE_SMMU1_SMMU1_INT_0_MASK_T; + +typedef struct dpp_se_smmu1_smmu1_int_1_en_t +{ + ZXIC_UINT32 smmu1_int_1_en; +}DPP_SE_SMMU1_SMMU1_INT_1_EN_T; + +typedef struct dpp_se_smmu1_smmu1_int_1_mask_t +{ + ZXIC_UINT32 smmu1_int_1_mask; +}DPP_SE_SMMU1_SMMU1_INT_1_MASK_T; + +typedef struct dpp_se_smmu1_smmu1_int_2_en_t +{ + ZXIC_UINT32 smmu1_int_2_en; +}DPP_SE_SMMU1_SMMU1_INT_2_EN_T; + +typedef struct dpp_se_smmu1_smmu1_int_2_mask_t +{ + ZXIC_UINT32 smmu1_int_2_mask; +}DPP_SE_SMMU1_SMMU1_INT_2_MASK_T; + +typedef struct dpp_se_smmu1_smmu1_int_3_en_t +{ + ZXIC_UINT32 smmu1_int_3_en; +}DPP_SE_SMMU1_SMMU1_INT_3_EN_T; + +typedef struct dpp_se_smmu1_smmu1_int_3_mask_t +{ + ZXIC_UINT32 smmu1_int_3_mask; +}DPP_SE_SMMU1_SMMU1_INT_3_MASK_T; + +typedef struct dpp_se_smmu1_smmu1_int_0_status_t +{ + ZXIC_UINT32 smmu1_int_0_status; +}DPP_SE_SMMU1_SMMU1_INT_0_STATUS_T; + +typedef struct dpp_se_smmu1_smmu1_int_1_status_t +{ + ZXIC_UINT32 smmu1_int_1_status; +}DPP_SE_SMMU1_SMMU1_INT_1_STATUS_T; + +typedef struct dpp_se_smmu1_smmu1_int_2_status_t +{ + ZXIC_UINT32 smmu1_int_2_status; +}DPP_SE_SMMU1_SMMU1_INT_2_STATUS_T; + +typedef struct dpp_se_smmu1_smmu1_int_3_status_t +{ + ZXIC_UINT32 smmu1_int_3_status; +}DPP_SE_SMMU1_SMMU1_INT_3_STATUS_T; + +typedef struct dpp_se_smmu1_smmu1_int_status_t +{ + ZXIC_UINT32 smmu1_int_status; +}DPP_SE_SMMU1_SMMU1_INT_STATUS_T; + +typedef struct dpp_se_smmu1_ctrl_to_cash7_0_fc_cnt_t +{ + ZXIC_UINT32 ctrl_to_cash7_0_fc_cnt; +}DPP_SE_SMMU1_CTRL_TO_CASH7_0_FC_CNT_T; + +typedef struct dpp_se_smmu1_cash7_0_to_ctrl_req_cnt_t +{ + ZXIC_UINT32 cash7_0_to_ctrl_req_cnt; +}DPP_SE_SMMU1_CASH7_0_TO_CTRL_REQ_CNT_T; + +typedef struct dpp_se_smmu1_rschd_to_cache7_fc_cnt_t +{ + ZXIC_UINT32 rschd_to_cache7_fc_cnt; +}DPP_SE_SMMU1_RSCHD_TO_CACHE7_FC_CNT_T; + +typedef struct dpp_se_smmu1_cash7_to_cache_rsp_cnt_t +{ + ZXIC_UINT32 cash7_to_cache_rsp_cnt; +}DPP_SE_SMMU1_CASH7_TO_CACHE_RSP_CNT_T; + +typedef struct dpp_se_smmu1_cash7_to_ctrl_fc_cnt_t +{ + ZXIC_UINT32 cash7_to_ctrl_fc_cnt; +}DPP_SE_SMMU1_CASH7_TO_CTRL_FC_CNT_T; + +typedef struct dpp_se_smmu1_ctrl_to_cash7_0_rsp_cnt_t +{ + ZXIC_UINT32 ctrl_to_cash7_0_rsp_cnt; +}DPP_SE_SMMU1_CTRL_TO_CASH7_0_RSP_CNT_T; + +typedef struct dpp_se_smmu1_kschd_to_cache7_0_req_cnt_t +{ + ZXIC_UINT32 kschd_to_cache7_0_req_cnt; +}DPP_SE_SMMU1_KSCHD_TO_CACHE7_0_REQ_CNT_T; + +typedef struct dpp_se_smmu1_cache7_0_to_kschd_fc_cnt_t +{ + ZXIC_UINT32 cache7_0_to_kschd_fc_cnt; +}DPP_SE_SMMU1_CACHE7_0_TO_KSCHD_FC_CNT_T; + +typedef struct dpp_se_smmu1_dma_to_smmu1_rd_req_cnt_t +{ + ZXIC_UINT32 dma_to_smmu1_rd_req_cnt; +}DPP_SE_SMMU1_DMA_TO_SMMU1_RD_REQ_CNT_T; + +typedef struct dpp_se_smmu1_oam_to_kschd_req_cnt_t +{ + ZXIC_UINT32 oam_to_kschd_req_cnt; +}DPP_SE_SMMU1_OAM_TO_KSCHD_REQ_CNT_T; + +typedef struct dpp_se_smmu1_oam_rr_state_rsp_cnt_t +{ + ZXIC_UINT32 oam_rr_state_rsp_cnt; +}DPP_SE_SMMU1_OAM_RR_STATE_RSP_CNT_T; + +typedef struct dpp_se_smmu1_oam_clash_info_cnt_t +{ + ZXIC_UINT32 oam_clash_info_cnt; +}DPP_SE_SMMU1_OAM_CLASH_INFO_CNT_T; + +typedef struct dpp_se_smmu1_oam_to_rr_req_cnt_t +{ + ZXIC_UINT32 oam_to_rr_req_cnt; +}DPP_SE_SMMU1_OAM_TO_RR_REQ_CNT_T; + +typedef struct dpp_se_smmu1_lpm_as_to_kschd_req_cnt_t +{ + ZXIC_UINT32 lpm_as_to_kschd_req_cnt; +}DPP_SE_SMMU1_LPM_AS_TO_KSCHD_REQ_CNT_T; + +typedef struct dpp_se_smmu1_lpm_as_rr_state_rsp_cnt_t +{ + ZXIC_UINT32 lpm_as_rr_state_rsp_cnt; +}DPP_SE_SMMU1_LPM_AS_RR_STATE_RSP_CNT_T; + +typedef struct dpp_se_smmu1_lpm_as_clash_info_cnt_t +{ + ZXIC_UINT32 lpm_as_clash_info_cnt; +}DPP_SE_SMMU1_LPM_AS_CLASH_INFO_CNT_T; + +typedef struct dpp_se_smmu1_lpm_as_to_rr_req_cnt_t +{ + ZXIC_UINT32 lpm_as_to_rr_req_cnt; +}DPP_SE_SMMU1_LPM_AS_TO_RR_REQ_CNT_T; + +typedef struct dpp_se_smmu1_lpm_to_kschd_req_cnt_t +{ + ZXIC_UINT32 lpm_to_kschd_req_cnt; +}DPP_SE_SMMU1_LPM_TO_KSCHD_REQ_CNT_T; + +typedef struct dpp_se_smmu1_lpm_rr_state_rsp_cnt_t +{ + ZXIC_UINT32 lpm_rr_state_rsp_cnt; +}DPP_SE_SMMU1_LPM_RR_STATE_RSP_CNT_T; + +typedef struct dpp_se_smmu1_lpm_clash_info_cnt_t +{ + ZXIC_UINT32 lpm_clash_info_cnt; +}DPP_SE_SMMU1_LPM_CLASH_INFO_CNT_T; + +typedef struct dpp_se_smmu1_lpm_to_rr_req_cnt_t +{ + ZXIC_UINT32 lpm_to_rr_req_cnt; +}DPP_SE_SMMU1_LPM_TO_RR_REQ_CNT_T; + +typedef struct dpp_se_smmu1_hash3_0_to_kschd_req_cnt_t +{ + ZXIC_UINT32 hash3_0_to_kschd_req_cnt; +}DPP_SE_SMMU1_HASH3_0_TO_KSCHD_REQ_CNT_T; + +typedef struct dpp_se_smmu1_hash3_0_rr_state_rsp_cnt_t +{ + ZXIC_UINT32 hash3_0_rr_state_rsp_cnt; +}DPP_SE_SMMU1_HASH3_0_RR_STATE_RSP_CNT_T; + +typedef struct dpp_se_smmu1_hash3_0_clash_info_cnt_t +{ + ZXIC_UINT32 hash3_0_clash_info_cnt; +}DPP_SE_SMMU1_HASH3_0_CLASH_INFO_CNT_T; + +typedef struct dpp_se_smmu1_hash3_0_to_rr_req_cnt_t +{ + ZXIC_UINT32 hash3_0_to_rr_req_cnt; +}DPP_SE_SMMU1_HASH3_0_TO_RR_REQ_CNT_T; + +typedef struct dpp_se_smmu1_dir3_0_to_kschd_req_cnt_t +{ + ZXIC_UINT32 dir3_0_to_kschd_req_cnt; +}DPP_SE_SMMU1_DIR3_0_TO_KSCHD_REQ_CNT_T; + +typedef struct dpp_se_smmu1_dir3_0_clash_info_cnt_t +{ + ZXIC_UINT32 dir3_0_clash_info_cnt; +}DPP_SE_SMMU1_DIR3_0_CLASH_INFO_CNT_T; + +typedef struct dpp_se_smmu1_dir_tbl_wr_req_cnt_t +{ + ZXIC_UINT32 dir_tbl_wr_req_cnt; +}DPP_SE_SMMU1_DIR_TBL_WR_REQ_CNT_T; + +typedef struct dpp_se_smmu1_warbi_to_dir_tbl_warbi_fc_cnt_t +{ + ZXIC_UINT32 warbi_to_dir_tbl_warbi_fc_cnt; +}DPP_SE_SMMU1_WARBI_TO_DIR_TBL_WARBI_FC_CNT_T; + +typedef struct dpp_se_smmu1_dir3_0_to_bank_rr_req_cnt_t +{ + ZXIC_UINT32 dir3_0_to_bank_rr_req_cnt; +}DPP_SE_SMMU1_DIR3_0_TO_BANK_RR_REQ_CNT_T; + +typedef struct dpp_se_smmu1_kschd_to_dir3_0_fc_cnt_t +{ + ZXIC_UINT32 kschd_to_dir3_0_fc_cnt; +}DPP_SE_SMMU1_KSCHD_TO_DIR3_0_FC_CNT_T; + +typedef struct dpp_se_smmu1_dir3_0_rr_state_rsp_cnt_t +{ + ZXIC_UINT32 dir3_0_rr_state_rsp_cnt; +}DPP_SE_SMMU1_DIR3_0_RR_STATE_RSP_CNT_T; + +typedef struct dpp_se_smmu1_wr_done_to_warbi_fc_cnt_t +{ + ZXIC_UINT32 wr_done_to_warbi_fc_cnt; +}DPP_SE_SMMU1_WR_DONE_TO_WARBI_FC_CNT_T; + +typedef struct dpp_se_smmu1_wr_done_ptr_req_cnt_t +{ + ZXIC_UINT32 wr_done_ptr_req_cnt; +}DPP_SE_SMMU1_WR_DONE_PTR_REQ_CNT_T; + +typedef struct dpp_se_smmu1_ctrl7_0_to_warbi_fc_cnt_t +{ + ZXIC_UINT32 ctrl7_0_to_warbi_fc_cnt; +}DPP_SE_SMMU1_CTRL7_0_TO_WARBI_FC_CNT_T; + +typedef struct dpp_se_smmu1_warbi_to_ctrl7_0_wr_req_cnt_t +{ + ZXIC_UINT32 warbi_to_ctrl7_0_wr_req_cnt; +}DPP_SE_SMMU1_WARBI_TO_CTRL7_0_WR_REQ_CNT_T; + +typedef struct dpp_se_smmu1_warbi_to_cash7_0_wr_req_cnt_t +{ + ZXIC_UINT32 warbi_to_cash7_0_wr_req_cnt; +}DPP_SE_SMMU1_WARBI_TO_CASH7_0_WR_REQ_CNT_T; + +typedef struct dpp_se_smmu1_warbi_to_cpu_wr_fc_cnt_t +{ + ZXIC_UINT32 warbi_to_cpu_wr_fc_cnt; +}DPP_SE_SMMU1_WARBI_TO_CPU_WR_FC_CNT_T; + +typedef struct dpp_se_smmu1_cpu_wr_req_cnt_t +{ + ZXIC_UINT32 cpu_wr_req_cnt; +}DPP_SE_SMMU1_CPU_WR_REQ_CNT_T; + +typedef struct dpp_se_smmu1_ctrl7_0_to_cpu_rd_rsp_cnt_t +{ + ZXIC_UINT32 ctrl7_0_to_cpu_rd_rsp_cnt; +}DPP_SE_SMMU1_CTRL7_0_TO_CPU_RD_RSP_CNT_T; + +typedef struct dpp_se_smmu1_cpu_to_ctrl7_0_rd_req_cnt_t +{ + ZXIC_UINT32 cpu_to_ctrl7_0_rd_req_cnt; +}DPP_SE_SMMU1_CPU_TO_CTRL7_0_RD_REQ_CNT_T; + +typedef struct dpp_se_smmu1_cpu_rd_dir_tbl_rsp_cnt_t +{ + ZXIC_UINT32 cpu_rd_dir_tbl_rsp_cnt; +}DPP_SE_SMMU1_CPU_RD_DIR_TBL_RSP_CNT_T; + +typedef struct dpp_se_smmu1_cpu_to_dir_tbl_rd_wr_req_cnt_t +{ + ZXIC_UINT32 cpu_to_dir_tbl_rd_wr_req_cnt; +}DPP_SE_SMMU1_CPU_TO_DIR_TBL_RD_WR_REQ_CNT_T; + +typedef struct dpp_se_smmu1_smmu1_to_mmu_7_0_rsp_fc_cnt_t +{ + ZXIC_UINT32 smmu1_to_mmu_7_0_rsp_fc_cnt; +}DPP_SE_SMMU1_SMMU1_TO_MMU_7_0_RSP_FC_CNT_T; + +typedef struct dpp_se_smmu1_mmu_7_0_to_smmu1_rd_rsp_cnt_t +{ + ZXIC_UINT32 mmu_7_0_to_smmu1_rd_rsp_cnt; +}DPP_SE_SMMU1_MMU_7_0_TO_SMMU1_RD_RSP_CNT_T; + +typedef struct dpp_se_smmu1_mmu_7_0_to_smmu1_rd_fc_cnt_t +{ + ZXIC_UINT32 mmu_7_0_to_smmu1_rd_fc_cnt; +}DPP_SE_SMMU1_MMU_7_0_TO_SMMU1_RD_FC_CNT_T; + +typedef struct dpp_se_smmu1_smmu1_to_mmu_7_rd_req_cnt_t +{ + ZXIC_UINT32 smmu1_to_mmu_7_rd_req_cnt; +}DPP_SE_SMMU1_SMMU1_TO_MMU_7_RD_REQ_CNT_T; + +typedef struct dpp_se_smmu1_mmu_7_to_smmu1_wr_fc_cnt_t +{ + ZXIC_UINT32 mmu_7_to_smmu1_wr_fc_cnt; +}DPP_SE_SMMU1_MMU_7_TO_SMMU1_WR_FC_CNT_T; + +typedef struct dpp_se_smmu1_smmu1_to_mmu_7_0_wr_req_cnt_t +{ + ZXIC_UINT32 smmu1_to_mmu_7_0_wr_req_cnt; +}DPP_SE_SMMU1_SMMU1_TO_MMU_7_0_WR_REQ_CNT_T; + +typedef struct dpp_se_smmu1_se_to_smmu1_wr_rsp_fc_cnt_t +{ + ZXIC_UINT32 se_to_smmu1_wr_rsp_fc_cnt; +}DPP_SE_SMMU1_SE_TO_SMMU1_WR_RSP_FC_CNT_T; + +typedef struct dpp_se_smmu1_smmu1_to_se_wr_rsp_cnt_t +{ + ZXIC_UINT32 smmu1_to_se_wr_rsp_cnt; +}DPP_SE_SMMU1_SMMU1_TO_SE_WR_RSP_CNT_T; + +typedef struct dpp_se_smmu1_ddr7_0_wr_rsp_cnt_t +{ + ZXIC_UINT32 ddr7_0_wr_rsp_cnt; +}DPP_SE_SMMU1_DDR7_0_WR_RSP_CNT_T; + +typedef struct dpp_se_smmu1_smmu1_to_as_fc_cnt_t +{ + ZXIC_UINT32 smmu1_to_as_fc_cnt; +}DPP_SE_SMMU1_SMMU1_TO_AS_FC_CNT_T; + +typedef struct dpp_se_smmu1_as_to_smmu1_wr_req_cnt_t +{ + ZXIC_UINT32 as_to_smmu1_wr_req_cnt; +}DPP_SE_SMMU1_AS_TO_SMMU1_WR_REQ_CNT_T; + +typedef struct dpp_se_smmu1_smmu1_to_se_parser_fc_cnt_t +{ + ZXIC_UINT32 smmu1_to_se_parser_fc_cnt; +}DPP_SE_SMMU1_SMMU1_TO_SE_PARSER_FC_CNT_T; + +typedef struct dpp_se_smmu1_se_parser_to_smmu1_req_cnt_t +{ + ZXIC_UINT32 se_parser_to_smmu1_req_cnt; +}DPP_SE_SMMU1_SE_PARSER_TO_SMMU1_REQ_CNT_T; + +typedef struct dpp_se_smmu1_smmu1_to_etm_wr_fc_cnt_t +{ + ZXIC_UINT32 smmu1_to_etm_wr_fc_cnt; +}DPP_SE_SMMU1_SMMU1_TO_ETM_WR_FC_CNT_T; + +typedef struct dpp_se_smmu1_etm_wr_req_cnt_t +{ + ZXIC_UINT32 etm_wr_req_cnt; +}DPP_SE_SMMU1_ETM_WR_REQ_CNT_T; + +typedef struct dpp_se_smmu1_smmu1_to_ftm_wr_fc_cnt_t +{ + ZXIC_UINT32 smmu1_to_ftm_wr_fc_cnt; +}DPP_SE_SMMU1_SMMU1_TO_FTM_WR_FC_CNT_T; + +typedef struct dpp_se_smmu1_ftm_wr_req_cnt_t +{ + ZXIC_UINT32 ftm_wr_req_cnt; +}DPP_SE_SMMU1_FTM_WR_REQ_CNT_T; + +typedef struct dpp_se_smmu1_smmu1_to_state_wr_fc_cnt_t +{ + ZXIC_UINT32 smmu1_to_state_wr_fc_cnt; +}DPP_SE_SMMU1_SMMU1_TO_STATE_WR_FC_CNT_T; + +typedef struct dpp_se_smmu1_state_wr_req_cnt_t +{ + ZXIC_UINT32 state_wr_req_cnt; +}DPP_SE_SMMU1_STATE_WR_REQ_CNT_T; + +typedef struct dpp_se_smmu1_se_to_dma_rsp_cnt_t +{ + ZXIC_UINT32 se_to_dma_rsp_cnt; +}DPP_SE_SMMU1_SE_TO_DMA_RSP_CNT_T; + +typedef struct dpp_se_smmu1_se_to_dma_fc_cnt_t +{ + ZXIC_UINT32 se_to_dma_fc_cnt; +}DPP_SE_SMMU1_SE_TO_DMA_FC_CNT_T; + +typedef struct dpp_se_smmu1_oam_to_smmu1_fc_cnt_t +{ + ZXIC_UINT32 oam_to_smmu1_fc_cnt; +}DPP_SE_SMMU1_OAM_TO_SMMU1_FC_CNT_T; + +typedef struct dpp_se_smmu1_smmu1_to_oam_rsp_cnt_t +{ + ZXIC_UINT32 smmu1_to_oam_rsp_cnt; +}DPP_SE_SMMU1_SMMU1_TO_OAM_RSP_CNT_T; + +typedef struct dpp_se_smmu1_smmu1_to_oam_fc_cnt_t +{ + ZXIC_UINT32 smmu1_to_oam_fc_cnt; +}DPP_SE_SMMU1_SMMU1_TO_OAM_FC_CNT_T; + +typedef struct dpp_se_smmu1_oam_to_smmu1_req_cnt_t +{ + ZXIC_UINT32 oam_to_smmu1_req_cnt; +}DPP_SE_SMMU1_OAM_TO_SMMU1_REQ_CNT_T; + +typedef struct dpp_se_smmu1_smmu1_to_etm_rsp_cnt_t +{ + ZXIC_UINT32 smmu1_to_etm_rsp_cnt; +}DPP_SE_SMMU1_SMMU1_TO_ETM_RSP_CNT_T; + +typedef struct dpp_se_smmu1_smmu1_to_ftm_rsp_cnt_t +{ + ZXIC_UINT32 smmu1_to_ftm_rsp_cnt; +}DPP_SE_SMMU1_SMMU1_TO_FTM_RSP_CNT_T; + +typedef struct dpp_se_smmu1_smmu1_to_etm_fc_cnt_t +{ + ZXIC_UINT32 smmu1_to_etm_fc_cnt; +}DPP_SE_SMMU1_SMMU1_TO_ETM_FC_CNT_T; + +typedef struct dpp_se_smmu1_etm_to_smmu1_req_cnt_t +{ + ZXIC_UINT32 etm_to_smmu1_req_cnt; +}DPP_SE_SMMU1_ETM_TO_SMMU1_REQ_CNT_T; + +typedef struct dpp_se_smmu1_smmu1_to_ftm_fc_cnt_t +{ + ZXIC_UINT32 smmu1_to_ftm_fc_cnt; +}DPP_SE_SMMU1_SMMU1_TO_FTM_FC_CNT_T; + +typedef struct dpp_se_smmu1_ftm_to_smmu1_req_cnt_t +{ + ZXIC_UINT32 ftm_to_smmu1_req_cnt; +}DPP_SE_SMMU1_FTM_TO_SMMU1_REQ_CNT_T; + +typedef struct dpp_se_smmu1_smmu1_to_stat_rsp_cnt_t +{ + ZXIC_UINT32 smmu1_to_stat_rsp_cnt; +}DPP_SE_SMMU1_SMMU1_TO_STAT_RSP_CNT_T; + +typedef struct dpp_se_smmu1_smmu1_to_stat_fc_cnt_t +{ + ZXIC_UINT32 smmu1_to_stat_fc_cnt; +}DPP_SE_SMMU1_SMMU1_TO_STAT_FC_CNT_T; + +typedef struct dpp_se_smmu1_stat_to_smmu1_req_cnt_t +{ + ZXIC_UINT32 stat_to_smmu1_req_cnt; +}DPP_SE_SMMU1_STAT_TO_SMMU1_REQ_CNT_T; + +typedef struct dpp_se_smmu1_lpm_as_to_smmu1_fc_cnt_t +{ + ZXIC_UINT32 lpm_as_to_smmu1_fc_cnt; +}DPP_SE_SMMU1_LPM_AS_TO_SMMU1_FC_CNT_T; + +typedef struct dpp_se_smmu1_lpm_to_smmu1_fc_cnt_t +{ + ZXIC_UINT32 lpm_to_smmu1_fc_cnt; +}DPP_SE_SMMU1_LPM_TO_SMMU1_FC_CNT_T; + +typedef struct dpp_se_smmu1_smmu1_to_lpm_as_rsp_cnt_t +{ + ZXIC_UINT32 smmu1_to_lpm_as_rsp_cnt; +}DPP_SE_SMMU1_SMMU1_TO_LPM_AS_RSP_CNT_T; + +typedef struct dpp_se_smmu1_smmu1_to_lpm_rsp_cnt_t +{ + ZXIC_UINT32 smmu1_to_lpm_rsp_cnt; +}DPP_SE_SMMU1_SMMU1_TO_LPM_RSP_CNT_T; + +typedef struct dpp_se_smmu1_smmu1_to_lpm_as_fc_cnt_t +{ + ZXIC_UINT32 smmu1_to_lpm_as_fc_cnt; +}DPP_SE_SMMU1_SMMU1_TO_LPM_AS_FC_CNT_T; + +typedef struct dpp_se_smmu1_smmu1_to_lpm_fc_cnt_t +{ + ZXIC_UINT32 smmu1_to_lpm_fc_cnt; +}DPP_SE_SMMU1_SMMU1_TO_LPM_FC_CNT_T; + +typedef struct dpp_se_smmu1_lpm_as_to_smmu1_req_cnt_t +{ + ZXIC_UINT32 lpm_as_to_smmu1_req_cnt; +}DPP_SE_SMMU1_LPM_AS_TO_SMMU1_REQ_CNT_T; + +typedef struct dpp_se_smmu1_lpm_to_smmu1_req_cnt_t +{ + ZXIC_UINT32 lpm_to_smmu1_req_cnt; +}DPP_SE_SMMU1_LPM_TO_SMMU1_REQ_CNT_T; + +typedef struct dpp_se_smmu1_hash3_0_to_smmu1_fc_cnt_t +{ + ZXIC_UINT32 hash3_0_to_smmu1_fc_cnt; +}DPP_SE_SMMU1_HASH3_0_TO_SMMU1_FC_CNT_T; + +typedef struct dpp_se_smmu1_smmu1_to_hash3_0_rsp_cnt_t +{ + ZXIC_UINT32 smmu1_to_hash3_0_rsp_cnt; +}DPP_SE_SMMU1_SMMU1_TO_HASH3_0_RSP_CNT_T; + +typedef struct dpp_se_smmu1_smmu1_to_hash3_0_fc_cnt_t +{ + ZXIC_UINT32 smmu1_to_hash3_0_fc_cnt; +}DPP_SE_SMMU1_SMMU1_TO_HASH3_0_FC_CNT_T; + +typedef struct dpp_se_smmu1_hash3_0_to_smmu1_cnt_t +{ + ZXIC_UINT32 hash3_0_to_smmu1_cnt; +}DPP_SE_SMMU1_HASH3_0_TO_SMMU1_CNT_T; + +typedef struct dpp_se_smmu1_se_to_smmu1_dir3_0_rsp_fc_cnt_t +{ + ZXIC_UINT32 se_to_smmu1_dir3_0_rsp_fc_cnt; +}DPP_SE_SMMU1_SE_TO_SMMU1_DIR3_0_RSP_FC_CNT_T; + +typedef struct dpp_se_smmu1_smmu1_to_se_dir3_0_rsp_cnt_t +{ + ZXIC_UINT32 smmu1_to_se_dir3_0_rsp_cnt; +}DPP_SE_SMMU1_SMMU1_TO_SE_DIR3_0_RSP_CNT_T; + +typedef struct dpp_se_smmu1_smmu1_to_se_dir3_0_fc_cnt_t +{ + ZXIC_UINT32 smmu1_to_se_dir3_0_fc_cnt; +}DPP_SE_SMMU1_SMMU1_TO_SE_DIR3_0_FC_CNT_T; + +typedef struct dpp_se_smmu1_se_to_smmu1_dir3_0_cnt_t +{ + ZXIC_UINT32 se_to_smmu1_dir3_0_cnt; +}DPP_SE_SMMU1_SE_TO_SMMU1_DIR3_0_CNT_T; + +typedef struct dpp_se_smmu1_cache7_0_to_rschd_rsp_cnt_t +{ + ZXIC_UINT32 cache7_0_to_rschd_rsp_cnt; +}DPP_SE_SMMU1_CACHE7_0_TO_RSCHD_RSP_CNT_T; + +typedef struct dpp_se_cmmu_ddr_rw_addr_t +{ + ZXIC_UINT32 ddr_wr; +}DPP_SE_CMMU_DDR_RW_ADDR_T; + +typedef struct dpp_se_cmmu_ddr_rw_mode_t +{ + ZXIC_UINT32 ddr_rw_flag; + ZXIC_UINT32 ddr_rw_mode; +}DPP_SE_CMMU_DDR_RW_MODE_T; + +typedef struct dpp_se_cmmu_cp_cmd_t +{ + ZXIC_UINT32 stat_tbl_baddr; +}DPP_SE_CMMU_CP_CMD_T; + +typedef struct dpp_se_cmmu_cpu_ind_rd_done_t +{ + ZXIC_UINT32 cpu_ind_rd_done; +}DPP_SE_CMMU_CPU_IND_RD_DONE_T; + +typedef struct dpp_se_cmmu_cpu_ind_rdat0_t +{ + ZXIC_UINT32 cpu_ind_rdat0; +}DPP_SE_CMMU_CPU_IND_RDAT0_T; + +typedef struct dpp_se_cmmu_cpu_ind_rdat1_t +{ + ZXIC_UINT32 cpu_ind_rdat1; +}DPP_SE_CMMU_CPU_IND_RDAT1_T; + +typedef struct dpp_se_cmmu_cpu_ind_rdat2_t +{ + ZXIC_UINT32 cpu_ind_rdat2; +}DPP_SE_CMMU_CPU_IND_RDAT2_T; + +typedef struct dpp_se_cmmu_cpu_ind_rdat3_t +{ + ZXIC_UINT32 cpu_ind_rdat3; +}DPP_SE_CMMU_CPU_IND_RDAT3_T; + +typedef struct dpp_se_cmmu_cpu_ddr_fifo_almful_t +{ + ZXIC_UINT32 cpu_ddr_fifo_almful; +}DPP_SE_CMMU_CPU_DDR_FIFO_ALMFUL_T; + +typedef struct dpp_se_cmmu_debug_cnt_mode_t +{ + ZXIC_UINT32 cnt_rd_mode; + ZXIC_UINT32 cnt_overflow_mode; +}DPP_SE_CMMU_DEBUG_CNT_MODE_T; + +typedef struct dpp_se_cmmu_cmmu_pful_cfg_t +{ + ZXIC_UINT32 alu_cmd_pful_negate; + ZXIC_UINT32 alu_cmd_pful_assert; +}DPP_SE_CMMU_CMMU_PFUL_CFG_T; + +typedef struct dpp_se_cmmu_cmmu_stat_pful_cfg_t +{ + ZXIC_UINT32 cmmu_stat_pful_negate; + ZXIC_UINT32 cmmu_stat_pful_assert; +}DPP_SE_CMMU_CMMU_STAT_PFUL_CFG_T; + +typedef struct dpp_se_cmmu_stat_overflow_mode_t +{ + ZXIC_UINT32 stat_overflow_mode; +}DPP_SE_CMMU_STAT_OVERFLOW_MODE_T; + +typedef struct dpp_se_cmmu_cmmu_cp_fifo_pful_t +{ + ZXIC_UINT32 cmmu_cp_fifo_pful; +}DPP_SE_CMMU_CMMU_CP_FIFO_PFUL_T; + +typedef struct dpp_se_cmmu_ddr_wr_dat0_t +{ + ZXIC_UINT32 ddr_wr_dat0; +}DPP_SE_CMMU_DDR_WR_DAT0_T; + +typedef struct dpp_se_cmmu_ddr_wr_dat1_t +{ + ZXIC_UINT32 ddr_wr_dat1; +}DPP_SE_CMMU_DDR_WR_DAT1_T; + +typedef struct dpp_se_cmmu_cmmu_int_unmask_flag_t +{ + ZXIC_UINT32 cmmu_int_unmask_flag; +}DPP_SE_CMMU_CMMU_INT_UNMASK_FLAG_T; + +typedef struct dpp_se_cmmu_cmmu_int_en_t +{ + ZXIC_UINT32 cmmu_int_en12; + ZXIC_UINT32 cmmu_int_en11; + ZXIC_UINT32 cmmu_int_en10; + ZXIC_UINT32 cmmu_int_en9; + ZXIC_UINT32 cmmu_int_en8; + ZXIC_UINT32 cmmu_int_en7; + ZXIC_UINT32 cmmu_int_en6; + ZXIC_UINT32 cmmu_int_en5; + ZXIC_UINT32 cmmu_int_en4; + ZXIC_UINT32 cmmu_int_en3; + ZXIC_UINT32 cmmu_int_en2; + ZXIC_UINT32 cmmu_int_en1; + ZXIC_UINT32 cmmu_int_en0; +}DPP_SE_CMMU_CMMU_INT_EN_T; + +typedef struct dpp_se_cmmu_cmmu_int_mask_t +{ + ZXIC_UINT32 cmmu_int_mask12; + ZXIC_UINT32 cmmu_int_mask11; + ZXIC_UINT32 cmmu_int_mask10; + ZXIC_UINT32 cmmu_int_mask9; + ZXIC_UINT32 cmmu_int_mask8; + ZXIC_UINT32 cmmu_int_mask7; + ZXIC_UINT32 cmmu_int_mask6; + ZXIC_UINT32 cmmu_int_mask5; + ZXIC_UINT32 cmmu_int_mask4; + ZXIC_UINT32 cmmu_int_mask3; + ZXIC_UINT32 cmmu_int_mask2; + ZXIC_UINT32 cmmu_int_mask1; + ZXIC_UINT32 cmmu_int_mask0; +}DPP_SE_CMMU_CMMU_INT_MASK_T; + +typedef struct dpp_se_cmmu_cmmu_int_status_t +{ + ZXIC_UINT32 cmmu_int_status12; + ZXIC_UINT32 cmmu_int_status11; + ZXIC_UINT32 cmmu_int_status10; + ZXIC_UINT32 cmmu_int_status9; + ZXIC_UINT32 cmmu_int_status8; + ZXIC_UINT32 cmmu_int_status7; + ZXIC_UINT32 cmmu_int_status6; + ZXIC_UINT32 cmmu_int_status5; + ZXIC_UINT32 cmmu_int_status4; + ZXIC_UINT32 cmmu_int_status3; + ZXIC_UINT32 cmmu_int_status2; + ZXIC_UINT32 cmmu_int_status1; + ZXIC_UINT32 cmmu_int_status0; +}DPP_SE_CMMU_CMMU_INT_STATUS_T; + +typedef struct dpp_se_cmmu_stat_cmmu_req_cnt_t +{ + ZXIC_UINT32 stat_cmmu_req_cnt; +}DPP_SE_CMMU_STAT_CMMU_REQ_CNT_T; + +typedef struct dpp_se_cmmu_cmmu_fc0_cnt_t +{ + ZXIC_UINT32 cmmu_stat_rdy; +}DPP_SE_CMMU_CMMU_FC0_CNT_T; + +typedef struct dpp_se_cmmu_cmmu_fc1_cnt_t +{ + ZXIC_UINT32 smmu1_cmmu_wr_rdy; +}DPP_SE_CMMU_CMMU_FC1_CNT_T; + +typedef struct dpp_se_cmmu_cmmu_fc2_cnt_t +{ + ZXIC_UINT32 smmu1_cmmu_rd_rdy; +}DPP_SE_CMMU_CMMU_FC2_CNT_T; + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_stat4k_reg.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_stat4k_reg.h new file mode 100644 index 0000000..f55a9cb --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_stat4k_reg.h @@ -0,0 +1,42 @@ + +#ifndef _DPP_STAT4K_REG_H_ +#define _DPP_STAT4K_REG_H_ + +#ifdef __cplusplus +extern "C"{ +#endif + +typedef struct dpp_stat4k_etcam_block0_7_port_id_cfg_t +{ + ZXIC_UINT32 block7_port_id; + ZXIC_UINT32 block6_port_id; + ZXIC_UINT32 block5_port_id; + ZXIC_UINT32 block4_port_id; + ZXIC_UINT32 block3_port_id; + ZXIC_UINT32 block2_port_id; + ZXIC_UINT32 block1_port_id; + ZXIC_UINT32 block0_port_id; +}DPP_STAT4K_ETCAM_BLOCK0_7_PORT_ID_CFG_T; + +typedef struct dpp_stat4k_etcam_block0_3_base_addr_cfg_t +{ + ZXIC_UINT32 block3_base_addr_cfg; + ZXIC_UINT32 block2_base_addr_cfg; + ZXIC_UINT32 block1_base_addr_cfg; + ZXIC_UINT32 block0_base_addr_cfg; +}DPP_STAT4K_ETCAM_BLOCK0_3_BASE_ADDR_CFG_T; + +typedef struct dpp_stat4k_etcam_block4_7_base_addr_cfg_t +{ + ZXIC_UINT32 block7_base_addr_cfg; + ZXIC_UINT32 block6_base_addr_cfg; + ZXIC_UINT32 block5_base_addr_cfg; + ZXIC_UINT32 block4_base_addr_cfg; +}DPP_STAT4K_ETCAM_BLOCK4_7_BASE_ADDR_CFG_T; + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_stat_reg.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_stat_reg.h new file mode 100644 index 0000000..1ccb40b --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_stat_reg.h @@ -0,0 +1,2362 @@ + +#ifndef _DPP_STAT_REG_H_ +#define _DPP_STAT_REG_H_ + +#ifdef __cplusplus +extern "C"{ +#endif + +typedef struct dpp_stat_stat_cfg_cpu_ind_eram_wdat0_t +{ + ZXIC_UINT32 cpu_ind_eram_wdat0; +}DPP_STAT_STAT_CFG_CPU_IND_ERAM_WDAT0_T; + +typedef struct dpp_stat_stat_cfg_etm_port_sel_cfg_t +{ + ZXIC_UINT32 etm_port0_sel_cfg; + ZXIC_UINT32 etm_port1_sel_cfg; + ZXIC_UINT32 etm_port2_sel_cfg; + ZXIC_UINT32 etm_port3_sel_cfg; +}DPP_STAT_STAT_CFG_ETM_PORT_SEL_CFG_T; + +typedef struct dpp_stat_stat_cfg_tm_stat_cfg_t +{ + ZXIC_UINT32 stat_overflow_mode; + ZXIC_UINT32 tm_stat_mode_cfg; + ZXIC_UINT32 tm_flow_control_cfg; +}DPP_STAT_STAT_CFG_TM_STAT_CFG_T; + +typedef struct dpp_stat_stat_cfg_ppu_eram_depth_t +{ + ZXIC_UINT32 ppu_eram_depth; +}DPP_STAT_STAT_CFG_PPU_ERAM_DEPTH_T; + +typedef struct dpp_stat_stat_cfg_ppu_eram_base_addr_t +{ + ZXIC_UINT32 ppu_eram_base_addr; +}DPP_STAT_STAT_CFG_PPU_ERAM_BASE_ADDR_T; + +typedef struct dpp_stat_stat_cfg_ppu_ddr_base_addr_t +{ + ZXIC_UINT32 ppu_ddr_base_addr; +}DPP_STAT_STAT_CFG_PPU_DDR_BASE_ADDR_T; + +typedef struct dpp_stat_stat_cfg_plcr0_base_addr_t +{ + ZXIC_UINT32 plcr0_base_addr; +}DPP_STAT_STAT_CFG_PLCR0_BASE_ADDR_T; + +typedef struct dpp_stat_stat_cfg_etm_stat_start_addr_cfg_t +{ + ZXIC_UINT32 etm_stat_start_addr_cfg; +}DPP_STAT_STAT_CFG_ETM_STAT_START_ADDR_CFG_T; + +typedef struct dpp_stat_stat_cfg_etm_stat_depth_cfg_t +{ + ZXIC_UINT32 etm_stat_depth_cfg; +}DPP_STAT_STAT_CFG_ETM_STAT_DEPTH_CFG_T; + +typedef struct dpp_stat_stat_cfg_cycle_mov_en_cfg_t +{ + ZXIC_UINT32 cycle_mov_en_cfg; +}DPP_STAT_STAT_CFG_CYCLE_MOV_EN_CFG_T; + +typedef struct dpp_stat_etcam_cpu_ind_wdat0_t +{ + ZXIC_UINT32 wdat0; +}DPP_STAT_ETCAM_CPU_IND_WDAT0_T; + +typedef struct dpp_stat_etcam_cpu_ind_ctrl_tmp0_t +{ + ZXIC_UINT32 reg_tcam_flag; + ZXIC_UINT32 flush; + ZXIC_UINT32 rd_wr; + ZXIC_UINT32 wr_mode; + ZXIC_UINT32 dat_or_mask; + ZXIC_UINT32 ram_sel; + ZXIC_UINT32 addr; +}DPP_STAT_ETCAM_CPU_IND_CTRL_TMP0_T; + +typedef struct dpp_stat_etcam_cpu_ind_ctrl_tmp1_t +{ + ZXIC_UINT32 row_or_col_msk; + ZXIC_UINT32 vben; + ZXIC_UINT32 vbit; +}DPP_STAT_ETCAM_CPU_IND_CTRL_TMP1_T; + +typedef struct dpp_stat_etcam_cpu_ind_rd_done_t +{ + ZXIC_UINT32 cpu_ind_rd_done; +}DPP_STAT_ETCAM_CPU_IND_RD_DONE_T; + +typedef struct dpp_stat_etcam_cpu_rdat0_t +{ + ZXIC_UINT32 cpu_rdat0; +}DPP_STAT_ETCAM_CPU_RDAT0_T; + +typedef struct dpp_stat_etcam_cpu_rdat1_t +{ + ZXIC_UINT32 cpu_rdat1; +}DPP_STAT_ETCAM_CPU_RDAT1_T; + +typedef struct dpp_stat_etcam_cpu_rdat2_t +{ + ZXIC_UINT32 cpu_rdat2; +}DPP_STAT_ETCAM_CPU_RDAT2_T; + +typedef struct dpp_stat_etcam_cpu_rdat3_t +{ + ZXIC_UINT32 cpu_rdat3; +}DPP_STAT_ETCAM_CPU_RDAT3_T; + +typedef struct dpp_stat_etcam_cpu_rdat4_t +{ + ZXIC_UINT32 cpu_rdat4; +}DPP_STAT_ETCAM_CPU_RDAT4_T; + +typedef struct dpp_stat_etcam_cpu_rdat5_t +{ + ZXIC_UINT32 cpu_rdat5; +}DPP_STAT_ETCAM_CPU_RDAT5_T; + +typedef struct dpp_stat_etcam_cpu_rdat6_t +{ + ZXIC_UINT32 cpu_rdat6; +}DPP_STAT_ETCAM_CPU_RDAT6_T; + +typedef struct dpp_stat_etcam_cpu_rdat7_t +{ + ZXIC_UINT32 cpu_rdat7; +}DPP_STAT_ETCAM_CPU_RDAT7_T; + +typedef struct dpp_stat_etcam_cpu_rdat8_t +{ + ZXIC_UINT32 cpu_rdat8; +}DPP_STAT_ETCAM_CPU_RDAT8_T; + +typedef struct dpp_stat_etcam_cpu_rdat9_t +{ + ZXIC_UINT32 cpu_rdat9; +}DPP_STAT_ETCAM_CPU_RDAT9_T; + +typedef struct dpp_stat_etcam_cpu_rdat10_t +{ + ZXIC_UINT32 cpu_rdat10; +}DPP_STAT_ETCAM_CPU_RDAT10_T; + +typedef struct dpp_stat_etcam_cpu_rdat11_t +{ + ZXIC_UINT32 cpu_rdat11; +}DPP_STAT_ETCAM_CPU_RDAT11_T; + +typedef struct dpp_stat_etcam_cpu_rdat12_t +{ + ZXIC_UINT32 cpu_rdat12; +}DPP_STAT_ETCAM_CPU_RDAT12_T; + +typedef struct dpp_stat_etcam_cpu_rdat13_t +{ + ZXIC_UINT32 cpu_rdat13; +}DPP_STAT_ETCAM_CPU_RDAT13_T; + +typedef struct dpp_stat_etcam_cpu_rdat14_t +{ + ZXIC_UINT32 cpu_rdat14; +}DPP_STAT_ETCAM_CPU_RDAT14_T; + +typedef struct dpp_stat_etcam_cpu_rdat15_t +{ + ZXIC_UINT32 cpu_rdat15; +}DPP_STAT_ETCAM_CPU_RDAT15_T; + +typedef struct dpp_stat_etcam_cpu_rdat16_t +{ + ZXIC_UINT32 cpu_rdat16; +}DPP_STAT_ETCAM_CPU_RDAT16_T; + +typedef struct dpp_stat_etcam_cpu_rdat17_t +{ + ZXIC_UINT32 cpu_rdat17; +}DPP_STAT_ETCAM_CPU_RDAT17_T; + +typedef struct dpp_stat_etcam_cpu_rdat18_t +{ + ZXIC_UINT32 cpu_rdat18; +}DPP_STAT_ETCAM_CPU_RDAT18_T; + +typedef struct dpp_stat_etcam_cpu_rdat19_t +{ + ZXIC_UINT32 cpu_rdat19; +}DPP_STAT_ETCAM_CPU_RDAT19_T; + +typedef struct dpp_stat_etcam_qvbo_t +{ + ZXIC_UINT32 qvbo; +}DPP_STAT_ETCAM_QVBO_T; + +typedef struct dpp_stat_etcam_cnt_overflow_mode_t +{ + ZXIC_UINT32 cnt_rd_mode; + ZXIC_UINT32 cnt_overflow_mode; +}DPP_STAT_ETCAM_CNT_OVERFLOW_MODE_T; + +typedef struct dpp_stat_car0_cara_queue_ram0_159_0_t +{ + ZXIC_UINT32 cara_drop; + ZXIC_UINT32 cara_plcr_en; + ZXIC_UINT32 cara_profile_id; + ZXIC_UINT32 cara_tq_h; + ZXIC_UINT32 cara_tq_l; + ZXIC_UINT32 cara_ted; + ZXIC_UINT32 cara_tcd; + ZXIC_UINT32 cara_tei; + ZXIC_UINT32 cara_tci; +}DPP_STAT_CAR0_CARA_QUEUE_RAM0_159_0_T; + +typedef struct dpp_stat_car0_cara_profile_ram1_255_0_t +{ + ZXIC_UINT32 cara_profile_wr; + ZXIC_UINT32 cara_pkt_sign; + ZXIC_UINT32 cara_cd; + ZXIC_UINT32 cara_cf; + ZXIC_UINT32 cara_cm; + ZXIC_UINT32 cara_eir; + ZXIC_UINT32 cara_cir; + ZXIC_UINT32 cara_ebs_pbs; + ZXIC_UINT32 cara_cbs; + ZXIC_UINT32 cara_c_pri1; + ZXIC_UINT32 cara_c_pri2; + ZXIC_UINT32 cara_c_pri3; + ZXIC_UINT32 cara_c_pri4; + ZXIC_UINT32 cara_c_pri5; + ZXIC_UINT32 cara_c_pri6; + ZXIC_UINT32 cara_c_pri7; + ZXIC_UINT32 cara_e_g_pri1; + ZXIC_UINT32 cara_e_g_pri2; + ZXIC_UINT32 cara_e_g_pri3; + ZXIC_UINT32 cara_e_g_pri4; + ZXIC_UINT32 cara_e_g_pri5; + ZXIC_UINT32 cara_e_g_pri6; + ZXIC_UINT32 cara_e_g_pri7; + ZXIC_UINT32 cara_e_y_pri0; + ZXIC_UINT32 cara_e_y_pri1; + ZXIC_UINT32 cara_e_y_pri2; + ZXIC_UINT32 cara_e_y_pri3; + ZXIC_UINT32 cara_e_y_pri4; + ZXIC_UINT32 cara_e_y_pri5; + ZXIC_UINT32 cara_e_y_pri6; + ZXIC_UINT32 cara_e_y_pri7; +}DPP_STAT_CAR0_CARA_PROFILE_RAM1_255_0_T; + +typedef struct dpp_stat_car0_cara_qovs_ram_ram2_t +{ + ZXIC_UINT32 cara_qovs; +}DPP_STAT_CAR0_CARA_QOVS_RAM_RAM2_T; + +typedef struct dpp_stat_car0_look_up_table1_t +{ + ZXIC_UINT32 cara_flow_id; + ZXIC_UINT32 cara_sp; +}DPP_STAT_CAR0_LOOK_UP_TABLE1_T; + +typedef struct dpp_stat_car0_cara_pkt_des_i_cnt_t +{ + ZXIC_UINT32 cara_pkt_des_i_cnt; +}DPP_STAT_CAR0_CARA_PKT_DES_I_CNT_T; + +typedef struct dpp_stat_car0_cara_green_pkt_i_cnt_t +{ + ZXIC_UINT32 cara_green_pkt_i_cnt; +}DPP_STAT_CAR0_CARA_GREEN_PKT_I_CNT_T; + +typedef struct dpp_stat_car0_cara_yellow_pkt_i_cnt_t +{ + ZXIC_UINT32 cara_yellow_pkt_i_cnt; +}DPP_STAT_CAR0_CARA_YELLOW_PKT_I_CNT_T; + +typedef struct dpp_stat_car0_cara_red_pkt_i_cnt_t +{ + ZXIC_UINT32 cara_red_pkt_i_cnt; +}DPP_STAT_CAR0_CARA_RED_PKT_I_CNT_T; + +typedef struct dpp_stat_car0_cara_pkt_des_o_cnt_t +{ + ZXIC_UINT32 cara_pkt_des_o_cnt; +}DPP_STAT_CAR0_CARA_PKT_DES_O_CNT_T; + +typedef struct dpp_stat_car0_cara_green_pkt_o_cnt_t +{ + ZXIC_UINT32 cara_green_pkt_o_cnt; +}DPP_STAT_CAR0_CARA_GREEN_PKT_O_CNT_T; + +typedef struct dpp_stat_car0_cara_yellow_pkt_o_cnt_t +{ + ZXIC_UINT32 cara_yellow_pkt_o_cnt; +}DPP_STAT_CAR0_CARA_YELLOW_PKT_O_CNT_T; + +typedef struct dpp_stat_car0_cara_red_pkt_o_cnt_t +{ + ZXIC_UINT32 cara_red_pkt_o_cnt; +}DPP_STAT_CAR0_CARA_RED_PKT_O_CNT_T; + +typedef struct dpp_stat_car0_cara_pkt_des_fc_for_cfg_cnt_t +{ + ZXIC_UINT32 cara_pkt_des_fc_for_cfg_cnt; +}DPP_STAT_CAR0_CARA_PKT_DES_FC_FOR_CFG_CNT_T; + +typedef struct dpp_stat_car0_cara_appoint_qnum_or_sp_t +{ + ZXIC_UINT32 cara_appoint_qnum_or_not; + ZXIC_UINT32 cara_appoint_sp_or_not; + ZXIC_UINT32 cara_plcr_stat_sp; + ZXIC_UINT32 cara_plcr_stat_qnum; +}DPP_STAT_CAR0_CARA_APPOINT_QNUM_OR_SP_T; + +typedef struct dpp_stat_car0_cara_cfgmt_count_mode_t +{ + ZXIC_UINT32 cara_cfgmt_count_overflow_mode; + ZXIC_UINT32 cara_cfgmt_count_rd_mode; +}DPP_STAT_CAR0_CARA_CFGMT_COUNT_MODE_T; + +typedef struct dpp_stat_car0_cara_pkt_size_cnt_t +{ + ZXIC_UINT32 cara_pkt_size_cnt; +}DPP_STAT_CAR0_CARA_PKT_SIZE_CNT_T; + +typedef struct dpp_stat_car0_cara_plcr_init_dont_t +{ + ZXIC_UINT32 cara_plcr_init_done; +}DPP_STAT_CAR0_CARA_PLCR_INIT_DONT_T; + +typedef struct dpp_stat_car0_carb_queue_ram0_159_0_t +{ + ZXIC_UINT32 carb_drop; + ZXIC_UINT32 carb_plcr_en; + ZXIC_UINT32 carb_profile_id; + ZXIC_UINT32 carb_tq_h; + ZXIC_UINT32 carb_tq_l; + ZXIC_UINT32 carb_ted; + ZXIC_UINT32 carb_tcd; + ZXIC_UINT32 carb_tei; + ZXIC_UINT32 carb_tci; +}DPP_STAT_CAR0_CARB_QUEUE_RAM0_159_0_T; + +typedef struct dpp_stat_car0_carb_profile_ram1_255_0_t +{ + ZXIC_UINT32 carb_profile_wr; + ZXIC_UINT32 carb_random_discard_en_e; + ZXIC_UINT32 carb_random_discard_en_c; + ZXIC_UINT32 carb_pkt_sign; + ZXIC_UINT32 carb_cd; + ZXIC_UINT32 carb_cf; + ZXIC_UINT32 carb_cm; + ZXIC_UINT32 carb_eir; + ZXIC_UINT32 carb_cir; + ZXIC_UINT32 carb_ebs_pbs; + ZXIC_UINT32 carb_cbs; + ZXIC_UINT32 carb_c_pri1; + ZXIC_UINT32 carb_c_pri2; + ZXIC_UINT32 carb_c_pri3; + ZXIC_UINT32 carb_c_pri4; + ZXIC_UINT32 carb_c_pri5; + ZXIC_UINT32 carb_c_pri6; + ZXIC_UINT32 carb_c_pri7; + ZXIC_UINT32 carb_e_g_pri1; + ZXIC_UINT32 carb_e_g_pri2; + ZXIC_UINT32 carb_e_g_pri3; + ZXIC_UINT32 carb_e_g_pri4; + ZXIC_UINT32 carb_e_g_pri5; + ZXIC_UINT32 carb_e_g_pri6; + ZXIC_UINT32 carb_e_g_pri7; + ZXIC_UINT32 carb_e_y_pri0; + ZXIC_UINT32 carb_e_y_pri1; + ZXIC_UINT32 carb_e_y_pri2; + ZXIC_UINT32 carb_e_y_pri3; + ZXIC_UINT32 carb_e_y_pri4; + ZXIC_UINT32 carb_e_y_pri5; + ZXIC_UINT32 carb_e_y_pri6; + ZXIC_UINT32 carb_e_y_pri7; +}DPP_STAT_CAR0_CARB_PROFILE_RAM1_255_0_T; + +typedef struct dpp_stat_car0_carb_qovs_ram_ram2_t +{ + ZXIC_UINT32 carb_qovs; +}DPP_STAT_CAR0_CARB_QOVS_RAM_RAM2_T; + +typedef struct dpp_stat_car0_look_up_table2_t +{ + ZXIC_UINT32 carb_flow_id; + ZXIC_UINT32 carb_sp; +}DPP_STAT_CAR0_LOOK_UP_TABLE2_T; + +typedef struct dpp_stat_car0_carb_pkt_des_i_cnt_t +{ + ZXIC_UINT32 carb_pkt_des_i_cnt; +}DPP_STAT_CAR0_CARB_PKT_DES_I_CNT_T; + +typedef struct dpp_stat_car0_carb_green_pkt_i_cnt_t +{ + ZXIC_UINT32 carb_green_pkt_i_cnt; +}DPP_STAT_CAR0_CARB_GREEN_PKT_I_CNT_T; + +typedef struct dpp_stat_car0_carb_yellow_pkt_i_cnt_t +{ + ZXIC_UINT32 carb_yellow_pkt_i_cnt; +}DPP_STAT_CAR0_CARB_YELLOW_PKT_I_CNT_T; + +typedef struct dpp_stat_car0_carb_red_pkt_i_cnt_t +{ + ZXIC_UINT32 carb_red_pkt_i_cnt; +}DPP_STAT_CAR0_CARB_RED_PKT_I_CNT_T; + +typedef struct dpp_stat_car0_carb_pkt_des_o_cnt_t +{ + ZXIC_UINT32 carb_pkt_des_o_cnt; +}DPP_STAT_CAR0_CARB_PKT_DES_O_CNT_T; + +typedef struct dpp_stat_car0_carb_green_pkt_o_cnt_t +{ + ZXIC_UINT32 carb_green_pkt_o_cnt; +}DPP_STAT_CAR0_CARB_GREEN_PKT_O_CNT_T; + +typedef struct dpp_stat_car0_carb_yellow_pkt_o_cnt_t +{ + ZXIC_UINT32 carb_yellow_pkt_o_cnt; +}DPP_STAT_CAR0_CARB_YELLOW_PKT_O_CNT_T; + +typedef struct dpp_stat_car0_carb_red_pkt_o_cnt_t +{ + ZXIC_UINT32 carb_red_pkt_o_cnt; +}DPP_STAT_CAR0_CARB_RED_PKT_O_CNT_T; + +typedef struct dpp_stat_car0_carb_pkt_des_fc_for_cfg_cnt_t +{ + ZXIC_UINT32 carb_pkt_des_fc_for_cfg_cnt; +}DPP_STAT_CAR0_CARB_PKT_DES_FC_FOR_CFG_CNT_T; + +typedef struct dpp_stat_car0_carb_appoint_qnum_or_sp_t +{ + ZXIC_UINT32 carb_appoint_qnum_or_not; + ZXIC_UINT32 carb_appoint_sp_or_not; + ZXIC_UINT32 carb_plcr_stat_sp; + ZXIC_UINT32 carb_plcr_stat_qnum; +}DPP_STAT_CAR0_CARB_APPOINT_QNUM_OR_SP_T; + +typedef struct dpp_stat_car0_carb_cfgmt_count_mode_t +{ + ZXIC_UINT32 carb_cfgmt_count_overflow_mode; + ZXIC_UINT32 carb_cfgmt_count_rd_mode; +}DPP_STAT_CAR0_CARB_CFGMT_COUNT_MODE_T; + +typedef struct dpp_stat_car0_carb_pkt_size_cnt_t +{ + ZXIC_UINT32 carb_pkt_size_cnt; +}DPP_STAT_CAR0_CARB_PKT_SIZE_CNT_T; + +typedef struct dpp_stat_car0_carb_plcr_init_dont_t +{ + ZXIC_UINT32 carb_plcr_init_done; +}DPP_STAT_CAR0_CARB_PLCR_INIT_DONT_T; + +typedef struct dpp_stat_car0_carc_queue_ram0_159_0_t +{ + ZXIC_UINT32 carc_drop; + ZXIC_UINT32 carc_plcr_en; + ZXIC_UINT32 carc_profile_id; + ZXIC_UINT32 carc_tq_h; + ZXIC_UINT32 carc_tq_l; + ZXIC_UINT32 carc_ted; + ZXIC_UINT32 carc_tcd; + ZXIC_UINT32 carc_tei; + ZXIC_UINT32 carc_tci; +}DPP_STAT_CAR0_CARC_QUEUE_RAM0_159_0_T; + +typedef struct dpp_stat_car0_carc_profile_ram1_255_0_t +{ + ZXIC_UINT32 carc_profile_wr; + ZXIC_UINT32 carc_random_discard_en_e; + ZXIC_UINT32 carc_random_discard_en_c; + ZXIC_UINT32 carc_pkt_sign; + ZXIC_UINT32 carc_cd; + ZXIC_UINT32 carc_cf; + ZXIC_UINT32 carc_cm; + ZXIC_UINT32 carc_eir; + ZXIC_UINT32 carc_cir; + ZXIC_UINT32 carc_ebs_pbs; + ZXIC_UINT32 carc_cbs; + ZXIC_UINT32 carc_c_pri1; + ZXIC_UINT32 carc_c_pri2; + ZXIC_UINT32 carc_c_pri3; + ZXIC_UINT32 carc_c_pri4; + ZXIC_UINT32 carc_c_pri5; + ZXIC_UINT32 carc_c_pri6; + ZXIC_UINT32 carc_c_pri7; + ZXIC_UINT32 carc_e_g_pri1; + ZXIC_UINT32 carc_e_g_pri2; + ZXIC_UINT32 carc_e_g_pri3; + ZXIC_UINT32 carc_e_g_pri4; + ZXIC_UINT32 carc_e_g_pri5; + ZXIC_UINT32 carc_e_g_pri6; + ZXIC_UINT32 carc_e_g_pri7; + ZXIC_UINT32 carc_e_y_pri0; + ZXIC_UINT32 carc_e_y_pri1; + ZXIC_UINT32 carc_e_y_pri2; + ZXIC_UINT32 carc_e_y_pri3; + ZXIC_UINT32 carc_e_y_pri4; + ZXIC_UINT32 carc_e_y_pri5; + ZXIC_UINT32 carc_e_y_pri6; + ZXIC_UINT32 carc_e_y_pri7; +}DPP_STAT_CAR0_CARC_PROFILE_RAM1_255_0_T; + +typedef struct dpp_stat_car0_carc_qovs_ram_ram2_t +{ + ZXIC_UINT32 carc_qovs; +}DPP_STAT_CAR0_CARC_QOVS_RAM_RAM2_T; + +typedef struct dpp_stat_car0_carc_pkt_des_i_cnt_t +{ + ZXIC_UINT32 carc_pkt_des_i_cnt; +}DPP_STAT_CAR0_CARC_PKT_DES_I_CNT_T; + +typedef struct dpp_stat_car0_carc_green_pkt_i_cnt_t +{ + ZXIC_UINT32 carc_green_pkt_i_cnt; +}DPP_STAT_CAR0_CARC_GREEN_PKT_I_CNT_T; + +typedef struct dpp_stat_car0_carc_yellow_pkt_i_cnt_t +{ + ZXIC_UINT32 carc_yellow_pkt_i_cnt; +}DPP_STAT_CAR0_CARC_YELLOW_PKT_I_CNT_T; + +typedef struct dpp_stat_car0_carc_red_pkt_i_cnt_t +{ + ZXIC_UINT32 carc_red_pkt_i_cnt; +}DPP_STAT_CAR0_CARC_RED_PKT_I_CNT_T; + +typedef struct dpp_stat_car0_carc_pkt_des_o_cnt_t +{ + ZXIC_UINT32 carc_pkt_des_o_cnt; +}DPP_STAT_CAR0_CARC_PKT_DES_O_CNT_T; + +typedef struct dpp_stat_car0_carc_green_pkt_o_cnt_t +{ + ZXIC_UINT32 carc_green_pkt_o_cnt; +}DPP_STAT_CAR0_CARC_GREEN_PKT_O_CNT_T; + +typedef struct dpp_stat_car0_carc_yellow_pkt_o_cnt_t +{ + ZXIC_UINT32 carc_yellow_pkt_o_cnt; +}DPP_STAT_CAR0_CARC_YELLOW_PKT_O_CNT_T; + +typedef struct dpp_stat_car0_carc_red_pkt_o_cnt_t +{ + ZXIC_UINT32 carc_red_pkt_o_cnt; +}DPP_STAT_CAR0_CARC_RED_PKT_O_CNT_T; + +typedef struct dpp_stat_car0_carc_pkt_des_fc_for_cfg_cnt_t +{ + ZXIC_UINT32 carc_pkt_des_fc_for_cfg_cnt; +}DPP_STAT_CAR0_CARC_PKT_DES_FC_FOR_CFG_CNT_T; + +typedef struct dpp_stat_car0_carc_appoint_qnum_or_sp_t +{ + ZXIC_UINT32 carc_appoint_qnum_or_not; + ZXIC_UINT32 carc_appoint_sp_or_not; + ZXIC_UINT32 carc_plcr_stat_sp; + ZXIC_UINT32 carc_plcr_stat_qnum; +}DPP_STAT_CAR0_CARC_APPOINT_QNUM_OR_SP_T; + +typedef struct dpp_stat_car0_carc_cfgmt_count_mode_t +{ + ZXIC_UINT32 carc_cfgmt_count_overflow_mode; + ZXIC_UINT32 carc_cfgmt_count_rd_mode; +}DPP_STAT_CAR0_CARC_CFGMT_COUNT_MODE_T; + +typedef struct dpp_stat_car0_carc_pkt_size_cnt_t +{ + ZXIC_UINT32 carc_pkt_size_cnt; +}DPP_STAT_CAR0_CARC_PKT_SIZE_CNT_T; + +typedef struct dpp_stat_car0_carc_plcr_init_dont_t +{ + ZXIC_UINT32 carc_plcr_init_done; +}DPP_STAT_CAR0_CARC_PLCR_INIT_DONT_T; + +typedef struct dpp_stat_car0_carb_random_ram_t +{ + ZXIC_UINT32 para8_e; + ZXIC_UINT32 para7_e; + ZXIC_UINT32 para6_e; + ZXIC_UINT32 para5_e; + ZXIC_UINT32 para4_h_e; + ZXIC_UINT32 para4_l_e; + ZXIC_UINT32 para3_e; + ZXIC_UINT32 para2_h_e; + ZXIC_UINT32 para2_l_e; + ZXIC_UINT32 para1_e; + ZXIC_UINT32 para0_h_e; + ZXIC_UINT32 para0_l_e; + ZXIC_UINT32 para8_c; + ZXIC_UINT32 para7_c; + ZXIC_UINT32 para6_c; + ZXIC_UINT32 para5_c; + ZXIC_UINT32 para4_h_c; + ZXIC_UINT32 para4_l_c; + ZXIC_UINT32 para3_c; + ZXIC_UINT32 para2_h_c; + ZXIC_UINT32 para2_l_c; + ZXIC_UINT32 para1_c; + ZXIC_UINT32 para0_h_c; + ZXIC_UINT32 para0_l_c; +}DPP_STAT_CAR0_CARB_RANDOM_RAM_T; + +typedef struct dpp_stat_car0_carc_random_ram_t +{ + ZXIC_UINT32 para8_e; + ZXIC_UINT32 para7_e; + ZXIC_UINT32 para6_e; + ZXIC_UINT32 para5_e; + ZXIC_UINT32 para4_h_e; + ZXIC_UINT32 para4_l_e; + ZXIC_UINT32 para3_e; + ZXIC_UINT32 para2_h_e; + ZXIC_UINT32 para2_l_e; + ZXIC_UINT32 para1_e; + ZXIC_UINT32 para0_h_e; + ZXIC_UINT32 para0_l_e; + ZXIC_UINT32 para8_c; + ZXIC_UINT32 para7_c; + ZXIC_UINT32 para6_c; + ZXIC_UINT32 para5_c; + ZXIC_UINT32 para4_h_c; + ZXIC_UINT32 para4_l_c; + ZXIC_UINT32 para3_c; + ZXIC_UINT32 para2_h_c; + ZXIC_UINT32 para2_l_c; + ZXIC_UINT32 para1_c; + ZXIC_UINT32 para0_h_c; + ZXIC_UINT32 para0_l_c; +}DPP_STAT_CAR0_CARC_RANDOM_RAM_T; + +typedef struct dpp_stat_car0_cara_begin_flow_id_t +{ + ZXIC_UINT32 cara_begin_flow_id; +}DPP_STAT_CAR0_CARA_BEGIN_FLOW_ID_T; + +typedef struct dpp_stat_car0_carb_begin_flow_id_t +{ + ZXIC_UINT32 carb_begin_flow_id; +}DPP_STAT_CAR0_CARB_BEGIN_FLOW_ID_T; + +typedef struct dpp_stat_car0_carc_begin_flow_id_t +{ + ZXIC_UINT32 carc_begin_flow_id; +}DPP_STAT_CAR0_CARC_BEGIN_FLOW_ID_T; + +typedef struct dpp_stat_car0_prog_full_assert_cfg_w_t +{ + ZXIC_UINT32 prog_full_assert_cfg_w; +}DPP_STAT_CAR0_PROG_FULL_ASSERT_CFG_W_T; + +typedef struct dpp_stat_car0_prog_full_negate_cfg_w_t +{ + ZXIC_UINT32 prog_full_negate_cfg_w; +}DPP_STAT_CAR0_PROG_FULL_NEGATE_CFG_W_T; + +typedef struct dpp_stat_car0_timeout_limit_t +{ + ZXIC_UINT32 timeout_limit; +}DPP_STAT_CAR0_TIMEOUT_LIMIT_T; + +typedef struct dpp_stat_car0_pkt_des_fifo_overflow_t +{ + ZXIC_UINT32 pkt_des_fifo_overflow; +}DPP_STAT_CAR0_PKT_DES_FIFO_OVERFLOW_T; + +typedef struct dpp_stat_car0_pkt_des_fifo_underflow_t +{ + ZXIC_UINT32 pkt_des_fifo_underflow; +}DPP_STAT_CAR0_PKT_DES_FIFO_UNDERFLOW_T; + +typedef struct dpp_stat_car0_pkt_des_fifo_prog_full_t +{ + ZXIC_UINT32 pkt_des_fifo_prog_full; +}DPP_STAT_CAR0_PKT_DES_FIFO_PROG_FULL_T; + +typedef struct dpp_stat_car0_pkt_des_fifo_prog_empty_t +{ + ZXIC_UINT32 pkt_des_fifo_prog_empty; +}DPP_STAT_CAR0_PKT_DES_FIFO_PROG_EMPTY_T; + +typedef struct dpp_stat_car0_pkt_des_fifo_full_t +{ + ZXIC_UINT32 pkt_des_fifo_full; +}DPP_STAT_CAR0_PKT_DES_FIFO_FULL_T; + +typedef struct dpp_stat_car0_pkt_des_fifo_empty_t +{ + ZXIC_UINT32 pkt_des_fifo_empty; +}DPP_STAT_CAR0_PKT_DES_FIFO_EMPTY_T; + +typedef struct dpp_stat_car0_pkt_size_offset_t +{ + ZXIC_UINT32 pkt_size_offset; +}DPP_STAT_CAR0_PKT_SIZE_OFFSET_T; + +typedef struct dpp_stat_car0_car_plcr_init_dont_t +{ + ZXIC_UINT32 plcr_init_done; +}DPP_STAT_CAR0_CAR_PLCR_INIT_DONT_T; + +typedef struct dpp_stat_car0_max_pkt_size_a_t +{ + ZXIC_UINT32 max_pkt_size_a; +}DPP_STAT_CAR0_MAX_PKT_SIZE_A_T; + +typedef struct dpp_stat_car0_max_pkt_size_b_t +{ + ZXIC_UINT32 max_pkt_size_b; +}DPP_STAT_CAR0_MAX_PKT_SIZE_B_T; + +typedef struct dpp_stat_car0_max_pkt_size_c_t +{ + ZXIC_UINT32 max_pkt_size_c; +}DPP_STAT_CAR0_MAX_PKT_SIZE_C_T; + +typedef struct dpp_stat_car0_car_hierarchy_mode_t +{ + ZXIC_UINT32 car_hierarchy_mode; +}DPP_STAT_CAR0_CAR_HIERARCHY_MODE_T; + +typedef struct dpp_stat_car0_prog_empty_assert_cfg_w_t +{ + ZXIC_UINT32 prog_empty_assert_cfg_w; +}DPP_STAT_CAR0_PROG_EMPTY_ASSERT_CFG_W_T; + +typedef struct dpp_stat_car0_prog_empty_negate_cfg_w_t +{ + ZXIC_UINT32 prog_empty_negate_cfg_w; +}DPP_STAT_CAR0_PROG_EMPTY_NEGATE_CFG_W_T; + +typedef struct dpp_stat_car0_pkt_des_fifo_ovf_int_t +{ + ZXIC_UINT32 pkt_des_fifo_ovf_int; +}DPP_STAT_CAR0_PKT_DES_FIFO_OVF_INT_T; + +typedef struct dpp_stat_car0_pkt_des_fifo_data_count_t +{ + ZXIC_UINT32 pkt_des_fifo_data_count; +}DPP_STAT_CAR0_PKT_DES_FIFO_DATA_COUNT_T; + +typedef struct dpp_stat_car0_pkt_des_fifo_udf_int_t +{ + ZXIC_UINT32 pkt_des_fifo_udf_int; +}DPP_STAT_CAR0_PKT_DES_FIFO_UDF_INT_T; + +typedef struct dpp_stat_car0_cara_queue_ram0_159_0_pkt_t +{ + ZXIC_UINT32 cara_drop; + ZXIC_UINT32 cara_plcr_en; + ZXIC_UINT32 cara_profile_id; + ZXIC_UINT32 cara_tq_h; + ZXIC_UINT32 cara_tq_l; + ZXIC_UINT32 cara_dc_high; + ZXIC_UINT32 cara_dc_low; + ZXIC_UINT32 cara_tc; +}DPP_STAT_CAR0_CARA_QUEUE_RAM0_159_0_PKT_T; + +typedef struct dpp_stat_car0_cara_profile_ram1_255_0_pkt_t +{ + ZXIC_UINT32 cara_profile_wr; + ZXIC_UINT32 cara_pkt_sign; + ZXIC_UINT32 cara_pkt_cir; + ZXIC_UINT32 cara_pkt_cbs; + ZXIC_UINT32 cara_pri0; + ZXIC_UINT32 cara_pri1; + ZXIC_UINT32 cara_pri2; + ZXIC_UINT32 cara_pri3; + ZXIC_UINT32 cara_pri4; + ZXIC_UINT32 cara_pri5; + ZXIC_UINT32 cara_pri6; + ZXIC_UINT32 cara_pri7; +}DPP_STAT_CAR0_CARA_PROFILE_RAM1_255_0_PKT_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_eram_wdat1_t +{ + ZXIC_UINT32 cpu_ind_eram_wdat1; +}DPP_STAT_STAT_CFG_CPU_IND_ERAM_WDAT1_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_eram_wdat2_t +{ + ZXIC_UINT32 cpu_ind_eram_wdat2; +}DPP_STAT_STAT_CFG_CPU_IND_ERAM_WDAT2_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_eram_wdat3_t +{ + ZXIC_UINT32 cpu_ind_eram_wdat3; +}DPP_STAT_STAT_CFG_CPU_IND_ERAM_WDAT3_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_eram_req_info_t +{ + ZXIC_UINT32 rw_mode; + ZXIC_UINT32 read_mode; + ZXIC_UINT32 tm_cs; + ZXIC_UINT32 queue_cs; + ZXIC_UINT32 rw_addr; +}DPP_STAT_STAT_CFG_CPU_IND_ERAM_REQ_INFO_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_eram_rd_done_t +{ + ZXIC_UINT32 cpu_ind_eram_rd_done; +}DPP_STAT_STAT_CFG_CPU_IND_ERAM_RD_DONE_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_eram_rdat0_t +{ + ZXIC_UINT32 cpu_ind_eram_rdat0; +}DPP_STAT_STAT_CFG_CPU_IND_ERAM_RDAT0_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_eram_rdat1_t +{ + ZXIC_UINT32 cpu_ind_eram_rdat1; +}DPP_STAT_STAT_CFG_CPU_IND_ERAM_RDAT1_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_eram_rdat2_t +{ + ZXIC_UINT32 cpu_ind_eram_rdat2; +}DPP_STAT_STAT_CFG_CPU_IND_ERAM_RDAT2_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_eram_rdat3_t +{ + ZXIC_UINT32 cpu_ind_eram_rdat3; +}DPP_STAT_STAT_CFG_CPU_IND_ERAM_RDAT3_T; + +typedef struct dpp_stat_stat_cfg_tm_alu_eram_cpu_rdy_t +{ + ZXIC_UINT32 tm_alu_eram_cpu_rdy; +}DPP_STAT_STAT_CFG_TM_ALU_ERAM_CPU_RDY_T; + +typedef struct dpp_stat_stat_cfg_oam_stat_cfg_t +{ + ZXIC_UINT32 oam_flow_control_cfg; + ZXIC_UINT32 oam_lm_flow_control_cfg; + ZXIC_UINT32 oam_in_eram_cfg; +}DPP_STAT_STAT_CFG_OAM_STAT_CFG_T; + +typedef struct dpp_stat_stat_cfg_ftm_port_sel_cfg_t +{ + ZXIC_UINT32 ftm_port0_sel_cfg; + ZXIC_UINT32 ftm_port1_sel_cfg; + ZXIC_UINT32 ftm_port2_sel_cfg; + ZXIC_UINT32 ftm_port3_sel_cfg; +}DPP_STAT_STAT_CFG_FTM_PORT_SEL_CFG_T; + +typedef struct dpp_stat_stat_cfg_oam_eram_base_addr_t +{ + ZXIC_UINT32 oam_eram_base_addr; +}DPP_STAT_STAT_CFG_OAM_ERAM_BASE_ADDR_T; + +typedef struct dpp_stat_stat_cfg_oam_lm_eram_base_addr_t +{ + ZXIC_UINT32 oam_lm_eram_base_addr; +}DPP_STAT_STAT_CFG_OAM_LM_ERAM_BASE_ADDR_T; + +typedef struct dpp_stat_stat_cfg_oam_ddr_base_addr_t +{ + ZXIC_UINT32 oam_ddr_base_addr; +}DPP_STAT_STAT_CFG_OAM_DDR_BASE_ADDR_T; + +typedef struct dpp_stat_stat_cfg_plcr0_schd_pful_cfg_t +{ + ZXIC_UINT32 plcr0_schd_pful_assert; + ZXIC_UINT32 plcr0_schd_pful_negate; +}DPP_STAT_STAT_CFG_PLCR0_SCHD_PFUL_CFG_T; + +typedef struct dpp_stat_stat_cfg_oam_lm_ord_pful_cfg_t +{ + ZXIC_UINT32 oam_lm_ord_pful_assert; + ZXIC_UINT32 oam_lm_ord_pful_negate; +}DPP_STAT_STAT_CFG_OAM_LM_ORD_PFUL_CFG_T; + +typedef struct dpp_stat_stat_cfg_ddr_schd_pful_cfg_t +{ + ZXIC_UINT32 ddr_schd_pful_assert; + ZXIC_UINT32 ddr_schd_pful_negate; +}DPP_STAT_STAT_CFG_DDR_SCHD_PFUL_CFG_T; + +typedef struct dpp_stat_stat_cfg_eram_schd_pful_cfg_t +{ + ZXIC_UINT32 eram_schd_pful_assert; + ZXIC_UINT32 eram_schd_pful_negate; +}DPP_STAT_STAT_CFG_ERAM_SCHD_PFUL_CFG_T; + +typedef struct dpp_stat_stat_cfg_eram_schd_pept_cfg_t +{ + ZXIC_UINT32 eram_schd_pept_assert; + ZXIC_UINT32 eram_schd_pept_negate; +}DPP_STAT_STAT_CFG_ERAM_SCHD_PEPT_CFG_T; + +typedef struct dpp_stat_stat_cfg_eram_schd_oam_pful_cfg_t +{ + ZXIC_UINT32 eram_schd_oam_pful_assert; + ZXIC_UINT32 eram_schd_oam_pful_negate; +}DPP_STAT_STAT_CFG_ERAM_SCHD_OAM_PFUL_CFG_T; + +typedef struct dpp_stat_stat_cfg_eram_schd_oam_pept_cfg_t +{ + ZXIC_UINT32 eram_schd_oam_pept_assert; + ZXIC_UINT32 eram_schd_oam_pept_negate; +}DPP_STAT_STAT_CFG_ERAM_SCHD_OAM_PEPT_CFG_T; + +typedef struct dpp_stat_stat_cfg_eram_schd_oam_lm_pful_cfg_t +{ + ZXIC_UINT32 eram_schd_oam_lm_pful_assert; + ZXIC_UINT32 eram_schd_oam_lm_pful_negate; +}DPP_STAT_STAT_CFG_ERAM_SCHD_OAM_LM_PFUL_CFG_T; + +typedef struct dpp_stat_stat_cfg_eram_schd_oam_lm_pept_cfg_t +{ + ZXIC_UINT32 eram_schd_oam_lm_pept_assert; + ZXIC_UINT32 eram_schd_oam_lm_pept_negate; +}DPP_STAT_STAT_CFG_ERAM_SCHD_OAM_LM_PEPT_CFG_T; + +typedef struct dpp_stat_stat_cfg_rschd_pful_cfg_t +{ + ZXIC_UINT32 rschd_pful_assert; + ZXIC_UINT32 rschd_pful_negate; +}DPP_STAT_STAT_CFG_RSCHD_PFUL_CFG_T; + +typedef struct dpp_stat_stat_cfg_rschd_pept_cfg_t +{ + ZXIC_UINT32 rschd_pept_assert; + ZXIC_UINT32 rschd_pept_negate; +}DPP_STAT_STAT_CFG_RSCHD_PEPT_CFG_T; + +typedef struct dpp_stat_stat_cfg_rschd_plcr_pful_cfg_t +{ + ZXIC_UINT32 rschd_plcr_pful_assert; + ZXIC_UINT32 rschd_plcr_pful_negate; +}DPP_STAT_STAT_CFG_RSCHD_PLCR_PFUL_CFG_T; + +typedef struct dpp_stat_stat_cfg_rschd_plcr_pept_cfg_t +{ + ZXIC_UINT32 rschd_plcr_pept_assert; + ZXIC_UINT32 rschd_plcr_pept_negate; +}DPP_STAT_STAT_CFG_RSCHD_PLCR_PEPT_CFG_T; + +typedef struct dpp_stat_stat_cfg_rschd_plcr_info_pful_cfg_t +{ + ZXIC_UINT32 rschd_plcr_info_pful_assert; + ZXIC_UINT32 rschd_plcr_info_pful_negate; +}DPP_STAT_STAT_CFG_RSCHD_PLCR_INFO_PFUL_CFG_T; + +typedef struct dpp_stat_stat_cfg_alu_arb_cpu_pful_cfg_t +{ + ZXIC_UINT32 alu_arb_cpu_pful_assert; + ZXIC_UINT32 alu_arb_cpu_pful_negate; +}DPP_STAT_STAT_CFG_ALU_ARB_CPU_PFUL_CFG_T; + +typedef struct dpp_stat_stat_cfg_alu_arb_user_pful_cfg_t +{ + ZXIC_UINT32 alu_arb_user_pful_assert; + ZXIC_UINT32 alu_arb_user_pful_negate; +}DPP_STAT_STAT_CFG_ALU_ARB_USER_PFUL_CFG_T; + +typedef struct dpp_stat_stat_cfg_alu_arb_stat_pful_cfg_t +{ + ZXIC_UINT32 alu_arb_stat_pful_assert; + ZXIC_UINT32 alu_arb_stat_pful_negate; +}DPP_STAT_STAT_CFG_ALU_ARB_STAT_PFUL_CFG_T; + +typedef struct dpp_stat_stat_cfg_cycmov_dat_pful_cfg_t +{ + ZXIC_UINT32 cycmov_dat_pful_assert; + ZXIC_UINT32 cycmov_dat_pful_negate; +}DPP_STAT_STAT_CFG_CYCMOV_DAT_PFUL_CFG_T; + +typedef struct dpp_stat_stat_cfg_ddr_opr_pful_cfg_t +{ + ZXIC_UINT32 ddr_opr_pful_assert; + ZXIC_UINT32 ddr_opr_pful_negate; +}DPP_STAT_STAT_CFG_DDR_OPR_PFUL_CFG_T; + +typedef struct dpp_stat_stat_cfg_cycle_mov_pful_cfg_t +{ + ZXIC_UINT32 cycle_mov_pful_assert; + ZXIC_UINT32 cycle_mov_pful_negate; +}DPP_STAT_STAT_CFG_CYCLE_MOV_PFUL_CFG_T; + +typedef struct dpp_stat_stat_cfg_cntovf_pful_cfg_t +{ + ZXIC_UINT32 cntovf_pful_assert; + ZXIC_UINT32 cntovf_pful_negate; +}DPP_STAT_STAT_CFG_CNTOVF_PFUL_CFG_T; + +typedef struct dpp_stat_stat_cfg_eram_schd_plcr_pful_cfg_t +{ + ZXIC_UINT32 eram_schd_plcr_pful_assert; + ZXIC_UINT32 eram_schd_plcr_pful_negate; +}DPP_STAT_STAT_CFG_ERAM_SCHD_PLCR_PFUL_CFG_T; + +typedef struct dpp_stat_stat_cfg_eram_schd_plcr_pept_cfg_t +{ + ZXIC_UINT32 eram_schd_plcr_pept_assert; + ZXIC_UINT32 eram_schd_plcr_pept_negate; +}DPP_STAT_STAT_CFG_ERAM_SCHD_PLCR_PEPT_CFG_T; + +typedef struct dpp_stat_stat_cfg_debug_cnt_mode_t +{ + ZXIC_UINT32 cnt_rd_mode; + ZXIC_UINT32 cnt_overflow_mode; +}DPP_STAT_STAT_CFG_DEBUG_CNT_MODE_T; + +typedef struct dpp_stat_stat_cfg_tm_mov_period_cfg_t +{ + ZXIC_UINT32 etm_mov_period_cfg; + ZXIC_UINT32 ftm_mov_period_cfg; +}DPP_STAT_STAT_CFG_TM_MOV_PERIOD_CFG_T; + +typedef struct dpp_stat_stat_cfg_alu_ddr_cpu_req_pful_cfg_t +{ + ZXIC_UINT32 alu_ddr_cpu_req_pful_assert; + ZXIC_UINT32 alu_ddr_cpu_req_pful_negate; +}DPP_STAT_STAT_CFG_ALU_DDR_CPU_REQ_PFUL_CFG_T; + +typedef struct dpp_stat_stat_cfg_cycmov_addr_pful_cfg_t +{ + ZXIC_UINT32 cycmov_addr_pful_assert; + ZXIC_UINT32 cycmov_addr_pful_negate; +}DPP_STAT_STAT_CFG_CYCMOV_ADDR_PFUL_CFG_T; + +typedef struct dpp_stat_stat_cfg_ord_ddr_plcr_fifo_empty_t +{ + ZXIC_UINT32 ord_oam_lm_empty; + ZXIC_UINT32 ddr_schd_fifo_empty; + ZXIC_UINT32 plcr0_schd_fifo_empty; +}DPP_STAT_STAT_CFG_ORD_DDR_PLCR_FIFO_EMPTY_T; + +typedef struct dpp_stat_stat_cfg_tm_stat_fifo_empty_t +{ + ZXIC_UINT32 tm_stat_fifo_empty; +}DPP_STAT_STAT_CFG_TM_STAT_FIFO_EMPTY_T; + +typedef struct dpp_stat_stat_cfg_eram_schd_fifo_empty_0_1_t +{ + ZXIC_UINT32 eram_schd_fifo_empty1; + ZXIC_UINT32 eram_schd_fifo_empty0; +}DPP_STAT_STAT_CFG_ERAM_SCHD_FIFO_EMPTY_0_1_T; + +typedef struct dpp_stat_stat_cfg_eram_schd_fifo_empty_2_3_t +{ + ZXIC_UINT32 eram_schd_fifo_empty3; + ZXIC_UINT32 eram_schd_fifo_empty2; +}DPP_STAT_STAT_CFG_ERAM_SCHD_FIFO_EMPTY_2_3_T; + +typedef struct dpp_stat_stat_cfg_eram_schd_fifo_empty_4_5_t +{ + ZXIC_UINT32 eram_schd_fifo_empty5; + ZXIC_UINT32 eram_schd_fifo_empty4; +}DPP_STAT_STAT_CFG_ERAM_SCHD_FIFO_EMPTY_4_5_T; + +typedef struct dpp_stat_stat_cfg_eram_schd_fifo_empty_6_7_t +{ + ZXIC_UINT32 eram_schd_fifo_empty7; + ZXIC_UINT32 eram_schd_fifo_empty6; +}DPP_STAT_STAT_CFG_ERAM_SCHD_FIFO_EMPTY_6_7_T; + +typedef struct dpp_stat_stat_cfg_eram_schd_fifo_empty_free_8_t +{ + ZXIC_UINT32 eram_schd_free_fifo_empty8; + ZXIC_UINT32 eram_schd_free_fifo_empty7; + ZXIC_UINT32 eram_schd_free_fifo_empty6; + ZXIC_UINT32 eram_schd_free_fifo_empty5; + ZXIC_UINT32 eram_schd_free_fifo_empty4; + ZXIC_UINT32 eram_schd_free_fifo_empty3; + ZXIC_UINT32 eram_schd_free_fifo_empty2; + ZXIC_UINT32 eram_schd_free_fifo_empty1; + ZXIC_UINT32 eram_schd_free_fifo_empty0; + ZXIC_UINT32 eram_schd_fifo_empty8; +}DPP_STAT_STAT_CFG_ERAM_SCHD_FIFO_EMPTY_FREE_8_T; + +typedef struct dpp_stat_stat_cfg_rschd_fifo_empty_0_3_t +{ + ZXIC_UINT32 rschd_fifo_empty3; + ZXIC_UINT32 rschd_fifo_empty2; + ZXIC_UINT32 rschd_fifo_empty1; + ZXIC_UINT32 rschd_fifo_empty0; +}DPP_STAT_STAT_CFG_RSCHD_FIFO_EMPTY_0_3_T; + +typedef struct dpp_stat_stat_cfg_rschd_fifo_empty_4_7_t +{ + ZXIC_UINT32 rschd_fifo_empty7; + ZXIC_UINT32 rschd_fifo_empty6; + ZXIC_UINT32 rschd_fifo_empty5; + ZXIC_UINT32 rschd_fifo_empty4; +}DPP_STAT_STAT_CFG_RSCHD_FIFO_EMPTY_4_7_T; + +typedef struct dpp_stat_stat_cfg_rschd_fifo_empty_8_11_t +{ + ZXIC_UINT32 rschd_fifo_empty11; + ZXIC_UINT32 rschd_fifo_empty10; + ZXIC_UINT32 rschd_fifo_empty9; + ZXIC_UINT32 rschd_fifo_empty8; +}DPP_STAT_STAT_CFG_RSCHD_FIFO_EMPTY_8_11_T; + +typedef struct dpp_stat_stat_cfg_rschd_fifo_empty_12_15_t +{ + ZXIC_UINT32 rschd_fifo_empty15; + ZXIC_UINT32 rschd_fifo_empty14; + ZXIC_UINT32 rschd_fifo_empty13; + ZXIC_UINT32 rschd_fifo_empty12; +}DPP_STAT_STAT_CFG_RSCHD_FIFO_EMPTY_12_15_T; + +typedef struct dpp_stat_stat_cfg_rschd_fifo_empty_plcr_16_17_t +{ + ZXIC_UINT32 rschd_fifo_empty_plcr; + ZXIC_UINT32 rschd_fifo_empty17; + ZXIC_UINT32 rschd_fifo_empty16; +}DPP_STAT_STAT_CFG_RSCHD_FIFO_EMPTY_PLCR_16_17_T; + +typedef struct dpp_stat_stat_cfg_stat_int_unmask_flag_t +{ + ZXIC_UINT32 stat_int5_unmask_flag; + ZXIC_UINT32 stat_int4_unmask_flag; + ZXIC_UINT32 stat_int3_unmask_flag; + ZXIC_UINT32 stat_int2_unmask_flag; + ZXIC_UINT32 stat_int1_unmask_flag; + ZXIC_UINT32 stat_int0_unmask_flag; +}DPP_STAT_STAT_CFG_STAT_INT_UNMASK_FLAG_T; + +typedef struct dpp_stat_stat_cfg_stat_int0_en_t +{ + ZXIC_UINT32 stat_int0_en31; + ZXIC_UINT32 stat_int0_en30; + ZXIC_UINT32 stat_int0_en29; + ZXIC_UINT32 stat_int0_en28; + ZXIC_UINT32 stat_int0_en27; + ZXIC_UINT32 stat_int0_en26; + ZXIC_UINT32 stat_int0_en25; + ZXIC_UINT32 stat_int0_en24; + ZXIC_UINT32 stat_int0_en23; + ZXIC_UINT32 stat_int0_en22; + ZXIC_UINT32 stat_int0_en21; + ZXIC_UINT32 stat_int0_en20; + ZXIC_UINT32 stat_int0_en19; + ZXIC_UINT32 stat_int0_en18; + ZXIC_UINT32 stat_int0_en17; + ZXIC_UINT32 stat_int0_en16; + ZXIC_UINT32 stat_int0_en15; + ZXIC_UINT32 stat_int0_en14; + ZXIC_UINT32 stat_int0_en13; + ZXIC_UINT32 stat_int0_en12; + ZXIC_UINT32 stat_int0_en11; + ZXIC_UINT32 stat_int0_en10; + ZXIC_UINT32 stat_int0_en9; + ZXIC_UINT32 stat_int0_en8; + ZXIC_UINT32 stat_int0_en7; + ZXIC_UINT32 stat_int0_en6; + ZXIC_UINT32 stat_int0_en5; + ZXIC_UINT32 stat_int0_en4; + ZXIC_UINT32 stat_int0_en3; + ZXIC_UINT32 stat_int0_en2; + ZXIC_UINT32 stat_int0_en1; + ZXIC_UINT32 stat_int0_en0; +}DPP_STAT_STAT_CFG_STAT_INT0_EN_T; + +typedef struct dpp_stat_stat_cfg_stat_int0_mask_t +{ + ZXIC_UINT32 stat_int0_mask31; + ZXIC_UINT32 stat_int0_mask30; + ZXIC_UINT32 stat_int0_mask29; + ZXIC_UINT32 stat_int0_mask28; + ZXIC_UINT32 stat_int0_mask27; + ZXIC_UINT32 stat_int0_mask26; + ZXIC_UINT32 stat_int0_mask25; + ZXIC_UINT32 stat_int0_mask24; + ZXIC_UINT32 stat_int0_mask23; + ZXIC_UINT32 stat_int0_mask22; + ZXIC_UINT32 stat_int0_mask21; + ZXIC_UINT32 stat_int0_mask20; + ZXIC_UINT32 stat_int0_mask19; + ZXIC_UINT32 stat_int0_mask18; + ZXIC_UINT32 stat_int0_mask17; + ZXIC_UINT32 stat_int0_mask16; + ZXIC_UINT32 stat_int0_mask15; + ZXIC_UINT32 stat_int0_mask14; + ZXIC_UINT32 stat_int0_mask13; + ZXIC_UINT32 stat_int0_mask12; + ZXIC_UINT32 stat_int0_mask11; + ZXIC_UINT32 stat_int0_mask10; + ZXIC_UINT32 stat_int0_mask9; + ZXIC_UINT32 stat_int0_mask8; + ZXIC_UINT32 stat_int0_mask7; + ZXIC_UINT32 stat_int0_mask6; + ZXIC_UINT32 stat_int0_mask5; + ZXIC_UINT32 stat_int0_mask4; + ZXIC_UINT32 stat_int0_mask3; + ZXIC_UINT32 stat_int0_mask2; + ZXIC_UINT32 stat_int0_mask1; + ZXIC_UINT32 stat_int0_mask0; +}DPP_STAT_STAT_CFG_STAT_INT0_MASK_T; + +typedef struct dpp_stat_stat_cfg_stat_int0_status_t +{ + ZXIC_UINT32 stat_int0_status31; + ZXIC_UINT32 stat_int0_status30; + ZXIC_UINT32 stat_int0_status29; + ZXIC_UINT32 stat_int0_status28; + ZXIC_UINT32 stat_int0_status27; + ZXIC_UINT32 stat_int0_status26; + ZXIC_UINT32 stat_int0_status25; + ZXIC_UINT32 stat_int0_status24; + ZXIC_UINT32 stat_int0_status23; + ZXIC_UINT32 stat_int0_status22; + ZXIC_UINT32 stat_int0_status21; + ZXIC_UINT32 stat_int0_status20; + ZXIC_UINT32 stat_int0_status19; + ZXIC_UINT32 stat_int0_status18; + ZXIC_UINT32 stat_int0_status17; + ZXIC_UINT32 stat_int0_status16; + ZXIC_UINT32 stat_int0_status15; + ZXIC_UINT32 stat_int0_status14; + ZXIC_UINT32 stat_int0_status13; + ZXIC_UINT32 stat_int0_status12; + ZXIC_UINT32 stat_int0_status11; + ZXIC_UINT32 stat_int0_status10; + ZXIC_UINT32 stat_int0_status9; + ZXIC_UINT32 stat_int0_status8; + ZXIC_UINT32 stat_int0_status7; + ZXIC_UINT32 stat_int0_status6; + ZXIC_UINT32 stat_int0_status5; + ZXIC_UINT32 stat_int0_status4; + ZXIC_UINT32 stat_int0_status3; + ZXIC_UINT32 stat_int0_status2; + ZXIC_UINT32 stat_int0_status1; + ZXIC_UINT32 stat_int0_status0; +}DPP_STAT_STAT_CFG_STAT_INT0_STATUS_T; + +typedef struct dpp_stat_stat_cfg_stat_int1_en_t +{ + ZXIC_UINT32 stat_int1_en31; + ZXIC_UINT32 stat_int1_en30; + ZXIC_UINT32 stat_int1_en29; + ZXIC_UINT32 stat_int1_en28; + ZXIC_UINT32 stat_int1_en27; + ZXIC_UINT32 stat_int1_en26; + ZXIC_UINT32 stat_int1_en25; + ZXIC_UINT32 stat_int1_en24; + ZXIC_UINT32 stat_int1_en23; + ZXIC_UINT32 stat_int1_en22; + ZXIC_UINT32 stat_int1_en21; + ZXIC_UINT32 stat_int1_en20; + ZXIC_UINT32 stat_int1_en19; + ZXIC_UINT32 stat_int1_en18; + ZXIC_UINT32 stat_int1_en17; + ZXIC_UINT32 stat_int1_en16; + ZXIC_UINT32 stat_int1_en15; + ZXIC_UINT32 stat_int1_en14; + ZXIC_UINT32 stat_int1_en13; + ZXIC_UINT32 stat_int1_en12; + ZXIC_UINT32 stat_int1_en11; + ZXIC_UINT32 stat_int1_en10; + ZXIC_UINT32 stat_int1_en9; + ZXIC_UINT32 stat_int1_en8; + ZXIC_UINT32 stat_int1_en7; + ZXIC_UINT32 stat_int1_en6; + ZXIC_UINT32 stat_int1_en5; + ZXIC_UINT32 stat_int1_en4; + ZXIC_UINT32 stat_int1_en3; + ZXIC_UINT32 stat_int1_en2; + ZXIC_UINT32 stat_int1_en1; + ZXIC_UINT32 stat_int1_en0; +}DPP_STAT_STAT_CFG_STAT_INT1_EN_T; + +typedef struct dpp_stat_stat_cfg_stat_int1_mask_t +{ + ZXIC_UINT32 stat_int1_mask31; + ZXIC_UINT32 stat_int1_mask30; + ZXIC_UINT32 stat_int1_mask29; + ZXIC_UINT32 stat_int1_mask28; + ZXIC_UINT32 stat_int1_mask27; + ZXIC_UINT32 stat_int1_mask26; + ZXIC_UINT32 stat_int1_mask25; + ZXIC_UINT32 stat_int1_mask24; + ZXIC_UINT32 stat_int1_mask23; + ZXIC_UINT32 stat_int1_mask22; + ZXIC_UINT32 stat_int1_mask21; + ZXIC_UINT32 stat_int1_mask20; + ZXIC_UINT32 stat_int1_mask19; + ZXIC_UINT32 stat_int1_mask18; + ZXIC_UINT32 stat_int1_mask17; + ZXIC_UINT32 stat_int1_mask16; + ZXIC_UINT32 stat_int1_mask15; + ZXIC_UINT32 stat_int1_mask14; + ZXIC_UINT32 stat_int1_mask13; + ZXIC_UINT32 stat_int1_mask12; + ZXIC_UINT32 stat_int1_mask11; + ZXIC_UINT32 stat_int1_mask10; + ZXIC_UINT32 stat_int1_mask9; + ZXIC_UINT32 stat_int1_mask8; + ZXIC_UINT32 stat_int1_mask7; + ZXIC_UINT32 stat_int1_mask6; + ZXIC_UINT32 stat_int1_mask5; + ZXIC_UINT32 stat_int1_mask4; + ZXIC_UINT32 stat_int1_mask3; + ZXIC_UINT32 stat_int1_mask2; + ZXIC_UINT32 stat_int1_mask1; + ZXIC_UINT32 stat_int1_mask0; +}DPP_STAT_STAT_CFG_STAT_INT1_MASK_T; + +typedef struct dpp_stat_stat_cfg_stat_int1_status_t +{ + ZXIC_UINT32 stat_int1_status31; + ZXIC_UINT32 stat_int1_status30; + ZXIC_UINT32 stat_int1_status29; + ZXIC_UINT32 stat_int1_status28; + ZXIC_UINT32 stat_int1_status27; + ZXIC_UINT32 stat_int1_status26; + ZXIC_UINT32 stat_int1_status25; + ZXIC_UINT32 stat_int1_status24; + ZXIC_UINT32 stat_int1_status23; + ZXIC_UINT32 stat_int1_status22; + ZXIC_UINT32 stat_int1_status21; + ZXIC_UINT32 stat_int1_status20; + ZXIC_UINT32 stat_int1_status19; + ZXIC_UINT32 stat_int1_status18; + ZXIC_UINT32 stat_int1_status17; + ZXIC_UINT32 stat_int1_status16; + ZXIC_UINT32 stat_int1_status15; + ZXIC_UINT32 stat_int1_status14; + ZXIC_UINT32 stat_int1_status13; + ZXIC_UINT32 stat_int1_status12; + ZXIC_UINT32 stat_int1_status11; + ZXIC_UINT32 stat_int1_status10; + ZXIC_UINT32 stat_int1_status9; + ZXIC_UINT32 stat_int1_status8; + ZXIC_UINT32 stat_int1_status7; + ZXIC_UINT32 stat_int1_status6; + ZXIC_UINT32 stat_int1_status5; + ZXIC_UINT32 stat_int1_status4; + ZXIC_UINT32 stat_int1_status3; + ZXIC_UINT32 stat_int1_status2; + ZXIC_UINT32 stat_int1_status1; + ZXIC_UINT32 stat_int1_status0; +}DPP_STAT_STAT_CFG_STAT_INT1_STATUS_T; + +typedef struct dpp_stat_stat_cfg_stat_int2_en_t +{ + ZXIC_UINT32 stat_int2_en31; + ZXIC_UINT32 stat_int2_en30; + ZXIC_UINT32 stat_int2_en29; + ZXIC_UINT32 stat_int2_en28; + ZXIC_UINT32 stat_int2_en27; + ZXIC_UINT32 stat_int2_en26; + ZXIC_UINT32 stat_int2_en25; + ZXIC_UINT32 stat_int2_en24; + ZXIC_UINT32 stat_int2_en23; + ZXIC_UINT32 stat_int2_en22; + ZXIC_UINT32 stat_int2_en21; + ZXIC_UINT32 stat_int2_en20; + ZXIC_UINT32 stat_int2_en19; + ZXIC_UINT32 stat_int2_en18; + ZXIC_UINT32 stat_int2_en17; + ZXIC_UINT32 stat_int2_en16; + ZXIC_UINT32 stat_int2_en15; + ZXIC_UINT32 stat_int2_en14; + ZXIC_UINT32 stat_int2_en13; + ZXIC_UINT32 stat_int2_en12; + ZXIC_UINT32 stat_int2_en11; + ZXIC_UINT32 stat_int2_en10; + ZXIC_UINT32 stat_int2_en9; + ZXIC_UINT32 stat_int2_en8; + ZXIC_UINT32 stat_int2_en7; + ZXIC_UINT32 stat_int2_en6; + ZXIC_UINT32 stat_int2_en5; + ZXIC_UINT32 stat_int2_en4; + ZXIC_UINT32 stat_int2_en3; + ZXIC_UINT32 stat_int2_en2; + ZXIC_UINT32 stat_int2_en1; + ZXIC_UINT32 stat_int2_en0; +}DPP_STAT_STAT_CFG_STAT_INT2_EN_T; + +typedef struct dpp_stat_stat_cfg_stat_int2_mask_t +{ + ZXIC_UINT32 stat_int2_mask31; + ZXIC_UINT32 stat_int2_mask30; + ZXIC_UINT32 stat_int2_mask29; + ZXIC_UINT32 stat_int2_mask28; + ZXIC_UINT32 stat_int2_mask27; + ZXIC_UINT32 stat_int2_mask26; + ZXIC_UINT32 stat_int2_mask25; + ZXIC_UINT32 stat_int2_mask24; + ZXIC_UINT32 stat_int2_mask23; + ZXIC_UINT32 stat_int2_mask22; + ZXIC_UINT32 stat_int2_mask21; + ZXIC_UINT32 stat_int2_mask20; + ZXIC_UINT32 stat_int2_mask19; + ZXIC_UINT32 stat_int2_mask18; + ZXIC_UINT32 stat_int2_mask17; + ZXIC_UINT32 stat_int2_mask16; + ZXIC_UINT32 stat_int2_mask15; + ZXIC_UINT32 stat_int2_mask14; + ZXIC_UINT32 stat_int2_mask13; + ZXIC_UINT32 stat_int2_mask12; + ZXIC_UINT32 stat_int2_mask11; + ZXIC_UINT32 stat_int2_mask10; + ZXIC_UINT32 stat_int2_mask9; + ZXIC_UINT32 stat_int2_mask8; + ZXIC_UINT32 stat_int2_mask7; + ZXIC_UINT32 stat_int2_mask6; + ZXIC_UINT32 stat_int2_mask5; + ZXIC_UINT32 stat_int2_mask4; + ZXIC_UINT32 stat_int2_mask3; + ZXIC_UINT32 stat_int2_mask2; + ZXIC_UINT32 stat_int2_mask1; + ZXIC_UINT32 stat_int2_mask0; +}DPP_STAT_STAT_CFG_STAT_INT2_MASK_T; + +typedef struct dpp_stat_stat_cfg_stat_int2_status_t +{ + ZXIC_UINT32 stat_int2_status31; + ZXIC_UINT32 stat_int2_status30; + ZXIC_UINT32 stat_int2_status29; + ZXIC_UINT32 stat_int2_status28; + ZXIC_UINT32 stat_int2_status27; + ZXIC_UINT32 stat_int2_status26; + ZXIC_UINT32 stat_int2_status25; + ZXIC_UINT32 stat_int2_status24; + ZXIC_UINT32 stat_int2_status23; + ZXIC_UINT32 stat_int2_status22; + ZXIC_UINT32 stat_int2_status21; + ZXIC_UINT32 stat_int2_status20; + ZXIC_UINT32 stat_int2_status19; + ZXIC_UINT32 stat_int2_status18; + ZXIC_UINT32 stat_int2_status17; + ZXIC_UINT32 stat_int2_status16; + ZXIC_UINT32 stat_int2_status15; + ZXIC_UINT32 stat_int2_status14; + ZXIC_UINT32 stat_int2_status13; + ZXIC_UINT32 stat_int2_status12; + ZXIC_UINT32 stat_int2_status11; + ZXIC_UINT32 stat_int2_status10; + ZXIC_UINT32 stat_int2_status9; + ZXIC_UINT32 stat_int2_status8; + ZXIC_UINT32 stat_int2_status7; + ZXIC_UINT32 stat_int2_status6; + ZXIC_UINT32 stat_int2_status5; + ZXIC_UINT32 stat_int2_status4; + ZXIC_UINT32 stat_int2_status3; + ZXIC_UINT32 stat_int2_status2; + ZXIC_UINT32 stat_int2_status1; + ZXIC_UINT32 stat_int2_status0; +}DPP_STAT_STAT_CFG_STAT_INT2_STATUS_T; + +typedef struct dpp_stat_stat_cfg_stat_int3_en_t +{ + ZXIC_UINT32 stat_int3_en31; + ZXIC_UINT32 stat_int3_en30; + ZXIC_UINT32 stat_int3_en29; + ZXIC_UINT32 stat_int3_en28; + ZXIC_UINT32 stat_int3_en27; + ZXIC_UINT32 stat_int3_en26; + ZXIC_UINT32 stat_int3_en25; + ZXIC_UINT32 stat_int3_en24; + ZXIC_UINT32 stat_int3_en23; + ZXIC_UINT32 stat_int3_en22; + ZXIC_UINT32 stat_int3_en21; + ZXIC_UINT32 stat_int3_en20; + ZXIC_UINT32 stat_int3_en19; + ZXIC_UINT32 stat_int3_en18; + ZXIC_UINT32 stat_int3_en17; + ZXIC_UINT32 stat_int3_en16; + ZXIC_UINT32 stat_int3_en15; + ZXIC_UINT32 stat_int3_en14; + ZXIC_UINT32 stat_int3_en13; + ZXIC_UINT32 stat_int3_en12; + ZXIC_UINT32 stat_int3_en11; + ZXIC_UINT32 stat_int3_en10; + ZXIC_UINT32 stat_int3_en9; + ZXIC_UINT32 stat_int3_en8; + ZXIC_UINT32 stat_int3_en7; + ZXIC_UINT32 stat_int3_en6; + ZXIC_UINT32 stat_int3_en5; + ZXIC_UINT32 stat_int3_en4; + ZXIC_UINT32 stat_int3_en3; + ZXIC_UINT32 stat_int3_en2; + ZXIC_UINT32 stat_int3_en1; + ZXIC_UINT32 stat_int3_en0; +}DPP_STAT_STAT_CFG_STAT_INT3_EN_T; + +typedef struct dpp_stat_stat_cfg_stat_int3_mask_t +{ + ZXIC_UINT32 stat_int3_mask31; + ZXIC_UINT32 stat_int3_mask30; + ZXIC_UINT32 stat_int3_mask29; + ZXIC_UINT32 stat_int3_mask28; + ZXIC_UINT32 stat_int3_mask27; + ZXIC_UINT32 stat_int3_mask26; + ZXIC_UINT32 stat_int3_mask25; + ZXIC_UINT32 stat_int3_mask24; + ZXIC_UINT32 stat_int3_mask23; + ZXIC_UINT32 stat_int3_mask22; + ZXIC_UINT32 stat_int3_mask21; + ZXIC_UINT32 stat_int3_mask20; + ZXIC_UINT32 stat_int3_mask19; + ZXIC_UINT32 stat_int3_mask18; + ZXIC_UINT32 stat_int3_mask17; + ZXIC_UINT32 stat_int3_mask16; + ZXIC_UINT32 stat_int3_mask15; + ZXIC_UINT32 stat_int3_mask14; + ZXIC_UINT32 stat_int3_mask13; + ZXIC_UINT32 stat_int3_mask12; + ZXIC_UINT32 stat_int3_mask11; + ZXIC_UINT32 stat_int3_mask10; + ZXIC_UINT32 stat_int3_mask9; + ZXIC_UINT32 stat_int3_mask8; + ZXIC_UINT32 stat_int3_mask7; + ZXIC_UINT32 stat_int3_mask6; + ZXIC_UINT32 stat_int3_mask5; + ZXIC_UINT32 stat_int3_mask4; + ZXIC_UINT32 stat_int3_mask3; + ZXIC_UINT32 stat_int3_mask2; + ZXIC_UINT32 stat_int3_mask1; + ZXIC_UINT32 stat_int3_mask0; +}DPP_STAT_STAT_CFG_STAT_INT3_MASK_T; + +typedef struct dpp_stat_stat_cfg_stat_int3_status_t +{ + ZXIC_UINT32 stat_int3_status31; + ZXIC_UINT32 stat_int3_status30; + ZXIC_UINT32 stat_int3_status29; + ZXIC_UINT32 stat_int3_status28; + ZXIC_UINT32 stat_int3_status27; + ZXIC_UINT32 stat_int3_status26; + ZXIC_UINT32 stat_int3_status25; + ZXIC_UINT32 stat_int3_status24; + ZXIC_UINT32 stat_int3_status23; + ZXIC_UINT32 stat_int3_status22; + ZXIC_UINT32 stat_int3_status21; + ZXIC_UINT32 stat_int3_status20; + ZXIC_UINT32 stat_int3_status19; + ZXIC_UINT32 stat_int3_status18; + ZXIC_UINT32 stat_int3_status17; + ZXIC_UINT32 stat_int3_status16; + ZXIC_UINT32 stat_int3_status15; + ZXIC_UINT32 stat_int3_status14; + ZXIC_UINT32 stat_int3_status13; + ZXIC_UINT32 stat_int3_status12; + ZXIC_UINT32 stat_int3_status11; + ZXIC_UINT32 stat_int3_status10; + ZXIC_UINT32 stat_int3_status9; + ZXIC_UINT32 stat_int3_status8; + ZXIC_UINT32 stat_int3_status7; + ZXIC_UINT32 stat_int3_status6; + ZXIC_UINT32 stat_int3_status5; + ZXIC_UINT32 stat_int3_status4; + ZXIC_UINT32 stat_int3_status3; + ZXIC_UINT32 stat_int3_status2; + ZXIC_UINT32 stat_int3_status1; + ZXIC_UINT32 stat_int3_status0; +}DPP_STAT_STAT_CFG_STAT_INT3_STATUS_T; + +typedef struct dpp_stat_stat_cfg_stat_int4_en_t +{ + ZXIC_UINT32 stat_int4_en_18; + ZXIC_UINT32 stat_int4_en_17; + ZXIC_UINT32 stat_int4_en_16; + ZXIC_UINT32 stat_int4_en_15; + ZXIC_UINT32 stat_int4_en_14; + ZXIC_UINT32 stat_int4_en_13; + ZXIC_UINT32 stat_int4_en_12; + ZXIC_UINT32 stat_int4_en_11; + ZXIC_UINT32 stat_int4_en_10; + ZXIC_UINT32 stat_int4_en_9; + ZXIC_UINT32 stat_int4_en_8; + ZXIC_UINT32 stat_int4_en_7; + ZXIC_UINT32 stat_int4_en_6; + ZXIC_UINT32 stat_int4_en_5; + ZXIC_UINT32 stat_int4_en_4; + ZXIC_UINT32 stat_int4_en_3; + ZXIC_UINT32 stat_int4_en_2; + ZXIC_UINT32 stat_int4_en_1; + ZXIC_UINT32 stat_int4_en_0; +}DPP_STAT_STAT_CFG_STAT_INT4_EN_T; + +typedef struct dpp_stat_stat_cfg_stat_int4_mask_t +{ + ZXIC_UINT32 stat_int4_mask_18; + ZXIC_UINT32 stat_int4_mask_17; + ZXIC_UINT32 stat_int4_mask_16; + ZXIC_UINT32 stat_int4_mask_15; + ZXIC_UINT32 stat_int4_mask_14; + ZXIC_UINT32 stat_int4_mask_13; + ZXIC_UINT32 stat_int4_mask_12; + ZXIC_UINT32 stat_int4_mask_11; + ZXIC_UINT32 stat_int4_mask_10; + ZXIC_UINT32 stat_int4_mask_9; + ZXIC_UINT32 stat_int4_mask_8; + ZXIC_UINT32 stat_int4_mask_7; + ZXIC_UINT32 stat_int4_mask_6; + ZXIC_UINT32 stat_int4_mask_5; + ZXIC_UINT32 stat_int4_mask_4; + ZXIC_UINT32 stat_int4_mask_3; + ZXIC_UINT32 stat_int4_mask_2; + ZXIC_UINT32 stat_int4_mask_1; + ZXIC_UINT32 stat_int4_mask_0; +}DPP_STAT_STAT_CFG_STAT_INT4_MASK_T; + +typedef struct dpp_stat_stat_cfg_stat_int4_status_t +{ + ZXIC_UINT32 stat_int4_mask_18; + ZXIC_UINT32 stat_int4_mask_17; + ZXIC_UINT32 stat_int4_mask_16; + ZXIC_UINT32 stat_int4_mask_15; + ZXIC_UINT32 stat_int4_mask_14; + ZXIC_UINT32 stat_int4_mask_13; + ZXIC_UINT32 stat_int4_mask_12; + ZXIC_UINT32 stat_int4_mask_11; + ZXIC_UINT32 stat_int4_mask_10; + ZXIC_UINT32 stat_int4_mask_9; + ZXIC_UINT32 stat_int4_mask_8; + ZXIC_UINT32 stat_int4_mask_7; + ZXIC_UINT32 stat_int4_mask_6; + ZXIC_UINT32 stat_int4_mask_5; + ZXIC_UINT32 stat_int4_mask_4; + ZXIC_UINT32 stat_int4_mask_3; + ZXIC_UINT32 stat_int4_mask_2; + ZXIC_UINT32 stat_int4_mask_1; + ZXIC_UINT32 stat_int4_mask_0; +}DPP_STAT_STAT_CFG_STAT_INT4_STATUS_T; + +typedef struct dpp_stat_stat_cfg_stat_int5_en_t +{ + ZXIC_UINT32 stat_int5_en_18; + ZXIC_UINT32 stat_int5_en_17; + ZXIC_UINT32 stat_int5_en_16; + ZXIC_UINT32 stat_int5_en_15; + ZXIC_UINT32 stat_int5_en_14; + ZXIC_UINT32 stat_int5_en_13; + ZXIC_UINT32 stat_int5_en_12; + ZXIC_UINT32 stat_int5_en_11; + ZXIC_UINT32 stat_int5_en_10; + ZXIC_UINT32 stat_int5_en_9; + ZXIC_UINT32 stat_int5_en_8; + ZXIC_UINT32 stat_int5_en_7; + ZXIC_UINT32 stat_int5_en_6; + ZXIC_UINT32 stat_int5_en_5; + ZXIC_UINT32 stat_int5_en_4; + ZXIC_UINT32 stat_int5_en_3; + ZXIC_UINT32 stat_int5_en_2; + ZXIC_UINT32 stat_int5_en_1; + ZXIC_UINT32 stat_int5_en_0; +}DPP_STAT_STAT_CFG_STAT_INT5_EN_T; + +typedef struct dpp_stat_stat_cfg_stat_int5_mask_t +{ + ZXIC_UINT32 stat_int5_mask_18; + ZXIC_UINT32 stat_int5_mask_17; + ZXIC_UINT32 stat_int5_mask_16; + ZXIC_UINT32 stat_int5_mask_15; + ZXIC_UINT32 stat_int5_mask_14; + ZXIC_UINT32 stat_int5_mask_13; + ZXIC_UINT32 stat_int5_mask_12; + ZXIC_UINT32 stat_int5_mask_11; + ZXIC_UINT32 stat_int5_mask_10; + ZXIC_UINT32 stat_int5_mask_9; + ZXIC_UINT32 stat_int5_mask_8; + ZXIC_UINT32 stat_int5_mask_7; + ZXIC_UINT32 stat_int5_mask_6; + ZXIC_UINT32 stat_int5_mask_5; + ZXIC_UINT32 stat_int5_mask_4; + ZXIC_UINT32 stat_int5_mask_3; + ZXIC_UINT32 stat_int5_mask_2; + ZXIC_UINT32 stat_int5_mask_1; + ZXIC_UINT32 stat_int5_mask_0; +}DPP_STAT_STAT_CFG_STAT_INT5_MASK_T; + +typedef struct dpp_stat_stat_cfg_stat_int5_status_t +{ + ZXIC_UINT32 stat_int5_mask_18; + ZXIC_UINT32 stat_int5_mask_17; + ZXIC_UINT32 stat_int5_mask_16; + ZXIC_UINT32 stat_int5_mask_15; + ZXIC_UINT32 stat_int5_mask_14; + ZXIC_UINT32 stat_int5_mask_13; + ZXIC_UINT32 stat_int5_mask_12; + ZXIC_UINT32 stat_int5_mask_11; + ZXIC_UINT32 stat_int5_mask_10; + ZXIC_UINT32 stat_int5_mask_9; + ZXIC_UINT32 stat_int5_mask_8; + ZXIC_UINT32 stat_int5_mask_7; + ZXIC_UINT32 stat_int5_mask_6; + ZXIC_UINT32 stat_int5_mask_5; + ZXIC_UINT32 stat_int5_mask_4; + ZXIC_UINT32 stat_int5_mask_3; + ZXIC_UINT32 stat_int5_mask_2; + ZXIC_UINT32 stat_int5_mask_1; + ZXIC_UINT32 stat_int5_mask_0; +}DPP_STAT_STAT_CFG_STAT_INT5_STATUS_T; + +typedef struct dpp_stat_stat_cfg_rschd_ecc_bypass_t +{ + ZXIC_UINT32 rschd_ecc_bypass_18; + ZXIC_UINT32 rschd_ecc_bypass_17; + ZXIC_UINT32 rschd_ecc_bypass_16; + ZXIC_UINT32 rschd_ecc_bypass_15; + ZXIC_UINT32 rschd_ecc_bypass_14; + ZXIC_UINT32 rschd_ecc_bypass_13; + ZXIC_UINT32 rschd_ecc_bypass_12; + ZXIC_UINT32 rschd_ecc_bypass_11; + ZXIC_UINT32 rschd_ecc_bypass_10; + ZXIC_UINT32 rschd_ecc_bypass_9; + ZXIC_UINT32 rschd_ecc_bypass_8; + ZXIC_UINT32 rschd_ecc_bypass_7; + ZXIC_UINT32 rschd_ecc_bypass_6; + ZXIC_UINT32 rschd_ecc_bypass_5; + ZXIC_UINT32 rschd_ecc_bypass_4; + ZXIC_UINT32 rschd_ecc_bypass_3; + ZXIC_UINT32 rschd_ecc_bypass_2; + ZXIC_UINT32 rschd_ecc_bypass_1; + ZXIC_UINT32 rschd_ecc_bypass_0; +}DPP_STAT_STAT_CFG_RSCHD_ECC_BYPASS_T; + +typedef struct dpp_stat_stat_cfg_rschd_ecc_single_err_t +{ + ZXIC_UINT32 rschd_ecc_single_err_18; + ZXIC_UINT32 rschd_ecc_single_err_17; + ZXIC_UINT32 rschd_ecc_single_err_16; + ZXIC_UINT32 rschd_ecc_single_err_15; + ZXIC_UINT32 rschd_ecc_single_err_14; + ZXIC_UINT32 rschd_ecc_single_err_13; + ZXIC_UINT32 rschd_ecc_single_err_12; + ZXIC_UINT32 rschd_ecc_single_err_11; + ZXIC_UINT32 rschd_ecc_single_err_10; + ZXIC_UINT32 rschd_ecc_single_err_9; + ZXIC_UINT32 rschd_ecc_single_err_8; + ZXIC_UINT32 rschd_ecc_single_err_7; + ZXIC_UINT32 rschd_ecc_single_err_6; + ZXIC_UINT32 rschd_ecc_single_err_5; + ZXIC_UINT32 rschd_ecc_single_err_4; + ZXIC_UINT32 rschd_ecc_single_err_3; + ZXIC_UINT32 rschd_ecc_single_err_2; + ZXIC_UINT32 rschd_ecc_single_err_1; + ZXIC_UINT32 rschd_ecc_single_err_0; +}DPP_STAT_STAT_CFG_RSCHD_ECC_SINGLE_ERR_T; + +typedef struct dpp_stat_stat_cfg_rschd_ecc_double_err_t +{ + ZXIC_UINT32 rschd_ecc_double_err_18; + ZXIC_UINT32 rschd_ecc_double_err_17; + ZXIC_UINT32 rschd_ecc_double_err_16; + ZXIC_UINT32 rschd_ecc_double_err_15; + ZXIC_UINT32 rschd_ecc_double_err_14; + ZXIC_UINT32 rschd_ecc_double_err_13; + ZXIC_UINT32 rschd_ecc_double_err_12; + ZXIC_UINT32 rschd_ecc_double_err_11; + ZXIC_UINT32 rschd_ecc_double_err_10; + ZXIC_UINT32 rschd_ecc_double_err_9; + ZXIC_UINT32 rschd_ecc_double_err_8; + ZXIC_UINT32 rschd_ecc_double_err_7; + ZXIC_UINT32 rschd_ecc_double_err_6; + ZXIC_UINT32 rschd_ecc_double_err_5; + ZXIC_UINT32 rschd_ecc_double_err_4; + ZXIC_UINT32 rschd_ecc_double_err_3; + ZXIC_UINT32 rschd_ecc_double_err_2; + ZXIC_UINT32 rschd_ecc_double_err_1; + ZXIC_UINT32 rschd_ecc_double_err_0; +}DPP_STAT_STAT_CFG_RSCHD_ECC_DOUBLE_ERR_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_wdat0_t +{ + ZXIC_UINT32 cpu_ind_ddr_wdat0; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_WDAT0_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_wdat1_t +{ + ZXIC_UINT32 cpu_ind_ddr_wdat1; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_WDAT1_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_wdat2_t +{ + ZXIC_UINT32 cpu_ind_ddr_wdat2; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_WDAT2_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_wdat3_t +{ + ZXIC_UINT32 cpu_ind_ddr_wdat3; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_WDAT3_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_wdat4_t +{ + ZXIC_UINT32 cpu_ind_ddr_wdat4; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_WDAT4_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_wdat5_t +{ + ZXIC_UINT32 cpu_ind_ddr_wdat5; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_WDAT5_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_wdat6_t +{ + ZXIC_UINT32 cpu_ind_ddr_wdat6; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_WDAT6_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_wdat7_t +{ + ZXIC_UINT32 cpu_ind_ddr_wdat7; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_WDAT7_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_wdat8_t +{ + ZXIC_UINT32 cpu_ind_ddr_wdat8; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_WDAT8_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_wdat9_t +{ + ZXIC_UINT32 cpu_ind_ddr_wdat9; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_WDAT9_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_wdat10_t +{ + ZXIC_UINT32 cpu_ind_ddr_wdat10; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_WDAT10_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_wdat11_t +{ + ZXIC_UINT32 cpu_ind_ddr_wdat11; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_WDAT11_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_wdat12_t +{ + ZXIC_UINT32 cpu_ind_ddr_wdat12; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_WDAT12_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_wdat13_t +{ + ZXIC_UINT32 cpu_ind_ddr_wdat13; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_WDAT13_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_wdat14_t +{ + ZXIC_UINT32 cpu_ind_ddr_wdat14; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_WDAT14_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_wdat15_t +{ + ZXIC_UINT32 cpu_ind_ddr_wdat15; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_WDAT15_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_req_info_t +{ + ZXIC_UINT32 rw_mode; + ZXIC_UINT32 read_mode; + ZXIC_UINT32 tm_cs; + ZXIC_UINT32 rw_addr; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_REQ_INFO_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_rd_done_t +{ + ZXIC_UINT32 cpu_ind_ddr_rd_done; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_RD_DONE_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_rdat0_t +{ + ZXIC_UINT32 cpu_ind_ddr_rdat0; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_RDAT0_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_rdat1_t +{ + ZXIC_UINT32 cpu_ind_ddr_rdat1; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_RDAT1_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_rdat2_t +{ + ZXIC_UINT32 cpu_ind_ddr_rdat2; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_RDAT2_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_rdat3_t +{ + ZXIC_UINT32 cpu_ind_ddr_rdat3; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_RDAT3_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_rdat4_t +{ + ZXIC_UINT32 cpu_ind_ddr_rdat4; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_RDAT4_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_rdat5_t +{ + ZXIC_UINT32 cpu_ind_ddr_rdat5; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_RDAT5_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_rdat6_t +{ + ZXIC_UINT32 cpu_ind_ddr_rdat6; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_RDAT6_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_rdat7_t +{ + ZXIC_UINT32 cpu_ind_ddr_rdat7; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_RDAT7_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_rdat8_t +{ + ZXIC_UINT32 cpu_ind_ddr_rdat8; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_RDAT8_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_rdat9_t +{ + ZXIC_UINT32 cpu_ind_ddr_rdat9; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_RDAT9_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_rdat10_t +{ + ZXIC_UINT32 cpu_ind_ddr_rdat10; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_RDAT10_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_rdat11_t +{ + ZXIC_UINT32 cpu_ind_ddr_rdat11; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_RDAT11_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_rdat12_t +{ + ZXIC_UINT32 cpu_ind_ddr_rdat12; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_RDAT12_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_rdat13_t +{ + ZXIC_UINT32 cpu_ind_ddr_rdat13; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_RDAT13_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_rdat14_t +{ + ZXIC_UINT32 cpu_ind_ddr_rdat14; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_RDAT14_T; + +typedef struct dpp_stat_stat_cfg_cpu_ind_ddr_rdat15_t +{ + ZXIC_UINT32 cpu_ind_ddr_rdat15; +}DPP_STAT_STAT_CFG_CPU_IND_DDR_RDAT15_T; + +typedef struct dpp_stat_stat_cfg_tm_alu_ddr_cpu_rdy_t +{ + ZXIC_UINT32 tm_alu_ddr_cpu_rdy; +}DPP_STAT_STAT_CFG_TM_ALU_DDR_CPU_RDY_T; + +typedef struct dpp_stat_stat_cfg_ept_flag_t +{ + ZXIC_UINT32 ept_flag; +}DPP_STAT_STAT_CFG_EPT_FLAG_T; + +typedef struct dpp_stat_stat_cfg_ppu_soft_rst_t +{ + ZXIC_UINT32 ppu_soft_rst; +}DPP_STAT_STAT_CFG_PPU_SOFT_RST_T; + +typedef struct dpp_stat_stat_cfg_stat_smmu0_fc15_0_cnt_t +{ + ZXIC_UINT32 stat_smmu0_fc15_0_cnt; +}DPP_STAT_STAT_CFG_STAT_SMMU0_FC15_0_CNT_T; + +typedef struct dpp_stat_stat_cfg_smmu0_stat_fc15_0_cnt_t +{ + ZXIC_UINT32 smmu0_stat_fc15_0_cnt; +}DPP_STAT_STAT_CFG_SMMU0_STAT_FC15_0_CNT_T; + +typedef struct dpp_stat_stat_cfg_smmu0_stat_rsp15_0_cnt_t +{ + ZXIC_UINT32 smmu0_stat_rsp15_0_cnt; +}DPP_STAT_STAT_CFG_SMMU0_STAT_RSP15_0_CNT_T; + +typedef struct dpp_stat_stat_cfg_stat_smmu0_req15_0_cnt_t +{ + ZXIC_UINT32 stat_smmu0_req15_0_cnt; +}DPP_STAT_STAT_CFG_STAT_SMMU0_REQ15_0_CNT_T; + +typedef struct dpp_stat_stat_cfg_ppu_stat_mec5_0_rsp_fc_cnt_t +{ + ZXIC_UINT32 ppu_stat_mec5_0_rsp_fc_cnt; +}DPP_STAT_STAT_CFG_PPU_STAT_MEC5_0_RSP_FC_CNT_T; + +typedef struct dpp_stat_stat_cfg_stat_ppu_mec5_0_key_fc_cnt_t +{ + ZXIC_UINT32 stat_ppu_mec5_0_key_fc_cnt; +}DPP_STAT_STAT_CFG_STAT_PPU_MEC5_0_KEY_FC_CNT_T; + +typedef struct dpp_stat_stat_cfg_stat_ppu_mec5_0_rsp_cnt_t +{ + ZXIC_UINT32 stat_ppu_mec5_0_rsp_cnt; +}DPP_STAT_STAT_CFG_STAT_PPU_MEC5_0_RSP_CNT_T; + +typedef struct dpp_stat_stat_cfg_ppu_stat_mec5_0_key_cnt_t +{ + ZXIC_UINT32 ppu_stat_mec5_0_key_cnt; +}DPP_STAT_STAT_CFG_PPU_STAT_MEC5_0_KEY_CNT_T; + +typedef struct dpp_stat_stat_cfg_ppu5_0_no_exist_opcd_ex_cnt_t +{ + ZXIC_UINT32 ppu5_0_no_exist_opcd_ex_cnt; +}DPP_STAT_STAT_CFG_PPU5_0_NO_EXIST_OPCD_EX_CNT_T; + +typedef struct dpp_stat_stat_cfg_se_etm_stat_wr_fc_cnt_t +{ + ZXIC_UINT32 se_etm_stat_wr_fc_cnt; +}DPP_STAT_STAT_CFG_SE_ETM_STAT_WR_FC_CNT_T; + +typedef struct dpp_stat_stat_cfg_se_etm_stat_rd_fc_cnt_t +{ + ZXIC_UINT32 se_etm_stat_rd_fc_cnt; +}DPP_STAT_STAT_CFG_SE_ETM_STAT_RD_FC_CNT_T; + +typedef struct dpp_stat_stat_cfg_stat_etm_deq_fc_cnt_t +{ + ZXIC_UINT32 stat_etm_deq_fc_cnt; +}DPP_STAT_STAT_CFG_STAT_ETM_DEQ_FC_CNT_T; + +typedef struct dpp_stat_stat_cfg_stat_etm_enq_fc_cnt_t +{ + ZXIC_UINT32 stat_etm_enq_fc_cnt; +}DPP_STAT_STAT_CFG_STAT_ETM_ENQ_FC_CNT_T; + +typedef struct dpp_stat_stat_cfg_stat_oam_lm_fc_cnt_t +{ + ZXIC_UINT32 stat_oam_lm_fc_cnt; +}DPP_STAT_STAT_CFG_STAT_OAM_LM_FC_CNT_T; + +typedef struct dpp_stat_stat_cfg_oam_stat_lm_fc_cnt_t +{ + ZXIC_UINT32 oam_stat_lm_fc_cnt; +}DPP_STAT_STAT_CFG_OAM_STAT_LM_FC_CNT_T; + +typedef struct dpp_stat_stat_cfg_stat_oam_fc_cnt_t +{ + ZXIC_UINT32 stat_oam_fc_cnt; +}DPP_STAT_STAT_CFG_STAT_OAM_FC_CNT_T; + +typedef struct dpp_stat_stat_cfg_cmmu_stat_fc_cnt_t +{ + ZXIC_UINT32 cmmu_stat_fc_cnt; +}DPP_STAT_STAT_CFG_CMMU_STAT_FC_CNT_T; + +typedef struct dpp_stat_stat_cfg_stat_cmmu_req_cnt_t +{ + ZXIC_UINT32 stat_cmmu_req_cnt; +}DPP_STAT_STAT_CFG_STAT_CMMU_REQ_CNT_T; + +typedef struct dpp_stat_stat_cfg_smmu0_plcr_rsp0_cnt_t +{ + ZXIC_UINT32 smmu0_plcr_rsp0_cnt; +}DPP_STAT_STAT_CFG_SMMU0_PLCR_RSP0_CNT_T; + +typedef struct dpp_stat_stat_cfg_plcr_smmu0_req0_cnt_t +{ + ZXIC_UINT32 plcr_smmu0_req0_cnt; +}DPP_STAT_STAT_CFG_PLCR_SMMU0_REQ0_CNT_T; + +typedef struct dpp_stat_stat_cfg_stat_oam_lm_rsp_cnt_t +{ + ZXIC_UINT32 stat_oam_lm_rsp_cnt; +}DPP_STAT_STAT_CFG_STAT_OAM_LM_RSP_CNT_T; + +typedef struct dpp_stat_stat_cfg_oam_stat_lm_req_cnt_t +{ + ZXIC_UINT32 oam_stat_lm_req_cnt; +}DPP_STAT_STAT_CFG_OAM_STAT_LM_REQ_CNT_T; + +typedef struct dpp_stat_stat_cfg_oam_stat_req_cnt_t +{ + ZXIC_UINT32 oam_stat_req_cnt; +}DPP_STAT_STAT_CFG_OAM_STAT_REQ_CNT_T; + +typedef struct dpp_stat_stat_cfg_se_etm_stat_rsp_cnt_t +{ + ZXIC_UINT32 se_etm_stat_rsp_cnt; +}DPP_STAT_STAT_CFG_SE_ETM_STAT_RSP_CNT_T; + +typedef struct dpp_stat_stat_cfg_etm_stat_se_wr_req_cnt_t +{ + ZXIC_UINT32 etm_stat_se_wr_req_cnt; +}DPP_STAT_STAT_CFG_ETM_STAT_SE_WR_REQ_CNT_T; + +typedef struct dpp_stat_stat_cfg_etm_stat_se_rd_req_cnt_t +{ + ZXIC_UINT32 etm_stat_se_rd_req_cnt; +}DPP_STAT_STAT_CFG_ETM_STAT_SE_RD_REQ_CNT_T; + +typedef struct dpp_stat_stat_cfg_etm_stat_smmu0_req_cnt0_t +{ + ZXIC_UINT32 etm_stat_smmu0_req_cnt0; +}DPP_STAT_STAT_CFG_ETM_STAT_SMMU0_REQ_CNT0_T; + +typedef struct dpp_stat_stat_cfg_etm_stat_smmu0_req_cnt1_t +{ + ZXIC_UINT32 etm_stat_smmu0_req_cnt1; +}DPP_STAT_STAT_CFG_ETM_STAT_SMMU0_REQ_CNT1_T; + +typedef struct dpp_stat_stat_cfg_tm_stat_eram_cpu_rsp_cnt_t +{ + ZXIC_UINT32 tm_stat_eram_cpu_rsp_cnt; +}DPP_STAT_STAT_CFG_TM_STAT_ERAM_CPU_RSP_CNT_T; + +typedef struct dpp_stat_stat_cfg_cpu_rd_eram_req_cnt_t +{ + ZXIC_UINT32 cpu_rd_eram_req_cnt; +}DPP_STAT_STAT_CFG_CPU_RD_ERAM_REQ_CNT_T; + +typedef struct dpp_stat_stat_cfg_cpu_wr_eram_req_cnt_t +{ + ZXIC_UINT32 cpu_wr_eram_req_cnt; +}DPP_STAT_STAT_CFG_CPU_WR_ERAM_REQ_CNT_T; + +typedef struct dpp_stat_stat_cfg_tm_stat_ddr_cpu_rsp_cnt_t +{ + ZXIC_UINT32 tm_stat_ddr_cpu_rsp_cnt; +}DPP_STAT_STAT_CFG_TM_STAT_DDR_CPU_RSP_CNT_T; + +typedef struct dpp_stat_stat_cfg_cpu_rd_ddr_req_cnt_t +{ + ZXIC_UINT32 cpu_rd_ddr_req_cnt; +}DPP_STAT_STAT_CFG_CPU_RD_DDR_REQ_CNT_T; + +typedef struct dpp_stat_stat_cfg_cpu_wr_ddr_req_cnt_t +{ + ZXIC_UINT32 cpu_wr_ddr_req_cnt; +}DPP_STAT_STAT_CFG_CPU_WR_DDR_REQ_CNT_T; + +typedef struct dpp_stat_etcam_cpu_ind_wdat1_t +{ + ZXIC_UINT32 wdat1; +}DPP_STAT_ETCAM_CPU_IND_WDAT1_T; + +typedef struct dpp_stat_etcam_cpu_ind_wdat2_t +{ + ZXIC_UINT32 wdat2; +}DPP_STAT_ETCAM_CPU_IND_WDAT2_T; + +typedef struct dpp_stat_etcam_cpu_ind_wdat3_t +{ + ZXIC_UINT32 wdat3; +}DPP_STAT_ETCAM_CPU_IND_WDAT3_T; + +typedef struct dpp_stat_etcam_cpu_ind_wdat4_t +{ + ZXIC_UINT32 wdat4; +}DPP_STAT_ETCAM_CPU_IND_WDAT4_T; + +typedef struct dpp_stat_etcam_cpu_ind_wdat5_t +{ + ZXIC_UINT32 wdat5; +}DPP_STAT_ETCAM_CPU_IND_WDAT5_T; + +typedef struct dpp_stat_etcam_cpu_ind_wdat6_t +{ + ZXIC_UINT32 wdat6; +}DPP_STAT_ETCAM_CPU_IND_WDAT6_T; + +typedef struct dpp_stat_etcam_cpu_ind_wdat7_t +{ + ZXIC_UINT32 wdat7; +}DPP_STAT_ETCAM_CPU_IND_WDAT7_T; + +typedef struct dpp_stat_etcam_cpu_ind_wdat8_t +{ + ZXIC_UINT32 wdat8; +}DPP_STAT_ETCAM_CPU_IND_WDAT8_T; + +typedef struct dpp_stat_etcam_cpu_ind_wdat9_t +{ + ZXIC_UINT32 wdat9; +}DPP_STAT_ETCAM_CPU_IND_WDAT9_T; + +typedef struct dpp_stat_etcam_cpu_ind_wdat10_t +{ + ZXIC_UINT32 wdat10; +}DPP_STAT_ETCAM_CPU_IND_WDAT10_T; + +typedef struct dpp_stat_etcam_cpu_ind_wdat11_t +{ + ZXIC_UINT32 wdat11; +}DPP_STAT_ETCAM_CPU_IND_WDAT11_T; + +typedef struct dpp_stat_etcam_cpu_ind_wdat12_t +{ + ZXIC_UINT32 wdat12; +}DPP_STAT_ETCAM_CPU_IND_WDAT12_T; + +typedef struct dpp_stat_etcam_cpu_ind_wdat13_t +{ + ZXIC_UINT32 wdat13; +}DPP_STAT_ETCAM_CPU_IND_WDAT13_T; + +typedef struct dpp_stat_etcam_cpu_ind_wdat14_t +{ + ZXIC_UINT32 wdat14; +}DPP_STAT_ETCAM_CPU_IND_WDAT14_T; + +typedef struct dpp_stat_etcam_cpu_ind_wdat15_t +{ + ZXIC_UINT32 wdat15; +}DPP_STAT_ETCAM_CPU_IND_WDAT15_T; + +typedef struct dpp_stat_etcam_cpu_ind_wdat16_t +{ + ZXIC_UINT32 wdat16; +}DPP_STAT_ETCAM_CPU_IND_WDAT16_T; + +typedef struct dpp_stat_etcam_cpu_ind_wdat17_t +{ + ZXIC_UINT32 wdat17; +}DPP_STAT_ETCAM_CPU_IND_WDAT17_T; + +typedef struct dpp_stat_etcam_cpu_ind_wdat18_t +{ + ZXIC_UINT32 wdat18; +}DPP_STAT_ETCAM_CPU_IND_WDAT18_T; + +typedef struct dpp_stat_etcam_cpu_ind_wdat19_t +{ + ZXIC_UINT32 wdat19; +}DPP_STAT_ETCAM_CPU_IND_WDAT19_T; + +typedef struct dpp_stat_etcam_t_strwc_cfg_t +{ + ZXIC_UINT32 t_strwc_cfg; +}DPP_STAT_ETCAM_T_STRWC_CFG_T; + +typedef struct dpp_stat_etcam_etcam_int_unmask_flag_t +{ + ZXIC_UINT32 etcam_int_unmask_flag; +}DPP_STAT_ETCAM_ETCAM_INT_UNMASK_FLAG_T; + +typedef struct dpp_stat_etcam_etcam_int_en0_t +{ + ZXIC_UINT32 etcam_int_en17; + ZXIC_UINT32 etcam_int_en16; + ZXIC_UINT32 etcam_int_en15; + ZXIC_UINT32 etcam_int_en14; + ZXIC_UINT32 etcam_int_en13; + ZXIC_UINT32 etcam_int_en12; + ZXIC_UINT32 etcam_int_en11; + ZXIC_UINT32 etcam_int_en10; + ZXIC_UINT32 etcam_int_en9; + ZXIC_UINT32 etcam_int_en8; + ZXIC_UINT32 etcam_int_en7; + ZXIC_UINT32 etcam_int_en6; + ZXIC_UINT32 etcam_int_en5; + ZXIC_UINT32 etcam_int_en4; + ZXIC_UINT32 etcam_int_en3; + ZXIC_UINT32 etcam_int_en2; + ZXIC_UINT32 etcam_int_en1; + ZXIC_UINT32 etcam_int_en0; +}DPP_STAT_ETCAM_ETCAM_INT_EN0_T; + +typedef struct dpp_stat_etcam_etcam_int_mask0_t +{ + ZXIC_UINT32 etcam_int_mask17; + ZXIC_UINT32 etcam_int_mask16; + ZXIC_UINT32 etcam_int_mask15; + ZXIC_UINT32 etcam_int_mask14; + ZXIC_UINT32 etcam_int_mask13; + ZXIC_UINT32 etcam_int_mask12; + ZXIC_UINT32 etcam_int_mask11; + ZXIC_UINT32 etcam_int_mask10; + ZXIC_UINT32 etcam_int_mask9; + ZXIC_UINT32 etcam_int_mask8; + ZXIC_UINT32 etcam_int_mask7; + ZXIC_UINT32 etcam_int_mask6; + ZXIC_UINT32 etcam_int_mask5; + ZXIC_UINT32 etcam_int_mask4; + ZXIC_UINT32 etcam_int_mask3; + ZXIC_UINT32 etcam_int_mask2; + ZXIC_UINT32 etcam_int_mask1; + ZXIC_UINT32 etcam_int_mask0; +}DPP_STAT_ETCAM_ETCAM_INT_MASK0_T; + +typedef struct dpp_stat_etcam_etcam_int_status_t +{ + ZXIC_UINT32 etcam_int_status17; + ZXIC_UINT32 etcam_int_status16; + ZXIC_UINT32 etcam_int_status15; + ZXIC_UINT32 etcam_int_status14; + ZXIC_UINT32 etcam_int_status13; + ZXIC_UINT32 etcam_int_status12; + ZXIC_UINT32 etcam_int_status11; + ZXIC_UINT32 etcam_int_status10; + ZXIC_UINT32 etcam_int_status9; + ZXIC_UINT32 etcam_int_status8; + ZXIC_UINT32 etcam_int_status7; + ZXIC_UINT32 etcam_int_status6; + ZXIC_UINT32 etcam_int_status5; + ZXIC_UINT32 etcam_int_status4; + ZXIC_UINT32 etcam_int_status3; + ZXIC_UINT32 etcam_int_status2; + ZXIC_UINT32 etcam_int_status1; + ZXIC_UINT32 etcam_int_status0; +}DPP_STAT_ETCAM_ETCAM_INT_STATUS_T; + +typedef struct dpp_stat_etcam_int_tb_ini_ok_t +{ + ZXIC_UINT32 int_tb_ini_ok; +}DPP_STAT_ETCAM_INT_TB_INI_OK_T; + +typedef struct dpp_stat_etcam_etcam_clk_en_t +{ + ZXIC_UINT32 etcam_clk_en; +}DPP_STAT_ETCAM_ETCAM_CLK_EN_T; + +typedef struct dpp_stat_etcam_as_etcam_req0_cnt_t +{ + ZXIC_UINT32 as_etcam_req0_cnt; +}DPP_STAT_ETCAM_AS_ETCAM_REQ0_CNT_T; + +typedef struct dpp_stat_etcam_as_etcam_req1_cnt_t +{ + ZXIC_UINT32 as_etcam_req1_cnt; +}DPP_STAT_ETCAM_AS_ETCAM_REQ1_CNT_T; + +typedef struct dpp_stat_etcam_etcam_as_index0_cnt_t +{ + ZXIC_UINT32 etcam_as_index0_cnt; +}DPP_STAT_ETCAM_ETCAM_AS_INDEX0_CNT_T; + +typedef struct dpp_stat_etcam_etcam_as_index1_cnt_t +{ + ZXIC_UINT32 etcam_as_index1_cnt; +}DPP_STAT_ETCAM_ETCAM_AS_INDEX1_CNT_T; + +typedef struct dpp_stat_etcam_etcam_not_hit0_cnt_t +{ + ZXIC_UINT32 etcam_not_hit0_cnt; +}DPP_STAT_ETCAM_ETCAM_NOT_HIT0_CNT_T; + +typedef struct dpp_stat_etcam_etcam_not_hit1_cnt_t +{ + ZXIC_UINT32 etcam_not_hit1_cnt; +}DPP_STAT_ETCAM_ETCAM_NOT_HIT1_CNT_T; + +typedef struct dpp_stat_etcam_table_id_not_match_cnt_t +{ + ZXIC_UINT32 table_id_not_match_cnt; +}DPP_STAT_ETCAM_TABLE_ID_NOT_MATCH_CNT_T; + +typedef struct dpp_stat_etcam_table_id_clash01_cnt_t +{ + ZXIC_UINT32 table_id_clash01_cnt; +}DPP_STAT_ETCAM_TABLE_ID_CLASH01_CNT_T; + +typedef struct dpp_stat_etcam_etcam_cpu_fl_t +{ + ZXIC_UINT32 etcam_cpu_fl; +}DPP_STAT_ETCAM_ETCAM_CPU_FL_T; + +typedef struct dpp_stat_etcam_etcam_arb_empty_t +{ + ZXIC_UINT32 etcam_arb_empty; +}DPP_STAT_ETCAM_ETCAM_ARB_EMPTY_T; + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_trpg_reg.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_trpg_reg.h new file mode 100644 index 0000000..aaed025 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_trpg_reg.h @@ -0,0 +1,344 @@ + +#ifndef _DPP_TRPG_REG_H_ +#define _DPP_TRPG_REG_H_ + +#ifdef __cplusplus +extern "C"{ +#endif + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpg_ms_en_t +{ + ZXIC_UINT32 cpu_trpgrx_ms_en; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPG_MS_EN_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpg_port_en_t +{ + ZXIC_UINT32 cpu_trpgrx_port_en; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPG_PORT_EN_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpg_look_en_t +{ + ZXIC_UINT32 cpu_trpgrx_look_en; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPG_LOOK_EN_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpgrx_ram_almost_full_t +{ + ZXIC_UINT32 cpu_trpgrx_ram_almost_full; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPGRX_RAM_ALMOST_FULL_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpgrx_ram_test_en_t +{ + ZXIC_UINT32 cpu_trpgrx_ram_test_en; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPGRX_RAM_TEST_EN_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpgrx_inmod_pfc_rdy_en_t +{ + ZXIC_UINT32 cpu_trpgrx_inmod_pfc_rdy_en; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPGRX_INMOD_PFC_RDY_EN_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpgrx_pkt_num_h_t +{ + ZXIC_UINT32 cpu_trpgrx_pkt_num_h; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_NUM_H_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpgrx_pkt_num_l_t +{ + ZXIC_UINT32 cpu_trpgrx_pkt_num_l; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_NUM_L_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpgrx_pkt_byte_num_h_t +{ + ZXIC_UINT32 cpu_trpgrx_pkt_byte_num_h; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_BYTE_NUM_H_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpgrx_pkt_byte_num_l_t +{ + ZXIC_UINT32 cpu_trpgrx_pkt_byte_num_l; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_BYTE_NUM_L_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpgrx_pkt_cnt_clr_t +{ + ZXIC_UINT32 cpu_trpgrx_pkt_cnt_clr; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_CNT_CLR_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpgrx_fc_clk_freq_t +{ + ZXIC_UINT32 cpu_trpgrx_fc_clk_freq; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPGRX_FC_CLK_FREQ_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpgrx_fc_en_t +{ + ZXIC_UINT32 cpu_trpgrx_fc_en; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPGRX_FC_EN_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpgrx_fc_token_add_num_t +{ + ZXIC_UINT32 cpu_trpgrx_fc_token_add_num; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPGRX_FC_TOKEN_ADD_NUM_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpgrx_fc_token_max_num_t +{ + ZXIC_UINT32 cpu_trpgrx_fc_token_max_num; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPGRX_FC_TOKEN_MAX_NUM_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpgrx_port_state_info_t +{ + ZXIC_UINT32 cpu_trpgrx_port_state_info; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPGRX_PORT_STATE_INFO_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpgrx_ram_past_max_dep_t +{ + ZXIC_UINT32 cpu_trpgrx_ram_past_max_dep; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPGRX_RAM_PAST_MAX_DEP_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpgrx_ram_past_max_dep_clr_t +{ + ZXIC_UINT32 cpu_trpgrx_ram_past_max_dep_clr; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPGRX_RAM_PAST_MAX_DEP_CLR_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpgrx_pkt_past_max_len_t +{ + ZXIC_UINT32 cpu_trpgrx_pkt_past_max_len; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_PAST_MAX_LEN_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpgrx_pkt_past_max_len_clr_t +{ + ZXIC_UINT32 cpu_trpgrx_pkt_past_max_len_clr; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_PAST_MAX_LEN_CLR_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpgrx_pkt_past_min_len_t +{ + ZXIC_UINT32 cpu_trpgrx_pkt_past_min_len; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_PAST_MIN_LEN_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpgrx_pkt_past_min_len_clr_t +{ + ZXIC_UINT32 cpu_trpgrx_pkt_past_min_len_clr; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_PAST_MIN_LEN_CLR_T; + +typedef struct dpp_trpg_trpg_rx_ram_trpg_rx_data_ram_t +{ + ZXIC_UINT32 trpg_rx_data_ram; +}DPP_TRPG_TRPG_RX_RAM_TRPG_RX_DATA_RAM_T; + +typedef struct dpp_trpg_trpg_rx_ram_trpg_rx_info_ram_t +{ + ZXIC_UINT32 trpg_rx_info_ram; +}DPP_TRPG_TRPG_RX_RAM_TRPG_RX_INFO_RAM_T; + +typedef struct dpp_trpg_trpg_tx_port_cpu_trpg_ms_en_t +{ + ZXIC_UINT32 cpu_trpgtx_ms_en; +}DPP_TRPG_TRPG_TX_PORT_CPU_TRPG_MS_EN_T; + +typedef struct dpp_trpg_trpg_tx_port_cpu_trpg_port_en_t +{ + ZXIC_UINT32 cpu_trpgtx_port_en; +}DPP_TRPG_TRPG_TX_PORT_CPU_TRPG_PORT_EN_T; + +typedef struct dpp_trpg_trpg_tx_port_cpu_trpg_look_en_t +{ + ZXIC_UINT32 cpu_trpgtx_look_en; +}DPP_TRPG_TRPG_TX_PORT_CPU_TRPG_LOOK_EN_T; + +typedef struct dpp_trpg_trpg_tx_port_cpu_trpgtx_ram_almost_full_t +{ + ZXIC_UINT32 cpu_trpgtx_ram_almost_full; +}DPP_TRPG_TRPG_TX_PORT_CPU_TRPGTX_RAM_ALMOST_FULL_T; + +typedef struct dpp_trpg_trpg_tx_port_cpu_trpgtx_ram_test_en_t +{ + ZXIC_UINT32 cpu_trpgtx_ram_test_en; +}DPP_TRPG_TRPG_TX_PORT_CPU_TRPGTX_RAM_TEST_EN_T; + +typedef struct dpp_trpg_trpg_tx_port_cpu_trpgtx_pkt_num_h_t +{ + ZXIC_UINT32 cpu_trpgtx_pkt_num_h; +}DPP_TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_NUM_H_T; + +typedef struct dpp_trpg_trpg_tx_port_cpu_trpgtx_pkt_num_l_t +{ + ZXIC_UINT32 cpu_trpgtx_pkt_num_l; +}DPP_TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_NUM_L_T; + +typedef struct dpp_trpg_trpg_tx_port_cpu_trpgtx_pkt_byte_num_h_t +{ + ZXIC_UINT32 cpu_trpgtx_pkt_byte_num_h; +}DPP_TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_BYTE_NUM_H_T; + +typedef struct dpp_trpg_trpg_tx_port_cpu_trpgtx_pkt_byte_num_l_t +{ + ZXIC_UINT32 cpu_trpgtx_pkt_byte_num_l; +}DPP_TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_BYTE_NUM_L_T; + +typedef struct dpp_trpg_trpg_tx_port_cpu_trpgtx_pkt_cnt_clr_t +{ + ZXIC_UINT32 cpu_trpgtx_pkt_cnt_clr; +}DPP_TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_CNT_CLR_T; + +typedef struct dpp_trpg_trpg_tx_port_cpu_trpgtx_fc_clk_freq_t +{ + ZXIC_UINT32 cpu_trpgtx_fc_clk_freq; +}DPP_TRPG_TRPG_TX_PORT_CPU_TRPGTX_FC_CLK_FREQ_T; + +typedef struct dpp_trpg_trpg_tx_port_cpu_trpgtx_fc_en_t +{ + ZXIC_UINT32 cpu_trpgtx_fc_en; +}DPP_TRPG_TRPG_TX_PORT_CPU_TRPGTX_FC_EN_T; + +typedef struct dpp_trpg_trpg_tx_port_cpu_trpgtx_fc_token_add_num_t +{ + ZXIC_UINT32 cpu_trpgtx_fc_token_add_num; +}DPP_TRPG_TRPG_TX_PORT_CPU_TRPGTX_FC_TOKEN_ADD_NUM_T; + +typedef struct dpp_trpg_trpg_tx_port_cpu_trpgtx_fc_token_max_num_t +{ + ZXIC_UINT32 cpu_trpgtx_fc_token_max_num; +}DPP_TRPG_TRPG_TX_PORT_CPU_TRPGTX_FC_TOKEN_MAX_NUM_T; + +typedef struct dpp_trpg_trpg_tx_port_cpu_trpgtx_port_state_info_t +{ + ZXIC_UINT32 cpu_trpgtx_port_state_info; +}DPP_TRPG_TRPG_TX_PORT_CPU_TRPGTX_PORT_STATE_INFO_T; + +typedef struct dpp_trpg_trpg_tx_port_cpu_trpgtx_ram_past_max_dep_t +{ + ZXIC_UINT32 cpu_trpgtx_ram_past_max_dep; +}DPP_TRPG_TRPG_TX_PORT_CPU_TRPGTX_RAM_PAST_MAX_DEP_T; + +typedef struct dpp_trpg_trpg_tx_port_cpu_trpgtx_ram_past_max_dep_clr_t +{ + ZXIC_UINT32 cpu_trpgtx_ram_past_max_dep_clr; +}DPP_TRPG_TRPG_TX_PORT_CPU_TRPGTX_RAM_PAST_MAX_DEP_CLR_T; + +typedef struct dpp_trpg_trpg_tx_port_cpu_trpgtx_pkt_past_max_len_t +{ + ZXIC_UINT32 cpu_trpgtx_pkt_past_max_len; +}DPP_TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_PAST_MAX_LEN_T; + +typedef struct dpp_trpg_trpg_tx_port_cpu_trpgtx_pkt_past_max_len_clr_t +{ + ZXIC_UINT32 cpu_trpgtx_pkt_past_max_len_clr; +}DPP_TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_PAST_MAX_LEN_CLR_T; + +typedef struct dpp_trpg_trpg_tx_port_cpu_trpgtx_pkt_past_min_len_t +{ + ZXIC_UINT32 cpu_trpgtx_pkt_past_min_len; +}DPP_TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_PAST_MIN_LEN_T; + +typedef struct dpp_trpg_trpg_tx_port_cpu_trpgtx_pkt_past_min_len_clr_t +{ + ZXIC_UINT32 cpu_trpgtx_pkt_past_min_len_clr; +}DPP_TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_PAST_MIN_LEN_CLR_T; + +typedef struct dpp_trpg_trpg_tx_etm_port_cpu_trpgtx_etm_ram_almost_full_t +{ + ZXIC_UINT32 cpu_trpgtx_etm_ram_almost_full; +}DPP_TRPG_TRPG_TX_ETM_PORT_CPU_TRPGTX_ETM_RAM_ALMOST_FULL_T; + +typedef struct dpp_trpg_trpg_tx_etm_port_cpu_trpgtx_etm_ram_test_en_t +{ + ZXIC_UINT32 cpu_trpgtx_etm_ram_test_en; +}DPP_TRPG_TRPG_TX_ETM_PORT_CPU_TRPGTX_ETM_RAM_TEST_EN_T; + +typedef struct dpp_trpg_trpg_tx_glb_cpu_todtime_update_int_mask_t +{ + ZXIC_UINT32 cpu_todtime_update_int_mask; +}DPP_TRPG_TRPG_TX_GLB_CPU_TODTIME_UPDATE_INT_MASK_T; + +typedef struct dpp_trpg_trpg_tx_glb_cpu_todtime_update_int_clr_t +{ + ZXIC_UINT32 cpu_todtime_update_int_clr; +}DPP_TRPG_TRPG_TX_GLB_CPU_TODTIME_UPDATE_INT_CLR_T; + +typedef struct dpp_trpg_trpg_tx_glb_cpu_todtime_ram_test_en_t +{ + ZXIC_UINT32 cpu_todtime_ram_test_en; +}DPP_TRPG_TRPG_TX_GLB_CPU_TODTIME_RAM_TEST_EN_T; + +typedef struct dpp_trpg_trpg_tx_ram_trpg_tx_data_ram_t +{ + ZXIC_UINT32 trpg_tx_data_ram; +}DPP_TRPG_TRPG_TX_RAM_TRPG_TX_DATA_RAM_T; + +typedef struct dpp_trpg_trpg_tx_ram_trpg_tx_info_ram_t +{ + ZXIC_UINT32 trpg_tx_info_ram; +}DPP_TRPG_TRPG_TX_RAM_TRPG_TX_INFO_RAM_T; + +typedef struct dpp_trpg_trpg_tx_etm_ram_trpg_tx_etm_data_ram_t +{ + ZXIC_UINT32 trpg_tx_etm_data_ram; +}DPP_TRPG_TRPG_TX_ETM_RAM_TRPG_TX_ETM_DATA_RAM_T; + +typedef struct dpp_trpg_trpg_tx_etm_ram_trpg_tx_etm_info_ram_t +{ + ZXIC_UINT32 trpg_tx_etm_info_ram; +}DPP_TRPG_TRPG_TX_ETM_RAM_TRPG_TX_ETM_INFO_RAM_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpg_ms_st_t +{ + ZXIC_UINT32 cpu_trpgrx_ms_st; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPG_MS_ST_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpg_ms_ind_t +{ + ZXIC_UINT32 cpu_trpgrx_ms_ind; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPG_MS_IND_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpg_ms_slave_ind_t +{ + ZXIC_UINT32 cpu_trpgrx_ms_slave_ind; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPG_MS_SLAVE_IND_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpgrx_up_water_level_t +{ + ZXIC_UINT32 cpu_trpgrx_up_water_level; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPGRX_UP_WATER_LEVEL_T; + +typedef struct dpp_trpg_trpg_rx_port_cpu_trpgrx_low_water_level_t +{ + ZXIC_UINT32 cpu_trpgrx_low_water_level; +}DPP_TRPG_TRPG_RX_PORT_CPU_TRPGRX_LOW_WATER_LEVEL_T; + +typedef struct dpp_trpg_trpg_tx_port_cpu_trpg_ms_st_t +{ + ZXIC_UINT32 cpu_trpgtx_ms_st; +}DPP_TRPG_TRPG_TX_PORT_CPU_TRPG_MS_ST_T; + +typedef struct dpp_trpg_trpg_tx_port_cpu_trpg_ms_ind_t +{ + ZXIC_UINT32 cpu_trpgtx_ms_ind; +}DPP_TRPG_TRPG_TX_PORT_CPU_TRPG_MS_IND_T; + +typedef struct dpp_trpg_trpg_tx_port_cpu_trpg_ms_slave_ind_t +{ + ZXIC_UINT32 cpu_trpgtx_ms_slave_ind; +}DPP_TRPG_TRPG_TX_PORT_CPU_TRPG_MS_SLAVE_IND_T; + +typedef struct dpp_trpg_trpg_tx_glb_cpu_todtime_update_int_event_t +{ + ZXIC_UINT32 cpu_todtime_update_int_event; +}DPP_TRPG_TRPG_TX_GLB_CPU_TODTIME_UPDATE_INT_EVENT_T; + +typedef struct dpp_trpg_trpg_tx_glb_cpu_todtime_update_int_test_t +{ + ZXIC_UINT32 cpu_todtime_update_int_test; +}DPP_TRPG_TRPG_TX_GLB_CPU_TODTIME_UPDATE_INT_TEST_T; + +typedef struct dpp_trpg_trpg_tx_glb_cpu_todtime_update_int_addr_t +{ + ZXIC_UINT32 cpu_todtime_update_int_addr; +}DPP_TRPG_TRPG_TX_GLB_CPU_TODTIME_UPDATE_INT_ADDR_T; + +typedef struct dpp_trpg_trpg_tx_todtime_ram_trpg_tx_todtime_ram_t +{ + ZXIC_UINT32 trpg_tx_todtime_ram; +}DPP_TRPG_TRPG_TX_TODTIME_RAM_TRPG_TX_TODTIME_RAM_T; + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_tsn_reg.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_tsn_reg.h new file mode 100644 index 0000000..2fc6542 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/dev/reg/dpp_tsn_reg.h @@ -0,0 +1,124 @@ + +#ifndef _DPP_TSN_REG_H_ +#define _DPP_TSN_REG_H_ + +#ifdef __cplusplus +extern "C"{ +#endif + +typedef struct dpp_tsn_tsn_port_cfg_tsn_test_reg_t +{ + ZXIC_UINT32 cfg_tsn_test_reg; +}DPP_TSN_TSN_PORT_CFG_TSN_TEST_REG_T; + +typedef struct dpp_tsn_tsn_port_cfg_tsn_port_qbv_enable_t +{ + ZXIC_UINT32 cfg_tsn_port_qbv_enable; +}DPP_TSN_TSN_PORT_CFG_TSN_PORT_QBV_ENABLE_T; + +typedef struct dpp_tsn_tsn_port_cfg_tsn_phy_port_sel_t +{ + ZXIC_UINT32 cfg_tsn_phy_port_sel; +}DPP_TSN_TSN_PORT_CFG_TSN_PHY_PORT_SEL_T; + +typedef struct dpp_tsn_tsn_port_cfg_tsn_port_time_sel_t +{ + ZXIC_UINT32 cfg_tsn_port_time_sel; +}DPP_TSN_TSN_PORT_CFG_TSN_PORT_TIME_SEL_T; + +typedef struct dpp_tsn_tsn_port_cfg_tsn_clk_freq_t +{ + ZXIC_UINT32 en; + ZXIC_UINT32 cfg_tsn_clk_freq; +}DPP_TSN_TSN_PORT_CFG_TSN_CLK_FREQ_T; + +typedef struct dpp_tsn_tsn_port_cfg_tsn_read_ram_n_t +{ + ZXIC_UINT32 cfg_tsn_data; + ZXIC_UINT32 cfg_tsn_read_status; + ZXIC_UINT32 cfg_tsn_read_ram_n; +}DPP_TSN_TSN_PORT_CFG_TSN_READ_RAM_N_T; + +typedef struct dpp_tsn_tsn_port_cfg_tsn_exe_time_t +{ + ZXIC_UINT32 cfg_tsn_exe_time; +}DPP_TSN_TSN_PORT_CFG_TSN_EXE_TIME_T; + +typedef struct dpp_tsn_tsn_port_cfg_tsn_port_itr_shift_t +{ + ZXIC_UINT32 cfg_tsn_port_itr_shift; +}DPP_TSN_TSN_PORT_CFG_TSN_PORT_ITR_SHIFT_T; + +typedef struct dpp_tsn_tsn_port_cfg_tsn_port_base_time_h_t +{ + ZXIC_UINT32 cfg_tsn_port_base_time_h; +}DPP_TSN_TSN_PORT_CFG_TSN_PORT_BASE_TIME_H_T; + +typedef struct dpp_tsn_tsn_port_cfg_tsn_port_base_time_l_t +{ + ZXIC_UINT32 cfg_tsn_port_base_time_l; +}DPP_TSN_TSN_PORT_CFG_TSN_PORT_BASE_TIME_L_T; + +typedef struct dpp_tsn_tsn_port_cfg_tsn_port_cycle_time_h_t +{ + ZXIC_UINT32 cfg_tsn_port_cycle_time_h; +}DPP_TSN_TSN_PORT_CFG_TSN_PORT_CYCLE_TIME_H_T; + +typedef struct dpp_tsn_tsn_port_cfg_tsn_port_cycle_time_l_t +{ + ZXIC_UINT32 cfg_tsn_port_cycle_time_l; +}DPP_TSN_TSN_PORT_CFG_TSN_PORT_CYCLE_TIME_L_T; + +typedef struct dpp_tsn_tsn_port_cfg_tsn_port_guard_band_time_t +{ + ZXIC_UINT32 cfg_tsn_port_guard_band_time; +}DPP_TSN_TSN_PORT_CFG_TSN_PORT_GUARD_BAND_TIME_T; + +typedef struct dpp_tsn_tsn_port_cfg_tsn_port_default_gate_en_t +{ + ZXIC_UINT32 cfg_tsn_port_default_gate_en; +}DPP_TSN_TSN_PORT_CFG_TSN_PORT_DEFAULT_GATE_EN_T; + +typedef struct dpp_tsn_tsn_port_cfg_tsn_port_change_gate_en_t +{ + ZXIC_UINT32 cfg_tsn_port_change_gate_en; +}DPP_TSN_TSN_PORT_CFG_TSN_PORT_CHANGE_GATE_EN_T; + +typedef struct dpp_tsn_tsn_port_cfg_tsn_port_init_finish_t +{ + ZXIC_UINT32 cfg_tsn_port_init_finish; +}DPP_TSN_TSN_PORT_CFG_TSN_PORT_INIT_FINISH_T; + +typedef struct dpp_tsn_tsn_port_cfg_tsn_port_change_en_t +{ + ZXIC_UINT32 cfg_tsn_port_change_en; +}DPP_TSN_TSN_PORT_CFG_TSN_PORT_CHANGE_EN_T; + +typedef struct dpp_tsn_tsn_port_cfg_tsn_port_gcl_num0_t +{ + ZXIC_UINT32 cfg_tsn_port_gcl_num0; +}DPP_TSN_TSN_PORT_CFG_TSN_PORT_GCL_NUM0_T; + +typedef struct dpp_tsn_tsn_port_cfg_tsn_port_gcl_num1_t +{ + ZXIC_UINT32 cfg_tsn_port_gcl_num1; +}DPP_TSN_TSN_PORT_CFG_TSN_PORT_GCL_NUM1_T; + +typedef struct dpp_tsn_tsn_port_cfg_tsn_port_gcl_value0_t +{ + ZXIC_UINT32 cfg_tsn_port_gcl_gate_control0; + ZXIC_UINT32 cfg_tsn_port_gcl_interval_time0; +}DPP_TSN_TSN_PORT_CFG_TSN_PORT_GCL_VALUE0_T; + +typedef struct dpp_tsn_tsn_port_cfg_tsn_port_gcl_value1_t +{ + ZXIC_UINT32 cfg_tsn_port_gcl_gate_control1; + ZXIC_UINT32 cfg_tsn_port_gcl_interval_time1; +}DPP_TSN_TSN_PORT_CFG_TSN_PORT_GCL_VALUE1_T; + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/diag/dpp_se_diag.h b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/diag/dpp_se_diag.h new file mode 100755 index 0000000..b6dd469 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/include/diag/dpp_se_diag.h @@ -0,0 +1,37 @@ +/************************************************************** +* Ȩ (C)2013-2015, ͨѶɷ޹˾ +* ļ : dpp_se_diag.h +* ļʶ : +* ժҪ : +* ˵ : +* ǰ汾 : +* : XXX +* : 2016/01/14 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* ޸ļ¼1: +* ޸: +* : +* : +* ޸: +***************************************************************/ +#ifndef _DPP_SE_DIAG_H_ +#define _DPP_SE_DIAG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum diag_dpp_etcam_no_as_rsp_mode_e +{ + DPP_ETCAM_NO_AS_RSP_MODE_32 = 0, + DPP_ETCAM_NO_AS_RSP_MODE_64 = 1, + DPP_ETCAM_NO_AS_RSP_MODE_128 = 2, +} DPP_DIAG_ETCAM_NO_AS_RSP_MODE_E; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/Kbuild.include new file mode 100644 index 0000000..dd81488 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/Kbuild.include @@ -0,0 +1,4 @@ +cur_dir := en_np/sdk/source/ +subdirs := dev/ +src_files += +include $(foreach subdir, $(subdirs), $(dinghai_root)/$(cur_dir)$(subdir)/Kbuild.include) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/Kbuild.include new file mode 100644 index 0000000..dac9db1 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/Kbuild.include @@ -0,0 +1,4 @@ +cur_dir := en_np/sdk/source/dev/ +subdirs := reg/ module/ chip/ init/ +src_files += +include $(foreach subdir, $(subdirs), $(dinghai_root)/$(cur_dir)$(subdir)/Kbuild.include) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/chip/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/chip/Kbuild.include new file mode 100644 index 0000000..2025bb7 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/chip/Kbuild.include @@ -0,0 +1,2 @@ +cur_dir := en_np/sdk/source/dev/chip/ +src_files += $(addprefix $(cur_dir),$(notdir $(wildcard $(dinghai_root)/$(cur_dir)*.c))) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/chip/dpp_dev.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/chip/dpp_dev.c new file mode 100755 index 0000000..95155dc --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/chip/dpp_dev.c @@ -0,0 +1,1083 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_dev.c +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : 王春雷 +* 完成日期 : 2014/02/10 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: 代码规范性修改 +* 修改日期: 2014/02/10 +* 版 本 号: +* 修 改 人: 丁金凤 +* 修改内容: +***************************************************************/ + +#include "zxic_common.h" +#include "dpp_module.h" +#include "dpp_pci.h" +#include "dpp_dev.h" +#include "dpp_type_api.h" +#include "dh_cmd.h" + +static DPP_DEV_MGR_T g_dev_mgr = {0}; + +#define DPP_DEV_INFO_GET(id) (g_dev_mgr.p_dev_array[id]) + +/***********************************************************/ +/** 初始化设备管理模块 +* @param ZXIC_VOID +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 王春雷 @date 2015/03/06 +************************************************************/ +DPP_STATUS dpp_dev_init(ZXIC_VOID) +{ + if (g_dev_mgr.is_init) + { + ZXIC_COMM_TRACE_ERROR("Dev is already initialized.\n"); + return DPP_OK; + } + + g_dev_mgr.device_num = 0; + g_dev_mgr.is_init = 1; + + return DPP_OK; +} + +/***********************************************************/ +/** +* @return +* @remark 无 +* @see +* @author XXX @date 2014/02/14 +************************************************************/ +DPP_DEV_MGR_T *dpp_dev_mgr_get(ZXIC_VOID) +{ + if (!g_dev_mgr.is_init) + { + ZXIC_COMM_TRACE_ERROR("Error: dev_mgr is not init.\n"); + ZXIC_COMM_ASSERT(0); + return NULL; + } + + return &g_dev_mgr; +} + +/***********************************************************/ +/** 添加新设备实例,并初始化 +* @param dev_id 新增设备的设备号 +* @param dev_type 设备类型,取值参照DPP_DEV_TYPE_E的定义 +* @param access_type 设备访问类型,取值参照DPP_DEV_ACCESS_TYPE_E的定义 +* @param pcie_addr PCIe映射地址 +* @param riscv_addr RISCV映射地址 +* @param dma_vir_addr DMA映射地址 +* @param dma_phy_addr DMA内存物理地址 +* @param p_pcie_write_fun PCIe硬件写回调函数 +* @param p_pcie_read_fun PCIe硬件读回调函数 +* @param p_riscv_write_fun RISCV硬件写回调函数 +* @param p_riscv_read_fun RISCV硬件读回调函数 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 王春雷 @date 2015/03/06 +************************************************************/ +DPP_STATUS dpp_dev_add(ZXIC_UINT32 dev_id, + DPP_DEV_TYPE_E dev_type, + DPP_DEV_ACCESS_TYPE_E access_type, + ZXIC_ADDR_T pcie_addr, + ZXIC_ADDR_T riscv_addr, + ZXIC_ADDR_T dma_vir_addr, + ZXIC_ADDR_T dma_phy_addr, + DPP_DEV_WRITE_FUNC p_pcie_write_fun, + DPP_DEV_READ_FUNC p_pcie_read_fun, + DPP_DEV_WRITE_FUNC p_riscv_write_fun, + DPP_DEV_READ_FUNC p_riscv_read_fun) +{ + DPP_STATUS rtn = DPP_OK; + DPP_DEV_CFG_T *p_dev_info = NULL; + DPP_DEV_MGR_T *p_dev_mgr = NULL; + ZXIC_UINT32 i = 0; + + ZXIC_COMM_CHECK_INDEX_UPPER(dev_id,DPP_DEV_CHANNEL_MAX - 1); + + p_dev_mgr = dpp_dev_mgr_get(); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_dev_mgr); + if (!p_dev_mgr->is_init) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "ErrorCode[ 0x%x]: Device Manager is not init!!!\n", + DPP_RC_DEV_MGR_NOT_INIT); + return DPP_RC_DEV_MGR_NOT_INIT; + } + + if (p_dev_mgr->p_dev_array[dev_id] != NULL) + { + /* device is already exist. */ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "Device is added again!!!\n"); + p_dev_info = p_dev_mgr->p_dev_array[dev_id]; + } + else + { + /* device is new. */ + p_dev_info = (DPP_DEV_CFG_T *)ZXIC_COMM_MALLOC(sizeof(DPP_DEV_CFG_T)); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_dev_info); + p_dev_mgr->p_dev_array[dev_id] = p_dev_info; + p_dev_mgr->device_num++; + } + + p_dev_info->device_id = dev_id; + p_dev_info->dev_type = dev_type; + p_dev_info->access_type = access_type; + p_dev_info->pcie_addr = pcie_addr; + p_dev_info->riscv_addr = riscv_addr; + p_dev_info->dma_vir_addr = dma_vir_addr; + p_dev_info->dma_phy_addr = dma_phy_addr; + p_dev_info->p_riscv_write_fun = NULL; + p_dev_info->p_riscv_read_fun = NULL; + p_dev_info->p_pcie_write_fun = dpp_dev_pcie_default_write; + p_dev_info->p_pcie_read_fun = dpp_dev_pcie_default_read; + + if(p_riscv_write_fun) + { + p_dev_info->p_riscv_write_fun = p_riscv_write_fun; + } + + if(p_riscv_read_fun) + { + p_dev_info->p_riscv_read_fun = p_riscv_read_fun; + } + + if (p_pcie_write_fun) + { + p_dev_info->p_pcie_write_fun = p_pcie_write_fun; + } + + if (p_pcie_read_fun) + { + p_dev_info->p_pcie_read_fun = p_pcie_read_fun; + } + + if (dev_type == DPP_DEV_TYPE_CHIP) + { + p_dev_info->chip_ver = dpp_dev_chip_version_get(dev_id); + } + else if ((dev_type == DPP_DEV_TYPE_SIM) || (dev_type == DPP_DEV_TYPE_VCS)) + { + //p_dev_info->chip_ver = dpp_vpci_get_chip_version(); + } + + ZXIC_COMM_MEMSET(p_dev_info->pcie_channel, 0x00, sizeof(p_dev_info->pcie_channel)); + + rtn = zxic_comm_mutex_create(&p_dev_info->reg_opr_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_create"); + + rtn = zxic_comm_mutex_create(&p_dev_info->oam_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_create"); + + rtn = zxic_comm_mutex_create(&p_dev_info->etm_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_create"); + + rtn = zxic_comm_mutex_create(&p_dev_info->ddr_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_create"); + + rtn = zxic_comm_mutex_create(&p_dev_info->ind_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_create"); + + rtn = zxic_comm_mutex_create(&p_dev_info->etcam_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_create"); + + rtn = zxic_comm_mutex_create(&p_dev_info->car0_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_create"); + + rtn = zxic_comm_mutex_create(&p_dev_info->alg_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_create"); + + rtn = zxic_comm_mutex_create(&p_dev_info->nppu_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_create"); + + rtn = zxic_comm_mutex_create(&p_dev_info->smmu0_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_create"); + + rtn = zxic_comm_mutex_create(&p_dev_info->smmu1_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_create"); + + rtn = zxic_comm_mutex_create(&p_dev_info->etm_2nd_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_create"); + + rtn = zxic_comm_mutex_create(&p_dev_info->lpm_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_create"); + + rtn = zxic_comm_mutex_create(&p_dev_info->crm_temp_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_create"); + + rtn = zxic_comm_mutex_create(&p_dev_info->sim_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_create"); + + rtn = zxic_comm_mutex_create(&p_dev_info->dtb_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_create"); + + for (i = 0; i < DPP_DTB_QUEUE_MAX; i++) + { + rtn = zxic_comm_mutex_create(&p_dev_info->dtb_queue_mutex[i]); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_create"); + } + + return DPP_OK; +} + +/***********************************************************/ +/** 删除设备实例 +* @param dev_id 设备号 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 王春雷 @date 2015/05/20 +************************************************************/ +DPP_STATUS dpp_dev_del(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rtn = DPP_OK; + DPP_DEV_CFG_T *p_dev_info = NULL; + DPP_DEV_MGR_T *p_dev_mgr = NULL; + + ZXIC_COMM_CHECK_INDEX_UPPER(dev_id,DPP_DEV_CHANNEL_MAX - 1); + + p_dev_mgr = dpp_dev_mgr_get(); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_dev_mgr); + p_dev_info = p_dev_mgr->p_dev_array[dev_id]; + + if (p_dev_info != NULL) + { + rtn = zxic_comm_mutex_destroy(&p_dev_info->reg_opr_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_destroy"); + + rtn = zxic_comm_mutex_destroy(&p_dev_info->oam_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_destroy"); + + rtn = zxic_comm_mutex_destroy(&p_dev_info->etm_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_destroy"); + + rtn = zxic_comm_mutex_destroy(&p_dev_info->ddr_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_destroy"); + + rtn = zxic_comm_mutex_destroy(&p_dev_info->ind_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_destroy"); + + rtn = zxic_comm_mutex_destroy(&p_dev_info->etcam_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_destroy"); + + rtn = zxic_comm_mutex_destroy(&p_dev_info->car0_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_destroy"); + + rtn = zxic_comm_mutex_destroy(&p_dev_info->alg_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_destroy"); + + rtn = zxic_comm_mutex_destroy(&p_dev_info->nppu_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_destroy"); + + rtn = zxic_comm_mutex_destroy(&p_dev_info->smmu0_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_destroy"); + + rtn = zxic_comm_mutex_destroy(&p_dev_info->smmu1_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_destroy"); + + rtn = zxic_comm_mutex_destroy(&p_dev_info->etm_2nd_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_destroy"); + + rtn = zxic_comm_mutex_destroy(&p_dev_info->lpm_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_destroy"); + + rtn = zxic_comm_mutex_destroy(&p_dev_info->crm_temp_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "zxic_comm_mutex_destroy"); + + + ZXIC_COMM_FREE(p_dev_info); + p_dev_mgr->p_dev_array[dev_id] = NULL; + ZXIC_COMM_CHECK_DEV_INDEX_SUB_OVERFLOW_NO_ASSERT(dev_id, p_dev_mgr->device_num, 1); + p_dev_mgr->device_num--; + } + + return DPP_OK; +} + +/***********************************************************/ +/** 获取 DPP_DEV_T +* @param dev_id +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 王春雷 @date 2015/05/20 +************************************************************/ +DPP_STATUS dpp_dev_get(ZXIC_UINT32 dev_id, DPP_PF_INFO_T* pf_info, DPP_DEV_T *dev) +{ + ZXIC_UINT16 slot = 0; + ZXIC_UINT16 channel_id = 0; + + DPP_DEV_CFG_T *p_dev_info = NULL; + DPP_DEV_MGR_T *p_dev_mgr = NULL; + + ZXIC_COMM_CHECK_INDEX_UPPER(dev_id, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, pf_info); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, dev); + + slot = pf_info->slot; + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, slot, 0, DPP_PCIE_SLOT_MAX - 1); + + channel_id = DPP_PCIE_CHANNEL_ID(pf_info->vport); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, channel_id, 0, DPP_PCIE_CHANNEL_MAX - 1); + + p_dev_mgr = dpp_dev_mgr_get(); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_dev_mgr); + if (!p_dev_mgr->is_init) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "ErrorCode[ 0x%x]: Device Manager is not init!!!\n", + DPP_RC_DEV_MGR_NOT_INIT); + return DPP_RC_DEV_MGR_NOT_INIT; + } + p_dev_info = p_dev_mgr->p_dev_array[dev_id]; + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_dev_info); + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_dev_info->pcie_channel[slot][channel_id].device); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_dev_info->pcie_channel[slot][channel_id].oper_mutex); + + dev->device_id = p_dev_info->device_id; + dev->pcie_channel.slot = p_dev_info->pcie_channel[slot][channel_id].slot; + dev->pcie_channel.vport = p_dev_info->pcie_channel[slot][channel_id].vport; + dev->pcie_channel.pcie_id = p_dev_info->pcie_channel[slot][channel_id].pcie_id; + dev->pcie_channel.device = p_dev_info->pcie_channel[slot][channel_id].device; + dev->pcie_channel.base_addr = p_dev_info->pcie_channel[slot][channel_id].base_addr; + dev->pcie_channel.offset_addr = p_dev_info->pcie_channel[slot][channel_id].offset_addr; + dev->pcie_channel.oper_mutex = p_dev_info->pcie_channel[slot][channel_id].oper_mutex; + + return DPP_OK; +} + +/***********************************************************/ +/** +* @param dev_id 设备的设备号 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 王春雷 @date 2015/03/06 +************************************************************/ +DPP_STATUS dpp_dev_pcie_channel_add(ZXIC_UINT32 dev_id, DPP_PF_INFO_T* pf_info, struct pci_dev* p_dev) +{ + DPP_STATUS rc = 0; + ZXIC_VOID* base_addr = 0; + ZXIC_UINT8 type = 0; + ZXIC_UINT32 post = 0; + ZXIC_UINT16 pcie_id = 0; + ZXIC_UINT16 slot = 0; + ZXIC_UINT16 channel_id = 0; + DPP_DEV_CFG_T *p_dev_info = NULL; + DPP_DEV_MGR_T *p_dev_mgr = NULL; + +#ifdef DPP_FLOW_HW_INIT + struct bar_offset_res res; + struct bar_offset_params paras; +#endif + + ZXIC_COMM_CHECK_INDEX_UPPER(dev_id, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, pf_info); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_dev); + + slot = pf_info->slot; + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, slot, 0, DPP_PCIE_SLOT_MAX - 1); + + channel_id = DPP_PCIE_CHANNEL_ID(pf_info->vport); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, channel_id, 0, DPP_PCIE_CHANNEL_MAX - 1); + + p_dev_mgr = dpp_dev_mgr_get(); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_dev_mgr); + if (!p_dev_mgr->is_init) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "ErrorCode[ 0x%x]: Device Manager is not init!!!\n", + DPP_RC_DEV_MGR_NOT_INIT); + return DPP_RC_DEV_MGR_NOT_INIT; + } + p_dev_info = p_dev_mgr->p_dev_array[dev_id]; + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_dev_info); + + if (p_dev_info->pcie_channel[slot][channel_id].device != NULL) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "ErrorCode[ 0x%x]: pcie slot %u vport 0x%04x already init.\n", + DPP_RC_DEV_PARA_INVALID, slot, pf_info->vport); + return DPP_RC_DEV_PARA_INVALID; + } + + base_addr = ioremap(pci_resource_start(p_dev, 0), pci_resource_len(p_dev, 0)); + if (IS_ERR_OR_NULL(base_addr)) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "ErrorCode[ 0x%x]: pcie slot %u vport 0x%04x ioremap failed.\n", + DPP_RC_DEV_PARA_INVALID, slot, pf_info->vport); + return DPP_RC_DEV_PARA_INVALID; + } + + for (post = pci_find_capability(p_dev, PCI_CAP_ID_VNDR); + post > 0; post = pci_find_next_capability(p_dev, post, PCI_CAP_ID_VNDR)) + { + pci_read_config_byte(p_dev, post + 3, &type); + + if (type == 5) + { + pci_read_config_word(p_dev, post + 6, &pcie_id); + } + } + + if (pcie_id == 0) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "ErrorCode[ 0x%x]: pcie slot %u vport 0x%04x get pcieid failed.\n", + DPP_RC_DEV_PARA_INVALID, slot, pf_info->vport); + return DPP_RC_DEV_PARA_INVALID; + } + +#ifdef DPP_FLOW_HW_INIT + paras.type = URI_NP; + paras.pcie_id = pcie_id; + paras.virt_addr = ZXIC_COMM_PTR_TO_VAL(base_addr) + DEV_PCIE_MSG_OFFSET_ADDR; + if (zxdh_get_bar_offset(¶s, &res) != BAR_MSG_OK) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "ErrorCode[ 0x%x]: pcie slot %u vport 0x%04x get bar offset failed.\n", + DPP_RC_DEV_PARA_INVALID, slot, pf_info->vport); + return DPP_RC_DEV_PARA_INVALID; + } +#endif + p_dev_info->pcie_channel[slot][channel_id].slot = slot; + p_dev_info->pcie_channel[slot][channel_id].vport = pf_info->vport; + p_dev_info->pcie_channel[slot][channel_id].pcie_id = pcie_id; + p_dev_info->pcie_channel[slot][channel_id].device = p_dev; + p_dev_info->pcie_channel[slot][channel_id].base_addr = ZXIC_COMM_PTR_TO_VAL(base_addr); + +#ifdef DPP_FLOW_HW_INIT + p_dev_info->pcie_channel[slot][channel_id].offset_addr = res.bar_offset; +#else + p_dev_info->pcie_channel[slot][channel_id].offset_addr = 0x6000; +#endif + + p_dev_info->pcie_channel[slot][channel_id].oper_mutex = ZXIC_COMM_MALLOC(sizeof(ZXIC_MUTEX_T)); + rc = zxic_comm_mutex_create(p_dev_info->pcie_channel[slot][channel_id].oper_mutex); + ZXIC_COMM_CHECK_DEV_RC_MEMORY_FREE(dev_id, rc, "zxic_comm_mutex_create", + p_dev_info->pcie_channel[slot][channel_id].oper_mutex); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x base_addr: 0x%llx success.\n", + __FUNCTION__, slot, pf_info->vport, ZXIC_COMM_PTR_TO_VAL(base_addr)); + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x pcie_id: 0x%04x offset_addr: 0x%llx success.\n", + __FUNCTION__, slot, pf_info->vport, pcie_id, + p_dev_info->pcie_channel[slot][channel_id].offset_addr); + + return DPP_OK; +} + +/***********************************************************/ +/** +* @param dev_id 设备的设备号 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 王春雷 @date 2015/03/06 +************************************************************/ +DPP_STATUS dpp_dev_pcie_channel_del(ZXIC_UINT32 dev_id, DPP_PF_INFO_T* pf_info) +{ + DPP_STATUS rc = 0; + ZXIC_UINT16 slot = 0; + ZXIC_UINT16 channel_id = 0; + DPP_DEV_CFG_T *p_dev_info = NULL; + DPP_DEV_MGR_T *p_dev_mgr = NULL; + + ZXIC_COMM_CHECK_INDEX_UPPER(dev_id, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, pf_info); + + slot = pf_info->slot; + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, slot, 0, DPP_PCIE_SLOT_MAX - 1); + + channel_id = DPP_PCIE_CHANNEL_ID(pf_info->vport); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, channel_id, 0, DPP_PCIE_CHANNEL_MAX - 1); + + p_dev_mgr = dpp_dev_mgr_get(); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_dev_mgr); + if (!p_dev_mgr->is_init) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "ErrorCode[ 0x%x]: Device Manager is not init!!!\n", + DPP_RC_DEV_MGR_NOT_INIT); + return DPP_RC_DEV_MGR_NOT_INIT; + } + p_dev_info = p_dev_mgr->p_dev_array[dev_id]; + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_dev_info); + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_dev_info->pcie_channel[slot][channel_id].device); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_dev_info->pcie_channel[slot][channel_id].oper_mutex); + + rc = zxic_comm_mutex_destroy(p_dev_info->pcie_channel[slot][channel_id].oper_mutex); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "zxic_comm_mutex_destroy"); + ZXIC_COMM_FREE(p_dev_info->pcie_channel[slot][channel_id].oper_mutex); + + iounmap((ZXIC_VOID*)p_dev_info->pcie_channel[slot][channel_id].base_addr); + + p_dev_info->pcie_channel[slot][channel_id].device = NULL; + p_dev_info->pcie_channel[slot][channel_id].slot = 0; + p_dev_info->pcie_channel[slot][channel_id].vport = 0; + p_dev_info->pcie_channel[slot][channel_id].pcie_id = 0; + p_dev_info->pcie_channel[slot][channel_id].base_addr = 0; + p_dev_info->pcie_channel[slot][channel_id].offset_addr = 0; + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x success.\n", __FUNCTION__, slot, pf_info->vport); + + return DPP_OK; +} + +/***********************************************************/ +/** 获取设备类型 +* @param dev_id 设备号 +* +* @return 设备类型,参考DPP_DEV_TYPE_E的定义 +* @remark 无 +* @see +* @author 王春雷 @date 2015/03/06 +************************************************************/ +ZXIC_UINT32 dpp_dev_get_dev_type(ZXIC_UINT32 dev_id) +{ + DPP_DEV_MGR_T *p_dev_mgr = NULL; + DPP_DEV_CFG_T *p_dev_info = NULL; + + ZXIC_COMM_CHECK_INDEX_UPPER(dev_id, DPP_DEV_CHANNEL_MAX - 1); + + p_dev_mgr = dpp_dev_mgr_get(); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_dev_mgr); + + p_dev_info = p_dev_mgr->p_dev_array[dev_id]; + + if (NULL == p_dev_info) + { + return DPP_DEV_TYPE_INVALID; + } + + return (p_dev_info->dev_type); +} + +/***********************************************************/ +/** 获取芯片类型 +* @param dev_id +* +* @return +* @remark 无 +* @see +* @author lfq @date 2014/03/05 +************************************************************/ +ZXIC_UINT32 dpp_dev_chip_version_get(ZXIC_UINT32 dev_id) +{ + // ZXIC_UINT32 device_no = 0; + ZXIC_UINT32 chip_ver = 0; + + // ZXIC_COMM_CHECK_INDEX_UPPER(dev_id,DPP_DEV_CHANNEL_MAX - 1); + + // if (device_no == DPP_CHIP_DPP) + // { + // chip_ver = DPP_CHIP_VERSION_DPP_P; + // } + // else + // { + // ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "Device id [0x%08x] is wrong\n", device_no); + // } + + return chip_ver; +} + +/***********************************************************/ +/** 每个模块的初始化标记设置接口 +* @param dev_id 设备号 +* @param module_id 模块ID, 见MODULE_INIT_E +* @param flag 31bit代表整体初始化状态(1:完成 0:未完成或未开始),其余31bit自由利用,可以按子模块的初始化状态赋值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 初始化标记主要用于记录本模块的初始化状态 +* @see +* @author xjw @date 2019/10/30 +************************************************************/ +DPP_STATUS dpp_dev_init_flag_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 module_id, ZXIC_UINT32 flag) +{ + DPP_DEV_CFG_T *p_dev_info = NULL; + DPP_DEV_MGR_T *p_dev_mgr = NULL; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, module_id, MODULE_INIT_NPPU, MODULE_INIT_MAX - 1); + + p_dev_mgr = dpp_dev_mgr_get(); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_dev_mgr); + p_dev_info = p_dev_mgr->p_dev_array[dev_id]; + + if (NULL == p_dev_info) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "ErrorCode[ 0x%x]: Device CFG is not init!!!\n", + DPP_RC_DEV_CFG_NOT_INIT); + return DPP_RC_DEV_CFG_NOT_INIT; + } + + p_dev_info->init_flags[module_id] = flag; + + return DPP_OK; +} + +/***********************************************************/ +/** 每个模块的初始化标记获取接口 +* @param dev_id 设备号 +* @param module_id 模块ID, 见MODULE_INIT_E +* @param p_flag 按ZXIC_UINT32返回,bit处理各模块自行完成 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 初始化标记主要用于记录本模块的初始化状态 +* @see +* @author xjw @date 2019/10/30 +************************************************************/ +DPP_STATUS dpp_dev_init_flag_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 module_id, ZXIC_UINT32 *p_flag) +{ + DPP_DEV_CFG_T *p_dev_info = NULL; + DPP_DEV_MGR_T *p_dev_mgr = NULL; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, module_id, MODULE_INIT_NPPU, MODULE_INIT_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_flag); + + p_dev_mgr = dpp_dev_mgr_get(); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_dev_mgr); + p_dev_info = p_dev_mgr->p_dev_array[dev_id]; + + if (NULL == p_dev_info) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "ErrorCode[ 0x%x]: Device CFG is not init!!!\n", + DPP_RC_DEV_CFG_NOT_INIT); + return DPP_RC_DEV_CFG_NOT_INIT; + } + + *p_flag = p_dev_info->init_flags[module_id]; + + return DPP_OK; +} + +/***********************************************************/ +/** 根据类型获取互斥锁 +* @param dev_id 设备号 +* @param type 互斥锁类型,取值参照DPP_DEV_MUTEX_TYPE_E的定义 +* @param p_mutex_out 返回的互斥锁指针地址 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 王春雷 @date 2015/10/10 +************************************************************/ +DPP_STATUS dpp_dev_opr_mutex_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 type, ZXIC_MUTEX_T **p_mutex_out) +{ + //DPP_STATUS rc = 0; + DPP_DEV_MGR_T *p_dev_mgr = NULL; + DPP_DEV_CFG_T *p_dev_info = NULL; + + ZXIC_COMM_CHECK_INDEX_UPPER(dev_id, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX_UPPER(type, DPP_DEV_MUTEX_T_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_mutex_out); + + p_dev_mgr = dpp_dev_mgr_get(); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_dev_mgr); + p_dev_info = p_dev_mgr->p_dev_array[dev_id]; + + if (NULL == p_dev_info) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "Get dev_info[ %d ] fail!\n", dev_id); + return DPP_DEV_TYPE_INVALID; + } + + switch (type) + { + case DPP_DEV_MUTEX_T_REG: + { + *p_mutex_out = &(p_dev_info->reg_opr_mutex); + } + break; + + case DPP_DEV_MUTEX_T_OAM: + { + *p_mutex_out = &(p_dev_info->oam_mutex); + } + break; + + case DPP_DEV_MUTEX_T_ETM: + { + *p_mutex_out = &(p_dev_info->etm_mutex); + } + break; + + case DPP_DEV_MUTEX_T_DDR: + { + *p_mutex_out = &(p_dev_info->ddr_mutex); + } + break; + + case DPP_DEV_MUTEX_T_IND: + { + *p_mutex_out = &(p_dev_info->ind_mutex); + } + break; + + case DPP_DEV_MUTEX_T_ETCAM: + { + *p_mutex_out = &(p_dev_info->etcam_mutex); + } + break; + + case DPP_DEV_MUTEX_T_CAR0: + { + *p_mutex_out = &(p_dev_info->car0_mutex); + } + break; + + case DPP_DEV_MUTEX_T_ALG: + { + *p_mutex_out = &(p_dev_info->alg_mutex); + } + break; + + case DPP_DEV_MUTEX_T_NPPU: + { + *p_mutex_out = &(p_dev_info->nppu_mutex); + } + break; + + case DPP_DEV_MUTEX_T_SMMU0: + { + *p_mutex_out = &(p_dev_info->smmu0_mutex); + } + break; + + case DPP_DEV_MUTEX_T_SMMU1: + { + *p_mutex_out = &(p_dev_info->smmu1_mutex); + } + break; + + case DPP_DEV_MUTEX_T_ETM_2ND: + { + *p_mutex_out = &(p_dev_info->etm_2nd_mutex); + } + break; + + case DPP_DEV_MUTEX_T_LPM: + { + *p_mutex_out = &(p_dev_info->lpm_mutex); + } + break; + + case DPP_DEV_MUTEX_T_CRM_TEMP: + { + *p_mutex_out = &(p_dev_info->crm_temp_mutex); + } + break; + + case DPP_DEV_MUTEX_T_SIM: + { + *p_mutex_out = &(p_dev_info->sim_mutex); + } + break; + + case DPP_DEV_MUTEX_T_DTB: + { + *p_mutex_out = &(p_dev_info->dtb_mutex); + } + break; + + default: + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "mutex type is invalid!\n"); + return DPP_ERR; + } + } + + return DPP_OK; +} + +/***********************************************************/ +/** 根据index获取dtb对应队列的互斥锁 +* @param dev_id 设备号 +* @param type 互斥锁类型,取值参照DPP_DEV_MUTEX_TYPE_E的定义 +* @param p_mutex_out 返回的互斥锁指针地址 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 王春雷 @date 2015/10/10 +************************************************************/ +DPP_STATUS dpp_dev_dtb_opr_mutex_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 type, ZXIC_UINT32 index, ZXIC_MUTEX_T **p_mutex_out) +{ + //DPP_STATUS rc = 0; + DPP_DEV_MGR_T *p_dev_mgr = NULL; + DPP_DEV_CFG_T *p_dev_info = NULL; + + ZXIC_COMM_CHECK_INDEX_UPPER(dev_id, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX_UPPER(type, DPP_DEV_MUTEX_T_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_mutex_out); + + p_dev_mgr = dpp_dev_mgr_get(); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_dev_mgr); + p_dev_info = p_dev_mgr->p_dev_array[dev_id]; + + if (NULL == p_dev_info) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "Get dev_info[ %d ] fail!\n", dev_id); + return DPP_DEV_TYPE_INVALID; + } + + switch (type) + { + case DPP_DEV_MUTEX_T_DTB: + { + *p_mutex_out = &(p_dev_info->dtb_queue_mutex[index]); + } + break; + + default: + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "mutex type is invalid!\n"); + return DPP_ERR; + } + } + + return DPP_OK; +} + +/***********************************************************/ +/** PCIE 默认读接口 +* @param dev_id +* @param addr +* @param size +* @param p_data +* +* @return +* @remark 无 +* @see +* @author XXX @date 2018/05/02 +************************************************************/ +DPP_STATUS dpp_dev_pcie_default_write(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 size, ZXIC_UINT32 *p_data) +{ + DPP_STATUS rc = 0; + ZXIC_UINT32 i; + ZXIC_ADDR_T abs_addr = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data); + + abs_addr = DEV_PCIE_REG_ADDR(dev); + +#ifdef MACRO_CPU64 + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_64_NO_ASSERT(DEV_ID(dev), abs_addr, (ZXIC_ADDR_T)addr); +#else + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(DEV_ID(dev), abs_addr, (ZXIC_ADDR_T)addr); +#endif + +#ifdef DPP_FOR_AARCH64 + addr = addr - (SYS_NP_BASE_ADDR1 - DEV_PCIE_OFFSET_ADDR(dev)); + addr = X86_ADDR_2_ARRCH64(addr); + addr = addr + (SYS_NP_BASE_ADDR1 - DEV_PCIE_OFFSET_ADDR(dev)); +#endif + + abs_addr += addr; + ZXIC_COMM_TRACE_DEBUG("dpp_dev_pcie_default_write: write abs_addr:0x%llx\n", abs_addr); + + for (i = 0; i < size; i++) + { + +#ifdef MACRO_CPU64 + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_64_NO_ASSERT(DEV_ID(dev), abs_addr, (ZXIC_ADDR_T)(4 * ((ZXIC_ADDR_T)(i)))); +#else + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(DEV_ID(dev), abs_addr, (ZXIC_ADDR_T)(4 * ((ZXIC_ADDR_T)(i)))); +#endif + + rc = dpp_pci_write32(dev, abs_addr + (ZXIC_ADDR_T)(4 * ((ZXIC_ADDR_T)(i))), p_data + i); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_pci_write32"); + ZXIC_COMM_TRACE_DEBUG("dpp_dev_pcie_default_write: write Addr:0x%llx ,Value 0x%x\n", (abs_addr + (ZXIC_ADDR_T)(4 * ((ZXIC_ADDR_T)(i)))), *(p_data + i)); + } + + return DPP_OK; +} + +/***********************************************************/ +/** PCIE 默认写接口 +* @param dev_id +* @param addr +* @param size +* @param p_data +* +* @return +* @remark 无 +* @see +* @author XXX @date 2018/05/02 +************************************************************/ +DPP_STATUS dpp_dev_pcie_default_read(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 size, ZXIC_UINT32 *p_data) +{ + DPP_STATUS rc = 0; + ZXIC_UINT32 i; + ZXIC_ADDR_T abs_addr = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data); + + abs_addr = DEV_PCIE_REG_ADDR(dev); + +#ifdef MACRO_CPU64 + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_64_NO_ASSERT(DEV_ID(dev), abs_addr, (ZXIC_ADDR_T)(addr)); +#else + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(DEV_ID(dev), abs_addr, (ZXIC_ADDR_T)(addr)); +#endif + +#ifdef DPP_FOR_AARCH64 + addr = addr - (SYS_NP_BASE_ADDR1 - DEV_PCIE_OFFSET_ADDR(dev)); + addr = X86_ADDR_2_ARRCH64(addr); + addr = addr + (SYS_NP_BASE_ADDR1 - DEV_PCIE_OFFSET_ADDR(dev)); +#endif + + abs_addr += addr; + + for (i = 0; i < size; i++) + { + rc = dpp_pci_read32(dev, abs_addr + (ZXIC_ADDR_T)(4 * ((ZXIC_ADDR_T)(i))), p_data + i); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_pci_read32"); + + ZXIC_COMM_TRACE_DEBUG("dpp_dev_pcie_default_read: Read Addr:0x%llx ,Value 0x%x\n", (abs_addr + (ZXIC_ADDR_T)(4 * ((ZXIC_ADDR_T)(i)))), *(p_data + i)); + } + + return DPP_OK; +} + +#ifndef ES_FOR_LLT +/***********************************************************/ +/** 写设备底层接口 +* @param dev_id 设备号 +* @param addr 单个设备内部的相对地址 +* @param size 数据的长度,以32bit为单位 +* @param p_data 数据 +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/05/15 +************************************************************/ +DPP_STATUS dpp_dev_write_channel(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 size, ZXIC_UINT32 *p_data) +{ + /*ZXIC_UINT32 i = 0;*/ + DPP_STATUS rtn = 0; +#if DPP_HW_OPR_EN + DPP_DEV_CFG_T *p_dev_info = NULL; +#endif + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev), DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data); + +#ifdef DPP_FOR_LLT + rtn = dpp_stump_reg_rb_debug_wr(DEV_ID(dev), + addr, + size, + p_data); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_stump_reg_rb_debug_wr"); + return DPP_OK; +#endif + +#if DPP_HW_OPR_EN + p_dev_info = DPP_DEV_INFO_GET(DEV_ID(dev)); + + if (p_dev_info == NULL) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "Error: Channel[%d] dev is not exist!\n ", DEV_ID(dev)); + return DPP_ERR; + } + else + { + if (p_dev_info->access_type == DPP_DEV_ACCESS_TYPE_PCIE) + { + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_dev_info->p_pcie_write_fun); + rtn = p_dev_info->p_pcie_write_fun(dev, addr, size, p_data); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "p_dev_info->p_pcie_write_fun"); + } + else + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "Dev access type[ %d ] is invalid!\n", p_dev_info->access_type); + return DPP_ERR; + } + } + +#endif + + return DPP_OK; +} + +/***********************************************************/ +/** 读设备底层接口 +* @param dev_id 设备号 +* @param addr 单个设备内部的相对地址 +* @param size 数据的长度,以32bit为单位 +* @param p_data 数据 +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/05/15 +************************************************************/ +DPP_STATUS dpp_dev_read_channel(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 size, ZXIC_UINT32 *p_data) +{ + DPP_STATUS rtn = 0; +#if DPP_HW_OPR_EN + DPP_DEV_CFG_T *p_dev_info = NULL; +#endif + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev), DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data); + +#ifdef DPP_FOR_LLT + rtn = dpp_stump_reg_rb_debug_rd(DEV_ID(dev), + addr, + size, + p_data); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_stump_reg_rb_debug_rd"); + return DPP_OK; +#endif + +#if DPP_HW_OPR_EN + p_dev_info = DPP_DEV_INFO_GET(DEV_ID(dev)); + + if (p_dev_info == NULL) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "Error: Channel[%d] dev is not exist!\n ", DEV_ID(dev)); + return DPP_ERR; + } + else + { + if (p_dev_info->access_type == DPP_DEV_ACCESS_TYPE_PCIE) + { + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_dev_info->p_pcie_read_fun); + rtn = p_dev_info->p_pcie_read_fun(dev, addr, size, p_data); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "p_dev_info->p_pcie_read_fun"); + } + else + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "Dev access type[ %d ] is invalid!\n", p_dev_info->access_type); + return DPP_ERR; + } + } + +#else + + for (ZXIC_UINT32 i = 0; i < size; i++) + { + p_data[i] = 0xffffffff; + } + +#endif + + return DPP_OK; +} +#endif /* ES_FOR_LLT */ diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/chip/dpp_init.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/chip/dpp_init.c new file mode 100755 index 0000000..918d463 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/chip/dpp_init.c @@ -0,0 +1,73 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_init.c +* 文件标识 : +* 内容摘要 : 芯片初始化源文件 +* 其它说明 : +* 当前版本 : +* 作 者 : 王春雷 +* 完成日期 : 2015/03/17 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#include "zxic_common.h" +#include "dpp_module.h" +#include "dpp_dev.h" +#include "dpp_ppu.h" +#include "dpp_se.h" +#include "dpp_dtb.h" +#include "dpp_init.h" + +/***********************************************************/ +/** 芯片上电初始,完整版本 +* @param dev_id 设备号 +* @param p_init_ctrl 系统初始化控制数据结构,由用户完成实例化和成员赋值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 王春雷 @date 2015/03/26 +************************************************************/ +DPP_STATUS dpp_init(ZXIC_UINT32 dev_id, DPP_SYS_INIT_CTRL_T *p_init_ctrl) +{ + DPP_STATUS rt = 0; + ZXIC_UINT32 access_type = 0; + ZXIC_UINT32 dev_id_array[DPP_DEV_CHANNEL_MAX] = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_init_ctrl); + + /* 初始化设备管理模块 */ + rt = dpp_dev_init(); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rt, "dpp_dev_init"); + + rt = dpp_dev_add(dev_id, + p_init_ctrl->device_type, + access_type, + p_init_ctrl->pcie_vir_baddr, + p_init_ctrl->riscv_vir_baddr, + p_init_ctrl->dma_vir_baddr, + p_init_ctrl->dma_phy_baddr, + p_init_ctrl->pcie_write_fun, + p_init_ctrl->pcie_read_fun, + p_init_ctrl->riscv_write_fun, + p_init_ctrl->riscv_read_fun); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rt, "dpp_dev_add"); + + /* 初始化table模块软件部分 */ + dev_id_array[0] = dev_id; + rt = dpp_sdt_init(1, dev_id_array); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rt, "dpp_sdt_init"); + + rt = dpp_ppu_parse_cls_bitmap(dev_id, DPP_PPU_CLS_ALL_START); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rt, "dpp_ppu_parse_cls_bitmap"); + + return DPP_OK; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/init/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/init/Kbuild.include new file mode 100644 index 0000000..3c13531 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/init/Kbuild.include @@ -0,0 +1,2 @@ +cur_dir := en_np/sdk/source/dev/init/ +src_files += $(addprefix $(cur_dir),$(notdir $(wildcard $(dinghai_root)/$(cur_dir)*.c))) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/init/dpp_kernel_init.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/init/dpp_kernel_init.c new file mode 100644 index 0000000..0e8b05b --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/init/dpp_kernel_init.c @@ -0,0 +1,233 @@ +#include +#include +#include +#include +#include +#include "zxic_common.h" +#include "dpp_dtb_cfg.h" +#include "dpp_kernel_init.h" +#include "dpp_dtb_table_api.h" + +/*hash dma地址信息*/ +typedef struct hash_dma_addr_info +{ + ZXIC_UINT32 slot_id; /*np所在的槽位号*/ + ZXIC_UINT32 dma_size; /*hash申请的dma大小*/ + dma_addr_t dma_phy_addr; /* dma 物理地址*/ + ZXIC_VOID *dma_vir_addr; /* dma 内核虚拟地址*/ +}HASH_DMA_ADDR_INFO; + +/*DMA空间信息*/ +typedef struct dpp_dma_info +{ + DTB_QUEUE_DMA_ADDR_INFO dtb_queue_info[DPP_DTB_QUEUE_NUM_MAX]; /*dtb队列*/ + HASH_DMA_ADDR_INFO hash_dma_info; /*hash上送*/ +}DPP_KERNEL_DMA_INFO; + +static DPP_KERNEL_DMA_INFO g_dpp_dma_info[DPP_PCIE_SLOT_MAX] = {0}; +static ZXIC_UINT32 queue_used_flag[DPP_PCIE_SLOT_MAX][4] = {0}; + +static ZXIC_VOID dpp_dtb_queue_dma_flag_set(ZXIC_UINT32 slot_id, ZXIC_UINT32 queue_id) +{ + ZXIC_UINT32 bit_shift = 0; + ZXIC_UINT32 reg_shift = 0; + + reg_shift = queue_id / 32; + bit_shift = queue_id % 32; + + queue_used_flag[slot_id][reg_shift] = queue_used_flag[slot_id][reg_shift] | (0x1 << bit_shift); +} + +static ZXIC_VOID dpp_dtb_queue_dma_flag_clear(ZXIC_UINT32 slot_id, ZXIC_UINT32 queue_id) +{ + ZXIC_UINT32 bit_shift = 0; + ZXIC_UINT32 reg_shift = 0; + + reg_shift = queue_id / 32; + bit_shift = queue_id % 32; + + queue_used_flag[slot_id][reg_shift] = queue_used_flag[slot_id][reg_shift] & ~(0x1 << bit_shift); +} + +static ZXIC_UINT32 dpp_dtb_queue_dma_flag_get(ZXIC_UINT32 slot_id, ZXIC_UINT32 queue_id) +{ + ZXIC_UINT32 bit_shift = 0; + ZXIC_UINT32 reg_shift = 0; + + ZXIC_UINT32 flag = 0; + + reg_shift = queue_id / 32; + bit_shift = queue_id % 32; + + flag = (queue_used_flag[slot_id][reg_shift] >> bit_shift) & 0x1; + + ZXIC_COMM_PRINT("[dpp_dtb_queue_dma_flag_get]:slot %d queue %d flag %d!\n", slot_id, queue_id, flag); + + return flag; +} + +//申请队列DMA空间,通过传入DMA队列号,返回申请到DMA内存的物理地址 +ZXIC_SINT32 dpp_dtb_queue_dma_mem_alloc(DPP_DEV_T *dev, ZXIC_UINT32 queue_id, ZXIC_UINT32 size) +{ + dma_addr_t dma_handle; + ZXIC_VOID* cpu_addr = NULL; + ZXIC_UINT32 slot_id = 0; + + ZXIC_COMM_CHECK_POINT(dev); + + slot_id = (ZXIC_UINT32)DEV_PCIE_SLOT(dev); + ZXIC_COMM_CHECK_INDEX(slot_id, 0, DPP_DEV_SLOT_MAX - 1); + + if (queue_id > (DPP_DTB_QUEUE_NUM_MAX - 1)) + { + return -ENOMEM; + } + + cpu_addr = dma_alloc_coherent(&(DEV_PCIE_DEV(dev)->dev), size, &dma_handle, GFP_KERNEL); + + if(!cpu_addr) + { + dev_err(&(DEV_PCIE_DEV(dev)->dev),"dpp_dtb_queue_dma_mem_alloc buff allocation failed\n"); + return -ENOMEM; + } + + g_dpp_dma_info[slot_id].dtb_queue_info[queue_id].slot_id = slot_id; + g_dpp_dma_info[slot_id].dtb_queue_info[queue_id].queue_id = queue_id; + g_dpp_dma_info[slot_id].dtb_queue_info[queue_id].dma_vir_addr = ZXIC_COMM_PTR_TO_VAL(cpu_addr); + g_dpp_dma_info[slot_id].dtb_queue_info[queue_id].dma_phy_addr = dma_handle; + g_dpp_dma_info[slot_id].dtb_queue_info[queue_id].dma_size = size; + + ZXIC_COMM_PRINT("[dpp_dtb_queue_dma_mem_alloc]:slot %d queue %d kernel phy addr :0x%016llx !\n", + slot_id, queue_id, dma_handle); + ZXIC_COMM_PRINT("[dpp_dtb_queue_dma_mem_alloc]:slot %d queue %d kernel vir addr :0x%016llx !\n", + slot_id, queue_id, ZXIC_COMM_PTR_TO_VAL(cpu_addr)); + + dpp_dtb_queue_dma_flag_set(slot_id, queue_id); + dpp_dtb_queue_dma_flag_get(slot_id, queue_id); + + return DPP_OK; +} + +ZXIC_SINT32 dpp_dtb_queue_dma_mem_get(DPP_DEV_T *dev, ZXIC_UINT32 queue_id, DTB_QUEUE_DMA_ADDR_INFO *dmaAddrInfo) +{ + ZXIC_UINT32 slot_id = 0; + + ZXIC_COMM_CHECK_POINT(dev); + + slot_id = (ZXIC_UINT32)DEV_PCIE_SLOT(dev); + ZXIC_COMM_CHECK_INDEX(slot_id, 0, DPP_DEV_SLOT_MAX - 1); + + if(queue_id > (DPP_DTB_QUEUE_NUM_MAX - 1)) + { + ZXIC_COMM_PRINT("[dpp_dtb_queue_dma_mem_get]:queue id max.\n"); + return -1; + } + + if (g_dpp_dma_info[slot_id].dtb_queue_info[queue_id].queue_id != queue_id) + { + ZXIC_COMM_PRINT("[dpp_dtb_queue_dma_mem_get]:slot %d queue %d error !\n", slot_id, queue_id); + return -1; + } + dmaAddrInfo->dma_phy_addr = g_dpp_dma_info[slot_id].dtb_queue_info[queue_id].dma_phy_addr; + dmaAddrInfo->dma_vir_addr = g_dpp_dma_info[slot_id].dtb_queue_info[queue_id].dma_vir_addr; + dmaAddrInfo->dma_size = g_dpp_dma_info[slot_id].dtb_queue_info[queue_id].dma_size; + dmaAddrInfo->queue_id = queue_id; + dmaAddrInfo->slot_id = slot_id; + + return DPP_OK; +} + +/*dtb队列dma内存释放,通过传入dtb队列号,在维护的队列地址中找到对应的虚拟地址和物理地址,进行释放*/ +ZXIC_SINT32 dpp_dtb_queue_dma_mem_release(DPP_DEV_T *dev, ZXIC_UINT32 queue_id) +{ + dma_addr_t dma_handle = 0; + ZXIC_VOID* cpu_addr = NULL; + ZXIC_UINT32 dma_size = 0; + ZXIC_UINT32 slot_id = 0; + + ZXIC_COMM_CHECK_POINT(dev); + + slot_id = (ZXIC_UINT32)DEV_PCIE_SLOT(dev); + ZXIC_COMM_CHECK_INDEX(slot_id, 0, DPP_DEV_SLOT_MAX - 1); + + if(queue_id > (DPP_DTB_QUEUE_NUM_MAX - 1)) + { + ZXIC_COMM_PRINT("[dpp_dtb_dma_mem_release]:queue id max.\n"); + return -1; + } + + if (g_dpp_dma_info[slot_id].dtb_queue_info[queue_id].queue_id != queue_id) + { + ZXIC_COMM_PRINT("[dpp_dtb_dma_mem_release]:slot %d queue %d error !\n", slot_id, queue_id); + return -1; + } + + dma_handle = g_dpp_dma_info[slot_id].dtb_queue_info[queue_id].dma_phy_addr; + cpu_addr = ZXIC_COMM_VAL_TO_PTR(g_dpp_dma_info[slot_id].dtb_queue_info[queue_id].dma_vir_addr); + dma_size = g_dpp_dma_info[slot_id].dtb_queue_info[queue_id].dma_size; + + if (!dma_handle) + { + return -EFAULT; + } + + dma_free_coherent(&(DEV_PCIE_DEV(dev)->dev), dma_size, cpu_addr, dma_handle); + + ZXIC_COMM_PRINT("[dpp_dtb_dma_mem_release]:slot %d queue %d release success!\n", slot_id, queue_id); + + g_dpp_dma_info[slot_id].dtb_queue_info[queue_id].slot_id = 0; + g_dpp_dma_info[slot_id].dtb_queue_info[queue_id].queue_id = 0; + g_dpp_dma_info[slot_id].dtb_queue_info[queue_id].dma_phy_addr = 0; + g_dpp_dma_info[slot_id].dtb_queue_info[queue_id].dma_vir_addr = 0; + g_dpp_dma_info[slot_id].dtb_queue_info[queue_id].dma_size = 0; + + dpp_dtb_queue_dma_flag_clear(slot_id, queue_id); + dpp_dtb_queue_dma_flag_get(slot_id, queue_id); + + return 0; +} + +ZXIC_SINT32 dtb_sdt_dump_dma_alloc(DPP_DEV_T *dev, + ZXIC_UINT32 dma_size, + ZXIC_UINT64 * p_dma_phy_addr, + ZXIC_UINT64 * p_dma_vir_addr) +{ + int rc = 0; + + dma_addr_t dma_handle; + ZXIC_VOID* cpu_addr = NULL; + + cpu_addr = dma_alloc_coherent(&(DEV_PCIE_DEV(dev)->dev), dma_size, &dma_handle, GFP_KERNEL); + + if(!cpu_addr) + { + dev_err(&(DEV_PCIE_DEV(dev)->dev),"dtb_sdt_dump_dma_alloc buff allocation failed\n"); + return -ENOMEM; + } + + *p_dma_phy_addr = (ZXIC_UINT64)dma_handle; + *p_dma_vir_addr = (ZXIC_UINT64)(ZXIC_COMM_PTR_TO_VAL(cpu_addr)); + + return rc; +} + +ZXIC_SINT32 dtb_sdt_dump_dma_release(DPP_DEV_T *dev, + ZXIC_UINT32 dma_size, + ZXIC_UINT64 dma_phy_addr, + ZXIC_UINT64 dma_vir_addr) +{ + dma_addr_t dma_handle = 0; + ZXIC_VOID* cpu_addr = NULL; + + dma_handle = (dma_addr_t)dma_phy_addr; + cpu_addr = ZXIC_COMM_VAL_TO_PTR(dma_vir_addr); + + if (!dma_handle) + { + return -EFAULT; + } + + dma_free_coherent(&(DEV_PCIE_DEV(dev)->dev), dma_size, cpu_addr, dma_handle); + + return 0; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/Kbuild.include new file mode 100644 index 0000000..9b841e1 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/Kbuild.include @@ -0,0 +1,4 @@ +cur_dir := en_np/sdk/source/dev/module/ +subdirs := se/ table/ dma/ se_apt/ ppu/ tm/ nppu/ +src_files += +include $(foreach subdir, $(subdirs), $(dinghai_root)/$(cur_dir)$(subdir)/Kbuild.include) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/dma/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/dma/Kbuild.include new file mode 100644 index 0000000..632e1f9 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/dma/Kbuild.include @@ -0,0 +1,2 @@ +cur_dir := en_np/sdk/source/dev/module/dma/ +src_files += $(addprefix $(cur_dir),$(notdir $(wildcard $(dinghai_root)/$(cur_dir)*.c))) diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/dma/dpp_dtb.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/dma/dpp_dtb.c new file mode 100755 index 0000000..9d64e63 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/dma/dpp_dtb.c @@ -0,0 +1,2183 @@ +/************************************************************** +* 版权所有(C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_dtb.c +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : zab +* 完成日期 : 2022/08/26 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ +#include "zxic_common.h" +#include "dpp_dev.h" +#include "dpp_type_api.h" +#include "dpp_dtb_cfg.h" +#include "dpp_dtb.h" +#include "dpp_dtb_table.h" +#include "dpp_hash.h" +#include "dpp_dtb_reg.h" +#include "dpp_reg_api.h" +#include "dpp_reg_info.h" +#include "dpp_se_api.h" + +#if ZXIC_REAL("DTB") + +ZXIC_CHAR *g_dpp_dtb_name[] = +{ + "DOWN TAB", + "UP TAB", +}; + +DPP_DTB_MGR_T *p_dpp_dtb_mgr[DPP_PCIE_SLOT_MAX][DPP_DEV_CHANNEL_MAX] = {{NULL}}; + +/**dtb超时时间 单位us*/ +static ZXIC_UINT32 g_dtb_down_overtime = 2*1000; +static ZXIC_UINT32 g_dtb_dump_overtime = 5*1000*1000; + +/*配置dtb调试函数*/ +static ZXIC_UINT32 g_dtb_debug_fun_en = 0; +static ZXIC_UINT32 g_dtb_print_en = 0; +static ZXIC_UINT32 g_dtb_soft_perf_test = 0; +static ZXIC_UINT32 g_dtb_hardware_perf_test = 0; + +/**使能dtb调试函数*/ +ZXIC_UINT32 dpp_dtb_debug_fun_enable(ZXIC_VOID) +{ + g_dtb_debug_fun_en = 1; + return 0; +} + +/**去使能dtb调试函数*/ +ZXIC_UINT32 dpp_dtb_debug_fun_disable(ZXIC_VOID) +{ + g_dtb_debug_fun_en = 0; + return 0; +} + +/**获取dtb调试函数*/ +ZXIC_UINT32 dpp_dtb_debug_fun_get(ZXIC_VOID) +{ + return g_dtb_debug_fun_en; +} + +/**使能dtb打印函数*/ +ZXIC_UINT32 dpp_dtb_prt_enable(ZXIC_VOID) +{ + g_dtb_print_en = 1; + return 0; +} + +/**去使能dtb打印函数*/ +ZXIC_UINT32 dpp_dtb_prt_disable(ZXIC_VOID) +{ + g_dtb_print_en = 0; + return 0; +} + +/**获取dtb打印函数*/ +ZXIC_UINT32 dpp_dtb_prt_get(ZXIC_VOID) +{ + return g_dtb_print_en; +} + +ZXIC_UINT32 dpp_dtb_soft_perf_test_set(ZXIC_UINT32 value) +{ + g_dtb_soft_perf_test = value; + return 0; +} + +ZXIC_UINT32 dpp_dtb_soft_perf_test_get(ZXIC_VOID) +{ + return g_dtb_soft_perf_test; +} + +ZXIC_UINT32 dpp_dtb_hardware_perf_test_set(ZXIC_UINT32 value) +{ + g_dtb_hardware_perf_test = value; + return 0; +} + +ZXIC_UINT32 dpp_dtb_hardware_perf_test_get(ZXIC_VOID) +{ + return g_dtb_hardware_perf_test; +} + +ZXIC_UINT32 dpp_dtb_down_table_overtime_set(ZXIC_UINT32 times_s) +{ + g_dtb_down_overtime = times_s; + return 0; +} + +ZXIC_UINT32 dpp_dtb_down_table_overtime_get(ZXIC_VOID) +{ + return g_dtb_down_overtime; +} + +ZXIC_UINT32 dpp_dtb_dump_table_overtime_set(ZXIC_UINT32 times_s) +{ + g_dtb_dump_overtime = times_s; + return 0; +} + +ZXIC_UINT32 dpp_dtb_dump_table_overtime_get(ZXIC_VOID) +{ + return g_dtb_dump_overtime; +} + +#if ZXIC_REAL("MGR") +/***********************************************************/ +/** 创建DTB的管理结构 +* @param dev_id 设备号,支持多芯片 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_mgr_create(ZXIC_UINT32 slot_id, ZXIC_UINT32 dev_id) +{ + ZXIC_COMM_CHECK_INDEX(slot_id, 0, DPP_PCIE_SLOT_MAX - 1); + ZXIC_COMM_CHECK_INDEX(dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + + if (p_dpp_dtb_mgr[slot_id][dev_id] != ZXIC_NULL) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "slot %d ErrorCode[0x%x]: DTB Manager is not exist!!!\n", slot_id, DPP_RC_DTB_MGR_NOT_EXIST); + return DPP_RC_DTB_MGR_EXIST; + } + + p_dpp_dtb_mgr[slot_id][dev_id] = (DPP_DTB_MGR_T *)ZXIC_COMM_MALLOC(sizeof(DPP_DTB_MGR_T)); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_dpp_dtb_mgr[slot_id][dev_id]); + + ZXIC_COMM_MEMSET(p_dpp_dtb_mgr[slot_id][dev_id], 0, sizeof(DPP_DTB_MGR_T)); + + ZXIC_COMM_PRINT("dpp_dtb_mgr_create:slot %d dev %d done!!!", slot_id, dev_id); + + return DPP_OK; +} + +/***********************************************************/ +/** 注销DTB的管理结构 +* @param dev_id 设备号,支持多芯片 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_mgr_destory_all(ZXIC_VOID) +{ + ZXIC_UINT32 slot_id = 0; + ZXIC_UINT32 dev_id = 0; + + for(slot_id = 0; slot_id < DPP_DEV_SLOT_MAX; slot_id++) + { + for(dev_id = 0; dev_id < DPP_DEV_CHANNEL_MAX; dev_id++) + { + dpp_dtb_mgr_destory(slot_id, dev_id); + } + } + + return DPP_OK; +} + +ZXIC_UINT32 dpp_dtb_mgr_destory(ZXIC_UINT32 slot_id, ZXIC_UINT32 dev_id) +{ + ZXIC_COMM_CHECK_INDEX(slot_id, 0, DPP_PCIE_SLOT_MAX - 1); + ZXIC_COMM_CHECK_INDEX(dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + + if (p_dpp_dtb_mgr[slot_id][dev_id] != ZXIC_NULL) + { + ZXIC_COMM_FREE(p_dpp_dtb_mgr[slot_id][dev_id]); + p_dpp_dtb_mgr[slot_id][dev_id] = ZXIC_NULL; + ZXIC_COMM_PRINT("dpp_dtb_mgr_destory:slot %d dev %d done!!!", slot_id, dev_id); + } + + return DPP_OK; +} + +/***********************************************************/ +/** 重置DTB管理结构 +* @param dev_id 设备号,支持多芯片 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_mgr_reset(ZXIC_UINT32 slot_id, ZXIC_UINT32 dev_id) +{ + ZXIC_COMM_CHECK_INDEX(slot_id, 0, DPP_PCIE_SLOT_MAX - 1); + ZXIC_COMM_CHECK_INDEX(dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + + if (p_dpp_dtb_mgr[slot_id][dev_id] == ZXIC_NULL) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "slot %d ErrorCode[0x%x]: dtb manager is not exist!!!\n", slot_id, DPP_RC_DTB_MGR_NOT_EXIST); + return DPP_RC_DTB_MGR_NOT_EXIST; + } + + ZXIC_COMM_MEMSET(p_dpp_dtb_mgr[slot_id][dev_id], 0, sizeof(DPP_DTB_MGR_T)); + + return DPP_OK; +} + +/***********************************************************/ +/** 获取DMA管理结构 +* @param dev_id 设备号,支持多芯片 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +DPP_DTB_MGR_T *dpp_dtb_mgr_get(ZXIC_UINT32 slot_id, ZXIC_UINT32 dev_id) +{ + if ((slot_id >= DPP_PCIE_SLOT_MAX) || (dev_id >= DPP_DEV_CHANNEL_MAX)) + { + return ZXIC_NULL; + } + else + { + return p_dpp_dtb_mgr[slot_id][dev_id]; + } +} +#endif + +#if ZXIC_REAL("QUEUE_ADDR") +/***********************************************************/ +/** 获得下表队列中某元素的物理地址 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列号0-127 +* @param element_id 队列中元素号0-31 +* @param p_element_start_addr_h 元素起始高32位地址 +* @param p_element_start_addr_l 元素起始低32位地址 +* @param p_element_table_addr_h 下表内容开始高32位地址 +* @param p_element_table_addr_l 下表内容开始低32位地址 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_down_table_elemet_addr_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 element_id, + ZXIC_UINT32 *p_element_start_addr_h, + ZXIC_UINT32 *p_element_start_addr_l, + ZXIC_UINT32 *p_element_table_addr_h, + ZXIC_UINT32 *p_element_table_addr_l) +{ + ZXIC_UINT32 addr_h = 0; + ZXIC_UINT32 addr_l = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), element_id, 0, DPP_DTB_QUEUE_ITEM_NUM_MAX - 1); + + addr_h = (DPP_DTB_TAB_DOWN_PHY_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, element_id) >> 32) & 0xffffffff; + addr_l = DPP_DTB_TAB_DOWN_PHY_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, element_id) & 0xffffffff; + + *p_element_start_addr_h = addr_h; + *p_element_start_addr_l = addr_l; + + addr_h = ((DPP_DTB_TAB_DOWN_PHY_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, element_id) + DPP_DTB_ITEM_ACK_SIZE) >> 32) & 0xffffffff; + addr_l = (DPP_DTB_TAB_DOWN_PHY_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, element_id) + DPP_DTB_ITEM_ACK_SIZE) & 0xffffffff; + + *p_element_table_addr_h = addr_h; + *p_element_table_addr_l = addr_l; + + return DPP_OK; +} + +/***********************************************************/ +/** 获得队列中某元素dump的物理地址 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列号0-127 +* @param element_id 队列中元素号0-31 +* @param p_element_start_addr_h 元素起始高32位地址 +* @param p_element_start_addr_l 元素起始低32位地址 +* @param p_element_dump_addr_h dump描述符开始高32位地址 +* @param p_element_dump_addr_l dump描述符开始低32位地址 +* @param p_element_table_info_addr_h 表内容开始高32位地址 +* @param p_element_table_info_addr_l 表内容开始低32位地址 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_dump_table_elemet_addr_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 element_id, + ZXIC_UINT32 *p_element_start_addr_h, + ZXIC_UINT32 *p_element_start_addr_l, + ZXIC_UINT32 *p_element_dump_addr_h, + ZXIC_UINT32 *p_element_dump_addr_l, + ZXIC_UINT32 *p_element_table_info_addr_h, + ZXIC_UINT32 *p_element_table_info_addr_l) +{ + ZXIC_UINT32 rc = 0; + ZXIC_UINT32 addr_h = 0; + ZXIC_UINT32 addr_l = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), element_id, 0, DPP_DTB_QUEUE_ITEM_NUM_MAX - 1); + + addr_h = ((DPP_DTB_TAB_UP_PHY_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, element_id)) >> 32) & 0xffffffff; + addr_l = (DPP_DTB_TAB_UP_PHY_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, element_id)) & 0xffffffff; + + *p_element_start_addr_h = addr_h; + *p_element_start_addr_l = addr_l; + + addr_h = ((DPP_DTB_TAB_UP_PHY_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, element_id)+ DPP_DTB_ITEM_ACK_SIZE) >> 32) & 0xffffffff; + addr_l = (DPP_DTB_TAB_UP_PHY_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, element_id)+ DPP_DTB_ITEM_ACK_SIZE) & 0xffffffff; + + *p_element_dump_addr_h = addr_h; + *p_element_dump_addr_l = addr_l; + + rc = dpp_dtb_tab_up_item_addr_get(dev, queue_id, element_id, p_element_table_info_addr_h, p_element_table_info_addr_l); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_tab_up_item_addr_get"); + + return DPP_OK; +} + +#endif + +#if ZXIC_REAL("MEM_RW") +/***********************************************************/ +/** 内存32bits写入函数 +* @param dev_id 设备号,支持多芯片 +* @param addr 地址偏移 +* @param data 写入数据 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_wr32(DPP_DEV_T *dev, + ZXIC_ADDR_T addr, + ZXIC_UINT32 data) +{ + ZXIC_UINT32 value = data; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), data, 0, ZXIC_UINT32_MAX); + + if (!zxic_comm_is_big_endian()) + { + value = ZXIC_COMM_CONVERT32(value); + } + + *((ZXIC_VOL ZXIC_UINT32 *)(addr)) = value; + + return DPP_OK; +} + +/***********************************************************/ +/** 内存32bits读取函数 +* @param dev_id 设备号,支持多芯片 +* @param addr 读取地址 +* @param p_data 读取数据 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_rd32(DPP_DEV_T *dev, + ZXIC_ADDR_T addr, + ZXIC_UINT32 *p_data) +{ + ZXIC_UINT32 value = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data); + + // dpp_flush_cache();//片内DDR使用 + + value = *((ZXIC_VOL ZXIC_UINT32 *)(addr)); + + if (!zxic_comm_is_big_endian()) + { + value = ZXIC_COMM_CONVERT32(value); + } + + *p_data = value; + + return DPP_OK; +} +#endif + +#if ZXIC_REAL("ACK_RW") +/***********************************************************/ +/** 读取BD表条目信息 +* @param dev_id 芯片的id号 +* @param queue_id 队列号,范围0-127 +* @param dir_flag 方向,1-上送表项,0-下发表项 +* @param index 条目索引,范围0-31 +* @param pos 一个item里面的4个32位,pos对应的是第几个ZXICP_WORD32, +* 取值为0,1,2,3 +* @param p_data 读取的数据,大端格式 +* +* @return +* @remark 无 +* @see +* @author zab @date 2019/11/2 +************************************************************/ +ZXIC_UINT32 dpp_dtb_item_ack_rd(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 dir_flag, + ZXIC_UINT32 index, + ZXIC_UINT32 pos, + ZXIC_UINT32 *p_data) +{ + ZXIC_UINT32 rc = 0; + ZXIC_ADDR_T addr = 0; + ZXIC_UINT32 val = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), dir_flag, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), index, 0, DPP_DTB_QUEUE_ITEM_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), pos, 0, 3); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data); + + if(DPP_DTB_QUEUE_INIT_FLAG_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id) == 0) + { + ZXIC_COMM_TRACE_ERROR("dtb slot %d queue %d is not init.\n", DEV_PCIE_SLOT(dev), queue_id); + return DPP_RC_DTB_QUEUE_IS_NOT_INIT; + } + + if (dir_flag == DPP_DTB_DIR_UP_TYPE) + { + addr = DPP_DTB_TAB_UP_VIR_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, index) + pos * 4; + } + else + { + addr = DPP_DTB_TAB_DOWN_VIR_ADDR_GET(DEV_PCIE_SLOT(dev),DEV_ID(dev), queue_id, index) + pos * 4; + } + + rc = dpp_dtb_rd32(dev, addr, &val); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_rd32"); + + *p_data = val; + + return DPP_OK; +} + +/***********************************************************/ +/** 向BD表条目指定位置写入值 +* @param dev_id 芯片的id号 +* @param queue_id 队列号,范围0-127 +* @param dir_flag 方向,1-上送表项,0-下发表项 +* @param index 条目索引,范围0-31 +* @param pos 一个item里面的4个32位,pos对应的是第几个ZXICP_WORD32, +* 取值为0,1,2,3 +* @param data 读取的数据,大端格式 +* +* @return +* @remark 无 +* @see +* @author zab @date 2019/11/2 +************************************************************/ +ZXIC_UINT32 dpp_dtb_item_ack_wr(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 dir_flag, + ZXIC_UINT32 index, + ZXIC_UINT32 pos, + ZXIC_UINT32 data) +{ + ZXIC_UINT32 rc = 0; + ZXIC_ADDR_T addr = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), dir_flag, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), index, 0, DPP_DTB_QUEUE_ITEM_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), pos, 0, 3); + + if(DPP_DTB_QUEUE_INIT_FLAG_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id) == 0) + { + ZXIC_COMM_TRACE_ERROR("dtb slot %d queue %d is not init.\n", DEV_PCIE_SLOT(dev), queue_id); + return DPP_RC_DTB_QUEUE_IS_NOT_INIT; + } + + if (dir_flag == DPP_DTB_DIR_UP_TYPE) + { + addr = DPP_DTB_TAB_UP_VIR_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, index) + pos * 4; + } + else + { + addr = DPP_DTB_TAB_DOWN_VIR_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, index) + pos * 4; + } + + rc = dpp_dtb_wr32(dev, addr, data); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_wr32"); + + return DPP_OK; +} + +/***********************************************************/ +/** 打印队列指定条目ACK信息 +* @param dev_id 芯片的id号 +* @param queue_id 队列号,范围0-127 +* @param dir_flag 方向,0-down,1-up +* @param index 条目索引 +* +* @return +* @remark 无 +* @see +* @author zab @date 2022/08/30 +************************************************************/ +ZXIC_UINT32 dpp_dtb_item_ack_prt(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 dir_flag, + ZXIC_UINT32 index) +{ + ZXIC_UINT32 rc = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 ack_data[4] = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_NO_ASSERT(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), dir_flag, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), index, 0, DPP_DTB_QUEUE_ITEM_NUM_MAX -1); + + for (i = 0; i < DPP_DTB_ITEM_ACK_SIZE / 4; i++) + { + rc = dpp_dtb_item_ack_rd(dev, queue_id, dir_flag, index, i, ack_data + i); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_item_ack_rd"); + } + + ZXIC_COMM_PRINT("\n=====> [%s] BD INFO:", g_dpp_dtb_name[dir_flag]); + ZXIC_COMM_PRINT("\n[ index : %u] : 0x%08x 0x%08x 0x%08x 0x%08x \n", index, ack_data[0], ack_data[1], ack_data[2], ack_data[3]); + + return DPP_OK; +} + +/***********************************************************/ +/** 打印队列指定条目BUFF的数据 +* @param dev_id 芯片的id号 +* @param queue_id 队列号,范围0-127 +* @param dir_flag 方向,0-down,1-up +* @param index 条目索引 +* @param len 读取数据长度 4字节为单位 +* +* @return +* @remark 无 +* @see +* @author zab @date 2022/08/30 +************************************************************/ +ZXIC_UINT32 dpp_dtb_item_buff_prt(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 dir_flag, + ZXIC_UINT32 index, + ZXIC_UINT32 len) +{ + ZXIC_UINT32 rc = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + ZXIC_UINT32 *p_item_buff = ZXIC_NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_NO_ASSERT(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), dir_flag, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), index, 0, DPP_DTB_QUEUE_ITEM_NUM_MAX -1); + + p_item_buff = ZXIC_COMM_MALLOC((len * sizeof(ZXIC_UINT32)) % ZXIC_COMM_WORD32_MASK); + if (p_item_buff == ZXIC_NULL) + { + ZXIC_COMM_PRINT("Alloc dtb item buffer faild!!!\n"); + return DPP_RC_DTB_MEMORY_ALLOC_ERR; + } + + ZXIC_COMM_MEMSET(p_item_buff, 0, len * sizeof(ZXIC_UINT32)); + + rc = dpp_dtb_item_buff_rd(dev, queue_id, dir_flag, index, 0, len, p_item_buff); + ZXIC_COMM_CHECK_DEV_RC_MEMORY_FREE(DEV_ID(dev), rc, "dpp_dtb_item_buff_rd", p_item_buff); + + ZXIC_COMM_PRINT("\n=====> [%s] BUFF INFO:", g_dpp_dtb_name[dir_flag]); + for(i = 0, j = 0; i < len; i++, j++) + { + if(j % 4 == 0) + { + ZXIC_COMM_PRINT("\n0x%08x ", (*(p_item_buff + i))); + } + else + { + ZXIC_COMM_PRINT("0x%08x ", (*(p_item_buff + i))); + } + } + ZXIC_COMM_PRINT("\n"); + + ZXIC_COMM_FREE(p_item_buff); + + return DPP_OK; +} + +#endif + + +#if ZXIC_REAL("BUFF_RW") + +/***********************************************************/ +/** 读取dtb条目指向BUFF的数据 +* @param dev_id 芯片的id号 +* @param queue_id 队列号,范围0-127 +* @param dir_flag 方向,1-上送表项,0-下发表项 +* @param index 条目索引,范围0-31 +* @param pos 相对BUFF起始地址的偏移,单位32bit; +* @param p_data 读取的数据,大端格式 +* @param len 读取数据长度,单位32bit; +* +* @return +* @remark 无 +* @see +* @author zab @date 2019/11/2 +************************************************************/ +ZXIC_UINT32 dpp_dtb_item_buff_rd(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 dir_flag, + ZXIC_UINT32 index, + ZXIC_UINT32 pos, + ZXIC_UINT32 len, + ZXIC_UINT32 *p_data) +{ + ZXIC_ADDR_T addr = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), dir_flag, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), index, 0, DPP_DTB_QUEUE_ITEM_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), pos, 0, 3); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data); + + if(DPP_DTB_QUEUE_INIT_FLAG_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id) == 0) + { + ZXIC_COMM_TRACE_ERROR("dtb slot %d queue %d is not init.\n", DEV_PCIE_SLOT(dev), queue_id); + return DPP_RC_DTB_QUEUE_IS_NOT_INIT; + } + + if (dir_flag == DPP_DTB_DIR_UP_TYPE) + { + if (DPP_DTB_TAB_UP_USER_PHY_ADDR_FLAG_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, index) == DPP_DTB_TAB_UP_USER_ADDR_TYPE) + { + addr = DPP_DTB_TAB_UP_USER_VIR_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, index) + pos * 4; + DPP_DTB_TAB_UP_USER_ADDR_FLAG_SET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, index, 0);//为什么设置为0? + } + else + { + addr = DPP_DTB_TAB_UP_VIR_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, index) + DPP_DTB_ITEM_ACK_SIZE + pos * 4; + } + } + else + { + addr = DPP_DTB_TAB_DOWN_VIR_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, index) + DPP_DTB_ITEM_ACK_SIZE + pos * 4; + } + + ZXIC_COMM_MEMCPY_S(p_data, len * 4, (ZXIC_UINT8 *)(addr), len * 4); + + zxic_comm_swap((ZXIC_UINT8*)p_data, len * 4); + + return DPP_OK; +} + +/***********************************************************/ +/** 向BD表条目指向的BUFF指定位置写入值 +* @param dev_id 芯片的id号 +* @param queue_id 队列号,范围0-127 +* @param dir_flag 方向,1-上送表项,0-下发表项 +* @param index 条目索引,范围0-31 +* @param pos 相对BUFF起始地址的偏移,单位32bit; +* @param p_data 读取的数据,大端格式 +* @param len 写入数据长度,单位32bit; +* +* @return +* @remark 无 +* @see +* @author zab @date 2019/11/2 +************************************************************/ +ZXIC_UINT32 dpp_dtb_item_buff_wr(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 dir_flag, + ZXIC_UINT32 index, + ZXIC_UINT32 pos, + ZXIC_UINT32 len, + ZXIC_UINT32 *p_data) +{ + ZXIC_ADDR_T addr = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), dir_flag, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), index, 0, DPP_DTB_QUEUE_ITEM_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), pos, 0, 3); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data); + + if(DPP_DTB_QUEUE_INIT_FLAG_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id) == 0) + { + ZXIC_COMM_TRACE_ERROR("dtb slot %d queue %d is not init.\n", DEV_PCIE_SLOT(dev), queue_id); + return DPP_RC_DTB_QUEUE_IS_NOT_INIT; + } + + if (dir_flag == DPP_DTB_DIR_UP_TYPE) + { + addr = DPP_DTB_TAB_UP_VIR_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, index) + DPP_DTB_ITEM_ACK_SIZE + pos * 4; + } + else + { + addr = DPP_DTB_TAB_DOWN_VIR_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, index) + DPP_DTB_ITEM_ACK_SIZE + pos * 4; + } + + ZXIC_COMM_MEMCPY_S((ZXIC_UINT8 *)(addr), len * 4, p_data, len * 4); + + // dpp_flush_cache();//片内ddr使用 + + return DPP_OK; +} +#endif + +#if ZXIC_REAL("API") +#if ZXIC_REAL("TAB_DOWN") + +/** dtb info print*/ +ZXIC_UINT32 dpp_dtb_info_print(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 item_index, + DPP_DTB_QUEUE_ITEM_INFO_T *item_info) +{ + ZXIC_ADDR_T element_start_addr = 0; + ZXIC_ADDR_T ack_start_addr = 0; + ZXIC_ADDR_T data_addr = 0; + ZXIC_UINT32 data = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + + ZXIC_COMM_CHECK_POINT(dev); + + ZXIC_COMM_PRINT("dpp_dtb_info_print: slot %d queue: %d, element:%d, %s table info is:\n", DEV_PCIE_SLOT(dev), queue_id, item_index, + (item_info->cmd_type) ? "up" : "down"); + ZXIC_COMM_PRINT("cmd_vld : %d\n", item_info->cmd_vld); + ZXIC_COMM_PRINT("cmd_type : %s\n", (item_info->cmd_type) ? "up" : "down"); + ZXIC_COMM_PRINT("int_en : %d\n", item_info->int_en); + ZXIC_COMM_PRINT("data_len : %d\n", item_info->data_len); + ZXIC_COMM_PRINT("data_hddr : 0x%08x\n", item_info->data_hddr); + ZXIC_COMM_PRINT("data_laddr : 0x%08x\n", item_info->data_laddr); + + if (item_info->cmd_type == DPP_DTB_DIR_UP_TYPE) + { + if (DPP_DTB_TAB_UP_USER_PHY_ADDR_FLAG_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, item_index) == DPP_DTB_TAB_UP_USER_ADDR_TYPE) + { + ack_start_addr = DPP_DTB_TAB_UP_USER_VIR_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, item_index); + } + ack_start_addr = DPP_DTB_TAB_UP_VIR_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, item_index); + element_start_addr = DPP_DTB_TAB_UP_VIR_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, item_index) + DPP_DTB_ITEM_ACK_SIZE; + } + else + { + ack_start_addr = DPP_DTB_TAB_DOWN_VIR_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, item_index); + element_start_addr = DPP_DTB_TAB_DOWN_VIR_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, item_index) + DPP_DTB_ITEM_ACK_SIZE; + } + ZXIC_COMM_PRINT("dtb data:\n"); + + ZXIC_COMM_PRINT("ack info:\n"); + for(j = 0; j < 4; j++) + { + data = ZXIC_COMM_CONVERT32(*((ZXIC_UINT32 *)(ack_start_addr + 4 * j))); + + ZXIC_COMM_PRINT("0x%08x ",data); + } + ZXIC_COMM_PRINT("\n"); + + for (i = 0; i < item_info->data_len; i++) + { + data_addr = element_start_addr + 16 * i;//16字节为一行 + + ZXIC_COMM_PRINT("row_%d:", i); + + for(j = 0; j < 4; j++) + { + data = ZXIC_COMM_CONVERT32(*((ZXIC_UINT32 *)(data_addr + 4 * j))); + + ZXIC_COMM_PRINT("0x%08x ",data); + } + + ZXIC_COMM_PRINT("\n"); + } + + ZXIC_COMM_PRINT("dpp dtb info print end.\n"); + return DPP_OK; +} + +/***********************************************************/ +/** 配置下发配置数据信息 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列号,范围0-31 +* @param int_flag 中断标志,0-无,1-有 +* @param data_len 数据长度,单位32bit; +* @param p_data 待下发数据 +* @param p_item_index 返回使用的条目编号 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_tab_down_info_set(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 int_flag, + ZXIC_UINT32 data_len, + ZXIC_UINT32 *p_data, + ZXIC_UINT32 *p_item_index) +{ + ZXIC_UINT32 rc = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 queue_en = 0; + ZXIC_UINT32 ack_vale = 0; + ZXIC_UINT32 item_index = 0; + ZXIC_UINT32 unused_item_num = 0; + DPP_DTB_QUEUE_ITEM_INFO_T item_info = {0}; + ZXIC_MUTEX_T *p_mutex = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), int_flag, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), data_len, 4, 0xffc); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_item_index); + + rc = dpp_dev_dtb_opr_mutex_get(DEV_ID(dev), DPP_DEV_MUTEX_T_DTB, queue_id, &p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dev_dtb_opr_mutex_get"); + + rc = zxic_comm_mutex_lock(p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev),rc,"zxic_comm_mutex_lock"); + + /* + * 流程 + * 0.检测队列是否使能 + * 1.检测当前队列是否已初始化; + * 2.获取硬件队列剩余情况,大于0正常下发,等于0返回失败; + * 3.获取软件缓存空闲情况; + * 4.将下表配置数据填入buff中; + * 5.将ack字段填入0x11111100; + * 6.将数据信息填入硬件触发寄存器中; + * + */ +#if 0 + if(dpp_dtb_mode_is_debug(dev)) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "the queue %d is open debug mode!", queue_id); + rc = zxic_comm_mutex_unlock(p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "zxic_comm_mutex_unlock"); + return DPP_RC_DTB_OPEN_DEBUG_MODE; + } +#endif + + rc = dpp_dtb_queue_enable_get(dev, queue_id, &queue_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_dtb_queue_enable_get", p_mutex); + if(!queue_en) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "the slot %d queue %d is not enable!", DEV_PCIE_SLOT(dev), queue_id); + rc = zxic_comm_mutex_unlock(p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev),rc,"zxic_comm_mutex_unlock"); + return DPP_RC_DTB_QUEUE_NOT_ENABLE; + } + + if(DPP_DTB_QUEUE_INIT_FLAG_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id) == 0) + { + ZXIC_COMM_TRACE_ERROR("dtb slot %d queue %d is not init.\n", DEV_PCIE_SLOT(dev), queue_id); + rc = zxic_comm_mutex_unlock(p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev),rc,"zxic_comm_mutex_unlock"); + return DPP_RC_DTB_QUEUE_IS_NOT_INIT; + } + + if (data_len % 4 != 0) + { + rc = zxic_comm_mutex_unlock(p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev),rc,"zxic_comm_mutex_unlock"); + /* 硬件规定数据必须是16字节为单位 */ + return DPP_RC_DTB_PARA_INVALID; + } + + rc = dpp_dtb_queue_unused_item_num_get(dev, queue_id, &unused_item_num); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_dtb_queue_unused_item_num_get", p_mutex); + + if (unused_item_num == 0) + { + rc = zxic_comm_mutex_unlock(p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev),rc,"zxic_comm_mutex_unlock"); + return DPP_RC_DTB_QUEUE_ITEM_HW_EMPTY; + } + + for (i = 0; i < DPP_DTB_QUEUE_ITEM_NUM_MAX; i++) + { + item_index = DPP_DTB_TAB_DOWN_WR_INDEX_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id) % DPP_DTB_QUEUE_ITEM_NUM_MAX; + + rc = dpp_dtb_item_ack_rd(dev, queue_id, DPP_DTB_DIR_DOWN_TYPE, item_index, 0, &ack_vale); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_dtb_item_ack_rd", p_mutex); + + DPP_DTB_TAB_DOWN_WR_INDEX_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id)++; + + if ((ack_vale >> 8) == DPP_DTB_TAB_ACK_UNUSED_MASK) + { + break; + } + } + + if (i == DPP_DTB_QUEUE_ITEM_NUM_MAX) + { + rc = zxic_comm_mutex_unlock(p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev),rc,"zxic_comm_mutex_unlock"); + return DPP_RC_DTB_QUEUE_ITEM_SW_EMPTY; + } + + rc = dpp_dtb_item_buff_wr(dev, queue_id, DPP_DTB_DIR_DOWN_TYPE, item_index, 0, data_len, p_data); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_dtb_item_buff_wr", p_mutex); + + rc = dpp_dtb_item_ack_wr(dev, queue_id, DPP_DTB_DIR_DOWN_TYPE, item_index, 0, DPP_DTB_TAB_ACK_IS_USING_MASK); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_dtb_item_ack_wr", p_mutex); + + item_info.cmd_vld = 1; + item_info.cmd_type = DPP_DTB_DIR_DOWN_TYPE; + item_info.int_en = int_flag; + item_info.data_len = data_len / 4; + item_info.data_hddr = ((DPP_DTB_TAB_DOWN_PHY_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, item_index)>>4)>>32) & 0xffffffff; + item_info.data_laddr = (DPP_DTB_TAB_DOWN_PHY_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, item_index)>>4) & 0xffffffff; + + if(item_info.data_len < DPP_DTB_LEN_MIN || item_info.data_len > DPP_DTB_DOWN_LEN) + { + ZXIC_COMM_PRINT("DTB DATA_LEN :0x%08x.\n",item_info.data_len); + rc = dpp_dtb_item_ack_wr(dev, queue_id, DPP_DTB_DIR_DOWN_TYPE, item_index, 0, DPP_DTB_TAB_ACK_UNUSED_MASK); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_item_ack_wr"); + rc = zxic_comm_mutex_unlock(p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev),rc,"zxic_comm_mutex_unlock"); + return DPP_RC_DTB_PARA_INVALID; + } + + if(dpp_dtb_prt_get()) + { + dpp_dtb_info_print(dev, queue_id, item_index, &item_info); + } + + if(DPP_DEV_TYPE_SIM == dpp_dev_get_dev_type(DEV_ID(dev))) + { + *p_item_index = item_index; + rc = zxic_comm_mutex_unlock(p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev),rc,"zxic_comm_mutex_unlock"); + return DPP_OK; + } + + if(dpp_dtb_soft_perf_test_get()) + { + *p_item_index = item_index; + rc = zxic_comm_mutex_unlock(p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev),rc,"zxic_comm_mutex_unlock"); + return DPP_OK; + } + + rc = dpp_dtb_queue_item_info_set(dev, queue_id, &item_info); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_dtb_queue_item_info_set", p_mutex); + *p_item_index = item_index; + + rc = zxic_comm_mutex_unlock(p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev),rc,"zxic_comm_mutex_unlock"); + + return DPP_OK; +} + +/***********************************************************/ +/** 打印下表队列中指定元素的地址、ACK及下表中前768bit的数据 +* @param dev_id 芯片的id号 +* @param queue_id 队列号,范围0-127 +* @param element_id 元素号,范围0-31 +* +* @return +* @remark 无 +* @see +* @author zab @date 2022/08/30 +************************************************************/ +ZXIC_UINT32 dpp_dtb_down_table_element_info_prt(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 element_id) +{ + ZXIC_UINT32 rc = 0; + + ZXIC_UINT32 element_start_addr_h = 0; + ZXIC_UINT32 element_start_addr_l = 0; + ZXIC_UINT32 element_table_addr_h = 0; + ZXIC_UINT32 element_table_addr_l = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), element_id, 0, DPP_DTB_QUEUE_ITEM_NUM_MAX - 1); + + rc = dpp_dtb_down_table_elemet_addr_get(dev, + queue_id, + element_id, + &element_start_addr_h, + &element_start_addr_l, + &element_table_addr_h, + &element_table_addr_l); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_elemet_addr_get"); + + ZXIC_COMM_DBGCNT32_PRINT("slot_id", DEV_PCIE_SLOT(dev)); + ZXIC_COMM_DBGCNT32_PRINT("queue_id", queue_id); + ZXIC_COMM_DBGCNT32_PRINT("element_id", element_id); + ZXIC_COMM_DBGCNT32_PRINT("element_start_addr_h", element_start_addr_h); + ZXIC_COMM_DBGCNT32_PRINT("element_start_addr_l", element_start_addr_l); + ZXIC_COMM_DBGCNT32_PRINT("element_table_addr_h", element_table_addr_h); + ZXIC_COMM_DBGCNT32_PRINT("element_table_addr_l", element_table_addr_l); + + /*打印element ack*/ + rc = dpp_dtb_item_ack_prt(dev, queue_id, DPP_DTB_DIR_DOWN_TYPE, element_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_item_ack_prt"); + + rc = dpp_dtb_item_buff_prt(dev, queue_id, DPP_DTB_DIR_DOWN_TYPE, element_id, 24); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_item_buff_prt"); + + return DPP_OK; +} + +/***********************************************************/ +/** 一个元素down成功状态检查 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列号,范围0-31 +* @param element_id 条目编号 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_tab_down_success_status_check(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 element_id) +{ + ZXIC_UINT32 rc = 0; + ZXIC_UINT32 rd_cnt = 0; + ZXIC_UINT32 ack_value = 0; + ZXIC_UINT32 success_flag = 0; + ZXIC_UINT32 dtb_interrupt_status = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), element_id, 0, DPP_DTB_QUEUE_ITEM_NUM_MAX - 1); + + dtb_interrupt_status = dpp_dtb_interrupt_status_get(); + + if(DPP_DEV_TYPE_SIM == dpp_dev_get_dev_type(DEV_ID(dev))) + { + rc = dpp_dtb_item_ack_wr(dev, queue_id, DPP_DTB_DIR_DOWN_TYPE, element_id, 0, DPP_DTB_TAB_ACK_UNUSED_MASK); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_item_ack_wr"); + return rc; + } + + if(dpp_dtb_soft_perf_test_get() || dpp_dtb_hardware_perf_test_get()) + { + rc = dpp_dtb_item_ack_wr(dev, queue_id, DPP_DTB_DIR_DOWN_TYPE, element_id, 0, DPP_DTB_TAB_ACK_UNUSED_MASK); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_item_ack_wr"); + return rc; + } + + if(dpp_dtb_debug_fun_get()) + { + return DPP_OK; + } + + while(!success_flag) + { + rc = dpp_dtb_item_ack_rd(dev, queue_id, DPP_DTB_DIR_DOWN_TYPE, element_id, 0, &ack_value); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_item_ack_rd"); + + ZXIC_COMM_TRACE_DEBUG("dpp_dtb_item_ack_rd ack_value:0x%08x\n", ack_value); + + if (((ack_value >> 8) & 0xffffff) == DPP_DTB_TAB_DOWN_ACK_VLD_MASK) + { + success_flag = 1; + break; + } + + if (rd_cnt > dpp_dtb_down_table_overtime_get()) + { + ZXIC_COMM_TRACE_ERROR("Error!!! dpp dtb down slot [%d] vport [0x%x] queue [%d] item [%d] ack success is overtime!\n", DEV_PCIE_SLOT(dev), DEV_PCIE_VPORT(dev), queue_id, element_id); + + ZXIC_COMM_PRINT("-------------------------------------------------------------------\n"); + ZXIC_COMM_PRINT(" dtb down table info \n"); + ZXIC_COMM_PRINT("-------------------------------------------------------------------\n"); + rc = dpp_dtb_down_table_element_info_prt(dev, queue_id, element_id); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_down_table_element_info_prt"); + + rc = dpp_dtb_item_ack_wr(dev, queue_id, DPP_DTB_DIR_DOWN_TYPE, element_id, 0, DPP_DTB_TAB_ACK_UNUSED_MASK); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_item_ack_wr"); + + ZXIC_COMM_PRINT("-------------------------------------------------------------------\n"); + ZXIC_COMM_PRINT(" dtb reg info \n"); + ZXIC_COMM_PRINT("-------------------------------------------------------------------\n"); + + rc = diag_dpp_dtb_axi_last_operate_info_prt(dev); + ZXIC_COMM_CHECK_DEV_RC(0, rc, "diag_dpp_dtb_axi_last_operate_info_prt"); + + rc = diag_dpp_dtb_channels_state_info_prt(dev); + ZXIC_COMM_CHECK_DEV_RC(0, rc, "diag_dpp_dtb_channels_state_info_prt"); + + rc = diag_dpp_dtb_channels_axi_resp_err_cnt_prt(dev); + ZXIC_COMM_CHECK_DEV_RC(0, rc, "diag_dpp_dtb_channels_axi_resp_err_cnt_prt"); + + return DPP_RC_DTB_OVER_TIME; + } + + rd_cnt++; + zxic_comm_udelay(1); + } + + if (dtb_interrupt_status) + { + /*清中断*/ + rc = dpp_dtb_finish_interrupt_event_state_clr(dev, queue_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_finish_interrupt_event_state_clr"); + } + + if ((ack_value & 0xff) != DPP_DTB_TAB_ACK_SUCCESS_MASK) + { + rc = dpp_dtb_item_ack_wr(dev, queue_id, DPP_DTB_DIR_DOWN_TYPE, element_id, 0, DPP_DTB_TAB_ACK_UNUSED_MASK); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_item_ack_wr"); + return ack_value & 0xff; + } + + rc = dpp_dtb_item_ack_wr(dev, queue_id, DPP_DTB_DIR_DOWN_TYPE, element_id, 0, DPP_DTB_TAB_ACK_UNUSED_MASK); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_item_ack_wr"); + + return rc; +} + +#endif +#if ZXIC_REAL("TAB_UP") +/***********************************************************/ +/** dump队列空闲条目获取 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列号,范围0-31 +* @param p_item_index 返回使用的条目编号 +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_tab_up_free_item_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 *p_item_index) +{ + ZXIC_UINT32 rc = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 ack_vale = 0; + ZXIC_UINT32 item_index = 0; + ZXIC_UINT32 unused_item_num = 0; + ZXIC_MUTEX_T *p_mutex = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_item_index); + + rc = dpp_dev_dtb_opr_mutex_get(DEV_ID(dev), DPP_DEV_MUTEX_T_DTB, queue_id, &p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dev_dtb_opr_mutex_get"); + + rc = zxic_comm_mutex_lock(p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev),rc,"zxic_comm_mutex_lock"); + + /* + * 流程 + * 1.获取硬件队列剩余情况,大于0正常上送,等于0返回失败; + * 2.获取软件缓存空闲情况; + * + */ + if(DPP_DTB_QUEUE_INIT_FLAG_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id) == 0) + { + ZXIC_COMM_TRACE_ERROR("dtb slot %d queue %d is not init.\n", DEV_PCIE_SLOT(dev), queue_id); + rc = zxic_comm_mutex_unlock(p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev),rc,"zxic_comm_mutex_unlock"); + return DPP_RC_DTB_QUEUE_IS_NOT_INIT; + } + + rc = dpp_dtb_queue_unused_item_num_get(dev, queue_id, &unused_item_num); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_dtb_queue_unused_item_num_get", p_mutex); + + if (unused_item_num == 0) + { + rc = zxic_comm_mutex_unlock(p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev),rc,"zxic_comm_mutex_unlock"); + return DPP_RC_DTB_QUEUE_ITEM_HW_EMPTY; + } + + for (i = 0; i < DPP_DTB_QUEUE_ITEM_NUM_MAX; i++) + { + item_index = DPP_DTB_TAB_UP_WR_INDEX_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id) % DPP_DTB_QUEUE_ITEM_NUM_MAX; + + rc = dpp_dtb_item_ack_rd(dev, queue_id, DPP_DTB_DIR_UP_TYPE, item_index, 0, &ack_vale); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_dtb_item_ack_rd", p_mutex); + + DPP_DTB_TAB_UP_WR_INDEX_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id)++; + + if ((ack_vale >> 8) == DPP_DTB_TAB_ACK_UNUSED_MASK) + { + break; + } + } + + if (i == DPP_DTB_QUEUE_ITEM_NUM_MAX) + { + rc = zxic_comm_mutex_unlock(p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev),rc,"zxic_comm_mutex_unlock"); + return DPP_RC_DTB_QUEUE_ITEM_SW_EMPTY; + } + + rc = dpp_dtb_item_ack_wr(dev, queue_id, DPP_DTB_DIR_UP_TYPE, item_index, 0, DPP_DTB_TAB_ACK_IS_USING_MASK); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_dtb_item_buff_wr", p_mutex); + + *p_item_index = item_index; + + rc = zxic_comm_mutex_unlock(p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev),rc,"zxic_comm_mutex_unlock"); + + return DPP_OK; +} + +/***********************************************************/ +/** 获取dump指定条目物理地址 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列编号,范围:0-127 +* @param item_index 条目编号,范围0-31 +* @param p_phy_haddr 物理地址高32bit +* @param p_phy_laddr 物理地址低32bit +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_tab_up_item_addr_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 item_index, + ZXIC_UINT32 *p_phy_haddr, + ZXIC_UINT32 *p_phy_laddr) +{ + ZXIC_ADDR_T addr = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), item_index, 0, DPP_DTB_QUEUE_ITEM_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_phy_haddr); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_phy_laddr); + + if(DPP_DTB_QUEUE_INIT_FLAG_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id) == 0) + { + ZXIC_COMM_TRACE_ERROR("dtb slot %d queue %d is not init.\n", DEV_PCIE_SLOT(dev), queue_id); + return DPP_RC_DTB_QUEUE_IS_NOT_INIT; + } + + if (DPP_DTB_TAB_UP_USER_PHY_ADDR_FLAG_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, item_index) == DPP_DTB_TAB_UP_USER_ADDR_TYPE) + { + addr = DPP_DTB_TAB_UP_USER_PHY_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, item_index); + } + else + { + addr = DPP_DTB_TAB_UP_PHY_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, item_index) + DPP_DTB_ITEM_ACK_SIZE; + } + + + /*将地址转换成16字节为单位*/ + // addr = addr >> 4; + + *p_phy_haddr = (addr >> 32) & 0xffffffff; + *p_phy_laddr = addr & 0xffffffff; + + return DPP_OK; +} + +/***********************************************************/ +/** 获取指定dump条目一定地址偏移的物理地址 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列编号,范围:0-127 +* @param item_index 条目编号,范围0-31 +* @param p_phy_haddr 物理地址高32bit +* @param p_phy_laddr 物理地址低32bit +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_tab_up_item_offset_addr_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 item_index, + ZXIC_UINT32 addr_offset, + ZXIC_UINT32 *p_phy_haddr, + ZXIC_UINT32 *p_phy_laddr) +{ + ZXIC_ADDR_T addr = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), item_index, 0, DPP_DTB_QUEUE_ITEM_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_phy_haddr); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_phy_laddr); + + if(DPP_DTB_QUEUE_INIT_FLAG_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id) == 0) + { + ZXIC_COMM_TRACE_ERROR("dtb slot %d queue %d is not init.\n", DEV_PCIE_SLOT(dev), queue_id); + return DPP_RC_DTB_QUEUE_IS_NOT_INIT; + } + + if (DPP_DTB_TAB_UP_USER_PHY_ADDR_FLAG_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, item_index) == DPP_DTB_TAB_UP_USER_ADDR_TYPE) + { + addr = DPP_DTB_TAB_UP_USER_PHY_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, item_index); + } + else + { + addr = DPP_DTB_TAB_UP_PHY_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, item_index) + DPP_DTB_ITEM_ACK_SIZE; + } + + addr = addr + addr_offset; + + *p_phy_haddr = (addr >> 32) & 0xffffffff; + *p_phy_laddr = addr & 0xffffffff; + + return DPP_OK; +} + +/***********************************************************/ +/** 设置dump指定条目空间地址,用于用户自定义空间传输 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列编号,范围:0-127 +* @param item_index 条目编号,范围0-31 +* @param phy_haddr 物理地址高 +* @param vir_laddr 虚拟地址低 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_tab_up_item_user_addr_set(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 item_index, + ZXIC_ADDR_T phy_addr, + ZXIC_ADDR_T vir_addr) +{ + DPP_DTB_MGR_T *p_dtb_mgr = ZXIC_NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), item_index, 0, DPP_DTB_QUEUE_ITEM_NUM_MAX - 1); + + p_dtb_mgr = dpp_dtb_mgr_get(DEV_PCIE_SLOT(dev), DEV_ID(dev)); + if (p_dtb_mgr == ZXIC_NULL) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "slot %d ErrorCode[0x%x]: DTB Manager is not exist!!!\n", DEV_PCIE_SLOT(dev), DPP_RC_DTB_MGR_NOT_EXIST); + return DPP_RC_DTB_MGR_NOT_EXIST; + } + + if(DPP_DTB_QUEUE_INIT_FLAG_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id) == 0) + { + ZXIC_COMM_TRACE_ERROR("dtb slot %d queue %d is not init.\n", DEV_PCIE_SLOT(dev), queue_id); + return DPP_RC_DTB_QUEUE_IS_NOT_INIT; + } + + p_dtb_mgr->queue_info[queue_id].tab_up.user_addr[item_index].phy_addr = phy_addr; + p_dtb_mgr->queue_info[queue_id].tab_up.user_addr[item_index].vir_addr = vir_addr; + p_dtb_mgr->queue_info[queue_id].tab_up.user_addr[item_index].user_flag = DPP_DTB_TAB_UP_USER_ADDR_TYPE; + + return DPP_OK; +} + +/***********************************************************/ +/** 清除用户dump指定条目空间地址 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列编号,范围:0-127 +* @param item_index 条目编号,范围0-31 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_tab_up_item_user_addr_clr(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 item_index) +{ + DPP_DTB_MGR_T *p_dtb_mgr = ZXIC_NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), item_index, 0, DPP_DTB_QUEUE_ITEM_NUM_MAX - 1); + + p_dtb_mgr = dpp_dtb_mgr_get(DEV_PCIE_SLOT(dev), DEV_ID(dev)); + if (p_dtb_mgr == ZXIC_NULL) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "slot %d ErrorCode[0x%x]: DTB Manager is not exist!!!\n", DEV_PCIE_SLOT(dev), DPP_RC_DTB_MGR_NOT_EXIST); + return DPP_RC_DTB_MGR_NOT_EXIST; + } + + if(DPP_DTB_QUEUE_INIT_FLAG_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id) == 0) + { + ZXIC_COMM_TRACE_ERROR("dtb slot %d queue %d is not init.\n", DEV_PCIE_SLOT(dev), queue_id); + return DPP_RC_DTB_QUEUE_IS_NOT_INIT; + } + + p_dtb_mgr->queue_info[queue_id].tab_up.user_addr[item_index].phy_addr = 0; + p_dtb_mgr->queue_info[queue_id].tab_up.user_addr[item_index].vir_addr = 0; + p_dtb_mgr->queue_info[queue_id].tab_up.user_addr[item_index].user_flag = DPP_DTB_TAB_UP_NOUSER_ADDR_TYPE; + + return DPP_OK; +} + + +/***********************************************************/ +/** dump配置描述符信息设置 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列号,范围0-31 +* @param item_index 返回使用的条目编号 +* @param int_flag 中断标志,0-无,1-有 +* @param data_len 数据长度,单位32bit; +* @param desc_len 描述符长度,单位32bit; +* @param p_desc_data 待下发描述符 +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_tab_up_info_set(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 item_index, + ZXIC_UINT32 int_flag, + ZXIC_UINT32 data_len, + ZXIC_UINT32 desc_len, + ZXIC_UINT32 *p_desc_data) +{ + ZXIC_UINT32 rc = 0; + ZXIC_UINT32 queue_en = 0; + DPP_DTB_QUEUE_ITEM_INFO_T item_info = {0}; + ZXIC_MUTEX_T *p_mutex = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), item_index, 0, DPP_DTB_QUEUE_ITEM_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), desc_len, 0, 0x400); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), int_flag, 0, 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_desc_data); + + rc = dpp_dev_dtb_opr_mutex_get(DEV_ID(dev), DPP_DEV_MUTEX_T_DTB, queue_id, &p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dev_dtb_opr_mutex_get"); + + rc = zxic_comm_mutex_lock(p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev),rc,"zxic_comm_mutex_lock"); + + /* + * 流程 + * 0.检测队列是否使能 + * 1.获取硬件队列剩余情况,大于0正常下发,等于0返回失败; + * 2.获取软件缓存空闲情况; + * 3.将dump描述符写入buff中; + * 4.将ack字段填入0x11111100; + * 5.将数据信息填入硬件触发寄存器中; + * + */ +#if 0 + if(dpp_dtb_mode_is_debug(dev)) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "the queue %d is open debug mode!", queue_id); + rc = zxic_comm_mutex_unlock(p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "zxic_comm_mutex_unlock"); + return DPP_RC_DTB_OPEN_DEBUG_MODE; + } +#endif + + rc = dpp_dtb_queue_enable_get(dev, queue_id, &queue_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_dtb_queue_enable_get", p_mutex); + if(!queue_en) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "the slot %d queue %d is not enable!", DEV_PCIE_SLOT(dev), queue_id); + rc = zxic_comm_mutex_unlock(p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev),rc,"zxic_comm_mutex_unlock"); + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "the queue %d is not enable!", queue_id); + return DPP_RC_DTB_QUEUE_NOT_ENABLE; + } + + if(DPP_DTB_QUEUE_INIT_FLAG_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id) == 0) + { + ZXIC_COMM_TRACE_ERROR("dtb slot %d queue %d is not init.\n", DEV_PCIE_SLOT(dev), queue_id); + rc = zxic_comm_mutex_unlock(p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev),rc,"zxic_comm_mutex_unlock"); + return DPP_RC_DTB_QUEUE_IS_NOT_INIT; + } + + if (desc_len % 4 != 0) + { + rc = zxic_comm_mutex_unlock(p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev),rc,"zxic_comm_mutex_unlock"); + /* 硬件规定数据必须是16字节为单位 */ + return DPP_RC_DTB_PARA_INVALID; + } + + rc = dpp_dtb_item_buff_wr(dev, queue_id, DPP_DTB_DIR_UP_TYPE, item_index, 0, desc_len, p_desc_data); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_dtb_item_buff_wr", p_mutex); + + + rc = dpp_dtb_item_ack_wr(dev, queue_id, DPP_DTB_DIR_UP_TYPE, item_index, 0, DPP_DTB_TAB_ACK_IS_USING_MASK); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_dtb_item_ack_wr", p_mutex); + + + DPP_DTB_TAB_UP_DATA_LEN_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, item_index) = data_len; + + item_info.cmd_vld = 1; + item_info.cmd_type = DPP_DTB_DIR_UP_TYPE; + item_info.int_en = int_flag; + item_info.data_len = desc_len / 4; + item_info.data_hddr = ((DPP_DTB_TAB_UP_PHY_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, item_index)>>4) >> 32) & 0xffffffff; + item_info.data_laddr = (DPP_DTB_TAB_UP_PHY_ADDR_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id, item_index)>>4) & 0xffffffff; + + if(dpp_dtb_prt_get()) + { + dpp_dtb_info_print(dev, queue_id, item_index, &item_info); + } + + if(DPP_DEV_TYPE_SIM == dpp_dev_get_dev_type(DEV_ID(dev))) + { + rc = zxic_comm_mutex_unlock(p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev),rc,"zxic_comm_mutex_unlock"); + return DPP_OK; + } + + rc = dpp_dtb_queue_item_info_set(dev, queue_id, &item_info); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_dtb_queue_item_info_set", p_mutex); + + rc = zxic_comm_mutex_unlock(p_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev),rc,"zxic_comm_mutex_unlock"); + + return DPP_OK; +} + +/***********************************************************/ +/** 打印队列中指定元素的dump地址、ACK及下表中前768bit的数据 +* @param dev_id 芯片的id号 +* @param queue_id 队列号,范围0-127 +* @param element_id 元素号,范围0-31 +* +* @return +* @remark 无 +* @see +* @author zab @date 2022/08/30 +************************************************************/ +ZXIC_UINT32 dpp_dtb_dump_table_element_info_prt(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 element_id) +{ + ZXIC_UINT32 rc = 0; + + ZXIC_UINT32 element_start_addr_h = 0; + ZXIC_UINT32 element_start_addr_l = 0; + ZXIC_UINT32 element_dump_addr_h = 0; + ZXIC_UINT32 element_dump_addr_l = 0; + ZXIC_UINT32 element_table_info_addr_h = 0; + ZXIC_UINT32 element_table_info_addr_l = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), element_id, 0, DPP_DTB_QUEUE_ITEM_NUM_MAX - 1); + + rc = dpp_dtb_dump_table_elemet_addr_get(dev, + queue_id, + element_id, + &element_start_addr_h, + &element_start_addr_l, + &element_dump_addr_h, + &element_dump_addr_l, + &element_table_info_addr_h, + &element_table_info_addr_l); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_dump_table_elemet_addr_get"); + + ZXIC_COMM_DBGCNT32_PRINT("slot_id", DEV_PCIE_SLOT(dev)); + ZXIC_COMM_DBGCNT32_PRINT("queue_id", queue_id); + ZXIC_COMM_DBGCNT32_PRINT("element_id", element_id); + ZXIC_COMM_DBGCNT32_PRINT("element_start_addr_h", element_start_addr_h); + ZXIC_COMM_DBGCNT32_PRINT("element_start_addr_l", element_start_addr_l); + ZXIC_COMM_DBGCNT32_PRINT("element_dump_addr_h", element_dump_addr_h); + ZXIC_COMM_DBGCNT32_PRINT("element_dump_addr_l", element_dump_addr_l); + ZXIC_COMM_DBGCNT32_PRINT("element_table_info_addr_h", element_table_info_addr_h); + ZXIC_COMM_DBGCNT32_PRINT("element_table_info_addr_l", element_table_info_addr_l); + + /*打印element ack*/ + rc = dpp_dtb_item_ack_prt(dev, queue_id, DPP_DTB_DIR_UP_TYPE, element_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_item_ack_prt"); + + rc = dpp_dtb_item_buff_prt(dev, queue_id, DPP_DTB_DIR_UP_TYPE, element_id, 32); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_item_buff_prt"); + + return DPP_OK; +} + +/***********************************************************/ +/** 一个元素dump成功状态检查 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列号,范围0-31 +* @param element_id 条目编号 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_tab_up_success_status_check(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 element_id) +{ + ZXIC_UINT32 rc = 0; + ZXIC_UINT32 rd_cnt = 0; + ZXIC_UINT32 ack_value = 0; + ZXIC_UINT32 success_flag = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), element_id, 0, DPP_DTB_QUEUE_ITEM_NUM_MAX - 1); + + if(DPP_DEV_TYPE_SIM == dpp_dev_get_dev_type(DEV_ID(dev))) + { + return rc; + } + + if(dpp_dtb_soft_perf_test_get() || dpp_dtb_hardware_perf_test_get()) + { + return rc; + } + + while(!success_flag) + { + rc = dpp_dtb_item_ack_rd(dev, queue_id, DPP_DTB_DIR_UP_TYPE, element_id, 0, &ack_value); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_item_ack_rd"); + + if ((((ack_value >> 8) & 0xffffff) == DPP_DTB_TAB_UP_ACK_VLD_MASK) && + ((ack_value & 0xff) == DPP_DTB_TAB_ACK_SUCCESS_MASK)) + { + success_flag = 1; + break; + } + + if (rd_cnt > dpp_dtb_dump_table_overtime_get()) + { + ZXIC_COMM_TRACE_ERROR("Error!!! dpp dtb dump slot [%d] vport [0x%x] queue [%d] item [%d] ack success is overtime!\n", DEV_PCIE_SLOT(dev), DEV_PCIE_VPORT(dev), queue_id, element_id); + + ZXIC_COMM_PRINT("-------------------------------------------------------------------\n"); + ZXIC_COMM_PRINT(" dtb dump table info \n"); + ZXIC_COMM_PRINT("-------------------------------------------------------------------\n"); + rc = dpp_dtb_dump_table_element_info_prt(dev, queue_id, element_id); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_dump_table_element_info_prt"); + + rc = dpp_dtb_item_ack_wr(dev, queue_id, DPP_DTB_DIR_UP_TYPE, element_id, 0, DPP_DTB_TAB_ACK_UNUSED_MASK); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_item_ack_wr"); + + ZXIC_COMM_PRINT("-------------------------------------------------------------------\n"); + ZXIC_COMM_PRINT(" dtb reg info \n"); + ZXIC_COMM_PRINT("-------------------------------------------------------------------\n"); + + rc = diag_dpp_dtb_axi_last_operate_info_prt(dev); + ZXIC_COMM_CHECK_DEV_RC(0, rc, "diag_dpp_dtb_axi_last_operate_info_prt"); + + rc = diag_dpp_dtb_channels_state_info_prt(dev); + ZXIC_COMM_CHECK_DEV_RC(0, rc, "diag_dpp_dtb_channels_state_info_prt"); + + rc = diag_dpp_dtb_channels_axi_resp_err_cnt_prt(dev); + ZXIC_COMM_CHECK_DEV_RC(0, rc, "diag_dpp_dtb_channels_axi_resp_err_cnt_prt"); + + return DPP_ERR; + } + + rd_cnt++; + zxic_comm_udelay(1); + } + + return rc; +} + +/***********************************************************/ +/** 获取dump数据 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列号,范围0-31 +* @param item_index 数据对应的的条目编号 +* @param data_len 数据长度,单位32bit; +* @param p_data dump数据 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_tab_up_data_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 item_index, + ZXIC_UINT32 data_len, + ZXIC_UINT32 *p_data) +{ + ZXIC_UINT32 rc = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), item_index, 0, DPP_DTB_QUEUE_ITEM_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data); + + if(DPP_DTB_QUEUE_INIT_FLAG_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id) == 0) + { + ZXIC_COMM_TRACE_ERROR("dtb slot %d queue %d is not init.\n", DEV_PCIE_SLOT(dev), queue_id); + return DPP_RC_DTB_QUEUE_IS_NOT_INIT; + } + + if(dpp_dtb_hardware_perf_test_get()) + { + return rc; + } + + rc = dpp_dtb_item_buff_rd(dev, + queue_id, + DPP_DTB_DIR_UP_TYPE, + item_index, + 0, + data_len, + p_data); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_item_buff_rd"); + + if(dpp_dtb_debug_fun_get()) + { + return DPP_OK; + } + + rc = dpp_dtb_item_ack_wr(dev, queue_id, DPP_DTB_DIR_UP_TYPE, item_index, 0, DPP_DTB_TAB_ACK_UNUSED_MASK); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_item_ack_wr"); + + return DPP_OK; +} + +#endif +/***********************************************************/ +/** dtb队列down初始化 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列号 +* @param p_queue_cfg 队列配置参数,具体见DPP_DTB_QUEUE_CFG_T结构体类型 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_down_init(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + DPP_DTB_QUEUE_CFG_T *p_queue_cfg) +{ + ZXIC_UINT32 rc = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 ack_vale = 0; + ZXIC_UINT32 tab_down_item_size = 0; + DPP_DTB_MGR_T *p_dtb_mgr = ZXIC_NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_queue_cfg); + + p_dtb_mgr = dpp_dtb_mgr_get(DEV_PCIE_SLOT(dev), DEV_ID(dev)); + if (p_dtb_mgr == ZXIC_NULL) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "slot %d ErrorCode[0x%x]: DTB Manager is not exist!!!\n", DEV_PCIE_SLOT(dev), DPP_RC_DTB_MGR_NOT_EXIST); + return DPP_RC_DTB_MGR_NOT_EXIST; + } + + /* + * 流程: + * 1.寻找空闲队列; + * 2.若找到: + * 1)配置硬件信息; + * 2)配置软件缓存信息; + * 3)初始化条目ack缓存信息,空闲约定:up-0x000000XX,down-0x000000XX; + * 忙约定:up-0x111111XX,down-0x111111XX; + * 完成约定:up-0x555555XX,down-0x5a5a5aXX; + * 3.若未找到:返回错误信息; + */ + + p_dtb_mgr->queue_info[queue_id].init_flag = 1; + p_dtb_mgr->queue_info[queue_id].slot_id = DEV_PCIE_SLOT(dev); + p_dtb_mgr->queue_info[queue_id].vport = DEV_PCIE_VPORT(dev); + + tab_down_item_size = (p_queue_cfg->down_item_size == 0) ? DPP_DTB_ITEM_SIZE : p_queue_cfg->down_item_size; + + p_dtb_mgr->queue_info[queue_id].tab_down.item_size = tab_down_item_size; + p_dtb_mgr->queue_info[queue_id].tab_down.start_phy_addr = p_queue_cfg->down_start_phy_addr; + p_dtb_mgr->queue_info[queue_id].tab_down.start_vir_addr = p_queue_cfg->down_start_vir_addr; + p_dtb_mgr->queue_info[queue_id].tab_down.wr_index = 0; + p_dtb_mgr->queue_info[queue_id].tab_down.rd_index = 0; + + for (i = 0; i < DPP_DTB_QUEUE_ITEM_NUM_MAX; i++) + { + rc = dpp_dtb_item_ack_wr(dev, queue_id, DPP_DTB_DIR_DOWN_TYPE, i, 0, DPP_DTB_TAB_ACK_CHECK_VALUE); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_item_ack_wr"); + } + + for(i = 0; i < DPP_DTB_QUEUE_ITEM_NUM_MAX; i++) + { + rc = dpp_dtb_item_ack_rd(dev, queue_id, DPP_DTB_DIR_DOWN_TYPE, i, 0, &ack_vale); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_item_ack_rd"); + if(ack_vale != DPP_DTB_TAB_ACK_CHECK_VALUE) + { + ZXIC_COMM_PRINT("dtb slot [%d] queue [%d] down init faild, mem err!!!\n", DEV_PCIE_SLOT(dev), queue_id); + return DPP_RC_DTB_MEMORY_ALLOC_ERR; + } + } + + ZXIC_COMM_PRINT("dtb slot [%d] queue [%d] down init success!!!\n", DEV_PCIE_SLOT(dev), queue_id); + + ZXIC_COMM_MEMSET((ZXIC_UINT8 *)(p_queue_cfg->down_start_vir_addr), 0, tab_down_item_size * DPP_DTB_QUEUE_ITEM_NUM_MAX); + + return DPP_OK; +} + +/***********************************************************/ +/** dtb队列dump初始化 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列号 +* @param p_queue_cfg 队列配置参数,具体见DPP_DTB_QUEUE_CFG_T结构体类型 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_dump_init(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + DPP_DTB_QUEUE_CFG_T *p_queue_cfg) +{ + ZXIC_UINT32 rc = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 ack_vale = 0; + ZXIC_UINT32 tab_up_item_size = 0; + DPP_DTB_MGR_T *p_dtb_mgr = ZXIC_NULL; + ZXIC_UINT32 slot_id = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_queue_cfg); + + slot_id = (ZXIC_UINT32)DEV_PCIE_SLOT(dev); + ZXIC_COMM_CHECK_INDEX(slot_id, 0, DPP_DEV_SLOT_MAX - 1); + + p_dtb_mgr = dpp_dtb_mgr_get(slot_id, DEV_ID(dev)); + if (p_dtb_mgr == ZXIC_NULL) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "slot %d ErrorCode[0x%x]: DTB Manager is not exist!!!\n", DEV_PCIE_SLOT(dev), DPP_RC_DTB_MGR_NOT_EXIST); + return DPP_RC_DTB_MGR_NOT_EXIST; + } + + /* + * 流程: + * 1.寻找空闲队列; + * 2.若找到: + * 1)配置硬件信息; + * 2)配置软件缓存信息; + * 3)初始化条目ack缓存信息,空闲约定:up-0x000000XX,down-0x000000XX; + * 忙约定:up-0x111111XX,down-0x111111XX; + * 完成约定:up-0x555555XX,down-0x5a5a5aXX; + * 3.若未找到:返回错误信息; + */ + + p_dtb_mgr->queue_info[queue_id].init_flag = 1; + p_dtb_mgr->queue_info[queue_id].slot_id = DEV_PCIE_SLOT(dev); + p_dtb_mgr->queue_info[queue_id].vport = DEV_PCIE_VPORT(dev); + + tab_up_item_size = (p_queue_cfg->up_item_size == 0) ? DPP_DTB_ITEM_SIZE : p_queue_cfg->up_item_size; + + p_dtb_mgr->queue_info[queue_id].tab_up.item_size = tab_up_item_size; + p_dtb_mgr->queue_info[queue_id].tab_up.start_phy_addr = p_queue_cfg->up_start_phy_addr; + p_dtb_mgr->queue_info[queue_id].tab_up.start_vir_addr = p_queue_cfg->up_start_vir_addr; + p_dtb_mgr->queue_info[queue_id].tab_up.wr_index = 0; + p_dtb_mgr->queue_info[queue_id].tab_up.rd_index = 0; + + for (i = 0; i < DPP_DTB_QUEUE_ITEM_NUM_MAX; i++) + { + rc = dpp_dtb_item_ack_wr(dev, queue_id, DPP_DTB_DIR_UP_TYPE, i, 0, DPP_DTB_TAB_ACK_CHECK_VALUE); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_item_ack_wr"); + } + + for(i = 0; i < DPP_DTB_QUEUE_ITEM_NUM_MAX; i++) + { + rc = dpp_dtb_item_ack_rd(dev, queue_id, DPP_DTB_DIR_UP_TYPE, i, 0, &ack_vale); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_item_ack_rd"); + if(ack_vale != DPP_DTB_TAB_ACK_CHECK_VALUE) + { + ZXIC_COMM_PRINT("dtb slot [%d] queue [%d] init faild, mem err!!!\n", DEV_PCIE_SLOT(dev), queue_id); + return DPP_RC_DTB_MEMORY_ALLOC_ERR; + } + } + + ZXIC_COMM_PRINT("dtb slot [%d] queue [%d] up init success!!!\n", DEV_PCIE_SLOT(dev), queue_id); + + ZXIC_COMM_MEMSET((ZXIC_UINT8 *)(p_queue_cfg->up_start_vir_addr), 0, tab_up_item_size * DPP_DTB_QUEUE_ITEM_NUM_MAX); + + return DPP_OK; +} + +/***********************************************************/ +/** dtb队列down 空间地址配置 +* @param channelId dtb通道号 +* @param phyAddr down物理地址 +* @param virAddr down虚拟地址 +* @param size 空间大小 0:使用系统默认值16K+16 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_down_channel_addr_set(DPP_DEV_T *dev, + ZXIC_UINT32 channelId, + ZXIC_UINT64 phyAddr, + ZXIC_UINT64 virAddr, + ZXIC_UINT32 size) +{ + ZXIC_UINT32 rc = 0; + + DPP_DTB_QUEUE_CFG_T down_queue_cfg = {0}; + + ZXIC_COMM_CHECK_POINT_NO_ASSERT(dev); + + down_queue_cfg.down_start_phy_addr = phyAddr; + down_queue_cfg.down_start_vir_addr = virAddr; + down_queue_cfg.down_item_size = size; + + rc = dpp_dtb_queue_down_init(dev, + channelId, + &down_queue_cfg); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_queue_down_init"); + + return rc; +} + +/***********************************************************/ +/** dtb队列dump 空间地址配置 +* @param channelId dtb通道号 +* @param phyAddr dump物理地址 +* @param virAddr dump虚拟地址 +* @param size 空间大小 +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_dump_channel_addr_set(DPP_DEV_T *dev, + ZXIC_UINT32 channelId, + ZXIC_UINT64 phyAddr, + ZXIC_UINT64 virAddr, + ZXIC_UINT32 size) +{ + ZXIC_UINT32 rc = 0; + + DPP_DTB_QUEUE_CFG_T dump_queue_cfg = {0}; + + ZXIC_COMM_CHECK_POINT_NO_ASSERT(dev); + + dump_queue_cfg.up_start_phy_addr = phyAddr; + dump_queue_cfg.up_start_vir_addr = virAddr; + dump_queue_cfg.up_item_size = size; + + rc = dpp_dtb_queue_dump_init(dev, + channelId, + &dump_queue_cfg); + + return rc; +} + +/***********************************************************/ +/** 释放队列资源 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 分配到的队列号; +* +* @return +* @remark 无 +* @see +* @author zab @date 2021/02/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_id_free(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id) +{ + ZXIC_UINT32 rc = 0; + ZXIC_UINT32 item_num = 0; + DPP_DTB_MGR_T *p_dtb_mgr = ZXIC_NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev),queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + + p_dtb_mgr = dpp_dtb_mgr_get(DEV_PCIE_SLOT(dev), DEV_ID(dev)); + if (p_dtb_mgr == ZXIC_NULL) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "slot %d ErrorCode[0x%x]: DTB Manager is not exist!!!\n", DEV_PCIE_SLOT(dev), DPP_RC_DTB_MGR_NOT_EXIST); + return DPP_RC_DTB_MGR_NOT_EXIST; + } + + rc = dpp_dtb_queue_unused_item_num_get(dev, queue_id, &item_num); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_queue_unused_item_num_get"); + + if (item_num != DPP_DTB_QUEUE_ITEM_NUM_MAX) + { + return DPP_RC_DTB_QUEUE_IS_WORKING; + } + + p_dtb_mgr->queue_info[queue_id].init_flag = 0; + + ZXIC_COMM_MEMSET(&(p_dtb_mgr->queue_info[queue_id].tab_up), 0, sizeof(DPP_DTB_TAB_UP_INFO_T)); + ZXIC_COMM_MEMSET(&(p_dtb_mgr->queue_info[queue_id].tab_down), 0, sizeof(DPP_DTB_TAB_DOWN_INFO_T)); + + return DPP_OK; +} + +/***********************************************************/ +/** dtb初始化 +* @param dev_id 设备号,支持多芯片 +* +* @return +* @remark 无 +* @see +* @author zab @date 2022/08/30 +************************************************************/ +ZXIC_UINT32 dpp_dtb_init(DPP_DEV_T *dev) +{ + ZXIC_UINT32 rc = 0; + DPP_DTB_MGR_T *p_dtb_mgr = ZXIC_NULL; + + ZXIC_COMM_CHECK_POINT(dev); + + p_dtb_mgr = dpp_dtb_mgr_get(DEV_PCIE_SLOT(dev), DEV_ID(dev)); + if (p_dtb_mgr == ZXIC_NULL) + { + rc = dpp_dtb_mgr_create(DEV_PCIE_SLOT(dev), DEV_ID(dev)); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_mgr_create"); + + p_dtb_mgr = dpp_dtb_mgr_get(DEV_PCIE_SLOT(dev), DEV_ID(dev)); + if (p_dtb_mgr == ZXIC_NULL) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "slot %d ErrorCode[0x%x]: DTB Manager is not exist!!!\n", DEV_PCIE_SLOT(dev), DPP_RC_DTB_MGR_NOT_EXIST); + return DPP_RC_DTB_MGR_NOT_EXIST; + } + } + + return DPP_OK; +} + +/***********************************************************/ +/** 根据vport查找相应的队列号 +* @param dev_id 设备号,支持多芯片 +* @param vport vport信息 +* @param p_queue_arr 找到到队列数组 +* @param p_num 找到的队列个数 +* @return +* @remark 无 +* @see +* @author cbb @date 2023/09/13 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_id_search_by_vport(DPP_DEV_T *dev, + ZXIC_UINT32 *p_queue_arr, + ZXIC_UINT32 *p_num) +{ + ZXIC_UINT32 queue_id = 0; + ZXIC_UINT32 count = 0; + + DPP_DTB_MGR_T *p_dtb_mgr = ZXIC_NULL; + + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_queue_arr); + + p_dtb_mgr = dpp_dtb_mgr_get(DEV_PCIE_SLOT(dev), DEV_ID(dev)); + if (p_dtb_mgr == ZXIC_NULL) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "slot %d ErrorCode[0x%x]: DTB Manager is not exist!!!\n", DEV_PCIE_SLOT(dev), DPP_RC_DTB_MGR_NOT_EXIST); + return DPP_RC_DTB_MGR_NOT_EXIST; + } + + for(queue_id = 0; queue_id < DPP_DTB_QUEUE_NUM_MAX; queue_id++) + { + if(DPP_DTB_QUEUE_INIT_FLAG_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id) != 0) + { + if(DEV_PCIE_VPORT(dev) == DPP_DTB_QUEUE_VPORT_GET(DEV_PCIE_SLOT(dev), DEV_ID(dev), queue_id)) + { + p_queue_arr[count] = queue_id; + count++; + } + } + } + + if (count == 0) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "slot %d ErrorCode[0x%x]: vport 0x%04x no queue not found!!!\n", + DEV_PCIE_SLOT(dev), DPP_RC_DTB_QUEUE_NOT_ALLOC, DEV_PCIE_VPORT(dev)); + return DPP_RC_DTB_QUEUE_NOT_ALLOC; + } + + *p_num = count; + + return DPP_OK; +} + +/***********************************************************/ +/** 根据vport查找相应的队列号 +* @param dev_id 设备号,支持多芯片 +* @param vport vport信息 +* @param p_queue_arr 找到到队列数组 +* @param p_num 找到的队列个数 +* @return +* @remark 无 +* @see +* @author cbb @date 2023/09/13 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_id_get(ZXIC_UINT32 dev_id, DPP_PF_INFO_T* pf_info, ZXIC_UINT32 *queue) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 num = 0; + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_UINT32 queue_arr[DPP_DTB_QUEUE_NUM_MAX] = {0}; + + ZXIC_COMM_CHECK_POINT_NO_ASSERT(pf_info); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_search_by_vport(&dev, queue_arr, &num); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_queue_id_search_by_vport"); + + *queue = queue_arr[0]; + + return DPP_OK; +} + +#endif +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/dma/dpp_dtb_cfg.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/dma/dpp_dtb_cfg.c new file mode 100755 index 0000000..f49b81c --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/dma/dpp_dtb_cfg.c @@ -0,0 +1,1079 @@ +/************************************************************** +* 版权所有(C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_dtb_cfg.c +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : zab +* 完成日期 : 2022/08/23 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#include "zxic_common.h" +#include "dpp_type_api.h" +#include "dpp_cfg_reg.h" +#include "dpp_dev.h" +#include "dpp_dtb.h" +#include "dpp_reg.h" +#include "dpp_reg_info.h" +#include "dpp_dtb_cfg.h" +#include "dpp_dtb4k_reg.h" +#include "dpp_dtb_reg.h" + +#define DTB_DEBUG_VALUE (0x5A) + +#if ZXIC_REAL("DTB_CFG") +/***********************************************************/ +/** DTB队列元素信息配置 +* @param dev_id 芯片id +* @param queue_id 队列ID,范围0-127 +* @param p_item_info 队列元素配置信息 +* +* @return +* @remark 无 +* @see +* @author zab @date 2018/08/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_item_info_set(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + DPP_DTB_QUEUE_ITEM_INFO_T *p_item_info) +{ + ZXIC_UINT32 rc = 0; + DPP_DTB4K_DTB_ENQ_CFG_QUEUE_DTB_LEN_0_127_T dtb_len = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_item_info); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_item_info->cmd_vld, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_item_info->cmd_type, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_item_info->int_en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_item_info->data_len, DPP_DTB_LEN_MIN, DPP_DTB_DOWN_LEN); + + rc = dpp_reg_write(dev, DTB4K_DTB_ENQ_CFG_QUEUE_DTB_ADDR_H_0_127r, 0, queue_id, &(p_item_info->data_hddr)); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev, DTB4K_DTB_ENQ_CFG_QUEUE_DTB_ADDR_L_0_127r, 0, queue_id, &(p_item_info->data_laddr)); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + dtb_len.cfg_dtb_cmd_type = p_item_info->cmd_type; + dtb_len.cfg_dtb_cmd_int_en = p_item_info->int_en; + dtb_len.cfg_queue_dtb_len = p_item_info->data_len; + + rc = dpp_reg_write(dev, DTB4K_DTB_ENQ_CFG_QUEUE_DTB_LEN_0_127r, 0, queue_id, &dtb_len); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 获取DTB队列中剩余未使用的条目数量 +* @param dev_id 芯片id +* @param queue_id 队列ID,范围0-127 +* @param p_item_num 剩余未使用条目数量 +* +* @return +* @remark 无 +* @see +* @author zab @date 2018/08/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_unused_item_num_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 *p_item_num) +{ + ZXIC_UINT32 rc = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_item_num); + + if(DPP_DEV_TYPE_SIM == dpp_dev_get_dev_type(DEV_ID(dev))) + { + *p_item_num = 32; + return DPP_OK; + } + + rc = dpp_reg_read(dev, DTB4K_DTB_ENQ_INFO_QUEUE_BUF_SPACE_LEFT_0_127r, 0, queue_id, p_item_num); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + return DPP_OK; +} + +/***********************************************************/ +/** 配置队列VM相关信息 +* @param dev_id 芯片id +* @param queue_id 队列ID,范围0-127 +* @param p_vm_info VM配置信息 +* +* @return +* @remark 无 +* @see +* @author zab @date 2018/08/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_vm_info_set(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + DPP_DTB_QUEUE_VM_INFO_T *p_vm_info) +{ + ZXIC_UINT32 rc = 0; + DPP_DTB4K_DTB_ENQ_CFG_EPID_V_FUNC_NUM_0_127_T vm_info = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_vm_info); + + vm_info.dbi_en = p_vm_info->dbi_en; + vm_info.queue_en = p_vm_info->queue_en; + vm_info.cfg_epid = p_vm_info->epid; + vm_info.cfg_vector = p_vm_info->vector; + vm_info.cfg_vfunc_num = p_vm_info->vfunc_num; + vm_info.cfg_func_num = p_vm_info->func_num; + vm_info.cfg_vfunc_active = p_vm_info->vfunc_active; + + rc = dpp_reg_write(dev, DTB4K_DTB_ENQ_CFG_EPID_V_FUNC_NUM_0_127r, 0, queue_id, &vm_info); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 获取队列VM配置信息 +* @param dev_id оƬid +* @param queue_id 队列ID,范围0-127 +* @param p_vm_info VM配置信息 +* +* @return +* @remark 无 +* @see +* @author zab @date 2018/08/23 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_vm_info_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + DPP_DTB_QUEUE_VM_INFO_T *p_vm_info) +{ + ZXIC_UINT32 rc = 0; + DPP_DTB4K_DTB_ENQ_CFG_EPID_V_FUNC_NUM_0_127_T vm_info = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_vm_info); + + rc = dpp_reg_read(dev, DTB4K_DTB_ENQ_CFG_EPID_V_FUNC_NUM_0_127r, 0, queue_id, &vm_info); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + p_vm_info->dbi_en = vm_info.dbi_en; + p_vm_info->queue_en = vm_info.queue_en; + p_vm_info->epid = vm_info.cfg_epid; + p_vm_info->vector = vm_info.cfg_vector; + p_vm_info->vfunc_num = vm_info.cfg_vfunc_num; + p_vm_info->func_num = vm_info.cfg_func_num; + p_vm_info->vfunc_active = vm_info.cfg_vfunc_active; + + return DPP_OK; +} + +/***********************************************************/ +/** 配置队列使能 +* @param dev_id 芯片id +* @param queue_id 队列ID,范围0-127 +* @param enable 1:队列使能,0:队列去使能 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2023/09/27 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_enable_set(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 enable) +{ + ZXIC_UINT32 rc = DPP_OK; + DPP_DTB_QUEUE_VM_INFO_T vm_info = {0}; + + rc = dpp_dtb_queue_vm_info_get(dev, queue_id, &vm_info); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_queue_vm_info_get"); + + vm_info.queue_en = enable; + rc = dpp_dtb_queue_vm_info_set(dev, queue_id, &vm_info); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_queue_vm_info_set"); + + ZXIC_COMM_TRACE_INFO("dtb queue [%d] enable_set [%d] success.\n", queue_id, enable); + + return rc; +} + +/***********************************************************/ +/** 获取队列使能状态 +* @param dev_id 芯片id +* @param queue_id 队列ID,范围0-127 +* @param enable 1:队列使能,0:队列去使能 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2023/09/27 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_enable_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 *enable) +{ + ZXIC_UINT32 rc = DPP_OK; + DPP_DTB_QUEUE_VM_INFO_T vm_info = {0}; + + rc = dpp_dtb_queue_vm_info_get(dev, queue_id, &vm_info); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_queue_vm_info_get"); + + *enable = vm_info.queue_en; + + ZXIC_COMM_TRACE_INFO("dpp_dtb_queue_enable_get queue %d enable: %d success.\n", queue_id, *enable); + + return rc; +} + +/***********************************************************/ +/** 配置 dtb 完成中断事件状态 +* @param dev_id 芯片id +* @param queue_id 队列ID,范围0-127 +* @param state 中断事件状态,1-发生中断,0-无中断发生 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/12 +************************************************************/ +ZXIC_UINT32 dpp_dtb_finish_interrupt_event_state_set(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 state) +{ + ZXIC_UINT32 rc = 0; + ZXIC_UINT32 bit_shift = 0; + ZXIC_UINT32 reg_shift = 0; + ZXIC_UINT32 rd_value = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), state, 0, 1); + + reg_shift = queue_id / 32; + bit_shift = queue_id % 32; + + rc = dpp_reg_read(dev, DTB_DTB_CFG_CFG_FINISH_INT_EVENT0r + reg_shift, 0, 0, &rd_value); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + ZXIC_COMM_UINT32_WRITE_BITS(rd_value, state, bit_shift, 1); + + rc = dpp_reg_write(dev, DTB_DTB_CFG_CFG_FINISH_INT_EVENT0r + reg_shift, 0, 0, &rd_value); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 清除 dtb 完成中断事件状态 +* @param dev_id 芯片id +* @param queue_id 队列ID,范围0-127 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/12 +************************************************************/ +ZXIC_UINT32 dpp_dtb_finish_interrupt_event_state_clr(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id) +{ + ZXIC_UINT32 rc = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + + rc = dpp_dtb_finish_interrupt_event_state_set(dev, queue_id, 1); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_finish_interrupt_event_state_set"); + + return rc; +} + +/***********************************************************/ +/** 获取DTB debug模式配置 +* @param dev_id 芯片id +* @param p_debug_mode 调试模式 当为0x5a时,dtb的ram均可读写 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/09 +************************************************************/ +ZXIC_UINT32 dpp_dtb_debug_mode_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_debug_mode) +{ + ZXIC_UINT32 rc = 0; + DPP_DTB_DTB_CFG_CFG_DTB_DEBUG_MODE_EN_T dtb_debug_mode = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_debug_mode); + + rc = dpp_reg_read(dev, DTB_DTB_CFG_CFG_DTB_DEBUG_MODE_ENr, 0, 0, &dtb_debug_mode); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_debug_mode = dtb_debug_mode.cfg_dtb_debug_mode_en; + + return DPP_OK; +} + +/***********************************************************/ +/** 判断dtb是否在debug模式 +* @param dev_id 芯片的id号 +* +* @return 1:DTB为debug模式; 0:非debug模式 +* @remark 无 +* @see +* @author cbb @date 2023/6/10 +************************************************************/ +ZXIC_UINT32 dpp_dtb_mode_is_debug(DPP_DEV_T *dev) +{ + ZXIC_UINT32 rc = 0; + ZXIC_UINT32 dtb_mode = 0; + + ZXIC_COMM_CHECK_POINT(dev); + rc = dpp_dtb_debug_mode_get(dev, &dtb_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_debug_mode_get"); + + if(DTB_DEBUG_VALUE == dtb_mode) + { + return 1; + } + + return 0; +} + +#if ZXIC_REAL("AXIM_READ_TABLE_DEBUG") + +/***********************************************************/ +/** 读取axi 最近一次读表相关信息 +* @param dev_id 芯片id +* @param p_last_rd_table_addr_h axim最近一次读表高地址 +* @param p_last_rd_table_addr_l axim最近一次读表低地址 +* @param p_last_rd_table_len axim最近一次读表长度 +* @param p_last_rd_table_user axim最近一次读表USER信号 +* @param p_last_rd_table_onload_cnt axim最近一次读表在线计数 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/09 +************************************************************/ +ZXIC_UINT32 dpp_dtb_axi_last_rd_table_info_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_last_rd_table_addr_h, + ZXIC_UINT32 *p_last_rd_table_addr_l, + ZXIC_UINT32 *p_last_rd_table_len, + ZXIC_UINT32 *p_last_rd_table_user, + ZXIC_UINT32 *p_last_rd_table_onload_cnt + ) +{ + ZXIC_UINT32 rc = 0; + + DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_ADDR_HIGH_T rd_table_addr_high = {0}; + DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_ADDR_LOW_T rd_table_addr_low = {0}; + DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_LEN_T rd_table_len = {0}; + DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_USER_T rd_table_user = {0}; + DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_ONLOAD_CNT_T rd_table_onload_cnt = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_rd_table_addr_h); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_rd_table_addr_l); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_rd_table_len); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_rd_table_user); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_rd_table_onload_cnt); + + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_ADDR_HIGHr, 0, 0, &rd_table_addr_high); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_ADDR_LOWr, 0, 0, &rd_table_addr_low); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_LENr, 0, 0, &rd_table_len); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_USERr, 0, 0, &rd_table_user); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_ONLOAD_CNTr, 0, 0, &rd_table_onload_cnt); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_last_rd_table_addr_h = rd_table_addr_high.info_axi_last_rd_table_addr_high; + *p_last_rd_table_addr_l = rd_table_addr_low.info_axi_last_rd_table_addr_low; + *p_last_rd_table_len = rd_table_len.info_axi_last_rd_table_len; + (*((DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_USER_T*)p_last_rd_table_user)).info_rd_table_user_en = rd_table_user.info_rd_table_user_en; + (*((DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_USER_T*)p_last_rd_table_user)).info_rd_table_epid = rd_table_user.info_rd_table_epid; + (*((DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_USER_T*)p_last_rd_table_user)).info_rd_table_vfunc_num = rd_table_user.info_rd_table_vfunc_num; + (*((DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_USER_T*)p_last_rd_table_user)).info_rd_table_func_num = rd_table_user.info_rd_table_func_num; + (*((DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_USER_T*)p_last_rd_table_user)).info_rd_table_vfunc_active = rd_table_user.info_rd_table_vfunc_active; + *p_last_rd_table_onload_cnt = rd_table_onload_cnt.info_axi_last_rd_table_onload_cnt; + + return DPP_OK; +} + +/***********************************************************/ +/** 读表通道错误次数统计 +* @param dev_id 芯片id +* @param p_axi_rd_table_resp_err_cnt 读表通道返回错误次数 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/09 +************************************************************/ +ZXIC_UINT32 dpp_dtb_axi_rd_table_resp_err_cnt_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_axi_rd_table_resp_err_cnt + ) +{ + ZXIC_UINT32 rc = 0; + + DPP_DTB_DTB_CFG_CNT_AXI_RD_TABLE_RESP_ERR_T rd_table_resp_err_cnt= {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_axi_rd_table_resp_err_cnt); + + rc = dpp_reg_read(dev, DTB_DTB_CFG_CNT_AXI_RD_TABLE_RESP_ERRr, 0, 0, &rd_table_resp_err_cnt); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_axi_rd_table_resp_err_cnt = rd_table_resp_err_cnt.cnt_axi_rd_table_resp_err; + + return DPP_OK; +} +#endif + +#if ZXIC_REAL("AXIM_READ_PD_DEBUG") +/***********************************************************/ +/** 读取axi 最近一次读PD相关信息 +* @param dev_id 芯片id +* @param p_last_rd_pd_addr_h axim最近一次读PD高地址 +* @param p_last_rd_pd_addr_l axim最近一次读PD低地址 +* @param p_last_rd_pd_len axim最近一次读PD长度 +* @param p_last_rd_pd_user axim最近一次读PD USER信号 +* @param p_last_rd_pd_onload_cnt axim最近一次读PD在线计数 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/09 +************************************************************/ +ZXIC_UINT32 dpp_dtb_axi_last_rd_pd_info_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_last_rd_pd_addr_h, + ZXIC_UINT32 *p_last_rd_pd_addr_l, + ZXIC_UINT32 *p_last_rd_pd_len, + ZXIC_UINT32 *p_last_rd_pd_user, + ZXIC_UINT32 *p_last_rd_pd_onload_cnt + ) +{ + ZXIC_UINT32 rc = 0; + + DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_ADDR_HIGH_T rd_pd_addr_high = {0}; + DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_ADDR_LOW_T rd_pd_addr_low = {0}; + DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_LEN_T rd_pd_len = {0}; + DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_USER_T rd_pd_user = {0}; + DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_ONLOAD_CNT_T rd_pd_onload_cnt = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_rd_pd_addr_h); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_rd_pd_addr_l); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_rd_pd_len); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_rd_pd_user); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_rd_pd_onload_cnt); + + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_ADDR_HIGHr, 0, 0, &rd_pd_addr_high); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_ADDR_LOWr, 0, 0, &rd_pd_addr_low); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_LENr, 0, 0, &rd_pd_len); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_USERr, 0, 0, &rd_pd_user); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_ONLOAD_CNTr, 0, 0, &rd_pd_onload_cnt); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_last_rd_pd_addr_h = rd_pd_addr_high.info_axi_last_rd_pd_addr_high; + *p_last_rd_pd_addr_l = rd_pd_addr_low.info_axi_last_rd_pd_addr_low; + *p_last_rd_pd_len = rd_pd_len.info_axi_last_rd_pd_len; + (*((DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_USER_T*)p_last_rd_pd_user)).info_rd_pd_user_en = rd_pd_user.info_rd_pd_user_en; + (*((DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_USER_T*)p_last_rd_pd_user)).info_rd_pd_epid = rd_pd_user.info_rd_pd_epid; + (*((DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_USER_T*)p_last_rd_pd_user)).info_rd_pd_vfunc_num = rd_pd_user.info_rd_pd_vfunc_num; + (*((DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_USER_T*)p_last_rd_pd_user)).info_rd_pd_func_num = rd_pd_user.info_rd_pd_func_num; + (*((DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_USER_T*)p_last_rd_pd_user)).info_rd_pd_vfunc_active = rd_pd_user.info_rd_pd_vfunc_active; + *p_last_rd_pd_onload_cnt = rd_pd_onload_cnt.info_axi_last_rd_pd_onload_cnt; + + return DPP_OK; +} + +/***********************************************************/ +/** 读PD通道错误次数统计 +* @param dev_id 芯片id +* @param p_axi_rd_pd_resp_err_cnt 读PD通道返回错误次数 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/09 +************************************************************/ +ZXIC_UINT32 dpp_dtb_axi_rd_pd_resp_err_cnt_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_axi_rd_pd_resp_err_cnt + ) +{ + ZXIC_UINT32 rc = 0; + + DPP_DTB_DTB_CFG_CNT_AXI_RD_PD_RESP_ERR_T rd_pd_resp_err_cnt= {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_axi_rd_pd_resp_err_cnt); + + rc = dpp_reg_read(dev, DTB_DTB_CFG_CNT_AXI_RD_PD_RESP_ERRr, 0, 0, &rd_pd_resp_err_cnt); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_axi_rd_pd_resp_err_cnt = rd_pd_resp_err_cnt.cnt_axi_rd_pd_resp_err; + + return DPP_OK; +} + +#endif + +#if ZXIC_REAL("AXI_WRITE_CTRL_DEBUG") + +/***********************************************************/ +/** 读取axim 最近一次写控制相关信息 +* @param dev_id 芯片id +* @param p_last_wr_ctrl_addr_h axim最近一次写控制高地址 +* @param p_last_wr_ctrl_addr_l axim最近一次写控制低地址 +* @param p_last_wr_ctrl_len axim最近一次写控制长度 +* @param p_last_wr_ctrl_user axim最近一次写控制 USER信号 +* @param p_last_wr_ctrl_onload_cnt axim最近一次写控制在线计数 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/09 +************************************************************/ +ZXIC_UINT32 dpp_dtb_axi_last_wr_ctrl_info_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_last_wr_ctrl_addr_h, + ZXIC_UINT32 *p_last_wr_ctrl_addr_l, + ZXIC_UINT32 *p_last_wr_ctrl_len, + ZXIC_UINT32 *p_last_wr_ctrl_user, + ZXIC_UINT32 *p_last_wr_ctrl_onload_cnt + ) +{ + ZXIC_UINT32 rc = 0; + + DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_ADDR_HIGH_T wr_ctrl_addr_high = {0}; + DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_ADDR_LOW_T wr_ctrl_addr_low = {0}; + DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_LEN_T wr_ctrl_len = {0}; + DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_USER_T wr_ctrl_user = {0}; + DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_ONLOAD_CNT_T wr_ctrl_onload_cnt = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_wr_ctrl_addr_h); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_wr_ctrl_addr_l); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_wr_ctrl_len); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_wr_ctrl_user); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_wr_ctrl_onload_cnt); + + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_ADDR_HIGHr, 0, 0, &wr_ctrl_addr_high); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_ADDR_LOWr, 0, 0, &wr_ctrl_addr_low); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_LENr, 0, 0, &wr_ctrl_len); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_USERr, 0, 0, &wr_ctrl_user); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_ONLOAD_CNTr, 0, 0, &wr_ctrl_onload_cnt); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_last_wr_ctrl_addr_h = wr_ctrl_addr_high.info_axi_last_wr_ctrl_addr_high; + *p_last_wr_ctrl_addr_l = wr_ctrl_addr_low.info_axi_last_wr_ctrl_addr_low; + *p_last_wr_ctrl_len = wr_ctrl_len.info_axi_last_wr_ctrl_len; + (*((DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_USER_T*)p_last_wr_ctrl_user)).info_wr_ctrl_user_en = wr_ctrl_user.info_wr_ctrl_user_en; + (*((DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_USER_T*)p_last_wr_ctrl_user)).info_wr_ctrl_epid = wr_ctrl_user.info_wr_ctrl_epid; + (*((DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_USER_T*)p_last_wr_ctrl_user)).info_wr_ctrl_vfunc_num = wr_ctrl_user.info_wr_ctrl_vfunc_num; + (*((DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_USER_T*)p_last_wr_ctrl_user)).info_wr_ctrl_func_num = wr_ctrl_user.info_wr_ctrl_func_num; + (*((DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_USER_T*)p_last_wr_ctrl_user)).info_wr_ctrl_vfunc_active = wr_ctrl_user.info_wr_ctrl_vfunc_active; + *p_last_wr_ctrl_onload_cnt = wr_ctrl_onload_cnt.info_axi_last_wr_ctrl_onload_cnt; + + return DPP_OK; +} + +/***********************************************************/ +/** 获取写控制通道错误次数统计 +* @param dev_id 芯片id +* @param p_axi_wr_ctrl_resp_err_cnt 写控制通道返回错误次数 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/09 +************************************************************/ +ZXIC_UINT32 dpp_dtb_axi_wr_ctrl_resp_err_cnt_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_axi_wr_ctrl_resp_err_cnt + ) +{ + ZXIC_UINT32 rc = 0; + + DPP_DTB_DTB_CFG_CNT_AXI_WR_CTRL_RESP_ERR_T wr_ctrl_resp_err_cnt= {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_axi_wr_ctrl_resp_err_cnt); + + rc = dpp_reg_read(dev, DTB_DTB_CFG_CNT_AXI_WR_CTRL_RESP_ERRr, 0, 0, &wr_ctrl_resp_err_cnt); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_axi_wr_ctrl_resp_err_cnt = wr_ctrl_resp_err_cnt.cnt_axi_wr_ctrl_resp_err; + + return DPP_OK; +} + +#endif + +#if ZXIC_REAL("AXI_WRITE_DDR_DEBUG") +/***********************************************************/ +/** 读取axim 最近一次写DDR相关信息 +* @param dev_id 芯片id +* @param p_last_wr_ddr_addr_h axim最近一次写控制高地址 +* @param p_last_wr_ddr_addr_l axim最近一次写控制低地址 +* @param p_last_wr_ddr_len axim最近一次写控制长度 +* @param p_last_wr_ddr_user axim最近一次写控制 USER信号 +* @param p_last_wr_ddr_onload_cnt axim最近一次写控制在线计数 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/09 +************************************************************/ +ZXIC_UINT32 dpp_dtb_axi_last_wr_ddr_info_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_last_wr_ddr_addr_h, + ZXIC_UINT32 *p_last_wr_ddr_addr_l, + ZXIC_UINT32 *p_last_wr_ddr_len, + ZXIC_UINT32 *p_last_wr_ddr_user, + ZXIC_UINT32 *p_last_wr_ddr_onload_cnt + ) +{ + ZXIC_UINT32 rc = 0; + + DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_ADDR_HIGH_T wr_ddr_addr_high = {0}; + DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_ADDR_LOW_T wr_ddr_addr_low = {0}; + DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_LEN_T wr_ddr_len = {0}; + DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_USER_T wr_ddr_user = {0}; + DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_ONLOAD_CNT_T wr_ddr_onload_cnt = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_wr_ddr_addr_h); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_wr_ddr_addr_l); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_wr_ddr_len); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_wr_ddr_user); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_wr_ddr_onload_cnt); + + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_ADDR_HIGHr, 0, 0, &wr_ddr_addr_high); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_ADDR_LOWr, 0, 0, &wr_ddr_addr_low); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_LENr, 0, 0, &wr_ddr_len); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_USERr, 0, 0, &wr_ddr_user); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_ONLOAD_CNTr, 0, 0, &wr_ddr_onload_cnt); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_last_wr_ddr_addr_h = wr_ddr_addr_high.info_axi_last_wr_ddr_addr_high; + *p_last_wr_ddr_addr_l = wr_ddr_addr_low.info_axi_last_wr_ddr_addr_low; + *p_last_wr_ddr_len = wr_ddr_len.info_axi_last_wr_ddr_len; + (*((DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_USER_T*)p_last_wr_ddr_user)).info_wr_ddr_user_en = wr_ddr_user.info_wr_ddr_user_en; + (*((DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_USER_T*)p_last_wr_ddr_user)).info_wr_ddr_epid = wr_ddr_user.info_wr_ddr_epid; + (*((DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_USER_T*)p_last_wr_ddr_user)).info_wr_ddr_vfunc_num = wr_ddr_user.info_wr_ddr_vfunc_num; + (*((DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_USER_T*)p_last_wr_ddr_user)).info_wr_ddr_func_num = wr_ddr_user.info_wr_ddr_func_num; + (*((DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_USER_T*)p_last_wr_ddr_user)).info_wr_ddr_vfunc_active = wr_ddr_user.info_wr_ddr_vfunc_active; + *p_last_wr_ddr_onload_cnt = wr_ddr_onload_cnt.info_axi_last_wr_ddr_onload_cnt; + + return DPP_OK; +} + +/***********************************************************/ +/** 获取写DDR通道错误次数统计 +* @param dev_id 芯片id +* @param p_axi_wr_ddr_resp_err_cnt 写DDR通道返回错误次数 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/09 +************************************************************/ +ZXIC_UINT32 dpp_dtb_axi_wr_ddr_resp_err_cnt_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_axi_wr_ddr_resp_err_cnt + ) +{ + ZXIC_UINT32 rc = 0; + + DPP_DTB_DTB_CFG_CNT_AXI_WR_DDR_RESP_ERR_T wr_ddr_resp_err_cnt= {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_axi_wr_ddr_resp_err_cnt); + + rc = dpp_reg_read(dev, DTB_DTB_CFG_CNT_AXI_WR_DDR_RESP_ERRr, 0, 0, &wr_ddr_resp_err_cnt); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_axi_wr_ddr_resp_err_cnt = wr_ddr_resp_err_cnt.cnt_axi_wr_ddr_resp_err; + + return DPP_OK; +} + +#endif + +#if ZXIC_REAL("AXIM_WRITE_FINISH_DEBUG") + +/***********************************************************/ +/** 读取axim 最近一次写完成相关信息 +* @param dev_id 芯片id +* @param p_last_wr_fin_addr_h axim最近一次写控制高地址 +* @param p_last_wr_fin_addr_l axim最近一次写控制低地址 +* @param p_last_wr_fin_len axim最近一次写控制长度 +* @param p_last_wr_fin_user axim最近一次写控制 USER信号 +* @param p_last_wr_fin_onload_cnt axim最近一次写控制在线计数 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/09 +************************************************************/ +ZXIC_UINT32 dpp_dtb_axi_last_wr_fin_info_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_last_wr_fin_addr_h, + ZXIC_UINT32 *p_last_wr_fin_addr_l, + ZXIC_UINT32 *p_last_wr_fin_len, + ZXIC_UINT32 *p_last_wr_fin_user, + ZXIC_UINT32 *p_last_wr_fin_onload_cnt + ) +{ + ZXIC_UINT32 rc = 0; + + DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_ADDR_HIGH_T wr_fin_addr_high = {0}; + DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_ADDR_LOW_T wr_fin_addr_low = {0}; + DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_LEN_T wr_fin_len = {0}; + DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_USER_T wr_fin_user = {0}; + DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_ONLOAD_CNT_T wr_fin_onload_cnt = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_wr_fin_addr_h); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_wr_fin_addr_l); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_wr_fin_len); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_wr_fin_user); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_wr_fin_onload_cnt); + + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_ADDR_HIGHr, 0, 0, &wr_fin_addr_high); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_ADDR_LOWr, 0, 0, &wr_fin_addr_low); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_LENr, 0, 0, &wr_fin_len); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_USERr, 0, 0, &wr_fin_user); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_ONLOAD_CNTr, 0, 0, &wr_fin_onload_cnt); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_last_wr_fin_addr_h = wr_fin_addr_high.info_axi_last_wr_fin_addr_high; + *p_last_wr_fin_addr_l = wr_fin_addr_low.info_axi_last_wr_fin_addr_low; + *p_last_wr_fin_len = wr_fin_len.info_axi_last_wr_fin_len; + + (*((DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_USER_T*)p_last_wr_fin_user)).info_wr_fin_user_en = wr_fin_user.info_wr_fin_user_en; + (*((DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_USER_T*)p_last_wr_fin_user)).info_wr_fin_epid = wr_fin_user.info_wr_fin_epid; + (*((DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_USER_T*)p_last_wr_fin_user)).info_wr_fin_vfunc_num = wr_fin_user.info_wr_fin_vfunc_num; + (*((DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_USER_T*)p_last_wr_fin_user)).info_wr_fin_func_num = wr_fin_user.info_wr_fin_func_num; + (*((DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_USER_T*)p_last_wr_fin_user)).info_wr_fin_vfunc_active = wr_fin_user.info_wr_fin_vfunc_active; + *p_last_wr_fin_onload_cnt = wr_fin_onload_cnt.info_axi_last_wr_fin_onload_cnt; + + return DPP_OK; +} + +/***********************************************************/ +/** 获取写完成通道错误次数统计 +* @param dev_id 芯片id +* @param p_axi_wr_fin_resp_err_cnt 写完成通道返回错误次数 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/09 +************************************************************/ +ZXIC_UINT32 dpp_dtb_axi_wr_fin_resp_err_cnt_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_axi_wr_fin_resp_err_cnt + ) +{ + ZXIC_UINT32 rc = 0; + + DPP_DTB_DTB_CFG_CNT_AXI_WR_FIN_RESP_ERR_T wr_fin_resp_err_cnt= {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_axi_wr_fin_resp_err_cnt); + + rc = dpp_reg_read(dev, DTB_DTB_CFG_CNT_AXI_WR_FIN_RESP_ERRr, 0, 0, &wr_fin_resp_err_cnt); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_axi_wr_fin_resp_err_cnt = wr_fin_resp_err_cnt.cnt_axi_wr_fin_resp_err; + + return DPP_OK; +} + +#endif + +#if ZXIC_REAL("DTB_STATE") + +/***********************************************************/ +/** 读取 DTB 各通道状态机 +* @param dev_id 芯片id +* @param p_wr_ctrl_state_info 写控制状态机 +* @param p_rd_table_state_info 读表状态机 +* @param p_rd_pd_state_info 读描述符数据状态机 +* @param p_wr_ddr_state_info 写数据到ddr的状态机 +* @param p_wr_fin_state_info 写结束标志的状态机 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/09 +************************************************************/ +ZXIC_UINT32 dpp_dtb_state_info_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_wr_ctrl_state_info, + ZXIC_UINT32 *p_rd_table_state_info, + ZXIC_UINT32 *p_rd_pd_state_info, + ZXIC_UINT32 *p_wr_ddr_state_info, + ZXIC_UINT32 *p_dump_cmd_state_info + ) +{ + + ZXIC_UINT32 rc = 0; + + DPP_DTB_DTB_CFG_INFO_WR_CTRL_STATE_T wr_ctrl_state = {0}; + DPP_DTB_DTB_CFG_INFO_RD_TABLE_STATE_T rd_table_state = {0}; + DPP_DTB_DTB_CFG_INFO_RD_PD_STATE_T rd_pd_state = {0}; + DPP_DTB_DTB_CFG_INFO_WR_DDR_STATE_T wr_ddr_state = {0}; + DPP_DTB_DTB_CFG_INFO_DUMP_CMD_STATE_T dump_cmd_state = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_wr_ctrl_state_info); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_rd_table_state_info); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_rd_pd_state_info); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_wr_ddr_state_info); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_dump_cmd_state_info); + + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_WR_CTRL_STATEr, 0, 0, &wr_ctrl_state); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_RD_TABLE_STATEr, 0, 0, &rd_table_state); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_RD_PD_STATEr, 0, 0, &rd_pd_state); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_WR_DDR_STATEr, 0, 0, &wr_ddr_state); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + rc = dpp_reg_read(dev, DTB_DTB_CFG_INFO_DUMP_CMD_STATEr, 0, 0, &dump_cmd_state); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_wr_ctrl_state_info = wr_ctrl_state.info_wr_ctrl_state; + *p_rd_table_state_info = rd_table_state.info_rd_table_state; + *p_rd_pd_state_info = rd_pd_state.info_rd_pd_state; + *p_wr_ddr_state_info = wr_ddr_state.info_wr_ddr_state; + *p_dump_cmd_state_info = dump_cmd_state.info_dump_cmd_state; + + return DPP_OK; +} + +#endif + +/***********************************************************/ +/** 各通道错误统计打印 +* @param dev_id 芯片的id号 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/11 +************************************************************/ +ZXIC_UINT32 diag_dpp_dtb_channels_axi_resp_err_cnt_prt(DPP_DEV_T *dev) +{ + ZXIC_UINT32 rc = 0; + ZXIC_UINT32 rd_value = 0; + + ZXIC_COMM_PRINT("\n --------------- DTB CHANNEL ERR STAT INFO --------------- \n"); + + ZXIC_COMM_PRINT("********** dtb down table err cnt **********\n"); + + rc = dpp_dtb_axi_rd_table_resp_err_cnt_get(dev, &rd_value); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_axi_rd_table_resp_err_cnt_get"); + + ZXIC_COMM_DBGCNT32_PRINT("cnt_axi_rd_table_resp_err", rd_value); + + rc = dpp_dtb_axi_wr_ctrl_resp_err_cnt_get(dev, &rd_value); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_axi_wr_ctrl_resp_err_cnt_get"); + + ZXIC_COMM_DBGCNT32_PRINT("cnt_axi_wr_ctrl_resp_err", rd_value); + + ZXIC_COMM_PRINT("********** dtb dump table err cnt **********\n"); + + rc = dpp_dtb_axi_rd_pd_resp_err_cnt_get(dev, &rd_value); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_axi_rd_pd_resp_err_cnt_get"); + + ZXIC_COMM_DBGCNT32_PRINT("cnt_axi_rd_pd_resp_err", rd_value); + + rc = dpp_dtb_axi_wr_ddr_resp_err_cnt_get(dev, &rd_value); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_axi_wr_ddr_resp_err_cnt_get"); + + ZXIC_COMM_DBGCNT32_PRINT("cnt_axi_wr_ddr_resp_err", rd_value); + + rc = dpp_dtb_axi_wr_fin_resp_err_cnt_get(dev, &rd_value); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_axi_wr_fin_resp_err_cnt_get"); + + ZXIC_COMM_DBGCNT32_PRINT("cnt_axi_wr_fin_resp_err", rd_value); + + return DPP_OK; +} + +/***********************************************************/ +/** AXIM最近一次操作信息记录打印 +* @param dev_id 芯片的id号 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/11 +************************************************************/ +ZXIC_UINT32 diag_dpp_dtb_axi_last_operate_info_prt(DPP_DEV_T *dev) +{ + ZXIC_UINT32 rc = 0; + ZXIC_UINT32 addr_high = 0; + ZXIC_UINT32 addr_low = 0; + ZXIC_UINT32 len = 0; + ZXIC_UINT32 onload_cnt = 0; + + DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_USER_T rd_table_user = {0}; + DPP_DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_USER_T rd_pd_user = {0}; + DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_USER_T wr_ctrl_user = {0}; + DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_USER_T wr_ddr_user = {0}; + DPP_DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_USER_T wr_fin_user = {0}; + ZXIC_COMM_PRINT("\n------------------ DTB DOWN TABLE LAST INFO ------------------\n"); + rc = dpp_dtb_axi_last_rd_table_info_get( dev, &addr_high, &addr_low, &len, (ZXIC_UINT32 *)&rd_table_user, &onload_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_axi_last_rd_table_info_get"); + ZXIC_COMM_PRINT("**********axim last read table info***********\n"); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_rd_table_addr_high", addr_high); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_rd_table_addr_low", addr_low); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_rd_table_len", len); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_rd_table_user_en", rd_table_user.info_rd_table_user_en); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_rd_table_epid", rd_table_user.info_rd_table_epid); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_rd_table_vfunc_num", rd_table_user.info_rd_table_vfunc_num); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_rd_table_func_num", rd_table_user.info_rd_table_func_num); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_rd_table_vfunc_active", rd_table_user.info_rd_table_vfunc_active); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_rd_table_onload_cnt", onload_cnt); + + rc = dpp_dtb_axi_last_wr_ctrl_info_get( dev, &addr_high, &addr_low, &len, (ZXIC_UINT32 *)&wr_ctrl_user, &onload_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_axi_last_wr_ctrl_info_get"); + ZXIC_COMM_PRINT("**********axim last write ctrl info***********\n"); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_ctrl_addr_high", addr_high); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_ctrl_addr_low", addr_low); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_ctrl_len", len); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_ctrl_user_en", wr_ctrl_user.info_wr_ctrl_user_en); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_ctrl_epid", wr_ctrl_user.info_wr_ctrl_epid); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_ctrl_vfunc_num", wr_ctrl_user.info_wr_ctrl_vfunc_num); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_ctrl_func_num", wr_ctrl_user.info_wr_ctrl_func_num); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_ctrl_vfunc_active", wr_ctrl_user.info_wr_ctrl_vfunc_active); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_ctrl_onload_cnt", onload_cnt); + + ZXIC_COMM_PRINT("\n------------------ DTB DUMP TABLE LAST INFO ------------------\n"); + rc = dpp_dtb_axi_last_rd_pd_info_get( dev, &addr_high, &addr_low, &len, (ZXIC_UINT32*)&rd_pd_user, &onload_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_axi_last_rd_pd_info_get"); + ZXIC_COMM_PRINT("**********axim last read pd info***********\n"); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_rd_pd_addr_high", addr_high); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_rd_pd_addr_low", addr_low); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_rd_pd_len", len); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_rd_pd_user_en", rd_pd_user.info_rd_pd_user_en); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_rd_pd_epid", rd_pd_user.info_rd_pd_epid); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_rd_pd_vfunc_num", rd_pd_user.info_rd_pd_vfunc_num); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_rd_pd_func_num", rd_pd_user.info_rd_pd_func_num); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_rd_pd_vfunc_active", rd_pd_user.info_rd_pd_vfunc_active); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_rd_pd_onload_cnt", onload_cnt); + + rc = dpp_dtb_axi_last_wr_ddr_info_get( dev, &addr_high, &addr_low, &len, (ZXIC_UINT32 *)&wr_ddr_user, &onload_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_axi_last_wr_ddr_info_get"); + ZXIC_COMM_PRINT("**********axim last write ddr info***********\n"); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_ddr_addr_high", addr_high); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_ddr_addr_low", addr_low); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_ddr_len", len); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_ddr_user_en", wr_ddr_user.info_wr_ddr_user_en); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_ddr_epid", wr_ddr_user.info_wr_ddr_epid); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_ddr_vfunc_num", wr_ddr_user.info_wr_ddr_vfunc_num); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_ddr_func_num", wr_ddr_user.info_wr_ddr_func_num); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_ddr_vfunc_active", wr_ddr_user.info_wr_ddr_vfunc_active); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_ddr_onload_cnt", onload_cnt); + + rc = dpp_dtb_axi_last_wr_fin_info_get( dev, &addr_high, &addr_low, &len, (ZXIC_UINT32 *)&wr_fin_user, &onload_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_axi_wr_fin_resp_err_cnt_get"); + ZXIC_COMM_PRINT("**********axim last write final info***********\n"); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_fin_addr_high", addr_high); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_fin_addr_low", addr_low); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_fin_len", len); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_fin_user_en", wr_fin_user.info_wr_fin_user_en); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_fin_epid", wr_fin_user.info_wr_fin_epid); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_fin_vfunc_num", wr_fin_user.info_wr_fin_vfunc_num); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_fin_func_num", wr_fin_user.info_wr_fin_func_num); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_fin_vfunc_active", wr_fin_user.info_wr_fin_vfunc_active); + ZXIC_COMM_DBGCNT32_PRINT("info_axi_last_wr_fin_onload_cnt", onload_cnt); + + return DPP_OK; +} + +/***********************************************************/ +/** DTB 各通道状态机信息获取 +* @param dev_id 芯片的id号 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/11/11 +************************************************************/ +ZXIC_UINT32 diag_dpp_dtb_channels_state_info_prt(DPP_DEV_T *dev) +{ + ZXIC_UINT32 rc = 0; + + ZXIC_UINT32 wr_ctrl_state = 0; + ZXIC_UINT32 rd_table_state = 0; + ZXIC_UINT32 rd_pd_state = 0; + ZXIC_UINT32 wr_ddr_state = 0; + ZXIC_UINT32 dump_cmd_state = 0; + + rc = dpp_dtb_state_info_get(dev, + &wr_ctrl_state, + &rd_table_state, + &rd_pd_state, + &wr_ddr_state, + &dump_cmd_state); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_stat_info_get"); + + ZXIC_COMM_PRINT("\n-------------- DTB CHANNEL STATE INFO ----------------- \n"); + ZXIC_COMM_PRINT("----- REG ------------------- CURRENT ------- CORRECT ----- \n"); + ZXIC_COMM_PRINT("info_wr_ctrl_state 0x%08x 0x00000005 \n", wr_ctrl_state); + ZXIC_COMM_PRINT("info_rd_table_state 0x%08x 0x00080004 \n", rd_table_state); + ZXIC_COMM_PRINT("info_rd_pd_state 0x%08x 0x00020020 \n", rd_pd_state); + ZXIC_COMM_PRINT("info_wr_ddr_state 0x%08x 0x00000001 \n", wr_ddr_state); + ZXIC_COMM_PRINT("info_dump_cmd_state 0x%08x 0x0000002a \n", dump_cmd_state); + + return DPP_OK; +} + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/nppu/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/nppu/Kbuild.include new file mode 100644 index 0000000..b1f4bca --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/nppu/Kbuild.include @@ -0,0 +1,2 @@ +cur_dir := en_np/sdk/source/dev/module/nppu/ +src_files += $(addprefix $(cur_dir),$(notdir $(wildcard $(dinghai_root)/$(cur_dir)*.c))) diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/nppu/dpp_pbu.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/nppu/dpp_pbu.c new file mode 100755 index 0000000..962c73d --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/nppu/dpp_pbu.c @@ -0,0 +1,225 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_pbu.c +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : djf +* 完成日期 : 2014/04/14 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +/****************************************************************************** + * START: 头文件 * + *****************************************************************************/ +#include "zxic_common.h" +#include "dpp_type_api.h" +#include "dpp_reg.h" +#include "dpp_pbu_api.h" +#include "dpp_pbu.h" +#include "dpp_dev.h" +/****************************************************************************** + * END: 头文件 * + *****************************************************************************/ + + +/****************************************************************************** + * START: 常量定义 * + *****************************************************************************/ + +/****************************************************************************** + * END: 常量定义 * + *****************************************************************************/ +#define MF_MAX_BIT (4095) +#define MF_START_BIT (2047) +#define PKT_MAX_BIT (2047) +#define CAP_MAX_NUM (64) +#define PKT_BUFF_NUM (128) +#define PKT_BUF_SIZE (32) + + +/***********************************************************/ +/** 配置端口的阈值 +* @param dev_id 设备编号 +* @param port_id 端口号 +* @param p_para 端口阈值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/07/09 +************************************************************/ +DPP_STATUS dpp_pbu_port_th_set(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + DPP_PBU_PORT_TH_PARA_T *p_para) +{ + DPP_STATUS rc = 0; + ZXIC_UINT32 *p_data = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), port_id, 0, DPP_PBU_PORT_NUM - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_para); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_para->lif_th, 0, DPP_PBU_PORT_TH_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_para->lif_prv, 0, DPP_PBU_PORT_TH_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_para->idma_prv, 0, DPP_PBU_PORT_TH_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_para->idma_th_cos7, 0, DPP_PBU_PORT_TH_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_para->idma_th_cos6, 0, p_para->idma_th_cos7); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_para->idma_th_cos5, 0, p_para->idma_th_cos6); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_para->idma_th_cos4, 0, p_para->idma_th_cos5); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_para->idma_th_cos3, 0, p_para->idma_th_cos4); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_para->idma_th_cos2, 0, p_para->idma_th_cos3); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_para->idma_th_cos1, 0, p_para->idma_th_cos2); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_para->idma_th_cos0, 0, p_para->idma_th_cos1); + + + p_data = (ZXIC_UINT32*)p_para; + + rc = dpp_reg_write(dev, + NPPU_PBU_CFG_MEMID_0_PBU_FC_IDMATH_RAMr, + 0, + port_id, + p_data); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读取端口的阈值 +* @param dev_id 设备编号 +* @param port_id 端口号 +* @param p_para 端口阈值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/07/09 +************************************************************/ +DPP_STATUS dpp_pbu_port_th_get(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + DPP_PBU_PORT_TH_PARA_T *p_para) +{ + DPP_STATUS rc = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), port_id, 0, DPP_PBU_PORT_NUM - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_para); + + rc = dpp_reg_read(dev, NPPU_PBU_CFG_MEMID_0_PBU_FC_IDMATH_RAMr, 0, port_id, (ZXIC_UINT32*)p_para); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + + return DPP_OK; +} + +/***********************************************************/ +/** 配置指定端口按cos优先级起pfc流控的优先级流控指针阈值,仅对lif0的48个通道有效 +* @param dev_id 设备编号 +* @param port_id 端口号 +* @param p_para cos阈值,要求高优先级的阈值不小于低优先级的阈值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/07/09 +************************************************************/ +DPP_STATUS dpp_pbu_port_cos_th_set(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + DPP_PBU_PORT_COS_TH_PARA_T *p_para) +{ + DPP_STATUS rc = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 tmp_index = 0; + ZXIC_UINT32 *p_data = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), port_id, 0, DPP_PBU_PORT_NUM - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_para); + + if (port_id < DPP_PBU_LIF1_PORT_NUM) + { + tmp_index = port_id; + + } + else if (port_id == DPP_PBU_TM_LOOP_PORT_NUM) + { + tmp_index = 56; + + } + else + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "dpp_pbu_port_cos_th_set: please check input port:%d !!!!!!\n", port_id); + return DPP_OK; + } + + for (i = 0; i < DPP_PBU_COS_NUM; i++) + { + if (0 == i) + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_para->cos_th[i], 0, DPP_PBU_PORT_COS_MAX_TH ); + } + else + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_para->cos_th[i], p_para->cos_th[i - 1], DPP_PBU_PORT_COS_MAX_TH); + } + } + + p_data = (ZXIC_UINT32*)p_para; + + rc = dpp_reg_write(dev, NPPU_PBU_CFG_MEMID_1_PBU_FC_MACTH_RAMr, 0, tmp_index, p_data ); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 读取指定端口中各cos的优先级流控指针阈值,仅对lif0的48个通道有效 +* @param dev_id 设备编号 +* @param port_id 端口号 +* @param p_para cos阈值,要求高优先级的阈值不小于低优先级的阈值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/07/09 +************************************************************/ +DPP_STATUS dpp_pbu_port_cos_th_get(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + DPP_PBU_PORT_COS_TH_PARA_T *p_para) +{ + DPP_STATUS rc = 0; + ZXIC_UINT32 tmp_index = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), port_id, 0, DPP_PBU_PORT_NUM - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_para); + + if (port_id < DPP_PBU_LIF1_PORT_NUM) + { + tmp_index = port_id; + + } + else if (port_id == DPP_PBU_TM_LOOP_PORT_NUM) + { + tmp_index = 56; + + } + else + { + return DPP_OK; + } + + rc = dpp_reg_read(dev, NPPU_PBU_CFG_MEMID_1_PBU_FC_MACTH_RAMr, 0, tmp_index, (ZXIC_UINT32*)p_para); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + return DPP_OK; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/ppu/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/ppu/Kbuild.include new file mode 100644 index 0000000..9fcf516 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/ppu/Kbuild.include @@ -0,0 +1,2 @@ +cur_dir := en_np/sdk/source/dev/module/ppu/ +src_files += $(addprefix $(cur_dir),$(notdir $(wildcard $(dinghai_root)/$(cur_dir)*.c))) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/ppu/dpp_ppu.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/ppu/dpp_ppu.c new file mode 100755 index 0000000..699b8ea --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/ppu/dpp_ppu.c @@ -0,0 +1,339 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_ppu.c +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : 王春雷 +* 完成日期 : 2014/03/18 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#include "zxic_common.h" +#include "dpp_reg.h" +#include "dpp_dev.h" +#include "dpp_ppu_api.h" +#include "dpp_ppu.h" +#include "dpp_ppu4k_reg.h" + +#define OPR_WRITE (0) +#define OPR_READ (1) + +DPP_PPU_CLS_BITMAP_T g_ppu_cls_bit_map[DPP_DEV_CHANNEL_MAX]; + +#if ZXIC_REAL("INIT") + +ZXIC_UINT32 dpp_ppu_cls_use_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 cluster_id, + ZXIC_UINT32 flag) +{ + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, cluster_id, 0, DPP_PPU_CLUSTER_NUM - 1); + g_ppu_cls_bit_map[dev_id].cls_use[cluster_id] = flag; + + return DPP_OK; +} + +ZXIC_UINT32 dpp_ppu_cls_use_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 cluster_id) +{ + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, cluster_id, 0, DPP_PPU_CLUSTER_NUM - 1); + + return g_ppu_cls_bit_map[dev_id].cls_use[cluster_id]; +} + +ZXIC_UINT32 dpp_ppu_instr_mem_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 mem_id, + ZXIC_UINT32 flag) +{ + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, mem_id, 0, PPU_INSTR_MEM_NUM - 1); + g_ppu_cls_bit_map[dev_id].instr_mem[mem_id] = flag; + + return DPP_OK; +} + +#define DPP_PPU_CLS_USE_CHECK(dev_id,cls_id) \ + do{ \ + if (!dpp_ppu_cls_use_get(dev_id, cls_id))\ + {\ + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n %s:%d[Error:cluster %d stop] ! FUNCTION : %s!\n",__FILE__,__LINE__,cls_id,__FUNCTION__);\ + ZXIC_COMM_ASSERT(0);\ + return DPP_ERR;\ + }\ + }while (0) + +ZXIC_UINT32 dpp_ppu_parse_cls_bitmap(ZXIC_UINT32 dev_id, + ZXIC_UINT32 bitmap) +{ + ZXIC_UINT32 cls_id = 0; + ZXIC_UINT32 mem_id = 0; + + ZXIC_UINT32 cls_use = 0; + ZXIC_UINT32 instr_mem = 0; + + /*cluster 使用标记必须保证至少有一个cluster是打开的使用的*/ + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, bitmap, 0, DPP_PPU_CLS_ALL_START); + + for (cls_id = 0; cls_id < DPP_PPU_CLUSTER_NUM; cls_id++) + { + cls_use = (bitmap >> cls_id) & 0x1; + + dpp_ppu_cls_use_set(dev_id, cls_id, cls_use); + } + + for (mem_id = 0; mem_id < PPU_INSTR_MEM_NUM; mem_id++) + { + instr_mem = (bitmap >> (mem_id * 2)) & 0x3; + + dpp_ppu_instr_mem_set(dev_id, mem_id, ((instr_mem > 0) ? 1 : 0)); + } + + return DPP_OK; +} + +#endif + +#if ZXIC_REAL("TABEL_CFG") +/***********************************************************/ +/** 配置SDT表 +* @param dev_id 设备号,范围0~3 +* @param cluster_id me cluster编号,范围0~7 +* @param index 地址,即sdt表号,范围0~255 +* @param p_sdt_data sdt表数据 +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/03/18 +************************************************************/ +DPP_STATUS dpp_ppu_sdt_tbl_write(DPP_DEV_T *dev, ZXIC_UINT32 cluster_id, ZXIC_UINT32 index, DPP_SDT_TBL_DATA_T *p_sdt_data) +{ + DPP_STATUS rtn = DPP_OK; + DPP_PPU4K_CLUSTER_WR_HIGH_DATA_R_MEX_T high_data = {0}; + DPP_PPU4K_CLUSTER_WR_LOW_DATA_R_MEX_T low_data = {0}; + DPP_PPU4K_CLUSTER_ADDR_R_MEX_T sdt_cmd = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), index, PPU_SDT_IDX_MIN, PPU_SDT_IDX_MAX); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_sdt_data); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), cluster_id, 0, DPP_PPU_CLUSTER_NUM - 1); + DPP_PPU_CLS_USE_CHECK(DEV_ID(dev), cluster_id); + + /* write data reg*/ + high_data.wr_high_data_r_mex = p_sdt_data->data_high32; + low_data.wr_low_data_r_mex = p_sdt_data->data_low32; + rtn = dpp_reg_write(dev, + PPU4K_CLUSTER_WR_HIGH_DATA_R_MEXr, + cluster_id, + 0, + &high_data); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_write"); + + rtn = dpp_reg_write(dev, + PPU4K_CLUSTER_WR_LOW_DATA_R_MEXr, + cluster_id, + 0, + &low_data); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_write"); + + /* write cmd reg*/ + sdt_cmd.operate_type = OPR_WRITE; + sdt_cmd.addr_r_mex = index; + + rtn = dpp_reg_write(dev, + PPU4K_CLUSTER_ADDR_R_MEXr, + cluster_id, + 0, + &sdt_cmd); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_write"); + + return DPP_OK; +} +#endif + +#if ZXIC_REAL("PPU_STATICS") + +/***********************************************************/ +/**配置协处理器哈希计算密钥 +* @param dev_id 设备号 +* @param DPP_PPU_PPU_COP_THASH_RSK_T +* +* @return +* @remark 无 +* @see +* @author yangmy @date 2022/09/09 +************************************************************/ +DPP_STATUS dpp_ppu_ppu_cop_thash_rsk_set(DPP_DEV_T *dev, DPP_PPU_PPU_COP_THASH_RSK_T *p_para) +{ + DPP_STATUS rc = DPP_OK; + + DPP_PPU_PPU_COP_THASH_RSK_031_000_T rsk_031_000 = {0}; + DPP_PPU_PPU_COP_THASH_RSK_063_032_T rsk_063_032 = {0}; + DPP_PPU_PPU_COP_THASH_RSK_095_064_T rsk_095_064 = {0}; + DPP_PPU_PPU_COP_THASH_RSK_127_096_T rsk_127_096 = {0}; + DPP_PPU_PPU_COP_THASH_RSK_159_128_T rsk_159_128 = {0}; + DPP_PPU_PPU_COP_THASH_RSK_191_160_T rsk_191_160 = {0}; + DPP_PPU_PPU_COP_THASH_RSK_223_192_T rsk_223_192 = {0}; + DPP_PPU_PPU_COP_THASH_RSK_255_224_T rsk_255_224 = {0}; + DPP_PPU_PPU_COP_THASH_RSK_287_256_T rsk_287_256 = {0}; + DPP_PPU_PPU_COP_THASH_RSK_319_288_T rsk_319_288 = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_para); + + + + rsk_031_000.rsk_031_000 = p_para->rsk_031_000; + rsk_063_032.rsk_063_032 = p_para->rsk_063_032; + rsk_095_064.rsk_095_064 = p_para->rsk_095_064; + rsk_127_096.rsk_127_096 = p_para->rsk_127_096; + rsk_159_128.rsk_159_128 = p_para->rsk_159_128; + rsk_191_160.rsk_191_160 = p_para->rsk_191_160; + rsk_223_192.rsk_223_192 = p_para->rsk_223_192; + rsk_255_224.rsk_255_224 = p_para->rsk_255_224; + rsk_287_256.rsk_287_256 = p_para->rsk_287_256; + rsk_319_288.rsk_319_288 = p_para->rsk_319_288; + + + rc = dpp_reg_write(dev, + PPU_PPU_COP_THASH_RSK_031_000r, + 0, + 0, + &rsk_031_000); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev, + PPU_PPU_COP_THASH_RSK_063_032r, + 0, + 0, + &rsk_063_032); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev, + PPU_PPU_COP_THASH_RSK_095_064r, + 0, + 0, + &rsk_095_064); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev, + PPU_PPU_COP_THASH_RSK_127_096r, + 0, + 0, + &rsk_127_096); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev, + PPU_PPU_COP_THASH_RSK_159_128r, + 0, + 0, + &rsk_159_128); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev, + PPU_PPU_COP_THASH_RSK_191_160r, + 0, + 0, + &rsk_191_160); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev, + PPU_PPU_COP_THASH_RSK_223_192r, + 0, + 0, + &rsk_223_192); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + + rc = dpp_reg_write(dev, + PPU_PPU_COP_THASH_RSK_255_224r, + 0, + 0, + &rsk_255_224); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + + rc = dpp_reg_write(dev, + PPU_PPU_COP_THASH_RSK_287_256r, + 0, + 0, + &rsk_287_256); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + + rc = dpp_reg_write(dev, + PPU_PPU_COP_THASH_RSK_319_288r, + 0, + 0, + &rsk_319_288); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + return DPP_OK; +} + +DPP_STATUS dpp_ppu_ppu_cop_thash_rsk_get(DPP_DEV_T *dev, DPP_PPU_PPU_COP_THASH_RSK_T *p_ppu_cop_thash_rsk) +{ + DPP_STATUS rtn = DPP_OK; + + DPP_PPU_PPU_COP_THASH_RSK_031_000_T rsk_031_000 = {0}; + DPP_PPU_PPU_COP_THASH_RSK_063_032_T rsk_063_032 = {0}; + DPP_PPU_PPU_COP_THASH_RSK_095_064_T rsk_095_064 = {0}; + DPP_PPU_PPU_COP_THASH_RSK_127_096_T rsk_127_096 = {0}; + DPP_PPU_PPU_COP_THASH_RSK_159_128_T rsk_159_128 = {0}; + DPP_PPU_PPU_COP_THASH_RSK_191_160_T rsk_191_160 = {0}; + DPP_PPU_PPU_COP_THASH_RSK_223_192_T rsk_223_192 = {0}; + DPP_PPU_PPU_COP_THASH_RSK_255_224_T rsk_255_224 = {0}; + DPP_PPU_PPU_COP_THASH_RSK_287_256_T rsk_287_256 = {0}; + DPP_PPU_PPU_COP_THASH_RSK_319_288_T rsk_319_288 = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_ppu_cop_thash_rsk); + + rtn = dpp_reg_read(dev, PPU_PPU_COP_THASH_RSK_031_000r, 0, 0, &rsk_031_000); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_read"); + rtn = dpp_reg_read(dev, PPU_PPU_COP_THASH_RSK_063_032r, 0, 0, &rsk_063_032); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_read"); + rtn = dpp_reg_read(dev, PPU_PPU_COP_THASH_RSK_095_064r, 0, 0, &rsk_095_064); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_read"); + rtn = dpp_reg_read(dev, PPU_PPU_COP_THASH_RSK_127_096r, 0, 0, &rsk_127_096); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_read"); + rtn = dpp_reg_read(dev, PPU_PPU_COP_THASH_RSK_159_128r, 0, 0, &rsk_159_128); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_read"); + rtn = dpp_reg_read(dev, PPU_PPU_COP_THASH_RSK_191_160r, 0, 0, &rsk_191_160); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_read"); + rtn = dpp_reg_read(dev, PPU_PPU_COP_THASH_RSK_223_192r, 0, 0, &rsk_223_192); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_read"); + rtn = dpp_reg_read(dev, PPU_PPU_COP_THASH_RSK_255_224r, 0, 0, &rsk_255_224); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_read"); + rtn = dpp_reg_read(dev, PPU_PPU_COP_THASH_RSK_287_256r, 0, 0, &rsk_287_256); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_read"); + rtn = dpp_reg_read(dev, PPU_PPU_COP_THASH_RSK_319_288r, 0, 0, &rsk_319_288); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_read"); + + + p_ppu_cop_thash_rsk->rsk_031_000 = rsk_031_000.rsk_031_000; + p_ppu_cop_thash_rsk->rsk_063_032 = rsk_063_032.rsk_063_032; + p_ppu_cop_thash_rsk->rsk_095_064 = rsk_095_064.rsk_095_064; + p_ppu_cop_thash_rsk->rsk_127_096 = rsk_127_096.rsk_127_096; + p_ppu_cop_thash_rsk->rsk_159_128 = rsk_159_128.rsk_159_128; + p_ppu_cop_thash_rsk->rsk_191_160 = rsk_191_160.rsk_191_160; + p_ppu_cop_thash_rsk->rsk_223_192 = rsk_223_192.rsk_223_192; + p_ppu_cop_thash_rsk->rsk_255_224 = rsk_255_224.rsk_255_224; + p_ppu_cop_thash_rsk->rsk_287_256 = rsk_287_256.rsk_287_256; + p_ppu_cop_thash_rsk->rsk_319_288 = rsk_319_288.rsk_319_288; + + + return DPP_OK; + +} + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se/Kbuild.include new file mode 100644 index 0000000..bda349a --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se/Kbuild.include @@ -0,0 +1,2 @@ +cur_dir := en_np/sdk/source/dev/module/se/ +src_files += $(addprefix $(cur_dir),$(notdir $(wildcard $(dinghai_root)/$(cur_dir)*.c))) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se/dpp_etcam.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se/dpp_etcam.c new file mode 100644 index 0000000..f92a6fe --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se/dpp_etcam.c @@ -0,0 +1,814 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_etcam.c +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : 王春雷 +* 完成日期 : 2014/04/03 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#include "zxic_common.h" + +#include "dpp_reg.h" +#include "dpp_se_api.h" +#include "dpp_etcam.h" +#include "dpp_dev.h" +#include "dpp_stat4k_reg.h" + +#define DPP_ETCAM_OPR_WR (1) +#define DPP_ETCAM_OPR_RD (2) +#define DPP_ETCAM_OPR_UNLOAD (3) +#define DPP_ETCAM_OPR_VBIT (4) + +#define TBLID_CFG_SETP (8) +#define BADDR_CFG_SETP (4) + +/** 当前etcam 条目vld信息 */ +DPP_ETCAM_ENTRY_VLD_T g_etcam_vld_info[DPP_DEV_CHANNEL_MAX][DPP_ETCAM_BLOCK_NUM][DPP_ETCAM_RAM_DEPTH] = {{{{0}}}}; +#define GET_ETCAM_VLD_INFO(dev_id,block_id,block_index) (g_etcam_vld_info[dev_id][block_id] + block_index) + +#if ZXIC_REAL("IN_FUNC") +/***********************************************************/ +/** 将用户输入的D/M格式的数据转换为写硬件需要的X/Y数据 +* @param p_dm +* @param p_xy +* @param len +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/04/03 +************************************************************/ +DPP_STATUS dpp_etcam_dm_to_xy(DPP_ETCAM_ENTRY_T *p_dm, + DPP_ETCAM_ENTRY_T *p_xy, + ZXIC_UINT32 len) +{ + ZXIC_UINT32 i = 0; + + ZXIC_COMM_CHECK_POINT(p_dm); + ZXIC_COMM_CHECK_POINT(p_xy); + ZXIC_COMM_CHECK_INDEX(len, 0, DPP_ETCAM_WIDTH_MAX / 8); + ZXIC_COMM_ASSERT(p_dm->p_data && p_dm->p_mask && p_xy->p_data && p_xy->p_mask); + + for (i = 0; i < len; i++) + { + p_xy->p_data[i] = ZXIC_COMM_DM_TO_X(p_dm->p_data[i], p_dm->p_mask[i]); + p_xy->p_mask[i] = ZXIC_COMM_DM_TO_Y(p_dm->p_data[i], p_dm->p_mask[i]); + } + + return DPP_OK; +} + +/***********************************************************/ +/** 将从硬件读到的X/Y格式的数据转换为用户需要的D/M数据 +* @param p_xy +* @param p_dm +* @param len +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/04/03 +************************************************************/ +DPP_STATUS dpp_etcam_xy_to_dm(DPP_ETCAM_ENTRY_T *p_dm, + DPP_ETCAM_ENTRY_T *p_xy, + ZXIC_UINT32 len) +{ + ZXIC_UINT32 i = 0; + + ZXIC_COMM_CHECK_POINT(p_dm); + ZXIC_COMM_CHECK_POINT(p_xy); + ZXIC_COMM_CHECK_INDEX(len, 0, DPP_ETCAM_WIDTH_MAX / 8); + ZXIC_COMM_ASSERT(p_dm->p_data && p_dm->p_mask && p_xy->p_data && p_xy->p_mask); + + for (i = 0; i < len; i++) + { + p_dm->p_data[i] = ZXIC_COMM_XY_TO_DATA(p_xy->p_data[i], p_xy->p_mask[i]); /* valid only when mask is 0 */ + p_dm->p_mask[i] = ZXIC_COMM_XY_TO_MASK(p_xy->p_data[i], p_xy->p_mask[i]); + } + + return DPP_OK; +} + +/***********************************************************/ +/** 根据读写模式,获取需要操作的间接寄存器掩码 +* @param mask block RAM操作位图,共8比特,每比特对应一个block RAM行的80bit +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/03/31 +************************************************************/ +ZXIC_UINT32 dpp_etcam_ind_data_reg_opr_mask_get(ZXIC_UINT32 mask) +{ + ZXIC_UINT32 i = 0; + ZXIC_UINT32 reg_mask = 0; + + ZXIC_COMM_CHECK_INDEX(mask, 0, 0xff); + + for (i = 0; i < DPP_ETCAM_RAM_NUM; i++) + { + if ((mask >> i) & 0x1) + { + reg_mask |= ((ZXIC_UINT32)0x7 << ((i / 2) * 5 + (i % 2) * 2)); + } + } + + return reg_mask; +} + +/***********************************************************/ +/** 写eTcam表项数据 +* @param dev_id +* @param wr_mask +* @param p_data +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/03/31 +************************************************************/ +DPP_STATUS dpp_etcam_ind_data_set(DPP_DEV_T *dev, ZXIC_UINT32 wr_mask, ZXIC_UINT8 *p_data) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 offset = 0; + ZXIC_UINT32 reg_mask = 0; + ZXIC_UINT8 *p_temp = NULL; + ZXIC_UINT8 buff[DPP_ETCAM_WIDTH_MAX / 8] = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), wr_mask, 0, DPP_ETCAM_WR_MASK_MAX); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data); + + p_temp = p_data; + + /* 160bit key: high 80bit in tcam_ram1, low 80bit in tcam_ram0, and so on. */ + for (i = 0; i < DPP_ETCAM_RAM_NUM; i++) + { + offset = i * ((ZXIC_UINT32)DPP_ETCAM_WIDTH_MIN / 8); + + if ((wr_mask >> (DPP_ETCAM_RAM_NUM - 1 - i)) & 0x1) + { + ZXIC_COMM_MEMCPY(buff + offset, p_temp, DPP_ETCAM_WIDTH_MIN / 8); + p_temp += DPP_ETCAM_WIDTH_MIN / 8; + } + } + + zxic_comm_swap(buff, DPP_ETCAM_WIDTH_MAX / 8); + + /* get ind data reg operate mask, 20bit */ + reg_mask = dpp_etcam_ind_data_reg_opr_mask_get(wr_mask); + + /* cpu_ind_wdat0 reg is for lowest 32bit data. */ + for (i = 0; i < (DPP_ETCAM_WIDTH_MAX / 32); i++) + { + if ((reg_mask >> (DPP_ETCAM_WIDTH_MAX / 32 - 1 - i)) & 0x1) + { + rc = dpp_reg_write(dev, + STAT_ETCAM_CPU_IND_WDAT19r - i, + 0, + 0, + (buff + i * sizeof(ZXIC_UINT32))); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + } + } + + return DPP_OK; +} + +/***********************************************************/ +/** 写eTcam间接命令寄存器 +* @param dev_id +* @param addr etcam地址(0-511) +* @param block_idx block索引(0-15) +* @param data_or_mask 1:写X(data), 0:写Y(mask) +* @param wr_mask 写入掩码, 最高8bit, 对应bit为1代表对应的80bit数据 +* @param opr_type 1-write, 2-read, 3-unload +* @param tacm_reg_flag 1:配置内部row_col_mask寄存器 还是0:读写tcam +* @param row_mask_flag 1: write row_mask reg, 0: write col_mask reg +* @param vben enable the valid bit addressed by addr +* @param vbit valid bit input +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/03/29 +* @modify YXH @date 2018/11/29 +************************************************************/ +DPP_STATUS dpp_etcam_ind_cmd_set(DPP_DEV_T *dev, + ZXIC_UINT32 addr, + ZXIC_UINT32 block_idx, + ZXIC_UINT32 data_or_mask, + ZXIC_UINT32 wr_mask, + ZXIC_UINT32 opr_type, + ZXIC_UINT32 tacm_reg_flag, + ZXIC_UINT32 row_mask_flag, + ZXIC_UINT32 vben, + ZXIC_UINT32 vbit) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_ETCAM_CPU_IND_CTRL_TMP0_T ind_cmd = {0}; + DPP_STAT_ETCAM_CPU_IND_CTRL_TMP1_T ind_cmd_1 = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), addr, 0, DPP_ETCAM_RAM_DEPTH - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), block_idx, 0, DPP_ETCAM_BLOCK_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), data_or_mask, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), wr_mask, 0, DPP_ETCAM_WR_MASK_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), opr_type, 1, 4); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), tacm_reg_flag, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), row_mask_flag, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), vben, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), vbit, 0, 0xff); + + /* 一定要先配置 配置寄存器1,再配置 配置寄存器0 */ + ind_cmd_1.row_or_col_msk = row_mask_flag; + ind_cmd_1.vben = vben; + ind_cmd_1.vbit = vbit; + + rc = dpp_reg_write(dev, + STAT_ETCAM_CPU_IND_CTRL_TMP1r, + 0, + 0, + &ind_cmd_1); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + /* opr_type: 1-write, 2-read, 3-unload */ + switch (opr_type) + { + case DPP_ETCAM_OPR_RD: + { + ind_cmd.rd_wr = 1; + } + break; + + case DPP_ETCAM_OPR_WR: + { + ind_cmd.rd_wr = 0; + ind_cmd.wr_mode = wr_mask; + } + break; + + case DPP_ETCAM_OPR_UNLOAD: + { + /* 掩码表,决定哪些条目删除,8bit */ + ind_cmd.flush = wr_mask; + } + break; + + case DPP_ETCAM_OPR_VBIT: + { + /* 获取该地址的vbit valid位状态 */ + ind_cmd.rd_wr = 1; + ind_cmd.wr_mode = wr_mask; + } + break; + + default: + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "Invalid opr_type!\n"); + ZXIC_COMM_ASSERT(0); + return DPP_ERR; + } + } + + ind_cmd.dat_or_mask = data_or_mask; + ind_cmd.ram_sel = block_idx; + ind_cmd.addr = addr; + + ZXIC_COMM_TRACE_DEBUG("data_or_mask:%d\n", ind_cmd.dat_or_mask); + ZXIC_COMM_TRACE_DEBUG("block_idx:%d\n", ind_cmd.ram_sel); + ZXIC_COMM_TRACE_DEBUG("addr:0x%08x\n", ind_cmd.addr); + + rc = dpp_reg_write(dev, + STAT_ETCAM_CPU_IND_CTRL_TMP0r, + 0, + 0, + &ind_cmd); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + +#endif + +#if ZXIC_REAL("EX_FUNC") +/***********************************************************/ +/** 获取etcam中每个block的cpu操作fifo将满信号,若将满则cpu不能再操作当前block +* @param dev_id 设备号 +* @param block_idx etcam中的block编号,范围0~15 +* @param p_cpu_afull +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2015/02/07 +************************************************************/ +DPP_STATUS dpp_etcam_cpu_afull_get(DPP_DEV_T *dev, ZXIC_UINT32 block_idx, ZXIC_UINT32 *p_cpu_afull) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_ETCAM_ETCAM_CPU_FL_T cpu_fl = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), block_idx, 0, DPP_ETCAM_BLOCK_NUM - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_cpu_afull); + + rc = dpp_reg_read(dev, STAT_ETCAM_ETCAM_CPU_FLr, 0, 0, &cpu_fl); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_cpu_afull = (cpu_fl.etcam_cpu_fl >> block_idx) & 0x1; + + return DPP_OK; +} + +/***********************************************************/ +/** 校验etcam中每个block的cpu操作fifo将满信号,若将满则cpu不能再操作当前block +* @param dev_id 设备号 +* @param block_idx etcam中的block编号,范围0~7 +* +* @return +* @remark 无 +* @see +* @author wll @date 2019/04/15 +************************************************************/ +DPP_STATUS dpp_etcam_cpu_afull_check(DPP_DEV_T *dev, ZXIC_UINT32 block_idx) +{ + ZXIC_UINT32 read_cnt = 0; + ZXIC_UINT32 cpu_afull = 1; + DPP_STATUS rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), block_idx, 0, DPP_ETCAM_BLOCK_NUM - 1); + + while (cpu_afull) + { + rc = dpp_etcam_cpu_afull_get(dev, block_idx, &cpu_afull); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_etcam_cpu_afull_get"); + + if (!cpu_afull) + { + break; + } + + read_cnt++; + + if (read_cnt > DPP_RD_CNT_MAX * DPP_RD_CNT_MAX) + { + ZXIC_COMM_TRACE_ERROR("Error!!! dpp_etcam_cpu_afull_check is overtime!\n"); + return DPP_ERR; + } + + /* zxic_comm_usleep(100); */ + } + + return DPP_OK; +} + +/***********************************************************/ +/** 添加eTcam表条目 +* @param dev_id 设备号 +* @param addr 每个block中的ram地址,位宽为8*80bit +* @param block_idx block编号,范围0~7 +* @param wr_mask 写表掩码,共8bit,每bit控制ram中对应位置的80bit数据是否有效 +* @param opr_type etcam操作类型,详见 DPP_ETCAM_OPR_TYPE_E +* @param p_entry 条目数据,data和mask +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/04/03 +************************************************************/ +DPP_STATUS dpp_etcam_entry_add(DPP_DEV_T *dev, + ZXIC_UINT32 addr, + ZXIC_UINT32 block_idx, + ZXIC_UINT32 wr_mask, + ZXIC_UINT32 opr_type, + DPP_ETCAM_ENTRY_T *p_entry) +{ + DPP_STATUS rc = DPP_OK; + // ZXIC_UINT32 i = 0; + // ZXIC_UINT32 tbl_id = 0; + // ZXIC_UINT32 handle_row = 0; + // ZXIC_UINT32 handle = 0; + // ZXIC_UINT32 basea_addr = 0; + ZXIC_UINT8 temp_data[DPP_ETCAM_WIDTH_MAX / 8] = {0}; + ZXIC_UINT8 temp_mask[DPP_ETCAM_WIDTH_MAX / 8] = {0}; + ZXIC_MUTEX_T *p_etcam_mutex = NULL; + DPP_ETCAM_ENTRY_T entry_xy = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), addr, 0, DPP_ETCAM_RAM_DEPTH - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), block_idx, 0, DPP_ETCAM_BLOCK_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), wr_mask, 0, DPP_ETCAM_WR_MASK_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), opr_type, DPP_ETCAM_OPR_DM, DPP_ETCAM_OPR_XY); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_entry); + + rc = dpp_dev_opr_mutex_get(DEV_ID(dev), DPP_DEV_MUTEX_T_ETCAM, &p_etcam_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dev_opr_mutex_get"); + + rc = zxic_comm_mutex_lock(p_etcam_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "zxic_comm_mutex_lock"); + + /* check cpu fifo is afull */ + rc = dpp_etcam_cpu_afull_check(dev, block_idx); + ZXIC_COMM_CHECK_DEV_RC_UNLOCK(DEV_ID(dev), rc, "dpp_etcam_cpu_afull_check", p_etcam_mutex); + + ZXIC_COMM_ASSERT(p_entry->p_data && p_entry->p_mask); + + entry_xy.p_data = temp_data; + entry_xy.p_mask = temp_mask; + + if (opr_type == DPP_ETCAM_OPR_DM) + { + /* convert user D/M data to X/Y */ + rc = dpp_etcam_dm_to_xy(p_entry, &entry_xy, DPP_ETCAM_ENTRY_SIZE_GET(p_entry->mode)); + ZXIC_COMM_CHECK_DEV_RC_UNLOCK(DEV_ID(dev), rc, "dpp_etcam_dm_to_xy", p_etcam_mutex); + } + else + { + ZXIC_COMM_MEMCPY(entry_xy.p_data, p_entry->p_data, DPP_ETCAM_ENTRY_SIZE_GET(p_entry->mode)); + ZXIC_COMM_MEMCPY(entry_xy.p_mask, p_entry->p_mask, DPP_ETCAM_ENTRY_SIZE_GET(p_entry->mode)); + } + + /* write data X */ + rc = dpp_etcam_ind_data_set(dev, wr_mask, entry_xy.p_data); + ZXIC_COMM_CHECK_DEV_RC_UNLOCK(DEV_ID(dev), rc, "dpp_etcam_ind_data_set", p_etcam_mutex); + + rc = dpp_etcam_ind_cmd_set(dev, + addr, + block_idx, + DPP_ETCAM_DTYPE_DATA, + wr_mask, + DPP_ETCAM_OPR_WR, + 0, + 0, + 1, + 0); + ZXIC_COMM_CHECK_DEV_RC_UNLOCK(DEV_ID(dev), rc, "dpp_etcam_ind_cmd_set", p_etcam_mutex); + + /* write mask Y */ + rc = dpp_etcam_ind_data_set(dev, wr_mask, entry_xy.p_mask); + ZXIC_COMM_CHECK_DEV_RC_UNLOCK(DEV_ID(dev), rc, "dpp_etcam_ind_data_set", p_etcam_mutex); + + rc = dpp_etcam_ind_cmd_set(dev, + addr, + block_idx, + DPP_ETCAM_DTYPE_MASK, + wr_mask, + DPP_ETCAM_OPR_WR, + 0, + 0, + 1, + 0xFF); + ZXIC_COMM_CHECK_DEV_RC_UNLOCK(DEV_ID(dev), rc, "dpp_etcam_ind_cmd_set", p_etcam_mutex); + + rc = zxic_comm_mutex_unlock(p_etcam_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "zxic_comm_mutex_unlock"); + + return DPP_OK; +} + +/***********************************************************/ +/** 删除eTcam表项条目 +* @param dev_id 设备号 +* @param addr 每个block中的ram地址,位宽为8*80bit +* @param block_idx block的编号,范围0~7 +* @param wr_mask 写表掩码,共8bit,每bit控制ram中对应位置的80bit数据是否有效 +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/04/03 +************************************************************/ +DPP_STATUS dpp_etcam_entry_del(DPP_DEV_T *dev, + ZXIC_UINT32 addr, + ZXIC_UINT32 block_idx, + ZXIC_UINT32 wr_mask) +{ + DPP_STATUS rc = DPP_OK; + // ZXIC_UINT32 i = 0; + // ZXIC_UINT32 tbl_id = 0; + // ZXIC_UINT32 handle_row = 0; + // ZXIC_UINT32 handle = 0; + // ZXIC_UINT32 basea_addr = 0; + + ZXIC_UINT8 temp_data[DPP_ETCAM_WIDTH_MAX / 8] = {0xff,}; + ZXIC_UINT8 temp_mask[DPP_ETCAM_WIDTH_MAX / 8] = {0,}; + ZXIC_MUTEX_T *p_etcam_mutex = NULL; + DPP_ETCAM_ENTRY_T entry_xy = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), addr, 0, DPP_ETCAM_RAM_DEPTH - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), block_idx, 0, DPP_ETCAM_BLOCK_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), wr_mask, 0, DPP_ETCAM_WR_MASK_MAX); + + ZXIC_COMM_MEMSET(temp_data, 0xff, DPP_ETCAM_WIDTH_MAX / 8); + ZXIC_COMM_MEMSET(temp_mask, 0, DPP_ETCAM_WIDTH_MAX / 8); + + entry_xy.p_data = temp_data; + entry_xy.p_mask = temp_mask; + + rc = dpp_dev_opr_mutex_get(DEV_ID(dev), DPP_DEV_MUTEX_T_ETCAM, &p_etcam_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dev_opr_mutex_get"); + + rc = zxic_comm_mutex_lock(p_etcam_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "zxic_comm_mutex_lock"); + + /* check cpu fifo is afull */ + rc = dpp_etcam_cpu_afull_check(dev, block_idx); + ZXIC_COMM_CHECK_DEV_RC_UNLOCK(DEV_ID(dev), rc, "dpp_etcam_cpu_afull_check", p_etcam_mutex); + + /* write data X */ + rc = dpp_etcam_ind_data_set(dev, wr_mask, entry_xy.p_data); + ZXIC_COMM_CHECK_DEV_RC_UNLOCK(DEV_ID(dev), rc, "dpp_etcam_ind_data_set", p_etcam_mutex); + + rc = dpp_etcam_ind_cmd_set(dev, + addr, + block_idx, + DPP_ETCAM_DTYPE_DATA, + wr_mask, + DPP_ETCAM_OPR_WR, + 0, + 0, + 1, + 0xFF); + ZXIC_COMM_CHECK_DEV_RC_UNLOCK(DEV_ID(dev), rc, "dpp_etcam_ind_cmd_set", p_etcam_mutex); + + /* write mask Y */ + rc = dpp_etcam_ind_data_set(dev, wr_mask, entry_xy.p_mask); + ZXIC_COMM_CHECK_DEV_RC_UNLOCK(DEV_ID(dev), rc, "dpp_etcam_ind_data_set", p_etcam_mutex); + + rc = dpp_etcam_ind_cmd_set(dev, + addr, + block_idx, + DPP_ETCAM_DTYPE_MASK, + wr_mask, + DPP_ETCAM_OPR_WR, + 0, + 0, + 1, + 0xFF); + ZXIC_COMM_CHECK_DEV_RC_UNLOCK(DEV_ID(dev), rc, "dpp_etcam_ind_cmd_set", p_etcam_mutex); + + rc = zxic_comm_mutex_unlock(p_etcam_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "zxic_comm_mutex_unlock"); + + return DPP_OK; +} + +/***********************************************************/ +/** 比较一组data/mask和一组X/Y数据内容是否相异 +* @param p_entry_dm 待比较的data/mask数据 +* @param p_entry_xy 待比较的一组X/Y组合数据 +* +* @return 1-不同,0-相同 +* @remark 无 +* @see +* @author 王春雷 @date 2015/04/23 +************************************************************/ +ZXIC_UINT32 dpp_etcam_entry_cmp(DPP_ETCAM_ENTRY_T *p_entry_dm, DPP_ETCAM_ENTRY_T *p_entry_xy) +{ + DPP_STATUS rc = 0; + ZXIC_UINT32 data_len = 0; + ZXIC_UINT8 temp_data[DPP_ETCAM_WIDTH_MAX / 8] = {0}; + ZXIC_UINT8 temp_mask[DPP_ETCAM_WIDTH_MAX / 8] = {0}; + DPP_ETCAM_ENTRY_T entry_xy_temp = {0}; + + ZXIC_COMM_CHECK_POINT(p_entry_dm); + ZXIC_COMM_CHECK_POINT(p_entry_xy); + + entry_xy_temp.mode = p_entry_dm->mode; + entry_xy_temp.p_data = temp_data; + entry_xy_temp.p_mask = temp_mask; + data_len = DPP_ETCAM_ENTRY_SIZE_GET(entry_xy_temp.mode); + + if(data_len > 80) + { + return 1; + } + + ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW_NO_ASSERT(3U, entry_xy_temp.mode); + rc = dpp_etcam_dm_to_xy(p_entry_dm, &entry_xy_temp, data_len); + ZXIC_COMM_CHECK_RC(rc, "dpp_etcam_dm_to_xy"); + + if ((ZXIC_COMM_MEMCMP(entry_xy_temp.p_data, p_entry_xy->p_data, data_len) != 0) || + (ZXIC_COMM_MEMCMP(entry_xy_temp.p_mask, p_entry_xy->p_mask, data_len) != 0)) + { + return 1; + } + + return 0; +} + +/***********************************************************/ +/** 配置block的业务号,table_id +* @param dev_id 设备号 +* @param block_idx block的索引值。范围[0~7] +* @param tbl_id 表号,范围[0~7] +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/04/08 +************************************************************/ +DPP_STATUS dpp_etcam_block_tbl_id_set(DPP_DEV_T *dev, + ZXIC_UINT32 block_idx, + ZXIC_UINT32 tbl_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 reg_offset = 0; + ZXIC_UINT32 bit_offset = 0; + ZXIC_UINT32 *p_temp = 0; + DPP_STAT4K_ETCAM_BLOCK0_7_PORT_ID_CFG_T block_tbl_id = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), block_idx, 0, DPP_ETCAM_BLOCK_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), tbl_id, 0, DPP_ETCAM_TBLID_NUM - 1); + + /*reg_offset 表示第几个寄存器进行配置,共四组配置寄存器*/ + reg_offset = block_idx / TBLID_CFG_SETP; + /*bit_offset 一个寄存器可以配置四组port_id,本位表示寄存器内配置的偏移*/ + bit_offset = block_idx % TBLID_CFG_SETP; + + /*取出当前的配置*/ + rc = dpp_reg_read(dev, + STAT4K_ETCAM_BLOCK0_7_PORT_ID_CFGr + reg_offset, + 0, + 0, + &block_tbl_id); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + /*计算出来配置当前的port_id所处的地址*/ + p_temp = (ZXIC_UINT32 *)(&block_tbl_id) + 7 - bit_offset; + + *p_temp = tbl_id; + + rc = dpp_reg_write(dev, + STAT4K_ETCAM_BLOCK0_7_PORT_ID_CFGr + reg_offset, + 0, + 0, + &block_tbl_id); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 获取block的业务号,table_id +* @param dev_id +* @param block_idx +* @param p_tbl_id +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/04/08 +************************************************************/ +DPP_STATUS dpp_etcam_block_tbl_id_get(DPP_DEV_T *dev, + ZXIC_UINT32 block_idx, + ZXIC_UINT32 *p_tbl_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 reg_offset = 0; + ZXIC_UINT32 bit_offset = 0; + ZXIC_UINT32 *p_temp = 0; + DPP_STAT4K_ETCAM_BLOCK0_7_PORT_ID_CFG_T block_tbl_id = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), block_idx, 0, DPP_ETCAM_BLOCK_NUM - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_tbl_id); + + reg_offset = block_idx / TBLID_CFG_SETP; + bit_offset = block_idx % TBLID_CFG_SETP; + + rc = dpp_reg_read(dev, + STAT4K_ETCAM_BLOCK0_7_PORT_ID_CFGr + reg_offset, + 0, + 0, + &block_tbl_id); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + p_temp = (ZXIC_UINT32 *)(&block_tbl_id) + TBLID_CFG_SETP - 1 - bit_offset; + + *p_tbl_id = *p_temp; + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置block的基地址。 +* @param dev_id 设备号 +* @param block_idx block编号 +* @param base_addr 基地址。 +* 配置规则:每个寄存器寄存器位宽是7bit,逻辑实现为{base_addr[6:0],9'b0}, +* 80 bit键值模式下,base_addr格式遵循{base_addr[6,3],3'0} +* 160bit键值模式下,base_addr格式遵循{1'b0,base_addr[5,2],2'0} +* 320bit键值模式下,base_addr格式遵循{2'b0,base_addr[4,1],1'0} +* 640bit键值模式下,base_addr格式遵循{3'b0,base_addr[3,0]} +* @return +* @remark 无 +* @see 共有8组配置寄存器,每组寄存器支持两组block基地址的配置 +* 其中第0组支持0和1号block基地址配置,第1组支持1和2号block基地址配置 ,依次类推 +* @author 王春雷 @date 2014/04/08 +************************************************************/ +DPP_STATUS dpp_etcam_block_baddr_set(DPP_DEV_T *dev, + ZXIC_UINT32 block_idx, + ZXIC_UINT32 base_addr) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 reg_offset = 0; + ZXIC_UINT32 bit_offset = 0; + ZXIC_UINT32 *p_temp = 0; + DPP_STAT4K_ETCAM_BLOCK0_3_BASE_ADDR_CFG_T block_baddr = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), block_idx, 0, DPP_ETCAM_BLOCK_NUM - 1); + + reg_offset = block_idx / BADDR_CFG_SETP; + bit_offset = block_idx % BADDR_CFG_SETP; + + rc = dpp_reg_read(dev, + STAT4K_ETCAM_BLOCK0_3_BASE_ADDR_CFGr + reg_offset, + 0, + 0, + &block_baddr); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + p_temp = (ZXIC_UINT32 *)(&block_baddr) + 3 - bit_offset; + + *p_temp = base_addr; + + rc = dpp_reg_write(dev, + STAT4K_ETCAM_BLOCK0_3_BASE_ADDR_CFGr + reg_offset, + 0, + 0, + &block_baddr); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 获取block的基地址 +* @param dev_id +* @param block_idx +* @param p_base_addr +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/04/08 +************************************************************/ +DPP_STATUS dpp_etcam_block_baddr_get(DPP_DEV_T *dev, + ZXIC_UINT32 block_idx, + ZXIC_UINT32 *p_base_addr) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 reg_offset = 0; + ZXIC_UINT32 bit_offset = 0; + ZXIC_UINT32 *p_temp = 0; + DPP_STAT4K_ETCAM_BLOCK0_3_BASE_ADDR_CFG_T block_baddr = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), block_idx, 0, DPP_ETCAM_BLOCK_NUM - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_base_addr); + + reg_offset = block_idx / BADDR_CFG_SETP; + bit_offset = block_idx % BADDR_CFG_SETP; + + rc = dpp_reg_read(dev, + STAT4K_ETCAM_BLOCK0_3_BASE_ADDR_CFGr + reg_offset, + 0, + 0, + &block_baddr); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + p_temp = (ZXIC_UINT32 *)&block_baddr + BADDR_CFG_SETP - 1 - bit_offset; + + *p_base_addr = *p_temp; + + return DPP_OK; +} + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se/dpp_se.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se/dpp_se.c new file mode 100755 index 0000000..2dc9dd6 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se/dpp_se.c @@ -0,0 +1,1084 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_se.c +* 文件标识 : +* 内容摘要 : 芯片se模块基本接口函数实现 +* 其它说明 : +* 当前版本 : +* 作 者 : 王春雷 +* 完成日期 : 2014/03/11 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#include "zxic_common.h" +#include "dpp_type_api.h" +#include "dpp_reg.h" +#include "dpp_se_api.h" +#include "dpp_etcam.h" +#include "dpp_se.h" +#include "dpp_dev.h" +#include "dpp_se_cfg.h" +#include "dpp_sdt.h" +#include "dpp_smmu14k_reg.h" +#include "dpp_se4k_reg.h" + +#define SE_OPR_WR (0) +#define SE_OPR_RD (1) +#define SE_CLS_MAX (8) +#define SE_SMMU1_PAGE_MAX (5) +#define SE_LPMID_OFF (4) + +static SMMU1_KSCHD_HASH_DDR_CFG_T g_smmu1_kschd_hash[DPP_DEV_CHANNEL_MAX][DPP_HASH_ID_NUM][HASH_BULK_NUM] = {{{{0}}}}; + +ZXIC_UINT32 g_lpm_dat_wr_type_flag = 2; /* 1:开启DMA 2:REG mode */ +ZXIC_UINT8 g_lpm_hw_dat_buf[LPM_HW_DAT_BUFF_SIZE_MAX] = {0}; +ZXIC_UINT32 g_lpm_hw_dat_offset = 0; + +#define GET_SMMU1_KSCHD_HASH_CFG(dev_id,hash_id,bulk_id) (&g_smmu1_kschd_hash[dev_id][hash_id][bulk_id]) + +#define SMMU1_WDAT0_R (SYS_SE_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0) +#define SMMU1_CMD0_R (SYS_SE_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x40) +#define SMMU1_CMD1_R (SYS_SE_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x44) +#define SMMU1_CMD0_F_ADDR_START (30) +#define SMMU1_CMD0_F_ADDR_WIDTH (2) +#define SMMU1_CMD0_F_ECC_EN_START (5) +#define SMMU1_CMD0_F_ECC_EN_WIDTH (1) +#define SMMU1_CMD0_F_DDR_MODE_START (3) +#define SMMU1_CMD0_F_DDR_MODE_WIDTH (2) +#define SMMU1_CMD0_F_BK_INFO_START (0) +#define SMMU1_CMD0_F_BK_INFO_WIDTH (3) + +#define SMMU1_CMD1_F_DDR_WR_START (30) +#define SMMU1_CMD1_F_DDR_WR_WIDTH (1) +#define SMMU1_CMD1_F_ADDR_START (0) +#define SMMU1_CMD1_F_ADDR_WIDTH (30) + + +#if ZXIC_REAL("SMMU0") +/***********************************************************/ +/** SE通用完成状态检查 +* @param dev_id 设备号 +* @param reg_no 寄存器编号 +* @param pos 所要读的寄存器的done_flag的位置(只支持1bit) +* +* @return +* @remark 无 +* @see +* @author wyt @date 2018/07/09 +************************************************************/ +DPP_STATUS dpp_se_done_status_check(DPP_DEV_T *dev, ZXIC_UINT32 reg_no, ZXIC_UINT32 pos) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 data = 0; + ZXIC_UINT32 rd_cnt = 0; + ZXIC_UINT32 done_flag = 0; + + /* 打桩使用 */ +#ifdef DPP_FOR_LLT + ZXIC_UINT32 done_sig = 0xffffffff; + + rc = dpp_reg_write32(dev_id, reg_no, done_sig); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_reg_write32"); +#endif + + ZXIC_COMM_CHECK_POINT(dev); + + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev), DPP_DEV_CHANNEL_MAX - 1); + + while (!done_flag) + { + rc = dpp_reg_read32(dev, reg_no, 0, 0, &data); + if(ZXIC_OK != rc) + { + ZXIC_COMM_TRACE_ERROR("\n [ErrorCode:0x%x] !-- dpp_reg_read32 Fail!\n", rc); + return rc; + } + + done_flag = (data >> pos) & 0x1; + + if (done_flag) + { + break; + } + + if (rd_cnt > DPP_RD_CNT_MAX * DPP_RD_CNT_MAX) + { + ZXIC_COMM_TRACE_ERROR("Error!!! dpp se rd reg_no [%d] is overtime!\n", reg_no); + return DPP_ERR; + } + + rd_cnt++; + /*zxic_comm_usleep(1000);*/ + } + + return rc; +} + +/***********************************************************/ +/** 读eRam +* @param dev_id 设备号 +* @param base_addr 基地址,以128bit为单位 +* @param index 条目索引,支持128、64、32和1bit的索引值 +* @param rd_mode 读eRam模式, 取值参照ERAM128_OPR_MODE_E定义,读清模式下不支持1bit模式 +* @param rd_clr_mode eRam读清模式, 取值参照ERAM128_RD_CLR_MODE_E定义 +* @param p_data 返回数据缓存的指针 +* +* @return +* @remark 无 +* @see +* @author wcl @date 2015/01/30 +************************************************************/ +DPP_STATUS dpp_se_smmu0_ind_read(DPP_DEV_T *dev, + ZXIC_UINT32 base_addr, + ZXIC_UINT32 index, + ZXIC_UINT32 rd_mode, + ZXIC_UINT32 rd_clr_mode, + ZXIC_UINT32 *p_data) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 i = 0; + ZXIC_UINT32 row_index = 0; + ZXIC_UINT32 col_index = 0; + ZXIC_UINT32 temp_data[4] = {0}; + ZXIC_UINT32 *p_temp_data = NULL; + + DPP_SMMU0_SMMU0_CPU_IND_CMD_T cpu_ind_cmd = {0}; + + ZXIC_MUTEX_T *p_ind_mutex = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev),DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), rd_clr_mode, RD_MODE_HOLD, RD_MODE_CLEAR); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), rd_mode, ERAM128_OPR_128b, ERAM128_OPR_32b); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), base_addr, 0, SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1); + + rc = dpp_dev_opr_mutex_get(DEV_ID(dev), DPP_DEV_MUTEX_T_SMMU0, &p_ind_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dev_opr_mutex_get"); + + rc = zxic_comm_mutex_lock(p_ind_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "zxic_comm_mutex_lock"); + + rc = dpp_se_done_status_check(dev, SMMU0_SMMU0_WR_ARB_CPU_RDYr, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "time_out", p_ind_mutex); + + /** 正常模式读数据,仅能以128bit读出数据,软件提取数据*/ + if (RD_MODE_HOLD == rd_clr_mode) + { + cpu_ind_cmd.cpu_ind_rw = SE_OPR_RD; + cpu_ind_cmd.cpu_ind_rd_mode = RD_MODE_HOLD; + cpu_ind_cmd.cpu_req_mode = ERAM128_OPR_128b; + + /* 先以128bit模式读出数据 */ + switch (rd_mode) + { + case ERAM128_OPR_128b: + { + if((0xFFFFFFFF - (base_addr)) < (index)) + { + zxic_comm_mutex_unlock(p_ind_mutex); + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "ICM %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, base_addr, index, __FUNCTION__); + return ZXIC_PAR_CHK_INVALID_INDEX; + } + if (base_addr + index > SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) + { + ZXIC_COMM_PRINT("dpp_se_smmu0_ind_read : index out of range !\n"); + zxic_comm_mutex_unlock(p_ind_mutex); + return DPP_ERR; + } + + row_index = (index << 7) & DPP_ERAM128_BADDR_MASK; + break; + } + + case ERAM128_OPR_64b: + { + if ((base_addr + (index >> 1)) > SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) + { + ZXIC_COMM_PRINT("dpp_se_smmu0_ind_read : index out of range !\n"); + zxic_comm_mutex_unlock(p_ind_mutex); + return DPP_ERR; + } + + row_index = (index << 6) & DPP_ERAM128_BADDR_MASK; + col_index = index & 0x1; + break; + } + + case ERAM128_OPR_32b: + { + if ((base_addr + (index >> 2)) > SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) + { + ZXIC_COMM_PRINT("dpp_se_smmu0_ind_read : index out of range !\n"); + zxic_comm_mutex_unlock(p_ind_mutex); + return DPP_ERR; + } + + row_index = (index << 5) & DPP_ERAM128_BADDR_MASK; + col_index = index & 0x3; + break; + } + + case ERAM128_OPR_1b: + { + if ((base_addr + (index >> 7)) > SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) + { + ZXIC_COMM_PRINT("dpp_se_smmu0_ind_read : index out of range !\n"); + zxic_comm_mutex_unlock(p_ind_mutex); + return DPP_ERR; + } + + row_index = index & DPP_ERAM128_BADDR_MASK; + col_index = index & 0x7F; + break; + } + } + + cpu_ind_cmd.cpu_ind_addr = ((base_addr << 7) & DPP_ERAM128_BADDR_MASK) + row_index; + } + /** 读清模式*/ + else + { + cpu_ind_cmd.cpu_ind_rw = SE_OPR_RD; + cpu_ind_cmd.cpu_ind_rd_mode = RD_MODE_CLEAR; + + switch (rd_mode) + { + case ERAM128_OPR_128b: + { + if((0xFFFFFFFF - (base_addr)) < (index)) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "ICM %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, base_addr, index, __FUNCTION__); + zxic_comm_mutex_unlock(p_ind_mutex); + return ZXIC_PAR_CHK_INVALID_INDEX; + } + if (base_addr + index > SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) + { + ZXIC_COMM_PRINT("dpp_se_smmu0_ind_read : index out of range !\n"); + zxic_comm_mutex_unlock(p_ind_mutex); + return DPP_ERR; + } + + row_index = (index << 7); + cpu_ind_cmd.cpu_req_mode = ERAM128_OPR_128b; + break; + } + + case ERAM128_OPR_64b: + { + if ((base_addr + (index >> 1)) > SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) + { + ZXIC_COMM_PRINT("dpp_se_smmu0_ind_read : index out of range !\n"); + zxic_comm_mutex_unlock(p_ind_mutex); + return DPP_ERR; + } + + row_index = (index << 6); + cpu_ind_cmd.cpu_req_mode = 2; + break; + } + + case ERAM128_OPR_32b: + { + if ((base_addr + (index >> 2)) > SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) + { + ZXIC_COMM_PRINT("dpp_se_smmu0_ind_read : index out of range !\n"); + zxic_comm_mutex_unlock(p_ind_mutex); + return DPP_ERR; + } + + row_index = (index << 5); + cpu_ind_cmd.cpu_req_mode = 1; + break; + } + + /** 1bit读清模式硬件不支持 */ + case ERAM128_OPR_1b: + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "Param Error! rd_clr_mode[%d] or rd_mode[%d] error!\n ", rd_clr_mode, rd_mode); + zxic_comm_mutex_unlock(p_ind_mutex); + ZXIC_COMM_ASSERT(0); + return DPP_ERR; + } + } + + cpu_ind_cmd.cpu_ind_addr = ((base_addr << 7) & DPP_ERAM128_BADDR_MASK) + row_index; + } + + rc = dpp_reg_write(dev, + SMMU0_SMMU0_CPU_IND_CMDr, + 0, + 0, + &cpu_ind_cmd); + ZXIC_COMM_CHECK_DEV_RC_UNLOCK(DEV_ID(dev), rc, "dpp_reg_write", p_ind_mutex); + + rc = dpp_se_done_status_check(dev, SMMU0_SMMU0_CPU_IND_RD_DONEr, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "time_out", p_ind_mutex); + + p_temp_data = temp_data; + for (i = 0; i < 4; i++) + { +/* + rc = dpp_reg_read(dev_id, + SMMU0_SMMU0_CPU_IND_RDAT0r + i, + 0, + 0, + temp_data + 3 - i); + ZXIC_COMM_CHECK_DEV_RC_UNLOCK(dev_id, rc, "dpp_reg_read", p_ind_mutex); +*/ + rc = dpp_reg_read(dev, + SMMU0_SMMU0_CPU_IND_RDAT0r + i, + 0, + 0, + p_temp_data + 3 - i); + ZXIC_COMM_CHECK_DEV_RC_UNLOCK(DEV_ID(dev), rc, "dpp_reg_read", p_ind_mutex); + } + + /** 正常模式读数据,仅能以128bit读出数据,软件提取数据*/ + if (RD_MODE_HOLD == rd_clr_mode) + { + switch (rd_mode) + { + case ERAM128_OPR_128b: + { + /* ZXIC_COMM_MEMCPY(p_data, &temp_data[0], (128 / 8)); */ + /* modify by ghm for coverity @20200714 */ + ZXIC_COMM_MEMCPY(p_data, p_temp_data, (128 / 8)); + break; + } + + case ERAM128_OPR_64b: + { + /* ZXIC_COMM_MEMCPY(p_data, &temp_data[(1 - col_index) << 1], (64 / 8)); */ + /* modify by ghm for coverity @20200714 */ + ZXIC_COMM_MEMCPY(p_data, p_temp_data + ((1 - col_index) << 1), (64 / 8)); + break; + } + + case ERAM128_OPR_32b: + { + /* ZXIC_COMM_MEMCPY(p_data, &temp_data[(3 - col_index)], (32 / 8)); */ + /* modify by ghm for coverity @20200714 */ + ZXIC_COMM_MEMCPY(p_data, p_temp_data + ((3 - col_index)), (32 / 8)); + break; + } + + case ERAM128_OPR_1b: + { + /* ZXIC_COMM_UINT32_GET_BITS(p_data[0], temp_data[3 - col_index / 32], (col_index % 32), 1); */ + /* modify by ghm for coverity @20200714 */ + ZXIC_COMM_UINT32_GET_BITS(p_data[0], *(p_temp_data + (3 - col_index / 32)), (col_index % 32), 1); + break; + } + } + } + else /** 读清模式*/ + { + switch (rd_mode) + { + case ERAM128_OPR_128b: + { + /* ZXIC_COMM_MEMCPY(p_data, temp_data, (128 / 8)); */ + /* modify by ghm for coverity @20200714 */ + ZXIC_COMM_MEMCPY(p_data, p_temp_data, (128 / 8)); + break; + } + + case ERAM128_OPR_64b: + { + /* ZXIC_COMM_MEMCPY(p_data, temp_data, (64 / 8)); */ + /* modify by ghm for coverity @20200714 */ + ZXIC_COMM_MEMCPY(p_data, p_temp_data, (64 / 8)); + break; + } + + case ERAM128_OPR_32b: + { + /* ZXIC_COMM_MEMCPY(p_data, temp_data, (32 / 8)); */ + /* modify by ghm for coverity @20200714 */ + ZXIC_COMM_MEMCPY(p_data, p_temp_data, (64 / 8)); + break; + } + } + } + + rc = zxic_comm_mutex_unlock(p_ind_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "zxic_comm_mutex_unlock"); + + return rc; +} + + + +#endif + +#if ZXIC_REAL("SMMU1") +/***********************************************************/ +/** dpp hash的smmu1属性设置 +* @param dev_id 设备号 +* @param hash_id hash引擎号 +* @param tbl_id hash表号 +* @param ecc_en ecc使能 +* @param baddr ddr基地址 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/12 +************************************************************/ +DPP_STATUS dpp_se_smmu1_hash_tbl_cfg_set(DPP_DEV_T *dev, + ZXIC_UINT32 hash_id, + ZXIC_UINT32 tbl_id, + ZXIC_UINT32 ecc_en, + ZXIC_UINT32 baddr) +{ + DPP_STATUS rc = DPP_OK; + + DPP_SMMU14K_SE_SMMU1_HASH0_TBL0_CFG_T hash_tbl_cfg = {0}; + + SMMU1_KSCHD_HASH_DDR_CFG_T *p_hash_ddr_cfg = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev),DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX_UPPER(hash_id,DPP_HASH_ID_MAX); + ZXIC_COMM_CHECK_INDEX_UPPER(tbl_id,HASH_BULK_ID_MAX); + ZXIC_COMM_CHECK_INDEX_UPPER(ecc_en,1); + ZXIC_COMM_CHECK_INDEX_UPPER(baddr,DPP_SE_SMMU1_MAX_BADDR_NO_SHARE); + + /* save to soft buffer */ + p_hash_ddr_cfg = GET_SMMU1_KSCHD_HASH_CFG(DEV_ID(dev), hash_id, tbl_id); + p_hash_ddr_cfg->baddr = baddr; + p_hash_ddr_cfg->crcen = ecc_en; + p_hash_ddr_cfg->mode = SMMU1_DDR_SRH_256b; /* alg search ddr mode, not write mode */ + + hash_tbl_cfg.hash0_tbl0_ecc_en = ecc_en; + hash_tbl_cfg.hash0_tbl0_baddr = baddr; + +#ifdef DPP_FLOW_HW_INIT + rc = dpp_reg_write(dev, + SMMU14K_SE_SMMU1_HASH0_TBL0_CFGr + hash_id * HASH_BULK_NUM + tbl_id, + 0, + 0, + &hash_tbl_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); +#endif + + return rc; +} + +/***********************************************************/ +/** 获取hash算法访问DDR空间的属性,从软件获取(待优化) +* @param dev_id 设备号 +* @param hash_id hash引擎号 +* @param bulk_id Hash引擎存储资源划分块数的ID号 +* @param p_ecc_en 使能ECC校验 +* @param p_base_addr DDR空间基地址 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author tf @date 2016/06/15 +************************************************************/ +DPP_STATUS dpp_se_smmu1_hash_tbl_soft_cfg_get(DPP_DEV_T *dev, + ZXIC_UINT32 hash_id, + ZXIC_UINT32 bulk_id, + ZXIC_UINT32 *p_ecc_en, + ZXIC_UINT32 *p_base_addr) +{ + + SMMU1_KSCHD_HASH_DDR_CFG_T *p_schd_hash = NULL; + + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev),DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX_UPPER(hash_id,DPP_HASH_ID_MAX); + ZXIC_COMM_CHECK_INDEX_UPPER(bulk_id,HASH_BULK_ID_MAX); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_base_addr); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_ecc_en); + + /* read from soft buffer */ + p_schd_hash = GET_SMMU1_KSCHD_HASH_CFG(DEV_ID(dev), hash_id, bulk_id); + *p_base_addr = p_schd_hash->baddr; + *p_ecc_en = p_schd_hash->crcen; + + return DPP_OK; +} + +#endif + +#if ZXIC_REAL("ALG") +/***********************************************************/ +/** 设置zblock service信息 +* @param dev_id +* @param zblk_idx zblock索引(2bit zgroup + 3bit zblock) +* @param serv_sel 0-lpm, 1-hash +* @param hash_id zblock对应的hash_id, lpm不关心此字段 +* @param enable 业务表使能标志 +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/07/26 +************************************************************/ +DPP_STATUS dpp_se_zblk_serv_cfg_set(DPP_DEV_T *dev, + ZXIC_UINT32 zblk_idx, + ZXIC_UINT32 serv_sel, + ZXIC_UINT32 hash_id, + ZXIC_UINT32 enable) +{ + DPP_STATUS rtn = DPP_OK; + + DPP_SE4K_SE_ALG_ZBLOCK_SERVICE_CONFIGURE_T zblk_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev),DPP_DEV_CHANNEL_MAX - 1); + + zblk_cfg.hash_channel_sel = hash_id; + zblk_cfg.service_sel = serv_sel; + zblk_cfg.st_en = enable; + rtn = dpp_reg_write(dev, + SE4K_SE_ALG_ZBLOCK_SERVICE_CONFIGUREr, + ((ZBLK_ADDR_CONV(zblk_idx) >> 3) & 0x3), + (ZBLK_ADDR_CONV(zblk_idx) & 0x7), + &zblk_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 设置业务表独占的zcell +* @param dev_id +* @param zblk_idx zblock索引(2bit zgroup + 3bit zblock) +* @param zcell0_bulk_id 独占zcell0的业务表号 +* @param zcell0_mono_flag zcell0被独占的标志 +* @param zcell1_bulk_id 独占zcell1的业务表号 +* @param zcell1_mono_flag zcell1被独占的标志 +* @param zcell2_bulk_id 独占zcell2的业务表号 +* @param zcell2_mono_flag zcell2被独占的标志 +* @param zcell3_bulk_id 独占zcell3的业务表号 +* @param zcell3_mono_flag zcell3被独占的标志 +* +* @return +* @remark 无 +* @see +* @author tf @date 2016/04/26 +************************************************************/ +DPP_STATUS dpp_se_zcell_mono_cfg_set(DPP_DEV_T *dev, + ZXIC_UINT32 zblk_idx, + ZXIC_UINT32 zcell0_bulk_id, + ZXIC_UINT32 zcell0_mono_flag, + ZXIC_UINT32 zcell1_bulk_id, + ZXIC_UINT32 zcell1_mono_flag, + ZXIC_UINT32 zcell2_bulk_id, + ZXIC_UINT32 zcell2_mono_flag, + ZXIC_UINT32 zcell3_bulk_id, + ZXIC_UINT32 zcell3_mono_flag) +{ + DPP_STATUS rtn = DPP_OK; + + DPP_SE4K_SE_ALG_ZBLOCK_HASH_ZCELL_MONO_T zblk_zcell_mono_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev),DPP_DEV_CHANNEL_MAX - 1); + + zblk_zcell_mono_cfg.ha_zcell0_tbl_id = zcell0_bulk_id; + zblk_zcell_mono_cfg.ha_zcell0_mono_flag = zcell0_mono_flag; + zblk_zcell_mono_cfg.ha_zcell1_tbl_id = zcell1_bulk_id; + zblk_zcell_mono_cfg.ha_zcell1_mono_flag = zcell1_mono_flag; + zblk_zcell_mono_cfg.ha_zcell2_tbl_id = zcell2_bulk_id; + zblk_zcell_mono_cfg.ha_zcell2_mono_flag = zcell2_mono_flag; + zblk_zcell_mono_cfg.ha_zcell3_tbl_id = zcell3_bulk_id; + zblk_zcell_mono_cfg.ha_zcell3_mono_flag = zcell3_mono_flag; + + rtn = dpp_reg_write(dev, + SE4K_SE_ALG_ZBLOCK_HASH_ZCELL_MONOr, + ((ZBLK_ADDR_CONV(zblk_idx) >> 3) & 0x3), + (ZBLK_ADDR_CONV(zblk_idx) & 0x7), + &zblk_zcell_mono_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 获取业务表独占的zcell +* @param dev_id +* @param zblk_idx +* @param *zcell0_bulk_id +* @param *zcell0_mono_flag +* @param *zcell1_bulk_id +* @param *zcell1_mono_flag +* @param *zcell2_bulk_id +* @param *zcell2_mono_flag +* @param *zcell3_bulk_id +* @param *zcell3_mono_flag +* +* @return +* @remark 无 +* @see +* @author tf @date 2016/04/26 +************************************************************/ +DPP_STATUS dpp_se_zcell_mono_cfg_get(DPP_DEV_T *dev, + ZXIC_UINT32 zblk_idx, + ZXIC_UINT32 *zcell0_bulk_id, + ZXIC_UINT32 *zcell0_mono_flag, + ZXIC_UINT32 *zcell1_bulk_id, + ZXIC_UINT32 *zcell1_mono_flag, + ZXIC_UINT32 *zcell2_bulk_id, + ZXIC_UINT32 *zcell2_mono_flag, + ZXIC_UINT32 *zcell3_bulk_id, + ZXIC_UINT32 *zcell3_mono_flag) +{ + DPP_STATUS rtn = DPP_OK; + + DPP_SE4K_SE_ALG_ZBLOCK_HASH_ZCELL_MONO_T zblk_zcell_mono_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev),DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), zcell0_bulk_id); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), zcell0_mono_flag); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), zcell1_bulk_id); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), zcell1_mono_flag); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), zcell2_bulk_id); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), zcell2_mono_flag); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), zcell3_bulk_id); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), zcell3_mono_flag); + + rtn = dpp_reg_read(dev, + SE4K_SE_ALG_ZBLOCK_HASH_ZCELL_MONOr, + ((ZBLK_ADDR_CONV(zblk_idx) >> 3) & 0x3), + (ZBLK_ADDR_CONV(zblk_idx) & 0x7), + &zblk_zcell_mono_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_write"); + + *zcell0_bulk_id = zblk_zcell_mono_cfg.ha_zcell0_tbl_id; + *zcell0_mono_flag = zblk_zcell_mono_cfg.ha_zcell0_mono_flag; + *zcell1_bulk_id = zblk_zcell_mono_cfg.ha_zcell1_tbl_id; + *zcell1_mono_flag = zblk_zcell_mono_cfg.ha_zcell1_mono_flag; + *zcell2_bulk_id = zblk_zcell_mono_cfg.ha_zcell2_tbl_id; + *zcell2_mono_flag = zblk_zcell_mono_cfg.ha_zcell2_mono_flag; + *zcell3_bulk_id = zblk_zcell_mono_cfg.ha_zcell3_tbl_id; + *zcell3_mono_flag = zblk_zcell_mono_cfg.ha_zcell3_mono_flag; + + return DPP_OK; +} + +/***********************************************************/ +/** 设置业务表独占的zreg +* @param dev_id +* @param zblk_idx zblock索引(2bit zgroup + 3bit zblock) +* @param zreg0_bulk_id 独占zreg0的业务表号 +* @param zreg0_mono_flag zreg0被独占的标志 +* @param zreg1_bulk_id 独占zreg1的业务表号 +* @param zreg1_mono_flag zreg1被独占的标志 +* @param zreg2_bulk_id 独占zreg2的业务表号 +* @param zreg2_mono_flag zreg2被独占的标志 +* @param zreg3_bulk_id 独占zreg3的业务表号 +* @param zreg3_mono_flag zreg3被独占的标志 +* +* @return +* @remark 无 +* @see +* @author tf @date 2016/04/27 +************************************************************/ +DPP_STATUS dpp_se_zreg_mono_cfg_set(DPP_DEV_T *dev, + ZXIC_UINT32 zblk_idx, + ZXIC_UINT32 zreg0_bulk_id, + ZXIC_UINT32 zreg0_mono_flag, + ZXIC_UINT32 zreg1_bulk_id, + ZXIC_UINT32 zreg1_mono_flag, + ZXIC_UINT32 zreg2_bulk_id, + ZXIC_UINT32 zreg2_mono_flag, + ZXIC_UINT32 zreg3_bulk_id, + ZXIC_UINT32 zreg3_mono_flag) +{ + DPP_STATUS rtn = DPP_OK; + + DPP_SE4K_SE_ALG_ZLOCK_HASH_ZREG_MONO_T zblk_zreg_mono_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev),DPP_DEV_CHANNEL_MAX - 1); + + zblk_zreg_mono_cfg.ha_zreg0_tbl_id = zreg0_bulk_id; + zblk_zreg_mono_cfg.ha_zreg0_mono_flag = zreg0_mono_flag; + zblk_zreg_mono_cfg.ha_zreg1_tbl_id = zreg1_bulk_id; + zblk_zreg_mono_cfg.ha_zreg1_mono_flag = zreg1_mono_flag; + zblk_zreg_mono_cfg.ha_zreg2_tbl_id = zreg2_bulk_id; + zblk_zreg_mono_cfg.ha_zreg2_mono_flag = zreg2_mono_flag; + zblk_zreg_mono_cfg.ha_zreg3_tbl_id = zreg3_bulk_id; + zblk_zreg_mono_cfg.ha_zreg3_mono_flag = zreg3_mono_flag; + + rtn = dpp_reg_write(dev, + SE4K_SE_ALG_ZLOCK_HASH_ZREG_MONOr, + ((ZBLK_ADDR_CONV(zblk_idx) >> 3) & 0x3), + (ZBLK_ADDR_CONV(zblk_idx) & 0x7), + &zblk_zreg_mono_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 获取业务表独占的zcell +* @param dev_id +* @param zblk_idx +* @param *zreg0_bulk_id +* @param *zreg0_mono_flag +* @param *zreg1_bulk_id +* @param *zreg1_mono_flag +* @param *zreg2_bulk_id +* @param *zreg2_mono_flag +* @param *zreg3_bulk_id +* @param *zreg3_mono_flag +* +* @return +* @remark 无 +* @see +* @author tf @date 2016/04/27 +************************************************************/ +DPP_STATUS dpp_se_zreg_mono_cfg_get(DPP_DEV_T *dev, + ZXIC_UINT32 zblk_idx, + ZXIC_UINT32 *zreg0_bulk_id, + ZXIC_UINT32 *zreg0_mono_flag, + ZXIC_UINT32 *zreg1_bulk_id, + ZXIC_UINT32 *zreg1_mono_flag, + ZXIC_UINT32 *zreg2_bulk_id, + ZXIC_UINT32 *zreg2_mono_flag, + ZXIC_UINT32 *zreg3_bulk_id, + ZXIC_UINT32 *zreg3_mono_flag) +{ + DPP_STATUS rtn = DPP_OK; + + DPP_SE4K_SE_ALG_ZLOCK_HASH_ZREG_MONO_T zblk_zreg_mono_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev),DPP_DEV_CHANNEL_MAX - 1); + + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), zreg0_bulk_id); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), zreg0_mono_flag); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), zreg1_bulk_id); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), zreg1_mono_flag); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), zreg2_bulk_id); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), zreg2_mono_flag); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), zreg3_bulk_id); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), zreg3_mono_flag); + + rtn = dpp_reg_read(dev, + SE4K_SE_ALG_ZLOCK_HASH_ZREG_MONOr, + ((ZBLK_ADDR_CONV(zblk_idx) >> 3) & 0x3), + (ZBLK_ADDR_CONV(zblk_idx) & 0x7), + &zblk_zreg_mono_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_write"); + + *zreg0_bulk_id = zblk_zreg_mono_cfg.ha_zreg0_tbl_id; + *zreg0_mono_flag = zblk_zreg_mono_cfg.ha_zreg0_mono_flag; + *zreg1_bulk_id = zblk_zreg_mono_cfg.ha_zreg1_tbl_id; + *zreg1_mono_flag = zblk_zreg_mono_cfg.ha_zreg1_mono_flag; + *zreg2_bulk_id = zblk_zreg_mono_cfg.ha_zreg2_tbl_id; + *zreg2_mono_flag = zblk_zreg_mono_cfg.ha_zreg2_mono_flag; + *zreg3_bulk_id = zblk_zreg_mono_cfg.ha_zreg3_tbl_id; + *zreg3_mono_flag = zblk_zreg_mono_cfg.ha_zreg3_mono_flag; + + return DPP_OK; +} + +/***********************************************************/ +/** 设置hash访问片外DDR的属性 +* @param dev_id +* @param hash0_mono_flag +* @param hash1_mono_flag +* @param hash2_mono_flag +* @param hash3_mono_flag +* +* @return +* @remark 无 +* @see +* @author tf @date 2016/05/7 +************************************************************/ +DPP_STATUS dpp_se_hash_zcam_mono_flags_set(DPP_DEV_T *dev, + ZXIC_UINT32 hash0_mono_flag, + ZXIC_UINT32 hash1_mono_flag, + ZXIC_UINT32 hash2_mono_flag, + ZXIC_UINT32 hash3_mono_flag) +{ + DPP_STATUS rtn = DPP_OK; + + DPP_SE4K_SE_ALG_HASH_MONO_FLAG_T hash_mono_flag = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev),DPP_DEV_CHANNEL_MAX - 1); + + hash_mono_flag.hash0_mono_flag = hash0_mono_flag; + hash_mono_flag.hash1_mono_flag = hash1_mono_flag; + hash_mono_flag.hash2_mono_flag = hash2_mono_flag; + hash_mono_flag.hash3_mono_flag = hash3_mono_flag; + + rtn = dpp_reg_write(dev, + SE4K_SE_ALG_HASH_MONO_FLAGr, + 0, + 0, + &hash_mono_flag); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 设置hash访问片外DDR的属性 +* @param dev_id +* @param hash0_mono_flag +* @param hash1_mono_flag +* @param hash2_mono_flag +* @param hash3_mono_flag +* +* @return +* @remark 无 +* @see +* @author tf @date 2016/05/7 +************************************************************/ +DPP_STATUS dpp_se_hash_zcam_mono_flags_get(DPP_DEV_T *dev, + ZXIC_UINT32 *hash0_mono_flag, + ZXIC_UINT32 *hash1_mono_flag, + ZXIC_UINT32 *hash2_mono_flag, + ZXIC_UINT32 *hash3_mono_flag) +{ + DPP_STATUS rtn = DPP_OK; + + DPP_SE4K_SE_ALG_HASH_MONO_FLAG_T hash_mono_flag = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev),DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), hash0_mono_flag); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), hash1_mono_flag); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), hash2_mono_flag); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), hash3_mono_flag); + + rtn = dpp_reg_read(dev, + SE4K_SE_ALG_HASH_MONO_FLAGr, + 0, + 0, + &hash_mono_flag); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_write"); + + *hash0_mono_flag = hash_mono_flag.hash0_mono_flag; + *hash1_mono_flag = hash_mono_flag.hash1_mono_flag; + *hash2_mono_flag = hash_mono_flag.hash2_mono_flag; + *hash3_mono_flag = hash_mono_flag.hash3_mono_flag; + + return DPP_OK; +} + +/***********************************************************/ +/** 设置hash访问片外DDR的属性 +* @param dev_id +* @param hash_id +* @param ext_mode +* @param flag +* +* @return +* @remark 无 +* @see +* @author wcl @date 2014/07/26 +************************************************************/ +DPP_STATUS dpp_se_hash_ext_cfg_set(DPP_DEV_T *dev, + ZXIC_UINT32 hash_id, + ZXIC_UINT32 ext_mode, + ZXIC_UINT32 flag) +{ + DPP_STATUS rtn = DPP_OK; + + DPP_SE4K_SE_ALG_HASH0_EXT_CFG_RGT_T hash_ext_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev),DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX_UPPER(hash_id,DPP_HASH_ID_MAX); + + hash_ext_cfg.hash0_ext_flag = flag; + hash_ext_cfg.hash0_ext_mode = ext_mode; + + rtn = dpp_reg_write(dev, + SE4K_SE_ALG_HASH0_EXT_CFG_RGTr + hash_id, + 0, + 0, + &hash_ext_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 获取hash访问片外DDR的属性 +* @param dev_id 设备号 +* @param hash_id hash引擎,范围0~3 +* @param p_content_type 每个hash表项读一次ddr3还是两次;1-读512b的宽度,读两次 0-读256宽度,读一次 +* @param p_flag 片外ddr3是否存储hash表,1-片外存储hash表 0-片外不存储hash表 +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/07/26 +************************************************************/ +DPP_STATUS dpp_se_hash_ext_cfg_get(DPP_DEV_T *dev, + ZXIC_UINT32 hash_id, + ZXIC_UINT32 *p_content_type, + ZXIC_UINT32 *p_flag) +{ + DPP_STATUS rtn = DPP_OK; + + DPP_SE4K_SE_ALG_HASH0_EXT_CFG_RGT_T hash_ext_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev),DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX_UPPER(hash_id,DPP_HASH_ID_MAX); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_content_type); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_flag); + + rtn = dpp_reg_read(dev, + SE4K_SE_ALG_HASH0_EXT_CFG_RGTr + hash_id, + 0, + 0, + &hash_ext_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_read"); + + *p_content_type = hash_ext_cfg.hash0_ext_mode; + *p_flag = hash_ext_cfg.hash0_ext_flag; + + return DPP_OK; +} + +/***********************************************************/ +/** 设置hash业务表深度 +* @param dev_id +* @param hash_id +* @param depth_bit +* @param content_type +* @param flag +* +* @return +* @remark 无 +* @see +* @author tf @date 2016/01/28 +************************************************************/ +DPP_STATUS dpp_se_hash_tbl_depth_set(DPP_DEV_T *dev, + ZXIC_UINT32 hash_id, + ZXIC_UINT32 hash_tbl0_depth, + ZXIC_UINT32 hash_tbl1_depth, + ZXIC_UINT32 hash_tbl2_depth, + ZXIC_UINT32 hash_tbl3_depth, + ZXIC_UINT32 hash_tbl4_depth, + ZXIC_UINT32 hash_tbl5_depth, + ZXIC_UINT32 hash_tbl6_depth, + ZXIC_UINT32 hash_tbl7_depth) + +{ + DPP_STATUS rtn = DPP_OK; + + DPP_SE4K_SE_ALG_HASH0_TBL30_DEPTH_T hash_tbl30_depth = {0}; + DPP_SE4K_SE_ALG_HASH0_TBL74_DEPTH_T hash_tbl74_depth = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev),DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX_UPPER(hash_id,DPP_HASH_ID_MAX); + + hash_tbl30_depth.hash0_tbl0_depth = hash_tbl0_depth; + hash_tbl30_depth.hash0_tbl1_depth = hash_tbl1_depth; + hash_tbl30_depth.hash0_tbl2_depth = hash_tbl2_depth; + hash_tbl30_depth.hash0_tbl3_depth = hash_tbl3_depth; + hash_tbl74_depth.hash0_tbl4_depth = hash_tbl4_depth; + hash_tbl74_depth.hash0_tbl5_depth = hash_tbl5_depth; + hash_tbl74_depth.hash0_tbl6_depth = hash_tbl6_depth; + hash_tbl74_depth.hash0_tbl7_depth = hash_tbl7_depth; + + rtn = dpp_reg_write(dev, + SE4K_SE_ALG_HASH0_TBL30_DEPTHr + 2 * hash_id, + 0, + 0, + &hash_tbl30_depth); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_write"); + + rtn = dpp_reg_write(dev, + SE4K_SE_ALG_HASH0_TBL74_DEPTHr + 2 * hash_id, + 0, + 0, + &hash_tbl74_depth); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 获取hash业务表深度 +* @param dev_id +* @param hash_id +* @param p_content_type +* @param p_flag +* +* @return +* @remark 无 +* @see +* @author tf @date 2016/01/28 +************************************************************/ +DPP_STATUS dpp_se_hash_tbl_depth_get(DPP_DEV_T *dev, + ZXIC_UINT32 hash_id, + ZXIC_UINT32 *hash_tbl0_depth, + ZXIC_UINT32 *hash_tbl1_depth, + ZXIC_UINT32 *hash_tbl2_depth, + ZXIC_UINT32 *hash_tbl3_depth, + ZXIC_UINT32 *hash_tbl4_depth, + ZXIC_UINT32 *hash_tbl5_depth, + ZXIC_UINT32 *hash_tbl6_depth, + ZXIC_UINT32 *hash_tbl7_depth) + +{ + DPP_STATUS rtn = DPP_OK; + + DPP_SE4K_SE_ALG_HASH0_TBL30_DEPTH_T hash_tbl30_depth = {0}; + DPP_SE4K_SE_ALG_HASH0_TBL74_DEPTH_T hash_tbl74_depth = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev),DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX_UPPER(hash_id,DPP_HASH_ID_MAX); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), hash_tbl0_depth); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), hash_tbl1_depth); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), hash_tbl2_depth); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), hash_tbl3_depth); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), hash_tbl4_depth); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), hash_tbl5_depth); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), hash_tbl6_depth); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), hash_tbl7_depth); + + rtn = dpp_reg_read(dev, + SE4K_SE_ALG_HASH0_TBL30_DEPTHr + 2 * hash_id, + 0, + 0, + &hash_tbl30_depth); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_read"); + + rtn = dpp_reg_read(dev, + SE4K_SE_ALG_HASH0_TBL74_DEPTHr + 2 * hash_id, + 0, + 0, + &hash_tbl74_depth); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_reg_read"); + + *hash_tbl0_depth = hash_tbl30_depth.hash0_tbl0_depth; + *hash_tbl1_depth = hash_tbl30_depth.hash0_tbl1_depth; + *hash_tbl2_depth = hash_tbl30_depth.hash0_tbl2_depth; + *hash_tbl3_depth = hash_tbl30_depth.hash0_tbl3_depth; + *hash_tbl4_depth = hash_tbl74_depth.hash0_tbl4_depth; + *hash_tbl5_depth = hash_tbl74_depth.hash0_tbl5_depth; + *hash_tbl6_depth = hash_tbl74_depth.hash0_tbl6_depth; + *hash_tbl7_depth = hash_tbl74_depth.hash0_tbl7_depth; + + return DPP_OK; +} + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se/dpp_stat_car.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se/dpp_stat_car.c new file mode 100755 index 0000000..93ac7d6 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se/dpp_stat_car.c @@ -0,0 +1,4545 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_stat_car.c +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : XXX +* 完成日期 : 2017/02/09 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#include "zxic_common.h" +#include "dpp_type_api.h" +#include "dpp_reg.h" +// #include "dpp_devmng_api.h" +#include "dpp_stat_car.h" +#include "dpp_stat_api.h" + +#if ZXIC_REAL("Global Variable") + + +/** 软复位相关 */ +static DPP_CAR_SOFT_RESET_DATA_T g_car_store_data[DPP_DEV_CHANNEL_MAX] = {{{0}}}; + +#define GET_DPP_CAR_SOFT_RESET_INFO(dev_id) (&g_car_store_data[dev_id]) + +#define DPP_CAR1_REG_OFFSET (0) + +#endif + +#if 0 +/***********************************************************/ +/** car 模块初始化 +* @param dev_id 设备号 +* @param p_car_cfg CAR配置信息 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/05/05 +************************************************************/ +DPP_STATUS dpp_stat_car_init(ZXIC_UINT32 dev_id, DPP_CAR_CFG_T *p_car_cfg) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 car_type = 0; + ZXIC_UINT32 car_mono_mode = 0; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_car_cfg); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, p_car_cfg->car0_mono_mode[dev_id], CAR_SMMU0_MONO_MODE_NONE, CAR_SMMU0_MONO_MODE_MAX - 1); + /* 已经初始化完成,待后添加重新初始化的代码 */ + if (p_car_cfg->is_init[dev_id]) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "Error! CAR cfg has been initialized!\n"); + } + + car_mono_mode = p_car_cfg->car0_mono_mode[dev_id]; + + for (car_type = STAT_CAR_A_TYPE; car_type < STAT_CAR_MAX_TYPE; car_type++) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "dpp_stat_car_hardware_init(car_type[%d]) begin\n", car_type); + rc = dpp_stat_car_hardware_init(dev_id, + car_type, + car_mono_mode); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_stat_car_hardware_init"); + } + + p_car_cfg->is_init[dev_id] = 1; + + /* 软复位相关 */ + ZXIC_COMM_MEMSET(&g_car_store_data[dev_id], 0, sizeof(DPP_CAR_SOFT_RESET_DATA_T)); + g_car_store_data[dev_id].is_init = 1; + + return rc; +} +#endif +#if ZXIC_REAL("Basic Reg Operation ") +/***********************************************************/ +/** car A的流设置 +* @param dev_id 设备号 car编号 +* @param flow_id 流号 +* @param drop_flag 丢弃标志 +* @param plcr_en 监管使能 +* @param profile_id 监管模板号 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/05 +************************************************************/ +DPP_STATUS dpp_stat_cara_queue_cfg_set(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 drop_flag, + ZXIC_UINT32 plcr_en, + ZXIC_UINT32 profile_id) +{ + DPP_STATUS rc = DPP_OK; + + DPP_STAT_CAR0_CARA_QUEUE_RAM0_159_0_T queue_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_A_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), drop_flag, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), plcr_en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_A_PROFILE_ID_MAX); + + queue_cfg.cara_drop = drop_flag; + queue_cfg.cara_plcr_en = plcr_en; + queue_cfg.cara_profile_id = profile_id; + + rc = dpp_reg_write(dev, + STAT_CAR0_CARA_QUEUE_RAM0_159_0r , + 0, + flow_id, + &queue_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return rc; +} + +/***********************************************************/ +/** 获取car A的流设置 +* @param dev_id 设备号 +* @param flow_id 流号 +* @param p_cara_queue_cfg car A流配置信息 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/05 +************************************************************/ +DPP_STATUS dpp_stat_cara_queue_cfg_get(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + DPP_STAT_CAR_A_QUEUE_CFG_T *p_cara_queue_cfg) +{ + DPP_STATUS rc = DPP_OK; + + DPP_STAT_CAR0_CARA_QUEUE_RAM0_159_0_T queue_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_A_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_cara_queue_cfg); + + rc = dpp_reg_read(dev, + STAT_CAR0_CARA_QUEUE_RAM0_159_0r , + 0, + flow_id, + &queue_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + p_cara_queue_cfg->flow_id = flow_id; + p_cara_queue_cfg->drop_flag = queue_cfg.cara_drop; + p_cara_queue_cfg->plcr_en = queue_cfg.cara_plcr_en; + p_cara_queue_cfg->profile_id = queue_cfg.cara_profile_id; + + p_cara_queue_cfg->tq = ZXIC_COMM_COUNTER64_BUILD(queue_cfg.cara_tq_h, queue_cfg.cara_tq_l); + + p_cara_queue_cfg->ted = queue_cfg.cara_ted; + p_cara_queue_cfg->tcd = queue_cfg.cara_tcd; + p_cara_queue_cfg->tei = queue_cfg.cara_tei; + p_cara_queue_cfg->tci = queue_cfg.cara_tci; + + return rc; +} + +/***********************************************************/ +/** 获取car A 包长监管流配置 +* @param dev_id 设备号 +* @param flow_id 流号 +* @param p_cara_queue_cfg car A流配置信息 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/05 +************************************************************/ +DPP_STATUS dpp_stat_cara_pkt_queue_cfg_get(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + DPP_STAT_CAR_A_PKT_QUEUE_CFG_T *p_cara_queue_cfg) +{ + DPP_STATUS rc = DPP_OK; + + DPP_STAT_CAR0_CARA_QUEUE_RAM0_159_0_PKT_T queue_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_A_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_cara_queue_cfg); + + rc = dpp_reg_read(dev, + STAT_CAR0_CARA_QUEUE_RAM0_159_0_PKTr , + 0, + flow_id, + &queue_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + p_cara_queue_cfg->flow_id = flow_id; + p_cara_queue_cfg->plcr_en = queue_cfg.cara_plcr_en; + p_cara_queue_cfg->profile_id = queue_cfg.cara_profile_id; + + p_cara_queue_cfg->tq = ZXIC_COMM_COUNTER64_BUILD(queue_cfg.cara_tq_h, queue_cfg.cara_tq_l); + + p_cara_queue_cfg->dc = ZXIC_COMM_COUNTER64_BUILD(queue_cfg.cara_dc_high, queue_cfg.cara_dc_low); + p_cara_queue_cfg->tc = queue_cfg.cara_tc; + + return rc; +} + + +/***********************************************************/ +/** car A 字节限速监管模板设定 +* @param dev_id 设备号 +* @param profile_id 监管模板号 +* @param p_cara_profile_cfg 监管模板配置 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/05 +************************************************************/ +DPP_STATUS dpp_stat_cara_profile_cfg_set(DPP_DEV_T *dev, + ZXIC_UINT32 profile_id, + DPP_STAT_CAR_PROFILE_CFG_T *p_cara_profile_cfg) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 i = 0; + + DPP_STAT_CAR0_CARA_PROFILE_RAM1_255_0_T profile_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_A_PROFILE_ID_MAX); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_cara_profile_cfg); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_cara_profile_cfg->profile_id, 0, DPP_CAR_A_PROFILE_ID_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_cara_profile_cfg->pkt_sign, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_cara_profile_cfg->cf, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_cara_profile_cfg->cm, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_cara_profile_cfg->cd, CAR_CD_MODE_SRTCM, CAR_CD_MODE_INVALID - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_cara_profile_cfg->cir, 0, DPP_CAR_MAX_CIR_VALUE); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_cara_profile_cfg->eir, 0, DPP_CAR_MAX_EIR_VALUE); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_cara_profile_cfg->cbs, 0, DPP_CAR_MAX_CBS_VALUE); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_cara_profile_cfg->ebs, 0, DPP_CAR_MAX_EBS_VALUE); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_cara_profile_cfg->random_disc_e, 0, 0xffffffff); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_cara_profile_cfg->random_disc_c, 0, 0xffffffff); + + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_cara_profile_cfg->e_yellow_pri[0], 0, DPP_CAR_MAX_PRI_VALUE); + + for (i = 1; i < DPP_CAR_PRI_MAX; i++) + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_cara_profile_cfg->c_pri[i], 0, DPP_CAR_MAX_PRI_VALUE); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_cara_profile_cfg->e_green_pri[i], 0, DPP_CAR_MAX_PRI_VALUE); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_cara_profile_cfg->e_yellow_pri[i], 0, DPP_CAR_MAX_PRI_VALUE); + } + ZXIC_COMM_TRACE_DEV_INFO(DEV_ID(dev), "==> dpp_stat_cara_profile_cfg_set profile_id[%d]: \n", profile_id); + ZXIC_COMM_TRACE_DEV_INFO(DEV_ID(dev), "| -------------------------------------------------------------- | \n"); + ZXIC_COMM_TRACE_DEV_INFO(DEV_ID(dev), "| %-5s | %-5s | %-5s | %-10s | %-10s | %-10s | %-10s | \n", "cd", "cf", "cm", "cir", "cbs", "eir", "ebs"); + ZXIC_COMM_TRACE_DEV_INFO(DEV_ID(dev), "| %-5d | %-5d | %-5d | %-10d | %-10d | %-10d | %-10d | \n", p_cara_profile_cfg->cd, + p_cara_profile_cfg->cf, + p_cara_profile_cfg->cm, + p_cara_profile_cfg->cir, + p_cara_profile_cfg->cbs, + p_cara_profile_cfg->eir, + p_cara_profile_cfg->ebs); + ZXIC_COMM_TRACE_DEV_INFO(DEV_ID(dev), "| ----- | ----- | ----- | ---------- | ---------- | ---------- | ---------- | \n"); + + profile_cfg.cara_e_y_pri7 = p_cara_profile_cfg->e_yellow_pri[7]; + profile_cfg.cara_e_y_pri6 = p_cara_profile_cfg->e_yellow_pri[6]; + profile_cfg.cara_e_y_pri5 = p_cara_profile_cfg->e_yellow_pri[5]; + profile_cfg.cara_e_y_pri4 = p_cara_profile_cfg->e_yellow_pri[4]; + profile_cfg.cara_e_y_pri3 = p_cara_profile_cfg->e_yellow_pri[3]; + profile_cfg.cara_e_y_pri2 = p_cara_profile_cfg->e_yellow_pri[2]; + profile_cfg.cara_e_y_pri1 = p_cara_profile_cfg->e_yellow_pri[1]; + profile_cfg.cara_e_y_pri0 = p_cara_profile_cfg->e_yellow_pri[0]; + + profile_cfg.cara_e_g_pri7 = p_cara_profile_cfg->e_green_pri[7]; + profile_cfg.cara_e_g_pri6 = p_cara_profile_cfg->e_green_pri[6]; + profile_cfg.cara_e_g_pri5 = p_cara_profile_cfg->e_green_pri[5]; + profile_cfg.cara_e_g_pri4 = p_cara_profile_cfg->e_green_pri[4]; + profile_cfg.cara_e_g_pri3 = p_cara_profile_cfg->e_green_pri[3]; + profile_cfg.cara_e_g_pri2 = p_cara_profile_cfg->e_green_pri[2]; + profile_cfg.cara_e_g_pri1 = p_cara_profile_cfg->e_green_pri[1]; + + profile_cfg.cara_c_pri7 = p_cara_profile_cfg->c_pri[7]; + profile_cfg.cara_c_pri6 = p_cara_profile_cfg->c_pri[6]; + profile_cfg.cara_c_pri5 = p_cara_profile_cfg->c_pri[5]; + profile_cfg.cara_c_pri4 = p_cara_profile_cfg->c_pri[4]; + profile_cfg.cara_c_pri3 = p_cara_profile_cfg->c_pri[3]; + profile_cfg.cara_c_pri2 = p_cara_profile_cfg->c_pri[2]; + profile_cfg.cara_c_pri1 = p_cara_profile_cfg->c_pri[1]; + + profile_cfg.cara_cbs = p_cara_profile_cfg->cbs; + profile_cfg.cara_ebs_pbs = p_cara_profile_cfg->ebs; + profile_cfg.cara_cir = p_cara_profile_cfg->cir; + profile_cfg.cara_eir = p_cara_profile_cfg->eir; + + profile_cfg.cara_cd = p_cara_profile_cfg->cd; + profile_cfg.cara_cf = p_cara_profile_cfg->cf; + profile_cfg.cara_cm = p_cara_profile_cfg->cm; + profile_cfg.cara_pkt_sign = p_cara_profile_cfg->pkt_sign; + + profile_cfg.cara_profile_wr = 0; + + rc = dpp_reg_write(dev, + STAT_CAR0_CARA_PROFILE_RAM1_255_0r , + 0, + profile_id, + &profile_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return rc; +} + + +/***********************************************************/ +/** 获取car A包的监管模板配置 +* @param dev_id 设备号 +* @param profile_id 监管模板号 +* @param p_cara_profile_cfg 监管模板配置 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/05 +************************************************************/ +DPP_STATUS dpp_stat_cara_profile_cfg_get(DPP_DEV_T *dev, + ZXIC_UINT32 profile_id, + DPP_STAT_CAR_PROFILE_CFG_T *p_cara_profile_cfg) +{ + DPP_STATUS rc = DPP_OK; + + DPP_STAT_CAR0_CARA_PROFILE_RAM1_255_0_T profile_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_A_PROFILE_ID_MAX); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_cara_profile_cfg); + + rc = dpp_reg_read(dev, + STAT_CAR0_CARA_PROFILE_RAM1_255_0r, + 0, + profile_id, + &profile_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + p_cara_profile_cfg->profile_id = profile_id; + p_cara_profile_cfg->pkt_sign = profile_cfg.cara_pkt_sign; + p_cara_profile_cfg->cd = profile_cfg.cara_cd; + p_cara_profile_cfg->cf = profile_cfg.cara_cf; + p_cara_profile_cfg->cm = profile_cfg.cara_cm; + p_cara_profile_cfg->eir = profile_cfg.cara_eir; + p_cara_profile_cfg->cir = profile_cfg.cara_cir; + p_cara_profile_cfg->ebs = profile_cfg.cara_ebs_pbs; + p_cara_profile_cfg->cbs = profile_cfg.cara_cbs; + + p_cara_profile_cfg->c_pri[1] = profile_cfg.cara_c_pri1; + p_cara_profile_cfg->c_pri[2] = profile_cfg.cara_c_pri2; + p_cara_profile_cfg->c_pri[3] = profile_cfg.cara_c_pri3; + p_cara_profile_cfg->c_pri[4] = profile_cfg.cara_c_pri4; + p_cara_profile_cfg->c_pri[5] = profile_cfg.cara_c_pri5; + p_cara_profile_cfg->c_pri[6] = profile_cfg.cara_c_pri6; + p_cara_profile_cfg->c_pri[7] = profile_cfg.cara_c_pri7; + + p_cara_profile_cfg->e_green_pri[1] = profile_cfg.cara_e_g_pri1; + p_cara_profile_cfg->e_green_pri[2] = profile_cfg.cara_e_g_pri2; + p_cara_profile_cfg->e_green_pri[3] = profile_cfg.cara_e_g_pri3; + p_cara_profile_cfg->e_green_pri[4] = profile_cfg.cara_e_g_pri4; + p_cara_profile_cfg->e_green_pri[5] = profile_cfg.cara_e_g_pri5; + p_cara_profile_cfg->e_green_pri[6] = profile_cfg.cara_e_g_pri6; + p_cara_profile_cfg->e_green_pri[7] = profile_cfg.cara_e_g_pri7; + + p_cara_profile_cfg->e_yellow_pri[0] = profile_cfg.cara_e_y_pri0; + p_cara_profile_cfg->e_yellow_pri[1] = profile_cfg.cara_e_y_pri1; + p_cara_profile_cfg->e_yellow_pri[2] = profile_cfg.cara_e_y_pri2; + p_cara_profile_cfg->e_yellow_pri[3] = profile_cfg.cara_e_y_pri3; + p_cara_profile_cfg->e_yellow_pri[4] = profile_cfg.cara_e_y_pri4; + p_cara_profile_cfg->e_yellow_pri[5] = profile_cfg.cara_e_y_pri5; + p_cara_profile_cfg->e_yellow_pri[6] = profile_cfg.cara_e_y_pri6; + p_cara_profile_cfg->e_yellow_pri[7] = profile_cfg.cara_e_y_pri7; + + return rc; +} + + +/***********************************************************/ +/** car A包限速监管模板设定 +* @param dev_id 设备号 +* @param profile_id 监管模板号 +* @param p_cara_profile_cfg 监管模板配置 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/05 +************************************************************/ +DPP_STATUS dpp_stat_cara_pkt_profile_cfg_set(DPP_DEV_T *dev, + ZXIC_UINT32 profile_id, + DPP_STAT_CAR_PKT_PROFILE_CFG_T *p_cara_profile_cfg) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 i = 0; + + DPP_STAT_CAR0_CARA_PROFILE_RAM1_255_0_PKT_T profile_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_A_PROFILE_ID_MAX); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_cara_profile_cfg); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_cara_profile_cfg->pkt_sign, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_cara_profile_cfg->cir, 0, DPP_CAR_MAX_CIR_VALUE); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_cara_profile_cfg->cbs, 0, DPP_CAR_MAX_CBS_VALUE); + + for (i = 0; i < DPP_CAR_PRI_MAX; i++) + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_cara_profile_cfg->pri[i], 0, DPP_CAR_MAX_PRI_VALUE); + } + + profile_cfg.cara_pri7 = p_cara_profile_cfg->pri[7]; + profile_cfg.cara_pri6 = p_cara_profile_cfg->pri[6]; + profile_cfg.cara_pri5 = p_cara_profile_cfg->pri[5]; + profile_cfg.cara_pri4 = p_cara_profile_cfg->pri[4]; + profile_cfg.cara_pri3 = p_cara_profile_cfg->pri[3]; + profile_cfg.cara_pri2 = p_cara_profile_cfg->pri[2]; + profile_cfg.cara_pri1 = p_cara_profile_cfg->pri[1]; + profile_cfg.cara_pri0 = p_cara_profile_cfg->pri[0]; + + profile_cfg.cara_pkt_cbs = p_cara_profile_cfg->cbs; + profile_cfg.cara_pkt_cir = p_cara_profile_cfg->cir; + profile_cfg.cara_pkt_sign = p_cara_profile_cfg->pkt_sign; + + profile_cfg.cara_profile_wr = 0; + + rc = dpp_reg_write(dev, + STAT_CAR0_CARA_PROFILE_RAM1_255_0_PKTr, + 0, + profile_id, + &profile_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return rc; +} + + +/***********************************************************/ +/** 获取car A包长监管模板配置 +* @param dev_id 设备号 +* @param profile_id 监管模板号 +* @param p_cara_profile_cfg 监管模板配置 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/05 +************************************************************/ +DPP_STATUS dpp_stat_cara_pkt_profile_cfg_get(DPP_DEV_T *dev, + ZXIC_UINT32 profile_id, + DPP_STAT_CAR_PKT_PROFILE_CFG_T *p_cara_profile_cfg) +{ + DPP_STATUS rc = DPP_OK; + + DPP_STAT_CAR0_CARA_PROFILE_RAM1_255_0_PKT_T profile_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_A_PROFILE_ID_MAX); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_cara_profile_cfg); + + rc = dpp_reg_read(dev, + STAT_CAR0_CARA_PROFILE_RAM1_255_0_PKTr , + 0, + profile_id, + &profile_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + p_cara_profile_cfg->profile_id = profile_id; + p_cara_profile_cfg->pkt_sign = profile_cfg.cara_pkt_sign; + p_cara_profile_cfg->cir = profile_cfg.cara_pkt_cir; + p_cara_profile_cfg->cbs = profile_cfg.cara_pkt_cbs; + + p_cara_profile_cfg->pri[0] = profile_cfg.cara_pri0; + p_cara_profile_cfg->pri[1] = profile_cfg.cara_pri1; + p_cara_profile_cfg->pri[2] = profile_cfg.cara_pri2; + p_cara_profile_cfg->pri[3] = profile_cfg.cara_pri3; + p_cara_profile_cfg->pri[4] = profile_cfg.cara_pri4; + p_cara_profile_cfg->pri[5] = profile_cfg.cara_pri5; + p_cara_profile_cfg->pri[6] = profile_cfg.cara_pri6; + p_cara_profile_cfg->pri[7] = profile_cfg.cara_pri7; + + return rc; +} + +/***********************************************************/ +/** 配置car A的qvos溢出模式 +* @param dev_id 设备号 +* @param flow_id 流号 +* @param qvos_mode 溢出模式,参见DPP_CAR_QVOS_MODE_E +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_cara_queue_qvos_set(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 qvos_mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CARA_QOVS_RAM_RAM2_T qvos_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_A_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), qvos_mode, CAR_QVOS_MODE_OVERFLOW_0, CAR_QVOS_MODE_OVERFLOW_MAX - 1); + + qvos_cfg.cara_qovs = qvos_mode; + + rc = dpp_reg_write(dev, + STAT_CAR0_CARA_QOVS_RAM_RAM2r , + 0, + flow_id, + &qvos_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return rc; +} + +/***********************************************************/ +/** 获取car A的qvos溢出模式 +* @param dev_id 设备号 +* @param flow_id 流号 +* @param p_qvos_mode qvos溢出模式 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_cara_queue_qvos_get(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 *p_qvos_mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CARA_QOVS_RAM_RAM2_T qvos_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_A_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_qvos_mode); + + rc = dpp_reg_read(dev, + STAT_CAR0_CARA_QOVS_RAM_RAM2r , + 0, + flow_id, + &qvos_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_qvos_mode = qvos_cfg.cara_qovs; + + return rc; +} + + +/***********************************************************/ +/** 设置第一级的映射关系 +* @param dev_id 设备号 +* @param flow_id 流号 +* @param map_flow_id 映射的流号 +* @param map_sp 映射的优先级 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_cara_queue_map_set(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 map_flow_id, + ZXIC_UINT32 map_sp) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_LOOK_UP_TABLE1_T map_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_A_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), map_flow_id, 0, DPP_CAR_B_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), map_sp, DPP_CAR_PRI0, DPP_CAR_PRI_MAX - 1); + + map_cfg.cara_flow_id = map_flow_id; + map_cfg.cara_sp = map_sp; + + rc = dpp_reg_write(dev, + STAT_CAR0_LOOK_UP_TABLE1r , + 0, + flow_id, + &map_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return rc; +} + +/***********************************************************/ +/** 获取第一级的映射关系 +* @param dev_id 设备号 +* @param flow_id 流号 +* @param p_map_flow_id 映射流号 +* @param p_map_sp 映射优先级 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_cara_queue_map_get(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 *p_map_flow_id, + ZXIC_UINT32 *p_map_sp) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_LOOK_UP_TABLE1_T map_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_A_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_map_flow_id); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_map_sp); + + rc = dpp_reg_read(dev, + STAT_CAR0_LOOK_UP_TABLE1r, + 0, + flow_id, + &map_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_map_flow_id = map_cfg.cara_flow_id; + *p_map_sp = map_cfg.cara_sp; + + return rc; +} + +/***********************************************************/ +/** car A指定队列模式配置,仅用于调试 +* @param dev_id 设备号 +* @param global_en 全局队列使能,0-不使能,1-使能 +* @param sp_en 优先级队列使能,0-不使能,1-使能 +* @param appoint_sp 指定的优先级 +* @param appoint_queue 指定的队列号 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_cara_queue_appoint_mode_set(DPP_DEV_T *dev, + ZXIC_UINT32 global_en, + ZXIC_UINT32 sp_en, + ZXIC_UINT32 appoint_sp, + ZXIC_UINT32 appoint_queue) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CARA_APPOINT_QNUM_OR_SP_T appoint_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), global_en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), sp_en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), appoint_sp, DPP_CAR_PRI0, DPP_CAR_PRI_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), appoint_queue, 0, DPP_CAR_A_FLOW_ID_MAX); + + appoint_cfg.cara_appoint_qnum_or_not = global_en; + appoint_cfg.cara_appoint_sp_or_not = sp_en; + appoint_cfg.cara_plcr_stat_sp = appoint_sp; + appoint_cfg.cara_plcr_stat_qnum = appoint_queue; + + rc = dpp_reg_write(dev, + STAT_CAR0_CARA_APPOINT_QNUM_OR_SPr , + 0, + 0, + &appoint_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return rc; +} + +/***********************************************************/ +/** 获取car A指定队列模式的配置 +* @param dev_id 设备号 +* @param p_global_en 全局队列使能,0-不使能,1-使能 +* @param p_sp_en 优先级队列使能,0-不使能,1-使能 +* @param p_appoint_sp 指定的优先级 +* @param p_appoint_queue 指定的队列号 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/07 +************************************************************/ +DPP_STATUS dpp_stat_cara_queue_appoint_mode_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_global_en, + ZXIC_UINT32 *p_sp_en, + ZXIC_UINT32 *p_appoint_sp, + ZXIC_UINT32 *p_appoint_queue) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CARA_APPOINT_QNUM_OR_SP_T appoint_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_global_en); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_sp_en); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_appoint_sp); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_appoint_queue); + + rc = dpp_reg_read(dev, + STAT_CAR0_CARA_APPOINT_QNUM_OR_SPr, + 0, + 0, + &appoint_cfg); + + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_global_en = appoint_cfg.cara_appoint_qnum_or_not; + *p_sp_en = appoint_cfg.cara_appoint_sp_or_not; + *p_appoint_sp = appoint_cfg.cara_plcr_stat_sp; + *p_appoint_queue = appoint_cfg.cara_plcr_stat_qnum; + + return rc; +} + + +/***********************************************************/ +/** car A 调试计数读取模式配置 +* @param dev_id 设备号 +* @param overflow_mode 溢出模式,0-计数最大保持,1-计数最大翻转 +* @param rd_mode 读取模式,0-不读清,1-读清模式 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_cara_dbg_cnt_mode_set(DPP_DEV_T *dev, + ZXIC_UINT32 overflow_mode, + ZXIC_UINT32 rd_mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CARA_CFGMT_COUNT_MODE_T cnt_mode_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), overflow_mode, CAR_KEEP_COUNT, CAR_RE_COUNT); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), rd_mode, CAR_READ_NOT_CLEAR, CAR_READ_AND_CLEAR); + + cnt_mode_cfg.cara_cfgmt_count_overflow_mode = overflow_mode; + cnt_mode_cfg.cara_cfgmt_count_rd_mode = rd_mode; + + rc = dpp_reg_write(dev, + STAT_CAR0_CARA_CFGMT_COUNT_MODEr , + 0, + 0, + &cnt_mode_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return rc; +} + +/***********************************************************/ +/** car A 调试计数读取模式获取 +* @param dev_id 设备号 +* @param p_overflow_mode +* @param p_rd_mode +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_cara_dbg_cnt_mode_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_overflow_mode, + ZXIC_UINT32 *p_rd_mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CARA_CFGMT_COUNT_MODE_T cnt_mode_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_overflow_mode); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_rd_mode); + + rc = dpp_reg_read(dev, + STAT_CAR0_CARA_CFGMT_COUNT_MODEr, + 0, + 0, + &cnt_mode_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_overflow_mode = cnt_mode_cfg.cara_cfgmt_count_overflow_mode; + *p_rd_mode = cnt_mode_cfg.cara_cfgmt_count_rd_mode; + + return rc; +} + +#if 0 +/***********************************************************/ +/** car a 的调试计数获取 +* @param dev_id +* @param p_car_dbg_cnt +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/09/27 +************************************************************/ +DPP_STATUS dpp_stat_cara_dbg_cnt_get(ZXIC_UINT32 dev_id, + DPP_STAT_CAR_DBG_CNT_T *p_car_dbg_cnt) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CARA_PKT_DES_I_CNT_T cara_pkt_in_total_cnt_cfg = {0}; + DPP_STAT_CAR0_CARA_PKT_SIZE_CNT_T cara_pkt_size_cnt_cfg = {0}; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 size = 0; + ZXIC_UINT32 *p_tmp_cnt = NULL; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_car_dbg_cnt); + + size = sizeof(DPP_STAT_CAR_DBG_CNT_T) / sizeof(ZXIC_UINT32) - 1; + p_tmp_cnt = (ZXIC_UINT32 *)p_car_dbg_cnt; + + for (i = 0; i < size; i++) + { + rc = dpp_reg_read(dev_id, + STAT_CAR0_CARA_PKT_DES_I_CNTr + i, + 0, + 0, + &cara_pkt_in_total_cnt_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_reg_read"); + + ZXIC_COMM_MEMCPY(p_tmp_cnt + i, &(cara_pkt_in_total_cnt_cfg.cara_pkt_des_i_cnt), sizeof(ZXIC_UINT32)); + } + + /* STAT_CAR0_CARA_PKT_SIZE_CNTr 不连续,单独读取 */ + rc = dpp_reg_read(dev_id, + STAT_CAR0_CARA_PKT_SIZE_CNTr, + 0, + 0, + &cara_pkt_size_cnt_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_reg_read"); + + p_car_dbg_cnt->pkt_size_cnt = cara_pkt_size_cnt_cfg.cara_pkt_size_cnt; + + return rc; +} + +/***********************************************************/ +/** 获取car A的初始化状态 +* @param dev_id 设备号 +* @param p_init_done 初始化完成使能 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_cara_init_done_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_init_done) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CARA_PLCR_INIT_DONT_T cara_init_done_cfg = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_init_done); + + rc = dpp_reg_read(dev_id, + STAT_CAR0_CARA_PLCR_INIT_DONTr, + 0, + 0, + &cara_init_done_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_reg_read"); + + *p_init_done = cara_init_done_cfg.cara_plcr_init_done; + + return rc; +} + +#endif +/***********************************************************/ +/** car B的流设置 +* @param dev_id 设备号 +* @param flow_id 流号 +* @param drop_flag 丢弃标志 +* @param plcr_en 监管使能 +* @param profile_id 监管模板号 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/05 +************************************************************/ +DPP_STATUS dpp_stat_carb_queue_cfg_set(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 drop_flag, + ZXIC_UINT32 plcr_en, + ZXIC_UINT32 profile_id) +{ + DPP_STATUS rc = DPP_OK; + + DPP_STAT_CAR0_CARB_QUEUE_RAM0_159_0_T queue_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_B_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), drop_flag, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), plcr_en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_B_PROFILE_ID_MAX); + + queue_cfg.carb_drop = drop_flag; + queue_cfg.carb_plcr_en = plcr_en; + queue_cfg.carb_profile_id = profile_id; + + rc = dpp_reg_write(dev, + STAT_CAR0_CARB_QUEUE_RAM0_159_0r , + 0, + flow_id, + &queue_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return rc; +} + +/***********************************************************/ +/** 获取car B的流设置 +* @param dev_id 设备号 +* @param flow_id 流号 +* @param p_carb_queue_cfg car A流配置信息 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/05 +************************************************************/ +DPP_STATUS dpp_stat_carb_queue_cfg_get(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + DPP_STAT_CAR_B_QUEUE_CFG_T *p_carb_queue_cfg) +{ + DPP_STATUS rc = DPP_OK; + + DPP_STAT_CAR0_CARB_QUEUE_RAM0_159_0_T queue_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_B_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_carb_queue_cfg); + + rc = dpp_reg_read(dev, + STAT_CAR0_CARB_QUEUE_RAM0_159_0r, + 0, + flow_id, + &queue_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + p_carb_queue_cfg->flow_id = flow_id; + p_carb_queue_cfg->drop_flag = queue_cfg.carb_drop; + p_carb_queue_cfg->plcr_en = queue_cfg.carb_plcr_en; + p_carb_queue_cfg->profile_id = queue_cfg.carb_profile_id; + + p_carb_queue_cfg->tq = ZXIC_COMM_COUNTER64_BUILD(queue_cfg.carb_tq_h, queue_cfg.carb_tq_l); + + p_carb_queue_cfg->tce_flag = queue_cfg.carb_ted; + p_carb_queue_cfg->tce = queue_cfg.carb_tcd; + p_carb_queue_cfg->te = queue_cfg.carb_tei; + p_carb_queue_cfg->tc = queue_cfg.carb_tci; + + return rc; +} + +/***********************************************************/ +/** car B监管模板设定 +* @param dev_id 设备号 +* @param profile_id 监管模板号 +* @param p_carb_profile_cfg 监管模板配置 +* pkt_sign 包限速标记写死成0,防止用户在carB包限速 +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/05 +************************************************************/ +DPP_STATUS dpp_stat_carb_profile_cfg_set(DPP_DEV_T *dev, + ZXIC_UINT32 profile_id, + DPP_STAT_CAR_PROFILE_CFG_T *p_carb_profile_cfg) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 i = 0; + + DPP_STAT_CAR0_CARB_PROFILE_RAM1_255_0_T profile_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_B_PROFILE_ID_MAX); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_carb_profile_cfg); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carb_profile_cfg->pkt_sign, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carb_profile_cfg->cf, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carb_profile_cfg->cm, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carb_profile_cfg->random_disc_e, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carb_profile_cfg->random_disc_c, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carb_profile_cfg->cd, CAR_CD_MODE_SRTCM, CAR_CD_MODE_INVALID - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carb_profile_cfg->cir, 0, DPP_CAR_MAX_CIR_VALUE); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carb_profile_cfg->eir, 0, DPP_CAR_MAX_EIR_VALUE); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carb_profile_cfg->cbs, 0, DPP_CAR_MAX_CBS_VALUE); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carb_profile_cfg->ebs, 0, DPP_CAR_MAX_EBS_VALUE); + + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carb_profile_cfg->e_yellow_pri[0], 0, DPP_CAR_MAX_PRI_VALUE); + + for (i = 1; i < DPP_CAR_PRI_MAX; i++) + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carb_profile_cfg->c_pri[i], 0, DPP_CAR_MAX_PRI_VALUE); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carb_profile_cfg->e_green_pri[i], 0, DPP_CAR_MAX_PRI_VALUE); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carb_profile_cfg->e_yellow_pri[i], 0, DPP_CAR_MAX_PRI_VALUE); + } + + profile_cfg.carb_e_y_pri7 = p_carb_profile_cfg->e_yellow_pri[7]; + profile_cfg.carb_e_y_pri6 = p_carb_profile_cfg->e_yellow_pri[6]; + profile_cfg.carb_e_y_pri5 = p_carb_profile_cfg->e_yellow_pri[5]; + profile_cfg.carb_e_y_pri4 = p_carb_profile_cfg->e_yellow_pri[4]; + profile_cfg.carb_e_y_pri3 = p_carb_profile_cfg->e_yellow_pri[3]; + profile_cfg.carb_e_y_pri2 = p_carb_profile_cfg->e_yellow_pri[2]; + profile_cfg.carb_e_y_pri1 = p_carb_profile_cfg->e_yellow_pri[1]; + profile_cfg.carb_e_y_pri0 = p_carb_profile_cfg->e_yellow_pri[0]; + + profile_cfg.carb_e_g_pri7 = p_carb_profile_cfg->e_green_pri[7]; + profile_cfg.carb_e_g_pri6 = p_carb_profile_cfg->e_green_pri[6]; + profile_cfg.carb_e_g_pri5 = p_carb_profile_cfg->e_green_pri[5]; + profile_cfg.carb_e_g_pri4 = p_carb_profile_cfg->e_green_pri[4]; + profile_cfg.carb_e_g_pri3 = p_carb_profile_cfg->e_green_pri[3]; + profile_cfg.carb_e_g_pri2 = p_carb_profile_cfg->e_green_pri[2]; + profile_cfg.carb_e_g_pri1 = p_carb_profile_cfg->e_green_pri[1]; + + profile_cfg.carb_c_pri7 = p_carb_profile_cfg->c_pri[7]; + profile_cfg.carb_c_pri6 = p_carb_profile_cfg->c_pri[6]; + profile_cfg.carb_c_pri5 = p_carb_profile_cfg->c_pri[5]; + profile_cfg.carb_c_pri4 = p_carb_profile_cfg->c_pri[4]; + profile_cfg.carb_c_pri3 = p_carb_profile_cfg->c_pri[3]; + profile_cfg.carb_c_pri2 = p_carb_profile_cfg->c_pri[2]; + profile_cfg.carb_c_pri1 = p_carb_profile_cfg->c_pri[1]; + + profile_cfg.carb_cbs = p_carb_profile_cfg->cbs; + profile_cfg.carb_ebs_pbs = p_carb_profile_cfg->ebs; + profile_cfg.carb_cir = p_carb_profile_cfg->cir; + profile_cfg.carb_eir = p_carb_profile_cfg->eir; + + profile_cfg.carb_cd = p_carb_profile_cfg->cd; + profile_cfg.carb_cf = p_carb_profile_cfg->cf; + profile_cfg.carb_cm = p_carb_profile_cfg->cm; + + profile_cfg.carb_random_discard_en_e = p_carb_profile_cfg->random_disc_e; + profile_cfg.carb_random_discard_en_c = p_carb_profile_cfg->random_disc_c; + /* B级car包限速标记写死为0,以免用户配置成1对CARB进行包限速 */ + profile_cfg.carb_pkt_sign = 0; + + profile_cfg.carb_profile_wr = 0; + + rc = dpp_reg_write(dev, + STAT_CAR0_CARB_PROFILE_RAM1_255_0r, + 0, + profile_id, + &profile_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return rc; +} + + +/***********************************************************/ +/** 获取car B的监管模板配置 +* @param dev_id 设备号 +* @param profile_id 监管模板号 +* @param p_carb_profile_cfg 监管模板配置 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/05 +************************************************************/ +DPP_STATUS dpp_stat_carb_profile_cfg_get(DPP_DEV_T *dev, + ZXIC_UINT32 profile_id, + DPP_STAT_CAR_PROFILE_CFG_T *p_carb_profile_cfg) +{ + DPP_STATUS rc = DPP_OK; + + DPP_STAT_CAR0_CARB_PROFILE_RAM1_255_0_T profile_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_B_PROFILE_ID_MAX); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_carb_profile_cfg); + + rc = dpp_reg_read(dev, + STAT_CAR0_CARB_PROFILE_RAM1_255_0r, + 0, + profile_id, + &profile_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + p_carb_profile_cfg->profile_id = profile_id; + p_carb_profile_cfg->pkt_sign = profile_cfg.carb_pkt_sign; + p_carb_profile_cfg->cd = profile_cfg.carb_cd; + p_carb_profile_cfg->cf = profile_cfg.carb_cf; + p_carb_profile_cfg->cm = profile_cfg.carb_cm; + p_carb_profile_cfg->eir = profile_cfg.carb_eir; + p_carb_profile_cfg->cir = profile_cfg.carb_cir; + p_carb_profile_cfg->ebs = profile_cfg.carb_ebs_pbs; + p_carb_profile_cfg->cbs = profile_cfg.carb_cbs; + p_carb_profile_cfg->random_disc_e = profile_cfg.carb_random_discard_en_e; + p_carb_profile_cfg->random_disc_c = profile_cfg.carb_random_discard_en_c; + + p_carb_profile_cfg->c_pri[1] = profile_cfg.carb_c_pri1; + p_carb_profile_cfg->c_pri[2] = profile_cfg.carb_c_pri2; + p_carb_profile_cfg->c_pri[3] = profile_cfg.carb_c_pri3; + p_carb_profile_cfg->c_pri[4] = profile_cfg.carb_c_pri4; + p_carb_profile_cfg->c_pri[5] = profile_cfg.carb_c_pri5; + p_carb_profile_cfg->c_pri[6] = profile_cfg.carb_c_pri6; + p_carb_profile_cfg->c_pri[7] = profile_cfg.carb_c_pri7; + + p_carb_profile_cfg->e_green_pri[1] = profile_cfg.carb_e_g_pri1; + p_carb_profile_cfg->e_green_pri[2] = profile_cfg.carb_e_g_pri2; + p_carb_profile_cfg->e_green_pri[3] = profile_cfg.carb_e_g_pri3; + p_carb_profile_cfg->e_green_pri[4] = profile_cfg.carb_e_g_pri4; + p_carb_profile_cfg->e_green_pri[5] = profile_cfg.carb_e_g_pri5; + p_carb_profile_cfg->e_green_pri[6] = profile_cfg.carb_e_g_pri6; + p_carb_profile_cfg->e_green_pri[7] = profile_cfg.carb_e_g_pri7; + + p_carb_profile_cfg->e_yellow_pri[0] = profile_cfg.carb_e_y_pri0; + p_carb_profile_cfg->e_yellow_pri[1] = profile_cfg.carb_e_y_pri1; + p_carb_profile_cfg->e_yellow_pri[2] = profile_cfg.carb_e_y_pri2; + p_carb_profile_cfg->e_yellow_pri[3] = profile_cfg.carb_e_y_pri3; + p_carb_profile_cfg->e_yellow_pri[4] = profile_cfg.carb_e_y_pri4; + p_carb_profile_cfg->e_yellow_pri[5] = profile_cfg.carb_e_y_pri5; + p_carb_profile_cfg->e_yellow_pri[6] = profile_cfg.carb_e_y_pri6; + p_carb_profile_cfg->e_yellow_pri[7] = profile_cfg.carb_e_y_pri7; + + return rc; +} + +/***********************************************************/ +/** 配置car B的qvos溢出模式 +* @param dev_id 设备号 +* @param flow_id 流号 +* @param qvos_mode 溢出模式,参见DPP_CAR_QVOS_MODE_E +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_carb_queue_qvos_set(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 qvos_mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CARB_QOVS_RAM_RAM2_T qvos_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_B_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), qvos_mode, CAR_QVOS_MODE_OVERFLOW_0, CAR_QVOS_MODE_OVERFLOW_MAX - 1); + + qvos_cfg.carb_qovs = qvos_mode; + + rc = dpp_reg_write(dev, + STAT_CAR0_CARB_QOVS_RAM_RAM2r, + 0, + flow_id, + &qvos_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return rc; +} +/***********************************************************/ +/** 获取car B的qvos溢出模式 +* @param dev_id 设备号 +* @param flow_id 流号 +* @param p_qvos_mode qvos溢出模式 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_carb_queue_qvos_get(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 *p_qvos_mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CARB_QOVS_RAM_RAM2_T qvos_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_B_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_qvos_mode); + + rc = dpp_reg_read(dev, + STAT_CAR0_CARB_QOVS_RAM_RAM2r , + 0, + flow_id, + &qvos_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_qvos_mode = qvos_cfg.carb_qovs; + + return rc; +} + +/***********************************************************/ +/** 设置第二级的映射关系 +* @param dev_id 设备号 +* @param flow_id 流号 +* @param map_flow_id 映射的流号 +* @param map_sp 映射的优先级 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_carb_queue_map_set(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 map_flow_id, + ZXIC_UINT32 map_sp) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_LOOK_UP_TABLE2_T map_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_B_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), map_flow_id, 0, DPP_CAR_C_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), map_sp, DPP_CAR_PRI0, DPP_CAR_PRI_MAX - 1); + + map_cfg.carb_flow_id = map_flow_id; + map_cfg.carb_sp = map_sp; + + rc = dpp_reg_write(dev, + STAT_CAR0_LOOK_UP_TABLE2r , + 0, + flow_id, + &map_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return rc; +} + +/***********************************************************/ +/** 获取第二级的映射关系 +* @param dev_id 设备号 +* @param flow_id 流号 +* @param p_map_flow_id 映射流号 +* @param p_map_sp 映射优先级 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_carb_queue_map_get(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 *p_map_flow_id, + ZXIC_UINT32 *p_map_sp) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_LOOK_UP_TABLE2_T map_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_B_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_map_flow_id); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_map_sp); + + rc = dpp_reg_read(dev, + STAT_CAR0_LOOK_UP_TABLE2r , + 0, + flow_id, + &map_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_map_flow_id = map_cfg.carb_flow_id; + *p_map_sp = map_cfg.carb_sp; + + return rc; +} + +#if 0 +/***********************************************************/ +/** car B指定队列模式配置,仅用于调试 +* @param dev_id 设备号 +* @param global_en 全局队列使能,0-不使能,1-使能 +* @param sp_en 优先级队列使能,0-不使能,1-使能 +* @param appoint_sp 指定的优先级 +* @param appoint_queue 指定的队列号 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_carb_queue_appoint_mode_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 global_en, + ZXIC_UINT32 sp_en, + ZXIC_UINT32 appoint_sp, + ZXIC_UINT32 appoint_queue) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CARB_APPOINT_QNUM_OR_SP_T appoint_cfg = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, global_en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, sp_en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, appoint_sp, DPP_CAR_PRI0, DPP_CAR_PRI_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, appoint_queue, 0, DPP_CAR_B_FLOW_ID_MAX); + + appoint_cfg.carb_appoint_qnum_or_not = global_en; + appoint_cfg.carb_appoint_sp_or_not = sp_en; + appoint_cfg.carb_plcr_stat_sp = appoint_sp; + appoint_cfg.carb_plcr_stat_qnum = appoint_queue; + + rc = dpp_reg_write(dev_id, + STAT_CAR0_CARB_APPOINT_QNUM_OR_SPr, + 0, + 0, + &appoint_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_reg_write"); + + return rc; +} + +/***********************************************************/ +/** 获取car B指定队列模式的配置 +* @param dev_id 设备号 +* @param p_global_en 全局队列使能,0-不使能,1-使能 +* @param p_sp_en 优先级队列使能,0-不使能,1-使能 +* @param p_appoint_sp 指定的优先级 +* @param p_appoint_queue 指定的队列号 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/07 +************************************************************/ +DPP_STATUS dpp_stat_carb_queue_appoint_mode_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_global_en, + ZXIC_UINT32 *p_sp_en, + ZXIC_UINT32 *p_appoint_sp, + ZXIC_UINT32 *p_appoint_queue) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CARB_APPOINT_QNUM_OR_SP_T appoint_cfg = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_global_en); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_sp_en); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_appoint_sp); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_appoint_queue); + + rc = dpp_reg_read(dev_id, + STAT_CAR0_CARB_APPOINT_QNUM_OR_SPr, + 0, + 0, + &appoint_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_reg_read"); + + *p_global_en = appoint_cfg.carb_appoint_qnum_or_not; + *p_sp_en = appoint_cfg.carb_appoint_sp_or_not; + *p_appoint_sp = appoint_cfg.carb_plcr_stat_sp; + *p_appoint_queue = appoint_cfg.carb_plcr_stat_qnum; + + return rc; +} + +/***********************************************************/ +/** car B 调试计数读取模式配置 +* @param dev_id 设备号 +* @param overflow_mode 溢出模式,0-计数最大保持,1-计数最大翻转 +* @param rd_mode 读取模式,0-不读清,1-读清模式 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_carb_dbg_cnt_mode_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 overflow_mode, + ZXIC_UINT32 rd_mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CARB_CFGMT_COUNT_MODE_T cnt_mode_cfg = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, overflow_mode, CAR_KEEP_COUNT, CAR_RE_COUNT); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, rd_mode, CAR_READ_NOT_CLEAR, CAR_READ_AND_CLEAR); + + cnt_mode_cfg.carb_cfgmt_count_overflow_mode = overflow_mode; + cnt_mode_cfg.carb_cfgmt_count_rd_mode = rd_mode; + + rc = dpp_reg_write(dev_id, + STAT_CAR0_CARB_CFGMT_COUNT_MODEr, + 0, + 0, + &cnt_mode_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_reg_write"); + + return rc; +} + +/***********************************************************/ +/** +* @param dev_id +* @param p_overflow_mode +* @param p_rd_mode +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_carb_dbg_cnt_mode_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_overflow_mode, + ZXIC_UINT32 *p_rd_mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CARB_CFGMT_COUNT_MODE_T cnt_mode_cfg = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_overflow_mode); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_rd_mode); + + rc = dpp_reg_read(dev_id, + STAT_CAR0_CARB_CFGMT_COUNT_MODEr, + 0, + 0, + &cnt_mode_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_reg_read"); + + *p_overflow_mode = cnt_mode_cfg.carb_cfgmt_count_overflow_mode; + *p_rd_mode = cnt_mode_cfg.carb_cfgmt_count_rd_mode; + + return rc; +} + +/***********************************************************/ +/** car b 的调试计数获取 +* @param dev_id +* @param p_car_dbg_cnt +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/09/27 +************************************************************/ +DPP_STATUS dpp_stat_carb_dbg_cnt_get(ZXIC_UINT32 dev_id, + DPP_STAT_CAR_DBG_CNT_T *p_car_dbg_cnt) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 i = 0; + ZXIC_UINT32 size = 0; + ZXIC_UINT32 *p_tmp_cnt = NULL; + + DPP_STAT_CAR0_CARB_PKT_SIZE_CNT_T carb_pkt_size_cnt_cfg = {0}; + DPP_STAT_CAR0_CARB_PKT_DES_I_CNT_T carb_pkt_in_total_cnt_cfg = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_car_dbg_cnt); + + size = sizeof(DPP_STAT_CAR_DBG_CNT_T) / sizeof(ZXIC_UINT32) - 1; + p_tmp_cnt = (ZXIC_UINT32 *)p_car_dbg_cnt; + + for (i = 0; i < size; i++) + { + rc = dpp_reg_read(dev_id, + STAT_CAR0_CARB_PKT_DES_I_CNTr + i, + 0, + 0, + &carb_pkt_in_total_cnt_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_reg_read"); + + ZXIC_COMM_MEMCPY(p_tmp_cnt + i, &(carb_pkt_in_total_cnt_cfg.carb_pkt_des_i_cnt), sizeof(ZXIC_UINT32)); + } + + rc = dpp_reg_read(dev_id, + STAT_CAR0_CARB_PKT_SIZE_CNTr, + 0, + 0, + &carb_pkt_size_cnt_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_reg_read"); + + p_car_dbg_cnt->pkt_size_cnt = carb_pkt_size_cnt_cfg.carb_pkt_size_cnt; + + return rc; +} + + +/***********************************************************/ +/** 获取car B的初始化状态 +* @param dev_id 设备号 car编号 +* @param p_init_done 初始化完成使能 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_carb_init_done_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_init_done) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CARB_PLCR_INIT_DONT_T carb_init_done_cfg = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_init_done); + + rc = dpp_reg_read(dev_id, + STAT_CAR0_CARB_PLCR_INIT_DONTr , + 0, + 0, + &carb_init_done_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_reg_read"); + + *p_init_done = carb_init_done_cfg.carb_plcr_init_done; + + return rc; +} + +#endif +/***********************************************************/ +/** +* @param dev_id +* @param profile_id +* @param p_random_ram +* +* @return +* @remark 无 +* @see +* @author YXH @date 2019/04/01 +************************************************************/ +DPP_STATUS dpp_stat_carb_random_ram_set(DPP_DEV_T *dev, + ZXIC_UINT32 profile_id, + DPP_CAR_RANDOM_RAM_T *p_random_ram_e, + DPP_CAR_RANDOM_RAM_T *p_random_ram_c) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT64 para0_temp = 0; + ZXIC_UINT64 para2_temp = 0; + ZXIC_UINT64 para4_temp = 0; + DPP_STAT_CAR0_CARB_RANDOM_RAM_T carb_random_ram_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_random_ram_e); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_random_ram_e->p1, 0, 100); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_random_ram_e->p2, 0, 100); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_random_ram_e->p3, 0, 100); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_random_ram_c); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_random_ram_c->p1, 0, 100); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_random_ram_c->p2, 0, 100); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_random_ram_c->p3, 0, 100); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_B_PROFILE_ID_RANDOM_MAX); + + para0_temp = ((ZXIC_UINT64)((((ZXIC_UINT64)(p_random_ram_e->t2)) - ((ZXIC_UINT64)(p_random_ram_e->t1))) * ((ZXIC_UINT64)(p_random_ram_e->p1))) << DPP_CAR_RANDOM_OFFSET_VAL) / 100; + carb_random_ram_cfg.para0_l_e = (para0_temp & 0xFFFFFFFF); + carb_random_ram_cfg.para0_h_e = (para0_temp >> 32) & 0xFFFFFFFF; + + carb_random_ram_cfg.para1_e = ((p_random_ram_e->p2 - p_random_ram_e->p1) << DPP_CAR_RANDOM_OFFSET_VAL) / 100; + + para2_temp = ((ZXIC_UINT64)((((ZXIC_UINT64)(p_random_ram_e->t3)) - ((ZXIC_UINT64)(p_random_ram_e->t2))) * ((ZXIC_UINT64)(p_random_ram_e->p2))) << DPP_CAR_RANDOM_OFFSET_VAL) / 100; + carb_random_ram_cfg.para2_l_e = (para2_temp & 0xFFFFFFFF); + carb_random_ram_cfg.para2_h_e = (para2_temp >> 32) & 0xFFFFFFFF; + + carb_random_ram_cfg.para3_e = ((p_random_ram_e->p3 - p_random_ram_e->p2) << DPP_CAR_RANDOM_OFFSET_VAL) / 100; + + para4_temp = ((ZXIC_UINT64)((((ZXIC_UINT64)(p_random_ram_e->tc)) - ((ZXIC_UINT64)(p_random_ram_e->t3))) * ((ZXIC_UINT64)(p_random_ram_e->p3))) << DPP_CAR_RANDOM_OFFSET_VAL) / 100; + carb_random_ram_cfg.para4_l_e = (para4_temp & 0xFFFFFFFF); + carb_random_ram_cfg.para4_h_e = (para4_temp >> 32) & 0xFFFFFFFF; + + carb_random_ram_cfg.para5_e = ((100 - p_random_ram_e->p3) << DPP_CAR_RANDOM_OFFSET_VAL) / 100; + carb_random_ram_cfg.para6_e = p_random_ram_e->t1; + carb_random_ram_cfg.para7_e = p_random_ram_e->t2; + carb_random_ram_cfg.para8_e = p_random_ram_e->t3; + + /* para0_temp = 0; + para2_temp = 0; + para4_temp = 0; */ + + para0_temp = ((ZXIC_UINT64)((((ZXIC_UINT64)(p_random_ram_c->t2)) - ((ZXIC_UINT64)(p_random_ram_c->t1))) * ((ZXIC_UINT64)(p_random_ram_c->p1))) << DPP_CAR_RANDOM_OFFSET_VAL) / 100; + carb_random_ram_cfg.para0_l_c = (para0_temp & 0xFFFFFFFF); + carb_random_ram_cfg.para0_h_c = (para0_temp >> 32) & 0xFFFFFFFF; + + carb_random_ram_cfg.para1_c = ((p_random_ram_c->p2 - p_random_ram_c->p1) << DPP_CAR_RANDOM_OFFSET_VAL) / 100; + + para2_temp = ((ZXIC_UINT64)((((ZXIC_UINT64)(p_random_ram_c->t3)) - ((ZXIC_UINT64)(p_random_ram_c->t2))) * ((ZXIC_UINT64)(p_random_ram_c->p2))) << DPP_CAR_RANDOM_OFFSET_VAL) / 100; + carb_random_ram_cfg.para2_l_c = (para2_temp & 0xFFFFFFFF); + carb_random_ram_cfg.para2_h_c = (para2_temp >> 32) & 0xFFFFFFFF; + + carb_random_ram_cfg.para3_c = ((p_random_ram_c->p3 - p_random_ram_c->p2) << DPP_CAR_RANDOM_OFFSET_VAL) / 100; + + para4_temp = ((ZXIC_UINT64)((((ZXIC_UINT64)(p_random_ram_c->tc)) - ((ZXIC_UINT64)(p_random_ram_c->t3))) * ((ZXIC_UINT64)(p_random_ram_c->p3))) << DPP_CAR_RANDOM_OFFSET_VAL) / 100; + carb_random_ram_cfg.para4_l_c = (para4_temp & 0xFFFFFFFF); + carb_random_ram_cfg.para4_h_c = (para4_temp >> 32) & 0xFFFFFFFF; + + carb_random_ram_cfg.para5_c = ((100 - p_random_ram_c->p3) << DPP_CAR_RANDOM_OFFSET_VAL) / 100; + carb_random_ram_cfg.para6_c = p_random_ram_c->t1; + carb_random_ram_cfg.para7_c = p_random_ram_c->t2; + carb_random_ram_cfg.para8_c = p_random_ram_c->t3; + + rc = dpp_reg_write(dev, + STAT_CAR0_CARB_RANDOM_RAMr , + 0, + profile_id, + &carb_random_ram_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return rc; +} + +/***********************************************************/ +/** +* @param dev_id +* @param p_random_ram +* +* @return +* @remark 无 +* @see +* @author YXH @date 2019/04/01 +************************************************************/ +DPP_STATUS dpp_stat_carb_random_ram_get(DPP_DEV_T *dev, + ZXIC_UINT32 profile_id, + DPP_CAR_RANDOM_RAM_T *p_random_ram_e, + DPP_CAR_RANDOM_RAM_T *p_random_ram_c) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CARB_RANDOM_RAM_T carb_random_ram_cfg = {0}; + ZXIC_UINT32 tmp_val = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_random_ram_e); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_random_ram_c); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_B_PROFILE_ID_RANDOM_MAX); + + rc = dpp_reg_read(dev, + STAT_CAR0_CARB_RANDOM_RAMr , + 0, + profile_id, + &carb_random_ram_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + p_random_ram_e->t1 = carb_random_ram_cfg.para6_e; + p_random_ram_e->t2 = carb_random_ram_cfg.para7_e; + p_random_ram_e->t3 = carb_random_ram_cfg.para8_e; + tmp_val = (carb_random_ram_cfg.para5_e * 100) >> DPP_CAR_RANDOM_OFFSET_VAL; + p_random_ram_e->p3 = 100 - tmp_val; + tmp_val = (carb_random_ram_cfg.para3_e * 100) >> DPP_CAR_RANDOM_OFFSET_VAL; + p_random_ram_e->p2 = p_random_ram_e->p3 - tmp_val; + tmp_val = (carb_random_ram_cfg.para1_e * 100) >> DPP_CAR_RANDOM_OFFSET_VAL; + p_random_ram_e->p1 = p_random_ram_e->p2 - tmp_val; + + p_random_ram_c->t1 = carb_random_ram_cfg.para6_c; + p_random_ram_c->t2 = carb_random_ram_cfg.para7_c; + p_random_ram_c->t3 = carb_random_ram_cfg.para8_c; + tmp_val = (carb_random_ram_cfg.para5_c * 100) >> DPP_CAR_RANDOM_OFFSET_VAL; + p_random_ram_c->p3 = 100 - tmp_val; + tmp_val = (carb_random_ram_cfg.para3_c * 100) >> DPP_CAR_RANDOM_OFFSET_VAL; + p_random_ram_c->p2 = p_random_ram_c->p3 - tmp_val; + tmp_val = (carb_random_ram_cfg.para1_c * 100) >> DPP_CAR_RANDOM_OFFSET_VAL; + p_random_ram_c->p1 = p_random_ram_c->p2 - tmp_val; + + return rc; +} + +/***********************************************************/ +/** car C的流设置 +* @param dev_id 设备号 car编号 +* @param flow_id 流号 +* @param drop_flag 丢弃标志 +* @param plcr_en 监管使能 +* @param profile_id 监管模板号 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/05 +************************************************************/ +DPP_STATUS dpp_stat_carc_queue_cfg_set(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 drop_flag, + ZXIC_UINT32 plcr_en, + ZXIC_UINT32 profile_id) +{ + DPP_STATUS rc = DPP_OK; + + DPP_STAT_CAR0_CARC_QUEUE_RAM0_159_0_T queue_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_C_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), drop_flag, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), plcr_en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_C_PROFILE_ID_MAX); + + queue_cfg.carc_drop = drop_flag; + queue_cfg.carc_plcr_en = plcr_en; + queue_cfg.carc_profile_id = profile_id; + + rc = dpp_reg_write(dev, + STAT_CAR0_CARC_QUEUE_RAM0_159_0r , + 0, + flow_id, + &queue_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return rc; +} + +/***********************************************************/ +/** 获取car C的流设置 +* @param dev_id 设备号 car编号 +* @param flow_id 流号 +* @param p_carc_queue_cfg car c流配置信息 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/05 +************************************************************/ +DPP_STATUS dpp_stat_carc_queue_cfg_get(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + DPP_STAT_CAR_C_QUEUE_CFG_T *p_carc_queue_cfg) +{ + DPP_STATUS rc = DPP_OK; + + DPP_STAT_CAR0_CARC_QUEUE_RAM0_159_0_T queue_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_C_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_carc_queue_cfg); + + rc = dpp_reg_read(dev, + STAT_CAR0_CARC_QUEUE_RAM0_159_0r, + 0, + flow_id, + &queue_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + p_carc_queue_cfg->flow_id = flow_id; + p_carc_queue_cfg->drop_flag = queue_cfg.carc_drop; + p_carc_queue_cfg->plcr_en = queue_cfg.carc_plcr_en; + p_carc_queue_cfg->profile_id = queue_cfg.carc_profile_id; + + p_carc_queue_cfg->tq = ZXIC_COMM_COUNTER64_BUILD(queue_cfg.carc_tq_h, queue_cfg.carc_tq_l); + + p_carc_queue_cfg->tce_flag = queue_cfg.carc_ted; + p_carc_queue_cfg->tce = queue_cfg.carc_tcd; + p_carc_queue_cfg->te = queue_cfg.carc_tei; + p_carc_queue_cfg->tc = queue_cfg.carc_tci; + + return rc; +} + +/***********************************************************/ +/** car C监管模板设定 +* @param dev_id 设备号 car编号 +* @param profile_id 监管模板号 +* @param p_carc_profile_cfg 监管模板配置 +* pkt_sign 包限速标记写死成0,防止用户在carC包限速 +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/05 +************************************************************/ +DPP_STATUS dpp_stat_carc_profile_cfg_set(DPP_DEV_T *dev, + ZXIC_UINT32 profile_id, + DPP_STAT_CAR_PROFILE_CFG_T *p_carc_profile_cfg) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 i = 0; + + DPP_STAT_CAR0_CARC_PROFILE_RAM1_255_0_T profile_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_C_PROFILE_ID_MAX); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_carc_profile_cfg); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carc_profile_cfg->pkt_sign, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carc_profile_cfg->cf, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carc_profile_cfg->cm, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carc_profile_cfg->random_disc_e, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carc_profile_cfg->random_disc_c, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carc_profile_cfg->cd, CAR_CD_MODE_SRTCM, CAR_CD_MODE_INVALID - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carc_profile_cfg->cir, 0, DPP_CAR_MAX_CIR_VALUE); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carc_profile_cfg->eir, 0, DPP_CAR_MAX_EIR_VALUE); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carc_profile_cfg->cbs, 0, DPP_CAR_MAX_CBS_VALUE); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carc_profile_cfg->ebs, 0, DPP_CAR_MAX_EBS_VALUE); + + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carc_profile_cfg->e_yellow_pri[0], 0, DPP_CAR_MAX_PRI_VALUE); + + for (i = 1; i < DPP_CAR_PRI_MAX; i++) + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carc_profile_cfg->c_pri[i], 0, DPP_CAR_MAX_PRI_VALUE); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carc_profile_cfg->e_green_pri[i], 0, DPP_CAR_MAX_PRI_VALUE); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_carc_profile_cfg->e_yellow_pri[i], 0, DPP_CAR_MAX_PRI_VALUE); + } + + profile_cfg.carc_e_y_pri7 = p_carc_profile_cfg->e_yellow_pri[7]; + profile_cfg.carc_e_y_pri6 = p_carc_profile_cfg->e_yellow_pri[6]; + profile_cfg.carc_e_y_pri5 = p_carc_profile_cfg->e_yellow_pri[5]; + profile_cfg.carc_e_y_pri4 = p_carc_profile_cfg->e_yellow_pri[4]; + profile_cfg.carc_e_y_pri3 = p_carc_profile_cfg->e_yellow_pri[3]; + profile_cfg.carc_e_y_pri2 = p_carc_profile_cfg->e_yellow_pri[2]; + profile_cfg.carc_e_y_pri1 = p_carc_profile_cfg->e_yellow_pri[1]; + profile_cfg.carc_e_y_pri0 = p_carc_profile_cfg->e_yellow_pri[0]; + + profile_cfg.carc_e_g_pri7 = p_carc_profile_cfg->e_green_pri[7]; + profile_cfg.carc_e_g_pri6 = p_carc_profile_cfg->e_green_pri[6]; + profile_cfg.carc_e_g_pri5 = p_carc_profile_cfg->e_green_pri[5]; + profile_cfg.carc_e_g_pri4 = p_carc_profile_cfg->e_green_pri[4]; + profile_cfg.carc_e_g_pri3 = p_carc_profile_cfg->e_green_pri[3]; + profile_cfg.carc_e_g_pri2 = p_carc_profile_cfg->e_green_pri[2]; + profile_cfg.carc_e_g_pri1 = p_carc_profile_cfg->e_green_pri[1]; + + profile_cfg.carc_c_pri7 = p_carc_profile_cfg->c_pri[7]; + profile_cfg.carc_c_pri6 = p_carc_profile_cfg->c_pri[6]; + profile_cfg.carc_c_pri5 = p_carc_profile_cfg->c_pri[5]; + profile_cfg.carc_c_pri4 = p_carc_profile_cfg->c_pri[4]; + profile_cfg.carc_c_pri3 = p_carc_profile_cfg->c_pri[3]; + profile_cfg.carc_c_pri2 = p_carc_profile_cfg->c_pri[2]; + profile_cfg.carc_c_pri1 = p_carc_profile_cfg->c_pri[1]; + + profile_cfg.carc_cbs = p_carc_profile_cfg->cbs; + profile_cfg.carc_ebs_pbs = p_carc_profile_cfg->ebs; + profile_cfg.carc_cir = p_carc_profile_cfg->cir; + profile_cfg.carc_eir = p_carc_profile_cfg->eir; + + profile_cfg.carc_cd = p_carc_profile_cfg->cd; + profile_cfg.carc_cf = p_carc_profile_cfg->cf; + profile_cfg.carc_cm = p_carc_profile_cfg->cm; + profile_cfg.carc_random_discard_en_e = p_carc_profile_cfg->random_disc_e; + profile_cfg.carc_random_discard_en_c = p_carc_profile_cfg->random_disc_c; + /* C级car包限速标记写死为0,以免用户配置成1对CARC进行包限速 */ + profile_cfg.carc_pkt_sign = 0; + + profile_cfg.carc_profile_wr = 0; + + rc = dpp_reg_write(dev, + STAT_CAR0_CARC_PROFILE_RAM1_255_0r , + 0, + profile_id, + &profile_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return rc; +} + + +/***********************************************************/ +/** 获取car C的监管模板配置 +* @param dev_id 设备号 car编号 +* @param profile_id 监管模板号 +* @param p_carc_profile_cfg 监管模板配置 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/05 +************************************************************/ +DPP_STATUS dpp_stat_carc_profile_cfg_get(DPP_DEV_T *dev, + ZXIC_UINT32 profile_id, + DPP_STAT_CAR_PROFILE_CFG_T *p_carc_profile_cfg) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CARC_PROFILE_RAM1_255_0_T profile_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_C_PROFILE_ID_MAX); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_carc_profile_cfg); + + rc = dpp_reg_read(dev, + STAT_CAR0_CARC_PROFILE_RAM1_255_0r, + 0, + profile_id, + &profile_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + p_carc_profile_cfg->profile_id = profile_id; + p_carc_profile_cfg->pkt_sign = profile_cfg.carc_pkt_sign; + p_carc_profile_cfg->cd = profile_cfg.carc_cd; + p_carc_profile_cfg->cf = profile_cfg.carc_cf; + p_carc_profile_cfg->cm = profile_cfg.carc_cm; + + p_carc_profile_cfg->eir = profile_cfg.carc_eir; + p_carc_profile_cfg->cir = profile_cfg.carc_cir; + p_carc_profile_cfg->ebs = profile_cfg.carc_ebs_pbs; + p_carc_profile_cfg->cbs = profile_cfg.carc_cbs; + + p_carc_profile_cfg->random_disc_e = profile_cfg.carc_random_discard_en_e; + p_carc_profile_cfg->random_disc_c = profile_cfg.carc_random_discard_en_c; + + p_carc_profile_cfg->c_pri[1] = profile_cfg.carc_c_pri1; + p_carc_profile_cfg->c_pri[2] = profile_cfg.carc_c_pri2; + p_carc_profile_cfg->c_pri[3] = profile_cfg.carc_c_pri3; + p_carc_profile_cfg->c_pri[4] = profile_cfg.carc_c_pri4; + p_carc_profile_cfg->c_pri[5] = profile_cfg.carc_c_pri5; + p_carc_profile_cfg->c_pri[6] = profile_cfg.carc_c_pri6; + p_carc_profile_cfg->c_pri[7] = profile_cfg.carc_c_pri7; + + p_carc_profile_cfg->e_green_pri[1] = profile_cfg.carc_e_g_pri1; + p_carc_profile_cfg->e_green_pri[2] = profile_cfg.carc_e_g_pri2; + p_carc_profile_cfg->e_green_pri[3] = profile_cfg.carc_e_g_pri3; + p_carc_profile_cfg->e_green_pri[4] = profile_cfg.carc_e_g_pri4; + p_carc_profile_cfg->e_green_pri[5] = profile_cfg.carc_e_g_pri5; + p_carc_profile_cfg->e_green_pri[6] = profile_cfg.carc_e_g_pri6; + p_carc_profile_cfg->e_green_pri[7] = profile_cfg.carc_e_g_pri7; + + p_carc_profile_cfg->e_yellow_pri[0] = profile_cfg.carc_e_y_pri0; + p_carc_profile_cfg->e_yellow_pri[1] = profile_cfg.carc_e_y_pri1; + p_carc_profile_cfg->e_yellow_pri[2] = profile_cfg.carc_e_y_pri2; + p_carc_profile_cfg->e_yellow_pri[3] = profile_cfg.carc_e_y_pri3; + p_carc_profile_cfg->e_yellow_pri[4] = profile_cfg.carc_e_y_pri4; + p_carc_profile_cfg->e_yellow_pri[5] = profile_cfg.carc_e_y_pri5; + p_carc_profile_cfg->e_yellow_pri[6] = profile_cfg.carc_e_y_pri6; + p_carc_profile_cfg->e_yellow_pri[7] = profile_cfg.carc_e_y_pri7; + + return rc; +} + +/***********************************************************/ +/** 配置car C的qvos溢出模式 +* @param dev_id 设备号 car编号 +* @param flow_id 流号 +* @param qvos_mode 溢出模式,参见DPP_CAR_QVOS_MODE_E +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_carc_queue_qvos_set(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 qvos_mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CARC_QOVS_RAM_RAM2_T qvos_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_C_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), qvos_mode, CAR_QVOS_MODE_OVERFLOW_0, CAR_QVOS_MODE_OVERFLOW_MAX - 1); + + qvos_cfg.carc_qovs = qvos_mode; + + rc = dpp_reg_write(dev, + STAT_CAR0_CARC_QOVS_RAM_RAM2r, + 0, + flow_id, + &qvos_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return rc; +} +/***********************************************************/ +/** 获取car C的qvos溢出模式 +* @param dev_id 设备号 car编号 +* @param flow_id 流号 +* @param p_qvos_mode qvos溢出模式 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_carc_queue_qvos_get(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 *p_qvos_mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CARC_QOVS_RAM_RAM2_T qvos_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_C_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_qvos_mode); + + rc = dpp_reg_read(dev, + STAT_CAR0_CARC_QOVS_RAM_RAM2r , + 0, + flow_id, + &qvos_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_qvos_mode = qvos_cfg.carc_qovs; + + return rc; +} + +#if 0 +/***********************************************************/ +/** car C指定队列模式配置,仅用于调试 +* @param dev_id 设备号 car编号 +* @param global_en 全局队列使能,0-不使能,1-使能 +* @param sp_en 优先级队列使能,0-不使能,1-使能 +* @param appoint_sp 指定的优先级 +* @param appoint_queue 指定的队列号 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_carc_queue_appoint_mode_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 global_en, + ZXIC_UINT32 sp_en, + ZXIC_UINT32 appoint_sp, + ZXIC_UINT32 appoint_queue) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CARC_APPOINT_QNUM_OR_SP_T appoint_cfg = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, global_en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, sp_en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, appoint_sp, DPP_CAR_PRI0, DPP_CAR_PRI_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, appoint_queue, 0, DPP_CAR_C_FLOW_ID_MAX); + + appoint_cfg.carc_appoint_qnum_or_not = global_en; + appoint_cfg.carc_appoint_sp_or_not = sp_en; + appoint_cfg.carc_plcr_stat_sp = appoint_sp; + appoint_cfg.carc_plcr_stat_qnum = appoint_queue; + + rc = dpp_reg_write(dev_id, + STAT_CAR0_CARC_APPOINT_QNUM_OR_SPr , + 0, + 0, + &appoint_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_reg_write"); + + return rc; +} + +/***********************************************************/ +/** 获取car C指定队列模式的配置 +* @param dev_id 设备号 car编号 +* @param p_global_en 全局队列使能,0-不使能,1-使能 +* @param p_sp_en 优先级队列使能,0-不使能,1-使能 +* @param p_appoint_sp 指定的优先级 +* @param p_appoint_queue 指定的队列号 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/07 +************************************************************/ +DPP_STATUS dpp_stat_carc_queue_appoint_mode_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_global_en, + ZXIC_UINT32 *p_sp_en, + ZXIC_UINT32 *p_appoint_sp, + ZXIC_UINT32 *p_appoint_queue) +{ + DPP_STATUS rc = DPP_OK; + + DPP_STAT_CAR0_CARC_APPOINT_QNUM_OR_SP_T appoint_cfg = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_global_en); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_sp_en); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_appoint_sp); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_appoint_queue); + + rc = dpp_reg_read(dev_id, + STAT_CAR0_CARC_APPOINT_QNUM_OR_SPr , + 0, + 0, + &appoint_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_reg_read"); + + *p_global_en = appoint_cfg.carc_appoint_qnum_or_not; + *p_sp_en = appoint_cfg.carc_appoint_sp_or_not; + *p_appoint_sp = appoint_cfg.carc_plcr_stat_sp; + *p_appoint_queue = appoint_cfg.carc_plcr_stat_qnum; + + return rc; +} + +/***********************************************************/ +/** car C 调试计数读取模式配置 +* @param dev_id 设备号 car编号 +* @param overflow_mode 溢出模式,0-计数最大保持,1-计数最大翻转 +* @param rd_mode 读取模式,0-不读清,1-读清模式 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_carc_dbg_cnt_mode_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 overflow_mode, + ZXIC_UINT32 rd_mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CARC_CFGMT_COUNT_MODE_T cnt_mode_cfg = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, overflow_mode, CAR_KEEP_COUNT, CAR_RE_COUNT); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, rd_mode, CAR_READ_NOT_CLEAR, CAR_READ_AND_CLEAR); + + cnt_mode_cfg.carc_cfgmt_count_overflow_mode = overflow_mode; + cnt_mode_cfg.carc_cfgmt_count_rd_mode = rd_mode; + + rc = dpp_reg_write(dev_id, + STAT_CAR0_CARC_CFGMT_COUNT_MODEr , + 0, + 0, + &cnt_mode_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_reg_write"); + + return rc; +} + +/***********************************************************/ +/** car C 调试计数读取模式获取 +* @param dev_id 设备号 car编号 +* @param p_overflow_mode 溢出模式,0-计数最大保持,1-计数最大翻转 +* @param p_rd_mode 读清模式,0-不读清,1-读清模式 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_carc_dbg_cnt_mode_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_overflow_mode, + ZXIC_UINT32 *p_rd_mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CARC_CFGMT_COUNT_MODE_T cnt_mode_cfg = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_overflow_mode); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_rd_mode); + + rc = dpp_reg_read(dev_id, + STAT_CAR0_CARC_CFGMT_COUNT_MODEr , + 0, + 0, + &cnt_mode_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_reg_read"); + + *p_overflow_mode = cnt_mode_cfg.carc_cfgmt_count_overflow_mode; + *p_rd_mode = cnt_mode_cfg.carc_cfgmt_count_rd_mode; + + return rc; +} + +/***********************************************************/ +/** car b 的调试计数获取 +* @param dev_id +* @param p_car_dbg_cnt +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/09/27 +************************************************************/ +DPP_STATUS dpp_stat_carc_dbg_cnt_get(ZXIC_UINT32 dev_id, + DPP_STAT_CAR_DBG_CNT_T *p_car_dbg_cnt) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 i = 0; + ZXIC_UINT32 size = 0; + ZXIC_UINT32 *p_tmp_cnt = NULL; + + DPP_STAT_CAR0_CARC_PKT_SIZE_CNT_T carc_pkt_size_cnt_cfg = {0}; + DPP_STAT_CAR0_CARC_PKT_DES_I_CNT_T carc_pkt_in_total_cnt_cfg = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_car_dbg_cnt); + + size = sizeof(DPP_STAT_CAR_DBG_CNT_T) / sizeof(ZXIC_UINT32) - 1; + p_tmp_cnt = (ZXIC_UINT32 *)p_car_dbg_cnt; + + for (i = 0; i < size; i++) + { + rc = dpp_reg_read(dev_id, + STAT_CAR0_CARC_PKT_DES_I_CNTr + i, + 0, + 0, + &carc_pkt_in_total_cnt_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_reg_read"); + + ZXIC_COMM_MEMCPY(p_tmp_cnt + i, &(carc_pkt_in_total_cnt_cfg.carc_pkt_des_i_cnt), sizeof(ZXIC_UINT32)); + } + + rc = dpp_reg_read(dev_id, + STAT_CAR0_CARC_PKT_SIZE_CNTr, + 0, + 0, + &carc_pkt_size_cnt_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_reg_read"); + + p_car_dbg_cnt->pkt_size_cnt = carc_pkt_size_cnt_cfg.carc_pkt_size_cnt; + + return rc; +} + +/***********************************************************/ +/** 获取car C的初始化状态 +* @param dev_id 设备号 car编号 +* @param p_init_done 初始化完成使能 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/06 +************************************************************/ +DPP_STATUS dpp_stat_carc_init_done_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_init_done) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CARC_PLCR_INIT_DONT_T carc_init_done_cfg = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_init_done); + + rc = dpp_reg_read(dev_id, + STAT_CAR0_CARC_PLCR_INIT_DONTr , + 0, + 0, + &carc_init_done_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_reg_read"); + + *p_init_done = carc_init_done_cfg.carc_plcr_init_done; + + return rc; +} + +#endif +/***********************************************************/ +/** +* @param dev_id +* @param profile_id +* @param p_random_ram +* +* @return +* @remark 无 +* @see +* @author YXH @date 2019/04/01 +************************************************************/ +DPP_STATUS dpp_stat_carc_random_ram_set(DPP_DEV_T *dev, + ZXIC_UINT32 profile_id, + DPP_CAR_RANDOM_RAM_T *p_random_ram_e, + DPP_CAR_RANDOM_RAM_T *p_random_ram_c) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT64 para0_temp = 0; + ZXIC_UINT64 para2_temp = 0; + ZXIC_UINT64 para4_temp = 0; + DPP_STAT_CAR0_CARC_RANDOM_RAM_T carc_random_ram_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_random_ram_e); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_random_ram_e->p1, 0, 100); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_random_ram_e->p2, 0, 100); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_random_ram_e->p3, 0, 100); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_random_ram_c); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_random_ram_c->p1, 0, 100); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_random_ram_c->p2, 0, 100); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_random_ram_c->p3, 0, 100); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_C_PROFILE_ID_RANDOM_MAX); + + para0_temp = ((ZXIC_UINT64)((((ZXIC_UINT64)(p_random_ram_e->t2)) - ((ZXIC_UINT64)(p_random_ram_e->t1))) * ((ZXIC_UINT64)(p_random_ram_e->p1))) << DPP_CAR_RANDOM_OFFSET_VAL) / 100; + carc_random_ram_cfg.para0_l_e = (para0_temp & 0xFFFFFFFF); + carc_random_ram_cfg.para0_h_e = (para0_temp >> 32) & 0xFFFFFFFF; + + carc_random_ram_cfg.para1_e = ((p_random_ram_e->p2 - p_random_ram_e->p1) << DPP_CAR_RANDOM_OFFSET_VAL) / 100; + + para2_temp = ((ZXIC_UINT64)((((ZXIC_UINT64)(p_random_ram_e->t3)) - ((ZXIC_UINT64)(p_random_ram_e->t2))) * ((ZXIC_UINT64)(p_random_ram_e->p2))) << DPP_CAR_RANDOM_OFFSET_VAL) / 100; + carc_random_ram_cfg.para2_l_e = (para2_temp & 0xFFFFFFFF); + carc_random_ram_cfg.para2_h_e = (para2_temp >> 32) & 0xFFFFFFFF; + + carc_random_ram_cfg.para3_e = ((p_random_ram_e->p3 - p_random_ram_e->p2) << DPP_CAR_RANDOM_OFFSET_VAL) / 100; + + para4_temp = ((ZXIC_UINT64)((((ZXIC_UINT64)(p_random_ram_e->tc)) - ((ZXIC_UINT64)(p_random_ram_e->t3))) * ((ZXIC_UINT64)(p_random_ram_e->p3))) << DPP_CAR_RANDOM_OFFSET_VAL) / 100; + carc_random_ram_cfg.para4_l_e = (para4_temp & 0xFFFFFFFF); + carc_random_ram_cfg.para4_h_e = (para4_temp >> 32) & 0xFFFFFFFF; + + carc_random_ram_cfg.para5_e = ((100 - p_random_ram_e->p3) << DPP_CAR_RANDOM_OFFSET_VAL) / 100; + carc_random_ram_cfg.para6_e = p_random_ram_e->t1; + carc_random_ram_cfg.para7_e = p_random_ram_e->t2; + carc_random_ram_cfg.para8_e = p_random_ram_e->t3; + + /* para0_temp = 0; + para2_temp = 0; + para4_temp = 0; */ + + para0_temp = ((ZXIC_UINT64)((((ZXIC_UINT64)(p_random_ram_c->t2)) - ((ZXIC_UINT64)(p_random_ram_c->t1))) * ((ZXIC_UINT64)(p_random_ram_c->p1))) << DPP_CAR_RANDOM_OFFSET_VAL) / 100; + carc_random_ram_cfg.para0_l_c = (para0_temp & 0xFFFFFFFF); + carc_random_ram_cfg.para0_h_c = (para0_temp >> 32) & 0xFFFFFFFF; + + carc_random_ram_cfg.para1_c = ((p_random_ram_c->p2 - p_random_ram_c->p1) << DPP_CAR_RANDOM_OFFSET_VAL) / 100; + + para2_temp = ((ZXIC_UINT64)((((ZXIC_UINT64)(p_random_ram_c->t3)) - ((ZXIC_UINT64)(p_random_ram_c->t2))) * ((ZXIC_UINT64)(p_random_ram_c->p2))) << DPP_CAR_RANDOM_OFFSET_VAL) / 100; + carc_random_ram_cfg.para2_l_c = (para2_temp & 0xFFFFFFFF); + carc_random_ram_cfg.para2_h_c = (para2_temp >> 32) & 0xFFFFFFFF; + + carc_random_ram_cfg.para3_c = ((p_random_ram_c->p3 - p_random_ram_c->p2) << DPP_CAR_RANDOM_OFFSET_VAL) / 100; + + para4_temp = ((ZXIC_UINT64)((((ZXIC_UINT64)(p_random_ram_c->tc)) - ((ZXIC_UINT64)(p_random_ram_c->t3))) * ((ZXIC_UINT64)(p_random_ram_c->p3))) << DPP_CAR_RANDOM_OFFSET_VAL) / 100; + carc_random_ram_cfg.para4_l_c = (para4_temp & 0xFFFFFFFF); + carc_random_ram_cfg.para4_h_c = (para4_temp >> 32) & 0xFFFFFFFF; + + carc_random_ram_cfg.para5_c = ((100 - p_random_ram_c->p3) << DPP_CAR_RANDOM_OFFSET_VAL) / 100; + carc_random_ram_cfg.para6_c = p_random_ram_c->t1; + carc_random_ram_cfg.para7_c = p_random_ram_c->t2; + carc_random_ram_cfg.para8_c = p_random_ram_c->t3; + + rc = dpp_reg_write(dev, + STAT_CAR0_CARC_RANDOM_RAMr , + 0, + profile_id, + &carc_random_ram_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return rc; +} + +/***********************************************************/ +/** +* @param dev_id +* @param p_random_ram +* +* @return +* @remark 无 +* @see +* @author YXH @date 2019/04/01 +************************************************************/ +DPP_STATUS dpp_stat_carc_random_ram_get(DPP_DEV_T *dev, + ZXIC_UINT32 profile_id, + DPP_CAR_RANDOM_RAM_T *p_random_ram_e, + DPP_CAR_RANDOM_RAM_T *p_random_ram_c) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CARB_RANDOM_RAM_T carc_random_ram_cfg = {0}; + ZXIC_UINT32 tmp_val = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_random_ram_e); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_random_ram_c); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_C_PROFILE_ID_RANDOM_MAX); + + rc = dpp_reg_read(dev, + STAT_CAR0_CARC_RANDOM_RAMr , + 0, + profile_id, + &carc_random_ram_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + p_random_ram_e->t1 = carc_random_ram_cfg.para6_e; + p_random_ram_e->t2 = carc_random_ram_cfg.para7_e; + p_random_ram_e->t3 = carc_random_ram_cfg.para8_e; + tmp_val = (carc_random_ram_cfg.para5_e * 100) >> DPP_CAR_RANDOM_OFFSET_VAL; + p_random_ram_e->p3 = 100 - tmp_val; + tmp_val = (carc_random_ram_cfg.para3_e * 100) >> DPP_CAR_RANDOM_OFFSET_VAL; + p_random_ram_e->p2 = p_random_ram_e->p3 - tmp_val; + tmp_val = (carc_random_ram_cfg.para1_e * 100) >> DPP_CAR_RANDOM_OFFSET_VAL; + p_random_ram_e->p1 = p_random_ram_e->p2 - tmp_val; + + p_random_ram_c->t1 = carc_random_ram_cfg.para6_c; + p_random_ram_c->t2 = carc_random_ram_cfg.para7_c; + p_random_ram_c->t3 = carc_random_ram_cfg.para8_c; + tmp_val = (carc_random_ram_cfg.para5_c * 100) >> DPP_CAR_RANDOM_OFFSET_VAL; + p_random_ram_c->p3 = 100 - tmp_val; + tmp_val = (carc_random_ram_cfg.para3_c * 100) >> DPP_CAR_RANDOM_OFFSET_VAL; + p_random_ram_c->p2 = p_random_ram_c->p3 - tmp_val; + tmp_val = (carc_random_ram_cfg.para1_c * 100) >> DPP_CAR_RANDOM_OFFSET_VAL; + p_random_ram_c->p1 = p_random_ram_c->p2 - tmp_val; + + return rc; +} + +/***********************************************************/ +/** 配置car的层级模式 +* @param dev_id +* @param mode 2 - 三级car, 第一级支持16K +* 1 - 两级car, 第一级扩展为17K +* 0 - 一级car, 第一级扩展为21K +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/09/28 +************************************************************/ +DPP_STATUS dpp_stat_car_en_mode_set(DPP_DEV_T *dev, ZXIC_UINT32 mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CAR_HIERARCHY_MODE_T car_en_mode_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), mode, DPP_CAR_EN_MODE_BOTH_EN, DPP_CAR_EN_MODE_INVALID - 1); + + car_en_mode_cfg.car_hierarchy_mode = mode; + + rc = dpp_reg_write(dev, + STAT_CAR0_CAR_HIERARCHY_MODEr , + 0, + 0, + &car_en_mode_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return rc; +} + +/***********************************************************/ +/** +* @param dev_id +* @param p_mode +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/09/28 +************************************************************/ +DPP_STATUS dpp_stat_car_en_mode_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_CAR_HIERARCHY_MODE_T car_en_mode_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_mode); + + rc = dpp_reg_read(dev, + STAT_CAR0_CAR_HIERARCHY_MODEr , + 0, + 0, + &car_en_mode_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_mode = car_en_mode_cfg.car_hierarchy_mode; + + return rc; +} + +/***********************************************************/ +/** 配置car的包长偏移 +* @param dev_id +* @param pkt_size_off +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author wll @date 2019/06/06 +************************************************************/ +DPP_STATUS dpp_stat_car_pkt_size_offset_set(DPP_DEV_T *dev, + ZXIC_UINT32 pkt_size_off) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_PKT_SIZE_OFFSET_T car_pkt_size_offset = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), pkt_size_off, 0, 0xffffffff); + + car_pkt_size_offset.pkt_size_offset = pkt_size_off; + + rc = dpp_reg_write(dev, + STAT_CAR0_PKT_SIZE_OFFSETr, + 0, + 0, + &car_pkt_size_offset); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return rc; +} + +/***********************************************************/ +/** 获取car的包长偏移 +* @param dev_id +* @param p_pkt_size_off +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author wll @date 2019/06/06 +************************************************************/ +DPP_STATUS dpp_stat_car_pkt_size_offset_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_pkt_size_off) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_PKT_SIZE_OFFSET_T car_pkt_size_offset = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_pkt_size_off); + + rc = dpp_reg_read(dev, + STAT_CAR0_PKT_SIZE_OFFSETr, + 0, + 0, + &car_pkt_size_offset); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_pkt_size_off = car_pkt_size_offset.pkt_size_offset; + + return rc; +} + +/***********************************************************/ +/** 配置cara的最大包长 +* @param dev_id +* @param max_pkt_size +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author wll @date 2019/06/06 +************************************************************/ +DPP_STATUS dpp_stat_cara_max_pkt_size_set(DPP_DEV_T *dev, + ZXIC_UINT32 max_pkt_size) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_MAX_PKT_SIZE_A_T car_max_pkt_size = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), max_pkt_size, 0, 0x3fff); + + car_max_pkt_size.max_pkt_size_a = max_pkt_size; + + rc = dpp_reg_write(dev, + STAT_CAR0_MAX_PKT_SIZE_Ar , + 0, + 0, + &car_max_pkt_size); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return rc; +} + +/***********************************************************/ +/** 获取cara的最大包长 +* @param dev_id +* @param p_max_pkt_size +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author wll @date 2019/06/06 +************************************************************/ +DPP_STATUS dpp_stat_cara_max_pkt_size_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_max_pkt_size) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_MAX_PKT_SIZE_A_T car_max_pkt_size = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_max_pkt_size); + + rc = dpp_reg_read(dev, + STAT_CAR0_MAX_PKT_SIZE_Ar , + 0, + 0, + &car_max_pkt_size); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_max_pkt_size = car_max_pkt_size.max_pkt_size_a; + + return rc; +} + +/***********************************************************/ +/** 配置carb的最大包长 +* @param dev_id +* @param max_pkt_size +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author wll @date 2019/06/06 +************************************************************/ +DPP_STATUS dpp_stat_carb_max_pkt_size_set(DPP_DEV_T *dev, + ZXIC_UINT32 max_pkt_size) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_MAX_PKT_SIZE_B_T car_max_pkt_size = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), max_pkt_size, 0, 0x3fff); + + car_max_pkt_size.max_pkt_size_b = max_pkt_size; + + rc = dpp_reg_write(dev, + STAT_CAR0_MAX_PKT_SIZE_Br, + 0, + 0, + &car_max_pkt_size); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return rc; +} + +/***********************************************************/ +/** 获取carb的最大包长 +* @param dev_id +* @param p_max_pkt_size +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author wll @date 2019/06/06 +************************************************************/ +DPP_STATUS dpp_stat_carb_max_pkt_size_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_max_pkt_size) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_MAX_PKT_SIZE_B_T car_max_pkt_size = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_max_pkt_size); + + rc = dpp_reg_read(dev, + STAT_CAR0_MAX_PKT_SIZE_Br, + 0, + 0, + &car_max_pkt_size); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_max_pkt_size = car_max_pkt_size.max_pkt_size_b; + + return rc; +} + +/***********************************************************/ +/** 配置carc的最大包长 +* @param dev_id +* @param max_pkt_size +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author wll @date 2019/06/06 +************************************************************/ +DPP_STATUS dpp_stat_carc_max_pkt_size_set(DPP_DEV_T *dev, + ZXIC_UINT32 max_pkt_size) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_MAX_PKT_SIZE_C_T car_max_pkt_size = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), max_pkt_size, 0, 0x3fff); + + car_max_pkt_size.max_pkt_size_c = max_pkt_size; + + rc = dpp_reg_write(dev, + STAT_CAR0_MAX_PKT_SIZE_Cr , + 0, + 0, + &car_max_pkt_size); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + return rc; +} + +/***********************************************************/ +/** 获取carc的最大包长 +* @param dev_id +* @param p_max_pkt_size +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author wll @date 2019/06/06 +************************************************************/ +DPP_STATUS dpp_stat_carc_max_pkt_size_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_max_pkt_size) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR0_MAX_PKT_SIZE_C_T car_max_pkt_size = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_max_pkt_size); + + rc = dpp_reg_read(dev, + STAT_CAR0_MAX_PKT_SIZE_Cr, + 0, + 0, + &car_max_pkt_size); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_max_pkt_size = car_max_pkt_size.max_pkt_size_c; + + return rc; +} + +#endif + +#if ZXIC_REAL("Advanced Function") +#if 0 +/***********************************************************/ +/** car硬件初始化 +* @param dev_id 设备号 car编号 +* @param car_type car模式,参见STAT_CAR_TYPE_E +* @param car_mono_mode car独占mono模式 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/04/27 +************************************************************/ +DPP_STATUS dpp_stat_car_hardware_init(ZXIC_UINT32 dev_id, + ZXIC_UINT32 car_type, + ZXIC_UINT32 car_mono_mode) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 i = 0; + ZXIC_UINT32 init_done = 0; + + DPP_STAT_CAR_A_QUEUE_CFG_T car_a_queue_cfg = {0}; + DPP_STAT_CAR_B_QUEUE_CFG_T car_b_queue_cfg = {0}; + DPP_STAT_CAR_C_QUEUE_CFG_T car_c_queue_cfg = {0}; + DPP_STAT_CAR_PROFILE_CFG_T car_profile_cfg = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, car_type, STAT_CAR_A_TYPE, STAT_CAR_MAX_TYPE - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, car_mono_mode, CAR_SMMU0_MONO_MODE_NONE, CAR_SMMU0_MONO_MODE_MAX - 1); + + ZXIC_COMM_MEMSET(&car_profile_cfg, 0, sizeof(DPP_STAT_CAR_PROFILE_CFG_T)); + + rc = dpp_se_smmu0_cfg_car_mono_set(dev_id, car_mono_mode); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_se_smmu0_cfg_car_mono_set"); + + switch (car_type) + { + case STAT_CAR_A_TYPE: + { + rc = dpp_stat_cara_init_done_get(dev_id, &init_done); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_stat_cara_init_done_get"); + + if (0 == init_done) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "Error! Get car_a init done fail!\n"); + return DPP_RC_CAR_INIT_FAIL; + } + + ZXIC_COMM_MEMSET(&car_a_queue_cfg, 0, sizeof(DPP_STAT_CAR_A_QUEUE_CFG_T)); + + /** 清空queue的配置 和绑定队列号配置 稍后补全 */ + for (i = 0; i <= DPP_CAR_A_FLOW_ID_MAX; i++) + { + rc = dpp_stat_cara_queue_cfg_set(dev_id, + i, + 0, + 0, + 0); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_stat_cara_queue_cfg_set"); + } + + /** 清空profile的配置 */ + for (i = 0; i <= DPP_CAR_A_PROFILE_ID_MAX; i++) + { + rc = dpp_stat_cara_profile_cfg_set(dev_id, + i, + &car_profile_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_stat_cara_profile_cfg_set"); + } + } + break; + + case STAT_CAR_B_TYPE: + { + rc = dpp_stat_carb_init_done_get(dev_id, &init_done); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_stat_carb_init_done_get"); + + if (0 == init_done) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "Error! Get car_b init done fail!\n"); + return DPP_RC_CAR_INIT_FAIL; + } + + ZXIC_COMM_MEMSET(&car_b_queue_cfg, 0, sizeof(DPP_STAT_CAR_B_QUEUE_CFG_T)); + + /** 清空queue的配置 和绑定队列号配置 稍后补全 */ + + for (i = 0; i <= DPP_CAR_B_FLOW_ID_MAX; i++) + { + rc = dpp_stat_carb_queue_cfg_set(dev_id, + i, + 0, + 0, + 0); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_stat_cara_queue_cfg_set"); + } + + /** 清空profile的配置 */ + for (i = 0; i <= DPP_CAR_B_PROFILE_ID_MAX; i++) + { + rc = dpp_stat_carb_profile_cfg_set(dev_id, + i, + &car_profile_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_stat_carb_profile_cfg_set"); + } + } + break; + + case STAT_CAR_C_TYPE: + { + rc = dpp_stat_carc_init_done_get(dev_id, + &init_done); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_stat_carc_init_done_get"); + + if (0 == init_done) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "Error! Get car_c init done fail!\n"); + return DPP_RC_CAR_INIT_FAIL; + } + + ZXIC_COMM_MEMSET(&car_c_queue_cfg, 0, sizeof(DPP_STAT_CAR_C_QUEUE_CFG_T)); + + /** 清空queue的配置 和绑定队列号配置 稍后补全 */ + + for (i = 0; i <= DPP_CAR_C_FLOW_ID_MAX; i++) + { + rc = dpp_stat_carc_queue_cfg_set(dev_id, + i, + 0, + 0, + 0); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_stat_carc_queue_cfg_set"); + } + + /** 清空profile的配置 */ + for (i = 0; i <= DPP_CAR_C_PROFILE_ID_MAX; i++) + { + rc = dpp_stat_carc_profile_cfg_set(dev_id, + i, + &car_profile_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_stat_carc_profile_cfg_set"); + } + } + break; + + default: + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "car_type[%d] error!\n", car_type); + return DPP_ERR; + } + } + + return rc; +} +#endif +/***********************************************************/ +/** car 模块流配置 +* @param dev_id 设备号 +* @param car_type car模式,参见STAT_CAR_TYPE_E +* @param flow_id 队列号 +* @param drop_flag 丢弃标志 +* @param plcr_en 限速使能 +* @param profile_id 模板编号 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/05/06 +************************************************************/ +DPP_STATUS dpp_stat_car_queue_cfg_set(DPP_DEV_T *dev, + ZXIC_UINT32 car_type, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 drop_flag, + ZXIC_UINT32 plcr_en, + ZXIC_UINT32 profile_id) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 flow_num = 0; + + DPP_CAR_SOFT_RESET_DATA_T *p_restore_data = NULL; /* 软复位相关 */ + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), car_type, STAT_CAR_A_TYPE, STAT_CAR_MAX_TYPE - 1); + + if (STAT_CAR_A_TYPE == car_type) + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_A_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_A_PROFILE_ID_MAX); + } + else if (STAT_CAR_B_TYPE == car_type) + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_B_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_B_PROFILE_ID_MAX); + } + else + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_C_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_C_PROFILE_ID_MAX); + } + + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), drop_flag, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), plcr_en, 0, 1); + + p_restore_data = GET_DPP_CAR_SOFT_RESET_INFO(DEV_ID(dev)); /* 软复位相关 */ + + switch (car_type) + { + case STAT_CAR_A_TYPE: + { + rc = dpp_stat_cara_queue_cfg_set(dev, + flow_id, + drop_flag, + plcr_en, + profile_id); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_cara_queue_cfg_set"); + + /* 软复位相关 */ + flow_num = p_restore_data->cara_flow_num; + p_restore_data->cara_item[flow_num].flow_id = flow_id; + p_restore_data->cara_item[flow_num].profile_id = profile_id; + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW(DEV_ID(dev), p_restore_data->cara_flow_num, 1); + p_restore_data->cara_flow_num++; + } + break; + + case STAT_CAR_B_TYPE: + { + rc = dpp_stat_carb_queue_cfg_set(dev, + flow_id, + drop_flag, + plcr_en, + profile_id); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_carb_queue_cfg_set"); + + /* 软复位相关 */ + flow_num = p_restore_data->carb_flow_num; + p_restore_data->carb_item[flow_num].flow_id = flow_id; + p_restore_data->carb_item[flow_num].profile_id = profile_id; + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW(DEV_ID(dev), p_restore_data->carb_flow_num, 1); + p_restore_data->carb_flow_num++; + } + break; + + case STAT_CAR_C_TYPE: + { + rc = dpp_stat_carc_queue_cfg_set(dev, + flow_id, + drop_flag, + plcr_en, + profile_id); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_carc_queue_cfg_set"); + + /* 软复位相关 */ + flow_num = p_restore_data->carc_flow_num; + p_restore_data->carc_item[flow_num].flow_id = flow_id; + p_restore_data->carc_item[flow_num].profile_id = profile_id; + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(DEV_ID(dev), p_restore_data->carc_flow_num, 1); + p_restore_data->carc_flow_num++; + } + break; + } + + return rc; +} + +/***********************************************************/ +/**队列设置参数获取 +* @param dev_id 设备号 car编号 +* @param car_type car模式,参见STAT_CAR_TYPE_E +* @param pkt_sign 限速标志,1-包限速,0-字节限速 +* @param flow_id 队列号 +* @param p_data 获取队列配置信息 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/09/27 +************************************************************/ +DPP_STATUS dpp_stat_car_queue_get(DPP_DEV_T *dev, + ZXIC_UINT32 car_type, + ZXIC_UINT32 pkt_sign, + ZXIC_UINT32 flow_id, + ZXIC_VOID *p_data) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), car_type, STAT_CAR_A_TYPE, STAT_CAR_MAX_TYPE - 1); + + if (STAT_CAR_A_TYPE == car_type) + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), pkt_sign, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_A_FLOW_ID_MAX); + } + else if (STAT_CAR_B_TYPE == car_type) + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_B_FLOW_ID_MAX); + } + else + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_C_FLOW_ID_MAX); + } + + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data); + + switch (car_type) + { + case STAT_CAR_A_TYPE: + { + if (0 == pkt_sign) + { + rc = dpp_stat_cara_queue_cfg_get(dev, + flow_id, + (DPP_STAT_CAR_A_QUEUE_CFG_T *)p_data); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_cara_queue_cfg_get"); + } + else + { + rc = dpp_stat_cara_pkt_queue_cfg_get(dev, + flow_id, + (DPP_STAT_CAR_A_PKT_QUEUE_CFG_T *) p_data); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_cara_pkt_queue_cfg_get"); + } + + } + break; + + case STAT_CAR_B_TYPE: + { + rc = dpp_stat_carb_queue_cfg_get(dev, + flow_id, + (DPP_STAT_CAR_B_QUEUE_CFG_T *)p_data); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_carb_queue_cfg_get"); + } + break; + + case STAT_CAR_C_TYPE: + { + rc = dpp_stat_carc_queue_cfg_get(dev, + flow_id, + (DPP_STAT_CAR_C_QUEUE_CFG_T *)p_data); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_carc_queue_cfg_get"); + } + break; + } + + return rc; +} + +/***********************************************************/ +/** car 模块流配置获取 +* @param dev_id 设备号 +* @param car_type car模式,参见STAT_CAR_TYPE_E +* @param flow_id 队列号 +* @param p_drop_flag drop标记 +* @param p_plcr_en 监管使能信号 +* @param p_profile_id 模板id +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/08/19 +************************************************************/ +DPP_STATUS dpp_stat_car_queue_cfg_get(DPP_DEV_T *dev, + ZXIC_UINT32 car_type, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 *p_drop_flag, + ZXIC_UINT32 *p_plcr_en, + ZXIC_UINT32 *p_profile_id) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR_A_QUEUE_CFG_T car_a_queue_cfg = {0}; + DPP_STAT_CAR_B_QUEUE_CFG_T car_b_queue_cfg = {0}; + DPP_STAT_CAR_C_QUEUE_CFG_T car_c_queue_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), car_type, STAT_CAR_A_TYPE, STAT_CAR_MAX_TYPE - 1); + + if (STAT_CAR_A_TYPE == car_type) + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_A_FLOW_ID_MAX); + } + else if (STAT_CAR_B_TYPE == car_type) + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_B_FLOW_ID_MAX); + } + else + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_C_FLOW_ID_MAX); + } + + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_drop_flag); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_plcr_en); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_profile_id); + + switch (car_type) + { + case STAT_CAR_A_TYPE: + { + rc = dpp_stat_cara_queue_cfg_get(dev, + flow_id, + &car_a_queue_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_cara_queue_cfg_get"); + + *p_profile_id = car_a_queue_cfg.profile_id; + *p_plcr_en = car_a_queue_cfg.plcr_en; + *p_drop_flag = car_a_queue_cfg.drop_flag; + } + break; + + case STAT_CAR_B_TYPE: + { + rc = dpp_stat_carb_queue_cfg_get(dev, + flow_id, + &car_b_queue_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_carb_queue_cfg_get"); + + *p_profile_id = car_b_queue_cfg.profile_id; + *p_plcr_en = car_b_queue_cfg.plcr_en; + *p_drop_flag = car_b_queue_cfg.drop_flag; + } + break; + + case STAT_CAR_C_TYPE: + { + rc = dpp_stat_carc_queue_cfg_get(dev, + flow_id, + &car_c_queue_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_carc_queue_cfg_get"); + + *p_profile_id = car_c_queue_cfg.profile_id; + *p_plcr_en = car_c_queue_cfg.plcr_en; + *p_drop_flag = car_c_queue_cfg.drop_flag; + } + break; + } + + return rc; +} + +/***********************************************************/ +/** car profile硬件写入 +* @param dev_id 设备号 car编号 +* @param car_type car模式,参见STAT_CAR_TYPE_E +* @param pkt_sign 限速模式,1-包限速,0-字节限速 +* @param profile_id 模板号 +* @param p_car_profile_cfg 模板配置信息 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/05/06 +************************************************************/ +DPP_STATUS dpp_stat_car_profile_cfg_set(DPP_DEV_T *dev, + ZXIC_UINT32 car_type, + ZXIC_UINT32 pkt_sign, + ZXIC_UINT32 profile_id, + ZXIC_VOID *p_car_profile_cfg) +{ + DPP_STATUS rc = DPP_OK; + + DPP_CAR_SOFT_RESET_DATA_T *p_restore_data = NULL; /* 软复位相关 */ + DPP_STAT_CAR_PROFILE_CFG_T *p_stat_car_profile_cfg = NULL; + DPP_STAT_CAR_PKT_PROFILE_CFG_T *p_stat_pkt_car_profile_cfg = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), car_type, STAT_CAR_A_TYPE, STAT_CAR_MAX_TYPE - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), pkt_sign, 0, 1); + + if (STAT_CAR_A_TYPE == car_type) + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_A_PROFILE_ID_MAX); + } + else if (STAT_CAR_B_TYPE == car_type) + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_B_PROFILE_ID_MAX); + } + else + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_C_PROFILE_ID_MAX); + } + + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_car_profile_cfg); + + p_restore_data = GET_DPP_CAR_SOFT_RESET_INFO(DEV_ID(dev)); /* 软复位相关 */ + + if ((STAT_CAR_A_TYPE == car_type) && (1 == pkt_sign)) + { + p_stat_pkt_car_profile_cfg = (DPP_STAT_CAR_PKT_PROFILE_CFG_T *)p_car_profile_cfg; + + rc = dpp_stat_cara_pkt_profile_cfg_set(dev, + profile_id, + p_stat_pkt_car_profile_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_cara_pkt_profile_cfg_set"); + + /* 软复位相关 */ + p_restore_data->car_pkt_sign[profile_id] = ZXIC_TRUE; + + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(DEV_ID(dev), p_restore_data->car0_pkt_num, 1); + p_restore_data->car0_pkt_num++; + } + else + { + p_stat_car_profile_cfg = (DPP_STAT_CAR_PROFILE_CFG_T *)p_car_profile_cfg; + ZXIC_COMM_TRACE_DEV_INFO(DEV_ID(dev), "==> dpp_stat_car_profile_cfg_set : \n"); + ZXIC_COMM_TRACE_DEV_INFO(DEV_ID(dev), "| %-10s | %-10s | %-10s | %-10s | \n", "profile_id", "car_id", "car_type", "pkt_sign"); + ZXIC_COMM_TRACE_DEV_INFO(DEV_ID(dev), "| %-10d | %-10d | %-10d | 0x%-8x | \n", profile_id, 0, car_type, pkt_sign); + ZXIC_COMM_TRACE_DEV_INFO(DEV_ID(dev), "| ------------------------------------------------- | \n"); + ZXIC_COMM_TRACE_DEV_INFO(DEV_ID(dev), "| %-5s | %-5s | %-5s | %-10s | %-10s | %-10s | %-10s | \n", "cd", "cf", "cm", "cir", "cbs", "eir", "ebs"); + ZXIC_COMM_TRACE_DEV_INFO(DEV_ID(dev), "| %-5d | %-5d | %-5d | %-10d | %-10d | %-10d | %-10d | \n", p_stat_car_profile_cfg->cd, + p_stat_car_profile_cfg->cf, + p_stat_car_profile_cfg->cm, + p_stat_car_profile_cfg->cir, + p_stat_car_profile_cfg->cbs, + p_stat_car_profile_cfg->eir, + p_stat_car_profile_cfg->ebs); + + if (STAT_CAR_A_TYPE == car_type) + { + rc = dpp_stat_cara_profile_cfg_set(dev, + profile_id, + p_stat_car_profile_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_cara_profile_cfg_set"); + + /* 软复位相关 */ + if (ZXIC_TRUE == p_restore_data->car_pkt_sign[profile_id]) + { + p_restore_data->car0_pkt_num--; + p_restore_data->car_pkt_sign[profile_id] = ZXIC_FALSE; + } + } + else if (STAT_CAR_B_TYPE == car_type) + { + rc = dpp_stat_carb_profile_cfg_set(dev, + profile_id, + p_stat_car_profile_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_carb_profile_cfg_set"); + } + else + { + rc = dpp_stat_carc_profile_cfg_set(dev, + profile_id, + p_stat_car_profile_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_carc_profile_cfg_set"); + } + } + + return rc; + +} + +/***********************************************************/ +/**获取监管模板配置 +* @param dev_id 设备号 +* @param car_type car模式类型,参见STAT_CAR_TYPE_E +* @param pkt_sign 限速模式,1-包限速,0-字节限速 +* @param profile_id 监管模板id +* @param p_car_profile_cfg 模板配置信息 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/08/29 +************************************************************/ +DPP_STATUS dpp_stat_car_profile_cfg_get(DPP_DEV_T *dev, + ZXIC_UINT32 car_type, + ZXIC_UINT32 pkt_sign, + ZXIC_UINT32 profile_id, + ZXIC_VOID *p_car_profile_cfg) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_CAR_PROFILE_CFG_T *p_stat_car_profile_cfg = NULL; + DPP_STAT_CAR_PKT_PROFILE_CFG_T *p_stat_pkt_car_profile_cfg = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), car_type, STAT_CAR_A_TYPE, STAT_CAR_MAX_TYPE - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), pkt_sign, 0, 1); + + if (STAT_CAR_A_TYPE == car_type) + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_A_PROFILE_ID_MAX); + } + else if (STAT_CAR_B_TYPE == car_type) + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_B_PROFILE_ID_MAX); + } + else + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_C_PROFILE_ID_MAX); + } + + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_car_profile_cfg); + + if ((STAT_CAR_A_TYPE == car_type) && (1 == pkt_sign)) + { + p_stat_pkt_car_profile_cfg = (DPP_STAT_CAR_PKT_PROFILE_CFG_T *)p_car_profile_cfg; + rc = dpp_stat_cara_pkt_profile_cfg_get(dev, + profile_id, + p_stat_pkt_car_profile_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_cara_pkt_profile_cfg_get"); + } + else + { + p_stat_car_profile_cfg = (DPP_STAT_CAR_PROFILE_CFG_T *)p_car_profile_cfg; + + if (STAT_CAR_A_TYPE == car_type) + { + rc = dpp_stat_cara_profile_cfg_get(dev, + profile_id, + p_stat_car_profile_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_cara_profile_cfg_get"); + } + else if (STAT_CAR_B_TYPE == car_type) + { + rc = dpp_stat_carb_profile_cfg_get(dev, + profile_id, + p_stat_car_profile_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_carb_profile_cfg_get"); + } + else + { + rc = dpp_stat_carc_profile_cfg_get(dev, + profile_id, + p_stat_car_profile_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_carc_profile_cfg_get"); + } + } + + return rc; +} + +/***********************************************************/ +/** car 队列映射关系配置 +* @param dev_id 设备号 +* @param car_type car模式类型,参见STAT_CAR_TYPE_E +* @param flow_id 队列号 +* @param map_flow_id 映射队列号 +* @param map_sp 映射sp +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/09/27 +************************************************************/ +DPP_STATUS dpp_stat_car_queue_map_set(DPP_DEV_T *dev, + ZXIC_UINT32 car_type, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 map_flow_id, + ZXIC_UINT32 map_sp) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), car_type, STAT_CAR_A_TYPE, STAT_CAR_B_TYPE); + + if (STAT_CAR_A_TYPE == car_type) + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_A_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), map_flow_id, 0, DPP_CAR_B_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), map_sp, DPP_CAR_PRI0, DPP_CAR_PRI_MAX - 1); + rc = dpp_stat_cara_queue_map_set(dev, + flow_id, + map_flow_id, + map_sp); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_cara_queue_map_set"); + } + else + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_B_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), map_flow_id, 0, DPP_CAR_C_FLOW_ID_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), map_sp, DPP_CAR_PRI0, DPP_CAR_PRI_MAX - 1); + rc = dpp_stat_carb_queue_map_set(dev, + flow_id, + map_flow_id, + map_sp); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_carb_queue_map_set"); + } + + return rc; +} + +/***********************************************************/ +/** 获取 car 流号的绑定关系 +* @param dev_id 设备号 +* @param car_type car模式类型,参见STAT_CAR_TYPE_E +* @param flow_id 队列号 +* @param p_map_flow_id 映射队列号 +* @param p_map_sp 映射sp +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/09/27 +************************************************************/ +DPP_STATUS dpp_stat_car_queue_map_get(DPP_DEV_T *dev, + ZXIC_UINT32 car_type, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 *p_map_flow_id, + ZXIC_UINT32 *p_map_sp) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), car_type, STAT_CAR_A_TYPE, STAT_CAR_B_TYPE); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_map_flow_id); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_map_sp); + + if (STAT_CAR_A_TYPE == car_type) + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_A_FLOW_ID_MAX); + rc = dpp_stat_cara_queue_map_get(dev, + flow_id, + p_map_flow_id, + p_map_sp); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_cara_queue_map_get"); + } + else + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flow_id, 0, DPP_CAR_B_FLOW_ID_MAX); + rc = dpp_stat_carb_queue_map_get(dev, + flow_id, + p_map_flow_id, + p_map_sp); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_carb_queue_map_get"); + } + + return rc; +} + +/***********************************************************/ +/** +* @param dev_id 设备ID +* @param profile_id 模板ID +* @param p_random_ram_e E桶概率丢弃配置参数 +* @param p_random_ram_c C桶概率丢弃配置参数 +* +* @return +* @remark 无 +* @see +* @author YXH @date 2019/04/01 +************************************************************/ +DPP_STATUS dpp_stat_car_random_ram_set(DPP_DEV_T *dev, + ZXIC_UINT32 car_type, + ZXIC_UINT32 profile_id, + DPP_CAR_RANDOM_RAM_T *p_random_ram_e, + DPP_CAR_RANDOM_RAM_T *p_random_ram_c) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), car_type, STAT_CAR_B_TYPE, STAT_CAR_C_TYPE); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_random_ram_e); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_random_ram_c); + + if (STAT_CAR_B_TYPE == car_type) + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_B_PROFILE_ID_RANDOM_MAX); + rc = dpp_stat_carb_random_ram_set(dev, + profile_id, + p_random_ram_e, + p_random_ram_c); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_carb_random_ram_set"); + } + else + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_C_PROFILE_ID_RANDOM_MAX); + rc = dpp_stat_carc_random_ram_set(dev, + profile_id, + p_random_ram_e, + p_random_ram_c); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_carc_random_ram_set"); + } + + return rc; +} + +/***********************************************************/ +/** +* @param dev_id 设备ID +* @param profile_id 模板ID +* @param p_random_ram_e E桶概率丢弃配置参数 +* @param p_random_ram_c C桶概率丢弃配置参数 +* +* @return +* @remark 无 +* @see +* @author YXH @date 2019/04/01 +************************************************************/ +DPP_STATUS dpp_stat_car_random_ram_get(DPP_DEV_T *dev, + ZXIC_UINT32 car_type, + ZXIC_UINT32 profile_id, + DPP_CAR_RANDOM_RAM_T *p_random_ram_e, + DPP_CAR_RANDOM_RAM_T *p_random_ram_c) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), car_type, STAT_CAR_B_TYPE, STAT_CAR_C_TYPE); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_random_ram_e); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_random_ram_c); + + if (STAT_CAR_B_TYPE == car_type) + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_B_PROFILE_ID_RANDOM_MAX); + rc = dpp_stat_carb_random_ram_get(dev, + profile_id, + p_random_ram_e, + p_random_ram_c); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_carb_random_ram_get"); + } + else + { + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), profile_id, 0, DPP_CAR_C_PROFILE_ID_RANDOM_MAX); + rc = dpp_stat_carc_random_ram_get(dev, + profile_id, + p_random_ram_e, + p_random_ram_c); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_carc_random_ram_get"); + } + + return rc; +} + +#if 0 +/***********************************************************/ +/**car模块dbg计数模式设置 +* @param dev_id 设备号 +* @param car_type car模式类型,参见STAT_CAR_TYPE_E +* @param overflow_mode 溢出模式,0-计数最大保持,1-计数最大翻转 +* @param rd_mode 读取模式,0-不读清,1-读清模式 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/09/27 +************************************************************/ +DPP_STATUS dpp_stat_car_dbg_cnt_mode_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 car_type, + ZXIC_UINT32 overflow_mode, + ZXIC_UINT32 rd_mode) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, car_type, STAT_CAR_A_TYPE, STAT_CAR_MAX_TYPE - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, overflow_mode, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, rd_mode, 0, 1); + + switch (car_type) + { + case STAT_CAR_A_TYPE: + { + rc = dpp_stat_cara_dbg_cnt_mode_set(dev_id, + overflow_mode, + rd_mode); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_stat_cara_dbg_cnt_mode_set"); + } + break; + + case STAT_CAR_B_TYPE: + { + rc = dpp_stat_carb_dbg_cnt_mode_set(dev_id, + overflow_mode, + rd_mode); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_stat_carb_dbg_cnt_mode_set"); + } + break; + + case STAT_CAR_C_TYPE: + { + rc = dpp_stat_carc_dbg_cnt_mode_set(dev_id, + overflow_mode, + rd_mode); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_stat_carc_dbg_cnt_mode_set"); + } + break; + } + + return rc; +} + +/***********************************************************/ +/**car模块dbg计数模式获取 +* @param dev_id 设备号 +* @param car_type car模式类型,参见STAT_CAR_TYPE_E +* @param p_overflow_mode 溢出模式,0-计数最大保持,1-计数最大翻转 +* @param p_rd_mode 读取模式,0-不读清,1-读清模式 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/09/27 +************************************************************/ +DPP_STATUS dpp_stat_car_dbg_cnt_mode_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 car_type, + ZXIC_UINT32 *p_overflow_mode, + ZXIC_UINT32 *p_rd_mode) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, car_type, STAT_CAR_A_TYPE, STAT_CAR_MAX_TYPE - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_overflow_mode); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_rd_mode); + + switch (car_type) + { + case STAT_CAR_A_TYPE: + { + rc = dpp_stat_cara_dbg_cnt_mode_get(dev_id, + p_overflow_mode, + p_rd_mode); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_stat_cara_dbg_cnt_mode_get"); + } + break; + + case STAT_CAR_B_TYPE: + { + rc = dpp_stat_carb_dbg_cnt_mode_get(dev_id, + p_overflow_mode, + p_rd_mode); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_stat_carb_dbg_cnt_mode_get"); + } + break; + + case STAT_CAR_C_TYPE: + { + rc = dpp_stat_carc_dbg_cnt_mode_get(dev_id, + p_overflow_mode, + p_rd_mode); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_stat_carc_dbg_cnt_mode_get"); + } + break; + } + + return rc; +} + +/***********************************************************/ +/** car 模块调试计数 获取 +* @param dev_id 设备号 +* @param car_type car模式类型,参见STAT_CAR_TYPE_E +* @param p_car_dbg_cnt dbg计数信息 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/09/27 +************************************************************/ +DPP_STATUS dpp_stat_car_dbg_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 car_type, + DPP_STAT_CAR_DBG_CNT_T *p_car_dbg_cnt) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, car_type, STAT_CAR_A_TYPE, STAT_CAR_MAX_TYPE - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_car_dbg_cnt); + + switch (car_type) + { + case STAT_CAR_A_TYPE: + { + rc = dpp_stat_cara_dbg_cnt_get(dev_id, + p_car_dbg_cnt); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_stat_cara_dbg_cnt_get"); + } + break; + + case STAT_CAR_B_TYPE: + { + rc = dpp_stat_carb_dbg_cnt_get(dev_id, + p_car_dbg_cnt); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_stat_carb_dbg_cnt_get"); + } + break; + + case STAT_CAR_C_TYPE: + { + rc = dpp_stat_carc_dbg_cnt_get(dev_id, + p_car_dbg_cnt); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_stat_carc_dbg_cnt_get"); + } + break; + } + + return rc; +} +#endif +/***********************************************************/ +/** 获取最大包长 +* @param dev_id +* @param car_type +* @param p_max_pkt_len +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author wll @date 2019/06/06 +************************************************************/ +DPP_STATUS dpp_stat_car_max_pkt_size_get(DPP_DEV_T *dev, + ZXIC_UINT32 car_type, + ZXIC_UINT32 *p_max_pkt_len) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 pkt_len = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), car_type, STAT_CAR_A_TYPE, STAT_CAR_MAX_TYPE - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_max_pkt_len); + + switch (car_type) + { + case STAT_CAR_A_TYPE: + { + rc = dpp_stat_cara_max_pkt_size_get(dev, + &pkt_len); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_cara_max_pkt_size_get"); + } + break; + + case STAT_CAR_B_TYPE: + { + rc = dpp_stat_carb_max_pkt_size_get(dev, + &pkt_len); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_carb_max_pkt_size_get"); + } + break; + + case STAT_CAR_C_TYPE: + { + rc = dpp_stat_carc_max_pkt_size_get(dev, + &pkt_len); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_carc_max_pkt_size_get"); + } + break; + } + + *p_max_pkt_len = pkt_len; + + return rc; +} + +/***********************************************************/ +/** 配置最大包长 +* @param dev_id +* @param car_type +* @param max_pkt_size +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author wll @date 2019/06/06 +************************************************************/ +DPP_STATUS dpp_stat_car_max_pkt_size_set(DPP_DEV_T *dev, + ZXIC_UINT32 car_type, + ZXIC_UINT32 max_pkt_size) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), car_type, STAT_CAR_A_TYPE, STAT_CAR_MAX_TYPE - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), max_pkt_size, 0, 0x3fff); + + switch (car_type) + { + case STAT_CAR_A_TYPE: + { + rc = dpp_stat_cara_max_pkt_size_set(dev, + max_pkt_size); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_cara_max_pkt_size_set"); + } + break; + + case STAT_CAR_B_TYPE: + { + rc = dpp_stat_carb_max_pkt_size_set(dev, + max_pkt_size); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_carb_max_pkt_size_set"); + } + break; + + case STAT_CAR_C_TYPE: + { + rc = dpp_stat_carc_max_pkt_size_set(dev, + max_pkt_size); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_carc_max_pkt_size_set"); + } + break; + } + + return rc; +} + + +/***********************************************************/ +/** STAT CAR复位获取全局变量大小函数 +* @param dev_id +* @param p_size +* +* @return +* @remark 无 +* @see +* @author yxh @date 2018/06/26 +************************************************************/ +DPP_STATUS dpp_stat_car_glb_size_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_size) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 queue_num = 0; + ZXIC_UINT32 profile_num = 0; + ZXIC_UINT32 pkt_profile_num = 0; + + DPP_CAR_SOFT_RESET_DATA_T *p_g_restore_data = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_size); + + p_g_restore_data = GET_DPP_CAR_SOFT_RESET_INFO(DEV_ID(dev)); + + if (0 == p_g_restore_data->is_init) + { + ZXIC_COMM_PRINT("Not init!!!\n"); + *p_size = sizeof(ZXIC_UINT32); + } + else + { + /* CAR A */ + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(DEV_ID(dev), queue_num, p_g_restore_data->cara_flow_num); + queue_num += p_g_restore_data->cara_flow_num; + + /* CAR B */ + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(DEV_ID(dev), queue_num, p_g_restore_data->carb_flow_num); + queue_num += p_g_restore_data->carb_flow_num; + + /* CAR C */ + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(DEV_ID(dev), queue_num, p_g_restore_data->carc_flow_num); + queue_num += p_g_restore_data->carc_flow_num; + + pkt_profile_num = p_g_restore_data->car0_pkt_num; + ZXIC_COMM_CHECK_DEV_INDEX_SUB_OVERFLOW_NO_ASSERT(DEV_ID(dev), (DPP_CAR_A_PROFILE_ID_MAX + DPP_CAR_B_PROFILE_ID_MAX + DPP_CAR_C_PROFILE_ID_MAX + 3), pkt_profile_num); + profile_num = DPP_CAR_A_PROFILE_ID_MAX + DPP_CAR_B_PROFILE_ID_MAX + DPP_CAR_C_PROFILE_ID_MAX + 3 - pkt_profile_num; + /**占用的格式如下: + (ZXIC_UINT32) (ZXIC_UINT32) (ZXIC_UINT32)(CAR0) (ZXIC_UINT32)(CAR1) (ZXIC_UINT32) + is_init queue_num queue_info pkt_profile_num pkt_profile_num pkt_profile_cfg profile_num profile_cfg + */ + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(DEV_ID(dev), queue_num, ((ZXIC_UINT32)ZXIC_SIZEOF(DPP_CAR_SOFT_RESET_QUEUE_T))); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(DEV_ID(dev), pkt_profile_num, ((ZXIC_UINT32)ZXIC_SIZEOF(DPP_STAT_CAR_PKT_PROFILE_CFG_T))); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(DEV_ID(dev), profile_num, ((ZXIC_UINT32)ZXIC_SIZEOF(DPP_STAT_CAR_PROFILE_CFG_T))); + *p_size = ((ZXIC_UINT32)ZXIC_SIZEOF(ZXIC_UINT32)) * 5 + queue_num * ((ZXIC_UINT32)ZXIC_SIZEOF(DPP_CAR_SOFT_RESET_QUEUE_T)) + + pkt_profile_num * ((ZXIC_UINT32)ZXIC_SIZEOF(DPP_STAT_CAR_PKT_PROFILE_CFG_T)) + + profile_num * ((ZXIC_UINT32)ZXIC_SIZEOF(DPP_STAT_CAR_PROFILE_CFG_T)); + ZXIC_COMM_PRINT("glb_size = %d!!!\n", *p_size); + } + + return rc; +} + +#if 0 +/***********************************************************/ +/** STAT CAR复位设置全局变量函数 +* @param dev_id 设备号 +* @param size 大小,字节数 +* @param p_data_buff 全局变量数据 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author yxh @date 2018/06/26 +************************************************************/ +DPP_STATUS dpp_stat_car_glb_mgr_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 size, ZXIC_UINT8 *p_data_buff) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + ZXIC_UINT32 is_init = 0; + ZXIC_UINT32 queue_num = 0; + ZXIC_UINT32 profile_num = 0; + ZXIC_UINT32 cara_profile_num = 0; + ZXIC_UINT32 car0_pkt_profile_num = 0; + ZXIC_UINT32 buff_offset = 0; + ZXIC_UINT32 size_of_stat_car = 0; + + DPP_CAR_SOFT_RESET_QUEUE_T *p_car_glb_queue_info = NULL; + DPP_STAT_CAR_PROFILE_CFG_T *p_car_glb_profile_info = NULL; + DPP_STAT_CAR_PKT_PROFILE_CFG_T *p_car_glb_pkt_profile_info = NULL; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_data_buff); + + rc = dpp_stat_car_glb_size_get(dev_id, &size_of_stat_car); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_stat_car_glb_size_get"); + + if (size < size_of_stat_car) + { + ZXIC_COMM_TRACE_ERROR("dpp stat car glb mgr recovery, size of buffer is smaller than defaultss\n"); + return DPP_ERR; + } + + ZXIC_COMM_MEMCPY(&is_init, p_data_buff, size); + buff_offset = sizeof(ZXIC_UINT32); + + if (0 == is_init) + { + ZXIC_COMM_PRINT("Not init!!!\n"); + } + else + { + /* 获取queue的数目 */ + ZXIC_COMM_MEMCPY(&queue_num, p_data_buff + buff_offset, sizeof(ZXIC_UINT32)); + buff_offset += sizeof(ZXIC_UINT32); + p_car_glb_queue_info = (DPP_CAR_SOFT_RESET_QUEUE_T *)(p_data_buff + buff_offset); + + /* 设置flow_id的信息 */ + for (i = 0; i < queue_num; i++) + { + rc = dpp_stat_car_queue_cfg_set(dev_id, + p_car_glb_queue_info->car_type, + p_car_glb_queue_info->flow_id, + p_car_glb_queue_info->drop_flag, + p_car_glb_queue_info->plcr_en, + p_car_glb_queue_info->profile_id); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_stat_car_queue_cfg_set"); + } + + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(dev_id, buff_offset, queue_num * ZXIC_SIZEOF(DPP_CAR_SOFT_RESET_QUEUE_T)); + buff_offset += (queue_num * ZXIC_SIZEOF(DPP_CAR_SOFT_RESET_QUEUE_T)) & 0xffffffff; + + ZXIC_COMM_MEMCPY(&car0_pkt_profile_num, p_data_buff + buff_offset, sizeof(ZXIC_UINT32)); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(dev_id, buff_offset, sizeof(ZXIC_UINT32)); + buff_offset += sizeof(ZXIC_UINT32); + + /* 设置pkt_frofile的信息 */ + p_car_glb_pkt_profile_info = (DPP_STAT_CAR_PKT_PROFILE_CFG_T *)(p_data_buff + buff_offset); + + for (i = 0; i < car0_pkt_profile_num; i++) + { + rc = dpp_stat_car_profile_cfg_set(dev_id, + STAT_CAR_A_TYPE, + ZXIC_TRUE, + p_car_glb_pkt_profile_info->profile_id, + p_car_glb_pkt_profile_info); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_stat_car_profile_cfg_set"); + p_car_glb_pkt_profile_info++; + } + + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(dev_id, buff_offset, car0_pkt_profile_num * ZXIC_SIZEOF(DPP_STAT_CAR_PKT_PROFILE_CFG_T)); + buff_offset += (car0_pkt_profile_num * ZXIC_SIZEOF(DPP_STAT_CAR_PKT_PROFILE_CFG_T)) & 0xffffffff; + + ZXIC_COMM_MEMCPY(&profile_num, p_data_buff + buff_offset, sizeof(ZXIC_UINT32)); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(dev_id, buff_offset, sizeof(ZXIC_UINT32)); + buff_offset += sizeof(ZXIC_UINT32); + + /* 设置profile的信息 */ + p_car_glb_profile_info = (DPP_STAT_CAR_PROFILE_CFG_T *)(p_data_buff + buff_offset); + + cara_profile_num = DPP_CAR_PKT_PROFILE_ID_MAX - car0_pkt_profile_num; + + ZXIC_COMM_PRINT(">>>>>>>>>>> Set CAR_A_PROFILE info start!\n"); + + for (j = 0; j < cara_profile_num; j++) + { + rc = dpp_stat_car_profile_cfg_set(dev_id, + STAT_CAR_A_TYPE, + ZXIC_FALSE, + p_car_glb_profile_info->profile_id, + p_car_glb_profile_info); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_stat_car_profile_cfg_set"); + p_car_glb_profile_info++; + } + + ZXIC_COMM_PRINT(">>>>>>>>>>> Set car CAR_B_PROFILE info start!\n"); + + for (j = 0; j <= DPP_CAR_B_PROFILE_ID_MAX; j++) + { + rc = dpp_stat_car_profile_cfg_set(dev_id, + STAT_CAR_B_TYPE, + ZXIC_FALSE, + p_car_glb_profile_info->profile_id, + p_car_glb_profile_info); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_stat_car_profile_cfg_set"); + p_car_glb_profile_info++; + } + + ZXIC_COMM_PRINT(">>>>>>>>>>> Set car CAR_C_PROFILE info start!\n"); + + for (j = 0; j <= DPP_CAR_C_PROFILE_ID_MAX; j++) + { + rc = dpp_stat_car_profile_cfg_set(dev_id, + STAT_CAR_C_TYPE, + ZXIC_FALSE, + p_car_glb_profile_info->profile_id, + p_car_glb_profile_info); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_stat_car_profile_cfg_set"); + p_car_glb_profile_info++; + } + + }/* end (1 == is_init) */ + + return rc; +} + +/***********************************************************/ +/** STAT CAR复位获取全局变量函数 +* @param dev_id 设备号 +* @param p_flag 释放使能,1-需要手动free,0-不需要手动free +* @param p_size 数据大小 +* @param pp_data_buff 全局变量数据 +* +* @return NPE_OK-成功,NPE_ERR-失败 +* @remark 无 +* @see +* @author yxh @date 2018/06/26 +************************************************************/ +DPP_STATUS dpp_stat_car_glb_mgr_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_flag, + ZXIC_UINT32 *p_size, + ZXIC_UINT8 **pp_data_buff) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 j = 0; + ZXIC_UINT32 is_init = 0; + ZXIC_UINT32 flow_num = 0; + ZXIC_UINT32 flow_num_total = 0; + ZXIC_UINT32 plcr_en = 0; + ZXIC_UINT32 drop_flag = 0; + ZXIC_UINT32 profile_id = 0; + ZXIC_UINT32 profile_num_total = 0; + ZXIC_UINT32 profile_pkt_total = 0; + ZXIC_UINT32 buff_offset = 0; + ZXIC_UINT32 size = 0; + DPP_CAR_SOFT_RESET_DATA_T *p_g_restore_data = NULL; + DPP_CAR_SOFT_RESET_QUEUE_T *p_car_glb_queue_info = NULL; + DPP_CAR_SOFT_RESET_QUEUE_T *p_car_glb_queue_info_temp = NULL; + DPP_STAT_CAR_PROFILE_CFG_T *p_car_glb_profile_info = NULL; + DPP_STAT_CAR_PROFILE_CFG_T *p_car_glb_profile_info_temp = NULL; + DPP_STAT_CAR_PKT_PROFILE_CFG_T *p_car_glb_pkt_profile_info = NULL; + DPP_STAT_CAR_PKT_PROFILE_CFG_T *p_car_glb_pkt_profile_info_temp = NULL; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_size); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_flag); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, pp_data_buff); + + p_g_restore_data = GET_DPP_CAR_SOFT_RESET_INFO(dev_id); + + is_init = p_g_restore_data->is_init; + + if (0 == is_init) + { + *p_size = sizeof(ZXIC_UINT32); + *p_flag = ZXIC_TRUE; + + ZXIC_COMM_PRINT(">>>>>>>>>>>[dpp_stat_car_glb_mgr_get]: No init\n"); + + *pp_data_buff = ZXIC_COMM_MALLOC(*p_size); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, *pp_data_buff); + ZXIC_COMM_MEMSET(*pp_data_buff, 0, *p_size); + + ZXIC_COMM_MEMCPY(*pp_data_buff, &is_init, sizeof(ZXIC_UINT32)); + } + else + { + ZXIC_COMM_PRINT(">>>>>>>>>>>[dpp_stat_car_glb_mgr_get]: Inited\n"); + + /** queue 绑定的信息 */ + /* CAR A */ + flow_num = p_g_restore_data->cara_flow_num; + ZXIC_COMM_TRACE_DEV_INFO(dev_id, "[dpp_stat_car_glb_mgr_get] cara_queue_num : 0x%08x\n", flow_num); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(dev_id, flow_num_total, flow_num); + flow_num_total += flow_num; + + /* CAR B */ + flow_num = p_g_restore_data->carb_flow_num; + ZXIC_COMM_TRACE_DEV_INFO(dev_id, "[dpp_stat_car_glb_mgr_get] carb_queue_num : 0x%08x\n", flow_num); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(dev_id, flow_num_total, flow_num); + flow_num_total += flow_num; + + /* CAR C */ + flow_num = p_g_restore_data->carc_flow_num; + ZXIC_COMM_TRACE_DEV_INFO(dev_id, "[dpp_stat_car_glb_mgr_get] carc_queue_num : 0x%08x\n", flow_num); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(dev_id, flow_num_total, flow_num); + flow_num_total += flow_num; + + profile_pkt_total = p_g_restore_data->car0_pkt_num; + ZXIC_COMM_CHECK_DEV_INDEX_SUB_OVERFLOW_NO_ASSERT(dev_id, DPP_CAR_PROFILE_ID_TOTAL, profile_pkt_total); + profile_num_total = DPP_CAR_PROFILE_ID_TOTAL - profile_pkt_total; + + /**占用的格式如下: + (ZXIC_UINT32) (ZXIC_UINT32) (ZXIC_UINT32)(CAR0) (ZXIC_UINT32)(CAR1) (ZXIC_UINT32) + is_init queue_num queue_info pkt_profile_num pkt_profile_num pkt_profile_cfg profile_num profile_cfg + */ + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, flow_num_total, ((ZXIC_UINT32)ZXIC_SIZEOF(DPP_CAR_SOFT_RESET_QUEUE_T))); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, profile_pkt_total, ((ZXIC_UINT32)ZXIC_SIZEOF(DPP_STAT_CAR_PKT_PROFILE_CFG_T))); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, profile_num_total, ((ZXIC_UINT32)ZXIC_SIZEOF(DPP_STAT_CAR_PROFILE_CFG_T))); + *p_size = ((ZXIC_UINT32)ZXIC_SIZEOF(ZXIC_UINT32)) * 5 + flow_num_total * ((ZXIC_UINT32)ZXIC_SIZEOF(DPP_CAR_SOFT_RESET_QUEUE_T)) + + profile_pkt_total * ((ZXIC_UINT32)ZXIC_SIZEOF(DPP_STAT_CAR_PKT_PROFILE_CFG_T)) + + profile_num_total * ((ZXIC_UINT32)ZXIC_SIZEOF(DPP_STAT_CAR_PROFILE_CFG_T)); + + /* 存放init_flag */ + *pp_data_buff = ZXIC_COMM_MALLOC(*p_size); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, *pp_data_buff); + ZXIC_COMM_MEMSET(*pp_data_buff, 0, *p_size); + ZXIC_COMM_MEMCPY(*pp_data_buff, &is_init, sizeof(ZXIC_UINT32)); + buff_offset = sizeof(ZXIC_UINT32); + + /* 存放queue_num */ + ZXIC_COMM_MEMCPY(*pp_data_buff + buff_offset, &flow_num_total, sizeof(ZXIC_UINT32)); + buff_offset += sizeof(ZXIC_UINT32); + + /* 获取、存放queue 绑定的信息 */ + if (0 != flow_num_total) + { + ZXIC_COMM_PRINT(">>>>>>>>>>>[dpp_stat_car_glb_mgr_get]: Get queue info start!\n"); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, flow_num_total, ((ZXIC_UINT32)ZXIC_SIZEOF(DPP_CAR_SOFT_RESET_QUEUE_T))); + p_car_glb_queue_info = (DPP_CAR_SOFT_RESET_QUEUE_T *)ZXIC_COMM_MALLOC(flow_num_total * ((ZXIC_UINT32)ZXIC_SIZEOF(DPP_CAR_SOFT_RESET_QUEUE_T))); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_car_glb_queue_info); + ZXIC_COMM_MEMSET(p_car_glb_queue_info, 0, flow_num_total * sizeof(DPP_CAR_SOFT_RESET_QUEUE_T)); + p_car_glb_queue_info_temp = p_car_glb_queue_info; + + /* CAR A */ + flow_num = p_g_restore_data->cara_flow_num; + + for (j = 0; j < flow_num; j++) + { + rc = dpp_stat_car_queue_cfg_get(dev_id, + STAT_CAR_A_TYPE, + p_g_restore_data->cara_item[j].flow_id, + &drop_flag, + &plcr_en, + &profile_id); + if (DPP_OK != rc) + { + ZXIC_COMM_FREE(p_car_glb_queue_info); + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ICM %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,"dpp_stat_car_queue_cfg_get"); + return rc; + } + + p_car_glb_queue_info_temp->car_type = STAT_CAR_A_TYPE; + p_car_glb_queue_info_temp->flow_id = p_g_restore_data->cara_item[j].flow_id; + p_car_glb_queue_info_temp->drop_flag = drop_flag; + p_car_glb_queue_info_temp->plcr_en = plcr_en; + p_car_glb_queue_info_temp->profile_id = profile_id; + p_car_glb_queue_info_temp++; + ZXIC_COMM_TRACE_DEV_INFO(dev_id, "carA used flow_id[%d] : 0x%08x\n", j, p_g_restore_data->cara_item[j].flow_id); + } + + /* CAR B */ + flow_num = p_g_restore_data->carb_flow_num; + + for (j = 0; j < flow_num; j++) + { + rc = dpp_stat_car_queue_cfg_get(dev_id, + STAT_CAR_B_TYPE, + p_g_restore_data->carb_item[j].flow_id, + &drop_flag, + &plcr_en, + &profile_id); + if (DPP_OK != rc) + { + ZXIC_COMM_FREE(p_car_glb_queue_info); + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ICM %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,"dpp_stat_car_queue_cfg_get"); + return rc; + } + + p_car_glb_queue_info_temp->car_type = STAT_CAR_B_TYPE; + p_car_glb_queue_info_temp->flow_id = p_g_restore_data->carb_item[j].flow_id; + p_car_glb_queue_info_temp->drop_flag = drop_flag; + p_car_glb_queue_info_temp->plcr_en = plcr_en; + p_car_glb_queue_info_temp->profile_id = profile_id; + p_car_glb_queue_info_temp++; + ZXIC_COMM_TRACE_DEV_INFO(dev_id, "carB used flow_id[%d] : 0x%08x\n", j, p_g_restore_data->carb_item[j].flow_id); + } + + /* CAR C */ + flow_num = p_g_restore_data->carc_flow_num; + + for (j = 0; j < flow_num; j++) + { + rc = dpp_stat_car_queue_cfg_get(dev_id, + STAT_CAR_C_TYPE, + p_g_restore_data->carc_item[j].flow_id, + &drop_flag, + &plcr_en, + &profile_id); + if (DPP_OK != rc) + { + ZXIC_COMM_FREE(p_car_glb_queue_info); + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ICM %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,"dpp_stat_car_queue_cfg_get"); + return rc; + } + + p_car_glb_queue_info_temp->car_type = STAT_CAR_C_TYPE; + p_car_glb_queue_info_temp->flow_id = p_g_restore_data->carc_item[j].flow_id; + p_car_glb_queue_info_temp->drop_flag = drop_flag; + p_car_glb_queue_info_temp->plcr_en = plcr_en; + p_car_glb_queue_info_temp->profile_id = profile_id; + p_car_glb_queue_info_temp++; + ZXIC_COMM_TRACE_DEV_INFO(dev_id, "carC used flow_id[%d] : 0x%08x\n", j, p_g_restore_data->carb_item[j].flow_id); + } + + ZXIC_COMM_MEMCPY(*pp_data_buff + buff_offset, p_car_glb_queue_info, flow_num_total * sizeof(DPP_CAR_SOFT_RESET_QUEUE_T)); + if((0xFFFFFFFF - (buff_offset)) < (flow_num_total * ZXIC_SIZEOF(DPP_CAR_SOFT_RESET_QUEUE_T))) + { + ZXIC_COMM_FREE(p_car_glb_queue_info); + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "ICM %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, buff_offset, flow_num_total * ZXIC_SIZEOF(DPP_CAR_SOFT_RESET_QUEUE_T), __FUNCTION__); + return ZXIC_PAR_CHK_INVALID_INDEX; + } + buff_offset += (flow_num_total * ZXIC_SIZEOF(DPP_CAR_SOFT_RESET_QUEUE_T)) % 0xffffffff; + } + + ZXIC_COMM_PRINT(">>>>>>>>>>>[dpp_stat_car_glb_mgr_get]: total flow_num = %d !\n", flow_num_total); + + /** profile 的信息 */ + if (0 != profile_pkt_total) + { + p_car_glb_pkt_profile_info = (DPP_STAT_CAR_PKT_PROFILE_CFG_T *)ZXIC_COMM_MALLOC(profile_pkt_total * ZXIC_SIZEOF(DPP_STAT_CAR_PKT_PROFILE_CFG_T)); + if (NULL == (p_car_glb_pkt_profile_info)) + { + ZXIC_COMM_FREE(p_car_glb_queue_info); + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ICM %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__); + return ZXIC_PAR_CHK_POINT_NULL; + } + + ZXIC_COMM_MEMSET(p_car_glb_pkt_profile_info, 0, profile_pkt_total * sizeof(DPP_STAT_CAR_PKT_PROFILE_CFG_T)); + p_car_glb_pkt_profile_info_temp = p_car_glb_pkt_profile_info; + } + size = ZXIC_SIZEOF(DPP_STAT_CAR_PROFILE_CFG_T); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, profile_num_total, size); + p_car_glb_profile_info = (DPP_STAT_CAR_PROFILE_CFG_T *)ZXIC_COMM_MALLOC(profile_num_total * size); + if (NULL == (p_car_glb_profile_info)) + { + ZXIC_COMM_FREE(p_car_glb_queue_info); + ZXIC_COMM_FREE(p_car_glb_pkt_profile_info); + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ICM %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__); + return ZXIC_PAR_CHK_POINT_NULL; + } + + ZXIC_COMM_MEMSET(p_car_glb_profile_info, 0, profile_num_total * sizeof(DPP_STAT_CAR_PROFILE_CFG_T)); + p_car_glb_profile_info_temp = p_car_glb_profile_info; + + ZXIC_COMM_PRINT(">>>>>>>>>>>[dpp_stat_car_glb_mgr_get]: Get profile info start!\n"); + ZXIC_COMM_PRINT(">>>>>>>>>>> Get car CAR_A_PROFILE info start!\n"); + + for (j = 0; j <= DPP_CAR_A_PROFILE_ID_MAX; j++) + { + /* (0 != profile_pkt_total) -- Coverity err : 递增 null 指针 p_car_glb_pkt_profile_info_temp */ + if ((0 != profile_pkt_total) && (ZXIC_TRUE == p_g_restore_data->car_pkt_sign[j])) + { + ZXIC_COMM_TRACE_DEV_INFO(dev_id, "car profile_id[%d] is pkt_profile!!!!\n", j); + rc = dpp_stat_car_profile_cfg_get(dev_id, + STAT_CAR_A_TYPE, + ZXIC_TRUE, + j, + p_car_glb_pkt_profile_info_temp); + if (DPP_OK != rc) + { + ZXIC_COMM_FREE(p_car_glb_queue_info); + ZXIC_COMM_FREE(p_car_glb_pkt_profile_info); + ZXIC_COMM_FREE(p_car_glb_profile_info); + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ICM %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,"dpp_stat_car_profile_cfg_get"); + return rc; + } + + p_car_glb_pkt_profile_info_temp++; + } + } + + for (j = 0; j <= DPP_CAR_A_PROFILE_ID_MAX; j++) + { + if (ZXIC_TRUE != p_g_restore_data->car_pkt_sign[j]) + { + rc = dpp_stat_car_profile_cfg_get(dev_id, + STAT_CAR_A_TYPE, + ZXIC_FALSE, + j, + p_car_glb_profile_info_temp); + if (DPP_OK != rc) + { + ZXIC_COMM_FREE(p_car_glb_queue_info); + ZXIC_COMM_FREE(p_car_glb_pkt_profile_info); + ZXIC_COMM_FREE(p_car_glb_profile_info); + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ICM %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,"dpp_stat_car_profile_cfg_get"); + return rc; + } + + p_car_glb_profile_info_temp++; + } + } + + ZXIC_COMM_PRINT(">>>>>>>>>>> Get car CAR_B_PROFILE info start!\n"); + + for (j = 0; j <= DPP_CAR_B_PROFILE_ID_MAX; j++) + { + rc = dpp_stat_car_profile_cfg_get(dev_id, + STAT_CAR_B_TYPE, + ZXIC_FALSE, + j, + p_car_glb_profile_info_temp); + if (DPP_OK != rc) + { + ZXIC_COMM_FREE(p_car_glb_queue_info); + ZXIC_COMM_FREE(p_car_glb_pkt_profile_info); + ZXIC_COMM_FREE(p_car_glb_profile_info); + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ICM %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,"dpp_stat_car_profile_cfg_get"); + return rc; + } + + p_car_glb_profile_info_temp++; + } + + ZXIC_COMM_PRINT(">>>>>>>>>>> Get car CAR_C_PROFILE info start!\n"); + + for (j = 0; j <= DPP_CAR_C_PROFILE_ID_MAX; j++) + { + rc = dpp_stat_car_profile_cfg_get(dev_id, + STAT_CAR_C_TYPE, + ZXIC_FALSE, + j, + p_car_glb_profile_info_temp); + if (DPP_OK != rc) + { + ZXIC_COMM_FREE(p_car_glb_queue_info); + ZXIC_COMM_FREE(p_car_glb_pkt_profile_info); + ZXIC_COMM_FREE(p_car_glb_profile_info); + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ICM %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,"dpp_stat_car_profile_cfg_get"); + return rc; + } + p_car_glb_profile_info_temp++; + } + + ZXIC_COMM_MEMCPY(*pp_data_buff + buff_offset, &(p_g_restore_data->car0_pkt_num), sizeof(ZXIC_UINT32)); + buff_offset += sizeof(ZXIC_UINT32); + + if((0xFFFFFFFF - (buff_offset)) < (sizeof(ZXIC_UINT32))) + { + ZXIC_COMM_FREE(p_car_glb_queue_info); + ZXIC_COMM_FREE(p_car_glb_profile_info); + ZXIC_COMM_FREE(p_car_glb_pkt_profile_info); + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "ICM %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, buff_offset, sizeof(ZXIC_UINT32), __FUNCTION__); + return ZXIC_PAR_CHK_INVALID_INDEX; + } + buff_offset += sizeof(ZXIC_UINT32); + + if (0 != profile_pkt_total) + { + ZXIC_COMM_MEMCPY(*pp_data_buff + buff_offset, p_car_glb_pkt_profile_info, profile_pkt_total * sizeof(DPP_STAT_CAR_PKT_PROFILE_CFG_T)); + buff_offset += profile_pkt_total * ZXIC_SIZEOF(DPP_STAT_CAR_PKT_PROFILE_CFG_T); + } + + ZXIC_COMM_PRINT(">>>>>>>>>>>[dpp_stat_car_glb_mgr_get]: total pkt_profile = %d !\n", profile_pkt_total); + + ZXIC_COMM_MEMCPY(*pp_data_buff + buff_offset, &profile_num_total, sizeof(ZXIC_UINT32)); + if((0xFFFFFFFF - (buff_offset)) < (sizeof(ZXIC_UINT32))) + { + ZXIC_COMM_FREE(p_car_glb_queue_info); + ZXIC_COMM_FREE(p_car_glb_profile_info); + ZXIC_COMM_FREE(p_car_glb_pkt_profile_info); + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "ICM %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, buff_offset, sizeof(ZXIC_UINT32), __FUNCTION__); + return ZXIC_PAR_CHK_INVALID_INDEX; + } + buff_offset += sizeof(ZXIC_UINT32); + + if (0 != profile_num_total) + { + ZXIC_COMM_PRINT(">>>>>>>>>>>[dpp_stat_car_glb_mgr_get]: total profile = %d !\n", profile_num_total); + ZXIC_COMM_MEMCPY(*pp_data_buff + buff_offset, p_car_glb_profile_info, profile_num_total * sizeof(DPP_STAT_CAR_PROFILE_CFG_T)); + buff_offset += profile_num_total * ZXIC_SIZEOF(DPP_STAT_CAR_PROFILE_CFG_T); + } + + ZXIC_COMM_PRINT(">>>>>>>>>>>[dpp_stat_car_glb_mgr_get]: total profile = %d !\n", profile_num_total); + ZXIC_COMM_PRINT(">>>>>>>>>>>[dpp_stat_car_glb_mgr_get]: buff_offset= %d !\n", buff_offset); + + *p_flag = ZXIC_TRUE; + + ZXIC_COMM_FREE(p_car_glb_queue_info); + + if (0 != profile_pkt_total) + { + ZXIC_COMM_FREE(p_car_glb_pkt_profile_info); + } + + ZXIC_COMM_FREE(p_car_glb_profile_info); + } + + ZXIC_COMM_PRINT(">>>>>>>>>>>[dpp_stat_car_glb_mgr_get]: END! total size = %d !\n", *p_size); + + return rc; +} + +#endif +#endif + +#if ZXIC_REAL("TEST") + +#if 0 +/***********************************************************/ +/** +* @param p_rb_cfg +* +* @return +* @remark 无 +* @see +* @author XXX @date 2017/10/31 +************************************************************/ +DPP_STATUS dpp_stat_queue_rb_root_prt(ZXIC_RB_CFG *p_rb_cfg) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 i = 0; + ZXIC_UINT32 dev_id = 0; + + DPP_CAR_QUEUE_RB_KEY_T *p_tmp_car_queue_rb_key = NULL; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_rb_cfg); + + if (NULL != p_rb_cfg->p_root) + { + p_tmp_car_queue_rb_key = (DPP_CAR_QUEUE_RB_KEY_T *)p_rb_cfg->p_root->p_key; + + if (NULL != p_tmp_car_queue_rb_key) + { + ZXIC_COMM_PRINT("dpp_stat_queue_rb_root_prt[GET] car_queue_cfg:\n"); + + for (i = 0; i < DPP_CAR_QUEUE_CFG_ZXIC_UINT8; i++) + { + ZXIC_COMM_PRINT("%02x\t", p_tmp_car_queue_rb_key->profile_cfg[i]); + + if (0 == (i + 1) % 4) + { + ZXIC_COMM_PRINT("\n"); + } + } + + ZXIC_COMM_PRINT("\n"); + + } + + } + + return rc; +} + +/***********************************************************/ +/** +* @param p_rb_cfg +* +* @return +* @remark 无 +* @see +* @author XXX @date 2017/10/31 +************************************************************/ +DPP_STATUS dpp_stat_car_profile_id_rb_root_prt(ZXIC_UINT32 dev_id, ZXIC_RB_CFG *p_rb_cfg) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 i = 0; + + DPP_CAR_PROFILE_ID_RB_KEY_T *p_tmp_car_profile_id_rb_key = NULL; + ZXIC_RB_TN *p_car_rb_node = NULL; + DPP_CAR_PROFILE_RB_KEY_T *p_car_profile_rb_key = NULL; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_rb_cfg); + + if (NULL != p_rb_cfg->p_root) + { + p_tmp_car_profile_id_rb_key = (DPP_CAR_PROFILE_ID_RB_KEY_T *)p_rb_cfg->p_root->p_key; + + if (NULL != p_tmp_car_profile_id_rb_key) + { + /* ZXIC_COMM_PRINT("dpp_stat_car_profile_id_rb_root_prt pp_car_node ADDRESS: 0x%08x\n", (ZXIC_UINT32)p_tmp_car_profile_id_rb_key->p_car_node); */ + p_car_rb_node = (ZXIC_RB_TN * )p_tmp_car_profile_id_rb_key->p_car_node; + + if (NULL != p_car_rb_node) + { + p_car_profile_rb_key = (DPP_CAR_PROFILE_RB_KEY_T *)p_car_rb_node->p_key; + + if (NULL != p_car_profile_rb_key) + { + for (i = 0; i < DPP_CAR_PROFILE_CFG_ZXIC_UINT32; i++) + { + ZXIC_COMM_PRINT("%08x\t", p_car_profile_rb_key->profile_cfg[i]); + + if (0 == (i + 1) % 4) + { + ZXIC_COMM_PRINT("\n"); + } + } + + ZXIC_COMM_PRINT("\n"); + } + } + } + } + + return rc; +} + +#endif +#endif + + + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se/dpp_stat_cfg.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se/dpp_stat_cfg.c new file mode 100755 index 0000000..5187c93 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se/dpp_stat_cfg.c @@ -0,0 +1,310 @@ +/************************************************************** +* Ȩ (C)2013-2015, ͨѶɷ޹˾ +* ļ : dpp_stat_cfg.c +* ļʶ : +* ժҪ : +* ˵ : +* ǰ汾 : +* : ls +* : 2016/03/29 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* ޸ļ¼1: +* ޸: +* : +* : +* ޸: +***************************************************************/ +#include "zxic_common.h" +#include "dpp_type_api.h" +#include "dpp_dev.h" +#include "dpp_stat_reg.h" +#include "dpp_stat_cfg.h" +#include "dpp_stat_api.h" +#include "dpp_se_api.h" +#include "dpp_se.h" +#include "dpp_reg_api.h" +#include "dpp_reg_info.h" + +PPU_STAT_CFG_T g_ppu_stat_cfg = {0}; + +#if ZXIC_REAL("Basic Reg Operation") + +/***********************************************************/ +/** ȡppuͳƬ +* @param dev_id 豸 +* @param p_ppu_eram_depth ppuͳƬ +* +* @return NPE_OK-ɹNPE_ERR-ʧ +* @remark +* @see +* @author ls @date 2016/03/31 +************************************************************/ +DPP_STATUS dpp_stat_ppu_eram_depth_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_ppu_eram_depth) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_STAT_CFG_PPU_ERAM_DEPTH_T ppu_eram_depth_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_ppu_eram_depth); + + rc = dpp_reg_read(dev, + STAT_STAT_CFG_PPU_ERAM_DEPTHr, + 0, + 0, + &ppu_eram_depth_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_ppu_eram_depth = ppu_eram_depth_cfg.ppu_eram_depth; + + return rc; +} + +/***********************************************************/ +/** ȡppuͳ ERAMַ +* @param dev_id 豸 +* @param p_ppu_eram_baddr ppuͳƬڻַ +* +* @return NPE_OK-ɹNPE_ERR-ʧ +* @remark +* @see +* @author ls @date 2016/03/31 +************************************************************/ +DPP_STATUS dpp_stat_ppu_eram_baddr_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_ppu_eram_baddr) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_STAT_CFG_PPU_ERAM_BASE_ADDR_T ppu_eram_baddr_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_ppu_eram_baddr); + + rc = dpp_reg_read(dev, + STAT_STAT_CFG_PPU_ERAM_BASE_ADDRr, + 0, + 0, + &ppu_eram_baddr_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_ppu_eram_baddr = ppu_eram_baddr_cfg.ppu_eram_base_addr; + + return rc; +} + +/***********************************************************/ +/** ȡppuͳ ddrַ +* @param dev_id 豸 +* @param p_ppu_ddr_baddr ppuͳƬַ +* +* @return NPE_OK-ɹNPE_ERR-ʧ +* @remark +* @see +* @author ls @date 2016/03/31 +************************************************************/ +DPP_STATUS dpp_stat_ppu_ddr_baddr_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_ppu_ddr_baddr) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_STAT_CFG_PPU_DDR_BASE_ADDR_T ppu_ddr_baddr_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_ppu_ddr_baddr); + + rc = dpp_reg_read(dev, + STAT_STAT_CFG_PPU_DDR_BASE_ADDRr, + 0, + 0, + &ppu_ddr_baddr_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_ppu_ddr_baddr = ppu_ddr_baddr_cfg.ppu_ddr_base_addr; + + return rc; +} +#endif + +#if ZXIC_REAL("Advanced Function") +/***********************************************************/ +/** ppuֵȡ +* @param dev_id 豸 +* @param rd_mode ȡλģʽμSTAT_CNT_MODE_E0-64bit1-128bit +* @param index λμrd_mode +* @param clr_mode ģʽμSTAT_RD_CLR_MODE_E0-壬1- +* @param p_data Σȡ +* +* @return NPE_OK-ɹNPE_ERR-ʧ +* @remark +* @see +* @author ls @date 2016/07/11 +************************************************************/ +DPP_STATUS dpp_stat_ppu_cnt_get(DPP_DEV_T *dev, + STAT_CNT_MODE_E rd_mode, + ZXIC_UINT32 index, + ZXIC_UINT32 clr_mode, + ZXIC_UINT32 *p_data) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 ppu_eram_baddr = 0; + ZXIC_UINT32 ppu_eram_depth = 0; + ZXIC_UINT32 ppu_ddr_baddr = 0; + ZXIC_UINT32 eram_rd_mode = 0; + ZXIC_UINT32 eram_clr_mode = 0; + // ZXIC_UINT32 ddr_rd_mode = 0; + // ZXIC_UINT32 ddr_clr_mode = 0; + // ZXIC_UINT32 ddr_index = 0; + + ZXIC_COMM_CHECK_POINT(dev); + + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), rd_mode, STAT_64_MODE, STAT_MAX_MODE - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), clr_mode, STAT_RD_CLR_MODE_UNCLR, STAT_RD_CLR_MODE_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data); + + rc = dpp_stat_ppu_eram_depth_get(dev, + &ppu_eram_depth); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_ppu_eram_depth_get"); + + rc = dpp_stat_ppu_eram_baddr_get(dev, + &ppu_eram_baddr); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_ppu_eram_baddr_get"); + + rc = dpp_stat_ppu_ddr_baddr_get(dev, + &ppu_ddr_baddr); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stat_ppu_ddr_baddr_get"); + + /** Ƭڴ洢 */ + if ((index >> (STAT_128_MODE - rd_mode)) < ppu_eram_depth) + { + if (STAT_128_MODE == rd_mode) + { + eram_rd_mode = ERAM128_OPR_128b; + } + else + { + eram_rd_mode = ERAM128_OPR_64b; + } + + if (STAT_RD_CLR_MODE_UNCLR == clr_mode) + { + eram_clr_mode = RD_MODE_HOLD; + } + else + { + eram_clr_mode = RD_MODE_CLEAR; + } + + rc = dpp_se_smmu0_ind_read(dev, + ppu_eram_baddr, + index, + eram_rd_mode, + eram_clr_mode, + p_data); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_se_smmu0_ind_read"); + } + /** Ƭ洢 */ + else + { + // if (STAT_128_MODE == rd_mode) + // { + // ddr_rd_mode = CMMU_RD_MODE_128; + // } + // else + // { + // ddr_rd_mode = CMMU_RD_MODE_64; + // } + + // if (STAT_RD_CLR_MODE_UNCLR == clr_mode) + // { + // ddr_clr_mode = CMMU_RD_CLR_MODE_UNCLR; + // } + // else + // { + // ddr_clr_mode = CMMU_RD_CLR_MODE_CLR; + // } + + // ddr_index = index - (ppu_eram_depth << (STAT_128_MODE - rd_mode)); + + // rc = dpp_se_cmmu_ddr_read(dev_id, + // ppu_ddr_baddr, + // ddr_rd_mode, + // ddr_clr_mode, + // ddr_index, + // p_data); + // ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_se_cmmu_ddr_read"); + } + + return rc; +} + +/***********************************************************/ +/** ppuͳƬ +* @param dev_id 豸 +* @param ppu_eram_depth ppuͳƬ,128bitΪλ +* +* @return NPE_OK-ɹNPE_ERR-ʧ +* @remark +* @see +* @author ls @date 2016/03/31 +************************************************************/ +DPP_STATUS dpp_stat_ppu_eram_depth_set(DPP_DEV_T *dev, ZXIC_UINT32 ppu_eram_depth) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_STAT_CFG_PPU_ERAM_DEPTH_T ppu_eram_depth_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), ppu_eram_depth, 0, DPP_STAT_PPU_ERAM_DEPTH_MAX); + + ppu_eram_depth_cfg.ppu_eram_depth = ppu_eram_depth; + + rc = dpp_reg_write(dev, + STAT_STAT_CFG_PPU_ERAM_DEPTHr, + 0, + 0, + &ppu_eram_depth_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + g_ppu_stat_cfg.eram_depth = ppu_eram_depth; + + return rc; +} + +/***********************************************************/ +/** ppuͳ ERAMַ +* @param dev_id 豸 +* @param ppu_eram_baddr ppuͳeRamַ,128bitΪλ +* +* @return NPE_OK-ɹNPE_ERR-ʧ +* @remark +* @see +* @author ls @date 2016/03/31 +************************************************************/ +DPP_STATUS dpp_stat_ppu_eram_baddr_set(DPP_DEV_T *dev, ZXIC_UINT32 ppu_eram_baddr) +{ + DPP_STATUS rc = DPP_OK; + DPP_STAT_STAT_CFG_PPU_ERAM_BASE_ADDR_T ppu_eram_baddr_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), ppu_eram_baddr, 0, DPP_STAT_PPU_ERAM_BADDR_MAX); + + ppu_eram_baddr_cfg.ppu_eram_base_addr = ppu_eram_baddr; + + rc = dpp_reg_write(dev, + STAT_STAT_CFG_PPU_ERAM_BASE_ADDRr, + 0, + 0, + &ppu_eram_baddr_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_reg_write"); + + g_ppu_stat_cfg.eram_baddr = ppu_eram_baddr; + + return rc; +} + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se_apt/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se_apt/Kbuild.include new file mode 100644 index 0000000..8a8b8cc --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se_apt/Kbuild.include @@ -0,0 +1,2 @@ +cur_dir := en_np/sdk/source/dev/module/se_apt/ +src_files += $(addprefix $(cur_dir),$(notdir $(wildcard $(dinghai_root)/$(cur_dir)*.c))) diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se_apt/dpp_apt_se_acl.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se_apt/dpp_apt_se_acl.c new file mode 100644 index 0000000..0da04a1 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se_apt/dpp_apt_se_acl.c @@ -0,0 +1,145 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_apt_se_acl.c +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : 陈勤00181032 +* 完成日期 : 2023/02/22 +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#include "dpp_apt_se.h" +#include "dpp_dev.h" +#include "dpp_sdt.h" +#include "dpp_acl.h" +#include "dpp_dtb_table.h" + +static DPP_ACL_CFG_EX_T g_apt_acl_cfg = {0}; + +/***********************************************************/ +/** acl资源初始化 +* @param dev_id 设备号 +* @param tbl_num etcam对应的sdt表个数 +* @param pAclTblRes acl表资源信息,包括SDT配置信息,acl资源(条目数,存放方式和占用的block)和结构体码流转换回调函数 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_acl_res_init(DPP_DEV_T *dev,ZXIC_UINT32 tbl_num,DPP_APT_ACL_TABLE_T *pAclTblRes) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT8 index = 0; + DPP_APT_ACL_TABLE_T *pTempAclTbl = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX_UPPER(tbl_num, DPP_ETCAM_TBLID_NUM); + ZXIC_COMM_CHECK_POINT(pAclTblRes); + + rc = dpp_acl_cfg_init_ex(dev, &g_apt_acl_cfg, + (ZXIC_VOID *)ZXIC_COMM_VAL_TO_PTR(DEV_ID(dev)), + DPP_ACL_FLAG_ETCAM0_EN, + NULL); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_acl_cfg_init_ex"); + + for(index = 0;index < tbl_num;index++) + { + pTempAclTbl = pAclTblRes + index; + rc = dpp_sdt_tbl_write(dev, + pTempAclTbl->sdtNo, + pTempAclTbl->aclSdt.table_type, + &(pTempAclTbl->aclSdt), + SDT_OPER_ADD); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_sdt_tbl_write"); + + rc = dpp_acl_tbl_init_ex(&g_apt_acl_cfg, + pTempAclTbl->aclSdt.etcam_table_id, + pTempAclTbl->aclSdt.as_en, + pTempAclTbl->aclRes.entry_num, + pTempAclTbl->aclRes.pri_mode, + pTempAclTbl->aclSdt.etcam_key_mode, + pTempAclTbl->aclSdt.as_rsp_mode, + pTempAclTbl->aclSdt.as_eram_baddr, + pTempAclTbl->aclRes.block_num, + pTempAclTbl->aclRes.block_index); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_acl_tbl_init_ex"); + + rc = dpp_apt_set_callback(DEV_ID(dev), + pTempAclTbl->sdtNo, + pTempAclTbl->aclSdt.table_type, + (ZXIC_VOID *)pTempAclTbl); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_apt_set_callback"); + + } + + return DPP_OK; +} + +/***********************************************************/ +/** acl表项插入/更新 +* @param dev_id 设备号 +* @param sdt_no sdt号 0~255 +* @param pData 业务插入表项内容,具体结构体由业务确定(结构体的第一个字段必须为index),SDK不感知 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_dtb_acl_entry_insert(DPP_DEV_T *dev,ZXIC_UINT32 queue_id, ZXIC_UINT32 sdt_no, void *pData) +{ + ZXIC_UINT8 data[DPP_ETCAM_WIDTH_MAX/8] = {0}; /*640bit*/ + ZXIC_UINT8 mask[DPP_ETCAM_WIDTH_MAX/8] = {0}; /*640bit*/ + ZXIC_UINT8 rst[16] = {0}; /*128bit*/ + ZXIC_UINT32 element_id = 0; + ZXIC_UINT32 rc = DPP_OK; + + DPP_ACL_ENTRY_EX_T aclEntry = {0}; + DPP_DTB_ACL_ENTRY_INFO_T tDtbAclEntry = {0}; + DPP_SDTTBL_ETCAM_T sdt_acl_info = {0}; /*SDT内容*/ + SE_APT_CALLBACK_T *pAptCallback = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX(sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + ZXIC_COMM_CHECK_POINT(pData); + + ZXIC_COMM_MEMSET(data, 0x0, sizeof(data)); + ZXIC_COMM_MEMSET(mask, 0x0, sizeof(mask)); + ZXIC_COMM_MEMSET(rst, 0x0, sizeof(rst)); + ZXIC_COMM_MEMSET(&aclEntry, 0x0, sizeof(DPP_ACL_ENTRY_EX_T)); + ZXIC_COMM_MEMSET(&tDtbAclEntry, 0x0, sizeof(DPP_DTB_ACL_ENTRY_INFO_T)); + + aclEntry.key_data = data; + aclEntry.key_mask = mask; + aclEntry.p_as_rslt = rst; + + //从sdt_no中获取SDT配置 + rc = dpp_soft_sdt_tbl_get(DEV_ID(dev), sdt_no, &sdt_acl_info); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_soft_sdt_tbl_get"); + + pAptCallback = dpp_apt_get_func(DEV_ID(dev), sdt_no); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), pAptCallback); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), pAptCallback->se_func_info.aclFunc.acl_set_func); + + rc = pAptCallback->se_func_info.aclFunc.acl_set_func((void *)pData, &aclEntry); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "acl_entry_func"); + + tDtbAclEntry.handle = aclEntry.pri; + tDtbAclEntry.key_data = aclEntry.key_data; + tDtbAclEntry.key_mask = aclEntry.key_mask; + tDtbAclEntry.p_as_rslt = aclEntry.p_as_rslt; + + rc = dpp_dtb_acl_dma_insert(dev, queue_id, sdt_no, 1, &tDtbAclEntry, &element_id); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_acl_dma_insert"); + + return rc; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se_apt/dpp_apt_se_comm.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se_apt/dpp_apt_se_comm.c new file mode 100644 index 0000000..6b55c52 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se_apt/dpp_apt_se_comm.c @@ -0,0 +1,315 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_apt_se_common.c +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : 陈勤00181032 +* 完成日期 : 2023/02/22 +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#include "dpp_apt_se.h" +#include "dpp_dev.h" +#include "dpp_dtb_table_api.h" +#include "dpp_dtb_table.h" +#include "dpp_kernel_init.h" +#include "dpp_drv_sdt.h" +#include "dpp_tbl_comm.h" + +#define DTB_QUEUE_ACK_SIZE (16) +#define DTB_QUEUE_ELEMENT_NUM (32) +#define DTB_QUEUE_ELEMENT_DATA_SIZE (16*1024 + DTB_QUEUE_ACK_SIZE)//16k+16 +#define DTB_QUEUE_DATA_SIZE (DTB_QUEUE_ELEMENT_DATA_SIZE * DTB_QUEUE_ELEMENT_NUM) +#define DTB_QUEUE_ELEMENT_DUMP_SIZE (16*1024 + DTB_QUEUE_ACK_SIZE)//16K+16 +#define DTB_QUEUE_DUMP_SIZE (DTB_QUEUE_ELEMENT_DUMP_SIZE * DTB_QUEUE_ELEMENT_NUM) +#define DTB_QUEUE_DMA_SIZE (DTB_QUEUE_DATA_SIZE + DTB_QUEUE_DUMP_SIZE) + + +SE_APT_CALLBACK_T g_apt_se_callback[DPP_DEV_CHANNEL_MAX][DPP_DEV_SDT_ID_MAX] = {{{0}}}; + +/***********************************************************/ +/** 根据设备id和sdt号获取指针 +* @param p_new_key 新键值 +* @param p_old_key 旧键值 +* @param key_len 键值长度 +* @return 比较结果 +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/24 +************************************************************/ +ZXIC_SINT32 dpp_apt_table_key_cmp(void *p_new_key, void *p_old_key, ZXIC_UINT32 key_len) +{ + ZXIC_COMM_CHECK_POINT(p_new_key); + ZXIC_COMM_CHECK_POINT(p_old_key); + /* 仅比较index */ + ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW_NO_ASSERT(key_len, (ZXIC_UINT32)ZXIC_SIZEOF(ZXIC_UINT32)); + return ZXIC_COMM_MEMCMP((ZXIC_UINT32 *)p_new_key, (ZXIC_UINT32 *)p_old_key,ZXIC_SIZEOF(ZXIC_UINT32)); +} + +/***********************************************************/ +/** 根据设备id和sdt号获取指针 +* @param dev_id 设备号 +* @param sdt_no 业务表对应的sdt号 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/24 +************************************************************/ +SE_APT_CALLBACK_T *dpp_apt_get_func(ZXIC_UINT32 dev_id,ZXIC_UINT32 sdt_no) +{ + ZXIC_COMM_CHECK_INDEX_RETURN_NULL_NO_ASSERT(dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX_RETURN_NULL_NO_ASSERT(sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + + return &g_apt_se_callback[dev_id][sdt_no]; +} + +/***********************************************************/ +/** 保存回调参数信息 +* @param dev_id 设备号 +* @param sdt_no 业务表对应的sdt号 +* @param table_type SDT属性中的表类型,取值参考DPP_SDT_TABLE_TYPE_E的定义(仅添加操作时有效) +* @param pData 需保存的回调信息,由table_type确定此ZXIC_VOID型指针对应的数据结果 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/24 +************************************************************/ +DPP_STATUS dpp_apt_set_callback(ZXIC_UINT32 dev_id, ZXIC_UINT32 sdt_no, ZXIC_UINT32 table_type,ZXIC_VOID *pData) +{ + SE_APT_CALLBACK_T *aptFunc = NULL; + + aptFunc = dpp_apt_get_func(dev_id,sdt_no); + ZXIC_COMM_CHECK_POINT(aptFunc); + + aptFunc->sdtNo = sdt_no; + aptFunc->table_type = table_type; + + switch (table_type) + { + case DPP_SDT_TBLT_eRAM: + { + aptFunc->se_func_info.eramFunc.opr_mode = ((DPP_APT_ERAM_TABLE_T *)pData)->opr_mode; + aptFunc->se_func_info.eramFunc.rd_mode = ((DPP_APT_ERAM_TABLE_T *)pData)->rd_mode; + aptFunc->se_func_info.eramFunc.eram_set_func = ((DPP_APT_ERAM_TABLE_T *)pData)->eram_set_func; + aptFunc->se_func_info.eramFunc.eram_get_func = ((DPP_APT_ERAM_TABLE_T *)pData)->eram_get_func; + break; + } + case DPP_SDT_TBLT_DDR3: + { + aptFunc->se_func_info.ddrFunc.ddr_tbl_depth = ((DPP_APT_DDR_TABLE_T *)pData)->ddr_table_depth; + aptFunc->se_func_info.ddrFunc.ddr_set_func = ((DPP_APT_DDR_TABLE_T *)pData)->ddr_set_func; + aptFunc->se_func_info.ddrFunc.ddr_get_func = ((DPP_APT_DDR_TABLE_T *)pData)->ddr_get_func; + break; + } + case DPP_SDT_TBLT_HASH: + { + aptFunc->se_func_info.hashFunc.hash_set_func = ((DPP_APT_HASH_TABLE_T *)pData)->hash_set_func; + aptFunc->se_func_info.hashFunc.hash_get_func = ((DPP_APT_HASH_TABLE_T *)pData)->hash_get_func; + break; + } + case DPP_SDT_TBLT_eTCAM: + { + aptFunc->se_func_info.aclFunc.acl_set_func = ((DPP_APT_ACL_TABLE_T *)pData)->acl_set_func; + aptFunc->se_func_info.aclFunc.acl_get_func = ((DPP_APT_ACL_TABLE_T *)pData)->acl_get_func; + break; + } + default: + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "dpp_apt_se_set_callback table_type[ %d ] is invalid!\n", table_type); + return DPP_ERR; + } + } + + return DPP_OK; +} + +DPP_STATUS dpp_apt_sw_list_insert(ZXIC_RB_CFG *rb_cfg,void *pData,ZXIC_UINT32 len) +{ + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT8 *p_rb_key = NULL; + ZXIC_RB_TN *p_rb_new = NULL; + ZXIC_RB_TN *p_rb_rtn = NULL; + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(rb_cfg); + ZXIC_COMM_CHECK_POINT(pData); + + p_rb_key = (ZXIC_UINT8 *)ZXIC_COMM_MALLOC(len); + ZXIC_COMM_CHECK_POINT(p_rb_key); + ZXIC_COMM_MEMSET(p_rb_key,0x0,len); + ZXIC_COMM_MEMCPY(p_rb_key,pData,len); + + p_rb_new = (ZXIC_RB_TN*)ZXIC_COMM_MALLOC(sizeof(ZXIC_RB_TN)); + if (NULL == (p_rb_new)) + { + ZXIC_COMM_FREE(p_rb_key); + ZXIC_COMM_TRACE_ERROR("\n ICM %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n", __FILE__, __LINE__, __FUNCTION__); + return ZXIC_PAR_CHK_POINT_NULL; + } + ZXIC_COMM_MEMSET(p_rb_new, 0, ZXIC_SIZEOF(ZXIC_RB_TN)); + INIT_RBT_TN(p_rb_new, p_rb_key); + + rc = zxic_comm_rb_insert(rb_cfg, p_rb_new, &p_rb_rtn); + if(rc == ZXIC_RBT_RC_UPDATE) + { + ZXIC_COMM_CHECK_POINT(p_rb_rtn); + ZXIC_COMM_MEMCPY(p_rb_rtn->p_key,pData,len); + ZXIC_COMM_FREE(p_rb_new); + ZXIC_COMM_FREE(p_rb_key); + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "update exist entry!\n"); + return DPP_OK; + } + + return rc; +} + +DPP_STATUS dpp_apt_sw_list_search(ZXIC_RB_CFG *rb_cfg,void *pData,ZXIC_UINT32 len) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_RB_TN *p_rb_rtn = NULL; + + ZXIC_COMM_CHECK_POINT(rb_cfg); + + rc = zxic_comm_rb_search(rb_cfg,pData,&p_rb_rtn); + if(DPP_OK != rc) + { + return rc; + } + //ZXIC_COMM_CHECK_RC_NO_ASSERT( rc, "zxic_comm_rb_search"); + + ZXIC_COMM_MEMCPY(pData,p_rb_rtn->p_key,len); + return rc; +} + +DPP_STATUS dpp_apt_sw_list_delete(ZXIC_RB_CFG *rb_cfg,void *pData,ZXIC_UINT32 len) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_RB_TN *p_rb_rtn = NULL; + + ZXIC_COMM_CHECK_POINT(rb_cfg); + + rc = zxic_comm_rb_delete(rb_cfg,pData,&p_rb_rtn); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "zxic_comm_rb_delete"); + ZXIC_COMM_FREE(p_rb_rtn->p_key); + ZXIC_COMM_FREE(p_rb_rtn); + + return rc; +} + +DPP_STATUS dpp_apt_get_zblock_index(ZXIC_UINT32 zblock_bitmap,ZXIC_UINT32 *zblk_idx) +{ + ZXIC_UINT32 index0 = 0; + ZXIC_UINT32 index1 = 0; + + ZXIC_COMM_CHECK_POINT(zblk_idx); + + for (index0 = 0; index0 < 32;index0++) + { + if((zblock_bitmap>>index0)&0x1) + { + *(zblk_idx + index1) = index0; + index1++; + } + } + + return DPP_OK; +} + +DPP_STATUS dpp_apt_dtb_res_init(DPP_DEV_T *dev) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 queue_id = 0; + ZXIC_UINT32 dma_size = 2 * DTB_QUEUE_DMA_SIZE; + ZXIC_UINT16 vport = 0; + + DTB_QUEUE_DMA_ADDR_INFO tDmaAddrInfo = {0}; + + ZXIC_COMM_CHECK_POINT_NO_ASSERT(dev); + + vport = DEV_PCIE_VPORT(dev); + + // 申请队列 + rc = dpp_dtb_queue_requst(dev, "pf", vport, &queue_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_queue_requst"); + + /*分配下表DMA内存*/ + ZXIC_COMM_MEMSET(&tDmaAddrInfo, 0x00, sizeof(DTB_QUEUE_DMA_ADDR_INFO)); + rc = dpp_dtb_queue_dma_mem_alloc(dev, queue_id, dma_size); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_queue_dma_mem_alloc"); + + rc = dpp_dtb_queue_dma_mem_get(dev, queue_id, &tDmaAddrInfo); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_queue_dma_mem_get"); + + // 配置下表地址空间 + rc = dpp_dtb_queue_down_table_addr_set(dev, queue_id, + tDmaAddrInfo.dma_phy_addr, tDmaAddrInfo.dma_vir_addr); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_queue_down_table_addr_set"); + + // 配置dump表地址空间 + rc = dpp_dtb_queue_dump_table_addr_set(dev, queue_id, + tDmaAddrInfo.dma_phy_addr + DTB_QUEUE_DMA_SIZE, + tDmaAddrInfo.dma_vir_addr + DTB_QUEUE_DMA_SIZE); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_queue_dump_table_addr_set"); + + rc = dpp_dtb_user_info_set(dev, queue_id, vport, 0); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_user_info_set"); + + return DPP_OK; +} + +/***********************************************************/ +/** 根据设备id对表项公共参数初始化 +* @param dev_id 设备号 +* @return +* @remark 无 +* @see +* @author cq @date 2023/11/09 +************************************************************/ +DPP_STATUS dpp_apt_se_callback_init(ZXIC_UINT32 dev_id) +{ + ZXIC_UINT32 sdt_no = 0; + + ZXIC_COMM_CHECK_INDEX_NO_ASSERT(dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + + for(sdt_no=0;sdt_nosdtNo, + pTempDdrTbl->eDdrSdt.table_type, + &(pTempDdrTbl->eDdrSdt), + SDT_OPER_ADD); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_sdt_tbl_write"); + + rc = dpp_apt_set_callback(DEV_ID(dev), + pTempDdrTbl->sdtNo, + pTempDdrTbl->eDdrSdt.table_type, + (ZXIC_VOID *)pTempDdrTbl); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_apt_set_callback"); + } + + return DPP_OK; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se_apt/dpp_apt_se_eram.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se_apt/dpp_apt_se_eram.c new file mode 100644 index 0000000..80ac815 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se_apt/dpp_apt_se_eram.c @@ -0,0 +1,216 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_apt_se_eram.c +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : 陈勤00181032 +* 完成日期 : 2023/02/22 +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#include "dpp_apt_se.h" +#include "dpp_dev.h" +#include "dpp_sdt.h" +#include "dpp_dtb_table.h" +#include "dpp_dtb_table_api.h" +#include "dpp_apt_se.h" + +/***********************************************************/ +/** eram表资源初始化 +* @param dev_id 设备号 +* @param tbl_num 需初始化的eram表个数 +* @param pEramTbl eram资源信息,包括SDT配置信息,直接表读取位宽和结构体码流转换回调函数 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_eram_res_init(DPP_DEV_T *dev,ZXIC_UINT32 tbl_num,DPP_APT_ERAM_TABLE_T *pEramTbl) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT8 index = 0; + DPP_APT_ERAM_TABLE_T *pTempEramTbl = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX_UPPER(tbl_num, DPP_DEV_SDT_ID_MAX); + ZXIC_COMM_CHECK_POINT(pEramTbl); + + for(index = 0;index < tbl_num;index++) + { + pTempEramTbl = pEramTbl + index; + rc = dpp_sdt_tbl_write(dev, + pTempEramTbl->sdtNo, + pTempEramTbl->eRamSdt.table_type, + &(pTempEramTbl->eRamSdt), + SDT_OPER_ADD); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_sdt_tbl_write"); + + rc = dpp_apt_set_callback(DEV_ID(dev), + pTempEramTbl->sdtNo, + pTempEramTbl->eRamSdt.table_type, + (ZXIC_VOID *)pTempEramTbl); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_apt_set_callback"); + } + + return DPP_OK; +} + +/***********************************************************/ +/** dtb eram表项插入/更新 +* @param dev_id 设备号 +* @param sdt_no SDT号 0~255 +* @param index 条目index,索引范围随wrt_mode模式不同 +* @param pData 插入表项内容,由业务确定 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_dtb_eram_insert(DPP_DEV_T *dev,ZXIC_UINT32 queue_id,ZXIC_UINT32 sdt_no,ZXIC_UINT32 index,void *pData) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 element_id = 0; + ZXIC_UINT32 dump_data[4] = {0}; + + SE_APT_CALLBACK_T *pAptCallback = NULL; + DPP_DTB_ERAM_ENTRY_INFO_T dtb_eram_entry = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX(sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + + ZXIC_COMM_MEMSET(dump_data, 0x00, sizeof(dump_data)); + + pAptCallback = dpp_apt_get_func(DEV_ID(dev), sdt_no); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), pAptCallback); + + rc = pAptCallback->se_func_info.eramFunc.eram_set_func(pData, dump_data); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "eram_set_func"); + + //dtb配表 + dtb_eram_entry.index = index; + dtb_eram_entry.p_data = dump_data; + rc = dpp_dtb_eram_dma_write(dev, + queue_id, + sdt_no, + 1, + &dtb_eram_entry, + &element_id); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_eram_dma_write"); + + return rc; +} + +/***********************************************************/ +/** eram表项数据获取,从软件缓存中获取 +* @param dev_id 设备号 +* @param sdt_no SDT号 0~255 +* @param index 条目index,索引范围随wrt_mode模式不同 +* @param pData 出参,返回业务表项内容 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_dtb_eram_get(DPP_DEV_T *dev, ZXIC_UINT32 queue_id, ZXIC_UINT32 sdt_no, ZXIC_UINT32 index, void *pData) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 dump_data[4] = {0}; + SE_APT_CALLBACK_T *pAptCallback = NULL; + DPP_DTB_ERAM_ENTRY_INFO_T dump_eram_entry = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX(sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + + ZXIC_COMM_MEMSET(dump_data, 0x00, sizeof(dump_data)); + + pAptCallback = dpp_apt_get_func(DEV_ID(dev), sdt_no); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), pAptCallback); + + dump_eram_entry.index = index; + dump_eram_entry.p_data = dump_data; + rc = dpp_dtb_eram_data_get(dev, queue_id, sdt_no, &dump_eram_entry); + ZXIC_COMM_CHECK_RC_NO_ASSERT( rc, "dpp_dtb_eram_data_get"); + + rc = pAptCallback->se_func_info.eramFunc.eram_get_func(pData, dump_eram_entry.p_data); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "eram_get_func"); + + return rc; +} + +/***********************************************************/ +/** eram表项删除,软件维护删除 +* @param dev_id 设备号 +* @param sdt_no SDT号 0~255 +* @param index 条目index,索引范围随wrt_mode模式不同 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_dtb_eram_clear(DPP_DEV_T *dev,ZXIC_UINT32 queue_id,ZXIC_UINT32 sdt_no,ZXIC_UINT32 index) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 element_id = 0; + ZXIC_UINT32 dump_data[4] = {0}; + + SE_APT_CALLBACK_T *pAptCallback = NULL; + DPP_DTB_ERAM_ENTRY_INFO_T dtb_eram_entry = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX(sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + + ZXIC_COMM_MEMSET(dump_data, 0x00, sizeof(dump_data)); + + pAptCallback = dpp_apt_get_func(DEV_ID(dev), sdt_no); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), pAptCallback); + + //dtb配表 + dtb_eram_entry.index = index; + dtb_eram_entry.p_data = dump_data; + rc = dpp_dtb_eram_dma_write(dev, + queue_id, + sdt_no, + 1, + &dtb_eram_entry, + &element_id); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_eram_dma_write"); + + return rc; +} + +/***********************************************************/ +/** eram表项flush +* @param dev_id 设备号 +* @param sdt_no SDT号 0~255 +* @param index 条目index,索引范围随wrt_mode模式不同 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_dtb_eram_flush(DPP_DEV_T *dev, ZXIC_UINT32 queue_id, ZXIC_UINT32 sdt_no) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX(sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + + rc = dpp_dtb_eram_table_flush(dev, queue_id, sdt_no); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_eram_table_flush"); + ZXIC_COMM_TRACE_ERROR("dpp_apt_dtb_eram_flush sdt_no %d done.\n", sdt_no); + + return rc; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se_apt/dpp_apt_se_hash.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se_apt/dpp_apt_se_hash.c new file mode 100644 index 0000000..9096915 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/se_apt/dpp_apt_se_hash.c @@ -0,0 +1,326 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_apt_se_hash.c +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : chenqin00181032 +* 完成日期 : 2023/02/22 +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#include "dpp_apt_se.h" +#include "dpp_dev.h" +#include "dpp_hash.h" +#include "dpp_sdt.h" +#include "dpp_dtb_cfg.h" +#include "dpp_dtb_table.h" +#include "dpp_dtb_table_api.h" + +static DPP_SE_CFG g_apt_se_cfg = {{{0}}}; + +/***********************************************************/ +/** hash表全局资源初始化 +* @param dev_id 设备号 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_hash_global_res_init(DPP_DEV_T *dev) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + + rc = dpp_se_init(dev, &g_apt_se_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_se_init"); + + rc = dpp_se_client_init(&g_apt_se_cfg, ZXIC_COMM_VAL_TO_PTR(DEV_ID(dev))); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_se_client_init"); + + return rc; +} + +/***********************************************************/ +/** hash引擎初始化 +* @param dev_id 设备号 +* @param func_num 需初始化的hash引擎个数 1~4 +* @param pHashFuncRes 每个hash引擎分配的zblock个数和编号,以及分配模式(混合模式或者纯片内模式) +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_hash_func_res_init(ZXIC_UINT32 dev_id,ZXIC_UINT32 func_num,DPP_APT_HASH_FUNC_RES_T *pHashFuncRes) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 index = 0; + ZXIC_UINT32 zblk_idx[32] = {0}; + DPP_APT_HASH_FUNC_RES_T *pHashFuncResTemp = NULL; + + ZXIC_COMM_CHECK_INDEX(dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX_UPPER(func_num, HASH_FUNC_ID_NUM); + ZXIC_COMM_CHECK_POINT(pHashFuncRes); + + for (index = 0; index < func_num;index++) + { + ZXIC_COMM_MEMSET(zblk_idx,0x0,sizeof(zblk_idx)); + pHashFuncResTemp = pHashFuncRes+index; + rc = dpp_apt_get_zblock_index(pHashFuncResTemp->zblk_bitmap,zblk_idx); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_apt_get_zblock_index"); + + rc = dpp_hash_init(&g_apt_se_cfg, + pHashFuncResTemp->func_id, + pHashFuncResTemp->zblk_num, + zblk_idx, + pHashFuncResTemp->ddr_dis); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_hash_init"); + } + + return rc; + +} + +/***********************************************************/ +/** hash引擎初始化(删除硬件数据) +* @param dev_id 设备号 +* @param func_num 需初始化的hash引擎个数 1~4 +* @param pHashFuncRes 每个hash引擎分配的zblock个数和编号,以及分配模式(混合模式或者纯片内模式) +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_hash_func_flush_hardware_all(DPP_DEV_T *dev, + ZXIC_UINT32 func_num, + DPP_APT_HASH_FUNC_RES_T *pHashFuncRes, + ZXIC_UINT32 queue_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 index = 0; + DPP_APT_HASH_FUNC_RES_T *pHashFuncResTemp = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX_UPPER(func_num, HASH_FUNC_ID_NUM); + for (index = 0; index < func_num; index++) + { + pHashFuncResTemp = pHashFuncRes + index; + + rc = dpp_dtb_zcam_space_clr(dev, &g_apt_se_cfg, queue_id, pHashFuncResTemp->func_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_zcam_space_clr"); + } + + return rc; + +} + +/***********************************************************/ +/** hash引擎bulk空间初始化 +* @param dev_id 设备号 +* @param bulk_num 需初始化的bulk表个数 1~32 +* @param pBulkRes zcell和zreg资源占用信息,如果是混合模式,需进行DDR资源分配 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_hash_bulk_res_init(ZXIC_UINT32 dev_id,ZXIC_UINT32 bulk_num,DPP_APT_HASH_BULK_RES_T *pBulkRes) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 index = 0; + DPP_APT_HASH_BULK_RES_T *pHashBulkResTemp = NULL; + DPP_HASH_DDR_RESC_CFG_T ddr_resc_cfg = {0}; + + ZXIC_COMM_CHECK_INDEX(dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX_UPPER(bulk_num, HASH_FUNC_ID_NUM*HASH_BULK_NUM); + ZXIC_COMM_CHECK_POINT(pBulkRes); + + for (index = 0; index < bulk_num;index++) + { + ZXIC_COMM_MEMSET(&ddr_resc_cfg,0x0,sizeof(DPP_HASH_DDR_RESC_CFG_T)); + pHashBulkResTemp = pBulkRes+index; + + ddr_resc_cfg.ddr_baddr = pHashBulkResTemp->ddr_baddr; + ddr_resc_cfg.ddr_item_num = pHashBulkResTemp->ddr_item_num; + ddr_resc_cfg.ddr_width_mode = pHashBulkResTemp->ddr_width_mode; + ddr_resc_cfg.ddr_crc_sel = pHashBulkResTemp->ddr_crc_sel; + ddr_resc_cfg.ddr_ecc_en = pHashBulkResTemp->ddr_ecc_en; + + rc = dpp_hash_bulk_init(&g_apt_se_cfg, + pHashBulkResTemp->func_id, + pHashBulkResTemp->bulk_id, + &ddr_resc_cfg, + pHashBulkResTemp->zcell_num, + pHashBulkResTemp->zreg_num); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_hash_bulk_init"); + } + + return rc; +} + +/***********************************************************/ +/** hash业务表属性初始化 +* @param dev_id 设备号 +* @param tbl_num 需初始化的业务表表个数 1~128 +* @param pHashTbl sdt配置信息,初始化标记和业务结构体码流转换函数 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_hash_tbl_res_init(DPP_DEV_T *dev,ZXIC_UINT32 tbl_num,DPP_APT_HASH_TABLE_T *pHashTbl) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 index = 0; + DPP_APT_HASH_TABLE_T *pHashTblTemp = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX_UPPER(tbl_num, HASH_FUNC_ID_NUM*HASH_TBL_ID_NUM); + ZXIC_COMM_CHECK_POINT(pHashTbl); + + for (index = 0; index < tbl_num;index++) + { + pHashTblTemp = pHashTbl+ index; + rc = dpp_sdt_tbl_write(dev, + pHashTblTemp->sdtNo, + pHashTblTemp->hashSdt.table_type, + &pHashTblTemp->hashSdt, + SDT_OPER_ADD); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_sdt_tbl_write"); + + rc = dpp_hash_tbl_id_info_init(&g_apt_se_cfg, + pHashTblTemp->hashSdt.hash_id, + pHashTblTemp->hashSdt.hash_table_id, + pHashTblTemp->tbl_flag, + pHashTblTemp->hashSdt.hash_table_width, + pHashTblTemp->hashSdt.key_size); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_hash_tbl_id_info_init_ex"); + + rc = dpp_apt_set_callback(DEV_ID(dev), + pHashTblTemp->sdtNo, + pHashTblTemp->hashSdt.table_type, + (ZXIC_VOID *)pHashTblTemp); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_apt_set_callback"); + } + + return rc; +} + +/***********************************************************/ +/** dtb hash表项插入/更新 +* @param dev_id 设备号 +* @param sdt_no sdt号 0~255 +* @param pData 插入hash表项信息,由业务确定 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_dtb_hash_insert(DPP_DEV_T *dev,ZXIC_UINT32 queue_id,ZXIC_UINT32 sdt_no,void *pData) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT8 key_valid = 1; + DPP_HASH_ENTRY entry = {0}; + DPP_SDTTBL_HASH_T sdt_hash_info = {0}; /*SDT内容*/ + ZXIC_UINT8 aucKey[HASH_KEY_MAX] = {0}; + ZXIC_UINT8 aucRst[HASH_RST_MAX] = {0}; + SE_APT_CALLBACK_T *pAptCallback = NULL; + DPP_DTB_HASH_ENTRY_INFO_T tDtbHashEntry = {0}; + ZXIC_UINT32 element_id = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX(queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_INDEX(sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + + //从sdt_no中获取SDT配置 + rc = dpp_soft_sdt_tbl_get(DEV_ID(dev), sdt_no, &sdt_hash_info); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_soft_sdt_tbl_get"); + + pAptCallback = dpp_apt_get_func(DEV_ID(dev), sdt_no); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), pAptCallback); + + entry.p_key = aucKey; + entry.p_rst = aucRst; + ZXIC_COMM_MEMSET(entry.p_key,0x0,sizeof(aucKey)); + ZXIC_COMM_MEMSET(entry.p_rst,0x0,sizeof(aucRst)); + entry.p_key[0] = DPP_GET_HASH_KEY_CTRL(key_valid, + sdt_hash_info.hash_table_width, + sdt_hash_info.hash_table_id); + rc = pAptCallback->se_func_info.hashFunc.hash_set_func(pData,&entry); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "hash_set_func"); + + tDtbHashEntry.p_actu_key = &entry.p_key[1]; + tDtbHashEntry.p_rst = entry.p_rst; + + rc = dpp_dtb_hash_dma_insert(dev, queue_id,sdt_no,1,&tDtbHashEntry,&element_id); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_hash_dma_insert"); + + return rc; +} + +/***********************************************************/ +/** dtb hash表项删除 +* @param dev_id 设备号 +* @param sdt_no sdt号 0~255 +* @param pData 删除hash表项信息,由业务传入 +* @return +* @remark 无 +* @see +* @author chenqin00181032 @date 2023/02/22 +************************************************************/ +DPP_STATUS dpp_apt_dtb_hash_delete(DPP_DEV_T *dev,ZXIC_UINT32 queue_id,ZXIC_UINT32 sdt_no,void *pData) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT8 key_valid = 1; + DPP_HASH_ENTRY entry = {0}; + DPP_SDTTBL_HASH_T sdt_hash_info = {0}; /*SDT内容*/ + ZXIC_UINT8 aucKey[HASH_KEY_MAX] = {0}; + ZXIC_UINT8 aucRst[HASH_RST_MAX] = {0}; + SE_APT_CALLBACK_T *pAptCallback = NULL; + DPP_DTB_HASH_ENTRY_INFO_T tDtbHashEntry = {0}; + // ZXIC_UINT32 queue_id = 0; + ZXIC_UINT32 element_id = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX(queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_INDEX(sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + + //从sdt_no中获取SDT配置 + rc = dpp_soft_sdt_tbl_get(DEV_ID(dev), sdt_no, &sdt_hash_info); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_soft_sdt_tbl_get"); + + pAptCallback = dpp_apt_get_func(DEV_ID(dev), sdt_no); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), pAptCallback); + + entry.p_key = aucKey; + entry.p_rst = aucRst; + ZXIC_COMM_MEMSET(entry.p_key,0x0,sizeof(aucKey)); + ZXIC_COMM_MEMSET(entry.p_rst,0x0,sizeof(aucRst)); + entry.p_key[0] = DPP_GET_HASH_KEY_CTRL(key_valid, + sdt_hash_info.hash_table_width, + sdt_hash_info.hash_table_id); + rc = pAptCallback->se_func_info.hashFunc.hash_set_func(pData,&entry); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "hash_set_func"); + + ZXIC_COMM_MEMSET(&tDtbHashEntry,0x0,sizeof(DPP_DTB_HASH_ENTRY_INFO_T)); + ZXIC_COMM_MEMSET(entry.p_rst,0x0,sizeof(aucRst)); + tDtbHashEntry.p_actu_key = &entry.p_key[1]; + tDtbHashEntry.p_rst = entry.p_rst; + rc = dpp_dtb_hash_dma_delete(dev, queue_id,sdt_no,1,&tDtbHashEntry,&element_id); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_hash_dma_delete"); + + return rc; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/Kbuild.include new file mode 100644 index 0000000..bb99f18 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/Kbuild.include @@ -0,0 +1,4 @@ +cur_dir := en_np/sdk/source/dev/module/table/ +subdirs := sdt/ se/ +src_files += +include $(foreach subdir, $(subdirs), $(dinghai_root)/$(cur_dir)$(subdir)/Kbuild.include) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/sdt/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/sdt/Kbuild.include new file mode 100644 index 0000000..c3eee05 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/sdt/Kbuild.include @@ -0,0 +1,2 @@ +cur_dir := en_np/sdk/source/dev/module/table/sdt/ +src_files += $(addprefix $(cur_dir),$(notdir $(wildcard $(dinghai_root)/$(cur_dir)*.c))) diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/sdt/dpp_sdt.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/sdt/dpp_sdt.c new file mode 100755 index 0000000..b71bcdf --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/sdt/dpp_sdt.c @@ -0,0 +1,469 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_sdt.c +* 文件标识 : sdt配置接口实现文件 +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : 王春雷 +* 完成日期 : 2015/06/25 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#include "zxic_common.h" + +#include "dpp_dev.h" +#include "dpp_se.h" +#include "dpp_sdt_def.h" +#include "dpp_sdt_mgr.h" +#include "dpp_sdt.h" + +/* 全局变量*/ +ZXIC_UINT32 g_table_type[DPP_DEV_CHANNEL_MAX][DPP_DEV_SDT_ID_MAX] = {{0}}; +DPP_SDT_TBL_DATA_T g_sdt_info[DPP_DEV_CHANNEL_MAX][DPP_DEV_SDT_ID_MAX] = {{{0}}}; + +/** 获取低n位数据 */ +#define DPP_SDT_GET_LOW_DATA(source_value, low_width) (source_value &((1<table_type = tbl_type; + ZXIC_COMM_UINT32_GET_BITS(p_sdt_eram->eram_mode, sdt_hig32, DPP_SDT_H_ERAM_MODE_BT_POS, DPP_SDT_H_ERAM_MODE_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_sdt_eram->eram_base_addr, sdt_hig32, DPP_SDT_H_ERAM_BASE_ADDR_BT_POS, DPP_SDT_H_ERAM_BASE_ADDR_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_sdt_eram->eram_table_depth, sdt_low32, DPP_SDT_L_ERAM_TABLE_DEPTH_BT_POS, DPP_SDT_L_ERAM_TABLE_DEPTH_BT_LEN); + p_sdt_eram->eram_clutch_en = clutch_en; + break; + } + + case DPP_SDT_TBLT_DDR3: + { + p_sdt_ddr3 = (DPP_SDTTBL_DDR3_T *)p_sdt_info; + p_sdt_ddr3->table_type = tbl_type; + ZXIC_COMM_UINT32_GET_BITS(p_sdt_ddr3->ddr3_base_addr, sdt_hig32, DPP_SDT_H_DDR3_BASE_ADDR_BT_POS, DPP_SDT_H_DDR3_BASE_ADDR_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_sdt_ddr3->ddr3_share_type, sdt_hig32, DPP_SDT_H_DDR3_SHARE_TYPE_BT_POS, DPP_SDT_H_DDR3_SHARE_TYPE_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_sdt_ddr3->ddr3_rw_len, sdt_hig32, DPP_SDT_H_DDR3_RW_LEN_BT_POS, DPP_SDT_H_DDR3_RW_LEN_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(tmp, sdt_hig32, DPP_SDT_H_DDR3_SDT_NUM_BT_POS, DPP_SDT_H_DDR3_SDT_NUM_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_sdt_ddr3->ddr3_sdt_num, sdt_low32, DPP_SDT_L_DDR3_SDT_NUM_BT_POS, DPP_SDT_L_DDR3_SDT_NUM_BT_LEN); + p_sdt_ddr3->ddr3_sdt_num += (tmp << DPP_SDT_L_DDR3_SDT_NUM_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_sdt_ddr3->ddr3_ecc_en, sdt_low32, DPP_SDT_L_DDR3_ECC_EN_BT_POS, DPP_SDT_L_DDR3_ECC_EN_BT_LEN); + p_sdt_ddr3->ddr3_clutch_en = clutch_en; + break; + } + + case DPP_SDT_TBLT_HASH: + { + p_sdt_hash = (DPP_SDTTBL_HASH_T *)p_sdt_info; + p_sdt_hash->table_type = tbl_type; + ZXIC_COMM_UINT32_GET_BITS(p_sdt_hash->hash_id, sdt_hig32, DPP_SDT_H_HASH_ID_BT_POS, DPP_SDT_H_HASH_ID_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_sdt_hash->hash_table_width, sdt_hig32, DPP_SDT_H_HASH_TABLE_WIDTH_BT_POS, DPP_SDT_H_HASH_TABLE_WIDTH_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_sdt_hash->key_size, sdt_hig32, DPP_SDT_H_HASH_KEY_SIZE_BT_POS, DPP_SDT_H_HASH_KEY_SIZE_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_sdt_hash->hash_table_id, sdt_hig32, DPP_SDT_H_HASH_TABLE_ID_BT_POS, DPP_SDT_H_HASH_TABLE_ID_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_sdt_hash->learn_en, sdt_hig32, DPP_SDT_H_LEARN_EN_BT_POS, DPP_SDT_H_LEARN_EN_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_sdt_hash->keep_alive, sdt_hig32, DPP_SDT_H_KEEP_ALIVE_BT_POS, DPP_SDT_H_KEEP_ALIVE_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(tmp, sdt_hig32, DPP_SDT_H_KEEP_ALIVE_BADDR_BT_POS, DPP_SDT_H_KEEP_ALIVE_BADDR_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_sdt_hash->keep_alive_baddr, sdt_low32, DPP_SDT_L_KEEP_ALIVE_BADDR_BT_POS, DPP_SDT_L_KEEP_ALIVE_BADDR_BT_LEN); + p_sdt_hash->keep_alive_baddr += (tmp << DPP_SDT_L_KEEP_ALIVE_BADDR_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_sdt_hash->rsp_mode, sdt_low32, DPP_SDT_L_RSP_MODE_BT_POS, DPP_SDT_L_RSP_MODE_BT_LEN); + p_sdt_hash->hash_clutch_en = clutch_en; + break; + } + + case DPP_SDT_TBLT_LPM: + { + p_sdt_lpm = (DPP_SDTTBL_LPM_T *)p_sdt_info; + p_sdt_lpm->table_type = tbl_type; + ZXIC_COMM_UINT32_GET_BITS(p_sdt_lpm->lpm_v46_id, sdt_hig32, DPP_SDT_H_LPM_V46ID_BT_POS, DPP_SDT_H_LPM_V46ID_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_sdt_lpm->rsp_mode, sdt_hig32, DPP_SDT_H_LPM_RSP_MODE_BT_POS, DPP_SDT_H_LPM_RSP_MODE_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_sdt_lpm->lpm_table_depth, sdt_low32, DPP_SDT_L_LPM_TABLE_DEPTH_BT_POS, DPP_SDT_L_LPM_TABLE_DEPTH_BT_LEN); + p_sdt_lpm->lpm_clutch_en = clutch_en; + break; + } + + case DPP_SDT_TBLT_eTCAM: + { + p_sdt_etcam = (DPP_SDTTBL_ETCAM_T *)p_sdt_info; + p_sdt_etcam->table_type = tbl_type; + ZXIC_COMM_UINT32_GET_BITS(p_sdt_etcam->etcam_id, sdt_hig32, DPP_SDT_H_ETCAM_ID_BT_POS, DPP_SDT_H_ETCAM_ID_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_sdt_etcam->etcam_key_mode, sdt_hig32, DPP_SDT_H_ETCAM_KEY_MODE_BT_POS, DPP_SDT_H_ETCAM_KEY_MODE_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_sdt_etcam->etcam_table_id, sdt_hig32, DPP_SDT_H_ETCAM_TABLE_ID_BT_POS, DPP_SDT_H_ETCAM_TABLE_ID_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_sdt_etcam->no_as_rsp_mode, sdt_hig32, DPP_SDT_H_ETCAM_NOAS_RSP_MODE_BT_POS, DPP_SDT_H_ETCAM_NOAS_RSP_MODE_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_sdt_etcam->as_en, sdt_hig32, DPP_SDT_H_ETCAM_AS_EN_BT_POS, DPP_SDT_H_ETCAM_AS_EN_BT_LEN); + + ZXIC_COMM_UINT32_GET_BITS(tmp, sdt_hig32, DPP_SDT_H_ETCAM_AS_ERAM_BADDR_BT_POS, DPP_SDT_H_ETCAM_AS_ERAM_BADDR_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_sdt_etcam->as_eram_baddr, sdt_low32, DPP_SDT_L_ETCAM_AS_ERAM_BADDR_BT_POS, DPP_SDT_L_ETCAM_AS_ERAM_BADDR_BT_LEN); + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(p_sdt_etcam->as_eram_baddr, (tmp << DPP_SDT_L_ETCAM_AS_ERAM_BADDR_BT_LEN)); + p_sdt_etcam->as_eram_baddr += (tmp << DPP_SDT_L_ETCAM_AS_ERAM_BADDR_BT_LEN); + + ZXIC_COMM_UINT32_GET_BITS(p_sdt_etcam->as_rsp_mode, sdt_low32, DPP_SDT_L_ETCAM_AS_RSP_MODE_BT_POS, DPP_SDT_L_ETCAM_AS_RSP_MODE_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_sdt_etcam->etcam_table_depth, sdt_low32, DPP_SDT_L_ETCAM_TABLE_DEPTH_BT_POS, DPP_SDT_L_ETCAM_TABLE_DEPTH_BT_LEN); + p_sdt_etcam->etcam_clutch_en = clutch_en; + break; + } + + case DPP_SDT_TBLT_PORTTBL: + { + p_sdt_porttbl = (DPP_SDTTBL_PORTTBL_T *)p_sdt_info; + p_sdt_porttbl->table_type = tbl_type; + p_sdt_porttbl->porttbl_clutch_en = clutch_en; + break; + } + + default: + { + ZXIC_COMM_TRACE_ERROR("SDT table_type[ %d ] is invalid!\n", tbl_type); + ZXIC_COMM_ASSERT(0); + return DPP_ERR; + } + } + + return DPP_OK; +} + +/***********************************************************/ +/** 从软件缓存中获取table data信息 +* @param dev_id 设备号 +* @param sdt_no 业务表对应的sdt号,0-255 +* @param p_sdt_data sdt表信息 +* +* @return +* @remark 无 +* @see +* @author lim @date 2020/04/16 +************************************************************/ +DPP_STATUS dpp_sdt_tbl_data_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 sdt_no, DPP_SDT_TBL_DATA_T *p_sdt_data) +{ + DPP_STATUS rc = 0; + + ZXIC_COMM_CHECK_INDEX(dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX(sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + + p_sdt_data->data_high32 = g_sdt_info[dev_id][sdt_no].data_high32; + p_sdt_data->data_low32 = g_sdt_info[dev_id][sdt_no].data_low32; + + return rc; +} + +/***********************************************************/ +/** 将sdt信息保存在软件缓存中 +* @param dev_id 设备号 +* @param sdt_no 业务表对应的sdt号 +* @param table_type SDT属性中的表类型,取值参考DPP_SDT_TABLE_TYPE_E的定义 +* @param p_sdt_info 写入的SDT表信息。 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author lim @date 2020/04/16 +************************************************************/ +DPP_STATUS dpp_soft_sdt_tbl_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 sdt_no, + ZXIC_UINT32 table_type, + DPP_SDT_TBL_DATA_T *p_sdt_info) +{ + DPP_STATUS rc = 0; + + ZXIC_COMM_CHECK_INDEX(dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX(sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + ZXIC_COMM_CHECK_POINT(p_sdt_info); + + /* 将table_type存储到软件缓存中 */ + g_table_type[dev_id][sdt_no] = table_type; + + /* 保存sdt信息 */ + g_sdt_info[dev_id][sdt_no].data_high32 = p_sdt_info->data_high32; + g_sdt_info[dev_id][sdt_no].data_low32 = p_sdt_info->data_low32; + + return rc; +} + +/***********************************************************/ +/** 从软件缓存中获取sdt信息 +* @param device_id 设备号 +* @param sdt_no 业务表对应的sdt号 +* @param p_sdt_info 写入的SDT属性。由table_type确定此ZXIC_VOID型指针对应的数据结构, 包括: \n +* DPP_SDTTBL_ERAM_T、DPP_SDTTBL_DDR_T、DPP_SDTTBL_HASH_T、DPP_SDTTBL_LPM_T、 +* DPP_SDTTBL_ETCAM_T。 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author lim @date 2020/04/16 +************************************************************/ +DPP_STATUS dpp_soft_sdt_tbl_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 sdt_no, ZXIC_VOID *p_sdt_info) +{ + DPP_STATUS rc = 0; + + DPP_SDT_TBL_DATA_T sdt_tbl = {0}; + + ZXIC_COMM_CHECK_INDEX(dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX(sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + ZXIC_COMM_CHECK_POINT(p_sdt_info); + + /** 从软件缓存读取sdt信息 */ + rc = dpp_sdt_tbl_data_get(dev_id, sdt_no, &sdt_tbl); + ZXIC_COMM_CHECK_RC(rc, "dpp_sdt_tbl_data_get"); + + rc = dpp_sdt_tbl_data_parser(dev_id, sdt_tbl.data_high32, sdt_tbl.data_low32, p_sdt_info); + ZXIC_COMM_CHECK_RC(rc, "dpp_sdt_tbl_data_parser"); + + return rc; +} + +/***********************************************************/ +/** 写SDT属性表条目到硬件表,同时向8个cluster写入 +* @param dev_id 设备号 +* @param sdt_no 业务表对应的sdt号 +* @param table_type SDT属性中的表类型,取值参考DPP_SDT_TABLE_TYPE_E的定义(仅添加操作时有效) +* @param p_sdt_info 写入的SDT属性(仅添加操作时有效)。由table_type确定此ZXIC_VOID型指针对应的数据结构, 包括: \n +* DPP_SDTTBL_ERAM_T、DPP_SDTTBL_DDR_T、DPP_SDTTBL_HASH_T、DPP_SDTTBL_LPM_T、\n +* DPP_SDTTBL_ETCAM_T、DPP_SDTTBL_PORTTBL_T。 +* @param opr_type 操作类型: 0-添加条目,1-删除条目. +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 王春雷 @date 2015/07/11 +************************************************************/ +DPP_STATUS dpp_sdt_tbl_write(DPP_DEV_T *dev, + ZXIC_UINT32 sdt_no, + ZXIC_UINT32 table_type, + ZXIC_VOID *p_sdt_info, + ZXIC_UINT32 opr_type) +{ +#ifdef DPP_FLOW_HW_INIT + ZXIC_UINT32 i = 0; +#endif + DPP_STATUS rtn = 0; + DPP_SDT_TBL_DATA_T sdt_tbl = {0}; + DPP_SDTTBL_ERAM_T *p_sdt_eram = NULL; + DPP_SDTTBL_DDR3_T *p_sdt_ddr3 = NULL; + DPP_SDTTBL_HASH_T *p_sdt_hash = NULL; + DPP_SDTTBL_LPM_T *p_sdt_lpm = NULL; + DPP_SDTTBL_ETCAM_T *p_sdt_etcam = NULL; + DPP_SDTTBL_PORTTBL_T *p_sdt_porttbl = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + + /* 根据表类型解析数据 */ + if (opr_type) + { + /* delete sdt item */ + rtn = dpp_sdt_mgr_sdt_item_del(DEV_ID(dev), sdt_no); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_sdt_mgr_sdt_item_del"); + } + else + { + /* add sdt item*/ + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_sdt_info); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), table_type, DPP_SDT_TBLT_eRAM, DPP_SDT_TBLT_PORTTBL); + + switch (table_type) + { + case DPP_SDT_TBLT_eRAM: + { + p_sdt_eram = (DPP_SDTTBL_ERAM_T *)p_sdt_info; + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, p_sdt_eram->eram_mode, DPP_SDT_H_ERAM_MODE_BT_POS, DPP_SDT_H_ERAM_MODE_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, p_sdt_eram->eram_base_addr, DPP_SDT_H_ERAM_BASE_ADDR_BT_POS, DPP_SDT_H_ERAM_BASE_ADDR_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, p_sdt_eram->eram_table_depth, DPP_SDT_L_ERAM_TABLE_DEPTH_BT_POS, DPP_SDT_L_ERAM_TABLE_DEPTH_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, p_sdt_eram->eram_clutch_en, DPP_SDT_L_CLUTCH_EN_BT_POS, DPP_SDT_L_CLUTCH_EN_BT_LEN); + break; + } + + case DPP_SDT_TBLT_DDR3: + { + p_sdt_ddr3 = (DPP_SDTTBL_DDR3_T *)p_sdt_info; + + /** 添加操作必须保证sdt号和ddr存储的sdt号一致 */ + ZXIC_COMM_ASSERT(sdt_no == p_sdt_ddr3->ddr3_sdt_num ); + + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, p_sdt_ddr3->ddr3_base_addr, DPP_SDT_H_DDR3_BASE_ADDR_BT_POS, DPP_SDT_H_DDR3_BASE_ADDR_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, p_sdt_ddr3->ddr3_share_type, DPP_SDT_H_DDR3_SHARE_TYPE_BT_POS, DPP_SDT_H_DDR3_SHARE_TYPE_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, p_sdt_ddr3->ddr3_rw_len, DPP_SDT_H_DDR3_RW_LEN_BT_POS, DPP_SDT_H_DDR3_RW_LEN_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, + ((p_sdt_ddr3->ddr3_sdt_num) >> DPP_SDT_L_DDR3_SDT_NUM_BT_LEN), + DPP_SDT_H_DDR3_SDT_NUM_BT_POS, + DPP_SDT_H_DDR3_SDT_NUM_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, + DPP_SDT_GET_LOW_DATA((p_sdt_ddr3->ddr3_sdt_num), DPP_SDT_L_DDR3_SDT_NUM_BT_LEN), + DPP_SDT_L_DDR3_SDT_NUM_BT_POS, + DPP_SDT_L_DDR3_SDT_NUM_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, p_sdt_ddr3->ddr3_ecc_en, DPP_SDT_L_DDR3_ECC_EN_BT_POS, DPP_SDT_L_DDR3_ECC_EN_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, p_sdt_ddr3->ddr3_clutch_en, DPP_SDT_L_CLUTCH_EN_BT_POS, DPP_SDT_L_CLUTCH_EN_BT_LEN); + break; + } + + case DPP_SDT_TBLT_HASH: + { + p_sdt_hash = (DPP_SDTTBL_HASH_T *)p_sdt_info; + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, p_sdt_hash->hash_id, DPP_SDT_H_HASH_ID_BT_POS, DPP_SDT_H_HASH_ID_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, p_sdt_hash->hash_table_width, DPP_SDT_H_HASH_TABLE_WIDTH_BT_POS, DPP_SDT_H_HASH_TABLE_WIDTH_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, p_sdt_hash->key_size, DPP_SDT_H_HASH_KEY_SIZE_BT_POS, DPP_SDT_H_HASH_KEY_SIZE_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, p_sdt_hash->hash_table_id, DPP_SDT_H_HASH_TABLE_ID_BT_POS, DPP_SDT_H_HASH_TABLE_ID_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, p_sdt_hash->learn_en, DPP_SDT_H_LEARN_EN_BT_POS, DPP_SDT_H_LEARN_EN_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, p_sdt_hash->keep_alive, DPP_SDT_H_KEEP_ALIVE_BT_POS, DPP_SDT_H_KEEP_ALIVE_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, + ((p_sdt_hash->keep_alive_baddr) >> DPP_SDT_L_KEEP_ALIVE_BADDR_BT_LEN), + DPP_SDT_H_KEEP_ALIVE_BADDR_BT_POS, + DPP_SDT_H_KEEP_ALIVE_BADDR_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, + DPP_SDT_GET_LOW_DATA((p_sdt_hash->keep_alive_baddr), DPP_SDT_L_KEEP_ALIVE_BADDR_BT_LEN), + DPP_SDT_L_KEEP_ALIVE_BADDR_BT_POS, + DPP_SDT_L_KEEP_ALIVE_BADDR_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, p_sdt_hash->rsp_mode, DPP_SDT_L_RSP_MODE_BT_POS, DPP_SDT_L_RSP_MODE_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, p_sdt_hash->hash_clutch_en, DPP_SDT_L_CLUTCH_EN_BT_POS, DPP_SDT_L_CLUTCH_EN_BT_LEN); + break; + } + + case DPP_SDT_TBLT_LPM: + { + p_sdt_lpm = (DPP_SDTTBL_LPM_T *)p_sdt_info; + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, p_sdt_lpm->lpm_v46_id, DPP_SDT_H_LPM_V46ID_BT_POS, DPP_SDT_H_LPM_V46ID_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, p_sdt_lpm->rsp_mode, DPP_SDT_H_LPM_RSP_MODE_BT_POS, DPP_SDT_H_LPM_RSP_MODE_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, p_sdt_lpm->lpm_table_depth, DPP_SDT_L_LPM_TABLE_DEPTH_BT_POS, DPP_SDT_L_LPM_TABLE_DEPTH_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, p_sdt_lpm->lpm_clutch_en, DPP_SDT_L_CLUTCH_EN_BT_POS, DPP_SDT_L_CLUTCH_EN_BT_LEN); + break; + } + + case DPP_SDT_TBLT_eTCAM: + { + p_sdt_etcam = (DPP_SDTTBL_ETCAM_T *)p_sdt_info; + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, p_sdt_etcam->etcam_id, DPP_SDT_H_ETCAM_ID_BT_POS, DPP_SDT_H_ETCAM_ID_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, p_sdt_etcam->etcam_key_mode, DPP_SDT_H_ETCAM_KEY_MODE_BT_POS, DPP_SDT_H_ETCAM_KEY_MODE_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, p_sdt_etcam->etcam_table_id, DPP_SDT_H_ETCAM_TABLE_ID_BT_POS, DPP_SDT_H_ETCAM_TABLE_ID_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, p_sdt_etcam->no_as_rsp_mode, DPP_SDT_H_ETCAM_NOAS_RSP_MODE_BT_POS, DPP_SDT_H_ETCAM_NOAS_RSP_MODE_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, p_sdt_etcam->as_en, DPP_SDT_H_ETCAM_AS_EN_BT_POS, DPP_SDT_H_ETCAM_AS_EN_BT_LEN); + + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, + ((p_sdt_etcam->as_eram_baddr) >> DPP_SDT_L_ETCAM_AS_ERAM_BADDR_BT_LEN), + DPP_SDT_H_ETCAM_AS_ERAM_BADDR_BT_POS, + DPP_SDT_H_ETCAM_AS_ERAM_BADDR_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, + DPP_SDT_GET_LOW_DATA((p_sdt_etcam->as_eram_baddr), DPP_SDT_L_ETCAM_AS_ERAM_BADDR_BT_LEN), + DPP_SDT_L_ETCAM_AS_ERAM_BADDR_BT_POS, + DPP_SDT_L_ETCAM_AS_ERAM_BADDR_BT_LEN); + + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, p_sdt_etcam->as_rsp_mode, DPP_SDT_L_ETCAM_AS_RSP_MODE_BT_POS, DPP_SDT_L_ETCAM_AS_RSP_MODE_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, p_sdt_etcam->etcam_table_depth, DPP_SDT_L_ETCAM_TABLE_DEPTH_BT_POS, DPP_SDT_L_ETCAM_TABLE_DEPTH_BT_LEN); + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, p_sdt_etcam->etcam_clutch_en, DPP_SDT_L_CLUTCH_EN_BT_POS, DPP_SDT_L_CLUTCH_EN_BT_LEN); + break; + } + + case DPP_SDT_TBLT_PORTTBL: + { + p_sdt_porttbl = (DPP_SDTTBL_PORTTBL_T *)p_sdt_info; + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, p_sdt_porttbl->porttbl_clutch_en, DPP_SDT_L_CLUTCH_EN_BT_POS, DPP_SDT_L_CLUTCH_EN_BT_LEN); + break; + } + + default: + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "SDT table_type[ %d ] is invalid!\n", table_type); + return DPP_ERR; + } + } + + ZXIC_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, table_type, DPP_SDT_H_TBL_TYPE_BT_POS, DPP_SDT_H_TBL_TYPE_BT_LEN); + + /* 将sdt信息存储到软件缓存中 */ + dpp_soft_sdt_tbl_set(DEV_ID(dev), sdt_no, table_type, &sdt_tbl); + + /* 缓存到软件 */ + rtn = dpp_sdt_mgr_sdt_item_add(DEV_ID(dev), sdt_no, sdt_tbl.data_high32, sdt_tbl.data_low32); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_sdt_mgr_sdt_item_add"); + } +#ifdef DPP_FLOW_HW_INIT + for (i = 0; i < DPP_PPU_CLUSTER_NUM; i++) + { + /*cluster 未启用,不需要配置该cluster相关的寄存器*/ + if (!dpp_ppu_cls_use_get(DEV_ID(dev), i)) + { + continue; + } + + rtn = dpp_ppu_sdt_tbl_write(dev, i, sdt_no, &sdt_tbl); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_ppu_sdt_tbl_write"); + } +#endif + return DPP_OK; +} + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/sdt/dpp_sdt_mgr.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/sdt/dpp_sdt_mgr.c new file mode 100755 index 0000000..1fb381c --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/sdt/dpp_sdt_mgr.c @@ -0,0 +1,739 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_sdt_mgr.c +* 文件标识 : +* 内容摘要 : SDT属性软件缓存,以及接收上层配置并下发给底层设备 +* 其它说明 : +* 当前版本 : +* 作 者 : 王春雷 +* 完成日期 : 2015/06/25 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#include "zxic_common.h" + +#include "dpp_dev.h" +#include "dpp_sdt_def.h" +#include "dpp_sdt.h" +#include "dpp_sdt_mgr.h" +#include "dpp_se_api.h" + +static DPP_SDT_MGR_T g_sdt_mgr = {0}; + +static ZXIC_UINT32 g_sdt_mgr_debug = 1; + +#define DPP_SDT_MGR_PTR_GET() (&g_sdt_mgr) + +#define DPP_SDT_SOFT_TBL_GET(id) (g_sdt_mgr.sdt_tbl_array[id]) + +ZXIC_UINT32 dpp_sdt_mgr_init(ZXIC_VOID) +{ + if (!g_sdt_mgr.is_init) + { + g_sdt_mgr.channel_num = 0; + g_sdt_mgr.is_init = 1; + // g_sdt_mgr.p_sdt_mgr_smmu0_mux = dpp_tbl_dir_sdt_smmu0_mux; + // g_sdt_mgr.p_sdt_mgr_smmu1_mux = dpp_tbl_dir_sdt_smmu1_mux; + // g_sdt_mgr.p_sdt_mgr_hash_mux = dpp_tbl_dir_sdt_hash_mux; + // g_sdt_mgr.p_sdt_mgr_lpm_mux = dpp_tbl_dir_sdt_lpm_mux; + // g_sdt_mgr.p_sdt_mgr_etcam_mux = dpp_tbl_dir_sdt_etcam_mux; + ZXIC_COMM_MEMSET(g_sdt_mgr.sdt_tbl_array, 0, DPP_DEV_CHANNEL_MAX * sizeof(DPP_SDT_SOFT_TABLE_T *)); + } + + return DPP_OK; +} + +ZXIC_UINT32 dpp_sdt_mgr_create(ZXIC_UINT32 dev_id) +{ + DPP_SDT_SOFT_TABLE_T *p_sdt_tbl_temp = NULL; + DPP_SDT_MGR_T *p_sdt_mgr = NULL; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + + p_sdt_mgr = DPP_SDT_MGR_PTR_GET(); + + if (DPP_SDT_SOFT_TBL_GET(dev_id) == NULL) + { + p_sdt_tbl_temp = ZXIC_COMM_MALLOC(sizeof(DPP_SDT_SOFT_TABLE_T)); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_sdt_tbl_temp); /* mod for KW_0411 # 474 */ + + p_sdt_tbl_temp->device_id = dev_id; + ZXIC_COMM_MEMSET(p_sdt_tbl_temp->sdt_array, 0, DPP_DEV_SDT_ID_MAX * sizeof(DPP_SDT_ITEM_T)); + + DPP_SDT_SOFT_TBL_GET(dev_id) = p_sdt_tbl_temp; + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(dev_id, p_sdt_mgr->channel_num, 1); + p_sdt_mgr->channel_num++; + } + else + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "Error: dpp_sdt_mgr_create for dev[%d] is called repeatedly!\n", dev_id); + } + + return DPP_OK; +} + +ZXIC_UINT32 dpp_sdt_mgr_destroy(ZXIC_UINT32 dev_id) +{ + DPP_SDT_SOFT_TABLE_T *p_sdt_tbl_temp = NULL; + DPP_SDT_MGR_T *p_sdt_mgr = NULL; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + + p_sdt_tbl_temp = DPP_SDT_SOFT_TBL_GET(dev_id); + p_sdt_mgr = DPP_SDT_MGR_PTR_GET(); + + if (NULL != p_sdt_tbl_temp) + { + ZXIC_COMM_FREE(p_sdt_tbl_temp); + } + + DPP_SDT_SOFT_TBL_GET(dev_id) = NULL; + + ZXIC_COMM_CHECK_DEV_INDEX_SUB_OVERFLOW_NO_ASSERT(dev_id, p_sdt_mgr->channel_num, 1); + p_sdt_mgr->channel_num--; + + return DPP_OK; +} + + +#if 1 +/***********************************************************/ +/** 向软件缓存中添加SDT表条目 +* @param dev_id 设备号 +* @param sdt_no 业务表对应的sdt号 +* @param sdt_hig32 SDT属性高32bit +* @param sdt_low32 SDT属性低32bit +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 王春雷 @date 2015/07/13 +************************************************************/ +DPP_STATUS dpp_sdt_mgr_sdt_item_add(ZXIC_UINT32 dev_id, ZXIC_UINT32 sdt_no, ZXIC_UINT32 sdt_hig32, ZXIC_UINT32 sdt_low32) +{ + DPP_SDT_SOFT_TABLE_T *p_sdt_soft_tbl = NULL; + DPP_SDT_ITEM_T *p_sdt_item = NULL; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + + p_sdt_soft_tbl = DPP_SDT_SOFT_TBL_GET(dev_id); + + if (NULL == p_sdt_soft_tbl) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "Error: dpp_sdt_mgr_sdt_item_add soft sdt table not Init! \n"); + ZXIC_COMM_ASSERT(0); + return DPP_RC_TABLE_SDT_MGR_INVALID; + } + + if (dev_id != p_sdt_soft_tbl->device_id) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "Error: dpp_sdt_mgr_sdt_item_add soft sdt table Item Invalid! \n"); + ZXIC_COMM_ASSERT(0); + return DPP_RC_TABLE_PARA_INVALID; + } + + /*添加SDT表项*/ + p_sdt_item = &(p_sdt_soft_tbl->sdt_array[sdt_no]); + p_sdt_item->valid = DPP_SDT_VALID; + p_sdt_item->table_cfg[0] = sdt_hig32; /* hig32 */ + p_sdt_item->table_cfg[1] = sdt_low32; /* low32 */ + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "dpp_sdt_mgr_sdt_item_add 0x%08x 0x%08x \n", p_sdt_item->table_cfg[0], p_sdt_item->table_cfg[1]); + + return DPP_OK; +} + +/***********************************************************/ +/** 从软件缓存中读取SDT表条目 +* @param dev_id 设备号 +* @param sdt_no 业务表对应的sdt号 +* @param p_sdt_hig32 SDT属性高32bit +* @param p_sdt_low32 SDT属性低32bit +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 王春雷 @date 2015/07/13 +************************************************************/ +DPP_STATUS dpp_sdt_mgr_sdt_item_srh(ZXIC_UINT32 dev_id, ZXIC_UINT32 sdt_no, ZXIC_UINT32 *p_sdt_hig32, ZXIC_UINT32 *p_sdt_low32) +{ + DPP_STATUS rc = DPP_OK; + DPP_SDT_SOFT_TABLE_T *p_sdt_soft_tbl = NULL; + DPP_SDT_ITEM_T *p_sdt_item = NULL; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_sdt_hig32); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_sdt_low32); + + p_sdt_soft_tbl = DPP_SDT_SOFT_TBL_GET(dev_id); + + if (NULL == p_sdt_soft_tbl) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "Error: dpp_sdt_mgr_sdt_item_srh Soft Table not Init! \n"); + ZXIC_COMM_ASSERT(0); + return DPP_RC_TABLE_SDT_MGR_INVALID; + } + + if (dev_id != p_sdt_soft_tbl->device_id) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "Error: dpp_sdt_mgr_sdt_item_srh Soft Table Item Invalid ! \n"); + ZXIC_COMM_ASSERT(0); + return DPP_RC_TABLE_PARA_INVALID; + } + + /* 获取SDT表项 */ + p_sdt_item = &p_sdt_soft_tbl->sdt_array[sdt_no]; + + if (DPP_SDT_VALID == p_sdt_item->valid) + { + *p_sdt_hig32 = p_sdt_item->table_cfg[0]; + *p_sdt_low32 = p_sdt_item->table_cfg[1]; + } + else + { + *p_sdt_hig32 = 0xFFFFFFFF; + *p_sdt_low32 = 0xFFFFFFFF; + } + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "dpp_sdt_mgr_sdt_item_srh is %s: sdt_no: 0x%08x sdt_hig32:0x%08x sdt_low32:0x%08x \n", ((DPP_SDT_VALID == p_sdt_item->valid) ? ("success") : ("fail")), sdt_no, *p_sdt_hig32, *p_sdt_low32); + + return rc; +} + +/***********************************************************/ +/** 从软件缓存中删除SDT表条目 +* @param dev_id 设备号 +* @param sdt_no 业务表对应的sdt号 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 王春雷 @date 2015/07/13 +************************************************************/ +DPP_STATUS dpp_sdt_mgr_sdt_item_del(ZXIC_UINT32 dev_id, ZXIC_UINT32 sdt_no) +{ + DPP_SDT_SOFT_TABLE_T *p_sdt_soft_tbl = NULL; + DPP_SDT_ITEM_T *p_sdt_item = NULL; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + + p_sdt_soft_tbl = DPP_SDT_SOFT_TBL_GET(dev_id); + + if (NULL != p_sdt_soft_tbl) + { + if (dev_id != p_sdt_soft_tbl->device_id) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "Error: dpp_sdt_mgr_sdt_item_del Soft Table Item Invalid ! \n"); + ZXIC_COMM_ASSERT(0); + return DPP_RC_TABLE_PARA_INVALID; + } + + p_sdt_item = &p_sdt_soft_tbl->sdt_array[sdt_no]; + p_sdt_item->valid = DPP_SDT_INVALID; + p_sdt_item->table_cfg[0] = 0; + p_sdt_item->table_cfg[1] = 0; + } + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "dpp_sdt_mgr_sdt_item_del sdt_no: 0x%08x \n", sdt_no); + return DPP_OK; +} + +#endif + + +#if 1 +/********************************************************************* + * 函数名称:NpeSdtMgr_GetTblType + * + * 功能描述: + * + * 输入参数: + * 输出参数: + * 返 回 值: + * 全局变量: + * 注 释: + ============================================================ + * 修改记录: + * 修改日期 版本号 修改人 修改内容 + * 20120327 v1.0 石金锋 创建 + ============================================================ + * + *********************************************************************/ +DPP_TBL_TYPE_E dpp_sdt_mgr_get_tbl_type(ZXIC_UINT32 dev_id, ZXIC_UINT32 sdt_no) +{ + ZXIC_UINT32 rtn = 0; + DPP_TBL_TYPE_E table_type = 0; + ZXIC_UINT32 table_cfg[DPP_SDT_CFG_LEN] = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + + rtn = dpp_sdt_mgr_sdt_item_srh(dev_id, sdt_no, &(table_cfg[0]), &(table_cfg[1])); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "dpp_sdt_mgr_sdt_item_srh"); + + table_type = (DPP_TBL_TYPE_E)((table_cfg[0] >> 29) & 0x7); + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "dpp_sdt_mgr_get_tbl_type: dev_id: %d, sdt_no: %d, table_type: %d. \n", dev_id, sdt_no, table_type); + + return table_type; +} + +/********************************************************************* + * 函数名称:NpeDriver_GetAsTableEn + * + * 功能描述: + * + * 输入参数: + * 输出参数: + * 返 回 值: + * 全局变量: + * 注 释: + ============================================================ + * 修改记录: + * 修改日期 版本号 修改人 修改内容 + * 20120829 v1.8 徐东伟 创建 + ============================================================ + * + *********************************************************************/ +ZXIC_UINT32 dpp_sdt_mgr_get_as_table_en(ZXIC_UINT32 *table_cfg, ZXIC_UINT32 *p_as_en) +{ + ZXIC_COMM_CHECK_POINT(table_cfg); + ZXIC_COMM_CHECK_POINT(p_as_en); + + *p_as_en = (table_cfg[0] & 0x00004000) >> 14; + + return DPP_OK; +} + +/********************************************************************* + * 函数名称:NpeDriver_GetAsTableType + * + * 功能描述: + * + * 输入参数: + * 输出参数: + * 返 回 值: + * 全局变量: + * 注 释: + ============================================================ + * 修改记录: + * 修改日期 版本号 修改人 修改内容 + * 20120829 v1.8 徐东伟 创建 + ============================================================ + * + *********************************************************************/ +ZXIC_UINT32 dpp_sdt_mgr_get_as_table_type(ZXIC_UINT32 *table_cfg, DPP_TBL_TYPE_E *p_as_type) +{ + ZXIC_COMM_CHECK_POINT(table_cfg); + ZXIC_COMM_CHECK_POINT(p_as_type); + + *p_as_type = (DPP_TBL_TYPE_E)((table_cfg[0] & 0x00003000) >> 12); + + return DPP_OK; +} + +/********************************************************************* + * 函数名称:NpeDriver_GetDDR3Page + * + * 功能描述: + * + * 输入参数: + * 输出参数: + * 返 回 值: + * 全局变量: + * 注 释: + ============================================================ + * 修改记录: + * 修改日期 版本号 修改人 修改内容 + * 20120829 v1.8 徐东伟 创建 + ============================================================ + * + *********************************************************************/ +ZXIC_UINT32 dpp_sdt_mgr_get_ddr3_page(ZXIC_UINT32 copy_type, ZXIC_UINT32 copy_position, ZXIC_UINT32 *p_page) +{ + ZXIC_COMM_CHECK_POINT(p_page); + + return DPP_OK; +} + +/********************************************************************* + * 函数名称:NpeSdtMgr_SdtSmmu0Print + * + * 功能描述: + * + * 输入参数: + * 输出参数: + * 返 回 值: + * 全局变量: + * 注 释: + ============================================================ + * 修改记录: + * 修改日期 版本号 修改人 修改内容 + * 20120327 v1.0 石金锋 创建 + ============================================================ + * + *********************************************************************/ +ZXIC_VOID dpp_sdt_mgr_sdt_smmu0_print(DPP_SDT_SMMU0_T *p_sdt_smmu0) +{ + if (NULL == p_sdt_smmu0) + { + ZXIC_COMM_TRACE_DEBUG("Error: dpp_sdt_mgr_sdt_smmu0_print Input Parameter Invalid !\n"); + return; + } + + if (g_sdt_mgr_debug) + { + ZXIC_COMM_TRACE_DEBUG("wr_rd_flag: 0x%x\n", p_sdt_smmu0->wr_rd_flag); + ZXIC_COMM_TRACE_DEBUG("tbl_index: 0x%x\n", p_sdt_smmu0->tbl_index); + ZXIC_COMM_TRACE_DEBUG("mode: 0x%x\n", p_sdt_smmu0->mode); + ZXIC_COMM_TRACE_DEBUG("tbl_base_addr:0x%x\n", p_sdt_smmu0->tbl_base_addr); + ZXIC_COMM_TRACE_DEBUG("tbl_depth: 0x%x\n", p_sdt_smmu0->tbl_depth); + ZXIC_COMM_TRACE_DEBUG("p_data: 0x%08x 0x%08x 0x%08x 0x%08x\n", *((ZXIC_UINT32 *)p_sdt_smmu0->p_data + 0), + *((ZXIC_UINT32 *)p_sdt_smmu0->p_data + 1), + *((ZXIC_UINT32 *)p_sdt_smmu0->p_data + 2), + *((ZXIC_UINT32 *)p_sdt_smmu0->p_data + 3)); + } + + return; +} + +/********************************************************************* + * 函数名称:NpeSdtMgr_SdtSmmu1Print + * + * 功能描述: + * + * 输入参数: + * 输出参数: + * 返 回 值: + * 全局变量: + * 注 释: + ============================================================ + * 修改记录: + * 修改日期 版本号 修改人 修改内容 + * 20120327 v1.0 石金锋 创建 + ============================================================ + * + *********************************************************************/ +ZXIC_VOID dpp_sdt_mgr_sdt_smmu1_print(DPP_SDT_SMMU1_T *p_sdt_smmu1) +{ + ZXIC_UINT32 i = 0; + ZXIC_UINT32 mode = 4; + + if (NULL == p_sdt_smmu1) + { + ZXIC_COMM_TRACE_DEBUG("Error: dpp_sdt_mgr_sdt_smmu1_print Input Parameter Invalid !\n"); + return; + } + + if (g_sdt_mgr_debug) + { + ZXIC_COMM_TRACE_DEBUG("dwdwCrcChkEn: 0x%x\n", p_sdt_smmu1->crc_chk_en); + ZXIC_COMM_TRACE_DEBUG("wr_rd_flag: 0x%x\n", p_sdt_smmu1->wr_rd_flag); + ZXIC_COMM_TRACE_DEBUG("tbl_index: 0x%x\n", p_sdt_smmu1->tbl_index); + ZXIC_COMM_TRACE_DEBUG("tbl_base_addr: 0x%x\n", p_sdt_smmu1->tbl_base_addr); + ZXIC_COMM_TRACE_DEBUG("ddr_share_type: 0x%x\n", p_sdt_smmu1->ddr_share_type); + ZXIC_COMM_TRACE_DEBUG("ddr_mode: 0x%x\n", p_sdt_smmu1->ddr_mode); + + ZXIC_COMM_TRACE_DEBUG("p_data:"); + + if (0 != p_sdt_smmu1->ddr_mode) + { + mode = 8; + } + + for (i = 0; i < mode; i++) + { + ZXIC_COMM_TRACE_DEBUG("0x%08x ", *((ZXIC_UINT32 *)p_sdt_smmu1->p_data + i)); + } + + ZXIC_COMM_TRACE_DEBUG("\n"); + } + + return; +} + +/********************************************************************* + * 函数名称:NpeSdtMgr_SdtHashPrint + * + * 功能描述: + * + * 输入参数: + * 输出参数: + * 返 回 值: + * 全局变量: + * 注 释: + ============================================================ + * 修改记录: + * 修改日期 版本号 修改人 修改内容 + * 20120327 v1.0 石金锋 创建 + ============================================================ + * + *********************************************************************/ +ZXIC_VOID dpp_sdt_mgr_sdt_hash_print(DPP_SDT_HASH_T *p_sdt_hash) +{ + ZXIC_UINT32 i = 0; + + if (NULL == p_sdt_hash) + { + ZXIC_COMM_TRACE_DEBUG("Error: dpp_sdt_mgr_sdt_hash_print Input Parameter Invalid !\n"); + return; + } + + if (g_sdt_mgr_debug) + { + ZXIC_COMM_TRACE_DEBUG("addr:0x%x\n", p_sdt_hash->addr); + ZXIC_COMM_TRACE_DEBUG("length:%d\n", p_sdt_hash->length); + ZXIC_COMM_TRACE_DEBUG("hash_id:%d\n", p_sdt_hash->id); + ZXIC_COMM_TRACE_DEBUG("table_id:%d\n", p_sdt_hash->tbl_id); + ZXIC_COMM_TRACE_DEBUG("hash_tbl_width:%d\n", p_sdt_hash->key_type); + ZXIC_COMM_TRACE_DEBUG("hash_key_size:%d\n", p_sdt_hash->key_size); + ZXIC_COMM_TRACE_DEBUG("rsp_mode:%d\n", p_sdt_hash->rsp_mode); + + ZXIC_COMM_TRACE_DEBUG("p_data:"); + + for (i = 0; i < p_sdt_hash->length; i++) + { + ZXIC_COMM_TRACE_DEBUG("0x%08x ", *((ZXIC_UINT32 *)p_sdt_hash->p_data + i)); + } + + ZXIC_COMM_TRACE_DEBUG("\n"); + } + + return; +} + +/***********************************************************/ +/** +* @param p_sdt_lpm +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/06/16 +************************************************************/ +ZXIC_VOID dpp_sdt_mgr_sdt_etcam_print(DPP_SDT_ETCAM_T *p_sdt_etcam) +{ + ZXIC_UINT32 i = 0; + + if (NULL == p_sdt_etcam) + { + ZXIC_COMM_TRACE_DEBUG("Error: dpp_sdt_mgr_sdt_etcam_print Input Parameter Invalid !\n"); + return; + } + + if (g_sdt_mgr_debug) + { + ZXIC_COMM_TRACE_DEBUG("table_id :0x%x\n", p_sdt_etcam->tbl_id); + ZXIC_COMM_TRACE_DEBUG("addr :0x%x\n", p_sdt_etcam->addr); + ZXIC_COMM_TRACE_DEBUG("key_mode :%d\n", p_sdt_etcam->key_mode); + ZXIC_COMM_TRACE_DEBUG("rsp_mode :%d\n", p_sdt_etcam->rsp_mode); + ZXIC_COMM_TRACE_DEBUG("length :%d\n", p_sdt_etcam->length); + ZXIC_COMM_TRACE_DEBUG("as_en :%d\n", p_sdt_etcam->as_en); + ZXIC_COMM_TRACE_DEBUG("as_eram_baddr :0x%x\n", p_sdt_etcam->as_eram_baddr); + ZXIC_COMM_TRACE_DEBUG("as_rsp_mode :%d\n", p_sdt_etcam->as_rsp_mode); + ZXIC_COMM_TRACE_DEBUG("p_data :"); + + for (i = 0; i < p_sdt_etcam->length; i++) + { + ZXIC_COMM_TRACE_DEBUG("0x%08x ", *((ZXIC_UINT32 *)p_sdt_etcam->p_data + i)); + } + + ZXIC_COMM_TRACE_DEBUG("\n"); + } + + return; +} + +/********************************************************************* + * 函数名称:NpeDriver_GetEram128Params + * + * 功能描述: + * + * 输入参数: + * 输出参数: + * 返 回 值: + * 全局变量: + * 注 释: + ============================================================ + * 修改记录: + * 修改日期 版本号 修改人 修改内容 + * 20120924 v1.0 石金锋/徐东伟 创建 + ============================================================ + * + *********************************************************************/ +ZXIC_UINT32 dpp_sdt_mgr_get_eram128_params(ZXIC_UINT32 dev_id, ZXIC_UINT32 table_id, DPP_ERAM128_PARAMS_T *p_eram128_params) +{ + ZXIC_UINT32 rtn = 0; + ZXIC_UINT32 table_cfg[DPP_SDT_CFG_LEN] = {0}; + DPP_ERAM128_MODE_E e128Mode = 0; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, table_id, 0, DPP_DEV_SDT_ID_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_eram128_params); + + rtn = dpp_sdt_mgr_sdt_item_srh(dev_id, table_id, &(table_cfg[0]), &(table_cfg[1])); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "dpp_sdt_mgr_sdt_item_srh"); + + /** modify By LiuShuo @2016年2月25日10:01:31*/ + e128Mode = (DPP_ERAM128_MODE_E)((table_cfg[0] & 0x1c000000) >> 26); + p_eram128_params->tbl_base_addr = ((table_cfg[0] & 0x003FFFF80) >> 7); + p_eram128_params->tbl_depth = ((table_cfg[1] & 0x00007FFFE) >> 1); + p_eram128_params->eram128_mode = e128Mode; + + switch (p_eram128_params->eram128_mode) + { + case Eram128Mode_1BITS: + case Eram128Mode_2BITS: + case Eram128Mode_4BITS: + case Eram128Mode_8BITS: + case Eram128Mode_16BITS: + case Eram128Mode_32BITS: + { + p_eram128_params->count = 1; + break; + } + + case Eram128Mode_64BITS: + { + p_eram128_params->count = 2; + break; + } + + default: + { + p_eram128_params->count = 4; /* eRam默认写4个32bit */ + } + } + + return DPP_OK; +} + +/********************************************************************* + * 函数名称:NpeSdtMgr_GetDDR3Params + * + * 功能描述: + * + * 输入参数: + * 输出参数: + * 返 回 值: + * 全局变量: + * 注 释: + ============================================================ + * 修改记录: + * 修改日期 版本号 修改人 修改内容 + * 20120911 v1.8 徐东伟 创建 + ============================================================ + * + *********************************************************************/ +ZXIC_UINT32 dpp_sdt_mgr_get_ddr3_params(ZXIC_UINT32 dev_id, ZXIC_UINT32 table_id, DPP_DDR3_PARAMS_T *p_ddr3_params) +{ + ZXIC_UINT32 rtn = 0; + ZXIC_UINT32 table_cfg[DPP_SDT_CFG_LEN] = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, table_id, 0, DPP_DEV_SDT_ID_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_ddr3_params); + + rtn = dpp_sdt_mgr_sdt_item_srh(dev_id, table_id, &(table_cfg[0]), &(table_cfg[1])); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "dpp_sdt_mgr_sdt_item_srh"); + + p_ddr3_params->base_addr = ((table_cfg[0] & 0x1FFFFE00) >> 9); + p_ddr3_params->tbl_share_mode = ((table_cfg[0] & 0x00000180) >> 7); + p_ddr3_params->ddr3_mode = ((table_cfg[0] & 0x00000060) >> 5); + p_ddr3_params->crc_check = ((table_cfg[1] & 0x10000000) >> 28); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, p_ddr3_params->ddr3_mode, DDR3Mode_128BITS, DDR3Mode_512BITS); + p_ddr3_params->wr_rd_count = 4U << p_ddr3_params->ddr3_mode; /* 根据DDR3模式计算有效数据长度,以4字节为单位 */ + + return DPP_OK; +} + +/********************************************************************* + * 函数名称:NpeDriver_GetHashParams + * + * 功能描述: + * + * 输入参数: + * 输出参数: + * 返 回 值: + * 全局变量: + * 注 释: + ============================================================ + * 修改记录: + * 修改日期 版本号 修改人 修改内容 + * 20120924 v1.0 石金锋/徐东伟 创建 + ============================================================ + * + *********************************************************************/ +ZXIC_UINT32 dpp_sdt_mgr_get_hash_params(ZXIC_UINT32 dev_id, ZXIC_UINT32 table_id, DPP_HASH_PARAMS_T *p_hash_params) +{ + ZXIC_UINT32 rtn = 0; + ZXIC_UINT32 table_cfg[DPP_SDT_CFG_LEN] = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, table_id, 0, DPP_DEV_SDT_ID_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_hash_params); + + rtn = dpp_sdt_mgr_sdt_item_srh(dev_id, table_id, &(table_cfg[0]), &(table_cfg[1])); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "dpp_sdt_mgr_sdt_item_srh"); + + ZXIC_COMM_UINT32_GET_BITS(p_hash_params->hash_id, table_cfg[0], DPP_SDT_H_HASH_ID_BT_POS, DPP_SDT_H_HASH_ID_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_hash_params->key_tbl_width, table_cfg[0], DPP_SDT_H_HASH_TABLE_WIDTH_BT_POS, DPP_SDT_H_HASH_TABLE_WIDTH_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_hash_params->key_size, table_cfg[0], DPP_SDT_H_HASH_KEY_SIZE_BT_POS, DPP_SDT_H_HASH_KEY_SIZE_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_hash_params->table_id, table_cfg[0], DPP_SDT_H_HASH_TABLE_ID_BT_POS, DPP_SDT_H_HASH_TABLE_ID_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_hash_params->rsp_mode, table_cfg[1], DPP_SDT_L_RSP_MODE_BT_POS, DPP_SDT_L_RSP_MODE_BT_LEN); + return DPP_OK; +} + +/********************************************************************* + * 函数名称:NpeDriver_GetTcamParams + * + * 功能描述: + * + * 输入参数: + * 输出参数: + * 返 回 值: + * 全局变量: + * 注 释: + ============================================================ + * 修改记录: + * 修改日期 版本号 修改人 修改内容 + * 20120924 v1.0 石金锋/徐东伟 创建 + ============================================================ + * + *********************************************************************/ +ZXIC_UINT32 dpp_sdt_mgr_get_etcam_params(ZXIC_UINT32 dev_id, ZXIC_UINT32 table_id, DPP_ETCAM_PARAMS_T *p_etcam_params) +{ + ZXIC_UINT32 rtn = 0; + ZXIC_UINT32 table_cfg[DPP_SDT_CFG_LEN] = {0}; + ZXIC_UINT32 temp = 0; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, table_id, 0, DPP_DEV_SDT_ID_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_etcam_params); + + rtn = dpp_sdt_mgr_sdt_item_srh(dev_id, table_id, &(table_cfg[0]), &(table_cfg[1])); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "dpp_sdt_mgr_sdt_item_srh"); + + ZXIC_COMM_UINT32_GET_BITS(p_etcam_params->id, table_cfg[0], DPP_SDT_H_ETCAM_ID_BT_POS, DPP_SDT_H_ETCAM_ID_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_etcam_params->key_mode, table_cfg[0], DPP_SDT_H_ETCAM_KEY_MODE_BT_POS, DPP_SDT_H_ETCAM_KEY_MODE_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_etcam_params->table_id, table_cfg[0], DPP_SDT_H_ETCAM_TABLE_ID_BT_POS, DPP_SDT_H_ETCAM_TABLE_ID_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_etcam_params->rsp_mode, table_cfg[0], DPP_SDT_H_ETCAM_NOAS_RSP_MODE_BT_POS, DPP_SDT_H_ETCAM_NOAS_RSP_MODE_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_etcam_params->as_en, table_cfg[0], DPP_SDT_H_ETCAM_AS_EN_BT_POS, DPP_SDT_H_ETCAM_AS_EN_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(p_etcam_params->as_baddr, table_cfg[0], DPP_SDT_H_ETCAM_AS_ERAM_BADDR_BT_POS, DPP_SDT_H_ETCAM_AS_ERAM_BADDR_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(temp, table_cfg[1], DPP_SDT_L_ETCAM_AS_ERAM_BADDR_BT_POS, DPP_SDT_L_ETCAM_AS_ERAM_BADDR_BT_LEN); + p_etcam_params->as_baddr = (p_etcam_params->as_baddr << DPP_SDT_L_ETCAM_AS_ERAM_BADDR_BT_LEN) + temp; + ZXIC_COMM_UINT32_GET_BITS(p_etcam_params->as_rsp_mode, table_cfg[1], DPP_SDT_L_ETCAM_AS_RSP_MODE_BT_POS, DPP_SDT_L_ETCAM_AS_RSP_MODE_BT_LEN); + + return DPP_OK; +} + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/Kbuild.include new file mode 100644 index 0000000..3170968 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/Kbuild.include @@ -0,0 +1,2 @@ +cur_dir := en_np/sdk/source/dev/module/table/se/ +src_files += $(addprefix $(cur_dir),$(notdir $(wildcard $(dinghai_root)/$(cur_dir)*.c))) diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/dpp_acl.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/dpp_acl.c new file mode 100755 index 0000000..0150762 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/dpp_acl.c @@ -0,0 +1,611 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_acl.c +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : 王春雷 +* 完成日期 : 2014/12/17 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#include "zxic_common.h" + +#include "dpp_dev.h" +#include "dpp_acl.h" +#include "dpp_etcam.h" +#include "dpp_se.h" +#include "dpp_se_reg.h" +#include "dpp_reg_api.h" +#include "dpp_reg_info.h" + +#define BLOCK_IDXBASE_BIT_OFF (9) +#define BLOCK_IDXBASE_BIT_MASK (0x7f) +#define ACL_AS_IDX_OFFSET_MAX (32 * 1024) +#define ACL_IMPLICIT_PRI (0) + +#define DPP_ACL_KEYSIZE_GET(key_mode) (2 * DPP_ETCAM_ENTRY_SIZE_GET(key_mode)) +#define DPP_ACL_ENTRY_WRMODE_GET(key_mode, entry_pos) \ + ((((1U << (8U >> (key_mode))) - 1) << ((8U >> (key_mode)) * (entry_pos))) & 0xFF) + +#define DPP_ACL_AS_RSLT_INFO_GET(buff_base, index, size) \ + (((ZXIC_UINT8 *)(buff_base) + (index) * (size))) + +#define MEM_OFF_NOT_NULL(type,member) \ + (ZXIC_COMM_PTR_TO_VAL(&(((type*)4)->member)) - ZXIC_COMM_PTR_TO_VAL(((type*)4))) + +/*根据当前双链表的指针,找到本节点的指针*/ +#define GET_STRUCT_ENTRY_POINT(ptr, type, member) \ + ((type *)(ZXIC_COMM_PTR_TO_VAL(ptr)-MEM_OFF_NOT_NULL(type,member))) + +static DPP_ACL_CFG_EX_T *g_p_acl_ex_cfg = NULL; + +/***********************************************************/ +/** 根据业务表总条目数计数需要的block数 +* @param entry_num +* @param key_mode +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/12/23 +************************************************************/ +ZXIC_UINT32 dpp_acl_entrynum_to_blocknum(ZXIC_UINT32 entry_num, ZXIC_UINT32 key_mode) +{ + ZXIC_UINT32 value = 0; + + ZXIC_COMM_CHECK_INDEX_MUL_OVERFLOW_NO_ASSERT(DPP_ETCAM_RAM_DEPTH, ((ZXIC_UINT32)1 << key_mode)); + value = entry_num % (DPP_ETCAM_RAM_DEPTH * ((ZXIC_UINT32)1 << key_mode)); + + if (value == 0) + { + return (entry_num / (DPP_ETCAM_RAM_DEPTH * ((ZXIC_UINT32)1 << key_mode))); + } + else + { + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(entry_num / (DPP_ETCAM_RAM_DEPTH * ((ZXIC_UINT32)1 << key_mode)), 1); + return (entry_num / (DPP_ETCAM_RAM_DEPTH * ((ZXIC_UINT32)1 << key_mode)) + 1); + } +} + +/***********************************************************/ +/** 优先级比较函数,用于显示优先级模式比较优先级 +* @param p_new_key +* @param p_old_key +* @param key_len +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/12/24 +************************************************************/ +ZXIC_SINT32 dpp_acl_entry_pri_cmp(void *p_new_key, void *p_old_key, ZXIC_UINT32 key_len) +{ + if ((*(ZXIC_UINT32 *)p_new_key) > (*(ZXIC_UINT32 *)p_old_key)) + { + return 1; + } + else if ((*(ZXIC_UINT32 *)p_new_key) < (*(ZXIC_UINT32 *)p_old_key)) + { + return -1; + } + + return 0; +} + +/***********************************************************/ +/** 本地缓存acl键值比较,用于rb树回调 +* @param p_new_key +* @param p_old_key +* @param key_len +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/12/23 +************************************************************/ +ZXIC_SINT32 dpp_acl_key_cmp(void *p_new_key, void *p_old_key, ZXIC_UINT32 key_len) +{ + ZXIC_COMM_CHECK_POINT(p_new_key); + ZXIC_COMM_CHECK_POINT(p_old_key); + /* 相同data+mask,但优先级不同,则为两个不同条目,因此软件需要比较pri+data+mask, handle不参与比较 */ + ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW_NO_ASSERT(key_len, (ZXIC_UINT32)ZXIC_SIZEOF(ZXIC_UINT32)); + return ZXIC_COMM_MEMCMP(&(((DPP_ACL_KEY_INFO_T *)p_new_key)->pri), &(((DPP_ACL_KEY_INFO_T *)p_old_key)->pri), key_len - ZXIC_SIZEOF(ZXIC_UINT32)); +} + +/***********************************************************/ +/** 根据业务条目索引计算写etcam硬件的地址 +* @param p_tbl_cfg +* @param handle +* @param p_block_idx +* @param p_addr +* @param p_wr_mask +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/12/23 +************************************************************/ +DPP_STATUS dpp_acl_hdw_addr_get(DPP_ACL_TBL_CFG_T *p_tbl_cfg, ZXIC_UINT32 handle, ZXIC_UINT32 *p_block_idx, ZXIC_UINT32 *p_addr, ZXIC_UINT32 *p_wr_mask) +{ + ZXIC_UINT32 block_entry_num = 0; + ZXIC_UINT32 entry_pos = 0; + ZXIC_COMM_CHECK_POINT(p_tbl_cfg); + ZXIC_COMM_CHECK_POINT(p_block_idx); + ZXIC_COMM_CHECK_POINT(p_addr); + ZXIC_COMM_CHECK_POINT(p_wr_mask); + + block_entry_num = DPP_ACL_ENTRY_MAX_GET(p_tbl_cfg->key_mode, 1); + *p_block_idx = p_tbl_cfg->block_array[handle / block_entry_num]; + *p_addr = (handle % block_entry_num) / (1U << p_tbl_cfg->key_mode); + entry_pos = (handle % block_entry_num) % (1U << p_tbl_cfg->key_mode); + ZXIC_COMM_CHECK_INDEX_MUL_OVERFLOW_NO_ASSERT(entry_pos, 8); + *p_wr_mask = DPP_ACL_ENTRY_WRMODE_GET(p_tbl_cfg->key_mode, entry_pos); + return DPP_OK; +} + +/***********************************************************/ +/** +* @param p_tbl_cfg +* @param handle +* @param p_block_idx +* @param p_addr +* @param p_wr_mask +* +* @return +* @remark 无 +* @see +* @author XXX @date 2019/08/03 +************************************************************/ +DPP_STATUS dpp_acl_hdw_addr_get_ex(DPP_ACL_TBL_CFG_T *p_tbl_cfg, ZXIC_UINT32 handle, ZXIC_UINT32 *p_block_idx, ZXIC_UINT32 *p_addr, ZXIC_UINT32 *p_wr_mask) +{ + ZXIC_UINT32 block_entry_num = 0; + ZXIC_UINT32 entry_pos = 0; + DPP_STATUS rc = DPP_OK; + + if (0 == (p_tbl_cfg && p_block_idx && p_addr && p_wr_mask)) + { + ZXIC_COMM_TRACE_ERROR("\n ICM %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n", __FILE__, __LINE__, __FUNCTION__); + rc = ZXIC_PAR_CHK_POINT_NULL; + return rc; + } + block_entry_num = DPP_ACL_ENTRY_MAX_GET(p_tbl_cfg->key_mode, 1); + *p_block_idx = p_tbl_cfg->block_array[handle / block_entry_num]; + *p_addr = (handle % block_entry_num) / (1U << p_tbl_cfg->key_mode); + entry_pos = (handle % block_entry_num) % (1U << p_tbl_cfg->key_mode); + ZXIC_COMM_CHECK_INDEX_MUL_OVERFLOW_NO_ASSERT(entry_pos, 8); + *p_wr_mask = DPP_ACL_ENTRY_WRMODE_GET(p_tbl_cfg->key_mode, entry_pos); + return rc; +} + +/***********************************************************/ +/** acl重排写硬件回调函数 +* @param old_index +* @param new_index +* @param p_cfg +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/12/23 +************************************************************/ +DPP_STATUS dpp_acl_entry_swap(ZXIC_UINT32 old_index, ZXIC_UINT32 new_index, ZXIC_VOID *p_cfg) +{ + DPP_STATUS rc = 0; + ZXIC_UINT32 block_idx = 0; + ZXIC_UINT32 ram_addr = 0; + ZXIC_UINT32 wr_mask = 0; + ZXIC_UINT8 *p_old_rslt_temp = NULL; + ZXIC_UINT8 *p_new_rslt_temp = NULL; + ZXIC_UINT8 temp_data[DPP_ETCAM_WIDTH_MAX / 8] = {0}; + ZXIC_UINT8 temp_mask[DPP_ETCAM_WIDTH_MAX / 8] = {0}; + DPP_ACL_CFG_T *p_acl_cfg = NULL; + DPP_ACL_TBL_CFG_T *p_tbl_cfg = NULL; + DPP_ACL_KEY_INFO_T *p_acl_key = NULL; + DPP_ETCAM_ENTRY_T etcam_entry = {0}; + + ZXIC_COMM_CHECK_POINT(p_cfg); + + p_tbl_cfg = STRUCT_ENTRY_POINT(p_cfg, DPP_ACL_TBL_CFG_T, index_mng); + ZXIC_COMM_CHECK_INDEX(p_tbl_cfg->table_id, 0, DPP_ACL_TBL_ID_NUM - 1); /* modify coverity yinxh 2021.03.10*/ + p_acl_cfg = GET_STRUCT_ENTRY_POINT(p_tbl_cfg, DPP_ACL_CFG_T, acl_tbls[p_tbl_cfg->table_id]); + + ZXIC_COMM_CHECK_INDEX_UPPER(old_index, p_tbl_cfg->entry_num); /* modify coverity yinxh 2021.03.10*/ + p_acl_key = p_tbl_cfg->acl_key_buff[old_index]; + + etcam_entry.p_data = temp_data; + etcam_entry.p_mask = temp_mask; + etcam_entry.mode = p_tbl_cfg->key_mode; + ZXIC_COMM_CHECK_DEV_INDEX(p_acl_cfg->dev_id, p_tbl_cfg->key_mode, DPP_ACL_KEY_640b, DPP_ACL_KEY_INVALID - 1); /* modify coverity yinxh 2021.03.10*/ + ZXIC_COMM_MEMCPY(etcam_entry.p_data, p_acl_key->key, DPP_ETCAM_ENTRY_SIZE_GET(p_tbl_cfg->key_mode)); + ZXIC_COMM_MEMCPY(etcam_entry.p_mask, p_acl_key->key + DPP_ETCAM_ENTRY_SIZE_GET(p_tbl_cfg->key_mode), DPP_ETCAM_ENTRY_SIZE_GET(p_tbl_cfg->key_mode)); + + /* update new as result */ + if (p_tbl_cfg->as_enable) + { + /* eTcam result table as to eRam. */ + ZXIC_COMM_CHECK_DEV_INDEX(p_acl_cfg->dev_id, p_tbl_cfg->as_mode, DPP_ACL_AS_MODE_16b, DPP_ACL_AS_MODE_INVALID - 1); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(p_acl_cfg->dev_id, old_index, (2U << (p_tbl_cfg->as_mode))); + p_old_rslt_temp = DPP_ACL_AS_RSLT_INFO_GET(p_tbl_cfg->as_rslt_buff, old_index, DPP_ACL_AS_RSLT_SIZE_GET_EX(p_tbl_cfg->as_mode)); + rc = p_acl_cfg->p_as_rslt_write_fun(p_acl_cfg->dev_id, + p_tbl_cfg->as_eRam_base + p_tbl_cfg->as_idx_base, + new_index, + p_tbl_cfg->as_mode, + p_old_rslt_temp); + ZXIC_COMM_CHECK_RC(rc, "acl_as_rslt_write_fun"); + + /* update result buffer */ + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(p_acl_cfg->dev_id, new_index, 2U << p_tbl_cfg->as_mode); + p_new_rslt_temp = DPP_ACL_AS_RSLT_INFO_GET(p_tbl_cfg->as_rslt_buff, new_index, DPP_ACL_AS_RSLT_SIZE_GET_EX(p_tbl_cfg->as_mode)); + ZXIC_COMM_MEMCPY(p_new_rslt_temp, p_old_rslt_temp, (ZXIC_UINT32)DPP_ACL_AS_RSLT_SIZE_GET_EX(p_tbl_cfg->as_mode)); + } + else if (p_tbl_cfg->is_as_ddr) + { + /* eTcam result table as to DDR. */ + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(p_acl_cfg->dev_id, old_index, 2U << p_tbl_cfg->as_mode); + p_old_rslt_temp = DPP_ACL_AS_RSLT_INFO_GET(p_tbl_cfg->as_rslt_buff, old_index, DPP_ACL_AS_RSLT_SIZE_GET_EX(p_tbl_cfg->as_mode)); + + rc = p_tbl_cfg->p_as_ddr_wr_fun(p_acl_cfg->dev_id, + p_tbl_cfg->tbl_type, + p_tbl_cfg->table_id, + p_tbl_cfg->dir_tbl_share_type, + p_tbl_cfg->ddr_baddr, + p_tbl_cfg->ddr_ecc_en, + p_tbl_cfg->idx_offset, + p_tbl_cfg->as_mode, + p_old_rslt_temp); + ZXIC_COMM_CHECK_RC(rc, "acl_as_ddr_rslt_writ_fun"); + + /* update result buffer */ + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(p_acl_cfg->dev_id, new_index, 2U << p_tbl_cfg->as_mode); + p_new_rslt_temp = DPP_ACL_AS_RSLT_INFO_GET(p_tbl_cfg->as_rslt_buff, new_index, DPP_ACL_AS_RSLT_SIZE_GET_EX(p_tbl_cfg->as_mode)); + ZXIC_COMM_MEMCPY(p_new_rslt_temp, p_old_rslt_temp, (ZXIC_UINT32)DPP_ACL_AS_RSLT_SIZE_GET_EX(p_tbl_cfg->as_mode)); + } + + /* add new entry */ + rc = dpp_acl_hdw_addr_get_ex(p_tbl_cfg, new_index, &block_idx, &ram_addr, &wr_mask); + ZXIC_COMM_CHECK_RC(rc, "dpp_acl_hdw_addr_get_ex"); + +#ifdef DPP_FLOW_HW_INIT + rc = dpp_etcam_entry_add(p_acl_cfg->dev, ram_addr, block_idx, wr_mask, DPP_ETCAM_OPR_DM, &etcam_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_etcam_entry_add"); +#endif + + /* delete old entry */ + rc = dpp_acl_hdw_addr_get_ex(p_tbl_cfg, old_index, &block_idx, &ram_addr, &wr_mask); + ZXIC_COMM_CHECK_RC(rc, "dpp_acl_hdw_addr_get_ex"); + +#ifdef DPP_FLOW_HW_INIT + rc = dpp_etcam_entry_del(p_acl_cfg->dev, ram_addr, block_idx, wr_mask); + ZXIC_COMM_CHECK_RC(rc, "dpp_etcam_entry_del"); +#endif + + p_acl_key->handle = new_index; + p_tbl_cfg->acl_key_buff[new_index] = p_acl_key; + + return DPP_OK; +} + +/***********************************************************/ +/** 获取ACL全局配置 +* @param p_acl_cfg ACL公共管理数据结构指针 +* +* @return DPP_OK-成功,DPP_ERR-失败 +************************************************************/ +DPP_STATUS dpp_acl_cfg_get(DPP_ACL_CFG_EX_T **p_acl_cfg) +{ + DPP_STATUS rc = 0; + + if(NULL == g_p_acl_ex_cfg) + { + ZXIC_COMM_TRACE_ERROR("dpp_acl_cfg_get fail, etcam_is not init!\n"); + ZXIC_COMM_ASSERT(0); + return DPP_ACL_RC_ETCAMID_NOT_INIT; + } + + *p_acl_cfg = g_p_acl_ex_cfg; + + return rc; +} + +#if ZXIC_REAL("init_ex MUL_PRI") + +/***********************************************************/ +/** +* @param p_acl_cfg +* @param p_client +* @param flags +* @param p_as_wrt_fun +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wcl @date 2015/12/29 +************************************************************/ +DPP_STATUS dpp_acl_cfg_init_ex(DPP_DEV_T *dev, + DPP_ACL_CFG_EX_T *p_acl_cfg, + ZXIC_VOID *p_client, + ZXIC_UINT32 flags, + ACL_AS_RSLT_WRT_FUNCTION p_as_wrt_fun) +{ + DPP_STATUS rc = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(p_acl_cfg); + + ZXIC_COMM_MEMSET(p_acl_cfg, 0, ZXIC_SIZEOF(DPP_ACL_CFG_EX_T)); + + g_p_acl_ex_cfg = p_acl_cfg; + + p_acl_cfg->p_client = p_client; + // p_acl_cfg->dev_id = (ZXIC_UINT32)(ZXIC_COMM_PTR_TO_VAL(p_acl_cfg->p_client) & 0xFFFFFFFF); + p_acl_cfg->dev_id = DEV_ID(dev); + p_acl_cfg->dev = dev; + p_acl_cfg->flags = flags; + + if (flags & DPP_ACL_FLAG_ETCAM0_EN) + { + p_acl_cfg->acl_etcamids.is_valid = 1; + + /* if (flags & DPP_ACL_FLAG_ETCAM0_AS)*/ + /* {*/ + /* p_acl_cfg->acl_etcamids[0].as_enable = 1;*/ + p_acl_cfg->acl_etcamids.as_eRam_base = 0; + /* }*/ + + rc = zxic_comm_double_link_init(DPP_ACL_TBL_ID_NUM, &(p_acl_cfg->acl_etcamids.tbl_list)); + ZXIC_COMM_CHECK_RC(rc, "zxic_comm_double_link_init"); + } + + if (p_as_wrt_fun == NULL) + { + // p_acl_cfg->p_as_rslt_write_fun = dpp_acl_as_rslt_write; + // p_acl_cfg->p_as_rslt_read_fun = dpp_acl_as_rslt_read; + } + else + { + p_acl_cfg->p_as_rslt_write_fun = p_as_wrt_fun; + } + + return DPP_OK; +} + +/***********************************************************/ +/** acl业务表初始化,注意分配给一个table的多个block_idx + 必须按从小到大的顺序给定。支持多个优先级模式,暂不对外开放。 +* @param p_acl_cfg +* @param table_id +* @param as_enable +* @param entry_num +* @param pri_mode +* @param key_mode +* @param as_mode +* @param block_num +* @param p_block_idx +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/12/23 +************************************************************/ +DPP_STATUS dpp_acl_tbl_init_ex(DPP_ACL_CFG_EX_T *p_acl_cfg, + ZXIC_UINT32 table_id, + ZXIC_UINT32 as_enable, + ZXIC_UINT32 entry_num, + DPP_ACL_PRI_MODE_E pri_mode, + ZXIC_UINT32 key_mode, + DPP_ACL_AS_MODE_E as_mode, + ZXIC_UINT32 as_baddr, + ZXIC_UINT32 block_num, + ZXIC_UINT32 *p_block_idx) +{ + DPP_STATUS rc = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 acl_key_buff_size = 0; + /* ZXIC_UINT32 as_idx_base = 0;*/ + + ZXIC_COMM_CHECK_POINT(p_acl_cfg); + ZXIC_COMM_CHECK_INDEX(table_id, DPP_ACL_TBL_ID_MIN, DPP_ACL_TBL_ID_MAX); + ZXIC_COMM_CHECK_INDEX(as_enable, 0, 1); + ZXIC_COMM_CHECK_INDEX(pri_mode, DPP_ACL_PRI_EXPLICIT, DPP_ACL_PRI_SPECIFY); + ZXIC_COMM_CHECK_INDEX(key_mode, DPP_ACL_KEY_640b, DPP_ACL_KEY_80b); + ZXIC_COMM_CHECK_INDEX(as_mode, DPP_ACL_AS_MODE_16b, DPP_ACL_AS_MODE_128b); + ZXIC_COMM_CHECK_INDEX(block_num, 0, DPP_ETCAM_BLOCK_NUM); + ZXIC_COMM_CHECK_POINT(p_block_idx); + + g_p_acl_ex_cfg = p_acl_cfg; + + if (p_acl_cfg->acl_tbls[table_id].is_used) + { + ZXIC_COMM_TRACE_ERROR("table_id[ %d ] is already used!\n", table_id); + ZXIC_COMM_ASSERT(0); + return DPP_ACL_RC_INVALID_TBLID; + } + + if (!p_acl_cfg->acl_etcamids.is_valid) + { + ZXIC_COMM_TRACE_ERROR("etcam is not init!\n"); + ZXIC_COMM_ASSERT(0); + return DPP_ACL_RC_ETCAMID_NOT_INIT; + } + + if (dpp_acl_entrynum_to_blocknum(entry_num, key_mode) > block_num) + { + ZXIC_COMM_TRACE_ERROR("key_mode[ %d ], the etcam block_num[ %d ] is not enough for entry_num[ 0x%x ].\n", + key_mode, block_num, entry_num); + ZXIC_COMM_ASSERT(0); + return DPP_ACL_RC_INVALID_BLOCKNUM; + } + else if (dpp_acl_entrynum_to_blocknum(entry_num, key_mode) < block_num) + { + ZXIC_COMM_TRACE_DEBUG("key_mode[ %d ], the etcam block_num[ %d ] is more than entry_num[ 0x%x ], better to reduce block_num in order to match with entry_num.\n", + key_mode, block_num, entry_num); + } + else + { + ZXIC_COMM_TRACE_DEBUG("key_mode[ %d ], the etcam block_num[ %d ] is match with entry_num[ 0x%x ].\n", + key_mode, block_num, entry_num); + } + + p_acl_cfg->acl_tbls[table_id].as_enable = as_enable; + + /* + if ((!p_acl_cfg->acl_etcamids[etcam_id].as_enable && as_enable) || + (p_acl_cfg->acl_etcamids[etcam_id].as_enable && !as_enable)) + { + ZXIC_COMM_TRACE_ERROR( "tbl's as_enable is not according to ETCAM_id's.\n"); + ZXIC_COMM_ASSERT(0); + return DPP_ACL_RC_INVALID_PARA; + } + */ + + if (as_enable) + { + p_acl_cfg->acl_tbls[table_id].as_idx_base = as_baddr; + p_acl_cfg->acl_tbls[table_id].as_rslt_buff = ZXIC_COMM_MALLOC(entry_num * DPP_ACL_AS_RSLT_SIZE_GET_EX(as_mode)); + ZXIC_COMM_CHECK_POINT(p_acl_cfg->acl_tbls[table_id].as_rslt_buff); + } + + if ((pri_mode == DPP_ACL_PRI_EXPLICIT) || (pri_mode == DPP_ACL_PRI_IMPLICIT)) + { + rc = (DPP_STATUS)zxic_comm_indexfill_init(&(p_acl_cfg->acl_tbls[table_id].index_mng), + entry_num, + dpp_acl_entry_pri_cmp, + dpp_acl_entry_swap, + ZXIC_SIZEOF(ZXIC_UINT32)); + ZXIC_COMM_CHECK_RC(rc, "zxic_comm_indexfill_init"); + + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(p_acl_cfg->dev_id, entry_num, (ZXIC_UINT32)ZXIC_SIZEOF(DPP_ACL_KEY_INFO_T *)); + acl_key_buff_size = (entry_num * ZXIC_SIZEOF(DPP_ACL_KEY_INFO_T *)) & 0xffffffff; + p_acl_cfg->acl_tbls[table_id].acl_key_buff = (DPP_ACL_KEY_INFO_T **)ZXIC_COMM_MALLOC(acl_key_buff_size); + ZXIC_COMM_CHECK_POINT(p_acl_cfg->acl_tbls[table_id].acl_key_buff); + } + + rc = (DPP_STATUS)zxic_comm_rb_init(&(p_acl_cfg->acl_tbls[table_id].acl_rb), 0, ZXIC_SIZEOF(DPP_ACL_KEY_INFO_T) + DPP_ACL_KEYSIZE_GET(key_mode), dpp_acl_key_cmp); + ZXIC_COMM_CHECK_RC(rc, "zxic_comm_rb_init"); + + p_acl_cfg->acl_tbls[table_id].table_id = table_id; + p_acl_cfg->acl_tbls[table_id].pri_mode = pri_mode; + p_acl_cfg->acl_tbls[table_id].key_mode = key_mode; + p_acl_cfg->acl_tbls[table_id].entry_num = entry_num; + p_acl_cfg->acl_tbls[table_id].as_mode = as_mode; + p_acl_cfg->acl_tbls[table_id].is_used = 1; + + // ZXIC_COMM_TRACE_ERROR("p_acl_cfg->acl_tbls[%u].table_id [%d]\n", table_id, p_acl_cfg->acl_tbls[table_id].table_id); + // ZXIC_COMM_TRACE_ERROR("p_acl_cfg->acl_tbls[%u].pri_mode [%d]\n", table_id, p_acl_cfg->acl_tbls[table_id].pri_mode); + // ZXIC_COMM_TRACE_ERROR("p_acl_cfg->acl_tbls[%u].key_mode [%d]\n", table_id, p_acl_cfg->acl_tbls[table_id].key_mode); + // ZXIC_COMM_TRACE_ERROR("p_acl_cfg->acl_tbls[%u].entry_num [%d]\n", table_id, p_acl_cfg->acl_tbls[table_id].entry_num); + // ZXIC_COMM_TRACE_ERROR("p_acl_cfg->acl_tbls[%u].as_mode [%d]\n", table_id, p_acl_cfg->acl_tbls[table_id].as_mode); + + INIT_D_NODE(&(p_acl_cfg->acl_tbls[table_id].entry_dn), &(p_acl_cfg->acl_tbls[table_id])); + rc = (DPP_STATUS)zxic_comm_double_link_insert_last(&(p_acl_cfg->acl_tbls[table_id].entry_dn), &(p_acl_cfg->acl_etcamids.tbl_list)); + ZXIC_COMM_CHECK_RC(rc, "zxic_comm_double_link_insert_last"); + + p_acl_cfg->acl_tbls[table_id].block_num = block_num; + p_acl_cfg->acl_tbls[table_id].block_array = ZXIC_COMM_MALLOC(block_num * ZXIC_SIZEOF(ZXIC_UINT32)); + ZXIC_COMM_CHECK_POINT(p_acl_cfg->acl_tbls[table_id].block_array); + + for (i = 0; i < block_num; i++) + { + if (p_acl_cfg->acl_blocks[p_block_idx[i]].is_used) + { + ZXIC_COMM_TRACE_ERROR("the block[ %d ] is already used by table[ %d ]!\n", p_block_idx[i], p_acl_cfg->acl_blocks[p_block_idx[i]].tbl_id); + ZXIC_COMM_ASSERT(0); + return DPP_ACL_RC_INVALID_BLOCKID; + } + + p_acl_cfg->acl_tbls[table_id].block_array[i] = p_block_idx[i]; + p_acl_cfg->acl_blocks[p_block_idx[i]].is_used = 1; + p_acl_cfg->acl_blocks[p_block_idx[i]].tbl_id = table_id; + p_acl_cfg->acl_blocks[p_block_idx[i]].idx_base = ((DPP_ACL_ENTRY_MAX_GET(key_mode, i)) >> BLOCK_IDXBASE_BIT_OFF) & BLOCK_IDXBASE_BIT_MASK; + +#ifdef DPP_FLOW_HW_INIT + /* cfg block table_id */ + rc = dpp_etcam_block_tbl_id_set(p_acl_cfg->dev, p_block_idx[i], table_id); + ZXIC_COMM_CHECK_RC(rc, "dpp_etcam_block_tbl_id_set"); + + /* cfg block base_addr */ + rc = dpp_etcam_block_baddr_set(p_acl_cfg->dev, p_block_idx[i], p_acl_cfg->acl_blocks[p_block_idx[i]].idx_base); + ZXIC_COMM_CHECK_RC(rc, "dpp_etcam_block_baddr_set"); +#endif + + } + + return DPP_OK; +} + +DPP_STATUS dpp_acl_res_destroy(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 table_id = 0; + ZXIC_UINT32 as_enable = 0; + ZXIC_UINT32 pri_mode = 0; + DPP_ACL_CFG_EX_T *p_acl_cfg = NULL; + DPP_ACL_TBL_CFG_T *p_tbl_cfg = NULL; + + ZXIC_COMM_CHECK_INDEX_NO_ASSERT(dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + + rc = dpp_acl_cfg_get(&p_acl_cfg);//获取ACL表资源配置 + ZXIC_COMM_CHECK_POINT(p_acl_cfg); + ZXIC_COMM_CHECK_RC(rc, "dpp_acl_cfg_get"); + + if(!p_acl_cfg->acl_etcamids.is_valid) + { + ZXIC_COMM_TRACE_ERROR("etcam is not init!\n"); + return DPP_ACL_RC_ETCAMID_NOT_INIT; + } + + for(table_id=DPP_ACL_TBL_ID_MIN;table_id<=DPP_ACL_TBL_ID_MAX;table_id++) + { + p_tbl_cfg = p_acl_cfg->acl_tbls + table_id; + if (!p_tbl_cfg->is_used) + { + ZXIC_COMM_TRACE_DEBUG("table_id[ %d ] is not used!\n", table_id); + continue; + } + + rc = (DPP_STATUS)zxic_comm_rb_destroy(&(p_tbl_cfg->acl_rb)); + ZXIC_COMM_CHECK_RC(rc, "zxic_comm_rb_destroy"); + + rc = zxic_comm_indexfill_destroy(&(p_tbl_cfg->index_mng)); + ZXIC_COMM_CHECK_RC(rc, "zxic_comm_indexfill_destroy"); + + as_enable = p_tbl_cfg->as_enable; + if(as_enable) + { + if(p_tbl_cfg->as_rslt_buff) + { + ZXIC_COMM_FREE(p_tbl_cfg->as_rslt_buff); + p_tbl_cfg->as_rslt_buff = NULL; + } + } + + pri_mode = p_tbl_cfg->pri_mode; + if ((pri_mode == DPP_ACL_PRI_EXPLICIT) || (pri_mode == DPP_ACL_PRI_IMPLICIT)) + { + if(p_tbl_cfg->acl_key_buff) + { + ZXIC_COMM_FREE(p_tbl_cfg->acl_key_buff); + p_tbl_cfg->acl_key_buff = NULL; + } + } + + if(p_tbl_cfg->block_array) + { + ZXIC_COMM_FREE(p_tbl_cfg->block_array); + p_tbl_cfg->block_array = NULL; + } + } + + return DPP_OK; +} + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/dpp_dtb_table.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/dpp_dtb_table.c new file mode 100644 index 0000000..36f36e2 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/dpp_dtb_table.c @@ -0,0 +1,7465 @@ +#include "zxic_private_top.h" +#include "zxic_common.h" +#include "dpp_dtb_table_api.h" +#include "dpp_dtb_table.h" +#include "dpp_se_api.h" +#include "dpp_se_cfg.h" +#include "dpp_hash_crc.h" +#include "dpp_hash.h" +#include "dpp_acl.h" +#include "dpp_etcam.h" +#include "dpp_se.h" +#include "dpp_dtb.h" +#include "dpp_dtb_cfg.h" +#include "dpp_dev.h" +#include "dpp_sdt.h" +#include "dpp_dtb.h" +#include "dpp_apt_se.h" +#include "dpp_hash.h" + +extern ZXIC_UINT32 g_lpm_hw_dat_buf[LPM_HW_DAT_BUFF_SIZE_MAX]; +extern ZXIC_UINT32 g_lpm_hw_dat_offset; + +DPP_DTB_MIXED_TABLE_T *p_dtb_mixed_table_mgr = NULL; + +ZXIC_UINT32 g_dpp_dtb_int_enable = DISABLE;//默认中断不使能 +ZXIC_UINT32 g_dtb_srh_mode = 1; //默认硬件模式 0:软件查找 1:硬件查找 + +static ZXIC_UINT32 g_dtb_cmd_endian = 0; //0:小端 1:大端 + + +DPP_DTB_FIELD_T g_dtb_ddr_table_cmd_info[] = +{ + {"valid", 127, 1}, + {"type_mode", 126, 3}, + {"rw_len", 123, 2}, + {"v46_flag", 121, 1}, + {"lpm_wr_vld", 120, 1}, + {"baddr", 119, 20}, + {"ecc_en", 99, 1}, + {"rw_addr", 29, 30}, +}; + +DPP_DTB_FIELD_T g_dtb_eram_table_cmd_1_info[] = +{ + {"valid", 127, 1}, + {"type_mode", 126, 3}, + {"data_mode",123, 2}, + {"cpu_wr", 121, 1}, + {"cpu_rd", 120, 1}, + {"cpu_rd_mode", 119, 1}, + {"addr", 113, 26}, + {"data_h",0,1}, +}; + +DPP_DTB_FIELD_T g_dtb_eram_table_cmd_64_info[] = +{ + {"valid", 127, 1}, + {"type_mode", 126, 3}, + {"data_mode",123, 2}, + {"cpu_wr", 121, 1}, + {"cpu_rd", 120, 1}, + {"cpu_rd_mode", 119, 1}, + {"addr", 113, 26}, + {"data_h",63,32}, + {"data_l",31,32}, +}; + +DPP_DTB_FIELD_T g_dtb_eram_table_cmd_128_info[] = +{ + {"valid", 127, 1}, + {"type_mode", 126, 3}, + {"data_mode",123, 2}, + {"cpu_wr", 121, 1}, + {"cpu_rd", 120, 1}, + {"cpu_rd_mode", 119, 1}, + {"addr", 113, 26}, +}; + +DPP_DTB_FIELD_T g_dtb_zcam_table_cmd_info[] = +{ + {"valid", 127, 1}, + {"type_mode", 126, 3}, + {"ram_reg_flag",123, 1}, + {"zgroup_id", 122, 2}, + {"zblock_id", 120, 3}, + {"zcell_id", 117, 2}, + {"mask", 115, 4}, + {"sram_addr", 111, 9}, +}; + +DPP_DTB_FIELD_T g_dtb_etcam_table_cmd_info[] = +{ + {"valid", 127, 1}, + {"type_mode", 126, 3}, + {"block_sel",123, 3}, + {"init_en", 120, 1}, + {"row_or_col_msk", 119, 1}, + {"vben", 118, 1}, + {"reg_tcam_flag", 117, 1}, + {"uload", 116, 8}, + {"rd_wr",108, 1}, + {"wr_mode", 107, 8}, + {"data_or_mask", 99, 1}, + {"addr", 98, 9}, + {"vbit", 89, 8}, +}; + +DPP_DTB_FIELD_T g_dtb_mc_hash_table_cmd_info[] = +{ + {"valid", 127, 1}, + {"type_mode", 126, 3}, + {"std_h", 63, 32}, + {"std_l", 31, 32}, +}; + + +DPP_DTB_TABLE_T g_dpp_dtb_table_info[] = +{ + { + "ddr", + DTB_TABLE_DDR, + 8, + g_dtb_ddr_table_cmd_info, + }, + { + "eram 1 bit", + DTB_TABLE_ERAM_1, + 8, + g_dtb_eram_table_cmd_1_info, + }, + { + "eram 64 bit", + DTB_TABLE_ERAM_64, + 9, + g_dtb_eram_table_cmd_64_info, + }, + { + "eram 128 bit", + DTB_TABLE_ERAM_128, + 7, + g_dtb_eram_table_cmd_128_info, + }, + { + "zcam", + DTB_TABLE_ZCAM, + 8, + g_dtb_zcam_table_cmd_info, + }, + { + "etcam", + DTB_TABLE_ETCAM, + 13, + g_dtb_etcam_table_cmd_info, + }, + { + "mc_hash", + DTB_TABLE_MC_HASH, + 4, + g_dtb_mc_hash_table_cmd_info + }, +}; + + +DPP_DTB_FIELD_T g_dtb_eram_dump_cmd_info[] = +{ + {"valid", 127, 1}, + {"up_type", 126, 2}, + {"base_addr", 106, 19}, + {"tb_depth", 83, 20}, + {"tb_dst_addr_h", 63, 32}, + {"tb_dst_addr_l", 31, 32}, +}; + +DPP_DTB_FIELD_T g_dtb_ddr_dump_cmd_info[] = +{ + {"valid", 127, 1}, + {"up_type", 126, 2}, + {"base_addr", 117, 30}, + {"tb_depth", 83, 20}, + {"tb_dst_addr_h", 63, 32}, + {"tb_dst_addr_l", 31, 32}, + +}; + +DPP_DTB_FIELD_T g_dtb_zcam_dump_cmd_info[] = +{ + {"valid", 127, 1}, + {"up_type", 126, 2}, + {"zgroup_id", 124, 2}, + {"zblock_id", 122, 3}, + {"ram_reg_flag", 119, 1}, + {"z_reg_cell_id", 118, 2}, + {"sram_addr", 116, 9}, + {"tb_depth", 97, 10}, + {"tb_width", 65, 2}, + {"tb_dst_addr_h", 63, 32}, + {"tb_dst_addr_l", 31, 32}, + +}; + +DPP_DTB_FIELD_T g_dtb_etcam_dump_cmd_info[] = +{ + {"valid", 127, 1}, + {"up_type", 126, 2}, + {"block_sel", 124, 3}, + {"addr", 121, 9}, + {"rd_mode", 112, 8}, + {"data_or_mask", 104, 1}, + {"tb_depth", 91, 10}, + {"tb_width", 81, 2}, + {"tb_dst_addr_h", 63, 32}, + {"tb_dst_addr_l", 31, 32}, + +}; + + +DPP_DTB_TABLE_T g_dpp_dtb_dump_info[] = +{ + { + "eram", + DTB_DUMP_ERAM, + 6, + g_dtb_eram_dump_cmd_info, + }, + { + "ddr", + DTB_DUMP_DDR, + 6, + g_dtb_ddr_dump_cmd_info, + }, + { + "zcam", + DTB_DUMP_ZCAM, + 11, + g_dtb_zcam_dump_cmd_info, + }, + { + "etcam", + DTB_DUMP_ETCAM, + 10, + g_dtb_etcam_dump_cmd_info, + }, +}; + +/** dtb 中断配置 +* @param int_enable 中断使能 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_interrupt_status_set(ZXIC_UINT32 int_enable) +{ + g_dpp_dtb_int_enable = int_enable; + + return DPP_OK; +} + +/** dtb 中断获取 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +ZXIC_UINT32 dpp_dtb_interrupt_status_get(ZXIC_VOID) +{ + return g_dpp_dtb_int_enable; +} + +/** dtb cmd 大小端设置 +* @param int_enable 中断使能 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_cmd_endian_status_set(ZXIC_UINT32 endian) +{ + g_dtb_cmd_endian = endian; + + return DPP_OK; +} + +/** dtb cmd 大小端获取 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_cmd_endian_status_get(ZXIC_VOID) +{ + return g_dtb_cmd_endian; +} + +/***********************************************************/ +/** 获取 DTB 表属性信息 +* @param table_type DTB表类型 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/09/02 +************************************************************/ +DPP_DTB_TABLE_T *dpp_table_info_get(ZXIC_UINT32 table_type) +{ + ZXIC_COMM_CHECK_INDEX_RETURN_NULL(table_type, 0, DTB_TABLE_ENUM_MAX - 1); + + return (&g_dpp_dtb_table_info[table_type]); +} + +/***********************************************************/ +/** 获取 DTB dump表属性信息 +* @param up_type DTB表类型 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/09/02 +************************************************************/ +DPP_DTB_TABLE_T *dpp_dump_info_get(ZXIC_UINT32 up_type) +{ + ZXIC_COMM_CHECK_INDEX_RETURN_NULL(up_type, 0, DTB_DUMP_ENUM_MAX - 1); + + return (&g_dpp_dtb_dump_info[up_type]); +} + +/*组装128bit数据格式接口*/ +/** dtb写下表128bit格式数据 +* @param dev_id 设备号 +* @param table_type dtb表类型 +* @param p_cmd_data 表格式命令数据 +* @param p_cmd_buff 表格式命令数据缓存 +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_write_table_cmd(ZXIC_UINT32 dev_id, + DPP_DTB_TABLE_INFO_E table_type, + ZXIC_VOID *p_cmd_data, + ZXIC_VOID *p_cmd_buff + ) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 field_cnt = 0; + + DPP_DTB_TABLE_T *p_table_info; + DPP_DTB_FIELD_T *p_field_info = NULL; + ZXIC_UINT32 temp_data = 0; + + ZXIC_COMM_CHECK_INDEX_UPPER(dev_id, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, table_type, 0, DTB_TABLE_ENUM_MAX - 1); + ZXIC_COMM_CHECK_POINT(p_cmd_data); + ZXIC_COMM_CHECK_POINT(p_cmd_buff); + + p_table_info = dpp_table_info_get(table_type); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_table_info); + p_field_info = p_table_info->p_fields; + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_field_info); + + /* 提取各字段数据,按各字段实际bit位宽进行拼装 */ + for (field_cnt = 0; field_cnt < p_table_info->field_num; field_cnt++) + { + temp_data = *((ZXIC_UINT32 *)p_cmd_data + field_cnt) & ZXIC_COMM_GET_BIT_MASK(ZXIC_UINT32, p_field_info[field_cnt].len); + + rc = zxic_comm_write_bits_ex((ZXIC_UINT8 *)p_cmd_buff, + DTB_TABLE_CMD_SIZE_BIT, + temp_data, + p_field_info[field_cnt].lsb_pos, + p_field_info[field_cnt].len); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "zxic_comm_write_bits"); + } + + return DPP_OK; +} + +/** dtb写dump表128bit格式数据 +* @param dev_id 设备号 +* @param dump_type dtb dump表类型 +* @param p_cmd_data dump表格式命令数据 +* @param p_cmd_buff dump表格式命令数据缓存 +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_write_dump_cmd(ZXIC_UINT32 dev_id, + DPP_DTB_DUMP_INFO_E dump_type, + ZXIC_VOID *p_cmd_data, + ZXIC_VOID *p_cmd_buff) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 field_cnt = 0; + + DPP_DTB_TABLE_T *p_table_info; + DPP_DTB_FIELD_T *p_field_info = NULL; + ZXIC_UINT32 temp_data = 0; + + ZXIC_COMM_CHECK_INDEX_UPPER(dev_id, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dump_type, 0, DTB_DUMP_ENUM_MAX - 1); + ZXIC_COMM_CHECK_POINT(p_cmd_data); + ZXIC_COMM_CHECK_POINT(p_cmd_buff); + + p_table_info = dpp_dump_info_get(dump_type); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_table_info); + p_field_info = p_table_info->p_fields; + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_field_info); + + /* 提取各字段数据,按各字段实际bit位宽进行拼装 */ + for (field_cnt = 0; field_cnt < p_table_info->field_num; field_cnt++) + { + + temp_data = *((ZXIC_UINT32 *)p_cmd_data + field_cnt) & ZXIC_COMM_GET_BIT_MASK(ZXIC_UINT32, p_field_info[field_cnt].len); + + rc = zxic_comm_write_bits_ex((ZXIC_UINT8 *)p_cmd_buff, + DTB_TABLE_CMD_SIZE_BIT, + temp_data, + p_field_info[field_cnt].lsb_pos, + p_field_info[field_cnt].len); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "zxic_comm_write_bits"); + } + + return DPP_OK; +} + + +/** 将下表格式+数据写入缓存中 + * entry,data_in_cmd_flag,如果为1,直接拷贝cmd,不拷贝data +* @param p_data_buff 存放数据的buff头指针 +* @param addr_offset 当前数据要写入的位置(相对于buff头的偏移) +* @param entry 要写入缓存的数据指针 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30/ +************************************************************/ +DPP_STATUS dpp_dtb_data_write(ZXIC_UINT8 * p_data_buff, + ZXIC_UINT32 addr_offset, + DPP_DTB_ENTRY_T *entry) +{ + ZXIC_UINT8* p_cmd = p_data_buff + addr_offset; + ZXIC_UINT32 cmd_size = DTB_TABLE_CMD_SIZE_BIT / 8; + + ZXIC_UINT8* p_data = p_cmd + cmd_size; + ZXIC_UINT32 data_size = entry->data_size; + + ZXIC_UINT8 * cmd = (ZXIC_UINT8 *)entry->cmd; + ZXIC_UINT8 * data = (ZXIC_UINT8 *)entry->data; + + ZXIC_COMM_CHECK_POINT(p_data_buff); + ZXIC_COMM_CHECK_POINT(entry); + + /*写入命令数据*/ + ZXIC_COMM_MEMCPY_S(p_cmd, cmd_size , cmd, cmd_size); + + /*写入数据*/ + if(!entry->data_in_cmd_flag) + { + zxic_comm_swap(data, data_size); + ZXIC_COMM_MEMCPY_S(p_data, data_size, data, data_size); + } + + return DPP_OK; +} + +/** 下表数据写入命令寄存器 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param down_table_len 数据长度,单位:字节; +* @param p_down_table_buff 下表数据缓存 +* @param p_element_id 返回下表使用的元素id +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_write_down_table_data(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 down_table_len, + ZXIC_UINT8* p_down_table_buff, + ZXIC_UINT32 *p_element_id + ) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 dtb_interrupt_status = 0; + ZXIC_UINT32 dtb_down_check_times = 2; + ZXIC_UINT32 element_id = 0; + + ZXIC_COMM_CHECK_POINT_NO_ASSERT(dev); + + dtb_interrupt_status = dpp_dtb_interrupt_status_get(); + + while(dtb_down_check_times) + { + rc = dpp_dtb_tab_down_info_set(dev, + queue_id, + dtb_interrupt_status, + down_table_len / 4, + (ZXIC_UINT32 *)p_down_table_buff, + &element_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc,"dpp_dtb_tab_down_info_set"); + + rc = dpp_dtb_tab_down_success_status_check(dev, queue_id, element_id); + + if(rc != DPP_RC_DTB_OVER_TIME) + { + break; + } + + dtb_down_check_times --; + + if(dtb_down_check_times > 0) + { + ZXIC_COMM_PRINT("DTB DOWN TABLE OVERTIME, DOWN TABLE AGAIN----%d!\n", dtb_down_check_times); + } + + } + + *p_element_id = element_id; + + ZXIC_COMM_TRACE_INFO("down slot: %d, queue_id: %d, element id: %d\n", DEV_PCIE_SLOT(dev), queue_id, *p_element_id); + + return DPP_OK; +} + +/** 计算eram 128bit为单位的index +* @param dev_id 设备号 +* @param eram_mode eram 位宽模式 +* @param index 以eram_mode为单位的index +* @param p_row_index 出参,行 +* @param p_col_index 出参,列 +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dtb_eram_index_cal(DPP_DEV_T *dev, + ZXIC_UINT32 eram_mode, + ZXIC_UINT32 index, + ZXIC_UINT32 *p_row_index, + ZXIC_UINT32* p_col_index) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 row_index = 0; + ZXIC_UINT32 col_index = 0; + + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_row_index); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_col_index); + + switch (eram_mode) + { + case ERAM128_TBL_128b: + { + row_index = index; + break; + } + + case ERAM128_TBL_64b: + { + row_index = (index >> 1); + col_index = index & 0x1; + break; + } + + case ERAM128_TBL_1b: + { + row_index = (index >> 7); + col_index = index & 0x7F; + break; + } + } + + *p_row_index = row_index; + *p_col_index = col_index; + + return rc; +} + +#if ZXIC_REAL("DTB BASE INTERFACE") + +/** smmu0数据组装函数,输入格式字段和数据,输出一个entry +* @param dev_id 芯片id +* @param mode 位宽模式 +* @param addr 1bit为单位的索引 +* @param p_data 要写入数据 +* @param p_entry 组装好的条目(已分配好空间) +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30/ +************************************************************/ +DPP_STATUS dpp_dtb_smmu0_write_entry_data(DPP_DEV_T *dev, + ZXIC_UINT32 mode, + ZXIC_UINT32 addr, + ZXIC_UINT32 *p_data, + DPP_DTB_ENTRY_T *p_entry) +{ + + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 i = 0; + DPP_DTB_ERAM_TABLE_FORM_T dtb_eram_form_info = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev),DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_entry); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), mode, ERAM128_OPR_128b, ERAM128_OPR_32b); + + dtb_eram_form_info.valid = DTB_TABLE_VALID; + dtb_eram_form_info.type_mode = DTB_TABLE_MODE_ERAM; + dtb_eram_form_info.data_mode = mode; + dtb_eram_form_info.cpu_wr = 1; + dtb_eram_form_info.addr = addr; + dtb_eram_form_info.cpu_rd = 0; + dtb_eram_form_info.cpu_rd_mode = 0; + + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("dpp eram form info: \n"); + ZXIC_COMM_DBGCNT32_PRINT("valid", dtb_eram_form_info.valid); + ZXIC_COMM_DBGCNT32_PRINT("type_mode", dtb_eram_form_info.type_mode); + ZXIC_COMM_DBGCNT32_PRINT("data_mode", dtb_eram_form_info.data_mode); + ZXIC_COMM_DBGCNT32_PRINT("cpu_wr", dtb_eram_form_info.cpu_wr); + ZXIC_COMM_DBGCNT32_PRINT("addr", dtb_eram_form_info.addr); + ZXIC_COMM_DBGCNT32_PRINT("cpu_rd", dtb_eram_form_info.cpu_rd); + ZXIC_COMM_DBGCNT32_PRINT("cpu_rd_mode", dtb_eram_form_info.cpu_rd_mode); + } + + /*清空p_entry中数据*/ + if(ERAM128_OPR_128b == mode) + { + p_entry->data_in_cmd_flag = 0; + p_entry->data_size = 128 / 8; + + rc = dpp_dtb_write_table_cmd(DEV_ID(dev), DTB_TABLE_ERAM_128, &dtb_eram_form_info, p_entry->cmd); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_write_table_cmd"); + + ZXIC_COMM_MEMCPY(p_entry->data, p_data,128 / 8); + } + else if(ERAM128_OPR_64b == mode) + { + p_entry->data_in_cmd_flag = 1; + p_entry->data_size = 64 / 8; + dtb_eram_form_info.data_l = *(p_data + 1); + dtb_eram_form_info.data_h = *(p_data); + + rc = dpp_dtb_write_table_cmd(DEV_ID(dev), DTB_TABLE_ERAM_64, &dtb_eram_form_info, p_entry->cmd); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_write_table_cmd"); + + }else if(ERAM128_OPR_1b == mode) + { + p_entry->data_in_cmd_flag = 1; + p_entry->data_size = 1; + dtb_eram_form_info.data_h = *(p_data); + + rc = dpp_dtb_write_table_cmd(DEV_ID(dev), DTB_TABLE_ERAM_1, &dtb_eram_form_info, p_entry->cmd); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_write_table_cmd"); + } + + //打印出cmd buff中内容128bit + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("table type: %d\n", DTB_TABLE_MODE_ERAM); + ZXIC_COMM_PRINT("cmd: "); + for(i = 0; i < 4; i++) + { + ZXIC_COMM_PRINT("0x%08x ", ZXIC_COMM_CONVERT32(*((ZXIC_UINT32 *)(p_entry->cmd + 4 * i))));//转换成大端显示 + } + + if(p_entry->data_in_cmd_flag == 0) + { + if(p_entry->data) + { + ZXIC_COMM_PRINT("\ndata:"); + for(i = 0; i < 4; i++) + { + ZXIC_COMM_PRINT("0x%08x ", *((ZXIC_UINT32 *)(p_entry->data + 4 * i))); + } + ZXIC_COMM_PRINT("\n"); + } + } + + } + + return DPP_OK; +} + +/** smmu1数据组装函数,输入格式字段和数据,输出一个entry +* @param dev_id 芯片id +* @param rw_len 位宽 0-128bit, 1-256bit, 2-384bit, 3-512bit +* @param v46_flag ipv4,ipv6flag +* @param lpm_wr_vld lpm表写标识 lpm表数据时为1 +* @param base_addr 基地址 以4K*128为单位 +* @param index 以位宽为单位的索引 +* @param ecc_en ecc使能 +* @param p_data 要写入数据 +* @param p_entry 组装好的条目(已分配好空间) data空间大小为512bit +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30/ +************************************************************/ +DPP_STATUS dpp_dtb_smmu1_write_entry_data(ZXIC_UINT32 dev_id, + ZXIC_UINT32 rw_len, + ZXIC_UINT32 v46_flag, + ZXIC_UINT32 lpm_wr_vld, + ZXIC_UINT32 base_addr, + ZXIC_UINT32 index, + ZXIC_UINT32 ecc_en, + ZXIC_UINT8 *p_data, + DPP_DTB_ENTRY_T *p_entry) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + + DPP_DTB_DDR_TABLE_FORM_T dtb_ddr_form_info = {0}; /*DDR表格式*/ + + ZXIC_COMM_CHECK_INDEX_UPPER(dev_id, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX_UPPER(rw_len,SMMU1_DDR_WRT_512b); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_data); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_entry); + + /*DTB下表格式内容填充*/ + dtb_ddr_form_info.valid = DTB_TABLE_VALID; + dtb_ddr_form_info.type_mode = DTB_TABLE_MODE_DDR; + dtb_ddr_form_info.rw_len = rw_len; + dtb_ddr_form_info.v46_flag = v46_flag; + dtb_ddr_form_info.lpm_wr_vld = lpm_wr_vld; + dtb_ddr_form_info.baddr = base_addr; + dtb_ddr_form_info.ecc_en = ecc_en; + dtb_ddr_form_info.rw_addr = index; + + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("dtb_ddr_form_info:\n"); + ZXIC_COMM_DBGCNT32_PRINT("valid", dtb_ddr_form_info.valid); + ZXIC_COMM_DBGCNT32_PRINT("type_mode", dtb_ddr_form_info.type_mode); + ZXIC_COMM_DBGCNT32_PRINT("rw_len", dtb_ddr_form_info.rw_len); + ZXIC_COMM_DBGCNT32_PRINT("v46_flag", dtb_ddr_form_info.v46_flag); + ZXIC_COMM_DBGCNT32_PRINT("lpm_wr_vld", dtb_ddr_form_info.lpm_wr_vld); + ZXIC_COMM_DBGCNT32_PRINT("baddr", dtb_ddr_form_info.baddr); + ZXIC_COMM_DBGCNT32_PRINT("ecc_en", dtb_ddr_form_info.ecc_en); + ZXIC_COMM_DBGCNT32_PRINT("rw_addr", dtb_ddr_form_info.rw_addr); + } + + p_entry->data_in_cmd_flag = 0; + p_entry->data_size = DTB_LEN_POS_SETP * (rw_len + 1); + + rc = dpp_dtb_write_table_cmd(dev_id, DTB_TABLE_DDR, &dtb_ddr_form_info, p_entry->cmd); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_write_table_cmd"); + + ZXIC_COMM_MEMCPY(p_entry->data, p_data, DTB_LEN_POS_SETP * (rw_len + 1)); + + //打印出cmd buff中内容128bit + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("table type: %d\n", DTB_TABLE_MODE_DDR); + ZXIC_COMM_PRINT("cmd: "); + for(i = 0; i < 4; i++) + { + ZXIC_COMM_PRINT("0x%08x ", ZXIC_COMM_CONVERT32(*((ZXIC_UINT32 *)(p_entry->cmd + 4 * i))));//转换成大端显示 + } + + if(p_entry->data) + { + ZXIC_COMM_PRINT("\ndata:"); + for(j = 0; j < rw_len + 1; j++) + { + for(i = 0; i < 4; i++) + { + ZXIC_COMM_PRINT("0x%08x ", *((ZXIC_UINT32 *)(p_entry->data + 16 * j + 4 * i))); + } + ZXIC_COMM_PRINT("\n"); + } + } + } + + return DPP_OK; +} + + +/** zcam数据组装函数,输入格式字段和数据,输出一个entry +* @param dev_id 芯片id +* @param reg_sram_flag 读写ZCAM寄存器/sram标志位:1'b1:读写寄存器 1'b0:读写sram +* @param zgroup_id +* @param zblock_id +* @param zcell_id +* @param sram_addr 512bit为单位的地址 +* @param mask 写掩码:mask[3:0]分别对应CPU写数据的4个128-bit +* mask[0]对应[127:0],1'b0为不写该128-bit,1'b1为写; +* mask[1]对应[255:128]; +* mask[2]对应[383:256]; +* mask[3]对应[512:384] +* @param p_data 要写入数据 +* @param p_entry 组装好的条目(已分配好空间) data空间大小为512bit +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30/ +************************************************************/ +DPP_STATUS dpp_dtb_zcam_write_entry_data(ZXIC_UINT32 dev_id, + ZXIC_UINT32 reg_sram_flag, + ZXIC_UINT32 zgroup_id, + ZXIC_UINT32 zblock_id, + ZXIC_UINT32 zcell_id, + ZXIC_UINT32 sram_addr, + ZXIC_UINT32 mask, + ZXIC_UINT8 *p_data, + DPP_DTB_ENTRY_T *p_entry) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + + DPP_DTB_ZCAM_TABLE_FORM_T dtb_zcam_form_info = {0}; /*ZCAM表格式*/ + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, zgroup_id, 0, SE_ZGRP_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, zblock_id, 0, ZBLK_NUM_PER_ZGRP - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, zcell_id, 0, SE_ZCELL_NUM - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_data); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_entry); + + dtb_zcam_form_info.valid = DTB_TABLE_VALID; + dtb_zcam_form_info.type_mode = DTB_TABLE_MODE_ZCAM; + dtb_zcam_form_info.ram_reg_flag = reg_sram_flag; + dtb_zcam_form_info.zgroup_id = zgroup_id; + dtb_zcam_form_info.zblock_id = zblock_id; + dtb_zcam_form_info.zcell_id = zcell_id; + dtb_zcam_form_info.mask = mask; + dtb_zcam_form_info.sram_addr = sram_addr & 0x1FF; + + p_entry->data_in_cmd_flag = 0; + p_entry->data_size = DTB_LEN_POS_SETP * (DTB_ZCAM_LEN_SIZE - 1); + + rc = dpp_dtb_write_table_cmd(dev_id, DTB_TABLE_ZCAM, &dtb_zcam_form_info, p_entry->cmd); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_write_table_cmd"); + + ZXIC_COMM_MEMCPY(p_entry->data, p_data, DTB_LEN_POS_SETP * (DTB_ZCAM_LEN_SIZE - 1)); + + //打印出cmd buff中内容128bit + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("table type: %d\n", DTB_TABLE_MODE_ZCAM); + ZXIC_COMM_PRINT("cmd: "); + for(i = 0; i < 4; i++) + { + ZXIC_COMM_PRINT("0x%08x ", ZXIC_COMM_CONVERT32(*((ZXIC_UINT32 *)(p_entry->cmd + 4 * i))));//转换成小端显示 + } + + if(p_entry->data) + { + ZXIC_COMM_PRINT("\ndata:"); + for(j = 0; j < DTB_ZCAM_LEN_SIZE-1; j++) + { + for(i = 0; i < 4; i++) + { + ZXIC_COMM_PRINT("0x%08x ", *((ZXIC_UINT32 *)(p_entry->data + 16 * j + 4 * i))); + } + ZXIC_COMM_PRINT("\n"); + } + } + } + + + return DPP_OK; +} + + +/** etcam数据组装函数,输入格式字段和数据,输出一个entry +* @param dev_id 芯片id +* @param block_idx block索引 0 - 7 +* @param row_or_col_msk 1 write row mask reg 0:write col mask reg +* @param vben enable the valid bit addressed by addr +* @param reg_tcam_flag 1:配置内部row_col_mask寄存器 0:读写tcam +* @param flush 使能标识删除对应addr的表项条目,(80bit为单位,含义与wr_mode一一对应) +* @param rd_wr 读写标志 0写 1读 +* @param wr_mode 写入掩码,最高8bit,对应bit为1代表对应的80bit的数据 +* @param data_or_mask 数据或掩码标志 1:写x(data),0:写y(mask) +* @param ram_addr etcam地址(0-511) +* @param vbit valid bit input +* @param p_data 要写入数据 +* @param p_entry 组装好的条目(已分配好空间) data空间大小为640bit +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30/ +************************************************************/ +DPP_STATUS dpp_dtb_etcam_write_entry_data(DPP_DEV_T *dev, + ZXIC_UINT32 block_idx, + ZXIC_UINT32 row_or_col_msk, + ZXIC_UINT32 vben, + ZXIC_UINT32 reg_tcam_flag, + ZXIC_UINT32 flush, + ZXIC_UINT32 rd_wr, + ZXIC_UINT32 wr_mode, + ZXIC_UINT32 data_or_mask, + ZXIC_UINT32 ram_addr, + ZXIC_UINT32 vbit, + ZXIC_UINT8 *p_data, + DPP_DTB_ENTRY_T *p_entry) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 offset = 0; + ZXIC_UINT8 *p_temp = NULL; + + ZXIC_UINT8 buff[DPP_ETCAM_WIDTH_MAX / 8] = {0}; + DPP_DTB_ETCAM_TABLE_FORM_T dtb_etcam_form_info = {0}; /*etcam表格式*/ + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), block_idx, 0, DPP_ETCAM_BLOCK_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), row_or_col_msk, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), vben, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), reg_tcam_flag, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), flush, 0, DPP_ETCAM_WR_MASK_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), rd_wr, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), wr_mode, 0, DPP_ETCAM_WR_MASK_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), data_or_mask, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), ram_addr, 0, DPP_ETCAM_RAM_DEPTH - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), vbit, 0, 0xff); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_entry); + + /*data etcam 下表格式内容填充*/ + dtb_etcam_form_info.valid = DTB_TABLE_VALID; + dtb_etcam_form_info.type_mode = DTB_TABLE_MODE_ETCAM; + dtb_etcam_form_info.block_sel = block_idx; + dtb_etcam_form_info.init_en = 0; + dtb_etcam_form_info.row_or_col_msk = row_or_col_msk; + dtb_etcam_form_info.vben = vben; + dtb_etcam_form_info.reg_tcam_flag = reg_tcam_flag; + dtb_etcam_form_info.uload = flush; + dtb_etcam_form_info.rd_wr = rd_wr;//0:写;1读 + dtb_etcam_form_info.wr_mode = wr_mode; + dtb_etcam_form_info.data_or_mask = data_or_mask; + dtb_etcam_form_info.addr = ram_addr; + dtb_etcam_form_info.vbit = vbit; + + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("dpp etcam form info: \n"); + ZXIC_COMM_DBGCNT32_PRINT("valid", dtb_etcam_form_info.valid); + ZXIC_COMM_DBGCNT32_PRINT("type_mode", dtb_etcam_form_info.type_mode); + ZXIC_COMM_DBGCNT32_PRINT("block_sel", dtb_etcam_form_info.block_sel); + ZXIC_COMM_DBGCNT32_PRINT("init_en", dtb_etcam_form_info.init_en); + ZXIC_COMM_DBGCNT32_PRINT("row_or_col_msk", dtb_etcam_form_info.row_or_col_msk); + ZXIC_COMM_DBGCNT32_PRINT("vben", dtb_etcam_form_info.vben); + ZXIC_COMM_DBGCNT32_PRINT("reg_tcam_flag", dtb_etcam_form_info.reg_tcam_flag); + ZXIC_COMM_DBGCNT32_PRINT("uload", dtb_etcam_form_info.uload); + ZXIC_COMM_DBGCNT32_PRINT("rd_wr", dtb_etcam_form_info.rd_wr); + ZXIC_COMM_DBGCNT32_PRINT("wr_mode", dtb_etcam_form_info.wr_mode); + ZXIC_COMM_DBGCNT32_PRINT("data_or_mask", dtb_etcam_form_info.data_or_mask); + ZXIC_COMM_DBGCNT32_PRINT("addr", dtb_etcam_form_info.addr); + ZXIC_COMM_DBGCNT32_PRINT("vbit", dtb_etcam_form_info.vbit); + } + + p_entry->data_in_cmd_flag = 0; + p_entry->data_size = DTB_LEN_POS_SETP * (DTB_ETCAM_LEN_SIZE - 1); + + rc = dpp_dtb_write_table_cmd(DEV_ID(dev), DTB_TABLE_ETCAM, &dtb_etcam_form_info, p_entry->cmd); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_write_table_cmd"); + + p_temp = p_data; + + /*将数据写入ETCAM表项处理*/ + /* 160bit key: high 80bit in tcam_ram1, low 80bit in tcam_ram0, and so on. */ + for (i = 0; i < DPP_ETCAM_RAM_NUM; i++) + { + offset = i * ((ZXIC_UINT32)DPP_ETCAM_WIDTH_MIN / 8); + + if ((wr_mode >> (DPP_ETCAM_RAM_NUM - 1 - i)) & 0x1) + { + ZXIC_COMM_MEMCPY(buff + offset, p_temp, DPP_ETCAM_WIDTH_MIN / 8); + p_temp += DPP_ETCAM_WIDTH_MIN / 8; + } + } + + zxic_comm_swap((ZXIC_UINT8 *)buff, DTB_LEN_POS_SETP * (DTB_ETCAM_LEN_SIZE - 1)); + + ZXIC_COMM_MEMCPY(p_entry->data, buff, DTB_LEN_POS_SETP * (DTB_ETCAM_LEN_SIZE - 1)); + + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("dpp_dtb_etcam_write_entry_data: \n"); + ZXIC_COMM_PRINT("wr_mode:0x%08x\n", wr_mode); + for(i = 0; i < 20; i++) + { + ZXIC_COMM_PRINT("0x%08x ",*((ZXIC_UINT32*)(buff + 4 * i))); + } + ZXIC_COMM_PRINT("\n"); + } + + return DPP_OK; +} + +/** 写eram,输出一个entry +* @param dev_id 芯片id +* @param base_addr 基地址,以128bit为单位 +* @param index 条目索引,以mode为单位 +* @param wr_mode 数据位宽模式,支持0:128bit 1:64bit 2:1bit +* @param p_data 待写入的数据 +* @param p_entry 组装好的数据 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30/ +************************************************************/ +DPP_STATUS dpp_dtb_se_smmu0_ind_write(DPP_DEV_T *dev, + ZXIC_UINT32 base_addr, + ZXIC_UINT32 index, + ZXIC_UINT32 wrt_mode, + ZXIC_UINT32 *p_data, + DPP_DTB_ENTRY_T *p_entry) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 temp_idx = 0; + ZXIC_UINT32 dtb_ind_addr = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev),DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_entry); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), wrt_mode, ERAM128_OPR_128b, ERAM128_OPR_1b); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), base_addr, 0, SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1); + + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("dpp_dtb_se_smmu0_ind_write: \n"); + ZXIC_COMM_PRINT("base addr: 0x%08x\n",base_addr); + ZXIC_COMM_PRINT("index: 0x%08x\n",index); + ZXIC_COMM_PRINT("write mode: %d 0-128bit 1-64bit 2-1bit\n",wrt_mode); + } + + switch (wrt_mode) + { + case ERAM128_OPR_128b: + { + if((0xFFFFFFFF - (base_addr)) < (index)) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "ICM %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, base_addr, index, __FUNCTION__); + + return ZXIC_PAR_CHK_INVALID_INDEX; + } + if (base_addr + index > SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "dpp_dtb_se_smmu0_ind_write : index out of range !\n"); + return DPP_ERR; + } + + temp_idx = index << 7; + + break; + } + + case ERAM128_OPR_64b: + { + if ((base_addr + (index >> 1)) > SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "dpp_dtb_se_smmu0_ind_write : index out of range !\n"); + return DPP_ERR; + } + + temp_idx = index << 6; + + break; + } + + case ERAM128_OPR_1b: + { + if ((base_addr + (index >> 7)) > SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "dpp_dtb_se_smmu0_ind_write : index out of range !\n"); + return DPP_ERR; + } + + temp_idx = index; + } + } + + if((0xFFFFFFFF - (temp_idx)) < ((base_addr << 7) & DPP_ERAM128_BADDR_MASK)) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "ICM %s:%d[Error:VALUE[val0=0x%x] INVALID] [val1=0x%x] ! FUNCTION :%s !\n", __FILE__, __LINE__, temp_idx, ((base_addr << 7) & DPP_ERAM128_BADDR_MASK), __FUNCTION__); + return ZXIC_PAR_CHK_INVALID_INDEX; + } + + dtb_ind_addr = ((base_addr << 7) & DPP_ERAM128_BADDR_MASK) + temp_idx; + + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_DBGCNT32_PRINT(" dtb eram item 1bit addr", dtb_ind_addr); + } + + rc = dpp_dtb_smmu0_write_entry_data(dev, + wrt_mode, + dtb_ind_addr, + p_data, + p_entry); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_smmu0_write_entry_data"); + + return DPP_OK; +} + +/** dtb写smmu0中的数据,数据长度在16K范围内 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param smmu0_base_addr smmu0基地址,以128bit为单位 +* @param smmu0_wr_mode smmu0写模式,参考DPP_ERAM128_OPR_MODE_E,仅支持128bit、64bit、1bit模式 +* @param entry_num 下发的条目数 +* @param p_entry_arr 待下发表项内容结构体数组指针 +* @param element_id 返回下表使用的元素id +* @return +* @remark 无 +* @see +* @author cbb @date 2024/01/04 +************************************************************/ +DPP_STATUS dpp_dtb_smmu0_data_write_cycle(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 smmu0_base_addr, + ZXIC_UINT32 smmu0_wr_mode, + ZXIC_UINT32 entry_num, + DPP_DTB_ERAM_ENTRY_INFO_T *p_entry_arr, + ZXIC_UINT32 *element_id) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 item_cnt = 0; + ZXIC_UINT32 addr_offset = 0; + ZXIC_UINT32 dtb_len = 0; + ZXIC_UINT32 index = 0; + + ZXIC_UINT32 *p_entry_data = NULL; + ZXIC_UINT8 *table_data_buff = NULL; + ZXIC_UINT32 entry_data_buff[4] = {0}; + ZXIC_UINT8 cmd_buff[DTB_TABLE_CMD_SIZE_BIT / 8] = {0}; + DPP_DTB_ENTRY_T dtb_one_entry = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DTB_QUEUE_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_LOWER(DEV_ID(dev), entry_num, 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_entry_arr); + + //分配下表数据缓存 16K + table_data_buff = (ZXIC_UINT8 *) ZXIC_COMM_MALLOC(DPP_DTB_TABLE_DATA_BUFF_SIZE * sizeof(ZXIC_UINT8)); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), table_data_buff); + ZXIC_COMM_MEMSET(table_data_buff, 0, DPP_DTB_TABLE_DATA_BUFF_SIZE * sizeof(ZXIC_UINT8)); + + dtb_one_entry.cmd = cmd_buff; + dtb_one_entry.data = (ZXIC_UINT8 *)entry_data_buff; + + for(item_cnt = 0; item_cnt < entry_num; ++item_cnt) + { + p_entry_data = (ZXIC_UINT32 *)p_entry_arr[item_cnt].p_data; + ZXIC_COMM_CHECK_POINT_MEMORY_FREE_NO_ASSERT(p_entry_data, table_data_buff); + index = p_entry_arr[item_cnt].index; + + //将一个数据写入entry + rc = dpp_dtb_se_smmu0_ind_write(dev, + smmu0_base_addr, + index, + smmu0_wr_mode, + p_entry_data, + &dtb_one_entry); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_se_smmu0_ind_write", table_data_buff); + + switch (smmu0_wr_mode) + { + case ERAM128_OPR_128b: + { + dtb_len += 2; + addr_offset = item_cnt * DTB_LEN_POS_SETP * 2; + break; + } + + case ERAM128_OPR_64b: + { + dtb_len += 1; + addr_offset = item_cnt * DTB_LEN_POS_SETP; + break; + } + + case ERAM128_OPR_1b: + { + dtb_len += 1; + addr_offset = item_cnt * DTB_LEN_POS_SETP; + break; + } + } + + /*将表格式和数据写入缓存buff中*/ + rc = dpp_dtb_data_write(table_data_buff, addr_offset, &dtb_one_entry); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_data_write", table_data_buff); + ZXIC_COMM_MEMSET(cmd_buff, 0, DTB_TABLE_CMD_SIZE_BIT / 8); + ZXIC_COMM_MEMSET(entry_data_buff, 0, 4 * sizeof(ZXIC_UINT32)); + } + + if(dpp_dtb_prt_get()) + { + dpp_data_buff_print(table_data_buff, dtb_len * 16); + ZXIC_COMM_PRINT("start down table to dtb : queue_id: %d, down_data_len: %d\n", queue_id, dtb_len * 16); + } + + rc = dpp_dtb_write_down_table_data(dev, + queue_id, + dtb_len * 16, + table_data_buff, + element_id); + ZXIC_COMM_FREE(table_data_buff); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_write_down_table_data"); + + return DPP_OK; +} + +/** dtb写smmu0中的数据,数据长度不限 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param smmu0_base_addr smmu0基地址,以128bit为单位 +* @param smmu0_wr_mode smmu0写模式,参考DPP_ERAM128_OPR_MODE_E,仅支持128bit、64bit、1bit模式 +* @param entry_num 下发的条目数 +* @param p_entry_arr 待下发表项内容结构体数组指针 +* @param element_id 返回下表使用的元素id +* @return +* @remark 无 +* @see +* @author cbb @date 2024/01/04 +************************************************************/ +DPP_STATUS dpp_dtb_smmu0_data_write(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 smmu0_base_addr, + ZXIC_UINT32 smmu0_wr_mode, + ZXIC_UINT32 entry_num, + DPP_DTB_ERAM_ENTRY_INFO_T *p_entry_arr, + ZXIC_UINT32 *element_id) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 i = 0; + ZXIC_UINT32 entry_num_max = 0; + ZXIC_UINT32 entry_cycle = 0; + ZXIC_UINT32 entry_remains = 0; + + DPP_DTB_ERAM_ENTRY_INFO_T *p_entry = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(p_entry_arr); + + switch (smmu0_wr_mode) + { + case ERAM128_OPR_128b: + { + entry_num_max = 0x1ff; + break; + } + + case ERAM128_OPR_64b: + { + entry_num_max = 0x3ff; + break; + } + + case ERAM128_OPR_1b: + { + entry_num_max = 0x3ff; + break; + } + } + + ZXIC_COMM_CHECK_INDEX_EQUAL(entry_num_max, 0); + entry_cycle = entry_num / entry_num_max; + entry_remains = entry_num % entry_num_max; + + for(i = 0; i < entry_cycle; ++i) + { + p_entry = p_entry_arr + entry_num_max * i; + rc = dpp_dtb_smmu0_data_write_cycle(dev, + queue_id, + smmu0_base_addr, + smmu0_wr_mode, + entry_num_max, + p_entry, + element_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_smmu0_data_write_cycle"); + + ZXIC_COMM_TRACE_INFO("dpp_dtb_smmu0_data_write_cycle[%d]: element_id = %d\n", i, *element_id); + } + + if(entry_remains) + { + p_entry = p_entry_arr + entry_num_max * entry_cycle; + rc = dpp_dtb_smmu0_data_write_cycle(dev, + queue_id, + smmu0_base_addr, + smmu0_wr_mode, + entry_remains, + p_entry, + element_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_smmu0_data_write_cycle"); + + ZXIC_COMM_TRACE_INFO("dpp_dtb_smmu0_data_write_cycle: element_id = %d\n", *element_id); + } + + return DPP_OK; +} + +/** dtb flush smmu0中的数据,数据长度16K以内 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param smmu0_base_addr smmu0基地址,以128bit为单位 +* @param smmu0_wr_mode smmu0写模式,参考DPP_ERAM128_OPR_MODE_E,仅支持128bit、64bit、1bit模式 +* @param start_index flush开始的条目 +* @param entry_num 下发的条目数 +* @param element_id 返回下表使用的元素id +* @return +* @remark 无 +* @see +* @author cbb @date 2024/01/04 +************************************************************/ +DPP_STATUS dpp_dtb_smmu0_flush_cycle(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 smmu0_base_addr, + ZXIC_UINT32 smmu0_wr_mode, + ZXIC_UINT32 start_index, + ZXIC_UINT32 entry_num, + ZXIC_UINT32 *element_id) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 index = 0; + ZXIC_UINT32 current_index = 0; + ZXIC_UINT32 entry_data_buff[4] = {0}; + DPP_DTB_ERAM_ENTRY_INFO_T *p_entry_arr = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + + p_entry_arr = (DPP_DTB_ERAM_ENTRY_INFO_T *)ZXIC_COMM_MALLOC(entry_num * sizeof(DPP_DTB_ERAM_ENTRY_INFO_T)); + ZXIC_COMM_CHECK_POINT(p_entry_arr); + ZXIC_COMM_MEMSET(p_entry_arr, 0, entry_num * sizeof(DPP_DTB_ERAM_ENTRY_INFO_T)); + + for(index = 0; index < entry_num; index++) + { + current_index = start_index + index; + + p_entry_arr[index].index = current_index; + p_entry_arr[index].p_data = entry_data_buff; + } + + rc = dpp_dtb_smmu0_data_write_cycle(dev, + queue_id, + smmu0_base_addr, + smmu0_wr_mode, + entry_num, + p_entry_arr, + element_id); + ZXIC_COMM_FREE(p_entry_arr); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_smmu1_data_write_cycle"); + + return rc; +} + +/** dtb flush smmu0中的数据,大数据量 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param smmu0_base_addr smmu0基地址,以128bit为单位 +* @param smmu0_wr_mode smmu0写模式,参考DPP_ERAM128_OPR_MODE_E,仅支持128bit、64bit、1bit模式 +* @param start_index flush开始的条目 +* @param entry_num 下发的条目数 +* @param element_id 返回下表使用的元素id +* @return +* @remark 无 +* @see +* @author cbb @date 2024/01/04 +************************************************************/ +DPP_STATUS dpp_dtb_smmu0_flush(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 smmu0_base_addr, + ZXIC_UINT32 smmu0_wr_mode, + ZXIC_UINT32 start_index, + ZXIC_UINT32 entry_num, + ZXIC_UINT32 *element_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 entry_num_max = 0; + ZXIC_UINT32 entry_cycle = 0; + ZXIC_UINT32 entry_remains = 0; + ZXIC_UINT32 temp_start_index = 0; + ZXIC_UINT32 i = 0; + + ZXIC_COMM_CHECK_POINT(dev); + + switch (smmu0_wr_mode) + { + case ERAM128_OPR_128b: + { + entry_num_max = 0x1ff; + break; + } + + case ERAM128_OPR_64b: + { + entry_num_max = 0x3ff; + break; + } + + case ERAM128_OPR_1b: + { + entry_num_max = 0x3ff; + break; + } + } + + ZXIC_COMM_CHECK_INDEX_EQUAL(entry_num_max, 0); + entry_cycle = entry_num / entry_num_max; + entry_remains = entry_num % entry_num_max; + + for(i = 0; i < entry_cycle; ++i) + { + temp_start_index = entry_num_max * i + start_index; + + rc = dpp_dtb_smmu0_flush_cycle(dev, + queue_id, + smmu0_base_addr, + smmu0_wr_mode, + temp_start_index, + entry_num_max, + element_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_smmu0_flush_cycle"); + + ZXIC_COMM_TRACE_INFO("dpp_dtb_smmu0_flush_cycle[%d] element_id = %d\n",i,*element_id); + } + + if(entry_remains) + { + temp_start_index = entry_num_max * entry_cycle + start_index; + rc = dpp_dtb_smmu0_flush_cycle(dev, + queue_id, + smmu0_base_addr, + smmu0_wr_mode, + temp_start_index, + entry_remains, + element_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_smmu0_flush_cycle"); + + ZXIC_COMM_TRACE_INFO("dpp_dtb_smmu0_flush_cycle: element_id = %d\n",*element_id); + } + + return 0; +} + +/** ddr直接表 写数据 +* @param dev_id 芯片id +* @param base_addr 基地址,以4K*128bit为单位 +* @param rw_len 数据位宽模式,位宽 0-128bit, 1-256bit, 2-384bit, 3-512bit,取值参考SMMU1_DDR_WRT_MODE_E的定义 +* @param index 条目索引,以mode为单位 +* @param ecc_en 直接表ECC使能位 +* @param p_data 待写入的数据指针 +* @param p_entry 组装好的条目(已分配好空间) +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30/ +************************************************************/ +DPP_STATUS dpp_dtb_ddr_dir_table_data_write(ZXIC_UINT32 dev_id, + ZXIC_UINT32 base_addr, + ZXIC_UINT32 rw_len, + ZXIC_UINT32 index, + ZXIC_UINT32 ecc_en, + ZXIC_UINT8 *p_data, + DPP_DTB_ENTRY_T *p_entry) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 ipv4_v6_flag = 0; + ZXIC_UINT32 lpm_vld = 0; + + ZXIC_COMM_CHECK_INDEX_UPPER(dev_id, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX_UPPER(rw_len,SMMU1_DDR_WRT_512b); + ZXIC_COMM_CHECK_INDEX_UPPER(ecc_en,1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_data); + + rc = dpp_dtb_smmu1_write_entry_data(dev_id, + rw_len, + ipv4_v6_flag, + lpm_vld, + base_addr, + index, + ecc_en, + p_data, + p_entry); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_smmu1_write_entry_data"); + + return DPP_OK; +} + + +/** ddr直接表 写数据 +* @param dev_id 芯片id +* @param base_addr 基地址,以4K*128bit为单位 +* @param rw_len 数据位宽模式,位宽 0-128bit, 1-256bit, 2-384bit, 3-512bit,取值参考SMMU1_DDR_WRT_MODE_E的定义 +* @param index 条目索引,以mode为单位 +* @param ecc_en ecc是否使能 +* @param p_data 待写入的数据指针 +* @param p_entry 组装好的条目(已分配好空间) +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30/ +************************************************************/ +DPP_STATUS dpp_dtb_ddr_hash_table_data_write(ZXIC_UINT32 dev_id, + ZXIC_UINT32 base_addr, + ZXIC_UINT32 rw_len, + ZXIC_UINT32 index, + ZXIC_UINT32 ecc_en, + ZXIC_UINT8 *p_data, + DPP_DTB_ENTRY_T *p_entry) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 ipv4_v6_flag = 0; + ZXIC_UINT32 lpm_vld = 0; + + ZXIC_COMM_CHECK_INDEX_UPPER(dev_id, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX_UPPER(rw_len,SMMU1_DDR_WRT_512b); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_data); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_entry); + + rc = dpp_dtb_smmu1_write_entry_data(dev_id, + rw_len, + ipv4_v6_flag, + lpm_vld, + base_addr, + index, + ecc_en, + p_data, + p_entry); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_smmu1_write_entry_data"); + + return DPP_OK; +} + +/** dtb 通道 se alg间接写zcam空间 +* @param dev_id 芯片id +* @param addr 基地址,以4K*128bit为单位 +* @param p_data 待写入的数据指针 +* @param p_entry 组装好的条目(已分配好空间) +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30/ +************************************************************/ +DPP_STATUS dpp_dtb_se_alg_zcam_data_write(ZXIC_UINT32 dev_id, + ZXIC_UINT32 addr, + ZXIC_UINT8 *p_data, + DPP_DTB_ENTRY_T *p_entry) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 reg_sram_flag = 0; + ZXIC_UINT32 zgroup_id = 0; + ZXIC_UINT32 zblock_id = 0; + ZXIC_UINT32 zcell_id = 0; + ZXIC_UINT32 mask = 0; + ZXIC_UINT32 sram_addr = 0; + + ZXIC_COMM_CHECK_INDEX_UPPER(dev_id, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_data); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_entry); + + mask = (addr >> 17) & 0xF; + reg_sram_flag = (addr >> 16) & 0x1; + zgroup_id = (addr >> 14) & 0x3; + zblock_id = (addr >> 11) & 0x7; + zcell_id = (addr >> 9) & 0x3; + sram_addr = addr & 0x1FF; + + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("dpp_dtb_se_alg_zcam_data_write: \n"); + ZXIC_COMM_DBGCNT32_PRINT("addr", addr); + ZXIC_COMM_DBGCNT32_PRINT("mask", mask); + ZXIC_COMM_DBGCNT32_PRINT("reg_sram_flag", reg_sram_flag); + ZXIC_COMM_DBGCNT32_PRINT("zgroup_id", zgroup_id); + ZXIC_COMM_DBGCNT32_PRINT("zblock_id", zblock_id); + ZXIC_COMM_DBGCNT32_PRINT("zcell_id", zcell_id); + ZXIC_COMM_DBGCNT32_PRINT("sram_addr", sram_addr); + } + + rc = dpp_dtb_zcam_write_entry_data(dev_id, + reg_sram_flag, + zgroup_id, + zblock_id, + zcell_id, + sram_addr, + mask, + p_data, + p_entry); + + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_zcam_write_entry_data"); + + return DPP_OK; +} + +#endif + +#if ZXIC_REAL("DOWN_TABLE") +/** 将HASH表数据格式写入form_buff中 +* @param p_hash_cfg hash表配置指针 +* @param p_rbkey_rtn 红黑树新节点信息指针 +* @param entry_data 条目数据缓存缓存 +* +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_hash_form_write(DPP_HASH_CFG *p_hash_cfg, + DPP_HASH_RBKEY_INFO *p_rbkey_new, + ZXIC_UINT32 actu_key_size, + DPP_DTB_ENTRY_T *p_entry) +{ + ZXIC_UINT8 table_id = 0; + ZXIC_UINT32 key_type = 0; + ZXIC_UINT32 key_by_size = 0; + ZXIC_UINT32 rst_by_size = 0; + ZXIC_UINT32 byte_offset = 0; + + ZXIC_UINT32 i = 0; + ZXIC_UINT32 index = 0; + ZXIC_UINT32 bulk_id = 0; + ZXIC_UINT32 temp_mask = 0; + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 ddr_wr_mode = 0; + ZXIC_UINT32 addr; + + D_NODE *p_entry_dn = NULL; + HASH_DDR_CFG *p_ddr_cfg = NULL; + SE_ITEM_CFG *p_item_info = NULL; + DPP_HASH_RBKEY_INFO *p_rbkey = NULL; + ZXIC_UINT8 entry_data[SE_ENTRY_WIDTH_MAX] = {0}; + + ZXIC_COMM_CHECK_POINT(p_hash_cfg); + ZXIC_COMM_CHECK_POINT(p_rbkey_new); + + dev_id = p_hash_cfg->p_se_info->dev_id; + ZXIC_COMM_CHECK_INDEX_UPPER(dev_id,DPP_DEV_CHANNEL_MAX - 1); + + ZXIC_COMM_MEMSET(entry_data,0x0,sizeof(entry_data)); + p_item_info = p_rbkey_new->p_item_info; + ZXIC_COMM_CHECK_POINT(p_item_info); + + if (p_item_info->item_type == ITEM_DDR_256 || p_item_info->item_type == ITEM_DDR_512)//hash条目存在DDR中 + { + table_id = DPP_GET_HASH_TBL_ID(p_rbkey_new->key); + bulk_id = ((table_id >> 2) & 0x7); + ZXIC_COMM_CHECK_INDEX_UPPER(bulk_id,HASH_BULK_NUM - 1); + p_ddr_cfg = p_hash_cfg->p_bulk_ddr_info[bulk_id]; + key_type = DPP_GET_HASH_KEY_TYPE(p_rbkey_new->key); + key_by_size = DPP_GET_KEY_SIZE(actu_key_size); + + switch (key_type) + { + case HASH_KEY_128b: + { + rst_by_size = 16U - DPP_GET_ACTU_KEY_BY_SIZE(actu_key_size) - HASH_KEY_CTR_SIZE; + break; + } + case HASH_KEY_256b: + { + rst_by_size = 32U - DPP_GET_ACTU_KEY_BY_SIZE(actu_key_size) - HASH_KEY_CTR_SIZE; + break; + } + case HASH_KEY_512b: + { + rst_by_size = 64U - DPP_GET_ACTU_KEY_BY_SIZE(actu_key_size) - HASH_KEY_CTR_SIZE; + break; + } + default: + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n ErrorCode[%x]: Invalid key type.", DPP_HASH_RC_INVALID_KEY_TYPE); + return DPP_HASH_RC_INVALID_KEY_TYPE; + } + + } + + /* 计算index */ + if (DDR_WIDTH_256b == p_ddr_cfg->width_mode) + { + if (HASH_KEY_128b == key_type) + { + index = (p_item_info->hw_addr << 1) + p_rbkey_new->entry_pos; + } + else if (HASH_KEY_256b == key_type) + { + index = p_item_info->hw_addr; + } + } + else if (DDR_WIDTH_512b == p_ddr_cfg->width_mode) + { + if (HASH_KEY_128b == key_type) + { + index = (p_item_info->hw_addr << 2) + p_rbkey_new->entry_pos; + } + else if (HASH_KEY_256b == key_type) + { + index = (p_item_info->hw_addr << 2) + p_rbkey_new->entry_pos; + index = index >> 1; + } + else + { + index = p_item_info->hw_addr; + } + } + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "ddr index(unit by key_type) is 0x%x \n", index); + + ddr_wr_mode = DPP_GET_DDR_WR_MODE(key_type); + + /*将数据组合成一个数组中并写入缓存中进行保存*/ + ZXIC_COMM_MEMCPY(entry_data, p_rbkey_new->key, key_by_size); + ZXIC_COMM_MEMCPY(entry_data + key_by_size, p_rbkey_new->rst, ((rst_by_size > HASH_RST_MAX) ? HASH_RST_MAX : rst_by_size)); + zxic_comm_swap(entry_data, SE_ENTRY_WIDTH_MAX); + dpp_dtb_ddr_hash_table_data_write(dev_id, + p_ddr_cfg->ddr_baddr, + ddr_wr_mode, + index, + p_ddr_cfg->ddr_ecc_en, + entry_data, + p_entry); + ZXIC_COMM_TRACE_DEBUG("entry_data is:"); + + for (i = 0; i < SE_ENTRY_WIDTH_MAX; i++) + { + ZXIC_COMM_TRACE_DEBUG("0x%02x ", entry_data[i]); + } + + ZXIC_COMM_TRACE_DEBUG("\n"); + + } + else /* hash条目存在zcam上*/ + { + /*写ZCAM表格式*/ + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "zcam p_item_info->hw_addr is 0x%x \n", p_item_info->hw_addr); + addr = p_item_info->hw_addr; + + /*将数据组合成一个数组中并写入缓存中进行保存*/ + p_entry_dn = p_item_info->item_list.p_next; + + while (p_entry_dn) + { + p_rbkey = (DPP_HASH_RBKEY_INFO *)(p_entry_dn->data); + // table_id = DPP_GET_HASH_TBL_ID(p_rbkey->key); + key_type = DPP_GET_HASH_KEY_TYPE(p_rbkey->key); + key_by_size = DPP_GET_KEY_SIZE(actu_key_size); + ZXIC_COMM_CHECK_INDEX_UPPER(key_by_size,HASH_KEY_MAX); + rst_by_size = DPP_GET_RST_SIZE(key_type, actu_key_size); + + byte_offset = p_rbkey->entry_pos * HASH_ENTRY_POS_STEP; + ZXIC_COMM_MEMCPY(entry_data + byte_offset, p_rbkey->key, key_by_size); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(dev_id, byte_offset, key_by_size); + byte_offset += key_by_size; + ZXIC_COMM_MEMCPY(entry_data + byte_offset, p_rbkey->rst, ((rst_by_size > HASH_RST_MAX) ? HASH_RST_MAX : rst_by_size)); + + temp_mask |= ((((1U << (p_rbkey->entry_size/16U)) - 1U) << (4U - p_rbkey->entry_size/16U - p_rbkey->entry_pos)) & 0xF);//计算掩码 + + p_entry_dn = p_entry_dn->next; + } + + zxic_comm_swap(entry_data, SE_ENTRY_WIDTH_MAX); + + dpp_dtb_se_alg_zcam_data_write(dev_id, + addr, + entry_data, + p_entry); + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "zcam_item_data is:"); + + for (i = 0; i < SE_ITEM_WIDTH_MAX; i++) + { + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "0x%02x ", entry_data[i]); + } + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "\n"); + } + + return DPP_OK; +} + + +/** 增加hash表条目时写buff函数 +* @param dev_id 设备号 +* @param p_hash_entry_cfg 该hash条目的格式内容信息 +* @param p_data_buff 保存用于dtb下表数据的buff +* @param index 该hash条目的编号 +* @param p_dtb_len 下发完该hash表条目后dtb数据的长度 +* @return +* @remark 无 +* @see +* @author cbb @date 2023/06/03 +************************************************************/ +DPP_STATUS dpp_dtb_add_hash_buf_write(ZXIC_UINT32 dev_id, + HASH_ENTRY_CFG *p_hash_entry_cfg, + ZXIC_UINT8 *p_data_buff, + ZXIC_UINT32 index, + ZXIC_UINT32 *p_dtb_len) +{ + DPP_STATUS rc = DPP_OK; + SE_ITEM_CFG *p_item_info = NULL; + ZXIC_UINT32 ddr_wr_mode = 0; + ZXIC_UINT32 addr_offset = 0; + DPP_DTB_ENTRY_T dtb_one_entry = {0}; /*条目结构*/ + ZXIC_UINT8 cmd_buff[DTB_TABLE_CMD_SIZE_BIT / 8] = {0}; /*命令格式缓存*/ + ZXIC_UINT8 hash_entry_data[SE_ENTRY_WIDTH_MAX] = {0}; + + ZXIC_COMM_CHECK_POINT(p_hash_entry_cfg); + ZXIC_COMM_CHECK_POINT(p_hash_entry_cfg->p_rbkey_new); + ZXIC_COMM_CHECK_POINT(p_dtb_len); + + ZXIC_COMM_MEMSET(cmd_buff,0x0,sizeof(cmd_buff)); + ZXIC_COMM_MEMSET(hash_entry_data,0x0,sizeof(hash_entry_data)); + dtb_one_entry.cmd = cmd_buff; + dtb_one_entry.data = hash_entry_data; + + /*将位置信息和数据信息写入buff中*/ + rc = dpp_dtb_hash_form_write(p_hash_entry_cfg->p_hash_cfg, + p_hash_entry_cfg->p_rbkey_new, + p_hash_entry_cfg->actu_key_size, + &dtb_one_entry); /*计算一个条目的位置信息,并保存起来*/ + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_dtb_hash_form_write"); + + p_item_info = p_hash_entry_cfg->p_rbkey_new->p_item_info; + ZXIC_COMM_CHECK_POINT(p_item_info); + ddr_wr_mode = DPP_GET_DDR_WR_MODE(p_hash_entry_cfg->key_type); + + /*将数据写入缓存中,并更新长度统计*/ + if(p_item_info->item_type == ITEM_DDR_256 || p_item_info->item_type == ITEM_DDR_512) + { + dtb_one_entry.data_size = DTB_LEN_POS_SETP * (ddr_wr_mode + 1); + addr_offset = index * (ddr_wr_mode + 2) * DTB_LEN_POS_SETP; /*在缓存中相对于0的offset*/ + (*p_dtb_len) += (ddr_wr_mode + 2);//dtb长度进行计数 + } + else/*ram or reg*/ + { + dtb_one_entry.data_size = DTB_LEN_POS_SETP * (DTB_ZCAM_LEN_SIZE - 1); + addr_offset = index * DTB_ZCAM_LEN_SIZE * DTB_LEN_POS_SETP; /*在缓存中相对于0的offset*/ + (*p_dtb_len) += DTB_ZCAM_LEN_SIZE;//dtb长度进行计数 + } + + rc = dpp_dtb_data_write(p_data_buff, addr_offset, &dtb_one_entry); /*将数据写入缓存中*/ + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_data_write"); + + return rc; +} + +/** 删除hash表条目时写buff函数 +* @param dev_id 设备号 +* @param p_hash_entry_cfg 该hash条目的格式内容信息 +* @param p_data_buff 保存用于dtb下表数据的buff +* @param index 该hash条目的编号 +* @param p_dtb_len 下发完该hash表条目后dtb数据的长度 +* @return +* @remark 无 +* @see +* @author cbb @date 2023/06/03 +************************************************************/ +DPP_STATUS dpp_dtb_delete_hash_buf_write(ZXIC_UINT32 dev_id, + HASH_ENTRY_CFG *p_hash_entry_cfg, + ZXIC_UINT8 *p_data_buff, + ZXIC_UINT32 index, + ZXIC_UINT32 *p_dtb_len) +{ + DPP_STATUS rc = DPP_OK; + SE_ITEM_CFG *p_item_info = NULL; + ZXIC_UINT32 ddr_wr_mode = 0; + ZXIC_UINT32 addr_offset = 0; + DPP_DTB_ENTRY_T dtb_one_entry = {0}; /*条目结构*/ + ZXIC_UINT8 cmd_buff[DTB_TABLE_CMD_SIZE_BIT / 8] = {0}; /*命令格式缓存*/ + ZXIC_UINT8 hash_entry_data[SE_ENTRY_WIDTH_MAX] = {0}; + + ZXIC_COMM_CHECK_POINT(p_hash_entry_cfg); + ZXIC_COMM_CHECK_POINT(p_hash_entry_cfg->p_rbkey_new); + ZXIC_COMM_CHECK_POINT(p_dtb_len); + + ZXIC_COMM_MEMSET(cmd_buff,0x0,sizeof(cmd_buff)); + ZXIC_COMM_MEMSET(hash_entry_data,0x0,sizeof(hash_entry_data)); + dtb_one_entry.cmd = cmd_buff; + dtb_one_entry.data = hash_entry_data; + + /*将位置信息和数据信息写入buff中*/ + rc = dpp_dtb_hash_form_write(p_hash_entry_cfg->p_hash_cfg, + p_hash_entry_cfg->p_rbkey_new, + p_hash_entry_cfg->actu_key_size, + &dtb_one_entry); /*计算一个条目的位置信息,并保存起来*/ + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_dtb_hash_form_write"); + + p_item_info = p_hash_entry_cfg->p_rbkey_new->p_item_info; + ZXIC_COMM_CHECK_POINT(p_item_info); + ddr_wr_mode = DPP_GET_DDR_WR_MODE(p_hash_entry_cfg->key_type); + + /*将数据写入缓存中,并更新长度统计*/ + if(p_item_info->item_type == ITEM_DDR_256 || p_item_info->item_type == ITEM_DDR_512) + { + dtb_one_entry.data_size = DTB_LEN_POS_SETP * (ddr_wr_mode + 1); + addr_offset = index * (ddr_wr_mode + 2) * DTB_LEN_POS_SETP; /*在缓存中相对于0的offset*/ + (*p_dtb_len) += (ddr_wr_mode + 2);//dtb长度进行计数 + } + else/*ram or reg*/ + { + dtb_one_entry.data_size = DTB_LEN_POS_SETP * (DTB_ZCAM_LEN_SIZE - 1); + addr_offset = index * DTB_ZCAM_LEN_SIZE * DTB_LEN_POS_SETP; /*在缓存中相对于0的offset*/ + (*p_dtb_len) += DTB_ZCAM_LEN_SIZE;//dtb长度进行计数 + } + + ZXIC_COMM_MEMSET(dtb_one_entry.data, 0x0, dtb_one_entry.data_size);//清除下表数据 + + rc = dpp_dtb_data_write(p_data_buff, addr_offset, &dtb_one_entry); /*将数据写入缓存中*/ + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_data_write"); + + return rc; +} + + + +/***********************************************************/ +/** dtb 添加eTcam表条目,将etcam条目内容写入到entry中 +* @param dev_id 设备号 +* @param addr 每个block中的ram地址,位宽为8*80bit +* @param block_idx block编号,范围0~7 +* @param wr_mask 写表掩码,共8bit,每bit控制ram中对应位置的80bit数据是否有效 +* @param opr_type etcam操作类型,详见 DPP_ETCAM_OPR_TYPE_E +* @param p_entry 条目数据,data和mask +* @param p_entry_data 组装好的数据条目(已分配好空间) +* @param p_entry_mask 组装好的掩码条目(已分配好空间) +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/04/03 +************************************************************/ +DPP_STATUS dpp_dtb_etcam_entry_add(DPP_DEV_T *dev, + ZXIC_UINT32 addr, + ZXIC_UINT32 block_idx, + ZXIC_UINT32 wr_mask, + ZXIC_UINT32 opr_type, + DPP_ETCAM_ENTRY_T *p_entry, + DPP_DTB_ENTRY_T *p_entry_data, + DPP_DTB_ENTRY_T *p_entry_mask + ) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT8 temp_data[DPP_ETCAM_WIDTH_MAX / 8] = {0}; + ZXIC_UINT8 temp_mask[DPP_ETCAM_WIDTH_MAX / 8] = {0}; + DPP_ETCAM_ENTRY_T entry_xy = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), addr, 0, DPP_ETCAM_RAM_DEPTH - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), block_idx, 0, DPP_ETCAM_BLOCK_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), wr_mask, 0, DPP_ETCAM_WR_MASK_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), opr_type, DPP_ETCAM_OPR_DM, DPP_ETCAM_OPR_XY); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_entry); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_entry_data); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_entry_mask); + + ZXIC_COMM_ASSERT(p_entry->p_data && p_entry->p_mask); + + entry_xy.p_data = temp_data; + entry_xy.p_mask = temp_mask; + + if (opr_type == DPP_ETCAM_OPR_DM) + { + /* convert user D/M data to X/Y */ + rc = dpp_etcam_dm_to_xy(p_entry, &entry_xy, DPP_ETCAM_ENTRY_SIZE_GET(p_entry->mode)); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_etcam_dm_to_xy"); + } + else + { + ZXIC_COMM_MEMCPY(entry_xy.p_data, p_entry->p_data, DPP_ETCAM_ENTRY_SIZE_GET(p_entry->mode));//复制出实际的数据 + ZXIC_COMM_MEMCPY(entry_xy.p_mask, p_entry->p_mask, DPP_ETCAM_ENTRY_SIZE_GET(p_entry->mode)); + } + + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("etcam xy:/n"); + dpp_acl_data_print(entry_xy.p_data, entry_xy.p_mask, p_entry->mode); + } + + /*组装data格式*/ + rc = dpp_dtb_etcam_write_entry_data(dev, + block_idx, + 0, + 1, + 0, + 0, + 0,//0:写;1读 + wr_mask, + DPP_ETCAM_DTYPE_DATA, + addr, + 0, + entry_xy.p_data, + p_entry_data); + + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_etcam_write_entry_data"); + + /*组装mask格式*/ + rc = dpp_dtb_etcam_write_entry_data(dev, + block_idx, + 0, + 1, + 0, + 0, + 0, + wr_mask , + DPP_ETCAM_DTYPE_MASK , + addr , + 0xFF, + entry_xy.p_mask, + p_entry_mask); + + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_etcam_write_entry_data"); + + return DPP_OK; +} + +/** dtb写eRam表 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no eram表sdt表号 +* @param entry_cnt 下发的条目数 +* @param p_entry_arr 待下发表项内容结构体数组指针 +* @param element_id 返回下表使用的元素id +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_eram_dma_write_cycle(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + ZXIC_UINT32 entry_num, + DPP_DTB_ERAM_ENTRY_INFO_T *p_entry_arr, + ZXIC_UINT32 *element_id + ) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 wrt_mode; + ZXIC_UINT32 base_addr; + ZXIC_UINT32 index; + ZXIC_UINT32 item_cnt = 0; + ZXIC_UINT32 addr_offset = 0; + ZXIC_UINT32 *p_entry_data = NULL; + ZXIC_UINT32 dtb_len = 0; + + ZXIC_UINT8 *table_data_buff = NULL; + ZXIC_UINT32 entry_data_buff[4] = {0}; + ZXIC_UINT8 cmd_buff[DTB_TABLE_CMD_SIZE_BIT / 8] = {0}; + + DPP_SDTTBL_ERAM_T sdt_eram_info = {0}; + DPP_DTB_ENTRY_T dtb_one_entry = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DTB_QUEUE_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_LOWER(DEV_ID(dev), entry_num, 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_entry_arr); + + //分配下表数据缓存 16K + table_data_buff = (ZXIC_UINT8 *) ZXIC_COMM_MALLOC(DPP_DTB_TABLE_DATA_BUFF_SIZE * sizeof(ZXIC_UINT8)); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), table_data_buff); + ZXIC_COMM_MEMSET(table_data_buff, 0, DPP_DTB_TABLE_DATA_BUFF_SIZE * sizeof(ZXIC_UINT8)); + + dtb_one_entry.cmd = cmd_buff; + dtb_one_entry.data = (ZXIC_UINT8 *)entry_data_buff; + + //从sdt_no中获取SDT配置 + rc = dpp_soft_sdt_tbl_get(DEV_ID(dev), sdt_no, &sdt_eram_info); + ZXIC_COMM_CHECK_DEV_RC_MEMORY_FREE(DEV_ID(dev), rc, "dpp_soft_sdt_tbl_get", table_data_buff); + base_addr = sdt_eram_info.eram_base_addr; + wrt_mode = sdt_eram_info.eram_mode;//3:128 + + switch (wrt_mode) + { + case ERAM128_TBL_128b: + { + wrt_mode = ERAM128_OPR_128b; + break; + } + + case ERAM128_TBL_64b: + { + wrt_mode = ERAM128_OPR_64b; + break; + } + + case ERAM128_TBL_1b: + { + wrt_mode = ERAM128_OPR_1b; + break; + } + } + + for(item_cnt = 0; item_cnt < entry_num; ++item_cnt) + { + p_entry_data = (ZXIC_UINT32 *)p_entry_arr[item_cnt].p_data; + ZXIC_COMM_CHECK_DEV_POINT_MEMORY_FREE(DEV_ID(dev), p_entry_data, table_data_buff); + index = p_entry_arr[item_cnt].index; + + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("dpp_dtb_eram_dma_write_cycle : the item index is %d !\n", index); + } + + //将一个数据写入entry + rc = dpp_dtb_se_smmu0_ind_write(dev, + base_addr, + index, + wrt_mode, + p_entry_data, + &dtb_one_entry); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_se_smmu0_ind_write", table_data_buff); + + switch (wrt_mode) + { + case ERAM128_OPR_128b: + { + dtb_len += 2; + addr_offset = item_cnt * DTB_LEN_POS_SETP * 2; + break; + } + + case ERAM128_OPR_64b: + { + dtb_len += 1; + addr_offset = item_cnt * DTB_LEN_POS_SETP; + break; + } + + case ERAM128_OPR_1b: + { + dtb_len += 1; + addr_offset = item_cnt * DTB_LEN_POS_SETP; + break; + } + } + + /*将表格式和数据写入缓存buff中*/ + rc = dpp_dtb_data_write(table_data_buff, addr_offset, &dtb_one_entry); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_data_write", table_data_buff); + ZXIC_COMM_MEMSET(cmd_buff, 0, DTB_TABLE_CMD_SIZE_BIT / 8); + ZXIC_COMM_MEMSET(entry_data_buff, 0, 4 * sizeof(ZXIC_UINT32)); + } + + if(dpp_dtb_prt_get()) + { + dpp_data_buff_print(table_data_buff, dtb_len * 16); + ZXIC_COMM_PRINT("start down table to dtb : queue_id: %d, down_data_len: %d\n", queue_id, dtb_len * 16); + } + + rc = dpp_dtb_write_down_table_data(dev, + queue_id, + dtb_len * 16, + table_data_buff, + element_id + ); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_write_down_table_data", table_data_buff); + + ZXIC_COMM_FREE(table_data_buff); + + return DPP_OK; +} + + +/** dtb写ddr中的数据,数据长度在16K范围内 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param ddr_base_addr ddr基地址,以4K*128bit为单位 +* @param ddr_wr_mode ddr写模式 0-128bit, 1-256bit, 2-384bit, 3-512bit,取值参考SMMU1_DDR_WRT_MODE_E的定义 +* @param ddr_ecc_en ddr ECC使能 +* @param entry_num 下发的条目数 +* @param p_entry_arr 待下发表项内容结构体数组指针 +* @param element_id 返回下表使用的元素id +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_smmu1_data_write_cycle(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 ddr_base_addr, + ZXIC_UINT32 ddr_wr_mode, + ZXIC_UINT32 ddr_ecc_en, + ZXIC_UINT32 entry_num, + DPP_DTB_DDR_ENTRY_INFO_T *p_entry_arr, + ZXIC_UINT32 *element_id) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 index; + ZXIC_UINT32 item_cnt = 0; + ZXIC_UINT32 addr_offset = 0; + ZXIC_UINT32 *p_entry_data = NULL; + ZXIC_UINT32 dtb_len = 0; + ZXIC_UINT8 *table_data_buff = NULL; + ZXIC_UINT8 cmd_buff[DTB_TABLE_CMD_SIZE_BIT / 8] = {0}; /*命令格式缓存*/ + ZXIC_UINT32 entry_data_buff[DPP_DIR_TBL_BUF_MAX_NUM] = {0}; + + DPP_DTB_ENTRY_T dtb_one_entry = {0}; /*条目结构*/ + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DTB_QUEUE_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_LOWER(DEV_ID(dev), entry_num, 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_entry_arr); + + //分配下表数据缓存 16K + table_data_buff = (ZXIC_UINT8 *) ZXIC_COMM_MALLOC(DPP_DTB_TABLE_DATA_BUFF_SIZE * sizeof(ZXIC_UINT8)); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), table_data_buff); + ZXIC_COMM_MEMSET(table_data_buff, 0, DPP_DTB_TABLE_DATA_BUFF_SIZE * sizeof(ZXIC_UINT8)); + + dtb_one_entry.cmd = cmd_buff; + dtb_one_entry.data = (ZXIC_UINT8 *)entry_data_buff; + + /*对每一个条目进行处理*/ + for(item_cnt = 0; item_cnt < entry_num; ++item_cnt) + { + p_entry_data = (ZXIC_UINT32 *)p_entry_arr[item_cnt].p_data; + ZXIC_COMM_CHECK_POINT_MEMORY_FREE_NO_ASSERT(p_entry_data, table_data_buff); + + index = p_entry_arr[item_cnt].index; + + //将一个数据写入entry + rc = dpp_dtb_ddr_dir_table_data_write(DEV_ID(dev), + ddr_base_addr, + ddr_wr_mode, + index, + ddr_ecc_en, + (ZXIC_UINT8 *)p_entry_data, + &dtb_one_entry); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_ddr_dir_table_data_write", table_data_buff); + + dtb_len += (ddr_wr_mode + 2); + addr_offset = item_cnt * (ddr_wr_mode + 2) * DTB_LEN_POS_SETP; + + /*数据写入缓存中*/ + rc = dpp_dtb_data_write(table_data_buff, addr_offset, &dtb_one_entry); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_data_write", table_data_buff); + ZXIC_COMM_MEMSET(cmd_buff, 0, DTB_TABLE_CMD_SIZE_BIT / 8); + ZXIC_COMM_MEMSET(entry_data_buff, 0, DPP_DIR_TBL_BUF_MAX_NUM * sizeof(ZXIC_UINT32)); + } + + if(dpp_dtb_prt_get()) + { + dpp_data_buff_print(table_data_buff, dtb_len * 16); + ZXIC_COMM_PRINT("start down table to dtb : queue_id: %d, down_data_len: %d\n", queue_id, dtb_len * 16); + } + + rc = dpp_dtb_write_down_table_data(dev, + queue_id, + dtb_len * 16, + table_data_buff, + element_id + ); + ZXIC_COMM_FREE(table_data_buff); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_write_down_table_data"); + + return DPP_OK; +} + +/** dtb写HASH表,在插入条目时如果冲突,则对冲突条目进行记录 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no hash表sdt表号 +* @param entry_cnt 下发的条目数 +* @param p_entry_arr 待下发表项内容结构体数组指针 +* @param element_id 返回下表使用的元素id +* @return +* @remark 无 是否是有一个写不成功就返回,还是继续进行下一个条目并记录错误的条目 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_hash_dma_insert_cycle(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + ZXIC_UINT32 entry_num, + DPP_DTB_HASH_ENTRY_INFO_T *p_arr_hash_entry, + ZXIC_UINT32 *element_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT8 temp_key[HASH_KEY_MAX] = {0}; + ZXIC_UINT8 end_flag = 0; + ZXIC_UINT32 ddr_wr_mode = 0; + ZXIC_UINT32 item_cnt = 0; + ZXIC_UINT8 key_valid = 1; + ZXIC_UINT32 dtb_len = 0; + ZXIC_UINT8 key[HASH_KEY_MAX] = {0}; + ZXIC_UINT8 rst[HASH_RST_MAX] = {0}; + + DPP_SE_CFG *p_se_cfg = NULL; + ZXIC_RB_TN *p_rb_tn_new = NULL; + ZXIC_RB_TN *p_rb_tn_rtn = NULL; + DPP_HASH_CFG *p_hash_cfg = NULL; + DPP_HASH_RBKEY_INFO *p_rbkey_new = NULL; + FUNC_ID_INFO *p_func_info = NULL; + HASH_ENTRY_CFG hash_entry_cfg = {0}; + DPP_SDTTBL_HASH_T sdt_hash_info = {0}; /*SDT内容*/ + DPP_HASH_ENTRY entry = {0}; /* hash条目结构体*/ + ZXIC_UINT8 *p_data_buff = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DTB_QUEUE_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_LOWER(DEV_ID(dev), entry_num, 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_arr_hash_entry); + + //从sdt_no中获取SDT配置 + rc = dpp_soft_sdt_tbl_get(DEV_ID(dev), sdt_no, &sdt_hash_info); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_soft_sdt_tbl_read"); + + hash_entry_cfg.fun_id = sdt_hash_info.hash_id; /*hash引擎*/ + ZXIC_COMM_CHECK_INDEX(hash_entry_cfg.fun_id, HASH_FUNC_ID_MIN, HASH_FUNC_ID_NUM - 1); + hash_entry_cfg.table_id = sdt_hash_info.hash_table_id; /*hash表号*/ + ZXIC_COMM_CHECK_INDEX_UPPER(hash_entry_cfg.table_id,HASH_TBL_ID_NUM - 1); + hash_entry_cfg.bulk_id = ((hash_entry_cfg.table_id >> 2) & 0x7); + ZXIC_COMM_CHECK_INDEX_UPPER(hash_entry_cfg.bulk_id,HASH_BULK_NUM - 1); + hash_entry_cfg.key_type = sdt_hash_info.hash_table_width; /*表宽度*/ + ZXIC_COMM_CHECK_INDEX(hash_entry_cfg.key_type, HASH_KEY_128b, HASH_KEY_512b); + hash_entry_cfg.actu_key_size = sdt_hash_info.key_size; /*业务表键值长度*/ + ZXIC_COMM_CHECK_INDEX(hash_entry_cfg.actu_key_size, HASH_ACTU_KEY_MIN, HASH_ACTU_KEY_MAX); + hash_entry_cfg.key_by_size = DPP_GET_KEY_SIZE(hash_entry_cfg.actu_key_size); + hash_entry_cfg.rst_by_size = DPP_GET_RST_SIZE(hash_entry_cfg.key_type, hash_entry_cfg.actu_key_size); + + /* 取出se配置 */ + rc = dpp_se_cfg_get(DEV_ID(dev), &p_se_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_se_cfg_get"); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_se_cfg); + p_func_info = DPP_GET_FUN_INFO(p_se_cfg, hash_entry_cfg.fun_id); + DPP_SE_CHECK_FUN(p_func_info, hash_entry_cfg.fun_id, FUN_HASH); + hash_entry_cfg.p_hash_cfg = (DPP_HASH_CFG *)p_func_info->fun_ptr; + + /*条目数上限检查*/ + ddr_wr_mode = DPP_GET_DDR_WR_MODE(hash_entry_cfg.key_type); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), entry_num, 1, DTB_DATA_SIZE_BIT / ( (ddr_wr_mode + 2) * DTB_TABLE_CMD_SIZE_BIT)); + + entry.p_key = key; + entry.p_rst = rst; + entry.p_key[0] = (ZXIC_UINT8)(((key_valid & 0x1) << 7) | ((hash_entry_cfg.key_type & 0x3) << 5) | (hash_entry_cfg.table_id & 0x1f)); + + p_data_buff = (ZXIC_UINT8 *)ZXIC_COMM_MALLOC(DPP_DTB_TABLE_DATA_BUFF_SIZE); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data_buff); + ZXIC_COMM_MEMSET(p_data_buff,0x0,DPP_DTB_TABLE_DATA_BUFF_SIZE); + + /*对每一个条目进行处理*/ + for(item_cnt = 0; item_cnt < entry_num; ++item_cnt) + { + end_flag = 0; + /*组装数据*/ + ZXIC_COMM_MEMCPY(&entry.p_key[1], p_arr_hash_entry[item_cnt].p_actu_key, hash_entry_cfg.actu_key_size); + ZXIC_COMM_MEMCPY(&entry.p_rst[0], p_arr_hash_entry[item_cnt].p_rst, ((hash_entry_cfg.rst_by_size > HASH_RST_MAX) ? HASH_RST_MAX : hash_entry_cfg.rst_by_size)); + + rc = dpp_hash_red_black_node_alloc(dev,&p_rb_tn_new,&p_rbkey_new); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc,"dpp_hash_red_black_node_alloc",p_data_buff); + ZXIC_COMM_MEMCPY(p_rbkey_new->key, entry.p_key, hash_entry_cfg.key_by_size); + hash_entry_cfg.p_rbkey_new = p_rbkey_new; + hash_entry_cfg.p_rb_tn_new = p_rb_tn_new; + + rc = dpp_hash_rb_insert(dev,&hash_entry_cfg,&entry); + if(DPP_OK != rc) + { + if(DPP_HASH_RC_ADD_UPDATE == rc) + { + /*将位置信息和数据信息写入buff中*/ + rc = dpp_dtb_add_hash_buf_write(DEV_ID(dev),&hash_entry_cfg,p_data_buff,item_cnt,&dtb_len); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_hash_form_write",p_data_buff); + } + continue; + } + + /*insert new hash item*/ + /*1 first form the new key(calc crc)*/ + rc = dpp_hash_set_crc_key(dev,&hash_entry_cfg,&entry,temp_key); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc,"hash_set_crc_key",p_data_buff); + + /*2 if DDR is valid, first insert into DDR.*/ + p_hash_cfg = hash_entry_cfg.p_hash_cfg; + if (p_hash_cfg->ddr_valid) + { + rc = dpp_hash_insert_ddr(dev,&hash_entry_cfg,temp_key,&end_flag); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc,"hash_insert_ddr",p_data_buff); + } + + /*3 if insert into DDR is fail, insert into ZCAM. */ + if (!end_flag) + { + rc = dpp_hash_insert_zcell(dev,p_se_cfg,&hash_entry_cfg,temp_key,&end_flag); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc,"hash_insert_zcell",p_data_buff); + } + + /*4 if insert into ZCAM is fail, insert into ZBLK Reg. */ + if (!end_flag) + { + rc = dpp_hash_insert_zreg(dev,&hash_entry_cfg,temp_key,&end_flag); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc,"hash_insert_zreg",p_data_buff); + } + + if (!end_flag) + { + p_hash_cfg->hash_stat.insert_fail++; + /* recycle rb tree node */ + ZXIC_COMM_MEMCPY(temp_key, entry.p_key, hash_entry_cfg.key_by_size); + rc = zxic_comm_rb_delete(&p_hash_cfg->hash_rb, p_rbkey_new, &p_rb_tn_rtn); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "zxic_comm_rb_delete",p_data_buff); + ZXIC_COMM_ASSERT(p_rb_tn_new == p_rb_tn_rtn); + ZXIC_COMM_FREE(p_rbkey_new); + ZXIC_COMM_FREE(p_rb_tn_rtn); + ZXIC_COMM_FREE(p_data_buff); + dpp_dtb_data_print(temp_key, hash_entry_cfg.key_by_size); + ZXIC_COMM_TRACE_ERROR("DPP_HASH_RC_TBL_FULL.\n"); + return DPP_RC_DTB_DOWN_HASH_CONFLICT; + } + + /*将位置信息和数据信息写入buff中*/ + rc = dpp_dtb_add_hash_buf_write(DEV_ID(dev),&hash_entry_cfg,p_data_buff,item_cnt,&dtb_len); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_hash_form_write",p_data_buff); + + p_hash_cfg->hash_stat.insert_ok++; + } + + if(dpp_dtb_prt_get()) + { + dpp_data_buff_print(p_data_buff, dtb_len * 16); + } + + rc = dpp_dtb_write_down_table_data(dev, + queue_id, + dtb_len * 16, + p_data_buff, + element_id); + ZXIC_COMM_FREE(p_data_buff); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_write_down_table_data"); + + return DPP_OK; +} + + +/** dtb写ACL表 (SPECIFY模式,条目中指定handle,支持级联64bit/128bit) +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no ACL表sdt表号 +* @param entry_cnt 下发的条目数 +* @param p_entry_arr 待下发表项内容结构体数组指针 +* @param element_id 返回下表使用的元素id +* @return +* @remark 无 是否是有一个写不成功就返回,还是继续进行下一个条目并记录错误的条目 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_acl_dma_insert_cycle(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + ZXIC_UINT32 entry_num, + DPP_DTB_ACL_ENTRY_INFO_T *p_acl_entry_arr, + ZXIC_UINT32 *element_id + ) +{ + /* + 1、条目的handle值是指定的; + 2、根据级联配置在etcam中保存级联结果值 + */ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 etcam_key_mode; + ZXIC_UINT32 as_eram_baddr; + ZXIC_UINT32 as_enable; + ZXIC_UINT32 etcam_table_id; + ZXIC_UINT32 etcam_as_mode; + ZXIC_UINT32 block_idx = 0; + ZXIC_UINT32 ram_addr = 0; + ZXIC_UINT32 etcam_wr_mode = 0; + ZXIC_UINT32 eram_wrt_mode = 0; + ZXIC_UINT32 eram_index; + + ZXIC_UINT32 item_cnt = 0; + ZXIC_UINT32 addr_offset_bk = 0; + ZXIC_UINT32 dtb_len = 0; + ZXIC_UINT32 as_addr_offset = 0; + ZXIC_UINT32 as_dtb_len = 0; + + DPP_ACL_CFG_EX_T *p_acl_cfg = NULL; + DPP_ACL_TBL_CFG_T *p_tbl_cfg = NULL; + DPP_DTB_ACL_ENTRY_INFO_T *p_acl_entry = NULL; + ZXIC_UINT32 *p_as_eram_data = NULL; + ZXIC_UINT8 *table_data_buff = NULL; + DPP_ETCAM_ENTRY_T etcam_entry = {0}; + + ZXIC_UINT8 entry_data_buff[DPP_ETCAM_WIDTH_MAX / 8] = {0}; + ZXIC_UINT8 entry_mask_buff[DPP_ETCAM_WIDTH_MAX / 8] = {0}; + ZXIC_UINT32 as_eram_data_buff[4] = {0}; + ZXIC_UINT8 entry_data_cmd_buff[DTB_TABLE_CMD_SIZE_BIT / 8] = {0}; + ZXIC_UINT8 entry_mask_cmd_buff[DTB_TABLE_CMD_SIZE_BIT / 8] = {0}; + ZXIC_UINT8 as_eram_cmd_buff[DTB_TABLE_CMD_SIZE_BIT / 8] = {0}; + + DPP_SDTTBL_ETCAM_T sdt_etcam_info = {0}; + DPP_DTB_ENTRY_T entry_data = {0}; + DPP_DTB_ENTRY_T entry_mask = {0}; + DPP_DTB_ENTRY_T dtb_as_data_entry = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DTB_QUEUE_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_LOWER(DEV_ID(dev), entry_num, 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_acl_entry_arr); + + entry_data.cmd = entry_data_cmd_buff; + entry_data.data = (ZXIC_UINT8 *)entry_data_buff; + + entry_mask.cmd = entry_mask_cmd_buff; + entry_mask.data = (ZXIC_UINT8 *)entry_mask_buff; + + dtb_as_data_entry.cmd = as_eram_cmd_buff; + dtb_as_data_entry.data = (ZXIC_UINT8 *)as_eram_data_buff; + + //分配下表数据缓存 16K + table_data_buff = (ZXIC_UINT8 *) ZXIC_COMM_MALLOC(DPP_DTB_TABLE_DATA_BUFF_SIZE * sizeof(ZXIC_UINT8)); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), table_data_buff); + ZXIC_COMM_MEMSET(table_data_buff, 0, DPP_DTB_TABLE_DATA_BUFF_SIZE * sizeof(ZXIC_UINT8)); + + //从sdt_no中获取SDT配置 + rc = dpp_soft_sdt_tbl_get(DEV_ID(dev), sdt_no, &sdt_etcam_info); + ZXIC_COMM_CHECK_DEV_RC_MEMORY_FREE(DEV_ID(dev), rc, "dpp_soft_sdt_tbl_get", table_data_buff); + etcam_key_mode = sdt_etcam_info.etcam_key_mode; + ZXIC_COMM_CHECK_INDEX_MEMORY_FREE_NO_ASSERT(etcam_key_mode, DPP_ACL_KEY_640b, DPP_ACL_KEY_80b, table_data_buff); + etcam_as_mode = sdt_etcam_info.as_rsp_mode; + ZXIC_COMM_CHECK_INDEX_MEMORY_FREE_NO_ASSERT(etcam_as_mode, DPP_ACL_AS_MODE_64b, DPP_ACL_AS_MODE_INVALID - 1, table_data_buff); + etcam_table_id = sdt_etcam_info.etcam_table_id; + ZXIC_COMM_CHECK_INDEX_MEMORY_FREE_NO_ASSERT(etcam_table_id, DPP_ACL_TBL_ID_MIN, DPP_ACL_TBL_ID_MAX, table_data_buff); + as_enable = sdt_etcam_info.as_en; + as_eram_baddr = sdt_etcam_info.as_eram_baddr; + + //级联数据下发 + if(as_enable) + { + //mode转换 + switch (etcam_as_mode) + { + case ERAM128_TBL_128b: + { + eram_wrt_mode = ERAM128_OPR_128b; + break; + } + + case ERAM128_TBL_64b: + { + eram_wrt_mode = ERAM128_OPR_64b; + break; + } + + case ERAM128_TBL_1b: + { + eram_wrt_mode = ERAM128_OPR_1b; + break; + } + } + } + + dpp_acl_cfg_get(&p_acl_cfg);//获取ACL表资源配置 + ZXIC_COMM_CHECK_POINT_MEMORY_FREE(p_acl_cfg, table_data_buff); + + p_tbl_cfg = p_acl_cfg->acl_tbls + etcam_table_id;//得到该acl表的资源配置 + + if (!p_tbl_cfg->is_used) + { + ZXIC_COMM_TRACE_ERROR("table[ %d ] is not init!\n", etcam_table_id); + ZXIC_COMM_FREE(table_data_buff); + ZXIC_COMM_ASSERT(0); + return DPP_ACL_RC_TBL_NOT_INIT; + } + + /*对每一个条目进行处理*/ + for(item_cnt = 0; item_cnt < entry_num; ++item_cnt) + { + p_acl_entry = p_acl_entry_arr + item_cnt; + + /* write etcam key */ + etcam_entry.mode = p_tbl_cfg->key_mode; + etcam_entry.p_data = p_acl_entry->key_data; + etcam_entry.p_mask = p_acl_entry->key_mask; + + /*计算地址等信息*/ + rc = dpp_acl_hdw_addr_get(p_tbl_cfg, p_acl_entry->handle, &block_idx, &ram_addr, &etcam_wr_mode); + ZXIC_COMM_CHECK_RC_MEMORY_FREE(rc, "dpp_acl_hdw_addr_get", table_data_buff); + + rc = dpp_dtb_etcam_entry_add(dev, + ram_addr, + block_idx, + etcam_wr_mode, + DPP_ETCAM_OPR_DM, + &etcam_entry, + &entry_data, + &entry_mask + ); + + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_etcam_entry_add", table_data_buff); + + /*data数据写入缓存*/ + dtb_len += DTB_ETCAM_LEN_SIZE; + dpp_dtb_data_write(table_data_buff, addr_offset_bk, &entry_data); /*将数据写入缓存中*/ + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_data_write", table_data_buff); + ZXIC_COMM_MEMSET(entry_data_cmd_buff, 0, DTB_TABLE_CMD_SIZE_BIT / 8); + ZXIC_COMM_MEMSET(entry_data_buff, 0, DPP_ETCAM_WIDTH_MAX / 8); + addr_offset_bk = addr_offset_bk + DTB_ETCAM_LEN_SIZE * DTB_LEN_POS_SETP; /*在缓存中相对于0的offset*/ + + /*mask数据写入缓存*/ + dtb_len += DTB_ETCAM_LEN_SIZE; + rc = dpp_dtb_data_write(table_data_buff, addr_offset_bk, &entry_mask); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_data_write", table_data_buff); + ZXIC_COMM_MEMSET(entry_mask_cmd_buff, 0, DTB_TABLE_CMD_SIZE_BIT / 8); + ZXIC_COMM_MEMSET(entry_mask_buff, 0, 640/8); + addr_offset_bk = addr_offset_bk + DTB_ETCAM_LEN_SIZE * DTB_LEN_POS_SETP; /*在缓存中相对于0的offset*/ + + //处理级联数据 + if(as_enable) + { + p_as_eram_data = (ZXIC_UINT32 *)(p_acl_entry->p_as_rslt); + ZXIC_COMM_CHECK_DEV_POINT_MEMORY_FREE_NO_ASSERT(DEV_ID(dev), p_as_eram_data, table_data_buff); + eram_index = p_acl_entry->handle; + rc = dpp_dtb_se_smmu0_ind_write(dev, + as_eram_baddr, + eram_index, + eram_wrt_mode, + p_as_eram_data, + &dtb_as_data_entry); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_se_smmu0_ind_write", table_data_buff); + + switch (eram_wrt_mode) + { + case ERAM128_OPR_128b: + { + as_dtb_len = 2; + as_addr_offset = DTB_LEN_POS_SETP * 2; + break; + } + + case ERAM128_OPR_64b: + { + as_dtb_len = 1; + as_addr_offset = DTB_LEN_POS_SETP; + break; + } + + case ERAM128_OPR_1b: + { + as_dtb_len = 1; + as_addr_offset = DTB_LEN_POS_SETP; + break; + } + } + + /*将表格式和数据写入缓存buff中*/ + rc = dpp_dtb_data_write(table_data_buff, addr_offset_bk, &dtb_as_data_entry); + addr_offset_bk = addr_offset_bk + as_addr_offset; /*在缓存中相对于0的offset*/ + dtb_len += as_dtb_len; + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_data_write", table_data_buff); + ZXIC_COMM_MEMSET(as_eram_cmd_buff, 0, DTB_TABLE_CMD_SIZE_BIT / 8); + ZXIC_COMM_MEMSET(as_eram_data_buff, 0, 4 * sizeof(ZXIC_UINT32)); + } + } + + if(dpp_dtb_prt_get()) + { + dpp_data_buff_print(table_data_buff, dtb_len * 16); + } + + rc = dpp_dtb_write_down_table_data(dev, + queue_id, + dtb_len * 16, + table_data_buff, + element_id + ); + ZXIC_COMM_FREE(table_data_buff); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_write_down_table_data"); + + return DPP_OK; +} + +#endif /*DTB BASE INTERFACE*/ + +#if ZXIC_REAL("DTB_DOWN_INTERFACE") +/** dtb写eRam表--支持大数据量 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no eram表sdt表号 +* @param entry_cnt 下发的条目数 +* @param p_entry_arr 待下发表项内容结构体数组指针 +* @param element_id 返回下表使用的元素id +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_eram_dma_write(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + ZXIC_UINT32 entry_num, + DPP_DTB_ERAM_ENTRY_INFO_T *p_entry_arr, + ZXIC_UINT32 *element_id + ) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 wrt_mode; + ZXIC_UINT32 entry_num_max = 0; + ZXIC_UINT32 entry_cycle = 0; + ZXIC_UINT32 entry_remains = 0; + ZXIC_UINT32 i = 0; + DPP_DTB_ERAM_ENTRY_INFO_T *p_entry = NULL; + + DPP_SDTTBL_ERAM_T sdt_eram_info = {0}; + + ZXIC_COMM_CHECK_POINT_NO_ASSERT(dev); + + rc = dpp_soft_sdt_tbl_get(DEV_ID(dev), sdt_no, &sdt_eram_info); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_soft_sdt_tbl_get"); + + wrt_mode = sdt_eram_info.eram_mode;//3:128 + + switch (wrt_mode) + { + case ERAM128_TBL_128b: + { + entry_num_max = 0x1ff; + break; + } + + case ERAM128_TBL_64b: + { + entry_num_max = 0x3ff; + break; + } + + case ERAM128_TBL_1b: + { + entry_num_max = 0x3ff; + break; + } + } + + ZXIC_COMM_CHECK_INDEX_EQUAL(entry_num_max, 0); + entry_cycle = entry_num / entry_num_max; + entry_remains = entry_num % entry_num_max; + + for(i = 0; i < entry_cycle; ++i) + { + p_entry = p_entry_arr + entry_num_max * i; + rc = dpp_dtb_eram_dma_write_cycle(dev, + queue_id, + sdt_no, + entry_num_max, + p_entry, + element_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_eram_dma_write_cycle"); + + ZXIC_COMM_TRACE_INFO("dpp_dtb_eram_dma_write_cycle: slot [%d] queue [%d] element_id [%d] done.\n",DEV_PCIE_SLOT(dev), queue_id, *element_id); + } + + if(entry_remains) + { + p_entry = p_entry_arr + entry_num_max * entry_cycle; + rc = dpp_dtb_eram_dma_write_cycle(dev, + queue_id, + sdt_no, + entry_remains, + p_entry, + element_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_eram_dma_write_cycle"); + + ZXIC_COMM_TRACE_INFO("dpp_dtb_eram_dma_write_cycle: slot [%d] queue [%d] element_id [%d] done.\n",DEV_PCIE_SLOT(dev), queue_id, *element_id); + + } + + return DPP_OK; +} + +DPP_STATUS dpp_dtb_hash_dma_insert(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + ZXIC_UINT32 entry_num, + DPP_DTB_HASH_ENTRY_INFO_T *p_arr_hash_entry, + ZXIC_UINT32 *element_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 entry_num_max = 0; + ZXIC_UINT32 entry_cycle = 0; + ZXIC_UINT32 entry_remains = 0; + ZXIC_UINT32 i = 0; + DPP_DTB_HASH_ENTRY_INFO_T *p_entry = NULL; + + ZXIC_COMM_CHECK_POINT_NO_ASSERT(dev); + + entry_num_max = 0xcc;//按512bit数据进行计算 + + entry_cycle = entry_num / entry_num_max; + entry_remains = entry_num % entry_num_max; + + for(i = 0; i < entry_cycle; ++i) + { + p_entry = p_arr_hash_entry + entry_num_max * i; + rc = dpp_dtb_hash_dma_insert_cycle(dev, + queue_id, + sdt_no, + entry_num_max, + p_entry, + element_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_hash_dma_insert_cycle"); + ZXIC_COMM_TRACE_INFO("dpp_dtb_hash_dma_insert_cycle: slot [%d] queue [%d] element_id [%d] done.\n",DEV_PCIE_SLOT(dev), queue_id, *element_id); + } + + if(entry_remains) + { + p_entry = p_arr_hash_entry + entry_num_max * entry_cycle; + rc = dpp_dtb_hash_dma_insert_cycle(dev, + queue_id, + sdt_no, + entry_remains, + p_entry, + element_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_hash_dma_insert_cycle"); + ZXIC_COMM_TRACE_INFO("dpp_dtb_hash_dma_insert_cycle: slot [%d] queue [%d] element_id [%d] done.\n",DEV_PCIE_SLOT(dev), queue_id, *element_id); + } + + return DPP_OK; +} + +/** dtb删除HASH表 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no hash表sdt表号 +* @param entry_cnt 删除的条目数 +* @param p_entry_arr 待下发表项内容结构体数组指针 +* @param element_id 返回下表使用的元素id +* @return +* @remark 无 +* @see +* @author @date 2023/03/14 +************************************************************/ +DPP_STATUS dpp_dtb_hash_dma_delete(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + ZXIC_UINT32 entry_num, + DPP_DTB_HASH_ENTRY_INFO_T *p_arr_hash_entry, + ZXIC_UINT32 *element_id) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT8 key_valid = 1; + ZXIC_UINT32 item_cnt = 0; + ZXIC_UINT32 ddr_wr_mode = 0; + ZXIC_UINT32 dtb_len = 0; + + SE_ITEM_CFG *p_item = NULL; + ZXIC_RB_TN *p_rb_tn_rtn = NULL; + DPP_HASH_CFG *p_hash_cfg = NULL; + DPP_HASH_RBKEY_INFO *p_rbkey_rtn = NULL; + DPP_HASH_RBKEY_INFO temp_rbkey = {{0}}; + ZXIC_UINT8 *p_data_buff = NULL; + + HASH_ENTRY_CFG hash_entry_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DTB_QUEUE_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_LOWER(DEV_ID(dev), entry_num, 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_arr_hash_entry); + + //从sdt_no中获取hash配置 + rc = dpp_hash_get_hash_info_from_sdt(DEV_ID(dev), sdt_no, &hash_entry_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_hash_get_hash_info_from_sdt"); + + p_hash_cfg = hash_entry_cfg.p_hash_cfg; + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_hash_cfg); + + /*条目数上限检查*/ + ddr_wr_mode = DPP_GET_DDR_WR_MODE(hash_entry_cfg.key_type); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), entry_num, 1, DTB_DATA_SIZE_BIT / ( (ddr_wr_mode + 2) * DTB_TABLE_CMD_SIZE_BIT)); + + p_data_buff = (ZXIC_UINT8 *)ZXIC_COMM_MALLOC(DPP_DTB_TABLE_DATA_BUFF_SIZE); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data_buff); + ZXIC_COMM_MEMSET(p_data_buff,0x0,DPP_DTB_TABLE_DATA_BUFF_SIZE); + + /*对每一个条目进行处理*/ + for(item_cnt = 0; item_cnt < entry_num; ++item_cnt) + { + ZXIC_COMM_MEMSET(&temp_rbkey,0x0,sizeof(DPP_HASH_RBKEY_INFO)); + temp_rbkey.key[0] = (ZXIC_UINT8)(((key_valid & 0x1) << 7) | ((hash_entry_cfg.key_type & 0x3) << 5) | (hash_entry_cfg.table_id & 0x1f)); + ZXIC_COMM_MEMCPY(&temp_rbkey.key[1], p_arr_hash_entry[item_cnt].p_actu_key, hash_entry_cfg.actu_key_size); + rc = zxic_comm_rb_delete(&p_hash_cfg->hash_rb, &temp_rbkey, &p_rb_tn_rtn); + if (ZXIC_RBT_RC_SRHFAIL == rc) + { + p_hash_cfg->hash_stat.delete_fail++; + ZXIC_COMM_TRACE_DEV_DEBUG(DEV_ID(dev), "Error!there is not item in hash!\n"); + continue; + } + + ZXIC_COMM_CHECK_POINT_MEMORY_FREE_NO_ASSERT(p_rb_tn_rtn,p_data_buff); + + p_rbkey_rtn = (DPP_HASH_RBKEY_INFO *)(p_rb_tn_rtn->p_key); + ZXIC_COMM_MEMSET(p_rbkey_rtn->rst,0x0,sizeof(p_rbkey_rtn->rst)); + hash_entry_cfg.p_rbkey_new = p_rbkey_rtn; + hash_entry_cfg.p_rb_tn_new = p_rb_tn_rtn; + + p_item = p_rbkey_rtn->p_item_info; + rc = zxic_comm_double_link_del(&(p_rbkey_rtn->entry_dn), &(p_item->item_list)); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "zxic_comm_double_link_del",p_data_buff); + p_item->wrt_mask &= ~(DPP_GET_HASH_ENTRY_MASK(p_rbkey_rtn->entry_size, p_rbkey_rtn->entry_pos)) & 0xF; + + /*将位置信息和数据信息写入buff中*/ + rc = dpp_dtb_delete_hash_buf_write(DEV_ID(dev),&hash_entry_cfg,p_data_buff,item_cnt,&dtb_len); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_hash_form_write",p_data_buff); + + if (0 == p_item->item_list.used) + { + if ((ITEM_DDR_256 == p_item->item_type) || (ITEM_DDR_512 == p_item->item_type)) + { + /* modify coverity by yinxh 2021.03.10*,以256bit为单位。暂不考虑512bit的情况*/ + ZXIC_COMM_CHECK_INDEX_UPPER_MEMORY_FREE( + p_item->item_index, + p_hash_cfg->p_bulk_ddr_info[hash_entry_cfg.bulk_id]->item_num, + p_data_buff); + p_hash_cfg->p_bulk_ddr_info[hash_entry_cfg.bulk_id]->p_item_array[p_item->item_index] = NULL; + ZXIC_COMM_FREE(p_item); + } + else + { + p_item->valid = 0; + } + } + + ZXIC_COMM_FREE(p_rbkey_rtn); + ZXIC_COMM_FREE(p_rb_tn_rtn); + + p_hash_cfg->hash_stat.delete_ok++; + } + + if(dtb_len) + { + rc = dpp_dtb_write_down_table_data(dev, + queue_id, + dtb_len * 16, + p_data_buff, + element_id); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_write_down_table_data",p_data_buff); + } + ZXIC_COMM_FREE(p_data_buff); + + return DPP_OK; +} + +/** dtb删除所有的HASH表(硬件查找,硬件删除) +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no hash表sdt表号 +* @param entry_cnt 删除的条目数 +* @param p_entry_arr 待下发表项内容结构体数组指针 +* @param element_id 返回下表使用的元素id +* @return +* @remark 无 +* @see +* @author cq @date 2023/12/02 +************************************************************/ +DPP_STATUS dpp_dtb_hash_dma_delete_hardware(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + ZXIC_UINT32 entry_num, + DPP_DTB_HASH_ENTRY_INFO_T *p_arr_hash_entry, + ZXIC_UINT32 *element_id) +{ + DPP_STATUS rc = DPP_OK; + //ZXIC_UINT32 ddr_wr_mode = 0; + ZXIC_UINT32 item_cnt = 0; + ZXIC_UINT32 dtb_len = 0; + ZXIC_UINT8 srh_succ = 0; + ZXIC_UINT8 key[HASH_KEY_MAX] = {0}; + ZXIC_UINT8 rst[HASH_RST_MAX] = {0}; + ZXIC_UINT8 entry_cmd[DTB_TABLE_CMD_SIZE_BIT / 8] = {0}; + ZXIC_UINT8 entry_data[DPP_ETCAM_WIDTH_MAX/8] = {0}; /*兼容所有表项,按照最大位宽分配,acl最大为640bit(80B)*/ + ZXIC_UINT8 *p_data_buff = NULL; + ZXIC_UINT32 dev_id = 0; + + DPP_HASH_ENTRY entry = {0}; + DPP_HASH_CFG *p_hash_cfg = NULL; + DPP_DTB_ENTRY_T dtb_one_entry = {0}; + HASH_ENTRY_CFG hash_entry_cfg = {0}; + + ZXIC_COMM_CHECK_POINT_NO_ASSERT(dev); + dev_id = DEV_ID(dev); + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, queue_id, 0, DTB_QUEUE_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_arr_hash_entry); + + dtb_one_entry.cmd = entry_cmd; + dtb_one_entry.data = entry_data; + entry.p_key = key; + entry.p_rst = rst; + + //从sdt_no中获取hash配置 + rc = dpp_hash_get_hash_info_from_sdt(dev_id, sdt_no, &hash_entry_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_hash_get_hash_info_from_sdt"); + + p_hash_cfg = hash_entry_cfg.p_hash_cfg; + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_hash_cfg); + + /*条目数上限检查*/ + //ddr_wr_mode = DPP_GET_DDR_WR_MODE(hash_entry_cfg.key_type); + //ZXIC_COMM_CHECK_DEV_INDEX(dev_id, entry_num, 1, DTB_DATA_SIZE_BIT / ( (ddr_wr_mode + 2) * DTB_TABLE_CMD_SIZE_BIT)); + + p_data_buff = (ZXIC_UINT8 *)ZXIC_COMM_MALLOC(DPP_DTB_TABLE_DATA_BUFF_SIZE); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_data_buff); + ZXIC_COMM_MEMSET(p_data_buff,0x0,DPP_DTB_TABLE_DATA_BUFF_SIZE); + + /*对每一个条目进行处理*/ + for(item_cnt = 0; item_cnt < entry_num; ++item_cnt) + { + srh_succ = 0; + ZXIC_COMM_MEMSET(key,0x0,sizeof(key)); + ZXIC_COMM_MEMSET(rst,0x0,sizeof(rst)); + ZXIC_COMM_MEMSET(entry_cmd,0x0,sizeof(entry_cmd)); + ZXIC_COMM_MEMSET(entry_data,0x0,sizeof(entry_data)); + ZXIC_COMM_MEMCPY(entry.p_key, p_arr_hash_entry[item_cnt].p_actu_key, hash_entry_cfg.key_by_size); + + rc = dpp_dtb_hash_zcam_delete_hardware(dev, + queue_id, + &hash_entry_cfg, + &entry, + &dtb_one_entry, + &srh_succ); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_hash_zcam_delete_hardware",p_data_buff); + + if(srh_succ) + { + rc = dpp_dtb_data_write(p_data_buff, 0, &dtb_one_entry); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_data_write",p_data_buff); + dtb_len = dtb_one_entry.data_size/DTB_LEN_POS_SETP + 1; + + rc = dpp_dtb_write_down_table_data(dev, + queue_id, + dtb_len * DTB_LEN_POS_SETP, + p_data_buff, + element_id); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_write_down_table_data",p_data_buff); + } + } + + ZXIC_COMM_FREE(p_data_buff); + + return DPP_OK; +} + +/***********************************************************/ +/** 将hash表DDR存储位宽(按照256bit/512bit划分)转换为hash在DDR中的实际位置(按照128/256/512bit划分) +* @param index hash表DDR存储位宽索引(按照256bit/512bit划分) +* @param width_mode DDR位宽(256bit/512bit) +* @param key_type hash表项位宽DPP_HASH_KEY_TYPE +* @param byte_offset hash表项在一个DDR存储位宽(256bit/512bit)里的偏移,单位为字节 +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/02 +************************************************************/ +ZXIC_UINT32 dpp_ddr_index_calc(ZXIC_UINT32 index, + ZXIC_UINT32 width_mode, + ZXIC_UINT32 key_type, + ZXIC_UINT32 byte_offset) +{ + ZXIC_UINT32 ddr_index = 0; /*按照hash位宽128/256/512bit进行划分*/ + ZXIC_UINT32 entry_size = 0; + + entry_size = DPP_GET_HASH_ENTRY_SIZE(key_type); + if(0==entry_size) + { + return ddr_index; + } + + if(DDR_WIDTH_256b==width_mode) + { + if (HASH_KEY_128b == key_type) + { + ddr_index = (index<<1) + ((byte_offset/entry_size)&0x1); + } + else if (HASH_KEY_256b == key_type) + { + ddr_index = index; + } + } + else if(DDR_WIDTH_512b==width_mode) + { + if (HASH_KEY_128b == key_type) + { + ddr_index = (index<<2) + ((byte_offset/entry_size)&0x3); + } + else if (HASH_KEY_256b == key_type) + { + ddr_index = (index<<1) + ((byte_offset/entry_size)&0x1); + } + else if (HASH_KEY_512b == key_type) + { + ddr_index = index; + } + } + + return ddr_index; +} + +/***********************************************************/ +/** 查找存储在ZCAM空间的hash表项并删除(硬件处理) +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列id +* @param p_hash_entry_cfg hash表项配置信息 +* @param p_hash_entry 查找键值信息 +* @param p_entry dtb描述符 +* @param p_srh_succ 出参,查找是否成功 +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/02 +************************************************************/ +ZXIC_UINT32 dpp_dtb_hash_zcam_delete_hardware(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + HASH_ENTRY_CFG *p_hash_entry_cfg, + DPP_HASH_ENTRY *p_hash_entry, + DPP_DTB_ENTRY_T *p_entry, + ZXIC_UINT8 *p_srh_succ) +{ + DPP_STATUS rc = DPP_OK; + DPP_HASH_RBKEY_INFO srh_rbkey = {0}; + DPP_HASH_CFG *p_hash_cfg = NULL; + SE_ZCELL_CFG *p_zcell = NULL; + SE_ZBLK_CFG *p_zblk = NULL; + + ZXIC_UINT32 zblk_idx = 0; + ZXIC_UINT32 pre_zblk_idx = 0xFFFFFFFF;/* -1; */ + ZXIC_UINT16 crc16_value = 0; + ZXIC_UINT32 zcell_id = 0; + ZXIC_UINT32 item_idx = 0; + ZXIC_UINT32 element_id = 0; + ZXIC_UINT8 byte_offset = 0; + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 addr = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT8 srh_succ = 0; + ZXIC_UINT8 temp_key[HASH_KEY_MAX] = {0}; + ZXIC_UINT8 rd_buff[SE_ITEM_WIDTH_MAX] = {0}; + + D_NODE *p_zblk_dn = NULL; + D_NODE *p_zcell_dn = NULL; + DPP_SE_CFG *p_se_cfg = NULL; + + ZXIC_COMM_CHECK_POINT_NO_ASSERT(dev); + dev_id = DEV_ID(dev); + ZXIC_COMM_CHECK_INDEX_UPPER(dev_id,DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX(queue_id, 0, DTB_QUEUE_MAX - 1); + ZXIC_COMM_CHECK_POINT(p_hash_entry_cfg); + ZXIC_COMM_CHECK_POINT(p_srh_succ); + ZXIC_COMM_CHECK_POINT(p_hash_entry); + ZXIC_COMM_CHECK_POINT(p_hash_entry->p_key); + ZXIC_COMM_CHECK_POINT(p_hash_entry->p_rst); + + ZXIC_COMM_MEMSET(rd_buff,0x0,sizeof(rd_buff)); + ZXIC_COMM_MEMSET(&srh_rbkey,0x0,sizeof(DPP_HASH_RBKEY_INFO)); + ZXIC_COMM_CHECK_INDEX_UPPER(p_hash_entry_cfg->key_by_size, HASH_KEY_MAX); + ZXIC_COMM_MEMCPY(srh_rbkey.key,p_hash_entry->p_key,p_hash_entry_cfg->key_by_size); + + p_hash_cfg = p_hash_entry_cfg->p_hash_cfg; + ZXIC_COMM_CHECK_POINT(p_hash_cfg); + + /* 取出se配置 */ + rc = dpp_se_cfg_get(dev_id, &p_se_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_se_cfg_get"); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_se_cfg); + + ZXIC_COMM_CHECK_INDEX_UPPER(p_hash_entry_cfg->key_by_size, HASH_KEY_MAX); + rc = dpp_hash_set_crc_key(dev,p_hash_entry_cfg,p_hash_entry,temp_key); + ZXIC_COMM_CHECK_DEV_RC(dev_id,rc,"hash_set_crc_key"); + + /*查找所有的zcell*/ + p_zcell_dn = p_hash_cfg->hash_shareram.zcell_free_list.p_next; + while (p_zcell_dn) + { + p_zcell = (SE_ZCELL_CFG *)p_zcell_dn->data; + zblk_idx = GET_ZBLK_IDX(p_zcell->zcell_idx); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, zblk_idx, 0, SE_ZBLK_NUM - 1); + p_zblk = &(p_se_cfg->zblk_info[zblk_idx]); + + if (zblk_idx != pre_zblk_idx) + { + pre_zblk_idx = zblk_idx; + crc16_value = p_hash_cfg->p_hash16_fun(temp_key, p_hash_entry_cfg->key_by_size, p_zblk->hash_arg); + } + + zcell_id = GET_ZCELL_IDX(p_zcell->zcell_idx); + item_idx = GET_ZCELL_CRC_VAL(zcell_id, crc16_value); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, item_idx, 0, SE_RAM_DEPTH - 1); + addr = ZBLK_ITEM_ADDR_CALC(p_zcell->zcell_idx, item_idx); + rc = dpp_dtb_se_zcam_dma_dump(dev, + queue_id, + addr, + DTB_DUMP_ZCAM_512b, + 1, + (ZXIC_UINT32 *)rd_buff, + &element_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_se_zcam_dma_dump"); + zxic_comm_swap(rd_buff,sizeof(rd_buff)); + + rc = dpp_dtb_hash_data_parse(ITEM_RAM,p_hash_entry_cfg->key_by_size,p_hash_entry,rd_buff,&byte_offset); + if(DPP_OK == rc) + { + ZXIC_COMM_TRACE_DEBUG("Hash search hardware succ in zcell. \n"); + srh_succ = 1; + p_hash_cfg->hash_stat.search_ok++; + break; + } + + p_zcell_dn = p_zcell_dn->next; + } + + /*zcell查找失败,则查找所有的zreg*/ + if(0==srh_succ) + { + p_zblk_dn = p_hash_cfg->hash_shareram.zblk_list.p_next; + while (p_zblk_dn) + { + p_zblk = (SE_ZBLK_CFG *)p_zblk_dn->data; + zblk_idx = p_zblk->zblk_idx; + + for (i = 0; i < SE_ZREG_NUM; i++) + { + item_idx = i; + addr = ZBLK_HASH_LIST_REG_ADDR_CALC(zblk_idx, item_idx); + rc = dpp_dtb_se_zcam_dma_dump(dev, + queue_id, + addr, + DTB_DUMP_ZCAM_512b, + 1, + (ZXIC_UINT32 *)rd_buff, + &element_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_se_zcam_dma_dump"); + zxic_comm_swap(rd_buff,sizeof(rd_buff)); + + rc = dpp_dtb_hash_data_parse(ITEM_RAM,p_hash_entry_cfg->key_by_size,p_hash_entry,rd_buff,&byte_offset); + if(DPP_OK == rc) + { + ZXIC_COMM_TRACE_DEBUG("Hash search hardware succ in zreg. \n"); + srh_succ = 1; + p_hash_cfg->hash_stat.search_ok++; + break; + } + } + p_zblk_dn = p_zblk_dn->next; + } + } + + /*查找成功,则将对应表项删除*/ + if(srh_succ) + { + ZXIC_COMM_MEMSET(rd_buff+byte_offset,0x0,DPP_GET_HASH_ENTRY_SIZE(p_hash_entry_cfg->key_type)); + zxic_comm_swap(rd_buff,sizeof(rd_buff)); + rc = dpp_dtb_se_alg_zcam_data_write(dev_id, + addr, + rd_buff, + p_entry); + ZXIC_COMM_CHECK_DEV_RC(dev_id,rc,"dpp_dtb_se_alg_zcam_data_write"); + p_hash_cfg->hash_stat.delete_ok++; + } + + *p_srh_succ = srh_succ; + + return DPP_OK; +} + +/** dtb写ACL表 (SPECIFY模式,条目中指定handle,支持级联64bit/128bit) +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no ACL表sdt表号 +* @param entry_num 下发的条目数 +* @param p_acl_entry_arr 待下发表项内容结构体数组指针 +* @param element_id 返回下表使用的元素id +* @return +* @remark 无 是否是有一个写不成功就返回,还是继续进行下一个条目并记录错误的条目 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_acl_dma_insert(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + ZXIC_UINT32 entry_num, + DPP_DTB_ACL_ENTRY_INFO_T *p_acl_entry_arr, + ZXIC_UINT32 *element_id + ) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 as_enable; + ZXIC_UINT32 etcam_as_mode; + ZXIC_UINT32 entry_num_max = 0; + ZXIC_UINT32 entry_cycle = 0; + ZXIC_UINT32 entry_remains = 0; + ZXIC_UINT32 i = 0; + DPP_DTB_ACL_ENTRY_INFO_T *p_entry = NULL; + + DPP_SDTTBL_ETCAM_T sdt_etcam_info = {0}; /*SDT内容*/ + + ZXIC_COMM_CHECK_POINT(dev); + rc = dpp_soft_sdt_tbl_get(DEV_ID(dev), sdt_no, &sdt_etcam_info); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_soft_sdt_tbl_get"); + + as_enable = sdt_etcam_info.as_en; + etcam_as_mode = sdt_etcam_info.as_rsp_mode; + + if(!as_enable) + { + entry_num_max = 0x55; + }else + { + if(etcam_as_mode == ERAM128_TBL_128b) + { + entry_num_max = 0x49; + }else + { + entry_num_max = 0x4e; + } + } + + entry_cycle = entry_num / entry_num_max; + entry_remains = entry_num % entry_num_max; + + for(i = 0; i < entry_cycle; ++i) + { + p_entry = p_acl_entry_arr + entry_num_max * i; + rc = dpp_dtb_acl_dma_insert_cycle(dev, + queue_id, + sdt_no, + entry_num_max, + p_entry, + element_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_acl_dma_insert_cycle"); + + ZXIC_COMM_TRACE_INFO("dpp_dtb_acl_dma_insert_cycle[%d]: element_id = %d\n", i, *element_id); + } + + if(entry_remains) + { + p_entry = p_acl_entry_arr + entry_num_max * entry_cycle; + rc = dpp_dtb_acl_dma_insert_cycle(dev, + queue_id, + sdt_no, + entry_remains, + p_entry, + element_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_acl_dma_insert_cycle"); + + ZXIC_COMM_TRACE_INFO("dpp_dtb_acl_dma_insert_cycle: element_id = %d\n", *element_id); + } + + return DPP_OK; +} + +#endif + +#if ZXIC_REAL("DTB DUMP BASE") + +/** smmu0 组装dump描述符函数 +* @param dev_id 设备号 +* @param base_addr smmu0空间基地址,以128bit为单位 +* @param depth dump的深度以128bit为单位 +* @param addr_high32 dump缓存地址高32bit +* @param addr_low32 dump缓存地址低32bit +* @param p_dump_info dump描述符指针(已分配好空间128bit) +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_smmu0_dump_info_write(DPP_DEV_T *dev, + ZXIC_UINT32 base_addr, + ZXIC_UINT32 depth, + ZXIC_UINT32 addr_high32, + ZXIC_UINT32 addr_low32, + ZXIC_UINT32 *p_dump_info) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 i = 0; + + DPP_DTB_ERAM_DUMP_FORM_T dtb_eram_dump_form_info = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(p_dump_info); + + //组装dump描述符 + dtb_eram_dump_form_info.valid = DTB_TABLE_VALID; + dtb_eram_dump_form_info.up_type = DTB_DUMP_MODE_ERAM; + dtb_eram_dump_form_info.base_addr = base_addr; + dtb_eram_dump_form_info.tb_depth = depth; + dtb_eram_dump_form_info.tb_dst_addr_h = addr_high32; + dtb_eram_dump_form_info.tb_dst_addr_l = addr_low32; + + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("dpp_dtb_smmu0_dump_info_write: \n"); + ZXIC_COMM_DBGCNT32_PRINT("valid", dtb_eram_dump_form_info.valid); + ZXIC_COMM_DBGCNT32_PRINT("up_type", dtb_eram_dump_form_info.up_type); + ZXIC_COMM_DBGCNT32_PRINT("base_addr", dtb_eram_dump_form_info.base_addr); + ZXIC_COMM_DBGCNT32_PRINT("tb_depth", dtb_eram_dump_form_info.tb_depth); + ZXIC_COMM_DBGCNT32_PRINT("tb_dst_addr_h", dtb_eram_dump_form_info.tb_dst_addr_h); + ZXIC_COMM_DBGCNT32_PRINT("tb_dst_addr_l", dtb_eram_dump_form_info.tb_dst_addr_l); + } + + /*组装dump描述符*/ + rc = dpp_dtb_write_dump_cmd(DEV_ID(dev), DTB_DUMP_ERAM, &dtb_eram_dump_form_info, p_dump_info); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_write_dump_cmd"); + + //打印出cmd buff中内容128bit + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("dump type: %d\n", DTB_DUMP_MODE_ERAM); + ZXIC_COMM_PRINT("cmd: "); + for(i = 0; i < 4; i++) + { + ZXIC_COMM_PRINT("0x%08x ", ZXIC_COMM_CONVERT32(*((ZXIC_UINT32 *)(p_dump_info + i))));//转换成大端显示 + } + ZXIC_COMM_PRINT("\n"); + } + return rc; +} + +/** smmu1 组装dump描述符函数 +* @param dev_id 设备号 +* @param base_addr dump基地址,以512it为单位 +* @param depth dump的深度以512bit为单位 +* @param addr_high32 dump缓存地址高32bit +* @param addr_low32 dump缓存地址低32bit +* @param p_dump_info dump描述符指针(已分配好空间128bit) +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_smmu1_dump_info_write(DPP_DEV_T *dev, + ZXIC_UINT32 base_addr, + ZXIC_UINT32 depth, + ZXIC_UINT32 addr_high32, + ZXIC_UINT32 addr_low32, + ZXIC_UINT32 *p_dump_info + ) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 i = 0; + + DPP_DTB_DDR_DUMP_FORM_T dtb_ddr_dump_form_info = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(p_dump_info); + + //组装dump描述符 + dtb_ddr_dump_form_info.valid = DTB_TABLE_VALID; + dtb_ddr_dump_form_info.up_type = DTB_DUMP_MODE_DDR; + dtb_ddr_dump_form_info.base_addr = base_addr; + dtb_ddr_dump_form_info.tb_depth = depth; + dtb_ddr_dump_form_info.tb_dst_addr_h = addr_high32; + dtb_ddr_dump_form_info.tb_dst_addr_l = addr_low32; + + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("dpp_dtb_smmu1_dump_info_write: \n"); + ZXIC_COMM_DBGCNT32_PRINT("valid", dtb_ddr_dump_form_info.valid); + ZXIC_COMM_DBGCNT32_PRINT("up_type", dtb_ddr_dump_form_info.up_type); + ZXIC_COMM_DBGCNT32_PRINT("base_addr", dtb_ddr_dump_form_info.base_addr); + ZXIC_COMM_DBGCNT32_PRINT("tb_depth", dtb_ddr_dump_form_info.tb_depth); + ZXIC_COMM_DBGCNT32_PRINT("tb_dst_addr_h", dtb_ddr_dump_form_info.tb_dst_addr_h); + ZXIC_COMM_DBGCNT32_PRINT("tb_dst_addr_l", dtb_ddr_dump_form_info.tb_dst_addr_l); + } + + /*组装dump描述符*/ + rc = dpp_dtb_write_dump_cmd(DEV_ID(dev), DTB_DUMP_DDR, &dtb_ddr_dump_form_info, p_dump_info); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_write_dump_cmd"); + + //打印出cmd buff中内容128bit + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("dump type: %d\n", DTB_DUMP_MODE_ERAM); + ZXIC_COMM_PRINT("cmd: "); + for(i = 0; i < 4; i++) + { + ZXIC_COMM_PRINT("0x%08x ", ZXIC_COMM_CONVERT32(*((ZXIC_UINT32 *)(p_dump_info + i))));//转换成大端显示 + } + ZXIC_COMM_PRINT("\n"); + } + + return rc; +} + +/** zcam 组装dump描述符函数 +* @param dev_id 设备号 +* @param addr zcam内部ram地址,包括掩码(512bit为单位) +* @param tb_width dump数据的宽度 00:128bit 01:256bit 10:512bit +* @param depth dump的深度以512bit为单位 +* @param addr_high32 dump缓存地址高32bit +* @param addr_low32 dump缓存地址低32bit +* @param p_dump_info dump描述符指针(已分配好空间128bit) +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_zcam_dump_info_write(DPP_DEV_T *dev, + ZXIC_UINT32 addr, + ZXIC_UINT32 tb_width, + ZXIC_UINT32 depth, + ZXIC_UINT32 addr_high32, + ZXIC_UINT32 addr_low32, + ZXIC_UINT32 *p_dump_info + ) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 i = 0; + + DPP_DTB_ZCAM_DUMP_FORM_T dtb_zcam_dump_form_info = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(p_dump_info); + + //组装dump描述符 + dtb_zcam_dump_form_info.valid = DTB_TABLE_VALID; + dtb_zcam_dump_form_info.up_type = DTB_DUMP_MODE_ZCAM; + dtb_zcam_dump_form_info.tb_width = tb_width; + dtb_zcam_dump_form_info.sram_addr = addr & 0x1FF;//512bit为单位 + dtb_zcam_dump_form_info.ram_reg_flag = (addr >> 16) & 0x1; + dtb_zcam_dump_form_info.z_reg_cell_id = (addr >> 9) & 0x3; + dtb_zcam_dump_form_info.zblock_id = (addr >> 11) & 0x7; + dtb_zcam_dump_form_info.zgroup_id = (addr >> 14) & 0x3; + dtb_zcam_dump_form_info.tb_depth = depth; + dtb_zcam_dump_form_info.tb_dst_addr_h = addr_high32; + dtb_zcam_dump_form_info.tb_dst_addr_l = addr_low32; + + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("dpp_dtb_zcam_dump_info_write: \n"); + ZXIC_COMM_DBGCNT32_PRINT("addr", addr); + ZXIC_COMM_DBGCNT32_PRINT("valid", dtb_zcam_dump_form_info.valid); + ZXIC_COMM_DBGCNT32_PRINT("up_type", dtb_zcam_dump_form_info.up_type); + ZXIC_COMM_DBGCNT32_PRINT("zgroup_id", dtb_zcam_dump_form_info.zgroup_id); + ZXIC_COMM_DBGCNT32_PRINT("zblock_id", dtb_zcam_dump_form_info.zblock_id); + ZXIC_COMM_DBGCNT32_PRINT("reg_sram_flag", dtb_zcam_dump_form_info.ram_reg_flag); + ZXIC_COMM_DBGCNT32_PRINT("zcell_id", dtb_zcam_dump_form_info.z_reg_cell_id); + ZXIC_COMM_DBGCNT32_PRINT("tb_width", dtb_zcam_dump_form_info.tb_width); + ZXIC_COMM_DBGCNT32_PRINT("sram_addr", dtb_zcam_dump_form_info.sram_addr); + ZXIC_COMM_DBGCNT32_PRINT("tb_depth", dtb_zcam_dump_form_info.tb_depth); + ZXIC_COMM_DBGCNT32_PRINT("tb_dst_addr_h", dtb_zcam_dump_form_info.tb_dst_addr_h); + ZXIC_COMM_DBGCNT32_PRINT("tb_dst_addr_l", dtb_zcam_dump_form_info.tb_dst_addr_l); + } + + //将描述符写入dump缓存中 + rc = dpp_dtb_write_dump_cmd(DEV_ID(dev), DTB_DUMP_ZCAM, &dtb_zcam_dump_form_info, p_dump_info); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_write_dump_cmd"); + + //打印出cmd buff中内容128bit + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("dump type: %d\n", DTB_DUMP_MODE_ERAM); + ZXIC_COMM_PRINT("cmd: "); + for(i = 0; i < 4; i++) + { + ZXIC_COMM_PRINT("0x%08x ", ZXIC_COMM_CONVERT32(*((ZXIC_UINT32 *)(p_dump_info + i))));//转换成大端显示 + } + ZXIC_COMM_PRINT("\n"); + } + + return rc; +} + +/** etcam 组装dump描述符函数 +* @param dev_id 设备号 +* @param p_etcam_dump_info etcam dump内容信息 +* @param addr_high32 dump缓存地址高32bit +* @param addr_low32 dump缓存地址低32bit +* @param p_dump_info dump描述符指针(已分配好空间128bit) +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_etcam_dump_info_write(DPP_DEV_T *dev, + ETCAM_DUMP_INFO_T *p_etcam_dump_info, + ZXIC_UINT32 addr_high32, + ZXIC_UINT32 addr_low32, + ZXIC_UINT32 *p_dump_info + ) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 i = 0; + + DPP_DTB_ETCAM_DUMP_FORM_T dtb_etcam_dump_form_info = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(p_dump_info); + ZXIC_COMM_CHECK_POINT(p_etcam_dump_info); + + //组装dump描述符 + dtb_etcam_dump_form_info.valid = DTB_TABLE_VALID; + dtb_etcam_dump_form_info.up_type = DTB_DUMP_MODE_ETCAM; + dtb_etcam_dump_form_info.block_sel = p_etcam_dump_info->block_sel; + dtb_etcam_dump_form_info.addr = p_etcam_dump_info->addr; + dtb_etcam_dump_form_info.rd_mode = p_etcam_dump_info->rd_mode; + dtb_etcam_dump_form_info.data_or_mask = p_etcam_dump_info->data_or_mask; + dtb_etcam_dump_form_info.tb_depth = p_etcam_dump_info->tb_depth; + dtb_etcam_dump_form_info.tb_width = p_etcam_dump_info->tb_width;//00:80bit 01:160bit 10:320bit 11:640bit + dtb_etcam_dump_form_info.tb_dst_addr_h = addr_high32; + dtb_etcam_dump_form_info.tb_dst_addr_l = addr_low32; + + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("dpp_dtb_etcam_dump_info_write: \n"); + ZXIC_COMM_DBGCNT32_PRINT("valid", dtb_etcam_dump_form_info.valid); + ZXIC_COMM_DBGCNT32_PRINT("up_type", dtb_etcam_dump_form_info.up_type); + ZXIC_COMM_DBGCNT32_PRINT("block_sel", dtb_etcam_dump_form_info.block_sel); + ZXIC_COMM_DBGCNT32_PRINT("addr", dtb_etcam_dump_form_info.addr); + ZXIC_COMM_DBGCNT32_PRINT("rd_mode", dtb_etcam_dump_form_info.rd_mode); + ZXIC_COMM_DBGCNT32_PRINT("data_or_mask", dtb_etcam_dump_form_info.data_or_mask); + ZXIC_COMM_DBGCNT32_PRINT("tb_depth", dtb_etcam_dump_form_info.tb_depth); + ZXIC_COMM_DBGCNT32_PRINT("tb_width", dtb_etcam_dump_form_info.tb_width); + ZXIC_COMM_DBGCNT32_PRINT("tb_dst_addr_h", dtb_etcam_dump_form_info.tb_dst_addr_h); + ZXIC_COMM_DBGCNT32_PRINT("tb_dst_addr_l", dtb_etcam_dump_form_info.tb_dst_addr_l); + } + + //将描述符写入dump缓存中 + rc = dpp_dtb_write_dump_cmd(DEV_ID(dev), DTB_DUMP_ETCAM, &dtb_etcam_dump_form_info, p_dump_info); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_write_dump_cmd"); + + //打印出cmd buff中内容128bit + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("dump type: %d\n", DTB_DUMP_MODE_ERAM); + ZXIC_COMM_PRINT("cmd: "); + for(i = 0; i < 4; i++) + { + ZXIC_COMM_PRINT("0x%08x ", ZXIC_COMM_CONVERT32(*((ZXIC_UINT32 *)(p_dump_info + i))));//转换成大端显示 + } + ZXIC_COMM_PRINT("\n"); + } + + return rc; +} + +/** eram 生成dump entry,输入dump描述符,输出一个entry +* @param dev_id 设备号 +* @param base_addr smmu0空间基地址,以128bit为单位 +* @param depth dump的深度以128bit为单位 +* @param addr_high32 dump缓存地址高32bit +* @param addr_low32 dump缓存地址低32bit +* @param p_entry entry指针(已分配好cmd空间128bit,用来存放dump描述符) +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_smmu0_dump_entry(DPP_DEV_T *dev, + ZXIC_UINT32 base_addr, + ZXIC_UINT32 depth, + ZXIC_UINT32 addr_high32, + ZXIC_UINT32 addr_low32, + DPP_DTB_ENTRY_T *p_entry) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(p_entry); + + rc = dpp_dtb_smmu0_dump_info_write(dev, + base_addr, + depth, + addr_high32, + addr_low32, + (ZXIC_UINT32 *)p_entry->cmd); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_smmu0_dump_info_write"); + p_entry->data_in_cmd_flag = 1; + + return rc; +} + +/** smmu1生成dump entry,输入dump描述符,输出一个entry +* @param dev_id 设备号 +* @param base_addr dump基地址,以128bit为单位 +* @param depth dump的深度以512bit为单位 +* @param addr_high32 dump缓存地址高32bit +* @param addr_low32 dump缓存地址低32bit +* @param p_entry entry指针(已分配好cmd空间128bit,用来存放dump描述符) +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_smmu1_dump_entry(DPP_DEV_T *dev, + ZXIC_UINT32 base_addr, + ZXIC_UINT32 depth, + ZXIC_UINT32 addr_high32, + ZXIC_UINT32 addr_low32, + DPP_DTB_ENTRY_T *p_entry) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(p_entry); + + rc = dpp_dtb_smmu1_dump_info_write(dev, + base_addr, + depth, + addr_high32, + addr_low32, + (ZXIC_UINT32 *)p_entry->cmd); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_smmu1_dump_info_write"); + p_entry->data_in_cmd_flag = 1; + + return rc; +} + +/** zcam 组装dump描述符函数 +* @param dev_id 设备号 +* @param addr zcam内部ram地址,包括掩码(512bit为单位) +* @param tb_width dump数据的宽度 00:128bit 01:256bit 10:512bit +* @param depth dump的深度以512bit为单位 +* @param addr_high32 dump缓存地址高32bit +* @param addr_low32 dump缓存地址低32bit +* @param p_entry entry指针(已分配好cmd空间128bit,用来存放dump描述符) +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_zcam_dump_entry(DPP_DEV_T *dev, + ZXIC_UINT32 addr, + ZXIC_UINT32 tb_width, + ZXIC_UINT32 depth, + ZXIC_UINT32 addr_high32, + ZXIC_UINT32 addr_low32, + DPP_DTB_ENTRY_T *p_entry) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(p_entry); + + rc = dpp_dtb_zcam_dump_info_write(dev, + addr, + tb_width, + depth, + addr_high32, + addr_low32, + (ZXIC_UINT32 *)p_entry->cmd); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_zcam_dump_info_write"); + p_entry->data_in_cmd_flag = 1; + + return rc; +} + +/** etcam 生成dump entry,输入dump描述符,输出一个entry +* @param dev_id 设备号 +* @param p_etcam_dump_info etcam dump内容信息 +* @param addr_high32 dump缓存地址高32bit +* @param addr_low32 dump缓存地址低32bit +* @param p_entry entry指针(已分配好cmd空间128bit,用来存放dump描述符) +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_etcam_dump_entry(DPP_DEV_T *dev, + ETCAM_DUMP_INFO_T *p_etcam_dump_info, + ZXIC_UINT32 addr_high32, + ZXIC_UINT32 addr_low32, + DPP_DTB_ENTRY_T *p_entry) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(p_entry); + + rc = dpp_dtb_etcam_dump_info_write(dev, + p_etcam_dump_info, + addr_high32, + addr_low32, + (ZXIC_UINT32 *)p_entry->cmd); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_etcam_dump_info_write"); + p_entry->data_in_cmd_flag = 1; + + return rc; +} + + +/** 下发dump描述符,dump出数据 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param queue_element_id 元素编号 +* @param p_dump_info dump描述符 +* @param data_len dump出数据的长度(32bit为单位) +* @param desc_len dump描述符的长度(32bit为单位) +* @param p_dump_data dump出的数据缓存 +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_write_dump_desc_info(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 queue_element_id, + ZXIC_UINT32 *p_dump_info, + ZXIC_UINT32 data_len, + ZXIC_UINT32 desc_len, + ZXIC_UINT32 *p_dump_data ) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 dtb_interrupt_status = 0; + + ZXIC_COMM_CHECK_POINT(dev); + + /*获取中断配置*/ + dtb_interrupt_status = dpp_dtb_interrupt_status_get(); + + /*下发dump描述符*/ + rc = dpp_dtb_tab_up_info_set(dev, + queue_id, + queue_element_id, + dtb_interrupt_status, + data_len, + desc_len, + p_dump_info); + if(DPP_OK != rc) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "the queue %d element id %d dump info set failed!", queue_id, queue_element_id); + dpp_dtb_item_ack_wr(dev, queue_id, DPP_DTB_DIR_UP_TYPE, queue_element_id, 0, DPP_DTB_TAB_ACK_UNUSED_MASK); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_tab_up_info_set"); + } + + /*查询是否dump完成,完成后取出数据 需要在dpp_dtb.c中补充查询一个元素ack是否成功函数*/ + if(!dtb_interrupt_status) + { + + rc = dpp_dtb_tab_up_success_status_check(dev, queue_id, queue_element_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_tab_up_success_status_check"); + + /*取出数据*/ + rc = dpp_dtb_tab_up_data_get(dev, queue_id, queue_element_id, data_len, p_dump_data); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_tab_up_data_get"); + }else + { + rc = dpp_dtb_tab_up_success_status_check(dev, queue_id, queue_element_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_tab_up_success_status_check"); + + /*取出数据*/ + rc = dpp_dtb_tab_up_data_get(dev, queue_id, queue_element_id, data_len, p_dump_data); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_tab_up_data_get"); + /*清中断*/ + dpp_dtb_finish_interrupt_event_state_clr(dev, queue_id); + } + + return DPP_OK; +} + + +/** smmu0 dump 只写一个dump描述符的接口 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param base_addr 要dump的内容的基地址,以128bit为单位 +* @param depth dump的深度以128bit为单位 +* @param p_data dump出数据缓存(128bit * depth) +* @param element_id 返回下表使用的元素id +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_se_smmu0_dma_dump(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 base_addr, + ZXIC_UINT32 depth, + ZXIC_UINT32 *p_data, + ZXIC_UINT32 *element_id + ) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 dump_dst_phy_haddr = 0; + ZXIC_UINT32 dump_dst_phy_laddr = 0; + ZXIC_UINT32 queue_item_index = 0; + ZXIC_UINT32 data_len = 0; + ZXIC_UINT32 desc_len = 0; + + ZXIC_UINT8 form_buff[DTB_TABLE_CMD_SIZE_BIT / 8] = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DTB_QUEUE_MAX - 1); + ZXIC_COMM_CHECK_INDEX_LOWER(depth, 1); + + /*获取队列中可用的元素编号*/ + rc = dpp_dtb_tab_up_free_item_get(dev, queue_id, &queue_item_index); + if(rc != DPP_OK) + { + ZXIC_COMM_TRACE_ERROR("dpp_dtb_tab_up_free_item_get failed!\n"); + return DPP_RC_DTB_QUEUE_ITEM_SW_EMPTY; + } + + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("dump smmu0:queue %d,item_index: %d\n",queue_id, queue_item_index); + } + + *element_id = queue_item_index;//保存获取的item_index + + /*获取地址*/ + rc = dpp_dtb_tab_up_item_addr_get(dev, queue_id, queue_item_index, &dump_dst_phy_haddr, &dump_dst_phy_laddr); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_tab_up_item_addr_get"); + + rc = dpp_dtb_smmu0_dump_info_write(dev, + base_addr, + depth, + dump_dst_phy_haddr, + dump_dst_phy_laddr, + (ZXIC_UINT32 *)form_buff); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_smmu0_dump_info_write"); + + /*组装下表命令格式*/ + + data_len = depth * 128 / 32; + desc_len = DTB_LEN_POS_SETP / 4; + + rc = dpp_dtb_write_dump_desc_info(dev, queue_id, queue_item_index, (ZXIC_UINT32 *)form_buff, data_len, desc_len, p_data); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_write_dump_desc_info"); + + return DPP_OK; +} + +/** dtb dump DDR表项内容 返回内容以512bit为单位 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param base_addr dump基地址,以512bit为单位 +* @param depth dump的深度以512bit为单位 +* @param p_data dump出数据缓存(512bit * depth) +* @param element_id 返回下表使用的元素id +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_se_smmu1_dma_dump(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 base_addr, + ZXIC_UINT32 depth, + ZXIC_UINT32 *p_data, + ZXIC_UINT32 *element_id) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 dump_dst_phy_haddr = 0; + ZXIC_UINT32 dump_dst_phy_laddr = 0; + + ZXIC_UINT32 queue_item_index = 0; + ZXIC_UINT32 data_len = 0; + ZXIC_UINT32 desc_len = 0; + + ZXIC_UINT8 form_buff[DTB_TABLE_CMD_SIZE_BIT / 8] = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DTB_QUEUE_MAX - 1); + ZXIC_COMM_CHECK_INDEX_LOWER(depth, 1); + + /*获取队列元素*/ + rc = dpp_dtb_tab_up_free_item_get(dev, queue_id, &queue_item_index); + if(rc != DPP_OK) + { + ZXIC_COMM_TRACE_ERROR("dpp_dtb_tab_up_free_item_get failed!\n"); + return DPP_RC_DTB_QUEUE_ITEM_SW_EMPTY; + } + + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("dump smmu1:queue %d,item_index: %d\n",queue_id, queue_item_index); + } + + *element_id = queue_item_index;//保存获取的item_index + + /*获取dump dma phy地址*/ + rc = dpp_dtb_tab_up_item_addr_get(dev, queue_id, queue_item_index, &dump_dst_phy_haddr, &dump_dst_phy_laddr); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_tab_up_item_addr_get"); + + rc = dpp_dtb_smmu1_dump_info_write(dev, + base_addr, + depth, + dump_dst_phy_haddr, + dump_dst_phy_laddr, + (ZXIC_UINT32 *)form_buff); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_smmu1_dump_info_write"); + + /*组装下表命令格式*/ + data_len = depth * 512 / 32;//要提取的数据长度,以32bit为单位 + desc_len = DTB_LEN_POS_SETP / 4;//描述符长度,以32bit为单位 + + rc = dpp_dtb_write_dump_desc_info(dev, queue_id, queue_item_index, (ZXIC_UINT32 *)form_buff, data_len, desc_len, p_data); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_write_dump_desc_info"); + + return DPP_OK; +} + +/** dtb dump zcam表项内容 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param addr zcam内部ram地址,包括掩码 +* @param tb_width dump数据的宽度 +* @param depth dump的深度以tb_width为单位 +* @param p_data dump出数据缓存(tb_width * depth) +* @param element_id 返回下表使用的元素id +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_se_zcam_dma_dump(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 addr, + ZXIC_UINT32 tb_width, + ZXIC_UINT32 depth, + ZXIC_UINT32 *p_data, + ZXIC_UINT32 *element_id) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 dump_dst_phy_haddr = 0; + ZXIC_UINT32 dump_dst_phy_laddr = 0; + + ZXIC_UINT32 queue_item_index = 0; + ZXIC_UINT32 data_len = 0; + ZXIC_UINT32 desc_len = 0; + ZXIC_UINT32 tb_width_len = 0; + + ZXIC_UINT8 form_buff[DTB_TABLE_CMD_SIZE_BIT / 8] = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DTB_QUEUE_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), tb_width, DTB_DUMP_ZCAM_128b, DTB_DUMP_ZCAM_RSV - 1); + ZXIC_COMM_CHECK_INDEX_LOWER(depth, 1); + + /*获取队列元素*/ + rc = dpp_dtb_tab_up_free_item_get(dev, queue_id, &queue_item_index); + if(rc != DPP_OK) + { + ZXIC_COMM_TRACE_ERROR("dpp_dtb_tab_up_free_item_get failed!\n"); + return DPP_RC_DTB_QUEUE_ITEM_SW_EMPTY; + } + + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("dump smmu0:queue %d,item_index: %d\n",queue_id, queue_item_index); + } + + *element_id = queue_item_index;//保存获取的item_index + + /*获取dump dma phy地址*/ + rc = dpp_dtb_tab_up_item_addr_get(dev, queue_id, queue_item_index, &dump_dst_phy_haddr, &dump_dst_phy_laddr); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_tab_up_item_addr_get"); + + rc = dpp_dtb_zcam_dump_info_write(dev, + addr, + tb_width, + depth, + dump_dst_phy_haddr, + dump_dst_phy_laddr, + (ZXIC_UINT32 *)form_buff); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_zcam_dump_info_write"); + + /*组装下表命令格式*/ + tb_width_len = DTB_LEN_POS_SETP << tb_width; + data_len = depth * tb_width_len / 4;//要提取的数据长度,以32bit为单位 + desc_len = DTB_LEN_POS_SETP / 4;//描述符长度,以32bit为单位 + + rc = dpp_dtb_write_dump_desc_info(dev, queue_id, queue_item_index, (ZXIC_UINT32 *)form_buff, data_len, desc_len, p_data); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_write_dump_desc_info"); + + return DPP_OK; + +} + +#endif + +#if ZXIC_REAL("DTB GET") +/***********************************************************/ +/** 配置数据获取模式 +* @param srh_mode 0:软件获取 1:硬件获取 +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/02 +************************************************************/ +ZXIC_VOID dpp_dtb_srh_mode_set(ZXIC_UINT32 srh_mode) +{ + g_dtb_srh_mode = srh_mode; +} + +/***********************************************************/ +/** 获取查找方式 +* @param +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/02 +************************************************************/ +ZXIC_UINT32 dpp_dtb_srh_mode_get(ZXIC_VOID) +{ + return g_dtb_srh_mode; +} + +/***********************************************************/ +/** hash表项查找校验(软件获取数据) +* @param p_entry 入参:hash表项键值 出参:hash表项结果 +* @param key_by_size 键值大小 +* @param rst_by_size 返回值大小 +* @param p_item_info 512bit单元数据 +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/02 +************************************************************/ +DPP_STATUS dpp_dtb_hash_software_item_check(DPP_HASH_ENTRY *p_entry, + ZXIC_UINT32 key_by_size, + ZXIC_UINT32 rst_by_size, + SE_ITEM_CFG *p_item_info) +{ + ZXIC_UINT8 srh_succ = 0; + ZXIC_UINT8 temp_key_type = 0; + ZXIC_UINT8 srh_key_type = 0; + D_NODE *p_entry_dn = NULL; + DPP_HASH_RBKEY_INFO *p_rbkey = NULL; + + ZXIC_COMM_CHECK_INDEX(key_by_size, 0, HASH_KEY_MAX); + ZXIC_COMM_CHECK_POINT(p_entry); + ZXIC_COMM_CHECK_POINT(p_entry->p_key); + ZXIC_COMM_CHECK_POINT(p_entry->p_rst); + ZXIC_COMM_CHECK_POINT(p_item_info); + + srh_key_type = DPP_GET_HASH_KEY_TYPE(p_entry->p_key); + p_entry_dn = p_item_info->item_list.p_next; + while (p_entry_dn) + { + p_rbkey = (DPP_HASH_RBKEY_INFO *)p_entry_dn->data; + ZXIC_COMM_CHECK_POINT(p_rbkey); + ZXIC_COMM_CHECK_POINT(p_rbkey->key); + ZXIC_COMM_CHECK_POINT(p_rbkey->rst); + + ZXIC_COMM_ASSERT(p_rbkey->p_item_info == p_item_info); + + temp_key_type = DPP_GET_HASH_KEY_TYPE(p_rbkey->key); + + if (DPP_GET_HASH_KEY_VALID(p_rbkey->key) && (srh_key_type == temp_key_type)) + { + if (0 == ZXIC_COMM_MEMCMP(p_entry->p_key, p_rbkey->key, key_by_size)) + { + srh_succ = 1; + break; + } + } + + p_entry_dn = p_entry_dn->next; + } + + if (NULL == p_rbkey) + { + return ZXIC_PAR_CHK_POINT_NULL; + } + + if(!srh_succ) + { + ZXIC_COMM_TRACE_DEBUG("dpp_dtb_hash_software_item_check fail!\n"); + return DPP_HASH_RC_MATCH_ITEM_FAIL; + } + + /* copy result */ + ZXIC_COMM_MEMCPY(p_entry->p_rst, p_rbkey->rst, (rst_by_size > HASH_RST_MAX) ? HASH_RST_MAX : rst_by_size); + + return DPP_OK; +} + +/** hash表项解析,在512bit存储单元里查找并比对 +* @param item_type +* @param key_by_size 键值大小 +* @param p_entry 入参:hash表项键值 出参:hash表项结果 +* @param p_item_data 查找键值信息 +* @param p_data_offset 查找键值在512bit里的偏移位置,单位为字节 +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/02 +************************************************************/ +ZXIC_UINT32 dpp_dtb_hash_data_parse(ZXIC_UINT32 item_type, + ZXIC_UINT32 key_by_size, + DPP_HASH_ENTRY *p_entry, + ZXIC_UINT8 *p_item_data, + ZXIC_UINT8 *p_data_offset) +{ + ZXIC_UINT32 data_offset = 0; + ZXIC_UINT8 temp_key_valid = 0; + ZXIC_UINT8 temp_key_type = 0; + ZXIC_UINT32 temp_entry_size = 0; + ZXIC_UINT8 srh_key_type = 0; + ZXIC_UINT32 srh_entry_size = 0; + ZXIC_UINT32 rst_by_size = 0; + ZXIC_UINT8 srh_succ = 0; + ZXIC_UINT32 item_width = SE_ITEM_WIDTH_MAX; + ZXIC_UINT8 *p_srh_key = NULL; + ZXIC_UINT8 *p_temp_key = NULL; + ZXIC_UINT32 i = 0; + + ZXIC_COMM_CHECK_POINT(p_item_data); + ZXIC_COMM_CHECK_POINT(p_entry); + ZXIC_COMM_CHECK_POINT(p_entry->p_key); + + if (ITEM_DDR_256 == item_type) + { + item_width = item_width / 2; + } + + p_temp_key = p_item_data; + p_srh_key = p_entry->p_key; + srh_key_type = DPP_GET_HASH_KEY_TYPE(p_srh_key); + srh_entry_size = DPP_GET_HASH_ENTRY_SIZE(srh_key_type); + + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("srh_key:0x"); + + for(i = 0; i < key_by_size; i++) + { + ZXIC_COMM_PRINT("%02x ", p_srh_key[i]); + } + ZXIC_COMM_PRINT("\n"); + } + + while (data_offset < item_width) + { + temp_key_valid = DPP_GET_HASH_KEY_VALID(p_temp_key); + temp_key_type = DPP_GET_HASH_KEY_TYPE(p_temp_key); + + if (temp_key_valid && (srh_key_type == temp_key_type)) + { + if (0 == ZXIC_COMM_MEMCMP(p_srh_key, p_temp_key, key_by_size)) + { + ZXIC_COMM_TRACE_DEBUG("Hash search hardware successfully. \n"); + srh_succ = 1; + break; + } + + data_offset += srh_entry_size; + } + else if (temp_key_valid && (srh_key_type != temp_key_type)) + { + temp_entry_size = DPP_GET_HASH_ENTRY_SIZE(temp_key_type); + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(data_offset, temp_entry_size); + data_offset += temp_entry_size; + } + else + { + data_offset += 16;/* 偏移最小的步长128bit */ + } + + p_temp_key = p_item_data; + p_temp_key += data_offset; + } + + if(!srh_succ) + { + ZXIC_COMM_TRACE_DEBUG("Hash search hardware fail. \n"); + return DPP_HASH_RC_MATCH_ITEM_FAIL; + } + + /* copy result */ + rst_by_size = srh_entry_size - key_by_size; + ZXIC_COMM_MEMCPY(p_entry->p_rst, p_temp_key + key_by_size, (rst_by_size > HASH_RST_MAX) ? HASH_RST_MAX : rst_by_size); + *p_data_offset = data_offset; + + return DPP_OK; +} + +/***********************************************************/ +/** 查找存储在DDR空间的hash表项 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列id +* @param p_hash_entry_cfg hash表项配置信息 +* @param p_hash_entry 查找键值信息 +* @param p_srh_succ 出参,查找是否成功 +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/02 +************************************************************/ +ZXIC_UINT32 dpp_dtb_hash_ddr_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + HASH_ENTRY_CFG *p_hash_entry_cfg, + DPP_HASH_ENTRY *p_hash_entry, + ZXIC_UINT8 *p_srh_succ) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 item_idx = 0xFFFFFFFF;/* -1 */ + ZXIC_UINT32 item_type = 0; + ZXIC_UINT32 crc_value = 0; + ZXIC_UINT32 index = 0; + ZXIC_UINT32 index_offset = 0; + ZXIC_UINT32 hw_addr = 0; /*单位512bit*/ + ZXIC_UINT32 base_addr = 0; /*单位2k*256bit*/ + ZXIC_UINT32 ecc_en = 0; + ZXIC_UINT32 element_id = 0; + ZXIC_UINT32 byte_len = 0; + ZXIC_UINT8 byte_offset = 0; + ZXIC_UINT8 temp_key[HASH_KEY_MAX] = {0}; + HASH_DDR_CFG *p_ddr_cfg = NULL; + DPP_HASH_CFG *p_hash_cfg = NULL; + ZXIC_UINT32 rd_buff[DPP_DIR_TBL_BUF_MAX_NUM] = {0}; + ZXIC_UINT8 temp_data[DPP_DIR_TBL_BUF_MAX_NUM*4] = {0}; + SE_ITEM_CFG *p_item = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev),DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX(queue_id, 0, DTB_QUEUE_MAX - 1); + ZXIC_COMM_CHECK_POINT(p_hash_entry_cfg); + ZXIC_COMM_CHECK_POINT(p_hash_entry); + ZXIC_COMM_CHECK_POINT(p_srh_succ); + + ZXIC_COMM_MEMSET((ZXIC_UINT8 *)rd_buff,0x0,sizeof(rd_buff)); + ZXIC_COMM_MEMSET(temp_data,0x0,sizeof(temp_data)); + + rc = dpp_se_smmu1_hash_tbl_soft_cfg_get(dev, + p_hash_entry_cfg->fun_id, + p_hash_entry_cfg->bulk_id, + &ecc_en, + &base_addr); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_se_smmu1_hash_tbl_soft_cfg_get"); + + p_hash_cfg = p_hash_entry_cfg->p_hash_cfg; + ZXIC_COMM_CHECK_POINT(p_hash_cfg); + ZXIC_COMM_CHECK_INDEX_UPPER(p_hash_entry_cfg->bulk_id,HASH_BULK_ID_MAX); + p_ddr_cfg = p_hash_cfg->p_bulk_ddr_info[p_hash_entry_cfg->bulk_id]; + ZXIC_COMM_CHECK_POINT(p_ddr_cfg); + + ZXIC_COMM_CHECK_INDEX_UPPER(p_hash_entry_cfg->key_by_size, HASH_KEY_MAX); + rc = dpp_hash_set_crc_key(dev,p_hash_entry_cfg,p_hash_entry,temp_key); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev),rc,"hash_set_crc_key"); + + crc_value = p_hash_cfg->p_hash32_fun(temp_key, p_hash_entry_cfg->key_by_size, p_ddr_cfg->hash_ddr_arg); + item_idx = crc_value % p_ddr_cfg->item_num; + index = p_ddr_cfg->hw_baddr + item_idx; + if (DDR_WIDTH_512b == p_ddr_cfg->width_mode) + { + item_type = ITEM_DDR_512; + hw_addr = (base_addr<<10) + index; + index_offset = 0; + byte_len = 512/8; + } + else + { + item_type = ITEM_DDR_256; + hw_addr = (base_addr<<10) + (index>>1); + index_offset = index & 0x1; + byte_len = 256/8; + } + + ZXIC_COMM_TRACE_DEV_DEBUG(DEV_ID(dev), + "Hash search in ITEM_DDR_%s, CRC32 index is: 0x%x.\n", ((item_type == ITEM_DDR_256) ? "256" : "512"), + item_idx); + if(dpp_dtb_srh_mode_get()) + { + rc = dpp_dtb_se_smmu1_dma_dump(dev, + queue_id, + hw_addr, + 1, + rd_buff, + &element_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc,"dpp_dtb_se_smmu1_dma_dump"); + + zxic_comm_swap((ZXIC_UINT8 *)(rd_buff+index_offset*8), byte_len); + ZXIC_COMM_MEMCPY(temp_data, rd_buff+index_offset*8, byte_len); + + rc = dpp_dtb_hash_data_parse(item_type,p_hash_entry_cfg->key_by_size,p_hash_entry,temp_data,&byte_offset); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_hash_data_parse"); + + ZXIC_COMM_TRACE_DEBUG("Hash search hardware succ in ddr. \n"); + } + else + { + ZXIC_COMM_CHECK_INDEX_UPPER(item_idx, p_ddr_cfg->item_num - 1); + p_item = p_ddr_cfg->p_item_array[item_idx]; + ZXIC_COMM_CHECK_POINT_NO_ASSERT(p_item); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(DEV_ID(dev), p_ddr_cfg->hw_baddr, item_idx); + p_item->hw_addr = p_ddr_cfg->hw_baddr+item_idx; + p_item->item_type = item_type; + p_item->item_index = item_idx; + + rc = dpp_dtb_hash_software_item_check(p_hash_entry, + p_hash_entry_cfg->key_by_size, + p_hash_entry_cfg->rst_by_size, + p_item); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_hash_software_item_check"); + } + + *p_srh_succ = 1; + p_hash_cfg->hash_stat.search_ok++; + + return DPP_OK; +} + +/***********************************************************/ +/** 查找存储在ZCAM空间的hash表项 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列id +* @param p_hash_entry_cfg hash表项配置信息 +* @param p_hash_entry 查找键值信息 +* @param p_srh_succ 出参,查找是否成功 +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/02 +************************************************************/ +ZXIC_UINT32 dpp_dtb_hash_zcam_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + HASH_ENTRY_CFG *p_hash_entry_cfg, + DPP_HASH_ENTRY *p_hash_entry, + ZXIC_UINT8 *p_srh_succ) +{ + DPP_STATUS rc = DPP_OK; + DPP_HASH_RBKEY_INFO srh_rbkey = {0}; + ZXIC_RB_TN *p_rb_tn_rtn = NULL; + DPP_HASH_CFG *p_hash_cfg = NULL; + DPP_HASH_RBKEY_INFO *p_rbkey = NULL; + SE_ITEM_CFG *p_item = NULL; + ZXIC_UINT32 element_id = 0; + ZXIC_UINT8 rd_buff[SE_ITEM_WIDTH_MAX] = {0}; + ZXIC_UINT32 i = 0; + ZXIC_UINT8 byte_offset = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev),DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX(queue_id, 0, DTB_QUEUE_MAX - 1); + ZXIC_COMM_CHECK_POINT(p_hash_entry_cfg); + ZXIC_COMM_CHECK_POINT(p_srh_succ); + ZXIC_COMM_CHECK_POINT(p_hash_entry); + ZXIC_COMM_CHECK_POINT(p_hash_entry->p_key); + ZXIC_COMM_CHECK_POINT(p_hash_entry->p_rst); + + ZXIC_COMM_MEMSET(rd_buff,0x0,sizeof(rd_buff)); + ZXIC_COMM_MEMSET(&srh_rbkey,0x0,sizeof(DPP_HASH_RBKEY_INFO)); + ZXIC_COMM_CHECK_INDEX_UPPER(p_hash_entry_cfg->key_by_size, HASH_KEY_MAX); + ZXIC_COMM_MEMCPY(srh_rbkey.key,p_hash_entry->p_key,p_hash_entry_cfg->key_by_size); + + p_hash_cfg = p_hash_entry_cfg->p_hash_cfg; + ZXIC_COMM_CHECK_POINT(p_hash_cfg); + + rc = zxic_comm_rb_search(&p_hash_cfg->hash_rb, (ZXIC_VOID *)&srh_rbkey, (ZXIC_VOID *)(&p_rb_tn_rtn)); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "zxic_comm_rb_search hash fail"); + ZXIC_COMM_CHECK_POINT(p_rb_tn_rtn); + p_rbkey = p_rb_tn_rtn->p_key; + + ZXIC_COMM_CHECK_POINT(p_rbkey); + p_item = p_rbkey->p_item_info; + ZXIC_COMM_CHECK_POINT(p_item); + + if(dpp_dtb_srh_mode_get()) + { + rc = dpp_dtb_se_zcam_dma_dump(dev, queue_id, p_item->hw_addr, DTB_DUMP_ZCAM_512b, 1,(ZXIC_UINT32 *)rd_buff, &element_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_se_zcam_dma_dump"); + zxic_comm_swap(rd_buff,sizeof(rd_buff)); + + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("dump data:\n"); + + for(i = 0; i < SE_ITEM_WIDTH_MAX; i++) + { + ZXIC_COMM_PRINT("%02x ", rd_buff[i]); + if((i + 1) % 16 == 0) + { + ZXIC_COMM_PRINT("\n"); + } + } + ZXIC_COMM_PRINT("\n"); + } + + rc = dpp_dtb_hash_data_parse(ITEM_RAM,p_hash_entry_cfg->key_by_size,p_hash_entry,rd_buff,&byte_offset); + if(DPP_OK == rc) + { + ZXIC_COMM_TRACE_DEBUG("Hash search hardware succ in zcam. \n"); + *p_srh_succ = 1; + p_hash_cfg->hash_stat.search_ok++; + } + else + { + ZXIC_COMM_TRACE_DEBUG("Hash search hardware fail in zcam. \n"); + } + } + else + { + rc = dpp_dtb_hash_software_item_check(p_hash_entry, + p_hash_entry_cfg->key_by_size, + p_hash_entry_cfg->rst_by_size, + p_item); + if(DPP_OK == rc) + { + ZXIC_COMM_TRACE_DEBUG("Hash search software succ in zcell. \n"); + *p_srh_succ = 1; + p_hash_cfg->hash_stat.search_ok++; + } + } + + return DPP_OK; + +} + + +/** dtb根据etcam key计算dump出数据占用的数据长度 +* @param dev_id 设备号 +* @param etcam_key_mode etcam条目位宽,参照DPP_ETCAM_ENTRY_MODE_E定义 +* @param p_etcam_dump_len dtb dump出etcam的数据长度(单位:字节) +* @param p_etcam_dump_inerval dump出etcam数据的间隔数据长度(单位:字节) +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dtb_etcam_dump_data_len(DPP_DEV_T *dev, + ZXIC_UINT32 etcam_key_mode, + ZXIC_UINT32 *p_etcam_dump_len, + ZXIC_UINT32* p_etcam_dump_inerval) +{ + ZXIC_UINT32 dump_data_len = 0; + ZXIC_UINT8 etcam_dump_inerval = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_etcam_dump_len); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_etcam_dump_inerval); + + if(DPP_ETCAM_KEY_640b == etcam_key_mode) + { + dump_data_len = 5 * DTB_LEN_POS_SETP; + etcam_dump_inerval = 0; + } + else if(DPP_ETCAM_KEY_320b == etcam_key_mode) + { + dump_data_len = 3 * DTB_LEN_POS_SETP; + etcam_dump_inerval = 8; + } + else if(DPP_ETCAM_KEY_160b == etcam_key_mode) + { + dump_data_len = 2 * DTB_LEN_POS_SETP; + etcam_dump_inerval = 12; + } + else if(DPP_ETCAM_KEY_80b == etcam_key_mode) + { + dump_data_len = 1 * DTB_LEN_POS_SETP; + etcam_dump_inerval = 6; + } + + *p_etcam_dump_len = dump_data_len; + *p_etcam_dump_inerval = etcam_dump_inerval; + + return DPP_OK; +} + +/** dtb 从dump数据中提取到xy数据 +* @param dev_id 设备号 +* @param p_data dump出的etcam data 指针 +* @param p_mask dump出的etcam mask 指针 +* @param p_etcam_dump_len dtb dump出etcam的数据长度(单位:字节) +* @param p_etcam_dump_inerval dump出etcam数据的间隔数据长度(单位:字节) +* @param p_entry_xy 保存etcam xy数据(已分配内存) +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_get_etcam_xy_from_dump_data(DPP_DEV_T *dev, + ZXIC_UINT8 *p_data, + ZXIC_UINT8 *p_mask, + ZXIC_UINT32 etcam_dump_len, + ZXIC_UINT32 etcam_dump_inerval, + DPP_ETCAM_ENTRY_T *p_entry_xy) +{ + ZXIC_UINT8 *p_entry_data = NULL; + ZXIC_UINT8 *p_entry_mask = NULL; + + //先对数据进行翻转再进行数据的截取,最后进行数据的复制 + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_mask); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_entry_xy); + + zxic_comm_swap(p_data, etcam_dump_len); + zxic_comm_swap(p_mask, etcam_dump_len); + + p_entry_data = p_data + etcam_dump_inerval; + p_entry_mask = p_mask + etcam_dump_inerval; + + ZXIC_COMM_MEMCPY(p_entry_xy->p_data, p_entry_data, DPP_ETCAM_ENTRY_SIZE_GET(p_entry_xy->mode)); + ZXIC_COMM_MEMCPY(p_entry_xy->p_mask, p_entry_mask, DPP_ETCAM_ENTRY_SIZE_GET(p_entry_xy->mode)); + + return DPP_OK; +} + +/** dtb dump etcam直接表表项内容 级联eram支持64bit/128bit +* @param dev_id 设备号 +* @param p_in_data 长度为640bit的输入数据 +* @param rd_mode 读模式 +* @param p_out_data 按照读模式读出的数据 +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_etcam_ind_data_get(DPP_DEV_T *dev, ZXIC_UINT8 *p_in_data, ZXIC_UINT32 rd_mode, ZXIC_UINT8 *p_out_data) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 i = 0; + ZXIC_UINT8 *p_temp = NULL; + ZXIC_UINT32 offset = 0; + ZXIC_UINT8 buff[DPP_ETCAM_WIDTH_MAX / 8] = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_in_data); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_out_data); + + p_temp = p_out_data; + ZXIC_COMM_MEMCPY(buff, p_in_data, DPP_ETCAM_WIDTH_MAX / 8); + + zxic_comm_swap(buff, DPP_ETCAM_WIDTH_MAX / 8); + + for (i = 0; i < DPP_ETCAM_RAM_NUM; i++) + { + offset = i * (DPP_ETCAM_WIDTH_MIN / 8); + + if ((rd_mode >> (DPP_ETCAM_RAM_NUM - 1 - i)) & 0x1) + { + ZXIC_COMM_MEMCPY(p_temp, buff + offset, DPP_ETCAM_WIDTH_MIN / 8); + p_temp += DPP_ETCAM_WIDTH_MIN / 8; + } + } + + return rc; +} + +/** dtb dump etcam表项内容 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param block_idx block的索引,范围0-7 +* @param addr 单个block中的RAM地址,范围0~511 +* @param rd_mode 读block RAM行的位图,共8bit,每比特表示一个RAM中的80bit +* @param opr_type 读取的数据类型,0:data/mask格式,1:xy格式 +* @param as_en 级联eram使能 +* @param as_eram_baddr 级联eram基地址 +* @param as_eram_index 级联eram 条目index +* @param as_rsp_mode 级联返回位宽,参见DPP_DIAG_ERAM_MODE_E +* @param p_entry 读取的etcam数据 +* @param p_as_rslt 读取的级联数据(分配128bit存储空间) +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_etcam_entry_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 block_idx, + ZXIC_UINT32 addr, + ZXIC_UINT32 rd_mode, + ZXIC_UINT32 opr_type, + ZXIC_UINT32 as_en, + ZXIC_UINT32 as_eram_baddr, + ZXIC_UINT32 as_eram_index, + ZXIC_UINT32 as_rsp_mode,//128:3 64:2 + DPP_ETCAM_ENTRY_T *p_entry, + ZXIC_UINT8 *p_as_rslt) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 etcam_key_mode = 0; + + ZXIC_UINT8 temp_data[DPP_ETCAM_WIDTH_MAX / 8] = {0}; + ZXIC_UINT8 temp_mask[DPP_ETCAM_WIDTH_MAX / 8] = {0}; + DPP_ETCAM_ENTRY_T entry_xy = {0}; + + ZXIC_UINT32 etcam_data_dst_phy_haddr = 0; + ZXIC_UINT32 etcam_data_dst_phy_laddr = 0; + ZXIC_UINT32 etcam_mask_dst_phy_haddr = 0; + ZXIC_UINT32 etcam_mask_dst_phy_laddr = 0; + ZXIC_UINT32 as_rst_dst_phy_haddr = 0; + ZXIC_UINT32 as_rst_dst_phy_laddr = 0; + + ZXIC_UINT32 dump_element_id = 0; + ZXIC_UINT32 etcam_dump_one_data_len = 0; + ZXIC_UINT32 etcam_dump_inerval = 0; + ZXIC_UINT32 dtb_desc_addr_offset = 0; + ZXIC_UINT32 dump_data_len = 0; + ZXIC_UINT32 dtb_desc_len = 0; + + ZXIC_UINT32 eram_dump_base_addr = 0; + ZXIC_UINT32 row_index = 0; + ZXIC_UINT32 col_index = 0; + + ZXIC_UINT8 *p_data = NULL; + ZXIC_UINT8 *p_mask = NULL; + ZXIC_UINT8 *p_rst = NULL; + ZXIC_UINT8 *temp_dump_out_data = NULL; + ZXIC_UINT8 *dump_info_buff = NULL; + ETCAM_DUMP_INFO_T etcam_dump_info = {0}; + DPP_DTB_ENTRY_T dtb_dump_entry = {0}; + ZXIC_UINT8 cmd_buff[DTB_TABLE_CMD_SIZE_BIT / 8] = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), addr, 0, DPP_ETCAM_RAM_DEPTH - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), block_idx, 0, DPP_ETCAM_BLOCK_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), rd_mode, 0, DPP_ETCAM_WR_MASK_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), opr_type, DPP_ETCAM_OPR_DM, DPP_ETCAM_OPR_XY); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_entry); + + dump_info_buff = (ZXIC_UINT8 *) ZXIC_COMM_MALLOC(DPP_DTB_TABLE_DUMP_INFO_BUFF_SIZE * sizeof(ZXIC_UINT8)); + ZXIC_COMM_CHECK_POINT_NO_ASSERT(dump_info_buff); + ZXIC_COMM_MEMSET(dump_info_buff, 0, DPP_DTB_TABLE_DUMP_INFO_BUFF_SIZE * sizeof(ZXIC_UINT8)); + + dtb_dump_entry.cmd = cmd_buff; + + entry_xy.p_data = temp_data; + entry_xy.p_mask = temp_mask; + + etcam_key_mode = p_entry->mode; + + etcam_dump_info.block_sel = block_idx; + etcam_dump_info.addr = addr; + etcam_dump_info.tb_width = 3 - etcam_key_mode; + etcam_dump_info.rd_mode = rd_mode; + etcam_dump_info.tb_depth = 1; + + rc = dpp_dtb_tab_up_free_item_get(dev, queue_id, &dump_element_id); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_tab_up_free_item_get", dump_info_buff); + ZXIC_COMM_TRACE_DEV_DEBUG(DEV_ID(dev), "table up item queue_element_id is: %d.\n",dump_element_id); + + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("dump etcam:queue %d,element id: %d\n",queue_id, dump_element_id); + } + + rc = dtb_etcam_dump_data_len(dev, etcam_key_mode, &etcam_dump_one_data_len, &etcam_dump_inerval); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dtb_etcam_dump_data_len", dump_info_buff); + + //etcam data dump描述符 + etcam_dump_info.data_or_mask = DPP_ETCAM_DTYPE_DATA; + rc = dpp_dtb_tab_up_item_offset_addr_get(dev, + queue_id, + dump_element_id, + dump_data_len, + &etcam_data_dst_phy_haddr, + &etcam_data_dst_phy_laddr); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_tab_up_item_offset_addr_get", dump_info_buff); + rc = dpp_dtb_etcam_dump_entry(dev, + &etcam_dump_info, + etcam_data_dst_phy_haddr, + etcam_data_dst_phy_laddr, + &dtb_dump_entry); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_etcam_dump_entry", dump_info_buff); + + rc = dpp_dtb_data_write(dump_info_buff, dtb_desc_addr_offset, &dtb_dump_entry); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_data_write", dump_info_buff); + ZXIC_COMM_MEMSET(cmd_buff, 0, DTB_TABLE_CMD_SIZE_BIT / 8); + dtb_desc_len += 1; + dtb_desc_addr_offset += DTB_LEN_POS_SETP; + dump_data_len += etcam_dump_one_data_len; + + //etcam mask dump描述符 + etcam_dump_info.data_or_mask = DPP_ETCAM_DTYPE_MASK; + rc = dpp_dtb_tab_up_item_offset_addr_get(dev, + queue_id, + dump_element_id, + dump_data_len, + &etcam_mask_dst_phy_haddr, + &etcam_mask_dst_phy_laddr); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_tab_up_item_offset_addr_get", dump_info_buff); + rc = dpp_dtb_etcam_dump_entry(dev, + &etcam_dump_info, + etcam_mask_dst_phy_haddr, + etcam_mask_dst_phy_laddr, + &dtb_dump_entry); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_etcam_dump_entry", dump_info_buff); + rc = dpp_dtb_data_write(dump_info_buff, dtb_desc_addr_offset, &dtb_dump_entry); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_data_write", dump_info_buff); + ZXIC_COMM_MEMSET(cmd_buff, 0, DTB_TABLE_CMD_SIZE_BIT / 8); + dtb_desc_len += 1; + dtb_desc_addr_offset += DTB_LEN_POS_SETP; + dump_data_len += etcam_dump_one_data_len; + + //级联数据dump描述符生成 + if(as_en) + { + rc = dtb_eram_index_cal(dev, as_rsp_mode, as_eram_index, &row_index, &col_index); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dtb_eram_index_cal", dump_info_buff); + + eram_dump_base_addr = as_eram_baddr + row_index; + ZXIC_COMM_TRACE_INFO("eram_dump_base_addr : 0x%x\n",eram_dump_base_addr); + rc = dpp_dtb_tab_up_item_offset_addr_get(dev, + queue_id, + dump_element_id, + dump_data_len, + &as_rst_dst_phy_haddr, + &as_rst_dst_phy_laddr); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_tab_up_item_offset_addr_get", dump_info_buff); + + rc = dpp_dtb_smmu0_dump_entry(dev, + eram_dump_base_addr, + 1, + as_rst_dst_phy_haddr, + as_rst_dst_phy_laddr, + &dtb_dump_entry); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_smmu0_dump_entry", dump_info_buff); + rc = dpp_dtb_data_write(dump_info_buff, dtb_desc_addr_offset, &dtb_dump_entry); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_data_write", dump_info_buff); + ZXIC_COMM_MEMSET(cmd_buff, 0, DTB_TABLE_CMD_SIZE_BIT / 8); + dtb_desc_len += 1; + dtb_desc_addr_offset += DTB_LEN_POS_SETP; + dump_data_len += DTB_LEN_POS_SETP; + } + + //申请data空间 + temp_dump_out_data = (ZXIC_UINT8 *) ZXIC_COMM_MALLOC(dump_data_len * sizeof(ZXIC_UINT8)); + ZXIC_COMM_CHECK_POINT_MEMORY_FREE_NO_ASSERT(temp_dump_out_data, dump_info_buff); + ZXIC_COMM_MEMSET(temp_dump_out_data, 0, dump_data_len * sizeof(ZXIC_UINT8)); + p_data = temp_dump_out_data; + /*下发dump描述符*/ + rc = dpp_dtb_write_dump_desc_info(dev, + queue_id, + dump_element_id, + (ZXIC_UINT32 *)dump_info_buff, + dump_data_len / 4, + dtb_desc_len * 4, + (ZXIC_UINT32 *)temp_dump_out_data); + ZXIC_COMM_CHECK_RC_MEMORY_FREE2PTR_NO_ASSERT(rc,"dpp_dtb_write_dump_desc_info", dump_info_buff, temp_dump_out_data); + + //解析数据 + p_data = temp_dump_out_data; + p_mask = p_data + etcam_dump_one_data_len; + + rc = dpp_dtb_get_etcam_xy_from_dump_data(dev, + p_data, + p_mask, + etcam_dump_one_data_len, + etcam_dump_inerval, + &entry_xy); + ZXIC_COMM_CHECK_RC_MEMORY_FREE2PTR_NO_ASSERT(rc, "dpp_dtb_get_etcam_xy_from_dump_data", dump_info_buff, temp_dump_out_data); + + if (opr_type == DPP_ETCAM_OPR_DM) + { + /* convert hardware data X/Y to user D/M */ + rc = dpp_etcam_xy_to_dm(p_entry, &entry_xy, DPP_ETCAM_ENTRY_SIZE_GET(p_entry->mode)); + ZXIC_COMM_CHECK_RC_MEMORY_FREE2PTR_NO_ASSERT(rc, "dpp_etcam_xy_to_dm", dump_info_buff, temp_dump_out_data); + } + else + { + ZXIC_COMM_MEMCPY(p_entry->p_data, entry_xy.p_data, DPP_ETCAM_ENTRY_SIZE_GET(p_entry->mode)); + ZXIC_COMM_MEMCPY(p_entry->p_mask, entry_xy.p_mask, DPP_ETCAM_ENTRY_SIZE_GET(p_entry->mode)); + } + + if(as_en) + { + //解析dump数据 + p_rst = p_mask + etcam_dump_one_data_len; + ZXIC_COMM_MEMCPY(p_as_rslt, p_rst, (128 / 8)); + } + + ZXIC_COMM_FREE(dump_info_buff); + ZXIC_COMM_FREE(temp_dump_out_data); + + return rc; +} +#endif + +#if ZXIC_REAL("DTB GET INTERFACE") +/** dtb dump eram直接表表项内容 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no eram表sdt表号 +* @param p_dump_eram_entry eram数据结构,数据已分配相应内存 +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_eram_data_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + DPP_DTB_ERAM_ENTRY_INFO_T *p_dump_eram_entry) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 rd_mode = 0; + ZXIC_UINT32 eram_base_addr = 0; + ZXIC_UINT32 eram_table_depth = 0; + ZXIC_UINT32 eram_dump_base_addr = 0; + ZXIC_UINT32 row_index = 0; + ZXIC_UINT32 col_index = 0; + ZXIC_UINT32 temp_data[4] = {0}; + ZXIC_UINT32 element_id = 0; + + ZXIC_UINT32 index = p_dump_eram_entry->index; + ZXIC_UINT32 *p_data = p_dump_eram_entry->p_data; + + DPP_SDTTBL_ERAM_T sdt_eram_info = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DTB_QUEUE_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + + //从sdt_no中获取SDT配置 + rc = dpp_soft_sdt_tbl_get(DEV_ID(dev), sdt_no, &sdt_eram_info); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_soft_sdt_tbl_get"); + eram_base_addr = sdt_eram_info.eram_base_addr; + rd_mode = sdt_eram_info.eram_mode;//0:1bit;2:64bit;3:128, + eram_table_depth = sdt_eram_info.eram_table_depth; + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), index, 0, eram_table_depth - 1); + + rc = dtb_eram_index_cal(dev, rd_mode, index, &row_index, &col_index); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dtb_eram_index_cal"); + + eram_dump_base_addr = eram_base_addr + row_index; + + rc = dpp_dtb_se_smmu0_dma_dump(dev, + queue_id, + eram_dump_base_addr, + 1, + temp_data, + &element_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_se_smmu0_dma_dump"); + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("dtb dump eram done, the element id is %d.\n", element_id); + } + + //提取数据 + switch (rd_mode) + { + case ERAM128_TBL_128b: + { + ZXIC_COMM_MEMCPY(p_data, temp_data, (128 / 8)); + break; + } + + case ERAM128_TBL_64b: + { + ZXIC_COMM_MEMCPY(p_data, temp_data + ((1 - col_index) << 1), (64 / 8)); + break; + } + + case ERAM128_TBL_1b: + { + ZXIC_COMM_UINT32_GET_BITS(p_data[0], *(temp_data + (3 - col_index / 32)), (col_index % 32), 1); + break; + } + } + + return rc; + +} + +/** dtb dump eram直接表表项内容 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no eram表sdt表号 +* @param p_dump_eram_entry eram数据结构,数据已分配相应内存 +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_eram_stat_data_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 base_addr, + ZXIC_UINT32 rd_mode, + ZXIC_UINT32 index, + ZXIC_UINT32 *p_data) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 eram_dump_base_addr = 0; + ZXIC_UINT32 row_index = 0; + ZXIC_UINT32 col_index = 0; + ZXIC_UINT32 temp_data[4] = {0}; + ZXIC_UINT32 element_id = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev),p_data); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DTB_QUEUE_MAX - 1); + + rc = dtb_eram_index_cal(dev, rd_mode, index, &row_index, &col_index); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dtb_eram_index_cal"); + + eram_dump_base_addr = base_addr + row_index; + + rc = dpp_dtb_se_smmu0_dma_dump(dev, + queue_id, + eram_dump_base_addr, + 1, + temp_data, + &element_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_se_smmu0_dma_dump"); + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("dtb dump eram done, the element id is %d.\n", element_id); + } + + //提取数据 + switch (rd_mode) + { + case ERAM128_TBL_128b: + { + ZXIC_COMM_MEMCPY(p_data, temp_data, (128 / 8)); + break; + } + + case ERAM128_TBL_64b: + { + ZXIC_COMM_MEMCPY(p_data, temp_data + ((1 - col_index) << 1), (64 / 8)); + break; + } + + case ERAM128_TBL_1b: + { + ZXIC_COMM_UINT32_GET_BITS(p_data[0], *(temp_data + (3 - col_index / 32)), (col_index % 32), 1); + break; + } + } + + return rc; +} + +/** dtb dump ddr直接表表项内容 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no eram表sdt表号 +* @param p_dump_ddr_entry ddr 数据结构,数据已分配相应内存 +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_ddr_data_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + DPP_DTB_DDR_ENTRY_INFO_T *p_dump_ddr_entry) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 rd_mode = 0; + ZXIC_UINT32 ddr_base_addr = 0; + ZXIC_UINT32 ddr_dump_base_addr_512bit = 0; + ZXIC_UINT32 row_index = 0; + ZXIC_UINT32 col_index = 0; + ZXIC_UINT32 rd_buff[DPP_DIR_TBL_BUF_MAX_NUM] = {0}; + ZXIC_UINT32 element_id = 0; + + ZXIC_UINT32 index = p_dump_ddr_entry->index; + ZXIC_UINT32 *p_data = p_dump_ddr_entry->p_data; + + DPP_SDTTBL_DDR3_T sdt_ddr_info = {0}; /*SDT内容*/ + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(p_dump_ddr_entry); + + //从sdt_no中获取SDT配置 + rc = dpp_soft_sdt_tbl_get(DEV_ID(dev), sdt_no, &sdt_ddr_info); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_soft_sdt_tbl_get"); + ddr_base_addr = sdt_ddr_info.ddr3_base_addr; + ZXIC_COMM_CHECK_INDEX_UPPER(ddr_base_addr,DPP_SMMU1_TOTAL_MAX_BADDR); + rd_mode = sdt_ddr_info.ddr3_rw_len; + + if(SMMU1_DDR_SRH_128b == rd_mode) + { + row_index = index >> 2; + col_index = ((index & 0x3)) << 2; + } + else if(SMMU1_DDR_SRH_256b == rd_mode) + { + row_index = index >> 1; + col_index = ((index & 0x1)) << 3; + } + else if(SMMU1_DDR_SRH_512b == rd_mode) + { + row_index = index; + col_index = 0; + } + + ddr_dump_base_addr_512bit = (ddr_base_addr << 10) + row_index;/**转换成512bit为单位的地址*/ + + rc = dpp_dtb_se_smmu1_dma_dump(dev, + queue_id, + ddr_dump_base_addr_512bit, + 1, + rd_buff, + &element_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc,"dpp_dtb_se_smmu1_dma_dump"); + + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("dump ddr done ,the element is is %d\n",element_id); + } + + ZXIC_COMM_MEMCPY((ZXIC_UINT8 *)p_data, rd_buff+col_index, DTB_LEN_POS_SETP << rd_mode); + + return rc; +} + + +/** 根据键值查找hash表 +* @param dev_id 设备号,支持多芯片 +* @param queue_id 队列id +* @param sdt_no 0~255 +* @param p_dtb_hash_entry 出参,返回描述符信息 +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/02 +************************************************************/ +ZXIC_UINT32 dpp_dtb_hash_data_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + DPP_DTB_HASH_ENTRY_INFO_T *p_dtb_hash_entry) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT8 srh_succ = 0; + ZXIC_UINT8 key_valid = 1; + DPP_SE_CFG *p_se_cfg = NULL; + FUNC_ID_INFO *p_func_info = NULL; + DPP_HASH_CFG *p_hash_cfg = NULL; + HASH_ENTRY_CFG hash_entry_cfg = {0}; + DPP_SDTTBL_HASH_T sdt_hash_info = {0}; /*SDT内容*/ + DPP_HASH_ENTRY hash_entry = {0}; + ZXIC_UINT8 aucKey[HASH_KEY_MAX] = {0}; + ZXIC_UINT8 aucRst[HASH_RST_MAX] = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX(queue_id, 0, DTB_QUEUE_MAX - 1); + ZXIC_COMM_CHECK_INDEX(sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + ZXIC_COMM_CHECK_POINT(p_dtb_hash_entry); + ZXIC_COMM_CHECK_POINT(p_dtb_hash_entry->p_actu_key); + ZXIC_COMM_CHECK_POINT(p_dtb_hash_entry->p_rst); + + ZXIC_COMM_MEMSET(&hash_entry,0x0,sizeof(DPP_HASH_ENTRY)); + + //从sdt_no中获取SDT配置 + rc = dpp_soft_sdt_tbl_get(DEV_ID(dev), sdt_no, &sdt_hash_info); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_soft_sdt_tbl_get"); + + hash_entry_cfg.fun_id = sdt_hash_info.hash_id; /*hash引擎*/ + hash_entry_cfg.table_id = sdt_hash_info.hash_table_id; /*hash表号*/ + hash_entry_cfg.bulk_id = ((hash_entry_cfg.table_id >> 2) & 0x7); + hash_entry_cfg.key_type = sdt_hash_info.hash_table_width; /*表宽度*/ + hash_entry_cfg.actu_key_size = sdt_hash_info.key_size; /*业务表键值长度*/ + hash_entry_cfg.key_by_size = DPP_GET_KEY_SIZE(hash_entry_cfg.actu_key_size); + hash_entry_cfg.rst_by_size = DPP_GET_RST_SIZE(hash_entry_cfg.key_type, hash_entry_cfg.actu_key_size); + + /* 取出se配置 */ + rc = dpp_se_cfg_get(DEV_ID(dev), &p_se_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_se_cfg_get"); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_se_cfg); + p_func_info = DPP_GET_FUN_INFO(p_se_cfg, hash_entry_cfg.fun_id); + DPP_SE_CHECK_FUN(p_func_info, hash_entry_cfg.fun_id, FUN_HASH); + hash_entry_cfg.p_hash_cfg = (DPP_HASH_CFG *)p_func_info->fun_ptr; + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), hash_entry_cfg.p_hash_cfg); + p_hash_cfg = hash_entry_cfg.p_hash_cfg; + ZXIC_COMM_CHECK_POINT(p_hash_cfg); + + hash_entry.p_key = aucKey; + hash_entry.p_rst = aucRst; + ZXIC_COMM_MEMSET(hash_entry.p_key,0x0,sizeof(aucKey)); + ZXIC_COMM_MEMSET(hash_entry.p_rst,0x0,sizeof(aucRst)); + hash_entry.p_key[0] = DPP_GET_HASH_KEY_CTRL(key_valid, + hash_entry_cfg.key_type, + hash_entry_cfg.table_id); + ZXIC_COMM_MEMCPY(&hash_entry.p_key[1],p_dtb_hash_entry->p_actu_key,hash_entry_cfg.actu_key_size); + + if(p_hash_cfg->ddr_valid) + { + rc = dpp_dtb_hash_ddr_get(dev,queue_id,&hash_entry_cfg,&hash_entry,&srh_succ); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_hash_ddr_get"); + } + + if(!srh_succ) + { + rc = dpp_dtb_hash_zcam_get(dev,queue_id,&hash_entry_cfg,&hash_entry,&srh_succ); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_dtb_hash_zcam_get"); + } + + if(!srh_succ) + { + p_hash_cfg->hash_stat.search_fail++; + ZXIC_COMM_TRACE_DEV_DEBUG(DEV_ID(dev), "Hash search key fail!\n"); + return DPP_HASH_RC_SRH_FAIL; + } + + ZXIC_COMM_MEMCPY(p_dtb_hash_entry->p_rst,hash_entry.p_rst,1<<(sdt_hash_info.rsp_mode + 2)); + + return DPP_OK; +} + +/** dtb 通过key和mask获取ACL表级联结果 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no eram表sdt表号 +* @param p_dump_acl_entry etcam 数据结构,数据已分配相应内存,需要输入key和mask +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_acl_data_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + DPP_DTB_ACL_ENTRY_INFO_T *p_dump_acl_entry) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 block_idx = 0; + ZXIC_UINT32 ram_addr = 0; + ZXIC_UINT32 etcam_wr_mode = 0; + + ZXIC_UINT32 etcam_key_mode = 0; + ZXIC_UINT32 etcam_table_id = 0; + ZXIC_UINT32 as_enable = 0; + ZXIC_UINT32 as_eram_baddr = 0; + ZXIC_UINT32 etcam_as_mode = 0; + + ZXIC_UINT32 row_index = 0; + ZXIC_UINT32 col_index = 0; + + DPP_ETCAM_ENTRY_T etcam_entry_dm = {0}; + DPP_ETCAM_ENTRY_T etcam_entry_xy = {0}; + ZXIC_UINT32 as_eram_data[4] = {0}; + ZXIC_UINT8 temp_data[DPP_ETCAM_WIDTH_MAX / 8] = {0}; + ZXIC_UINT8 temp_mask[DPP_ETCAM_WIDTH_MAX / 8] = {0}; + + DPP_ACL_CFG_EX_T *p_acl_cfg = NULL; + DPP_ACL_TBL_CFG_T *p_tbl_cfg = NULL; + + DPP_SDTTBL_ETCAM_T sdt_etcam_info = {0}; /*SDT内容*/ + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_dump_acl_entry); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_dump_acl_entry->key_data); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_dump_acl_entry->key_mask); + + //从sdt_no中获取SDT配置 + rc = dpp_soft_sdt_tbl_get(DEV_ID(dev), sdt_no, &sdt_etcam_info); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_soft_sdt_tbl_get"); + etcam_key_mode = sdt_etcam_info.etcam_key_mode; + etcam_as_mode = sdt_etcam_info.as_rsp_mode; + etcam_table_id = sdt_etcam_info.etcam_table_id; + as_enable = sdt_etcam_info.as_en; + as_eram_baddr = sdt_etcam_info.as_eram_baddr; + + if(as_enable) + { + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_dump_acl_entry->p_as_rslt); + } + + etcam_entry_xy.mode = etcam_key_mode; + etcam_entry_xy.p_data = temp_data; + etcam_entry_xy.p_mask = temp_mask; + etcam_entry_dm.mode = etcam_key_mode; + etcam_entry_dm.p_data = p_dump_acl_entry->key_data; + etcam_entry_dm.p_mask = p_dump_acl_entry->key_mask; + + if(dpp_dtb_prt_get()) + { + ZXIC_COMM_PRINT("acl get DM:/n"); + dpp_acl_data_print(etcam_entry_dm.p_data, etcam_entry_dm.p_mask, etcam_entry_dm.mode); + } + + dpp_acl_cfg_get(&p_acl_cfg);//获取ACL表资源配置 + ZXIC_COMM_CHECK_POINT(p_acl_cfg); + + p_tbl_cfg = p_acl_cfg->acl_tbls + etcam_table_id;//得到该acl表的资源配置 + + if (!p_tbl_cfg->is_used) + { + ZXIC_COMM_TRACE_ERROR("table[ %d ] is not init!\n", etcam_table_id); + ZXIC_COMM_ASSERT(0); + return DPP_ACL_RC_TBL_NOT_INIT; + } + + /*计算地址等信息*/ + rc = dpp_acl_hdw_addr_get(p_tbl_cfg, p_dump_acl_entry->handle, &block_idx, &ram_addr, &etcam_wr_mode); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_acl_hdw_addr_get"); + + rc = dpp_dtb_etcam_entry_get(dev, + queue_id, + block_idx, + ram_addr, + etcam_wr_mode, + DPP_ETCAM_OPR_XY, + as_enable, + as_eram_baddr, + p_dump_acl_entry->handle, + etcam_as_mode,//128:3 64:2 + &etcam_entry_xy, + (ZXIC_UINT8 *)as_eram_data); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_etcam_entry_get"); + + if (dpp_etcam_entry_cmp(&etcam_entry_dm, &etcam_entry_xy) == 0) + { + ZXIC_COMM_PRINT("Acl table[ %d ] search in hardware success: handle[ 0x%x ], block[ %d ], ram_addr[ %d ], rd_mode[ %x ].\n", + p_tbl_cfg->table_id, p_dump_acl_entry->handle, block_idx, ram_addr, etcam_wr_mode); + } + else + { + ZXIC_COMM_PRINT("Acl table[ %d ] search in hardware fail: handle[ 0x%x ], block[ %d ], ram_addr[ %d ], rd_mode[ %x ].\n", + p_tbl_cfg->table_id, p_dump_acl_entry->handle, block_idx, ram_addr, etcam_wr_mode); + + return DPP_ERR; + } + + if(as_enable) + { + rc = dtb_eram_index_cal(dev, etcam_as_mode, p_dump_acl_entry->handle, &row_index, &col_index); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dtb_eram_index_cal"); + switch (etcam_as_mode) + { + case ERAM128_TBL_128b: + { + ZXIC_COMM_MEMCPY(p_dump_acl_entry->p_as_rslt, as_eram_data, (128 / 8)); + break; + } + + case ERAM128_TBL_64b: + { + ZXIC_COMM_MEMCPY(p_dump_acl_entry->p_as_rslt, as_eram_data + ((1 - col_index) << 1), (64 / 8)); + break; + } + + case ERAM128_TBL_1b: + { + ZXIC_COMM_UINT32_GET_BITS(*(ZXIC_UINT32 *)p_dump_acl_entry->p_as_rslt, *(as_eram_data + (3 - col_index / 32)), (col_index % 32), 1); + break; + } + } + } + + return rc; +} + +/** dtb etcam 数据get接口,通过handle值获取etcam数据 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no eram表sdt表号 +* @param p_dump_acl_entry etcam 数据结构,数据已分配相应内存 +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_etcam_data_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + DPP_DTB_ACL_ENTRY_INFO_T *p_dump_acl_entry) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 block_idx = 0; + ZXIC_UINT32 ram_addr = 0; + ZXIC_UINT32 etcam_wr_mode = 0; + + ZXIC_UINT32 etcam_key_mode = 0; + ZXIC_UINT32 etcam_table_id = 0; + ZXIC_UINT32 as_enable = 0; + ZXIC_UINT32 as_eram_baddr = 0; + ZXIC_UINT32 etcam_as_mode = 0; + + ZXIC_UINT32 row_index = 0; + ZXIC_UINT32 col_index = 0; + + DPP_ETCAM_ENTRY_T etcam_entry_dm = {0}; + ZXIC_UINT32 as_eram_data[4] = {0}; + + ZXIC_UINT8 temp_data[DPP_ETCAM_WIDTH_MAX / 8] = {0}; + ZXIC_UINT8 temp_mask[DPP_ETCAM_WIDTH_MAX / 8] = {0}; + + DPP_ACL_CFG_EX_T *p_acl_cfg = NULL; + DPP_ACL_TBL_CFG_T *p_tbl_cfg = NULL; + + DPP_SDTTBL_ETCAM_T sdt_etcam_info = {0}; /*SDT内容*/ + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_dump_acl_entry); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_dump_acl_entry->key_data); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_dump_acl_entry->key_mask); + + //从sdt_no中获取SDT配置 + rc = dpp_soft_sdt_tbl_get(DEV_ID(dev), sdt_no, &sdt_etcam_info); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_soft_sdt_tbl_get"); + etcam_key_mode = sdt_etcam_info.etcam_key_mode; + etcam_as_mode = sdt_etcam_info.as_rsp_mode; + etcam_table_id = sdt_etcam_info.etcam_table_id; + as_enable = sdt_etcam_info.as_en; + as_eram_baddr = sdt_etcam_info.as_eram_baddr; + + if(as_enable) + { + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_dump_acl_entry->p_as_rslt); + } + + etcam_entry_dm.mode = etcam_key_mode; + etcam_entry_dm.p_data = temp_data; + etcam_entry_dm.p_mask = temp_mask; + + dpp_acl_cfg_get(&p_acl_cfg);//获取ACL表资源配置 + ZXIC_COMM_CHECK_POINT(p_acl_cfg); + + p_tbl_cfg = p_acl_cfg->acl_tbls + etcam_table_id;//得到该acl表的资源配置 + + if (!p_tbl_cfg->is_used) + { + ZXIC_COMM_TRACE_ERROR("table[ %d ] is not init!\n", etcam_table_id); + ZXIC_COMM_ASSERT(0); + return DPP_ACL_RC_TBL_NOT_INIT; + } + + /*计算地址等信息*/ + rc = dpp_acl_hdw_addr_get(p_tbl_cfg, p_dump_acl_entry->handle, &block_idx, &ram_addr, &etcam_wr_mode); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_acl_hdw_addr_get"); + + rc = dpp_dtb_etcam_entry_get(dev, + queue_id, + block_idx, + ram_addr, + etcam_wr_mode, + DPP_ETCAM_OPR_DM, + as_enable, + as_eram_baddr, + p_dump_acl_entry->handle, + etcam_as_mode,//128:3 64:2 + &etcam_entry_dm, + (ZXIC_UINT8 *)as_eram_data); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_etcam_entry_get"); + + ZXIC_COMM_MEMCPY(p_dump_acl_entry->key_data, etcam_entry_dm.p_data, DPP_ETCAM_ENTRY_SIZE_GET(etcam_key_mode)); + ZXIC_COMM_MEMCPY(p_dump_acl_entry->key_mask, etcam_entry_dm.p_mask, DPP_ETCAM_ENTRY_SIZE_GET(etcam_key_mode)); + + if(as_enable) + { + rc = dtb_eram_index_cal(dev, etcam_as_mode, p_dump_acl_entry->handle, &row_index, &col_index); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dtb_eram_index_cal"); + switch (etcam_as_mode) + { + case ERAM128_TBL_128b: + { + ZXIC_COMM_MEMCPY(p_dump_acl_entry->p_as_rslt, as_eram_data, (128 / 8)); + break; + } + + case ERAM128_TBL_64b: + { + ZXIC_COMM_MEMCPY(p_dump_acl_entry->p_as_rslt, as_eram_data + ((1 - col_index) << 1), (64 / 8)); + break; + } + + case ERAM128_TBL_1b: + { + ZXIC_COMM_UINT32_GET_BITS(*(ZXIC_UINT32 *)p_dump_acl_entry->p_as_rslt, *(as_eram_data + (3 - col_index / 32)), (col_index % 32), 1); + break; + } + } + } + + return rc; +} + + +#endif /**DTB GET INTERFACE*/ + +#if ZXIC_REAL("DTB FLUSH INTERFACE") + +/***********************************************************/ +/** DTB dd 整个流表清空Flush +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param ddr_base_addr ddr基地址,以4K*128bit为单位 +* @param ddr_wr_mode ddr写模式 0-128bit, 1-256bit, 2-384bit, 3-512bit,取值参考SMMU1_DDR_WRT_MODE_E的定义 +* @param ddr_ecc_en ddr ECC使能 +* @param start_index flush开始的条目 +* @param entry_num 下发的条目数 +* @param element_id 返回下表使用的元素id +* @return +* @remark 无 +* @see +* @author cbb @date 2023/07/03 +************************************************************/ +DPP_STATUS dpp_dtb_smmu1_flush_cycle(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 ddr_base_addr, + ZXIC_UINT32 ddr_wr_mode, + ZXIC_UINT32 ddr_ecc_en, + ZXIC_UINT32 start_index, + ZXIC_UINT32 entry_num, + ZXIC_UINT32 *element_id) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 index = 0; + ZXIC_UINT32 current_index = 0; + ZXIC_UINT32 ddr_entry_len = 0; + ZXIC_UINT32 *data_buff = NULL; + DPP_DTB_DDR_ENTRY_INFO_T *p_entry_arr = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + + ddr_entry_len = 4 * (ddr_wr_mode + 1);//计算数据长度 + + p_entry_arr = (DPP_DTB_DDR_ENTRY_INFO_T *)ZXIC_COMM_MALLOC(entry_num * sizeof(DPP_DTB_DDR_ENTRY_INFO_T)); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_entry_arr); + + data_buff = (ZXIC_UINT32 *)ZXIC_COMM_MALLOC(ddr_entry_len * sizeof(ZXIC_UINT32)); + ZXIC_COMM_CHECK_DEV_POINT_MEMORY_FREE_NO_ASSERT(DEV_ID(dev), data_buff, p_entry_arr); + + ZXIC_COMM_MEMSET(data_buff, 0, ddr_entry_len * sizeof(ZXIC_UINT32)); + + // 下表数据准备 + for(index = 0; index < entry_num; index++) + { + current_index = start_index + index; + + p_entry_arr[index].index = current_index; + p_entry_arr[index].p_data = data_buff; + } + + rc = dpp_dtb_smmu1_data_write_cycle(dev, + queue_id, + ddr_base_addr, + ddr_wr_mode, + ddr_ecc_en, + entry_num, + p_entry_arr, + element_id); + ZXIC_COMM_FREE(data_buff); + ZXIC_COMM_FREE(p_entry_arr); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_smmu1_data_write_cycle"); + + return rc; +} + +/***********************************************************/ +/** DTB dd 整个流表清空Flush +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param ddr_base_addr ddr基地址,以4K*128bit为单位 +* @param ddr_wr_mode ddr写模式 0-128bit, 1-256bit, 2-384bit, 3-512bit,取值参考SMMU1_DDR_WRT_MODE_E的定义 +* @param ddr_ecc_en ddr ECC使能 +* @param start_index flush开始的条目 +* @param entry_num 下发的条目数 +* @param element_id 返回下表使用的元素id +* @return +* @remark 无 +* @see +* @author cbb @date 2023/07/03 +************************************************************/ +DPP_STATUS dpp_dtb_smmu1_flush(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 ddr_base_addr, + ZXIC_UINT32 ddr_wr_mode, + ZXIC_UINT32 ddr_ecc_en, + ZXIC_UINT32 entry_num, + ZXIC_UINT32 *element_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 entry_num_max = 0; + ZXIC_UINT32 entry_cycle = 0; + ZXIC_UINT32 entry_remains = 0; + ZXIC_UINT32 start_index = 0; + ZXIC_UINT32 i = 0; + + ZXIC_COMM_CHECK_POINT(dev); + + ZXIC_COMM_TRACE_INFO("%s--[%d]:ddr_base_addr is %d.\n", __FUNCTION__,__LINE__,ddr_base_addr); + ZXIC_COMM_TRACE_INFO("%s--[%d]:ddr_wr_mode is %d.\n", __FUNCTION__,__LINE__,ddr_wr_mode); + ZXIC_COMM_TRACE_INFO("%s--[%d]:entry_num is %d.\n", __FUNCTION__,__LINE__,entry_num); + + switch (ddr_wr_mode) + { + case SMMU1_DDR_WRT_128b://128bit + { + entry_num_max = 0x1ff; + break; + } + + case SMMU1_DDR_WRT_256b://256bit + { + entry_num_max = 0x155; + break; + } + + case SMMU1_DDR_WRT_384b://384bit + { + entry_num_max = 0xcc; + break; + } + + case SMMU1_DDR_WRT_512b://512bit + { + entry_num_max = 0xcc; + break; + } + } + + ZXIC_COMM_CHECK_INDEX_EQUAL(entry_num_max, 0); + entry_cycle = entry_num / entry_num_max; + entry_remains = entry_num % entry_num_max; + + for(i = 0; i < entry_cycle; ++i) + { + start_index = entry_num_max * i; + + rc = dpp_dtb_smmu1_flush_cycle(dev, + queue_id, + ddr_base_addr, + ddr_wr_mode, + ddr_ecc_en, + start_index, + entry_num_max, + element_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_smmu1_flush_cycle"); + + ZXIC_COMM_TRACE_INFO("dpp_dtb_smmu1_flush_cycle[%d] element_id = %d\n",i,*element_id); + } + + if(entry_remains) + { + start_index = entry_num_max * entry_cycle; + rc = dpp_dtb_smmu1_flush_cycle(dev, + queue_id, + ddr_base_addr, + ddr_wr_mode, + ddr_ecc_en, + start_index, + entry_remains, + element_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_smmu1_flush_cycle"); + + ZXIC_COMM_TRACE_INFO("dpp_dtb_smmu1_flush_cycle: element_id = %d\n",*element_id); + } + + return DPP_OK; +} + + +/***********************************************************/ +/** flush指定ZCELL指定范围空间 +* @param dev_id 设备id +* @param queue_id 队列id +* @param zcell_id zcell id 0~127 +* @param start_index 起始索引 0~511 +* @param num 条目数 +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/02 +************************************************************/ +DPP_STATUS dpp_dtb_hash_zcell_range_clr(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 zcell_id, + ZXIC_UINT32 start_index, + ZXIC_UINT32 num) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 zcdep = 0; + ZXIC_UINT32 addr = 0; + ZXIC_UINT32 addr_offset = 0; + ZXIC_UINT32 dtb_len = 0; + ZXIC_UINT32 data[512 / 32] = {0}; + DPP_DTB_ENTRY_T entry = {0}; + ZXIC_UINT32 entry_data_buff[512 / 32] = {0}; + ZXIC_UINT8 entry_cmd_buff[DTB_TABLE_CMD_SIZE_BYTE] = {0}; + ZXIC_UINT8 *p_data_buff = NULL; + ZXIC_UINT32 element_id = 0; + ZXIC_UINT32 end_index = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev), DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), zcell_id, 0, SE_ZCELL_TOTAL_NUM - 1); + ZXIC_COMM_CHECK_INDEX_UPPER(start_index,SE_RAM_DEPTH - 1); + + entry.cmd = entry_cmd_buff; + entry.data = (ZXIC_UINT8 *)entry_data_buff; + ZXIC_COMM_MEMSET(entry_cmd_buff, 0, sizeof(entry_cmd_buff)); + ZXIC_COMM_MEMSET(entry_data_buff, 0, sizeof(entry_data_buff)); + ZXIC_COMM_MEMSET(data, 0, sizeof(data)); + + p_data_buff = (ZXIC_UINT8 *) ZXIC_COMM_MALLOC(DPP_DTB_TABLE_DATA_BUFF_SIZE * sizeof(ZXIC_UINT8)); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data_buff); + ZXIC_COMM_MEMSET(p_data_buff, 0, DPP_DTB_TABLE_DATA_BUFF_SIZE * sizeof(ZXIC_UINT8)); + + end_index = start_index+num; + end_index = (end_index>SE_RAM_DEPTH) ? SE_RAM_DEPTH:end_index; + + for(zcdep=start_index;zcdepdev_id; + p_func_info = DPP_GET_FUN_INFO(p_se_cfg, fun_id); + DPP_SE_CHECK_FUN(p_func_info, fun_id, FUN_HASH); + p_hash_cfg = (DPP_HASH_CFG *)p_func_info->fun_ptr; + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev),p_hash_cfg); + p_zblk_dn = p_hash_cfg->hash_shareram.zblk_list.p_next; + + while (p_zblk_dn) + { + p_zblk = (SE_ZBLK_CFG *)p_zblk_dn->data; + zblock_id = p_zblk->zblk_idx; + + for (i = 0; i < SE_ZCELL_NUM; i++) + { + p_zcell = &(p_zblk->zcell_info[i]); + if ((p_zcell->flag & DPP_ZCELL_FLAG_IS_MONO) && (p_zcell->bulk_id == bulk_id)) + { + rc = dpp_dtb_hash_zcell_clr(dev, queue_id, p_zcell->zcell_idx); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_hash_zcell_clr"); + ZXIC_COMM_TRACE_DEV_INFO(DEV_ID(dev), "the Zblock[%d]'s Mono Zcell_id :%d \n", zblock_id, p_zcell->zcell_idx); + } + } + + for (i = 0; i < SE_ZREG_NUM; i++) + { + p_zreg = &(p_zblk->zreg_info[i]); + if ((p_zreg->flag & DPP_ZREG_FLAG_IS_MONO) && (p_zreg->bulk_id == bulk_id)) + { + rc = dpp_dtb_hash_zreg_clr(dev, queue_id, zblock_id, i); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "npe_hash_zreg_clr"); + ZXIC_COMM_TRACE_DEV_INFO(DEV_ID(dev), "the Zblock[%d]'s Mono Zreg_id :%d \n", zblock_id, i); + } + } + + p_zblk_dn = p_zblk_dn->next; + } + + return DPP_OK; +} + +/***********************************************************/ +/** flush当前hash引擎占用的ZCAM空间 +* @param p_se_cfg 全局数据结构 +* @param queue_id 队列id +* @param fun_id hash引擎0~3 +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/02 +************************************************************/ +DPP_STATUS dpp_dtb_zcam_space_clr(DPP_DEV_T *dev, + DPP_SE_CFG *p_se_cfg, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 fun_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 index = 0; + ZXIC_UINT32 zblock_id = 0; + + D_NODE *p_zblk_dn = NULL; + SE_ZBLK_CFG *p_zblk = NULL; + SE_ZCELL_CFG *p_zcell = NULL; + DPP_HASH_CFG *p_hash_cfg = NULL; + FUNC_ID_INFO *p_func_info = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev),p_se_cfg); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), fun_id, 0, HASH_FUNC_ID_NUM - 1); + ZXIC_COMM_CHECK_INDEX(queue_id, 0, DTB_QUEUE_MAX - 1); + + // dev_id = p_se_cfg->dev_id; + p_func_info = DPP_GET_FUN_INFO(p_se_cfg, fun_id); + DPP_SE_CHECK_FUN(p_func_info, fun_id, FUN_HASH); + p_hash_cfg = (DPP_HASH_CFG *)p_func_info->fun_ptr; + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev),p_hash_cfg); + p_zblk_dn = p_hash_cfg->hash_shareram.zblk_list.p_next; + + while (p_zblk_dn) + { + p_zblk = (SE_ZBLK_CFG *)p_zblk_dn->data; + zblock_id = p_zblk->zblk_idx; + for (index = 0; index < SE_ZCELL_NUM; index++) + { + p_zcell = &(p_zblk->zcell_info[index]); + rc = dpp_dtb_hash_zcell_clr(dev, queue_id, p_zcell->zcell_idx); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_hash_zcell_clr"); + } + + for (index = 0; index < SE_ZREG_NUM; index++) + { + rc = dpp_dtb_hash_zreg_clr(dev, queue_id, zblock_id, index); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_hash_zreg_clr"); + } + p_zblk_dn = p_zblk_dn->next; + } + + return DPP_OK; +} + + +/***********************************************************/ +/** 清除指定空间的hash表项(清除软件配置) +* @param p_se_cfg +* @param hash_id +* @param bulk_id +* +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/18 +************************************************************/ +DPP_STATUS dpp_hash_specify_entry_delete(DPP_SE_CFG *p_se_cfg,ZXIC_UINT32 hash_id, ZXIC_UINT32 bulk_id) +{ + ZXIC_UINT32 rc = 0; + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT8 key_valid = 0; + ZXIC_UINT32 table_id = 0; + ZXIC_UINT32 temp_bulk_id = 0; + + D_NODE *p_node = NULL; + ZXIC_RB_TN *p_rb_tn = NULL; + D_HEAD *p_head_hash_rb = NULL; + DPP_HASH_CFG *p_hash_cfg = NULL; + FUNC_ID_INFO *p_func_info = NULL; + DPP_HASH_RBKEY_INFO *p_rbkey = NULL; + DPP_HASH_RBKEY_INFO *p_rbkey_rtn = NULL; + ZXIC_RB_TN *p_rb_tn_rtn = NULL; + SE_ITEM_CFG *p_item = NULL; + + ZXIC_COMM_CHECK_POINT(p_se_cfg); + ZXIC_COMM_CHECK_INDEX(hash_id, 0, HASH_FUNC_ID_NUM - 1); + ZXIC_COMM_CHECK_INDEX(bulk_id, 0, HASH_BULK_NUM - 1); + + dev_id = p_se_cfg->dev_id; + p_func_info = DPP_GET_FUN_INFO(p_se_cfg, hash_id); + DPP_SE_CHECK_FUN(p_func_info, hash_id, FUN_HASH); + + p_hash_cfg = (DPP_HASH_CFG *)p_func_info->fun_ptr; + p_head_hash_rb = &p_hash_cfg->hash_rb.tn_list; + + p_node = p_head_hash_rb->p_next; + while(p_node) + { + p_rb_tn = (ZXIC_RB_TN *)p_node->data; + p_rbkey = (DPP_HASH_RBKEY_INFO *)p_rb_tn->p_key; + key_valid = DPP_GET_HASH_KEY_VALID(p_rbkey->key); + table_id = DPP_GET_HASH_TBL_ID(p_rbkey->key); + temp_bulk_id = ((table_id >> 2) & 0x7); + if((!key_valid) || (temp_bulk_id != bulk_id)) + { + p_node = p_node->next; + continue; + } + + p_node = p_node->next; /*zxic_comm_rb_delete删除操作之前执行*/ + rc = zxic_comm_rb_delete(&p_hash_cfg->hash_rb, p_rbkey, &p_rb_tn_rtn); + if (ZXIC_RBT_RC_SRHFAIL == rc) + { + p_hash_cfg->hash_stat.delete_fail++; + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "Error!there is not item in hash!\n"); + return DPP_HASH_RC_DEL_SRHFAIL; + } + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_rb_tn_rtn); + p_rbkey_rtn = (DPP_HASH_RBKEY_INFO *)(p_rb_tn_rtn->p_key); + p_item = p_rbkey_rtn->p_item_info; + + rc = zxic_comm_double_link_del(&(p_rbkey_rtn->entry_dn), &(p_item->item_list)); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "zxic_comm_double_link_del"); + p_item->wrt_mask &= ~(DPP_GET_HASH_ENTRY_MASK(p_rbkey_rtn->entry_size, p_rbkey_rtn->entry_pos)) & 0xF; + + if (0 == p_item->item_list.used) + { + if ((ITEM_DDR_256 == p_item->item_type) || (ITEM_DDR_512 == p_item->item_type)) + { + /* modify coverity by yinxh 2021.03.10*,以256bit为单位。暂不考虑512bit的情况*/ + ZXIC_COMM_CHECK_INDEX_UPPER(p_item->item_index, p_hash_cfg->p_bulk_ddr_info[bulk_id]->item_num); + p_hash_cfg->p_bulk_ddr_info[bulk_id]->p_item_array[p_item->item_index] = NULL; + ZXIC_COMM_FREE(p_item); + } + else + { + p_item->valid = 0; + } + } + + ZXIC_COMM_FREE(p_rbkey_rtn); + ZXIC_COMM_FREE(p_rb_tn_rtn); + p_hash_cfg->hash_stat.delete_ok++; + } + + return DPP_OK; +} + +/***********************************************************/ +/** flush指定eram空间 +* @param dev_id 设备id +* @param queue_id 队列id +* @param sdt_no sdt号 +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/02 +************************************************************/ +DPP_STATUS dpp_dtb_eram_table_flush(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 eram_depth = 0; + ZXIC_UINT32 element_id = 0; + ZXIC_UINT32 index = 0; + ZXIC_UINT8 *pBuff = NULL; + DPP_DTB_ERAM_ENTRY_INFO_T *p_entry_arr = NULL; + DPP_DTB_ERAM_ENTRY_INFO_T *p_temp_entry_arr = NULL; + DPP_SDTTBL_ERAM_T sdt_eram = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX(queue_id, 0, DTB_QUEUE_MAX - 1); + ZXIC_COMM_CHECK_INDEX(sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + + rc = dpp_soft_sdt_tbl_get(DEV_ID(dev),sdt_no,&sdt_eram); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_soft_sdt_tbl_get"); + + eram_depth = sdt_eram.eram_table_depth; + p_entry_arr = (DPP_DTB_ERAM_ENTRY_INFO_T *)ZXIC_COMM_MALLOC(eram_depth*sizeof(DPP_DTB_ERAM_ENTRY_INFO_T)); + ZXIC_COMM_CHECK_POINT(p_entry_arr); + pBuff = (ZXIC_UINT8 *)ZXIC_COMM_MALLOC(eram_depth*4*sizeof(ZXIC_UINT32)); + ZXIC_COMM_CHECK_POINT_MEMORY_FREE(pBuff,p_entry_arr); + ZXIC_COMM_MEMSET((ZXIC_UINT8 *)p_entry_arr,0x0,eram_depth*sizeof(DPP_DTB_ERAM_ENTRY_INFO_T)); + ZXIC_COMM_MEMSET(pBuff,0x0,eram_depth*4*sizeof(ZXIC_UINT32)); + for(index=0;indexindex = index; + p_temp_entry_arr->p_data = (ZXIC_UINT32 *)(pBuff + (index * 4 * sizeof(ZXIC_UINT32))); + } + + rc = dpp_dtb_eram_dma_write(dev, + queue_id, + sdt_no, + eram_depth, + p_entry_arr, + &element_id); + ZXIC_COMM_CHECK_RC_MEMORY_FREE2PTR_NO_ASSERT(rc, "dpp_dtb_eram_dma_write",pBuff,p_entry_arr); + + ZXIC_COMM_FREE(pBuff); + ZXIC_COMM_FREE(p_entry_arr); + return DPP_OK; +} + +/***********************************************************/ +/** flush指定hash空间(DDR/ZCAM) +* @param dev_id 设备id +* @param queue_id 队列id +* @param sdt_no sdt号 +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/02 +************************************************************/ +DPP_STATUS dpp_dtb_hash_table_flush(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT8 bulk_id = 0; + ZXIC_UINT8 table_id = 0; + ZXIC_UINT32 ddr_baddr = 0; + ZXIC_UINT32 ddr_item_num = 0; + ZXIC_UINT32 ddr_tbl_wr_mode = 0; + ZXIC_UINT32 element_id = 0; + + DPP_SE_CFG *p_se_cfg = NULL; + FUNC_ID_INFO *p_func_info = NULL; + DPP_HASH_CFG *p_hash_cfg = NULL; + HASH_DDR_CFG *p_ddr_cfg = NULL; + DPP_SDTTBL_HASH_T sdt_hash = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX(queue_id, 0, DTB_QUEUE_MAX - 1); + ZXIC_COMM_CHECK_INDEX(sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + + rc = dpp_soft_sdt_tbl_get(DEV_ID(dev),sdt_no,&sdt_hash); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_soft_sdt_tbl_get"); + + /* 取出se配置 */ + rc = dpp_se_cfg_get(DEV_ID(dev), &p_se_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_se_cfg_get"); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_se_cfg); + p_func_info = DPP_GET_FUN_INFO(p_se_cfg, sdt_hash.hash_id); + DPP_SE_CHECK_FUN(p_func_info, sdt_hash.hash_id, FUN_HASH); + + p_hash_cfg = (DPP_HASH_CFG *)p_func_info->fun_ptr; + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_hash_cfg); + table_id = sdt_hash.hash_table_id; + bulk_id = ((table_id >> 2) & 0x7); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), bulk_id, 0, HASH_BULK_NUM - 1); + + /*独占模式下才执行flush操作*/ + if(!p_hash_cfg->bulk_ram_mono[bulk_id]) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "fush error:hash[%u] bulk[%u] is not monopolize!\n", sdt_hash.hash_id, bulk_id); + return DPP_HASH_RC_INVALID_PARA; + } + + /*混合模式,先清除DDR空间*/ + if(p_hash_cfg->ddr_valid) + { + p_ddr_cfg = p_hash_cfg->p_bulk_ddr_info[bulk_id]; + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_ddr_cfg); + ddr_baddr = p_ddr_cfg->ddr_baddr; + ddr_item_num = p_ddr_cfg->item_num;/*ddr存储单元数目,以DDR位宽为单位*/ + ddr_tbl_wr_mode = SMMU1_DDR_WRT_256b; + if(DDR_WIDTH_512b == p_ddr_cfg->width_mode) + { + ddr_tbl_wr_mode = SMMU1_DDR_WRT_512b; + } + + ZXIC_COMM_TRACE_INFO("%s--[%d]:ddr_baddr is %d.\n", __FUNCTION__,__LINE__,ddr_baddr); + ZXIC_COMM_TRACE_INFO("%s--[%d]:ddr_item_num is %d.\n", __FUNCTION__,__LINE__,ddr_item_num); + ZXIC_COMM_TRACE_INFO("%s--[%d]:ddr_tbl_wr_mode is %d.\n", __FUNCTION__,__LINE__,ddr_tbl_wr_mode); + + rc = dpp_dtb_smmu1_flush(dev, + queue_id, + ddr_baddr, + ddr_tbl_wr_mode, + p_ddr_cfg->ddr_ecc_en, + ddr_item_num, + &element_id); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_smmu1_flush"); + } + ZXIC_COMM_TRACE_INFO("dpp_dtb_hash_table_flush: DDR DONE!!!\n"); + + /*清除zcam空间*/ + rc = dpp_dtb_specify_zcam_space_clr(dev, p_se_cfg,queue_id,sdt_hash.hash_id,bulk_id); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_specify_zcam_space_clr"); + ZXIC_COMM_TRACE_INFO("dpp_dtb_specify_zcam_space_clr DONE!!!\n"); + + /*软件删除表项*/ + rc = dpp_hash_specify_entry_delete(p_se_cfg,sdt_hash.hash_id,bulk_id); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_hash_specify_entry_delete"); + ZXIC_COMM_TRACE_INFO("dpp_hash_specify_entry_delete DONE!!!\n"); + + return DPP_OK; +} + +/***********************************************************/ +/** 清除hash表资源(硬件和软件,硬件通过dtb方式清除) +* @param dev_id 设备id +* @param queue_id 队列id +* @param hash_id hash引擎 0~3 +* @return +* @remark 无 +* @see +* @author cq @date 2023/09/26 +************************************************************/ +DPP_STATUS dpp_dtb_hash_all_entry_delete(DPP_DEV_T *dev, ZXIC_UINT32 queue_id, ZXIC_UINT32 hash_id) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 bulk_id = 0; + ZXIC_UINT32 ddr_baddr = 0; + ZXIC_UINT32 ddr_item_num = 0; + ZXIC_UINT32 ddr_tbl_wr_mode = 0; + ZXIC_UINT32 element_id = 0; + + DPP_SE_CFG *p_se_cfg = NULL; + FUNC_ID_INFO *p_func_info = NULL; + DPP_HASH_CFG *p_hash_cfg = NULL; + HASH_DDR_CFG *p_ddr_cfg = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX(queue_id, 0, DTB_QUEUE_MAX - 1); + ZXIC_COMM_CHECK_INDEX(hash_id, 0, HASH_FUNC_ID_NUM - 1); + + /* 取出se配置 */ + rc = dpp_se_cfg_get(DEV_ID(dev), &p_se_cfg); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_se_cfg_get"); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_se_cfg); + p_func_info = DPP_GET_FUN_INFO(p_se_cfg, hash_id); + DPP_SE_CHECK_FUN(p_func_info, hash_id, FUN_HASH); + + p_hash_cfg = (DPP_HASH_CFG *)p_func_info->fun_ptr; + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_hash_cfg); + + /*混合模式,先清除DDR空间*/ + if(p_hash_cfg->ddr_valid) + { + for(bulk_id = 0; bulk_id < HASH_BULK_NUM; bulk_id++) + { + p_ddr_cfg = p_hash_cfg->p_bulk_ddr_info[bulk_id]; + if(NULL==p_ddr_cfg) + { + continue; + } + ddr_baddr = p_ddr_cfg->ddr_baddr; + ddr_item_num = p_ddr_cfg->item_num;/*ddr存储单元数目,以DDR位宽为单位*/ + ddr_tbl_wr_mode = SMMU1_DDR_WRT_256b; + if(DDR_WIDTH_512b == p_ddr_cfg->width_mode) + { + ddr_tbl_wr_mode = SMMU1_DDR_WRT_512b; + } + + ZXIC_COMM_TRACE_INFO("%s--[%d]:ddr_baddr is %d.\n", __FUNCTION__,__LINE__,ddr_baddr); + ZXIC_COMM_TRACE_INFO("%s--[%d]:ddr_item_num is %d.\n", __FUNCTION__,__LINE__,ddr_item_num); + ZXIC_COMM_TRACE_INFO("%s--[%d]:ddr_tbl_wr_mode is %d.\n", __FUNCTION__,__LINE__,ddr_tbl_wr_mode); + + rc = dpp_dtb_smmu1_flush(dev, + queue_id, + ddr_baddr, + ddr_tbl_wr_mode, + p_ddr_cfg->ddr_ecc_en, + ddr_item_num, + &element_id); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_smmu1_flush"); + } + } + + /*清除hash引擎占用的整个zcam空间*/ + rc = dpp_dtb_zcam_space_clr(dev, p_se_cfg, queue_id, hash_id); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_specify_zcam_space_clr"); + ZXIC_COMM_PRINT("dpp_dtb_zcam_space_clr hash id: %d DONE!!!\n", hash_id); + + /*软件删除表项*/ + rc = dpp_hash_soft_all_entry_delete(p_se_cfg, hash_id); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_hash_soft_all_entry_delete"); + ZXIC_COMM_PRINT("dpp_hash_soft_all_entry_delete hash id %d DONE!!!\n", hash_id); + + return DPP_OK; +} + +/***********************************************************/ +/** DTB etcam 整个流表清空Flush +* @param devId NP设备号 +* @param queueId DTB队列编号 +* @param sdtNo 流表std号 +* @return +* @remark 无 +* @see +* @author cbb @date 2023/07/03 +************************************************************/ +DPP_STATUS dpp_dtb_etcam_table_flush(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no) +{ + // 按照std 号的深度进行etcam的内容的清理; + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 data_byte_size = 0; + ZXIC_UINT32 index = 0; + ZXIC_UINT32 etcam_key_mode = 0; + ZXIC_UINT32 as_enable = 0; + ZXIC_UINT32 etcam_table_depth = 0; + ZXIC_UINT32 element_id = 0; + + DPP_SDTTBL_ETCAM_T sdt_etcam_info = {0}; /*SDT内容*/ + + ZXIC_UINT8 *data_buff = NULL; + ZXIC_UINT8 *mask_buff = NULL; + ZXIC_UINT32 *eram_buff = NULL; + DPP_DTB_ACL_ENTRY_INFO_T *p_entry_arr = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + + rc = dpp_soft_sdt_tbl_get(DEV_ID(dev), sdt_no, &sdt_etcam_info); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_soft_sdt_tbl_get"); + + etcam_key_mode = sdt_etcam_info.etcam_key_mode; + as_enable = sdt_etcam_info.as_en; + etcam_table_depth = sdt_etcam_info.etcam_table_depth; + + data_byte_size = DPP_ETCAM_ENTRY_SIZE_GET(etcam_key_mode);//80/40 + + //组装数据 + p_entry_arr = (DPP_DTB_ACL_ENTRY_INFO_T *)ZXIC_COMM_MALLOC(etcam_table_depth * sizeof(DPP_DTB_ACL_ENTRY_INFO_T)); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_entry_arr); + ZXIC_COMM_MEMSET(p_entry_arr, 0, etcam_table_depth * sizeof(DPP_DTB_ACL_ENTRY_INFO_T)); + + data_buff = (ZXIC_UINT8 *)ZXIC_COMM_MALLOC(data_byte_size * sizeof(ZXIC_UINT8)); + ZXIC_COMM_CHECK_DEV_POINT_MEMORY_FREE_NO_ASSERT(DEV_ID(dev), data_buff, p_entry_arr); + ZXIC_COMM_MEMSET(data_buff, 0, data_byte_size * sizeof(ZXIC_UINT8)); + + mask_buff = (ZXIC_UINT8 *)ZXIC_COMM_MALLOC(data_byte_size * sizeof(ZXIC_UINT8)); + ZXIC_COMM_CHECK_DEV_POINT_MEMORY_FREE2PTR_NO_ASSERT(DEV_ID(dev), mask_buff, p_entry_arr, data_buff); + ZXIC_COMM_MEMSET(mask_buff, 0, data_byte_size * sizeof(ZXIC_UINT8)); + + if(as_enable) + { + eram_buff = (ZXIC_UINT32 *)ZXIC_COMM_MALLOC(4 * sizeof(ZXIC_UINT32)); + ZXIC_COMM_CHECK_DEV_POINT_MEMORY_FREE3PTR_NO_ASSERT(0, eram_buff, mask_buff, p_entry_arr, data_buff); + ZXIC_COMM_MEMSET(eram_buff, 0, 4 * sizeof(ZXIC_UINT32)); + } + + for(index = 0; index < etcam_table_depth; index++) + { + p_entry_arr[index].handle = index; + p_entry_arr[index].key_data = data_buff; + p_entry_arr[index].key_mask = mask_buff; + + if(as_enable) + { + p_entry_arr[index].p_as_rslt = (ZXIC_UINT8 *)eram_buff; + } + } + + rc = dpp_dtb_acl_dma_insert(dev, + queue_id, + sdt_no, + etcam_table_depth, + p_entry_arr, + &element_id); + ZXIC_COMM_FREE(data_buff); + ZXIC_COMM_FREE(mask_buff); + if(eram_buff) + { + ZXIC_COMM_FREE(eram_buff); + } + ZXIC_COMM_FREE(p_entry_arr); + ZXIC_COMM_CHECK_DEV_RC(0, rc, "dpp_dtb_acl_dma_insert"); + + return rc; +} + +#endif + +#if ZXIC_REAL("DTB DUMP INTERFACE") + +/***********************************************************/ +/** 根据队列号和sdt号分配元素id和dma地址 +* @param dev_id 设备id +* @param queue_id 队列id 0~127 +* @param sdt_no sdt号 0~255 +* @param element_id 出参,元素id +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/22 +************************************************************/ +DPP_STATUS dpp_dtb_dump_addr_set(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + ZXIC_UINT32 *element_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 dump_element_id = 0; + ZXIC_UINT64 phy_addr = 0; + ZXIC_UINT64 vir_addr = 0; + ZXIC_UINT32 size = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX(queue_id, 0, DTB_QUEUE_MAX - 1); + ZXIC_COMM_CHECK_INDEX(sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + + /*获取dump目的地址*/ + rc = dpp_dtb_dump_sdt_addr_get( dev, + queue_id, + sdt_no, + &phy_addr, + &vir_addr, + &size); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_dump_sdt_addr_get"); + ZXIC_COMM_MEMSET((ZXIC_UINT8 *)vir_addr, 0, size); + + /*获取队列可用元素*/ + rc = dpp_dtb_tab_up_free_item_get(dev, queue_id, &dump_element_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_tab_up_free_item_get"); + ZXIC_COMM_TRACE_DEV_INFO(DEV_ID(dev), "table up item queue_element_id is: %d.\n",dump_element_id); + + /*在相应队列的元素上配置用户dma地址信息*/ + rc = dpp_dtb_tab_up_item_user_addr_set(dev, + queue_id, + dump_element_id, + phy_addr, + vir_addr); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_tab_up_item_addr_set"); + + *element_id = dump_element_id; + + return DPP_OK; +} + +/***********************************************************/ +/** 将dump数据解析为hash条目格式 +* @param p_hash_entry_cfg hash配置参数 +* @param item_type 条目类型,见枚举SE_ITEM_TYPE +* @param pdata dump数据 +* @param dump_len dump有效长度 +* @param pOutData 出参,连续内存,hash条目信息DPP_HASH_ENTRY +* @param p_item_num 出参,解析出的hash有效条目数 +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/22 +************************************************************/ +DPP_STATUS dpp_dtb_dump_hash_parse(HASH_ENTRY_CFG *p_hash_entry_cfg, + ZXIC_UINT32 item_type, + ZXIC_UINT8 *pdata, + ZXIC_UINT32 dump_len, + ZXIC_UINT8 *pOutData, + ZXIC_UINT32 *p_item_num) +{ + ZXIC_UINT32 item_num = 0; + ZXIC_UINT32 data_offset = 0; + ZXIC_UINT32 index = 0; + ZXIC_UINT8 temp_key_valid = 0; + ZXIC_UINT8 temp_key_type = 0; + ZXIC_UINT8 temp_tbl_id = 0; + ZXIC_UINT32 srh_entry_size = 0; + ZXIC_UINT32 item_width = SE_ITEM_WIDTH_MAX; + ZXIC_UINT8 *p_temp_key = NULL; + ZXIC_UINT8 *p_hash_item = NULL; + DPP_HASH_ENTRY *p_dtb_hash_entry = NULL; + DPP_HASH_ENTRY *p_temp_entry = NULL; + + ZXIC_COMM_CHECK_POINT(p_hash_entry_cfg); + ZXIC_COMM_CHECK_POINT(pdata); + ZXIC_COMM_CHECK_POINT(pOutData); + ZXIC_COMM_CHECK_POINT(p_item_num); + + if (ITEM_DDR_256 == item_type) + { + item_width = item_width / 2; + } + + p_dtb_hash_entry = (DPP_HASH_ENTRY *)pOutData; + srh_entry_size = DPP_GET_HASH_ENTRY_SIZE(p_hash_entry_cfg->key_type); + + for(index = 0; index < (dump_len / item_width); index++) + { + data_offset = 0; + p_hash_item = pdata + index * item_width; + while(data_offset < item_width) + { + p_temp_key = p_hash_item + data_offset; + temp_key_valid = DPP_GET_HASH_KEY_VALID(p_temp_key); + temp_key_type = DPP_GET_HASH_KEY_TYPE(p_temp_key); + temp_tbl_id = DPP_GET_HASH_TBL_ID(p_temp_key); + p_temp_entry = p_dtb_hash_entry + item_num; + ZXIC_COMM_CHECK_POINT(p_temp_entry); + ZXIC_COMM_CHECK_POINT(p_temp_entry->p_key); + ZXIC_COMM_CHECK_POINT(p_temp_entry->p_rst); + if(temp_key_valid && (temp_key_type == p_hash_entry_cfg->key_type) + && (temp_tbl_id == p_hash_entry_cfg->table_id)) + { + ZXIC_COMM_MEMCPY(p_temp_entry->p_key, p_temp_key, p_hash_entry_cfg->key_by_size + 1); + ZXIC_COMM_MEMCPY(p_temp_entry->p_rst, p_temp_key + 1 + p_hash_entry_cfg->key_by_size, p_hash_entry_cfg->rst_by_size); + item_num++; + } + + data_offset += srh_entry_size; + } + } + + *p_item_num = item_num; + return DPP_OK; +} + +/** dtb dump eram整个表项内容 输入128bit单位index,输出128bit为单位的数据 +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no eram表sdt表号 +* @param start_index 要dump的起始index 单位是128bit +* @param depth dump的深度以128bit为单位 +* @param p_data dump出数据缓存(大小128bit * depth) +* @param element_id 返回下表使用的元素id +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ +DPP_STATUS dpp_dtb_sdt_eram_table_dump(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + ZXIC_UINT32 start_index, + ZXIC_UINT32 depth, + ZXIC_UINT32 *p_data, + ZXIC_UINT32 *element_id + ) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 eram_base_addr = 0; + ZXIC_UINT32 dump_addr_128bit = 0; + ZXIC_UINT32 dump_item_index = 0; + ZXIC_UINT32 dump_data_len = 0; + ZXIC_UINT32 dump_desc_len = 0; + + ZXIC_ADDR_T dump_sdt_phy_addr = 0; + ZXIC_ADDR_T dump_sdt_vir_addr = 0; + ZXIC_UINT32 dump_addr_size = 0; + + ZXIC_UINT32 dump_dst_phy_haddr = 0; + ZXIC_UINT32 dump_dst_phy_laddr = 0; + + ZXIC_UINT8 form_buff[DTB_TABLE_CMD_SIZE_BIT / 8] = {0}; + + /*获取sdt信息*/ + DPP_SDTTBL_ERAM_T sdt_eram = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), queue_id, 0, DTB_QUEUE_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), element_id); + + rc = dpp_soft_sdt_tbl_get(DEV_ID(dev), sdt_no, &sdt_eram); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_soft_sdt_tbl_get"); + + eram_base_addr = sdt_eram.eram_base_addr; + dump_addr_128bit = eram_base_addr + start_index; + + //获取dump目的地址 + rc = dpp_dtb_dump_sdt_addr_get( dev, + queue_id, + sdt_no, + &dump_sdt_phy_addr, + &dump_sdt_vir_addr, + &dump_addr_size); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_dump_sdt_addr_get"); + + ZXIC_COMM_MEMSET((ZXIC_UINT8 *)dump_sdt_vir_addr, 0, dump_addr_size); + + rc = dpp_dtb_tab_up_free_item_get(dev, queue_id, &dump_item_index); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_tab_up_free_item_get"); + ZXIC_COMM_TRACE_DEV_DEBUG(DEV_ID(dev), "dump queue id %d, element_id is: %d.\n",queue_id, dump_item_index); + + *element_id = dump_item_index;//保存获取的item_index + + ZXIC_COMM_TRACE_INFO("eram dump eram_base_addr %x\n",eram_base_addr); + ZXIC_COMM_TRACE_INFO("eram dump start_index %x\n",start_index); + ZXIC_COMM_TRACE_INFO("eram dump queue %d,item_index: %d\n",queue_id, dump_item_index); + + //在相应队列的元素上配置用户dma地址信息 + rc = dpp_dtb_tab_up_item_user_addr_set(dev, + queue_id, + dump_item_index, + dump_sdt_phy_addr, + dump_sdt_vir_addr); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_tab_up_item_addr_set"); + + /*获取地址*/ + rc = dpp_dtb_tab_up_item_addr_get(dev, queue_id, dump_item_index, &dump_dst_phy_haddr, &dump_dst_phy_laddr); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_tab_up_item_addr_get"); + + rc = dpp_dtb_smmu0_dump_info_write(dev, + dump_addr_128bit, + depth, + dump_dst_phy_haddr, + dump_dst_phy_laddr, + (ZXIC_UINT32 *)form_buff); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_smmu0_dump_info_write"); + + /*组装下表命令格式*/ + dump_data_len = depth * 128 / 32; + dump_desc_len = DTB_LEN_POS_SETP / 4; + + if(dump_data_len * 4 > dump_addr_size) + { + ZXIC_COMM_TRACE_ERROR("eram dump size is too small!\n"); + return DPP_RC_DTB_DUMP_SIZE_SMALL; + } + + rc = dpp_dtb_write_dump_desc_info(dev, queue_id, dump_item_index, (ZXIC_UINT32 *)form_buff, dump_data_len, dump_desc_len, p_data); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_write_dump_desc_info"); + + return DPP_OK; +} + +/** dtb dump eram直接表表项内容 支持64bit/128bit +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no eram表sdt表号 +* @param start_index 要dump的起始index,单位是sdt_no该表的mode +* @param p_dump_data_arr 本次dump出的数据,数据格式与下表格式相同 +* @param entry_num 本次dump实际的条目数 +* @param next_start_index 下次dump是开始的index +* @param finish_flag 整个表dump完成标志,1表示完成,0表示未完成 +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ + DPP_STATUS dpp_dtb_eram_table_dump(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + DPP_DTB_DUMP_INDEX_T start_index, + DPP_DTB_ERAM_ENTRY_INFO_T* p_dump_data_arr, + ZXIC_UINT32 *entry_num, + DPP_DTB_DUMP_INDEX_T *next_start_index, + ZXIC_UINT32 *finish_flag) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 i = 0; + ZXIC_UINT32 dump_mode = 0; + ZXIC_UINT32 eram_table_depth = 0; + ZXIC_UINT32 start_index_128bit = 0; + ZXIC_UINT32 row_index = 0; + ZXIC_UINT32 col_index = 0; + ZXIC_UINT32 dump_depth_128bit = 0; + ZXIC_UINT32 dump_depth = 0; + ZXIC_UINT32 element_id = 0; + ZXIC_UINT8* dump_data_buff = NULL; + ZXIC_UINT8* temp_data = NULL; + ZXIC_UINT32 remain = 0; + ZXIC_UINT32 *buff = NULL; + + DPP_DTB_ERAM_ENTRY_INFO_T* p_dump_user_data = NULL; + DPP_SDTTBL_ERAM_T sdt_eram = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + + rc = dpp_soft_sdt_tbl_get(DEV_ID(dev), sdt_no, &sdt_eram); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_soft_sdt_tbl_get"); + + dump_mode = sdt_eram.eram_mode;//0:1bit;2:64bit;3:128, + eram_table_depth = sdt_eram.eram_table_depth; + + rc = dtb_eram_index_cal(dev, dump_mode, eram_table_depth, &dump_depth_128bit, &col_index); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dtb_eram_index_cal"); + + rc = dtb_eram_index_cal(dev, dump_mode, start_index.index, &start_index_128bit, &col_index); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dtb_eram_index_cal"); + + dump_depth = dump_depth_128bit - start_index_128bit; + + dump_data_buff = (ZXIC_UINT8 *) ZXIC_COMM_MALLOC(dump_depth * DTB_LEN_POS_SETP); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), dump_data_buff); + ZXIC_COMM_MEMSET(dump_data_buff, 0, dump_depth * DTB_LEN_POS_SETP); + + rc = dpp_dtb_sdt_eram_table_dump(dev, + queue_id, + sdt_no, + start_index_128bit, + dump_depth, + (ZXIC_UINT32 *)dump_data_buff, + &element_id); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_sdt_eram_table_dump", dump_data_buff); + ZXIC_COMM_TRACE_INFO(" dpp_dtb_sdt_eram_table_dump done queue %d element %d.\n", queue_id, element_id); + + if (dump_mode == ERAM128_TBL_128b) + { + for(i = 0; i < dump_depth; i++) + { + p_dump_user_data = p_dump_data_arr + i; + temp_data = dump_data_buff + i * DTB_LEN_POS_SETP; + if ((p_dump_user_data == NULL) || (p_dump_user_data->p_data == NULL)) + { + ZXIC_COMM_TRACE_ERROR("eram index 0x%x data user buff is NULL!\n",start_index.index + i); + ZXIC_COMM_FREE(dump_data_buff); + return DPP_ERR; + } + + p_dump_user_data->index = start_index.index + i; + ZXIC_COMM_MEMCPY(p_dump_user_data->p_data, temp_data, (128 / 8)); + } + } + else if(dump_mode == ERAM128_TBL_64b) + { + remain = start_index.index % 2; + for(i = 0; i < eram_table_depth - start_index.index; i++) + { + rc = dtb_eram_index_cal(dev, dump_mode, remain, &row_index, &col_index); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dtb_eram_index_cal", dump_data_buff); + temp_data = dump_data_buff + row_index * DTB_LEN_POS_SETP; + + buff = (ZXIC_UINT32*)temp_data; + p_dump_user_data = p_dump_data_arr + i; + if (p_dump_user_data->p_data == NULL) + { + ZXIC_COMM_TRACE_ERROR("eram index 0x%x data point is NULL!\n",start_index.index + i); + ZXIC_COMM_FREE(dump_data_buff); + return DPP_ERR; + } + + p_dump_user_data->index = start_index.index + i; + ZXIC_COMM_MEMCPY(p_dump_user_data->p_data, buff + ((1 - col_index) << 1), (64 / 8)); + + remain ++; + } + } + + *entry_num = eram_table_depth - start_index.index; + *finish_flag = 1; + ZXIC_COMM_TRACE_INFO(" eram table dump entry num %d, finish flag %d\n\n", *entry_num, *finish_flag); + + ZXIC_COMM_FREE(dump_data_buff); + + return DPP_OK; +} + + +/***********************************************************/ +/** dump指定hash表占用的zcam数据 +* @param dev_id 设备id +* @param queue_id 队列id 0~127 +* @param sdt_no sdt号 0~255 +* @param fun_id 需dump的zblock个数 +* @param bulk_id zblock索引 +* @param p_data 出参,dump数据 +* @param p_dump_len 出参,dump长度 +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/22 +************************************************************/ +DPP_STATUS dpp_dtb_sdt_hash_zcam_mono_space_dump(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + ZXIC_UINT32 fun_id, + ZXIC_UINT32 bulk_id, + ZXIC_UINT8 *p_data, + ZXIC_UINT32 *p_dump_len) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 i = 0; + ZXIC_UINT32 zblock_id = 0; + ZXIC_UINT32 zcell_id = 0; + ZXIC_UINT32 start_addr = 0; + ZXIC_UINT32 dtb_desc_len = 0; + ZXIC_UINT32 dump_pa_h = 0; + ZXIC_UINT32 dump_pa_l = 0; + ZXIC_UINT32 dma_addr_offset = 0; + ZXIC_UINT32 desc_addr_offset = 0; + ZXIC_UINT32 element_id = 0; + ZXIC_UINT8 *p_dump_desc_buf = NULL; + + DPP_SE_CFG *p_se_cfg = NULL; + D_NODE *p_zblk_dn = NULL; + SE_ZBLK_CFG *p_zblk = NULL; + SE_ZREG_CFG *p_zreg = NULL; + SE_ZCELL_CFG *p_zcell = NULL; + DPP_HASH_CFG *p_hash_cfg = NULL; + FUNC_ID_INFO *p_func_info = NULL; + + DPP_DTB_ENTRY_T dtb_dump_entry = {0}; + ZXIC_UINT8 cmd_buff[DTB_TABLE_CMD_SIZE_BIT / 8] = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), fun_id, 0, HASH_FUNC_ID_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), bulk_id, 0, HASH_BULK_NUM - 1); + ZXIC_COMM_CHECK_INDEX(queue_id, 0, DTB_QUEUE_MAX - 1); + ZXIC_COMM_CHECK_POINT(p_data); + ZXIC_COMM_CHECK_POINT(p_dump_len); + + rc = dpp_dtb_dump_addr_set(dev, queue_id, sdt_no, &element_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_dump_addr_set"); + + p_dump_desc_buf = (ZXIC_UINT8 *) ZXIC_COMM_MALLOC(DPP_DTB_TABLE_DUMP_INFO_BUFF_SIZE * sizeof(ZXIC_UINT8)); + ZXIC_COMM_CHECK_POINT(p_dump_desc_buf); + ZXIC_COMM_MEMSET(p_dump_desc_buf, 0, DPP_DTB_TABLE_DUMP_INFO_BUFF_SIZE * sizeof(ZXIC_UINT8)); + + dtb_dump_entry.cmd = cmd_buff; + + rc = dpp_se_cfg_get(DEV_ID(dev), &p_se_cfg); + ZXIC_COMM_CHECK_DEV_RC_MEMORY_FREE_NO_ASSERT(DEV_ID(dev), rc, "dpp_se_cfg_get", p_dump_desc_buf); + ZXIC_COMM_CHECK_DEV_POINT_MEMORY_FREE_NO_ASSERT(DEV_ID(dev), p_se_cfg, p_dump_desc_buf); + + p_func_info = DPP_GET_FUN_INFO(p_se_cfg, fun_id); + DPP_SE_CHECK_FUN_MEMORY_FREE(p_func_info, fun_id, FUN_HASH, p_dump_desc_buf); + p_hash_cfg = (DPP_HASH_CFG *)p_func_info->fun_ptr; + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_hash_cfg); + p_zblk_dn = p_hash_cfg->hash_shareram.zblk_list.p_next; + + while (p_zblk_dn) + { + p_zblk = (SE_ZBLK_CFG *)p_zblk_dn->data; + zblock_id = p_zblk->zblk_idx; + + //mono zcell dump + for (i = 0; i < SE_ZCELL_NUM; i++) + { + p_zcell = &(p_zblk->zcell_info[i]); + + if ((p_zcell->flag & DPP_ZCELL_FLAG_IS_MONO) && (p_zcell->bulk_id == bulk_id)) + { + zcell_id = p_zcell->zcell_idx; + + start_addr = ZBLK_ITEM_ADDR_CALC(zcell_id, 0); + + /*获取dma上送指定条目的物理地址*/ + rc = dpp_dtb_tab_up_item_offset_addr_get(dev, + queue_id, + element_id, + dma_addr_offset, + &dump_pa_h, + &dump_pa_l); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_tab_up_item_offset_addr_get",p_dump_desc_buf); + + rc = dpp_dtb_zcam_dump_entry(dev, start_addr, DTB_DUMP_ZCAM_512b, SE_RAM_DEPTH, dump_pa_h, dump_pa_l, &dtb_dump_entry); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_zcam_dump_entry",p_dump_desc_buf); + + rc = dpp_dtb_data_write(p_dump_desc_buf, desc_addr_offset, &dtb_dump_entry); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_zcam_dump_entry",p_dump_desc_buf); + + dtb_desc_len++; + dma_addr_offset += SE_RAM_DEPTH * 512 / 8; + desc_addr_offset += DTB_LEN_POS_SETP; + + ZXIC_COMM_TRACE_DEV_INFO(DEV_ID(dev), "the Zblock[%d]'s bulk_id:%d Mono Zcell_id :%d \n", zblock_id, bulk_id, zcell_id); + } + } + + //mono zreg dump + for (i = 0; i < SE_ZREG_NUM; i++) + { + p_zreg = &(p_zblk->zreg_info[i]); + + if ((p_zreg->flag & DPP_ZREG_FLAG_IS_MONO) && (p_zreg->bulk_id == bulk_id)) + { + start_addr = ZBLK_HASH_LIST_REG_ADDR_CALC(zblock_id, i); + + rc = dpp_dtb_tab_up_item_offset_addr_get(dev, + queue_id, + element_id, + dma_addr_offset, + &dump_pa_h, + &dump_pa_l); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_tab_up_item_offset_addr_get",p_dump_desc_buf); + + rc = dpp_dtb_zcam_dump_entry(dev, start_addr, DTB_DUMP_ZCAM_512b, 1, dump_pa_h, dump_pa_l, &dtb_dump_entry); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_zcam_dump_entry",p_dump_desc_buf); + + rc = dpp_dtb_data_write(p_dump_desc_buf, desc_addr_offset, &dtb_dump_entry); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_zcam_dump_entry",p_dump_desc_buf); + + dtb_desc_len++; + dma_addr_offset += 512 / 8; + desc_addr_offset += DTB_LEN_POS_SETP; + + ZXIC_COMM_TRACE_DEV_INFO(DEV_ID(dev), "the Zblock[%d]'s bulk_id:%d Mono Zreg_id :%d \n", zblock_id, p_zreg->bulk_id, i); + } + } + + p_zblk_dn = p_zblk_dn->next; + } + + rc = dpp_dtb_write_dump_desc_info(dev, + queue_id, + element_id, + (ZXIC_UINT32 *)p_dump_desc_buf, + dma_addr_offset / 4, + dtb_desc_len * 4, + (ZXIC_UINT32 *)p_data); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc,"dpp_dtb_write_dump_desc_info",p_dump_desc_buf); + ZXIC_COMM_TRACE_INFO(" dpp_dtb_hash_table_zcam_dump done queue %d element %d.\n", queue_id, element_id); + + zxic_comm_swap(p_data, dma_addr_offset); + ZXIC_COMM_FREE(p_dump_desc_buf); + + *p_dump_len = dma_addr_offset; + + return DPP_OK; +} + +/***********************************************************/ +/** 只dump hash表的zcam内容 +* @param dev_id 设备id +* @param queue_id 队列id 0~127 +* @param sdt_no sdt号 0~255 +* @param pDumpData 出参,dump数据,内存由用户分配,结构体DPP_HASH_ENTRY +* @param entryNum 出参,dump出的有效hash条目 +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/22 +************************************************************/ +DPP_STATUS dpp_dtb_hash_table_only_zcam_dump(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + ZXIC_UINT8* pDumpData, + ZXIC_UINT32 *entryNum) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT8 *p_data = NULL; + ZXIC_UINT32 data_len = 0; + ZXIC_UINT32 entry_num = 0; + ZXIC_UINT32 bulk_id = 0; + DPP_SE_CFG *p_se_cfg = NULL; + FUNC_ID_INFO *p_func_info = NULL; + DPP_HASH_CFG *p_hash_cfg = NULL; + DPP_SDTTBL_HASH_T sdt_hash = {0}; + HASH_ENTRY_CFG hash_entry_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX(queue_id, 0, DTB_QUEUE_MAX - 1); + ZXIC_COMM_CHECK_INDEX(sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + ZXIC_COMM_CHECK_POINT(pDumpData); + ZXIC_COMM_CHECK_POINT(entryNum); + + ZXIC_COMM_TRACE_INFO("dump hash sdt no: %d\n", sdt_no); + + rc = dpp_soft_sdt_tbl_get(DEV_ID(dev), sdt_no, &sdt_hash); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_soft_sdt_tbl_get"); + + /* 取出se配置 */ + rc = dpp_se_cfg_get(DEV_ID(dev), &p_se_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_se_cfg_get"); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_se_cfg); + p_func_info = DPP_GET_FUN_INFO(p_se_cfg, sdt_hash.hash_id); + DPP_SE_CHECK_FUN(p_func_info, sdt_hash.hash_id, FUN_HASH); + p_hash_cfg = (DPP_HASH_CFG *)p_func_info->fun_ptr; + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_hash_cfg); + + ZXIC_COMM_MEMSET(&hash_entry_cfg, 0x0, sizeof(HASH_ENTRY_CFG)); + hash_entry_cfg.key_by_size = sdt_hash.key_size; + hash_entry_cfg.key_type = sdt_hash.hash_table_width; + hash_entry_cfg.rst_by_size = 1 << (sdt_hash.rsp_mode + 2); + hash_entry_cfg.table_id = sdt_hash.hash_table_id; + bulk_id = ((hash_entry_cfg.table_id >> 2) & 0x7); + ZXIC_COMM_CHECK_INDEX_UPPER(bulk_id, HASH_BULK_NUM - 1); + + //申请data空间 + p_data = (ZXIC_UINT8 *)ZXIC_COMM_MALLOC(DTB_DMUP_DATA_MAX); + ZXIC_COMM_CHECK_POINT(p_data); + ZXIC_COMM_MEMSET(p_data, 0, DTB_DMUP_DATA_MAX); + + rc = dpp_dtb_sdt_hash_zcam_mono_space_dump(dev, + queue_id, + sdt_no, + sdt_hash.hash_id, + bulk_id, + p_data, + &data_len); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_sdt_hash_zcam_mono_space_dump", p_data); + + rc = dpp_dtb_dump_hash_parse(&hash_entry_cfg, + ITEM_RAM, + p_data, + data_len, + pDumpData, + &entry_num); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_dump_hash_parse",p_data); + + *entryNum = entry_num; + + ZXIC_COMM_TRACE_INFO("hash table dump entry num %d end.\n\n", *entryNum); + + ZXIC_COMM_FREE(p_data); + + return rc; +} + +/** dtb dump etcam直接表表项内容 级联eram支持64bit/128bit +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no acl表sdt表号 +* @param start_index 要dump的起始index,单位是sdt_no该表的mode +* @param p_dump_data_arr 本次dump出的数据,数据格式与下表格式相同 +* @param entry_num 本次dump实际的条目数 +* @param next_start_index 下次dump是开始的index +* @param finish_flag 整个表dump完成标志,1表示完成,0表示未完成 +* @return +* @remark 无 +* @see +* @author cbb @date 2022/08/30 +************************************************************/ + DPP_STATUS dpp_dtb_acl_table_dump(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + DPP_DTB_DUMP_INDEX_T start_index, + DPP_DTB_ACL_ENTRY_INFO_T* p_dump_data_arr, + ZXIC_UINT32 *entry_num, + DPP_DTB_DUMP_INDEX_T *next_start_index, + ZXIC_UINT32 *finish_flag) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 i = 0; + ZXIC_UINT32 handle = 0; + + ZXIC_UINT32 dump_element_id = 0; + + ZXIC_UINT8 *temp_dump_out_data = NULL; + ZXIC_UINT8 *dump_info_buff = NULL; + ZXIC_UINT8 *p_data_start = NULL; + ZXIC_UINT8 *p_data_640bit = NULL; + ZXIC_UINT8 *p_mask_start = NULL; + ZXIC_UINT8 *p_mask_640bit = NULL; + ZXIC_UINT8 *p_rst_start = NULL; + ZXIC_UINT8 *p_rst_128bit = NULL; + ZXIC_UINT32 *eram_buff = NULL; + + + ZXIC_UINT32 addr_640bit = 0; + ZXIC_UINT32 rd_mask = 0; + ZXIC_UINT32 dump_eram_depth_128bit = 0; + ZXIC_UINT32 eram_row_index = 0; + ZXIC_UINT32 eram_col_index = 0; + + ZXIC_UINT8 cmd_buff[DTB_TABLE_CMD_SIZE_BIT / 8] = {0}; + ZXIC_UINT8 xy_data[DPP_ETCAM_WIDTH_MAX / 8] = {0}; + ZXIC_UINT8 xy_mask[DPP_ETCAM_WIDTH_MAX / 8] = {0}; + ZXIC_UINT8 dm_data[DPP_ETCAM_WIDTH_MAX / 8] = {0}; + ZXIC_UINT8 dm_mask[DPP_ETCAM_WIDTH_MAX / 8] = {0}; + DPP_ETCAM_ENTRY_T entry_xy = {0}; + DPP_ETCAM_ENTRY_T entry_dm = {0}; + DPP_DTB_ACL_ENTRY_INFO_T* p_dump_user_data = NULL; + + ZXIC_UINT32 block_num = 0; + ZXIC_UINT32 etcam_key_mode = 0; + ZXIC_UINT32 etcam_table_id = 0; + ZXIC_UINT32 as_enable = 0; + ZXIC_UINT32 as_eram_baddr = 0; + ZXIC_UINT32 etcam_as_mode = 0; + ZXIC_UINT32 etcam_table_depth = 0; + ZXIC_UINT32 block_idx = 0; + + ZXIC_UINT32 etcam_data_dst_phy_haddr = 0; + ZXIC_UINT32 etcam_data_dst_phy_laddr = 0; + ZXIC_UINT32 etcam_mask_dst_phy_haddr = 0; + ZXIC_UINT32 etcam_mask_dst_phy_laddr = 0; + ZXIC_UINT32 as_rst_dst_phy_haddr = 0; + ZXIC_UINT32 as_rst_dst_phy_laddr = 0; + + ZXIC_UINT32 dtb_desc_addr_offset = 0; + ZXIC_UINT32 dump_data_len = 0; + ZXIC_UINT32 dtb_desc_len = 0; + + ZXIC_UINT32 etcam_data_len_offset = 0; + ZXIC_UINT32 etcam_mask_len_offset = 0; + + DPP_ACL_CFG_EX_T *p_acl_cfg = NULL; + DPP_ACL_TBL_CFG_T *p_tbl_cfg = NULL; + + DPP_SDTTBL_ETCAM_T sdt_etcam_info = {0}; /*SDT内容*/ + ETCAM_DUMP_INFO_T etcam_dump_info = {0}; + DPP_DTB_ENTRY_T dtb_dump_entry = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + + dtb_dump_entry.cmd = cmd_buff; + entry_xy.p_data = xy_data; + entry_xy.p_mask = xy_mask; + entry_dm.p_data = dm_data; + entry_dm.p_mask = dm_mask; + + //从sdt_no中获取SDT配置 + rc = dpp_soft_sdt_tbl_get(DEV_ID(dev), sdt_no, &sdt_etcam_info); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_soft_sdt_tbl_get"); + etcam_key_mode = sdt_etcam_info.etcam_key_mode; + etcam_as_mode = sdt_etcam_info.as_rsp_mode; + etcam_table_id = sdt_etcam_info.etcam_table_id; + as_enable = sdt_etcam_info.as_en; + as_eram_baddr = sdt_etcam_info.as_eram_baddr; + etcam_table_depth = sdt_etcam_info.etcam_table_depth; + + dpp_acl_cfg_get(&p_acl_cfg);//获取ACL表资源配置 + ZXIC_COMM_CHECK_POINT(p_acl_cfg); + + p_tbl_cfg = p_acl_cfg->acl_tbls + etcam_table_id;//得到该acl表的资源配置 + + if (!p_tbl_cfg->is_used) + { + ZXIC_COMM_TRACE_ERROR("table[ %d ] is not init!\n", etcam_table_id); + ZXIC_COMM_ASSERT(0); + return DPP_ACL_RC_TBL_NOT_INIT; + } + + block_num = p_tbl_cfg->block_num; + + rc = dpp_dtb_dump_addr_set(dev, queue_id, sdt_no, &dump_element_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_dump_addr_set"); + + ZXIC_COMM_TRACE_INFO("etcam_key_mode: 0x%x\n", etcam_key_mode); + ZXIC_COMM_TRACE_INFO("etcam_table_id: 0x%x\n", etcam_table_id); + ZXIC_COMM_TRACE_INFO("as_enable: 0x%x\n", as_enable); + ZXIC_COMM_TRACE_INFO("as_eram_baddr: 0x%x\n", as_eram_baddr); + ZXIC_COMM_TRACE_INFO("etcam_as_mode: 0x%x\n", etcam_as_mode); + ZXIC_COMM_TRACE_INFO("block_num: 0x%x\n", block_num); + ZXIC_COMM_TRACE_INFO("dump_element_id: 0x%x\n", dump_element_id); + + dump_info_buff = (ZXIC_UINT8 *) ZXIC_COMM_MALLOC(DPP_DTB_TABLE_DUMP_INFO_BUFF_SIZE * sizeof(ZXIC_UINT8)); + ZXIC_COMM_CHECK_POINT_NO_ASSERT(dump_info_buff); + ZXIC_COMM_MEMSET(dump_info_buff, 0, DPP_DTB_TABLE_DUMP_INFO_BUFF_SIZE * sizeof(ZXIC_UINT8)); + + //etcam data dump描述符,以block为单位,深度是512 起始地址是0 rd_mode = 0xff + for(i = 0; i < block_num; i++) + { + block_idx = p_tbl_cfg->block_array[i]; + + ZXIC_COMM_TRACE_INFO("block_idx: %d\n", block_idx); + + etcam_dump_info.block_sel = block_idx; + etcam_dump_info.addr = 0; + etcam_dump_info.tb_width = 3; + etcam_dump_info.rd_mode = 0xFF; + etcam_dump_info.tb_depth = DPP_ETCAM_RAM_DEPTH; + etcam_dump_info.data_or_mask = DPP_ETCAM_DTYPE_DATA; + + rc = dpp_dtb_tab_up_item_offset_addr_get(dev, + queue_id, + dump_element_id, + dump_data_len, + &etcam_data_dst_phy_haddr, + &etcam_data_dst_phy_laddr); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_tab_up_item_offset_addr_get", dump_info_buff); + rc = dpp_dtb_etcam_dump_entry(dev, + &etcam_dump_info, + etcam_data_dst_phy_haddr, + etcam_data_dst_phy_laddr, + &dtb_dump_entry); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_etcam_dump_entry", dump_info_buff); + rc = dpp_dtb_data_write(dump_info_buff, dtb_desc_addr_offset, &dtb_dump_entry); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_data_write", dump_info_buff); + ZXIC_COMM_MEMSET(cmd_buff, 0, DTB_TABLE_CMD_SIZE_BIT / 8); + + dtb_desc_len += 1; + dtb_desc_addr_offset += DTB_LEN_POS_SETP; + dump_data_len += DPP_ETCAM_RAM_DEPTH * 640 / 8; + } + + etcam_data_len_offset = dump_data_len; + // etcam mask dump描述符,以block为单位,深度是512 起始地址是0 rd_mode = 0xff + for(i = 0; i < block_num; i++) + { + block_idx = p_tbl_cfg->block_array[i]; + + ZXIC_COMM_TRACE_INFO("mask: block_idx: %d\n", block_idx); + + etcam_dump_info.block_sel = block_idx; + etcam_dump_info.addr = 0; + etcam_dump_info.tb_width = 3; + etcam_dump_info.rd_mode = 0xFF; + etcam_dump_info.tb_depth = DPP_ETCAM_RAM_DEPTH; + etcam_dump_info.data_or_mask = DPP_ETCAM_DTYPE_MASK; + + rc = dpp_dtb_tab_up_item_offset_addr_get(dev, + queue_id, + dump_element_id, + dump_data_len, + &etcam_mask_dst_phy_haddr, + &etcam_mask_dst_phy_laddr); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_tab_up_item_offset_addr_get", dump_info_buff); + rc = dpp_dtb_etcam_dump_entry(dev, + &etcam_dump_info, + etcam_mask_dst_phy_haddr, + etcam_mask_dst_phy_laddr, + &dtb_dump_entry); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_etcam_dump_entry", dump_info_buff); + rc = dpp_dtb_data_write(dump_info_buff, dtb_desc_addr_offset, &dtb_dump_entry); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_data_write", dump_info_buff); + ZXIC_COMM_MEMSET(cmd_buff, 0, DTB_TABLE_CMD_SIZE_BIT / 8); + + dtb_desc_len += 1; + dtb_desc_addr_offset += DTB_LEN_POS_SETP; + dump_data_len += DPP_ETCAM_RAM_DEPTH * 640 / 8; + } + etcam_mask_len_offset = dump_data_len; + + //补充级联描述符 + if(as_enable) + { + rc = dtb_eram_index_cal(dev, etcam_as_mode, etcam_table_depth, &dump_eram_depth_128bit, &eram_col_index); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dtb_eram_index_cal", dump_info_buff); + + rc = dpp_dtb_tab_up_item_offset_addr_get(dev, + queue_id, + dump_element_id, + dump_data_len, + &as_rst_dst_phy_haddr, + &as_rst_dst_phy_laddr); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_tab_up_item_offset_addr_get", dump_info_buff); + + rc = dpp_dtb_smmu0_dump_entry(dev, + as_eram_baddr, + dump_eram_depth_128bit, + as_rst_dst_phy_haddr, + as_rst_dst_phy_laddr, + &dtb_dump_entry); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_smmu0_dump_entry", dump_info_buff); + rc = dpp_dtb_data_write(dump_info_buff, dtb_desc_addr_offset, &dtb_dump_entry); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_dtb_data_write", dump_info_buff); + ZXIC_COMM_MEMSET(cmd_buff, 0, DTB_TABLE_CMD_SIZE_BIT / 8); + dtb_desc_len += 1; + dtb_desc_addr_offset += DTB_LEN_POS_SETP; + dump_data_len += dump_eram_depth_128bit * 128 / 8; + } + + ZXIC_COMM_TRACE_INFO("dtb_desc_len: 0x%x\n", dtb_desc_len); + ZXIC_COMM_TRACE_INFO("dtb_desc_addr_offset: 0x%x\n", dtb_desc_addr_offset); + ZXIC_COMM_TRACE_INFO("dump_data_len: 0x%x\n", dump_data_len); + + //申请data空间 + temp_dump_out_data = (ZXIC_UINT8 *) ZXIC_COMM_MALLOC(dump_data_len * sizeof(ZXIC_UINT8)); + ZXIC_COMM_CHECK_POINT_MEMORY_FREE_NO_ASSERT(temp_dump_out_data, dump_info_buff); + ZXIC_COMM_MEMSET(temp_dump_out_data, 0, dump_data_len * sizeof(ZXIC_UINT8)); + + /*下发dump描述符*/ + rc = dpp_dtb_write_dump_desc_info(dev, + queue_id, + dump_element_id, + (ZXIC_UINT32 *)dump_info_buff, + dump_data_len / 4, + dtb_desc_len * 4, + (ZXIC_UINT32 *)temp_dump_out_data); + ZXIC_COMM_FREE(dump_info_buff); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc,"dpp_dtb_write_dump_desc_info", temp_dump_out_data); + + //解析数据 + p_data_start = temp_dump_out_data; + p_mask_start = temp_dump_out_data + etcam_data_len_offset; + if(as_enable) + { + p_rst_start = temp_dump_out_data + etcam_mask_len_offset; + } + + for (handle = 0; handle < etcam_table_depth; handle++) + { + p_dump_user_data = p_dump_data_arr + handle; + + if ((p_dump_user_data == NULL) || (p_dump_user_data->key_data == NULL) || (p_dump_user_data->key_mask == NULL)) + { + ZXIC_COMM_TRACE_ERROR("etcam handle 0x%x data user buff is NULL!\n", handle); + ZXIC_COMM_FREE(temp_dump_out_data); + return DPP_ERR; + } + + if(as_enable) + { + if(p_dump_user_data->p_as_rslt == NULL) + { + ZXIC_COMM_TRACE_ERROR("etcam handle 0x%x as data buff is NULL!\n", handle); + ZXIC_COMM_FREE(temp_dump_out_data); + return DPP_ERR; + } + } + + p_dump_user_data->handle = handle; + + addr_640bit = handle / (1U << etcam_key_mode); + rd_mask = (((1U << (8U >> etcam_key_mode)) - 1) << ((8U >> etcam_key_mode) * (handle % (1U << etcam_key_mode)))) & 0xFF; + + p_data_640bit = p_data_start + addr_640bit * 640 / 8; + p_mask_640bit = p_mask_start + addr_640bit * 640 / 8; + + dpp_dtb_etcam_ind_data_get(dev, p_data_640bit, rd_mask, entry_xy.p_data); + dpp_dtb_etcam_ind_data_get(dev, p_mask_640bit, rd_mask, entry_xy.p_mask); + + rc = dpp_etcam_xy_to_dm(&entry_dm, &entry_xy, DPP_ETCAM_ENTRY_SIZE_GET(etcam_key_mode)); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_etcam_xy_to_dm", temp_dump_out_data); + + ZXIC_COMM_MEMCPY(p_dump_user_data->key_data, entry_dm.p_data, DPP_ETCAM_ENTRY_SIZE_GET(etcam_key_mode)); + ZXIC_COMM_MEMCPY(p_dump_user_data->key_mask, entry_dm.p_mask, DPP_ETCAM_ENTRY_SIZE_GET(etcam_key_mode)); + + if(as_enable) + { + rc = dtb_eram_index_cal(dev, etcam_as_mode, handle, &eram_row_index, &eram_col_index); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dtb_eram_index_cal", temp_dump_out_data); + p_rst_128bit = p_rst_start + eram_row_index * DTB_LEN_POS_SETP; + + eram_buff = (ZXIC_UINT32*)p_rst_128bit; + + if(etcam_as_mode == ERAM128_TBL_128b) + { + ZXIC_COMM_MEMCPY(p_dump_user_data->p_as_rslt, eram_buff, (128 / 8)); + } + else if(etcam_as_mode == ERAM128_TBL_64b) + { + ZXIC_COMM_MEMCPY(p_dump_user_data->p_as_rslt, eram_buff + ((1 - eram_col_index) << 1), (64 / 8)); + } + } + + } + + *entry_num = etcam_table_depth; + *finish_flag = 1; + ZXIC_COMM_TRACE_INFO(" etcam table dump entry num %d, finish flag %d\n\n", *entry_num, *finish_flag); + + ZXIC_COMM_FREE(temp_dump_out_data); + + return DPP_OK; +} + +#endif + +#if ZXIC_REAL("DTB DEBUG PRINT") + +/*打印buff中数据,size 单位 字节*/ +ZXIC_VOID dpp_data_buff_print(ZXIC_UINT8 *buff, ZXIC_UINT32 size) +{ + + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + ZXIC_UINT8 *temp_buff = NULL; + + ZXIC_COMM_PRINT("buff data is:\n"); + + for (i = 0; i < size / 4 / 4; i++) + { + temp_buff = buff + 16 * i; + for(j = 0; j < 4; j++) + { + ZXIC_COMM_PRINT("0x%08x ", *((ZXIC_UINT32*)(temp_buff + 4 * j))); + } + ZXIC_COMM_PRINT("\n"); + } + + ZXIC_COMM_PRINT("\n"); +} + +ZXIC_VOID dpp_acl_data_print(ZXIC_UINT8 *p_data, ZXIC_UINT8 *p_mask, ZXIC_UINT32 etcam_mode) +{ + int i = 0; + int data_len = 0; + + data_len = DPP_ETCAM_ENTRY_SIZE_GET(etcam_mode); + + if(data_len > 80) + { + return; + } + + ZXIC_COMM_PRINT("%s:", "data"); + + for (i = 0; i < data_len; i++) + { + if ((i % 10) == 0) + { + ZXIC_COMM_PRINT("\n"); + } + + ZXIC_COMM_PRINT("%02x", p_data[i]); + } + + ZXIC_COMM_PRINT("\n"); + + ZXIC_COMM_PRINT("%s:", "mask"); + + for (i = 0; i < data_len; i++) + { + if ((i % 10) == 0) + { + ZXIC_COMM_PRINT("\n"); + } + + ZXIC_COMM_PRINT("%02x", p_mask[i]); + } + ZXIC_COMM_PRINT("\n"); +} + +ZXIC_VOID dpp_dtb_data_print(ZXIC_UINT8 *p_data, ZXIC_UINT32 len) +{ + int i = 0; + int cycle = len / 4; + int remain = len % 4; + + ZXIC_COMM_PRINT("%s:", "data:\n"); + + for(i = 0; i < cycle; i++) + { + ZXIC_COMM_PRINT("0x%02x %02x %02x %02x \n", p_data[4 * i], p_data[4 * i + 1], p_data[4 * i + 2], p_data[4 * i + 3]); + } + + for(i = 0; i < remain; i++) + { + ZXIC_COMM_PRINT("0x%02x", p_data[cycle * 4 + i]); + } + ZXIC_COMM_PRINT("\n"); +} + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/dpp_dtb_table_api.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/dpp_dtb_table_api.c new file mode 100644 index 0000000..fcffc01 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/dpp_dtb_table_api.c @@ -0,0 +1,643 @@ +#include "zxic_common.h" +#include "dpp_dev.h" +#include "dpp_dtb_table_api.h" +#include "dpp_dtb_cfg.h" +#include "dpp_apt_se.h" +#include "zxic_comm_rb_tree.h" +#include "dpp_dtb_table.h" +#include "dpp_sdt.h" +#include "dpp_agent_channel.h" +#include "dpp_dtb.h" +#include "dpp_kernel_init.h" + +#define EP_NUM (5) +static ZXIC_UINT32 msix_interrupt_mode = 1;//1为dbi中断,0为match中断 +static ZXIC_RB_CFG g_dtb_queue_dump_addr_rb[DPP_DEV_SLOT_MAX][DPP_DEV_CHANNEL_MAX][DPP_DTB_QUEUE_NUM_MAX] = {{{{0}}}}; +static ZXIC_UINT32 hardware_ep_id[EP_NUM] = {5, 6, 7, 8, 9}; + +typedef struct dpp_dtb_dump_addr_info_t +{ + ZXIC_UINT32 sdt_no; + ZXIC_UINT64 phyAddr; + ZXIC_UINT64 virAddr; + ZXIC_UINT32 size; +}DPP_DTB_DUMP_ADDR_INFO_T; + +ZXIC_UINT32 dpp_dtb_ep_id_get(ZXIC_UINT32 soft_ep_id) +{ + return hardware_ep_id[soft_ep_id]; +} + +ZXIC_RB_CFG* dpp_dtb_dump_addr_rb_get(DPP_DEV_T *dev, ZXIC_UINT32 queue_id) +{ + ZXIC_COMM_CHECK_POINT_RETURN_NULL(dev); + ZXIC_COMM_CHECK_INDEX_RETURN_NULL(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_RETURN_NULL(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + return &g_dtb_queue_dump_addr_rb[DEV_PCIE_SLOT(dev)][DEV_ID(dev)][queue_id]; +} + +ZXIC_UINT32 dpp_dtb_dump_addr_rb_init(DPP_DEV_T *dev, ZXIC_UINT32 queue_id) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_RB_CFG *p_dtb_dump_addr_rb = NULL; + + ZXIC_COMM_CHECK_POINT_NO_ASSERT(dev); + ZXIC_COMM_CHECK_INDEX_NO_ASSERT(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + + p_dtb_dump_addr_rb = dpp_dtb_dump_addr_rb_get(dev, queue_id); + + rc = zxic_comm_rb_init(p_dtb_dump_addr_rb, 0, ZXIC_SIZEOF(DPP_DTB_DUMP_ADDR_INFO_T), dpp_apt_table_key_cmp); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "zxic_comm_rb_init"); + + return rc; +} + +ZXIC_UINT32 dpp_dtb_dump_addr_rb_destroy(DPP_DEV_T *dev, ZXIC_UINT32 queue_id) +{ + ZXIC_UINT32 rc = DPP_OK; + + D_NODE *p_node = NULL; + ZXIC_RB_TN *p_rb_tn = NULL; + DPP_DTB_DUMP_ADDR_INFO_T *p_rbkey = NULL; + D_HEAD *p_head_dtb_rb = NULL; + ZXIC_RB_CFG *p_dtb_dump_addr_rb = NULL; + + ZXIC_UINT32 sdt_no = 0; + + ZXIC_COMM_CHECK_POINT_NO_ASSERT(dev); + ZXIC_COMM_CHECK_INDEX_NO_ASSERT(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + + p_dtb_dump_addr_rb = dpp_dtb_dump_addr_rb_get(dev, queue_id); + ZXIC_COMM_CHECK_POINT_NO_ASSERT(p_dtb_dump_addr_rb); + + p_head_dtb_rb = &p_dtb_dump_addr_rb->tn_list; + ZXIC_COMM_CHECK_POINT_NO_ASSERT(p_head_dtb_rb); + + while(p_head_dtb_rb->used) + { + p_node = p_head_dtb_rb->p_next; + p_rb_tn = (ZXIC_RB_TN *)p_node->data; + p_rbkey = (DPP_DTB_DUMP_ADDR_INFO_T *)p_rb_tn->p_key; + + sdt_no = p_rbkey->sdt_no; + rc = dpp_dtb_dump_sdt_addr_clear(dev, queue_id, sdt_no); + if (DPP_HASH_RC_DEL_SRHFAIL == rc) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "dtb dump delete key is not exist, std:%d\n", sdt_no); + } + else + { + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_dtb_dump_sdt_addr_clear"); + } + } + + rc = zxic_comm_rb_destroy(p_dtb_dump_addr_rb); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "zxic_comm_rb_init"); + + return rc; +} + +/*dump地址信息获取*/ +ZXIC_UINT32 dpp_dtb_dump_sdt_addr_get(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no, + ZXIC_UINT64 *phy_addr, + ZXIC_UINT64 *vir_addr, + ZXIC_UINT32 *size) +{ + ZXIC_UINT32 rc = DPP_OK; + + DPP_DTB_DUMP_ADDR_INFO_T dtb_dump_addr_info = {0}; + ZXIC_RB_CFG *p_dtb_dump_addr_rb = NULL; + + ZXIC_COMM_CHECK_POINT_NO_ASSERT(dev); + ZXIC_COMM_CHECK_INDEX_NO_ASSERT(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), queue_id, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + + dtb_dump_addr_info.sdt_no = sdt_no; + p_dtb_dump_addr_rb = dpp_dtb_dump_addr_rb_get(dev, queue_id); + rc = dpp_apt_sw_list_search(p_dtb_dump_addr_rb, &dtb_dump_addr_info, sizeof(DPP_DTB_DUMP_ADDR_INFO_T)); + if (rc == DPP_OK) + { + ZXIC_COMM_TRACE_INFO("search sdt_no %d success.\n", sdt_no); + } + else + { + ZXIC_COMM_TRACE_ERROR("search sdt_no %d fail.\n", sdt_no); + return rc; + } + + *phy_addr = dtb_dump_addr_info.phyAddr; + *vir_addr = dtb_dump_addr_info.virAddr; + *size = dtb_dump_addr_info.size; + + ZXIC_COMM_TRACE_INFO("dpp_dtb_dump_sdt_addr_get: queue :%d\n", queue_id); + ZXIC_COMM_TRACE_INFO("dpp_dtb_dump_sdt_addr_get: sdt_no :%d\n", sdt_no); + ZXIC_COMM_TRACE_INFO("dpp_dtb_dump_sdt_addr_get: phyAddr :0x%016llx\n", dtb_dump_addr_info.phyAddr); + ZXIC_COMM_TRACE_INFO("dpp_dtb_dump_sdt_addr_get: vir_addr :0x%016llx\n", dtb_dump_addr_info.virAddr); + ZXIC_COMM_TRACE_INFO("dpp_dtb_dump_sdt_addr_get: size :0x%x\n", dtb_dump_addr_info.size); + + return rc; +} + +/***********************************************************/ +/** DTB通道申请 +* @param devId NP设备号 +* @param pName 申请DTB通道的唯一设备名(最大32字符) +* @param pQueueId 申请到的DTB通道编号 +* @return +* @remark 无 +* @see +* @author cbb @date 2023/07/03 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_requst(DPP_DEV_T *dev, ZXIC_CONST ZXIC_UINT8* pName, + ZXIC_UINT16 vPort, + ZXIC_UINT32 *pQueueId) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 queue_id = 0; + ZXIC_MUTEX_T *p_dtb_mutex = NULL; + DPP_DEV_MUTEX_TYPE_E mutex = 0; + ZXIC_UINT32 vport_info = (ZXIC_UINT32)vPort; + + ZXIC_COMM_CHECK_POINT_NO_ASSERT(dev); + ZXIC_COMM_CHECK_INDEX_NO_ASSERT(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), pName); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), pQueueId); + + //使用代理通道要加锁 + mutex = DPP_DEV_MUTEX_T_DTB; + rc = dpp_dev_opr_mutex_get(DEV_ID(dev), (ZXIC_UINT32)mutex, &p_dtb_mutex); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dev_opr_mutex_get"); + + rc = zxic_comm_mutex_lock(p_dtb_mutex); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "zxic_comm_mutex_lock"); + + rc = dpp_agent_channel_dtb_queue_request(dev, pName, vport_info, &queue_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_agent_channel_dtb_queue_request", p_dtb_mutex); + + rc = zxic_comm_mutex_unlock(p_dtb_mutex); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "zxic_comm_mutex_unlock"); + + rc = dpp_dtb_dump_addr_rb_init(dev, queue_id); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_dump_addr_rb_init"); + + *pQueueId = queue_id; + + ZXIC_COMM_PRINT("dpp_dtb_queue_requst:slot %d name %s vport 0x%x queue_id %d\n", DEV_PCIE_SLOT(dev), pName, vport_info, queue_id); + + return rc; +} + +/***********************************************************/ +/** DTB通道释放 +* @param devId NP设备号 +* @param pName 要释放DTB通道的唯一设备名(最大32字符) +* @param pQueueId 要释放的DTB通道编号 +* @return +* @remark 无 +* @see +* @author cbb @date 2023/07/03 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_release(DPP_DEV_T *dev, ZXIC_CONST ZXIC_UINT8* pName, + ZXIC_UINT32 queueId) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_MUTEX_T *p_dtb_mutex = NULL; + DPP_DEV_MUTEX_TYPE_E mutex = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_NO_ASSERT(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), queueId, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), pName); + + ZXIC_COMM_TRACE_INFO("dpp_dtb_queue_release:queue_id %d\n", queueId); + + //使用代理通道要加锁 + mutex = DPP_DEV_MUTEX_T_DTB; + rc = dpp_dev_opr_mutex_get(DEV_ID(dev), (ZXIC_UINT32)mutex, &p_dtb_mutex); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dev_opr_mutex_get"); + + rc = zxic_comm_mutex_lock(p_dtb_mutex); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "zxic_comm_mutex_lock"); + + rc = dpp_agent_channel_dtb_queue_release(dev, pName, queueId); + + if(rc == DPP_RC_DTB_QUEUE_NOT_ALLOC) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "dtb slot %d queue id %d not request. \n", DEV_PCIE_SLOT(dev), queueId); + } + + if(rc == DPP_RC_DTB_QUEUE_NAME_ERROR) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "dtb slot %d queue %d name error. \n", DEV_PCIE_SLOT(dev), queueId); + } + + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_agent_channel_dtb_queue_release", p_dtb_mutex); + + rc = zxic_comm_mutex_unlock(p_dtb_mutex); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "zxic_comm_mutex_unlock"); + + rc = dpp_dtb_dump_addr_rb_destroy(dev, queueId); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_dump_addr_rb_destroy"); + + rc = dpp_dtb_queue_id_free(dev, queueId); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_queue_id_free"); + + ZXIC_COMM_PRINT("dpp_dtb_queue_release:slot %d name %s queue_id %d\n", DEV_PCIE_SLOT(dev), pName, queueId); + + return rc; +} + +/***********************************************************/ +/** DTB通道用户信息配置 +* @param devId NP设备号 +* @param queueId DTB通道编号 +* @param vPort vport信息 +* @param vector 中断号 +* @return +* @remark 无 +* @see +* @author cbb @date 2023/07/03 +************************************************************/ +ZXIC_UINT32 dpp_dtb_user_info_set(DPP_DEV_T *dev, + ZXIC_UINT32 queueId, + ZXIC_UINT16 vPort, + ZXIC_UINT32 vector) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_UINT32 temp_epid; + ZXIC_UINT32 temp_func_active; + ZXIC_UINT32 temp_func_num; + ZXIC_UINT32 temp_vfunc_num; + ZXIC_UINT32 virtioPort = (ZXIC_UINT32)vPort; + + DPP_DTB_QUEUE_VM_INFO_T vm_info = {0}; + DPP_DTB_MGR_T *p_dtb_mgr = ZXIC_NULL; + + ZXIC_COMM_CHECK_POINT_NO_ASSERT(dev); + ZXIC_COMM_CHECK_INDEX_NO_ASSERT(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), queueId, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + + p_dtb_mgr = dpp_dtb_mgr_get(DEV_PCIE_SLOT(dev), DEV_ID(dev)); + if (p_dtb_mgr == ZXIC_NULL) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "ErrorCode[0x%x]: DTB Manager is not exist!!!\n", DPP_RC_DTB_MGR_NOT_EXIST); + return DPP_RC_DTB_MGR_NOT_EXIST; + } + + ZXIC_COMM_UINT32_GET_BITS(temp_epid, virtioPort, VPORT_EPID_BT_START, VPORT_EPID_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(temp_func_active, virtioPort, VPORT_FUNC_ACTIVE_BT_START, VPORT_FUNC_ACTIVE_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(temp_func_num, virtioPort, VPORT_FUNC_NUM_BT_START, VPORT_FUNC_NUM_BT_LEN); + ZXIC_COMM_UINT32_GET_BITS(temp_vfunc_num, virtioPort, VPORT_VFUNC_NUM_BT_START, VPORT_VFUNC_NUM_BT_LEN); + + rc = dpp_dtb_queue_vm_info_get(dev, queueId, &vm_info); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_queue_vm_info_get"); + + vm_info.dbi_en = msix_interrupt_mode; + vm_info.epid = dpp_dtb_ep_id_get(temp_epid); + vm_info.vfunc_num = temp_vfunc_num; + vm_info.func_num = temp_func_num; + vm_info.vfunc_active = temp_func_active; + vm_info.vector = vector; + + ZXIC_COMM_PRINT("dpp_dtb_user_info_set:queue %d vport 0x%x, vector:%x\n", queueId, vPort, vector); + ZXIC_COMM_PRINT("dpp_dtb_user_info_set:dbi_en 0x%x\n", vm_info.dbi_en); + ZXIC_COMM_PRINT("dpp_dtb_user_info_set:epid 0x%x\n", vm_info.epid); + ZXIC_COMM_PRINT("dpp_dtb_user_info_set:vfunc_num 0x%x\n", vm_info.vfunc_num); + ZXIC_COMM_PRINT("dpp_dtb_user_info_set:func_num 0x%x\n", vm_info.func_num); + ZXIC_COMM_PRINT("dpp_dtb_user_info_set:vfunc_active 0x%x\n", vm_info.vfunc_active); + + p_dtb_mgr->queue_info[queueId].vport = vPort; + p_dtb_mgr->queue_info[queueId].vector = vector; + + rc = dpp_dtb_queue_vm_info_set(dev, queueId, &vm_info); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_queue_vm_info_set"); + + return rc; +} + +/***********************************************************/ +/** DTB通道下表空间地址设置,空间大小[32*(16+16*1024)B] +* @param devId NP设备号 +* @param queueId DTB通道编号 +* @param phyAddr 物理地址 +* @param virAddr 虚拟地址 +* @return +* @remark 无 +* @see +* @author cbb @date 2023/07/03 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_down_table_addr_set(DPP_DEV_T *dev, + ZXIC_UINT32 queueId, + ZXIC_UINT64 phyAddr, + ZXIC_UINT64 virAddr) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT_NO_ASSERT(dev); + ZXIC_COMM_CHECK_INDEX_NO_ASSERT(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), queueId, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + + ZXIC_COMM_PRINT("dpp_dtb_queue_down_table_addr_set:slot %d queue %d phyAddr 0x%llx\n", DEV_PCIE_SLOT(dev), queueId, phyAddr); + ZXIC_COMM_PRINT("dpp_dtb_queue_down_table_addr_set:slot %d queue %d virAddr 0x%llx\n", DEV_PCIE_SLOT(dev), queueId, virAddr); + + rc = dpp_dtb_down_channel_addr_set(dev, + queueId, + phyAddr, + virAddr, + 0); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_down_channel_addr_set"); + + return rc; +} + +/***********************************************************/ +/** DTB通道dump空间地址设置,空间大小[32*(16+16*1024)B] +* @param devId NP设备号 +* @param pName 要释放DTB通道的设备名 +* @param phyAddr 物理地址 +* @param virAddr 虚拟地址 +* @return +* @remark 无 +* @see +* @author cbb @date 2023/07/03 +************************************************************/ +ZXIC_UINT32 dpp_dtb_queue_dump_table_addr_set(DPP_DEV_T *dev, + ZXIC_UINT32 queueId, + ZXIC_UINT64 phyAddr, + ZXIC_UINT64 virAddr) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT_NO_ASSERT(dev); + ZXIC_COMM_CHECK_INDEX_NO_ASSERT(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), queueId, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + + ZXIC_COMM_PRINT("dpp_dtb_queue_dump_table_addr_set:slot %d queue %d phyAddr 0x%llx\n", DEV_PCIE_SLOT(dev), queueId, phyAddr); + ZXIC_COMM_PRINT("dpp_dtb_queue_dump_table_addr_set:slot %d queue %d virAddr 0x%llx\n", DEV_PCIE_SLOT(dev), queueId, virAddr); + + rc = dpp_dtb_dump_channel_addr_set(dev, + queueId, + phyAddr, + virAddr, + 0); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_dump_channel_addr_set"); + + return rc; +} + +/***********************************************************/ +/** 大批量dump一个流表使用的地址空间配置 +* @param devId NP设备号 +* @param queueId DTB队列编号 +* @param sdtNo 流表std号 +* @param phyAddr 物理地址 +* @param virAddr 虚拟地址 +* @param size (最大64MB) +* @return +* @remark 无 +* @see +* @author cbb @date 2023/07/03 +************************************************************/ +ZXIC_UINT32 dpp_dtb_dump_sdt_addr_set(DPP_DEV_T *dev, + ZXIC_UINT32 queueId, + ZXIC_UINT32 sdtNo, + ZXIC_UINT64 phyAddr, + ZXIC_UINT64 virAddr, + ZXIC_UINT32 size) +{ + ZXIC_UINT32 rc = DPP_OK; + + DPP_DTB_DUMP_ADDR_INFO_T dtb_dump_addr_info = {0}; + ZXIC_RB_CFG *p_dtb_dump_addr_rb = NULL; + + ZXIC_COMM_CHECK_POINT_NO_ASSERT(dev); + ZXIC_COMM_CHECK_INDEX_NO_ASSERT(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), queueId, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + + ZXIC_COMM_TRACE_INFO("dpp_dtb_dump_sdt_addr_set: slotId :0x%x\n", DEV_PCIE_SLOT(dev)); + ZXIC_COMM_TRACE_INFO("dpp_dtb_dump_sdt_addr_set: queueId :0x%x\n", queueId); + ZXIC_COMM_TRACE_INFO("dpp_dtb_dump_sdt_addr_set: sdtNo :0x%x\n", sdtNo); + ZXIC_COMM_TRACE_INFO("dpp_dtb_dump_sdt_addr_set: phyAddr :0x%016llx\n", phyAddr); + ZXIC_COMM_TRACE_INFO("dpp_dtb_dump_sdt_addr_set: virAddr :0x%016llx\n", virAddr); + ZXIC_COMM_TRACE_INFO("dpp_dtb_dump_sdt_addr_set: size :0x%x\n", size); + + dtb_dump_addr_info.sdt_no = sdtNo; + dtb_dump_addr_info.phyAddr = phyAddr; + dtb_dump_addr_info.virAddr = virAddr; + dtb_dump_addr_info.size = size; + + p_dtb_dump_addr_rb = dpp_dtb_dump_addr_rb_get(dev, queueId); + ZXIC_COMM_CHECK_POINT_NO_ASSERT(p_dtb_dump_addr_rb); + ZXIC_COMM_CHECK_INDEX_UPPER_NO_ASSERT(p_dtb_dump_addr_rb->key_size, (ZXIC_UINT32)sizeof(DPP_DTB_DUMP_ADDR_INFO_T)); + + rc = dpp_apt_sw_list_insert(p_dtb_dump_addr_rb, &dtb_dump_addr_info, sizeof(DPP_DTB_DUMP_ADDR_INFO_T)); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_apt_sw_list_insert"); + + return rc; +} + +/***********************************************************/ +/** 清除大批量dump一个流表使用的地址空间配置 +* @param devId NP设备号 +* @param queueId DTB队列编号 +* @param sdtNo 流表std号 +* @return +* @remark 无 +* @see +* @author cbb @date 2023/07/03 +************************************************************/ +ZXIC_UINT32 dpp_dtb_dump_sdt_addr_clear(DPP_DEV_T *dev, + ZXIC_UINT32 queueId, + ZXIC_UINT32 sdtNo) +{ + ZXIC_UINT32 rc = DPP_OK; + + DPP_DTB_DUMP_ADDR_INFO_T dtb_dump_addr_info = {0}; + ZXIC_RB_CFG *p_dtb_dump_addr_rb = NULL; + + ZXIC_COMM_CHECK_POINT_NO_ASSERT(dev); + ZXIC_COMM_CHECK_INDEX_NO_ASSERT(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), queueId, 0, DPP_DTB_QUEUE_NUM_MAX - 1); + + dtb_dump_addr_info.sdt_no = sdtNo; + + p_dtb_dump_addr_rb = dpp_dtb_dump_addr_rb_get(dev, queueId); + rc = dpp_apt_sw_list_delete(p_dtb_dump_addr_rb, &dtb_dump_addr_info, sizeof(DPP_DTB_DUMP_ADDR_INFO_T)); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_apt_sw_list_delete"); + + return rc; +} + +/***********************************************************/ +/** 释放当前sdt下的所有流表(硬件方式) +* (适用于进程启动后,仅配置流表资源,软件未配置流表,但需要删除硬件上已配置流表的场景) +* @param dev +* @param queue_id 队列号 +* @param sdt_no sdt号 +* @return +* @remark 无 +* @see +* @author cq @date 2023/12/04 +************************************************************/ +DPP_STATUS dpp_dtb_hash_offline_delete(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no) + +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 entryNum = 0; + ZXIC_UINT32 index = 0; + ZXIC_UINT32 max_item_num = DTB_DUMP_MULTICAST_MAC_DUMP_NUM; + ZXIC_UINT8* pDumpData = NULL; + ZXIC_UINT8 *pKey = NULL; + ZXIC_UINT8 *pRst = NULL; + ZXIC_UINT32 element_id = 0; + + ZXIC_UINT32 dma_size = 0; + ZXIC_UINT64 dma_phy_addr = 0; + ZXIC_UINT64 dma_vir_addr = 0; + + DPP_DTB_HASH_ENTRY_INFO_T *p_dtb_hash_entry = NULL; + DPP_DTB_HASH_ENTRY_INFO_T *p_temp_entry = NULL; + DPP_SDTTBL_HASH_T sdt_hash_info = {0}; /*SDT内容*/ + + ZXIC_COMM_CHECK_POINT_NO_ASSERT(dev); + ZXIC_COMM_CHECK_INDEX_NO_ASSERT(DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + + //从sdt_no中获取SDT配置 + rc = dpp_soft_sdt_tbl_get(DEV_ID(dev), sdt_no, &sdt_hash_info); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_soft_sdt_tbl_get"); + + pDumpData = (ZXIC_UINT8 *)ZXIC_COMM_MALLOC(max_item_num*sizeof(DPP_DTB_HASH_ENTRY_INFO_T)); + ZXIC_COMM_CHECK_POINT_NO_ASSERT(pDumpData); + pKey = (ZXIC_UINT8 *)ZXIC_COMM_MALLOC(max_item_num * HASH_KEY_MAX); + ZXIC_COMM_CHECK_POINT_MEMORY_FREE_NO_ASSERT(pKey, pDumpData); + pRst = (ZXIC_UINT8 *)ZXIC_COMM_MALLOC(max_item_num * HASH_RST_MAX); + ZXIC_COMM_CHECK_POINT_MEMORY_FREE2PTR_NO_ASSERT(pRst, pKey, pDumpData); + + ZXIC_COMM_MEMSET(pDumpData,0x0,max_item_num*sizeof(DPP_DTB_HASH_ENTRY_INFO_T)); + ZXIC_COMM_MEMSET(pKey,0x0,max_item_num*HASH_KEY_MAX); + ZXIC_COMM_MEMSET(pRst,0x0,max_item_num*HASH_RST_MAX); + + p_dtb_hash_entry = (DPP_DTB_HASH_ENTRY_INFO_T *)pDumpData; + for(index = 0;indexp_actu_key = pKey + index * HASH_KEY_MAX; + p_temp_entry->p_rst = pRst + index * HASH_RST_MAX; + } + + rc = dtb_sdt_dump_dma_alloc(dev, DTB_SDT_DUMP_SIZE, &dma_phy_addr, &dma_vir_addr); + ZXIC_COMM_CHECK_RC_MEMORY_FREE3PTR_NO_ASSERT(rc, "dtb_sdt_dump_dma_alloc", pRst, pKey, pDumpData); + + rc = dpp_dtb_dump_sdt_addr_set(dev, queue_id, sdt_no, dma_phy_addr, dma_vir_addr, DTB_SDT_DUMP_SIZE); + ZXIC_COMM_CHECK_RC_MEMORY_FREE3PTR_NO_ASSERT(rc, "dpp_dtb_dump_sdt_addr_set", pRst, pKey, pDumpData); + + rc = dpp_dtb_hash_table_only_zcam_dump(dev, queue_id, sdt_no, pDumpData, &entryNum); + + dpp_dtb_dump_sdt_addr_get(dev, queue_id, sdt_no, &dma_phy_addr, &dma_vir_addr, &dma_size); + dtb_sdt_dump_dma_release(dev, dma_size, dma_phy_addr, dma_vir_addr); + dpp_dtb_dump_sdt_addr_clear(dev, queue_id, sdt_no); + + if(DPP_OK != rc) + { + ZXIC_COMM_TRACE_ERROR("dpp_dtb_hash_table_only_zcam_dump: sdt :0x%x fail\n", sdt_no); + ZXIC_COMM_FREE(p_dtb_hash_entry); + ZXIC_COMM_FREE(pKey); + ZXIC_COMM_FREE(pRst); + return rc; + } + + ZXIC_COMM_PRINT("dpp_dtb_hash_table_only_zcam_dump valid entry num is %u\n",entryNum); + + for(index = 0; index < entryNum; index++) + { + p_temp_entry = p_dtb_hash_entry + index; + // //打印数据 + dpp_dtb_data_print(p_temp_entry->p_actu_key, DPP_GET_ACTU_KEY_BY_SIZE(sdt_hash_info.key_size) + 1); + dpp_dtb_data_print(p_temp_entry->p_rst, 4 * (0x1 << sdt_hash_info.rsp_mode)); + } + + rc = dpp_dtb_hash_dma_delete_hardware(dev, queue_id, sdt_no, entryNum, p_dtb_hash_entry, &element_id); + ZXIC_COMM_FREE(p_dtb_hash_entry); + ZXIC_COMM_FREE(pKey); + ZXIC_COMM_FREE(pRst); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_hash_dma_delete_hardware"); + + return DPP_OK; +} + +/***********************************************************/ +/** 在线释放当前sdt下的所有流表表项 +* (适用于进程正常退出前删除表项,软件上有存储表项) +* @param dev_id 设备号 +* @param queue_id 队列号 +* @param sdt_no sdt号 +* @return +* @remark 无 +* @see +* @author cq @date 2023/12/04 +************************************************************/ +DPP_STATUS dpp_dtb_hash_online_delete(DPP_DEV_T *dev, + ZXIC_UINT32 queue_id, + ZXIC_UINT32 sdt_no) +{ + ZXIC_UINT32 rc = 0; + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT8 key_valid = 0; + ZXIC_UINT32 table_id = 0; + ZXIC_UINT32 key_type = 0; + ZXIC_UINT32 element_id = 0; + + D_NODE *p_node = NULL; + ZXIC_RB_TN *p_rb_tn = NULL; + D_HEAD *p_head_hash_rb = NULL; + DPP_HASH_CFG *p_hash_cfg = NULL; + DPP_HASH_RBKEY_INFO *p_rbkey = NULL; + HASH_ENTRY_CFG hash_entry_cfg = {0}; + DPP_DTB_HASH_ENTRY_INFO_T hashEntry = {0}; + + ZXIC_COMM_CHECK_POINT_NO_ASSERT(dev); + dev_id = DEV_ID(dev); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, queue_id, 0, DTB_QUEUE_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + + //从sdt_no中获取hash配置 + rc = dpp_hash_get_hash_info_from_sdt(dev_id, sdt_no, &hash_entry_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_hash_get_hash_info_from_sdt"); + + p_hash_cfg = hash_entry_cfg.p_hash_cfg; + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_hash_cfg); + + p_head_hash_rb = &p_hash_cfg->hash_rb.tn_list; + p_node = p_head_hash_rb->p_next; + while(p_node) + { + p_rb_tn = (ZXIC_RB_TN *)p_node->data; + p_rbkey = (DPP_HASH_RBKEY_INFO *)p_rb_tn->p_key; + hashEntry.p_actu_key = p_rbkey->key+1; + hashEntry.p_rst = p_rbkey->key; + + key_valid = DPP_GET_HASH_KEY_VALID(p_rbkey->key); + table_id = DPP_GET_HASH_TBL_ID(p_rbkey->key); + key_type = DPP_GET_HASH_KEY_TYPE(p_rbkey->key); + if((!key_valid) + || (table_id != hash_entry_cfg.table_id) + || (key_type != hash_entry_cfg.key_type)) + { + p_node = p_node->next; + continue; + } + p_node = p_node->next; + + rc = dpp_dtb_hash_dma_delete(dev, queue_id,sdt_no,1,&hashEntry,&element_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_dtb_hash_dma_delete"); + } + + return DPP_OK; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/dpp_hash.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/dpp_hash.c new file mode 100755 index 0000000..cc620f8 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/dpp_hash.c @@ -0,0 +1,2960 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_hash.c +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : wcl +* 完成日期 : 2014/02/08 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#include "zxic_common.h" + +#include "dpp_dev.h" +#include "dpp_module.h" +#include "dpp_se_cfg.h" +#include "dpp_hash_crc.h" +#include "dpp_hash.h" +#include "dpp_se.h" +#include "dpp_se_reg.h" +#include "dpp_reg_api.h" +#include "dpp_reg_info.h" +#include "dpp_se4k_reg.h" +#include "dpp_sdt.h" + +#define HASH_CMP_ZCELL (1) +#define HASH_CMP_ZBLK (2) + +#define HASH_ENTRY_STAT + +/* 全局变量定义区 */ +static ZXIC_UINT32 g_ddr_hash_arg[HASH_DDR_CRC_NUM] = { + 0x04C11DB7, 0xF4ACFB13, 0x20044009, 0x00210801 +}; + +static DPP_HASH_TBL_ID_INFO g_tbl_id_info[DPP_DEV_CHANNEL_MAX][HASH_FUNC_ID_NUM][HASH_TBL_ID_NUM] = {{{{0}}}}; + +/** 4个hash引擎,每个最多使用32个zblock */ +static ZXIC_UINT32 g_hash_zblk_idx[DPP_DEV_CHANNEL_MAX][HASH_FUNC_ID_NUM][HASH_TBL_ID_NUM] = {{{0}}}; + +static DPP_HASH_SOFT_RESET_STOR_DAT g_hash_store_dat[DPP_DEV_CHANNEL_MAX] = {{{0}}}; + +static ZXIC_UINT64 g_se_cfg_point = 0; + +#if DPP_WRITE_FILE_EN +static DPP_HASH_FILE_REG_T g_hash_file_reg = { + {0x55550000, 0xffffaaaa}, {1, 1, 1, 1}, + { + {0x12121212, 0x12121212}, {0x12121212, 0x12121212}, + {0x12121212, 0x12121212}, {0x12121212, 0x12121212} + }, + 0, + 0xffff, + 0, + {0}, + {0} +}; +#endif +/* 宏函数定义区 */ +#define GET_DDR_HASH_ARG(ddr_crc_sel) (g_ddr_hash_arg[ddr_crc_sel]) +#define GET_HASH_TBL_ID_INFO(dev_id, fun_id, tbl_id) (&g_tbl_id_info[dev_id][fun_id][tbl_id]) +#define GET_ACTU_KEY_SIZE_BY_TBLID(dev_id,fun_id, tbl_id) (g_tbl_id_info[dev_id][fun_id][tbl_id].actu_key_size) + +#define HASH_TBL_ID_INFO_CHECK(dev_id,fun_id, tbl_id, key_type) \ + do{\ + if (!g_tbl_id_info[dev_id][fun_id][tbl_id].is_init || \ + (g_tbl_id_info[dev_id][fun_id][tbl_id].key_type != key_type)) \ + { \ + ZXIC_COMM_PRINT("init [%d], config ketype[%d] parameter key_type[%d].\n",\ + g_tbl_id_info[dev_id][fun_id][tbl_id].is_init, \ + g_tbl_id_info[dev_id][fun_id][tbl_id].key_type, \ + key_type);\ + ZXIC_COMM_ASSERT(0); \ + return DPP_HASH_RC_INVALID_TBL_ID_INFO; \ + } \ + }while (0) + + +#define GET_HASH_DDR_HW_ADDR(base_addr, item_idx) \ + ((base_addr) + (item_idx)) + +/* 9:zcell depth */ +#define GET_HASH_ZCAM_HW_ADDR(base_addr, zblk_idx, item_idx) \ + ((base_addr) + ((zblk_idx) << 9) + (item_idx)) + +#define DPP_GET_HASH_FILE_REG() (&g_hash_file_reg) + +/* 局部函数声明区 */ + +/* 函数实现区 */ + +#if ZXIC_REAL("inter func.") +/***********************************************************/ +/** zblock资源链表排序比较函数 +* @param data1 待比较的数据1 +* @param data2 待比较的数据2 +* @param data 排序比较的类型,1-zcell比较,2-zblock比较 +* +* @return 1-data1比data2的索引大 + 0-data1和data2索引相同 + -1-data1比data2的索引小 +* @remark 无 +* @see +* @author wcl @date 2014/11/10 +************************************************************/ +ZXIC_SINT32 dpp_hash_list_cmp(D_NODE *data1, D_NODE *data2, void *data) +{ + ZXIC_UINT32 flag = 0; + ZXIC_UINT32 data_new = 0; + ZXIC_UINT32 data_pre = 0; + + ZXIC_COMM_CHECK_POINT(data1); + ZXIC_COMM_CHECK_POINT(data2); + ZXIC_COMM_CHECK_POINT(data); + + flag = *(ZXIC_UINT32 *)data; + + if (flag == HASH_CMP_ZCELL) + { + data_new = ((SE_ZCELL_CFG *)data1->data)->zcell_idx; + data_pre = ((SE_ZCELL_CFG *)data2->data)->zcell_idx; + } + else if (flag == HASH_CMP_ZBLK) + { + data_new = ((SE_ZBLK_CFG *)data1->data)->zblk_idx; + data_pre = ((SE_ZBLK_CFG *)data2->data)->zblk_idx; + } + + if (data_new > data_pre) + { + return 1; + } + else if (data_new == data_pre) + { + return 0; + } + else + { + return -1; + } +} + +/***********************************************************/ +/** hash键值红黑树插入比较函数 +* @param p_new +* @param p_old +* @param key_size +* +* @return +* @remark 无 +* @see +* @author wcl @date 2014/11/10 +************************************************************/ +ZXIC_SINT32 dpp_hash_rb_key_cmp(ZXIC_VOID *p_new, ZXIC_VOID *p_old, ZXIC_UINT32 key_size) +{ + DPP_HASH_RBKEY_INFO *p_rbkey_new = NULL; + DPP_HASH_RBKEY_INFO *p_rbkey_old = NULL; + + ZXIC_COMM_CHECK_POINT(p_new); + ZXIC_COMM_CHECK_POINT(p_old); + p_rbkey_new = (DPP_HASH_RBKEY_INFO *)(p_new); + p_rbkey_old = (DPP_HASH_RBKEY_INFO *)(p_old); + + return ZXIC_COMM_MEMCMP(p_rbkey_new->key, p_rbkey_old->key, HASH_KEY_MAX); +} + +/***********************************************************/ +/** hash键值红黑树插入比较函数 +* @param p_new +* @param p_old +* @param key_size +* +* @return +* @remark 无 +* @see +* @author tf @date 2016/03/26 +************************************************************/ +ZXIC_SINT32 dpp_hash_ddr_cfg_rb_key_cmp(ZXIC_VOID *p_new, ZXIC_VOID *p_old, ZXIC_UINT32 key_size) +{ + HASH_DDR_CFG *p_rbkey_new = NULL; + HASH_DDR_CFG *p_rbkey_old = NULL; + + ZXIC_COMM_CHECK_POINT(p_new); + ZXIC_COMM_CHECK_POINT(p_old); + p_rbkey_new = (HASH_DDR_CFG *)(p_new); + p_rbkey_old = (HASH_DDR_CFG *)(p_old); + + return ZXIC_COMM_MEMCMP(&p_rbkey_new->ddr_baddr, &p_rbkey_old->ddr_baddr, sizeof(ZXIC_UINT32)); +} + +/***********************************************************/ +/** 获取位宽 +* @param ddr_item_num +* +* @return +* @remark 无 +* @see +* @author wcl @date 2014/11/10 +************************************************************/ +ZXIC_UINT32 dpp_hash_ddr_depth_conv(ZXIC_UINT32 ddr_item_num) +{ + ZXIC_UINT32 count = 0; + + while (ddr_item_num > ((ZXIC_UINT32)1 << count)) + { + count++; + } + + return count; +} + +/***********************************************************/ +/** 片内资源初始化 +* @param p_hash_cfg +* @param zblk_num +* @param zblk_idx_array +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wcl @date 2015/10/13 +************************************************************/ +DPP_STATUS dpp_hash_zcam_resource_init(DPP_HASH_CFG *p_hash_cfg, ZXIC_UINT32 zblk_num, ZXIC_UINT32 *zblk_idx_array) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + ZXIC_UINT32 cmp_type = 0; + ZXIC_UINT32 zblk_idx = 0; + ZXIC_UINT32 zcell_idx = 0; + ZXIC_UINT32 dev_id = 0; + + D_HEAD *p_zblk_list = NULL; + D_HEAD *p_zcell_free = NULL; + SE_ZBLK_CFG *p_zblk_cfg = NULL; + SE_ZCELL_CFG *p_zcell_cfg = NULL; + + ZXIC_COMM_CHECK_POINT(p_hash_cfg); + ZXIC_COMM_CHECK_INDEX(zblk_num, 0, SE_ZBLK_NUM); + ZXIC_COMM_CHECK_POINT(zblk_idx_array); + + dev_id = p_hash_cfg->p_se_info->dev_id; + + /* init zblock list */ + p_zblk_list = &p_hash_cfg->hash_shareram.zblk_list; + rc = zxic_comm_double_link_init(SE_ZBLK_NUM, p_zblk_list); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "zxic_comm_double_link_init"); + + /* init zcell list */ + p_zcell_free = &p_hash_cfg->hash_shareram.zcell_free_list; + rc = zxic_comm_double_link_init(SE_ZBLK_NUM * SE_ZCELL_NUM, p_zcell_free); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "zxic_comm_double_link_init"); + + for (i = 0; i < zblk_num; i++) + { + zblk_idx = zblk_idx_array[i]; + /* debug start */ + //ZXIC_COMM_PRINT("zblk_idx is [%d]\n", zblk_idx); /* t */ + /* debug end */ + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, zblk_idx, 0, SE_ZBLK_NUM - 1); + p_zblk_cfg = DPP_SE_GET_ZBLK_CFG(p_hash_cfg->p_se_info, zblk_idx); + + if (p_zblk_cfg->is_used) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "ErrorCode:[0x%x], ZBlock[%d] is already used by other function!\n", \ + DPP_HASH_RC_INVALID_ZBLCK, zblk_idx); + ZXIC_COMM_ASSERT(0); + return DPP_HASH_RC_INVALID_ZBLCK; + } + + for (j = 0; j < SE_ZCELL_NUM; j++) + { + zcell_idx = p_zblk_cfg->zcell_info[j].zcell_idx; + p_zcell_cfg = DPP_SE_GET_ZCELL_CFG(p_hash_cfg->p_se_info, zcell_idx); + + if (p_zcell_cfg->is_used) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "ErrorCode:[0x%x], ZBlk[%d], ZCell[%d] is already used by other function!\n", \ + DPP_HASH_RC_INVALID_ZCELL, zblk_idx, zcell_idx); + ZXIC_COMM_ASSERT(0); + return DPP_HASH_RC_INVALID_ZCELL; + } + + p_zcell_cfg->is_used = 1; + + /* insert to free zcell free list */ + cmp_type = HASH_CMP_ZCELL; + rc = zxic_comm_double_link_insert_sort(&p_zcell_cfg->zcell_dn, p_zcell_free, dpp_hash_list_cmp, &cmp_type); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "zxic_comm_double_link_insert_sort"); + } + + /* insert to zblock list */ + p_zblk_cfg->is_used = 1; + cmp_type = HASH_CMP_ZBLK; + rc = zxic_comm_double_link_insert_sort(&p_zblk_cfg->zblk_dn, p_zblk_list, dpp_hash_list_cmp, &cmp_type); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "zxic_comm_double_link_insert_last"); + + /* config zblock */ + rc = dpp_hash_zblkcfg_write(p_hash_cfg->p_se_info, p_hash_cfg->fun_id, p_zblk_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_hash_zblkcfg_write"); + } + + return DPP_OK; +} + +/***********************************************************/ +/** +* @param p_hash_cfg +* +* @return +* @remark 无 +* @see +* @author XCX @date 2018/03/22 +************************************************************/ +DPP_STATUS dpp_hash_zcam_resource_deinit(DPP_HASH_CFG *p_hash_cfg) +{ + ZXIC_UINT32 rc = 0; + ZXIC_UINT32 dev_id = 0; + + D_NODE *p_node = NULL; + D_HEAD *p_head = NULL; + SE_ZBLK_CFG *p_zblk_cfg = NULL; + SE_ZCELL_CFG *p_zcell_cfg = NULL; + + ZXIC_COMM_CHECK_POINT(p_hash_cfg); + + dev_id = p_hash_cfg->p_se_info->dev_id; + + /*delete zcell node*/ + p_head = &p_hash_cfg->hash_shareram.zcell_free_list; + + while (p_head->used) + { + p_node = p_head->p_next; + + rc = zxic_comm_double_link_del(p_node, p_head); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "zxic_comm_double_link_del"); + p_zcell_cfg = (SE_ZCELL_CFG *)p_node->data; + p_zcell_cfg->is_used = 0; + } + + /*delete zblk node*/ + p_head = &p_hash_cfg->hash_shareram.zblk_list; + + while (p_head->used) + { + p_node = p_head->p_next; + + rc = zxic_comm_double_link_del(p_node, p_head); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "zxic_comm_double_link_del"); + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, ((SE_ZBLK_CFG *)p_node->data)->zblk_idx, 0, HASH_ZBLK_ID_MAX); + p_zblk_cfg = DPP_SE_GET_ZBLK_CFG(p_hash_cfg->p_se_info, ((SE_ZBLK_CFG *)p_node->data)->zblk_idx); + p_zblk_cfg->is_used = 0; + + /*clear zblk config*/ + /* dpp_hash_zblkcfg_clr(p_hash_cfg->p_se_info, p_hash_cfg->fun_id, p_zblk_cfg); */ + } + + return DPP_OK; +} + +/***********************************************************/ +/** +* @param item_entry_max +* @param wrt_mask +* @param entry_size +* +* @return +* @remark 无 +* @see +* @author XCX @date 2018/03/22 +************************************************************/ +ZXIC_UINT32 dpp_hash_get_item_free_pos(ZXIC_UINT32 item_entry_max, ZXIC_UINT32 wrt_mask, ZXIC_UINT32 entry_size) +{ + ZXIC_UINT32 i = 0; + ZXIC_UINT32 pos = 0xFFFFFFFF;/* -1; */ + ZXIC_UINT32 mask = 0; + + for (i = 0; i < item_entry_max; i += entry_size / HASH_ENTRY_POS_STEP) + { + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(i, entry_size / HASH_ENTRY_POS_STEP); + mask = DPP_GET_HASH_ENTRY_MASK(entry_size, i); + + if (0 == (mask & wrt_mask)) + { + pos = i; + break; + } + } + + return pos; +} + +/***********************************************************/ +/** +* @param p_hash_cfg +* @param p_rbkey +* @param p_item +* @param item_idx +* @param item_type +* @param insrt_key_type +* +* @return +* @remark 无 +* @see +* @author XCX @date 2018/03/22 +************************************************************/ +DPP_STATUS dpp_hash_insrt_to_item(DPP_HASH_CFG *p_hash_cfg, + DPP_HASH_RBKEY_INFO *p_rbkey, + SE_ITEM_CFG *p_item, + ZXIC_UINT32 item_idx, + ZXIC_UINT32 item_type, + ZXIC_UINT32 insrt_key_type) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 free_pos = 0; + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 item_entry_max = ITEM_ENTRY_NUM_4; + + ZXIC_COMM_CHECK_POINT(p_hash_cfg); + ZXIC_COMM_CHECK_POINT(p_rbkey); + ZXIC_COMM_CHECK_POINT(p_item); + + dev_id = p_hash_cfg->p_se_info->dev_id; + + if (ITEM_DDR_256 == item_type) + { + item_entry_max = ITEM_ENTRY_NUM_2; + } + + if (!p_item->valid) /* item is not used */ + { + rc = zxic_comm_double_link_init(item_entry_max, &p_item->item_list); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "zxic_comm_double_link_init"); + + p_rbkey->entry_pos = HASH_ITEM_POS_0; + p_item->wrt_mask = DPP_GET_HASH_ENTRY_MASK(p_rbkey->entry_size, p_rbkey->entry_pos); + p_item->item_index = item_idx; + p_item->item_type = item_type; + p_item->valid = 1; + } + else + { + free_pos = dpp_hash_get_item_free_pos(item_entry_max, p_item->wrt_mask, p_rbkey->entry_size); + + if (0xFFFFFFFF == free_pos) + { + return DPP_HASH_RC_ITEM_FULL; + } + else + { + p_rbkey->entry_pos = free_pos; + p_item->wrt_mask |= DPP_GET_HASH_ENTRY_MASK(p_rbkey->entry_size, p_rbkey->entry_pos); + } + } + + /* debug*/ + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "Entry in item pos is: [%d], entry size is: [%d].\n", free_pos, p_rbkey->entry_size); + + rc = zxic_comm_double_link_insert_last(&p_rbkey->entry_dn, &p_item->item_list); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "zxic_comm_double_link_insert_last"); + + p_rbkey->p_item_info = p_item; + + return DPP_OK; +} + +#endif + +#if ZXIC_REAL("External Func.") +/***********************************************************/ +/** 单个hash引擎初始化 +* @param p_se_cfg 算法模块公共管理数据结构指针 +* @param fun_id hash引擎号 +* @param zblk_num 分配给此hash引擎的zblock数目 +* @param zblk_idx 分配给此hash引擎的zblock编号 +* @param ddr_dis DDR关闭位,0-不关闭片外DDR, 1-关闭片外DDR +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wcl @date 2015/05/15 +************************************************************/ +DPP_STATUS dpp_hash_init(DPP_SE_CFG *p_se_cfg, + ZXIC_UINT32 fun_id, + ZXIC_UINT32 zblk_num, + ZXIC_UINT32 *zblk_idx, + ZXIC_UINT32 ddr_dis) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 i = 0; + ZXIC_UINT32 dev_id = 0; + + FUNC_ID_INFO *p_func_info = NULL; + DPP_HASH_CFG *p_hash_cfg = NULL; + + ZXIC_COMM_CHECK_POINT(p_se_cfg); + ZXIC_COMM_CHECK_POINT(zblk_idx); + ZXIC_COMM_CHECK_INDEX(fun_id, HASH_FUNC_ID_MIN, HASH_FUNC_ID_NUM - 1); + ZXIC_COMM_CHECK_INDEX(zblk_num, 0, SE_ZBLK_NUM); + ZXIC_COMM_CHECK_INDEX(ddr_dis, 0, 1); + + dev_id = p_se_cfg->dev_id; + ZXIC_COMM_CHECK_INDEX_UPPER(dev_id,DPP_DEV_CHANNEL_MAX - 1); + + rc = dpp_se_fun_init(p_se_cfg, (fun_id & 0xff), FUN_HASH); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_se_fun_init"); + + p_func_info = DPP_GET_FUN_INFO(p_se_cfg, fun_id); + p_hash_cfg = (DPP_HASH_CFG *)p_func_info->fun_ptr; + p_hash_cfg->fun_id = fun_id; + p_hash_cfg->p_hash32_fun = dpp_crc32_calc; + p_hash_cfg->p_hash16_fun = dpp_crc16_calc; + p_hash_cfg->p_se_info = p_se_cfg; + + /* 判定hash引擎是片内模式还是混合模式*/ + if (ddr_dis == 1) + { + /* disable ddr */ + p_hash_cfg->ddr_valid = 0; + +#ifdef DPP_FLOW_HW_INIT + rc = dpp_hash_ext_cfg_clr(p_se_cfg, fun_id); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_hash_ddrcfg_clr"); + + rc = dpp_hash_tbl_depth_clr(p_se_cfg, fun_id); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_hash_tbl_depth_clr"); +#endif + + } + else + { + p_hash_cfg->ddr_valid = 1; + + } + + /* zcam初始化*/ + p_hash_cfg->hash_stat.zblock_num = zblk_num; + rc = dpp_hash_zcam_resource_init(p_hash_cfg, zblk_num, zblk_idx); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_hash_zcam_resource_init"); + + /* 将zblock_id记录在软件缓存中 */ + for(i = 0; i < zblk_num; i++) + { + p_hash_cfg->hash_stat.zblock_array[i] = zblk_idx[i]; + } + + /* dynamic alloc rb_tree node by user. */ + rc = (DPP_STATUS)zxic_comm_rb_init(&p_hash_cfg->hash_rb, + 0, + sizeof(DPP_HASH_RBKEY_INFO), + dpp_hash_rb_key_cmp); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "zxic_comm_rb_init"); + + /* dynamic alloc rb_tree node by user. */ + rc = (DPP_STATUS)zxic_comm_rb_init(&p_hash_cfg->ddr_cfg_rb, + 0, + sizeof(HASH_DDR_CFG), + dpp_hash_ddr_cfg_rb_key_cmp); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "zxic_comm_rb_init"); + + /** for 软复位 */ + /** 保存zblock内容 */ + for (i = 0; i < zblk_num; i++) + { + g_hash_zblk_idx[dev_id][fun_id][i] = zblk_idx[i]; + } + + g_hash_store_dat[dev_id].ddr_dis_flag[fun_id] = ddr_dis; + g_hash_store_dat[dev_id].zblk_num[fun_id] = zblk_num; + g_hash_store_dat[dev_id].zblk_idx_start[fun_id] = g_hash_zblk_idx[dev_id][fun_id]; + g_hash_store_dat[dev_id].hash_id_valid |= (ZXIC_UINT32)((1U << fun_id) & 0xffffffff); + + /** for diag */ + g_se_cfg_point = ZXIC_COMM_PTR_TO_VAL(p_se_cfg); + + return DPP_OK; +} + +/***********************************************************/ +/** 初始化单个hash引擎内的某个业务表,此接口支持为该业务表分配独占的zcell。 +* 必须先初始化hash引擎,再初始化业务表。 +* @param p_se_cfg 算法模块公共管理数据结构指针 +* @param fun_id hash引擎号 +* @param bulk_id 每个Hash引擎资源划分的空间ID号 +* @param p_ddr_resc_cfg 分配给hash引擎此资源空间的ddr资源属性 +* @param zcell_num 分配给hash引擎此资源空间的zcell数量 +* @param zreg_num 分配给hash引擎此资源空间的zreg数量 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wcl @date 2015/05/15 +************************************************************/ +DPP_STATUS dpp_hash_bulk_init(DPP_SE_CFG *p_se_cfg, + ZXIC_UINT32 fun_id, + ZXIC_UINT32 bulk_id, + DPP_HASH_DDR_RESC_CFG_T *p_ddr_resc_cfg, + ZXIC_UINT32 zcell_num, + ZXIC_UINT32 zreg_num) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + ZXIC_UINT32 zblk_idx = 0; + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 ddr_item_num = 0; + + D_NODE *p_zblk_dn = NULL; + D_NODE *p_zcell_dn = NULL; + ZXIC_RB_TN *p_rb_tn_new = NULL; + ZXIC_RB_TN *p_rb_tn_rtn = NULL; + SE_ZBLK_CFG *p_zblk_cfg = NULL; + SE_ZREG_CFG *p_zreg_cfg = NULL; + HASH_DDR_CFG *p_ddr_cfg = NULL; + HASH_DDR_CFG *p_rbkey_new = NULL; + HASH_DDR_CFG *p_rbkey_rtn = NULL; + SE_ZCELL_CFG *p_zcell_cfg = NULL; + DPP_HASH_CFG *p_hash_cfg = NULL; + FUNC_ID_INFO *p_func_info = NULL; + SE_ITEM_CFG **p_item_array = NULL; + DPP_HASH_BULK_ZCAM_STAT *p_bulk_zcam_mono = NULL; + /* D_HEAD *p_zcell_free = NULL;*/ + /* D_HEAD *p_zblk_free = NULL;*/ + + ZXIC_COMM_CHECK_POINT(p_se_cfg); + ZXIC_COMM_CHECK_POINT(p_ddr_resc_cfg); + ZXIC_COMM_CHECK_INDEX(p_ddr_resc_cfg->ddr_crc_sel, 0, HASH_DDR_CRC_NUM - 1); + ZXIC_COMM_CHECK_INDEX(fun_id, DPP_HASH_ID_MIN, DPP_HASH_ID_MAX); + ZXIC_COMM_CHECK_INDEX(bulk_id, HASH_BULK_ID_MIN, HASH_BULK_ID_MAX); + ZXIC_COMM_CHECK_INDEX(zcell_num, 0, SE_ZBLK_NUM * SE_ZCELL_NUM); + ZXIC_COMM_CHECK_INDEX(zreg_num, 0, SE_ZBLK_NUM * SE_ZREG_NUM); + + dev_id = p_se_cfg->dev_id; + + p_func_info = DPP_GET_FUN_INFO(p_se_cfg, fun_id); + p_hash_cfg = (DPP_HASH_CFG *)p_func_info->fun_ptr; + ZXIC_COMM_CHECK_POINT(p_hash_cfg); + + ZXIC_COMM_TRACE_INFO("p_hash_cfg->ddr_valid = %d!\n", p_hash_cfg->ddr_valid); + + if (1 == p_hash_cfg->ddr_valid) + { + /* [a long time ago] hash存储深度不能超过26bit,不然会导致硬件逻辑crc index不一致,微码查表不中 */ + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, p_ddr_resc_cfg->ddr_item_num, HASH_DDR_ITEM_MIN, HASH_DDR_ITEM_MAX); + + ddr_item_num = p_ddr_resc_cfg->ddr_item_num; + + if (DDR_WIDTH_512b == p_ddr_resc_cfg->ddr_width_mode) + { + ddr_item_num = p_ddr_resc_cfg->ddr_item_num >> 1; + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, ddr_item_num, HASH_DDR_ITEM_MIN, HASH_DDR_ITEM_MAX); /* 512bit存储时,hash存储深度不能少于14bit */ + } + + /** red&black key*/ + p_rbkey_new = (HASH_DDR_CFG *)ZXIC_COMM_MALLOC(sizeof(HASH_DDR_CFG)); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_rbkey_new); + ZXIC_COMM_MEMSET(p_rbkey_new, 0, sizeof(HASH_DDR_CFG)); + + p_rbkey_new->ddr_baddr = p_ddr_resc_cfg->ddr_baddr; + + /** red&black tree node*/ + p_rb_tn_new = (ZXIC_RB_TN *)ZXIC_COMM_MALLOC(sizeof(ZXIC_RB_TN)); + if (NULL == (p_rb_tn_new)) + { + ZXIC_COMM_FREE(p_rbkey_new); + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ICM %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__); + return ZXIC_PAR_CHK_POINT_NULL; + } + INIT_RBT_TN(p_rb_tn_new, p_rbkey_new); + + rc = zxic_comm_rb_insert(&p_hash_cfg->ddr_cfg_rb, (ZXIC_VOID *)p_rb_tn_new, (ZXIC_VOID *)(&p_rb_tn_rtn)); + if (ZXIC_RBT_RC_FULL == rc) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "The red black tree is full!\n"); + ZXIC_COMM_FREE(p_rbkey_new); + ZXIC_COMM_FREE(p_rb_tn_new); + ZXIC_COMM_ASSERT(0); + return DPP_HASH_RC_RB_TREE_FULL; + } + else if (ZXIC_RBT_RC_UPDATE == rc) + { + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "some bulk_id share one bulk!\n"); + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_rb_tn_rtn); + p_rbkey_rtn = (HASH_DDR_CFG *)(p_rb_tn_rtn->p_key); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, p_rbkey_rtn->bulk_id, 0, HASH_BULK_NUM - 1); + p_ddr_cfg = p_hash_cfg->p_bulk_ddr_info[p_rbkey_rtn->bulk_id]; /* 已经初始化过的ddr_bulk_id属性 */ + + if (p_ddr_cfg->hash_ddr_arg != GET_DDR_HASH_ARG(p_ddr_resc_cfg->ddr_crc_sel) || + p_ddr_cfg->width_mode != p_ddr_resc_cfg->ddr_width_mode || + p_ddr_cfg->ddr_ecc_en != p_ddr_resc_cfg->ddr_ecc_en || + p_ddr_cfg->item_num != ddr_item_num) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "The base address is same but other ddr attribute is different\n"); + ZXIC_COMM_FREE(p_rbkey_new); + ZXIC_COMM_FREE(p_rb_tn_new); + ZXIC_COMM_ASSERT(0); + return DPP_HASH_RC_INVALID_PARA; + } + + p_hash_cfg->p_bulk_ddr_info[bulk_id] = p_hash_cfg->p_bulk_ddr_info[p_rbkey_rtn->bulk_id]; + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "bulk id init bulk_ddr_cfg ptr is:"); + + for (i = 0; i < HASH_BULK_NUM; i++) + { + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "%p ", p_hash_cfg->p_bulk_ddr_info[i]); + } + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "\n"); + + ZXIC_COMM_FREE(p_rbkey_new); + ZXIC_COMM_FREE(p_rb_tn_new); + } + else + { + p_item_array = (SE_ITEM_CFG **)ZXIC_COMM_MALLOC(ddr_item_num * sizeof(SE_ITEM_CFG *)); + if (NULL == (p_item_array)) + { + ZXIC_COMM_FREE(p_rbkey_new); + ZXIC_COMM_FREE(p_rb_tn_new); + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ICM %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__); + return ZXIC_PAR_CHK_POINT_NULL; + } + ZXIC_COMM_MEMSET(p_item_array, 0, ddr_item_num * sizeof(SE_ITEM_CFG *)); + + p_rbkey_new->p_item_array = p_item_array; + p_rbkey_new->bulk_id = bulk_id; + p_rbkey_new->hw_baddr = 0; + p_rbkey_new->width_mode = p_ddr_resc_cfg->ddr_width_mode; + p_rbkey_new->item_num = ddr_item_num; + p_rbkey_new->ddr_ecc_en = p_ddr_resc_cfg->ddr_ecc_en; + p_rbkey_new->hash_ddr_arg = GET_DDR_HASH_ARG(p_ddr_resc_cfg->ddr_crc_sel); + p_rbkey_new->bulk_use = 1; + p_rbkey_new->zcell_num = zcell_num; + p_rbkey_new->zreg_num = zreg_num; + p_hash_cfg->p_bulk_ddr_info[bulk_id] = p_rbkey_new; + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "one new ddr_bulk init!\n"); + } +#ifdef DPP_FLOW_HW_INIT + rc = dpp_hash_tbl_crc_poly_write(p_hash_cfg->p_se_info, p_hash_cfg->fun_id, bulk_id, p_ddr_resc_cfg->ddr_crc_sel); + if (DPP_OK != rc) + { + ZXIC_COMM_FREE(p_rbkey_new); + ZXIC_COMM_FREE(p_rb_tn_new); + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ICM %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,"dpp_hash_tbl_crc_poly_write"); + return rc; + } + + rc = dpp_hash_ext_cfg_write(p_hash_cfg->p_se_info, p_hash_cfg->fun_id, bulk_id, p_hash_cfg->p_bulk_ddr_info[bulk_id]); + if (DPP_OK != rc) + { + ZXIC_COMM_FREE(p_rbkey_new); + ZXIC_COMM_FREE(p_rb_tn_new); + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ICM %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,"dpp_hash_ext_cfg_write"); + return rc; + } + rc = dpp_hash_tbl_depth_write(p_hash_cfg->p_se_info, + p_hash_cfg->fun_id, + bulk_id, + p_hash_cfg->p_bulk_ddr_info[bulk_id]); + if (DPP_OK != rc) + { + ZXIC_COMM_FREE(p_rbkey_new); + ZXIC_COMM_FREE(p_rb_tn_new); + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ICM %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,"dpp_hash_tbl_depth_write"); + return rc; + } +#endif + rc = dpp_se_smmu1_hash_tbl_cfg_set(p_se_cfg->dev, p_hash_cfg->fun_id, bulk_id, p_ddr_resc_cfg->ddr_ecc_en, p_ddr_resc_cfg->ddr_baddr); + if (DPP_OK != rc) + { + ZXIC_COMM_FREE(p_rbkey_new); + ZXIC_COMM_FREE(p_rb_tn_new); + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ICM %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,"dpp_se_smmu1_hash_tbl_cfg_set"); + return rc; + } + + } + + p_bulk_zcam_mono = (DPP_HASH_BULK_ZCAM_STAT *)ZXIC_COMM_MALLOC(sizeof(DPP_HASH_BULK_ZCAM_STAT)); + if (NULL == (p_bulk_zcam_mono)) + { + ZXIC_COMM_FREE(p_rbkey_new); + ZXIC_COMM_FREE(p_rb_tn_new); + ZXIC_COMM_FREE(p_item_array); + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ICM %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__); + return ZXIC_PAR_CHK_POINT_NULL; + } + ZXIC_COMM_MEMSET(p_bulk_zcam_mono, 0, sizeof(DPP_HASH_BULK_ZCAM_STAT)); + (&p_hash_cfg->hash_stat)->p_bulk_zcam_mono[bulk_id] = p_bulk_zcam_mono; + + for (i = 0; i < SE_ZBLK_NUM * SE_ZCELL_NUM; i++) + { + p_bulk_zcam_mono->zcell_mono_idx[i] = 0xffffffff; + } + + for (i = 0; i < SE_ZBLK_NUM; i++) + { + for (j = 0; j < SE_ZREG_NUM; j++) + { + p_bulk_zcam_mono->zreg_mono_id[i][j].zblk_id = 0xffffffff; + p_bulk_zcam_mono->zreg_mono_id[i][j].zreg_id = 0xffffffff; + } + } + + if (zcell_num > 0) + { + p_hash_cfg->bulk_ram_mono[bulk_id] = 1; + +#ifdef DPP_FLOW_HW_INIT + rc = dpp_hash_bulk_mono_flags_write(p_se_cfg, fun_id, bulk_id); + if (DPP_OK != rc) + { + ZXIC_COMM_FREE(p_rbkey_new); + ZXIC_COMM_FREE(p_rb_tn_new); + ZXIC_COMM_FREE(p_item_array); + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ICM %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,"dpp_hash_bulk_mono_flags_write"); + return rc; + } +#endif + + /* 初始分配此业务表独占的zcell,只能在非独占的zcell中分配 */ + /* p_zcell_free = &(p_hash_cfg->hash_shareram.zcell_free_list);*/ + p_zcell_dn = p_hash_cfg->hash_shareram.zcell_free_list.p_next; + + i = 0; + + while (p_zcell_dn) + { + p_zcell_cfg = (SE_ZCELL_CFG *)p_zcell_dn->data; + + if (p_zcell_cfg->is_used) + { + if (!(p_zcell_cfg->flag & DPP_ZCELL_FLAG_IS_MONO)) + { + p_zcell_cfg->flag |= DPP_ZCELL_FLAG_IS_MONO; + p_zcell_cfg->bulk_id = bulk_id; + +#ifdef DPP_FLOW_HW_INIT + rc = dpp_hash_zcell_mono_write(p_se_cfg, p_zcell_cfg); /* 写入硬件 */ + if (DPP_OK != rc) + { + ZXIC_COMM_FREE(p_rbkey_new); + ZXIC_COMM_FREE(p_rb_tn_new); + ZXIC_COMM_FREE(p_item_array); + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ICM %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,"dpp_hash_zcell_mono_write"); + return rc; + } +#endif + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, p_zcell_cfg->zcell_idx, 0, SE_ZCELL_TOTAL_NUM - 1); + p_bulk_zcam_mono->zcell_mono_idx[p_zcell_cfg->zcell_idx] = p_zcell_cfg->zcell_idx; /* 统计独占的zcell */ + + if (++i >= zcell_num) + { + break; + } + } + } + else + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "zcell[ %d ] is not init before used!\n", p_zcell_cfg->zcell_idx); + ZXIC_COMM_ASSERT(0); + return DPP_HASH_RC_INVALID_PARA; + } + + p_zcell_dn = p_zcell_dn->next; + } + + if (i < zcell_num) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "Input param 'zcell_num' is [ %d ], actually bulk[ %d ]monopolize zcells is [ %d ]!\n", zcell_num, bulk_id, i); + } + } + + if (zreg_num > 0) + { + p_hash_cfg->bulk_ram_mono[bulk_id] = 1; + +#ifdef DPP_FLOW_HW_INIT + rc = dpp_hash_bulk_mono_flags_write(p_se_cfg, fun_id, bulk_id); + if (DPP_OK != rc) + { + ZXIC_COMM_FREE(p_rbkey_new); + ZXIC_COMM_FREE(p_rb_tn_new); + ZXIC_COMM_FREE(p_item_array); + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ICM %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,"dpp_hash_bulk_mono_flags_write"); + return rc; + } +#endif + /* p_tbl_id_info->zreg_num= zreg_num;*/ + + /* 初始分配此业务表独占的zreg,只能在非独占的zreg中分配 */ + /* p_zblk_free = &(p_hash_cfg->hash_shareram.zblk_list);*/ + p_zblk_dn = p_hash_cfg->hash_shareram.zblk_list.p_next; + j = 0; + + while (p_zblk_dn) + { + p_zblk_cfg = (SE_ZBLK_CFG *)p_zblk_dn->data; + zblk_idx = p_zblk_cfg->zblk_idx; + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, zblk_idx, 0, SE_ZBLK_NUM - 1); + + if (p_zblk_cfg->is_used) + { + for (i = 0; i < SE_ZREG_NUM; i++) + { + p_zreg_cfg = &(p_zblk_cfg->zreg_info[i]); + + if (!(p_zreg_cfg->flag & DPP_ZREG_FLAG_IS_MONO)) + { + p_zreg_cfg->flag = DPP_ZREG_FLAG_IS_MONO; + p_zreg_cfg->bulk_id = bulk_id; +#ifdef DPP_FLOW_HW_INIT + rc = dpp_hash_zreg_mono_write(p_se_cfg, bulk_id, zblk_idx, i); /* 写入硬件 */ + if (DPP_OK != rc) + { + ZXIC_COMM_FREE(p_rbkey_new); + ZXIC_COMM_FREE(p_rb_tn_new); + ZXIC_COMM_FREE(p_item_array); + ZXIC_COMM_TRACE_DEV_ERROR(dev_id,"\n ICM %s:%d [ErrorCode:0x%x] !-- %s Call %s Fail!\n",__FILE__,__LINE__,rc,__FUNCTION__,"dpp_hash_zreg_mono_write"); + return rc; + } +#endif + p_bulk_zcam_mono->zreg_mono_id[zblk_idx][i].zblk_id = zblk_idx; + p_bulk_zcam_mono->zreg_mono_id[zblk_idx][i].zreg_id = i; + + if (++j >= zreg_num) + { + break; + } + } + } + + if (j >= zreg_num) + { + break; + } + } + else + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "zblk [ %d ] is not init before used!\n", p_zblk_cfg->zblk_idx); + ZXIC_COMM_ASSERT(0); + return DPP_HASH_RC_INVALID_PARA; + } + + p_zblk_dn = p_zblk_dn->next; + } + + if (j < zreg_num) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "Input param 'zreg_num' is [ %d ], actually bulk[ %d ]monopolize zregs is [ %d ]!\n", zreg_num, bulk_id, j); + } + } + + /** for 软复位 */ + ZXIC_COMM_CHECK_INDEX_UPPER(dev_id,DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_INDEX(fun_id, 0, 3); + ZXIC_COMM_CHECK_INDEX(bulk_id, 0, 7); + g_hash_store_dat[dev_id].ddr_item_num[fun_id][bulk_id] = p_ddr_resc_cfg->ddr_item_num; + + return DPP_OK; +} + +/***********************************************************/ +/** 初始化单个hash引擎内的某个业务表,此接口支持为该业务表分配独占的zcell。 +* 必须先初始化hash引擎,如果是片内+片外模式还必须先初始化dpp_hash_ddr_bulk_init, +* 再初始化业务表。 +* @param p_se_cfg 算法模块公共管理数据结构指针 +* @param fun_id hash引擎号 +* @param tbl_id 业务表 +* @param tbl_flag 初始化标记, bitmap的形式使用,如:HASH_TBL_FLAG_AGE等 +* @param key_type hash条目类型,取值参照DPP_HASH_KEY_TYPE的定义 +* @param actu_key_size 业务键值有效长度: 8bit*N,N=1~48 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wcl @date 2015/05/15 +************************************************************/ +DPP_STATUS dpp_hash_tbl_id_info_init(DPP_SE_CFG *p_se_cfg, + ZXIC_UINT32 fun_id, + ZXIC_UINT32 tbl_id, + ZXIC_UINT32 tbl_flag, + ZXIC_UINT32 key_type, + ZXIC_UINT32 actu_key_size) +{ + ZXIC_UINT32 key_by_size = 0; + ZXIC_UINT32 entry_size = 0; + + ZXIC_UINT32 dev_id = 0; + + DPP_HASH_TBL_ID_INFO *p_tbl_id_info = NULL; + + ZXIC_COMM_CHECK_INDEX(tbl_id, 0, HASH_TBL_ID_NUM - 1); + ZXIC_COMM_CHECK_INDEX(fun_id, HASH_FUNC_ID_MIN, HASH_FUNC_ID_NUM - 1); + ZXIC_COMM_CHECK_INDEX(actu_key_size, HASH_ACTU_KEY_MIN, HASH_ACTU_KEY_MAX); + ZXIC_COMM_CHECK_INDEX(key_type, HASH_KEY_128b, HASH_KEY_512b); + ZXIC_COMM_CHECK_POINT(p_se_cfg); + + dev_id = p_se_cfg->dev_id; + ZXIC_COMM_CHECK_INDEX_UPPER(dev_id,DPP_DEV_CHANNEL_MAX - 1); + key_by_size = DPP_GET_KEY_SIZE(actu_key_size); + entry_size = DPP_GET_HASH_ENTRY_SIZE(key_type); + + if (key_by_size > entry_size) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "ErrorCode[%x]: actu_key_size[%d] not match to key_type[%d].\n", + DPP_HASH_RC_INVALID_PARA, + key_by_size, + entry_size); + ZXIC_COMM_ASSERT(0); + return DPP_HASH_RC_INVALID_PARA; + } + + p_tbl_id_info = GET_HASH_TBL_ID_INFO(dev_id, fun_id, tbl_id); + + if (p_tbl_id_info->is_init) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "fun_id[%d],table_id[%d] is already init, do not init again!\n", fun_id, tbl_id); + return DPP_HASH_RC_REPEAT_INIT; + } + + p_tbl_id_info->fun_id = fun_id; + p_tbl_id_info->actu_key_size = actu_key_size; + p_tbl_id_info->key_type = key_type; + p_tbl_id_info->is_init = 1; + + if (tbl_flag & HASH_TBL_FLAG_AGE) + { + p_tbl_id_info->is_age = 1; + } + + if (tbl_flag & HASH_TBL_FLAG_LEARN) + { + p_tbl_id_info->is_lrn = 1; + } + + if (tbl_flag & HASH_TBL_FLAG_MC_WRT) + { + p_tbl_id_info->is_mc_wrt = 1; + } + + return DPP_OK; +} + +DPP_STATUS dpp_hash_red_black_node_alloc(DPP_DEV_T *dev,ZXIC_RB_TN **p_rb_tn_new,DPP_HASH_RBKEY_INFO **p_rbkey_new) +{ + ZXIC_RB_TN *p_rb_tn_new_temp = NULL; + DPP_HASH_RBKEY_INFO *p_rbkey_new_temp = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + + /** red&black key*/ + p_rbkey_new_temp = (DPP_HASH_RBKEY_INFO *)ZXIC_COMM_MALLOC(sizeof(DPP_HASH_RBKEY_INFO)); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_rbkey_new_temp); + ZXIC_COMM_MEMSET(p_rbkey_new_temp, 0, sizeof(DPP_HASH_RBKEY_INFO)); + + /** red&black tree node*/ + p_rb_tn_new_temp = (ZXIC_RB_TN *)ZXIC_COMM_MALLOC(sizeof(ZXIC_RB_TN)); + if (NULL == p_rb_tn_new_temp) + { + ZXIC_COMM_FREE(p_rbkey_new_temp); + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev),"\n ICM %s:%d[Error:POINT NULL] ! FUNCTION : %s!\n",__FILE__,__LINE__,__FUNCTION__); + return ZXIC_PAR_CHK_POINT_NULL; + } + + INIT_RBT_TN(p_rb_tn_new_temp, p_rbkey_new_temp); + + *p_rb_tn_new = p_rb_tn_new_temp; + *p_rbkey_new = p_rbkey_new_temp; + + return DPP_OK; +} + +DPP_STATUS dpp_hash_get_hash_info_from_sdt(ZXIC_UINT32 dev_id, ZXIC_UINT32 sdt_no, HASH_ENTRY_CFG *p_hash_entry_cfg) +{ + DPP_STATUS rc = DPP_OK; + FUNC_ID_INFO *p_func_info = NULL; + DPP_SE_CFG *p_se_cfg = NULL; + + DPP_SDTTBL_HASH_T sdt_hash_info = {0}; /*SDT内容*/ + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, sdt_no, 0, DPP_DEV_SDT_ID_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_hash_entry_cfg); + + //从sdt_no中获取SDT配置 + rc = dpp_soft_sdt_tbl_get(dev_id, sdt_no, &sdt_hash_info); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_soft_sdt_tbl_read"); + + p_hash_entry_cfg->fun_id = sdt_hash_info.hash_id; /*hash引擎*/ + ZXIC_COMM_CHECK_INDEX(p_hash_entry_cfg->fun_id, HASH_FUNC_ID_MIN, HASH_FUNC_ID_NUM - 1); + + p_hash_entry_cfg->table_id = sdt_hash_info.hash_table_id; /*hash表号*/ + ZXIC_COMM_CHECK_INDEX_UPPER(p_hash_entry_cfg->table_id,HASH_TBL_ID_NUM - 1); + + p_hash_entry_cfg->bulk_id = ((p_hash_entry_cfg->table_id >> 2) & 0x7); + ZXIC_COMM_CHECK_INDEX_UPPER(p_hash_entry_cfg->bulk_id,HASH_BULK_NUM - 1); + + p_hash_entry_cfg->key_type = sdt_hash_info.hash_table_width; /*表宽度*/ + ZXIC_COMM_CHECK_INDEX(p_hash_entry_cfg->key_type, HASH_KEY_128b, HASH_KEY_512b); + + p_hash_entry_cfg->actu_key_size = sdt_hash_info.key_size; /*业务表键值长度*/ + ZXIC_COMM_CHECK_INDEX(p_hash_entry_cfg->actu_key_size, HASH_ACTU_KEY_MIN, HASH_ACTU_KEY_MAX); + p_hash_entry_cfg->key_by_size = DPP_GET_KEY_SIZE(p_hash_entry_cfg->actu_key_size); + p_hash_entry_cfg->rst_by_size = DPP_GET_RST_SIZE(p_hash_entry_cfg->key_type, p_hash_entry_cfg->actu_key_size); + + /* 取出se配置 */ + rc = dpp_se_cfg_get(dev_id, &p_se_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_se_cfg_get"); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_se_cfg); + p_hash_entry_cfg->p_se_cfg = p_se_cfg; + + p_func_info = DPP_GET_FUN_INFO(p_se_cfg, p_hash_entry_cfg->fun_id); + DPP_SE_CHECK_FUN(p_func_info, p_hash_entry_cfg->fun_id, FUN_HASH); + + p_hash_entry_cfg->p_hash_cfg = (DPP_HASH_CFG *)p_func_info->fun_ptr; + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_hash_entry_cfg->p_hash_cfg); + + return DPP_OK; +} + +DPP_STATUS dpp_hash_rb_insert(DPP_DEV_T *dev,HASH_ENTRY_CFG *p_hash_entry_cfg,DPP_HASH_ENTRY *p_entry) +{ + ZXIC_UINT32 rc = DPP_OK; + DPP_HASH_RBKEY_INFO *p_rbkey_rtn = NULL; + DPP_HASH_CFG *p_hash_cfg = NULL; + DPP_HASH_RBKEY_INFO *p_rbkey_new = NULL; + ZXIC_RB_TN *p_rb_tn_new = NULL; + ZXIC_RB_TN *p_rb_tn_rtn = NULL; + ZXIC_UINT32 rst_actual_size = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(p_hash_entry_cfg); + ZXIC_COMM_CHECK_POINT(p_hash_entry_cfg->p_hash_cfg); + ZXIC_COMM_CHECK_POINT(p_entry); + ZXIC_COMM_CHECK_POINT(p_entry->p_rst); + + p_rbkey_new = p_hash_entry_cfg->p_rbkey_new; + p_rb_tn_new = p_hash_entry_cfg->p_rb_tn_new; + p_hash_cfg = p_hash_entry_cfg->p_hash_cfg; + rst_actual_size = ((p_hash_entry_cfg->rst_by_size) > HASH_RST_MAX) ? HASH_RST_MAX : p_hash_entry_cfg->rst_by_size; + rc = zxic_comm_rb_insert(&p_hash_cfg->hash_rb, (ZXIC_VOID *)p_rb_tn_new, (ZXIC_VOID *)(&p_rb_tn_rtn)); + if (ZXIC_RBT_RC_FULL == rc) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "The red black tree is full!\n"); + ZXIC_COMM_FREE(p_rbkey_new); + ZXIC_COMM_FREE(p_rb_tn_new); + ZXIC_COMM_ASSERT(0); + return DPP_HASH_RC_RB_TREE_FULL; + } + else if (ZXIC_RBT_RC_UPDATE == rc) + { + p_hash_cfg->hash_stat.insert_same++; + ZXIC_COMM_TRACE_DEV_DEBUG(DEV_ID(dev), "Hash update exist entry!\n"); + + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_rb_tn_rtn); + p_rbkey_rtn = (DPP_HASH_RBKEY_INFO *)(p_rb_tn_rtn->p_key); + + /* when the result is more than 256bit, get first 256bit valid data. */ + ZXIC_COMM_MEMCPY(p_rbkey_rtn->rst, p_entry->p_rst, rst_actual_size); + + ZXIC_COMM_FREE(p_rbkey_new); + ZXIC_COMM_FREE(p_rb_tn_new); + p_hash_entry_cfg->p_rbkey_new = p_rbkey_rtn; + p_hash_entry_cfg->p_rb_tn_new = p_rb_tn_rtn; + + /* 仿真器使用 */ + if(DPP_DEV_TYPE_SIM == dpp_dev_get_dev_type(DEV_ID(dev))) + { + /*dpp_se_simulator_insert_delete_hash(DEV_ID(dev), + p_hash_entry_cfg->fun_id, + p_hash_entry_cfg->table_id, + p_hash_entry_cfg->key_by_size, + p_hash_entry_cfg->rst_by_size, + 0, + p_entry);*/ + } + + return DPP_HASH_RC_ADD_UPDATE; + } + else + { + ZXIC_COMM_TRACE_DEV_DEBUG(DEV_ID(dev), "Hash insert new entry!\n"); + /* 仿真器使用 */ + if(DPP_DEV_TYPE_SIM == dpp_dev_get_dev_type(DEV_ID(dev))) + { + /*dpp_se_simulator_insert_delete_hash(DEV_ID(dev), + p_hash_entry_cfg->fun_id, + p_hash_entry_cfg->table_id, + p_hash_entry_cfg->key_by_size, + p_hash_entry_cfg->rst_by_size, + 0, + p_entry);*/ + } + + /* when the result is more than 256bit, get first 256bit valid data. */ + ZXIC_COMM_MEMCPY(p_rbkey_new->rst, p_entry->p_rst, rst_actual_size); + p_rbkey_new->entry_size = DPP_GET_HASH_ENTRY_SIZE(p_hash_entry_cfg->key_type); + INIT_D_NODE(&p_rbkey_new->entry_dn, p_rbkey_new); + } + + return DPP_OK; +} + +DPP_STATUS dpp_hash_set_crc_key(DPP_DEV_T *dev,HASH_ENTRY_CFG *p_hash_entry_cfg,DPP_HASH_ENTRY *p_entry,ZXIC_UINT8 *p_temp_key) +{ + ZXIC_UINT32 key_by_size = 0; + ZXIC_UINT8 temp_tbl_id = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(p_hash_entry_cfg); + ZXIC_COMM_CHECK_POINT(p_entry); + ZXIC_COMM_CHECK_POINT(p_entry->p_key); + ZXIC_COMM_CHECK_POINT(p_temp_key); + + key_by_size = p_hash_entry_cfg->key_by_size; + ZXIC_COMM_MEMCPY(p_temp_key, p_entry->p_key, key_by_size); + + /* 约定: 参与CRC运算的key, 需要将tbl_id的前面补3bit的0,然后放到actu_key的后面. */ + temp_tbl_id = (*p_temp_key) & 0x1F; + memmove(p_temp_key, p_temp_key+1, key_by_size - HASH_KEY_CTR_SIZE); + ZXIC_COMM_CHECK_DEV_INDEX_SUB_OVERFLOW_NO_ASSERT(DEV_ID(dev), key_by_size, HASH_KEY_CTR_SIZE); + p_temp_key[key_by_size - HASH_KEY_CTR_SIZE] = temp_tbl_id; + + return DPP_OK; +} + +DPP_STATUS dpp_hash_insert_ddr(DPP_DEV_T *dev,HASH_ENTRY_CFG *p_hash_entry_cfg,ZXIC_UINT8 *p_temp_key,ZXIC_UINT8 *p_end_flag) +{ + DPP_HASH_CFG *p_hash_cfg = NULL; + ZXIC_UINT8 bulk_id = 0; + ZXIC_UINT8 key_type = 0; + ZXIC_UINT8 table_id = 0; + ZXIC_UINT32 key_by_size = 0; + ZXIC_UINT32 crc_value = 0; + ZXIC_UINT32 item_idx = 0xFFFFFFFF;/* -1 */ + ZXIC_UINT32 item_type = 0; + HASH_DDR_CFG *p_ddr_cfg = NULL; + SE_ITEM_CFG *p_item = NULL; + DPP_HASH_RBKEY_INFO *p_rbkey_new = NULL; + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(p_hash_entry_cfg); + ZXIC_COMM_CHECK_POINT(p_temp_key); + ZXIC_COMM_CHECK_POINT(p_end_flag); + + p_hash_cfg = p_hash_entry_cfg->p_hash_cfg; + ZXIC_COMM_CHECK_POINT(p_hash_cfg); + bulk_id = p_hash_entry_cfg->bulk_id; + ZXIC_COMM_CHECK_INDEX_UPPER(bulk_id,HASH_BULK_NUM - 1); + p_ddr_cfg = p_hash_cfg->p_bulk_ddr_info[bulk_id]; + ZXIC_COMM_CHECK_POINT(p_ddr_cfg); + table_id = p_hash_entry_cfg->table_id; + ZXIC_COMM_CHECK_INDEX_UPPER(table_id,HASH_TBL_ID_NUM - 1); + p_rbkey_new = p_hash_entry_cfg->p_rbkey_new; + ZXIC_COMM_CHECK_POINT(p_rbkey_new); + + key_type = p_hash_entry_cfg->key_type; + if ((HASH_KEY_512b == key_type) && (DDR_WIDTH_256b == p_ddr_cfg->width_mode)) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "ErrorCode[0x%x]: Hash DDR width mode is not match to the key type.\n", DPP_HASH_RC_DDR_WIDTH_MODE_ERR); + return DPP_HASH_RC_DDR_WIDTH_MODE_ERR; + } + + key_by_size = p_hash_entry_cfg->key_by_size; + crc_value = p_hash_cfg->p_hash32_fun(p_temp_key, key_by_size, p_ddr_cfg->hash_ddr_arg); + ZXIC_COMM_TRACE_DEV_DEBUG(DEV_ID(dev), "hash ddr arg is: 0x%x.crc_value is 0x%x\n", p_ddr_cfg->hash_ddr_arg, crc_value); /* t */ + item_idx = crc_value % p_ddr_cfg->item_num; /*按照256bit进行划分*/ + item_type = ITEM_DDR_256; + if (DDR_WIDTH_512b == p_ddr_cfg->width_mode) + { + item_idx = crc_value % p_ddr_cfg->item_num;/* 512b模式时,item_num已经在bulk初始化做过转换 ,按照512bit进行划分*/ + item_type = ITEM_DDR_512; + } + + ZXIC_COMM_TRACE_DEV_DEBUG(DEV_ID(dev), "Hash insert in ITEM_DDR_%s, item_idx is: 0x%x.\n", ((item_type == ITEM_DDR_256) ? "256" : "512"), item_idx); + + ZXIC_COMM_CHECK_INDEX_UPPER(item_idx, p_ddr_cfg->item_num); /* modify coverity yinxh 2021.03.10*/ + p_item = p_ddr_cfg->p_item_array[item_idx]; + if (NULL == p_item) + { + p_item = (SE_ITEM_CFG *)ZXIC_COMM_MALLOC(sizeof(SE_ITEM_CFG)); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_item); + ZXIC_COMM_MEMSET(p_item, 0, sizeof(SE_ITEM_CFG)); + p_ddr_cfg->p_item_array[item_idx] = p_item; + } + + rc = dpp_hash_insrt_to_item(p_hash_cfg, + p_hash_entry_cfg->p_rbkey_new, + p_item, + item_idx, + item_type, + key_type); + + if (DPP_HASH_RC_ITEM_FULL != rc) + { + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_hash_insrt_to_item"); + *p_end_flag = 1; +#ifdef HASH_ENTRY_STAT + p_hash_cfg->hash_stat.insert_ddr++; + p_hash_cfg->hash_stat.insert_table[table_id].ddr++; +#endif + /* calc the item hardware address in DDR */ + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(DEV_ID(dev), p_ddr_cfg->hw_baddr, item_idx); + p_item->hw_addr = GET_HASH_DDR_HW_ADDR(p_ddr_cfg->hw_baddr, item_idx); + p_item->bulk_id = p_hash_entry_cfg->bulk_id; + } + +#if OBTAIN_CONFLICT_KEY + /* debug start 获取冲突键值*/ + if (DPP_HASH_RC_ITEM_FULL == rc) + { + p_item->hw_addr = GET_HASH_DDR_HW_ADDR(p_ddr_cfg->hw_baddr, item_idx); + ZXIC_COMM_PRINT("ddr conflict item_idx is:0x%x,p_item->hw_addr is:0x%x\n", item_idx, p_item->hw_addr); + ZXIC_COMM_PRINT("ddr conflict key is:"); + + for (index = 0; index < 10; index++) + { + ZXIC_COMM_PRINT("0x%02x ", p_rbkey_new->key[index]); + } + + ZXIC_COMM_PRINT("\n"); + } + + /* debug end*/ +#endif + + return DPP_OK; +} + +DPP_STATUS dpp_hash_insert_zcell(DPP_DEV_T *dev,DPP_SE_CFG *p_se_cfg,HASH_ENTRY_CFG *p_hash_entry_cfg,ZXIC_UINT8 *p_temp_key,ZXIC_UINT8 *p_end_flag) +{ + ZXIC_UINT8 bulk_id = 0; + D_NODE *p_zcell_dn = NULL; + SE_ZCELL_CFG *p_zcell = NULL; + ZXIC_UINT32 zblk_idx = 0; + ZXIC_UINT32 zcell_id = 0; + ZXIC_UINT32 pre_zblk_idx = 0xFFFFFFFF;/* -1; */ + SE_ITEM_CFG *p_item = NULL; + ZXIC_UINT32 item_idx = 0xFFFFFFFF;/* -1 */ + ZXIC_UINT32 item_type = 0; + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 crc_value = 0; + ZXIC_UINT8 table_id = 0; + DPP_HASH_CFG *p_hash_cfg = NULL; + SE_ZBLK_CFG *p_zblk = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(p_hash_entry_cfg); + ZXIC_COMM_CHECK_POINT(p_temp_key); + ZXIC_COMM_CHECK_POINT(p_se_cfg); + ZXIC_COMM_CHECK_POINT(p_end_flag); + + /* if insert into DDR is fail, insert into ZCAM. */ + ZXIC_COMM_TRACE_DEV_DEBUG(DEV_ID(dev), "insert zcell start\n"); + bulk_id = p_hash_entry_cfg->bulk_id; + ZXIC_COMM_CHECK_INDEX_UPPER(bulk_id,HASH_BULK_NUM - 1); + table_id = p_hash_entry_cfg->table_id; + ZXIC_COMM_CHECK_INDEX_UPPER(table_id,HASH_TBL_ID_NUM - 1); + p_hash_cfg = p_hash_entry_cfg->p_hash_cfg; + ZXIC_COMM_CHECK_POINT(p_hash_cfg); + p_zcell_dn = p_hash_cfg->hash_shareram.zcell_free_list.p_next; + + while (p_zcell_dn) + { + p_zcell = (SE_ZCELL_CFG *)p_zcell_dn->data; + ZXIC_COMM_CHECK_POINT(p_zcell); + + /* 只在hash引擎开启zcell独占模式下,才进行相关的处理 */ + if (((p_zcell->flag & DPP_ZCELL_FLAG_IS_MONO) && (p_zcell->bulk_id != bulk_id)) + ||((!(p_zcell->flag & DPP_ZCELL_FLAG_IS_MONO)) && (p_hash_cfg->bulk_ram_mono[bulk_id]))) + { + p_zcell_dn = p_zcell_dn->next; + continue; + } + + zblk_idx = GET_ZBLK_IDX(p_zcell->zcell_idx); + ZXIC_COMM_CHECK_INDEX_UPPER(zblk_idx,SE_ZBLK_NUM - 1); + p_zblk = &(p_se_cfg->zblk_info[zblk_idx]); + if (zblk_idx != pre_zblk_idx) + { + pre_zblk_idx = zblk_idx; + crc_value = p_hash_cfg->p_hash16_fun(p_temp_key, p_hash_entry_cfg->key_by_size, p_zblk->hash_arg); + } + + ZXIC_COMM_TRACE_DEV_DEBUG(DEV_ID(dev), "zblk_idx is [0x%x],p_zblk->hash_arg is [0x%x],crc_value is [0x%x]\n", zblk_idx, p_zblk->hash_arg, crc_value); /* t */ + + zcell_id = GET_ZCELL_IDX(p_zcell->zcell_idx); + item_idx = GET_ZCELL_CRC_VAL(zcell_id, crc_value); + ZXIC_COMM_CHECK_INDEX_UPPER(item_idx,SE_RAM_DEPTH - 1); + p_item = &(p_zcell->item_info[item_idx]); + item_type = ITEM_RAM; + + ZXIC_COMM_TRACE_DEV_DEBUG(DEV_ID(dev), "zcell_id is [0x%x],item_idx is [0x%x]\n", zcell_id, item_idx); /* t */ + + rc = dpp_hash_insrt_to_item(p_hash_cfg, + p_hash_entry_cfg->p_rbkey_new, + p_item, + item_idx, + item_type, + p_hash_entry_cfg->key_type); + + if (DPP_HASH_RC_ITEM_FULL == rc) + { + ZXIC_COMM_TRACE_DEV_DEBUG(DEV_ID(dev), "The item is full, check next. \n"); +#if OBTAIN_CONFLICT_KEY + + /* debug start 获取冲突键值*/ + if (DPP_HASH_RC_ITEM_FULL == rc) + { + p_item->hw_addr = ZBLK_ITEM_ADDR_CALC(p_zcell->zcell_idx, item_idx); + ZXIC_COMM_PRINT("zcell conflict item_idx is:0x%x,p_item->hw_addr is:0x%x\n", item_idx, p_item->hw_addr); + ZXIC_COMM_PRINT("zcell conflict key is:"); + + for (index = 0; index < 10; index++) + { + ZXIC_COMM_PRINT("0x%x ", p_rbkey_new->key[index]); + } + + ZXIC_COMM_PRINT("\n"); + } + + /* debug end*/ +#endif + } + else + { + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_hash_insrt_to_item"); + *p_end_flag = 1; +#ifdef HASH_ENTRY_STAT + p_hash_cfg->hash_stat.insert_zcell++; + p_hash_cfg->hash_stat.insert_table[table_id].zcell++; +#endif + + /* calc the item hardware address in ZCAM. */ + p_item->hw_addr = ZBLK_ITEM_ADDR_CALC(p_zcell->zcell_idx, item_idx); + /* debug start 获取冲突键值*/ + /* ZXIC_COMM_TRACE_DEV_DEBUG(DEV_ID(dev), "ZCAM hw_addr is [0x%x]\n", p_item->hw_addr); t*/ + /* ZXIC_COMM_PRINT("after ddr conflict item_idx is:%d,p_item->hw_addr is:%d \n", item_idx, p_item->hw_addr);*/ + /* ZXIC_COMM_PRINT("after ddr conflict zcell_id is [0x%x],zblk_idx is [0x%x]\n", zcell_id, zblk_idx); t;*/ + /* debug end*/ + break; + } + + p_zcell_dn = p_zcell_dn->next; + } + + return DPP_OK; +} + +DPP_STATUS dpp_hash_insert_zreg(DPP_DEV_T *dev,HASH_ENTRY_CFG *p_hash_entry_cfg,ZXIC_UINT8 *p_temp_key,ZXIC_UINT8 *p_end_flag) +{ + DPP_HASH_CFG *p_hash_cfg = NULL; + D_NODE *p_zblk_dn = NULL; + SE_ZBLK_CFG *p_zblk = NULL; + SE_ZREG_CFG *p_zreg = NULL; + SE_ITEM_CFG *p_item = NULL; + ZXIC_UINT8 reg_index = 0; + ZXIC_UINT32 zblk_idx = 0; + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT8 bulk_id = 0; + ZXIC_UINT32 item_idx = 0xFFFFFFFF;/* -1; */ + ZXIC_UINT32 item_type = 0; + ZXIC_UINT32 table_id = 0; + DPP_HASH_RBKEY_INFO *p_rbkey_new = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(p_hash_entry_cfg); + ZXIC_COMM_CHECK_POINT(p_temp_key); + ZXIC_COMM_CHECK_POINT(p_end_flag); + + ZXIC_COMM_TRACE_DEV_DEBUG(DEV_ID(dev), "insert zreg start\n"); /* t */ + bulk_id = p_hash_entry_cfg->bulk_id; + ZXIC_COMM_CHECK_INDEX_UPPER(bulk_id,HASH_BULK_NUM - 1); + table_id = p_hash_entry_cfg->table_id; + ZXIC_COMM_CHECK_INDEX_UPPER(table_id,HASH_TBL_ID_NUM - 1); + p_rbkey_new = p_hash_entry_cfg->p_rbkey_new; + ZXIC_COMM_CHECK_POINT(p_rbkey_new); + + p_hash_cfg = p_hash_entry_cfg->p_hash_cfg; + p_zblk_dn = p_hash_cfg->hash_shareram.zblk_list.p_next; + while (p_zblk_dn) + { + p_zblk = (SE_ZBLK_CFG *)p_zblk_dn->data; + zblk_idx = p_zblk->zblk_idx; + + for (reg_index = 0; reg_index < SE_ZREG_NUM; reg_index++) + { + p_zreg = &(p_zblk->zreg_info[reg_index]); + + if (((p_zreg->flag & DPP_ZREG_FLAG_IS_MONO) && (p_zreg->bulk_id != bulk_id)) || + ((!(p_zreg->flag & DPP_ZREG_FLAG_IS_MONO)) && (p_hash_cfg->bulk_ram_mono[bulk_id]))) + { + continue; + } + + p_item = &(p_zblk->zreg_info[reg_index].item_info); + item_type = ITEM_REG; + item_idx = reg_index; + rc = dpp_hash_insrt_to_item(p_hash_cfg, + p_hash_entry_cfg->p_rbkey_new, + p_item, + item_idx, + item_type, + p_hash_entry_cfg->key_type); + + if (DPP_HASH_RC_ITEM_FULL == rc) + { + ZXIC_COMM_TRACE_DEV_DEBUG(DEV_ID(dev), "The item is full, check next. \n"); +#if OBTAIN_CONFLICT_KEY + /* debug start 获取冲突键值*/ + ZXIC_COMM_PRINT("zreg_mono conflict,not inserted,reg_num is:0x%x,zblk_idx is:0x%x,p_item->hw_addr is:0x%x\n", reg_index, zblk_idx, p_item->hw_addr); + ZXIC_COMM_PRINT("zreg_mono conflict,key is:"); + + for (index = 0; index < 8; index++) + { + ZXIC_COMM_PRINT("0x%x ", p_rbkey_new->key[index]); + } + + ZXIC_COMM_PRINT("\n"); + /* debug end*/ +#endif + } + else + { + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_hash_insrt_to_item"); + *p_end_flag = 1; +#ifdef HASH_ENTRY_STAT + p_hash_cfg->hash_stat.insert_zreg++; + p_hash_cfg->hash_stat.insert_table[table_id].zreg++; +#endif + + /* calc the item hardware address in ZBLK Reg. */ + p_item->hw_addr = ZBLK_HASH_LIST_REG_ADDR_CALC(zblk_idx, reg_index); +#if OBTAIN_CONFLICT_KEY + /* debug start 获取冲突键值*/ + ZXIC_COMM_PRINT("zreg_mono conflict,inserted,reg_num is:0x%x,zblk_idx is:0x%x,p_item->hw_addr is:0x%x\n", reg_index, zblk_idx, p_item->hw_addr); + ZXIC_COMM_PRINT("zreg_mono conflict,key is:"); + + for (index = 0; index < 8; index++) + { + ZXIC_COMM_PRINT("0x%x ", p_rbkey_new->key[index]); + } + + ZXIC_COMM_PRINT("\n"); + /* debug end*/ +#endif + break; + } + } + + if (*p_end_flag) + { + break; + } + + p_zblk_dn = p_zblk_dn->next; + } + + return DPP_OK; +} + +/***********************************************************/ +/** +* @param p_se_cfg 算法模块公共管理数据结构指针 +* @param fun_id hash引擎号 +* @param p_zblk_cfg +* +* @return +* @remark 无 +* @see +* @author XCX @date 2017/03/27 +************************************************************/ +DPP_STATUS dpp_hash_zblkcfg_write(DPP_SE_CFG *p_se_cfg, ZXIC_UINT32 fun_id, SE_ZBLK_CFG *p_zblk_cfg) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT8 ram_buf[SE_RAM_WIDTH / 8] = {0}; + + ZXIC_UINT32 dev_id = 0; + +#if DPP_WRITE_FILE_EN + ZXIC_UINT32 hw_addr = 0; +#endif + + ZXIC_COMM_CHECK_POINT(p_se_cfg); + ZXIC_COMM_CHECK_POINT(p_zblk_cfg); + ZXIC_COMM_CHECK_INDEX(fun_id, HASH_FUNC_ID_MIN, HASH_FUNC_ID_NUM - 1); + + dev_id = p_se_cfg->dev_id; + + /* write hash type*/ + rc = zxic_comm_write_bits_ex(ram_buf, + SE_RAM_WIDTH, + 1, + DPP_SE_ZBLK_SERVICE_TYPE_START, + DPP_SE_ZBLK_SERVICE_TYPE_START - DPP_SE_ZBLK_SERVICE_TYPE_END + 1); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "zxic_comm_write_bits_ex"); + + /* write hash channel*/ + rc = zxic_comm_write_bits_ex(ram_buf, + SE_RAM_WIDTH, + fun_id, + DPP_SE_ZBLK_HASH_CHAN_START, + DPP_SE_ZBLK_HASH_CHAN_START - DPP_SE_ZBLK_HASH_CHAN_END + 1); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "zxic_comm_write_bits_ex"); + + /* write enable flag*/ + rc = zxic_comm_write_bits_ex(ram_buf, + SE_RAM_WIDTH, + 1, + DPP_SE_ZBLK_HW_POS_EN_START, + DPP_SE_ZBLK_HW_POS_EN_START - DPP_SE_ZBLK_HW_POS_EN_END + 1); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "zxic_comm_write_bits_ex"); + +#if DPP_WRITE_FILE_EN + hw_addr = ZBLK_REG_ADDR_CALC(p_zblk_cfg->zblk_idx, 0); + + rc = dpp_data_w2f(hw_addr, ram_buf, FILE_TYPE_ZBLK_CFG); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_data_w2f"); +#endif + +#ifdef DPP_FLOW_HW_INIT + rc = dpp_se_zblk_serv_cfg_set(p_se_cfg->dev, + p_zblk_cfg->zblk_idx, + ALG_ZBLK_SERV_HASH, + fun_id, + 1); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_se_zblk_serv_cfg_set"); +#endif + + return DPP_OK; +} + +/***********************************************************/ +/** +* @param p_se_cfg 算法模块公共管理数据结构指针 +* @param hash_id hash引擎号 +* @param bulk_id +* +* @return +* @remark 无 +* @see +* @author XCX @date 2017/03/27 +************************************************************/ +DPP_STATUS dpp_hash_bulk_mono_flags_write(DPP_SE_CFG *p_se_cfg, ZXIC_UINT32 hash_id, ZXIC_UINT32 bulk_id) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 hash0_mono_flag = 0; + ZXIC_UINT32 hash1_mono_flag = 0; + ZXIC_UINT32 hash2_mono_flag = 0; + ZXIC_UINT32 hash3_mono_flag = 0; + +#if DPP_WRITE_FILE_EN + ZXIC_UINT32 hash0_mono_flag_file = 0; + ZXIC_UINT32 hash1_mono_flag_file = 0; + ZXIC_UINT32 hash2_mono_flag_file = 0; + ZXIC_UINT32 hash3_mono_flag_file = 0; + ZXIC_UINT32 hash_mono_flags_file_reg = 0; + ZXIC_UINT32 hash_mono_flags_file_reg_addr = 0; + DPP_HASH_FILE_REG_T *p_hash_file_reg = NULL; +#endif + + ZXIC_COMM_CHECK_POINT(p_se_cfg); + ZXIC_COMM_CHECK_INDEX(hash_id, HASH_FUNC_ID_MIN, HASH_FUNC_ID_NUM - 1); + ZXIC_COMM_CHECK_INDEX(bulk_id, HASH_BULK_ID_MIN, HASH_BULK_ID_MAX); + + dev_id = p_se_cfg->dev_id; + + rc = dpp_se_hash_zcam_mono_flags_get(p_se_cfg->dev, + &hash0_mono_flag, + &hash1_mono_flag, + &hash2_mono_flag, + &hash3_mono_flag); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_se_hash_zcam_mono_flags_get"); + + switch (hash_id) + { + case 0: + { + hash0_mono_flag |= (1U << bulk_id); + break; + } + + case 1: + { + hash1_mono_flag |= (1U << bulk_id); + break; + } + + case 2: + { + hash2_mono_flag |= (1U << bulk_id); + break; + } + + case 3: + { + hash3_mono_flag |= (1U << bulk_id); + break; + } + + default: + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n hash id is out of rang."); + ZXIC_COMM_ASSERT(0); + } + } + + rc = dpp_se_hash_zcam_mono_flags_set(p_se_cfg->dev, + hash0_mono_flag, + hash1_mono_flag, + hash2_mono_flag, + hash3_mono_flag); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_se_hash_zcam_mono_flags_set"); + +#if DPP_WRITE_FILE_EN + hash_mono_flags_file_reg_addr = 0x1c4; + + p_hash_file_reg = DPP_GET_HASH_FILE_REG(); + hash_mono_flags_file_reg = p_hash_file_reg->hash_mono_flags_file_reg; + + ZXIC_COMM_UINT32_GET_BITS(hash0_mono_flag_file, hash_mono_flags_file_reg, HASH0_MONO_FLAG_BT_START, HASH0_MONO_FLAG_BT_WIDTH); + ZXIC_COMM_UINT32_GET_BITS(hash1_mono_flag_file, hash_mono_flags_file_reg, HASH1_MONO_FLAG_BT_START, HASH1_MONO_FLAG_BT_WIDTH); + ZXIC_COMM_UINT32_GET_BITS(hash2_mono_flag_file, hash_mono_flags_file_reg, HASH2_MONO_FLAG_BT_START, HASH2_MONO_FLAG_BT_WIDTH); + ZXIC_COMM_UINT32_GET_BITS(hash3_mono_flag_file, hash_mono_flags_file_reg, HASH3_MONO_FLAG_BT_START, HASH3_MONO_FLAG_BT_WIDTH); + + switch (hash_id) + { + case 0: + { + hash0_mono_flag_file |= (1U << bulk_id); + break; + } + + case 1: + { + hash1_mono_flag_file |= (1U << bulk_id); + break; + } + + case 2: + { + hash2_mono_flag_file |= (1U << bulk_id); + break; + } + + case 3: + { + hash3_mono_flag_file |= (1U << bulk_id); + break; + } + + default: + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n hash id is out of rang."); + ZXIC_COMM_ASSERT(0); + } + } + + ZXIC_COMM_UINT32_WRITE_BITS(hash_mono_flags_file_reg, + hash0_mono_flag_file, + HASH0_MONO_FLAG_BT_START, + HASH0_MONO_FLAG_BT_WIDTH); + ZXIC_COMM_UINT32_WRITE_BITS(hash_mono_flags_file_reg, + hash1_mono_flag_file, + HASH1_MONO_FLAG_BT_START, + HASH1_MONO_FLAG_BT_WIDTH); + ZXIC_COMM_UINT32_WRITE_BITS(hash_mono_flags_file_reg, + hash2_mono_flag_file, + HASH2_MONO_FLAG_BT_START, + HASH2_MONO_FLAG_BT_WIDTH); + ZXIC_COMM_UINT32_WRITE_BITS(hash_mono_flags_file_reg, + hash3_mono_flag_file, + HASH3_MONO_FLAG_BT_START, + HASH3_MONO_FLAG_BT_WIDTH); + + p_hash_file_reg->hash_mono_flags_file_reg = hash_mono_flags_file_reg; + + rc = dpp_data_w2f(p_se_cfg->reg_base + hash_mono_flags_file_reg_addr, &p_hash_file_reg->hash_mono_flags_file_reg, FILE_TYPE_REG); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_data_w2f"); +#endif + + return DPP_OK; +} + +/***********************************************************/ +/** +* @param p_se_cfg 算法模块公共管理数据结构指针 +* @param p_zcell_cfg +* +* @return +* @remark 无 +* @see +* @author XCX @date 2017/03/27 +************************************************************/ +DPP_STATUS dpp_hash_zcell_mono_write(DPP_SE_CFG *p_se_cfg, SE_ZCELL_CFG *p_zcell_cfg) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 zblk_idx = 0; + ZXIC_UINT32 zcell_id = 0; + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 zcell0_bulk_id = 0; + ZXIC_UINT32 zcell0_mono_flag = 0; + ZXIC_UINT32 zcell1_bulk_id = 0; + ZXIC_UINT32 zcell1_mono_flag = 0; + ZXIC_UINT32 zcell2_bulk_id = 0; + ZXIC_UINT32 zcell2_mono_flag = 0; + ZXIC_UINT32 zcell3_bulk_id = 0; + ZXIC_UINT32 zcell3_mono_flag = 0; + +#if DPP_WRITE_FILE_EN + ZXIC_UINT32 zcell0_bulk_id_file = 0; + ZXIC_UINT32 zcell0_mono_flag_file = 0; + ZXIC_UINT32 zcell1_bulk_id_file = 0; + ZXIC_UINT32 zcell1_mono_flag_file = 0; + ZXIC_UINT32 zcell2_bulk_id_file = 0; + ZXIC_UINT32 zcell2_mono_flag_file = 0; + ZXIC_UINT32 zcell3_bulk_id_file = 0; + ZXIC_UINT32 zcell3_mono_flag_file = 0; + ZXIC_UINT32 zcell_mono_file_ram_addr = 0; + + ZXIC_UINT8 *zcell_mono_file_ram = NULL; + DPP_HASH_FILE_REG_T *p_hash_file_reg = NULL; +#endif + + ZXIC_COMM_CHECK_POINT(p_se_cfg); + ZXIC_COMM_CHECK_POINT(p_zcell_cfg); + + dev_id = p_se_cfg->dev_id; + + zblk_idx = GET_ZBLK_IDX(p_zcell_cfg->zcell_idx); + zcell_id = p_zcell_cfg->zcell_idx & 0x3; + rc = dpp_se_zcell_mono_cfg_get(p_se_cfg->dev, + zblk_idx, + &zcell0_bulk_id, + &zcell0_mono_flag, + &zcell1_bulk_id, + &zcell1_mono_flag, + &zcell2_bulk_id, + &zcell2_mono_flag, + &zcell3_bulk_id, + &zcell3_mono_flag); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_se_zcell_mono_cfg_get"); + + switch (zcell_id) + { + case 0: + { + zcell0_bulk_id = p_zcell_cfg->bulk_id; + zcell0_mono_flag = 1; + break; + } + + case 1: + { + zcell1_bulk_id = p_zcell_cfg->bulk_id; + zcell1_mono_flag = 1; + break; + } + + case 2: + { + zcell2_bulk_id = p_zcell_cfg->bulk_id; + zcell2_mono_flag = 1; + break; + } + + case 3: + { + zcell3_bulk_id = p_zcell_cfg->bulk_id; + zcell3_mono_flag = 1; + break; + } + + } + + rc = dpp_se_zcell_mono_cfg_set(p_se_cfg->dev, + zblk_idx, + zcell0_bulk_id, + zcell0_mono_flag, + zcell1_bulk_id, + zcell1_mono_flag, + zcell2_bulk_id, + zcell2_mono_flag, + zcell3_bulk_id, + zcell3_mono_flag); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_se_zcell_mono_cfg_set"); + +#if DPP_WRITE_FILE_EN + zcell_mono_file_ram_addr = ZBLK_REG_ADDR_CALC(zblk_idx, 0x14); + + p_hash_file_reg = DPP_GET_HASH_FILE_REG(); + zcell_mono_file_ram = p_hash_file_reg->zcell_mono_file_ram; + + if (0 == zcell_id) + { + ZXIC_COMM_MEMSET(zcell_mono_file_ram, 0, (SE_RAM_WIDTH / 8)); + } + + zxic_comm_read_bits_ex(zcell_mono_file_ram, SE_RAM_WIDTH, &zcell0_bulk_id_file, ZCELL0_BULK_ID_BT_START, ZCELL0_BULK_ID_BT_WIDTH); + zxic_comm_read_bits_ex(zcell_mono_file_ram, SE_RAM_WIDTH, &zcell0_mono_flag_file, ZCELL0_MONO_FLAG_BT_START, ZCELL0_MONO_FLAG_BT_WIDTH); + zxic_comm_read_bits_ex(zcell_mono_file_ram, SE_RAM_WIDTH, &zcell1_bulk_id_file, ZCELL1_BULK_ID_BT_START, ZCELL1_BULK_ID_BT_WIDTH); + zxic_comm_read_bits_ex(zcell_mono_file_ram, SE_RAM_WIDTH, &zcell1_mono_flag_file, ZCELL1_MONO_FLAG_BT_START, ZCELL1_MONO_FLAG_BT_WIDTH); + zxic_comm_read_bits_ex(zcell_mono_file_ram, SE_RAM_WIDTH, &zcell2_bulk_id_file, ZCELL2_BULK_ID_BT_START, ZCELL2_BULK_ID_BT_WIDTH); + zxic_comm_read_bits_ex(zcell_mono_file_ram, SE_RAM_WIDTH, &zcell2_mono_flag_file, ZCELL2_MONO_FLAG_BT_START, ZCELL2_MONO_FLAG_BT_WIDTH); + zxic_comm_read_bits_ex(zcell_mono_file_ram, SE_RAM_WIDTH, &zcell3_bulk_id_file, ZCELL3_BULK_ID_BT_START, ZCELL3_BULK_ID_BT_WIDTH); + zxic_comm_read_bits_ex(zcell_mono_file_ram, SE_RAM_WIDTH, &zcell3_mono_flag_file, ZCELL3_MONO_FLAG_BT_START, ZCELL3_MONO_FLAG_BT_WIDTH); + + switch (zcell_id) + { + case 0: + { + zcell0_bulk_id_file = p_zcell_cfg->bulk_id; + zcell0_mono_flag_file = 1; + break; + } + + case 1: + { + zcell1_bulk_id_file = p_zcell_cfg->bulk_id; + zcell1_mono_flag_file = 1; + break; + } + + case 2: + { + zcell2_bulk_id_file = p_zcell_cfg->bulk_id; + zcell2_mono_flag_file = 1; + break; + } + + case 3: + { + zcell3_bulk_id_file = p_zcell_cfg->bulk_id; + zcell3_mono_flag_file = 1; + break; + } + + default: + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n zcell id is out of rang."); + ZXIC_COMM_ASSERT(0); + } + } + + zxic_comm_write_bits_ex(zcell_mono_file_ram, + SE_RAM_WIDTH, + zcell0_bulk_id_file, + ZCELL0_BULK_ID_BT_START, + ZCELL0_BULK_ID_BT_WIDTH); + zxic_comm_write_bits_ex(zcell_mono_file_ram, + SE_RAM_WIDTH, + zcell0_mono_flag_file, + ZCELL0_MONO_FLAG_BT_START, + ZCELL0_MONO_FLAG_BT_WIDTH); + zxic_comm_write_bits_ex(zcell_mono_file_ram, + SE_RAM_WIDTH, + zcell1_bulk_id_file, + ZCELL1_BULK_ID_BT_START, + ZCELL1_BULK_ID_BT_WIDTH); + zxic_comm_write_bits_ex(zcell_mono_file_ram, + SE_RAM_WIDTH, + zcell1_mono_flag_file, + ZCELL1_MONO_FLAG_BT_START, + ZCELL1_MONO_FLAG_BT_WIDTH); + zxic_comm_write_bits_ex(zcell_mono_file_ram, + SE_RAM_WIDTH, + zcell2_bulk_id_file, + ZCELL2_BULK_ID_BT_START, + ZCELL2_BULK_ID_BT_WIDTH); + zxic_comm_write_bits_ex(zcell_mono_file_ram, + SE_RAM_WIDTH, + zcell2_mono_flag_file, + ZCELL2_MONO_FLAG_BT_START, + ZCELL2_MONO_FLAG_BT_WIDTH); + zxic_comm_write_bits_ex(zcell_mono_file_ram, + SE_RAM_WIDTH, + zcell3_bulk_id_file, + ZCELL3_BULK_ID_BT_START, + ZCELL3_BULK_ID_BT_WIDTH); + zxic_comm_write_bits_ex(zcell_mono_file_ram, + SE_RAM_WIDTH, + zcell3_mono_flag_file, + ZCELL3_MONO_FLAG_BT_START, + ZCELL3_MONO_FLAG_BT_WIDTH); + + rc = dpp_data_w2f(zcell_mono_file_ram_addr, &p_hash_file_reg->zcell_mono_file_ram, FILE_TYPE_ZBLK_CFG); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_data_w2f"); +#endif + + return DPP_OK; +} + +/***********************************************************/ +/** +* @param p_se_cfg 算法模块公共管理数据结构指针 +* @param bulk_id +* @param zblk_idx +* @param zreg_id +* +* @return +* @remark 无 +* @see +* @author XCX @date 2017/03/27 +************************************************************/ +DPP_STATUS dpp_hash_zreg_mono_write(DPP_SE_CFG *p_se_cfg, + ZXIC_UINT32 bulk_id, + ZXIC_UINT32 zblk_idx, + ZXIC_UINT32 zreg_id) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 zreg0_bulk_id = 0; + ZXIC_UINT32 zreg0_mono_flag = 0; + ZXIC_UINT32 zreg1_bulk_id = 0; + ZXIC_UINT32 zreg1_mono_flag = 0; + ZXIC_UINT32 zreg2_bulk_id = 0; + ZXIC_UINT32 zreg2_mono_flag = 0; + ZXIC_UINT32 zreg3_bulk_id = 0; + ZXIC_UINT32 zreg3_mono_flag = 0; + +#if DPP_WRITE_FILE_EN + ZXIC_UINT32 zreg0_bulk_id_file = 0; + ZXIC_UINT32 zreg0_mono_flag_file = 0; + ZXIC_UINT32 zreg1_bulk_id_file = 0; + ZXIC_UINT32 zreg1_mono_flag_file = 0; + ZXIC_UINT32 zreg2_bulk_id_file = 0; + ZXIC_UINT32 zreg2_mono_flag_file = 0; + ZXIC_UINT32 zreg3_bulk_id_file = 0; + ZXIC_UINT32 zreg3_mono_flag_file = 0; + ZXIC_UINT8 *zreg_mono_file_ram = NULL; + ZXIC_UINT32 zreg_mono_file_ram_addr = 0; + DPP_HASH_FILE_REG_T *p_hash_file_reg = NULL; +#endif + + ZXIC_COMM_CHECK_POINT(p_se_cfg); + + dev_id = p_se_cfg->dev_id; + + rc = dpp_se_zreg_mono_cfg_get(p_se_cfg->dev, + zblk_idx, + &zreg0_bulk_id, + &zreg0_mono_flag, + &zreg1_bulk_id, + &zreg1_mono_flag, + &zreg2_bulk_id, + &zreg2_mono_flag, + &zreg3_bulk_id, + &zreg3_mono_flag); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_se_zreg_mono_cfg_get"); + + switch (zreg_id) + { + case 0: + { + zreg0_bulk_id = bulk_id; + zreg0_mono_flag = 1; + break; + } + + case 1: + { + zreg1_bulk_id = bulk_id; + zreg1_mono_flag = 1; + break; + } + + case 2: + { + zreg2_bulk_id = bulk_id; + zreg2_mono_flag = 1; + break; + } + + case 3: + { + zreg3_bulk_id = bulk_id; + zreg3_mono_flag = 1; + break; + } + + default: + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n zreg id is out of rang."); + ZXIC_COMM_ASSERT(0); + } + } + + rc = dpp_se_zreg_mono_cfg_set(p_se_cfg->dev, + zblk_idx, + zreg0_bulk_id, + zreg0_mono_flag, + zreg1_bulk_id, + zreg1_mono_flag, + zreg2_bulk_id, + zreg2_mono_flag, + zreg3_bulk_id, + zreg3_mono_flag); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_se_zreg_mono_cfg_set"); + +#if DPP_WRITE_FILE_EN + zreg_mono_file_ram_addr = ZBLK_REG_ADDR_CALC(zblk_idx, 0x15); + + p_hash_file_reg = DPP_GET_HASH_FILE_REG(); + zreg_mono_file_ram = p_hash_file_reg->zreg_mono_file_ram; + + if (0 == zreg_id) + { + ZXIC_COMM_MEMSET(zreg_mono_file_ram, 0, (SE_RAM_WIDTH / 8)); + } + + zxic_comm_read_bits_ex(zreg_mono_file_ram, + SE_RAM_WIDTH, + &zreg0_bulk_id_file, + ZREG0_BULK_ID_BT_START, + ZREG0_BULK_ID_BT_WIDTH); + zxic_comm_read_bits_ex(zreg_mono_file_ram, + SE_RAM_WIDTH, + &zreg0_mono_flag_file, + ZREG0_MONO_FLAG_BT_START, + ZREG0_MONO_FLAG_BT_WIDTH); + zxic_comm_read_bits_ex(zreg_mono_file_ram, + SE_RAM_WIDTH, + &zreg1_bulk_id_file, + ZREG1_BULK_ID_BT_START, + ZREG1_BULK_ID_BT_WIDTH); + zxic_comm_read_bits_ex(zreg_mono_file_ram, + SE_RAM_WIDTH, + &zreg1_mono_flag_file, + ZREG1_MONO_FLAG_BT_START, + ZREG1_MONO_FLAG_BT_WIDTH); + zxic_comm_read_bits_ex(zreg_mono_file_ram, + SE_RAM_WIDTH, + &zreg2_bulk_id_file, + ZREG2_BULK_ID_BT_START, + ZREG2_BULK_ID_BT_WIDTH); + zxic_comm_read_bits_ex(zreg_mono_file_ram, + SE_RAM_WIDTH, + &zreg2_mono_flag_file, + ZREG2_MONO_FLAG_BT_START, + ZREG2_MONO_FLAG_BT_WIDTH); + zxic_comm_read_bits_ex(zreg_mono_file_ram, + SE_RAM_WIDTH, + &zreg3_bulk_id_file, + ZREG3_BULK_ID_BT_START, + ZREG3_BULK_ID_BT_WIDTH); + zxic_comm_read_bits_ex(zreg_mono_file_ram, + SE_RAM_WIDTH, + &zreg3_mono_flag_file, + ZREG3_MONO_FLAG_BT_START, + ZREG3_MONO_FLAG_BT_WIDTH); + + switch (zreg_id) + { + case 0: + { + zreg0_bulk_id_file = bulk_id; + zreg0_mono_flag_file = 1; + break; + } + + case 1: + { + zreg1_bulk_id_file = bulk_id; + zreg1_mono_flag_file = 1; + break; + } + + case 2: + { + zreg2_bulk_id_file = bulk_id; + zreg2_mono_flag_file = 1; + break; + } + + case 3: + { + zreg3_bulk_id_file = bulk_id; + zreg3_mono_flag_file = 1; + break; + } + + default: + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "\n zcell id is out of rang."); + ZXIC_COMM_ASSERT(0); + } + } + + zxic_comm_write_bits_ex(zreg_mono_file_ram, + SE_RAM_WIDTH, + zreg0_bulk_id_file, + ZREG0_BULK_ID_BT_START, + ZREG0_BULK_ID_BT_WIDTH); + zxic_comm_write_bits_ex(zreg_mono_file_ram, + SE_RAM_WIDTH, + zreg0_mono_flag_file, + ZREG0_MONO_FLAG_BT_START, + ZREG0_MONO_FLAG_BT_WIDTH); + zxic_comm_write_bits_ex(zreg_mono_file_ram, + SE_RAM_WIDTH, + zreg1_bulk_id_file, + ZREG1_BULK_ID_BT_START, + ZREG1_BULK_ID_BT_WIDTH); + zxic_comm_write_bits_ex(zreg_mono_file_ram, + SE_RAM_WIDTH, + zreg1_mono_flag_file, + ZREG1_MONO_FLAG_BT_START, + ZREG1_MONO_FLAG_BT_WIDTH); + zxic_comm_write_bits_ex(zreg_mono_file_ram, + SE_RAM_WIDTH, + zreg2_bulk_id_file, + ZREG2_BULK_ID_BT_START, + ZREG2_BULK_ID_BT_WIDTH); + zxic_comm_write_bits_ex(zreg_mono_file_ram, + SE_RAM_WIDTH, + zreg2_mono_flag_file, + ZREG2_MONO_FLAG_BT_START, + ZREG2_MONO_FLAG_BT_WIDTH); + zxic_comm_write_bits_ex(zreg_mono_file_ram, + SE_RAM_WIDTH, + zreg3_bulk_id_file, + ZREG3_BULK_ID_BT_START, + ZREG3_BULK_ID_BT_WIDTH); + zxic_comm_write_bits_ex(zreg_mono_file_ram, + SE_RAM_WIDTH, + zreg3_mono_flag_file, + ZREG3_MONO_FLAG_BT_START, + ZREG3_MONO_FLAG_BT_WIDTH); + + rc = dpp_data_w2f(zreg_mono_file_ram_addr, &p_hash_file_reg->zreg_mono_file_ram, FILE_TYPE_ZBLK_CFG); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_data_w2f"); +#endif + + return DPP_OK; +} + +/***********************************************************/ +/** hash ddr参数配置 +* @param p_se_cfg 算法模块公共管理数据结构指针 +* @param fun_id hash引擎号 +* @param bulk_id +* @param p_ddr_cfg +* +* @return +* @remark 无 +* @see +* @author wcl @date 2014/07/31 +************************************************************/ +DPP_STATUS dpp_hash_ext_cfg_write(DPP_SE_CFG *p_se_cfg, + ZXIC_UINT32 fun_id, + ZXIC_UINT32 bulk_id, + HASH_DDR_CFG *p_ddr_cfg) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 ext_mode = 0; + ZXIC_UINT32 ext_flag = 0; + ZXIC_UINT32 dev_id = 0; + +#if DPP_WRITE_FILE_EN + ZXIC_UINT32 ext_mode_file = 0; + ZXIC_UINT32 ext_flag_file = 0; + ZXIC_UINT32 ext_cfg_file_reg = 0; + ZXIC_UINT32 ext_cfg_file_reg_addr = 0; + DPP_HASH_FILE_REG_T *p_hash_file_reg = NULL; +#endif + + ZXIC_COMM_CHECK_POINT(p_se_cfg); + ZXIC_COMM_CHECK_POINT(p_ddr_cfg); + ZXIC_COMM_CHECK_INDEX(fun_id, DPP_HASH_ID_MIN, DPP_HASH_ID_MAX); + ZXIC_COMM_CHECK_INDEX(bulk_id, HASH_BULK_ID_MIN, HASH_BULK_ID_MAX); + + dev_id = p_se_cfg->dev_id; + + rc = dpp_se_hash_ext_cfg_get(p_se_cfg->dev, fun_id, &ext_mode, &ext_flag); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_se_hash_ext_cfg_get"); + + ext_flag = 1; + + if (p_ddr_cfg->width_mode == DDR_WIDTH_256b) + { + ext_mode = (ext_mode & (~(1U << bulk_id))); + } + else if (p_ddr_cfg->width_mode == DDR_WIDTH_512b) + { + ext_mode = (ext_mode | (1U << bulk_id)); + } + +#if DPP_WRITE_FILE_EN + ext_cfg_file_reg_addr = 0xbc + fun_id * 4; + + p_hash_file_reg = DPP_GET_HASH_FILE_REG(); + ext_cfg_file_reg = p_hash_file_reg->ext_cfg_file_reg[fun_id]; + + ZXIC_COMM_UINT32_GET_BITS(ext_mode_file, + ext_cfg_file_reg, + HASH_EXT_MODE_BT_START, + HASH_EXT_MODE_BT_WIDTH); + ZXIC_COMM_UINT32_GET_BITS(ext_flag_file, + ext_cfg_file_reg, + HASH_EXT_FLAG_BT_START, + HASH_EXT_FLAG_BT_WIDTH); + + ext_flag_file = 1; + + if (DDR_WIDTH_256b == p_ddr_cfg->width_mode) + { + ext_mode_file = (ext_mode_file & (~(1U << bulk_id))); + } + else if (p_ddr_cfg->width_mode == DDR_WIDTH_512b) + { + ext_mode_file = (ext_mode_file | (1U << bulk_id)); + } + + ZXIC_COMM_UINT32_WRITE_BITS(ext_cfg_file_reg, + ext_mode_file, + HASH_EXT_MODE_BT_START, + HASH_EXT_MODE_BT_WIDTH); + ZXIC_COMM_UINT32_WRITE_BITS(ext_cfg_file_reg, + ext_flag_file, + HASH_EXT_FLAG_BT_START, + HASH_EXT_FLAG_BT_WIDTH); + + p_hash_file_reg->ext_cfg_file_reg[fun_id] = ext_cfg_file_reg; + + rc = dpp_data_w2f(p_se_cfg->reg_base + ext_cfg_file_reg_addr, &p_hash_file_reg->ext_cfg_file_reg[fun_id], FILE_TYPE_REG); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_data_w2f"); +#endif + + rc = dpp_se_hash_ext_cfg_set(p_se_cfg->dev, fun_id, ext_mode, ext_flag); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_se_hash_ext_cfg_set"); + + return DPP_OK; +} + +/***********************************************************/ +/** +* @param p_se_cfg 算法模块公共管理数据结构指针 +* @param fun_id hash引擎号 +* +* @return +* @remark 无 +* @see +* @author wcl @date 2014/07/31 +************************************************************/ +DPP_STATUS dpp_hash_ext_cfg_clr(DPP_SE_CFG *p_se_cfg, ZXIC_UINT32 fun_id) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 ext_mode = 0; + ZXIC_UINT32 ext_flag = 0; + ZXIC_UINT32 dev_id = 0; + +#if DPP_WRITE_FILE_EN + ZXIC_UINT32 ddr_cfg_dat = 0; + ZXIC_UINT32 ext_cfg_reg_addr = 0; +#endif + + ZXIC_COMM_CHECK_POINT(p_se_cfg); + ZXIC_COMM_CHECK_INDEX(fun_id, DPP_HASH_ID_MIN, DPP_HASH_ID_MAX); + + dev_id = p_se_cfg->dev_id; + +#if DPP_WRITE_FILE_EN + ext_cfg_reg_addr = 0xbc + fun_id * 4; + + rc = dpp_data_w2f(p_se_cfg->reg_base + ext_cfg_reg_addr, &ddr_cfg_dat, FILE_TYPE_REG); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_data_w2f"); +#endif + + rc = dpp_se_hash_ext_cfg_set(p_se_cfg->dev, + fun_id, + ext_mode, + ext_flag); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_se_hash_ext_cfg_set"); + + return DPP_OK; +} + +/***********************************************************/ +/** hash 业务表ddr深度配置 +* @param p_se_cfg 算法模块公共管理数据结构指针 +* @param fun_id hash引擎号 +* @param bulk_id +* @param p_ddr_cfg +* +* @return +* @remark 无 +* @see +* @author tf @date 2016/01/28 +************************************************************/ +DPP_STATUS dpp_hash_tbl_depth_write(DPP_SE_CFG *p_se_cfg, + ZXIC_UINT32 fun_id, + ZXIC_UINT32 bulk_id, + HASH_DDR_CFG *p_ddr_cfg) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 ext_depth = 0; + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 hash_tbl0_depth = 0; + ZXIC_UINT32 hash_tbl1_depth = 0; + ZXIC_UINT32 hash_tbl2_depth = 0; + ZXIC_UINT32 hash_tbl3_depth = 0; + ZXIC_UINT32 hash_tbl4_depth = 0; + ZXIC_UINT32 hash_tbl5_depth = 0; + ZXIC_UINT32 hash_tbl6_depth = 0; + ZXIC_UINT32 hash_tbl7_depth = 0; + +#if DPP_WRITE_FILE_EN + ZXIC_UINT32 hash_tbl0_depth_file = 0; + ZXIC_UINT32 hash_tbl1_depth_file = 0; + ZXIC_UINT32 hash_tbl2_depth_file = 0; + ZXIC_UINT32 hash_tbl3_depth_file = 0; + ZXIC_UINT32 hash_tbl4_depth_file = 0; + ZXIC_UINT32 hash_tbl5_depth_file = 0; + ZXIC_UINT32 hash_tbl6_depth_file = 0; + ZXIC_UINT32 hash_tbl7_depth_file = 0; + ZXIC_UINT32 tbl03_depth_file_reg = 0; + ZXIC_UINT32 tbl47_depth_file_reg = 0; + ZXIC_UINT32 hash_tbl_depth_file_reg_addr = 0; + DPP_HASH_FILE_REG_T *p_hash_file_reg = NULL; +#endif + + ZXIC_UINT32 hash_tbl_depth_array[HASH_BULK_NUM] = {0}; + + ZXIC_COMM_CHECK_POINT(p_se_cfg); + ZXIC_COMM_CHECK_POINT(p_ddr_cfg); + ZXIC_COMM_CHECK_INDEX(fun_id, DPP_HASH_ID_MIN, DPP_HASH_ID_MAX); + ZXIC_COMM_CHECK_INDEX(bulk_id, HASH_BULK_ID_MIN, HASH_BULK_ID_MAX); + + dev_id = p_se_cfg->dev_id; + + ext_depth = dpp_hash_ddr_depth_conv(p_ddr_cfg->item_num); + + if (((ZXIC_UINT32)1 << ext_depth) != p_ddr_cfg->item_num) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "ErrCode[ 0x%x ]: Hash DDR item num:[ %d ] is not N power of 2.\n", + DPP_HASH_RC_INVALID_PARA, + p_ddr_cfg->item_num); + ZXIC_COMM_ASSERT(0); + return DPP_HASH_RC_INVALID_PARA; + } + + rc = dpp_se_hash_tbl_depth_get(p_se_cfg->dev, + fun_id, + &hash_tbl0_depth, + &hash_tbl1_depth, + &hash_tbl2_depth, + &hash_tbl3_depth, + &hash_tbl4_depth, + &hash_tbl5_depth, + &hash_tbl6_depth, + &hash_tbl7_depth); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_se_hash_tbl_depth_get"); + + hash_tbl_depth_array[0] = hash_tbl0_depth; + hash_tbl_depth_array[1] = hash_tbl1_depth; + hash_tbl_depth_array[2] = hash_tbl2_depth; + hash_tbl_depth_array[3] = hash_tbl3_depth; + hash_tbl_depth_array[4] = hash_tbl4_depth; + hash_tbl_depth_array[5] = hash_tbl5_depth; + hash_tbl_depth_array[6] = hash_tbl6_depth; + hash_tbl_depth_array[7] = hash_tbl7_depth; + + + hash_tbl_depth_array[bulk_id] = ext_depth; + + hash_tbl0_depth = hash_tbl_depth_array[0]; + hash_tbl1_depth = hash_tbl_depth_array[1]; + hash_tbl2_depth = hash_tbl_depth_array[2]; + hash_tbl3_depth = hash_tbl_depth_array[3]; + hash_tbl4_depth = hash_tbl_depth_array[4]; + hash_tbl5_depth = hash_tbl_depth_array[5]; + hash_tbl6_depth = hash_tbl_depth_array[6]; + hash_tbl7_depth = hash_tbl_depth_array[7]; + +#if DPP_WRITE_FILE_EN + hash_tbl_depth_file_reg_addr = 0x01a4 + fun_id * 8; + + p_hash_file_reg = DPP_GET_HASH_FILE_REG(); + tbl03_depth_file_reg = p_hash_file_reg->hash_depth_file_regs[fun_id].tbl03_depth_file_reg; + tbl47_depth_file_reg = p_hash_file_reg->hash_depth_file_regs[fun_id].tbl47_depth_file_reg; + + ZXIC_COMM_UINT32_GET_BITS(hash_tbl0_depth_file, tbl03_depth_file_reg, HASH_TBL0_DEPTH_BT_START, HASH_TBL0_DEPTH_BT_WIDTH); + ZXIC_COMM_UINT32_GET_BITS(hash_tbl1_depth_file, tbl03_depth_file_reg, HASH_TBL1_DEPTH_BT_START, HASH_TBL1_DEPTH_BT_WIDTH); + ZXIC_COMM_UINT32_GET_BITS(hash_tbl2_depth_file, tbl03_depth_file_reg, HASH_TBL2_DEPTH_BT_START, HASH_TBL2_DEPTH_BT_WIDTH); + ZXIC_COMM_UINT32_GET_BITS(hash_tbl3_depth_file, tbl03_depth_file_reg, HASH_TBL3_DEPTH_BT_START, HASH_TBL3_DEPTH_BT_WIDTH); + + ZXIC_COMM_UINT32_GET_BITS(hash_tbl4_depth_file, tbl47_depth_file_reg, HASH_TBL4_DEPTH_BT_START, HASH_TBL4_DEPTH_BT_WIDTH); + ZXIC_COMM_UINT32_GET_BITS(hash_tbl5_depth_file, tbl47_depth_file_reg, HASH_TBL5_DEPTH_BT_START, HASH_TBL5_DEPTH_BT_WIDTH); + ZXIC_COMM_UINT32_GET_BITS(hash_tbl6_depth_file, tbl47_depth_file_reg, HASH_TBL6_DEPTH_BT_START, HASH_TBL6_DEPTH_BT_WIDTH); + ZXIC_COMM_UINT32_GET_BITS(hash_tbl7_depth_file, tbl47_depth_file_reg, HASH_TBL7_DEPTH_BT_START, HASH_TBL7_DEPTH_BT_WIDTH); + + hash_tbl_depth_array[0] = hash_tbl0_depth_file; + hash_tbl_depth_array[1] = hash_tbl1_depth_file; + hash_tbl_depth_array[2] = hash_tbl2_depth_file; + hash_tbl_depth_array[3] = hash_tbl3_depth_file; + hash_tbl_depth_array[4] = hash_tbl4_depth_file; + hash_tbl_depth_array[5] = hash_tbl5_depth_file; + hash_tbl_depth_array[6] = hash_tbl6_depth_file; + hash_tbl_depth_array[7] = hash_tbl7_depth_file; + + + hash_tbl_depth_array[bulk_id] = ext_depth; + + hash_tbl0_depth_file = hash_tbl_depth_array[0]; + hash_tbl1_depth_file = hash_tbl_depth_array[1]; + hash_tbl2_depth_file = hash_tbl_depth_array[2]; + hash_tbl3_depth_file = hash_tbl_depth_array[3]; + hash_tbl4_depth_file = hash_tbl_depth_array[4]; + hash_tbl5_depth_file = hash_tbl_depth_array[5]; + hash_tbl6_depth_file = hash_tbl_depth_array[6]; + hash_tbl7_depth_file = hash_tbl_depth_array[7]; + + ZXIC_COMM_UINT32_WRITE_BITS(tbl03_depth_file_reg, hash_tbl0_depth_file, HASH_TBL0_DEPTH_BT_START, HASH_TBL0_DEPTH_BT_WIDTH); + ZXIC_COMM_UINT32_WRITE_BITS(tbl03_depth_file_reg, hash_tbl1_depth_file, HASH_TBL1_DEPTH_BT_START, HASH_TBL1_DEPTH_BT_WIDTH); + ZXIC_COMM_UINT32_WRITE_BITS(tbl03_depth_file_reg, hash_tbl2_depth_file, HASH_TBL2_DEPTH_BT_START, HASH_TBL2_DEPTH_BT_WIDTH); + ZXIC_COMM_UINT32_WRITE_BITS(tbl03_depth_file_reg, hash_tbl3_depth_file, HASH_TBL3_DEPTH_BT_START, HASH_TBL3_DEPTH_BT_WIDTH); + + ZXIC_COMM_UINT32_WRITE_BITS(tbl47_depth_file_reg, hash_tbl4_depth_file, HASH_TBL4_DEPTH_BT_START, HASH_TBL4_DEPTH_BT_WIDTH); + ZXIC_COMM_UINT32_WRITE_BITS(tbl47_depth_file_reg, hash_tbl5_depth_file, HASH_TBL5_DEPTH_BT_START, HASH_TBL5_DEPTH_BT_WIDTH); + ZXIC_COMM_UINT32_WRITE_BITS(tbl47_depth_file_reg, hash_tbl6_depth_file, HASH_TBL6_DEPTH_BT_START, HASH_TBL6_DEPTH_BT_WIDTH); + ZXIC_COMM_UINT32_WRITE_BITS(tbl47_depth_file_reg, hash_tbl7_depth_file, HASH_TBL7_DEPTH_BT_START, HASH_TBL7_DEPTH_BT_WIDTH); + + p_hash_file_reg->hash_depth_file_regs[fun_id].tbl03_depth_file_reg = tbl03_depth_file_reg; + p_hash_file_reg->hash_depth_file_regs[fun_id].tbl47_depth_file_reg = tbl47_depth_file_reg; + + rc = dpp_data_w2f(p_se_cfg->reg_base + hash_tbl_depth_file_reg_addr, &tbl03_depth_file_reg, FILE_TYPE_REG); + rc = dpp_data_w2f(p_se_cfg->reg_base + hash_tbl_depth_file_reg_addr + 4, &tbl47_depth_file_reg, FILE_TYPE_REG) + rc; + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_data_w2f"); +#endif + + rc = dpp_se_hash_tbl_depth_set(p_se_cfg->dev, + fun_id, + hash_tbl0_depth, + hash_tbl1_depth, + hash_tbl2_depth, + hash_tbl3_depth, + hash_tbl4_depth, + hash_tbl5_depth, + hash_tbl6_depth, + hash_tbl7_depth); + + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_se_hash_tbl_depth_set"); + + return DPP_OK; +} + +/***********************************************************/ +/** hash 业务表ddr深度恢复默认值 +* @param p_se_cfg 算法模块公共管理数据结构指针 +* @param fun_id hash引擎号 +* +* @return +* @remark 无 +* @see +* @author tf @date 2016/01/28 +************************************************************/ +DPP_STATUS dpp_hash_tbl_depth_clr(DPP_SE_CFG *p_se_cfg, ZXIC_UINT32 fun_id) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 hash_tbl0_depth = 0x12; + ZXIC_UINT32 hash_tbl1_depth = 0x12; + ZXIC_UINT32 hash_tbl2_depth = 0x12; + ZXIC_UINT32 hash_tbl3_depth = 0x12; + ZXIC_UINT32 hash_tbl4_depth = 0x12; + ZXIC_UINT32 hash_tbl5_depth = 0x12; + ZXIC_UINT32 hash_tbl6_depth = 0x12; + ZXIC_UINT32 hash_tbl7_depth = 0x12; + +#if DPP_WRITE_FILE_EN + ZXIC_UINT32 hash_tbl_depth_reg_file_addr = 0; + ZXIC_UINT32 hash_tbl03_depth_reg_file_dat = 0; + ZXIC_UINT32 hash_tbl47_depth_reg_file_dat = 0; +#endif + + ZXIC_COMM_CHECK_POINT(p_se_cfg); + ZXIC_COMM_CHECK_INDEX(fun_id, DPP_HASH_ID_MIN, DPP_HASH_ID_MAX); + + dev_id = p_se_cfg->dev_id; + +#if DPP_WRITE_FILE_EN + hash_tbl_depth_reg_file_addr = 0x01a4 + fun_id * 8; + + ZXIC_COMM_UINT32_WRITE_BITS(hash_tbl03_depth_reg_file_dat, hash_tbl0_depth, HASH_TBL0_DEPTH_BT_START, HASH_TBL0_DEPTH_BT_WIDTH); + ZXIC_COMM_UINT32_WRITE_BITS(hash_tbl03_depth_reg_file_dat, hash_tbl1_depth, HASH_TBL1_DEPTH_BT_START, HASH_TBL1_DEPTH_BT_WIDTH); + ZXIC_COMM_UINT32_WRITE_BITS(hash_tbl03_depth_reg_file_dat, hash_tbl2_depth, HASH_TBL2_DEPTH_BT_START, HASH_TBL2_DEPTH_BT_WIDTH); + ZXIC_COMM_UINT32_WRITE_BITS(hash_tbl03_depth_reg_file_dat, hash_tbl3_depth, HASH_TBL3_DEPTH_BT_START, HASH_TBL3_DEPTH_BT_WIDTH); + + ZXIC_COMM_UINT32_WRITE_BITS(hash_tbl47_depth_reg_file_dat, hash_tbl4_depth, HASH_TBL4_DEPTH_BT_START, HASH_TBL4_DEPTH_BT_WIDTH); + ZXIC_COMM_UINT32_WRITE_BITS(hash_tbl47_depth_reg_file_dat, hash_tbl5_depth, HASH_TBL5_DEPTH_BT_START, HASH_TBL5_DEPTH_BT_WIDTH); + ZXIC_COMM_UINT32_WRITE_BITS(hash_tbl47_depth_reg_file_dat, hash_tbl6_depth, HASH_TBL6_DEPTH_BT_START, HASH_TBL6_DEPTH_BT_WIDTH); + ZXIC_COMM_UINT32_WRITE_BITS(hash_tbl47_depth_reg_file_dat, hash_tbl7_depth, HASH_TBL7_DEPTH_BT_START, HASH_TBL7_DEPTH_BT_WIDTH); + + rc = dpp_data_w2f(p_se_cfg->reg_base + hash_tbl_depth_reg_file_addr, &hash_tbl03_depth_reg_file_dat, FILE_TYPE_REG); + rc = dpp_data_w2f(p_se_cfg->reg_base + hash_tbl_depth_reg_file_addr + 4, &hash_tbl47_depth_reg_file_dat, FILE_TYPE_REG) + rc; + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_data_w2f"); +#endif + + rc = dpp_se_hash_tbl_depth_set(p_se_cfg->dev, + fun_id, + hash_tbl0_depth, + hash_tbl1_depth, + hash_tbl2_depth, + hash_tbl3_depth, + hash_tbl4_depth, + hash_tbl5_depth, + hash_tbl6_depth, + hash_tbl7_depth); + + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_se_hash_tbl_depth_set"); + + return DPP_OK; +} + +/***********************************************************/ +/** hash CRC多项式选择 +* @param fun_id hash引擎号 +* @param crc_sel +* +* @return +* @remark 无 +* @see +* @author tf @date 2016/01/28 +************************************************************/ +DPP_STATUS dpp_hash_tbl_crc_poly_write(DPP_SE_CFG *p_se_cfg, + ZXIC_UINT32 fun_id, + ZXIC_UINT32 bulk_id, + ZXIC_UINT32 crc_sel) +{ + DPP_STATUS rtn = DPP_OK; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 hash_tbl_crc_cfg_bt_start = 0; + ZXIC_UINT32 hash_tbl_crc_cfg_bt_width = 2; + DPP_SE4K_SE_ALG_HASH10_EXT_CRC_CFG_T hash01_ext_crc_cfg = {0}; + DPP_SE4K_SE_ALG_HASH32_EXT_CRC_CFG_T hash23_ext_crc_cfg = {0}; + +#if DPP_WRITE_FILE_EN + ZXIC_UINT32 ext_crc_cfg_file_reg = 0; + ZXIC_UINT32 ext_crc_cfg_file_reg_addr = 0; + DPP_HASH_FILE_REG_T *p_hash_file_reg = NULL; +#endif + + ZXIC_COMM_ASSERT(p_se_cfg); + + dev_id = p_se_cfg->dev_id; + + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, fun_id, DPP_HASH_ID_MIN, DPP_HASH_ID_MAX); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, bulk_id, HASH_BULK_ID_MIN, HASH_BULK_ID_MAX); + + hash_tbl_crc_cfg_bt_start = bulk_id * 2; + + if (fun_id == 0 || fun_id == 1) + { + rtn = dpp_reg_read(p_se_cfg->dev, SE4K_SE_ALG_HASH10_EXT_CRC_CFGr, 0, 0, &hash01_ext_crc_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "dpp_reg_read"); + + if (fun_id == 0) + { + ZXIC_COMM_UINT32_WRITE_BITS(hash01_ext_crc_cfg.hash0_crc_cfg, crc_sel, hash_tbl_crc_cfg_bt_start, hash_tbl_crc_cfg_bt_width); + } + else + { + ZXIC_COMM_UINT32_WRITE_BITS(hash01_ext_crc_cfg.hash1_crc_cfg, crc_sel, hash_tbl_crc_cfg_bt_start, hash_tbl_crc_cfg_bt_width); + } + + rtn = dpp_reg_write(p_se_cfg->dev, SE4K_SE_ALG_HASH10_EXT_CRC_CFGr, 0, 0, &hash01_ext_crc_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "dpp_reg_write"); + + } + else + { + rtn = dpp_reg_read(p_se_cfg->dev, SE4K_SE_ALG_HASH32_EXT_CRC_CFGr, 0, 0, &hash23_ext_crc_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "dpp_reg_read"); + + if (fun_id == 2) + { + ZXIC_COMM_UINT32_WRITE_BITS(hash23_ext_crc_cfg.hash2_crc_cfg, crc_sel, hash_tbl_crc_cfg_bt_start, hash_tbl_crc_cfg_bt_width); + } + else + { + ZXIC_COMM_UINT32_WRITE_BITS(hash23_ext_crc_cfg.hash3_crc_cfg, crc_sel, hash_tbl_crc_cfg_bt_start, hash_tbl_crc_cfg_bt_width); + } + + rtn = dpp_reg_write(p_se_cfg->dev, SE4K_SE_ALG_HASH32_EXT_CRC_CFGr, 0, 0, &hash23_ext_crc_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "dpp_reg_write"); + } + +#if DPP_WRITE_FILE_EN + p_hash_file_reg = DPP_GET_HASH_FILE_REG(); + + if (fun_id == 0 || fun_id == 1) + { + ext_crc_cfg_file_reg_addr = 0x01cc; + + hash_tbl_crc_cfg_bt_start = fun_id * 16 + bulk_id * 2; + + ext_crc_cfg_file_reg = p_hash_file_reg->ext_crc_cfg_file_reg[0]; + ZXIC_COMM_UINT32_WRITE_BITS(ext_crc_cfg_file_reg, crc_sel, hash_tbl_crc_cfg_bt_start, hash_tbl_crc_cfg_bt_width); + + p_hash_file_reg->ext_crc_cfg_file_reg[0] = ext_crc_cfg_file_reg; + + rtn = dpp_data_w2f(p_se_cfg->reg_base + ext_crc_cfg_file_reg_addr, &p_hash_file_reg->ext_crc_cfg_file_reg[0], FILE_TYPE_REG); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "dpp_data_w2f"); + + } + else + { + ext_crc_cfg_file_reg_addr = 0x01d0; + + hash_tbl_crc_cfg_bt_start = (fun_id - 2) * 16 + bulk_id * 2; + + ext_crc_cfg_file_reg = p_hash_file_reg->ext_crc_cfg_file_reg[1]; + ZXIC_COMM_UINT32_WRITE_BITS(ext_crc_cfg_file_reg, crc_sel, hash_tbl_crc_cfg_bt_start, hash_tbl_crc_cfg_bt_width); + + p_hash_file_reg->ext_crc_cfg_file_reg[1] = ext_crc_cfg_file_reg; + + rtn = dpp_data_w2f(p_se_cfg->reg_base + ext_crc_cfg_file_reg_addr, &p_hash_file_reg->ext_crc_cfg_file_reg[1], FILE_TYPE_REG); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rtn, "dpp_data_w2f"); + } + +#endif + + return DPP_OK; +} + + +/***********************************************************/ +/** 清除hash引擎的所有hash表项(清除软件配置) +* @param p_se_cfg +* @param hash_id +* @param bulk_id +* +* @return +* @remark 无 +* @see +* @author cq @date 2023/08/18 +************************************************************/ +DPP_STATUS dpp_hash_soft_all_entry_delete(DPP_SE_CFG *p_se_cfg,ZXIC_UINT32 hash_id) +{ + ZXIC_UINT32 rc = 0; + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT8 table_id = 0; + ZXIC_UINT32 bulk_id = 0; + + D_NODE *p_node = NULL; + ZXIC_RB_TN *p_rb_tn = NULL; + ZXIC_RB_TN *p_rb_tn_rtn = NULL; + D_HEAD *p_head_hash_rb = NULL; + DPP_HASH_CFG *p_hash_cfg = NULL; + FUNC_ID_INFO *p_func_info = NULL; + DPP_HASH_RBKEY_INFO *p_rbkey = NULL; + DPP_HASH_RBKEY_INFO *p_rbkey_rtn = NULL; + SE_ITEM_CFG *p_item = NULL; + + ZXIC_COMM_CHECK_POINT(p_se_cfg); + ZXIC_COMM_CHECK_INDEX(hash_id, 0, HASH_FUNC_ID_NUM - 1); + + dev_id = p_se_cfg->dev_id; + + p_func_info = DPP_GET_FUN_INFO(p_se_cfg, hash_id); + DPP_SE_CHECK_FUN(p_func_info, hash_id, FUN_HASH); + + p_hash_cfg = (DPP_HASH_CFG *)p_func_info->fun_ptr; + p_head_hash_rb = &p_hash_cfg->hash_rb.tn_list; + + while (p_head_hash_rb->used) + { + p_node = p_head_hash_rb->p_next; + p_rb_tn = (ZXIC_RB_TN *)p_node->data; + p_rbkey = (DPP_HASH_RBKEY_INFO *)p_rb_tn->p_key; + table_id = DPP_GET_HASH_TBL_ID(p_rbkey->key); + bulk_id = ((table_id >> 2) & 0x7); + ZXIC_COMM_CHECK_DEV_INDEX(dev_id, bulk_id, 0, HASH_BULK_NUM - 1); + + rc = zxic_comm_rb_delete(&p_hash_cfg->hash_rb, p_rbkey, &p_rb_tn_rtn); + if (ZXIC_RBT_RC_SRHFAIL == rc) + { + p_hash_cfg->hash_stat.delete_fail++; + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "Error!there is not item in hash!\n"); + return DPP_HASH_RC_DEL_SRHFAIL; + } + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_rb_tn_rtn); + p_rbkey_rtn = (DPP_HASH_RBKEY_INFO *)(p_rb_tn_rtn->p_key); + p_item = p_rbkey_rtn->p_item_info; + + rc = zxic_comm_double_link_del(&(p_rbkey_rtn->entry_dn), &(p_item->item_list)); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "zxic_comm_double_link_del"); + p_item->wrt_mask &= ~(DPP_GET_HASH_ENTRY_MASK(p_rbkey_rtn->entry_size, p_rbkey_rtn->entry_pos)) & 0xF; + + if (0 == p_item->item_list.used) + { + if ((ITEM_DDR_256 == p_item->item_type) || (ITEM_DDR_512 == p_item->item_type)) + { + /* modify coverity by yinxh 2021.03.10*,以256bit为单位。暂不考虑512bit的情况*/ + ZXIC_COMM_CHECK_INDEX_UPPER(p_item->item_index, p_hash_cfg->p_bulk_ddr_info[bulk_id]->item_num); + p_hash_cfg->p_bulk_ddr_info[bulk_id]->p_item_array[p_item->item_index] = NULL; + ZXIC_COMM_FREE(p_item); + } + else + { + p_item->valid = 0; + } + } + + ZXIC_COMM_FREE(p_rbkey_rtn); + ZXIC_COMM_FREE(p_rb_tn_rtn); + p_hash_cfg->hash_stat.delete_ok++; + } + + return DPP_OK; +} + +/***********************************************************/ +/** 卸载软件上分配的hash资源(主要针对malloc释放) +* @param dev_id 设备号 +* @return +* @remark 无 +* @see +* @author cq @date 2023/12/20 +************************************************************/ +DPP_STATUS dpp_hash_soft_uninstall(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 hash_id = 0; + + ZXIC_COMM_CHECK_INDEX(dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + + for(hash_id=0;hash_idis_used) + { + ZXIC_COMM_TRACE_DEBUG("Error[0x%x], fun_id [%d] is not init\n!", DPP_SE_RC_FUN_INVALID, hash_id); + return DPP_OK; + } + + /*软件删除表项,删除红黑树节点*/ + rc = dpp_hash_soft_all_entry_delete(p_se_cfg,hash_id); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_hash_soft_all_entry_delete"); + + /*释放独占标识内存*/ + p_hash_cfg = (DPP_HASH_CFG *)p_func_info->fun_ptr; + for (i = 0; i < HASH_BULK_NUM; i++) + { + if ((&p_hash_cfg->hash_stat)->p_bulk_zcam_mono[i] != NULL) + { + ZXIC_COMM_FREE((&p_hash_cfg->hash_stat)->p_bulk_zcam_mono[i]); + (&p_hash_cfg->hash_stat)->p_bulk_zcam_mono[i] = NULL; + } + } + + /*释放DDR分配的所有内存*/ + p_head_ddr_cfg_rb = &p_hash_cfg->ddr_cfg_rb.tn_list; + while (p_head_ddr_cfg_rb->used) + { + p_node = p_head_ddr_cfg_rb->p_next; + + p_rb_tn = (ZXIC_RB_TN *)p_node->data; + p_rbkey = p_rb_tn->p_key; + + rc = zxic_comm_rb_delete(&p_hash_cfg->ddr_cfg_rb, p_rbkey, &p_rb_tn_rtn); + + if (ZXIC_RBT_RC_SRHFAIL == rc) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "ddr_cfg_rb delete key is not exist, key: 0x"); + } + else + { + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "zxic_comm_rb_delete"); + } + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_rb_tn_rtn); + p_temp_rbkey = (HASH_DDR_CFG *)(p_rb_tn_rtn->p_key); + ZXIC_COMM_FREE(p_temp_rbkey->p_item_array); + p_temp_rbkey->p_item_array = NULL; + ZXIC_COMM_FREE(p_temp_rbkey); + ZXIC_COMM_FREE(p_rb_tn_rtn); + } + + rc = dpp_hash_zcam_resource_deinit(p_hash_cfg); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_hash_zcam_resource_deinit"); + + rc = dpp_se_fun_deinit(p_se_cfg, (hash_id & 0xff), FUN_HASH); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_se_fun_deinit"); + + ZXIC_COMM_MEMSET(g_tbl_id_info[dev_id][hash_id], 0, HASH_TBL_ID_NUM * sizeof(DPP_HASH_TBL_ID_INFO)); + + return DPP_OK; +} + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/dpp_hash_crc.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/dpp_hash_crc.c new file mode 100755 index 0000000..5dc4ef1 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/dpp_hash_crc.c @@ -0,0 +1,381 @@ +#include "zxic_common.h" +#include "dpp_hash_crc.h" + +ZXIC_UINT16 g_crc16_rst[256][8] = { + {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, + {0x1021, 0x8005, 0x3d65, 0xab47, 0x3453, 0x0357, 0x0589, 0xa02b}, + {0x2042, 0x800f, 0x7aca, 0xfdc9, 0x68a6, 0x06ae, 0x0b12, 0xe07d}, + {0x3063, 0x000a, 0x47af, 0x568e, 0x5cf5, 0x05f9, 0x0e9b, 0x4056}, + {0x4084, 0x801b, 0xf594, 0x50d5, 0xd14c, 0x0d5c, 0x1624, 0x60d1}, + {0x50a5, 0x001e, 0xc8f1, 0xfb92, 0xe51f, 0x0e0b, 0x13ad, 0xc0fa}, + {0x60c6, 0x0014, 0x8f5e, 0xad1c, 0xb9ea, 0x0bf2, 0x1d36, 0x80ac}, + {0x70e7, 0x8011, 0xb23b, 0x065b, 0x8db9, 0x08a5, 0x18bf, 0x2087}, + {0x8108, 0x8033, 0xd64d, 0xa1aa, 0x96cb, 0x1ab8, 0x2c48, 0xc1a2}, + {0x9129, 0x0036, 0xeb28, 0x0aed, 0xa298, 0x19ef, 0x29c1, 0x6189}, + {0xa14a, 0x003c, 0xac87, 0x5c63, 0xfe6d, 0x1c16, 0x275a, 0x21df}, + {0xb16b, 0x8039, 0x91e2, 0xf724, 0xca3e, 0x1f41, 0x22d3, 0x81f4}, + {0xc18c, 0x0028, 0x23d9, 0xf17f, 0x4787, 0x17e4, 0x3a6c, 0xa173}, + {0xd1ad, 0x802d, 0x1ebc, 0x5a38, 0x73d4, 0x14b3, 0x3fe5, 0x0158}, + {0xe1ce, 0x8027, 0x5913, 0x0cb6, 0x2f21, 0x114a, 0x317e, 0x410e}, + {0xf1ef, 0x0022, 0x6476, 0xa7f1, 0x1b72, 0x121d, 0x34f7, 0xe125}, + {0x1231, 0x8063, 0x91ff, 0xe813, 0x19c5, 0x3570, 0x5890, 0x236f}, + {0x0210, 0x0066, 0xac9a, 0x4354, 0x2d96, 0x3627, 0x5d19, 0x8344}, + {0x3273, 0x006c, 0xeb35, 0x15da, 0x7163, 0x33de, 0x5382, 0xc312}, + {0x2252, 0x8069, 0xd650, 0xbe9d, 0x4530, 0x3089, 0x560b, 0x6339}, + {0x52b5, 0x0078, 0x646b, 0xb8c6, 0xc889, 0x382c, 0x4eb4, 0x43be}, + {0x4294, 0x807d, 0x590e, 0x1381, 0xfcda, 0x3b7b, 0x4b3d, 0xe395}, + {0x72f7, 0x8077, 0x1ea1, 0x450f, 0xa02f, 0x3e82, 0x45a6, 0xa3c3}, + {0x62d6, 0x0072, 0x23c4, 0xee48, 0x947c, 0x3dd5, 0x402f, 0x03e8}, + {0x9339, 0x0050, 0x47b2, 0x49b9, 0x8f0e, 0x2fc8, 0x74d8, 0xe2cd}, + {0x8318, 0x8055, 0x7ad7, 0xe2fe, 0xbb5d, 0x2c9f, 0x7151, 0x42e6}, + {0xb37b, 0x805f, 0x3d78, 0xb470, 0xe7a8, 0x2966, 0x7fca, 0x02b0}, + {0xa35a, 0x005a, 0x001d, 0x1f37, 0xd3fb, 0x2a31, 0x7a43, 0xa29b}, + {0xd3bd, 0x804b, 0xb226, 0x196c, 0x5e42, 0x2294, 0x62fc, 0x821c}, + {0xc39c, 0x004e, 0x8f43, 0xb22b, 0x6a11, 0x21c3, 0x6775, 0x2237}, + {0xf3ff, 0x0044, 0xc8ec, 0xe4a5, 0x36e4, 0x243a, 0x69ee, 0x6261}, + {0xe3de, 0x8041, 0xf589, 0x4fe2, 0x02b7, 0x276d, 0x6c67, 0xc24a}, + {0x2462, 0x80c3, 0x1e9b, 0x7b61, 0x338a, 0x6ae0, 0xb120, 0x46de}, + {0x3443, 0x00c6, 0x23fe, 0xd026, 0x07d9, 0x69b7, 0xb4a9, 0xe6f5}, + {0x0420, 0x00cc, 0x6451, 0x86a8, 0x5b2c, 0x6c4e, 0xba32, 0xa6a3}, + {0x1401, 0x80c9, 0x5934, 0x2def, 0x6f7f, 0x6f19, 0xbfbb, 0x0688}, + {0x64e6, 0x00d8, 0xeb0f, 0x2bb4, 0xe2c6, 0x67bc, 0xa704, 0x260f}, + {0x74c7, 0x80dd, 0xd66a, 0x80f3, 0xd695, 0x64eb, 0xa28d, 0x8624}, + {0x44a4, 0x80d7, 0x91c5, 0xd67d, 0x8a60, 0x6112, 0xac16, 0xc672}, + {0x5485, 0x00d2, 0xaca0, 0x7d3a, 0xbe33, 0x6245, 0xa99f, 0x6659}, + {0xa56a, 0x00f0, 0xc8d6, 0xdacb, 0xa541, 0x7058, 0x9d68, 0x877c}, + {0xb54b, 0x80f5, 0xf5b3, 0x718c, 0x9112, 0x730f, 0x98e1, 0x2757}, + {0x8528, 0x80ff, 0xb21c, 0x2702, 0xcde7, 0x76f6, 0x967a, 0x6701}, + {0x9509, 0x00fa, 0x8f79, 0x8c45, 0xf9b4, 0x75a1, 0x93f3, 0xc72a}, + {0xe5ee, 0x80eb, 0x3d42, 0x8a1e, 0x740d, 0x7d04, 0x8b4c, 0xe7ad}, + {0xf5cf, 0x00ee, 0x0027, 0x2159, 0x405e, 0x7e53, 0x8ec5, 0x4786}, + {0xc5ac, 0x00e4, 0x4788, 0x77d7, 0x1cab, 0x7baa, 0x805e, 0x07d0}, + {0xd58d, 0x80e1, 0x7aed, 0xdc90, 0x28f8, 0x78fd, 0x85d7, 0xa7fb}, + {0x3653, 0x00a0, 0x8f64, 0x9372, 0x2a4f, 0x5f90, 0xe9b0, 0x65b1}, + {0x2672, 0x80a5, 0xb201, 0x3835, 0x1e1c, 0x5cc7, 0xec39, 0xc59a}, + {0x1611, 0x80af, 0xf5ae, 0x6ebb, 0x42e9, 0x593e, 0xe2a2, 0x85cc}, + {0x0630, 0x00aa, 0xc8cb, 0xc5fc, 0x76ba, 0x5a69, 0xe72b, 0x25e7}, + {0x76d7, 0x80bb, 0x7af0, 0xc3a7, 0xfb03, 0x52cc, 0xff94, 0x0560}, + {0x66f6, 0x00be, 0x4795, 0x68e0, 0xcf50, 0x519b, 0xfa1d, 0xa54b}, + {0x5695, 0x00b4, 0x003a, 0x3e6e, 0x93a5, 0x5462, 0xf486, 0xe51d}, + {0x46b4, 0x80b1, 0x3d5f, 0x9529, 0xa7f6, 0x5735, 0xf10f, 0x4536}, + {0xb75b, 0x8093, 0x5929, 0x32d8, 0xbc84, 0x4528, 0xc5f8, 0xa413}, + {0xa77a, 0x0096, 0x644c, 0x999f, 0x88d7, 0x467f, 0xc071, 0x0438}, + {0x9719, 0x009c, 0x23e3, 0xcf11, 0xd422, 0x4386, 0xceea, 0x446e}, + {0x8738, 0x8099, 0x1e86, 0x6456, 0xe071, 0x40d1, 0xcb63, 0xe445}, + {0xf7df, 0x0088, 0xacbd, 0x620d, 0x6dc8, 0x4874, 0xd3dc, 0xc4c2}, + {0xe7fe, 0x808d, 0x91d8, 0xc94a, 0x599b, 0x4b23, 0xd655, 0x64e9}, + {0xd79d, 0x8087, 0xd677, 0x9fc4, 0x056e, 0x4eda, 0xd8ce, 0x24bf}, + {0xc7bc, 0x0082, 0xeb12, 0x3483, 0x313d, 0x4d8d, 0xdd47, 0x8494}, + {0x48c4, 0x8183, 0x3d36, 0xf6c2, 0x6714, 0xd5c0, 0x67c9, 0x8dbc}, + {0x58e5, 0x0186, 0x0053, 0x5d85, 0x5347, 0xd697, 0x6240, 0x2d97}, + {0x6886, 0x018c, 0x47fc, 0x0b0b, 0x0fb2, 0xd36e, 0x6cdb, 0x6dc1}, + {0x78a7, 0x8189, 0x7a99, 0xa04c, 0x3be1, 0xd039, 0x6952, 0xcdea}, + {0x0840, 0x0198, 0xc8a2, 0xa617, 0xb658, 0xd89c, 0x71ed, 0xed6d}, + {0x1861, 0x819d, 0xf5c7, 0x0d50, 0x820b, 0xdbcb, 0x7464, 0x4d46}, + {0x2802, 0x8197, 0xb268, 0x5bde, 0xdefe, 0xde32, 0x7aff, 0x0d10}, + {0x3823, 0x0192, 0x8f0d, 0xf099, 0xeaad, 0xdd65, 0x7f76, 0xad3b}, + {0xc9cc, 0x01b0, 0xeb7b, 0x5768, 0xf1df, 0xcf78, 0x4b81, 0x4c1e}, + {0xd9ed, 0x81b5, 0xd61e, 0xfc2f, 0xc58c, 0xcc2f, 0x4e08, 0xec35}, + {0xe98e, 0x81bf, 0x91b1, 0xaaa1, 0x9979, 0xc9d6, 0x4093, 0xac63}, + {0xf9af, 0x01ba, 0xacd4, 0x01e6, 0xad2a, 0xca81, 0x451a, 0x0c48}, + {0x8948, 0x81ab, 0x1eef, 0x07bd, 0x2093, 0xc224, 0x5da5, 0x2ccf}, + {0x9969, 0x01ae, 0x238a, 0xacfa, 0x14c0, 0xc173, 0x582c, 0x8ce4}, + {0xa90a, 0x01a4, 0x6425, 0xfa74, 0x4835, 0xc48a, 0x56b7, 0xccb2}, + {0xb92b, 0x81a1, 0x5940, 0x5133, 0x7c66, 0xc7dd, 0x533e, 0x6c99}, + {0x5af5, 0x01e0, 0xacc9, 0x1ed1, 0x7ed1, 0xe0b0, 0x3f59, 0xaed3}, + {0x4ad4, 0x81e5, 0x91ac, 0xb596, 0x4a82, 0xe3e7, 0x3ad0, 0x0ef8}, + {0x7ab7, 0x81ef, 0xd603, 0xe318, 0x1677, 0xe61e, 0x344b, 0x4eae}, + {0x6a96, 0x01ea, 0xeb66, 0x485f, 0x2224, 0xe549, 0x31c2, 0xee85}, + {0x1a71, 0x81fb, 0x595d, 0x4e04, 0xaf9d, 0xedec, 0x297d, 0xce02}, + {0x0a50, 0x01fe, 0x6438, 0xe543, 0x9bce, 0xeebb, 0x2cf4, 0x6e29}, + {0x3a33, 0x01f4, 0x2397, 0xb3cd, 0xc73b, 0xeb42, 0x226f, 0x2e7f}, + {0x2a12, 0x81f1, 0x1ef2, 0x188a, 0xf368, 0xe815, 0x27e6, 0x8e54}, + {0xdbfd, 0x81d3, 0x7a84, 0xbf7b, 0xe81a, 0xfa08, 0x1311, 0x6f71}, + {0xcbdc, 0x01d6, 0x47e1, 0x143c, 0xdc49, 0xf95f, 0x1698, 0xcf5a}, + {0xfbbf, 0x01dc, 0x004e, 0x42b2, 0x80bc, 0xfca6, 0x1803, 0x8f0c}, + {0xeb9e, 0x81d9, 0x3d2b, 0xe9f5, 0xb4ef, 0xfff1, 0x1d8a, 0x2f27}, + {0x9b79, 0x01c8, 0x8f10, 0xefae, 0x3956, 0xf754, 0x0535, 0x0fa0}, + {0x8b58, 0x81cd, 0xb275, 0x44e9, 0x0d05, 0xf403, 0x00bc, 0xaf8b}, + {0xbb3b, 0x81c7, 0xf5da, 0x1267, 0x51f0, 0xf1fa, 0x0e27, 0xefdd}, + {0xab1a, 0x01c2, 0xc8bf, 0xb920, 0x65a3, 0xf2ad, 0x0bae, 0x4ff6}, + {0x6ca6, 0x0140, 0x23ad, 0x8da3, 0x549e, 0xbf20, 0xd6e9, 0xcb62}, + {0x7c87, 0x8145, 0x1ec8, 0x26e4, 0x60cd, 0xbc77, 0xd360, 0x6b49}, + {0x4ce4, 0x814f, 0x5967, 0x706a, 0x3c38, 0xb98e, 0xddfb, 0x2b1f}, + {0x5cc5, 0x014a, 0x6402, 0xdb2d, 0x086b, 0xbad9, 0xd872, 0x8b34}, + {0x2c22, 0x815b, 0xd639, 0xdd76, 0x85d2, 0xb27c, 0xc0cd, 0xabb3}, + {0x3c03, 0x015e, 0xeb5c, 0x7631, 0xb181, 0xb12b, 0xc544, 0x0b98}, + {0x0c60, 0x0154, 0xacf3, 0x20bf, 0xed74, 0xb4d2, 0xcbdf, 0x4bce}, + {0x1c41, 0x8151, 0x9196, 0x8bf8, 0xd927, 0xb785, 0xce56, 0xebe5}, + {0xedae, 0x8173, 0xf5e0, 0x2c09, 0xc255, 0xa598, 0xfaa1, 0x0ac0}, + {0xfd8f, 0x0176, 0xc885, 0x874e, 0xf606, 0xa6cf, 0xff28, 0xaaeb}, + {0xcdec, 0x017c, 0x8f2a, 0xd1c0, 0xaaf3, 0xa336, 0xf1b3, 0xeabd}, + {0xddcd, 0x8179, 0xb24f, 0x7a87, 0x9ea0, 0xa061, 0xf43a, 0x4a96}, + {0xad2a, 0x0168, 0x0074, 0x7cdc, 0x1319, 0xa8c4, 0xec85, 0x6a11}, + {0xbd0b, 0x816d, 0x3d11, 0xd79b, 0x274a, 0xab93, 0xe90c, 0xca3a}, + {0x8d68, 0x8167, 0x7abe, 0x8115, 0x7bbf, 0xae6a, 0xe797, 0x8a6c}, + {0x9d49, 0x0162, 0x47db, 0x2a52, 0x4fec, 0xad3d, 0xe21e, 0x2a47}, + {0x7e97, 0x8123, 0xb252, 0x65b0, 0x4d5b, 0x8a50, 0x8e79, 0xe80d}, + {0x6eb6, 0x0126, 0x8f37, 0xcef7, 0x7908, 0x8907, 0x8bf0, 0x4826}, + {0x5ed5, 0x012c, 0xc898, 0x9879, 0x25fd, 0x8cfe, 0x856b, 0x0870}, + {0x4ef4, 0x8129, 0xf5fd, 0x333e, 0x11ae, 0x8fa9, 0x80e2, 0xa85b}, + {0x3e13, 0x0138, 0x47c6, 0x3565, 0x9c17, 0x870c, 0x985d, 0x88dc}, + {0x2e32, 0x813d, 0x7aa3, 0x9e22, 0xa844, 0x845b, 0x9dd4, 0x28f7}, + {0x1e51, 0x8137, 0x3d0c, 0xc8ac, 0xf4b1, 0x81a2, 0x934f, 0x68a1}, + {0x0e70, 0x0132, 0x0069, 0x63eb, 0xc0e2, 0x82f5, 0x96c6, 0xc88a}, + {0xff9f, 0x0110, 0x641f, 0xc41a, 0xdb90, 0x90e8, 0xa231, 0x29af}, + {0xefbe, 0x8115, 0x597a, 0x6f5d, 0xefc3, 0x93bf, 0xa7b8, 0x8984}, + {0xdfdd, 0x811f, 0x1ed5, 0x39d3, 0xb336, 0x9646, 0xa923, 0xc9d2}, + {0xcffc, 0x011a, 0x23b0, 0x9294, 0x8765, 0x9511, 0xacaa, 0x69f9}, + {0xbf1b, 0x810b, 0x918b, 0x94cf, 0x0adc, 0x9db4, 0xb415, 0x497e}, + {0xaf3a, 0x010e, 0xacee, 0x3f88, 0x3e8f, 0x9ee3, 0xb19c, 0xe955}, + {0x9f59, 0x0104, 0xeb41, 0x6906, 0x627a, 0x9b1a, 0xbf07, 0xa903}, + {0x8f78, 0x8101, 0xd624, 0xc241, 0x5629, 0x984d, 0xba8e, 0x0928}, + {0x9188, 0x8303, 0x7a6c, 0x46c3, 0xce28, 0xa8d7, 0xcf92, 0xbb53}, + {0x81a9, 0x0306, 0x4709, 0xed84, 0xfa7b, 0xab80, 0xca1b, 0x1b78}, + {0xb1ca, 0x030c, 0x00a6, 0xbb0a, 0xa68e, 0xae79, 0xc480, 0x5b2e}, + {0xa1eb, 0x8309, 0x3dc3, 0x104d, 0x92dd, 0xad2e, 0xc109, 0xfb05}, + {0xd10c, 0x0318, 0x8ff8, 0x1616, 0x1f64, 0xa58b, 0xd9b6, 0xdb82}, + {0xc12d, 0x831d, 0xb29d, 0xbd51, 0x2b37, 0xa6dc, 0xdc3f, 0x7ba9}, + {0xf14e, 0x8317, 0xf532, 0xebdf, 0x77c2, 0xa325, 0xd2a4, 0x3bff}, + {0xe16f, 0x0312, 0xc857, 0x4098, 0x4391, 0xa072, 0xd72d, 0x9bd4}, + {0x1080, 0x0330, 0xac21, 0xe769, 0x58e3, 0xb26f, 0xe3da, 0x7af1}, + {0x00a1, 0x8335, 0x9144, 0x4c2e, 0x6cb0, 0xb138, 0xe653, 0xdada}, + {0x30c2, 0x833f, 0xd6eb, 0x1aa0, 0x3045, 0xb4c1, 0xe8c8, 0x9a8c}, + {0x20e3, 0x033a, 0xeb8e, 0xb1e7, 0x0416, 0xb796, 0xed41, 0x3aa7}, + {0x5004, 0x832b, 0x59b5, 0xb7bc, 0x89af, 0xbf33, 0xf5fe, 0x1a20}, + {0x4025, 0x032e, 0x64d0, 0x1cfb, 0xbdfc, 0xbc64, 0xf077, 0xba0b}, + {0x7046, 0x0324, 0x237f, 0x4a75, 0xe109, 0xb99d, 0xfeec, 0xfa5d}, + {0x6067, 0x8321, 0x1e1a, 0xe132, 0xd55a, 0xbaca, 0xfb65, 0x5a76}, + {0x83b9, 0x0360, 0xeb93, 0xaed0, 0xd7ed, 0x9da7, 0x9702, 0x983c}, + {0x9398, 0x8365, 0xd6f6, 0x0597, 0xe3be, 0x9ef0, 0x928b, 0x3817}, + {0xa3fb, 0x836f, 0x9159, 0x5319, 0xbf4b, 0x9b09, 0x9c10, 0x7841}, + {0xb3da, 0x036a, 0xac3c, 0xf85e, 0x8b18, 0x985e, 0x9999, 0xd86a}, + {0xc33d, 0x837b, 0x1e07, 0xfe05, 0x06a1, 0x90fb, 0x8126, 0xf8ed}, + {0xd31c, 0x037e, 0x2362, 0x5542, 0x32f2, 0x93ac, 0x84af, 0x58c6}, + {0xe37f, 0x0374, 0x64cd, 0x03cc, 0x6e07, 0x9655, 0x8a34, 0x1890}, + {0xf35e, 0x8371, 0x59a8, 0xa88b, 0x5a54, 0x9502, 0x8fbd, 0xb8bb}, + {0x02b1, 0x8353, 0x3dde, 0x0f7a, 0x4126, 0x871f, 0xbb4a, 0x599e}, + {0x1290, 0x0356, 0x00bb, 0xa43d, 0x7575, 0x8448, 0xbec3, 0xf9b5}, + {0x22f3, 0x035c, 0x4714, 0xf2b3, 0x2980, 0x81b1, 0xb058, 0xb9e3}, + {0x32d2, 0x8359, 0x7a71, 0x59f4, 0x1dd3, 0x82e6, 0xb5d1, 0x19c8}, + {0x4235, 0x0348, 0xc84a, 0x5faf, 0x906a, 0x8a43, 0xad6e, 0x394f}, + {0x5214, 0x834d, 0xf52f, 0xf4e8, 0xa439, 0x8914, 0xa8e7, 0x9964}, + {0x6277, 0x8347, 0xb280, 0xa266, 0xf8cc, 0x8ced, 0xa67c, 0xd932}, + {0x7256, 0x0342, 0x8fe5, 0x0921, 0xcc9f, 0x8fba, 0xa3f5, 0x7919}, + {0xb5ea, 0x03c0, 0x64f7, 0x3da2, 0xfda2, 0xc237, 0x7eb2, 0xfd8d}, + {0xa5cb, 0x83c5, 0x5992, 0x96e5, 0xc9f1, 0xc160, 0x7b3b, 0x5da6}, + {0x95a8, 0x83cf, 0x1e3d, 0xc06b, 0x9504, 0xc499, 0x75a0, 0x1df0}, + {0x8589, 0x03ca, 0x2358, 0x6b2c, 0xa157, 0xc7ce, 0x7029, 0xbddb}, + {0xf56e, 0x83db, 0x9163, 0x6d77, 0x2cee, 0xcf6b, 0x6896, 0x9d5c}, + {0xe54f, 0x03de, 0xac06, 0xc630, 0x18bd, 0xcc3c, 0x6d1f, 0x3d77}, + {0xd52c, 0x03d4, 0xeba9, 0x90be, 0x4448, 0xc9c5, 0x6384, 0x7d21}, + {0xc50d, 0x83d1, 0xd6cc, 0x3bf9, 0x701b, 0xca92, 0x660d, 0xdd0a}, + {0x34e2, 0x83f3, 0xb2ba, 0x9c08, 0x6b69, 0xd88f, 0x52fa, 0x3c2f}, + {0x24c3, 0x03f6, 0x8fdf, 0x374f, 0x5f3a, 0xdbd8, 0x5773, 0x9c04}, + {0x14a0, 0x03fc, 0xc870, 0x61c1, 0x03cf, 0xde21, 0x59e8, 0xdc52}, + {0x0481, 0x83f9, 0xf515, 0xca86, 0x379c, 0xdd76, 0x5c61, 0x7c79}, + {0x7466, 0x03e8, 0x472e, 0xccdd, 0xba25, 0xd5d3, 0x44de, 0x5cfe}, + {0x6447, 0x83ed, 0x7a4b, 0x679a, 0x8e76, 0xd684, 0x4157, 0xfcd5}, + {0x5424, 0x83e7, 0x3de4, 0x3114, 0xd283, 0xd37d, 0x4fcc, 0xbc83}, + {0x4405, 0x03e2, 0x0081, 0x9a53, 0xe6d0, 0xd02a, 0x4a45, 0x1ca8}, + {0xa7db, 0x83a3, 0xf508, 0xd5b1, 0xe467, 0xf747, 0x2622, 0xdee2}, + {0xb7fa, 0x03a6, 0xc86d, 0x7ef6, 0xd034, 0xf410, 0x23ab, 0x7ec9}, + {0x8799, 0x03ac, 0x8fc2, 0x2878, 0x8cc1, 0xf1e9, 0x2d30, 0x3e9f}, + {0x97b8, 0x83a9, 0xb2a7, 0x833f, 0xb892, 0xf2be, 0x28b9, 0x9eb4}, + {0xe75f, 0x03b8, 0x009c, 0x8564, 0x352b, 0xfa1b, 0x3006, 0xbe33}, + {0xf77e, 0x83bd, 0x3df9, 0x2e23, 0x0178, 0xf94c, 0x358f, 0x1e18}, + {0xc71d, 0x83b7, 0x7a56, 0x78ad, 0x5d8d, 0xfcb5, 0x3b14, 0x5e4e}, + {0xd73c, 0x03b2, 0x4733, 0xd3ea, 0x69de, 0xffe2, 0x3e9d, 0xfe65}, + {0x26d3, 0x0390, 0x2345, 0x741b, 0x72ac, 0xedff, 0x0a6a, 0x1f40}, + {0x36f2, 0x8395, 0x1e20, 0xdf5c, 0x46ff, 0xeea8, 0x0fe3, 0xbf6b}, + {0x0691, 0x839f, 0x598f, 0x89d2, 0x1a0a, 0xeb51, 0x0178, 0xff3d}, + {0x16b0, 0x039a, 0x64ea, 0x2295, 0x2e59, 0xe806, 0x04f1, 0x5f16}, + {0x6657, 0x838b, 0xd6d1, 0x24ce, 0xa3e0, 0xe0a3, 0x1c4e, 0x7f91}, + {0x7676, 0x038e, 0xebb4, 0x8f89, 0x97b3, 0xe3f4, 0x19c7, 0xdfba}, + {0x4615, 0x0384, 0xac1b, 0xd907, 0xcb46, 0xe60d, 0x175c, 0x9fec}, + {0x5634, 0x8381, 0x917e, 0x7240, 0xff15, 0xe55a, 0x12d5, 0x3fc7}, + {0xd94c, 0x0280, 0x475a, 0xb001, 0xa93c, 0x7d17, 0xa85b, 0x36ef}, + {0xc96d, 0x8285, 0x7a3f, 0x1b46, 0x9d6f, 0x7e40, 0xadd2, 0x96c4}, + {0xf90e, 0x828f, 0x3d90, 0x4dc8, 0xc19a, 0x7bb9, 0xa349, 0xd692}, + {0xe92f, 0x028a, 0x00f5, 0xe68f, 0xf5c9, 0x78ee, 0xa6c0, 0x76b9}, + {0x99c8, 0x829b, 0xb2ce, 0xe0d4, 0x7870, 0x704b, 0xbe7f, 0x563e}, + {0x89e9, 0x029e, 0x8fab, 0x4b93, 0x4c23, 0x731c, 0xbbf6, 0xf615}, + {0xb98a, 0x0294, 0xc804, 0x1d1d, 0x10d6, 0x76e5, 0xb56d, 0xb643}, + {0xa9ab, 0x8291, 0xf561, 0xb65a, 0x2485, 0x75b2, 0xb0e4, 0x1668}, + {0x5844, 0x82b3, 0x9117, 0x11ab, 0x3ff7, 0x67af, 0x8413, 0xf74d}, + {0x4865, 0x02b6, 0xac72, 0xbaec, 0x0ba4, 0x64f8, 0x819a, 0x5766}, + {0x7806, 0x02bc, 0xebdd, 0xec62, 0x5751, 0x6101, 0x8f01, 0x1730}, + {0x6827, 0x82b9, 0xd6b8, 0x4725, 0x6302, 0x6256, 0x8a88, 0xb71b}, + {0x18c0, 0x02a8, 0x6483, 0x417e, 0xeebb, 0x6af3, 0x9237, 0x979c}, + {0x08e1, 0x82ad, 0x59e6, 0xea39, 0xdae8, 0x69a4, 0x97be, 0x37b7}, + {0x3882, 0x82a7, 0x1e49, 0xbcb7, 0x861d, 0x6c5d, 0x9925, 0x77e1}, + {0x28a3, 0x02a2, 0x232c, 0x17f0, 0xb24e, 0x6f0a, 0x9cac, 0xd7ca}, + {0xcb7d, 0x82e3, 0xd6a5, 0x5812, 0xb0f9, 0x4867, 0xf0cb, 0x1580}, + {0xdb5c, 0x02e6, 0xebc0, 0xf355, 0x84aa, 0x4b30, 0xf542, 0xb5ab}, + {0xeb3f, 0x02ec, 0xac6f, 0xa5db, 0xd85f, 0x4ec9, 0xfbd9, 0xf5fd}, + {0xfb1e, 0x82e9, 0x910a, 0x0e9c, 0xec0c, 0x4d9e, 0xfe50, 0x55d6}, + {0x8bf9, 0x02f8, 0x2331, 0x08c7, 0x61b5, 0x453b, 0xe6ef, 0x7551}, + {0x9bd8, 0x82fd, 0x1e54, 0xa380, 0x55e6, 0x466c, 0xe366, 0xd57a}, + {0xabbb, 0x82f7, 0x59fb, 0xf50e, 0x0913, 0x4395, 0xedfd, 0x952c}, + {0xbb9a, 0x02f2, 0x649e, 0x5e49, 0x3d40, 0x40c2, 0xe874, 0x3507}, + {0x4a75, 0x02d0, 0x00e8, 0xf9b8, 0x2632, 0x52df, 0xdc83, 0xd422}, + {0x5a54, 0x82d5, 0x3d8d, 0x52ff, 0x1261, 0x5188, 0xd90a, 0x7409}, + {0x6a37, 0x82df, 0x7a22, 0x0471, 0x4e94, 0x5471, 0xd791, 0x345f}, + {0x7a16, 0x02da, 0x4747, 0xaf36, 0x7ac7, 0x5726, 0xd218, 0x9474}, + {0x0af1, 0x82cb, 0xf57c, 0xa96d, 0xf77e, 0x5f83, 0xcaa7, 0xb4f3}, + {0x1ad0, 0x02ce, 0xc819, 0x022a, 0xc32d, 0x5cd4, 0xcf2e, 0x14d8}, + {0x2ab3, 0x02c4, 0x8fb6, 0x54a4, 0x9fd8, 0x592d, 0xc1b5, 0x548e}, + {0x3a92, 0x82c1, 0xb2d3, 0xffe3, 0xab8b, 0x5a7a, 0xc43c, 0xf4a5}, + {0xfd2e, 0x8243, 0x59c1, 0xcb60, 0x9ab6, 0x17f7, 0x197b, 0x7031}, + {0xed0f, 0x0246, 0x64a4, 0x6027, 0xaee5, 0x14a0, 0x1cf2, 0xd01a}, + {0xdd6c, 0x024c, 0x230b, 0x36a9, 0xf210, 0x1159, 0x1269, 0x904c}, + {0xcd4d, 0x8249, 0x1e6e, 0x9dee, 0xc643, 0x120e, 0x17e0, 0x3067}, + {0xbdaa, 0x0258, 0xac55, 0x9bb5, 0x4bfa, 0x1aab, 0x0f5f, 0x10e0}, + {0xad8b, 0x825d, 0x9130, 0x30f2, 0x7fa9, 0x19fc, 0x0ad6, 0xb0cb}, + {0x9de8, 0x8257, 0xd69f, 0x667c, 0x235c, 0x1c05, 0x044d, 0xf09d}, + {0x8dc9, 0x0252, 0xebfa, 0xcd3b, 0x170f, 0x1f52, 0x01c4, 0x50b6}, + {0x7c26, 0x0270, 0x8f8c, 0x6aca, 0x0c7d, 0x0d4f, 0x3533, 0xb193}, + {0x6c07, 0x8275, 0xb2e9, 0xc18d, 0x382e, 0x0e18, 0x30ba, 0x11b8}, + {0x5c64, 0x827f, 0xf546, 0x9703, 0x64db, 0x0be1, 0x3e21, 0x51ee}, + {0x4c45, 0x027a, 0xc823, 0x3c44, 0x5088, 0x08b6, 0x3ba8, 0xf1c5}, + {0x3ca2, 0x826b, 0x7a18, 0x3a1f, 0xdd31, 0x0013, 0x2317, 0xd142}, + {0x2c83, 0x026e, 0x477d, 0x9158, 0xe962, 0x0344, 0x269e, 0x7169}, + {0x1ce0, 0x0264, 0x00d2, 0xc7d6, 0xb597, 0x06bd, 0x2805, 0x313f}, + {0x0cc1, 0x8261, 0x3db7, 0x6c91, 0x81c4, 0x05ea, 0x2d8c, 0x9114}, + {0xef1f, 0x0220, 0xc83e, 0x2373, 0x8373, 0x2287, 0x41eb, 0x535e}, + {0xff3e, 0x8225, 0xf55b, 0x8834, 0xb720, 0x21d0, 0x4462, 0xf375}, + {0xcf5d, 0x822f, 0xb2f4, 0xdeba, 0xebd5, 0x2429, 0x4af9, 0xb323}, + {0xdf7c, 0x022a, 0x8f91, 0x75fd, 0xdf86, 0x277e, 0x4f70, 0x1308}, + {0xaf9b, 0x823b, 0x3daa, 0x73a6, 0x523f, 0x2fdb, 0x57cf, 0x338f}, + {0xbfba, 0x023e, 0x00cf, 0xd8e1, 0x666c, 0x2c8c, 0x5246, 0x93a4}, + {0x8fd9, 0x0234, 0x4760, 0x8e6f, 0x3a99, 0x2975, 0x5cdd, 0xd3f2}, + {0x9ff8, 0x8231, 0x7a05, 0x2528, 0x0eca, 0x2a22, 0x5954, 0x73d9}, + {0x6e17, 0x8213, 0x1e73, 0x82d9, 0x15b8, 0x383f, 0x6da3, 0x92fc}, + {0x7e36, 0x0216, 0x2316, 0x299e, 0x21eb, 0x3b68, 0x682a, 0x32d7}, + {0x4e55, 0x021c, 0x64b9, 0x7f10, 0x7d1e, 0x3e91, 0x66b1, 0x7281}, + {0x5e74, 0x8219, 0x59dc, 0xd457, 0x494d, 0x3dc6, 0x6338, 0xd2aa}, + {0x2e93, 0x0208, 0xebe7, 0xd20c, 0xc4f4, 0x3563, 0x7b87, 0xf22d}, + {0x3eb2, 0x820d, 0xd682, 0x794b, 0xf0a7, 0x3634, 0x7e0e, 0x5206}, + {0x0ed1, 0x8207, 0x912d, 0x2fc5, 0xac52, 0x33cd, 0x7095, 0x1250}, + {0x1ef0, 0x0202, 0xac48, 0x8482, 0x9801, 0x309a, 0x751c, 0xb27b}, +}; + +ZXIC_UINT32 dpp_crc32_calc(ZXIC_UINT8 *pInputKey, ZXIC_UINT32 dwByteNum, ZXIC_UINT32 dwCrcPoly) +{ + ZXIC_UINT32 dwResult = 0; + ZXIC_UINT32 dwDataType = 0; + + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + + while (i < dwByteNum) + { + dwDataType = (ZXIC_UINT32)((dwResult & 0xff000000) ^ (pInputKey[i] << 24)); + for (j = 0; j < 8; j++) + { + if (dwDataType & 0x80000000) + { + dwDataType <<= 1; + dwDataType ^= dwCrcPoly; + } + else + { + dwDataType <<= 1; + } + } + dwResult <<= 8; + dwResult ^= dwDataType; + + i++; + } + + return dwResult; +} + +ZXIC_UINT16 dpp_crc16_calc(ZXIC_UINT8 *pInputKey, ZXIC_UINT32 dwByteNum, ZXIC_UINT16 dwCrcPoly) +{ + ZXIC_UINT16 dwResult = 0; + ZXIC_UINT16 dwDataType = 0; + + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + + while (i < dwByteNum) + { + dwDataType = (ZXIC_UINT16)(((dwResult & 0xff00) ^ (pInputKey[i] << 8)) & 0xFFFF); + for (j = 0; j < 8; j++) + { + if (dwDataType & 0x8000) + { + dwDataType <<= 1; + dwDataType ^= dwCrcPoly; + } + else + { + dwDataType <<= 1; + } + } + dwResult <<= 8; + dwResult ^= dwDataType; + + i++; + } + + return dwResult; +} + +ZXIC_UINT16 dpp_crc16_get_idx(ZXIC_UINT16 crc_val) +{ + switch (crc_val) + { + case 0x1021: + return 0; + case 0x8005: + return 1; + case 0x3d65: + return 2; + case 0xab47: + return 3; + case 0x3453: + return 4; + case 0x0357: + return 5; + case 0x0589: + return 6; + case 0xa02b: + return 7; + default: + return 0xFFFF; + } +} + +//查表法 +ZXIC_UINT16 dpp_crc16_table_lookup(ZXIC_UINT8 *pInputKey, ZXIC_UINT32 dwByteNum, ZXIC_UINT16 dwCrcPoly) +{ + ZXIC_UINT16 dwResult = 0; + ZXIC_UINT16 dwDataType = 0; + ZXIC_UINT16 tmp_index = 0; + ZXIC_UINT32 i = 0; + + ZXIC_UINT32 crc_idx = dpp_crc16_get_idx(dwCrcPoly); + + ZXIC_COMM_CHECK_INDEX(crc_idx, 0, 7); + + while (i < dwByteNum) + { + dwDataType = ((dwResult & 0xff00) ^ (pInputKey[i] << 8)) & 0xFFFF; + + tmp_index = dwDataType >> 8; + tmp_index = tmp_index & 0xff; + ZXIC_COMM_CHECK_INDEX(tmp_index, 0, 255); + ZXIC_COMM_CHECK_INDEX(crc_idx, 0, 7); + dwDataType = g_crc16_rst[tmp_index][crc_idx]; + + dwResult <<= 8; + dwResult ^= dwDataType; + + i++; + } + + return dwResult; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/dpp_se_cfg.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/dpp_se_cfg.c new file mode 100755 index 0000000..a9dd43b --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/table/se/dpp_se_cfg.c @@ -0,0 +1,291 @@ +/***************************************************************************** + * 版权所有 (C)2001-2015, 深圳市中兴通讯股份有限公司。 + * + * 文件名称: dpp_se_cfg.c + * 文件标识: SE配置部分源文件 + * 内容摘要: + * 其它说明: + * 当前版本: + * 作 者: ChenWei10088471 + * 完成日期: + * 当前责任人-1: + * 当前责任人-2: + * + * DEPARTMENT : ASIC_FPGA_R&D_Dept + * MANUAL_PERCENT : 100% + *****************************************************************************/ + +#include "zxic_common.h" +#include "dpp_dev.h" +#include "dpp_module.h" +#include "dpp_se.h" +#include "dpp_se_cfg.h" +#include "dpp_hash.h" +#include "dpp_acl.h" + +DPP_SE_CFG *dpp_se_cfg[DPP_DEV_CHANNEL_MAX] = {0}; + +static ZXIC_UINT16 g_lpm_crc[SE_ZBLK_NUM] = { + 0x1021, 0x8005, 0x3D65, 0xab47, 0x3453, 0x0357, 0x0589, 0xa02b, + 0x1021, 0x8005, 0x3D65, 0xab47, 0x3453, 0x0357, 0x0589, 0xa02b, + 0x1021, 0x8005, 0x3D65, 0xab47, 0x3453, 0x0357, 0x0589, 0xa02b, + 0x1021, 0x8005, 0x3D65, 0xab47, 0x3453, 0x0357, 0x0589, 0xa02b +}; + +#if DPP_WRITE_FILE_EN +static ZXIC_CHAR *prefix_str = "./dpp_se_data"; +#endif + +/***********************************************************/ +/** 配置g_se_cfg 的值 +* @param p_se_cfg 算法模块公共管理数据结构指针 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yxh @date 2019/02/22 +************************************************************/ +DPP_STATUS dpp_se_cfg_set(ZXIC_UINT32 dev_id, DPP_SE_CFG *p_se_cfg) +{ + ZXIC_UINT64 se_cfg_ptr = 0; + + ZXIC_COMM_CHECK_INDEX(dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_POINT(p_se_cfg); + + dpp_se_cfg[dev_id] = p_se_cfg; + ZXIC_COMM_CHECK_POINT(dpp_se_cfg[dev_id]); + + se_cfg_ptr = ZXIC_COMM_PTR_TO_VAL(p_se_cfg); + ZXIC_COMM_TRACE_INFO("p_se_cfg address 0x%llx.\n", se_cfg_ptr); + + return DPP_OK; +} + +/***********************************************************/ +/** 获取g_se_cfg 的值 +* @param p_se_cfg 算法模块公共管理数据结构指针 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yxh @date 2019/02/22 +************************************************************/ +DPP_STATUS dpp_se_cfg_get(ZXIC_UINT32 dev_id, DPP_SE_CFG **p_se_cfg) +{ + ZXIC_COMM_CHECK_INDEX(dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + + *p_se_cfg = dpp_se_cfg[dev_id]; + ZXIC_COMM_CHECK_POINT(*p_se_cfg); + + ZXIC_COMM_TRACE_DEBUG("p_se_cfg address %p.\n", (*p_se_cfg)); + + return DPP_OK; +} + +DPP_STATUS dpp_se_init(DPP_DEV_T *dev, DPP_SE_CFG *p_se_cfg) +{ + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + ZXIC_UINT32 dev_id = 0; + +#if LPM_THREAD_HW_WRITE_EN + ZXIC_UINT32 rtn = 0; +#endif + + SE_ZBLK_CFG *p_zblk_cfg = NULL; + SE_ZCELL_CFG *p_zcell_cfg = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(p_se_cfg); + + // dev_id = ZXIC_COMM_PTR_TO_VAL(p_se_cfg->p_client) & 0xFFFFFFFF; + dev_id = DEV_ID(dev); + ZXIC_COMM_CHECK_INDEX_UPPER(dev_id,DPP_DEV_CHANNEL_MAX - 1); + + ZXIC_COMM_MEMSET(p_se_cfg, 0, sizeof(DPP_SE_CFG)); + + p_se_cfg->dev = dev; + p_se_cfg->dev_id = dev_id; + dpp_se_cfg_set(p_se_cfg->dev_id, p_se_cfg); + + //p_se_cfg->p_as_rslt_wrt_fun = dpp_se_lpm_as_rslt_write; + p_se_cfg->p_client = ZXIC_COMM_VAL_TO_PTR(dev_id); + + for (i = 0; i < SE_ZBLK_NUM; i++) + { + p_zblk_cfg = DPP_SE_GET_ZBLK_CFG(p_se_cfg, i); + + p_zblk_cfg->zblk_idx = i; + p_zblk_cfg->is_used = 0; + p_zblk_cfg->hash_arg = g_lpm_crc[i]; + p_zblk_cfg->zcell_bm = 0; + INIT_D_NODE(&p_zblk_cfg->zblk_dn, p_zblk_cfg); + + for (j = 0; j < SE_ZCELL_NUM; j++) + { + p_zcell_cfg = &p_zblk_cfg->zcell_info[j]; + + p_zcell_cfg->zcell_idx = (i << 2) + j; + p_zcell_cfg->item_used = 0; + p_zcell_cfg->mask_len = 0; + + INIT_D_NODE(&p_zcell_cfg->zcell_dn, p_zcell_cfg); + + p_zcell_cfg->zcell_avl.p_key = p_zcell_cfg; + } + } + +#if DPP_WRITE_FILE_EN +/* icm_trace_set_log_dir(prefix_str);*/ + dpp_se_file_mng_init(); +#else + +#endif + +#if LPM_THREAD_HW_WRITE_EN + for (i = 0; i < MAX_ITEM_INFO_BAK_NUM; i++) + { + rtn = zxic_comm_mutex_create(&(p_se_cfg->cache_index_mutex[i])); + ZXIC_COMM_CHECK_RC(rtn, "zxic_comm_mutex_create"); + } + + rtn = zxic_comm_liststack_creat(MAX_ITEM_INFO_BAK_NUM, &p_se_cfg->p_thread_liststack_mng); + ZXIC_COMM_CHECK_RC(rtn,"zxic_comm_liststack_creat"); +#endif + + return DPP_OK; +} + +/***********************************************************/ +/** 初始化算法管理数据结构用户自定义的数据指针,当前仅用于传入设备号的值 +* @param p_se_cfg 算法管理数据结构指针 +* @param p_client 用户自定义的数据指针 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 王春雷 @date 2015/05/20 +************************************************************/ +DPP_STATUS dpp_se_client_init(DPP_SE_CFG *p_se_cfg, ZXIC_VOID *p_client) +{ + ZXIC_COMM_CHECK_POINT(p_se_cfg); + + p_se_cfg->p_client = p_client; + p_se_cfg->reg_base = SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR; /* 算法模块芯片内相对基地址 */ + // p_se_cfg->p_write32_fun = dpp_se_reg_write32; + // p_se_cfg->p_read32_fun = dpp_se_reg_read32; + + return DPP_OK; +} + +DPP_STATUS dpp_se_fun_init(DPP_SE_CFG *p_se_cfg, + ZXIC_UINT8 id, + ZXIC_UINT32 fun_type) +{ + FUNC_ID_INFO *p_fun_info = NULL; + + ZXIC_COMM_CHECK_POINT(p_se_cfg); + ZXIC_COMM_CHECK_INDEX(id, 0, MAX_FUN_NUM - 1); + ZXIC_COMM_CHECK_INDEX(fun_type, FUN_HASH, FUN_MAX - 1); + + p_fun_info = DPP_GET_FUN_INFO(p_se_cfg, id); + + if (p_fun_info->is_used) + { + ZXIC_COMM_TRACE_ERROR("\n Error[0x%x], fun_id [%d] is already used!", DPP_SE_RC_FUN_INVALID, id); + return DPP_SE_RC_FUN_INVALID; + } + + p_fun_info->fun_id = id; + p_fun_info->is_used = 1; + + switch (fun_type) + { + case (FUN_LPM): + { + /* + p_fun_info->fun_type = FUN_LPM; + p_fun_info->fun_ptr = ZXIC_COMM_MALLOC(sizeof(DPP_ROUTE_CFG)); + ZXIC_COMM_CHECK_POINT(p_fun_info->fun_ptr); + ZXIC_COMM_MEMSET(p_fun_info->fun_ptr,0,sizeof(DPP_ROUTE_CFG)); + + ((DPP_ROUTE_CFG*)(p_fun_info->fun_ptr))->p_se_cfg = p_se_cfg; + */ + + //dpp_func_lpm_create(p_se_cfg, id); + + } + break; + + case (FUN_HASH): + { + p_fun_info->fun_type = FUN_HASH; + p_fun_info->fun_ptr = ZXIC_COMM_MALLOC(sizeof(DPP_HASH_CFG)); + ZXIC_COMM_CHECK_POINT(p_fun_info->fun_ptr); + ZXIC_COMM_MEMSET(p_fun_info->fun_ptr, 0, sizeof(DPP_HASH_CFG)); + ((DPP_HASH_CFG *)(p_fun_info->fun_ptr))->p_se_info = p_se_cfg; + } + break; + + default: + { + ZXIC_COMM_TRACE_ERROR("\n Error,unrecgnized fun_type[ %d] ", fun_type); + ZXIC_COMM_ASSERT(0); + return DPP_SE_RC_BASE; + } + break; + } + + return DPP_OK; +} + +DPP_STATUS dpp_se_fun_deinit(DPP_SE_CFG *p_se_cfg, + ZXIC_UINT8 id, + ZXIC_UINT32 fun_type) +{ + FUNC_ID_INFO *p_fun_info = NULL; + + ZXIC_COMM_CHECK_POINT(p_se_cfg); + ZXIC_COMM_CHECK_INDEX(id, 0, MAX_FUN_NUM - 1); + ZXIC_COMM_CHECK_INDEX(fun_type, FUN_HASH, FUN_MAX - 1); + + p_fun_info = DPP_GET_FUN_INFO(p_se_cfg, id); + + if (0 == p_fun_info->is_used) + { + ZXIC_COMM_TRACE_ERROR("\n Error[0x%x], fun_id [%d] is already deinit!", DPP_SE_RC_FUN_INVALID, id); + return DPP_SE_RC_FUN_INVALID; + } + + switch (fun_type) + { + case (FUN_LPM): + { +/* dpp_func_lpm_destory(p_se_cfg, id);*/ + } + break; + + case (FUN_HASH): + { + if (p_fun_info->fun_ptr) + { + ZXIC_COMM_FREE(p_fun_info->fun_ptr); + p_fun_info->fun_ptr = NULL; + } + } + break; + + default: + { + ZXIC_COMM_TRACE_ERROR("\n Error,unrecgnized fun_type[ %d] ", fun_type); + ZXIC_COMM_ASSERT(0); + return DPP_SE_RC_BASE; + } + break; + } + + p_fun_info->fun_id = id; + p_fun_info->is_used = 0; + + return DPP_OK; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/tm/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/tm/Kbuild.include new file mode 100644 index 0000000..7d9cc41 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/tm/Kbuild.include @@ -0,0 +1,2 @@ +cur_dir := en_np/sdk/source/dev/module/tm/ +src_files += $(addprefix $(cur_dir),$(notdir $(wildcard $(dinghai_root)/$(cur_dir)*.c))) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/tm/dpp_tm.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/tm/dpp_tm.c new file mode 100755 index 0000000..c64a7e2 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/module/tm/dpp_tm.c @@ -0,0 +1,21525 @@ +/************************************************************** +* 版权所有 (C)2013-2015,深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_tm.c +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : djf +* 完成日期 : 2014/02/17 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +/****************************************************************************** + * START: 头文件 * + *****************************************************************************/ +#include "zxic_common.h" +#include "dpp_type_api.h" +#include "dpp_reg_api.h" +#include "dpp_reg_info.h" +#include "dpp_etm_reg.h" +#include "dpp_module.h" +#include "dpp_tm_api.h" +//#include "dpp_tm_diag.h" +#include "dpp_tm.h" +#include "dpp_dev.h" + +/****************************************************************************** + * END: 头文件 * + *****************************************************************************/ + + +/****************************************************************************** + * START: 常量定义 * + *****************************************************************************/ + +DPP_TM_SHAPE_PARA_TABLE g_dpp_etm_shape_para_table[DPP_PCIE_SLOT_MAX][DPP_ETM_SHAP_TABEL_ID_MAX][DPP_TM_SHAP_MAP_ID_MAX] = {{{{0}}}}; /* coverity告警修改:单一变量不能超过10000字节 */ +DPP_TM_SHAPE_PARA_TABLE g_dpp_ftm_shape_para_table[DPP_DEV_CHANNEL_MAX][DPP_FTM_SHAP_TABEL_ID_MAX][DPP_TM_SHAP_MAP_ID_MAX] = {{{{0}}}}; +DPP_ETM_QMU_INIT_PARA g_dpp_etm_qmu_qlist_para = {0}; +DPP_FTM_QMU_INIT_PARA g_dpp_ftm_qmu_qlist_para = {0}; + +/* 全局变量读写互斥锁 */ +ZXIC_MUTEX_T g_dpp_tm_global_var_rw_mutex; +ZXIC_UINT32 g_dpp_tm_global_var_rw_mutex_flag = 0; +// static ZXIC_UINT32 g_qmu_init_case_no = 0; + + +/***********************************************************/ +/** 全局变量读写互斥锁初始化 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/07/23 +************************************************************/ +DPP_STATUS dpp_tm_global_var_mutex_init(ZXIC_VOID) +{ + DPP_STATUS rc = DPP_OK; + + if (!g_dpp_tm_global_var_rw_mutex_flag) + { + rc = zxic_comm_mutex_create(&g_dpp_tm_global_var_rw_mutex); + ZXIC_COMM_CHECK_RC(rc, "zxic_comm_mutex_create"); + + g_dpp_tm_global_var_rw_mutex_flag = 1; + } + + return DPP_OK; +} + + +/****************************************************************************** + * END: 常量定义 * + *****************************************************************************/ + +#if ZXIC_REAL("TM_REG") +#if 0 +/***********************************************************/ +/** 写TM寄存器 +* @param module_id 区分TM子模块 +* @param addr 基于子模块的地址 +* @param data 写入的数据 +* +* @return +* @remark 无 +* @see +* @author yjd @date 2015/07/26 +************************************************************/ +DPP_STATUS dpp_tm_wr_reg(ZXIC_UINT32 dev_id, ZXIC_UINT32 module_id, ZXIC_UINT32 addr, ZXIC_UINT32 data) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 wr_data = 0; + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, module_id, MODULE_TM_CFGMT, MODULE_TM_MAX - 1); + + wr_data = data; + rc = dpp_tm_write(dev_id, module_id, addr, &wr_data); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读TM寄存器 +* @param tm_type 0-ETM,1-FTM +* @param module_id 区分TM子模块 +* @param addr 基于子模块的地址 +* @return +* @remark 无 +* @see +* @author yjd @date 2015/07/26 +************************************************************/ +DPP_STATUS dpp_tm_rd_reg(ZXIC_UINT32 dev_id, ZXIC_UINT32 module_id, ZXIC_UINT32 addr) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 rd_data = 0; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, module_id, MODULE_TM_CFGMT, MODULE_TM_MAX - 1); + + rc = dpp_tm_read(dev_id, module_id, addr, &rd_data); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_read"); + + ZXIC_COMM_PRINT("[0x%08x] 0x%08x \n", addr, rd_data); + + return DPP_OK; +} + +/***********************************************************/ +/** 写一片连续的TM寄存器 +* @param module_id 区分TM子模块 +* @param first_addr 起始寄存器的地址 +* @param reg_num 总共读取的寄存器数 +* +* @return +* @remark 无 +* @see +* @author yjd @date 2015/07/26 +************************************************************/ +DPP_STATUS dpp_tm_wr_more_reg(ZXIC_UINT32 dev_id, ZXIC_UINT32 module_id, ZXIC_UINT32 first_addr, ZXIC_UINT32 first_data, ZXIC_UINT32 data_step, ZXIC_UINT32 reg_num) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 addr = 0; + ZXIC_UINT32 data = 0; + ZXIC_UINT32 i = 0; + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, module_id, MODULE_TM_CFGMT, MODULE_TM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(dev_id, first_addr , reg_num); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, data_step , reg_num); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(dev_id, first_data , (data_step * reg_num)); + + for (i = 0; i < reg_num; i++) + { + addr = first_addr + i; + data = first_data + (data_step * i); + rc = dpp_tm_wr_reg(dev_id, module_id, addr, data); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_wr_reg"); + } + + return DPP_OK; +} + +/***********************************************************/ +/** 读一片连续的TM寄存器 +* @param module_id 区分TM子模块 +* @param first_addr 起始寄存器的地址 +* @param reg_num 总共读取的寄存器数 +* +* @return +* @remark 无 +* @see +* @author yjd @date 2017/07/26 +************************************************************/ +DPP_STATUS dpp_tm_rd_more_reg(ZXIC_UINT32 dev_id, ZXIC_UINT32 module_id, ZXIC_UINT32 first_addr, ZXIC_UINT32 reg_num) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 addr = 0; + ZXIC_UINT32 i = 0; + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, module_id, MODULE_TM_CFGMT, MODULE_TM_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(dev_id, first_addr , reg_num); + + for (i = 0; i < reg_num; i++) + { + addr = first_addr + i; + rc = dpp_tm_rd_reg(dev_id, module_id, addr); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_rd_reg"); + } + + return DPP_OK; +} + +/***********************************************************/ +/** 写tm模块二层间接寄存器(仅crdt/shap模块使用) +* @param module_id 区分TM子模块 +* @param addr 基于子模块的地址 +* @param data 写入的数据 +* +* @return +* @remark 无 +* @see +* @author whuashan @date 2019/02/25 +************************************************************/ +DPP_STATUS dpp_tm_ind_wr_reg(ZXIC_UINT32 dev_id, ZXIC_UINT32 module_id, ZXIC_UINT32 addr, ZXIC_UINT64 data) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 wr_data[2] = {0}; + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, module_id, MODULE_TM_SHAP, MODULE_TM_CRDT); + + wr_data[1] = (data & 0xffffffff); + wr_data[0] = (data >> 32)&0xffffffff; + + rc = dpp_tm_ind_write(dev_id, module_id, addr, wr_data); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_ind_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读tm模块二层间接寄存器(仅crdt/shap模块使用) +* @param module_id 区分TM子模块 +* @param addr 基于子模块的地址 +* +* @return +* @remark 无 +* @see +* @author whuashan @date 2019/02/25 +************************************************************/ +DPP_STATUS dpp_tm_ind_rd_reg(ZXIC_UINT32 dev_id, ZXIC_UINT32 module_id, ZXIC_UINT32 addr) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 rd_data[2] = {0}; + ZXIC_UINT64 tmp_data = 0; + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, module_id, MODULE_TM_SHAP, MODULE_TM_CRDT); + + rc = dpp_tm_ind_read(dev_id, module_id, addr, rd_data); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_ind_read"); + + tmp_data = ((tmp_data | rd_data[0]) << 32) | (rd_data[1]); + ZXIC_COMM_PRINT("[0x%08x] 0x%016llx \n", addr, tmp_data); + + return DPP_OK; +} +#endif + +#endif + + +#if ZXIC_REAL("TM_CFGMT") + +#if 0 +/***********************************************************/ +/** 校验子系统初始化就绪,所有子系统均初始化就绪,p_rdy值为1 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_rdy 初始化就绪标记,1-就绪,0-未就绪 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/04/09 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_subsystem_rdy_check(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 p_rdy = 0; /*tm子系统是否初始化完成判断*/ + ZXIC_UINT32 read_times = 50; + DPP_ETM_CFGMT_SUBSYSTEM_RDY_REG_T subsystem_rdy = {0}; + + + + /* 循环判定TM子系统是否初始化完成 */ + do + { + rc = dpp_reg_read(dev_id, + ETM_CFGMT_SUBSYSTEM_RDY_REGr, + 0, + 0, + &subsystem_rdy); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + p_rdy = (subsystem_rdy.olif_rdy) + && (subsystem_rdy.qmu_rdy) + && (subsystem_rdy.tmmu_rdy) + && (subsystem_rdy.cgavd_rdy) + && (subsystem_rdy.shap_rdy) + && (subsystem_rdy.crdt_rdy); + + if (p_rdy) + { + rc = dpp_tm_cfgmt_subsystem_rdy_print(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_subsystem_rdy_print"); + break; + } + + read_times--; + zxic_comm_sleep(100); + } + while (read_times > 0); + + if (read_times == 0) + { + rc = dpp_tm_cfgmt_subsystem_rdy_print(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_subsystem_rdy_print"); + ZXIC_COMM_PRINT("dpp_tm_cfgmt_subsystem_rdy_check:TM INIT FAILED !!\n"); + return DPP_ERR; + } + + return DPP_OK; +} +#endif + +/***********************************************************/ +/** cpu读写通道验证,其读出值等于写入值。读出值不等于写入值时,返回err +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/04/09 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_cpu_check(DPP_DEV_T *dev) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 input = 0x5a5a5a5a; + ZXIC_UINT32 output = 0; + DPP_ETM_CFGMT_CPU_CHECK_REG_T cpu_access_input = {0}; + DPP_ETM_CFGMT_CPU_CHECK_REG_T cpu_access_output = {0}; + ZXIC_COMM_CHECK_POINT(dev); + + cpu_access_input.cpu_check_reg = input; + rc = dpp_reg_write(dev, + ETM_CFGMT_CPU_CHECK_REGr, + 0, + 0, + &cpu_access_input); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + rc = dpp_reg_read(dev, + ETM_CFGMT_CPU_CHECK_REGr, + 0, + 0, + &cpu_access_output); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + output = cpu_access_output.cpu_check_reg; + + /* 判断读出值是否等于写入值 */ + if (input != output) + { + ZXIC_COMM_TRACE_ERROR("dpp_tm_cpu_check :input != output"); + return DPP_ERR; + } + + return DPP_OK; +} + +/***********************************************************/ +/** 配置内置TM的工作模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param mode 配置的值,0-TM模式,1-SA模式 +*ETM仅工作在TM模式,FTM可以工作TM或SA模式 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/25 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_sa_work_mode_set(DPP_DEV_T *dev, DPP_TM_WORK_MODE_E mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CFGMT_TM_SA_WORK_MODE_T tm_sa_mode = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), mode, DPP_TM_WORK_MODE_TM, DPP_TM_WORK_MODE_TM); + + tm_sa_mode.tm_sa_work_mode = mode; + rc = dpp_reg_write(dev, + ETM_CFGMT_TM_SA_WORK_MODEr, + 0, + 0, + &tm_sa_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 读取内置TM的工作模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_mode 读取的值,0-TM模式,1-SA模式 +*ETM仅工作在TM模式,FTM可以工作TM或SA模式 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/25 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_sa_work_mode_get(DPP_DEV_T *dev, DPP_TM_WORK_MODE_E *p_mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CFGMT_TM_SA_WORK_MODE_T tm_sa_mode = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_mode); + + *p_mode = DPP_TM_WORK_MODE_INVALID; + + rc = dpp_reg_read(dev, + ETM_CFGMT_TM_SA_WORK_MODEr, + 0, + 0, + &tm_sa_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_mode = tm_sa_mode.tm_sa_work_mode; + + return DPP_OK; +} + +/***********************************************************/ +/** 配置ddr3挂接组数,共10bit[0-9],每bit对应1组ddr,TM最多使用其中8组 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param ddr_num 单个tm使用的ddr组:bit[0-9]每bit代表一组ddr,如使用4567组,则配置0xf0 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/06/07 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_ddr_attach_set(DPP_DEV_T *dev, ZXIC_UINT32 ddr_num) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CFGMT_CFGMT_DDR_ATTACH_T ddr_attach = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), ddr_num, 0, 0x3FF); + + ddr_attach.cfgmt_ddr_attach = ddr_num; + rc = dpp_reg_write(dev, + ETM_CFGMT_CFGMT_DDR_ATTACHr, + 0, + 0, + &ddr_attach); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读取ddr3挂接组数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_ddr_num ddr组数,1-6组 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/04/09 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_ddr_attach_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_ddr_num) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CFGMT_CFGMT_DDR_ATTACH_T ddr_attach = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_ddr_num); + + rc = dpp_reg_read(dev, + ETM_CFGMT_CFGMT_DDR_ATTACHr, + 0, + 0, + &ddr_attach); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + if (ddr_attach.cfgmt_ddr_attach == 1) + { + *p_ddr_num = 1; + } + else if (ddr_attach.cfgmt_ddr_attach == 3) + { + *p_ddr_num = 2; + } + else if (ddr_attach.cfgmt_ddr_attach == 7) + { + *p_ddr_num = 3; + } + else if (ddr_attach.cfgmt_ddr_attach == 15) + { + *p_ddr_num = 4; + } + else if (ddr_attach.cfgmt_ddr_attach == 31) + { + *p_ddr_num = 5; + } + else if (ddr_attach.cfgmt_ddr_attach == 63) + { + *p_ddr_num = 6; + } + else if (ddr_attach.cfgmt_ddr_attach == 127) + { + *p_ddr_num = 7; + } + else if (ddr_attach.cfgmt_ddr_attach == 255) + { + *p_ddr_num = 8; + } + + return DPP_OK; +} + +/***********************************************************/ +/** 配置QMU工作模式,0:8 block工作模式,1:16 block工作模式 +*** (即一个chunk中block个数) 影响tm总可用的缓存节点数。 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param mode 0-128/256K节点,1-256/512K节点,目前固定配1 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/25 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_qmu_work_mode_set(DPP_DEV_T *dev, DPP_TM_QMU_WORK_MODE_E mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CFGMT_QMU_WORK_MODE_T qmu_mode = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), mode, DPP_TM_QMU_WORK_MODE_2M, DPP_TM_QMU_WORK_MODE_4M); + + qmu_mode.qmu_work_mode = mode; + rc = dpp_reg_write(dev, + ETM_CFGMT_QMU_WORK_MODEr, + 0, + 0, + &qmu_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 读取QMU工作模式,0:8 block工作模式,1:16 block工作模式 +*** (即一个chunk中block个数) 影响tm总可用的缓存节点数。 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param mode 0-128/256K节点,1-256/512K节点,目前固定配1 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/25 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_qmu_work_mode_get(DPP_DEV_T *dev, DPP_TM_QMU_WORK_MODE_E *p_mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CFGMT_QMU_WORK_MODE_T qmu_mode = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_mode); + + rc = dpp_reg_read(dev, + ETM_CFGMT_QMU_WORK_MODEr, + 0, + 0, + &qmu_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_mode = qmu_mode.qmu_work_mode; + + return DPP_OK; +} + + + +#if 0 +/***********************************************************/ +/** 配置包存储的CRC功能是否使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param en 配置的值,0-禁止CRC功能,1-允许CRC功能 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/25 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_crc_en_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CFGMT_CFGMT_CRC_EN_T crc_en = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, en, 0, 1); + + crc_en.cfgmt_crc_en = en; + rc = dpp_reg_write(dev_id, + ETM_CFGMT_CFGMT_CRC_ENr, + 0, + 0, + &crc_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读取包存储的CRC功能是否使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_en 读取的值,0-禁止CRC功能,1-允许CRC功能 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/25 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_crc_en_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CFGMT_CFGMT_CRC_EN_T crc_en = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_en); + + *p_en = 0xffffffff; + rc = dpp_reg_read(dev_id, + ETM_CFGMT_CFGMT_CRC_ENr, + 0, + 0, + &crc_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + *p_en = crc_en.cfgmt_crc_en; + + return DPP_OK; +} +#endif +/***********************************************************/ +/** 配置block长度模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param size block长度模式:256/512/1024 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/04/09 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_blk_size_set(DPP_DEV_T *dev, ZXIC_UINT32 size) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CFGMT_CFGMT_BLKSIZE_T blk_size = {0}; + ZXIC_COMM_CHECK_POINT(dev); + + switch (size) + { + case 256: + { + blk_size.cfgmt_blksize = DPP_ETM_BLK_SIZE_256_B; + break; + } + + case 512: + { + blk_size.cfgmt_blksize = DPP_ETM_BLK_SIZE_512_B; + break; + } + + case 1024: + { + blk_size.cfgmt_blksize = DPP_ETM_BLK_SIZE_1024_B; + break; + } + + default: + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "dpp_tm_cfgmt_blk_size_set:TM set block size error!\n"); + return DPP_ERR; + } + } + + rc = dpp_reg_write(dev, + ETM_CFGMT_CFGMT_BLKSIZEr, + 0, + 0, + &blk_size); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读取block长度模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_size block长度模式,256/512/1024 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/04/09 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_blk_size_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_size) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CFGMT_CFGMT_BLKSIZE_T blk_size = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_size); + + rc = dpp_reg_read(dev, + ETM_CFGMT_CFGMT_BLKSIZEr, + 0, + 0, + &blk_size); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + switch (blk_size.cfgmt_blksize) + { + case DPP_ETM_BLK_SIZE_256_B: + { + *p_size = 256; + break; + } + + case DPP_ETM_BLK_SIZE_512_B: + { + *p_size = 512; + break; + } + + case DPP_ETM_BLK_SIZE_1024_B: + { + *p_size = 1024; + break; + } + + default: + { + *p_size = 256; + } + } + + return DPP_OK; +} + +#if 0 +/***********************************************************/ +/** 配置计数模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_mode 计数模式 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/04/09 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_cnt_mode_set(ZXIC_UINT32 dev_id, DPP_TM_CNT_MODE_T *p_mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CFGMT_CNT_MODE_REG_T cnt_mode = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_mode); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, p_mode->fc_count_mode, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, p_mode->count_rd_mode, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, p_mode->count_overflow_mode, 0, 1); + + cnt_mode.cfgmt_fc_count_mode = p_mode->fc_count_mode; + cnt_mode.cfgmt_count_rd_mode = p_mode->count_rd_mode; + cnt_mode.cfgmt_count_overflow_mode = p_mode->count_overflow_mode; + rc = dpp_reg_write(dev_id, + ETM_CFGMT_CNT_MODE_REGr, + 0, + 0, + &cnt_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读取计数模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_mode 计数模式 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/04/09 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_cnt_mode_get(ZXIC_UINT32 dev_id, DPP_TM_CNT_MODE_T *p_mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CFGMT_CNT_MODE_REG_T cnt_mode = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_mode); + + rc = dpp_reg_read(dev_id, + ETM_CFGMT_CNT_MODE_REGr, + 0, + 0, + &cnt_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + p_mode->fc_count_mode = cnt_mode.cfgmt_fc_count_mode; + p_mode->count_rd_mode = cnt_mode.cfgmt_count_rd_mode; + p_mode->count_overflow_mode = cnt_mode.cfgmt_count_overflow_mode; + + return DPP_OK; +} + +/***********************************************************/ +/** 配置中断屏蔽 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_para 中断屏蔽 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/04/09 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_int_mask_set(ZXIC_UINT32 dev_id, DPP_TM_INT_T *p_para) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CFGMT_REG_INT_MASK_REG_T int_mask = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_para); + + int_mask.shap_int_mask = p_para->shap_int; + int_mask.crdt_int_mask = p_para->crdt_int; + int_mask.tmmu_int_mask = p_para->mmu_int; + int_mask.qmu_int_mask = p_para->qmu_int; + int_mask.cgavd_int_mask = p_para->cgavd_int; + int_mask.olif_int_mask = p_para->olif_int; + int_mask.cfgmt_int_buf_mask = p_para->cfgmt_int; + + rc = dpp_reg_write(dev_id, + ETM_CFGMT_REG_INT_MASK_REGr, + 0, + 0, + &int_mask); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 读取中断屏蔽 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_para 中断屏蔽 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/04/09 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_int_mask_get(ZXIC_UINT32 dev_id, DPP_TM_INT_T *p_para) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CFGMT_REG_INT_MASK_REG_T int_mask = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_para); + + rc = dpp_reg_read(dev_id, + ETM_CFGMT_REG_INT_MASK_REGr, + 0, + 0, + &int_mask); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + p_para->shap_int = int_mask.shap_int_mask; + p_para->crdt_int = int_mask.crdt_int_mask; + p_para->mmu_int = int_mask.tmmu_int_mask; + p_para->qmu_int = int_mask.qmu_int_mask; + p_para->cgavd_int = int_mask.cgavd_int_mask; + p_para->olif_int = int_mask.olif_int_mask; + p_para->cfgmt_int = int_mask.cfgmt_int_buf_mask; + + return DPP_OK; +} + +/***********************************************************/ +/** 读取中断状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_para 中断状态 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/04/09 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_int_state_get(ZXIC_UINT32 dev_id, DPP_TM_INT_T *p_para) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CFGMT_REG_INT_STATE_REG_T int_state = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_para); + + rc = dpp_reg_read(dev_id, + ETM_CFGMT_REG_INT_STATE_REGr, + 0, + 0, + &int_state); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + p_para->shap_int = int_state.shap_int; + p_para->crdt_int = int_state.crdt_int; + p_para->mmu_int = int_state.mmu_int; + p_para->qmu_int = int_state.qmu_int; + p_para->cgavd_int = int_state.cgavd_int; + p_para->olif_int = int_state.olif_int; + p_para->cfgmt_int = int_state.cfgmt_int_buf; + + return DPP_OK; +} + +/***********************************************************/ +/** 配置tm时钟门控是否使能 +* @param dev_id 设备编号 +* @param en 配置的值,0-禁止tm时钟门控,1-使能tm时钟门控 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author lsy @date 2022/08/22 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_clkgate_en_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CFGMT_CLKGATE_EN_T clkgate_en = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, en, 0, 1); + + clkgate_en.clkgate_en = en; + rc = dpp_reg_write(dev_id, + ETM_CFGMT_CLKGATE_ENr, + 0, + 0, + &clkgate_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读取tm时钟门控是否使能 +* @param dev_id 设备编号 +* @param en 配置的值,0-禁止tm时钟门控,1-使能tm时钟门控 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author lsy @date 2022/08/22 + +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_clkgate_en_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CFGMT_CLKGATE_EN_T clkgate_en = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_en); + + *p_en = 0xffffffff; + rc = dpp_reg_read(dev_id, + ETM_CFGMT_CLKGATE_ENr, + 0, + 0, + &clkgate_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + *p_en = clkgate_en.clkgate_en; + + return DPP_OK; +} + +/***********************************************************/ +/** 配置tm软复位是否使能 +* @param dev_id 设备编号 +* @param en 配置的值,0-禁止tm软复位,1-使能tm软复位 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author lsy @date 2022/08/22 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_softrst_en_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CFGMT_SOFTRST_EN_T softrst_en = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, en, 0, 1); + + softrst_en.softrst_en = en; + rc = dpp_reg_write(dev_id, + ETM_CFGMT_SOFTRST_ENr, + 0, + 0, + &softrst_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读取tm软复位是否使能 +* @param dev_id 设备编号 +* @param en 配置的值,0-禁止tm软复位,1-使能tm软复位 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author lsy @date 2022/08/22 + +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_softrst_en_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CFGMT_SOFTRST_EN_T softrst_en = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_en); + + *p_en = 0xffffffff; + rc = dpp_reg_read(dev_id, + ETM_CFGMT_SOFTRST_ENr, + 0, + 0, + &softrst_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + *p_en = softrst_en.softrst_en; + + return DPP_OK; +} + +#endif +#endif + + + +#if ZXIC_REAL("TM_CGAVD") + +#if 0 +/***********************************************************/ +/** 配置各级搬移功能使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 要配置的拥塞避免层次号,0:队列级,1:端口级,2:系统级 +* @param en 使能标记,0-不使能,1-使能 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2016/10/18 +************************************************************/ +#ifdef ETM_REAL + +DPP_STATUS dpp_tm_cgavd_move_en_set(ZXIC_UINT32 dev_id, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 en) +{ + DPP_STATUS rc = DPP_OK; + + DPP_ETM_CGAVD_CGAVD_CFG_MOVE_T cgavd_cfg_move = {0}; + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, level, QUEUE_LEVEL, SYS_LEVEL); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, en, 0, 1); + + rc = dpp_reg_read(dev_id, + ETM_CGAVD_CGAVD_CFG_MOVEr, + 0, + 0, + &cgavd_cfg_move); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + if (QUEUE_LEVEL == level) + { + cgavd_cfg_move.cfgmt_flow_move_en = en; + } + + else if (PP_LEVEL == level) + { + cgavd_cfg_move.cfgmt_port_move_en = en; + } + + else if (SYS_LEVEL == level) + { + cgavd_cfg_move.cfgmt_sys_move_en = en; + } + + rc = dpp_reg_write(dev_id, + ETM_CGAVD_CGAVD_CFG_MOVEr, + 0, + 0, + &cgavd_cfg_move); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读取各级搬移功能使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 要配置的拥塞避免层次号,0:队列级,1:端口级,2:系统级 +* @param p_en 读出的使能标记,0-不使能,1-使能 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2016/10/18 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_move_en_get(ZXIC_UINT32 dev_id, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 *p_en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_CGAVD_CFG_MOVE_T cgavd_cfg_move = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, level, QUEUE_LEVEL, SYS_LEVEL); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_en); + + *p_en = 0xffffffff; + + rc = dpp_reg_read(dev_id, + ETM_CGAVD_CGAVD_CFG_MOVEr, + 0, + 0, + &cgavd_cfg_move); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + if (QUEUE_LEVEL == level) + { + *p_en = cgavd_cfg_move.cfgmt_flow_move_en; + } + + else if (PP_LEVEL == level) + { + *p_en = cgavd_cfg_move.cfgmt_port_move_en; + } + + else if (SYS_LEVEL == level) + { + *p_en = cgavd_cfg_move.cfgmt_sys_move_en; + } + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置各级搬移门限 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* @param id 队列号或端口号,系统级时,id参数无效 +* @param value 端口级和系统级时,为搬移门限值,单位为NPPU存包的单位,256B; + 流级时为搬移profile_id,0~15 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2016/10/18 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_move_th_set(ZXIC_UINT32 dev_id, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + ZXIC_UINT32 value) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 q_move_profile_reg_index = 0; + ZXIC_UINT32 pp_move_th_reg_index = 0; + ZXIC_UINT32 sys_move_th_reg_index = 0; + + DPP_ETM_CGAVD_MOVE_FLOW_TH_PROFILE_T q_move_profile = {0}; + DPP_ETM_CGAVD_MV_PORT_TH_T pp_move_th = {0}; + DPP_ETM_CGAVD_CFGMT_TOTAL_TH_T sys_move_th = {0}; + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, level, QUEUE_LEVEL, SYS_LEVEL); + + + q_move_profile_reg_index = ETM_CGAVD_MOVE_FLOW_TH_PROFILEr; + pp_move_th_reg_index = ETM_CGAVD_MV_PORT_THr; + sys_move_th_reg_index = ETM_CGAVD_CFGMT_TOTAL_THr; + + + if (QUEUE_LEVEL == level) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, value, 0, DPP_TM_CGAVD_MOVE_PROFILE_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, id, 0, DPP_ETM_Q_NUM - 1); + + q_move_profile.move_drop_profile = value; + rc = dpp_reg_write(dev_id, + q_move_profile_reg_index, + 0, + id, + &q_move_profile); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + + else if (PP_LEVEL == level) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, id, 0, DPP_TM_PP_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, value, 0, 0x3fff); + + pp_move_th.port_th = value; + rc = dpp_reg_write(dev_id, + pp_move_th_reg_index, + 0, + id, + &pp_move_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + else + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, value, 0, 0x3fff); + + sys_move_th.cfgmt_total_th = value; + rc = dpp_reg_write(dev_id, + sys_move_th_reg_index, + 0, + 0, + &sys_move_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + return DPP_OK; + +} + + +/***********************************************************/ +/** 读取各级搬移门限 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* @param id 队列号或端口号,系统级时,id参数无效 +* @param p_value 端口级和系统级时,为搬移门限值,单位为NPPU存包的单位,256B; + 流级时为搬移profile_id,0~15 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2016/10/18 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_move_th_get(ZXIC_UINT32 dev_id, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + ZXIC_UINT32 *p_value) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 q_move_profile_reg_index = 0; + ZXIC_UINT32 pp_move_th_reg_index = 0; + ZXIC_UINT32 sys_move_th_reg_index = 0; + + DPP_ETM_CGAVD_MOVE_FLOW_TH_PROFILE_T q_move_profile = {0}; + DPP_ETM_CGAVD_MV_PORT_TH_T pp_move_th = {0}; + DPP_ETM_CGAVD_CFGMT_TOTAL_TH_T sys_move_th = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, level, QUEUE_LEVEL, SYS_LEVEL); + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_value); + + q_move_profile_reg_index = ETM_CGAVD_MOVE_FLOW_TH_PROFILEr; + pp_move_th_reg_index = ETM_CGAVD_MV_PORT_THr; + sys_move_th_reg_index = ETM_CGAVD_CFGMT_TOTAL_THr; + + + + if (QUEUE_LEVEL == level) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, id, 0, DPP_ETM_Q_NUM - 1); + + rc = dpp_reg_read(dev_id, + q_move_profile_reg_index, + 0, + id, + &q_move_profile); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + *p_value = q_move_profile.move_drop_profile; + } + + else if (PP_LEVEL == level) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, id, 0, DPP_TM_PP_NUM - 1); + rc = dpp_reg_read(dev_id, + pp_move_th_reg_index, + 0, + id, + &pp_move_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + *p_value = pp_move_th.port_th; + } + + else + { + rc = dpp_reg_read(dev_id, + sys_move_th_reg_index, + 0, + 0, + &sys_move_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + *p_value = sys_move_th.cfgmt_total_th; + } + + return DPP_OK; + +} + + +/***********************************************************/ +/** 配置flow级的搬移策略 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param move_profile flow级的搬移门限分组索引,0~15 +* @param th flow级的搬移门限,单位为KB; +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2016/10/18 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_flow_move_profile_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 move_profile, + ZXIC_UINT32 th) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 flow_move_th_reg_index = 0; + ZXIC_UINT32 blk_size = 0; + ZXIC_UINT32 move_th = 0; + ZXIC_UINT32 cgavd_cfg_mode = 0; + DPP_ETM_CGAVD_MOVE_FLOW_TH_T flow_th = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, move_profile, 0, DPP_TM_CGAVD_MOVE_PROFILE_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, th , DPP_TM_CGAVD_KILO_UL); + move_th = th * DPP_TM_CGAVD_KILO_UL; + + flow_move_th_reg_index = ETM_CGAVD_MOVE_FLOW_THr; + + rc = dpp_tm_cgavd_cfg_mode_get(dev_id, &cgavd_cfg_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_cfg_mode_get"); + + if (cgavd_cfg_mode == DPP_TM_CGAVD_BLOCK_MODE) + { + rc = dpp_tm_cfgmt_blk_size_get(dev_id, &blk_size); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_blk_size_get"); + + if (blk_size != 0) + { + move_th = (move_th / blk_size); + move_th = (move_th % blk_size == 0) ? (move_th ) : ((move_th) + 1); + } + } + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, move_th, 0, 0x1fffffff); + + flow_th.move_drop_flow_th = move_th; + rc = dpp_reg_write(dev_id, + flow_move_th_reg_index, + 0, + move_profile, + &flow_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 读取flow级的搬移策略 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param move_profile flow级的搬移门限分组索引,0~15 +* @param p_th flow级的搬移门限,单位为KB; +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2016/10/18 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_flow_move_profile_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 move_profile, + ZXIC_UINT32 *p_th) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 flow_move_th_reg_index = 0; + ZXIC_UINT32 blk_size = 0; + ZXIC_UINT32 move_th = 0; + ZXIC_UINT32 cgavd_cfg_mode = 0; + + DPP_ETM_CGAVD_MOVE_FLOW_TH_T flow_th = {0}; + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, move_profile, 0, DPP_TM_CGAVD_MOVE_PROFILE_NUM - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_th); + + flow_move_th_reg_index = ETM_CGAVD_MOVE_FLOW_THr; + + rc = dpp_reg_read(dev_id, + flow_move_th_reg_index, + 0, + move_profile, + &flow_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + move_th = flow_th.move_drop_flow_th; + + rc = dpp_tm_cgavd_cfg_mode_get(dev_id, &cgavd_cfg_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_cfg_mode_get"); + + if (cgavd_cfg_mode == DPP_TM_CGAVD_BLOCK_MODE) + { + rc = dpp_tm_cfgmt_blk_size_get(dev_id, &blk_size); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_blk_size_get"); + + *p_th = (move_th * blk_size) / DPP_TM_CGAVD_KILO_UL; + } + else if (cgavd_cfg_mode == DPP_TM_CGAVD_ZXIC_UINT8_MODE) + { + *p_th = (move_th / DPP_TM_CGAVD_KILO_UL); + } + else + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "dpp_tm_cgavd_flow_move_profile_get:cgavd_cfg_mode is err!!\n"); + return DPP_ERR; + } + + return DPP_OK; +} +#endif +/***********************************************************/ +/** 配置端口共享的搬移门限 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param th 端口共享的搬移门限,单位为NPPU存包的单位,256B; +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2016/10/18 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_port_share_th_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 th) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 port_share_th_reg_index = 0; + + DPP_ETM_CGAVD_CFGMT_PORT_SHARE_TH_T port_share_th = {0}; + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, th, 0, 0x3fff); + + port_share_th_reg_index = ETM_CGAVD_CFGMT_PORT_SHARE_THr; + + port_share_th.cfgmt_port_share_th = th; + + rc = dpp_reg_write(dev_id, + port_share_th_reg_index, + 0, + 0, + &port_share_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 读取端口共享的搬移门限 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_th 端口共享的搬移门限,单位为NPPU存包的单位,256B; +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2016/10/18 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_port_share_th_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_th) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 port_share_th_reg_index = 0; + + DPP_ETM_CGAVD_CFGMT_PORT_SHARE_TH_T port_share_th = {0}; + + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_th); + + port_share_th_reg_index = ETM_CGAVD_CFGMT_PORT_SHARE_THr; + + rc = dpp_reg_read(dev_id, + port_share_th_reg_index, + 0, + 0, + &port_share_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + *p_th = port_share_th.cfgmt_port_share_th; + + return DPP_OK; +} + +/***********************************************************/ +/** 配置基于优先级的QMU接收NPPU数据的fifo阈值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param sp 优先级0~7 +* @param th 指定优先级的fifo阈值0~511,单位为fifo条目,fifo深度512 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2016/10/18 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_move_drop_sp_th_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 sp, + ZXIC_UINT32 th) +{ + DPP_STATUS rc = DPP_OK; + + DPP_ETM_CGAVD_MV_DROP_SP_TH_T sp_th = {0}; + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, th, 0, 0x1ff); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, sp, 0, 7); + + sp_th.mvdrop_sp_th = th; + + rc = dpp_reg_write(dev_id, + ETM_CGAVD_MV_DROP_SP_THr, + 0, + sp, + &sp_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读取基于优先级的QMU接收NPPU数据的fifo阈值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param sp 优先级0~7 +* @param p_th 指定优先级的fifo阈值0~511,单位为fifo条目,fifo深度512 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2016/10/18 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_move_drop_sp_th_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 sp, + ZXIC_UINT32 *p_th) +{ + DPP_STATUS rc = DPP_OK; + + DPP_ETM_CGAVD_MV_DROP_SP_TH_T sp_th = {0}; + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, sp, 0, 7); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_th); + + rc = dpp_reg_read(dev_id, + ETM_CGAVD_MV_DROP_SP_THr, + 0, + sp, + &sp_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + *p_th = sp_th.mvdrop_sp_th; + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置强制片内或片外 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param en 1:使能 +* @param mode 1 :omem 强制片外 0:imem 强制片内 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2017/10/14 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_imem_omem_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 en, + ZXIC_UINT32 mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_CGAVD_FORCE_IMEM_OMEM_T cgavd_imem_omem_mode = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, mode, 0, 1); + + rc = dpp_reg_read(dev_id, + ETM_CGAVD_CGAVD_FORCE_IMEM_OMEMr, + 0, + 0, + &cgavd_imem_omem_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + cgavd_imem_omem_mode.choose_imem_omem = mode; + cgavd_imem_omem_mode.imem_omem_force_en = en; + + rc = dpp_reg_write(dev_id, + ETM_CGAVD_CGAVD_FORCE_IMEM_OMEMr, + 0, + 0, + &cgavd_imem_omem_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 获取强制片内或片外 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param en 1:使能 +* @param mode 1 :omem 强制片外 0:imem 强制片内 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2017/10/14 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_imem_omem_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_en, + ZXIC_UINT32 *p_mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_CGAVD_FORCE_IMEM_OMEM_T cgavd_imem_omem_mode = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_mode); + + rc = dpp_reg_read(dev_id, + ETM_CGAVD_CGAVD_FORCE_IMEM_OMEMr, + 0, + 0, + &cgavd_imem_omem_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + *p_mode = cgavd_imem_omem_mode.choose_imem_omem; + *p_en = cgavd_imem_omem_mode.imem_omem_force_en; + + return DPP_OK; +} + +#endif + +/***********************************************************/ +/** 配置配置cgavd模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param mode 0:block mode 1:byte mode +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/07/28 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_cfg_mode_set(DPP_DEV_T *dev, + ZXIC_UINT32 mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_CFGMT_BYTE_MODE_T cgavd_cfg_mode = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), mode, 0, 1); + + rc = dpp_reg_read(dev, + ETM_CGAVD_CFGMT_BYTE_MODEr, + 0, + 0, + &cgavd_cfg_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + cgavd_cfg_mode.cfgmt_byte_mode = mode; + + rc = dpp_reg_write(dev, + ETM_CGAVD_CFGMT_BYTE_MODEr, + 0, + 0, + &cgavd_cfg_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 获取cgavd模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_mode 0:block mode 1:byte mode +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/07/29 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_cfg_mode_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_CFGMT_BYTE_MODE_T cgavd_cfg_mode = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_mode); + + rc = dpp_reg_read(dev, + ETM_CGAVD_CFGMT_BYTE_MODEr, + 0, + 0, + &cgavd_cfg_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_mode = cgavd_cfg_mode.cfgmt_byte_mode; + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置各级拥塞避免功能使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 要配置的拥塞避免层次号,0:队列级,1:端口级,2:系统级 +* @param en 使能标记,0-不使能,1-使能 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/28 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_en_set(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 en) +{ + DPP_STATUS rc = DPP_OK; + + DPP_ETM_CGAVD_CGAVD_SUB_EN_T cgavd_sub_en = {0}; + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_POINT(dev); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), level, QUEUE_LEVEL, SA_LEVEL); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), en, 0, 1); + + rc = dpp_reg_read(dev, + ETM_CGAVD_CGAVD_SUB_ENr, + 0, + 0, + &cgavd_sub_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + if (QUEUE_LEVEL == level) + { + cgavd_sub_en.cgavd_flow_sub_en = en; + } + + else if (PP_LEVEL == level) + { + cgavd_sub_en.cgavd_pp_sub_en = en; + } + + else if (SYS_LEVEL == level) + { + cgavd_sub_en.cgavd_sys_sub_en = en; + } + + rc = dpp_reg_write(dev, + ETM_CGAVD_CGAVD_SUB_ENr, + 0, + 0, + &cgavd_sub_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读取各级拥塞避免功能使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 要读取的拥塞避免层次号,0:队列级,1:端口级,2:系统级 +* @param p_en 读出的使能标记,0-不使能,1-使能 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/28 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_en_get(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 *p_en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_CGAVD_SUB_EN_T cgavd_sub_en = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), level, QUEUE_LEVEL, SA_LEVEL); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_en); + + *p_en = 0xffffffff; + + rc = dpp_reg_read(dev, + ETM_CGAVD_CGAVD_SUB_ENr, + 0, + 0, + &cgavd_sub_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + if (level == QUEUE_LEVEL) + { + *p_en = cgavd_sub_en.cgavd_flow_sub_en; + } + + else if (level == PP_LEVEL) + { + *p_en = cgavd_sub_en.cgavd_pp_sub_en; + } + + else if (level == SYS_LEVEL) + { + *p_en = cgavd_sub_en.cgavd_sys_sub_en; + } + + else if (level == SA_LEVEL) + { + *p_en = cgavd_sub_en.cgavd_sa_sub_en; + } + + return DPP_OK; +} + +/***********************************************************/ +/** dp选取来源 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 要配置的拥塞避免层次号,0:队列级,1:端口级,2:系统级 +* @param dp_sel dp选取来源,0-dp,1-tc,2-pkt_len[2:0] +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2017/03/14 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_dp_sel_set(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + DPP_TM_CGAVD_DP_SEL_E dp_sel) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_CGAVD_DP_SEL_T cgavd_dp_sel = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), level, QUEUE_LEVEL, SYS_LEVEL); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), dp_sel, DP_SEL_DP, DP_SEL_PKT_LEN); + + rc = dpp_reg_read(dev, + ETM_CGAVD_CGAVD_DP_SELr, + 0, + 0, + &cgavd_dp_sel); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + if (QUEUE_LEVEL == level) + { + if (DP_SEL_DP == dp_sel) + { + cgavd_dp_sel.flow_dp_sel_high = 0; + cgavd_dp_sel.flow_dp_sel_mid = 0; + cgavd_dp_sel.flow_dp_sel_low = 1; + } + else if (DP_SEL_TC == dp_sel) + { + cgavd_dp_sel.flow_dp_sel_high = 0; + cgavd_dp_sel.flow_dp_sel_mid = 1; + cgavd_dp_sel.flow_dp_sel_low = 0; + } + else if (DP_SEL_PKT_LEN == dp_sel) + { + cgavd_dp_sel.flow_dp_sel_high = 1; + cgavd_dp_sel.flow_dp_sel_mid = 0; + cgavd_dp_sel.flow_dp_sel_low = 0; + } + } + + else if (PP_LEVEL == level) + { + if (DP_SEL_DP == dp_sel) + { + cgavd_dp_sel.pp_dp_sel_high = 0; + cgavd_dp_sel.pp_dp_sel_mid = 0; + cgavd_dp_sel.pp_dp_sel_low = 1; + } + else if (DP_SEL_TC == dp_sel) + { + cgavd_dp_sel.pp_dp_sel_high = 0; + cgavd_dp_sel.pp_dp_sel_mid = 1; + cgavd_dp_sel.pp_dp_sel_low = 0; + } + else if (DP_SEL_PKT_LEN == dp_sel) + { + cgavd_dp_sel.pp_dp_sel_high = 1; + cgavd_dp_sel.pp_dp_sel_mid = 0; + cgavd_dp_sel.pp_dp_sel_low = 0; + } + } + + else if (SYS_LEVEL == level) + { + if (DP_SEL_DP == dp_sel) + { + cgavd_dp_sel.sys_dp_sel_high = 0; + cgavd_dp_sel.sys_dp_sel_mid = 0; + cgavd_dp_sel.sys_dp_sel_low = 1; + } + else if (DP_SEL_TC == dp_sel) + { + cgavd_dp_sel.sys_dp_sel_high = 0; + cgavd_dp_sel.sys_dp_sel_mid = 1; + cgavd_dp_sel.sys_dp_sel_low = 0; + } + else if (DP_SEL_PKT_LEN == dp_sel) + { + cgavd_dp_sel.sys_dp_sel_high = 1; + cgavd_dp_sel.sys_dp_sel_mid = 0; + cgavd_dp_sel.sys_dp_sel_low = 0; + } + } + + rc = dpp_reg_write(dev, + ETM_CGAVD_CGAVD_DP_SELr, + 0, + 0, + &cgavd_dp_sel); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置拥塞避免算法 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* @param id 队列号或端口号,系统级时,id参数无效 +* @param method 配置的拥塞避免算法,0:TD,1:WRED/GRED +* 配置TD算法时,先配TD阈值,再配置TD算法 +* 配置WRED算法时,先配置流级或端口级的平均队列深度,再配置WRED算法 +* 配置GRED算法时,先配置系统级的平均队列深度,在配置成GRED算法 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark +* @see +* @author taq @date 2015/04/14 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_method_set(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + DPP_TM_CGAVD_METHOD_E method) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 q_avg_q_len_reg_index = 0; + ZXIC_UINT32 q_td_th_reg_index = 0; + ZXIC_UINT32 q_ca_mtd_reg_index = 0; + ZXIC_UINT32 pp_avg_q_len_reg_index = 0; + ZXIC_UINT32 pp_td_th_reg_index = 0; + ZXIC_UINT32 pp_ca_mtd_reg_index = 0; + ZXIC_UINT32 sys_avg_q_len_reg_index = 0; + ZXIC_UINT32 sys_td_th_reg_index = 0; + ZXIC_UINT32 sys_ca_mtd_reg_index = 0; + + DPP_ETM_CGAVD_FLOW_CA_MTD_T q_cgavd_method = {0}; + DPP_ETM_CGAVD_PP_CA_MTD_T pp_cgavd_method = {0}; + DPP_ETM_CGAVD_SYS_CGAVD_METD_T sys_cgavd_method = {0}; + DPP_ETM_CGAVD_FLOW_AVG_Q_LEN_T flow_avg_q_len = {0}; + DPP_ETM_CGAVD_PP_AVG_Q_LEN_T pp_avg_q_len = {0}; + DPP_ETM_CGAVD_SYS_AVG_Q_LEN_T sys_avg_q_len = {0}; + DPP_ETM_CGAVD_FLOW_TD_TH_T q_td_th = {0}; + DPP_ETM_CGAVD_PP_TD_TH_T pp_td_th = {0}; + DPP_ETM_CGAVD_SYS_TD_TH_T sys_td_th = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), level, QUEUE_LEVEL, SYS_LEVEL); + + q_avg_q_len_reg_index = ETM_CGAVD_FLOW_AVG_Q_LENr; + q_td_th_reg_index = ETM_CGAVD_FLOW_TD_THr; + q_ca_mtd_reg_index = ETM_CGAVD_FLOW_CA_MTDr; + pp_avg_q_len_reg_index = ETM_CGAVD_PP_AVG_Q_LENr; + pp_td_th_reg_index = ETM_CGAVD_PP_TD_THr; + pp_ca_mtd_reg_index = ETM_CGAVD_PP_CA_MTDr; + sys_avg_q_len_reg_index = ETM_CGAVD_SYS_AVG_Q_LENr; + sys_td_th_reg_index = ETM_CGAVD_SYS_TD_THr; + sys_ca_mtd_reg_index = ETM_CGAVD_SYS_CGAVD_METDr; + + + switch (level) + { + case (QUEUE_LEVEL): + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), id, 0, DPP_ETM_Q_NUM - 1); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), method, TD_METHOD, WRED_GRED_METHOD); + + if (1 == method) /* WRED算法,需要先配置平均队列深度,在选择wred算法 */ + { + rc = dpp_reg_read(dev, + q_avg_q_len_reg_index, + 0, + id, + &flow_avg_q_len); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + rc = dpp_reg_write(dev, + q_avg_q_len_reg_index, + 0, + id, + &flow_avg_q_len); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + } + + if (0 == method) /* TD算法,需要先配置尾部丢弃阈值,在选择TD算法 */ + { + rc = dpp_reg_read(dev, + q_td_th_reg_index, + 0, + id, + &q_td_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + + rc = dpp_reg_write(dev, + q_td_th_reg_index, + 0, + id, + &q_td_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + } + + /* 寄存器写入值,0-TD,1-WRED */ + q_cgavd_method.flow_ca_mtd = method; + rc = dpp_reg_write(dev, + q_ca_mtd_reg_index, + 0, + id, + &q_cgavd_method); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + break; + } + + case (PP_LEVEL): + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), id, 0, DPP_TM_PP_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), method, TD_METHOD, WRED_GRED_METHOD); + + if (1 == method) /* WRED算法,需要先配置平均队列深度,在选择wred算法 */ + { + rc = dpp_reg_read(dev, + pp_avg_q_len_reg_index, + 0, + id, + &pp_avg_q_len); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + rc = dpp_reg_write(dev, + pp_avg_q_len_reg_index, + 0, + id, + &pp_avg_q_len); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + } + + if (0 == method) /* TD算法,尾部丢弃阈值,在选择TD算法 */ + { + rc = dpp_reg_read(dev, + pp_td_th_reg_index, + 0, + id, + &pp_td_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + rc = dpp_reg_write(dev, + pp_td_th_reg_index, + 0, + id, + &pp_td_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + } + + /* 寄存器写入值,0-TD,1-WRED */ + pp_cgavd_method.pp_ca_mtd = method; + rc = dpp_reg_write(dev, + pp_ca_mtd_reg_index, + 0, + id, + &pp_cgavd_method); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + + break; + } + + case (SYS_LEVEL): + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), method, TD_METHOD, WRED_GRED_METHOD); + + if (1 == method) /* GRED算法,需要先配置平均队列深度,在选择gred算法 */ + { + rc = dpp_reg_read(dev, + sys_avg_q_len_reg_index, + 0, + 0, + &sys_avg_q_len); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + rc = dpp_reg_write(dev, + sys_avg_q_len_reg_index, + 0, + 0, + &sys_avg_q_len); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + } + + if (0 == method) /* TD算法,尾部丢弃阈值,在选择TD算法 */ + { + rc = dpp_reg_read(dev, + sys_td_th_reg_index, + 0, + 0, + &sys_td_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + rc = dpp_reg_write(dev, + sys_td_th_reg_index, + 0, + 0, + &sys_td_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + } + + /* 寄存器写入值,0-TD,1-GRED */ + sys_cgavd_method.sys_cgavd_metd = method; + rc = dpp_reg_write(dev, + sys_ca_mtd_reg_index, + 0, + 0, + &sys_cgavd_method); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + break; + } + + default: + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "method=%u error!\n", (method)); + return DPP_ERR; + } + } + + return DPP_OK; + +} + + +/***********************************************************/ +/** 读取拥塞避免算法 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* @param id 队列号或端口号,系统级时,id参数无效 +* @param p_method 配置的拥塞避免算法,0:TD,1:WRED/GRED +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/17 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_method_get(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + DPP_TM_CGAVD_METHOD_E *p_method) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 q_ca_mtd_reg_index = 0; + ZXIC_UINT32 pp_ca_mtd_reg_index = 0; + ZXIC_UINT32 sys_ca_mtd_reg_index = 0; + + DPP_ETM_CGAVD_FLOW_CA_MTD_T q_cgavd_method = {0}; + DPP_ETM_CGAVD_PP_CA_MTD_T pp_cgavd_method = {0}; + DPP_ETM_CGAVD_SYS_CGAVD_METD_T sys_cgavd_method = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), level, QUEUE_LEVEL, SYS_LEVEL); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_method); + + *p_method = INVALID_METHOD; + + q_ca_mtd_reg_index = ETM_CGAVD_FLOW_CA_MTDr; + pp_ca_mtd_reg_index = ETM_CGAVD_PP_CA_MTDr; + sys_ca_mtd_reg_index = ETM_CGAVD_SYS_CGAVD_METDr; + + if (QUEUE_LEVEL == level) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), id, 0, DPP_ETM_Q_NUM - 1); + + rc = dpp_reg_read(dev, + q_ca_mtd_reg_index, + 0, + id, + &q_cgavd_method); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + *p_method = q_cgavd_method.flow_ca_mtd; + } + + else if (PP_LEVEL == level) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), id, 0, DPP_TM_PP_NUM - 1); + + rc = dpp_reg_read(dev, + pp_ca_mtd_reg_index, + 0, + id, + &pp_cgavd_method); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + *p_method = pp_cgavd_method.pp_ca_mtd; + } + + else + { + rc = dpp_reg_read(dev, + sys_ca_mtd_reg_index, + 0, + 0, + &sys_cgavd_method); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_method = sys_cgavd_method.sys_cgavd_metd; + } + + return DPP_OK; +} + + +/***********************************************************/ +/** CPU设置的各级队列深度配置 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* @param q_len_use_cpu_set_en 0:选取RAM中读出的队列深度; +* @param 1:选取q_len_cpu_set值 +* @param q_len_cpu_set CPU设置的各级队列深度,单位为block。 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/06/19 +************************************************************/ +DPP_STATUS dpp_tm_q_len_use_cpu_set(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 q_len_use_cpu_set_en, + ZXIC_UINT32 q_len_cpu_set) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 rd_cpu_or_ram_reg_index = 0; + ZXIC_UINT32 q_cpu_set_q_len_reg_index = 0; + ZXIC_UINT32 pp_cpu_set_q_len_reg_index = 0; + ZXIC_UINT32 sys_cpu_set_q_len_reg_index = 0; + + DPP_ETM_CGAVD_RD_CPU_OR_RAM_T len_use_cpu_set_en = {0}; + DPP_ETM_CGAVD_FLOW_CPU_SET_Q_LEN_T flow_q_len_cpu_set = {0}; + DPP_ETM_CGAVD_PP_CPU_SET_Q_LEN_T pp_q_len_cpu_set = {0}; + DPP_ETM_CGAVD_SYS_CPU_SET_Q_LEN_T sys_q_len_cpu_set = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), level, QUEUE_LEVEL, SYS_LEVEL); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), q_len_use_cpu_set_en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), q_len_cpu_set, 0, 0x1ffffff); + + rd_cpu_or_ram_reg_index = ETM_CGAVD_RD_CPU_OR_RAMr; + q_cpu_set_q_len_reg_index = ETM_CGAVD_FLOW_CPU_SET_Q_LENr; + pp_cpu_set_q_len_reg_index = ETM_CGAVD_PP_CPU_SET_Q_LENr; + sys_cpu_set_q_len_reg_index = ETM_CGAVD_SYS_CPU_SET_Q_LENr; + + rc = dpp_reg_read(dev, + rd_cpu_or_ram_reg_index, + 0, + 0, + &len_use_cpu_set_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + switch (level) + { + case (QUEUE_LEVEL): + { + len_use_cpu_set_en.cpu_sel_flow_q_len_en = q_len_use_cpu_set_en; + rc = dpp_reg_write(dev, + rd_cpu_or_ram_reg_index, + 0, + 0, + &len_use_cpu_set_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + if (q_len_use_cpu_set_en == 1) + { + flow_q_len_cpu_set.flow_cpu_set_q_len = q_len_cpu_set; + rc = dpp_reg_write(dev, + q_cpu_set_q_len_reg_index, + 0, + 0, + &flow_q_len_cpu_set); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + } + + + break; + } + + case (PP_LEVEL): + { + len_use_cpu_set_en.cpu_sel_pp_q_len_en = q_len_use_cpu_set_en; + rc = dpp_reg_write(dev, + rd_cpu_or_ram_reg_index, + 0, + 0, + &len_use_cpu_set_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + if (q_len_use_cpu_set_en == 1) + { + pp_q_len_cpu_set.pp_cpu_set_q_len = q_len_cpu_set; + rc = dpp_reg_write(dev, + pp_cpu_set_q_len_reg_index, + 0, + 0, + &pp_q_len_cpu_set); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + } + + break; + } + + case (SYS_LEVEL): + { + len_use_cpu_set_en.cpu_sel_sys_q_len_en = q_len_use_cpu_set_en; + rc = dpp_reg_write(dev, + rd_cpu_or_ram_reg_index, + 0, + 0, + &len_use_cpu_set_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + if (q_len_use_cpu_set_en == 1) + { + sys_q_len_cpu_set.sys_cpu_set_q_len = q_len_cpu_set; + rc = dpp_reg_write(dev, + sys_cpu_set_q_len_reg_index, + 0, + 0, + &sys_q_len_cpu_set); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + } + + break; + } + + default: + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "level=%u error!\n", level); + return DPP_ERR; + } + + } + + return DPP_OK; + +} + + +/***********************************************************/ +/** CPU设置的各级平均队列深度配置 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* @param q_avg_len_use_cpu_set_en 0:选取RAM中读出的队列深度; +* @param 1:选取q_avg_len_cpu_set值 +* @param q_avg_len_cpu_set CPU设置的各级平均队列深度。 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/06/19 +************************************************************/ +DPP_STATUS dpp_tm_q_avg_len_use_cpu_set(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 q_avg_len_use_cpu_set_en, + ZXIC_UINT32 q_avg_len_cpu_set) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 rd_cpu_or_ram_reg_index = 0; + ZXIC_UINT32 q_cpu_set_avg_len_reg_index = 0; + ZXIC_UINT32 pp_cpu_set_avg_len_reg_index = 0; + ZXIC_UINT32 sys_cpu_set_avg_len_reg_index = 0; + + DPP_ETM_CGAVD_RD_CPU_OR_RAM_T avg_len_use_cpu_set_en = {0}; + DPP_ETM_CGAVD_FLOW_CPU_SET_AVG_LEN_T flow_q_avg_len_cpu_set = {0}; + DPP_ETM_CGAVD_PP_CPU_SET_AVG_Q_LEN_T pp_q_avg_len_cpu_set = {0}; + DPP_ETM_CGAVD_SYS_CPU_SET_AVG_LEN_T sys_q_avg_len_cpu_set = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), level, QUEUE_LEVEL, SYS_LEVEL); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), q_avg_len_use_cpu_set_en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), q_avg_len_cpu_set, 0, 0x1ffffff); + + rd_cpu_or_ram_reg_index = ETM_CGAVD_RD_CPU_OR_RAMr; + q_cpu_set_avg_len_reg_index = ETM_CGAVD_FLOW_CPU_SET_AVG_LENr; + pp_cpu_set_avg_len_reg_index = ETM_CGAVD_PP_CPU_SET_AVG_Q_LENr; + sys_cpu_set_avg_len_reg_index = ETM_CGAVD_SYS_CPU_SET_AVG_LENr; + + rc = dpp_reg_read(dev, + rd_cpu_or_ram_reg_index, + 0, + 0, + &avg_len_use_cpu_set_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + switch (level) + { + case (QUEUE_LEVEL): + { + avg_len_use_cpu_set_en.cpu_sel_flow_avg_q_len_en = q_avg_len_use_cpu_set_en; + rc = dpp_reg_write(dev, + rd_cpu_or_ram_reg_index, + 0, + 0, + &avg_len_use_cpu_set_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + if (q_avg_len_use_cpu_set_en == 1) + { + flow_q_avg_len_cpu_set.flow_cpu_set_avg_len = q_avg_len_cpu_set; + rc = dpp_reg_write(dev, + q_cpu_set_avg_len_reg_index, + 0, + 0, + &flow_q_avg_len_cpu_set); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + } + + break; + } + + case (PP_LEVEL): + { + avg_len_use_cpu_set_en.cpu_sel_pp_avg_q_len_en = q_avg_len_use_cpu_set_en; + rc = dpp_reg_write(dev, + rd_cpu_or_ram_reg_index, + 0, + 0, + &avg_len_use_cpu_set_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + if (q_avg_len_use_cpu_set_en == 1) + { + pp_q_avg_len_cpu_set.pp_cpu_set_avg_q_len = q_avg_len_cpu_set; + rc = dpp_reg_write(dev, + pp_cpu_set_avg_len_reg_index, + 0, + 0, + &pp_q_avg_len_cpu_set); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + } + + break; + } + + case (SYS_LEVEL): + { + avg_len_use_cpu_set_en.cpu_sel_sys_avg_q_len_en = q_avg_len_use_cpu_set_en; + rc = dpp_reg_write(dev, + rd_cpu_or_ram_reg_index, + 0, + 0, + &avg_len_use_cpu_set_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + if (q_avg_len_use_cpu_set_en == 1) + { + sys_q_avg_len_cpu_set.sys_cpu_set_avg_len = q_avg_len_cpu_set; + rc = dpp_reg_write(dev, + sys_cpu_set_avg_len_reg_index, + 0, + 0, + &sys_q_avg_len_cpu_set); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + } + + break; + } + + default: + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "level=%u error!\n", level); + return DPP_ERR; + } + + } + + return DPP_OK; + +} + + +/***********************************************************/ +/** 流队列级队列深度的获取 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param que_id 队列号 +* p_len 队列深度以KB为单位 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/06/19 +************************************************************/ +DPP_STATUS dpp_tm_flow_que_len_get(DPP_DEV_T *dev, + ZXIC_UINT32 que_id, + ZXIC_UINT32 *p_len) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 blk_size = 0; + ZXIC_UINT32 cgavd_cfg_mode = 0; + + DPP_ETM_CGAVD_FLOW_Q_LEN_T dpp_tm_flow_len = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_len); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), que_id, 0, DPP_ETM_Q_NUM - 1); + + rc = dpp_reg_read(dev, + ETM_CGAVD_FLOW_Q_LENr, + 0, + que_id, + &dpp_tm_flow_len); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + rc = dpp_tm_cgavd_cfg_mode_get(dev, &cgavd_cfg_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_cgavd_cfg_mode_get"); + + if (cgavd_cfg_mode == DPP_TM_CGAVD_BLOCK_MODE) + { + rc = dpp_tm_cfgmt_blk_size_get(dev, &blk_size); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_cfgmt_blk_size_get"); + + *p_len = ((dpp_tm_flow_len.flow_q_len * blk_size) / DPP_TM_CGAVD_KILO_UL); + } + else if (cgavd_cfg_mode == DPP_TM_CGAVD_ZXIC_UINT8_MODE) + { + *p_len = ((dpp_tm_flow_len.flow_q_len) / DPP_TM_CGAVD_KILO_UL); + } + else + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "dpp_tm_flow_que_len_get:cgavd_cfg_mode is err!!\n"); + return DPP_ERR; + } + + return DPP_OK; +} + +#if 0 +/***********************************************************/ +/** 端口级队列深度的获取 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param pp_id 队列号 +* pp_len 队列深度以KB为单位 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/06/19 +************************************************************/ +DPP_STATUS dpp_tm_port_que_len_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 pp_id, + ZXIC_UINT32 *pp_len) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 blk_size = 0; + DPP_ETM_CGAVD_PP_Q_LEN_T dpp_tm_pp_len = {0}; + ZXIC_UINT32 cgavd_cfg_mode = 0; + + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, pp_len); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pp_id, 0, DPP_TM_PP_NUM - 1); + + rc = dpp_reg_read(dev_id, + ETM_CGAVD_FLOW_Q_LENr, + 0, + pp_id, + &dpp_tm_pp_len); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_tm_cgavd_cfg_mode_get(dev_id, &cgavd_cfg_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_cfg_mode_get"); + + if (cgavd_cfg_mode == DPP_TM_CGAVD_BLOCK_MODE) + { + rc = dpp_tm_cfgmt_blk_size_get(dev_id, &blk_size); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_blk_size_get"); + + *pp_len = ((dpp_tm_pp_len.pp_q_len * blk_size) / DPP_TM_CGAVD_KILO_UL); + } + else if (cgavd_cfg_mode == DPP_TM_CGAVD_ZXIC_UINT8_MODE) + { + *pp_len = ((dpp_tm_pp_len.pp_q_len) / DPP_TM_CGAVD_KILO_UL); + } + else + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "dpp_tm_port_que_len_get err!!\n"); + return DPP_ERR; + } + + return DPP_OK; +} + + +/***********************************************************/ +/** 系统级队列深度的获取 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param sys_len 系统级深度以block为单位 +* sys_protocol_len 系统级包含协议队列深度以KB为单位 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/06/19 +************************************************************/ +DPP_STATUS dpp_tm_sys_que_len_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *sys_len, + ZXIC_UINT32 *sys_protocol_len) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 blk_size = 0; + ZXIC_UINT32 sys_q_len_reg_index = 0; + ZXIC_UINT32 sys_q_len_l_reg_index = 0; + DPP_ETM_CGAVD_SYS_Q_LEN_T dpp_tm_sys_len = {0}; + DPP_ETM_CGAVD_CGAVD_SYS_Q_LEN_L_T dpp_tm_sys_protocol_len = {0}; + ZXIC_UINT32 cgavd_cfg_mode = 0; + + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, sys_protocol_len); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, sys_len); + + sys_q_len_reg_index = ETM_CGAVD_SYS_Q_LENr; + sys_q_len_l_reg_index = ETM_CGAVD_CGAVD_SYS_Q_LEN_Lr; + + rc = dpp_reg_read(dev_id, + sys_q_len_reg_index, + 0, + 0, + &dpp_tm_sys_len); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + sys_q_len_l_reg_index, + 0, + 0, + &dpp_tm_sys_protocol_len); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_tm_cgavd_cfg_mode_get(dev_id, &cgavd_cfg_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_cfg_mode_get"); + + if (cgavd_cfg_mode == DPP_TM_CGAVD_BLOCK_MODE) + { + rc = dpp_tm_cfgmt_blk_size_get(dev_id, &blk_size); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_blk_size_get"); + + *sys_len = ((dpp_tm_sys_len.sys_q_len * blk_size) / DPP_TM_CGAVD_KILO_UL); + *sys_protocol_len = ((dpp_tm_sys_protocol_len.cgavd_sys_q_len_l * blk_size) / DPP_TM_CGAVD_KILO_UL); + } + else if (cgavd_cfg_mode == DPP_TM_CGAVD_ZXIC_UINT8_MODE) + { + *sys_len = ((dpp_tm_sys_len.sys_q_len) / DPP_TM_CGAVD_KILO_UL); + *sys_protocol_len = ((dpp_tm_sys_protocol_len.cgavd_sys_q_len_l) / DPP_TM_CGAVD_KILO_UL); + } + else + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "dpp_tm_sys_que_len_get err!!\n"); + return DPP_ERR; + } + + return DPP_OK; + +} + +#endif + +/***********************************************************/ +/** 配置TD拥塞避免模式下的丢弃门限值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* @param id 队列号或端口号,系统级时,id参数无效 +* @param byte_block_th 配置的丢弃门限值,ZXIC_UINT8/BLOCK单位写入寄存器 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/07/29 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_td_byte_block_th_set(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + ZXIC_UINT32 byte_block_th) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 q_td_th_reg_index = 0; + ZXIC_UINT32 q_ca_mtd_reg_index = 0; + ZXIC_UINT32 pp_td_th_reg_index = 0; + ZXIC_UINT32 pp_ca_mtd_reg_index = 0; + ZXIC_UINT32 sys_td_th_reg_index = 0; + ZXIC_UINT32 sys_ca_mtd_reg_index = 0; + ZXIC_UINT32 read_times = 50; + DPP_ETM_CGAVD_FLOW_CA_MTD_T q_cgavd_method = {0}; + DPP_ETM_CGAVD_FLOW_TD_TH_T q_td_th = {0}; + DPP_ETM_CGAVD_PP_CA_MTD_T pp_cgavd_method = {0}; + DPP_ETM_CGAVD_PP_TD_TH_T pp_td_th = {0}; + DPP_ETM_CGAVD_SYS_CGAVD_METD_T sys_cgavd_method = {0}; + DPP_ETM_CGAVD_SYS_TD_TH_T sys_td_th = {0}; + ZXIC_UINT32 qlist_clr_done_flag = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), level, QUEUE_LEVEL, SYS_LEVEL); + + q_td_th_reg_index = ETM_CGAVD_FLOW_TD_THr; + q_ca_mtd_reg_index = ETM_CGAVD_FLOW_CA_MTDr; + pp_td_th_reg_index = ETM_CGAVD_PP_TD_THr; + pp_ca_mtd_reg_index = ETM_CGAVD_PP_CA_MTDr; + sys_td_th_reg_index = ETM_CGAVD_SYS_TD_THr; + sys_ca_mtd_reg_index = ETM_CGAVD_SYS_CGAVD_METDr; + + if (QUEUE_LEVEL == level) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), id, 0, DPP_ETM_Q_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), byte_block_th, 0, 0x1fffffff); + + q_td_th.flow_td_th = byte_block_th; + rc = dpp_reg_write(dev, + q_td_th_reg_index, + 0, + id, + &q_td_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + q_cgavd_method.flow_ca_mtd = TD_METHOD; + + rc = dpp_reg_write(dev, + q_ca_mtd_reg_index, + 0, + id, + &q_cgavd_method); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + /* add by zhmy begin@20151103 */ + if (byte_block_th == 0) + { + do + { + rc = dpp_tm_qmu_qlist_qcfg_clr_done_get(dev, &qlist_clr_done_flag); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_qmu_qlist_qcfg_clr_done_get"); + + read_times--; + + if (1 == qlist_clr_done_flag) + { + break; + } + + zxic_comm_delay(10); + } + while (read_times > 0); + + if (read_times == 0) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "dpp_tm_qmu_qlist_qcfg_clr_done_get time out\n"); + return DPP_ERR; + } + + } + + /* add by zhmy end@20151103 */ + } + + else if (PP_LEVEL == level) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), id, 0, DPP_TM_PP_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), byte_block_th, 0, 0x1fffffff); + + pp_td_th.pp_td_th = byte_block_th; + rc = dpp_reg_write(dev, + pp_td_th_reg_index, + 0, + id, + &pp_td_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + pp_cgavd_method.pp_ca_mtd = TD_METHOD; + rc = dpp_reg_write(dev, + pp_ca_mtd_reg_index, + 0, + id, + &pp_cgavd_method); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + } + + else + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), byte_block_th, 0, 0x1fffffff); + + sys_td_th.sys_td_th = byte_block_th; + rc = dpp_reg_write(dev, + sys_td_th_reg_index, + 0, + 0, + &sys_td_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + sys_cgavd_method.sys_cgavd_metd = TD_METHOD; + + rc = dpp_reg_write(dev, + sys_ca_mtd_reg_index, + 0, + 0, + &sys_cgavd_method); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + } + + return DPP_OK; + +} + + +/***********************************************************/ +/** 配置TD拥塞避免模式下的丢弃门限值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* @param id 队列号或端口号,系统级时,id参数无效 +* @param td_th 配置的丢弃门限值,用户配置门限值单位为Kbyte,需要转化为Block或者ZXIC_UINT8单位写入寄存器 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/07/29 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_td_th_set(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + ZXIC_UINT32 td_th) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 blk_size = 0; + ZXIC_UINT32 blk_th = 0; + ZXIC_UINT32 cgavd_cfg_mode = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), level, QUEUE_LEVEL, SYS_LEVEL); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), td_th, 0, 512*1024); + + td_th = (ZXIC_UINT32)(td_th * DPP_TM_CGAVD_KILO_UL); + + rc = dpp_tm_cgavd_cfg_mode_get(dev, &cgavd_cfg_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_cgavd_cfg_mode_get"); + + if (cgavd_cfg_mode == DPP_TM_CGAVD_BLOCK_MODE) + { + rc = dpp_tm_cfgmt_blk_size_get(dev, &blk_size); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_cfgmt_blk_size_get"); + + if (blk_size != 0) + { + blk_th = (td_th / blk_size); + blk_th = (td_th % blk_size == 0) ? (blk_th ) : ((blk_th) + 1); + } + + rc = dpp_tm_cgavd_td_byte_block_th_set(dev, level, id, blk_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_cgavd_td_byte_block_th_set"); + } + else if (cgavd_cfg_mode == DPP_TM_CGAVD_ZXIC_UINT8_MODE) + { + rc = dpp_tm_cgavd_td_byte_block_th_set(dev, level, id, td_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_cgavd_td_byte_block_th_set"); + } + else + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "dpp_tm_cgavd_td_th_set err!!\n"); + return DPP_ERR; + } + + return DPP_OK; + +} + + +/***********************************************************/ +/** 读取TD拥塞避免模式下的丢弃门限值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* @param id 队列号或端口号,系统级时,id参数无效 +* @param p_byte_block_th 配置的丢弃门限值ZXIC_UINT8/BLOCK单位 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/07/29 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_td_byte_block_th_get(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + ZXIC_UINT32 *p_byte_block_th) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 q_td_th_reg_index = 0; + ZXIC_UINT32 pp_td_th_reg_index = 0; + ZXIC_UINT32 sys_td_th_reg_index = 0; + DPP_ETM_CGAVD_FLOW_TD_TH_T q_td_th = {0}; + DPP_ETM_CGAVD_PP_TD_TH_T pp_td_th = {0}; + DPP_ETM_CGAVD_SYS_TD_TH_T sys_td_th = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), level, QUEUE_LEVEL, SYS_LEVEL); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_byte_block_th); + + + if (QUEUE_LEVEL == level) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), id, 0, DPP_ETM_Q_NUM - 1); + } + + else if (PP_LEVEL == level) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), id, 0, DPP_TM_PP_NUM - 1); + } + + else + { + ZXIC_COMM_PRINT("sys:id is not to be checked!!\n"); + } + + q_td_th_reg_index = ETM_CGAVD_FLOW_TD_THr; + pp_td_th_reg_index = ETM_CGAVD_PP_TD_THr; + sys_td_th_reg_index = ETM_CGAVD_SYS_TD_THr; + + if (QUEUE_LEVEL == level) + { + rc = dpp_reg_read(dev, + q_td_th_reg_index, + 0, + id, + &q_td_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + *p_byte_block_th = q_td_th.flow_td_th; + } + + else if (PP_LEVEL == level) + { + rc = dpp_reg_read(dev, + pp_td_th_reg_index, + 0, + id, + &pp_td_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + *p_byte_block_th = pp_td_th.pp_td_th; + } + + else + { + rc = dpp_reg_read(dev, + sys_td_th_reg_index, + 0, + 0, + &sys_td_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + *p_byte_block_th = sys_td_th.sys_td_th; + } + + return DPP_OK; + +} + + +/***********************************************************/ +/** 读取TD拥塞避免模式下的丢弃门限值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* @param id 队列号或端口号,系统级时,id参数无效 +* @param p_td_th 配置的丢弃门限值KZXIC_UINT8单位 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/07/29 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_td_th_get(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + ZXIC_UINT32 *p_td_th) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 cgavd_cfg_mode = 0; + ZXIC_UINT32 block_byte_th = 0; + ZXIC_UINT32 blk_size = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), level, QUEUE_LEVEL, SYS_LEVEL); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_td_th); + + *p_td_th = 0; + + if (QUEUE_LEVEL == level) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), id, 0, DPP_ETM_Q_NUM - 1); + } + + else if (PP_LEVEL == level) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), id, 0, DPP_TM_PP_NUM - 1); + } + + else + { + ZXIC_COMM_PRINT("sys:id is not to be checked!!\n"); + } + + rc = dpp_tm_cgavd_td_byte_block_th_get(dev, level, id, &block_byte_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_cgavd_td_byte_block_th_get"); + + rc = dpp_tm_cgavd_cfg_mode_get(dev, &cgavd_cfg_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_cgavd_cfg_mode_get"); + + if (cgavd_cfg_mode == DPP_TM_CGAVD_BLOCK_MODE) + { + rc = dpp_tm_cfgmt_blk_size_get(dev, &blk_size); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_cfgmt_blk_size_get"); + + *p_td_th = (block_byte_th * blk_size) / DPP_TM_CGAVD_KILO_UL; + } + else if (cgavd_cfg_mode == DPP_TM_CGAVD_ZXIC_UINT8_MODE) + { + *p_td_th = (block_byte_th / DPP_TM_CGAVD_KILO_UL); + } + else + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "dpp_tm_cgavd_td_th_get err!!\n"); + return DPP_ERR; + } + + return DPP_OK; + +} + +#if 0 +/***********************************************************/ +/** 配置指定端口或队列绑定的WRED GROUP ID +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level WRED支持层次号,0:队列级,1:端口级 +* @param id 队列号或端口号 +* @param wred_id 配置的WRED GROUP ID +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/17 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_wred_id_set(ZXIC_UINT32 dev_id, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + ZXIC_UINT32 wred_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 q_wred_grp_reg_index = 0; + ZXIC_UINT32 pp_wrd_grp_th_en_reg_index = 0; + + DPP_ETM_CGAVD_FLOW_WRED_GRP_T q_wred_group = {0}; + DPP_ETM_CGAVD_PP_WRED_GRP_TH_EN_T pp_wred_group = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, level, QUEUE_LEVEL, PP_LEVEL); + + q_wred_grp_reg_index = ETM_CGAVD_FLOW_WRED_GRPr; + pp_wrd_grp_th_en_reg_index = ETM_CGAVD_PP_WRED_GRP_TH_ENr; + + if (QUEUE_LEVEL == level) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, id, 0, DPP_ETM_Q_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, wred_id, 0, DPP_TM_Q_WRED_NUM - 1); + + q_wred_group.flow_wred_grp = wred_id; + rc = dpp_reg_write(dev_id, + q_wred_grp_reg_index, + 0, + id, + &q_wred_group); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + else + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, id, 0, DPP_TM_PP_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, wred_id, 0, DPP_TM_PP_WRED_NUM - 1); + + rc = dpp_reg_read(dev_id, + pp_wrd_grp_th_en_reg_index, + 0, + id, + &pp_wred_group); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + pp_wred_group.pp_wred_grp = wred_id; + rc = dpp_reg_write(dev_id, + pp_wrd_grp_th_en_reg_index, + 0, + id, + &pp_wred_group); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + return DPP_OK; + +} + + +/***********************************************************/ +/** 读取指定端口或队列绑定的WRED GROUP ID +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level WRED支持层次号,0:队列级,1:端口级 +* @param id 队列号或端口号 +* @param p_wred_id 配置的WRED GROUP ID +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/17 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_wred_id_get(ZXIC_UINT32 dev_id, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + ZXIC_UINT32 *p_wred_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 q_wred_grp_reg_index = 0; + ZXIC_UINT32 pp_wrd_grp_th_en_reg_index = 0; + + DPP_ETM_CGAVD_FLOW_WRED_GRP_T q_wred_group = {0}; + DPP_ETM_CGAVD_PP_WRED_GRP_TH_EN_T pp_wred_group = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, level, QUEUE_LEVEL, PP_LEVEL); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_wred_id); + + q_wred_grp_reg_index = ETM_CGAVD_FLOW_WRED_GRPr; + pp_wrd_grp_th_en_reg_index = ETM_CGAVD_PP_WRED_GRP_TH_ENr; + + if (QUEUE_LEVEL == level) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, id, 0, DPP_ETM_Q_NUM - 1); + rc = dpp_reg_read(dev_id, + q_wred_grp_reg_index, + 0, + id, + &q_wred_group); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + *p_wred_id = q_wred_group.flow_wred_grp; + } + + else + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, id, 0, DPP_TM_PP_NUM - 1); + rc = dpp_reg_read(dev_id, + pp_wrd_grp_th_en_reg_index, + 0, + id, + &pp_wred_group); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + *p_wred_id = pp_wred_group.pp_wred_grp; + } + + return DPP_OK; + +} + + +/***********************************************************/ +/** 配置WRED丢弃曲线对应的参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level WRED支持层次号,0:队列级,1:端口级 +* @param wred_id 队列级共支持16个WRED组0-15,端口级支持8组0-7 +* @param dp 共支持8个dp,取值0-7 +* @param p_para 配置的WRED组参数值,包含以下五个参数 + max_th 平均队列深度上限阈值ZXIC_UINT8/BLOCK单位 + min_th 平均队列深度下限阈值ZXIC_UINT8/BLOCK单位 + max_p 最大丢弃概率 + weight 平均队列深度计算权重 + q_len_th 队列深度阈值ZXIC_UINT8/BLOCK单位 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/08/01 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_wred_dp_line_block_byte_para_set(ZXIC_UINT32 dev_id, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 wred_id, + ZXIC_UINT32 dp, + DPP_TM_WRED_DP_LINE_PARA_T *p_para) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 index = 0; + ZXIC_UINT32 q_wred_max_th_reg_index = 0; + ZXIC_UINT32 q_wred_min_th_reg_index = 0; + ZXIC_UINT32 q_wred_cfg_para_reg_index = 0; + ZXIC_UINT32 q_wq_reg_index = 0; + ZXIC_UINT32 q_wred_len_th_reg_index = 0; + + ZXIC_UINT32 pp_wred_max_th_reg_index = 0; + ZXIC_UINT32 pp_wred_min_th_reg_index = 0; + ZXIC_UINT32 pp_wred_cfg_para_reg_index = 0; + ZXIC_UINT32 pp_wq_reg_index = 0; + ZXIC_UINT32 pp_wred_len_th_reg_index = 0; + + DPP_ETM_CGAVD_FLOW_WRED_MAX_TH_T q_max_th = {0}; + DPP_ETM_CGAVD_FLOW_WRED_MIN_TH_T q_min_th = {0}; + DPP_ETM_CGAVD_FLOW_WRED_CFG_PARA_T q_cfg_para = {0}; + DPP_ETM_CGAVD_FLOW_WQ_T q_wq = {0}; + DPP_ETM_CGAVD_FLOW_WRED_Q_LEN_TH_T q_len_th = {0}; + DPP_ETM_CGAVD_PP_WRED_MAX_TH_T pp_max_th = {0}; + DPP_ETM_CGAVD_PP_WRED_MIN_TH_T pp_min_th = {0}; + DPP_ETM_CGAVD_PP_CFG_PARA_T pp_cfg_para = {0}; + DPP_ETM_CGAVD_PP_WQ_T pp_wq = {0}; + DPP_ETM_CGAVD_PP_WRED_Q_LEN_TH_T pp_len_th = {0}; + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, level, QUEUE_LEVEL, PP_LEVEL); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dp, 0, DPP_TM_DP_NUM - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_para); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, p_para->max_p, 1, DPP_TM_RED_P_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, p_para->weight, 0, DPP_TM_CGAVD_WEIGHT_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, p_para->max_th, 0, 0x1fffffff); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, p_para->min_th, 0, 0x1fffffff); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, p_para->q_len_th, 0, 0x1fffffff); + + q_wred_max_th_reg_index = ETM_CGAVD_FLOW_WRED_MAX_THr; + q_wred_min_th_reg_index = ETM_CGAVD_FLOW_WRED_MIN_THr; + q_wred_cfg_para_reg_index = ETM_CGAVD_FLOW_WRED_CFG_PARAr; + q_wq_reg_index = ETM_CGAVD_FLOW_WQr; + q_wred_len_th_reg_index = ETM_CGAVD_FLOW_WRED_Q_LEN_THr; + + pp_wred_max_th_reg_index = ETM_CGAVD_PP_WRED_MAX_THr; + pp_wred_min_th_reg_index = ETM_CGAVD_PP_WRED_MIN_THr; + pp_wred_cfg_para_reg_index = ETM_CGAVD_PP_CFG_PARAr; + pp_wq_reg_index = ETM_CGAVD_PP_WQr; + pp_wred_len_th_reg_index = ETM_CGAVD_PP_WRED_Q_LEN_THr; + + ZXIC_COMM_CHECK_INDEX_MUL_OVERFLOW(wred_id, DPP_TM_DP_NUM); + index = wred_id * DPP_TM_DP_NUM + dp; + + if (QUEUE_LEVEL == level) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, wred_id, 0, DPP_TM_Q_WRED_NUM - 1); + + /* q_max_th */ + q_max_th.flow_wred_max_th = p_para->max_th; + rc = dpp_reg_write(dev_id, + q_wred_max_th_reg_index, + 0, + index, + &q_max_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + /* q_min_th */ + q_min_th.flow_wred_min_th = p_para->min_th; + rc = dpp_reg_write(dev_id, + q_wred_min_th_reg_index, + 0, + index, + &q_min_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + /* q_cfg_para,乘以100用来换算百分比,用户配置的是值是1-100 */ + if (p_para->max_p != 0) + { + ZXIC_COMM_CHECK_DEV_INDEX_SUB_OVERFLOW_NO_ASSERT(dev_id, q_max_th.flow_wred_max_th+1 , q_min_th.flow_wred_min_th); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, 100 , (q_max_th.flow_wred_max_th - q_min_th.flow_wred_min_th)); + q_cfg_para.flow_wred_cfg_para = (ZXIC_UINT32)(100 * (q_max_th.flow_wred_max_th - q_min_th.flow_wred_min_th) / p_para->max_p); + } + else + { + q_cfg_para.flow_wred_cfg_para = DPP_TM_Q_WRED_MAX_CFG_PARA; + } + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, q_cfg_para.flow_wred_cfg_para, 0, 0xffffffff); + + rc = dpp_reg_write(dev_id, + q_wred_cfg_para_reg_index, + 0, + index, + &q_cfg_para); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + /* 必须先写q_wq */ + q_wq.wq_flow = p_para->weight; + rc = dpp_reg_write(dev_id, + q_wq_reg_index, + 0, + wred_id, + &q_wq); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + /* 再写q_len_th */ + q_len_th.flow_wred_q_len_th = p_para->q_len_th; + rc = dpp_reg_write(dev_id, + q_wred_len_th_reg_index, + 0, + wred_id, + &q_len_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + else + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, wred_id, 0, DPP_TM_PP_WRED_NUM - 1); + + /* pp_max_th */ + pp_max_th.pp_wred_max_th = p_para->max_th; + rc = dpp_reg_write(dev_id, + pp_wred_max_th_reg_index, + 0, + index, + &pp_max_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + /* pp_min_th */ + pp_min_th.pp_wred_min_th = p_para->min_th; + rc = dpp_reg_write(dev_id, + pp_wred_min_th_reg_index, + 0, + index, + &pp_min_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + /* pp_cfg_para,乘以100用来换算百分比,用户配置的是值是1-100 */ + if (p_para->max_p != 0) + { + ZXIC_COMM_CHECK_DEV_INDEX_SUB_OVERFLOW_NO_ASSERT(dev_id, pp_max_th.pp_wred_max_th+1 , pp_min_th.pp_wred_min_th); + pp_cfg_para.pp_cfg_para = (ZXIC_UINT32)(100 * (pp_max_th.pp_wred_max_th - pp_min_th.pp_wred_min_th) / p_para->max_p); + } + else + { + pp_cfg_para.pp_cfg_para = DPP_TM_PP_WRED_MAX_CFG_PARA; + } + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pp_cfg_para.pp_cfg_para, 0, 0xffffffff); + + rc = dpp_reg_write(dev_id, + pp_wred_cfg_para_reg_index, + 0, + index, + &pp_cfg_para); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + /* 必须先写pp_len_th */ + pp_len_th.pp_wred_q_len_th = p_para->q_len_th; + rc = dpp_reg_write(dev_id, + pp_wred_len_th_reg_index, + 0, + wred_id, + &pp_len_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + /* 再写pp_wq */ + pp_wq.wq_pp = p_para->weight; + rc = dpp_reg_write(dev_id, + pp_wq_reg_index, + 0, + wred_id, + &pp_wq); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + return DPP_OK; + +} + + +/***********************************************************/ +/** 配置WRED丢弃曲线对应的参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level WRED支持层次号,0:队列级,1:端口级 +* @param wred_id 队列级共支持16个WRED组0-15,端口级支持8组0-7 +* @param dp 共支持8个dp,取值0-7 +* @param p_para 配置的WRED组参数值,用户配置门限值单位为Kbyte,需要转化为Block或者ZXIC_UINT8单位写入寄存器 + 包含以下五个参数 + max_th 平均队列深度上限阈值 + min_th 平均队列深度下限阈值 + max_p 最大丢弃概率 + weight 平均队列深度计算权重 + q_len_th 队列深度阈值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/08/01 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_wred_dp_line_para_set(ZXIC_UINT32 dev_id, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 wred_id, + ZXIC_UINT32 dp, + DPP_TM_WRED_DP_LINE_PARA_T *p_para) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 cgavd_cfg_mode = 0; + ZXIC_UINT32 blk_size = 0; + DPP_TM_WRED_DP_LINE_PARA_T para = {0}; + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, level, QUEUE_LEVEL, PP_LEVEL); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dp, 0, DPP_TM_DP_NUM - 1); + + if (QUEUE_LEVEL == level) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, wred_id, 0, DPP_TM_Q_WRED_NUM - 1); + } + else + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, wred_id, 0, DPP_TM_PP_WRED_NUM - 1); + } + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_para); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, p_para->max_p, 1, DPP_TM_RED_P_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, p_para->weight, 0, DPP_TM_CGAVD_WEIGHT_MAX); + + p_para->max_th = p_para->max_th * DPP_TM_CGAVD_KILO_UL; + p_para->min_th = p_para->min_th * DPP_TM_CGAVD_KILO_UL; + + if ((p_para->q_len_th) * DPP_TM_CGAVD_KILO_UL > 0x1fffffff) + { + p_para->q_len_th = 0x1fffffff; + }else{ + p_para->q_len_th = (ZXIC_UINT32)(p_para->q_len_th) * DPP_TM_CGAVD_KILO_UL; + } + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, p_para->max_th, p_para->min_th, 0x1fffffff); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, p_para->min_th, 0, 0x1fffffff); + + para.max_p = p_para->max_p; + para.weight = p_para->weight; + + if (p_para->max_th == p_para->min_th) + { + para.weight = 0; + } + + rc = dpp_tm_cgavd_cfg_mode_get(dev_id, &cgavd_cfg_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_cfg_mode_get"); + + if (cgavd_cfg_mode == DPP_TM_CGAVD_BLOCK_MODE) + { + rc = dpp_tm_cfgmt_blk_size_get(dev_id, &blk_size); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_blk_size_get"); + + if (blk_size != 0) + { + para.max_th = ((p_para->max_th ) / blk_size); + para.max_th = ((p_para->max_th) % blk_size == 0) ? (para.max_th ) : ((para.max_th) + 1); + para.min_th = ((p_para->min_th ) / blk_size); + para.min_th = ((p_para->min_th) % blk_size == 0) ? (para.min_th ) : ((para.min_th) + 1); + para.q_len_th = ((p_para->q_len_th ) / blk_size); + para.q_len_th = ((p_para->q_len_th) % blk_size == 0) ? (para.q_len_th ) : ((para.q_len_th) + 1); + } + + } + else if (cgavd_cfg_mode == DPP_TM_CGAVD_ZXIC_UINT8_MODE) + { + para.max_th = p_para->max_th; + para.min_th = p_para->min_th; + para.q_len_th = p_para->q_len_th; + } + else + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "dpp_tm_cgavd_wred_dp_line_para_set err!!\n"); + return DPP_ERR; + } + + rc = dpp_tm_cgavd_wred_dp_line_block_byte_para_set(dev_id, level, wred_id, dp, ¶); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_wred_dp_line_block_byte_para_set"); + + return DPP_OK; + +} + + +/***********************************************************/ +/** 读取WRED丢弃曲线对应的参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level WRED支持层次号,0:队列级,1:端口级 +* @param wred_id 队列级共支持16个WRED组0-15,端口级支持8组0-7 +* @param dp 共支持8个dp,取值0-7 +* @param p_para 配置的WRED组参数值,包含以下五个参数 + max_th 平均队列深度上限阈值ZXIC_UINT8/BLOCK单位 + min_th 平均队列深度下限阈值ZXIC_UINT8/BLOCK单位 + max_p 最大丢弃概率 + weight 平均队列深度计算权重 + q_len_th 队列深度阈值ZXIC_UINT8/BLOCK单位 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/08/01 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_wred_dp_line_block_byte_para_get(ZXIC_UINT32 dev_id, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 wred_id, + ZXIC_UINT32 dp, + DPP_TM_WRED_DP_LINE_PARA_T *p_para) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 index = 0; + ZXIC_UINT32 q_wred_max_th_reg_index = 0; + ZXIC_UINT32 q_wred_min_th_reg_index = 0; + ZXIC_UINT32 q_wred_cfg_para_reg_index = 0; + ZXIC_UINT32 q_wq_reg_index = 0; + ZXIC_UINT32 q_wred_len_th_reg_index = 0; + + ZXIC_UINT32 pp_wred_max_th_reg_index = 0; + ZXIC_UINT32 pp_wred_min_th_reg_index = 0; + ZXIC_UINT32 pp_wred_cfg_para_reg_index = 0; + ZXIC_UINT32 pp_wq_reg_index = 0; + ZXIC_UINT32 pp_wred_len_th_reg_index = 0; + + DPP_ETM_CGAVD_FLOW_WRED_MAX_TH_T q_max_th = {0}; + DPP_ETM_CGAVD_FLOW_WRED_MIN_TH_T q_min_th = {0}; + DPP_ETM_CGAVD_FLOW_WRED_CFG_PARA_T q_cfg_para = {0}; + DPP_ETM_CGAVD_FLOW_WQ_T q_wq = {0}; + DPP_ETM_CGAVD_FLOW_WRED_Q_LEN_TH_T q_len_th = {0}; + DPP_ETM_CGAVD_PP_WRED_MAX_TH_T pp_max_th = {0}; + DPP_ETM_CGAVD_PP_WRED_MIN_TH_T pp_min_th = {0}; + DPP_ETM_CGAVD_PP_CFG_PARA_T pp_cfg_para = {0}; + DPP_ETM_CGAVD_PP_WQ_T pp_wq = {0}; + DPP_ETM_CGAVD_PP_WRED_Q_LEN_TH_T pp_len_th = {0}; + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, level, QUEUE_LEVEL, PP_LEVEL); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dp, 0, DPP_TM_DP_NUM - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_para); + + q_wred_max_th_reg_index = ETM_CGAVD_FLOW_WRED_MAX_THr; + q_wred_min_th_reg_index = ETM_CGAVD_FLOW_WRED_MIN_THr; + q_wred_cfg_para_reg_index = ETM_CGAVD_FLOW_WRED_CFG_PARAr; + q_wq_reg_index = ETM_CGAVD_FLOW_WQr; + q_wred_len_th_reg_index = ETM_CGAVD_FLOW_WRED_Q_LEN_THr; + + pp_wred_max_th_reg_index = ETM_CGAVD_PP_WRED_MAX_THr; + pp_wred_min_th_reg_index = ETM_CGAVD_PP_WRED_MIN_THr; + pp_wred_cfg_para_reg_index = ETM_CGAVD_PP_CFG_PARAr; + pp_wq_reg_index = ETM_CGAVD_PP_WQr; + pp_wred_len_th_reg_index = ETM_CGAVD_PP_WRED_Q_LEN_THr; + + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, wred_id , DPP_TM_DP_NUM); + index = wred_id * DPP_TM_DP_NUM + dp; + + if (QUEUE_LEVEL == level) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, wred_id, 0, DPP_TM_Q_WRED_NUM - 1); + + /* q_max_th */ + rc = dpp_reg_read(dev_id, + q_wred_max_th_reg_index, + 0, + index, + &q_max_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + /* q_min_th */ + rc = dpp_reg_read(dev_id, + q_wred_min_th_reg_index, + 0, + index, + &q_min_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + /* q_cfg_para */ + rc = dpp_reg_read(dev_id, + q_wred_cfg_para_reg_index, + 0, + index, + &q_cfg_para); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + /* q_wq */ + rc = dpp_reg_read(dev_id, + q_wq_reg_index, + 0, + wred_id, + &q_wq); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + /* q_len_th */ + rc = dpp_reg_read(dev_id, + q_wred_len_th_reg_index, + 0, + wred_id, + &q_len_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + p_para->max_th = q_max_th.flow_wred_max_th; + p_para->min_th = q_min_th.flow_wred_min_th; + + if (q_cfg_para.flow_wred_cfg_para != 0) + { + p_para->max_p = (ZXIC_UINT32)(100 * (q_max_th.flow_wred_max_th - q_min_th.flow_wred_min_th) / q_cfg_para.flow_wred_cfg_para); + } + else + { + p_para->max_p = 0; + } + + p_para->q_len_th = q_len_th.flow_wred_q_len_th; + p_para->weight = q_wq.wq_flow; + } + + else + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, wred_id, 0, DPP_TM_PP_WRED_NUM - 1); + + /* pp_max_th */ + rc = dpp_reg_read(dev_id, + pp_wred_max_th_reg_index, + 0, + index, + &pp_max_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + /* pp_min_th */ + rc = dpp_reg_read(dev_id, + pp_wred_min_th_reg_index, + 0, + index, + &pp_min_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + /* pp_cfg_para */ + rc = dpp_reg_read(dev_id, + pp_wred_cfg_para_reg_index, + 0, + index, + &pp_cfg_para); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + /* pp_wq */ + rc = dpp_reg_read(dev_id, + pp_wq_reg_index, + 0, + wred_id, + &pp_wq); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + /* q_len_th */ + rc = dpp_reg_read(dev_id, + pp_wred_len_th_reg_index, + 0, + wred_id, + &pp_len_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + p_para->max_th = pp_max_th.pp_wred_max_th; + p_para->min_th = pp_min_th.pp_wred_min_th; + + if (pp_cfg_para.pp_cfg_para != 0) + { + p_para->max_p = (ZXIC_UINT32)(100 * (pp_max_th.pp_wred_max_th - pp_min_th.pp_wred_min_th) / pp_cfg_para.pp_cfg_para); + } + else + { + p_para->max_p = 0; + } + + p_para->q_len_th = pp_len_th.pp_wred_q_len_th; + p_para->weight = pp_wq.wq_pp; + } + + return DPP_OK; + +} + +/***********************************************************/ +/** 读取WRED丢弃曲线对应的参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level WRED支持层次号,0:队列级,1:端口级 +* @param wred_id 队列级共支持16个WRED组0-15,端口级支持8组0-7 +* @param dp 共支持8个dp,取值0-7 +* @param p_para 配置的WRED组参数值,包含以下五个参数 + max_th 平均队列深度上限阈值 + min_th 平均队列深度下限阈值 + max_p 最大丢弃概率 + weight 平均队列深度计算权重 + q_len_th 队列深度阈值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/08/01 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_wred_dp_line_para_get(ZXIC_UINT32 dev_id, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 wred_id, + ZXIC_UINT32 dp, + DPP_TM_WRED_DP_LINE_PARA_T *p_para) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 blk_size = 0; + ZXIC_UINT32 cgavd_cfg_mode = 0; + DPP_TM_WRED_DP_LINE_PARA_T para = {0}; + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, level, QUEUE_LEVEL, PP_LEVEL); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dp, 0, DPP_TM_DP_NUM - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_para); + + if (QUEUE_LEVEL == level) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, wred_id, 0, DPP_TM_Q_WRED_NUM - 1); + } + + else + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, wred_id, 0, DPP_TM_PP_WRED_NUM - 1); + } + + rc = dpp_tm_cgavd_wred_dp_line_block_byte_para_get(dev_id, level, wred_id, dp, ¶); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_wred_dp_line_block_byte_para_set"); + + p_para->max_p = para.max_p; + p_para->weight = para.weight; + + rc = dpp_tm_cgavd_cfg_mode_get(dev_id, &cgavd_cfg_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_cfg_mode_get"); + + if (cgavd_cfg_mode == DPP_TM_CGAVD_BLOCK_MODE) + { + rc = dpp_tm_cfgmt_blk_size_get(dev_id, &blk_size); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_blk_size_get"); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, blk_size, 256, 1024); + + p_para->max_th = (para.max_th * blk_size) / DPP_TM_CGAVD_KILO_UL; + p_para->min_th = (para.min_th * blk_size) / DPP_TM_CGAVD_KILO_UL; + p_para->q_len_th = (para.q_len_th * blk_size) / DPP_TM_CGAVD_KILO_UL; + + } + else if (cgavd_cfg_mode == DPP_TM_CGAVD_ZXIC_UINT8_MODE) + { + p_para->max_th = (para.max_th / DPP_TM_CGAVD_KILO_UL); + p_para->min_th = (para.min_th / DPP_TM_CGAVD_KILO_UL); + p_para->q_len_th = (para.q_len_th / DPP_TM_CGAVD_KILO_UL); + + } + else + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "dpp_tm_cgavd_wred_dp_line_para_get err!!\n"); + return DPP_ERR; + } + + return DPP_OK; + +} + + +/***********************************************************/ +/** 配置系统级GRED丢弃曲线对应的参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param dp 共支持8个dp,取值0-7 +* @param p_para 配置的GRED丢弃曲线参数值,包含以下六个参数 + max_th 平均队列深度上限阈值ZXIC_UINT8/BLOCK单位 + mid_th 平均队列深度中间阈值ZXIC_UINT8/BLOCK单位 + min_th 平均队列深度下限阈值ZXIC_UINT8/BLOCK单位 + max_p 最大丢弃概率[1-99] + weight 平均队列深度计算权重 + q_len_th 队列深度阈值ZXIC_UINT8/BLOCK单位 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/08/02 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_gred_dp_line_block_byte_para_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 dp, + DPP_TM_GRED_DP_LINE_PARA_T *p_para) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 gred_max_th_reg_index = 0; + ZXIC_UINT32 gred_mid_th_reg_index = 0; + ZXIC_UINT32 gred_min_th_reg_index = 0; + ZXIC_UINT32 gred_cfg_para0_reg_index = 0; + ZXIC_UINT32 gred_cfg_para1_reg_index = 0; + ZXIC_UINT32 gred_cfg_para2_reg_index = 0; + ZXIC_UINT32 gred_sys_wfq_reg_index = 0; + ZXIC_UINT32 gred_sys_cfg_q_grp_para_reg_index = 0; + + DPP_ETM_CGAVD_GRED_MAX_TH_T max_th = {0}; + DPP_ETM_CGAVD_GRED_MID_TH_T mid_th = {0}; + DPP_ETM_CGAVD_GRED_MIN_TH_T min_th = {0}; + DPP_ETM_CGAVD_GRED_CFG_PARA0_T cfg_para0 = {0}; + DPP_ETM_CGAVD_GRED_CFG_PARA1_T cfg_para1 = {0}; + DPP_ETM_CGAVD_GRED_CFG_PARA2_T cfg_para2 = {0}; + DPP_ETM_CGAVD_SYS_WQ_T sys_wq = {0}; + DPP_ETM_CGAVD_SYS_CFG_Q_GRP_PARA_T sys_len_th = {0}; + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dp, 0, DPP_TM_DP_NUM - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_para); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, p_para->max_p, 1, DPP_TM_RED_P_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, p_para->weight, 0, DPP_TM_CGAVD_WEIGHT_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, p_para->max_th, 0, 0x1fffffff); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, p_para->mid_th, 0, 0x1fffffff); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, p_para->min_th, 0, 0x1fffffff); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, p_para->q_len_th, 0, 0x1fffffff); + + gred_max_th_reg_index = ETM_CGAVD_GRED_MAX_THr; + gred_mid_th_reg_index = ETM_CGAVD_GRED_MID_THr; + gred_min_th_reg_index = ETM_CGAVD_GRED_MIN_THr; + gred_cfg_para0_reg_index = ETM_CGAVD_GRED_CFG_PARA0r; + gred_cfg_para1_reg_index = ETM_CGAVD_GRED_CFG_PARA1r; + gred_cfg_para2_reg_index = ETM_CGAVD_GRED_CFG_PARA2r; + gred_sys_wfq_reg_index = ETM_CGAVD_SYS_WQr; + gred_sys_cfg_q_grp_para_reg_index = ETM_CGAVD_SYS_CFG_Q_GRP_PARAr; + + /* max_th */ + max_th.gred_max_th = p_para->max_th; + rc = dpp_reg_write(dev_id, + gred_max_th_reg_index, + 0, + dp, + &max_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + /* mid_th */ + mid_th.gred_mid_th = p_para->mid_th; + rc = dpp_reg_write(dev_id, + gred_mid_th_reg_index, + 0, + dp, + &mid_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + /* min_th */ + min_th.gred_min_th = p_para->min_th; + rc = dpp_reg_write(dev_id, + gred_min_th_reg_index, + 0, + dp, + &min_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + /* cfg_para0,乘以100用来换算百分比,用户配置的是值是1-100 */ + ZXIC_COMM_CHECK_DEV_INDEX_SUB_OVERFLOW_NO_ASSERT(dev_id, mid_th.gred_mid_th+1 , min_th.gred_min_th); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, 100 , (mid_th.gred_mid_th - min_th.gred_min_th)); + cfg_para0.gred_cfg_para0 = (ZXIC_UINT32)(100 * (mid_th.gred_mid_th - min_th.gred_min_th) / p_para->max_p); + + rc = dpp_reg_write(dev_id, + gred_cfg_para0_reg_index, + 0, + dp, + &cfg_para0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + /* cfg_para1 */ + ZXIC_COMM_CHECK_DEV_INDEX_SUB_OVERFLOW_NO_ASSERT(dev_id, max_th.gred_max_th+1 , mid_th.gred_mid_th); + cfg_para1.gred_cfg_para1 = (ZXIC_UINT32)(100 * (max_th.gred_max_th - mid_th.gred_mid_th) / (100 - p_para->max_p)); + + rc = dpp_reg_write(dev_id, + gred_cfg_para1_reg_index, + 0, + dp, + &cfg_para1); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + + /* cfg_para2 */ + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, p_para->max_p , cfg_para1.gred_cfg_para1); + cfg_para2.gred_cfg_para2 = (ZXIC_UINT32)(p_para->max_p * cfg_para1.gred_cfg_para1 / 100); + + rc = dpp_reg_write(dev_id, + gred_cfg_para2_reg_index, + 0, + dp, + &cfg_para2); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + /* 必须先写sys_len_th */ + sys_len_th.gred_q_len_th_sys = p_para->q_len_th; + rc = dpp_reg_write(dev_id, + gred_sys_cfg_q_grp_para_reg_index, + 0, + 0, + &sys_len_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + /* 再写sys_wq */ + sys_wq.wq_sys = p_para->weight; + rc = dpp_reg_write(dev_id, + gred_sys_wfq_reg_index, + 0, + 0, + &sys_wq); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 配置系统级GRED丢弃曲线对应的参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param dp 共支持8个dp,取值0-7 +* @param p_para 配置的GRED丢弃曲线参数值,用户配置门限值单位为Kbyte,需要转化为Block或者ZXIC_UINT8单位写入寄存器 + 包含以下六个参数 + max_th 平均队列深度上限阈值 + mid_th 平均队列深度中间阈值 + min_th 平均队列深度下限阈值 + max_p 最大丢弃概率 + weight 平均队列深度计算权重 + q_len_th 队列深度阈值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/08/02 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_gred_dp_line_para_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 dp, + DPP_TM_GRED_DP_LINE_PARA_T *p_para) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 cgavd_cfg_mode = 0; + ZXIC_UINT32 blk_size = 0; + DPP_TM_GRED_DP_LINE_PARA_T para = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dp, 0, DPP_TM_DP_NUM - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_para); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, p_para->max_p, 1, DPP_TM_RED_P_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, p_para->weight, 0, DPP_TM_CGAVD_WEIGHT_MAX); + + p_para->max_th = p_para->max_th * DPP_TM_CGAVD_KILO_UL; + p_para->mid_th = p_para->mid_th * DPP_TM_CGAVD_KILO_UL; + p_para->min_th = p_para->min_th * DPP_TM_CGAVD_KILO_UL; + if ((p_para->q_len_th) * DPP_TM_CGAVD_KILO_UL > 0x1fffffff) + { + p_para->q_len_th = 0x1fffffff; + }else{ + p_para->q_len_th = (p_para->q_len_th) * DPP_TM_CGAVD_KILO_UL; + } + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, p_para->max_th, 0, 0x1fffffff); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, p_para->mid_th, 0, 0x1fffffff); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, p_para->min_th, 0, 0x1fffffff); + + para.max_p = p_para->max_p; + para.weight = p_para->weight; + + rc = dpp_tm_cgavd_cfg_mode_get(dev_id, &cgavd_cfg_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_cfg_mode_get"); + + if (cgavd_cfg_mode == DPP_TM_CGAVD_BLOCK_MODE) + { + rc = dpp_tm_cfgmt_blk_size_get(dev_id, &blk_size); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_blk_size_get"); + + if (blk_size != 0) + { + para.max_th = ((p_para->max_th ) / blk_size); + para.max_th = ((p_para->max_th) % blk_size == 0) ? (para.max_th ) : ((para.max_th) + 1); + para.mid_th = ((p_para->mid_th ) / blk_size); + para.mid_th = ((p_para->mid_th) % blk_size == 0) ? (para.mid_th ) : ((para.mid_th) + 1); + para.min_th = ((p_para->min_th ) / blk_size); + para.min_th = ((p_para->min_th) % blk_size == 0) ? (para.min_th ) : ((para.min_th) + 1); + para.q_len_th = ((p_para->q_len_th ) / blk_size); + para.q_len_th = ((p_para->q_len_th) % blk_size == 0) ? (para.q_len_th ) : ((para.q_len_th) + 1); + } + + } + else if (cgavd_cfg_mode == DPP_TM_CGAVD_ZXIC_UINT8_MODE) + { + para.max_th = p_para->max_th; + para.mid_th = p_para->mid_th; + para.min_th = p_para->min_th; + para.q_len_th = p_para->q_len_th; + } + else + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "dpp_tm_cgavd_gred_dp_line_para_set err!!\n"); + return DPP_ERR; + } + + rc = dpp_tm_cgavd_gred_dp_line_block_byte_para_set(dev_id, dp, ¶); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_gred_dp_line_block_byte_para_set"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置系统级阶梯TD 丢弃曲线对应的参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param dp 共支持8个dp,取值0-7 +* @param td_th TD 门限 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/08/02 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_ladtd_dp_line_para_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 dp, + ZXIC_UINT32 td_th) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 gred_max_th_reg_index = 0; + ZXIC_UINT32 gred_mid_th_reg_index = 0; + ZXIC_UINT32 gred_min_th_reg_index = 0; + ZXIC_UINT32 gred_cfg_para0_reg_index = 0; + ZXIC_UINT32 gred_cfg_para1_reg_index = 0; + ZXIC_UINT32 gred_cfg_para2_reg_index = 0; + ZXIC_UINT32 cgavd_cfg_mode = 0; + ZXIC_UINT32 blk_size = 0; + + DPP_ETM_CGAVD_GRED_MAX_TH_T max_th = {0}; + DPP_ETM_CGAVD_GRED_MID_TH_T mid_th = {0}; + DPP_ETM_CGAVD_GRED_MIN_TH_T min_th = {0}; + DPP_ETM_CGAVD_GRED_CFG_PARA0_T cfg_para0 = {0}; + DPP_ETM_CGAVD_GRED_CFG_PARA1_T cfg_para1 = {0}; + DPP_ETM_CGAVD_GRED_CFG_PARA2_T cfg_para2 = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dp, 0, DPP_TM_DP_NUM - 1); + + td_th = td_th * DPP_TM_CGAVD_KILO_UL; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, td_th, 0, 0x1fffffff); + + rc = dpp_tm_cgavd_cfg_mode_get(dev_id, &cgavd_cfg_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_cfg_mode_get"); + + if (cgavd_cfg_mode == DPP_TM_CGAVD_BLOCK_MODE) + { + rc = dpp_tm_cfgmt_blk_size_get(dev_id, &blk_size); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_blk_size_get"); + + if (blk_size != 0) + { + max_th.gred_max_th = (( td_th ) / blk_size); + max_th.gred_max_th = ((td_th) % blk_size == 0) ? ( max_th.gred_max_th ) : (( max_th.gred_max_th) + 1); + mid_th.gred_mid_th = (( td_th ) / blk_size); + mid_th.gred_mid_th = ((td_th) % blk_size == 0) ? ( mid_th.gred_mid_th ) : (( mid_th.gred_mid_th) + 1); + min_th.gred_min_th = (( td_th ) / blk_size); + min_th.gred_min_th = ((td_th) % blk_size == 0) ? ( min_th.gred_min_th ) : (( min_th.gred_min_th) + 1); + + } + + } + else if (cgavd_cfg_mode == DPP_TM_CGAVD_ZXIC_UINT8_MODE) + { + max_th.gred_max_th = td_th; + mid_th.gred_mid_th = td_th; + min_th.gred_min_th = td_th; + } + else + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "dpp_tm_cgavd_gred_dp_line_para_get err!!\n"); + return DPP_ERR; + } + + gred_max_th_reg_index = ETM_CGAVD_GRED_MAX_THr; + gred_mid_th_reg_index = ETM_CGAVD_GRED_MID_THr; + gred_min_th_reg_index = ETM_CGAVD_GRED_MIN_THr; + gred_cfg_para0_reg_index = ETM_CGAVD_GRED_CFG_PARA0r; + gred_cfg_para1_reg_index = ETM_CGAVD_GRED_CFG_PARA1r; + gred_cfg_para2_reg_index = ETM_CGAVD_GRED_CFG_PARA2r; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, td_th, 0, 0x1fffffff); + + + /* max_th */ + rc = dpp_reg_write(dev_id, + gred_max_th_reg_index, + 0, + dp, + &max_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + /* mid_th */ + rc = dpp_reg_write(dev_id, + gred_mid_th_reg_index, + 0, + dp, + &mid_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + /* min_th */ + rc = dpp_reg_write(dev_id, + gred_min_th_reg_index, + 0, + dp, + &min_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + /* cfg_para0,0 */ + cfg_para0.gred_cfg_para0 = 0; + + rc = dpp_reg_write(dev_id, + gred_cfg_para0_reg_index, + 0, + dp, + &cfg_para0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + /* cfg_para1 */ + cfg_para1.gred_cfg_para1 = 0; + + rc = dpp_reg_write(dev_id, + gred_cfg_para1_reg_index, + 0, + dp, + &cfg_para1); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + + /* cfg_para2 */ + cfg_para2.gred_cfg_para2 = 0; + + rc = dpp_reg_write(dev_id, + gred_cfg_para2_reg_index, + 0, + dp, + &cfg_para2); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + + return DPP_OK; +} + + +/***********************************************************/ +/** 读取系统级GRED丢弃曲线对应的参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param dp 共支持8个dp,取值0-7 +* @param p_para 配置的GRED丢弃曲线参数值,包含以下六个参数 + max_th 平均队列深度上限阈值ZXIC_UINT8/BLOCK单位 + mid_th 平均队列深度中间阈值ZXIC_UINT8/BLOCK单位 + min_th 平均队列深度下限阈值ZXIC_UINT8/BLOCK单位 + max_p 最大丢弃概率 + weight 平均队列深度计算权重 + q_len_th 队列深度阈值ZXIC_UINT8/BLOCK单位 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/08/02 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_gred_dp_line_block_byte_para_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 dp, + DPP_TM_GRED_DP_LINE_PARA_T *p_para) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 gred_max_th_reg_index = 0; + ZXIC_UINT32 gred_mid_th_reg_index = 0; + ZXIC_UINT32 gred_min_th_reg_index = 0; + ZXIC_UINT32 gred_cfg_para0_reg_index = 0; + ZXIC_UINT32 gred_cfg_para1_reg_index = 0; + ZXIC_UINT32 gred_cfg_para2_reg_index = 0; + ZXIC_UINT32 gred_sys_wfq_reg_index = 0; + ZXIC_UINT32 gred_sys_cfg_q_grp_para_reg_index = 0; + + DPP_ETM_CGAVD_GRED_MAX_TH_T max_th = {0}; + DPP_ETM_CGAVD_GRED_MID_TH_T mid_th = {0}; + DPP_ETM_CGAVD_GRED_MIN_TH_T min_th = {0}; + DPP_ETM_CGAVD_GRED_CFG_PARA0_T cfg_para0 = {0}; + DPP_ETM_CGAVD_GRED_CFG_PARA1_T cfg_para1 = {0}; + DPP_ETM_CGAVD_GRED_CFG_PARA2_T cfg_para2 = {0}; + DPP_ETM_CGAVD_SYS_WQ_T sys_wq = {0}; + DPP_ETM_CGAVD_SYS_CFG_Q_GRP_PARA_T sys_len_th = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dp, 0, DPP_TM_DP_NUM - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_para); + + gred_max_th_reg_index = ETM_CGAVD_GRED_MAX_THr; + gred_mid_th_reg_index = ETM_CGAVD_GRED_MID_THr; + gred_min_th_reg_index = ETM_CGAVD_GRED_MIN_THr; + gred_cfg_para0_reg_index = ETM_CGAVD_GRED_CFG_PARA0r; + gred_cfg_para1_reg_index = ETM_CGAVD_GRED_CFG_PARA1r; + gred_cfg_para2_reg_index = ETM_CGAVD_GRED_CFG_PARA2r; + gred_sys_wfq_reg_index = ETM_CGAVD_SYS_WQr; + gred_sys_cfg_q_grp_para_reg_index = ETM_CGAVD_SYS_CFG_Q_GRP_PARAr; + + /* max_th */ + rc = dpp_reg_read(dev_id, + gred_max_th_reg_index, + 0, + dp, + &max_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + /* mid_th */ + rc = dpp_reg_read(dev_id, + gred_mid_th_reg_index, + 0, + dp, + &mid_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + /* min_th */ + rc = dpp_reg_read(dev_id, + gred_min_th_reg_index, + 0, + dp, + &min_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + /* cfg_para0 */ + rc = dpp_reg_read(dev_id, + gred_cfg_para0_reg_index, + 0, + dp, + &cfg_para0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + /* cfg_para1 */ + rc = dpp_reg_read(dev_id, + gred_cfg_para1_reg_index, + 0, + dp, + &cfg_para1); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + + /* cfg_para2 */ + rc = dpp_reg_read(dev_id, + gred_cfg_para2_reg_index, + 0, + dp, + &cfg_para2); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + /* sys_len_th */ + rc = dpp_reg_read(dev_id, + gred_sys_cfg_q_grp_para_reg_index, + 0, + 0, + &sys_len_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + /* sys_wq */ + rc = dpp_reg_read(dev_id, + gred_sys_wfq_reg_index, + 0, + 0, + &sys_wq); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + p_para->max_th = max_th.gred_max_th; + p_para->mid_th = mid_th.gred_mid_th; + p_para->min_th = min_th.gred_min_th; + + if (cfg_para0.gred_cfg_para0) + { + p_para->max_p = (ZXIC_UINT32)(100 * (mid_th.gred_mid_th - min_th.gred_min_th) / cfg_para0.gred_cfg_para0); + } + + p_para->weight = sys_wq.wq_sys; + p_para->q_len_th = sys_len_th.gred_q_len_th_sys; + + return DPP_OK; + +} + + +/***********************************************************/ +/** 读取系统级GRED丢弃曲线对应的参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param dp 共支持8个dp,取值0-7 +* @param p_para 配置的GRED丢弃曲线参数值,包含以下六个参数 + max_th 平均队列深度上限阈值 + mid_th 平均队列深度中间阈值 + min_th 平均队列深度下限阈值 + max_p 最大丢弃概率 + weight 平均队列深度计算权重 + q_len_th 队列深度阈值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author taq @date 2015/04/20 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_gred_dp_line_para_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 dp, + DPP_TM_GRED_DP_LINE_PARA_T *p_para) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 cgavd_cfg_mode = 0; + ZXIC_UINT32 blk_size = 0; + DPP_TM_GRED_DP_LINE_PARA_T para = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dp, 0, DPP_TM_DP_NUM - 1); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_para); + + + rc = dpp_tm_cgavd_gred_dp_line_block_byte_para_get(dev_id, dp, ¶); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_gred_dp_line_block_byte_para_get"); + + p_para->max_p = para.max_p; + p_para->weight = para.weight; + + rc = dpp_tm_cgavd_cfg_mode_get(dev_id, &cgavd_cfg_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_cfg_mode_get"); + + if (cgavd_cfg_mode == DPP_TM_CGAVD_BLOCK_MODE) + { + rc = dpp_tm_cfgmt_blk_size_get(dev_id, &blk_size); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_blk_size_get"); + + p_para->max_th = (para.max_th * blk_size) / DPP_TM_CGAVD_KILO_UL; + p_para->mid_th = (para.mid_th * blk_size) / DPP_TM_CGAVD_KILO_UL; + p_para->min_th = (para.min_th * blk_size) / DPP_TM_CGAVD_KILO_UL; + p_para->q_len_th = (para.q_len_th * blk_size) / DPP_TM_CGAVD_KILO_UL; + + } + else if (cgavd_cfg_mode == DPP_TM_CGAVD_ZXIC_UINT8_MODE) + { + p_para->max_th = (para.max_th / DPP_TM_CGAVD_KILO_UL); + p_para->mid_th = (para.mid_th / DPP_TM_CGAVD_KILO_UL); + p_para->min_th = (para.min_th / DPP_TM_CGAVD_KILO_UL); + p_para->q_len_th = (para.q_len_th / DPP_TM_CGAVD_KILO_UL); + + } + else + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "dpp_tm_cgavd_gred_dp_line_para_get err!!\n"); + return DPP_ERR; + } + + return DPP_OK; + +} + +#endif +/***********************************************************/ +/** 配置指定端口或队列是否支持动态门限机制 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level WRED支持层次号,0:队列级,1:端口级 +* @param id 队列号或端口号 +* @param en 配置的值,0-不支持动态门限机制,1-支持动态门限机制 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/17 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_dyn_th_en_set(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + ZXIC_UINT32 en) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 q_dyn_th_en_reg_index = 0; + ZXIC_UINT32 pp_wrd_grp_th_en_reg_index = 0; + + DPP_ETM_CGAVD_FLOW_DYNAMIC_TH_EN_T q_dyn_th_en = {0}; + DPP_ETM_CGAVD_PP_WRED_GRP_TH_EN_T pp_dyn_th_en = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), level, QUEUE_LEVEL, PP_LEVEL); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), en, 0, 1); + + q_dyn_th_en_reg_index = ETM_CGAVD_FLOW_DYNAMIC_TH_ENr; + pp_wrd_grp_th_en_reg_index = ETM_CGAVD_PP_WRED_GRP_TH_ENr; + + if (QUEUE_LEVEL == level) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), id, 0, DPP_ETM_Q_NUM - 1); + + q_dyn_th_en.flow_dynamic_th_en = en; + rc = dpp_reg_write(dev, + q_dyn_th_en_reg_index, + 0, + id, + &q_dyn_th_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + } + + else + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), id, 0, DPP_TM_PP_NUM - 1); + + rc = dpp_reg_read(dev, + pp_wrd_grp_th_en_reg_index, + 0, + id, + &pp_dyn_th_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + pp_dyn_th_en.pp_wred_grp_th_en = en; + rc = dpp_reg_write(dev, + pp_wrd_grp_th_en_reg_index, + 0, + id, + &pp_dyn_th_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + } + + return DPP_OK; + +} + + +/***********************************************************/ +/** 读取指定端口或队列是否支持动态门限机制 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level WRED支持层次号,0:队列级,1:端口级 +* @param id 队列号或端口号 +* @param p_en 读取的值,0-不支持动态门限机制,1-支持动态门限机制 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/17 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_dyn_th_en_get(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + ZXIC_UINT32 *p_en) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 q_dyn_th_en_reg_index = 0; + ZXIC_UINT32 pp_wrd_grp_th_en_reg_index = 0; + + DPP_ETM_CGAVD_FLOW_DYNAMIC_TH_EN_T q_dyn_th_en = {0}; + DPP_ETM_CGAVD_PP_WRED_GRP_TH_EN_T pp_dyn_th_en = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), level, QUEUE_LEVEL, PP_LEVEL); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_en); + + q_dyn_th_en_reg_index = ETM_CGAVD_FLOW_DYNAMIC_TH_ENr; + pp_wrd_grp_th_en_reg_index = ETM_CGAVD_PP_WRED_GRP_TH_ENr; + + if (QUEUE_LEVEL == level) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), id, 0, DPP_ETM_Q_NUM - 1); + + rc = dpp_reg_read(dev, + q_dyn_th_en_reg_index, + 0, + id, + &q_dyn_th_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_en = q_dyn_th_en.flow_dynamic_th_en; + + } + + else + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), id, 0, DPP_TM_PP_NUM - 1); + + rc = dpp_reg_read(dev, + pp_wrd_grp_th_en_reg_index, + 0, + id, + &pp_dyn_th_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_en = pp_dyn_th_en.pp_wred_grp_th_en; + } + + return DPP_OK; + +} + + +/***********************************************************/ +/** 配置等价包长使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param en 使能标记,0-不使能,1-使能 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/28 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_equal_pkt_len_en_set(DPP_DEV_T *dev, ZXIC_UINT32 en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_EQUAL_PKT_LEN_EN_T equal_pkt_len_en = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), en, 0, 1); + + equal_pkt_len_en.equal_pkt_len_en = en; + rc = dpp_reg_write(dev, + ETM_CGAVD_EQUAL_PKT_LEN_ENr, + 0, + 0, + &equal_pkt_len_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读取等价包长使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_en 使能标记,0-不使能,1-使能 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/28 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_equal_pkt_len_en_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_EQUAL_PKT_LEN_EN_T equal_pkt_len_en = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_en); + + *p_en = 0xffffffff; + rc = dpp_reg_read(dev, + ETM_CGAVD_EQUAL_PKT_LEN_ENr, + 0, + 0, + &equal_pkt_len_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + *p_en = equal_pkt_len_en.equal_pkt_len_en; + + return DPP_OK; +} + +/***********************************************************/ +/** 配置等价包长 +* @param dev_id +* @param tm_type 0-ETM,1-FTM +* @param p_equal_pkt_len 等价包长 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/28 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_equal_pkt_len_para_set(DPP_DEV_T *dev, + DPP_ETM_EQUAL_PKT_LEN_PARA_T *p_equal_pkt_len) +{ + /* 返回值变量定义 */ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 i = 0; + + /* 结构体变量定义 */ + DPP_ETM_CGAVD_EQUAL_PKT_LEN0_T equal_pkt_len0 = {0}; + + /* 入参检查 */ + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_equal_pkt_len); + + for (i = 0; i < 8; i++) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), p_equal_pkt_len->equal_pkt_len[i], 0x0, 0x7fff); + equal_pkt_len0.equal_pkt_len0 = p_equal_pkt_len->equal_pkt_len[i]; + rc = dpp_reg_write(dev, + ETM_CGAVD_EQUAL_PKT_LEN0r + i, + 0, + 0, + &equal_pkt_len0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + } + + return DPP_OK; +} + + + +/***********************************************************/ +/** 读取等价包长 +* @param dev_id +* @param tm_type 0-ETM,1-FTM +* @param p_equal_pkt_len 等价包长 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/28 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_equal_pkt_len_para_get(DPP_DEV_T *dev, + DPP_ETM_EQUAL_PKT_LEN_PARA_T *p_equal_pkt_len) +{ + /* 返回值变量定义 */ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 i = 0; + + /* 结构体变量定义 */ + DPP_ETM_CGAVD_EQUAL_PKT_LEN0_T equal_pkt_len0 = {0}; + + /* 入参检查 */ + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_equal_pkt_len); + + for (i = 0; i < 8; i++) + { + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(ETM_CGAVD_EQUAL_PKT_LEN0r, i); + rc = dpp_reg_read(dev, + ETM_CGAVD_EQUAL_PKT_LEN0r + i, + 0, + 0, + &equal_pkt_len0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + p_equal_pkt_len->equal_pkt_len[i] = equal_pkt_len0.equal_pkt_len0; + } + + return DPP_OK; +} + +/***********************************************************/ +/** 配置等价包长阈值 +* @param dev_id +* @param tm_type 0-ETM,1-FTM +* @param p_equal_pkt_len_th 等价包长阈值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/28 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_equal_pkt_len_th_para_set(DPP_DEV_T *dev, + DPP_ETM_EQUAL_PKT_LEN_TH_PARA_T *p_equal_pkt_len_th) +{ + /* 返回值变量定义 */ + DPP_STATUS rc = 0; + ZXIC_UINT32 i = 0; + + /* 结构体变量定义 */ + DPP_ETM_CGAVD_EQUAL_PKT_LEN_TH0_T equal_pkt_len_th0 = {0}; + + /* 入参检查 */ + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_equal_pkt_len_th); + + for (i = 0; i < 7; i++) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), p_equal_pkt_len_th->equal_pkt_len_th[i], 0x0, 0x7fff); + + if (i <= 5 ) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), p_equal_pkt_len_th->equal_pkt_len_th[i + 1], p_equal_pkt_len_th->equal_pkt_len_th[i], 0x7fff); + } + + equal_pkt_len_th0.equal_pkt_len_th0 = p_equal_pkt_len_th->equal_pkt_len_th[i]; + rc = dpp_reg_write(dev, + ETM_CGAVD_EQUAL_PKT_LEN_TH0r + i, + 0, + 0, + &equal_pkt_len_th0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + } + + return DPP_OK; +} + + +/***********************************************************/ +/** 读取等价包长阈值 +* @param dev_id +* @param tm_type 0-ETM,1-FTM +* @param p_equal_pkt_len_th 等价包长阈值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/28 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_equal_pkt_len_th_para_get(DPP_DEV_T *dev, + DPP_ETM_EQUAL_PKT_LEN_TH_PARA_T *p_equal_pkt_len_th) +{ + /* 返回值变量定义 */ + DPP_STATUS rc = 0; + ZXIC_UINT32 i = 0; + + /* 结构体变量定义 */ + DPP_ETM_CGAVD_EQUAL_PKT_LEN_TH0_T equal_pkt_len_th0 = {0}; + + /* 入参检查 */ + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_equal_pkt_len_th); + + for (i = 0; i < 7; i++) + { + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(DEV_ID(dev), i, ETM_CGAVD_EQUAL_PKT_LEN_TH0r); + rc = dpp_reg_read(dev, + ETM_CGAVD_EQUAL_PKT_LEN_TH0r + i, + 0, + 0, + &equal_pkt_len_th0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + p_equal_pkt_len_th->equal_pkt_len_th[i] = equal_pkt_len_th0.equal_pkt_len_th0; + } + + return DPP_OK; +} + +/***********************************************************/ +/** 动态门限放大因子参数配置 +* @param dev_id +* @param tm_type 0-ETM,1-FTM +* @param p_amplify_gene_para 动态门限放大因子参数 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/28 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_amplify_gene_para_set(DPP_DEV_T *dev, + DPP_ETM_AMPLIFY_GENE_PARA_T *p_amplify_gene_para) +{ + /* 返回值变量定义 */ + DPP_STATUS rc = 0; + ZXIC_UINT32 i = 0; + + /* 结构体变量定义 */ + DPP_ETM_CGAVD_AMPLIFY_GENE0_T amplify_gene0 = {0}; + + /* 入参检查 */ + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_amplify_gene_para); + + for (i = 0; i < 16; i++) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), p_amplify_gene_para->amplify_gene[i], 0x0, 0xfff); + amplify_gene0.amplify_gene0 = p_amplify_gene_para->amplify_gene[i]; + rc = dpp_reg_write(dev, + ETM_CGAVD_AMPLIFY_GENE0r + i, + 0, + 0, + &lify_gene0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + } + + return DPP_OK; +} + +/***********************************************************/ +/** 动态门限放大因子参数获取 +* @param dev_id +* @param tm_type 0-ETM,1-FTM +* @param p_amplify_gene_para 动态门限放大因子参数 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/28 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_amplify_gene_para_get(DPP_DEV_T *dev, + DPP_ETM_AMPLIFY_GENE_PARA_T *p_amplify_gene_para) +{ + /* 返回值变量定义 */ + DPP_STATUS rc = 0; + ZXIC_UINT32 i = 0; + + /* 结构体变量定义 */ + DPP_ETM_CGAVD_AMPLIFY_GENE0_T amplify_gene0 = {0}; + + /* 入参检查 */ + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_amplify_gene_para); + + for (i = 0; i < 16; i++) + { + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(ETM_CGAVD_AMPLIFY_GENE0r, i); + rc = dpp_reg_read(dev, + ETM_CGAVD_AMPLIFY_GENE0r + i, + 0, + 0, + &lify_gene0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + p_amplify_gene_para->amplify_gene[i] = amplify_gene0.amplify_gene0; + } + + return DPP_OK; +} + +#if 0 +/***********************************************************/ +/** 配置默认队列使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param en 配置的值,0-不使能默认队列,1-使能默认队列, +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2016/08/16 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_default_queue_en_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_DEFAULT_QUEUE_EN_T default_que_en = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, en, 0, 1); + + default_que_en.default_queue_en = en; + rc = dpp_reg_write(dev_id, + ETM_CGAVD_DEFAULT_QUEUE_ENr, + 0, + 0, + &default_que_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读取默认队列使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_en 读取的值,0-不使能默认队列,1-使能默认队列, +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2016/08/16 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_default_queue_en_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_DEFAULT_QUEUE_EN_T default_que_en = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_en); + + rc = dpp_reg_read(dev_id, + ETM_CGAVD_DEFAULT_QUEUE_ENr, + 0, + 0, + &default_que_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + *p_en = default_que_en.default_queue_en; + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置默认队列起始末尾 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param def_start_que 起始默认队列block/byte单位 +* @param def_finish_que 结束默认队列block/byte单位 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2016/08/16 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_default_queue_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 def_start_queue, ZXIC_UINT32 def_finish_queue) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_DEFAULT_START_QUEUE_T def_start_que = {0}; + DPP_ETM_CGAVD_DEFAULT_FINISH_QUEUE_T def_finish_que = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, def_start_queue, 0, 0x1fffffff); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, def_finish_queue, 0, 0x1fffffff); + + def_start_que.default_start_queue = def_start_queue; + def_finish_que.default_finish_queue = def_finish_queue; + + + rc = dpp_reg_write(dev_id, + ETM_CGAVD_DEFAULT_START_QUEUEr, + 0, + 0, + &def_start_que); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + rc = dpp_reg_write(dev_id, + ETM_CGAVD_DEFAULT_FINISH_QUEUEr, + 0, + 0, + &def_finish_que); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 读取默认队列起始末尾值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_def_start_que 默认队列起始值block/byte单位 +* @param p_def_finish_que 默认队列结束值block/byte单位 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2016/08/16 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_default_queue_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_def_start_queue, ZXIC_UINT32 *p_def_finish_queue) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_DEFAULT_START_QUEUE_T def_start_que = {0}; + DPP_ETM_CGAVD_DEFAULT_FINISH_QUEUE_T def_finish_que = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_def_finish_queue); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_def_start_queue); + + rc = dpp_reg_read(dev_id, + ETM_CGAVD_DEFAULT_START_QUEUEr, + 0, + 0, + &def_start_que); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_CGAVD_DEFAULT_FINISH_QUEUEr, + 0, + 0, + &def_finish_que); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + *p_def_start_queue = def_start_que.default_start_queue; + *p_def_finish_queue = def_finish_que.default_finish_queue; + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置协议队列使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param en 配置的值,0-不使能默认队列,1-使能默认队列, +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2016/08/16 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_protocol_queue_en_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_PROTOCOL_QUEUE_EN_T protocol_que_en = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, en, 0, 1); + + protocol_que_en.protocol_queue_en = en; + rc = dpp_reg_write(dev_id, + ETM_CGAVD_PROTOCOL_QUEUE_ENr, + 0, + 0, + &protocol_que_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读取协议队列使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_en 读取的值,0-不使能通用门限,1-使能通用门限, +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2016/08/16 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_protocol_queue_en_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_PROTOCOL_QUEUE_EN_T protocol_que_en = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_en); + + rc = dpp_reg_read(dev_id, + ETM_CGAVD_PROTOCOL_QUEUE_ENr, + 0, + 0, + &protocol_que_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + *p_en = protocol_que_en.protocol_queue_en; + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置协议队列起始末尾 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param protocol_start_que 起始协议队列block/byte单位 +*@param protocol_-finish_que 末尾协议队列block/byte单位 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2016/08/16 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_protocol_queue_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 protocol_start_que, ZXIC_UINT32 protocol_finish_que) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_PROTOCOL_START_QUEUE_T pro_start_que = {0}; + DPP_ETM_CGAVD_PROTOCOL_FINISH_QUEUE_T pro_finish_que = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, protocol_start_que, 0, 0x1fffffff); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, protocol_finish_que, 0, 0x1fffffff); + + pro_start_que.protocol_start_queue = protocol_start_que; + pro_finish_que.protocol_finish_queue = protocol_finish_que; + + + rc = dpp_reg_write(dev_id, + ETM_CGAVD_PROTOCOL_START_QUEUEr, + 0, + 0, + &pro_start_que); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + rc = dpp_reg_write(dev_id, + ETM_CGAVD_PROTOCOL_FINISH_QUEUEr, + 0, + 0, + &pro_finish_que); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 读取协议队列起始末尾值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_protocol_start_que 协议认队列起始值block/byte单位 +* @param p_protocol_finish_que 协议认队列末尾值block/byte单位 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2016/08/16 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_protocol_queue_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_protocol_start_que, ZXIC_UINT32 *p_protocol_finish_que) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_PROTOCOL_START_QUEUE_T pro_start_que = {0}; + DPP_ETM_CGAVD_PROTOCOL_FINISH_QUEUE_T pro_finish_que = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_protocol_finish_que); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_protocol_start_que); + + rc = dpp_reg_read(dev_id, + ETM_CGAVD_PROTOCOL_START_QUEUEr, + 0, + 0, + &pro_start_que); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_CGAVD_PROTOCOL_FINISH_QUEUEr, + 0, + 0, + &pro_finish_que); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + *p_protocol_start_que = pro_start_que.protocol_start_queue; + *p_protocol_finish_que = pro_finish_que.protocol_finish_queue; + + return DPP_OK; +} + +#endif +/***********************************************************/ +/** 配置通用门限使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param en 配置的值,0-不使能通用门限,1-使能通用门限, +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/17 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_uniform_th_en_set(DPP_DEV_T *dev, ZXIC_UINT32 en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_UNIFORM_TD_TH_EN_T uniform_en = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), en, 0, 1); + + uniform_en.uniform_td_th_en = en; + rc = dpp_reg_write(dev, + ETM_CGAVD_UNIFORM_TD_TH_ENr, + 0, + 0, + &uniform_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读取通用门限使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_en 读取的值,0-不使能通用门限,1-使能通用门限, +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/17 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_uniform_th_en_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_UNIFORM_TD_TH_EN_T uniform_en = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_en); + + rc = dpp_reg_read(dev, + ETM_CGAVD_UNIFORM_TD_TH_ENr, + 0, + 0, + &uniform_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_en = uniform_en.uniform_td_th_en; + + return DPP_OK; +} + +/***********************************************************/ +/** 配置通用门限 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param byte_block_uni_th 通用门限值block/byte单位 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/08/01 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_uniform_byte_block_th_set(DPP_DEV_T *dev, ZXIC_UINT32 byte_block_uni_th) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_UNIFORM_TD_TH_T uniform_block_th = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), byte_block_uni_th, 0, 0x1fffffff); + + uniform_block_th.uniform_td_th = byte_block_uni_th; + rc = dpp_reg_write(dev, + ETM_CGAVD_UNIFORM_TD_THr, + 0, + 0, + &uniform_block_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置通用门限 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param th 通用门限值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2014/02/17 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_uniform_th_set(DPP_DEV_T *dev, ZXIC_UINT32 uni_th) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 blk_size = 0; + ZXIC_UINT32 blk_th = 0; + ZXIC_UINT32 cgavd_cfg_mode = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW(DEV_ID(dev), uni_th, DPP_TM_CGAVD_KILO_UL); + if ((uni_th * DPP_TM_CGAVD_KILO_UL) > 0x1fffffff) + { + uni_th = 0x1fffffff; + } + else + { + uni_th = (uni_th * DPP_TM_CGAVD_KILO_UL); + } + + rc = dpp_tm_cgavd_cfg_mode_get(dev, &cgavd_cfg_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_cgavd_cfg_mode_get"); + + if (cgavd_cfg_mode == DPP_TM_CGAVD_BLOCK_MODE) + { + rc = dpp_tm_cfgmt_blk_size_get(dev, &blk_size); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_cfgmt_blk_size_get"); + + if (blk_size != 0) + { + blk_th = (uni_th / blk_size); + blk_th = (uni_th % blk_size == 0) ? (blk_th ) : ((blk_th) + 1); + } + + rc = dpp_tm_cgavd_uniform_byte_block_th_set(dev, blk_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_cgavd_uniform_byte_block_th_set"); + } + else if (cgavd_cfg_mode == DPP_TM_CGAVD_ZXIC_UINT8_MODE) + { + rc = dpp_tm_cgavd_uniform_byte_block_th_set(dev, uni_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_cgavd_uniform_byte_block_th_set"); + } + else + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "dpp_tm_cgavd_uniform_th_set err!!\n"); + return DPP_ERR; + } + + return DPP_OK; +} + + +/***********************************************************/ +/** 读取通用门限 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_byte_block_uni_th 通用门限值block/byte单位 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/08/01 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_uniform_byte_block_th_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_byte_block_uni_th) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_UNIFORM_TD_TH_T uniform_block_th = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_byte_block_uni_th); + + rc = dpp_reg_read(dev, + ETM_CGAVD_UNIFORM_TD_THr, + 0, + 0, + &uniform_block_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_byte_block_uni_th = uniform_block_th.uniform_td_th; + + return DPP_OK; +} + +/***********************************************************/ +/** 读取通用门限 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_uni_th 通用门限值kbyte单位 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/08/01 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_uniform_th_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_uni_th) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 blk_size = 0; + ZXIC_UINT32 cgavd_cfg_mode = 0; + ZXIC_UINT32 block_byte_th = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_uni_th); + + + rc = dpp_tm_cgavd_uniform_byte_block_th_get(dev, &block_byte_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_cgavd_uniform_byte_block_th_get"); + + rc = dpp_tm_cgavd_cfg_mode_get(dev, &cgavd_cfg_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_cgavd_cfg_mode_get"); + + if (cgavd_cfg_mode == DPP_TM_CGAVD_BLOCK_MODE) + { + rc = dpp_tm_cfgmt_blk_size_get(dev, &blk_size); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_cfgmt_blk_size_get"); + + *p_uni_th = (block_byte_th * blk_size) / DPP_TM_CGAVD_KILO_UL; + + } + else if (cgavd_cfg_mode == DPP_TM_CGAVD_ZXIC_UINT8_MODE) + { + *p_uni_th = (block_byte_th / DPP_TM_CGAVD_KILO_UL); + } + else + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "dpp_tm_cgavd_uniform_th_get err!!\n"); + return DPP_ERR; + } + + return DPP_OK; +} + +/***********************************************************/ +/** 配置流队列所属优先级 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param q_id 队列号 +* @param pri 配置的优先级,0~4 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/17 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_q_pri_set(DPP_DEV_T *dev, + ZXIC_UINT32 q_id, + ZXIC_UINT32 pri) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_Q_PRI_T q_pri = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), pri, 0, 4); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), q_id, 0, DPP_ETM_Q_NUM - 1); + + q_pri.qpri_flow_cfg_din = pri; + rc = dpp_reg_write(dev, + ETM_CGAVD_Q_PRIr, + 0, + q_id, + &q_pri); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置TM模式下流队列挂接的端口号;SA模式下流队列映射的目的芯片ID +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param q_id 队列号 +* @param pp_id 配置的端口号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/18 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_q_map_pp_set(DPP_DEV_T *dev, + ZXIC_UINT32 q_id, + ZXIC_UINT32 pp_id) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_PP_NUM_T pp_num = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), q_id, 0, DPP_ETM_Q_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), pp_id, 0, DPP_TM_PP_NUM - 1); + + pp_num.pp_num = pp_id; + rc = dpp_reg_write(dev, + ETM_CGAVD_PP_NUMr, + 0, + q_id, + &pp_num); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读取TM模式下流队列挂接的端口号;SA模式下流队列映射的目的芯片ID +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param q_id 队列号 +* @param p_pp_id 读取的端口号 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/18 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_q_map_pp_get(DPP_DEV_T *dev, + ZXIC_UINT32 q_id, + ZXIC_UINT32 *p_pp_id) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_PP_NUM_T pp_num = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_pp_id); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), q_id, 0, DPP_ETM_Q_NUM - 1); + + *p_pp_id = 0xffffffff; + rc = dpp_reg_read(dev, + ETM_CGAVD_PP_NUMr, + 0, + q_id, + &pp_num); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_pp_id = pp_num.pp_num; + + return DPP_OK; +} + +/***********************************************************/ +/** 配置TM模式tc到flow的映射 +* @param dev_id 设备编号 +* @param tc_id itmd tc优先级(0~7) +* @param flow_id 映射的flowid号 (0~4095) +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author sun @date 2023/07/04 +************************************************************/ +DPP_STATUS dpp_tm_tc_map_flow_set(DPP_DEV_T *dev, + ZXIC_UINT32 tc_id, + ZXIC_UINT32 flow_id) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_CFG_TC_FLOWID_DAT_T cfg_tc_flow = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), tc_id, 0, DPP_TM_TC_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), flow_id, 0, DPP_ETM_Q_NUM - 1); + + cfg_tc_flow.cfg_tc_flowid_dat = flow_id; + rc = dpp_reg_write(dev, + ETM_CGAVD_CFG_TC_FLOWID_DATr, + 0, + tc_id, + &cfg_tc_flow); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读取配置TM模式tc到flow的映射 +* @param dev_id 设备编号 +* @param tc_id itmd tc优先级(0~7) +* @param flow_id 读取映射的flowid号 (0~4095) +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author sun @date 2023/07/04 +************************************************************/ +DPP_STATUS dpp_tm_tc_map_flow_get(DPP_DEV_T *dev, + ZXIC_UINT32 tc_id, + ZXIC_UINT32 *flow_id) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_CFG_TC_FLOWID_DAT_T cfg_tc_flow = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), flow_id); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), tc_id, 0, DPP_TM_TC_NUM - 1); + + *flow_id = 0xffffffff; + rc = dpp_reg_read(dev, + ETM_CGAVD_CFG_TC_FLOWID_DATr, + 0, + tc_id, + &cfg_tc_flow); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *flow_id = cfg_tc_flow.cfg_tc_flowid_dat; + + return DPP_OK; +} + +#if 0 +/***********************************************************/ +/** 系统级缓存使用上下限阈值配置 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param th_h: 系统级缓存使用上限阈值 +* @param th_l: 系统级缓存使用下限阈值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/07/03 +************************************************************/ +DPP_STATUS dpp_tm_sys_window_th_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 th_h, + ZXIC_UINT32 th_l) +{ + DPP_STATUS rc = DPP_OK; + + DPP_ETM_CGAVD_SYS_WINDOW_TH_H_T sys_window_th_h = {0}; + DPP_ETM_CGAVD_SYS_WINDOW_TH_L_T sys_window_th_l = {0}; + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, th_h, 0, 0x1fffffff); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, th_l, 0, 0x1fffffff); + + if (th_l > th_h) + { + ZXIC_COMM_PRINT("input error th_l > th_h"); + return DPP_ERR; + } + + sys_window_th_h.sys_window_th_h = th_h; + sys_window_th_l.sys_window_th_l = th_l; + + rc = dpp_reg_write(dev_id, + ETM_CGAVD_SYS_WINDOW_TH_Hr, + 0, + 0, + &sys_window_th_h); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_CGAVD_SYS_WINDOW_TH_Lr, + 0, + 0, + &sys_window_th_l); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +#endif +/***********************************************************/ +/** 配置QMU查询队列Qos开关 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param q_id: 队列号 +* @param qos_sign: qos开关 0:关闭 1:开启 +* @param +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/07/03 +************************************************************/ +DPP_STATUS dpp_tm_qmu_qos_sign_set(DPP_DEV_T *dev, + ZXIC_UINT32 q_id, + ZXIC_UINT32 qos_sign) +{ + DPP_STATUS rc = DPP_OK; + + DPP_ETM_CGAVD_QOS_SIGN_T qmu_qos_sign = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), qos_sign, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), q_id, 0, DPP_ETM_Q_NUM - 1); + + qmu_qos_sign.qos_sign_flow_cfg_din = qos_sign; + + rc = dpp_reg_write(dev, + ETM_CGAVD_QOS_SIGNr, + 0, + q_id, + &qmu_qos_sign); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + +#if 0 +/***********************************************************/ +/** 配置cgavd强制反压 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param cgavd_fc: 0:不强制反压 1:强制反压 +* @param +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/07/03 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_cfg_fc_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 cgavd_fc) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_CGAVD_CFG_FC_T cgavd_cfg_fc_t = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, cgavd_fc, 0, 1); + + cgavd_cfg_fc_t.cgavd_cfg_fc = cgavd_fc; + + rc = dpp_reg_write(dev_id, + ETM_CGAVD_CGAVD_CFG_FCr, + 0, + 0, + &cgavd_cfg_fc_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 获取cgavd强制反压状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param cgavd_fc: 0:不强制反压 1:强制反压 +* @param +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/07/03 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_cfg_fc_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *cgavd_fc) + +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_CGAVD_CFG_FC_T cgavd_cfg_fc_t = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, cgavd_fc); + + rc = dpp_reg_read(dev_id, + ETM_CGAVD_CGAVD_CFG_FCr, + 0, + 0, + &cgavd_cfg_fc_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + *cgavd_fc = cgavd_cfg_fc_t.cgavd_cfg_fc; + + return DPP_OK; +} + +/***********************************************************/ +/** 配置cgavd强制不反压 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param cgavd_no_fc: 0:不强制 1:强制不反压 +* @param +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/07/03 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_cfg_no_fc_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 cgavd_no_fc) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_CGAVD_CFG_NO_FC_T cgavd_cfg_no_fc_t = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, cgavd_no_fc, 0, 1); + + cgavd_cfg_no_fc_t.cgavd_cfg_no_fc = cgavd_no_fc; + + rc = dpp_reg_write(dev_id, + ETM_CGAVD_CGAVD_CFG_NO_FCr, + 0, + 0, + &cgavd_cfg_no_fc_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 获取cgavd强制不反压状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param cgavd_no_fc: 0:不强制 1:强制不反压 +* @param +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/07/03 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_cfg_no_fc_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *cgavd_no_fc) + +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_CGAVD_CFG_NO_FC_T cgavd_cfg_no_fc_t = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, cgavd_no_fc); + + rc = dpp_reg_read(dev_id, + ETM_CGAVD_CGAVD_CFG_NO_FCr, + 0, + 0, + &cgavd_cfg_no_fc_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + *cgavd_no_fc = cgavd_cfg_no_fc_t.cgavd_cfg_no_fc; + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置cgavd平均队列深度归零 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param en: 0:关闭 1:使能 +* @param +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/08/05 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_avg_qlen_return_zero_en_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_AVG_QLEN_RETURN_ZERO_EN_T return_zero_en = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, en, 0, 1); + + return_zero_en.avg_qlen_return_zero_en = en; + + rc = dpp_reg_write(dev_id, + ETM_CGAVD_AVG_QLEN_RETURN_ZERO_ENr, + 0, + 0, + &return_zero_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +#endif +#endif + + +#if ZXIC_REAL("TM_QMU") +#if 0 +/***********************************************************/ +/** QMU MMU 配置清除 +* @param dev_id +* @param tm_type +* +* @return +* @remark 无 +* @see +* @author XXX @date 2020/04/13 +************************************************************/ +DPP_STATUS dpp_tm_qmu_mmu_cfg_clr(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CFGMT_CFGMT_DDR_ATTACH_T attach = {0}; + + ZXIC_UINT32 bdep[64] = {0}; + ZXIC_UINT32 bhead[64] = {0}; + ZXIC_UINT32 btail[64] = {0}; + ZXIC_UINT32 ddr_in_mmu[8] = {0}; + ZXIC_UINT32 ddr_in_qmu[10] = {0}; + ZXIC_UINT32 bank_to_mmu[64] = {0}; + ZXIC_UINT32 bank_to_qmu[80] = {0}; + ZXIC_UINT32 active[16] = {0}; + ZXIC_UINT32 random_grp[64] = {0}; + ZXIC_UINT32 random_ddr0[64] = {0}; + ZXIC_UINT32 random_ddr1[64] = {0}; + ZXIC_UINT32 random_ddr2[64] = {0}; + ZXIC_UINT32 random_ddr3[64] = {0}; + ZXIC_UINT32 random_ddr4[64] = {0}; + ZXIC_UINT32 random_ddr5[64] = {0}; + ZXIC_UINT32 random_ddr6[64] = {0}; + ZXIC_UINT32 random_ddr7[64] = {0}; + //ZXIC_UINT32 mmu_addr[128] = {0}; + + ZXIC_UINT32 i = 0; + + ZXIC_UINT32 reg_attach = 0; + ZXIC_UINT32 reg_ddr_in_mmu = 0; + ZXIC_UINT32 reg_ddr_in_qmu = 0; + ZXIC_UINT32 reg_bank_to_mmu = 0; + ZXIC_UINT32 reg_bank_to_qmu = 0; + ZXIC_UINT32 reg_bdep = 0; + ZXIC_UINT32 reg_bhead = 0; + ZXIC_UINT32 reg_btail = 0; + ZXIC_UINT32 reg_active = 0; + ZXIC_UINT32 reg_random_grp = 0; + ZXIC_UINT32 reg_random_ddr0 = 0; + ZXIC_UINT32 reg_random_ddr1 = 0; + ZXIC_UINT32 reg_random_ddr2 = 0; + ZXIC_UINT32 reg_random_ddr3 = 0; + ZXIC_UINT32 reg_random_ddr4 = 0; + ZXIC_UINT32 reg_random_ddr5 = 0; + ZXIC_UINT32 reg_random_ddr6 = 0; + ZXIC_UINT32 reg_random_ddr7 = 0; + //ZXIC_UINT32 reg_mmu_addr = 0; + + reg_attach = ETM_CFGMT_CFGMT_DDR_ATTACHr; + reg_ddr_in_mmu = ETM_QMU_CFGMT_DDR_IN_MMU_CFGr; + reg_ddr_in_qmu = ETM_QMU_CFGMT_DDR_IN_QMU_CFGr; + reg_bank_to_mmu = ETM_QMU_CFGMT_BANK_TO_MMU_CFGr; + reg_bank_to_qmu = ETM_QMU_CFGMT_BANK_TO_QMU_CFGr; + reg_bdep = ETM_QMU_QCFG_QLIST_BDEPr; + reg_bhead = ETM_QMU_QCFG_QLIST_BHEADr; + reg_btail = ETM_QMU_QCFG_QLIST_BTAILr; + reg_active = ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFGr; + reg_random_grp = ETM_QMU_QCFG_QLIST_GRPr; + reg_random_ddr0 = ETM_QMU_QCFG_QLIST_GRP0_BANKr; + reg_random_ddr1 = ETM_QMU_QCFG_QLIST_GRP1_BANKr; + reg_random_ddr2 = ETM_QMU_QCFG_QLIST_GRP2_BANKr; + reg_random_ddr3 = ETM_QMU_QCFG_QLIST_GRP3_BANKr; + reg_random_ddr4 = ETM_QMU_QCFG_QLIST_GRP4_BANKr; + reg_random_ddr5 = ETM_QMU_QCFG_QLIST_GRP5_BANKr; + reg_random_ddr6 = ETM_QMU_QCFG_QLIST_GRP6_BANKr; + reg_random_ddr7 = ETM_QMU_QCFG_QLIST_GRP7_BANKr; + + rc = dpp_reg_write(dev_id, reg_attach, 0, 0, &attach); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + for (i = 0; i < 8; i++) + { + rc = dpp_reg_write32_bymn(dev_id, reg_ddr_in_mmu, 0, i, ddr_in_mmu[i]); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write32_bymn"); + } + + for (i = 0; i < 10; i++) + { + rc = dpp_reg_write32_bymn(dev_id, reg_ddr_in_qmu, 0, i, ddr_in_qmu[i]); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write32_bymn"); + } + + for (i = 0; i < 64; i++) + { + rc = dpp_reg_write32_bymn(dev_id, reg_bank_to_mmu, 0, i, bank_to_mmu[i]); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write32_bymn"); + } + + for (i = 0; i < 80; i++) + { + rc = dpp_reg_write32_bymn(dev_id, reg_bank_to_qmu, 0, i, bank_to_qmu[i]); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write32_bymn"); + } + + for (i = 0; i < 64; i++) + { + rc = dpp_reg_write32_bymn(dev_id, reg_bhead, 0, i, bhead[i]); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write32_bymn"); + + rc = dpp_reg_write32_bymn(dev_id, reg_btail, 0, i, btail[i]); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write32_bymn"); + + rc = dpp_reg_write32_bymn(dev_id, reg_bdep, 0, i, bdep[i]); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write32_bymn"); + } + + for (i = 0; i < 16; i++) + { + rc = dpp_reg_write32_bymn(dev_id, reg_active, 0, i, active[i]); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write32_bymn"); + } + + for (i = 0; i < 64; i++) + { + rc = dpp_reg_write32_bymn(dev_id, reg_random_grp, 0, i, random_grp[i]); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write32_bymn"); + + rc = dpp_reg_write32_bymn(dev_id, reg_random_ddr0, 0, i, random_ddr0[i]); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write32_bymn"); + + rc = dpp_reg_write32_bymn(dev_id, reg_random_ddr1, 0, i, random_ddr1[i]); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write32_bymn"); + + rc = dpp_reg_write32_bymn(dev_id, reg_random_ddr2, 0, i, random_ddr2[i]); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write32_bymn"); + + rc = dpp_reg_write32_bymn(dev_id, reg_random_ddr3, 0, i, random_ddr3[i]); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write32_bymn"); + + rc = dpp_reg_write32_bymn(dev_id, reg_random_ddr4, 0, i, random_ddr4[i]); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write32_bymn"); + + rc = dpp_reg_write32_bymn(dev_id, reg_random_ddr5, 0, i, random_ddr5[i]); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write32_bymn"); + + rc = dpp_reg_write32_bymn(dev_id, reg_random_ddr6, 0, i, random_ddr6[i]); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write32_bymn"); + + rc = dpp_reg_write32_bymn(dev_id, reg_random_ddr7, 0, i, random_ddr7[i]); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write32_bymn"); + } + + /*for (i = 0; i < 128; i++) + { + rc = dpp_reg_write32_bymn(dev_id, reg_mmu_addr + i, 0, 0, mmu_addr[i]); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write32_bymn"); + }*/ + + return rc; +} + +/***********************************************************/ +/** 配置QMU队列授权价值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param credit_value 授权价值,默认值是533Byte +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_qmu_credit_value_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 credit_value) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_QSCH_CREDIT_VALUE_T credit_val = {0}; + + credit_val.qcfg_qsch_credit_value = credit_value; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QSCH_CREDIT_VALUEr, + 0, + 0, + &credit_val); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +#endif +/***********************************************************/ +/** 读取QMU队列授权价值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_credit_value 授权价值,默认值是533Byte +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/04/14 +************************************************************/ +DPP_STATUS dpp_tm_qmu_credit_value_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_credit_value) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_QSCH_CREDIT_VALUE_T credit_val = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_credit_value); + + *p_credit_value = 0; + + rc = dpp_reg_read(dev, + ETM_QMU_QCFG_QSCH_CREDIT_VALUEr, + 0, + 0, + &credit_val); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_credit_value = credit_val.qcfg_qsch_credit_value; + + return DPP_OK; +} + +#if 0 +/***********************************************************/ +/** 配置授权盈余初始化值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param crbal_initial_value 授权盈余初始化值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crbal_initial_value_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 crbal_initial_value) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_QSCH_CRBAL_INIT_VALUE_T crbal_init_val = {0}; + + crbal_init_val.qcfg_qsch_crbal_init_value = crbal_initial_value; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QSCH_CRBAL_INIT_VALUEr, + 0, + 0, + &crbal_init_val); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + + + +/***********************************************************/ +/** 配置CRS过滤使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param en 配置的值,0-不使能过滤,1-使能过滤 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crs_filter_en_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_QSCH_CRS_FILTER_T crs_filter_en = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, en, 0, 1); + + crs_filter_en.qcfg_qsch_crs_filter = en; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QSCH_CRS_FILTERr, + 0, + 0, + &crs_filter_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置CRS发送强制使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param en 配置的值,0-不使能,1-使能 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crs_force_en_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_QSCH_CRS_FORCE_EN_T crs_force_en = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, en, 0, 1); + + crs_force_en.qcfg_qsch_crs_force_en = en; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QSCH_CRS_FORCE_ENr, + 0, + 0, + &crs_force_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置CRS发送强制的队列 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param q_id 队列号 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crs_force_q_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 q_id) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_QSCH_CRS_FORCE_QNUM_T crs_force_q = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, q_id, 0, DPP_ETM_Q_NUM - 1); + + crs_force_q.qcfg_qsch_crs_force_qnum = q_id; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QSCH_CRS_FORCE_QNUMr, + 0, + 0, + &crs_force_q); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + + + +/***********************************************************/ +/** 配置CRS发送强置的状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param crs_state CRS发送强置的状态 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/18 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crs_force_state_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 crs_state) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_QSCH_CRS_FORCE_CRS_T crs_force_crs = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, crs_state, 0, 1); + + crs_force_crs.qcfg_qsch_crs_force_crs = crs_state; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QSCH_CRS_FORCE_CRSr, + 0, + 0, + &crs_force_crs); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置特定队列发送特定CRS +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param qnum 队列号 +* qcfg_qsch_crs_force_crs:CRS状态(0:off;1:normal。) + qcfg_qsch_crs_force_en:CRS发送强置使能(0:不使能;1:使能。) +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_qmu_qnum_crs_force(ZXIC_UINT32 dev_id, + ZXIC_UINT32 qnum, + ZXIC_UINT32 qcfg_qsch_crs_force_crs, + ZXIC_UINT32 qcfg_qsch_crs_force_en) + +{ + DPP_STATUS rc = DPP_OK; + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, qnum, 0, DPP_ETM_Q_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, qcfg_qsch_crs_force_en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, qcfg_qsch_crs_force_crs, 0, 1); + + + rc = dpp_tm_qmu_crs_force_q_set(dev_id, qnum); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_crs_force_q_set"); + + rc = dpp_tm_qmu_crs_force_state_set(dev_id, qcfg_qsch_crs_force_crs); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_crs_force_state_set"); + + rc = dpp_tm_qmu_crs_force_en_set(dev_id, qcfg_qsch_crs_force_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_crs_force_en_set"); + + return DPP_OK; + +} + +/***********************************************************/ +/** 配置QMU空闲链表:TM独享模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param ddr_num ddr组数,1-8组 +* @param bank_vld bank有效信号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/06/07 +************************************************************/ +DPP_STATUS dpp_tm_qmu_qlist_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 ddr_num, + ZXIC_UINT32 bank_num_para, + ZXIC_UINT32 bank_vld, + ZXIC_UINT32 gene_para) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 k = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + ZXIC_UINT32 reg_index = 0; + ZXIC_UINT32 bdep_reg_index = 0; + ZXIC_UINT32 bhead_reg_index = 0; + ZXIC_UINT32 btail_reg_index = 0; + ZXIC_UINT32 qmu_cfgmt_ddr_in_mmu_index = 0; + ZXIC_UINT32 qmu_cfgmt_ddr_in_qmu_index = 0; + ZXIC_UINT32 qmu_cfgmt_bank_to_mmu_index = 0; + ZXIC_UINT32 qmu_cfgmt_bank_to_qmu_index = 0; + ZXIC_UINT32 qmu_cfgmt_active_to_bank_index = 0; + ZXIC_UINT32 qmu_qcfg_qlist_grp0_bank_index = 0; + ZXIC_UINT32 qmu_qcfg_qlist_grp1_bank_index = 0; + ZXIC_UINT32 qlist_grp0_bank_data[8] = {1, 2, 3, 4, 5, 6, 7, 0}; + DPP_ETM_QMU_QCFG_QLIST_BDEP_T qlist_bdep = {0}; + DPP_ETM_QMU_QCFG_QLIST_BHEAD_T qlist_bhead = {0}; + DPP_ETM_QMU_QCFG_QLIST_BTAIL_T qlist_btail = {0}; + DPP_ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFG_T active_to_bank_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_MMU_CFG_T ddr_in_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_QMU_CFG_T ddr_in_qmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_MMU_CFG_T bank_to_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_QMU_CFG_T bank_to_qmu_cfg = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP0_BANK_T qlist_grp0_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP1_BANK_T qlist_grp1_bank = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, ddr_num, 1, 8); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, bank_num_para, 1, 8); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, bank_vld, 0, 1); + + bdep_reg_index = ETM_QMU_QCFG_QLIST_BDEPr; + bhead_reg_index = ETM_QMU_QCFG_QLIST_BHEADr; + btail_reg_index = ETM_QMU_QCFG_QLIST_BTAILr; + qmu_cfgmt_ddr_in_mmu_index = ETM_QMU_CFGMT_DDR_IN_MMU_CFGr; + qmu_cfgmt_ddr_in_qmu_index = ETM_QMU_CFGMT_DDR_IN_QMU_CFGr; + qmu_cfgmt_bank_to_mmu_index = ETM_QMU_CFGMT_BANK_TO_MMU_CFGr; + qmu_cfgmt_bank_to_qmu_index = ETM_QMU_CFGMT_BANK_TO_QMU_CFGr; + qmu_cfgmt_active_to_bank_index = ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFGr; + qmu_qcfg_qlist_grp0_bank_index = ETM_QMU_QCFG_QLIST_GRP0_BANKr; + qmu_qcfg_qlist_grp1_bank_index = ETM_QMU_QCFG_QLIST_GRP1_BANKr; + + /* cfgmt配置ddr_num组ddr */ + rc = dpp_tm_cfgmt_ddr_attach_set(dev_id, ddr_num); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_ddr_attach_set"); + + /* ddr组映射: qmu <--> mmu: ddr0~1 映射 0~1 */ + for (i = 0; i < ddr_num; i++) + { + /* qmu --> mmu */ + ddr_in_mmu_cfg.cfgmt_ddr_in_mmu_cfg = i; + rc = dpp_reg_write(dev_id, + qmu_cfgmt_ddr_in_mmu_index, + 0, + i, + &ddr_in_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + /* mmu --> qmu */ + ddr_in_qmu_cfg.cfgmt_ddr_in_qmu_cfg = i; + rc = dpp_reg_write(dev_id, + qmu_cfgmt_ddr_in_qmu_index, + 0, + i, + &ddr_in_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + + + /* qmu链表首尾指针及bank深度配置 */ + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "++++++dpp_tm_qmu_qlist_set starting++++++\n"); + + for (i = 0; i < ddr_num; i++) + { + for (j = 0; j < bank_num_para; j++) + { + reg_index = (i * 8 + j); + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "++++++ reg_index=%d ++++++\n", reg_index); + + qlist_bdep.qcfg_qlist_bdep = gene_para; + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "++++++ qlist_bdep.qcfg_qlist_bdep=0x%x ++++++\n", qlist_bdep.qcfg_qlist_bdep); + rc = dpp_reg_write(dev_id, + bdep_reg_index, + 0, + reg_index, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + qlist_bhead.bank_vld = bank_vld; + qlist_bhead.qcfg_qlist_bhead = (gene_para * (i * bank_num_para + j)); + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "++++++ qlist_bhead.bank_vld=0x%x ++++++\n", qlist_bhead.bank_vld); + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "++++++ qlist_bhead.qcfg_qlist_bhead=0x%x ++++++\n", qlist_bhead.qcfg_qlist_bhead); + rc = dpp_reg_write(dev_id, + bhead_reg_index, + 0, + reg_index, + &qlist_bhead); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, gene_para , ((i * bank_num_para + j) + 1) ); + ZXIC_COMM_CHECK_DEV_INDEX_SUB_OVERFLOW_NO_ASSERT(dev_id, (gene_para * ((i * bank_num_para + j) + 1)) , 1 ); + qlist_btail.qcfg_qlist_btail = ((gene_para * ((i * bank_num_para + j) + 1)) - 1); + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "++++++ qlist_btail.qcfg_qlist_btail=0x%x ++++++\n", qlist_btail.qcfg_qlist_btail); + rc = dpp_reg_write(dev_id, + btail_reg_index, + 0, + reg_index, + &qlist_btail); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "++++++ j=%d ++++++\n", j); + + if (j != 8 ) + { + for (k = bank_num_para; k < 8; k++) + { + reg_index = (i * 8 + k); + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "++++++ reg_index=%d ++++++\n", reg_index); + qlist_bhead.bank_vld = 0; + qlist_bhead.qcfg_qlist_bhead = 0; + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "++++++ qlist_bhead.bank_vld=0x%x ++++++\n", qlist_bhead.bank_vld); + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "++++++ qlist_bhead.qcfg_qlist_bhead=0x%x ++++++\n", qlist_bhead.qcfg_qlist_bhead); + rc = dpp_reg_write(dev_id, + bhead_reg_index, + 0, + reg_index, + &qlist_bhead); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + } + + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "++++++ i=%d ++++++\n", i); + + if (i != 8 ) + { + for (k = ddr_num; k < 8; k++) + { + for (j = 0; j < 8; j++) + { + reg_index = (k * 8 + j); + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "++++++ reg_index=%d ++++++\n", reg_index); + qlist_bhead.bank_vld = 0; + qlist_bhead.qcfg_qlist_bhead = 0; + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "++++++ qlist_bhead.bank_vld=0x%x ++++++\n", qlist_bhead.bank_vld); + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "++++++ qlist_bhead.qcfg_qlist_bhead=0x%x ++++++\n", qlist_bhead.qcfg_qlist_bhead); + rc = dpp_reg_write(dev_id, + bhead_reg_index, + 0, + reg_index, + &qlist_bhead); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + } + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "++++++dpp_tm_qmu_qlist_set end++++++\n"); + + /*** bank号映射: + qmu-->mmu: bank0~7 映射 bank0~7 + mmu-->qmu: bank0~7 映射 bank0~7 *****/ + for (j = 0; j < ddr_num; j++) + { + for (i = 0; i < bank_num_para; i++) + { + /* qmu-->mmu: bank0~7 映射 bank0~7 */ + k = j * 8 + i; + bank_to_mmu_cfg.cfgmt_bank_in_mmu_cfg = i; + rc = dpp_reg_write(dev_id, + qmu_cfgmt_bank_to_mmu_index, + 0, + k, + &bank_to_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + /* mmu-->qmu: bank0~7 映射 bank0~7 */ + bank_to_qmu_cfg.cfgmt_bank_in_qmu_cfg = i; + + rc = dpp_reg_write(dev_id, + qmu_cfgmt_bank_to_qmu_index, + 0, + k, + &bank_to_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + /* random映射ram */ + for (j = 0; j < ddr_num; j++) + { + for (i = 0; i < bank_num_para; i++) + { + k = j * bank_num_para + i; + + active_to_bank_cfg.cfgmt_active_to_bank_cfg = i; + + rc = dpp_reg_write(dev_id, + qmu_cfgmt_active_to_bank_index, + 0, + k, + &active_to_bank_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + + /* 随机表配置,决定每组bank的轮询顺序 */ + for (j = 0; j < ddr_num; j++) + { + for (i = 0; i < bank_num_para; i++) + { + k = j * 8 + i; + + qlist_grp0_bank.qcfg_qlist_grp0_bank_wr = qlist_grp0_bank_data[i]; + + rc = dpp_reg_write(dev_id, + qmu_qcfg_qlist_grp0_bank_index, + 0, + k, + &qlist_grp0_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + } + + for (j = 0; j < ddr_num; j++) + { + for (i = 0; i < bank_num_para; i++) + { + k = j * 8 + i; + + qlist_grp1_bank.qcfg_qlist_grp1_bank_wr = qlist_grp0_bank_data[i]; + + rc = dpp_reg_write(dev_id, + qmu_qcfg_qlist_grp1_bank_index, + 0, + k, + &qlist_grp1_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + } + + /* qmu配置完成 */ + rc = dpp_tm_qmu_cfg_done_set(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_cfg_done_set"); + + return DPP_OK; +} + + +/***********************************************************/ +/** QMU DDR随机模式时,DDR随机组配置 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param ddr_num ddr组数,1-6组 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_qmu_ddr_rand_grp_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 ddr_num) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 bank_no[6][16] = {{0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7}, + {0, 8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15}, + {0, 8, 16, 1, 9, 17, 2, 10, 18, 3, 11, 19, 4, 12, 20, 5}, + {0, 8, 16, 24, 1, 9, 17, 25, 2, 10, 18, 26, 3, 11, 19, 27}, + {0, 8, 16, 24, 32, 1, 9, 17, 25, 33, 2, 10, 18, 26, 34, 3}, + {0, 8, 16, 24, 32, 40, 1, 9, 17, 25, 33, 41, 2, 10, 18, 26} + }; + + DPP_ETM_QMU_QCFG_QLIST_GRP_T grp = {0}; + DPP_ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFG_T bank = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, ddr_num, 1, 6); + + for (i = 0; i < 64; i++) + { + grp.qcfg_qlist_grp_wr = i % ddr_num; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRPr, + 0, + i, + &grp); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + for (i = 0; i < 16; i++) + { + bank.cfgmt_active_to_bank_cfg = bank_no[ddr_num - 1][i]; + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFGr, + 0, + i, + &bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置QMU DDR BANK随机模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param ddr_random 模式:0-轮询模式;1-随机模式 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_qmu_ddr_random_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 ddr_random) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_QLIST_DDR_RANDOM_T ddr_rand = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, ddr_random, 0, 1); + + ddr_rand.qcfg_qlist_ddr_random = ddr_random; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_DDR_RANDOMr, + 0, + 0, + &ddr_rand); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置QMU DDR BANK随机模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_ddr_random 模式:0-轮询模式;1-随机模式 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_qmu_ddr_random_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_ddr_random) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_QLIST_DDR_RANDOM_T ddr_rand = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_ddr_random); + + rc = dpp_reg_read(dev_id, + ETM_QMU_QCFG_QLIST_DDR_RANDOMr, + 0, + 0, + &ddr_rand); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + *p_ddr_random = ddr_rand.qcfg_qlist_ddr_random; + + return DPP_OK; +} + + +/***********************************************************/ +/** QMU配置完成寄存器,在QMU链表和DDR随机模式寄存器写入后,将此寄存器写1,完成QMU配置 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/05/08 +************************************************************/ +DPP_STATUS dpp_tm_qmu_cfg_done_set(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_QLIST_CFG_DONE_T cfg_done = {0}; + + cfg_done.qcfg_qlist_cfg_done = 1; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_CFG_DONEr, + 0, + 0, + &cfg_done); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 配置CRS的e桶产生的crbal门限值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param index crs组数:0~15 +* @param crs_th CRS产生的crbal门限值 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author xuhb @date 2021/02/14 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crs_eir_th_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 index, + ZXIC_UINT32 crs_th) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_QSCH_CRS_EIR_TH_T crs_eir_th = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, index, 0, 0xf); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, crs_th, 0, 0x3ffff); + + crs_eir_th.qcfg_qsch_crs_eir_th = crs_th; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QSCH_CRS_EIR_THr, + 0, + index, + &crs_eir_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置CRS产生的crbal门限值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param index crs组数:0~15 +* @param crs_th CRS产生的crbal门限值 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/11 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crs_th_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 index, + ZXIC_UINT32 crs_th) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_QSCH_CRS_TH1_T crs_th1 = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, index, 0, 0xf); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, crs_th, 0, 0xffffffff); + + crs_th1.qcfg_qsch_crs_th1 = crs_th; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QSCH_CRS_TH1r, + 0, + index, + &crs_th1); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 配置CRS产生的空队列确保门限值 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param que_type 队列类型编号(0~15) +* @param empty_que_ack_th 空队列确保授权门限 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/09 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crs_th2_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 que_type, + ZXIC_UINT32 empty_que_ack_th) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_QSCH_CRS_TH2_T crs_th2 = {0}; + ZXIC_UINT32 rem_bit_sum = 4; + ZXIC_UINT32 rem = 0; + ZXIC_UINT32 exp = 0; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, que_type, 0, 15); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, empty_que_ack_th, 0, 0x78000); + + rc = dpp_tm_rem_and_exp_translate(empty_que_ack_th, + rem_bit_sum, + &rem, + &exp); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + crs_th2.qcfg_qsch_crs_th2 = (rem << 4) + (exp & 0xf); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QSCH_CRS_TH2r, + 0, + que_type, + &crs_th2); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + return DPP_OK; +} + +/***********************************************************/ +/** 配置CRS发送的速率 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param sent_cyc CRS发送的间隔(单位:时钟周期) +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author szq @date 2015/03/25 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crs_sent_rate_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 sent_cyc) +{ + DPP_STATUS rc = DPP_OK; + + DPP_ETM_QMU_CFGMT_CRS_INTERVAL_T crs_interval = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, sent_cyc, 1, 0xffffffff); + + crs_interval.cfgmt_crs_interval = sent_cyc; + + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_CRS_INTERVALr, + 0, + 0, + &crs_interval); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + return DPP_OK; +} + +/***********************************************************/ +/** 获取CRS发送的速率 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param p_sent_cyc CRS发送的间隔(单位:时钟周期) +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author szq @date 2015/03/25 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crs_sent_rate_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_sent_cyc) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CFGMT_CRS_INTERVAL_T crs_interval = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_sent_cyc); + + + *p_sent_cyc = 0; + + rc = dpp_reg_read(dev_id, + ETM_QMU_CFGMT_CRS_INTERVALr, + 0, + 0, + &crs_interval); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + *p_sent_cyc = crs_interval.cfgmt_crs_interval; + + return DPP_OK; +} + +/***********************************************************/ +/** 配置QMU端口间交织模式 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param pkt_blk_mode 交织模式: 1-按包交织; 0-按block交织 SA模式只能配置为1 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author szq @date 2015/03/25 +************************************************************/ +DPP_STATUS dpp_tm_qmu_pkt_blk_mode_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 pkt_blk_mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_CSW_PKT_BLK_MODE_T csw_pkt_blk_mode = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pkt_blk_mode, 0, 1); + + csw_pkt_blk_mode.qcfg_csw_pkt_blk_mode = pkt_blk_mode; + + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_CSW_PKT_BLK_MODEr, + 0, + 0, + &csw_pkt_blk_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + return DPP_OK; +} + +/***********************************************************/ +/** 获取QMU端口间交织模式 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param p_pkt_blk_mode 交织模式: 0-按包交织 ; 1-按block交织SA模式只能配置为1 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author szq @date 2015/03/25 +************************************************************/ +DPP_STATUS dpp_tm_qmu_pkt_blk_mode_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_pkt_blk_mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_CSW_PKT_BLK_MODE_T csw_pkt_blk_mode = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_pkt_blk_mode); + + *p_pkt_blk_mode = 0; + + rc = dpp_reg_read(dev_id, + ETM_QMU_QCFG_CSW_PKT_BLK_MODEr, + 0, + 0, + &csw_pkt_blk_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + *p_pkt_blk_mode = csw_pkt_blk_mode.qcfg_csw_pkt_blk_mode; + + return DPP_OK; +} + +/***********************************************************/ +/** 配置SA模式下各个版本的授权价值 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param sa_ver_id 版本号(0~7) +* @param sa_credit_value 授权价值 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author szq @date 2015/03/25 +************************************************************/ +DPP_STATUS dpp_tm_qmu_sa_credit_value_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 sa_ver_id, + ZXIC_UINT32 sa_credit_value) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_0_T qmu_sa_credit_value = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, sa_ver_id, 0, 7); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, sa_credit_value, 0, 0x3ffff); + + qmu_sa_credit_value.cfg_qsch_sa_credit_value_0 = sa_credit_value; + rc = dpp_reg_write(dev_id, + ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_0r + sa_ver_id, + 0, + 0, + &qmu_sa_credit_value); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 获取SA模式下各个版本的授权价值 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param sa_ver_id 版本号(0~7) +* @param p_sa_credit_value 授权价值 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author szq @date 2015/03/25 +************************************************************/ +DPP_STATUS dpp_tm_qmu_sa_credit_value_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 sa_ver_id, + ZXIC_UINT32 *p_sa_credit_value) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_0_T qmu_sa_credit_value = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, sa_ver_id, 0, 7); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_sa_credit_value); + + *p_sa_credit_value = 0; + + rc = dpp_reg_read(dev_id, + ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_0r + sa_ver_id, + 0, + 0, + &qmu_sa_credit_value); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + *p_sa_credit_value = qmu_sa_credit_value.cfg_qsch_sa_credit_value_0; + + return DPP_OK; +} + +/***********************************************************/ +/** 配置多播授权令牌添加个数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param token_add_num 令牌添加时,每次增加的令牌数目,取值范围为1~255,默认为1;禁止配置为0,配置为0时,将不会产生授权。 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/09 +************************************************************/ +DPP_STATUS dpp_tm_qmu_mul_token_gen_num_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 token_add_num) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CFG_QSCH_MUL_TOKEN_GEN_NUM_T token_gen_num = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, token_add_num, 1, 255); + + token_gen_num.cfg_qsch_mul_token_gen_num = token_add_num; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFG_QSCH_MUL_TOKEN_GEN_NUMr, + 0, + 0, + &token_gen_num); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + return DPP_OK; +} + +/***********************************************************/ +/** 配置多播授权整形桶参数和使能参数 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param q3_lb_control_en 3号队列整形功能开启使能。0:关闭;1:开启。 +* @param q012_lb_control_en 0~2号队列整形功能开启使能。0:关闭;1:开启。 +* @param q3_lb_max_cnt 3号队列整形桶桶深。 +* @param q012_lb_max_cnt 0~2号队列整形桶桶深。 +* @param q3_lb_add_rate 3号队列令牌添加速率,时钟周期为单位。不可配置为0,配置为0整形使能时,不能产生队列3授权调度信号。 +* @param q012_lb_add_rate 0~2号队列令牌添加速率,以时钟周期单位。不可配置为0,配置为0并整形使能时,不能产生队列0、1、2授权调度信号。 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/09 +************************************************************/ +DPP_STATUS dpp_tm_qmu_mul_ack_lb_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 q3_lb_control_en, + ZXIC_UINT32 q012_lb_control_en, + ZXIC_UINT32 q3_lb_max_cnt, + ZXIC_UINT32 q012_lb_max_cnt, + ZXIC_UINT32 q3_lb_add_rate, + ZXIC_UINT32 q012_lb_add_rate) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 q3_crdt_lb_ctrl_en_reg_index = 0; + ZXIC_UINT32 q012_crdt_lb_ctrl_en_reg_index = 0; + ZXIC_UINT32 q3_crdt_lb_max_cnt_reg_index = 0; + ZXIC_UINT32 q012_crdt_lb_max_cnt_reg_index = 0; + ZXIC_UINT32 q3_crdt_lb_add_rate_reg_index = 0; + ZXIC_UINT32 q012_crdt_lb_add_rate_reg_index = 0; + DPP_ETM_QMU_CFG_QSCH_Q3_CREDIT_LB_CONTROL_EN_T q3_en = {0}; + DPP_ETM_QMU_CFG_QSCH_Q012_CREDIT_LB_CONTROL_EN_T q012_en = {0}; + DPP_ETM_QMU_CFG_QSCH_Q3CREDITLBMAXCNT_T q3_max_cnt = {0}; + DPP_ETM_QMU_CFG_QSCH_Q012CREDITLBMAXCNT_T q012_max_cnt = {0}; + DPP_ETM_QMU_CFG_QSCH_Q3LBADDRATE_T q3_rate = {0}; + DPP_ETM_QMU_CFG_QSCH_Q012LBADDRATE_T q012_rate = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NONE(dev_id, q3_lb_control_en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NONE(dev_id, q012_lb_control_en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NONE(dev_id, q3_lb_max_cnt, 0, 0xff); + ZXIC_COMM_CHECK_DEV_INDEX_NONE(dev_id, q012_lb_max_cnt, 0, 0xff); + ZXIC_COMM_CHECK_DEV_INDEX_NONE(dev_id, q3_lb_add_rate, 0, 0xfffffff); + ZXIC_COMM_CHECK_DEV_INDEX_NONE(dev_id, q012_lb_add_rate, 0, 0xfffffff); + + q3_crdt_lb_ctrl_en_reg_index = ETM_QMU_CFG_QSCH_Q3_CREDIT_LB_CONTROL_ENr; + q012_crdt_lb_ctrl_en_reg_index = ETM_QMU_CFG_QSCH_Q012_CREDIT_LB_CONTROL_ENr; + q3_crdt_lb_max_cnt_reg_index = ETM_QMU_CFG_QSCH_Q3CREDITLBMAXCNTr; + q012_crdt_lb_max_cnt_reg_index = ETM_QMU_CFG_QSCH_Q012CREDITLBMAXCNTr; + q3_crdt_lb_add_rate_reg_index = ETM_QMU_CFG_QSCH_Q3LBADDRATEr; + q012_crdt_lb_add_rate_reg_index = ETM_QMU_CFG_QSCH_Q012LBADDRATEr; + + q3_en.cfg_qsch_q3_credit_lb_control_en = q3_lb_control_en; + rc = dpp_reg_write(dev_id, + q3_crdt_lb_ctrl_en_reg_index, + 0, + 0, + &q3_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + q012_en.cfg_qsch_q012_credit_lb_control_en = q012_lb_control_en; + rc = dpp_reg_write(dev_id, + q012_crdt_lb_ctrl_en_reg_index, + 0, + 0, + &q012_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + q3_max_cnt.cfg_qsch_q3creditlbmaxcnt = q3_lb_max_cnt; + rc = dpp_reg_write(dev_id, + q3_crdt_lb_max_cnt_reg_index, + 0, + 0, + &q3_max_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + q012_max_cnt.cfg_qsch_q012creditlbmaxcnt = q012_lb_max_cnt; + rc = dpp_reg_write(dev_id, + q012_crdt_lb_max_cnt_reg_index, + 0, + 0, + &q012_max_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + q3_rate.cfg_qsch_q3lbaddrate = q3_lb_add_rate; + rc = dpp_reg_write(dev_id, + q3_crdt_lb_add_rate_reg_index, + 0, + 0, + &q3_rate); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + q012_rate.cfg_qsch_q012lbaddrate = q012_lb_add_rate; + rc = dpp_reg_write(dev_id, + q012_crdt_lb_add_rate_reg_index, + 0, + 0, + &q012_rate); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + return DPP_OK; +} + +/***********************************************************/ +/** 配置0,1号队列挂接1或2号MCN漏桶信息 +* @param tm_type 0-ETM,1-FTM +* @param dev_id 设备索引编号 +* @param mcn_lb_sel 0:0,1号队列挂接1号MCN漏桶 1:0,1号队列挂接2号MCN漏桶 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/09 +************************************************************/ +DPP_STATUS dpp_tm_qmu_mcn_lb_sel_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 mcn_lb_sel) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CFG_QSCH_Q01_ATTACH_EN_T q01_attach_en = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, mcn_lb_sel, 0, 1); + + q01_attach_en.cfg_qsch_q01_attach_en = mcn_lb_sel; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFG_QSCH_Q01_ATTACH_ENr, + 0, + 0, + &q01_attach_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + return DPP_OK; +} + +/***********************************************************/ +/** 配置多播队列0~2的授权输出SP、DWRR +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param sp_or_dwrr SP、DWRR模式选择。0:SP;1:DWRR。 +* @param dwrr_w0 0号队列DWRR权重(0~127) +* @param dwrr_w1 1号队列DWRR权重(0~127) +* @param dwrr_w2 2号队列DWRR权重(0~127) +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/09 +************************************************************/ +DPP_STATUS dpp_tm_qmu_mul_sp_dwrr_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 sp_or_dwrr, + ZXIC_UINT32 dwrr_w0, + ZXIC_UINT32 dwrr_w1, + ZXIC_UINT32 dwrr_w2) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CFG_QSCH_SP_DWRR_EN_T sp_dwrr_en = {0}; + DPP_ETM_QMU_CFG_QSCH_W0_T qsch_w0 = {0}; + DPP_ETM_QMU_CFG_QSCH_W1_T qsch_w1 = {0}; + DPP_ETM_QMU_CFG_QSCH_W2_T qsch_w2 = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, sp_or_dwrr, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dwrr_w0, 0, 0x7f); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dwrr_w1, 0, 0x7f); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dwrr_w2, 0, 0x7f); + + sp_dwrr_en.cfg_qsch_sp_dwrr_en = sp_or_dwrr; + rc = dpp_reg_write(dev_id, + ETM_QMU_CFG_QSCH_SP_DWRR_ENr, + 0, + 0, + &sp_dwrr_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + qsch_w0.cfg_qsch_w0 = dwrr_w0; + rc = dpp_reg_write(dev_id, + ETM_QMU_CFG_QSCH_W0r, + 0, + 0, + &qsch_w0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + qsch_w1.cfg_qsch_w1 = dwrr_w1; + rc = dpp_reg_write(dev_id, + ETM_QMU_CFG_QSCH_W1r, + 0, + 0, + &qsch_w1); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + qsch_w2.cfg_qsch_w2 = dwrr_w2; + rc = dpp_reg_write(dev_id, + ETM_QMU_CFG_QSCH_W2r, + 0, + 0, + &qsch_w2); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + return DPP_OK; +} + +/***********************************************************/ +/** 配置分目的SA整形打开或关闭 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param shap_en 分目的SA整形使能开关 0:表示关闭 1:表示打开 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/09 +************************************************************/ +DPP_STATUS dpp_tm_qmu_dest_sa_shap_en_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 shap_en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CFGMT_QMU_SASHAP_EN_T sa_shap_en = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, shap_en, 0, 1); + + sa_shap_en.cfgmt_qmu_sashap_en = shap_en; + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_QMU_SASHAP_ENr, + 0, + 0, + &sa_shap_en); + + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + return DPP_OK; +} + +/***********************************************************/ +/** 配置轮转扫描使能和扫描速率 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param scan_en 轮转扫描使能。0:关闭,1:开启 +* @param scan_rate 轮转扫描速率,配置扫描周期不得少于256个周期 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/10 +************************************************************/ +DPP_STATUS dpp_tm_qmu_scan_rate_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 scan_en, + ZXIC_UINT32 scan_rate) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CFG_QSCH_SCAN_EN_T qsch_scan_en = {0}; + DPP_ETM_QMU_CFG_QSCH_SCANRATE_T qsch_scanrate = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, scan_en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, scan_rate, 0x100, 0xfffff); + + + qsch_scan_en.cfg_qsch_scan_en = scan_en; + rc = dpp_reg_write(dev_id, + ETM_QMU_CFG_QSCH_SCAN_ENr, + 0, + 0, + &qsch_scan_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + qsch_scanrate.cfg_qsch_scanrate = scan_rate; + rc = dpp_reg_write(dev_id, + ETM_QMU_CFG_QSCH_SCANRATEr, + 0, + 0, + &qsch_scanrate); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + return DPP_OK; +} + +/***********************************************************/ +/** 获得轮转扫描使能和扫描速率 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param scan_en 轮转扫描使能。0:关闭,1:开启 +* @param scan_rate 轮转扫描速率,配置扫描周期不得少于256个周期 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/10 +************************************************************/ +DPP_STATUS dpp_tm_qmu_scan_rate_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_scan_en, + ZXIC_UINT32 *p_scan_rate) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CFG_QSCH_SCAN_EN_T qsch_scan_en = {0}; + DPP_ETM_QMU_CFG_QSCH_SCANRATE_T qsch_scanrate = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_scan_en); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_scan_rate); + + + rc = dpp_reg_read(dev_id, + ETM_QMU_CFG_QSCH_SCAN_ENr, + 0, + 0, + &qsch_scan_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + *p_scan_en = qsch_scan_en.cfg_qsch_scan_en; + + rc = dpp_reg_read(dev_id, + ETM_QMU_CFG_QSCH_SCANRATEr, + 0, + 0, + &qsch_scanrate); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + *p_scan_rate = qsch_scanrate.cfg_qsch_scanrate; + + return DPP_OK; + + +} + +/***********************************************************/ +/** 配置轮转扫描队列范围 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param first_que 起始队列号 +* @param last_que 终止队列号 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author whuashan @date 2019/09/10 +************************************************************/ +DPP_STATUS dpp_tm_qmu_scan_que_range_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 first_que, + ZXIC_UINT32 last_que) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CFG_QSCH_SCANFRSTQUE_T qsch_scanfirstque_t = {0}; + DPP_ETM_QMU_CFG_QSCH_SCANLASTQUE_T qsch_scanlastque_t = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, first_que, 0, DPP_ETM_Q_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, last_que, 0, DPP_ETM_Q_NUM - 1); + + qsch_scanfirstque_t.cfg_qsch_scanfrstque = first_que; + qsch_scanlastque_t.cfg_qsch_scanlastque = last_que; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFG_QSCH_SCANFRSTQUEr, + 0, + 0, + &qsch_scanfirstque_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFG_QSCH_SCANLASTQUEr, + 0, + 0, + &qsch_scanlastque_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; + +} + +/***********************************************************/ +/** 获取轮转扫描队列范围 +* @param dev_id 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* @param first_que 起始队列号 +* @param last_que 终止队列号 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author whuashan @date 2019/09/10 +************************************************************/ +DPP_STATUS dpp_tm_qmu_scan_que_range_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *first_que, + ZXIC_UINT32 *last_que) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CFG_QSCH_SCANFRSTQUE_T qsch_scanfirstque_t = {0}; + DPP_ETM_QMU_CFG_QSCH_SCANLASTQUE_T qsch_scanlastque_t = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, first_que); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, last_que); + + rc = dpp_reg_read(dev_id, + ETM_QMU_CFG_QSCH_SCANFRSTQUEr, + 0, + 0, + &qsch_scanfirstque_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_CFG_QSCH_SCANLASTQUEr, + 0, + 0, + &qsch_scanlastque_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + *first_que = qsch_scanfirstque_t.cfg_qsch_scanfrstque; + *last_que = qsch_scanlastque_t.cfg_qsch_scanlastque; + + return DPP_OK; + +} +#endif + +/***********************************************************/ +/** 配置读命令老化使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param aged_en 读命令老化使能:0:不使能;1:使能 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/11 +************************************************************/ +DPP_STATUS dpp_tm_qmu_wr_aged_en_set(DPP_DEV_T *dev, ZXIC_UINT32 aged_en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_CSCH_AGED_CFG_T aged_cfg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), aged_en, 0, 1); + + + aged_cfg.qcfg_csch_aged_cfg = aged_en; + + rc = dpp_reg_write(dev, + ETM_QMU_QCFG_CSCH_AGED_CFGr, + 0, + 0, + &aged_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + return DPP_OK; +} + +/***********************************************************/ +/** 配置读命令老化速率 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param scan_time 读命令老化速率(扫描间隔时间) +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/11 +************************************************************/ +DPP_STATUS dpp_tm_qmu_wr_aged_scan_time_set(DPP_DEV_T *dev, ZXIC_UINT32 scan_time) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_CSCH_AGED_SCAN_TIME_T aged_scan_time = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), scan_time, 0, 0xffffffff); + + aged_scan_time.qcfg_csch_aged_scan_time = scan_time; + + rc = dpp_reg_write(dev, + ETM_QMU_QCFG_CSCH_AGED_SCAN_TIMEr, + 0, + 0, + &aged_scan_time); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + return DPP_OK; +} + +/***********************************************************/ +/** 获得读命令老化速率 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_scan_time 读命令老化速率(扫描间隔时间) +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/11 +************************************************************/ +DPP_STATUS dpp_tm_qmu_wr_aged_scan_time_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_scan_time) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_CSCH_AGED_SCAN_TIME_T aged_scan_time = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_scan_time); + + rc = dpp_reg_read(dev, + ETM_QMU_QCFG_CSCH_AGED_SCAN_TIMEr, + 0, + 0, + &aged_scan_time); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_scan_time = aged_scan_time.qcfg_csch_aged_scan_time; + + return DPP_OK; +} + + +/***********************************************************/ +/** 获取QMU清空状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_clr_done_flag 队列是否清空完成 +* +* @return +* @remark 无 +* @see +* @author szq @date 2015/05/21 +************************************************************/ +DPP_STATUS dpp_tm_qmu_qlist_qcfg_clr_done_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_clr_done_flag) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QLIST_QCFG_CLR_DONE_T clr_done_flag = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_clr_done_flag); + + + rc = dpp_reg_read(dev, + ETM_QMU_QLIST_QCFG_CLR_DONEr, + 0, + 0, + &clr_done_flag); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_clr_done_flag = clr_done_flag.qlist_qcfg_clr_done; + + return DPP_OK; +} + +/***********************************************************/ +/** 配置qsch调度分端口整形速率和使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param shape_en 整形使能 +* @param token_add_num [23:12]:添加令牌数目 +* @param token_gap [11:0]:添加令牌间隔,其中实际间隔为配置间隔+1 +* @param token_depth 桶深,单位B,范围[0-0x1EE00] +*公式:(1000*8*token_num)/(gap+1) = X Mbps +* 主频= 600 MHz +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author xuhb 2020-5-15 +************************************************************/ +DPP_STATUS dpp_tm_qmu_qsch_port_shape_set(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + ZXIC_UINT32 token_add_num, + ZXIC_UINT32 token_gap, + ZXIC_UINT32 token_depth, + ZXIC_UINT32 shape_en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_QSCH_SHAP_PARAM_T qsch_shap_param = {0}; + DPP_ETM_QMU_QCFG_QSCH_SHAP_TOKEN_T qsch_shap_token_depth = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), port_id, 0, DPP_TM_PP_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), shape_en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), token_add_num, 0, 0xfff); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), token_gap, 0, 0xfff); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), token_depth, 0, 0x1f000); + + /* 配置整形桶深 */ + qsch_shap_token_depth.qcfg_qsch_shap_token= token_depth; + rc = dpp_reg_write(dev, + ETM_QMU_QCFG_QSCH_SHAP_TOKENr, + 0, + port_id, + &qsch_shap_token_depth); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + qsch_shap_param.qcfg_qsch_shap_en = shape_en; + qsch_shap_param.qcfg_qsch_shap_param1= token_add_num ; + qsch_shap_param.qcfg_qsch_shap_param2= token_gap; + rc = dpp_reg_write(dev, + ETM_QMU_QCFG_QSCH_SHAP_PARAMr, + 0, + port_id, + &qsch_shap_param); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + + return DPP_OK; + +} + + +/***********************************************************/ +/** 配置CMD_SW分端口整形速率和使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param shape_en 整形使能 +* @param token_add_num [23:12]:添加令牌数目 +* @param token_gap [11:0]:添加令牌间隔,其中实际间隔为配置间隔+1 +* @param token_depth 桶深,单位B,范围[0-0x1EE00] +*公式:(1000*8*token_num)/(gap+1) = X Mbps +* 主频= 600 MHz +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author whuashan 2020-3-17 +************************************************************/ +DPP_STATUS dpp_tm_qmu_port_shape_set(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + ZXIC_UINT32 token_add_num, + ZXIC_UINT32 token_gap, + ZXIC_UINT32 token_depth, + ZXIC_UINT32 shape_en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_CSW_SHAP_PARAMETER_T csw_shap_param = {0}; + DPP_ETM_QMU_QCFG_CSW_SHAP_TOKEN_DEPTH_T csw_shap_token_depth = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), port_id, 0, DPP_TM_PP_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), shape_en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), token_add_num, 0, 0xfff); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), token_gap, 0, 0xfff); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), token_depth, 0, 0x1ee00); + + /* 配置整形桶深 */ + csw_shap_token_depth.qcfg_csw_shap_token_depth = token_depth; + rc = dpp_reg_write(dev, + ETM_QMU_QCFG_CSW_SHAP_TOKEN_DEPTHr, + 0, + port_id, + &csw_shap_token_depth); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + csw_shap_param.qcfg_csw_shap_en = shape_en; + csw_shap_param.qcfg_csw_shap_parameter = (token_add_num << 12) | token_gap; + rc = dpp_reg_write(dev, + ETM_QMU_QCFG_CSW_SHAP_PARAMETERr, + 0, + port_id, + &csw_shap_param); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; + +} + +/***********************************************************/ +/** 获得CMD_SW分端口整形速率和使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_shape_en 整形使能 +* @param p_token_add_num [23:12]:添加令牌数目 +* @param p_token_gap [11:0]:添加令牌间隔,其中实际间隔为配置间隔+1 +* @param p_token_depth 桶深,单位B +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author whuashan 2020-3-17 +************************************************************/ +DPP_STATUS dpp_tm_qmu_port_shape_get(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + ZXIC_UINT32 *p_token_add_num, + ZXIC_UINT32 *p_token_gap, + ZXIC_UINT32 *p_token_depth, + ZXIC_UINT32 *p_shape_en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_CSW_SHAP_PARAMETER_T csw_shap_param = {0}; + DPP_ETM_QMU_QCFG_CSW_SHAP_TOKEN_DEPTH_T csw_shap_token_depth = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), port_id, 0, DPP_TM_PP_NUM - 1); + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_token_add_num); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_token_gap); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_token_depth); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_shape_en); + + rc = dpp_reg_read(dev, + ETM_QMU_QCFG_CSW_SHAP_PARAMETERr, + 0, + port_id, + &csw_shap_param); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_shape_en = csw_shap_param.qcfg_csw_shap_en; + *p_token_add_num = (csw_shap_param.qcfg_csw_shap_parameter >> 12) & 0xfff; + *p_token_gap = csw_shap_param.qcfg_csw_shap_parameter & 0xfff; + + rc = dpp_reg_read(dev, + ETM_QMU_QCFG_CSW_SHAP_TOKEN_DEPTHr, + 0, + port_id, + &csw_shap_token_depth); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_token_depth = csw_shap_token_depth.qcfg_csw_shap_token_depth; + + return DPP_OK; + +} + +#if 0 +/***********************************************************/ +/** 配置CMD_SW分端口(qmu出端口)整形速率和使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param shape_cir 整形值,单位Mbps,范围[0-160000] +* @param shape_cbs 桶深, 单位B,范围[0-0x1EE00] +* @param shape_en 整形使能 +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author whuashan 2020-3-17 +************************************************************/ +DPP_STATUS dpp_tm_qmu_egress_shape_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 port_id, + ZXIC_UINT32 shape_cir, + ZXIC_UINT32 shape_cbs, + ZXIC_UINT32 shape_en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_CSW_SHAP_PARAMETER_T csw_shap_param = {0}; + DPP_ETM_QMU_QCFG_CSW_SHAP_TOKEN_DEPTH_T csw_shap_token_depth = {0}; + QMU_PORT_SHAPE_PARA qmu_port_shape_para[100] = {{0}}; + + ZXIC_UINT32 token_add_num = 0; + ZXIC_UINT32 token_gap = 0; + ZXIC_UINT32 shape_value_amplified = 0; + ZXIC_UINT32 compare_value = 0; + ZXIC_UINT32 shape_para_cnt = 0; + ZXIC_UINT32 shape_para_final_cnt = 0; + ZXIC_UINT32 shape_min_value = 0; + ZXIC_UINT32 shape_min_value_num = 0; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, port_id, 0, DPP_TM_PP_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, shape_cir, 0, 400000); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, shape_cbs, 0, 0x1EE00); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, shape_en, 0, 1); + + /* 获取token_add_num、token_gap */ + for (token_gap = 10; token_gap <= 0xfff; token_gap++ ) + { + for (token_add_num = 1; token_add_num <= 0xfff; token_add_num++) + { + shape_value_amplified = (1000 * 8 * token_add_num) / (token_gap + 1); + compare_value = (shape_value_amplified - (shape_cir * DPP_TM_QMU_PORT_SHAP_MAG)); + + /* 0~20的范围,避免获取token_add_num、token_gap失败 */ + if ( (compare_value > 0) && (compare_value < 20) && (shape_para_cnt<100)) + { + qmu_port_shape_para[shape_para_cnt].shape_value_amplified = shape_value_amplified; + qmu_port_shape_para[shape_para_cnt].token_add_num = token_add_num; + qmu_port_shape_para[shape_para_cnt].token_gap = token_gap; + shape_para_final_cnt = shape_para_cnt + 1; + shape_para_cnt++; + } + } + } + + /* 获取最小的整形值参数 */ + shape_min_value = qmu_port_shape_para[0].shape_value_amplified; + + for (shape_para_cnt = 0; shape_para_cnt < shape_para_final_cnt; shape_para_cnt++) + { + if (shape_min_value > qmu_port_shape_para[shape_para_cnt].shape_value_amplified) + { + shape_min_value = qmu_port_shape_para[shape_para_cnt].shape_value_amplified; + shape_min_value_num = shape_para_cnt ; + } + } + + /* 配置整形桶深 */ + csw_shap_token_depth.qcfg_csw_shap_token_depth = shape_cbs; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_CSW_SHAP_TOKEN_DEPTHr, + 0, + port_id, + &csw_shap_token_depth); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + /* 配置整形速率 */ + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, shape_min_value_num, 0, 99); + csw_shap_param.qcfg_csw_shap_en = shape_en; + csw_shap_param.qcfg_csw_shap_parameter = (qmu_port_shape_para[shape_min_value_num].token_add_num << 12) | qmu_port_shape_para[shape_min_value_num].token_gap; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_CSW_SHAP_PARAMETERr, + 0, + port_id, + &csw_shap_param); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; + +} + + +/***********************************************************/ +/** 获取CMD_SW分端口整形速率和使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param shape_vlue 整形值,单位Mbps +* @param shape_en 整形使能 +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author zmy @20151217 +************************************************************/ +DPP_STATUS dpp_tm_qmu_egress_shape_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 port_id, + ZXIC_UINT32 *shape_value, + ZXIC_UINT32 *shape_en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_CSW_SHAP_PARAMETER_T csw_shap_param = {0}; + ZXIC_UINT32 token_add_num = 0; + ZXIC_UINT32 token_gap = 0; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, port_id, 0, DPP_TM_PP_NUM - 1); + + rc = dpp_reg_read(dev_id, + ETM_QMU_QCFG_CSW_SHAP_PARAMETERr, + 0, + port_id, + &csw_shap_param); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + + token_add_num = (csw_shap_param.qcfg_csw_shap_parameter >> 12) & 0xfff; + token_gap = csw_shap_param.qcfg_csw_shap_parameter & 0xfff; + + *shape_value = (((600 * 8 * token_add_num) / (token_gap + 1 )) / DPP_TM_QMU_PORT_SHAP_MAG); + + *shape_en = csw_shap_param.qcfg_csw_shap_en; + + return DPP_OK; + +} + +#endif +/***********************************************************/ +/** 配置需要检测的特定队列号 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param qnum 需要检测统计的特定的队列号 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/18 +************************************************************/ +DPP_STATUS dpp_tm_qmu_spec_qnum_set(DPP_DEV_T *dev, ZXIC_UINT32 qnum) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_OBSERVE_QNUM_SET_T observe_qnum = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), qnum, 0, DPP_ETM_Q_NUM - 1); + + observe_qnum.observe_qnum_set = qnum; + rc = dpp_reg_write(dev, + ETM_QMU_OBSERVE_QNUM_SETr, + 0, + 0, + &observe_qnum); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; + +} + +/***********************************************************/ +/** 获得特定的队列号 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_qnum 需要检测统计的特定的队列号 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/23 +************************************************************/ +DPP_STATUS dpp_tm_qmu_spec_qnum_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_qnum) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_OBSERVE_QNUM_SET_T observe_qnum = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_qnum); + + rc = dpp_reg_read(dev, + ETM_QMU_OBSERVE_QNUM_SETr, + 0, + 0, + &observe_qnum); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_qnum = observe_qnum.observe_qnum_set; + + return DPP_OK; + +} + +/***********************************************************/ +/** 配置需要检测的队列组 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param group_num 需要检测统计的特定的队列组。这里按取q的低3bit +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/18 +************************************************************/ +DPP_STATUS dpp_tm_qmu_spec_group_set(DPP_DEV_T *dev, ZXIC_UINT32 group_num) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_OBSERVE_BATCH_SET_T observe_batch = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), group_num, 0, 7); + + observe_batch.observe_batch_set = group_num; + rc = dpp_reg_write(dev, + ETM_QMU_OBSERVE_BATCH_SETr, + 0, + 0, + &observe_batch); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 获得需要检测的队列组 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_group_num 需要检测统计的特定的队列组。这里按取q的低3bit +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/23 +************************************************************/ +DPP_STATUS dpp_tm_qmu_spec_group_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_group_num) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_OBSERVE_BATCH_SET_T observe_batch = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_group_num); + + rc = dpp_reg_read(dev, + ETM_QMU_OBSERVE_BATCH_SETr, + 0, + 0, + &observe_batch); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_group_num = observe_batch.observe_batch_set; + + return DPP_OK; +} + +#if 0 +/***********************************************************/ +/** 配置出队暂存使用的进程总数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param used_inall 出队暂存使用的进程总数=19-N,默认3表示使用16个进程 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/18 +************************************************************/ +DPP_STATUS dpp_tm_qmu_pid_use_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 used_inall) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CFG_PID_USE_INALL_T pid_use_inall = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, used_inall, 0, 19); + + pid_use_inall.cfgmt_nod_rd_buf_0_aful_th = 19 - used_inall; + rc = dpp_reg_write(dev_id, + ETM_QMU_CFG_PID_USE_INALLr, + 0, + 0, + &pid_use_inall); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 获得出队暂存使用的进程总数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_used_inall 出队暂存使用的进程总数=19-N,默认3表示使用16个进程 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/23 +************************************************************/ +DPP_STATUS dpp_tm_qmu_pid_use_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_used_inall) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CFG_PID_USE_INALL_T pid_use_inall = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_used_inall); + + rc = dpp_reg_read(dev_id, + ETM_QMU_CFG_PID_USE_INALLr, + 0, + 0, + &pid_use_inall); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + *p_used_inall = 19 - pid_use_inall.cfgmt_nod_rd_buf_0_aful_th; + + return DPP_OK; +} + +/***********************************************************/ +/** 配置出队暂存自回加进程总数阈值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param round_th 出队暂存自回加进程总数阈值=19-N,默认4表示使用15个进程就自回加 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/18 +************************************************************/ +DPP_STATUS dpp_tm_qmu_pid_round_th_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 round_th) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CFG_PID_ROUND_TH_T pid_round_th = {0}; + ZXIC_COMM_CHECK_DEV_INDEX_SUB_OVERFLOW_NO_ASSERT(dev_id, 19 , round_th); + pid_round_th.cfgmt_nod_rd_buf_1_aful_th = 19 - round_th; + + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFG_PID_ROUND_THr, + 0, + 0, + &pid_round_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 获得出队暂存自回加进程总数阈值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_round_th 出队暂存自回加进程总数阈值=19-N,默认4表示使用15个进程就自回加 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/23 +************************************************************/ + +DPP_STATUS dpp_tm_qmu_pid_round_th_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_round_th) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CFG_PID_ROUND_TH_T pid_round_th = {0}; + + + rc = dpp_reg_read(dev_id, + ETM_QMU_CFG_PID_ROUND_THr, + 0, + 0, + &pid_round_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + *p_round_th = 19 - pid_round_th.cfgmt_nod_rd_buf_1_aful_th; + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置队列授权盈余 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param qnum 配置的队列号 +* @param value 授权盈余 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/18 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crbal_value_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 qnum, + ZXIC_UINT32 value) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QSCH_RW_CRBAL_T qsch_rw_crbal = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, value, 0, 0x1ffff); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, qnum, 0, DPP_ETM_Q_NUM - 1); + + qsch_rw_crbal.qsch_rw_crbal = value; + rc = dpp_reg_write(dev_id, + ETM_QMU_QSCH_RW_CRBALr, + 0, + qnum, + &qsch_rw_crbal); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 获得队列授权盈余 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param qnum 配置的队列号 +* @param p_value 授权盈余 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/23 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crbal_value_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 qnum, + ZXIC_UINT32 *p_value) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QSCH_RW_CRBAL_T qsch_rw_crbal = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_value); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, qnum, 0, DPP_ETM_Q_NUM - 1); + + rc = dpp_reg_read(dev_id, + ETM_QMU_QSCH_RW_CRBALr, + 0, + qnum, + &qsch_rw_crbal); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + *p_value = qsch_rw_crbal.qsch_rw_crbal & 0x1ffff; + + return DPP_OK; +} + +/***********************************************************/ +/** 配置分目的SA整形桶深上、下限参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param max_value 分目的SA整形桶深上限,必须配置为正值 +* @param min_value 分目的SA整形桶深下限,必须配置为负值 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/18 +************************************************************/ +DPP_STATUS dpp_tm_qmu_dest_sa_shape_para_set(ZXIC_UINT32 dev_id, + ZXIC_SINT32 max_value, + ZXIC_SINT32 min_value) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CFGMT_SASHAP_TOKEN_MAX_T sashap_token_max = {0}; + DPP_ETM_QMU_CFGMT_SASHAP_TOKEN_MIN_T sashap_token_min = {0}; + + + if (max_value < 0) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "[dev_id %d] max_value < 0, err!!!\n", dev_id); + ZXIC_COMM_ASSERT(0); + return DPP_ERR; + } + + if (min_value > 0) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "[dev_id %d] min_value > 0, err!!!\n", dev_id); + ZXIC_COMM_ASSERT(0); + return DPP_ERR; + } + + sashap_token_max.cfgmt_sashap_token_max = max_value; + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_SASHAP_TOKEN_MAXr, + 0, + 0, + &sashap_token_max); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + sashap_token_min.cfgmt_sashap_token_min = min_value; + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_SASHAP_TOKEN_MINr, + 0, + 0, + &sashap_token_min); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 获得分目的SA整形桶深上、下限参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_max_value 分目的SA整形桶深上限,必须配置为正值 +* @param p_min_value 分目的SA整形桶深下限,必须配置为负值 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/23 +************************************************************/ +DPP_STATUS dpp_tm_qmu_dest_sa_shape_para_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_max_value, + ZXIC_UINT32 *p_min_value) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CFGMT_SASHAP_TOKEN_MAX_T sashap_token_max = {0}; + DPP_ETM_QMU_CFGMT_SASHAP_TOKEN_MIN_T sashap_token_min = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_max_value); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_min_value); + + + rc = dpp_reg_read(dev_id, + ETM_QMU_CFGMT_SASHAP_TOKEN_MAXr, + 0, + 0, + &sashap_token_max); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + *p_max_value = sashap_token_max.cfgmt_sashap_token_max; + + rc = dpp_reg_read(dev_id, + ETM_QMU_CFGMT_SASHAP_TOKEN_MINr, + 0, + 0, + &sashap_token_min); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + *p_min_value = sashap_token_min.cfgmt_sashap_token_min; + + return DPP_OK; +} + +/***********************************************************/ +/** 配置CRS状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param qnum 队列号 +* @param state +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/19 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crs_state_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 qnum, + ZXIC_UINT32 state) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QSCH_RW_CRS_T qsch_rw_crs = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, state, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, qnum, 0, DPP_ETM_Q_NUM - 1); + + qsch_rw_crs.qsch_rw_crs = state; + rc = dpp_reg_write(dev_id, + ETM_QMU_QSCH_RW_CRSr, + 0, + qnum, + &qsch_rw_crs); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 获得CRS状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param qnum 队列号 +* @param p_state +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/23 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crs_state_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 qnum, + ZXIC_UINT32 *p_state) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QSCH_RW_CRS_T qsch_rw_crs = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_state); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, qnum, 0, DPP_ETM_Q_NUM - 1); + + + rc = dpp_reg_read(dev_id, + ETM_QMU_QSCH_RW_CRSr, + 0, + qnum, + &qsch_rw_crs); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + *p_state = qsch_rw_crs.qsch_rw_crs; + + return DPP_OK; +} + +#endif +/***********************************************************/ +/** 配置自动授权队列范围 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param first_que 自授权起始队列号 +* @param last_que 自授权终止队列号 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/19 +************************************************************/ +DPP_STATUS dpp_tm_qmu_auto_credit_que_set(DPP_DEV_T *dev, + ZXIC_UINT32 first_que, + ZXIC_UINT32 last_que) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CFG_QSCH_AUTOCRFRSTQUE_T qsch_autocrfrstque = {0}; + DPP_ETM_QMU_CFG_QSCH_AUTOCRLASTQUE_T qsch_autocrlastque = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), first_que, 0, DPP_ETM_Q_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), last_que, 0, DPP_ETM_Q_NUM - 1); + + if (first_que > last_que) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "[dev_id %d] first_que > last_que, err!!!\n", DEV_ID(dev)); + + return DPP_ERR; + } + + qsch_autocrfrstque.cfg_qsch_autocrfrstque = first_que; + rc = dpp_reg_write(dev, + ETM_QMU_CFG_QSCH_AUTOCRFRSTQUEr, + 0, + 0, + &qsch_autocrfrstque); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + qsch_autocrlastque.cfg_qsch_autocrlastque = last_que; + rc = dpp_reg_write(dev, + ETM_QMU_CFG_QSCH_AUTOCRLASTQUEr, + 0, + 0, + &qsch_autocrlastque); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 获得自动授权队列范围 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_first_que 自授权起始队列号 +* @param p_last_que 自授权终止队列号 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/23 +************************************************************/ +DPP_STATUS dpp_tm_qmu_auto_credit_que_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_first_que, + ZXIC_UINT32 *p_last_que) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CFG_QSCH_AUTOCRFRSTQUE_T qsch_autocrfrstque = {0}; + DPP_ETM_QMU_CFG_QSCH_AUTOCRLASTQUE_T qsch_autocrlastque = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_first_que); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_last_que); + + rc = dpp_reg_read(dev, + ETM_QMU_CFG_QSCH_AUTOCRFRSTQUEr, + 0, + 0, + &qsch_autocrfrstque); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + *p_first_que = qsch_autocrfrstque.cfg_qsch_autocrfrstque; + + rc = dpp_reg_read(dev, + ETM_QMU_CFG_QSCH_AUTOCRLASTQUEr, + 0, + 0, + &qsch_autocrlastque); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + *p_last_que = qsch_autocrlastque.cfg_qsch_autocrlastque; + + return DPP_OK; +} + +/***********************************************************/ +/** 配置自动授权开启使能及扫描速率 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param auto_crdt_en 自动授权开启使能,默认关闭。0:关闭;1:开启 +* @param auto_crdt_rate 自授权速率配置 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/19 +************************************************************/ +DPP_STATUS dpp_tm_qmu_auto_credit_rate_set(DPP_DEV_T *dev, + ZXIC_UINT32 auto_crdt_en, + ZXIC_UINT32 auto_crdt_rate) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CFG_QSCH_AUTO_CREDIT_CONTROL_EN_T credit_control_en = {0}; + DPP_ETM_QMU_CFG_QSCH_AUTOCREDITRATE_T autocredit_rate = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), auto_crdt_en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), auto_crdt_rate, 0, 0xfffff); + + + credit_control_en.cfg_qsch_auto_credit_control_en = auto_crdt_en; + rc = dpp_reg_write(dev, + ETM_QMU_CFG_QSCH_AUTO_CREDIT_CONTROL_ENr, + 0, + 0, + &credit_control_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + autocredit_rate.cfg_qsch_autocreditrate = auto_crdt_rate; + rc = dpp_reg_write(dev, + ETM_QMU_CFG_QSCH_AUTOCREDITRATEr, + 0, + 0, + &autocredit_rate); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 获得自动授权开启使能及扫描速率 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_auto_crdt_en 自动授权开启使能,默认关闭。0:关闭;1:开启 +* @param p_auto_crdt_rate 自授权速率配置 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/23 +************************************************************/ +DPP_STATUS dpp_tm_qmu_auto_credit_rate_get(DPP_DEV_T *dev, + ZXIC_UINT32 *p_auto_crdt_en, + ZXIC_UINT32 *p_auto_crdt_rate) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CFG_QSCH_AUTO_CREDIT_CONTROL_EN_T credit_control_en = {0}; + DPP_ETM_QMU_CFG_QSCH_AUTOCREDITRATE_T autocredit_rate = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_auto_crdt_en); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_auto_crdt_rate); + + rc = dpp_reg_read(dev, + ETM_QMU_CFG_QSCH_AUTO_CREDIT_CONTROL_ENr, + 0, + 0, + &credit_control_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + *p_auto_crdt_en = credit_control_en.cfg_qsch_auto_credit_control_en; + + rc = dpp_reg_read(dev, + ETM_QMU_CFG_QSCH_AUTOCREDITRATEr, + 0, + 0, + &autocredit_rate); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + *p_auto_crdt_rate = autocredit_rate.cfg_qsch_autocreditrate; + + return DPP_OK; +} + +#if 0 +/***********************************************************/ +/** 配置授权丢弃使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param all_drop_en 所有授权丢弃使能:1:允许丢弃所有授权;0:仅允许丢弃拥塞授权 +* @param drop_en 授权丢弃使能:1:允许丢弃授权;0:禁止丢弃授权 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/23 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crbal_drop_en_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 all_drop_en, + ZXIC_UINT32 drop_en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CFGMT_QSCH_CRBAL_DROP_EN_T crbal_drop_en = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, all_drop_en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, drop_en, 0, 1); + + crbal_drop_en.cfgmt_qsch_all_crbal_drop_en = all_drop_en; + crbal_drop_en.cfgmt_qsch_crbal_drop_en = drop_en; + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_QSCH_CRBAL_DROP_ENr, + 0, + 0, + &crbal_drop_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 获得授权丢弃使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_all_drop_en 所有授权丢弃使能:1:允许丢弃所有授权;0:仅允许丢弃拥塞授权 +* @param p_drop_en 授权丢弃使能:1:允许丢弃授权;0:禁止丢弃授权 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/06/23 +************************************************************/ +DPP_STATUS dpp_tm_qmu_crbal_drop_en_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 *p_all_drop_en, + ZXIC_UINT32 *p_drop_en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CFGMT_QSCH_CRBAL_DROP_EN_T crbal_drop_en = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_all_drop_en); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_drop_en); + + rc = dpp_reg_read(dev_id, + ETM_QMU_CFGMT_QSCH_CRBAL_DROP_ENr, + 0, + 0, + &crbal_drop_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + *p_all_drop_en = crbal_drop_en.cfgmt_qsch_all_crbal_drop_en; + *p_drop_en = crbal_drop_en.cfgmt_qsch_crbal_drop_en; + + return DPP_OK; +} + + +/***********************************************************/ +/** 获取特定队列发送的crs normal的个数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param 注 须先设置统计的特定队列 +* @param +* @return +* @remark 无 +* @see +* @author yjd @date 2015/07/09 +************************************************************/ +DPP_STATUS dpp_tm_qmu_spec_q_crs_normal_cnt(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_que_crs_normal_cnt) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_SPEC_Q_CRS_NORMAL_CNT_T crs_normal_cnt; + + rc = dpp_reg_read(dev_id, + ETM_QMU_SPEC_Q_CRS_NORMAL_CNTr, + 0, + 0, + &crs_normal_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + *p_que_crs_normal_cnt = crs_normal_cnt.spec_q_crs_normal_cnt; + return DPP_OK; +} + +/***********************************************************/ +/** 获取特定队列发送的crs off的个数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param 注 须先设置统计的特定队列 +* @param +* @return +* @remark 无 +* @see +* @author yjd @date 2015/07/09 +************************************************************/ +DPP_STATUS dpp_tm_qmu_spec_q_crs_off_cnt(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_que_crs_off_cnt) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_SPEC_Q_CRS_OFF_CNT_T crs_off_cnt; + + rc = dpp_reg_read(dev_id, + ETM_QMU_SPEC_Q_CRS_OFF_CNTr, + 0, + 0, + &crs_off_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + *p_que_crs_off_cnt = crs_off_cnt.spec_q_crs_off_cnt; + return DPP_OK; +} + +#endif +/***********************************************************/ +/**设置自然拥塞反压门限值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param +* @return +* @remark 无 +* @see +* @author yjd @date 2015/07/16 +************************************************************/ +DPP_STATUS dpp_tm_qmu_qcfg_csch_congest_th_set(DPP_DEV_T *dev, ZXIC_UINT32 port_id, ZXIC_UINT32 qmu_congest_th) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_CSCH_CONGEST_TH_T qcfg_csch_congest_th = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), port_id, 0, DPP_TM_PP_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), qmu_congest_th, 0, 0x1ffff); + + qcfg_csch_congest_th.qcfg_csch_congest_th = qmu_congest_th; + rc = dpp_reg_write(dev, + ETM_QMU_QCFG_CSCH_CONGEST_THr, + 0, + port_id, + &qcfg_csch_congest_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/**获取自然拥塞反压门限值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param +* @return +* @remark 无 +* @see +* @author yjd @date 2015/07/16 +************************************************************/ +DPP_STATUS dpp_tm_qmu_qcfg_csch_congest_th_get(DPP_DEV_T *dev, ZXIC_UINT32 port_id, ZXIC_UINT32 *p_qmu_congest_th) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_CSCH_CONGEST_TH_T qcfg_csch_congest_th = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_qmu_congest_th); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), port_id, 0, DPP_TM_PP_NUM - 1); + + rc = dpp_reg_read(dev, + ETM_QMU_QCFG_CSCH_CONGEST_THr, + 0, + port_id, + &qcfg_csch_congest_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_qmu_congest_th = qcfg_csch_congest_th.qcfg_csch_congest_th; + + return DPP_OK; +} + +/***********************************************************/ +/**设置CMD_SCH分优先级反压门限值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param +* @return +* @remark 无 +* @see +* @author yjd @date 2015/07/16 +************************************************************/ +DPP_STATUS dpp_tm_qmu_qcfg_csch_sp_fc_th_set(DPP_DEV_T *dev, ZXIC_UINT32 port_id, ZXIC_UINT32 q_pri, ZXIC_UINT32 qmu_sp_fc_th) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 index = 0; + DPP_ETM_QMU_QCFG_CSCH_SP_FC_TH_T qcfg_csch_sp_fc_th = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), port_id, 0, DPP_TM_PP_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), q_pri, 0, 4); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), qmu_sp_fc_th, 0, 0x1ffff); + + index = port_id * 5 + q_pri; + qcfg_csch_sp_fc_th.qcfg_csch_sp_fc_th = qmu_sp_fc_th; + + rc = dpp_reg_write(dev, + ETM_QMU_QCFG_CSCH_SP_FC_THr, + 0, + index, + &qcfg_csch_sp_fc_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/**获取自然拥塞反压门限值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param +* @return +* @remark 无 +* @see +* @author yjd @date 2015/07/16 +************************************************************/ +DPP_STATUS dpp_tm_qmu_qcfg_csch_sp_fc_th_get(DPP_DEV_T *dev, ZXIC_UINT32 port_id, ZXIC_UINT32 q_pri, ZXIC_UINT32 *p_qmu_sp_fc_th) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 index = 0; + DPP_ETM_QMU_QCFG_CSCH_SP_FC_TH_T qcfg_csch_sp_fc_th = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), port_id, 0, DPP_TM_PP_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), q_pri, 0, 4); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_qmu_sp_fc_th); + + index = port_id * 5 + q_pri; + + rc = dpp_reg_read(dev, + ETM_QMU_QCFG_CSCH_SP_FC_THr, + 0, + index, + &qcfg_csch_sp_fc_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_qmu_sp_fc_th = qcfg_csch_sp_fc_th.qcfg_csch_sp_fc_th; + + return DPP_OK; +} + +#if 0 +/***********************************************************/ +/**每隔10s获取crs状态的个数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param +* @return +* @remark 无 +* @see +* @author zmy @date 2015/08/07 +************************************************************/ + +DPP_STATUS dpp_tm_crs_statics(ZXIC_UINT32 dev_id, ZXIC_UINT32 que_id) +{ + DPP_STATUS rc = DPP_OK; + DPP_TM_CNT_MODE_T que_get_mode = {0}; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 q_crs_normal_cnt = 0; + ZXIC_UINT32 q_crs_off_cnt = 0; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, que_id, 0, DPP_ETM_Q_NUM - 1); + + rc = dpp_tm_cfgmt_cnt_mode_get(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_get"); + que_get_mode.count_rd_mode = 1; + + rc = dpp_tm_cfgmt_cnt_mode_set(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_set"); + + rc = dpp_tm_qmu_spec_qnum_set(dev_id, que_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_spec_qnum_set"); + rc = dpp_tm_qmu_spec_q_crs_normal_cnt(dev_id, &q_crs_normal_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_spec_q_crs_normal_cnt"); + rc = dpp_tm_qmu_spec_q_crs_off_cnt(dev_id, &q_crs_off_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_spec_q_crs_off_cnt"); + + for (i = 0; i <= 2; i++) + { + zxic_comm_sleep(10000); + rc = dpp_tm_qmu_spec_q_crs_normal_cnt(dev_id, &q_crs_normal_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_spec_q_crs_normal_cnt"); + ZXIC_COMM_PRINT("q_crs_normal_cnt is %d\n ", q_crs_normal_cnt); + + rc = dpp_tm_qmu_spec_q_crs_off_cnt(dev_id, &q_crs_off_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_spec_q_crs_off_cnt"); + ZXIC_COMM_PRINT("q_crs_off_cnt is %d\n ", q_crs_off_cnt); + } + + rc = dpp_tm_cfgmt_cnt_mode_get(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_get"); + que_get_mode.count_rd_mode = 0; + + rc = dpp_tm_cfgmt_cnt_mode_set(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_set"); + + return DPP_OK; +} + + + +/***********************************************************/ +/** 统计QMU发送和CRDT模块指定授权流接收的CRS计数(10s内) +* @param dev_id 设备编号 +* @param que_id QMU队列号 +* @param ackflow_id 授权流号 +* @param valid_flag 0:队列发送和授权流接收都统计; 1:只关注队列发送,2:只关注授权流接收。 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2017/05/12 +************************************************************/ +DPP_STATUS dpp_tm_crs_cnt_prt(ZXIC_UINT32 dev_id, ZXIC_UINT32 que_id, ZXIC_UINT32 ackflow_id, ZXIC_UINT32 valid_flag) +{ + DPP_STATUS rc = DPP_OK; + DPP_TM_CNT_MODE_T que_get_mode = {0}; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 q_crs_normal_cnt = 0; + ZXIC_UINT32 q_crs_off_cnt = 0; + ZXIC_UINT32 crdt_crs_que_id_index = 0; + ZXIC_UINT32 all_crs_normal_cnt_index = 0; + ZXIC_UINT32 all_crs_off_cnt_index = 0; + ZXIC_UINT32 que_crs_normal_cnt_index = 0; + ZXIC_UINT32 que_crd_off_cnt_index = 0; + ZXIC_UINT32 crs_end_state_index = 0; + + + + /* 结构体变量定义 */ + DPP_ETM_CRDT_CRS_QUE_ID_T crdt_crs_que_id = {0}; + DPP_ETM_CRDT_FIFO_OUT_ALL_CRS_NORMAL_CNT_T all_crs_normal_cnt = {0}; + DPP_ETM_CRDT_FIFO_OUT_ALL_CRS_OFF_CNT_T all_crs_off_cnt = {0}; + DPP_ETM_CRDT_FIFO_OUT_QUE_CRS_NORMAL_CNT_T que_crs_normal_cnt = {0}; + DPP_ETM_CRDT_FIFO_OUT_QUE_CRS_OFF_CNT_T que_crd_off_cnt = {0}; + DPP_ETM_CRDT_QMU_CRS_END_STATE_T crs_end_state = {0}; + + crdt_crs_que_id_index = ETM_CRDT_CRS_QUE_IDr; + all_crs_normal_cnt_index = ETM_CRDT_FIFO_OUT_ALL_CRS_NORMAL_CNTr; + all_crs_off_cnt_index = ETM_CRDT_FIFO_OUT_ALL_CRS_OFF_CNTr; + que_crs_normal_cnt_index = ETM_CRDT_FIFO_OUT_QUE_CRS_NORMAL_CNTr; + que_crd_off_cnt_index = ETM_CRDT_FIFO_OUT_QUE_CRS_OFF_CNTr; + crs_end_state_index = ETM_CRDT_QMU_CRS_END_STATEr; + + if (0 == valid_flag) + { + /* 设置统计CRDT CRS 接收个数的队列号 */ + crdt_crs_que_id.crs_que_id = ackflow_id; + rc = dpp_reg_write(dev_id, + crdt_crs_que_id_index, + 0, + 0, + &crdt_crs_que_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + + /* 1.先配置读清 */ + rc = dpp_tm_cfgmt_cnt_mode_get(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_get"); + que_get_mode.count_rd_mode = 1; + + rc = dpp_tm_cfgmt_cnt_mode_set(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_set"); + + /* 队列发送crs读清 */ + + rc = dpp_tm_qmu_spec_qnum_set(dev_id, que_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_spec_qnum_set"); + rc = dpp_tm_qmu_spec_q_crs_normal_cnt(dev_id, &q_crs_normal_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_spec_q_crs_normal_cnt"); + rc = dpp_tm_qmu_spec_q_crs_off_cnt(dev_id, &q_crs_off_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_spec_q_crs_off_cnt"); + + /* crdt接收crs读清 */ + rc = dpp_tm_crdt_clr_diag(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_crdt_clr_diag"); + + + /* 2.连读两次统计CRS发送和接收 */ + for (i = 0; i < 2; i++) + { + zxic_comm_sleep(10000); + + ZXIC_COMM_PRINT("------(%d th)qmu_send & crdt_recv crs_cnt in 10s------\n ", i + 1); + /* 统计CRS发送 */ + rc = dpp_tm_qmu_spec_q_crs_normal_cnt(dev_id, &q_crs_normal_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_spec_q_crs_normal_cnt"); + ZXIC_COMM_PRINT("que_id(0x%08x)qmu_send_crs_normal_cnt: 0x%08x\n ", que_id, q_crs_normal_cnt); + + rc = dpp_tm_qmu_spec_q_crs_off_cnt(dev_id, &q_crs_off_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_spec_q_crs_off_cnt"); + ZXIC_COMM_PRINT("que_id(0x%08x)qmu_send_crs_off_cnt: 0x%08x\n ", que_id, q_crs_off_cnt); + + /* 统计CRS接收 */ + + /* 统计CRDT接收到的CRS off总数 */ + rc = dpp_reg_read(dev_id, + all_crs_off_cnt_index, + 0, + 0, + &all_crs_off_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + /* 统计CRDT指定队列接收到的CRS off总数 */ + rc = dpp_reg_read(dev_id, + que_crd_off_cnt_index, + 0, + 0, + &que_crd_off_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + /* 统计CRDT接收到的CRS normal总数 */ + rc = dpp_reg_read(dev_id, + all_crs_normal_cnt_index, + 0, + 0, + &all_crs_normal_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + + + /* 统计CRDT指定队列接收到的CRS normal总数 */ + rc = dpp_reg_read(dev_id, + que_crs_normal_cnt_index, + 0, + 0, + &que_crs_normal_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + + + /* 统计CRDT指定队列接收到的crs最后的状态 */ + rc = dpp_reg_read(dev_id, + crs_end_state_index, + 0, + 0, + &crs_end_state); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + /* crdt接收crs读清 */ + rc = dpp_tm_crdt_clr_diag(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_crdt_clr_diag"); + + /* 打印统计信息 */ + ZXIC_COMM_PRINT("crdt_recv_all_crs_normal_cnt: 0x%08x\n ", all_crs_normal_cnt.fifo_out_all_crs_normal_cnt); + ZXIC_COMM_PRINT("crdt_recv_all_crs_off_cnt: 0x%08x\n ", all_crs_off_cnt.fifo_out_all_crs_off_cnt); + ZXIC_COMM_PRINT("ackflow_id(0x%08x)recv_crs_normal_cnt: 0x%08x\n ", ackflow_id, que_crs_normal_cnt.fifo_out_que_crs_normal_cnt); + ZXIC_COMM_PRINT("ackflow_id(0x%08x)recv_crs_off_cnt: 0x%08x\n ", ackflow_id, que_crd_off_cnt.fifo_out_que_crs_off_cnt); + ZXIC_COMM_PRINT("ackflow_id(0x%08x)recv_crs_end_state: %d\n ", ackflow_id, crs_end_state.qmu_crs_end_state); + + } + + /* 3.配置成crs非读清 */ + rc = dpp_tm_cfgmt_cnt_mode_get(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_get"); + que_get_mode.count_rd_mode = 0; + + rc = dpp_tm_cfgmt_cnt_mode_set(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_set"); + + } + else if (1 == valid_flag) + { + /* 1.先配置读清 */ + rc = dpp_tm_cfgmt_cnt_mode_get(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_get"); + que_get_mode.count_rd_mode = 1; + + rc = dpp_tm_cfgmt_cnt_mode_set(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_set"); + + /* 队列发送crs读清 */ + + rc = dpp_tm_qmu_spec_qnum_set(dev_id, que_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_spec_qnum_set"); + rc = dpp_tm_qmu_spec_q_crs_normal_cnt(dev_id, &q_crs_normal_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_spec_q_crs_normal_cnt"); + rc = dpp_tm_qmu_spec_q_crs_off_cnt(dev_id, &q_crs_off_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_spec_q_crs_off_cnt"); + + /* 2.连读两次统计CRS发送和接收 */ + for (i = 0; i < 2; i++) + { + zxic_comm_sleep(10000); + + ZXIC_COMM_PRINT("------(%d th)qmu_send crs_cnt in 10s------\n ", i + 1); + /* 统计CRS发送 */ + rc = dpp_tm_qmu_spec_q_crs_normal_cnt(dev_id, &q_crs_normal_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_spec_q_crs_normal_cnt"); + ZXIC_COMM_PRINT("que_id(0x%08x)qmu_send_crs_normal_cnt: 0x%08x\n ", que_id, q_crs_normal_cnt); + + rc = dpp_tm_qmu_spec_q_crs_off_cnt(dev_id, &q_crs_off_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_spec_q_crs_off_cnt"); + ZXIC_COMM_PRINT("que_id(0x%08x)qmu_send_crs_off_cnt: 0x%08x\n ", que_id, q_crs_off_cnt); + } + + /* 3.配置成crs非读清 */ + rc = dpp_tm_cfgmt_cnt_mode_get(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_get"); + que_get_mode.count_rd_mode = 0; + + rc = dpp_tm_cfgmt_cnt_mode_set(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_set"); + } + + else if (2 == valid_flag) + { + + /* 设置统计CRDT CRS 接收个数的队列号 */ + crdt_crs_que_id.crs_que_id = ackflow_id; + rc = dpp_reg_write(dev_id, + crdt_crs_que_id_index, + 0, + 0, + &crdt_crs_que_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + + /* 2.连读两次统计CRS发送和接收 */ + for (i = 0; i < 2; i++) + { + + /* crdt接收crs读清 */ + rc = dpp_tm_crdt_clr_diag(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_crdt_clr_diag"); + + zxic_comm_sleep(10000); + + ZXIC_COMM_PRINT("------(%d th)crdt_recv crs_cnt in 10s------\n ", i + 1); + + /* 统计CRS接收 */ + /* 统计CRDT指定队列接收到的CRS off总数 */ + rc = dpp_reg_read(dev_id, + que_crd_off_cnt_index, + 0, + 0, + &que_crd_off_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + /* 统计CRDT接收到的CRS off 总数 */ + rc = dpp_reg_read(dev_id, + all_crs_off_cnt_index, + 0, + 0, + &all_crs_off_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + /* 统计CRDT接收到的CRS normal总数 */ + rc = dpp_reg_read(dev_id, + all_crs_normal_cnt_index, + 0, + 0, + &all_crs_normal_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + + + /* 统计CRDT指定队列接收到的CRS normal总数 */ + rc = dpp_reg_read(dev_id, + que_crs_normal_cnt_index, + 0, + 0, + &que_crs_normal_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + + /* 统计CRDT指定队列接收到的crs最后的状态 */ + rc = dpp_reg_read(dev_id, + crs_end_state_index, + 0, + 0, + &crs_end_state); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + /* crdt接收crs读清 */ + rc = dpp_tm_crdt_clr_diag(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_crdt_clr_diag"); + /* 打印统计信息 */ + ZXIC_COMM_PRINT("crdt_recv_all_crs_normal_cnt: 0x%08x\n ", all_crs_normal_cnt.fifo_out_all_crs_normal_cnt); + ZXIC_COMM_PRINT("crdt_recv_all_crs_off_cnt: 0x%08x\n ", all_crs_off_cnt.fifo_out_all_crs_off_cnt); + ZXIC_COMM_PRINT("ackflow_id(0x%08x)recv_crs_normal_cnt: 0x%08x\n ", ackflow_id, que_crs_normal_cnt.fifo_out_que_crs_normal_cnt); + ZXIC_COMM_PRINT("ackflow_id(0x%08x)recv_crs_off_cnt: 0x%08x\n ", ackflow_id, que_crd_off_cnt.fifo_out_que_crs_off_cnt); + ZXIC_COMM_PRINT("ackflow_id(0x%08x)recv_crs_end_state: %d\n ", ackflow_id, crs_end_state.qmu_crs_end_state); + } + + } + else + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "dpp_tm_crs_cnt_prt:valid_flag_error!!: 0: print crs of que and ackflow;1:print que crs only; 2:print ackflow crs only!\n"); + + } + + + return DPP_OK; + +} + +/***********************************************************/ +/** 带停流的统计QMU发送和CRDT模块指定授权流接收的CRS计数 +* @param dev_id 设备编号 +* @param que_id QMU队列号 +* @param ackflow_id 授权流号 +* @param valid_flag 0:默认队列发送和授权流接收都统计,此时队列授权都在本板; +* 1:只关注队列发送,2:只关注授权流接收,需要与源端队列停流配合使用, + 先停流,运行该函数;或者直接不停流得到的是某段时间的计数。 +* @param sleep_time 统计多长时间内的crs计数 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2017/05/12 +************************************************************/ +DPP_STATUS dpp_tm_crs_cnt_prt_1(ZXIC_UINT32 dev_id, + ZXIC_UINT32 que_id, + ZXIC_UINT32 ackflow_id, + ZXIC_UINT32 valid_flag, + ZXIC_UINT32 sleep_time) +{ + DPP_STATUS rc = DPP_OK; + DPP_TM_CNT_MODE_T que_get_mode = {0}; + ZXIC_UINT32 flow_td_th = 0; + ZXIC_UINT32 q_crs_normal_cnt = 0; + ZXIC_UINT32 q_crs_off_cnt = 0; + ZXIC_UINT32 crdt_crs_que_id_index = 0; + ZXIC_UINT32 all_crs_normal_cnt_index = 0; + ZXIC_UINT32 all_crs_off_cnt_index = 0; + ZXIC_UINT32 que_crs_normal_cnt_index = 0; + ZXIC_UINT32 que_crd_off_cnt_index = 0; + ZXIC_UINT32 crs_end_state_index = 0; + + /* 结构体变量定义 */ + DPP_ETM_CRDT_CRS_QUE_ID_T crdt_crs_que_id = {0}; + DPP_ETM_CRDT_FIFO_OUT_ALL_CRS_NORMAL_CNT_T all_crs_normal_cnt = {0}; + DPP_ETM_CRDT_FIFO_OUT_ALL_CRS_OFF_CNT_T all_crs_off_cnt = {0}; + DPP_ETM_CRDT_FIFO_OUT_QUE_CRS_NORMAL_CNT_T que_crs_normal_cnt = {0}; + DPP_ETM_CRDT_FIFO_OUT_QUE_CRS_OFF_CNT_T que_crd_off_cnt = {0}; + DPP_ETM_CRDT_QMU_CRS_END_STATE_T crs_end_state = {0}; + + crdt_crs_que_id_index = ETM_CRDT_CRS_QUE_IDr; + all_crs_normal_cnt_index = ETM_CRDT_FIFO_OUT_ALL_CRS_NORMAL_CNTr; + all_crs_off_cnt_index = ETM_CRDT_FIFO_OUT_ALL_CRS_OFF_CNTr; + que_crs_normal_cnt_index = ETM_CRDT_FIFO_OUT_QUE_CRS_NORMAL_CNTr; + que_crd_off_cnt_index = ETM_CRDT_FIFO_OUT_QUE_CRS_OFF_CNTr; + crs_end_state_index = ETM_CRDT_QMU_CRS_END_STATEr; + + rc = dpp_tm_cgavd_td_th_get(dev_id, QUEUE_LEVEL, que_id, &flow_td_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_td_th_get"); + + if (0 == valid_flag) + { + + + /* 设置统计CRDT CRS 接收个数的队列号 */ + crdt_crs_que_id.crs_que_id = ackflow_id; + rc = dpp_reg_write(dev_id, + crdt_crs_que_id_index, + 0, + 0, + &crdt_crs_que_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_tm_cgavd_td_th_set(dev_id, QUEUE_LEVEL, que_id, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_td_th_set"); + + /* 1.停流配置读清 */ + rc = dpp_tm_cfgmt_cnt_mode_get(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_get"); + que_get_mode.count_rd_mode = 1; + + rc = dpp_tm_cfgmt_cnt_mode_set(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_set"); + + /* 队列发送crs读清 */ + + rc = dpp_tm_qmu_spec_qnum_set(dev_id, que_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_spec_qnum_set"); + rc = dpp_tm_qmu_spec_q_crs_normal_cnt(dev_id, &q_crs_normal_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_spec_q_crs_normal_cnt"); + rc = dpp_tm_qmu_spec_q_crs_off_cnt(dev_id, &q_crs_off_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_spec_q_crs_off_cnt"); + + /* crdt接收crs读清 */ + rc = dpp_tm_crdt_clr_diag(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_crdt_clr_diag"); + + + /* 2.统计CRS发送和接收 */ + rc = dpp_tm_cgavd_td_th_set(dev_id, QUEUE_LEVEL, que_id, flow_td_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_td_th_set"); + + + zxic_comm_sleep(sleep_time); + + rc = dpp_tm_qmu_spec_q_crs_off_cnt(dev_id, &q_crs_off_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_spec_q_crs_off_cnt"); + + /* 统计CRDT接收到的CRS off总数 */ + rc = dpp_reg_read(dev_id, + all_crs_off_cnt_index, + 0, + 0, + &all_crs_off_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + /* 统计CRDT指定队列接收到的CRS off总数 */ + rc = dpp_reg_read(dev_id, + que_crd_off_cnt_index, + 0, + 0, + &que_crd_off_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_tm_cgavd_td_th_set(dev_id, QUEUE_LEVEL, que_id, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_td_th_set"); + zxic_comm_sleep(1000); + + /* 统计CRS发送 */ + rc = dpp_tm_qmu_spec_q_crs_normal_cnt(dev_id, &q_crs_normal_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_spec_q_crs_normal_cnt"); + ZXIC_COMM_PRINT("que_id(0x%08x)qmu_send_crs_normal_cnt: 0x%08x\n ", que_id, q_crs_normal_cnt); + ZXIC_COMM_PRINT("que_id(0x%08x)qmu_send_crs_off_cnt: 0x%08x\n ", que_id, q_crs_off_cnt); + /* 统计CRS接收 */ + /* 统计CRDT接收到的CRS normal总数 */ + rc = dpp_reg_read(dev_id, + all_crs_normal_cnt_index, + 0, + 0, + &all_crs_normal_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + /* 统计CRDT指定队列接收到的CRS normal总数 */ + rc = dpp_reg_read(dev_id, + que_crs_normal_cnt_index, + 0, + 0, + &que_crs_normal_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + + + /* 统计CRDT指定队列接收到的crs最后的状态 */ + rc = dpp_reg_read(dev_id, + crs_end_state_index, + 0, + 0, + &crs_end_state); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + /* crdt接收crs读清 */ + rc = dpp_tm_crdt_clr_diag(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_crdt_clr_diag"); + /* 打印统计信息 */ + ZXIC_COMM_PRINT("crdt_recv_all_crs_normal_cnt: 0x%08x\n", all_crs_normal_cnt.fifo_out_all_crs_normal_cnt); + ZXIC_COMM_PRINT("crdt_recv_all_crs_off_cnt: 0x%08x\n", all_crs_off_cnt.fifo_out_all_crs_off_cnt); + ZXIC_COMM_PRINT("ackflow_id(0x%08x)recv_crs_normal_cnt: 0x%08x\n", ackflow_id, que_crs_normal_cnt.fifo_out_que_crs_normal_cnt); + ZXIC_COMM_PRINT("ackflow_id(0x%08x)recv_crs_off_cnt: 0x%08x\n", ackflow_id, que_crd_off_cnt.fifo_out_que_crs_off_cnt); + ZXIC_COMM_PRINT("ackflow_id(0x%08x)recv_crs_end_state: %d\n", ackflow_id, crs_end_state.qmu_crs_end_state); + + + + /* 4.配置成crs非读清 */ + rc = dpp_tm_cfgmt_cnt_mode_get(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_get"); + que_get_mode.count_rd_mode = 0; + + rc = dpp_tm_cfgmt_cnt_mode_set(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_set"); + + /* 5.恢复通流 */ + rc = dpp_tm_cgavd_td_th_set(dev_id, 0, que_id, flow_td_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_td_th_set"); + + } + else if (1 == valid_flag) /* 仅统计停流清零再发流该段时间发送的CRS */ + { + rc = dpp_tm_cgavd_td_th_set(dev_id, QUEUE_LEVEL, que_id, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_td_th_set"); + + /* 1.停流配置读清 */ + rc = dpp_tm_cfgmt_cnt_mode_get(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_get"); + que_get_mode.count_rd_mode = 1; + + rc = dpp_tm_cfgmt_cnt_mode_set(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_set"); + + /* 队列发送crs读清 */ + + rc = dpp_tm_qmu_spec_qnum_set(dev_id, que_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_spec_qnum_set"); + rc = dpp_tm_qmu_spec_q_crs_normal_cnt(dev_id, &q_crs_normal_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_spec_q_crs_normal_cnt"); + rc = dpp_tm_qmu_spec_q_crs_off_cnt(dev_id, &q_crs_off_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_spec_q_crs_off_cnt"); + + /* 2.开流设定时间后停流统计CRS发送 */ + rc = dpp_tm_cgavd_td_th_set(dev_id, QUEUE_LEVEL, que_id, flow_td_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_td_th_set"); + + + zxic_comm_sleep(sleep_time); + + rc = dpp_tm_qmu_spec_q_crs_off_cnt(dev_id, &q_crs_off_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_spec_q_crs_off_cnt"); + + rc = dpp_tm_cgavd_td_th_set(dev_id, QUEUE_LEVEL, que_id, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_td_th_set"); + zxic_comm_sleep(1000); + + /* 统计CRS发送 */ + rc = dpp_tm_qmu_spec_q_crs_normal_cnt(dev_id, &q_crs_normal_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_spec_q_crs_normal_cnt"); + ZXIC_COMM_PRINT("que_id(0x%08x)qmu_send_crs_normal_cnt: 0x%08x\n ", que_id, q_crs_normal_cnt); + ZXIC_COMM_PRINT("que_id(0x%08x)qmu_send_crs_off_cnt: 0x%08x\n ", que_id, q_crs_off_cnt); + + /* 3.配置成crs非读清 */ + rc = dpp_tm_cfgmt_cnt_mode_get(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_get"); + que_get_mode.count_rd_mode = 0; + + rc = dpp_tm_cfgmt_cnt_mode_set(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_set"); + + /* 4.恢复通流 */ + rc = dpp_tm_cgavd_td_th_set(dev_id, QUEUE_LEVEL, que_id, flow_td_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_td_th_set"); + } + + else if (2 == valid_flag) /* 仅统计接收,需要源端停流之后运行。*/ + { + /* 设置统计CRDT CRS 接收个数的队列号 */ + crdt_crs_que_id.crs_que_id = ackflow_id; + rc = dpp_reg_write(dev_id, + crdt_crs_que_id_index, + 0, + 0, + &crdt_crs_que_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + /* 1.停流配置读清 */ + /* crdt接收crs读清 */ + rc = dpp_tm_crdt_clr_diag(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_crdt_clr_diag"); + + zxic_comm_sleep(sleep_time); + + + /* 统计CRDT接收到的CRS off总数 */ + rc = dpp_reg_read(dev_id, + all_crs_off_cnt_index, + 0, + 0, + &all_crs_off_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + /* 统计CRDT指定队列接收到的CRS off总数 */ + rc = dpp_reg_read(dev_id, + que_crd_off_cnt_index, + 0, + 0, + &que_crd_off_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + + /* 统计CRS接收 */ + /* 统计CRDT接收到的CRS normal总数 */ + rc = dpp_reg_read(dev_id, + all_crs_normal_cnt_index, + 0, + 0, + &all_crs_normal_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + /* 统计CRDT指定队列接收到的CRS normal总数 */ + rc = dpp_reg_read(dev_id, + que_crs_normal_cnt_index, + 0, + 0, + &que_crs_normal_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + + + /* 统计CRDT指定队列接收到的crs最后的状态 */ + rc = dpp_reg_read(dev_id, + crs_end_state_index, + 0, + 0, + &crs_end_state); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + /* crdt接收crs读清 */ + rc = dpp_tm_crdt_clr_diag(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_crdt_clr_diag"); + /* 打印统计信息 */ + ZXIC_COMM_PRINT("crdt_recv_all_crs_normal_cnt: 0x%08x\n", all_crs_normal_cnt.fifo_out_all_crs_normal_cnt); + ZXIC_COMM_PRINT("crdt_recv_all_crs_off_cnt: 0x%08x\n", all_crs_off_cnt.fifo_out_all_crs_off_cnt); + ZXIC_COMM_PRINT("ackflow_id(0x%08x)recv_crs_normal_cnt: 0x%08x\n", ackflow_id, que_crs_normal_cnt.fifo_out_que_crs_normal_cnt); + ZXIC_COMM_PRINT("ackflow_id(0x%08x)recv_crs_off_cnt: 0x%08x\n", ackflow_id, que_crd_off_cnt.fifo_out_que_crs_off_cnt); + ZXIC_COMM_PRINT("ackflow_id(0x%08x)recv_crs_end_state: %d\n", ackflow_id, crs_end_state.qmu_crs_end_state); + + + } + else + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "dpp_tm_crs_cnt_prt_1:valid_flag_error!!: 0: print crs of que and ackflow;1:print que crs only; 2:print ackflow crs only\n"); + + } + + + return DPP_OK; + +} + + +/***********************************************************/ +/** 读取qlist入队及出队状态监控 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2015/08/26 +************************************************************/ +DPP_STATUS dpp_tm_qmu_qlist_state_query(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_QMU_QLIST_STATE_QUERY_T qcfg_qmu_qlist_state_query = {0}; + + + rc = dpp_reg_read(dev_id, + ETM_QMU_QCFG_QMU_QLIST_STATE_QUERYr, + 0, + 0, + &qcfg_qmu_qlist_state_query); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + ZXIC_COMM_PRINT("pkt_age_req_fifo_afull : %d\n", qcfg_qmu_qlist_state_query.pkt_age_req_fifo_afull); + ZXIC_COMM_PRINT("rd_release_fwft_afull : %d\n", qcfg_qmu_qlist_state_query.rd_release_fwft_afull); + ZXIC_COMM_PRINT("drop_imem_fwft_afull : %d\n", qcfg_qmu_qlist_state_query.drop_imem_fwft_afull); + ZXIC_COMM_PRINT("pkt_age_req_fifo_empty : %d\n", qcfg_qmu_qlist_state_query.pkt_age_req_fifo_empty); + ZXIC_COMM_PRINT("rd_release_fwft_empty : %d\n", qcfg_qmu_qlist_state_query.rd_release_fwft_empty); + ZXIC_COMM_PRINT("drop_imem_fwft_empty : %d\n", qcfg_qmu_qlist_state_query.drop_imem_fwft_empty); + ZXIC_COMM_PRINT("mmu_qmu_sop_rd_rdy : %d\n", qcfg_qmu_qlist_state_query.mmu_qmu_sop_rd_rdy); + ZXIC_COMM_PRINT("big_fifo_empty : %d\n", qcfg_qmu_qlist_state_query.big_fifo_empty); + ZXIC_COMM_PRINT("qmu_mmu_rd_release_rdy : %d\n", qcfg_qmu_qlist_state_query.qmu_mmu_rd_release_rdy); + ZXIC_COMM_PRINT("xsw_qmu_crs_rdy : %d\n", qcfg_qmu_qlist_state_query.xsw_qmu_crs_rdy); + ZXIC_COMM_PRINT("mmu_qmu_rdy : %d\n", qcfg_qmu_qlist_state_query.mmu_qmu_rdy); + ZXIC_COMM_PRINT("mmu_ql_wr_rdy : %d\n", qcfg_qmu_qlist_state_query.mmu_ql_wr_rdy); + ZXIC_COMM_PRINT("mmu_ql_rd_rdy : %d\n", qcfg_qmu_qlist_state_query.mmu_ql_rd_rdy); + ZXIC_COMM_PRINT("csw_ql_rdy : %d\n", qcfg_qmu_qlist_state_query.csw_ql_rdy); + ZXIC_COMM_PRINT("ql_init_done : %d\n", qcfg_qmu_qlist_state_query.ql_init_done); + ZXIC_COMM_PRINT("free_addr_ready : %d\n", qcfg_qmu_qlist_state_query.free_addr_ready); + ZXIC_COMM_PRINT("bank_group_afull : %d\n", qcfg_qmu_qlist_state_query.bank_group_afull); + ZXIC_COMM_PRINT("pds_fwft_empty : %d\n", qcfg_qmu_qlist_state_query.pds_fwft_empty); + ZXIC_COMM_PRINT("enq_rpt_fwft_afull : %d\n", qcfg_qmu_qlist_state_query.enq_rpt_fwft_afull); + + + return DPP_OK; +} + +#endif +/***********************************************************/ +/** 配置QMU流控计数模式 +* @param dev_id 设备号 +* @param tm_type 0-ETM,1-FTM +* @param mode 流控模式,0-电平流控;1-边沿流控 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/05/07 +************************************************************/ +DPP_STATUS dpp_tm_qmu_fc_cnt_mode_set(DPP_DEV_T *dev, ZXIC_UINT32 mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_FC_CNT_MODE_T fc_cnt_mode_reg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), mode, 0, 1); + + fc_cnt_mode_reg.fc_cnt_mode = mode; + rc = dpp_reg_write(dev, + ETM_QMU_FC_CNT_MODEr, + 0, + 0, + &fc_cnt_mode_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读取QMU流控计数模式 +* @param dev_id 设备号 +* @param tm_type 0-ETM,1-FTM +* @param p_mode 流控模式,0-电平流控;1-边沿流控 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/05/07 +************************************************************/ +DPP_STATUS dpp_tm_qmu_fc_cnt_mode_get(DPP_DEV_T *dev, ZXIC_UINT32 *p_mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_FC_CNT_MODE_T fc_cnt_mode_reg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_mode); + + rc = dpp_reg_read(dev, + ETM_QMU_FC_CNT_MODEr, + 0, + 0, + &fc_cnt_mode_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *p_mode = fc_cnt_mode_reg.fc_cnt_mode; + + return DPP_OK; +} + +/***********************************************************/ +/** 配置QMU需要检测流控的端口号 +* @param dev_id 设备号 +* @param tm_type 0-ETM,1-FTM +* @param port_id 端口号 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/05/07 +************************************************************/ +DPP_STATUS dpp_tm_qmu_observe_portfc_set(DPP_DEV_T *dev, ZXIC_UINT32 port_id) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_OBSERVE_PORTFC_SPEC_T observe_portfc_reg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), port_id, 0, DPP_TM_PP_NUM - 1); + + + observe_portfc_reg.observe_portfc_spec = port_id; + rc = dpp_reg_write(dev, + ETM_QMU_OBSERVE_PORTFC_SPECr, + 0, + 0, + &observe_portfc_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置QMU需要统计的队列号 +* @param dev_id 设备号 +* @param tm_type 0-ETM,1-FTM +* @param q_id 队列号 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/05/07 +************************************************************/ +DPP_STATUS dpp_tm_qmu_observe_qnum_set(DPP_DEV_T *dev, ZXIC_UINT32 q_id) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_OBSERVE_QNUM_SET_T observe_qnum_reg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), q_id, 0, DPP_ETM_Q_NUM - 1); + + observe_qnum_reg.observe_qnum_set = q_id; + rc = dpp_reg_write(dev, + ETM_QMU_OBSERVE_PORTFC_SPECr, + 0, + 0, + &observe_qnum_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置QMU需要统计的队列组 +* @param dev_id 设备号 +* @param tm_type 0-ETM,1-FTM +* @param batch_id 队列组 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/05/07 +************************************************************/ +DPP_STATUS dpp_tm_qmu_observe_batch_set(DPP_DEV_T *dev, ZXIC_UINT32 batch_id) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_OBSERVE_BATCH_SET_T observe_batch_reg = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), batch_id, 0, 7); + + observe_batch_reg.observe_batch_set = batch_id; + rc = dpp_reg_write(dev, + ETM_QMU_OBSERVE_BATCH_SETr, + 0, + 0, + &observe_batch_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/****************************************************************************** +*包老化配置 +* @param: dev_id: 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* aging_en: 包老化使能:1表示包老化功能使能;0表示包老化功能关闭。 +* aging_interval: 普通老化两次的间隔配置 +* aging_step_interval: 普通老化的老化时间的步进配置值 +* aging_start_qnum: 老化起始队列 +* aging_end_qnum: 老化结束队列 +* aging_req_aful_th: 普通老化FIFO的将满阈值 +* aging_pkt_num: 一次老化的包个数 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/05/10 +************************************************************/ +DPP_STATUS dpp_tm_qmu_pkt_aging_set(DPP_DEV_T *dev, + ZXIC_UINT32 aging_en, + ZXIC_UINT32 aging_interval, + ZXIC_UINT32 aging_step_interval, + ZXIC_UINT32 aging_start_qnum, + ZXIC_UINT32 aging_end_qnum, + ZXIC_UINT32 aging_pkt_num, + ZXIC_UINT32 aging_req_aful_th) +{ + /* 返回值变量定义 */ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 age_pkt_num_reg_index = 0; + ZXIC_UINT32 age_step_interval_reg_index = 0; + ZXIC_UINT32 age_interval_reg_index = 0; + ZXIC_UINT32 age_qnum_reg_index = 0; + ZXIC_UINT32 age_req_aful_th_reg_index = 0; + ZXIC_UINT32 age_en_reg_index = 0; + + /* 结构体变量定义 */ + DPP_ETM_QMU_CFGMT_QMU_PKT_AGE_EN_T cfg_age_en = {0}; + DPP_ETM_QMU_CFGMT_PKT_AGE_STEP_INTERVAL_T cfg_age_step_interval = {0}; + DPP_ETM_QMU_CFGMT_QMU_PKT_AGE_INTERVAL_T cfg_age_interval = {0}; + DPP_ETM_QMU_CFGMT_QMU_PKT_AGE_START_END_T cfg_age_qnum = {0}; + DPP_ETM_QMU_CFGMT_PKT_AGE_REQ_AFUL_TH_T cfg_age_req_aful_th = {0}; + DPP_ETM_QMU_CFGMT_AGE_PKT_NUM_T cfg_age_pkt_num = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), aging_en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), aging_step_interval, 0, 0xff); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), aging_interval, 0, 0xffff); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), aging_req_aful_th, 0, 0x3f); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), aging_pkt_num, 0, 0xf); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), aging_start_qnum, 0, DPP_ETM_Q_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), aging_end_qnum, 0, DPP_ETM_Q_NUM - 1); + age_pkt_num_reg_index = ETM_QMU_CFGMT_AGE_PKT_NUMr; + age_step_interval_reg_index = ETM_QMU_CFGMT_PKT_AGE_STEP_INTERVALr; + age_interval_reg_index = ETM_QMU_CFGMT_QMU_PKT_AGE_INTERVALr; + age_qnum_reg_index = ETM_QMU_CFGMT_QMU_PKT_AGE_START_ENDr; + age_req_aful_th_reg_index = ETM_QMU_CFGMT_PKT_AGE_REQ_AFUL_THr; + age_en_reg_index = ETM_QMU_CFGMT_QMU_PKT_AGE_ENr; + + cfg_age_en.cfgmt_qmu_pkt_age_en = aging_en; + cfg_age_step_interval.cfgmt_pkt_age_step_interval = aging_step_interval; + cfg_age_interval.cfgmt_qmu_pkt_age_interval = aging_interval; + cfg_age_qnum.cfgmt_qmu_pkt_age_start = aging_start_qnum; + cfg_age_qnum.cfgmt_qmu_pkt_age_end = aging_end_qnum; + cfg_age_req_aful_th.cfgmt_pkt_age_req_aful_th = aging_req_aful_th; + cfg_age_pkt_num.cfgmt_age_pkt_num = aging_pkt_num; + + + rc = dpp_reg_write(dev, + age_pkt_num_reg_index, + 0, + 0, + &cfg_age_pkt_num); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev, + age_step_interval_reg_index, + 0, + 0, + &cfg_age_step_interval); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev, + age_interval_reg_index, + 0, + 0, + &cfg_age_interval); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev, + age_qnum_reg_index, + 0, + 0, + &cfg_age_qnum); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev, + age_req_aful_th_reg_index, + 0, + 0, + &cfg_age_req_aful_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev, + age_en_reg_index, + 0, + 0, + &cfg_age_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/****************************************************************************** +*配置老化一个包的时间,一次老化一个包,老化队列范围为可配 +* @param: dev_id: 设备索引编号 +* @param tm_type 0: etm; 1: ftm; +* aging_en: 包老化使能:1表示包老化功能使能;0表示包老化功能关闭。 +* aging_time: 老化一个包的时间,单位ms + aging_que_start:老化起始队列 + aging_que_start:老化终止队列 +老化时间=2*aging_interval*step_interval*q_num +aging_interval = (aging_time * 600000) / (2 * 1 * DPP_TM_Q_NUM); +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/12/08 +************************************************************/ +DPP_STATUS dpp_tm_qmu_pkt_age_time_set(DPP_DEV_T *dev, + ZXIC_UINT32 aging_en, + ZXIC_UINT32 aging_time, + ZXIC_UINT32 aging_que_start, + ZXIC_UINT32 aging_que_end) +{ + /* 返回值变量定义 */ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 aging_interval = 0; + //DPP_CRM_CSR_PLL_CLK_SEL_T pll_clk_sel_t = {0}; + // ZXIC_UINT32 sys_clk = 0; + // ZXIC_UINT32 sys_clk_temp[8]={200,250,300,500,600,800,1000,1200}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), aging_en, 0, 1); + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), aging_que_start, 0, DPP_ETM_Q_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), aging_que_end, 0, DPP_ETM_Q_NUM - 1); +#if 0 + rc = dpp_reg_read(dev_id, + CRM_CSR_PLL_CLK_SELr, + 0, + 0, + &pll_clk_sel_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, pll_clk_sel_t.sys_clk_2x_sel, CRM_SYS_CLK_200M, CRM_SYS_CLK_INVALID - 1); + + sys_clk = sys_clk_temp[pll_clk_sel_t.sys_clk_2x_sel] / 2; + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, aging_time , sys_clk ); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, aging_time * sys_clk , DPP_TM_KILO_ULL); + aging_interval = (aging_time * sys_clk * DPP_TM_KILO_ULL * DPP_TM_KILO_ULL / 1000) / (2 * 1 * (aging_que_end - aging_que_start + 1)); +#endif + + + if (0 == aging_interval) + { + aging_interval = 1; /* 防止算出来的是小数,导致写入0 */ + } + + rc = dpp_tm_qmu_pkt_aging_set(dev, aging_en, aging_interval, 1, aging_que_start, aging_que_end, 1, 0xa); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_qmu_pkt_aging_set"); + + return DPP_OK; +} + +#if 0 +/***********************************************************/ +/** 获得队列空标志查询 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param qnum 配置的队列号 +* @param p_value 队列空标志查询 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author cy @date 2016/06/20 +************************************************************/ +DPP_STATUS dpp_tm_qlist_ept_flag_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 qnum, + ZXIC_UINT32 *p_value) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QCFG_QLIST_EPT_RD_T qcfg_qlist_ept_rd = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_value); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, qnum, 0, DPP_ETM_Q_NUM - 1); + + rc = dpp_reg_read(dev_id, + ETM_QMU_QCFG_QLIST_EPT_RDr, + 0, + qnum, + &qcfg_qlist_ept_rd); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + *p_value = qcfg_qlist_ept_rd.qcfg_qlist_ept_rd; + + return DPP_OK; +} + + +/***********************************************************/ +/** 获得队列深度计数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param qnum 配置的队列号 +* @param p_value 队列深度计数 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author cy @date 2016/06/20 +************************************************************/ +DPP_STATUS dpp_tm_qlist_r_bcnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 qnum, + ZXIC_UINT32 *p_value) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_QLIST_R_BCNT_T qlist_r_bcnt = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_value); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, qnum, 0, DPP_ETM_Q_NUM - 1); + + rc = dpp_reg_read(dev_id, + ETM_QMU_QLIST_R_BCNTr, + 0, + qnum, + &qlist_r_bcnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + *p_value = qlist_r_bcnt.qlist_r_bcnt; + + return DPP_OK; +} + +#endif +/***********************************************************/ +/** 配置pfc使能 +* @param dev_id 设备编号 +* @param pfc_en 配置的值,0-不使能pfc,1-使能pfc +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author lsy @date 2022/08/22 +************************************************************/ +DPP_STATUS dpp_tm_qmu_pfc_en_set(DPP_DEV_T *dev, ZXIC_UINT32 pfc_en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CFGMT_QMU_PFC_EN_T qmu_pfc_en = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), pfc_en, 0, 1); + + qmu_pfc_en.cfgmt_qmu_pfc_en = pfc_en; + rc = dpp_reg_write(dev, + ETM_QMU_CFGMT_QMU_PFC_ENr, + 0, + 0, + &qmu_pfc_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读取pfc使能 +* @param dev_id 设备编号 +* @param pfc_en 配置的值,0-不使能pfc,1-使能pfc +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author lsy @date 2022/08/22 +************************************************************/ +DPP_STATUS dpp_tm_qmu_pfc_en_get(DPP_DEV_T *dev, ZXIC_UINT32 *pfc_en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CFGMT_QMU_PFC_EN_T qmu_pfc_en = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), pfc_en); + + *pfc_en = 0xffffffff; + rc = dpp_reg_read(dev, + ETM_QMU_CFGMT_QMU_PFC_ENr, + 0, + 0, + &qmu_pfc_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *pfc_en = qmu_pfc_en.cfgmt_qmu_pfc_en; + + return DPP_OK; +} + +/***********************************************************/ +/** 配置端口pfc掩码 +* @param dev_id 设备编号 +* @param port_id 端口号:0~63 +* @param port_en 端口掩码配置,1pfc模式下该端口接收olif的优先级反压, +* 0pfc模式下该端口不接受olif的优先级反压,并将反压信号全部置1 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author lsy @date 2022/08/22 +************************************************************/ +DPP_STATUS dpp_tm_qmu_port_pfc_make_set(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + ZXIC_UINT32 port_en) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 value = 0; + DPP_ETM_QMU_CFGMT_QMU_PFC_MASK_1_T pfc_mask_31_0 = {0}; + DPP_ETM_QMU_CFGMT_QMU_PFC_MASK_2_T pfc_mask_63_32 = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), port_id, 0, DPP_TM_PP_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), port_en, 0, 1); + + if (port_id <= 31) + { + /* port_id:[0-31] */ + rc = dpp_reg_read(dev, + ETM_QMU_CFGMT_QMU_PFC_MASK_1r, + 0, + 0, + &pfc_mask_31_0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + value = pfc_mask_31_0.cfgmt_qmu_pfc_mask_1; + + if (port_en == 0) + { + value = value & (~(1u << port_id)); + } + else + { + value = value | (1u << port_id); + } + + pfc_mask_31_0.cfgmt_qmu_pfc_mask_1 = value; + + rc = dpp_reg_write(dev, + ETM_QMU_CFGMT_QMU_PFC_MASK_1r, + 0, + 0, + &pfc_mask_31_0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + } + else + { + /* port_id:[32-63] */ + rc = dpp_reg_read(dev, + ETM_QMU_CFGMT_QMU_PFC_MASK_2r, + 0, + 0, + &pfc_mask_63_32); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + value = pfc_mask_63_32.cfgmt_qmu_pfc_mask_2; + + if (port_en == 0) + { + value = value & (~(1u << (port_id - 32))); + } + else + { + value = value | (1u<< (port_id - 32)); + } + + pfc_mask_63_32.cfgmt_qmu_pfc_mask_2 = value; + + rc = dpp_reg_write(dev, + ETM_QMU_CFGMT_QMU_PFC_MASK_2r, + 0, + 0, + &pfc_mask_63_32); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + } + + return DPP_OK; +} + +/***********************************************************/ +/** 获得端口pfc掩码 +* @param dev_id 设备编号 +* @param port_id 端口号:0~63 +* @param port_en 端口掩码配置,1pfc模式下该端口接收olif的优先级反压, +* 0pfc模式下该端口不接受olif的优先级反压,并将反压信号全部置1 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author lsy @date 2022/08/22 +************************************************************/ +DPP_STATUS dpp_tm_qmu_port_pfc_make_get(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + ZXIC_UINT32 *p_port_en) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 value = 0; + DPP_ETM_QMU_CFGMT_QMU_PFC_MASK_1_T pfc_mask_31_0 = {0}; + DPP_ETM_QMU_CFGMT_QMU_PFC_MASK_2_T pfc_mask_63_32 = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), port_id, 0, DPP_TM_PP_NUM - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_port_en); + + if (port_id <= 31) + { + /* port_id:[0-31] */ + rc = dpp_reg_read(dev, + ETM_QMU_CFGMT_QMU_PFC_MASK_1r, + 0, + 0, + &pfc_mask_31_0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + value = pfc_mask_31_0.cfgmt_qmu_pfc_mask_1; + + *p_port_en = 1 & (value >> port_id); + } + else + { + /* port_id:[32-63] */ + rc = dpp_reg_read(dev, + ETM_QMU_CFGMT_QMU_PFC_MASK_2r, + 0, + 0, + &pfc_mask_63_32); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + value = pfc_mask_63_32.cfgmt_qmu_pfc_mask_2; + + *p_port_en = 1 & (value >> (port_id - 32)); + } + + return DPP_OK; +} + +#if 0 +/***********************************************************/ +/** QMU初始化配置场景 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param case_no QMU初始化场景编号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2020/4/14 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 case_no_temp) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 case_no = 0; + ZXIC_UINT32 ftm_ddr_no = 0; + ZXIC_UINT32 etm_ddr_no = 0; + + + g_qmu_init_case_no = case_no_temp; + + if ((case_no_temp & 0xff) == 0xef && (case_no_temp >> 8)!= 0 && (case_no_temp >> + 16 != 0)) + { + case_no = 0xef; + ZXIC_COMM_PRINT("Here get in qmu init:%d case_num is %d\n", case_no); + /*低8-15bit作为FTM的DDR0-9中的编号,高16-23bit作为ETM的DDR0-9中的编号(only case_16 use)*/ + ftm_ddr_no = (case_no_temp >> 8) & 0xff; + etm_ddr_no = (case_no_temp >> 16) & 0xff; + } + else if ((case_no_temp & 0xf) == 0xc) + { + /*etm 和ftm共享指定1组ddr 8bank,其中etm 0-3bank ftm 4-7bank*/ + case_no = 0xc; + } + else if ((case_no_temp & 0xf) == 0xd) + { + /*一个tm独享指定4组8bank*/ + case_no = 0xd; + } + else if(((case_no_temp & 0xf) == 0xe) || ((case_no_temp & 0xf) == 0xf) \ + || ((case_no_temp & 0xf) == 0xb)) + { + /*提取case_no_temp的低4bit作为case_no*/ + case_no = case_no_temp & 0xf; + ZXIC_COMM_PRINT("Here get in qmu init:%d case_num is %d\n", case_no); + + /*中间4bit作为ETM的DDR0-9中的编号,最高4bit作为FTM的DDR0-9中的编号(only case_11 14 15 use)*/ + ftm_ddr_no = (case_no_temp >> 4) & 0xf; + etm_ddr_no = (case_no_temp >> 8) & 0xf; + } + else + { + case_no = case_no_temp & 0xf; + } + /**clear mmu qmu**/ + rc = dpp_tm_qmu_mmu_cfg_clr(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_mmu_cfg_clr"); + + + if (case_no == 0) + { + /**纯片内pd16k模式**/ + //rc = dpp_tm_qmu_init_set_pd16k_2(dev_id, 64); + //ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_init_set_pd16k_2"); + + rc = dpp_tm_qmu_init_set_chuk32(dev_id, 512); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_init_set_chuk32"); + } + else if (case_no == 1) + { + /* 场景1:每个tm用8组*4bank,MMU实际分配ftm:0-7组(0145bank); etm:2-9组(2367bank) */ + rc = dpp_tm_qmu_init_set_1(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_init_set_1"); + } + else if (case_no == 2) + { + /* 场景2:tm独享8组ddr:ftm为0-7组ddr的0123bank,etm为0-7组ddr 4567bank */ + rc = dpp_tm_qmu_init_set_2(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_init_set_2"); + } + else if (case_no == 3) + { + /* 场景3:TM独享8组ddr:FTM为0-3组ddr的0~3bank,ETM为4-7组ddr 0~3bank */ + rc = dpp_tm_qmu_init_set_3(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_init_set_3"); + } + else if (case_no == 4) + { + /* 场景4:TM共享2组ddr:FTM为2、4组ddr的01bank,ETM为2、4组ddr 23bank */ + /*需开启IP_rotation、mmu multi_burst,关闭mmu_rotation_en*/ + rc = dpp_tm_qmu_init_set_4(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_init_set_4"); + } + else if (case_no == 5) + { + /* 场景5:TM共享4组ddr:FTM为1234组ddr的01bank,ETM为1234组ddr 23bank */ + /*需开启IP_rotation、mmu multi_burst,关闭mmu_rotation_en*/ + rc = dpp_tm_qmu_init_set_5(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_init_set_5"); + } + else if (case_no == 6) + { + /*场景6:4组*2bank,MMU实际分配4,6,7,9; etm使用01bank,ftm使用23bank*/ + /*需开启IP_rotation、mmu multi_burst,关闭mmu_rotation_en*/ + rc = dpp_tm_qmu_init_set_6(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_init_set_6"); + } + else if (case_no == 7) + { + /* 关闭rotation*/ + //rc = dpp_mmu_init(0, 0, 0, 0, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_mmu_init"); + /* 场景7:每个tm用8组*4bank,MMU实际分配ftm:2-9组(0145bank); etm:2-9组(2367bank) */ + rc = dpp_tm_qmu_init_set_7(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_init_set_7"); + } + else if (case_no == 8) + { + /* 场景8:每个tm用8组*4bank,MMU实际分配ftm:2-9组(01bank); etm:2-9组(23bank) */ + /*需开启IP_rotation、mmu multi_burst,关闭mmu_rotation_en*/ + rc = dpp_tm_qmu_init_set_8(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_init_set_8"); + } + else if (case_no == 9) + { + /*场景9:4组*2bank,MMU实际分配6,7,8,9; etm使用01bank,ftm使用23bank*/ + /*需开启IP_rotation、mmu multi_burst,关闭mmu_rotation_en*/ + rc = dpp_tm_qmu_init_set_9(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_init_set_9"); + } + else if (case_no == 10) + { + /* 关闭rotation*/ + //rc = dpp_mmu_init(0, 0, 0, 0, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_mmu_init"); + /*场景10:独享2组*8bank,MMU实际分配1,2; etm or ftm使用0-7bank*/ + rc = dpp_tm_qmu_init_set_10(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_init_set_10"); + } + else if (case_no == 11) + { + /*场景11:TM共享2组ddr:FTM为ddr_no1,ddr_no2组ddr的01bank,ETM为ddr_no1,ddr_no2组ddr 23bank*/ + rc = dpp_tm_qmu_init_set_11(dev_id, ftm_ddr_no, etm_ddr_no); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_init_set_11"); + } + else if (case_no == 0xc) + { + /*etm 和ftm共享指定1组ddr 8bank,其中etm 0-3bank ftm 4-7bank*/ + rc = dpp_tm_qmu_init_set_12(dev_id, case_no_temp >> 4); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_init_set_12"); + } + else if (case_no == 0xd) + { + /* 关闭rotation 配置8bank必须关掉,不然会出现crc错包*/ + //rc = dpp_mmu_init(0, 0, 0, 0, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_mmu_init"); + /*场景13:TM独享4组0-7bank,ddr编号来自传参,如0x6789 即代表独享6 7 8 + 9组ddr的全部bank*/ + rc = dpp_tm_qmu_init_set_13(dev_id, case_no_temp >> 4); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_init_set_13"); + } + else if (case_no == 0xe) + { + /* 关闭rotation*/ + //rc = dpp_mmu_init(dev_id, 0, 0, 0, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_mmu_init"); + + /* 场景14:每个tm只用1组*8bank,MMU实际分配ftm:0-9中指定组(0-7bank); etm:0-9中指定组(0-7bank) */ + rc = dpp_tm_qmu_init_set_14(dev_id, etm_ddr_no, ftm_ddr_no); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_init_set_8"); + } + else if (case_no == 0xf) + { + /* 场景15:每个tm只用1组*4bank,MMU实际分配ftm:0-9中指定组(0123bank); etm:0-9中指定组(0123bank) */ + rc = dpp_tm_qmu_init_set_15(dev_id, etm_ddr_no, ftm_ddr_no); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_init_set_8"); + } + else/* if (case_no == 0xef)*/ + { + /* 关闭rotation*/ + //rc = dpp_mmu_init(0, 0, 0, 0, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_mmu_init"); + /* 场景15:每个tm只用2组*8bank,MMU实际分配ftm:0-9中指定组(0-7bank); etm:0-9中指定组(0-7bank) */ + rc = dpp_tm_qmu_init_set_16(dev_id, etm_ddr_no, ftm_ddr_no); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_init_set_16"); + } + + return DPP_OK; +} + + + +/***********************************************************/ +/** QMU/MMU初始化配置场景1:每个tm用8组*4bank,MMU实际分配ftm:0-7组(0145bank); etm:2-9组(2367bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/10/14 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_1(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 k = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + ZXIC_UINT32 depth = 1024; + ZXIC_UINT32 bank_to_mmu_cfg_map[4] = {2, 3, 6, 7}; + ZXIC_UINT32 qlist_grp0_bank_data[4] = {0, 1, 2, 3}; + + + DPP_ETM_QMU_QCFG_QLIST_BDEP_T qlist_bdep = {0}; + DPP_ETM_QMU_QCFG_QLIST_BHEAD_T qlist_bhead = {0}; + DPP_ETM_QMU_QCFG_QLIST_BTAIL_T qlist_btail = {0}; + + DPP_ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFG_T active_to_bank_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_MMU_CFG_T ddr_in_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_QMU_CFG_T ddr_in_qmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_MMU_CFG_T bank_to_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_QMU_CFG_T bank_to_qmu_cfg = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP0_BANK_T qlist_grp0_bank = {0}; + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "========dpp_etm_qmu_init_set_1 start========n"); + + + /* ddr组从qmu到mmu映射,0~7映射成2~9 */ + for (i = 0; i < 8; i++) + { + ddr_in_mmu_cfg.cfgmt_ddr_in_mmu_cfg = (i + 2); + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_MMU_CFGr, + 0, + i, + &ddr_in_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + /* ddr组从mmu到qmu映射,2~9映射成0~7 */ + for (i = 2; i < 10; i++) + { + ddr_in_qmu_cfg.cfgmt_ddr_in_qmu_cfg = (i - 2); + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_QMU_CFGr, + 0, + i, + &ddr_in_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + + /* bank号从qmu到mmu映射,每组的bank0~3映射成bank2、3、6、7 */ + for (j = 0; j < 8; j++) + { + for (i = 0; i < 4; i++) + { + k = j * 8 + i; + + bank_to_mmu_cfg.cfgmt_bank_in_mmu_cfg = bank_to_mmu_cfg_map[i]; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_MMU_CFGr, + 0, + k, + &bank_to_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + + /* bank号从mmu到qmu映射,每组的bank2、3、6、7映射成bank0、1、2、3 */ + for (j = 2; j < 10; j++) + { + for (i = 0; i < 4; i++) + { + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(dev_id, j * 8 , bank_to_mmu_cfg_map[i]); + k = j * 8 + bank_to_mmu_cfg_map[i]; + + bank_to_qmu_cfg.cfgmt_bank_in_qmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_QMU_CFGr, + 0, + k, + &bank_to_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + /* random映射ram:配置一个chunk中,bank的轮询顺序 */ + for (i = 0; i < 16; i++) + { + + + active_to_bank_cfg.cfgmt_active_to_bank_cfg = i % 4; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFGr, + 0, + i, + &active_to_bank_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + + + /* 首尾深度指针配置 */ + for (j = 0; j < 8; j++) + { + for (i = 0; i < 4; i++) + { + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 4 + i) , depth); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 4 + i + 1) , depth); + k = j * 8 + i; + qlist_bhead.bank_vld = 1; + qlist_bhead.qcfg_qlist_bhead = (j * 4 + i) * depth; + qlist_btail.qcfg_qlist_btail = ((j * 4 + i + 1) * depth - 1); + qlist_bdep.qcfg_qlist_bdep = depth; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BHEADr, + 0, + k, + &qlist_bhead); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BTAILr, + 0, + k, + &qlist_btail); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + k, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(ETM_QMU_QCFG_QLIST_GRP0_BANKr, 8); + /* 随机表配置,决定每组bank的轮询顺序 */ + for (j = 0; j < 8; j++) + { + for (i = 0; i < 64; i++) + { + qlist_grp0_bank.qcfg_qlist_grp0_bank_wr = qlist_grp0_bank_data[i % 4]; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP0_BANKr + j, + 0, + i, + &qlist_grp0_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + rc = dpp_tm_qmu_cfg_done_set(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_cfg_done_set"); + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "========dpp_etm_qmu_init_set_1 END=======\n"); + + return DPP_OK; +} + + + + +/***********************************************************/ +/** QMU/MMU初始化配置场景1:每个tm用8组*4bank,MMU实际分配ftm:0-7组(0145bank); etm:2-9组(2367bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/10/14 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_1(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + + /* etm mmu基址配置:ddr2-9组,bank号2367,bank深度1024 */ + //rc = dpp_mmu_bank_base_addr_set(dev_id, 0x3fc, 0xcc, 1024); + //ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_mmu_bank_base_addr_set"); + + rc = dpp_etm_qmu_init_set_1(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_etm_qmu_init_set"); + + return DPP_OK; +} + +/***********************************************************/ +/** QMU/MMU初始化配置场景二:tm独享8组ddr:ftm为0-7组ddr的0123bank,etm为0-7组ddr 4567bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/10/16 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_2(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 k = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + ZXIC_UINT32 depth = 1024; + ZXIC_UINT32 qlist_grp0_bank_data[4] = {1, 2, 3, 0}; + + DPP_ETM_QMU_QCFG_QLIST_BDEP_T qlist_bdep = {0}; + DPP_ETM_QMU_QCFG_QLIST_BHEAD_T qlist_bhead = {0}; + DPP_ETM_QMU_QCFG_QLIST_BTAIL_T qlist_btail = {0}; + + DPP_ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFG_T active_to_bank_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_MMU_CFG_T ddr_in_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_QMU_CFG_T ddr_in_qmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_MMU_CFG_T bank_to_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_QMU_CFG_T bank_to_qmu_cfg = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP0_BANK_T qlist_grp0_bank = {0}; + + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "++++++dpp_etm_qmu_init_set starting++++++\n"); + + + /* ddr组从qmu到mmu映射,0~7映射成0~7 */ + for (i = 0; i < 8; i++) + { + ddr_in_mmu_cfg.cfgmt_ddr_in_mmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_MMU_CFGr, + 0, + i, + &ddr_in_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + /* ddr组从mmu到qmu映射,0~7映射成0~7 */ + for (i = 0; i < 8; i++) + { + ddr_in_qmu_cfg.cfgmt_ddr_in_qmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_QMU_CFGr, + 0, + i, + &ddr_in_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + + /* bank号从qmu到mmu映射,每组bank0、1、2、3映射成bank4567,组0~7循环配置 */ + for (j = 0; j < 8; j++) + { + for (i = 0; i < 4; i++) + { + k = j * 8 + i; + bank_to_mmu_cfg.cfgmt_bank_in_mmu_cfg = (i + 4); + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_MMU_CFGr, + 0, + k, + &bank_to_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + + /* bank号从mmu到qmu映射,每组bank4567映射成bank0、1、2、3,组0~7循环配置 */ + for (j = 0; j < 8; j++) + { + for (i = 4; i < 8; i++) + { + + k = j * 8 + i; + bank_to_qmu_cfg.cfgmt_bank_in_qmu_cfg = (i - 4); + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_QMU_CFGr, + 0, + k, + &bank_to_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + /* random映射ram:配置一个chunk中,bank的轮询顺序 */ + for (i = 0; i < 16; i++) + { + active_to_bank_cfg.cfgmt_active_to_bank_cfg = i % 4; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFGr, + 0, + i, + &active_to_bank_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + + /* 首尾深度指针配置:j为4组循环 */ + for (j = 0; j < 8; j++) + { + for (i = 0; i < 4; i++) + { + k = j * 8 + i; + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 4 + i), depth); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 4 + i + 1), depth); + qlist_bhead.bank_vld = 1; + qlist_bhead.qcfg_qlist_bhead = (j * 4 + i) * depth; + qlist_btail.qcfg_qlist_btail = ((j * 4 + i + 1) * depth - 1); + qlist_bdep.qcfg_qlist_bdep = depth; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BHEADr, + 0, + k, + &qlist_bhead); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BTAILr, + 0, + k, + &qlist_btail); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + k, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(ETM_QMU_QCFG_QLIST_GRP0_BANKr, 8); + /* 随机表配置,决定ddr内bank的轮询顺序:使用几组ddr需要配置几组 */ + for (j = 0; j < 8; j++) + { + for (i = 0; i < 64; i++) + { + + qlist_grp0_bank.qcfg_qlist_grp0_bank_wr = qlist_grp0_bank_data[i % 4]; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP0_BANKr + j, + 0, + i, + &qlist_grp0_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + } + + rc = dpp_tm_qmu_cfg_done_set(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_cfg_done_set"); + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "++++++dpp_etm_qmu_init_set end++++++\n"); + + return DPP_OK; +} + + + +/***********************************************************/ +/** QMU/MMU初始化配置场景二:tm独享8组ddr:ftm为0-7组ddr的0123bank,etm为0-7组ddr 4567bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/10/16 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_2(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + + /* etm mmu基址配置:ddr0-7组,bank号4567,bank深度1024 */ + //rc = dpp_mmu_bank_base_addr_set(dev_id, 0xff, 0xf0, 1024); + //ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_mmu_bank_base_addr_set"); + + rc = dpp_etm_qmu_init_set_2(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_etm_qmu_init_set"); + + + return DPP_OK; +} + +/***********************************************************/ +/** QMU初始化配置场景二:ddr3模式,tm看到4组*4bank,对应DDR分配4~7组,每组2~3,6~7bank +* depth=64,代表16k +* @param dev_id 设备编号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_pd16k_2(ZXIC_UINT32 dev_id, ZXIC_UINT32 depth) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 k = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + ZXIC_UINT32 qlist_grp0_bank_data[4] = {1, 2, 3, 0}; + ZXIC_UINT32 ddr_num = 4; + + DPP_ETM_QMU_QCFG_QLIST_BDEP_T qlist_bdep = {0}; + DPP_ETM_QMU_QCFG_QLIST_BHEAD_T qlist_bhead = {0}; + DPP_ETM_QMU_QCFG_QLIST_BTAIL_T qlist_btail = {0}; + DPP_ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFG_T active_to_bank_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_MMU_CFG_T ddr_in_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_QMU_CFG_T ddr_in_qmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_MMU_CFG_T bank_to_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_QMU_CFG_T bank_to_qmu_cfg = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP0_BANK_T qlist_grp0_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP1_BANK_T qlist_grp1_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP2_BANK_T qlist_grp2_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP3_BANK_T qlist_grp3_bank = {0}; + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "++++++dpp_etm_qmu_init_set starting++++++\n"); + + /* cfgmt配置4组ddr */ + rc = dpp_tm_cfgmt_ddr_attach_set(dev_id, ddr_num); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_ddr_attach_set"); + + + /* ddr组从qmu到mmu映射,0~3映射成4~7 */ + for (i = 0; i < 4; i++) + { + ddr_in_mmu_cfg.cfgmt_ddr_in_mmu_cfg = (i + 4); + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_MMU_CFGr, + 0, + i, + &ddr_in_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + /* ddr组从mmu到qmu映射,4~7映射成0~3 */ + for (i = 4; i < 8; i++) + { + ddr_in_qmu_cfg.cfgmt_ddr_in_qmu_cfg = (i - 4); + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_QMU_CFGr, + 0, + i, + &ddr_in_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + + /* bank号从qmu到mmu映射,每组bank0、1、2、3映射成bank2、3、6、7,组0~3循环配置 */ + for (j = 0; j < 4; j++) + { + for (i = 0; i < 4; i++) + { + k = j * 8 + i; + + if (i < 2) + { + bank_to_mmu_cfg.cfgmt_bank_in_mmu_cfg = (i + 2); + } + else + { + bank_to_mmu_cfg.cfgmt_bank_in_mmu_cfg = (i + 4); + } + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_MMU_CFGr, + 0, + k, + &bank_to_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + + /* bank号从mmu到qmu映射,每组bank2、3、6、7映射成bank0、1、2、3,组4~7循环配置 */ + for (j = 4; j < 8; j++) + { + for (i = 2; i < 6; i++) + { + if (i < 4) + { + k = j * 8 + i; + } + else + { + k = j * 8 + i + 2; + } + + bank_to_qmu_cfg.cfgmt_bank_in_qmu_cfg = (i - 2); + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_QMU_CFGr, + 0, + k, + &bank_to_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + /* random映射ram */ + for (j = 0; j < 4; j++) + { + for (i = 0; i < 4; i++) + { + k = j * 4 + i; + + active_to_bank_cfg.cfgmt_active_to_bank_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFGr, + 0, + k, + &active_to_bank_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + + /* 首尾深度指针配置:j为4组循环 */ + for (j = 0; j < 4; j++) + { + for (i = 0; i < 4; i++) + { + k = j * 8 + i; + + qlist_bhead.bank_vld = 1; + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 4 + i), depth); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 4 + i + 1), depth); + qlist_bhead.qcfg_qlist_bhead = (j * 4 + i) * depth; + qlist_btail.qcfg_qlist_btail = ((j * 4 + i + 1) * depth - 1); + qlist_bdep.qcfg_qlist_bdep = depth; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BHEADr, + 0, + k, + &qlist_bhead); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BTAILr, + 0, + k, + &qlist_btail); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + k, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + + /* 随机表配置,决定每组bank的轮询顺序 */ + for (j = 0; j < 16; j++) + { + for (i = 0; i < 4; i++) + { + k = j * 4 + i; + + qlist_grp0_bank.qcfg_qlist_grp0_bank_wr = qlist_grp0_bank_data[i];; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP0_BANKr, + 0, + k, + &qlist_grp0_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + } + + for (j = 0; j < 16; j++) + { + for (i = 0; i < 4; i++) + { + k = j * 4 + i; + + qlist_grp1_bank.qcfg_qlist_grp1_bank_wr = qlist_grp0_bank_data[i];; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP1_BANKr, + 0, + k, + &qlist_grp1_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + } + + for (j = 0; j < 16; j++) + { + for (i = 0; i < 4; i++) + { + k = j * 4 + i; + + qlist_grp2_bank.qcfg_qlist_grp2_bank_wr = qlist_grp0_bank_data[i];; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP2_BANKr, + 0, + k, + &qlist_grp2_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + } + + for (j = 0; j < 16; j++) + { + for (i = 0; i < 4; i++) + { + k = j * 4 + i; + + qlist_grp3_bank.qcfg_qlist_grp3_bank_wr = qlist_grp0_bank_data[i];; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP3_BANKr, + 0, + k, + &qlist_grp3_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + } + + rc = dpp_tm_qmu_cfg_done_set(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_cfg_done_set"); + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "++++++dpp_etm_qmu_init_set end++++++\n"); + + return DPP_OK; +} + + +/***********************************************************/ +/** QMU初始化配置场景二:ddr3模式,tm看到4组*4bank,对应DDR分配4~7组,每组2~3,6~7bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_pd16k_2(ZXIC_UINT32 dev_id, ZXIC_UINT32 depth) +{ + DPP_STATUS rc = DPP_OK; + + rc = dpp_etm_qmu_init_set_pd16k_2(dev_id, depth); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_etm_qmu_init_set"); + + return DPP_OK; +} + + +DPP_STATUS dpp_qmu_init_info(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 ddr_num = 0; + ZXIC_UINT32 k = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + DPP_ETM_QMU_QCFG_QLIST_BDEP_T qlist_bdep = {0}; + DPP_ETM_QMU_QCFG_QLIST_BHEAD_T qlist_bhead = {0}; + DPP_ETM_QMU_QCFG_QLIST_BTAIL_T qlist_btail = {0}; + DPP_ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFG_T active_to_bank_cfg = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP0_BANK_T qlist_grp0_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP1_BANK_T qlist_grp1_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP2_BANK_T qlist_grp2_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP3_BANK_T qlist_grp3_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP4_BANK_T qlist_grp4_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP5_BANK_T qlist_grp5_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP6_BANK_T qlist_grp6_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP7_BANK_T qlist_grp7_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP_T qcfg_qlist_grp = {0}; + dpp_tm_cfgmt_ddr_attach_get(0, &ddr_num); + ZXIC_COMM_PRINT("dpp_tm_cfgmt_ddr_attach_get ddr_num:%d\n",ddr_num); + + /* random映射ram */ + for (j = 0; j < 4; j++) + { + for (i = 0, k = 0; i < 4; i++) + { + k = j * 4 + i; + + active_to_bank_cfg.cfgmt_active_to_bank_cfg = 0; + + rc = dpp_reg_read(dev_id, + ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFGr, + 0, + k, + &active_to_bank_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + ZXIC_COMM_PRINT("cfgmt_active_to_bank_cfg: cfgmt_active_to_bank_cfg-%d value:%d\n",k,active_to_bank_cfg.cfgmt_active_to_bank_cfg); + } + } + + /* 首尾深度指针配置: */ + for (j = 0, k = 0; j < 8; j++) + { + k = j * 8; + rc = dpp_reg_read(dev_id, + ETM_QMU_QCFG_QLIST_BHEADr, + 0, + k, + &qlist_bhead); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + ZXIC_COMM_PRINT("qlist_bhead: qlist_bhead-%d bank_vld:%d qcfg_qlist_bhead:%d\n",k,qlist_bhead.bank_vld,qlist_bhead.qcfg_qlist_bhead); + + rc = dpp_reg_read(dev_id, + ETM_QMU_QCFG_QLIST_BTAILr, + 0, + k, + &qlist_btail); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + ZXIC_COMM_PRINT("qlist_btail: qlist_btail-%d qcfg_qlist_btail:%d\n",k,qlist_btail.qcfg_qlist_btail); + + + } + for (j = 0; j < 64; j++) + { + + rc = dpp_reg_read(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + j, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + ZXIC_COMM_PRINT("qlist_bdep: qlist_bdep-%d qcfg_qlist_bdep:%d\n",j,qlist_bdep.qcfg_qlist_bdep); + } + + /* 随机表配置,决定每组bank的轮询顺序 */ + for (j = 0; j < 16; j++) + { + for (i = 0, k = 0; i < 4; i++) + { + k = j * 4 + i; + + rc = dpp_reg_read(dev_id, + ETM_QMU_QCFG_QLIST_GRP0_BANKr, + 0, + k, + &qlist_grp0_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + ZXIC_COMM_PRINT("qlist_grp0_bank: qlist_grp0_bank-%d qcfg_qlist_grp0_bank_wr:%d\n",k,qlist_grp0_bank.qcfg_qlist_grp0_bank_wr); + } + } + + for (j = 0; j < 16; j++) + { + for (i = 0, k = 0; i < 4; i++) + { + k = j * 4 + i; + + rc = dpp_reg_read(dev_id, + ETM_QMU_QCFG_QLIST_GRP1_BANKr, + 0, + k, + &qlist_grp1_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + ZXIC_COMM_PRINT("qlist_grp1_bank: qlist_grp1_bank-%d qcfg_qlist_grp1_bank_wr:%d\n",k,qlist_grp1_bank.qcfg_qlist_grp1_bank_wr); + + } + } + + for (j = 0; j < 16; j++) + { + for (i = 0, k = 0; i < 4; i++) + { + k = j * 4 + i; + + rc = dpp_reg_read(dev_id, + ETM_QMU_QCFG_QLIST_GRP2_BANKr, + 0, + k, + &qlist_grp2_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + ZXIC_COMM_PRINT("qlist_grp2_bank: qlist_grp2_bank-%d qcfg_qlist_grp2_bank_wr:%d\n",k,qlist_grp2_bank.qcfg_qlist_grp2_bank_wr); + + } + } + + for (j = 0; j < 16; j++) + { + for (i = 0, k = 0; i < 4; i++) + { + k = j * 4 + i; + + rc = dpp_reg_read(dev_id, + ETM_QMU_QCFG_QLIST_GRP3_BANKr, + 0, + k, + &qlist_grp3_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + ZXIC_COMM_PRINT("qlist_grp3_bank: qlist_grp3_bank-%d qcfg_qlist_grp3_bank_wr:%d\n",k,qlist_grp3_bank.qcfg_qlist_grp3_bank_wr); + + } + } + + for (j = 0; j < 16; j++) + { + for (i = 0, k = 0; i < 4; i++) + { + k = j * 4 + i; + + rc = dpp_reg_read(dev_id, + ETM_QMU_QCFG_QLIST_GRP4_BANKr, + 0, + k, + &qlist_grp4_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + ZXIC_COMM_PRINT("qlist_grp4_bank: qlist_grp4_bank-%d qcfg_qlist_grp4_bank_wr:%d\n",k,qlist_grp4_bank.qcfg_qlist_grp4_bank_wr); + + } + } + + for (j = 0; j < 16; j++) + { + for (i = 0, k = 0; i < 4; i++) + { + k = j * 4 + i; + + rc = dpp_reg_read(dev_id, + ETM_QMU_QCFG_QLIST_GRP5_BANKr, + 0, + k, + &qlist_grp5_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + ZXIC_COMM_PRINT("qlist_grp5_bank: qlist_grp5_bank-%d qcfg_qlist_grp5_bank_wr:%d\n",k,qlist_grp5_bank.qcfg_qlist_grp5_bank_wr); + + } + } + + for (j = 0; j < 16; j++) + { + for (i = 0, k = 0; i < 4; i++) + { + k = j * 4 + i; + + rc = dpp_reg_read(dev_id, + ETM_QMU_QCFG_QLIST_GRP6_BANKr, + 0, + k, + &qlist_grp6_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + ZXIC_COMM_PRINT("qlist_grp6_bank: qlist_grp6_bank-%d qcfg_qlist_grp6_bank_wr:%d\n",k,qlist_grp6_bank.qcfg_qlist_grp6_bank_wr); + + } + } + + for (j = 0; j < 16; j++) + { + for (i = 0, k = 0; i < 4; i++) + { + k = j * 4 + i; + + rc = dpp_reg_read(dev_id, + ETM_QMU_QCFG_QLIST_GRP7_BANKr, + 0, + k, + &qlist_grp7_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + ZXIC_COMM_PRINT("qlist_grp7_bank: qlist_grp7_bank-%d qcfg_qlist_grp7_bank_wr:%d\n",k,qlist_grp7_bank.qcfg_qlist_grp7_bank_wr); + + } + } + + for (j = 0; j < 8; j++) + { + for (i = 0, k = 0; i < 8; i++) + { + k = j * 8 + i; + + rc = dpp_reg_read(dev_id, + ETM_QMU_QCFG_QLIST_GRPr, + 0, + k, + &qcfg_qlist_grp); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + ZXIC_COMM_PRINT("qcfg_qlist_grp: qcfg_qlist_grp-%d qcfg_qlist_grp_wr:%d\n",k,qcfg_qlist_grp.qcfg_qlist_grp_wr); + } + } + + + return DPP_OK; +} +/***********************************************************/ +/** QMU初始化配置场景二:ddr3模式,8组*8bank +* depth=512,代表32k +* @param dev_id 设备编号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author sun @date 2023/04/12 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_chuk32(ZXIC_UINT32 dev_id, ZXIC_UINT32 depth) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 k = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + ZXIC_UINT32 qlist_grp0_bank_data[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + ZXIC_UINT32 qlist_grp_bank_data[8] = {0, 1, 2, 3, 4, 5, 6, 7}; + ZXIC_UINT32 ddr_num = 0xff; + + DPP_ETM_QMU_QCFG_QLIST_BDEP_T qlist_bdep = {0}; + DPP_ETM_QMU_QCFG_QLIST_BHEAD_T qlist_bhead = {0}; + DPP_ETM_QMU_QCFG_QLIST_BTAIL_T qlist_btail = {0}; + DPP_ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFG_T active_to_bank_cfg = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP0_BANK_T qlist_grp0_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP1_BANK_T qlist_grp1_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP2_BANK_T qlist_grp2_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP3_BANK_T qlist_grp3_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP4_BANK_T qlist_grp4_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP5_BANK_T qlist_grp5_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP6_BANK_T qlist_grp6_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP7_BANK_T qlist_grp7_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP_T qcfg_qlist_grp = {0}; + + + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "++++++dpp_etm_qmu_init_set starting++++++\n"); + + /* cfgmt配置8组ddr */ + rc = dpp_tm_cfgmt_ddr_attach_set(dev_id, ddr_num); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_ddr_attach_set"); + + /* 首尾深度指针配置: */ + for (j = 0, k = 0; j < 8; j++) + { + + k = j * 8; + qlist_bhead.bank_vld = 1; + qlist_bhead.qcfg_qlist_bhead = j * depth; + qlist_btail.qcfg_qlist_btail = 511 + j * depth; + + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BHEADr, + 0, + k, + &qlist_bhead); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BTAILr, + 0, + k, + &qlist_btail); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + for (j = 0; j < 64; j++) + { + qlist_bdep.qcfg_qlist_bdep = depth; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + j, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + /* 随机表配置,决定每组bank的轮询顺序 */ + for (j = 0; j < 16; j++) + { + for (i = 0, k = 0; i < 4; i++) + { + k = j * 4 + i; + + qlist_grp0_bank.qcfg_qlist_grp0_bank_wr = qlist_grp0_bank_data[0]; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP0_BANKr, + 0, + k, + &qlist_grp0_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + } + + for (j = 0; j < 16; j++) + { + for (i = 0, k = 0; i < 4; i++) + { + k = j * 4 + i; + + qlist_grp1_bank.qcfg_qlist_grp1_bank_wr = qlist_grp0_bank_data[1];; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP1_BANKr, + 0, + k, + &qlist_grp1_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + } + + for (j = 0; j < 16; j++) + { + for (i = 0, k = 0; i < 4; i++) + { + k = j * 4 + i; + + qlist_grp2_bank.qcfg_qlist_grp2_bank_wr = qlist_grp0_bank_data[2];; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP2_BANKr, + 0, + k, + &qlist_grp2_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + } + + for (j = 0; j < 16; j++) + { + for (i = 0, k = 0; i < 4; i++) + { + k = j * 4 + i; + + qlist_grp3_bank.qcfg_qlist_grp3_bank_wr = qlist_grp0_bank_data[3];; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP3_BANKr, + 0, + k, + &qlist_grp3_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + } + + for (j = 0; j < 16; j++) + { + for (i = 0, k = 0; i < 4; i++) + { + k = j * 4 + i; + + qlist_grp4_bank.qcfg_qlist_grp4_bank_wr = qlist_grp0_bank_data[4];; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP4_BANKr, + 0, + k, + &qlist_grp4_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + } + + for (j = 0; j < 16; j++) + { + for (i = 0, k = 0; i < 4; i++) + { + k = j * 4 + i; + + qlist_grp5_bank.qcfg_qlist_grp5_bank_wr = qlist_grp0_bank_data[5];; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP5_BANKr, + 0, + k, + &qlist_grp5_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + } + + for (j = 0; j < 16; j++) + { + for (i = 0, k = 0; i < 4; i++) + { + k = j * 4 + i; + + qlist_grp6_bank.qcfg_qlist_grp6_bank_wr = qlist_grp0_bank_data[6];; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP6_BANKr, + 0, + k, + &qlist_grp6_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + } + + for (j = 0; j < 16; j++) + { + for (i = 0, k = 0; i < 4; i++) + { + k = j * 4 + i; + + qlist_grp7_bank.qcfg_qlist_grp7_bank_wr = qlist_grp0_bank_data[7];; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP7_BANKr, + 0, + k, + &qlist_grp7_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + } + + for (j = 0; j < 8; j++) + { + for (i = 0, k = 0; i < 8; i++) + { + k = j * 8 + i; + qcfg_qlist_grp.qcfg_qlist_grp_wr = qlist_grp_bank_data[i]; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRPr, + 0, + k, + &qcfg_qlist_grp); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + /* random映射ram */ + for (j = 0; j < 4; j++) + { + for (i = 0, k = 0; i < 4; i++) + { + + k = j * 4 + i; + + active_to_bank_cfg.cfgmt_active_to_bank_cfg = 0; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFGr, + 0, + k, + &active_to_bank_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + zxic_comm_sleep(5); + rc = dpp_tm_qmu_cfg_done_set(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_cfg_done_set"); + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "++++++dpp_etm_qmu_init_set end++++++\n"); + + return DPP_OK; +} + +/***********************************************************/ +/** QMU初始化配置场景:ddr3模式,8组ddr*8bank +* @param dev_id 设备编号 +* @param depth bank depth +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author sun @date 2023/04/12 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_chuk32(ZXIC_UINT32 dev_id, ZXIC_UINT32 depth) +{ + DPP_STATUS rc = DPP_OK; + + rc = dpp_etm_qmu_init_set_chuk32(dev_id, depth); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_etm_qmu_init_set"); + + return DPP_OK; +} + +/***********************************************************/ +/** QMU初始化配置场景二:TM独享8组ddr:FTM为0-3组ddr的0~3bank,ETM为4-7组ddr 0~3bank +* @param dev_id 设备编号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_3(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 k = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + ZXIC_UINT32 depth = 2048; + ZXIC_UINT32 qlist_grp0_bank_data[8] = {0, 1, 2, 3, 4, 5, 6, 7}; + + + DPP_ETM_QMU_QCFG_QLIST_BDEP_T qlist_bdep = {0}; + DPP_ETM_QMU_QCFG_QLIST_BHEAD_T qlist_bhead = {0}; + DPP_ETM_QMU_QCFG_QLIST_BTAIL_T qlist_btail = {0}; + DPP_ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFG_T active_to_bank_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_MMU_CFG_T ddr_in_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_QMU_CFG_T ddr_in_qmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_MMU_CFG_T bank_to_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_QMU_CFG_T bank_to_qmu_cfg = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP0_BANK_T qlist_grp0_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP_T qcfg_qlist_grp = {0}; + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "++++++dpp_etm_qmu_init_set starting++++++\n"); + + + /* ddr组从qmu到mmu映射,0~3映射成4~7 */ + for (i = 0; i < 4; i++) + { + ddr_in_mmu_cfg.cfgmt_ddr_in_mmu_cfg = i + 4; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_MMU_CFGr, + 0, + i, + &ddr_in_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + /* ddr组从mmu到qmu映射,4~7映射成0~3 */ + for (i = 4; i < 8; i++) + { + ddr_in_qmu_cfg.cfgmt_ddr_in_qmu_cfg = i - 4; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_QMU_CFGr, + 0, + i, + &ddr_in_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + /* bank号从qmu到mmu映射,组0~3的bank0-3映射成bank0-3 */ + for (j = 0; j < 4; j++) + { + for (i = 0; i < 4; i++) + { + k = j * 8 + i; + + bank_to_mmu_cfg.cfgmt_bank_in_mmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_MMU_CFGr, + 0, + k, + &bank_to_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + + /* bank号从mmu到qmu映射,组4~7的bank0-7映射成bank0-7 */ + for (j = 4; j < 8; j++) + { + for (i = 0; i < 4; i++) + { + k = j * 8 + i; + + bank_to_qmu_cfg.cfgmt_bank_in_qmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_QMU_CFGr, + 0, + k, + &bank_to_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + /* random映射ram:配置一个chunk中,bank的轮询顺序 */ + for (i = 0; i < 16; i++) + { + active_to_bank_cfg.cfgmt_active_to_bank_cfg = i % 4; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFGr, + 0, + i, + &active_to_bank_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + /* 首尾深度指针配置:j为8组循环 */ + for (j = 0; j < 4; j++) + { + for (i = 0; i < 4; i++) + { + k = j * 8 + i; + + qlist_bhead.bank_vld = 1; + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 4 + i), depth); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 4 + i + 1), depth); + qlist_bhead.qcfg_qlist_bhead = (j * 4 + i) * depth; + qlist_btail.qcfg_qlist_btail = ((j * 4 + i + 1) * depth - 1); + qlist_bdep.qcfg_qlist_bdep = depth; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BHEADr, + 0, + k, + &qlist_bhead); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BTAILr, + 0, + k, + &qlist_btail); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + k, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(ETM_QMU_QCFG_QLIST_GRP0_BANKr, 8); + /* 随机表配置,决定ddr内bank的轮询顺序:使用几组ddr需要配置几组 */ + for (j = 0; j < 8; j++) + { + for (i = 0; i < 64; i++) + { + + qlist_grp0_bank.qcfg_qlist_grp0_bank_wr = qlist_grp0_bank_data[i % 4]; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP0_BANKr + j, + 0, + i, + &qlist_grp0_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + } + + for (j = 0; j < 64; j++) + { + qcfg_qlist_grp.qcfg_qlist_grp_wr = j % 4; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRPr, + 0, + j, + &qcfg_qlist_grp); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + rc = dpp_tm_qmu_cfg_done_set(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_cfg_done_set"); + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "++++++dpp_etm_qmu_init_set end++++++\n"); + + return DPP_OK; +} + + + + +/***********************************************************/ +/** QMU/MMU初始化配置场景三:TM独享8组ddr:FTM为0-3组ddr的0~3bank,ETM为4-7组ddr 0~3bank +* MMU开启rotatjon +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_3(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_RANDOM_BYPASS_EN_T etm_bypass = {0}; +// DPP_FTM_QMU_RANDOM_BYPASS_EN_T ftm_bypass = {0}; + + /* etm mmu基址配置:ddr4-7组,bank号0-3,bank深度2048 */ + //rc = dpp_mmu_bank_base_addr_set(dev_id, 0xf0, 0xf, 2048); + //ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_mmu_bank_base_addr_set"); + + rc = dpp_etm_qmu_init_set_3(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_etm_qmu_init_set_1"); + + /* 关闭etm映射配置 */ + etm_bypass.random_bypass_en = 0; + rc = dpp_reg_write(dev_id, + ETM_QMU_RANDOM_BYPASS_ENr, + 0, + 0, + &etm_bypass); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + + return DPP_OK; +} + + +/***********************************************************/ +/**场景4:TM共享2组ddr:FTM为2、4组ddr的01bank,ETM为2、4组ddr 23bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/06/06 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_4(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 k = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + ZXIC_UINT32 depth = 8 * 1024; + ZXIC_UINT32 ddr_to_mmu_cfg_map[2] = {2, 4}; + ZXIC_UINT32 bank_to_mmu_cfg_map[2] = {2, 3}; + ZXIC_UINT32 qlist_grp0_bank_data[2] = {0, 1}; + + + DPP_ETM_QMU_QCFG_QLIST_BDEP_T qlist_bdep = {0}; + DPP_ETM_QMU_QCFG_QLIST_BHEAD_T qlist_bhead = {0}; + DPP_ETM_QMU_QCFG_QLIST_BTAIL_T qlist_btail = {0}; + + DPP_ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFG_T active_to_bank_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_MMU_CFG_T ddr_in_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_QMU_CFG_T ddr_in_qmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_MMU_CFG_T bank_to_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_QMU_CFG_T bank_to_qmu_cfg = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP0_BANK_T qlist_grp0_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP_T qcfg_qlist_grp = {0}; + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "========dpp_etm_qmu_init_set_4 start========n"); + + + /* ddr组从qmu到mmu映射,0~1映射成2 4 */ + for (i = 0; i < 2; i++) + { + ddr_in_mmu_cfg.cfgmt_ddr_in_mmu_cfg = ddr_to_mmu_cfg_map[i]; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_MMU_CFGr, + 0, + i, + &ddr_in_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + /* ddr组从mmu到qmu映射,2 4映射成0~1 */ + for (i = 0; i < 2; i++) + { + ddr_in_qmu_cfg.cfgmt_ddr_in_qmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_QMU_CFGr, + 0, + ddr_to_mmu_cfg_map[i], + &ddr_in_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + + /* bank号从qmu到mmu映射,每组的bank0~1映射成bank2、3 */ + for (j = 0; j < 2; j++) + { + for (i = 0; i < 2; i++) + { + k = j * 8 + i; + + bank_to_mmu_cfg.cfgmt_bank_in_mmu_cfg = bank_to_mmu_cfg_map[i]; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_MMU_CFGr, + 0, + k, + &bank_to_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + + /* bank号从mmu到qmu映射,每组的bank2、3映射成bank0、1 */ + for (j = 0; j < 2; j++) + { + for (i = 0; i < 2; i++) + { + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, ddr_to_mmu_cfg_map[j] , 8); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(dev_id, ddr_to_mmu_cfg_map[j] * 8 , bank_to_mmu_cfg_map[i]); + k = ddr_to_mmu_cfg_map[j] * 8 + bank_to_mmu_cfg_map[i]; + bank_to_qmu_cfg.cfgmt_bank_in_qmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_QMU_CFGr, + 0, + k, + &bank_to_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + /* random映射ram:配置一个chunk中,bank的轮询顺序 */ + for (i = 0; i < 16; i++) + { + + + active_to_bank_cfg.cfgmt_active_to_bank_cfg = i % 2; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFGr, + 0, + i, + &active_to_bank_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + + + /* 首尾深度指针配置 */ + for (j = 0; j < 2; j++) + { + for (i = 0; i < 2; i++) + { + k = j * 8 + i; + + qlist_bhead.bank_vld = 1; + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 2 + i), depth); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 2 + i + 1), depth); + qlist_bhead.qcfg_qlist_bhead = (j * 2 + i) * depth; + qlist_btail.qcfg_qlist_btail = ((j * 2 + i + 1) * depth - 1); + qlist_bdep.qcfg_qlist_bdep = depth; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BHEADr, + 0, + k, + &qlist_bhead); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BTAILr, + 0, + k, + &qlist_btail); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + k, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + for (i = 0; i < 64; i++) + { + qlist_bdep.qcfg_qlist_bdep = depth; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + i, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(ETM_QMU_QCFG_QLIST_GRP0_BANKr, 8); + /* 随机表配置,决定每组bank的轮询顺序 */ + for (j = 0; j < 8; j++) + { + for (i = 0; i < 64; i++) + { + qlist_grp0_bank.qcfg_qlist_grp0_bank_wr = qlist_grp0_bank_data[i % 2]; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP0_BANKr + j, + 0, + i, + &qlist_grp0_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + for (j = 0; j < 64; j++) + { + qcfg_qlist_grp.qcfg_qlist_grp_wr = j % 2; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRPr, + 0, + j, + &qcfg_qlist_grp); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + rc = dpp_tm_qmu_cfg_done_set(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_cfg_done_set"); + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "========dpp_etm_qmu_init_set_4 END=======\n"); + + return DPP_OK; +} + + + + +/***********************************************************/ +/**场景4:TM共享2组ddr:FTM为2、4组ddr的01bank,ETM为2、4组ddr 23bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/06/06 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_4(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_RANDOM_BYPASS_EN_T etm_bypass = {0}; + //DPP_FTM_QMU_RANDOM_BYPASS_EN_T ftm_bypass = {0}; + + /* etm mmu基址配置:ddr2、4组,bank号23,bank深度8*1024 */ + //rc = dpp_mmu_bank_base_addr_set(dev_id, 0x14, 0xc, 8 * 1024); + //ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_mmu_bank_base_addr_set"); + + rc = dpp_etm_qmu_init_set_4(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_etm_qmu_init_set_4"); + + /* 关闭etm映射配置 */ + etm_bypass.random_bypass_en = 0; + rc = dpp_reg_write(dev_id, + ETM_QMU_RANDOM_BYPASS_ENr, + 0, + 0, + &etm_bypass); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 场景5:TM共享4组ddr:FTM为1234组ddr的01bank,ETM为1234组ddr 23bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/06/06 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_5(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 k = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + ZXIC_UINT32 depth = 4*1024; + ZXIC_UINT32 bank_to_mmu_cfg_map[2] = {2, 3}; + ZXIC_UINT32 qlist_grp0_bank_data[2] = {0, 1}; + ZXIC_UINT32 ddr_no[4] = {1, 2, 3, 4}; + + + DPP_ETM_QMU_QCFG_QLIST_BDEP_T qlist_bdep = {0}; + DPP_ETM_QMU_QCFG_QLIST_BHEAD_T qlist_bhead = {0}; + DPP_ETM_QMU_QCFG_QLIST_BTAIL_T qlist_btail = {0}; + + DPP_ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFG_T active_to_bank_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_MMU_CFG_T ddr_in_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_QMU_CFG_T ddr_in_qmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_MMU_CFG_T bank_to_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_QMU_CFG_T bank_to_qmu_cfg = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP0_BANK_T qlist_grp0_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP_T qcfg_qlist_grp = {0}; + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "========dpp_etm_qmu_init_set_5 start========n"); + + + /* ddr组从qmu到mmu映射,0~3映射成1234 */ + for (i = 0; i < 4; i++) + { + ddr_in_mmu_cfg.cfgmt_ddr_in_mmu_cfg = ddr_no[i]; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_MMU_CFGr, + 0, + i, + &ddr_in_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + /* ddr组从mmu到qmu映射,1234映射成0~3 */ + for (i = 0; i < 4; i++) + { + ddr_in_qmu_cfg.cfgmt_ddr_in_qmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_QMU_CFGr, + 0, + ddr_no[i], + &ddr_in_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + + /* bank号从qmu到mmu映射,每组的bank0~1映射成bank2、3 */ + for (j = 0; j < 4; j++) + { + for (i = 0; i < 2; i++) + { + k = j * 8 + i; + + bank_to_mmu_cfg.cfgmt_bank_in_mmu_cfg = bank_to_mmu_cfg_map[i]; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_MMU_CFGr, + 0, + k, + &bank_to_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + + /* bank号从mmu到qmu映射,每组的bank2、3映射成bank0、1 */ + for (j = 0; j < 4; j++) + { + for (i = 0; i < 2; i++) + { + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, ddr_no[j] , 8); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(dev_id, ddr_no[j] * 8 , bank_to_mmu_cfg_map[i]); + k = ddr_no[j] * 8 + bank_to_mmu_cfg_map[i]; + bank_to_qmu_cfg.cfgmt_bank_in_qmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_QMU_CFGr, + 0, + k, + &bank_to_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + /* random映射ram:配置一个chunk中,bank的轮询顺序 */ + for (i = 0; i < 16; i++) + { + + + active_to_bank_cfg.cfgmt_active_to_bank_cfg = i % 2; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFGr, + 0, + i, + &active_to_bank_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + + + /* 首尾深度指针配置 */ + for (j = 0; j < 4; j++) + { + for (i = 0; i < 2; i++) + { + k = j * 8 + i; + + qlist_bhead.bank_vld = 1; + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 2 + i), depth); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 2 + i + 1), depth); + qlist_bhead.qcfg_qlist_bhead = (j * 2 + i) * depth; + qlist_btail.qcfg_qlist_btail = ((j * 2 + i + 1) * depth - 1); + qlist_bdep.qcfg_qlist_bdep = depth; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BHEADr, + 0, + k, + &qlist_bhead); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BTAILr, + 0, + k, + &qlist_btail); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + k, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + for (i = 0; i < 64; i++) + { + qlist_bdep.qcfg_qlist_bdep = depth; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + i, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(ETM_QMU_QCFG_QLIST_GRP0_BANKr, 8); + /* 随机表配置,决定每组bank的轮询顺序 */ + for (j = 0; j < 8; j++) + { + for (i = 0; i < 64; i++) + { + qlist_grp0_bank.qcfg_qlist_grp0_bank_wr = qlist_grp0_bank_data[i % 2]; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP0_BANKr + j, + 0, + i, + &qlist_grp0_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + for (j = 0; j < 64; j++) + { + qcfg_qlist_grp.qcfg_qlist_grp_wr = j % 4; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRPr, + 0, + j, + &qcfg_qlist_grp); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + rc = dpp_tm_qmu_cfg_done_set(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_cfg_done_set"); + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "========dpp_etm_qmu_init_set_5 END=======\n"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 场景5:TM共享4组ddr:FTM为1234组ddr的01bank,ETM为1234组ddr 23bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/06/06 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_5(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + + /* etm mmu基址配置:ddr1234组,bank号23,bank深度4*1024 */ + //rc = dpp_mmu_bank_base_addr_set(dev_id, 0x1e, 0xc, 4*1024); + //ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_mmu_bank_base_addr_set"); + + rc = dpp_etm_qmu_init_set_5(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_etm_qmu_init_set_5"); + + return DPP_OK; +} + + +/***********************************************************/ +/** QMU初始化配置场景6:4组*2bank,MMU实际分配ftm:4,6,7,9组(01bank); etm:4,6,7,9组(23bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/05/13 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_6(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 k = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + ZXIC_UINT32 depth = 4*1024; + ZXIC_UINT32 bank_to_mmu_cfg_map[4] = {2, 3}; + ZXIC_UINT32 qlist_grp0_bank_data[4] = {0, 1}; + ZXIC_UINT32 ddr_no[4] = {4, 6, 7, 9}; + + + DPP_ETM_QMU_QCFG_QLIST_BDEP_T qlist_bdep = {0}; + DPP_ETM_QMU_QCFG_QLIST_BHEAD_T qlist_bhead = {0}; + DPP_ETM_QMU_QCFG_QLIST_BTAIL_T qlist_btail = {0}; + + DPP_ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFG_T active_to_bank_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_MMU_CFG_T ddr_in_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_QMU_CFG_T ddr_in_qmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_MMU_CFG_T bank_to_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_QMU_CFG_T bank_to_qmu_cfg = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP0_BANK_T qlist_grp0_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP_T qcfg_qlist_grp = {0}; + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "========dpp_etm_qmu_init_set_1 start========n"); + + + /* ddr组从qmu到mmu映射,0~3映射成4679 */ + for (i = 0; i < 4; i++) + { + ddr_in_mmu_cfg.cfgmt_ddr_in_mmu_cfg = ddr_no[i]; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_MMU_CFGr, + 0, + i, + &ddr_in_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + /* ddr组从mmu到qmu映射,4679映射成0~3 */ + for (i = 0; i < 4; i++) + { + ddr_in_qmu_cfg.cfgmt_ddr_in_qmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_QMU_CFGr, + 0, + ddr_no[i], + &ddr_in_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + + /* bank号从qmu到mmu映射,每组的bank0~1映射成bank2、3 */ + for (j = 0; j < 4; j++) + { + for (i = 0; i < 2; i++) + { + k = j * 8 + i; + + bank_to_mmu_cfg.cfgmt_bank_in_mmu_cfg = bank_to_mmu_cfg_map[i]; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_MMU_CFGr, + 0, + k, + &bank_to_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + + /* bank号从mmu到qmu映射,每组的bank2、3映射成bank0、1 */ + for (j = 0; j < 4; j++) + { + for (i = 0; i < 2; i++) + { + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, ddr_no[j] , 8); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(dev_id, ddr_no[j] * 8 , bank_to_mmu_cfg_map[i]); + k = ddr_no[j] * 8 + bank_to_mmu_cfg_map[i]; + bank_to_qmu_cfg.cfgmt_bank_in_qmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_QMU_CFGr, + 0, + k, + &bank_to_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + /* random映射ram:配置一个chunk中,bank的轮询顺序 */ + for (i = 0; i < 16; i++) + { + + + active_to_bank_cfg.cfgmt_active_to_bank_cfg = i % 2; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFGr, + 0, + i, + &active_to_bank_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + + + /* 首尾深度指针配置 */ + for (j = 0; j < 4; j++) + { + for (i = 0; i < 2; i++) + { + k = j * 8 + i; + + qlist_bhead.bank_vld = 1; + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 2 + i), depth); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 2 + i + 1), depth); + qlist_bhead.qcfg_qlist_bhead = (j * 2 + i) * depth; + qlist_btail.qcfg_qlist_btail = ((j * 2 + i + 1) * depth - 1); + qlist_bdep.qcfg_qlist_bdep = depth; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BHEADr, + 0, + k, + &qlist_bhead); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BTAILr, + 0, + k, + &qlist_btail); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + k, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + for (i = 0; i < 64; i++) + { + qlist_bdep.qcfg_qlist_bdep = depth; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + i, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(ETM_QMU_QCFG_QLIST_GRP0_BANKr, 8); + /* 随机表配置,决定每组bank的轮询顺序 */ + for (j = 0; j < 8; j++) + { + for (i = 0; i < 64; i++) + { + qlist_grp0_bank.qcfg_qlist_grp0_bank_wr = qlist_grp0_bank_data[i % 2]; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP0_BANKr + j, + 0, + i, + &qlist_grp0_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + for (j = 0; j < 64; j++) + { + qcfg_qlist_grp.qcfg_qlist_grp_wr = j % 4; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRPr, + 0, + j, + &qcfg_qlist_grp); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + rc = dpp_tm_qmu_cfg_done_set(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_cfg_done_set"); + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "========dpp_etm_qmu_init_set_1 END=======\n"); + + return DPP_OK; +} + + + +/***********************************************************/ +/** QMU初始化配置场景6:4组*2bank,MMU实际分配ftm:4,6,7,9组(01bank); etm:4,6,7,9组(23bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/05/13 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_6(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + + /* etm mmu基址配置:ddr4,6,7,9组,bank号01,bank深度4*1024 */ + //rc = dpp_mmu_bank_base_addr_set(dev_id, 0x2d0, 0xc, 4*1024); + //ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_mmu_bank_base_addr_set"); + + rc = dpp_etm_qmu_init_set_6(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_etm_qmu_init_set"); + + return DPP_OK; +} + + +/***********************************************************/ +/** QMU/MMU初始化配置场景7:每个tm用8组*4bank,MMU实际分配ftm:2-9组(0145bank); etm:2-9组(2367bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/10/14 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_7(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 k = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + ZXIC_UINT32 depth = 1024; + ZXIC_UINT32 bank_to_mmu_cfg_map[4] = {2, 3, 6, 7}; + ZXIC_UINT32 qlist_grp0_bank_data[4] = {0, 1, 2, 3}; + + + DPP_ETM_QMU_QCFG_QLIST_BDEP_T qlist_bdep = {0}; + DPP_ETM_QMU_QCFG_QLIST_BHEAD_T qlist_bhead = {0}; + DPP_ETM_QMU_QCFG_QLIST_BTAIL_T qlist_btail = {0}; + + DPP_ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFG_T active_to_bank_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_MMU_CFG_T ddr_in_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_QMU_CFG_T ddr_in_qmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_MMU_CFG_T bank_to_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_QMU_CFG_T bank_to_qmu_cfg = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP0_BANK_T qlist_grp0_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP_T qcfg_qlist_grp = {0}; + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "========dpp_etm_qmu_init_set_1 start========n"); + + + /* ddr组从qmu到mmu映射,0~7映射成2~9 */ + for (i = 0; i < 8; i++) + { + ddr_in_mmu_cfg.cfgmt_ddr_in_mmu_cfg = (i + 2); + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_MMU_CFGr, + 0, + i, + &ddr_in_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + /* ddr组从mmu到qmu映射,2~9映射成0~7 */ + for (i = 2; i < 10; i++) + { + ddr_in_qmu_cfg.cfgmt_ddr_in_qmu_cfg = (i - 2); + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_QMU_CFGr, + 0, + i, + &ddr_in_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + + /* bank号从qmu到mmu映射,每组的bank0~3映射成bank2、3、6、7 */ + for (j = 0; j < 8; j++) + { + for (i = 0; i < 4; i++) + { + k = j * 8 + i; + + bank_to_mmu_cfg.cfgmt_bank_in_mmu_cfg = bank_to_mmu_cfg_map[i]; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_MMU_CFGr, + 0, + k, + &bank_to_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + + /* bank号从mmu到qmu映射,每组的bank2、3、6、7映射成bank0、1、2、3 */ + for (j = 2; j < 10; j++) + { + for (i = 0; i < 4; i++) + { + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, j , 8); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(dev_id, j* 8 , bank_to_mmu_cfg_map[i]); + k = j * 8 + bank_to_mmu_cfg_map[i]; + bank_to_qmu_cfg.cfgmt_bank_in_qmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_QMU_CFGr, + 0, + k, + &bank_to_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + /* random映射ram:配置一个chunk中,bank的轮询顺序 */ + for (i = 0; i < 16; i++) + { + + + active_to_bank_cfg.cfgmt_active_to_bank_cfg = i % 4; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFGr, + 0, + i, + &active_to_bank_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + + + /* 首尾深度指针配置 */ + for (j = 0; j < 8; j++) + { + for (i = 0; i < 4; i++) + { + k = j * 8 + i; + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 4 + i), depth); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 4 + i + 1), depth); + qlist_bhead.bank_vld = 1; + qlist_bhead.qcfg_qlist_bhead = (j * 4 + i) * depth; + qlist_btail.qcfg_qlist_btail = ((j * 4 + i + 1) * depth - 1); + qlist_bdep.qcfg_qlist_bdep = depth; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BHEADr, + 0, + k, + &qlist_bhead); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BTAILr, + 0, + k, + &qlist_btail); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + k, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + for (i = 0; i < 64; i++) + { + qlist_bdep.qcfg_qlist_bdep = depth; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + i, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(ETM_QMU_QCFG_QLIST_GRP0_BANKr, 8); + /* 随机表配置,决定每组bank的轮询顺序 */ + for (j = 0; j < 8; j++) + { + for (i = 0; i < 64; i++) + { + qlist_grp0_bank.qcfg_qlist_grp0_bank_wr = qlist_grp0_bank_data[i % 4]; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP0_BANKr + j, + 0, + i, + &qlist_grp0_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + for (j = 0; j < 64; j++) + { + qcfg_qlist_grp.qcfg_qlist_grp_wr = j % 8; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRPr, + 0, + j, + &qcfg_qlist_grp); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + rc = dpp_tm_qmu_cfg_done_set(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_cfg_done_set"); + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "========dpp_etm_qmu_init_set_1 END=======\n"); + + return DPP_OK; +} + + + +/***********************************************************/ +/** QMU/MMU初始化配置场景7:每个tm用8组*4bank,MMU实际分配ftm:2-9组(0145bank); etm:2-9组(2367bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/10/14 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_7(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + + + + /*关闭随机模式*/ + rc = dpp_tm_qmu_ddr_random_set(dev_id, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_ddr_random_set"); + + /* etm mmu基址配置:ddr2-9组,bank号2367,bank深度1024 */ + //rc = dpp_mmu_bank_base_addr_set(dev_id, 0x3fc, 0xcc, 1024); + //ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_mmu_bank_base_addr_set"); + + rc = dpp_etm_qmu_init_set_7(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_etm_qmu_init_set"); + + return DPP_OK; +} + + +/***********************************************************/ +/** QMU/MMU初始化配置场景8:每个tm用8组*4bank,MMU实际分配ftm:2-9组(01bank); etm:2-9组(23bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/10/14 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_8(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 k = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + ZXIC_UINT32 depth = 2048; + ZXIC_UINT32 bank_to_mmu_cfg_map[4] = {2, 3}; + ZXIC_UINT32 qlist_grp0_bank_data[4] = {0, 1}; + + + DPP_ETM_QMU_QCFG_QLIST_BDEP_T qlist_bdep = {0}; + DPP_ETM_QMU_QCFG_QLIST_BHEAD_T qlist_bhead = {0}; + DPP_ETM_QMU_QCFG_QLIST_BTAIL_T qlist_btail = {0}; + + DPP_ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFG_T active_to_bank_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_MMU_CFG_T ddr_in_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_QMU_CFG_T ddr_in_qmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_MMU_CFG_T bank_to_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_QMU_CFG_T bank_to_qmu_cfg = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP0_BANK_T qlist_grp0_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP_T qcfg_qlist_grp = {0}; + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "========dpp_etm_qmu_init_set_1 start========n"); + + + /* ddr组从qmu到mmu映射,0~7映射成2~9 */ + for (i = 0; i < 8; i++) + { + ddr_in_mmu_cfg.cfgmt_ddr_in_mmu_cfg = (i + 2); + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_MMU_CFGr, + 0, + i, + &ddr_in_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + /* ddr组从mmu到qmu映射,2~9映射成0~7 */ + for (i = 2; i < 10; i++) + { + ddr_in_qmu_cfg.cfgmt_ddr_in_qmu_cfg = (i - 2); + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_QMU_CFGr, + 0, + i, + &ddr_in_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + + /* bank号从qmu到mmu映射,每组的bank0~1映射成bank2、3 */ + for (j = 0; j < 8; j++) + { + for (i = 0; i < 2; i++) + { + k = j * 8 + i; + + bank_to_mmu_cfg.cfgmt_bank_in_mmu_cfg = bank_to_mmu_cfg_map[i]; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_MMU_CFGr, + 0, + k, + &bank_to_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + + /* bank号从mmu到qmu映射,每组的bank2、3映射成bank0、1 */ + for (j = 2; j < 10; j++) + { + for (i = 0; i < 2; i++) + { + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, j, 8); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(dev_id, j * 8 , bank_to_mmu_cfg_map[i]); + k = j * 8 + bank_to_mmu_cfg_map[i]; + bank_to_qmu_cfg.cfgmt_bank_in_qmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_QMU_CFGr, + 0, + k, + &bank_to_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + /* random映射ram:配置一个chunk中,bank的轮询顺序 */ + for (i = 0; i < 16; i++) + { + + + active_to_bank_cfg.cfgmt_active_to_bank_cfg = i % 2; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFGr, + 0, + i, + &active_to_bank_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + + + /* 首尾深度指针配置 */ + for (j = 0; j < 8; j++) + { + for (i = 0; i < 2; i++) + { + k = j * 8 + i; + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 2 + i), depth); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 2 + i + 1), depth); + qlist_bhead.bank_vld = 1; + qlist_bhead.qcfg_qlist_bhead = (j * 2 + i) * depth; + qlist_btail.qcfg_qlist_btail = ((j * 2 + i + 1) * depth - 1); + qlist_bdep.qcfg_qlist_bdep = depth; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BHEADr, + 0, + k, + &qlist_bhead); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BTAILr, + 0, + k, + &qlist_btail); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + k, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(ETM_QMU_QCFG_QLIST_GRP0_BANKr, 8); + /* 随机表配置,决定每组bank的轮询顺序 */ + for (j = 0; j < 8; j++) + { + for (i = 0; i < 64; i++) + { + qlist_grp0_bank.qcfg_qlist_grp0_bank_wr = qlist_grp0_bank_data[i % 2]; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP0_BANKr + j, + 0, + i, + &qlist_grp0_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + for (j = 0; j < 64; j++) + { + qcfg_qlist_grp.qcfg_qlist_grp_wr = j % 8; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRPr, + 0, + j, + &qcfg_qlist_grp); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + rc = dpp_tm_qmu_cfg_done_set(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_cfg_done_set"); + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "========dpp_etm_qmu_init_set_1 END=======\n"); + + return DPP_OK; +} + + + +/***********************************************************/ +/** QMU/MMU初始化配置场景8:每个tm用8组*4bank,MMU实际分配ftm:2-9组(01bank); etm:2-9组(23bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/10/14 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_8(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + + /* etm mmu基址配置:ddr2-9组,bank号23,bank深度1024 */ + //rc = dpp_mmu_bank_base_addr_set(dev_id, 0x3fc, 0xc, 2048); + //ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_mmu_bank_base_addr_set"); + + rc = dpp_etm_qmu_init_set_8(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_etm_qmu_init_set"); + + return DPP_OK; +} + + +/***********************************************************/ +/** QMU初始化配置场景9:4组*2bank,MMU实际分配ftm:6,7,8,9组(01bank); etm:6,7,8,9组(23bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/09/28 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_9(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 k = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + ZXIC_UINT32 depth = 4*1024; + ZXIC_UINT32 bank_to_mmu_cfg_map[4] = {2, 3}; + ZXIC_UINT32 qlist_grp0_bank_data[4] = {0, 1}; + ZXIC_UINT32 ddr_no[4] = {6, 7, 8, 9}; + + + DPP_ETM_QMU_QCFG_QLIST_BDEP_T qlist_bdep = {0}; + DPP_ETM_QMU_QCFG_QLIST_BHEAD_T qlist_bhead = {0}; + DPP_ETM_QMU_QCFG_QLIST_BTAIL_T qlist_btail = {0}; + + DPP_ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFG_T active_to_bank_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_MMU_CFG_T ddr_in_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_QMU_CFG_T ddr_in_qmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_MMU_CFG_T bank_to_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_QMU_CFG_T bank_to_qmu_cfg = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP0_BANK_T qlist_grp0_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP_T qcfg_qlist_grp = {0}; + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "========dpp_etm_qmu_init_set_1 start========n"); + + + /* ddr组从qmu到mmu映射,0~3映射成4679 */ + for (i = 0; i < 4; i++) + { + ddr_in_mmu_cfg.cfgmt_ddr_in_mmu_cfg = ddr_no[i]; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_MMU_CFGr, + 0, + i, + &ddr_in_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + /* ddr组从mmu到qmu映射,4679映射成0~3 */ + for (i = 0; i < 4; i++) + { + ddr_in_qmu_cfg.cfgmt_ddr_in_qmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_QMU_CFGr, + 0, + ddr_no[i], + &ddr_in_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + + /* bank号从qmu到mmu映射,每组的bank0~1映射成bank2、3 */ + for (j = 0; j < 4; j++) + { + for (i = 0; i < 2; i++) + { + k = j * 8 + i; + + bank_to_mmu_cfg.cfgmt_bank_in_mmu_cfg = bank_to_mmu_cfg_map[i]; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_MMU_CFGr, + 0, + k, + &bank_to_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + + /* bank号从mmu到qmu映射,每组的bank2、3映射成bank0、1 */ + for (j = 0; j < 4; j++) + { + for (i = 0; i < 2; i++) + { + ZXIC_COMM_CHECK_INDEX_MUL_OVERFLOW_NO_ASSERT(ddr_no[j], 8); + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(ddr_no[j] * 8, bank_to_mmu_cfg_map[i]); + k = ddr_no[j] * 8 + bank_to_mmu_cfg_map[i]; + + bank_to_qmu_cfg.cfgmt_bank_in_qmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_QMU_CFGr, + 0, + k, + &bank_to_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + /* random映射ram:配置一个chunk中,bank的轮询顺序 */ + for (i = 0; i < 16; i++) + { + + + active_to_bank_cfg.cfgmt_active_to_bank_cfg = i % 2; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFGr, + 0, + i, + &active_to_bank_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + + + /* 首尾深度指针配置 */ + for (j = 0; j < 4; j++) + { + for (i = 0; i < 2; i++) + { + k = j * 8 + i; + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 2 + i), depth); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 2 + i + 1), depth); + qlist_bhead.bank_vld = 1; + qlist_bhead.qcfg_qlist_bhead = (j * 2 + i) * depth; + qlist_btail.qcfg_qlist_btail = ((j * 2 + i + 1) * depth - 1); + qlist_bdep.qcfg_qlist_bdep = depth; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BHEADr, + 0, + k, + &qlist_bhead); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BTAILr, + 0, + k, + &qlist_btail); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + k, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + for (i = 0; i < 64; i++) + { + qlist_bdep.qcfg_qlist_bdep = depth; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + i, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(ETM_QMU_QCFG_QLIST_GRP0_BANKr, 8); + /* 随机表配置,决定每组bank的轮询顺序 */ + for (j = 0; j < 8; j++) + { + for (i = 0; i < 64; i++) + { + qlist_grp0_bank.qcfg_qlist_grp0_bank_wr = qlist_grp0_bank_data[i % 2]; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP0_BANKr + j, + 0, + i, + &qlist_grp0_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + for (j = 0; j < 64; j++) + { + qcfg_qlist_grp.qcfg_qlist_grp_wr = j % 4; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRPr, + 0, + j, + &qcfg_qlist_grp); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + rc = dpp_tm_qmu_cfg_done_set(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_cfg_done_set"); + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "========dpp_etm_qmu_init_set_1 END=======\n"); + + return DPP_OK; +} + + +/***********************************************************/ +/** QMU/MMU初始化配置场景8:每个tm用8组*4bank,MMU实际分配ftm:2-9组(01bank); etm:2-9组(23bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/10/14 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_9(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + + /* etm mmu基址配置:ddr2-9组,bank号23,bank深度1024 */ + //rc = dpp_mmu_bank_base_addr_set(dev_id, 0x3fc, 0xc, 2048); + //ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_mmu_bank_base_addr_set"); + + rc = dpp_etm_qmu_init_set_8(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_etm_qmu_init_set"); + + return DPP_OK; +} + +/***********************************************************/ +/** QMU初始化配置场景10:独享2组*8bank,MMU实际分配1,2; etm or ftm使用0-7bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/12/16 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_10(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 k = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + ZXIC_UINT32 depth = 2*1024; + ZXIC_UINT32 bank_to_mmu_cfg_map[8] = {0, 1, 2, 3, 4, 5, 6, 7}; + ZXIC_UINT32 qlist_grp0_bank_data[8] = {0, 1, 2, 3, 4, 5, 6, 7}; + ZXIC_UINT32 ddr_no[2] = {1,2}; + + + DPP_ETM_QMU_QCFG_QLIST_BDEP_T qlist_bdep = {0}; + DPP_ETM_QMU_QCFG_QLIST_BHEAD_T qlist_bhead = {0}; + DPP_ETM_QMU_QCFG_QLIST_BTAIL_T qlist_btail = {0}; + + DPP_ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFG_T active_to_bank_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_MMU_CFG_T ddr_in_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_QMU_CFG_T ddr_in_qmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_MMU_CFG_T bank_to_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_QMU_CFG_T bank_to_qmu_cfg = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP0_BANK_T qlist_grp0_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP_T qcfg_qlist_grp = {0}; + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "========dpp_etm_qmu_init_set_1 start========n"); + + + /* ddr组从qmu到mmu映射,0~1映射成12 */ + for (i = 0; i < 2; i++) + { + ddr_in_mmu_cfg.cfgmt_ddr_in_mmu_cfg = ddr_no[i]; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_MMU_CFGr, + 0, + i, + &ddr_in_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + /* ddr组从mmu到qmu映射,12映射成0~1 */ + for (i = 0; i < 2; i++) + { + ddr_in_qmu_cfg.cfgmt_ddr_in_qmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_QMU_CFGr, + 0, + ddr_no[i], + &ddr_in_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + + /* bank号从qmu到mmu映射,每组的bank0~7映射成bank0-7 */ + for (j = 0; j < 2; j++) + { + for (i = 0; i < 8; i++) + { + k = j * 8 + i; + + bank_to_mmu_cfg.cfgmt_bank_in_mmu_cfg = bank_to_mmu_cfg_map[i]; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_MMU_CFGr, + 0, + k, + &bank_to_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + + /* bank号从mmu到qmu映射,每组的bank0-7映射成bank0-7 */ + for (j = 0; j < 2; j++) + { + for (i = 0; i < 8; i++) + { + ZXIC_COMM_CHECK_INDEX_MUL_OVERFLOW_NO_ASSERT(ddr_no[j], 8); + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(ddr_no[j] * 8, bank_to_mmu_cfg_map[i]); + k = ddr_no[j] * 8 + bank_to_mmu_cfg_map[i]; + + bank_to_qmu_cfg.cfgmt_bank_in_qmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_QMU_CFGr, + 0, + k, + &bank_to_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + /* random映射ram:配置一个chunk中,bank的轮询顺序 */ + for (i = 0; i < 16; i++) + { + + + active_to_bank_cfg.cfgmt_active_to_bank_cfg = i % 8; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFGr, + 0, + i, + &active_to_bank_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + + + /* 首尾深度指针配置 */ + for (j = 0; j < 2; j++) + { + for (i = 0; i < 8; i++) + { + k = j * 8 + i; + + qlist_bhead.bank_vld = 1; + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 8 + i), depth); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 8 + i + 1), depth); + qlist_bhead.qcfg_qlist_bhead = (j * 8 + i) * depth; + qlist_btail.qcfg_qlist_btail = ((j * 8 + i + 1) * depth - 1); + qlist_bdep.qcfg_qlist_bdep = depth; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BHEADr, + 0, + k, + &qlist_bhead); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BTAILr, + 0, + k, + &qlist_btail); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + k, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + for (i = 0; i < 64; i++) + { + qlist_bdep.qcfg_qlist_bdep = depth; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + i, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(ETM_QMU_QCFG_QLIST_GRP0_BANKr, 8); + /* 随机表配置,决定每组bank的轮询顺序 */ + for (j = 0; j < 8; j++) + { + for (i = 0; i < 64; i++) + { + qlist_grp0_bank.qcfg_qlist_grp0_bank_wr = qlist_grp0_bank_data[i % 8]; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP0_BANKr + j, + 0, + i, + &qlist_grp0_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + for (j = 0; j < 64; j++) + { + qcfg_qlist_grp.qcfg_qlist_grp_wr = j % 2; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRPr, + 0, + j, + &qcfg_qlist_grp); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + rc = dpp_tm_qmu_cfg_done_set(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_cfg_done_set"); + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "========dpp_etm_qmu_init_set_1 END=======\n"); + + return DPP_OK; +} + +/***********************************************************/ +/** QMU初始化配置场景10:独享2组*8bank,MMU实际分配1,2; etm or ftm使用0-7bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/12/16 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_10(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + + /* etm mmu基址配置:ddr1,2组,bank号0-7,bank深度2*1024 */ + //rc = dpp_mmu_bank_base_addr_set(dev_id, 0x6, 0xff, 2*1024); + //ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_mmu_bank_base_addr_set"); + + rc = dpp_etm_qmu_init_set_10(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_etm_qmu_init_set_10"); + + return DPP_OK; +} + + +/***********************************************************/ +/**场景11:TM共享2组ddr:FTM为ddr_no1、ddr_no2组ddr的01bank,ETM为ddr_no1、ddr_no2组ddr 23bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/06/06 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_11(ZXIC_UINT32 dev_id, ZXIC_UINT32 ddr_no1, ZXIC_UINT32 ddr_no2) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 k = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + ZXIC_UINT32 depth = 8 * 1024; + ZXIC_UINT32 ddr_to_mmu_cfg_map[2] = {ddr_no1, ddr_no2}; + ZXIC_UINT32 bank_to_mmu_cfg_map[2] = {2, 3}; + ZXIC_UINT32 qlist_grp0_bank_data[2] = {0, 1}; + + + DPP_ETM_QMU_QCFG_QLIST_BDEP_T qlist_bdep = {0}; + DPP_ETM_QMU_QCFG_QLIST_BHEAD_T qlist_bhead = {0}; + DPP_ETM_QMU_QCFG_QLIST_BTAIL_T qlist_btail = {0}; + + DPP_ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFG_T active_to_bank_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_MMU_CFG_T ddr_in_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_QMU_CFG_T ddr_in_qmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_MMU_CFG_T bank_to_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_QMU_CFG_T bank_to_qmu_cfg = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP0_BANK_T qlist_grp0_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP_T qcfg_qlist_grp = {0}; + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "========dpp_etm_qmu_init_set_11 start========n"); + + + /* ddr组从qmu到mmu映射,0~1映射成ddr_no1 ddr_no2 */ + for (i = 0; i < 2; i++) + { + ddr_in_mmu_cfg.cfgmt_ddr_in_mmu_cfg = ddr_to_mmu_cfg_map[i]; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_MMU_CFGr, + 0, + i, + &ddr_in_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + /* ddr组从mmu到qmu映射,ddr_no1 ddr_no2映射成0~1 */ + for (i = 0; i < 2; i++) + { + ddr_in_qmu_cfg.cfgmt_ddr_in_qmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_QMU_CFGr, + 0, + ddr_to_mmu_cfg_map[i], + &ddr_in_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + + /* bank号从qmu到mmu映射,每组的bank0~1映射成bank2、3 */ + for (j = 0; j < 2; j++) + { + for (i = 0; i < 2; i++) + { + k = j * 8 + i; + + bank_to_mmu_cfg.cfgmt_bank_in_mmu_cfg = bank_to_mmu_cfg_map[i]; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_MMU_CFGr, + 0, + k, + &bank_to_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + + /* bank号从mmu到qmu映射,每组的bank2、3映射成bank0、1 */ + for (j = 0; j < 2; j++) + { + for (i = 0; i < 2; i++) + { + ZXIC_COMM_CHECK_INDEX_MUL_OVERFLOW_NO_ASSERT(ddr_to_mmu_cfg_map[j], 8); + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(ddr_to_mmu_cfg_map[j] * 8, bank_to_mmu_cfg_map[i]); + k = ddr_to_mmu_cfg_map[j] * 8 + bank_to_mmu_cfg_map[i]; + + bank_to_qmu_cfg.cfgmt_bank_in_qmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_QMU_CFGr, + 0, + k, + &bank_to_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + /* random映射ram:配置一个chunk中,bank的轮询顺序 */ + for (i = 0; i < 16; i++) + { + + + active_to_bank_cfg.cfgmt_active_to_bank_cfg = i % 2; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFGr, + 0, + i, + &active_to_bank_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + + + /* 首尾深度指针配置 */ + for (j = 0; j < 2; j++) + { + for (i = 0; i < 2; i++) + { + k = j * 8 + i; + + qlist_bhead.bank_vld = 1; + ZXIC_COMM_CHECK_INDEX_MUL_OVERFLOW_NO_ASSERT((j * 2 + i), depth); + qlist_bhead.qcfg_qlist_bhead = (j * 2 + i) * depth; + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 2 + i), depth); + qlist_btail.qcfg_qlist_btail = ((j * 2 + i + 1) * depth - 1); + qlist_bdep.qcfg_qlist_bdep = depth; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BHEADr, + 0, + k, + &qlist_bhead); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BTAILr, + 0, + k, + &qlist_btail); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + k, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + for (i = 0; i < 64; i++) + { + qlist_bdep.qcfg_qlist_bdep = depth; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + i, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(ETM_QMU_QCFG_QLIST_GRP0_BANKr, 8); + /* 随机表配置,决定每组bank的轮询顺序 */ + for (j = 0; j < 8; j++) + { + for (i = 0; i < 64; i++) + { + qlist_grp0_bank.qcfg_qlist_grp0_bank_wr = qlist_grp0_bank_data[i % 2]; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP0_BANKr + j, + 0, + i, + &qlist_grp0_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + for (j = 0; j < 64; j++) + { + qcfg_qlist_grp.qcfg_qlist_grp_wr = j % 2; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRPr, + 0, + j, + &qcfg_qlist_grp); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + rc = dpp_tm_qmu_cfg_done_set(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_cfg_done_set"); + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "========dpp_etm_qmu_init_set_11 END=======\n"); + + return DPP_OK; +} + + + +/***********************************************************/ +/**场景4:TM共享2组ddr:FTM为ddr_no1,ddr_no2组ddr的01bank,ETM为ddr_no1,ddr_no2组ddr 23bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/06/06 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_11(ZXIC_UINT32 dev_id, ZXIC_UINT32 ddr_no1, ZXIC_UINT32 ddr_no2) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_RANDOM_BYPASS_EN_T etm_bypass = {0}; + //DPP_FTM_QMU_RANDOM_BYPASS_EN_T ftm_bypass = {0}; + + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT((1U<> 4) & 0xf; + ddr_no_data[1] = (ddr_no >> 8) & 0xf; + ddr_no_data[0] = (ddr_no >> 12) & 0xf; + + /* ddr组从qmu到mmu映射,0~3映射成ddr_no */ + for (i = 0; i < 4; i++) + { + ddr_in_mmu_cfg.cfgmt_ddr_in_mmu_cfg = ddr_no_data[i]; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_MMU_CFGr, + 0, + i, + &ddr_in_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + /* ddr组从mmu到qmu映射,ddr_no映射成0~3 */ + for (i = 0; i < 4; i++) + { + ddr_in_qmu_cfg.cfgmt_ddr_in_qmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_QMU_CFGr, + 0, + ddr_no_data[i], + &ddr_in_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + /* bank号从qmu到mmu映射,组0~3的bank0-7映射成bank0-7 */ + for (j = 0; j < 4; j++) + { + for (i = 0; i < 8; i++) + { + k = j * 8 + i; + + bank_to_mmu_cfg.cfgmt_bank_in_mmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_MMU_CFGr, + 0, + k, + &bank_to_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + + /* bank号从mmu到qmu映射,组ddr_no的bank0-7映射成bank0-7 */ + for (j = 0; j < 4; j++) + { + for (i = 0; i < 8; i++) + { + ZXIC_COMM_CHECK_INDEX_MUL_OVERFLOW_NO_ASSERT(ddr_no_data[j], 8); + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(ddr_no_data[j] * 8, i); + k = ddr_no_data[j] * 8 + i; + + bank_to_qmu_cfg.cfgmt_bank_in_qmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_QMU_CFGr, + 0, + k, + &bank_to_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + /* random映射ram:配置一个chunk中,bank的轮询顺序 */ + for (i = 0; i < 16; i++) + { + active_to_bank_cfg.cfgmt_active_to_bank_cfg = i % 8; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFGr, + 0, + i, + &active_to_bank_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + /* 首尾深度指针配置:j为4组循环 */ + for (j = 0; j < 4; j++) + { + for (i = 0; i < 8; i++) + { + k = j * 8 + i; + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 8 + i), depth); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 8 + i + 1), depth); + qlist_bhead.bank_vld = 1; + qlist_bhead.qcfg_qlist_bhead = (j * 8 + i) * depth; + qlist_btail.qcfg_qlist_btail = ((j * 8 + i + 1) * depth - 1); + qlist_bdep.qcfg_qlist_bdep = depth; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BHEADr, + 0, + k, + &qlist_bhead); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BTAILr, + 0, + k, + &qlist_btail); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + k, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + for (i = 0; i < 64; i++) + { + qlist_bdep.qcfg_qlist_bdep = depth; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + i, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(ETM_QMU_QCFG_QLIST_GRP0_BANKr, 8); + /* 随机表配置,决定ddr内bank的轮询顺序:使用几组ddr需要配置几组 */ + for (j = 0; j < 8; j++) + { + for (i = 0; i < 64; i++) + { + + qlist_grp0_bank.qcfg_qlist_grp0_bank_wr = qlist_grp0_bank_data[i % 8]; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP0_BANKr + j, + 0, + i, + &qlist_grp0_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + } + + for (j = 0; j < 64; j++) + { + qcfg_qlist_grp.qcfg_qlist_grp_wr = j % 4; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRPr, + 0, + j, + &qcfg_qlist_grp); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + rc = dpp_tm_qmu_cfg_done_set(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_cfg_done_set"); + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "++++++dpp_etm_qmu_init_set end++++++\n"); + + return DPP_OK; +} + + + + +/***********************************************************/ +/** QMU/MMU初始化配置场景13:TM独享4组ddr:FTM为指定4组ddr的0~7bank + ETM为指定4组ddr的0-7bank +* MMU开启rotatjon +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2016/11/17 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_13(ZXIC_UINT32 dev_id, ZXIC_UINT32 ddr_no) +{ + DPP_STATUS rc = DPP_OK; + DPP_STATUS ddr_no_temp = 0; + DPP_ETM_QMU_RANDOM_BYPASS_EN_T etm_bypass = {0}; + //DPP_FTM_QMU_RANDOM_BYPASS_EN_T ftm_bypass = {0}; + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, ((ddr_no >> 0) & 0xfU), 0, 9); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, ((ddr_no >> 4) & 0xfU), 0, 9); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, ((ddr_no >> 8) & 0xfU), 0, 9); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, ((ddr_no >> 12) & 0xfU), 0, 9); + + ddr_no_temp = ((1U << (ddr_no & 0xfU)) + (1U << ((ddr_no >> 4) & 0xfU))+ \ + (1U << ((ddr_no >> 8) & 0xfU)) + (1U << ((ddr_no >> 12) & 0xfU))) & 0x3ff; + + + /* etm mmu基址配置:ddr_no中的4组,bank号0-7,bank深度1024 */ + //rc = dpp_mmu_bank_base_addr_set(dev_id, ddr_no_temp, 0xff, 1024); + //ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_mmu_bank_base_addr_set"); + + rc = dpp_etm_qmu_init_set_13(dev_id, ddr_no); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_etm_qmu_init_set_13"); + + /* 关闭etm映射配置 */ + etm_bypass.random_bypass_en = 0; + rc = dpp_reg_write(dev_id, + ETM_QMU_RANDOM_BYPASS_ENr, + 0, + 0, + &etm_bypass); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + + return DPP_OK; +} + + + +/***********************************************************/ +/** QMU/MMU初始化配置场景14:每个tm只用1组*8bank,MMU实际分配ftm:0-9中指定组(0-7bank); etm:0-9中指定组(0-7bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/4/14 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_14(ZXIC_UINT32 dev_id, ZXIC_UINT32 etm_ddr_no) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 k = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + ZXIC_UINT32 depth = 4 * 1024; + ZXIC_UINT32 bank_to_mmu_cfg_map[8] = {0, 1, 2, 3, 4, 5, 6, 7}; + ZXIC_UINT32 qlist_grp0_bank_data[8] = {0, 1, 2, 3, 4, 5, 6, 7}; + + + DPP_ETM_QMU_QCFG_QLIST_BDEP_T qlist_bdep = {0}; + DPP_ETM_QMU_QCFG_QLIST_BHEAD_T qlist_bhead = {0}; + DPP_ETM_QMU_QCFG_QLIST_BTAIL_T qlist_btail = {0}; + + DPP_ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFG_T active_to_bank_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_MMU_CFG_T ddr_in_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_QMU_CFG_T ddr_in_qmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_MMU_CFG_T bank_to_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_QMU_CFG_T bank_to_qmu_cfg = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP0_BANK_T qlist_grp0_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP_T qcfg_qlist_grp = {0}; + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "========dpp_etm_qmu_init_set_1 start========n"); + + + /* ddr组从qmu到mmu映射,将0映射成etm_ddr_no */ + i = 0; + ddr_in_mmu_cfg.cfgmt_ddr_in_mmu_cfg = etm_ddr_no; + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_MMU_CFGr, + 0, + i, + &ddr_in_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + + /* ddr组从mmu到qmu映射,etm_ddr_no映射成0 */ + i = etm_ddr_no; + ddr_in_qmu_cfg.cfgmt_ddr_in_qmu_cfg = 0; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_QMU_CFGr, + 0, + i, + &ddr_in_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + + /* bank号从qmu到mmu映射,每组的bank0-7映射成bank0-7 */ + j = 0; + + for (i = 0; i < 8; i++) + { + k = j * 8 + i; + bank_to_mmu_cfg.cfgmt_bank_in_mmu_cfg = bank_to_mmu_cfg_map[i]; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_MMU_CFGr, + 0, + k, + &bank_to_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + + /* bank号从mmu到qmu映射,每组的bank0-7映射成bank0-7 */ + j = etm_ddr_no; + + for (i = 0; i < 8; i++) + { + ZXIC_COMM_CHECK_INDEX_MUL_OVERFLOW_NO_ASSERT(j, 8); + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(j * 8, bank_to_mmu_cfg_map[i]); + k = j * 8 + bank_to_mmu_cfg_map[i]; + bank_to_qmu_cfg.cfgmt_bank_in_qmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_QMU_CFGr, + 0, + k, + &bank_to_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + + /* random映射ram:配置一个chunk中,bank的轮询顺序 */ + for (i = 0; i < 16; i++) + { + active_to_bank_cfg.cfgmt_active_to_bank_cfg = i % 8; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFGr, + 0, + i, + &active_to_bank_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + + /* 首尾深度指针配置 */ + j = 0; + + for (i = 0; i < 8; i++) + { + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 8 + i), depth); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 8 + i + 1), depth); + k = j * 8 + i; + qlist_bhead.bank_vld = 1; + qlist_bhead.qcfg_qlist_bhead = (j * 8 + i) * depth; + qlist_btail.qcfg_qlist_btail = ((j * 8 + i + 1) * depth - 1); + qlist_bdep.qcfg_qlist_bdep = depth; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BHEADr, + 0, + k, + &qlist_bhead); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BTAILr, + 0, + k, + &qlist_btail); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + k, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + for (i = 0; i < 64; i++) + { + qlist_bdep.qcfg_qlist_bdep = depth; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + i, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(ETM_QMU_QCFG_QLIST_GRP0_BANKr, 8); + /* 随机表配置,决定每组bank的轮询顺序 */ + for (j = 0; j < 8; j++) + { + for (i = 0; i < 64; i++) + { + qlist_grp0_bank.qcfg_qlist_grp0_bank_wr = qlist_grp0_bank_data[i % 8]; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP0_BANKr + j, + 0, + i, + &qlist_grp0_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + for (j = 0; j < 64; j++) + { + qcfg_qlist_grp.qcfg_qlist_grp_wr = 0; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRPr, + 0, + j, + &qcfg_qlist_grp); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + rc = dpp_tm_qmu_cfg_done_set(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_cfg_done_set"); + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "========dpp_etm_qmu_init_set_1 END=======\n"); + + return DPP_OK; +} + + + +/***********************************************************/ +/** QMU/MMU初始化配置场景14:每个tm只用1组*8bank,MMU实际分配ftm:0-9中指定组(0-7bank); etm:0-9中指定组(0-7bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/4/14 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_14(ZXIC_UINT32 dev_id, ZXIC_UINT32 etm_ddr_no, ZXIC_UINT32 ftm_ddr_no) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 etm_ddr_no_temp = 0; /*ETM使用的ddr,bit位表示*/ + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, etm_ddr_no, 0, 9); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, ftm_ddr_no, 0, 9); + + /*etm ftm不能使用同一组ddr*/ + if (etm_ddr_no == ftm_ddr_no) + { + ZXIC_COMM_PRINT("dpp_tm_qmu_init_set_15: etm_ddr_no can't equal to ftm_ddr_no!!!\n"); + } + + ZXIC_COMM_ASSERT(etm_ddr_no != ftm_ddr_no); + + /*将etm ftm使用的ddr号转换成对应的bit位,bit[0-9]每bit代表一组ddr */ + etm_ddr_no_temp = 0x1u << etm_ddr_no; + + /*开启随机模式*/ + rc = dpp_tm_qmu_ddr_random_set(dev_id, 1); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_ddr_random_set"); + + /* etm mmu基址配置:ddr指定etm_ddr_no组,bank号0-7bank,bank深度4K */ + //rc = dpp_mmu_bank_base_addr_set(dev_id, etm_ddr_no_temp, 0xff, 4 * 1024); + //ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_mmu_bank_base_addr_set"); + + rc = dpp_etm_qmu_init_set_14(dev_id, etm_ddr_no); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_etm_qmu_init_set"); + + return DPP_OK; +} + + +/***********************************************************/ +/** QMU/MMU初始化配置场景15:每个tm只用1组*4bank,MMU实际分配ftm:0-9中指定组(0123bank); etm:0-9中指定组(0123bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/4/14 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_15(ZXIC_UINT32 dev_id, ZXIC_UINT32 etm_ddr_no) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 k = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + ZXIC_UINT32 depth = 8 * 1024; + ZXIC_UINT32 bank_to_mmu_cfg_map[4] = {0, 1, 2, 3}; + ZXIC_UINT32 qlist_grp0_bank_data[4] = {0, 1, 2, 3}; + + + DPP_ETM_QMU_QCFG_QLIST_BDEP_T qlist_bdep = {0}; + DPP_ETM_QMU_QCFG_QLIST_BHEAD_T qlist_bhead = {0}; + DPP_ETM_QMU_QCFG_QLIST_BTAIL_T qlist_btail = {0}; + + DPP_ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFG_T active_to_bank_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_MMU_CFG_T ddr_in_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_QMU_CFG_T ddr_in_qmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_MMU_CFG_T bank_to_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_QMU_CFG_T bank_to_qmu_cfg = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP0_BANK_T qlist_grp0_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP_T qcfg_qlist_grp = {0}; + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "========dpp_etm_qmu_init_set_1 start========n"); + + + + /* ddr组从qmu到mmu映射,将0映射成etm_ddr_no */ + i = 0; + ddr_in_mmu_cfg.cfgmt_ddr_in_mmu_cfg = etm_ddr_no; + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_MMU_CFGr, + 0, + i, + &ddr_in_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + + /* ddr组从mmu到qmu映射,etm_ddr_no映射成0 */ + i = etm_ddr_no; + ddr_in_qmu_cfg.cfgmt_ddr_in_qmu_cfg = 0; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_QMU_CFGr, + 0, + i, + &ddr_in_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + + /* bank号从qmu到mmu映射,每组的bank0123映射成bank0123 */ + j = 0; + + for (i = 0; i < 4; i++) + { + k = j * 8 + i; + bank_to_mmu_cfg.cfgmt_bank_in_mmu_cfg = bank_to_mmu_cfg_map[i]; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_MMU_CFGr, + 0, + k, + &bank_to_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + + /* bank号从mmu到qmu映射,每组的bank0123映射成bank0123 */ + j = etm_ddr_no; + + for (i = 0; i < 4; i++) + { + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, j, 8); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(dev_id, j * 8 , bank_to_mmu_cfg_map[i]); + k = j * 8 + bank_to_mmu_cfg_map[i]; + bank_to_qmu_cfg.cfgmt_bank_in_qmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_QMU_CFGr, + 0, + k, + &bank_to_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + + /* random映射ram:配置一个chunk中,bank的轮询顺序 */ + for (i = 0; i < 16; i++) + { + active_to_bank_cfg.cfgmt_active_to_bank_cfg = i % 4; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFGr, + 0, + i, + &active_to_bank_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + + /* 首尾深度指针配置 */ + j = 0; + + for (i = 0; i < 4; i++) + { + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 4 + i), depth); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 4 + i + 1), depth); + k = j * 8 + i; + qlist_bhead.bank_vld = 1; + qlist_bhead.qcfg_qlist_bhead = (j * 4 + i) * depth; + qlist_btail.qcfg_qlist_btail = ((j * 4 + i + 1) * depth - 1); + qlist_bdep.qcfg_qlist_bdep = depth; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BHEADr, + 0, + k, + &qlist_bhead); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BTAILr, + 0, + k, + &qlist_btail); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + k, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + for (i = 0; i < 64; i++) + { + qlist_bdep.qcfg_qlist_bdep = depth; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + i, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(ETM_QMU_QCFG_QLIST_GRP0_BANKr, 8); + /* 随机表配置,决定每组bank的轮询顺序 */ + for (j = 0; j < 8; j++) + { + for (i = 0; i < 64; i++) + { + qlist_grp0_bank.qcfg_qlist_grp0_bank_wr = qlist_grp0_bank_data[i % 4]; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP0_BANKr + j, + 0, + i, + &qlist_grp0_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + for (j = 0; j < 64; j++) + { + qcfg_qlist_grp.qcfg_qlist_grp_wr = 0; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRPr, + 0, + j, + &qcfg_qlist_grp); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + rc = dpp_tm_qmu_cfg_done_set(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_cfg_done_set"); + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "========dpp_etm_qmu_init_set_1 END=======\n"); + + return DPP_OK; +} + + + + +/***********************************************************/ +/** QMU/MMU初始化配置场景15:每个tm只用1组*4bank,MMU实际分配ftm:0-9中指定组(0123bank); etm:0-9中指定组(0123bank) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/4/14 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_15(ZXIC_UINT32 dev_id, ZXIC_UINT32 etm_ddr_no, ZXIC_UINT32 ftm_ddr_no) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 etm_ddr_no_temp = 0; /*ETM使用的ddr,bit位表示*/ + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, etm_ddr_no, 0, 9); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, ftm_ddr_no, 0, 9); + + /*etm ftm不能使用同一组ddr*/ + if (etm_ddr_no == ftm_ddr_no) + { + ZXIC_COMM_PRINT("dpp_tm_qmu_init_set_15: etm_ddr_no can't equal to ftm_ddr_no!!!\n"); + } + + ZXIC_COMM_ASSERT(etm_ddr_no == ftm_ddr_no); + + /*将etm ftm使用的ddr号转换成对应的bit位,bit[0-9]每bit代表一组ddr */ + etm_ddr_no_temp = 0x1u << etm_ddr_no; + + /*关闭随机模式*/ + rc = dpp_tm_qmu_ddr_random_set(dev_id, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_ddr_random_set"); + + /* etm mmu基址配置:ddr指定etm_ddr_no组,bank号0123,bank深度8K */ + //rc = dpp_mmu_bank_base_addr_set(dev_id, etm_ddr_no_temp, 0xf, 8 * 1024); + //ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_mmu_bank_base_addr_set"); + + rc = dpp_etm_qmu_init_set_15(dev_id, etm_ddr_no); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_etm_qmu_init_set"); + + + return DPP_OK; +} + +/***********************************************************/ +/** QMU初始化配置场景16:独享2组*8bank,MMU实际分配etm_ddr_no; etm or ftm使用0-7bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/12/16 +************************************************************/ +DPP_STATUS dpp_etm_qmu_init_set_16(ZXIC_UINT32 dev_id, ZXIC_UINT32 etm_ddr_no) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 k = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + ZXIC_UINT32 depth = 2*1024; + ZXIC_UINT32 bank_to_mmu_cfg_map[8] = {0, 1, 2, 3, 4, 5, 6, 7}; + ZXIC_UINT32 qlist_grp0_bank_data[8] = {0, 1, 2, 3, 4, 5, 6, 7}; + ZXIC_UINT32 ddr_no[2] = {(etm_ddr_no>>4)&0xf, etm_ddr_no & 0xf}; + + + DPP_ETM_QMU_QCFG_QLIST_BDEP_T qlist_bdep = {0}; + DPP_ETM_QMU_QCFG_QLIST_BHEAD_T qlist_bhead = {0}; + DPP_ETM_QMU_QCFG_QLIST_BTAIL_T qlist_btail = {0}; + + DPP_ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFG_T active_to_bank_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_MMU_CFG_T ddr_in_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_DDR_IN_QMU_CFG_T ddr_in_qmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_MMU_CFG_T bank_to_mmu_cfg = {0}; + DPP_ETM_QMU_CFGMT_BANK_TO_QMU_CFG_T bank_to_qmu_cfg = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP0_BANK_T qlist_grp0_bank = {0}; + DPP_ETM_QMU_QCFG_QLIST_GRP_T qcfg_qlist_grp = {0}; + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "========dpp_etm_qmu_init_set_16 start========n"); + + + /* ddr组从qmu到mmu映射,0~1映射成12 */ + for (i = 0; i < 2; i++) + { + ddr_in_mmu_cfg.cfgmt_ddr_in_mmu_cfg = ddr_no[i]; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_MMU_CFGr, + 0, + i, + &ddr_in_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + /* ddr组从mmu到qmu映射,12映射成0~1 */ + for (i = 0; i < 2; i++) + { + ddr_in_qmu_cfg.cfgmt_ddr_in_qmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_DDR_IN_QMU_CFGr, + 0, + ddr_no[i], + &ddr_in_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + + /* bank号从qmu到mmu映射,每组的bank0~7映射成bank0-7 */ + for (j = 0; j < 2; j++) + { + for (i = 0; i < 8; i++) + { + k = j * 8 + i; + + bank_to_mmu_cfg.cfgmt_bank_in_mmu_cfg = bank_to_mmu_cfg_map[i]; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_MMU_CFGr, + 0, + k, + &bank_to_mmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + + /* bank号从mmu到qmu映射,每组的bank0-7映射成bank0-7 */ + for (j = 0; j < 2; j++) + { + for (i = 0; i < 8; i++) + { + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, ddr_no[j], 8); + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(ddr_no[j] * 8, bank_to_mmu_cfg_map[i]); + k = ddr_no[j] * 8 + bank_to_mmu_cfg_map[i]; + + bank_to_qmu_cfg.cfgmt_bank_in_qmu_cfg = i; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_BANK_TO_QMU_CFGr, + 0, + k, + &bank_to_qmu_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + /* random映射ram:配置一个chunk中,bank的轮询顺序 */ + for (i = 0; i < 16; i++) + { + + + active_to_bank_cfg.cfgmt_active_to_bank_cfg = i % 8; + + rc = dpp_reg_write(dev_id, + ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFGr, + 0, + i, + &active_to_bank_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + } + + + /* 首尾深度指针配置 */ + for (j = 0; j < 2; j++) + { + for (i = 0; i < 8; i++) + { + k = j * 8 + i; + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 8 + i), depth); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(dev_id, (j * 8 + i + 1), depth); + qlist_bhead.bank_vld = 1; + qlist_bhead.qcfg_qlist_bhead = (j * 8 + i) * depth; + qlist_btail.qcfg_qlist_btail = ((j * 8 + i + 1) * depth - 1); + qlist_bdep.qcfg_qlist_bdep = depth; + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BHEADr, + 0, + k, + &qlist_bhead); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BTAILr, + 0, + k, + &qlist_btail); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + k, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + for (i = 0; i < 64; i++) + { + qlist_bdep.qcfg_qlist_bdep = depth; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_BDEPr, + 0, + i, + &qlist_bdep); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(ETM_QMU_QCFG_QLIST_GRP0_BANKr, 8); + /* 随机表配置,决定每组bank的轮询顺序 */ + for (j = 0; j < 8; j++) + { + for (i = 0; i < 64; i++) + { + qlist_grp0_bank.qcfg_qlist_grp0_bank_wr = qlist_grp0_bank_data[i % 8]; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRP0_BANKr + j, + 0, + i, + &qlist_grp0_bank); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + } + + for (j = 0; j < 64; j++) + { + qcfg_qlist_grp.qcfg_qlist_grp_wr = j % 2; + rc = dpp_reg_write(dev_id, + ETM_QMU_QCFG_QLIST_GRPr, + 0, + j, + &qcfg_qlist_grp); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + rc = dpp_tm_qmu_cfg_done_set(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_cfg_done_set"); + + ZXIC_COMM_TRACE_DEV_DEBUG(dev_id, "========dpp_etm_qmu_init_set_16 END=======\n"); + + return DPP_OK; +} + +/***********************************************************/ +/** QMU初始化配置场景16:独享2组*8bank,MMU实际分配1,2; etm or ftm使用0-7bank +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/12/16 +************************************************************/ +DPP_STATUS dpp_tm_qmu_init_set_16(ZXIC_UINT32 dev_id, ZXIC_UINT32 etm_ddr_no, ZXIC_UINT32 ftm_ddr_no) +{ + DPP_STATUS rc = DPP_OK; + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, etm_ddr_no, 0, 0xff); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, ftm_ddr_no, 0, 0xff); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(dev_id, (1UL<<(etm_ddr_no>>4&0xf)), (1UL<<(etm_ddr_no&0xf))); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(dev_id, (1UL<<(ftm_ddr_no>>4&0xf)), (1UL<<(ftm_ddr_no&0xf))); + + /* etm mmu基址配置:ddr1,2组,bank号0-7,bank深度2*1024 */ + //rc = dpp_mmu_bank_base_addr_set(dev_id, ((1UL<<(etm_ddr_no>>4&0xf))+(1UL<<(etm_ddr_no&0xf)))&0x3ff, 0xff, 2*1024); + //ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_mmu_bank_base_addr_set"); + + rc = dpp_etm_qmu_init_set_16(dev_id, etm_ddr_no); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_etm_qmu_init_set_16"); + + return DPP_OK; +} + +#endif +#endif + + +#if ZXIC_REAL("TM_TMMU") + +#if 0 +/***********************************************************/ +/** TMMU TM纯片内模式配置 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param imem_en 1纯片内 +* +* @return +* @remark 说明:高有效,表示使能打开,TMMU不会再发起对MMU的读写操作,用户需要保证Cache PD全部命中。 +* @see +* @author wush @date 2017/10/14 +************************************************************/ +DPP_STATUS dpp_tm_tmmu_imem_en_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 imem_en) +{ + DPP_STATUS rc = DPP_OK; + + DPP_ETM_TMMU_CFGMT_TM_PURE_IMEM_EN_T pure_imem_t = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, imem_en, 0, 1); + + pure_imem_t.cfgmt_tm_pure_imem_en = imem_en; + rc = dpp_reg_write(dev_id, + ETM_TMMU_CFGMT_TM_PURE_IMEM_ENr, + 0, + 0, + &pure_imem_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** TMMU TM纯片内模式配置获取 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_imem_en 1纯片内 +* +* @return +* @remark 无 +* @see +* @author wush @date 2017/10/14 +************************************************************/ +DPP_STATUS dpp_tm_tmmu_imem_en_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_imem_en) +{ + DPP_STATUS rc = DPP_OK; + + DPP_ETM_TMMU_CFGMT_TM_PURE_IMEM_EN_T pure_imem_t = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_imem_en); + + rc = dpp_reg_read(dev_id, + ETM_TMMU_CFGMT_TM_PURE_IMEM_ENr, + 0, + 0, + &pure_imem_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + *p_imem_en = pure_imem_t.cfgmt_tm_pure_imem_en; + + return DPP_OK; +} + +/***********************************************************/ +/** TMMU 强制DDR RDY配置 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param ddr_force_rdy 1、如果bit【0】配置为1,则QMU看到的DDR0 RDY一直为1。 + 2、bit【0】代表DDR0,bit【7】代表DDR7。 + 3、纯片内模式需要配置为8'hff,排除DDR干扰。 +* +* @return +* @remark +* @see +* @author wush @date 2017/10/14 +************************************************************/ +DPP_STATUS dpp_tm_tmmu_ddr_force_rdy_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 ddr_force_rdy) +{ + DPP_STATUS rc = DPP_OK; + + DPP_ETM_TMMU_CFGMT_FORCE_DDR_RDY_CFG_T ddr_force_rdy_t = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, ddr_force_rdy, 0, 0x3FF); + + + ddr_force_rdy_t.cfgmt_force_ddr_rdy_cfg = ddr_force_rdy; + rc = dpp_reg_write(dev_id, + ETM_TMMU_CFGMT_FORCE_DDR_RDY_CFGr, + 0, + 0, + &ddr_force_rdy_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** TMMU 强制DDR RDY配置获取 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_ddr_force_rdy 1、如果bit【0】配置为1,则QMU看到的DDR0 RDY一直为1。 + 2、bit【0】代表DDR0,bit【7】代表DDR7。 + 3、纯片内模式需要配置为8'hff,排除DDR干扰。 +* +* @return +* @remark 无 +* @see +* @author wush @date 2017/10/14 +************************************************************/ +DPP_STATUS dpp_tm_tmmu_ddr_force_rdy_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_ddr_force_rdy) +{ + DPP_STATUS rc = DPP_OK; + + DPP_ETM_TMMU_CFGMT_FORCE_DDR_RDY_CFG_T ddr_force_rdy_t = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_ddr_force_rdy); + + rc = dpp_reg_read(dev_id, + ETM_TMMU_CFGMT_FORCE_DDR_RDY_CFGr, + 0, + 0, + &ddr_force_rdy_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + *p_ddr_force_rdy = ddr_force_rdy_t.cfgmt_force_ddr_rdy_cfg; + + return DPP_OK; +} + +#endif +#endif + + +#if ZXIC_REAL("TM_CRDT") + +#if 0 +/***********************************************************/ +/** crdt ram初始化 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/22 +************************************************************/ +DPP_STATUS dpp_tm_crdt_ram_init(ZXIC_UINT32 dev_id) +{ + + + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 read_times = 0; + DPP_ETM_CRDT_CRDT_CFG_RAM_INIT_T crdt_ram_cfg_init_t = {0}; + DPP_ETM_CRDT_CRDT_STA_RAM_INIT_T crdt_ram_sta_init_t = {0}; + + /**RAM初始化**/ + crdt_ram_cfg_init_t.cfg_ram_init_en = 1; + rc = dpp_reg_write(dev_id, + ETM_CRDT_CRDT_CFG_RAM_INITr, + 0, + 0, + &crdt_ram_cfg_init_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + crdt_ram_sta_init_t.sta_ram_init_en = 1; + rc = dpp_reg_write(dev_id, + ETM_CRDT_CRDT_STA_RAM_INITr, + 0, + 0, + &crdt_ram_sta_init_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + + + /**初始化done确认**/ + do + { + rc = dpp_reg_read(dev_id, + ETM_CRDT_CRDT_CFG_RAM_INITr, + 0, + 0, + &crdt_ram_cfg_init_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_CRDT_CRDT_STA_RAM_INITr, + 0, + 0, + &crdt_ram_sta_init_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + read_times++; + zxic_comm_usleep(100); + + } + while (0 == crdt_ram_cfg_init_t.cfg_ram_init_done || 0 == crdt_ram_sta_init_t.sta_ram_init_done); + + ZXIC_COMM_PRINT("wait_crdt_ram_done_times=%d\n",read_times); + ZXIC_COMM_PRINT("crdt_ram_cfg_init_t.cfg_ram_init_done=%d, crdt_ram_sta_init_t.sta_ram_init_done=%d\n", + crdt_ram_cfg_init_t.cfg_ram_init_done,crdt_ram_sta_init_t.sta_ram_init_done); + + return DPP_OK; + +} + +#endif +/***********************************************************/ +/** 分配etm-FQ类型调度器资源:fq/fq2/fq4/fq8 个数,(共16K= 16384) +* @param dev_id 设备编号 +* @param fq_num FQ调度器个数,须是8的倍数 +* @param fq2_num FQ2调度器个数,须是4的倍数 +* @param fq4_num FQ4调度器个数,须是2的倍数 +* @param fq8_num FQ8调度器个数 +* 调度器总数不能超过:16K= 16384 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/26 +************************************************************/ +DPP_STATUS dpp_etm_crdt_fq_set(DPP_DEV_T *dev, + ZXIC_UINT32 fq_num, + ZXIC_UINT32 fq2_num, + ZXIC_UINT32 fq4_num, + ZXIC_UINT32 fq8_num) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 total_fq_num = 0; + DPP_ETM_CRDT_TH_WFQ_FQ_T etm_crdt_th_wfqfq_t = {0}; + DPP_ETM_CRDT_TH_WFQ2_FQ2_T etm_crdt_th_wfqfq2_t = {0}; + DPP_ETM_CRDT_TH_WFQ4_FQ4_T etm_crdt_th_wfqfq4_t = {0}; + ZXIC_UINT32 th_wfq_fq_index = ETM_CRDT_TH_WFQ_FQr; + ZXIC_UINT32 th_wfq_fq2_index = ETM_CRDT_TH_WFQ2_FQ2r; + ZXIC_UINT32 th_wfq_fq4_index = ETM_CRDT_TH_WFQ4_FQ4r; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + /* 参数合法性检查:fq调度器总数校验 */ + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(DEV_ID(dev), fq2_num , 2); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(DEV_ID(dev), fq4_num , 4); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(DEV_ID(dev), fq8_num , 8); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(DEV_ID(dev), fq_num , fq2_num * 2); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(DEV_ID(dev), fq_num + fq2_num * 2 , fq4_num * 4); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(DEV_ID(dev), fq_num + fq2_num * 2 + fq4_num * 4 , fq8_num * 8); + + total_fq_num = (fq_num + fq2_num * 2 + fq4_num * 4 + fq8_num * 8); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), total_fq_num, 0, DPP_ETM_FQ_NUM); + + /* 各调度器数整齐性校验 */ + if ((fq_num != 0 && fq_num % 8 != 0) || (fq2_num != 0 && fq2_num % 4 != 0) || (fq4_num != 0 && fq4_num % 2 != 0)) + { + //ZXIC_COMM__TRACE_ERR("Bad parameter: sp_num or wfq_num %8 != 0 !"); + return DPP_ERR; + } + + + /* 开始调度器阈值配置:th_fq参数配置:th_fq = fq_num/8 */ + rc = dpp_reg_read(dev, + th_wfq_fq_index, + 0, + 0, + &etm_crdt_th_wfqfq_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + etm_crdt_th_wfqfq_t.th_fq = (fq_num / 8); + rc = dpp_reg_write(dev, + th_wfq_fq_index, + 0, + 0, + &etm_crdt_th_wfqfq_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + /* th_fq2参数配置:th_fq2 = (th_fq + fq2_num/4) */ + rc = dpp_reg_read(dev, + th_wfq_fq2_index, + 0, + 0, + &etm_crdt_th_wfqfq2_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + etm_crdt_th_wfqfq2_t.th_fq2 = (etm_crdt_th_wfqfq_t.th_fq + fq2_num / 4); + rc = dpp_reg_write(dev, + th_wfq_fq2_index, + 0, + 0, + &etm_crdt_th_wfqfq2_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + /* th_fq4参数配置:th_fq4 = (th_fq2 + fq4_num/2) */ + rc = dpp_reg_read(dev, + th_wfq_fq4_index, + 0, + 0, + &etm_crdt_th_wfqfq4_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + etm_crdt_th_wfqfq4_t.th_fq4 = (etm_crdt_th_wfqfq2_t.th_fq2 + fq4_num / 2); + rc = dpp_reg_write(dev, + th_wfq_fq4_index, + 0, + 0, + &etm_crdt_th_wfqfq4_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; + +} + +/***********************************************************/ +/** 分配TM-SP/WFQ类型调度器资源:sp/wfq/wfq2/wfq4/wfq8 个数,(etm共9K=9216,ftm共1920个) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param sp_num SP调度器个数,须是8的倍数 +* @param wfq_num WFQ调度器个数,须是8的倍数 +* @param wfq2_num WFQ2调度器个数,须是4的倍数 +* @param wfq4_num WFQ4调度器个数,须是2的倍数 +* @param wfq8_num WFQ8调度器个数 +* 调度器总数不能超过:ETM= 9216; FTM= 1920 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/26 +************************************************************/ +DPP_STATUS dpp_tm_crdt_wfqsp_set(DPP_DEV_T *dev, + ZXIC_UINT32 sp_num, + ZXIC_UINT32 wfq_num, + ZXIC_UINT32 wfq2_num, + ZXIC_UINT32 wfq4_num, + ZXIC_UINT32 wfq8_num) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 total_wfqsp_num = 0; + DPP_ETM_CRDT_TH_SP_T etm_crdt_th_sp_t = {0}; + DPP_ETM_CRDT_TH_WFQ_FQ_T etm_crdt_th_wfqfq_t = {0}; + DPP_ETM_CRDT_TH_WFQ2_FQ2_T etm_crdt_th_wfqfq2_t = {0}; + DPP_ETM_CRDT_TH_WFQ4_FQ4_T etm_crdt_th_wfqfq4_t = {0}; + ZXIC_UINT32 th_sp_index = ETM_CRDT_TH_SPr; + ZXIC_UINT32 th_wfq_fq_index = ETM_CRDT_TH_WFQ_FQr; + ZXIC_UINT32 th_wfq_fq2_index = ETM_CRDT_TH_WFQ2_FQ2r; + ZXIC_UINT32 th_wfq_fq4_index = ETM_CRDT_TH_WFQ4_FQ4r; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + /* 参数合法性检查 */ + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(DEV_ID(dev), wfq2_num , 2); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(DEV_ID(dev), wfq4_num , 4); + ZXIC_COMM_CHECK_DEV_INDEX_MUL_OVERFLOW_NO_ASSERT(DEV_ID(dev), wfq8_num , 8); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(DEV_ID(dev), sp_num , wfq_num); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(DEV_ID(dev), sp_num + wfq_num , wfq2_num * 2); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(DEV_ID(dev), sp_num + wfq_num + wfq2_num * 2 , wfq4_num * 4); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(DEV_ID(dev), sp_num + wfq_num + wfq2_num * 2 + wfq4_num * 4 , wfq8_num * 8); + /* 调度器总数校验 */ + total_wfqsp_num = (sp_num + wfq_num + wfq2_num * 2 + wfq4_num * 4 + wfq8_num * 8); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), total_wfqsp_num, 0, DPP_ETM_WFQSP_NUM); + + /* 各调度器数整齐性校验 */ + if ((sp_num != 0 && sp_num % 8 != 0) || (wfq_num != 0 && wfq_num % 8 != 0) || + (wfq2_num != 0 && wfq2_num % 4 != 0) || (wfq4_num != 0 && wfq4_num % 2 != 0)) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "Bad parameter: sp_num or wfq_num mod 8 != 0 !\n"); + return DPP_ERR; + } + + th_sp_index = ETM_CRDT_TH_SPr; + th_wfq_fq_index = ETM_CRDT_TH_WFQ_FQr; + th_wfq_fq2_index = ETM_CRDT_TH_WFQ2_FQ2r; + th_wfq_fq4_index = ETM_CRDT_TH_WFQ4_FQ4r; + + /* 开始调度器阈值配置:th_sp参数配置:th_sp= sp_num/8 */ + rc = dpp_reg_read(dev, + th_sp_index, + 0, + 0, + &etm_crdt_th_sp_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + etm_crdt_th_sp_t.th_sp = (sp_num / 8); + rc = dpp_reg_write(dev, + th_sp_index, + 0, + 0, + &etm_crdt_th_sp_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + /* th_wfq参数配置:th_wfq = (th_sp + wfq_num/8) */ + rc = dpp_reg_read(dev, + th_wfq_fq_index, + 0, + 0, + &etm_crdt_th_wfqfq_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + etm_crdt_th_wfqfq_t.th_wfq = (etm_crdt_th_sp_t.th_sp + wfq_num / 8); + rc = dpp_reg_write(dev, + th_wfq_fq_index, + 0, + 0, + &etm_crdt_th_wfqfq_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + /* th_wfq2参数配置:th_wfq2 = (th_wfq + wfq2_num/4) */ + rc = dpp_reg_read(dev, + th_wfq_fq2_index, + 0, + 0, + &etm_crdt_th_wfqfq2_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + etm_crdt_th_wfqfq2_t.th_wfq2 = (etm_crdt_th_wfqfq_t.th_wfq + wfq2_num / 4); + rc = dpp_reg_write(dev, + th_wfq_fq2_index, + 0, + 0, + &etm_crdt_th_wfqfq2_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + /* th_wfq4参数配置:th_wfq4 = (th_wfq2 + wfq4_num/2) */ + rc = dpp_reg_read(dev, + th_wfq_fq4_index, + 0, + 0, + &etm_crdt_th_wfqfq4_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + etm_crdt_th_wfqfq4_t.th_wfq4 = (etm_crdt_th_wfqfq2_t.th_wfq2 + wfq4_num / 2); + rc = dpp_reg_write(dev, + th_wfq_fq4_index, + 0, + 0, + &etm_crdt_th_wfqfq4_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; + +} + + +/***********************************************************/ +/** 获取各调度器的起始编号(etm共25K=25600,ftm共1920个) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_spwfq_start_num 调度器起始编号结构体 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/26 +************************************************************/ +DPP_STATUS dpp_tm_crdt_wfqsp_get(DPP_DEV_T *dev, + DPP_TM_CRDT_SPWFQ_START_NUM_T *p_spwfq_start_num) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CRDT_TH_SP_T etm_crdt_th_sp_t = {0}; + DPP_ETM_CRDT_TH_WFQ_FQ_T etm_crdt_th_wfqfq_t = {0}; + DPP_ETM_CRDT_TH_WFQ2_FQ2_T etm_crdt_th_wfqfq2_t = {0}; + DPP_ETM_CRDT_TH_WFQ4_FQ4_T etm_crdt_th_wfqfq4_t = {0}; + ZXIC_UINT32 th_sp_index = ETM_CRDT_TH_SPr; + ZXIC_UINT32 th_wfq_fq_index = ETM_CRDT_TH_WFQ_FQr; + ZXIC_UINT32 th_wfq_fq2_index = ETM_CRDT_TH_WFQ2_FQ2r; + ZXIC_UINT32 th_wfq_fq4_index = ETM_CRDT_TH_WFQ4_FQ4r; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_spwfq_start_num); + + /* 读取调度器阈值配置:th_sp参数配置:th_sp= sp_num/8 */ + rc = dpp_reg_read(dev, + th_sp_index, + 0, + 0, + &etm_crdt_th_sp_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + /* th_wfq阈值读取:th_wfq = (th_sp + wfq_num/8) */ + rc = dpp_reg_read(dev, + th_wfq_fq_index, + 0, + 0, + &etm_crdt_th_wfqfq_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + /* th_wfq2阈值读取:th_wfq2 = (th_wfq + wfq2_num/4) */ + rc = dpp_reg_read(dev, + th_wfq_fq2_index, + 0, + 0, + &etm_crdt_th_wfqfq2_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + /* th_wfq4阈值读取:th_wfq4 = (th_wfq2 + wfq4_num/2) */ + rc = dpp_reg_read(dev, + th_wfq_fq4_index, + 0, + 0, + &etm_crdt_th_wfqfq4_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + /* 各调度器起始编号计算 */ + p_spwfq_start_num->start_num_fq = 0; + p_spwfq_start_num->start_num_fq2 = etm_crdt_th_wfqfq_t.th_fq * 8; + p_spwfq_start_num->start_num_fq4 = etm_crdt_th_wfqfq2_t.th_fq2 * 8; + p_spwfq_start_num->start_num_fq8 = etm_crdt_th_wfqfq4_t.th_fq4 * 8; + p_spwfq_start_num->start_num_sp = DPP_ETM_WFQSP_OFFSET; + p_spwfq_start_num->start_num_wfq = (DPP_ETM_WFQSP_OFFSET + etm_crdt_th_sp_t.th_sp * 8); + p_spwfq_start_num->start_num_wfq2 = (DPP_ETM_WFQSP_OFFSET + etm_crdt_th_wfqfq_t.th_wfq * 8); + p_spwfq_start_num->start_num_wfq4 = (DPP_ETM_WFQSP_OFFSET + etm_crdt_th_wfqfq2_t.th_wfq2 * 8); + p_spwfq_start_num->start_num_wfq8 = (DPP_ETM_WFQSP_OFFSET + etm_crdt_th_wfqfq4_t.th_wfq4 * 8); + + return DPP_OK; + + +} + + +/***********************************************************/ +/** 获取调度器类型 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param se_id 调度器编号 +* @param item_num 调度器中包含的子调度器个数 +* @param sch_type_num 调度器类型编号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/26 +************************************************************/ +DPP_STATUS dpp_tm_crdt_sch_type_get(DPP_DEV_T *dev, ZXIC_UINT32 se_id, ZXIC_UINT32 *item_num, ZXIC_UINT32 *sch_type_num) +{ + DPP_STATUS rc = DPP_OK; + + DPP_TM_CRDT_SPWFQ_START_NUM_T spwfq_start_num_t = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), item_num); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_id, 0, DPP_ETM_FQSPWFQ_NUM - 1); + + + rc = dpp_tm_crdt_wfqsp_get(dev, &spwfq_start_num_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_crdt_wfqsp_get"); + + + if (se_id < spwfq_start_num_t.start_num_fq2) + { + *item_num = 1; + *sch_type_num = 5; + } + else if (se_id < spwfq_start_num_t.start_num_fq4) + { + *item_num = 2; + *sch_type_num = 6; + } + else if (se_id < spwfq_start_num_t.start_num_fq8) + { + *item_num = 4; + *sch_type_num = 7; + } + else if (se_id < spwfq_start_num_t.start_num_sp) + { + *item_num = 8; + *sch_type_num = 8; + } + else if (se_id < spwfq_start_num_t.start_num_wfq) + { + *item_num = 1; + *sch_type_num = 0; + } + else if (se_id < spwfq_start_num_t.start_num_wfq2) + { + *item_num = 1; + *sch_type_num = 1; + } + else if (se_id < spwfq_start_num_t.start_num_wfq4) + { + *item_num = 2; + *sch_type_num = 2; + } + else if (se_id < spwfq_start_num_t.start_num_wfq8) + { + *item_num = 4; + *sch_type_num = 3; + } + else + { + *item_num = 8; + *sch_type_num = 4; + } + + return DPP_OK; + +} + + +/***********************************************************/ +/** 获取pp->dev挂接关系 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param pp_id 0~63 +* @param p_weight 0~127 +* @param p_sp_mapping 0~7 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/04/20 +************************************************************/ +DPP_STATUS dpp_tm_crdt_pp_para_get(DPP_DEV_T *dev, + ZXIC_UINT32 pp_id, + ZXIC_UINT32 *p_weight, + ZXIC_UINT32 *p_sp_mapping) +{ + DPP_STATUS rc = DPP_OK; + + DPP_ETM_CRDT_PP_CFG_T pp_cfg_r = {0}; + DPP_ETM_CRDT_PP_WEIGHT_T pp_weight_r = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), pp_id, 0, DPP_TM_PP_NUM - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_weight); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_sp_mapping); + + + rc = dpp_reg_read(dev, + ETM_CRDT_PP_WEIGHTr, + 0, + pp_id, + &pp_weight_r); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + *p_weight = pp_weight_r.pp_weight; + + rc = dpp_reg_read(dev, + ETM_CRDT_PP_CFGr, + 0, + pp_id, + &pp_cfg_r); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + *p_sp_mapping = pp_cfg_r.pp_cfg; + + return DPP_OK; +} + +/***********************************************************/ +/** 配置se->pp->dev挂接关系 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param se_id 往端口挂接的调度器id +* @param pp_id [0-63] +* @param weight [1-511] +* @param sp_mapping [0~8] +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/3/4 +************************************************************/ +DPP_STATUS dpp_tm_crdt_se_pp_link_set(DPP_DEV_T *dev, + ZXIC_UINT32 se_id, + ZXIC_UINT32 pp_id, + ZXIC_UINT32 weight, + ZXIC_UINT32 sp_mapping) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 delay_time = 10; + + DPP_ETM_CRDT_PP_CFG_T pp_cfg = {0}; + DPP_ETM_CRDT_PP_WEIGHT_T pp_weight = {0}; + DPP_ETM_CRDT_PP_CFG_T pp_cfg_r = {0}; + DPP_ETM_CRDT_PP_WEIGHT_T pp_weight_r = {0}; + DPP_TM_SCH_SE_PARA_T sch_se_para_t = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_id, 0, DPP_ETM_FQSPWFQ_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), pp_id, 0, DPP_TM_PP_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), weight, 0, DPP_TM_SCH_WEIGHT_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), sp_mapping, DPP_TM_SCH_SP_0, DPP_TM_SCH_SP_8); + + /* 参数赋值:仅需端口号 ,配置调度器到端口的挂接 */ + sch_se_para_t.se_linkid = DPP_ETM_PORT_LINKID_BASE + pp_id; + + rc = dpp_tm_crdt_se_link_wr(dev, se_id, &sch_se_para_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_crdt_se_link_wr"); + + /* 检测CRDT寄存器是否空闲 */ + rc = dpp_tm_crdt_idle_check(dev); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_crdt_idle_check"); + + pp_weight.pp_weight = weight; + rc = dpp_reg_write(dev, + ETM_CRDT_PP_WEIGHTr, + 0, + pp_id, + &pp_weight); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + /* 写入后,重新读出来校验 */ +#if (ETM_WRITE_CHECK) + { + zxic_comm_delay(delay_time); + rc = dpp_reg_read(dev, + ETM_CRDT_PP_WEIGHTr, + 0, + pp_id, + &pp_weight_r); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + if (pp_weight_r.pp_weight != pp_weight.pp_weight) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "dpp_tm_crdt_pp_para_set pp[0x%x] wt_pp_weight[0x%x] rd_pp_weight[0x%x]\n", pp_id, pp_weight.pp_weight, pp_weight_r.pp_weight); + return DPP_ERR; + } + } +#endif + + /* 检测CRDT寄存器是否空闲 */ + rc = dpp_tm_crdt_idle_check(dev); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_crdt_idle_check"); + + pp_cfg.pp_cfg = sp_mapping; + rc = dpp_reg_write(dev, + ETM_CRDT_PP_CFGr, + 0, + pp_id, + &pp_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + /* 写入后,重新读出来校验 */ +#if (ETM_WRITE_CHECK) + { + zxic_comm_delay(delay_time); + rc = dpp_reg_read(dev, + ETM_CRDT_PP_CFGr, + 0, + pp_id, + &pp_cfg_r); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + if (pp_cfg_r.pp_cfg != pp_cfg.pp_cfg) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "dpp_tm_crdt_pp_para_set pp[0x%x] wt_pp_cfg[0x%x] rd_pp_cfg[0x%x]\n", pp_id, pp_cfg.pp_cfg, pp_cfg_r.pp_cfg); + return DPP_ERR; + } + } +#endif + + return DPP_OK; +} + +/***********************************************************/ +/** 配置flow级流队列的挂接关系(flow到上级调度器的挂接) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param flow_id 流队列号 +* @param c_linkid c桶要挂接到的上级调度器id +* @param c_weight c桶挂接到上级调度器的权重[1~511] +* @param c_sp c桶挂接到上级调度器的sp优先级,有效值[0-8],共9级,优先级依次降低 +* @param mode 挂接模式:0-单桶 1-双桶。配置单桶时无需关注后续参数,配0即可 +* @param e_linkid e桶要挂接到的上级调度器id +* @param e_weight e桶挂接到上级调度器的权重[1~511] +* @param e_sp e桶挂接到上级调度器的sp优先级,有效值[0-8],共9级,优先级依次降低 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_flow_link_wr(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + DPP_TM_SCH_FLOW_PARA_T *p_flow_para) + +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 flow_id_e = 0; + ZXIC_UINT32 c_linkid; + ZXIC_UINT32 c_weight; + ZXIC_UINT32 c_sp; + ZXIC_UINT32 mode; + ZXIC_UINT32 e_linkid; + ZXIC_UINT32 e_weight; + ZXIC_UINT32 e_sp; + DPP_ETM_CRDT_FLOWQUE_PARA_TBL_T etm_crdt_flow_para_tbl_t = {0}; + + /* 取配置参数 */ + c_linkid = p_flow_para->c_linkid; + c_weight = p_flow_para->c_weight; + c_sp = p_flow_para->c_sp; + mode = p_flow_para->mode; + e_linkid = p_flow_para->e_linkid; + e_weight = p_flow_para->e_weight; + e_sp = p_flow_para->e_sp; + /* 参数校验 */ + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_flow_para); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), c_weight, 0, DPP_TM_SCH_WEIGHT_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), e_weight, 0, DPP_TM_SCH_WEIGHT_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), c_sp, 0, DPP_TM_SCH_SP_NUM); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), e_sp, 0, DPP_TM_SCH_SP_NUM); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), mode, 0, 1); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), flow_id, 0, DPP_ETM_Q_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), c_linkid, 0, DPP_ETM_FQSPWFQ_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), e_linkid, 0, DPP_ETM_FQSPWFQ_NUM - 1); + + + /* 开始流级挂接配置 */ + + if (mode == 1) + { + flow_id_e = (flow_id + 0x2400); + } + + /* c桶挂接配置 */ + etm_crdt_flow_para_tbl_t.flowque_link = c_linkid; + etm_crdt_flow_para_tbl_t.flowque_w = c_weight; + etm_crdt_flow_para_tbl_t.flowque_pri = c_sp; + + rc = dpp_reg_write(dev, + ETM_CRDT_FLOWQUE_PARA_TBLr, + 0, + flow_id, + &etm_crdt_flow_para_tbl_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + zxic_comm_delay(5); + + /* mode-1 需要配置双桶挂接 */ + if (mode == 1) + { + /* e桶挂接配置 */ + etm_crdt_flow_para_tbl_t.flowque_link = e_linkid; + etm_crdt_flow_para_tbl_t.flowque_w = e_weight; + etm_crdt_flow_para_tbl_t.flowque_pri = e_sp; + + rc = dpp_reg_write(dev, + ETM_CRDT_FLOWQUE_PARA_TBLr, + 0, + flow_id_e, + &etm_crdt_flow_para_tbl_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + } + + zxic_comm_delay(5); + + return DPP_OK; + + +} + +/***********************************************************/ +/** 配置flow级流队列的挂接关系(flow到上级调度器的挂接) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param flow_id 流队列号 +* @param c_linkid c桶要挂接到的上级调度器id +* @param c_weight c桶挂接到上级调度器的权重[1~511] +* @param c_sp c桶挂接到上级调度器的sp优先级,有效值[0-8],共9级,优先级依次降低 +* @param mode 挂接模式:0-单桶 1-双桶。配置单桶时无需关注后续参数,配0即可 +* @param e_linkid e桶要挂接到的上级调度器id +* @param e_weight e桶挂接到上级调度器的权重[1~511] +* @param e_sp e桶挂接到上级调度器的sp优先级,有效值[0-8],共9级,优先级依次降低 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_flow_link_set(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 c_linkid, + ZXIC_UINT32 c_weight, + ZXIC_UINT32 c_sp, + ZXIC_UINT32 mode, + ZXIC_UINT32 e_linkid, + ZXIC_UINT32 e_weight, + ZXIC_UINT32 e_sp) +{ + DPP_STATUS rc = DPP_OK; + DPP_TM_SCH_FLOW_PARA_T sch_flow_para_t = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + /* 参数赋值 */ + sch_flow_para_t.c_linkid = c_linkid; + sch_flow_para_t.c_weight = c_weight; + sch_flow_para_t.c_sp = c_sp; + sch_flow_para_t.mode = mode; + sch_flow_para_t.e_linkid = e_linkid; + sch_flow_para_t.e_weight = e_weight; + sch_flow_para_t.e_sp = e_sp; + + rc = dpp_tm_crdt_flow_link_wr(dev, flow_id, &sch_flow_para_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_crdt_flow_link_wr"); + + return DPP_OK; + +} + +/***********************************************************/ +/** 批量配置flow级流队列的挂接关系 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param flow_id_s 起始流队列号 +* @param flow_id_e 终止流队列号 +* @param c_linkid c桶要挂接到的上级调度器id +* @param c_weight c桶挂接到上级调度器的权重[1~511] +* @param c_sp c桶挂接到上级调度器的sp优先级,有效值[0-8],共9级,优先级依次降低 +* @param mode 挂接模式:0-单桶 1-双桶。配置单桶时无需关注后续参数,配0即可 +* @param e_linkid e桶要挂接到的上级调度器id +* @param e_weight e桶挂接到上级调度器的权重[1~511] +* @param e_sp e桶挂接到上级调度器的sp优先级,有效值[0-8],共9级,优先级依次降低 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_flow_link_more_set(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id_s, + ZXIC_UINT32 flow_id_e, + ZXIC_UINT32 c_linkid, + ZXIC_UINT32 c_weight, + ZXIC_UINT32 c_sp, + ZXIC_UINT32 mode, + ZXIC_UINT32 e_linkid, + ZXIC_UINT32 e_weight, + ZXIC_UINT32 e_sp) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 flow_id = 0; + DPP_TM_SCH_FLOW_PARA_T sch_flow_para_t = {0}; + ZXIC_COMM_CHECK_POINT(dev); + + + if (flow_id_s > flow_id_e) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "Bad parameters! flow_id_s > flow_id_e !\n"); + return DPP_ERR; + } + + /* 参数赋值 */ + sch_flow_para_t.c_linkid = c_linkid; + sch_flow_para_t.c_weight = c_weight; + sch_flow_para_t.c_sp = c_sp; + sch_flow_para_t.mode = mode; + sch_flow_para_t.e_linkid = e_linkid; + sch_flow_para_t.e_weight = e_weight; + sch_flow_para_t.e_sp = e_sp; + + for (flow_id = flow_id_s; flow_id <= flow_id_e; flow_id++) + { + rc = dpp_tm_crdt_flow_link_wr(dev, flow_id, &sch_flow_para_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_crdt_flow_link_wr"); + } + + return DPP_OK; + +} + + +/***********************************************************/ +/** 配置调度器层次化QOS的挂接关系:非优先级传递 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param se_id 本级调度器id +* 对于FQX/WFQX必须是调度单元中首个调度器id +* @param se_linkid 要挂接到的上级调度器id +* @param se_weight 挂接到上级调度器的权重[1~511] +* @param se_sp 挂接到上级调度器的sp优先级,有效值[0-8],共9级,优先级依次降低 +* @param se_insw 优先级传递使能:0-关 1-开。该参数不传递直接配0 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_se_link_wr(DPP_DEV_T *dev, + ZXIC_UINT32 se_id, + DPP_TM_SCH_SE_PARA_T *p_sch_se_para) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 se_linkid = 0; + ZXIC_UINT32 se_weight = 0; + ZXIC_UINT32 se_sp = 0; + ZXIC_UINT32 se_insw = 0; /* 优先级传递关闭 */ + ZXIC_UINT32 item_num = 0; /* 调度单元中调度器的个数 */ + ZXIC_UINT32 sch_type_num = 0; + ZXIC_UINT32 i = 0; + DPP_ETM_CRDT_SE_PARA_TBL_T etm_crdt_se_para_tbl_t = {0}; + + + /* 取配置参数 */ + se_linkid = p_sch_se_para->se_linkid; + se_weight = p_sch_se_para->se_weight; + se_sp = p_sch_se_para->se_sp; + + + /* 参数校验 */ + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_weight, 0, DPP_TM_SCH_WEIGHT_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_sp, 0, DPP_TM_SCH_SP_NUM); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_insw, 0, 0); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_id, 0, DPP_ETM_FQSPWFQ_NUM - 1); + + if (se_linkid > DPP_ETM_FQSPWFQ_NUM) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_linkid, DPP_TM_PP_LINKID_PORT0, DPP_TM_PP_LINKID_PORT63); + } + else + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_linkid, 0, DPP_ETM_FQSPWFQ_NUM - 1); + } + + + /* 开始调度器挂接配置 */ + + /* 先区分调度器类型:sp/fq/wfq调度器挂接方式相同,wfqx/fqx=2/4/8是另一种挂接方式 */ + rc = dpp_tm_crdt_sch_type_get(dev, se_id, &item_num, &sch_type_num); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_crdt_sch_type_get"); + + + /* 非优先级传递挂接:各调度器参数须相同 */ + etm_crdt_se_para_tbl_t.se_link = se_linkid; + etm_crdt_se_para_tbl_t.se_w = se_weight; + etm_crdt_se_para_tbl_t.se_pri = se_sp; + etm_crdt_se_para_tbl_t.se_insw = se_insw; + etm_crdt_se_para_tbl_t.cp_token_en = 1; + + for (i = 0; i < item_num; i++) + { + rc = dpp_reg_write(dev, + ETM_CRDT_SE_PARA_TBLr, + 0, + se_id + i, + &etm_crdt_se_para_tbl_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + } + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置调度器层次化QOS的挂接关系:非优先级传递 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param se_id 本级调度器id +* 对于FQX/WFQX必须是调度单元中首个调度器id +* @param se_linkid 要挂接到的上级调度器id +* @param se_weight 挂接到上级调度器的权重[1~511] +* @param se_sp 挂接到上级调度器的sp优先级,有效值[0-8],共9级,优先级依次降低 +* @param se_insw 优先级传递使能:0-关 1-开. 该参数不传递直接配0 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_se_link_set(DPP_DEV_T *dev, + ZXIC_UINT32 se_id, + ZXIC_UINT32 se_linkid, + ZXIC_UINT32 se_weight, + ZXIC_UINT32 se_sp) +{ + DPP_STATUS rc = DPP_OK; + DPP_TM_SCH_SE_PARA_T sch_se_para_t = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + /* 参数赋值 */ + sch_se_para_t.se_linkid = se_linkid; + sch_se_para_t.se_weight = se_weight; + sch_se_para_t.se_sp = se_sp; + + rc = dpp_tm_crdt_se_link_wr(dev, se_id, &sch_se_para_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_crdt_se_link_wr"); + + return DPP_OK; +} + +/***********************************************************/ +/** 配置调度器层次化QOS的挂接关系:优先级传递 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param se_id 本级调度器id +* @param se_linkid 要挂接到的上级调度器id +* @param se_sp 挂接到上级调度器的sp优先级,有效值[0-3],最多4级,优先级按调度单元分配, +* 每个调度单元内部调度器优先级相同! +* @param se_weight0-7 WFQ8中各调度器权重值[1~511],若是WFQ2/4 只取前面对应值,后面无效 +* @param se_insw 优先级传递使能:0-关 1-开. 该参数不传递直接配1 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_se_link_insw_wr(DPP_DEV_T *dev, + ZXIC_UINT32 se_id, + DPP_TM_SCH_SE_PARA_INSW_T *p_sch_se_para_insw) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 se_linkid; /** 要挂接到的上级调度器id */ + ZXIC_UINT32 se_sp; /** 挂接到上级调度器的sp优先级,有效值[0-3],共4级,优先级依次降低,优先级按调度单元分配 */ + ZXIC_UINT32 se_weight[8] = {0}; /** WFQ8中各调度器权重值[1~511],若是WFQ2/4 只取前面对应值,后面无效 */ + ZXIC_UINT32 se_insw = 1; /* 优先级传递开启 */ + ZXIC_UINT32 item_num = 1; /* 调度单元中调度器的个数 */ + ZXIC_UINT32 sch_type_num = 0; + ZXIC_UINT32 item_num_link = 0; /* 上级调度单元中调度器的个数 */ + ZXIC_UINT32 sch_type_num_link = 0; + ZXIC_UINT32 i = 0; + DPP_ETM_CRDT_SE_PARA_TBL_T etm_crdt_se_para_tbl_t = {0}; + + /* 取配置参数 */ + se_linkid = p_sch_se_para_insw->se_linkid; + se_sp = p_sch_se_para_insw->se_sp; + se_weight[0] = p_sch_se_para_insw->se_weight[0]; + se_weight[1] = p_sch_se_para_insw->se_weight[1]; + se_weight[2] = p_sch_se_para_insw->se_weight[2]; + se_weight[3] = p_sch_se_para_insw->se_weight[3]; + se_weight[4] = p_sch_se_para_insw->se_weight[4]; + se_weight[5] = p_sch_se_para_insw->se_weight[5]; + se_weight[6] = p_sch_se_para_insw->se_weight[6]; + se_weight[7] = p_sch_se_para_insw->se_weight[7]; + + + /* 参数校验 */ + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_sp, 0, DPP_TM_SCH_SP_NUM - 5); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_insw, 1, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_weight[0], 0, DPP_TM_SCH_WEIGHT_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_weight[1], 0, DPP_TM_SCH_WEIGHT_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_weight[2], 0, DPP_TM_SCH_WEIGHT_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_weight[3], 0, DPP_TM_SCH_WEIGHT_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_weight[4], 0, DPP_TM_SCH_WEIGHT_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_weight[5], 0, DPP_TM_SCH_WEIGHT_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_weight[6], 0, DPP_TM_SCH_WEIGHT_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_weight[7], 0, DPP_TM_SCH_WEIGHT_MAX); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_id, 0, DPP_ETM_FQSPWFQ_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_linkid, 0, DPP_ETM_FQSPWFQ_NUM - 1); + + + + /* 开始调度器挂接配置 */ + + /* 先区分调度器类型:sp/fq/wfq调度器挂接方式相同,wfqx/fqx=2/4/8是另一种挂接方式 */ + rc = dpp_tm_crdt_sch_type_get(dev, se_id, &item_num, &sch_type_num); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_crdt_sch_type_get"); + rc = dpp_tm_crdt_sch_type_get(dev, se_linkid, &item_num_link, &sch_type_num_link); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_crdt_sch_type_get"); + + /* 优先级传递挂接合法性检查:下级传入调度器需是首编号,且下级<=上级 */ + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), item_num, 1, 8); + + if (se_id % item_num != 0 || item_num > item_num_link) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "dpp_tm_crdt_se_link_insw_wr: NOT CORRECT,bad parameters!\n"); + return DPP_ERR; + } + + + /* 优先级传递挂接:各调度器挂接的se_linkid依次递增1,需相邻不能错开 + se_weight不限,取值[1-511] + se_sp:根据下级往上级挂接情况,取值[0-3],调度单元内部须相同 + se_insw 写死为1 */ + etm_crdt_se_para_tbl_t.se_pri = se_sp; + etm_crdt_se_para_tbl_t.se_insw = se_insw; + etm_crdt_se_para_tbl_t.cp_token_en = 1; + + for (i = 0; i < item_num; i++) + { + etm_crdt_se_para_tbl_t.se_link = (se_linkid + i); + etm_crdt_se_para_tbl_t.se_w = se_weight[i]; + + rc = dpp_reg_write(dev, + ETM_CRDT_SE_PARA_TBLr, + 0, + se_id + i, + &etm_crdt_se_para_tbl_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + } + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置调度器层次化QOS的挂接关系:优先级传递 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param se_id 本级调度器id +* @param se_linkid 要挂接到的上级调度器id +* @param se_weight WFQ2/4/8中各调度器权重值[1~511],取相等的值 +* @param se_sp 挂接到上级调度器的sp优先级,有效值[0-7],共8级,优先级依次降低 +* @param se_insw 优先级传递使能:0-关 1-开. 该参数不传递直接配1 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_se_link_insw_set(DPP_DEV_T *dev, + ZXIC_UINT32 se_id, + ZXIC_UINT32 se_linkid, + ZXIC_UINT32 se_weight, + ZXIC_UINT32 se_sp) +{ + ZXIC_UINT32 rc = DPP_OK; + DPP_TM_SCH_SE_PARA_INSW_T sch_se_para_insw_t = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + /* 参数赋值 */ + sch_se_para_insw_t.se_linkid = se_linkid; + sch_se_para_insw_t.se_sp = se_sp; + sch_se_para_insw_t.se_weight[0] = se_weight; + sch_se_para_insw_t.se_weight[1] = se_weight; + sch_se_para_insw_t.se_weight[2] = se_weight; + sch_se_para_insw_t.se_weight[3] = se_weight; + sch_se_para_insw_t.se_weight[4] = se_weight; + sch_se_para_insw_t.se_weight[5] = se_weight; + sch_se_para_insw_t.se_weight[6] = se_weight; + sch_se_para_insw_t.se_weight[7] = se_weight; + + rc = dpp_tm_crdt_se_link_insw_wr(dev, se_id, &sch_se_para_insw_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_crdt_se_link_insw_wr"); + + return DPP_OK; + + +} + + +/***********************************************************/ +/** 配置调度器层次化QOS的挂接关系:优先级传递,单个调度器挂接 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param se_id 本级调度器id +* @param se_linkid 要挂接到的上级调度器id +* @param se_weight WFQ8中对应调度器权重值[1~511] +* @param se_sp 挂接到上级调度器的sp优先级,有效值[0-7],共8级,优先级依次降低 +* @param se_insw 优先级传递使能:0-关 1-开. 该参数不传递直接配1 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_se_link_insw_single_set(DPP_DEV_T *dev, + ZXIC_UINT32 se_id, + ZXIC_UINT32 se_linkid, + ZXIC_UINT32 se_weight, + ZXIC_UINT32 se_sp) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 se_insw = 1; /* 优先级传递开启 */ + DPP_ETM_CRDT_SE_PARA_TBL_T etm_crdt_se_para_tbl_t = {0}; + + + /* 参数校验 */ + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_sp, 0, DPP_TM_SCH_SP_NUM - 5); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_insw, 1, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_weight, 0, DPP_TM_SCH_WEIGHT_MAX); + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_id, 0, DPP_ETM_FQSPWFQ_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_linkid, 0, DPP_ETM_FQSPWFQ_NUM - 1); + + + /* 开始调度器挂接配置 */ + + /* 优先级传递挂接:各调度器挂接的se_linkid依次递增1,需相邻不能错开 + se_weight不限,取值[1-511] + se_sp:根据下级往上级挂接情况,取值[0-3],调度单元内部须相同 + se_insw 写死为1 */ + etm_crdt_se_para_tbl_t.se_pri = se_sp; + etm_crdt_se_para_tbl_t.se_insw = se_insw; + etm_crdt_se_para_tbl_t.cp_token_en = 1; + etm_crdt_se_para_tbl_t.se_link = se_linkid; + etm_crdt_se_para_tbl_t.se_w = se_weight; + + rc = dpp_reg_write(dev, + ETM_CRDT_SE_PARA_TBLr, + 0, + se_id, + &etm_crdt_se_para_tbl_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + + return DPP_OK; + + +} + +/***********************************************************/ +/** 获取调度器挂接配置参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param se_id 调度器编号 +* @param p_se_para_tbl 调度器参数 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_se_para_get(DPP_DEV_T *dev, ZXIC_UINT32 se_id, DPP_ETM_CRDT_SE_PARA_TBL_T *p_se_para_tbl) +{ + DPP_STATUS rc = DPP_OK; + + /* 参数校验 */ + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_se_para_tbl); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_id, 0, DPP_ETM_FQSPWFQ_NUM - 1); + + rc = dpp_reg_read(dev, + ETM_CRDT_SE_PARA_TBLr, + 0, + se_id, + p_se_para_tbl); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + return DPP_OK; + +} + + + +/***********************************************************/ +/** 获取流队列入链状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param flow_id 流队列号 +* @param link_state 0-未入链 1-在调度器链表中 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_flow_link_state_get(DPP_DEV_T *dev, ZXIC_UINT32 flow_id, ZXIC_UINT32 *link_state) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CRDT_FLOWQUE_INS_TBL_T crdt_flow_ins_tbl_t = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), link_state); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), flow_id, 0, DPP_ETM_CRDT_NUM); + + rc = dpp_reg_read(dev, + ETM_CRDT_FLOWQUE_INS_TBLr, + 0, + flow_id, + &crdt_flow_ins_tbl_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *link_state = crdt_flow_ins_tbl_t.flowque_ins; + + return DPP_OK; + +} + +/***********************************************************/ +/** 获取调度器入链状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param se_id 调度器编号 +* @param link_state 0-未入链 1-在调度器链表中 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_se_link_state_get(DPP_DEV_T *dev, ZXIC_UINT32 se_id, ZXIC_UINT32 *link_state) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CRDT_SE_INS_TBL_T crdt_se_ins_tbl_t = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), link_state); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_id, 0, DPP_ETM_FQSPWFQ_NUM - 1); + + rc = dpp_reg_read(dev, + ETM_CRDT_SE_INS_TBLr, + 0, + se_id, + &crdt_se_ins_tbl_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *link_state = crdt_se_ins_tbl_t.se_ins_flag; + + return DPP_OK; + +} + +/***********************************************************/ +/** 判断crdt流删除命令是否空闲 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_del_cmd_idle(DPP_DEV_T *dev) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 read_times = 30; + DPP_ETM_CRDT_FLOW_DEL_CMD_T crdt_del_cmd_busy = {0}; + ZXIC_COMM_CHECK_POINT(dev); + + do + { + rc = dpp_reg_read(dev, + ETM_CRDT_FLOW_DEL_CMDr, + 0, + 0, + &crdt_del_cmd_busy); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + read_times--; + zxic_comm_delay(5); + } + while ((0 != (crdt_del_cmd_busy.flow_del_busy)) && (read_times > 0)); + + if (0 == read_times) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "CRDT Del command busy!\n"); + return DPP_ERR; + } + + return DPP_OK; + +} + +/***********************************************************/ +/** 删除流/调度器挂接关系(调度器编号非从0开始,需要偏移) +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param id 要删除的流号或调度器id +* ETM范围:0--0xABFF; FTM范围:0-0x177F +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_del_link_set(DPP_DEV_T *dev, ZXIC_UINT32 id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 c_sta = 0; + ZXIC_UINT32 e_sta = 0; + ZXIC_UINT32 flow_e = 0; + ZXIC_UINT32 link_state = 0; /*流或调度器入链状态*/ + ZXIC_UINT32 read_times = 300; + ZXIC_UINT32 crdt_del_cmd_reg_index = 0; + DPP_ETM_CRDT_FLOW_DEL_CMD_T crdt_del_cmd_t = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), id, 0, DPP_ETM_SCH_DEL_NUM); + flow_e = DPP_ETM_Q_NUM; + + /* 循环判断入链状态是否为1 */ + do + { + + /* 判断当前流或调度器入链状态:非入链情况才能删除挂接 */ + if (id <= DPP_ETM_CRDT_NUM) + { + /* 流入链状态 */ + rc = dpp_tm_crdt_flow_link_state_get(dev, id, &c_sta); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_crdt_flow_link_state_get"); + + rc = dpp_tm_crdt_flow_link_state_get(dev, id + DPP_ETM_Q_NUM, &e_sta); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_crdt_flow_link_state_get"); + + link_state = c_sta || e_sta; + } + else + { + /*调度器入链状态*/ + rc = dpp_tm_crdt_se_link_state_get(dev, id - DPP_ETM_SHAP_SEID_BASE, &link_state); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_crdt_se_link_state_get"); + + } + + if (0 == link_state) + { + break; + } + read_times--; + zxic_comm_delay(1); + } + while (read_times > 0); + + if (read_times == 0) + { + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(id, flow_e); + ZXIC_COMM_TRACE_ERROR("id: 0x%08x ins_flag is always 1 (Maybe it's because cir equal zero) !!!\n", id); + /*此时要 继续往下走,执行强删!如果不删除队列没释放下次直接覆写问题更严重。zhaoyan*/ + } + + /*删挂接命令是否空闲*/ + rc = dpp_tm_crdt_del_cmd_idle(dev); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_crdt_del_cmd_idle"); + + + /*进行流或调度器删除操作*/ + crdt_del_cmd_reg_index = ETM_CRDT_FLOW_DEL_CMDr; + crdt_del_cmd_t.flow_alt_cmd = 1; + crdt_del_cmd_t.flow_alt_ind = id; + + /* 流删除:如果删除c桶,需要同时删除e桶 */ + if (id < DPP_ETM_Q_NUM) + { + rc = dpp_reg_write(dev, + crdt_del_cmd_reg_index, + 0, + 0, + &crdt_del_cmd_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + /*删挂e桶:判断命令是否空闲*/ + rc = dpp_tm_crdt_del_cmd_idle(dev); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_crdt_del_cmd_idle"); + crdt_del_cmd_t.flow_alt_ind = (id + DPP_ETM_Q_NUM); + rc = dpp_reg_write(dev, + crdt_del_cmd_reg_index, + 0, + 0, + &crdt_del_cmd_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + } + else + { + + rc = dpp_reg_write(dev, + crdt_del_cmd_reg_index, + 0, + 0, + &crdt_del_cmd_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + } + + return DPP_OK; +} + +/***********************************************************/ +/** 删除调度器挂接关系(调度器编号从0开始):对外API +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param se_id_s 要删除的起始调度器id +* @param se_id_e 要删除的终止调度器id +* ETM范围:0--0x63FF; FTM范围:0-0x77F +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_del_se_link_set(DPP_DEV_T *dev, ZXIC_UINT32 id_s, ZXIC_UINT32 id_e) +{ + + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 se_id_offset = 0; + ZXIC_UINT32 id = 0 ; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), id_s, 0, DPP_ETM_FQSPWFQ_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), id_e, 0, DPP_ETM_FQSPWFQ_NUM - 1); + se_id_offset = DPP_ETM_SHAP_SEID_BASE; + + if (id_s > id_e) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "Bad parameters! id_s > id_e!\n"); + return DPP_ERR; + } + + for (id = id_s; id <= id_e; id++) + { + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(DEV_ID(dev), id , se_id_offset); + rc = dpp_tm_crdt_del_link_set(dev, id + se_id_offset); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_crdt_del_link_set"); + } + + + return DPP_OK; + +} + + +/***********************************************************/ +/** 删除流挂接关系:对外API +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param id_s 要删除的流号或调度器起始id +* @param id_e 要删除的流号或调度器终止id +* ETM范围:0--0x47FF; FTM范围:0-0xFFF +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/02/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_del_flow_link_set(DPP_DEV_T *dev, ZXIC_UINT32 id_s, ZXIC_UINT32 id_e) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 id = 0; + ZXIC_UINT32 q_td_th = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), id_s, 0, DPP_ETM_CRDT_NUM); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), id_e, 0, DPP_ETM_CRDT_NUM); + + if (id_s > id_e) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "Bad parameters! id_s > id_e !\n"); + return DPP_ERR; + } + + for (id = id_s; id <= id_e; id++) + { + rc = dpp_tm_cgavd_td_th_get(dev, QUEUE_LEVEL, id, &q_td_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_cgavd_td_th_get"); + + if (q_td_th != 0) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "queue TD_TH is not equal 0 ! q_td_th != 0 !\n"); + return DPP_ERR; + } + } + + for (id = id_s; id <= id_e; id++) + { + rc = dpp_tm_crdt_del_link_set(dev, id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_crdt_del_link_set"); + } + + return DPP_OK; +} + +#if 0 +/***********************************************************/ +/** 配置授权分发使能或者关闭 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param en 配置的值,0-关闭授权分发,1-使能授权分发 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/25 +************************************************************/ +DPP_STATUS dpp_tm_crdt_credit_en_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CRDT_CREDIT_EN_T credit_en = {0}; + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, en, 0, 1); + + credit_en.credit_en = en; + rc = dpp_reg_write(dev_id, + ETM_CRDT_CREDIT_ENr, + 0, + 0, + &credit_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读取授权分发使能或者关闭 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_en 读出的值,0-关闭授权分发,1-使能授权分发 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/25 +************************************************************/ +DPP_STATUS dpp_tm_crdt_credit_en_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CRDT_CREDIT_EN_T credit_en = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_en); + + *p_en = 0xffffffff; + rc = dpp_reg_read(dev_id, + ETM_CRDT_CREDIT_ENr, + 0, + 0, + &credit_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + *p_en = credit_en.credit_en; + + return DPP_OK; +} + +/***********************************************************/ +/** 配置授权产生间隔 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param crdt_space_choose 授权发送间隔 0:固定16个周期 1:查表 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/10 +************************************************************/ +DPP_STATUS dpp_tm_crdt_space_choose_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 crdt_space_choose) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CRDT_CREDIT_SPACE_SELECT_T space_select = {0}; + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, crdt_space_choose, 0, 1); + + space_select.credit_space_select = crdt_space_choose; + + rc = dpp_reg_write(dev_id, + ETM_CRDT_CREDIT_SPACE_SELECTr, + 0, + 0, + &space_select); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + return DPP_OK; +} + +/***********************************************************/ +/** 获得授权产生间隔 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param crdt_space_choose 授权发送间隔 0:固定16个周期 1:查表 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/10 +************************************************************/ +DPP_STATUS dpp_tm_crdt_space_choose_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_crdt_space_choose) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CRDT_CREDIT_SPACE_SELECT_T space_select = {0}; + + + rc = dpp_reg_read(dev_id, + ETM_CRDT_CREDIT_SPACE_SELECTr, + 0, + 0, + &space_select); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + *p_crdt_space_choose = space_select.credit_space_select; + + return DPP_OK; +} + +#endif +/***********************************************************/ +/** 配置端口拥塞令牌桶使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param port_id 端口号:0~63 +* @param port_en 端口拥塞令牌桶使能,1表示不使用拥塞令牌桶的授权,0表示可以使用拥塞令牌桶授权 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author taq @date 2015/03/11 +************************************************************/ +DPP_STATUS dpp_tm_crdt_port_congest_en_set(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + ZXIC_UINT32 port_en) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 value = 0; + DPP_ETM_CRDT_CONGEST_TOKEN_DISABLE_31_0_T disable_31_0 = {0}; + DPP_ETM_CRDT_CONGEST_TOKEN_DISABLE_63_32_T disable_63_32 = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), port_id, 0, DPP_TM_PP_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), port_en, 0, 1); + + if (port_id <= 31) + { + /* port_id:[0-31] */ + rc = dpp_reg_read(dev, + ETM_CRDT_CONGEST_TOKEN_DISABLE_31_0r, + 0, + 0, + &disable_31_0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + value = disable_31_0.congest_token_disable_31_0; + + if (port_en == 0) + { + value = value & (~(1u << port_id)); + } + else + { + value = value | (1u << port_id); + } + + disable_31_0.congest_token_disable_31_0 = value; + + rc = dpp_reg_write(dev, + ETM_CRDT_CONGEST_TOKEN_DISABLE_31_0r, + 0, + 0, + &disable_31_0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + } + else + { + /* port_id:[32-63] */ + rc = dpp_reg_read(dev, + ETM_CRDT_CONGEST_TOKEN_DISABLE_63_32r, + 0, + 0, + &disable_63_32); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + value = disable_63_32.congest_token_disable_63_32; + + if (port_en == 0) + { + value = value & (~(1u << (port_id - 32))); + } + else + { + value = value | (1u<< (port_id - 32)); + } + + disable_63_32.congest_token_disable_63_32 = value; + + rc = dpp_reg_write(dev, + ETM_CRDT_CONGEST_TOKEN_DISABLE_63_32r, + 0, + 0, + &disable_63_32); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + } + + return DPP_OK; +} + +/***********************************************************/ +/** 获得端口拥塞令牌桶使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param port_id 端口号:0~120 +* @param p_port_en 端口拥塞令牌桶使能,1表示不使用拥塞令牌桶的授权,0表示可以使用拥塞令牌桶授权 +* +* @return +* @remark 无 +* @see +* @author djf @date 2015/03/11 +************************************************************/ +DPP_STATUS dpp_tm_crdt_port_congest_en_get(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + ZXIC_UINT32 *p_port_en) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 value = 0; + DPP_ETM_CRDT_CONGEST_TOKEN_DISABLE_31_0_T disable_31_0 = {0}; + DPP_ETM_CRDT_CONGEST_TOKEN_DISABLE_63_32_T disable_63_32 = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), port_id, 0, DPP_TM_PP_NUM - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_port_en); + + if (port_id <= 31) + { + /* port_id:[0-31] */ + rc = dpp_reg_read(dev, + ETM_CRDT_CONGEST_TOKEN_DISABLE_31_0r, + 0, + 0, + &disable_31_0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + value = disable_31_0.congest_token_disable_31_0; + + *p_port_en = 1 & (value >> port_id); + } + else + { + /* port_id:[32-63] */ + rc = dpp_reg_read(dev, + ETM_CRDT_CONGEST_TOKEN_DISABLE_63_32r, + 0, + 0, + &disable_63_32); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + value = disable_63_32.congest_token_disable_63_32; + + *p_port_en = 1 & (value >> (port_id - 32)); + } + + return DPP_OK; +} + + +/***********************************************************/ +/** CRDT 模块 读写是否超时检查:只有端口sp优先级的配置需检测cfg_state的状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* +* @return DPP_OK-空闲,DPP_ERR-忙 +* @remark 无 +* @see +* @author szq @date 2015/05/26 +************************************************************/ +DPP_STATUS dpp_tm_crdt_idle_check(DPP_DEV_T *dev) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 read_times = 30; + DPP_ETM_CRDT_CFG_STATE_T is_idle_flag = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + + do + { + rc = dpp_reg_read(dev, + ETM_CRDT_CFG_STATEr, + 0, + 0, + &is_idle_flag); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + read_times--; + zxic_comm_delay(5); + + } + while ((1 == is_idle_flag.cfg_state) && (read_times > 0)); + + if (0 == read_times) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "crdt rw time out\n"); + return DPP_ERR; + } + + return DPP_OK; +} + +#if 0 +/***********************************************************/ +/** 授权个数统计寄存器清零 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author taq @date 2015/06/19 +************************************************************/ +DPP_STATUS dpp_tm_crdt_clr_diag(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CRDT_CNT_CLR_T cnt_clr = {0}; + + /* 不使能CRDT */ + rc = dpp_tm_crdt_credit_en_set(dev_id, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_crdt_credit_en_set"); + + /* 清零所有的授权数统计寄存器 */ + cnt_clr.cnt_clr = 1; + rc = dpp_reg_write(dev_id, + ETM_CRDT_CNT_CLRr, + 0, + 0, + &cnt_clr); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + /* 保持所有的授权数统计寄存器值 */ + cnt_clr.cnt_clr = 0; + rc = dpp_reg_write(dev_id, + ETM_CRDT_CNT_CLRr, + 0, + 0, + &cnt_clr); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + /* 使能CRDT */ + rc = dpp_tm_crdt_credit_en_set(dev_id, 1); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_crdt_credit_en_set"); + + return DPP_OK; +} + + + +/***********************************************************/ +/** 打印各级及指定被统计的第0~15个授权流得到的授权个数 stm模式下使用 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/06/19 +************************************************************/ +DPP_STATUS dpp_tm_crdt_ackcnt_diag(ZXIC_UINT32 dev_id, ZXIC_UINT32 delay_ms) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 credit_value = 0; + ZXIC_UINT32 flow_spec_id_offset = 0; + ZXIC_FLOAT traffic_amplified = 0.0; + ZXIC_FLOAT flow_spec_traffic = 0.0; + + DPP_ETM_CRDT_DEV_CREDIT_CNT_T dev_crdit_cnt = {0}; + //DPP_ETM_CRDT_PP_CREDIT_CNT_T pp_crdit_cnt = {0}; + + DPP_ETM_CRDT_STAT_QUE_ID_0_T stat_que_id_0 = {0}; + DPP_ETM_CRDT_STAT_QUE_CREDIT_T que_credit = {0}; + + rc = dpp_tm_crdt_clr_diag(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_crdt_clr_diag"); + zxic_comm_sleep(delay_ms); + + + /* dev级接收到的授权总数 */ + rc = dpp_reg_read(dev_id, + ETM_CRDT_DEV_CREDIT_CNTr, + 0, + 0, + &dev_crdit_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + /* pp级接收到的授权总数 + rc = dpp_reg_read(dev_id, + ETM_CRDT_PP_CREDIT_CNTr, + 0, + 0, + &pp_crdit_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); */ + + + /* 读取credit_value */ + rc = dpp_tm_qmu_credit_value_get(dev_id, &credit_value); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_credit_value_get"); + + traffic_amplified = ((ZXIC_FLOAT)delay_ms * (ZXIC_FLOAT)(1000000.0)) / ((ZXIC_FLOAT)(8.0) * (ZXIC_FLOAT)(credit_value)); + ZXIC_COMM_PRINT("dev: ack_cnt = 0x%08x, traffic = %.6f.(Gb)\n", dev_crdit_cnt.dev_credit_cnt, (ZXIC_FLOAT)(dev_crdit_cnt.dev_credit_cnt) / traffic_amplified); + //ZXIC_COMM_PRINT("pp: ack_cnt = 0x%08x, traffic = %.6f.(G)\n", pp_crdit_cnt.pp_credit_cnt, (ZXIC_FLOAT)(pp_crdit_cnt.pp_credit_cnt) / traffic_amplified); + + for (flow_spec_id_offset = 0; flow_spec_id_offset < 16; flow_spec_id_offset++) + { + rc = dpp_reg_read(dev_id, + ETM_CRDT_STAT_QUE_ID_0r + flow_spec_id_offset, + 0, + 0, + &stat_que_id_0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_CRDT_STAT_QUE_CREDITr, + 0, + flow_spec_id_offset, + &que_credit); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + flow_spec_traffic = (ZXIC_FLOAT)(que_credit.stat_que_credit_cnt) / traffic_amplified; + + ZXIC_COMM_PRINT("flow_0x%04x(%5d): ", (stat_que_id_0.stat_que_id_0 & 0xffff), (stat_que_id_0.stat_que_id_0 & 0xffff)); + ZXIC_COMM_PRINT("ack_cnt = 0x%08x, ", que_credit.stat_que_credit_cnt); + ZXIC_COMM_PRINT("traffic = %.6f.(Gb)\n", flow_spec_traffic); + + } + + + return DPP_OK; +} + +/***********************************************************/ +/** +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param que_id queue id +* @param en 1:过滤E桶队列CRS状态为SLOW的入链请求;0:E桶队列CRS SLOW正常入链; +* +* @return +* @remark 无 +* @see +* @author XXX @date 2019/05/08 +************************************************************/ +DPP_STATUS dpp_tm_crdt_eir_crs_filter_en_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 que_id, ZXIC_UINT32 en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CRDT_EIR_CRS_FILTER_TBL_T eir_crs_filter = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, que_id, 0, DPP_ETM_Q_NUM - 1); + + eir_crs_filter.eir_crs_filter = en; + rc = dpp_reg_write(dev_id, + ETM_CRDT_EIR_CRS_FILTER_TBLr, + 0, + que_id, + &eir_crs_filter); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return rc; +} + +/***********************************************************/ +/** +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param que_id_s 起始队列号 +* @param que_id_e 终止队列号 +* @param en 1:过滤E桶队列CRS状态为SLOW的入链请求;0:E桶队列CRS SLOW正常入链; +* +* @return +* @remark 无 +* @see +* @author XXX @date 2019/05/08 +************************************************************/ +DPP_STATUS dpp_tm_crdt_eir_crs_filter_en_more_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 que_id_s, ZXIC_UINT32 que_id_e, ZXIC_UINT32 en) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 i = 0; + + if (que_id_s > que_id_e) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "Bad parameters! que_id_s > que_id_e !\n"); + return DPP_ERR; + } + + for (i = que_id_s; i <= que_id_e; i++) + { + rc = dpp_tm_crdt_eir_crs_filter_en_set(dev_id, i, en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_crdt_eir_crs_filter_en_set"); + } + + return DPP_OK; +} + + +/***********************************************************/ +/** +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param que_id queue id +* @param p_en +* +* @return +* @remark 无 +* @see +* @author XXX @date 2019/05/08 +************************************************************/ +DPP_STATUS dpp_tm_crdt_eir_crs_filter_en_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 que_id, ZXIC_UINT32 *p_en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CRDT_EIR_CRS_FILTER_TBL_T eir_crs_filter = {0}; + + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_en); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, que_id, 0, DPP_ETM_Q_NUM - 1); + + rc = dpp_reg_read(dev_id, + ETM_CRDT_EIR_CRS_FILTER_TBLr, + 0, + que_id, + &eir_crs_filter); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + *p_en = eir_crs_filter.eir_crs_filter; + + return rc; +} + + +/***********************************************************/ +/**cpu配置flow_id的crs强制为normal或者off开关使能,用于检测SA模式下队列到授权流的多对一问题 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param flow_id:流号(和授权流号一一对应) +* en 强制配置crs的使能,0-不使能,1-使能 +* crs_value:强制配置crs的值2'b00:off; 2'b01:low; 2'b10:normal; +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/04/25 +************************************************************/ +DPP_STATUS dpp_tm_crdt_crs_sheild_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 flow_id, ZXIC_UINT32 en, ZXIC_UINT32 crs_value) +{ + DPP_STATUS rc = DPP_OK; + + DPP_ETM_CRDT_CRS_SHEILD_FLOW_ID_CFG_T crs_sheild_flow_id_cfg = {0}; + DPP_ETM_CRDT_CRS_SHEILD_EN_CFG_T crs_sheild_en_cfg = {0}; + DPP_ETM_CRDT_CRS_SHEILD_VALUE_CFG_T crs_sheild_value_cfg = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, crs_value, 0, 2); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, flow_id, 0, DPP_ETM_Q_NUM - 1); + + + crs_sheild_flow_id_cfg.crs_sheild_flow_id_cfg = flow_id; + rc = dpp_reg_write(dev_id, + ETM_CRDT_CRS_SHEILD_FLOW_ID_CFGr, + 0, + 0, + &crs_sheild_flow_id_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + crs_sheild_en_cfg.crs_sheild_en_cfg = en; + rc = dpp_reg_write(dev_id, + ETM_CRDT_CRS_SHEILD_EN_CFGr, + 0, + 0, + &crs_sheild_en_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + crs_sheild_value_cfg.crs_sheild_value_cfg = crs_value; + rc = dpp_reg_write(dev_id, + ETM_CRDT_CRS_SHEILD_VALUE_CFGr, + 0, + 0, + &crs_sheild_value_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/***********************************************************/ +/**获取flow_id的crs强制为normal或者off开关使能,用于检测SA模式下队列到授权流的多对一问题 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param flow_id:流号(和授权流号一一对应) +* en 强制配置crs的使能,0-不使能,1-使能 +* crs_value:强制配置crs的值2'b00:off; 2'b01:low; 2'b10:normal; +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/04/25 +************************************************************/ +DPP_STATUS dpp_tm_crdt_crs_sheild_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_flow_id, ZXIC_UINT32 *p_en, ZXIC_UINT32 *p_crs_value) +{ + DPP_STATUS rc = DPP_OK; + + DPP_ETM_CRDT_CRS_SHEILD_FLOW_ID_CFG_T crs_sheild_flow_id_cfg = {0}; + DPP_ETM_CRDT_CRS_SHEILD_EN_CFG_T crs_sheild_en_cfg = {0}; + DPP_ETM_CRDT_CRS_SHEILD_VALUE_CFG_T crs_sheild_value_cfg = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_flow_id); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_en); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_crs_value); + + rc = dpp_reg_read(dev_id, + ETM_CRDT_CRS_SHEILD_FLOW_ID_CFGr, + 0, + 0, + &crs_sheild_flow_id_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + *p_flow_id = crs_sheild_flow_id_cfg.crs_sheild_flow_id_cfg; + + rc = dpp_reg_read(dev_id, + ETM_CRDT_CRS_SHEILD_EN_CFGr, + 0, + 0, + &crs_sheild_en_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + *p_en = crs_sheild_en_cfg.crs_sheild_en_cfg; + + rc = dpp_reg_read(dev_id, + ETM_CRDT_CRS_SHEILD_VALUE_CFGr, + 0, + 0, + &crs_sheild_value_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + *p_crs_value = crs_sheild_value_cfg.crs_sheild_value_cfg; + + return DPP_OK; +} + +/***********************************************************/ +/** 控制授权速率的门限 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param index 0~6 +* @param rci_grade_th_0_data +* +* @return +* @remark 无 +* @see +* @author wush @date 2017/10/17 +************************************************************/ +DPP_STATUS dpp_tm_crdt_rci_grade_th_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 index, ZXIC_UINT32 rci_grade_th_0_data) +{ + DPP_STATUS rc = DPP_OK; + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, index, 0, 6); + + rc = dpp_reg_write(dev_id, + ETM_CRDT_RCI_GRADE_TH_0_CFGr + index, + 0, + 0, + &rci_grade_th_0_data); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + + +DPP_STATUS dpp_tm_crdt_rci_grade_th_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 index, ZXIC_UINT32 *p_rci_grade_th_0_data) +{ + DPP_STATUS rc = DPP_OK; + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, index, 0, 6); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_rci_grade_th_0_data); + + rc = dpp_reg_read(dev_id, + ETM_CRDT_RCI_GRADE_TH_0_CFGr + index, + 0, + 0, + p_rci_grade_th_0_data); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + return DPP_OK; +} + +/***********************************************************/ +/** 控制授权间隔的门限,建议大于等于0XF,不可取0; +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param index 0~7 +* @param asm_interval_0_data 控制授权间隔的门限,建议大于等于0XF,不可取0; +* +* @return +* @remark 无 +* @see +* @author wush @date 2017/10/17 +************************************************************/ +DPP_STATUS dpp_tm_crdt_asm_interval_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 index, ZXIC_UINT32 asm_interval_0_data) +{ + DPP_STATUS rc = DPP_OK; + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, index, 0, 7); + + rc = dpp_reg_write(dev_id, + ETM_CRDT_ASM_INTERVAL_0_CFGr + index, + 0, + 0, + &asm_interval_0_data); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + + return DPP_OK; +} + +DPP_STATUS dpp_tm_crdt_asm_interval_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 index, ZXIC_UINT32 *p_asm_interval_0_data) +{ + DPP_STATUS rc = DPP_OK; + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, index, 0, 7); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_asm_interval_0_data); + + rc = dpp_reg_read(dev_id, + ETM_CRDT_ASM_INTERVAL_0_CFGr + index, + 0, + 0, + p_asm_interval_0_data); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + return DPP_OK; +} + +/***********************************************************/ +/** rci的级别 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_rci_grade_data +* +* @return +* @remark 无 +* @see +* @author wush @date 2017/10/17 +************************************************************/ +DPP_STATUS dpp_tm_crdt_rci_grade_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_rci_grade_data) +{ + DPP_STATUS rc = DPP_OK; + + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_rci_grade_data); + + rc = dpp_reg_read(dev_id, + ETM_CRDT_RCI_GRADEr, + 0, + 0, + p_rci_grade_data); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + return DPP_OK; +} + +DPP_STATUS dpp_tm_crdt_rci_value_r_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_crdt_rci_value_r_data) +{ + DPP_STATUS rc = DPP_OK; + + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_crdt_rci_value_r_data); + + + rc = dpp_reg_read(dev_id, + ETM_CRDT_CRDT_RCI_VALUE_Rr, + 0, + 0, + p_crdt_rci_value_r_data); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + return DPP_OK; +} + +DPP_STATUS dpp_tm_crdt_interval_now_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_crdt_interval_now_data) +{ + DPP_STATUS rc = DPP_OK; + + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_crdt_interval_now_data); + + rc = dpp_reg_read(dev_id, + ETM_CRDT_CRDT_INTERVAL_NOWr, + 0, + 0, + p_crdt_interval_now_data); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + return DPP_OK; +} + +/***********************************************************/ +/** 配置crdt interval使能, +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param crdt_interval_en_cfg_data 授权分发间隔使能,1打开,0关闭 +* +* @return +* @remark 无 +* @see +* @author wush @date 2017/03/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_interval_en_cfg_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 crdt_interval_en_cfg_data) +{ + DPP_STATUS rc = DPP_OK; + + rc = dpp_reg_write(dev_id, + ETM_CRDT_CRDT_INTERVAL_EN_CFGr, + 0, + 0, + &crdt_interval_en_cfg_data); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读取crdt interval使能 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param crdt_interval_en_cfg_data 授权分发间隔使能,1打开,0关闭 +* +* @return +* @remark 无 +* @see +* @author wush @date 2017/03/27 +************************************************************/ +DPP_STATUS dpp_tm_crdt_interval_en_cfg_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_crdt_interval_en_cfg_data) +{ + DPP_STATUS rc = DPP_OK; + + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_crdt_interval_en_cfg_data); + + rc = dpp_reg_read(dev_id, + ETM_CRDT_CRDT_INTERVAL_EN_CFGr, + 0, + 0, + p_crdt_interval_en_cfg_data); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + return DPP_OK; +} + +/***********************************************************/ +/** 屏蔽ucn/asm_rdy的时能信号 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param ucn_rdy_shield_en 是否屏蔽ucn_rdy信号,1屏蔽,0不屏蔽 +* @param asm_rdy_shield_en 是否屏蔽asm_rdy信号,1屏蔽,0不屏蔽 +* +* @return +* @remark 无 +* @see +* @author wush @date 2017/10/17 +************************************************************/ +DPP_STATUS dpp_tm_crdt_ucn_asm_rdy_shield_en_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 ucn_rdy_shield_en, ZXIC_UINT32 asm_rdy_shield_en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CRDT_UCN_ASM_RDY_SHIELD_EN_T ucn_rdy_shield_en_data = {0}; + + + + ucn_rdy_shield_en_data.ucn_rdy_shield_en = ucn_rdy_shield_en; + ucn_rdy_shield_en_data.asm_rdy_shield_en = asm_rdy_shield_en; + + rc = dpp_reg_write(dev_id, + ETM_CRDT_UCN_ASM_RDY_SHIELD_ENr, + 0, + 0, + &ucn_rdy_shield_en_data); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +DPP_STATUS dpp_tm_crdt_ucn_asm_rdy_shield_en_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_ucn_rdy_shield_en, ZXIC_UINT32 *p_asm_rdy_shield_en) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CRDT_UCN_ASM_RDY_SHIELD_EN_T ucn_rdy_shield_en_data = {0}; + + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_ucn_rdy_shield_en); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_asm_rdy_shield_en); + + rc = dpp_reg_read(dev_id, + ETM_CRDT_UCN_ASM_RDY_SHIELD_ENr, + 0, + 0, + &ucn_rdy_shield_en_data); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + *p_ucn_rdy_shield_en = ucn_rdy_shield_en_data.ucn_rdy_shield_en; + *p_asm_rdy_shield_en = ucn_rdy_shield_en_data.asm_rdy_shield_en; + + return DPP_OK; +} + +#endif +#endif + + +#if ZXIC_REAL("TM_SHAPE") + +#if 0 +/***********************************************************/ +/** 把整数分解成(指定位长)最高有效数和(2的)指数位数的形式,data=p_remdata*2^(p_exp) +* @param data 需要转换前的数 +* @param rembitsum 余数的位数 +* @param p_remdata 余数大小 +* @param p_exp 指数大小 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/27 +************************************************************/ +DPP_STATUS dpp_tm_rem_and_exp_translate(ZXIC_UINT32 data, + ZXIC_UINT32 rembitsum, + ZXIC_UINT32 *p_remdata, + ZXIC_UINT32 *p_exp) +{ + ZXIC_UINT32 i = 0; + ZXIC_COMM_CHECK_POINT(p_remdata); + ZXIC_COMM_CHECK_POINT(p_exp); + + if ((0 == data) || (0 == rembitsum)) + { + *p_remdata = 0; + *p_exp = 0; + return DPP_OK; + } + + for (i = 1; i <= 32; i++) + { + /* ZXIC_UINT64位长64位,如果ZXIC_UINT32在,左移32位时会有问题 */ + if (0 == (data & (((ZXIC_UINT64) 0xffffffff) << i))) + { + break; + } + } + + if (i <= rembitsum) + { + *p_remdata = data; + *p_exp = 0; + } + else + { + *p_remdata = (data >> (i - rembitsum)); + *p_exp = i - rembitsum; + } + + return DPP_OK; + +} + +/***********************************************************/ +/** shap ram初始化 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/22 +************************************************************/ +DPP_STATUS dpp_tm_shap_ram_init(ZXIC_UINT32 dev_id) +{ + + + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 read_times = 30; + DPP_ETM_SHAP_SHAP_CFG_INIT_CFG_T shap_ram_cfg_init_t = {0}; + DPP_ETM_SHAP_SHAP_STA_INIT_CFG_T shap_ram_sta_init_t = {0}; + + + /**RAM初始化**/ + shap_ram_cfg_init_t.cfg_ram_init_en = 1; + rc = dpp_reg_write(dev_id, + ETM_SHAP_SHAP_CFG_INIT_CFGr, + 0, + 0, + &shap_ram_cfg_init_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + shap_ram_sta_init_t.sta_ram_init_en = 1; + rc = dpp_reg_write(dev_id, + ETM_SHAP_SHAP_STA_INIT_CFGr, + 0, + 0, + &shap_ram_sta_init_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + + + /**初始化done确认**/ + do + { + rc = dpp_reg_read(dev_id, + ETM_SHAP_SHAP_CFG_INIT_CFGr, + 0, + 0, + &shap_ram_cfg_init_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_SHAP_SHAP_STA_INIT_CFGr, + 0, + 0, + &shap_ram_sta_init_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + read_times--; + zxic_comm_usleep(100); + + } + while ((0 == shap_ram_cfg_init_t.cfg_ram_init_done || 0 == shap_ram_sta_init_t.sta_ram_init_done ) && (read_times > 0)); + + if (0 == read_times) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "SHAP RAM init failed!\n"); + return DPP_ERR; + } + + return DPP_OK; + +} + +#endif +/***********************************************************/ +/** 配置流队列双桶整形使能及模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param db_en 双桶整形使能 +* @param mode 0:c+e模式,1:c+p模式 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_tm_shape_flow_db_en_set(DPP_DEV_T *dev, + ZXIC_UINT32 db_en, + ZXIC_UINT32 mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CRDT_DB_TOKEN_T tm_shape_db_en_t = {0}; + DPP_ETM_SHAP_TOKEN_MODE_SWITCH_T tm_shap_db_mode_t = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), db_en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), mode, 0, 1); + + + tm_shape_db_en_t.db_token = db_en; + tm_shap_db_mode_t.token_mode_switch = mode; + + rc = dpp_reg_write(dev, + ETM_CRDT_DB_TOKENr, + 0, + 0, + &tm_shape_db_en_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev, + ETM_SHAP_TOKEN_MODE_SWITCHr, + 0, + 0, + &tm_shap_db_mode_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 获取流队列双桶整形使能及模式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param db_en 双桶整形使能 +* @param mode 0:c+e模式,1:c+p模式 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_tm_shape_flow_db_en_get(DPP_DEV_T *dev, + ZXIC_UINT32 *db_en, + ZXIC_UINT32 *mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CRDT_DB_TOKEN_T tm_shape_db_en_t = {0}; + DPP_ETM_SHAP_TOKEN_MODE_SWITCH_T tm_shap_db_mode_t = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), db_en); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), mode); + + rc = dpp_reg_read(dev, + ETM_CRDT_DB_TOKENr, + 0, + 0, + &tm_shape_db_en_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev, + ETM_SHAP_TOKEN_MODE_SWITCHr, + 0, + 0, + &tm_shap_db_mode_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *db_en = tm_shape_db_en_t.db_token; + *mode = tm_shap_db_mode_t.token_mode_switch; + + return DPP_OK; +} + +#if 0 +/***********************************************************/ +/** 配置桶深最小单位配置:共8档:0-7 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param token_grain 3’d0:最小单位为128K +* 3’d1:最小单位为64k +* 3’d2:最小单位为32k +* 3’d3:最小单位为16k +* 3’d4:最小单位为8k +* 3’d5:最小单位为4k +* 3’d6:最小单位为2k +* 3’d7:最小单位为1k +* 默认为0,即128K +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_tm_shape_token_grain_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 token_grain) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_SHAP_TOKEN_GRAIN_T tm_shape_token_grain_t = {0}; + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, token_grain, 0, 7); + + tm_shape_token_grain_t.token_grain = token_grain; + + rc = dpp_reg_write(dev_id, + ETM_SHAP_TOKEN_GRAINr, + 0, + 0, + &tm_shape_token_grain_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; + +} + +#endif +/***********************************************************/ +/** 获取桶深最小单位配置:共8档:0-7 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param token_grain 3’d0:最小单位为128K +* 3’d1:最小单位为64k +* 3’d2:最小单位为32k +* 3’d3:最小单位为16k +* 3’d4:最小单位为8k +* 3’d5:最小单位为4k +* 3’d6:最小单位为2k +* 3’d7:最小单位为1k +* 默认为0,即128K +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_tm_shape_token_grain_get(DPP_DEV_T *dev, + ZXIC_UINT32 *token_grain) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_SHAP_TOKEN_GRAIN_T tm_shape_token_grain_t = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), token_grain); + + + rc = dpp_reg_read(dev, + ETM_SHAP_TOKEN_GRAINr, + 0, + 0, + &tm_shape_token_grain_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *token_grain = tm_shape_token_grain_t.token_grain; + + return DPP_OK; + +} + +/***********************************************************/ +/** 配置流或调度器映射到整形参数表的某个ID +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param id 流或调度器编号ETM:0-ABFF,FTM:0-177F +* @param profile_id 整形参数表id索引:[0-127] +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_tm_shape_map_table_set(DPP_DEV_T *dev, + ZXIC_UINT32 id, + ZXIC_UINT32 profile_id) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_SHAP_SHAP_BUCKET_MAP_TBL_T tm_shape_map_tbl_t = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), profile_id, 0, 127); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), id, 0, DPP_ETM_SCH_DEL_NUM); + + tm_shape_map_tbl_t.shap_map = profile_id; + + rc = dpp_reg_write(dev, + ETM_SHAP_SHAP_BUCKET_MAP_TBLr, + 0, + id, + &tm_shape_map_tbl_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; + +} + +/***********************************************************/ +/** 获取流或调度器映射到整形参数表的配置ID +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param id 流或调度器编号ETM:0-ABFF,FTM:0-177F +* @param profile_id 整形参数表:[0-127] +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_tm_shape_map_table_get(DPP_DEV_T *dev, + ZXIC_UINT32 id, + ZXIC_UINT32 *profile_id) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_SHAP_SHAP_BUCKET_MAP_TBL_T tm_shape_map_tbl_t = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), profile_id); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), id, 0, DPP_ETM_SCH_DEL_NUM); + + rc = dpp_reg_read(dev, + ETM_SHAP_SHAP_BUCKET_MAP_TBLr, + 0, + id, + &tm_shape_map_tbl_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + *profile_id = tm_shape_map_tbl_t.shap_map; + + return DPP_OK; + +} + +/***********************************************************/ +/** 根据流或调度器id查找对应配置表中的模板id + 找到直接进行整形配置并返回1;未找到返回0 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param id 流或调度器编号 ETM:0-ABFF,FTM:0-AFF +* @param cir cir速率,单位Kb,范围[64Kb - 160Gb] +* @param cbs cbs桶深,单位KB,范围[1KB - 64M] +* @return 找到:1,未找到:0 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_tm_shape_find_map_id(DPP_DEV_T *dev, + ZXIC_UINT32 id, + ZXIC_UINT32 cir, + ZXIC_UINT32 cbs) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 table_id = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 2); + + + /* 根据id计算归属哪张表:每2K对应一个128项表 */ + table_id = id / 2048; + + for (i = 1; i < 128; i++) + { + if (g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][i].shape_cir == cir && + g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][i].shape_cbs == cbs) + { + rc = dpp_tm_shape_map_table_set(dev, id, i); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_shape_map_table_set"); + g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][i].shape_num++; + + return 1; + } + + } + + return 0; + +} + +/***********************************************************/ +/** 配置流级整形参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param flow_id 流队列号 ETM:0-9215,FTM:0-2047 +* @param cir cir速率,单位Kb,范围[64Kb - 160Gb] +* @param cbs cbs桶深,单位KB,范围[1KB - 64M] +* 注:cbs=0 表示关闭整形,即不限速 +* @param db_en 双桶整形使能,0-单桶,1-双桶 +* @param eir eir速率,单位Kb,范围同cir +* @param ebs ebs桶深,单位KB,范围同cbs +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_tm_shape_flow_para_set(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 cir, + ZXIC_UINT32 cbs, + ZXIC_UINT32 db_en, + ZXIC_UINT32 eir, + ZXIC_UINT32 ebs) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + + + rc = dpp_etm_shape_flow_para_set(dev, flow_id, cir, cbs, db_en, eir, ebs); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_etm_shape_flow_para_set"); + + return DPP_OK; + +} + +/***********************************************************/ +/** 获取流级整形参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param flow_id 流队列号 ETM:0-9215,FTM:0-2047 +* @param cir cir速率,单位Kb,范围[64Kb - 160Gb] +* @param cbs cbs桶深,单位KB,范围[1KB - 64M] +* 注:cbs=0 表示关闭整形,即不限速 +* @param mode_e 整形模式,0-获取c桶参数,1-获取对应e桶参数 +* @param p_para_id 整形模板索引:ETM=[0-AFF],FTM=[0-17F] +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_tm_shape_flow_para_get(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 mode, + ZXIC_UINT32 *p_para_id, + DPP_TM_SHAPE_PARA_TABLE *p_flow_para_tbl) +{ + + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 flow_id_e = 0; + ZXIC_UINT32 table_id = 0; + ZXIC_UINT32 profile_id = 0; + ZXIC_UINT32 bucket_para_n = 0; + ZXIC_UINT32 bucket_depth = 0; /* 实际写入寄存器的桶深,为多少个调节单位 */ + ZXIC_UINT32 bucket_rate = 0; /* 实际写入寄存器的速率,为每4096周期添加的字节数 */ + ZXIC_UINT32 token_grain = 0; /* 令牌桶调节档位 */ + ZXIC_UINT32 token_grain_kb[8] = {128, 64, 32, 16, 8, 4, 2, 1}; /* 档位对应值 */ + DPP_ETM_SHAP_BKT_PARA_TBL_T shap_para_tbl_t = {0}; + + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), mode, 0, 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_para_id); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_flow_para_tbl); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), flow_id, 0, DPP_ETM_Q_NUM - 1); + + flow_id_e = flow_id + DPP_ETM_Q_NUM; + + table_id = flow_id / 2048; + + /*获取流的profile_id*/ + if (mode) + { + table_id = flow_id_e / 2048; + rc = dpp_tm_shape_map_table_get(dev, flow_id_e, &profile_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_shape_map_table_get"); + } + else + { + rc = dpp_tm_shape_map_table_get(dev, flow_id, &profile_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_shape_map_table_get"); + + } + + /*从寄存器读取流配置参数*/ + bucket_para_n = table_id * 128 + profile_id; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), bucket_para_n, 0, 0xAFF); + + rc = dpp_reg_read(dev, + ETM_SHAP_BKT_PARA_TBLr, + 0, + bucket_para_n, + &shap_para_tbl_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + bucket_depth = shap_para_tbl_t.bucket_depth; + bucket_rate = shap_para_tbl_t.bucket_rate; + + /*数据转换处理*/ + rc = dpp_tm_shape_token_grain_get(dev, &token_grain); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_shape_token_grain_get"); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), token_grain, 0, 7); + + *p_para_id = bucket_para_n; + p_flow_para_tbl->shape_cbs = bucket_depth * token_grain_kb[token_grain]; + p_flow_para_tbl->shape_cir = (ZXIC_UINT64)bucket_rate * DPP_TM_SYS_HZ * 8 / ((ZXIC_UINT64)4096 * DPP_TM_KILO_ULL * 64); + + return DPP_OK; + +} + +/***********************************************************/ +/** etm配置流级整形参数 +* @param dev_id 设备编号 +* @param flow_id 流队列号 ETM:0-9215,FTM:0-2047 +* @param cir cir速率,单位Kb,范围[20Kb - 160Gb] +* @param cbs cbs桶深,单位KB,范围[1KB - 64M] +* 注:cbs=0 表示关闭整形,即不限速 +* @param db_en 双桶整形使能,0-单桶,1-双桶 +* @param eir eir速率,单位Kb,范围同cir +* @param ebs ebs桶深,单位KB,范围同cbs +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_etm_shape_flow_para_set(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 cir, + ZXIC_UINT32 cbs, + ZXIC_UINT32 db_en, + ZXIC_UINT32 eir, + ZXIC_UINT32 ebs) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 table_id = 0; + ZXIC_UINT32 profile_id = 0; + ZXIC_UINT32 total_para_id = 0; + ZXIC_UINT32 get_profile_success_flag_c = 0; /* 当前已配置表中是否找到需要的整形模板 */ + ZXIC_UINT32 get_profile_success_flag_e = 0; /* 当前已配置表中是否找到需要的整形模板 */ + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 2); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), flow_id, 0, DPP_ETM_Q_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), cir, DPP_TM_SHAPE_CIR_MIN, DPP_TM_SHAPE_CIR_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), cbs, DPP_TM_SHAPE_CBS_MIN, DPP_TM_SHAPE_CBS_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), db_en, 0, 1); + + if (db_en) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), eir, DPP_TM_SHAPE_CIR_MIN, DPP_TM_SHAPE_CIR_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), ebs, DPP_TM_SHAPE_CBS_MIN, DPP_TM_SHAPE_CBS_MAX); + } + + rc = dpp_tm_global_var_mutex_init(); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_global_var_mutex_init"); + + rc = zxic_comm_mutex_lock(&g_dpp_tm_global_var_rw_mutex); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "zxic_comm_mutex_lock"); + + /**双桶开关配置**/ + rc = dpp_tm_shape_flow_db_en_set(dev, db_en, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_tm_shape_flow_db_en_set", &g_dpp_tm_global_var_rw_mutex); + + /******STEP1:先解除原profile_id映射******/ + /**处理c桶**/ + rc = dpp_tm_shape_map_table_get(dev, flow_id, &profile_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_tm_shape_map_table_get", &g_dpp_tm_global_var_rw_mutex); + + if (profile_id > 0 && (profile_id < DPP_TM_SHAP_MAP_ID_MAX)) + { + /***表示当前有配置整形: 根据id计算归属哪张表:每2K队列对应一个128项表***/ + table_id = flow_id / 2048; + + if (g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][profile_id].shape_num != 0) + { + g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][profile_id].shape_num--; + + if (0 == g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][profile_id].shape_num) + { + g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][profile_id].shape_cbs = 0; + g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][profile_id].shape_cir = 0; + } + } + } + + /**处理e桶**/ + rc = dpp_tm_shape_map_table_get(dev, (flow_id + DPP_ETM_Q_NUM), &profile_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_tm_shape_map_table_get", &g_dpp_tm_global_var_rw_mutex); + + if (profile_id > 0 && (profile_id < DPP_TM_SHAP_MAP_ID_MAX)) + { + /*表示当前有配置整形*/ + table_id = (flow_id + DPP_ETM_Q_NUM) / 2048; + + if (g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][profile_id].shape_num != 0) + { + g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][profile_id].shape_num--; + + if (0 == g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][profile_id].shape_num) + { + g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][profile_id].shape_cbs = 0; + g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][profile_id].shape_cir = 0; + } + } + } + + + /******STEP2:整形关闭的处理******/ + if (cbs == 0) + { + /*关闭c桶e桶整形,并返回函数*/ + rc = dpp_tm_shape_map_table_set(dev, (flow_id), 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_tm_shape_map_table_set", &g_dpp_tm_global_var_rw_mutex); + rc = dpp_tm_shape_map_table_set(dev, (flow_id + DPP_ETM_Q_NUM), 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_tm_shape_map_table_set", &g_dpp_tm_global_var_rw_mutex); + + rc = zxic_comm_mutex_unlock(&g_dpp_tm_global_var_rw_mutex); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "zxic_comm_mutex_unlock"); + return DPP_OK; + } + + if (ebs == 0 || db_en == 0) + { + /*关闭e桶整形*/ + rc = dpp_tm_shape_map_table_set(dev, (flow_id + DPP_ETM_Q_NUM), 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_tm_shape_map_table_set", &g_dpp_tm_global_var_rw_mutex); + get_profile_success_flag_e = 1; + + } + + + /******STEP3:整形配置处理,先在现有模板中查找******/ + /* 单桶整形 :c桶 */ + if (ebs == 0) + { + /* 此时只有cbs>0,仅开启c桶整形:先查找c桶整形profile配置 */ + rc = dpp_tm_shape_find_map_id(dev, flow_id, cir, cbs); + + if (rc) + { + get_profile_success_flag_c = 1; + } + else + { + get_profile_success_flag_c = 0; + } + } + /* 双桶整形 :c+e桶 */ + else + { + /* 此时cbs>0,ebs>0:先查找c桶整形profile配置 */ + rc = dpp_tm_shape_find_map_id(dev, flow_id, cir, cbs); + + if (rc) + { + get_profile_success_flag_c = 1; + } + else + { + get_profile_success_flag_c = 0; + } + + /* 查找e桶整形profile配置 */ + rc = dpp_tm_shape_find_map_id(dev, flow_id + DPP_ETM_Q_NUM, eir, ebs); + + if (rc ) + { + get_profile_success_flag_e = 1; + } + else + { + get_profile_success_flag_e = 0; + } + + } + + /******STEP4:现有整形模板中未找到所需profile******/ + if (!get_profile_success_flag_c) + { + /* 根据id计算归属哪张表:每2K对应一个128项表 */ + table_id = flow_id / 2048; + + for (i = 1; i < 128; i++) + { + if (g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][i].shape_num == 0) + { + + /**********映射模板id********/ + rc = dpp_tm_shape_map_table_set(dev, flow_id, i); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_tm_shape_map_table_set", &g_dpp_tm_global_var_rw_mutex); + + /*********整形参数配置********/ + total_para_id = table_id * 128 + i; + rc = dpp_tm_shape_para_set(dev, total_para_id, cir, cbs); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_tm_shape_para_set", &g_dpp_tm_global_var_rw_mutex); + + /********同步更新全局数组******/ + g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][i].shape_cir = cir; + g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][i].shape_cbs = cbs; + g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][i].shape_num++; + + get_profile_success_flag_c = 1; + break; + } + + } + } + + if (!get_profile_success_flag_e && ebs) + { + /* 根据id计算归属哪张表:每2K对应一个128项表 */ + table_id = (flow_id + DPP_ETM_Q_NUM) / 2048; + + for (i = 1; i < 128; i++) + { + if (g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][i].shape_num == 0) + { + + /**********映射模板id********/ + rc = dpp_tm_shape_map_table_set(dev, (flow_id + DPP_ETM_Q_NUM), i); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_tm_shape_map_table_set", &g_dpp_tm_global_var_rw_mutex); + + /*********整形参数配置********/ + total_para_id = table_id * 128 + i; + rc = dpp_tm_shape_para_set(dev, total_para_id, eir, ebs); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_tm_shape_para_set", &g_dpp_tm_global_var_rw_mutex); + + /********同步更新全局数组******/ + g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][i].shape_cir = eir; + g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][i].shape_cbs = ebs; + g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][i].shape_num++; + + get_profile_success_flag_e = 1; + break; + } + + } + } + + + if (!get_profile_success_flag_c || !get_profile_success_flag_e) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "Failure! Profile resource are FULL!\n"); + rc = zxic_comm_mutex_unlock(&g_dpp_tm_global_var_rw_mutex); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "zxic_comm_mutex_unlock"); + + return DPP_ERR; + } + + rc = zxic_comm_mutex_unlock(&g_dpp_tm_global_var_rw_mutex); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "zxic_comm_mutex_unlock"); + + return DPP_OK; +} + + +/***********************************************************/ +/** tm配置调度器整形参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param se_id 调度器编号号,用户看到:ETM 0-0x63FF, FTM 0-0x77F +* 实际:ETM:0x4800-0xABFF,FTM:0x1000-0x177F +* @param pir pir总速率,单位Kb,范围同cir +* @param pbs pbs总桶深,单位KB,范围同cbs +* @param db_en 整形模式,0-单桶,1-双桶,仅FQ8/WFQ8有效 +* @param cir [0-3]调度器cir速率,单位Kb,范围[64Kb - 160Gb] +* @param cbs [0-3]调度器cbs桶深,单位KB,范围[1KB - 64M] +* 注:cbs=0 表示关闭整形,即不限速 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_tm_shape_se_para_set(DPP_DEV_T *dev, + ZXIC_UINT32 se_id, + ZXIC_UINT32 pir, + ZXIC_UINT32 pbs, + ZXIC_UINT32 db_en, + ZXIC_UINT32 cir, + ZXIC_UINT32 cbs) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + + rc = dpp_etm_shape_se_para_set(dev, se_id, pir, pbs, db_en, cir, cbs); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_etm_shape_se_para_set"); + + + return DPP_OK; + +} + +/***********************************************************/ +/** 获取调度单元整形参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param se_id 调度器单元号 ETM:0-63FF,FTM:0-77F +* @param cir cir速率,单位Kb,范围[64Kb - 160Gb] +* @param cbs cbs桶深,单位KB,范围[1KB - 64M] +* 注:cbs=0 表示关闭整形,即不限速 +* @param mode 整形模式,0-获取p桶参数,1-获取对应c桶参数(仅FQ8/WFQ8支持) +* @param p_para_id 整形模板索引:ETM=[0-AFF],FTM=[0-17F] +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_tm_shape_se_para_get(DPP_DEV_T *dev, + ZXIC_UINT32 se_id, + ZXIC_UINT32 mode, + ZXIC_UINT32 *p_para_id, + DPP_TM_SHAPE_PARA_TABLE *p_se_para_tbl) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 real_se_id = 0; + ZXIC_UINT32 se_id_c = 0; + ZXIC_UINT32 table_id = 0; + ZXIC_UINT32 profile_id = 0; + ZXIC_UINT32 bucket_para_n = 0; + ZXIC_UINT32 bucket_depth = 0; /* 实际写入寄存器的桶深,为多少个调节单位 */ + ZXIC_UINT32 bucket_rate = 0; /* 实际写入寄存器的速率,为每4096周期添加的字节数 */ + ZXIC_UINT32 token_grain = 0; /* 令牌桶调节档位 */ + ZXIC_UINT32 token_grain_kb[8] = {128, 64, 32, 16, 8, 4, 2, 1}; /* 档位对应值 */ + DPP_ETM_SHAP_BKT_PARA_TBL_T shap_para_tbl_t = {0}; + + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), mode, 0, 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_para_id); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_se_para_tbl); + + real_se_id = (se_id + DPP_ETM_SHAP_SEID_BASE); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), real_se_id, 0, DPP_ETM_SCH_DEL_NUM); + + + se_id_c = real_se_id + 4; + + table_id = real_se_id / 2048; + + /*获取调度器的profile_id*/ + if (mode) + { + rc = dpp_tm_shape_map_table_get(dev, se_id_c, &profile_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_shape_map_table_get"); + } + else + { + rc = dpp_tm_shape_map_table_get(dev, real_se_id, &profile_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_shape_map_table_get"); + + } + + + /*从寄存器读取调度器配置参数*/ + bucket_para_n = table_id * 128 + profile_id; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), bucket_para_n, 0, 0xAFF); + + rc = dpp_reg_read(dev, + ETM_SHAP_BKT_PARA_TBLr, + 0, + bucket_para_n, + &shap_para_tbl_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + bucket_depth = shap_para_tbl_t.bucket_depth; + bucket_rate = shap_para_tbl_t.bucket_rate; + + /*数据转换处理*/ + rc = dpp_tm_shape_token_grain_get(dev, &token_grain); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_shape_token_grain_get"); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), token_grain, 0, 7); + + *p_para_id = bucket_para_n; + p_se_para_tbl->shape_cbs = bucket_depth * token_grain_kb[token_grain]; + p_se_para_tbl->shape_cir = (ZXIC_UINT64)bucket_rate * DPP_TM_SYS_HZ * 8 / ((ZXIC_UINT64)4096 * DPP_TM_KILO_ULL * 64); + + return DPP_OK; + +} + + + + +/***********************************************************/ +/** etm配置调度器整形参数 +* @param dev_id 设备编号 +* @param se_id 调度器编号号 ETM 0-0x63FF, FTM 0-0x77F +* 实际:ETM:0x4800-0xABFF,FTM:0x1000-0x177F +* @param pir pir总速率,单位Kb,范围同cir +* @param pbs pbs总桶深,单位Kb,范围同cbs +* @param db_en 整形模式,0-单桶,1-双桶,仅FQ8/WFQ8有效 +* @param cir [0-3]调度器cir速率,单位Kb,范围[64Kb - 160Gb] +* @param cbs [0-3]调度器cbs桶深,单位KB,范围[1KB - 64M] +* 注:cbs=0 表示关闭整形,即不限速 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_etm_shape_se_para_set(DPP_DEV_T *dev, + ZXIC_UINT32 se_id, + ZXIC_UINT32 pir, + ZXIC_UINT32 pbs, + ZXIC_UINT32 db_en, + ZXIC_UINT32 cir, + ZXIC_UINT32 cbs) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 real_se_id = 0; + ZXIC_UINT32 sch_type = 0; + ZXIC_UINT32 sch_type_num = 0; + ZXIC_UINT32 table_id = 0; + ZXIC_UINT32 profile_id = 0; + ZXIC_UINT32 total_para_id = 0; + ZXIC_UINT32 get_profile_success_flag_p = 0; /* 当前已配置表中是否找到需要的p桶整形模板 */ + ZXIC_UINT32 get_profile_success_flag_c = 0; /* 当前已配置表中是否找到需要的c桶整形模板 */ + DPP_ETM_CRDT_SE_PARA_TBL_T crdt_se_para_tabl_t = {0}; /*配置cp双桶模式,仅FQ8/WFQ8使用*/ + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 2); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), se_id, 0, DPP_ETM_FQSPWFQ_NUM-1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), pir, DPP_TM_SHAPE_CIR_MIN, DPP_TM_SHAPE_CIR_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), pbs, DPP_TM_SHAPE_CBS_MIN, DPP_TM_SHAPE_CBS_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), db_en, 0, 1); + + real_se_id = (se_id + DPP_ETM_SHAP_SEID_BASE); + + if (db_en) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), cir, DPP_TM_SHAPE_CIR_MIN, DPP_TM_SHAPE_CIR_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), cbs, DPP_TM_SHAPE_CBS_MIN, DPP_TM_SHAPE_CBS_MAX); + } + + rc = dpp_tm_global_var_mutex_init(); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_global_var_mutex_init"); + + rc = zxic_comm_mutex_lock(&g_dpp_tm_global_var_rw_mutex); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "zxic_comm_mutex_lock"); + + + rc = dpp_tm_crdt_sch_type_get(dev, se_id, &sch_type, &sch_type_num); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_tm_crdt_sch_type_get", &g_dpp_tm_global_var_rw_mutex); + + /**双桶模式配置:crdt模块se_id不用转换**/ + if (sch_type == 8) + { + + for (i = 0; i < 8; i++) + { + rc = dpp_reg_read(dev, + ETM_CRDT_SE_PARA_TBLr, + 0, + se_id + i, + &crdt_se_para_tabl_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_reg_read", &g_dpp_tm_global_var_rw_mutex); + + crdt_se_para_tabl_t.cp_token_en = db_en; + + rc = dpp_reg_write(dev, + ETM_CRDT_SE_PARA_TBLr, + 0, + se_id + i, + &crdt_se_para_tabl_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_reg_write", &g_dpp_tm_global_var_rw_mutex); + } + + } + + /******STEP1:先解除原profile_id映射******/ + /**处理p桶**/ + rc = dpp_tm_shape_map_table_get(dev, real_se_id, &profile_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_tm_shape_map_table_get", &g_dpp_tm_global_var_rw_mutex); + + if (profile_id > 0 && (profile_id < DPP_TM_SHAP_MAP_ID_MAX)) + { + /***表示当前有配置整形: 根据id计算归属哪张表:每2K队列对应一个128项表***/ + table_id = real_se_id / 2048; + + if (g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][profile_id].shape_num != 0) + { + g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][profile_id].shape_num--; + } + } + + if (sch_type == 8) + { + /**处理c桶**/ + rc = dpp_tm_shape_map_table_get(dev, (real_se_id + 4), &profile_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_tm_shape_map_table_get", &g_dpp_tm_global_var_rw_mutex); + + if (profile_id > 0 && (profile_id < DPP_TM_SHAP_MAP_ID_MAX)) + { + /*表示当前有配置整形*/ + table_id = (real_se_id + 4) / 2048; + + if (g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][profile_id].shape_num != 0) + { + g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][profile_id].shape_num--; + } + } + } + + + + /******STEP2:整形关闭的处理******/ + if (sch_type < 8) + { + /**非FQ8/WFQ8类型调度器:无双桶模式**/ + if (pbs == 0 ) + { + /*关闭p桶整形,并返回函数*/ + rc = dpp_tm_shape_map_table_set(dev, (real_se_id), 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_tm_shape_map_table_set", &g_dpp_tm_global_var_rw_mutex); + + rc = zxic_comm_mutex_unlock(&g_dpp_tm_global_var_rw_mutex); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "zxic_comm_mutex_unlock"); + + return DPP_OK; + } + } + else + { + /**FQ8/WFQ8类型调度器:考虑双桶**/ + if (pbs == 0 && db_en == 0) + { + /*单桶模式:关闭p桶整形,并返回函数*/ + rc = dpp_tm_shape_map_table_set(dev, (real_se_id), 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_tm_shape_map_table_set", &g_dpp_tm_global_var_rw_mutex); + + rc = zxic_comm_mutex_unlock(&g_dpp_tm_global_var_rw_mutex); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "zxic_comm_mutex_unlock"); + + return DPP_OK; + } + + if (pbs == 0 && db_en == 1 && cbs == 0) + { + /*双桶模式:关闭p+c桶整形,并返回函数*/ + rc = dpp_tm_shape_map_table_set(dev, (real_se_id), 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_tm_shape_map_table_set", &g_dpp_tm_global_var_rw_mutex); + rc = dpp_tm_shape_map_table_set(dev, (real_se_id + 4), 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_tm_shape_map_table_set", &g_dpp_tm_global_var_rw_mutex); + + rc = zxic_comm_mutex_unlock(&g_dpp_tm_global_var_rw_mutex); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "zxic_comm_mutex_unlock"); + + return DPP_OK; + } + + } + + + /******STEP3:整形配置处理,先在现有模板中查找******/ + /* 非FQ8/WFQ8类型:仅处理p桶,c桶flag直接至1 */ + if (sch_type < 8) + { + /* 查找p桶整形profile配置 */ + rc = dpp_tm_shape_find_map_id(dev, real_se_id, pir, pbs); + + if (rc) + { + get_profile_success_flag_p = 1; + } + else + { + get_profile_success_flag_p = 0; + } + + get_profile_success_flag_c = 1; + } + else + { + /* FQ8/WFQ8类型:p+c桶 */ + if (db_en == 0) + { + /* 单桶模式:仅查找p桶整形profile配置 */ + rc = dpp_tm_shape_find_map_id(dev, real_se_id, pir, pbs); + + if (rc) + { + get_profile_success_flag_p = 1; + } + else + { + get_profile_success_flag_p = 0; + } + + get_profile_success_flag_c = 1; + } + else + { + + /* 双桶模式:先查找p桶整形profile配置 */ + if (pbs == 0) + { + rc = dpp_tm_shape_map_table_set(dev, real_se_id, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_tm_shape_map_table_set", &g_dpp_tm_global_var_rw_mutex); + + get_profile_success_flag_p = 1; + } + else + { + rc = dpp_tm_shape_find_map_id(dev, real_se_id, pir, pbs); + + if (rc) + { + get_profile_success_flag_p = 1; + } + else + { + get_profile_success_flag_p = 0; + } + } + + + /* 查找c桶整形profile配置 */ + if (cbs == 0) + { + rc = dpp_tm_shape_map_table_set(dev, (real_se_id + 4), 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_tm_shape_map_table_set", &g_dpp_tm_global_var_rw_mutex); + + get_profile_success_flag_c = 1; + } + else + { + rc = dpp_tm_shape_find_map_id(dev, (real_se_id + 4), cir, cbs); + + if (rc ) + { + get_profile_success_flag_c = 1; + } + else + { + get_profile_success_flag_c = 0; + } + + } + + + } + + + } + + + /******STEP4:现有整形模板中未找到所需profile******/ + if (!get_profile_success_flag_p) + { + /* 根据id计算归属哪张表:每2K对应一个128项表 */ + table_id = real_se_id / 2048; + + for (i = 1; i < 128; i++) + { + if (g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][i].shape_num == 0) + { + + /**********映射模板id********/ + rc = dpp_tm_shape_map_table_set(dev, real_se_id, i); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_tm_shape_map_table_set", &g_dpp_tm_global_var_rw_mutex); + + /*********整形参数配置********/ + total_para_id = table_id * 128 + i; + rc = dpp_tm_shape_para_set(dev, total_para_id, pir, pbs); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_tm_shape_para_set", &g_dpp_tm_global_var_rw_mutex); + + /********同步更新全局数组******/ + g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][i].shape_cir = pir; + g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][i].shape_cbs = pbs; + g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][i].shape_num++; + + get_profile_success_flag_p = 1; + break; + } + + } + } + + if (!get_profile_success_flag_c) + { + /* 根据id计算归属哪张表:每2K对应一个128项表 */ + table_id = (real_se_id + 4) / 2048; + + for (i = 1; i < 128; i++) + { + if (g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][i].shape_num == 0) + { + + /**********映射模板id********/ + rc = dpp_tm_shape_map_table_set(dev, (real_se_id + 4), i); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_tm_shape_map_table_set", &g_dpp_tm_global_var_rw_mutex); + + /*********整形参数配置********/ + total_para_id = table_id * 128 + i; + rc = dpp_tm_shape_para_set(dev, total_para_id, cir, cbs); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(DEV_ID(dev), rc, "dpp_tm_shape_para_set", &g_dpp_tm_global_var_rw_mutex); + + /********同步更新全局数组******/ + g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][i].shape_cir = cir; + g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][i].shape_cbs = cbs; + g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][i].shape_num++; + + get_profile_success_flag_c = 1; + break; + } + + } + } + + + if (!get_profile_success_flag_p || !get_profile_success_flag_c) + { + ZXIC_COMM_TRACE_DEV_ERROR(DEV_ID(dev), "Failure! Profile resource are FULL!\n"); + + rc = zxic_comm_mutex_unlock(&g_dpp_tm_global_var_rw_mutex); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "zxic_comm_mutex_unlock"); + return DPP_ERR; + } + + rc = zxic_comm_mutex_unlock(&g_dpp_tm_global_var_rw_mutex); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "zxic_comm_mutex_unlock"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 写入流/调度器整形参数配置表 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param total_para_id 整形参数表中模板索引id ETM:0-AFF,FTM:0-17F +* @param cir 整形速率(c/e桶统一) +* @param cbs 桶深 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_tm_shape_para_set(DPP_DEV_T *dev, + ZXIC_UINT32 total_para_id, + ZXIC_UINT32 cir, + ZXIC_UINT32 cbs) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 bucket_depth = 0; /* 实际写入寄存器的桶深,为多少个调节单位 */ + ZXIC_UINT32 bucket_rate = 0; /* 实际写入寄存器的速率,为每4096周期添加的字节数 */ + ZXIC_UINT32 token_grain = 0; /* 令牌桶调节档位 */ + ZXIC_UINT32 token_grain_kb[8] = {128, 64, 32, 16, 8, 4, 2, 1}; /* 档位对应值 */ + DPP_ETM_SHAP_BKT_PARA_TBL_T shap_para_tbl_t = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), cir, DPP_TM_SHAPE_CIR_MIN, DPP_TM_SHAPE_CIR_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), cbs, DPP_TM_SHAPE_CBS_MIN, DPP_TM_SHAPE_CBS_MAX); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), total_para_id, 0, 0xAFF); + + + /********* 数据转换处理:Begin ********/ + + rc = dpp_tm_shape_token_grain_get(dev, &token_grain); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_shape_token_grain_get"); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), token_grain, 0, 7); + + if (cbs < token_grain_kb[token_grain] && (cbs != 0)) + { + bucket_depth = 1; /* 最小为1个桶深调节单位 */ + } + else + { + bucket_depth = cbs / token_grain_kb[token_grain]; + } + + /* 寄存器最大可写范围为[0-2047] */ + if (bucket_depth > DPP_TM_SHAPE_CBS_REG_MAX) + { + bucket_depth = DPP_TM_SHAPE_CBS_REG_MAX; + } + + /* 平均每周期添加cir*1/64bit,即每4096周期添加的字节数 */ + //bucket_rate = (ZXIC_UINT64)4096 * cir * DPP_TM_KILO_ULL * 64 / (((ZXIC_UINT64)DPP_TM_SYS_HZ / (ZXIC_UINT64)13393) * 8); + bucket_rate = (ZXIC_UINT64)4096 * cir * DPP_TM_KILO_ULL * 64 / ((ZXIC_UINT64)DPP_TM_SYS_HZ * 8); + shap_para_tbl_t.bucket_rate = bucket_rate; + shap_para_tbl_t.bucket_depth = bucket_depth; + + /******** 数据转换处理:End *********/ + + rc = dpp_reg_write(dev, + ETM_SHAP_BKT_PARA_TBLr, + 0, + total_para_id, + &shap_para_tbl_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + return DPP_OK; + +} + + +/***********************************************************/ +/** 读取流/调度器整形参数配置表 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param total_para_id 整形参数表中模板索引id ETM:0-AFF,FTM:0-17F +* @param cir 整形速率(c/e桶统一) +* @param cbs 桶深 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/03/11 +************************************************************/ +DPP_STATUS dpp_tm_shape_para_get(DPP_DEV_T *dev, + ZXIC_UINT32 total_para_id, + DPP_TM_SHAPE_PARA_TABLE *p_shap_para_tbl) +{ + + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 token_grain = 0; /* 令牌桶调节档位 */ + ZXIC_UINT32 token_grain_kb[8] = {128, 64, 32, 16, 8, 4, 2, 1}; /* 档位对应值 */ + DPP_ETM_SHAP_BKT_PARA_TBL_T shap_para_tbl_t = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_shap_para_tbl); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), total_para_id, 0, 0xAFF); + + + /*读取配置*/ + rc = dpp_reg_read(dev, + ETM_SHAP_BKT_PARA_TBLr, + 0, + total_para_id, + &shap_para_tbl_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + /********* 数据转换处理: ********/ + rc = dpp_tm_shape_token_grain_get(dev, &token_grain); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_shape_token_grain_get"); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), token_grain, 0, 7); + + p_shap_para_tbl->shape_cbs = shap_para_tbl_t.bucket_depth * token_grain_kb[token_grain]; + p_shap_para_tbl->shape_cir = (ZXIC_UINT64)shap_para_tbl_t.bucket_rate * DPP_TM_SYS_HZ * 8 / ((ZXIC_UINT64)4096 * DPP_TM_KILO_ULL * 64); + + return DPP_OK; + +} + + +/***********************************************************/ +/** 配置端口级整形参数 更改整形转换公式 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param port_id 端口号 +* @param p_para 整形信息:CIR/CBS/EN +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/04/15 +************************************************************/ +DPP_STATUS dpp_tm_shape_pp_para_set(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + const DPP_TM_SHAPE_PP_PARA_T *p_para) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 cir = 0;/* 颗粒度的倍数 */ + ZXIC_UINT32 cbs = 0;/* Credit的倍数 */ + ZXIC_UINT32 qmu_credit_value = 0; + //ZXIC_FLOAT DPP_TM_SHAPE_CIR_STEP_TEST = 160.069565217 * 1000 * 1000 * 1000 / 0x3FFFFFE;/*测试使用 by xuhb*/ + + DPP_ETM_CRDT_PP_WEIGHT_RAM_T pp_weight = {0}; + DPP_ETM_CRDT_PP_CBS_SHAPE_EN_RAM_T pp_cbs_shape_en = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_para); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), port_id, 0, DPP_TM_PP_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), p_para->c_en, 0, 1); + + if (p_para->c_en == 0) + { + rc = dpp_reg_read(dev, + ETM_CRDT_PP_CBS_SHAPE_EN_RAMr, + 0, + port_id, + &pp_cbs_shape_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + pp_cbs_shape_en.pp_c_shap_en = p_para->c_en; + rc = dpp_reg_write(dev, + ETM_CRDT_PP_CBS_SHAPE_EN_RAMr, + 0, + port_id, + &pp_cbs_shape_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + } + else + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), p_para->cir, DPP_TM_SHAPE_CIR_MIN, DPP_TM_SHAPE_CIR_MAX); + + /* 读取授权价值 */ + rc = dpp_tm_qmu_credit_value_get(dev, &qmu_credit_value); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_qmu_credit_value_get"); + + cir = p_para->cir; + //cir = (ZXIC_UINT32)(((ZXIC_UINT64)cir * DPP_TM_KILO_ULL) / DPP_TM_SHAPE_CIR_STEP)*(crdt_credit_value / qmu_credit_value); + cir = (ZXIC_UINT32)(((ZXIC_UINT64)cir * DPP_TM_KILO_ULL) / DPP_TM_SHAPE_CIR_STEP); + + + + /* 解决160Gbps设置出错的问题add by cuiy at 2016-4-15 */ + if (cir > 0x3FFFFFE) + { + cir = 0x3FFFFFE; + } + + /* 检查以kbyte为单位的CBS */ + if (qmu_credit_value != 0) + { + cbs = p_para->cbs; + cbs = cbs * DPP_TM_KILO_UL / qmu_credit_value; + } + + /* 寄存器写入CBS的最小值为20,小于该值时,整形不准 */ + if (cbs < DPP_TM_SHAPE_DEFAULT_CBS) + { + cbs = DPP_TM_SHAPE_DEFAULT_CBS; + } + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), cbs, DPP_TM_SHAPE_DEFAULT_CBS, 0x1ffff); + + pp_cbs_shape_en.pp_cbs = cbs; + pp_weight.pp_c_weight = cir; + pp_cbs_shape_en.pp_c_shap_en = p_para->c_en; + + rc = dpp_reg_write(dev, + ETM_CRDT_PP_WEIGHT_RAMr, + 0, + port_id, + &pp_weight); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev, + ETM_CRDT_PP_CBS_SHAPE_EN_RAMr, + 0, + port_id, + &pp_cbs_shape_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_write"); + } + + return DPP_OK; +} + + +/***********************************************************/ +/** 读取端口级整形参数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param port_id 端口号 +* @param p_para 整形信息:CIR/CBS/EN +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/04/15 +************************************************************/ +DPP_STATUS dpp_tm_shape_pp_para_get(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + DPP_TM_SHAPE_PP_PARA_T *p_para) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 cbs = 0;/* Credit的倍数 */ + ZXIC_UINT32 cir = 0;/* 颗粒度的倍数 */ + ZXIC_UINT32 qmu_credit_value = 0; + + DPP_ETM_CRDT_PP_WEIGHT_RAM_T pp_weight = {0}; + DPP_ETM_CRDT_PP_CBS_SHAPE_EN_RAM_T pp_cbs_shape_en = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_para); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), port_id, 0, DPP_TM_PP_NUM - 1); + + /* 读取授权价值 */ + rc = dpp_tm_qmu_credit_value_get(dev, &qmu_credit_value); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_qmu_credit_value_get"); + + rc = dpp_reg_read(dev, + ETM_CRDT_PP_WEIGHT_RAMr, + 0, + port_id, + &pp_weight); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev, + ETM_CRDT_PP_CBS_SHAPE_EN_RAMr, + 0, + port_id, + &pp_cbs_shape_en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_reg_read"); + + cbs = pp_cbs_shape_en.pp_cbs; + cir = pp_weight.pp_c_weight; + p_para->c_en = pp_cbs_shape_en.pp_c_shap_en; + p_para->cir = (ZXIC_UINT32)((ZXIC_UINT64)cir * DPP_TM_SHAPE_CIR_STEP / DPP_TM_KILO_ULL) ; + p_para->cbs = (cbs * qmu_credit_value / DPP_TM_KILO_UL); + + return DPP_OK; + +} + +/***********************************************************/ +/** 写入端口级整形信息 +* @param tm_type 0-ETM,1-FTM +* @param port_id 端口号0-63 +* @param cir 单位Kb +* @param cbs 单位KB +* @param c_en c桶使能 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/03 +************************************************************/ +DPP_STATUS dpp_tm_shape_pp_para_wr(DPP_DEV_T *dev, + ZXIC_UINT32 port_id, + ZXIC_UINT32 cir, + ZXIC_UINT32 cbs, + ZXIC_UINT32 c_en) +{ + DPP_STATUS rc = DPP_OK; + DPP_TM_SHAPE_PP_PARA_T para = {0}; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), port_id, 0, DPP_TM_PP_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), c_en, 0, 1); + + para.cir = cir; + para.cbs = cbs; + para.c_en = c_en; + + rc = dpp_tm_shape_pp_para_set(dev, port_id, ¶); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_shape_pp_para_set"); + + return DPP_OK; +} + +#if 0 +/***********************************************************/ +/** 配置第0~15个被统计得到令牌个数的端口号 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param port_id 被统计得到令牌个数的端口号 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/3/15 STM模式下使用 +************************************************************/ +DPP_STATUS dpp_tm_shape_token_pp_cfg(ZXIC_UINT32 dev_id, + ZXIC_UINT32 port_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 tmp_port = 0; + ZXIC_UINT32 i = 0; + DPP_ETM_CRDT_Q_TOKEN_STAUE_CFG_T crdt_q_token_staue_cfg = {0}; + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, port_id, 0, 63); + + tmp_port = port_id; + + if (tmp_port > 48) + { + tmp_port = 48; + } + + for (i = 0; i < 16; i++) + { + crdt_q_token_staue_cfg.test_token_q_id = tmp_port + i; + rc = dpp_reg_write(dev_id, + ETM_CRDT_Q_TOKEN_STAUE_CFGr, + 0, + i, + &crdt_q_token_staue_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + + return DPP_OK; +} + + +/***********************************************************/ +/** 打印被指定统计的第0~15个端口消耗的令牌个数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM + +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 统计时间为2s,其中c桶统计1s,e桶统计1s +* @see +* @author whuashan @date 2019/03/15 +************************************************************/ +DPP_STATUS dpp_tm_shape_token_dec_cnt_diag(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 dec_num[16] = {0}; + ZXIC_UINT32 credit_value = 0; + ZXIC_UINT32 port_num = 0; + ZXIC_FLOAT traffic_amplified = 0.0; + ZXIC_UINT32 shape_token_cycle_reg_index = 0; + ZXIC_UINT32 shape_q_token_sta_cfg_reg_index = 0; + ZXIC_UINT32 shape_test_token_calc_ctrl_reg_index = 0; + ZXIC_UINT32 shape_q_token_dec_cnt_reg_index = 0; + + DPP_TM_WORK_MODE_E sa_work_mode = 0; + DPP_TM_CNT_MODE_T que_get_mode = {0}; + DPP_ETM_CRDT_TEST_TOKEN_CALC_CTRL_T shap_test_token_calc_ctrl = {0}; + DPP_ETM_CRDT_TEST_TOKEN_SAMPLE_CYCLE_NUM_T test_token_sample_cycle_num = {0}; + DPP_ETM_CRDT_Q_TOKEN_STAUE_CFG_T q_token_staue_cfg = {0}; + DPP_ETM_CRDT_Q_TOKEN_DEC_CNT_T q_token_dec_cnt = {0}; + + + shape_token_cycle_reg_index = ETM_CRDT_TEST_TOKEN_SAMPLE_CYCLE_NUMr; + shape_q_token_sta_cfg_reg_index = ETM_CRDT_Q_TOKEN_STAUE_CFGr; + shape_test_token_calc_ctrl_reg_index = ETM_CRDT_TEST_TOKEN_CALC_CTRLr; + shape_q_token_dec_cnt_reg_index = ETM_CRDT_Q_TOKEN_DEC_CNTr; + + + /* 配置寄存器为读清模式 */ + rc = dpp_tm_cfgmt_cnt_mode_get(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_get"); + que_get_mode.count_rd_mode = 1; + + rc = dpp_tm_cfgmt_cnt_mode_set(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_set"); + + /* 获取端口号 */ + rc = dpp_reg_read(dev_id, + shape_q_token_sta_cfg_reg_index, + 0, + 0, + &q_token_staue_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + port_num = q_token_staue_cfg.test_token_q_id; + + /* 配置统计的时间,单位是令牌下发周期,令牌下发频率为600M/32 */ + test_token_sample_cycle_num.sample_cycle_num = 18750000; + rc = dpp_reg_write(dev_id, + shape_token_cycle_reg_index, + 0, + 0, + &test_token_sample_cycle_num); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + + /* 启动统计功能 */ + shap_test_token_calc_ctrl.test_token_calc_trigger = 1; + rc = dpp_reg_write(dev_id, + shape_test_token_calc_ctrl_reg_index, + 0, + 0, + &shap_test_token_calc_ctrl); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + /* 等待统计完成 */ + rc = dpp_reg_read(dev_id, + shape_test_token_calc_ctrl_reg_index, + 0, + 0, + &shap_test_token_calc_ctrl); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + while (!shap_test_token_calc_ctrl.test_token_calc_state) + { + rc = dpp_reg_read(dev_id, + shape_test_token_calc_ctrl_reg_index, + 0, + 0, + &shap_test_token_calc_ctrl); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + } + + /* 关闭统计功能 */ + shap_test_token_calc_ctrl.test_token_calc_trigger = 0; + rc = dpp_reg_write(dev_id, + shape_test_token_calc_ctrl_reg_index, + 0, + 0, + &shap_test_token_calc_ctrl); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + + /* 读取计数器的计数 */ + for (i = 0; i < 16; i++) + { + rc = dpp_reg_read(dev_id, + shape_q_token_dec_cnt_reg_index, + 0, + i, + &q_token_dec_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + dec_num[i] = q_token_dec_cnt.q_token_dec_counter; + + } + + + rc = dpp_tm_cfgmt_sa_work_mode_get(dev_id, &sa_work_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_sa_work_mode_get"); + + if (0 == sa_work_mode) + { + rc = dpp_tm_qmu_credit_value_get(dev_id, &credit_value); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_credit_value_get"); + } + else if (1 == sa_work_mode) + { + rc = dpp_tm_qmu_sa_credit_value_get(dev_id, 4, &credit_value); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_sa_credit_value_get"); + } + else + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "SA work mode error\n"); + return DPP_ERR; + } + + + /* 计算各级消耗令牌速率:cnt*8*credit_value/(2*cycle_num*32/600M) */ + traffic_amplified = (ZXIC_FLOAT)(credit_value) * (ZXIC_FLOAT)(8.0) / ( (ZXIC_FLOAT)(2.0) * (ZXIC_FLOAT)(18750000.0)); + + for (i = 0; i < 16; i++) + { + ZXIC_COMM_PRINT("pp_%d: traffic = %.6f.(M)\n", (port_num + i), (ZXIC_FLOAT)(dec_num[i]) * traffic_amplified); + } + + + /* 配置寄存器为不读清模式 */ + rc = dpp_tm_cfgmt_cnt_mode_get(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_get"); + + que_get_mode.count_rd_mode = 0; + rc = dpp_tm_cfgmt_cnt_mode_set(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_set"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 打印被指定统计的第0~15个端口接收的令牌个数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 统计时间为2s,其中c桶统计1s,e桶统计1s +* @see +* @author whuashan @date 2019/03/15 +************************************************************/ +DPP_STATUS dpp_tm_shape_token_dist_cnt_diag(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 dist_num[16] = {0}; + ZXIC_UINT32 credit_value = 0; + ZXIC_UINT32 port_num = 0; + ZXIC_FLOAT traffic_amplified = 0.0; + ZXIC_UINT32 shape_token_cycle_reg_index = 0; + ZXIC_UINT32 shape_q_token_sta_cfg_reg_index = 0; + ZXIC_UINT32 shape_test_token_calc_ctrl_reg_index = 0; + ZXIC_UINT32 shape_q_token_dist_cnt_reg_index = 0; + DPP_TM_WORK_MODE_E sa_work_mode = 0; + DPP_TM_CNT_MODE_T que_get_mode = {0}; + DPP_ETM_CRDT_TEST_TOKEN_CALC_CTRL_T shap_test_token_calc_ctrl = {0}; + DPP_ETM_CRDT_TEST_TOKEN_SAMPLE_CYCLE_NUM_T test_token_sample_cycle_num = {0}; + DPP_ETM_CRDT_Q_TOKEN_STAUE_CFG_T q_token_staue_cfg = {0}; + DPP_ETM_CRDT_Q_TOKEN_DIST_CNT_T q_token_dist_cnt = {0}; + + shape_token_cycle_reg_index = ETM_CRDT_TEST_TOKEN_SAMPLE_CYCLE_NUMr; + shape_q_token_sta_cfg_reg_index = ETM_CRDT_Q_TOKEN_STAUE_CFGr; + shape_test_token_calc_ctrl_reg_index = ETM_CRDT_TEST_TOKEN_CALC_CTRLr; + shape_q_token_dist_cnt_reg_index = ETM_CRDT_Q_TOKEN_DIST_CNTr; + + /* 配置寄存器为读清模式 */ + rc = dpp_tm_cfgmt_cnt_mode_get(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_get"); + que_get_mode.count_rd_mode = 1; + + rc = dpp_tm_cfgmt_cnt_mode_set(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_set"); + + /* 获取端口号 */ + rc = dpp_reg_read(dev_id, + shape_q_token_sta_cfg_reg_index, + 0, + 0, + &q_token_staue_cfg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + port_num = q_token_staue_cfg.test_token_q_id; + + /* 配置统计的时间,单位是令牌下发周期,令牌下发频率为600M/32 */ + test_token_sample_cycle_num.sample_cycle_num = 18750000; + rc = dpp_reg_write(dev_id, + shape_token_cycle_reg_index, + 0, + 0, + &test_token_sample_cycle_num); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + + /* 启动统计功能 */ + shap_test_token_calc_ctrl.test_token_calc_trigger = 1; + rc = dpp_reg_write(dev_id, + shape_test_token_calc_ctrl_reg_index, + 0, + 0, + &shap_test_token_calc_ctrl); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + /* 等待统计完成 */ + rc = dpp_reg_read(dev_id, + shape_test_token_calc_ctrl_reg_index, + 0, + 0, + &shap_test_token_calc_ctrl); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + while (!shap_test_token_calc_ctrl.test_token_calc_state) + { + rc = dpp_reg_read(dev_id, + shape_test_token_calc_ctrl_reg_index, + 0, + 0, + &shap_test_token_calc_ctrl); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + } + + /* 关闭统计功能 */ + shap_test_token_calc_ctrl.test_token_calc_trigger = 0; + rc = dpp_reg_write(dev_id, + shape_test_token_calc_ctrl_reg_index, + 0, + 0, + &shap_test_token_calc_ctrl); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + /* 读取c桶计数器的计数 */ + for (i = 0; i < 16; i++) + { + + rc = dpp_reg_read(dev_id, + shape_q_token_dist_cnt_reg_index, + 0, + i, + &q_token_dist_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + dist_num[i] = q_token_dist_cnt.q_token_dist_counter; + + } + + + rc = dpp_tm_qmu_credit_value_get(dev_id, &credit_value); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_credit_value_get"); + rc = dpp_tm_cfgmt_sa_work_mode_get(dev_id, &sa_work_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_sa_work_mode_get"); + + if (0 == sa_work_mode) + { + rc = dpp_tm_qmu_credit_value_get(dev_id, &credit_value); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_credit_value_get"); + } + else if (1 == sa_work_mode) + { + rc = dpp_tm_qmu_sa_credit_value_get(dev_id, 4, &credit_value); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_sa_credit_value_get"); + } + else + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "SA work mode error\n"); + return DPP_ERR; + } + + /* 计算各级消耗令牌速率:cnt*8*credit_value/(2*cycle_num*32/600M) */ + traffic_amplified = (ZXIC_FLOAT)(credit_value) * (ZXIC_FLOAT)(8.0) / ( (ZXIC_FLOAT)(2.0) * (ZXIC_FLOAT)(18750000.0)); + + for (i = 0; i < 16; i++) + { + ZXIC_COMM_PRINT("pp_%d: traffic = %.6f.(M)\n", (port_num + i), (ZXIC_FLOAT)(dist_num[i]) * traffic_amplified); + } + + + /* 配置寄存器为不读清模式 */ + rc = dpp_tm_cfgmt_cnt_mode_get(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_get"); + que_get_mode.count_rd_mode = 0; + rc = dpp_tm_cfgmt_cnt_mode_set(dev_id, &que_get_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_set"); + + return DPP_OK; +} + +/***********************************************************/ +/** 打印指定的全局数组值以及清空全局数组 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param para_x 数组index_x +* @param para_y 数组index_y +* @param clear_flag 清空shape全局数组 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark +* @see +* @author xuhb @date 2019/06/10 +************************************************************/ +DPP_STATUS dpp_tm_shape_para_array_prt(ZXIC_UINT32 dev_id, ZXIC_UINT32 para_x, ZXIC_UINT32 para_y, ZXIC_UINT32 clear_flag) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 2); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, para_x, 0, 21); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, para_y, 0, 127); + ZXIC_COMM_PRINT("cir(kb):%d cbs(KB):%d num:%d\n", g_dpp_etm_shape_para_table[dev_id][para_x][para_y].shape_cir, + g_dpp_etm_shape_para_table[dev_id][para_x][para_y].shape_cbs, + g_dpp_etm_shape_para_table[dev_id][para_x][para_y].shape_num); + + if (clear_flag) + { + rc = dpp_tm_clr_shape_para(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_clr_shape_para"); + } + + + return DPP_OK; +} + +#endif +/***********************************************************/ +/** 获取全局数组中用户实际配置的整形值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param flow_id 流队列号 ETM:0-9215,FTM:0-2047 +* @param cir cir速率,单位Kb,范围[64Kb - 160Gb] +* @param cbs cbs桶深,单位KB,范围[1KB - 64M] +* 注:cbs=0 表示关闭整形,即不限速 +* @param mode_e 整形模式,0-获取c桶参数,1-获取对应e桶参数 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark +* @see +* @author xuhb @date 2020/09/22 +************************************************************/ +DPP_STATUS dpp_tm_shape_flow_para_array_get(DPP_DEV_T *dev, + ZXIC_UINT32 flow_id, + ZXIC_UINT32 mode, + DPP_TM_SHAPE_PARA_TABLE *p_flow_para_tbl) +{ + + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 flow_id_e = 0; + ZXIC_UINT32 table_id = 0; + ZXIC_UINT32 profile_id = 0; + + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), mode, 0, 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_flow_para_tbl); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), flow_id, 0, DPP_ETM_Q_NUM - 1); + + flow_id_e = flow_id + DPP_ETM_Q_NUM; + + table_id = flow_id / 2048; + + /*获取流的profile_id*/ + if (mode) + { + table_id = flow_id_e / 2048; + rc = dpp_tm_shape_map_table_get(dev, flow_id_e, &profile_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_shape_map_table_get"); + } + else + { + rc = dpp_tm_shape_map_table_get(dev, flow_id, &profile_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_shape_map_table_get"); + + } + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), profile_id, 0, DPP_TM_SHAP_MAP_ID_MAX - 1); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), table_id, 0, DPP_ETM_SHAP_TABEL_ID_MAX - 1); + p_flow_para_tbl->shape_cbs = g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][profile_id].shape_cbs; + p_flow_para_tbl->shape_cir = g_dpp_etm_shape_para_table[DEV_PCIE_SLOT(dev)][table_id][profile_id].shape_cir; + + return DPP_OK; + +} + + + +#if 0 +/***********************************************************/ +/** 配置shap模块中 crd_grain授权价值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param credit_value 授权价值,默认值是0x5feByte +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/08/13 +************************************************************/ +DPP_STATUS dpp_tm_shap_crd_grain_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 credit_value) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_SHAP_CRD_GRAIN_T credit_val = {0}; + + credit_val.crd_grain = credit_value; + rc = dpp_reg_write(dev_id, + ETM_SHAP_CRD_GRAINr, + 0, + 0, + &credit_val); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +#endif +#endif + +#if ZXIC_REAL("TM_EXTEND_API") + +#if 0 +/***********************************************************/ +/** 打印队列空标志查询 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param qnum 配置的队列号 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author cy @date 2016/06/20 +************************************************************/ +DPP_STATUS dpp_tm_qlist_ept_flag_get_diag(ZXIC_UINT32 dev_id, ZXIC_UINT32 qnum) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 value = 0; + + rc = dpp_tm_qlist_ept_flag_get(dev_id, qnum, &value); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qlist_ept_flag_get"); + ZXIC_COMM_PRINT("qlist_ept_flag is %d\n", value); + + return DPP_OK; +} + + +/***********************************************************/ +/** 打印队列深度计数 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param qnum 配置的队列号 +* @param p_value 队列深度计数 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author cy @date 2016/06/20 +************************************************************/ +DPP_STATUS dpp_tm_qlist_r_bcnt_get_diag(ZXIC_UINT32 dev_id, ZXIC_UINT32 qnum) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 value = 0; + + rc = dpp_tm_qlist_r_bcnt_get(dev_id, qnum, &value); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qlist_r_bcnt_get"); + ZXIC_COMM_PRINT("qlist_r_bcnt is 0x%x\n", value); + + return DPP_OK; +} + +/***********************************************************/ +/** CMDSCH中分端口分优先级的BLOCK计数 +* @param dev_id 设备编号 +* @param pri +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author sun @date 2023/09/19 +************************************************************/ +DPP_STATUS dpp_tm_csch_r_block_cnt_get(ZXIC_UINT32 dev_id, + ZXIC_UINT32 pri, + ZXIC_UINT32 *p_value) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_CSCH_R_BLOCK_CNT_T csch_r_block_cnt = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_value); + + rc = dpp_reg_read(dev_id, + ETM_QMU_CSCH_R_BLOCK_CNTr, + 0, + pri, + &csch_r_block_cnt); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + *p_value = csch_r_block_cnt.csch_r_block_cnt; + + return DPP_OK; +} + +/***********************************************************/ +/** 打印CMDSCH中分端口分优先级的BLOCK计数 +* @param dev_id 设备编号 +* @param port +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author sun @date 2023/09/19 +************************************************************/ +DPP_STATUS dpp_tm_csch_r_block_cnt_diag(ZXIC_UINT32 dev_id, ZXIC_UINT32 port) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 pri = 0; + ZXIC_UINT32 pri_th = 0; + for(int i = 0; i < 8; ++i) + { + pri = port * 8 + i; + rc = dpp_tm_csch_r_block_cnt_get(dev_id, pri, &pri_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_csch_r_block_cnt_get"); + ZXIC_COMM_PRINT("csch_r_block_pri 0x%x value is 0x%x\n", pri, pri_th); + } + + return DPP_OK; +} + +/***********************************************************/ +/** 打印队列入链状态 +* @param dev_id 设备编号 +* @param flow_id +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author sun @date 2023/09/19 +************************************************************/ +DPP_STATUS dpp_tm_crdt_flow_link_state_get_diag(ZXIC_UINT32 dev_id, ZXIC_UINT32 flow_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 link_status = 0; + DPP_ETM_CRDT_FLOWQUE_INS_TBL_T crdt_flow_ins_tbl_t = {0}; + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, flow_id, 0, DPP_ETM_CRDT_NUM); + rc = dpp_tm_crdt_flow_link_state_get(dev_id, flow_id, &crdt_flow_ins_tbl_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_crdt_flow_link_state_get"); + + link_status = crdt_flow_ins_tbl_t.flowque_ins; + ZXIC_COMM_PRINT("flowque_ins_tbl flow 0x%x linkstatus is 0x%x\n", flow_id, link_status); + + return DPP_OK; +} + +/***********************************************************/ +/** 打印调度器入链状态 +* @param dev_id 设备编号 +* @param flow_id +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author sun @date 2023/09/19 +************************************************************/ +DPP_STATUS dpp_tm_crdt_se_link_state_get_diag(ZXIC_UINT32 dev_id, ZXIC_UINT32 se_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 link_status = 0; + DPP_ETM_CRDT_SE_INS_TBL_T crdt_se_ins_tbl_t = {0}; + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, se_id, 0, DPP_ETM_FQSPWFQ_NUM - 1); + rc = dpp_tm_crdt_se_link_state_get(dev_id, se_id, &crdt_se_ins_tbl_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_crdt_se_link_state_get"); + + link_status = crdt_se_ins_tbl_t.se_ins_flag; + ZXIC_COMM_PRINT("flowque_ins_tbl se_id 0x%x linkstatus is 0x%x\n", se_id, link_status); + + return DPP_OK; +} + +/***********************************************************/ +/** 打印olif的fifo是否空状态 +* @param dev_id 设备编号 +* @param +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author sun @date 2023/09/19 +************************************************************/ +DPP_STATUS dpp_tm_olif_fifo_empty_state_get_diag(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 qmu_para_fifo_empty = 0; + ZXIC_UINT32 emem_empty = 0; + ZXIC_UINT32 imem_empty = 0; + DPP_ETM_OLIF_OLIF_FIFO_EMPTY_STATE_T empty_status = {0}; + + rc = dpp_reg_read(dev_id, + ETM_OLIF_OLIF_FIFO_EMPTY_STATEr, + 0, + 0, + &empty_status); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + qmu_para_fifo_empty = empty_status.qmu_para_fifo_empty; + emem_empty = empty_status.emem_empty; + imem_empty = empty_status.imem_empty; + ZXIC_COMM_PRINT("qmu_para_fifo_empty 0x%x, emem_empty 0x%x, imem_empty 0x%x\n", qmu_para_fifo_empty, emem_empty, imem_empty); + + return DPP_OK; +} + +/***********************************************************/ +/** +* @param dev_id +* @param tm_type +* @param que_id +* +* @return +* @remark 无 +* @see +* @author XXX @date 2019/05/08 +************************************************************/ +DPP_STATUS dpp_tm_crdt_eir_crs_filter_en_get_diag(ZXIC_UINT32 dev_id, ZXIC_UINT32 que_id) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CRDT_EIR_CRS_FILTER_TBL_T eir_crs_filter = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, que_id, 0, DPP_ETM_Q_NUM - 1); + + rc = dpp_reg_read(dev_id, + ETM_CRDT_EIR_CRS_FILTER_TBLr, + 0, + que_id, + &eir_crs_filter); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + ZXIC_COMM_PRINT("Tm type:%d [0:ftm 1:etm] eir_crs_filter_en:%d [1:enable 0:disable]", eir_crs_filter.eir_crs_filter); + + return rc; +} + + + +/***********************************************************/ +/** 读取指定队列获得授权个数(只打印授权非零的队列号) +* @param dev_id 设备编号 +* @param ackflow_start 授权起始流号 +* @param ackflow_end 授权终止流号 +* @param sleep_time_ms 等待时间 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2017/01/19 +************************************************************/ +DPP_STATUS dpp_etm_crdt_traffic_diag(ZXIC_UINT32 dev_id, + ZXIC_UINT32 ackflow_start, + ZXIC_UINT32 ackflow_end, + ZXIC_UINT32 sleep_time_ms) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 index = 0; + ZXIC_UINT32 ackflow_id = 0; + ZXIC_UINT32 credit_value = 0; + ZXIC_FLOAT traffic_amplified = 0.0; + ZXIC_FLOAT flow_spec_traffic = 0.0; + + DPP_ETM_CRDT_STAT_QUE_CREDIT_T que_credit = {0}; + DPP_TM_WORK_MODE_E sa_work_mode = {0}; + DPP_ETM_CRDT_STAT_QUE_ID_0_T stat_que_id_0 = {0}; + + if (ackflow_start > DPP_ETM_Q_NUM - 1) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "ackflow_start is out of range!!!\n"); + return DPP_ERR; + } + + if (ackflow_end > DPP_ETM_Q_NUM - 1) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "ackflow_end is out of range!!!\n"); + return DPP_ERR; + } + + rc = dpp_tm_cfgmt_sa_work_mode_get(dev_id, &sa_work_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_sa_work_mode_get"); + + if (0 == sa_work_mode) + { + rc = dpp_tm_qmu_credit_value_get(dev_id, &credit_value); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_credit_value_get"); + } + else if (1 == sa_work_mode) + { + rc = dpp_tm_qmu_sa_credit_value_get(dev_id, 4, &credit_value); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_sa_credit_value_get"); + } + else + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "SA work mode error\n"); + return DPP_ERR; + } + + traffic_amplified = ((ZXIC_FLOAT)sleep_time_ms * (ZXIC_FLOAT)(1000000.0)) / ((ZXIC_FLOAT)(8.0) * (ZXIC_FLOAT)(credit_value)); + + for (ackflow_id = ackflow_start; ackflow_id <= ackflow_end; ackflow_id += 16) + { + /* 配置16条授权流 */ + for (index = 0; index < 16; index++) + { + + stat_que_id_0.stat_que_id_0 = ackflow_id + index; + rc = dpp_reg_write(dev_id, + ETM_CRDT_STAT_QUE_ID_0r + index, + 0, + 0, + &stat_que_id_0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + } + + /* 授权个数统计计数器清零 */ + rc = dpp_tm_crdt_clr_diag(0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_crdt_clr_diag"); + + zxic_comm_sleep(sleep_time_ms); + /* 不使能CRDT */ + rc = dpp_tm_crdt_credit_en_set(dev_id, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_crdt_credit_en_set"); + + for (index = 0; index < 16; index++) + { + + rc = dpp_reg_read(dev_id, + ETM_CRDT_STAT_QUE_ID_0r + index, + 0, + 0, + &stat_que_id_0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "DPP_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_CRDT_STAT_QUE_CREDITr, + 0, + index, + &que_credit); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "DPP_reg_read"); + + flow_spec_traffic = (ZXIC_FLOAT)(que_credit.stat_que_credit_cnt) / traffic_amplified; + + if (que_credit.stat_que_credit_cnt != 0) + { + ZXIC_COMM_PRINT("flow_0x%04x(%5d): ", (stat_que_id_0.stat_que_id_0), (stat_que_id_0.stat_que_id_0)); + ZXIC_COMM_PRINT("ack_cnt = 0x%08x, ", que_credit.stat_que_credit_cnt); + ZXIC_COMM_PRINT("traffic = %.6f.(G)\n", flow_spec_traffic); + } + } + } + + /* 使能CRDT */ + rc = dpp_tm_crdt_credit_en_set(dev_id, 1); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_crdt_credit_en_set"); + + return DPP_OK; +} + + + +/***********************************************************/ +/** 读取QMU所有队列的统计信息 +* @param dev_id 设备编号 +* @param p_para 获得的统计信息 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_qmu_stat_get(ZXIC_UINT32 dev_id, DPP_ETM_QMU_STAT_INFO_T *p_para) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_FC_CNT_MODE_T fc_cnt_mode_reg = {0}; + DPP_ETM_QMU_MMU_QMU_WR_FC_CNT_T mmu_qmu_wr_fc_cnt_reg = {0}; + DPP_ETM_QMU_MMU_QMU_RD_FC_CNT_T mmu_qmu_rd_fc_cnt_reg = {0}; + DPP_ETM_QMU_QMU_CGAVD_FC_CNT_T qmu_cgavd_fc_cnt_reg = {0}; + DPP_ETM_QMU_CGAVD_QMU_PKT_CNT_T cgavd_qmu_pkt_cnt_reg = {0}; + DPP_ETM_QMU_CGAVD_QMU_PKTLEN_ALL_T cgavd_qmu_pktlen_all_reg = {0}; + DPP_ETM_QMU_LAST_DROP_QNUM_GET_T last_drop_qnum_reg = {0}; + DPP_ETM_QMU_CRDT_QMU_CREDIT_CNT_T crdt_qmu_credit_cnt_reg = {0}; + DPP_ETM_QMU_QMU_TO_QSCH_REPORT_CNT_T qmu_to_qsch_report_cnt_reg = {0}; + DPP_ETM_QMU_QMU_TO_CGAVD_REPORT_CNT_T qmu_to_cgavd_report_cnt_reg = {0}; + DPP_ETM_QMU_QMU_CRDT_CRS_NORMAL_CNT_T qmu_crdt_crs_normal_cnt_reg = {0}; + DPP_ETM_QMU_QMU_CRDT_CRS_OFF_CNT_T qmu_crdt_crs_off_cnt_reg = {0}; + DPP_ETM_QMU_QSCH_QLIST_SHEDULE_CNT_T qsch_qlist_shedule_cnt_reg = {0}; + DPP_ETM_QMU_QSCH_QLIST_SCH_EPT_CNT_T qsch_qlist_sch_ept_cnt_reg = {0}; + DPP_ETM_QMU_QMU_TO_MMU_BLK_WR_CNT_T qmu_to_mmu_blk_wr_cnt_reg = {0}; + DPP_ETM_QMU_QMU_TO_CSW_BLK_RD_CNT_T qmu_to_csw_blk_rd_cnt_reg = {0}; + DPP_ETM_QMU_QMU_TO_MMU_SOP_WR_CNT_T qmu_to_mmu_sop_wr_cnt_reg = {0}; + DPP_ETM_QMU_QMU_TO_MMU_EOP_WR_CNT_T qmu_to_mmu_eop_wr_cnt_reg = {0}; + DPP_ETM_QMU_QMU_TO_MMU_DROP_WR_CNT_T qmu_to_mmu_drop_wr_cnt_reg = {0}; + DPP_ETM_QMU_QMU_TO_CSW_SOP_RD_CNT_T qmu_to_csw_sop_rd_cnt_reg = {0}; + DPP_ETM_QMU_QMU_TO_CSW_EOP_RD_CNT_T qmu_to_csw_eop_rd_cnt_reg = {0}; + DPP_ETM_QMU_QMU_TO_CSW_DROP_RD_CNT_T qmu_to_csw_drop_rd_cnt_reg = {0}; + DPP_ETM_QMU_MMU_TO_QMU_WR_RELEASE_CNT_T mmu_to_qmu_wr_release_cnt_reg = {0}; + DPP_ETM_QMU_MMU_TO_QMU_RD_RELEASE_CNT_T mmu_to_qmu_rd_release_cnt_reg = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_para); + + rc = dpp_reg_read(dev_id, + ETM_QMU_FC_CNT_MODEr, + 0, + 0, + &fc_cnt_mode_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_MMU_QMU_WR_FC_CNTr, + 0, + 0, + &mmu_qmu_wr_fc_cnt_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_MMU_QMU_RD_FC_CNTr, + 0, + 0, + &mmu_qmu_rd_fc_cnt_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_QMU_CGAVD_FC_CNTr, + 0, + 0, + &qmu_cgavd_fc_cnt_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_CGAVD_QMU_PKT_CNTr, + 0, + 0, + &cgavd_qmu_pkt_cnt_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_CGAVD_QMU_PKTLEN_ALLr, + 0, + 0, + &cgavd_qmu_pktlen_all_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_LAST_DROP_QNUM_GETr, + 0, + 0, + &last_drop_qnum_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_CRDT_QMU_CREDIT_CNTr, + 0, + 0, + &crdt_qmu_credit_cnt_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_QMU_TO_QSCH_REPORT_CNTr, + 0, + 0, + &qmu_to_qsch_report_cnt_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_QMU_TO_CGAVD_REPORT_CNTr, + 0, + 0, + &qmu_to_cgavd_report_cnt_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_QMU_CRDT_CRS_NORMAL_CNTr, + 0, + 0, + &qmu_crdt_crs_normal_cnt_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_QMU_CRDT_CRS_OFF_CNTr, + 0, + 0, + &qmu_crdt_crs_off_cnt_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_QSCH_QLIST_SHEDULE_CNTr, + 0, + 0, + &qsch_qlist_shedule_cnt_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_QSCH_QLIST_SCH_EPT_CNTr, + 0, + 0, + &qsch_qlist_sch_ept_cnt_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_QMU_TO_MMU_BLK_WR_CNTr, + 0, + 0, + &qmu_to_mmu_blk_wr_cnt_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_QMU_TO_CSW_BLK_RD_CNTr, + 0, + 0, + &qmu_to_csw_blk_rd_cnt_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_QMU_TO_MMU_SOP_WR_CNTr, + 0, + 0, + &qmu_to_mmu_sop_wr_cnt_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_QMU_TO_MMU_EOP_WR_CNTr, + 0, + 0, + &qmu_to_mmu_eop_wr_cnt_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_QMU_TO_MMU_DROP_WR_CNTr, + 0, + 0, + &qmu_to_mmu_drop_wr_cnt_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_QMU_TO_CSW_SOP_RD_CNTr, + 0, + 0, + &qmu_to_csw_sop_rd_cnt_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_QMU_TO_CSW_EOP_RD_CNTr, + 0, + 0, + &qmu_to_csw_eop_rd_cnt_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_QMU_TO_CSW_DROP_RD_CNTr, + 0, + 0, + &qmu_to_csw_drop_rd_cnt_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_MMU_TO_QMU_WR_RELEASE_CNTr, + 0, + 0, + &mmu_to_qmu_wr_release_cnt_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_MMU_TO_QMU_RD_RELEASE_CNTr, + 0, + 0, + &mmu_to_qmu_rd_release_cnt_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + p_para->fc_cnt_mode = fc_cnt_mode_reg.fc_cnt_mode; + p_para->mmu_qmu_wr_fc_cnt = mmu_qmu_wr_fc_cnt_reg.mmu_qmu_wr_fc_cnt; + p_para->mmu_qmu_rd_fc_cnt = mmu_qmu_rd_fc_cnt_reg.mmu_qmu_rd_fc_cnt; + p_para->qmu_cgavd_fc_cnt = qmu_cgavd_fc_cnt_reg.qmu_cgavd_fc_cnt; + p_para->cgavd_qmu_pkt_cnt = cgavd_qmu_pkt_cnt_reg.cgavd_qmu_pkt_cnt; + p_para->cgavd_qmu_pktlen_all = cgavd_qmu_pktlen_all_reg.cgavd_qmu_pktlen_all; + p_para->cgavd_qmu_drop_tap = last_drop_qnum_reg.cgavd_qmu_drop_tap; + p_para->last_drop_qnum = last_drop_qnum_reg.last_drop_qnum; + p_para->crdt_qmu_credit_cnt = crdt_qmu_credit_cnt_reg.crdt_qmu_credit_cnt; + p_para->qmu_to_qsch_report_cnt = qmu_to_qsch_report_cnt_reg.qmu_to_qsch_report_cnt; + p_para->qmu_to_cgavd_report_cnt = qmu_to_cgavd_report_cnt_reg.qmu_to_cgavd_report_cnt; + p_para->qmu_crdt_crs_normal_cnt = qmu_crdt_crs_normal_cnt_reg.qmu_crdt_crs_normal_cnt; + p_para->qmu_crdt_crs_off_cnt = qmu_crdt_crs_off_cnt_reg.qmu_crdt_crs_off_cnt; + p_para->qsch_qlist_shedule_cnt = qsch_qlist_shedule_cnt_reg.qsch_qlist_shedule_cnt; + p_para->qsch_qlist_sch_ept_cnt = qsch_qlist_sch_ept_cnt_reg.qsch_qlist_sch_ept_cnt; + p_para->qmu_to_mmu_blk_wr_cnt = qmu_to_mmu_blk_wr_cnt_reg.qmu_to_mmu_blk_wr_cnt; + p_para->qmu_to_csw_blk_rd_cnt = qmu_to_csw_blk_rd_cnt_reg.qmu_to_csw_blk_rd_cnt; + p_para->qmu_to_mmu_sop_wr_cnt = qmu_to_mmu_sop_wr_cnt_reg.qmu_to_mmu_sop_wr_cnt; + p_para->qmu_to_mmu_eop_wr_cnt = qmu_to_mmu_eop_wr_cnt_reg.qmu_to_mmu_eop_wr_cnt; + p_para->qmu_to_mmu_drop_wr_cnt = qmu_to_mmu_drop_wr_cnt_reg.qmu_to_mmu_drop_wr_cnt; + p_para->qmu_to_csw_sop_rd_cnt = qmu_to_csw_sop_rd_cnt_reg.qmu_to_csw_sop_rd_cnt; + p_para->qmu_to_csw_eop_rd_cnt = qmu_to_csw_eop_rd_cnt_reg.qmu_to_csw_eop_rd_cnt; + p_para->qmu_to_csw_drop_rd_cnt = qmu_to_csw_drop_rd_cnt_reg.qmu_to_csw_drop_rd_cnt; + p_para->mmu_to_qmu_wr_release_cnt = mmu_to_qmu_wr_release_cnt_reg.mmu_to_qmu_wr_release_cnt; + p_para->mmu_to_qmu_rd_release_cnt = mmu_to_qmu_rd_release_cnt_reg.mmu_to_qmu_rd_release_cnt; + + return DPP_OK; + +} + + +/***********************************************************/ +/** 读取QMU指定队列的计数信息 +* @param dev_id 设备编号 +* @param p_para 获得的统计信息 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_qmu_spec_q_stat_get(ZXIC_UINT32 dev_id, DPP_ETM_QMU_SPEC_Q_STAT_INFO_T *p_para) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_OBSERVE_PORTFC_SPEC_T observe_portfc_spec_reg = {0}; + DPP_ETM_QMU_SPEC_LIF_PORTFC_COUNT_T spec_lif_portfc_count_reg = {0}; + DPP_ETM_QMU_OBSERVE_QNUM_SET_T observe_qnum_set_reg = {0}; + DPP_ETM_QMU_SPEC_Q_PKT_RECEIVED_T spec_q_pkt_received_reg = {0}; + DPP_ETM_QMU_SPEC_Q_PKT_DROPPED_T spec_q_pkt_dropped_reg = {0}; + DPP_ETM_QMU_SPEC_Q_PKT_SCHEDULED_T spec_q_pkt_scheduled_reg = {0}; + DPP_ETM_QMU_SPEC_Q_WR_CMD_SENT_T spec_q_wr_cmd_sent_reg = {0}; + DPP_ETM_QMU_SPEC_Q_RD_CMD_SENT_T spec_q_rd_cmd_sent_reg = {0}; + DPP_ETM_QMU_SPEC_Q_PKT_ENQ_T spec_q_pkt_enq_reg = {0}; + DPP_ETM_QMU_SPEC_Q_PKT_DEQ_T spec_q_pkt_deq_reg = {0}; + DPP_ETM_QMU_SPEC_Q_CRDT_UNCON_RECEIVED_T spec_q_crdt_uncon_received_reg = {0}; + DPP_ETM_QMU_SPEC_Q_CRDT_CONG_RECEIVED_T spec_q_crdt_cong_received_reg = {0}; + DPP_ETM_QMU_SPEC_Q_CRS_NORMAL_CNT_T spec_q_crs_normal_cnt_reg = {0}; + DPP_ETM_QMU_SPEC_Q_CRS_OFF_CNT_T spec_q_crs_off_cnt_reg = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_para); + + rc = dpp_reg_read(dev_id, + ETM_QMU_OBSERVE_PORTFC_SPECr, + 0, + 0, + &observe_portfc_spec_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_SPEC_LIF_PORTFC_COUNTr, + 0, + 0, + &spec_lif_portfc_count_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_OBSERVE_QNUM_SETr, + 0, + 0, + &observe_qnum_set_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_SPEC_Q_PKT_RECEIVEDr, + 0, + 0, + &spec_q_pkt_received_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_SPEC_Q_PKT_DROPPEDr, + 0, + 0, + &spec_q_pkt_dropped_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_SPEC_Q_PKT_SCHEDULEDr, + 0, + 0, + &spec_q_pkt_scheduled_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_SPEC_Q_WR_CMD_SENTr, + 0, + 0, + &spec_q_wr_cmd_sent_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_SPEC_Q_RD_CMD_SENTr, + 0, + 0, + &spec_q_rd_cmd_sent_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_SPEC_Q_PKT_ENQr, + 0, + 0, + &spec_q_pkt_enq_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_SPEC_Q_PKT_DEQr, + 0, + 0, + &spec_q_pkt_deq_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_SPEC_Q_CRDT_UNCON_RECEIVEDr, + 0, + 0, + &spec_q_crdt_uncon_received_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_SPEC_Q_CRDT_CONG_RECEIVEDr, + 0, + 0, + &spec_q_crdt_cong_received_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_SPEC_Q_CRS_NORMAL_CNTr, + 0, + 0, + &spec_q_crs_normal_cnt_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_SPEC_Q_CRS_OFF_CNTr, + 0, + 0, + &spec_q_crs_off_cnt_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + p_para->observe_portfc_spec = observe_portfc_spec_reg.observe_portfc_spec; + p_para->spec_lif_portfc_count = spec_lif_portfc_count_reg.spec_lif_portfc_count; + p_para->observe_qnum_set = observe_qnum_set_reg.observe_qnum_set; + p_para->spec_q_pkt_received = spec_q_pkt_received_reg.spec_q_pkt_received; + p_para->spec_q_pkt_dropped = spec_q_pkt_dropped_reg.spec_q_pkt_dropped; + p_para->spec_q_pkt_scheduled = spec_q_pkt_scheduled_reg.spec_q_pkt_scheduled; + p_para->spec_q_wr_cmd_sent = spec_q_wr_cmd_sent_reg.spec_q_wr_cmd_sent; + p_para->spec_q_rd_cmd_sent = spec_q_rd_cmd_sent_reg.spec_q_rd_cmd_sent; + p_para->spec_q_pkt_enq = spec_q_pkt_enq_reg.spec_q_pkt_enq; + p_para->spec_q_pkt_deq = spec_q_pkt_deq_reg.spec_q_pkt_deq; + p_para->spec_q_crdt_uncon_received = spec_q_crdt_uncon_received_reg.spec_q_crdt_uncon_received; + p_para->spec_q_crdt_cong_received = spec_q_crdt_cong_received_reg.spec_q_crdt_cong_received; + p_para->spec_q_crs_normal_cnt = spec_q_crs_normal_cnt_reg.spec_q_crs_normal_cnt; + p_para->spec_q_crs_off_cnt = spec_q_crs_off_cnt_reg.spec_q_crs_off_cnt; + + return DPP_OK; + +} + +/***********************************************************/ +/** 读取QMU指定队列组的计数信息 +* @param dev_id 设备编号 +* @param p_para 获得的统计信息 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/03/04 +************************************************************/ +DPP_STATUS dpp_tm_qmu_spec_bat_stat_get(ZXIC_UINT32 dev_id, DPP_ETM_QMU_SPEC_BAT_STAT_INFO_T *p_para) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_QMU_OBSERVE_BATCH_SET_T observe_batch_set_reg = {0}; + DPP_ETM_QMU_SPEC_BAT_PKT_RECEIVED_T spec_bat_pkt_received_reg = {0}; + DPP_ETM_QMU_SPEC_BAT_PKT_DROPPED_T spec_bat_pkt_dropped_reg = {0}; + DPP_ETM_QMU_SPEC_BAT_BLK_SCHEDULED_T spec_bat_blk_scheduled_reg = {0}; + DPP_ETM_QMU_SPEC_BAT_WR_CMD_SENT_T spec_bat_wr_cmd_sent_reg = {0}; + DPP_ETM_QMU_SPEC_BAT_RD_CMD_SENT_T spec_bat_rd_cmd_sent_reg = {0}; + DPP_ETM_QMU_SPEC_BAT_PKT_ENQ_T spec_bat_pkt_enq_reg = {0}; + DPP_ETM_QMU_SPEC_BAT_PKT_DEQ_T spec_bat_pkt_deq_reg = {0}; + DPP_ETM_QMU_SPEC_BAT_CRDT_UNCON_RECEIVED_T spec_bat_crdt_uncon_received_reg = {0}; + DPP_ETM_QMU_SPEC_BAT_CRDT_CONG_RECEIVED_T spec_bat_crdt_cong_received_reg = {0}; + DPP_ETM_QMU_SPEC_BAT_CRS_NORMAL_CNT_T spec_bat_crs_normal_cnt_reg = {0}; + DPP_ETM_QMU_SPEC_BAT_CRS_OFF_CNT_T spec_bat_crs_off_cnt_reg = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_para); + + rc = dpp_reg_read(dev_id, + ETM_QMU_OBSERVE_BATCH_SETr, + 0, + 0, + &observe_batch_set_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_SPEC_BAT_PKT_RECEIVEDr, + 0, + 0, + &spec_bat_pkt_received_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_SPEC_BAT_PKT_DROPPEDr, + 0, + 0, + &spec_bat_pkt_dropped_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_SPEC_BAT_BLK_SCHEDULEDr, + 0, + 0, + &spec_bat_blk_scheduled_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_SPEC_BAT_WR_CMD_SENTr, + 0, + 0, + &spec_bat_wr_cmd_sent_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_SPEC_BAT_RD_CMD_SENTr, + 0, + 0, + &spec_bat_rd_cmd_sent_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_SPEC_BAT_PKT_ENQr, + 0, + 0, + &spec_bat_pkt_enq_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_SPEC_BAT_PKT_DEQr, + 0, + 0, + &spec_bat_pkt_deq_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_SPEC_BAT_CRDT_UNCON_RECEIVEDr, + 0, + 0, + &spec_bat_crdt_uncon_received_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_SPEC_BAT_CRDT_CONG_RECEIVEDr, + 0, + 0, + &spec_bat_crdt_cong_received_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_SPEC_BAT_CRS_NORMAL_CNTr, + 0, + 0, + &spec_bat_crs_normal_cnt_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + rc = dpp_reg_read(dev_id, + ETM_QMU_SPEC_BAT_CRS_OFF_CNTr, + 0, + 0, + &spec_bat_crs_off_cnt_reg); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + + p_para->observe_batch_set = observe_batch_set_reg.observe_batch_set; + p_para->spec_bat_pkt_received = spec_bat_pkt_received_reg.spec_bat_pkt_received; + p_para->spec_bat_pkt_dropped = spec_bat_pkt_dropped_reg.spec_bat_pkt_dropped; + p_para->spec_bat_blk_scheduled = spec_bat_blk_scheduled_reg.spec_bat_blk_scheduled; + p_para->spec_bat_wr_cmd_sent = spec_bat_wr_cmd_sent_reg.spec_bat_wr_cmd_sent; + p_para->spec_bat_rd_cmd_sent = spec_bat_rd_cmd_sent_reg.spec_bat_rd_cmd_sent; + p_para->spec_bat_pkt_enq = spec_bat_pkt_enq_reg.spec_bat_pkt_enq; + p_para->spec_bat_pkt_deq = spec_bat_pkt_deq_reg.spec_bat_pkt_deq; + p_para->spec_bat_crdt_uncon_received = spec_bat_crdt_uncon_received_reg.spec_bat_crdt_uncon_received; + p_para->spec_bat_crdt_cong_received = spec_bat_crdt_cong_received_reg.spec_bat_crdt_cong_received; + p_para->spec_bat_crs_normal_cnt = spec_bat_crs_normal_cnt_reg.spec_bat_crs_normal_cnt; + p_para->spec_bat_crs_off_cnt = spec_bat_crs_off_cnt_reg.spec_bat_crs_off_cnt; + + return DPP_OK; + +} + +/***********************************************************/ +/** 连续配置各级搬移门限 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* @param start_id 为起始 队列号或端口号,系统级时,id参数无效 +* @param value 端口级和系统级时,为搬移门限值,单位为NPPU存包的单位,256B; + 流级时为搬移profile_id,0~15 +* @param num 为队列或端口个数 +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author wush @date 2016/11/19 +************************************************************/ +#ifdef ETM_REAL +DPP_STATUS dpp_tm_cgavd_move_th_together_wr(ZXIC_UINT32 dev_id, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 start_id, + ZXIC_UINT32 value, + ZXIC_UINT32 num) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 i = 0; + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, level, QUEUE_LEVEL, SYS_LEVEL); + + + for (i = 0; i < num; i++) + { + ZXIC_COMM_CHECK_INDEX_SUB_OVERFLOW(start_id, i); + rc = dpp_tm_cgavd_move_th_set(dev_id, level, start_id + i, value); + zxic_comm_usleep(100); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_move_th_set"); + + } + + return DPP_OK; + +} +#endif +#endif +/***********************************************************/ +/** 连续设置多个队列或端口的TD门限 +* @param level 层次号,0:队列级,1:端口级 +* @param tm_type 0-ETM,1-FTM +* @param id 起始队列号或端口号 +* @param td_th TD门限,单位是KB,转换为block写入寄存器 +* @param num 需要设置的队列或端口数量 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/17 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_td_th_together_wr(DPP_DEV_T *dev, + ZXIC_UINT32 level, + ZXIC_UINT32 id, + ZXIC_UINT32 td_th, + ZXIC_UINT32 num) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 i = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), level, QUEUE_LEVEL, PP_LEVEL); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(DEV_ID(dev), id , num); + + for (i = 0; i < num; i++) + { + rc = dpp_tm_cgavd_td_th_set(dev, level, id + i, td_th); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_cgavd_td_th_set"); + } + + return DPP_OK; + +} + + +/***********************************************************/ +/** 连续获取多个队列或端口的TD门限 +* @param level 层次号,0:队列级,1:端口级 +* @param tm_type 0-ETM,1-FTM +* @param level 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* @param id 起始队列号或端口号 +* @param num 需要设置的队列或端口数量 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2016/03/22 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_td_th_together_get(DPP_DEV_T *dev, + ZXIC_UINT32 level, + ZXIC_UINT32 id, + ZXIC_UINT32 num) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 td_th = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), level, QUEUE_LEVEL, PP_LEVEL); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(DEV_ID(dev), id , num); + + for (i = 0; i < num; i++) + { + rc = dpp_tm_cgavd_td_th_get(dev, level, id + i, &td_th); + zxic_comm_delay(5); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_cgavd_td_th_get"); + + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(DEV_ID(dev), id , i); + if (level == QUEUE_LEVEL) + { + ZXIC_COMM_PRINT(" flow_id: 0x%x, td_th: 0x%x\n", id + i, td_th); + } + else + { + ZXIC_COMM_PRINT(" pp_id: 0x%x, td_th: 0x%x\n", id + i, td_th); + } + + } + + return DPP_OK; + +} + +/***********************************************************/ +/** 连续配置多个队列或端口是否支持动态门限机制 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param level WRED支持层次号,0:队列级,1:端口级 +* @param id 队列号或端口号 +* @param en 配置的值,0-不支持动态门限机制,1-支持动态门限机制 +* @param num 连续配置的队列数 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author djf @date 2014/02/17 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_dyn_th_en_set_more(DPP_DEV_T *dev, + DPP_TM_CGAVD_LEVEL_E level, + ZXIC_UINT32 id, + ZXIC_UINT32 en, + ZXIC_UINT32 num) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 i = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), level, QUEUE_LEVEL, PP_LEVEL); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), en, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(DEV_ID(dev), id , num); + + for (i = 0; i < num; i++) + { + rc = dpp_tm_cgavd_dyn_th_en_set(dev, level, id + i, en); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(DEV_ID(dev), rc, "dpp_tm_cgavd_dyn_th_en_set"); + + } + + return DPP_OK; + +} + +#if 0 +/***********************************************************/ +/** 配置各级WRED丢弃曲线对应的参数 +* @param tm_type 0-ETM,1-FTM +* @param level WRED支持层次号,0:队列级,1:端口级 +* @param wred_id 队列级共支持16个WRED组0-15,端口级支持8组0-7 +* @param dp 共支持8个dp,取值0-7 +* @param max_th 平均队列深度上限阈值 +* @param min_th 平均队列深度下限阈值 +* @param max_p 最大丢弃概率 +* @param weight 平均队列深度计算权重 +* @param q_len_th 队列深度阈值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author taq @date 2015/04/20 +************************************************************/ +DPP_STATUS dpp_tm_wred_dp_line_para_wr(ZXIC_UINT32 dev_id, + ZXIC_UINT32 level, + ZXIC_UINT32 wred_id, + ZXIC_UINT32 dp, + ZXIC_UINT32 max_th, + ZXIC_UINT32 min_th, + ZXIC_UINT32 max_p, + ZXIC_UINT32 weight, + ZXIC_UINT32 q_len_th) +{ + DPP_STATUS rc = DPP_OK; + DPP_TM_WRED_DP_LINE_PARA_T para = {0}; + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, level, QUEUE_LEVEL, PP_LEVEL); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dp, 0, DPP_TM_DP_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, max_p, 1, DPP_TM_RED_P_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, weight, 0, DPP_TM_CGAVD_WEIGHT_MAX); + + if (QUEUE_LEVEL == level) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, wred_id, 0, DPP_TM_Q_WRED_NUM - 1); + } + else + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, wred_id, 0, DPP_TM_PP_WRED_NUM - 1); + } + + para.max_th = max_th; + para.min_th = min_th; + para.max_p = max_p; + para.weight = weight; + para.q_len_th = q_len_th; + + rc = dpp_tm_cgavd_wred_dp_line_para_set(dev_id, level, wred_id, dp, ¶); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_wred_dp_line_para_set"); + + return DPP_OK; + +} + + +/***********************************************************/ +/** 配置各级WRED丢弃曲线对应的参数 +* @param tm_type 0-ETM,1-FTM +* @param level WRED支持层次号,0:队列级,1:端口级 +* @param wred_id 队列级共支持16个WRED组0-15,端口级支持8组0-7 +* @param dp 共支持8个dp,取值0-7 +* @param max_th 平均队列深度上限阈值 +* @param min_th 平均队列深度下限阈值 +* @param max_p 最大丢弃概率 +* @param weight 平均队列深度计算权重 +* @param q_len_th 队列深度阈值 +* @param flag 忽略乘法里的当前包长和最大包长比标志位:1为忽略 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2015/11/9 +************************************************************/ +DPP_STATUS dpp_tm_wred_dp_line_para_flag_wr(ZXIC_UINT32 dev_id, + ZXIC_UINT32 level, + ZXIC_UINT32 wred_id, + ZXIC_UINT32 dp, + ZXIC_UINT32 max_th, + ZXIC_UINT32 min_th, + ZXIC_UINT32 max_p, + ZXIC_UINT32 weight, + ZXIC_UINT32 q_len_th, + ZXIC_UINT32 flag) +{ + DPP_STATUS rc = DPP_OK; + DPP_TM_WRED_DP_LINE_PARA_T para = {0}; + DPP_ETM_CGAVD_PKE_LEN_CALC_SIGN_T cgavd_pke_len_calc_sign = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, level, QUEUE_LEVEL, PP_LEVEL); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dp, 0, DPP_TM_DP_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, max_p, 1, DPP_TM_RED_P_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, weight, 0, DPP_TM_CGAVD_WEIGHT_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, flag, 0, 1); + + if (QUEUE_LEVEL == level) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, wred_id, 0, DPP_TM_Q_WRED_NUM - 1); + } + else + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, wred_id, 0, DPP_TM_PP_WRED_NUM - 1); + } + + para.max_th = max_th; + para.min_th = min_th; + para.max_p = max_p; + para.weight = weight; + para.q_len_th = q_len_th; + + cgavd_pke_len_calc_sign.pke_len_calc_sign = flag; + rc = dpp_reg_write(dev_id, + ETM_CGAVD_PKE_LEN_CALC_SIGNr, + 0, + 0, + &cgavd_pke_len_calc_sign); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_tm_cgavd_wred_dp_line_para_set(dev_id, level, wred_id, dp, ¶); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_wred_dp_line_para_set"); + + return DPP_OK; + +} + + +/***********************************************************/ +/** 配置CPU设置的报文长度是否参与计算丢弃概率的使能 +* @param tm_type 0-ETM,1-FTM +* @param flag 忽略乘法里的当前包长和最大包长比标志位:1为忽略 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2015/11/9 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_wred_pke_len_calc_sign_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 flag) +{ + DPP_STATUS rc = DPP_OK; + + DPP_ETM_CGAVD_PKE_LEN_CALC_SIGN_T cgavd_pke_len_calc_sign = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, flag, 0, 1); + + cgavd_pke_len_calc_sign.pke_len_calc_sign = flag; + rc = dpp_reg_write(dev_id, + ETM_CGAVD_PKE_LEN_CALC_SIGNr, + 0, + 0, + &cgavd_pke_len_calc_sign); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; + +} + + +/***********************************************************/ +/** 获取配置CPU设置的报文长度是否参与计算丢弃概率的使能 +* @param tm_type 0-ETM,1-FTM +* @param flag 忽略乘法里的当前包长和最大包长比标志位:1为忽略 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cy @date 2015/11/9 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_wred_pke_len_calc_sign_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_flag) +{ + DPP_STATUS rc = DPP_OK; + + DPP_ETM_CGAVD_PKE_LEN_CALC_SIGN_T cgavd_pke_len_calc_sign = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_flag); + + rc = dpp_reg_read(dev_id, + ETM_CGAVD_PKE_LEN_CALC_SIGNr, + 0, + 0, + &cgavd_pke_len_calc_sign); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + *p_flag = cgavd_pke_len_calc_sign.pke_len_calc_sign; + + return DPP_OK; + +} + +/***********************************************************/ +/** 配置系统级GRED丢弃曲线对应的参数 +* @param tm_type 0-ETM,1-FTM +* @param dp 共支持8个dp,取值0-7 +* @param max_th 平均队列深度上限阈值 +* @param mid_th 平均队列深度中间阈值 +* @param min_th 平均队列深度下限阈值 +* @param max_p 最大丢弃概率 1~99 +* @param weight 平均队列深度计算权重 +* @param q_len_th 队列深度阈值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author taq @date 2015/04/20 +************************************************************/ +DPP_STATUS dpp_tm_gred_dp_line_para_wr(ZXIC_UINT32 dev_id, + ZXIC_UINT32 dp, + ZXIC_UINT32 max_th, + ZXIC_UINT32 mid_th, + ZXIC_UINT32 min_th, + ZXIC_UINT32 max_p, + ZXIC_UINT32 weight, + ZXIC_UINT32 q_len_th) +{ + DPP_STATUS rc = DPP_OK; + DPP_TM_GRED_DP_LINE_PARA_T para = {0}; + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dp, 0, DPP_TM_DP_NUM - 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, max_p, 1, DPP_TM_RED_P_MAX); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, weight, 0, DPP_TM_CGAVD_WEIGHT_MAX); + + para.max_th = max_th; + para.mid_th = mid_th; + para.min_th = min_th; + para.max_p = max_p; + + + para.weight = weight; + para.q_len_th = q_len_th; + + rc = dpp_tm_cgavd_gred_dp_line_para_set(dev_id, dp, ¶); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_gred_dp_line_para_set"); + + + return DPP_OK; + +} + + + +/***********************************************************/ +/** 配置olif统计组信息 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param id olif统计组号 +* @param all_or_by_port 0-统计所有,1-统计某一端口或某一dest_id +* @param i_or_e_sel 10-统计片外,01-统计片内,其他值-统计所有 +* @param port_or_dest_id_sel 0-统计port,1-统计dest_id +* @param port_dest_id port号或dest_id号 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author cuiy @date 2016/04/21 +************************************************************/ +DPP_STATUS dpp_tm_olif_stat_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 id, + ZXIC_UINT32 all_or_by_port, + ZXIC_UINT32 i_or_e_sel, + ZXIC_UINT32 port_or_dest_id_sel, + ZXIC_UINT32 port_dest_id) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_OLIF_TM_LIF_STAT_CFG_T tm_lif_stat_cft = {0}; + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, id, 0, 15); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, all_or_by_port, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, i_or_e_sel, 0, 3); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, port_or_dest_id_sel, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, port_dest_id, 0, 255); + + + tm_lif_stat_cft.all_or_by_port = all_or_by_port; + tm_lif_stat_cft.i_or_e_sel = i_or_e_sel; + tm_lif_stat_cft.port_or_dest_id_sel = port_or_dest_id_sel; + tm_lif_stat_cft.port_dest_id = port_dest_id; + rc = dpp_reg_write(dev_id, + ETM_OLIF_TM_LIF_STAT_CFGr, + 0, + id, + &tm_lif_stat_cft); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** +* @param dev_id +* @param tm_type +* @param i_or_e_sel +* @param port_or_dest_id_sel +* @param start_id +* @param start_port_dest_id +* @param num +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xjw @date 2018/02/01 +************************************************************/ +DPP_STATUS dpp_tm_olif_stat_set_mul(ZXIC_UINT32 dev_id, + ZXIC_UINT32 i_or_e_sel, + ZXIC_UINT32 port_or_dest_id_sel, + ZXIC_UINT32 start_id, + ZXIC_UINT32 start_port_dest_id, + ZXIC_UINT32 num) +{ + DPP_STATUS rt = DPP_OK; + ZXIC_UINT32 i = 0; + + for (i = 0; i < num; i++) + { + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(dev_id, start_port_dest_id, i); + ZXIC_COMM_CHECK_DEV_INDEX_ADD_OVERFLOW_NO_ASSERT(dev_id, start_id , i); + + rt = dpp_tm_olif_stat_set(dev_id, start_id + i, + 1, i_or_e_sel, port_or_dest_id_sel, start_port_dest_id + i); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rt, "dpp_reg_write"); + } + + return rt; +} + +DPP_STATUS dpp_tm_mr_init(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + rc = dpp_tm_qmu_qos_sign_set(dev_id, 0, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_qos_sign_set"); + rc = dpp_tm_cgavd_q_map_pp_set(dev_id, 0, 60); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_q_map_pp_set"); + rc = dpp_tm_cgavd_td_byte_block_th_get_diag(dev_id, 1, 60); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_td_byte_block_th_get_diag"); + rc = dpp_tm_cgavd_td_byte_block_th_set(dev_id, 0, 0, 1024); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_td_byte_block_th_set"); + rc = dpp_tm_cgavd_td_th_set(dev_id, 0, 0, 200); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_td_th_set"); + // rc = dpp_tm_shape_pp_para_wr(dev_id, 60, 1000000, 1000, 1); + // ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_shape_pp_para_wr"); + rc = dpp_tm_qmu_port_shape_set(dev_id, 60, 4, 31, 8192, 1); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_port_shape_set"); + + return rc; +} + +#if 0 +/***********************************************************/ +/** 配置TM模式下初始化代码 +* @param dev_id +* @param tm_type 0-ETM,1-FTM +* @param p_tm_init_info 配置TM模式下初始化信息包括以下 +* blk_size 配置qmu block大小:512B[default]/1024B +* case_num QMU初始化场景编号:0/1/2/3... +* imem_omem; 0-片内外混合; 1-纯片内;2-纯片外 +* mode 0-TM; 1-SA +* +* @return +* @remark 无 +* @see +* @author whuashan @date 2015/03/26 +************************************************************/ +DPP_STATUS dpp_tm_asic_init(ZXIC_UINT32 dev_id, DPP_TM_ASIC_INIT_INFO_T *p_tm_asic_init_info) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 case_num = 0; + ZXIC_UINT32 blk_size = 0; + ZXIC_UINT32 imem_omem = 0; + ZXIC_UINT32 mode = 0; + //ZXIC_UINT32 port_id = 0; + /*ZXIC_UINT32 flow_id_index = 0;*/ + ZXIC_UINT32 index = 0; + ZXIC_UINT32 sys_cgavd_td = 0; + DPP_TM_CNT_MODE_T cfgmt_count_mode = {0}; + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_tm_asic_init_info); + +/* + if (tm_type == DPP_ETM) + { + flow_id_index = DPP_ETM_Q_NUM; + } + else if (tm_type == DPP_FTM) + { + flow_id_index = DPP_FTM_Q_NUM; + } +*/ + case_num = p_tm_asic_init_info->case_num; + ZXIC_COMM_PRINT("case_num =:%d TM ASIC INIT START! <======\n", case_num); + blk_size = p_tm_asic_init_info->blk_size; + imem_omem = p_tm_asic_init_info->imem_omem; + mode = p_tm_asic_init_info->mode; + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, mode, 0, 1); + + ZXIC_COMM_PRINT("======>dev_id:%d TM ASIC INIT START! <======\n", dev_id); + + /*开启tm时钟门控使能*/ + rc = dpp_tm_cfgmt_clkgate_en_set(dev_id, 1); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_clkgate_en_set"); + ZXIC_COMM_PRINT("DPP tm clk enable ok\n"); + zxic_comm_sleep(5); + /*开启tm软复位使能*/ + rc = dpp_tm_cfgmt_softrst_en_set(dev_id, 1); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_softrst_en_set"); + ZXIC_COMM_PRINT("DPP tm softrst enable ok\n"); + zxic_comm_sleep(5); + + + DPP_ETM_CFGMT_CLKGATE_EN_T timeout = {0}; + timeout.clkgate_en = 0xfff; + rc = dpp_reg_write(dev_id, + ETM_CFGMT_TIMEOUT_LIMITr, + 0, + 0, + &timeout); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + + + /* 整包和交织模式:TM模式配置成交织模式 */ + rc = dpp_tm_qmu_pkt_blk_mode_set(dev_id, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_pkt_blk_mode_set"); + ZXIC_COMM_PRINT("DPP tm mode cfg ok\n"); + + /* 配置block大小 */ + rc = dpp_tm_cfgmt_blk_size_set(dev_id, blk_size); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_blk_size_set"); + + /* 启动包存储CRC使能 */ + rc = dpp_tm_cfgmt_crc_en_set(dev_id, 1); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_crc_en_set"); + + /* 配置QMU的每chunk节点数:目前配置1chk=8 block */ + rc = dpp_tm_cfgmt_qmu_work_mode_set(dev_id, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_qmu_work_mode_set"); + ZXIC_COMM_PRINT("DPP tm qmu_work_mode_set ok\n"); + /* 计数模式配置 */ + cfgmt_count_mode.fc_count_mode = 1; /* 翻转 */ + cfgmt_count_mode.count_rd_mode = 0; /* 非读清 */ + cfgmt_count_mode.count_overflow_mode = 1; /* 允许溢出翻转 */ + rc = dpp_tm_cfgmt_cnt_mode_set(dev_id, &cfgmt_count_mode); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_cnt_mode_set"); + + /* 总缓存字节数=节点数量*节点大小ftm256k etm512k:配置总缓存90% */ + sys_cgavd_td = (512 * 1024) * blk_size; + sys_cgavd_td = sys_cgavd_td / 1024; + sys_cgavd_td = sys_cgavd_td / 100 * 90; + rc = dpp_tm_cgavd_td_th_set(dev_id, SYS_LEVEL, 0, sys_cgavd_td); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_td_th_set"); + + /* 纯片内模式 */ + dpp_tm_tmmu_imem_en_set(dev_id, 1); + dpp_tm_cgavd_imem_omem_set(dev_id, 1, 0); + dpp_tm_tmmu_ddr_force_rdy_set(dev_id, 0x3ff); + + /* QMU链表配置:保证16K配置 */ + rc = dpp_tm_qmu_init_set(dev_id, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_init_set"); + + /* 空队列确保门限值配置 */ + rc = dpp_tm_qmu_crs_th2_set(dev_id, 0, 200); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_crs_th2_set"); + + /*crs的e桶产生门限:每个队列可映射16种配置, + 映射表是cgavd的流队列WRED队列策略组*/ + for (index = 0 ; index < 16; index++) + { + rc = dpp_tm_qmu_crs_eir_th_set(dev_id, index, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_crs_eir_th_set"); + } + + /* CRS限速 */ + + /* 普通老化使能和配置 */ + rc = dpp_tm_qmu_pkt_aging_set(dev_id, 0, 0x1ff, 0xff, 0, DPP_ETM_Q_NUM - 1, 1, 0xa); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_pkt_aging_set"); + + /* CRDT SHAP配置 */ + rc = dpp_tm_crdt_ram_init(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_crdt_ram_init"); + rc = dpp_tm_shap_ram_init(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_shap_ram_init"); + /* CRDT 授权使能打开 */ + rc = dpp_tm_crdt_credit_en_set(dev_id, 1); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_crdt_credit_en_set"); + ZXIC_COMM_PRINT("dev_id:%d DPP_TM crdt credit enable set success!!!\n", dev_id); + + /* CRDT开启E桶CRS过滤使能(不能打开,会导致延时大) */ + /*for (index = 0; index < flow_id_index; index++) + { + rc = dpp_tm_ind_write32(dev_id, MODULE_TM_CRDT, 0x600000 + index, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_move_th_set"); + }*/ + + /*打开flow db_token,配置成c+e*/ + rc = dpp_tm_shape_flow_db_en_set(dev_id, 1, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_shape_flow_db_en_set"); + + /*开启cgavd平均队列深度归零使能*/ + rc = dpp_tm_cgavd_avg_qlen_return_zero_en_set(dev_id, 1); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_avg_qlen_return_zero_en_set"); + + rc = dpp_tm_qmu_qlist_cfgmt_ram_init_done_print(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_qlist_cfgmt_ram_init_done_print"); + + /*开启tm时钟门控使能*/ + // rc = dpp_tm_cfgmt_clkgate_en_set(dev_id, 1); + // ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_clkgate_en_set"); + + // /*开启tm软复位使能*/ + // rc = dpp_tm_cfgmt_softrst_en_set(dev_id, 1); + // ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_softrst_en_set"); + + /* 子系统就绪判断 */ + rc = dpp_tm_cfgmt_subsystem_rdy_check(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_subsystem_rdy_check"); + + + ZXIC_COMM_PRINT("=====>dev_id:%d TM ASIC INIT END! <======\n", dev_id); + + return DPP_OK; +} + +/***********************************************************/ +/** 配置TM模式下初始化代码 +* @param dev_id +* @param tm_type 0-ETM,1-FTM +* @param p_tm_init_info 配置TM模式下初始化信息包括以下 +* blk_size 配置qmu block大小:512B[default]/1024B +* case_num QMU初始化场景编号:0/1/2/3... +* imem_omem; 0-片内外混合; 1-纯片内;2-纯片外 +* mode 0-TM; 1-SA +* +* @return +* @remark 无 +* @see +* @author szq @date 2015/03/26 +************************************************************/ +DPP_STATUS dpp_tm_asic_init_diag(ZXIC_UINT32 dev_id, ZXIC_UINT32 blk_size, ZXIC_UINT32 case_num, ZXIC_UINT32 imem_omem, ZXIC_UINT32 mode) +{ + DPP_STATUS rc = DPP_OK; + DPP_TM_ASIC_INIT_INFO_T tm_asic_init_info = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 1); + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, blk_size, 256, 1024); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, case_num, 0, 0x99F); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, imem_omem, 0, 2); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, mode, 0, 1); + + tm_asic_init_info.blk_size = blk_size; + tm_asic_init_info.case_num = case_num; + tm_asic_init_info.imem_omem = imem_omem; + tm_asic_init_info.mode = mode; + rc = dpp_tm_asic_init(dev_id, &tm_asic_init_info); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_asic_init"); + + return DPP_OK; +} + +#endif +/**************************************************************************** +* 函数名称: dpp_tm_avg_que_len_get +* 功能描述: 各级平均队列深度获取 +* 输入参数: dev_id: 设备索引编号 +* @param tm_type 0-ETM,1-FTM +* cgavd_level: 拥塞避免支持层次号,0:队列级,1:端口级,2:系统级 +* que_id: 本级别层次内的队列编号。 +* 输出参数: p_avg_len: 平均队列深度,单位为BLOCK。 +* 返 回 值: DPP_OK-成功,DPP_ERR-失败 +* 其它说明: +* author cy @date 2015/06/29 +*****************************************************************************/ +DPP_STATUS dpp_tm_avg_que_len_get(ZXIC_UINT32 dev_id, + DPP_TM_CGAVD_LEVEL_E cgavd_level, + ZXIC_UINT32 que_id, + ZXIC_UINT32 *p_avg_len) +{ + /* 返回值变量定义 */ + DPP_STATUS rc = DPP_OK; + + /* 结构体变量定义 */ + DPP_ETM_CGAVD_PP_AVG_Q_LEN_T cgavd_pp_avg_q_len = {0}; + DPP_ETM_CGAVD_SYS_AVG_Q_LEN_T cgavd_sys_avg_q_len = {0}; + DPP_ETM_CGAVD_FLOW_AVG_Q_LEN_T cgavd_flow_avg_q_len = {0}; + + + /* 入参检查 */ + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, cgavd_level, QUEUE_LEVEL, SYS_LEVEL); + + if (QUEUE_LEVEL == cgavd_level) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, que_id, 0, DPP_ETM_Q_NUM - 1); + } + else if (PP_LEVEL == cgavd_level) + { + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, que_id, 0, DPP_TM_PP_NUM - 1); + } + else + { + + } + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_avg_len); + + switch (cgavd_level) + { + case QUEUE_LEVEL: + { + rc = dpp_reg_read(dev_id, ETM_CGAVD_FLOW_AVG_Q_LENr, 0, que_id, &cgavd_flow_avg_q_len); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + *p_avg_len = cgavd_flow_avg_q_len.flow_avg_q_len; + break; + } + + case PP_LEVEL: + { + rc = dpp_reg_read(dev_id, ETM_CGAVD_PP_AVG_Q_LENr, 0, que_id, &cgavd_pp_avg_q_len); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + *p_avg_len = cgavd_pp_avg_q_len.pp_avg_q_len; + break; + } + + case SYS_LEVEL: + { + rc = dpp_reg_read(dev_id, ETM_CGAVD_SYS_AVG_Q_LENr, 0, 0, &cgavd_sys_avg_q_len); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_read"); + *p_avg_len = cgavd_sys_avg_q_len.sys_avg_q_len; + break; + } + + default: + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "[dev_id %d] cgavd_level is out of dev_id!!!\n", dev_id); + return DPP_ERR; + } + } + + return DPP_OK; +} + +#endif +/***********************************************************/ +/** 清除整形表格里面的值 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/07/16 +************************************************************/ +DPP_STATUS dpp_tm_clr_shape_para(DPP_DEV_T *dev) +{ + /*DPP_STATUS rc = DPP_OK;*/ + +/* rc = dpp_tm_global_var_mutex_init(); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_global_var_mutex_init"); + + rc = zxic_comm_mutex_lock(&g_dpp_tm_global_var_rw_mutex); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "zxic_comm_mutex_lock");*/ + + // ZXIC_COMM_CHECK_POINT(dev); + // ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 2); + + memset(g_dpp_etm_shape_para_table[0], 0, 256 * 22 * 128 * sizeof(DPP_TM_SHAPE_PARA_TABLE)); + + +/* rc = zxic_comm_mutex_unlock(&g_dpp_tm_global_var_rw_mutex); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "zxic_comm_mutex_unlock");*/ + return DPP_OK; + +} + +#if 0 +/***********************************************************/ +/** 配置CFGMT中断屏蔽 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param shap_int_mask_flag shap模块中断屏蔽位 0:不屏蔽 1:屏蔽 +* @param crdt_int_mask_flag crdt模块中断屏蔽位 +* @param mmu_int_mask_flag mmu模块中断屏蔽位 +* @param qmu_int_mask_flag qmu模块中断屏蔽位 +* @param cgavd_int_mask_flag cgavd模块中断屏蔽位 +* @param olif_int_mask_flag olif模块中断屏蔽位 +* @param cfgmt_int_buf_mask_flag cfgmt模块中断屏蔽位 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/07/08 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_int_mask_set_diag(ZXIC_UINT32 dev_id, + ZXIC_UINT32 shap_int_mask_flag, + ZXIC_UINT32 crdt_int_mask_flag, + ZXIC_UINT32 mmu_int_mask_flag, + ZXIC_UINT32 qmu_int_mask_flag, + ZXIC_UINT32 cgavd_int_mask_flag, + ZXIC_UINT32 olif_int_mask_flag, + ZXIC_UINT32 cfgmt_int_buf_mask_flag) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CFGMT_REG_INT_MASK_REG_T int_mask = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, shap_int_mask_flag, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, crdt_int_mask_flag, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, mmu_int_mask_flag, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, qmu_int_mask_flag, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, cgavd_int_mask_flag, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, olif_int_mask_flag, 0, 1); + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, cfgmt_int_buf_mask_flag, 0, 1); + + int_mask.shap_int_mask = shap_int_mask_flag; + int_mask.crdt_int_mask = crdt_int_mask_flag; + int_mask.tmmu_int_mask = mmu_int_mask_flag; + int_mask.qmu_int_mask = qmu_int_mask_flag; + int_mask.cgavd_int_mask = cgavd_int_mask_flag; + int_mask.olif_int_mask = olif_int_mask_flag; + int_mask.cfgmt_int_buf_mask = cfgmt_int_buf_mask_flag; + + rc = dpp_reg_write(dev_id, + ETM_CFGMT_REG_INT_MASK_REGr, + 0, + 0, + &int_mask); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读取CFGMT中断状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_para 中断状态 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/07/08 +************************************************************/ +DPP_STATUS dpp_tm_cfgmt_int_state_get_diag(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + + rc = dpp_reg_fields_print_with_def(dev_id, ETM_CFGMT_REG_INT_STATE_REGr, 0, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_fields_print_with_def"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读取olif中断状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/07/08 +************************************************************/ +DPP_STATUS dpp_tm_olif_int_state_get(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + + rc = dpp_reg_fields_print_with_def(dev_id, ETM_OLIF_ITMHRAM_PARITY_ERR_2_INTr, 0, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_fields_print_with_def"); + + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置OLIF中断屏蔽 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param crcram_parity_err_mask 0:不屏蔽 1:屏蔽 +* @param itmhram_parity_err_mask +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/07/08 +************************************************************/ +DPP_STATUS dpp_tm_olif_int_mask_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 olif_int_mask_flag) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_OLIF_OLIF_INT_MASK_T int_mask = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, olif_int_mask_flag, 0, 1); + + int_mask.crcram_parity_err_mask = olif_int_mask_flag; + int_mask.emem_fifo_ecc_mask = olif_int_mask_flag; + int_mask.emem_fifo_ovf_mask = olif_int_mask_flag; + int_mask.emem_fifo_udf_mask = olif_int_mask_flag; + int_mask.imem_fifo_ecc_mask = olif_int_mask_flag; + int_mask.imem_fifo_ovf_mask = olif_int_mask_flag; + int_mask.imem_fifo_udf_mask = olif_int_mask_flag; + int_mask.itmh_ecc_double_err_mask = olif_int_mask_flag; + int_mask.itmh_ecc_single_err_mask = olif_int_mask_flag; + int_mask.order_fifo_ovf_mask = olif_int_mask_flag; + int_mask.order_fifo_parity_err_mask = olif_int_mask_flag; + int_mask.order_fifo_udf_mask = olif_int_mask_flag; + int_mask.para_fifo_ecc_mask = olif_int_mask_flag; + int_mask.para_fifo_ovf_mask = olif_int_mask_flag; + int_mask.para_fifo_udf_mask = olif_int_mask_flag; + + rc = dpp_reg_write(dev_id, + ETM_OLIF_OLIF_INT_MASKr, + 0, + 0, + &int_mask); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置cgavd中断屏蔽 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param cgavd_int_mask_flag 0:不屏蔽 1:屏蔽 +* @param 写1 屏蔽cgavd中断寄存器和cgavd_ram_err寄存器所有位 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/07/08 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_int_mask_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 cgavd_int_mask_flag) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CGAVD_CGAVD_INT_MASK_T cgavd_int_mask = {0}; + DPP_ETM_CGAVD_CGAVD_RAM_ERR_INT_MASK_T cgavd_ram_err_int_mask = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, cgavd_int_mask_flag, 0, 1); + + + cgavd_int_mask.cgavd_int_mask = cgavd_int_mask_flag; + cgavd_ram_err_int_mask.flow_qlen_inta_mask = cgavd_int_mask_flag; + cgavd_ram_err_int_mask.flow_qlen_intb_mask = cgavd_int_mask_flag; + cgavd_ram_err_int_mask.flow_qnum_inta_mask = cgavd_int_mask_flag; + cgavd_ram_err_int_mask.flow_qnum_intb_mask = cgavd_int_mask_flag; + cgavd_ram_err_int_mask.flow_tdth_inta_mask = cgavd_int_mask_flag; + cgavd_ram_err_int_mask.flow_tdth_intb_mask = cgavd_int_mask_flag; + + cgavd_ram_err_int_mask.pds_deal_fifo_ov_int_mask = cgavd_int_mask_flag; + cgavd_ram_err_int_mask.pds_deal_fifo_uv_int_mask = cgavd_int_mask_flag; + cgavd_ram_err_int_mask.pp_qlen_inta_mask = cgavd_int_mask_flag; + cgavd_ram_err_int_mask.pp_qlen_intb_mask = cgavd_int_mask_flag; + cgavd_ram_err_int_mask.pp_tdth_int_mask = cgavd_int_mask_flag; + cgavd_ram_err_int_mask.qmu_cgavd_fifo_ov_int_mask = cgavd_int_mask_flag; + cgavd_ram_err_int_mask.qmu_cgavd_fifo_uv_int_mask = cgavd_int_mask_flag; + + rc = dpp_reg_write(dev_id, + ETM_CGAVD_CGAVD_INT_MASKr, + 0, + 0, + &cgavd_int_mask); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + ETM_CGAVD_CGAVD_RAM_ERR_INT_MASKr, + 0, + 0, + &cgavd_ram_err_int_mask); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读取cgavd中断状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_para 中断状态 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/07/08 +************************************************************/ +DPP_STATUS dpp_tm_cgavd_int_state_get(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + + + rc = dpp_reg_fields_print_with_def(dev_id, ETM_CGAVD_CGAVD_INTr, 0, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_fields_print_with_def"); + + rc = dpp_reg_fields_print_with_def(dev_id, ETM_CGAVD_CGAVD_RAM_ERRr, 0, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_fields_print_with_def"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读取tmmu中断状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param p_para 中断状态 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/07/08 +************************************************************/ +DPP_STATUS dpp_tm_tmmu_int_state_get(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + + rc = dpp_reg_fields_print_with_def(dev_id, ETM_TMMU_TMMU_STATES_1r, 0, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_fields_print_with_def"); + + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置crdt中断屏蔽 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param crdt_int_mask_flag 0:不屏蔽 1:屏蔽 +* @param 写1 屏蔽ETM_CGAVD_RD_CPU_OR_RAMr +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/4/10 +************************************************************/ +DPP_STATUS dpp_tm_crdt_int_mask_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 crdt_int_mask_flag) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CRDT_CRDT_INT_MASK_T crdt_int_mask = {0}; + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, crdt_int_mask_flag, 0, 1); + + + crdt_int_mask.crdt_int_mask = crdt_int_mask_flag; + rc = dpp_reg_write(dev_id, + ETM_CRDT_CRDT_INT_MASKr, + 0, + 0, + &crdt_int_mask); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + + return DPP_OK; +} + +/***********************************************************/ +/** 读取crdt中断状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/4/10 +************************************************************/ +DPP_STATUS dpp_tm_crdt_int_state_get(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + + + rc = dpp_reg_fields_print_with_def(dev_id, ETM_CRDT_CRDT_INT_BUSr, 0, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_fields_print_with_def"); + + return DPP_OK; +} + +/***********************************************************/ +/** 配置qmu中断屏蔽 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param qmu_int_mask_flag 0:不屏蔽 1:屏蔽 +* @param 写1 屏蔽qmu_int_mask5的所有位 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/07/09 +************************************************************/ +DPP_STATUS dpp_tm_qmu_int_mask_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 qmu_int_mask_flag) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 qmu_qsch_crbal_init_mask_reg_index = 0; + ZXIC_UINT32 qmu_int_mask1_reg_index = 0; + ZXIC_UINT32 qmu_int_mask2_reg_index = 0; + ZXIC_UINT32 qmu_int_mask3_reg_index = 0; + ZXIC_UINT32 qmu_int_mask4_reg_index = 0; + ZXIC_UINT32 qmu_int_mask5_reg_index = 0; + + DPP_ETM_QMU_QCFG_QSCH_CRBAL_INIT_MASK_T qmu_qsch_crbal_init_mask = {0}; + DPP_ETM_QMU_QMU_INT_MASK1_T qmu_int_mask1 = {0}; + DPP_ETM_QMU_QMU_INT_MASK2_T qmu_int_mask2 = {0}; + DPP_ETM_QMU_QMU_INT_MASK3_T qmu_int_mask3 = {0}; + DPP_ETM_QMU_QMU_INT_MASK4_T qmu_int_mask4 = {0}; + DPP_ETM_QMU_QMU_INT_MASK5_T qmu_int_mask5 = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, qmu_int_mask_flag, 0, 1); + + qmu_qsch_crbal_init_mask_reg_index = ETM_QMU_QCFG_QSCH_CRBAL_INIT_MASKr; + qmu_int_mask1_reg_index = ETM_QMU_QMU_INT_MASK1r; + qmu_int_mask2_reg_index = ETM_QMU_QMU_INT_MASK2r; + qmu_int_mask3_reg_index = ETM_QMU_QMU_INT_MASK3r; + qmu_int_mask4_reg_index = ETM_QMU_QMU_INT_MASK4r; + qmu_int_mask5_reg_index = ETM_QMU_QMU_INT_MASK5r; + + qmu_qsch_crbal_init_mask.qcfg_qsch_crbal_init_mask = qmu_int_mask_flag; + + qmu_int_mask1.qmu_int_mask1 = qmu_int_mask_flag; + qmu_int_mask2.qmu_int_mask2 = qmu_int_mask_flag; + qmu_int_mask3.qmu_int_mask3 = qmu_int_mask_flag; + qmu_int_mask4.qmu_int_mask4 = qmu_int_mask_flag; + qmu_int_mask5.qmu_int_mask5 = qmu_int_mask_flag; + + rc = dpp_reg_write(dev_id, + qmu_qsch_crbal_init_mask_reg_index, + 0, + 0, + &qmu_qsch_crbal_init_mask); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + qmu_int_mask1_reg_index, + 0, + 0, + &qmu_int_mask1); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + qmu_int_mask2_reg_index, + 0, + 0, + &qmu_int_mask2); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + qmu_int_mask3_reg_index, + 0, + 0, + &qmu_int_mask3); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + rc = dpp_reg_write(dev_id, + qmu_int_mask4_reg_index, + 0, + 0, + &qmu_int_mask4); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + + rc = dpp_reg_write(dev_id, + qmu_int_mask5_reg_index, + 0, + 0, + &qmu_int_mask5); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + return DPP_OK; +} + +/***********************************************************/ +/** 读取qmu中断状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/07/09 +************************************************************/ +DPP_STATUS dpp_tm_qmu_int_state_get(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + + rc = dpp_reg_fields_print_with_def(dev_id, ETM_QMU_QLIST_CFGMT_FIFO_STATEr, 0, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_fields_print_with_def"); + rc = dpp_reg_fields_print_with_def(dev_id, ETM_QMU_CMD_SCH_CFGMT_FIFO_STATEr, 0, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_fields_print_with_def"); + + return DPP_OK; +} + +/***********************************************************/ +/** 配置shape中断屏蔽 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param shape_int_mask_flag 0:不屏蔽 1:屏蔽 +* @param 写1 屏蔽ETM_CGAVD_RD_CPU_OR_RAMr +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/4/10 +************************************************************/ +DPP_STATUS dpp_tm_shape_int_mask_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 shape_int_mask_flag) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CRDT_SHAP_INT_MASK_REG_T shap_int_mask = {0}; + + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, shape_int_mask_flag, 0, 1); + + shap_int_mask.pp_c_token_min_int_mask = shape_int_mask_flag; + rc = dpp_reg_write(dev_id, + ETM_CRDT_SHAP_INT_MASK_REGr, + 0, + 0, + &shap_int_mask); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_write"); + + + return DPP_OK; +} + + +/***********************************************************/ +/** 读取shape中断状态 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author whuashan @date 2019/4/10 +************************************************************/ +DPP_STATUS dpp_tm_shape_int_state_get(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + DPP_ETM_CRDT_SHAP_INT_REG_T shap_int_reg_t = {0}; + + rc = dpp_reg_fields_print_with_def(dev_id, ETM_CRDT_SHAP_INT_REGr, 0, 0); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_reg_fields_print_with_def"); + + + ZXIC_COMM_PRINT("pp_c_token_min_int : %d\n", shap_int_reg_t.pp_c_token_min_int); + + return DPP_OK; +} + + +/***********************************************************/ +/** 配置dpp tm所有模块中断屏蔽 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param int_mask_flag 0:不屏蔽 1:屏蔽 +* @param +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/07/09 +************************************************************/ +DPP_STATUS dpp_tm_int_mask_set(ZXIC_UINT32 dev_id, + ZXIC_UINT32 int_mask_flag) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, int_mask_flag, 0, 1); + + + rc = dpp_tm_cfgmt_int_mask_set_diag(dev_id, + int_mask_flag, + int_mask_flag, + int_mask_flag, + int_mask_flag, + int_mask_flag, + int_mask_flag, + int_mask_flag); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_int_mask_set_diag"); + + rc = dpp_tm_olif_int_mask_set(dev_id, int_mask_flag); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_olif_int_mask_set"); + + rc = dpp_tm_cgavd_int_mask_set(dev_id, int_mask_flag); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_int_mask_set"); + + rc = dpp_tm_shape_int_mask_set(dev_id, int_mask_flag); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_shape_int_mask_set"); + + rc = dpp_tm_crdt_int_mask_set(dev_id, int_mask_flag); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_crdt_int_mask_set"); + + rc = dpp_tm_qmu_int_mask_set(dev_id, int_mask_flag); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_int_mask_set"); + + + return DPP_OK; +} + +/***********************************************************/ +/** 打印dpp tm所有模块中断状态 +* @param tm_type 0-ETM,1-FTM +* @param dev_id 设备编号 +* @param +* @param +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author yjd @date 2015/07/09 +************************************************************/ +DPP_STATUS diag_dpp_tm_int(ZXIC_UINT32 dev_id) +{ + DPP_STATUS rc = DPP_OK; + + ZXIC_COMM_PRINT("**************************************\n"); + ZXIC_COMM_PRINT("dpp tm cfgmt int state\n"); + ZXIC_COMM_PRINT("**************************************\n"); + rc = dpp_tm_cfgmt_int_state_get_diag(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cfgmt_int_state_get_diag"); + + ZXIC_COMM_PRINT("**************************************\n"); + ZXIC_COMM_PRINT("dpp tm olif int state\n"); + ZXIC_COMM_PRINT("**************************************\n"); + rc = dpp_tm_olif_int_state_get(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_olif_int_state_get"); + + ZXIC_COMM_PRINT("**************************************\n"); + ZXIC_COMM_PRINT("dpp tm cgavd int state\n"); + ZXIC_COMM_PRINT("**************************************\n"); + rc = dpp_tm_cgavd_int_state_get(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_cgavd_int_state_get"); + + ZXIC_COMM_PRINT("**************************************\n"); + ZXIC_COMM_PRINT("dpp tm tmmu int state\n"); + ZXIC_COMM_PRINT("**************************************\n"); + rc = dpp_tm_tmmu_int_state_get(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_tmmu_int_state_get"); + + ZXIC_COMM_PRINT("**************************************\n"); + ZXIC_COMM_PRINT("dpp tm shap int state\n"); + ZXIC_COMM_PRINT("**************************************\n"); + rc = dpp_tm_shape_int_state_get(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_shape_int_state_get"); + + ZXIC_COMM_PRINT("**************************************\n"); + ZXIC_COMM_PRINT("dpp tm crdt int state\n"); + ZXIC_COMM_PRINT("**************************************\n"); + rc = dpp_tm_crdt_int_state_get(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_crdt_int_state_get"); + + ZXIC_COMM_PRINT("**************************************\n"); + ZXIC_COMM_PRINT("dpp tm qmu int state\n"); + ZXIC_COMM_PRINT("**************************************\n"); + rc = dpp_tm_qmu_int_state_get(dev_id); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_int_state_get"); + + ZXIC_COMM_PRINT("**************************************\n"); + ZXIC_COMM_PRINT("dpp tm qmu int case_no\n"); + ZXIC_COMM_PRINT("**************************************\n"); + ZXIC_COMM_PRINT("g_qmu_init_case_no = 0x%x\n", g_qmu_init_case_no); + + return DPP_OK; +} + + +/***********************************************************/ +/** 获取tm.c中qmu_init_set中配置的case_num +* @param tm_type 0-ETM,1-FTM +* @param dev_id 设备编号 +* @param +* @param +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/04/15 +************************************************************/ +DPP_STATUS dpp_tm_case_no_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *case_no) +{ + ZXIC_COMM_CHECK_DEV_POINT(dev_id, case_no); + + *case_no = g_qmu_init_case_no; + + return DPP_OK; +} + +/***********************************************************/ +/** 配置tm授权价值总接口,包含qmu授权价值、shap授权价值、FTM对应授权价值版本设置 +* @param dev_id 设备编号 +* @param tm_type 0-ETM,1-FTM +* @param credit_value 授权价值,默认值是0x5feByte +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author xuhb @date 2020/08/13 +************************************************************/ +DPP_STATUS dpp_tm_credit_value_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 credit_value) +{ + DPP_STATUS rc = DPP_OK; + + rc = dpp_tm_qmu_credit_value_set(dev_id, credit_value); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_qmu_credit_value_set"); + + rc = dpp_tm_shap_crd_grain_set(dev_id, credit_value); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "dpp_tm_shap_crd_grain_set"); + + return DPP_OK; +} + +#endif +#endif + +#if ZXIC_REAL("TM_CPU_SOFT_RESET") +#if 0 +/***********************************************************/ +/** 设置TM的全局变量,shape_para只保存profile被使用的数量,整形相关参数从寄存器中重新读取 +* @param dev_id +* @param size data_buff的长度 +* @param p_data_buff 需要恢复的内容 +* +* @return +* @remark 无 +* @see +* @author XXX @date 2017/03/09 +************************************************************/ +DPP_STATUS dpp_tm_glb_mgr_set(ZXIC_UINT32 dev_id, ZXIC_UINT32 size, ZXIC_UINT8 *p_data_buff) +{ + DPP_STATUS rc = DPP_OK; + ZXIC_UINT32 shape_table_profile_num = 128; + static ZXIC_UINT32 etm_shape_num[22][128] = {{0}}; + ZXIC_UINT32 total_para_id = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + DPP_TM_SHAPE_PARA_TABLE shap_para_tbl_t = {0}; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 2); + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_data_buff); + + rc = zxic_comm_mutex_lock(&g_dpp_tm_global_var_rw_mutex); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "zxic_comm_mutex_lock"); + + if (size != (22 * 128 * sizeof(ZXIC_UINT32))) + { + ZXIC_COMM_TRACE_DEV_ERROR(dev_id, "date is not complete.size[%d] err!!\n", size); + rc = zxic_comm_mutex_unlock(&g_dpp_tm_global_var_rw_mutex); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "zxic_comm_mutex_unlock"); + + return DPP_ERR; + } + + ZXIC_COMM_MEMCPY(etm_shape_num, p_data_buff, 22 * 128 * sizeof(ZXIC_UINT32)); + + + /* ETM: set flow and se profile to cpu mem */ + for (i = 0; i < 22; i++) + { + for (j = 0; j < shape_table_profile_num; j++) + { + total_para_id = i * shape_table_profile_num + j; + + rc = dpp_tm_shape_para_get(dev_id, total_para_id, &shap_para_tbl_t); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT_UNLOCK(dev_id, rc, "dpp_tm_shape_para_get", &g_dpp_tm_global_var_rw_mutex); + + g_dpp_etm_shape_para_table[dev_id][i][j].shape_num = etm_shape_num[i][j]; + g_dpp_etm_shape_para_table[dev_id][i][j].shape_cbs = shap_para_tbl_t.shape_cbs; + g_dpp_etm_shape_para_table[dev_id][i][j].shape_cir = shap_para_tbl_t.shape_cir; + + } + } + + + rc = zxic_comm_mutex_unlock(&g_dpp_tm_global_var_rw_mutex); + ZXIC_COMM_CHECK_DEV_RC_NO_ASSERT(dev_id, rc, "zxic_comm_mutex_unlock"); + + return DPP_OK; + +} + +/***********************************************************/ +/** 获取TM的全局变量,shape_para只保存profile被使用的数量,整形相关参数从寄存器中重新读取 +* @param dev_id +* @param p_flag 上层释放data_buff的标志,1:需要上层free,0:不需要上层free +* @param p_size data_buff的长度 +* @param pp_data_buff 二级指针(指向函数内部malloc空间的地址) +* +* @return +* @remark 无 +* @see +* @author XXX @date 2017/03/09 +************************************************************/ +DPP_STATUS dpp_tm_glb_mgr_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_flag, ZXIC_UINT32 *p_size, ZXIC_UINT8 **pp_data_buff) +{ + ZXIC_UINT32 size = 0; + static ZXIC_UINT32 etm_shape_num[22][128] = {{0}}; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 j = 0; + + ZXIC_COMM_CHECK_DEV_INDEX_NO_ASSERT(dev_id, dev_id, 0, DPP_DEV_CHANNEL_MAX - 2); + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_flag); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_size); + + size = 22 * 128 * sizeof(ZXIC_UINT32); + *pp_data_buff = ZXIC_COMM_MALLOC(size); + ZXIC_COMM_CHECK_DEV_POINT(dev_id, *pp_data_buff); + + for (i = 0; i < 22; i++) + { + for (j = 0; j < 128; j++) + { + etm_shape_num[i][j] = g_dpp_etm_shape_para_table[dev_id][i][j].shape_num; + } + + } + + ZXIC_COMM_MEMCPY(*pp_data_buff, etm_shape_num, 22 * 128 * sizeof(ZXIC_UINT32)); + + + *p_flag = 1; + *p_size = size; + + return DPP_OK; +} + +/***********************************************************/ +/** 获取TM的全局变量大小,shape_para只保存profile被使用的数量,整形相关参数从寄存器中重新读取 +* @param dev_id +* @param p_size data_buff的长度 +* +* @return +* @remark 无 +* @see +* @author XXX @date 2017/03/09 +************************************************************/ +DPP_STATUS dpp_tm_glb_size_get(ZXIC_UINT32 dev_id, ZXIC_UINT32 *p_size) +{ + + ZXIC_COMM_CHECK_DEV_POINT(dev_id, p_size); + + *p_size = 22 * 128 * sizeof(ZXIC_UINT32); + + return DPP_OK; +} + +#endif +#endif + + + + + + + + + + + + + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/reg/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/reg/Kbuild.include new file mode 100644 index 0000000..6fdfdb7 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/reg/Kbuild.include @@ -0,0 +1,2 @@ +cur_dir := en_np/sdk/source/dev/reg/ +src_files += $(addprefix $(cur_dir),$(notdir $(wildcard $(dinghai_root)/$(cur_dir)*.c))) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/reg/dpp_module.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/reg/dpp_module.c new file mode 100755 index 0000000..9268caf --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/reg/dpp_module.c @@ -0,0 +1,294 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_module.c +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : 石金锋 +* 完成日期 : 2014/02/10 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ +#include "zxic_common.h" +#include "dpp_type_api.h" +#include "dpp_module.h" +#include "dpp_dev.h" +#include "dpp_reg_struct.h" +#include "dpp_reg_api.h" + +/***********************************************************/ +/** dpp通用读寄存器函数 +* @param dev_id 设备id +* @param addr 地址读地址 +* @param p_data 返回数据 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author 石金锋 @date 2014/01/28 +************************************************************/ +DPP_STATUS dpp_read(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 *p_data) +{ + return dpp_dev_read_channel(dev, + addr, + 1, + p_data); +} + +/***********************************************************/ +/** dpp通用写寄存器函数 +* @param dev_id 设备id +* @param addr 地址写地址 +* @param p_data 写入数据 +* +* @return 0表示成功 非0表示操作失败 +* @remark 无 +* @see +* @author 石金锋 @date 2014/01/28 +************************************************************/ +DPP_STATUS dpp_write(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 *p_data) +{ + return dpp_dev_write_channel(dev, + addr, + 1, + p_data); +} + +#if ZXIC_REAL("SE") + +/***********************************************************/ +/** SE读接口 +* @param dev_id 设备号 +* @param addr 地址 +* @param p_data 数据 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/11/15 +************************************************************/ +DPP_STATUS dpp_se_read(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 *p_data) +{ + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data); + + return dpp_read(dev, addr, p_data); +} + +/***********************************************************/ +/** SE写接口 +* @param dev_id 设备号 +* @param addr 地址 +* @param p_data 数据 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/11/15 +************************************************************/ +DPP_STATUS dpp_se_write(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 *p_data) +{ + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data); + + return dpp_write(dev, addr, p_data); +} +#endif + +#if ZXIC_REAL("SE ALG") +/***********************************************************/ +/** se alg模块读寄存器函数 +* @param dev_id 设备id +* @param addr 地址 读地址 +* @param p_data 返回数据 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 王春雷 @date 2014/04/03 +************************************************************/ +DPP_STATUS dpp_se_alg_read(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 *p_data) +{ + DPP_STATUS rtn = DPP_OK; + + ZXIC_UINT32 cpu_rd_rdy_addr = SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0048; + ZXIC_UINT32 ind_data0_addr = SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x004c; + ZXIC_UINT32 ind_cmd_addr = SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0004; + ZXIC_UINT32 cpu_rd_rdy_reg = 0; + ZXIC_UINT32 ind_data0_reg = 0; + ZXIC_UINT32 ind_cmd_reg = 0; + ZXIC_UINT32 cmd_data = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 cpu_rdy = 0; + ZXIC_UINT32 read_cnt = 0; + ZXIC_UINT32 recheck_flag = 20; + + ZXIC_MUTEX_T *p_alg_mutex = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data); + + ind_data0_reg = dpp_reg_addr_convert(DEV_ID(dev), SE4K, DPP_REG_FLAG_DIRECT,ind_data0_addr); + ind_cmd_reg = dpp_reg_addr_convert(DEV_ID(dev), SE4K, DPP_REG_FLAG_DIRECT,ind_cmd_addr); + cpu_rd_rdy_reg = dpp_reg_addr_convert(DEV_ID(dev), SE4K, DPP_REG_FLAG_DIRECT,cpu_rd_rdy_addr); + + rtn = dpp_dev_opr_mutex_get(DEV_ID(dev), DPP_DEV_MUTEX_T_REG, &p_alg_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_dev_opr_mutex_get"); + + rtn = zxic_comm_mutex_lock(p_alg_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "zxic_comm_mutex_lock"); + + /* dpp_module_get_se_alg_baseaddr(&base_addr); */ + + cmd_data = ((ZXIC_UINT32)0x1 << 31) | ((ZXIC_UINT32)0xF << 17) | addr; + rtn = dpp_dev_write_channel(dev, ind_cmd_reg, 1, &cmd_data); + ZXIC_COMM_CHECK_DEV_RC_UNLOCK(DEV_ID(dev), rtn, "dpp_dev_write_channel", p_alg_mutex); + + while (!(cpu_rdy & 0x1)) + { + rtn = dpp_dev_read_channel(dev, cpu_rd_rdy_reg, 1, &cpu_rdy); + ZXIC_COMM_CHECK_DEV_RC_UNLOCK(DEV_ID(dev), rtn, "dpp_dev_read_channel", p_alg_mutex); + + read_cnt++; + /* zxic_comm_sleep(10); */ + + if (read_cnt > DPP_RD_CNT_MAX * DPP_RD_CNT_MAX) + { + if (recheck_flag > 0) + { + recheck_flag--; + read_cnt = 0; + rtn = dpp_dev_write_channel(dev, ind_cmd_reg, 1, &cmd_data); + ZXIC_COMM_CHECK_DEV_RC_UNLOCK(DEV_ID(dev), rtn, "dpp_dev_write_channel", p_alg_mutex); + } + else + { + ZXIC_COMM_PRINT("Error!!! dpp_se_alg_read get cpu_rd_rdone failed!!!\n"); + zxic_comm_mutex_unlock(p_alg_mutex); + /* ZXIC_COMM_ASSERT(0); */ /* xjw mod for OLT to not assert because of causing reboot at 18.8.7 */ + return DPP_ERR; + } + } + + /* ZXIC_COMM_CHECK_DEV_INDEX(dev_id, read_cnt, 0, DPP_RD_CNT_MAX); */ + } + + for (i = 0; i < 16; i++) + { + rtn = dpp_dev_read_channel(dev, ind_data0_reg + 4 * i, 1, p_data + 15 - i); + ZXIC_COMM_CHECK_DEV_RC_UNLOCK(DEV_ID(dev), rtn, "dpp_dev_read_channel", p_alg_mutex); + } + + rtn = zxic_comm_mutex_unlock(p_alg_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "zxic_comm_mutex_unlock"); + + return DPP_OK; +} + +/***********************************************************/ +/** se alg模块写寄存器函数 +* @param dev_id 设备id +* @param addr 地址 读地址 +* @param p_data 返回数据 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 王春雷 @date 2014/04/03 +************************************************************/ +DPP_STATUS dpp_se_alg_write(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 *p_data) +{ + DPP_STATUS rtn = DPP_OK; + + ZXIC_UINT32 ind_data0_addr = SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0008; + ZXIC_UINT32 cmd_data = 0; + ZXIC_UINT32 ind_cmd_addr = SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0004; + ZXIC_UINT32 ind_data0_reg = 0; + ZXIC_UINT32 ind_cmd_reg = 0; + ZXIC_UINT32 i = 0; + ZXIC_MUTEX_T *p_alg_mutex = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), DEV_ID(dev), 0, DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data); + + ind_data0_reg = dpp_reg_addr_convert(DEV_ID(dev), SE4K, DPP_REG_FLAG_DIRECT, ind_data0_addr); + ind_cmd_reg = dpp_reg_addr_convert(DEV_ID(dev), SE4K, DPP_REG_FLAG_DIRECT, ind_cmd_addr); + + /* dpp_module_get_se_alg_baseaddr(&base_addr); */ + rtn = dpp_dev_opr_mutex_get(DEV_ID(dev), DPP_DEV_MUTEX_T_REG, &p_alg_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "dpp_dev_opr_mutex_get"); + + rtn = zxic_comm_mutex_lock(p_alg_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "zxic_comm_mutex_lock"); + + /* write data */ + for (i = 0; i < 16; i++) + { + ZXIC_COMM_TRACE_DEV_DEBUG(DEV_ID(dev), "dpp_se_alg_write: addr=0x%08x, data=0x%08x.\n", ind_data0_reg + 4 * i, *(p_data + 15 - i)); + rtn = dpp_dev_write_channel(dev, ind_data0_reg + 4 * i, 1, p_data + 15 - i); + ZXIC_COMM_CHECK_DEV_RC_UNLOCK(DEV_ID(dev), rtn, "dpp_dev_write_channel", p_alg_mutex); + } + + /* write cmd */ + /* cmd_data = ((ZXIC_UINT32)0xF << 17) | addr; */ + cmd_data = addr & 0x1fffff; /* mod by tf */ + ZXIC_COMM_TRACE_DEV_DEBUG(DEV_ID(dev), "dpp_se_alg_write: addr=0x%08x, data=0x%08x.\n", ind_cmd_reg, cmd_data); + rtn = dpp_dev_write_channel(dev, ind_cmd_reg, 1, &cmd_data); + ZXIC_COMM_CHECK_DEV_RC_UNLOCK(DEV_ID(dev), rtn, "dpp_dev_write_channel", p_alg_mutex); + + rtn = zxic_comm_mutex_unlock(p_alg_mutex); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rtn, "zxic_comm_mutex_unlock"); + + return DPP_OK; +} + +#endif + +#if ZXIC_REAL("PPU") +/***********************************************************/ +/** PPU读接口 +* @param dev_id 设备号 +* @param addr 地址 +* @param p_data 数据 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/11/15 +************************************************************/ +DPP_STATUS dpp_ppu_read(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 *p_data) +{ + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data); + + return dpp_read(dev, addr, p_data); +} + +/***********************************************************/ +/** PPU写接口 +* @param dev_id 设备号 +* @param addr 地址 +* @param p_data 数据 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author ls @date 2016/11/15 +************************************************************/ +DPP_STATUS dpp_ppu_write(DPP_DEV_T *dev, ZXIC_UINT32 addr, ZXIC_UINT32 *p_data) +{ + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_data); + + return dpp_write(dev, addr, p_data); +} +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/reg/dpp_pci.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/reg/dpp_pci.c new file mode 100755 index 0000000..b900e33 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/reg/dpp_pci.c @@ -0,0 +1,89 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_pci.c +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : 石金锋 +* 完成日期 : 2014/02/10 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: 代码规范性修改 +* 修改日期: 2014/02/10 +* 版 本 号: +* 修 改 人: 丁金凤 +* 修改内容: +***************************************************************/ +#include "zxic_common.h" +#include "dpp_type_api.h" +#include "dpp_pci.h" +#include "dpp_dev.h" + +/***********************************************************/ +/** +* @param abs_addr +* @param p_data +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/02/14 +************************************************************/ +ZXIC_UINT32 dpp_pci_write32(DPP_DEV_T *dev, ZXIC_ADDR_T abs_addr, ZXIC_UINT32 *p_data) +{ + /* ZXIC_UINT32 rtn = 0; */ + ZXIC_UINT32 data = 0; + ZXIC_UINT64 addr = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(p_data); + + data = *p_data; + + if (zxic_comm_is_big_endian()) + { + data = ZXIC_COMM_CONVERT32(data); + } + + addr = abs_addr + SYS_VF_NP_BASE_OFFSET; + *((ZXIC_VOL ZXIC_UINT32 *)addr) = data; + + return DPP_OK; +} + +/***********************************************************/ +/** +* @param abs_addr +* @param p_data +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/02/14 +************************************************************/ +ZXIC_UINT32 dpp_pci_read32(DPP_DEV_T *dev, ZXIC_ADDR_T abs_addr, ZXIC_UINT32 *p_data) +{ + ZXIC_UINT32 data = 0; + ZXIC_UINT64 addr = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_POINT(p_data); + + addr = abs_addr + SYS_VF_NP_BASE_OFFSET; + data = *((ZXIC_VOL ZXIC_UINT32 *)addr); + + if (zxic_comm_is_big_endian()) + { + data = ZXIC_COMM_CONVERT32(data); + } + *p_data = data; + + if (0xdadedade == *p_data) + { + ZXIC_COMM_TRACE_DEBUG("PCIE time out err happening at addr[0x%llx]\n", abs_addr); + } + + return DPP_OK; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/reg/dpp_reg_api.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/reg/dpp_reg_api.c new file mode 100755 index 0000000..c732daa --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/reg/dpp_reg_api.c @@ -0,0 +1,544 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_reg.c +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : 王春雷 +* 完成日期 : 2014/02/12 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#include "zxic_common.h" +#include "dpp_type_api.h" +#include "dpp_module.h" +#include "dpp_dev.h" +#include "dpp_reg_api.h" +#include "dpp_reg_info.h" +#include "dpp_agent_channel.h" +#include "dpp_pci.h" + +#define REG_DATA_MAX (512/32) + +static DPP_REG_OFFSET_ADDR g_module_offset_addr[] = +{ + {DTB4K, BAR_4K_DTB, SYS_DTB_BASE_ADDR + MODULE_DTB_ENQ_BASE_ADDR}, + {STAT4K, BAR_4K_ETCAM, SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR}, + {PPU4K, BAR_4K_CLS0, SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x4000}, + {SE4K, BAR_4K_SE, SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR}, + {SMMU14K, BAR_4K_SMMU1, SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR } +}; + +/***********************************************************/ +/** 获取寄存器属性 +* @param reg_no 寄存器编号 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 王春雷 @date 2014/04/17 +************************************************************/ +DPP_REG_T *dpp_reg_info_get(ZXIC_UINT32 reg_no) +{ + ZXIC_COMM_CHECK_INDEX_RETURN_NULL(reg_no, 0, REG_ENUM_MAX_VALUE - 1); + + return (&g_dpp_reg_info[reg_no]); +} + +/***********************************************************/ +/** 根据寄存器编号获得寄存器芯片内绝对地址 +* @param reg_no +* @param m_offset +* @param n_offset +* +* @return +* @remark 无 +* @see +* @author 王春雷 @date 2014/03/19 +************************************************************/ +ZXIC_UINT32 dpp_reg_get_reg_addr(ZXIC_UINT32 reg_no, ZXIC_UINT32 m_offset, ZXIC_UINT32 n_offset) +{ + ZXIC_UINT32 addr = 0; + DPP_REG_T *p_reg_info = NULL; + + ZXIC_COMM_CHECK_INDEX(reg_no, 0, REG_ENUM_MAX_VALUE - 1); + + p_reg_info = dpp_reg_info_get(reg_no); + ZXIC_COMM_CHECK_POINT(p_reg_info); + + /* 计算写地址 */ + addr = p_reg_info->addr; + + if (p_reg_info->array_type & DPP_REG_UNI_ARRAY) + { + if (n_offset > (p_reg_info->n_size - 1)) + ZXIC_COMM_TRACE_ERROR("reg n_offset is out of range, reg_no:%d, n:%d, size:%d\n", + reg_no, n_offset, p_reg_info->n_size - 1); + + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(addr, n_offset * p_reg_info->n_step); + addr += n_offset * p_reg_info->n_step; + } + else if (p_reg_info->array_type & DPP_REG_BIN_ARRAY) + { + if ((n_offset > (p_reg_info->n_size - 1)) || (m_offset > (p_reg_info->m_size - 1))) + ZXIC_COMM_TRACE_ERROR("reg n_offset or m_offset is out of range, reg_no:%d, n:%d, n_size:%d, m:%d, m_size:%d,\n", + reg_no, n_offset, p_reg_info->n_size - 1, m_offset, p_reg_info->m_size - 1); + + ZXIC_COMM_CHECK_INDEX_MUL_OVERFLOW_NO_ASSERT(m_offset, p_reg_info->m_step); + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT((m_offset * (p_reg_info->m_step)), (n_offset * (p_reg_info->n_step))); + ZXIC_COMM_CHECK_INDEX_ADD_OVERFLOW_NO_ASSERT(addr, (m_offset * (p_reg_info->m_step)) + (n_offset * (p_reg_info->n_step))); + addr += (m_offset * (p_reg_info->m_step)) + (n_offset * (p_reg_info->n_step)); + } + + return addr; +} + +/***********************************************************/ +/** 判断是否为4K寄存器 +* @param reg_module +* +* @return +* @remark 无 +* @see +* @author cq @date 2023/11/29 +************************************************************/ +BOOLEAN dpp_4k_reg(ZXIC_UINT32 reg_module) +{ + if((DTB4K<=reg_module)&&(SMMU14K>=reg_module)) + { + return ZXIC_TRUE; + } + + return ZXIC_FALSE; +} + +/***********************************************************/ +/** 获取NP对应模块的映射地址偏移(riscv或者非4K寄存器不做转换,host根据映射情况做转换) +* @param dev_id +* @param reg_module +* @param flags 标志位,DPP_REG_FLAG_INDIRECT DPP_REG_FLAG_DIRECT +* @param addr +* +* @return 映射地址 +* @remark 无 +* @see +* @author cq @date 2023/11/29 +************************************************************/ +ZXIC_UINT32 dpp_reg_addr_convert(ZXIC_UINT32 dev_id, ZXIC_UINT32 reg_module,ZXIC_UINT32 flags, ZXIC_UINT32 addr) +{ + ZXIC_UINT32 convert_addr = addr; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 cluster_index = 0; + ZXIC_UINT32 index_4k = 0; + ZXIC_UINT32 size_4k = 4096; + ZXIC_UINT32 module_addr_offset = 0; + ZXIC_UINT32 dtb_addr_offset = SYS_DTB_BASE_ADDR + MODULE_DTB_ENQ_BASE_ADDR; + + if(DPP_REG_FLAG_INDIRECT == flags) + { + return addr; + } + + for(i=0;i<(sizeof(g_module_offset_addr)/sizeof(DPP_REG_OFFSET_ADDR));i++) + { + if(reg_module==g_module_offset_addr[i].reg_module) + { + module_addr_offset = g_module_offset_addr[i].addr_offset; + if(PPU4K==reg_module) + { + cluster_index = (addr-module_addr_offset)/DPP_PPU_CLUSTER_SPACE_SIZE; + index_4k = g_module_offset_addr[i].index_4k + cluster_index; + module_addr_offset += cluster_index * DPP_PPU_CLUSTER_SPACE_SIZE; + } + else + { + index_4k = g_module_offset_addr[i].index_4k; + } + convert_addr = ((addr + (size_4k * index_4k) + dtb_addr_offset)>module_addr_offset) + ? (addr + (size_4k * index_4k) + dtb_addr_offset - module_addr_offset) : addr; + } + } + + return convert_addr; +} + +/***********************************************************/ +/** 通用寄存器写函数 +* @param dev_id 设备号,支持多芯片 +* @param reg_no 寄存器编号 +* @param m_offset 二元寄存器的m偏移 +* @param n_offset 一元寄存器或二元寄存器的n偏移 +* @param p_data 数据指针 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 王春雷 @date 2014/02/12 +************************************************************/ +DPP_STATUS dpp_reg_write(DPP_DEV_T *dev, ZXIC_UINT32 reg_no, ZXIC_UINT32 m_offset, ZXIC_UINT32 n_offset, ZXIC_VOID *p_data) +{ + DPP_STATUS rc = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 addr = 0; + +#ifdef DPP_FLOW_HW_INIT + ZXIC_UINT32 convert_addr = 0; +#endif + + ZXIC_UINT32 p_buff[REG_DATA_MAX] = {0}; + ZXIC_UINT32 temp_data = 0; + ZXIC_UINT32 reg_type = 0; + ZXIC_UINT32 reg_module = 0; + ZXIC_UINT32 reg_width = 0; + DPP_REG_T *p_reg_info = NULL; + DPP_FIELD_T *p_field_info = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev), DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), reg_no, 0, REG_ENUM_MAX_VALUE - 1); + ZXIC_COMM_CHECK_POINT(p_data); + + p_reg_info = dpp_reg_info_get(reg_no); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_reg_info); + p_field_info = p_reg_info->p_fields; + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_field_info); + reg_type = p_reg_info->flags; + reg_module = p_reg_info->module_no; + reg_width = p_reg_info->width; + ZXIC_COMM_CHECK_INDEX_UPPER(reg_width, REG_DATA_MAX*4); + +#ifndef ZXIC_OS_WIN +#ifdef DPP_FOR_LLT + if (dpp_stump_reg_en_check(DEV_ID(dev), reg_no) && (p_reg_info->flags == DPP_REG_FLAG_DIRECT || p_reg_info->flags == DPP_REG_FLAG_WO | DPP_REG_FLAG_DIRECT)) + { + rc = dpp_stump_reg_write(DEV_ID(dev), + reg_no, + m_offset, + n_offset, + p_data); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stump_reg_write"); + + return DPP_OK; + } +#endif +#endif + + /* 提取各字段数据,按各字段实际bit位宽进行拼装 */ + for (i = 0; i < p_reg_info->field_num; i++) + { + if (p_field_info[i].len <= 32) + { + /* lint -e64 */ + temp_data = *((ZXIC_UINT32 *)p_data + i) & ZXIC_COMM_GET_BIT_MASK(ZXIC_UINT32, p_field_info[i].len); + rc = zxic_comm_write_bits_ex((ZXIC_UINT8 *)p_buff, + p_reg_info->width * 8, + temp_data, + p_field_info[i].msb_pos, + p_field_info[i].len); + /* lint +e64 */ + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "zxic_comm_write_bits_ex"); + } + } + + ZXIC_COMM_TRACE_DEV_DEBUG(DEV_ID(dev), "zxic_comm_write_bits_ex data = 0x%08x.\n", p_buff[0]); + /* 若host cpu为小端字节序,则以4字节为单位对数据进行字节序转换 */ + if(!zxic_comm_is_big_endian()) + { + for (i = 0; i < ((p_reg_info->width) / 4); i++) + { + p_buff[i] = ZXIC_COMM_CONVERT32(p_buff[i]); + + /* for debug */ + ZXIC_COMM_TRACE_DEV_DEBUG(DEV_ID(dev), "ZXIC_COMM_CONVERT32 data = 0x%08x.\n", p_buff[i]); + } + } + + /* 计算写地址 */ + addr = dpp_reg_get_reg_addr(reg_no, m_offset, n_offset);/* 通过寄存器编号等三个参数获得寄存器的基地址 */ + + ZXIC_COMM_TRACE_DEV_DEBUG(DEV_ID(dev), "reg_no = %d. m_offset = %d n_offset = %d\n", reg_no,m_offset,n_offset); + ZXIC_COMM_TRACE_DEV_DEBUG(DEV_ID(dev), "baseaddr = 0x%08x.\n", addr); + +#ifdef DPP_FLOW_HW_INIT + if(dpp_4k_reg(reg_module)) + { + /* 调用寄存器写接口 */ + convert_addr = dpp_reg_addr_convert(DEV_ID(dev), reg_module, reg_type, addr); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_reg_info->p_write_fun); + rc = p_reg_info->p_write_fun(dev, convert_addr, p_buff); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "p_reg_info->p_write_fun"); + } +#else + if(DTB4K == reg_module) + { + /* 调用寄存器写接口 */ + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_reg_info->p_write_fun); + rc = p_reg_info->p_write_fun(dev, addr, p_buff); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "p_reg_info->p_write_fun"); + } +#endif + else + { + /* 调用代理通道寄存器写接口 */ + rc = dpp_agent_channel_reg_write(dev, reg_type, reg_no, reg_width, addr, p_buff); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_agent_channel_reg_write"); + } + + return DPP_OK; +} + +/***********************************************************/ +/** 通用寄存器读函数 +* @param dev_id 设备号,支持多芯片 +* @param reg_no 寄存器编号 +* @param m_offset 二元寄存器的m偏移 +* @param n_offset 一元寄存器或二元寄存器的n偏移 +* @param p_data 数据指针 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 王春雷 @date 2014/02/12 +************************************************************/ +DPP_STATUS dpp_reg_read(DPP_DEV_T *dev, ZXIC_UINT32 reg_no, ZXIC_UINT32 m_offset, ZXIC_UINT32 n_offset, ZXIC_VOID *p_data) +{ + DPP_STATUS rc = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 addr = 0; +#ifdef DPP_FLOW_HW_INIT + ZXIC_UINT32 convert_addr = 0; +#endif + ZXIC_UINT32 reg_type = 0; + ZXIC_UINT32 p_buff[REG_DATA_MAX] = {0}; + ZXIC_UINT32 reg_module = 0; + ZXIC_UINT32 reg_width = 0; + DPP_REG_T *p_reg_info = NULL; + DPP_FIELD_T *p_field_info = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev), DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), reg_no, 0, REG_ENUM_MAX_VALUE - 1); + ZXIC_COMM_CHECK_POINT(p_data); + + p_reg_info = dpp_reg_info_get(reg_no); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_reg_info); + p_field_info = p_reg_info->p_fields; + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_field_info); + reg_type = p_reg_info->flags; + reg_module = p_reg_info->module_no; + reg_width = p_reg_info->width; + ZXIC_COMM_CHECK_INDEX_UPPER(reg_width, REG_DATA_MAX*4); + +#ifndef ZXIC_OS_WIN +#ifdef DPP_FOR_LLT + if (dpp_stump_reg_en_check(DEV_ID(dev), reg_no) && (p_reg_info->flags == DPP_REG_FLAG_DIRECT || p_reg_info->flags == DPP_REG_FLAG_WO | DPP_REG_FLAG_DIRECT)) + { + rc = dpp_stump_reg_read(DEV_ID(dev), + reg_no, + m_offset, + n_offset, + p_data); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stump_reg_read"); + + return DPP_OK; + } +#endif +#endif + + /* 计算读地址 */ + addr = dpp_reg_get_reg_addr(reg_no, m_offset, n_offset); +#ifdef DPP_FLOW_HW_INIT + if(dpp_4k_reg(reg_module)) + { + /* 调用寄存器读接口 */ + convert_addr = dpp_reg_addr_convert(DEV_ID(dev), reg_module, reg_type, addr); + ZXIC_COMM_CHECK_POINT(p_reg_info->p_read_fun); + rc = p_reg_info->p_read_fun(dev, convert_addr, p_buff); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "p_reg_info->p_read_fun"); + } +#else + if(DTB4K == reg_module) + { + /* 调用寄存器读接口 */ + ZXIC_COMM_CHECK_POINT(p_reg_info->p_read_fun); + rc = p_reg_info->p_read_fun(dev, addr, p_buff); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "p_reg_info->p_read_fun"); + } +#endif + else + { + /* 调用代理通道寄存器读接口 */ + rc = dpp_agent_channel_reg_read(dev, reg_type, reg_no, reg_width, addr, p_buff); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_agent_channel_reg_read"); + } + + /* 若host cpu为小端字节序,则以4字节为单位对数据进行字节序转换 */ + if (!zxic_comm_is_big_endian()) + { + for (i = 0; i < ((p_reg_info->width) / 4); i++) + { + /* for debug */ + + //printf("dpp_reg_read data = 0x%08x.\n", p_buff[i]); + ZXIC_COMM_TRACE_DEV_DEBUG(DEV_ID(dev), "dpp_reg_read data = 0x%08x.\n", p_buff[i]); + + p_buff[i] = ZXIC_COMM_CONVERT32(p_buff[i]); + } + } + + /* 提取各字段数据,每字段以ZXIC_UINT32形式返回 */ + for (i = 0; i < p_reg_info->field_num; i++) + { + /* lint -e64 */ + rc = zxic_comm_read_bits_ex((ZXIC_UINT8 *)p_buff, + p_reg_info->width * 8, + (ZXIC_UINT32 *)p_data + i, + p_field_info[i].msb_pos, + p_field_info[i].len); + ZXIC_COMM_CHECK_RC_NO_ASSERT(rc, "zxic_comm_read_bits_ex"); + /* lint +e64 */ + } + + return DPP_OK; +} + +/***********************************************************/ +/** 通过寄存器编号配置寄存器,仅适用于32bit位宽 + 的常规寄存器 +* @param dev_id 设备号 +* @param reg_no 寄存器编号 +* @param data 数据,32bit +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author XXX @date 2019/07/10 +************************************************************/ +DPP_STATUS dpp_reg_write32(DPP_DEV_T *dev, ZXIC_UINT32 reg_no, ZXIC_UINT32 data) +{ + DPP_STATUS rc = 0; + ZXIC_UINT32 addr = 0; + DPP_REG_T *p_reg_info = NULL; + ZXIC_UINT32 value = data; + ZXIC_UINT32 j = 0; + ZXIC_UINT32 k = 0; + ZXIC_UINT32 m_size = 0; + ZXIC_UINT32 n_size = 0; + ZXIC_UINT32 reg_type = 0; + // ZXIC_UINT32 reg_module = 0; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev), DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), reg_no, 0, REG_ENUM_MAX_VALUE - 1); + + p_reg_info = dpp_reg_info_get(reg_no); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_reg_info); + reg_type = p_reg_info->flags; + // reg_module = p_reg_info->module_no; + + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_reg_info->width, 4, 4); /* width must be 32bit */ + + m_size = (p_reg_info->m_size == 0) ? (1) : (p_reg_info->m_size); + n_size = (p_reg_info->n_size == 0) ? (1) : (p_reg_info->n_size); + + /* 计算读地址 */ + for (j = 0; j < m_size; j++) + { + for (k = 0; k < n_size; k++) + { +#ifndef ZXIC_OS_WIN +#ifdef DPP_FOR_LLT + if (dpp_stump_reg_en_check(DEV_ID(dev), reg_no) && (p_reg_info->flags == DPP_REG_FLAG_DIRECT)) + { + rc = dpp_stump_reg_write(DEV_ID(dev), + reg_no, + j, + k, + &data); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stump_reg_write"); + + return DPP_OK; + } +#endif +#endif + /* 计算写地址 */ + addr = dpp_reg_get_reg_addr(reg_no, j, k); + + /* 调用代理通道寄存器写接口 */ + rc = dpp_agent_channel_reg_write(dev, reg_type, reg_no, 4, addr, &value); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_agent_channel_reg_write"); + } + } + + return DPP_OK; +} + +/***********************************************************/ +/** 通过寄存器编号读取寄存器的值,仅适用于32bit位宽的常规寄存器 +* @param dev_id 设备号 +* @param reg_no 寄存器编号 +* @param m_offset 二元寄存器的m偏移 +* @param n_offset 一元寄存器或二元寄存器的n偏移 +* @param p_data 出参,返回读取寄存器数值 +* +* @return DPP_OK-成功,DPP_ERR-失败 +* @remark 无 +* @see +* @author 石金锋 @date 2015/03/09 +************************************************************/ +DPP_STATUS dpp_reg_read32(DPP_DEV_T *dev, ZXIC_UINT32 reg_no, ZXIC_UINT32 m_offset, ZXIC_UINT32 n_offset, ZXIC_UINT32 *p_data) +{ + DPP_STATUS rc = 0; + ZXIC_UINT32 addr = 0; + ZXIC_UINT32 reg_type = 0; + // ZXIC_UINT32 reg_module = 0; + ZXIC_UINT32 p_buff[REG_DATA_MAX] = {0}; + + DPP_REG_T *p_reg_info = NULL; + + ZXIC_COMM_CHECK_POINT(dev); + ZXIC_COMM_CHECK_INDEX_UPPER(DEV_ID(dev), DPP_DEV_CHANNEL_MAX - 1); + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), reg_no, 0, REG_ENUM_MAX_VALUE - 1); + ZXIC_COMM_CHECK_POINT(p_data); + + p_reg_info = dpp_reg_info_get(reg_no); + ZXIC_COMM_CHECK_DEV_POINT(DEV_ID(dev), p_reg_info); + reg_type = p_reg_info->flags; + // reg_module = p_reg_info->module_no; + + ZXIC_COMM_CHECK_DEV_INDEX(DEV_ID(dev), p_reg_info->width, 4, 4); /* width must be 32bit */ + +#ifndef ZXIC_OS_WIN +#ifdef DPP_FOR_LLT + if (dpp_stump_reg_en_check(DEV_ID(dev), reg_no) && (p_reg_info->flags == DPP_REG_FLAG_DIRECT)) + { + rc = dpp_stump_reg_read(DEV_ID(dev), + reg_no, + m_offset, + n_offset, + p_data); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_stump_reg_read"); + + return DPP_OK; + } +#endif +#endif + + /* 计算读地址 */ + addr = dpp_reg_get_reg_addr(reg_no, m_offset, n_offset); + + /* 调用代理通道寄存器读接口 */ + rc =dpp_agent_channel_reg_read(dev, reg_type, reg_no, 4, addr, p_buff); + ZXIC_COMM_CHECK_DEV_RC(DEV_ID(dev), rc, "dpp_agent_channel_reg_read"); + *p_data = p_buff[0]; + + return DPP_OK; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/reg/dpp_reg_info.c b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/reg/dpp_reg_info.c new file mode 100644 index 0000000..6fb5a54 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/sdk/source/dev/reg/dpp_reg_info.c @@ -0,0 +1,101395 @@ +#include "dpp_module.h" +#include "dpp_reg_struct.h" +#include "dpp_reg_info.h" + +DPP_FIELD_T g_etm_cfgmt_cpu_check_reg_reg[] = + { + {"cpu_check_reg", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_etm_cfgmt_cfgmt_blksize_reg[] = + { + {"cfgmt_blksize", DPP_FIELD_FLAG_RW, 1, 2, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_cfgmt_reg_int_state_reg_reg[] = + { + {"shap_int", DPP_FIELD_FLAG_RO, 6, 1, 0x0, 0x0}, + {"crdt_int", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"mmu_int", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"qmu_int", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"cgavd_int", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"olif_int", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"cfgmt_int_buf", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cfgmt_reg_int_mask_reg_reg[] = + { + {"shap_int_mask", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"crdt_int_mask", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"tmmu_int_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"qmu_int_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"cgavd_int_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"olif_int_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"cfgmt_int_buf_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_cfgmt_timeout_limit_reg[] = + { + {"timeout_limit", DPP_FIELD_FLAG_RW, 15, 16, 0xfff, 0x0}, + }; +DPP_FIELD_T g_etm_cfgmt_subsystem_rdy_reg_reg[] = + { + {"olif_rdy", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"qmu_rdy", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"cgavd_rdy", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"tmmu_rdy", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"shap_rdy", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"crdt_rdy", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cfgmt_subsystem_en_reg_reg[] = + { + {"subsystem_en_buf_31_28", DPP_FIELD_FLAG_RW, 31, 4, 0x0, 0x0}, + {"subsystem_en_buf_25_0", DPP_FIELD_FLAG_RW, 25, 26, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cfgmt_cfgmt_int_reg_reg[] = + { + {"cfgmt_int_buf", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cfgmt_qmu_work_mode_reg[] = + { + {"qmu_work_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cfgmt_cfgmt_ddr_attach_reg[] = + { + {"cfgmt_ddr_attach", DPP_FIELD_FLAG_RW, 9, 10, 0xf, 0x0}, + }; +DPP_FIELD_T g_etm_cfgmt_cnt_mode_reg_reg[] = + { + {"cfgmt_fc_count_mode", DPP_FIELD_FLAG_RW, 2, 1, 0x0, 0x0}, + {"cfgmt_count_rd_mode", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"cfgmt_count_overflow_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_cfgmt_clkgate_en_reg[] = + { + {"clkgate_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cfgmt_softrst_en_reg[] = + { + {"softrst_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_imem_prog_full_reg[] = + { + {"imem_prog_full_assert", DPP_FIELD_FLAG_RW, 24, 9, 0x9c, 0x0}, + {"imem_prog_full_negate", DPP_FIELD_FLAG_RW, 8, 9, 0x94, 0x0}, + }; +DPP_FIELD_T g_etm_olif_qmu_para_prog_full_reg[] = + { + {"qmu_para_prog_full_assert", DPP_FIELD_FLAG_RW, 26, 11, 0x370, 0x0}, + {"qmu_para_prog_full_negate", DPP_FIELD_FLAG_RW, 10, 11, 0x370, 0x0}, + }; +DPP_FIELD_T g_etm_olif_olif_int_mask_reg[] = + { + {"emem_dat_sop_err_mask", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"emem_dat_eop_err_mask", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"imem_dat_sop_err_mask", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"imem_dat_eop_err_mask", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"crcram_parity_err_mask", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"emem_fifo_ecc_mask", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"imem_fifo_ecc_mask", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"emem_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"emem_fifo_udf_mask", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"imem_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"imem_fifo_udf_mask", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"para_fifo_ecc_mask", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"para_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"para_fifo_udf_mask", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"itmh_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"itmh_ecc_double_err_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"order_fifo_parity_err_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"order_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"order_fifo_udf_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_olif_itmhram_parity_err_2_int_reg[] = + { + {"emem_dat_sop_err", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"emem_dat_eop_err", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"imem_dat_sop_err", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"imem_dat_eop_err", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"crcram_parity_err_1_int", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"emem_fifo_ecc_single_err_int", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"emem_fifo_ecc_double_err_int", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"imem_fifo_ecc_single_err_int", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"imem_fifo_ecc_double_err_int", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"emem_fifo_ovf_int", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"emem_fifo_udf_int", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"imem_fifo_ovf_int", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"imem_fifo_udf_int", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"para_fifo_ecc_single_err_int", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"para_fifo_ecc_double_err_int", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"para_fifo_ovf_int", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"para_fifo_udf_int", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"itmh_ecc_single_err_int", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"itmh_ecc_double_err_int", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"order_fifo_parity_err_int", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"order_fifo_ovf_int", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"order_fifo_udf_int", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_lif0_port_rdy_mask_h_reg[] = + { + {"lif0_port_rdy_mask_h", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_lif0_port_rdy_mask_l_reg[] = + { + {"lif0_port_rdy_mask_l", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_lif0_port_rdy_cfg_h_reg[] = + { + {"lif0_port_rdy_cfg_h", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_lif0_port_rdy_cfg_l_reg[] = + { + {"lif0_port_rdy_cfg_l", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_lif0_link_rdy_mask_cfg_reg[] = + { + {"lif0_link_rdy_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"lif0_link_rdy_cfg", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_tm_lif_stat_cfg_reg[] = + { + {"all_or_by_port", DPP_FIELD_FLAG_RW, 24, 1, 0x0, 0x0}, + {"i_or_e_sel", DPP_FIELD_FLAG_RW, 17, 2, 0x0, 0x0}, + {"port_or_dest_id_sel", DPP_FIELD_FLAG_RW, 8, 1, 0x0, 0x0}, + {"port_dest_id", DPP_FIELD_FLAG_RW, 7, 8, 0x0, 0x1}, + }; +DPP_FIELD_T g_etm_olif_tm_lif_sop_stat_reg[] = + { + {"tm_lif_sop_stat", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_tm_lif_eop_stat_reg[] = + { + {"tm_lif_eop_stat", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_tm_lif_vld_stat_reg[] = + { + {"tm_lif_vld_stat", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_prog_full_assert_cfg_reg[] = + { + {"prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 31, 16, 0xdc, 0x0}, + {"prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 15, 16, 0xc8, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_int_reg[] = + { + {"cgavd_int", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_ram_err_reg[] = + { + {"flow_qnum_intb", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"flow_qnum_inta", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"pp_qlen_inta", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"pp_qlen_intb", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"pp_tdth_int", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"flow_tdth_inta", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"flow_tdth_intb", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"flow_qlen_inta", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"flow_qlen_intb", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"qmu_cgavd_fifo_uv_int", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"qmu_cgavd_fifo_ov_int", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"pds_deal_fifo_ov_int", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"pds_deal_fifo_uv_int", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_int_mask_reg[] = + { + {"cgavd_int_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_ram_err_int_mask_reg[] = + { + {"flow_qnum_inta_mask", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"flow_qnum_intb_mask", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"pp_qlen_inta_mask", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"pp_qlen_intb_mask", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"pp_tdth_int_mask", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"flow_tdth_inta_mask", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"flow_tdth_intb_mask", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"flow_qlen_inta_mask", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"flow_qlen_intb_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"qmu_cgavd_fifo_uv_int_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"qmu_cgavd_fifo_ov_int_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"pds_deal_fifo_ov_int_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"pds_deal_fifo_uv_int_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cfgmt_byte_mode_reg[] = + { + {"cfgmt_byte_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_avg_qlen_return_zero_en_reg[] = + { + {"avg_qlen_return_zero_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow_wred_q_len_th_reg[] = + { + {"flow_wred_q_len_th", DPP_FIELD_FLAG_RW, 28, 29, 0x400, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow_wq_reg[] = + { + {"wq_flow", DPP_FIELD_FLAG_RW, 3, 4, 0x9, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow_wred_max_th_reg[] = + { + {"flow_wred_max_th", DPP_FIELD_FLAG_RW, 28, 29, 0x1000, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow_wred_min_th_reg[] = + { + {"flow_wred_min_th", DPP_FIELD_FLAG_RW, 28, 29, 0x10, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow_wred_cfg_para_reg[] = + { + {"flow_wred_cfg_para", DPP_FIELD_FLAG_RW, 31, 32, 0x13ec, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_pp_avg_q_len_reg[] = + { + {"pp_avg_q_len", DPP_FIELD_FLAG_RW, 28, 29, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_pp_td_th_reg[] = + { + {"pp_td_th", DPP_FIELD_FLAG_RW, 28, 29, 0x400, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_pp_ca_mtd_reg[] = + { + {"pp_ca_mtd", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_pp_wred_grp_th_en_reg[] = + { + {"pp_wred_grp", DPP_FIELD_FLAG_RW, 3, 3, 0x0, 0x0}, + {"pp_wred_grp_th_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_pp_wred_q_len_th_reg[] = + { + {"pp_wred_q_len_th", DPP_FIELD_FLAG_RW, 28, 29, 0x100000, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_pp_wq_reg[] = + { + {"wq_pp", DPP_FIELD_FLAG_RW, 3, 4, 0x9, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_pp_wred_max_th_reg[] = + { + {"pp_wred_max_th", DPP_FIELD_FLAG_RW, 28, 29, 0x80000, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_pp_wred_min_th_reg[] = + { + {"pp_wred_min_th", DPP_FIELD_FLAG_RW, 28, 29, 0x800, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_pp_cfg_para_reg[] = + { + {"pp_cfg_para", DPP_FIELD_FLAG_RW, 31, 32, 0x9f600, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_sys_avg_q_len_reg[] = + { + {"sys_avg_q_len", DPP_FIELD_FLAG_RW, 28, 29, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_sys_td_th_reg[] = + { + {"sys_td_th", DPP_FIELD_FLAG_RW, 28, 29, 0x1ff00, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_sys_cgavd_metd_reg[] = + { + {"sys_cgavd_metd", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_sys_cfg_q_grp_para_reg[] = + { + {"gred_q_len_th_sys", DPP_FIELD_FLAG_RW, 28, 29, 0x1fffe00, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_sys_wq_reg[] = + { + {"wq_sys", DPP_FIELD_FLAG_RW, 3, 4, 0x9, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_gred_max_th_reg[] = + { + {"gred_max_th", DPP_FIELD_FLAG_RW, 28, 29, 0x1000000, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_gred_mid_th_reg[] = + { + {"gred_mid_th", DPP_FIELD_FLAG_RW, 28, 29, 0x600000, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_gred_min_th_reg[] = + { + {"gred_min_th", DPP_FIELD_FLAG_RW, 28, 29, 0x80000, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_gred_cfg_para0_reg[] = + { + {"gred_cfg_para0", DPP_FIELD_FLAG_RW, 31, 32, 0x92aaaa, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_gred_cfg_para1_reg[] = + { + {"gred_cfg_para1", DPP_FIELD_FLAG_RW, 31, 32, 0x1900000, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_gred_cfg_para2_reg[] = + { + {"gred_cfg_para2", DPP_FIELD_FLAG_RW, 31, 32, 0xf00000, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_sys_window_th_h_reg[] = + { + {"sys_window_th_h", DPP_FIELD_FLAG_RW, 28, 29, 0x1d00000, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_sys_window_th_l_reg[] = + { + {"sys_window_th_l", DPP_FIELD_FLAG_RW, 28, 29, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_amplify_gene0_reg[] = + { + {"amplify_gene0", DPP_FIELD_FLAG_RW, 11, 12, 0x200, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_amplify_gene1_reg[] = + { + {"amplify_gene1", DPP_FIELD_FLAG_RW, 11, 12, 0x82, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_amplify_gene2_reg[] = + { + {"amplify_gene2", DPP_FIELD_FLAG_RW, 11, 12, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_amplify_gene3_reg[] = + { + {"amplify_gene3", DPP_FIELD_FLAG_RW, 11, 12, 0x7e, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_amplify_gene4_reg[] = + { + {"amplify_gene4", DPP_FIELD_FLAG_RW, 11, 12, 0x7c, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_amplify_gene5_reg[] = + { + {"amplify_gene5", DPP_FIELD_FLAG_RW, 11, 12, 0x78, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_amplify_gene6_reg[] = + { + {"amplify_gene6", DPP_FIELD_FLAG_RW, 11, 12, 0x70, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_amplify_gene7_reg[] = + { + {"amplify_gene7", DPP_FIELD_FLAG_RW, 11, 12, 0x68, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_amplify_gene8_reg[] = + { + {"amplify_gene8", DPP_FIELD_FLAG_RW, 11, 12, 0x60, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_amplify_gene9_reg[] = + { + {"amplify_gene9", DPP_FIELD_FLAG_RW, 11, 12, 0x58, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_amplify_gene10_reg[] = + { + {"amplify_gene10", DPP_FIELD_FLAG_RW, 11, 12, 0x50, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_amplify_gene11_reg[] = + { + {"amplify_gene11", DPP_FIELD_FLAG_RW, 11, 12, 0x40, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_amplify_gene12_reg[] = + { + {"amplify_gene12", DPP_FIELD_FLAG_RW, 11, 12, 0x20, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_amplify_gene13_reg[] = + { + {"amplify_gene13", DPP_FIELD_FLAG_RW, 11, 12, 0x8, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_amplify_gene14_reg[] = + { + {"amplify_gene14", DPP_FIELD_FLAG_RW, 11, 12, 0x2, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_amplify_gene15_reg[] = + { + {"amplify_gene15", DPP_FIELD_FLAG_RW, 11, 12, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_equal_pkt_len_en_reg[] = + { + {"equal_pkt_len_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_equal_pkt_len_th0_reg[] = + { + {"equal_pkt_len_th0", DPP_FIELD_FLAG_RW, 14, 15, 0x4, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_equal_pkt_len_th1_reg[] = + { + {"equal_pkt_len_th1", DPP_FIELD_FLAG_RW, 14, 15, 0x8, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_equal_pkt_len_th2_reg[] = + { + {"equal_pkt_len_th2", DPP_FIELD_FLAG_RW, 14, 15, 0x10, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_equal_pkt_len_th3_reg[] = + { + {"equal_pkt_len_th3", DPP_FIELD_FLAG_RW, 14, 15, 0x18, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_equal_pkt_len_th4_reg[] = + { + {"equal_pkt_len_th4", DPP_FIELD_FLAG_RW, 14, 15, 0x20, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_equal_pkt_len_th5_reg[] = + { + {"equal_pkt_len_th5", DPP_FIELD_FLAG_RW, 14, 15, 0x40, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_equal_pkt_len_th6_reg[] = + { + {"equal_pkt_len_th6", DPP_FIELD_FLAG_RW, 14, 15, 0x60, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_equal_pkt_len0_reg[] = + { + {"equal_pkt_len0", DPP_FIELD_FLAG_RW, 14, 15, 0x20, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_equal_pkt_len1_reg[] = + { + {"equal_pkt_len1", DPP_FIELD_FLAG_RW, 14, 15, 0x30, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_equal_pkt_len2_reg[] = + { + {"equal_pkt_len2", DPP_FIELD_FLAG_RW, 14, 15, 0x40, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_equal_pkt_len3_reg[] = + { + {"equal_pkt_len3", DPP_FIELD_FLAG_RW, 14, 15, 0x50, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_equal_pkt_len4_reg[] = + { + {"equal_pkt_len4", DPP_FIELD_FLAG_RW, 14, 15, 0x60, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_equal_pkt_len5_reg[] = + { + {"equal_pkt_len5", DPP_FIELD_FLAG_RW, 14, 15, 0x70, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_equal_pkt_len6_reg[] = + { + {"equal_pkt_len6", DPP_FIELD_FLAG_RW, 14, 15, 0x78, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_equal_pkt_len7_reg[] = + { + {"equal_pkt_len7", DPP_FIELD_FLAG_RW, 14, 15, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow_cpu_set_avg_len_reg[] = + { + {"flow_cpu_set_avg_len", DPP_FIELD_FLAG_RW, 28, 29, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow_cpu_set_q_len_reg[] = + { + {"flow_cpu_set_q_len", DPP_FIELD_FLAG_RW, 28, 29, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_pp_cpu_set_avg_q_len_reg[] = + { + {"pp_cpu_set_avg_q_len", DPP_FIELD_FLAG_RW, 28, 29, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_pp_cpu_set_q_len_reg[] = + { + {"pp_cpu_set_q_len", DPP_FIELD_FLAG_RW, 28, 29, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_sys_cpu_set_avg_len_reg[] = + { + {"sys_cpu_set_avg_len", DPP_FIELD_FLAG_RW, 28, 29, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_sys_cpu_set_q_len_reg[] = + { + {"sys_cpu_set_q_len", DPP_FIELD_FLAG_RW, 28, 29, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_pke_len_calc_sign_reg[] = + { + {"pke_len_calc_sign", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_rd_cpu_or_ram_reg[] = + { + {"cpu_sel_sys_q_len_en", DPP_FIELD_FLAG_RW, 5, 1, 0x0, 0x0}, + {"cpu_sel_sys_avg_q_len_en", DPP_FIELD_FLAG_RW, 4, 1, 0x0, 0x0}, + {"cpu_sel_pp_q_len_en", DPP_FIELD_FLAG_RW, 3, 1, 0x0, 0x0}, + {"cpu_sel_pp_avg_q_len_en", DPP_FIELD_FLAG_RW, 2, 1, 0x0, 0x0}, + {"cpu_sel_flow_q_len_en", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"cpu_sel_flow_avg_q_len_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_q_len_update_disable_reg[] = + { + {"q_len_sys_update_en", DPP_FIELD_FLAG_RW, 2, 1, 0x0, 0x0}, + {"q_len_pp_update_en", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"q_len_flow_update_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_dp_sel_reg[] = + { + {"flow_dp_sel_high", DPP_FIELD_FLAG_RW, 8, 1, 0x0, 0x0}, + {"flow_dp_sel_mid", DPP_FIELD_FLAG_RW, 7, 1, 0x0, 0x0}, + {"flow_dp_sel_low", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"pp_dp_sel_high", DPP_FIELD_FLAG_RW, 5, 1, 0x0, 0x0}, + {"pp_dp_sel_mid", DPP_FIELD_FLAG_RW, 4, 1, 0x0, 0x0}, + {"pp_dp_sel_low", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"sys_dp_sel_high", DPP_FIELD_FLAG_RW, 2, 1, 0x0, 0x0}, + {"sys_dp_sel_mid", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"sys_dp_sel_low", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_sub_en_reg[] = + { + {"cgavd_sa_sub_en", DPP_FIELD_FLAG_RW, 3, 1, 0x0, 0x0}, + {"cgavd_sys_sub_en", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"cgavd_pp_sub_en", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"cgavd_flow_sub_en", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_default_start_queue_reg[] = + { + {"default_start_queue", DPP_FIELD_FLAG_RW, 13, 14, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_default_finish_queue_reg[] = + { + {"default_finish_queue", DPP_FIELD_FLAG_RW, 13, 14, 0x1ff, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_protocol_start_queue_reg[] = + { + {"protocol_start_queue", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_protocol_finish_queue_reg[] = + { + {"protocol_finish_queue", DPP_FIELD_FLAG_RW, 13, 14, 0xff, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_uniform_td_th_reg[] = + { + {"uniform_td_th", DPP_FIELD_FLAG_RW, 28, 29, 0x200, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_uniform_td_th_en_reg[] = + { + {"uniform_td_th_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_cfg_fc_reg[] = + { + {"cgavd_cfg_fc", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_cfg_no_fc_reg[] = + { + {"cgavd_cfg_no_fc", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_force_imem_omem_reg[] = + { + {"imem_omem_force_en", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"choose_imem_omem", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_sys_q_len_l_reg[] = + { + {"cgavd_sys_q_len_l", DPP_FIELD_FLAG_RO, 28, 29, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_default_queue_en_reg[] = + { + {"default_queue_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_protocol_queue_en_reg[] = + { + {"protocol_queue_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cfg_tc_flowid_dat_reg[] = + { + {"cfg_tc_flowid_dat", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow_td_th_reg[] = + { + {"flow_td_th", DPP_FIELD_FLAG_RW, 28, 29, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow_ca_mtd_reg[] = + { + {"flow_ca_mtd", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow_dynamic_th_en_reg[] = + { + {"flow_dynamic_th_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_pp_num_reg[] = + { + {"pp_num", DPP_FIELD_FLAG_RW, 6, 7, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow_q_len_reg[] = + { + {"flow_q_len", DPP_FIELD_FLAG_RO, 28, 29, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow_wred_grp_reg[] = + { + {"flow_wred_grp", DPP_FIELD_FLAG_RW, 4, 5, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow_avg_q_len_reg[] = + { + {"flow_avg_q_len", DPP_FIELD_FLAG_RW, 28, 29, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_qos_sign_reg[] = + { + {"qos_sign_flow_cfg_din", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_q_pri_reg[] = + { + {"qpri_flow_cfg_din", DPP_FIELD_FLAG_RW, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_odma_tm_itmd_rd_low_reg[] = + { + {"odma_tm_itmd_low", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_odma_tm_itmd_rd_mid_reg[] = + { + {"odma_tm_itmd_mid", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_odma_tm_itmd_rd_high_reg[] = + { + {"odma_tm_itmd_high", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_stat_pkt_len_reg[] = + { + {"expect_deq_pkt_len", DPP_FIELD_FLAG_RW, 25, 10, 0x0, 0x0}, + {"expect_enq_pkt_len", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_stat_qnum_reg[] = + { + {"cgavd_unexcept_qnum", DPP_FIELD_FLAG_RW, 29, 14, 0x0, 0x0}, + {"cgavd_except_qnum", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_stat_dp_reg[] = + { + {"cgavd_stat_dp", DPP_FIELD_FLAG_RW, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow_num0_reg[] = + { + {"flow_num0", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow_num1_reg[] = + { + {"flow_num1", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow_num2_reg[] = + { + {"flow_num2", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow_num3_reg[] = + { + {"flow_num3", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow_num4_reg[] = + { + {"flow_num4", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow0_imem_cnt_reg[] = + { + {"flow0_imem_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow1_imem_cnt_reg[] = + { + {"flow1_imem_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow2_imem_cnt_reg[] = + { + {"flow2_imem_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow3_imem_cnt_reg[] = + { + {"flow3_imem_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow4_imem_cnt_reg[] = + { + {"flow4_imem_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow0_drop_cnt_reg[] = + { + {"flow0_drop_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow1_drop_cnt_reg[] = + { + {"flow1_drop_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow2_drop_cnt_reg[] = + { + {"flow2_drop_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow3_drop_cnt_reg[] = + { + {"flow3_drop_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow4_drop_cnt_reg[] = + { + {"flow4_drop_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_fc_count_mode_reg[] = + { + {"fc_count_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_qmu_cgavd_fc_num_reg[] = + { + {"qmu_cgavd_fc_state", DPP_FIELD_FLAG_RO, 31, 1, 0x0, 0x0}, + {"qmu_cgavd_fc_num", DPP_FIELD_FLAG_RO, 30, 31, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_odma_fc_num_reg[] = + { + {"cgavd_lif_fc_state", DPP_FIELD_FLAG_RO, 31, 1, 0x0, 0x0}, + {"cgavd_lif_fc_num", DPP_FIELD_FLAG_RO, 30, 31, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cfg_offset_reg[] = + { + {"cfg_offset", DPP_FIELD_FLAG_RW, 8, 9, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tmmu_init_done_reg[] = + { + {"tmmu_init_done", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tmmu_int_mask_1_reg[] = + { + {"imem_enq_rd_fifo_full_mask", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"imem_enq_rd_fifo_overflow_mask", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"imem_enq_rd_fifo_underflow_mask", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"imem_enq_drop_fifo_full_mask", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"imem_enq_drop_fifo_overflow_mask", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"imem_enq_drop_fifo_underflow_mask", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"imem_deq_rd_fifo_full_mask", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"imem_deq_rd_fifo_overflow_mask", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"imem_deq_rd_fifo_underflow_mask", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"imem_deq_drop_fifo_full_mask", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"imem_deq_drop_fifo_overflow_mask", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"imem_deq_drop_fifo_underflow_mask", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"dma_data_fifo_full_mask", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"dma_data_fifo_overflow_mask", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"dma_data_fifo_underflow_mask", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"wr_cmd_fifo_full_mask", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"wr_cmd_fifo_overflow_mask", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"wr_cmd_fifo_underflow_mask", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"cached_pd_fifo_full_mask", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"cached_pd_fifo_overflow_mask", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"cached_pd_fifo_underflow_mask", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"emem_pd_fifo_full_mask", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"emem_pd_fifo_overflow_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"emem_pd_fifo_underflow_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"pd_order_fifo_full_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"pd_order_fifo_overflow_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"pd_order_fifo_underflow_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tmmu_int_mask_2_reg[] = + { + {"dma_data_fifo_parity_err_mask", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"imem_enq_rd_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"imem_enq_rd_fifo_ecc_double_err_mask", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"imem_enq_drop_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"imem_enq_drop_fifo_ecc_double_err_mask", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"imem_deq_rd_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"imem_deq_rd_fifo_ecc_double_err_mask", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"imem_deq_drop_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"imem_deq_drop_fifo_ecc_double_err_mask", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"wr_cmd_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"wr_cmd_fifo_ecc_double_err_mask", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"pd_cache_ram_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"pd_cache_ram_ecc_double_err_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"cached_pd_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"cached_pd_fifo_ecc_double_err_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"emem_pd_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"emem_pd_fifo_ecc_double_err_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_tm_pure_imem_en_reg[] = + { + {"cfgmt_tm_pure_imem_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_force_ddr_rdy_cfg_reg[] = + { + {"cfgmt_force_ddr_rdy_cfg", DPP_FIELD_FLAG_RW, 9, 10, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_pd_order_fifo_aful_th_reg[] = + { + {"pd_order_fifo_aful_th", DPP_FIELD_FLAG_RW, 10, 11, 0x384, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cached_pd_fifo_aful_th_reg[] = + { + {"cached_pd_fifo_aful_th", DPP_FIELD_FLAG_RW, 9, 10, 0x1f0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_wr_cmd_fifo_aful_th_reg[] = + { + {"wr_cmd_fifo_aful_th", DPP_FIELD_FLAG_RW, 9, 10, 0x190, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_imem_enq_rd_fifo_aful_th_reg[] = + { + {"imem_enq_rd_fifo_aful_th", DPP_FIELD_FLAG_RW, 6, 7, 0x10, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_imem_enq_drop_fifo_aful_th_reg[] = + { + {"imem_enq_drop_fifo_aful_th", DPP_FIELD_FLAG_RW, 6, 7, 0x10, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_imem_deq_drop_fifo_aful_th_reg[] = + { + {"imem_deq_drop_fifo_aful_th", DPP_FIELD_FLAG_RW, 6, 7, 0x10, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_imem_deq_rd_fifo_aful_th_reg[] = + { + {"imem_deq_rd_fifo_aful_th", DPP_FIELD_FLAG_RW, 10, 11, 0x320, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tmmu_states_1_reg[] = + { + {"imem_enq_rd_fifo_full", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"imem_enq_rd_fifo_overflow", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"imem_enq_rd_fifo_underflow", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"imem_enq_drop_fifo_full", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"imem_enq_drop_fifo_overflow", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"imem_enq_drop_fifo_underflow", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"imem_deq_rd_fifo_full", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"imem_deq_rd_fifo_overflow", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"imem_deq_rd_fifo_underflow", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"imem_deq_drop_fifo_full", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"imem_deq_drop_fifo_overflow", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"imem_deq_drop_fifo_underflow", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"dma_data_fifo_full", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"dma_data_fifo_overflow", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"dma_data_fifo_underflow", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"wr_cmd_fifo_full", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"wr_cmd_fifo_overflow", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"wr_cmd_fifo_underflow", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"cached_pd_fifo_full", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"cached_pd_fifo_overflow", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"cached_pd_fifo_underflow", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"emem_pd_fifo_full", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"emem_pd_fifo_overflow", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"emem_pd_fifo_underflow", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"pd_order_fifo_full", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"pd_order_fifo_overflow", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"pd_order_fifo_underflow", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tmmu_states_2_reg[] = + { + {"dma_data_fifo_parity_err", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"imem_enq_rd_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"imem_enq_rd_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"imem_enq_drop_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"imem_enq_drop_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"imem_deq_rd_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"imem_deq_rd_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"imem_deq_drop_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"imem_deq_drop_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"wr_cmd_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"wr_cmd_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"pd_cache_ram_ecc_single_err", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"pd_cache_ram_ecc_double_err", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"cached_pd_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"cached_pd_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"emem_pd_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"emem_pd_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_shap_shap_ind_cmd_reg[] = + { + {"rd", DPP_FIELD_FLAG_RW, 28, 1, 0x0, 0x0}, + {"mem_id", DPP_FIELD_FLAG_RW, 27, 8, 0x0, 0x0}, + {"addr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_shap_shap_ind_sta_reg[] = + { + {"indirectaccessdone", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_shap_shap_ind_data0_reg[] = + { + {"indirectdata0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_shap_shap_ind_data1_reg[] = + { + {"indirectdata1", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_shap_full_threshold_reg[] = + { + {"full_threshold", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_shap_empty_threshold_reg[] = + { + {"empty_threshold", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_shap_shap_sta_init_cfg_reg[] = + { + {"sta_ram_init_done", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"sta_ram_init_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_shap_shap_cfg_init_cfg_reg[] = + { + {"cfg_ram_init_done", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"cfg_ram_init_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_shap_token_mode_switch_reg[] = + { + {"token_mode_switch", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_shap_token_grain_reg[] = + { + {"token_grain", DPP_FIELD_FLAG_RW, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_shap_crd_grain_reg[] = + { + {"crd_grain", DPP_FIELD_FLAG_RW, 20, 21, 0x8fc, 0x0}, + }; +DPP_FIELD_T g_etm_shap_shap_stat_ctrl_reg[] = + { + {"shap_stat_ctrl", DPP_FIELD_FLAG_RW, 1, 2, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_shap_token_stat_id_reg[] = + { + {"token_stat_id", DPP_FIELD_FLAG_RW, 10, 11, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_shap_token_stat_reg[] = + { + {"token_stat", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_shap_shap_stat_clk_cnt_reg[] = + { + {"shap_stat_clk_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_shap_shap_bucket_map_tbl_reg[] = + { + {"shap_map", DPP_FIELD_FLAG_RW, 6, 7, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_shap_bkt_para_tbl_reg[] = + { + {"bucket_depth", DPP_FIELD_FLAG_RW, 35, 11, 0x0, 0x0}, + {"bucket_rate", DPP_FIELD_FLAG_RW, 24, 25, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_credit_en_reg[] = + { + {"credit_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_crt_inter1_reg[] = + { + {"crd_inter1", DPP_FIELD_FLAG_RW, 8, 9, 0x2d, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_db_token_reg[] = + { + {"db_token", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_crs_flt_cfg_reg[] = + { + {"crs_flt_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_th_sp_reg[] = + { + {"th_sp", DPP_FIELD_FLAG_RW, 14, 15, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_th_wfq_fq_reg[] = + { + {"th_fq", DPP_FIELD_FLAG_RW, 31, 16, 0x0, 0x0}, + {"th_wfq", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_th_wfq2_fq2_reg[] = + { + {"th_fq2", DPP_FIELD_FLAG_RW, 31, 16, 0x0, 0x0}, + {"th_wfq2", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_th_wfq4_fq4_reg[] = + { + {"th_fq4", DPP_FIELD_FLAG_RW, 31, 16, 0x0, 0x0}, + {"th_wfq4", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_cfg_state_reg[] = + { + {"cfg_state", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_crdt_ind_cmd_reg[] = + { + {"rd", DPP_FIELD_FLAG_RW, 28, 1, 0x0, 0x0}, + {"mem_id", DPP_FIELD_FLAG_RW, 27, 8, 0x0, 0x0}, + {"addr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_crdt_ind_sta_reg[] = + { + {"indirectaccessdone", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_crdt_ind_data0_reg[] = + { + {"indirectdata0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_crdt_ind_data1_reg[] = + { + {"indirectdata1", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_crdt_state_reg[] = + { + {"crdt_int", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"crdt_rdy", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_stat_que_id_0_reg[] = + { + {"stat_que_id_0", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_stat_que_id_1_reg[] = + { + {"stat_que_id_1", DPP_FIELD_FLAG_RW, 13, 14, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_stat_que_id_2_reg[] = + { + {"stat_que_id_2", DPP_FIELD_FLAG_RW, 13, 14, 0x2, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_stat_que_id_3_reg[] = + { + {"stat_que_id_3", DPP_FIELD_FLAG_RW, 13, 14, 0x3, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_stat_que_id_4_reg[] = + { + {"stat_que_id_4", DPP_FIELD_FLAG_RW, 13, 14, 0x4, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_stat_que_id_5_reg[] = + { + {"stat_que_id_5", DPP_FIELD_FLAG_RW, 13, 14, 0x5, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_stat_que_id_6_reg[] = + { + {"stat_que_id_6", DPP_FIELD_FLAG_RW, 13, 14, 0x6, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_stat_que_id_7_reg[] = + { + {"stat_que_id_7", DPP_FIELD_FLAG_RW, 13, 14, 0x7, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_stat_que_id_8_reg[] = + { + {"stat_que_id_8", DPP_FIELD_FLAG_RW, 13, 14, 0x8, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_stat_que_id_9_reg[] = + { + {"stat_que_id_9", DPP_FIELD_FLAG_RW, 13, 14, 0x9, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_stat_que_id_10_reg[] = + { + {"stat_que_id_10", DPP_FIELD_FLAG_RW, 13, 14, 0xa, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_stat_que_id_11_reg[] = + { + {"stat_que_id_11", DPP_FIELD_FLAG_RW, 13, 14, 0xb, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_stat_que_id_12_reg[] = + { + {"stat_que_id_12", DPP_FIELD_FLAG_RW, 13, 14, 0xc, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_stat_que_id_13_reg[] = + { + {"stat_que_id_13", DPP_FIELD_FLAG_RW, 13, 14, 0xd, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_stat_que_id_14_reg[] = + { + {"stat_que_id_14", DPP_FIELD_FLAG_RW, 13, 14, 0xe, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_stat_que_id_15_reg[] = + { + {"stat_que_id_15", DPP_FIELD_FLAG_RW, 13, 14, 0xf, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_stat_que_credit_reg[] = + { + {"stat_que_credit_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_crdt_cfg_ram_init_reg[] = + { + {"cfg_ram_init_done", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"cfg_ram_init_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_crdt_sta_ram_init_reg[] = + { + {"sta_ram_init_done", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"sta_ram_init_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_crs_que_id_reg[] = + { + {"crs_que_id", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_qmu_crs_end_state_reg[] = + { + {"qmu_crs_end_state", DPP_FIELD_FLAG_RO, 1, 2, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_shap_rdy_reg[] = + { + {"shap_rdy", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_shap_int_reg_reg[] = + { + {"pp_c_token_min_int", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_shap_int_mask_reg_reg[] = + { + {"pp_c_token_min_int_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_token_state_almost_empty_th_reg[] = + { + {"token_state_almost_empty_th", DPP_FIELD_FLAG_RW, 16, 17, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_token_state_empty_th_reg[] = + { + {"token_state_empty_th", DPP_FIELD_FLAG_RW, 16, 17, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_full_th_reg[] = + { + {"token_state_full_th", DPP_FIELD_FLAG_RW, 16, 17, 0x2, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_pp_c_level_shap_en_reg[] = + { + {"pp_c_level_shap_en", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_enq_token_th_reg[] = + { + {"enq_token_th", DPP_FIELD_FLAG_RW, 11, 12, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_pp_tokenq_level1_qstate_weight_cir_reg[] = + { + {"pp_pp_q_state_cir", DPP_FIELD_FLAG_RO, 31, 1, 0x0, 0x0}, + {"pp_pp_q_weight_wfq_l1_cir", DPP_FIELD_FLAG_RO, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_pp_idle_weight_level1_cir_reg[] = + { + {"pp_idle_q_weight_wfq_l1_cir", DPP_FIELD_FLAG_RO, 25, 26, 0x1ffffff, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_rci_grade_th_0_cfg_reg[] = + { + {"rci_grade_th_0_cfg", DPP_FIELD_FLAG_RW, 11, 12, 0x177, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_rci_grade_th_1_cfg_reg[] = + { + {"rci_grade_th_1_cfg", DPP_FIELD_FLAG_RW, 11, 12, 0x2ee, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_rci_grade_th_2_cfg_reg[] = + { + {"rci_grade_th_2_cfg", DPP_FIELD_FLAG_RW, 11, 12, 0x465, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_rci_grade_th_3_cfg_reg[] = + { + {"rci_grade_th_3_cfg", DPP_FIELD_FLAG_RW, 11, 12, 0x47e, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_rci_grade_th_4_cfg_reg[] = + { + {"rci_grade_th_4_cfg", DPP_FIELD_FLAG_RW, 11, 12, 0x753, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_rci_grade_th_5_cfg_reg[] = + { + {"rci_grade_th_5_cfg", DPP_FIELD_FLAG_RW, 11, 12, 0x8ca, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_rci_grade_th_6_cfg_reg[] = + { + {"rci_grade_th_6_cfg", DPP_FIELD_FLAG_RW, 11, 12, 0xa41, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_flow_del_cmd_reg[] = + { + {"flow_del_busy", DPP_FIELD_FLAG_RO, 19, 1, 0x0, 0x0}, + {"flow_alt_cmd", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"flow_alt_ind", DPP_FIELD_FLAG_RW, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_cnt_clr_reg[] = + { + {"cnt_clr", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_crdt_int_bus_reg[] = + { + {"ldstr_fifo15_ovf_int", DPP_FIELD_FLAG_RO, 31, 1, 0x0, 0x0}, + {"ldstr_fifo14_ovf_int", DPP_FIELD_FLAG_RO, 30, 1, 0x0, 0x0}, + {"ldstr_fifo13_ovf_int", DPP_FIELD_FLAG_RO, 29, 1, 0x0, 0x0}, + {"ldstr_fifo12_ovf_int", DPP_FIELD_FLAG_RO, 28, 1, 0x0, 0x0}, + {"ldstr_fifo11_ovf_int", DPP_FIELD_FLAG_RO, 27, 1, 0x0, 0x0}, + {"ldstr_fifo10_ovf_int", DPP_FIELD_FLAG_RO, 26, 1, 0x0, 0x0}, + {"ldstr_fifo9_ovf_int", DPP_FIELD_FLAG_RO, 25, 1, 0x0, 0x0}, + {"ldstr_fifo8_ovf_int", DPP_FIELD_FLAG_RO, 24, 1, 0x0, 0x0}, + {"ldstr_fifo7_ovf_int", DPP_FIELD_FLAG_RO, 23, 1, 0x0, 0x0}, + {"ldstr_fifo6_ovf_int", DPP_FIELD_FLAG_RO, 22, 1, 0x0, 0x0}, + {"ldstr_fifo5_ovf_int", DPP_FIELD_FLAG_RO, 21, 1, 0x0, 0x0}, + {"ldstr_fifo4_ovf_int", DPP_FIELD_FLAG_RO, 20, 1, 0x0, 0x0}, + {"ldstr_fifo3_ovf_int", DPP_FIELD_FLAG_RO, 19, 1, 0x0, 0x0}, + {"ldstr_fifo2_ovf_int", DPP_FIELD_FLAG_RO, 18, 1, 0x0, 0x0}, + {"ldstr_fifo1_ovf_int", DPP_FIELD_FLAG_RO, 17, 1, 0x0, 0x0}, + {"ldstr_fifo0_ovf_int", DPP_FIELD_FLAG_RO, 16, 1, 0x0, 0x0}, + {"cfg_del_err_int", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"flwin_secrs_fifo_ovf_int", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"flwin_voqcrs_fifo_ovf_int", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_crdt_int_mask_reg[] = + { + {"crdt_int_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_cfg_weight_together_reg[] = + { + {"cfg_weight_together", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_weight_reg[] = + { + {"c_weight", DPP_FIELD_FLAG_RW, 22, 7, 0x0, 0x0}, + {"e_weight", DPP_FIELD_FLAG_RW, 6, 7, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_dev_sp_state_reg[] = + { + {"dev_sp_state", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_dev_crs_reg[] = + { + {"dev_crs", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_congest_token_disable_31_0_reg[] = + { + {"congest_token_disable_31_0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_congest_token_disable_63_32_reg[] = + { + {"congest_token_disable_63_32", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_crdt_interval_en_cfg_reg[] = + { + {"crdt_interval_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_q_token_staue_cfg_reg[] = + { + {"test_token_q_id", DPP_FIELD_FLAG_RW, 6, 7, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_q_token_dist_cnt_reg[] = + { + {"q_token_dist_counter", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_q_token_dec_cnt_reg[] = + { + {"q_token_dec_counter", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_pp_weight_ram_reg[] = + { + {"pp_c_weight", DPP_FIELD_FLAG_RW, 25, 26, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_pp_cbs_shape_en_ram_reg[] = + { + {"pp_cbs", DPP_FIELD_FLAG_RW, 17, 17, 0x0, 0x0}, + {"pp_c_shap_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_pp_next_pc_q_state_ram_reg[] = + { + {"pp_next_pc", DPP_FIELD_FLAG_RO, 24, 6, 0x0, 0x0}, + {"pp_token_num", DPP_FIELD_FLAG_RO, 18, 18, 0x20000, 0x0}, + {"pp_q_state", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_dev_interval_reg[] = + { + {"dev_interval", DPP_FIELD_FLAG_RW, 21, 22, 0xf, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_dev_wfq_cnt_reg[] = + { + {"dev_wfq_cnt", DPP_FIELD_FLAG_RO, 6, 7, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_dev_wfq_state_reg[] = + { + {"dev_wfq_state", DPP_FIELD_FLAG_RO, 6, 7, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_dev_active_head_ptr_reg[] = + { + {"dev_active_head_ptr", DPP_FIELD_FLAG_RO, 5, 6, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_dev_active_tail_ptr_reg[] = + { + {"dev_active_tail_ptr", DPP_FIELD_FLAG_RO, 5, 6, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_dev_unactive_head_ptr_reg[] = + { + {"dev_unactive_head_ptr", DPP_FIELD_FLAG_RO, 5, 6, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_dev_unactive_tail_ptr_reg[] = + { + {"dev_unactive_tail_ptr", DPP_FIELD_FLAG_RO, 5, 6, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_pp_weight_reg[] = + { + {"pp_weight", DPP_FIELD_FLAG_RW, 6, 7, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_pp_que_state_reg[] = + { + {"pp_enque_flag", DPP_FIELD_FLAG_RO, 16, 1, 0x0, 0x0}, + {"pp_cir", DPP_FIELD_FLAG_RO, 15, 2, 0x2, 0x0}, + {"pp_congest_cir", DPP_FIELD_FLAG_RO, 13, 2, 0x0, 0x0}, + {"pp_crs", DPP_FIELD_FLAG_RO, 8, 1, 0x0, 0x0}, + {"dev_sp", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_pp_next_ptr_reg[] = + { + {"pp_next_ptr", DPP_FIELD_FLAG_RO, 5, 6, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_pp_cfg_reg[] = + { + {"pp_cfg", DPP_FIELD_FLAG_RW, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_pp_up_ptr_reg[] = + { + {"pp_up_ptr", DPP_FIELD_FLAG_RO, 5, 6, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_credit_drop_num_reg[] = + { + {"credit_drop_num", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_se_id_lv0_reg[] = + { + {"se_id_out_lv0", DPP_FIELD_FLAG_RO, 17, 18, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_se_id_lv1_reg[] = + { + {"se_id_out_lv1", DPP_FIELD_FLAG_RO, 17, 18, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_se_id_lv2_reg[] = + { + {"se_id_out_lv2", DPP_FIELD_FLAG_RO, 17, 18, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_se_id_lv3_reg[] = + { + {"se_id_out_lv3", DPP_FIELD_FLAG_RO, 17, 18, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_se_id_lv4_reg[] = + { + {"se_id_out_lv4", DPP_FIELD_FLAG_RO, 17, 18, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_que_id_reg[] = + { + {"que_id_out", DPP_FIELD_FLAG_RO, 17, 18, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_se_info_lv0_reg[] = + { + {"se_shape_lv0", DPP_FIELD_FLAG_RO, 25, 2, 0x0, 0x0}, + {"se_ins_out_lv0", DPP_FIELD_FLAG_RO, 23, 8, 0x0, 0x0}, + {"se_state_out_lv0", DPP_FIELD_FLAG_RO, 15, 8, 0x0, 0x0}, + {"se_new_state_out_lv0", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_se_info_lv1_reg[] = + { + {"se_shape_lv1", DPP_FIELD_FLAG_RO, 25, 2, 0x0, 0x0}, + {"se_ins_out_lv1", DPP_FIELD_FLAG_RO, 23, 8, 0x0, 0x0}, + {"se_state_out_lv1", DPP_FIELD_FLAG_RO, 15, 8, 0x0, 0x0}, + {"se_new_state_out_lv1", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_se_info_lv2_reg[] = + { + {"se_shape_lv2", DPP_FIELD_FLAG_RO, 25, 2, 0x0, 0x0}, + {"se_ins_out_lv2", DPP_FIELD_FLAG_RO, 23, 8, 0x0, 0x0}, + {"se_state_out_lv2", DPP_FIELD_FLAG_RO, 15, 8, 0x0, 0x0}, + {"se_new_state_out_lv2", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_se_info_lv3_reg[] = + { + {"se_shape_lv3", DPP_FIELD_FLAG_RO, 25, 2, 0x0, 0x0}, + {"se_ins_out_lv3", DPP_FIELD_FLAG_RO, 23, 8, 0x0, 0x0}, + {"se_state_out_lv3", DPP_FIELD_FLAG_RO, 15, 8, 0x0, 0x0}, + {"se_new_state_out_lv3", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_se_info_lv4_reg[] = + { + {"se_shape_lv4", DPP_FIELD_FLAG_RO, 25, 2, 0x0, 0x0}, + {"se_ins_out_lv4", DPP_FIELD_FLAG_RO, 23, 8, 0x0, 0x0}, + {"se_state_out_lv4", DPP_FIELD_FLAG_RO, 15, 8, 0x0, 0x0}, + {"se_new_state_out_lv4", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_que_state_reg[] = + { + {"que_state_out", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_eir_off_in_advance_reg[] = + { + {"eir_crs_filter", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_double_level_shap_prevent_reg[] = + { + {"double_level_shap_prevent", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_add_store_cycle_reg[] = + { + {"add_store_cycle", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_tflag2_wr_flag_sum_reg[] = + { + {"tflag2_wr_flag_sum", DPP_FIELD_FLAG_RO, 4, 5, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_flowque_para_tbl_reg[] = + { + {"flowque_link", DPP_FIELD_FLAG_RW, 30, 15, 0x7fff, 0x0}, + {"flowque_w", DPP_FIELD_FLAG_RW, 14, 11, 0x0, 0x0}, + {"flowque_pri", DPP_FIELD_FLAG_RW, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_se_para_tbl_reg[] = + { + {"se_insw", DPP_FIELD_FLAG_RW, 33, 1, 0x0, 0x0}, + {"se_link", DPP_FIELD_FLAG_RW, 30, 15, 0x7fff, 0x0}, + {"cp_token_en", DPP_FIELD_FLAG_RW, 15, 1, 0x0, 0x0}, + {"se_w", DPP_FIELD_FLAG_RW, 14, 11, 0x0, 0x0}, + {"se_pri", DPP_FIELD_FLAG_RW, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_flowque_ins_tbl_reg[] = + { + {"flowque_ins", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_se_ins_tbl_reg[] = + { + {"se_ins_flag", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"se_ins_priority", DPP_FIELD_FLAG_RO, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_eir_crs_filter_tbl_reg[] = + { + {"eir_crs_filter", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_cfg_done_reg[] = + { + {"qcfg_qlist_cfg_done", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qsch_credit_value_reg[] = + { + {"qcfg_qsch_credit_value", DPP_FIELD_FLAG_RW, 13, 14, 0x8fc, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qsch_crbal_init_value_reg[] = + { + {"qcfg_qsch_crbal_init_value", DPP_FIELD_FLAG_RW, 16, 17, 0xff, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qsch_crbal_init_mask_reg[] = + { + {"qcfg_qsch_crbal_init_mask", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cmdsch_rd_cmd_aful_th_reg[] = + { + {"cmdsch_rd_cmd_aful_th", DPP_FIELD_FLAG_RW, 9, 10, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_port_fc_interval_reg[] = + { + {"cfg_port_fc_interval", DPP_FIELD_FLAG_RW, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_csch_aged_cfg_reg[] = + { + {"qcfg_csch_aged_cfg", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_csch_aged_scan_time_reg[] = + { + {"qcfg_csch_aged_scan_time", DPP_FIELD_FLAG_RW, 31, 32, 0xffff, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qmu_qlist_state_query_reg[] = + { + {"pkt_age_req_fifo_afull", DPP_FIELD_FLAG_RO, 27, 1, 0x0, 0x0}, + {"rd_release_fwft_afull", DPP_FIELD_FLAG_RO, 26, 1, 0x0, 0x0}, + {"drop_imem_fwft_afull", DPP_FIELD_FLAG_RO, 25, 1, 0x0, 0x0}, + {"pkt_age_req_fifo_empty", DPP_FIELD_FLAG_RO, 24, 1, 0x1, 0x0}, + {"rd_release_fwft_empty", DPP_FIELD_FLAG_RO, 23, 1, 0x1, 0x0}, + {"drop_imem_fwft_empty", DPP_FIELD_FLAG_RO, 22, 1, 0x1, 0x0}, + {"mmu_qmu_sop_rd_rdy", DPP_FIELD_FLAG_RO, 21, 1, 0x0, 0x0}, + {"big_fifo_empty", DPP_FIELD_FLAG_RO, 20, 1, 0x1, 0x0}, + {"qmu_mmu_rd_release_rdy", DPP_FIELD_FLAG_RO, 19, 1, 0x0, 0x0}, + {"xsw_qmu_crs_rdy", DPP_FIELD_FLAG_RO, 18, 1, 0x0, 0x0}, + {"mmu_qmu_rdy", DPP_FIELD_FLAG_RO, 17, 10, 0x0, 0x0}, + {"mmu_ql_wr_rdy", DPP_FIELD_FLAG_RO, 7, 1, 0x0, 0x0}, + {"mmu_ql_rd_rdy", DPP_FIELD_FLAG_RO, 6, 1, 0x0, 0x0}, + {"csw_ql_rdy", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"ql_init_done", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"free_addr_ready", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"bank_group_afull", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"pds_fwft_empty", DPP_FIELD_FLAG_RO, 1, 1, 0x1, 0x0}, + {"enq_rpt_fwft_afull", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_qsch_crbal_drop_en_reg[] = + { + {"cfgmt_qsch_all_crbal_drop_en", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"cfgmt_qsch_crbal_drop_en", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_wlist_qnum_fifo_aful_th_reg[] = + { + {"cfgmt_wlist_qnum_fifo_aful_th", DPP_FIELD_FLAG_RW, 3, 4, 0x4, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_csw_pkt_blk_mode_reg[] = + { + {"qcfg_csw_pkt_blk_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_ram_init_cancel_reg[] = + { + {"qcfg_qlist_ram_init_cancel", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qsch_crbal_transfer_mode_reg[] = + { + {"qcfg_qsch_crbal_transfer_mode", DPP_FIELD_FLAG_RW, 16, 1, 0x0, 0x0}, + {"qcfg_qsch_crbal_transfer_value", DPP_FIELD_FLAG_RW, 15, 16, 0x3e8, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_qclr_interval_reg[] = + { + {"qcfg_qlist_qclr_interval", DPP_FIELD_FLAG_RW, 31, 32, 0x400, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qsch_qclr_rate_reg[] = + { + {"qcfg_qsch_qclr_rate", DPP_FIELD_FLAG_RW, 31, 32, 0xff, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_ddr_random_reg[] = + { + {"qcfg_qlist_ddr_random", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_qlist_pds_fifo_afull_th_reg[] = + { + {"cfgmt_qlist_pds_fifo_afull_th", DPP_FIELD_FLAG_RW, 5, 6, 0xc, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_sop_cmd_fifo_afull_th_reg[] = + { + {"cfgmt_sop_cmd_fifo_afull_th", DPP_FIELD_FLAG_RW, 7, 8, 0x78, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_non_sop_cmd_fifo_afull_th_reg[] = + { + {"cfgmt_non_sop_cmd_fifo_afull_th", DPP_FIELD_FLAG_RW, 10, 11, 0x3e8, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_mmu_data_fifo_afull_th_reg[] = + { + {"cfgmt_mmu_data_fifo_afull_th", DPP_FIELD_FLAG_RW, 9, 10, 0xf0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_bank_ept_th_reg[] = + { + {"qcfg_qlist_bank_ept_th", DPP_FIELD_FLAG_RW, 17, 18, 0x3, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_random_bypass_en_reg[] = + { + {"random_bypass_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_crs_spd_bypass_reg[] = + { + {"cfgmt_crs_spd_bypass", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_crs_interval_reg[] = + { + {"cfgmt_crs_interval", DPP_FIELD_FLAG_RW, 31, 32, 0x8, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_auto_credit_control_en_reg[] = + { + {"cfg_qsch_auto_credit_control_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_autocrfrstque_reg[] = + { + {"cfg_qsch_autocrfrstque", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_autocrlastque_reg[] = + { + {"cfg_qsch_autocrlastque", DPP_FIELD_FLAG_RW, 15, 16, 0x3ff, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_autocreditrate_reg[] = + { + {"cfg_qsch_autocreditrate", DPP_FIELD_FLAG_RW, 19, 20, 0x20, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_scanfrstque_reg[] = + { + {"cfg_qsch_scanfrstque", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_scanlastque_reg[] = + { + {"cfg_qsch_scanlastque", DPP_FIELD_FLAG_RW, 13, 14, 0x3ff, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_scanrate_reg[] = + { + {"cfg_qsch_scanrate", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_scan_en_reg[] = + { + {"cfg_qsch_scan_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_qsch_rd_credit_fifo_rate_reg[] = + { + {"cfgmt_qsch_rd_credit_fifo_rate", DPP_FIELD_FLAG_RW, 23, 24, 0xa, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_bdep_reg[] = + { + {"qcfg_qlist_bdep", DPP_FIELD_FLAG_RW, 14, 15, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_bhead_reg[] = + { + {"bank_vld", DPP_FIELD_FLAG_RW, 16, 1, 0x0, 0x0}, + {"qcfg_qlist_bhead", DPP_FIELD_FLAG_RW, 14, 15, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_btail_reg[] = + { + {"qcfg_qlist_btail", DPP_FIELD_FLAG_RW, 14, 15, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qsch_shap_param_reg[] = + { + {"qcfg_qsch_shap_en", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + {"qcfg_qsch_shap_param1", DPP_FIELD_FLAG_RW, 23, 12, 0x0, 0x0}, + {"qcfg_qsch_shap_param2", DPP_FIELD_FLAG_RW, 11, 12, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qsch_shap_token_reg[] = + { + {"qcfg_qsch_shap_token", DPP_FIELD_FLAG_RW, 16, 17, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qsch_shap_offset_reg[] = + { + {"qcfg_qsch_shap_offset", DPP_FIELD_FLAG_RW, 8, 9, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qsch_crs_eir_th_reg[] = + { + {"qcfg_qsch_crs_eir_th", DPP_FIELD_FLAG_RW, 18, 19, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qsch_crs_th1_reg[] = + { + {"qcfg_qsch_crs_th1", DPP_FIELD_FLAG_RW, 31, 32, 0x57584c4c, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qsch_crs_th2_reg[] = + { + {"qcfg_qsch_crs_th2", DPP_FIELD_FLAG_RW, 31, 32, 0x200, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_csch_congest_th_reg[] = + { + {"qcfg_csch_congest_th", DPP_FIELD_FLAG_RW, 13, 14, 0xc8, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_csch_sp_fc_th_reg[] = + { + {"qcfg_csch_sp_fc_th", DPP_FIELD_FLAG_RW, 13, 14, 0x12c, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_csw_shap_parameter_reg[] = + { + {"qcfg_csw_shap_en", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + {"qcfg_csw_shap_parameter", DPP_FIELD_FLAG_RW, 23, 24, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_rd_release_aful_th_reg[] = + { + {"cfgmt_rd_release_aful_th", DPP_FIELD_FLAG_RW, 8, 9, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_drop_imem_release_fifo_aful_th_reg[] = + { + {"cfgmt_drop_imem_release_fifo_aful_th", DPP_FIELD_FLAG_RW, 8, 9, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_nnh_rd_buf_aful_th_reg[] = + { + {"cfgmt_nnh_rd_buf_aful_th", DPP_FIELD_FLAG_RW, 5, 6, 0xa, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_pid_use_inall_reg[] = + { + {"cfgmt_nod_rd_buf_0_aful_th", DPP_FIELD_FLAG_RW, 4, 5, 0x3, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_pid_round_th_reg[] = + { + {"cfgmt_nod_rd_buf_1_aful_th", DPP_FIELD_FLAG_RW, 4, 5, 0x4, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_credit_fifo_afull_th_reg[] = + { + {"cfgmt_credit_fifo_afull_th", DPP_FIELD_FLAG_RW, 5, 6, 0xa, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_scan_fifo_afull_th_reg[] = + { + {"cfgmt_scan_fifo_afull_th", DPP_FIELD_FLAG_RW, 5, 6, 0xa, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_small_fifo_aful_th_reg[] = + { + {"cfgmt_small_fifo_aful_th", DPP_FIELD_FLAG_RW, 5, 6, 0x9, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_free_addr_fifo_aful_th_reg[] = + { + {"cfgmt_free_addr_fifo_aful_th", DPP_FIELD_FLAG_RW, 5, 6, 0x16, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_enq_rpt_fifo_aful_th_reg[] = + { + {"cfgmt_enq_rpt_fifo_aful_th", DPP_FIELD_FLAG_RW, 9, 10, 0x3e8, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_csw_shap_token_depth_reg[] = + { + {"qcfg_csw_shap_token_depth", DPP_FIELD_FLAG_RW, 16, 17, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_csw_shap_offset_value_reg[] = + { + {"qcfg_csw_shap_offset_value", DPP_FIELD_FLAG_RW, 8, 9, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_csw_fc_offset_value_reg[] = + { + {"qcfg_csw_fc_offset_value", DPP_FIELD_FLAG_RW, 8, 9, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qmu_init_done_state_reg[] = + { + {"csch_qcfg_init_done", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"qsch_qcfg_init_done", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"qlist_qcfg_init_done", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"qcsr_ram_init_done", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_csw_qcfg_port_shap_rdy_0_reg[] = + { + {"csw_qcfg_port_shap_rdy_0", DPP_FIELD_FLAG_RO, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_csw_qcfg_port_shap_rdy_1_reg[] = + { + {"csw_qcfg_port_shap_rdy_1", DPP_FIELD_FLAG_RO, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qlist_cfgmt_ram_init_done_reg[] = + { + {"qlist_qcfg_qds_ram_init_done", DPP_FIELD_FLAG_RO, 7, 1, 0x0, 0x0}, + {"qlist_qcfg_chk_ram_init_done", DPP_FIELD_FLAG_RO, 6, 1, 0x0, 0x0}, + {"qlist_qcfg_ept_ram_init_done", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"qlist_qcfg_cti_ram_init_done", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"qlist_qcfg_cto_ram_init_done", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"qlist_qcfg_bcnt_ram_init_done", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"qlist_qcfg_biu_ram_init_done", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"qlist_qcfg_baram_init_done", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qlist_cfgmt_ram_ecc_err_reg[] = + { + {"qds_ram_parity_err", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"qcsr_qnum_fifo_parity_err", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"sa_id_ram_parity_err", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"enq_rpt_fifo_parity_err", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"bcnts_parity_err", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"baram_parity_err_a", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"baram_parity_err_b", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"bcntm_ram_parity_err", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"biu_ram_single_ecc_err", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"chk_ram_single_ecc_err", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"cmd_sch_cmd_ram_single_ecc_err", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"cmd_sch_list_ram_single_ecc_err", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"cmd_sch_hp_ram_single_ecc_err", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"cmd_sch_tp_ram_single_ecc_err", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"cmd_sch_enq_active_ram_single_ecc_err", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"cmd_sch_deq_active_ram_single_ecc_err", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"cmd_sch_empty_ram_single_ecc_err", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"cmd_sch_eop_ram_single_ecc_err", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"cmd_sch_blkcnt_ram_single_ecc_err", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"biu_ram_double_ecc_err", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"chk_ram_double_ecc_err", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"cmd_sch_cmd_ram_double_ecc_err", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"cmd_sch_list_ram_double_ecc_err", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"cmd_sch_hp_ram_double_ecc_err", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"cmd_sch_tp_ram_double_ecc_err", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"cmd_sch_enq_active_ram_double_ecc_err", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"cmd_sch_deq_active_ram_double_ecc_err", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"cmd_sch_empty_ram_double_ecc_err", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"cmd_sch_eop_ram_double_ecc_err", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"cmd_sch_blkcnt_ram_double_ecc_err", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qlist_cfgmt_ram_slot_err_reg[] = + { + {"qds_ram_enq_rd_slot_err", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"qds_ram_deq_rd_slot_err", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"qds_ram_enq_wr_slot_err", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"qds_ram_deq_wr_slot_err", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"chk_ram_enq_rd_slot_err", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"chk_ram_deq_rd_slot_err", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"chk_ram_enq_wr_slot_err", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"chk_ram_deq_wr_slot_err", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ept_ram_enq_rd_slot_err", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ept_ram_deq_rd_slot_err", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ept_ram_enq_wr_slot_err", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ept_ram_deq_wr_slot_err", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"cti_ram_enq_rd_slot_err", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"cti_ram_deq_rd_slot_err", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"cti_ram_enq_wr_slot_err", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"cti_ram_deq_wr_slot_err", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"cto_ram_enq_rd_slot_err", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"cto_ram_deq_rd_slot_err", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"cto_ram_enq_wr_slot_err", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"cto_ram_deq_wr_slot_err", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qsch_cfgmt_ram_ecc_reg[] = + { + {"crbal_rama_parity_error", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"crbal_ramb_parity_error", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"crs_ram_parity_error", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"wlist_flag_ram_single_ecc_err", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"wlist_next_single_ecc_err", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"wlist_wactive_ram_single_ecc_err", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"wlist_ractive_ram_single_ecc_err", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"wlist_tp1_ram_single_ecc_err", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"wlist_tp2_ram_single_ecc_err", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"wlist_empty1_ram_single_ecc_err_a", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"wlist_empty1_ram_single_ecc_err_b", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"wlist_empty2_ram_single_ecc_err_a", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"wlist_empty2_ram_single_ecc_err_b", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"wlist_hp_ram_single_ecc_err_a", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"wlist_hp_ram_single_ecc_err_b", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"wlist_flag_ram_double_ecc_err", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"wlist_next_double_ecc_err", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"wlist_wactive_ram_double_ecc_err", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"wlist_ractive_ram_double_ecc_err", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"wlist_tp1_ram_double_ecc_err", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"wlist_tp2_ram_double_ecc_err", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"wlist_empty1_ram_double_ecc_err_a", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"wlist_empty1_ram_double_ecc_err_b", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"wlist_empty2_ram_double_ecc_err_a", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"wlist_empty2_ram_double_ecc_err_b", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"wlist_hp_ram_double_ecc_err_a", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"wlist_hp_ram_double_ecc_err_b", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qlist_cfgmt_fifo_state_reg[] = + { + {"pkt_age_req_fifo_overflow", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"pkt_age_req_fifo_underflow", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"qcsr_big_fifo_ovfl", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"qcsr_small_fifo_overflow", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"enq_rpt_fifo_overflow", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"enq_rpt_fifo_underflow", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"pds_fwft_overflow", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"pds_fwft_underflow", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"free_addr_fifo_overflow", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"free_addr_fifo_underflow", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"rd_release_fwft_overflow", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"rd_release_fwft_underflow", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"pid_free_list_overflow", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"pid_free_list_underflow", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"pid_prp_list_overflow", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"pid_prp_list_underflow", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"pid_rdy_list_overflow", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"pid_rdy_list_underflow", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"drop_imem_release_fwft_overflow", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"drop_imem_release_fwft_underflow", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"nnh_rd_buf_fifo_overflow", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"nnh_rd_buf_fifo_underflow", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"nod_rd_buf_0_fifo_overflow", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"nod_rd_buf_0_fifo_underflow", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"nod_rd_buf_1_fifo_overflow", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"nod_rd_buf_1_fifo_underflow", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qlist_qcfg_clr_done_reg[] = + { + {"qlist_qcfg_clr_done", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qmu_int_mask1_reg[] = + { + {"qmu_int_mask1", DPP_FIELD_FLAG_RW, 29, 30, 0x3fffffff, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qmu_int_mask2_reg[] = + { + {"qmu_int_mask2", DPP_FIELD_FLAG_RW, 19, 20, 0xfffff, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qmu_int_mask3_reg[] = + { + {"qmu_int_mask3", DPP_FIELD_FLAG_RW, 26, 27, 0x7ffffff, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qmu_int_mask4_reg[] = + { + {"qmu_int_mask4", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qmu_int_mask5_reg[] = + { + {"qmu_int_mask5", DPP_FIELD_FLAG_RW, 30, 31, 0x7fffffff, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qmu_int_mask6_reg[] = + { + {"qmu_int_mask6", DPP_FIELD_FLAG_RW, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cmd_sch_cfgmt_fifo_state_reg[] = + { + {"nsop_fifo_parity_err", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"cmdsch_rd_cmd_fifo_parity_err", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"sop_fifo_afull", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"sop_fifo_empty", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"sop_fifo_overflow", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"sop_fifo_underflow", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"mmu_data_fifo_afull", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"mmu_data_fifo_empty", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"mmudat_fifo_overflow", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"mmudat_fifo_underflow", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"non_sop_fifo_afull", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"non_sop_fifo_empty", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"nsop_fifo_overflow", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"nsop_fifo_underflow", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"cmdsch_rd_cmd_fifo_afull", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"cmdsch_rd_cmd_fifo_empty", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"cmdsch_rd_cmd_fifo_overflow", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"cmdsch_rd_cmd_fifo_underflow", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"wlist_qnum_fifo_overflow", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"wlist_qnum_fifo_underflow", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"qsch_scan_fifo_overflow", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"qsch_scan_fifo_underflow", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"qsch_credit_fifo_overflow", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"qsch_credit_fifo_underflow", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"qsch_credit_fifo2_overflow", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"qsch_credit_fifo2_underflow", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qlist_r_bcnt_reg[] = + { + {"qlist_r_bcnt", DPP_FIELD_FLAG_RO, 21, 22, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qsch_rw_crbal_reg[] = + { + {"qsch_rw_crbal", DPP_FIELD_FLAG_RW, 16, 17, 0xff, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qsch_rw_crs_reg[] = + { + {"qsch_rw_crs", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qsch_r_wlist_empty_reg[] = + { + {"qsch_r_wlist_empty", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_baram_rd_reg[] = + { + {"qcfg_qlist_baram_rd", DPP_FIELD_FLAG_RO, 6, 7, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qsch_crbal_fb_rw_reg[] = + { + {"qcfg_qlist_crbal_fb_rw", DPP_FIELD_FLAG_RW, 16, 17, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_grp0_bank_reg[] = + { + {"qcfg_qlist_grp0_bank_wr", DPP_FIELD_FLAG_RW, 2, 3, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_grp1_bank_reg[] = + { + {"qcfg_qlist_grp1_bank_wr", DPP_FIELD_FLAG_RW, 2, 3, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_grp2_bank_reg[] = + { + {"qcfg_qlist_grp2_bank_wr", DPP_FIELD_FLAG_RW, 2, 3, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_grp3_bank_reg[] = + { + {"qcfg_qlist_grp3_bank_wr", DPP_FIELD_FLAG_RW, 2, 3, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_grp4_bank_reg[] = + { + {"qcfg_qlist_grp4_bank_wr", DPP_FIELD_FLAG_RW, 2, 3, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_grp5_bank_reg[] = + { + {"qcfg_qlist_grp5_bank_wr", DPP_FIELD_FLAG_RW, 2, 3, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_grp6_bank_reg[] = + { + {"qcfg_qlist_grp6_bank_wr", DPP_FIELD_FLAG_RW, 2, 3, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_grp7_bank_reg[] = + { + {"qcfg_qlist_grp7_bank_wr", DPP_FIELD_FLAG_RW, 2, 3, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_grp_reg[] = + { + {"qcfg_qlist_grp_wr", DPP_FIELD_FLAG_RW, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_active_to_bank_cfg_reg[] = + { + {"cfgmt_active_to_bank_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x0, 0x1}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_ddr_in_mmu_cfg_reg[] = + { + {"cfgmt_ddr_in_mmu_cfg", DPP_FIELD_FLAG_RW, 3, 4, 0x0, 0x1}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_ddr_in_qmu_cfg_reg[] = + { + {"cfgmt_ddr_in_qmu_cfg", DPP_FIELD_FLAG_RW, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_bank_to_mmu_cfg_reg[] = + { + {"cfgmt_bank_in_mmu_cfg", DPP_FIELD_FLAG_RW, 2, 3, 0x0, 0x1}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_bank_to_qmu_cfg_reg[] = + { + {"cfgmt_bank_in_qmu_cfg", DPP_FIELD_FLAG_RW, 2, 3, 0x0, 0x1}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_grp_ram_n_clr_thd_reg[] = + { + {"cfgmt_grp_ram_n_clr_thd", DPP_FIELD_FLAG_RW, 5, 6, 0x3f, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_age_pkt_num_reg[] = + { + {"cfgmt_age_pkt_num", DPP_FIELD_FLAG_RW, 3, 4, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_age_multi_interval_reg[] = + { + {"cfgmt_age_multi_interval", DPP_FIELD_FLAG_RW, 15, 16, 0xff, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_qmu_pkt_age_en_reg[] = + { + {"cfgmt_qmu_pkt_age_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_qmu_pkt_age_interval_reg[] = + { + {"cfgmt_qmu_pkt_age_interval", DPP_FIELD_FLAG_RW, 31, 32, 0xff, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_qmu_pkt_age_start_end_reg[] = + { + {"cfgmt_qmu_pkt_age_end", DPP_FIELD_FLAG_RW, 31, 16, 0x23ff, 0x0}, + {"cfgmt_qmu_pkt_age_start", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_pkt_age_req_aful_th_reg[] = + { + {"cfgmt_pkt_age_req_aful_th", DPP_FIELD_FLAG_RW, 5, 6, 0xa, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_pkt_age_step_interval_reg[] = + { + {"cfgmt_pkt_age_step_interval", DPP_FIELD_FLAG_RW, 7, 8, 0xff, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_qmu_imem_age_mode_reg[] = + { + {"cfgmt_qmu_imem_age_en", DPP_FIELD_FLAG_RW, 2, 1, 0x0, 0x0}, + {"cfgmt_qmu_imem_age_qlen_en", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"cfgmt_qmu_imem_age_time_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_qmu_imem_qlen_age_interval_reg[] = + { + {"cfgmt_qmu_imem_qlen_age_interval", DPP_FIELD_FLAG_RW, 15, 16, 0xff, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_qmu_imem_time_age_interval_reg[] = + { + {"cfgmt_qmu_imem_time_age_interval", DPP_FIELD_FLAG_RW, 31, 32, 0xff, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_qmu_imem_qlen_age_thd_reg[] = + { + {"cfgmt_qmu_imem_qlen_age_thd", DPP_FIELD_FLAG_RW, 13, 14, 0x1000, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_imem_age_step_interval_reg[] = + { + {"cfgmt_imem_age_step_interval", DPP_FIELD_FLAG_RW, 7, 8, 0xff, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_qmu_ecc_bypass_read_reg[] = + { + {"cfgmt_qmu_ecc_bypass_read", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_qmu_resp_stat_fc_en_reg[] = + { + {"cfgmt_qmu_resp_stat_fc_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_qmu_bank_xoff_pds_mode_reg[] = + { + {"cfgmt_qmu_bank_xoff_pds_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_qmu_stat_offset_reg[] = + { + {"cfgmt_qmu_stat_offset", DPP_FIELD_FLAG_RW, 8, 9, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_fc_cnt_mode_reg[] = + { + {"fc_cnt_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_mmu_qmu_wr_fc_cnt_reg[] = + { + {"mmu_qmu_wr_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_mmu_qmu_rd_fc_cnt_reg[] = + { + {"mmu_qmu_rd_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qmu_cgavd_fc_cnt_reg[] = + { + {"qmu_cgavd_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cgavd_qmu_pkt_cnt_reg[] = + { + {"cgavd_qmu_pkt_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cgavd_qmu_pktlen_all_reg[] = + { + {"cgavd_qmu_pktlen_all", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_observe_portfc_spec_reg[] = + { + {"observe_portfc_spec", DPP_FIELD_FLAG_RW, 5, 6, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_lif_portfc_count_reg[] = + { + {"spec_lif_portfc_count", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_qmu_pfc_en_reg[] = + { + {"cfgmt_qmu_pfc_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_qmu_pfc_mask_1_reg[] = + { + {"cfgmt_qmu_pfc_mask_1", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_qmu_pfc_mask_2_reg[] = + { + {"cfgmt_qmu_pfc_mask_2", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_int_repeat_reg[] = + { + {"int_repeat", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_up_size_reg[] = + { + {"dma_up_size", DPP_FIELD_FLAG_RW, 9, 10, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_soc_wr_time_out_thresh_reg[] = + { + {"soc_wr_time_out_thresh", DPP_FIELD_FLAG_RW, 31, 32, 0xfa0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_cfg_shap_param_reg[] = + { + {"shap_en", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + {"shap_rate", DPP_FIELD_FLAG_RW, 30, 31, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_cfg_shap_token_reg[] = + { + {"cfg_shap_plen_offset", DPP_FIELD_FLAG_RW, 31, 8, 0x00, 0x0}, + {"cfg_shap_token", DPP_FIELD_FLAG_RW, 16, 17, 0xf0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_idle_ptr_fifo_aful_th_reg[] = + { + {"idle_ptr3_fifo_aful_th", DPP_FIELD_FLAG_RW, 31, 8, 0x5a, 0x0}, + {"idle_ptr2_fifo_aful_th", DPP_FIELD_FLAG_RW, 23, 8, 0x5a, 0x0}, + {"idle_ptr1_fifo_aful_th", DPP_FIELD_FLAG_RW, 15, 8, 0x5a, 0x0}, + {"idle_ptr0_fifo_aful_th", DPP_FIELD_FLAG_RW, 7, 8, 0x5a, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos_port_cfg_reg[] = + { + {"cos3_port_cfg", DPP_FIELD_FLAG_RW, 31, 8, 0x3f, 0x0}, + {"cos2_port_cfg", DPP_FIELD_FLAG_RW, 23, 8, 0x3e, 0x0}, + {"cos1_port_cfg", DPP_FIELD_FLAG_RW, 15, 8, 0x3d, 0x0}, + {"cos0_port_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x3c, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_ind_status_reg[] = + { + {"ind_access_done", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_ind_cmd_reg[] = + { + {"ind_rd_or_wr", DPP_FIELD_FLAG_RW, 28, 1, 0x0, 0x0}, + {"ind_mem_id", DPP_FIELD_FLAG_RW, 22, 3, 0x0, 0x0}, + {"ind_mem_addr", DPP_FIELD_FLAG_RW, 11, 12, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_ind_data0_reg[] = + { + {"ind_dat0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_ind_data1_reg[] = + { + {"ind_dat1", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_ind_data2_reg[] = + { + {"ind_dat2", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_ind_data3_reg[] = + { + {"ind_dat3", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_ind_data4_reg[] = + { + {"ind_dat4", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_ind_data5_reg[] = + { + {"ind_dat5", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_ind_data6_reg[] = + { + {"ind_dat6", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_ind_data7_reg[] = + { + {"ind_dat7", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_tcam_0_cmd_reg[] = + { + {"cfg_vben", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"cfg_vbi", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"cfg_t_strwc", DPP_FIELD_FLAG_RW, 22, 2, 0x1, 0x0}, + {"tcam0_sm", DPP_FIELD_FLAG_RW, 20, 6, 0x0, 0x0}, + {"tcam0_smen", DPP_FIELD_FLAG_RW, 14, 1, 0x0, 0x0}, + {"tcam0_rm", DPP_FIELD_FLAG_RW, 13, 2, 0x2, 0x0}, + {"tcam0_rmen", DPP_FIELD_FLAG_RW, 11, 1, 0x0, 0x0}, + {"tcam0_enable", DPP_FIELD_FLAG_RW, 10, 1, 0x0, 0x0}, + {"tcam0_flush", DPP_FIELD_FLAG_WO, 9, 1, 0x0, 0x0}, + {"tcam0_unload", DPP_FIELD_FLAG_WO, 8, 1, 0x0, 0x0}, + {"tcam0_unload_addr", DPP_FIELD_FLAG_RW, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_tcam_1_cmd_reg[] = + { + {"tcam1_sm", DPP_FIELD_FLAG_RW, 20, 6, 0x0, 0x0}, + {"tcam1_smen", DPP_FIELD_FLAG_RW, 14, 1, 0x0, 0x0}, + {"tcam1_rm", DPP_FIELD_FLAG_RW, 13, 2, 0x2, 0x0}, + {"tcam1_rmen", DPP_FIELD_FLAG_RW, 11, 1, 0x0, 0x0}, + {"tcam1_enable", DPP_FIELD_FLAG_RW, 10, 1, 0x0, 0x0}, + {"tcam1_flush", DPP_FIELD_FLAG_WO, 9, 1, 0x0, 0x0}, + {"tcam1_unload", DPP_FIELD_FLAG_WO, 8, 1, 0x0, 0x0}, + {"tcam1_unload_addr", DPP_FIELD_FLAG_RW, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_port_en_0_reg[] = + { + {"cfg_isch_port_en_0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_port_en_1_reg[] = + { + {"cfg_isch_port_en_1", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_port_en_2_reg[] = + { + {"cfg_isch_port_en_2", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_port_en_3_reg[] = + { + {"cfg_port_change_en_0", DPP_FIELD_FLAG_RW, 26, 1, 0x0, 0x0}, + {"cfg_port_change_en_1", DPP_FIELD_FLAG_RW, 25, 1, 0x0, 0x0}, + {"cfg_isch_port_en_3", DPP_FIELD_FLAG_RW, 22, 23, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_cfg_port_l2_offset_mode_0_reg[] = + { + {"cfg_port_l2_offset_mode_0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_cfg_port_l2_offset_mode_1_reg[] = + { + {"cfg_port_l2_offset_mode_1", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_cfg_port_l2_offset_mode_2_reg[] = + { + {"cfg_port_l2_offset_mode_2", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_cfg_port_l2_offset_mode_3_reg[] = + { + {"cfg_port_l2_offset_mode_3", DPP_FIELD_FLAG_RW, 22, 23, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_port_fc_mode_0_reg[] = + { + {"cfg_isch_fc_mode_0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_port_fc_mode_1_reg[] = + { + {"cfg_isch_fc_mode_1", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_port_fc_mode_2_reg[] = + { + {"cfg_isch_fc_mode_2", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_port_fc_mode_3_reg[] = + { + {"cfg_isch_fc_mode_3", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_port_fc_mode_4_reg[] = + { + {"cfg_isch_fc_mode_4", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_port_fc_mode_5_reg[] = + { + {"cfg_isch_fc_mode_5", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_port_fc_mode_6_reg[] = + { + {"cfg_isch_fc_mode_6", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_port_fc_mode_7_reg[] = + { + {"cfg_pfu_aging_en", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"cfg_isch_aging_en", DPP_FIELD_FLAG_RW, 14, 1, 0x0, 0x0}, + {"cfg_isch_fc_mode_7", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_cfg_isch_aging_th_reg[] = + { + {"cfg_pfu_delay_cycle", DPP_FIELD_FLAG_RW, 31, 16, 0x8000, 0x0}, + {"cfg_isch_aging_th", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_isch_fifo_th_0_reg[] = + { + {"cfg_sch_fifo3_fc_th", DPP_FIELD_FLAG_RW, 29, 6, 0x30, 0x0}, + {"cfg_sch_fifo2_fc_th", DPP_FIELD_FLAG_RW, 21, 6, 0x30, 0x0}, + {"cfg_sch_fifo1_fc_th", DPP_FIELD_FLAG_RW, 13, 6, 0x30, 0x0}, + {"cfg_sch_fifo0_fc_th", DPP_FIELD_FLAG_RW, 5, 6, 0x30, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_isch_cfg_1_reg[] = + { + {"cfg_parser_max_len_en", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"cfg_parser_max_len", DPP_FIELD_FLAG_RW, 30, 15, 0x3e80, 0x0}, + {"cfg_parser_min_len_en", DPP_FIELD_FLAG_RW, 15, 1, 0x0, 0x0}, + {"cfg_parser_min_len", DPP_FIELD_FLAG_RW, 14, 7, 0x3c, 0x0}, + {"sp_sch_sel", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_tcam_0_vld_reg[] = + { + {"cfg_tcam0_vld", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_tcam_1_vld_reg[] = + { + {"cfg_tcam1_vld", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_cpu_port_en_mask_reg[] = + { + {"cpu_port_en_mask", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_pktrx_glbal_cfg_0_reg[] = + { + {"pktrx_glbal_cfg_0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_pktrx_glbal_cfg_1_reg[] = + { + {"pktrx_glbal_cfg_1", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_pktrx_glbal_cfg_2_reg[] = + { + {"pktrx_glbal_cfg_2", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_pktrx_glbal_cfg_3_reg[] = + { + {"pktrx_glbal_cfg_3", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_nppu_start_reg[] = + { + {"nppu_start", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_stat_ind_status_reg[] = + { + {"ind_access_done", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_stat_ind_cmd_reg[] = + { + {"ind_rd_or_wr", DPP_FIELD_FLAG_RW, 28, 1, 0x0, 0x0}, + {"ind_mem_id", DPP_FIELD_FLAG_RW, 22, 3, 0x0, 0x0}, + {"ind_mem_addr", DPP_FIELD_FLAG_RW, 11, 12, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_stat_ind_data0_reg[] = + { + {"ind_dat0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_idma_cfg_debug_cnt_ovfl_mode_reg[] = + { + {"debug_cnt_ovfl_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_idma_stat_ind_status_reg[] = + { + {"ind_access_done", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_idma_stat_ind_cmd_reg[] = + { + {"ind_rd_or_wr", DPP_FIELD_FLAG_RW, 28, 1, 0x0, 0x0}, + {"ind_mem_id", DPP_FIELD_FLAG_RW, 27, 8, 0x0, 0x0}, + {"ind_mem_addr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_idma_stat_ind_data0_reg[] = + { + {"ind_data0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_ind_status_reg[] = + { + {"ind_access_done", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_ind_cmd_reg[] = + { + {"ind_rd_or_wr", DPP_FIELD_FLAG_RW, 28, 1, 0x0, 0x0}, + {"ind_mem_id", DPP_FIELD_FLAG_RW, 27, 8, 0x0, 0x0}, + {"ind_mem_addr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_ind_data0_reg[] = + { + {"ind_data0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_ind_data1_reg[] = + { + {"ind_data1", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_ind_data2_reg[] = + { + {"ind_data2", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_ind_data3_reg[] = + { + {"ind_data3", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_ind_data4_reg[] = + { + {"ind_data4", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_ind_data5_reg[] = + { + {"ind_data5", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_ind_data6_reg[] = + { + {"ind_data6", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_ind_data7_reg[] = + { + {"ind_data7", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_idma_public_th_reg[] = + { + {"idma_public_th", DPP_FIELD_FLAG_RW, 14, 15, 0x400, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_lif_public_th_reg[] = + { + {"lif_public_th", DPP_FIELD_FLAG_RW, 14, 15, 0x400, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_idma_total_th_reg[] = + { + {"idma_total_th", DPP_FIELD_FLAG_RW, 14, 15, 0x3ffc, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_lif_total_th_reg[] = + { + {"lif_total_th", DPP_FIELD_FLAG_RW, 14, 15, 0x3fa2, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_mc_total_th_reg[] = + { + {"mc_total_th", DPP_FIELD_FLAG_RW, 14, 15, 0x400, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_mc_cos10_th_reg[] = + { + {"mc_cos1_mode", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + {"mc_cos0_mode", DPP_FIELD_FLAG_RW, 30, 1, 0x0, 0x0}, + {"mc_cos1_th", DPP_FIELD_FLAG_RW, 29, 15, 0x80, 0x0}, + {"mc_cos0_th", DPP_FIELD_FLAG_RW, 14, 15, 0x80, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_mc_cos32_th_reg[] = + { + {"mc_cos3_mode", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + {"mc_cos2_mode", DPP_FIELD_FLAG_RW, 30, 1, 0x0, 0x0}, + {"mc_cos3_th", DPP_FIELD_FLAG_RW, 29, 15, 0x80, 0x0}, + {"mc_cos2_th", DPP_FIELD_FLAG_RW, 14, 15, 0x80, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_mc_cos54_th_reg[] = + { + {"mc_cos5_mode", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + {"mc_cos4_mode", DPP_FIELD_FLAG_RW, 30, 1, 0x0, 0x0}, + {"mc_cos5_th", DPP_FIELD_FLAG_RW, 29, 15, 0x80, 0x0}, + {"mc_cos4_th", DPP_FIELD_FLAG_RW, 14, 15, 0x80, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_mc_cos76_th_reg[] = + { + {"mc_cos7_mode", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + {"mc_cos6_mode", DPP_FIELD_FLAG_RW, 30, 1, 0x0, 0x0}, + {"mc_cos7_th", DPP_FIELD_FLAG_RW, 29, 15, 0x80, 0x0}, + {"mc_cos6_th", DPP_FIELD_FLAG_RW, 14, 15, 0x80, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_debug_cnt_ovfl_mode_reg[] = + { + {"debug_cnt_ovfl_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_se_key_aful_negate_cfg_reg[] = + { + {"se_key_aful_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_sa_flag_reg[] = + { + {"sa_flag", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_ind_data_reg[] = + { + {"ind_data", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_ind_status_reg[] = + { + {"ind_access_done", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_ind_cmd_reg[] = + { + {"ind_rd_or_wr", DPP_FIELD_FLAG_RW, 28, 1, 0x0, 0x0}, + {"ind_mem_id", DPP_FIELD_FLAG_RW, 27, 8, 0x0, 0x0}, + {"ind_mem_addr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_total_cnt_reg[] = + { + {"total_cnt", DPP_FIELD_FLAG_RO, 14, 15, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_idma_pub_cnt_reg[] = + { + {"idma_pub_cnt", DPP_FIELD_FLAG_RO, 14, 15, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_lif_pub_cnt_reg[] = + { + {"lif_pub_cnt", DPP_FIELD_FLAG_RO, 14, 15, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_mc_total_cnt_reg[] = + { + {"mc_total_cnt", DPP_FIELD_FLAG_RO, 14, 15, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_pbu_thram_init_done_reg[] = + { + {"pbu_thram_init_done", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_ifb_fptr_init_done_reg[] = + { + {"ifb_fptr_init_done", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_cfg_weight_normal_uc_reg[] = + { + {"weight_normal_uc", DPP_FIELD_FLAG_RW, 6, 7, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_cfg_fabric_or_saip_reg[] = + { + {"fabric_or_saip", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_stat_ind_status_reg[] = + { + {"ind_access_done", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_stat_ind_cmd_reg[] = + { + {"ind_rd_or_wr", DPP_FIELD_FLAG_RW, 28, 1, 0x0, 0x0}, + {"ind_mem_id", DPP_FIELD_FLAG_RW, 27, 8, 0x0, 0x0}, + {"ind_mem_addr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_stat_ind_dat0_reg[] = + { + {"ind_dat0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_ind_access_done_reg[] = + { + {"ind_access_done", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_ind_command_reg[] = + { + {"ind_rd_or_wr", DPP_FIELD_FLAG_RW, 28, 1, 0x0, 0x0}, + {"ind_mem_id", DPP_FIELD_FLAG_RW, 27, 8, 0x0, 0x0}, + {"ind_mem_addr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_ind_dat0_reg[] = + { + {"ind_dat0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_ind_dat1_reg[] = + { + {"ind_dat1", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_fabric_or_saip_reg[] = + { + {"fabric_or_saip", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_max_pkt_len_reg[] = + { + {"max_pkt_len", DPP_FIELD_FLAG_RW, 14, 15, 0x3f00, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_age_en_reg[] = + { + {"age_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_age_mode_reg[] = + { + {"age_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_age_value_time_reg[] = + { + {"age_value_time", DPP_FIELD_FLAG_RW, 31, 32, 0xe4e1c0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_age_value_room_reg[] = + { + {"age_value_room", DPP_FIELD_FLAG_RW, 31, 32, 0x1e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_age_out_cnt_reg[] = + { + {"age_out_cnt", DPP_FIELD_FLAG_RW, 6, 7, 0xa, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_token_value_a_reg[] = + { + {"token_value_a", DPP_FIELD_FLAG_RW, 31, 12, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_token_value_b_reg[] = + { + {"token_value_b", DPP_FIELD_FLAG_RW, 31, 12, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_cfg_shap_en_p0_reg[] = + { + {"cfg_shap_en_p0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_cfg_shap_en_p1_reg[] = + { + {"cfg_shap_en_p1", DPP_FIELD_FLAG_RW, 31, 28, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_cfg_shap_en_tm_reg[] = + { + {"cfg_shap_en_tm", DPP_FIELD_FLAG_RW, 31, 2, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_stat_ind_status_reg[] = + { + {"ind_access_done", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_stat_ind_cmd_reg[] = + { + {"ind_rd_or_wr", DPP_FIELD_FLAG_RW, 28, 1, 0x0, 0x0}, + {"ind_mem_id", DPP_FIELD_FLAG_RW, 27, 8, 0x0, 0x0}, + {"ind_mem_addr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_stat_ind_data0_reg[] = + { + {"ind_dat0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_stat_debug_cnt_cfg_reg[] = + { + {"debug_cnt_ovf_mode", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + {"debug_cnt_rdclr_mode", DPP_FIELD_FLAG_RW, 30, 1, 0x0, 0x0}, + {"user_cnt_value", DPP_FIELD_FLAG_RW, 29, 4, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_bfd_firstchk_th_reg[] = + { + {"bfd_firstchk_th", DPP_FIELD_FLAG_RW, 18, 19, 0xc350, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_memid_0_pbu_fc_idmath_ram_reg[] = + { + {"lif_th_15", DPP_FIELD_FLAG_RW, 164, 15, 0x0, 0x0}, + {"lif_prv_15", DPP_FIELD_FLAG_RW, 149, 15, 0x0, 0x0}, + {"idma_prv_15", DPP_FIELD_FLAG_RW, 134, 15, 0x0, 0x0}, + {"idma_th_cos0_15", DPP_FIELD_FLAG_RW, 119, 15, 0x0, 0x0}, + {"idma_th_cos1_15", DPP_FIELD_FLAG_RW, 104, 15, 0x0, 0x0}, + {"idma_th_cos2_15", DPP_FIELD_FLAG_RW, 89, 15, 0x0, 0x0}, + {"idma_th_cos3_15", DPP_FIELD_FLAG_RW, 74, 15, 0x0, 0x0}, + {"idma_th_cos4_15", DPP_FIELD_FLAG_RW, 59, 15, 0x0, 0x0}, + {"idma_th_cos5_15", DPP_FIELD_FLAG_RW, 44, 15, 0x0, 0x0}, + {"idma_th_cos6_15", DPP_FIELD_FLAG_RW, 29, 15, 0x0, 0x0}, + {"idma_th_cos7_15", DPP_FIELD_FLAG_RW, 14, 15, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_memid_1_pbu_fc_macth_ram_reg[] = + { + {"cos7_th", DPP_FIELD_FLAG_RW, 119, 15, 0x0, 0x0}, + {"cos6_th", DPP_FIELD_FLAG_RW, 104, 15, 0x0, 0x0}, + {"cos5_th", DPP_FIELD_FLAG_RW, 89, 15, 0x0, 0x0}, + {"cos4_th", DPP_FIELD_FLAG_RW, 74, 15, 0x0, 0x0}, + {"cos3_th", DPP_FIELD_FLAG_RW, 59, 15, 0x0, 0x0}, + {"cos2_th", DPP_FIELD_FLAG_RW, 44, 15, 0x0, 0x0}, + {"cos1_th", DPP_FIELD_FLAG_RW, 29, 15, 0x0, 0x0}, + {"cos0_th", DPP_FIELD_FLAG_RW, 14, 15, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_memid_1_all_kind_port_cnt_reg[] = + { + {"peak_port_cnt", DPP_FIELD_FLAG_RO, 29, 15, 0x0, 0x0}, + {"current_port_cnt", DPP_FIELD_FLAG_RO, 14, 15, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_memid_2_ppu_pbu_ifb_req_vld_cnt_reg[] = + { + {"ppu_pbu_ifb_req_vld_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_memid_2_pbu_ppu_ifb_rsp_vld_cnt_reg[] = + { + {"pbu_ppu_ifb_rsp_vld_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_memid_2_odma_pbu_recy_ptr_vld_cnt_reg[] = + { + {"odma_pbu_recy_ptr_vld_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_memid_2_ppu_pbu_mcode_pf_req_cnt_reg[] = + { + {"ppu_pbu_mcode_pf_req_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_memid_2_pbu_ppu_mcode_pf_rsp_cnt_reg[] = + { + {"pbu_ppu_mcode_pf_rsp_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_memid_2_ppu_pbu_logic_pf_req_cnt_reg[] = + { + {"ppu_pbu_logic_pf_req_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_memid_2_pbu_ppu_logic_pf_rsp_cnt_reg[] = + { + {"pbu_ppu_logic_pf_rsp_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_memid_2_ppu_use_ptr_pulse_cnt_reg[] = + { + {"ppu_use_ptr_pulse_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_memid_2_ppu_pbu_wb_vld_cnt_reg[] = + { + {"ppu_pbu_wb_vld_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_memid_2_pbu_ppu_reorder_para_vld_cnt_reg[] = + { + {"pbu_ppu_reorder_para_vld_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_memid_2_se_pbu_dpi_key_vld_cnt_reg[] = + { + {"se_pbu_dpi_key_vld_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_memid_2_pbu_se_dpi_rsp_datvld_cnt_reg[] = + { + {"pbu_se_dpi_rsp_datvld_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_memid_2_odma_pbu_ifb_rd1_cnt_reg[] = + { + {"odma_pbu_ifb_rd1_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_memid_2_odma_pbu_ifb_rd2_cnt_reg[] = + { + {"odma_pbu_ifb_rd2_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_memid_2_pbu_ppu_mcode_pf_no_rsp_cnt_reg[] = + { + {"pbu_ppu_mcode_pf_no_rsp_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_memid_2_pbu_ppu_logic_pf_no_rsp_cnt_reg[] = + { + {"pbu_ppu_logic_pf_no_rsp_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_memid_3_cpu_rd_ifb_data_reg[] = + { + {"cpu_rd_ifb_data", DPP_FIELD_FLAG_RO, 2047, 2048, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_memid_4_mux_sel_rgt_reg[] = + { + {"current_port_cnt", DPP_FIELD_FLAG_RW, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_memid_5_port_pub_cnt_reg[] = + { + {"port_pub_cnt", DPP_FIELD_FLAG_RO, 14, 15, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_idma_stat_memid_1_idma_o_isu_pkt_pulse_total_cnt_reg[] = + { + {"idma_o_isu_pkt_pulse_total_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_idma_stat_memid_1_idma_o_isu_epkt_pulse_total_cnt_reg[] = + { + {"idma_o_isu_epkt_pulse_total_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_idma_stat_memid_1_idma_dispkt_pulse_total_cnt_reg[] = + { + {"idma_dispkt_pulse_total_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_idma_stat_memid_0_idma_o_isu_pkt_pulse_cnt_reg[] = + { + {"idma_o_isu_pkt_pulse_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_idma_stat_memid_0_idma_o_isu_epkt_pulse_cnt_reg[] = + { + {"idma_o_isu_epkt_pulse_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_idma_stat_memid_0_idma_dispkt_pulse_cnt_reg[] = + { + {"idma_dispkt_pulse_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_test_r_reg[] = + { + {"test_r", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_debug_en_r_reg[] = + { + {"debug_en_r", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_csr_dup_table_wr_data_reg[] = + { + {"item_vld", DPP_FIELD_FLAG_RW, 24, 1, 0x0, 0x0}, + {"flownum_vld", DPP_FIELD_FLAG_RW, 23, 1, 0x0, 0x0}, + {"start_pc", DPP_FIELD_FLAG_RW, 22, 15, 0x0, 0x0}, + {"flownum", DPP_FIELD_FLAG_RW, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_csr_dup_table_rd_data_reg[] = + { + {"item_vld", DPP_FIELD_FLAG_RO, 24, 1, 0x0, 0x0}, + {"flownum_vld", DPP_FIELD_FLAG_RO, 23, 1, 0x0, 0x0}, + {"start_pc", DPP_FIELD_FLAG_RO, 22, 15, 0x0, 0x0}, + {"flownum", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_csr_dup_table_addr_reg[] = + { + {"csr_dup_table_operation", DPP_FIELD_FLAG_WO, 6, 1, 0x0, 0x0}, + {"csr_dup_table_addr", DPP_FIELD_FLAG_WO, 5, 6, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_debug_vld_reg[] = + { + {"ppu_debug_vld", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_cop_thash_rsk_319_288_reg[] = + { + {"rsk_319_288", DPP_FIELD_FLAG_RW, 31, 32, 0x6d5a56da, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_cop_thash_rsk_287_256_reg[] = + { + {"rsk_287_256", DPP_FIELD_FLAG_RW, 31, 32, 0x255b0ec2, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_cop_thash_rsk_255_224_reg[] = + { + {"rsk_255_224", DPP_FIELD_FLAG_RW, 31, 32, 0x4167253d, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_cop_thash_rsk_223_192_reg[] = + { + {"rsk_223_192", DPP_FIELD_FLAG_RW, 31, 32, 0x43a38fb0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_cop_thash_rsk_191_160_reg[] = + { + {"rsk_191_160", DPP_FIELD_FLAG_RW, 31, 32, 0xd0ca2bcb, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_cop_thash_rsk_159_128_reg[] = + { + {"rsk_159_128", DPP_FIELD_FLAG_RW, 31, 32, 0xae7b30b4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_cop_thash_rsk_127_096_reg[] = + { + {"rsk_127_096", DPP_FIELD_FLAG_RW, 31, 32, 0x77cb2da3, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_cop_thash_rsk_095_064_reg[] = + { + {"rsk_095_064", DPP_FIELD_FLAG_RW, 31, 32, 0x8030f20c, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_cop_thash_rsk_063_032_reg[] = + { + {"rsk_063_032", DPP_FIELD_FLAG_RW, 31, 32, 0x6a42b73b, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_cop_thash_rsk_031_000_reg[] = + { + {"rsk_031_000", DPP_FIELD_FLAG_RW, 31, 32, 0xbeac01fa, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_cfg_ipv4_ipid_start_value_reg[] = + { + {"cfg_ipv4_ipid_start_value", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_cfg_ipv4_ipid_end_value_reg[] = + { + {"cfg_ipv4_ipid_end_value", DPP_FIELD_FLAG_RW, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_cluster_mf_in_en_reg[] = + { + {"cluster_mf_in_en", DPP_FIELD_FLAG_RW, 5, 6, 0x3f, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_empty_reg[] = + { + {"ppu_empty", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_w_addr_reg[] = + { + {"instrmem_w_addr", DPP_FIELD_FLAG_WO, 12, 13, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_w_data_191_160_reg[] = + { + {"instrmem_w_data_191_160", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_w_data_159_128_reg[] = + { + {"instrmem_w_data_159_128", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_w_data_127_96_reg[] = + { + {"instrmem_w_data_127_96", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_w_data_95_64_reg[] = + { + {"instrmem_w_data_95_64", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_w_data_63_32_reg[] = + { + {"instrmem_w_data_63_32", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_w_data_31_0_reg[] = + { + {"instrmem_w_data_31_0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_isu_fwft_mf_fifo_prog_full_assert_cfg_reg[] = + { + {"isu_fwft_mf_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x1e, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_isu_fwft_mf_fifo_prog_full_negate_cfg_reg[] = + { + {"isu_fwft_mf_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x1e, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_int_1200m_mask_reg[] = + { + {"me7_interrupt_mask", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"me6_interrupt_mask", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"me5_interrupt_mask", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"me4_interrupt_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"me3_interrupt_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"me2_interrupt_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"me1_interrupt_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"me0_interrupt_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_ppu4k_cluster_wr_high_data_r_mex_reg[] = + { + {"wr_high_data_r_mex", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu4k_cluster_wr_low_data_r_mex_reg[] = + { + {"wr_low_data_r_mex", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu4k_cluster_addr_r_mex_reg[] = + { + {"operate_type", DPP_FIELD_FLAG_WO, 8, 1, 0x0, 0x0}, + {"addr_r_mex", DPP_FIELD_FLAG_RW, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu4k_cluster_sdt_tbl_ind_access_done_reg[] = + { + {"rd_addr_r_mex", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu4k_cluster_rd_high_data_r_mex_reg[] = + { + {"rd_high_data_r_mex", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu4k_cluster_rd_low_data_r_mex_reg[] = + { + {"rd_low_data_r_mex", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_init_ok_reg[] = + { + {"init_ok", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_cpu_rd_rdy_reg[] = + { + {"cpu_rd_rdy", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_cpu_rd_data_tmp0_reg[] = + { + {"cpu_rd_data_tmp0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_cpu_rd_data_tmp1_reg[] = + { + {"cpu_rd_data_tmp1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_cpu_rd_data_tmp2_reg[] = + { + {"cpu_rd_data_tmp2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_cpu_rd_data_tmp3_reg[] = + { + {"cpu_rd_data_tmp3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_cpu_rd_data_tmp4_reg[] = + { + {"cpu_rd_data_tmp4", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_cpu_rd_data_tmp5_reg[] = + { + {"cpu_rd_data_tmp5", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_cpu_rd_data_tmp6_reg[] = + { + {"cpu_rd_data_tmp6", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_cpu_rd_data_tmp7_reg[] = + { + {"cpu_rd_data_tmp7", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_cpu_rd_data_tmp8_reg[] = + { + {"cpu_rd_data_tmp8", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_cpu_rd_data_tmp9_reg[] = + { + {"cpu_rd_data_tmp9", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_cpu_rd_data_tmp10_reg[] = + { + {"cpu_rd_data_tmp10", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_cpu_rd_data_tmp11_reg[] = + { + {"cpu_rd_data_tmp11", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_cpu_rd_data_tmp12_reg[] = + { + {"cpu_rd_data_tmp12", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_cpu_rd_data_tmp13_reg[] = + { + {"cpu_rd_data_tmp13", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_cpu_rd_data_tmp14_reg[] = + { + {"cpu_rd_data_tmp14", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_cpu_rd_data_tmp15_reg[] = + { + {"cpu_rd_data_tmp15", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_v4_config_rgt_reg[] = + { + {"lpm_v4_shift_sel", DPP_FIELD_FLAG_RW, 4, 2, 0x0, 0x0}, + {"lpm_v4_sram_cmp_flag", DPP_FIELD_FLAG_RW, 2, 1, 0x0, 0x0}, + {"lpm_v4_ddr3_addr_sel", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_v6_config_rgt_reg[] = + { + {"lpm_v6_shift_sel", DPP_FIELD_FLAG_RW, 5, 2, 0x0, 0x0}, + {"lpm_v6_sram_cmp_flag", DPP_FIELD_FLAG_RW, 3, 1, 0x0, 0x0}, + {"lpm_v6_ddr3_addr_sel", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_ext_rsp_fifo_u0_pfull_ast_reg[] = + { + {"lpm_ext_rsp_fifo_u0_pfull_ast", DPP_FIELD_FLAG_RW, 6, 7, 0x24, 0x0}, + }; +DPP_FIELD_T g_se_as_hash_age_pat_cfg_reg[] = + { + {"hash_age_pat_cfg", DPP_FIELD_FLAG_RW, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_learn_rdy_cfg_reg[] = + { + {"learn_rdy_cfg", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_kschd_as_pful_cfg_reg[] = + { + {"kschd_as_pful_cfg", DPP_FIELD_FLAG_RW, 13, 14, 0x1326, 0x0}, + }; +DPP_FIELD_T g_se_kschd_kschd_dir_pful_cfg_reg[] = + { + {"kschd_dir_pful_cfg", DPP_FIELD_FLAG_RW, 13, 14, 0x1326, 0x0}, + }; +DPP_FIELD_T g_se_kschd_kschd_as_ept_cfg_reg[] = + { + {"kschd_as_ept_cfg", DPP_FIELD_FLAG_RW, 13, 14, 0xc18, 0x0}, + }; +DPP_FIELD_T g_se_kschd_cpu_arbi_pful_cfg_reg[] = + { + {"cpu_arbi_pful_cfg", DPP_FIELD_FLAG_RW, 13, 14, 0x1326, 0x0}, + }; +DPP_FIELD_T g_se_kschd_kschd_pbu_pful_cfg_reg[] = + { + {"kschd_pbu_pful_cfg", DPP_FIELD_FLAG_RW, 13, 14, 0x1326, 0x0}, + }; +DPP_FIELD_T g_se_rschd_rschd_dir_pful_cfg_reg[] = + { + {"rschd_dir_pful_cfg", DPP_FIELD_FLAG_RW, 31, 32, 0x00360036, 0x0}, + }; +DPP_FIELD_T g_se_rschd_rschd_dir_ept_cfg_reg[] = + { + {"rschd_dir_ept_cfg", DPP_FIELD_FLAG_RW, 31, 32, 0x000a000a, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_cmd_rgt_reg[] = + { + {"rd_flag", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + {"mask", DPP_FIELD_FLAG_RW, 20, 4, 0x0, 0x0}, + {"reg_sram_flag", DPP_FIELD_FLAG_RW, 16, 1, 0x0, 0x0}, + {"zgroup_id", DPP_FIELD_FLAG_RW, 15, 2, 0x0, 0x0}, + {"zblock_id", DPP_FIELD_FLAG_RW, 13, 3, 0x0, 0x0}, + {"zcell_id", DPP_FIELD_FLAG_RW, 10, 2, 0x0, 0x0}, + {"addr", DPP_FIELD_FLAG_RW, 8, 9, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_wr_data_tmp0_reg[] = + { + {"cpu_wr_data_tmp0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_wr_data_tmp1_reg[] = + { + {"cpu_wr_data_tmp1", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_wr_data_tmp2_reg[] = + { + {"cpu_wr_data_tmp2", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_wr_data_tmp3_reg[] = + { + {"cpu_wr_data_tmp3", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_wr_data_tmp4_reg[] = + { + {"cpu_wr_data_tmp4", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_wr_data_tmp5_reg[] = + { + {"cpu_wr_data_tmp5", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_wr_data_tmp6_reg[] = + { + {"cpu_wr_data_tmp6", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_wr_data_tmp7_reg[] = + { + {"cpu_wr_data_tmp7", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_wr_data_tmp8_reg[] = + { + {"cpu_wr_data_tmp8", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_wr_data_tmp9_reg[] = + { + {"cpu_wr_data_tmp9", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_wr_data_tmp10_reg[] = + { + {"cpu_wr_data_tmp10", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_wr_data_tmp11_reg[] = + { + {"cpu_wr_data_tmp11", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_wr_data_tmp12_reg[] = + { + {"cpu_wr_data_tmp12", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_wr_data_tmp13_reg[] = + { + {"cpu_wr_data_tmp13", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_wr_data_tmp14_reg[] = + { + {"cpu_wr_data_tmp14", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_wr_data_tmp15_reg[] = + { + {"cpu_wr_data_tmp15", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_rd_rdy_reg[] = + { + {"cpu_rd_rdy", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_rd_data_tmp0_reg[] = + { + {"cpu_rd_data_tmp0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_rd_data_tmp1_reg[] = + { + {"cpu_rd_data_tmp1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_rd_data_tmp2_reg[] = + { + {"cpu_rd_data_tmp2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_rd_data_tmp3_reg[] = + { + {"cpu_rd_data_tmp3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_rd_data_tmp4_reg[] = + { + {"cpu_rd_data_tmp4", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_rd_data_tmp5_reg[] = + { + {"cpu_rd_data_tmp5", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_rd_data_tmp6_reg[] = + { + {"cpu_rd_data_tmp6", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_rd_data_tmp7_reg[] = + { + {"cpu_rd_data_tmp7", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_rd_data_tmp8_reg[] = + { + {"cpu_rd_data_tmp8", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_rd_data_tmp9_reg[] = + { + {"cpu_rd_data_tmp9", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_rd_data_tmp10_reg[] = + { + {"cpu_rd_data_tmp10", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_rd_data_tmp11_reg[] = + { + {"cpu_rd_data_tmp11", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_rd_data_tmp12_reg[] = + { + {"cpu_rd_data_tmp12", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_rd_data_tmp13_reg[] = + { + {"cpu_rd_data_tmp13", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_rd_data_tmp14_reg[] = + { + {"cpu_rd_data_tmp14", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_cpu_rd_data_tmp15_reg[] = + { + {"cpu_rd_data_tmp15", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_hash0_ext_cfg_rgt_reg[] = + { + {"hash0_ext_mode", DPP_FIELD_FLAG_RW, 8, 8, 0x0, 0x0}, + {"hash0_ext_flag", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_hash1_ext_cfg_rgt_reg[] = + { + {"hash1_ext_mode", DPP_FIELD_FLAG_RW, 8, 8, 0x0, 0x0}, + {"hash1_ext_flag", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_hash2_ext_cfg_rgt_reg[] = + { + {"hash2_ext_mode", DPP_FIELD_FLAG_RW, 8, 8, 0x0, 0x0}, + {"hash2_ext_flag", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_hash3_ext_cfg_rgt_reg[] = + { + {"hash3_ext_mode", DPP_FIELD_FLAG_RW, 8, 8, 0x0, 0x0}, + {"hash3_ext_flag", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_hash0_tbl30_depth_reg[] = + { + {"hash0_tbl3_depth", DPP_FIELD_FLAG_RW, 31, 8, 0x12, 0x0}, + {"hash0_tbl2_depth", DPP_FIELD_FLAG_RW, 23, 8, 0x12, 0x0}, + {"hash0_tbl1_depth", DPP_FIELD_FLAG_RW, 15, 8, 0x12, 0x0}, + {"hash0_tbl0_depth", DPP_FIELD_FLAG_RW, 7, 8, 0x12, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_hash0_tbl74_depth_reg[] = + { + {"hash0_tbl7_depth", DPP_FIELD_FLAG_RW, 31, 8, 0x12, 0x0}, + {"hash0_tbl6_depth", DPP_FIELD_FLAG_RW, 23, 8, 0x12, 0x0}, + {"hash0_tbl5_depth", DPP_FIELD_FLAG_RW, 15, 8, 0x12, 0x0}, + {"hash0_tbl4_depth", DPP_FIELD_FLAG_RW, 7, 8, 0x12, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_hash1_tbl30_depth_reg[] = + { + {"hash1_tbl3_depth", DPP_FIELD_FLAG_RW, 31, 8, 0x12, 0x0}, + {"hash1_tbl2_depth", DPP_FIELD_FLAG_RW, 23, 8, 0x12, 0x0}, + {"hash1_tbl1_depth", DPP_FIELD_FLAG_RW, 15, 8, 0x12, 0x0}, + {"hash1_tbl0_depth", DPP_FIELD_FLAG_RW, 7, 8, 0x12, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_hash1_tbl74_depth_reg[] = + { + {"hash1_tbl7_depth", DPP_FIELD_FLAG_RW, 31, 8, 0x12, 0x0}, + {"hash1_tbl6_depth", DPP_FIELD_FLAG_RW, 23, 8, 0x12, 0x0}, + {"hash1_tbl5_depth", DPP_FIELD_FLAG_RW, 15, 8, 0x12, 0x0}, + {"hash1_tbl4_depth", DPP_FIELD_FLAG_RW, 7, 8, 0x12, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_hash2_tbl30_depth_reg[] = + { + {"hash2_tbl3_depth", DPP_FIELD_FLAG_RW, 31, 8, 0x12, 0x0}, + {"hash2_tbl2_depth", DPP_FIELD_FLAG_RW, 23, 8, 0x12, 0x0}, + {"hash2_tbl1_depth", DPP_FIELD_FLAG_RW, 15, 8, 0x12, 0x0}, + {"hash2_tbl0_depth", DPP_FIELD_FLAG_RW, 7, 8, 0x12, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_hash2_tbl74_depth_reg[] = + { + {"hash2_tbl7_depth", DPP_FIELD_FLAG_RW, 31, 8, 0x12, 0x0}, + {"hash2_tbl6_depth", DPP_FIELD_FLAG_RW, 23, 8, 0x12, 0x0}, + {"hash2_tbl5_depth", DPP_FIELD_FLAG_RW, 15, 8, 0x12, 0x0}, + {"hash2_tbl4_depth", DPP_FIELD_FLAG_RW, 7, 8, 0x12, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_hash3_tbl30_depth_reg[] = + { + {"hash3_tbl3_depth", DPP_FIELD_FLAG_RW, 31, 8, 0x12, 0x0}, + {"hash3_tbl2_depth", DPP_FIELD_FLAG_RW, 23, 8, 0x12, 0x0}, + {"hash3_tbl1_depth", DPP_FIELD_FLAG_RW, 15, 8, 0x12, 0x0}, + {"hash3_tbl0_depth", DPP_FIELD_FLAG_RW, 7, 8, 0x12, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_hash3_tbl74_depth_reg[] = + { + {"hash3_tbl7_depth", DPP_FIELD_FLAG_RW, 31, 8, 0x12, 0x0}, + {"hash3_tbl6_depth", DPP_FIELD_FLAG_RW, 23, 8, 0x12, 0x0}, + {"hash3_tbl5_depth", DPP_FIELD_FLAG_RW, 15, 8, 0x12, 0x0}, + {"hash3_tbl4_depth", DPP_FIELD_FLAG_RW, 7, 8, 0x12, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_wr_rsp_cfg_reg[] = + { + {"wr_rsp_fifo_cfg", DPP_FIELD_FLAG_RW, 9, 10, 0x18c, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_hash_mono_flag_reg[] = + { + {"hash3_mono_flag", DPP_FIELD_FLAG_RW, 31, 8, 0x0, 0x0}, + {"hash2_mono_flag", DPP_FIELD_FLAG_RW, 23, 8, 0x0, 0x0}, + {"hash1_mono_flag", DPP_FIELD_FLAG_RW, 15, 8, 0x0, 0x0}, + {"hash0_mono_flag", DPP_FIELD_FLAG_RW, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_hash10_ext_crc_cfg_reg[] = + { + {"hash1_crc_cfg", DPP_FIELD_FLAG_RW, 31, 16, 0x5555, 0x0}, + {"hash0_crc_cfg", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_hash32_ext_crc_cfg_reg[] = + { + {"hash3_crc_cfg", DPP_FIELD_FLAG_RW, 31, 16, 0xffff, 0x0}, + {"hash2_crc_cfg", DPP_FIELD_FLAG_RW, 15, 16, 0xaaaa, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_zblock_service_configure_reg[] = + { + {"service_sel", DPP_FIELD_FLAG_RW, 3, 1, 0x0, 0x0}, + {"hash_channel_sel", DPP_FIELD_FLAG_RW, 2, 2, 0x0, 0x0}, + {"st_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_zblock_hash_zcell_mono_reg[] = + { + {"ha_zcell3_mono_flag", DPP_FIELD_FLAG_RW, 27, 1, 0x0, 0x0}, + {"ha_zcell3_tbl_id", DPP_FIELD_FLAG_RW, 26, 3, 0x0, 0x0}, + {"ha_zcell2_mono_flag", DPP_FIELD_FLAG_RW, 19, 1, 0x0, 0x0}, + {"ha_zcell2_tbl_id", DPP_FIELD_FLAG_RW, 18, 3, 0x0, 0x0}, + {"ha_zcell1_mono_flag", DPP_FIELD_FLAG_RW, 11, 1, 0x0, 0x0}, + {"ha_zcell1_tbl_id", DPP_FIELD_FLAG_RW, 10, 3, 0x0, 0x0}, + {"ha_zcell0_mono_flag", DPP_FIELD_FLAG_RW, 3, 1, 0x0, 0x0}, + {"ha_zcell0_tbl_id", DPP_FIELD_FLAG_RW, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_se4k_se_alg_zlock_hash_zreg_mono_reg[] = + { + {"ha_zreg3_mono_flag", DPP_FIELD_FLAG_RW, 27, 1, 0x0, 0x0}, + {"ha_zreg3_tbl_id", DPP_FIELD_FLAG_RW, 26, 3, 0x0, 0x0}, + {"ha_zreg2_mono_flag", DPP_FIELD_FLAG_RW, 19, 1, 0x0, 0x0}, + {"ha_zreg2_tbl_id", DPP_FIELD_FLAG_RW, 18, 3, 0x0, 0x0}, + {"ha_zreg1_mono_flag", DPP_FIELD_FLAG_RW, 11, 1, 0x0, 0x0}, + {"ha_zreg1_tbl_id", DPP_FIELD_FLAG_RW, 10, 3, 0x0, 0x0}, + {"ha_zreg0_mono_flag", DPP_FIELD_FLAG_RW, 3, 1, 0x0, 0x0}, + {"ha_zreg0_tbl_id", DPP_FIELD_FLAG_RW, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_init_done_reg[] = + { + {"init_done", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cpu_ind_wdat0_reg[] = + { + {"cpu_ind_wdat0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cpu_ind_wdat1_reg[] = + { + {"cpu_ind_wdat1", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cpu_ind_wdat2_reg[] = + { + {"cpu_ind_wdat2", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cpu_ind_wdat3_reg[] = + { + {"cpu_ind_wdat3", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cpu_ind_cmd_reg[] = + { + {"cpu_ind_rw", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + {"cpu_ind_rd_mode", DPP_FIELD_FLAG_RW, 30, 1, 0x0, 0x0}, + {"cpu_req_mode", DPP_FIELD_FLAG_RW, 27, 2, 0x0, 0x0}, + {"cpu_ind_addr", DPP_FIELD_FLAG_RW, 25, 26, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cpu_ind_rd_done_reg[] = + { + {"cpu_ind_rd_done", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cpu_ind_rdat0_reg[] = + { + {"cpu_ind_rdat0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cpu_ind_rdat1_reg[] = + { + {"cpu_ind_rdat1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cpu_ind_rdat2_reg[] = + { + {"cpu_ind_rdat2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cpu_ind_rdat3_reg[] = + { + {"cpu_ind_rdat3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cfg_plcr_mono_reg[] = + { + {"cfg_plcr_mono", DPP_FIELD_FLAG_RW, 1, 2, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_wr_arb_cpu_rdy_reg[] = + { + {"wr_arb_cpu_rdy", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_tm_stat_en_cfg_reg[] = + { + {"tm_stat_en_cfg", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ddr_wdat0_reg[] = + { + {"ddr_wdat0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_dir_arbi_ser_rpful_reg[] = + { + {"dir_arbi_ser_rpful", DPP_FIELD_FLAG_RW, 9, 10, 0x14a, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cfg_wr_arbi_pful2_reg[] = + { + {"hash_wr_pful", DPP_FIELD_FLAG_RW, 19, 10, 0x14a, 0x0}, + {"dir_wr_pful", DPP_FIELD_FLAG_RW, 9, 10, 0x14a, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_etm_tbl_cfg_reg[] = + { + {"etm_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cfg_cash_addr_pful_reg[] = + { + {"cfg_cash_addr_pful", DPP_FIELD_FLAG_RW, 19, 20, 0x7e1f8, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ctrl_rfifo_cfg_reg[] = + { + {"brst_fwft_fifo_prog_empty_assert", DPP_FIELD_FLAG_RW, 31, 10, 0x2, 0x0}, + {"brst_fwft_fifo_prog_empty_negate", DPP_FIELD_FLAG_RW, 21, 10, 0x2, 0x0}, + {"brst_fwft_fifo_prog_full_assert", DPP_FIELD_FLAG_RW, 11, 6, 0x18, 0x0}, + {"brst_fwft_fifo_prog_full_negate", DPP_FIELD_FLAG_RW, 5, 6, 0x18, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cache_req_fifo_cfg_reg[] = + { + {"srch_fifo_pfull_assert", DPP_FIELD_FLAG_RW, 9, 5, 0xc, 0x0}, + {"srch_fifo_pfull_negate", DPP_FIELD_FLAG_RW, 4, 5, 0xc, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_eram_wdat0_reg[] = + { + {"cpu_ind_eram_wdat0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_etm_port_sel_cfg_reg[] = + { + {"etm_port0_sel_cfg", DPP_FIELD_FLAG_RW, 19, 5, 0x0, 0x0}, + {"etm_port1_sel_cfg", DPP_FIELD_FLAG_RW, 14, 5, 0x1, 0x0}, + {"etm_port2_sel_cfg", DPP_FIELD_FLAG_RW, 9, 5, 0xf, 0x0}, + {"etm_port3_sel_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0x10, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_tm_stat_cfg_reg[] = + { + {"stat_overflow_mode", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"tm_stat_mode_cfg", DPP_FIELD_FLAG_RW, 6, 3, 0x4, 0x0}, + {"tm_flow_control_cfg", DPP_FIELD_FLAG_RW, 3, 4, 0xf, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_ppu_eram_depth_reg[] = + { + {"ppu_eram_depth", DPP_FIELD_FLAG_RW, 18, 19, 0x38000, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_ppu_eram_base_addr_reg[] = + { + {"ppu_eram_base_addr", DPP_FIELD_FLAG_RW, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_ppu_ddr_base_addr_reg[] = + { + {"ppu_ddr_base_addr", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_plcr0_base_addr_reg[] = + { + {"plcr0_base_addr", DPP_FIELD_FLAG_RW, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_etm_stat_start_addr_cfg_reg[] = + { + {"etm_stat_start_addr_cfg", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_etm_stat_depth_cfg_reg[] = + { + {"etm_stat_depth_cfg", DPP_FIELD_FLAG_RW, 2, 3, 0x5, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cycle_mov_en_cfg_reg[] = + { + {"cycle_mov_en_cfg", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_ind_wdat0_reg[] = + { + {"wdat0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_ind_ctrl_tmp0_reg[] = + { + {"reg_tcam_flag", DPP_FIELD_FLAG_RW, 30, 1, 0x0, 0x0}, + {"flush", DPP_FIELD_FLAG_RW, 29, 8, 0x0, 0x0}, + {"rd_wr", DPP_FIELD_FLAG_RW, 21, 1, 0x0, 0x0}, + {"wr_mode", DPP_FIELD_FLAG_RW, 20, 8, 0x0, 0x0}, + {"dat_or_mask", DPP_FIELD_FLAG_RW, 12, 1, 0x0, 0x0}, + {"ram_sel", DPP_FIELD_FLAG_RW, 11, 3, 0x0, 0x0}, + {"addr", DPP_FIELD_FLAG_RW, 8, 9, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_ind_ctrl_tmp1_reg[] = + { + {"row_or_col_msk", DPP_FIELD_FLAG_RW, 9, 1, 0x0, 0x0}, + {"vben", DPP_FIELD_FLAG_RW, 8, 1, 0x0, 0x0}, + {"vbit", DPP_FIELD_FLAG_RW, 7, 8, 0xff, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_ind_rd_done_reg[] = + { + {"cpu_ind_rd_done", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_rdat0_reg[] = + { + {"cpu_rdat0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_rdat1_reg[] = + { + {"cpu_rdat1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_rdat2_reg[] = + { + {"cpu_rdat2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_rdat3_reg[] = + { + {"cpu_rdat3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_rdat4_reg[] = + { + {"cpu_rdat4", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_rdat5_reg[] = + { + {"cpu_rdat5", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_rdat6_reg[] = + { + {"cpu_rdat6", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_rdat7_reg[] = + { + {"cpu_rdat7", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_rdat8_reg[] = + { + {"cpu_rdat8", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_rdat9_reg[] = + { + {"cpu_rdat9", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_rdat10_reg[] = + { + {"cpu_rdat10", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_rdat11_reg[] = + { + {"cpu_rdat11", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_rdat12_reg[] = + { + {"cpu_rdat12", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_rdat13_reg[] = + { + {"cpu_rdat13", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_rdat14_reg[] = + { + {"cpu_rdat14", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_rdat15_reg[] = + { + {"cpu_rdat15", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_rdat16_reg[] = + { + {"cpu_rdat16", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_rdat17_reg[] = + { + {"cpu_rdat17", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_rdat18_reg[] = + { + {"cpu_rdat18", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_rdat19_reg[] = + { + {"cpu_rdat19", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_qvbo_reg[] = + { + {"qvbo", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cnt_overflow_mode_reg[] = + { + {"cnt_rd_mode", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"cnt_overflow_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_car0_cara_queue_ram0_159_0_reg[] = + { + {"cara_drop", DPP_FIELD_FLAG_RW, 147, 1, 0x0, 0x0}, + {"cara_plcr_en", DPP_FIELD_FLAG_RW, 146, 1, 0x0, 0x0}, + {"cara_profile_id", DPP_FIELD_FLAG_RW, 145, 9, 0x0, 0x0}, + {"cara_tq_h", DPP_FIELD_FLAG_RO, 136, 13, 0x0, 0x0}, + {"cara_tq_l", DPP_FIELD_FLAG_RO, 123, 32, 0x0, 0x0}, + {"cara_ted", DPP_FIELD_FLAG_RO, 91, 19, 0x0, 0x0}, + {"cara_tcd", DPP_FIELD_FLAG_RO, 72, 19, 0x0, 0x0}, + {"cara_tei", DPP_FIELD_FLAG_RO, 53, 27, 0x0, 0x0}, + {"cara_tci", DPP_FIELD_FLAG_RO, 26, 27, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_cara_profile_ram1_255_0_reg[] = + { + {"cara_profile_wr", DPP_FIELD_FLAG_RW, 224, 1, 0x0, 0x0}, + {"cara_pkt_sign", DPP_FIELD_FLAG_RW, 216, 1, 0x0, 0x0}, + {"cara_cd", DPP_FIELD_FLAG_RW, 215, 2, 0x0, 0x0}, + {"cara_cf", DPP_FIELD_FLAG_RW, 213, 1, 0x0, 0x0}, + {"cara_cm", DPP_FIELD_FLAG_RW, 212, 1, 0x0, 0x0}, + {"cara_eir", DPP_FIELD_FLAG_RW, 211, 24, 0x0, 0x0}, + {"cara_cir", DPP_FIELD_FLAG_RW, 187, 24, 0x0, 0x0}, + {"cara_ebs_pbs", DPP_FIELD_FLAG_RW, 163, 27, 0x0, 0x0}, + {"cara_cbs", DPP_FIELD_FLAG_RW, 136, 27, 0x0, 0x0}, + {"cara_c_pri1", DPP_FIELD_FLAG_RW, 109, 5, 0x0, 0x0}, + {"cara_c_pri2", DPP_FIELD_FLAG_RW, 104, 5, 0x0, 0x0}, + {"cara_c_pri3", DPP_FIELD_FLAG_RW, 99, 5, 0x0, 0x0}, + {"cara_c_pri4", DPP_FIELD_FLAG_RW, 94, 5, 0x0, 0x0}, + {"cara_c_pri5", DPP_FIELD_FLAG_RW, 89, 5, 0x0, 0x0}, + {"cara_c_pri6", DPP_FIELD_FLAG_RW, 84, 5, 0x0, 0x0}, + {"cara_c_pri7", DPP_FIELD_FLAG_RW, 79, 5, 0x0, 0x0}, + {"cara_e_g_pri1", DPP_FIELD_FLAG_RW, 74, 5, 0x0, 0x0}, + {"cara_e_g_pri2", DPP_FIELD_FLAG_RW, 69, 5, 0x0, 0x0}, + {"cara_e_g_pri3", DPP_FIELD_FLAG_RW, 64, 5, 0x0, 0x0}, + {"cara_e_g_pri4", DPP_FIELD_FLAG_RW, 59, 5, 0x0, 0x0}, + {"cara_e_g_pri5", DPP_FIELD_FLAG_RW, 54, 5, 0x0, 0x0}, + {"cara_e_g_pri6", DPP_FIELD_FLAG_RW, 49, 5, 0x0, 0x0}, + {"cara_e_g_pri7", DPP_FIELD_FLAG_RW, 44, 5, 0x0, 0x0}, + {"cara_e_y_pri0", DPP_FIELD_FLAG_RW, 39, 5, 0x0, 0x0}, + {"cara_e_y_pri1", DPP_FIELD_FLAG_RW, 34, 5, 0x0, 0x0}, + {"cara_e_y_pri2", DPP_FIELD_FLAG_RW, 29, 5, 0x0, 0x0}, + {"cara_e_y_pri3", DPP_FIELD_FLAG_RW, 24, 5, 0x0, 0x0}, + {"cara_e_y_pri4", DPP_FIELD_FLAG_RW, 19, 5, 0x0, 0x0}, + {"cara_e_y_pri5", DPP_FIELD_FLAG_RW, 14, 5, 0x0, 0x0}, + {"cara_e_y_pri6", DPP_FIELD_FLAG_RW, 9, 5, 0x0, 0x0}, + {"cara_e_y_pri7", DPP_FIELD_FLAG_RW, 4, 5, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_cara_qovs_ram_ram2_reg[] = + { + {"cara_qovs", DPP_FIELD_FLAG_RW, 1, 2, 0x2, 0x0}, + }; +DPP_FIELD_T g_stat_car0_look_up_table1_reg[] = + { + {"cara_flow_id", DPP_FIELD_FLAG_RW, 14, 12, 0x0, 0x0}, + {"cara_sp", DPP_FIELD_FLAG_RW, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_cara_pkt_des_i_cnt_reg[] = + { + {"cara_pkt_des_i_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_cara_green_pkt_i_cnt_reg[] = + { + {"cara_green_pkt_i_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_cara_yellow_pkt_i_cnt_reg[] = + { + {"cara_yellow_pkt_i_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_cara_red_pkt_i_cnt_reg[] = + { + {"cara_red_pkt_i_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_cara_pkt_des_o_cnt_reg[] = + { + {"cara_pkt_des_o_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_cara_green_pkt_o_cnt_reg[] = + { + {"cara_green_pkt_o_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_cara_yellow_pkt_o_cnt_reg[] = + { + {"cara_yellow_pkt_o_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_cara_red_pkt_o_cnt_reg[] = + { + {"cara_red_pkt_o_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_cara_pkt_des_fc_for_cfg_cnt_reg[] = + { + {"cara_pkt_des_fc_for_cfg_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_cara_appoint_qnum_or_sp_reg[] = + { + {"cara_appoint_qnum_or_not", DPP_FIELD_FLAG_RW, 19, 1, 0x0, 0x0}, + {"cara_appoint_sp_or_not", DPP_FIELD_FLAG_RW, 18, 1, 0x0, 0x0}, + {"cara_plcr_stat_sp", DPP_FIELD_FLAG_RW, 17, 3, 0x0, 0x0}, + {"cara_plcr_stat_qnum", DPP_FIELD_FLAG_RW, 14, 15, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_cara_cfgmt_count_mode_reg[] = + { + {"cara_cfgmt_count_overflow_mode", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"cara_cfgmt_count_rd_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_car0_cara_pkt_size_cnt_reg[] = + { + {"cara_pkt_size_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_cara_plcr_init_dont_reg[] = + { + {"cara_plcr_init_done", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carb_queue_ram0_159_0_reg[] = + { + {"carb_drop", DPP_FIELD_FLAG_RW, 147, 1, 0x0, 0x0}, + {"carb_plcr_en", DPP_FIELD_FLAG_RW, 146, 1, 0x0, 0x0}, + {"carb_profile_id", DPP_FIELD_FLAG_RW, 145, 9, 0x0, 0x0}, + {"carb_tq_h", DPP_FIELD_FLAG_RO, 136, 13, 0x0, 0x0}, + {"carb_tq_l", DPP_FIELD_FLAG_RO, 123, 32, 0x0, 0x0}, + {"carb_ted", DPP_FIELD_FLAG_RO, 91, 19, 0x0, 0x0}, + {"carb_tcd", DPP_FIELD_FLAG_RO, 72, 19, 0x0, 0x0}, + {"carb_tei", DPP_FIELD_FLAG_RO, 53, 27, 0x0, 0x0}, + {"carb_tci", DPP_FIELD_FLAG_RO, 26, 27, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carb_profile_ram1_255_0_reg[] = + { + {"carb_profile_wr", DPP_FIELD_FLAG_RW, 224, 1, 0x0, 0x0}, + {"carb_random_discard_en_e", DPP_FIELD_FLAG_RW, 218, 1, 0x0, 0x0}, + {"carb_random_discard_en_c", DPP_FIELD_FLAG_RW, 217, 1, 0x0, 0x0}, + {"carb_pkt_sign", DPP_FIELD_FLAG_RW, 216, 1, 0x0, 0x0}, + {"carb_cd", DPP_FIELD_FLAG_RW, 215, 2, 0x0, 0x0}, + {"carb_cf", DPP_FIELD_FLAG_RW, 213, 1, 0x0, 0x0}, + {"carb_cm", DPP_FIELD_FLAG_RW, 212, 1, 0x0, 0x0}, + {"carb_eir", DPP_FIELD_FLAG_RW, 211, 24, 0x0, 0x0}, + {"carb_cir", DPP_FIELD_FLAG_RW, 187, 24, 0x0, 0x0}, + {"carb_ebs_pbs", DPP_FIELD_FLAG_RW, 163, 27, 0x0, 0x0}, + {"carb_cbs", DPP_FIELD_FLAG_RW, 136, 27, 0x0, 0x0}, + {"carb_c_pri1", DPP_FIELD_FLAG_RW, 109, 5, 0x0, 0x0}, + {"carb_c_pri2", DPP_FIELD_FLAG_RW, 104, 5, 0x0, 0x0}, + {"carb_c_pri3", DPP_FIELD_FLAG_RW, 99, 5, 0x0, 0x0}, + {"carb_c_pri4", DPP_FIELD_FLAG_RW, 94, 5, 0x0, 0x0}, + {"carb_c_pri5", DPP_FIELD_FLAG_RW, 89, 5, 0x0, 0x0}, + {"carb_c_pri6", DPP_FIELD_FLAG_RW, 84, 5, 0x0, 0x0}, + {"carb_c_pri7", DPP_FIELD_FLAG_RW, 79, 5, 0x0, 0x0}, + {"carb_e_g_pri1", DPP_FIELD_FLAG_RW, 74, 5, 0x0, 0x0}, + {"carb_e_g_pri2", DPP_FIELD_FLAG_RW, 69, 5, 0x0, 0x0}, + {"carb_e_g_pri3", DPP_FIELD_FLAG_RW, 64, 5, 0x0, 0x0}, + {"carb_e_g_pri4", DPP_FIELD_FLAG_RW, 59, 5, 0x0, 0x0}, + {"carb_e_g_pri5", DPP_FIELD_FLAG_RW, 54, 5, 0x0, 0x0}, + {"carb_e_g_pri6", DPP_FIELD_FLAG_RW, 49, 5, 0x0, 0x0}, + {"carb_e_g_pri7", DPP_FIELD_FLAG_RW, 44, 5, 0x0, 0x0}, + {"carb_e_y_pri0", DPP_FIELD_FLAG_RW, 39, 5, 0x0, 0x0}, + {"carb_e_y_pri1", DPP_FIELD_FLAG_RW, 34, 5, 0x0, 0x0}, + {"carb_e_y_pri2", DPP_FIELD_FLAG_RW, 29, 5, 0x0, 0x0}, + {"carb_e_y_pri3", DPP_FIELD_FLAG_RW, 24, 5, 0x0, 0x0}, + {"carb_e_y_pri4", DPP_FIELD_FLAG_RW, 19, 5, 0x0, 0x0}, + {"carb_e_y_pri5", DPP_FIELD_FLAG_RW, 14, 5, 0x0, 0x0}, + {"carb_e_y_pri6", DPP_FIELD_FLAG_RW, 9, 5, 0x0, 0x0}, + {"carb_e_y_pri7", DPP_FIELD_FLAG_RW, 4, 5, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carb_qovs_ram_ram2_reg[] = + { + {"carb_qovs", DPP_FIELD_FLAG_RW, 1, 2, 0x2, 0x0}, + }; +DPP_FIELD_T g_stat_car0_look_up_table2_reg[] = + { + {"carb_flow_id", DPP_FIELD_FLAG_RW, 12, 10, 0x0, 0x0}, + {"carb_sp", DPP_FIELD_FLAG_RW, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carb_pkt_des_i_cnt_reg[] = + { + {"carb_pkt_des_i_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carb_green_pkt_i_cnt_reg[] = + { + {"carb_green_pkt_i_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carb_yellow_pkt_i_cnt_reg[] = + { + {"carb_yellow_pkt_i_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carb_red_pkt_i_cnt_reg[] = + { + {"carb_red_pkt_i_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carb_pkt_des_o_cnt_reg[] = + { + {"carb_pkt_des_o_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carb_green_pkt_o_cnt_reg[] = + { + {"carb_green_pkt_o_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carb_yellow_pkt_o_cnt_reg[] = + { + {"carb_yellow_pkt_o_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carb_red_pkt_o_cnt_reg[] = + { + {"carb_red_pkt_o_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carb_pkt_des_fc_for_cfg_cnt_reg[] = + { + {"carb_pkt_des_fc_for_cfg_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carb_appoint_qnum_or_sp_reg[] = + { + {"carb_appoint_qnum_or_not", DPP_FIELD_FLAG_RW, 16, 1, 0x0, 0x0}, + {"carb_appoint_sp_or_not", DPP_FIELD_FLAG_RW, 15, 1, 0x0, 0x0}, + {"carb_plcr_stat_sp", DPP_FIELD_FLAG_RW, 14, 3, 0x0, 0x0}, + {"carb_plcr_stat_qnum", DPP_FIELD_FLAG_RW, 11, 12, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carb_cfgmt_count_mode_reg[] = + { + {"carb_cfgmt_count_overflow_mode", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"carb_cfgmt_count_rd_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carb_pkt_size_cnt_reg[] = + { + {"carb_pkt_size_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carb_plcr_init_dont_reg[] = + { + {"carb_plcr_init_done", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carc_queue_ram0_159_0_reg[] = + { + {"carc_drop", DPP_FIELD_FLAG_RW, 147, 1, 0x0, 0x0}, + {"carc_plcr_en", DPP_FIELD_FLAG_RW, 146, 1, 0x0, 0x0}, + {"carc_profile_id", DPP_FIELD_FLAG_RW, 145, 9, 0x0, 0x0}, + {"carc_tq_h", DPP_FIELD_FLAG_RO, 136, 13, 0x0, 0x0}, + {"carc_tq_l", DPP_FIELD_FLAG_RO, 123, 32, 0x0, 0x0}, + {"carc_ted", DPP_FIELD_FLAG_RO, 91, 19, 0x0, 0x0}, + {"carc_tcd", DPP_FIELD_FLAG_RO, 72, 19, 0x0, 0x0}, + {"carc_tei", DPP_FIELD_FLAG_RO, 53, 27, 0x0, 0x0}, + {"carc_tci", DPP_FIELD_FLAG_RO, 26, 27, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carc_profile_ram1_255_0_reg[] = + { + {"carc_profile_wr", DPP_FIELD_FLAG_RW, 224, 1, 0x0, 0x0}, + {"carc_random_discard_en_e", DPP_FIELD_FLAG_RW, 218, 1, 0x0, 0x0}, + {"carc_random_discard_en_c", DPP_FIELD_FLAG_RW, 217, 1, 0x0, 0x0}, + {"carc_pkt_sign", DPP_FIELD_FLAG_RW, 216, 1, 0x0, 0x0}, + {"carc_cd", DPP_FIELD_FLAG_RW, 215, 2, 0x0, 0x0}, + {"carc_cf", DPP_FIELD_FLAG_RW, 213, 1, 0x0, 0x0}, + {"carc_cm", DPP_FIELD_FLAG_RW, 212, 1, 0x0, 0x0}, + {"carc_eir", DPP_FIELD_FLAG_RW, 211, 24, 0x0, 0x0}, + {"carc_cir", DPP_FIELD_FLAG_RW, 187, 24, 0x0, 0x0}, + {"carc_ebs_pbs", DPP_FIELD_FLAG_RW, 163, 27, 0x0, 0x0}, + {"carc_cbs", DPP_FIELD_FLAG_RW, 136, 27, 0x0, 0x0}, + {"carc_c_pri1", DPP_FIELD_FLAG_RW, 109, 5, 0x0, 0x0}, + {"carc_c_pri2", DPP_FIELD_FLAG_RW, 104, 5, 0x0, 0x0}, + {"carc_c_pri3", DPP_FIELD_FLAG_RW, 99, 5, 0x0, 0x0}, + {"carc_c_pri4", DPP_FIELD_FLAG_RW, 94, 5, 0x0, 0x0}, + {"carc_c_pri5", DPP_FIELD_FLAG_RW, 89, 5, 0x0, 0x0}, + {"carc_c_pri6", DPP_FIELD_FLAG_RW, 84, 5, 0x0, 0x0}, + {"carc_c_pri7", DPP_FIELD_FLAG_RW, 79, 5, 0x0, 0x0}, + {"carc_e_g_pri1", DPP_FIELD_FLAG_RW, 74, 5, 0x0, 0x0}, + {"carc_e_g_pri2", DPP_FIELD_FLAG_RW, 69, 5, 0x0, 0x0}, + {"carc_e_g_pri3", DPP_FIELD_FLAG_RW, 64, 5, 0x0, 0x0}, + {"carc_e_g_pri4", DPP_FIELD_FLAG_RW, 59, 5, 0x0, 0x0}, + {"carc_e_g_pri5", DPP_FIELD_FLAG_RW, 54, 5, 0x0, 0x0}, + {"carc_e_g_pri6", DPP_FIELD_FLAG_RW, 49, 5, 0x0, 0x0}, + {"carc_e_g_pri7", DPP_FIELD_FLAG_RW, 44, 5, 0x0, 0x0}, + {"carc_e_y_pri0", DPP_FIELD_FLAG_RW, 39, 5, 0x0, 0x0}, + {"carc_e_y_pri1", DPP_FIELD_FLAG_RW, 34, 5, 0x0, 0x0}, + {"carc_e_y_pri2", DPP_FIELD_FLAG_RW, 29, 5, 0x0, 0x0}, + {"carc_e_y_pri3", DPP_FIELD_FLAG_RW, 24, 5, 0x0, 0x0}, + {"carc_e_y_pri4", DPP_FIELD_FLAG_RW, 19, 5, 0x0, 0x0}, + {"carc_e_y_pri5", DPP_FIELD_FLAG_RW, 14, 5, 0x0, 0x0}, + {"carc_e_y_pri6", DPP_FIELD_FLAG_RW, 9, 5, 0x0, 0x0}, + {"carc_e_y_pri7", DPP_FIELD_FLAG_RW, 4, 5, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carc_qovs_ram_ram2_reg[] = + { + {"carc_qovs", DPP_FIELD_FLAG_RW, 1, 2, 0x2, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carc_pkt_des_i_cnt_reg[] = + { + {"carc_pkt_des_i_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carc_green_pkt_i_cnt_reg[] = + { + {"carc_green_pkt_i_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carc_yellow_pkt_i_cnt_reg[] = + { + {"carc_yellow_pkt_i_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carc_red_pkt_i_cnt_reg[] = + { + {"carc_red_pkt_i_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carc_pkt_des_o_cnt_reg[] = + { + {"carc_pkt_des_o_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carc_green_pkt_o_cnt_reg[] = + { + {"carc_green_pkt_o_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carc_yellow_pkt_o_cnt_reg[] = + { + {"carc_yellow_pkt_o_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carc_red_pkt_o_cnt_reg[] = + { + {"carc_red_pkt_o_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carc_pkt_des_fc_for_cfg_cnt_reg[] = + { + {"carc_pkt_des_fc_for_cfg_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carc_appoint_qnum_or_sp_reg[] = + { + {"carc_appoint_qnum_or_not", DPP_FIELD_FLAG_RW, 14, 1, 0x0, 0x0}, + {"carc_appoint_sp_or_not", DPP_FIELD_FLAG_RW, 13, 1, 0x0, 0x0}, + {"carc_plcr_stat_sp", DPP_FIELD_FLAG_RW, 12, 3, 0x0, 0x0}, + {"carc_plcr_stat_qnum", DPP_FIELD_FLAG_RW, 9, 10, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carc_cfgmt_count_mode_reg[] = + { + {"carc_cfgmt_count_overflow_mode", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"carc_cfgmt_count_rd_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carc_pkt_size_cnt_reg[] = + { + {"carc_pkt_size_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carc_plcr_init_dont_reg[] = + { + {"carc_plcr_init_done", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carb_random_ram_reg[] = + { + {"para8_e", DPP_FIELD_FLAG_RW, 491, 27, 0x0, 0x0}, + {"para7_e", DPP_FIELD_FLAG_RW, 464, 27, 0x0, 0x0}, + {"para6_e", DPP_FIELD_FLAG_RW, 437, 27, 0x0, 0x0}, + {"para5_e", DPP_FIELD_FLAG_RW, 410, 14, 0x0, 0x0}, + {"para4_h_e", DPP_FIELD_FLAG_RW, 396, 9, 0x0, 0x0}, + {"para4_l_e", DPP_FIELD_FLAG_RW, 387, 32, 0x0, 0x0}, + {"para3_e", DPP_FIELD_FLAG_RW, 355, 14, 0x0, 0x0}, + {"para2_h_e", DPP_FIELD_FLAG_RW, 341, 9, 0x0, 0x0}, + {"para2_l_e", DPP_FIELD_FLAG_RW, 332, 32, 0x0, 0x0}, + {"para1_e", DPP_FIELD_FLAG_RW, 300, 14, 0x0, 0x0}, + {"para0_h_e", DPP_FIELD_FLAG_RW, 286, 9, 0x0, 0x0}, + {"para0_l_e", DPP_FIELD_FLAG_RW, 277, 32, 0x0, 0x0}, + {"para8_c", DPP_FIELD_FLAG_RW, 245, 27, 0x0, 0x0}, + {"para7_c", DPP_FIELD_FLAG_RW, 218, 27, 0x0, 0x0}, + {"para6_c", DPP_FIELD_FLAG_RW, 191, 27, 0x0, 0x0}, + {"para5_c", DPP_FIELD_FLAG_RW, 164, 14, 0x0, 0x0}, + {"para4_h_c", DPP_FIELD_FLAG_RW, 150, 9, 0x0, 0x0}, + {"para4_l_c", DPP_FIELD_FLAG_RW, 141, 32, 0x0, 0x0}, + {"para3_c", DPP_FIELD_FLAG_RW, 109, 14, 0x0, 0x0}, + {"para2_h_c", DPP_FIELD_FLAG_RW, 95, 9, 0x0, 0x0}, + {"para2_l_c", DPP_FIELD_FLAG_RW, 86, 32, 0x0, 0x0}, + {"para1_c", DPP_FIELD_FLAG_RW, 54, 14, 0x0, 0x0}, + {"para0_h_c", DPP_FIELD_FLAG_RW, 40, 9, 0x0, 0x0}, + {"para0_l_c", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carc_random_ram_reg[] = + { + {"para8_e", DPP_FIELD_FLAG_RW, 491, 27, 0x0, 0x0}, + {"para7_e", DPP_FIELD_FLAG_RW, 464, 27, 0x0, 0x0}, + {"para6_e", DPP_FIELD_FLAG_RW, 437, 27, 0x0, 0x0}, + {"para5_e", DPP_FIELD_FLAG_RW, 410, 14, 0x0, 0x0}, + {"para4_h_e", DPP_FIELD_FLAG_RW, 396, 9, 0x0, 0x0}, + {"para4_l_e", DPP_FIELD_FLAG_RW, 387, 32, 0x0, 0x0}, + {"para3_e", DPP_FIELD_FLAG_RW, 355, 14, 0x0, 0x0}, + {"para2_h_e", DPP_FIELD_FLAG_RW, 341, 9, 0x0, 0x0}, + {"para2_l_e", DPP_FIELD_FLAG_RW, 332, 32, 0x0, 0x0}, + {"para1_e", DPP_FIELD_FLAG_RW, 300, 14, 0x0, 0x0}, + {"para0_h_e", DPP_FIELD_FLAG_RW, 286, 9, 0x0, 0x0}, + {"para0_l_e", DPP_FIELD_FLAG_RW, 277, 32, 0x0, 0x0}, + {"para8_c", DPP_FIELD_FLAG_RW, 245, 27, 0x0, 0x0}, + {"para7_c", DPP_FIELD_FLAG_RW, 218, 27, 0x0, 0x0}, + {"para6_c", DPP_FIELD_FLAG_RW, 191, 27, 0x0, 0x0}, + {"para5_c", DPP_FIELD_FLAG_RW, 164, 14, 0x0, 0x0}, + {"para4_h_c", DPP_FIELD_FLAG_RW, 150, 9, 0x0, 0x0}, + {"para4_l_c", DPP_FIELD_FLAG_RW, 141, 32, 0x0, 0x0}, + {"para3_c", DPP_FIELD_FLAG_RW, 109, 14, 0x0, 0x0}, + {"para2_h_c", DPP_FIELD_FLAG_RW, 95, 9, 0x0, 0x0}, + {"para2_l_c", DPP_FIELD_FLAG_RW, 86, 32, 0x0, 0x0}, + {"para1_c", DPP_FIELD_FLAG_RW, 54, 14, 0x0, 0x0}, + {"para0_h_c", DPP_FIELD_FLAG_RW, 40, 9, 0x0, 0x0}, + {"para0_l_c", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_cara_begin_flow_id_reg[] = + { + {"cara_begin_flow_id", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carb_begin_flow_id_reg[] = + { + {"carb_begin_flow_id", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_carc_begin_flow_id_reg[] = + { + {"carc_begin_flow_id", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_prog_full_assert_cfg_w_reg[] = + { + {"prog_full_assert_cfg_w", DPP_FIELD_FLAG_RW, 7, 8, 0xe0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_prog_full_negate_cfg_w_reg[] = + { + {"prog_full_negate_cfg_w", DPP_FIELD_FLAG_RW, 7, 8, 0xdf, 0x0}, + }; +DPP_FIELD_T g_stat_car0_timeout_limit_reg[] = + { + {"timeout_limit", DPP_FIELD_FLAG_RW, 15, 16, 0x100, 0x0}, + }; +DPP_FIELD_T g_stat_car0_pkt_des_fifo_overflow_reg[] = + { + {"pkt_des_fifo_overflow", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_pkt_des_fifo_underflow_reg[] = + { + {"pkt_des_fifo_underflow", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_pkt_des_fifo_prog_full_reg[] = + { + {"pkt_des_fifo_prog_full", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_pkt_des_fifo_prog_empty_reg[] = + { + {"pkt_des_fifo_prog_empty", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_car0_pkt_des_fifo_full_reg[] = + { + {"pkt_des_fifo_full", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_pkt_des_fifo_empty_reg[] = + { + {"pkt_des_fifo_empty", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_car0_pkt_size_offset_reg[] = + { + {"pkt_size_offset", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_car_plcr_init_dont_reg[] = + { + {"plcr_init_done", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_max_pkt_size_a_reg[] = + { + {"max_pkt_size_a", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_max_pkt_size_b_reg[] = + { + {"max_pkt_size_b", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_max_pkt_size_c_reg[] = + { + {"max_pkt_size_c", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_car_hierarchy_mode_reg[] = + { + {"car_hierarchy_mode", DPP_FIELD_FLAG_RW, 1, 2, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_prog_empty_assert_cfg_w_reg[] = + { + {"prog_empty_assert_cfg_w", DPP_FIELD_FLAG_RW, 7, 8, 0x3, 0x0}, + }; +DPP_FIELD_T g_stat_car0_prog_empty_negate_cfg_w_reg[] = + { + {"prog_empty_negate_cfg_w", DPP_FIELD_FLAG_RW, 7, 8, 0x4, 0x0}, + }; +DPP_FIELD_T g_stat_car0_pkt_des_fifo_ovf_int_reg[] = + { + {"pkt_des_fifo_ovf_int", DPP_FIELD_FLAG_RO, 1, 2, 0x00, 0x0}, + }; +DPP_FIELD_T g_stat_car0_pkt_des_fifo_data_count_reg[] = + { + {"pkt_des_fifo_data_count", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_pkt_des_fifo_udf_int_reg[] = + { + {"pkt_des_fifo_udf_int", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_cara_queue_ram0_159_0_pkt_reg[] = + { + {"cara_drop", DPP_FIELD_FLAG_RW, 147, 1, 0x0, 0x0}, + {"cara_plcr_en", DPP_FIELD_FLAG_RW, 146, 1, 0x0, 0x0}, + {"cara_profile_id", DPP_FIELD_FLAG_RW, 145, 9, 0x0, 0x0}, + {"cara_tq_h", DPP_FIELD_FLAG_RO, 136, 13, 0x0, 0x0}, + {"cara_tq_l", DPP_FIELD_FLAG_RO, 123, 32, 0x0, 0x0}, + {"cara_dc_high", DPP_FIELD_FLAG_RO, 50, 5, 0x0, 0x0}, + {"cara_dc_low", DPP_FIELD_FLAG_RO, 45, 32, 0x0, 0x0}, + {"cara_tc", DPP_FIELD_FLAG_RO, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_car0_cara_profile_ram1_255_0_pkt_reg[] = + { + {"cara_profile_wr", DPP_FIELD_FLAG_RW, 224, 1, 0x0, 0x0}, + {"cara_pkt_sign", DPP_FIELD_FLAG_RW, 216, 1, 0x0, 0x0}, + {"cara_pkt_cir", DPP_FIELD_FLAG_RW, 189, 30, 0x0, 0x0}, + {"cara_pkt_cbs", DPP_FIELD_FLAG_RW, 150, 14, 0x0, 0x0}, + {"cara_pri0", DPP_FIELD_FLAG_RW, 39, 5, 0x0, 0x0}, + {"cara_pri1", DPP_FIELD_FLAG_RW, 34, 5, 0x0, 0x0}, + {"cara_pri2", DPP_FIELD_FLAG_RW, 29, 5, 0x0, 0x0}, + {"cara_pri3", DPP_FIELD_FLAG_RW, 24, 5, 0x0, 0x0}, + {"cara_pri4", DPP_FIELD_FLAG_RW, 19, 5, 0x0, 0x0}, + {"cara_pri5", DPP_FIELD_FLAG_RW, 14, 5, 0x0, 0x0}, + {"cara_pri6", DPP_FIELD_FLAG_RW, 9, 5, 0x0, 0x0}, + {"cara_pri7", DPP_FIELD_FLAG_RW, 4, 5, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat4k_etcam_block0_7_port_id_cfg_reg[] = + { + {"block7_port_id", DPP_FIELD_FLAG_RW, 31, 4, 0x0, 0x0}, + {"block6_port_id", DPP_FIELD_FLAG_RW, 27, 4, 0x0, 0x0}, + {"block5_port_id", DPP_FIELD_FLAG_RW, 23, 4, 0x0, 0x0}, + {"block4_port_id", DPP_FIELD_FLAG_RW, 19, 4, 0x0, 0x0}, + {"block3_port_id", DPP_FIELD_FLAG_RW, 15, 4, 0x0, 0x0}, + {"block2_port_id", DPP_FIELD_FLAG_RW, 11, 4, 0x0, 0x0}, + {"block1_port_id", DPP_FIELD_FLAG_RW, 7, 4, 0x0, 0x0}, + {"block0_port_id", DPP_FIELD_FLAG_RW, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat4k_etcam_block0_3_base_addr_cfg_reg[] = + { + {"block3_base_addr_cfg", DPP_FIELD_FLAG_RW, 30, 7, 0x0, 0x0}, + {"block2_base_addr_cfg", DPP_FIELD_FLAG_RW, 22, 7, 0x0, 0x0}, + {"block1_base_addr_cfg", DPP_FIELD_FLAG_RW, 14, 7, 0x0, 0x0}, + {"block0_base_addr_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat4k_etcam_block4_7_base_addr_cfg_reg[] = + { + {"block7_base_addr_cfg", DPP_FIELD_FLAG_RW, 30, 7, 0x0, 0x0}, + {"block6_base_addr_cfg", DPP_FIELD_FLAG_RW, 22, 7, 0x0, 0x0}, + {"block5_base_addr_cfg", DPP_FIELD_FLAG_RW, 14, 7, 0x0, 0x0}, + {"block4_base_addr_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_eram_wr_interval_cnt_reg[] = + { + {"cfg_eram_wr_interval_cnt", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_zcam_wr_interval_cnt_reg[] = + { + {"cfg_zcam_wr_interval_cnt", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_tcam_wr_interval_cnt_reg[] = + { + {"cfg_zcam_wr_interval_cnt", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_ddr_wr_interval_cnt_reg[] = + { + {"cfg_ddr_wr_interval_cnt", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_hash_wr_interval_cnt_reg[] = + { + {"cfg_hash_wr_interval_cnt", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_eram_rd_interval_cnt_reg[] = + { + {"cfg_eram_rd_interval_cnt", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_zcam_rd_interval_cnt_reg[] = + { + {"cfg_zcam_rd_interval_cnt", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_tcam_rd_interval_cnt_reg[] = + { + {"cfg_tcam_rd_interval_cnt", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_ddr_rd_interval_cnt_reg[] = + { + {"cfg_ddr_rd_interval_cnt", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_dtb_queue_lock_state_0_3_reg[] = + { + {"cfg_dtb_queue_lock_state", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_axim0_w_convert_0_mode_reg[] = + { + {"w_convert_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_axim0_r_convert_0_mode_reg[] = + { + {"r_convert_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_axim0_aximr_os_reg[] = + { + {"aximr_os", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_axim1_w_convert_1_mode_reg[] = + { + {"w_convert_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_axim1_r_convert_1_mode_reg[] = + { + {"r_convert_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_axis_axis_convert_mode_reg[] = + { + {"w_r_convert_mode", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb4k_dtb_enq_cfg_queue_dtb_addr_h_0_127_reg[] = + { + {"cfg_queue_dtb_addr_h", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb4k_dtb_enq_cfg_queue_dtb_addr_l_0_127_reg[] = + { + {"cfg_queue_dtb_addr_l", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb4k_dtb_enq_cfg_queue_dtb_len_0_127_reg[] = + { + {"cfg_dtb_cmd_type", DPP_FIELD_FLAG_RW, 30, 1, 0x0, 0x0}, + {"cfg_dtb_cmd_int_en", DPP_FIELD_FLAG_RW, 29, 1, 0x0, 0x0}, + {"cfg_queue_dtb_len", DPP_FIELD_FLAG_RW, 9, 10, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb4k_dtb_enq_info_queue_buf_space_left_0_127_reg[] = + { + {"info_queue_buf_space_left", DPP_FIELD_FLAG_RO, 5, 6, 0x20, 0x0}, + }; +DPP_FIELD_T g_dtb4k_dtb_enq_cfg_epid_v_func_num_0_127_reg[] = + { + {"dbi_en", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + {"queue_en", DPP_FIELD_FLAG_RW, 30, 1, 0x0, 0x0}, + {"cfg_epid", DPP_FIELD_FLAG_RW, 27, 4, 0x0, 0x0}, + {"cfg_vfunc_num", DPP_FIELD_FLAG_RW, 23, 8, 0x0, 0x0}, + {"cfg_vector", DPP_FIELD_FLAG_RW, 14, 7, 0x0, 0x0}, + {"cfg_func_num", DPP_FIELD_FLAG_RW, 7, 3, 0x0, 0x0}, + {"cfg_vfunc_active", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpg_ms_en_reg[] = + { + {"cpu_trpgrx_ms_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpg_port_en_reg[] = + { + {"cpu_trpgrx_port_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpg_look_en_reg[] = + { + {"cpu_trpgrx_look_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpgrx_ram_almost_full_reg[] = + { + {"cpu_trpgrx_ram_almost_full", DPP_FIELD_FLAG_RW, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpgrx_ram_test_en_reg[] = + { + {"cpu_trpgrx_ram_test_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpgrx_inmod_pfc_rdy_en_reg[] = + { + {"cpu_trpgrx_inmod_pfc_rdy_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpgrx_pkt_num_h_reg[] = + { + {"cpu_trpgrx_pkt_num_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpgrx_pkt_num_l_reg[] = + { + {"cpu_trpgrx_pkt_num_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpgrx_pkt_byte_num_h_reg[] = + { + {"cpu_trpgrx_pkt_byte_num_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpgrx_pkt_byte_num_l_reg[] = + { + {"cpu_trpgrx_pkt_byte_num_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpgrx_pkt_cnt_clr_reg[] = + { + {"cpu_trpgrx_pkt_cnt_clr", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpgrx_fc_clk_freq_reg[] = + { + {"cpu_trpgrx_fc_clk_freq", DPP_FIELD_FLAG_RW, 10, 11, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpgrx_fc_en_reg[] = + { + {"cpu_trpgrx_fc_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpgrx_fc_token_add_num_reg[] = + { + {"cpu_trpgrx_fc_token_add_num", DPP_FIELD_FLAG_RW, 14, 15, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpgrx_fc_token_max_num_reg[] = + { + {"cpu_trpgrx_fc_token_max_num", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpgrx_port_state_info_reg[] = + { + {"cpu_trpgrx_port_state_info", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpgrx_ram_past_max_dep_reg[] = + { + {"cpu_trpgrx_ram_past_max_dep", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpgrx_ram_past_max_dep_clr_reg[] = + { + {"cpu_trpgrx_ram_past_max_dep_clr", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpgrx_pkt_past_max_len_reg[] = + { + {"cpu_trpgrx_pkt_past_max_len", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpgrx_pkt_past_max_len_clr_reg[] = + { + {"cpu_trpgrx_pkt_past_max_len_clr", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpgrx_pkt_past_min_len_reg[] = + { + {"cpu_trpgrx_pkt_past_min_len", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpgrx_pkt_past_min_len_clr_reg[] = + { + {"cpu_trpgrx_pkt_past_min_len_clr", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_ram_trpg_rx_data_ram_reg[] = + { + {"trpg_rx_data_ram", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_ram_trpg_rx_info_ram_reg[] = + { + {"trpg_rx_info_ram", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_port_cpu_trpg_ms_en_reg[] = + { + {"cpu_trpgtx_ms_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_port_cpu_trpg_port_en_reg[] = + { + {"cpu_trpgtx_port_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_port_cpu_trpg_look_en_reg[] = + { + {"cpu_trpgtx_look_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_port_cpu_trpgtx_ram_almost_full_reg[] = + { + {"cpu_trpgtx_ram_almost_full", DPP_FIELD_FLAG_RW, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_port_cpu_trpgtx_ram_test_en_reg[] = + { + {"cpu_trpgtx_ram_test_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_port_cpu_trpgtx_pkt_num_h_reg[] = + { + {"cpu_trpgtx_pkt_num_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_port_cpu_trpgtx_pkt_num_l_reg[] = + { + {"cpu_trpgtx_pkt_num_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_port_cpu_trpgtx_pkt_byte_num_h_reg[] = + { + {"cpu_trpgtx_pkt_byte_num_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_port_cpu_trpgtx_pkt_byte_num_l_reg[] = + { + {"cpu_trpgtx_pkt_byte_num_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_port_cpu_trpgtx_pkt_cnt_clr_reg[] = + { + {"cpu_trpgtx_pkt_cnt_clr", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_port_cpu_trpgtx_fc_clk_freq_reg[] = + { + {"cpu_trpgtx_fc_clk_freq", DPP_FIELD_FLAG_RW, 10, 11, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_port_cpu_trpgtx_fc_en_reg[] = + { + {"cpu_trpgtx_fc_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_port_cpu_trpgtx_fc_token_add_num_reg[] = + { + {"cpu_trpgtx_fc_token_add_num", DPP_FIELD_FLAG_RW, 14, 15, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_port_cpu_trpgtx_fc_token_max_num_reg[] = + { + {"cpu_trpgtx_fc_token_max_num", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_port_cpu_trpgtx_port_state_info_reg[] = + { + {"cpu_trpgtx_port_state_info", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_port_cpu_trpgtx_ram_past_max_dep_reg[] = + { + {"cpu_trpgtx_ram_past_max_dep", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_port_cpu_trpgtx_ram_past_max_dep_clr_reg[] = + { + {"cpu_trpgtx_ram_past_max_dep_clr", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_port_cpu_trpgtx_pkt_past_max_len_reg[] = + { + {"cpu_trpgtx_pkt_past_max_len", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_port_cpu_trpgtx_pkt_past_max_len_clr_reg[] = + { + {"cpu_trpgtx_pkt_past_max_len_clr", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_port_cpu_trpgtx_pkt_past_min_len_reg[] = + { + {"cpu_trpgtx_pkt_past_min_len", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_port_cpu_trpgtx_pkt_past_min_len_clr_reg[] = + { + {"cpu_trpgtx_pkt_past_min_len_clr", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_etm_port_cpu_trpgtx_etm_ram_almost_full_reg[] = + { + {"cpu_trpgtx_etm_ram_almost_full", DPP_FIELD_FLAG_RW, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_etm_port_cpu_trpgtx_etm_ram_test_en_reg[] = + { + {"cpu_trpgtx_etm_ram_test_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_glb_cpu_todtime_update_int_mask_reg[] = + { + {"cpu_todtime_update_int_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_glb_cpu_todtime_update_int_clr_reg[] = + { + {"cpu_todtime_update_int_clr", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_glb_cpu_todtime_ram_test_en_reg[] = + { + {"cpu_todtime_ram_test_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_ram_trpg_tx_data_ram_reg[] = + { + {"trpg_tx_data_ram", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_ram_trpg_tx_info_ram_reg[] = + { + {"trpg_tx_info_ram", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_etm_ram_trpg_tx_etm_data_ram_reg[] = + { + {"trpg_tx_etm_data_ram", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_etm_ram_trpg_tx_etm_info_ram_reg[] = + { + {"trpg_tx_etm_info_ram", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cfgmt_chip_version_reg_reg[] = + { + {"chip_version_reg", DPP_FIELD_FLAG_RO, 31, 4, 0x1, 0x0}, + {"chip_sub_reg", DPP_FIELD_FLAG_RO, 27, 4, 0x0, 0x0}, + {"chip_type_reg", DPP_FIELD_FLAG_RO, 23, 24, 0x211650, 0x0}, + }; +DPP_FIELD_T g_etm_cfgmt_chip_date_reg_reg[] = + { + {"chip_date_reg", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cfgmt_cfgmt_crc_en_reg[] = + { + {"cfgmt_crc_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cfgmt_cfg_port_transfer_en_reg[] = + { + {"cfg_port_transfer_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cfgmt_tm_sa_work_mode_reg[] = + { + {"tm_sa_work_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cfgmt_local_sa_id_reg[] = + { + {"local_sa_id", DPP_FIELD_FLAG_RW, 6, 7, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_olif_rdy_reg[] = + { + {"cfgmt_block_mode", DPP_FIELD_FLAG_RO, 5, 2, 0x2, 0x0}, + {"cfgmt_count_overflow_mode", DPP_FIELD_FLAG_RO, 3, 1, 0x1, 0x0}, + {"cfgmt_count_rd_mode", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"olif_rdy", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_emem_prog_full_reg[] = + { + {"emem_prog_full_assert", DPP_FIELD_FLAG_RW, 24, 9, 0xb9, 0x0}, + {"emem_prog_full_negate", DPP_FIELD_FLAG_RW, 8, 9, 0xac, 0x0}, + }; +DPP_FIELD_T g_etm_olif_port_order_fifo_full_reg[] = + { + {"port_order_fifo_full_assert", DPP_FIELD_FLAG_RW, 22, 7, 0x32, 0x0}, + {"port_order_fifo_full_negate", DPP_FIELD_FLAG_RW, 6, 7, 0x32, 0x0}, + }; +DPP_FIELD_T g_etm_olif_olif_release_last_reg[] = + { + {"olif_release_last_addr", DPP_FIELD_FLAG_RO, 24, 19, 0x0, 0x0}, + {"olif_release_last_bank", DPP_FIELD_FLAG_RO, 5, 6, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_olif_fifo_empty_state_reg[] = + { + {"qmu_para_fifo_empty", DPP_FIELD_FLAG_RO, 2, 1, 0x1, 0x0}, + {"emem_empty", DPP_FIELD_FLAG_RO, 1, 1, 0x1, 0x0}, + {"imem_empty", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_olif_qmu_olif_release_fc_cnt_reg[] = + { + {"qmu_olif_release_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_olif_qmu_link_fc_cnt_reg[] = + { + {"olif_qmu_link_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_lif0_link_fc_cnt_reg[] = + { + {"lif0_link_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_olif_tmmu_fc_cnt_reg[] = + { + {"olif_tmmu_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_olif_mmu_fc_cnt_reg[] = + { + {"olif_mmu_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_olif_qmu_port_rdy_h_reg[] = + { + {"olif_qmu_port_rdy_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_olif_qmu_port_rdy_l_reg[] = + { + {"olif_qmu_port_rdy_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_lif0_port_rdy_h_reg[] = + { + {"lif0_port_rdy_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_lif0_port_rdy_l_reg[] = + { + {"lif0_port_rdy_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_qmu_olif_rd_sop_cnt_reg[] = + { + {"qmu_olif_rd_sop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_qmu_olif_rd_eop_cnt_reg[] = + { + {"qmu_olif_rd_eop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_qmu_olif_rd_vld_cnt_reg[] = + { + {"qmu_olif_rd_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_qmu_olif_rd_blk_cnt_reg[] = + { + {"qmu_olif_rd_blk_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_mmu_tm_data_sop_cnt_reg[] = + { + {"mmu_tm_data_sop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_mmu_tm_data_eop_cnt_reg[] = + { + {"mmu_tm_data_eop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_mmu_tm_data_vld_cnt_reg[] = + { + {"mmu_tm_data_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_odma_tm_data_sop_cnt_reg[] = + { + {"odma_tm_data_sop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_odma_tm_data_eop_cnt_reg[] = + { + {"odma_tm_data_eop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_odma_tm_deq_vld_cnt_reg[] = + { + {"odma_tm_deq_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_olif_qmu_release_vld_cnt_reg[] = + { + {"olif_qmu_release_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_emem_dat_vld_cnt_reg[] = + { + {"emem_dat_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_imem_dat_vld_cnt_reg[] = + { + {"imem_dat_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_emem_dat_rd_cnt_reg[] = + { + {"emem_dat_rd_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_imem_dat_rd_cnt_reg[] = + { + {"imem_dat_rd_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_qmu_olif_rd_sop_emem_cnt_reg[] = + { + {"qmu_olif_rd_sop_emem_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_qmu_olif_rd_vld_emem_cnt_reg[] = + { + {"qmu_olif_rd_vld_emem_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_cpu_last_wr_addr_reg[] = + { + {"cpu_last_wr_addr", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_cpu_last_wr_data_reg[] = + { + {"cpu_last_wr_data", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_cpu_last_rd_addr_reg[] = + { + {"cpu_last_rd_addr", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_qmu_olif_last_port_reg[] = + { + {"qmu_olif_last_port", DPP_FIELD_FLAG_RO, 6, 7, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_qmu_olif_last_addr_reg[] = + { + {"qmu_olif_last_addr", DPP_FIELD_FLAG_RO, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_qmu_olif_last_bank_reg[] = + { + {"qmu_olif_last_bank", DPP_FIELD_FLAG_RO, 6, 7, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_tm_lif_byte_stat_reg[] = + { + {"tm_lif_byte_stat", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_olif_tm_lif_err_stat_reg[] = + { + {"tm_lif_err_stat", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_port_share_cnt_reg[] = + { + {"port_share_cnt", DPP_FIELD_FLAG_RO, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_total_imem_cnt_reg[] = + { + {"total_imem_cnt", DPP_FIELD_FLAG_RO, 14, 15, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_pp_q_len_reg[] = + { + {"pp_q_len", DPP_FIELD_FLAG_RO, 28, 29, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_sys_q_len_reg[] = + { + {"sys_q_len", DPP_FIELD_FLAG_RO, 28, 29, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_cfg_error_warning_reg[] = + { + {"error_correction_11", DPP_FIELD_FLAG_RO, 11, 1, 0x0, 0x0}, + {"error_correction_10", DPP_FIELD_FLAG_RO, 10, 1, 0x0, 0x0}, + {"error_correction_9", DPP_FIELD_FLAG_RO, 9, 1, 0x0, 0x0}, + {"error_correction_8", DPP_FIELD_FLAG_RO, 8, 1, 0x0, 0x0}, + {"error_correction_7", DPP_FIELD_FLAG_RO, 7, 1, 0x0, 0x0}, + {"error_correction_6", DPP_FIELD_FLAG_RO, 6, 1, 0x0, 0x0}, + {"error_correction5", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"error_correction_4", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"error_correction_3", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"error_correction_2", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"error_correction_1", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"error_correction_0", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_mult_qlen_th_en_reg[] = + { + {"mult_qlen_th", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_mult_qlen_th_reg[] = + { + {"mult_qlen_th", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_cfg_move_reg[] = + { + {"cfgmt_sys_move_en", DPP_FIELD_FLAG_RW, 2, 1, 0x0, 0x0}, + {"cfgmt_port_move_en", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"cfgmt_flow_move_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cfgmt_total_th_reg[] = + { + {"cfgmt_total_th", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cfgmt_port_share_th_reg[] = + { + {"cfgmt_port_share_th", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_sa_unreach_state_reg[] = + { + {"sa_unreach_state", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_mv_port_th_reg[] = + { + {"port_th", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_mv_drop_sp_th_reg[] = + { + {"mvdrop_sp_th", DPP_FIELD_FLAG_RW, 8, 9, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_state_warning_reg[] = + { + {"deq_q_num_warning", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"deq_pkt_len_warning", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"enq_pkt_dp_warning", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"unenq_q_num_warning", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"enq_q_num_warning", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"enq_pkt_len_warning", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_tmmu_cgavd_dma_fifo_cnt_reg[] = + { + {"tmmu_cgavd_dma_fifo_cnt", DPP_FIELD_FLAG_RO, 8, 9, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_tmmu_cgavd_dma_fifo_cnt_max_reg[] = + { + {"tmmu_cgavd_dma_fifo_cnt_max", DPP_FIELD_FLAG_RO, 8, 9, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_imem_total_cnt_reg[] = + { + {"imem_total_cnt", DPP_FIELD_FLAG_RO, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_imem_total_cnt_max_reg[] = + { + {"imem_total_cnt_max", DPP_FIELD_FLAG_RO, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow0_omem_cnt_reg[] = + { + {"flow0_omem_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow1_omem_cnt_reg[] = + { + {"flow1_omem_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow2_omem_cnt_reg[] = + { + {"flow2_omem_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow3_omem_cnt_reg[] = + { + {"flow3_omem_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_flow4_omem_cnt_reg[] = + { + {"flow4_omem_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_appoint_flow_num_message_1_reg[] = + { + {"appoint_flow_num_en_1", DPP_FIELD_FLAG_RW, 15, 1, 0x0, 0x0}, + {"appoint_flow_num_1", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_appoint_flow_num_message_2_reg[] = + { + {"appoint_flow_num_en_2", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"appoint_flow_num_2", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_odma_cgavd_pkt_num_1_reg[] = + { + {"odma_cgavd_pkt_num_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_odma_cgavd_byte_num_1_reg[] = + { + {"odma_cgavd_byte_num_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_enqueue_pkt_num_1_reg[] = + { + {"cgavd_enqueue_pkt_num_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_dequeue_pkt_num_1_reg[] = + { + {"cgavd_dequeue_pkt_num_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_pkt_imem_num_1_reg[] = + { + {"cgavd_qmu_pkt_imem_num_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_pkt_omem_num_1_reg[] = + { + {"cgavd_qmu_pkt_omem_num_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_byte_imem_num_1_reg[] = + { + {"cgavd_qmu_byte_imem_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_byte_omem_num_1_reg[] = + { + {"cgavd_qmu_byte_omem_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_pkt_drop_num_1_reg[] = + { + {"cgavd_qmu_pkt_drop_num_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_byte_drop_num_1_reg[] = + { + {"cgavd_qmu_byte_drop_num_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_forbid_drop_num_1_reg[] = + { + {"cgavd_qmu_forbid_drop_num_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_flow_td_drop_num_1_reg[] = + { + {"cgavd_qmu_flow_td_drop_num_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_flow_wred_drop_num_1_reg[] = + { + {"cgavd_qmu_flow_wred_drop_num_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_flow_wred_dp_drop_num_1_reg[] = + { + {"cgavd_qmu_flow_wred_dp_drop_num1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_pp_td_num_1_reg[] = + { + {"cgavd_qmu_pp_td_num_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_pp_wred_drop_num_1_reg[] = + { + {"cgavd_qmu_pp_wred_drop_num_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_pp_wred_dp_drop_num_1_reg[] = + { + {"cgavd_qmu_pp_wred_dp_drop_num1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_sys_td_drop_num_1_reg[] = + { + {"cgavd_qmu_sys_td_drop_num_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_sys_gred_drop_num_1_reg[] = + { + {"cgavd_qmu_sys_gred_drop_num_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_sys_gred_dp_drop_num1_reg[] = + { + {"cgavd_qmu_sys_gred_dp_drop_num1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_sa_drop_num_1_reg[] = + { + {"cgavd_qmu_sa_drop_num_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_move_drop_num_1_reg[] = + { + {"cgavd_qmu_move_drop_num_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_tm_mult_drop_num_1_reg[] = + { + {"cgavd_qmu_tm_mult_drop_num_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_tm_error_drop_num_1_reg[] = + { + {"cgavd_qmu_tm_error_drop_num_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_odma_cgavd_pkt_num_2_reg[] = + { + {"odma_cgavd_pkt_num_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_odma_cgavd_byte_num_2_reg[] = + { + {"odma_cgavd_byte_num_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_enqueue_pkt_num_2_reg[] = + { + {"cgavd_enqueue_pkt_num_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_dequeue_pkt_num_2_reg[] = + { + {"cgavd_dequeue_pkt_num_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_pkt_imem_num_2_reg[] = + { + {"cgavd_qmu_pkt_imem_num_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_pkt_omem_num_2_reg[] = + { + {"cgavd_qmu_pkt_omem_num_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_byte_imem_num_2_reg[] = + { + {"cgavd_qmu_byte_imem_num_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_byte_omem_num_2_reg[] = + { + {"cgavd_qmu_byte_omem_num_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_pkt_drop_num_2_reg[] = + { + {"cgavd_qmu_pkt_drop_num_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_byte_drop_num_2_reg[] = + { + {"cgavd_qmu_byte_drop_num_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_forbid_drop_num_2_reg[] = + { + {"cgavd_qmu_forbid_drop_num_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_flow_td_drop_num_2_reg[] = + { + {"cgavd_qmu_flow_td_drop_num_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_flow_wred_drop_num_2_reg[] = + { + {"cgavd_qmu_flow_wred_drop_num_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_flow_wred_dp_drop_num_2_reg[] = + { + {"cgavd_qmu_flow_wred_dp_drop_num_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_pp_td_num_2_reg[] = + { + {"cgavd_qmu_pp_td_num_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_pp_wred_drop_num_2_reg[] = + { + {"cgavd_qmu_pp_wred_drop_num_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_pp_wred_dp_drop_num_2_reg[] = + { + {"cgavd_qmu_pp_wred_dp_drop_num_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_sys_td_drop_num_2_reg[] = + { + {"cgavd_qmu_sys_td_drop_num_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_sys_gred_drop_num_2_reg[] = + { + {"cgavd_qmu_sys_gred_drop_num_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_sys_gred_dp_drop_num_2_reg[] = + { + {"cgavd_qmu_sys_gred_dp_drop_num_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_sa_drop_num_2_reg[] = + { + {"cgavd_qmu_sa_drop_num_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_move_drop_num_2_reg[] = + { + {"cgavd_qmu_move_drop_num_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_tm_mult_drop_num_2_reg[] = + { + {"cgavd_qmu_tm_mult_drop_num_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_cgavd_qmu_tm_error_drop_num_2_reg[] = + { + {"cgavd_qmu_tm_error_drop_num_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_move_flow_th_profile_reg[] = + { + {"move_drop_profile", DPP_FIELD_FLAG_RW, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_cgavd_move_flow_th_reg[] = + { + {"move_drop_flow_th", DPP_FIELD_FLAG_RW, 28, 29, 0x50, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_emem_pd_fifo_aful_th_reg[] = + { + {"emem_pd_fifo_aful_th", DPP_FIELD_FLAG_RW, 7, 8, 0x40, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_dma_data_fifo_aful_th_reg[] = + { + {"dma_data_fifo_aful_th", DPP_FIELD_FLAG_RW, 9, 10, 0x190, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tmmu_states_0_reg[] = + { + {"tm_odma_pkt_rdy", DPP_FIELD_FLAG_RO, 30, 1, 0x1, 0x0}, + {"dma_data_fifo_empty", DPP_FIELD_FLAG_RO, 29, 1, 0x1, 0x0}, + {"imem_enq_rd_fifo_empty", DPP_FIELD_FLAG_RO, 28, 1, 0x1, 0x0}, + {"imem_enq_drop_fifo_empty", DPP_FIELD_FLAG_RO, 27, 1, 0x1, 0x0}, + {"imem_deq_rd_fifo_empty", DPP_FIELD_FLAG_RO, 26, 1, 0x1, 0x0}, + {"imem_deq_drop_fifo_empty", DPP_FIELD_FLAG_RO, 25, 1, 0x1, 0x0}, + {"wr_cmd_fifo_empty", DPP_FIELD_FLAG_RO, 24, 1, 0x1, 0x0}, + {"cached_pd_fifo_empty", DPP_FIELD_FLAG_RO, 23, 1, 0x1, 0x0}, + {"emem_pd_fifo_empty", DPP_FIELD_FLAG_RO, 22, 1, 0x1, 0x0}, + {"pd_order_fifo_empty", DPP_FIELD_FLAG_RO, 21, 1, 0x1, 0x0}, + {"odma_tm_data_rdy", DPP_FIELD_FLAG_RO, 20, 1, 0x1, 0x0}, + {"odma_tm_discard_rdy", DPP_FIELD_FLAG_RO, 19, 1, 0x1, 0x0}, + {"olif_tmmu_rdy", DPP_FIELD_FLAG_RO, 18, 1, 0x1, 0x0}, + {"mmu_tm_cmd_wr_rdy", DPP_FIELD_FLAG_RO, 17, 1, 0x1, 0x0}, + {"mmu_tm_data_wr_rdy", DPP_FIELD_FLAG_RO, 16, 1, 0x1, 0x0}, + {"mmu_tm_rd_rdy", DPP_FIELD_FLAG_RO, 15, 1, 0x1, 0x0}, + {"mmu_tm_sop_rd_rdy", DPP_FIELD_FLAG_RO, 14, 1, 0x1, 0x0}, + {"qmu_tmmu_sop_data_rdy", DPP_FIELD_FLAG_RO, 13, 1, 0x1, 0x0}, + {"tmmu_cmdsw_imem_release_rdy", DPP_FIELD_FLAG_RO, 12, 1, 0x1, 0x0}, + {"imem_age_release_rdy", DPP_FIELD_FLAG_RO, 11, 1, 0x1, 0x0}, + {"tmmu_qmu_wr_rdy", DPP_FIELD_FLAG_RO, 10, 1, 0x1, 0x0}, + {"tmmu_qmu_rdy_7", DPP_FIELD_FLAG_RO, 9, 1, 0x1, 0x0}, + {"tmmu_qmu_rdy_6", DPP_FIELD_FLAG_RO, 8, 1, 0x1, 0x0}, + {"tmmu_qmu_rdy_5", DPP_FIELD_FLAG_RO, 7, 1, 0x1, 0x0}, + {"tmmu_qmu_rdy_4", DPP_FIELD_FLAG_RO, 6, 1, 0x1, 0x0}, + {"tmmu_qmu_rdy_3", DPP_FIELD_FLAG_RO, 5, 1, 0x1, 0x0}, + {"tmmu_qmu_rdy_2", DPP_FIELD_FLAG_RO, 4, 1, 0x1, 0x0}, + {"tmmu_qmu_rdy_1", DPP_FIELD_FLAG_RO, 3, 1, 0x1, 0x0}, + {"tmmu_qmu_rdy_0", DPP_FIELD_FLAG_RO, 2, 1, 0x1, 0x0}, + {"tmmu_qmu_rd_rdy", DPP_FIELD_FLAG_RO, 1, 1, 0x1, 0x0}, + {"tmmu_qmu_sop_rd_rdy", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_qmu_tmmu_wr_sop_cnt_reg[] = + { + {"qmu_tmmu_wr_sop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_qmu_tmmu_wr_eop_cnt_reg[] = + { + {"qmu_tmmu_wr_eop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_qmu_tmmu_wr_drop_cnt_reg[] = + { + {"qmu_tmmu_wr_drop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_qmu_tmmu_wr_emem_cnt_reg[] = + { + {"qmu_tmmu_wr_emem_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_qmu_tmmu_wr_imem_cnt_reg[] = + { + {"qmu_tmmu_wr_imem_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tmmu_mmu_wr_sop_cnt_reg[] = + { + {"tmmu_mmu_wr_sop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tmmu_mmu_wr_eop_cnt_reg[] = + { + {"tmmu_mmu_wr_eop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_qmu_tmmu_rd_sop_cnt_reg[] = + { + {"qmu_tmmu_rd_sop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_qmu_tmmu_rd_eop_cnt_reg[] = + { + {"qmu_tmmu_rd_eop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_qmu_tmmu_rd_drop_cnt_reg[] = + { + {"qmu_tmmu_rd_drop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_qmu_tmmu_rd_emem_cnt_reg[] = + { + {"qmu_tmmu_rd_emem_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_qmu_tmmu_rd_imem_cnt_reg[] = + { + {"qmu_tmmu_rd_imem_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tmmu_mmu_rd_sop_cnt_reg[] = + { + {"tmmu_mmu_rd_sop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tmmu_mmu_rd_eop_cnt_reg[] = + { + {"tmmu_mmu_rd_eop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tmmu_odma_in_sop_cnt_reg[] = + { + {"tmmu_odma_in_sop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tmmu_odma_in_eop_cnt_reg[] = + { + {"tmmu_odma_in_eop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tmmu_odma_vld_cnt_reg[] = + { + {"tmmu_odma_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_qmu_pd_in_cnt_reg[] = + { + {"qmu_pd_in_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tmmu_pd_hit_cnt_reg[] = + { + {"tmmu_pd_hit_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tmmu_pd_out_cnt_reg[] = + { + {"tmmu_pd_out_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tmmu_wr_cmd_fifo_wr_cnt_reg[] = + { + {"tmmu_wr_cmd_fifo_wr_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tmmu_imem_age_cnt_reg[] = + { + {"tmmu_imem_age_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tmmu_cmdsch_rd_cnt_reg[] = + { + {"tmmu_cmdsch_rd_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tmmu_cmdsch_drop_cnt_reg[] = + { + {"tmmu_cmdsch_drop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tmmu_cmdsw_drop_cnt_reg[] = + { + {"tmmu_cmdsw_drop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tmmu_odma_enq_rd_cnt_reg[] = + { + {"tmmu_odma_enq_rd_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tmmu_odma_enq_drop_cnt_reg[] = + { + {"tmmu_odma_enq_drop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tmmu_odma_imem_age_cnt_reg[] = + { + {"tmmu_odma_imem_age_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tmmu_odma_deq_rd_cnt_reg[] = + { + {"tmmu_odma_deq_rd_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tmmu_odma_deq_drop_cnt_reg[] = + { + {"tmmu_odma_deq_drop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_olif_tmmu_xoff_cnt_reg[] = + { + {"olif_tmmu_xoff_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_odma_tm_data_xoff_cnt_reg[] = + { + {"odma_tm_data_xoff_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tm_odma_pkt_xoff_cnt_reg[] = + { + {"tm_odma_pkt_xoff_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_tm_state_3_reg[] = + { + {"tmmu_qmu_rdy_9", DPP_FIELD_FLAG_RO, 1, 1, 0x1, 0x0}, + {"tmmu_qmu_rdy_8", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_pd_cache_cmd_reg[] = + { + {"cfgmt_pd_cache_addr", DPP_FIELD_FLAG_RW, 12, 13, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_pd_cache_rd_done_reg[] = + { + {"cfgmt_pd_cache_rd_done", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_pd_cache_rd_data_0_reg[] = + { + {"cfgmt_pd_cache_rd_data_0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_pd_cache_rd_data_1_reg[] = + { + {"cfgmt_pd_cache_rd_data_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_pd_cache_rd_data_2_reg[] = + { + {"cfgmt_pd_cache_rd_data_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_pd_cache_rd_data_3_reg[] = + { + {"cfgmt_pd_cache_rd_data_3", DPP_FIELD_FLAG_RO, 14, 15, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_tmmu_to_odma_para_reg[] = + { + {"cfgmt_tmmu_to_odma_para", DPP_FIELD_FLAG_RO, 25, 26, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_dma_data_fifo_cnt_reg[] = + { + {"cfgmt_dma_data_fifo_cnt", DPP_FIELD_FLAG_RO, 8, 9, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_cache_tag_bit0_offset_reg[] = + { + {"cfgmt_cache_tag_bit0_offset", DPP_FIELD_FLAG_RW, 4, 5, 0xd, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_cache_tag_bit1_offset_reg[] = + { + {"cfgmt_cache_tag_bit1_offset", DPP_FIELD_FLAG_RW, 4, 5, 0xe, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_cache_tag_bit2_offset_reg[] = + { + {"cfgmt_cache_tag_bit2_offset", DPP_FIELD_FLAG_RW, 4, 5, 0xf, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_cache_tag_bit3_offset_reg[] = + { + {"cfgmt_cache_tag_bit3_offset", DPP_FIELD_FLAG_RW, 4, 5, 0x10, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_cache_tag_bit4_offset_reg[] = + { + {"cfgmt_cache_tag_bit4_offset", DPP_FIELD_FLAG_RW, 4, 5, 0x11, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_cache_tag_bit5_offset_reg[] = + { + {"cfgmt_cache_tag_bit5_offset", DPP_FIELD_FLAG_RW, 4, 5, 0x12, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_cache_index_bit0_offset_reg[] = + { + {"cfgmt_cache_index_bit0_offset", DPP_FIELD_FLAG_RW, 4, 5, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_cache_index_bit1_offset_reg[] = + { + {"cfgmt_cache_index_bit1_offset", DPP_FIELD_FLAG_RW, 4, 5, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_cache_index_bit2_offset_reg[] = + { + {"cfgmt_cache_index_bit2_offset", DPP_FIELD_FLAG_RW, 4, 5, 0x2, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_cache_index_bit3_offset_reg[] = + { + {"cfgmt_cache_index_bit3_offset", DPP_FIELD_FLAG_RW, 4, 5, 0x3, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_cache_index_bit4_offset_reg[] = + { + {"cfgmt_cache_index_bit4_offset", DPP_FIELD_FLAG_RW, 4, 5, 0x4, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_cache_index_bit5_offset_reg[] = + { + {"cfgmt_cache_index_bit5_offset", DPP_FIELD_FLAG_RW, 4, 5, 0x5, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_cache_index_bit6_offset_reg[] = + { + {"cfgmt_cache_index_bit6_offset", DPP_FIELD_FLAG_RW, 4, 5, 0x6, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_cache_index_bit7_offset_reg[] = + { + {"cfgmt_cache_index_bit7_offset", DPP_FIELD_FLAG_RW, 4, 5, 0x7, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_cache_index_bit8_offset_reg[] = + { + {"cfgmt_cache_index_bit8_offset", DPP_FIELD_FLAG_RW, 4, 5, 0x8, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_cache_index_bit9_offset_reg[] = + { + {"cfgmt_cache_index_bit9_offset", DPP_FIELD_FLAG_RW, 4, 5, 0x9, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_cache_index_bit10_offset_reg[] = + { + {"cfgmt_cache_index_bit10_offset", DPP_FIELD_FLAG_RW, 4, 5, 0xa, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_cache_index_bit11_offset_reg[] = + { + {"cfgmt_cache_index_bit11_offset", DPP_FIELD_FLAG_RW, 4, 5, 0xb, 0x0}, + }; +DPP_FIELD_T g_etm_tmmu_cfgmt_cache_index_bit12_offset_reg[] = + { + {"cfgmt_cache_index_bit12_offset", DPP_FIELD_FLAG_RW, 4, 5, 0xc, 0x0}, + }; +DPP_FIELD_T g_etm_shap_bktfull_fifo_full_flagregister_reg[] = + { + {"bktfull_fifo_full_flag_core", DPP_FIELD_FLAG_RC, 21, 22, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_shap_fifo_full_regregister_reg[] = + { + {"fifo_full_reg", DPP_FIELD_FLAG_RO, 21, 22, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_shap_fifo_empty_regregister_reg[] = + { + {"fifo_empty_reg", DPP_FIELD_FLAG_RO, 21, 22, 0x7, 0x0}, + }; +DPP_FIELD_T g_etm_shap_fifo_almost_full_regregister_reg[] = + { + {"fifo_almost_full_reg", DPP_FIELD_FLAG_RO, 21, 22, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_shap_fifo_almost_empty_regregister_reg[] = + { + {"fifo_almost_empty_reg", DPP_FIELD_FLAG_RO, 21, 22, 0x7, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_credit_space_select_reg[] = + { + {"credit_space_select", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_stat_space_max_reg[] = + { + {"stat_space_max", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_stat_space_min_reg[] = + { + {"stat_space_min", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_stat_space_credit_reg[] = + { + {"stat_space_credit", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_stat_que_step8_credit_reg[] = + { + {"stat_que_step8_credit", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_special_que_reg[] = + { + {"special_que_id", DPP_FIELD_FLAG_RW, 5, 6, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_special_que_credit_reg[] = + { + {"special_que_credit", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_lif_congest_credit_cnt_reg[] = + { + {"lif_congest_credit_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_lif_port_congest_credit_cnt_reg[] = + { + {"lif_port_congest_credit_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_crdt_congest_credit_cnt_reg[] = + { + {"crdt_congest_credit_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_crdt_port_congest_credit_cnt_reg[] = + { + {"crdt_port_congest_credit_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_congest_port_id_reg[] = + { + {"congest_port_id", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_dev_link_control_reg[] = + { + {"dev_link_control", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_crdt_sa_port_rdy_reg[] = + { + {"crdt_sa_port_rdy", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_crdt_congest_mode_select_reg[] = + { + {"crdt_congest_mode_selectr", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_fifo_out_all_crs_normal_cnt_reg[] = + { + {"fifo_out_all_crs_normal_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_fifo_out_all_crs_off_cnt_reg[] = + { + {"fifo_out_all_crs_off_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_fifo_out_que_crs_normal_cnt_reg[] = + { + {"fifo_out_que_crs_normal_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_fifo_out_que_crs_off_cnt_reg[] = + { + {"fifo_out_que_crs_off_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_mode_add_60g_reg[] = + { + {"mode_add_60g", DPP_FIELD_FLAG_RW, 15, 16, 0xff, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_pp_token_add_reg[] = + { + {"pp_token_add_cir", DPP_FIELD_FLAG_RO, 4, 5, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_pp_cir_token_total_dist_cnt_reg[] = + { + {"pp_cir_token_total_dist_counter", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_pp_cir_token_total_dec_cnt_reg[] = + { + {"pp_cir_token_total_dec_counter", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_dev_credit_cnt_reg[] = + { + {"dev_credit_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_no_credit_cnt1_reg[] = + { + {"no_credit_cnt1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_no_credit_cnt2_reg[] = + { + {"no_credit_cnt2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_asm_interval_0_cfg_reg[] = + { + {"asm_interval_0_cfg", DPP_FIELD_FLAG_RW, 21, 22, 0xf, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_asm_interval_1_cfg_reg[] = + { + {"asm_interval_1_cfg", DPP_FIELD_FLAG_RW, 21, 22, 0x1f, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_asm_interval_2_cfg_reg[] = + { + {"asm_interval_2_cfg", DPP_FIELD_FLAG_RW, 21, 22, 0x2f, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_asm_interval_3_cfg_reg[] = + { + {"asm_interval_3_cfg", DPP_FIELD_FLAG_RW, 21, 22, 0x3f, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_asm_interval_4_cfg_reg[] = + { + {"asm_interval_4_cfg", DPP_FIELD_FLAG_RW, 21, 22, 0x4f, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_asm_interval_5cfg_reg[] = + { + {"asm_interval_5_cfg", DPP_FIELD_FLAG_RW, 21, 22, 0x5f, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_asm_interval_6_cfg_reg[] = + { + {"asm_interval_6_cfg", DPP_FIELD_FLAG_RW, 21, 22, 0x6f, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_asm_interval_7_cfg_reg[] = + { + {"asm_interval_7_cfg", DPP_FIELD_FLAG_RW, 21, 22, 0x7f, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_crdt_total_congest_mode_cfg_reg[] = + { + {"crdt_total_congest_mode_cfg", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_rci_fifo_ini_deep_cfg_reg[] = + { + {"rci_fifo_ini_deep_cfg", DPP_FIELD_FLAG_RW, 8, 9, 0x1f4, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_crdt_ecc_reg[] = + { + {"seinfo_wfq_single_ecc_err", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"seinfo_wfq_double_ecc_err", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"seinfo_fq_single_ecc_err", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"seinfo_fq_double_ecc_err", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"ecc_bypass", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_ucn_asm_rdy_shield_en_reg[] = + { + {"ucn_rdy_shield_en", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"asm_rdy_shield_en", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_ucn_asm_rdy_reg[] = + { + {"ucn_rdy", DPP_FIELD_FLAG_RO, 1, 1, 0x1, 0x0}, + {"asm_rdy", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_rci_grade_reg[] = + { + {"rci_grade", DPP_FIELD_FLAG_RO, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_crdt_rci_value_r_reg[] = + { + {"crdt_rci_value_r", DPP_FIELD_FLAG_RO, 11, 12, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_crdt_interval_now_reg[] = + { + {"crdt_interval_now", DPP_FIELD_FLAG_RO, 21, 22, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_crs_sheild_flow_id_cfg_reg[] = + { + {"crs_sheild_flow_id_cfg", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_crs_sheild_en_cfg_reg[] = + { + {"crs_sheild_en_cfg", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_crs_sheild_value_cfg_reg[] = + { + {"crs_sheild_value_cfg", DPP_FIELD_FLAG_RW, 1, 2, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_test_token_calc_ctrl_reg[] = + { + {"test_token_calc_state", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"test_token_calc_trigger", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_test_token_sample_cycle_num_reg[] = + { + {"sample_cycle_num", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_q_state_0_7_reg[] = + { + {"q_token_state_7", DPP_FIELD_FLAG_RO, 29, 2, 0x0, 0x0}, + {"q_token_state_6", DPP_FIELD_FLAG_RO, 25, 2, 0x0, 0x0}, + {"q_token_state_5", DPP_FIELD_FLAG_RO, 21, 2, 0x0, 0x0}, + {"q_token_state_4", DPP_FIELD_FLAG_RO, 17, 2, 0x0, 0x0}, + {"q_token_state_3", DPP_FIELD_FLAG_RO, 13, 2, 0x0, 0x0}, + {"q_token_state_2", DPP_FIELD_FLAG_RO, 9, 2, 0x0, 0x0}, + {"q_token_state_1", DPP_FIELD_FLAG_RO, 5, 2, 0x0, 0x0}, + {"q_token_state_0", DPP_FIELD_FLAG_RO, 1, 2, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_crdt_q_state_8_15_reg[] = + { + {"q_token_state_15", DPP_FIELD_FLAG_RO, 29, 2, 0x0, 0x0}, + {"q_token_state_14", DPP_FIELD_FLAG_RO, 25, 2, 0x0, 0x0}, + {"q_token_state_13", DPP_FIELD_FLAG_RO, 21, 2, 0x0, 0x0}, + {"q_token_state_12", DPP_FIELD_FLAG_RO, 17, 2, 0x0, 0x0}, + {"q_token_state_11", DPP_FIELD_FLAG_RO, 13, 2, 0x0, 0x0}, + {"q_token_state_10", DPP_FIELD_FLAG_RO, 9, 2, 0x0, 0x0}, + {"q_token_state_9", DPP_FIELD_FLAG_RO, 5, 2, 0x0, 0x0}, + {"q_token_state_8", DPP_FIELD_FLAG_RO, 1, 2, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_csw_csch_rd_cmd_cnt_reg[] = + { + {"csw_csch_rd_cmd_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_csw_csch_rd_sop_cnt_reg[] = + { + {"csw_csch_rd_sop_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_csw_csch_rd_eop_cnt_reg[] = + { + {"csw_csch_rd_eop_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_csw_csch_rd_drop_cnt_reg[] = + { + {"csw_csch_rd_drop_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_csch_mmu_rd_cmd_cnt_reg[] = + { + {"csch_mmu_rd_cmd_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_csch_mmu_rd_sop_cnt_reg[] = + { + {"csch_mmu_rd_sop_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_csch_mmu_rd_eop_cnt_reg[] = + { + {"csch_mmu_rd_eop_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_csch_mmu_rd_drop_cnt_reg[] = + { + {"csch_mmu_rd_drop_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qsch_crs_filter_reg[] = + { + {"qcfg_qsch_crs_filter", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qsch_crs_force_en_reg[] = + { + {"qcfg_qsch_crs_force_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qsch_crs_force_qnum_reg[] = + { + {"qcfg_qsch_crs_force_qnum", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qsch_crs_force_crs_reg[] = + { + {"qcfg_qsch_crs_force_crs", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_oshp_sgmii_shap_mode_reg[] = + { + {"cfgmt_oshp_sgmii_shap_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_qmu_sashap_en_reg[] = + { + {"cfgmt_qmu_sashap_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_sashap_token_max_reg[] = + { + {"cfgmt_sashap_token_max", DPP_FIELD_FLAG_RW, 31, 32, 0x2000, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_sashap_token_min_reg[] = + { + {"cfgmt_sashap_token_min", DPP_FIELD_FLAG_RW, 31, 32, 0xffffe000, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_q3lbaddrate_reg[] = + { + {"cfg_qsch_q3lbaddrate", DPP_FIELD_FLAG_RW, 27, 28, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_q012lbaddrate_reg[] = + { + {"cfg_qsch_q012lbaddrate", DPP_FIELD_FLAG_RW, 27, 28, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_q3creditlbmaxcnt_reg[] = + { + {"cfg_qsch_q3creditlbmaxcnt", DPP_FIELD_FLAG_RW, 7, 8, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_q012creditlbmaxcnt_reg[] = + { + {"cfg_qsch_q012creditlbmaxcnt", DPP_FIELD_FLAG_RW, 7, 8, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mul_token_gen_num_reg[] = + { + {"cfg_qsch_mul_token_gen_num", DPP_FIELD_FLAG_RW, 7, 8, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_q3_credit_lb_control_en_reg[] = + { + {"cfg_qsch_q3_credit_lb_control_en", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_q012_credit_lb_control_en_reg[] = + { + {"cfg_qsch_q012_credit_lb_control_en", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_sp_dwrr_en_reg[] = + { + {"cfg_qsch_sp_dwrr_en", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_q01_attach_en_reg[] = + { + {"cfg_qsch_q01_attach_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_w0_reg[] = + { + {"cfg_qsch_w0", DPP_FIELD_FLAG_RW, 6, 7, 0x10, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_w1_reg[] = + { + {"cfg_qsch_w1", DPP_FIELD_FLAG_RW, 6, 7, 0x20, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_w2_reg[] = + { + {"cfg_qsch_w2", DPP_FIELD_FLAG_RW, 6, 7, 0x40, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_lkybktmaxcnt1_reg[] = + { + {"cfg_qsch_lkybktmaxcnt1", DPP_FIELD_FLAG_RW, 31, 32, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_lkybktmaxcnt2_reg[] = + { + {"cfg_qsch_lkybktmaxcnt2", DPP_FIELD_FLAG_RW, 31, 32, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_lkybktdcrrate1_reg[] = + { + {"cfg_qsch_lkybktdcrrate1", DPP_FIELD_FLAG_RW, 31, 32, 0x80000020, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_lkybktdcrrate2_reg[] = + { + {"cfg_qsch_lkybktdcrrate2", DPP_FIELD_FLAG_RW, 31, 32, 0x80000010, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_lkybktdcrrate3_reg[] = + { + {"cfg_qsch_lkybktdcrrate3", DPP_FIELD_FLAG_RW, 31, 32, 0x80000004, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_lkybktmaxcnt3_reg[] = + { + {"cfg_qsch_lkybktmaxcnt3", DPP_FIELD_FLAG_RW, 31, 32, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_qmu_mul_auto_sa_version_reg[] = + { + {"cfg_qsch_qmu_mul_auto_sa_version", DPP_FIELD_FLAG_RW, 4, 5, 0x4, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_sa_credit_value_0_reg[] = + { + {"cfg_qsch_sa_credit_value_0", DPP_FIELD_FLAG_RW, 13, 14, 0x85, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_sa_credit_value_1_reg[] = + { + {"cfg_qsch_sa_credit_value_1", DPP_FIELD_FLAG_RW, 13, 14, 0x29a, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_sa_credit_value_2_reg[] = + { + {"cfg_qsch_sa_credit_value_2", DPP_FIELD_FLAG_RW, 13, 14, 0x190, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_sa_credit_value_3_reg[] = + { + {"cfg_qsch_sa_credit_value_3", DPP_FIELD_FLAG_RW, 13, 14, 0x4e2, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_sa_credit_value_4_reg[] = + { + {"cfg_qsch_sa_credit_value_4", DPP_FIELD_FLAG_RW, 13, 14, 0x5fe, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_sa_credit_value_5_reg[] = + { + {"cfg_qsch_sa_credit_value_5", DPP_FIELD_FLAG_RW, 13, 14, 0x8a0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_sa_credit_value_6_reg[] = + { + {"cfg_qsch_sa_credit_value_6", DPP_FIELD_FLAG_RW, 13, 14, 0x8a0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_sa_credit_value_7_reg[] = + { + {"cfg_qsch_sa_credit_value_7", DPP_FIELD_FLAG_RW, 13, 14, 0x8a0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_remote_credit_fifo_almost_full_th_reg[] = + { + {"cfg_qsch_remote_credit_fifo_almost_full_th", DPP_FIELD_FLAG_RW, 10, 11, 0x7ff, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_auto_credit_fifo_almost_full_th_reg[] = + { + {"cfg_qsch_auto_credit_fifo_almost_full_th", DPP_FIELD_FLAG_RW, 5, 6, 0x1c, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_q3_credit_fifo_almost_full_th_reg[] = + { + {"cfg_qsch_q3_credit_fifo_almost_full_th", DPP_FIELD_FLAG_RW, 5, 6, 0x1c, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_q012_credit_fifo_almost_full_th_reg[] = + { + {"cfg_qsch_q012_credit_fifo_almost_full_th", DPP_FIELD_FLAG_RW, 5, 6, 0x1c, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mul_fc_res_en_reg[] = + { + {"cfg_qsch_mul_fc_res_en", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_mul_ovf_udf_flg_query_reg[] = + { + {"qsch_cfg_remote_credit_fifo_full", DPP_FIELD_FLAG_RO, 18, 1, 0x0, 0x0}, + {"qsch_cfg_remote_credit_fifo_empty", DPP_FIELD_FLAG_RO, 17, 1, 0x1, 0x0}, + {"qsch_cfg_remote_credit_fifo_overflow", DPP_FIELD_FLAG_RO, 16, 1, 0x0, 0x0}, + {"qsch_cfg_remote_credit_fifo_underflow", DPP_FIELD_FLAG_RO, 15, 1, 0x0, 0x0}, + {"qsch_cfg_auto_credit_fifo_full", DPP_FIELD_FLAG_RO, 14, 1, 0x0, 0x0}, + {"qsch_cfg_auto_credit_fifo_empty", DPP_FIELD_FLAG_RO, 13, 1, 0x1, 0x0}, + {"qsch_cfg_auto_credit_fifo_overflow", DPP_FIELD_FLAG_RO, 12, 1, 0x0, 0x0}, + {"qsch_cfg_auto_credit_fifo_underflow", DPP_FIELD_FLAG_RO, 11, 1, 0x0, 0x0}, + {"qsch_cfg_q3_credit_fifo_full", DPP_FIELD_FLAG_RO, 10, 1, 0x0, 0x0}, + {"qsch_cfg_q3_credit_fifo_empty", DPP_FIELD_FLAG_RO, 9, 1, 0x1, 0x0}, + {"qsch_cfg_q3_credit_fifo_overflow", DPP_FIELD_FLAG_RO, 8, 1, 0x0, 0x0}, + {"qsch_cfg_q3_credit_fifo_underflow", DPP_FIELD_FLAG_RO, 7, 1, 0x0, 0x0}, + {"qsch_cfg_q012_credit_fifo_full", DPP_FIELD_FLAG_RO, 6, 1, 0x0, 0x0}, + {"qsch_cfg_q012_credit_fifo_empty", DPP_FIELD_FLAG_RO, 5, 1, 0x1, 0x0}, + {"qsch_cfg_q012_credit_fifo_overflow", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"qsch_cfg_q012_credit_fifo_underflow", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"qsch_cfg_lkybktoverflow1", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"qsch_cfg_lkybktoverflow2", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"qsch_cfg_lkybktoverflow3", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_mul_cng_flg_query_reg[] = + { + {"qsch_cfg_q3cngflag", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"qsch_cfg_q012cngflag", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"qsch_cfg_cngflag1", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"qsch_cfg_cngflag2", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"qsch_cfg_cngflag3", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qsch_cfg_lkybktval1_reg[] = + { + {"qsch_cfg_lkybktval1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qsch_cfg_lkybktval2_reg[] = + { + {"qsch_cfg_lkybktval2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qsch_cfg_lkybktval3_reg[] = + { + {"qsch_cfg_lkybktval3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qsch_cfg_q3lbval_reg[] = + { + {"qsch_cfg_q3lbval", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qsch_cfg_q012lbval_reg[] = + { + {"qsch_cfg_q012lbval", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qlist_cfgmt_ram_ecc_err2_reg[] = + { + {"qlist_imem_pd_ram_single_ecc_err", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"qlist_imem_pd_ram_double_ecc_err", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"qlist_imem_up_ptr_ram_single_ecc_err", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"qlist_imem_up_ptr_ram_double_ecc_err", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"qlist_imem_down_ptr_ram_single_ecc_err", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"qlist_imem_down_ptr_ram_double_ecc_err", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"cmdsw_sop_fifo_single_ecc_err", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"cmdsw_sop_fifo_double_ecc_err", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"cmdsw_nsop_fifo_single_ecc_err", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"cmdsw_nsop_fifo_double_ecc_err", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"cmdsw_mmudat_fifo_single_ecc_err", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"cmdsw_mmudat_fifo_double_ecc_err", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"qlist_rd_release_fwft_single_ecc_err", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"qlist_rd_release_fwft_double_ecc_err", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"qlist_drop_imem_fwft_single_ecc_err", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"qlist_drop_imem_fwft_double_ecc_err", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_csch_aged_cmd_cnt_reg[] = + { + {"csch_aged_cmd_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_csch_qcfg_csch_congest_cnt_reg[] = + { + {"csch_qcfg_csch_congest_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_csch_qcfg_qlist_csch_sop_cnt_reg[] = + { + {"csch_qcfg_qlist_csch_sop_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_csch_qcfg_qlist_csch_eop_cnt_reg[] = + { + {"csch_qcfg_qlist_csch_eop_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_csch_qcfg_csch_csw_sop_cnt_reg[] = + { + {"csch_qcfg_csch_csw_sop_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_csch_qcfg_csch_csw_eop_cnt_reg[] = + { + {"csch_qcfg_csch_csw_eop_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_csch_qcfg_qlist_csch_drop_cnt_reg[] = + { + {"csch_qcfg_qlist_csch_drop_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_csch_qcfg_csch_csw_drop_cnt_reg[] = + { + {"csch_qcfg_csch_csw_drop_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_csw_mmu_sop_cmd_cnt_reg[] = + { + {"csw_mmu_sop_cmd_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_mmu_csw_sop_data_cnt_reg[] = + { + {"mmu_csw_sop_data_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_csw_qsch_feedb_cnt_reg[] = + { + {"csw_qsch_feedb_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qmu_crdt_port_fc_cnt_reg[] = + { + {"qmu_crdt_port_fc_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_csch_r_block_cnt_reg[] = + { + {"csch_r_block_cnt", DPP_FIELD_FLAG_RO, 16, 17, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_qds_head_rd_reg[] = + { + {"qcfg_qlist_qds_head_rd", DPP_FIELD_FLAG_RO, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_qds_tail_rd_reg[] = + { + {"qcfg_qlist_qds_tail_rd", DPP_FIELD_FLAG_RO, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_ept_rd_reg[] = + { + {"qcfg_qlist_ept_rd", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_age_flag_rd_reg[] = + { + {"qcfg_qlist_age_flag_rd", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_cti_rd_reg[] = + { + {"qcfg_qlist_cti_rd", DPP_FIELD_FLAG_RO, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_cto_rd_reg[] = + { + {"qcfg_qlist_cto_rd", DPP_FIELD_FLAG_RO, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_chk_rd_reg[] = + { + {"qcfg_qlist_chk_rd", DPP_FIELD_FLAG_RO, 18, 19, 0x1, 0x1}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_nod_rd_reg[] = + { + {"qcfg_qlist_nod_rd", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_qlist_biu_rd_reg[] = + { + {"qcfg_qlist_biu_rd", DPP_FIELD_FLAG_RO, 4, 5, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qsch_r_wlist_flag_reg[] = + { + {"qsch_r_wlist_flag", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qcfg_crs_flg_rd_reg[] = + { + {"qcfg_crs_flg_rd", DPP_FIELD_FLAG_RO, 8, 9, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_qmu_imem_age_qds_reg[] = + { + {"cfgmt_qmu_imem_tp", DPP_FIELD_FLAG_RO, 30, 15, 0x0, 0x0}, + {"cfgmt_qmu_imem_hp", DPP_FIELD_FLAG_RO, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_qmu_imem_age_qlen_reg[] = + { + {"cfgmt_qmu_imem_no_empty", DPP_FIELD_FLAG_RO, 16, 1, 0x0, 0x0}, + {"cfgmt_qmu_imem_qlen", DPP_FIELD_FLAG_RO, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_qmu_imem_pd_ram_low_reg[] = + { + {"cfgmt_qmu_imem_pd_ram_low", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_qmu_imem_pd_ram_high_reg[] = + { + {"cfgmt_qmu_imem_pd_ram_high", DPP_FIELD_FLAG_RO, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_qmu_imem_up_ptr_reg[] = + { + {"cfgmt_qmu_imem_up_ptr", DPP_FIELD_FLAG_RO, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_qmu_imem_down_ptr_reg[] = + { + {"cfgmt_qmu_imem_down_ptr", DPP_FIELD_FLAG_RO, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfgmt_qmu_imem_age_flag_reg[] = + { + {"cfgmt_qmu_imem_age_flag", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_lkybkt2cngth_reg[] = + { + {"cfg_qsch_lkybkt2cngth", DPP_FIELD_FLAG_RW, 31, 32, 0x40, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_lkybkt1cngth_reg[] = + { + {"cfg_qsch_lkybkt1cngth", DPP_FIELD_FLAG_RW, 31, 32, 0x40, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_lkybkt3cngth_reg[] = + { + {"cfg_qsch_lkybkt3cngth", DPP_FIELD_FLAG_RW, 31, 32, 0x40, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_rm_mul_mcn1_credit_value_reg[] = + { + {"cfg_qsch_rm_mul_mcn1_credit_value", DPP_FIELD_FLAG_RW, 13, 14, 0x5fe, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_rm_mul_mcn2_credit_value_reg[] = + { + {"cfg_qsch_rm_mul_mcn2_credit_value", DPP_FIELD_FLAG_RW, 13, 14, 0x5fe, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_rm_mul_mcn3_credit_value_reg[] = + { + {"cfg_qsch_rm_mul_mcn3_credit_value", DPP_FIELD_FLAG_RW, 13, 14, 0x5fe, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn1_rand_ansr_seed_reg[] = + { + {"cfg_qsch_rm_mul_mcn1_rand_mchsm_en", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + {"cfg_qsch_rm_mul_mcn1_rand_ansr_seed", DPP_FIELD_FLAG_RW, 7, 8, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn2_rand_ansr_seed_reg[] = + { + {"cfg_qsch_rm_mul_mcn2_rand_mchsm_en", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + {"cfg_qsch_rm_mul_mcn2_rand_ansr_seed", DPP_FIELD_FLAG_RW, 7, 8, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn3_rand_ansr_seed_reg[] = + { + {"cfg_qsch_rm_mul_mcn3_rand_mchsm_en", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + {"cfg_qsch_rm_mul_mcn3_rand_ansr_seed", DPP_FIELD_FLAG_RW, 7, 8, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn1_rand_ansr_th_reg[] = + { + {"cfg_qsch_rm_mul_mcn1_rand_ansr_th", DPP_FIELD_FLAG_RW, 7, 8, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn2_rand_ansr_th_reg[] = + { + {"cfg_qsch_rm_mul_mcn2_rand_ansr_th", DPP_FIELD_FLAG_RW, 7, 8, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn3_rand_ansr_th_reg[] = + { + {"cfg_qsch_rm_mul_mcn3_rand_ansr_th", DPP_FIELD_FLAG_RW, 7, 8, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn1_rand_hold_base_reg[] = + { + {"cfg_qsch_rm_mul_mcn1_rand_mchsm_en", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"cfg_qsch_rm_mul_mcn1_rand_hold_base", DPP_FIELD_FLAG_RW, 23, 24, 0x1000, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn2_rand_hold_base_reg[] = + { + {"cfg_qsch_rm_mul_mcn2_rand_mchsm_en", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"cfg_qsch_rm_mul_mcn2_rand_hold_base", DPP_FIELD_FLAG_RW, 23, 24, 0x1000, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn3_rand_hold_base_reg[] = + { + {"cfg_qsch_rm_mul_mcn3_rand_mchsm_en", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"cfg_qsch_rm_mul_mcn3_rand_hold_base", DPP_FIELD_FLAG_RW, 23, 24, 0x1000, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn1_rand_sel_mask_reg[] = + { + {"cfg_qsch_rm_mul_mcn1_rand_sel_mask", DPP_FIELD_FLAG_RW, 8, 9, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn2_rand_sel_mask_reg[] = + { + {"cfg_qsch_rm_mul_mcn2_rand_sel_mask", DPP_FIELD_FLAG_RW, 8, 9, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn3_rand_sel_mask_reg[] = + { + {"cfg_qsch_rm_mul_mcn3_rand_sel_mask", DPP_FIELD_FLAG_RW, 8, 9, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn1_rand_sel_seed_reg0_reg[] = + { + {"rm_mul_mcn1_rand_sel_seed7", DPP_FIELD_FLAG_RW, 31, 4, 0x8, 0x0}, + {"rm_mul_mcn1_rand_sel_seed6", DPP_FIELD_FLAG_RW, 27, 4, 0x7, 0x0}, + {"rm_mul_mcn1_rand_sel_seed5", DPP_FIELD_FLAG_RW, 23, 4, 0x6, 0x0}, + {"rm_mul_mcn1_rand_sel_seed4", DPP_FIELD_FLAG_RW, 19, 4, 0x5, 0x0}, + {"rm_mul_mcn1_rand_sel_seed3", DPP_FIELD_FLAG_RW, 15, 4, 0x4, 0x0}, + {"rm_mul_mcn1_rand_sel_seed2", DPP_FIELD_FLAG_RW, 11, 4, 0x3, 0x0}, + {"rm_mul_mcn1_rand_sel_seed1", DPP_FIELD_FLAG_RW, 7, 4, 0x2, 0x0}, + {"rm_mul_mcn1_rand_sel_seed0", DPP_FIELD_FLAG_RW, 3, 4, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn1_rand_sel_seed_reg1_reg[] = + { + {"rm_mul_mcn1_rand_sel_seed8", DPP_FIELD_FLAG_RW, 3, 4, 0x9, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn2_rand_sel_seed_reg0_reg[] = + { + {"rm_mul_mcn2_rand_sel_seed7", DPP_FIELD_FLAG_RW, 31, 4, 0x8, 0x0}, + {"rm_mul_mcn2_rand_sel_seed6", DPP_FIELD_FLAG_RW, 27, 4, 0x7, 0x0}, + {"rm_mul_mcn2_rand_sel_seed5", DPP_FIELD_FLAG_RW, 23, 4, 0x6, 0x0}, + {"rm_mul_mcn2_rand_sel_seed4", DPP_FIELD_FLAG_RW, 19, 4, 0x5, 0x0}, + {"rm_mul_mcn2_rand_sel_seed3", DPP_FIELD_FLAG_RW, 15, 4, 0x4, 0x0}, + {"rm_mul_mcn2_rand_sel_seed2", DPP_FIELD_FLAG_RW, 11, 4, 0x3, 0x0}, + {"rm_mul_mcn2_rand_sel_seed1", DPP_FIELD_FLAG_RW, 7, 4, 0x2, 0x0}, + {"rm_mul_mcn2_rand_sel_seed0", DPP_FIELD_FLAG_RW, 3, 4, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn2_rand_sel_seed_reg1_reg[] = + { + {"rm_mul_mcn2_rand_sel_seed8", DPP_FIELD_FLAG_RW, 3, 4, 0x9, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn3_rand_sel_seed_reg0_reg[] = + { + {"rm_mul_mcn3_rand_sel_seed7", DPP_FIELD_FLAG_RW, 31, 4, 0x8, 0x0}, + {"rm_mul_mcn3_rand_sel_seed6", DPP_FIELD_FLAG_RW, 27, 4, 0x7, 0x0}, + {"rm_mul_mcn3_rand_sel_seed5", DPP_FIELD_FLAG_RW, 23, 4, 0x6, 0x0}, + {"rm_mul_mcn3_rand_sel_seed4", DPP_FIELD_FLAG_RW, 19, 4, 0x5, 0x0}, + {"rm_mul_mcn3_rand_sel_seed3", DPP_FIELD_FLAG_RW, 15, 4, 0x4, 0x0}, + {"rm_mul_mcn3_rand_sel_seed2", DPP_FIELD_FLAG_RW, 11, 4, 0x3, 0x0}, + {"rm_mul_mcn3_rand_sel_seed1", DPP_FIELD_FLAG_RW, 7, 4, 0x2, 0x0}, + {"rm_mul_mcn3_rand_sel_seed0", DPP_FIELD_FLAG_RW, 3, 4, 0x1, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn3_rand_sel_seed_reg1_reg[] = + { + {"rm_mul_mcn3_rand_sel_seed8", DPP_FIELD_FLAG_RW, 3, 4, 0x9, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn1_step_wait_th1_reg[] = + { + {"cfg_qsch_rm_mul_mcn1_step_wait_th1", DPP_FIELD_FLAG_RW, 15, 16, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn1_step_wait_th2_reg[] = + { + {"cfg_qsch_rm_mul_mcn1_step_wait_th2", DPP_FIELD_FLAG_RW, 15, 16, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn1_step_wait_th3_reg[] = + { + {"cfg_qsch_rm_mul_mcn1_step_wait_th3", DPP_FIELD_FLAG_RW, 15, 16, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn1_step_wait_th4_reg[] = + { + {"cfg_qsch_rm_mul_mcn1_step_wait_th4", DPP_FIELD_FLAG_RW, 15, 16, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn1_step_wait_th5_reg[] = + { + {"cfg_qsch_rm_mul_mcn1_step_wait_th5", DPP_FIELD_FLAG_RW, 15, 16, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn1_step_wait_th6_reg[] = + { + {"cfg_qsch_rm_mul_mcn1_step_wait_th6", DPP_FIELD_FLAG_RW, 15, 16, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn1_step_wait_th7_reg[] = + { + {"cfg_qsch_rm_mul_mcn1_step_wait_th7", DPP_FIELD_FLAG_RW, 15, 16, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn2_step_wait_th1_reg[] = + { + {"cfg_qsch_rm_mul_mcn2_step_wait_th1", DPP_FIELD_FLAG_RW, 15, 16, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn2_step_wait_th2_reg[] = + { + {"cfg_qsch_rm_mul_mcn2_step_wait_th2", DPP_FIELD_FLAG_RW, 15, 16, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn2_step_wait_th3_reg[] = + { + {"cfg_qsch_rm_mul_mcn2_step_wait_th3", DPP_FIELD_FLAG_RW, 15, 16, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn2_step_wait_th4_reg[] = + { + {"cfg_qsch_rm_mul_mcn2_step_wait_th4", DPP_FIELD_FLAG_RW, 15, 16, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn2_step_wait_th5_reg[] = + { + {"cfg_qsch_rm_mul_mcn2_step_wait_th5", DPP_FIELD_FLAG_RW, 15, 16, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn2_step_wait_th6_reg[] = + { + {"cfg_qsch_rm_mul_mcn2_step_wait_th6", DPP_FIELD_FLAG_RW, 15, 16, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn2_step_wait_th7_reg[] = + { + {"cfg_qsch_rm_mul_mcn2_step_wait_th7", DPP_FIELD_FLAG_RW, 15, 16, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn3_step_wait_th1_reg[] = + { + {"cfg_qsch_rm_mul_mcn3_step_wait_th1", DPP_FIELD_FLAG_RW, 15, 16, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn3_step_wait_th2_reg[] = + { + {"cfg_qsch_rm_mul_mcn3_step_wait_th2", DPP_FIELD_FLAG_RW, 15, 16, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn3_step_wait_th3_reg[] = + { + {"cfg_qsch_rm_mul_mcn3_step_wait_th3", DPP_FIELD_FLAG_RW, 15, 16, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn3_step_wait_th4_reg[] = + { + {"cfg_qsch_rm_mul_mcn3_step_wait_th4", DPP_FIELD_FLAG_RW, 15, 16, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn3_step_wait_th5_reg[] = + { + {"cfg_qsch_rm_mul_mcn3_step_wait_th5", DPP_FIELD_FLAG_RW, 15, 16, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn3_step_wait_th6_reg[] = + { + {"cfg_qsch_rm_mul_mcn3_step_wait_th6", DPP_FIELD_FLAG_RW, 15, 16, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_rm_mul_mcn3step_wait_th7_reg[] = + { + {"cfg_qsch_rm_mul_mcn3_step_wait_th7", DPP_FIELD_FLAG_RW, 15, 16, 0x80, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate0_reg[] = + { + {"cfg_qsch_mulcrdcntrate0", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate1_reg[] = + { + {"cfg_qsch_mulcrdcntrate1", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate2_reg[] = + { + {"cfg_qsch_mulcrdcntrate2", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate3_reg[] = + { + {"cfg_qsch_mulcrdcntrate3", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate4_reg[] = + { + {"cfg_qsch_mulcrdcntrate4", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate5_reg[] = + { + {"cfg_qsch_mulcrdcntrate5", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate6_reg[] = + { + {"cfg_qsch_mulcrdcntrate6", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate7_reg[] = + { + {"cfg_qsch_mulcrdcntrate7", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate8_reg[] = + { + {"cfg_qsch_mulcrdcntrate8", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate9_reg[] = + { + {"cfg_qsch_mulcrdcntrate9", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate10_reg[] = + { + {"cfg_qsch_mulcrdcntrate10", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate11_reg[] = + { + {"cfg_qsch_mulcrdcntrate11", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate12_reg[] = + { + {"cfg_qsch_mulcrdcntrate12", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate13_reg[] = + { + {"cfg_qsch_mulcrdcntrate13", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate14_reg[] = + { + {"cfg_qsch_mulcrdcntrate14", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate15_reg[] = + { + {"cfg_qsch_mulcrdcntrate15", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate16_reg[] = + { + {"cfg_qsch_mulcrdcntrate16", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate17_reg[] = + { + {"cfg_qsch_mulcrdcntrate17", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate18_reg[] = + { + {"cfg_qsch_mulcrdcntrate18", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate19_reg[] = + { + {"cfg_qsch_mulcrdcntrate19", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate20_reg[] = + { + {"cfg_qsch_mulcrdcntrate20", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate21_reg[] = + { + {"cfg_qsch_mulcrdcntrate21", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate22_reg[] = + { + {"cfg_qsch_mulcrdcntrate22", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate23_reg[] = + { + {"cfg_qsch_mulcrdcntrate23", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate24_reg[] = + { + {"cfg_qsch_mulcrdcntrate24", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate25_reg[] = + { + {"cfg_qsch_mulcrdcntrate25", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate26_reg[] = + { + {"cfg_qsch_mulcrdcntrate26", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate27_reg[] = + { + {"cfg_qsch_mulcrdcntrate27", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate28_reg[] = + { + {"cfg_qsch_mulcrdcntrate28", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate29_reg[] = + { + {"cfg_qsch_mulcrdcntrate29", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate30_reg[] = + { + {"cfg_qsch_mulcrdcntrate30", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate31_reg[] = + { + {"cfg_qsch_mulcrdcntrate31", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate32_reg[] = + { + {"cfg_qsch_mulcrdcntrate32", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate33_reg[] = + { + {"cfg_qsch_mulcrdcntrate33", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate34_reg[] = + { + {"cfg_qsch_mulcrdcntrate34", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate35_reg[] = + { + {"cfg_qsch_mulcrdcntrate35", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_mulcrdcntrate36_reg[] = + { + {"cfg_qsch_mulcrdcntrate36", DPP_FIELD_FLAG_RW, 19, 20, 0x100, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_rm_mul_mcn1_rand_hold_shift_reg[] = + { + {"cfg_qsch_rm_mul_mcn1_rand_hold_shift", DPP_FIELD_FLAG_RW, 2, 3, 0x7, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_rm_mul_mcn2_rand_hold_shift_reg[] = + { + {"cfg_qsch_rm_mul_mcn2_rand_hold_shift", DPP_FIELD_FLAG_RW, 2, 3, 0x7, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_cfg_qsch_rm_mul_mcn3_rand_hold_shift_reg[] = + { + {"cfg_qsch_rm_mul_mcn3_rand_hold_shift", DPP_FIELD_FLAG_RW, 2, 3, 0x7, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_last_drop_qnum_get_reg[] = + { + {"cgavd_qmu_drop_tap", DPP_FIELD_FLAG_RC, 31, 4, 0x0, 0x0}, + {"last_drop_qnum", DPP_FIELD_FLAG_RC, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_crdt_qmu_credit_cnt_reg[] = + { + {"crdt_qmu_credit_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qmu_to_qsch_report_cnt_reg[] = + { + {"qmu_to_qsch_report_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qmu_to_cgavd_report_cnt_reg[] = + { + {"qmu_to_cgavd_report_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qmu_crdt_crs_normal_cnt_reg[] = + { + {"qmu_crdt_crs_normal_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qmu_crdt_crs_off_cnt_reg[] = + { + {"qmu_crdt_crs_off_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qsch_qlist_shedule_cnt_reg[] = + { + {"qsch_qlist_shedule_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qsch_qlist_sch_ept_cnt_reg[] = + { + {"qsch_qlist_sch_ept_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qmu_to_mmu_blk_wr_cnt_reg[] = + { + {"qmu_to_mmu_blk_wr_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qmu_to_csw_blk_rd_cnt_reg[] = + { + {"qmu_to_csw_blk_rd_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qmu_to_mmu_sop_wr_cnt_reg[] = + { + {"qmu_to_mmu_sop_wr_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qmu_to_mmu_eop_wr_cnt_reg[] = + { + {"qmu_to_mmu_eop_wr_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qmu_to_mmu_drop_wr_cnt_reg[] = + { + {"qmu_to_mmu_drop_wr_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qmu_to_csw_sop_rd_cnt_reg[] = + { + {"qmu_to_csw_sop_rd_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qmu_to_csw_eop_rd_cnt_reg[] = + { + {"qmu_to_csw_eop_rd_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_qmu_to_csw_drop_rd_cnt_reg[] = + { + {"qmu_to_csw_drop_rd_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_mmu_to_qmu_wr_release_cnt_reg[] = + { + {"mmu_to_qmu_wr_release_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_mmu_to_qmu_rd_release_cnt_reg[] = + { + {"mmu_to_qmu_rd_release_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_observe_qnum_set_reg[] = + { + {"observe_qnum_set", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_q_pkt_received_reg[] = + { + {"spec_q_pkt_received", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_q_pkt_dropped_reg[] = + { + {"spec_q_pkt_dropped", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_q_pkt_scheduled_reg[] = + { + {"spec_q_pkt_scheduled", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_q_wr_cmd_sent_reg[] = + { + {"spec_q_wr_cmd_sent", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_q_rd_cmd_sent_reg[] = + { + {"spec_q_rd_cmd_sent", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_q_pkt_enq_reg[] = + { + {"spec_q_pkt_enq", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_q_pkt_deq_reg[] = + { + {"spec_q_pkt_deq", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_q_crdt_uncon_received_reg[] = + { + {"spec_q_crdt_uncon_received", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_q_crdt_cong_received_reg[] = + { + {"spec_q_crdt_cong_received", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_q_crs_normal_cnt_reg[] = + { + {"spec_q_crs_normal_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_q_crs_off_cnt_reg[] = + { + {"spec_q_crs_off_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_observe_batch_set_reg[] = + { + {"observe_batch_set", DPP_FIELD_FLAG_RW, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_bat_pkt_received_reg[] = + { + {"spec_bat_pkt_received", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_bat_pkt_dropped_reg[] = + { + {"spec_bat_pkt_dropped", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_bat_blk_scheduled_reg[] = + { + {"spec_bat_blk_scheduled", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_bat_wr_cmd_sent_reg[] = + { + {"spec_bat_wr_cmd_sent", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_bat_rd_cmd_sent_reg[] = + { + {"spec_bat_rd_cmd_sent", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_bat_pkt_enq_reg[] = + { + {"spec_bat_pkt_enq", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_bat_pkt_deq_reg[] = + { + {"spec_bat_pkt_deq", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_bat_crdt_uncon_received_reg[] = + { + {"spec_bat_crdt_uncon_received", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_bat_crdt_cong_received_reg[] = + { + {"spec_bat_crdt_cong_received", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_bat_crs_normal_cnt_reg[] = + { + {"spec_bat_crs_normal_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_bat_crs_off_cnt_reg[] = + { + {"spec_bat_crs_off_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_bcntm_ovfl_qnum_get_reg[] = + { + {"bcntm_ovfl_qnum_get", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_crbal_a_ovf_qnum_get_reg[] = + { + {"crbal_a_ovf_qnum_get", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_crbal_b_ovf_qnum_get_reg[] = + { + {"crbal_b_ovf_qnum_get", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_crbal_drop_qnum_get_reg[] = + { + {"crbal_drop_qnum_get", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_deq_flg_report_cnt_reg[] = + { + {"deq_flg_report_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_q_crs_get_reg[] = + { + {"spec_q_crs_get", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_q_crs_in_get_reg[] = + { + {"spec_q_crs_in_get", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_spec_q_crs_flg_csol_get_reg[] = + { + {"spec_q_crs_flg_csol_get", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_etm_qmu_ept_sch_qnum_get_reg[] = + { + {"ept_sch_qnum_get", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_pcie_ddr_switch_reg[] = + { + {"pcie_ddr_switch", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_user0_int_en_reg[] = + { + {"user_int_en", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_user0_int_mask_reg[] = + { + {"user_int_mask", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_user0_int_status_reg[] = + { + {"user_int_status", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_user1_int_en_reg[] = + { + {"user_int_en", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_user1_int_mask_reg[] = + { + {"user_int_mask", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_user1_int_status_reg[] = + { + {"user_int_status", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_user2_int_en_reg[] = + { + {"user_int_en", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_user2_int_mask_reg[] = + { + {"user_int_mask", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_user2_int_status_reg[] = + { + {"user_int_status", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_ecc_1b_int_en_reg[] = + { + {"ecc_1b_int_en", DPP_FIELD_FLAG_RW, 2, 3, 0xfffff, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_ecc_1b_int_mask_reg[] = + { + {"ecc_1b_int_mask", DPP_FIELD_FLAG_RW, 2, 3, 0xfffff, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_ecc_1b_int_status_reg[] = + { + {"ecc_1b_int_status", DPP_FIELD_FLAG_RC, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_ecc_2b_int_en_reg[] = + { + {"ecc_2b_int_en", DPP_FIELD_FLAG_RW, 2, 3, 0xfffff, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_ecc_2b_int_mask_reg[] = + { + {"ecc_2b_int_mask", DPP_FIELD_FLAG_RW, 2, 3, 0xfffff, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_ecc_2b_int_status_reg[] = + { + {"ecc_2b_int_status", DPP_FIELD_FLAG_RC, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_cfg_int_status_reg[] = + { + {"cfg_int_status", DPP_FIELD_FLAG_RC, 4, 5, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_i_core_to_cntl_reg[] = + { + {"i_core_to_cntl", DPP_FIELD_FLAG_RW, 15, 16, 0xaaaa, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_in_low_reg[] = + { + {"test_in_low", DPP_FIELD_FLAG_RW, 31, 32, 0x00004000, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_in_high_reg[] = + { + {"test_in_high", DPP_FIELD_FLAG_RW, 31, 32, 0x00000000, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_local_interrupt_out_reg[] = + { + {"local_interrupt_out", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_pl_ltssm_reg[] = + { + {"pl_ltssm", DPP_FIELD_FLAG_RO, 4, 5, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_out0_reg[] = + { + {"test_out0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_out1_reg[] = + { + {"test_out1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_out2_reg[] = + { + {"test_out2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_out3_reg[] = + { + {"test_out3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_out4_reg[] = + { + {"test_out4", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_out5_reg[] = + { + {"test_out5", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_out6_reg[] = + { + {"test_out6", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_out7_reg[] = + { + {"test_out7", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_sync_o_core_status_reg[] = + { + {"sync_o_core_status", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_sync_o_alert_dbe_reg[] = + { + {"sync_o_alert_dbe", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_sync_o_alert_sbe_reg[] = + { + {"sync_o_alert_sbe", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_sync_o_link_loopback_en_reg[] = + { + {"sync_o_link_loopback_en", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_sync_o_local_fs_lf_valid_reg[] = + { + {"sync_o_local_fs_lf_valid", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_sync_o_rx_idle_detect_reg[] = + { + {"sync_o_rx_idle_detect", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_sync_o_rx_rdy_reg[] = + { + {"sync_o_rx_rdy", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_sync_o_tx_rdy_reg[] = + { + {"sync_o_tx_rdy", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_pcie_link_up_cnt_reg[] = + { + {"pcie_link_up_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_out_pcie0_reg[] = + { + {"test_out_pcie0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_out_pcie1_reg[] = + { + {"test_out_pcie1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_out_pcie2_reg[] = + { + {"test_out_pcie2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_out_pcie3_reg[] = + { + {"test_out_pcie3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_out_pcie4_reg[] = + { + {"test_out_pcie4", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_out_pcie5_reg[] = + { + {"test_out_pcie5", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_out_pcie6_reg[] = + { + {"test_out_pcie6", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_out_pcie7_reg[] = + { + {"test_out_pcie7", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_out_pcie8_reg[] = + { + {"test_out_pcie8", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_out_pcie9_reg[] = + { + {"test_out_pcie9", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_out_pcie10_reg[] = + { + {"test_out_pcie10", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_out_pcie11_reg[] = + { + {"test_out_pcie11", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_out_pcie12_reg[] = + { + {"test_out_pcie12", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_out_pcie13_reg[] = + { + {"test_out_pcie13", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_out_pcie14_reg[] = + { + {"test_out_pcie14", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_test_out_pcie15_reg[] = + { + {"test_out_pcie15", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_int_repeat_en_reg[] = + { + {"int_repeat_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_awid_axi_mst_reg[] = + { + {"dbg_awid_axi_mst", DPP_FIELD_FLAG_RO, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_awaddr_axi_mst0_reg[] = + { + {"dbg_awaddr_axi_mst0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_awaddr_axi_mst1_reg[] = + { + {"dbg_awaddr_axi_mst1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_awlen_axi_mst_reg[] = + { + {"dbg_awlen_axi_mst", DPP_FIELD_FLAG_RO, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_awsize_axi_mst_reg[] = + { + {"dbg_awid_axi_mst", DPP_FIELD_FLAG_RO, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_awburst_axi_mst_reg[] = + { + {"dbg_awburst_axi_mst", DPP_FIELD_FLAG_RO, 1, 2, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_awlock_axi_mst_reg[] = + { + {"dbg_awlock_axi_mst", DPP_FIELD_FLAG_RO, 1, 2, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_awcache_axi_mst_reg[] = + { + {"dbg_awcache_axi_mst", DPP_FIELD_FLAG_RO, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_awprot_axi_mst_reg[] = + { + {"dbg_awprot_axi_mst", DPP_FIELD_FLAG_RO, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_wid_axi_mst_reg[] = + { + {"dbg_wid_axi_mst", DPP_FIELD_FLAG_RO, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_wdata_axi_mst0_reg[] = + { + {"dbg_wdata_axi_mst0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_wdata_axi_mst1_reg[] = + { + {"dbg_wdata_axi_mst1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_wdata_axi_mst2_reg[] = + { + {"dbg_wdata_axi_mst2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_wdata_axi_mst3_reg[] = + { + {"dbg_wdata_axi_mst3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_wstrb_axi_mst_reg[] = + { + {"dbg_wstrb_axi_mst", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_wlast_axi_mst_reg[] = + { + {"dbg_wlast_axi_mst", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_arid_axi_mst_reg[] = + { + {"dbg_arid_axi_mst", DPP_FIELD_FLAG_RO, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_araddr_axi_mst0_reg[] = + { + {"dbg_araddr_axi_mst0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_araddr_axi_mst1_reg[] = + { + {"dbg_araddr_axi_mst1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_arlen_axi_mst_reg[] = + { + {"dbg_arlen_axi_mst", DPP_FIELD_FLAG_RO, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_arsize_axi_mst_reg[] = + { + {"dbg_arsize_axi_mst", DPP_FIELD_FLAG_RO, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_arburst_axi_mst_reg[] = + { + {"dbg_arburst_axi_mst", DPP_FIELD_FLAG_RO, 1, 2, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_arlock_axi_mst_reg[] = + { + {"dbg_arlock_axi_mst", DPP_FIELD_FLAG_RO, 1, 2, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_arcache_axi_mst_reg[] = + { + {"dbg_arcache_axi_mst", DPP_FIELD_FLAG_RO, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_arprot_axi_mst_reg[] = + { + {"dbg_arprot_axi_mst", DPP_FIELD_FLAG_RO, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_rdata_axi_mst0_reg[] = + { + {"dbg_rdata_axi_mst0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_rdata_axi_mst1_reg[] = + { + {"dbg_rdata_axi_mst1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_rdata_axi_mst2_reg[] = + { + {"dbg_rdata_axi_mst2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_rdata_axi_mst3_reg[] = + { + {"dbg_rdata_axi_mst3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_axi_mst_state_reg[] = + { + {"axi_mst_state", DPP_FIELD_FLAG_RO, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_axi_cfg_state_reg[] = + { + {"axi_cfg_state", DPP_FIELD_FLAG_RO, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_axi_slv_rd_state_reg[] = + { + {"axi_slv_rd_state", DPP_FIELD_FLAG_RO, 1, 2, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_axi_slv_wr_state_reg[] = + { + {"axi_slv_wr_state", DPP_FIELD_FLAG_RO, 1, 2, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_axim_delay_en_reg[] = + { + {"axim_delay_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_axim_delay_reg[] = + { + {"axim_delay", DPP_FIELD_FLAG_RW, 31, 32, 0xff, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_axim_speed_wr_reg[] = + { + {"axim_speed_wr", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_axim_speed_rd_reg[] = + { + {"axim_speed_rd", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_awaddr_axi_slv0_reg[] = + { + {"dbg_awaddr_axi_slv0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_awaddr_axi_slv1_reg[] = + { + {"dbg_awaddr_axi_slv1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg0_wdata_axi_slv0_reg[] = + { + {"dbg0_wdata_axi_slv0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg0_wdata_axi_slv1_reg[] = + { + {"dbg0_wdata_axi_slv1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg0_wdata_axi_slv2_reg[] = + { + {"dbg0_wdata_axi_slv2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg0_wdata_axi_slv3_reg[] = + { + {"dbg0_wdata_axi_slv3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg1_wdata_axi_slv0_reg[] = + { + {"dbg1_wdata_axi_slv0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg1_wdata_axi_slv1_reg[] = + { + {"dbg1_wdata_axi_slv1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg1_wdata_axi_slv2_reg[] = + { + {"dbg1_wdata_axi_slv2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg1_wdata_axi_slv3_reg[] = + { + {"dbg1_wdata_axi_slv3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg2_wdata_axi_slv0_reg[] = + { + {"dbg2_wdata_axi_slv0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg2_wdata_axi_slv1_reg[] = + { + {"dbg2_wdata_axi_slv1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg2_wdata_axi_slv2_reg[] = + { + {"dbg2_wdata_axi_slv2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg2_wdata_axi_slv3_reg[] = + { + {"dbg2_wdata_axi_slv3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg3_wdata_axi_slv0_reg[] = + { + {"dbg3_wdata_axi_slv0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg3_wdata_axi_slv1_reg[] = + { + {"dbg3_wdata_axi_slv1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg3_wdata_axi_slv2_reg[] = + { + {"dbg3_wdata_axi_slv2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg3_wdata_axi_slv3_reg[] = + { + {"dbg3_wdata_axi_slv3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg4_wdata_axi_slv0_reg[] = + { + {"dbg4_wdata_axi_slv0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg4_wdata_axi_slv1_reg[] = + { + {"dbg4_wdata_axi_slv1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg4_wdata_axi_slv2_reg[] = + { + {"dbg4_wdata_axi_slv2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg4_wdata_axi_slv3_reg[] = + { + {"dbg4_wdata_axi_slv3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg5_wdata_axi_slv0_reg[] = + { + {"dbg5_wdata_axi_slv0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg5_wdata_axi_slv1_reg[] = + { + {"dbg5_wdata_axi_slv1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg5_wdata_axi_slv2_reg[] = + { + {"dbg5_wdata_axi_slv2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg5_wdata_axi_slv3_reg[] = + { + {"dbg5_wdata_axi_slv3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg6_wdata_axi_slv0_reg[] = + { + {"dbg6_wdata_axi_slv0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg6_wdata_axi_slv1_reg[] = + { + {"dbg6_wdata_axi_slv1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg6_wdata_axi_slv2_reg[] = + { + {"dbg6_wdata_axi_slv2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg6_wdata_axi_slv3_reg[] = + { + {"dbg6_wdata_axi_slv3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg7_wdata_axi_slv0_reg[] = + { + {"dbg7_wdata_axi_slv0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg7_wdata_axi_slv1_reg[] = + { + {"dbg7_wdata_axi_slv1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg7_wdata_axi_slv2_reg[] = + { + {"dbg7_wdata_axi_slv2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg7_wdata_axi_slv3_reg[] = + { + {"dbg7_wdata_axi_slv3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg8_wdata_axi_slv0_reg[] = + { + {"dbg8_wdata_axi_slv0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg8_wdata_axi_slv1_reg[] = + { + {"dbg8_wdata_axi_slv1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg8_wdata_axi_slv2_reg[] = + { + {"dbg8_wdata_axi_slv2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg8_wdata_axi_slv3_reg[] = + { + {"dbg8_wdata_axi_slv3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg9_wdata_axi_slv0_reg[] = + { + {"dbg9_wdata_axi_slv0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg9_wdata_axi_slv1_reg[] = + { + {"dbg9_wdata_axi_slv1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg9_wdata_axi_slv2_reg[] = + { + {"dbg9_wdata_axi_slv2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg9_wdata_axi_slv3_reg[] = + { + {"dbg9_wdata_axi_slv3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_awlen_axi_slv_reg[] = + { + {"dbg_awlen_axi_slv", DPP_FIELD_FLAG_RO, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_wlast_axi_slv_reg[] = + { + {"dbg_wlast_axi_slv", DPP_FIELD_FLAG_RO, 9, 10, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_araddr_axi_slv0_reg[] = + { + {"dbg5_wdata_axi_slv1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_araddr_axi_slv1_reg[] = + { + {"dbg5_wdata_axi_slv2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg0_rdata_axi_slv0_reg[] = + { + {"dbg5_wdata_axi_slv3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg0_rdata_axi_slv1_reg[] = + { + {"dbg6_wdata_axi_slv0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg0_rdata_axi_slv2_reg[] = + { + {"dbg6_wdata_axi_slv1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg0_rdata_axi_slv3_reg[] = + { + {"dbg6_wdata_axi_slv2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg1_rdata_axi_slv0_reg[] = + { + {"dbg6_wdata_axi_slv3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg1_rdata_axi_slv1_reg[] = + { + {"dbg7_wdata_axi_slv0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg1_rdata_axi_slv2_reg[] = + { + {"dbg7_wdata_axi_slv1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg1_rdata_axi_slv3_reg[] = + { + {"dbg7_wdata_axi_slv2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_pcie_dbg_rlast_axi_slv_reg[] = + { + {"dbg_rlast_axi_slv", DPP_FIELD_FLAG_RO, 1, 2, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_enable_reg[] = + { + {"dma_enable", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_up_req_reg[] = + { + {"up_req", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_up_current_state_reg[] = + { + {"dma_up_current_state", DPP_FIELD_FLAG_RO, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_up_req_ack_reg[] = + { + {"dma_up_req_ack", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_done_latch_reg[] = + { + {"done_latch", DPP_FIELD_FLAG_RO, 1, 2, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_up_cpu_addr_low32_reg[] = + { + {"dma_up_cpu_addr_low", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_up_cpu_addr_high32_reg[] = + { + {"dma_up_cpu_addr_high", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_up_se_addr_reg[] = + { + {"dma_up_se_addr", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_done_int_reg[] = + { + {"dma_done_int", DPP_FIELD_FLAG_RO, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_sp_cfg_reg[] = + { + {"sp_cfg", DPP_FIELD_FLAG_RW, 1, 2, 0x1, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_ing_reg[] = + { + {"dma_ing", DPP_FIELD_FLAG_RO, 1, 2, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_rd_timeout_thresh_reg[] = + { + {"rd_timeout_thresh", DPP_FIELD_FLAG_RW, 31, 32, 0x7d0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_tab_sta_up_fifo_gap_reg[] = + { + {"dma_tab_sta_up_fifo_gap", DPP_FIELD_FLAG_RW, 8, 9, 0xfa, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_cfg_mac_tim_reg[] = + { + {"cfg_mac_tim", DPP_FIELD_FLAG_RW, 31, 32, 0x50, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_cfg_mac_num_reg[] = + { + {"cfg_mac_num", DPP_FIELD_FLAG_RW, 8, 9, 0x28, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_init_bd_addr_reg[] = + { + {"init_bd_addr", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_mac_up_bd_addr1_low32_reg[] = + { + {"mac_up_bd_addr1_low32", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_mac_up_bd_addr1_high32_reg[] = + { + {"mac_up_bd_addr1_high32", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_mac_up_bd_addr2_low32_reg[] = + { + {"mac_up_bd_addr2_low32", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_mac_up_bd_addr2_high32_reg[] = + { + {"mac_up_bd_addr2_high32", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_cfg_mac_max_num_reg[] = + { + {"cfg_mac_max_num", DPP_FIELD_FLAG_RW, 8, 9, 0x1ff, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_wbuf_ff_empty_reg[] = + { + {"dma_wbuf_ff_empty", DPP_FIELD_FLAG_RO, 1, 2, 0x3, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_wbuf_state_reg[] = + { + {"dma_wbuf_state", DPP_FIELD_FLAG_RO, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_mac_bd_addr_low32_reg[] = + { + {"dma_mac_bd_addr_low32", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_mac_bd_addr_high32_reg[] = + { + {"dma_mac_bd_addr_high32", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_mac_up_enable_reg[] = + { + {"mac_up_enable", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_mac_endian_reg[] = + { + {"mac_endian", DPP_FIELD_FLAG_RW, 1, 2, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_up_endian_reg[] = + { + {"up_endian", DPP_FIELD_FLAG_RW, 1, 2, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_up_rd_cnt_latch_reg[] = + { + {"dma_up_rd_cnt_latch", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_up_rcv_cnt_latch_reg[] = + { + {"dma_up_rcv_cnt_latch", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_up_cnt_latch_reg[] = + { + {"dma_up_cnt_latch", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_cpu_rd_bd_pulse_reg[] = + { + {"cpu_rd_bd_pulse", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_cpu_bd_threshold_reg[] = + { + {"cpu_bd_threshold", DPP_FIELD_FLAG_RW, 31, 32, 0x64, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_cpu_bd_used_cnt_reg[] = + { + {"cpu_bd_used_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_up_rcv_status_reg[] = + { + {"dma_up_rcv_status", DPP_FIELD_FLAG_RO, 31, 32, 0x1, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_slv_rid_err_en_reg[] = + { + {"slv_rid_err_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_slv_rresp_err_en_reg[] = + { + {"slv_rresp_err_en", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_se_rdbk_ff_full_reg[] = + { + {"se_rdbk_ff_full", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_up_data_count_reg[] = + { + {"dma_up_data_count", DPP_FIELD_FLAG_RO, 9, 10, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_mwr_fifo_afull_gap_reg[] = + { + {"dma_mwr_fifo_afull_gap", DPP_FIELD_FLAG_RW, 5, 6, 0x14, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_info_fifo_afull_gap_reg[] = + { + {"dma_mwr_fifo_afull_gap", DPP_FIELD_FLAG_RW, 5, 6, 0x10, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_rd_timeout_set_reg[] = + { + {"dma_rd_timeout_set", DPP_FIELD_FLAG_RW, 31, 32, 0x3ffffff, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_bd_dat_err_en_reg[] = + { + {"dma_bd_dat_err_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_repeat_cnt_reg[] = + { + {"dma_repeat_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_rd_timeout_en_reg[] = + { + {"dma_rd_timeout_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_repeat_read_reg[] = + { + {"dma_repeat_read", DPP_FIELD_FLAG_RW, 31, 32, 0xa, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_repeat_read_en_reg[] = + { + {"dma_repeat_read_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_bd_ctl_state_reg[] = + { + {"bd_ctl_state", DPP_FIELD_FLAG_RO, 1, 2, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_done_int_cnt_wr_reg[] = + { + {"dma_done_int_cnt_wr", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_done_int_cnt_mac_reg[] = + { + {"dma_done_int_cnt_mac", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_current_mac_num_reg[] = + { + {"current_mac_num", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_cfg_mac_afifo_afull_reg[] = + { + {"cfg_mac_afifo_afull", DPP_FIELD_FLAG_RW, 8, 9, 0xc8, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_dma_mac_ff_full_reg[] = + { + {"dma_mac_ff_full", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_dma_user_axi_mst_reg[] = + { + {"user_en", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + {"cfg_epid", DPP_FIELD_FLAG_RW, 27, 4, 0x0, 0x0}, + {"cfg_vfunc_num", DPP_FIELD_FLAG_RW, 23, 8, 0x0, 0x0}, + {"cfg_func_num", DPP_FIELD_FLAG_RW, 7, 3, 0x0, 0x0}, + {"cfg_vfunc_active", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_sbus_state_reg[] = + { + {"sbus_state", DPP_FIELD_FLAG_RO, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_en_reg[] = + { + {"mst_debug_en", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_sbus_command_sel_reg[] = + { + {"sbus_command_sel", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_soc_rd_time_out_thresh_reg[] = + { + {"soc_rd_time_out_thresh", DPP_FIELD_FLAG_RW, 31, 32, 0x2710, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_big_little_byte_order_reg[] = + { + {"big_little_byte_order", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_ecc_bypass_read_reg[] = + { + {"ecc_bypass_read", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_ahb_async_wr_fifo_afull_gap_reg[] = + { + {"ahb_async_wr_fifo_afull_gap", DPP_FIELD_FLAG_RW, 5, 6, 0x18, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_ahb_async_rd_fifo_afull_gap_reg[] = + { + {"ahb_async_rd_fifo_afull_gap", DPP_FIELD_FLAG_RW, 4, 5, 0xc, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_ahb_async_cpl_fifo_afull_gap_reg[] = + { + {"ahb_async_cpl_fifo_afull_gap", DPP_FIELD_FLAG_RW, 4, 5, 0xc, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data0_high26_reg[] = + { + {"mst_debug_data0_high26", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data0_low32_reg[] = + { + {"mst_debug_data0_low32", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data1_high26_reg[] = + { + {"mst_debug_data1_high26", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data1_low32_reg[] = + { + {"mst_debug_data1_low32", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data2_high26_reg[] = + { + {"mst_debug_data2_high26", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data2_low32_reg[] = + { + {"mst_debug_data2_low32", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data3_high26_reg[] = + { + {"mst_debug_data3_high26", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data3_low32_reg[] = + { + {"mst_debug_data3_low32", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data4_high26_reg[] = + { + {"mst_debug_data4_high26", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data4_low32_reg[] = + { + {"mst_debug_data4_low32", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data5_high26_reg[] = + { + {"mst_debug_data5_high26", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data5_low32_reg[] = + { + {"mst_debug_data5_low32", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data6_high26_reg[] = + { + {"mst_debug_data6_high26", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data6_low32_reg[] = + { + {"mst_debug_data6_low32", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data7_high26_reg[] = + { + {"mst_debug_data7_high26", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data7_low32_reg[] = + { + {"mst_debug_data7_low32", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data8_high26_reg[] = + { + {"mst_debug_data8_high26", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data8_low32_reg[] = + { + {"mst_debug_data8_low32", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data9_high26_reg[] = + { + {"mst_debug_data9_high26", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data9_low32_reg[] = + { + {"mst_debug_data9_low32", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data10_high26_reg[] = + { + {"mst_debug_data10_high26", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data10_low32_reg[] = + { + {"mst_debug_data10_low32", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data11_high26_reg[] = + { + {"mst_debug_data11_high26", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data11_low32_reg[] = + { + {"mst_debug_data11_low32", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data12_high26_reg[] = + { + {"mst_debug_data12_high26", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data12_low32_reg[] = + { + {"mst_debug_data12_low32", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data13_high26_reg[] = + { + {"mst_debug_data13_high26", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data13_low32_reg[] = + { + {"mst_debug_data13_low32", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data14_high26_reg[] = + { + {"mst_debug_data14_high26", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data14_low32_reg[] = + { + {"mst_debug_data14_low32", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data15_high26_reg[] = + { + {"mst_debug_data15_high26", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_cfg_csr_mst_debug_data15_low32_reg[] = + { + {"mst_debug_data15_low32", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_ind_access_states_reg[] = + { + {"ind_access_done", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_ind_access_cmd0_reg[] = + { + {"wr_mode", DPP_FIELD_FLAG_RW, 29, 1, 0x0, 0x0}, + {"rd_or_wr", DPP_FIELD_FLAG_RW, 28, 1, 0x0, 0x0}, + {"ind_access_addr0", DPP_FIELD_FLAG_RW, 16, 17, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_ind_access_data0_reg[] = + { + {"ind_access_data0", DPP_FIELD_FLAG_RW, 20, 21, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_ind_access_data1_reg[] = + { + {"ind_access_data1", DPP_FIELD_FLAG_RW, 20, 21, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_ind_access_cmd1_reg[] = + { + {"ind_access_addr1", DPP_FIELD_FLAG_RW, 16, 17, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_init_done_reg[] = + { + {"mr_init_done", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_cnt_mode_reg_reg[] = + { + {"cfgmt_count_rd_mode", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"cfgmt_count_overflow_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_cfg_ecc_bypass_read_reg[] = + { + {"cfg_ecc_bypass_read", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_cfg_rep_mod_reg[] = + { + {"cfg_rep_mod", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_block_ptr_fifo_aful_th_reg[] = + { + {"block_ptr3_fifo_aful_th", DPP_FIELD_FLAG_RW, 31, 8, 0xa0, 0x0}, + {"block_ptr2_fifo_aful_th", DPP_FIELD_FLAG_RW, 23, 8, 0xa0, 0x0}, + {"block_ptr1_fifo_aful_th", DPP_FIELD_FLAG_RW, 15, 8, 0xa0, 0x0}, + {"block_ptr0_fifo_aful_th", DPP_FIELD_FLAG_RW, 7, 8, 0xa0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_pre_rcv_ptr_fifo_aful_th_reg[] = + { + {"pre_rcv_ptr3_fifo_aful_th", DPP_FIELD_FLAG_RW, 31, 8, 0xa0, 0x0}, + {"pre_rcv_ptr2_fifo_aful_th", DPP_FIELD_FLAG_RW, 23, 8, 0xa0, 0x0}, + {"pre_rcv_ptr1_fifo_aful_th", DPP_FIELD_FLAG_RW, 15, 8, 0xa0, 0x0}, + {"pre_rcv_ptr0_fifo_aful_th", DPP_FIELD_FLAG_RW, 7, 8, 0xa0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mgid_fifo_aful_th_reg[] = + { + {"mgid3_fifo_aful_th", DPP_FIELD_FLAG_RW, 31, 8, 0xa0, 0x0}, + {"mgid2_fifo_aful_th", DPP_FIELD_FLAG_RW, 23, 8, 0xa0, 0x0}, + {"mgid1_fifo_aful_th", DPP_FIELD_FLAG_RW, 15, 8, 0xa0, 0x0}, + {"mgid0_fifo_aful_th", DPP_FIELD_FLAG_RW, 7, 8, 0xa0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_rep_cmd_fifo_aful_th_reg[] = + { + {"rep_cmd3_fifo_aful_th", DPP_FIELD_FLAG_RW, 31, 8, 0x14, 0x0}, + {"rep_cmd2_fifo_aful_th", DPP_FIELD_FLAG_RW, 23, 8, 0x14, 0x0}, + {"rep_cmd1_fifo_aful_th", DPP_FIELD_FLAG_RW, 15, 8, 0x14, 0x0}, + {"rep_cmd0_fifo_aful_th", DPP_FIELD_FLAG_RW, 7, 8, 0x14, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_int_mask_1_reg[] = + { + {"free_ptr0_fifo_full_mask", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"free_ptr1_fifo_full_mask", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"free_ptr2_fifo_full_mask", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"free_ptr3_fifo_full_mask", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"block_ptr0_fifo_full_mask", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"block_ptr1_fifo_full_mask", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"block_ptr2_fifo_full_mask", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"block_ptr3_fifo_full_mask", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"mgid0_fifo_full_mask", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"mgid1_fifo_full_mask", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"mgid2_fifo_full_mask", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"mgid3_fifo_full_mask", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"pre_rcv_ptr0_fifo_full_mask", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"pre_rcv_ptr1_fifo_full_mask", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"pre_rcv_ptr2_fifo_full_mask", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"pre_rcv_ptr3_fifo_full_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"rep_cmd0_fifo_full_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"rep_cmd1_fifo_full_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"rep_cmd2_fifo_full_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"rep_cmd3_fifo_full_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_int_mask_2_reg[] = + { + {"free_ptr0_fifo_udf_mask", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"free_ptr1_fifo_udf_mask", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"free_ptr2_fifo_udf_mask", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"free_ptr3_fifo_udf_mask", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"block_ptr0_fifo_udf_mask", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"block_ptr1_fifo_udf_mask", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"block_ptr2_fifo_udf_mask", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"block_ptr3_fifo_udf_mask", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"mgid0_fifo_udf_mask", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"mgid1_fifo_udf_mask", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"mgid2_fifo_udf_mask", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"mgid3_fifo_udf_mask", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"pre_rcv_ptr0_fifo_udf_mask", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"pre_rcv_ptr1_fifo_udf_mask", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"pre_rcv_ptr2_fifo_udf_mask", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"pre_rcv_ptr3_fifo_udf_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"rep_cmd0_fifo_udf_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"rep_cmd1_fifo_udf_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"rep_cmd2_fifo_udf_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"rep_cmd3_fifo_udf_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_int_mask_3_reg[] = + { + {"free_ptr0_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"free_ptr1_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"free_ptr2_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"free_ptr3_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"block_ptr0_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"block_ptr1_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"block_ptr2_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"block_ptr3_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"mgid0_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"mgid1_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"mgid2_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"mgid3_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"pre_rcv_ptr0_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"pre_rcv_ptr1_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"pre_rcv_ptr2_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"pre_rcv_ptr3_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"rep_cmd0_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"rep_cmd1_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"rep_cmd2_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"rep_cmd3_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_int_mask_4_reg[] = + { + {"data_buf0_ram_parity_err_mask", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"data_buf1_ram_parity_err_mask", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"data_buf2_ram_parity_err_mask", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"data_buf3_ram_parity_err_mask", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"mlt_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"free_ptr0_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"free_ptr1_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"free_ptr2_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"free_ptr3_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"block_ptr0_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"block_ptr1_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"block_ptr2_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"block_ptr3_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"mgid0_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"mgid1_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"mgid2_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"mgid3_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"pre_rcv_ptr0_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"pre_rcv_ptr1_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"pre_rcv_ptr2_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"pre_rcv_ptr3_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"rep_cmd0_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"rep_cmd1_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"rep_cmd2_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"rep_cmd3_fifo_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_states_1_reg[] = + { + {"free_ptr0_fifo_full", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"free_ptr1_fifo_full", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"free_ptr2_fifo_full", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"free_ptr3_fifo_full", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"block_ptr0_fifo_full", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"block_ptr1_fifo_full", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"block_ptr2_fifo_full", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"block_ptr3_fifo_full", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"mgid0_fifo_full", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"mgid1_fifo_full", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"mgid2_fifo_full", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"mgid3_fifo_full", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"pre_rcv_ptr0_fifo_full", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"pre_rcv_ptr1_fifo_full", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"pre_rcv_ptr2_fifo_full", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"pre_rcv_ptr3_fifo_full", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"rep_cmd0_fifo_full", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"rep_cmd1_fifo_full", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"rep_cmd2_fifo_full", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"rep_cmd3_fifo_full", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_states_2_reg[] = + { + {"free_ptr0_fifo_udf", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"free_ptr1_fifo_udf", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"free_ptr2_fifo_udf", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"free_ptr3_fifo_udf", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"block_ptr0_fifo_udf", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"block_ptr1_fifo_udf", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"block_ptr2_fifo_udf", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"block_ptr3_fifo_udf", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"mgid0_fifo_udf", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"mgid1_fifo_udf", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"mgid2_fifo_udf", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"mgid3_fifo_udf", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"pre_rcv_ptr0_fifo_udf", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"pre_rcv_ptr1_fifo_udf", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"pre_rcv_ptr2_fifo_udf", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"pre_rcv_ptr3_fifo_udf", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"rep_cmd0_fifo_udf", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"rep_cmd1_fifo_udf", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"rep_cmd2_fifo_udf", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"rep_cmd3_fifo_udf", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_states_3_reg[] = + { + {"free_ptr0_fifo_ovf", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"free_ptr1_fifo_ovf", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"free_ptr2_fifo_ovf", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"free_ptr3_fifo_ovf", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"block_ptr0_fifo_ovf", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"block_ptr1_fifo_ovf", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"block_ptr2_fifo_ovf", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"block_ptr3_fifo_ovf", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"mgid0_fifo_ovf", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"mgid1_fifo_ovf", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"mgid2_fifo_ovf", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"mgid3_fifo_ovf", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"pre_rcv_ptr0_fifo_ovf", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"pre_rcv_ptr1_fifo_ovf", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"pre_rcv_ptr2_fifo_ovf", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"pre_rcv_ptr3_fifo_ovf", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"rep_cmd0_fifo_ovf", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"rep_cmd1_fifo_ovf", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"rep_cmd2_fifo_ovf", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"rep_cmd3_fifo_ovf", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_states_4_reg[] = + { + {"data_buf0_ram_parity_err", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"data_buf1_ram_parity_err", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"data_buf2_ram_parity_err", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"data_buf3_ram_parity_err", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"mlt_ecc_single_err", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"free_ptr0_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"free_ptr1_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"free_ptr2_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"free_ptr3_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"block_ptr0_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"block_ptr1_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"block_ptr2_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"block_ptr3_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"mgid0_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"mgid1_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"mgid2_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"mgid3_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"pre_rcv_ptr0_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"pre_rcv_ptr1_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"pre_rcv_ptr2_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"pre_rcv_ptr3_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"rep_cmd0_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"rep_cmd1_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"rep_cmd2_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"rep_cmd3_fifo_ecc_single_err", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_states_5_reg[] = + { + {"mlt_ecc_double_err", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"free_ptr0_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"free_ptr1_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"free_ptr2_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"free_ptr3_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"block_ptr0_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"block_ptr1_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"block_ptr2_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"block_ptr3_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"mgid0_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"mgid1_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"mgid2_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"mgid3_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"pre_rcv_ptr0_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"pre_rcv_ptr1_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"pre_rcv_ptr2_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"pre_rcv_ptr3_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"rep_cmd0_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"rep_cmd1_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"rep_cmd2_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"rep_cmd3_fifo_ecc_double_err", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_states_6_reg[] = + { + {"free_ptr0_fifo_empty", DPP_FIELD_FLAG_RO, 19, 1, 0x1, 0x0}, + {"free_ptr1_fifo_empty", DPP_FIELD_FLAG_RO, 18, 1, 0x1, 0x0}, + {"free_ptr2_fifo_empty", DPP_FIELD_FLAG_RO, 17, 1, 0x1, 0x0}, + {"free_ptr3_fifo_empty", DPP_FIELD_FLAG_RO, 16, 1, 0x1, 0x0}, + {"block_ptr0_fifo_empty", DPP_FIELD_FLAG_RO, 15, 1, 0x1, 0x0}, + {"block_ptr1_fifo_empty", DPP_FIELD_FLAG_RO, 14, 1, 0x1, 0x0}, + {"block_ptr2_fifo_empty", DPP_FIELD_FLAG_RO, 13, 1, 0x1, 0x0}, + {"block_ptr3_fifo_empty", DPP_FIELD_FLAG_RO, 12, 1, 0x1, 0x0}, + {"mgid0_fifo_empty", DPP_FIELD_FLAG_RO, 11, 1, 0x1, 0x0}, + {"mgid1_fifo_empty", DPP_FIELD_FLAG_RO, 10, 1, 0x1, 0x0}, + {"mgid2_fifo_empty", DPP_FIELD_FLAG_RO, 9, 1, 0x1, 0x0}, + {"mgid3_fifo_empty", DPP_FIELD_FLAG_RO, 8, 1, 0x1, 0x0}, + {"pre_rcv_ptr0_fifo_empty", DPP_FIELD_FLAG_RO, 7, 1, 0x1, 0x0}, + {"pre_rcv_ptr1_fifo_empty", DPP_FIELD_FLAG_RO, 6, 1, 0x1, 0x0}, + {"pre_rcv_ptr2_fifo_empty", DPP_FIELD_FLAG_RO, 5, 1, 0x1, 0x0}, + {"pre_rcv_ptr3_fifo_empty", DPP_FIELD_FLAG_RO, 4, 1, 0x1, 0x0}, + {"rep_cmd0_fifo_empty", DPP_FIELD_FLAG_RO, 3, 1, 0x1, 0x0}, + {"rep_cmd1_fifo_empty", DPP_FIELD_FLAG_RO, 2, 1, 0x1, 0x0}, + {"rep_cmd2_fifo_empty", DPP_FIELD_FLAG_RO, 1, 1, 0x1, 0x0}, + {"rep_cmd3_fifo_empty", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_states_7_reg[] = + { + {"cos0_is_rep_busy", DPP_FIELD_FLAG_RO, 21, 1, 0x0, 0x0}, + {"cos1_is_rep_busy", DPP_FIELD_FLAG_RO, 20, 1, 0x0, 0x0}, + {"cos2_is_rep_busy", DPP_FIELD_FLAG_RO, 19, 1, 0x0, 0x0}, + {"cos3_is_rep_busy", DPP_FIELD_FLAG_RO, 18, 1, 0x0, 0x0}, + {"block_ptr0_fifo_non_sop_ren_rdy", DPP_FIELD_FLAG_RO, 17, 1, 0x0, 0x0}, + {"block_ptr1_fifo_non_sop_ren_rdy", DPP_FIELD_FLAG_RO, 16, 1, 0x0, 0x0}, + {"block_ptr2_fifo_non_sop_ren_rdy", DPP_FIELD_FLAG_RO, 15, 1, 0x0, 0x0}, + {"block_ptr3_fifo_non_sop_ren_rdy", DPP_FIELD_FLAG_RO, 14, 1, 0x0, 0x0}, + {"pre_rcv_ptr0_fifo_non_sop_ren_rdy", DPP_FIELD_FLAG_RO, 13, 1, 0x0, 0x0}, + {"pre_rcv_ptr1_fifo_non_sop_ren_rdy", DPP_FIELD_FLAG_RO, 12, 1, 0x0, 0x0}, + {"pre_rcv_ptr2_fifo_non_sop_ren_rdy", DPP_FIELD_FLAG_RO, 11, 1, 0x0, 0x0}, + {"pre_rcv_ptr3_fifo_non_sop_ren_rdy", DPP_FIELD_FLAG_RO, 10, 1, 0x0, 0x0}, + {"port_shap_rdy", DPP_FIELD_FLAG_RO, 9, 1, 0x1, 0x0}, + {"mr_lif_group0_rdy_3", DPP_FIELD_FLAG_RO, 8, 1, 0x1, 0x0}, + {"mr_lif_group0_rdy_2", DPP_FIELD_FLAG_RO, 7, 1, 0x1, 0x0}, + {"mr_lif_group0_rdy_1", DPP_FIELD_FLAG_RO, 6, 1, 0x1, 0x0}, + {"mr_lif_group0_rdy_0", DPP_FIELD_FLAG_RO, 5, 1, 0x1, 0x0}, + {"pktrx_pfc_rdy_3", DPP_FIELD_FLAG_RO, 4, 1, 0x1, 0x0}, + {"pktrx_pfc_rdy_2", DPP_FIELD_FLAG_RO, 3, 1, 0x1, 0x0}, + {"pktrx_pfc_rdy_1", DPP_FIELD_FLAG_RO, 2, 1, 0x1, 0x0}, + {"pktrx_pfc_rdy_0", DPP_FIELD_FLAG_RO, 1, 1, 0x1, 0x0}, + {"pktrx_link_rdy", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_states_8_reg[] = + { + {"mr_head", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_sop_in_cnt_reg[] = + { + {"mr_sop_in_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_eop_in_cnt_reg[] = + { + {"mr_eop_in_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_sop_out_cnt_reg[] = + { + {"mr_sop_out_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_eop_out_cnt_reg[] = + { + {"mr_eop_out_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos0_in_cnt_reg[] = + { + {"mr_cos0_in_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos1_in_cnt_reg[] = + { + {"mr_cos1_in_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos2_in_cnt_reg[] = + { + {"mr_cos2_in_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos3_in_cnt_reg[] = + { + {"mr_cos3_in_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos0_out_cnt_reg[] = + { + {"mr_cos0_out_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos1_out_cnt_reg[] = + { + {"mr_cos1_out_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos2_out_cnt_reg[] = + { + {"mr_cos2_out_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos3_out_cnt_reg[] = + { + {"mr_cos3_out_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_err_in_cnt_reg[] = + { + {"mr_err_in_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos0_sop_in_cnt_reg[] = + { + {"mr_cos0_sop_in_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos0_eop_in_cnt_reg[] = + { + {"mr_cos0_eop_in_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos1_sop_in_cnt_reg[] = + { + {"mr_cos1_sop_in_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos1_eop_in_cnt_reg[] = + { + {"mr_cos1_eop_in_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos2_sop_in_cnt_reg[] = + { + {"mr_cos2_sop_in_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos2_eop_in_cnt_reg[] = + { + {"mr_cos2_eop_in_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos3_sop_in_cnt_reg[] = + { + {"mr_cos3_sop_in_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos3_eop_in_cnt_reg[] = + { + {"mr_cos3_eop_in_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos0_in_err_cnt_reg[] = + { + {"mr_cos0_in_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos1_in_err_cnt_reg[] = + { + {"mr_cos1_in_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos2_in_err_cnt_reg[] = + { + {"mr_cos2_in_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos3_in_err_cnt_reg[] = + { + {"mr_cos3_in_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos0_sop_out_cnt_reg[] = + { + {"mr_cos0_sop_out_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos0_eop_out_cnt_reg[] = + { + {"mr_cos0_eop_out_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos1_sop_out_cnt_reg[] = + { + {"mr_cos1_sop_out_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos1_eop_out_cnt_reg[] = + { + {"mr_cos1_eop_out_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos2_sop_out_cnt_reg[] = + { + {"mr_cos2_sop_out_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos2_eop_out_cnt_reg[] = + { + {"mr_cos2_eop_out_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos3_sop_out_cnt_reg[] = + { + {"mr_cos3_sop_out_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_cos3_eop_out_cnt_reg[] = + { + {"mr_cos3_eop_out_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_mlt_unvld_cnt_reg[] = + { + {"mr_mlt_unvld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_sop_eop_match_cfg_reg[] = + { + {"mr_sop_eop_macth_en", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"mr_sop_eop_macth_dicard_th", DPP_FIELD_FLAG_RW, 7, 8, 0xbc, 0x0}, + }; +DPP_FIELD_T g_nppu_mr_cfg_mr_mlt_unvld_mgid_reg[] = + { + {"mr_mlt_unvld_mgid", DPP_FIELD_FLAG_RO, 16, 17, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_isch_fifo_th_1_reg[] = + { + {"cfg_sch_fifo7_fc_th", DPP_FIELD_FLAG_RW, 29, 6, 0x30, 0x0}, + {"cfg_sch_fifo6_fc_th", DPP_FIELD_FLAG_RW, 21, 6, 0x30, 0x0}, + {"cfg_sch_fifo5_fc_th", DPP_FIELD_FLAG_RW, 13, 6, 0x30, 0x0}, + {"cfg_sch_fifo4_fc_th", DPP_FIELD_FLAG_RW, 5, 6, 0x30, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_isch_fifo_th_2_reg[] = + { + {"cfg_sch_fifo3_drop_th", DPP_FIELD_FLAG_RW, 29, 6, 0x38, 0x0}, + {"cfg_sch_fifo1_drop_th", DPP_FIELD_FLAG_RW, 21, 6, 0x38, 0x0}, + {"cfg_sch_fifo0_drop_th", DPP_FIELD_FLAG_RW, 13, 6, 0x38, 0x0}, + {"cfg_sch_fifo8_fc_th", DPP_FIELD_FLAG_RW, 5, 6, 0x30, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_isch_fifo_th_3_reg[] = + { + {"cfg_sch_fifo6_drop_th", DPP_FIELD_FLAG_RW, 29, 6, 0x38, 0x0}, + {"cfg_sch_fifo5_drop_th", DPP_FIELD_FLAG_RW, 21, 6, 0x38, 0x0}, + {"cfg_sch_fifo4_drop_th", DPP_FIELD_FLAG_RW, 13, 6, 0x38, 0x0}, + {"cfg_sch_fifo2_drop_th", DPP_FIELD_FLAG_RW, 5, 6, 0x38, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_isch_fifo_th_4_reg[] = + { + {"cfg_sch_fifo9_fc_th", DPP_FIELD_FLAG_RW, 29, 6, 0x30, 0x0}, + {"cfg_sch_fifo9_drop_th", DPP_FIELD_FLAG_RW, 21, 6, 0x38, 0x0}, + {"cfg_sch_fifo8_drop_th", DPP_FIELD_FLAG_RW, 13, 6, 0x38, 0x0}, + {"cfg_sch_fifo7_drop_th", DPP_FIELD_FLAG_RW, 5, 6, 0x38, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_isch_cfg_0_reg[] = + { + {"cfg_sch_wrr1_weight1", DPP_FIELD_FLAG_RW, 6, 7, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_hdu_ex_tpid_0_reg[] = + { + {"cfg_type0", DPP_FIELD_FLAG_RW, 31, 16, 0x8100, 0x0}, + {"cfg_type1", DPP_FIELD_FLAG_RW, 15, 16, 0x9100, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_hdu_ex_tpid_1_reg[] = + { + {"cfg_type2", DPP_FIELD_FLAG_RW, 31, 16, 0x88a8, 0x0}, + {"cfg_type3", DPP_FIELD_FLAG_RW, 15, 16, 0x9200, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_hdu_int_tpid_0_reg[] = + { + {"cfg_inner_type0", DPP_FIELD_FLAG_RW, 31, 16, 0x8100, 0x0}, + {"cfg_inner_type1", DPP_FIELD_FLAG_RW, 15, 16, 0x9100, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_hdu_int_tpid_1_reg[] = + { + {"cfg_inner_type2", DPP_FIELD_FLAG_RW, 31, 16, 0x88a8, 0x0}, + {"cfg_inner_type3", DPP_FIELD_FLAG_RW, 15, 16, 0x9200, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_hdu_hdlc_0_reg[] = + { + {"hdlc_cfg0_type", DPP_FIELD_FLAG_RW, 31, 16, 0x0, 0x0}, + {"hdlc_cfg1_type", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_hdu_hdlc_1_reg[] = + { + {"hdlc_cfg2_type", DPP_FIELD_FLAG_RW, 31, 16, 0x0, 0x0}, + {"hdlc_cfg3_type", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_hdu_udf_l3type_0_reg[] = + { + {"cfg_l3_type0", DPP_FIELD_FLAG_RW, 31, 16, 0xffff, 0x0}, + {"cfg_l3_type1", DPP_FIELD_FLAG_RW, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_hdu_udf_l3type_1_reg[] = + { + {"cfg_l3_type2", DPP_FIELD_FLAG_RW, 31, 16, 0xffff, 0x0}, + {"cfg_l3_type3", DPP_FIELD_FLAG_RW, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_hdu_udf_l3type_2_reg[] = + { + {"cfg_l3_type4", DPP_FIELD_FLAG_RW, 31, 16, 0xffff, 0x0}, + {"cfg_l3_type5", DPP_FIELD_FLAG_RW, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_hdu_udf_l3type_3_reg[] = + { + {"cfg_l3_type6", DPP_FIELD_FLAG_RW, 31, 16, 0xffff, 0x0}, + {"cfg_l3_type7", DPP_FIELD_FLAG_RW, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_hdu_udf_l4type_0_reg[] = + { + {"cfg_l4_type0", DPP_FIELD_FLAG_RW, 31, 8, 0xff, 0x0}, + {"cfg_l4_type1", DPP_FIELD_FLAG_RW, 23, 8, 0xff, 0x0}, + {"cfg_l4_type2", DPP_FIELD_FLAG_RW, 15, 8, 0xff, 0x0}, + {"cfg_l4_type3", DPP_FIELD_FLAG_RW, 7, 8, 0xff, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_hdu_udf_l4type_1_reg[] = + { + {"cfg_l4_type4", DPP_FIELD_FLAG_RW, 31, 8, 0xff, 0x0}, + {"cfg_l4_type5", DPP_FIELD_FLAG_RW, 23, 8, 0xff, 0x0}, + {"cfg_l4_type6", DPP_FIELD_FLAG_RW, 15, 8, 0xff, 0x0}, + {"cfg_l4_type7", DPP_FIELD_FLAG_RW, 7, 8, 0xff, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_hdu_udf_l4type_2_reg[] = + { + {"cfg_l4_type8", DPP_FIELD_FLAG_RW, 23, 8, 0xff, 0x0}, + {"cfg_l4_type9", DPP_FIELD_FLAG_RW, 15, 8, 0xff, 0x0}, + {"cfg_l4_type10", DPP_FIELD_FLAG_RW, 7, 8, 0xff, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_slot_no_cfg_reg[] = + { + {"cfg_parser_slot_no", DPP_FIELD_FLAG_RW, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_pktrx_int_en_0_reg[] = + { + {"pktrx_int_en_31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"pktrx_int_en_30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"pktrx_int_en_29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"pktrx_int_en_28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"pktrx_int_en_27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"pktrx_int_en_26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"pktrx_int_en_25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"pktrx_int_en_24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"pktrx_int_en_23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"pktrx_int_en_22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"pktrx_int_en_21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"pktrx_int_en_20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"pktrx_int_en_19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"pktrx_int_en_18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"pktrx_int_en_17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"pktrx_int_en_16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"pktrx_int_en_15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"pktrx_int_en_14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"pktrx_int_en_13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"pktrx_int_en_12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"pktrx_int_en_11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"pktrx_int_en_10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"pktrx_int_en_9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"pktrx_int_en_8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"pktrx_int_en_7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"pktrx_int_en_6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"pktrx_int_en_5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"pktrx_int_en_4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"pktrx_int_en_3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"pktrx_int_en_2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"pktrx_int_en_1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"pktrx_int_en_0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_pktrx_int_en_1_reg[] = + { + {"pktrx_int_en_35", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"pktrx_int_en_34", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"pktrx_int_en_33", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"pktrx_int_en_32", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_pktrx_int_mask_0_reg[] = + { + {"pktrx_int_mask_31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"pktrx_int_mask_30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"pktrx_int_mask_29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"pktrx_int_mask_28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"pktrx_int_mask_27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"pktrx_int_mask_26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"pktrx_int_mask_25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"pktrx_int_mask_24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"pktrx_int_mask_23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"pktrx_int_mask_22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"pktrx_int_mask_21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"pktrx_int_mask_20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"pktrx_int_mask_19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"pktrx_int_mask_18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"pktrx_int_mask_17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"pktrx_int_mask_16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"pktrx_int_mask_15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"pktrx_int_mask_14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"pktrx_int_mask_13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"pktrx_int_mask_12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"pktrx_int_mask_11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"pktrx_int_mask_10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"pktrx_int_mask_9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"pktrx_int_mask_8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"pktrx_int_mask_7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"pktrx_int_mask_6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"pktrx_int_mask_5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"pktrx_int_mask_4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"pktrx_int_mask_3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"pktrx_int_mask_2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"pktrx_int_mask_1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"pktrx_int_mask_0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_pktrx_int_mask_1_reg[] = + { + {"pktrx_int_mask_35", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"pktrx_int_mask_34", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"pktrx_int_mask_33", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"pktrx_int_mask_32", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_pktrx_int_status_reg[] = + { + {"int_status", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_pktrx_port_rdy0_reg[] = + { + {"pktrx_trpgrx_r1_rdy", DPP_FIELD_FLAG_RO, 31, 10, 0x3ff, 0x0}, + {"pktrx_trpgrx_r2_rdy", DPP_FIELD_FLAG_RO, 4, 5, 0x1f, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_pktrx_lif0_pfc_rdy0_reg[] = + { + {"pktrx_trpgrx_r1_pfc_rdy_0", DPP_FIELD_FLAG_RO, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_pktrx_lif0_pfc_rdy1_reg[] = + { + {"pktrx_trpgrx_r1_pfc_rdy_1", DPP_FIELD_FLAG_RO, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_pktrx_lif0_pfc_rdy2_reg[] = + { + {"pktrx_trpgrx_r1_pfc_rdy_2", DPP_FIELD_FLAG_RO, 31, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_pktrx_lif0_pfc_rdy3_reg[] = + { + {"pktrx_trpgrx_r2_pfc_rdy_3", DPP_FIELD_FLAG_RO, 31, 8, 0xf, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_pktrx_lif0_pfc_rdy4_reg[] = + { + {"pktrx_trpgrx_r2_pfc_rdy_4", DPP_FIELD_FLAG_RO, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_pktrx_lif0_pfc_rdy5_reg[] = + { + {"pktrx_trpgrx_r2_pfc_rdy_5", DPP_FIELD_FLAG_RO, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_pktrx_lif0_pfc_rdy6_reg[] = + { + {"pktrx_trpgrx_r2_pfc_rdy_6", DPP_FIELD_FLAG_RO, 31, 24, 0xffffff, 0x0}, + }; +DPP_FIELD_T g_nppu_pktrx_cfg_cfg_port_l2_offset_mode_reg[] = + { + {"cfg_port_l2_offset_mode", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_idma_cfg_int_ram_en_reg[] = + { + {"phy_sts_parity_err", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"ptr_buf_parity_err", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_idma_cfg_int_ram_mask_reg[] = + { + {"phy_sts_parity_err", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"ptr_buf_parity_err", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_idma_cfg_int_ram_status_reg[] = + { + {"phy_sts_parity_err", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"ptr_buf_parity_err", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_idma_cfg_subsys_int_mask_flag_reg[] = + { + {"subsys_int_mask_flag", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_idma_cfg_subsys_int_unmask_flag_reg[] = + { + {"subsys_int_unmask_flag", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_idma_cfg_debug_cnt_rdclr_mode_reg[] = + { + {"debug_cnt_rdclr_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_int_ram_en0_reg[] = + { + {"int_ram_en_31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"int_ram_en_30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"int_ram_en_29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"int_ram_en_28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"int_ram_en_27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"int_ram_en_26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"int_ram_en_25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"int_ram_en_24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"int_ram_en_23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"int_ram_en_22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"int_ram_en_21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"int_ram_en_20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"int_ram_en_19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"int_ram_en_18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"int_ram_en_17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"int_ram_en_16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"int_ram_en_15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"int_ram_en_14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"int_ram_en_13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"int_ram_en_12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"int_ram_en_11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"int_ram_en_10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"int_ram_en_9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"int_ram_en_8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"int_ram_en_7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"int_ram_en_6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"int_ram_en_5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"int_ram_en_4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"int_ram_en_3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"int_ram_en_2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"int_ram_en_1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"int_ram_en_0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_int_ram_mask0_reg[] = + { + {"int_ram_mask_31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"int_ram_mask_30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"int_ram_mask_29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"int_ram_mask_28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"int_ram_mask_27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"int_ram_mask_26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"int_ram_mask_25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"int_ram_mask_24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"int_ram_mask_23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"int_ram_mask_22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"int_ram_mask_21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"int_ram_mask_20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"int_ram_mask_19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"int_ram_mask_18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"int_ram_mask_17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"int_ram_mask_16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"int_ram_mask_15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"int_ram_mask_14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"int_ram_mask_13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"int_ram_mask_12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"int_ram_mask_11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"int_ram_mask_10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"int_ram_mask_9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"int_ram_mask_8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"int_ram_mask_7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"int_ram_mask_6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"int_ram_mask_5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"int_ram_mask_4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"int_ram_mask_3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"int_ram_mask_2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"int_ram_mask_1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"int_ram_mask_0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_int_ram_status0_reg[] = + { + {"int_ram_status_31", DPP_FIELD_FLAG_RO, 31, 1, 0x0, 0x0}, + {"int_ram_status_30", DPP_FIELD_FLAG_RO, 30, 1, 0x0, 0x0}, + {"int_ram_status_29", DPP_FIELD_FLAG_RO, 29, 1, 0x0, 0x0}, + {"int_ram_status_28", DPP_FIELD_FLAG_RO, 28, 1, 0x0, 0x0}, + {"int_ram_status_27", DPP_FIELD_FLAG_RO, 27, 1, 0x0, 0x0}, + {"int_ram_status_26", DPP_FIELD_FLAG_RO, 26, 1, 0x0, 0x0}, + {"int_ram_status_25", DPP_FIELD_FLAG_RO, 25, 1, 0x0, 0x0}, + {"int_ram_status_24", DPP_FIELD_FLAG_RO, 24, 1, 0x0, 0x0}, + {"int_ram_status_23", DPP_FIELD_FLAG_RO, 23, 1, 0x0, 0x0}, + {"int_ram_status_22", DPP_FIELD_FLAG_RO, 22, 1, 0x0, 0x0}, + {"int_ram_status_21", DPP_FIELD_FLAG_RO, 21, 1, 0x0, 0x0}, + {"int_ram_status_20", DPP_FIELD_FLAG_RO, 20, 1, 0x0, 0x0}, + {"int_ram_status_19", DPP_FIELD_FLAG_RO, 19, 1, 0x0, 0x0}, + {"int_ram_status_18", DPP_FIELD_FLAG_RO, 18, 1, 0x0, 0x0}, + {"int_ram_status_17", DPP_FIELD_FLAG_RO, 17, 1, 0x0, 0x0}, + {"int_ram_status_16", DPP_FIELD_FLAG_RO, 16, 1, 0x0, 0x0}, + {"int_ram_status_15", DPP_FIELD_FLAG_RO, 15, 1, 0x0, 0x0}, + {"int_ram_status_14", DPP_FIELD_FLAG_RO, 14, 1, 0x0, 0x0}, + {"int_ram_status_13", DPP_FIELD_FLAG_RO, 13, 1, 0x0, 0x0}, + {"int_ram_status_12", DPP_FIELD_FLAG_RO, 12, 1, 0x0, 0x0}, + {"int_ram_status_11", DPP_FIELD_FLAG_RO, 11, 1, 0x0, 0x0}, + {"int_ram_status_10", DPP_FIELD_FLAG_RO, 10, 1, 0x0, 0x0}, + {"int_ram_status_9", DPP_FIELD_FLAG_RO, 9, 1, 0x0, 0x0}, + {"int_ram_status_8", DPP_FIELD_FLAG_RO, 8, 1, 0x0, 0x0}, + {"int_ram_status_7", DPP_FIELD_FLAG_RO, 7, 1, 0x0, 0x0}, + {"int_ram_status_6", DPP_FIELD_FLAG_RO, 6, 1, 0x0, 0x0}, + {"int_ram_status_5", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"int_ram_status_4", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"int_ram_status_3", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"int_ram_status_2", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"int_ram_status_1", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"int_ram_status_0", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_int_fifo_en0_reg[] = + { + {"int_fifo_en_31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"int_fifo_en_30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"int_fifo_en_29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"int_fifo_en_28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"int_fifo_en_27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"int_fifo_en_26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"int_fifo_en_25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"int_fifo_en_24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"int_fifo_en_23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"int_fifo_en_22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"int_fifo_en_21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"int_fifo_en_20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"int_fifo_en_19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"int_fifo_en_18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"int_fifo_en_17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"int_fifo_en_16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"int_fifo_en_15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"int_fifo_en_14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"int_fifo_en_13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"int_fifo_en_12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"int_fifo_en_11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"int_fifo_en_10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"int_fifo_en_9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"int_fifo_en_8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"int_fifo_en_7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"int_fifo_en_6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"int_fifo_en_5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"int_fifo_en_4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"int_fifo_en_3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"int_fifo_en_2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"int_fifo_en_1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"int_fifo_en_0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_int_fifo_en1_reg[] = + { + {"int_fifo_en_35", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"int_fifo_en_34", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"int_fifo_en_33", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"int_fifo_en_32", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_int_fifo_mask0_reg[] = + { + {"int_fifo_mask_31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"int_fifo_mask_30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"int_fifo_mask_29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"int_fifo_mask_28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"int_fifo_mask_27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"int_fifo_mask_26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"int_fifo_mask_25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"int_fifo_mask_24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"int_fifo_mask_23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"int_fifo_mask_22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"int_fifo_mask_21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"int_fifo_mask_20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"int_fifo_mask_19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"int_fifo_mask_18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"int_fifo_mask_17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"int_fifo_mask_16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"int_fifo_mask_15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"int_fifo_mask_14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"int_fifo_mask_13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"int_fifo_mask_12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"int_fifo_mask_11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"int_fifo_mask_10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"int_fifo_mask_9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"int_fifo_mask_8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"int_fifo_mask_7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"int_fifo_mask_6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"int_fifo_mask_5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"int_fifo_mask_4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"int_fifo_mask_3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"int_fifo_mask_2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"int_fifo_mask_1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"int_fifo_mask_0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_int_fifo_mask1_reg[] = + { + {"int_fifo_mask_35", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"int_fifo_mask_34", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"int_fifo_mask_33", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"int_fifo_mask_32", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_int_fifo_status0_reg[] = + { + {"int_fifo_status_31", DPP_FIELD_FLAG_RO, 31, 1, 0x0, 0x0}, + {"int_fifo_status_30", DPP_FIELD_FLAG_RO, 30, 1, 0x0, 0x0}, + {"int_fifo_status_29", DPP_FIELD_FLAG_RO, 29, 1, 0x0, 0x0}, + {"int_fifo_status_28", DPP_FIELD_FLAG_RO, 28, 1, 0x0, 0x0}, + {"int_fifo_status_27", DPP_FIELD_FLAG_RO, 27, 1, 0x0, 0x0}, + {"int_fifo_status_26", DPP_FIELD_FLAG_RO, 26, 1, 0x0, 0x0}, + {"int_fifo_status_25", DPP_FIELD_FLAG_RO, 25, 1, 0x0, 0x0}, + {"int_fifo_status_24", DPP_FIELD_FLAG_RO, 24, 1, 0x0, 0x0}, + {"int_fifo_status_23", DPP_FIELD_FLAG_RO, 23, 1, 0x0, 0x0}, + {"int_fifo_status_22", DPP_FIELD_FLAG_RO, 22, 1, 0x0, 0x0}, + {"int_fifo_status_21", DPP_FIELD_FLAG_RO, 21, 1, 0x0, 0x0}, + {"int_fifo_status_20", DPP_FIELD_FLAG_RO, 20, 1, 0x0, 0x0}, + {"int_fifo_status_19", DPP_FIELD_FLAG_RO, 19, 1, 0x0, 0x0}, + {"int_fifo_status_18", DPP_FIELD_FLAG_RO, 18, 1, 0x0, 0x0}, + {"int_fifo_status_17", DPP_FIELD_FLAG_RO, 17, 1, 0x0, 0x0}, + {"int_fifo_status_16", DPP_FIELD_FLAG_RO, 16, 1, 0x0, 0x0}, + {"int_fifo_status_15", DPP_FIELD_FLAG_RO, 15, 1, 0x0, 0x0}, + {"int_fifo_status_14", DPP_FIELD_FLAG_RO, 14, 1, 0x0, 0x0}, + {"int_fifo_status_13", DPP_FIELD_FLAG_RO, 13, 1, 0x0, 0x0}, + {"int_fifo_status_12", DPP_FIELD_FLAG_RO, 12, 1, 0x0, 0x0}, + {"int_fifo_status_11", DPP_FIELD_FLAG_RO, 11, 1, 0x0, 0x0}, + {"int_fifo_status_10", DPP_FIELD_FLAG_RO, 10, 1, 0x0, 0x0}, + {"int_fifo_status_9", DPP_FIELD_FLAG_RO, 9, 1, 0x0, 0x0}, + {"int_fifo_status_8", DPP_FIELD_FLAG_RO, 8, 1, 0x0, 0x0}, + {"int_fifo_status_7", DPP_FIELD_FLAG_RO, 7, 1, 0x0, 0x0}, + {"int_fifo_status_6", DPP_FIELD_FLAG_RO, 6, 1, 0x0, 0x0}, + {"int_fifo_status_5", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"int_fifo_status_4", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"int_fifo_status_3", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"int_fifo_status_2", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"int_fifo_status_1", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"int_fifo_status_0", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_int_fifo_status1_reg[] = + { + {"int_fifo_status_35", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"int_fifo_status_34", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"int_fifo_status_33", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"int_fifo_status_32", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_subsys_int_mask_flag_reg[] = + { + {"subsys_int_mask_flag", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_subsys_int_unmask_flag_reg[] = + { + {"subsys_int_unmask_flag", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_sa_ip_en_reg[] = + { + {"sa_ip_en", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_debug_cnt_rdclr_mode_reg[] = + { + {"debug_cnt_rdclr_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_fptr_fifo_aful_assert_cfg_reg[] = + { + {"fptr_fifo_aful_assert_cfg", DPP_FIELD_FLAG_RW, 12, 13, 0xff0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_fptr_fifo_aful_negate_cfg_reg[] = + { + {"fptr_fifo_aful_negate_cfg", DPP_FIELD_FLAG_RW, 12, 13, 0xff0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_pf_fifo_aful_assert_cfg_reg[] = + { + {"pf_fifo_aful_assert_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0x8, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_pf_fifo_aful_negate_cfg_reg[] = + { + {"pf_fifo_aful_negate_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0x8, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_pf_fifo_aept_assert_cfg_reg[] = + { + {"pf_fifo_aept_assert_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0x4, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_pf_fifo_aept_negate_cfg_reg[] = + { + {"pf_fifo_aept_negate_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0x4, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_wb_aful_assert_cfg_reg[] = + { + {"wb_aful_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x12, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_wb_aful_negate_cfg_reg[] = + { + {"wb_aful_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x12, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_se_key_aful_assert_cfg_reg[] = + { + {"se_key_aful_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_ifbrd_se_aful_assert_cfg_reg[] = + { + {"ifbrd_se_aful_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x18, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_ifbrd_se_aful_negate_cfg_reg[] = + { + {"ifbrd_se_aful_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x18, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_ifbrd_odma_aful_assert_cfg_reg[] = + { + {"ifbrd_odma_aful_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x18, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_ifbrd_odma_aful_negate_cfg_reg[] = + { + {"ifbrd_odma_aful_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x18, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_ifbrd_ppu_aful_assert_cfg_reg[] = + { + {"ifbrd_ppu_aful_assert_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0x10, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_ifbrd_ppu_aful_negate_cfg_reg[] = + { + {"ifbrd_ppu_aful_negate_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0x10, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_mc_logic_aful_assert_cfg_reg[] = + { + {"mc_logic_aful_assert_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0x10, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_mc_logic_aful_negate_cfg_reg[] = + { + {"mc_logic_aful_negate_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0x10, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_mc_logic_diff_reg[] = + { + {"mc_logic_diff", DPP_FIELD_FLAG_RW, 7, 8, 0xa, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_cfg_peak_port_cnt_clr_reg[] = + { + {"cfg_peak_port_cnt_clr", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_all_ftm_crdt_th_reg[] = + { + {"ftm_crdt_port_cng_th", DPP_FIELD_FLAG_RW, 29, 15, 0x0, 0x0}, + {"ftm_crdt_port_th", DPP_FIELD_FLAG_RW, 14, 15, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_all_ftm_link_th_01_reg[] = + { + {"total_congest_th1", DPP_FIELD_FLAG_RW, 29, 15, 0x0, 0x0}, + {"total_congest_th0", DPP_FIELD_FLAG_RW, 14, 15, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_all_ftm_link_th_23_reg[] = + { + {"total_congest_th3", DPP_FIELD_FLAG_RW, 29, 15, 0x0, 0x0}, + {"total_congest_th2", DPP_FIELD_FLAG_RW, 14, 15, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_all_ftm_link_th_45_reg[] = + { + {"total_congest_th5", DPP_FIELD_FLAG_RW, 29, 15, 0x0, 0x0}, + {"total_congest_th4", DPP_FIELD_FLAG_RW, 14, 15, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_all_ftm_link_th_6_reg[] = + { + {"total_congest_th6", DPP_FIELD_FLAG_RW, 14, 15, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_all_ftm_total_congest_th_reg[] = + { + {"all_ftm_total_congest_th", DPP_FIELD_FLAG_RW, 14, 15, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_cfg_crdt_mode_reg[] = + { + {"cfg_crdt_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_cfg_pfc_rdy_high_time_reg[] = + { + {"cfg_pfc_rdy_high_time", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_cfg_cfg_pfc_rdy_low_time_reg[] = + { + {"cfg_pfc_rdy_low_time", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_pbu_fc_rdy_reg[] = + { + {"pbu_oam_send_fc_rdy", DPP_FIELD_FLAG_RO, 7, 2, 0x0, 0x0}, + {"pbu_odma_fc_rdy", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"pbu_tm_fc_rdy", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"pbu_idma_cos_rdy", DPP_FIELD_FLAG_RO, 1, 2, 0x2, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_pbu_lif_group0_rdy0_reg[] = + { + {"pbu_ipg1_rdy", DPP_FIELD_FLAG_RO, 27, 3, 0x0, 0x0}, + {"pbu_ipg0_rdy", DPP_FIELD_FLAG_RO, 24, 9, 0x0, 0x0}, + {"pbu_trpgrx_xge_rdy", DPP_FIELD_FLAG_RO, 9, 2, 0x0, 0x0}, + {"pbu_trpgrx_cge1_rdy", DPP_FIELD_FLAG_RO, 7, 4, 0x0, 0x0}, + {"pbu_trpgrx_cge0_rdy", DPP_FIELD_FLAG_RO, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_pbu_lif_group0_rdy1_reg[] = + { + {"pbu_lif_group0_rdy1", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_pbu_lif_group1_rdy_reg[] = + { + {"pbu_lif_group1_rdy1", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_pbu_lif_group0_pfc_rdy_reg[] = + { + {"pbu_lif_group0_pfc_rdy", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_pbu_lif_group1_pfc_rdy_reg[] = + { + {"pbu_lif_group1_pfc_rdy", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_pbu_sa_port_rdy_0_31_reg[] = + { + {"pbu_sa_port_rdy_0_31", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_pbu_sa_port_rdy_32_50_reg[] = + { + {"pbu_sa_port_rdy_32_50", DPP_FIELD_FLAG_RO, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_pbu_pktrx_mr_pfc_rdy_reg[] = + { + {"pbu_pktrx_mr_pfc_rdy", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_pbu_ftm_crdt_port_rdy_0_31_reg[] = + { + {"pbu_ftm_crdt_port_rdy_0_31", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_pbu_ftm_crdt_port_rdy_32_47_reg[] = + { + {"pbu_ftm_crdt_port_rdy_32_47", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_pbu_ftm_crdt_port_cng_rdy_0_31_reg[] = + { + {"pbu_ftm_crdt_port_cng_rdy_0_31", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_pbu_ftm_crdt_port_cng_rdy_32_47_reg[] = + { + {"pbu_ftm_crdt_port_cng_rdy_32_47", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_pbu_stat_pbu_ftm_crdt_sys_info_reg[] = + { + {"pbu_ftm_crdt_sys_info", DPP_FIELD_FLAG_RO, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_cfg_weight_normal_mc_reg[] = + { + {"weight_normal_mc", DPP_FIELD_FLAG_RW, 6, 7, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_cfg_weight_sa_mc_reg[] = + { + {"weight_sa_mc", DPP_FIELD_FLAG_RW, 6, 7, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_cfg_weight_etm_reg[] = + { + {"weight_etm", DPP_FIELD_FLAG_RW, 6, 7, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_cfg_weight_lp_mc_reg[] = + { + {"weight_lp_mc", DPP_FIELD_FLAG_RW, 6, 7, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_cfg_weight_oam_reg[] = + { + {"weight_oam", DPP_FIELD_FLAG_RW, 6, 7, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_cfg_weight_lif_ctrl1_reg[] = + { + {"weight_lif_ctrl1", DPP_FIELD_FLAG_RW, 6, 7, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_cfg_weight_lif_ctrl2_reg[] = + { + {"weight_lif_ctrl2", DPP_FIELD_FLAG_RW, 6, 7, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_cfg_ecc_bypass_read_reg[] = + { + {"eccbypass", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_cfg_isu_int_mask_reg[] = + { + {"isu_int_mask", DPP_FIELD_FLAG_RW, 26, 27, 0x7ffffff, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_cfg_cfg_crdt_cycle_reg[] = + { + {"cfg_cycle", DPP_FIELD_FLAG_RW, 5, 6, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_cfg_cfg_crdt_value_reg[] = + { + {"cfg_value", DPP_FIELD_FLAG_RW, 13, 14, 0x216, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_cfg_isu_int_en_reg[] = + { + {"isu_int_en", DPP_FIELD_FLAG_RW, 26, 27, 0x7ffffff, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_cfg_isu_ppu_fifo_fc_reg[] = + { + {"isu_ppu_fifo_fc", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_cfg_isu_int_status_reg[] = + { + {"isu_int_status_26", DPP_FIELD_FLAG_RO, 26, 1, 0x0, 0x0}, + {"isu_int_status_25", DPP_FIELD_FLAG_RO, 25, 1, 0x0, 0x0}, + {"isu_int_status_24", DPP_FIELD_FLAG_RO, 24, 1, 0x0, 0x0}, + {"isu_int_status_23", DPP_FIELD_FLAG_RO, 23, 1, 0x0, 0x0}, + {"isu_int_status_22", DPP_FIELD_FLAG_RO, 22, 1, 0x0, 0x0}, + {"isu_int_status_21", DPP_FIELD_FLAG_RO, 21, 1, 0x0, 0x0}, + {"isu_int_status_20", DPP_FIELD_FLAG_RO, 20, 1, 0x0, 0x0}, + {"isu_int_status_19", DPP_FIELD_FLAG_RO, 19, 1, 0x0, 0x0}, + {"isu_int_status_18", DPP_FIELD_FLAG_RO, 18, 1, 0x0, 0x0}, + {"isu_int_status_17", DPP_FIELD_FLAG_RO, 17, 1, 0x0, 0x0}, + {"isu_int_status_16", DPP_FIELD_FLAG_RO, 16, 1, 0x0, 0x0}, + {"isu_int_status_15", DPP_FIELD_FLAG_RO, 15, 1, 0x0, 0x0}, + {"isu_int_status_14", DPP_FIELD_FLAG_RO, 14, 1, 0x0, 0x0}, + {"isu_int_status_13", DPP_FIELD_FLAG_RO, 13, 1, 0x0, 0x0}, + {"isu_int_status_12", DPP_FIELD_FLAG_RO, 12, 1, 0x0, 0x0}, + {"isu_int_status_11", DPP_FIELD_FLAG_RO, 11, 1, 0x0, 0x0}, + {"isu_int_status_10", DPP_FIELD_FLAG_RO, 10, 1, 0x0, 0x0}, + {"isu_int_status_9", DPP_FIELD_FLAG_RO, 9, 1, 0x0, 0x0}, + {"isu_int_status_8", DPP_FIELD_FLAG_RO, 8, 1, 0x0, 0x0}, + {"isu_int_status_7", DPP_FIELD_FLAG_RO, 7, 1, 0x0, 0x0}, + {"isu_int_status_6", DPP_FIELD_FLAG_RO, 6, 1, 0x0, 0x0}, + {"isu_int_status_5", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"isu_int_status_4", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"isu_int_status_3", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"isu_int_status_2", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"isu_int_status_1", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"isu_int_status_0", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_cfg_fd_prog_full_assert_cfg_reg[] = + { + {"fd_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 10, 11, 0x3e8, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_cfg_fd_prog_full_negate_cfg_reg[] = + { + {"fd_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 10, 11, 0x3e8, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_cfg_lp_prog_full_assert_cfg_reg[] = + { + {"lp_prog_ept_assert_cfg", DPP_FIELD_FLAG_RW, 11, 12, 0x80, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_cfg_lp_prog_full_negate_cfg_reg[] = + { + {"lp_prog_ept_negate_cfg", DPP_FIELD_FLAG_RW, 11, 12, 0x80, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_stat_debug_cnt_dat0_reg[] = + { + {"debug_cnt_dat0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_stat_debug_cnt_dat1_reg[] = + { + {"debug_cnt_dat1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_stat_debug_cnt_dat2_reg[] = + { + {"debug_cnt_dat2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_stat_debug_cnt_dat3_reg[] = + { + {"debug_cnt_dat3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_stat_debug_cnt_dat4_reg[] = + { + {"debug_cnt_dat4", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_stat_debug_cnt_dat5_reg[] = + { + {"debug_cnt_dat5", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_stat_debug_cnt_dat6_reg[] = + { + {"debug_cnt_dat6", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_stat_debug_cnt_dat7_reg[] = + { + {"debug_cnt_dat7", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_stat_debug_cnt_dat8_reg[] = + { + {"debug_cnt_dat8", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_stat_debug_cnt_dat9_reg[] = + { + {"debug_cnt_dat9", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_stat_debug_cnt_dat10_reg[] = + { + {"debug_cnt_dat10", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_stat_debug_cnt_dat11_reg[] = + { + {"debug_cnt_dat11", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_stat_debug_cnt_dat12_reg[] = + { + {"debug_cnt_dat12", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_stat_debug_cnt_dat13_reg[] = + { + {"debug_cnt_dat13", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_stat_debug_cnt_dat14_reg[] = + { + {"debug_cnt_dat14", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_stat_debug_cnt_dat15_reg[] = + { + {"debug_cnt_dat15", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_stat_debug_cnt_dat16_reg[] = + { + {"debug_cnt_dat16", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_stat_debug_cnt_dat17_reg[] = + { + {"debug_cnt_dat17", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_stat_debug_cnt_dat18_reg[] = + { + {"debug_cnt_dat18", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_stat_debug_cnt_dat19_reg[] = + { + {"debug_cnt_dat18", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_isu_stat_debug_cnt_cfg_reg[] = + { + {"debug_cnt_ovf_mode", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + {"debug_cnt_rdclr_mode", DPP_FIELD_FLAG_RW, 30, 1, 0x0, 0x0}, + {"user_cnt_value", DPP_FIELD_FLAG_RW, 29, 4, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_exsa_tdm_offset_reg[] = + { + {"exsa_tdm_offset", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_ecc_bypass_readt_reg[] = + { + {"ecc_bypass_read", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_odma_int_en_0_reg[] = + { + {"odma_int_en_31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"odma_int_en_30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"odma_int_en_29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"odma_int_en_28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"odma_int_en_27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"odma_int_en_26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"odma_int_en_25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"odma_int_en_24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"odma_int_en_22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"odma_int_en_21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"odma_int_en_18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_odma_int_en_1_reg[] = + { + {"odma_int_en_63", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"odma_int_en_62", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"odma_int_en_61", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"odma_int_en_59", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"odma_int_en_58", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"odma_int_en_57", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"odma_int_en_56", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"odma_int_en_55", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"odma_int_en_54", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"odma_int_en_53", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"odma_int_en_52", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"odma_int_en_51", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"odma_int_en_49", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"odma_int_en_47", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"odma_int_en_45", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"odma_int_en_39", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"odma_int_en_38", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"odma_int_en_37", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"odma_int_en_36", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"odma_int_en_35", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"odma_int_en_34", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"odma_int_en_33", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"odma_int_en_32", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_odma_int_en_2_reg[] = + { + {"odma_int_en_91", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"odma_int_en_88", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"odma_int_en_85", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"odma_int_en_82", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"odma_int_en_79", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"odma_int_en_75", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"odma_int_en_74", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"odma_int_en_71", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"odma_int_en_65", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"odma_int_en_64", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_odma_int_en_3_reg[] = + { + {"odma_int_en_115", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"odma_int_en_114", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"odma_int_en_112", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"odma_int_en_110", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"odma_int_en_109", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"odma_int_en_108", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"odma_int_en_107", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"odma_int_en_106", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"odma_int_en_102", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"odma_int_en_101", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"odma_int_en_100", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"odma_int_en_98", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"odma_int_en_96", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_odma_int_mask_0_reg[] = + { + {"odma_int_mask_31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"odma_int_mask_30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"odma_int_mask_29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"odma_int_mask_28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"odma_int_mask_27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"odma_int_mask_26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"odma_int_mask_25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"odma_int_mask_24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"odma_int_mask_22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"odma_int_mask_21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"odma_int_mask_18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_odma_int_mask_1_reg[] = + { + {"odma_int_mask_63", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"odma_int_mask_62", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"odma_int_mask_61", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"odma_int_mask_59", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"odma_int_mask_58", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"odma_int_mask_57", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"odma_int_mask_56", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"odma_int_mask_55", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"odma_int_mask_54", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"odma_int_mask_53", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"odma_int_mask_52", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"odma_int_mask_51", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"odma_int_mask_50", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"odma_int_mask_49", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"odma_int_mask_47", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"odma_int_mask_45", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"odma_int_mask_39", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"odma_int_mask_38", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"odma_int_mask_37", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"odma_int_mask_36", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"odma_int_mask_35", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"odma_int_mask_34", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"odma_int_mask_33", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"odma_int_mask_32", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_odma_int_mask_2_reg[] = + { + {"odma_int_mask_91", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"odma_int_mask_88", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"odma_int_mask_85", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"odma_int_mask_82", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"odma_int_mask_79", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"odma_int_mask_75", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"odma_int_mask_74", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"odma_int_mask_71", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"odma_int_mask_65", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"odma_int_mask_64", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_odma_int_mask_3_reg[] = + { + {"odma_int_mask_115", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"odma_int_mask_114", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"odma_int_mask_112", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"odma_int_mask_110", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"odma_int_mask_109", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"odma_int_mask_108", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"odma_int_mask_107", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"odma_int_mask_106", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"odma_int_mask_102", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"odma_int_mask_101", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"odma_int_mask_100", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"odma_int_mask_98", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"odma_int_mask_96", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_odma_int_status_0_reg[] = + { + {"odma_int_status_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"odma_int_status_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"odma_int_status_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"odma_int_status_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"odma_int_status_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"odma_int_status_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"odma_int_status_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"odma_int_status_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"odma_int_status_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"odma_int_status_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"odma_int_status_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_odma_int_status_1_reg[] = + { + {"odma_int_status_63", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"odma_int_status_62", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"odma_int_status_61", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"odma_int_status_59", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"odma_int_status_58", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"odma_int_status_57", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"odma_int_status_56", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"odma_int_status_55", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"odma_int_status_54", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"odma_int_status_53", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"odma_int_status_52", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"odma_int_status_51", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"odma_int_status_49", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"odma_int_status_47", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"odma_int_status_45", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"odma_int_status_39", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"odma_int_status_38", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"odma_int_status_37", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"odma_int_status_36", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"odma_int_status_35", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"odma_int_status_34", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"odma_int_status_33", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"odma_int_status_32", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_odma_int_status_2_reg[] = + { + {"odma_int_status_91", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"odma_int_status_88", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"odma_int_status_85", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"odma_int_status_82", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"odma_int_status_79", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"odma_int_status_75", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"odma_int_status_74", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"odma_int_status_71", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"odma_int_status_65", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"odma_int_status_64", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_odma_int_status_3_reg[] = + { + {"odma_int_status_117", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"odma_int_status_116", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"odma_int_status_115", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"odma_int_status_114", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"odma_int_status_112", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"odma_int_status_110", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"odma_int_status_109", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"odma_int_status_108", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"odma_int_status_107", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"odma_int_status_106", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"odma_int_status_102", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"odma_int_status_101", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"odma_int_status_100", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"odma_int_status_98", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"odma_int_status_96", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_sp_tdm_err_nor_cfg_reg[] = + { + {"sp_tdm_err_nor_cfg", DPP_FIELD_FLAG_RW, 1, 2, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_etm_dis_ptr_prog_full_cfg_a_reg[] = + { + {"etm_dis_ptr_prog_full_cfg_a", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_etm_dis_ptr_prog_full_cfg_n_reg[] = + { + {"etm_dis_ptr_prog_full_cfg_n", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_ftm_dis_ptr_prog_full_cfg_a_reg[] = + { + {"ftm_dis_ptr_prog_full_cfg_a", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_ftm_dis_ptr_prog_full_cfg_n_reg[] = + { + {"ftm_dis_ptr_prog_full_cfg_n", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_tm_dis_fifo_prog_full_cfg_a_reg[] = + { + {"tm_dis_fifo_prog_full_cfg_a", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_tm_dis_fifo_prog_full_cfg_n_reg[] = + { + {"tm_dis_fifo_prog_full_cfg_n", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_err_prog_full_cfg_a_reg[] = + { + {"err_prog_full_cfg_a", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_err_prog_full_cfg_n_reg[] = + { + {"err_prog_full_cfg_n", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_tdmuc_prog_full_cfg_a_reg[] = + { + {"tdmuc_prog_full_cfg_a", DPP_FIELD_FLAG_RW, 10, 11, 0x3e8, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_tdmuc_prog_full_cfg_n_reg[] = + { + {"tdmuc_prog_full_cfg_n", DPP_FIELD_FLAG_RW, 10, 11, 0x3e8, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_tdmmc_groupid_prog_full_cfg_a_reg[] = + { + {"tdmmc_groupid_prog_full_cfg_a", DPP_FIELD_FLAG_RW, 10, 11, 0x3e8, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_tdmmc_groupid_prog_full_cfg_n_reg[] = + { + {"tdmmc_groupid_prog_full_cfg_n", DPP_FIELD_FLAG_RW, 10, 11, 0x3e8, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_tdmmc_no_bitmap_prog_full_cfg_a_reg[] = + { + {"tdmmc_no_bitmap_prog_full_cfg_a", DPP_FIELD_FLAG_RW, 10, 11, 0x3e8, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_tdmmc_no_bitmap_prog_full_cfg_n_reg[] = + { + {"tdmmc_no_bitmap_prog_full_cfg_n", DPP_FIELD_FLAG_RW, 10, 11, 0x3e8, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_tdmmc_prog_full_cfg_a_reg[] = + { + {"tdmmc_prog_full_cfg_a", DPP_FIELD_FLAG_RW, 10, 11, 0x3e8, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_tdmmc_prog_full_cfg_n_reg[] = + { + {"tdmmc_prog_full_cfg_n", DPP_FIELD_FLAG_RW, 10, 11, 0x3e8, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_desc_prog_full_cfg_a_reg[] = + { + {"desc_prog_full_cfg_a", DPP_FIELD_FLAG_RW, 7, 8, 0x64, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_desc_prog_full_cfg_n_reg[] = + { + {"desc_prog_full_cfg_n", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_dly_prog_full_cfg_a_reg[] = + { + {"dly_prog_full_cfg_a", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_dly_prog_full_cfg_n_reg[] = + { + {"dly_prog_full_cfg_n", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_rsp_prog_full_cfg_a_reg[] = + { + {"rsp_prog_full_cfg_a", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_rsp_prog_full_cfg_n_reg[] = + { + {"rsp_prog_full_cfg_n", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_nor_prog_full_cfg_a_reg[] = + { + {"nor_prog_full_cfg_a", DPP_FIELD_FLAG_RW, 10, 11, 0x3e8, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_nor_prog_full_cfg_n_reg[] = + { + {"nor_prog_full_cfg_n", DPP_FIELD_FLAG_RW, 10, 11, 0x3e8, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_etm_nor_prog_full_cfg_a_reg[] = + { + {"etm_nor_prog_full_cfg_a", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_etm_nor_prog_full_cfg_n_reg[] = + { + {"etm_nor_prog_full_cfg_n", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_ftm_nor_prog_full_cfg_a_reg[] = + { + {"ftm_nor_prog_full_cfg_a", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_ftm_nor_prog_full_cfg_n_reg[] = + { + {"ftm_nor_prog_full_cfg_n", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_etm_prog_full_cfg_a_reg[] = + { + {"etm_prog_full_cfg_a", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_etm_prog_full_cfg_n_reg[] = + { + {"etm_prog_full_cfg_n", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_ftm_prog_full_cfg_a_reg[] = + { + {"ftm_prog_full_cfg_a", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_ftm_prog_full_cfg_n_reg[] = + { + {"ftm_prog_full_cfg_n", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_etm_nrdcnt_prog_full_cfg_a_reg[] = + { + {"etm_nrdcnt_prog_full_cfg_a", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_etm_nrdcnt_prog_full_cfg_n_reg[] = + { + {"etm_nrdcnt_prog_full_cfg_n", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_ftm_nrdcnt_prog_full_cfg_a_reg[] = + { + {"ftm_nrdcnt_prog_full_cfg_a", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_ftm_nrdcnt_prog_full_cfg_n_reg[] = + { + {"ftm_nrdcnt_prog_full_cfg_n", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_pp_prog_full_cfg_a_reg[] = + { + {"pp_prog_full_cfg_a", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_pp_prog_full_cfg_n_reg[] = + { + {"pp_prog_full_cfg_n", DPP_FIELD_FLAG_RW, 7, 8, 0x6e, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_tm_weight_reg[] = + { + {"tm_weight", DPP_FIELD_FLAG_RW, 6, 7, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_pp_weight_reg[] = + { + {"pp_weight", DPP_FIELD_FLAG_RW, 6, 7, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_ifbcmd_prog_full_cfg_a_reg[] = + { + {"ifbcmd_prog_full_cfg_a", DPP_FIELD_FLAG_RW, 6, 7, 0x32, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_ifbcmd_prog_full_cfg_n_reg[] = + { + {"ifbcmd_prog_full_cfg_n", DPP_FIELD_FLAG_RW, 6, 7, 0x32, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_mccnt_prog_full_cfg_a_reg[] = + { + {"mccnt_prog_full_cfg_a", DPP_FIELD_FLAG_RW, 5, 6, 0x10, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_mccnt_prog_full_cfg_n_reg[] = + { + {"mccnt_prog_full_cfg_n", DPP_FIELD_FLAG_RW, 5, 6, 0x19, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_int_or_pon_reg[] = + { + {"int_or_pon", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_quemng_cnt_in_err_cnt_reg[] = + { + {"quemng_cnt_in_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_lif0_port_eop_cnt_reg[] = + { + {"lif0_port_eop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_lif1_port_eop_cnt_reg[] = + { + {"lif1_port_eop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_lifc_port0_eop_cnt_reg[] = + { + {"lifc_port0_eop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_lifc_port1_eop_cnt_reg[] = + { + {"lifc_port1_eop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_fptr_fifo_prog_ept_cfg_n_reg[] = + { + {"fptr_fifo_prog_ept_cfg_n", DPP_FIELD_FLAG_RW, 14, 15, 0x40, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_isu_fifo_prog_full_cfg_a_reg[] = + { + {"isu_fifo_prog_full_cfg_a", DPP_FIELD_FLAG_RW, 7, 8, 0x60, 0x0}, + }; +DPP_FIELD_T g_nppu_odma_cfg_isu_fifo_prog_full_cfg_n_reg[] = + { + {"isu_fifo_prog_full_cfg_n", DPP_FIELD_FLAG_RW, 7, 8, 0x60, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ind_access_done_reg[] = + { + {"ind_access_done", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ind_access_command_reg[] = + { + {"ind_rd_or_wr", DPP_FIELD_FLAG_RW, 21, 1, 0x0, 0x0}, + {"ind_mem_mask", DPP_FIELD_FLAG_RW, 20, 4, 0x0, 0x0}, + {"ind_mem_id", DPP_FIELD_FLAG_RW, 16, 4, 0x0, 0x0}, + {"ind_mem_addr", DPP_FIELD_FLAG_RW, 12, 13, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ind_dat0_reg[] = + { + {"ind_dat0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ind_dat1_reg[] = + { + {"ind_dat1", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ind_dat2_reg[] = + { + {"ind_dat2", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ind_dat3_reg[] = + { + {"ind_dat3", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_oam_tx_main_en_reg[] = + { + {"oam_tx_main_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_tx_total_num_reg[] = + { + {"tx_total_num", DPP_FIELD_FLAG_RW, 12, 13, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_oam_chk_main_en_reg[] = + { + {"oam_chk_main_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_chk_total_num0_reg[] = + { + {"chk_total_num0", DPP_FIELD_FLAG_RW, 12, 13, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ma_chk_main_en_reg[] = + { + {"oam_chk_main_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_chk_total_num1_reg[] = + { + {"chk_total_num0", DPP_FIELD_FLAG_RW, 12, 13, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_tx_stat_en_reg[] = + { + {"tx_stat_en", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_rec_stat_en_reg[] = + { + {"rec_stat_en", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_stat_oam_rdy_mask_reg[] = + { + {"stat_oam_rdy_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_session_grading0_reg[] = + { + {"session_grading0", DPP_FIELD_FLAG_RW, 2, 3, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_session_grading1_reg[] = + { + {"session_grading1", DPP_FIELD_FLAG_RW, 2, 3, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_session_grading2_reg[] = + { + {"session_grading2", DPP_FIELD_FLAG_RW, 2, 3, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_session_grading3_reg[] = + { + {"session_grading3", DPP_FIELD_FLAG_RW, 2, 3, 0x7, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_bfd_chk_haddr_reg[] = + { + {"bfd_chk_haddr", DPP_FIELD_FLAG_RW, 11, 12, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ethccm_chk_haddr_reg[] = + { + {"ethccm_chk_haddr", DPP_FIELD_FLAG_RW, 11, 12, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_tpbfd_chk_haddr_reg[] = + { + {"tpbfd_chk_haddr", DPP_FIELD_FLAG_RW, 11, 12, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_tpoam_ccm_chk_haddr_reg[] = + { + {"tpoam_ccm_chk_haddr", DPP_FIELD_FLAG_RW, 11, 12, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_bfd_tx_haddr_reg[] = + { + {"bfd_tx_haddr", DPP_FIELD_FLAG_RW, 11, 12, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ethccm_tx_haddr_reg[] = + { + {"ethccm_tx_haddr", DPP_FIELD_FLAG_RW, 11, 12, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_tpbfd_tx_haddr_reg[] = + { + {"tpbfd_tx_haddr", DPP_FIELD_FLAG_RW, 11, 12, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_tpoam_ccm_tx_haddr_reg[] = + { + {"tpoam_ccm_tx_haddr", DPP_FIELD_FLAG_RW, 11, 12, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ethccm_ma_chk_haddr_reg[] = + { + {"ethccm_ma_chk_haddr", DPP_FIELD_FLAG_RW, 11, 12, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_tpccm_ma_chk_haddr_reg[] = + { + {"tpccm_ma_chk_haddr", DPP_FIELD_FLAG_RW, 11, 12, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_groupnum_ram_clr_reg[] = + { + {"groupnum_ram_clr", DPP_FIELD_FLAG_WO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_index_ram0_clr_reg[] = + { + {"index_ram0_clr", DPP_FIELD_FLAG_WO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_index_ram1_clr_reg[] = + { + {"index_ram1_clr", DPP_FIELD_FLAG_WO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_rmep_ram_clr_reg[] = + { + {"rmep_ram_clr", DPP_FIELD_FLAG_WO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ma_ram_clr_reg[] = + { + {"ma_ram_clr", DPP_FIELD_FLAG_WO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ram_init_done_reg[] = + { + {"ram_init_done", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_rec_bfd_debug_en_reg[] = + { + {"rec_bfd_debug_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_oam_session_int_reg[] = + { + {"tpma_int", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"ethma_int", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"bfd_int", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"ethoam_int", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"tpbfd_int", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"tpoam_int", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_pon_int_reg[] = + { + {"fifo_int", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"pon_protect_int", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_oam_int_clr_reg[] = + { + {"oam_int_clr", DPP_FIELD_FLAG_WO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_type_int_clr0_reg[] = + { + {"tpma_int_clr", DPP_FIELD_FLAG_WO, 5, 1, 0x0, 0x0}, + {"ethma_int_clr", DPP_FIELD_FLAG_WO, 4, 1, 0x0, 0x0}, + {"bfd_int_clr", DPP_FIELD_FLAG_WO, 3, 1, 0x0, 0x0}, + {"ethoam_int_clr", DPP_FIELD_FLAG_WO, 2, 1, 0x0, 0x0}, + {"tpbfd_int_clr", DPP_FIELD_FLAG_WO, 1, 1, 0x0, 0x0}, + {"tpoam_int_clr", DPP_FIELD_FLAG_WO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_type_int_clr1_reg[] = + { + {"fifo_int_clr", DPP_FIELD_FLAG_WO, 1, 1, 0x0, 0x0}, + {"pon_protect_int_clr", DPP_FIELD_FLAG_WO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_interrupt_mask_reg[] = + { + {"fifo_interrupt_mask", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"pon_protect_interruptmask", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"tpma_interrupt_mask", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"ethma_interrupt_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"bfd_interrupt_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"ethoam_interrupt_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"tpbfd_interrupt_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"tpoam_interrupt_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_int0_index_reg[] = + { + {"int0_index0", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_int1_index_reg[] = + { + {"int1_index0", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_int0_index_region_reg[] = + { + {"int0_index_region", DPP_FIELD_FLAG_RO, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_int1_index_region_reg[] = + { + {"int1_index_region", DPP_FIELD_FLAG_RO, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_bdiinfo_fwft_fifo_th_reg[] = + { + {"bdiinfo_fwft_fifo_th", DPP_FIELD_FLAG_RW, 6, 7, 0x30, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_recsec_fwft_fifo_th_reg[] = + { + {"recsec_fwft_fifo_th", DPP_FIELD_FLAG_RW, 7, 8, 0x40, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_timing_chk_info0_fwft_fifo_th_reg[] = + { + {"timing_chk_info0_fwft_fifo_th", DPP_FIELD_FLAG_RW, 6, 7, 0x30, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_recma_fwft_fifo_th_reg[] = + { + {"recma_fwft_fifo_th", DPP_FIELD_FLAG_RW, 7, 8, 0x40, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_timing_chk_info1_fwft_fifo_th_reg[] = + { + {"timing_chk_info1_fwft_fifo_th", DPP_FIELD_FLAG_RW, 6, 7, 0x30, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_oam_txinst_fifo_th_reg[] = + { + {"oam_txinst_fifo_th", DPP_FIELD_FLAG_RW, 10, 11, 0x300, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_oam_rdinfo_fwft_fifo_th_reg[] = + { + {"oam_rdinfo_fwft_fifo_th", DPP_FIELD_FLAG_RW, 9, 10, 0x180, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_lm_cnt_fwft_fifo_th_reg[] = + { + {"lm_cnt_fwft_fifo_th", DPP_FIELD_FLAG_RW, 6, 7, 0x30, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_oam_pkt_fifo_th_reg[] = + { + {"oam_pkt_fifo_th", DPP_FIELD_FLAG_RW, 9, 10, 0x180, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_reclm_stat_fifo_th_reg[] = + { + {"reclm_stat_fifo_th", DPP_FIELD_FLAG_RW, 7, 8, 0x40, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_txlm_stat_fifo_th_reg[] = + { + {"txlm_stat_fifo_th", DPP_FIELD_FLAG_RW, 5, 6, 0x18, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_oam_chk_fwft_fifo_th_reg[] = + { + {"oam_chk_fwft_fifo_th", DPP_FIELD_FLAG_RW, 9, 10, 0x180, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_txoam_stat_fifo_th_reg[] = + { + {"txoam_stat_fifo_th", DPP_FIELD_FLAG_RW, 6, 7, 0x30, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_recoam_stat_fifo_th_reg[] = + { + {"recoam_stat_fifo_th", DPP_FIELD_FLAG_RW, 6, 7, 0x30, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_txpkt_data_fwft_fifo_th_reg[] = + { + {"txpkt_data_fwft_fifo_th", DPP_FIELD_FLAG_RW, 8, 9, 0xc0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_tstpkt_fwft_fifo_th_reg[] = + { + {"tstpkt_fwft_fifo_th", DPP_FIELD_FLAG_RW, 8, 9, 0x80, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_tst_txinst_fwft_fifo_th_reg[] = + { + {"tst_txinst_fwft_fifo_th", DPP_FIELD_FLAG_RW, 4, 5, 0x8, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_tstrx_main_en_reg[] = + { + {"tstrx_main_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_tsttx_cfg_para_tbl2_reg[] = + { + {"ddr_self_test_tx_en", DPP_FIELD_FLAG_RW, 16, 1, 0x0, 0x0}, + {"tm_self_test_tx_en", DPP_FIELD_FLAG_RW, 15, 1, 0x0, 0x0}, + {"fast_aging_tx_en", DPP_FIELD_FLAG_RW, 14, 1, 0x0, 0x0}, + {"timing_aging_tx_en", DPP_FIELD_FLAG_RW, 13, 1, 0x0, 0x0}, + {"backgroud_flow_tx_en", DPP_FIELD_FLAG_RW, 12, 1, 0x0, 0x0}, + {"tsttx_tx_en", DPP_FIELD_FLAG_RW, 11, 1, 0x0, 0x0}, + {"tx_freq", DPP_FIELD_FLAG_RW, 10, 3, 0x1, 0x0}, + {"tx_offset", DPP_FIELD_FLAG_RW, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_tsttx_cfg_para_tbl1_reg[] = + { + {"tx_count", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_tsttx_cfg_para_tbl0_reg[] = + { + {"fast_tx_mode_en", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + {"tsttx_tx_head_len", DPP_FIELD_FLAG_RW, 30, 15, 0x0, 0x0}, + {"tsttx_tx_interval", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_tstrx_cfg_para_reg[] = + { + {"tstrx_session_num", DPP_FIELD_FLAG_RW, 16, 16, 0x0, 0x0}, + {"tstrx_session_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_fifo_status_int_en_0_reg[] = + { + {"fifo_status_int_en_31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"fifo_status_int_en_30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"fifo_status_int_en_29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"fifo_status_int_en_28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"fifo_status_int_en_27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"fifo_status_int_en_26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"fifo_status_int_en_25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"fifo_status_int_en_24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"fifo_status_int_en_23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"fifo_status_int_en_22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"fifo_status_int_en_21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"fifo_status_int_en_20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"fifo_status_int_en_19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"fifo_status_int_en_18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"fifo_status_int_en_17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"fifo_status_int_en_16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"fifo_status_int_en_15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"fifo_status_int_en_14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"fifo_status_int_en_13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"fifo_status_int_en_12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"fifo_status_int_en_11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"fifo_status_int_en_10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"fifo_status_int_en_9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"fifo_status_int_en_8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"fifo_status_int_en_7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"fifo_status_int_en_6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"fifo_status_int_en_5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"fifo_status_int_en_4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"fifo_status_int_en_3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"fifo_status_int_en_2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"fifo_status_int_en_1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"fifo_status_int_en_0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_fifo_status_int_en_1_reg[] = + { + {"fifo_status_int_en_41", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"fifo_status_int_en_40", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"fifo_status_int_en_39", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"fifo_status_int_en_38", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"fifo_status_int_en_37", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"fifo_status_int_en_36", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"fifo_status_int_en_35", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"fifo_status_int_en_34", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"fifo_status_int_en_33", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"fifo_status_int_en_32", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_fifo_status_int_mask_0_reg[] = + { + {"fifo_status_int_mask_31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"fifo_status_int_mask_30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"fifo_status_int_mask_29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"fifo_status_int_mask_28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"fifo_status_int_mask_27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"fifo_status_int_mask_26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"fifo_status_int_mask_25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"fifo_status_int_mask_24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"fifo_status_int_mask_23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"fifo_status_int_mask_22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"fifo_status_int_mask_21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"fifo_status_int_mask_20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"fifo_status_int_mask_19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"fifo_status_int_mask_18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"fifo_status_int_mask_17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"fifo_status_int_mask_16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"fifo_status_int_mask_15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"fifo_status_int_mask_14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"fifo_status_int_mask_13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"fifo_status_int_mask_12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"fifo_status_int_mask_11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"fifo_status_int_mask_10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"fifo_status_int_mask_9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"fifo_status_int_mask_8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"fifo_status_int_mask_7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"fifo_status_int_mask_6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"fifo_status_int_mask_5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"fifo_status_int_mask_4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"fifo_status_int_mask_3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"fifo_status_int_mask_2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"fifo_status_int_mask_1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"fifo_status_int_mask_0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_fifo_status_int_mask_1_reg[] = + { + {"fifo_status_int_mask_41", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"fifo_status_int_mask_40", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"fifo_status_int_mask_39", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"fifo_status_int_mask_38", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"fifo_status_int_mask_37", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"fifo_status_int_mask_36", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"fifo_status_int_mask_35", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"fifo_status_int_mask_34", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"fifo_status_int_mask_33", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"fifo_status_int_mask_32", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_fifo_status_int_status_reg[] = + { + {"fifo_status_int_status", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_main_frequency_reg[] = + { + {"main_frequency", DPP_FIELD_FLAG_RW, 9, 10, 0x258, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_oam_cfg_type_reg[] = + { + {"oam_cfg_type", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_fst_swch_eth_head0_reg[] = + { + {"fst_swch_eth_head", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_fst_swch_eth_head1_reg[] = + { + {"fst_swch_eth_head1", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_fst_swch_eth_head2_reg[] = + { + {"fst_swch_eth_head2", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_fst_swch_eth_head3_reg[] = + { + {"fst_swch_eth_head3", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_oam_fs_txinst_fifo_th_reg[] = + { + {"oam_fs_txinst_fifo_th", DPP_FIELD_FLAG_RW, 8, 9, 0x1f4, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_oam_ma_fs_txinst_fifo_th_reg[] = + { + {"oam_ma_fs_txinst_fifo_th", DPP_FIELD_FLAG_RW, 8, 9, 0x1f4, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_pon_int_ram_clr_reg[] = + { + {"pon_int_ram_clr", DPP_FIELD_FLAG_WO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_pon_p_int_index_reg[] = + { + {"pon_p_int_index", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_pon_protect_pkt_fifo_th_reg[] = + { + {"pon_protect_pkt_fifo_th", DPP_FIELD_FLAG_RW, 8, 9, 0x1f4, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_pon_laser_off_en_reg[] = + { + {"pon_laser_off_en", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_pon_prtct_pkt_tx_en_reg[] = + { + {"pon_prtct_pkt_tx_en", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_cfg_pon_master_reg[] = + { + {"cfg_pon_master", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_level_mode_reg[] = + { + {"level_mode", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_interrupt_en_reg[] = + { + {"interrupt_en", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_pon_laser_on_en_reg[] = + { + {"pon_laser_on_en", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ti_pon_sd_reg[] = + { + {"ti_pon_sd", DPP_FIELD_FLAG_RW, 7, 8, 0x2, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ti_pon_los_reg[] = + { + {"ti_pon_los", DPP_FIELD_FLAG_RW, 7, 8, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ind_dat4_reg[] = + { + {"ind_dat4", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ind_dat5_reg[] = + { + {"ind_dat5", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ind_dat6_reg[] = + { + {"ind_dat6", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ind_dat7_reg[] = + { + {"ind_dat7", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ind_dat8_reg[] = + { + {"ind_dat8", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ind_dat9_reg[] = + { + {"ind_dat9", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ind_dat10_reg[] = + { + {"ind_dat10", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ind_dat11_reg[] = + { + {"ind_dat11", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ind_dat12_reg[] = + { + {"ind_dat12", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ind_dat13_reg[] = + { + {"ind_dat13", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ind_dat14_reg[] = + { + {"ind_dat14", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ind_dat15_reg[] = + { + {"ind_dat15", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_oam_2544_pkt_fifo_th_reg[] = + { + {"oam_2544_pkt_fifo_th", DPP_FIELD_FLAG_RW, 8, 9, 0xc0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_txinfo_ram_clr_reg[] = + { + {"txinfo_ram_clr", DPP_FIELD_FLAG_WO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_txinfo_ram_init_done_reg[] = + { + {"txinfo_ram_init_done", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_fifo_status_int_status40_reg[] = + { + {"fifo_status_int_status40", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_fifo_status_int_status41_reg[] = + { + {"fifo_status_int_status41", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_oam_2544_fun_en_reg[] = + { + {"oam_2544_fun_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_oam_2544_stat_clr_reg[] = + { + {"oam_2544_stat_clr", DPP_FIELD_FLAG_WO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_txdis_default_reg[] = + { + {"txdis_default", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_txdis_default_en_reg[] = + { + {"txdis_default_en", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_tpbfd_firstchk_th_reg[] = + { + {"tpbfd_firstchk_th", DPP_FIELD_FLAG_RW, 18, 19, 0xc350, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_ethccm_firstchk_th_reg[] = + { + {"ethccm_firstchk_th", DPP_FIELD_FLAG_RW, 18, 19, 0xc350, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_tpccm_firstchk_th_reg[] = + { + {"tpccm_firstchk_th", DPP_FIELD_FLAG_RW, 18, 19, 0xc350, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_txstat_req_cnt_reg[] = + { + {"txstat_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_chkstat_req_cnt_reg[] = + { + {"chkstat_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_stat_oam_fc_cnt_reg[] = + { + {"stat1_oam_fc_cnt", DPP_FIELD_FLAG_RC, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_bfdseq_req_cnt_reg[] = + { + {"bfdseq_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_lmcnt_req_cnt_reg[] = + { + {"lmcnt_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_stat_oam_lm_rsp_cnt_reg[] = + { + {"stat2_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_stat_oam_lm_fc_cnt_reg[] = + { + {"stat2_oam_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_se_req_cnt_reg[] = + { + {"se_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_se_rsp_cnt_reg[] = + { + {"se_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_se_oam_fc_cnt_reg[] = + { + {"se_oam_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_oam_se_fc_cnt_reg[] = + { + {"oam_se_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_oam_pktrx_sop_cnt_reg[] = + { + {"oam_pktrx_sop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_oam_pktrx_eop_cnt_reg[] = + { + {"oam_pktrx_eop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_pktrx_oam_fc_cnt_reg[] = + { + {"pktrx_oam_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_pktrx_oam_tst_fc_cnt_reg[] = + { + {"pktrx_oam_tst_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_odma_oam_sop_cnt_reg[] = + { + {"odma_oam_sop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_odma_oam_eop_cnt_reg[] = + { + {"odma_oam_eop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_oam_odma_fc_cnt_reg[] = + { + {"oam_odma_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_rec_ma_pkt_illegal_cnt_reg[] = + { + {"rec_ma_pkt_illegal_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_rec_rmep_pkt_illegal_cnt_reg[] = + { + {"rec_rmep_pkt_illegal_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_rec_eth_ais_pkt_cnt_reg[] = + { + {"rec_eth_ais_pkt_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_rec_tp_ais_pkt_cnt_reg[] = + { + {"rec_tp_ais_pkt_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_rec_tp_csf_pkt_cnt_reg[] = + { + {"rec_tp_csf_pkt_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_rec_eth_level_defect_cnt_reg[] = + { + {"rec_eth_level_defect_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_rec_eth_megid_defect_cnt_reg[] = + { + {"rec_eth_megid_defect_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_rec_eth_mepid_defect_cnt_reg[] = + { + {"rec_eth_mepid_defect_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_rec_eth_interval_defect_cnt_reg[] = + { + {"rec_eth_interval_defect_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_rec_sess_unenable_cnt_reg[] = + { + {"rec_sess_unenable_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_oam_2544_rd_pkt_cnt_reg[] = + { + {"oam_2544_rd_pkt_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_debug_cnt_clr_reg[] = + { + {"debug_cnt_clr", DPP_FIELD_FLAG_WO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_oam_pktrx_catch_data_reg[] = + { + {"oam_pktrx_catch_data", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_odma_oam_catch_data_reg[] = + { + {"odma_oam_catch_data", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_tst_session_tx_cnt_reg[] = + { + {"tst_session_tx_cnt", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_tst_session_rx_cnt_reg[] = + { + {"tst_session_rx_cnt", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_tstrx_lost_cnt_reg[] = + { + {"tstrx_lost_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_bfdseq_wr_cnt_reg[] = + { + {"bfdseq_wr_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_bfdtime_wr_cnt_reg[] = + { + {"bfdtime_wr_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_lmcnt_wr_cnt_reg[] = + { + {"lmcnt_wr_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_oam_fs_pkt_cnt_reg[] = + { + {"oam_fs_pkt_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_oam_ma_fs_pkt_cnt_reg[] = + { + {"lmcnt_wr_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_rec_tp_level_defect_cnt_reg[] = + { + {"rec_tp_level_defect_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_rec_tp_megid_defect_cnt_reg[] = + { + {"rec_tp_megid_defect_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_rec_tp_mepid_defect_cnt_reg[] = + { + {"rec_tp_mepid_defect_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_rec_tp_interval_defect_cnt_reg[] = + { + {"rec_tp_interval_defect_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_rd_reg_clear_mode_reg[] = + { + {"rd_clear_mode_cfg", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_stat_rd_data_reg_clear_mode_reg[] = + { + {"rd_data_reg_clear_mode_cfg", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_indir_oam_int_status_ram_0_reg[] = + { + {"bfd_diag_value_bit4", DPP_FIELD_FLAG_RO, 6, 1, 0x0, 0x0}, + {"bfd_diag_value_bit3", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"bfd_diag_value_bit2", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"bfd_diag_value_bit1", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"bfd_diag_value_bit0", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"dloc_int", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"drdi_int", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_indir_oam_int_status_ram1_reg[] = + { + {"sticky_error_level_defect", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"sticky_error_megid_defect", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"sticky_error_mepid_defect", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"sticky_error_inter_defect", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"sticky_ais_defect", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"sticky_csf_defect", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"current_error_level_defect", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"current_error_megid_defect", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"current_error_mepid_defect", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"current_error_inter_defect", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"current_ais_defect", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"current_csf_defect", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_indir_tst_pkt_tx_para_ram_reg[] = + { + {"ddr_self_test_tx_en", DPP_FIELD_FLAG_RW, 80, 1, 0x0, 0x0}, + {"tm_self_test_tx_en", DPP_FIELD_FLAG_RW, 79, 1, 0x0, 0x0}, + {"fast_aging_tx_en", DPP_FIELD_FLAG_RW, 78, 1, 0x0, 0x0}, + {"timing_aging_tx_en", DPP_FIELD_FLAG_RW, 77, 1, 0x0, 0x0}, + {"backgroud_flow_tx_en", DPP_FIELD_FLAG_RW, 76, 1, 0x0, 0x0}, + {"tsttx_session_en", DPP_FIELD_FLAG_RW, 75, 1, 0x0, 0x0}, + {"tx_freq", DPP_FIELD_FLAG_RW, 74, 3, 0x0, 0x0}, + {"tx_offset", DPP_FIELD_FLAG_RW, 71, 8, 0x0, 0x0}, + {"tx_count", DPP_FIELD_FLAG_RW, 63, 32, 0x0, 0x0}, + {"fast_tx_mode_en", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + {"tsttx_pkthead_len", DPP_FIELD_FLAG_RW, 30, 15, 0x0, 0x0}, + {"tsttx_interval", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_indir_groupnumram_reg[] = + { + {"mep_down_num", DPP_FIELD_FLAG_RW, 8, 9, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_indir_oam_tx_tbl_ram_reg[] = + { + {"oam_tx_en", DPP_FIELD_FLAG_RW, 62, 1, 0x0, 0x0}, + {"oam_tx_type", DPP_FIELD_FLAG_RW, 61, 4, 0x0, 0x0}, + {"oam_fetch_len", DPP_FIELD_FLAG_RW, 57, 14, 0x0, 0x0}, + {"bfd_seq_tx_en", DPP_FIELD_FLAG_RW, 43, 1, 0x0, 0x0}, + {"tx_para", DPP_FIELD_FLAG_RW, 42, 7, 0x0, 0x0}, + {"oam_tx_interval", DPP_FIELD_FLAG_RW, 35, 16, 0x0, 0x0}, + {"hd_ena_flag", DPP_FIELD_FLAG_RO, 19, 1, 0x0, 0x0}, + {"last_tx_time", DPP_FIELD_FLAG_RO, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_indir_oam_chk_tbl_ram_reg[] = + { + {"fast_switch_en", DPP_FIELD_FLAG_RW, 55, 1, 0x0, 0x0}, + {"oam_chk_en", DPP_FIELD_FLAG_RW, 54, 1, 0x0, 0x0}, + {"oam_chk_type", DPP_FIELD_FLAG_RW, 53, 4, 0x0, 0x0}, + {"ccm_predel_flag", DPP_FIELD_FLAG_RW, 49, 1, 0x0, 0x0}, + {"lm_chk_en", DPP_FIELD_FLAG_RW, 48, 1, 0x0, 0x0}, + {"ccm_group_id", DPP_FIELD_FLAG_RW, 47, 12, 0x0, 0x0}, + {"oam_chk_internal", DPP_FIELD_FLAG_RW, 35, 16, 0x0, 0x0}, + {"fist_chk_flag", DPP_FIELD_FLAG_RO, 19, 1, 0x0, 0x0}, + {"last_chk_time", DPP_FIELD_FLAG_RO, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_indir_oam_ma_chk_tbl_ram_reg[] = + { + {"ma_fast_switch_en", DPP_FIELD_FLAG_RW, 141, 1, 0x0, 0x0}, + {"ma_chk_en", DPP_FIELD_FLAG_RW, 140, 1, 0x0, 0x0}, + {"ma_type", DPP_FIELD_FLAG_RW, 139, 1, 0x0, 0x0}, + {"error_level_defect_en", DPP_FIELD_FLAG_RW, 138, 1, 0x0, 0x0}, + {"error_megid_defect_en", DPP_FIELD_FLAG_RW, 137, 1, 0x0, 0x0}, + {"error_mepid_defect_en", DPP_FIELD_FLAG_RW, 136, 1, 0x0, 0x0}, + {"error_inter_defect_en", DPP_FIELD_FLAG_RW, 135, 1, 0x0, 0x0}, + {"ais_defect_en", DPP_FIELD_FLAG_RW, 134, 1, 0x0, 0x0}, + {"csf_defect_en", DPP_FIELD_FLAG_RW, 133, 1, 0x0, 0x0}, + {"error_level_defect_ccm", DPP_FIELD_FLAG_RW, 132, 3, 0x0, 0x0}, + {"error_megid_defect_ccm", DPP_FIELD_FLAG_RW, 129, 3, 0x0, 0x0}, + {"error_mepid_defect_ccm", DPP_FIELD_FLAG_RW, 126, 3, 0x0, 0x0}, + {"error_inter_defect_ccm", DPP_FIELD_FLAG_RW, 123, 3, 0x0, 0x0}, + {"ais_defect_ccm", DPP_FIELD_FLAG_RW, 120, 3, 0x0, 0x0}, + {"csf_defect_ccm", DPP_FIELD_FLAG_RW, 117, 3, 0x0, 0x0}, + {"ma_predel_en", DPP_FIELD_FLAG_RW, 114, 1, 0x0, 0x0}, + {"error_level_defect_ts", DPP_FIELD_FLAG_RO, 113, 19, 0x0, 0x0}, + {"error_megid_defect_ts", DPP_FIELD_FLAG_RO, 94, 19, 0x0, 0x0}, + {"error_mepid_defect_ts", DPP_FIELD_FLAG_RO, 75, 19, 0x0, 0x0}, + {"error_inter_defect_ts", DPP_FIELD_FLAG_RO, 56, 19, 0x0, 0x0}, + {"ais_defect_ts", DPP_FIELD_FLAG_RO, 37, 19, 0x0, 0x0}, + {"csf_defect_ts", DPP_FIELD_FLAG_RO, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_nppu_oam_cfg_indir_oam_2544_tx_ram_reg[] = + { + {"tx_en_2544", DPP_FIELD_FLAG_RW, 46, 1, 0x0, 0x0}, + {"tx_cfg_times_2544", DPP_FIELD_FLAG_RW, 45, 16, 0x0, 0x0}, + {"current_times", DPP_FIELD_FLAG_RW, 29, 16, 0x0, 0x0}, + {"slice_num", DPP_FIELD_FLAG_RW, 13, 7, 0x0, 0x0}, + {"pkt_mty", DPP_FIELD_FLAG_RW, 6, 7, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_interrupt_en_r_reg[] = + { + {"interrupt_en_r", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_mec_host_interrupt_reg[] = + { + {"mec_host_interrupt", DPP_FIELD_FLAG_RO, 5, 6, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_dbg_rtl_date_reg[] = + { + {"dbg_rtl_date", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_dup_start_num_cfg_reg[] = + { + {"dup_start_num_cfg", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_debug_data_write_complete_reg[] = + { + {"debug_data_write_complete", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_uc_mc_wrr_cfg_reg[] = + { + {"uc_mc_wrr_cfg", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_debug_pkt_send_en_reg[] = + { + {"debug_pkt_send_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_dup_tbl_ind_access_done_reg[] = + { + {"dup_tbl_ind_access_done", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_isu_ppu_demux_fifo_interrupt_mask_reg[] = + { + {"isu_in_para_fwft_fifo_32x81_wrapper_u0_overflow_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"isu_in_para_fwft_fifo_32x81_wrapper_u0_underflow_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"isu_in_fifo_64x81_wrapper_u0_overflow_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"isu_in_fifo_64x81_wrapper_u0_underflow_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_multicast_fifo_interrupt_mask_reg[] = + { + {"ppu_pktrx_mc_ptr_fifo_16384x17_wrapper_u0_underflow_mask", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"ppu_pktrx_mc_ptr_fifo_16384x17_wrapper_u0_overflow_mask", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"pf_req_fwft_fifo_16x36_wrapper_u0_overflow_mask", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"pf_req_fwft_fifo_16x36_wrapper_u0_underflow_mask", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"pf_rsp_fwft_fifo_32x34_wrapper_u0_overflow_mask", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"pf_rsp_fwft_fifo_32x34_wrapper_u0_underflow_mask", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"dup_para_fwft_fifo_16x35_wrapper_u0_overflow_mask", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"dup_para_fwft_fifo_16x35_wrapper_u0_underflow_mask", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"se_mc_rsp_fwft_fifo_32x17_wrapper_u0_overflow_mask", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"se_mc_rsp_fwft_fifo_32x17_wrapper_u0_underflow_mask", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"sa_para_fwft_fifo_64x17_wrapper_u0_overflow_mask", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"sa_para_fwft_fifo_64x17_wrapper_u0_underflow_mask", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"group_id_fifo_64x16_wrapper_u0_overflow_mask", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"group_id_fifo_64x16_wrapper_u0_underflow_mask", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"isu_mc_para_fwft_fifo_128x34_wrapper_u0_overflow_mask", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"isu_mc_para_fwft_fifo_128x34_wrapper_u0_underflow_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"dup_freeptr_fwft_fifo_128x7_wrapper_u0_overflow_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"dup_freeptr_fwft_fifo_128x7_wrapper_u0_underflow_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"car_flag_fifo_32x1_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"car_flag_fifo_32x1_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_in_schedule_fifo_interrupt_mask_reg[] = + { + {"free_global_num_fwft_fifo_8192x13_wrapper_u0_overflow_mask", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"free_global_num_fwft_fifo_8192x13_wrapper_u0_underflow_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"mc_mf_fifo_16x2048_wrapper_u0_overflow_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"mc_mf_fifo_16x2048_wrapper_u0_underflow_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"uc_mf_fifo_96x2048_wrapper_u0_overflow_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"uc_mf_fifo_96x2048_wrapper_u0_underflow_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_mf_out_fifo_interrupt_mask_reg[] = + { + {"ppu_cluster5_mf_out_afifo_32x2048_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"ppu_cluster5_mf_out_afifo_32x2048_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"ppu_cluster4_mf_out_afifo_32x2048_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"ppu_cluster4_mf_out_afifo_32x2048_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"ppu_cluster3_mf_out_afifo_32x2048_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"ppu_cluster3_mf_out_afifo_32x2048_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"ppu_cluster2_mf_out_afifo_32x2048_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"ppu_cluster2_mf_out_afifo_32x2048_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"ppu_cluster1_mf_out_afifo_32x2048_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"ppu_cluster1_mf_out_afifo_32x2048_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"ppu_cluster0_mf_out_afifo_32x2048_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"ppu_cluster0_mf_out_afifo_32x2048_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pbu_mcode_pf_req_schedule_fifo_interrupt_mask_reg[] = + { + {"ppu_cluster5_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"ppu_cluster4_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"ppu_cluster3_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"ppu_cluster2_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"ppu_cluster1_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"ppu_cluster0_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"ppu_cluster5_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"ppu_cluster4_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"ppu_cluster3_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"ppu_cluster2_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"ppu_cluster1_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"ppu_cluster0_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pbu_mcode_pf_rsp_schedule_fifo_interrupt_mask_reg[] = + { + {"ppu_pbu_mcode_pf_rsp_afifo_64x16_wrapper_u0r_underflow_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"ppu_pbu_mcode_pf_rsp_afifo_64x16_wrapper_u0_overflow_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_mccnt_fifo_interrupt_mask_reg[] = + { + {"ppu_mccnt_fifo_32x15_wrapper_u0_overflow_mask", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"ppu_mccnt_fifo_32x15_wrapper_u0_underflow_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"ppu_wb_data_fifo_32x2048_wrapper_u0_overflow_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"ppu_wb_data_fifo_32x2048_wrapper_u0_underflow_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"mccnt_rsp_fifo_32x1_wrapper_u0_overflow_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"mccnt_rsp_fifo_32x1_wrapper_u0_underflow_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_coprocessor_fifo_interrupt_mask_l_reg[] = + { + {"mec3_cop_key_crc_fifo_32x625_wrapper_overflow_flg_mask", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"mec3_cop_key_crc_fifo_32x625_wrapper_underflow_flg_mask", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"mec3_cop_key_checksum_fifo_32x180_wrapper_overflow_flg_mask", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"mec3_cop_key_checksum_fifo_32x180_wrapper_underflow_flg_mask", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"mec3_cop_key_mul_fifo_32x52_wrapper_overflow_flg_mask", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"mec3_cop_key_mul_fifo_32x52_wrapper_underflow_flg_mask", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"mec3_cop_key_random_mod_fifo_32x44_wrapper_overflow_flg_mask", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"mec3_cop_key_random_mod_fifo_32x44_wrapper_underflow_flg_mask", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"mec2_cop_key_crc_fifo_32x625_wrapper_overflow_flg_mask", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"mec2_cop_key_crc_fifo_32x625_wrapper_underflow_flg_mask", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"mec2_cop_key_checksum_fifo_32x180_wrapper_overflow_flg_mask", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"mec2_cop_key_checksum_fifo_32x180_wrapper_underflow_flg_mask", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"mec2_cop_key_mul_fifo_32x52_wrapper_overflow_flg_mask", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"mec2_cop_key_mul_fifo_32x52_wrapper_underflow_flg_mask", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"mec2_cop_key_random_mod_fifo_32x44_wrapper_overflow_flg_mask", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"mec2_cop_key_random_mod_fifo_32x44_wrapper_underflow_flg_mask", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"mec1_cop_key_crc_fifo_32x625_wrapper_overflow_flg_mask", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"mec1_cop_key_crc_fifo_32x625_wrapper_underflow_flg_mask", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"mec1_cop_key_checksum_fifo_32x180_wrapper_overflow_flg_mask", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"mec1_cop_key_checksum_fifo_32x180_wrapper_underflow_flg_mask", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"mec1_cop_key_mul_fifo_32x52_wrapper_overflow_flg_mask", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"mec1_cop_key_mul_fifo_32x52_wrapper_underflow_flg_mask", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"mec1_cop_key_random_mod_fifo_32x44_wrapper_overflow_flg_mask", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"mec1_cop_key_random_mod_fifo_32x44_wrapper_underflow_flg_mask", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"mec0_cop_key_crc_fifo_32x625_wrapper_overflow_flg_mask", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"mec0_cop_key_crc_fifo_32x625_wrapper_underflow_flg_mask", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"mec0_cop_key_checksum_fifo_32x180_wrapper_overflow_flg_mask", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"mec0_cop_key_checksum_fifo_32x180_wrapper_underflow_flg_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"mec0_cop_key_mul_fifo_32x52_wrapper_overflow_flg_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"mec0_cop_key_mul_fifo_32x52_wrapper_underflow_flg_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"mec0_cop_key_random_mod_fifo_32x44_wrapper_overflow_flg_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"mec0_cop_key_random_mod_fifo_32x44_wrapper_underflow_flg_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_coprocessor_fifo_interrupt_mask_m_reg[] = + { + {"ppu_cop_result_fwft_fifo_80x80_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"ppu_cop_result_fwft_fifo_80x80_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"ppu_cop_delay_fifo_48x16_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"ppu_cop_delay_fifo_48x16_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"ppu_cop_delay_fifo_16x48_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"ppu_cop_delay_fifo_16x48_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"ppu_cop_delay_fifo_16x32_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"ppu_cop_delay_fifo_16x32_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"ppu_cop_result_fwft_fifo_96x80_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"ppu_cop_result_fwft_fifo_96x80_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"ppu_cop_delay_fifo_16x16_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"ppu_cop_delay_fifo_16x16_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"ppu_cop_result_fwft_fifo_32x80_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"ppu_cop_result_fwft_fifo_32x80_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"ppu_cop_result_fwft_fifo_16x80_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"ppu_cop_result_fwft_fifo_16x80_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"mec5_cop_key_crc_fifo_32x625_wrapper_overflow_flg_mask", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"mec5_cop_key_crc_fifo_32x625_wrapper_underflow_flg_mask", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"mec5_cop_key_checksum_fifo_32x180_wrapper_overflow_flg_mask", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"mec5_cop_key_checksum_fifo_32x180_wrapper_underflow_flg_mask", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"mec5_cop_key_mul_fifo_32x52_wrapper_overflow_flg_mask", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"mec5_cop_key_mul_fifo_32x52_wrapper_underflow_flg_mask", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"mec5_cop_key_random_mod_fifo_32x44_wrapper_overflow_flg_mask", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"mec5_cop_key_random_mod_fifo_32x44_wrapper_underflow_flg_mask", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"mec4_cop_key_crc_fifo_32x625_wrapper_overflow_flg_mask", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"mec4_cop_key_crc_fifo_32x625_wrapper_underflow_flg_mask", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"mec4_cop_key_checksum_fifo_32x180_wrapper_overflow_flg_mask", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"mec4_cop_key_checksum_fifo_32x180_wrapper_underflow_flg_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"mec4_cop_key_mul_fifo_32x52_wrapper_overflow_flg_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"mec4_cop_key_mul_fifo_32x52_wrapper_underflow_flg_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"mec4_cop_key_random_mod_fifo_32x44_wrapper_overflow_flg_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"mec4_cop_key_random_mod_fifo_32x44_wrapper_underflow_flg_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_coprocessor_fifo_interrupt_mask_h_reg[] = + { + {"coprocessor_fwft_fifo_16x80_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"coprocessor_fwft_fifo_16x80_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"ppu_cop_random_mod_para_delay_fifo_48x16_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"ppu_cop_random_mod_para_delay_fifo_48x16_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_ram_check_err_mask_reg[] = + { + {"parity_err_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_fifo_interrupt_mask_reg[] = + { + {"instrmem2_wr_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"instrmem2_wr_fifo_udf_mask", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"instrmem2_rd_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"instrmem2_rd_fifo_udf_mask", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"instrmem1_wr_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"instrmem1_wr_fifo_udf_mask", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"instrmem1_rd_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"instrmem1_rd_fifo_udf_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"instrmem0_wr_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"instrmem0_wr_fifo_udf_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"instrmem0_rd_fifo_ovf_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"instrmem0_rd_fifo_udf_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_isu_ppu_demux_fifo_interrupt_sta_reg[] = + { + {"isu_in_para_fwft_fifo_32x81_wrapper_u0_overflow_sta", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"isu_in_para_fwft_fifo_32x81_wrapper_u0_underflow_sta", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"isu_in_fifo_64x81_wrapper_u0_overflow_sta", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"isu_in_fifo_64x81_wrapper_u0_underflow_sta", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_multicast_fifo_interrupt_sta_reg[] = + { + {"ppu_pktrx_mc_ptr_fifo_16384x17_wrapper_u0_overflow_sta", DPP_FIELD_FLAG_RO, 19, 1, 0x0, 0x0}, + {"ppu_pktrx_mc_ptr_fifo_16384x17_wrapper_u0_underflow_sta", DPP_FIELD_FLAG_RO, 18, 1, 0x0, 0x0}, + {"pf_req_fwft_fifo_16x36_wrapper_u0_overflow_sta", DPP_FIELD_FLAG_RO, 17, 1, 0x0, 0x0}, + {"pf_req_fwft_fifo_16x36_wrapper_u0_underflow_sta", DPP_FIELD_FLAG_RO, 16, 1, 0x0, 0x0}, + {"pf_rsp_fwft_fifo_32x34_wrapper_u0_overflow_sta", DPP_FIELD_FLAG_RO, 15, 1, 0x0, 0x0}, + {"pf_rsp_fwft_fifo_32x34_wrapper_u0_underflow_sta", DPP_FIELD_FLAG_RO, 14, 1, 0x0, 0x0}, + {"dup_para_fwft_fifo_16x35_wrapper_u0_overflow_sta", DPP_FIELD_FLAG_RO, 13, 1, 0x0, 0x0}, + {"dup_para_fwft_fifo_16x35_wrapper_u0_underflow_sta", DPP_FIELD_FLAG_RO, 12, 1, 0x0, 0x0}, + {"se_mc_rsp_fwft_fifo_32x17_wrapper_u0_overflow_sta", DPP_FIELD_FLAG_RO, 11, 1, 0x0, 0x0}, + {"se_mc_rsp_fwft_fifo_32x17_wrapper_u0_underflow_sta", DPP_FIELD_FLAG_RO, 10, 1, 0x0, 0x0}, + {"sa_para_fwft_fifo_64x17_wrapper_u0_overflow_sta", DPP_FIELD_FLAG_RO, 9, 1, 0x0, 0x0}, + {"sa_para_fwft_fifo_64x17_wrapper_u0_underflow_sta", DPP_FIELD_FLAG_RO, 8, 1, 0x0, 0x0}, + {"group_id_fifo_64x16_wrapper_u0_overflow_sta", DPP_FIELD_FLAG_RO, 7, 1, 0x0, 0x0}, + {"group_id_fifo_64x16_wrapper_u0_underflow_sta", DPP_FIELD_FLAG_RO, 6, 1, 0x0, 0x0}, + {"isu_mc_para_fwft_fifo_128x34_wrapper_u0_overflow_sta", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"isu_mc_para_fwft_fifo_128x34_wrapper_u0_underflow_sta", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"dup_freeptr_fwft_fifo_128x7_wrapper_u0_overflow_sta", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"dup_freeptr_fwft_fifo_128x7_wrapper_u0_underflow_sta", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"car_flag_fifo_32x1_wrapper_overflow_sta", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"car_flag_fifo_32x1_wrapper_underflow_sta", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_in_schedule_fifo_interrupt_sta_reg[] = + { + {"free_global_num_fwft_fifo_8192x13_wrapper_u0_overflow_sta", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"free_global_num_fwft_fifo_8192x13_wrapper_u0_underflow_sta", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"mc_mf_fifo_16x2048_wrapper_u0_overflow_sta", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"mc_mf_fifo_16x2048_wrapper_u0_underflow_sta", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"uc_mf_fifo_96x2048_wrapper_u0_overflow_sta", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"uc_mf_fifo_96x2048_wrapper_u0_underflow_sta", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_mf_out_fifo_interrupt_sta_reg[] = + { + {"ppu_cluster5_mf_out_afifo_32x2048_wrapper_overflow_sta", DPP_FIELD_FLAG_RO, 11, 1, 0x0, 0x0}, + {"ppu_cluster5_mf_out_afifo_32x2048_wrapper_underflow_sta", DPP_FIELD_FLAG_RO, 10, 1, 0x0, 0x0}, + {"ppu_cluster4_mf_out_afifo_32x2048_wrapper_overflow_sta", DPP_FIELD_FLAG_RO, 9, 1, 0x0, 0x0}, + {"ppu_cluster4_mf_out_afifo_32x2048_wrapper_underflow_sta", DPP_FIELD_FLAG_RO, 8, 1, 0x0, 0x0}, + {"ppu_cluster3_mf_out_afifo_32x2048_wrapper_overflow_sta", DPP_FIELD_FLAG_RO, 7, 1, 0x0, 0x0}, + {"ppu_cluster3_mf_out_afifo_32x2048_wrapper_underflow_sta", DPP_FIELD_FLAG_RO, 6, 1, 0x0, 0x0}, + {"ppu_cluster2_mf_out_afifo_32x2048_wrapper_overflow_sta", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"ppu_cluster2_mf_out_afifo_32x2048_wrapper_underflow_sta", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"ppu_cluster1_mf_out_afifo_32x2048_wrapper_overflow_sta", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"ppu_cluster1_mf_out_afifo_32x2048_wrapper_underflow_sta", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"ppu_cluster0_mf_out_afifo_32x2048_wrapper_overflow_sta", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"ppu_cluster0_mf_out_afifo_32x2048_wrapper_underflow_sta", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pbu_mcode_pf_req_schedule_fifo_interrupt_sta_reg[] = + { + {"ppu_cluster5_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_sta", DPP_FIELD_FLAG_RO, 11, 1, 0x0, 0x0}, + {"ppu_cluster4_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_sta", DPP_FIELD_FLAG_RO, 10, 1, 0x0, 0x0}, + {"ppu_cluster3_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_sta", DPP_FIELD_FLAG_RO, 9, 1, 0x0, 0x0}, + {"ppu_cluster2_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_sta", DPP_FIELD_FLAG_RO, 8, 1, 0x0, 0x0}, + {"ppu_cluster1_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_sta", DPP_FIELD_FLAG_RO, 7, 1, 0x0, 0x0}, + {"ppu_cluster0_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_sta", DPP_FIELD_FLAG_RO, 6, 1, 0x0, 0x0}, + {"ppu_cluster5_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_sta", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"ppu_cluster4_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_sta", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"ppu_cluster3_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_sta", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"ppu_cluster2_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_sta", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"ppu_cluster1_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_sta", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"ppu_cluster0_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_sta", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pbu_mcode_pf_rsp_schedule_fifo_interrupt_sta_reg[] = + { + {"ppu_pbu_mcode_pf_rsp_afifo_64x16_wrapper_u0r_underflow_sta", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"ppu_pbu_mcode_pf_rsp_afifo_64x16_wrapper_u0_overflow_sta", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_mccnt_fifo_interrupt_sta_reg[] = + { + {"ppu_mccnt_fifo_32x15_wrapper_u0_overflow_sta", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"ppu_mccnt_fifo_32x15_wrapper_u0_underflow_sta", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"ppu_wb_data_fifo_32x2048_wrapper_u0_overflow_sta", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"ppu_wb_data_fifo_32x2048_wrapper_u0_underflow_sta", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"mccnt_rsp_fifo_32x1_wrapper_u0_overflow_sta", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"mccnt_rsp_fifo_32x1_wrapper_u0_underflow_sta", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_coprocessor_fifo_interrupt_sta_l_reg[] = + { + {"mec3_cop_key_crc_fifo_32x625_wrapper_overflow_flg_sta", DPP_FIELD_FLAG_RO, 31, 1, 0x0, 0x0}, + {"mec3_cop_key_crc_fifo_32x625_wrapper_underflow_flg_sta", DPP_FIELD_FLAG_RO, 30, 1, 0x0, 0x0}, + {"mec3_cop_key_checksum_fifo_32x180_wrapper_overflow_flg_sta", DPP_FIELD_FLAG_RO, 29, 1, 0x0, 0x0}, + {"mec3_cop_key_checksum_fifo_32x180_wrapper_underflow_flg_sta", DPP_FIELD_FLAG_RO, 28, 1, 0x0, 0x0}, + {"mec3_cop_key_mul_fifo_32x52_wrapper_overflow_flg_sta", DPP_FIELD_FLAG_RO, 27, 1, 0x0, 0x0}, + {"mec3_cop_key_mul_fifo_32x52_wrapper_underflow_flg_sta", DPP_FIELD_FLAG_RO, 26, 1, 0x0, 0x0}, + {"mec3_cop_key_random_mod_fifo_32x44_wrapper_overflow_flg_sta", DPP_FIELD_FLAG_RO, 25, 1, 0x0, 0x0}, + {"mec3_cop_key_random_mod_fifo_32x44_wrapper_underflow_flg_sta", DPP_FIELD_FLAG_RO, 24, 1, 0x0, 0x0}, + {"mec2_cop_key_crc_fifo_32x625_wrapper_overflow_flg_sta", DPP_FIELD_FLAG_RO, 23, 1, 0x0, 0x0}, + {"mec2_cop_key_crc_fifo_32x625_wrapper_underflow_flg_sta", DPP_FIELD_FLAG_RO, 22, 1, 0x0, 0x0}, + {"mec2_cop_key_checksum_fifo_32x180_wrapper_overflow_flg_sta", DPP_FIELD_FLAG_RO, 21, 1, 0x0, 0x0}, + {"mec2_cop_key_checksum_fifo_32x180_wrapper_underflow_flg_sta", DPP_FIELD_FLAG_RO, 20, 1, 0x0, 0x0}, + {"mec2_cop_key_mul_fifo_32x52_wrapper_overflow_flg_sta", DPP_FIELD_FLAG_RO, 19, 1, 0x0, 0x0}, + {"mec2_cop_key_mul_fifo_32x52_wrapper_underflow_flg_sta", DPP_FIELD_FLAG_RO, 18, 1, 0x0, 0x0}, + {"mec2_cop_key_random_mod_fifo_32x44_wrapper_overflow_flg_sta", DPP_FIELD_FLAG_RO, 17, 1, 0x0, 0x0}, + {"mec2_cop_key_random_mod_fifo_32x44_wrapper_underflow_flg_sta", DPP_FIELD_FLAG_RO, 16, 1, 0x0, 0x0}, + {"mec1_cop_key_crc_fifo_32x625_wrapper_overflow_flg_sta", DPP_FIELD_FLAG_RO, 15, 1, 0x0, 0x0}, + {"mec1_cop_key_crc_fifo_32x625_wrapper_underflow_flg_sta", DPP_FIELD_FLAG_RO, 14, 1, 0x0, 0x0}, + {"mec1_cop_key_checksum_fifo_32x180_wrapper_overflow_flg_sta", DPP_FIELD_FLAG_RO, 13, 1, 0x0, 0x0}, + {"mec1_cop_key_checksum_fifo_32x180_wrapper_underflow_flg_sta", DPP_FIELD_FLAG_RO, 12, 1, 0x0, 0x0}, + {"mec1_cop_key_mul_fifo_32x52_wrapper_overflow_flg_sta", DPP_FIELD_FLAG_RO, 11, 1, 0x0, 0x0}, + {"mec1_cop_key_mul_fifo_32x52_wrapper_underflow_flg_sta", DPP_FIELD_FLAG_RO, 10, 1, 0x0, 0x0}, + {"mec1_cop_key_random_mod_fifo_32x44_wrapper_overflow_flg_sta", DPP_FIELD_FLAG_RO, 9, 1, 0x0, 0x0}, + {"mec1_cop_key_random_mod_fifo_32x44_wrapper_underflow_flg_sta", DPP_FIELD_FLAG_RO, 8, 1, 0x0, 0x0}, + {"mec0_cop_key_crc_fifo_32x625_wrapper_overflow_flg_sta", DPP_FIELD_FLAG_RO, 7, 1, 0x0, 0x0}, + {"mec0_cop_key_crc_fifo_32x625_wrapper_underflow_flg_sta", DPP_FIELD_FLAG_RO, 6, 1, 0x0, 0x0}, + {"mec0_cop_key_checksum_fifo_32x180_wrapper_overflow_flg_sta", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"mec0_cop_key_checksum_fifo_32x180_wrapper_underflow_flg_sta", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"mec0_cop_key_mul_fifo_32x52_wrapper_overflow_flg_sta", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"mec0_cop_key_mul_fifo_32x52_wrapper_underflow_flg_sta", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"mec0_cop_key_random_mod_fifo_32x44_wrapper_overflow_flg_sta", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"mec0_cop_key_random_mod_fifo_32x44_wrapper_underflow_flg_sta", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_coprocessor_fifo_interrupt_sta_m_reg[] = + { + {"ppu_cop_result_fwft_fifo_80x80_wrapper_overflow_sta", DPP_FIELD_FLAG_RO, 31, 1, 0x0, 0x0}, + {"ppu_cop_result_fwft_fifo_80x80_wrapper_underflow_sta", DPP_FIELD_FLAG_RO, 30, 1, 0x0, 0x0}, + {"ppu_cop_delay_fifo_48x16_wrapper_overflow_sta", DPP_FIELD_FLAG_RO, 29, 1, 0x0, 0x0}, + {"ppu_cop_delay_fifo_48x16_wrapper_underflow_sta", DPP_FIELD_FLAG_RO, 28, 1, 0x0, 0x0}, + {"ppu_cop_delay_fifo_16x48_wrapper_overflow_sta", DPP_FIELD_FLAG_RO, 27, 1, 0x0, 0x0}, + {"ppu_cop_delay_fifo_16x48_wrapper_underflow_sta", DPP_FIELD_FLAG_RO, 26, 1, 0x0, 0x0}, + {"ppu_cop_delay_fifo_16x32_wrapper_overflow_sta", DPP_FIELD_FLAG_RO, 25, 1, 0x0, 0x0}, + {"ppu_cop_delay_fifo_16x32_wrapper_underflow_sta", DPP_FIELD_FLAG_RO, 24, 1, 0x0, 0x0}, + {"ppu_cop_result_fwft_fifo_96x80_wrapper_overflow_sta", DPP_FIELD_FLAG_RO, 23, 1, 0x0, 0x0}, + {"ppu_cop_result_fwft_fifo_96x80_wrapper_underflow_sta", DPP_FIELD_FLAG_RO, 22, 1, 0x0, 0x0}, + {"ppu_cop_delay_fifo_16x16_wrapper_overflow_sta", DPP_FIELD_FLAG_RO, 21, 1, 0x0, 0x0}, + {"ppu_cop_delay_fifo_16x16_wrapper_underflow_sta", DPP_FIELD_FLAG_RO, 20, 1, 0x0, 0x0}, + {"ppu_cop_result_fwft_fifo_32x80_wrapper_overflow_sta", DPP_FIELD_FLAG_RO, 19, 1, 0x0, 0x0}, + {"ppu_cop_result_fwft_fifo_32x80_wrapper_underflow_sta", DPP_FIELD_FLAG_RO, 18, 1, 0x0, 0x0}, + {"ppu_cop_result_fwft_fifo_16x80_wrapper_overflow_sta", DPP_FIELD_FLAG_RO, 17, 1, 0x0, 0x0}, + {"ppu_cop_result_fwft_fifo_16x80_wrapper_underflow_sta", DPP_FIELD_FLAG_RO, 16, 1, 0x0, 0x0}, + {"mec5_cop_key_crc_fifo_32x625_wrapper_overflow_flg_sta", DPP_FIELD_FLAG_RO, 15, 1, 0x0, 0x0}, + {"mec5_cop_key_crc_fifo_32x625_wrapper_underflow_flg_sta", DPP_FIELD_FLAG_RO, 14, 1, 0x0, 0x0}, + {"mec5_cop_key_checksum_fifo_32x180_wrapper_overflow_flg_sta", DPP_FIELD_FLAG_RO, 13, 1, 0x0, 0x0}, + {"mec5_cop_key_checksum_fifo_32x180_wrapper_underflow_flg_sta", DPP_FIELD_FLAG_RO, 12, 1, 0x0, 0x0}, + {"mec5_cop_key_mul_fifo_32x52_wrapper_overflow_flg_sta", DPP_FIELD_FLAG_RO, 11, 1, 0x0, 0x0}, + {"mec5_cop_key_mul_fifo_32x52_wrapper_underflow_flg_sta", DPP_FIELD_FLAG_RO, 10, 1, 0x0, 0x0}, + {"mec5_cop_key_random_mod_fifo_32x44_wrapper_overflow_flg_sta", DPP_FIELD_FLAG_RO, 9, 1, 0x0, 0x0}, + {"mec5_cop_key_random_mod_fifo_32x44_wrapper_underflow_flg_sta", DPP_FIELD_FLAG_RO, 8, 1, 0x0, 0x0}, + {"mec4_cop_key_crc_fifo_32x625_wrapper_overflow_flg_sta", DPP_FIELD_FLAG_RO, 7, 1, 0x0, 0x0}, + {"mec4_cop_key_crc_fifo_32x625_wrapper_underflow_flg_sta", DPP_FIELD_FLAG_RO, 6, 1, 0x0, 0x0}, + {"mec4_cop_key_checksum_fifo_32x180_wrapper_overflow_flg_sta", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"mec4_cop_key_checksum_fifo_32x180_wrapper_underflow_flg_sta", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"mec4_cop_key_mul_fifo_32x52_wrapper_overflow_flg_sta", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"mec4_cop_key_mul_fifo_32x52_wrapper_underflow_flg_sta", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"mec4_cop_key_random_mod_fifo_32x44_wrapper_overflow_flg_sta", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"mec4_cop_key_random_mod_fifo_32x44_wrapper_underflow_flg_sta", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_coprocessor_fifo_interrupt_sta_h_reg[] = + { + {"ppu_cop_random_mod_para_delay_fifo_48x16_wrapper_overflow_sta", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"ppu_cop_random_mod_para_delay_fifo_48x16_wrapper_underflow_sta", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_fifo_interrupt_sta_reg[] = + { + {"instrmem1_wr_fifo_ovf_sta", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"instrmem1_wr_fifo_udf_sta", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"instrmem1_rd_fifo_ovf_sta", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"instrmem1_rd_fifo_udf_sta", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"instrmem0_wr_fifo_ovf_sta", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"instrmem0_wr_fifo_udf_sta", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"instrmem0_rd_fifo_ovf_sta", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"instrmem0_rd_fifo_udf_sta", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_ram_check_ecc_err_flag_1_reg[] = + { + {"ecc_single_err_sa_para_fifo_int_flag", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ecc_double_err_sa_para_fifo_int_flag", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ecc_single_err_dup_para_fifo_int_flag", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ecc_double_err_dup_para_fifo_int_flag", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ecc_single_err_pf_rsp_fifo_int_flag", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ecc_double_err_pf_rsp_fifo_int_flag", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ecc_single_err_pf_req_fifo_int_flag", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ecc_double_err_pf_req_fifo_int_flag", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ecc_single_err_ppu_reorder_link_ram0_int_flag", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ecc_double_err_ppu_reorder_link_ram0_int_flag", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ecc_single_err_ppu_reorder_link_ram1_int_flag", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ecc_double_err_ppu_reorder_link_ram1_int_flag", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ecc_single_err_ppu_reorder_link_flag_array_ram0_int_flag", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ecc_single_err_ppu_reorder_link_flag_array_ram1_int_flag", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ecc_single_err_ppu_reorder_ifb_ram_int_flag", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ecc_double_err_ppu_reorder_ifb_ram_int_flag", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ecc_single_err_ppu_reorder_flag_array_ram0_int_flag", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ecc_single_err_ppu_reorder_flag_array_ram1_int_flag", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ecc_single_err_ppu_reorder_flag_ram0_int_flag", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ecc_single_err_ppu_reorder_flag_ram1_int_flag", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ecc_single_err_uc_mf_fifo_int_flag", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ecc_double_err_uc_mf_fifo_int_flag", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ecc_single_err_mc_mf_fifo_int_flag", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ecc_double_err_mc_mf_fifo_int_flag", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ecc_single_err_free_global_num_fifo_int_flag", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ecc_double_err_free_global_num_fifo_int_flag", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_isu_ppu_demux_fifo_interrupt_flag_reg[] = + { + {"isu_in_para_fwft_fifo_32x81_wrapper_u0_overflow_flag", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"isu_in_para_fwft_fifo_32x81_wrapper_u0_underflow_flag", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"isu_in_fifo_64x81_wrapper_u0_overflow_flag", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"isu_in_fifo_64x81_wrapper_u0_underflow_flag", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_multicast_fifo_interrupt_flag_reg[] = + { + {"ppu_pktrx_mc_ptr_fifo_16384x17_wrapper_u0_overflow_flag", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ppu_pktrx_mc_ptr_fifo_16384x17_wrapper_u0_underflow_flag", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"pf_req_fwft_fifo_16x36_wrapper_u0_overflow_flag", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"pf_req_fwft_fifo_16x36_wrapper_u0_underflow_flag", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"pf_rsp_fwft_fifo_32x34_wrapper_u0_overflow_flag", DPP_FIELD_FLAG_RO, 15, 1, 0x0, 0x0}, + {"pf_rsp_fwft_fifo_32x34_wrapper_u0_underflow_flag", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"dup_para_fwft_fifo_16x35_wrapper_u0_overflow_flag", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"dup_para_fwft_fifo_16x35_wrapper_u0_underflow_flag", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"se_mc_rsp_fwft_fifo_32x17_wrapper_u0_overflow_flag", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"se_mc_rsp_fwft_fifo_32x17_wrapper_u0_underflow_flag", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"sa_para_fwft_fifo_64x17_wrapper_u0_overflow_flag", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"sa_para_fwft_fifo_64x17_wrapper_u0_underflow_flag", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"group_id_fifo_64x16_wrapper_u0_overflow_flag", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"group_id_fifo_64x16_wrapper_u0_underflow_flag", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"isu_mc_para_fwft_fifo_128x34_wrapper_u0_overflow_flag", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"isu_mc_para_fwft_fifo_128x34_wrapper_u0_underflow_flag", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"dup_freeptr_fwft_fifo_128x7_wrapper_u0_overflow_flag", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"dup_freeptr_fwft_fifo_128x7_wrapper_u0_underflow_flag", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"car_flag_fifo_32x1_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"car_flag_fifo_32x1_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_in_schedule_fifo_interrupt_flag_reg[] = + { + {"free_global_num_fwft_fifo_8192x13_wrapper_u0_overflow_flag", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"free_global_num_fwft_fifo_8192x13_wrapper_u0_underflow_flag", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"mc_mf_fifo_16x2048_wrapper_u0_overflow_flag", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"mc_mf_fifo_16x2048_wrapper_u0_underflow_flag", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"uc_mf_fifo_96x2048_wrapper_u0_overflow_flag", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"uc_mf_fifo_96x2048_wrapper_u0_underflow_flag", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_mf_out_fifo_interrupt_flag_reg[] = + { + {"ppu_cluster5_mf_out_afifo_32x2048_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ppu_cluster5_mf_out_afifo_32x2048_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ppu_cluster4_mf_out_afifo_32x2048_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ppu_cluster4_mf_out_afifo_32x2048_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ppu_cluster3_mf_out_afifo_32x2048_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ppu_cluster3_mf_out_afifo_32x2048_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ppu_cluster2_mf_out_afifo_32x2048_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ppu_cluster2_mf_out_afifo_32x2048_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ppu_cluster1_mf_out_afifo_32x2048_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ppu_cluster1_mf_out_afifo_32x2048_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ppu_cluster0_mf_out_afifo_32x2048_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ppu_cluster0_mf_out_afifo_32x2048_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pbu_mcode_pf_req_schedule_fifo_interrupt_flag_reg[] = + { + {"ppu_cluster5_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ppu_cluster4_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ppu_cluster3_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ppu_cluster2_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ppu_cluster1_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ppu_cluster0_pbu_mcode_pf_req_afifo_32x15_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ppu_cluster5_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ppu_cluster4_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ppu_cluster3_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ppu_cluster2_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ppu_cluster1_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ppu_cluster0_pbu_mcode_pf_req_afifo_32x15_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pbu_mcode_pf_rsp_schedule_fifo_interrupt_flag_reg[] = + { + {"ppu_pbu_mcode_pf_rsp_afifo_64x16_wrapper_u0r_underflow_flag", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ppu_pbu_mcode_pf_rsp_afifo_64x16_wrapper_u0_overflow_flag", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_mccnt_fifo_interrupt_flag_reg[] = + { + {"ppu_mccnt_fifo_32x15_wrapper_u0_overflow_flag", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ppu_mccnt_fifo_32x15_wrapper_u0_underflow_flag", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ppu_wb_data_fifo_32x2048_wrapper_u0_overflow_flag", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ppu_wb_data_fifo_32x2048_wrapper_u0_underflow_flag", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"mccnt_rsp_fifo_32x1_wrapper_u0_overflow_flag", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"mccnt_rsp_fifo_32x1_wrapper_u0_underflow_flag", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_coprocessor_fifo_interrupt_flag_l_reg[] = + { + {"mec3_cop_key_crc_fifo_32x625_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"mec3_cop_key_crc_fifo_32x625_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"mec3_cop_key_checksum_fifo_32x180_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"mec3_cop_key_checksum_fifo_32x180_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"mec3_cop_key_mul_fifo_32x52_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"mec3_cop_key_mul_fifo_32x52_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"mec3_cop_key_random_mod_fifo_32x44_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"mec3_cop_key_random_mod_fifo_32x44_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"mec2_cop_key_crc_fifo_32x625_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"mec2_cop_key_crc_fifo_32x625_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"mec2_cop_key_checksum_fifo_32x180_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"mec2_cop_key_checksum_fifo_32x180_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"mec2_cop_key_mul_fifo_32x52_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"mec2_cop_key_mul_fifo_32x52_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"mec2_cop_key_random_mod_fifo_32x44_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"mec2_cop_key_random_mod_fifo_32x44_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"mec1_cop_key_crc_fifo_32x625_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"mec1_cop_key_crc_fifo_32x625_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"mec1_cop_key_checksum_fifo_32x180_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"mec1_cop_key_checksum_fifo_32x180_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"mec1_cop_key_mul_fifo_32x52_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"mec1_cop_key_mul_fifo_32x52_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"mec1_cop_key_random_mod_fifo_32x44_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"mec1_cop_key_random_mod_fifo_32x44_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"mec0_cop_key_crc_fifo_32x625_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"mec0_cop_key_crc_fifo_32x625_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"mec0_cop_key_checksum_fifo_32x180_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"mec0_cop_key_checksum_fifo_32x180_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"mec0_cop_key_mul_fifo_32x52_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"mec0_cop_key_mul_fifo_32x52_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"mec0_cop_key_random_mod_fifo_32x44_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"mec0_cop_key_random_mod_fifo_32x44_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_coprocessor_fifo_interrupt_flag_m_reg[] = + { + {"ppu_cop_result_fwft_fifo_80x80_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ppu_cop_result_fwft_fifo_80x80_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ppu_cop_delay_fifo_48x16_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ppu_cop_delay_fifo_48x16_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ppu_cop_delay_fifo_16x48_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ppu_cop_delay_fifo_16x48_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ppu_cop_delay_fifo_16x32_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ppu_cop_delay_fifo_16x32_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ppu_cop_result_fwft_fifo_96x80_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ppu_cop_result_fwft_fifo_96x80_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ppu_cop_delay_fifo_16x16_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ppu_cop_delay_fifo_16x16_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ppu_cop_result_fwft_fifo_32x80_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ppu_cop_result_fwft_fifo_32x80_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ppu_cop_result_fwft_fifo_16x80_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ppu_cop_result_fwft_fifo_16x80_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"mec5_cop_key_crc_fifo_32x625_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"mec5_cop_key_crc_fifo_32x625_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"mec5_cop_key_checksum_fifo_32x180_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"mec5_cop_key_checksum_fifo_32x180_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"mec5_cop_key_mul_fifo_32x52_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"mec5_cop_key_mul_fifo_32x52_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"mec5_cop_key_random_mod_fifo_32x44_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"mec5_cop_key_random_mod_fifo_32x44_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"mec4_cop_key_crc_fifo_32x625_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"mec4_cop_key_crc_fifo_32x625_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"mec4_cop_key_checksum_fifo_32x180_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"mec4_cop_key_checksum_fifo_32x180_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"mec4_cop_key_mul_fifo_32x52_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"mec4_cop_key_mul_fifo_32x52_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"mec4_cop_key_random_mod_fifo_32x44_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"mec4_cop_key_random_mod_fifo_32x44_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_coprocessor_fifo_interrupt_flag_h_reg[] = + { + {"ppu_cop_random_mod_para_delay_fifo_48x16_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ppu_cop_random_mod_para_delay_fifo_48x16_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_fifo_interrupt_flag_reg[] = + { + {"instrmem2_wr_fifo_ovf_flag", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"instrmem2_wr_fifo_udf_flag", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"instrmem2_rd_fifo_ovf_flag", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"instrmem2_rd_fifo_udf_flag", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"instrmem1_wr_fifo_ovf_flag", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"instrmem1_wr_fifo_udf_flag", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"instrmem1_rd_fifo_ovf_flag", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"instrmem1_rd_fifo_udf_flag", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"instrmem0_wr_fifo_ovf_flag", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"instrmem0_wr_fifo_udf_flag", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"instrmem0_rd_fifo_ovf_flag", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"instrmem0_rd_fifo_udf_flag", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_ram_int_out_reg[] = + { + {"instrmem2_bank3_ram_parity_err_int_out", DPP_FIELD_FLAG_RO, 11, 1, 0x0, 0x0}, + {"instrmem2_bank2_ram_parity_err_int_out", DPP_FIELD_FLAG_RO, 10, 1, 0x0, 0x0}, + {"instrmem2_bank1_ram_parity_err_int_out", DPP_FIELD_FLAG_RO, 9, 1, 0x0, 0x0}, + {"instrmem2_bank0_ram_parity_err_int_out", DPP_FIELD_FLAG_RO, 8, 1, 0x0, 0x0}, + {"instrmem1_bank3_ram_parity_err_int_out", DPP_FIELD_FLAG_RO, 7, 1, 0x0, 0x0}, + {"instrmem1_bank2_ram_parity_err_int_out", DPP_FIELD_FLAG_RO, 6, 1, 0x0, 0x0}, + {"instrmem1_bank1_ram_parity_err_int_out", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"instrmem1_bank0_ram_parity_err_int_out", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"instrmem0_bank3_ram_parity_err_int_out", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"instrmem0_bank2_ram_parity_err_int_out", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"instrmem0_bank1_ram_parity_err_int_out", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"instrmem0_bank0_ram_parity_err_int_out", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_ram_int_mask_reg[] = + { + {"instrmem2_bank3_ram_parity_err_mask", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"instrmem2_bank2_ram_parity_err_mask", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"instrmem2_bank1_ram_parity_err_mask", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"instrmem2_bank0_ram_parity_err_mask", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"instrmem1_bank3_ram_parity_err_mask", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"instrmem1_bank2_ram_parity_err_mask", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"instrmem1_bank1_ram_parity_err_mask", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"instrmem1_bank0_ram_parity_err_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"instrmem0_bank3_ram_parity_err_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"instrmem0_bank2_ram_parity_err_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"instrmem0_bank1_ram_parity_err_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"instrmem0_bank0_ram_parity_err_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_ram_int_stat_reg[] = + { + {"instrmem2_bank3_ram_parity_errstat", DPP_FIELD_FLAG_RO, 11, 1, 0x0, 0x0}, + {"instrmem2_bank2_ram_parity_errstat", DPP_FIELD_FLAG_RO, 10, 1, 0x0, 0x0}, + {"instrmem2_bank1_ram_parity_errstat", DPP_FIELD_FLAG_RO, 9, 1, 0x0, 0x0}, + {"instrmem2_bank0_ram_parity_errstat", DPP_FIELD_FLAG_RO, 8, 1, 0x0, 0x0}, + {"instrmem1_bank3_ram_parity_errstat", DPP_FIELD_FLAG_RO, 7, 1, 0x0, 0x0}, + {"instrmem1_bank2_ram_parity_errstat", DPP_FIELD_FLAG_RO, 6, 1, 0x0, 0x0}, + {"instrmem1_bank1_ram_parity_errstat", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"instrmem1_bank0_ram_parity_errstat", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"instrmem0_bank3_ram_parity_errstat", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"instrmem0_bank2_ram_parity_errstat", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"instrmem0_bank1_ram_parity_errstat", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"instrmem0_bank0_ram_parity_errstat", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_ram_int_flag_reg[] = + { + {"instrmem2_bank3_ram_parity_err_flag", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"instrmem2_bank2_ram_parity_err_flag", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"instrmem2_bank1_ram_parity_err_flag", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"instrmem2_bank0_ram_parity_err_flag", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"instrmem1_bank3_ram_parity_err_flag", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"instrmem1_bank2_ram_parity_err_flag", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"instrmem1_bank1_ram_parity_err_flag", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"instrmem1_bank0_ram_parity_err_flag", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"instrmem0_bank3_ram_parity_err_flag", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"instrmem0_bank2_ram_parity_err_flag", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"instrmem0_bank1_ram_parity_err_flag", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"instrmem0_bank0_ram_parity_err_flag", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_count_cfg_reg[] = + { + {"ppu_count_overflow_mode", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"ppu_count_rd_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_statics_cfg_reg[] = + { + {"csr_statics_mc_type", DPP_FIELD_FLAG_RW, 24, 1, 0x0, 0x0}, + {"csr_statics_bufnum", DPP_FIELD_FLAG_RW, 22, 7, 0x0, 0x0}, + {"csr_statics_portnum1", DPP_FIELD_FLAG_RW, 15, 8, 0xc1, 0x0}, + {"csr_statics_portnum0", DPP_FIELD_FLAG_RW, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_statics_wb_cfg_reg[] = + { + {"csr_statics_wb_halt_send_type", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"csr_statics_wb_mf_type", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"csr_statics_wb_halt_continue_end", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"csr_statics_wb_dup_flag", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"csr_statics_wb_last_flag", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"csr_statics_wb_dis_flag", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_wr_table_self_rsp_en_cfg_reg[] = + { + {"wr_table_self_rsp_en_cfg", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_random_arbiter_8to1_cfg_reg[] = + { + {"ppu_random_arbiter_8to1_cfg", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_reorder_bypass_flow_num_cfg_reg[] = + { + {"ppu_reorder_bypass_flow_num_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_cos_meter_cfg_h_reg[] = + { + {"cbs", DPP_FIELD_FLAG_RW, 22, 10, 0x3ff, 0x0}, + {"pbs", DPP_FIELD_FLAG_RW, 12, 10, 0x3ff, 0x0}, + {"green_action", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"yellow_action", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"red_action", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_cos_meter_cfg_l_reg[] = + { + {"cir", DPP_FIELD_FLAG_RW, 20, 10, 0x24a, 0x0}, + {"pir", DPP_FIELD_FLAG_RW, 10, 10, 0x24a, 0x0}, + {"car_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_rdy_reg[] = + { + {"instrmem_rdy", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_addr_reg[] = + { + {"instrmem_operate", DPP_FIELD_FLAG_WO, 13, 1, 0x0, 0x0}, + {"instrmem_addr", DPP_FIELD_FLAG_WO, 12, 13, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_ind_access_done_reg[] = + { + {"instrmem_ind_access_done", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_instr0_data_l_reg[] = + { + {"instrmem_instr0_data_l", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_instr0_data_h_reg[] = + { + {"instrmem_instr0_data_h", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_instr1_data_l_reg[] = + { + {"instrmem_instr1_data_l", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_instr1_data_h_reg[] = + { + {"instrmem_instr1_data_h", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_instr2_data_l_reg[] = + { + {"instrmem_instr2_data_l", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_instr2_data_h_reg[] = + { + {"instrmem_instr2_data_h", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_instr3_data_l_reg[] = + { + {"instrmem_instr3_data_l", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_instr3_data_h_reg[] = + { + {"instrmem_instr3_data_h", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_read_instr0_data_l_reg[] = + { + {"instrmem_read_instr0_data_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_read_instr0_data_h_reg[] = + { + {"instrmem_read_instr0_data_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_read_instr1_data_l_reg[] = + { + {"instrmem_read_instr1_data_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_read_instr1_data_h_reg[] = + { + {"instrmem_read_instr1_data_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_read_instr2_data_l_reg[] = + { + {"instrmem_read_instr2_data_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_read_instr2_data_h_reg[] = + { + {"instrmem_read_instr2_data_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_read_instr3_data_l_reg[] = + { + {"instrmem_read_instr3_data_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_instrmem_read_instr3_data_h_reg[] = + { + {"instrmem_read_instr3_data_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_se_ppu_mc_srh_fc_cnt_h_reg[] = + { + {"se_ppu_mc_srh_fc_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_se_ppu_mc_srh_fc_cnt_l_reg[] = + { + {"se_ppu_mc_srh_fc_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_se_mc_srh_fc_cnt_h_reg[] = + { + {"ppu_se_mc_srh_fc_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_se_mc_srh_fc_cnt_l_reg[] = + { + {"ppu_se_mc_srh_fc_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_se_mc_srh_vld_cnt_h_reg[] = + { + {"ppu_se_mc_srh_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_se_mc_srh_vld_cnt_l_reg[] = + { + {"ppu_se_mc_srh_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_se_ppu_mc_srh_vld_cnt_h_reg[] = + { + {"se_ppu_mc_srh_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_se_ppu_mc_srh_vld_cnt_l_reg[] = + { + {"se_ppu_mc_srh_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pbu_ppu_logic_pf_fc_cnt_h_reg[] = + { + {"pbu_ppu_logic_pf_fc_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pbu_ppu_logic_pf_fc_cnt_l_reg[] = + { + {"pbu_ppu_logic_pf_fc_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_pbu_logic_rsp_fc_cnt_h_reg[] = + { + {"ppu_pbu_logic_rsp_fc_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_pbu_logic_rsp_fc_cnt_l_reg[] = + { + {"ppu_pbu_logic_rsp_fc_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_pbu_logic_pf_req_vld_cnt_h_reg[] = + { + {"ppu_pbu_logic_pf_req_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_pbu_logic_pf_req_vld_cnt_l_reg[] = + { + {"ppu_pbu_logic_pf_req_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pbu_ppu_logic_pf_rsp_vld_cnt_h_reg[] = + { + {"pbu_ppu_logic_pf_rsp_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pbu_ppu_logic_pf_rsp_vld_cnt_l_reg[] = + { + {"pbu_ppu_logic_pf_rsp_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pbu_ppu_ifb_rd_fc_cnt_h_reg[] = + { + {"pbu_ppu_ifb_rd_fc_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pbu_ppu_ifb_rd_fc_cnt_l_reg[] = + { + {"pbu_ppu_ifb_rd_fc_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pbu_ppu_wb_fc_cnt_h_reg[] = + { + {"pbu_ppu_wb_fc_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pbu_ppu_wb_fc_cnt_l_reg[] = + { + {"pbu_ppu_wb_fc_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_pbu_mcode_pf_req_vld_cnt_h_reg[] = + { + {"ppu_pbu_mcode_pf_req_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_pbu_mcode_pf_req_vld_cnt_l_reg[] = + { + {"ppu_pbu_mcode_pf_req_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pbu_ppu_mcode_pf_rsp_vld_cnt_h_reg[] = + { + {"pbu_ppu_mcode_pf_rsp_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pbu_ppu_mcode_pf_rsp_vld_cnt_l_reg[] = + { + {"pbu_ppu_mcode_pf_rsp_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_odma_ppu_para_fc_cnt_h_reg[] = + { + {"odma_ppu_para_fc_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_odma_ppu_para_fc_cnt_l_reg[] = + { + {"odma_ppu_para_fc_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_odma_ppu_mccnt_wr_fc_cnt_h_reg[] = + { + {"odma_ppu_mccnt_wr_fc_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_odma_ppu_mccnt_wr_fc_cnt_l_reg[] = + { + {"odma_ppu_mccnt_wr_fc_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_odma_mccnt_wr_vld_cnt_h_reg[] = + { + {"ppu_odma_mccnt_wr_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_odma_mccnt_wr_vld_cnt_l_reg[] = + { + {"ppu_odma_mccnt_wr_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_odma_ppu_mccnt_rsp_vld_cnt_h_reg[] = + { + {"odma_ppu_mccnt_rsp_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_odma_ppu_mccnt_rsp_vld_cnt_l_reg[] = + { + {"odma_ppu_mccnt_rsp_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_pktrx_uc_fc_cnt_h_reg[] = + { + {"ppu_pktrx_uc_fc_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_pktrx_uc_fc_cnt_l_reg[] = + { + {"ppu_pktrx_uc_fc_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_pktrx_mc_fc_cnt_h_reg[] = + { + {"ppu_pktrx_mc_fc_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_pktrx_mc_fc_cnt_l_reg[] = + { + {"ppu_pktrx_mc_fc_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pktrx_ppu_desc_vld_cnt_h_reg[] = + { + {"pktrx_ppu_desc_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pktrx_ppu_desc_vld_cnt_l_reg[] = + { + {"pktrx_ppu_desc_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_pbu_ifb_req_vld_cnt_h_reg[] = + { + {"ppu_pbu_ifb_req_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_pbu_ifb_req_vld_cnt_l_reg[] = + { + {"ppu_pbu_ifb_req_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pbu_ppu_ifb_rsp_vld_cnt_h_reg[] = + { + {"pbu_ppu_ifb_rsp_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pbu_ppu_ifb_rsp_vld_cnt_l_reg[] = + { + {"pbu_ppu_ifb_rsp_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_pbu_wb_vld_cnt_h_reg[] = + { + {"ppu_pbu_wb_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_pbu_wb_vld_cnt_l_reg[] = + { + {"ppu_pbu_wb_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pbu_ppu_reorder_para_vld_cnt_h_reg[] = + { + {"pbu_ppu_reorder_para_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pbu_ppu_reorder_para_vld_cnt_l_reg[] = + { + {"pbu_ppu_reorder_para_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_odma_para_vld_cnt_h_reg[] = + { + {"ppu_odma_para_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_odma_para_vld_cnt_l_reg[] = + { + {"ppu_odma_para_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_isu_ppu_mc_vld_cnt_h_reg[] = + { + {"statics_isu_ppu_mc_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_isu_ppu_mc_vld_cnt_l_reg[] = + { + {"statics_isu_ppu_mc_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_isu_ppu_mc_loop_vld_cnt_h_reg[] = + { + {"statics_isu_ppu_mc_loop_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_isu_ppu_mc_loop_vld_cnt_l_reg[] = + { + {"statics_isu_ppu_mc_loop_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_isu_ppu_uc_vld_cnt_h_reg[] = + { + {"statics_isu_ppu_uc_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_isu_ppu_uc_vld_cnt_l_reg[] = + { + {"statics_isu_ppu_uc_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_isu_ppu_uc_bufnumis0_vld_cnt_h_reg[] = + { + {"statics_isu_ppu_uc_bufnumis0_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_isu_ppu_uc_bufnumis0_vld_cnt_l_reg[] = + { + {"statics_isu_ppu_uc_bufnumis0_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_demux_schedule_mc_vld_cnt_h_reg[] = + { + {"statics_demux_schedule_mc_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_demux_schedule_mc_vld_cnt_l_reg[] = + { + {"statics_demux_schedule_mc_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_demux_schedule_mc_bufnumis0_vld_cnt_h_reg[] = + { + {"statics_demux_schedule_mc_bufnumis0_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_demux_schedule_mc_bufnumis0_vld_cnt_l_reg[] = + { + {"statics_demux_schedule_mc_bufnumis0_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_demux_schedule_mc_srcportis0_vld_cnt_h_reg[] = + { + {"statics_demux_schedule_mc_srcportis0_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_demux_schedule_mc_srcportis0_vld_cnt_l_reg[] = + { + {"statics_demux_schedule_mc_srcportis0_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_demux_schedule_mc_srcportis1_vld_cnt_h_reg[] = + { + {"statics_demux_schedule_mc_srcportis1_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_demux_schedule_mc_srcportis1_vld_cnt_l_reg[] = + { + {"statics_demux_schedule_mc_srcportis1_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_demux_schedule_uc_vld_cnt_h_reg[] = + { + {"statics_demux_schedule_uc_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_demux_schedule_uc_vld_cnt_l_reg[] = + { + {"statics_demux_schedule_uc_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_demux_schedule_uc_bufnumis0_vld_cnt_h_reg[] = + { + {"statics_demux_schedule_uc_bufnumis0_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_demux_schedule_uc_bufnumis0_vld_cnt_l_reg[] = + { + {"statics_demux_schedule_uc_bufnumis0_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_demux_schedule_uc_srcportis0_vld_cnt_h_reg[] = + { + {"statics_demux_schedule_uc_srcportis0_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_demux_schedule_uc_srcportis0_vld_cnt_l_reg[] = + { + {"statics_demux_schedule_uc_srcportis0_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_demux_schedule_uc_srcportis1_vld_cnt_h_reg[] = + { + {"statics_demux_schedule_uc_srcportis1_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_demux_schedule_uc_srcportis1_vld_cnt_l_reg[] = + { + {"statics_demux_schedule_uc_srcportis1_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_ppu_wb_vld_cnt_h_reg[] = + { + {"statics_ppu_wb_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_ppu_wb_vld_cnt_l_reg[] = + { + {"statics_ppu_wb_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_ppu_wb_bufnumis0_vld_cnt_h_reg[] = + { + {"statics_ppu_wb_bufnumis0_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_ppu_wb_bufnumis0_vld_cnt_l_reg[] = + { + {"statics_ppu_wb_bufnumis0_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_ppu_wb_srcportis0_vld_cnt_h_reg[] = + { + {"statics_ppu_wb_srcportis0_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_ppu_wb_srcportis0_vld_cnt_l_reg[] = + { + {"statics_ppu_wb_srcportis0_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_ppu_wb_srcportis1_vld_cnt_h_reg[] = + { + {"statics_ppu_wb_srcportis1_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_ppu_wb_srcportis1_vld_cnt_l_reg[] = + { + {"statics_ppu_wb_srcportis1_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_ppu_wb_halt_send_type_vld_cnt_h_reg[] = + { + {"statics_ppu_wb_halt_send_type_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_ppu_wb_halt_send_type_vld_cnt_l_reg[] = + { + {"statics_ppu_wb_halt_send_type_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_ppu_wb_mf_type_vld_cnt_h_reg[] = + { + {"statics_ppu_wb_mf_type_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_ppu_wb_mf_type_vld_cnt_l_reg[] = + { + {"statics_ppu_wb_mf_type_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_ppu_wb_halt_continue_end_vld_cnt_h_reg[] = + { + {"statics_ppu_wb_halt_continue_end_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_ppu_wb_halt_continue_end_vld_cnt_l_reg[] = + { + {"statics_ppu_wb_halt_continue_end_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_ppu_wb_dup_flag_vld_cnt_h_reg[] = + { + {"statics_ppu_wb_dup_flag_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_ppu_wb_dup_flag_vld_cnt_l_reg[] = + { + {"statics_ppu_wb_dup_flag_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_ppu_wb_last_flag_vld_cnt_h_reg[] = + { + {"statics_ppu_wb_last_flag_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_ppu_wb_last_flag_vld_cnt_l_reg[] = + { + {"statics_ppu_wb_last_flag_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_ppu_wb_dis_flag_vld_cnt_h_reg[] = + { + {"statics_ppu_wb_dis_flag_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_ppu_wb_dis_flag_vld_cnt_l_reg[] = + { + {"statics_ppu_wb_dis_flag_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_pbu_ppu_reorder_halt_send_type_vld_cnt_h_reg[] = + { + {"statics_pbu_ppu_reorder_halt_send_type_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_pbu_ppu_reorder_halt_send_type_vld_cnt_l_reg[] = + { + {"statics_pbu_ppu_reorder_halt_send_type_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_pbu_ppu_reorder_mf_type_vld_cnt_h_reg[] = + { + {"statics_pbu_ppu_reorder_mf_type_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_pbu_ppu_reorder_mf_type_vld_cnt_l_reg[] = + { + {"statics_pbu_ppu_reorder_mf_type_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_pbu_ppu_reorder_halt_continue_end_vld_cnt_h_reg[] = + { + {"statics_pbu_ppu_reorder_halt_continue_end_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_statics_pbu_ppu_reorder_halt_continue_end_vld_cnt_l_reg[] = + { + {"statics_pbu_ppu_reorder_halt_continue_end_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_car_green_pkt_vld_cnt_h_reg[] = + { + {"car_green_pkt_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_car_green_pkt_vld_cnt_l_reg[] = + { + {"car_green_pkt_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_car_yellow_pkt_vld_cnt_h_reg[] = + { + {"car_yellow_pkt_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_car_yellow_pkt_vld_cnt_l_reg[] = + { + {"car_yellow_pkt_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_car_red_pkt_vld_cnt_h_reg[] = + { + {"car_red_pkt_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_car_red_pkt_vld_cnt_l_reg[] = + { + {"car_red_pkt_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_car_drop_pkt_vld_cnt_h_reg[] = + { + {"car_drop_pkt_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_car_drop_pkt_vld_cnt_l_reg[] = + { + {"car_drop_pkt_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_pktrx_mc_ptr_vld_cnt_h_reg[] = + { + {"ppu_pktrx_mc_ptr_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_pktrx_mc_ptr_vld_cnt_l_reg[] = + { + {"ppu_pktrx_mc_ptr_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_isu_ppu_loopback_fc_cnt_h_reg[] = + { + {"ppu_pktrx_mc_ptr_vld_cnt_h", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_isu_ppu_loopback_fc_cnt_l_reg[] = + { + {"ppu_pktrx_mc_ptr_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_culster_pbu_mcode_pf_req_prog_full_assert_cfg_reg[] = + { + {"ppu_culster_pbu_mcode_pf_req_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x10, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_culster_pbu_mcode_pf_req_prog_full_negate_cfg_reg[] = + { + {"ppu_culster_pbu_mcode_pf_req_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x10, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_culster_pbu_mcode_pf_req_prog_empty_assert_cfg_reg[] = + { + {"ppu_culster_pbu_mcode_pf_req_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_culster_pbu_mcode_pf_req_prog_empty_negate_cfg_reg[] = + { + {"ppu_culster_pbu_mcode_pf_req_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_pbu_mcode_pf_rsp_prog_full_assert_cfg_reg[] = + { + {"ppu_pbu_mcode_pf_rsp_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x20, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_pbu_mcode_pf_rsp_prog_full_negate_cfg_reg[] = + { + {"ppu_pbu_mcode_pf_rsp_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x20, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_pbu_mcode_pf_rsp_prog_empty_assert_cfg_reg[] = + { + {"ppu_pbu_mcode_pf_rsp_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_pbu_mcode_pf_rsp_prog_empty_negate_cfg_reg[] = + { + {"ppu_pbu_mcode_pf_rsp_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_mccnt_fifo_prog_full_assert_cfg_reg[] = + { + {"mccnt_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x1c, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_mccnt_fifo_prog_full_negate_cfg_reg[] = + { + {"mccnt_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x1c, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_mccnt_fifo_prog_empty_assert_cfg_reg[] = + { + {"mccnt_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_mccnt_fifo_prog_empty_negate_cfg_reg[] = + { + {"mccnt_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_uc_mf_fifo_prog_full_assert_cfg_reg[] = + { + {"uc_mf_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x10, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_uc_mf_fifo_prog_full_negate_cfg_reg[] = + { + {"uc_mf_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x10, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_uc_mf_fifo_prog_empty_assert_cfg_reg[] = + { + {"uc_mf_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_uc_mf_fifo_prog_empty_negate_cfg_reg[] = + { + {"uc_mf_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_mc_mf_fifo_prog_full_assert_cfg_reg[] = + { + {"mc_mf_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0xa, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_mc_mf_fifo_prog_full_negate_cfg_reg[] = + { + {"mc_mf_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0xa, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_mc_mf_fifo_prog_empty_assert_cfg_reg[] = + { + {"mc_mf_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_mc_mf_fifo_prog_empty_negate_cfg_reg[] = + { + {"mc_mf_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_isu_mf_fifo_prog_full_assert_cfg_reg[] = + { + {"isu_mf_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x10, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_isu_mf_fifo_prog_full_negate_cfg_reg[] = + { + {"isu_mf_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x10, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_isu_mf_fifo_prog_empty_assert_cfg_reg[] = + { + {"isu_mf_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_isu_mf_fifo_prog_empty_negate_cfg_reg[] = + { + {"isu_mf_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_isu_fwft_mf_fifo_prog_empty_assert_cfg_reg[] = + { + {"isu_fwft_mf_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_isu_fwft_mf_fifo_prog_empty_negate_cfg_reg[] = + { + {"isu_fwft_mf_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_isu_mc_para_mf_fifo_prog_full_assert_cfg_reg[] = + { + {"isu_mc_para_mf_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x50, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_isu_mc_para_mf_fifo_prog_full_negate_cfg_reg[] = + { + {"isu_mc_para_mf_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x50, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_isu_mc_para_mf_fifo_prog_empty_assert_cfg_reg[] = + { + {"isu_mc_para_mf_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_isu_mc_para_mf_fifo_prog_empty_negate_cfg_reg[] = + { + {"isu_mc_para_mf_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_group_id_fifo_prog_full_assert_cfg_reg[] = + { + {"group_id_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x3c, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_group_id_fifo_prog_full_negate_cfg_reg[] = + { + {"group_id_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x3c, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_group_id_fifo_prog_empty_assert_cfg_reg[] = + { + {"group_id_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_group_id_fifo_prog_empty_negate_cfg_reg[] = + { + {"group_id_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_sa_para_fifo_prog_full_assert_cfg_reg[] = + { + {"sa_para_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x3c, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_sa_para_fifo_prog_full_negate_cfg_reg[] = + { + {"sa_para_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x3c, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_sa_para_fifo_prog_empty_assert_cfg_reg[] = + { + {"sa_para_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_sa_para_fifo_prog_empty_negate_cfg_reg[] = + { + {"sa_para_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_se_mc_rsp_fifo_prog_full_assert_cfg_reg[] = + { + {"se_mc_rsp_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0xa, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_se_mc_rsp_fifo_prog_full_negate_cfg_reg[] = + { + {"se_mc_rsp_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0xa, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_se_mc_rsp_fifo_prog_empty_assert_cfg_reg[] = + { + {"se_mc_rsp_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_se_mc_rsp_fifo_prog_empty_negate_cfg_reg[] = + { + {"se_mc_rsp_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_dup_para_fifo_prog_full_assert_cfg_reg[] = + { + {"dup_para_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0xc, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_dup_para_fifo_prog_full_negate_cfg_reg[] = + { + {"dup_para_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0xc, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_dup_para_fifo_prog_empty_assert_cfg_reg[] = + { + {"dup_para_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_dup_para_fifo_prog_empty_negate_cfg_reg[] = + { + {"dup_para_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pf_rsp_fifo_prog_full_assert_cfg_reg[] = + { + {"pf_rsp_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x10, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pf_rsp_fifo_prog_full_negate_cfg_reg[] = + { + {"pf_rsp_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x10, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pf_rsp_fifo_prog_empty_assert_cfg_reg[] = + { + {"pf_rsp_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pf_rsp_fifo_prog_empty_negate_cfg_reg[] = + { + {"pf_rsp_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_dup_freeptr_fifo_prog_full_assert_cfg_reg[] = + { + {"dup_freeptr_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x7c, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_dup_freeptr_fifo_prog_full_negate_cfg_reg[] = + { + {"dup_freeptr_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x7c, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_dup_freeptr_fifo_prog_empty_assert_cfg_reg[] = + { + {"dup_freeptr_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x58, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_dup_freeptr_fifo_prog_empty_negate_cfg_reg[] = + { + {"dup_freeptr_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x58, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pf_req_fifo_prog_full_assert_cfg_reg[] = + { + {"pf_req_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0xc, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pf_req_fifo_prog_full_negate_cfg_reg[] = + { + {"pf_req_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0xc, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pf_req_fifo_prog_empty_assert_cfg_reg[] = + { + {"pf_req_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pf_req_fifo_prog_empty_negate_cfg_reg[] = + { + {"pf_req_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_car_flag_fifo_prog_full_assert_cfg_reg[] = + { + {"car_flag_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x18, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_car_flag_fifo_prog_full_negate_cfg_reg[] = + { + {"car_flag_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x18, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_car_flag_fifo_prog_empty_assert_cfg_reg[] = + { + {"car_flag_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_car_flag_fifo_prog_empty_negate_cfg_reg[] = + { + {"car_flag_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cluster_mf_out_afifo_prog_full_assert_cfg_reg[] = + { + {"ppu_cluster_mf_out_afifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x10, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cluster_mf_out_afifo_prog_full_negate_cfg_reg[] = + { + {"ppu_cluster_mf_out_afifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x10, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cluster_mf_out_afifo_prog_empty_assert_cfg_reg[] = + { + {"ppu_cluster_mf_out_afifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cluster_mf_out_afifo_prog_empty_negate_cfg_reg[] = + { + {"ppu_cluster_mf_out_afifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_key_fifo_prog_full_assert_cfg_reg[] = + { + {"ppu_cop_key_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x18, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_key_fifo_prog_full_negate_cfg_reg[] = + { + {"ppu_cop_key_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x18, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_key_fifo_prog_empty_assert_cfg_reg[] = + { + {"ppu_cop_key_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_key_fifo_prog_empty_negate_cfg_reg[] = + { + {"ppu_cop_key_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_random_mod_para_fifo_prog_full_assert_cfg_reg[] = + { + {"ppu_cop_random_mod_para_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x24, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_random_mod_para_fifo_prog_full_negate_cfg_reg[] = + { + {"ppu_cop_random_mod_para_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x24, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_random_mod_para_fifo_prog_empty_assert_cfg_reg[] = + { + {"ppu_cop_random_mod_para_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_random_mod_para_fifo_prog_empty_negate_cfg_reg[] = + { + {"ppu_cop_random_mod_para_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_random_mod_result_fifo_prog_full_assert_cfg_reg[] = + { + {"ppu_cop_random_mod_result_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x28, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_random_mod_result_fifo_prog_full_negate_cfg_reg[] = + { + {"ppu_cop_random_mod_result_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x28, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_random_mod_result_fifo_prog_empty_assert_cfg_reg[] = + { + {"ppu_cop_random_mod_result_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_random_mod_result_fifo_prog_empty_negate_cfg_reg[] = + { + {"ppu_cop_random_mod_result_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_checksum_result_fifo_prog_full_assert_cfg_reg[] = + { + {"ppu_cop_checksum_result_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0xa, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_checksum_result_fifo_prog_full_negate_cfg_reg[] = + { + {"ppu_cop_checksum_result_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0xa, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_checksum_result_fifo_prog_empty_assert_cfg_reg[] = + { + {"ppu_cop_checksum_result_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_checksum_result_fifo_prog_empty_negate_cfg_reg[] = + { + {"ppu_cop_checksum_result_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_crc_first_para_fifo_prog_full_assert_cfg_reg[] = + { + {"ppu_cop_crc_first_para_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0xe, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_crc_first_para_fifo_prog_full_negate_cfg_reg[] = + { + {"ppu_cop_crc_first_para_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0xe, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_crc_first_para_fifo_prog_empty_assert_cfg_reg[] = + { + {"ppu_cop_crc_first_para_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_crc_first_para_fifo_prog_empty_negate_cfg_reg[] = + { + {"ppu_cop_crc_first_para_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_crc_bypass_delay_prog_full_assert_cfg_reg[] = + { + {"ppu_cop_crc_bypass_delay_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0xe, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_crc_bypass_delay_prog_full_negate_cfg_reg[] = + { + {"ppu_cop_crc_bypass_delay_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0xe, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_crc_bypass_delay_prog_empty_assert_cfg_reg[] = + { + {"ppu_cop_crc_bypass_delay_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_crc_bypass_delay_prog_empty_negate_cfg_reg[] = + { + {"ppu_cop_crc_bypass_delay_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_crc_second_para_fifo_prog_full_assert_cfg_reg[] = + { + {"ppu_cop_crc_second_para_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x24, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_crc_second_para_fifo_prog_full_negate_cfg_reg[] = + { + {"ppu_cop_crc_second_para_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x24, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_crc_second_para_fifo_prog_empty_assert_cfg_reg[] = + { + {"ppu_cop_crc_second_para_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_crc_second_para_fifo_prog_empty_negate_cfg_reg[] = + { + {"ppu_cop_crc_second_para_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_crc_result_fwft_fifo_prog_full_assert_cfg_reg[] = + { + {"ppu_cop_crc_result_fwft_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x30, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_crc_result_fwft_fifo_prog_full_negate_cfg_reg[] = + { + {"ppu_cop_crc_result_fwft_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x30, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_crc_result_fwft_fifo_prog_empty_assert_cfg_reg[] = + { + {"ppu_cop_crc_result_fwft_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_crc_result_fwft_fifo_prog_empty_negate_cfg_reg[] = + { + {"ppu_cop_crc_result_fwft_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_multiply_para_fifo_prog_full_assert_cfg_reg[] = + { + {"ppu_cop_multiply_para_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0xa, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_multiply_para_fifo_prog_full_negate_cfg_reg[] = + { + {"ppu_cop_multiply_para_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0xa, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_multiply_para_fifo_prog_empty_assert_cfg_reg[] = + { + {"ppu_cop_multiply_para_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_multiply_para_fifo_prog_empty_negate_cfg_reg[] = + { + {"ppu_cop_multiply_para_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_multiply_para_result_fifo_prog_full_assert_cfg_reg[] = + { + {"ppu_cop_multiply_para_result_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x18, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_multiply_para_result_fifo_prog_full_negate_cfg_reg[] = + { + {"ppu_cop_multiply_para_result_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x18, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_multiply_para_result_fifo_prog_empty_assert_cfg_reg[] = + { + {"ppu_cop_multiply_para_result_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_cop_multiply_para_result_fifo_prog_empty_negate_cfg_reg[] = + { + {"ppu_cop_multiply_para_result_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_free_global_num_fwft_fifo_prog_full_assert_cfg_reg[] = + { + {"free_global_num_fwft_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 12, 13, 0xffc, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_free_global_num_fwft_fifo_prog_full_negate_cfg_reg[] = + { + {"free_global_num_fwft_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 12, 13, 0xffc, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_free_global_num_fwft_fifo_prog_empty_assert_cfg_reg[] = + { + {"free_global_num_fwft_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 12, 13, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_free_global_num_fwft_fifo_prog_empty_negate_cfg_reg[] = + { + {"free_global_num_fwft_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 12, 13, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_pktrx_mc_ptr_fifo_prog_full_assert_cfg_reg[] = + { + {"ppu_pktrx_mc_ptr_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 14, 15, 0x3ff6, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_pktrx_mc_ptr_fifo_prog_full_negate_cfg_reg[] = + { + {"ppu_pktrx_mc_ptr_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 14, 15, 0x3ff6, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_pktrx_mc_ptr_fifo_prog_empty_assert_cfg_reg[] = + { + {"ppu_pktrx_mc_ptr_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 14, 15, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_ppu_pktrx_mc_ptr_fifo_prog_empty_negate_cfg_reg[] = + { + {"ppu_pktrx_mc_ptr_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 14, 15, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data0_reg[] = + { + {"pkt_data0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data1_reg[] = + { + {"pkt_data1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data2_reg[] = + { + {"pkt_data2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data3_reg[] = + { + {"pkt_data3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data4_reg[] = + { + {"pkt_data4", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data5_reg[] = + { + {"pkt_data5", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data6_reg[] = + { + {"pkt_data6", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data7_reg[] = + { + {"pkt_data7", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data8_reg[] = + { + {"pkt_data8", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data9_reg[] = + { + {"pkt_data9", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data10_reg[] = + { + {"pkt_data10", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data11_reg[] = + { + {"pkt_data11", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data12_reg[] = + { + {"pkt_data12", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data13_reg[] = + { + {"pkt_data13", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data14_reg[] = + { + {"pkt_data14", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data15_reg[] = + { + {"pkt_data15", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data16_reg[] = + { + {"pkt_data16", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data17_reg[] = + { + {"pkt_data17", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data18_reg[] = + { + {"pkt_data18", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data19_reg[] = + { + {"pkt_data19", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data20_reg[] = + { + {"pkt_data20", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data21_reg[] = + { + {"pkt_data21", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data22_reg[] = + { + {"pkt_data22", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data23_reg[] = + { + {"pkt_data23", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data24_reg[] = + { + {"pkt_data24", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data25_reg[] = + { + {"pkt_data25", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data26_reg[] = + { + {"pkt_data26", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data27_reg[] = + { + {"pkt_data27", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data28_reg[] = + { + {"pkt_data28", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data29_reg[] = + { + {"pkt_data29", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data30_reg[] = + { + {"pkt_data30", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data31_reg[] = + { + {"pkt_data31", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data32_reg[] = + { + {"pkt_data32", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data33_reg[] = + { + {"pkt_data33", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data34_reg[] = + { + {"pkt_data34", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data35_reg[] = + { + {"pkt_data35", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data36_reg[] = + { + {"pkt_data36", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data37_reg[] = + { + {"pkt_data37", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data38_reg[] = + { + {"pkt_data38", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data39_reg[] = + { + {"pkt_data39", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data40_reg[] = + { + {"pkt_data40", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data41_reg[] = + { + {"pkt_data41", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data42_reg[] = + { + {"pkt_data42", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data43_reg[] = + { + {"pkt_data43", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data44_reg[] = + { + {"pkt_data44", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data45_reg[] = + { + {"pkt_data45", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data46_reg[] = + { + {"pkt_data46", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data47_reg[] = + { + {"pkt_data47", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data48_reg[] = + { + {"pkt_data48", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data49_reg[] = + { + {"pkt_data49", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data50_reg[] = + { + {"pkt_data50", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data51_reg[] = + { + {"pkt_data51", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data52_reg[] = + { + {"pkt_data52", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data53_reg[] = + { + {"pkt_data53", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data54_reg[] = + { + {"pkt_data54", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data55_reg[] = + { + {"pkt_data55", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data56_reg[] = + { + {"pkt_data56", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data57_reg[] = + { + {"pkt_data57", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data58_reg[] = + { + {"pkt_data58", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data59_reg[] = + { + {"pkt_data59", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data60_reg[] = + { + {"pkt_data60", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data61_reg[] = + { + {"pkt_data61", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data62_reg[] = + { + {"pkt_data62", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data63_reg[] = + { + {"pkt_data63", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data64_reg[] = + { + {"pkt_data64", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data65_reg[] = + { + {"pkt_data65", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data66_reg[] = + { + {"pkt_data66", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data67_reg[] = + { + {"pkt_data67", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data68_reg[] = + { + {"pkt_data68", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data69_reg[] = + { + {"pkt_data69", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data70_reg[] = + { + {"pkt_data70", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data71_reg[] = + { + {"pkt_data71", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data72_reg[] = + { + {"pkt_data72", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data73_reg[] = + { + {"pkt_data73", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data74_reg[] = + { + {"pkt_data74", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data75_reg[] = + { + {"pkt_data75", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data76_reg[] = + { + {"pkt_data76", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data77_reg[] = + { + {"pkt_data77", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data78_reg[] = + { + {"pkt_data78", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data79_reg[] = + { + {"pkt_data79", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data80_reg[] = + { + {"pkt_data80", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data81_reg[] = + { + {"pkt_data81", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data82_reg[] = + { + {"pkt_data82", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data83_reg[] = + { + {"pkt_data83", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data84_reg[] = + { + {"pkt_data84", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data85_reg[] = + { + {"pkt_data85", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data86_reg[] = + { + {"pkt_data86", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data87_reg[] = + { + {"pkt_data87", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data88_reg[] = + { + {"pkt_data88", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data89_reg[] = + { + {"pkt_data89", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data90_reg[] = + { + {"pkt_data90", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data91_reg[] = + { + {"pkt_data91", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data92_reg[] = + { + {"pkt_data92", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data93_reg[] = + { + {"pkt_data93", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data94_reg[] = + { + {"pkt_data94", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data95_reg[] = + { + {"pkt_data95", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data96_reg[] = + { + {"pkt_data96", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data97_reg[] = + { + {"pkt_data97", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data98_reg[] = + { + {"pkt_data98", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data99_reg[] = + { + {"pkt_data99", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data100_reg[] = + { + {"pkt_data100", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data101_reg[] = + { + {"pkt_data101", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data102_reg[] = + { + {"pkt_data102", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data103_reg[] = + { + {"pkt_data103", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data104_reg[] = + { + {"pkt_data104", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data105_reg[] = + { + {"pkt_data105", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data106_reg[] = + { + {"pkt_data106", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data107_reg[] = + { + {"pkt_data107", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data108_reg[] = + { + {"pkt_data108", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data109_reg[] = + { + {"pkt_data109", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data110_reg[] = + { + {"pkt_data110", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data111_reg[] = + { + {"pkt_data111", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data112_reg[] = + { + {"pkt_data112", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data113_reg[] = + { + {"pkt_data113", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data114_reg[] = + { + {"pkt_data114", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data115_reg[] = + { + {"pkt_data115", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data116_reg[] = + { + {"pkt_data116", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data117_reg[] = + { + {"pkt_data117", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data118_reg[] = + { + {"pkt_data118", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data119_reg[] = + { + {"pkt_data119", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data120_reg[] = + { + {"pkt_data120", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data121_reg[] = + { + {"pkt_data121", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data122_reg[] = + { + {"pkt_data122", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data123_reg[] = + { + {"pkt_data123", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data124_reg[] = + { + {"pkt_data124", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data125_reg[] = + { + {"pkt_data125", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data126_reg[] = + { + {"pkt_data126", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_pkt_data127_reg[] = + { + {"pkt_data127", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr0_reg[] = + { + {"spr0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr1_reg[] = + { + {"spr1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr2_reg[] = + { + {"spr2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr3_reg[] = + { + {"spr3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr4_reg[] = + { + {"spr4", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr5_reg[] = + { + {"spr5", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr6_reg[] = + { + {"spr6", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr7_reg[] = + { + {"spr7", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr8_reg[] = + { + {"spr8", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr9_reg[] = + { + {"spr9", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr10_reg[] = + { + {"spr10", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr11_reg[] = + { + {"spr11", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr12_reg[] = + { + {"spr12", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr13_reg[] = + { + {"spr13", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr14_reg[] = + { + {"spr14", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr15_reg[] = + { + {"spr15", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr16_reg[] = + { + {"spr16", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr17_reg[] = + { + {"spr17", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr18_reg[] = + { + {"spr18", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr19_reg[] = + { + {"spr19", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr20_reg[] = + { + {"spr20", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr21_reg[] = + { + {"spr21", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr22_reg[] = + { + {"spr22", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr23_reg[] = + { + {"spr23", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr24_reg[] = + { + {"spr24", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr25_reg[] = + { + {"spr25", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr26_reg[] = + { + {"spr26", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr27_reg[] = + { + {"spr27", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr28_reg[] = + { + {"spr28", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr29_reg[] = + { + {"spr29", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr30_reg[] = + { + {"spr30", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_spr31_reg[] = + { + {"spr31", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp0_reg[] = + { + {"rsp0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp1_reg[] = + { + {"rsp1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp2_reg[] = + { + {"rsp2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp3_reg[] = + { + {"rsp3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp4_reg[] = + { + {"rsp4", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp5_reg[] = + { + {"rsp5", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp6_reg[] = + { + {"rsp6", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp7_reg[] = + { + {"rsp7", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp8_reg[] = + { + {"rsp8", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp9_reg[] = + { + {"rsp9", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp10_reg[] = + { + {"rsp10", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp11_reg[] = + { + {"rsp11", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp12_reg[] = + { + {"rsp12", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp13_reg[] = + { + {"rsp13", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp14_reg[] = + { + {"rsp14", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp15_reg[] = + { + {"rsp15", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp16_reg[] = + { + {"rsp16", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp17_reg[] = + { + {"rsp17", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp18_reg[] = + { + {"rsp18", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp19_reg[] = + { + {"rsp19", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp20_reg[] = + { + {"rsp20", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp21_reg[] = + { + {"rsp21", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp22_reg[] = + { + {"rsp22", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp23_reg[] = + { + {"rsp23", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp24_reg[] = + { + {"rsp24", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp25_reg[] = + { + {"rsp25", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp26_reg[] = + { + {"rsp26", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp27_reg[] = + { + {"rsp27", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp28_reg[] = + { + {"rsp28", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp29_reg[] = + { + {"rsp29", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp30_reg[] = + { + {"rsp30", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_rsp31_reg[] = + { + {"rsp31", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_key0_reg[] = + { + {"key0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_key1_reg[] = + { + {"key1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_key2_reg[] = + { + {"key2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_key3_reg[] = + { + {"key3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_key4_reg[] = + { + {"key4", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_key5_reg[] = + { + {"key5", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_key6_reg[] = + { + {"key6", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_key7_reg[] = + { + {"key7", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_key8_reg[] = + { + {"key8", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_key9_reg[] = + { + {"key9", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_key10_reg[] = + { + {"key10", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_key11_reg[] = + { + {"key11", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_key12_reg[] = + { + {"key12", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_key13_reg[] = + { + {"key13", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_key14_reg[] = + { + {"key14", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_key15_reg[] = + { + {"key15", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_key16_reg[] = + { + {"key16", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_key17_reg[] = + { + {"key17", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_key18_reg[] = + { + {"key18", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_key19_reg[] = + { + {"key19", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_ppu_flag_reg[] = + { + {"me_num", DPP_FIELD_FLAG_RO, 26, 3, 0x0, 0x0}, + {"thread_num", DPP_FIELD_FLAG_RO, 19, 4, 0x0, 0x0}, + {"flag", DPP_FIELD_FLAG_RO, 11, 12, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_int_1200m_flag_reg[] = + { + {"me7_interrupt_flag", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"me6_interrupt_flag", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"me5_interrupt_flag", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"me4_interrupt_flag", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"me3_interrupt_flag", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"me2_interrupt_flag", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"me1_interrupt_flag", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"me0_interrupt_flag", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_bp_instr_l_reg[] = + { + {"bp_instr_l", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_bp_instr_h_reg[] = + { + {"bp_instr_h", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_bp_addr_reg[] = + { + {"bp_addr", DPP_FIELD_FLAG_RO, 14, 15, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_drr_reg[] = + { + {"drr", DPP_FIELD_FLAG_RO, 4, 5, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_dsr_reg[] = + { + {"dsr", DPP_FIELD_FLAG_RW, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_dbg_rtl_date_reg[] = + { + {"dbg_rtl_date", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_continue_reg[] = + { + {"me_continue", DPP_FIELD_FLAG_WO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_step_reg[] = + { + {"me_step", DPP_FIELD_FLAG_WO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_refresh_reg[] = + { + {"me_refresh", DPP_FIELD_FLAG_WO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_drr_clr_reg[] = + { + {"drr_clr", DPP_FIELD_FLAG_WO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_busy_thresold_reg[] = + { + {"me_busy_thresold", DPP_FIELD_FLAG_RW, 15, 16, 0x7fff, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_int_1200m_sta_reg[] = + { + {"me7_interrupt_sta", DPP_FIELD_FLAG_RO, 7, 1, 0x0, 0x0}, + {"me6_interrupt_sta", DPP_FIELD_FLAG_RO, 6, 1, 0x0, 0x0}, + {"me5_interrupt_sta", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"me4_interrupt_sta", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"me3_interrupt_sta", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"me2_interrupt_sta", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"me1_interrupt_sta", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"me0_interrupt_sta", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_int_1200m_me_fifo_mask_l_reg[] = + { + {"me_free_pkt_q_overflow_mask", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"me_free_pkt_q_underflow_mask", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"me_free_thread_q_overflow_mask", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"me_free_thread_q_underflow_mask", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"me_pkt_in_overflow_mask", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"me_pkt_in_underflow_mask", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"me_rdy_q_overflow_mask", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"me_rdy_q_underflow_mask", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"me_pkt_out_q_overflow_mask", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"me_pkt_out_q_underflow_mask", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"me_continue_q_overflow_mask", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"me_continue_q_underflow_mask", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"me_esrh_q_overflow_mask", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"me_esrh_q_underflow_mask", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"me_isrh_q_overflow_mask", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"me_isrh_q_underflow_mask", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"me_cache_miss_q_overflow_mask", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"me_cache_miss_q_underflow_mask", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"me_base_q_u0_overflow_mask", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"me_base_q_u0_underflow_mask", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"me_base_q_u1_overflow_mask", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"me_base_q_u1_underflow_mask", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"me_base_q_u2_overflow_mask", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"me_base_q_u2_underflow_mask", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"me_base_q_u3_overflow_mask", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"me_base_q_u3_underflow_mask", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"me_reg_pc_q_overflow_mask", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"me_reg_pc_q_underflow_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"me_branch_q_overflow_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"me_branch_q_underflow_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"me_pkt_base_q_overflow_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"me_pkt_base_q_underflow_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_int_1200m_me_fifo_mask_h_reg[] = + { + {"me_except_refetch_pc_overflow_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"me_except_refetch_pc_underflow_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_fifo_interrupt_flag_l_reg[] = + { + {"me_free_pkt_q_overflow_flag", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"me_free_pkt_q_underflow_flag", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"me_free_thread_q_overflow_flag", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"me_free_thread_q_underflow_flag", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"me_pkt_in_overflow_flag", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"me_pkt_in_underflow_flag", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"me_rdy_q_overflow_flag", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"me_rdy_q_underflow_flag", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"me_pkt_out_q_overflow_flag", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"me_pkt_out_q_underflow_flag", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"me_continue_q_overflow_flag", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"me_continue_q_underflow_flag", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"me_esrh_q_overflow_flag", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"me_esrh_q_underflow_flag", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"me_isrh_q_overflow_flag", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"me_isrh_q_underflow_flag", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"me_cache_miss_q_overflow_flag", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"me_cache_miss_q_underflow_flag", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"me_base_q_u0_overflow_flag", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"me_base_q_u0_underflow_flag", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"me_base_q_u1_overflow_flag", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"me_base_q_u1_underflow_flag", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"me_base_q_u2_overflow_flag", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"me_base_q_u2_underflow_flag", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"me_base_q_u3_overflow_flag", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"me_base_q_u3_underflow_flag", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"me_reg_pc_q_overflow_flag", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"me_reg_pc_q_underflow_flag", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"me_branch_q_overflow_flag", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"me_branch_q_underflow_flag", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"me_pkt_base_q_overflow_flag", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"me_pkt_base_q_underflow_flag", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_fifo_interrupt_flag_h_reg[] = + { + {"me_except_refetch_pc_overflow_flag", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"me_except_refetch_pc_underflow_flag", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_fifo_interrupt_sta_l_reg[] = + { + {"me_free_pkt_q_overflow_sta", DPP_FIELD_FLAG_RO, 31, 1, 0x0, 0x0}, + {"me_free_pkt_q_underflow_sta", DPP_FIELD_FLAG_RO, 30, 1, 0x0, 0x0}, + {"me_free_thread_q_overflow_sta", DPP_FIELD_FLAG_RO, 29, 1, 0x0, 0x0}, + {"me_free_thread_q_underflow_sta", DPP_FIELD_FLAG_RO, 28, 1, 0x0, 0x0}, + {"me_pkt_in_overflow_sta", DPP_FIELD_FLAG_RO, 27, 1, 0x0, 0x0}, + {"me_pkt_in_underflow_sta", DPP_FIELD_FLAG_RO, 26, 1, 0x0, 0x0}, + {"me_rdy_q_overflow_sta", DPP_FIELD_FLAG_RO, 25, 1, 0x0, 0x0}, + {"me_rdy_q_underflow_sta", DPP_FIELD_FLAG_RO, 24, 1, 0x0, 0x0}, + {"me_pkt_out_q_overflow_sta", DPP_FIELD_FLAG_RO, 23, 1, 0x0, 0x0}, + {"me_pkt_out_q_underflow_sta", DPP_FIELD_FLAG_RO, 22, 1, 0x0, 0x0}, + {"me_continue_q_overflow_sta", DPP_FIELD_FLAG_RO, 21, 1, 0x0, 0x0}, + {"me_continue_q_underflow_sta", DPP_FIELD_FLAG_RO, 20, 1, 0x0, 0x0}, + {"me_esrh_q_overflow_sta", DPP_FIELD_FLAG_RO, 19, 1, 0x0, 0x0}, + {"me_esrh_q_underflow_sta", DPP_FIELD_FLAG_RO, 18, 1, 0x0, 0x0}, + {"me_isrh_q_overflow_sta", DPP_FIELD_FLAG_RO, 17, 1, 0x0, 0x0}, + {"me_isrh_q_underflow_sta", DPP_FIELD_FLAG_RO, 16, 1, 0x0, 0x0}, + {"me_cache_miss_q_overflow_sta", DPP_FIELD_FLAG_RO, 15, 1, 0x0, 0x0}, + {"me_cache_miss_q_underflow_sta", DPP_FIELD_FLAG_RO, 14, 1, 0x0, 0x0}, + {"me_base_q_u0_overflow_sta", DPP_FIELD_FLAG_RO, 13, 1, 0x0, 0x0}, + {"me_base_q_u0_underflow_sta", DPP_FIELD_FLAG_RO, 12, 1, 0x0, 0x0}, + {"me_base_q_u1_overflow_sta", DPP_FIELD_FLAG_RO, 11, 1, 0x0, 0x0}, + {"me_base_q_u1_underflow_sta", DPP_FIELD_FLAG_RO, 10, 1, 0x0, 0x0}, + {"me_base_q_u2_overflow_sta", DPP_FIELD_FLAG_RO, 9, 1, 0x0, 0x0}, + {"me_base_q_u2_underflow_sta", DPP_FIELD_FLAG_RO, 8, 1, 0x0, 0x0}, + {"me_base_q_u3_overflow_sta", DPP_FIELD_FLAG_RO, 7, 1, 0x0, 0x0}, + {"me_base_q_u3_underflow_sta", DPP_FIELD_FLAG_RO, 6, 1, 0x0, 0x0}, + {"me_reg_pc_q_overflow_sta", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"me_reg_pc_q_underflow_sta", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"me_branch_q_overflow_sta", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"me_branch_q_underflow_sta", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"me_pkt_base_q_overflow_sta", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"me_pkt_base_q_underflow_sta", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_fifo_interrupt_sta_h_reg[] = + { + {"me_except_refetch_pc_overflow_sta", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"me_except_refetch_pc_underflow_sta", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_int_1200m_cluster_mex_fifo_mask_l_reg[] = + { + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u3_overflow_mask", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u3_underflow_mask", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u4_overflow_mask", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u4_underflow_mask", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u5_overflow_mask", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u5_underflow_mask", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u6_overflow_mask", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u6_underflow_mask", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u7_overflow_mask", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u7_underflow_mask", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"ppu_ise_rsp_afifo_64x143_wrapper_u0_underflow_mask", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"ise_rsp_ram_free_ptr_u0_overflow_mask", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"ise_rsp_ram_free_ptr_u0_underflow_mask", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u0_overflow_mask", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u0_underflow_mask", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u1_overflow_mask", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u1_underflow_mask", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u2_overflow_mask", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u2_underflow_mask", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u3_overflow_mask", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u3_underflow_mask", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u4_overflow_mask", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u4_underflow_mask", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u5_overflow_mask", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u5_underflow_mask", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u6_overflow_mask", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u6_underflow_mask", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u7_overflow_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u7_underflow_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"ppu_sta_rsp_afifo_64x79_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"ppu_sta_rsp_fwft_fifo_128x79_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"ppu_sta_rsp_fwft_fifo_128x79_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_int_1200m_cluster_mex_fifo_mask_h_reg[] = + { + {"ppu_se_key_afifo_32x54_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"ppu_se_key_afifo_32x665_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"ppu_sta_key_afifo_32x110_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"ppu_cluster_mf_in_afifo_32x2048_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"ppu_pbu_mcode_pf_rsp_fifo_32x13_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"ppu_pbu_mcode_pf_rsp_fifo_32x13_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"ppu_coprocess_rsp_fifo_32x77_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"ppu_coprocess_rsp_fifo_32x77_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"ppu_coprocess_rsp_fwft_fifo_128x78_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"ppu_coprocess_rsp_fwft_fifo_128x78_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"ppu_ese_rsp_afifo_64x271_wrapper_u0_underflow_mask", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"ese_rsp_ram_free_ptr_u0_overflow_mask", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"ese_rsp_ram_free_ptr_u0_underflow_mask", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u0_overflow_mask", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u0_underflow_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u1_overflow_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u1_underflow_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u2_overflow_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u2_underflow_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_int_1200m_cluster_mex_fifo_flag_l_reg[] = + { + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u3_overflow_flag", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u3_underflow_flag", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u4_overflow_flag", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u4_underflow_flag", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u5_overflow_flag", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u5_underflow_flag", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u6_overflow_flag", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u6_underflow_flag", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u7_overflow_flag", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u7_underflow_flag", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ppu_ise_rsp_afifo_64x143_wrapper_u0_underflow_flag", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ise_rsp_ram_free_ptr_u0_overflow_flag", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ise_rsp_ram_free_ptr_u0_underflow_flag", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u0_overflow_flag", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u0_underflow_flag", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u1_overflow_flag", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u1_underflow_flag", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u2_overflow_flag", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u2_underflow_flag", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u3_overflow_flag", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u3_underflow_flag", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u4_overflow_flag", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u4_underflow_flag", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u5_overflow_flag", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u5_underflow_flag", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u6_overflow_flag", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u6_underflow_flag", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u7_overflow_flag", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u7_underflow_flag", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ppu_sta_rsp_afifo_64x79_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ppu_sta_rsp_fwft_fifo_128x79_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ppu_sta_rsp_fwft_fifo_128x79_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_int_1200m_cluster_mex_fifo_flag_h_reg[] = + { + {"ppu_se_key_afifo_32x54_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ppu_se_key_afifo_32x665_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ppu_sta_key_afifo_32x110_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ppu_cluster_mf_in_afifo_32x2048_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ppu_pbu_mcode_pf_rsp_fifo_32x13_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ppu_pbu_mcode_pf_rsp_fifo_32x13_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ppu_coprocess_rsp_fifo_32x77_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ppu_coprocess_rsp_fifo_32x77_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ppu_coprocess_rsp_fwft_fifo_128x78_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ppu_coprocess_rsp_fwft_fifo_128x78_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ppu_ese_rsp_afifo_64x271_wrapper_u0_underflow_flag", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ese_rsp_ram_free_ptr_u0_overflow_flag", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ese_rsp_ram_free_ptr_u0_underflow_flag", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u0_overflow_flag", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u0_underflow_flag", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u1_overflow_flag", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u1_underflow_flag", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u2_overflow_flag", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u2_underflow_flag", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_int_1200m_cluster_mex_fifo_stat_l_reg[] = + { + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u3_overflow_stat", DPP_FIELD_FLAG_RO, 31, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u3_underflow_stat", DPP_FIELD_FLAG_RO, 30, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u4_overflow_stat", DPP_FIELD_FLAG_RO, 29, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u4_underflow_stat", DPP_FIELD_FLAG_RO, 28, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u5_overflow_stat", DPP_FIELD_FLAG_RO, 27, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u5_underflow_stat", DPP_FIELD_FLAG_RO, 26, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u6_overflow_stat", DPP_FIELD_FLAG_RO, 25, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u6_underflow_stat", DPP_FIELD_FLAG_RO, 24, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u7_overflow_stat", DPP_FIELD_FLAG_RO, 23, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u7_underflow_stat", DPP_FIELD_FLAG_RO, 22, 1, 0x0, 0x0}, + {"ppu_ise_rsp_afifo_64x143_wrapper_u0_underflow_stat", DPP_FIELD_FLAG_RO, 21, 1, 0x0, 0x0}, + {"ise_rsp_ram_free_ptr_u0_overflow_stat", DPP_FIELD_FLAG_RO, 20, 1, 0x0, 0x0}, + {"ise_rsp_ram_free_ptr_u0_underflow_stat", DPP_FIELD_FLAG_RO, 19, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u0_overflow_stat", DPP_FIELD_FLAG_RO, 18, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u0_underflow_stat", DPP_FIELD_FLAG_RO, 17, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u1_overflow_stat", DPP_FIELD_FLAG_RO, 16, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u1_underflow_stat", DPP_FIELD_FLAG_RO, 15, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u2_overflow_stat", DPP_FIELD_FLAG_RO, 14, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u2_underflow_stat", DPP_FIELD_FLAG_RO, 13, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u3_overflow_stat", DPP_FIELD_FLAG_RO, 12, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u3_underflow_stat", DPP_FIELD_FLAG_RO, 11, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u4_overflow_stat", DPP_FIELD_FLAG_RO, 10, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u4_underflow_stat", DPP_FIELD_FLAG_RO, 9, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u5_overflow_stat", DPP_FIELD_FLAG_RO, 8, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u5_underflow_stat", DPP_FIELD_FLAG_RO, 7, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u6_overflow_stat", DPP_FIELD_FLAG_RO, 6, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u6_underflow_stat", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u7_overflow_stat", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"ppu_ise_rsp_ptr_fwft_fifo_128x7_wrapper_u7_underflow_stat", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"ppu_sta_rsp_afifo_64x79_wrapper_underflow_stat", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"ppu_sta_rsp_fwft_fifo_128x79_wrapper_overflow_stat", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"ppu_sta_rsp_fwft_fifo_128x79_wrapper_underflow_stat", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_int_1200m_cluster_mex_fifo_stat_h_reg[] = + { + {"ppu_se_key_afifo_32x54_wrapper_overflow_stat", DPP_FIELD_FLAG_RO, 18, 1, 0x0, 0x0}, + {"ppu_se_key_afifo_32x665_wrapper_overflow_stat", DPP_FIELD_FLAG_RO, 17, 1, 0x0, 0x0}, + {"ppu_sta_key_afifo_32x110_wrapper_overflow_stat", DPP_FIELD_FLAG_RO, 16, 1, 0x0, 0x0}, + {"ppu_cluster_mf_in_afifo_32x2048_wrapper_underflow_stat", DPP_FIELD_FLAG_RO, 15, 1, 0x0, 0x0}, + {"ppu_pbu_mcode_pf_rsp_fifo_32x13_wrapper_overflow_stat", DPP_FIELD_FLAG_RO, 14, 1, 0x0, 0x0}, + {"ppu_pbu_mcode_pf_rsp_fifo_32x13_wrapper_underflow_stat", DPP_FIELD_FLAG_RO, 13, 1, 0x0, 0x0}, + {"ppu_coprocess_rsp_fifo_32x77_wrapper_overflow_stat", DPP_FIELD_FLAG_RO, 12, 1, 0x0, 0x0}, + {"ppu_coprocess_rsp_fifo_32x77_wrapper_underflow_stat", DPP_FIELD_FLAG_RO, 11, 1, 0x0, 0x0}, + {"ppu_coprocess_rsp_fwft_fifo_128x78_wrapper_overflow_stat", DPP_FIELD_FLAG_RO, 10, 1, 0x0, 0x0}, + {"ppu_coprocess_rsp_fwft_fifo_128x78_wrapper_underflow_stat", DPP_FIELD_FLAG_RO, 9, 1, 0x0, 0x0}, + {"ppu_ese_rsp_afifo_64x271_wrapper_u0_underflow_stat", DPP_FIELD_FLAG_RO, 8, 1, 0x0, 0x0}, + {"ese_rsp_ram_free_ptr_u0_overflow_stat", DPP_FIELD_FLAG_RO, 7, 1, 0x0, 0x0}, + {"ese_rsp_ram_free_ptr_u0_underflow_stat", DPP_FIELD_FLAG_RO, 6, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u0_overflow_stat", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u0_underflow_stat", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u1_overflow_stat", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u1_underflow_stat", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u2_overflow_stat", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"ppu_ese_rsp_ptr_fwft_fifo_128x7_wrapper_u2_underflow_stat", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_statics_wb_exception_cfg_reg[] = + { + {"csr_statics_wb_exception_code5", DPP_FIELD_FLAG_RW, 22, 3, 0x7, 0x0}, + {"csr_statics_wb_exception_code4", DPP_FIELD_FLAG_RW, 18, 3, 0x6, 0x0}, + {"csr_statics_wb_exception_code3", DPP_FIELD_FLAG_RW, 14, 3, 0x5, 0x0}, + {"csr_statics_wb_exception_code2", DPP_FIELD_FLAG_RW, 10, 3, 0x4, 0x0}, + {"csr_statics_wb_exception_code1", DPP_FIELD_FLAG_RW, 6, 3, 0x3, 0x0}, + {"csr_statics_wb_exception_code0", DPP_FIELD_FLAG_RW, 2, 3, 0x2, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_thread_switch_en_reg[] = + { + {"thread_switch_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_is_me_not_idle_reg[] = + { + {"me7_is_not_idle", DPP_FIELD_FLAG_RO, 7, 1, 0x0, 0x0}, + {"me6_is_not_idle", DPP_FIELD_FLAG_RO, 6, 1, 0x0, 0x0}, + {"me5_is_not_idle", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"me4_is_not_idle", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"me3_is_not_idle", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"me2_is_not_idle", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"me1_is_not_idle", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"me0_is_not_idle", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_cluster_mf_in_afifo_prog_empty_assert_cfg_reg[] = + { + {"ppu_cluster_mf_in_afifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_cluster_mf_in_afifo_prog_empty_negate_cfg_reg[] = + { + {"ppu_cluster_mf_in_afifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ese_rsp_afifo_prog_empty_assert_cfg_reg[] = + { + {"ese_rsp_afifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0xe, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ese_rsp_afifo_prog_empty_negate_cfg_reg[] = + { + {"ese_rsp_afifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0xe, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ise_rsp_afifo_prog_empty_assert_cfg_reg[] = + { + {"ise_rsp_afifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x20, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ise_rsp_afifo_prog_empty_negate_cfg_reg[] = + { + {"ise_rsp_afifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x20, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_rsp_ptr_fwft_fifo0_prog_full_assert_cfg_reg[] = + { + {"ppu_rsp_ptr_fwft_fifo0_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x78, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_rsp_ptr_fwft_fifo0_prog_full_negate_cfg_reg[] = + { + {"ppu_rsp_ptr_fwft_fifo0_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x78, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_rsp_ptr_fwft_fifo0_prog_empty_assert_cfg_reg[] = + { + {"ppu_rsp_ptr_fwft_fifo0_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x6, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_rsp_ptr_fwft_fifo0_prog_empty_negate_cfg_reg[] = + { + {"ppu_rsp_ptr_fwft_fifo0_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x6, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_rsp_ptr_fwft_fifo1_prog_full_assert_cfg_reg[] = + { + {"ppu_rsp_ptr_fwft_fifo1_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x78, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_rsp_ptr_fwft_fifo1_prog_full_negate_cfg_reg[] = + { + {"ppu_rsp_ptr_fwft_fifo1_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x78, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_rsp_ptr_fwft_fifo1_prog_empty_assert_cfg_reg[] = + { + {"ppu_rsp_ptr_fwft_fifo1_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_rsp_ptr_fwft_fifo1_prog_empty_negate_cfg_reg[] = + { + {"ppu_rsp_ptr_fwft_fifo1_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_sta_rsp_afifo_prog_empty_assert_cfg_reg[] = + { + {"sta_rsp_afifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_sta_rsp_afifo_prog_empty_negate_cfg_reg[] = + { + {"sta_rsp_afifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_sta_rsp_fwft_fifo_prog_full_assert_cfg_reg[] = + { + {"ppu_sta_rsp_fwft_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x78, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_sta_rsp_fwft_fifo_prog_full_negate_cfg_reg[] = + { + {"ppu_sta_rsp_fwft_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x78, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_sta_rsp_fwft_fifo_prog_empty_assert_cfg_reg[] = + { + {"ppu_sta_rsp_fwft_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_sta_rsp_fwft_fifo_prog_empty_negate_cfg_reg[] = + { + {"ppu_sta_rsp_fwft_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_cop_rsp_fifo_prog_full_assert_cfg_reg[] = + { + {"cop_rsp_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x17, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_cop_rsp_fifo_prog_full_negate_cfg_reg[] = + { + {"cop_rsp_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x17, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_cop_rsp_fifo_prog_empty_assert_cfg_reg[] = + { + {"cop_rsp_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_cop_rsp_fifo_prog_empty_negate_cfg_reg[] = + { + {"cop_rsp_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_mcode_pf_rsp_fifo_prog_full_assert_cfg_reg[] = + { + {"mcode_pf_rsp_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x18, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_mcode_pf_rsp_fifo_prog_full_negate_cfg_reg[] = + { + {"mcode_pf_rsp_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x18, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_mcode_pf_rsp_fifo_prog_empty_assert_cfg_reg[] = + { + {"mcode_pf_rsp_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_mcode_pf_rsp_fifo_prog_empty_negate_cfg_reg[] = + { + {"mcode_pf_rsp_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_cop_rsp_fwft_fifo_prog_full_assert_cfg_reg[] = + { + {"ppu_cop_rsp_fwft_fifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x78, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_cop_rsp_fwft_fifo_prog_full_negate_cfg_reg[] = + { + {"ppu_cop_rsp_fwft_fifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x78, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_cop_rsp_fwft_fifo_prog_empty_assert_cfg_reg[] = + { + {"ppu_cop_rsp_fwft_fifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_cop_rsp_fwft_fifo_prog_empty_negate_cfg_reg[] = + { + {"ppu_cop_rsp_fwft_fifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_ise_key_afifo_prog_full_assert_cfg_reg[] = + { + {"ppu_ise_key_afifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x14, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_ise_key_afifo_prog_full_negate_cfg_reg[] = + { + {"ppu_ise_key_afifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x14, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_ese_key_afifo_prog_full_assert_cfg_reg[] = + { + {"ppu_ese_key_afifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x14, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_ese_key_afifo_prog_full_negate_cfg_reg[] = + { + {"ppu_ese_key_afifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x14, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_sta_key_afifo_prog_full_assert_cfg_reg[] = + { + {"ppu_sta_key_afifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x14, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_sta_key_afifo_prog_full_negate_cfg_reg[] = + { + {"ppu_sta_key_afifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x14, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_int_600m_cluster_mex_fifo_mask_reg[] = + { + {"ppu_se_key_afifo_32x54_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"ppu_se_key_afifo_32x665_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"ppu_sta_key_afifo_32x110_wrapper_underflow_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"ppu_cluster_mf_in_afifo_32x2048_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"ppu_ese_rsp_afifo_64x271_wrapper_u0_overflow_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"ppu_ise_rsp_afifo_64x143_wrapper_u0_overflow_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"ppu_sta_rsp_afifo_64x79_wrapper_overflow_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_cluster_mex_fifo_600m_interrupt_flag_reg[] = + { + {"ppu_se_key_afifo_32x54_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ppu_se_key_afifo_32x665_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ppu_sta_key_afifo_32x110_wrapper_underflow_flag", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ppu_cluster_mf_in_afifo_32x2048_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ppu_ese_rsp_afifo_64x271_wrapper_u0_overflow_flag", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ppu_ise_rsp_afifo_64x143_wrapper_u0_overflow_flag", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ppu_sta_rsp_afifo_64x79_wrapper_overflow_flag", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_cluster_mex_fifo_600m_interrupt_sta_reg[] = + { + {"ppu_se_key_afifo_32x54_wrapper_underflow_sta", DPP_FIELD_FLAG_RO, 6, 1, 0x0, 0x0}, + {"ppu_se_key_afifo_32x665_wrapper_underflow_sta", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"ppu_sta_key_afifo_32x110_wrapper_underflow_sta", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"ppu_cluster_mf_in_afifo_32x2048_wrapper_overflow_sta", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"ppu_ese_rsp_afifo_64x271_wrapper_u0_overflow_sta", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"ppu_ise_rsp_afifo_64x143_wrapper_u0_overflow_sta", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"ppu_sta_rsp_afifo_64x79_wrapper_overflow_sta", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_mex_cnt_cfg_reg[] = + { + {"csr_count_overflow_mode", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"csr_count_rd_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_int_600m_cluster_mex_ram_ecc_error_interrupt_mask_reg[] = + { + {"ppu_sta_key_ram_1r1w_32x110_ecc_double_err_mask", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"ppu_se_key_afifo_32x665_ecc_double_err_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"ppu_se_key_afifo_32x54_ecc_double_err_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"ppu_sta_key_ram_1r1w_32x110_ecc_single_err_flag", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"ppu_se_key_afifo_32x665_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"ppu_se_key_afifo_32x54_ecc_single_err_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_cluster_mex_ram_600m_ecc_error_interrupt_flag_reg[] = + { + {"ppu_sta_key_ram_1r1w_32x110_ecc_double_err_flag", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ppu_se_key_afifo_32x665_ecc_double_err_flag", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ppu_se_key_afifo_32x54_ecc_double_err_flag", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ppu_sta_key_ram_1r1w_32x110_ecc_single_err_flag", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ppu_se_key_afifo_32x665_ecc_single_err_flag", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ppu_se_key_afifo_32x54_ecc_single_err_flag", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_cluster_mex_ram_600m_ecc_error_interrupt_sta_reg[] = + { + {"ppu_sta_key_ram_1r1w_32x110_ecc_double_err_stat", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"ppu_se_key_afifo_32x665_ecc_double_err_stat", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"ppu_se_key_afifo_32x54_ecc_double_err_stat", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"ppu_sta_key_ram_1r1w_32x110_ecc_single_err_stat", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"ppu_se_key_afifo_32x665_ecc_single_err_stat", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"ppu_se_key_afifo_32x54_ecc_single_err_stat", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_cluster_mf_in_afifo_prog_full_assert_cfg_reg[] = + { + {"ppu_cluster_mf_in_afifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x10, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_cluster_mf_in_afifo_prog_full_negate_cfg_reg[] = + { + {"ppu_cluster_mf_in_afifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x10, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ese_rsp_afifo_prog_full_assert_cfg_reg[] = + { + {"ese_rsp_afifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x2c, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ese_rsp_afifo_prog_full_negate_cfg_reg[] = + { + {"ese_rsp_afifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x2c, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ise_rsp_afifo_prog_full_assert_cfg_reg[] = + { + {"ise_rsp_afifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x29, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ise_rsp_afifo_prog_full_negate_cfg_reg[] = + { + {"ise_rsp_afifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x29, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_sta_rsp_afifo_prog_full_assert_cfg_reg[] = + { + {"sta_rsp_afifo_prog_full_assert_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x27, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_sta_rsp_afifo_prog_full_negate_cfg_reg[] = + { + {"sta_rsp_afifo_prog_full_negate_cfg", DPP_FIELD_FLAG_RW, 6, 7, 0x27, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_ise_key_afifo_prog_empty_assert_cfg_reg[] = + { + {"ppu_ise_key_afifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_ise_key_afifo_prog_empty_negate_cfg_reg[] = + { + {"ppu_ise_key_afifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_ese_key_afifo_prog_empty_assert_cfg_reg[] = + { + {"ppu_ese_key_afifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_ese_key_afifo_prog_empty_negate_cfg_reg[] = + { + {"ppu_ese_key_afifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_sta_key_afifo_prog_empty_assert_cfg_reg[] = + { + {"ppu_sta_key_afifo_prog_empty_assert_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_sta_key_afifo_prog_empty_negate_cfg_reg[] = + { + {"ppu_sta_key_afifo_prog_empty_negate_cfg", DPP_FIELD_FLAG_RW, 5, 6, 0x4, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_cluster_mf_vld_cnt_h_reg[] = + { + {"ppu_cluster_mf_vld_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ppu_cluster_mf_vld_cnt_l_reg[] = + { + {"ppu_cluster_mf_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_cluster_ise_key_out_vld_cnt_reg[] = + { + {"cluster_ise_key_out_vld_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ise_cluster_rsp_in_vld_cnt_reg[] = + { + {"ise_cluster_rsp_in_vld_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_cluster_ese_key_out_vld_cnt_reg[] = + { + {"cluster_ese_key_out_vld_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ese_cluster_rsp_in_vld_cnt_reg[] = + { + {"ese_cluster_rsp_in_vld_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_cluster_stat_cmd_vld_cnt_reg[] = + { + {"cluster_stat_cmd_vld_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_stat_cluster_rsp_vld_cnt_reg[] = + { + {"stat_cluster_rsp_vld_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_mex_debug_key_vld_cnt_reg[] = + { + {"mex_debug_key_vld_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ise_cluster_key_fc_cnt_reg[] = + { + {"ise_cluster_key_fc_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_ese_cluster_key_fc_cnt_reg[] = + { + {"ese_cluster_key_fc_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_cluster_ise_rsp_fc_cnt_reg[] = + { + {"cluster_ise_rsp_fc_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_cluster_ese_rsp_fc_cnt_reg[] = + { + {"cluster_ese_rsp_fc_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_stat_cluster_cmd_fc_cnt_reg[] = + { + {"stat_cluster_cmd_fc_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_cluster_stat_rsp_fc_cnt_reg[] = + { + {"cluster_stat_rsp_fc_cnt", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_cluster_ppu_mf_vld_cnt_l_reg[] = + { + {"cluster_ppu_mf_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_cluster_ppu_mf_vld_cnt_h_reg[] = + { + {"cluster_ppu_mf_vld_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_cluster_cop_key_vld_cnt_l_reg[] = + { + {"cluster_cop_key_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_cluster_cop_key_vld_cnt_h_reg[] = + { + {"cluster_cop_key_vld_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_cop_cluster_rsp_vld_cnt_l_reg[] = + { + {"cop_cluster_rsp_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_cop_cluster_rsp_vld_cnt_h_reg[] = + { + {"cop_cluster_rsp_vld_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_mex_me_pkt_in_sop_cnt_l_reg[] = + { + {"mex_me_pkt_in_sop_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_mex_me_pkt_in_sop_cnt_h_reg[] = + { + {"mex_me_pkt_in_sop_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_mex_me_pkt_in_eop_cnt_l_reg[] = + { + {"mex_me_pkt_in_eop_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_mex_me_pkt_in_eop_cnt_h_reg[] = + { + {"mex_me_pkt_in_eop_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_mex_me_pkt_in_vld_cnt_l_reg[] = + { + {"mex_me_pkt_in_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_mex_me_pkt_in_vld_cnt_h_reg[] = + { + {"mex_me_pkt_in_vld_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_pkt_out_sop_cnt_l_reg[] = + { + {"me_mex_pkt_out_sop_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_pkt_out_sop_cnt_h_reg[] = + { + {"me_mex_pkt_out_sop_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_pkt_out_eop_cnt_l_reg[] = + { + {"me_mex_pkt_out_eop_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_pkt_out_eop_cnt_h_reg[] = + { + {"me_mex_pkt_out_eop_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_pkt_out_vld_cnt_l_reg[] = + { + {"me_mex_pkt_out_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_pkt_out_vld_cnt_h_reg[] = + { + {"me_mex_pkt_out_vld_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_i_key_out_sop_cnt_l_reg[] = + { + {"me_mex_i_key_out_sop_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_i_key_out_sop_cnt_h_reg[] = + { + {"me_mex_i_key_out_sop_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_i_key_out_eop_cnt_l_reg[] = + { + {"me_mex_i_key_out_eop_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_i_key_out_eop_cnt_h_reg[] = + { + {"me_mex_i_key_out_eop_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_i_key_out_vld_cnt_l_reg[] = + { + {"me_mex_i_key_out_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_i_key_out_vld_cnt_h_reg[] = + { + {"me_mex_i_key_out_vld_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_e_key_out_sop_cnt_l_reg[] = + { + {"me_mex_e_key_out_sop_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_e_key_out_sop_cnt_h_reg[] = + { + {"me_mex_e_key_out_sop_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_e_key_out_eop_cnt_l_reg[] = + { + {"me_mex_e_key_out_eop_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_e_key_out_eop_cnt_h_reg[] = + { + {"me_mex_e_key_out_eop_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_e_key_out_vld_cnt_l_reg[] = + { + {"me_mex_e_key_out_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_e_key_out_vld_cnt_h_reg[] = + { + {"me_mex_e_key_out_vld_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_demux_ise_key_vld_cnt_l_reg[] = + { + {"me_mex_demux_ise_key_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_demux_ise_key_vld_cnt_h_reg[] = + { + {"me_mex_demux_ise_key_vld_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_demux_ese_key_vld_cnt_l_reg[] = + { + {"me_mex_demux_ese_key_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_demux_ese_key_vld_cnt_h_reg[] = + { + {"me_mex_demux_ese_key_vld_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_demux_sta_key_vld_cnt_l_reg[] = + { + {"me_mex_demux_sta_key_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_demux_sta_key_vld_cnt_h_reg[] = + { + {"me_mex_demux_sta_key_vld_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_demux_cop_key_vld_cnt_l_reg[] = + { + {"me_mex_demux_cop_key_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_mex_demux_cop_key_vld_cnt_h_reg[] = + { + {"me_mex_demux_cop_key_vld_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_mex_me_demux_ise_rsp_vld_cnt_l_reg[] = + { + {"mex_me_demux_ise_rsp_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_mex_me_demux_ise_rsp_vld_cnt_h_reg[] = + { + {"mex_me_demux_ise_rsp_vld_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_mex_me_demux_ese_rsp_vld_cnt_l_reg[] = + { + {"mex_me_demux_ese_rsp_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_mex_me_demux_ese_rsp_vld_cnt_h_reg[] = + { + {"mex_me_demux_ese_rsp_vld_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_mex_me_demux_sta_rsp_vld_cnt_l_reg[] = + { + {"mex_me_demux_sta_rsp_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_mex_me_demux_sta_rsp_vld_cnt_h_reg[] = + { + {"mex_me_demux_sta_rsp_vld_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_mex_me_demux_cop_rsp_vld_cnt_l_reg[] = + { + {"mex_me_demux_cop_rsp_vld_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_mex_me_demux_cop_rsp_vld_cnt_h_reg[] = + { + {"mex_me_demux_cop_rsp_vld_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_exception_code0_cnt_l_reg[] = + { + {"me_exception_code0_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_exception_code0_cnt_h_reg[] = + { + {"me_exception_code0_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_exception_code1_cnt_l_reg[] = + { + {"me_exception_code1_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_exception_code1_cnt_h_reg[] = + { + {"me_exception_code1_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_exception_code2_cnt_l_reg[] = + { + {"me_exception_code2_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_exception_code2_cnt_h_reg[] = + { + {"me_exception_code2_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_exception_code3_cnt_l_reg[] = + { + {"me_exception_code3_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_exception_code3_cnt_h_reg[] = + { + {"me_exception_code3_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_exception_code4_cnt_l_reg[] = + { + {"me_exception_code4_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_exception_code4_cnt_h_reg[] = + { + {"me_exception_code4_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_exception_code5_cnt_l_reg[] = + { + {"me_exception_code5_cnt_l", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ppu_cluster_me_exception_code5_cnt_h_reg[] = + { + {"me_exception_code5_cnt_h", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_ppu_soft_rst_reg[] = + { + {"ppu_soft_rst", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_ept_flag_reg[] = + { + {"ept_flag", DPP_FIELD_FLAG_RO, 5, 6, 0x3f, 0x0}, + }; +DPP_FIELD_T g_se_cfg_ddr_key_lk0_3_reg[] = + { + {"ddr_key_lk0_3", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_ddr_key_lk0_2_reg[] = + { + {"ddr_key_lk0_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_ddr_key_lk0_1_reg[] = + { + {"ddr_key_lk0_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_ddr_key_lk0_0_reg[] = + { + {"ddr_key_lk0_0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_ddr_key_lk1_3_reg[] = + { + {"ddr_key_lk1_3", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_ddr_key_lk1_2_reg[] = + { + {"ddr_key_lk1_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_ddr_key_lk1_1_reg[] = + { + {"ddr_key_lk1_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_ddr_key_lk1_0_reg[] = + { + {"ddr_key_lk1_0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk0_18_reg[] = + { + {"hash_key_lk0_18", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk0_17_reg[] = + { + {"hash_key_lk0_17", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk0_16_reg[] = + { + {"hash_key_lk0_16", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk0_15_reg[] = + { + {"hash_key_lk0_15", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk0_14_reg[] = + { + {"hash_key_lk0_14", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk0_13_reg[] = + { + {"hash_key_lk0_13", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk0_12_reg[] = + { + {"hash_key_lk0_12", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk0_11_reg[] = + { + {"hash_key_lk0_11", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk0_10_reg[] = + { + {"hash_key_lk0_10", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk0_9_reg[] = + { + {"hash_key_lk0_9", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk0_8_reg[] = + { + {"hash_key_lk0_8", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk0_7_reg[] = + { + {"hash_key_lk0_7", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk0_6_reg[] = + { + {"hash_key_lk0_6", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk0_5_reg[] = + { + {"hash_key_lk0_5", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk0_4_reg[] = + { + {"hash_key_lk0_4", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk0_3_reg[] = + { + {"hash_key_lk0_3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk0_2_reg[] = + { + {"hash_key_lk0_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk0_1_reg[] = + { + {"hash_key_lk0_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk0_0_reg[] = + { + {"hash_key_lk0_0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk1_18_reg[] = + { + {"hash_key_lk1_18", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk1_17_reg[] = + { + {"hash_key_lk1_17", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk1_16_reg[] = + { + {"hash_key_lk1_16", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk1_15_reg[] = + { + {"hash_key_lk1_15", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk1_14_reg[] = + { + {"hash_key_lk1_14", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk1_13_reg[] = + { + {"hash_key_lk1_13", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk1_12_reg[] = + { + {"hash_key_lk1_12", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk1_11_reg[] = + { + {"hash_key_lk1_11", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk1_10_reg[] = + { + {"hash_key_lk1_10", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk1_9_reg[] = + { + {"hash_key_lk1_9", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk1_8_reg[] = + { + {"hash_key_lk1_8", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk1_7_reg[] = + { + {"hash_key_lk1_7", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk1_6_reg[] = + { + {"hash_key_lk1_6", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk1_5_reg[] = + { + {"hash_key_lk1_5", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk1_4_reg[] = + { + {"hash_key_lk1_4", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk1_3_reg[] = + { + {"hash_key_lk1_3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk1_2_reg[] = + { + {"hash_key_lk1_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk1_1_reg[] = + { + {"hash_key_lk1_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk1_0_reg[] = + { + {"hash_key_lk1_0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk2_18_reg[] = + { + {"hash_key_lk2_18", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk2_17_reg[] = + { + {"hash_key_lk2_17", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk2_16_reg[] = + { + {"hash_key_lk2_16", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk2_15_reg[] = + { + {"hash_key_lk2_15", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk2_14_reg[] = + { + {"hash_key_lk2_14", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk2_13_reg[] = + { + {"hash_key_lk2_13", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk2_12_reg[] = + { + {"hash_key_lk2_12", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk2_11_reg[] = + { + {"hash_key_lk2_11", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk2_10_reg[] = + { + {"hash_key_lk2_10", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk2_9_reg[] = + { + {"hash_key_lk2_9", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk2_8_reg[] = + { + {"hash_key_lk2_8", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk2_7_reg[] = + { + {"hash_key_lk2_7", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk2_6_reg[] = + { + {"hash_key_lk2_6", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk2_5_reg[] = + { + {"hash_key_lk2_5", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk2_4_reg[] = + { + {"hash_key_lk2_4", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk2_3_reg[] = + { + {"hash_key_lk2_3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk2_2_reg[] = + { + {"hash_key_lk2_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk2_1_reg[] = + { + {"hash_key_lk2_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk2_0_reg[] = + { + {"hash_key_lk2_0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk3_18_reg[] = + { + {"hash_key_lk3_18", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk3_17_reg[] = + { + {"hash_key_lk3_17", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk3_16_reg[] = + { + {"hash_key_lk3_16", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk3_15_reg[] = + { + {"hash_key_lk3_15", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk3_14_reg[] = + { + {"hash_key_lk3_14", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk3_13_reg[] = + { + {"hash_key_lk3_13", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk3_12_reg[] = + { + {"hash_key_lk3_12", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk3_11_reg[] = + { + {"hash_key_lk3_11", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk3_10_reg[] = + { + {"hash_key_lk3_10", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk3_9_reg[] = + { + {"hash_key_lk3_9", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk3_8_reg[] = + { + {"hash_key_lk3_8", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk3_7_reg[] = + { + {"hash_key_lk3_7", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk3_6_reg[] = + { + {"hash_key_lk3_6", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk3_5_reg[] = + { + {"hash_key_lk3_5", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk3_4_reg[] = + { + {"hash_key_lk3_4", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk3_3_reg[] = + { + {"hash_key_lk3_3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk3_2_reg[] = + { + {"hash_key_lk3_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk3_1_reg[] = + { + {"hash_key_lk3_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_hash_key_lk3_0_reg[] = + { + {"hash_key_lk3_0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk0_6_reg[] = + { + {"lpm_key_lk0_6", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk0_5_reg[] = + { + {"lpm_key_lk0_5", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk0_4_reg[] = + { + {"lpm_key_lk0_4", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk0_3_reg[] = + { + {"lpm_key_lk0_3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk0_2_reg[] = + { + {"lpm_key_lk0_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk0_1_reg[] = + { + {"lpm_key_lk0_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk0_0_reg[] = + { + {"lpm_key_lk0_0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk1_6_reg[] = + { + {"lpm_key_lk1_6", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk1_5_reg[] = + { + {"lpm_key_lk1_5", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk1_4_reg[] = + { + {"lpm_key_lk1_4", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk1_3_reg[] = + { + {"lpm_key_lk1_3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk1_2_reg[] = + { + {"lpm_key_lk1_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk1_1_reg[] = + { + {"lpm_key_lk1_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk1_0_reg[] = + { + {"lpm_key_lk1_0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk2_6_reg[] = + { + {"lpm_key_lk2_6", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk2_5_reg[] = + { + {"lpm_key_lk2_5", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk2_4_reg[] = + { + {"lpm_key_lk2_4", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk2_3_reg[] = + { + {"lpm_key_lk2_3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk2_2_reg[] = + { + {"lpm_key_lk2_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk2_1_reg[] = + { + {"lpm_key_lk2_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk2_0_reg[] = + { + {"lpm_key_lk2_0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk3_6_reg[] = + { + {"lpm_key_lk3_6", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk3_5_reg[] = + { + {"lpm_key_lk3_5", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk3_4_reg[] = + { + {"lpm_key_lk3_4", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk3_3_reg[] = + { + {"lpm_key_lk3_3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk3_2_reg[] = + { + {"lpm_key_lk3_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk3_1_reg[] = + { + {"lpm_key_lk3_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_lpm_key_lk3_0_reg[] = + { + {"lpm_key_lk3_0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk0_22_reg[] = + { + {"etcam_key_lk0_22", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk0_21_reg[] = + { + {"etcam_key_lk0_21", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk0_20_reg[] = + { + {"etcam_key_lk0_20", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk0_19_reg[] = + { + {"etcam_key_lk0_19", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk0_18_reg[] = + { + {"etcam_key_lk0_18", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk0_17_reg[] = + { + {"etcam_key_lk0_17", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk0_16_reg[] = + { + {"etcam_key_lk0_16", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk0_15_reg[] = + { + {"etcam_key_lk0_15", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk0_14_reg[] = + { + {"etcam_key_lk0_14", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk0_13_reg[] = + { + {"etcam_key_lk0_13", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk0_12_reg[] = + { + {"etcam_key_lk0_12", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk0_11_reg[] = + { + {"etcam_key_lk0_11", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk0_10_reg[] = + { + {"etcam_key_lk0_10", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk0_9_reg[] = + { + {"etcam_key_lk0_9", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk0_8_reg[] = + { + {"etcam_key_lk0_8", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk0_7_reg[] = + { + {"etcam_key_lk0_7", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk0_6_reg[] = + { + {"etcam_key_lk0_6", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk0_5_reg[] = + { + {"etcam_key_lk0_5", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk0_4_reg[] = + { + {"etcam_key_lk0_4", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk0_3_reg[] = + { + {"etcam_key_lk0_3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk0_2_reg[] = + { + {"etcam_key_lk0_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk0_1_reg[] = + { + {"etcam_key_lk0_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk0_0_reg[] = + { + {"etcam_key_lk0_0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk1_22_reg[] = + { + {"etcam_key_lk1_22", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk1_21_reg[] = + { + {"etcam_key_lk1_21", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk1_20_reg[] = + { + {"etcam_key_lk1_20", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk1_19_reg[] = + { + {"etcam_key_lk1_19", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk1_18_reg[] = + { + {"etcam_key_lk1_18", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk1_17_reg[] = + { + {"etcam_key_lk1_17", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk1_16_reg[] = + { + {"etcam_key_lk1_16", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk1_15_reg[] = + { + {"etcam_key_lk1_15", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk1_14_reg[] = + { + {"etcam_key_lk1_14", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk1_13_reg[] = + { + {"etcam_key_lk1_13", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk1_12_reg[] = + { + {"etcam_key_lk1_12", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk1_11_reg[] = + { + {"etcam_key_lk1_11", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk1_10_reg[] = + { + {"etcam_key_lk1_10", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk1_9_reg[] = + { + {"etcam_key_lk1_9", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk1_8_reg[] = + { + {"etcam_key_lk1_8", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk1_7_reg[] = + { + {"etcam_key_lk1_7", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk1_6_reg[] = + { + {"etcam_key_lk1_6", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk1_5_reg[] = + { + {"etcam_key_lk1_5", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk1_4_reg[] = + { + {"etcam_key_lk1_4", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk1_3_reg[] = + { + {"etcam_key_lk1_3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk1_2_reg[] = + { + {"etcam_key_lk1_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk1_1_reg[] = + { + {"etcam_key_lk1_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk1_0_reg[] = + { + {"etcam_key_lk1_0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk2_22_reg[] = + { + {"etcam_key_lk2_22", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk2_21_reg[] = + { + {"etcam_key_lk2_21", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk2_20_reg[] = + { + {"etcam_key_lk2_20", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk2_19_reg[] = + { + {"etcam_key_lk2_19", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk2_18_reg[] = + { + {"etcam_key_lk2_18", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk2_17_reg[] = + { + {"etcam_key_lk2_17", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk2_16_reg[] = + { + {"etcam_key_lk2_16", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk2_15_reg[] = + { + {"etcam_key_lk2_15", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk2_14_reg[] = + { + {"etcam_key_lk2_14", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk2_13_reg[] = + { + {"etcam_key_lk2_13", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk2_12_reg[] = + { + {"etcam_key_lk2_12", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk2_11_reg[] = + { + {"etcam_key_lk2_11", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk2_10_reg[] = + { + {"etcam_key_lk2_10", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk2_9_reg[] = + { + {"etcam_key_lk2_9", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk2_8_reg[] = + { + {"etcam_key_lk2_8", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk2_7_reg[] = + { + {"etcam_key_lk2_7", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk2_6_reg[] = + { + {"etcam_key_lk2_6", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk2_5_reg[] = + { + {"etcam_key_lk2_5", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk2_4_reg[] = + { + {"etcam_key_lk2_4", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk2_3_reg[] = + { + {"etcam_key_lk2_3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk2_2_reg[] = + { + {"etcam_key_lk2_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk2_1_reg[] = + { + {"etcam_key_lk2_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk2_0_reg[] = + { + {"etcam_key_lk2_0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk3_22_reg[] = + { + {"etcam_key_lk3_22", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk3_21_reg[] = + { + {"etcam_key_lk3_21", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk3_20_reg[] = + { + {"etcam_key_lk3_20", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk3_19_reg[] = + { + {"etcam_key_lk3_19", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk3_18_reg[] = + { + {"etcam_key_lk3_18", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk3_17_reg[] = + { + {"etcam_key_lk3_17", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk3_16_reg[] = + { + {"etcam_key_lk3_16", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk3_15_reg[] = + { + {"etcam_key_lk3_15", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk3_14_reg[] = + { + {"etcam_key_lk3_14", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk3_13_reg[] = + { + {"etcam_key_lk3_13", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk3_12_reg[] = + { + {"etcam_key_lk3_12", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk3_11_reg[] = + { + {"etcam_key_lk3_11", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk3_10_reg[] = + { + {"etcam_key_lk3_10", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk3_9_reg[] = + { + {"etcam_key_lk3_9", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk3_8_reg[] = + { + {"etcam_key_lk3_8", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk3_7_reg[] = + { + {"etcam_key_lk3_7", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk3_6_reg[] = + { + {"etcam_key_lk3_6", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk3_5_reg[] = + { + {"etcam_key_lk3_5", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk3_4_reg[] = + { + {"etcam_key_lk3_4", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk3_3_reg[] = + { + {"etcam_key_lk3_3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk3_2_reg[] = + { + {"etcam_key_lk3_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk3_1_reg[] = + { + {"etcam_key_lk3_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_etcam_key_lk3_0_reg[] = + { + {"etcam_key_lk3_0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_pbu_key_lk0_3_reg[] = + { + {"pbu_key_lk0_3", DPP_FIELD_FLAG_RO, 20, 21, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_pbu_key_lk0_2_reg[] = + { + {"pbu_key_lk0_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_pbu_key_lk0_1_reg[] = + { + {"pbu_key_lk0_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_pbu_key_lk0_0_reg[] = + { + {"pbu_key_lk0_0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_pbu_key_lk1_3_reg[] = + { + {"pbu_key_lk1_3", DPP_FIELD_FLAG_RO, 20, 21, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_pbu_key_lk1_2_reg[] = + { + {"pbu_key_lk1_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_pbu_key_lk1_1_reg[] = + { + {"pbu_key_lk1_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_pbu_key_lk1_0_reg[] = + { + {"pbu_key_lk1_0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_pbu_key_lk2_3_reg[] = + { + {"pbu_key_lk2_3", DPP_FIELD_FLAG_RO, 20, 21, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_pbu_key_lk2_2_reg[] = + { + {"pbu_key_lk2_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_pbu_key_lk2_1_reg[] = + { + {"pbu_key_lk2_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_pbu_key_lk2_0_reg[] = + { + {"pbu_key_lk2_0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_pbu_key_lk3_3_reg[] = + { + {"pbu_key_lk3_3", DPP_FIELD_FLAG_RO, 20, 21, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_pbu_key_lk3_2_reg[] = + { + {"pbu_key_lk3_2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_pbu_key_lk3_1_reg[] = + { + {"pbu_key_lk3_1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cfg_pbu_key_lk3_0_reg[] = + { + {"pbu_key_lk3_0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_learn_fifo_pfull_ast_reg[] = + { + {"schd_learn_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 5, 6, 0x14, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_learn_fifo_pfull_neg_reg[] = + { + {"schd_learn_fifo_pfull_neg", DPP_FIELD_FLAG_RW, 5, 6, 0x10, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_hash0_fifo_pfull_ast_reg[] = + { + {"schd_hash0_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 5, 6, 0x14, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_hash0_fifo_pfull_neg_reg[] = + { + {"schd_hash0_fifo_pfull_neg", DPP_FIELD_FLAG_RW, 5, 6, 0x10, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_hash1_fifo_pfull_ast_reg[] = + { + {"schd_hash1_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 5, 6, 0x14, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_hash1_fifo_pfull_neg_reg[] = + { + {"schd_hash1_fifo_pfull_neg", DPP_FIELD_FLAG_RW, 5, 6, 0x10, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_hash2_fifo_pfull_ast_reg[] = + { + {"schd_hash2_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 5, 6, 0x14, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_hash2_fifo_pfull_neg_reg[] = + { + {"schd_hash2_fifo_pfull_neg", DPP_FIELD_FLAG_RW, 5, 6, 0x10, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_hash3_fifo_pfull_ast_reg[] = + { + {"schd_hash3_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 5, 6, 0x14, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_hash3_fifo_pfull_neg_reg[] = + { + {"schd_hash3_fifo_pfull_neg", DPP_FIELD_FLAG_RW, 5, 6, 0x10, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_lpm_fifo_pfull_ast_reg[] = + { + {"schd_lpm_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 5, 6, 0x14, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_lpm_fifo_pfull_neg_reg[] = + { + {"schd_lpm_fifo_pfull_neg", DPP_FIELD_FLAG_RW, 5, 6, 0x10, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash0_key_fifo_pfull_ast_reg[] = + { + {"hash0_key_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 9, 10, 0x1cc, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash0_key_fifo_pfull_neg_reg[] = + { + {"hash0_key_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 9, 10, 0x1c8, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash0_sreq_fifo_pfull_ast_reg[] = + { + {"hash0_sreq_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 5, 6, 0x1c, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash0_sreq_fifo_pfull_neg_reg[] = + { + {"hash0_sreq_fifo_pfull_neg", DPP_FIELD_FLAG_RW, 5, 6, 0x14, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash0_int_rsp_fifo_pfull_ast_reg[] = + { + {"hash0_int_rsp_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 9, 10, 0x1cc, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash0_int_rsp_fifo_pfull_neg_reg[] = + { + {"hash0_int_rsp_fifo_pfull_neg", DPP_FIELD_FLAG_RW, 9, 10, 0x1c8, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash0_ext_rsp_fifo_pfull_ast_reg[] = + { + {"hash0_ext_rsp_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 5, 6, 0x20, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash0_ext_rsp_fifo_pfull_neg_reg[] = + { + {"hash0_ext_rsp_fifo_pfull_neg", DPP_FIELD_FLAG_RW, 5, 6, 0x1e, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash1_key_fifo_pfull_ast_reg[] = + { + {"hash1_key_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 9, 10, 0x1cc, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash1_key_fifo_pfull_neg_reg[] = + { + {"hash1_key_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 9, 10, 0x1c8, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash1_sreq_fifo_pfull_ast_reg[] = + { + {"hash1_sreq_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 5, 6, 0x1c, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash1_sreq_fifo_pfull_neg_reg[] = + { + {"hash1_sreq_fifo_pfull_neg", DPP_FIELD_FLAG_RW, 5, 6, 0x14, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash1_int_rsp_fifo_pfull_ast_reg[] = + { + {"hash1_int_rsp_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 9, 10, 0x1cc, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash1_int_rsp_fifo_pfull_neg_reg[] = + { + {"hash1_int_rsp_fifo_pfull_neg", DPP_FIELD_FLAG_RW, 9, 10, 0x1c8, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash1_ext_rsp_fifo_pfull_ast_reg[] = + { + {"hash1_ext_rsp_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 5, 6, 0x20, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash1_ext_rsp_fifo_pfull_neg_reg[] = + { + {"hash1_ext_rsp_fifo_pfull_neg", DPP_FIELD_FLAG_RW, 5, 6, 0x1e, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash2_key_fifo_pfull_ast_reg[] = + { + {"hash2_key_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 9, 10, 0x1cc, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash2_key_fifo_pfull_neg_reg[] = + { + {"hash2_key_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 9, 10, 0x1c8, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash2_sreq_fifo_pfull_ast_reg[] = + { + {"hash2_sreq_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 5, 6, 0x1c, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash2_sreq_fifo_pfull_neg_reg[] = + { + {"hash2_sreq_fifo_pfull_neg", DPP_FIELD_FLAG_RW, 5, 6, 0x14, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash2_int_rsp_fifo_pfull_ast_reg[] = + { + {"hash2_int_rsp_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 9, 10, 0x1cc, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash2_int_rsp_fifo_pfull_neg_reg[] = + { + {"hash2_int_rsp_fifo_pfull_neg", DPP_FIELD_FLAG_RW, 9, 10, 0x1c8, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash2_ext_rsp_fifo_pfull_ast_reg[] = + { + {"hash2_ext_rsp_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 5, 6, 0x20, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash2_ext_rsp_fifo_pfull_neg_reg[] = + { + {"hash2_ext_rsp_fifo_pfull_neg", DPP_FIELD_FLAG_RW, 5, 6, 0x1e, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash3_key_fifo_pfull_ast_reg[] = + { + {"hash3_key_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 9, 10, 0x1cc, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash3_key_fifo_pfull_neg_reg[] = + { + {"hash3_key_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 9, 10, 0x1c8, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash3_sreq_fifo_pfull_ast_reg[] = + { + {"hash3_sreq_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 5, 6, 0x1c, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash3_sreq_fifo_pfull_neg_reg[] = + { + {"hash3_sreq_fifo_pfull_neg", DPP_FIELD_FLAG_RW, 5, 6, 0x14, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash3_int_rsp_fifo_pfull_ast_reg[] = + { + {"hash3_int_rsp_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 9, 10, 0x1cc, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash3_int_rsp_fifo_pfull_neg_reg[] = + { + {"hash3_int_rsp_fifo_pfull_neg", DPP_FIELD_FLAG_RW, 9, 10, 0x1c8, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash3_ext_rsp_fifo_pfull_ast_reg[] = + { + {"hash3_ext_rsp_fifo_pfull_ast", DPP_FIELD_FLAG_RW, 5, 6, 0x20, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash3_ext_rsp_fifo_pfull_neg_reg[] = + { + {"hash3_ext_rsp_fifo_pfull_neg", DPP_FIELD_FLAG_RW, 5, 6, 0x1e, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_as_info_reg[] = + { + {"lpm_as_type", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"lpm_as_en", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_ext_rsp_fifo_u0_pfull_neg_reg[] = + { + {"lpm_ext_rsp_fifo_u0_pfull_neg", DPP_FIELD_FLAG_RW, 6, 7, 0x20, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_ext_rsp_fifo_u2_pfull_ast_reg[] = + { + {"lpm_ext_rsp_fifo_u2_pfull_ast", DPP_FIELD_FLAG_RW, 9, 10, 0x1e4, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_ext_rsp_fifo_u2_pfull_neg_reg[] = + { + {"lpm_ext_rsp_fifo_u2_pfull_neg", DPP_FIELD_FLAG_RW, 9, 10, 0x1e0, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_ext_rsp_fifo_u3_pfull_ast_reg[] = + { + {"lpm_ext_rsp_fifo_u3_pfull_ast", DPP_FIELD_FLAG_RW, 9, 10, 0x1e4, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_ext_rsp_fifo_u3_pfull_neg_reg[] = + { + {"lpm_ext_rsp_fifo_u3_pfull_neg", DPP_FIELD_FLAG_RW, 9, 10, 0x1e0, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_ext_rsp_fifo_u4_pfull_ast_reg[] = + { + {"lpm_ext_rsp_fifo_u4_pfull_ast", DPP_FIELD_FLAG_RW, 5, 6, 0x14, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_ext_rsp_fifo_u4_pfull_neg_reg[] = + { + {"lpm_ext_rsp_fifo_u4_pfull_neg", DPP_FIELD_FLAG_RW, 5, 6, 0x14, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_as_rsp_fifo_u0_pfull_ast_reg[] = + { + {"lpm_as_rsp_fifo_u0_pfull_ast", DPP_FIELD_FLAG_RW, 6, 7, 0x24, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_as_rsp_fifo_u0_pfull_neg_reg[] = + { + {"lpm_as_rsp_fifo_u0_pfull_neg", DPP_FIELD_FLAG_RW, 6, 7, 0x20, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_as_rsp_fifo_u1_pfull_ast_reg[] = + { + {"lpm_as_rsp_fifo_u1_pfull_ast", DPP_FIELD_FLAG_RW, 9, 10, 0x1e2, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_as_rsp_fifo_u1_pfull_neg_reg[] = + { + {"lpm_as_rsp_fifo_u1_pfull_neg", DPP_FIELD_FLAG_RW, 9, 10, 0x1dc, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_v4_ddr3_base_addr_reg[] = + { + {"lpm_v4_ddr3_base_addr", DPP_FIELD_FLAG_RW, 25, 26, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_v6_ddr3_base_addr_reg[] = + { + {"lpm_v6_ddr3_base_addr", DPP_FIELD_FLAG_RW, 25, 26, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_debug_cnt_mode_reg[] = + { + {"cnt_rd_mode", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"cnt_overflow_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash_p0_key_vld_cnt_reg[] = + { + {"hash_p0_key_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash_p1_key_vld_cnt_reg[] = + { + {"hash_p1_key_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash_p2_key_vld_cnt_reg[] = + { + {"hash_p2_key_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash_p3_key_vld_cnt_reg[] = + { + {"hash_p3_key_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_p0_key_vld_cnt_reg[] = + { + {"lpm_p0_key_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash_p0_rsp_vld_cnt_reg[] = + { + {"hash_p0_rsp_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash_p1_rsp_vld_cnt_reg[] = + { + {"hash_p1_rsp_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash_p2_rsp_vld_cnt_reg[] = + { + {"hash_p2_rsp_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash_p3_rsp_vld_cnt_reg[] = + { + {"hash_p3_rsp_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_p0_rsp_vld_cnt_reg[] = + { + {"lpm_p0_rsp_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash_p0_smf_cnt_reg[] = + { + {"hash_p0_smf_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash_p1_smf_cnt_reg[] = + { + {"hash_p1_smf_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash_p2_smf_cnt_reg[] = + { + {"hash_p2_smf_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash_p3_smf_cnt_reg[] = + { + {"hash_p3_smf_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_p0_smf_cnt_reg[] = + { + {"lpm_p0_smf_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash_p0_spacevld_cnt_reg[] = + { + {"hash_p0_spacevld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash_p1_spacevld_cnt_reg[] = + { + {"hash_p1_spacevld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash_p2_spacevld_cnt_reg[] = + { + {"hash_p2_spacevld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash_p3_spacevld_cnt_reg[] = + { + {"hash_p3_spacevld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_smmu1_p0_req_vld_cnt_reg[] = + { + {"smmu1_p0_req_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_smmu1_p1_req_vld_cnt_reg[] = + { + {"smmu1_p1_req_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_smmu1_p2_req_vld_cnt_reg[] = + { + {"smmu1_p2_req_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_smmu1_p3_req_vld_cnt_reg[] = + { + {"smmu1_p3_req_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_smmu1_p4_req_vld_cnt_reg[] = + { + {"smmu1_p4_req_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_smmu1_p5_req_vld_cnt_reg[] = + { + {"smmu1_p5_req_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_smmu1_p0_rsp_vld_cnt_reg[] = + { + {"smmu1_p0_rsp_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_smmu1_p1_rsp_vld_cnt_reg[] = + { + {"smmu1_p1_rsp_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_smmu1_p2_rsp_vld_cnt_reg[] = + { + {"smmu1_p2_rsp_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_smmu1_p3_rsp_vld_cnt_reg[] = + { + {"smmu1_p3_rsp_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_smmu1_p4_rsp_vld_cnt_reg[] = + { + {"smmu1_p4_rsp_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_smmu1_p5_rsp_vld_cnt_reg[] = + { + {"smmu1_p5_rsp_vld_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_learn_fifo_int_cnt_reg[] = + { + {"schd_learn_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_hash0_fifo_int_cnt_reg[] = + { + {"schd_hash0_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_hash1_fifo_int_cnt_reg[] = + { + {"schd_hash1_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_hash2_fifo_int_cnt_reg[] = + { + {"schd_hash2_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_hash3_fifo_int_cnt_reg[] = + { + {"schd_hash3_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_lpm_fifo_int_cnt_reg[] = + { + {"schd_lpm_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_learn_fifo_parity_err_cnt_reg[] = + { + {"schd_learn_fifo_parity_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_hash0_fifo_parity_err_cnt_reg[] = + { + {"schd_hash0_fifo_parity_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_hash1_fifo_parity_err_cnt_reg[] = + { + {"schd_hash1_fifo_parity_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_hash2_fifo_parity_err_cnt_reg[] = + { + {"schd_hash2_fifo_parity_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_hash3_fifo_parity_err_cnt_reg[] = + { + {"schd_hash3_fifo_parity_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_lpm_fifo_parity_err_cnt_reg[] = + { + {"schd_lpm_fifo_parity_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_rd_init_cft_cnt_reg[] = + { + {"rd_init_cft_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp0_zblk0_ecc_err_cnt_reg[] = + { + {"zgp0_zblk0_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp0_zblk1_ecc_err_cnt_reg[] = + { + {"zgp0_zblk1_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp0_zblk2_ecc_err_cnt_reg[] = + { + {"zgp0_zblk2_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp0_zblk3_ecc_err_cnt_reg[] = + { + {"zgp0_zblk3_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp0_zblk4_ecc_err_cnt_reg[] = + { + {"zgp0_zblk4_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp0_zblk5_ecc_err_cnt_reg[] = + { + {"zgp0_zblk5_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp0_zblk6_ecc_err_cnt_reg[] = + { + {"zgp0_zblk6_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp0_zblk7_ecc_err_cnt_reg[] = + { + {"zgp0_zblk7_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp1_zblk0_ecc_err_cnt_reg[] = + { + {"zgp1_zblk0_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp1_zblk1_ecc_err_cnt_reg[] = + { + {"zgp1_zblk1_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp1_zblk2_ecc_err_cnt_reg[] = + { + {"zgp1_zblk2_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp1_zblk3_ecc_err_cnt_reg[] = + { + {"zgp1_zblk3_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp1_zblk4_ecc_err_cnt_reg[] = + { + {"zgp1_zblk4_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp1_zblk5_ecc_err_cnt_reg[] = + { + {"zgp1_zblk5_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp1_zblk6_ecc_err_cnt_reg[] = + { + {"zgp1_zblk6_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp1_zblk7_ecc_err_cnt_reg[] = + { + {"zgp1_zblk7_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp2_zblk0_ecc_err_cnt_reg[] = + { + {"zgp2_zblk0_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp2_zblk1_ecc_err_cnt_reg[] = + { + {"zgp2_zblk1_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp2_zblk2_ecc_err_cnt_reg[] = + { + {"zgp2_zblk2_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp2_zblk3_ecc_err_cnt_reg[] = + { + {"zgp2_zblk3_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp2_zblk4_ecc_err_cnt_reg[] = + { + {"zgp2_zblk4_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp2_zblk5_ecc_err_cnt_reg[] = + { + {"zgp2_zblk5_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp2_zblk6_ecc_err_cnt_reg[] = + { + {"zgp2_zblk6_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp2_zblk7_ecc_err_cnt_reg[] = + { + {"zgp2_zblk7_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp3_zblk0_ecc_err_cnt_reg[] = + { + {"zgp3_zblk0_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp3_zblk1_ecc_err_cnt_reg[] = + { + {"zgp3_zblk1_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp3_zblk2_ecc_err_cnt_reg[] = + { + {"zgp3_zblk2_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp3_zblk3_ecc_err_cnt_reg[] = + { + {"zgp3_zblk3_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp3_zblk4_ecc_err_cnt_reg[] = + { + {"zgp3_zblk4_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp3_zblk5_ecc_err_cnt_reg[] = + { + {"zgp3_zblk5_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp3_zblk6_ecc_err_cnt_reg[] = + { + {"zgp3_zblk6_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zgp3_zblk7_ecc_err_cnt_reg[] = + { + {"zgp3_zblk7_ecc_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zcam_hash_p0_err_cnt_reg[] = + { + {"zcam_hash_p0_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zcam_hash_p1_err_cnt_reg[] = + { + {"zcam_hash_p1_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zcam_hash_p2_err_cnt_reg[] = + { + {"zcam_hash_p2_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zcam_hash_p3_err_cnt_reg[] = + { + {"zcam_hash_p3_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zcam_lpm_err_cnt_reg[] = + { + {"zcam_lpm_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash0_sreq_fifo_parity_err_cnt_reg[] = + { + {"hash0_sreq_fifo_parity_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash0_sreq_fifo_int_cnt_reg[] = + { + {"hash0_sreq_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash0_key_fifo_int_cnt_reg[] = + { + {"hash0_key_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash0_int_rsp_fifo_parity_err_cnt_reg[] = + { + {"hash0_int_rsp_fifo_parity_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash0_ext_rsp_fifo_parity_err_cnt_reg[] = + { + {"hash0_ext_rsp_fifo_parity_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash0_ext_rsp_fifo_int_cnt_reg[] = + { + {"hash0_ext_rsp_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash0_int_rsp_fifo_int_cnt_reg[] = + { + {"hash0_int_rsp_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash1_sreq_fifo_parity_err_cnt_reg[] = + { + {"hash1_sreq_fifo_parity_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash1_sreq_fifo_int_cnt_reg[] = + { + {"hash1_sreq_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash1_key_fifo_int_cnt_reg[] = + { + {"hash1_key_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash1_int_rsp_fifo_parity_err_cnt_reg[] = + { + {"hash1_int_rsp_fifo_parity_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash1_ext_rsp_fifo_parity_err_cnt_reg[] = + { + {"hash1_ext_rsp_fifo_parity_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash1_ext_rsp_fifo_int_cnt_reg[] = + { + {"hash1_ext_rsp_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash1_int_rsp_fifo_int_cnt_reg[] = + { + {"hash1_int_rsp_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash2_sreq_fifo_parity_err_cnt_reg[] = + { + {"hash2_sreq_fifo_parity_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash2_sreq_fifo_int_cnt_reg[] = + { + {"hash2_sreq_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash2_key_fifo_int_cnt_reg[] = + { + {"hash2_key_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash2_int_rsp_fifo_parity_err_cnt_reg[] = + { + {"hash2_int_rsp_fifo_parity_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash2_ext_rsp_fifo_parity_err_cnt_reg[] = + { + {"hash2_ext_rsp_fifo_parity_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash2_ext_rsp_fifo_int_cnt_reg[] = + { + {"hash2_ext_rsp_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash2_int_rsp_fifo_int_cnt_reg[] = + { + {"hash2_int_rsp_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash3_sreq_fifo_parity_err_cnt_reg[] = + { + {"hash3_sreq_fifo_parity_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash3_sreq_fifo_int_cnt_reg[] = + { + {"hash3_sreq_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash3_key_fifo_int_cnt_reg[] = + { + {"hash3_key_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash3_int_rsp_fifo_parity_err_cnt_reg[] = + { + {"hash3_int_rsp_fifo_parity_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash3_ext_rsp_fifo_parity_err_cnt_reg[] = + { + {"hash3_ext_rsp_fifo_parity_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash3_ext_rsp_fifo_int_cnt_reg[] = + { + {"hash3_ext_rsp_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash3_int_rsp_fifo_int_cnt_reg[] = + { + {"hash3_int_rsp_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_ext_rsp_fifo_int_cnt_reg[] = + { + {"lpm_ext_rsp_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_ext_v6_fifo_int_cnt_reg[] = + { + {"lpm_ext_v6_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_ext_v4_fifo_int_cnt_reg[] = + { + {"lpm_ext_v4_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_ext_addr_fifo_int_cnt_reg[] = + { + {"lpm_ext_addr_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_ext_v4_fifo_parity_err_cnt_reg[] = + { + {"lpm_ext_v4_fifo_parity_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_ext_v6_fifo_parity_err_cnt_reg[] = + { + {"lpm_ext_v6_fifo_parity_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_ext_rsp_fifo_parity_err_cnt_reg[] = + { + {"lpm_ext_rsp_fifo_parity_err_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_as_req_fifo_int_cnt_reg[] = + { + {"lpm_as_req_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_as_int_rsp_fifo_int_cnt_reg[] = + { + {"lpm_as_int_rsp_fifo_int_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_se_alg_int_status_reg[] = + { + {"schd_int_unmask_flag", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"zblk_ecc_int_unmask_flag", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"hash0_int_unmask_flag", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"hash1_int_unmask_flag", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"hash2_int_unmask_flag", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"hash3_int_unmask_flag", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"lpm_int_unmask_flag", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_int_en_reg[] = + { + {"wr_rsp_fifo_ovfl", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"init_rd_cft_en", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"schd_lpm_fifo_parity_errl", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"schd_hash3_fifo_parity_err", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"schd_hash2_fifo_parity_err", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"schd_hash1_fifo_parity_err", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"schd_hash0_fifo_parity_err", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"schd_learn_fifo_parity_err", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"schd_lpm_fifo_ovfl", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"schd_hash3_fifo_ovfl", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"schd_hash2_fifo_unfl", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"schd_hash1_fifo_ovfl", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"schd_hash0_fifo_ovfl", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"schd_learn_fifo_ovfl", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_int_mask_reg[] = + { + {"schd_int_mask", DPP_FIELD_FLAG_RW, 13, 14, 0x3fff, 0x0}, + }; +DPP_FIELD_T g_se_alg_schd_int_status_reg[] = + { + {"schd_int_status", DPP_FIELD_FLAG_RC, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zblk_ecc_int_en_reg[] = + { + {"zblk_ecc_int_en", DPP_FIELD_FLAG_RW, 31, 32, 0xffffff, 0x0}, + }; +DPP_FIELD_T g_se_alg_zblk_ecc_int_mask_reg[] = + { + {"zblk_ecc_int_mask", DPP_FIELD_FLAG_RW, 31, 32, 0xffffff, 0x0}, + }; +DPP_FIELD_T g_se_alg_zblk_ecc_int_status_reg[] = + { + {"zblk_ecc_int_status", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash0_int_en_reg[] = + { + {"zcam_hash_p0_err_en", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"hash0_agree_int_fifo_ovf_en", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"hash0_agree_ext_fifo_ovf_en", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"hash0_agree_ext_fifo_parity_err_en", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"hash0_agree_int_fifo_parity_err_en", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"hash0_key_fifo_ovfl_en", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"hash0_sreq_fifo_ovfl_en", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"hash0_key_fifo_parity_err_en", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash0_int_mask_reg[] = + { + {"hash0_int_mask", DPP_FIELD_FLAG_RW, 7, 8, 0xff, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash0_int_status_reg[] = + { + {"hash0_int_status", DPP_FIELD_FLAG_RC, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash1_int_en_reg[] = + { + {"zcam_hash_p1_err_en", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"hash1_agree_int_fifo_ovf_en", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"hash1_agree_ext_fifo_ovf_en", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"hash1_agree_ext_fifo_parity_err_en", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"hash1_agree_int_fifo_parity_err_en", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"hash1_key_fifo_ovfl_en", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"hash1_sreq_fifo_ovfl_en", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"hash1_key_fifo_parity_err_en", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash1_int_mask_reg[] = + { + {"hash1_int_mask", DPP_FIELD_FLAG_RW, 7, 8, 0xff, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash1_int_status_reg[] = + { + {"hash1_int_status", DPP_FIELD_FLAG_RC, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash2_int_en_reg[] = + { + {"zcam_hash_p2_err_en", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"hash2_agree_int_fifo_ovf_en", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"hash2_agree_ext_fifo_ovf_en", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"hash2_agree_ext_fifo_parity_err_en", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"hash2_agree_int_fifo_parity_err_en", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"hash2_key_fifo_ovfl_en", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"hash2_sreq_fifo_ovfl_en", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"hash2_key_fifo_parity_err_en", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash2_int_mask_reg[] = + { + {"hash2_int_mask", DPP_FIELD_FLAG_RW, 7, 8, 0xff, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash2_int_status_reg[] = + { + {"hash2_int_status", DPP_FIELD_FLAG_RC, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash3_int_en_reg[] = + { + {"zcam_hash_p3_err_en", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"hash3_agree_int_fifo_ovf_en", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"hash3_agree_ext_fifo_ovf_en", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"hash3_agree_ext_fifo_parity_err_en", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"hash3_agree_int_fifo_parity_err_en", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"hash3_key_fifo_ovfl_en", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"hash3_sreq_fifo_ovfl_en", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"hash3_key_fifo_parity_err_en", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash3_int_mask_reg[] = + { + {"hash3_int_mask", DPP_FIELD_FLAG_RW, 7, 8, 0xff, 0x0}, + }; +DPP_FIELD_T g_se_alg_hash3_int_status_reg[] = + { + {"hash3_int_status", DPP_FIELD_FLAG_RC, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_int_en_reg[] = + { + {"zcam_lpm_err_en", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"lpm_as_int_rsp_fifo_ovfl_en", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"lpm_as_req_fifo_ovfl_en", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"lpm_ext_ddr_rsp_fifo_parity_en", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"lpm_ext_v6_key_parity_en", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"lpm_ext_v4_key_parity_en", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"lpm_ext_addr_fifo_ovfl_en", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"lpm_ext_v4_fifo_ovfl_en", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"lpm_ext_v6_fifo_ovfl_en", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"lpm_ext_ddr_rsp_ovf_en", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_int_mask_reg[] = + { + {"lpm_int_mask", DPP_FIELD_FLAG_RW, 9, 10, 0x3ff, 0x0}, + }; +DPP_FIELD_T g_se_alg_lpm_int_status_reg[] = + { + {"lpm_int_status", DPP_FIELD_FLAG_RC, 9, 10, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zblock_lpm_mask0_reg[] = + { + {"vpn_id_mask", DPP_FIELD_FLAG_RW, 143, 16, 0x0, 0x0}, + {"prefix0_mask", DPP_FIELD_FLAG_RW, 127, 32, 0x0, 0x0}, + {"prefix1_mask", DPP_FIELD_FLAG_RW, 95, 32, 0x0, 0x0}, + {"prefix2_mask", DPP_FIELD_FLAG_RW, 63, 32, 0x0, 0x0}, + {"prefix3_mask", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zblock_lpm_mask1_reg[] = + { + {"vpn_id_mask", DPP_FIELD_FLAG_RW, 143, 16, 0x0, 0x0}, + {"prefix0_mask", DPP_FIELD_FLAG_RW, 127, 32, 0x0, 0x0}, + {"prefix1_mask", DPP_FIELD_FLAG_RW, 95, 32, 0x0, 0x0}, + {"prefix2_mask", DPP_FIELD_FLAG_RW, 63, 32, 0x0, 0x0}, + {"prefix3_mask", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zblock_lpm_mask2_reg[] = + { + {"vpn_id_mask", DPP_FIELD_FLAG_RW, 143, 16, 0x0, 0x0}, + {"prefix0_mask", DPP_FIELD_FLAG_RW, 127, 32, 0x0, 0x0}, + {"prefix1_mask", DPP_FIELD_FLAG_RW, 95, 32, 0x0, 0x0}, + {"prefix2_mask", DPP_FIELD_FLAG_RW, 63, 32, 0x0, 0x0}, + {"prefix3_mask", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zblock_lpm_mask3_reg[] = + { + {"vpn_id_mask", DPP_FIELD_FLAG_RW, 143, 16, 0x0, 0x0}, + {"prefix0_mask", DPP_FIELD_FLAG_RW, 127, 32, 0x0, 0x0}, + {"prefix1_mask", DPP_FIELD_FLAG_RW, 95, 32, 0x0, 0x0}, + {"prefix2_mask", DPP_FIELD_FLAG_RW, 63, 32, 0x0, 0x0}, + {"prefix3_mask", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zblock_default_route0_reg[] = + { + {"vpn_id", DPP_FIELD_FLAG_RW, 39, 16, 0x0, 0x0}, + {"vpn_dresult", DPP_FIELD_FLAG_RW, 23, 22, 0x0, 0x0}, + {"vpn_flag", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"vpn_vld", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zblock_default_route1_reg[] = + { + {"vpn_id", DPP_FIELD_FLAG_RW, 39, 16, 0x0, 0x0}, + {"vpn_dresult", DPP_FIELD_FLAG_RW, 23, 22, 0x0, 0x0}, + {"vpn_flag", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"vpn_vld", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zblock_default_route2_reg[] = + { + {"vpn_id", DPP_FIELD_FLAG_RW, 39, 16, 0x0, 0x0}, + {"vpn_dresult", DPP_FIELD_FLAG_RW, 23, 22, 0x0, 0x0}, + {"vpn_flag", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"vpn_vld", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zblock_default_route3_reg[] = + { + {"vpn_id", DPP_FIELD_FLAG_RW, 39, 16, 0x0, 0x0}, + {"vpn_dresult", DPP_FIELD_FLAG_RW, 23, 22, 0x0, 0x0}, + {"vpn_flag", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"vpn_vld", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zblock_default_route4_reg[] = + { + {"vpn_id", DPP_FIELD_FLAG_RW, 39, 16, 0x0, 0x0}, + {"vpn_dresult", DPP_FIELD_FLAG_RW, 23, 22, 0x0, 0x0}, + {"vpn_flag", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"vpn_vld", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zblock_default_route5_reg[] = + { + {"vpn_id", DPP_FIELD_FLAG_RW, 39, 16, 0x0, 0x0}, + {"vpn_dresult", DPP_FIELD_FLAG_RW, 23, 22, 0x0, 0x0}, + {"vpn_flag", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"vpn_vld", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zblock_default_route6_reg[] = + { + {"vpn_id", DPP_FIELD_FLAG_RW, 39, 16, 0x0, 0x0}, + {"vpn_dresult", DPP_FIELD_FLAG_RW, 23, 22, 0x0, 0x0}, + {"vpn_flag", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"vpn_vld", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zblock_default_route7_reg[] = + { + {"vpn_id", DPP_FIELD_FLAG_RW, 39, 16, 0x0, 0x0}, + {"vpn_dresult", DPP_FIELD_FLAG_RW, 23, 22, 0x0, 0x0}, + {"vpn_flag", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"vpn_vld", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zblock_hash_listtable_item0_reg[] = + { + {"hash_item", DPP_FIELD_FLAG_RW, 511, 512, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zblock_hash_listtable_item1_reg[] = + { + {"hash_item", DPP_FIELD_FLAG_RW, 511, 512, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zblock_hash_listtable_item2_reg[] = + { + {"hash_item", DPP_FIELD_FLAG_RW, 511, 512, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zblock_hash_listtable_item3_reg[] = + { + {"hash_item", DPP_FIELD_FLAG_RW, 511, 512, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zblock_ecc_err_status_reg[] = + { + {"sram3_ecc_err", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"sram2_ecc_err", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"sram1_ecc_err", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"sram0_ecc_err", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zblock_lpm_v6_sram_cmp_reg[] = + { + {"sram_cmp_flag", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_alg_zblock_lpm_v4_sram_cmp_reg[] = + { + {"sram_cmp_flag", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_parser_kschd_pful_cfg_reg[] = + { + {"kschd_pful_assert", DPP_FIELD_FLAG_RW, 11, 6, 0xc, 0x0}, + {"kschd_pful_negate", DPP_FIELD_FLAG_RW, 5, 6, 0xc, 0x0}, + }; +DPP_FIELD_T g_se_parser_debug_cnt_mode_reg[] = + { + {"cnt_rd_mode", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"cnt_overflow_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_parser_parser_int_en_reg[] = + { + {"parser_int_en", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_parser_parser_int_mask_reg[] = + { + {"parser_int_mask", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_parser_parser_int_status_reg[] = + { + {"parser_int_status", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_parser_parser_int_unmask_flag_reg[] = + { + {"parser_int_unmask_flag", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_parser_ecc_bypass_read_reg[] = + { + {"ecc_bypass_read", DPP_FIELD_FLAG_RW, 5, 6, 0x3f, 0x0}, + }; +DPP_FIELD_T g_se_parser_mex0_5_req_cnt_reg[] = + { + {"mex0_5_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_parser_kschd_req0_5_cnt_reg[] = + { + {"kschd_req0_5_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_parser_kschd_parser_fc0_5_cnt_reg[] = + { + {"kschd_parser_fc0_5_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_parser_se_ppu_mex0_5_fc_cnt_reg[] = + { + {"se_ppu_mex0_5_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_parser_smmu0_marc_fc_cnt_reg[] = + { + {"smmu0_marc_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_parser_smmu0_marc_key_cnt_reg[] = + { + {"smmu0_marc_key_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_parser_cmmu_key_cnt_reg[] = + { + {"cmmu_key_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_parser_cmmu_parser_fc_cnt_reg[] = + { + {"cmmu_parser_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_parser_marc_tab_type_err_mex0_5_cnt_reg[] = + { + {"marc_tab_type_err_mex0_5_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_parser_eram_fulladdr_drop_cnt_reg[] = + { + {"eram_fulladdr_drop_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_hash0_pful_cfg_reg[] = + { + {"hash0_pful_cfg", DPP_FIELD_FLAG_RW, 19, 20, 0x7d9f6, 0x0}, + }; +DPP_FIELD_T g_se_as_hash1_pful_cfg_reg[] = + { + {"hash1_pful_cfg", DPP_FIELD_FLAG_RW, 19, 20, 0x7d9f6, 0x0}, + }; +DPP_FIELD_T g_se_as_hash2_pful_cfg_reg[] = + { + {"hash2_pful_cfg", DPP_FIELD_FLAG_RW, 19, 20, 0x7d9f6, 0x0}, + }; +DPP_FIELD_T g_se_as_hash3_pful_cfg_reg[] = + { + {"hash3_pful_cfg", DPP_FIELD_FLAG_RW, 19, 20, 0x7d9f6, 0x0}, + }; +DPP_FIELD_T g_se_as_pbu_pful_cfg_reg[] = + { + {"pbu_pful_cfg", DPP_FIELD_FLAG_RW, 11, 12, 0x69a, 0x0}, + }; +DPP_FIELD_T g_se_as_lpm_pful_cfg_reg[] = + { + {"lpm_pful_cfg", DPP_FIELD_FLAG_RW, 19, 20, 0x7d9f6, 0x0}, + }; +DPP_FIELD_T g_se_as_etcam_pful_cfg_reg[] = + { + {"etcam_pful_cfg", DPP_FIELD_FLAG_RW, 13, 14, 0x1c38, 0x0}, + }; +DPP_FIELD_T g_se_as_as_learn0_fifo_cfg_reg[] = + { + {"as_learn1_pful_negate", DPP_FIELD_FLAG_RW, 27, 7, 0x38, 0x0}, + {"as_learn1_pful_asert", DPP_FIELD_FLAG_RW, 20, 7, 0x38, 0x0}, + {"as_learn0_pful_negate", DPP_FIELD_FLAG_RW, 13, 7, 0x38, 0x0}, + {"as_learn0_pful_asert", DPP_FIELD_FLAG_RW, 6, 7, 0x38, 0x0}, + }; +DPP_FIELD_T g_se_as_as_learn1_fifo_cfg_reg[] = + { + {"as_learn3_pful_negate", DPP_FIELD_FLAG_RW, 27, 7, 0x38, 0x0}, + {"as_learn3_pful_asert", DPP_FIELD_FLAG_RW, 20, 7, 0x38, 0x0}, + {"as_learn2_pful_negate", DPP_FIELD_FLAG_RW, 13, 7, 0x38, 0x0}, + {"as_learn2_pful_asert", DPP_FIELD_FLAG_RW, 6, 7, 0x38, 0x0}, + }; +DPP_FIELD_T g_se_as_as_dma_fifo_cfg_reg[] = + { + {"as_dma_fifo_cfg", DPP_FIELD_FLAG_RW, 15, 16, 0x7272, 0x0}, + }; +DPP_FIELD_T g_se_as_age_pful_cfg_reg[] = + { + {"age_pful_cfg", DPP_FIELD_FLAG_RW, 11, 12, 0x618, 0x0}, + }; +DPP_FIELD_T g_se_as_etcam_rsp_cfg_reg[] = + { + {"eram_rsp_pful_negate", DPP_FIELD_FLAG_RW, 27, 7, 0x24, 0x0}, + {"eram_rsp_pful_assert", DPP_FIELD_FLAG_RW, 20, 7, 0x24, 0x0}, + {"etcam_rsp_pful_negate", DPP_FIELD_FLAG_RW, 13, 7, 0x21, 0x0}, + {"etcam_rsp_pful_assert", DPP_FIELD_FLAG_RW, 6, 7, 0x21, 0x0}, + }; +DPP_FIELD_T g_se_as_pbu_ecc_bypass_read_reg[] = + { + {"pbu_ecc_bypass_read", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_as_etcam0_ecc_bypass_read_reg[] = + { + {"etcam0_ecc_bypass_read", DPP_FIELD_FLAG_RW, 2, 3, 0x7, 0x0}, + }; +DPP_FIELD_T g_se_as_etcam1_ecc_bypass_read_reg[] = + { + {"etcam1_ecc_bypass_read", DPP_FIELD_FLAG_RW, 2, 3, 0x7, 0x0}, + }; +DPP_FIELD_T g_se_as_lpm_ecc_bypass_read_reg[] = + { + {"lpm_ecc_bypass_read", DPP_FIELD_FLAG_RW, 1, 2, 0x3, 0x0}, + }; +DPP_FIELD_T g_se_as_hash_ecc_bypass_read_reg[] = + { + {"hash3_ecc_bypass_read", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"hash2_ecc_bypass_read", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"hash1_ecc_bypass_read", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"hash0_ecc_bypass_read", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_as_hash_learn_ecc_bypass_read_reg[] = + { + {"hash_learn_ecc_bypass_read", DPP_FIELD_FLAG_RW, 3, 4, 0xf, 0x0}, + }; +DPP_FIELD_T g_se_as_debug_cnt_mode_reg[] = + { + {"cnt_rd_mode", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"cnt_overflow_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_as_as_int_0_en_reg[] = + { + {"as_int_0_en", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_as_as_int_0_mask_reg[] = + { + {"as_int_0_mask", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_as_as_int_1_en_reg[] = + { + {"as_int_1_en", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_as_as_int_1_mask_reg[] = + { + {"as_int_1_mask", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_as_as_int_2_en_reg[] = + { + {"as_int_2_en", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_as_as_int_2_mask_reg[] = + { + {"as_int_2_mask", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_as_as_int_0_status_reg[] = + { + {"port0_int_status", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_as_int_1_status_reg[] = + { + {"port1_int_status", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_as_int_2_status_reg[] = + { + {"port2_int_status", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_se_as_int_status_reg[] = + { + {"as_int_2_unmask_flag", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"as_int_1_unmask_flag", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"as_int_0_unmask_flag", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_hash0_3_wr_req_cnt_reg[] = + { + {"hash0_3_wr_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_smmu0_etcam0_1_fc_cnt_reg[] = + { + {"smmu0_etcam0_1_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_etcam0_1_smmu0_req_cnt_reg[] = + { + {"etcam0_1_smmu0_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_smmu0_etcam0_1_rsp_cnt_reg[] = + { + {"smmu0_etcam0_1_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_as_hla_hash_p0_3_key_cnt_reg[] = + { + {"as_hla_hash_p0_3_key_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_as_hla_lpm_p0_key_cnt_reg[] = + { + {"as_hla_lpm_p0_key_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_alg_as_hash_p0_3_rsp_cnt_reg[] = + { + {"alg_as_hash_p0_3_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_alg_as_hash_p0_3_smf_rsp_cnt_reg[] = + { + {"alg_as_hash_p0_3_smf_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_alg_as_lpm_p0_rsp_cnt_reg[] = + { + {"alg_as_lpm_p0_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_alg_as_lpm_p0_3_smf_rsp_cnt_reg[] = + { + {"alg_as_lpm_p0_3_smf_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_as_pbu_key_cnt_reg[] = + { + {"as_pbu_key_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_pbu_se_dpi_rsp_dat_cnt_reg[] = + { + {"pbu_se_dpi_rsp_dat_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_as_etcam_ctrl_req0_cnt_reg[] = + { + {"as_etcam_ctrl_req0_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_etcam_ctrl_as_index0_1_cnt_reg[] = + { + {"etcam_ctrl_as_index0_1_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_etcam_ctrl_as_hit0_1_cnt_reg[] = + { + {"etcam_ctrl_as_hit0_1_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_as_smmu0_req_cnt_reg[] = + { + {"as_smmu0_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_learn_hla_wr_cnt_reg[] = + { + {"learn_hla_wr_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_as_smmu1_req_cnt_reg[] = + { + {"as_smmu1_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_se_cfg_mac_dat_cnt_reg[] = + { + {"se_cfg_mac_dat_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_alg_as_hash_p0_3_fc_cnt_reg[] = + { + {"alg_as_hash_p0_3_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_alg_as_lpm_p0_fc_cnt_reg[] = + { + {"alg_as_lpm_p0_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_as_alg_hash_p0_3_fc_cnt_reg[] = + { + {"as_alg_hash_p0_3_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_as_alg_lpm_p0_fc_cnt_reg[] = + { + {"as_alg_lpm_p0_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_as_pbu_fc_cnt_reg[] = + { + {"as_pbu_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_pbu_se_dpi_key_fc_cnt_reg[] = + { + {"pbu_se_dpi_key_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_as_etcam_ctrl_fc0_1_cnt_reg[] = + { + {"as_etcam_ctrl_fc0_1_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_etcam_ctrl_as_fc0_1_cnt_reg[] = + { + {"etcam_ctrl_as_fc0_1_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_smmu0_as_mac_age_fc_cnt_reg[] = + { + {"smmu0_as_mac_age_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_alg_learn_fc_cnt_reg[] = + { + {"alg_learn_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_smmu1_as_fc_cnt_reg[] = + { + {"smmu1_as_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_as_cfg_se_mac_fc_cnt_reg[] = + { + {"cfg_se_mac_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_kschd_cpu_rdy_reg[] = + { + {"kschd_cpu_rdy", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_ppu0_ecc_bypass_read_reg[] = + { + {"ppu0_ecc_bypass_read", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_kschd_pbu_ecc_bypass_read_reg[] = + { + {"pbu_ecc_bypass_read", DPP_FIELD_FLAG_RW, 5, 6, 0x3f, 0x0}, + }; +DPP_FIELD_T g_se_kschd_smmu1_ecc_bypass_read_reg[] = + { + {"u3_smmu1_ecc_bypass_read", DPP_FIELD_FLAG_RO, 23, 6, 0x3f, 0x0}, + {"u2_smmu1_ecc_bypass_read", DPP_FIELD_FLAG_RO, 17, 6, 0x3f, 0x0}, + {"u1_smmu1_ecc_bypass_read", DPP_FIELD_FLAG_RO, 11, 6, 0x3f, 0x0}, + {"u0_smmu1_ecc_bypass_read", DPP_FIELD_FLAG_RW, 5, 6, 0x3f, 0x0}, + }; +DPP_FIELD_T g_se_kschd_ass_ecc_bypass_read_reg[] = + { + {"ass_ecc_bypass_read", DPP_FIELD_FLAG_RW, 5, 6, 0x3f, 0x0}, + }; +DPP_FIELD_T g_se_kschd_sdt_h_reg[] = + { + {"sdt_h", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_sdt_l_reg[] = + { + {"sdt_l", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_hash_key15_reg[] = + { + {"dma_en", DPP_FIELD_FLAG_RW, 25, 1, 0x0, 0x0}, + {"delete_en", DPP_FIELD_FLAG_RW, 24, 1, 0x0, 0x0}, + {"hash_key15", DPP_FIELD_FLAG_RW, 23, 24, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_hash_key14_reg[] = + { + {"hash_key14", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_hash_key13_reg[] = + { + {"hash_key13", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_hash_key12_reg[] = + { + {"hash_key12", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_hash_key11_reg[] = + { + {"hash_key11", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_hash_key10_reg[] = + { + {"hash_key10", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_hash_key9_reg[] = + { + {"hash_key9", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_hash_key8_reg[] = + { + {"hash_key8", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_hash_key7_reg[] = + { + {"hash_key7", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_hash_key6_reg[] = + { + {"hash_key6", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_hash_key5_reg[] = + { + {"hash_key5", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_hash_key4_reg[] = + { + {"hash_key4", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_hash_key3_reg[] = + { + {"hash_key3", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_hash_key2_reg[] = + { + {"hash_key2", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_hash_key1_reg[] = + { + {"hash_key1", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_hash_key0_reg[] = + { + {"hash_key0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_schd_int_0_en_reg[] = + { + {"port0_int_en", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_kschd_schd_int_0_mask_reg[] = + { + {"port0_int_mask", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_kschd_schd_int_1_en_reg[] = + { + {"port1_int_en", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_kschd_schd_int_1_mask_reg[] = + { + {"port1_int_mask", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_kschd_schd_int_2_en_reg[] = + { + {"port2_int_en", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_kschd_schd_int_2_mask_reg[] = + { + {"port2_int_mask", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_kschd_schd_int_3_en_reg[] = + { + {"port3_int_en", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_kschd_schd_int_3_mask_reg[] = + { + {"port3_int_mask", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_kschd_schd_int_4_en_reg[] = + { + {"port4_int_en", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_kschd_schd_int_4_mask_reg[] = + { + {"port4_int_mask", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_kschd_schd_int_0_status_reg[] = + { + {"port0_int_status", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_schd_int_1_status_reg[] = + { + {"port1_int_status", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_schd_int_2_status_reg[] = + { + {"port2_int_status", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_schd_int_3_status_reg[] = + { + {"port3_int_status", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_schd_int_4_status_reg[] = + { + {"port4_int_status", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_se_kschd_int_status_reg[] = + { + {"schd_int4_unmask_flag", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"schd_int3_unmask_flag", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"schd_int2_unmask_flag", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"schd_int1_unmask_flag", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"schd_int0_unmask_flag", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_debug_cnt_mode_reg[] = + { + {"cnt_rd_mode", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"cnt_overflow_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_kschd_se_parser_kschd_key0_3_cnt_reg[] = + { + {"se_parser_kschd_key0_3_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_se_smmu1_key0_3_cnt_reg[] = + { + {"se_smmu1_key0_3_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_kschd_as_key0_cnt_reg[] = + { + {"kschd_as_key0_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_kschd_as_key1_cnt_reg[] = + { + {"kschd_as_key1_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_kschd_as_key2_cnt_reg[] = + { + {"kschd_as_key2_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_kschd_as_key3_cnt_reg[] = + { + {"kschd_as_key3_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_kschd_as_key4_cnt_reg[] = + { + {"kschd_as_key4_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_kschd_as_key5_cnt_reg[] = + { + {"kschd_as_key5_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_kschd_as_key6_cnt_reg[] = + { + {"kschd_as_key6_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_kschd_as_key9_cnt_reg[] = + { + {"kschd_as_key9_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_kschd_se_parser_fc0_3_cnt_reg[] = + { + {"kschd_se_parser_fc0_3_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_smmu1_se_fc0_3_cnt_reg[] = + { + {"smmu1_se_fc0_3_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_as_kschd_fc_cnt0_reg[] = + { + {"as_kschd_fc_cnt0", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_as_kschd_fc_cnt1_reg[] = + { + {"as_kschd_fc_cnt1", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_as_kschd_fc_cnt2_reg[] = + { + {"as_kschd_fc_cnt2", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_as_kschd_fc_cnt3_reg[] = + { + {"as_kschd_fc_cnt3", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_as_kschd_fc_cnt4_reg[] = + { + {"as_kschd_fc_cnt4", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_as_kschd_fc_cnt5_reg[] = + { + {"as_kschd_fc_cnt5", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_as_kschd_fc_cnt6_reg[] = + { + {"as_kschd_fc_cnt6", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_kschd_as_kschd_fc_cnt9_reg[] = + { + {"as_kschd_fc_cnt9", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_rschd_hash_pful_cfg_reg[] = + { + {"rschd_hash_pful_cfg", DPP_FIELD_FLAG_RW, 31, 32, 0x00370037, 0x0}, + }; +DPP_FIELD_T g_se_rschd_rschd_hash_ept_cfg_reg[] = + { + {"rschd_hash_ept_cfg", DPP_FIELD_FLAG_RW, 31, 32, 0x00090009, 0x0}, + }; +DPP_FIELD_T g_se_rschd_rschd_pbu_pful_cfg_reg[] = + { + {"rschd_pbu_pful_cfg", DPP_FIELD_FLAG_RW, 31, 32, 0x002d002d, 0x0}, + }; +DPP_FIELD_T g_se_rschd_rschd_pbu_ept_cfg_reg[] = + { + {"rschd_pbu_ept_cfg", DPP_FIELD_FLAG_RW, 31, 32, 0x00130013, 0x0}, + }; +DPP_FIELD_T g_se_rschd_rschd_lpm_pful_cfg_reg[] = + { + {"rschd_lpm_pful_cfg", DPP_FIELD_FLAG_RW, 31, 32, 0x00240024, 0x0}, + }; +DPP_FIELD_T g_se_rschd_rschd_lpm_ept_cfg_reg[] = + { + {"rschd_lpm_ept_cfg", DPP_FIELD_FLAG_RW, 31, 32, 0x001c001c, 0x0}, + }; +DPP_FIELD_T g_se_rschd_rschd_etcam_pful_cfg_reg[] = + { + {"rschd_etcam_pful_cfg", DPP_FIELD_FLAG_RW, 31, 32, 0x00110011, 0x0}, + }; +DPP_FIELD_T g_se_rschd_rschd_etcam_ept_cfg_reg[] = + { + {"rschd_etcam_ept_cfg", DPP_FIELD_FLAG_RW, 31, 32, 0x002f002f, 0x0}, + }; +DPP_FIELD_T g_se_rschd_smmu0_wb_pful_cfg_reg[] = + { + {"smmu0_wb_pful_cfg", DPP_FIELD_FLAG_RW, 31, 32, 0x00330033, 0x0}, + }; +DPP_FIELD_T g_se_rschd_smmu0_wb_ept_cfg_reg[] = + { + {"smmu0_wb_ept_cfg", DPP_FIELD_FLAG_RW, 31, 32, 0x000d000d, 0x0}, + }; +DPP_FIELD_T g_se_rschd_smmu1_wb_pful_cfg_reg[] = + { + {"smmu1_wb_pful_cfg", DPP_FIELD_FLAG_RW, 31, 32, 0x003a003a, 0x0}, + }; +DPP_FIELD_T g_se_rschd_smmu1_wb_ept_cfg_reg[] = + { + {"smmu1_wb_ept_cfg", DPP_FIELD_FLAG_RW, 31, 32, 0x00060006, 0x0}, + }; +DPP_FIELD_T g_se_rschd_alg_wb_pful_cfg_reg[] = + { + {"alg_wb_pful_cfg", DPP_FIELD_FLAG_RW, 31, 32, 0x003a003a, 0x0}, + }; +DPP_FIELD_T g_se_rschd_alg_wb_ept_cfg_reg[] = + { + {"alg_wb_ept_cfg", DPP_FIELD_FLAG_RW, 31, 32, 0x00060006, 0x0}, + }; +DPP_FIELD_T g_se_rschd_wr_rsp_vld_en_reg[] = + { + {"wr_rsp_vld_en", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_rschd_nppu_wb_pful_cfg_reg[] = + { + {"nppu_wb_pful_cfg", DPP_FIELD_FLAG_RW, 31, 32, 0x00380038, 0x0}, + }; +DPP_FIELD_T g_se_rschd_nppu_wb_ept_cfg_reg[] = + { + {"nppu_wb_ept_cfg", DPP_FIELD_FLAG_RW, 31, 32, 0x00080008, 0x0}, + }; +DPP_FIELD_T g_se_rschd_port0_int_en_reg[] = + { + {"port0_int_en", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_rschd_port0_int_mask_reg[] = + { + {"port0_int_mask", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_rschd_port1_int_en_reg[] = + { + {"port1_int_en", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_rschd_port1_int_mask_reg[] = + { + {"port1_int_mask", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_rschd_port0_int_status_reg[] = + { + {"port0_int_status", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_port1_int_status_reg[] = + { + {"port1_int_status", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_se_rschd_int_status_reg[] = + { + {"port1_int_unmask_flag", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"port0_int_unmask_flag", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_debug_cnt_mode_reg[] = + { + {"cnt_rd_mode", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"cnt_overflow_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_rschd_se_ppu_mex0_5_rsp1_cnt_reg[] = + { + {"se_ppu_mex0_5_rsp1_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_as_rschd_rsp0_cnt_reg[] = + { + {"as_rschd_rsp0_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_as_rschd_rsp1_cnt_reg[] = + { + {"as_rschd_rsp1_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_as_rschd_rsp2_cnt_reg[] = + { + {"as_rschd_rsp2_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_as_rschd_rsp3_cnt_reg[] = + { + {"as_rschd_rsp3_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_as_rschd_rsp4_cnt_reg[] = + { + {"as_rschd_rsp4_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_as_rschd_rsp5_cnt_reg[] = + { + {"as_rschd_rsp5_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_as_rschd_rsp6_cnt_reg[] = + { + {"as_rschd_rsp6_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_as_rschd_rsp9_cnt_reg[] = + { + {"as_rschd_rsp9_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_smmu1_se_rsp0_3_cnt_reg[] = + { + {"smmu1_se_rsp0_3_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_ppu_se_mex0_3_fc_cnt_reg[] = + { + {"ppu_se_mex0_3_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_rschd_as_fc_cnt0_reg[] = + { + {"rschd_as_fc_cnt0", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_rschd_as_fc_cnt1_reg[] = + { + {"rschd_as_fc_cnt1", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_rschd_as_fc_cnt2_reg[] = + { + {"rschd_as_fc_cnt2", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_rschd_as_fc_cnt3_reg[] = + { + {"rschd_as_fc_cnt3", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_rschd_as_fc_cnt4_reg[] = + { + {"rschd_as_fc_cnt4", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_rschd_as_fc_cnt5_reg[] = + { + {"rschd_as_fc_cnt5", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_rschd_as_fc_cnt6_reg[] = + { + {"rschd_as_fc_cnt6", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_rschd_as_fc_cnt9_reg[] = + { + {"rschd_as_fc_cnt9", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_se_smmu1_fc0_3_cnt_reg[] = + { + {"se_smmu1_fc0_3_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_smmu0_se_wr_done_cnt_reg[] = + { + {"smmu0_se_wr_done_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_se_smmu0_wr_done_fc_cnt_reg[] = + { + {"se_smmu0_wr_done_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_smmu1_se_wr_rsp_cnt_reg[] = + { + {"smmu1_se_wr_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_se_smmu1_wr_rsp_fc_cnt_reg[] = + { + {"se_smmu1_wr_rsp_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_alg_se_wr_rsp_cnt_reg[] = + { + {"alg_se_wr_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_rschd_se_alg_wr_rsp_fc_cnt_reg[] = + { + {"se_alg_wr_rsp_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_pful_cfg0_reg[] = + { + {"kschd_pful_assert0_1", DPP_FIELD_FLAG_RW, 27, 7, 0x18, 0x0}, + {"kschd_pful_negate0_1", DPP_FIELD_FLAG_RW, 20, 7, 0x18, 0x0}, + {"kschd_pful_assert0_0", DPP_FIELD_FLAG_RW, 13, 7, 0x20, 0x0}, + {"kschd_pful_negate0_0", DPP_FIELD_FLAG_RW, 6, 7, 0x20, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_pful_cfg1_reg[] = + { + {"kschd_pful_assert1_1", DPP_FIELD_FLAG_RW, 25, 7, 0x20, 0x0}, + {"kschd_pful_negate1_1", DPP_FIELD_FLAG_RW, 18, 7, 0x20, 0x0}, + {"kschd_pful_assert1_0", DPP_FIELD_FLAG_RW, 11, 6, 0x0c, 0x0}, + {"kschd_pful_negate1_0", DPP_FIELD_FLAG_RW, 5, 6, 0x0c, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl_pful1_cfg_reg[] = + { + {"ctrl_pful1_assert", DPP_FIELD_FLAG_RW, 7, 4, 0x3, 0x0}, + {"ctrl_pful1_negate", DPP_FIELD_FLAG_RW, 3, 4, 0x2, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl_pful2_cfg_reg[] = + { + {"ctrl_pful2_assert", DPP_FIELD_FLAG_RW, 9, 5, 0x0a, 0x0}, + {"ctrl_pful2_negate", DPP_FIELD_FLAG_RW, 4, 5, 0x08, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl_pful3_cfg_reg[] = + { + {"ctrl_pful3_assert", DPP_FIELD_FLAG_RW, 13, 7, 0x38, 0x0}, + {"ctrl_pful3_negate", DPP_FIELD_FLAG_RW, 6, 7, 0x36, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_pful_cfg_reg[] = + { + {"rschd_pful_assert", DPP_FIELD_FLAG_RW, 13, 7, 0x24, 0x0}, + {"rschd_pful_negate", DPP_FIELD_FLAG_RW, 6, 7, 0x24, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_ept_cfg_reg[] = + { + {"rschd_ept_assert", DPP_FIELD_FLAG_RW, 13, 7, 0x1c, 0x0}, + {"rschd_ept_negate", DPP_FIELD_FLAG_RW, 6, 7, 0x1c, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_alucmd_pful_cfg_reg[] = + { + {"alucmd_pful_assert", DPP_FIELD_FLAG_RW, 11, 6, 0x18, 0x0}, + {"alucmd_pful_negate", DPP_FIELD_FLAG_RW, 5, 6, 0x16, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_aluwr_pful_cfg_reg[] = + { + {"aluwr_pful_assert", DPP_FIELD_FLAG_RW, 7, 4, 0x5, 0x0}, + {"aluwr_pful_negate", DPP_FIELD_FLAG_RW, 3, 4, 0x4, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_wr_arb_pful_cfg0_reg[] = + { + {"wr_arb_pful0_assert", DPP_FIELD_FLAG_RW, 11, 6, 0x15, 0x0}, + {"wr_arb_pful0_negate", DPP_FIELD_FLAG_RW, 5, 6, 0x15, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_wr_arb_pful_cfg1_reg[] = + { + {"wr_arb_pful1_assert", DPP_FIELD_FLAG_RW, 15, 8, 0x64, 0x0}, + {"wr_arb_pful1_negate", DPP_FIELD_FLAG_RW, 7, 8, 0x64, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ord_pful_cfg_reg[] = + { + {"ord_pful_assert", DPP_FIELD_FLAG_RW, 13, 7, 0x2a, 0x0}, + {"ord_pful_negate", DPP_FIELD_FLAG_RW, 6, 7, 0x2a, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cfg_dma_baddr_reg[] = + { + {"cfg_dma_baddr", DPP_FIELD_FLAG_RW, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cfg_odma0_baddr_reg[] = + { + {"cfg_odma0_baddr", DPP_FIELD_FLAG_RW, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cfg_odma1_baddr_reg[] = + { + {"cfg_odma1_baddr", DPP_FIELD_FLAG_RW, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cfg_odma2_baddr_reg[] = + { + {"cfg_odma2_baddr", DPP_FIELD_FLAG_RW, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cfg_odma_tdm_baddr_reg[] = + { + {"cfg_odma_tdm_baddr", DPP_FIELD_FLAG_RW, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cfg_mcast_baddr_reg[] = + { + {"cfg_mcast_baddr", DPP_FIELD_FLAG_RW, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cfg_lpm0_reg[] = + { + {"lpm0_rsp_mode", DPP_FIELD_FLAG_RW, 21, 3, 0x0, 0x0}, + {"lpm0_baddr", DPP_FIELD_FLAG_RW, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cfg_lpm1_reg[] = + { + {"lpm1_rsp_mode", DPP_FIELD_FLAG_RW, 21, 3, 0x0, 0x0}, + {"lpm1_baddr", DPP_FIELD_FLAG_RW, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cfg_lpm2_reg[] = + { + {"lpm2_rsp_mode", DPP_FIELD_FLAG_RW, 21, 3, 0x0, 0x0}, + {"lpm2_baddr", DPP_FIELD_FLAG_RW, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cfg_lpm3_reg[] = + { + {"lpm3_rsp_mode", DPP_FIELD_FLAG_RW, 21, 3, 0x0, 0x0}, + {"lpm3_baddr", DPP_FIELD_FLAG_RW, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cfg_lpm4_reg[] = + { + {"lpm4_rsp_mode", DPP_FIELD_FLAG_RW, 21, 3, 0x0, 0x0}, + {"lpm4_baddr", DPP_FIELD_FLAG_RW, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cfg_lpm5_reg[] = + { + {"lpm5_rsp_mode", DPP_FIELD_FLAG_RW, 21, 3, 0x0, 0x0}, + {"lpm5_baddr", DPP_FIELD_FLAG_RW, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cfg_lpm6_reg[] = + { + {"lpm6_rsp_mode", DPP_FIELD_FLAG_RW, 21, 3, 0x0, 0x0}, + {"lpm6_baddr", DPP_FIELD_FLAG_RW, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cfg_lpm7_reg[] = + { + {"lpm7_rsp_mode", DPP_FIELD_FLAG_RW, 21, 3, 0x0, 0x0}, + {"lpm7_baddr", DPP_FIELD_FLAG_RW, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_debug_cnt_mode_reg[] = + { + {"cnt_rd_mode", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"cnt_overflow_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_stat_overflow_mode_reg[] = + { + {"stat_overflow_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_init_en_cfg_tmp_reg[] = + { + {"init_en_cfg_tmp31", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + {"init_en_cfg_tmp30", DPP_FIELD_FLAG_RW, 30, 1, 0x0, 0x0}, + {"init_en_cfg_tmp29", DPP_FIELD_FLAG_RW, 29, 1, 0x0, 0x0}, + {"init_en_cfg_tmp28", DPP_FIELD_FLAG_RW, 28, 1, 0x0, 0x0}, + {"init_en_cfg_tmp27", DPP_FIELD_FLAG_RW, 27, 1, 0x0, 0x0}, + {"init_en_cfg_tmp26", DPP_FIELD_FLAG_RW, 26, 1, 0x0, 0x0}, + {"init_en_cfg_tmp25", DPP_FIELD_FLAG_RW, 25, 1, 0x0, 0x0}, + {"init_en_cfg_tmp24", DPP_FIELD_FLAG_RW, 24, 1, 0x0, 0x0}, + {"init_en_cfg_tmp23", DPP_FIELD_FLAG_RW, 23, 1, 0x0, 0x0}, + {"init_en_cfg_tmp22", DPP_FIELD_FLAG_RW, 22, 1, 0x0, 0x0}, + {"init_en_cfg_tmp21", DPP_FIELD_FLAG_RW, 21, 1, 0x0, 0x0}, + {"init_en_cfg_tmp20", DPP_FIELD_FLAG_RW, 20, 1, 0x0, 0x0}, + {"init_en_cfg_tmp19", DPP_FIELD_FLAG_RW, 19, 1, 0x0, 0x0}, + {"init_en_cfg_tmp18", DPP_FIELD_FLAG_RW, 18, 1, 0x0, 0x0}, + {"init_en_cfg_tmp17", DPP_FIELD_FLAG_RW, 17, 1, 0x0, 0x0}, + {"init_en_cfg_tmp16", DPP_FIELD_FLAG_RW, 16, 1, 0x0, 0x0}, + {"init_en_cfg_tmp15", DPP_FIELD_FLAG_RW, 15, 1, 0x0, 0x0}, + {"init_en_cfg_tmp14", DPP_FIELD_FLAG_RW, 14, 1, 0x0, 0x0}, + {"init_en_cfg_tmp13", DPP_FIELD_FLAG_RW, 13, 1, 0x0, 0x0}, + {"init_en_cfg_tmp12", DPP_FIELD_FLAG_RW, 12, 1, 0x0, 0x0}, + {"init_en_cfg_tmp11", DPP_FIELD_FLAG_RW, 11, 1, 0x0, 0x0}, + {"init_en_cfg_tmp10", DPP_FIELD_FLAG_RW, 10, 1, 0x0, 0x0}, + {"init_en_cfg_tmp9", DPP_FIELD_FLAG_RW, 9, 1, 0x0, 0x0}, + {"init_en_cfg_tmp8", DPP_FIELD_FLAG_RW, 8, 1, 0x0, 0x0}, + {"init_en_cfg_tmp7", DPP_FIELD_FLAG_RW, 7, 1, 0x0, 0x0}, + {"init_en_cfg_tmp6", DPP_FIELD_FLAG_RW, 6, 1, 0x0, 0x0}, + {"init_en_cfg_tmp5", DPP_FIELD_FLAG_RW, 5, 1, 0x0, 0x0}, + {"init_en_cfg_tmp4", DPP_FIELD_FLAG_RW, 4, 1, 0x0, 0x0}, + {"init_en_cfg_tmp3", DPP_FIELD_FLAG_RW, 3, 1, 0x0, 0x0}, + {"init_en_cfg_tmp2", DPP_FIELD_FLAG_RW, 2, 1, 0x0, 0x0}, + {"init_en_cfg_tmp1", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"init_en_cfg_tmp0", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int_unmask_flag_reg[] = + { + {"smmu0_int0_31_unmask_flag", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int0_en_reg[] = + { + {"smmu0_int0_en31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"smmu0_int0_en30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"smmu0_int0_en29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"smmu0_int0_en28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"smmu0_int0_en27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"smmu0_int0_en26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"smmu0_int0_en25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"smmu0_int0_en24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"smmu0_int0_en23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"smmu0_int0_en22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"smmu0_int0_en21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"smmu0_int0_en20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"smmu0_int0_en19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"smmu0_int0_en18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"smmu0_int0_en17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"smmu0_int0_en16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"smmu0_int0_en15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"smmu0_int0_en14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"smmu0_int0_en13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"smmu0_int0_en12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"smmu0_int0_en11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"smmu0_int0_en10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"smmu0_int0_en9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"smmu0_int0_en8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"smmu0_int0_en7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"smmu0_int0_en6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"smmu0_int0_en5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"smmu0_int0_en4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"smmu0_int0_en3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"smmu0_int0_en2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"smmu0_int0_en1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"smmu0_int0_en0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int0_mask_reg[] = + { + {"smmu0_int0_mask31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"smmu0_int0_mask30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"smmu0_int0_mask29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"smmu0_int0_mask28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"smmu0_int0_mask27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"smmu0_int0_mask26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"smmu0_int0_mask25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"smmu0_int0_mask24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"smmu0_int0_mask23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"smmu0_int0_mask22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"smmu0_int0_mask21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"smmu0_int0_mask20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"smmu0_int0_mask19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"smmu0_int0_mask18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"smmu0_int0_mask17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"smmu0_int0_mask16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"smmu0_int0_mask15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"smmu0_int0_mask14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"smmu0_int0_mask13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"smmu0_int0_mask12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"smmu0_int0_mask11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"smmu0_int0_mask10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"smmu0_int0_mask9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"smmu0_int0_mask8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"smmu0_int0_mask7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"smmu0_int0_mask6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"smmu0_int0_mask5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"smmu0_int0_mask4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"smmu0_int0_mask3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"smmu0_int0_mask2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"smmu0_int0_mask1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"smmu0_int0_mask0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int0_status_reg[] = + { + {"smmu0_int0_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int0_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int0_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int0_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int0_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int0_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int0_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int0_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int0_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int0_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int0_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int0_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int0_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int0_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int0_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int0_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int0_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int0_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int0_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int0_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int0_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int0_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int0_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int0_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int0_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int0_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int0_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int0_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int0_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int0_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int0_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int0_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int1_en_reg[] = + { + {"smmu0_int1_en31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"smmu0_int1_en30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"smmu0_int1_en29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"smmu0_int1_en28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"smmu0_int1_en27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"smmu0_int1_en26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"smmu0_int1_en25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"smmu0_int1_en24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"smmu0_int1_en23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"smmu0_int1_en22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"smmu0_int1_en21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"smmu0_int1_en20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"smmu0_int1_en19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"smmu0_int1_en18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"smmu0_int1_en17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"smmu0_int1_en16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"smmu0_int1_en15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"smmu0_int1_en14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"smmu0_int1_en13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"smmu0_int1_en12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"smmu0_int1_en11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"smmu0_int1_en10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"smmu0_int1_en9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"smmu0_int1_en8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"smmu0_int1_en7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"smmu0_int1_en6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"smmu0_int1_en5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"smmu0_int1_en4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"smmu0_int1_en3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"smmu0_int1_en2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"smmu0_int1_en1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"smmu0_int1_en0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int1_mask_reg[] = + { + {"smmu0_int1_mask31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"smmu0_int1_mask30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"smmu0_int1_mask29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"smmu0_int1_mask28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"smmu0_int1_mask27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"smmu0_int1_mask26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"smmu0_int1_mask25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"smmu0_int1_mask24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"smmu0_int1_mask23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"smmu0_int1_mask22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"smmu0_int1_mask21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"smmu0_int1_mask20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"smmu0_int1_mask19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"smmu0_int1_mask18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"smmu0_int1_mask17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"smmu0_int1_mask16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"smmu0_int1_mask15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"smmu0_int1_mask14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"smmu0_int1_mask13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"smmu0_int1_mask12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"smmu0_int1_mask11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"smmu0_int1_mask10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"smmu0_int1_mask9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"smmu0_int1_mask8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"smmu0_int1_mask7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"smmu0_int1_mask6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"smmu0_int1_mask5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"smmu0_int1_mask4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"smmu0_int1_mask3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"smmu0_int1_mask2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"smmu0_int1_mask1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"smmu0_int1_mask0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int1_status_reg[] = + { + {"smmu0_int1_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int1_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int1_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int1_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int1_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int1_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int1_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int1_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int1_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int1_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int1_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int1_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int1_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int1_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int1_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int1_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int1_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int1_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int1_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int1_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int1_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int1_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int1_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int1_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int1_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int1_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int1_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int1_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int1_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int1_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int1_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int1_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int2_en_reg[] = + { + {"smmu0_int2_en31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"smmu0_int2_en30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"smmu0_int2_en29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"smmu0_int2_en28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"smmu0_int2_en27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"smmu0_int2_en26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"smmu0_int2_en25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"smmu0_int2_en24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"smmu0_int2_en23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"smmu0_int2_en22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"smmu0_int2_en21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"smmu0_int2_en20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"smmu0_int2_en19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"smmu0_int2_en18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"smmu0_int2_en17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"smmu0_int2_en16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"smmu0_int2_en15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"smmu0_int2_en14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"smmu0_int2_en13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"smmu0_int2_en12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"smmu0_int2_en11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"smmu0_int2_en10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"smmu0_int2_en9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"smmu0_int2_en8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"smmu0_int2_en7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"smmu0_int2_en6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"smmu0_int2_en5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"smmu0_int2_en4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"smmu0_int2_en3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"smmu0_int2_en2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"smmu0_int2_en1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"smmu0_int2_en0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int2_mask_reg[] = + { + {"smmu0_int2_mask31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"smmu0_int2_mask30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"smmu0_int2_mask29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"smmu0_int2_mask28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"smmu0_int2_mask27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"smmu0_int2_mask26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"smmu0_int2_mask25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"smmu0_int2_mask24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"smmu0_int2_mask23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"smmu0_int2_mask22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"smmu0_int2_mask21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"smmu0_int2_mask20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"smmu0_int2_mask19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"smmu0_int2_mask18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"smmu0_int2_mask17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"smmu0_int2_mask16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"smmu0_int2_mask15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"smmu0_int2_mask14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"smmu0_int2_mask13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"smmu0_int2_mask12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"smmu0_int2_mask11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"smmu0_int2_mask10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"smmu0_int2_mask9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"smmu0_int2_mask8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"smmu0_int2_mask7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"smmu0_int2_mask6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"smmu0_int2_mask5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"smmu0_int2_mask4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"smmu0_int2_mask3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"smmu0_int2_mask2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"smmu0_int2_mask1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"smmu0_int2_mask0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int2_status_reg[] = + { + {"smmu0_int2_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int2_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int2_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int2_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int2_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int2_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int2_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int2_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int2_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int2_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int2_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int2_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int2_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int2_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int2_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int2_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int2_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int2_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int2_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int2_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int2_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int2_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int2_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int2_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int2_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int2_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int2_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int2_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int2_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int2_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int2_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int2_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int3_en_reg[] = + { + {"smmu0_int3_en31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"smmu0_int3_en30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"smmu0_int3_en29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"smmu0_int3_en28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"smmu0_int3_en27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"smmu0_int3_en26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"smmu0_int3_en25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"smmu0_int3_en24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"smmu0_int3_en23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"smmu0_int3_en22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"smmu0_int3_en21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"smmu0_int3_en20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"smmu0_int3_en19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"smmu0_int3_en18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"smmu0_int3_en17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"smmu0_int3_en16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"smmu0_int3_en15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"smmu0_int3_en14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"smmu0_int3_en13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"smmu0_int3_en12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"smmu0_int3_en11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"smmu0_int3_en10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"smmu0_int3_en9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"smmu0_int3_en8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"smmu0_int3_en7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"smmu0_int3_en6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"smmu0_int3_en5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"smmu0_int3_en4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"smmu0_int3_en3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"smmu0_int3_en2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"smmu0_int3_en1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"smmu0_int3_en0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int3_mask_reg[] = + { + {"smmu0_int3_mask31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"smmu0_int3_mask30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"smmu0_int3_mask29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"smmu0_int3_mask28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"smmu0_int3_mask27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"smmu0_int3_mask26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"smmu0_int3_mask25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"smmu0_int3_mask24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"smmu0_int3_mask23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"smmu0_int3_mask22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"smmu0_int3_mask21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"smmu0_int3_mask20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"smmu0_int3_mask19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"smmu0_int3_mask18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"smmu0_int3_mask17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"smmu0_int3_mask16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"smmu0_int3_mask15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"smmu0_int3_mask14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"smmu0_int3_mask13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"smmu0_int3_mask12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"smmu0_int3_mask11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"smmu0_int3_mask10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"smmu0_int3_mask9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"smmu0_int3_mask8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"smmu0_int3_mask7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"smmu0_int3_mask6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"smmu0_int3_mask5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"smmu0_int3_mask4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"smmu0_int3_mask3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"smmu0_int3_mask2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"smmu0_int3_mask1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"smmu0_int3_mask0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int3_status_reg[] = + { + {"smmu0_int3_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int3_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int3_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int3_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int3_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int3_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int3_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int3_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int3_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int3_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int3_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int3_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int3_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int3_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int3_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int3_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int3_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int3_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int3_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int3_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int3_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int3_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int3_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int3_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int3_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int3_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int3_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int3_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int3_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int3_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int3_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int3_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int4_en_reg[] = + { + {"smmu0_int4_en31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"smmu0_int4_en30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"smmu0_int4_en29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"smmu0_int4_en28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"smmu0_int4_en27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"smmu0_int4_en26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"smmu0_int4_en25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"smmu0_int4_en24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"smmu0_int4_en23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"smmu0_int4_en22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"smmu0_int4_en21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"smmu0_int4_en20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"smmu0_int4_en19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"smmu0_int4_en18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"smmu0_int4_en17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"smmu0_int4_en16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"smmu0_int4_en15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"smmu0_int4_en14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"smmu0_int4_en13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"smmu0_int4_en12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"smmu0_int4_en11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"smmu0_int4_en10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"smmu0_int4_en9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"smmu0_int4_en8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"smmu0_int4_en7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"smmu0_int4_en6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"smmu0_int4_en5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"smmu0_int4_en4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"smmu0_int4_en3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"smmu0_int4_en2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"smmu0_int4_en1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"smmu0_int4_en0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int4_mask_reg[] = + { + {"smmu0_int4_mask31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"smmu0_int4_mask30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"smmu0_int4_mask29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"smmu0_int4_mask28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"smmu0_int4_mask27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"smmu0_int4_mask26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"smmu0_int4_mask25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"smmu0_int4_mask24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"smmu0_int4_mask23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"smmu0_int4_mask22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"smmu0_int4_mask21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"smmu0_int4_mask20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"smmu0_int4_mask19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"smmu0_int4_mask18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"smmu0_int4_mask17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"smmu0_int4_mask16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"smmu0_int4_mask15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"smmu0_int4_mask14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"smmu0_int4_mask13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"smmu0_int4_mask12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"smmu0_int4_mask11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"smmu0_int4_mask10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"smmu0_int4_mask9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"smmu0_int4_mask8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"smmu0_int4_mask7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"smmu0_int4_mask6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"smmu0_int4_mask5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"smmu0_int4_mask4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"smmu0_int4_mask3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"smmu0_int4_mask2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"smmu0_int4_mask1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"smmu0_int4_mask0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int4_status_reg[] = + { + {"smmu0_int4_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int4_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int4_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int4_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int4_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int4_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int4_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int4_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int4_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int4_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int4_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int4_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int4_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int4_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int4_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int4_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int4_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int4_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int4_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int4_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int4_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int4_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int4_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int4_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int4_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int4_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int4_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int4_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int4_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int4_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int4_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int4_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int5_en_reg[] = + { + {"smmu0_int5_en31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"smmu0_int5_en30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"smmu0_int5_en29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"smmu0_int5_en28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"smmu0_int5_en27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"smmu0_int5_en26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"smmu0_int5_en25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"smmu0_int5_en24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"smmu0_int5_en23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"smmu0_int5_en22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"smmu0_int5_en21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"smmu0_int5_en20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"smmu0_int5_en19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"smmu0_int5_en18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"smmu0_int5_en17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"smmu0_int5_en16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"smmu0_int5_en15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"smmu0_int5_en14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"smmu0_int5_en13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"smmu0_int5_en12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"smmu0_int5_en11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"smmu0_int5_en10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"smmu0_int5_en9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"smmu0_int5_en8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"smmu0_int5_en7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"smmu0_int5_en6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"smmu0_int5_en5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"smmu0_int5_en4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"smmu0_int5_en3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"smmu0_int5_en2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"smmu0_int5_en1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"smmu0_int5_en0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int5_mask_reg[] = + { + {"smmu0_int5_mask31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"smmu0_int5_mask30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"smmu0_int5_mask29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"smmu0_int5_mask28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"smmu0_int5_mask27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"smmu0_int5_mask26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"smmu0_int5_mask25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"smmu0_int5_mask24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"smmu0_int5_mask23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"smmu0_int5_mask22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"smmu0_int5_mask21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"smmu0_int5_mask20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"smmu0_int5_mask19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"smmu0_int5_mask18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"smmu0_int5_mask17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"smmu0_int5_mask16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"smmu0_int5_mask15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"smmu0_int5_mask14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"smmu0_int5_mask13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"smmu0_int5_mask12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"smmu0_int5_mask11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"smmu0_int5_mask10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"smmu0_int5_mask9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"smmu0_int5_mask8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"smmu0_int5_mask7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"smmu0_int5_mask6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"smmu0_int5_mask5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"smmu0_int5_mask4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"smmu0_int5_mask3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"smmu0_int5_mask2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"smmu0_int5_mask1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"smmu0_int5_mask0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int5_status_reg[] = + { + {"smmu0_int5_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int5_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int5_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int5_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int5_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int5_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int5_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int5_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int5_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int5_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int5_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int5_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int5_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int5_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int5_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int5_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int5_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int5_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int5_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int5_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int5_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int5_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int5_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int5_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int5_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int5_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int5_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int5_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int5_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int5_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int5_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int5_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int6_en_reg[] = + { + {"smmu0_int6_en31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"smmu0_int6_en30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"smmu0_int6_en29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"smmu0_int6_en28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"smmu0_int6_en27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"smmu0_int6_en26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"smmu0_int6_en25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"smmu0_int6_en24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"smmu0_int6_en23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"smmu0_int6_en22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"smmu0_int6_en21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"smmu0_int6_en20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"smmu0_int6_en19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"smmu0_int6_en18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"smmu0_int6_en17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"smmu0_int6_en16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"smmu0_int6_en15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"smmu0_int6_en14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"smmu0_int6_en13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"smmu0_int6_en12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"smmu0_int6_en11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"smmu0_int6_en10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"smmu0_int6_en9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"smmu0_int6_en8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"smmu0_int6_en7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"smmu0_int6_en6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"smmu0_int6_en5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"smmu0_int6_en4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"smmu0_int6_en3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"smmu0_int6_en2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"smmu0_int6_en1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"smmu0_int6_en0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int6_mask_reg[] = + { + {"smmu0_int6_mask31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"smmu0_int6_mask30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"smmu0_int6_mask29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"smmu0_int6_mask28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"smmu0_int6_mask27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"smmu0_int6_mask26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"smmu0_int6_mask25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"smmu0_int6_mask24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"smmu0_int6_mask23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"smmu0_int6_mask22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"smmu0_int6_mask21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"smmu0_int6_mask20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"smmu0_int6_mask19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"smmu0_int6_mask18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"smmu0_int6_mask17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"smmu0_int6_mask16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"smmu0_int6_mask15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"smmu0_int6_mask14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"smmu0_int6_mask13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"smmu0_int6_mask12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"smmu0_int6_mask11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"smmu0_int6_mask10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"smmu0_int6_mask9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"smmu0_int6_mask8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"smmu0_int6_mask7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"smmu0_int6_mask6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"smmu0_int6_mask5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"smmu0_int6_mask4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"smmu0_int6_mask3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"smmu0_int6_mask2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"smmu0_int6_mask1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"smmu0_int6_mask0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int6_status_reg[] = + { + {"smmu0_int6_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int6_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int6_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int6_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int6_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int6_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int6_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int6_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int6_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int6_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int6_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int6_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int6_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int6_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int6_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int6_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int6_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int6_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int6_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int6_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int6_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int6_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int6_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int6_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int6_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int6_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int6_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int6_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int6_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int6_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int6_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int6_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int7_en_reg[] = + { + {"smmu0_int7_en31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"smmu0_int7_en30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"smmu0_int7_en29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"smmu0_int7_en28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"smmu0_int7_en27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"smmu0_int7_en26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"smmu0_int7_en25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"smmu0_int7_en24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"smmu0_int7_en23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"smmu0_int7_en22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"smmu0_int7_en21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"smmu0_int7_en20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"smmu0_int7_en19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"smmu0_int7_en18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"smmu0_int7_en17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"smmu0_int7_en16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"smmu0_int7_en15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"smmu0_int7_en14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"smmu0_int7_en13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"smmu0_int7_en12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"smmu0_int7_en11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"smmu0_int7_en10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"smmu0_int7_en9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"smmu0_int7_en8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"smmu0_int7_en7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"smmu0_int7_en6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"smmu0_int7_en5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"smmu0_int7_en4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"smmu0_int7_en3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"smmu0_int7_en2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"smmu0_int7_en1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"smmu0_int7_en0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int7_mask_reg[] = + { + {"smmu0_int7_mask31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"smmu0_int7_mask30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"smmu0_int7_mask29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"smmu0_int7_mask28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"smmu0_int7_mask27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"smmu0_int7_mask26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"smmu0_int7_mask25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"smmu0_int7_mask24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"smmu0_int7_mask23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"smmu0_int7_mask22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"smmu0_int7_mask21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"smmu0_int7_mask20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"smmu0_int7_mask19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"smmu0_int7_mask18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"smmu0_int7_mask17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"smmu0_int7_mask16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"smmu0_int7_mask15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"smmu0_int7_mask14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"smmu0_int7_mask13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"smmu0_int7_mask12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"smmu0_int7_mask11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"smmu0_int7_mask10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"smmu0_int7_mask9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"smmu0_int7_mask8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"smmu0_int7_mask7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"smmu0_int7_mask6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"smmu0_int7_mask5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"smmu0_int7_mask4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"smmu0_int7_mask3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"smmu0_int7_mask2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"smmu0_int7_mask1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"smmu0_int7_mask0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int7_status_reg[] = + { + {"smmu0_int7_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int7_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int7_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int7_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int7_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int7_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int7_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int7_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int7_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int7_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int7_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int7_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int7_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int7_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int7_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int7_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int7_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int7_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int7_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int7_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int7_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int7_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int7_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int7_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int7_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int7_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int7_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int7_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int7_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int7_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int7_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int7_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int8_en_reg[] = + { + {"smmu0_int8_en31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"smmu0_int8_en30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"smmu0_int8_en29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"smmu0_int8_en28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"smmu0_int8_en27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"smmu0_int8_en26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"smmu0_int8_en25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"smmu0_int8_en24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"smmu0_int8_en23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"smmu0_int8_en22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"smmu0_int8_en21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"smmu0_int8_en20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"smmu0_int8_en19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"smmu0_int8_en18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"smmu0_int8_en17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"smmu0_int8_en16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"smmu0_int8_en15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"smmu0_int8_en14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"smmu0_int8_en13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"smmu0_int8_en12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"smmu0_int8_en11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"smmu0_int8_en10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"smmu0_int8_en9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"smmu0_int8_en8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"smmu0_int8_en7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"smmu0_int8_en6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"smmu0_int8_en5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"smmu0_int8_en4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"smmu0_int8_en3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"smmu0_int8_en2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"smmu0_int8_en1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"smmu0_int8_en0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int8_mask_reg[] = + { + {"smmu0_int8_mask31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"smmu0_int8_mask30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"smmu0_int8_mask29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"smmu0_int8_mask28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"smmu0_int8_mask27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"smmu0_int8_mask26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"smmu0_int8_mask25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"smmu0_int8_mask24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"smmu0_int8_mask23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"smmu0_int8_mask22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"smmu0_int8_mask21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"smmu0_int8_mask20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"smmu0_int8_mask19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"smmu0_int8_mask18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"smmu0_int8_mask17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"smmu0_int8_mask16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"smmu0_int8_mask15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"smmu0_int8_mask14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"smmu0_int8_mask13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"smmu0_int8_mask12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"smmu0_int8_mask11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"smmu0_int8_mask10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"smmu0_int8_mask9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"smmu0_int8_mask8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"smmu0_int8_mask7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"smmu0_int8_mask6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"smmu0_int8_mask5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"smmu0_int8_mask4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"smmu0_int8_mask3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"smmu0_int8_mask2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"smmu0_int8_mask1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"smmu0_int8_mask0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int8_status_reg[] = + { + {"smmu0_int8_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int8_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int8_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int8_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int8_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int8_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int8_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int8_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int8_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int8_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int8_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int8_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int8_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int8_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int8_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int8_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int8_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int8_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int8_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int8_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int8_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int8_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int8_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int8_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int8_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int8_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int8_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int8_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int8_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int8_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int8_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int8_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int9_en_reg[] = + { + {"smmu0_int8_en31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"smmu0_int8_en30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"smmu0_int8_en29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"smmu0_int8_en28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"smmu0_int8_en27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"smmu0_int8_en26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"smmu0_int8_en25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"smmu0_int8_en24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"smmu0_int8_en23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"smmu0_int8_en22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"smmu0_int8_en21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"smmu0_int8_en20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"smmu0_int9_en19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"smmu0_int9_en18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"smmu0_int9_en17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"smmu0_int9_en16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"smmu0_int9_en15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"smmu0_int9_en14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"smmu0_int9_en13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"smmu0_int9_en12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"smmu0_int9_en11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"smmu0_int9_en10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"smmu0_int9_en9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"smmu0_int9_en8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"smmu0_int9_en7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"smmu0_int9_en6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"smmu0_int9_en5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"smmu0_int9_en4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"smmu0_int9_en3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"smmu0_int9_en2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"smmu0_int9_en1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"smmu0_int9_en0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int9_mask_reg[] = + { + {"smmu0_int9_mask0_31", DPP_FIELD_FLAG_RW, 31, 32, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int9_status_reg[] = + { + {"smmu0_int9_status0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int10_en_reg[] = + { + {"smmu0_int10_en31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"smmu0_int10_en30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"smmu0_int10_en29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"smmu0_int10_en28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"smmu0_int10_en27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"smmu0_int10_en26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"smmu0_int10_en25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"smmu0_int10_en24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"smmu0_int10_en23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"smmu0_int10_en22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"smmu0_int10_en21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"smmu0_int10_en20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"smmu0_int10_en19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"smmu0_int10_en18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"smmu0_int10_en17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"smmu0_int10_en16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"smmu0_int10_en15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"smmu0_int10_en14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"smmu0_int10_en13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"smmu0_int10_en12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"smmu0_int10_en11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"smmu0_int10_en10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"smmu0_int10_en9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"smmu0_int10_en8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"smmu0_int10_en7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"smmu0_int10_en6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"smmu0_int10_en5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"smmu0_int10_en4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"smmu0_int10_en3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"smmu0_int10_en2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"smmu0_int10_en1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"smmu0_int10_en0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int10_mask_reg[] = + { + {"smmu0_int10_mask0_31", DPP_FIELD_FLAG_RW, 31, 32, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int10_status_reg[] = + { + {"smmu0_int10_status0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int11_en_reg[] = + { + {"smmu0_int11_en0_31", DPP_FIELD_FLAG_RW, 31, 32, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int11_mask_reg[] = + { + {"smmu0_int11_mask0_31", DPP_FIELD_FLAG_RW, 31, 32, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int11_status_reg[] = + { + {"smmu0_int11_status0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int12_en_reg[] = + { + {"smmu0_int12_en0_31", DPP_FIELD_FLAG_RW, 31, 32, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int12_mask_reg[] = + { + {"smmu0_int12_mask0_31", DPP_FIELD_FLAG_RW, 31, 32, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int12_status_reg[] = + { + {"smmu0_int12_status0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int13_en_reg[] = + { + {"smmu0_int13_en19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"smmu0_int13_en18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"smmu0_int13_en17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"smmu0_int13_en16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"smmu0_int13_en15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"smmu0_int13_en14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"smmu0_int13_en13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"smmu0_int13_en12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"smmu0_int13_en11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"smmu0_int13_en10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"smmu0_int13_en9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"smmu0_int13_en8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"smmu0_int13_en7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"smmu0_int13_en6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"smmu0_int13_en5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"smmu0_int13_en4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"smmu0_int13_en3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"smmu0_int13_en2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"smmu0_int13_en1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"smmu0_int13_en0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int13_mask_reg[] = + { + {"smmu0_int13_mask19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"smmu0_int13_mask18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"smmu0_int13_mask17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"smmu0_int13_mask16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"smmu0_int13_mask15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"smmu0_int13_mask14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"smmu0_int13_mask13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"smmu0_int13_mask12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"smmu0_int13_mask11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"smmu0_int13_mask10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"smmu0_int13_mask9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"smmu0_int13_mask8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"smmu0_int13_mask7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"smmu0_int13_mask6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"smmu0_int13_mask5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"smmu0_int13_mask4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"smmu0_int13_mask3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"smmu0_int13_mask2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"smmu0_int13_mask1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"smmu0_int13_mask0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int13_status_reg[] = + { + {"smmu0_int13_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int13_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int13_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int13_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int13_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int13_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int13_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int13_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int13_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int13_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int13_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int13_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int13_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int13_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int13_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int13_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int13_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int13_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int13_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int13_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int14_en_reg[] = + { + {"smmu0_int14_en16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"smmu0_int14_en15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"smmu0_int14_en14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"smmu0_int14_en13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"smmu0_int14_en12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"smmu0_int14_en11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"smmu0_int14_en10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"smmu0_int14_en9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"smmu0_int14_en8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"smmu0_int14_en7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"smmu0_int14_en6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"smmu0_int14_en5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"smmu0_int14_en4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"smmu0_int14_en3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"smmu0_int14_en2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"smmu0_int14_en1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"smmu0_int14_en0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int14_mask_reg[] = + { + {"smmu0_int14_mask16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"smmu0_int14_mask15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"smmu0_int14_mask14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"smmu0_int14_mask13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"smmu0_int14_mask12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"smmu0_int14_mask11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"smmu0_int14_mask10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"smmu0_int14_mask9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"smmu0_int14_mask8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"smmu0_int14_mask7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"smmu0_int14_mask6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"smmu0_int14_mask5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"smmu0_int14_mask4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"smmu0_int14_mask3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"smmu0_int14_mask2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"smmu0_int14_mask1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"smmu0_int14_mask0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int14_status_reg[] = + { + {"smmu0_int14_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int14_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int14_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int14_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int14_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int14_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int14_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int14_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int14_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int14_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int14_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int14_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int14_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int14_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int14_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int14_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int14_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_ecc_unmask_flag_reg[] = + { + {"smmu0_int53_unmask_flag", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int52_unmask_flag", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int51_unmask_flag", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int50_unmask_flag", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int49_unmask_flag", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int48_unmask_flag", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int47_unmask_flag", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int46_unmask_flag", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int45_unmask_flag", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int44_unmask_flag", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int43_unmask_flag", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int42_unmask_flag", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int41_unmask_flag", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int40_unmask_flag", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int39_unmask_flag", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int38_unmask_flag", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int37_unmask_flag", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int36_unmask_flag", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int35_unmask_flag", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int34_unmask_flag", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int33_unmask_flag", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int32_unmask_flag", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int15_en_reg[] = + { + {"smmu0_int15_en31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int15_en30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int15_en29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int15_en28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int15_en27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int15_en26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int15_en25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int15_en24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int15_en23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int15_en22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int15_en21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int15_en20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int15_en19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int15_en18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int15_en17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int15_en16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int15_en15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int15_en14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int15_en13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int15_en12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int15_en11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int15_en10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int15_en9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int15_en8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int15_en7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int15_en6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int15_en5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int15_en4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int15_en3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int15_en2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int15_en1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int15_en0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int15_mask_reg[] = + { + {"smmu0_int15_mask31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int15_mask30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int15_mask29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int15_mask28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int15_mask27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int15_mask26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int15_mask25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int15_mask24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int15_mask23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int15_mask22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int15_mask21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int15_mask20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int15_mask19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int15_mask18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int15_mask17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int15_mask16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int15_mask15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int15_mask14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int15_mask13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int15_mask12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int15_mask11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int15_mask10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int15_mask9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int15_mask8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int15_mask7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int15_mask6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int15_mask5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int15_mask4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int15_mask3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int15_mask2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int15_mask1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int15_mask0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int15_status_reg[] = + { + {"smmu0_int15_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int15_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int15_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int15_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int15_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int15_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int15_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int15_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int15_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int15_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int15_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int15_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int15_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int15_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int15_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int15_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int15_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int15_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int15_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int15_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int15_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int15_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int15_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int15_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int15_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int15_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int15_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int15_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int15_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int15_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int15_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int15_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int16_en_reg[] = + { + {"smmu0_int16_en31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int16_en30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int16_en29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int16_en28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int16_en27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int16_en26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int16_en25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int16_en24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int16_en23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int16_en22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int16_en21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int16_en20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int16_en19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int16_en18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int16_en17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int16_en16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int16_en15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int16_en14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int16_en13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int16_en12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int16_en11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int16_en10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int16_en9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int16_en8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int16_en7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int16_en6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int16_en5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int16_en4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int16_en3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int16_en2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int16_en1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int16_en0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int16_mask_reg[] = + { + {"smmu0_int16_mask31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int16_mask30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int16_mask29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int16_mask28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int16_mask27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int16_mask26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int16_mask25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int16_mask24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int16_mask23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int16_mask22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int16_mask21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int16_mask20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int16_mask19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int16_mask18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int16_mask17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int16_mask16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int16_mask15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int16_mask14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int16_mask13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int16_mask12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int16_mask11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int16_mask10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int16_mask9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int16_mask8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int16_mask7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int16_mask6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int16_mask5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int16_mask4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int16_mask3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int16_mask2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int16_mask1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int16_mask0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int16_status_reg[] = + { + {"smmu0_int16_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int16_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int16_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int16_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int16_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int16_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int16_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int16_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int16_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int16_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int16_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int16_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int16_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int16_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int16_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int16_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int16_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int16_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int16_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int16_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int16_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int16_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int16_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int16_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int16_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int16_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int16_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int16_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int16_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int16_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int16_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int16_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int17_en_reg[] = + { + {"smmu0_int17_en31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int17_en30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int17_en29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int17_en28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int17_en27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int17_en26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int17_en25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int17_en24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int17_en23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int17_en22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int17_en21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int17_en20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int17_en19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int17_en18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int17_en17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int17_en16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int17_en15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int17_en14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int17_en13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int17_en12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int17_en11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int17_en10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int17_en9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int17_en8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int17_en7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int17_en6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int17_en5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int17_en4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int17_en3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int17_en2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int17_en1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int17_en0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int17_mask_reg[] = + { + {"smmu0_int17_mask31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int17_mask30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int17_mask29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int17_mask28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int17_mask27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int17_mask26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int17_mask25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int17_mask24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int17_mask23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int17_mask22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int17_mask21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int17_mask20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int17_mask19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int17_mask18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int17_mask17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int17_mask16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int17_mask15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int17_mask14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int17_mask13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int17_mask12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int17_mask11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int17_mask10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int17_mask9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int17_mask8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int17_mask7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int17_mask6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int17_mask5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int17_mask4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int17_mask3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int17_mask2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int17_mask1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int17_mask0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int17_status_reg[] = + { + {"smmu0_int17_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int17_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int17_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int17_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int17_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int17_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int17_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int17_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int17_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int17_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int17_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int17_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int17_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int17_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int17_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int17_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int17_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int17_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int17_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int17_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int17_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int17_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int17_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int17_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int17_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int17_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int17_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int17_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int17_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int17_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int17_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int17_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int18_en_reg[] = + { + {"smmu0_int18_en31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int18_en30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int18_en29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int18_en28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int18_en27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int18_en26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int18_en25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int18_en24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int18_en23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int18_en22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int18_en21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int18_en20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int18_en19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int18_en18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int18_en17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int18_en16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int18_en15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int18_en14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int18_en13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int18_en12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int18_en11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int18_en10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int18_en9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int18_en8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int18_en7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int18_en6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int18_en5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int18_en4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int18_en3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int18_en2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int18_en1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int18_en0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int18_mask_reg[] = + { + {"smmu0_int18_mask31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int18_mask30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int18_mask29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int18_mask28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int18_mask27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int18_mask26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int18_mask25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int18_mask24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int18_mask23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int18_mask22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int18_mask21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int18_mask20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int18_mask19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int18_mask18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int18_mask17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int18_mask16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int18_mask15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int18_mask14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int18_mask13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int18_mask12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int18_mask11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int18_mask10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int18_mask9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int18_mask8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int18_mask7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int18_mask6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int18_mask5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int18_mask4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int18_mask3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int18_mask2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int18_mask1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int18_mask0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int18_status_reg[] = + { + {"smmu0_int18_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int18_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int18_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int18_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int18_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int18_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int18_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int18_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int18_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int18_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int18_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int18_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int18_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int18_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int18_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int18_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int18_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int18_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int18_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int18_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int18_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int18_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int18_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int18_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int18_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int18_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int18_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int18_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int18_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int18_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int18_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int18_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int19_en_reg[] = + { + {"smmu0_int19_en31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int19_en30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int19_en29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int19_en28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int19_en27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int19_en26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int19_en25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int19_en24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int19_en23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int19_en22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int19_en21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int19_en20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int19_en19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int19_en18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int19_en17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int19_en16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int19_en15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int19_en14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int19_en13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int19_en12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int19_en11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int19_en10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int19_en9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int19_en8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int19_en7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int19_en6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int19_en5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int19_en4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int19_en3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int19_en2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int19_en1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int19_en0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int19_mask_reg[] = + { + {"smmu0_int19_mask31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int19_mask30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int19_mask29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int19_mask28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int19_mask27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int19_mask26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int19_mask25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int19_mask24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int19_mask23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int19_mask22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int19_mask21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int19_mask20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int19_mask19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int19_mask18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int19_mask17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int19_mask16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int19_mask15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int19_mask14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int19_mask13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int19_mask12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int19_mask11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int19_mask10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int19_mask9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int19_mask8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int19_mask7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int19_mask6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int19_mask5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int19_mask4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int19_mask3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int19_mask2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int19_mask1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int19_mask0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int19_status_reg[] = + { + {"smmu0_int19_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int19_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int19_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int19_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int19_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int19_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int19_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int19_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int19_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int19_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int19_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int19_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int19_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int19_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int19_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int19_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int19_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int19_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int19_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int19_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int19_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int19_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int19_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int19_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int19_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int19_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int19_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int19_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int19_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int19_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int19_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int19_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int20_en_reg[] = + { + {"smmu0_int20_en31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int20_en30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int20_en29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int20_en28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int20_en27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int20_en26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int20_en25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int20_en24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int20_en23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int20_en22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int20_en21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int20_en20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int20_en19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int20_en18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int20_en17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int20_en16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int20_en15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int20_en14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int20_en13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int20_en12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int20_en11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int20_en10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int20_en9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int20_en8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int20_en7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int20_en6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int20_en5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int20_en4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int20_en3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int20_en2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int20_en1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int20_en0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int20_mask_reg[] = + { + {"smmu0_int20_mask31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int20_mask30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int20_mask29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int20_mask28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int20_mask27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int20_mask26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int20_mask25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int20_mask24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int20_mask23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int20_mask22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int20_mask21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int20_mask20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int20_mask19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int20_mask18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int20_mask17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int20_mask16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int20_mask15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int20_mask14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int20_mask13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int20_mask12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int20_mask11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int20_mask10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int20_mask9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int20_mask8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int20_mask7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int20_mask6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int20_mask5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int20_mask4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int20_mask3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int20_mask2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int20_mask1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int20_mask0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int20_status_reg[] = + { + {"smmu0_int20_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int20_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int20_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int20_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int20_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int20_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int20_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int20_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int20_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int20_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int20_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int20_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int20_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int20_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int20_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int20_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int20_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int20_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int20_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int20_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int20_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int20_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int20_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int20_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int20_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int20_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int20_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int20_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int20_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int20_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int20_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int20_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int21_en_reg[] = + { + {"smmu0_int21_en31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int21_en30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int21_en29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int21_en28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int21_en27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int21_en26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int21_en25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int21_en24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int21_en23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int21_en22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int21_en21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int21_en20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int21_en19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int21_en18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int21_en17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int21_en16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int21_en15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int21_en14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int21_en13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int21_en12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int21_en11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int21_en10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int21_en9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int21_en8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int21_en7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int21_en6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int21_en5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int21_en4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int21_en3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int21_en2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int21_en1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int21_en0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int21_mask_reg[] = + { + {"smmu0_int21_mask31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int21_mask30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int21_mask29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int21_mask28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int21_mask27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int21_mask26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int21_mask25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int21_mask24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int21_mask23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int21_mask22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int21_mask21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int21_mask20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int21_mask19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int21_mask18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int21_mask17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int21_mask16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int21_mask15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int21_mask14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int21_mask13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int21_mask12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int21_mask11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int21_mask10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int21_mask9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int21_mask8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int21_mask7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int21_mask6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int21_mask5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int21_mask4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int21_mask3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int21_mask2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int21_mask1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int21_mask0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int21_status_reg[] = + { + {"smmu0_int21_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int21_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int21_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int21_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int21_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int21_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int21_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int21_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int21_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int21_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int21_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int21_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int21_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int21_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int21_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int21_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int21_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int21_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int21_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int21_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int21_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int21_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int21_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int21_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int21_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int21_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int21_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int21_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int21_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int21_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int21_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int21_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int22_en_reg[] = + { + {"smmu0_int22_en31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int22_en30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int22_en29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int22_en28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int22_en27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int22_en26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int22_en25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int22_en24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int22_en23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int22_en22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int22_en21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int22_en20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int22_en19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int22_en18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int22_en17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int22_en16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int22_en15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int22_en14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int22_en13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int22_en12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int22_en11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int22_en10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int22_en9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int22_en8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int22_en7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int22_en6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int22_en5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int22_en4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int22_en3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int22_en2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int22_en1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int22_en0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int22_mask_reg[] = + { + {"smmu0_int22_mask31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int22_mask30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int22_mask29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int22_mask28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int22_mask27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int22_mask26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int22_mask25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int22_mask24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int22_mask23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int22_mask22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int22_mask21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int22_mask20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int22_mask19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int22_mask18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int22_mask17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int22_mask16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int22_mask15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int22_mask14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int22_mask13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int22_mask12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int22_mask11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int22_mask10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int22_mask9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int22_mask8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int22_mask7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int22_mask6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int22_mask5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int22_mask4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int22_mask3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int22_mask2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int22_mask1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int22_mask0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int22_status_reg[] = + { + {"smmu0_int22_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int22_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int22_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int22_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int22_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int22_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int22_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int22_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int22_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int22_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int22_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int22_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int22_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int22_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int22_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int22_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int22_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int22_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int22_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int22_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int22_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int22_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int22_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int22_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int22_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int22_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int22_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int22_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int22_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int22_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int22_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int22_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int23_en_reg[] = + { + {"smmu0_int23_en31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int23_en30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int23_en29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int23_en28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int23_en27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int23_en26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int23_en25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int23_en24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int23_en23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int23_en22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int23_en21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int23_en20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int23_en19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int23_en18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int23_en17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int23_en16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int23_en15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int23_en14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int23_en13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int23_en12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int23_en11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int23_en10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int23_en9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int23_en8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int23_en7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int23_en6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int23_en5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int23_en4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int23_en3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int23_en2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int23_en1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int23_en0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int23_mask_reg[] = + { + {"smmu0_int23_mask31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int23_mask30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int23_mask29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int23_mask28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int23_mask27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int23_mask26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int23_mask25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int23_mask24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int23_mask23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int23_mask22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int23_mask21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int23_mask20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int23_mask19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int23_mask18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int23_mask17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int23_mask16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int23_mask15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int23_mask14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int23_mask13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int23_mask12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int23_mask11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int23_mask10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int23_mask9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int23_mask8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int23_mask7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int23_mask6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int23_mask5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int23_mask4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int23_mask3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int23_mask2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int23_mask1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int23_mask0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int23_status_reg[] = + { + {"smmu0_int23_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int23_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int23_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int23_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int23_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int23_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int23_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int23_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int23_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int23_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int23_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int23_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int23_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int23_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int23_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int23_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int23_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int23_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int23_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int23_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int23_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int23_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int23_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int23_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int23_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int23_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int23_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int23_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int23_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int23_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int23_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int23_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int24_en_reg[] = + { + {"smmu0_int24_en31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int24_en30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int24_en29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int24_en28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int24_en27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int24_en26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int24_en25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int24_en24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int24_en23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int24_en22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int24_en21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int24_en20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int24_en19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int24_en18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int24_en17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int24_en16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int24_en15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int24_en14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int24_en13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int24_en12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int24_en11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int24_en10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int24_en9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int24_en8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int24_en7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int24_en6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int24_en5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int24_en4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int24_en3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int24_en2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int24_en1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int24_en0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int24_mask_reg[] = + { + {"smmu0_int24_mask31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int24_mask30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int24_mask29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int24_mask28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int24_mask27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int24_mask26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int24_mask25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int24_mask24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int24_mask23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int24_mask22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int24_mask21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int24_mask20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int24_mask19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int24_mask18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int24_mask17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int24_mask16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int24_mask15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int24_mask14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int24_mask13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int24_mask12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int24_mask11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int24_mask10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int24_mask9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int24_mask8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int24_mask7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int24_mask6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int24_mask5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int24_mask4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int24_mask3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int24_mask2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int24_mask1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int24_mask0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int24_status_reg[] = + { + {"smmu0_int24_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int24_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int24_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int24_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int24_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int24_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int24_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int24_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int24_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int24_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int24_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int24_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int24_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int24_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int24_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int24_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int24_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int24_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int24_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int24_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int24_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int24_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int24_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int24_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int24_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int24_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int24_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int24_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int24_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int24_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int24_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int24_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int25_en_reg[] = + { + {"smmu0_int25_en31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int25_en30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int25_en29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int25_en28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int25_en27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int25_en26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int25_en25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int25_en24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int25_en23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int25_en22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int25_en21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int25_en20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int25_en19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int25_en18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int25_en17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int25_en16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int25_en15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int25_en14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int25_en13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int25_en12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int25_en11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int25_en10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int25_en9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int25_en8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int25_en7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int25_en6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int25_en5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int25_en4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int25_en3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int25_en2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int25_en1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int25_en0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int25_mask_reg[] = + { + {"smmu0_int25_mask31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int25_mask30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int25_mask29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int25_mask28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int25_mask27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int25_mask26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int25_mask25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int25_mask24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int25_mask23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int25_mask22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int25_mask21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int25_mask20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int25_mask19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int25_mask18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int25_mask17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int25_mask16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int25_mask15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int25_mask14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int25_mask13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int25_mask12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int25_mask11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int25_mask10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int25_mask9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int25_mask8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int25_mask7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int25_mask6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int25_mask5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int25_mask4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int25_mask3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int25_mask2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int25_mask1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int25_mask0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int25_status_reg[] = + { + {"smmu0_int25_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int25_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int25_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int25_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int25_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int25_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int25_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int25_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int25_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int25_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int25_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int25_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int25_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int25_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int25_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int25_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int25_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int25_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int25_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int25_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int25_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int25_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int25_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int25_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int25_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int25_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int25_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int25_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int25_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int25_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int25_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int25_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int26_en_reg[] = + { + {"smmu0_int26_en31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int26_en30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int26_en29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int26_en28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int26_en27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int26_en26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int26_en25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int26_en24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int26_en23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int26_en22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int26_en21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int26_en20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int26_en19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int26_en18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int26_en17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int26_en16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int26_en15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int26_en14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int26_en13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int26_en12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int26_en11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int26_en10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int26_en9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int26_en8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int26_en7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int26_en6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int26_en5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int26_en4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int26_en3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int26_en2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int26_en1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int26_en0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int26_mask_reg[] = + { + {"smmu0_int26_mask31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int26_mask30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int26_mask29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int26_mask28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int26_mask27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int26_mask26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int26_mask25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int26_mask24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int26_mask23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int26_mask22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int26_mask21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int26_mask20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int26_mask19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int26_mask18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int26_mask17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int26_mask16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int26_mask15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int26_mask14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int26_mask13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int26_mask12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int26_mask11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int26_mask10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int26_mask9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int26_mask8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int26_mask7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int26_mask6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int26_mask5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int26_mask4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int26_mask3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int26_mask2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int26_mask1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int26_mask0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int26_status_reg[] = + { + {"smmu0_int26_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int26_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int26_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int26_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int26_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int26_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int26_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int26_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int26_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int26_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int26_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int26_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int26_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int26_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int26_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int26_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int26_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int26_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int26_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int26_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int26_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int26_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int26_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int26_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int26_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int26_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int26_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int26_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int26_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int26_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int26_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int26_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int27_en_reg[] = + { + {"smmu0_int27_en31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int27_en30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int27_en29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int27_en28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int27_en27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int27_en26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int27_en25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int27_en24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int27_en23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int27_en22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int27_en21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int27_en20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int27_en19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int27_en18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int27_en17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int27_en16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int27_en15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int27_en14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int27_en13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int27_en12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int27_en11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int27_en10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int27_en9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int27_en8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int27_en7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int27_en6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int27_en5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int27_en4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int27_en3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int27_en2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int27_en1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int27_en0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int27_mask_reg[] = + { + {"smmu0_int27_mask31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int27_mask30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int27_mask29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int27_mask28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int27_mask27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int27_mask26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int27_mask25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int27_mask24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int27_mask23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int27_mask22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int27_mask21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int27_mask20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int27_mask19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int27_mask18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int27_mask17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int27_mask16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int27_mask15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int27_mask14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int27_mask13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int27_mask12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int27_mask11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int27_mask10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int27_mask9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int27_mask8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int27_mask7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int27_mask6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int27_mask5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int27_mask4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int27_mask3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int27_mask2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int27_mask1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int27_mask0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int27_status_reg[] = + { + {"smmu0_int27_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int27_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int27_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int27_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int27_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int27_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int27_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int27_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int27_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int27_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int27_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int27_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int27_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int27_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int27_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int27_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int27_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int27_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int27_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int27_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int27_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int27_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int27_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int27_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int27_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int27_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int27_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int27_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int27_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int27_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int27_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int27_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int28_en_reg[] = + { + {"smmu0_int28_en31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int28_en30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int28_en29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int28_en28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int28_en27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int28_en26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int28_en25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int28_en24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int28_en23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int28_en22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int28_en21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int28_en20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int28_en19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int28_en18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int28_en17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int28_en16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int28_en15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int28_en14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int28_en13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int28_en12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int28_en11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int28_en10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int28_en9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int28_en8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int28_en7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int28_en6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int28_en5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int28_en4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int28_en3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int28_en2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int28_en1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int28_en0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int28_mask_reg[] = + { + {"smmu0_int28_mask31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int28_mask30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int28_mask29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int28_mask28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int28_mask27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int28_mask26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int28_mask25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int28_mask24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int28_mask23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int28_mask22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int28_mask21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int28_mask20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int28_mask19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int28_mask18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int28_mask17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int28_mask16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int28_mask15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int28_mask14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int28_mask13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int28_mask12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int28_mask11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int28_mask10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int28_mask9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int28_mask8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int28_mask7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int28_mask6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int28_mask5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int28_mask4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int28_mask3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int28_mask2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int28_mask1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int28_mask0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int28_status_reg[] = + { + {"smmu0_int28_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int28_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int28_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int28_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int28_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int28_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int28_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int28_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int28_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int28_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int28_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int28_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int28_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int28_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int28_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int28_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int28_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int28_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int28_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int28_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int28_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int28_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int28_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int28_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int28_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int28_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int28_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int28_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int28_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int28_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int28_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int28_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int29_en_reg[] = + { + {"smmu0_int29_en31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int29_en30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int29_en29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int29_en28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int29_en27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int29_en26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int29_en25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int29_en24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int29_en23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int29_en22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int29_en21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int29_en20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int29_en19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int29_en18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int29_en17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int29_en16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int29_en15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int29_en14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int29_en13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int29_en12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int29_en11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int29_en10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int29_en9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int29_en8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int29_en7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int29_en6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int29_en5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int29_en4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int29_en3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int29_en2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int29_en1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int29_en0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int29_mask_reg[] = + { + {"smmu0_int29_mask31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int29_mask30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int29_mask29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int29_mask28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int29_mask27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int29_mask26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int29_mask25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int29_mask24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int29_mask23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int29_mask22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int29_mask21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int29_mask20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int29_mask19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int29_mask18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int29_mask17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int29_mask16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int29_mask15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int29_mask14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int29_mask13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int29_mask12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int29_mask11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int29_mask10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int29_mask9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int29_mask8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int29_mask7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int29_mask6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int29_mask5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int29_mask4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int29_mask3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int29_mask2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int29_mask1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int29_mask0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int29_status_reg[] = + { + {"smmu0_int29_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int29_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int29_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int29_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int29_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int29_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int29_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int29_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int29_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int29_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int29_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int29_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int29_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int29_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int29_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int29_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int29_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int29_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int29_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int29_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int29_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int29_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int29_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int29_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int29_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int29_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int29_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int29_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int29_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int29_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int29_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int29_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int30_en_reg[] = + { + {"smmu0_int30_en31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int30_en30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int30_en29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int30_en28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int30_en27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int30_en26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int30_en25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int30_en24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int30_en23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int30_en22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int30_en21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int30_en20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int30_en19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int30_en18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int30_en17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int30_en16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int30_en15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int30_en14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int30_en13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int30_en12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int30_en11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int30_en10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int30_en9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int30_en8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int30_en7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int30_en6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int30_en5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int30_en4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int30_en3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int30_en2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int30_en1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int30_en0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int30_mask_reg[] = + { + {"smmu0_int30_mask31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int30_mask30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int30_mask29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int30_mask28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int30_mask27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int30_mask26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int30_mask25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int30_mask24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int30_mask23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int30_mask22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int30_mask21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int30_mask20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int30_mask19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int30_mask18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int30_mask17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int30_mask16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int30_mask15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int30_mask14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int30_mask13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int30_mask12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int30_mask11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int30_mask10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int30_mask9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int30_mask8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int30_mask7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int30_mask6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int30_mask5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int30_mask4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int30_mask3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int30_mask2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int30_mask1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int30_mask0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int30_status_reg[] = + { + {"smmu0_int30_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int30_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int30_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int30_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int30_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int30_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int30_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int30_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int30_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int30_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int30_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int30_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int30_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int30_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int30_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int30_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int30_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int30_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int30_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int30_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int30_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int30_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int30_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int30_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int30_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int30_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int30_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int30_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int30_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int30_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int30_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int30_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int31_en_reg[] = + { + {"smmu0_int31_en31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int31_en30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int31_en29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int31_en28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int31_en27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int31_en26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int31_en25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int31_en24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int31_en23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int31_en22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int31_en21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int31_en20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int31_en19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int31_en18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int31_en17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int31_en16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int31_en15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int31_en14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int31_en13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int31_en12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int31_en11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int31_en10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int31_en9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int31_en8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int31_en7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int31_en6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int31_en5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int31_en4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int31_en3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int31_en2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int31_en1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int31_en0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int31_mask_reg[] = + { + {"smmu0_int31_mask31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int31_mask30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int31_mask29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int31_mask28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int31_mask27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int31_mask26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int31_mask25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int31_mask24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int31_mask23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int31_mask22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int31_mask21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int31_mask20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int31_mask19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int31_mask18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int31_mask17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int31_mask16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int31_mask15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int31_mask14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int31_mask13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int31_mask12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int31_mask11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int31_mask10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int31_mask9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int31_mask8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int31_mask7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int31_mask6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int31_mask5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int31_mask4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int31_mask3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int31_mask2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int31_mask1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int31_mask0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int31_status_reg[] = + { + {"smmu0_int31_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int31_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int31_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int31_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int31_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int31_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int31_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int31_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int31_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int31_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int31_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int31_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int31_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int31_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int31_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int31_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int31_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int31_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int31_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int31_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int31_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int31_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int31_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int31_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int31_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int31_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int31_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int31_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int31_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int31_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int31_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int31_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int32_en_reg[] = + { + {"smmu0_int32_en31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int32_en30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int32_en29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int32_en28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int32_en27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int32_en26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int32_en25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int32_en24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int32_en23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int32_en22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int32_en21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int32_en20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int32_en19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int32_en18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int32_en17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int32_en16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int32_en15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int32_en14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int32_en13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int32_en12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int32_en11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int32_en10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int32_en9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int32_en8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int32_en7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int32_en6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int32_en5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int32_en4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int32_en3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int32_en2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int32_en1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int32_en0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int32_mask_reg[] = + { + {"smmu0_int32_mask31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int32_mask30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int32_mask29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int32_mask28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int32_mask27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int32_mask26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int32_mask25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int32_mask24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int32_mask23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int32_mask22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int32_mask21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int32_mask20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int32_mask19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int32_mask18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int32_mask17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int32_mask16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int32_mask15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int32_mask14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int32_mask13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int32_mask12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int32_mask11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int32_mask10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int32_mask9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int32_mask8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int32_mask7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int32_mask6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int32_mask5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int32_mask4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int32_mask3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int32_mask2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int32_mask1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int32_mask0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int32_status_reg[] = + { + {"smmu0_int32_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int32_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int32_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int32_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int32_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int32_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int32_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int32_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int32_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int32_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int32_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int32_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int32_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int32_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int32_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int32_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int32_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int32_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int32_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int32_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int32_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int32_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int32_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int32_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int32_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int32_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int32_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int32_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int32_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int32_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int32_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int32_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int33_en_reg[] = + { + {"smmu0_int33_en31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int33_en30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int33_en29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int33_en28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int33_en27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int33_en26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int33_en25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int33_en24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int33_en23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int33_en22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int33_en21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int33_en20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int33_en19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int33_en18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int33_en17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int33_en16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int33_en15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int33_en14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int33_en13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int33_en12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int33_en11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int33_en10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int33_en9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int33_en8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int33_en7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int33_en6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int33_en5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int33_en4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int33_en3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int33_en2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int33_en1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int33_en0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int33_mask_reg[] = + { + {"smmu0_int33_mask31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int33_mask30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int33_mask29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int33_mask28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int33_mask27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int33_mask26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int33_mask25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int33_mask24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int33_mask23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int33_mask22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int33_mask21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int33_mask20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int33_mask19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int33_mask18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int33_mask17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int33_mask16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int33_mask15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int33_mask14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int33_mask13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int33_mask12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int33_mask11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int33_mask10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int33_mask9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int33_mask8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int33_mask7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int33_mask6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int33_mask5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int33_mask4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int33_mask3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int33_mask2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int33_mask1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int33_mask0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int33_status_reg[] = + { + {"smmu0_int33_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int33_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int33_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int33_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int33_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int33_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int33_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int33_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int33_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int33_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int33_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int33_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int33_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int33_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int33_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int33_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int33_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int33_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int33_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int33_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int33_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int33_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int33_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int33_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int33_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int33_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int33_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int33_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int33_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int33_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int33_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int33_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int34_en_reg[] = + { + {"smmu0_int34_en31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int34_en30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int34_en29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int34_en28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int34_en27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int34_en26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int34_en25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int34_en24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int34_en23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int34_en22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int34_en21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int34_en20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int34_en19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int34_en18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int34_en17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int34_en16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int34_en15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int34_en14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int34_en13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int34_en12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int34_en11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int34_en10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int34_en9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int34_en8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int34_en7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int34_en6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int34_en5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int34_en4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int34_en3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int34_en2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int34_en1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int34_en0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int34_mask_reg[] = + { + {"smmu0_int34_mask31", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"smmu0_int34_mask30", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"smmu0_int34_mask29", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"smmu0_int34_mask28", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"smmu0_int34_mask27", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"smmu0_int34_mask26", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"smmu0_int34_mask25", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"smmu0_int34_mask24", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"smmu0_int34_mask23", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"smmu0_int34_mask22", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"smmu0_int34_mask21", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"smmu0_int34_mask20", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"smmu0_int34_mask19", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"smmu0_int34_mask18", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"smmu0_int34_mask17", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"smmu0_int34_mask16", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"smmu0_int34_mask15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"smmu0_int34_mask14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"smmu0_int34_mask13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"smmu0_int34_mask12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"smmu0_int34_mask11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"smmu0_int34_mask10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"smmu0_int34_mask9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"smmu0_int34_mask8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"smmu0_int34_mask7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"smmu0_int34_mask6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"smmu0_int34_mask5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"smmu0_int34_mask4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"smmu0_int34_mask3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int34_mask2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int34_mask1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int34_mask0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int34_status_reg[] = + { + {"smmu0_int34_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"smmu0_int34_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"smmu0_int34_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"smmu0_int34_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"smmu0_int34_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"smmu0_int34_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"smmu0_int34_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"smmu0_int34_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"smmu0_int34_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"smmu0_int34_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"smmu0_int34_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"smmu0_int34_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"smmu0_int34_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"smmu0_int34_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"smmu0_int34_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"smmu0_int34_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"smmu0_int34_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"smmu0_int34_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"smmu0_int34_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"smmu0_int34_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"smmu0_int34_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"smmu0_int34_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"smmu0_int34_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"smmu0_int34_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"smmu0_int34_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"smmu0_int34_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"smmu0_int34_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"smmu0_int34_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"smmu0_int34_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int34_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int34_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int34_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int35_en_reg[] = + { + {"smmu0_int35_en0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int35_mask_reg[] = + { + {"smmu0_int35_mask0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int35_status_reg[] = + { + {"smmu0_int35_status0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int36_en_reg[] = + { + {"smmu0_int36_en0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int36_mask_reg[] = + { + {"smmu0_int36_mask0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int36_status_reg[] = + { + {"smmu0_int36_status0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int37_en_reg[] = + { + {"smmu0_int37_en0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int37_mask_reg[] = + { + {"smmu0_int37_mask0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int37_status_reg[] = + { + {"smmu0_int37_status0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int38_en_reg[] = + { + {"smmu0_int38_en0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int38_mask_reg[] = + { + {"smmu0_int38_mask0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int38_status_reg[] = + { + {"smmu0_int38_status0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int39_en_reg[] = + { + {"smmu0_int39_en0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int39_mask_reg[] = + { + {"smmu0_int39_mask0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int39_status_reg[] = + { + {"smmu0_int39_status0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int40_en_reg[] = + { + {"smmu0_int40_en0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int40_mask_reg[] = + { + {"smmu0_int40_mask0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int40_status_reg[] = + { + {"smmu0_int40_status0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int41_en_reg[] = + { + {"smmu0_int41_en0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int41_mask_reg[] = + { + {"smmu0_int41_mask0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int41_status_reg[] = + { + {"smmu0_int41_status0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int42_en_reg[] = + { + {"smmu0_int42_en0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int42_mask_reg[] = + { + {"smmu0_int42_mask0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int42_status_reg[] = + { + {"smmu0_int42_status0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int43_en_reg[] = + { + {"smmu0_int43_en0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int43_mask_reg[] = + { + {"smmu0_int43_mask0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int43_status_reg[] = + { + {"smmu0_int43_status0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int44_en_reg[] = + { + {"smmu0_int44_en0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int44_mask_reg[] = + { + {"smmu0_int44_mask0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int44_status_reg[] = + { + {"smmu0_int44_status0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int45_en_reg[] = + { + {"smmu0_int45_en0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int45_mask_reg[] = + { + {"smmu0_int45_mask0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int45_status_reg[] = + { + {"smmu0_int45_status0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int46_en_reg[] = + { + {"smmu0_int46_en0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int46_mask_reg[] = + { + {"smmu0_int46_mask0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int46_status_reg[] = + { + {"smmu0_int46_status0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int47_en_reg[] = + { + {"smmu0_int47_en0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int47_mask_reg[] = + { + {"smmu0_int47_mask0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int47_status_reg[] = + { + {"smmu0_int47_status0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int48_en_reg[] = + { + {"smmu0_int48_en0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int48_mask_reg[] = + { + {"smmu0_int48_mask0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int48_status_reg[] = + { + {"smmu0_int48_status0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int49_en_reg[] = + { + {"smmu0_int49_en0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int49_mask_reg[] = + { + {"smmu0_int49_mask0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int49_status_reg[] = + { + {"smmu0_int49_status0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int50_en_reg[] = + { + {"smmu0_int50_en0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int50_mask_reg[] = + { + {"smmu0_int50_mask0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int50_status_reg[] = + { + {"smmu0_int50_status0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int51_en_reg[] = + { + {"smmu0_int51_en0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int51_mask_reg[] = + { + {"smmu0_int51_mask0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int51_status_reg[] = + { + {"smmu0_int51_status0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int52_en_reg[] = + { + {"smmu0_int52_en0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int52_mask_reg[] = + { + {"smmu0_int52_mask0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int52_status_reg[] = + { + {"smmu0_int52_status0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int53_en_reg[] = + { + {"smmu0_int53_en3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int53_en2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int53_en1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int53_en0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int53_mask_reg[] = + { + {"smmu0_int53_mask3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"smmu0_int53_mask2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"smmu0_int53_mask1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_int53_mask0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_int53_status_reg[] = + { + {"smmu0_int53_status15", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_int53_status14", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_int53_status13", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_int53_status12", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl0_arbiter_ecc_bypass_reg[] = + { + {"ctrl1_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"ctrl1_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"ctrl1_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"ctrl1_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"ctrl1_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"ctrl1_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"ctrl1_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"ctrl1_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"ctrl1_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"ctrl1_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"ctrl1_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"ctrl1_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"ctrl1_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"ctrl1_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"ctrl1_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"ctrl1_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"ctrl0_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"ctrl0_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"ctrl0_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"ctrl0_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"ctrl0_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"ctrl0_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"ctrl0_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"ctrl0_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"ctrl0_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"ctrl0_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"ctrl0_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"ctrl0_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"ctrl0_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"ctrl0_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"ctrl0_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"ctrl0_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl2_arbiter_ecc_bypass_reg[] = + { + {"ctrl3_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"ctrl3_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"ctrl3_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"ctrl3_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"ctrl3_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"ctrl3_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"ctrl3_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"ctrl3_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"ctrl3_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"ctrl3_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"ctrl3_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"ctrl3_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"ctrl3_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"ctrl3_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"ctrl3_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"ctrl3_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"ctrl2_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"ctrl2_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"ctrl2_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"ctrl2_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"ctrl2_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"ctrl2_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"ctrl2_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"ctrl2_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"ctrl2_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"ctrl2_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"ctrl2_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"ctrl2_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"ctrl2_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"ctrl2_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"ctrl2_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"ctrl2_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl4_arbiter_ecc_bypass_reg[] = + { + {"ctrl5_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"ctrl5_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"ctrl5_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"ctrl5_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"ctrl5_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"ctrl5_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"ctrl5_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"ctrl5_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"ctrl5_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"ctrl5_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"ctrl5_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"ctrl5_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"ctrl5_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"ctrl5_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"ctrl5_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"ctrl5_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"ctrl4_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"ctrl4_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"ctrl4_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"ctrl4_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"ctrl4_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"ctrl4_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"ctrl4_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"ctrl4_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"ctrl4_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"ctrl4_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"ctrl4_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"ctrl4_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"ctrl4_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"ctrl4_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"ctrl4_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"ctrl4_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl6_arbiter_ecc_bypass_reg[] = + { + {"ctrl7_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"ctrl7_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"ctrl7_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"ctrl7_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"ctrl7_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"ctrl7_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"ctrl7_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"ctrl7_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"ctrl7_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"ctrl7_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"ctrl7_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"ctrl7_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"ctrl7_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"ctrl7_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"ctrl7_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"ctrl7_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"ctrl6_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"ctrl6_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"ctrl6_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"ctrl6_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"ctrl6_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"ctrl6_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"ctrl6_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"ctrl6_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"ctrl6_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"ctrl6_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"ctrl6_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"ctrl6_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"ctrl6_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"ctrl6_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"ctrl6_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"ctrl6_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl8_arbiter_ecc_bypass_reg[] = + { + {"ctrl9_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"ctrl9_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"ctrl9_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"ctrl9_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"ctrl9_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"ctrl9_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"ctrl9_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"ctrl9_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"ctrl9_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"ctrl9_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"ctrl9_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"ctrl9_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"ctrl9_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"ctrl9_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"ctrl9_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"ctrl9_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"ctrl8_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"ctrl8_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"ctrl8_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"ctrl8_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"ctrl8_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"ctrl8_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"ctrl8_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"ctrl8_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"ctrl8_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"ctrl8_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"ctrl8_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"ctrl8_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"ctrl8_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"ctrl8_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"ctrl8_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"ctrl8_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl10_arbiter_ecc_bypass_reg[] = + { + {"ctrl11_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"ctrl11_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"ctrl11_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"ctrl11_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"ctrl11_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"ctrl11_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"ctrl11_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"ctrl11_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"ctrl11_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"ctrl11_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"ctrl11_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"ctrl11_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"ctrl11_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"ctrl11_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"ctrl11_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"ctrl11_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"ctrl10_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"ctrl10_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"ctrl10_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"ctrl10_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"ctrl10_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"ctrl10_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"ctrl10_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"ctrl10_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"ctrl10_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"ctrl10_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"ctrl10_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"ctrl10_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"ctrl10_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"ctrl10_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"ctrl10_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"ctrl10_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl12_arbiter_ecc_bypass_reg[] = + { + {"ctrl13_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"ctrl13_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"ctrl13_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"ctrl13_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"ctrl13_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"ctrl13_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"ctrl13_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"ctrl13_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"ctrl13_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"ctrl13_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"ctrl13_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"ctrl13_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"ctrl13_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"ctrl13_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"ctrl13_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"ctrl13_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"ctrl12_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"ctrl12_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"ctrl12_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"ctrl12_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"ctrl12_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"ctrl12_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"ctrl12_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"ctrl12_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"ctrl12_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"ctrl12_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"ctrl12_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"ctrl12_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"ctrl12_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"ctrl12_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"ctrl12_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"ctrl12_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl14_arbiter_ecc_bypass_reg[] = + { + {"ctrl15_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"ctrl15_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"ctrl15_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"ctrl15_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"ctrl15_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"ctrl15_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"ctrl15_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"ctrl15_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"ctrl15_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"ctrl15_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"ctrl15_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"ctrl15_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"ctrl15_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"ctrl15_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"ctrl15_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"ctrl15_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"ctrl14_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"ctrl14_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"ctrl14_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"ctrl14_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"ctrl14_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"ctrl14_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"ctrl14_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"ctrl14_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"ctrl14_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"ctrl14_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"ctrl14_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"ctrl14_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"ctrl14_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"ctrl14_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"ctrl14_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"ctrl14_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl16_arbiter_ecc_bypass_reg[] = + { + {"ctrl17_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"ctrl17_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"ctrl17_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"ctrl17_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"ctrl17_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"ctrl17_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"ctrl17_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"ctrl17_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"ctrl17_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"ctrl17_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"ctrl17_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"ctrl17_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"ctrl17_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"ctrl17_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"ctrl17_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"ctrl17_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"ctrl16_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"ctrl16_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"ctrl16_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"ctrl16_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"ctrl16_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"ctrl16_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"ctrl16_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"ctrl16_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"ctrl16_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"ctrl16_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"ctrl16_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"ctrl16_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"ctrl16_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"ctrl16_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"ctrl16_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"ctrl16_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl18_arbiter_ecc_bypass_reg[] = + { + {"ctrl19_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"ctrl19_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"ctrl19_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"ctrl19_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"ctrl19_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"ctrl19_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"ctrl19_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"ctrl19_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"ctrl19_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"ctrl19_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"ctrl19_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"ctrl19_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"ctrl19_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"ctrl19_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"ctrl19_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"ctrl19_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"ctrl18_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"ctrl18_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"ctrl18_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"ctrl18_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"ctrl18_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"ctrl18_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"ctrl18_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"ctrl18_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"ctrl18_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"ctrl18_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"ctrl18_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"ctrl18_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"ctrl18_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"ctrl18_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"ctrl18_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"ctrl18_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl20_arbiter_ecc_bypass_reg[] = + { + {"ctrl21_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"ctrl21_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"ctrl21_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"ctrl21_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"ctrl21_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"ctrl21_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"ctrl21_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"ctrl21_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"ctrl21_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"ctrl21_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"ctrl21_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"ctrl21_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"ctrl21_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"ctrl21_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"ctrl21_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"ctrl21_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"ctrl20_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"ctrl20_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"ctrl20_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"ctrl20_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"ctrl20_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"ctrl20_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"ctrl20_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"ctrl20_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"ctrl20_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"ctrl20_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"ctrl20_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"ctrl20_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"ctrl20_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"ctrl20_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"ctrl20_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"ctrl20_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl22_arbiter_ecc_bypass_reg[] = + { + {"ctrl23_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"ctrl23_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"ctrl23_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"ctrl23_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"ctrl23_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"ctrl23_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"ctrl23_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"ctrl23_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"ctrl23_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"ctrl23_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"ctrl23_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"ctrl23_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"ctrl23_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"ctrl23_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"ctrl23_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"ctrl23_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"ctrl22_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"ctrl22_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"ctrl22_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"ctrl22_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"ctrl22_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"ctrl22_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"ctrl22_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"ctrl22_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"ctrl22_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"ctrl22_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"ctrl22_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"ctrl22_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"ctrl22_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"ctrl22_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"ctrl22_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"ctrl22_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl24_arbiter_ecc_bypass_reg[] = + { + {"ctrl25_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"ctrl25_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"ctrl25_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"ctrl25_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"ctrl25_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"ctrl25_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"ctrl25_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"ctrl25_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"ctrl25_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"ctrl25_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"ctrl25_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"ctrl25_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"ctrl25_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"ctrl25_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"ctrl25_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"ctrl25_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"ctrl24_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"ctrl24_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"ctrl24_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"ctrl24_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"ctrl24_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"ctrl24_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"ctrl24_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"ctrl24_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"ctrl24_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"ctrl24_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"ctrl24_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"ctrl24_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"ctrl24_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"ctrl24_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"ctrl24_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"ctrl24_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl26_arbiter_ecc_bypass_reg[] = + { + {"ctrl27_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"ctrl27_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"ctrl27_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"ctrl27_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"ctrl27_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"ctrl27_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"ctrl27_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"ctrl27_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"ctrl27_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"ctrl27_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"ctrl27_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"ctrl27_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"ctrl27_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"ctrl27_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"ctrl27_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"ctrl27_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"ctrl26_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"ctrl26_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"ctrl26_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"ctrl26_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"ctrl26_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"ctrl26_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"ctrl26_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"ctrl26_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"ctrl26_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"ctrl26_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"ctrl26_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"ctrl26_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"ctrl26_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"ctrl26_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"ctrl26_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"ctrl26_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl28_arbiter_ecc_bypass_reg[] = + { + {"ctrl29_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"ctrl29_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"ctrl29_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"ctrl29_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"ctrl29_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"ctrl29_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"ctrl29_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"ctrl29_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"ctrl29_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"ctrl29_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"ctrl29_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"ctrl29_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"ctrl29_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"ctrl29_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"ctrl29_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"ctrl29_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"ctrl28_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"ctrl28_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"ctrl28_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"ctrl28_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"ctrl28_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"ctrl28_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"ctrl28_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"ctrl28_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"ctrl28_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"ctrl28_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"ctrl28_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"ctrl28_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"ctrl28_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"ctrl28_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"ctrl28_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"ctrl28_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl30_arbiter_ecc_bypass_reg[] = + { + {"ctrl31_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 31, 1, 0x1, 0x0}, + {"ctrl31_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 30, 1, 0x1, 0x0}, + {"ctrl31_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 29, 1, 0x1, 0x0}, + {"ctrl31_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 28, 1, 0x1, 0x0}, + {"ctrl31_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 27, 1, 0x1, 0x0}, + {"ctrl31_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 26, 1, 0x1, 0x0}, + {"ctrl31_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 25, 1, 0x1, 0x0}, + {"ctrl31_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 24, 1, 0x1, 0x0}, + {"ctrl31_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 23, 1, 0x1, 0x0}, + {"ctrl31_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 22, 1, 0x1, 0x0}, + {"ctrl31_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 21, 1, 0x1, 0x0}, + {"ctrl31_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 20, 1, 0x1, 0x0}, + {"ctrl31_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 19, 1, 0x1, 0x0}, + {"ctrl31_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 18, 1, 0x1, 0x0}, + {"ctrl31_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 17, 1, 0x1, 0x0}, + {"ctrl31_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 16, 1, 0x1, 0x0}, + {"ctrl30_arbiter_ecc_bypass_15", DPP_FIELD_FLAG_RC, 15, 1, 0x1, 0x0}, + {"ctrl30_arbiter_ecc_bypass_14", DPP_FIELD_FLAG_RC, 14, 1, 0x1, 0x0}, + {"ctrl30_arbiter_ecc_bypass_13", DPP_FIELD_FLAG_RC, 13, 1, 0x1, 0x0}, + {"ctrl30_arbiter_ecc_bypass_12", DPP_FIELD_FLAG_RC, 12, 1, 0x1, 0x0}, + {"ctrl30_arbiter_ecc_bypass_11", DPP_FIELD_FLAG_RC, 11, 1, 0x1, 0x0}, + {"ctrl30_arbiter_ecc_bypass_10", DPP_FIELD_FLAG_RC, 10, 1, 0x1, 0x0}, + {"ctrl30_arbiter_ecc_bypass_9", DPP_FIELD_FLAG_RC, 9, 1, 0x1, 0x0}, + {"ctrl30_arbiter_ecc_bypass_8", DPP_FIELD_FLAG_RC, 8, 1, 0x1, 0x0}, + {"ctrl30_arbiter_ecc_bypass_7", DPP_FIELD_FLAG_RC, 7, 1, 0x1, 0x0}, + {"ctrl30_arbiter_ecc_bypass_6", DPP_FIELD_FLAG_RC, 6, 1, 0x1, 0x0}, + {"ctrl30_arbiter_ecc_bypass_5", DPP_FIELD_FLAG_RC, 5, 1, 0x1, 0x0}, + {"ctrl30_arbiter_ecc_bypass_4", DPP_FIELD_FLAG_RC, 4, 1, 0x1, 0x0}, + {"ctrl30_arbiter_ecc_bypass_3", DPP_FIELD_FLAG_RC, 3, 1, 0x1, 0x0}, + {"ctrl30_arbiter_ecc_bypass_2", DPP_FIELD_FLAG_RC, 2, 1, 0x1, 0x0}, + {"ctrl30_arbiter_ecc_bypass_1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"ctrl30_arbiter_ecc_bypass_0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl_req_ecc_bypass_reg[] = + { + {"ctrl_req_ecc_bypass_0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl_info_ecc_bypass_reg[] = + { + {"ctrl_info_ecc_bypass_0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_rschd_ecc_bypass_reg[] = + { + {"smmu0_rschd_ecc_bypass_0_31", DPP_FIELD_FLAG_RC, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_wr_ecc_bypass_reg[] = + { + {"smmu0_wr_ecc_bypass1", DPP_FIELD_FLAG_RC, 1, 1, 0x1, 0x0}, + {"smmu0_wr_ecc_bypass0", DPP_FIELD_FLAG_RC, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl0_arbiter_ecc_err_reg[] = + { + {"ctrl0_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl0_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl1_arbiter_ecc_err_reg[] = + { + {"ctrl1_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl1_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl2_arbiter_ecc_err_reg[] = + { + {"ctrl2_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl2_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl3_arbiter_ecc_err_reg[] = + { + {"ctrl3_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl3_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl4_arbiter_ecc_err_reg[] = + { + {"ctrl4_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl4_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl5_arbiter_ecc_err_reg[] = + { + {"ctrl5_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl5_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl6_arbiter_ecc_err_reg[] = + { + {"ctrl6_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl6_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl7_arbiter_ecc_err_reg[] = + { + {"ctrl7_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl7_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl8_arbiter_ecc_err_reg[] = + { + {"ctrl8_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl8_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl9_arbiter_ecc_err_reg[] = + { + {"ctrl9_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl9_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl10_arbiter_ecc_err_reg[] = + { + {"ctrl10_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl10_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl11_arbiter_ecc_err_reg[] = + { + {"ctrl11_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl11_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl12_arbiter_ecc_err_reg[] = + { + {"ctrl12_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl12_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl13_arbiter_ecc_err_reg[] = + { + {"ctrl13_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl13_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl14_arbiter_ecc_err_reg[] = + { + {"ctrl14_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl14_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl15_arbiter_ecc_err_reg[] = + { + {"ctrl15_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl15_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl16_arbiter_ecc_err_reg[] = + { + {"ctrl16_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl16_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl17_arbiter_ecc_err_reg[] = + { + {"ctrl17_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl17_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl18_arbiter_ecc_err_reg[] = + { + {"ctrl18_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl18_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl19_arbiter_ecc_err_reg[] = + { + {"ctrl19_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl19_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl20_arbiter_ecc_err_reg[] = + { + {"ctrl20_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl20_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl21_arbiter_ecc_err_reg[] = + { + {"ctrl21_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl21_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl22_arbiter_ecc_err_reg[] = + { + {"ctrl22_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl22_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl23_arbiter_ecc_err_reg[] = + { + {"ctrl23_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl23_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl24_arbiter_ecc_err_reg[] = + { + {"ctrl24_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl24_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl25_arbiter_ecc_err_reg[] = + { + {"ctrl25_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl25_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl26_arbiter_ecc_err_reg[] = + { + {"ctrl26_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl26_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl27_arbiter_ecc_err_reg[] = + { + {"ctrl27_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl27_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl28_arbiter_ecc_err_reg[] = + { + {"ctrl28_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl28_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl29_arbiter_ecc_err_reg[] = + { + {"ctrl29_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl29_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl30_arbiter_ecc_err_reg[] = + { + {"ctrl30_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl30_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl31_arbiter_ecc_err_reg[] = + { + {"ctrl31_arbiter_ecc_err_31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"ctrl31_arbiter_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl_req_ecc_single_err_reg[] = + { + {"ctrl_req_ecc_single_err_0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl_req_ecc_double_err_reg[] = + { + {"ctrl_req_ecc_double_err_0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl_info_ecc_single_err_reg[] = + { + {"ctrl_info_ecc_single_err_0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl_info_ecc_double_err_reg[] = + { + {"ctrl_info_ecc_double_err_0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_wr_ecc_err_reg[] = + { + {"smmu0_wr_ecc_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"smmu0_wr_ecc_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"smmu0_wr_ecc_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"smmu0_wr_ecc_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_rschd_ecc_single_err_reg[] = + { + {"smmu0_rschd_ecc_single_err_0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_rschd_ecc_double_err_reg[] = + { + {"smmu0_rschd_ecc_double_err_0_31", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ord_fifo_empty_reg[] = + { + {"ord_fifo_empty", DPP_FIELD_FLAG_RO, 4, 5, 0x1f, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_wr_arb_fifo_empty_reg[] = + { + {"wr_arb_fifo_empty", DPP_FIELD_FLAG_RO, 3, 4, 0xf, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl_fifo_empty0_reg[] = + { + {"ctrl_fifo_empty0_5", DPP_FIELD_FLAG_RO, 29, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty0_4", DPP_FIELD_FLAG_RO, 24, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty0_3", DPP_FIELD_FLAG_RO, 19, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty0_2", DPP_FIELD_FLAG_RO, 14, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty0_1", DPP_FIELD_FLAG_RO, 9, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty0_0", DPP_FIELD_FLAG_RO, 4, 5, 0x1f, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl_fifo_empty1_reg[] = + { + {"ctrl_fifo_empty1_5", DPP_FIELD_FLAG_RO, 29, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty1_4", DPP_FIELD_FLAG_RO, 24, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty1_3", DPP_FIELD_FLAG_RO, 19, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty1_2", DPP_FIELD_FLAG_RO, 14, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty1_1", DPP_FIELD_FLAG_RO, 9, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty1_0", DPP_FIELD_FLAG_RO, 4, 5, 0x1f, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl_fifo_empty2_reg[] = + { + {"ctrl_fifo_empty2_5", DPP_FIELD_FLAG_RO, 29, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty2_4", DPP_FIELD_FLAG_RO, 24, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty2_3", DPP_FIELD_FLAG_RO, 19, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty2_2", DPP_FIELD_FLAG_RO, 14, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty2_1", DPP_FIELD_FLAG_RO, 9, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty2_0", DPP_FIELD_FLAG_RO, 4, 5, 0x1f, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl_fifo_empty3_reg[] = + { + {"ctrl_fifo_empty3_5", DPP_FIELD_FLAG_RO, 29, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty3_4", DPP_FIELD_FLAG_RO, 24, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty3_3", DPP_FIELD_FLAG_RO, 19, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty3_2", DPP_FIELD_FLAG_RO, 14, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty3_1", DPP_FIELD_FLAG_RO, 9, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty3_0", DPP_FIELD_FLAG_RO, 4, 5, 0x1f, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl_fifo_empty4_reg[] = + { + {"ctrl_fifo_empty4_5", DPP_FIELD_FLAG_RO, 29, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty4_4", DPP_FIELD_FLAG_RO, 24, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty4_3", DPP_FIELD_FLAG_RO, 19, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty4_2", DPP_FIELD_FLAG_RO, 14, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty4_1", DPP_FIELD_FLAG_RO, 9, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty4_0", DPP_FIELD_FLAG_RO, 4, 5, 0x1f, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ctrl_fifo_empty5_reg[] = + { + {"ctrl_fifo_empty5_1", DPP_FIELD_FLAG_RO, 9, 5, 0x1f, 0x0}, + {"ctrl_fifo_empty5_0", DPP_FIELD_FLAG_RO, 4, 5, 0x1f, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty0_reg[] = + { + {"kschd_fifo_empty0", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty1_reg[] = + { + {"kschd_fifo_empty1", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty2_reg[] = + { + {"kschd_fifo_empty2", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty3_reg[] = + { + {"kschd_fifo_empty3", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty4_reg[] = + { + {"kschd_fifo_empty4", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty5_reg[] = + { + {"kschd_fifo_empty5", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty6_reg[] = + { + {"kschd_fifo_empty6", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty7_reg[] = + { + {"kschd_fifo_empty7", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty8_reg[] = + { + {"kschd_fifo_empty8", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty9_reg[] = + { + {"kschd_fifo_empty9", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty10_reg[] = + { + {"kschd_fifo_empty10", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty11_reg[] = + { + {"kschd_fifo_empty11", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty12_reg[] = + { + {"kschd_fifo_empty12", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty13_reg[] = + { + {"kschd_fifo_empty13", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty14_reg[] = + { + {"kschd_fifo_empty14", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty15_reg[] = + { + {"kschd_fifo_empty15", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty16_reg[] = + { + {"kschd_fifo_empty16", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty17_reg[] = + { + {"kschd_fifo_empty17", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty18_reg[] = + { + {"kschd_fifo_empty18", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty19_reg[] = + { + {"kschd_fifo_empty19", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty20_reg[] = + { + {"kschd_fifo_empty20", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty21_reg[] = + { + {"kschd_fifo_empty21", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty22_reg[] = + { + {"kschd_fifo_empty22", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty23_reg[] = + { + {"kschd_fifo_empty23", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty24_reg[] = + { + {"kschd_fifo_empty24", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty25_reg[] = + { + {"kschd_fifo_empty25", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty26_reg[] = + { + {"kschd_fifo_empty26", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty27_reg[] = + { + {"kschd_fifo_empty27", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty28_reg[] = + { + {"kschd_fifo_empty28", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty29_reg[] = + { + {"kschd_fifo_empty29", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty30_reg[] = + { + {"kschd_fifo_empty30", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_kschd_fifo_empty31_reg[] = + { + {"kschd_fifo_empty31", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty0_reg[] = + { + {"rschd_fifo_empty0", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty1_reg[] = + { + {"rschd_fifo_empty1", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty2_reg[] = + { + {"rschd_fifo_empty2", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty3_reg[] = + { + {"rschd_fifo_empty3", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty4_reg[] = + { + {"rschd_fifo_empty4", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty5_reg[] = + { + {"rschd_fifo_empty5", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty6_reg[] = + { + {"rschd_fifo_empty6", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty7_reg[] = + { + {"rschd_fifo_empty7", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty8_reg[] = + { + {"rschd_fifo_empty8", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty9_reg[] = + { + {"rschd_fifo_empty9", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty10_reg[] = + { + {"rschd_fifo_empty10", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty11_reg[] = + { + {"rschd_fifo_empty11", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty12_reg[] = + { + {"rschd_fifo_empty12", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty13_reg[] = + { + {"rschd_fifo_empty13", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty14_reg[] = + { + {"rschd_fifo_empty14", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty15_reg[] = + { + {"rschd_fifo_empty15", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty16_reg[] = + { + {"rschd_fifo_empty16", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty17_reg[] = + { + {"rschd_fifo_empty17", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty18_reg[] = + { + {"rschd_fifo_empty18", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty19_reg[] = + { + {"rschd_fifo_empty19", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty20_reg[] = + { + {"rschd_fifo_empty20", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty21_reg[] = + { + {"rschd_fifo_empty21", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty22_reg[] = + { + {"rschd_fifo_empty22", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty23_reg[] = + { + {"rschd_fifo_empty23", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty24_reg[] = + { + {"rschd_fifo_empty24", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty25_reg[] = + { + {"rschd_fifo_empty25", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty26_reg[] = + { + {"rschd_fifo_empty26", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty27_reg[] = + { + {"rschd_fifo_empty27", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty28_reg[] = + { + {"rschd_fifo_empty28", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty29_reg[] = + { + {"rschd_fifo_empty29", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty30_reg[] = + { + {"rschd_fifo_empty30", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_rschd_fifo_empty31_reg[] = + { + {"rschd_fifo_empty31", DPP_FIELD_FLAG_RO, 14, 15, 0x7ffe, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ept_flag_reg[] = + { + {"ept_flag8", DPP_FIELD_FLAG_RO, 8, 1, 0x1, 0x0}, + {"ept_flag7", DPP_FIELD_FLAG_RO, 7, 1, 0x1, 0x0}, + {"ept_flag6", DPP_FIELD_FLAG_RO, 6, 1, 0x1, 0x0}, + {"ept_flag5", DPP_FIELD_FLAG_RO, 5, 1, 0x1, 0x0}, + {"ept_flag4", DPP_FIELD_FLAG_RO, 4, 1, 0x1, 0x0}, + {"ept_flag3", DPP_FIELD_FLAG_RO, 3, 1, 0x1, 0x0}, + {"ept_flag2", DPP_FIELD_FLAG_RO, 2, 1, 0x1, 0x0}, + {"ept_flag1", DPP_FIELD_FLAG_RO, 1, 1, 0x1, 0x0}, + {"ept_flag0", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ppu_soft_rst_reg[] = + { + {"ppu_soft_rst", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_as_mac_age_fc_cnt_reg[] = + { + {"smmu0_as_mac_age_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_marc_se_parser_fc_cnt_reg[] = + { + {"smmu0_marc_se_parser_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_wr_arb_cpu_fc_cnt_reg[] = + { + {"wr_arb_cpu_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_lpm_as_fc_cnt_reg[] = + { + {"smmu0_lpm_as_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_lpm_as_smmu0_fc_cnt_reg[] = + { + {"lpm_as_smmu0_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_etcam1_0_as_fc_cnt_reg[] = + { + {"smmu0_etcam1_0_as_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_as_etcam1_0_smmu0_fc_cnt_reg[] = + { + {"as_etcam1_0_smmu0_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_ppu_mcast_fc_cnt_reg[] = + { + {"smmu0_ppu_mcast_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ppu_smmu0_mcast_fc_cnt_reg[] = + { + {"ppu_smmu0_mcast_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_odma_smmu0_tdm_fc_rsp_fc_cnt_reg[] = + { + {"odma_smmu0_tdm_fc_rsp_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_odma_tdm_fc_key_fc_cnt_reg[] = + { + {"smmu0_odma_tdm_fc_key_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_odma_fc_cnt_reg[] = + { + {"smmu0_odma_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_cfg_tab_rd_fc_cnt_reg[] = + { + {"smmu0_cfg_tab_rd_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_stat_fc15_0_cnt_reg[] = + { + {"smmu0_stat_fc15_0_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_stat_smmu0_fc15_0_cnt_reg[] = + { + {"stat_smmu0_fc15_0_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_ppu_mex5_0_fc_cnt_reg[] = + { + {"smmu0_ppu_mex5_0_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ppu_smmu0_mex5_0_fc_cnt_reg[] = + { + {"ppu_smmu0_mex5_0_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_as_smmu0_mac_age_req_cnt_reg[] = + { + {"as_smmu0_mac_age_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_se_parser_smmu0_marc_key_cnt_reg[] = + { + {"se_parser_smmu0_marc_key_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cpu_ind_rdat_cnt_reg[] = + { + {"cpu_ind_rdat_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cpu_ind_rd_req_cnt_reg[] = + { + {"cpu_ind_rd_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cpu_ind_wr_req_cnt_reg[] = + { + {"cpu_ind_wr_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_plcr_rsp0_cnt_reg[] = + { + {"smmu0_plcr_rsp0_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_plcr_smmu0_req0_cnt_reg[] = + { + {"plcr_smmu0_req0_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_lpm_as_rsp_cnt_reg[] = + { + {"smmu0_lpm_as_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_lpm_as_smmu0_req_cnt_reg[] = + { + {"lpm_as_smmu0_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_etcam1_0_as_rsp_cnt_reg[] = + { + {"smmu0_etcam1_0_as_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_etcam1_0_as_smmu0_req_cnt_reg[] = + { + {"etcam1_0_as_smmu0_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_ppu_mcast_rsp_cnt_reg[] = + { + {"smmu0_ppu_mcast_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ppu_smmu0_mcast_key_cnt_reg[] = + { + {"ppu_smmu0_mcast_key_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_odma_tdm_mc_rsp_cnt_reg[] = + { + {"smmu0_odma_tdm_mc_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_odma_smmu0_tdm_mc_key_cnt_reg[] = + { + {"odma_smmu0_tdm_mc_key_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_odma_rsp_cnt_reg[] = + { + {"smmu0_odma_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_odma_smmu0_cmd_cnt_reg[] = + { + {"odma_smmu0_cmd_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_cfg_tab_rdat_cnt_reg[] = + { + {"smmu0_cfg_tab_rdat_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_cfg_smmu0_tab_rd_cnt_reg[] = + { + {"cfg_smmu0_tab_rd_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_stat_rsp15_0_cnt_reg[] = + { + {"smmu0_stat_rsp15_0_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_stat_smmu0_req15_0_cnt_reg[] = + { + {"stat_smmu0_req15_0_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_smmu0_ppu_mex5_0_rsp_cnt_reg[] = + { + {"smmu0_ppu_mex5_0_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ppu_smmu0_mex5_0_key_cnt_reg[] = + { + {"ppu_smmu0_mex5_0_key_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ftm_stat_smmu0_req0_cnt_reg[] = + { + {"ftm_stat_smmu0_req0_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_ftm_stat_smmu0_req1_cnt_reg[] = + { + {"ftm_stat_smmu0_req1_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_etm_stat_smmu0_req0_cnt_reg[] = + { + {"etm_stat_smmu0_req0_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_etm_stat_smmu0_req1_cnt_reg[] = + { + {"etm_stat_smmu0_req1_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_req_eram0_31_rd_cnt_reg[] = + { + {"req_eram0_31_rd_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu0_smmu0_req_eram0_31_wr_cnt_reg[] = + { + {"req_eram0_31_wr_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ddr_wdat1_reg[] = + { + {"ddr_wdat1", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ddr_wdat2_reg[] = + { + {"ddr_wdat2", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ddr_wdat3_reg[] = + { + {"ddr_wdat3", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ddr_wdat4_reg[] = + { + {"ddr_wdat4", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ddr_wdat5_reg[] = + { + {"ddr_wdat5", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ddr_wdat6_reg[] = + { + {"ddr_wdat6", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ddr_wdat7_reg[] = + { + {"ddr_wdat7", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ddr_wdat8_reg[] = + { + {"ddr_wdat8", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ddr_wdat9_reg[] = + { + {"ddr_wdat9", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ddr_wdat10_reg[] = + { + {"ddr_wdat10", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ddr_wdat11_reg[] = + { + {"ddr_wdat11", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ddr_wdat12_reg[] = + { + {"ddr_wdat12", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ddr_wdat13_reg[] = + { + {"ddr_wdat13", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ddr_wdat14_reg[] = + { + {"ddr_wdat14", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ddr_wdat15_reg[] = + { + {"ddr_wdat15", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cnt_stat_cache_en_reg[] = + { + {"cnt_stat_cache_en", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cnt_stat_cache_clr_reg[] = + { + {"cnt_stat_cache_clr", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cnt_stat_cache_req_63_32_reg[] = + { + {"cnt_stat_cache_req_63_32", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cnt_stat_cache_req_31_0_reg[] = + { + {"cnt_stat_cache_req_31_0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cnt_stat_cache_hit_63_32_reg[] = + { + {"cnt_stat_cache_hit_63_32", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cnt_stat_cache_hit_31_0_reg[] = + { + {"cnt_stat_cache_hit_31_0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ddr_cmd0_reg[] = + { + {"ecc_en", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"rw_len", DPP_FIELD_FLAG_RW, 21, 2, 0x0, 0x0}, + {"baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_info_addr_reg[] = + { + {"info_addr", DPP_FIELD_FLAG_RW, 5, 6, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ddr_cmd1_reg[] = + { + {"rw_flag", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + {"rw_addr", DPP_FIELD_FLAG_RW, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_clr_start_addr_reg[] = + { + {"clr_start_addr", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_clr_end_addr_reg[] = + { + {"clr_end_addr", DPP_FIELD_FLAG_RW, 31, 32, 0xffffff, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_clr_tbl_en_reg[] = + { + {"cfg_init_en", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"clr_tbl_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_debug_cnt_mode_reg[] = + { + {"cnt_rd_mode", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"cnt_overflow_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_init_done_reg[] = + { + {"cache_init_done", DPP_FIELD_FLAG_RO, 7, 1, 0x0, 0x0}, + {"clr_done", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"init_ok", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cpu_rsp_rd_done_reg[] = + { + {"cpu_rsp_rd_done", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ksch_oam_sp_en_reg[] = + { + {"ksch_oam_sp_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cfg_cache_en_reg[] = + { + {"cfg_cache_en", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cache_age_en_reg[] = + { + {"cache_age_en", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cpu_rdat0_reg[] = + { + {"cpu_rdat0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cpu_rdat1_reg[] = + { + {"cpu_rdat1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cpu_rdat2_reg[] = + { + {"cpu_rdat2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cpu_rdat3_reg[] = + { + {"cpu_rdat3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cpu_rdat4_reg[] = + { + {"cpu_rdat4", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cpu_rdat5_reg[] = + { + {"cpu_rdat5", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cpu_rdat6_reg[] = + { + {"cpu_rdat6", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cpu_rdat7_reg[] = + { + {"cpu_rdat7", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cpu_rdat8_reg[] = + { + {"cpu_rdat8", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cpu_rdat9_reg[] = + { + {"cpu_rdat9", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cpu_rdat10_reg[] = + { + {"cpu_rdat10", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cpu_rdat11_reg[] = + { + {"cpu_rdat11", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cpu_rdat12_reg[] = + { + {"cpu_rdat12", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cpu_rdat13_reg[] = + { + {"cpu_rdat13", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cpu_rdat14_reg[] = + { + {"cpu_rdat14", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cpu_rdat15_reg[] = + { + {"cpu_rdat15", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ctrl_cpu_rd_rdy_reg[] = + { + {"ctrl_cpu_rd_rdy", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cpu_warbi_rdy_cfg_reg[] = + { + {"cpu_warbi_rdy_cfg", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_dir_arbi_cpu_rpful_reg[] = + { + {"smmu1_cfg_rpful", DPP_FIELD_FLAG_RW, 15, 8, 0x44, 0x0}, + {"smmu1_cfg_wpful", DPP_FIELD_FLAG_RW, 7, 8, 0x44, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_dir_arbi_wpful_reg[] = + { + {"smmu1_ser_wdir_pful", DPP_FIELD_FLAG_RW, 17, 10, 0x14a, 0x0}, + {"smmu1_cfg_wdir_pful", DPP_FIELD_FLAG_RW, 7, 8, 0x22, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cfg_wr_arbi_pful0_reg[] = + { + {"arbi_out_pful", DPP_FIELD_FLAG_RW, 17, 12, 0x71c, 0x0}, + {"cpu_wr_pful", DPP_FIELD_FLAG_RW, 5, 6, 0x22, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cfg_wr_arbi_pful1_reg[] = + { + {"tm_wr_pful", DPP_FIELD_FLAG_RW, 23, 12, 0x4d3, 0x0}, + {"stat_wr_pful", DPP_FIELD_FLAG_RW, 11, 12, 0x555, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_wdone_pful_cfg_reg[] = + { + {"smmu1_wdone_pful_cfg", DPP_FIELD_FLAG_RW, 19, 20, 0x7e1f8, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_stat_rate_cfg_cnt_reg[] = + { + {"stat_rate_cfg_cnt", DPP_FIELD_FLAG_RW, 9, 10, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ftm_rate_cfg_cnt_reg[] = + { + {"ftm_rate_cfg_cnt", DPP_FIELD_FLAG_RW, 9, 10, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_etm_rate_cfg_cnt_reg[] = + { + {"etm_rate_cfg_cnt", DPP_FIELD_FLAG_RW, 9, 10, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_dir_rate_cfg_cnt_reg[] = + { + {"dir_rate_cfg_cnt", DPP_FIELD_FLAG_RW, 9, 10, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_hash_rate_cfg_cnt_reg[] = + { + {"hash_rate_cfg_cnt", DPP_FIELD_FLAG_RW, 9, 10, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ftm_tbl_cfg_reg[] = + { + {"ftm_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_lpm_v4_as_tbl_cfg_reg[] = + { + {"lpm_v4_as_rsp_len", DPP_FIELD_FLAG_RW, 22, 2, 0x0, 0x0}, + {"lpm_v4_as_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"lpm_v4_as_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_lpm_v4_tbl_cfg_reg[] = + { + {"lpm_v4_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"lpm_v4_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"lpm_v4_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_lpm_v6_tbl_cfg_reg[] = + { + {"lpm_v6_len", DPP_FIELD_FLAG_RO, 22, 2, 0x2, 0x0}, + {"lpm_v6_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"lpm_v6_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_lpm_v6_as_tbl_cfg_reg[] = + { + {"lpm_v6_as_rsp_len", DPP_FIELD_FLAG_RW, 22, 2, 0x0, 0x0}, + {"lpm_v6_as_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"lpm_v6_as_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_dma_tbl_cfg_reg[] = + { + {"dma_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_oam_tbl_cfg_reg[] = + { + {"oam_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ctrl_rpar_cpu_pful_reg[] = + { + {"ctrl_rpar_cpu_pful", DPP_FIELD_FLAG_RW, 7, 8, 0x44, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cfg_ksch_dir_pful_reg[] = + { + {"cfg_ksch_dir_pful", DPP_FIELD_FLAG_RW, 15, 16, 0x3434, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cfg_ksch_hash_pful_reg[] = + { + {"cfg_ksch_hash_pful", DPP_FIELD_FLAG_RW, 15, 16, 0x3030, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cfg_ksch_lpm_pful_reg[] = + { + {"cfg_ksch_lpm_pful", DPP_FIELD_FLAG_RW, 15, 16, 0x3030, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cfg_ksch_lpm_as_pful_reg[] = + { + {"cfg_ksch_lpm_as_pful", DPP_FIELD_FLAG_RW, 15, 16, 0x3030, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cfg_ksch_stat_pful_reg[] = + { + {"cfg_ksch_stat_pful", DPP_FIELD_FLAG_RW, 15, 16, 0x3434, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cfg_ksch_tm_pful_reg[] = + { + {"cfg_ksch_tm_pful", DPP_FIELD_FLAG_RW, 15, 16, 0x3232, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cfg_ksch_oam_pful_reg[] = + { + {"cfg_ksch_oam_pful", DPP_FIELD_FLAG_RW, 15, 16, 0x2a2a, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cfg_ksch_dma_pful_reg[] = + { + {"cfg_ksch_dma_pful", DPP_FIELD_FLAG_RW, 15, 16, 0x2727, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ctrl_wfifo_cfg_reg[] = + { + {"ctrl_wfifo_cfg", DPP_FIELD_FLAG_RW, 9, 10, 0x18c, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_rsch_hash_ptr_cfg_reg[] = + { + {"rsch_hash_ptr_cfg", DPP_FIELD_FLAG_RW, 8, 9, 0xe, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_rsch_lpm_ptr_cfg_reg[] = + { + {"rsch_lpm_ptr_cfg", DPP_FIELD_FLAG_RW, 8, 9, 0xe, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_rsch_lpm_as_ptr_cfg_reg[] = + { + {"rsch_lpm_as_ptr_cfg", DPP_FIELD_FLAG_RW, 8, 9, 0xe, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_rsch_stat_ptr_cfg_reg[] = + { + {"rsch_stat_ptr_cfg", DPP_FIELD_FLAG_RW, 8, 9, 0xe, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_rsch_oam_ptr_cfg_reg[] = + { + {"rsch_oam_ptr_cfg", DPP_FIELD_FLAG_RW, 8, 9, 0x12, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_rschd_fifo_pept_cfg_reg[] = + { + {"rschd_fifo_pept_cfg", DPP_FIELD_FLAG_RW, 13, 14, 0x204, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_dir_fifo_pful_cfg_reg[] = + { + {"dir_fifo_pful_cfg", DPP_FIELD_FLAG_RW, 13, 14, 0x1e3c, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_hash_fifo_pful_cfg_reg[] = + { + {"hash_fifo_pful_cfg", DPP_FIELD_FLAG_RW, 13, 14, 0x1e3c, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_lpm_fifo_pful_cfg_reg[] = + { + {"lpm_fifo_pful_cfg", DPP_FIELD_FLAG_RW, 13, 14, 0x1e3c, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_lpm_as_fifo_pful_cfg_reg[] = + { + {"lpm_as_fifo_pful_cfg", DPP_FIELD_FLAG_RW, 13, 14, 0x1e3c, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_stat_fifo_pful_cfg_reg[] = + { + {"stat_fifo_pful_cfg", DPP_FIELD_FLAG_RW, 13, 14, 0x1e3c, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ftm_fifo_pful_cfg_reg[] = + { + {"ftm_fifo_pful_cfg", DPP_FIELD_FLAG_RW, 13, 14, 0x1e3c, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_etm_fifo_pful_cfg_reg[] = + { + {"etm_fifo_pful_cfg", DPP_FIELD_FLAG_RW, 13, 14, 0x1e3c, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_oam_fifo_pful_cfg_reg[] = + { + {"oam_fifo_pful_cfg", DPP_FIELD_FLAG_RW, 13, 14, 0x1e3c, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_dma_fifo_pful_cfg_reg[] = + { + {"dma_fifo_pful_cfg", DPP_FIELD_FLAG_RW, 13, 14, 0x1e3c, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cache_rsp_rr_fifo_cfg_reg[] = + { + {"rr_pfull_assert0", DPP_FIELD_FLAG_RW, 11, 6, 0x14, 0x0}, + {"rr_pfull_negate0", DPP_FIELD_FLAG_RW, 5, 6, 0x14, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ddr_rsp_rr_fifo_cfg_reg[] = + { + {"rr_pfull_assert1", DPP_FIELD_FLAG_RW, 13, 7, 0x20, 0x0}, + {"rr_pfull_negate1", DPP_FIELD_FLAG_RW, 6, 7, 0x20, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cpu_cahce_fifo_cfg_reg[] = + { + {"smmu1_cahce_fwft_fifo_pfull_assert", DPP_FIELD_FLAG_RW, 7, 4, 0x6, 0x0}, + {"smmu1_cahce_fwft_fifo_pfull_negate", DPP_FIELD_FLAG_RW, 3, 4, 0x6, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cache_rsp_fifo_cfg_reg[] = + { + {"rschd_fifo_pfull_assert", DPP_FIELD_FLAG_RW, 11, 6, 0x10, 0x0}, + {"rschd_fifo_pfull_negate", DPP_FIELD_FLAG_RW, 5, 6, 0x10, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_test_state_reg[] = + { + {"test_state", DPP_FIELD_FLAG_RW, 31, 32, 0x11111111, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cache_fifo_ept_reg[] = + { + {"cache_fifo_ept", DPP_FIELD_FLAG_RO, 1, 2, 0x3, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_rr_fifo_ept_reg[] = + { + {"rr_fifo_ept", DPP_FIELD_FLAG_RO, 1, 2, 0x3, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_wr_fifo_ept_reg[] = + { + {"dir_arbi_ept", DPP_FIELD_FLAG_RO, 6, 7, 0x7f, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_wdone_fifo_ept_reg[] = + { + {"wdone_fifo_ept", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_kschd_fifo_ept0_reg[] = + { + {"kschd_fifo_ept0", DPP_FIELD_FLAG_RO, 14, 15, 0x7fff, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cash_fifo_ept_reg[] = + { + {"cash_fifo_ept", DPP_FIELD_FLAG_RO, 1, 2, 0x3, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ctrl_fifo_ept_reg[] = + { + {"ctrl_fifo_ept", DPP_FIELD_FLAG_RO, 2, 3, 0x7, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_rschd_ept3_reg[] = + { + {"rschd_fifo_ept3", DPP_FIELD_FLAG_RO, 31, 32, 0xffffff, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_rschd_ept2_reg[] = + { + {"rschd_fifo_ept2", DPP_FIELD_FLAG_RO, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_rschd_ept1_reg[] = + { + {"rschd_fifo_ept1", DPP_FIELD_FLAG_RO, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_rschd_ept0_reg[] = + { + {"rschd_fifo_ept0", DPP_FIELD_FLAG_RO, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cash0_ecc_err_addr_reg[] = + { + {"cash0_ecc_err_addr", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_arbi_cpu_wr_rdy_reg[] = + { + {"arbi_cpu_wr_rdy", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_int_0_en_reg[] = + { + {"smmu1_int_0_en", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_int_0_mask_reg[] = + { + {"smmu1_int_0_mask", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_int_1_en_reg[] = + { + {"smmu1_int_1_en", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_int_1_mask_reg[] = + { + {"smmu1_int_1_mask", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_int_2_en_reg[] = + { + {"smmu1_int_2_en", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_int_2_mask_reg[] = + { + {"smmu1_int_2_mask", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_int_3_en_reg[] = + { + {"smmu1_int_3_en", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_int_3_mask_reg[] = + { + {"smmu1_int_3_mask", DPP_FIELD_FLAG_RW, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_int_0_status_reg[] = + { + {"smmu1_int_0_status", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_int_1_status_reg[] = + { + {"smmu1_int_1_status", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_int_2_status_reg[] = + { + {"smmu1_int_2_status", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_int_3_status_reg[] = + { + {"smmu1_int_3_status", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_int_status_reg[] = + { + {"smmu1_int_status", DPP_FIELD_FLAG_RO, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ctrl_to_cash7_0_fc_cnt_reg[] = + { + {"ctrl_to_cash7_0_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cash7_0_to_ctrl_req_cnt_reg[] = + { + {"cash7_0_to_ctrl_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_rschd_to_cache7_fc_cnt_reg[] = + { + {"rschd_to_cache7_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cash7_to_cache_rsp_cnt_reg[] = + { + {"cash7_to_cache_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cash7_to_ctrl_fc_cnt_reg[] = + { + {"cash7_to_ctrl_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ctrl_to_cash7_0_rsp_cnt_reg[] = + { + {"ctrl_to_cash7_0_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_kschd_to_cache7_0_req_cnt_reg[] = + { + {"kschd_to_cache7_0_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cache7_0_to_kschd_fc_cnt_reg[] = + { + {"cache7_0_to_kschd_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_dma_to_smmu1_rd_req_cnt_reg[] = + { + {"dma_to_smmu1_rd_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_oam_to_kschd_req_cnt_reg[] = + { + {"oam_to_kschd_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_oam_rr_state_rsp_cnt_reg[] = + { + {"oam_rr_state_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_oam_clash_info_cnt_reg[] = + { + {"oam_clash_info_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_oam_to_rr_req_cnt_reg[] = + { + {"oam_to_rr_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_lpm_as_to_kschd_req_cnt_reg[] = + { + {"lpm_as_to_kschd_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_lpm_as_rr_state_rsp_cnt_reg[] = + { + {"lpm_as_rr_state_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_lpm_as_clash_info_cnt_reg[] = + { + {"lpm_as_clash_info_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_lpm_as_to_rr_req_cnt_reg[] = + { + {"lpm_as_to_rr_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_lpm_to_kschd_req_cnt_reg[] = + { + {"lpm_to_kschd_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_lpm_rr_state_rsp_cnt_reg[] = + { + {"lpm_rr_state_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_lpm_clash_info_cnt_reg[] = + { + {"lpm_clash_info_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_lpm_to_rr_req_cnt_reg[] = + { + {"lpm_to_rr_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_hash3_0_to_kschd_req_cnt_reg[] = + { + {"hash3_0_to_kschd_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_hash3_0_rr_state_rsp_cnt_reg[] = + { + {"hash3_0_rr_state_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_hash3_0_clash_info_cnt_reg[] = + { + {"hash3_0_clash_info_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_hash3_0_to_rr_req_cnt_reg[] = + { + {"hash3_0_to_rr_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_dir3_0_to_kschd_req_cnt_reg[] = + { + {"dir3_0_to_kschd_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_dir3_0_clash_info_cnt_reg[] = + { + {"dir3_0_clash_info_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_dir_tbl_wr_req_cnt_reg[] = + { + {"dir_tbl_wr_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_warbi_to_dir_tbl_warbi_fc_cnt_reg[] = + { + {"warbi_to_dir_tbl_warbi_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_dir3_0_to_bank_rr_req_cnt_reg[] = + { + {"dir3_0_to_bank_rr_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_kschd_to_dir3_0_fc_cnt_reg[] = + { + {"kschd_to_dir3_0_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_dir3_0_rr_state_rsp_cnt_reg[] = + { + {"dir3_0_rr_state_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_wr_done_to_warbi_fc_cnt_reg[] = + { + {"wr_done_to_warbi_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_wr_done_ptr_req_cnt_reg[] = + { + {"wr_done_ptr_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ctrl7_0_to_warbi_fc_cnt_reg[] = + { + {"ctrl7_0_to_warbi_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_warbi_to_ctrl7_0_wr_req_cnt_reg[] = + { + {"warbi_to_ctrl7_0_wr_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_warbi_to_cash7_0_wr_req_cnt_reg[] = + { + {"warbi_to_cash7_0_wr_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_warbi_to_cpu_wr_fc_cnt_reg[] = + { + {"warbi_to_cpu_wr_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cpu_wr_req_cnt_reg[] = + { + {"cpu_wr_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ctrl7_0_to_cpu_rd_rsp_cnt_reg[] = + { + {"ctrl7_0_to_cpu_rd_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cpu_to_ctrl7_0_rd_req_cnt_reg[] = + { + {"cpu_to_ctrl7_0_rd_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cpu_rd_dir_tbl_rsp_cnt_reg[] = + { + {"cpu_rd_dir_tbl_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cpu_to_dir_tbl_rd_wr_req_cnt_reg[] = + { + {"cpu_to_dir_tbl_rd_wr_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_to_mmu_7_0_rsp_fc_cnt_reg[] = + { + {"smmu1_to_mmu_7_0_rsp_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_mmu_7_0_to_smmu1_rd_rsp_cnt_reg[] = + { + {"mmu_7_0_to_smmu1_rd_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_mmu_7_0_to_smmu1_rd_fc_cnt_reg[] = + { + {"mmu_7_0_to_smmu1_rd_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_to_mmu_7_rd_req_cnt_reg[] = + { + {"smmu1_to_mmu_7_rd_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_mmu_7_to_smmu1_wr_fc_cnt_reg[] = + { + {"mmu_7_to_smmu1_wr_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_to_mmu_7_0_wr_req_cnt_reg[] = + { + {"smmu1_to_mmu_7_0_wr_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_se_to_smmu1_wr_rsp_fc_cnt_reg[] = + { + {"se_to_smmu1_wr_rsp_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_to_se_wr_rsp_cnt_reg[] = + { + {"smmu1_to_se_wr_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ddr7_0_wr_rsp_cnt_reg[] = + { + {"ddr7_0_wr_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_to_as_fc_cnt_reg[] = + { + {"smmu1_to_as_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_as_to_smmu1_wr_req_cnt_reg[] = + { + {"as_to_smmu1_wr_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_to_se_parser_fc_cnt_reg[] = + { + {"smmu1_to_se_parser_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_se_parser_to_smmu1_req_cnt_reg[] = + { + {"se_parser_to_smmu1_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_to_etm_wr_fc_cnt_reg[] = + { + {"smmu1_to_etm_wr_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_etm_wr_req_cnt_reg[] = + { + {"etm_wr_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_to_ftm_wr_fc_cnt_reg[] = + { + {"smmu1_to_ftm_wr_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ftm_wr_req_cnt_reg[] = + { + {"ftm_wr_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_to_state_wr_fc_cnt_reg[] = + { + {"smmu1_to_state_wr_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_state_wr_req_cnt_reg[] = + { + {"state_wr_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_se_to_dma_rsp_cnt_reg[] = + { + {"se_to_dma_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_se_to_dma_fc_cnt_reg[] = + { + {"se_to_dma_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_oam_to_smmu1_fc_cnt_reg[] = + { + {"oam_to_smmu1_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_to_oam_rsp_cnt_reg[] = + { + {"smmu1_to_oam_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_to_oam_fc_cnt_reg[] = + { + {"smmu1_to_oam_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_oam_to_smmu1_req_cnt_reg[] = + { + {"oam_to_smmu1_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_to_etm_rsp_cnt_reg[] = + { + {"smmu1_to_etm_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_to_ftm_rsp_cnt_reg[] = + { + {"smmu1_to_ftm_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_to_etm_fc_cnt_reg[] = + { + {"smmu1_to_etm_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_etm_to_smmu1_req_cnt_reg[] = + { + {"etm_to_smmu1_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_to_ftm_fc_cnt_reg[] = + { + {"smmu1_to_ftm_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_ftm_to_smmu1_req_cnt_reg[] = + { + {"ftm_to_smmu1_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_to_stat_rsp_cnt_reg[] = + { + {"smmu1_to_stat_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_to_stat_fc_cnt_reg[] = + { + {"smmu1_to_stat_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_stat_to_smmu1_req_cnt_reg[] = + { + {"stat_to_smmu1_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_lpm_as_to_smmu1_fc_cnt_reg[] = + { + {"lpm_as_to_smmu1_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_lpm_to_smmu1_fc_cnt_reg[] = + { + {"lpm_to_smmu1_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_to_lpm_as_rsp_cnt_reg[] = + { + {"smmu1_to_lpm_as_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_to_lpm_rsp_cnt_reg[] = + { + {"smmu1_to_lpm_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_to_lpm_as_fc_cnt_reg[] = + { + {"smmu1_to_lpm_as_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_to_lpm_fc_cnt_reg[] = + { + {"smmu1_to_lpm_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_lpm_as_to_smmu1_req_cnt_reg[] = + { + {"lpm_as_to_smmu1_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_lpm_to_smmu1_req_cnt_reg[] = + { + {"lpm_to_smmu1_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_hash3_0_to_smmu1_fc_cnt_reg[] = + { + {"hash3_0_to_smmu1_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_to_hash3_0_rsp_cnt_reg[] = + { + {"smmu1_to_hash3_0_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_to_hash3_0_fc_cnt_reg[] = + { + {"smmu1_to_hash3_0_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_hash3_0_to_smmu1_cnt_reg[] = + { + {"hash3_0_to_smmu1_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_se_to_smmu1_dir3_0_rsp_fc_cnt_reg[] = + { + {"se_to_smmu1_dir3_0_rsp_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_to_se_dir3_0_rsp_cnt_reg[] = + { + {"smmu1_to_se_dir3_0_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_smmu1_to_se_dir3_0_fc_cnt_reg[] = + { + {"smmu1_to_se_dir3_0_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_se_to_smmu1_dir3_0_cnt_reg[] = + { + {"se_to_smmu1_dir3_0_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_smmu1_cache7_0_to_rschd_rsp_cnt_reg[] = + { + {"cache7_0_to_rschd_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cmmu_ddr_rw_addr_reg[] = + { + {"ddr_wr", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cmmu_ddr_rw_mode_reg[] = + { + {"ddr_rw_flag", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + {"ddr_rw_mode", DPP_FIELD_FLAG_RW, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cmmu_cp_cmd_reg[] = + { + {"stat_tbl_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cmmu_cpu_ind_rd_done_reg[] = + { + {"cpu_ind_rd_done", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cmmu_cpu_ind_rdat0_reg[] = + { + {"cpu_ind_rdat0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cmmu_cpu_ind_rdat1_reg[] = + { + {"cpu_ind_rdat1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cmmu_cpu_ind_rdat2_reg[] = + { + {"cpu_ind_rdat2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cmmu_cpu_ind_rdat3_reg[] = + { + {"cpu_ind_rdat3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cmmu_cpu_ddr_fifo_almful_reg[] = + { + {"cpu_ddr_fifo_almful", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cmmu_debug_cnt_mode_reg[] = + { + {"cnt_rd_mode", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"cnt_overflow_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_cmmu_cmmu_pful_cfg_reg[] = + { + {"alu_cmd_pful_negate", DPP_FIELD_FLAG_RW, 17, 9, 0xf8, 0x0}, + {"alu_cmd_pful_assert", DPP_FIELD_FLAG_RW, 8, 9, 0xf8, 0x0}, + }; +DPP_FIELD_T g_se_cmmu_cmmu_stat_pful_cfg_reg[] = + { + {"cmmu_stat_pful_negate", DPP_FIELD_FLAG_RW, 11, 6, 0x14, 0x0}, + {"cmmu_stat_pful_assert", DPP_FIELD_FLAG_RW, 5, 6, 0x14, 0x0}, + }; +DPP_FIELD_T g_se_cmmu_stat_overflow_mode_reg[] = + { + {"stat_overflow_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_cmmu_cmmu_cp_fifo_pful_reg[] = + { + {"cmmu_cp_fifo_pful", DPP_FIELD_FLAG_RW, 7, 8, 0x66, 0x0}, + }; +DPP_FIELD_T g_se_cmmu_ddr_wr_dat0_reg[] = + { + {"ddr_wr_dat0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cmmu_ddr_wr_dat1_reg[] = + { + {"ddr_wr_dat1", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cmmu_cmmu_int_unmask_flag_reg[] = + { + {"cmmu_int_unmask_flag", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cmmu_cmmu_int_en_reg[] = + { + {"cmmu_int_en12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"cmmu_int_en11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"cmmu_int_en10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"cmmu_int_en9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"cmmu_int_en8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"cmmu_int_en7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"cmmu_int_en6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"cmmu_int_en5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"cmmu_int_en4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"cmmu_int_en3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"cmmu_int_en2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"cmmu_int_en1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"cmmu_int_en0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_cmmu_cmmu_int_mask_reg[] = + { + {"cmmu_int_mask12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"cmmu_int_mask11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"cmmu_int_mask10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"cmmu_int_mask9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"cmmu_int_mask8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"cmmu_int_mask7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"cmmu_int_mask6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"cmmu_int_mask5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"cmmu_int_mask4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"cmmu_int_mask3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"cmmu_int_mask2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"cmmu_int_mask1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"cmmu_int_mask0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_se_cmmu_cmmu_int_status_reg[] = + { + {"cmmu_int_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"cmmu_int_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"cmmu_int_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"cmmu_int_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"cmmu_int_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"cmmu_int_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"cmmu_int_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"cmmu_int_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"cmmu_int_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"cmmu_int_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"cmmu_int_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"cmmu_int_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"cmmu_int_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cmmu_stat_cmmu_req_cnt_reg[] = + { + {"stat_cmmu_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cmmu_cmmu_fc0_cnt_reg[] = + { + {"cmmu_stat_rdy", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cmmu_cmmu_fc1_cnt_reg[] = + { + {"smmu1_cmmu_wr_rdy", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_se_cmmu_cmmu_fc2_cnt_reg[] = + { + {"smmu1_cmmu_rd_rdy", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash0_tbl0_cfg_reg[] = + { + {"hash0_tbl0_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash0_tbl0_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash0_tbl0_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash0_tbl1_cfg_reg[] = + { + {"hash0_tbl1_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash0_tbl1_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash0_tbl1_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash0_tbl2_cfg_reg[] = + { + {"hash0_tbl2_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash0_tbl2_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash0_tbl2_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash0_tbl3_cfg_reg[] = + { + {"hash0_tbl3_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash0_tbl3_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash0_tbl3_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash0_tbl4_cfg_reg[] = + { + {"hash0_tbl4_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash0_tbl4_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash0_tbl4_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash0_tbl5_cfg_reg[] = + { + {"hash0_tbl5_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash0_tbl5_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash0_tbl5_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash0_tbl6_cfg_reg[] = + { + {"hash0_tbl6_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash0_tbl6_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash0_tbl6_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash0_tbl7_cfg_reg[] = + { + {"hash0_tbl7_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash0_tbl7_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash0_tbl7_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash1_tbl0_cfg_reg[] = + { + {"hash1_tbl0_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash1_tbl0_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash1_tbl0_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash1_tbl1_cfg_reg[] = + { + {"hash1_tbl1_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash1_tbl1_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash1_tbl1_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash1_tbl2_cfg_reg[] = + { + {"hash1_tbl2_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash1_tbl2_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash1_tbl2_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash1_tbl3_cfg_reg[] = + { + {"hash1_tbl3_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash1_tbl3_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash1_tbl3_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash1_tbl4_cfg_reg[] = + { + {"hash1_tbl4_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash1_tbl4_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash1_tbl4_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash1_tbl5_cfg_reg[] = + { + {"hash1_tbl5_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash1_tbl5_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash1_tbl5_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash1_tbl6_cfg_reg[] = + { + {"hash1_tbl6_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash1_tbl6_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash1_tbl6_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash1_tbl7_cfg_reg[] = + { + {"hash1_tbl7_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash1_tbl7_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash1_tbl7_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash2_tbl0_cfg_reg[] = + { + {"hash2_tbl0_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash2_tbl0_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash2_tbl0_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash2_tbl1_cfg_reg[] = + { + {"hash2_tbl1_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash2_tbl1_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash2_tbl1_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash2_tbl2_cfg_reg[] = + { + {"hash2_tbl2_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash2_tbl2_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash2_tbl2_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash2_tbl3_cfg_reg[] = + { + {"hash2_tbl3_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash2_tbl3_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash2_tbl3_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash2_tbl4_cfg_reg[] = + { + {"hash2_tbl4_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash2_tbl4_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash2_tbl4_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash2_tbl5_cfg_reg[] = + { + {"hash2_tbl5_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash2_tbl5_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash2_tbl5_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash2_tbl6_cfg_reg[] = + { + {"hash2_tbl6_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash2_tbl6_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash2_tbl6_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash2_tbl7_cfg_reg[] = + { + {"hash2_tbl7_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash2_tbl7_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash2_tbl7_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash3_tbl0_cfg_reg[] = + { + {"hash3_tbl0_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash3_tbl0_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash3_tbl0_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash3_tbl1_cfg_reg[] = + { + {"hash3_tbl1_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash3_tbl1_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash3_tbl1_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash3_tbl2_cfg_reg[] = + { + {"hash3_tbl2_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash3_tbl2_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash3_tbl2_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash3_tbl3_cfg_reg[] = + { + {"hash3_tbl3_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash3_tbl3_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash3_tbl3_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash3_tbl4_cfg_reg[] = + { + {"hash3_tbl4_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash3_tbl4_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash3_tbl4_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash3_tbl5_cfg_reg[] = + { + {"hash3_tbl5_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash3_tbl5_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash3_tbl5_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash3_tbl6_cfg_reg[] = + { + {"hash3_tbl6_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash3_tbl6_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash3_tbl6_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_smmu14k_se_smmu1_hash3_tbl7_cfg_reg[] = + { + {"hash3_tbl7_len", DPP_FIELD_FLAG_RO, 22, 2, 0x1, 0x0}, + {"hash3_tbl7_ecc_en", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"hash3_tbl7_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_eram_wdat1_reg[] = + { + {"cpu_ind_eram_wdat1", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_eram_wdat2_reg[] = + { + {"cpu_ind_eram_wdat2", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_eram_wdat3_reg[] = + { + {"cpu_ind_eram_wdat3", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_eram_req_info_reg[] = + { + {"rw_mode", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + {"read_mode", DPP_FIELD_FLAG_RW, 16, 1, 0x0, 0x0}, + {"tm_cs", DPP_FIELD_FLAG_RW, 15, 1, 0x0, 0x0}, + {"queue_cs", DPP_FIELD_FLAG_RW, 14, 1, 0x0, 0x0}, + {"rw_addr", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_eram_rd_done_reg[] = + { + {"cpu_ind_eram_rd_done", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_eram_rdat0_reg[] = + { + {"cpu_ind_eram_rdat0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_eram_rdat1_reg[] = + { + {"cpu_ind_eram_rdat1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_eram_rdat2_reg[] = + { + {"cpu_ind_eram_rdat2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_eram_rdat3_reg[] = + { + {"cpu_ind_eram_rdat3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_tm_alu_eram_cpu_rdy_reg[] = + { + {"tm_alu_eram_cpu_rdy", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_oam_stat_cfg_reg[] = + { + {"oam_flow_control_cfg", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"oam_lm_flow_control_cfg", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"oam_in_eram_cfg", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_ftm_port_sel_cfg_reg[] = + { + {"ftm_port0_sel_cfg", DPP_FIELD_FLAG_RW, 19, 5, 0x0, 0x0}, + {"ftm_port1_sel_cfg", DPP_FIELD_FLAG_RW, 14, 5, 0x1, 0x0}, + {"ftm_port2_sel_cfg", DPP_FIELD_FLAG_RW, 9, 5, 0xf, 0x0}, + {"ftm_port3_sel_cfg", DPP_FIELD_FLAG_RW, 4, 5, 0x10, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_oam_eram_base_addr_reg[] = + { + {"oam_eram_base_addr", DPP_FIELD_FLAG_RW, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_oam_lm_eram_base_addr_reg[] = + { + {"oam_lm_eram_base_addr", DPP_FIELD_FLAG_RW, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_oam_ddr_base_addr_reg[] = + { + {"oam_ddr_base_addr", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_plcr0_schd_pful_cfg_reg[] = + { + {"plcr0_schd_pful_assert", DPP_FIELD_FLAG_RW, 13, 7, 0x2c, 0x0}, + {"plcr0_schd_pful_negate", DPP_FIELD_FLAG_RW, 6, 7, 0x2c, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_oam_lm_ord_pful_cfg_reg[] = + { + {"oam_lm_ord_pful_assert", DPP_FIELD_FLAG_RW, 13, 7, 0x28, 0x0}, + {"oam_lm_ord_pful_negate", DPP_FIELD_FLAG_RW, 6, 7, 0x28, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_ddr_schd_pful_cfg_reg[] = + { + {"ddr_schd_pful_assert", DPP_FIELD_FLAG_RW, 13, 7, 0x2c, 0x0}, + {"ddr_schd_pful_negate", DPP_FIELD_FLAG_RW, 6, 7, 0x2c, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_eram_schd_pful_cfg_reg[] = + { + {"eram_schd_pful_assert", DPP_FIELD_FLAG_RW, 13, 7, 0x28, 0x0}, + {"eram_schd_pful_negate", DPP_FIELD_FLAG_RW, 6, 7, 0x28, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_eram_schd_pept_cfg_reg[] = + { + {"eram_schd_pept_assert", DPP_FIELD_FLAG_RW, 13, 7, 0x18, 0x0}, + {"eram_schd_pept_negate", DPP_FIELD_FLAG_RW, 6, 7, 0x18, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_eram_schd_oam_pful_cfg_reg[] = + { + {"eram_schd_oam_pful_assert", DPP_FIELD_FLAG_RW, 13, 7, 0x28, 0x0}, + {"eram_schd_oam_pful_negate", DPP_FIELD_FLAG_RW, 6, 7, 0x28, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_eram_schd_oam_pept_cfg_reg[] = + { + {"eram_schd_oam_pept_assert", DPP_FIELD_FLAG_RW, 13, 7, 0x18, 0x0}, + {"eram_schd_oam_pept_negate", DPP_FIELD_FLAG_RW, 6, 7, 0x18, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_eram_schd_oam_lm_pful_cfg_reg[] = + { + {"eram_schd_oam_lm_pful_assert", DPP_FIELD_FLAG_RW, 13, 7, 0x28, 0x0}, + {"eram_schd_oam_lm_pful_negate", DPP_FIELD_FLAG_RW, 6, 7, 0x28, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_eram_schd_oam_lm_pept_cfg_reg[] = + { + {"eram_schd_oam_lm_pept_assert", DPP_FIELD_FLAG_RW, 13, 7, 0x18, 0x0}, + {"eram_schd_oam_lm_pept_negate", DPP_FIELD_FLAG_RW, 6, 7, 0x18, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_rschd_pful_cfg_reg[] = + { + {"rschd_pful_assert", DPP_FIELD_FLAG_RW, 13, 7, 0x24, 0x0}, + {"rschd_pful_negate", DPP_FIELD_FLAG_RW, 6, 7, 0x24, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_rschd_pept_cfg_reg[] = + { + {"rschd_pept_assert", DPP_FIELD_FLAG_RW, 13, 7, 0x1c, 0x0}, + {"rschd_pept_negate", DPP_FIELD_FLAG_RW, 6, 7, 0x1c, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_rschd_plcr_pful_cfg_reg[] = + { + {"rschd_plcr_pful_assert", DPP_FIELD_FLAG_RW, 15, 8, 0x40, 0x0}, + {"rschd_plcr_pful_negate", DPP_FIELD_FLAG_RW, 7, 8, 0x40, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_rschd_plcr_pept_cfg_reg[] = + { + {"rschd_plcr_pept_assert", DPP_FIELD_FLAG_RW, 15, 8, 0x40, 0x0}, + {"rschd_plcr_pept_negate", DPP_FIELD_FLAG_RW, 7, 8, 0x40, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_rschd_plcr_info_pful_cfg_reg[] = + { + {"rschd_plcr_info_pful_assert", DPP_FIELD_FLAG_RW, 13, 7, 0x38, 0x0}, + {"rschd_plcr_info_pful_negate", DPP_FIELD_FLAG_RW, 6, 7, 0x38, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_alu_arb_cpu_pful_cfg_reg[] = + { + {"alu_arb_cpu_pful_assert", DPP_FIELD_FLAG_RW, 9, 5, 0x08, 0x0}, + {"alu_arb_cpu_pful_negate", DPP_FIELD_FLAG_RW, 4, 5, 0x08, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_alu_arb_user_pful_cfg_reg[] = + { + {"alu_arb_user_pful_assert", DPP_FIELD_FLAG_RW, 9, 5, 0x0d, 0x0}, + {"alu_arb_user_pful_negate", DPP_FIELD_FLAG_RW, 4, 5, 0x0d, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_alu_arb_stat_pful_cfg_reg[] = + { + {"alu_arb_stat_pful_assert", DPP_FIELD_FLAG_RW, 13, 7, 0x20, 0x0}, + {"alu_arb_stat_pful_negate", DPP_FIELD_FLAG_RW, 6, 7, 0x20, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cycmov_dat_pful_cfg_reg[] = + { + {"cycmov_dat_pful_assert", DPP_FIELD_FLAG_RW, 9, 5, 0x0d, 0x0}, + {"cycmov_dat_pful_negate", DPP_FIELD_FLAG_RW, 4, 5, 0x0d, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_ddr_opr_pful_cfg_reg[] = + { + {"ddr_opr_pful_assert", DPP_FIELD_FLAG_RW, 9, 5, 0xc, 0x0}, + {"ddr_opr_pful_negate", DPP_FIELD_FLAG_RW, 4, 5, 0xc, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cycle_mov_pful_cfg_reg[] = + { + {"cycle_mov_pful_assert", DPP_FIELD_FLAG_RW, 11, 6, 0x1c, 0x0}, + {"cycle_mov_pful_negate", DPP_FIELD_FLAG_RW, 5, 6, 0x1c, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cntovf_pful_cfg_reg[] = + { + {"cntovf_pful_assert", DPP_FIELD_FLAG_RW, 13, 7, 0x32, 0x0}, + {"cntovf_pful_negate", DPP_FIELD_FLAG_RW, 6, 7, 0x32, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_eram_schd_plcr_pful_cfg_reg[] = + { + {"eram_schd_plcr_pful_assert", DPP_FIELD_FLAG_RW, 15, 8, 0x40, 0x0}, + {"eram_schd_plcr_pful_negate", DPP_FIELD_FLAG_RW, 7, 8, 0x40, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_eram_schd_plcr_pept_cfg_reg[] = + { + {"eram_schd_plcr_pept_assert", DPP_FIELD_FLAG_RW, 15, 8, 0x40, 0x0}, + {"eram_schd_plcr_pept_negate", DPP_FIELD_FLAG_RW, 7, 8, 0x40, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_debug_cnt_mode_reg[] = + { + {"cnt_rd_mode", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"cnt_overflow_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_tm_mov_period_cfg_reg[] = + { + {"etm_mov_period_cfg", DPP_FIELD_FLAG_RW, 15, 8, 0x3c, 0x0}, + {"ftm_mov_period_cfg", DPP_FIELD_FLAG_RW, 7, 8, 0x3c, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_alu_ddr_cpu_req_pful_cfg_reg[] = + { + {"alu_ddr_cpu_req_pful_assert", DPP_FIELD_FLAG_RW, 7, 4, 0x4, 0x0}, + {"alu_ddr_cpu_req_pful_negate", DPP_FIELD_FLAG_RW, 3, 4, 0x4, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cycmov_addr_pful_cfg_reg[] = + { + {"cycmov_addr_pful_assert", DPP_FIELD_FLAG_RW, 9, 5, 0xd, 0x0}, + {"cycmov_addr_pful_negate", DPP_FIELD_FLAG_RW, 4, 5, 0xd, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_ord_ddr_plcr_fifo_empty_reg[] = + { + {"ord_oam_lm_empty", DPP_FIELD_FLAG_RO, 19, 1, 0x1, 0x0}, + {"ddr_schd_fifo_empty", DPP_FIELD_FLAG_RO, 18, 7, 0x7f, 0x0}, + {"plcr0_schd_fifo_empty", DPP_FIELD_FLAG_RO, 5, 6, 0x3f, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_tm_stat_fifo_empty_reg[] = + { + {"tm_stat_fifo_empty", DPP_FIELD_FLAG_RO, 13, 14, 0x3fff, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_eram_schd_fifo_empty_0_1_reg[] = + { + {"eram_schd_fifo_empty1", DPP_FIELD_FLAG_RO, 31, 16, 0xffff, 0x0}, + {"eram_schd_fifo_empty0", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_eram_schd_fifo_empty_2_3_reg[] = + { + {"eram_schd_fifo_empty3", DPP_FIELD_FLAG_RO, 31, 16, 0xffff, 0x0}, + {"eram_schd_fifo_empty2", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_eram_schd_fifo_empty_4_5_reg[] = + { + {"eram_schd_fifo_empty5", DPP_FIELD_FLAG_RO, 31, 16, 0xffff, 0x0}, + {"eram_schd_fifo_empty4", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_eram_schd_fifo_empty_6_7_reg[] = + { + {"eram_schd_fifo_empty7", DPP_FIELD_FLAG_RO, 31, 16, 0xffff, 0x0}, + {"eram_schd_fifo_empty6", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_eram_schd_fifo_empty_free_8_reg[] = + { + {"eram_schd_free_fifo_empty8", DPP_FIELD_FLAG_RO, 24, 1, 0x1, 0x0}, + {"eram_schd_free_fifo_empty7", DPP_FIELD_FLAG_RO, 23, 1, 0x1, 0x0}, + {"eram_schd_free_fifo_empty6", DPP_FIELD_FLAG_RO, 22, 1, 0x1, 0x0}, + {"eram_schd_free_fifo_empty5", DPP_FIELD_FLAG_RO, 21, 1, 0x1, 0x0}, + {"eram_schd_free_fifo_empty4", DPP_FIELD_FLAG_RO, 20, 1, 0x1, 0x0}, + {"eram_schd_free_fifo_empty3", DPP_FIELD_FLAG_RO, 19, 1, 0x1, 0x0}, + {"eram_schd_free_fifo_empty2", DPP_FIELD_FLAG_RO, 18, 1, 0x1, 0x0}, + {"eram_schd_free_fifo_empty1", DPP_FIELD_FLAG_RO, 17, 1, 0x1, 0x0}, + {"eram_schd_free_fifo_empty0", DPP_FIELD_FLAG_RO, 16, 1, 0x1, 0x0}, + {"eram_schd_fifo_empty8", DPP_FIELD_FLAG_RO, 15, 16, 0xffff, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_rschd_fifo_empty_0_3_reg[] = + { + {"rschd_fifo_empty3", DPP_FIELD_FLAG_RO, 31, 8, 0xff, 0x0}, + {"rschd_fifo_empty2", DPP_FIELD_FLAG_RO, 23, 8, 0xff, 0x0}, + {"rschd_fifo_empty1", DPP_FIELD_FLAG_RO, 15, 8, 0xff, 0x0}, + {"rschd_fifo_empty0", DPP_FIELD_FLAG_RO, 7, 8, 0xff, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_rschd_fifo_empty_4_7_reg[] = + { + {"rschd_fifo_empty7", DPP_FIELD_FLAG_RO, 31, 8, 0xff, 0x0}, + {"rschd_fifo_empty6", DPP_FIELD_FLAG_RO, 23, 8, 0xff, 0x0}, + {"rschd_fifo_empty5", DPP_FIELD_FLAG_RO, 15, 8, 0xff, 0x0}, + {"rschd_fifo_empty4", DPP_FIELD_FLAG_RO, 7, 8, 0xff, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_rschd_fifo_empty_8_11_reg[] = + { + {"rschd_fifo_empty11", DPP_FIELD_FLAG_RO, 31, 8, 0xff, 0x0}, + {"rschd_fifo_empty10", DPP_FIELD_FLAG_RO, 23, 8, 0xff, 0x0}, + {"rschd_fifo_empty9", DPP_FIELD_FLAG_RO, 15, 8, 0xff, 0x0}, + {"rschd_fifo_empty8", DPP_FIELD_FLAG_RO, 7, 8, 0xff, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_rschd_fifo_empty_12_15_reg[] = + { + {"rschd_fifo_empty15", DPP_FIELD_FLAG_RO, 31, 8, 0xff, 0x0}, + {"rschd_fifo_empty14", DPP_FIELD_FLAG_RO, 23, 8, 0xff, 0x0}, + {"rschd_fifo_empty13", DPP_FIELD_FLAG_RO, 15, 8, 0xff, 0x0}, + {"rschd_fifo_empty12", DPP_FIELD_FLAG_RO, 7, 8, 0xff, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_rschd_fifo_empty_plcr_16_17_reg[] = + { + {"rschd_fifo_empty_plcr", DPP_FIELD_FLAG_RO, 16, 1, 0x1, 0x0}, + {"rschd_fifo_empty17", DPP_FIELD_FLAG_RO, 15, 8, 0xff, 0x0}, + {"rschd_fifo_empty16", DPP_FIELD_FLAG_RO, 7, 8, 0xff, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_int_unmask_flag_reg[] = + { + {"stat_int5_unmask_flag", DPP_FIELD_FLAG_RO, 5, 1, 0x0, 0x0}, + {"stat_int4_unmask_flag", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"stat_int3_unmask_flag", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"stat_int2_unmask_flag", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"stat_int1_unmask_flag", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"stat_int0_unmask_flag", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_int0_en_reg[] = + { + {"stat_int0_en31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"stat_int0_en30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"stat_int0_en29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"stat_int0_en28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"stat_int0_en27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"stat_int0_en26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"stat_int0_en25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"stat_int0_en24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"stat_int0_en23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"stat_int0_en22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"stat_int0_en21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"stat_int0_en20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"stat_int0_en19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"stat_int0_en18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"stat_int0_en17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"stat_int0_en16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"stat_int0_en15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"stat_int0_en14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"stat_int0_en13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"stat_int0_en12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"stat_int0_en11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"stat_int0_en10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"stat_int0_en9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"stat_int0_en8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"stat_int0_en7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"stat_int0_en6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"stat_int0_en5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"stat_int0_en4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"stat_int0_en3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"stat_int0_en2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"stat_int0_en1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"stat_int0_en0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_int0_mask_reg[] = + { + {"stat_int0_mask31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"stat_int0_mask30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"stat_int0_mask29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"stat_int0_mask28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"stat_int0_mask27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"stat_int0_mask26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"stat_int0_mask25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"stat_int0_mask24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"stat_int0_mask23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"stat_int0_mask22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"stat_int0_mask21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"stat_int0_mask20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"stat_int0_mask19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"stat_int0_mask18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"stat_int0_mask17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"stat_int0_mask16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"stat_int0_mask15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"stat_int0_mask14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"stat_int0_mask13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"stat_int0_mask12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"stat_int0_mask11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"stat_int0_mask10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"stat_int0_mask9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"stat_int0_mask8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"stat_int0_mask7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"stat_int0_mask6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"stat_int0_mask5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"stat_int0_mask4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"stat_int0_mask3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"stat_int0_mask2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"stat_int0_mask1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"stat_int0_mask0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_int0_status_reg[] = + { + {"stat_int0_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"stat_int0_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"stat_int0_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"stat_int0_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"stat_int0_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"stat_int0_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"stat_int0_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"stat_int0_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"stat_int0_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"stat_int0_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"stat_int0_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"stat_int0_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"stat_int0_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"stat_int0_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"stat_int0_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"stat_int0_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"stat_int0_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"stat_int0_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"stat_int0_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"stat_int0_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"stat_int0_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"stat_int0_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"stat_int0_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"stat_int0_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"stat_int0_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"stat_int0_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"stat_int0_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"stat_int0_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"stat_int0_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"stat_int0_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"stat_int0_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"stat_int0_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_int1_en_reg[] = + { + {"stat_int1_en31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"stat_int1_en30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"stat_int1_en29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"stat_int1_en28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"stat_int1_en27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"stat_int1_en26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"stat_int1_en25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"stat_int1_en24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"stat_int1_en23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"stat_int1_en22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"stat_int1_en21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"stat_int1_en20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"stat_int1_en19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"stat_int1_en18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"stat_int1_en17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"stat_int1_en16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"stat_int1_en15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"stat_int1_en14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"stat_int1_en13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"stat_int1_en12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"stat_int1_en11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"stat_int1_en10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"stat_int1_en9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"stat_int1_en8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"stat_int1_en7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"stat_int1_en6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"stat_int1_en5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"stat_int1_en4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"stat_int1_en3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"stat_int1_en2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"stat_int1_en1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"stat_int1_en0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_int1_mask_reg[] = + { + {"stat_int1_mask31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"stat_int1_mask30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"stat_int1_mask29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"stat_int1_mask28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"stat_int1_mask27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"stat_int1_mask26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"stat_int1_mask25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"stat_int1_mask24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"stat_int1_mask23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"stat_int1_mask22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"stat_int1_mask21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"stat_int1_mask20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"stat_int1_mask19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"stat_int1_mask18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"stat_int1_mask17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"stat_int1_mask16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"stat_int1_mask15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"stat_int1_mask14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"stat_int1_mask13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"stat_int1_mask12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"stat_int1_mask11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"stat_int1_mask10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"stat_int1_mask9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"stat_int1_mask8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"stat_int1_mask7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"stat_int1_mask6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"stat_int1_mask5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"stat_int1_mask4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"stat_int1_mask3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"stat_int1_mask2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"stat_int1_mask1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"stat_int1_mask0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_int1_status_reg[] = + { + {"stat_int1_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"stat_int1_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"stat_int1_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"stat_int1_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"stat_int1_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"stat_int1_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"stat_int1_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"stat_int1_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"stat_int1_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"stat_int1_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"stat_int1_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"stat_int1_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"stat_int1_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"stat_int1_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"stat_int1_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"stat_int1_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"stat_int1_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"stat_int1_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"stat_int1_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"stat_int1_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"stat_int1_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"stat_int1_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"stat_int1_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"stat_int1_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"stat_int1_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"stat_int1_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"stat_int1_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"stat_int1_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"stat_int1_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"stat_int1_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"stat_int1_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"stat_int1_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_int2_en_reg[] = + { + {"stat_int2_en31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"stat_int2_en30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"stat_int2_en29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"stat_int2_en28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"stat_int2_en27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"stat_int2_en26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"stat_int2_en25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"stat_int2_en24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"stat_int2_en23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"stat_int2_en22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"stat_int2_en21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"stat_int2_en20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"stat_int2_en19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"stat_int2_en18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"stat_int2_en17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"stat_int2_en16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"stat_int2_en15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"stat_int2_en14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"stat_int2_en13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"stat_int2_en12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"stat_int2_en11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"stat_int2_en10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"stat_int2_en9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"stat_int2_en8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"stat_int2_en7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"stat_int2_en6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"stat_int2_en5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"stat_int2_en4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"stat_int2_en3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"stat_int2_en2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"stat_int2_en1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"stat_int2_en0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_int2_mask_reg[] = + { + {"stat_int2_mask31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"stat_int2_mask30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"stat_int2_mask29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"stat_int2_mask28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"stat_int2_mask27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"stat_int2_mask26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"stat_int2_mask25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"stat_int2_mask24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"stat_int2_mask23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"stat_int2_mask22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"stat_int2_mask21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"stat_int2_mask20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"stat_int2_mask19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"stat_int2_mask18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"stat_int2_mask17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"stat_int2_mask16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"stat_int2_mask15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"stat_int2_mask14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"stat_int2_mask13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"stat_int2_mask12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"stat_int2_mask11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"stat_int2_mask10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"stat_int2_mask9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"stat_int2_mask8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"stat_int2_mask7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"stat_int2_mask6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"stat_int2_mask5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"stat_int2_mask4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"stat_int2_mask3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"stat_int2_mask2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"stat_int2_mask1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"stat_int2_mask0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_int2_status_reg[] = + { + {"stat_int2_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"stat_int2_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"stat_int2_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"stat_int2_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"stat_int2_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"stat_int2_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"stat_int2_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"stat_int2_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"stat_int2_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"stat_int2_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"stat_int2_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"stat_int2_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"stat_int2_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"stat_int2_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"stat_int2_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"stat_int2_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"stat_int2_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"stat_int2_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"stat_int2_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"stat_int2_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"stat_int2_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"stat_int2_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"stat_int2_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"stat_int2_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"stat_int2_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"stat_int2_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"stat_int2_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"stat_int2_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"stat_int2_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"stat_int2_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"stat_int2_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"stat_int2_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_int3_en_reg[] = + { + {"stat_int3_en31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"stat_int3_en30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"stat_int3_en29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"stat_int3_en28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"stat_int3_en27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"stat_int3_en26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"stat_int3_en25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"stat_int3_en24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"stat_int3_en23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"stat_int3_en22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"stat_int3_en21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"stat_int3_en20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"stat_int3_en19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"stat_int3_en18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"stat_int3_en17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"stat_int3_en16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"stat_int3_en15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"stat_int3_en14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"stat_int3_en13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"stat_int3_en12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"stat_int3_en11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"stat_int3_en10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"stat_int3_en9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"stat_int3_en8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"stat_int3_en7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"stat_int3_en6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"stat_int3_en5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"stat_int3_en4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"stat_int3_en3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"stat_int3_en2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"stat_int3_en1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"stat_int3_en0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_int3_mask_reg[] = + { + {"stat_int3_mask31", DPP_FIELD_FLAG_RW, 31, 1, 0x1, 0x0}, + {"stat_int3_mask30", DPP_FIELD_FLAG_RW, 30, 1, 0x1, 0x0}, + {"stat_int3_mask29", DPP_FIELD_FLAG_RW, 29, 1, 0x1, 0x0}, + {"stat_int3_mask28", DPP_FIELD_FLAG_RW, 28, 1, 0x1, 0x0}, + {"stat_int3_mask27", DPP_FIELD_FLAG_RW, 27, 1, 0x1, 0x0}, + {"stat_int3_mask26", DPP_FIELD_FLAG_RW, 26, 1, 0x1, 0x0}, + {"stat_int3_mask25", DPP_FIELD_FLAG_RW, 25, 1, 0x1, 0x0}, + {"stat_int3_mask24", DPP_FIELD_FLAG_RW, 24, 1, 0x1, 0x0}, + {"stat_int3_mask23", DPP_FIELD_FLAG_RW, 23, 1, 0x1, 0x0}, + {"stat_int3_mask22", DPP_FIELD_FLAG_RW, 22, 1, 0x1, 0x0}, + {"stat_int3_mask21", DPP_FIELD_FLAG_RW, 21, 1, 0x1, 0x0}, + {"stat_int3_mask20", DPP_FIELD_FLAG_RW, 20, 1, 0x1, 0x0}, + {"stat_int3_mask19", DPP_FIELD_FLAG_RW, 19, 1, 0x1, 0x0}, + {"stat_int3_mask18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"stat_int3_mask17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"stat_int3_mask16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"stat_int3_mask15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"stat_int3_mask14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"stat_int3_mask13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"stat_int3_mask12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"stat_int3_mask11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"stat_int3_mask10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"stat_int3_mask9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"stat_int3_mask8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"stat_int3_mask7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"stat_int3_mask6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"stat_int3_mask5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"stat_int3_mask4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"stat_int3_mask3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"stat_int3_mask2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"stat_int3_mask1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"stat_int3_mask0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_int3_status_reg[] = + { + {"stat_int3_status31", DPP_FIELD_FLAG_RC, 31, 1, 0x0, 0x0}, + {"stat_int3_status30", DPP_FIELD_FLAG_RC, 30, 1, 0x0, 0x0}, + {"stat_int3_status29", DPP_FIELD_FLAG_RC, 29, 1, 0x0, 0x0}, + {"stat_int3_status28", DPP_FIELD_FLAG_RC, 28, 1, 0x0, 0x0}, + {"stat_int3_status27", DPP_FIELD_FLAG_RC, 27, 1, 0x0, 0x0}, + {"stat_int3_status26", DPP_FIELD_FLAG_RC, 26, 1, 0x0, 0x0}, + {"stat_int3_status25", DPP_FIELD_FLAG_RC, 25, 1, 0x0, 0x0}, + {"stat_int3_status24", DPP_FIELD_FLAG_RC, 24, 1, 0x0, 0x0}, + {"stat_int3_status23", DPP_FIELD_FLAG_RC, 23, 1, 0x0, 0x0}, + {"stat_int3_status22", DPP_FIELD_FLAG_RC, 22, 1, 0x0, 0x0}, + {"stat_int3_status21", DPP_FIELD_FLAG_RC, 21, 1, 0x0, 0x0}, + {"stat_int3_status20", DPP_FIELD_FLAG_RC, 20, 1, 0x0, 0x0}, + {"stat_int3_status19", DPP_FIELD_FLAG_RC, 19, 1, 0x0, 0x0}, + {"stat_int3_status18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"stat_int3_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"stat_int3_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"stat_int3_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"stat_int3_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"stat_int3_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"stat_int3_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"stat_int3_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"stat_int3_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"stat_int3_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"stat_int3_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"stat_int3_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"stat_int3_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"stat_int3_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"stat_int3_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"stat_int3_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"stat_int3_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"stat_int3_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"stat_int3_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_int4_en_reg[] = + { + {"stat_int4_en_18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"stat_int4_en_17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"stat_int4_en_16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"stat_int4_en_15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"stat_int4_en_14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"stat_int4_en_13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"stat_int4_en_12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"stat_int4_en_11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"stat_int4_en_10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"stat_int4_en_9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"stat_int4_en_8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"stat_int4_en_7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"stat_int4_en_6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"stat_int4_en_5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"stat_int4_en_4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"stat_int4_en_3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"stat_int4_en_2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"stat_int4_en_1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"stat_int4_en_0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_int4_mask_reg[] = + { + {"stat_int4_mask_18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"stat_int4_mask_17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"stat_int4_mask_16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"stat_int4_mask_15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"stat_int4_mask_14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"stat_int4_mask_13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"stat_int4_mask_12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"stat_int4_mask_11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"stat_int4_mask_10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"stat_int4_mask_9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"stat_int4_mask_8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"stat_int4_mask_7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"stat_int4_mask_6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"stat_int4_mask_5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"stat_int4_mask_4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"stat_int4_mask_3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"stat_int4_mask_2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"stat_int4_mask_1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"stat_int4_mask_0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_int4_status_reg[] = + { + {"stat_int4_mask_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"stat_int4_mask_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"stat_int4_mask_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"stat_int4_mask_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"stat_int4_mask_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"stat_int4_mask_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"stat_int4_mask_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"stat_int4_mask_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"stat_int4_mask_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"stat_int4_mask_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"stat_int4_mask_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"stat_int4_mask_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"stat_int4_mask_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"stat_int4_mask_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"stat_int4_mask_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"stat_int4_mask_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"stat_int4_mask_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"stat_int4_mask_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"stat_int4_mask_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_int5_en_reg[] = + { + {"stat_int5_en_18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"stat_int5_en_17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"stat_int5_en_16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"stat_int5_en_15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"stat_int5_en_14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"stat_int5_en_13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"stat_int5_en_12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"stat_int5_en_11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"stat_int5_en_10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"stat_int5_en_9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"stat_int5_en_8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"stat_int5_en_7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"stat_int5_en_6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"stat_int5_en_5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"stat_int5_en_4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"stat_int5_en_3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"stat_int5_en_2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"stat_int5_en_1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"stat_int5_en_0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_int5_mask_reg[] = + { + {"stat_int5_mask_18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"stat_int5_mask_17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"stat_int5_mask_16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"stat_int5_mask_15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"stat_int5_mask_14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"stat_int5_mask_13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"stat_int5_mask_12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"stat_int5_mask_11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"stat_int5_mask_10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"stat_int5_mask_9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"stat_int5_mask_8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"stat_int5_mask_7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"stat_int5_mask_6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"stat_int5_mask_5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"stat_int5_mask_4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"stat_int5_mask_3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"stat_int5_mask_2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"stat_int5_mask_1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"stat_int5_mask_0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_int5_status_reg[] = + { + {"stat_int5_mask_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"stat_int5_mask_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"stat_int5_mask_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"stat_int5_mask_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"stat_int5_mask_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"stat_int5_mask_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"stat_int5_mask_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"stat_int5_mask_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"stat_int5_mask_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"stat_int5_mask_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"stat_int5_mask_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"stat_int5_mask_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"stat_int5_mask_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"stat_int5_mask_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"stat_int5_mask_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"stat_int5_mask_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"stat_int5_mask_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"stat_int5_mask_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"stat_int5_mask_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_rschd_ecc_bypass_reg[] = + { + {"rschd_ecc_bypass_18", DPP_FIELD_FLAG_RW, 18, 1, 0x1, 0x0}, + {"rschd_ecc_bypass_17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"rschd_ecc_bypass_16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"rschd_ecc_bypass_15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"rschd_ecc_bypass_14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"rschd_ecc_bypass_13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"rschd_ecc_bypass_12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"rschd_ecc_bypass_11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"rschd_ecc_bypass_10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"rschd_ecc_bypass_9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"rschd_ecc_bypass_8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"rschd_ecc_bypass_7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"rschd_ecc_bypass_6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"rschd_ecc_bypass_5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"rschd_ecc_bypass_4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"rschd_ecc_bypass_3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"rschd_ecc_bypass_2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"rschd_ecc_bypass_1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"rschd_ecc_bypass_0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_rschd_ecc_single_err_reg[] = + { + {"rschd_ecc_single_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"rschd_ecc_single_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"rschd_ecc_single_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"rschd_ecc_single_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"rschd_ecc_single_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"rschd_ecc_single_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"rschd_ecc_single_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"rschd_ecc_single_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"rschd_ecc_single_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"rschd_ecc_single_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"rschd_ecc_single_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"rschd_ecc_single_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"rschd_ecc_single_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"rschd_ecc_single_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"rschd_ecc_single_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"rschd_ecc_single_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"rschd_ecc_single_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"rschd_ecc_single_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"rschd_ecc_single_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_rschd_ecc_double_err_reg[] = + { + {"rschd_ecc_double_err_18", DPP_FIELD_FLAG_RC, 18, 1, 0x0, 0x0}, + {"rschd_ecc_double_err_17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"rschd_ecc_double_err_16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"rschd_ecc_double_err_15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"rschd_ecc_double_err_14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"rschd_ecc_double_err_13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"rschd_ecc_double_err_12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"rschd_ecc_double_err_11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"rschd_ecc_double_err_10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"rschd_ecc_double_err_9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"rschd_ecc_double_err_8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"rschd_ecc_double_err_7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"rschd_ecc_double_err_6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"rschd_ecc_double_err_5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"rschd_ecc_double_err_4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"rschd_ecc_double_err_3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"rschd_ecc_double_err_2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"rschd_ecc_double_err_1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"rschd_ecc_double_err_0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_wdat0_reg[] = + { + {"cpu_ind_ddr_wdat0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_wdat1_reg[] = + { + {"cpu_ind_ddr_wdat1", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_wdat2_reg[] = + { + {"cpu_ind_ddr_wdat2", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_wdat3_reg[] = + { + {"cpu_ind_ddr_wdat3", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_wdat4_reg[] = + { + {"cpu_ind_ddr_wdat4", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_wdat5_reg[] = + { + {"cpu_ind_ddr_wdat5", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_wdat6_reg[] = + { + {"cpu_ind_ddr_wdat6", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_wdat7_reg[] = + { + {"cpu_ind_ddr_wdat7", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_wdat8_reg[] = + { + {"cpu_ind_ddr_wdat8", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_wdat9_reg[] = + { + {"cpu_ind_ddr_wdat9", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_wdat10_reg[] = + { + {"cpu_ind_ddr_wdat10", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_wdat11_reg[] = + { + {"cpu_ind_ddr_wdat11", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_wdat12_reg[] = + { + {"cpu_ind_ddr_wdat12", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_wdat13_reg[] = + { + {"cpu_ind_ddr_wdat13", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_wdat14_reg[] = + { + {"cpu_ind_ddr_wdat14", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_wdat15_reg[] = + { + {"cpu_ind_ddr_wdat15", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_req_info_reg[] = + { + {"rw_mode", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + {"read_mode", DPP_FIELD_FLAG_RW, 15, 1, 0x0, 0x0}, + {"tm_cs", DPP_FIELD_FLAG_RW, 14, 1, 0x0, 0x0}, + {"rw_addr", DPP_FIELD_FLAG_RW, 13, 14, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_rd_done_reg[] = + { + {"cpu_ind_ddr_rd_done", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_rdat0_reg[] = + { + {"cpu_ind_ddr_rdat0", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_rdat1_reg[] = + { + {"cpu_ind_ddr_rdat1", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_rdat2_reg[] = + { + {"cpu_ind_ddr_rdat2", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_rdat3_reg[] = + { + {"cpu_ind_ddr_rdat3", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_rdat4_reg[] = + { + {"cpu_ind_ddr_rdat4", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_rdat5_reg[] = + { + {"cpu_ind_ddr_rdat5", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_rdat6_reg[] = + { + {"cpu_ind_ddr_rdat6", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_rdat7_reg[] = + { + {"cpu_ind_ddr_rdat7", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_rdat8_reg[] = + { + {"cpu_ind_ddr_rdat8", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_rdat9_reg[] = + { + {"cpu_ind_ddr_rdat9", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_rdat10_reg[] = + { + {"cpu_ind_ddr_rdat10", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_rdat11_reg[] = + { + {"cpu_ind_ddr_rdat11", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_rdat12_reg[] = + { + {"cpu_ind_ddr_rdat12", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_rdat13_reg[] = + { + {"cpu_ind_ddr_rdat13", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_rdat14_reg[] = + { + {"cpu_ind_ddr_rdat14", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_ind_ddr_rdat15_reg[] = + { + {"cpu_ind_ddr_rdat15", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_tm_alu_ddr_cpu_rdy_reg[] = + { + {"tm_alu_ddr_cpu_rdy", DPP_FIELD_FLAG_RO, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_ept_flag_reg[] = + { + {"ept_flag", DPP_FIELD_FLAG_RO, 5, 6, 0x3f, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_ppu_soft_rst_reg[] = + { + {"ppu_soft_rst", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_smmu0_fc15_0_cnt_reg[] = + { + {"stat_smmu0_fc15_0_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_smmu0_stat_fc15_0_cnt_reg[] = + { + {"smmu0_stat_fc15_0_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_smmu0_stat_rsp15_0_cnt_reg[] = + { + {"smmu0_stat_rsp15_0_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_smmu0_req15_0_cnt_reg[] = + { + {"stat_smmu0_req15_0_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_ppu_stat_mec5_0_rsp_fc_cnt_reg[] = + { + {"ppu_stat_mec5_0_rsp_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_ppu_mec5_0_key_fc_cnt_reg[] = + { + {"stat_ppu_mec5_0_key_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_ppu_mec5_0_rsp_cnt_reg[] = + { + {"stat_ppu_mec5_0_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_ppu_stat_mec5_0_key_cnt_reg[] = + { + {"ppu_stat_mec5_0_key_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_ppu5_0_no_exist_opcd_ex_cnt_reg[] = + { + {"ppu5_0_no_exist_opcd_ex_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_se_etm_stat_wr_fc_cnt_reg[] = + { + {"se_etm_stat_wr_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_se_etm_stat_rd_fc_cnt_reg[] = + { + {"se_etm_stat_rd_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_etm_deq_fc_cnt_reg[] = + { + {"stat_etm_deq_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_etm_enq_fc_cnt_reg[] = + { + {"stat_etm_enq_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_oam_lm_fc_cnt_reg[] = + { + {"stat_oam_lm_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_oam_stat_lm_fc_cnt_reg[] = + { + {"oam_stat_lm_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_oam_fc_cnt_reg[] = + { + {"stat_oam_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cmmu_stat_fc_cnt_reg[] = + { + {"cmmu_stat_fc_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_cmmu_req_cnt_reg[] = + { + {"stat_cmmu_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_smmu0_plcr_rsp0_cnt_reg[] = + { + {"smmu0_plcr_rsp0_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_plcr_smmu0_req0_cnt_reg[] = + { + {"plcr_smmu0_req0_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_stat_oam_lm_rsp_cnt_reg[] = + { + {"stat_oam_lm_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_oam_stat_lm_req_cnt_reg[] = + { + {"oam_stat_lm_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_oam_stat_req_cnt_reg[] = + { + {"oam_stat_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_se_etm_stat_rsp_cnt_reg[] = + { + {"se_etm_stat_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_etm_stat_se_wr_req_cnt_reg[] = + { + {"etm_stat_se_wr_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_etm_stat_se_rd_req_cnt_reg[] = + { + {"etm_stat_se_rd_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_etm_stat_smmu0_req_cnt0_reg[] = + { + {"etm_stat_smmu0_req_cnt0", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_etm_stat_smmu0_req_cnt1_reg[] = + { + {"etm_stat_smmu0_req_cnt1", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_tm_stat_eram_cpu_rsp_cnt_reg[] = + { + {"tm_stat_eram_cpu_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_rd_eram_req_cnt_reg[] = + { + {"cpu_rd_eram_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_wr_eram_req_cnt_reg[] = + { + {"cpu_wr_eram_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_tm_stat_ddr_cpu_rsp_cnt_reg[] = + { + {"tm_stat_ddr_cpu_rsp_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_rd_ddr_req_cnt_reg[] = + { + {"cpu_rd_ddr_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_stat_cfg_cpu_wr_ddr_req_cnt_reg[] = + { + {"cpu_wr_ddr_req_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_ind_wdat1_reg[] = + { + {"wdat1", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_ind_wdat2_reg[] = + { + {"wdat2", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_ind_wdat3_reg[] = + { + {"wdat3", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_ind_wdat4_reg[] = + { + {"wdat4", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_ind_wdat5_reg[] = + { + {"wdat5", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_ind_wdat6_reg[] = + { + {"wdat6", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_ind_wdat7_reg[] = + { + {"wdat7", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_ind_wdat8_reg[] = + { + {"wdat8", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_ind_wdat9_reg[] = + { + {"wdat9", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_ind_wdat10_reg[] = + { + {"wdat10", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_ind_wdat11_reg[] = + { + {"wdat11", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_ind_wdat12_reg[] = + { + {"wdat12", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_ind_wdat13_reg[] = + { + {"wdat13", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_ind_wdat14_reg[] = + { + {"wdat14", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_ind_wdat15_reg[] = + { + {"wdat15", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_ind_wdat16_reg[] = + { + {"wdat16", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_ind_wdat17_reg[] = + { + {"wdat17", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_ind_wdat18_reg[] = + { + {"wdat18", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_cpu_ind_wdat19_reg[] = + { + {"wdat19", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_t_strwc_cfg_reg[] = + { + {"t_strwc_cfg", DPP_FIELD_FLAG_RW, 1, 2, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_etcam_int_unmask_flag_reg[] = + { + {"etcam_int_unmask_flag", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_etcam_int_en0_reg[] = + { + {"etcam_int_en17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"etcam_int_en16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"etcam_int_en15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"etcam_int_en14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"etcam_int_en13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"etcam_int_en12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"etcam_int_en11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"etcam_int_en10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"etcam_int_en9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"etcam_int_en8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"etcam_int_en7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"etcam_int_en6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"etcam_int_en5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"etcam_int_en4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"etcam_int_en3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"etcam_int_en2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"etcam_int_en1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"etcam_int_en0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_etcam_int_mask0_reg[] = + { + {"etcam_int_mask17", DPP_FIELD_FLAG_RW, 17, 1, 0x1, 0x0}, + {"etcam_int_mask16", DPP_FIELD_FLAG_RW, 16, 1, 0x1, 0x0}, + {"etcam_int_mask15", DPP_FIELD_FLAG_RW, 15, 1, 0x1, 0x0}, + {"etcam_int_mask14", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"etcam_int_mask13", DPP_FIELD_FLAG_RW, 13, 1, 0x1, 0x0}, + {"etcam_int_mask12", DPP_FIELD_FLAG_RW, 12, 1, 0x1, 0x0}, + {"etcam_int_mask11", DPP_FIELD_FLAG_RW, 11, 1, 0x1, 0x0}, + {"etcam_int_mask10", DPP_FIELD_FLAG_RW, 10, 1, 0x1, 0x0}, + {"etcam_int_mask9", DPP_FIELD_FLAG_RW, 9, 1, 0x1, 0x0}, + {"etcam_int_mask8", DPP_FIELD_FLAG_RW, 8, 1, 0x1, 0x0}, + {"etcam_int_mask7", DPP_FIELD_FLAG_RW, 7, 1, 0x1, 0x0}, + {"etcam_int_mask6", DPP_FIELD_FLAG_RW, 6, 1, 0x1, 0x0}, + {"etcam_int_mask5", DPP_FIELD_FLAG_RW, 5, 1, 0x1, 0x0}, + {"etcam_int_mask4", DPP_FIELD_FLAG_RW, 4, 1, 0x1, 0x0}, + {"etcam_int_mask3", DPP_FIELD_FLAG_RW, 3, 1, 0x1, 0x0}, + {"etcam_int_mask2", DPP_FIELD_FLAG_RW, 2, 1, 0x1, 0x0}, + {"etcam_int_mask1", DPP_FIELD_FLAG_RW, 1, 1, 0x1, 0x0}, + {"etcam_int_mask0", DPP_FIELD_FLAG_RW, 0, 1, 0x1, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_etcam_int_status_reg[] = + { + {"etcam_int_status17", DPP_FIELD_FLAG_RC, 17, 1, 0x0, 0x0}, + {"etcam_int_status16", DPP_FIELD_FLAG_RC, 16, 1, 0x0, 0x0}, + {"etcam_int_status15", DPP_FIELD_FLAG_RC, 15, 1, 0x0, 0x0}, + {"etcam_int_status14", DPP_FIELD_FLAG_RC, 14, 1, 0x0, 0x0}, + {"etcam_int_status13", DPP_FIELD_FLAG_RC, 13, 1, 0x0, 0x0}, + {"etcam_int_status12", DPP_FIELD_FLAG_RC, 12, 1, 0x0, 0x0}, + {"etcam_int_status11", DPP_FIELD_FLAG_RC, 11, 1, 0x0, 0x0}, + {"etcam_int_status10", DPP_FIELD_FLAG_RC, 10, 1, 0x0, 0x0}, + {"etcam_int_status9", DPP_FIELD_FLAG_RC, 9, 1, 0x0, 0x0}, + {"etcam_int_status8", DPP_FIELD_FLAG_RC, 8, 1, 0x0, 0x0}, + {"etcam_int_status7", DPP_FIELD_FLAG_RC, 7, 1, 0x0, 0x0}, + {"etcam_int_status6", DPP_FIELD_FLAG_RC, 6, 1, 0x0, 0x0}, + {"etcam_int_status5", DPP_FIELD_FLAG_RC, 5, 1, 0x0, 0x0}, + {"etcam_int_status4", DPP_FIELD_FLAG_RC, 4, 1, 0x0, 0x0}, + {"etcam_int_status3", DPP_FIELD_FLAG_RC, 3, 1, 0x0, 0x0}, + {"etcam_int_status2", DPP_FIELD_FLAG_RC, 2, 1, 0x0, 0x0}, + {"etcam_int_status1", DPP_FIELD_FLAG_RC, 1, 1, 0x0, 0x0}, + {"etcam_int_status0", DPP_FIELD_FLAG_RC, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_int_tb_ini_ok_reg[] = + { + {"int_tb_ini_ok", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_etcam_clk_en_reg[] = + { + {"etcam_clk_en", DPP_FIELD_FLAG_RW, 7, 8, 0xff, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_as_etcam_req0_cnt_reg[] = + { + {"as_etcam_req0_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_as_etcam_req1_cnt_reg[] = + { + {"as_etcam_req1_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_etcam_as_index0_cnt_reg[] = + { + {"etcam_as_index0_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_etcam_as_index1_cnt_reg[] = + { + {"etcam_as_index1_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_etcam_not_hit0_cnt_reg[] = + { + {"etcam_not_hit0_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_etcam_not_hit1_cnt_reg[] = + { + {"etcam_not_hit1_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_table_id_not_match_cnt_reg[] = + { + {"table_id_not_match_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_table_id_clash01_cnt_reg[] = + { + {"table_id_clash01_cnt", DPP_FIELD_FLAG_RC, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_etcam_cpu_fl_reg[] = + { + {"etcam_cpu_fl", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_stat_etcam_etcam_arb_empty_reg[] = + { + {"etcam_arb_empty", DPP_FIELD_FLAG_RO, 31, 32, 0xffffffff, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_finish_int_event0_reg[] = + { + {"cfg_finish_int_event0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_finish_int_event1_reg[] = + { + {"cfg_finish_int_event1", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_finish_int_event2_reg[] = + { + {"cfg_finish_int_event2", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_finish_int_event3_reg[] = + { + {"cfg_finish_int_event3", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_finish_int_maks0_reg[] = + { + {"cfg_finish_int_mask0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_finish_int_maks1_reg[] = + { + {"cfg_finish_int_mask1", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_finish_int_maks2_reg[] = + { + {"cfg_finish_int_mask2", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_finish_int_maks3_reg[] = + { + {"cfg_finish_int_mask3", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_finish_int_test0_reg[] = + { + {"cfg_finish_int_test0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_finish_int_test1_reg[] = + { + {"cfg_finish_int_test1", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_finish_int_test2_reg[] = + { + {"cfg_finish_int_test2", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_finish_int_test3_reg[] = + { + {"cfg_finish_int_test3", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_dtb_int_to_riscv_sel_reg[] = + { + {"cfg_dtb_int_to_riscv_sel0", DPP_FIELD_FLAG_RW, 6, 7, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_dtb_ep_int_msix_enable_reg[] = + { + {"cfg_dtb_ep_int_msix_enable", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_dtb_ep_doorbell_addr_h_0_15_reg[] = + { + {"cfg_dtb_ep_doorbell_addr_h_0_15", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_dtb_ep_doorbell_addr_l_0_15_reg[] = + { + {"cfg_dtb_ep_doorbell_addr_l_0_15", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_dtb_debug_mode_en_reg[] = + { + {"cfg_dtb_debug_mode_en", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_axi_last_rd_table_addr_high_reg[] = + { + {"info_axi_last_rd_table_addr_high", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_axi_last_rd_table_addr_low_reg[] = + { + {"info_axi_last_rd_table_addr_low", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_axi_last_rd_table_len_reg[] = + { + {"info_axi_last_rd_table_len", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_axi_last_rd_table_user_reg[] = + { + {"info_rd_table_user_en", DPP_FIELD_FLAG_RO, 31, 1, 0x0, 0x0}, + {"info_rd_table_epid", DPP_FIELD_FLAG_RO, 27, 4, 0x0, 0x0}, + {"info_rd_table_vfunc_num", DPP_FIELD_FLAG_RO, 23, 8, 0x0, 0x0}, + {"info_rd_table_func_num", DPP_FIELD_FLAG_RO, 7, 3, 0x0, 0x0}, + {"info_rd_table_vfunc_active", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_axi_last_rd_table_onload_cnt_reg[] = + { + {"info_axi_last_rd_table_onload_cnt", DPP_FIELD_FLAG_RO, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cnt_axi_rd_table_resp_err_reg[] = + { + {"cnt_axi_rd_table_resp_err", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_axi_last_rd_pd_addr_high_reg[] = + { + {"info_axi_last_rd_pd_addr_high", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_axi_last_rd_pd_addr_low_reg[] = + { + {"info_axi_last_rd_pd_addr_low", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_axi_last_rd_pd_len_reg[] = + { + {"info_axi_last_rd_pd_len", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_axi_last_rd_pd_user_reg[] = + { + {"info_rd_pd_user_en", DPP_FIELD_FLAG_RO, 31, 1, 0x0, 0x0}, + {"info_rd_pd_epid", DPP_FIELD_FLAG_RO, 27, 4, 0x0, 0x0}, + {"info_rd_pd_vfunc_num", DPP_FIELD_FLAG_RO, 23, 8, 0x0, 0x0}, + {"info_rd_pd_func_num", DPP_FIELD_FLAG_RO, 7, 3, 0x0, 0x0}, + {"info_rd_pd_vfunc_active", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_axi_last_rd_pd_onload_cnt_reg[] = + { + {"info_axi_last_rd_pd_onload_cnt", DPP_FIELD_FLAG_RO, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cnt_axi_rd_pd_resp_err_reg[] = + { + {"cnt_axi_rd_pd_resp_err", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_axi_last_wr_ctrl_addr_high_reg[] = + { + {"info_axi_last_wr_ctrl_addr_high", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_axi_last_wr_ctrl_addr_low_reg[] = + { + {"info_axi_last_wr_ctrl_addr_low", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_axi_last_wr_ctrl_len_reg[] = + { + {"info_axi_last_wr_ctrl_len", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_axi_last_wr_ctrl_user_reg[] = + { + {"info_wr_ctrl_user_en", DPP_FIELD_FLAG_RO, 31, 1, 0x0, 0x0}, + {"info_wr_ctrl_epid", DPP_FIELD_FLAG_RO, 27, 4, 0x0, 0x0}, + {"info_wr_ctrl_vfunc_num", DPP_FIELD_FLAG_RO, 23, 8, 0x0, 0x0}, + {"info_wr_ctrl_func_num", DPP_FIELD_FLAG_RO, 7, 3, 0x0, 0x0}, + {"info_wr_ctrl_vfunc_active", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_axi_last_wr_ctrl_onload_cnt_reg[] = + { + {"info_axi_last_wr_ctrl_onload_cnt", DPP_FIELD_FLAG_RO, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cnt_axi_wr_ctrl_resp_err_reg[] = + { + {"cnt_axi_wr_ctrl_resp_err", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_axi_last_wr_ddr_addr_high_reg[] = + { + {"info_axi_last_wr_ddr_addr_high", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_axi_last_wr_ddr_addr_low_reg[] = + { + {"info_axi_last_wr_ddr_addr_low", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_axi_last_wr_ddr_len_reg[] = + { + {"info_axi_last_wr_ddr_len", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_axi_last_wr_ddr_user_reg[] = + { + {"info_wr_ddr_user_en", DPP_FIELD_FLAG_RO, 31, 1, 0x0, 0x0}, + {"info_wr_ddr_epid", DPP_FIELD_FLAG_RO, 27, 4, 0x0, 0x0}, + {"info_wr_ddr_vfunc_num", DPP_FIELD_FLAG_RO, 23, 8, 0x0, 0x0}, + {"info_wr_ddr_func_num", DPP_FIELD_FLAG_RO, 7, 3, 0x0, 0x0}, + {"info_wr_ddr_vfunc_active", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_axi_last_wr_ddr_onload_cnt_reg[] = + { + {"info_axi_last_wr_ddr_onload_cnt", DPP_FIELD_FLAG_RO, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cnt_axi_wr_ddr_resp_err_reg[] = + { + {"cnt_axi_wr_ddr_resp_err", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_axi_last_wr_fin_addr_high_reg[] = + { + {"info_axi_last_wr_fin_addr_high", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_axi_last_wr_fin_addr_low_reg[] = + { + {"info_axi_last_wr_fin_addr_low", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_axi_last_wr_fin_len_reg[] = + { + {"info_axi_last_wr_fin_len", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_axi_last_wr_fin_user_reg[] = + { + {"info_wr_fin_user_en", DPP_FIELD_FLAG_RO, 31, 1, 0x0, 0x0}, + {"info_wr_fin_epid", DPP_FIELD_FLAG_RO, 27, 4, 0x0, 0x0}, + {"info_wr_fin_vfunc_num", DPP_FIELD_FLAG_RO, 23, 8, 0x0, 0x0}, + {"info_wr_fin_func_num", DPP_FIELD_FLAG_RO, 7, 3, 0x0, 0x0}, + {"info_wr_fin_vfunc_active", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_axi_last_wr_fin_onload_cnt_reg[] = + { + {"info_axi_last_wr_fin_onload_cnt", DPP_FIELD_FLAG_RO, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cnt_axi_wr_fin_resp_err_reg[] = + { + {"cnt_axi_wr_fin_resp_err", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cnt_dtb_wr_smmu0_table_high_reg[] = + { + {"cnt_dtb_wr_smmu0_table_high", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cnt_dtb_wr_smmu0_table_low_reg[] = + { + {"cnt_dtb_wr_smmu0_table_low", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cnt_dtb_wr_smmu1_table_high_reg[] = + { + {"cnt_dtb_wr_smmu1_table_high", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cnt_dtb_wr_smmu1_table_low_reg[] = + { + {"cnt_dtb_wr_smmu1_table_low", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cnt_dtb_wr_zcam_table_high_reg[] = + { + {"cnt_dtb_wr_zcam_table_high", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cnt_dtb_wr_zcam_table_low_reg[] = + { + {"cnt_dtb_wr_zcam_table_low", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cnt_dtb_wr_etcam_table_high_reg[] = + { + {"cnt_dtb_wr_etcam_table_high", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cnt_dtb_wr_etcam_table_low_reg[] = + { + {"cnt_dtb_wr_etcam_table_low", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cnt_dtb_wr_hash_table_high_reg[] = + { + {"cnt_dtb_wr_hash_table_high", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cnt_dtb_wr_hash_table_low_reg[] = + { + {"cnt_dtb_wr_hash_table_low", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cnt_dtb_rd_smmu0_table_high_reg[] = + { + {"cnt_dtb_rd_smmu0_table_high", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cnt_dtb_rd_smmu0_table_low_reg[] = + { + {"cnt_dtb_rd_smmu0_table_low", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cnt_dtb_rd_smmu1_table_high_reg[] = + { + {"cnt_dtb_rd_smmu1_table_high", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cnt_dtb_rd_smmu1_table_low_reg[] = + { + {"cnt_dtb_rd_smmu1_table_low", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cnt_dtb_rd_zcam_table_high_reg[] = + { + {"cnt_dtb_rd_zcam_table_high", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cnt_dtb_rd_zcam_table_low_reg[] = + { + {"cnt_dtb_rd_zcam_table_low", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cnt_dtb_rd_etcam_table_high_reg[] = + { + {"cnt_dtb_rd_etcam_table_high", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cnt_dtb_rd_etcam_table_low_reg[] = + { + {"cnt_dtb_rd_etcam_table_low", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_wr_ctrl_state_reg[] = + { + {"info_wr_ctrl_state", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_rd_table_state_reg[] = + { + {"info_rd_table_state", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_rd_pd_state_reg[] = + { + {"info_rd_pd_state", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_dump_cmd_state_reg[] = + { + {"info_dump_cmd_state", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_info_wr_ddr_state_reg[] = + { + {"info_wr_ddr_state", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_cfg_cfg_dtb_debug_info_clr_reg[] = + { + {"cfg_dtb_debug_info_clr", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_ddos_cfg_ddos_stat_dump_thrd_0_15_reg[] = + { + {"cfg_ddos_stat_dump_thrd", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_ddos_cfg_ddos_stat_dump_thrd_comp_en_reg[] = + { + {"cfg_ddos_stat_dump_thrd_comp_en", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_ddos_cfg_ddos_dump_stat_num_reg[] = + { + {"cfg_ddos_dump_stat_num", DPP_FIELD_FLAG_RW, 23, 24, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_ddos_cfg_ddos_even_hash_table_baddr_reg[] = + { + {"cfg_ddos_even_hash_table_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_ddos_cfg_ddos_odd_hash_table_baddr_reg[] = + { + {"cfg_ddos_odd_hash_table_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_ddos_cfg_ddos_stat_index_offset_reg[] = + { + {"cfg_ddos_stat_index_offset", DPP_FIELD_FLAG_RW, 18, 19, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_ddos_cfg_ddos_ns_flag_cnt_reg[] = + { + {"cfg_ddos_ns_flag_cnt", DPP_FIELD_FLAG_RW, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_ddos_cfg_ddos_even_stat_table_baddr_reg[] = + { + {"cfg_ddos_even_stat_table_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_ddos_cfg_ddos_odd_stat_table_baddr_reg[] = + { + {"cfg_ddos_odd_stat_table_baddr", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_ddos_cfg_ddos_even_stat_dump_daddr_h_reg[] = + { + {"cfg_ddos_even_stat_dump_daddr_h", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_ddos_cfg_ddos_even_stat_dump_daddr_l_reg[] = + { + {"cfg_ddos_even_stat_dump_daddr_l", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_ddos_cfg_ddos_odd_stat_dump_daddr_h_reg[] = + { + {"cfg_ddos_odd_stat_dump_daddr_h", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_ddos_cfg_ddos_odd_stat_dump_daddr_l_reg[] = + { + {"cfg_ddos_odd_stat_dump_daddr_l", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_ddos_cfg_ddos_work_mode_enable_reg[] = + { + {"cfg_ddos_mode_work_enable", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_ddos_cfg_ddos_stat_table_len_reg[] = + { + {"cfg_ddos_stat_table_len", DPP_FIELD_FLAG_RW, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_ddos_cfg_ddos_hash_table_len_reg[] = + { + {"cfg_ddos_hash_table_len", DPP_FIELD_FLAG_RW, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_ram_traf_ctrl_ram0_0_255_reg[] = + { + {"traf_ctrl_ram0_0_255", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_ram_traf_ctrl_ram1_0_255_reg[] = + { + {"traf_ctrl_ram1_0_255", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_ram_traf_ctrl_ram2_0_255_reg[] = + { + {"traf_ctrl_ram2_0_255", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_ram_traf_ctrl_ram3_0_255_reg[] = + { + {"traf_ctrl_ram3_0_255", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_ram_traf_ctrl_ram4_0_255_reg[] = + { + {"traf_ctrl_ram4_0_255", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_ram_traf_ctrl_ram5_0_63_reg[] = + { + {"traf_ctrl_ram5_0_63", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_ram_dump_pd_ram_0_2047_reg[] = + { + {"dump_pd_ram_0_2047", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_ram_rd_ctrl_ram_0_4095_reg[] = + { + {"rd_ctrl_ram_0_4095", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_ram_rd_table_ram_0_8191_reg[] = + { + {"rd_table_ram_0_8191", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_dtb_dtb_ram_dtb_cmd_man_ram_0_16383_reg[] = + { + {"dtb_cmd_man_ram_0_16383", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpg_ms_st_reg[] = + { + {"cpu_trpgrx_ms_st", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpg_ms_ind_reg[] = + { + {"cpu_trpgrx_ms_ind", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpg_ms_slave_ind_reg[] = + { + {"cpu_trpgrx_ms_slave_ind", DPP_FIELD_FLAG_RW, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpgrx_up_water_level_reg[] = + { + {"cpu_trpgrx_up_water_level", DPP_FIELD_FLAG_RW, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_rx_port_cpu_trpgrx_low_water_level_reg[] = + { + {"cpu_trpgrx_low_water_level", DPP_FIELD_FLAG_RW, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_port_cpu_trpg_ms_st_reg[] = + { + {"cpu_trpgtx_ms_st", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_port_cpu_trpg_ms_ind_reg[] = + { + {"cpu_trpgtx_ms_ind", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_port_cpu_trpg_ms_slave_ind_reg[] = + { + {"cpu_trpgtx_ms_slave_ind", DPP_FIELD_FLAG_RW, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_glb_cpu_todtime_update_int_event_reg[] = + { + {"cpu_todtime_update_int_event", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_glb_cpu_todtime_update_int_test_reg[] = + { + {"cpu_todtime_update_int_test", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_glb_cpu_todtime_update_int_addr_reg[] = + { + {"cpu_todtime_update_int_addr", DPP_FIELD_FLAG_RO, 10, 11, 0x0, 0x0}, + }; +DPP_FIELD_T g_trpg_trpg_tx_todtime_ram_trpg_tx_todtime_ram_reg[] = + { + {"trpg_tx_todtime_ram", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_tsn_tsn_port_cfg_tsn_test_reg_reg[] = + { + {"cfg_tsn_test_reg", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_tsn_tsn_port_cfg_tsn_port_qbv_enable_reg[] = + { + {"cfg_tsn_port_qbv_enable", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_tsn_tsn_port_cfg_tsn_phy_port_sel_reg[] = + { + {"cfg_tsn_phy_port_sel", DPP_FIELD_FLAG_RW, 3, 4, 0xf, 0x0}, + }; +DPP_FIELD_T g_tsn_tsn_port_cfg_tsn_port_time_sel_reg[] = + { + {"cfg_tsn_port_time_sel", DPP_FIELD_FLAG_RW, 1, 2, 0x0, 0x0}, + }; +DPP_FIELD_T g_tsn_tsn_port_cfg_tsn_clk_freq_reg[] = + { + {"en", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + {"cfg_tsn_clk_freq", DPP_FIELD_FLAG_RW, 30, 31, 0x64, 0x0}, + }; +DPP_FIELD_T g_tsn_tsn_port_cfg_tsn_read_ram_n_reg[] = + { + {"cfg_tsn_data", DPP_FIELD_FLAG_RO, 15, 8, 0x0, 0x0}, + {"cfg_tsn_read_status", DPP_FIELD_FLAG_RO, 5, 4, 0x0, 0x0}, + {"cfg_tsn_read_ram_n", DPP_FIELD_FLAG_RO, 1, 2, 0x0, 0x0}, + }; +DPP_FIELD_T g_tsn_tsn_port_cfg_tsn_exe_time_reg[] = + { + {"cfg_tsn_exe_time", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_tsn_tsn_port_cfg_tsn_port_itr_shift_reg[] = + { + {"cfg_tsn_port_itr_shift", DPP_FIELD_FLAG_RW, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_tsn_tsn_port_cfg_tsn_port_base_time_h_reg[] = + { + {"cfg_tsn_port_base_time_h", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_tsn_tsn_port_cfg_tsn_port_base_time_l_reg[] = + { + {"cfg_tsn_port_base_time_l", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_tsn_tsn_port_cfg_tsn_port_cycle_time_h_reg[] = + { + {"cfg_tsn_port_cycle_time_h", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_tsn_tsn_port_cfg_tsn_port_cycle_time_l_reg[] = + { + {"cfg_tsn_port_cycle_time_l", DPP_FIELD_FLAG_RW, 19, 20, 0x0, 0x0}, + }; +DPP_FIELD_T g_tsn_tsn_port_cfg_tsn_port_guard_band_time_reg[] = + { + {"cfg_tsn_port_guard_band_time", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_tsn_tsn_port_cfg_tsn_port_default_gate_en_reg[] = + { + {"cfg_tsn_port_default_gate_en", DPP_FIELD_FLAG_RW, 7, 8, 0xff, 0x0}, + }; +DPP_FIELD_T g_tsn_tsn_port_cfg_tsn_port_change_gate_en_reg[] = + { + {"cfg_tsn_port_change_gate_en", DPP_FIELD_FLAG_RW, 7, 8, 0xff, 0x0}, + }; +DPP_FIELD_T g_tsn_tsn_port_cfg_tsn_port_init_finish_reg[] = + { + {"cfg_tsn_port_init_finish", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_tsn_tsn_port_cfg_tsn_port_change_en_reg[] = + { + {"cfg_tsn_port_change_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_tsn_tsn_port_cfg_tsn_port_gcl_num0_reg[] = + { + {"cfg_tsn_port_gcl_num0", DPP_FIELD_FLAG_RW, 8, 9, 0x0, 0x0}, + }; +DPP_FIELD_T g_tsn_tsn_port_cfg_tsn_port_gcl_num1_reg[] = + { + {"cfg_tsn_port_gcl_num1", DPP_FIELD_FLAG_RW, 8, 9, 0x0, 0x0}, + }; +DPP_FIELD_T g_tsn_tsn_port_cfg_tsn_port_gcl_value0_reg[] = + { + {"cfg_tsn_port_gcl_gate_control0", DPP_FIELD_FLAG_RW, 31, 8, 0x0, 0x0}, + {"cfg_tsn_port_gcl_interval_time0", DPP_FIELD_FLAG_RW, 23, 24, 0x0, 0x0}, + }; +DPP_FIELD_T g_tsn_tsn_port_cfg_tsn_port_gcl_value1_reg[] = + { + {"cfg_tsn_port_gcl_gate_control1", DPP_FIELD_FLAG_RW, 31, 8, 0x0, 0x0}, + {"cfg_tsn_port_gcl_interval_time1", DPP_FIELD_FLAG_RW, 23, 24, 0x0, 0x0}, + }; +DPP_FIELD_T g_axi_axi_conv_cfg_epid_v_func_num_reg[] = + { + {"user_en", DPP_FIELD_FLAG_RW, 31, 1, 0x0, 0x0}, + {"cfg_epid", DPP_FIELD_FLAG_RW, 27, 4, 0x0, 0x0}, + {"cfg_vfunc_num", DPP_FIELD_FLAG_RW, 23, 8, 0x0, 0x0}, + {"cfg_func_num", DPP_FIELD_FLAG_RW, 7, 3, 0x0, 0x0}, + {"cfg_vfunc_active", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_axi_axi_conv_info_axim_rw_hsk_cnt_reg[] = + { + {"axim_rd_handshake_cnt", DPP_FIELD_FLAG_RO, 24, 9, 0x0, 0x0}, + {"axim_wr_handshake_cnt", DPP_FIELD_FLAG_RO, 8, 9, 0x0, 0x0}, + }; +DPP_FIELD_T g_axi_axi_conv_info_axim_last_wr_id_reg[] = + { + {"axim_rd_id", DPP_FIELD_FLAG_RO, 24, 9, 0x0, 0x0}, + {"axim_wr_id", DPP_FIELD_FLAG_RO, 8, 9, 0x0, 0x0}, + }; +DPP_FIELD_T g_axi_axi_conv_info_axim_last_wr_addr_h_reg[] = + { + {"aximlastwraddrhigh", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_axi_axi_conv_info_axim_last_wr_addr_l_reg[] = + { + {"aximlastrdaddrlow", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_axi_axi_conv_cfg_debug_info_clr_en_reg[] = + { + {"cfg_global_clr_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_pp1s_interrupt_reg[] = + { + {"int_state", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"int_test", DPP_FIELD_FLAG_RW, 2, 1, 0x0, 0x0}, + {"int_clr", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"int_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_pp1s_external_select_reg[] = + { + {"pp1s_external_select", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_pp1s_out_select_reg[] = + { + {"pp1s_out_sel", DPP_FIELD_FLAG_RW, 1, 2, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_test_pp1s_select_reg[] = + { + {"test_pp1s_sel", DPP_FIELD_FLAG_RW, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_local_pp1s_en_reg[] = + { + {"local_pp1s_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_local_pp1s_adjust_reg[] = + { + {"local_pp1s_adjust_sel", DPP_FIELD_FLAG_RW, 2, 2, 0x0, 0x0}, + {"local_pp1s_adjust_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_local_pp1s_adjust_value_reg[] = + { + {"local_pp1s_adjust_value", DPP_FIELD_FLAG_RW, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_pp1s_to_np_select_reg[] = + { + {"pp1s_to_np_sel", DPP_FIELD_FLAG_RW, 1, 2, 0x3, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_pd_u1_sel_reg[] = + { + {"pd_u1_sel1", DPP_FIELD_FLAG_RW, 5, 3, 0x0, 0x0}, + {"pd_u1_sel0", DPP_FIELD_FLAG_RW, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_pd_u1_pd0_shift_reg[] = + { + {"pd_u1_pd0_shift", DPP_FIELD_FLAG_RW, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_pd_u1_pd1_shift_reg[] = + { + {"pd_u1_pd1_shift", DPP_FIELD_FLAG_RW, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_pd_u1_result_reg[] = + { + {"pd_u1_result_sign", DPP_FIELD_FLAG_RO, 30, 1, 0x0, 0x0}, + {"pd_u1_overflow", DPP_FIELD_FLAG_RO, 29, 1, 0x0, 0x0}, + {"pd_u1_result", DPP_FIELD_FLAG_RO, 28, 29, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_pd_u2_sel_reg[] = + { + {"pd_u2_sel1", DPP_FIELD_FLAG_RW, 5, 3, 0x0, 0x0}, + {"pd_u2_sel0", DPP_FIELD_FLAG_RW, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_pd_u2_pd0_shift_reg[] = + { + {"pd_u2_pd0_shift", DPP_FIELD_FLAG_RW, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_pd_u2_pd1_shift_reg[] = + { + {"pd_u2_pd1_shift", DPP_FIELD_FLAG_RW, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_pd_u2_result_reg[] = + { + {"pd_u2_result_sign", DPP_FIELD_FLAG_RO, 30, 1, 0x0, 0x0}, + {"pd_u2_overflow", DPP_FIELD_FLAG_RO, 29, 1, 0x0, 0x0}, + {"pd_u2_result", DPP_FIELD_FLAG_RO, 28, 29, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_tsn_group_nanosecond_delay0_reg[] = + { + {"tsn_group_nanosecond_delay0", DPP_FIELD_FLAG_RW, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_tsn_group_fracnanosecond_delay0_reg[] = + { + {"tsn_group_fracnanosecond_delay0", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_tsn_group_nanosecond_delay1_reg[] = + { + {"tsn_group_nanosecond_delay1", DPP_FIELD_FLAG_RW, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_tsn_group_fracnanosecond_delay1_reg[] = + { + {"tsn_group_fracnanosecond_delay1", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_tsn_group_nanosecond_delay2_reg[] = + { + {"tsn_group_nanosecond_delay2", DPP_FIELD_FLAG_RW, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_tsn_group_fracnanosecond_delay2_reg[] = + { + {"tsn_group_fracnanosecond_delay2", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_tsn_group_nanosecond_delay3_reg[] = + { + {"tsn_group_nanosecond_delay3", DPP_FIELD_FLAG_RW, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_tsn_group_fracnanosecond_delay3_reg[] = + { + {"tsn_group_fracnanosecond_delay3", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_tsn_ptp1588_rdma_nanosecond_delay_reg[] = + { + {"ptp1588_rdma_nanosecond_delay", DPP_FIELD_FLAG_RW, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_ptp1588_rdma_fracnanosecond_delay_reg[] = + { + {"ptp1588_rdma_fracnanosecond_delay", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_ptp1588_np_nanosecond_delay_reg[] = + { + {"ptp1588_np_nanosecond_delay", DPP_FIELD_FLAG_RW, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_ptp1588_np_fracnanosecond_delay_reg[] = + { + {"ptp1588_np_fracnanosecond_delay", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptp_top_time_sync_period_reg[] = + { + {"time_sync_period", DPP_FIELD_FLAG_RW, 2, 3, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_module_id_reg[] = + { + {"module_id", DPP_FIELD_FLAG_RO, 15, 16, 0x89, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_module_version_reg[] = + { + {"module_major_version", DPP_FIELD_FLAG_RO, 15, 8, 0x3, 0x0}, + {"module_minor_version", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_module_date_reg[] = + { + {"year", DPP_FIELD_FLAG_RO, 31, 16, 0x2017, 0x0}, + {"month", DPP_FIELD_FLAG_RO, 15, 8, 0x1, 0x0}, + {"date", DPP_FIELD_FLAG_RO, 7, 8, 0x1, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_interrupt_status_reg[] = + { + {"pps_in_status", DPP_FIELD_FLAG_RO, 4, 1, 0x0, 0x0}, + {"fifo_almost_full_status", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"fifo_no_empty_status", DPP_FIELD_FLAG_RO, 2, 1, 0x0, 0x0}, + {"trigger_output_status", DPP_FIELD_FLAG_RO, 1, 1, 0x0, 0x0}, + {"trigger_input_status", DPP_FIELD_FLAG_RO, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_interrupt_event_reg[] = + { + {"pps_in_event", DPP_FIELD_FLAG_RW, 4, 1, 0x0, 0x0}, + {"fifo_almost_full_event", DPP_FIELD_FLAG_RW, 3, 1, 0x0, 0x0}, + {"fifo_no_empty_event", DPP_FIELD_FLAG_RW, 2, 1, 0x0, 0x0}, + {"trigger_output_event", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"trigger_input_event", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_interrupt_mask_reg[] = + { + {"pps_in_event_mask", DPP_FIELD_FLAG_RW, 4, 1, 0x0, 0x0}, + {"fifo_almost_full_event_mask", DPP_FIELD_FLAG_RW, 3, 1, 0x0, 0x0}, + {"fifo_no_empty_event_mask", DPP_FIELD_FLAG_RW, 2, 1, 0x0, 0x0}, + {"trigger_output_event_mask", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"trigger_input_eventt_mask", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_interrupt_test_reg[] = + { + {"trigger_pps_in_event_test", DPP_FIELD_FLAG_RW, 4, 1, 0x0, 0x0}, + {"trigger_fifo_almost_full_event_test", DPP_FIELD_FLAG_RW, 3, 1, 0x0, 0x0}, + {"trigger_fifo_no_empty_event_test", DPP_FIELD_FLAG_RW, 2, 1, 0x0, 0x0}, + {"trigger_output_event_test", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"trigger_input_event_test", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_hw_clock_cycle_integer_reg[] = + { + {"integeral_nanosecond_of_hw_clock_cycle", DPP_FIELD_FLAG_RW, 7, 8, 0x1, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_hw_clock_cycle_fraction_reg[] = + { + {"fractional_nanosecond_of_hw_clock_cycle", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_ptp_clock_cycle_integer_reg[] = + { + {"integeral_nanosecond_of_ptp_clock_cycle", DPP_FIELD_FLAG_RW, 7, 8, 0x1, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_ptp_clock_cycle_fraction_reg[] = + { + {"fractional_nanosecond_of_ptp_clock_cycle", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_ptp_configuration_reg[] = + { + {"trig_oe", DPP_FIELD_FLAG_RW, 18, 1, 0x0, 0x0}, + {"hw_time_update_en", DPP_FIELD_FLAG_RW, 17, 1, 0x0, 0x0}, + {"ptp1588_tod_time_update_en", DPP_FIELD_FLAG_RW, 16, 1, 0x0, 0x0}, + {"timer_enable", DPP_FIELD_FLAG_RW, 15, 1, 0x0, 0x0}, + {"pps_output_enable", DPP_FIELD_FLAG_RW, 14, 1, 0x1, 0x0}, + {"pp1_output_enable", DPP_FIELD_FLAG_RW, 13, 1, 0x0, 0x0}, + {"pp2_output_enable", DPP_FIELD_FLAG_RW, 12, 1, 0x0, 0x0}, + {"enable_writing_timestamps_to_the_fifo", DPP_FIELD_FLAG_RW, 11, 1, 0x0, 0x0}, + {"l2s_time_output_select", DPP_FIELD_FLAG_RW, 10, 1, 0x0, 0x0}, + {"reserved_9", DPP_FIELD_FLAG_RO, 9, 1, 0x0, 0x0}, + {"pps_input_select", DPP_FIELD_FLAG_RW, 8, 1, 0x0, 0x0}, + {"pp_output_select", DPP_FIELD_FLAG_RW, 7, 1, 0x0, 0x0}, + {"reserved_6", DPP_FIELD_FLAG_RO, 6, 1, 0x0, 0x0}, + {"timer_run_mode", DPP_FIELD_FLAG_RW, 5, 2, 0x0, 0x0}, + {"update_command_select", DPP_FIELD_FLAG_RW, 3, 1, 0x0, 0x0}, + {"trigger_out_enable", DPP_FIELD_FLAG_RW, 2, 1, 0x0, 0x0}, + {"trigger_in_enable", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"timer_capture_slave_mode", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_timer_control_reg[] = + { + {"ptpmoutputsynchroningstate", DPP_FIELD_FLAG_RO, 3, 1, 0x0, 0x0}, + {"ptp1588_fifo_read_command", DPP_FIELD_FLAG_RW, 2, 1, 0x0, 0x0}, + {"adjust_the_timer", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_pps_income_delay_reg[] = + { + {"pps_income_delay_nanosecond", DPP_FIELD_FLAG_RW, 31, 16, 0x0, 0x0}, + {"pps_income_delay_frac_nanosecond", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_clock_cycle_update_reg[] = + { + {"tsn3_clock_cycle_update_enable", DPP_FIELD_FLAG_RW, 4, 1, 0x0, 0x0}, + {"tsn2_clock_cycle_update_enable", DPP_FIELD_FLAG_RW, 3, 1, 0x0, 0x0}, + {"tsn1_clock_cycle_update_enable", DPP_FIELD_FLAG_RW, 2, 1, 0x0, 0x0}, + {"tsn0_clock_cycle_update_enable", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"ptp1588_clock_cycle_update_enable", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_cycle_time_of_output_period_pulse_1_reg[] = + { + {"clock_number_of_output_period_pulse_1", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_cycle_time_of_output_period_pulse_2_reg[] = + { + {"clock_number_of_output_period_pulse_2", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_timer_latch_en_reg[] = + { + {"latch_the_timer_en", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_timer_latch_sel_reg[] = + { + {"timer_latch_sel", DPP_FIELD_FLAG_RW, 5, 6, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_trigger_in_tod_nanosecond_reg[] = + { + {"trigger_in_tod_nanosecond", DPP_FIELD_FLAG_RO, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_trigger_in_lower_tod_second_reg[] = + { + {"trigger_in_lower_tod_second", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_trigger_in_high_tod_second_reg[] = + { + {"trigger_in_high_tod_second", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_trigger_in_fracnanosecond_reg[] = + { + {"trigger_in_fracnanosecond", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_trigger_in_hardware_time_low_reg[] = + { + {"trigger_in_hardware_time_low", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_trigger_in_hardware_time_high_reg[] = + { + {"trigger_in_hardware_time_high", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_trigger_out_tod_nanosecond_reg[] = + { + {"trigger_out_tod_nanosecond", DPP_FIELD_FLAG_RW, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_trigger_out_lower_tod_second_reg[] = + { + {"trigger_out_lower_tod_second", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_trigger_out_high_tod_second_reg[] = + { + {"trigger_out_high_tod_second", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_trigger_out_hardware_time_low_reg[] = + { + {"trigger_out_hardware_time_low", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_trigger_out_hardware_time_high_reg[] = + { + {"trigger_out_hardware_time_high", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_adjust_tod_nanosecond_reg[] = + { + {"adjust_tod_nanosecond", DPP_FIELD_FLAG_RW, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_adjust_lower_tod_second_reg[] = + { + {"adjust_lower_tod_second", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_adjust_high_tod_second_reg[] = + { + {"adjust_high_tod_second", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_adjust_fracnanosecond_reg[] = + { + {"adjust_fracnanosecond", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_adjust_hardware_time_low_reg[] = + { + {"adjust_hardware_time_low", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_adjust_hardware_time_high_reg[] = + { + {"adjust_hardware_time_high", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_latch_tod_nanosecond_reg[] = + { + {"latch_tod_nanosecond", DPP_FIELD_FLAG_RO, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_latch_lower_tod_second_reg[] = + { + {"latch_lower_tod_second", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_latch_high_tod_second_reg[] = + { + {"latch_high_tod_second", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_latch_fracnanosecond_reg[] = + { + {"latch_fracnanosecond", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_latch_hardware_time_low_reg[] = + { + {"latch_hardware_time_low", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_latch_hardware_time_high_reg[] = + { + {"latch_hardware_time_high", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_real_tod_nanosecond_reg[] = + { + {"real_tod_nanosecond", DPP_FIELD_FLAG_RO, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_real_lower_tod_second_reg[] = + { + {"real_lower_tod_second", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_real_high_tod_second_reg[] = + { + {"real_high_tod_second", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_real_hardware_time_low_reg[] = + { + {"real_hardware_time_low", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_real_hardware_time_high_reg[] = + { + {"real_hardware_time_high", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_ptp1588_event_message_port_reg[] = + { + {"ptp1588_event_message_port", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_ptp1588_event_message_timestamp_low_reg[] = + { + {"ptp1588_event_message_timestamp_low", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_ptp1588_event_message_timestamp_high_reg[] = + { + {"ptp1588_event_message_timestamp_high", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_ptp1588_event_message_fifo_status_reg[] = + { + {"fifo_full", DPP_FIELD_FLAG_RO, 9, 1, 0x0, 0x0}, + {"fifo_empty", DPP_FIELD_FLAG_RO, 8, 1, 0x1, 0x0}, + {"timestamps_count", DPP_FIELD_FLAG_RO, 7, 8, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_pp1s_latch_tod_nanosecond_reg[] = + { + {"latch_1588tod_nanosecond", DPP_FIELD_FLAG_RO, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_pp1s_latch_lower_tod_second_reg[] = + { + {"latch_lower_1588tod_second", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_pp1s_latch_high_tod_second_reg[] = + { + {"latch_high_1588tod_second", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_pp1s_latch_fracnanosecond_reg[] = + { + {"latch_1588fracnanosecond", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn_time_configuration_reg[] = + { + {"tsn_pps_enable", DPP_FIELD_FLAG_RW, 19, 4, 0x0, 0x0}, + {"tsn_timer_enable", DPP_FIELD_FLAG_RW, 15, 4, 0x0, 0x0}, + {"tsn_timer_run_mode", DPP_FIELD_FLAG_RW, 11, 8, 0x0, 0x0}, + {"timer_capture_slave_mode", DPP_FIELD_FLAG_RW, 3, 4, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn_timer_control_reg[] = + { + {"adjust_the_tsn3_timer", DPP_FIELD_FLAG_RW, 3, 1, 0x0, 0x0}, + {"adjust_the_tsn2_timer", DPP_FIELD_FLAG_RW, 2, 1, 0x0, 0x0}, + {"adjust_the_tsn1_timer", DPP_FIELD_FLAG_RW, 1, 1, 0x0, 0x0}, + {"adjust_the_tsn0_timer", DPP_FIELD_FLAG_RW, 0, 1, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn0_clock_cycle_integer_reg[] = + { + {"integeral_nanosecond_of_tsn0_clock_cycle", DPP_FIELD_FLAG_RW, 7, 8, 0x1, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn0_clock_cycle_fraction_reg[] = + { + {"fractional_nanosecond_of_tsn0_clock_cycle", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn1_clock_cycle_integer_reg[] = + { + {"integeral_nanosecond_of_tsn1_clock_cycle", DPP_FIELD_FLAG_RW, 7, 8, 0x1, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn1_clock_cycle_fraction_reg[] = + { + {"fractional_nanosecond_of_tsn1_clock_cycle", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn2_clock_cycle_integer_reg[] = + { + {"integeral_nanosecond_of_tsn2_clock_cycle", DPP_FIELD_FLAG_RW, 7, 8, 0x1, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn2_clock_cycle_fraction_reg[] = + { + {"fractional_nanosecond_of_tsn2_clock_cycle", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn3_clock_cycle_integer_reg[] = + { + {"integeral_nanosecond_of_tsn3_clock_cycle", DPP_FIELD_FLAG_RW, 7, 8, 0x1, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn3_clock_cycle_fraction_reg[] = + { + {"fractional_nanosecond_of_tsn3_clock_cycle", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn0_adjust_tod_nanosecond_reg[] = + { + {"tsn0_adjust_tod_nanosecond", DPP_FIELD_FLAG_RW, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn0_adjust_lower_tod_second_reg[] = + { + {"tsn0_adjust_lower_tod_second", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn0_adjust_high_tod_second_reg[] = + { + {"tsn0_adjust_high_tod_second", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn0_adjust_fracnanosecond_reg[] = + { + {"tsn0_adjust_fracnanosecond", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn1_adjust_tod_nanosecond_reg[] = + { + {"tsn1_adjust_tod_nanosecond", DPP_FIELD_FLAG_RW, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn1_adjust_lower_tod_second_reg[] = + { + {"tsn1_adjust_lower_tod_second", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn1_adjust_high_tod_second_reg[] = + { + {"tsn1_adjust_high_tod_second", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn1_adjust_fracnanosecond_reg[] = + { + {"tsn1_adjust_fracnanosecond", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn2_adjust_tod_nanosecond_reg[] = + { + {"tsn2_adjust_tod_nanosecond", DPP_FIELD_FLAG_RW, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn2_adjust_lower_tod_second_reg[] = + { + {"tsn2_adjust_lower_tod_second", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn2_adjust_high_tod_second_reg[] = + { + {"tsn2_adjust_high_tod_second", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn2_adjust_fracnanosecond_reg[] = + { + {"tsn2_adjust_fracnanosecond", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn3_adjust_tod_nanosecond_reg[] = + { + {"tsn3_adjust_tod_nanosecond", DPP_FIELD_FLAG_RW, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn3_adjust_lower_tod_second_reg[] = + { + {"tsn3_adjust_lower_tod_second", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn3_adjust_high_tod_second_reg[] = + { + {"tsn3_adjust_high_tod_second", DPP_FIELD_FLAG_RW, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn3_adjust_fracnanosecond_reg[] = + { + {"tsn3_adjust_fracnanosecond", DPP_FIELD_FLAG_RW, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn0_latch_tod_nanosecond_reg[] = + { + {"tsn0_latch_tod_nanosecond", DPP_FIELD_FLAG_RO, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn0_latch_lower_tod_second_reg[] = + { + {"tsn0_latch_lower_tod_second", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn0_latch_high_tod_second_reg[] = + { + {"tsn0_latch_high_tod_second", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn0_latch_fracnanosecond_reg[] = + { + {"tsn0_latch_fracnanosecond", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn1_latch_tod_nanosecond_reg[] = + { + {"tsn1_latch_tod_nanosecond", DPP_FIELD_FLAG_RO, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn1_latch_lower_tod_second_reg[] = + { + {"tsn1_latch_lower_tod_second", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn1_latch_high_tod_second_reg[] = + { + {"tsn1_latch_high_tod_second", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn1_latch_fracnanosecond_reg[] = + { + {"tsn1_latch_fracnanosecond", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn2_latch_tod_nanosecond_reg[] = + { + {"tsn2_latch_tod_nanosecond", DPP_FIELD_FLAG_RO, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn2_latch_lower_tod_second_reg[] = + { + {"tsn2_latch_lower_tod_second", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn2_latch_high_tod_second_reg[] = + { + {"tsn2_latch_high_tod_second", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn2_latch_fracnanosecond_reg[] = + { + {"tsn2_latch_fracnanosecond", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn3_latch_tod_nanosecond_reg[] = + { + {"tsn3_latch_tod_nanosecond", DPP_FIELD_FLAG_RO, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn3_latch_lower_tod_second_reg[] = + { + {"tsn3_latch_lower_tod_second", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn3_latch_high_tod_second_reg[] = + { + {"tsn3_latch_high_tod_second", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn3_latch_fracnanosecond_reg[] = + { + {"tsn3_latch_fracnanosecond", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_pp1s_latch_tsn0_tod_nanosecond_reg[] = + { + {"latch_tsn0_tod_nanosecond", DPP_FIELD_FLAG_RO, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_pp1s_latch_tsn0_lower_tod_second_reg[] = + { + {"latch_lower_tsn0_tod_second", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_pp1s_latch_tsn0_high_tod_second_reg[] = + { + {"latch_high_tsn0_tod_second", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_pp1s_latch_tsn0_fracnanosecond_reg[] = + { + {"latch_tsn0_fracnanosecond", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_pp1s_latch_tsn1_tod_nanosecond_reg[] = + { + {"latch_tsn1_tod_nanosecond", DPP_FIELD_FLAG_RO, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_pp1s_latch_tsn1_lower_tod_second_reg[] = + { + {"latch_lower_tsn1_tod_second", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_pp1s_latch_tsn1_high_tod_second_reg[] = + { + {"latch_high_tsn1_tod_second", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_pp1s_latch_tsn1_fracnanosecond_reg[] = + { + {"latch_tsn1_fracnanosecond", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_pp1s_latch_tsn2_tod_nanosecond_reg[] = + { + {"latch_tsn2_tod_nanosecond", DPP_FIELD_FLAG_RO, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_pp1s_latch_tsn2_lower_tod_second_reg[] = + { + {"latch_lower_tsn2_tod_second", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_pp1s_latch_tsn2_high_tod_second_reg[] = + { + {"latch_high_tsn2_tod_second", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_pp1s_latch_tsn2_fracnanosecond_reg[] = + { + {"latch_tsn2_fracnanosecond", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_pp1s_latch_tsn3_tod_nanosecond_reg[] = + { + {"latch_tsn3_tod_nanosecond", DPP_FIELD_FLAG_RO, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_pp1s_latch_tsn3_lower_tod_second_reg[] = + { + {"latch_lower_tsn3_tod_second", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_pp1s_latch_tsn3_high_tod_second_reg[] = + { + {"latch_high_tsn3_tod_second", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_pp1s_latch_tsn3_fracnanosecond_reg[] = + { + {"latch_tsn3_fracnanosecond", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn0_real_tod_nanosecond_reg[] = + { + {"tsn0_real_tod_nanosecond", DPP_FIELD_FLAG_RO, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn0_real_lower_tod_second_reg[] = + { + {"tsn0_real_lower_tod_second", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn0_real_high_tod_second_reg[] = + { + {"tsn0_real_high_tod_second", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn1_real_tod_nanosecond_reg[] = + { + {"tsn1_real_tod_nanosecond", DPP_FIELD_FLAG_RO, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn1_real_lower_tod_second_reg[] = + { + {"tsn1_real_lower_tod_second", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn1_real_high_tod_second_reg[] = + { + {"tsn1_real_high_tod_second", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn2_real_tod_nanosecond_reg[] = + { + {"tsn2_real_tod_nanosecond", DPP_FIELD_FLAG_RO, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn2_real_lower_tod_second_reg[] = + { + {"tsn2_real_lower_tod_second", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn2_real_high_tod_second_reg[] = + { + {"tsn2_real_high_tod_second", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn3_real_tod_nanosecond_reg[] = + { + {"tsn3_real_tod_nanosecond", DPP_FIELD_FLAG_RO, 29, 30, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn3_real_lower_tod_second_reg[] = + { + {"tsn3_real_lower_tod_second", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_tsn3_real_high_tod_second_reg[] = + { + {"tsn3_real_high_tod_second", DPP_FIELD_FLAG_RO, 15, 16, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_real_ptp_clock_cycle_integer_reg[] = + { + {"integeral_nanosecond_of_real_ptp_clock_cycle", DPP_FIELD_FLAG_RO, 7, 8, 0x1, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_real_ptp_clock_cycle_fraction_reg[] = + { + {"fractional_nanosecond_of_real_ptp_clock_cycle", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_real_tsn0_clock_cycle_integer_reg[] = + { + {"integeral_nanosecond_of_real_tsn0_clock_cycle", DPP_FIELD_FLAG_RO, 7, 8, 0x1, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_real_tsn0_clock_cycle_fraction_reg[] = + { + {"fractional_nanosecond_of_real_tsn0_clock_cycle", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_real_tsn1_clock_cycle_integer_reg[] = + { + {"integeral_nanosecond_of_real_tsn1_clock_cycle", DPP_FIELD_FLAG_RO, 7, 8, 0x1, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_real_tsn1_clock_cycle_fraction_reg[] = + { + {"fractional_nanosecond_of_real_tsn1_clock_cycle", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_real_tsn2_clock_cycle_integer_reg[] = + { + {"integeral_nanosecond_of_real_tsn2_clock_cycle", DPP_FIELD_FLAG_RO, 7, 8, 0x1, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_real_tsn2_clock_cycle_fraction_reg[] = + { + {"fractional_nanosecond_of_real_tsn2_clock_cycle", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_real_tsn3_clock_cycle_integer_reg[] = + { + {"integeral_nanosecond_of_real_tsn3_clock_cycle", DPP_FIELD_FLAG_RO, 7, 8, 0x1, 0x0}, + }; +DPP_FIELD_T g_ptptm_ptptm_real_tsn3_clock_cycle_fraction_reg[] = + { + {"fractional_nanosecond_of_real_tsn3_clock_cycle", DPP_FIELD_FLAG_RO, 31, 32, 0x0, 0x0}, + }; +DPP_REG_T g_dpp_reg_info[] = +{ + { + "cpu_check_reg", + ETM_CFGMT_CPU_CHECK_REGr, + ETM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + 0x60, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cfgmt_cpu_check_reg_reg, + NULL, + NULL, + }, + { + "cfgmt_blksize", + ETM_CFGMT_CFGMT_BLKSIZEr, + ETM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + 0x70, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cfgmt_cfgmt_blksize_reg, + NULL, + NULL, + }, + { + "reg_int_state_reg", + ETM_CFGMT_REG_INT_STATE_REGr, + ETM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + 0x90, + (32/8), + 0, + 0, + 0, + 0, + 7, + g_etm_cfgmt_reg_int_state_reg_reg, + NULL, + NULL, + }, + { + "reg_int_mask_reg", + ETM_CFGMT_REG_INT_MASK_REGr, + ETM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + 0xa0, + (32/8), + 0, + 0, + 0, + 0, + 7, + g_etm_cfgmt_reg_int_mask_reg_reg, + NULL, + NULL, + }, + { + "timeout_limit", + ETM_CFGMT_TIMEOUT_LIMITr, + ETM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + 0xb0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cfgmt_timeout_limit_reg, + NULL, + NULL, + }, + { + "subsystem_rdy_reg", + ETM_CFGMT_SUBSYSTEM_RDY_REGr, + ETM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + 0xc0, + (32/8), + 0, + 0, + 0, + 0, + 6, + g_etm_cfgmt_subsystem_rdy_reg_reg, + NULL, + NULL, + }, + { + "subsystem_en_reg", + ETM_CFGMT_SUBSYSTEM_EN_REGr, + ETM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + 0xd0, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_cfgmt_subsystem_en_reg_reg, + NULL, + NULL, + }, + { + "cfgmt_int_reg", + ETM_CFGMT_CFGMT_INT_REGr, + ETM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + 0xe0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cfgmt_cfgmt_int_reg_reg, + NULL, + NULL, + }, + { + "qmu_work_mode", + ETM_CFGMT_QMU_WORK_MODEr, + ETM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + 0x100, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cfgmt_qmu_work_mode_reg, + NULL, + NULL, + }, + { + "cfgmt_ddr_attach", + ETM_CFGMT_CFGMT_DDR_ATTACHr, + ETM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + 0x120, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cfgmt_cfgmt_ddr_attach_reg, + NULL, + NULL, + }, + { + "cnt_mode_reg", + ETM_CFGMT_CNT_MODE_REGr, + ETM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + 0x140, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_etm_cfgmt_cnt_mode_reg_reg, + NULL, + NULL, + }, + { + "clkgate_en", + ETM_CFGMT_CLKGATE_ENr, + ETM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + 0x1c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cfgmt_clkgate_en_reg, + NULL, + NULL, + }, + { + "softrst_en", + ETM_CFGMT_SOFTRST_ENr, + ETM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + 0x1d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cfgmt_softrst_en_reg, + NULL, + NULL, + }, + { + "imem_prog_full", + ETM_OLIF_IMEM_PROG_FULLr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_olif_imem_prog_full_reg, + NULL, + NULL, + }, + { + "qmu_para_prog_full", + ETM_OLIF_QMU_PARA_PROG_FULLr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x4, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_olif_qmu_para_prog_full_reg, + NULL, + NULL, + }, + { + "olif_int_mask", + ETM_OLIF_OLIF_INT_MASKr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x8, + (32/8), + 0, + 0, + 0, + 0, + 19, + g_etm_olif_olif_int_mask_reg, + NULL, + NULL, + }, + { + "itmhram_parity_err_2_int", + ETM_OLIF_ITMHRAM_PARITY_ERR_2_INTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x9, + (32/8), + 0, + 0, + 0, + 0, + 22, + g_etm_olif_itmhram_parity_err_2_int_reg, + NULL, + NULL, + }, + { + "lif0_port_rdy_mask_h", + ETM_OLIF_LIF0_PORT_RDY_MASK_Hr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x30, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_lif0_port_rdy_mask_h_reg, + NULL, + NULL, + }, + { + "lif0_port_rdy_mask_l", + ETM_OLIF_LIF0_PORT_RDY_MASK_Lr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x31, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_lif0_port_rdy_mask_l_reg, + NULL, + NULL, + }, + { + "lif0_port_rdy_cfg_h", + ETM_OLIF_LIF0_PORT_RDY_CFG_Hr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x32, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_lif0_port_rdy_cfg_h_reg, + NULL, + NULL, + }, + { + "lif0_port_rdy_cfg_l", + ETM_OLIF_LIF0_PORT_RDY_CFG_Lr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x33, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_lif0_port_rdy_cfg_l_reg, + NULL, + NULL, + }, + { + "lif0_link_rdy_mask_cfg", + ETM_OLIF_LIF0_LINK_RDY_MASK_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x34, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_olif_lif0_link_rdy_mask_cfg_reg, + NULL, + NULL, + }, + { + "tm_lif_stat_cfg", + ETM_OLIF_TM_LIF_STAT_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x40, + (32/8), + 0, + 0xf + 1, + 0, + 0x1, + 4, + g_etm_olif_tm_lif_stat_cfg_reg, + NULL, + NULL, + }, + { + "tm_lif_sop_stat", + ETM_OLIF_TM_LIF_SOP_STATr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x50, + (32/8), + 0, + 0xf + 1, + 0, + 0x1, + 1, + g_etm_olif_tm_lif_sop_stat_reg, + NULL, + NULL, + }, + { + "tm_lif_eop_stat", + ETM_OLIF_TM_LIF_EOP_STATr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x60, + (32/8), + 0, + 0xf + 1, + 0, + 0x1, + 1, + g_etm_olif_tm_lif_eop_stat_reg, + NULL, + NULL, + }, + { + "tm_lif_vld_stat", + ETM_OLIF_TM_LIF_VLD_STATr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x80, + (32/8), + 0, + 0xf + 1, + 0, + 0x1, + 1, + g_etm_olif_tm_lif_vld_stat_reg, + NULL, + NULL, + }, + { + "prog_full_assert_cfg", + ETM_CGAVD_PROG_FULL_ASSERT_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_cgavd_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "cgavd_int", + ETM_CGAVD_CGAVD_INTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_int_reg, + NULL, + NULL, + }, + { + "cgavd_ram_err", + ETM_CGAVD_CGAVD_RAM_ERRr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x3, + (32/8), + 0, + 0, + 0, + 0, + 13, + g_etm_cgavd_cgavd_ram_err_reg, + NULL, + NULL, + }, + { + "cgavd_int_mask", + ETM_CGAVD_CGAVD_INT_MASKr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_int_mask_reg, + NULL, + NULL, + }, + { + "cgavd_ram_err_int_mask", + ETM_CGAVD_CGAVD_RAM_ERR_INT_MASKr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x5, + (32/8), + 0, + 0, + 0, + 0, + 13, + g_etm_cgavd_cgavd_ram_err_int_mask_reg, + NULL, + NULL, + }, + { + "cfgmt_byte_mode", + ETM_CGAVD_CFGMT_BYTE_MODEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x6, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cfgmt_byte_mode_reg, + NULL, + NULL, + }, + { + "avg_qlen_return_zero_en", + ETM_CGAVD_AVG_QLEN_RETURN_ZERO_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x7, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_avg_qlen_return_zero_en_reg, + NULL, + NULL, + }, + { + "flow_wred_q_len_th", + ETM_CGAVD_FLOW_WRED_Q_LEN_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x20, + (32/8), + 0, + 0x1f + 1, + 0, + 0x1, + 1, + g_etm_cgavd_flow_wred_q_len_th_reg, + NULL, + NULL, + }, + { + "flow_wq", + ETM_CGAVD_FLOW_WQr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x40, + (32/8), + 0, + 0x1f + 1, + 0, + 0x1, + 1, + g_etm_cgavd_flow_wq_reg, + NULL, + NULL, + }, + { + "flow_wred_max_th", + ETM_CGAVD_FLOW_WRED_MAX_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x100, + (32/8), + 0, + 0xff + 1, + 0, + 0x1, + 1, + g_etm_cgavd_flow_wred_max_th_reg, + NULL, + NULL, + }, + { + "flow_wred_min_th", + ETM_CGAVD_FLOW_WRED_MIN_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x200, + (32/8), + 0, + 0xff + 1, + 0, + 0x1, + 1, + g_etm_cgavd_flow_wred_min_th_reg, + NULL, + NULL, + }, + { + "flow_wred_cfg_para", + ETM_CGAVD_FLOW_WRED_CFG_PARAr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x300, + (32/8), + 0, + 0xff + 1, + 0, + 0x1, + 1, + g_etm_cgavd_flow_wred_cfg_para_reg, + NULL, + NULL, + }, + { + "pp_avg_q_len", + ETM_CGAVD_PP_AVG_Q_LENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x400, + (32/8), + 0, + 0x7f + 1, + 0, + 0x1, + 1, + g_etm_cgavd_pp_avg_q_len_reg, + NULL, + NULL, + }, + { + "pp_td_th", + ETM_CGAVD_PP_TD_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x600, + (32/8), + 0, + 0x7f + 1, + 0, + 0x1, + 1, + g_etm_cgavd_pp_td_th_reg, + NULL, + NULL, + }, + { + "pp_ca_mtd", + ETM_CGAVD_PP_CA_MTDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x800, + (32/8), + 0, + 0x7f + 1, + 0, + 0x1, + 1, + g_etm_cgavd_pp_ca_mtd_reg, + NULL, + NULL, + }, + { + "pp_wred_grp_th_en", + ETM_CGAVD_PP_WRED_GRP_TH_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0xc00, + (32/8), + 0, + 0x7f + 1, + 0, + 0x1, + 2, + g_etm_cgavd_pp_wred_grp_th_en_reg, + NULL, + NULL, + }, + { + "pp_wred_q_len_th", + ETM_CGAVD_PP_WRED_Q_LEN_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0xe00, + (32/8), + 0, + 0x7 + 1, + 0, + 0x1, + 1, + g_etm_cgavd_pp_wred_q_len_th_reg, + NULL, + NULL, + }, + { + "pp_wq", + ETM_CGAVD_PP_WQr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0xe08, + (32/8), + 0, + 0x7 + 1, + 0, + 0x1, + 1, + g_etm_cgavd_pp_wq_reg, + NULL, + NULL, + }, + { + "pp_wred_max_th", + ETM_CGAVD_PP_WRED_MAX_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x1000, + (32/8), + 0, + 0x3f + 1, + 0, + 0x1, + 1, + g_etm_cgavd_pp_wred_max_th_reg, + NULL, + NULL, + }, + { + "pp_wred_min_th", + ETM_CGAVD_PP_WRED_MIN_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x1080, + (32/8), + 0, + 0x3f + 1, + 0, + 0x1, + 1, + g_etm_cgavd_pp_wred_min_th_reg, + NULL, + NULL, + }, + { + "pp_cfg_para", + ETM_CGAVD_PP_CFG_PARAr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x1100, + (32/8), + 0, + 0x3f + 1, + 0, + 0x1, + 1, + g_etm_cgavd_pp_cfg_para_reg, + NULL, + NULL, + }, + { + "sys_avg_q_len", + ETM_CGAVD_SYS_AVG_Q_LENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1200, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_sys_avg_q_len_reg, + NULL, + NULL, + }, + { + "sys_td_th", + ETM_CGAVD_SYS_TD_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1202, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_sys_td_th_reg, + NULL, + NULL, + }, + { + "sys_cgavd_metd", + ETM_CGAVD_SYS_CGAVD_METDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1204, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_sys_cgavd_metd_reg, + NULL, + NULL, + }, + { + "sys_cfg_q_grp_para", + ETM_CGAVD_SYS_CFG_Q_GRP_PARAr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1208, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_sys_cfg_q_grp_para_reg, + NULL, + NULL, + }, + { + "sys_wq", + ETM_CGAVD_SYS_WQr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1210, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_sys_wq_reg, + NULL, + NULL, + }, + { + "gred_max_th", + ETM_CGAVD_GRED_MAX_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x1218, + (32/8), + 0, + 0x7 + 1, + 0, + 0x1, + 1, + g_etm_cgavd_gred_max_th_reg, + NULL, + NULL, + }, + { + "gred_mid_th", + ETM_CGAVD_GRED_MID_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x1228, + (32/8), + 0, + 0x7 + 1, + 0, + 0x1, + 1, + g_etm_cgavd_gred_mid_th_reg, + NULL, + NULL, + }, + { + "gred_min_th", + ETM_CGAVD_GRED_MIN_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x1238, + (32/8), + 0, + 0x7 + 1, + 0, + 0x1, + 1, + g_etm_cgavd_gred_min_th_reg, + NULL, + NULL, + }, + { + "gred_cfg_para0", + ETM_CGAVD_GRED_CFG_PARA0r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x1248, + (32/8), + 0, + 0x7 + 1, + 0, + 0x1, + 1, + g_etm_cgavd_gred_cfg_para0_reg, + NULL, + NULL, + }, + { + "gred_cfg_para1", + ETM_CGAVD_GRED_CFG_PARA1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x1258, + (32/8), + 0, + 0x7 + 1, + 0, + 0x1, + 1, + g_etm_cgavd_gred_cfg_para1_reg, + NULL, + NULL, + }, + { + "gred_cfg_para2", + ETM_CGAVD_GRED_CFG_PARA2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x1268, + (32/8), + 0, + 0x7 + 1, + 0, + 0x1, + 1, + g_etm_cgavd_gred_cfg_para2_reg, + NULL, + NULL, + }, + { + "sys_window_th_h", + ETM_CGAVD_SYS_WINDOW_TH_Hr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1278, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_sys_window_th_h_reg, + NULL, + NULL, + }, + { + "sys_window_th_l", + ETM_CGAVD_SYS_WINDOW_TH_Lr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x127a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_sys_window_th_l_reg, + NULL, + NULL, + }, + { + "amplify_gene0", + ETM_CGAVD_AMPLIFY_GENE0r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x127c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_amplify_gene0_reg, + NULL, + NULL, + }, + { + "amplify_gene1", + ETM_CGAVD_AMPLIFY_GENE1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x127d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_amplify_gene1_reg, + NULL, + NULL, + }, + { + "amplify_gene2", + ETM_CGAVD_AMPLIFY_GENE2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x127e, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_amplify_gene2_reg, + NULL, + NULL, + }, + { + "amplify_gene3", + ETM_CGAVD_AMPLIFY_GENE3r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x127f, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_amplify_gene3_reg, + NULL, + NULL, + }, + { + "amplify_gene4", + ETM_CGAVD_AMPLIFY_GENE4r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1280, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_amplify_gene4_reg, + NULL, + NULL, + }, + { + "amplify_gene5", + ETM_CGAVD_AMPLIFY_GENE5r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1281, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_amplify_gene5_reg, + NULL, + NULL, + }, + { + "amplify_gene6", + ETM_CGAVD_AMPLIFY_GENE6r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1282, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_amplify_gene6_reg, + NULL, + NULL, + }, + { + "amplify_gene7", + ETM_CGAVD_AMPLIFY_GENE7r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1283, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_amplify_gene7_reg, + NULL, + NULL, + }, + { + "amplify_gene8", + ETM_CGAVD_AMPLIFY_GENE8r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1284, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_amplify_gene8_reg, + NULL, + NULL, + }, + { + "amplify_gene9", + ETM_CGAVD_AMPLIFY_GENE9r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1285, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_amplify_gene9_reg, + NULL, + NULL, + }, + { + "amplify_gene10", + ETM_CGAVD_AMPLIFY_GENE10r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1286, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_amplify_gene10_reg, + NULL, + NULL, + }, + { + "amplify_gene11", + ETM_CGAVD_AMPLIFY_GENE11r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1287, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_amplify_gene11_reg, + NULL, + NULL, + }, + { + "amplify_gene12", + ETM_CGAVD_AMPLIFY_GENE12r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1288, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_amplify_gene12_reg, + NULL, + NULL, + }, + { + "amplify_gene13", + ETM_CGAVD_AMPLIFY_GENE13r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1289, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_amplify_gene13_reg, + NULL, + NULL, + }, + { + "amplify_gene14", + ETM_CGAVD_AMPLIFY_GENE14r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x128a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_amplify_gene14_reg, + NULL, + NULL, + }, + { + "amplify_gene15", + ETM_CGAVD_AMPLIFY_GENE15r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x128b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_amplify_gene15_reg, + NULL, + NULL, + }, + { + "equal_pkt_len_en", + ETM_CGAVD_EQUAL_PKT_LEN_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x128c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_equal_pkt_len_en_reg, + NULL, + NULL, + }, + { + "equal_pkt_len_th0", + ETM_CGAVD_EQUAL_PKT_LEN_TH0r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x128d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_equal_pkt_len_th0_reg, + NULL, + NULL, + }, + { + "equal_pkt_len_th1", + ETM_CGAVD_EQUAL_PKT_LEN_TH1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x128e, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_equal_pkt_len_th1_reg, + NULL, + NULL, + }, + { + "equal_pkt_len_th2", + ETM_CGAVD_EQUAL_PKT_LEN_TH2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x128f, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_equal_pkt_len_th2_reg, + NULL, + NULL, + }, + { + "equal_pkt_len_th3", + ETM_CGAVD_EQUAL_PKT_LEN_TH3r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1290, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_equal_pkt_len_th3_reg, + NULL, + NULL, + }, + { + "equal_pkt_len_th4", + ETM_CGAVD_EQUAL_PKT_LEN_TH4r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1291, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_equal_pkt_len_th4_reg, + NULL, + NULL, + }, + { + "equal_pkt_len_th5", + ETM_CGAVD_EQUAL_PKT_LEN_TH5r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1292, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_equal_pkt_len_th5_reg, + NULL, + NULL, + }, + { + "equal_pkt_len_th6", + ETM_CGAVD_EQUAL_PKT_LEN_TH6r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1293, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_equal_pkt_len_th6_reg, + NULL, + NULL, + }, + { + "equal_pkt_len0", + ETM_CGAVD_EQUAL_PKT_LEN0r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1294, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_equal_pkt_len0_reg, + NULL, + NULL, + }, + { + "equal_pkt_len1", + ETM_CGAVD_EQUAL_PKT_LEN1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1295, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_equal_pkt_len1_reg, + NULL, + NULL, + }, + { + "equal_pkt_len2", + ETM_CGAVD_EQUAL_PKT_LEN2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1296, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_equal_pkt_len2_reg, + NULL, + NULL, + }, + { + "equal_pkt_len3", + ETM_CGAVD_EQUAL_PKT_LEN3r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1297, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_equal_pkt_len3_reg, + NULL, + NULL, + }, + { + "equal_pkt_len4", + ETM_CGAVD_EQUAL_PKT_LEN4r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1298, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_equal_pkt_len4_reg, + NULL, + NULL, + }, + { + "equal_pkt_len5", + ETM_CGAVD_EQUAL_PKT_LEN5r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1299, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_equal_pkt_len5_reg, + NULL, + NULL, + }, + { + "equal_pkt_len6", + ETM_CGAVD_EQUAL_PKT_LEN6r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x129a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_equal_pkt_len6_reg, + NULL, + NULL, + }, + { + "equal_pkt_len7", + ETM_CGAVD_EQUAL_PKT_LEN7r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x129b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_equal_pkt_len7_reg, + NULL, + NULL, + }, + { + "flow_cpu_set_avg_len", + ETM_CGAVD_FLOW_CPU_SET_AVG_LENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x129c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_flow_cpu_set_avg_len_reg, + NULL, + NULL, + }, + { + "flow_cpu_set_q_len", + ETM_CGAVD_FLOW_CPU_SET_Q_LENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x129d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_flow_cpu_set_q_len_reg, + NULL, + NULL, + }, + { + "pp_cpu_set_avg_q_len", + ETM_CGAVD_PP_CPU_SET_AVG_Q_LENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12ef, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_pp_cpu_set_avg_q_len_reg, + NULL, + NULL, + }, + { + "pp_cpu_set_q_len", + ETM_CGAVD_PP_CPU_SET_Q_LENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x129e, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_pp_cpu_set_q_len_reg, + NULL, + NULL, + }, + { + "sys_cpu_set_avg_len", + ETM_CGAVD_SYS_CPU_SET_AVG_LENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_sys_cpu_set_avg_len_reg, + NULL, + NULL, + }, + { + "sys_cpu_set_q_len", + ETM_CGAVD_SYS_CPU_SET_Q_LENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12a2, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_sys_cpu_set_q_len_reg, + NULL, + NULL, + }, + { + "pke_len_calc_sign", + ETM_CGAVD_PKE_LEN_CALC_SIGNr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12a3, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_pke_len_calc_sign_reg, + NULL, + NULL, + }, + { + "rd_cpu_or_ram", + ETM_CGAVD_RD_CPU_OR_RAMr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12a4, + (32/8), + 0, + 0, + 0, + 0, + 6, + g_etm_cgavd_rd_cpu_or_ram_reg, + NULL, + NULL, + }, + { + "q_len_update_disable", + ETM_CGAVD_Q_LEN_UPDATE_DISABLEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12a5, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_etm_cgavd_q_len_update_disable_reg, + NULL, + NULL, + }, + { + "cgavd_dp_sel", + ETM_CGAVD_CGAVD_DP_SELr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12ad, + (32/8), + 0, + 0, + 0, + 0, + 9, + g_etm_cgavd_cgavd_dp_sel_reg, + NULL, + NULL, + }, + { + "cgavd_sub_en", + ETM_CGAVD_CGAVD_SUB_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12e6, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_etm_cgavd_cgavd_sub_en_reg, + NULL, + NULL, + }, + { + "default_start_queue", + ETM_CGAVD_DEFAULT_START_QUEUEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12e7, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_default_start_queue_reg, + NULL, + NULL, + }, + { + "default_finish_queue", + ETM_CGAVD_DEFAULT_FINISH_QUEUEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_default_finish_queue_reg, + NULL, + NULL, + }, + { + "protocol_start_queue", + ETM_CGAVD_PROTOCOL_START_QUEUEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12e9, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_protocol_start_queue_reg, + NULL, + NULL, + }, + { + "protocol_finish_queue", + ETM_CGAVD_PROTOCOL_FINISH_QUEUEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12ea, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_protocol_finish_queue_reg, + NULL, + NULL, + }, + { + "uniform_td_th", + ETM_CGAVD_UNIFORM_TD_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12eb, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_uniform_td_th_reg, + NULL, + NULL, + }, + { + "uniform_td_th_en", + ETM_CGAVD_UNIFORM_TD_TH_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_uniform_td_th_en_reg, + NULL, + NULL, + }, + { + "cgavd_cfg_fc", + ETM_CGAVD_CGAVD_CFG_FCr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12ed, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_cfg_fc_reg, + NULL, + NULL, + }, + { + "cgavd_cfg_no_fc", + ETM_CGAVD_CGAVD_CFG_NO_FCr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12ee, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_cfg_no_fc_reg, + NULL, + NULL, + }, + { + "cgavd_force_imem_omem", + ETM_CGAVD_CGAVD_FORCE_IMEM_OMEMr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12f0, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_cgavd_cgavd_force_imem_omem_reg, + NULL, + NULL, + }, + { + "cgavd_sys_q_len_l", + ETM_CGAVD_CGAVD_SYS_Q_LEN_Lr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12f1, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_sys_q_len_l_reg, + NULL, + NULL, + }, + { + "default_queue_en", + ETM_CGAVD_DEFAULT_QUEUE_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12f5, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_default_queue_en_reg, + NULL, + NULL, + }, + { + "protocol_queue_en", + ETM_CGAVD_PROTOCOL_QUEUE_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12f6, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_protocol_queue_en_reg, + NULL, + NULL, + }, + { + "cfg_tc_flowid_dat", + ETM_CGAVD_CFG_TC_FLOWID_DATr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x1400, + (32/8), + 0, + 0x7 + 1, + 0, + 0x1, + 1, + g_etm_cgavd_cfg_tc_flowid_dat_reg, + NULL, + NULL, + }, + { + "flow_td_th", + ETM_CGAVD_FLOW_TD_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x40000, + (32/8), + 0, + 0x23FF + 1, + 0, + 0x1, + 1, + g_etm_cgavd_flow_td_th_reg, + NULL, + NULL, + }, + { + "flow_ca_mtd", + ETM_CGAVD_FLOW_CA_MTDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x80000, + (32/8), + 0, + 0x23FF + 1, + 0, + 0x1, + 1, + g_etm_cgavd_flow_ca_mtd_reg, + NULL, + NULL, + }, + { + "flow_dynamic_th_en", + ETM_CGAVD_FLOW_DYNAMIC_TH_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0xc0000, + (32/8), + 0, + 0x23FF + 1, + 0, + 0x1, + 1, + g_etm_cgavd_flow_dynamic_th_en_reg, + NULL, + NULL, + }, + { + "pp_num", + ETM_CGAVD_PP_NUMr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x100000, + (32/8), + 0, + 0x23FF + 1, + 0, + 0x1, + 1, + g_etm_cgavd_pp_num_reg, + NULL, + NULL, + }, + { + "flow_q_len", + ETM_CGAVD_FLOW_Q_LENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x140000, + (32/8), + 0, + 0x23FF + 1, + 0, + 0x1, + 1, + g_etm_cgavd_flow_q_len_reg, + NULL, + NULL, + }, + { + "flow_wred_grp", + ETM_CGAVD_FLOW_WRED_GRPr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x180000, + (32/8), + 0, + 0x23FF + 1, + 0, + 0x1, + 1, + g_etm_cgavd_flow_wred_grp_reg, + NULL, + NULL, + }, + { + "flow_avg_q_len", + ETM_CGAVD_FLOW_AVG_Q_LENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x1c0000, + (32/8), + 0, + 0x23FF + 1, + 0, + 0x1, + 1, + g_etm_cgavd_flow_avg_q_len_reg, + NULL, + NULL, + }, + { + "qos_sign", + ETM_CGAVD_QOS_SIGNr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x200000, + (32/8), + 0, + 0x23FF + 1, + 0, + 0x1, + 1, + g_etm_cgavd_qos_sign_reg, + NULL, + NULL, + }, + { + "q_pri", + ETM_CGAVD_Q_PRIr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x240000, + (32/8), + 0, + 0x23FF + 1, + 0, + 0x1, + 1, + g_etm_cgavd_q_pri_reg, + NULL, + NULL, + }, + { + "odma_tm_itmd_rd_low", + ETM_CGAVD_ODMA_TM_ITMD_RD_LOWr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x250000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_odma_tm_itmd_rd_low_reg, + NULL, + NULL, + }, + { + "odma_tm_itmd_rd_mid", + ETM_CGAVD_ODMA_TM_ITMD_RD_MIDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x250001, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_odma_tm_itmd_rd_mid_reg, + NULL, + NULL, + }, + { + "odma_tm_itmd_rd_high", + ETM_CGAVD_ODMA_TM_ITMD_RD_HIGHr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x250002, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_odma_tm_itmd_rd_high_reg, + NULL, + NULL, + }, + { + "cgavd_stat_pkt_len", + ETM_CGAVD_CGAVD_STAT_PKT_LENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x250003, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_cgavd_cgavd_stat_pkt_len_reg, + NULL, + NULL, + }, + { + "cgavd_stat_qnum", + ETM_CGAVD_CGAVD_STAT_QNUMr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x250004, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_cgavd_cgavd_stat_qnum_reg, + NULL, + NULL, + }, + { + "cgavd_stat_dp", + ETM_CGAVD_CGAVD_STAT_DPr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x250005, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_stat_dp_reg, + NULL, + NULL, + }, + { + "flow_num0", + ETM_CGAVD_FLOW_NUM0r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x260000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_flow_num0_reg, + NULL, + NULL, + }, + { + "flow_num1", + ETM_CGAVD_FLOW_NUM1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x260001, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_flow_num1_reg, + NULL, + NULL, + }, + { + "flow_num2", + ETM_CGAVD_FLOW_NUM2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x260002, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_flow_num2_reg, + NULL, + NULL, + }, + { + "flow_num3", + ETM_CGAVD_FLOW_NUM3r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x260003, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_flow_num3_reg, + NULL, + NULL, + }, + { + "flow_num4", + ETM_CGAVD_FLOW_NUM4r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x260004, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_flow_num4_reg, + NULL, + NULL, + }, + { + "flow0_imem_cnt", + ETM_CGAVD_FLOW0_IMEM_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x260010, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_flow0_imem_cnt_reg, + NULL, + NULL, + }, + { + "flow1_imem_cnt", + ETM_CGAVD_FLOW1_IMEM_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x260011, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_flow1_imem_cnt_reg, + NULL, + NULL, + }, + { + "flow2_imem_cnt", + ETM_CGAVD_FLOW2_IMEM_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x260012, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_flow2_imem_cnt_reg, + NULL, + NULL, + }, + { + "flow3_imem_cnt", + ETM_CGAVD_FLOW3_IMEM_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x260013, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_flow3_imem_cnt_reg, + NULL, + NULL, + }, + { + "flow4_imem_cnt", + ETM_CGAVD_FLOW4_IMEM_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x260014, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_flow4_imem_cnt_reg, + NULL, + NULL, + }, + { + "flow0_drop_cnt", + ETM_CGAVD_FLOW0_DROP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x260030, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_flow0_drop_cnt_reg, + NULL, + NULL, + }, + { + "flow1_drop_cnt", + ETM_CGAVD_FLOW1_DROP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x260031, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_flow1_drop_cnt_reg, + NULL, + NULL, + }, + { + "flow2_drop_cnt", + ETM_CGAVD_FLOW2_DROP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x260032, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_flow2_drop_cnt_reg, + NULL, + NULL, + }, + { + "flow3_drop_cnt", + ETM_CGAVD_FLOW3_DROP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x260033, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_flow3_drop_cnt_reg, + NULL, + NULL, + }, + { + "flow4_drop_cnt", + ETM_CGAVD_FLOW4_DROP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x260034, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_flow4_drop_cnt_reg, + NULL, + NULL, + }, + { + "fc_count_mode", + ETM_CGAVD_FC_COUNT_MODEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x264000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_fc_count_mode_reg, + NULL, + NULL, + }, + { + "qmu_cgavd_fc_num", + ETM_CGAVD_QMU_CGAVD_FC_NUMr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x264100, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_cgavd_qmu_cgavd_fc_num_reg, + NULL, + NULL, + }, + { + "cgavd_odma_fc_num", + ETM_CGAVD_CGAVD_ODMA_FC_NUMr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x264101, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_cgavd_cgavd_odma_fc_num_reg, + NULL, + NULL, + }, + { + "cfg_offset", + ETM_CGAVD_CFG_OFFSETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x290000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cfg_offset_reg, + NULL, + NULL, + }, + { + "tmmu_init_done", + ETM_TMMU_TMMU_INIT_DONEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0001, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_tmmu_init_done_reg, + NULL, + NULL, + }, + { + "tmmu_int_mask_1", + ETM_TMMU_TMMU_INT_MASK_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x002, + (32/8), + 0, + 0, + 0, + 0, + 27, + g_etm_tmmu_tmmu_int_mask_1_reg, + NULL, + NULL, + }, + { + "tmmu_int_mask_2", + ETM_TMMU_TMMU_INT_MASK_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0003, + (32/8), + 0, + 0, + 0, + 0, + 17, + g_etm_tmmu_tmmu_int_mask_2_reg, + NULL, + NULL, + }, + { + "cfgmt_tm_pure_imem_en", + ETM_TMMU_CFGMT_TM_PURE_IMEM_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0004, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_tm_pure_imem_en_reg, + NULL, + NULL, + }, + { + "cfgmt_force_ddr_rdy_cfg", + ETM_TMMU_CFGMT_FORCE_DDR_RDY_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0005, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_force_ddr_rdy_cfg_reg, + NULL, + NULL, + }, + { + "pd_order_fifo_aful_th", + ETM_TMMU_PD_ORDER_FIFO_AFUL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0007, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_pd_order_fifo_aful_th_reg, + NULL, + NULL, + }, + { + "cached_pd_fifo_aful_th", + ETM_TMMU_CACHED_PD_FIFO_AFUL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cached_pd_fifo_aful_th_reg, + NULL, + NULL, + }, + { + "wr_cmd_fifo_aful_th", + ETM_TMMU_WR_CMD_FIFO_AFUL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x000b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_wr_cmd_fifo_aful_th_reg, + NULL, + NULL, + }, + { + "imem_enq_rd_fifo_aful_th", + ETM_TMMU_IMEM_ENQ_RD_FIFO_AFUL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x000c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_imem_enq_rd_fifo_aful_th_reg, + NULL, + NULL, + }, + { + "imem_enq_drop_fifo_aful_th", + ETM_TMMU_IMEM_ENQ_DROP_FIFO_AFUL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x000d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_imem_enq_drop_fifo_aful_th_reg, + NULL, + NULL, + }, + { + "imem_deq_drop_fifo_aful_th", + ETM_TMMU_IMEM_DEQ_DROP_FIFO_AFUL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x000e, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_imem_deq_drop_fifo_aful_th_reg, + NULL, + NULL, + }, + { + "imem_deq_rd_fifo_aful_th", + ETM_TMMU_IMEM_DEQ_RD_FIFO_AFUL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x000f, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_imem_deq_rd_fifo_aful_th_reg, + NULL, + NULL, + }, + { + "tmmu_states_1", + ETM_TMMU_TMMU_STATES_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0011, + (32/8), + 0, + 0, + 0, + 0, + 27, + g_etm_tmmu_tmmu_states_1_reg, + NULL, + NULL, + }, + { + "tmmu_states_2", + ETM_TMMU_TMMU_STATES_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0012, + (32/8), + 0, + 0, + 0, + 0, + 17, + g_etm_tmmu_tmmu_states_2_reg, + NULL, + NULL, + }, + { + "shap_ind_cmd", + ETM_SHAP_SHAP_IND_CMDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x000a, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_etm_shap_shap_ind_cmd_reg, + NULL, + NULL, + }, + { + "shap_ind_sta", + ETM_SHAP_SHAP_IND_STAr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x000b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_shap_shap_ind_sta_reg, + NULL, + NULL, + }, + { + "shap_ind_data0", + ETM_SHAP_SHAP_IND_DATA0r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x000c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_shap_shap_ind_data0_reg, + NULL, + NULL, + }, + { + "shap_ind_data1", + ETM_SHAP_SHAP_IND_DATA1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x000d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_shap_shap_ind_data1_reg, + NULL, + NULL, + }, + { + "full_threshold", + ETM_SHAP_FULL_THRESHOLDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_shap_full_threshold_reg, + NULL, + NULL, + }, + { + "empty_threshold", + ETM_SHAP_EMPTY_THRESHOLDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_shap_empty_threshold_reg, + NULL, + NULL, + }, + { + "shap_sta_init_cfg", + ETM_SHAP_SHAP_STA_INIT_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1e, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_shap_shap_sta_init_cfg_reg, + NULL, + NULL, + }, + { + "shap_cfg_init_cfg", + ETM_SHAP_SHAP_CFG_INIT_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1f, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_shap_shap_cfg_init_cfg_reg, + NULL, + NULL, + }, + { + "token_mode_switch", + ETM_SHAP_TOKEN_MODE_SWITCHr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_shap_token_mode_switch_reg, + NULL, + NULL, + }, + { + "token_grain", + ETM_SHAP_TOKEN_GRAINr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x21, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_shap_token_grain_reg, + NULL, + NULL, + }, + { + "crd_grain", + ETM_SHAP_CRD_GRAINr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x22, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_shap_crd_grain_reg, + NULL, + NULL, + }, + { + "shap_stat_ctrl", + ETM_SHAP_SHAP_STAT_CTRLr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x37, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_shap_shap_stat_ctrl_reg, + NULL, + NULL, + }, + { + "token_stat_id", + ETM_SHAP_TOKEN_STAT_IDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x38, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_shap_token_stat_id_reg, + NULL, + NULL, + }, + { + "token_stat", + ETM_SHAP_TOKEN_STATr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x39, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_shap_token_stat_reg, + NULL, + NULL, + }, + { + "shap_stat_clk_cnt", + ETM_SHAP_SHAP_STAT_CLK_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x74, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_shap_shap_stat_clk_cnt_reg, + NULL, + NULL, + }, + { + "shap_bucket_map_tbl", + ETM_SHAP_SHAP_BUCKET_MAP_TBLr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x80000000 + 0x000000, + (64/8), + 0, + 0xABFF + 1, + 0, + 1, + 1, + g_etm_shap_shap_bucket_map_tbl_reg, + NULL, + NULL, + }, + { + "bkt_para_tbl", + ETM_SHAP_BKT_PARA_TBLr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x80000000 + 0x100000, + (64/8), + 0, + 0xAFF + 1, + 0, + 1, + 2, + g_etm_shap_bkt_para_tbl_reg, + NULL, + NULL, + }, + { + "credit_en", + ETM_CRDT_CREDIT_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0001, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_credit_en_reg, + NULL, + NULL, + }, + { + "crt_inter1", + ETM_CRDT_CRT_INTER1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0002, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_crt_inter1_reg, + NULL, + NULL, + }, + { + "db_token", + ETM_CRDT_DB_TOKENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0003, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_db_token_reg, + NULL, + NULL, + }, + { + "crs_flt_cfg", + ETM_CRDT_CRS_FLT_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0004, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_crs_flt_cfg_reg, + NULL, + NULL, + }, + { + "th_sp", + ETM_CRDT_TH_SPr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0005, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_th_sp_reg, + NULL, + NULL, + }, + { + "th_wfq_fq", + ETM_CRDT_TH_WFQ_FQr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0006, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_crdt_th_wfq_fq_reg, + NULL, + NULL, + }, + { + "th_wfq2_fq2", + ETM_CRDT_TH_WFQ2_FQ2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0007, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_crdt_th_wfq2_fq2_reg, + NULL, + NULL, + }, + { + "th_wfq4_fq4", + ETM_CRDT_TH_WFQ4_FQ4r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0008, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_crdt_th_wfq4_fq4_reg, + NULL, + NULL, + }, + { + "cfg_state", + ETM_CRDT_CFG_STATEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0009, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_cfg_state_reg, + NULL, + NULL, + }, + { + "crdt_ind_cmd", + ETM_CRDT_CRDT_IND_CMDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x000a, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_etm_crdt_crdt_ind_cmd_reg, + NULL, + NULL, + }, + { + "crdt_ind_sta", + ETM_CRDT_CRDT_IND_STAr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x000b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_crdt_ind_sta_reg, + NULL, + NULL, + }, + { + "crdt_ind_data0", + ETM_CRDT_CRDT_IND_DATA0r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x000c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_crdt_ind_data0_reg, + NULL, + NULL, + }, + { + "crdt_ind_data1", + ETM_CRDT_CRDT_IND_DATA1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x000d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_crdt_ind_data1_reg, + NULL, + NULL, + }, + { + "crdt_state", + ETM_CRDT_CRDT_STATEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x000f, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_crdt_crdt_state_reg, + NULL, + NULL, + }, + { + "stat_que_id_0", + ETM_CRDT_STAT_QUE_ID_0r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x10, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_stat_que_id_0_reg, + NULL, + NULL, + }, + { + "stat_que_id_1", + ETM_CRDT_STAT_QUE_ID_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x11, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_stat_que_id_1_reg, + NULL, + NULL, + }, + { + "stat_que_id_2", + ETM_CRDT_STAT_QUE_ID_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_stat_que_id_2_reg, + NULL, + NULL, + }, + { + "stat_que_id_3", + ETM_CRDT_STAT_QUE_ID_3r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x13, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_stat_que_id_3_reg, + NULL, + NULL, + }, + { + "stat_que_id_4", + ETM_CRDT_STAT_QUE_ID_4r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x14, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_stat_que_id_4_reg, + NULL, + NULL, + }, + { + "stat_que_id_5", + ETM_CRDT_STAT_QUE_ID_5r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x15, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_stat_que_id_5_reg, + NULL, + NULL, + }, + { + "stat_que_id_6", + ETM_CRDT_STAT_QUE_ID_6r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x16, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_stat_que_id_6_reg, + NULL, + NULL, + }, + { + "stat_que_id_7", + ETM_CRDT_STAT_QUE_ID_7r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x17, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_stat_que_id_7_reg, + NULL, + NULL, + }, + { + "stat_que_id_8", + ETM_CRDT_STAT_QUE_ID_8r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x18, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_stat_que_id_8_reg, + NULL, + NULL, + }, + { + "stat_que_id_9", + ETM_CRDT_STAT_QUE_ID_9r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x19, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_stat_que_id_9_reg, + NULL, + NULL, + }, + { + "stat_que_id_10", + ETM_CRDT_STAT_QUE_ID_10r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_stat_que_id_10_reg, + NULL, + NULL, + }, + { + "stat_que_id_11", + ETM_CRDT_STAT_QUE_ID_11r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_stat_que_id_11_reg, + NULL, + NULL, + }, + { + "stat_que_id_12", + ETM_CRDT_STAT_QUE_ID_12r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_stat_que_id_12_reg, + NULL, + NULL, + }, + { + "stat_que_id_13", + ETM_CRDT_STAT_QUE_ID_13r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_stat_que_id_13_reg, + NULL, + NULL, + }, + { + "stat_que_id_14", + ETM_CRDT_STAT_QUE_ID_14r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1e, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_stat_que_id_14_reg, + NULL, + NULL, + }, + { + "stat_que_id_15", + ETM_CRDT_STAT_QUE_ID_15r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1f, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_stat_que_id_15_reg, + NULL, + NULL, + }, + { + "stat_que_credit", + ETM_CRDT_STAT_QUE_CREDITr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x20, + (32/8), + 0, + 0x0f + 1, + 0, + 1, + 1, + g_etm_crdt_stat_que_credit_reg, + NULL, + NULL, + }, + { + "crdt_cfg_ram_init", + ETM_CRDT_CRDT_CFG_RAM_INITr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x7a, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_crdt_crdt_cfg_ram_init_reg, + NULL, + NULL, + }, + { + "crdt_sta_ram_init", + ETM_CRDT_CRDT_STA_RAM_INITr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x7b, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_crdt_crdt_sta_ram_init_reg, + NULL, + NULL, + }, + { + "crs_que_id", + ETM_CRDT_CRS_QUE_IDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x86, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_crs_que_id_reg, + NULL, + NULL, + }, + { + "qmu_crs_end_state", + ETM_CRDT_QMU_CRS_END_STATEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x87, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_qmu_crs_end_state_reg, + NULL, + NULL, + }, + { + "shap_rdy", + ETM_CRDT_SHAP_RDYr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x90, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_shap_rdy_reg, + NULL, + NULL, + }, + { + "shap_int_reg", + ETM_CRDT_SHAP_INT_REGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x91, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_shap_int_reg_reg, + NULL, + NULL, + }, + { + "shap_int_mask_reg", + ETM_CRDT_SHAP_INT_MASK_REGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x92, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_shap_int_mask_reg_reg, + NULL, + NULL, + }, + { + "token_state_almost_empty_th", + ETM_CRDT_TOKEN_STATE_ALMOST_EMPTY_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x93, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_token_state_almost_empty_th_reg, + NULL, + NULL, + }, + { + "token_state_empty_th", + ETM_CRDT_TOKEN_STATE_EMPTY_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x94, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_token_state_empty_th_reg, + NULL, + NULL, + }, + { + "full_th", + ETM_CRDT_FULL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x95, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_full_th_reg, + NULL, + NULL, + }, + { + "pp_c_level_shap_en", + ETM_CRDT_PP_C_LEVEL_SHAP_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x96, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_pp_c_level_shap_en_reg, + NULL, + NULL, + }, + { + "enq_token_th", + ETM_CRDT_ENQ_TOKEN_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x97, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_enq_token_th_reg, + NULL, + NULL, + }, + { + "pp_tokenq_level1_qstate_weight_cir", + ETM_CRDT_PP_TOKENQ_LEVEL1_QSTATE_WEIGHT_CIRr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x98, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_crdt_pp_tokenq_level1_qstate_weight_cir_reg, + NULL, + NULL, + }, + { + "pp_idle_weight_level1_cir", + ETM_CRDT_PP_IDLE_WEIGHT_LEVEL1_CIRr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x99, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_pp_idle_weight_level1_cir_reg, + NULL, + NULL, + }, + { + "rci_grade_th_0_cfg", + ETM_CRDT_RCI_GRADE_TH_0_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xc0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_rci_grade_th_0_cfg_reg, + NULL, + NULL, + }, + { + "rci_grade_th_1_cfg", + ETM_CRDT_RCI_GRADE_TH_1_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xc1, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_rci_grade_th_1_cfg_reg, + NULL, + NULL, + }, + { + "rci_grade_th_2_cfg", + ETM_CRDT_RCI_GRADE_TH_2_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xc2, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_rci_grade_th_2_cfg_reg, + NULL, + NULL, + }, + { + "rci_grade_th_3_cfg", + ETM_CRDT_RCI_GRADE_TH_3_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xc3, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_rci_grade_th_3_cfg_reg, + NULL, + NULL, + }, + { + "rci_grade_th_4_cfg", + ETM_CRDT_RCI_GRADE_TH_4_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xc4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_rci_grade_th_4_cfg_reg, + NULL, + NULL, + }, + { + "rci_grade_th_5_cfg", + ETM_CRDT_RCI_GRADE_TH_5_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xc5, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_rci_grade_th_5_cfg_reg, + NULL, + NULL, + }, + { + "rci_grade_th_6_cfg", + ETM_CRDT_RCI_GRADE_TH_6_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xc6, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_rci_grade_th_6_cfg_reg, + NULL, + NULL, + }, + { + "flow_del_cmd", + ETM_CRDT_FLOW_DEL_CMDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x00f1, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_etm_crdt_flow_del_cmd_reg, + NULL, + NULL, + }, + { + "cnt_clr", + ETM_CRDT_CNT_CLRr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x00f2, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_cnt_clr_reg, + NULL, + NULL, + }, + { + "crdt_int_bus", + ETM_CRDT_CRDT_INT_BUSr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x00f3, + (32/8), + 0, + 0, + 0, + 0, + 19, + g_etm_crdt_crdt_int_bus_reg, + NULL, + NULL, + }, + { + "crdt_int_mask", + ETM_CRDT_CRDT_INT_MASKr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x00f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_crdt_int_mask_reg, + NULL, + NULL, + }, + { + "cfg_weight_together", + ETM_CRDT_CFG_WEIGHT_TOGETHERr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x00f9, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_cfg_weight_together_reg, + NULL, + NULL, + }, + { + "weight", + ETM_CRDT_WEIGHTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x00fa, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_crdt_weight_reg, + NULL, + NULL, + }, + { + "dev_sp_state", + ETM_CRDT_DEV_SP_STATEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x11e, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_dev_sp_state_reg, + NULL, + NULL, + }, + { + "dev_crs", + ETM_CRDT_DEV_CRSr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x11f, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_dev_crs_reg, + NULL, + NULL, + }, + { + "congest_token_disable_31_0", + ETM_CRDT_CONGEST_TOKEN_DISABLE_31_0r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x130, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_congest_token_disable_31_0_reg, + NULL, + NULL, + }, + { + "congest_token_disable_63_32", + ETM_CRDT_CONGEST_TOKEN_DISABLE_63_32r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x131, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_congest_token_disable_63_32_reg, + NULL, + NULL, + }, + { + "crdt_interval_en_cfg", + ETM_CRDT_CRDT_INTERVAL_EN_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0139, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_crdt_interval_en_cfg_reg, + NULL, + NULL, + }, + { + "q_token_staue_cfg", + ETM_CRDT_Q_TOKEN_STAUE_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x150, + (32/8), + 0, + 0xf + 1, + 0, + 1, + 1, + g_etm_crdt_q_token_staue_cfg_reg, + NULL, + NULL, + }, + { + "q_token_dist_cnt", + ETM_CRDT_Q_TOKEN_DIST_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x160, + (32/8), + 0, + 0xf + 1, + 0, + 1, + 1, + g_etm_crdt_q_token_dist_cnt_reg, + NULL, + NULL, + }, + { + "q_token_dec_cnt", + ETM_CRDT_Q_TOKEN_DEC_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x170, + (32/8), + 0, + 0xf + 1, + 0, + 1, + 1, + g_etm_crdt_q_token_dec_cnt_reg, + NULL, + NULL, + }, + { + "pp_weight_ram", + ETM_CRDT_PP_WEIGHT_RAMr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x41000000, + (32/8), + 0, + 0x003F + 1, + 0, + 1, + 1, + g_etm_crdt_pp_weight_ram_reg, + NULL, + NULL, + }, + { + "pp_cbs_shape_en_ram", + ETM_CRDT_PP_CBS_SHAPE_EN_RAMr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x42000000, + (32/8), + 0, + 0x003f + 1, + 0, + 1, + 2, + g_etm_crdt_pp_cbs_shape_en_ram_reg, + NULL, + NULL, + }, + { + "pp_next_pc_q_state_ram", + ETM_CRDT_PP_NEXT_PC_Q_STATE_RAMr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x43000000, + (32/8), + 0, + 0x003f + 1, + 0, + 1, + 3, + g_etm_crdt_pp_next_pc_q_state_ram_reg, + NULL, + NULL, + }, + { + "dev_interval", + ETM_CRDT_DEV_INTERVALr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x50000000, + (32/8), + 0, + 0x0127 + 1, + 0, + 1, + 1, + g_etm_crdt_dev_interval_reg, + NULL, + NULL, + }, + { + "dev_wfq_cnt", + ETM_CRDT_DEV_WFQ_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x51000000, + (32/8), + 0, + 0x0007 + 1, + 0, + 1, + 1, + g_etm_crdt_dev_wfq_cnt_reg, + NULL, + NULL, + }, + { + "dev_wfq_state", + ETM_CRDT_DEV_WFQ_STATEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x52000000, + (32/8), + 0, + 0x0007 + 1, + 0, + 1, + 1, + g_etm_crdt_dev_wfq_state_reg, + NULL, + NULL, + }, + { + "dev_active_head_ptr", + ETM_CRDT_DEV_ACTIVE_HEAD_PTRr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x53000000, + (32/8), + 0, + 0x0007 + 1, + 0, + 1, + 1, + g_etm_crdt_dev_active_head_ptr_reg, + NULL, + NULL, + }, + { + "dev_active_tail_ptr", + ETM_CRDT_DEV_ACTIVE_TAIL_PTRr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x54000000, + (32/8), + 0, + 0x0007 + 1, + 0, + 1, + 1, + g_etm_crdt_dev_active_tail_ptr_reg, + NULL, + NULL, + }, + { + "dev_unactive_head_ptr", + ETM_CRDT_DEV_UNACTIVE_HEAD_PTRr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x55000000, + (32/8), + 0, + 0x0037 + 1, + 0, + 1, + 1, + g_etm_crdt_dev_unactive_head_ptr_reg, + NULL, + NULL, + }, + { + "dev_unactive_tail_ptr", + ETM_CRDT_DEV_UNACTIVE_TAIL_PTRr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x56000000, + (32/8), + 0, + 0x0037 + 1, + 0, + 1, + 1, + g_etm_crdt_dev_unactive_tail_ptr_reg, + NULL, + NULL, + }, + { + "pp_weight", + ETM_CRDT_PP_WEIGHTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x44000000, + (32/8), + 0, + 0x003F + 1, + 0, + 1, + 1, + g_etm_crdt_pp_weight_reg, + NULL, + NULL, + }, + { + "pp_que_state", + ETM_CRDT_PP_QUE_STATEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x46000000, + (32/8), + 0, + 0x003f + 1, + 0, + 1, + 5, + g_etm_crdt_pp_que_state_reg, + NULL, + NULL, + }, + { + "pp_next_ptr", + ETM_CRDT_PP_NEXT_PTRr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x49000000, + (32/8), + 0, + 0x003f + 1, + 0, + 1, + 1, + g_etm_crdt_pp_next_ptr_reg, + NULL, + NULL, + }, + { + "pp_cfg", + ETM_CRDT_PP_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x4a000000, + (32/8), + 0, + 0x003f + 1, + 0, + 1, + 1, + g_etm_crdt_pp_cfg_reg, + NULL, + NULL, + }, + { + "pp_up_ptr", + ETM_CRDT_PP_UP_PTRr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x4b000000, + (32/8), + 0, + 0x003f + 1, + 0, + 1, + 1, + g_etm_crdt_pp_up_ptr_reg, + NULL, + NULL, + }, + { + "credit_drop_num", + ETM_CRDT_CREDIT_DROP_NUMr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x180, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_credit_drop_num_reg, + NULL, + NULL, + }, + { + "se_id_lv0", + ETM_CRDT_SE_ID_LV0r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x181, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_se_id_lv0_reg, + NULL, + NULL, + }, + { + "se_id_lv1", + ETM_CRDT_SE_ID_LV1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x182, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_se_id_lv1_reg, + NULL, + NULL, + }, + { + "se_id_lv2", + ETM_CRDT_SE_ID_LV2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x183, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_se_id_lv2_reg, + NULL, + NULL, + }, + { + "se_id_lv3", + ETM_CRDT_SE_ID_LV3r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x184, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_se_id_lv3_reg, + NULL, + NULL, + }, + { + "se_id_lv4", + ETM_CRDT_SE_ID_LV4r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x185, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_se_id_lv4_reg, + NULL, + NULL, + }, + { + "que_id", + ETM_CRDT_QUE_IDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x186, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_que_id_reg, + NULL, + NULL, + }, + { + "se_info_lv0", + ETM_CRDT_SE_INFO_LV0r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x187, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_etm_crdt_se_info_lv0_reg, + NULL, + NULL, + }, + { + "se_info_lv1", + ETM_CRDT_SE_INFO_LV1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x188, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_etm_crdt_se_info_lv1_reg, + NULL, + NULL, + }, + { + "se_info_lv2", + ETM_CRDT_SE_INFO_LV2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x189, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_etm_crdt_se_info_lv2_reg, + NULL, + NULL, + }, + { + "se_info_lv3", + ETM_CRDT_SE_INFO_LV3r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x18a, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_etm_crdt_se_info_lv3_reg, + NULL, + NULL, + }, + { + "se_info_lv4", + ETM_CRDT_SE_INFO_LV4r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x18b, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_etm_crdt_se_info_lv4_reg, + NULL, + NULL, + }, + { + "que_state", + ETM_CRDT_QUE_STATEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x18c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_que_state_reg, + NULL, + NULL, + }, + { + "eir_off_in_advance", + ETM_CRDT_EIR_OFF_IN_ADVANCEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x190, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_eir_off_in_advance_reg, + NULL, + NULL, + }, + { + "double_level_shap_prevent", + ETM_CRDT_DOUBLE_LEVEL_SHAP_PREVENTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x192, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_double_level_shap_prevent_reg, + NULL, + NULL, + }, + { + "add_store_cycle", + ETM_CRDT_ADD_STORE_CYCLEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x193, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_add_store_cycle_reg, + NULL, + NULL, + }, + { + "tflag2_wr_flag_sum", + ETM_CRDT_TFLAG2_WR_FLAG_SUMr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x194, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_tflag2_wr_flag_sum_reg, + NULL, + NULL, + }, + { + "flowque_para_tbl", + ETM_CRDT_FLOWQUE_PARA_TBLr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x00000000 + 0x200000, + (32/8), + 0, + 0x47FF + 1, + 0, + 1, + 3, + g_etm_crdt_flowque_para_tbl_reg, + NULL, + NULL, + }, + { + "se_para_tbl", + ETM_CRDT_SE_PARA_TBLr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x80000000 + 0x300000, + (64/8), + 0, + 0x63FF + 1, + 0, + 1, + 5, + g_etm_crdt_se_para_tbl_reg, + NULL, + NULL, + }, + { + "flowque_ins_tbl", + ETM_CRDT_FLOWQUE_INS_TBLr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x00000000 + 0x400000, + (32/8), + 0, + 0x47FF + 1, + 0, + 1, + 1, + g_etm_crdt_flowque_ins_tbl_reg, + NULL, + NULL, + }, + { + "se_ins_tbl", + ETM_CRDT_SE_INS_TBLr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x00000000 + 0x500000, + (32/8), + 0, + 0x63FF + 1, + 0, + 1, + 2, + g_etm_crdt_se_ins_tbl_reg, + NULL, + NULL, + }, + { + "eir_crs_filter_tbl", + ETM_CRDT_EIR_CRS_FILTER_TBLr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x00000000 + 0x600000, + (32/8), + 0, + 0x23FF + 1, + 0, + 1, + 1, + g_etm_crdt_eir_crs_filter_tbl_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_cfg_done", + ETM_QMU_QCFG_QLIST_CFG_DONEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x10, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qcfg_qlist_cfg_done_reg, + NULL, + NULL, + }, + { + "qcfg_qsch_credit_value", + ETM_QMU_QCFG_QSCH_CREDIT_VALUEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x11, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qcfg_qsch_credit_value_reg, + NULL, + NULL, + }, + { + "qcfg_qsch_crbal_init_value", + ETM_QMU_QCFG_QSCH_CRBAL_INIT_VALUEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qcfg_qsch_crbal_init_value_reg, + NULL, + NULL, + }, + { + "qcfg_qsch_crbal_init_mask", + ETM_QMU_QCFG_QSCH_CRBAL_INIT_MASKr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x13, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qcfg_qsch_crbal_init_mask_reg, + NULL, + NULL, + }, + { + "cmdsch_rd_cmd_aful_th", + ETM_QMU_CMDSCH_RD_CMD_AFUL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x22, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cmdsch_rd_cmd_aful_th_reg, + NULL, + NULL, + }, + { + "cfg_port_fc_interval", + ETM_QMU_CFG_PORT_FC_INTERVALr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x23, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_port_fc_interval_reg, + NULL, + NULL, + }, + { + "qcfg_csch_aged_cfg", + ETM_QMU_QCFG_CSCH_AGED_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x24, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qcfg_csch_aged_cfg_reg, + NULL, + NULL, + }, + { + "qcfg_csch_aged_scan_time", + ETM_QMU_QCFG_CSCH_AGED_SCAN_TIMEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x25, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qcfg_csch_aged_scan_time_reg, + NULL, + NULL, + }, + { + "qcfg_qmu_qlist_state_query", + ETM_QMU_QCFG_QMU_QLIST_STATE_QUERYr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x26, + (32/8), + 0, + 0, + 0, + 0, + 19, + g_etm_qmu_qcfg_qmu_qlist_state_query_reg, + NULL, + NULL, + }, + { + "cfgmt_qsch_crbal_drop_en", + ETM_QMU_CFGMT_QSCH_CRBAL_DROP_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x27, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_qmu_cfgmt_qsch_crbal_drop_en_reg, + NULL, + NULL, + }, + { + "cfgmt_wlist_qnum_fifo_aful_th", + ETM_QMU_CFGMT_WLIST_QNUM_FIFO_AFUL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x29, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_wlist_qnum_fifo_aful_th_reg, + NULL, + NULL, + }, + { + "qcfg_csw_pkt_blk_mode", + ETM_QMU_QCFG_CSW_PKT_BLK_MODEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x28, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qcfg_csw_pkt_blk_mode_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_ram_init_cancel", + ETM_QMU_QCFG_QLIST_RAM_INIT_CANCELr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qcfg_qlist_ram_init_cancel_reg, + NULL, + NULL, + }, + { + "qcfg_qsch_crbal_transfer_mode", + ETM_QMU_QCFG_QSCH_CRBAL_TRANSFER_MODEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2b, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_qmu_qcfg_qsch_crbal_transfer_mode_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_qclr_interval", + ETM_QMU_QCFG_QLIST_QCLR_INTERVALr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qcfg_qlist_qclr_interval_reg, + NULL, + NULL, + }, + { + "qcfg_qsch_qclr_rate", + ETM_QMU_QCFG_QSCH_QCLR_RATEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qcfg_qsch_qclr_rate_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_ddr_random", + ETM_QMU_QCFG_QLIST_DDR_RANDOMr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2f, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qcfg_qlist_ddr_random_reg, + NULL, + NULL, + }, + { + "cfgmt_qlist_pds_fifo_afull_th", + ETM_QMU_CFGMT_QLIST_PDS_FIFO_AFULL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x30, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_qlist_pds_fifo_afull_th_reg, + NULL, + NULL, + }, + { + "cfgmt_sop_cmd_fifo_afull_th", + ETM_QMU_CFGMT_SOP_CMD_FIFO_AFULL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x31, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_sop_cmd_fifo_afull_th_reg, + NULL, + NULL, + }, + { + "cfgmt_non_sop_cmd_fifo_afull_th", + ETM_QMU_CFGMT_NON_SOP_CMD_FIFO_AFULL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x32, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_non_sop_cmd_fifo_afull_th_reg, + NULL, + NULL, + }, + { + "cfgmt_mmu_data_fifo_afull_th", + ETM_QMU_CFGMT_MMU_DATA_FIFO_AFULL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x33, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_mmu_data_fifo_afull_th_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_bank_ept_th", + ETM_QMU_QCFG_QLIST_BANK_EPT_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x34, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qcfg_qlist_bank_ept_th_reg, + NULL, + NULL, + }, + { + "random_bypass_en", + ETM_QMU_RANDOM_BYPASS_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x36, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_random_bypass_en_reg, + NULL, + NULL, + }, + { + "cfgmt_crs_spd_bypass", + ETM_QMU_CFGMT_CRS_SPD_BYPASSr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x37, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_crs_spd_bypass_reg, + NULL, + NULL, + }, + { + "cfgmt_crs_interval", + ETM_QMU_CFGMT_CRS_INTERVALr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x38, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_crs_interval_reg, + NULL, + NULL, + }, + { + "cfg_qsch_auto_credit_control_en", + ETM_QMU_CFG_QSCH_AUTO_CREDIT_CONTROL_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x3b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_auto_credit_control_en_reg, + NULL, + NULL, + }, + { + "cfg_qsch_autocrfrstque", + ETM_QMU_CFG_QSCH_AUTOCRFRSTQUEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x3c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_autocrfrstque_reg, + NULL, + NULL, + }, + { + "cfg_qsch_autocrlastque", + ETM_QMU_CFG_QSCH_AUTOCRLASTQUEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x3d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_autocrlastque_reg, + NULL, + NULL, + }, + { + "cfg_qsch_autocreditrate", + ETM_QMU_CFG_QSCH_AUTOCREDITRATEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x3e, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_autocreditrate_reg, + NULL, + NULL, + }, + { + "cfg_qsch_scanfrstque", + ETM_QMU_CFG_QSCH_SCANFRSTQUEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x51, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_scanfrstque_reg, + NULL, + NULL, + }, + { + "cfg_qsch_scanlastque", + ETM_QMU_CFG_QSCH_SCANLASTQUEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x52, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_scanlastque_reg, + NULL, + NULL, + }, + { + "cfg_qsch_scanrate", + ETM_QMU_CFG_QSCH_SCANRATEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x53, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_scanrate_reg, + NULL, + NULL, + }, + { + "cfg_qsch_scan_en", + ETM_QMU_CFG_QSCH_SCAN_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x54, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_scan_en_reg, + NULL, + NULL, + }, + { + "cfgmt_qsch_rd_credit_fifo_rate", + ETM_QMU_CFGMT_QSCH_RD_CREDIT_FIFO_RATEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x7c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_qsch_rd_credit_fifo_rate_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_bdep", + ETM_QMU_QCFG_QLIST_BDEPr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x9a7, + (32/8), + 0, + 0x3F + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qlist_bdep_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_bhead", + ETM_QMU_QCFG_QLIST_BHEADr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x9e7, + (32/8), + 0, + 0x3F + 1, + 0, + 1, + 2, + g_etm_qmu_qcfg_qlist_bhead_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_btail", + ETM_QMU_QCFG_QLIST_BTAILr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0xa27, + (32/8), + 0, + 0x3F + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qlist_btail_reg, + NULL, + NULL, + }, + { + "qcfg_qsch_shap_param", + ETM_QMU_QCFG_QSCH_SHAP_PARAMr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0xfc, + (32/8), + 0, + 0x3F + 1, + 0, + 1, + 3, + g_etm_qmu_qcfg_qsch_shap_param_reg, + NULL, + NULL, + }, + { + "qcfg_qsch_shap_token", + ETM_QMU_QCFG_QSCH_SHAP_TOKENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x185, + (32/8), + 0, + 0x3F + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qsch_shap_token_reg, + NULL, + NULL, + }, + { + "qcfg_qsch_shap_offset", + ETM_QMU_QCFG_QSCH_SHAP_OFFSETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x20e, + (32/8), + 0, + 0x3F + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qsch_shap_offset_reg, + NULL, + NULL, + }, + { + "qcfg_qsch_crs_eir_th", + ETM_QMU_QCFG_QSCH_CRS_EIR_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x250, + (32/8), + 0, + 0xF + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qsch_crs_eir_th_reg, + NULL, + NULL, + }, + { + "qcfg_qsch_crs_th1", + ETM_QMU_QCFG_QSCH_CRS_TH1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x297, + (32/8), + 0, + 0xF + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qsch_crs_th1_reg, + NULL, + NULL, + }, + { + "qcfg_qsch_crs_th2", + ETM_QMU_QCFG_QSCH_CRS_TH2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x2a7, + (32/8), + 0, + 0xF + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qsch_crs_th2_reg, + NULL, + NULL, + }, + { + "qcfg_csch_congest_th", + ETM_QMU_QCFG_CSCH_CONGEST_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x2b7, + (32/8), + 0, + 0x3F + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_csch_congest_th_reg, + NULL, + NULL, + }, + { + "qcfg_csch_sp_fc_th", + ETM_QMU_QCFG_CSCH_SP_FC_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x330, + (32/8), + 0, + 0x140 + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_csch_sp_fc_th_reg, + NULL, + NULL, + }, + { + "qcfg_csw_shap_parameter", + ETM_QMU_QCFG_CSW_SHAP_PARAMETERr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x5d0, + (32/8), + 0, + 0x3F + 1, + 0, + 1, + 2, + g_etm_qmu_qcfg_csw_shap_parameter_reg, + NULL, + NULL, + }, + { + "cfgmt_rd_release_aful_th", + ETM_QMU_CFGMT_RD_RELEASE_AFUL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x58e, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_rd_release_aful_th_reg, + NULL, + NULL, + }, + { + "cfgmt_drop_imem_release_fifo_aful_th", + ETM_QMU_CFGMT_DROP_IMEM_RELEASE_FIFO_AFUL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x58f, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_drop_imem_release_fifo_aful_th_reg, + NULL, + NULL, + }, + { + "cfgmt_nnh_rd_buf_aful_th", + ETM_QMU_CFGMT_NNH_RD_BUF_AFUL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x590, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_nnh_rd_buf_aful_th_reg, + NULL, + NULL, + }, + { + "cfg_pid_use_inall", + ETM_QMU_CFG_PID_USE_INALLr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x591, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_pid_use_inall_reg, + NULL, + NULL, + }, + { + "cfg_pid_round_th", + ETM_QMU_CFG_PID_ROUND_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x592, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_pid_round_th_reg, + NULL, + NULL, + }, + { + "cfgmt_credit_fifo_afull_th", + ETM_QMU_CFGMT_CREDIT_FIFO_AFULL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x593, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_credit_fifo_afull_th_reg, + NULL, + NULL, + }, + { + "cfgmt_scan_fifo_afull_th", + ETM_QMU_CFGMT_SCAN_FIFO_AFULL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x594, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_scan_fifo_afull_th_reg, + NULL, + NULL, + }, + { + "cfgmt_small_fifo_aful_th", + ETM_QMU_CFGMT_SMALL_FIFO_AFUL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x595, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_small_fifo_aful_th_reg, + NULL, + NULL, + }, + { + "cfgmt_free_addr_fifo_aful_th", + ETM_QMU_CFGMT_FREE_ADDR_FIFO_AFUL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x596, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_free_addr_fifo_aful_th_reg, + NULL, + NULL, + }, + { + "cfgmt_enq_rpt_fifo_aful_th", + ETM_QMU_CFGMT_ENQ_RPT_FIFO_AFUL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x597, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_enq_rpt_fifo_aful_th_reg, + NULL, + NULL, + }, + { + "qcfg_csw_shap_token_depth", + ETM_QMU_QCFG_CSW_SHAP_TOKEN_DEPTHr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x656, + (32/8), + 0, + 0x3F + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_csw_shap_token_depth_reg, + NULL, + NULL, + }, + { + "qcfg_csw_shap_offset_value", + ETM_QMU_QCFG_CSW_SHAP_OFFSET_VALUEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x6cf, + (32/8), + 0, + 0x3F + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_csw_shap_offset_value_reg, + NULL, + NULL, + }, + { + "qcfg_csw_fc_offset_value", + ETM_QMU_QCFG_CSW_FC_OFFSET_VALUEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x750, + (32/8), + 0, + 0x3F + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_csw_fc_offset_value_reg, + NULL, + NULL, + }, + { + "qmu_init_done_state", + ETM_QMU_QMU_INIT_DONE_STATEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2000, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_etm_qmu_qmu_init_done_state_reg, + NULL, + NULL, + }, + { + "csw_qcfg_port_shap_rdy_0", + ETM_QMU_CSW_QCFG_PORT_SHAP_RDY_0r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2001, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_csw_qcfg_port_shap_rdy_0_reg, + NULL, + NULL, + }, + { + "csw_qcfg_port_shap_rdy_1", + ETM_QMU_CSW_QCFG_PORT_SHAP_RDY_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2002, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_csw_qcfg_port_shap_rdy_1_reg, + NULL, + NULL, + }, + { + "qlist_cfgmt_ram_init_done", + ETM_QMU_QLIST_CFGMT_RAM_INIT_DONEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2015, + (32/8), + 0, + 0, + 0, + 0, + 8, + g_etm_qmu_qlist_cfgmt_ram_init_done_reg, + NULL, + NULL, + }, + { + "qlist_cfgmt_ram_ecc_err", + ETM_QMU_QLIST_CFGMT_RAM_ECC_ERRr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2016, + (32/8), + 0, + 0, + 0, + 0, + 30, + g_etm_qmu_qlist_cfgmt_ram_ecc_err_reg, + NULL, + NULL, + }, + { + "qlist_cfgmt_ram_slot_err", + ETM_QMU_QLIST_CFGMT_RAM_SLOT_ERRr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2017, + (32/8), + 0, + 0, + 0, + 0, + 20, + g_etm_qmu_qlist_cfgmt_ram_slot_err_reg, + NULL, + NULL, + }, + { + "qsch_cfgmt_ram_ecc", + ETM_QMU_QSCH_CFGMT_RAM_ECCr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2018, + (32/8), + 0, + 0, + 0, + 0, + 27, + g_etm_qmu_qsch_cfgmt_ram_ecc_reg, + NULL, + NULL, + }, + { + "qlist_cfgmt_fifo_state", + ETM_QMU_QLIST_CFGMT_FIFO_STATEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2019, + (32/8), + 0, + 0, + 0, + 0, + 26, + g_etm_qmu_qlist_cfgmt_fifo_state_reg, + NULL, + NULL, + }, + { + "qlist_qcfg_clr_done", + ETM_QMU_QLIST_QCFG_CLR_DONEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x201a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qlist_qcfg_clr_done_reg, + NULL, + NULL, + }, + { + "qmu_int_mask1", + ETM_QMU_QMU_INT_MASK1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x201b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qmu_int_mask1_reg, + NULL, + NULL, + }, + { + "qmu_int_mask2", + ETM_QMU_QMU_INT_MASK2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x201c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qmu_int_mask2_reg, + NULL, + NULL, + }, + { + "qmu_int_mask3", + ETM_QMU_QMU_INT_MASK3r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x201d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qmu_int_mask3_reg, + NULL, + NULL, + }, + { + "qmu_int_mask4", + ETM_QMU_QMU_INT_MASK4r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x201e, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qmu_int_mask4_reg, + NULL, + NULL, + }, + { + "qmu_int_mask5", + ETM_QMU_QMU_INT_MASK5r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x201f, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qmu_int_mask5_reg, + NULL, + NULL, + }, + { + "qmu_int_mask6", + ETM_QMU_QMU_INT_MASK6r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2013, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qmu_int_mask6_reg, + NULL, + NULL, + }, + { + "cmd_sch_cfgmt_fifo_state", + ETM_QMU_CMD_SCH_CFGMT_FIFO_STATEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2020, + (32/8), + 0, + 0, + 0, + 0, + 26, + g_etm_qmu_cmd_sch_cfgmt_fifo_state_reg, + NULL, + NULL, + }, + { + "qlist_r_bcnt", + ETM_QMU_QLIST_R_BCNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x60000, + (32/8), + 0, + 0x23ff + 1, + 0, + 1, + 1, + g_etm_qmu_qlist_r_bcnt_reg, + NULL, + NULL, + }, + { + "qsch_rw_crbal", + ETM_QMU_QSCH_RW_CRBALr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x70000, + (32/8), + 0, + 0x23ff + 1, + 0, + 1, + 1, + g_etm_qmu_qsch_rw_crbal_reg, + NULL, + NULL, + }, + { + "qsch_rw_crs", + ETM_QMU_QSCH_RW_CRSr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x80000, + (32/8), + 0, + 0x23ff + 1, + 0, + 1, + 1, + g_etm_qmu_qsch_rw_crs_reg, + NULL, + NULL, + }, + { + "qsch_r_wlist_empty", + ETM_QMU_QSCH_R_WLIST_EMPTYr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0xa0000, + (32/8), + 0, + 0xfff + 1, + 0, + 1, + 1, + g_etm_qmu_qsch_r_wlist_empty_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_baram_rd", + ETM_QMU_QCFG_QLIST_BARAM_RDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0xe0000, + (32/8), + 0, + 0x7ff + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qlist_baram_rd_reg, + NULL, + NULL, + }, + { + "qcfg_qsch_crbal_fb_rw", + ETM_QMU_QCFG_QSCH_CRBAL_FB_RWr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0xb0000, + (32/8), + 0, + 0x23ff + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qsch_crbal_fb_rw_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_grp0_bank", + ETM_QMU_QCFG_QLIST_GRP0_BANKr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x7c1, + (32/8), + 0, + 0x3f + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qlist_grp0_bank_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_grp1_bank", + ETM_QMU_QCFG_QLIST_GRP1_BANKr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x801, + (32/8), + 0, + 0x3f + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qlist_grp1_bank_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_grp2_bank", + ETM_QMU_QCFG_QLIST_GRP2_BANKr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x841, + (32/8), + 0, + 0x3f + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qlist_grp2_bank_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_grp3_bank", + ETM_QMU_QCFG_QLIST_GRP3_BANKr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x881, + (32/8), + 0, + 0x3f + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qlist_grp3_bank_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_grp4_bank", + ETM_QMU_QCFG_QLIST_GRP4_BANKr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x8c1, + (32/8), + 0, + 0x3f + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qlist_grp4_bank_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_grp5_bank", + ETM_QMU_QCFG_QLIST_GRP5_BANKr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x967, + (32/8), + 0, + 0x3f + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qlist_grp5_bank_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_grp6_bank", + ETM_QMU_QCFG_QLIST_GRP6_BANKr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0xc00, + (32/8), + 0, + 0x3f + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qlist_grp6_bank_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_grp7_bank", + ETM_QMU_QCFG_QLIST_GRP7_BANKr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0xc40, + (32/8), + 0, + 0x3f + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qlist_grp7_bank_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_grp", + ETM_QMU_QCFG_QLIST_GRPr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x901, + (32/8), + 0, + 0x3f + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qlist_grp_reg, + NULL, + NULL, + }, + { + "cfgmt_active_to_bank_cfg", + ETM_QMU_CFGMT_ACTIVE_TO_BANK_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x941, + (32/8), + 0, + 0xf + 1, + 0, + 1, + 1, + g_etm_qmu_cfgmt_active_to_bank_cfg_reg, + NULL, + NULL, + }, + { + "cfgmt_ddr_in_mmu_cfg", + ETM_QMU_CFGMT_DDR_IN_MMU_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x951, + (32/8), + 0, + 0x7 + 1, + 0, + 1, + 1, + g_etm_qmu_cfgmt_ddr_in_mmu_cfg_reg, + NULL, + NULL, + }, + { + "cfgmt_ddr_in_qmu_cfg", + ETM_QMU_CFGMT_DDR_IN_QMU_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x959, + (32/8), + 0, + 0x9 + 1, + 0, + 1, + 1, + g_etm_qmu_cfgmt_ddr_in_qmu_cfg_reg, + NULL, + NULL, + }, + { + "cfgmt_bank_to_mmu_cfg", + ETM_QMU_CFGMT_BANK_TO_MMU_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0xb00, + (32/8), + 0, + 0x3f + 1, + 0, + 1, + 1, + g_etm_qmu_cfgmt_bank_to_mmu_cfg_reg, + NULL, + NULL, + }, + { + "cfgmt_bank_to_qmu_cfg", + ETM_QMU_CFGMT_BANK_TO_QMU_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0xb40, + (32/8), + 0, + 0x4f + 1, + 0, + 1, + 1, + g_etm_qmu_cfgmt_bank_to_qmu_cfg_reg, + NULL, + NULL, + }, + { + "cfgmt_grp_ram_n_clr_thd", + ETM_QMU_CFGMT_GRP_RAM_N_CLR_THDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xe0a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_grp_ram_n_clr_thd_reg, + NULL, + NULL, + }, + { + "cfgmt_age_pkt_num", + ETM_QMU_CFGMT_AGE_PKT_NUMr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xe00, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_age_pkt_num_reg, + NULL, + NULL, + }, + { + "cfgmt_age_multi_interval", + ETM_QMU_CFGMT_AGE_MULTI_INTERVALr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xe01, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_age_multi_interval_reg, + NULL, + NULL, + }, + { + "cfgmt_qmu_pkt_age_en", + ETM_QMU_CFGMT_QMU_PKT_AGE_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xe02, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_qmu_pkt_age_en_reg, + NULL, + NULL, + }, + { + "cfgmt_qmu_pkt_age_interval", + ETM_QMU_CFGMT_QMU_PKT_AGE_INTERVALr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xe03, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_qmu_pkt_age_interval_reg, + NULL, + NULL, + }, + { + "cfgmt_qmu_pkt_age_start_end", + ETM_QMU_CFGMT_QMU_PKT_AGE_START_ENDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xe04, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_qmu_cfgmt_qmu_pkt_age_start_end_reg, + NULL, + NULL, + }, + { + "cfgmt_pkt_age_req_aful_th", + ETM_QMU_CFGMT_PKT_AGE_REQ_AFUL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xe05, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_pkt_age_req_aful_th_reg, + NULL, + NULL, + }, + { + "cfgmt_pkt_age_step_interval", + ETM_QMU_CFGMT_PKT_AGE_STEP_INTERVALr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xe12, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_pkt_age_step_interval_reg, + NULL, + NULL, + }, + { + "cfgmt_qmu_imem_age_mode", + ETM_QMU_CFGMT_QMU_IMEM_AGE_MODEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xe06, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_etm_qmu_cfgmt_qmu_imem_age_mode_reg, + NULL, + NULL, + }, + { + "cfgmt_qmu_imem_qlen_age_interval", + ETM_QMU_CFGMT_QMU_IMEM_QLEN_AGE_INTERVALr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xe07, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_qmu_imem_qlen_age_interval_reg, + NULL, + NULL, + }, + { + "cfgmt_qmu_imem_time_age_interval", + ETM_QMU_CFGMT_QMU_IMEM_TIME_AGE_INTERVALr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xe08, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_qmu_imem_time_age_interval_reg, + NULL, + NULL, + }, + { + "cfgmt_qmu_imem_qlen_age_thd", + ETM_QMU_CFGMT_QMU_IMEM_QLEN_AGE_THDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xe09, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_qmu_imem_qlen_age_thd_reg, + NULL, + NULL, + }, + { + "cfgmt_imem_age_step_interval", + ETM_QMU_CFGMT_IMEM_AGE_STEP_INTERVALr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xe13, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_imem_age_step_interval_reg, + NULL, + NULL, + }, + { + "cfgmt_qmu_ecc_bypass_read", + ETM_QMU_CFGMT_QMU_ECC_BYPASS_READr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xe0b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_qmu_ecc_bypass_read_reg, + NULL, + NULL, + }, + { + "cfgmt_qmu_resp_stat_fc_en", + ETM_QMU_CFGMT_QMU_RESP_STAT_FC_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xe0c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_qmu_resp_stat_fc_en_reg, + NULL, + NULL, + }, + { + "cfgmt_qmu_bank_xoff_pds_mode", + ETM_QMU_CFGMT_QMU_BANK_XOFF_PDS_MODEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xe10, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_qmu_bank_xoff_pds_mode_reg, + NULL, + NULL, + }, + { + "cfgmt_qmu_stat_offset", + ETM_QMU_CFGMT_QMU_STAT_OFFSETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xe11, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_qmu_stat_offset_reg, + NULL, + NULL, + }, + { + "fc_cnt_mode", + ETM_QMU_FC_CNT_MODEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2800, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_fc_cnt_mode_reg, + NULL, + NULL, + }, + { + "mmu_qmu_wr_fc_cnt", + ETM_QMU_MMU_QMU_WR_FC_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2801, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_mmu_qmu_wr_fc_cnt_reg, + NULL, + NULL, + }, + { + "mmu_qmu_rd_fc_cnt", + ETM_QMU_MMU_QMU_RD_FC_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2802, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_mmu_qmu_rd_fc_cnt_reg, + NULL, + NULL, + }, + { + "qmu_cgavd_fc_cnt", + ETM_QMU_QMU_CGAVD_FC_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2803, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qmu_cgavd_fc_cnt_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_pkt_cnt", + ETM_QMU_CGAVD_QMU_PKT_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2804, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cgavd_qmu_pkt_cnt_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_pktlen_all", + ETM_QMU_CGAVD_QMU_PKTLEN_ALLr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2805, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cgavd_qmu_pktlen_all_reg, + NULL, + NULL, + }, + { + "observe_portfc_spec", + ETM_QMU_OBSERVE_PORTFC_SPECr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2818, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_observe_portfc_spec_reg, + NULL, + NULL, + }, + { + "spec_lif_portfc_count", + ETM_QMU_SPEC_LIF_PORTFC_COUNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2819, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_lif_portfc_count_reg, + NULL, + NULL, + }, + { + "cfgmt_qmu_pfc_en", + ETM_QMU_CFGMT_QMU_PFC_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_qmu_pfc_en_reg, + NULL, + NULL, + }, + { + "cfgmt_qmu_pfc_mask_1", + ETM_QMU_CFGMT_QMU_PFC_MASK_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20e1, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_qmu_pfc_mask_1_reg, + NULL, + NULL, + }, + { + "cfgmt_qmu_pfc_mask_2", + ETM_QMU_CFGMT_QMU_PFC_MASK_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20e2, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_qmu_pfc_mask_2_reg, + NULL, + NULL, + }, + { + "int_repeat", + CFG_PCIE_INT_REPEATr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x0dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_int_repeat_reg, + NULL, + NULL, + }, + { + "dma_up_size", + CFG_DMA_DMA_UP_SIZEr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x020, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_up_size_reg, + NULL, + NULL, + }, + { + "soc_wr_time_out_thresh", + CFG_CSR_SOC_WR_TIME_OUT_THRESHr, + CFG, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x028, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_soc_wr_time_out_thresh_reg, + NULL, + NULL, + }, + { + "cfg_shap_param", + NPPU_MR_CFG_CFG_SHAP_PARAMr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0024, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_nppu_mr_cfg_cfg_shap_param_reg, + NULL, + NULL, + }, + { + "cfg_shap_token", + NPPU_MR_CFG_CFG_SHAP_TOKENr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0028, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_nppu_mr_cfg_cfg_shap_token_reg, + NULL, + NULL, + }, + { + "idle_ptr_fifo_aful_th", + NPPU_MR_CFG_IDLE_PTR_FIFO_AFUL_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x003c, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_nppu_mr_cfg_idle_ptr_fifo_aful_th_reg, + NULL, + NULL, + }, + { + "mr_cos_port_cfg", + NPPU_MR_CFG_MR_COS_PORT_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0104, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_nppu_mr_cfg_mr_cos_port_cfg_reg, + NULL, + NULL, + }, + { + "ind_status", + NPPU_PKTRX_CFG_IND_STATUSr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_ind_status_reg, + NULL, + NULL, + }, + { + "ind_cmd", + NPPU_PKTRX_CFG_IND_CMDr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0004, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_nppu_pktrx_cfg_ind_cmd_reg, + NULL, + NULL, + }, + { + "ind_data0", + NPPU_PKTRX_CFG_IND_DATA0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_ind_data0_reg, + NULL, + NULL, + }, + { + "ind_data1", + NPPU_PKTRX_CFG_IND_DATA1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x000c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_ind_data1_reg, + NULL, + NULL, + }, + { + "ind_data2", + NPPU_PKTRX_CFG_IND_DATA2r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0010, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_ind_data2_reg, + NULL, + NULL, + }, + { + "ind_data3", + NPPU_PKTRX_CFG_IND_DATA3r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0014, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_ind_data3_reg, + NULL, + NULL, + }, + { + "ind_data4", + NPPU_PKTRX_CFG_IND_DATA4r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0018, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_ind_data4_reg, + NULL, + NULL, + }, + { + "ind_data5", + NPPU_PKTRX_CFG_IND_DATA5r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x001c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_ind_data5_reg, + NULL, + NULL, + }, + { + "ind_data6", + NPPU_PKTRX_CFG_IND_DATA6r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0020, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_ind_data6_reg, + NULL, + NULL, + }, + { + "ind_data7", + NPPU_PKTRX_CFG_IND_DATA7r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0024, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_ind_data7_reg, + NULL, + NULL, + }, + { + "tcam_0_cmd", + NPPU_PKTRX_CFG_TCAM_0_CMDr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0028, + (32/8), + 0, + 0, + 0, + 0, + 11, + g_nppu_pktrx_cfg_tcam_0_cmd_reg, + NULL, + NULL, + }, + { + "tcam_1_cmd", + NPPU_PKTRX_CFG_TCAM_1_CMDr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x002c, + (32/8), + 0, + 0, + 0, + 0, + 8, + g_nppu_pktrx_cfg_tcam_1_cmd_reg, + NULL, + NULL, + }, + { + "port_en_0", + NPPU_PKTRX_CFG_PORT_EN_0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0030, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_port_en_0_reg, + NULL, + NULL, + }, + { + "port_en_1", + NPPU_PKTRX_CFG_PORT_EN_1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0034, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_port_en_1_reg, + NULL, + NULL, + }, + { + "port_en_2", + NPPU_PKTRX_CFG_PORT_EN_2r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0038, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_port_en_2_reg, + NULL, + NULL, + }, + { + "port_en_3", + NPPU_PKTRX_CFG_PORT_EN_3r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x003c, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_nppu_pktrx_cfg_port_en_3_reg, + NULL, + NULL, + }, + { + "cfg_port_l2_offset_mode_0", + NPPU_PKTRX_CFG_CFG_PORT_L2_OFFSET_MODE_0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0040, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_cfg_port_l2_offset_mode_0_reg, + NULL, + NULL, + }, + { + "cfg_port_l2_offset_mode_1", + NPPU_PKTRX_CFG_CFG_PORT_L2_OFFSET_MODE_1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0044, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_cfg_port_l2_offset_mode_1_reg, + NULL, + NULL, + }, + { + "cfg_port_l2_offset_mode_2", + NPPU_PKTRX_CFG_CFG_PORT_L2_OFFSET_MODE_2r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0048, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_cfg_port_l2_offset_mode_2_reg, + NULL, + NULL, + }, + { + "cfg_port_l2_offset_mode_3", + NPPU_PKTRX_CFG_CFG_PORT_L2_OFFSET_MODE_3r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x004c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_cfg_port_l2_offset_mode_3_reg, + NULL, + NULL, + }, + { + "port_fc_mode_0", + NPPU_PKTRX_CFG_PORT_FC_MODE_0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0050, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_port_fc_mode_0_reg, + NULL, + NULL, + }, + { + "port_fc_mode_1", + NPPU_PKTRX_CFG_PORT_FC_MODE_1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0054, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_port_fc_mode_1_reg, + NULL, + NULL, + }, + { + "port_fc_mode_2", + NPPU_PKTRX_CFG_PORT_FC_MODE_2r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0058, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_port_fc_mode_2_reg, + NULL, + NULL, + }, + { + "port_fc_mode_3", + NPPU_PKTRX_CFG_PORT_FC_MODE_3r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x005c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_port_fc_mode_3_reg, + NULL, + NULL, + }, + { + "port_fc_mode_4", + NPPU_PKTRX_CFG_PORT_FC_MODE_4r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0060, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_port_fc_mode_4_reg, + NULL, + NULL, + }, + { + "port_fc_mode_5", + NPPU_PKTRX_CFG_PORT_FC_MODE_5r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0064, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_port_fc_mode_5_reg, + NULL, + NULL, + }, + { + "port_fc_mode_6", + NPPU_PKTRX_CFG_PORT_FC_MODE_6r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0068, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_port_fc_mode_6_reg, + NULL, + NULL, + }, + { + "port_fc_mode_7", + NPPU_PKTRX_CFG_PORT_FC_MODE_7r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x006c, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_nppu_pktrx_cfg_port_fc_mode_7_reg, + NULL, + NULL, + }, + { + "cfg_isch_aging_th", + NPPU_PKTRX_CFG_CFG_ISCH_AGING_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0070, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_nppu_pktrx_cfg_cfg_isch_aging_th_reg, + NULL, + NULL, + }, + { + "isch_fifo_th_0", + NPPU_PKTRX_CFG_ISCH_FIFO_TH_0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0074, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_nppu_pktrx_cfg_isch_fifo_th_0_reg, + NULL, + NULL, + }, + { + "isch_cfg_1", + NPPU_PKTRX_CFG_ISCH_CFG_1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x008c, + (32/8), + 0, + 0, + 0, + 0, + 5, + g_nppu_pktrx_cfg_isch_cfg_1_reg, + NULL, + NULL, + }, + { + "tcam_0_vld", + NPPU_PKTRX_CFG_TCAM_0_VLDr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x00d4, + (32/8), + 0, + 7 + 1, + 0, + 4, + 1, + g_nppu_pktrx_cfg_tcam_0_vld_reg, + NULL, + NULL, + }, + { + "tcam_1_vld", + NPPU_PKTRX_CFG_TCAM_1_VLDr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x00f4, + (32/8), + 0, + 7 + 1, + 0, + 4, + 1, + g_nppu_pktrx_cfg_tcam_1_vld_reg, + NULL, + NULL, + }, + { + "cpu_port_en_mask", + NPPU_PKTRX_CFG_CPU_PORT_EN_MASKr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x01f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_cpu_port_en_mask_reg, + NULL, + NULL, + }, + { + "pktrx_glbal_cfg_0", + NPPU_PKTRX_CFG_PKTRX_GLBAL_CFG_0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x01f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_pktrx_glbal_cfg_0_reg, + NULL, + NULL, + }, + { + "pktrx_glbal_cfg_1", + NPPU_PKTRX_CFG_PKTRX_GLBAL_CFG_1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x01fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_pktrx_glbal_cfg_1_reg, + NULL, + NULL, + }, + { + "pktrx_glbal_cfg_2", + NPPU_PKTRX_CFG_PKTRX_GLBAL_CFG_2r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0200, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_pktrx_glbal_cfg_2_reg, + NULL, + NULL, + }, + { + "pktrx_glbal_cfg_3", + NPPU_PKTRX_CFG_PKTRX_GLBAL_CFG_3r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0204, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_pktrx_glbal_cfg_3_reg, + NULL, + NULL, + }, + { + "nppu_start", + NPPU_PKTRX_CFG_NPPU_STARTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0208, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_nppu_start_reg, + NULL, + NULL, + }, + { + "ind_status", + NPPU_PKTRX_STAT_IND_STATUSr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_STAT_BASE_ADDR + 0x0000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_stat_ind_status_reg, + NULL, + NULL, + }, + { + "ind_cmd", + NPPU_PKTRX_STAT_IND_CMDr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_STAT_BASE_ADDR + 0x0004, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_nppu_pktrx_stat_ind_cmd_reg, + NULL, + NULL, + }, + { + "ind_data0", + NPPU_PKTRX_STAT_IND_DATA0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_STAT_BASE_ADDR + 0x0008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_stat_ind_data0_reg, + NULL, + NULL, + }, + { + "debug_cnt_ovfl_mode", + NPPU_IDMA_CFG_DEBUG_CNT_OVFL_MODEr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_IDMA_CFG_BASE_ADDR + 0x4f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_idma_cfg_debug_cnt_ovfl_mode_reg, + NULL, + NULL, + }, + { + "ind_status", + NPPU_IDMA_STAT_IND_STATUSr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_IDMA_STAT_BASE_ADDR + 0x0400, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_idma_stat_ind_status_reg, + NULL, + NULL, + }, + { + "ind_cmd", + NPPU_IDMA_STAT_IND_CMDr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_IDMA_STAT_BASE_ADDR + 0x0404, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_nppu_idma_stat_ind_cmd_reg, + NULL, + NULL, + }, + { + "ind_data0", + NPPU_IDMA_STAT_IND_DATA0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_IDMA_STAT_BASE_ADDR + 0x0408, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_idma_stat_ind_data0_reg, + NULL, + NULL, + }, + { + "ind_status", + NPPU_PBU_CFG_IND_STATUSr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x400, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_ind_status_reg, + NULL, + NULL, + }, + { + "ind_cmd", + NPPU_PBU_CFG_IND_CMDr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x404, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_nppu_pbu_cfg_ind_cmd_reg, + NULL, + NULL, + }, + { + "ind_data0", + NPPU_PBU_CFG_IND_DATA0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x408, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_ind_data0_reg, + NULL, + NULL, + }, + { + "ind_data1", + NPPU_PBU_CFG_IND_DATA1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x40c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_ind_data1_reg, + NULL, + NULL, + }, + { + "ind_data2", + NPPU_PBU_CFG_IND_DATA2r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x410, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_ind_data2_reg, + NULL, + NULL, + }, + { + "ind_data3", + NPPU_PBU_CFG_IND_DATA3r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x414, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_ind_data3_reg, + NULL, + NULL, + }, + { + "ind_data4", + NPPU_PBU_CFG_IND_DATA4r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x418, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_ind_data4_reg, + NULL, + NULL, + }, + { + "ind_data5", + NPPU_PBU_CFG_IND_DATA5r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x41c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_ind_data5_reg, + NULL, + NULL, + }, + { + "ind_data6", + NPPU_PBU_CFG_IND_DATA6r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x420, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_ind_data6_reg, + NULL, + NULL, + }, + { + "ind_data7", + NPPU_PBU_CFG_IND_DATA7r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x424, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_ind_data7_reg, + NULL, + NULL, + }, + { + "idma_public_th", + NPPU_PBU_CFG_IDMA_PUBLIC_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x4c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_idma_public_th_reg, + NULL, + NULL, + }, + { + "lif_public_th", + NPPU_PBU_CFG_LIF_PUBLIC_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x4cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_lif_public_th_reg, + NULL, + NULL, + }, + { + "idma_total_th", + NPPU_PBU_CFG_IDMA_TOTAL_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x4d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_idma_total_th_reg, + NULL, + NULL, + }, + { + "lif_total_th", + NPPU_PBU_CFG_LIF_TOTAL_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x4d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_lif_total_th_reg, + NULL, + NULL, + }, + { + "mc_total_th", + NPPU_PBU_CFG_MC_TOTAL_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x4d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_mc_total_th_reg, + NULL, + NULL, + }, + { + "mc_cos10_th", + NPPU_PBU_CFG_MC_COS10_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x4dc, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_nppu_pbu_cfg_mc_cos10_th_reg, + NULL, + NULL, + }, + { + "mc_cos32_th", + NPPU_PBU_CFG_MC_COS32_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x4e0, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_nppu_pbu_cfg_mc_cos32_th_reg, + NULL, + NULL, + }, + { + "mc_cos54_th", + NPPU_PBU_CFG_MC_COS54_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x4e4, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_nppu_pbu_cfg_mc_cos54_th_reg, + NULL, + NULL, + }, + { + "mc_cos76_th", + NPPU_PBU_CFG_MC_COS76_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x4e8, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_nppu_pbu_cfg_mc_cos76_th_reg, + NULL, + NULL, + }, + { + "debug_cnt_ovfl_mode", + NPPU_PBU_CFG_DEBUG_CNT_OVFL_MODEr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x4f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_debug_cnt_ovfl_mode_reg, + NULL, + NULL, + }, + { + "se_key_aful_negate_cfg", + NPPU_PBU_CFG_SE_KEY_AFUL_NEGATE_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x530, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_se_key_aful_negate_cfg_reg, + NULL, + NULL, + }, + { + "sa_flag", + NPPU_PBU_CFG_SA_FLAGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x724, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_sa_flag_reg, + NULL, + NULL, + }, + { + "ind_data", + NPPU_PBU_STAT_IND_DATAr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_STAT_BASE_ADDR + 0x0000, + (32/8), + 0, + 127 + 1, + 0, + 4, + 1, + g_nppu_pbu_stat_ind_data_reg, + NULL, + NULL, + }, + { + "ind_status", + NPPU_PBU_STAT_IND_STATUSr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_STAT_BASE_ADDR + 0x0400, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_ind_status_reg, + NULL, + NULL, + }, + { + "ind_cmd", + NPPU_PBU_STAT_IND_CMDr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_STAT_BASE_ADDR + 0x0404, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_nppu_pbu_stat_ind_cmd_reg, + NULL, + NULL, + }, + { + "total_cnt", + NPPU_PBU_STAT_TOTAL_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_STAT_BASE_ADDR + 0x558, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_total_cnt_reg, + NULL, + NULL, + }, + { + "idma_pub_cnt", + NPPU_PBU_STAT_IDMA_PUB_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_STAT_BASE_ADDR + 0x55c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_idma_pub_cnt_reg, + NULL, + NULL, + }, + { + "lif_pub_cnt", + NPPU_PBU_STAT_LIF_PUB_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_STAT_BASE_ADDR + 0x560, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_lif_pub_cnt_reg, + NULL, + NULL, + }, + { + "mc_total_cnt", + NPPU_PBU_STAT_MC_TOTAL_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_STAT_BASE_ADDR + 0x564, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_mc_total_cnt_reg, + NULL, + NULL, + }, + { + "pbu_thram_init_done", + NPPU_PBU_STAT_PBU_THRAM_INIT_DONEr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_STAT_BASE_ADDR + 0x568, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_pbu_thram_init_done_reg, + NULL, + NULL, + }, + { + "ifb_fptr_init_done", + NPPU_PBU_STAT_IFB_FPTR_INIT_DONEr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_STAT_BASE_ADDR + 0x56c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_ifb_fptr_init_done_reg, + NULL, + NULL, + }, + { + "weight_normal_uc", + NPPU_ISU_CFG_WEIGHT_NORMAL_UCr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_CFG_BASE_ADDR + 0x0000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_cfg_weight_normal_uc_reg, + NULL, + NULL, + }, + { + "fabric_or_saip", + NPPU_ISU_CFG_FABRIC_OR_SAIPr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_CFG_BASE_ADDR + 0x0028, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_cfg_fabric_or_saip_reg, + NULL, + NULL, + }, + { + "ind_status", + NPPU_ISU_STAT_IND_STATUSr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_STAT_BASE_ADDR + 0x0000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_stat_ind_status_reg, + NULL, + NULL, + }, + { + "ind_cmd", + NPPU_ISU_STAT_IND_CMDr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_STAT_BASE_ADDR + 0x0004, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_nppu_isu_stat_ind_cmd_reg, + NULL, + NULL, + }, + { + "ind_dat0", + NPPU_ISU_STAT_IND_DAT0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_STAT_BASE_ADDR + 0x0008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_stat_ind_dat0_reg, + NULL, + NULL, + }, + { + "ind_access_done", + NPPU_ODMA_CFG_IND_ACCESS_DONEr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_ind_access_done_reg, + NULL, + NULL, + }, + { + "ind_command", + NPPU_ODMA_CFG_IND_COMMANDr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0004, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_nppu_odma_cfg_ind_command_reg, + NULL, + NULL, + }, + { + "ind_dat0", + NPPU_ODMA_CFG_IND_DAT0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_ind_dat0_reg, + NULL, + NULL, + }, + { + "ind_dat1", + NPPU_ODMA_CFG_IND_DAT1r, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x000c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_ind_dat1_reg, + NULL, + NULL, + }, + { + "fabric_or_saip", + NPPU_ODMA_CFG_FABRIC_OR_SAIPr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0010, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_fabric_or_saip_reg, + NULL, + NULL, + }, + { + "max_pkt_len", + NPPU_ODMA_CFG_MAX_PKT_LENr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x001c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_max_pkt_len_reg, + NULL, + NULL, + }, + { + "age_en", + NPPU_ODMA_CFG_AGE_ENr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0054, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_age_en_reg, + NULL, + NULL, + }, + { + "age_mode", + NPPU_ODMA_CFG_AGE_MODEr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0058, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_age_mode_reg, + NULL, + NULL, + }, + { + "age_value_time", + NPPU_ODMA_CFG_AGE_VALUE_TIMEr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x005c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_age_value_time_reg, + NULL, + NULL, + }, + { + "age_value_room", + NPPU_ODMA_CFG_AGE_VALUE_ROOMr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0060, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_age_value_room_reg, + NULL, + NULL, + }, + { + "age_out_cnt", + NPPU_ODMA_CFG_AGE_OUT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0064, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_age_out_cnt_reg, + NULL, + NULL, + }, + { + "token_value_a", + NPPU_ODMA_CFG_TOKEN_VALUE_Ar, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0114, + (32/8), + 0, + 59 + 1, + 0, + 4, + 1, + g_nppu_odma_cfg_token_value_a_reg, + NULL, + NULL, + }, + { + "token_value_b", + NPPU_ODMA_CFG_TOKEN_VALUE_Br, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0204, + (32/8), + 0, + 1 + 1, + 0, + 4, + 1, + g_nppu_odma_cfg_token_value_b_reg, + NULL, + NULL, + }, + { + "cfg_shap_en_p0", + NPPU_ODMA_CFG_CFG_SHAP_EN_P0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x020c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_cfg_shap_en_p0_reg, + NULL, + NULL, + }, + { + "cfg_shap_en_p1", + NPPU_ODMA_CFG_CFG_SHAP_EN_P1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0210, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_cfg_shap_en_p1_reg, + NULL, + NULL, + }, + { + "cfg_shap_en_tm", + NPPU_ODMA_CFG_CFG_SHAP_EN_TMr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0214, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_cfg_shap_en_tm_reg, + NULL, + NULL, + }, + { + "ind_status", + NPPU_ODMA_STAT_IND_STATUSr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_STAT_BASE_ADDR + 0x0000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_stat_ind_status_reg, + NULL, + NULL, + }, + { + "ind_cmd", + NPPU_ODMA_STAT_IND_CMDr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_STAT_BASE_ADDR + 0x0004, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_nppu_odma_stat_ind_cmd_reg, + NULL, + NULL, + }, + { + "ind_data0", + NPPU_ODMA_STAT_IND_DATA0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_STAT_BASE_ADDR + 0x0008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_stat_ind_data0_reg, + NULL, + NULL, + }, + { + "debug_cnt_cfg", + NPPU_ODMA_STAT_DEBUG_CNT_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_STAT_BASE_ADDR + 0x000c, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_nppu_odma_stat_debug_cnt_cfg_reg, + NULL, + NULL, + }, + { + "bfd_firstchk_th", + NPPU_OAM_CFG_BFD_FIRSTCHK_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0030, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_bfd_firstchk_th_reg, + NULL, + NULL, + }, + { + "pbu_fc_idmath_ram", + NPPU_PBU_CFG_MEMID_0_PBU_FC_IDMATH_RAMr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x0000, + (192/8), + 0, + 127 + 1, + 0, + 1, + 11, + g_nppu_pbu_cfg_memid_0_pbu_fc_idmath_ram_reg, + NULL, + NULL, + }, + { + "pbu_fc_macth_ram", + NPPU_PBU_CFG_MEMID_1_PBU_FC_MACTH_RAMr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x0000, + (128/8), + 0, + 56 + 1, + 0, + 1, + 8, + g_nppu_pbu_cfg_memid_1_pbu_fc_macth_ram_reg, + NULL, + NULL, + }, + { + "all_kind_port_cnt", + NPPU_PBU_STAT_MEMID_1_ALL_KIND_PORT_CNTr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x0000, + (32/8), + 0, + 127 + 1, + 0, + 1, + 2, + g_nppu_pbu_stat_memid_1_all_kind_port_cnt_reg, + NULL, + NULL, + }, + { + "ppu_pbu_ifb_req_vld_cnt", + NPPU_PBU_STAT_MEMID_2_PPU_PBU_IFB_REQ_VLD_CNTr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0004, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_memid_2_ppu_pbu_ifb_req_vld_cnt_reg, + NULL, + NULL, + }, + { + "pbu_ppu_ifb_rsp_vld_cnt", + NPPU_PBU_STAT_MEMID_2_PBU_PPU_IFB_RSP_VLD_CNTr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0005, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_memid_2_pbu_ppu_ifb_rsp_vld_cnt_reg, + NULL, + NULL, + }, + { + "odma_pbu_recy_ptr_vld_cnt", + NPPU_PBU_STAT_MEMID_2_ODMA_PBU_RECY_PTR_VLD_CNTr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0006, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_memid_2_odma_pbu_recy_ptr_vld_cnt_reg, + NULL, + NULL, + }, + { + "ppu_pbu_mcode_pf_req_cnt", + NPPU_PBU_STAT_MEMID_2_PPU_PBU_MCODE_PF_REQ_CNTr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0007, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_memid_2_ppu_pbu_mcode_pf_req_cnt_reg, + NULL, + NULL, + }, + { + "pbu_ppu_mcode_pf_rsp_cnt", + NPPU_PBU_STAT_MEMID_2_PBU_PPU_MCODE_PF_RSP_CNTr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_memid_2_pbu_ppu_mcode_pf_rsp_cnt_reg, + NULL, + NULL, + }, + { + "ppu_pbu_logic_pf_req_cnt", + NPPU_PBU_STAT_MEMID_2_PPU_PBU_LOGIC_PF_REQ_CNTr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0009, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_memid_2_ppu_pbu_logic_pf_req_cnt_reg, + NULL, + NULL, + }, + { + "pbu_ppu_logic_pf_rsp_cnt", + NPPU_PBU_STAT_MEMID_2_PBU_PPU_LOGIC_PF_RSP_CNTr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x000a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_memid_2_pbu_ppu_logic_pf_rsp_cnt_reg, + NULL, + NULL, + }, + { + "ppu_use_ptr_pulse_cnt", + NPPU_PBU_STAT_MEMID_2_PPU_USE_PTR_PULSE_CNTr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x000b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_memid_2_ppu_use_ptr_pulse_cnt_reg, + NULL, + NULL, + }, + { + "ppu_pbu_wb_vld_cnt", + NPPU_PBU_STAT_MEMID_2_PPU_PBU_WB_VLD_CNTr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x000c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_memid_2_ppu_pbu_wb_vld_cnt_reg, + NULL, + NULL, + }, + { + "pbu_ppu_reorder_para_vld_cnt", + NPPU_PBU_STAT_MEMID_2_PBU_PPU_REORDER_PARA_VLD_CNTr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x000d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_memid_2_pbu_ppu_reorder_para_vld_cnt_reg, + NULL, + NULL, + }, + { + "se_pbu_dpi_key_vld_cnt", + NPPU_PBU_STAT_MEMID_2_SE_PBU_DPI_KEY_VLD_CNTr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x000e, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_memid_2_se_pbu_dpi_key_vld_cnt_reg, + NULL, + NULL, + }, + { + "pbu_se_dpi_rsp_datvld_cnt", + NPPU_PBU_STAT_MEMID_2_PBU_SE_DPI_RSP_DATVLD_CNTr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x000f, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_memid_2_pbu_se_dpi_rsp_datvld_cnt_reg, + NULL, + NULL, + }, + { + "odma_pbu_ifb_rd1_cnt", + NPPU_PBU_STAT_MEMID_2_ODMA_PBU_IFB_RD1_CNTr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0010, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_memid_2_odma_pbu_ifb_rd1_cnt_reg, + NULL, + NULL, + }, + { + "odma_pbu_ifb_rd2_cnt", + NPPU_PBU_STAT_MEMID_2_ODMA_PBU_IFB_RD2_CNTr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0011, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_memid_2_odma_pbu_ifb_rd2_cnt_reg, + NULL, + NULL, + }, + { + "pbu_ppu_mcode_pf_no_rsp_cnt", + NPPU_PBU_STAT_MEMID_2_PBU_PPU_MCODE_PF_NO_RSP_CNTr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0015, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_memid_2_pbu_ppu_mcode_pf_no_rsp_cnt_reg, + NULL, + NULL, + }, + { + "pbu_ppu_logic_pf_no_rsp_cnt", + NPPU_PBU_STAT_MEMID_2_PBU_PPU_LOGIC_PF_NO_RSP_CNTr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0016, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_memid_2_pbu_ppu_logic_pf_no_rsp_cnt_reg, + NULL, + NULL, + }, + { + "cpu_rd_ifb_data", + NPPU_PBU_STAT_MEMID_3_CPU_RD_IFB_DATAr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x0000, + (2048/8), + 0, + 16383 + 1, + 0, + 1, + 1, + g_nppu_pbu_stat_memid_3_cpu_rd_ifb_data_reg, + NULL, + NULL, + }, + { + "mux_sel_rgt", + NPPU_PBU_STAT_MEMID_4_MUX_SEL_RGTr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_memid_4_mux_sel_rgt_reg, + NULL, + NULL, + }, + { + "port_pub_cnt", + NPPU_PBU_STAT_MEMID_5_PORT_PUB_CNTr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x0000, + (32/8), + 0, + 127 + 1, + 0, + 1, + 1, + g_nppu_pbu_stat_memid_5_port_pub_cnt_reg, + NULL, + NULL, + }, + { + "idma_o_isu_pkt_pulse_total_cnt", + NPPU_IDMA_STAT_MEMID_1_IDMA_O_ISU_PKT_PULSE_TOTAL_CNTr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0012, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_idma_stat_memid_1_idma_o_isu_pkt_pulse_total_cnt_reg, + NULL, + NULL, + }, + { + "idma_o_isu_epkt_pulse_total_cnt", + NPPU_IDMA_STAT_MEMID_1_IDMA_O_ISU_EPKT_PULSE_TOTAL_CNTr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0013, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_idma_stat_memid_1_idma_o_isu_epkt_pulse_total_cnt_reg, + NULL, + NULL, + }, + { + "idma_dispkt_pulse_total_cnt", + NPPU_IDMA_STAT_MEMID_1_IDMA_DISPKT_PULSE_TOTAL_CNTr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0014, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_idma_stat_memid_1_idma_dispkt_pulse_total_cnt_reg, + NULL, + NULL, + }, + { + "idma_o_isu_pkt_pulse_cnt", + NPPU_IDMA_STAT_MEMID_0_IDMA_O_ISU_PKT_PULSE_CNTr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x0000, + (32/8), + 0, + 127 + 1, + 0, + 1, + 1, + g_nppu_idma_stat_memid_0_idma_o_isu_pkt_pulse_cnt_reg, + NULL, + NULL, + }, + { + "idma_o_isu_epkt_pulse_cnt", + NPPU_IDMA_STAT_MEMID_0_IDMA_O_ISU_EPKT_PULSE_CNTr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x0080, + (32/8), + 0, + 127 + 1, + 0, + 1, + 1, + g_nppu_idma_stat_memid_0_idma_o_isu_epkt_pulse_cnt_reg, + NULL, + NULL, + }, + { + "idma_dispkt_pulse_cnt", + NPPU_IDMA_STAT_MEMID_0_IDMA_DISPKT_PULSE_CNTr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x0100, + (32/8), + 0, + 127 + 1, + 0, + 1, + 1, + g_nppu_idma_stat_memid_0_idma_dispkt_pulse_cnt_reg, + NULL, + NULL, + }, + { + "test_r", + PPU_PPU_TEST_Rr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_test_r_reg, + NULL, + NULL, + }, + { + "ppu_debug_en_r", + PPU_PPU_PPU_DEBUG_EN_Rr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x00c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_debug_en_r_reg, + NULL, + NULL, + }, + { + "csr_dup_table_wr_data", + PPU_PPU_CSR_DUP_TABLE_WR_DATAr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x034, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_ppu_ppu_csr_dup_table_wr_data_reg, + NULL, + NULL, + }, + { + "csr_dup_table_rd_data", + PPU_PPU_CSR_DUP_TABLE_RD_DATAr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x038, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_ppu_ppu_csr_dup_table_rd_data_reg, + NULL, + NULL, + }, + { + "csr_dup_table_addr", + PPU_PPU_CSR_DUP_TABLE_ADDRr, + PPU, + DPP_REG_FLAG_WO | DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x03c, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_ppu_ppu_csr_dup_table_addr_reg, + NULL, + NULL, + }, + { + "ppu_debug_vld", + PPU_PPU_PPU_DEBUG_VLDr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x048, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_debug_vld_reg, + NULL, + NULL, + }, + { + "cop_thash_rsk_319_288", + PPU_PPU_COP_THASH_RSK_319_288r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x050, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_cop_thash_rsk_319_288_reg, + NULL, + NULL, + }, + { + "cop_thash_rsk_287_256", + PPU_PPU_COP_THASH_RSK_287_256r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x054, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_cop_thash_rsk_287_256_reg, + NULL, + NULL, + }, + { + "cop_thash_rsk_255_224", + PPU_PPU_COP_THASH_RSK_255_224r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x058, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_cop_thash_rsk_255_224_reg, + NULL, + NULL, + }, + { + "cop_thash_rsk_223_192", + PPU_PPU_COP_THASH_RSK_223_192r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x05c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_cop_thash_rsk_223_192_reg, + NULL, + NULL, + }, + { + "cop_thash_rsk_191_160", + PPU_PPU_COP_THASH_RSK_191_160r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x060, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_cop_thash_rsk_191_160_reg, + NULL, + NULL, + }, + { + "cop_thash_rsk_159_128", + PPU_PPU_COP_THASH_RSK_159_128r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x064, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_cop_thash_rsk_159_128_reg, + NULL, + NULL, + }, + { + "cop_thash_rsk_127_096", + PPU_PPU_COP_THASH_RSK_127_096r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x068, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_cop_thash_rsk_127_096_reg, + NULL, + NULL, + }, + { + "cop_thash_rsk_095_064", + PPU_PPU_COP_THASH_RSK_095_064r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x06c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_cop_thash_rsk_095_064_reg, + NULL, + NULL, + }, + { + "cop_thash_rsk_063_032", + PPU_PPU_COP_THASH_RSK_063_032r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x070, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_cop_thash_rsk_063_032_reg, + NULL, + NULL, + }, + { + "cop_thash_rsk_031_000", + PPU_PPU_COP_THASH_RSK_031_000r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x074, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_cop_thash_rsk_031_000_reg, + NULL, + NULL, + }, + { + "cfg_ipv4_ipid_start_value", + PPU_PPU_CFG_IPV4_IPID_START_VALUEr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x078, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_cfg_ipv4_ipid_start_value_reg, + NULL, + NULL, + }, + { + "cfg_ipv4_ipid_end_value", + PPU_PPU_CFG_IPV4_IPID_END_VALUEr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x07c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_cfg_ipv4_ipid_end_value_reg, + NULL, + NULL, + }, + { + "cluster_mf_in_en", + PPU_PPU_CLUSTER_MF_IN_ENr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x150, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_cluster_mf_in_en_reg, + NULL, + NULL, + }, + { + "ppu_empty", + PPU_PPU_PPU_EMPTYr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x154, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_empty_reg, + NULL, + NULL, + }, + { + "instrmem_w_addr", + PPU_PPU_INSTRMEM_W_ADDRr, + PPU, + DPP_REG_FLAG_WO | DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x514, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_instrmem_w_addr_reg, + NULL, + NULL, + }, + { + "instrmem_w_data_191_160", + PPU_PPU_INSTRMEM_W_DATA_191_160r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x518, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_instrmem_w_data_191_160_reg, + NULL, + NULL, + }, + { + "instrmem_w_data_159_128", + PPU_PPU_INSTRMEM_W_DATA_159_128r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x51c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_instrmem_w_data_159_128_reg, + NULL, + NULL, + }, + { + "instrmem_w_data_127_96", + PPU_PPU_INSTRMEM_W_DATA_127_96r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x520, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_instrmem_w_data_127_96_reg, + NULL, + NULL, + }, + { + "instrmem_w_data_95_64", + PPU_PPU_INSTRMEM_W_DATA_95_64r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x524, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_instrmem_w_data_95_64_reg, + NULL, + NULL, + }, + { + "instrmem_w_data_63_32", + PPU_PPU_INSTRMEM_W_DATA_63_32r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x528, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_instrmem_w_data_63_32_reg, + NULL, + NULL, + }, + { + "instrmem_w_data_31_0", + PPU_PPU_INSTRMEM_W_DATA_31_0r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x52c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_instrmem_w_data_31_0_reg, + NULL, + NULL, + }, + { + "isu_fwft_mf_fifo_prog_full_assert_cfg", + PPU_PPU_ISU_FWFT_MF_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x5f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_isu_fwft_mf_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "isu_fwft_mf_fifo_prog_full_negate_cfg", + PPU_PPU_ISU_FWFT_MF_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x5f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_isu_fwft_mf_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "int_1200m_mask", + PPU_CLUSTER_INT_1200M_MASKr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x98, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 8, + g_ppu_cluster_int_1200m_mask_reg, + NULL, + NULL, + }, + { + "wr_high_data_r_mex", + PPU4K_CLUSTER_WR_HIGH_DATA_R_MEXr, + PPU4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x4000, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu4k_cluster_wr_high_data_r_mex_reg, + dpp_ppu_write, + dpp_ppu_read, + }, + { + "wr_low_data_r_mex", + PPU4K_CLUSTER_WR_LOW_DATA_R_MEXr, + PPU4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x4004, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu4k_cluster_wr_low_data_r_mex_reg, + dpp_ppu_write, + dpp_ppu_read, + }, + { + "addr_r_mex", + PPU4K_CLUSTER_ADDR_R_MEXr, + PPU4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x4008, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 2, + g_ppu4k_cluster_addr_r_mex_reg, + dpp_ppu_write, + dpp_ppu_read, + }, + { + "sdt_tbl_ind_access_done", + PPU4K_CLUSTER_SDT_TBL_IND_ACCESS_DONEr, + PPU4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x400c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu4k_cluster_sdt_tbl_ind_access_done_reg, + dpp_ppu_write, + dpp_ppu_read, + }, + { + "rd_high_data_r_mex", + PPU4K_CLUSTER_RD_HIGH_DATA_R_MEXr, + PPU4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x4010, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu4k_cluster_rd_high_data_r_mex_reg, + dpp_ppu_write, + dpp_ppu_read, + }, + { + "rd_low_data_r_mex", + PPU4K_CLUSTER_RD_LOW_DATA_R_MEXr, + PPU4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x4014, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu4k_cluster_rd_low_data_r_mex_reg, + dpp_ppu_write, + dpp_ppu_read, + }, + { + "init_ok", + SE_ALG_INIT_OKr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_init_ok_reg, + NULL, + NULL, + }, + { + "cpu_rd_rdy", + SE_ALG_CPU_RD_RDYr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0048, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_cpu_rd_rdy_reg, + NULL, + NULL, + }, + { + "cpu_rd_data_tmp0", + SE_ALG_CPU_RD_DATA_TMP0r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x004c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_cpu_rd_data_tmp0_reg, + NULL, + NULL, + }, + { + "cpu_rd_data_tmp1", + SE_ALG_CPU_RD_DATA_TMP1r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0050, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_cpu_rd_data_tmp1_reg, + NULL, + NULL, + }, + { + "cpu_rd_data_tmp2", + SE_ALG_CPU_RD_DATA_TMP2r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0054, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_cpu_rd_data_tmp2_reg, + NULL, + NULL, + }, + { + "cpu_rd_data_tmp3", + SE_ALG_CPU_RD_DATA_TMP3r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0058, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_cpu_rd_data_tmp3_reg, + NULL, + NULL, + }, + { + "cpu_rd_data_tmp4", + SE_ALG_CPU_RD_DATA_TMP4r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x005c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_cpu_rd_data_tmp4_reg, + NULL, + NULL, + }, + { + "cpu_rd_data_tmp5", + SE_ALG_CPU_RD_DATA_TMP5r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0060, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_cpu_rd_data_tmp5_reg, + NULL, + NULL, + }, + { + "cpu_rd_data_tmp6", + SE_ALG_CPU_RD_DATA_TMP6r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0064, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_cpu_rd_data_tmp6_reg, + NULL, + NULL, + }, + { + "cpu_rd_data_tmp7", + SE_ALG_CPU_RD_DATA_TMP7r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0068, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_cpu_rd_data_tmp7_reg, + NULL, + NULL, + }, + { + "cpu_rd_data_tmp8", + SE_ALG_CPU_RD_DATA_TMP8r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x006c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_cpu_rd_data_tmp8_reg, + NULL, + NULL, + }, + { + "cpu_rd_data_tmp9", + SE_ALG_CPU_RD_DATA_TMP9r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0070, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_cpu_rd_data_tmp9_reg, + NULL, + NULL, + }, + { + "cpu_rd_data_tmp10", + SE_ALG_CPU_RD_DATA_TMP10r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0074, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_cpu_rd_data_tmp10_reg, + NULL, + NULL, + }, + { + "cpu_rd_data_tmp11", + SE_ALG_CPU_RD_DATA_TMP11r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0078, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_cpu_rd_data_tmp11_reg, + NULL, + NULL, + }, + { + "cpu_rd_data_tmp12", + SE_ALG_CPU_RD_DATA_TMP12r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x007c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_cpu_rd_data_tmp12_reg, + NULL, + NULL, + }, + { + "cpu_rd_data_tmp13", + SE_ALG_CPU_RD_DATA_TMP13r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0080, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_cpu_rd_data_tmp13_reg, + NULL, + NULL, + }, + { + "cpu_rd_data_tmp14", + SE_ALG_CPU_RD_DATA_TMP14r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0084, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_cpu_rd_data_tmp14_reg, + NULL, + NULL, + }, + { + "cpu_rd_data_tmp15", + SE_ALG_CPU_RD_DATA_TMP15r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0088, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_cpu_rd_data_tmp15_reg, + NULL, + NULL, + }, + { + "lpm_v4_config_rgt", + SE_ALG_LPM_V4_CONFIG_RGTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x014c, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_se_alg_lpm_v4_config_rgt_reg, + NULL, + NULL, + }, + { + "lpm_v6_config_rgt", + SE_ALG_LPM_V6_CONFIG_RGTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0150, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_se_alg_lpm_v6_config_rgt_reg, + NULL, + NULL, + }, + { + "lpm_ext_rsp_fifo_u0_pfull_ast", + SE_ALG_LPM_EXT_RSP_FIFO_U0_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x015c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_ext_rsp_fifo_u0_pfull_ast_reg, + NULL, + NULL, + }, + { + "hash_age_pat_cfg", + SE_AS_HASH_AGE_PAT_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000001d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_hash_age_pat_cfg_reg, + NULL, + NULL, + }, + { + "learn_rdy_cfg", + SE_AS_LEARN_RDY_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000001f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_learn_rdy_cfg_reg, + NULL, + NULL, + }, + { + "kschd_as_pful_cfg", + SE_KSCHD_KSCHD_AS_PFUL_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x00000008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_kschd_as_pful_cfg_reg, + NULL, + NULL, + }, + { + "kschd_dir_pful_cfg", + SE_KSCHD_KSCHD_DIR_PFUL_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x0000000c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_kschd_dir_pful_cfg_reg, + NULL, + NULL, + }, + { + "kschd_as_ept_cfg", + SE_KSCHD_KSCHD_AS_EPT_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000000014, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_kschd_as_ept_cfg_reg, + NULL, + NULL, + }, + { + "cpu_arbi_pful_cfg", + SE_KSCHD_CPU_ARBI_PFUL_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x0000001c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_cpu_arbi_pful_cfg_reg, + NULL, + NULL, + }, + { + "kschd_pbu_pful_cfg", + SE_KSCHD_KSCHD_PBU_PFUL_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x00000020, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_kschd_pbu_pful_cfg_reg, + NULL, + NULL, + }, + { + "rschd_dir_pful_cfg", + SE_RSCHD_RSCHD_DIR_PFUL_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x00000030, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_rschd_dir_pful_cfg_reg, + NULL, + NULL, + }, + { + "rschd_dir_ept_cfg", + SE_RSCHD_RSCHD_DIR_EPT_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x00000034, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_rschd_dir_ept_cfg_reg, + NULL, + NULL, + }, + { + "cpu_cmd_rgt", + SE4K_SE_ALG_CPU_CMD_RGTr, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0004, + (32/8), + 0, + 0, + 0, + 0, + 7, + g_se4k_se_alg_cpu_cmd_rgt_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_wr_data_tmp0", + SE4K_SE_ALG_CPU_WR_DATA_TMP0r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_wr_data_tmp0_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_wr_data_tmp1", + SE4K_SE_ALG_CPU_WR_DATA_TMP1r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x000c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_wr_data_tmp1_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_wr_data_tmp2", + SE4K_SE_ALG_CPU_WR_DATA_TMP2r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0010, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_wr_data_tmp2_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_wr_data_tmp3", + SE4K_SE_ALG_CPU_WR_DATA_TMP3r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0014, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_wr_data_tmp3_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_wr_data_tmp4", + SE4K_SE_ALG_CPU_WR_DATA_TMP4r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0018, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_wr_data_tmp4_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_wr_data_tmp5", + SE4K_SE_ALG_CPU_WR_DATA_TMP5r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x001c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_wr_data_tmp5_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_wr_data_tmp6", + SE4K_SE_ALG_CPU_WR_DATA_TMP6r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0020, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_wr_data_tmp6_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_wr_data_tmp7", + SE4K_SE_ALG_CPU_WR_DATA_TMP7r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0024, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_wr_data_tmp7_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_wr_data_tmp8", + SE4K_SE_ALG_CPU_WR_DATA_TMP8r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0028, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_wr_data_tmp8_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_wr_data_tmp9", + SE4K_SE_ALG_CPU_WR_DATA_TMP9r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x002c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_wr_data_tmp9_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_wr_data_tmp10", + SE4K_SE_ALG_CPU_WR_DATA_TMP10r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0030, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_wr_data_tmp10_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_wr_data_tmp11", + SE4K_SE_ALG_CPU_WR_DATA_TMP11r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0034, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_wr_data_tmp11_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_wr_data_tmp12", + SE4K_SE_ALG_CPU_WR_DATA_TMP12r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0038, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_wr_data_tmp12_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_wr_data_tmp13", + SE4K_SE_ALG_CPU_WR_DATA_TMP13r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x003c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_wr_data_tmp13_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_wr_data_tmp14", + SE4K_SE_ALG_CPU_WR_DATA_TMP14r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0040, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_wr_data_tmp14_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_wr_data_tmp15", + SE4K_SE_ALG_CPU_WR_DATA_TMP15r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0044, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_wr_data_tmp15_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_rd_rdy", + SE4K_SE_ALG_CPU_RD_RDYr, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0048, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_rd_rdy_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_rd_data_tmp0", + SE4K_SE_ALG_CPU_RD_DATA_TMP0r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x004c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_rd_data_tmp0_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_rd_data_tmp1", + SE4K_SE_ALG_CPU_RD_DATA_TMP1r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0050, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_rd_data_tmp1_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_rd_data_tmp2", + SE4K_SE_ALG_CPU_RD_DATA_TMP2r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0054, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_rd_data_tmp2_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_rd_data_tmp3", + SE4K_SE_ALG_CPU_RD_DATA_TMP3r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0058, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_rd_data_tmp3_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_rd_data_tmp4", + SE4K_SE_ALG_CPU_RD_DATA_TMP4r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x005c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_rd_data_tmp4_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_rd_data_tmp5", + SE4K_SE_ALG_CPU_RD_DATA_TMP5r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0060, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_rd_data_tmp5_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_rd_data_tmp6", + SE4K_SE_ALG_CPU_RD_DATA_TMP6r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0064, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_rd_data_tmp6_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_rd_data_tmp7", + SE4K_SE_ALG_CPU_RD_DATA_TMP7r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0068, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_rd_data_tmp7_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_rd_data_tmp8", + SE4K_SE_ALG_CPU_RD_DATA_TMP8r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x006c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_rd_data_tmp8_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_rd_data_tmp9", + SE4K_SE_ALG_CPU_RD_DATA_TMP9r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0070, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_rd_data_tmp9_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_rd_data_tmp10", + SE4K_SE_ALG_CPU_RD_DATA_TMP10r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0074, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_rd_data_tmp10_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_rd_data_tmp11", + SE4K_SE_ALG_CPU_RD_DATA_TMP11r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0078, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_rd_data_tmp11_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_rd_data_tmp12", + SE4K_SE_ALG_CPU_RD_DATA_TMP12r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x007c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_rd_data_tmp12_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_rd_data_tmp13", + SE4K_SE_ALG_CPU_RD_DATA_TMP13r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0080, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_rd_data_tmp13_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_rd_data_tmp14", + SE4K_SE_ALG_CPU_RD_DATA_TMP14r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0084, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_rd_data_tmp14_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_rd_data_tmp15", + SE4K_SE_ALG_CPU_RD_DATA_TMP15r, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0088, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_cpu_rd_data_tmp15_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash0_ext_cfg_rgt", + SE4K_SE_ALG_HASH0_EXT_CFG_RGTr, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0bc, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se4k_se_alg_hash0_ext_cfg_rgt_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash1_ext_cfg_rgt", + SE4K_SE_ALG_HASH1_EXT_CFG_RGTr, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0c0, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se4k_se_alg_hash1_ext_cfg_rgt_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash2_ext_cfg_rgt", + SE4K_SE_ALG_HASH2_EXT_CFG_RGTr, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0c4, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se4k_se_alg_hash2_ext_cfg_rgt_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash3_ext_cfg_rgt", + SE4K_SE_ALG_HASH3_EXT_CFG_RGTr, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0c8, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se4k_se_alg_hash3_ext_cfg_rgt_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash0_tbl30_depth", + SE4K_SE_ALG_HASH0_TBL30_DEPTHr, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x01a4, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_se4k_se_alg_hash0_tbl30_depth_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash0_tbl74_depth", + SE4K_SE_ALG_HASH0_TBL74_DEPTHr, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x01a8, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_se4k_se_alg_hash0_tbl74_depth_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash1_tbl30_depth", + SE4K_SE_ALG_HASH1_TBL30_DEPTHr, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x01ac, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_se4k_se_alg_hash1_tbl30_depth_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash1_tbl74_depth", + SE4K_SE_ALG_HASH1_TBL74_DEPTHr, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x01b0, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_se4k_se_alg_hash1_tbl74_depth_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash2_tbl30_depth", + SE4K_SE_ALG_HASH2_TBL30_DEPTHr, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x01b4, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_se4k_se_alg_hash2_tbl30_depth_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash2_tbl74_depth", + SE4K_SE_ALG_HASH2_TBL74_DEPTHr, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x01b8, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_se4k_se_alg_hash2_tbl74_depth_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash3_tbl30_depth", + SE4K_SE_ALG_HASH3_TBL30_DEPTHr, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x01bc, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_se4k_se_alg_hash3_tbl30_depth_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash3_tbl74_depth", + SE4K_SE_ALG_HASH3_TBL74_DEPTHr, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x01c0, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_se4k_se_alg_hash3_tbl74_depth_reg, + dpp_se_write, + dpp_se_read, + }, + { + "wr_rsp_cfg", + SE4K_SE_ALG_WR_RSP_CFGr, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x01c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se4k_se_alg_wr_rsp_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash_mono_flag", + SE4K_SE_ALG_HASH_MONO_FLAGr, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x01c8, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_se4k_se_alg_hash_mono_flag_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash10_ext_crc_cfg", + SE4K_SE_ALG_HASH10_EXT_CRC_CFGr, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x01cc, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se4k_se_alg_hash10_ext_crc_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash32_ext_crc_cfg", + SE4K_SE_ALG_HASH32_EXT_CRC_CFGr, + SE4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x01d0, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se4k_se_alg_hash32_ext_crc_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "zblock_service_configure", + SE4K_SE_ALG_ZBLOCK_SERVICE_CONFIGUREr, + SE4K, + DPP_REG_FLAG_INDIRECT, + DPP_REG_BIN_ARRAY, + 0x10000, + (512/8), + 3 + 1, + 7 + 1, + 0x4000, + 0x800, + 3, + g_se4k_se_alg_zblock_service_configure_reg, + dpp_se_alg_write, + dpp_se_alg_read, + }, + { + "zblock_hash_zcell_mono", + SE4K_SE_ALG_ZBLOCK_HASH_ZCELL_MONOr, + SE4K, + DPP_REG_FLAG_INDIRECT, + DPP_REG_BIN_ARRAY, + 0x10014, + (512/8), + 3 + 1, + 7 + 1, + 0x4000, + 0x800, + 8, + g_se4k_se_alg_zblock_hash_zcell_mono_reg, + dpp_se_alg_write, + dpp_se_alg_read, + }, + { + "zlock_hash_zreg_mono", + SE4K_SE_ALG_ZLOCK_HASH_ZREG_MONOr, + SE4K, + DPP_REG_FLAG_INDIRECT, + DPP_REG_BIN_ARRAY, + 0x10015, + (512/8), + 3 + 1, + 7 + 1, + 0x4000, + 0x800, + 8, + g_se4k_se_alg_zlock_hash_zreg_mono_reg, + dpp_se_alg_write, + dpp_se_alg_read, + }, + { + "init_done", + SMMU0_SMMU0_INIT_DONEr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_init_done_reg, + NULL, + NULL, + }, + { + "cpu_ind_wdat0", + SMMU0_SMMU0_CPU_IND_WDAT0r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000004, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_cpu_ind_wdat0_reg, + NULL, + NULL, + }, + { + "cpu_ind_wdat1", + SMMU0_SMMU0_CPU_IND_WDAT1r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_cpu_ind_wdat1_reg, + NULL, + NULL, + }, + { + "cpu_ind_wdat2", + SMMU0_SMMU0_CPU_IND_WDAT2r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000000c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_cpu_ind_wdat2_reg, + NULL, + NULL, + }, + { + "cpu_ind_wdat3", + SMMU0_SMMU0_CPU_IND_WDAT3r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000010, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_cpu_ind_wdat3_reg, + NULL, + NULL, + }, + { + "cpu_ind_cmd", + SMMU0_SMMU0_CPU_IND_CMDr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000014, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_smmu0_smmu0_cpu_ind_cmd_reg, + NULL, + NULL, + }, + { + "cpu_ind_rd_done", + SMMU0_SMMU0_CPU_IND_RD_DONEr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000040, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_cpu_ind_rd_done_reg, + NULL, + NULL, + }, + { + "cpu_ind_rdat0", + SMMU0_SMMU0_CPU_IND_RDAT0r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000044, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_cpu_ind_rdat0_reg, + NULL, + NULL, + }, + { + "cpu_ind_rdat1", + SMMU0_SMMU0_CPU_IND_RDAT1r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000048, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_cpu_ind_rdat1_reg, + NULL, + NULL, + }, + { + "cpu_ind_rdat2", + SMMU0_SMMU0_CPU_IND_RDAT2r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000004c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_cpu_ind_rdat2_reg, + NULL, + NULL, + }, + { + "cpu_ind_rdat3", + SMMU0_SMMU0_CPU_IND_RDAT3r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000050, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_cpu_ind_rdat3_reg, + NULL, + NULL, + }, + { + "cfg_plcr_mono", + SMMU0_SMMU0_CFG_PLCR_MONOr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000108, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_cfg_plcr_mono_reg, + NULL, + NULL, + }, + { + "wr_arb_cpu_rdy", + SMMU0_SMMU0_WR_ARB_CPU_RDYr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000010c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_wr_arb_cpu_rdy_reg, + NULL, + NULL, + }, + { + "tm_stat_en_cfg", + SMMU0_SMMU0_TM_STAT_EN_CFGr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000110, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_tm_stat_en_cfg_reg, + NULL, + NULL, + }, + { + "ddr_wdat0", + SE_SMMU1_DDR_WDAT0r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ddr_wdat0_reg, + NULL, + NULL, + }, + { + "dir_arbi_ser_rpful", + SE_SMMU1_DIR_ARBI_SER_RPFULr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000010c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_dir_arbi_ser_rpful_reg, + NULL, + NULL, + }, + { + "cfg_wr_arbi_pful2", + SE_SMMU1_CFG_WR_ARBI_PFUL2r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000120, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se_smmu1_cfg_wr_arbi_pful2_reg, + NULL, + NULL, + }, + { + "etm_tbl_cfg", + SE_SMMU1_ETM_TBL_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000001cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_etm_tbl_cfg_reg, + NULL, + NULL, + }, + { + "cfg_cash_addr_pful", + SE_SMMU1_CFG_CASH_ADDR_PFULr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000020c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cfg_cash_addr_pful_reg, + NULL, + NULL, + }, + { + "ctrl_rfifo_cfg", + SE_SMMU1_CTRL_RFIFO_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000234, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_se_smmu1_ctrl_rfifo_cfg_reg, + NULL, + NULL, + }, + { + "cache_req_fifo_cfg", + SE_SMMU1_CACHE_REQ_FIFO_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000288, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se_smmu1_cache_req_fifo_cfg_reg, + NULL, + NULL, + }, + { + "cpu_ind_eram_wdat0", + STAT_STAT_CFG_CPU_IND_ERAM_WDAT0r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_eram_wdat0_reg, + NULL, + NULL, + }, + { + "etm_port_sel_cfg", + STAT_STAT_CFG_ETM_PORT_SEL_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000044, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_stat_stat_cfg_etm_port_sel_cfg_reg, + NULL, + NULL, + }, + { + "tm_stat_cfg", + STAT_STAT_CFG_TM_STAT_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000004c, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_stat_stat_cfg_tm_stat_cfg_reg, + NULL, + NULL, + }, + { + "ppu_eram_depth", + STAT_STAT_CFG_PPU_ERAM_DEPTHr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000050, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_ppu_eram_depth_reg, + NULL, + NULL, + }, + { + "ppu_eram_base_addr", + STAT_STAT_CFG_PPU_ERAM_BASE_ADDRr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000054, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_ppu_eram_base_addr_reg, + NULL, + NULL, + }, + { + "ppu_ddr_base_addr", + STAT_STAT_CFG_PPU_DDR_BASE_ADDRr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000060, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_ppu_ddr_base_addr_reg, + NULL, + NULL, + }, + { + "plcr0_base_addr", + STAT_STAT_CFG_PLCR0_BASE_ADDRr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000006c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_plcr0_base_addr_reg, + NULL, + NULL, + }, + { + "etm_stat_start_addr_cfg", + STAT_STAT_CFG_ETM_STAT_START_ADDR_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000000e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_etm_stat_start_addr_cfg_reg, + NULL, + NULL, + }, + { + "etm_stat_depth_cfg", + STAT_STAT_CFG_ETM_STAT_DEPTH_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000000e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_etm_stat_depth_cfg_reg, + NULL, + NULL, + }, + { + "cycle_mov_en_cfg", + STAT_STAT_CFG_CYCLE_MOV_EN_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000000e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cycle_mov_en_cfg_reg, + NULL, + NULL, + }, + { + "cpu_ind_wdat0", + STAT_ETCAM_CPU_IND_WDAT0r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000004, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_ind_wdat0_reg, + NULL, + NULL, + }, + { + "cpu_ind_ctrl_tmp0", + STAT_ETCAM_CPU_IND_CTRL_TMP0r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000054, + (32/8), + 0, + 0, + 0, + 0, + 7, + g_stat_etcam_cpu_ind_ctrl_tmp0_reg, + NULL, + NULL, + }, + { + "cpu_ind_ctrl_tmp1", + STAT_ETCAM_CPU_IND_CTRL_TMP1r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000058, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_stat_etcam_cpu_ind_ctrl_tmp1_reg, + NULL, + NULL, + }, + { + "cpu_ind_rd_done", + STAT_ETCAM_CPU_IND_RD_DONEr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x000001fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_ind_rd_done_reg, + NULL, + NULL, + }, + { + "cpu_rdat0", + STAT_ETCAM_CPU_RDAT0r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000200, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_rdat0_reg, + NULL, + NULL, + }, + { + "cpu_rdat1", + STAT_ETCAM_CPU_RDAT1r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000204, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_rdat1_reg, + NULL, + NULL, + }, + { + "cpu_rdat2", + STAT_ETCAM_CPU_RDAT2r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000208, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_rdat2_reg, + NULL, + NULL, + }, + { + "cpu_rdat3", + STAT_ETCAM_CPU_RDAT3r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x0000020c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_rdat3_reg, + NULL, + NULL, + }, + { + "cpu_rdat4", + STAT_ETCAM_CPU_RDAT4r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000210, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_rdat4_reg, + NULL, + NULL, + }, + { + "cpu_rdat5", + STAT_ETCAM_CPU_RDAT5r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000214, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_rdat5_reg, + NULL, + NULL, + }, + { + "cpu_rdat6", + STAT_ETCAM_CPU_RDAT6r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000218, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_rdat6_reg, + NULL, + NULL, + }, + { + "cpu_rdat7", + STAT_ETCAM_CPU_RDAT7r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x0000021c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_rdat7_reg, + NULL, + NULL, + }, + { + "cpu_rdat8", + STAT_ETCAM_CPU_RDAT8r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000220, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_rdat8_reg, + NULL, + NULL, + }, + { + "cpu_rdat9", + STAT_ETCAM_CPU_RDAT9r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000224, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_rdat9_reg, + NULL, + NULL, + }, + { + "cpu_rdat10", + STAT_ETCAM_CPU_RDAT10r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000228, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_rdat10_reg, + NULL, + NULL, + }, + { + "cpu_rdat11", + STAT_ETCAM_CPU_RDAT11r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x0000022c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_rdat11_reg, + NULL, + NULL, + }, + { + "cpu_rdat12", + STAT_ETCAM_CPU_RDAT12r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000230, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_rdat12_reg, + NULL, + NULL, + }, + { + "cpu_rdat13", + STAT_ETCAM_CPU_RDAT13r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000234, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_rdat13_reg, + NULL, + NULL, + }, + { + "cpu_rdat14", + STAT_ETCAM_CPU_RDAT14r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000238, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_rdat14_reg, + NULL, + NULL, + }, + { + "cpu_rdat15", + STAT_ETCAM_CPU_RDAT15r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x0000023c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_rdat15_reg, + NULL, + NULL, + }, + { + "cpu_rdat16", + STAT_ETCAM_CPU_RDAT16r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000240, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_rdat16_reg, + NULL, + NULL, + }, + { + "cpu_rdat17", + STAT_ETCAM_CPU_RDAT17r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000244, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_rdat17_reg, + NULL, + NULL, + }, + { + "cpu_rdat18", + STAT_ETCAM_CPU_RDAT18r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000248, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_rdat18_reg, + NULL, + NULL, + }, + { + "cpu_rdat19", + STAT_ETCAM_CPU_RDAT19r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x0000024c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_rdat19_reg, + NULL, + NULL, + }, + { + "qvbo", + STAT_ETCAM_QVBOr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000250, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_qvbo_reg, + NULL, + NULL, + }, + { + "cnt_overflow_mode", + STAT_ETCAM_CNT_OVERFLOW_MODEr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x000003ec, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_etcam_cnt_overflow_mode_reg, + NULL, + NULL, + }, + { + "cara_queue_ram0_159_0", + STAT_CAR0_CARA_QUEUE_RAM0_159_0r, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x000000 + 0x14000000, + (160/8), + 0, + 0x7FFF + 1, + 0, + 8, + 9, + g_stat_car0_cara_queue_ram0_159_0_reg, + NULL, + NULL, + }, + { + "cara_profile_ram1_255_0", + STAT_CAR0_CARA_PROFILE_RAM1_255_0r, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x040000 + 0x20000000, + (256/8), + 0, + 0x1FF + 1, + 0, + 8, + 31, + g_stat_car0_cara_profile_ram1_255_0_reg, + NULL, + NULL, + }, + { + "cara_qovs_ram_ram2", + STAT_CAR0_CARA_QOVS_RAM_RAM2r, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x80000, + (32/8), + 0, + 0x7FFF + 1, + 0, + 1, + 1, + g_stat_car0_cara_qovs_ram_ram2_reg, + NULL, + NULL, + }, + { + "look_up_table1", + STAT_CAR0_LOOK_UP_TABLE1r, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0xc0000, + (32/8), + 0, + 0x7FFF + 1, + 0, + 1, + 2, + g_stat_car0_look_up_table1_reg, + NULL, + NULL, + }, + { + "cara_pkt_des_i_cnt", + STAT_CAR0_CARA_PKT_DES_I_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c0000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_cara_pkt_des_i_cnt_reg, + NULL, + NULL, + }, + { + "cara_green_pkt_i_cnt", + STAT_CAR0_CARA_GREEN_PKT_I_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c0001, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_cara_green_pkt_i_cnt_reg, + NULL, + NULL, + }, + { + "cara_yellow_pkt_i_cnt", + STAT_CAR0_CARA_YELLOW_PKT_I_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c0002, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_cara_yellow_pkt_i_cnt_reg, + NULL, + NULL, + }, + { + "cara_red_pkt_i_cnt", + STAT_CAR0_CARA_RED_PKT_I_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c0003, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_cara_red_pkt_i_cnt_reg, + NULL, + NULL, + }, + { + "cara_pkt_des_o_cnt", + STAT_CAR0_CARA_PKT_DES_O_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c0004, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_cara_pkt_des_o_cnt_reg, + NULL, + NULL, + }, + { + "cara_green_pkt_o_cnt", + STAT_CAR0_CARA_GREEN_PKT_O_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c0005, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_cara_green_pkt_o_cnt_reg, + NULL, + NULL, + }, + { + "cara_yellow_pkt_o_cnt", + STAT_CAR0_CARA_YELLOW_PKT_O_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c0006, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_cara_yellow_pkt_o_cnt_reg, + NULL, + NULL, + }, + { + "cara_red_pkt_o_cnt", + STAT_CAR0_CARA_RED_PKT_O_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c0007, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_cara_red_pkt_o_cnt_reg, + NULL, + NULL, + }, + { + "cara_pkt_des_fc_for_cfg_cnt", + STAT_CAR0_CARA_PKT_DES_FC_FOR_CFG_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c0008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_cara_pkt_des_fc_for_cfg_cnt_reg, + NULL, + NULL, + }, + { + "cara_appoint_qnum_or_sp", + STAT_CAR0_CARA_APPOINT_QNUM_OR_SPr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c0009, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_stat_car0_cara_appoint_qnum_or_sp_reg, + NULL, + NULL, + }, + { + "cara_cfgmt_count_mode", + STAT_CAR0_CARA_CFGMT_COUNT_MODEr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c000a, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_car0_cara_cfgmt_count_mode_reg, + NULL, + NULL, + }, + { + "cara_pkt_size_cnt", + STAT_CAR0_CARA_PKT_SIZE_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c000b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_cara_pkt_size_cnt_reg, + NULL, + NULL, + }, + { + "cara_plcr_init_dont", + STAT_CAR0_CARA_PLCR_INIT_DONTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c000c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_cara_plcr_init_dont_reg, + NULL, + NULL, + }, + { + "carb_queue_ram0_159_0", + STAT_CAR0_CARB_QUEUE_RAM0_159_0r, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x100000 + 0x14000000, + (160/8), + 0, + 0xFFF + 1, + 0, + 8, + 9, + g_stat_car0_carb_queue_ram0_159_0_reg, + NULL, + NULL, + }, + { + "carb_profile_ram1_255_0", + STAT_CAR0_CARB_PROFILE_RAM1_255_0r, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x140000 + 0x20000000, + (256/8), + 0, + 0x7F + 1, + 0, + 8, + 33, + g_stat_car0_carb_profile_ram1_255_0_reg, + NULL, + NULL, + }, + { + "carb_qovs_ram_ram2", + STAT_CAR0_CARB_QOVS_RAM_RAM2r, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x180000, + (32/8), + 0, + 0xFFF + 1, + 0, + 1, + 1, + g_stat_car0_carb_qovs_ram_ram2_reg, + NULL, + NULL, + }, + { + "look_up_table2", + STAT_CAR0_LOOK_UP_TABLE2r, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x1c0000, + (32/8), + 0, + 0xFFF + 1, + 0, + 1, + 2, + g_stat_car0_look_up_table2_reg, + NULL, + NULL, + }, + { + "carb_pkt_des_i_cnt", + STAT_CAR0_CARB_PKT_DES_I_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c1000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_carb_pkt_des_i_cnt_reg, + NULL, + NULL, + }, + { + "carb_green_pkt_i_cnt", + STAT_CAR0_CARB_GREEN_PKT_I_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c1001, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_carb_green_pkt_i_cnt_reg, + NULL, + NULL, + }, + { + "carb_yellow_pkt_i_cnt", + STAT_CAR0_CARB_YELLOW_PKT_I_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c1002, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_carb_yellow_pkt_i_cnt_reg, + NULL, + NULL, + }, + { + "carb_red_pkt_i_cnt", + STAT_CAR0_CARB_RED_PKT_I_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c1003, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_carb_red_pkt_i_cnt_reg, + NULL, + NULL, + }, + { + "carb_pkt_des_o_cnt", + STAT_CAR0_CARB_PKT_DES_O_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c1004, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_carb_pkt_des_o_cnt_reg, + NULL, + NULL, + }, + { + "carb_green_pkt_o_cnt", + STAT_CAR0_CARB_GREEN_PKT_O_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c1005, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_carb_green_pkt_o_cnt_reg, + NULL, + NULL, + }, + { + "carb_yellow_pkt_o_cnt", + STAT_CAR0_CARB_YELLOW_PKT_O_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c1006, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_carb_yellow_pkt_o_cnt_reg, + NULL, + NULL, + }, + { + "carb_red_pkt_o_cnt", + STAT_CAR0_CARB_RED_PKT_O_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c1007, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_carb_red_pkt_o_cnt_reg, + NULL, + NULL, + }, + { + "carb_pkt_des_fc_for_cfg_cnt", + STAT_CAR0_CARB_PKT_DES_FC_FOR_CFG_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c1008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_carb_pkt_des_fc_for_cfg_cnt_reg, + NULL, + NULL, + }, + { + "carb_appoint_qnum_or_sp", + STAT_CAR0_CARB_APPOINT_QNUM_OR_SPr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c1009, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_stat_car0_carb_appoint_qnum_or_sp_reg, + NULL, + NULL, + }, + { + "carb_cfgmt_count_mode", + STAT_CAR0_CARB_CFGMT_COUNT_MODEr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c100a, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_car0_carb_cfgmt_count_mode_reg, + NULL, + NULL, + }, + { + "carb_pkt_size_cnt", + STAT_CAR0_CARB_PKT_SIZE_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c100b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_carb_pkt_size_cnt_reg, + NULL, + NULL, + }, + { + "carb_plcr_init_dont", + STAT_CAR0_CARB_PLCR_INIT_DONTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c100c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_carb_plcr_init_dont_reg, + NULL, + NULL, + }, + { + "carc_queue_ram0_159_0", + STAT_CAR0_CARC_QUEUE_RAM0_159_0r, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x200000 + 0x14000000, + (160/8), + 0, + 0x3FF + 1, + 0, + 8, + 9, + g_stat_car0_carc_queue_ram0_159_0_reg, + NULL, + NULL, + }, + { + "carc_profile_ram1_255_0", + STAT_CAR0_CARC_PROFILE_RAM1_255_0r, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x240000 + 0x20000000, + (256/8), + 0, + 0x1F + 1, + 0, + 8, + 33, + g_stat_car0_carc_profile_ram1_255_0_reg, + NULL, + NULL, + }, + { + "carc_qovs_ram_ram2", + STAT_CAR0_CARC_QOVS_RAM_RAM2r, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x280000, + (32/8), + 0, + 0x3FF + 1, + 0, + 1, + 1, + g_stat_car0_carc_qovs_ram_ram2_reg, + NULL, + NULL, + }, + { + "carc_pkt_des_i_cnt", + STAT_CAR0_CARC_PKT_DES_I_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c2000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_carc_pkt_des_i_cnt_reg, + NULL, + NULL, + }, + { + "carc_green_pkt_i_cnt", + STAT_CAR0_CARC_GREEN_PKT_I_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c2001, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_carc_green_pkt_i_cnt_reg, + NULL, + NULL, + }, + { + "carc_yellow_pkt_i_cnt", + STAT_CAR0_CARC_YELLOW_PKT_I_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c2002, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_carc_yellow_pkt_i_cnt_reg, + NULL, + NULL, + }, + { + "carc_red_pkt_i_cnt", + STAT_CAR0_CARC_RED_PKT_I_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c2003, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_carc_red_pkt_i_cnt_reg, + NULL, + NULL, + }, + { + "carc_pkt_des_o_cnt", + STAT_CAR0_CARC_PKT_DES_O_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c2004, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_carc_pkt_des_o_cnt_reg, + NULL, + NULL, + }, + { + "carc_green_pkt_o_cnt", + STAT_CAR0_CARC_GREEN_PKT_O_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c2005, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_carc_green_pkt_o_cnt_reg, + NULL, + NULL, + }, + { + "carc_yellow_pkt_o_cnt", + STAT_CAR0_CARC_YELLOW_PKT_O_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c2006, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_carc_yellow_pkt_o_cnt_reg, + NULL, + NULL, + }, + { + "carc_red_pkt_o_cnt", + STAT_CAR0_CARC_RED_PKT_O_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c2007, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_carc_red_pkt_o_cnt_reg, + NULL, + NULL, + }, + { + "carc_pkt_des_fc_for_cfg_cnt", + STAT_CAR0_CARC_PKT_DES_FC_FOR_CFG_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c2008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_carc_pkt_des_fc_for_cfg_cnt_reg, + NULL, + NULL, + }, + { + "carc_appoint_qnum_or_sp", + STAT_CAR0_CARC_APPOINT_QNUM_OR_SPr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c2009, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_stat_car0_carc_appoint_qnum_or_sp_reg, + NULL, + NULL, + }, + { + "carc_cfgmt_count_mode", + STAT_CAR0_CARC_CFGMT_COUNT_MODEr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c200a, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_car0_carc_cfgmt_count_mode_reg, + NULL, + NULL, + }, + { + "carc_pkt_size_cnt", + STAT_CAR0_CARC_PKT_SIZE_CNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c200b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_carc_pkt_size_cnt_reg, + NULL, + NULL, + }, + { + "carc_plcr_init_dont", + STAT_CAR0_CARC_PLCR_INIT_DONTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c200c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_carc_plcr_init_dont_reg, + NULL, + NULL, + }, + { + "carb_random_ram", + STAT_CAR0_CARB_RANDOM_RAMr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x2d0000 + 0x40000000, + (512/8), + 0, + 0x1f + 1, + 0, + 16, + 24, + g_stat_car0_carb_random_ram_reg, + NULL, + NULL, + }, + { + "carc_random_ram", + STAT_CAR0_CARC_RANDOM_RAMr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x2e0000 + 0x40000000, + (512/8), + 0, + 0x7 + 1, + 0, + 16, + 24, + g_stat_car0_carc_random_ram_reg, + NULL, + NULL, + }, + { + "cara_begin_flow_id", + STAT_CAR0_CARA_BEGIN_FLOW_IDr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x300000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_cara_begin_flow_id_reg, + NULL, + NULL, + }, + { + "carb_begin_flow_id", + STAT_CAR0_CARB_BEGIN_FLOW_IDr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x300001, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_carb_begin_flow_id_reg, + NULL, + NULL, + }, + { + "carc_begin_flow_id", + STAT_CAR0_CARC_BEGIN_FLOW_IDr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x300002, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_carc_begin_flow_id_reg, + NULL, + NULL, + }, + { + "prog_full_assert_cfg_w", + STAT_CAR0_PROG_FULL_ASSERT_CFG_Wr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x300003, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_prog_full_assert_cfg_w_reg, + NULL, + NULL, + }, + { + "prog_full_negate_cfg_w", + STAT_CAR0_PROG_FULL_NEGATE_CFG_Wr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x300004, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_prog_full_negate_cfg_w_reg, + NULL, + NULL, + }, + { + "timeout_limit", + STAT_CAR0_TIMEOUT_LIMITr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x300005, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_timeout_limit_reg, + NULL, + NULL, + }, + { + "pkt_des_fifo_overflow", + STAT_CAR0_PKT_DES_FIFO_OVERFLOWr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x300006, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_pkt_des_fifo_overflow_reg, + NULL, + NULL, + }, + { + "pkt_des_fifo_underflow", + STAT_CAR0_PKT_DES_FIFO_UNDERFLOWr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x300007, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_pkt_des_fifo_underflow_reg, + NULL, + NULL, + }, + { + "pkt_des_fifo_prog_full", + STAT_CAR0_PKT_DES_FIFO_PROG_FULLr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x300008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_pkt_des_fifo_prog_full_reg, + NULL, + NULL, + }, + { + "pkt_des_fifo_prog_empty", + STAT_CAR0_PKT_DES_FIFO_PROG_EMPTYr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x300009, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_pkt_des_fifo_prog_empty_reg, + NULL, + NULL, + }, + { + "pkt_des_fifo_full", + STAT_CAR0_PKT_DES_FIFO_FULLr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x30000a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_pkt_des_fifo_full_reg, + NULL, + NULL, + }, + { + "pkt_des_fifo_empty", + STAT_CAR0_PKT_DES_FIFO_EMPTYr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x30000b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_pkt_des_fifo_empty_reg, + NULL, + NULL, + }, + { + "pkt_size_offset", + STAT_CAR0_PKT_SIZE_OFFSETr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x30000e, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_pkt_size_offset_reg, + NULL, + NULL, + }, + { + "car_plcr_init_dont", + STAT_CAR0_CAR_PLCR_INIT_DONTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x30000f, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_car_plcr_init_dont_reg, + NULL, + NULL, + }, + { + "max_pkt_size_a", + STAT_CAR0_MAX_PKT_SIZE_Ar, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x300010, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_max_pkt_size_a_reg, + NULL, + NULL, + }, + { + "max_pkt_size_b", + STAT_CAR0_MAX_PKT_SIZE_Br, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x300011, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_max_pkt_size_b_reg, + NULL, + NULL, + }, + { + "max_pkt_size_c", + STAT_CAR0_MAX_PKT_SIZE_Cr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x300012, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_max_pkt_size_c_reg, + NULL, + NULL, + }, + { + "car_hierarchy_mode", + STAT_CAR0_CAR_HIERARCHY_MODEr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x300013, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_car_hierarchy_mode_reg, + NULL, + NULL, + }, + { + "prog_empty_assert_cfg_w", + STAT_CAR0_PROG_EMPTY_ASSERT_CFG_Wr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x300014, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_prog_empty_assert_cfg_w_reg, + NULL, + NULL, + }, + { + "prog_empty_negate_cfg_w", + STAT_CAR0_PROG_EMPTY_NEGATE_CFG_Wr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x300015, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_prog_empty_negate_cfg_w_reg, + NULL, + NULL, + }, + { + "pkt_des_fifo_ovf_int", + STAT_CAR0_PKT_DES_FIFO_OVF_INTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x300016, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_pkt_des_fifo_ovf_int_reg, + NULL, + NULL, + }, + { + "pkt_des_fifo_data_count", + STAT_CAR0_PKT_DES_FIFO_DATA_COUNTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x300017, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_pkt_des_fifo_data_count_reg, + NULL, + NULL, + }, + { + "pkt_des_fifo_udf_int", + STAT_CAR0_PKT_DES_FIFO_UDF_INTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x300018, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_car0_pkt_des_fifo_udf_int_reg, + NULL, + NULL, + }, + { + "cara_queue_ram0_159_0_pkt", + STAT_CAR0_CARA_QUEUE_RAM0_159_0_PKTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x000000 + 0x14000000, + (160/8), + 0, + 0x7FFF + 1, + 0, + 8, + 8, + g_stat_car0_cara_queue_ram0_159_0_pkt_reg, + NULL, + NULL, + }, + { + "cara_profile_ram1_255_0_pkt", + STAT_CAR0_CARA_PROFILE_RAM1_255_0_PKTr, + STAT, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x040000 + 0x20000000, + (256/8), + 0, + 0x1FF + 1, + 0, + 8, + 12, + g_stat_car0_cara_profile_ram1_255_0_pkt_reg, + NULL, + NULL, + }, + { + "block0_7_port_id_cfg", + STAT4K_ETCAM_BLOCK0_7_PORT_ID_CFGr, + STAT4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x0000005c, + (32/8), + 0, + 0, + 0, + 0, + 8, + g_stat4k_etcam_block0_7_port_id_cfg_reg, + dpp_write, + dpp_read, + }, + { + "block0_3_base_addr_cfg", + STAT4K_ETCAM_BLOCK0_3_BASE_ADDR_CFGr, + STAT4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000064, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_stat4k_etcam_block0_3_base_addr_cfg_reg, + dpp_write, + dpp_read, + }, + { + "block4_7_base_addr_cfg", + STAT4K_ETCAM_BLOCK4_7_BASE_ADDR_CFGr, + STAT4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000068, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_stat4k_etcam_block4_7_base_addr_cfg_reg, + dpp_write, + dpp_read, + }, + { + "cfg_eram_wr_interval_cnt", + DTB_DTB_CFG_CFG_ERAM_WR_INTERVAL_CNTr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0040, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cfg_eram_wr_interval_cnt_reg, + NULL, + NULL, + }, + { + "cfg_zcam_wr_interval_cnt", + DTB_DTB_CFG_CFG_ZCAM_WR_INTERVAL_CNTr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0044, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cfg_zcam_wr_interval_cnt_reg, + NULL, + NULL, + }, + { + "cfg_tcam_wr_interval_cnt", + DTB_DTB_CFG_CFG_TCAM_WR_INTERVAL_CNTr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0048, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cfg_tcam_wr_interval_cnt_reg, + NULL, + NULL, + }, + { + "cfg_ddr_wr_interval_cnt", + DTB_DTB_CFG_CFG_DDR_WR_INTERVAL_CNTr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x004c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cfg_ddr_wr_interval_cnt_reg, + NULL, + NULL, + }, + { + "cfg_hash_wr_interval_cnt", + DTB_DTB_CFG_CFG_HASH_WR_INTERVAL_CNTr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0050, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cfg_hash_wr_interval_cnt_reg, + NULL, + NULL, + }, + { + "cfg_eram_rd_interval_cnt", + DTB_DTB_CFG_CFG_ERAM_RD_INTERVAL_CNTr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0058, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cfg_eram_rd_interval_cnt_reg, + NULL, + NULL, + }, + { + "cfg_zcam_rd_interval_cnt", + DTB_DTB_CFG_CFG_ZCAM_RD_INTERVAL_CNTr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x005c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cfg_zcam_rd_interval_cnt_reg, + NULL, + NULL, + }, + { + "cfg_tcam_rd_interval_cnt", + DTB_DTB_CFG_CFG_TCAM_RD_INTERVAL_CNTr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0060, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cfg_tcam_rd_interval_cnt_reg, + NULL, + NULL, + }, + { + "cfg_ddr_rd_interval_cnt", + DTB_DTB_CFG_CFG_DDR_RD_INTERVAL_CNTr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0064, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cfg_ddr_rd_interval_cnt_reg, + NULL, + NULL, + }, + { + "cfg_dtb_queue_lock_state_0_3", + DTB_DTB_CFG_CFG_DTB_QUEUE_LOCK_STATE_0_3r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0080, + (32/8), + 0, + 3 + 1, + 0, + 4, + 1, + g_dtb_dtb_cfg_cfg_dtb_queue_lock_state_0_3_reg, + NULL, + NULL, + }, + { + "w_convert_0_mode", + DTB_DTB_AXIM0_W_CONVERT_0_MODEr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_AXIM0_BASE_ADDR + 0x6060, + (32/8), + 0, + 1 + 1, + 0, + 256, + 1, + g_dtb_dtb_axim0_w_convert_0_mode_reg, + NULL, + NULL, + }, + { + "r_convert_0_mode", + DTB_DTB_AXIM0_R_CONVERT_0_MODEr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_AXIM0_BASE_ADDR + 0x2060, + (32/8), + 0, + 1 + 1, + 0, + 256, + 1, + g_dtb_dtb_axim0_r_convert_0_mode_reg, + NULL, + NULL, + }, + { + "aximr_os", + DTB_DTB_AXIM0_AXIMR_OSr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_AXIM0_BASE_ADDR + 0x2000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_axim0_aximr_os_reg, + NULL, + NULL, + }, + { + "w_convert_1_mode", + DTB_DTB_AXIM1_W_CONVERT_1_MODEr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_AXIM1_BASE_ADDR + 0x6060, + (32/8), + 0, + 2 + 1, + 0, + 256, + 1, + g_dtb_dtb_axim1_w_convert_1_mode_reg, + NULL, + NULL, + }, + { + "r_convert_1_mode", + DTB_DTB_AXIM1_R_CONVERT_1_MODEr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_AXIM1_BASE_ADDR + 0x2060, + (32/8), + 0, + 2 + 1, + 0, + 256, + 1, + g_dtb_dtb_axim1_r_convert_1_mode_reg, + NULL, + NULL, + }, + { + "axis_convert_mode", + DTB_DTB_AXIS_AXIS_CONVERT_MODEr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_AXIS_BASE_ADDR + 0x0450, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_axis_axis_convert_mode_reg, + NULL, + NULL, + }, + { + "cfg_queue_dtb_addr_h_0_127", + DTB4K_DTB_ENQ_CFG_QUEUE_DTB_ADDR_H_0_127r, + DTB4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_ENQ_BASE_ADDR + 0x0000, + (32/8), + 0, + 127 + 1, + 0, + 32, + 1, + g_dtb4k_dtb_enq_cfg_queue_dtb_addr_h_0_127_reg, + dpp_write, + dpp_read, + }, + { + "cfg_queue_dtb_addr_l_0_127", + DTB4K_DTB_ENQ_CFG_QUEUE_DTB_ADDR_L_0_127r, + DTB4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_ENQ_BASE_ADDR + 0x0004, + (32/8), + 0, + 127 + 1, + 0, + 32, + 1, + g_dtb4k_dtb_enq_cfg_queue_dtb_addr_l_0_127_reg, + dpp_write, + dpp_read, + }, + { + "cfg_queue_dtb_len_0_127", + DTB4K_DTB_ENQ_CFG_QUEUE_DTB_LEN_0_127r, + DTB4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_ENQ_BASE_ADDR + 0x0008, + (32/8), + 0, + 127 + 1, + 0, + 32, + 3, + g_dtb4k_dtb_enq_cfg_queue_dtb_len_0_127_reg, + dpp_write, + dpp_read, + }, + { + "info_queue_buf_space_left_0_127", + DTB4K_DTB_ENQ_INFO_QUEUE_BUF_SPACE_LEFT_0_127r, + DTB4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_ENQ_BASE_ADDR + 0x000c, + (32/8), + 0, + 127 + 1, + 0, + 32, + 1, + g_dtb4k_dtb_enq_info_queue_buf_space_left_0_127_reg, + dpp_write, + dpp_read, + }, + { + "cfg_epid_v_func_num_0_127", + DTB4K_DTB_ENQ_CFG_EPID_V_FUNC_NUM_0_127r, + DTB4K, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_ENQ_BASE_ADDR + 0x0010, + (32/8), + 0, + 127 + 1, + 0, + 32, + 7, + g_dtb4k_dtb_enq_cfg_epid_v_func_num_0_127_reg, + dpp_write, + dpp_read, + }, + { + "cpu_trpg_ms_en", + TRPG_TRPG_RX_PORT_CPU_TRPG_MS_ENr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x0004, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpg_ms_en_reg, + NULL, + NULL, + }, + { + "cpu_trpg_port_en", + TRPG_TRPG_RX_PORT_CPU_TRPG_PORT_ENr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x0010, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpg_port_en_reg, + NULL, + NULL, + }, + { + "cpu_trpg_look_en", + TRPG_TRPG_RX_PORT_CPU_TRPG_LOOK_ENr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x0014, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpg_look_en_reg, + NULL, + NULL, + }, + { + "cpu_trpgrx_ram_almost_full", + TRPG_TRPG_RX_PORT_CPU_TRPGRX_RAM_ALMOST_FULLr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x0028, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpgrx_ram_almost_full_reg, + NULL, + NULL, + }, + { + "cpu_trpgrx_ram_test_en", + TRPG_TRPG_RX_PORT_CPU_TRPGRX_RAM_TEST_ENr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x002c, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpgrx_ram_test_en_reg, + NULL, + NULL, + }, + { + "cpu_trpgrx_inmod_pfc_rdy_en", + TRPG_TRPG_RX_PORT_CPU_TRPGRX_INMOD_PFC_RDY_ENr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x0030, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpgrx_inmod_pfc_rdy_en_reg, + NULL, + NULL, + }, + { + "cpu_trpgrx_pkt_num_h", + TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_NUM_Hr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x0034, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpgrx_pkt_num_h_reg, + NULL, + NULL, + }, + { + "cpu_trpgrx_pkt_num_l", + TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_NUM_Lr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x0038, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpgrx_pkt_num_l_reg, + NULL, + NULL, + }, + { + "cpu_trpgrx_pkt_byte_num_h", + TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_BYTE_NUM_Hr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x003c, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpgrx_pkt_byte_num_h_reg, + NULL, + NULL, + }, + { + "cpu_trpgrx_pkt_byte_num_l", + TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_BYTE_NUM_Lr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x0040, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpgrx_pkt_byte_num_l_reg, + NULL, + NULL, + }, + { + "cpu_trpgrx_pkt_cnt_clr", + TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_CNT_CLRr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x0044, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpgrx_pkt_cnt_clr_reg, + NULL, + NULL, + }, + { + "cpu_trpgrx_fc_clk_freq", + TRPG_TRPG_RX_PORT_CPU_TRPGRX_FC_CLK_FREQr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x0048, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpgrx_fc_clk_freq_reg, + NULL, + NULL, + }, + { + "cpu_trpgrx_fc_en", + TRPG_TRPG_RX_PORT_CPU_TRPGRX_FC_ENr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x004c, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpgrx_fc_en_reg, + NULL, + NULL, + }, + { + "cpu_trpgrx_fc_token_add_num", + TRPG_TRPG_RX_PORT_CPU_TRPGRX_FC_TOKEN_ADD_NUMr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x0050, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpgrx_fc_token_add_num_reg, + NULL, + NULL, + }, + { + "cpu_trpgrx_fc_token_max_num", + TRPG_TRPG_RX_PORT_CPU_TRPGRX_FC_TOKEN_MAX_NUMr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x0054, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpgrx_fc_token_max_num_reg, + NULL, + NULL, + }, + { + "cpu_trpgrx_port_state_info", + TRPG_TRPG_RX_PORT_CPU_TRPGRX_PORT_STATE_INFOr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x0058, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpgrx_port_state_info_reg, + NULL, + NULL, + }, + { + "cpu_trpgrx_ram_past_max_dep", + TRPG_TRPG_RX_PORT_CPU_TRPGRX_RAM_PAST_MAX_DEPr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x005c, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpgrx_ram_past_max_dep_reg, + NULL, + NULL, + }, + { + "cpu_trpgrx_ram_past_max_dep_clr", + TRPG_TRPG_RX_PORT_CPU_TRPGRX_RAM_PAST_MAX_DEP_CLRr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x0060, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpgrx_ram_past_max_dep_clr_reg, + NULL, + NULL, + }, + { + "cpu_trpgrx_pkt_past_max_len", + TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_PAST_MAX_LENr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x0064, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpgrx_pkt_past_max_len_reg, + NULL, + NULL, + }, + { + "cpu_trpgrx_pkt_past_max_len_clr", + TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_PAST_MAX_LEN_CLRr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x0068, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpgrx_pkt_past_max_len_clr_reg, + NULL, + NULL, + }, + { + "cpu_trpgrx_pkt_past_min_len", + TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_PAST_MIN_LENr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x006c, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpgrx_pkt_past_min_len_reg, + NULL, + NULL, + }, + { + "cpu_trpgrx_pkt_past_min_len_clr", + TRPG_TRPG_RX_PORT_CPU_TRPGRX_PKT_PAST_MIN_LEN_CLRr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x0070, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpgrx_pkt_past_min_len_clr_reg, + NULL, + NULL, + }, + { + "trpg_rx_data_ram", + TRPG_TRPG_RX_RAM_TRPG_RX_DATA_RAMr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_RAM_BASE_ADDR + 0x0000, + (32/8), + DPP_TRPG_RAM_NUM, + 2047 + 1, + DPP_TRPG_RAM_SPACE_SIZE, + 4, + 1, + g_trpg_trpg_rx_ram_trpg_rx_data_ram_reg, + NULL, + NULL, + }, + { + "trpg_rx_info_ram", + TRPG_TRPG_RX_RAM_TRPG_RX_INFO_RAMr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_RAM_BASE_ADDR + 0x2000, + (32/8), + DPP_TRPG_RAM_NUM, + 255 + 1, + DPP_TRPG_RAM_SPACE_SIZE, + 4, + 1, + g_trpg_trpg_rx_ram_trpg_rx_info_ram_reg, + NULL, + NULL, + }, + { + "cpu_trpg_ms_en", + TRPG_TRPG_TX_PORT_CPU_TRPG_MS_ENr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_BASE_ADDR + 0x0004, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_tx_port_cpu_trpg_ms_en_reg, + NULL, + NULL, + }, + { + "cpu_trpg_port_en", + TRPG_TRPG_TX_PORT_CPU_TRPG_PORT_ENr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_BASE_ADDR + 0x0010, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_tx_port_cpu_trpg_port_en_reg, + NULL, + NULL, + }, + { + "cpu_trpg_look_en", + TRPG_TRPG_TX_PORT_CPU_TRPG_LOOK_ENr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_BASE_ADDR + 0x0014, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_tx_port_cpu_trpg_look_en_reg, + NULL, + NULL, + }, + { + "cpu_trpgtx_ram_almost_full", + TRPG_TRPG_TX_PORT_CPU_TRPGTX_RAM_ALMOST_FULLr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_BASE_ADDR + 0x0018, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_tx_port_cpu_trpgtx_ram_almost_full_reg, + NULL, + NULL, + }, + { + "cpu_trpgtx_ram_test_en", + TRPG_TRPG_TX_PORT_CPU_TRPGTX_RAM_TEST_ENr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_BASE_ADDR + 0x001c, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_tx_port_cpu_trpgtx_ram_test_en_reg, + NULL, + NULL, + }, + { + "cpu_trpgtx_pkt_num_h", + TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_NUM_Hr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_BASE_ADDR + 0x0034, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_tx_port_cpu_trpgtx_pkt_num_h_reg, + NULL, + NULL, + }, + { + "cpu_trpgtx_pkt_num_l", + TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_NUM_Lr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_BASE_ADDR + 0x0038, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_tx_port_cpu_trpgtx_pkt_num_l_reg, + NULL, + NULL, + }, + { + "cpu_trpgtx_pkt_byte_num_h", + TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_BYTE_NUM_Hr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_BASE_ADDR + 0x003c, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_tx_port_cpu_trpgtx_pkt_byte_num_h_reg, + NULL, + NULL, + }, + { + "cpu_trpgtx_pkt_byte_num_l", + TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_BYTE_NUM_Lr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_BASE_ADDR + 0x0040, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_tx_port_cpu_trpgtx_pkt_byte_num_l_reg, + NULL, + NULL, + }, + { + "cpu_trpgtx_pkt_cnt_clr", + TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_CNT_CLRr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_BASE_ADDR + 0x0044, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_tx_port_cpu_trpgtx_pkt_cnt_clr_reg, + NULL, + NULL, + }, + { + "cpu_trpgtx_fc_clk_freq", + TRPG_TRPG_TX_PORT_CPU_TRPGTX_FC_CLK_FREQr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_BASE_ADDR + 0x0048, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_tx_port_cpu_trpgtx_fc_clk_freq_reg, + NULL, + NULL, + }, + { + "cpu_trpgtx_fc_en", + TRPG_TRPG_TX_PORT_CPU_TRPGTX_FC_ENr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_BASE_ADDR + 0x004c, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_tx_port_cpu_trpgtx_fc_en_reg, + NULL, + NULL, + }, + { + "cpu_trpgtx_fc_token_add_num", + TRPG_TRPG_TX_PORT_CPU_TRPGTX_FC_TOKEN_ADD_NUMr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_BASE_ADDR + 0x0050, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_tx_port_cpu_trpgtx_fc_token_add_num_reg, + NULL, + NULL, + }, + { + "cpu_trpgtx_fc_token_max_num", + TRPG_TRPG_TX_PORT_CPU_TRPGTX_FC_TOKEN_MAX_NUMr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_BASE_ADDR + 0x0054, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_tx_port_cpu_trpgtx_fc_token_max_num_reg, + NULL, + NULL, + }, + { + "cpu_trpgtx_port_state_info", + TRPG_TRPG_TX_PORT_CPU_TRPGTX_PORT_STATE_INFOr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_BASE_ADDR + 0x0058, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_tx_port_cpu_trpgtx_port_state_info_reg, + NULL, + NULL, + }, + { + "cpu_trpgtx_ram_past_max_dep", + TRPG_TRPG_TX_PORT_CPU_TRPGTX_RAM_PAST_MAX_DEPr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_BASE_ADDR + 0x005c, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_tx_port_cpu_trpgtx_ram_past_max_dep_reg, + NULL, + NULL, + }, + { + "cpu_trpgtx_ram_past_max_dep_clr", + TRPG_TRPG_TX_PORT_CPU_TRPGTX_RAM_PAST_MAX_DEP_CLRr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_BASE_ADDR + 0x0060, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_tx_port_cpu_trpgtx_ram_past_max_dep_clr_reg, + NULL, + NULL, + }, + { + "cpu_trpgtx_pkt_past_max_len", + TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_PAST_MAX_LENr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_BASE_ADDR + 0x0064, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_tx_port_cpu_trpgtx_pkt_past_max_len_reg, + NULL, + NULL, + }, + { + "cpu_trpgtx_pkt_past_max_len_clr", + TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_PAST_MAX_LEN_CLRr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_BASE_ADDR + 0x0068, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_tx_port_cpu_trpgtx_pkt_past_max_len_clr_reg, + NULL, + NULL, + }, + { + "cpu_trpgtx_pkt_past_min_len", + TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_PAST_MIN_LENr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_BASE_ADDR + 0x006c, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_tx_port_cpu_trpgtx_pkt_past_min_len_reg, + NULL, + NULL, + }, + { + "cpu_trpgtx_pkt_past_min_len_clr", + TRPG_TRPG_TX_PORT_CPU_TRPGTX_PKT_PAST_MIN_LEN_CLRr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_BASE_ADDR + 0x0070, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_tx_port_cpu_trpgtx_pkt_past_min_len_clr_reg, + NULL, + NULL, + }, + { + "cpu_trpgtx_etm_ram_almost_full", + TRPG_TRPG_TX_ETM_PORT_CPU_TRPGTX_ETM_RAM_ALMOST_FULLr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_ETM_PORT_BASE_ADDR + 0x0000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_trpg_trpg_tx_etm_port_cpu_trpgtx_etm_ram_almost_full_reg, + NULL, + NULL, + }, + { + "cpu_trpgtx_etm_ram_test_en", + TRPG_TRPG_TX_ETM_PORT_CPU_TRPGTX_ETM_RAM_TEST_ENr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_ETM_PORT_BASE_ADDR + 0x0010, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_trpg_trpg_tx_etm_port_cpu_trpgtx_etm_ram_test_en_reg, + NULL, + NULL, + }, + { + "cpu_todtime_update_int_mask", + TRPG_TRPG_TX_GLB_CPU_TODTIME_UPDATE_INT_MASKr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_GLB_BASE_ADDR + 0x000c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_trpg_trpg_tx_glb_cpu_todtime_update_int_mask_reg, + NULL, + NULL, + }, + { + "cpu_todtime_update_int_clr", + TRPG_TRPG_TX_GLB_CPU_TODTIME_UPDATE_INT_CLRr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_GLB_BASE_ADDR + 0x0010, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_trpg_trpg_tx_glb_cpu_todtime_update_int_clr_reg, + NULL, + NULL, + }, + { + "cpu_todtime_ram_test_en", + TRPG_TRPG_TX_GLB_CPU_TODTIME_RAM_TEST_ENr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_GLB_BASE_ADDR + 0x004c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_trpg_trpg_tx_glb_cpu_todtime_ram_test_en_reg, + NULL, + NULL, + }, + { + "trpg_tx_data_ram", + TRPG_TRPG_TX_RAM_TRPG_TX_DATA_RAMr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_RAM_BASE_ADDR + 0x0000, + (32/8), + DPP_TRPG_RAM_NUM, + 12031 + 1, + DPP_TRPG_RAM_SPACE_SIZE, + 4, + 1, + g_trpg_trpg_tx_ram_trpg_tx_data_ram_reg, + NULL, + NULL, + }, + { + "trpg_tx_info_ram", + TRPG_TRPG_TX_RAM_TRPG_TX_INFO_RAMr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_RAM_BASE_ADDR + 0xc000, + (32/8), + DPP_TRPG_RAM_NUM, + 751 + 1, + DPP_TRPG_RAM_SPACE_SIZE, + 4, + 1, + g_trpg_trpg_tx_ram_trpg_tx_info_ram_reg, + NULL, + NULL, + }, + { + "trpg_tx_etm_data_ram", + TRPG_TRPG_TX_ETM_RAM_TRPG_TX_ETM_DATA_RAMr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_ETM_RAM_BASE_ADDR + 0x0000, + (32/8), + 0, + 511 + 1, + 0, + 4, + 1, + g_trpg_trpg_tx_etm_ram_trpg_tx_etm_data_ram_reg, + NULL, + NULL, + }, + { + "trpg_tx_etm_info_ram", + TRPG_TRPG_TX_ETM_RAM_TRPG_TX_ETM_INFO_RAMr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_ETM_RAM_BASE_ADDR + 0x800, + (32/8), + 0, + 31 + 1, + 0, + 4, + 1, + g_trpg_trpg_tx_etm_ram_trpg_tx_etm_info_ram_reg, + NULL, + NULL, + }, + { + "chip_version_reg", + ETM_CFGMT_CHIP_VERSION_REGr, + ETM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + 0x40, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_etm_cfgmt_chip_version_reg_reg, + NULL, + NULL, + }, + { + "chip_date_reg", + ETM_CFGMT_CHIP_DATE_REGr, + ETM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + 0x50, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cfgmt_chip_date_reg_reg, + NULL, + NULL, + }, + { + "cfgmt_crc_en", + ETM_CFGMT_CFGMT_CRC_ENr, + ETM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + 0x80, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cfgmt_cfgmt_crc_en_reg, + NULL, + NULL, + }, + { + "cfg_port_transfer_en", + ETM_CFGMT_CFG_PORT_TRANSFER_ENr, + ETM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + 0x130, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cfgmt_cfg_port_transfer_en_reg, + NULL, + NULL, + }, + { + "tm_sa_work_mode", + ETM_CFGMT_TM_SA_WORK_MODEr, + ETM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + 0x180, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cfgmt_tm_sa_work_mode_reg, + NULL, + NULL, + }, + { + "local_sa_id", + ETM_CFGMT_LOCAL_SA_IDr, + ETM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + 0x190, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cfgmt_local_sa_id_reg, + NULL, + NULL, + }, + { + "olif_rdy", + ETM_OLIF_OLIF_RDYr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_etm_olif_olif_rdy_reg, + NULL, + NULL, + }, + { + "emem_prog_full", + ETM_OLIF_EMEM_PROG_FULLr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x3, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_olif_emem_prog_full_reg, + NULL, + NULL, + }, + { + "port_order_fifo_full", + ETM_OLIF_PORT_ORDER_FIFO_FULLr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x5, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_olif_port_order_fifo_full_reg, + NULL, + NULL, + }, + { + "olif_release_last", + ETM_OLIF_OLIF_RELEASE_LASTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x6, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_olif_olif_release_last_reg, + NULL, + NULL, + }, + { + "olif_fifo_empty_state", + ETM_OLIF_OLIF_FIFO_EMPTY_STATEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xa, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_etm_olif_olif_fifo_empty_state_reg, + NULL, + NULL, + }, + { + "qmu_olif_release_fc_cnt", + ETM_OLIF_QMU_OLIF_RELEASE_FC_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xb, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_qmu_olif_release_fc_cnt_reg, + NULL, + NULL, + }, + { + "olif_qmu_link_fc_cnt", + ETM_OLIF_OLIF_QMU_LINK_FC_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_olif_qmu_link_fc_cnt_reg, + NULL, + NULL, + }, + { + "lif0_link_fc_cnt", + ETM_OLIF_LIF0_LINK_FC_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xd, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_lif0_link_fc_cnt_reg, + NULL, + NULL, + }, + { + "olif_tmmu_fc_cnt", + ETM_OLIF_OLIF_TMMU_FC_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xe, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_olif_tmmu_fc_cnt_reg, + NULL, + NULL, + }, + { + "olif_mmu_fc_cnt", + ETM_OLIF_OLIF_MMU_FC_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xf, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_olif_mmu_fc_cnt_reg, + NULL, + NULL, + }, + { + "olif_qmu_port_rdy_h", + ETM_OLIF_OLIF_QMU_PORT_RDY_Hr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x10, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_olif_qmu_port_rdy_h_reg, + NULL, + NULL, + }, + { + "olif_qmu_port_rdy_l", + ETM_OLIF_OLIF_QMU_PORT_RDY_Lr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x11, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_olif_qmu_port_rdy_l_reg, + NULL, + NULL, + }, + { + "lif0_port_rdy_h", + ETM_OLIF_LIF0_PORT_RDY_Hr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_lif0_port_rdy_h_reg, + NULL, + NULL, + }, + { + "lif0_port_rdy_l", + ETM_OLIF_LIF0_PORT_RDY_Lr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x13, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_lif0_port_rdy_l_reg, + NULL, + NULL, + }, + { + "qmu_olif_rd_sop_cnt", + ETM_OLIF_QMU_OLIF_RD_SOP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x14, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_qmu_olif_rd_sop_cnt_reg, + NULL, + NULL, + }, + { + "qmu_olif_rd_eop_cnt", + ETM_OLIF_QMU_OLIF_RD_EOP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x15, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_qmu_olif_rd_eop_cnt_reg, + NULL, + NULL, + }, + { + "qmu_olif_rd_vld_cnt", + ETM_OLIF_QMU_OLIF_RD_VLD_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x16, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_qmu_olif_rd_vld_cnt_reg, + NULL, + NULL, + }, + { + "qmu_olif_rd_blk_cnt", + ETM_OLIF_QMU_OLIF_RD_BLK_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x17, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_qmu_olif_rd_blk_cnt_reg, + NULL, + NULL, + }, + { + "mmu_tm_data_sop_cnt", + ETM_OLIF_MMU_TM_DATA_SOP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x18, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_mmu_tm_data_sop_cnt_reg, + NULL, + NULL, + }, + { + "mmu_tm_data_eop_cnt", + ETM_OLIF_MMU_TM_DATA_EOP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x19, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_mmu_tm_data_eop_cnt_reg, + NULL, + NULL, + }, + { + "mmu_tm_data_vld_cnt", + ETM_OLIF_MMU_TM_DATA_VLD_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_mmu_tm_data_vld_cnt_reg, + NULL, + NULL, + }, + { + "odma_tm_data_sop_cnt", + ETM_OLIF_ODMA_TM_DATA_SOP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_odma_tm_data_sop_cnt_reg, + NULL, + NULL, + }, + { + "odma_tm_data_eop_cnt", + ETM_OLIF_ODMA_TM_DATA_EOP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_odma_tm_data_eop_cnt_reg, + NULL, + NULL, + }, + { + "odma_tm_deq_vld_cnt", + ETM_OLIF_ODMA_TM_DEQ_VLD_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_odma_tm_deq_vld_cnt_reg, + NULL, + NULL, + }, + { + "olif_qmu_release_vld_cnt", + ETM_OLIF_OLIF_QMU_RELEASE_VLD_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1f, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_olif_qmu_release_vld_cnt_reg, + NULL, + NULL, + }, + { + "emem_dat_vld_cnt", + ETM_OLIF_EMEM_DAT_VLD_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_emem_dat_vld_cnt_reg, + NULL, + NULL, + }, + { + "imem_dat_vld_cnt", + ETM_OLIF_IMEM_DAT_VLD_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x21, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_imem_dat_vld_cnt_reg, + NULL, + NULL, + }, + { + "emem_dat_rd_cnt", + ETM_OLIF_EMEM_DAT_RD_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x22, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_emem_dat_rd_cnt_reg, + NULL, + NULL, + }, + { + "imem_dat_rd_cnt", + ETM_OLIF_IMEM_DAT_RD_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x23, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_imem_dat_rd_cnt_reg, + NULL, + NULL, + }, + { + "qmu_olif_rd_sop_emem_cnt", + ETM_OLIF_QMU_OLIF_RD_SOP_EMEM_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x24, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_qmu_olif_rd_sop_emem_cnt_reg, + NULL, + NULL, + }, + { + "qmu_olif_rd_vld_emem_cnt", + ETM_OLIF_QMU_OLIF_RD_VLD_EMEM_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x25, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_qmu_olif_rd_vld_emem_cnt_reg, + NULL, + NULL, + }, + { + "cpu_last_wr_addr", + ETM_OLIF_CPU_LAST_WR_ADDRr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x26, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_cpu_last_wr_addr_reg, + NULL, + NULL, + }, + { + "cpu_last_wr_data", + ETM_OLIF_CPU_LAST_WR_DATAr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x27, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_cpu_last_wr_data_reg, + NULL, + NULL, + }, + { + "cpu_last_rd_addr", + ETM_OLIF_CPU_LAST_RD_ADDRr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x28, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_cpu_last_rd_addr_reg, + NULL, + NULL, + }, + { + "qmu_olif_last_port", + ETM_OLIF_QMU_OLIF_LAST_PORTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x35, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_qmu_olif_last_port_reg, + NULL, + NULL, + }, + { + "qmu_olif_last_addr", + ETM_OLIF_QMU_OLIF_LAST_ADDRr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x36, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_qmu_olif_last_addr_reg, + NULL, + NULL, + }, + { + "qmu_olif_last_bank", + ETM_OLIF_QMU_OLIF_LAST_BANKr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x37, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_olif_qmu_olif_last_bank_reg, + NULL, + NULL, + }, + { + "tm_lif_byte_stat", + ETM_OLIF_TM_LIF_BYTE_STATr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x70, + (32/8), + 0, + 0xf + 1, + 0, + 0x1, + 1, + g_etm_olif_tm_lif_byte_stat_reg, + NULL, + NULL, + }, + { + "tm_lif_err_stat", + ETM_OLIF_TM_LIF_ERR_STATr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x90, + (32/8), + 0, + 0xf + 1, + 0, + 0x1, + 1, + g_etm_olif_tm_lif_err_stat_reg, + NULL, + NULL, + }, + { + "port_share_cnt", + ETM_CGAVD_PORT_SHARE_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_port_share_cnt_reg, + NULL, + NULL, + }, + { + "total_imem_cnt", + ETM_CGAVD_TOTAL_IMEM_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xa, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_total_imem_cnt_reg, + NULL, + NULL, + }, + { + "pp_q_len", + ETM_CGAVD_PP_Q_LENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0xa00, + (32/8), + 0, + 0x7f + 1, + 0, + 0x1, + 1, + g_etm_cgavd_pp_q_len_reg, + NULL, + NULL, + }, + { + "sys_q_len", + ETM_CGAVD_SYS_Q_LENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1205, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_sys_q_len_reg, + NULL, + NULL, + }, + { + "cgavd_cfg_error_warning", + ETM_CGAVD_CGAVD_CFG_ERROR_WARNINGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12de, + (32/8), + 0, + 0, + 0, + 0, + 12, + g_etm_cgavd_cgavd_cfg_error_warning_reg, + NULL, + NULL, + }, + { + "mult_qlen_th_en", + ETM_CGAVD_MULT_QLEN_TH_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12df, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_mult_qlen_th_en_reg, + NULL, + NULL, + }, + { + "mult_qlen_th", + ETM_CGAVD_MULT_QLEN_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_mult_qlen_th_reg, + NULL, + NULL, + }, + { + "cgavd_cfg_move", + ETM_CGAVD_CGAVD_CFG_MOVEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12e1, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_etm_cgavd_cgavd_cfg_move_reg, + NULL, + NULL, + }, + { + "cfgmt_total_th", + ETM_CGAVD_CFGMT_TOTAL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12e2, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cfgmt_total_th_reg, + NULL, + NULL, + }, + { + "cfgmt_port_share_th", + ETM_CGAVD_CFGMT_PORT_SHARE_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x12e3, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cfgmt_port_share_th_reg, + NULL, + NULL, + }, + { + "sa_unreach_state", + ETM_CGAVD_SA_UNREACH_STATEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x1300, + (32/8), + 0, + 0x3 + 1, + 0, + 0x1, + 1, + g_etm_cgavd_sa_unreach_state_reg, + NULL, + NULL, + }, + { + "mv_port_th", + ETM_CGAVD_MV_PORT_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x2000, + (32/8), + 0, + 0x3f + 1, + 0, + 0x1, + 1, + g_etm_cgavd_mv_port_th_reg, + NULL, + NULL, + }, + { + "mv_drop_sp_th", + ETM_CGAVD_MV_DROP_SP_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x3000, + (32/8), + 0, + 0x7 + 1, + 0, + 0x1, + 1, + g_etm_cgavd_mv_drop_sp_th_reg, + NULL, + NULL, + }, + { + "cgavd_state_warning", + ETM_CGAVD_CGAVD_STATE_WARNINGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x250006, + (32/8), + 0, + 0, + 0, + 0, + 6, + g_etm_cgavd_cgavd_state_warning_reg, + NULL, + NULL, + }, + { + "tmmu_cgavd_dma_fifo_cnt", + ETM_CGAVD_TMMU_CGAVD_DMA_FIFO_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x250008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_tmmu_cgavd_dma_fifo_cnt_reg, + NULL, + NULL, + }, + { + "tmmu_cgavd_dma_fifo_cnt_max", + ETM_CGAVD_TMMU_CGAVD_DMA_FIFO_CNT_MAXr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x250009, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_tmmu_cgavd_dma_fifo_cnt_max_reg, + NULL, + NULL, + }, + { + "imem_total_cnt", + ETM_CGAVD_IMEM_TOTAL_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x25000a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_imem_total_cnt_reg, + NULL, + NULL, + }, + { + "imem_total_cnt_max", + ETM_CGAVD_IMEM_TOTAL_CNT_MAXr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x25000b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_imem_total_cnt_max_reg, + NULL, + NULL, + }, + { + "flow0_omem_cnt", + ETM_CGAVD_FLOW0_OMEM_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x260020, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_flow0_omem_cnt_reg, + NULL, + NULL, + }, + { + "flow1_omem_cnt", + ETM_CGAVD_FLOW1_OMEM_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x260021, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_flow1_omem_cnt_reg, + NULL, + NULL, + }, + { + "flow2_omem_cnt", + ETM_CGAVD_FLOW2_OMEM_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x260022, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_flow2_omem_cnt_reg, + NULL, + NULL, + }, + { + "flow3_omem_cnt", + ETM_CGAVD_FLOW3_OMEM_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x260023, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_flow3_omem_cnt_reg, + NULL, + NULL, + }, + { + "flow4_omem_cnt", + ETM_CGAVD_FLOW4_OMEM_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x260024, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_flow4_omem_cnt_reg, + NULL, + NULL, + }, + { + "appoint_flow_num_message_1", + ETM_CGAVD_APPOINT_FLOW_NUM_MESSAGE_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x261000, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_cgavd_appoint_flow_num_message_1_reg, + NULL, + NULL, + }, + { + "appoint_flow_num_message_2", + ETM_CGAVD_APPOINT_FLOW_NUM_MESSAGE_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x261001, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_cgavd_appoint_flow_num_message_2_reg, + NULL, + NULL, + }, + { + "odma_cgavd_pkt_num_1", + ETM_CGAVD_ODMA_CGAVD_PKT_NUM_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x262000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_odma_cgavd_pkt_num_1_reg, + NULL, + NULL, + }, + { + "odma_cgavd_byte_num_1", + ETM_CGAVD_ODMA_CGAVD_BYTE_NUM_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x262001, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_odma_cgavd_byte_num_1_reg, + NULL, + NULL, + }, + { + "cgavd_enqueue_pkt_num_1", + ETM_CGAVD_CGAVD_ENQUEUE_PKT_NUM_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x262002, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_enqueue_pkt_num_1_reg, + NULL, + NULL, + }, + { + "cgavd_dequeue_pkt_num_1", + ETM_CGAVD_CGAVD_DEQUEUE_PKT_NUM_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x262003, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_dequeue_pkt_num_1_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_pkt_imem_num_1", + ETM_CGAVD_CGAVD_QMU_PKT_IMEM_NUM_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x262004, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_pkt_imem_num_1_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_pkt_omem_num_1", + ETM_CGAVD_CGAVD_QMU_PKT_OMEM_NUM_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x262005, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_pkt_omem_num_1_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_byte_imem_num_1", + ETM_CGAVD_CGAVD_QMU_BYTE_IMEM_NUM_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x262006, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_byte_imem_num_1_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_byte_omem_num_1", + ETM_CGAVD_CGAVD_QMU_BYTE_OMEM_NUM_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x262007, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_byte_omem_num_1_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_pkt_drop_num_1", + ETM_CGAVD_CGAVD_QMU_PKT_DROP_NUM_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x262008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_pkt_drop_num_1_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_byte_drop_num_1", + ETM_CGAVD_CGAVD_QMU_BYTE_DROP_NUM_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x262009, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_byte_drop_num_1_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_forbid_drop_num_1", + ETM_CGAVD_CGAVD_QMU_FORBID_DROP_NUM_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x262010, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_forbid_drop_num_1_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_flow_td_drop_num_1", + ETM_CGAVD_CGAVD_QMU_FLOW_TD_DROP_NUM_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x262011, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_flow_td_drop_num_1_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_flow_wred_drop_num_1", + ETM_CGAVD_CGAVD_QMU_FLOW_WRED_DROP_NUM_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x262012, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_flow_wred_drop_num_1_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_flow_wred_dp_drop_num_1", + ETM_CGAVD_CGAVD_QMU_FLOW_WRED_DP_DROP_NUM_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x262100, + (32/8), + 0, + 0x7 + 1, + 0, + 0x1, + 1, + g_etm_cgavd_cgavd_qmu_flow_wred_dp_drop_num_1_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_pp_td_num_1", + ETM_CGAVD_CGAVD_QMU_PP_TD_NUM_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x262200, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_pp_td_num_1_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_pp_wred_drop_num_1", + ETM_CGAVD_CGAVD_QMU_PP_WRED_DROP_NUM_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x262201, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_pp_wred_drop_num_1_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_pp_wred_dp_drop_num_1", + ETM_CGAVD_CGAVD_QMU_PP_WRED_DP_DROP_NUM_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x262300, + (32/8), + 0, + 0x7 + 1, + 0, + 0x1, + 1, + g_etm_cgavd_cgavd_qmu_pp_wred_dp_drop_num_1_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_sys_td_drop_num_1", + ETM_CGAVD_CGAVD_QMU_SYS_TD_DROP_NUM_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x262400, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_sys_td_drop_num_1_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_sys_gred_drop_num_1", + ETM_CGAVD_CGAVD_QMU_SYS_GRED_DROP_NUM_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x262401, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_sys_gred_drop_num_1_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_sys_gred_dp_drop_num1", + ETM_CGAVD_CGAVD_QMU_SYS_GRED_DP_DROP_NUM1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x262500, + (32/8), + 0, + 0x7 + 1, + 0, + 0x1, + 1, + g_etm_cgavd_cgavd_qmu_sys_gred_dp_drop_num1_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_sa_drop_num_1", + ETM_CGAVD_CGAVD_QMU_SA_DROP_NUM_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x262600, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_sa_drop_num_1_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_move_drop_num_1", + ETM_CGAVD_CGAVD_QMU_MOVE_DROP_NUM_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x262601, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_move_drop_num_1_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_tm_mult_drop_num_1", + ETM_CGAVD_CGAVD_QMU_TM_MULT_DROP_NUM_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x262602, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_tm_mult_drop_num_1_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_tm_error_drop_num_1", + ETM_CGAVD_CGAVD_QMU_TM_ERROR_DROP_NUM_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x262603, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_tm_error_drop_num_1_reg, + NULL, + NULL, + }, + { + "odma_cgavd_pkt_num_2", + ETM_CGAVD_ODMA_CGAVD_PKT_NUM_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x263000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_odma_cgavd_pkt_num_2_reg, + NULL, + NULL, + }, + { + "odma_cgavd_byte_num_2", + ETM_CGAVD_ODMA_CGAVD_BYTE_NUM_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x263001, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_odma_cgavd_byte_num_2_reg, + NULL, + NULL, + }, + { + "cgavd_enqueue_pkt_num_2", + ETM_CGAVD_CGAVD_ENQUEUE_PKT_NUM_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x263002, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_enqueue_pkt_num_2_reg, + NULL, + NULL, + }, + { + "cgavd_dequeue_pkt_num_2", + ETM_CGAVD_CGAVD_DEQUEUE_PKT_NUM_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x263003, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_dequeue_pkt_num_2_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_pkt_imem_num_2", + ETM_CGAVD_CGAVD_QMU_PKT_IMEM_NUM_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x263004, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_pkt_imem_num_2_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_pkt_omem_num_2", + ETM_CGAVD_CGAVD_QMU_PKT_OMEM_NUM_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x263005, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_pkt_omem_num_2_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_byte_imem_num_2", + ETM_CGAVD_CGAVD_QMU_BYTE_IMEM_NUM_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x263006, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_byte_imem_num_2_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_byte_omem_num_2", + ETM_CGAVD_CGAVD_QMU_BYTE_OMEM_NUM_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x263007, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_byte_omem_num_2_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_pkt_drop_num_2", + ETM_CGAVD_CGAVD_QMU_PKT_DROP_NUM_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x263008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_pkt_drop_num_2_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_byte_drop_num_2", + ETM_CGAVD_CGAVD_QMU_BYTE_DROP_NUM_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x263009, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_byte_drop_num_2_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_forbid_drop_num_2", + ETM_CGAVD_CGAVD_QMU_FORBID_DROP_NUM_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x263010, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_forbid_drop_num_2_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_flow_td_drop_num_2", + ETM_CGAVD_CGAVD_QMU_FLOW_TD_DROP_NUM_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x263011, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_flow_td_drop_num_2_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_flow_wred_drop_num_2", + ETM_CGAVD_CGAVD_QMU_FLOW_WRED_DROP_NUM_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x263012, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_flow_wred_drop_num_2_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_flow_wred_dp_drop_num_2", + ETM_CGAVD_CGAVD_QMU_FLOW_WRED_DP_DROP_NUM_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x263100, + (32/8), + 0, + 0x7 + 1, + 0, + 0x1, + 1, + g_etm_cgavd_cgavd_qmu_flow_wred_dp_drop_num_2_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_pp_td_num_2", + ETM_CGAVD_CGAVD_QMU_PP_TD_NUM_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x263200, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_pp_td_num_2_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_pp_wred_drop_num_2", + ETM_CGAVD_CGAVD_QMU_PP_WRED_DROP_NUM_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x263201, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_pp_wred_drop_num_2_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_pp_wred_dp_drop_num_2", + ETM_CGAVD_CGAVD_QMU_PP_WRED_DP_DROP_NUM_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x263300, + (32/8), + 0, + 0x7 + 1, + 0, + 0x1, + 1, + g_etm_cgavd_cgavd_qmu_pp_wred_dp_drop_num_2_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_sys_td_drop_num_2", + ETM_CGAVD_CGAVD_QMU_SYS_TD_DROP_NUM_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x263400, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_sys_td_drop_num_2_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_sys_gred_drop_num_2", + ETM_CGAVD_CGAVD_QMU_SYS_GRED_DROP_NUM_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x263401, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_sys_gred_drop_num_2_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_sys_gred_dp_drop_num_2", + ETM_CGAVD_CGAVD_QMU_SYS_GRED_DP_DROP_NUM_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x263500, + (32/8), + 0, + 0x7 + 1, + 0, + 0x1, + 1, + g_etm_cgavd_cgavd_qmu_sys_gred_dp_drop_num_2_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_sa_drop_num_2", + ETM_CGAVD_CGAVD_QMU_SA_DROP_NUM_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x263600, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_sa_drop_num_2_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_move_drop_num_2", + ETM_CGAVD_CGAVD_QMU_MOVE_DROP_NUM_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x263601, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_move_drop_num_2_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_tm_mult_drop_num_2", + ETM_CGAVD_CGAVD_QMU_TM_MULT_DROP_NUM_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x263602, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_tm_mult_drop_num_2_reg, + NULL, + NULL, + }, + { + "cgavd_qmu_tm_error_drop_num_2", + ETM_CGAVD_CGAVD_QMU_TM_ERROR_DROP_NUM_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x263603, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_cgavd_cgavd_qmu_tm_error_drop_num_2_reg, + NULL, + NULL, + }, + { + "move_flow_th_profile", + ETM_CGAVD_MOVE_FLOW_TH_PROFILEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x270000, + (32/8), + 0, + 0x23FF + 1, + 0, + 0x1, + 1, + g_etm_cgavd_move_flow_th_profile_reg, + NULL, + NULL, + }, + { + "move_flow_th", + ETM_CGAVD_MOVE_FLOW_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x280000, + (32/8), + 0, + 0xF + 1, + 0, + 0x1, + 1, + g_etm_cgavd_move_flow_th_reg, + NULL, + NULL, + }, + { + "emem_pd_fifo_aful_th", + ETM_TMMU_EMEM_PD_FIFO_AFUL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0009, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_emem_pd_fifo_aful_th_reg, + NULL, + NULL, + }, + { + "dma_data_fifo_aful_th", + ETM_TMMU_DMA_DATA_FIFO_AFUL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x000a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_dma_data_fifo_aful_th_reg, + NULL, + NULL, + }, + { + "tmmu_states_0", + ETM_TMMU_TMMU_STATES_0r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0010, + (32/8), + 0, + 0, + 0, + 0, + 31, + g_etm_tmmu_tmmu_states_0_reg, + NULL, + NULL, + }, + { + "qmu_tmmu_wr_sop_cnt", + ETM_TMMU_QMU_TMMU_WR_SOP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0013, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_qmu_tmmu_wr_sop_cnt_reg, + NULL, + NULL, + }, + { + "qmu_tmmu_wr_eop_cnt", + ETM_TMMU_QMU_TMMU_WR_EOP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0014, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_qmu_tmmu_wr_eop_cnt_reg, + NULL, + NULL, + }, + { + "qmu_tmmu_wr_drop_cnt", + ETM_TMMU_QMU_TMMU_WR_DROP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0015, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_qmu_tmmu_wr_drop_cnt_reg, + NULL, + NULL, + }, + { + "qmu_tmmu_wr_emem_cnt", + ETM_TMMU_QMU_TMMU_WR_EMEM_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0016, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_qmu_tmmu_wr_emem_cnt_reg, + NULL, + NULL, + }, + { + "qmu_tmmu_wr_imem_cnt", + ETM_TMMU_QMU_TMMU_WR_IMEM_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0017, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_qmu_tmmu_wr_imem_cnt_reg, + NULL, + NULL, + }, + { + "tmmu_mmu_wr_sop_cnt", + ETM_TMMU_TMMU_MMU_WR_SOP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0018, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_tmmu_mmu_wr_sop_cnt_reg, + NULL, + NULL, + }, + { + "tmmu_mmu_wr_eop_cnt", + ETM_TMMU_TMMU_MMU_WR_EOP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0019, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_tmmu_mmu_wr_eop_cnt_reg, + NULL, + NULL, + }, + { + "qmu_tmmu_rd_sop_cnt", + ETM_TMMU_QMU_TMMU_RD_SOP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x001a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_qmu_tmmu_rd_sop_cnt_reg, + NULL, + NULL, + }, + { + "qmu_tmmu_rd_eop_cnt", + ETM_TMMU_QMU_TMMU_RD_EOP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x001b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_qmu_tmmu_rd_eop_cnt_reg, + NULL, + NULL, + }, + { + "qmu_tmmu_rd_drop_cnt", + ETM_TMMU_QMU_TMMU_RD_DROP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x001c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_qmu_tmmu_rd_drop_cnt_reg, + NULL, + NULL, + }, + { + "qmu_tmmu_rd_emem_cnt", + ETM_TMMU_QMU_TMMU_RD_EMEM_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x001d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_qmu_tmmu_rd_emem_cnt_reg, + NULL, + NULL, + }, + { + "qmu_tmmu_rd_imem_cnt", + ETM_TMMU_QMU_TMMU_RD_IMEM_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x001e, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_qmu_tmmu_rd_imem_cnt_reg, + NULL, + NULL, + }, + { + "tmmu_mmu_rd_sop_cnt", + ETM_TMMU_TMMU_MMU_RD_SOP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x001f, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_tmmu_mmu_rd_sop_cnt_reg, + NULL, + NULL, + }, + { + "tmmu_mmu_rd_eop_cnt", + ETM_TMMU_TMMU_MMU_RD_EOP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0020, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_tmmu_mmu_rd_eop_cnt_reg, + NULL, + NULL, + }, + { + "tmmu_odma_in_sop_cnt", + ETM_TMMU_TMMU_ODMA_IN_SOP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0021, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_tmmu_odma_in_sop_cnt_reg, + NULL, + NULL, + }, + { + "tmmu_odma_in_eop_cnt", + ETM_TMMU_TMMU_ODMA_IN_EOP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0022, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_tmmu_odma_in_eop_cnt_reg, + NULL, + NULL, + }, + { + "tmmu_odma_vld_cnt", + ETM_TMMU_TMMU_ODMA_VLD_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0023, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_tmmu_odma_vld_cnt_reg, + NULL, + NULL, + }, + { + "qmu_pd_in_cnt", + ETM_TMMU_QMU_PD_IN_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0024, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_qmu_pd_in_cnt_reg, + NULL, + NULL, + }, + { + "tmmu_pd_hit_cnt", + ETM_TMMU_TMMU_PD_HIT_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0025, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_tmmu_pd_hit_cnt_reg, + NULL, + NULL, + }, + { + "tmmu_pd_out_cnt", + ETM_TMMU_TMMU_PD_OUT_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0026, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_tmmu_pd_out_cnt_reg, + NULL, + NULL, + }, + { + "tmmu_wr_cmd_fifo_wr_cnt", + ETM_TMMU_TMMU_WR_CMD_FIFO_WR_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0027, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_tmmu_wr_cmd_fifo_wr_cnt_reg, + NULL, + NULL, + }, + { + "tmmu_imem_age_cnt", + ETM_TMMU_TMMU_IMEM_AGE_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0028, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_tmmu_imem_age_cnt_reg, + NULL, + NULL, + }, + { + "tmmu_cmdsch_rd_cnt", + ETM_TMMU_TMMU_CMDSCH_RD_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0029, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_tmmu_cmdsch_rd_cnt_reg, + NULL, + NULL, + }, + { + "tmmu_cmdsch_drop_cnt", + ETM_TMMU_TMMU_CMDSCH_DROP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x002a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_tmmu_cmdsch_drop_cnt_reg, + NULL, + NULL, + }, + { + "tmmu_cmdsw_drop_cnt", + ETM_TMMU_TMMU_CMDSW_DROP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x002b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_tmmu_cmdsw_drop_cnt_reg, + NULL, + NULL, + }, + { + "tmmu_odma_enq_rd_cnt", + ETM_TMMU_TMMU_ODMA_ENQ_RD_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x002c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_tmmu_odma_enq_rd_cnt_reg, + NULL, + NULL, + }, + { + "tmmu_odma_enq_drop_cnt", + ETM_TMMU_TMMU_ODMA_ENQ_DROP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x002d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_tmmu_odma_enq_drop_cnt_reg, + NULL, + NULL, + }, + { + "tmmu_odma_imem_age_cnt", + ETM_TMMU_TMMU_ODMA_IMEM_AGE_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x002e, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_tmmu_odma_imem_age_cnt_reg, + NULL, + NULL, + }, + { + "tmmu_odma_deq_rd_cnt", + ETM_TMMU_TMMU_ODMA_DEQ_RD_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x002f, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_tmmu_odma_deq_rd_cnt_reg, + NULL, + NULL, + }, + { + "tmmu_odma_deq_drop_cnt", + ETM_TMMU_TMMU_ODMA_DEQ_DROP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0030, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_tmmu_odma_deq_drop_cnt_reg, + NULL, + NULL, + }, + { + "olif_tmmu_xoff_cnt", + ETM_TMMU_OLIF_TMMU_XOFF_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0031, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_olif_tmmu_xoff_cnt_reg, + NULL, + NULL, + }, + { + "odma_tm_data_xoff_cnt", + ETM_TMMU_ODMA_TM_DATA_XOFF_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0032, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_odma_tm_data_xoff_cnt_reg, + NULL, + NULL, + }, + { + "tm_odma_pkt_xoff_cnt", + ETM_TMMU_TM_ODMA_PKT_XOFF_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0033, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_tm_odma_pkt_xoff_cnt_reg, + NULL, + NULL, + }, + { + "tm_state_3", + ETM_TMMU_TM_STATE_3r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0034, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_tmmu_tm_state_3_reg, + NULL, + NULL, + }, + { + "cfgmt_pd_cache_cmd", + ETM_TMMU_CFGMT_PD_CACHE_CMDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0050, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_pd_cache_cmd_reg, + NULL, + NULL, + }, + { + "cfgmt_pd_cache_rd_done", + ETM_TMMU_CFGMT_PD_CACHE_RD_DONEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0051, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_pd_cache_rd_done_reg, + NULL, + NULL, + }, + { + "cfgmt_pd_cache_rd_data_0", + ETM_TMMU_CFGMT_PD_CACHE_RD_DATA_0r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0052, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_pd_cache_rd_data_0_reg, + NULL, + NULL, + }, + { + "cfgmt_pd_cache_rd_data_1", + ETM_TMMU_CFGMT_PD_CACHE_RD_DATA_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0053, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_pd_cache_rd_data_1_reg, + NULL, + NULL, + }, + { + "cfgmt_pd_cache_rd_data_2", + ETM_TMMU_CFGMT_PD_CACHE_RD_DATA_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0054, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_pd_cache_rd_data_2_reg, + NULL, + NULL, + }, + { + "cfgmt_pd_cache_rd_data_3", + ETM_TMMU_CFGMT_PD_CACHE_RD_DATA_3r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0055, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_pd_cache_rd_data_3_reg, + NULL, + NULL, + }, + { + "cfgmt_tmmu_to_odma_para", + ETM_TMMU_CFGMT_TMMU_TO_ODMA_PARAr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0056, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_tmmu_to_odma_para_reg, + NULL, + NULL, + }, + { + "cfgmt_dma_data_fifo_cnt", + ETM_TMMU_CFGMT_DMA_DATA_FIFO_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0057, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_dma_data_fifo_cnt_reg, + NULL, + NULL, + }, + { + "cfgmt_cache_tag_bit0_offset", + ETM_TMMU_CFGMT_CACHE_TAG_BIT0_OFFSETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0060, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_cache_tag_bit0_offset_reg, + NULL, + NULL, + }, + { + "cfgmt_cache_tag_bit1_offset", + ETM_TMMU_CFGMT_CACHE_TAG_BIT1_OFFSETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0061, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_cache_tag_bit1_offset_reg, + NULL, + NULL, + }, + { + "cfgmt_cache_tag_bit2_offset", + ETM_TMMU_CFGMT_CACHE_TAG_BIT2_OFFSETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0062, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_cache_tag_bit2_offset_reg, + NULL, + NULL, + }, + { + "cfgmt_cache_tag_bit3_offset", + ETM_TMMU_CFGMT_CACHE_TAG_BIT3_OFFSETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0063, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_cache_tag_bit3_offset_reg, + NULL, + NULL, + }, + { + "cfgmt_cache_tag_bit4_offset", + ETM_TMMU_CFGMT_CACHE_TAG_BIT4_OFFSETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0064, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_cache_tag_bit4_offset_reg, + NULL, + NULL, + }, + { + "cfgmt_cache_tag_bit5_offset", + ETM_TMMU_CFGMT_CACHE_TAG_BIT5_OFFSETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0065, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_cache_tag_bit5_offset_reg, + NULL, + NULL, + }, + { + "cfgmt_cache_index_bit0_offset", + ETM_TMMU_CFGMT_CACHE_INDEX_BIT0_OFFSETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0066, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_cache_index_bit0_offset_reg, + NULL, + NULL, + }, + { + "cfgmt_cache_index_bit1_offset", + ETM_TMMU_CFGMT_CACHE_INDEX_BIT1_OFFSETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0067, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_cache_index_bit1_offset_reg, + NULL, + NULL, + }, + { + "cfgmt_cache_index_bit2_offset", + ETM_TMMU_CFGMT_CACHE_INDEX_BIT2_OFFSETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0068, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_cache_index_bit2_offset_reg, + NULL, + NULL, + }, + { + "cfgmt_cache_index_bit3_offset", + ETM_TMMU_CFGMT_CACHE_INDEX_BIT3_OFFSETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0069, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_cache_index_bit3_offset_reg, + NULL, + NULL, + }, + { + "cfgmt_cache_index_bit4_offset", + ETM_TMMU_CFGMT_CACHE_INDEX_BIT4_OFFSETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x006a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_cache_index_bit4_offset_reg, + NULL, + NULL, + }, + { + "cfgmt_cache_index_bit5_offset", + ETM_TMMU_CFGMT_CACHE_INDEX_BIT5_OFFSETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x006b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_cache_index_bit5_offset_reg, + NULL, + NULL, + }, + { + "cfgmt_cache_index_bit6_offset", + ETM_TMMU_CFGMT_CACHE_INDEX_BIT6_OFFSETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x006c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_cache_index_bit6_offset_reg, + NULL, + NULL, + }, + { + "cfgmt_cache_index_bit7_offset", + ETM_TMMU_CFGMT_CACHE_INDEX_BIT7_OFFSETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x006d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_cache_index_bit7_offset_reg, + NULL, + NULL, + }, + { + "cfgmt_cache_index_bit8_offset", + ETM_TMMU_CFGMT_CACHE_INDEX_BIT8_OFFSETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x006e, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_cache_index_bit8_offset_reg, + NULL, + NULL, + }, + { + "cfgmt_cache_index_bit9_offset", + ETM_TMMU_CFGMT_CACHE_INDEX_BIT9_OFFSETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x006f, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_cache_index_bit9_offset_reg, + NULL, + NULL, + }, + { + "cfgmt_cache_index_bit10_offset", + ETM_TMMU_CFGMT_CACHE_INDEX_BIT10_OFFSETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0070, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_cache_index_bit10_offset_reg, + NULL, + NULL, + }, + { + "cfgmt_cache_index_bit11_offset", + ETM_TMMU_CFGMT_CACHE_INDEX_BIT11_OFFSETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0071, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_cache_index_bit11_offset_reg, + NULL, + NULL, + }, + { + "cfgmt_cache_index_bit12_offset", + ETM_TMMU_CFGMT_CACHE_INDEX_BIT12_OFFSETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0072, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_tmmu_cfgmt_cache_index_bit12_offset_reg, + NULL, + NULL, + }, + { + "bktfull_fifo_full_flagregister", + ETM_SHAP_BKTFULL_FIFO_FULL_FLAGREGISTERr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x26, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_shap_bktfull_fifo_full_flagregister_reg, + NULL, + NULL, + }, + { + "fifo_full_regregister", + ETM_SHAP_FIFO_FULL_REGREGISTERr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x29, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_shap_fifo_full_regregister_reg, + NULL, + NULL, + }, + { + "fifo_empty_regregister", + ETM_SHAP_FIFO_EMPTY_REGREGISTERr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_shap_fifo_empty_regregister_reg, + NULL, + NULL, + }, + { + "fifo_almost_full_regregister", + ETM_SHAP_FIFO_ALMOST_FULL_REGREGISTERr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2f, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_shap_fifo_almost_full_regregister_reg, + NULL, + NULL, + }, + { + "fifo_almost_empty_regregister", + ETM_SHAP_FIFO_ALMOST_EMPTY_REGREGISTERr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x32, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_shap_fifo_almost_empty_regregister_reg, + NULL, + NULL, + }, + { + "credit_space_select", + ETM_CRDT_CREDIT_SPACE_SELECTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x000e, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_credit_space_select_reg, + NULL, + NULL, + }, + { + "stat_space_max", + ETM_CRDT_STAT_SPACE_MAXr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x30, + (32/8), + 0, + 0x0f + 1, + 0, + 1, + 1, + g_etm_crdt_stat_space_max_reg, + NULL, + NULL, + }, + { + "stat_space_min", + ETM_CRDT_STAT_SPACE_MINr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x40, + (32/8), + 0, + 0x0f + 1, + 0, + 1, + 1, + g_etm_crdt_stat_space_min_reg, + NULL, + NULL, + }, + { + "stat_space_credit", + ETM_CRDT_STAT_SPACE_CREDITr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x50, + (32/8), + 0, + 0x0f + 1, + 0, + 1, + 1, + g_etm_crdt_stat_space_credit_reg, + NULL, + NULL, + }, + { + "stat_que_step8_credit", + ETM_CRDT_STAT_QUE_STEP8_CREDITr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x60, + (32/8), + 0, + 0x07 + 1, + 0, + 1, + 1, + g_etm_crdt_stat_que_step8_credit_reg, + NULL, + NULL, + }, + { + "special_que", + ETM_CRDT_SPECIAL_QUEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x68, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_special_que_reg, + NULL, + NULL, + }, + { + "special_que_credit", + ETM_CRDT_SPECIAL_QUE_CREDITr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x69, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_special_que_credit_reg, + NULL, + NULL, + }, + { + "lif_congest_credit_cnt", + ETM_CRDT_LIF_CONGEST_CREDIT_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x70, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_lif_congest_credit_cnt_reg, + NULL, + NULL, + }, + { + "lif_port_congest_credit_cnt", + ETM_CRDT_LIF_PORT_CONGEST_CREDIT_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x71, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_lif_port_congest_credit_cnt_reg, + NULL, + NULL, + }, + { + "crdt_congest_credit_cnt", + ETM_CRDT_CRDT_CONGEST_CREDIT_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x72, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_crdt_congest_credit_cnt_reg, + NULL, + NULL, + }, + { + "crdt_port_congest_credit_cnt", + ETM_CRDT_CRDT_PORT_CONGEST_CREDIT_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x73, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_crdt_port_congest_credit_cnt_reg, + NULL, + NULL, + }, + { + "congest_port_id", + ETM_CRDT_CONGEST_PORT_IDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x74, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_congest_port_id_reg, + NULL, + NULL, + }, + { + "dev_link_control", + ETM_CRDT_DEV_LINK_CONTROLr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x75, + (32/8), + 0, + 0x1 + 1, + 0, + 1, + 1, + g_etm_crdt_dev_link_control_reg, + NULL, + NULL, + }, + { + "crdt_sa_port_rdy", + ETM_CRDT_CRDT_SA_PORT_RDYr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x77, + (32/8), + 0, + 0x1 + 1, + 0, + 1, + 1, + g_etm_crdt_crdt_sa_port_rdy_reg, + NULL, + NULL, + }, + { + "crdt_congest_mode_select", + ETM_CRDT_CRDT_CONGEST_MODE_SELECTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x81, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_crdt_congest_mode_select_reg, + NULL, + NULL, + }, + { + "fifo_out_all_crs_normal_cnt", + ETM_CRDT_FIFO_OUT_ALL_CRS_NORMAL_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x82, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_fifo_out_all_crs_normal_cnt_reg, + NULL, + NULL, + }, + { + "fifo_out_all_crs_off_cnt", + ETM_CRDT_FIFO_OUT_ALL_CRS_OFF_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x83, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_fifo_out_all_crs_off_cnt_reg, + NULL, + NULL, + }, + { + "fifo_out_que_crs_normal_cnt", + ETM_CRDT_FIFO_OUT_QUE_CRS_NORMAL_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x84, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_fifo_out_que_crs_normal_cnt_reg, + NULL, + NULL, + }, + { + "fifo_out_que_crs_off_cnt", + ETM_CRDT_FIFO_OUT_QUE_CRS_OFF_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x85, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_fifo_out_que_crs_off_cnt_reg, + NULL, + NULL, + }, + { + "mode_add_60g", + ETM_CRDT_MODE_ADD_60Gr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x9a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_mode_add_60g_reg, + NULL, + NULL, + }, + { + "pp_token_add", + ETM_CRDT_PP_TOKEN_ADDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x9b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_pp_token_add_reg, + NULL, + NULL, + }, + { + "pp_cir_token_total_dist_cnt", + ETM_CRDT_PP_CIR_TOKEN_TOTAL_DIST_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x9c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_pp_cir_token_total_dist_cnt_reg, + NULL, + NULL, + }, + { + "pp_cir_token_total_dec_cnt", + ETM_CRDT_PP_CIR_TOKEN_TOTAL_DEC_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x9d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_pp_cir_token_total_dec_cnt_reg, + NULL, + NULL, + }, + { + "dev_credit_cnt", + ETM_CRDT_DEV_CREDIT_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xb0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_dev_credit_cnt_reg, + NULL, + NULL, + }, + { + "no_credit_cnt1", + ETM_CRDT_NO_CREDIT_CNT1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xb7, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_no_credit_cnt1_reg, + NULL, + NULL, + }, + { + "no_credit_cnt2", + ETM_CRDT_NO_CREDIT_CNT2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xb8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_no_credit_cnt2_reg, + NULL, + NULL, + }, + { + "asm_interval_0_cfg", + ETM_CRDT_ASM_INTERVAL_0_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xc7, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_asm_interval_0_cfg_reg, + NULL, + NULL, + }, + { + "asm_interval_1_cfg", + ETM_CRDT_ASM_INTERVAL_1_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xc8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_asm_interval_1_cfg_reg, + NULL, + NULL, + }, + { + "asm_interval_2_cfg", + ETM_CRDT_ASM_INTERVAL_2_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xc9, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_asm_interval_2_cfg_reg, + NULL, + NULL, + }, + { + "asm_interval_3_cfg", + ETM_CRDT_ASM_INTERVAL_3_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xca, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_asm_interval_3_cfg_reg, + NULL, + NULL, + }, + { + "asm_interval_4_cfg", + ETM_CRDT_ASM_INTERVAL_4_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xcb, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_asm_interval_4_cfg_reg, + NULL, + NULL, + }, + { + "asm_interval_5cfg", + ETM_CRDT_ASM_INTERVAL_5CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xcc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_asm_interval_5cfg_reg, + NULL, + NULL, + }, + { + "asm_interval_6_cfg", + ETM_CRDT_ASM_INTERVAL_6_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xcd, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_asm_interval_6_cfg_reg, + NULL, + NULL, + }, + { + "asm_interval_7_cfg", + ETM_CRDT_ASM_INTERVAL_7_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xce, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_asm_interval_7_cfg_reg, + NULL, + NULL, + }, + { + "crdt_total_congest_mode_cfg", + ETM_CRDT_CRDT_TOTAL_CONGEST_MODE_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xcf, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_crdt_total_congest_mode_cfg_reg, + NULL, + NULL, + }, + { + "rci_fifo_ini_deep_cfg", + ETM_CRDT_RCI_FIFO_INI_DEEP_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xd0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_rci_fifo_ini_deep_cfg_reg, + NULL, + NULL, + }, + { + "crdt_ecc", + ETM_CRDT_CRDT_ECCr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x121, + (32/8), + 0, + 0, + 0, + 0, + 5, + g_etm_crdt_crdt_ecc_reg, + NULL, + NULL, + }, + { + "ucn_asm_rdy_shield_en", + ETM_CRDT_UCN_ASM_RDY_SHIELD_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x013a, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_crdt_ucn_asm_rdy_shield_en_reg, + NULL, + NULL, + }, + { + "ucn_asm_rdy", + ETM_CRDT_UCN_ASM_RDYr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x013b, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_crdt_ucn_asm_rdy_reg, + NULL, + NULL, + }, + { + "rci_grade", + ETM_CRDT_RCI_GRADEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x013c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_rci_grade_reg, + NULL, + NULL, + }, + { + "crdt_rci_value_r", + ETM_CRDT_CRDT_RCI_VALUE_Rr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x013d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_crdt_rci_value_r_reg, + NULL, + NULL, + }, + { + "crdt_interval_now", + ETM_CRDT_CRDT_INTERVAL_NOWr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x013e, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_crdt_interval_now_reg, + NULL, + NULL, + }, + { + "crs_sheild_flow_id_cfg", + ETM_CRDT_CRS_SHEILD_FLOW_ID_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0140, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_crs_sheild_flow_id_cfg_reg, + NULL, + NULL, + }, + { + "crs_sheild_en_cfg", + ETM_CRDT_CRS_SHEILD_EN_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0141, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_crs_sheild_en_cfg_reg, + NULL, + NULL, + }, + { + "crs_sheild_value_cfg", + ETM_CRDT_CRS_SHEILD_VALUE_CFGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x0142, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_crs_sheild_value_cfg_reg, + NULL, + NULL, + }, + { + "test_token_calc_ctrl", + ETM_CRDT_TEST_TOKEN_CALC_CTRLr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x14c, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_crdt_test_token_calc_ctrl_reg, + NULL, + NULL, + }, + { + "test_token_sample_cycle_num", + ETM_CRDT_TEST_TOKEN_SAMPLE_CYCLE_NUMr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x14d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_crdt_test_token_sample_cycle_num_reg, + NULL, + NULL, + }, + { + "q_state_0_7", + ETM_CRDT_Q_STATE_0_7r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x14e, + (32/8), + 0, + 0, + 0, + 0, + 8, + g_etm_crdt_q_state_0_7_reg, + NULL, + NULL, + }, + { + "q_state_8_15", + ETM_CRDT_Q_STATE_8_15r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x14f, + (32/8), + 0, + 0, + 0, + 0, + 8, + g_etm_crdt_q_state_8_15_reg, + NULL, + NULL, + }, + { + "csw_csch_rd_cmd_cnt", + ETM_QMU_CSW_CSCH_RD_CMD_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x14, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_csw_csch_rd_cmd_cnt_reg, + NULL, + NULL, + }, + { + "csw_csch_rd_sop_cnt", + ETM_QMU_CSW_CSCH_RD_SOP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x15, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_csw_csch_rd_sop_cnt_reg, + NULL, + NULL, + }, + { + "csw_csch_rd_eop_cnt", + ETM_QMU_CSW_CSCH_RD_EOP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x16, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_csw_csch_rd_eop_cnt_reg, + NULL, + NULL, + }, + { + "csw_csch_rd_drop_cnt", + ETM_QMU_CSW_CSCH_RD_DROP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x17, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_csw_csch_rd_drop_cnt_reg, + NULL, + NULL, + }, + { + "csch_mmu_rd_cmd_cnt", + ETM_QMU_CSCH_MMU_RD_CMD_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x18, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_csch_mmu_rd_cmd_cnt_reg, + NULL, + NULL, + }, + { + "csch_mmu_rd_sop_cnt", + ETM_QMU_CSCH_MMU_RD_SOP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x19, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_csch_mmu_rd_sop_cnt_reg, + NULL, + NULL, + }, + { + "csch_mmu_rd_eop_cnt", + ETM_QMU_CSCH_MMU_RD_EOP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_csch_mmu_rd_eop_cnt_reg, + NULL, + NULL, + }, + { + "csch_mmu_rd_drop_cnt", + ETM_QMU_CSCH_MMU_RD_DROP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_csch_mmu_rd_drop_cnt_reg, + NULL, + NULL, + }, + { + "qcfg_qsch_crs_filter", + ETM_QMU_QCFG_QSCH_CRS_FILTERr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qcfg_qsch_crs_filter_reg, + NULL, + NULL, + }, + { + "qcfg_qsch_crs_force_en", + ETM_QMU_QCFG_QSCH_CRS_FORCE_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qcfg_qsch_crs_force_en_reg, + NULL, + NULL, + }, + { + "qcfg_qsch_crs_force_qnum", + ETM_QMU_QCFG_QSCH_CRS_FORCE_QNUMr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1e, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qcfg_qsch_crs_force_qnum_reg, + NULL, + NULL, + }, + { + "qcfg_qsch_crs_force_crs", + ETM_QMU_QCFG_QSCH_CRS_FORCE_CRSr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x1f, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qcfg_qsch_crs_force_crs_reg, + NULL, + NULL, + }, + { + "cfgmt_oshp_sgmii_shap_mode", + ETM_QMU_CFGMT_OSHP_SGMII_SHAP_MODEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_oshp_sgmii_shap_mode_reg, + NULL, + NULL, + }, + { + "cfgmt_qmu_sashap_en", + ETM_QMU_CFGMT_QMU_SASHAP_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x21, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_qmu_sashap_en_reg, + NULL, + NULL, + }, + { + "cfgmt_sashap_token_max", + ETM_QMU_CFGMT_SASHAP_TOKEN_MAXr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x39, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_sashap_token_max_reg, + NULL, + NULL, + }, + { + "cfgmt_sashap_token_min", + ETM_QMU_CFGMT_SASHAP_TOKEN_MINr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x3a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfgmt_sashap_token_min_reg, + NULL, + NULL, + }, + { + "cfg_qsch_q3lbaddrate", + ETM_QMU_CFG_QSCH_Q3LBADDRATEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x3f, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_q3lbaddrate_reg, + NULL, + NULL, + }, + { + "cfg_qsch_q012lbaddrate", + ETM_QMU_CFG_QSCH_Q012LBADDRATEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x40, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_q012lbaddrate_reg, + NULL, + NULL, + }, + { + "cfg_qsch_q3creditlbmaxcnt", + ETM_QMU_CFG_QSCH_Q3CREDITLBMAXCNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x41, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_q3creditlbmaxcnt_reg, + NULL, + NULL, + }, + { + "cfg_qsch_q012creditlbmaxcnt", + ETM_QMU_CFG_QSCH_Q012CREDITLBMAXCNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x42, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_q012creditlbmaxcnt_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mul_token_gen_num", + ETM_QMU_CFG_QSCH_MUL_TOKEN_GEN_NUMr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x43, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mul_token_gen_num_reg, + NULL, + NULL, + }, + { + "cfg_qsch_q3_credit_lb_control_en", + ETM_QMU_CFG_QSCH_Q3_CREDIT_LB_CONTROL_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x44, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_q3_credit_lb_control_en_reg, + NULL, + NULL, + }, + { + "cfg_qsch_q012_credit_lb_control_en", + ETM_QMU_CFG_QSCH_Q012_CREDIT_LB_CONTROL_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x45, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_q012_credit_lb_control_en_reg, + NULL, + NULL, + }, + { + "cfg_qsch_sp_dwrr_en", + ETM_QMU_CFG_QSCH_SP_DWRR_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x46, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_sp_dwrr_en_reg, + NULL, + NULL, + }, + { + "cfg_qsch_q01_attach_en", + ETM_QMU_CFG_QSCH_Q01_ATTACH_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x47, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_q01_attach_en_reg, + NULL, + NULL, + }, + { + "cfg_qsch_w0", + ETM_QMU_CFG_QSCH_W0r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x48, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_w0_reg, + NULL, + NULL, + }, + { + "cfg_qsch_w1", + ETM_QMU_CFG_QSCH_W1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x49, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_w1_reg, + NULL, + NULL, + }, + { + "cfg_qsch_w2", + ETM_QMU_CFG_QSCH_W2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x4a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_w2_reg, + NULL, + NULL, + }, + { + "cfg_qsch_lkybktmaxcnt1", + ETM_QMU_CFG_QSCH_LKYBKTMAXCNT1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x4b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_lkybktmaxcnt1_reg, + NULL, + NULL, + }, + { + "cfg_qsch_lkybktmaxcnt2", + ETM_QMU_CFG_QSCH_LKYBKTMAXCNT2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x4c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_lkybktmaxcnt2_reg, + NULL, + NULL, + }, + { + "cfg_qsch_lkybktdcrrate1", + ETM_QMU_CFG_QSCH_LKYBKTDCRRATE1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x4d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_lkybktdcrrate1_reg, + NULL, + NULL, + }, + { + "cfg_qsch_lkybktdcrrate2", + ETM_QMU_CFG_QSCH_LKYBKTDCRRATE2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x4e, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_lkybktdcrrate2_reg, + NULL, + NULL, + }, + { + "cfg_qsch_lkybktdcrrate3", + ETM_QMU_CFG_QSCH_LKYBKTDCRRATE3r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x4f, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_lkybktdcrrate3_reg, + NULL, + NULL, + }, + { + "cfg_qsch_lkybktmaxcnt3", + ETM_QMU_CFG_QSCH_LKYBKTMAXCNT3r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x50, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_lkybktmaxcnt3_reg, + NULL, + NULL, + }, + { + "cfg_qsch_qmu_mul_auto_sa_version", + ETM_QMU_CFG_QSCH_QMU_MUL_AUTO_SA_VERSIONr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x55, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_qmu_mul_auto_sa_version_reg, + NULL, + NULL, + }, + { + "cfg_qsch_sa_credit_value_0", + ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_0r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x56, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_sa_credit_value_0_reg, + NULL, + NULL, + }, + { + "cfg_qsch_sa_credit_value_1", + ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x57, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_sa_credit_value_1_reg, + NULL, + NULL, + }, + { + "cfg_qsch_sa_credit_value_2", + ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x58, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_sa_credit_value_2_reg, + NULL, + NULL, + }, + { + "cfg_qsch_sa_credit_value_3", + ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_3r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x59, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_sa_credit_value_3_reg, + NULL, + NULL, + }, + { + "cfg_qsch_sa_credit_value_4", + ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_4r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x5a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_sa_credit_value_4_reg, + NULL, + NULL, + }, + { + "cfg_qsch_sa_credit_value_5", + ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_5r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x5b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_sa_credit_value_5_reg, + NULL, + NULL, + }, + { + "cfg_qsch_sa_credit_value_6", + ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_6r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x5c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_sa_credit_value_6_reg, + NULL, + NULL, + }, + { + "cfg_qsch_sa_credit_value_7", + ETM_QMU_CFG_QSCH_SA_CREDIT_VALUE_7r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x5d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_sa_credit_value_7_reg, + NULL, + NULL, + }, + { + "cfg_qsch_remote_credit_fifo_almost_full_th", + ETM_QMU_CFG_QSCH_REMOTE_CREDIT_FIFO_ALMOST_FULL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x76, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_remote_credit_fifo_almost_full_th_reg, + NULL, + NULL, + }, + { + "cfg_qsch_auto_credit_fifo_almost_full_th", + ETM_QMU_CFG_QSCH_AUTO_CREDIT_FIFO_ALMOST_FULL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x77, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_auto_credit_fifo_almost_full_th_reg, + NULL, + NULL, + }, + { + "cfg_qsch_q3_credit_fifo_almost_full_th", + ETM_QMU_CFG_QSCH_Q3_CREDIT_FIFO_ALMOST_FULL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x78, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_q3_credit_fifo_almost_full_th_reg, + NULL, + NULL, + }, + { + "cfg_qsch_q012_credit_fifo_almost_full_th", + ETM_QMU_CFG_QSCH_Q012_CREDIT_FIFO_ALMOST_FULL_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x79, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_q012_credit_fifo_almost_full_th_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mul_fc_res_en", + ETM_QMU_CFG_QSCH_MUL_FC_RES_ENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x7a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mul_fc_res_en_reg, + NULL, + NULL, + }, + { + "cfgmt_mul_ovf_udf_flg_query", + ETM_QMU_CFGMT_MUL_OVF_UDF_FLG_QUERYr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x7d, + (32/8), + 0, + 0, + 0, + 0, + 19, + g_etm_qmu_cfgmt_mul_ovf_udf_flg_query_reg, + NULL, + NULL, + }, + { + "cfgmt_mul_cng_flg_query", + ETM_QMU_CFGMT_MUL_CNG_FLG_QUERYr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x7e, + (32/8), + 0, + 0, + 0, + 0, + 5, + g_etm_qmu_cfgmt_mul_cng_flg_query_reg, + NULL, + NULL, + }, + { + "qsch_cfg_lkybktval1", + ETM_QMU_QSCH_CFG_LKYBKTVAL1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x7f, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qsch_cfg_lkybktval1_reg, + NULL, + NULL, + }, + { + "qsch_cfg_lkybktval2", + ETM_QMU_QSCH_CFG_LKYBKTVAL2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x80, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qsch_cfg_lkybktval2_reg, + NULL, + NULL, + }, + { + "qsch_cfg_lkybktval3", + ETM_QMU_QSCH_CFG_LKYBKTVAL3r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x81, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qsch_cfg_lkybktval3_reg, + NULL, + NULL, + }, + { + "qsch_cfg_q3lbval", + ETM_QMU_QSCH_CFG_Q3LBVALr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x82, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qsch_cfg_q3lbval_reg, + NULL, + NULL, + }, + { + "qsch_cfg_q012lbval", + ETM_QMU_QSCH_CFG_Q012LBVALr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x83, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qsch_cfg_q012lbval_reg, + NULL, + NULL, + }, + { + "qlist_cfgmt_ram_ecc_err2", + ETM_QMU_QLIST_CFGMT_RAM_ECC_ERR2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2014, + (32/8), + 0, + 0, + 0, + 0, + 16, + g_etm_qmu_qlist_cfgmt_ram_ecc_err2_reg, + NULL, + NULL, + }, + { + "csch_aged_cmd_cnt", + ETM_QMU_CSCH_AGED_CMD_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2838, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_csch_aged_cmd_cnt_reg, + NULL, + NULL, + }, + { + "csch_qcfg_csch_congest_cnt", + ETM_QMU_CSCH_QCFG_CSCH_CONGEST_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2839, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_csch_qcfg_csch_congest_cnt_reg, + NULL, + NULL, + }, + { + "csch_qcfg_qlist_csch_sop_cnt", + ETM_QMU_CSCH_QCFG_QLIST_CSCH_SOP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x283a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_csch_qcfg_qlist_csch_sop_cnt_reg, + NULL, + NULL, + }, + { + "csch_qcfg_qlist_csch_eop_cnt", + ETM_QMU_CSCH_QCFG_QLIST_CSCH_EOP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x283b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_csch_qcfg_qlist_csch_eop_cnt_reg, + NULL, + NULL, + }, + { + "csch_qcfg_csch_csw_sop_cnt", + ETM_QMU_CSCH_QCFG_CSCH_CSW_SOP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x283c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_csch_qcfg_csch_csw_sop_cnt_reg, + NULL, + NULL, + }, + { + "csch_qcfg_csch_csw_eop_cnt", + ETM_QMU_CSCH_QCFG_CSCH_CSW_EOP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x283d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_csch_qcfg_csch_csw_eop_cnt_reg, + NULL, + NULL, + }, + { + "csch_qcfg_qlist_csch_drop_cnt", + ETM_QMU_CSCH_QCFG_QLIST_CSCH_DROP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x283e, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_csch_qcfg_qlist_csch_drop_cnt_reg, + NULL, + NULL, + }, + { + "csch_qcfg_csch_csw_drop_cnt", + ETM_QMU_CSCH_QCFG_CSCH_CSW_DROP_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x283f, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_csch_qcfg_csch_csw_drop_cnt_reg, + NULL, + NULL, + }, + { + "csw_mmu_sop_cmd_cnt", + ETM_QMU_CSW_MMU_SOP_CMD_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2840, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_csw_mmu_sop_cmd_cnt_reg, + NULL, + NULL, + }, + { + "mmu_csw_sop_data_cnt", + ETM_QMU_MMU_CSW_SOP_DATA_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2841, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_mmu_csw_sop_data_cnt_reg, + NULL, + NULL, + }, + { + "csw_qsch_feedb_cnt", + ETM_QMU_CSW_QSCH_FEEDB_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2842, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_csw_qsch_feedb_cnt_reg, + NULL, + NULL, + }, + { + "qmu_crdt_port_fc_cnt", + ETM_QMU_QMU_CRDT_PORT_FC_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2843, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qmu_crdt_port_fc_cnt_reg, + NULL, + NULL, + }, + { + "csch_r_block_cnt", + ETM_QMU_CSCH_R_BLOCK_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x3400, + (32/8), + 0, + 0x1ff + 1, + 0, + 1, + 1, + g_etm_qmu_csch_r_block_cnt_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_qds_head_rd", + ETM_QMU_QCFG_QLIST_QDS_HEAD_RDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x10000, + (32/8), + 0, + 0x23ff + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qlist_qds_head_rd_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_qds_tail_rd", + ETM_QMU_QCFG_QLIST_QDS_TAIL_RDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x20000, + (32/8), + 0, + 0x23ff + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qlist_qds_tail_rd_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_ept_rd", + ETM_QMU_QCFG_QLIST_EPT_RDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x30000, + (32/8), + 0, + 0x23ff + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qlist_ept_rd_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_age_flag_rd", + ETM_QMU_QCFG_QLIST_AGE_FLAG_RDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x38000, + (32/8), + 0, + 0x23ff + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qlist_age_flag_rd_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_cti_rd", + ETM_QMU_QCFG_QLIST_CTI_RDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x40000, + (32/8), + 0, + 0x23ff + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qlist_cti_rd_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_cto_rd", + ETM_QMU_QCFG_QLIST_CTO_RDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x50000, + (32/8), + 0, + 0x23ff + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qlist_cto_rd_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_chk_rd", + ETM_QMU_QCFG_QLIST_CHK_RDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x100000, + (32/8), + 0, + 0x7fff + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qlist_chk_rd_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_nod_rd", + ETM_QMU_QCFG_QLIST_NOD_RDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x140000, + (32/8), + 0, + 0x7fff + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qlist_nod_rd_reg, + NULL, + NULL, + }, + { + "qcfg_qlist_biu_rd", + ETM_QMU_QCFG_QLIST_BIU_RDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x180000, + (32/8), + 0, + 0x7fff + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_qlist_biu_rd_reg, + NULL, + NULL, + }, + { + "qsch_r_wlist_flag", + ETM_QMU_QSCH_R_WLIST_FLAGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x90000, + (32/8), + 0, + 0x23ff + 1, + 0, + 1, + 1, + g_etm_qmu_qsch_r_wlist_flag_reg, + NULL, + NULL, + }, + { + "qcfg_crs_flg_rd", + ETM_QMU_QCFG_CRS_FLG_RDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0xd0000, + (32/8), + 0, + 0x23ff + 1, + 0, + 1, + 1, + g_etm_qmu_qcfg_crs_flg_rd_reg, + NULL, + NULL, + }, + { + "cfgmt_qmu_imem_age_qds", + ETM_QMU_CFGMT_QMU_IMEM_AGE_QDSr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xe0d, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_qmu_cfgmt_qmu_imem_age_qds_reg, + NULL, + NULL, + }, + { + "cfgmt_qmu_imem_age_qlen", + ETM_QMU_CFGMT_QMU_IMEM_AGE_QLENr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0xe0e, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_qmu_cfgmt_qmu_imem_age_qlen_reg, + NULL, + NULL, + }, + { + "cfgmt_qmu_imem_pd_ram_low", + ETM_QMU_CFGMT_QMU_IMEM_PD_RAM_LOWr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x1c0000, + (32/8), + 0, + 0x3fff + 1, + 0, + 1, + 1, + g_etm_qmu_cfgmt_qmu_imem_pd_ram_low_reg, + NULL, + NULL, + }, + { + "cfgmt_qmu_imem_pd_ram_high", + ETM_QMU_CFGMT_QMU_IMEM_PD_RAM_HIGHr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x1c4000, + (32/8), + 0, + 0x3fff + 1, + 0, + 1, + 1, + g_etm_qmu_cfgmt_qmu_imem_pd_ram_high_reg, + NULL, + NULL, + }, + { + "cfgmt_qmu_imem_up_ptr", + ETM_QMU_CFGMT_QMU_IMEM_UP_PTRr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x200000, + (32/8), + 0, + 0x3fff + 1, + 0, + 1, + 1, + g_etm_qmu_cfgmt_qmu_imem_up_ptr_reg, + NULL, + NULL, + }, + { + "cfgmt_qmu_imem_down_ptr", + ETM_QMU_CFGMT_QMU_IMEM_DOWN_PTRr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x240000, + (32/8), + 0, + 0x3fff + 1, + 0, + 1, + 1, + g_etm_qmu_cfgmt_qmu_imem_down_ptr_reg, + NULL, + NULL, + }, + { + "cfgmt_qmu_imem_age_flag", + ETM_QMU_CFGMT_QMU_IMEM_AGE_FLAGr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x280000, + (32/8), + 0, + 0x7ffff + 1, + 0, + 1, + 1, + g_etm_qmu_cfgmt_qmu_imem_age_flag_reg, + NULL, + NULL, + }, + { + "cfg_qsch_lkybkt2cngth", + ETM_QMU_CFG_QSCH_LKYBKT2CNGTHr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x2040, + (32/8), + 0, + 7 + 1, + 0, + 1, + 1, + g_etm_qmu_cfg_qsch_lkybkt2cngth_reg, + NULL, + NULL, + }, + { + "cfg_qsch_lkybkt1cngth", + ETM_QMU_CFG_QSCH_LKYBKT1CNGTHr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x2030, + (32/8), + 0, + 7 + 1, + 0, + 1, + 1, + g_etm_qmu_cfg_qsch_lkybkt1cngth_reg, + NULL, + NULL, + }, + { + "cfg_qsch_lkybkt3cngth", + ETM_QMU_CFG_QSCH_LKYBKT3CNGTHr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x2050, + (32/8), + 0, + 7 + 1, + 0, + 1, + 1, + g_etm_qmu_cfg_qsch_lkybkt3cngth_reg, + NULL, + NULL, + }, + { + "cfg_qsch_rm_mul_mcn1_credit_value", + ETM_QMU_CFG_QSCH_RM_MUL_MCN1_CREDIT_VALUEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x2060, + (32/8), + 0, + 7 + 1, + 0, + 1, + 1, + g_etm_qmu_cfg_qsch_rm_mul_mcn1_credit_value_reg, + NULL, + NULL, + }, + { + "cfg_qsch_rm_mul_mcn2_credit_value", + ETM_QMU_CFG_QSCH_RM_MUL_MCN2_CREDIT_VALUEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x2070, + (32/8), + 0, + 7 + 1, + 0, + 1, + 1, + g_etm_qmu_cfg_qsch_rm_mul_mcn2_credit_value_reg, + NULL, + NULL, + }, + { + "cfg_qsch_rm_mul_mcn3_credit_value", + ETM_QMU_CFG_QSCH_RM_MUL_MCN3_CREDIT_VALUEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x2080, + (32/8), + 0, + 7 + 1, + 0, + 1, + 1, + g_etm_qmu_cfg_qsch_rm_mul_mcn3_credit_value_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn1_rand_ansr_seed", + ETM_QMU_RM_MUL_MCN1_RAND_ANSR_SEEDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2090, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_qmu_rm_mul_mcn1_rand_ansr_seed_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn2_rand_ansr_seed", + ETM_QMU_RM_MUL_MCN2_RAND_ANSR_SEEDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2091, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_qmu_rm_mul_mcn2_rand_ansr_seed_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn3_rand_ansr_seed", + ETM_QMU_RM_MUL_MCN3_RAND_ANSR_SEEDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2092, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_qmu_rm_mul_mcn3_rand_ansr_seed_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn1_rand_ansr_th", + ETM_QMU_RM_MUL_MCN1_RAND_ANSR_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2093, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn1_rand_ansr_th_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn2_rand_ansr_th", + ETM_QMU_RM_MUL_MCN2_RAND_ANSR_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2094, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn2_rand_ansr_th_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn3_rand_ansr_th", + ETM_QMU_RM_MUL_MCN3_RAND_ANSR_THr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2095, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn3_rand_ansr_th_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn1_rand_hold_base", + ETM_QMU_RM_MUL_MCN1_RAND_HOLD_BASEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2096, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_qmu_rm_mul_mcn1_rand_hold_base_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn2_rand_hold_base", + ETM_QMU_RM_MUL_MCN2_RAND_HOLD_BASEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2097, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_qmu_rm_mul_mcn2_rand_hold_base_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn3_rand_hold_base", + ETM_QMU_RM_MUL_MCN3_RAND_HOLD_BASEr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2098, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_qmu_rm_mul_mcn3_rand_hold_base_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn1_rand_sel_mask", + ETM_QMU_RM_MUL_MCN1_RAND_SEL_MASKr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2099, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn1_rand_sel_mask_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn2_rand_sel_mask", + ETM_QMU_RM_MUL_MCN2_RAND_SEL_MASKr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x209a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn2_rand_sel_mask_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn3_rand_sel_mask", + ETM_QMU_RM_MUL_MCN3_RAND_SEL_MASKr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x209b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn3_rand_sel_mask_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn1_rand_sel_seed_reg0", + ETM_QMU_RM_MUL_MCN1_RAND_SEL_SEED_REG0r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x209c, + (32/8), + 0, + 0, + 0, + 0, + 8, + g_etm_qmu_rm_mul_mcn1_rand_sel_seed_reg0_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn1_rand_sel_seed_reg1", + ETM_QMU_RM_MUL_MCN1_RAND_SEL_SEED_REG1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x209d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn1_rand_sel_seed_reg1_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn2_rand_sel_seed_reg0", + ETM_QMU_RM_MUL_MCN2_RAND_SEL_SEED_REG0r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x209e, + (32/8), + 0, + 0, + 0, + 0, + 8, + g_etm_qmu_rm_mul_mcn2_rand_sel_seed_reg0_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn2_rand_sel_seed_reg1", + ETM_QMU_RM_MUL_MCN2_RAND_SEL_SEED_REG1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x209f, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn2_rand_sel_seed_reg1_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn3_rand_sel_seed_reg0", + ETM_QMU_RM_MUL_MCN3_RAND_SEL_SEED_REG0r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20a0, + (32/8), + 0, + 0, + 0, + 0, + 8, + g_etm_qmu_rm_mul_mcn3_rand_sel_seed_reg0_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn3_rand_sel_seed_reg1", + ETM_QMU_RM_MUL_MCN3_RAND_SEL_SEED_REG1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20a1, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn3_rand_sel_seed_reg1_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn1_step_wait_th1", + ETM_QMU_RM_MUL_MCN1_STEP_WAIT_TH1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20a2, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn1_step_wait_th1_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn1_step_wait_th2", + ETM_QMU_RM_MUL_MCN1_STEP_WAIT_TH2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20a3, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn1_step_wait_th2_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn1_step_wait_th3", + ETM_QMU_RM_MUL_MCN1_STEP_WAIT_TH3r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn1_step_wait_th3_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn1_step_wait_th4", + ETM_QMU_RM_MUL_MCN1_STEP_WAIT_TH4r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20a5, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn1_step_wait_th4_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn1_step_wait_th5", + ETM_QMU_RM_MUL_MCN1_STEP_WAIT_TH5r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20a6, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn1_step_wait_th5_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn1_step_wait_th6", + ETM_QMU_RM_MUL_MCN1_STEP_WAIT_TH6r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20a7, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn1_step_wait_th6_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn1_step_wait_th7", + ETM_QMU_RM_MUL_MCN1_STEP_WAIT_TH7r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn1_step_wait_th7_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn2_step_wait_th1", + ETM_QMU_RM_MUL_MCN2_STEP_WAIT_TH1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20a9, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn2_step_wait_th1_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn2_step_wait_th2", + ETM_QMU_RM_MUL_MCN2_STEP_WAIT_TH2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20aa, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn2_step_wait_th2_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn2_step_wait_th3", + ETM_QMU_RM_MUL_MCN2_STEP_WAIT_TH3r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20ab, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn2_step_wait_th3_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn2_step_wait_th4", + ETM_QMU_RM_MUL_MCN2_STEP_WAIT_TH4r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn2_step_wait_th4_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn2_step_wait_th5", + ETM_QMU_RM_MUL_MCN2_STEP_WAIT_TH5r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20ad, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn2_step_wait_th5_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn2_step_wait_th6", + ETM_QMU_RM_MUL_MCN2_STEP_WAIT_TH6r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20ae, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn2_step_wait_th6_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn2_step_wait_th7", + ETM_QMU_RM_MUL_MCN2_STEP_WAIT_TH7r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20af, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn2_step_wait_th7_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn3_step_wait_th1", + ETM_QMU_RM_MUL_MCN3_STEP_WAIT_TH1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn3_step_wait_th1_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn3_step_wait_th2", + ETM_QMU_RM_MUL_MCN3_STEP_WAIT_TH2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20b1, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn3_step_wait_th2_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn3_step_wait_th3", + ETM_QMU_RM_MUL_MCN3_STEP_WAIT_TH3r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20b2, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn3_step_wait_th3_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn3_step_wait_th4", + ETM_QMU_RM_MUL_MCN3_STEP_WAIT_TH4r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20b3, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn3_step_wait_th4_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn3_step_wait_th5", + ETM_QMU_RM_MUL_MCN3_STEP_WAIT_TH5r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn3_step_wait_th5_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn3_step_wait_th6", + ETM_QMU_RM_MUL_MCN3_STEP_WAIT_TH6r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20b5, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn3_step_wait_th6_reg, + NULL, + NULL, + }, + { + "rm_mul_mcn3step_wait_th7", + ETM_QMU_RM_MUL_MCN3STEP_WAIT_TH7r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20b6, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_rm_mul_mcn3step_wait_th7_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate0", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE0r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20b7, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate0_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate1", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE1r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate1_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate2", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE2r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20b9, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate2_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate3", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE3r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20ba, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate3_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate4", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE4r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20bb, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate4_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate5", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE5r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20bc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate5_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate6", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE6r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20bd, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate6_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate7", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE7r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20be, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate7_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate8", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE8r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20bf, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate8_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate9", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE9r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate9_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate10", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE10r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20c1, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate10_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate11", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE11r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20c2, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate11_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate12", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE12r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20c3, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate12_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate13", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE13r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate13_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate14", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE14r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20c5, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate14_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate15", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE15r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20c6, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate15_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate16", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE16r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20c7, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate16_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate17", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE17r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate17_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate18", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE18r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20c9, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate18_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate19", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE19r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20ca, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate19_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate20", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE20r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20cb, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate20_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate21", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE21r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate21_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate22", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE22r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20cd, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate22_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate23", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE23r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20ce, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate23_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate24", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE24r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20cf, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate24_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate25", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE25r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate25_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate26", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE26r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20d1, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate26_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate27", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE27r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20d2, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate27_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate28", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE28r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20d3, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate28_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate29", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE29r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate29_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate30", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE30r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20d5, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate30_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate31", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE31r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20d6, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate31_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate32", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE32r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20d7, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate32_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate33", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE33r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate33_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate34", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE34r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20d9, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate34_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate35", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE35r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20da, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate35_reg, + NULL, + NULL, + }, + { + "cfg_qsch_mulcrdcntrate36", + ETM_QMU_CFG_QSCH_MULCRDCNTRATE36r, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20db, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_mulcrdcntrate36_reg, + NULL, + NULL, + }, + { + "cfg_qsch_rm_mul_mcn1_rand_hold_shift", + ETM_QMU_CFG_QSCH_RM_MUL_MCN1_RAND_HOLD_SHIFTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_rm_mul_mcn1_rand_hold_shift_reg, + NULL, + NULL, + }, + { + "cfg_qsch_rm_mul_mcn2_rand_hold_shift", + ETM_QMU_CFG_QSCH_RM_MUL_MCN2_RAND_HOLD_SHIFTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20dd, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_rm_mul_mcn2_rand_hold_shift_reg, + NULL, + NULL, + }, + { + "cfg_qsch_rm_mul_mcn3_rand_hold_shift", + ETM_QMU_CFG_QSCH_RM_MUL_MCN3_RAND_HOLD_SHIFTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x20de, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_cfg_qsch_rm_mul_mcn3_rand_hold_shift_reg, + NULL, + NULL, + }, + { + "last_drop_qnum_get", + ETM_QMU_LAST_DROP_QNUM_GETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2806, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_etm_qmu_last_drop_qnum_get_reg, + NULL, + NULL, + }, + { + "crdt_qmu_credit_cnt", + ETM_QMU_CRDT_QMU_CREDIT_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2807, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_crdt_qmu_credit_cnt_reg, + NULL, + NULL, + }, + { + "qmu_to_qsch_report_cnt", + ETM_QMU_QMU_TO_QSCH_REPORT_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2808, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qmu_to_qsch_report_cnt_reg, + NULL, + NULL, + }, + { + "qmu_to_cgavd_report_cnt", + ETM_QMU_QMU_TO_CGAVD_REPORT_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2809, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qmu_to_cgavd_report_cnt_reg, + NULL, + NULL, + }, + { + "qmu_crdt_crs_normal_cnt", + ETM_QMU_QMU_CRDT_CRS_NORMAL_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x280a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qmu_crdt_crs_normal_cnt_reg, + NULL, + NULL, + }, + { + "qmu_crdt_crs_off_cnt", + ETM_QMU_QMU_CRDT_CRS_OFF_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x280b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qmu_crdt_crs_off_cnt_reg, + NULL, + NULL, + }, + { + "qsch_qlist_shedule_cnt", + ETM_QMU_QSCH_QLIST_SHEDULE_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x280c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qsch_qlist_shedule_cnt_reg, + NULL, + NULL, + }, + { + "qsch_qlist_sch_ept_cnt", + ETM_QMU_QSCH_QLIST_SCH_EPT_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x280d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qsch_qlist_sch_ept_cnt_reg, + NULL, + NULL, + }, + { + "qmu_to_mmu_blk_wr_cnt", + ETM_QMU_QMU_TO_MMU_BLK_WR_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x280e, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qmu_to_mmu_blk_wr_cnt_reg, + NULL, + NULL, + }, + { + "qmu_to_csw_blk_rd_cnt", + ETM_QMU_QMU_TO_CSW_BLK_RD_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x280f, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qmu_to_csw_blk_rd_cnt_reg, + NULL, + NULL, + }, + { + "qmu_to_mmu_sop_wr_cnt", + ETM_QMU_QMU_TO_MMU_SOP_WR_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2810, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qmu_to_mmu_sop_wr_cnt_reg, + NULL, + NULL, + }, + { + "qmu_to_mmu_eop_wr_cnt", + ETM_QMU_QMU_TO_MMU_EOP_WR_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2811, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qmu_to_mmu_eop_wr_cnt_reg, + NULL, + NULL, + }, + { + "qmu_to_mmu_drop_wr_cnt", + ETM_QMU_QMU_TO_MMU_DROP_WR_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2812, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qmu_to_mmu_drop_wr_cnt_reg, + NULL, + NULL, + }, + { + "qmu_to_csw_sop_rd_cnt", + ETM_QMU_QMU_TO_CSW_SOP_RD_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2813, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qmu_to_csw_sop_rd_cnt_reg, + NULL, + NULL, + }, + { + "qmu_to_csw_eop_rd_cnt", + ETM_QMU_QMU_TO_CSW_EOP_RD_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2814, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qmu_to_csw_eop_rd_cnt_reg, + NULL, + NULL, + }, + { + "qmu_to_csw_drop_rd_cnt", + ETM_QMU_QMU_TO_CSW_DROP_RD_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2815, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_qmu_to_csw_drop_rd_cnt_reg, + NULL, + NULL, + }, + { + "mmu_to_qmu_wr_release_cnt", + ETM_QMU_MMU_TO_QMU_WR_RELEASE_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2816, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_mmu_to_qmu_wr_release_cnt_reg, + NULL, + NULL, + }, + { + "mmu_to_qmu_rd_release_cnt", + ETM_QMU_MMU_TO_QMU_RD_RELEASE_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2817, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_mmu_to_qmu_rd_release_cnt_reg, + NULL, + NULL, + }, + { + "observe_qnum_set", + ETM_QMU_OBSERVE_QNUM_SETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2820, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_observe_qnum_set_reg, + NULL, + NULL, + }, + { + "spec_q_pkt_received", + ETM_QMU_SPEC_Q_PKT_RECEIVEDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2821, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_q_pkt_received_reg, + NULL, + NULL, + }, + { + "spec_q_pkt_dropped", + ETM_QMU_SPEC_Q_PKT_DROPPEDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2822, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_q_pkt_dropped_reg, + NULL, + NULL, + }, + { + "spec_q_pkt_scheduled", + ETM_QMU_SPEC_Q_PKT_SCHEDULEDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2823, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_q_pkt_scheduled_reg, + NULL, + NULL, + }, + { + "spec_q_wr_cmd_sent", + ETM_QMU_SPEC_Q_WR_CMD_SENTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2824, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_q_wr_cmd_sent_reg, + NULL, + NULL, + }, + { + "spec_q_rd_cmd_sent", + ETM_QMU_SPEC_Q_RD_CMD_SENTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2825, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_q_rd_cmd_sent_reg, + NULL, + NULL, + }, + { + "spec_q_pkt_enq", + ETM_QMU_SPEC_Q_PKT_ENQr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2826, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_q_pkt_enq_reg, + NULL, + NULL, + }, + { + "spec_q_pkt_deq", + ETM_QMU_SPEC_Q_PKT_DEQr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2827, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_q_pkt_deq_reg, + NULL, + NULL, + }, + { + "spec_q_crdt_uncon_received", + ETM_QMU_SPEC_Q_CRDT_UNCON_RECEIVEDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2828, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_q_crdt_uncon_received_reg, + NULL, + NULL, + }, + { + "spec_q_crdt_cong_received", + ETM_QMU_SPEC_Q_CRDT_CONG_RECEIVEDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2829, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_q_crdt_cong_received_reg, + NULL, + NULL, + }, + { + "spec_q_crs_normal_cnt", + ETM_QMU_SPEC_Q_CRS_NORMAL_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x282a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_q_crs_normal_cnt_reg, + NULL, + NULL, + }, + { + "spec_q_crs_off_cnt", + ETM_QMU_SPEC_Q_CRS_OFF_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x282b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_q_crs_off_cnt_reg, + NULL, + NULL, + }, + { + "observe_batch_set", + ETM_QMU_OBSERVE_BATCH_SETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x282c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_observe_batch_set_reg, + NULL, + NULL, + }, + { + "spec_bat_pkt_received", + ETM_QMU_SPEC_BAT_PKT_RECEIVEDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x282d, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_bat_pkt_received_reg, + NULL, + NULL, + }, + { + "spec_bat_pkt_dropped", + ETM_QMU_SPEC_BAT_PKT_DROPPEDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x282e, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_bat_pkt_dropped_reg, + NULL, + NULL, + }, + { + "spec_bat_blk_scheduled", + ETM_QMU_SPEC_BAT_BLK_SCHEDULEDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x282f, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_bat_blk_scheduled_reg, + NULL, + NULL, + }, + { + "spec_bat_wr_cmd_sent", + ETM_QMU_SPEC_BAT_WR_CMD_SENTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2830, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_bat_wr_cmd_sent_reg, + NULL, + NULL, + }, + { + "spec_bat_rd_cmd_sent", + ETM_QMU_SPEC_BAT_RD_CMD_SENTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2831, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_bat_rd_cmd_sent_reg, + NULL, + NULL, + }, + { + "spec_bat_pkt_enq", + ETM_QMU_SPEC_BAT_PKT_ENQr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2832, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_bat_pkt_enq_reg, + NULL, + NULL, + }, + { + "spec_bat_pkt_deq", + ETM_QMU_SPEC_BAT_PKT_DEQr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2833, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_bat_pkt_deq_reg, + NULL, + NULL, + }, + { + "spec_bat_crdt_uncon_received", + ETM_QMU_SPEC_BAT_CRDT_UNCON_RECEIVEDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2834, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_bat_crdt_uncon_received_reg, + NULL, + NULL, + }, + { + "spec_bat_crdt_cong_received", + ETM_QMU_SPEC_BAT_CRDT_CONG_RECEIVEDr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2835, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_bat_crdt_cong_received_reg, + NULL, + NULL, + }, + { + "spec_bat_crs_normal_cnt", + ETM_QMU_SPEC_BAT_CRS_NORMAL_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2836, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_bat_crs_normal_cnt_reg, + NULL, + NULL, + }, + { + "spec_bat_crs_off_cnt", + ETM_QMU_SPEC_BAT_CRS_OFF_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2837, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_bat_crs_off_cnt_reg, + NULL, + NULL, + }, + { + "bcntm_ovfl_qnum_get", + ETM_QMU_BCNTM_OVFL_QNUM_GETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2844, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_bcntm_ovfl_qnum_get_reg, + NULL, + NULL, + }, + { + "crbal_a_ovf_qnum_get", + ETM_QMU_CRBAL_A_OVF_QNUM_GETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2845, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_crbal_a_ovf_qnum_get_reg, + NULL, + NULL, + }, + { + "crbal_b_ovf_qnum_get", + ETM_QMU_CRBAL_B_OVF_QNUM_GETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2846, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_crbal_b_ovf_qnum_get_reg, + NULL, + NULL, + }, + { + "crbal_drop_qnum_get", + ETM_QMU_CRBAL_DROP_QNUM_GETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2847, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_crbal_drop_qnum_get_reg, + NULL, + NULL, + }, + { + "deq_flg_report_cnt", + ETM_QMU_DEQ_FLG_REPORT_CNTr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2848, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_deq_flg_report_cnt_reg, + NULL, + NULL, + }, + { + "spec_q_crs_get", + ETM_QMU_SPEC_Q_CRS_GETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x2849, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_q_crs_get_reg, + NULL, + NULL, + }, + { + "spec_q_crs_in_get", + ETM_QMU_SPEC_Q_CRS_IN_GETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x284a, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_q_crs_in_get_reg, + NULL, + NULL, + }, + { + "spec_q_crs_flg_csol_get", + ETM_QMU_SPEC_Q_CRS_FLG_CSOL_GETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x284b, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_spec_q_crs_flg_csol_get_reg, + NULL, + NULL, + }, + { + "ept_sch_qnum_get", + ETM_QMU_EPT_SCH_QNUM_GETr, + ETM, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + 0x284c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_etm_qmu_ept_sch_qnum_get_reg, + NULL, + NULL, + }, + { + "pcie_ddr_switch", + CFG_PCIE_PCIE_DDR_SWITCHr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_pcie_ddr_switch_reg, + NULL, + NULL, + }, + { + "user0_int_en", + CFG_PCIE_USER0_INT_ENr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x004, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_user0_int_en_reg, + NULL, + NULL, + }, + { + "user0_int_mask", + CFG_PCIE_USER0_INT_MASKr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_user0_int_mask_reg, + NULL, + NULL, + }, + { + "user0_int_status", + CFG_PCIE_USER0_INT_STATUSr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x00c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_user0_int_status_reg, + NULL, + NULL, + }, + { + "user1_int_en", + CFG_PCIE_USER1_INT_ENr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x010, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_user1_int_en_reg, + NULL, + NULL, + }, + { + "user1_int_mask", + CFG_PCIE_USER1_INT_MASKr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x014, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_user1_int_mask_reg, + NULL, + NULL, + }, + { + "user1_int_status", + CFG_PCIE_USER1_INT_STATUSr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x018, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_user1_int_status_reg, + NULL, + NULL, + }, + { + "user2_int_en", + CFG_PCIE_USER2_INT_ENr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x01c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_user2_int_en_reg, + NULL, + NULL, + }, + { + "user2_int_mask", + CFG_PCIE_USER2_INT_MASKr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x020, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_user2_int_mask_reg, + NULL, + NULL, + }, + { + "user2_int_status", + CFG_PCIE_USER2_INT_STATUSr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x024, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_user2_int_status_reg, + NULL, + NULL, + }, + { + "ecc_1b_int_en", + CFG_PCIE_ECC_1B_INT_ENr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x028, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_ecc_1b_int_en_reg, + NULL, + NULL, + }, + { + "ecc_1b_int_mask", + CFG_PCIE_ECC_1B_INT_MASKr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x02c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_ecc_1b_int_mask_reg, + NULL, + NULL, + }, + { + "ecc_1b_int_status", + CFG_PCIE_ECC_1B_INT_STATUSr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x030, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_ecc_1b_int_status_reg, + NULL, + NULL, + }, + { + "ecc_2b_int_en", + CFG_PCIE_ECC_2B_INT_ENr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x034, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_ecc_2b_int_en_reg, + NULL, + NULL, + }, + { + "ecc_2b_int_mask", + CFG_PCIE_ECC_2B_INT_MASKr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x038, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_ecc_2b_int_mask_reg, + NULL, + NULL, + }, + { + "ecc_2b_int_status", + CFG_PCIE_ECC_2B_INT_STATUSr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x03c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_ecc_2b_int_status_reg, + NULL, + NULL, + }, + { + "cfg_int_status", + CFG_PCIE_CFG_INT_STATUSr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x040, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_cfg_int_status_reg, + NULL, + NULL, + }, + { + "i_core_to_cntl", + CFG_PCIE_I_CORE_TO_CNTLr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x044, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_i_core_to_cntl_reg, + NULL, + NULL, + }, + { + "test_in_low", + CFG_PCIE_TEST_IN_LOWr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x048, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_in_low_reg, + NULL, + NULL, + }, + { + "test_in_high", + CFG_PCIE_TEST_IN_HIGHr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x04c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_in_high_reg, + NULL, + NULL, + }, + { + "local_interrupt_out", + CFG_PCIE_LOCAL_INTERRUPT_OUTr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x050, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_local_interrupt_out_reg, + NULL, + NULL, + }, + { + "pl_ltssm", + CFG_PCIE_PL_LTSSMr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x054, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_pl_ltssm_reg, + NULL, + NULL, + }, + { + "test_out0", + CFG_PCIE_TEST_OUT0r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x058, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_out0_reg, + NULL, + NULL, + }, + { + "test_out1", + CFG_PCIE_TEST_OUT1r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x05c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_out1_reg, + NULL, + NULL, + }, + { + "test_out2", + CFG_PCIE_TEST_OUT2r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x060, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_out2_reg, + NULL, + NULL, + }, + { + "test_out3", + CFG_PCIE_TEST_OUT3r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x064, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_out3_reg, + NULL, + NULL, + }, + { + "test_out4", + CFG_PCIE_TEST_OUT4r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x068, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_out4_reg, + NULL, + NULL, + }, + { + "test_out5", + CFG_PCIE_TEST_OUT5r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x06c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_out5_reg, + NULL, + NULL, + }, + { + "test_out6", + CFG_PCIE_TEST_OUT6r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x070, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_out6_reg, + NULL, + NULL, + }, + { + "test_out7", + CFG_PCIE_TEST_OUT7r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x074, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_out7_reg, + NULL, + NULL, + }, + { + "sync_o_core_status", + CFG_PCIE_SYNC_O_CORE_STATUSr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x078, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_sync_o_core_status_reg, + NULL, + NULL, + }, + { + "sync_o_alert_dbe", + CFG_PCIE_SYNC_O_ALERT_DBEr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x07c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_sync_o_alert_dbe_reg, + NULL, + NULL, + }, + { + "sync_o_alert_sbe", + CFG_PCIE_SYNC_O_ALERT_SBEr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x080, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_sync_o_alert_sbe_reg, + NULL, + NULL, + }, + { + "sync_o_link_loopback_en", + CFG_PCIE_SYNC_O_LINK_LOOPBACK_ENr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x084, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_sync_o_link_loopback_en_reg, + NULL, + NULL, + }, + { + "sync_o_local_fs_lf_valid", + CFG_PCIE_SYNC_O_LOCAL_FS_LF_VALIDr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x088, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_sync_o_local_fs_lf_valid_reg, + NULL, + NULL, + }, + { + "sync_o_rx_idle_detect", + CFG_PCIE_SYNC_O_RX_IDLE_DETECTr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x08c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_sync_o_rx_idle_detect_reg, + NULL, + NULL, + }, + { + "sync_o_rx_rdy", + CFG_PCIE_SYNC_O_RX_RDYr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x090, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_sync_o_rx_rdy_reg, + NULL, + NULL, + }, + { + "sync_o_tx_rdy", + CFG_PCIE_SYNC_O_TX_RDYr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x094, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_sync_o_tx_rdy_reg, + NULL, + NULL, + }, + { + "pcie_link_up_cnt", + CFG_PCIE_PCIE_LINK_UP_CNTr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x098, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_pcie_link_up_cnt_reg, + NULL, + NULL, + }, + { + "test_out_pcie0", + CFG_PCIE_TEST_OUT_PCIE0r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x09c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_out_pcie0_reg, + NULL, + NULL, + }, + { + "test_out_pcie1", + CFG_PCIE_TEST_OUT_PCIE1r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x0a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_out_pcie1_reg, + NULL, + NULL, + }, + { + "test_out_pcie2", + CFG_PCIE_TEST_OUT_PCIE2r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x0a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_out_pcie2_reg, + NULL, + NULL, + }, + { + "test_out_pcie3", + CFG_PCIE_TEST_OUT_PCIE3r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x0a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_out_pcie3_reg, + NULL, + NULL, + }, + { + "test_out_pcie4", + CFG_PCIE_TEST_OUT_PCIE4r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x0ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_out_pcie4_reg, + NULL, + NULL, + }, + { + "test_out_pcie5", + CFG_PCIE_TEST_OUT_PCIE5r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x0b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_out_pcie5_reg, + NULL, + NULL, + }, + { + "test_out_pcie6", + CFG_PCIE_TEST_OUT_PCIE6r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x0b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_out_pcie6_reg, + NULL, + NULL, + }, + { + "test_out_pcie7", + CFG_PCIE_TEST_OUT_PCIE7r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x0b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_out_pcie7_reg, + NULL, + NULL, + }, + { + "test_out_pcie8", + CFG_PCIE_TEST_OUT_PCIE8r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x0bc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_out_pcie8_reg, + NULL, + NULL, + }, + { + "test_out_pcie9", + CFG_PCIE_TEST_OUT_PCIE9r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x0c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_out_pcie9_reg, + NULL, + NULL, + }, + { + "test_out_pcie10", + CFG_PCIE_TEST_OUT_PCIE10r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x0c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_out_pcie10_reg, + NULL, + NULL, + }, + { + "test_out_pcie11", + CFG_PCIE_TEST_OUT_PCIE11r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x0c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_out_pcie11_reg, + NULL, + NULL, + }, + { + "test_out_pcie12", + CFG_PCIE_TEST_OUT_PCIE12r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x0cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_out_pcie12_reg, + NULL, + NULL, + }, + { + "test_out_pcie13", + CFG_PCIE_TEST_OUT_PCIE13r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x0d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_out_pcie13_reg, + NULL, + NULL, + }, + { + "test_out_pcie14", + CFG_PCIE_TEST_OUT_PCIE14r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x0d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_out_pcie14_reg, + NULL, + NULL, + }, + { + "test_out_pcie15", + CFG_PCIE_TEST_OUT_PCIE15r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x0d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_test_out_pcie15_reg, + NULL, + NULL, + }, + { + "int_repeat_en", + CFG_PCIE_INT_REPEAT_ENr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x0e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_int_repeat_en_reg, + NULL, + NULL, + }, + { + "dbg_awid_axi_mst", + CFG_PCIE_DBG_AWID_AXI_MSTr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x400, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_awid_axi_mst_reg, + NULL, + NULL, + }, + { + "dbg_awaddr_axi_mst0", + CFG_PCIE_DBG_AWADDR_AXI_MST0r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x404, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_awaddr_axi_mst0_reg, + NULL, + NULL, + }, + { + "dbg_awaddr_axi_mst1", + CFG_PCIE_DBG_AWADDR_AXI_MST1r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x408, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_awaddr_axi_mst1_reg, + NULL, + NULL, + }, + { + "dbg_awlen_axi_mst", + CFG_PCIE_DBG_AWLEN_AXI_MSTr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x40c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_awlen_axi_mst_reg, + NULL, + NULL, + }, + { + "dbg_awsize_axi_mst", + CFG_PCIE_DBG_AWSIZE_AXI_MSTr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x410, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_awsize_axi_mst_reg, + NULL, + NULL, + }, + { + "dbg_awburst_axi_mst", + CFG_PCIE_DBG_AWBURST_AXI_MSTr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x414, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_awburst_axi_mst_reg, + NULL, + NULL, + }, + { + "dbg_awlock_axi_mst", + CFG_PCIE_DBG_AWLOCK_AXI_MSTr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x418, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_awlock_axi_mst_reg, + NULL, + NULL, + }, + { + "dbg_awcache_axi_mst", + CFG_PCIE_DBG_AWCACHE_AXI_MSTr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x41c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_awcache_axi_mst_reg, + NULL, + NULL, + }, + { + "dbg_awprot_axi_mst", + CFG_PCIE_DBG_AWPROT_AXI_MSTr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x420, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_awprot_axi_mst_reg, + NULL, + NULL, + }, + { + "dbg_wid_axi_mst", + CFG_PCIE_DBG_WID_AXI_MSTr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x424, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_wid_axi_mst_reg, + NULL, + NULL, + }, + { + "dbg_wdata_axi_mst0", + CFG_PCIE_DBG_WDATA_AXI_MST0r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x428, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_wdata_axi_mst0_reg, + NULL, + NULL, + }, + { + "dbg_wdata_axi_mst1", + CFG_PCIE_DBG_WDATA_AXI_MST1r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x42c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_wdata_axi_mst1_reg, + NULL, + NULL, + }, + { + "dbg_wdata_axi_mst2", + CFG_PCIE_DBG_WDATA_AXI_MST2r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x430, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_wdata_axi_mst2_reg, + NULL, + NULL, + }, + { + "dbg_wdata_axi_mst3", + CFG_PCIE_DBG_WDATA_AXI_MST3r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x434, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_wdata_axi_mst3_reg, + NULL, + NULL, + }, + { + "dbg_wstrb_axi_mst", + CFG_PCIE_DBG_WSTRB_AXI_MSTr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x438, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_wstrb_axi_mst_reg, + NULL, + NULL, + }, + { + "dbg_wlast_axi_mst", + CFG_PCIE_DBG_WLAST_AXI_MSTr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x43c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_wlast_axi_mst_reg, + NULL, + NULL, + }, + { + "dbg_arid_axi_mst", + CFG_PCIE_DBG_ARID_AXI_MSTr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x440, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_arid_axi_mst_reg, + NULL, + NULL, + }, + { + "dbg_araddr_axi_mst0", + CFG_PCIE_DBG_ARADDR_AXI_MST0r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x444, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_araddr_axi_mst0_reg, + NULL, + NULL, + }, + { + "dbg_araddr_axi_mst1", + CFG_PCIE_DBG_ARADDR_AXI_MST1r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x448, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_araddr_axi_mst1_reg, + NULL, + NULL, + }, + { + "dbg_arlen_axi_mst", + CFG_PCIE_DBG_ARLEN_AXI_MSTr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x44c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_arlen_axi_mst_reg, + NULL, + NULL, + }, + { + "dbg_arsize_axi_mst", + CFG_PCIE_DBG_ARSIZE_AXI_MSTr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x450, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_arsize_axi_mst_reg, + NULL, + NULL, + }, + { + "dbg_arburst_axi_mst", + CFG_PCIE_DBG_ARBURST_AXI_MSTr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x454, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_arburst_axi_mst_reg, + NULL, + NULL, + }, + { + "dbg_arlock_axi_mst", + CFG_PCIE_DBG_ARLOCK_AXI_MSTr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x458, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_arlock_axi_mst_reg, + NULL, + NULL, + }, + { + "dbg_arcache_axi_mst", + CFG_PCIE_DBG_ARCACHE_AXI_MSTr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x45c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_arcache_axi_mst_reg, + NULL, + NULL, + }, + { + "dbg_arprot_axi_mst", + CFG_PCIE_DBG_ARPROT_AXI_MSTr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x460, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_arprot_axi_mst_reg, + NULL, + NULL, + }, + { + "dbg_rdata_axi_mst0", + CFG_PCIE_DBG_RDATA_AXI_MST0r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x464, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_rdata_axi_mst0_reg, + NULL, + NULL, + }, + { + "dbg_rdata_axi_mst1", + CFG_PCIE_DBG_RDATA_AXI_MST1r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x468, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_rdata_axi_mst1_reg, + NULL, + NULL, + }, + { + "dbg_rdata_axi_mst2", + CFG_PCIE_DBG_RDATA_AXI_MST2r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x46c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_rdata_axi_mst2_reg, + NULL, + NULL, + }, + { + "dbg_rdata_axi_mst3", + CFG_PCIE_DBG_RDATA_AXI_MST3r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x470, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_rdata_axi_mst3_reg, + NULL, + NULL, + }, + { + "axi_mst_state", + CFG_PCIE_AXI_MST_STATEr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x474, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_axi_mst_state_reg, + NULL, + NULL, + }, + { + "axi_cfg_state", + CFG_PCIE_AXI_CFG_STATEr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x478, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_axi_cfg_state_reg, + NULL, + NULL, + }, + { + "axi_slv_rd_state", + CFG_PCIE_AXI_SLV_RD_STATEr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x47c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_axi_slv_rd_state_reg, + NULL, + NULL, + }, + { + "axi_slv_wr_state", + CFG_PCIE_AXI_SLV_WR_STATEr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x480, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_axi_slv_wr_state_reg, + NULL, + NULL, + }, + { + "axim_delay_en", + CFG_PCIE_AXIM_DELAY_ENr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x484, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_axim_delay_en_reg, + NULL, + NULL, + }, + { + "axim_delay", + CFG_PCIE_AXIM_DELAYr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x488, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_axim_delay_reg, + NULL, + NULL, + }, + { + "axim_speed_wr", + CFG_PCIE_AXIM_SPEED_WRr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x48c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_axim_speed_wr_reg, + NULL, + NULL, + }, + { + "axim_speed_rd", + CFG_PCIE_AXIM_SPEED_RDr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x490, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_axim_speed_rd_reg, + NULL, + NULL, + }, + { + "dbg_awaddr_axi_slv0", + CFG_PCIE_DBG_AWADDR_AXI_SLV0r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x4c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_awaddr_axi_slv0_reg, + NULL, + NULL, + }, + { + "dbg_awaddr_axi_slv1", + CFG_PCIE_DBG_AWADDR_AXI_SLV1r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x4c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_awaddr_axi_slv1_reg, + NULL, + NULL, + }, + { + "dbg0_wdata_axi_slv0", + CFG_PCIE_DBG0_WDATA_AXI_SLV0r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x4c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg0_wdata_axi_slv0_reg, + NULL, + NULL, + }, + { + "dbg0_wdata_axi_slv1", + CFG_PCIE_DBG0_WDATA_AXI_SLV1r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x4cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg0_wdata_axi_slv1_reg, + NULL, + NULL, + }, + { + "dbg0_wdata_axi_slv2", + CFG_PCIE_DBG0_WDATA_AXI_SLV2r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x4d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg0_wdata_axi_slv2_reg, + NULL, + NULL, + }, + { + "dbg0_wdata_axi_slv3", + CFG_PCIE_DBG0_WDATA_AXI_SLV3r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x4d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg0_wdata_axi_slv3_reg, + NULL, + NULL, + }, + { + "dbg1_wdata_axi_slv0", + CFG_PCIE_DBG1_WDATA_AXI_SLV0r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x4d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg1_wdata_axi_slv0_reg, + NULL, + NULL, + }, + { + "dbg1_wdata_axi_slv1", + CFG_PCIE_DBG1_WDATA_AXI_SLV1r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x4dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg1_wdata_axi_slv1_reg, + NULL, + NULL, + }, + { + "dbg1_wdata_axi_slv2", + CFG_PCIE_DBG1_WDATA_AXI_SLV2r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x4e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg1_wdata_axi_slv2_reg, + NULL, + NULL, + }, + { + "dbg1_wdata_axi_slv3", + CFG_PCIE_DBG1_WDATA_AXI_SLV3r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x4e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg1_wdata_axi_slv3_reg, + NULL, + NULL, + }, + { + "dbg2_wdata_axi_slv0", + CFG_PCIE_DBG2_WDATA_AXI_SLV0r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x4e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg2_wdata_axi_slv0_reg, + NULL, + NULL, + }, + { + "dbg2_wdata_axi_slv1", + CFG_PCIE_DBG2_WDATA_AXI_SLV1r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x4ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg2_wdata_axi_slv1_reg, + NULL, + NULL, + }, + { + "dbg2_wdata_axi_slv2", + CFG_PCIE_DBG2_WDATA_AXI_SLV2r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x4f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg2_wdata_axi_slv2_reg, + NULL, + NULL, + }, + { + "dbg2_wdata_axi_slv3", + CFG_PCIE_DBG2_WDATA_AXI_SLV3r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x4f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg2_wdata_axi_slv3_reg, + NULL, + NULL, + }, + { + "dbg3_wdata_axi_slv0", + CFG_PCIE_DBG3_WDATA_AXI_SLV0r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x4f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg3_wdata_axi_slv0_reg, + NULL, + NULL, + }, + { + "dbg3_wdata_axi_slv1", + CFG_PCIE_DBG3_WDATA_AXI_SLV1r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x4fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg3_wdata_axi_slv1_reg, + NULL, + NULL, + }, + { + "dbg3_wdata_axi_slv2", + CFG_PCIE_DBG3_WDATA_AXI_SLV2r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x500, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg3_wdata_axi_slv2_reg, + NULL, + NULL, + }, + { + "dbg3_wdata_axi_slv3", + CFG_PCIE_DBG3_WDATA_AXI_SLV3r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x504, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg3_wdata_axi_slv3_reg, + NULL, + NULL, + }, + { + "dbg4_wdata_axi_slv0", + CFG_PCIE_DBG4_WDATA_AXI_SLV0r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x508, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg4_wdata_axi_slv0_reg, + NULL, + NULL, + }, + { + "dbg4_wdata_axi_slv1", + CFG_PCIE_DBG4_WDATA_AXI_SLV1r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x50c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg4_wdata_axi_slv1_reg, + NULL, + NULL, + }, + { + "dbg4_wdata_axi_slv2", + CFG_PCIE_DBG4_WDATA_AXI_SLV2r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x510, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg4_wdata_axi_slv2_reg, + NULL, + NULL, + }, + { + "dbg4_wdata_axi_slv3", + CFG_PCIE_DBG4_WDATA_AXI_SLV3r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x514, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg4_wdata_axi_slv3_reg, + NULL, + NULL, + }, + { + "dbg5_wdata_axi_slv0", + CFG_PCIE_DBG5_WDATA_AXI_SLV0r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x518, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg5_wdata_axi_slv0_reg, + NULL, + NULL, + }, + { + "dbg5_wdata_axi_slv1", + CFG_PCIE_DBG5_WDATA_AXI_SLV1r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x51c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg5_wdata_axi_slv1_reg, + NULL, + NULL, + }, + { + "dbg5_wdata_axi_slv2", + CFG_PCIE_DBG5_WDATA_AXI_SLV2r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x520, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg5_wdata_axi_slv2_reg, + NULL, + NULL, + }, + { + "dbg5_wdata_axi_slv3", + CFG_PCIE_DBG5_WDATA_AXI_SLV3r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x524, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg5_wdata_axi_slv3_reg, + NULL, + NULL, + }, + { + "dbg6_wdata_axi_slv0", + CFG_PCIE_DBG6_WDATA_AXI_SLV0r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x528, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg6_wdata_axi_slv0_reg, + NULL, + NULL, + }, + { + "dbg6_wdata_axi_slv1", + CFG_PCIE_DBG6_WDATA_AXI_SLV1r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x52c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg6_wdata_axi_slv1_reg, + NULL, + NULL, + }, + { + "dbg6_wdata_axi_slv2", + CFG_PCIE_DBG6_WDATA_AXI_SLV2r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x530, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg6_wdata_axi_slv2_reg, + NULL, + NULL, + }, + { + "dbg6_wdata_axi_slv3", + CFG_PCIE_DBG6_WDATA_AXI_SLV3r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x534, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg6_wdata_axi_slv3_reg, + NULL, + NULL, + }, + { + "dbg7_wdata_axi_slv0", + CFG_PCIE_DBG7_WDATA_AXI_SLV0r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x538, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg7_wdata_axi_slv0_reg, + NULL, + NULL, + }, + { + "dbg7_wdata_axi_slv1", + CFG_PCIE_DBG7_WDATA_AXI_SLV1r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x53c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg7_wdata_axi_slv1_reg, + NULL, + NULL, + }, + { + "dbg7_wdata_axi_slv2", + CFG_PCIE_DBG7_WDATA_AXI_SLV2r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x540, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg7_wdata_axi_slv2_reg, + NULL, + NULL, + }, + { + "dbg7_wdata_axi_slv3", + CFG_PCIE_DBG7_WDATA_AXI_SLV3r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x544, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg7_wdata_axi_slv3_reg, + NULL, + NULL, + }, + { + "dbg8_wdata_axi_slv0", + CFG_PCIE_DBG8_WDATA_AXI_SLV0r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x548, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg8_wdata_axi_slv0_reg, + NULL, + NULL, + }, + { + "dbg8_wdata_axi_slv1", + CFG_PCIE_DBG8_WDATA_AXI_SLV1r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x54c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg8_wdata_axi_slv1_reg, + NULL, + NULL, + }, + { + "dbg8_wdata_axi_slv2", + CFG_PCIE_DBG8_WDATA_AXI_SLV2r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x550, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg8_wdata_axi_slv2_reg, + NULL, + NULL, + }, + { + "dbg8_wdata_axi_slv3", + CFG_PCIE_DBG8_WDATA_AXI_SLV3r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x554, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg8_wdata_axi_slv3_reg, + NULL, + NULL, + }, + { + "dbg9_wdata_axi_slv0", + CFG_PCIE_DBG9_WDATA_AXI_SLV0r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x558, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg9_wdata_axi_slv0_reg, + NULL, + NULL, + }, + { + "dbg9_wdata_axi_slv1", + CFG_PCIE_DBG9_WDATA_AXI_SLV1r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x55c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg9_wdata_axi_slv1_reg, + NULL, + NULL, + }, + { + "dbg9_wdata_axi_slv2", + CFG_PCIE_DBG9_WDATA_AXI_SLV2r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x560, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg9_wdata_axi_slv2_reg, + NULL, + NULL, + }, + { + "dbg9_wdata_axi_slv3", + CFG_PCIE_DBG9_WDATA_AXI_SLV3r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x564, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg9_wdata_axi_slv3_reg, + NULL, + NULL, + }, + { + "dbg_awlen_axi_slv", + CFG_PCIE_DBG_AWLEN_AXI_SLVr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x568, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_awlen_axi_slv_reg, + NULL, + NULL, + }, + { + "dbg_wlast_axi_slv", + CFG_PCIE_DBG_WLAST_AXI_SLVr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x56c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_wlast_axi_slv_reg, + NULL, + NULL, + }, + { + "dbg_araddr_axi_slv0", + CFG_PCIE_DBG_ARADDR_AXI_SLV0r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x580, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_araddr_axi_slv0_reg, + NULL, + NULL, + }, + { + "dbg_araddr_axi_slv1", + CFG_PCIE_DBG_ARADDR_AXI_SLV1r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x584, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_araddr_axi_slv1_reg, + NULL, + NULL, + }, + { + "dbg0_rdata_axi_slv0", + CFG_PCIE_DBG0_RDATA_AXI_SLV0r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x588, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg0_rdata_axi_slv0_reg, + NULL, + NULL, + }, + { + "dbg0_rdata_axi_slv1", + CFG_PCIE_DBG0_RDATA_AXI_SLV1r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x58c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg0_rdata_axi_slv1_reg, + NULL, + NULL, + }, + { + "dbg0_rdata_axi_slv2", + CFG_PCIE_DBG0_RDATA_AXI_SLV2r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x590, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg0_rdata_axi_slv2_reg, + NULL, + NULL, + }, + { + "dbg0_rdata_axi_slv3", + CFG_PCIE_DBG0_RDATA_AXI_SLV3r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x594, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg0_rdata_axi_slv3_reg, + NULL, + NULL, + }, + { + "dbg1_rdata_axi_slv0", + CFG_PCIE_DBG1_RDATA_AXI_SLV0r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x598, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg1_rdata_axi_slv0_reg, + NULL, + NULL, + }, + { + "dbg1_rdata_axi_slv1", + CFG_PCIE_DBG1_RDATA_AXI_SLV1r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x59c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg1_rdata_axi_slv1_reg, + NULL, + NULL, + }, + { + "dbg1_rdata_axi_slv2", + CFG_PCIE_DBG1_RDATA_AXI_SLV2r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x5a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg1_rdata_axi_slv2_reg, + NULL, + NULL, + }, + { + "dbg1_rdata_axi_slv3", + CFG_PCIE_DBG1_RDATA_AXI_SLV3r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x5a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg1_rdata_axi_slv3_reg, + NULL, + NULL, + }, + { + "dbg_rlast_axi_slv", + CFG_PCIE_DBG_RLAST_AXI_SLVr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_PCIE_BASE_ADDR + 0x5a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_pcie_dbg_rlast_axi_slv_reg, + NULL, + NULL, + }, + { + "dma_enable", + CFG_DMA_DMA_ENABLEr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_enable_reg, + NULL, + NULL, + }, + { + "up_req", + CFG_DMA_UP_REQr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x004, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_up_req_reg, + NULL, + NULL, + }, + { + "dma_up_current_state", + CFG_DMA_DMA_UP_CURRENT_STATEr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x010, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_up_current_state_reg, + NULL, + NULL, + }, + { + "dma_up_req_ack", + CFG_DMA_DMA_UP_REQ_ACKr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x00c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_up_req_ack_reg, + NULL, + NULL, + }, + { + "dma_done_latch", + CFG_DMA_DMA_DONE_LATCHr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x014, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_done_latch_reg, + NULL, + NULL, + }, + { + "dma_up_cpu_addr_low32", + CFG_DMA_DMA_UP_CPU_ADDR_LOW32r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x018, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_up_cpu_addr_low32_reg, + NULL, + NULL, + }, + { + "dma_up_cpu_addr_high32", + CFG_DMA_DMA_UP_CPU_ADDR_HIGH32r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x01c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_up_cpu_addr_high32_reg, + NULL, + NULL, + }, + { + "dma_up_se_addr", + CFG_DMA_DMA_UP_SE_ADDRr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x024, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_up_se_addr_reg, + NULL, + NULL, + }, + { + "dma_done_int", + CFG_DMA_DMA_DONE_INTr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x034, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_done_int_reg, + NULL, + NULL, + }, + { + "sp_cfg", + CFG_DMA_SP_CFGr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x038, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_sp_cfg_reg, + NULL, + NULL, + }, + { + "dma_ing", + CFG_DMA_DMA_INGr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x03c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_ing_reg, + NULL, + NULL, + }, + { + "rd_timeout_thresh", + CFG_DMA_RD_TIMEOUT_THRESHr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x040, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_rd_timeout_thresh_reg, + NULL, + NULL, + }, + { + "dma_tab_sta_up_fifo_gap", + CFG_DMA_DMA_TAB_STA_UP_FIFO_GAPr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x044, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_tab_sta_up_fifo_gap_reg, + NULL, + NULL, + }, + { + "cfg_mac_tim", + CFG_DMA_CFG_MAC_TIMr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x048, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_cfg_mac_tim_reg, + NULL, + NULL, + }, + { + "cfg_mac_num", + CFG_DMA_CFG_MAC_NUMr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x04c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_cfg_mac_num_reg, + NULL, + NULL, + }, + { + "init_bd_addr", + CFG_DMA_INIT_BD_ADDRr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x050, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_init_bd_addr_reg, + NULL, + NULL, + }, + { + "mac_up_bd_addr1_low32", + CFG_DMA_MAC_UP_BD_ADDR1_LOW32r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x054, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_mac_up_bd_addr1_low32_reg, + NULL, + NULL, + }, + { + "mac_up_bd_addr1_high32", + CFG_DMA_MAC_UP_BD_ADDR1_HIGH32r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x058, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_mac_up_bd_addr1_high32_reg, + NULL, + NULL, + }, + { + "mac_up_bd_addr2_low32", + CFG_DMA_MAC_UP_BD_ADDR2_LOW32r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x05c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_mac_up_bd_addr2_low32_reg, + NULL, + NULL, + }, + { + "mac_up_bd_addr2_high32", + CFG_DMA_MAC_UP_BD_ADDR2_HIGH32r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x060, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_mac_up_bd_addr2_high32_reg, + NULL, + NULL, + }, + { + "cfg_mac_max_num", + CFG_DMA_CFG_MAC_MAX_NUMr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x064, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_cfg_mac_max_num_reg, + NULL, + NULL, + }, + { + "dma_wbuf_ff_empty", + CFG_DMA_DMA_WBUF_FF_EMPTYr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x068, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_wbuf_ff_empty_reg, + NULL, + NULL, + }, + { + "dma_wbuf_state", + CFG_DMA_DMA_WBUF_STATEr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x06c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_wbuf_state_reg, + NULL, + NULL, + }, + { + "dma_mac_bd_addr_low32", + CFG_DMA_DMA_MAC_BD_ADDR_LOW32r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x070, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_mac_bd_addr_low32_reg, + NULL, + NULL, + }, + { + "dma_mac_bd_addr_high32", + CFG_DMA_DMA_MAC_BD_ADDR_HIGH32r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x074, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_mac_bd_addr_high32_reg, + NULL, + NULL, + }, + { + "mac_up_enable", + CFG_DMA_MAC_UP_ENABLEr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x078, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_mac_up_enable_reg, + NULL, + NULL, + }, + { + "mac_endian", + CFG_DMA_MAC_ENDIANr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x07c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_mac_endian_reg, + NULL, + NULL, + }, + { + "up_endian", + CFG_DMA_UP_ENDIANr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x080, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_up_endian_reg, + NULL, + NULL, + }, + { + "dma_up_rd_cnt_latch", + CFG_DMA_DMA_UP_RD_CNT_LATCHr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x084, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_up_rd_cnt_latch_reg, + NULL, + NULL, + }, + { + "dma_up_rcv_cnt_latch", + CFG_DMA_DMA_UP_RCV_CNT_LATCHr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x088, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_up_rcv_cnt_latch_reg, + NULL, + NULL, + }, + { + "dma_up_cnt_latch", + CFG_DMA_DMA_UP_CNT_LATCHr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x08c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_up_cnt_latch_reg, + NULL, + NULL, + }, + { + "cpu_rd_bd_pulse", + CFG_DMA_CPU_RD_BD_PULSEr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x090, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_cpu_rd_bd_pulse_reg, + NULL, + NULL, + }, + { + "cpu_bd_threshold", + CFG_DMA_CPU_BD_THRESHOLDr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x094, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_cpu_bd_threshold_reg, + NULL, + NULL, + }, + { + "cpu_bd_used_cnt", + CFG_DMA_CPU_BD_USED_CNTr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x098, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_cpu_bd_used_cnt_reg, + NULL, + NULL, + }, + { + "dma_up_rcv_status", + CFG_DMA_DMA_UP_RCV_STATUSr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x09c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_up_rcv_status_reg, + NULL, + NULL, + }, + { + "slv_rid_err_en", + CFG_DMA_SLV_RID_ERR_ENr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x0a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_slv_rid_err_en_reg, + NULL, + NULL, + }, + { + "slv_rresp_err_en", + CFG_DMA_SLV_RRESP_ERR_ENr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x0a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_slv_rresp_err_en_reg, + NULL, + NULL, + }, + { + "se_rdbk_ff_full", + CFG_DMA_SE_RDBK_FF_FULLr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x0a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_se_rdbk_ff_full_reg, + NULL, + NULL, + }, + { + "dma_up_data_count", + CFG_DMA_DMA_UP_DATA_COUNTr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x0ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_up_data_count_reg, + NULL, + NULL, + }, + { + "dma_mwr_fifo_afull_gap", + CFG_DMA_DMA_MWR_FIFO_AFULL_GAPr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0xb0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_mwr_fifo_afull_gap_reg, + NULL, + NULL, + }, + { + "dma_info_fifo_afull_gap", + CFG_DMA_DMA_INFO_FIFO_AFULL_GAPr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0xb4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_info_fifo_afull_gap_reg, + NULL, + NULL, + }, + { + "dma_rd_timeout_set", + CFG_DMA_DMA_RD_TIMEOUT_SETr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x0c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_rd_timeout_set_reg, + NULL, + NULL, + }, + { + "dma_bd_dat_err_en", + CFG_DMA_DMA_BD_DAT_ERR_ENr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x0c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_bd_dat_err_en_reg, + NULL, + NULL, + }, + { + "dma_repeat_cnt", + CFG_DMA_DMA_REPEAT_CNTr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x0c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_repeat_cnt_reg, + NULL, + NULL, + }, + { + "dma_rd_timeout_en", + CFG_DMA_DMA_RD_TIMEOUT_ENr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x0cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_rd_timeout_en_reg, + NULL, + NULL, + }, + { + "dma_repeat_read", + CFG_DMA_DMA_REPEAT_READr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x0d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_repeat_read_reg, + NULL, + NULL, + }, + { + "dma_repeat_read_en", + CFG_DMA_DMA_REPEAT_READ_ENr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x0d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_repeat_read_en_reg, + NULL, + NULL, + }, + { + "bd_ctl_state", + CFG_DMA_BD_CTL_STATEr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x0d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_bd_ctl_state_reg, + NULL, + NULL, + }, + { + "dma_done_int_cnt_wr", + CFG_DMA_DMA_DONE_INT_CNT_WRr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x0dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_done_int_cnt_wr_reg, + NULL, + NULL, + }, + { + "dma_done_int_cnt_mac", + CFG_DMA_DMA_DONE_INT_CNT_MACr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x0e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_done_int_cnt_mac_reg, + NULL, + NULL, + }, + { + "current_mac_num", + CFG_DMA_CURRENT_MAC_NUMr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x0f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_current_mac_num_reg, + NULL, + NULL, + }, + { + "cfg_mac_afifo_afull", + CFG_DMA_CFG_MAC_AFIFO_AFULLr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x0f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_cfg_mac_afifo_afull_reg, + NULL, + NULL, + }, + { + "dma_mac_ff_full", + CFG_DMA_DMA_MAC_FF_FULLr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x0fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_dma_dma_mac_ff_full_reg, + NULL, + NULL, + }, + { + "user_axi_mst", + CFG_DMA_USER_AXI_MSTr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_DMA_BASE_ADDR + 0x0100, + (32/8), + 0, + 0, + 0, + 0, + 5, + g_cfg_dma_user_axi_mst_reg, + NULL, + NULL, + }, + { + "sbus_state", + CFG_CSR_SBUS_STATEr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_sbus_state_reg, + NULL, + NULL, + }, + { + "mst_debug_en", + CFG_CSR_MST_DEBUG_ENr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x020, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_en_reg, + NULL, + NULL, + }, + { + "sbus_command_sel", + CFG_CSR_SBUS_COMMAND_SELr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x024, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_sbus_command_sel_reg, + NULL, + NULL, + }, + { + "soc_rd_time_out_thresh", + CFG_CSR_SOC_RD_TIME_OUT_THRESHr, + CFG, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x02c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_soc_rd_time_out_thresh_reg, + NULL, + NULL, + }, + { + "big_little_byte_order", + CFG_CSR_BIG_LITTLE_BYTE_ORDERr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x030, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_big_little_byte_order_reg, + NULL, + NULL, + }, + { + "ecc_bypass_read", + CFG_CSR_ECC_BYPASS_READr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x034, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_ecc_bypass_read_reg, + NULL, + NULL, + }, + { + "ahb_async_wr_fifo_afull_gap", + CFG_CSR_AHB_ASYNC_WR_FIFO_AFULL_GAPr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x038, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_ahb_async_wr_fifo_afull_gap_reg, + NULL, + NULL, + }, + { + "ahb_async_rd_fifo_afull_gap", + CFG_CSR_AHB_ASYNC_RD_FIFO_AFULL_GAPr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x03c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_ahb_async_rd_fifo_afull_gap_reg, + NULL, + NULL, + }, + { + "ahb_async_cpl_fifo_afull_gap", + CFG_CSR_AHB_ASYNC_CPL_FIFO_AFULL_GAPr, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x040, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_ahb_async_cpl_fifo_afull_gap_reg, + NULL, + NULL, + }, + { + "mst_debug_data0_high26", + CFG_CSR_MST_DEBUG_DATA0_HIGH26r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x080, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data0_high26_reg, + NULL, + NULL, + }, + { + "mst_debug_data0_low32", + CFG_CSR_MST_DEBUG_DATA0_LOW32r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x084, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data0_low32_reg, + NULL, + NULL, + }, + { + "mst_debug_data1_high26", + CFG_CSR_MST_DEBUG_DATA1_HIGH26r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x088, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data1_high26_reg, + NULL, + NULL, + }, + { + "mst_debug_data1_low32", + CFG_CSR_MST_DEBUG_DATA1_LOW32r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x08c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data1_low32_reg, + NULL, + NULL, + }, + { + "mst_debug_data2_high26", + CFG_CSR_MST_DEBUG_DATA2_HIGH26r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x090, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data2_high26_reg, + NULL, + NULL, + }, + { + "mst_debug_data2_low32", + CFG_CSR_MST_DEBUG_DATA2_LOW32r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x094, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data2_low32_reg, + NULL, + NULL, + }, + { + "mst_debug_data3_high26", + CFG_CSR_MST_DEBUG_DATA3_HIGH26r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x098, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data3_high26_reg, + NULL, + NULL, + }, + { + "mst_debug_data3_low32", + CFG_CSR_MST_DEBUG_DATA3_LOW32r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x09c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data3_low32_reg, + NULL, + NULL, + }, + { + "mst_debug_data4_high26", + CFG_CSR_MST_DEBUG_DATA4_HIGH26r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x0a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data4_high26_reg, + NULL, + NULL, + }, + { + "mst_debug_data4_low32", + CFG_CSR_MST_DEBUG_DATA4_LOW32r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x0a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data4_low32_reg, + NULL, + NULL, + }, + { + "mst_debug_data5_high26", + CFG_CSR_MST_DEBUG_DATA5_HIGH26r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x0a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data5_high26_reg, + NULL, + NULL, + }, + { + "mst_debug_data5_low32", + CFG_CSR_MST_DEBUG_DATA5_LOW32r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x0ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data5_low32_reg, + NULL, + NULL, + }, + { + "mst_debug_data6_high26", + CFG_CSR_MST_DEBUG_DATA6_HIGH26r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x0b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data6_high26_reg, + NULL, + NULL, + }, + { + "mst_debug_data6_low32", + CFG_CSR_MST_DEBUG_DATA6_LOW32r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x0b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data6_low32_reg, + NULL, + NULL, + }, + { + "mst_debug_data7_high26", + CFG_CSR_MST_DEBUG_DATA7_HIGH26r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x0b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data7_high26_reg, + NULL, + NULL, + }, + { + "mst_debug_data7_low32", + CFG_CSR_MST_DEBUG_DATA7_LOW32r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x0bc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data7_low32_reg, + NULL, + NULL, + }, + { + "mst_debug_data8_high26", + CFG_CSR_MST_DEBUG_DATA8_HIGH26r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x0c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data8_high26_reg, + NULL, + NULL, + }, + { + "mst_debug_data8_low32", + CFG_CSR_MST_DEBUG_DATA8_LOW32r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x0c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data8_low32_reg, + NULL, + NULL, + }, + { + "mst_debug_data9_high26", + CFG_CSR_MST_DEBUG_DATA9_HIGH26r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x0c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data9_high26_reg, + NULL, + NULL, + }, + { + "mst_debug_data9_low32", + CFG_CSR_MST_DEBUG_DATA9_LOW32r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x0cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data9_low32_reg, + NULL, + NULL, + }, + { + "mst_debug_data10_high26", + CFG_CSR_MST_DEBUG_DATA10_HIGH26r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x0d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data10_high26_reg, + NULL, + NULL, + }, + { + "mst_debug_data10_low32", + CFG_CSR_MST_DEBUG_DATA10_LOW32r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x0d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data10_low32_reg, + NULL, + NULL, + }, + { + "mst_debug_data11_high26", + CFG_CSR_MST_DEBUG_DATA11_HIGH26r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x0d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data11_high26_reg, + NULL, + NULL, + }, + { + "mst_debug_data11_low32", + CFG_CSR_MST_DEBUG_DATA11_LOW32r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x0dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data11_low32_reg, + NULL, + NULL, + }, + { + "mst_debug_data12_high26", + CFG_CSR_MST_DEBUG_DATA12_HIGH26r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x0e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data12_high26_reg, + NULL, + NULL, + }, + { + "mst_debug_data12_low32", + CFG_CSR_MST_DEBUG_DATA12_LOW32r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x0e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data12_low32_reg, + NULL, + NULL, + }, + { + "mst_debug_data13_high26", + CFG_CSR_MST_DEBUG_DATA13_HIGH26r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x0e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data13_high26_reg, + NULL, + NULL, + }, + { + "mst_debug_data13_low32", + CFG_CSR_MST_DEBUG_DATA13_LOW32r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x0ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data13_low32_reg, + NULL, + NULL, + }, + { + "mst_debug_data14_high26", + CFG_CSR_MST_DEBUG_DATA14_HIGH26r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x0f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data14_high26_reg, + NULL, + NULL, + }, + { + "mst_debug_data14_low32", + CFG_CSR_MST_DEBUG_DATA14_LOW32r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x0f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data14_low32_reg, + NULL, + NULL, + }, + { + "mst_debug_data15_high26", + CFG_CSR_MST_DEBUG_DATA15_HIGH26r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x0f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data15_high26_reg, + NULL, + NULL, + }, + { + "mst_debug_data15_low32", + CFG_CSR_MST_DEBUG_DATA15_LOW32r, + CFG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_CFG_BASE_ADDR + MODULE_CFG_CSR_BASE_ADDR + 0x0fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_cfg_csr_mst_debug_data15_low32_reg, + NULL, + NULL, + }, + { + "ind_access_states", + NPPU_MR_CFG_IND_ACCESS_STATESr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_ind_access_states_reg, + NULL, + NULL, + }, + { + "ind_access_cmd0", + NPPU_MR_CFG_IND_ACCESS_CMD0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0004, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_nppu_mr_cfg_ind_access_cmd0_reg, + NULL, + NULL, + }, + { + "ind_access_data0", + NPPU_MR_CFG_IND_ACCESS_DATA0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_ind_access_data0_reg, + NULL, + NULL, + }, + { + "ind_access_data1", + NPPU_MR_CFG_IND_ACCESS_DATA1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x000c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_ind_access_data1_reg, + NULL, + NULL, + }, + { + "ind_access_cmd1", + NPPU_MR_CFG_IND_ACCESS_CMD1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0010, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_ind_access_cmd1_reg, + NULL, + NULL, + }, + { + "mr_init_done", + NPPU_MR_CFG_MR_INIT_DONEr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0014, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_init_done_reg, + NULL, + NULL, + }, + { + "cnt_mode_reg", + NPPU_MR_CFG_CNT_MODE_REGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0018, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_nppu_mr_cfg_cnt_mode_reg_reg, + NULL, + NULL, + }, + { + "cfg_ecc_bypass_read", + NPPU_MR_CFG_CFG_ECC_BYPASS_READr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x001c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_cfg_ecc_bypass_read_reg, + NULL, + NULL, + }, + { + "cfg_rep_mod", + NPPU_MR_CFG_CFG_REP_MODr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0020, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_cfg_rep_mod_reg, + NULL, + NULL, + }, + { + "block_ptr_fifo_aful_th", + NPPU_MR_CFG_BLOCK_PTR_FIFO_AFUL_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x002c, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_nppu_mr_cfg_block_ptr_fifo_aful_th_reg, + NULL, + NULL, + }, + { + "pre_rcv_ptr_fifo_aful_th", + NPPU_MR_CFG_PRE_RCV_PTR_FIFO_AFUL_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0030, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_nppu_mr_cfg_pre_rcv_ptr_fifo_aful_th_reg, + NULL, + NULL, + }, + { + "mgid_fifo_aful_th", + NPPU_MR_CFG_MGID_FIFO_AFUL_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0034, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_nppu_mr_cfg_mgid_fifo_aful_th_reg, + NULL, + NULL, + }, + { + "rep_cmd_fifo_aful_th", + NPPU_MR_CFG_REP_CMD_FIFO_AFUL_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0038, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_nppu_mr_cfg_rep_cmd_fifo_aful_th_reg, + NULL, + NULL, + }, + { + "mr_int_mask_1", + NPPU_MR_CFG_MR_INT_MASK_1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x00c0, + (32/8), + 0, + 0, + 0, + 0, + 20, + g_nppu_mr_cfg_mr_int_mask_1_reg, + NULL, + NULL, + }, + { + "mr_int_mask_2", + NPPU_MR_CFG_MR_INT_MASK_2r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x00c4, + (32/8), + 0, + 0, + 0, + 0, + 20, + g_nppu_mr_cfg_mr_int_mask_2_reg, + NULL, + NULL, + }, + { + "mr_int_mask_3", + NPPU_MR_CFG_MR_INT_MASK_3r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x00c8, + (32/8), + 0, + 0, + 0, + 0, + 20, + g_nppu_mr_cfg_mr_int_mask_3_reg, + NULL, + NULL, + }, + { + "mr_int_mask_4", + NPPU_MR_CFG_MR_INT_MASK_4r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x00cc, + (32/8), + 0, + 0, + 0, + 0, + 25, + g_nppu_mr_cfg_mr_int_mask_4_reg, + NULL, + NULL, + }, + { + "mr_states_1", + NPPU_MR_CFG_MR_STATES_1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0040, + (32/8), + 0, + 0, + 0, + 0, + 20, + g_nppu_mr_cfg_mr_states_1_reg, + NULL, + NULL, + }, + { + "mr_states_2", + NPPU_MR_CFG_MR_STATES_2r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0044, + (32/8), + 0, + 0, + 0, + 0, + 20, + g_nppu_mr_cfg_mr_states_2_reg, + NULL, + NULL, + }, + { + "mr_states_3", + NPPU_MR_CFG_MR_STATES_3r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0048, + (32/8), + 0, + 0, + 0, + 0, + 20, + g_nppu_mr_cfg_mr_states_3_reg, + NULL, + NULL, + }, + { + "mr_states_4", + NPPU_MR_CFG_MR_STATES_4r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x004c, + (32/8), + 0, + 0, + 0, + 0, + 25, + g_nppu_mr_cfg_mr_states_4_reg, + NULL, + NULL, + }, + { + "mr_states_5", + NPPU_MR_CFG_MR_STATES_5r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0050, + (32/8), + 0, + 0, + 0, + 0, + 21, + g_nppu_mr_cfg_mr_states_5_reg, + NULL, + NULL, + }, + { + "mr_states_6", + NPPU_MR_CFG_MR_STATES_6r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0054, + (32/8), + 0, + 0, + 0, + 0, + 20, + g_nppu_mr_cfg_mr_states_6_reg, + NULL, + NULL, + }, + { + "mr_states_7", + NPPU_MR_CFG_MR_STATES_7r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0058, + (32/8), + 0, + 0, + 0, + 0, + 22, + g_nppu_mr_cfg_mr_states_7_reg, + NULL, + NULL, + }, + { + "mr_states_8", + NPPU_MR_CFG_MR_STATES_8r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x005c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_states_8_reg, + NULL, + NULL, + }, + { + "mr_sop_in_cnt", + NPPU_MR_CFG_MR_SOP_IN_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0060, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_sop_in_cnt_reg, + NULL, + NULL, + }, + { + "mr_eop_in_cnt", + NPPU_MR_CFG_MR_EOP_IN_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0064, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_eop_in_cnt_reg, + NULL, + NULL, + }, + { + "mr_sop_out_cnt", + NPPU_MR_CFG_MR_SOP_OUT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0068, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_sop_out_cnt_reg, + NULL, + NULL, + }, + { + "mr_eop_out_cnt", + NPPU_MR_CFG_MR_EOP_OUT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x006c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_eop_out_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos0_in_cnt", + NPPU_MR_CFG_MR_COS0_IN_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0070, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos0_in_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos1_in_cnt", + NPPU_MR_CFG_MR_COS1_IN_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0074, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos1_in_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos2_in_cnt", + NPPU_MR_CFG_MR_COS2_IN_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0078, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos2_in_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos3_in_cnt", + NPPU_MR_CFG_MR_COS3_IN_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x007c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos3_in_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos0_out_cnt", + NPPU_MR_CFG_MR_COS0_OUT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0080, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos0_out_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos1_out_cnt", + NPPU_MR_CFG_MR_COS1_OUT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0084, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos1_out_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos2_out_cnt", + NPPU_MR_CFG_MR_COS2_OUT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0088, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos2_out_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos3_out_cnt", + NPPU_MR_CFG_MR_COS3_OUT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x008c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos3_out_cnt_reg, + NULL, + NULL, + }, + { + "mr_err_in_cnt", + NPPU_MR_CFG_MR_ERR_IN_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0090, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_err_in_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos0_sop_in_cnt", + NPPU_MR_CFG_MR_COS0_SOP_IN_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0140, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos0_sop_in_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos0_eop_in_cnt", + NPPU_MR_CFG_MR_COS0_EOP_IN_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0144, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos0_eop_in_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos1_sop_in_cnt", + NPPU_MR_CFG_MR_COS1_SOP_IN_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0148, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos1_sop_in_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos1_eop_in_cnt", + NPPU_MR_CFG_MR_COS1_EOP_IN_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x014c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos1_eop_in_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos2_sop_in_cnt", + NPPU_MR_CFG_MR_COS2_SOP_IN_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0150, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos2_sop_in_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos2_eop_in_cnt", + NPPU_MR_CFG_MR_COS2_EOP_IN_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0154, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos2_eop_in_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos3_sop_in_cnt", + NPPU_MR_CFG_MR_COS3_SOP_IN_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0158, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos3_sop_in_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos3_eop_in_cnt", + NPPU_MR_CFG_MR_COS3_EOP_IN_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x015c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos3_eop_in_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos0_in_err_cnt", + NPPU_MR_CFG_MR_COS0_IN_ERR_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0160, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos0_in_err_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos1_in_err_cnt", + NPPU_MR_CFG_MR_COS1_IN_ERR_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0164, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos1_in_err_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos2_in_err_cnt", + NPPU_MR_CFG_MR_COS2_IN_ERR_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0168, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos2_in_err_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos3_in_err_cnt", + NPPU_MR_CFG_MR_COS3_IN_ERR_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x016c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos3_in_err_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos0_sop_out_cnt", + NPPU_MR_CFG_MR_COS0_SOP_OUT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0170, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos0_sop_out_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos0_eop_out_cnt", + NPPU_MR_CFG_MR_COS0_EOP_OUT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0174, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos0_eop_out_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos1_sop_out_cnt", + NPPU_MR_CFG_MR_COS1_SOP_OUT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0178, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos1_sop_out_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos1_eop_out_cnt", + NPPU_MR_CFG_MR_COS1_EOP_OUT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x017c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos1_eop_out_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos2_sop_out_cnt", + NPPU_MR_CFG_MR_COS2_SOP_OUT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0180, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos2_sop_out_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos2_eop_out_cnt", + NPPU_MR_CFG_MR_COS2_EOP_OUT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0184, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos2_eop_out_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos3_sop_out_cnt", + NPPU_MR_CFG_MR_COS3_SOP_OUT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0188, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos3_sop_out_cnt_reg, + NULL, + NULL, + }, + { + "mr_cos3_eop_out_cnt", + NPPU_MR_CFG_MR_COS3_EOP_OUT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x018c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_cos3_eop_out_cnt_reg, + NULL, + NULL, + }, + { + "mr_mlt_unvld_cnt", + NPPU_MR_CFG_MR_MLT_UNVLD_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0190, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_mlt_unvld_cnt_reg, + NULL, + NULL, + }, + { + "mr_sop_eop_match_cfg", + NPPU_MR_CFG_MR_SOP_EOP_MATCH_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0100, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_nppu_mr_cfg_mr_sop_eop_match_cfg_reg, + NULL, + NULL, + }, + { + "mr_mlt_unvld_mgid", + NPPU_MR_CFG_MR_MLT_UNVLD_MGIDr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_MR_CFG_BASE_ADDR + 0x0108, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_mr_cfg_mr_mlt_unvld_mgid_reg, + NULL, + NULL, + }, + { + "isch_fifo_th_1", + NPPU_PKTRX_CFG_ISCH_FIFO_TH_1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0078, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_nppu_pktrx_cfg_isch_fifo_th_1_reg, + NULL, + NULL, + }, + { + "isch_fifo_th_2", + NPPU_PKTRX_CFG_ISCH_FIFO_TH_2r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x007c, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_nppu_pktrx_cfg_isch_fifo_th_2_reg, + NULL, + NULL, + }, + { + "isch_fifo_th_3", + NPPU_PKTRX_CFG_ISCH_FIFO_TH_3r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0080, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_nppu_pktrx_cfg_isch_fifo_th_3_reg, + NULL, + NULL, + }, + { + "isch_fifo_th_4", + NPPU_PKTRX_CFG_ISCH_FIFO_TH_4r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0084, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_nppu_pktrx_cfg_isch_fifo_th_4_reg, + NULL, + NULL, + }, + { + "isch_cfg_0", + NPPU_PKTRX_CFG_ISCH_CFG_0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0088, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_isch_cfg_0_reg, + NULL, + NULL, + }, + { + "hdu_ex_tpid_0", + NPPU_PKTRX_CFG_HDU_EX_TPID_0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0090, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_nppu_pktrx_cfg_hdu_ex_tpid_0_reg, + NULL, + NULL, + }, + { + "hdu_ex_tpid_1", + NPPU_PKTRX_CFG_HDU_EX_TPID_1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0094, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_nppu_pktrx_cfg_hdu_ex_tpid_1_reg, + NULL, + NULL, + }, + { + "hdu_int_tpid_0", + NPPU_PKTRX_CFG_HDU_INT_TPID_0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0098, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_nppu_pktrx_cfg_hdu_int_tpid_0_reg, + NULL, + NULL, + }, + { + "hdu_int_tpid_1", + NPPU_PKTRX_CFG_HDU_INT_TPID_1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x009c, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_nppu_pktrx_cfg_hdu_int_tpid_1_reg, + NULL, + NULL, + }, + { + "hdu_hdlc_0", + NPPU_PKTRX_CFG_HDU_HDLC_0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x00a0, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_nppu_pktrx_cfg_hdu_hdlc_0_reg, + NULL, + NULL, + }, + { + "hdu_hdlc_1", + NPPU_PKTRX_CFG_HDU_HDLC_1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x00a4, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_nppu_pktrx_cfg_hdu_hdlc_1_reg, + NULL, + NULL, + }, + { + "hdu_udf_l3type_0", + NPPU_PKTRX_CFG_HDU_UDF_L3TYPE_0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x00a8, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_nppu_pktrx_cfg_hdu_udf_l3type_0_reg, + NULL, + NULL, + }, + { + "hdu_udf_l3type_1", + NPPU_PKTRX_CFG_HDU_UDF_L3TYPE_1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x00ac, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_nppu_pktrx_cfg_hdu_udf_l3type_1_reg, + NULL, + NULL, + }, + { + "hdu_udf_l3type_2", + NPPU_PKTRX_CFG_HDU_UDF_L3TYPE_2r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x00b0, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_nppu_pktrx_cfg_hdu_udf_l3type_2_reg, + NULL, + NULL, + }, + { + "hdu_udf_l3type_3", + NPPU_PKTRX_CFG_HDU_UDF_L3TYPE_3r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x00b4, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_nppu_pktrx_cfg_hdu_udf_l3type_3_reg, + NULL, + NULL, + }, + { + "hdu_udf_l4type_0", + NPPU_PKTRX_CFG_HDU_UDF_L4TYPE_0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x00b8, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_nppu_pktrx_cfg_hdu_udf_l4type_0_reg, + NULL, + NULL, + }, + { + "hdu_udf_l4type_1", + NPPU_PKTRX_CFG_HDU_UDF_L4TYPE_1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x00bc, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_nppu_pktrx_cfg_hdu_udf_l4type_1_reg, + NULL, + NULL, + }, + { + "hdu_udf_l4type_2", + NPPU_PKTRX_CFG_HDU_UDF_L4TYPE_2r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x00c0, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_nppu_pktrx_cfg_hdu_udf_l4type_2_reg, + NULL, + NULL, + }, + { + "slot_no_cfg", + NPPU_PKTRX_CFG_SLOT_NO_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x00d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_slot_no_cfg_reg, + NULL, + NULL, + }, + { + "pktrx_int_en_0", + NPPU_PKTRX_CFG_PKTRX_INT_EN_0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0114, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_nppu_pktrx_cfg_pktrx_int_en_0_reg, + NULL, + NULL, + }, + { + "pktrx_int_en_1", + NPPU_PKTRX_CFG_PKTRX_INT_EN_1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0118, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_nppu_pktrx_cfg_pktrx_int_en_1_reg, + NULL, + NULL, + }, + { + "pktrx_int_mask_0", + NPPU_PKTRX_CFG_PKTRX_INT_MASK_0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x011c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_nppu_pktrx_cfg_pktrx_int_mask_0_reg, + NULL, + NULL, + }, + { + "pktrx_int_mask_1", + NPPU_PKTRX_CFG_PKTRX_INT_MASK_1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0120, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_nppu_pktrx_cfg_pktrx_int_mask_1_reg, + NULL, + NULL, + }, + { + "pktrx_int_status", + NPPU_PKTRX_CFG_PKTRX_INT_STATUSr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x0124, + (32/8), + 0, + 35 + 1, + 0, + 4, + 1, + g_nppu_pktrx_cfg_pktrx_int_status_reg, + NULL, + NULL, + }, + { + "pktrx_port_rdy0", + NPPU_PKTRX_CFG_PKTRX_PORT_RDY0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x01b4, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_nppu_pktrx_cfg_pktrx_port_rdy0_reg, + NULL, + NULL, + }, + { + "pktrx_lif0_pfc_rdy0", + NPPU_PKTRX_CFG_PKTRX_LIF0_PFC_RDY0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x01bc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_pktrx_lif0_pfc_rdy0_reg, + NULL, + NULL, + }, + { + "pktrx_lif0_pfc_rdy1", + NPPU_PKTRX_CFG_PKTRX_LIF0_PFC_RDY1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x01c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_pktrx_lif0_pfc_rdy1_reg, + NULL, + NULL, + }, + { + "pktrx_lif0_pfc_rdy2", + NPPU_PKTRX_CFG_PKTRX_LIF0_PFC_RDY2r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x01c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_pktrx_lif0_pfc_rdy2_reg, + NULL, + NULL, + }, + { + "pktrx_lif0_pfc_rdy3", + NPPU_PKTRX_CFG_PKTRX_LIF0_PFC_RDY3r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x01c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_pktrx_lif0_pfc_rdy3_reg, + NULL, + NULL, + }, + { + "pktrx_lif0_pfc_rdy4", + NPPU_PKTRX_CFG_PKTRX_LIF0_PFC_RDY4r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x01cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_pktrx_lif0_pfc_rdy4_reg, + NULL, + NULL, + }, + { + "pktrx_lif0_pfc_rdy5", + NPPU_PKTRX_CFG_PKTRX_LIF0_PFC_RDY5r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x01d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_pktrx_lif0_pfc_rdy5_reg, + NULL, + NULL, + }, + { + "pktrx_lif0_pfc_rdy6", + NPPU_PKTRX_CFG_PKTRX_LIF0_PFC_RDY6r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x01d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_pktrx_lif0_pfc_rdy6_reg, + NULL, + NULL, + }, + { + "cfg_port_l2_offset_mode", + NPPU_PKTRX_CFG_CFG_PORT_L2_OFFSET_MODEr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PKTRX_CFG_BASE_ADDR + 0x01d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pktrx_cfg_cfg_port_l2_offset_mode_reg, + NULL, + NULL, + }, + { + "int_ram_en", + NPPU_IDMA_CFG_INT_RAM_ENr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_IDMA_CFG_BASE_ADDR + 0x000, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_nppu_idma_cfg_int_ram_en_reg, + NULL, + NULL, + }, + { + "int_ram_mask", + NPPU_IDMA_CFG_INT_RAM_MASKr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_IDMA_CFG_BASE_ADDR + 0x040, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_nppu_idma_cfg_int_ram_mask_reg, + NULL, + NULL, + }, + { + "int_ram_status", + NPPU_IDMA_CFG_INT_RAM_STATUSr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_IDMA_CFG_BASE_ADDR + 0x080, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_nppu_idma_cfg_int_ram_status_reg, + NULL, + NULL, + }, + { + "subsys_int_mask_flag", + NPPU_IDMA_CFG_SUBSYS_INT_MASK_FLAGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_IDMA_CFG_BASE_ADDR + 0x180, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_idma_cfg_subsys_int_mask_flag_reg, + NULL, + NULL, + }, + { + "subsys_int_unmask_flag", + NPPU_IDMA_CFG_SUBSYS_INT_UNMASK_FLAGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_IDMA_CFG_BASE_ADDR + 0x184, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_idma_cfg_subsys_int_unmask_flag_reg, + NULL, + NULL, + }, + { + "debug_cnt_rdclr_mode", + NPPU_IDMA_CFG_DEBUG_CNT_RDCLR_MODEr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_IDMA_CFG_BASE_ADDR + 0x4f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_idma_cfg_debug_cnt_rdclr_mode_reg, + NULL, + NULL, + }, + { + "int_ram_en0", + NPPU_PBU_CFG_INT_RAM_EN0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x000, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_nppu_pbu_cfg_int_ram_en0_reg, + NULL, + NULL, + }, + { + "int_ram_mask0", + NPPU_PBU_CFG_INT_RAM_MASK0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x040, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_nppu_pbu_cfg_int_ram_mask0_reg, + NULL, + NULL, + }, + { + "int_ram_status0", + NPPU_PBU_CFG_INT_RAM_STATUS0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x080, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_nppu_pbu_cfg_int_ram_status0_reg, + NULL, + NULL, + }, + { + "int_fifo_en0", + NPPU_PBU_CFG_INT_FIFO_EN0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x0c0, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_nppu_pbu_cfg_int_fifo_en0_reg, + NULL, + NULL, + }, + { + "int_fifo_en1", + NPPU_PBU_CFG_INT_FIFO_EN1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x0c4, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_nppu_pbu_cfg_int_fifo_en1_reg, + NULL, + NULL, + }, + { + "int_fifo_mask0", + NPPU_PBU_CFG_INT_FIFO_MASK0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x100, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_nppu_pbu_cfg_int_fifo_mask0_reg, + NULL, + NULL, + }, + { + "int_fifo_mask1", + NPPU_PBU_CFG_INT_FIFO_MASK1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x104, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_nppu_pbu_cfg_int_fifo_mask1_reg, + NULL, + NULL, + }, + { + "int_fifo_status0", + NPPU_PBU_CFG_INT_FIFO_STATUS0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x140, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_nppu_pbu_cfg_int_fifo_status0_reg, + NULL, + NULL, + }, + { + "int_fifo_status1", + NPPU_PBU_CFG_INT_FIFO_STATUS1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x144, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_nppu_pbu_cfg_int_fifo_status1_reg, + NULL, + NULL, + }, + { + "subsys_int_mask_flag", + NPPU_PBU_CFG_SUBSYS_INT_MASK_FLAGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x180, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_subsys_int_mask_flag_reg, + NULL, + NULL, + }, + { + "subsys_int_unmask_flag", + NPPU_PBU_CFG_SUBSYS_INT_UNMASK_FLAGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x184, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_subsys_int_unmask_flag_reg, + NULL, + NULL, + }, + { + "sa_ip_en", + NPPU_PBU_CFG_SA_IP_ENr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x4ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_sa_ip_en_reg, + NULL, + NULL, + }, + { + "debug_cnt_rdclr_mode", + NPPU_PBU_CFG_DEBUG_CNT_RDCLR_MODEr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x4f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_debug_cnt_rdclr_mode_reg, + NULL, + NULL, + }, + { + "fptr_fifo_aful_assert_cfg", + NPPU_PBU_CFG_FPTR_FIFO_AFUL_ASSERT_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x50c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_fptr_fifo_aful_assert_cfg_reg, + NULL, + NULL, + }, + { + "fptr_fifo_aful_negate_cfg", + NPPU_PBU_CFG_FPTR_FIFO_AFUL_NEGATE_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x510, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_fptr_fifo_aful_negate_cfg_reg, + NULL, + NULL, + }, + { + "pf_fifo_aful_assert_cfg", + NPPU_PBU_CFG_PF_FIFO_AFUL_ASSERT_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x514, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_pf_fifo_aful_assert_cfg_reg, + NULL, + NULL, + }, + { + "pf_fifo_aful_negate_cfg", + NPPU_PBU_CFG_PF_FIFO_AFUL_NEGATE_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x518, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_pf_fifo_aful_negate_cfg_reg, + NULL, + NULL, + }, + { + "pf_fifo_aept_assert_cfg", + NPPU_PBU_CFG_PF_FIFO_AEPT_ASSERT_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x51c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_pf_fifo_aept_assert_cfg_reg, + NULL, + NULL, + }, + { + "pf_fifo_aept_negate_cfg", + NPPU_PBU_CFG_PF_FIFO_AEPT_NEGATE_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x520, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_pf_fifo_aept_negate_cfg_reg, + NULL, + NULL, + }, + { + "wb_aful_assert_cfg", + NPPU_PBU_CFG_WB_AFUL_ASSERT_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x524, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_wb_aful_assert_cfg_reg, + NULL, + NULL, + }, + { + "wb_aful_negate_cfg", + NPPU_PBU_CFG_WB_AFUL_NEGATE_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x528, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_wb_aful_negate_cfg_reg, + NULL, + NULL, + }, + { + "se_key_aful_assert_cfg", + NPPU_PBU_CFG_SE_KEY_AFUL_ASSERT_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x52c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_se_key_aful_assert_cfg_reg, + NULL, + NULL, + }, + { + "ifbrd_se_aful_assert_cfg", + NPPU_PBU_CFG_IFBRD_SE_AFUL_ASSERT_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x534, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_ifbrd_se_aful_assert_cfg_reg, + NULL, + NULL, + }, + { + "ifbrd_se_aful_negate_cfg", + NPPU_PBU_CFG_IFBRD_SE_AFUL_NEGATE_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x538, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_ifbrd_se_aful_negate_cfg_reg, + NULL, + NULL, + }, + { + "ifbrd_odma_aful_assert_cfg", + NPPU_PBU_CFG_IFBRD_ODMA_AFUL_ASSERT_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x53c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_ifbrd_odma_aful_assert_cfg_reg, + NULL, + NULL, + }, + { + "ifbrd_odma_aful_negate_cfg", + NPPU_PBU_CFG_IFBRD_ODMA_AFUL_NEGATE_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x540, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_ifbrd_odma_aful_negate_cfg_reg, + NULL, + NULL, + }, + { + "ifbrd_ppu_aful_assert_cfg", + NPPU_PBU_CFG_IFBRD_PPU_AFUL_ASSERT_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x544, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_ifbrd_ppu_aful_assert_cfg_reg, + NULL, + NULL, + }, + { + "ifbrd_ppu_aful_negate_cfg", + NPPU_PBU_CFG_IFBRD_PPU_AFUL_NEGATE_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x548, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_ifbrd_ppu_aful_negate_cfg_reg, + NULL, + NULL, + }, + { + "mc_logic_aful_assert_cfg", + NPPU_PBU_CFG_MC_LOGIC_AFUL_ASSERT_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x54c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_mc_logic_aful_assert_cfg_reg, + NULL, + NULL, + }, + { + "mc_logic_aful_negate_cfg", + NPPU_PBU_CFG_MC_LOGIC_AFUL_NEGATE_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x550, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_mc_logic_aful_negate_cfg_reg, + NULL, + NULL, + }, + { + "mc_logic_diff", + NPPU_PBU_CFG_MC_LOGIC_DIFFr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x5e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_mc_logic_diff_reg, + NULL, + NULL, + }, + { + "cfg_peak_port_cnt_clr", + NPPU_PBU_CFG_CFG_PEAK_PORT_CNT_CLRr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x0600, + (32/8), + 0, + 3 + 1, + 0, + 4, + 1, + g_nppu_pbu_cfg_cfg_peak_port_cnt_clr_reg, + NULL, + NULL, + }, + { + "all_ftm_crdt_th", + NPPU_PBU_CFG_ALL_FTM_CRDT_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x0640, + (32/8), + 0, + 47 + 1, + 0, + 4, + 2, + g_nppu_pbu_cfg_all_ftm_crdt_th_reg, + NULL, + NULL, + }, + { + "all_ftm_link_th_01", + NPPU_PBU_CFG_ALL_FTM_LINK_TH_01r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x700, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_nppu_pbu_cfg_all_ftm_link_th_01_reg, + NULL, + NULL, + }, + { + "all_ftm_link_th_23", + NPPU_PBU_CFG_ALL_FTM_LINK_TH_23r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x704, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_nppu_pbu_cfg_all_ftm_link_th_23_reg, + NULL, + NULL, + }, + { + "all_ftm_link_th_45", + NPPU_PBU_CFG_ALL_FTM_LINK_TH_45r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x708, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_nppu_pbu_cfg_all_ftm_link_th_45_reg, + NULL, + NULL, + }, + { + "all_ftm_link_th_6", + NPPU_PBU_CFG_ALL_FTM_LINK_TH_6r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x70c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_all_ftm_link_th_6_reg, + NULL, + NULL, + }, + { + "all_ftm_total_congest_th", + NPPU_PBU_CFG_ALL_FTM_TOTAL_CONGEST_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x710, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_all_ftm_total_congest_th_reg, + NULL, + NULL, + }, + { + "cfg_crdt_mode", + NPPU_PBU_CFG_CFG_CRDT_MODEr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x720, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_cfg_crdt_mode_reg, + NULL, + NULL, + }, + { + "cfg_pfc_rdy_high_time", + NPPU_PBU_CFG_CFG_PFC_RDY_HIGH_TIMEr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x728, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_cfg_pfc_rdy_high_time_reg, + NULL, + NULL, + }, + { + "cfg_pfc_rdy_low_time", + NPPU_PBU_CFG_CFG_PFC_RDY_LOW_TIMEr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_CFG_BASE_ADDR + 0x72c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_cfg_cfg_pfc_rdy_low_time_reg, + NULL, + NULL, + }, + { + "pbu_fc_rdy", + NPPU_PBU_STAT_PBU_FC_RDYr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_STAT_BASE_ADDR + 0x580, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_nppu_pbu_stat_pbu_fc_rdy_reg, + NULL, + NULL, + }, + { + "pbu_lif_group0_rdy0", + NPPU_PBU_STAT_PBU_LIF_GROUP0_RDY0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_STAT_BASE_ADDR + 0x5c0, + (32/8), + 0, + 0, + 0, + 0, + 5, + g_nppu_pbu_stat_pbu_lif_group0_rdy0_reg, + NULL, + NULL, + }, + { + "pbu_lif_group0_rdy1", + NPPU_PBU_STAT_PBU_LIF_GROUP0_RDY1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_STAT_BASE_ADDR + 0x5c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_pbu_lif_group0_rdy1_reg, + NULL, + NULL, + }, + { + "pbu_lif_group1_rdy", + NPPU_PBU_STAT_PBU_LIF_GROUP1_RDYr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_STAT_BASE_ADDR + 0x5e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_pbu_lif_group1_rdy_reg, + NULL, + NULL, + }, + { + "pbu_lif_group0_pfc_rdy", + NPPU_PBU_STAT_PBU_LIF_GROUP0_PFC_RDYr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_STAT_BASE_ADDR + 0x0600, + (32/8), + 0, + 11 + 1, + 0, + 4, + 1, + g_nppu_pbu_stat_pbu_lif_group0_pfc_rdy_reg, + NULL, + NULL, + }, + { + "pbu_lif_group1_pfc_rdy", + NPPU_PBU_STAT_PBU_LIF_GROUP1_PFC_RDYr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_STAT_BASE_ADDR + 0x0640, + (32/8), + 0, + 1 + 1, + 0, + 4, + 1, + g_nppu_pbu_stat_pbu_lif_group1_pfc_rdy_reg, + NULL, + NULL, + }, + { + "pbu_sa_port_rdy_0_31", + NPPU_PBU_STAT_PBU_SA_PORT_RDY_0_31r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_STAT_BASE_ADDR + 0x680, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_pbu_sa_port_rdy_0_31_reg, + NULL, + NULL, + }, + { + "pbu_sa_port_rdy_32_50", + NPPU_PBU_STAT_PBU_SA_PORT_RDY_32_50r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_STAT_BASE_ADDR + 0x684, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_pbu_sa_port_rdy_32_50_reg, + NULL, + NULL, + }, + { + "pbu_pktrx_mr_pfc_rdy", + NPPU_PBU_STAT_PBU_PKTRX_MR_PFC_RDYr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_STAT_BASE_ADDR + 0x6a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_pbu_pktrx_mr_pfc_rdy_reg, + NULL, + NULL, + }, + { + "pbu_ftm_crdt_port_rdy_0_31", + NPPU_PBU_STAT_PBU_FTM_CRDT_PORT_RDY_0_31r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_STAT_BASE_ADDR + 0x6a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_pbu_ftm_crdt_port_rdy_0_31_reg, + NULL, + NULL, + }, + { + "pbu_ftm_crdt_port_rdy_32_47", + NPPU_PBU_STAT_PBU_FTM_CRDT_PORT_RDY_32_47r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_STAT_BASE_ADDR + 0x6a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_pbu_ftm_crdt_port_rdy_32_47_reg, + NULL, + NULL, + }, + { + "pbu_ftm_crdt_port_cng_rdy_0_31", + NPPU_PBU_STAT_PBU_FTM_CRDT_PORT_CNG_RDY_0_31r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_STAT_BASE_ADDR + 0x6ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_pbu_ftm_crdt_port_cng_rdy_0_31_reg, + NULL, + NULL, + }, + { + "pbu_ftm_crdt_port_cng_rdy_32_47", + NPPU_PBU_STAT_PBU_FTM_CRDT_PORT_CNG_RDY_32_47r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_STAT_BASE_ADDR + 0x6b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_pbu_ftm_crdt_port_cng_rdy_32_47_reg, + NULL, + NULL, + }, + { + "pbu_ftm_crdt_sys_info", + NPPU_PBU_STAT_PBU_FTM_CRDT_SYS_INFOr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_PBU_STAT_BASE_ADDR + 0x6b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_pbu_stat_pbu_ftm_crdt_sys_info_reg, + NULL, + NULL, + }, + { + "weight_normal_mc", + NPPU_ISU_CFG_WEIGHT_NORMAL_MCr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_CFG_BASE_ADDR + 0x0004, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_cfg_weight_normal_mc_reg, + NULL, + NULL, + }, + { + "weight_sa_mc", + NPPU_ISU_CFG_WEIGHT_SA_MCr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_CFG_BASE_ADDR + 0x0008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_cfg_weight_sa_mc_reg, + NULL, + NULL, + }, + { + "weight_etm", + NPPU_ISU_CFG_WEIGHT_ETMr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_CFG_BASE_ADDR + 0x000c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_cfg_weight_etm_reg, + NULL, + NULL, + }, + { + "weight_lp_mc", + NPPU_ISU_CFG_WEIGHT_LP_MCr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_CFG_BASE_ADDR + 0x0010, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_cfg_weight_lp_mc_reg, + NULL, + NULL, + }, + { + "weight_oam", + NPPU_ISU_CFG_WEIGHT_OAMr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_CFG_BASE_ADDR + 0x0014, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_cfg_weight_oam_reg, + NULL, + NULL, + }, + { + "weight_lif_ctrl1", + NPPU_ISU_CFG_WEIGHT_LIF_CTRL1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_CFG_BASE_ADDR + 0x0018, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_cfg_weight_lif_ctrl1_reg, + NULL, + NULL, + }, + { + "weight_lif_ctrl2", + NPPU_ISU_CFG_WEIGHT_LIF_CTRL2r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_CFG_BASE_ADDR + 0x001c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_cfg_weight_lif_ctrl2_reg, + NULL, + NULL, + }, + { + "ecc_bypass_read", + NPPU_ISU_CFG_ECC_BYPASS_READr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_CFG_BASE_ADDR + 0x0020, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_cfg_ecc_bypass_read_reg, + NULL, + NULL, + }, + { + "isu_int_mask", + NPPU_ISU_CFG_ISU_INT_MASKr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_CFG_BASE_ADDR + 0x0024, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_cfg_isu_int_mask_reg, + NULL, + NULL, + }, + { + "cfg_crdt_cycle", + NPPU_ISU_CFG_CFG_CRDT_CYCLEr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_CFG_BASE_ADDR + 0x002c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_cfg_cfg_crdt_cycle_reg, + NULL, + NULL, + }, + { + "cfg_crdt_value", + NPPU_ISU_CFG_CFG_CRDT_VALUEr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_CFG_BASE_ADDR + 0x0030, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_cfg_cfg_crdt_value_reg, + NULL, + NULL, + }, + { + "isu_int_en", + NPPU_ISU_CFG_ISU_INT_ENr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_CFG_BASE_ADDR + 0x0034, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_cfg_isu_int_en_reg, + NULL, + NULL, + }, + { + "isu_ppu_fifo_fc", + NPPU_ISU_CFG_ISU_PPU_FIFO_FCr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_CFG_BASE_ADDR + 0x0038, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_cfg_isu_ppu_fifo_fc_reg, + NULL, + NULL, + }, + { + "isu_int_status", + NPPU_ISU_CFG_ISU_INT_STATUSr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_CFG_BASE_ADDR + 0x003c, + (32/8), + 0, + 0, + 0, + 0, + 27, + g_nppu_isu_cfg_isu_int_status_reg, + NULL, + NULL, + }, + { + "fd_prog_full_assert_cfg", + NPPU_ISU_CFG_FD_PROG_FULL_ASSERT_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_CFG_BASE_ADDR + 0x0040, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_cfg_fd_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "fd_prog_full_negate_cfg", + NPPU_ISU_CFG_FD_PROG_FULL_NEGATE_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_CFG_BASE_ADDR + 0x0044, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_cfg_fd_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "lp_prog_full_assert_cfg", + NPPU_ISU_CFG_LP_PROG_FULL_ASSERT_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_CFG_BASE_ADDR + 0x0048, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_cfg_lp_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "lp_prog_full_negate_cfg", + NPPU_ISU_CFG_LP_PROG_FULL_NEGATE_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_CFG_BASE_ADDR + 0x004c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_cfg_lp_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "debug_cnt_dat0", + NPPU_ISU_STAT_DEBUG_CNT_DAT0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_STAT_BASE_ADDR + 0x000c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_stat_debug_cnt_dat0_reg, + NULL, + NULL, + }, + { + "debug_cnt_dat1", + NPPU_ISU_STAT_DEBUG_CNT_DAT1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_STAT_BASE_ADDR + 0x0010, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_stat_debug_cnt_dat1_reg, + NULL, + NULL, + }, + { + "debug_cnt_dat2", + NPPU_ISU_STAT_DEBUG_CNT_DAT2r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_STAT_BASE_ADDR + 0x0014, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_stat_debug_cnt_dat2_reg, + NULL, + NULL, + }, + { + "debug_cnt_dat3", + NPPU_ISU_STAT_DEBUG_CNT_DAT3r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_STAT_BASE_ADDR + 0x0018, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_stat_debug_cnt_dat3_reg, + NULL, + NULL, + }, + { + "debug_cnt_dat4", + NPPU_ISU_STAT_DEBUG_CNT_DAT4r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_STAT_BASE_ADDR + 0x001c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_stat_debug_cnt_dat4_reg, + NULL, + NULL, + }, + { + "debug_cnt_dat5", + NPPU_ISU_STAT_DEBUG_CNT_DAT5r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_STAT_BASE_ADDR + 0x0020, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_stat_debug_cnt_dat5_reg, + NULL, + NULL, + }, + { + "debug_cnt_dat6", + NPPU_ISU_STAT_DEBUG_CNT_DAT6r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_STAT_BASE_ADDR + 0x0024, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_stat_debug_cnt_dat6_reg, + NULL, + NULL, + }, + { + "debug_cnt_dat7", + NPPU_ISU_STAT_DEBUG_CNT_DAT7r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_STAT_BASE_ADDR + 0x0028, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_stat_debug_cnt_dat7_reg, + NULL, + NULL, + }, + { + "debug_cnt_dat8", + NPPU_ISU_STAT_DEBUG_CNT_DAT8r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_STAT_BASE_ADDR + 0x002c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_stat_debug_cnt_dat8_reg, + NULL, + NULL, + }, + { + "debug_cnt_dat9", + NPPU_ISU_STAT_DEBUG_CNT_DAT9r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_STAT_BASE_ADDR + 0x0030, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_stat_debug_cnt_dat9_reg, + NULL, + NULL, + }, + { + "debug_cnt_dat10", + NPPU_ISU_STAT_DEBUG_CNT_DAT10r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_STAT_BASE_ADDR + 0x0034, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_stat_debug_cnt_dat10_reg, + NULL, + NULL, + }, + { + "debug_cnt_dat11", + NPPU_ISU_STAT_DEBUG_CNT_DAT11r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_STAT_BASE_ADDR + 0x0038, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_stat_debug_cnt_dat11_reg, + NULL, + NULL, + }, + { + "debug_cnt_dat12", + NPPU_ISU_STAT_DEBUG_CNT_DAT12r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_STAT_BASE_ADDR + 0x003c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_stat_debug_cnt_dat12_reg, + NULL, + NULL, + }, + { + "debug_cnt_dat13", + NPPU_ISU_STAT_DEBUG_CNT_DAT13r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_STAT_BASE_ADDR + 0x0040, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_stat_debug_cnt_dat13_reg, + NULL, + NULL, + }, + { + "debug_cnt_dat14", + NPPU_ISU_STAT_DEBUG_CNT_DAT14r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_STAT_BASE_ADDR + 0x0044, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_stat_debug_cnt_dat14_reg, + NULL, + NULL, + }, + { + "debug_cnt_dat15", + NPPU_ISU_STAT_DEBUG_CNT_DAT15r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_STAT_BASE_ADDR + 0x0048, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_stat_debug_cnt_dat15_reg, + NULL, + NULL, + }, + { + "debug_cnt_dat16", + NPPU_ISU_STAT_DEBUG_CNT_DAT16r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_STAT_BASE_ADDR + 0x004c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_stat_debug_cnt_dat16_reg, + NULL, + NULL, + }, + { + "debug_cnt_dat17", + NPPU_ISU_STAT_DEBUG_CNT_DAT17r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_STAT_BASE_ADDR + 0x0050, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_stat_debug_cnt_dat17_reg, + NULL, + NULL, + }, + { + "debug_cnt_dat18", + NPPU_ISU_STAT_DEBUG_CNT_DAT18r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_STAT_BASE_ADDR + 0x0054, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_stat_debug_cnt_dat18_reg, + NULL, + NULL, + }, + { + "debug_cnt_dat19", + NPPU_ISU_STAT_DEBUG_CNT_DAT19r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_STAT_BASE_ADDR + 0x0058, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_isu_stat_debug_cnt_dat19_reg, + NULL, + NULL, + }, + { + "debug_cnt_cfg", + NPPU_ISU_STAT_DEBUG_CNT_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ISU_STAT_BASE_ADDR + 0x0100, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_nppu_isu_stat_debug_cnt_cfg_reg, + NULL, + NULL, + }, + { + "exsa_tdm_offset", + NPPU_ODMA_CFG_EXSA_TDM_OFFSETr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0014, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_exsa_tdm_offset_reg, + NULL, + NULL, + }, + { + "ecc_bypass_readt", + NPPU_ODMA_CFG_ECC_BYPASS_READTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0018, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_ecc_bypass_readt_reg, + NULL, + NULL, + }, + { + "odma_int_en_0", + NPPU_ODMA_CFG_ODMA_INT_EN_0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0020, + (32/8), + 0, + 0, + 0, + 0, + 11, + g_nppu_odma_cfg_odma_int_en_0_reg, + NULL, + NULL, + }, + { + "odma_int_en_1", + NPPU_ODMA_CFG_ODMA_INT_EN_1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0024, + (32/8), + 0, + 0, + 0, + 0, + 23, + g_nppu_odma_cfg_odma_int_en_1_reg, + NULL, + NULL, + }, + { + "odma_int_en_2", + NPPU_ODMA_CFG_ODMA_INT_EN_2r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0028, + (32/8), + 0, + 0, + 0, + 0, + 10, + g_nppu_odma_cfg_odma_int_en_2_reg, + NULL, + NULL, + }, + { + "odma_int_en_3", + NPPU_ODMA_CFG_ODMA_INT_EN_3r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x002c, + (32/8), + 0, + 0, + 0, + 0, + 13, + g_nppu_odma_cfg_odma_int_en_3_reg, + NULL, + NULL, + }, + { + "odma_int_mask_0", + NPPU_ODMA_CFG_ODMA_INT_MASK_0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0030, + (32/8), + 0, + 0, + 0, + 0, + 11, + g_nppu_odma_cfg_odma_int_mask_0_reg, + NULL, + NULL, + }, + { + "odma_int_mask_1", + NPPU_ODMA_CFG_ODMA_INT_MASK_1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0034, + (32/8), + 0, + 0, + 0, + 0, + 24, + g_nppu_odma_cfg_odma_int_mask_1_reg, + NULL, + NULL, + }, + { + "odma_int_mask_2", + NPPU_ODMA_CFG_ODMA_INT_MASK_2r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0038, + (32/8), + 0, + 0, + 0, + 0, + 10, + g_nppu_odma_cfg_odma_int_mask_2_reg, + NULL, + NULL, + }, + { + "odma_int_mask_3", + NPPU_ODMA_CFG_ODMA_INT_MASK_3r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x003c, + (32/8), + 0, + 0, + 0, + 0, + 13, + g_nppu_odma_cfg_odma_int_mask_3_reg, + NULL, + NULL, + }, + { + "odma_int_status_0", + NPPU_ODMA_CFG_ODMA_INT_STATUS_0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0040, + (32/8), + 0, + 0, + 0, + 0, + 11, + g_nppu_odma_cfg_odma_int_status_0_reg, + NULL, + NULL, + }, + { + "odma_int_status_1", + NPPU_ODMA_CFG_ODMA_INT_STATUS_1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0044, + (32/8), + 0, + 0, + 0, + 0, + 23, + g_nppu_odma_cfg_odma_int_status_1_reg, + NULL, + NULL, + }, + { + "odma_int_status_2", + NPPU_ODMA_CFG_ODMA_INT_STATUS_2r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0048, + (32/8), + 0, + 0, + 0, + 0, + 10, + g_nppu_odma_cfg_odma_int_status_2_reg, + NULL, + NULL, + }, + { + "odma_int_status_3", + NPPU_ODMA_CFG_ODMA_INT_STATUS_3r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x004c, + (32/8), + 0, + 0, + 0, + 0, + 15, + g_nppu_odma_cfg_odma_int_status_3_reg, + NULL, + NULL, + }, + { + "sp_tdm_err_nor_cfg", + NPPU_ODMA_CFG_SP_TDM_ERR_NOR_CFGr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0050, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_sp_tdm_err_nor_cfg_reg, + NULL, + NULL, + }, + { + "etm_dis_ptr_prog_full_cfg_a", + NPPU_ODMA_CFG_ETM_DIS_PTR_PROG_FULL_CFG_Ar, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0068, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_etm_dis_ptr_prog_full_cfg_a_reg, + NULL, + NULL, + }, + { + "etm_dis_ptr_prog_full_cfg_n", + NPPU_ODMA_CFG_ETM_DIS_PTR_PROG_FULL_CFG_Nr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x006c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_etm_dis_ptr_prog_full_cfg_n_reg, + NULL, + NULL, + }, + { + "ftm_dis_ptr_prog_full_cfg_a", + NPPU_ODMA_CFG_FTM_DIS_PTR_PROG_FULL_CFG_Ar, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0070, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_ftm_dis_ptr_prog_full_cfg_a_reg, + NULL, + NULL, + }, + { + "ftm_dis_ptr_prog_full_cfg_n", + NPPU_ODMA_CFG_FTM_DIS_PTR_PROG_FULL_CFG_Nr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0074, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_ftm_dis_ptr_prog_full_cfg_n_reg, + NULL, + NULL, + }, + { + "tm_dis_fifo_prog_full_cfg_a", + NPPU_ODMA_CFG_TM_DIS_FIFO_PROG_FULL_CFG_Ar, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0078, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_tm_dis_fifo_prog_full_cfg_a_reg, + NULL, + NULL, + }, + { + "tm_dis_fifo_prog_full_cfg_n", + NPPU_ODMA_CFG_TM_DIS_FIFO_PROG_FULL_CFG_Nr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x007c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_tm_dis_fifo_prog_full_cfg_n_reg, + NULL, + NULL, + }, + { + "err_prog_full_cfg_a", + NPPU_ODMA_CFG_ERR_PROG_FULL_CFG_Ar, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0088, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_err_prog_full_cfg_a_reg, + NULL, + NULL, + }, + { + "err_prog_full_cfg_n", + NPPU_ODMA_CFG_ERR_PROG_FULL_CFG_Nr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x008c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_err_prog_full_cfg_n_reg, + NULL, + NULL, + }, + { + "tdmuc_prog_full_cfg_a", + NPPU_ODMA_CFG_TDMUC_PROG_FULL_CFG_Ar, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0090, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_tdmuc_prog_full_cfg_a_reg, + NULL, + NULL, + }, + { + "tdmuc_prog_full_cfg_n", + NPPU_ODMA_CFG_TDMUC_PROG_FULL_CFG_Nr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0094, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_tdmuc_prog_full_cfg_n_reg, + NULL, + NULL, + }, + { + "tdmmc_groupid_prog_full_cfg_a", + NPPU_ODMA_CFG_TDMMC_GROUPID_PROG_FULL_CFG_Ar, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0098, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_tdmmc_groupid_prog_full_cfg_a_reg, + NULL, + NULL, + }, + { + "tdmmc_groupid_prog_full_cfg_n", + NPPU_ODMA_CFG_TDMMC_GROUPID_PROG_FULL_CFG_Nr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x009c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_tdmmc_groupid_prog_full_cfg_n_reg, + NULL, + NULL, + }, + { + "tdmmc_no_bitmap_prog_full_cfg_a", + NPPU_ODMA_CFG_TDMMC_NO_BITMAP_PROG_FULL_CFG_Ar, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x00a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_tdmmc_no_bitmap_prog_full_cfg_a_reg, + NULL, + NULL, + }, + { + "tdmmc_no_bitmap_prog_full_cfg_n", + NPPU_ODMA_CFG_TDMMC_NO_BITMAP_PROG_FULL_CFG_Nr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x00a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_tdmmc_no_bitmap_prog_full_cfg_n_reg, + NULL, + NULL, + }, + { + "tdmmc_prog_full_cfg_a", + NPPU_ODMA_CFG_TDMMC_PROG_FULL_CFG_Ar, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x00a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_tdmmc_prog_full_cfg_a_reg, + NULL, + NULL, + }, + { + "tdmmc_prog_full_cfg_n", + NPPU_ODMA_CFG_TDMMC_PROG_FULL_CFG_Nr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x00ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_tdmmc_prog_full_cfg_n_reg, + NULL, + NULL, + }, + { + "desc_prog_full_cfg_a", + NPPU_ODMA_CFG_DESC_PROG_FULL_CFG_Ar, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x00b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_desc_prog_full_cfg_a_reg, + NULL, + NULL, + }, + { + "desc_prog_full_cfg_n", + NPPU_ODMA_CFG_DESC_PROG_FULL_CFG_Nr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x00b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_desc_prog_full_cfg_n_reg, + NULL, + NULL, + }, + { + "dly_prog_full_cfg_a", + NPPU_ODMA_CFG_DLY_PROG_FULL_CFG_Ar, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x00b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_dly_prog_full_cfg_a_reg, + NULL, + NULL, + }, + { + "dly_prog_full_cfg_n", + NPPU_ODMA_CFG_DLY_PROG_FULL_CFG_Nr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x00bc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_dly_prog_full_cfg_n_reg, + NULL, + NULL, + }, + { + "rsp_prog_full_cfg_a", + NPPU_ODMA_CFG_RSP_PROG_FULL_CFG_Ar, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x00c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_rsp_prog_full_cfg_a_reg, + NULL, + NULL, + }, + { + "rsp_prog_full_cfg_n", + NPPU_ODMA_CFG_RSP_PROG_FULL_CFG_Nr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x00c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_rsp_prog_full_cfg_n_reg, + NULL, + NULL, + }, + { + "nor_prog_full_cfg_a", + NPPU_ODMA_CFG_NOR_PROG_FULL_CFG_Ar, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x00c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_nor_prog_full_cfg_a_reg, + NULL, + NULL, + }, + { + "nor_prog_full_cfg_n", + NPPU_ODMA_CFG_NOR_PROG_FULL_CFG_Nr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x00cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_nor_prog_full_cfg_n_reg, + NULL, + NULL, + }, + { + "etm_nor_prog_full_cfg_a", + NPPU_ODMA_CFG_ETM_NOR_PROG_FULL_CFG_Ar, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x00d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_etm_nor_prog_full_cfg_a_reg, + NULL, + NULL, + }, + { + "etm_nor_prog_full_cfg_n", + NPPU_ODMA_CFG_ETM_NOR_PROG_FULL_CFG_Nr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x00d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_etm_nor_prog_full_cfg_n_reg, + NULL, + NULL, + }, + { + "ftm_nor_prog_full_cfg_a", + NPPU_ODMA_CFG_FTM_NOR_PROG_FULL_CFG_Ar, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x00d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_ftm_nor_prog_full_cfg_a_reg, + NULL, + NULL, + }, + { + "ftm_nor_prog_full_cfg_n", + NPPU_ODMA_CFG_FTM_NOR_PROG_FULL_CFG_Nr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x00dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_ftm_nor_prog_full_cfg_n_reg, + NULL, + NULL, + }, + { + "etm_prog_full_cfg_a", + NPPU_ODMA_CFG_ETM_PROG_FULL_CFG_Ar, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x00e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_etm_prog_full_cfg_a_reg, + NULL, + NULL, + }, + { + "etm_prog_full_cfg_n", + NPPU_ODMA_CFG_ETM_PROG_FULL_CFG_Nr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x00e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_etm_prog_full_cfg_n_reg, + NULL, + NULL, + }, + { + "ftm_prog_full_cfg_a", + NPPU_ODMA_CFG_FTM_PROG_FULL_CFG_Ar, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x00e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_ftm_prog_full_cfg_a_reg, + NULL, + NULL, + }, + { + "ftm_prog_full_cfg_n", + NPPU_ODMA_CFG_FTM_PROG_FULL_CFG_Nr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x00ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_ftm_prog_full_cfg_n_reg, + NULL, + NULL, + }, + { + "etm_nrdcnt_prog_full_cfg_a", + NPPU_ODMA_CFG_ETM_NRDCNT_PROG_FULL_CFG_Ar, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x00f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_etm_nrdcnt_prog_full_cfg_a_reg, + NULL, + NULL, + }, + { + "etm_nrdcnt_prog_full_cfg_n", + NPPU_ODMA_CFG_ETM_NRDCNT_PROG_FULL_CFG_Nr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x00f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_etm_nrdcnt_prog_full_cfg_n_reg, + NULL, + NULL, + }, + { + "ftm_nrdcnt_prog_full_cfg_a", + NPPU_ODMA_CFG_FTM_NRDCNT_PROG_FULL_CFG_Ar, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x00f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_ftm_nrdcnt_prog_full_cfg_a_reg, + NULL, + NULL, + }, + { + "ftm_nrdcnt_prog_full_cfg_n", + NPPU_ODMA_CFG_FTM_NRDCNT_PROG_FULL_CFG_Nr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x00fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_ftm_nrdcnt_prog_full_cfg_n_reg, + NULL, + NULL, + }, + { + "pp_prog_full_cfg_a", + NPPU_ODMA_CFG_PP_PROG_FULL_CFG_Ar, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0104, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_pp_prog_full_cfg_a_reg, + NULL, + NULL, + }, + { + "pp_prog_full_cfg_n", + NPPU_ODMA_CFG_PP_PROG_FULL_CFG_Nr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0108, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_pp_prog_full_cfg_n_reg, + NULL, + NULL, + }, + { + "tm_weight", + NPPU_ODMA_CFG_TM_WEIGHTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x010c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_tm_weight_reg, + NULL, + NULL, + }, + { + "pp_weight", + NPPU_ODMA_CFG_PP_WEIGHTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0110, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_pp_weight_reg, + NULL, + NULL, + }, + { + "ifbcmd_prog_full_cfg_a", + NPPU_ODMA_CFG_IFBCMD_PROG_FULL_CFG_Ar, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0218, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_ifbcmd_prog_full_cfg_a_reg, + NULL, + NULL, + }, + { + "ifbcmd_prog_full_cfg_n", + NPPU_ODMA_CFG_IFBCMD_PROG_FULL_CFG_Nr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x021c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_ifbcmd_prog_full_cfg_n_reg, + NULL, + NULL, + }, + { + "mccnt_prog_full_cfg_a", + NPPU_ODMA_CFG_MCCNT_PROG_FULL_CFG_Ar, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0220, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_mccnt_prog_full_cfg_a_reg, + NULL, + NULL, + }, + { + "mccnt_prog_full_cfg_n", + NPPU_ODMA_CFG_MCCNT_PROG_FULL_CFG_Nr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0224, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_mccnt_prog_full_cfg_n_reg, + NULL, + NULL, + }, + { + "int_or_pon", + NPPU_ODMA_CFG_INT_OR_PONr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x228, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_int_or_pon_reg, + NULL, + NULL, + }, + { + "quemng_cnt_in_err_cnt", + NPPU_ODMA_CFG_QUEMNG_CNT_IN_ERR_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x22c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_quemng_cnt_in_err_cnt_reg, + NULL, + NULL, + }, + { + "lif0_port_eop_cnt", + NPPU_ODMA_CFG_LIF0_PORT_EOP_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x240, + (32/8), + 0, + 47 + 1, + 0, + 4, + 1, + g_nppu_odma_cfg_lif0_port_eop_cnt_reg, + NULL, + NULL, + }, + { + "lif1_port_eop_cnt", + NPPU_ODMA_CFG_LIF1_PORT_EOP_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x300, + (32/8), + 0, + 7 + 1, + 0, + 4, + 1, + g_nppu_odma_cfg_lif1_port_eop_cnt_reg, + NULL, + NULL, + }, + { + "lifc_port0_eop_cnt", + NPPU_ODMA_CFG_LIFC_PORT0_EOP_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x320, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_lifc_port0_eop_cnt_reg, + NULL, + NULL, + }, + { + "lifc_port1_eop_cnt", + NPPU_ODMA_CFG_LIFC_PORT1_EOP_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x324, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_lifc_port1_eop_cnt_reg, + NULL, + NULL, + }, + { + "fptr_fifo_prog_ept_cfg_n", + NPPU_ODMA_CFG_FPTR_FIFO_PROG_EPT_CFG_Nr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0404, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_fptr_fifo_prog_ept_cfg_n_reg, + NULL, + NULL, + }, + { + "isu_fifo_prog_full_cfg_a", + NPPU_ODMA_CFG_ISU_FIFO_PROG_FULL_CFG_Ar, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x0408, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_isu_fifo_prog_full_cfg_a_reg, + NULL, + NULL, + }, + { + "isu_fifo_prog_full_cfg_n", + NPPU_ODMA_CFG_ISU_FIFO_PROG_FULL_CFG_Nr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_ODMA_CFG_BASE_ADDR + 0x040c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_odma_cfg_isu_fifo_prog_full_cfg_n_reg, + NULL, + NULL, + }, + { + "ind_access_done", + NPPU_OAM_CFG_IND_ACCESS_DONEr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ind_access_done_reg, + NULL, + NULL, + }, + { + "ind_access_command", + NPPU_OAM_CFG_IND_ACCESS_COMMANDr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0004, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_nppu_oam_cfg_ind_access_command_reg, + NULL, + NULL, + }, + { + "ind_dat0", + NPPU_OAM_CFG_IND_DAT0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ind_dat0_reg, + NULL, + NULL, + }, + { + "ind_dat1", + NPPU_OAM_CFG_IND_DAT1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x000c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ind_dat1_reg, + NULL, + NULL, + }, + { + "ind_dat2", + NPPU_OAM_CFG_IND_DAT2r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0010, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ind_dat2_reg, + NULL, + NULL, + }, + { + "ind_dat3", + NPPU_OAM_CFG_IND_DAT3r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0014, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ind_dat3_reg, + NULL, + NULL, + }, + { + "oam_tx_main_en", + NPPU_OAM_CFG_OAM_TX_MAIN_ENr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0018, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_oam_tx_main_en_reg, + NULL, + NULL, + }, + { + "tx_total_num", + NPPU_OAM_CFG_TX_TOTAL_NUMr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x001c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_tx_total_num_reg, + NULL, + NULL, + }, + { + "oam_chk_main_en", + NPPU_OAM_CFG_OAM_CHK_MAIN_ENr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0020, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_oam_chk_main_en_reg, + NULL, + NULL, + }, + { + "chk_total_num0", + NPPU_OAM_CFG_CHK_TOTAL_NUM0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0024, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_chk_total_num0_reg, + NULL, + NULL, + }, + { + "ma_chk_main_en", + NPPU_OAM_CFG_MA_CHK_MAIN_ENr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0028, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ma_chk_main_en_reg, + NULL, + NULL, + }, + { + "chk_total_num1", + NPPU_OAM_CFG_CHK_TOTAL_NUM1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x002c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_chk_total_num1_reg, + NULL, + NULL, + }, + { + "tx_stat_en", + NPPU_OAM_CFG_TX_STAT_ENr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0034, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_tx_stat_en_reg, + NULL, + NULL, + }, + { + "rec_stat_en", + NPPU_OAM_CFG_REC_STAT_ENr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0038, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_rec_stat_en_reg, + NULL, + NULL, + }, + { + "stat_oam_rdy_mask", + NPPU_OAM_CFG_STAT_OAM_RDY_MASKr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x003c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_stat_oam_rdy_mask_reg, + NULL, + NULL, + }, + { + "session_grading0", + NPPU_OAM_CFG_SESSION_GRADING0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0040, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_session_grading0_reg, + NULL, + NULL, + }, + { + "session_grading1", + NPPU_OAM_CFG_SESSION_GRADING1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0044, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_session_grading1_reg, + NULL, + NULL, + }, + { + "session_grading2", + NPPU_OAM_CFG_SESSION_GRADING2r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0048, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_session_grading2_reg, + NULL, + NULL, + }, + { + "session_grading3", + NPPU_OAM_CFG_SESSION_GRADING3r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x004c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_session_grading3_reg, + NULL, + NULL, + }, + { + "bfd_chk_haddr", + NPPU_OAM_CFG_BFD_CHK_HADDRr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0050, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_bfd_chk_haddr_reg, + NULL, + NULL, + }, + { + "ethccm_chk_haddr", + NPPU_OAM_CFG_ETHCCM_CHK_HADDRr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0054, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ethccm_chk_haddr_reg, + NULL, + NULL, + }, + { + "tpbfd_chk_haddr", + NPPU_OAM_CFG_TPBFD_CHK_HADDRr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0058, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_tpbfd_chk_haddr_reg, + NULL, + NULL, + }, + { + "tpoam_ccm_chk_haddr", + NPPU_OAM_CFG_TPOAM_CCM_CHK_HADDRr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x005c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_tpoam_ccm_chk_haddr_reg, + NULL, + NULL, + }, + { + "bfd_tx_haddr", + NPPU_OAM_CFG_BFD_TX_HADDRr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0060, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_bfd_tx_haddr_reg, + NULL, + NULL, + }, + { + "ethccm_tx_haddr", + NPPU_OAM_CFG_ETHCCM_TX_HADDRr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0064, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ethccm_tx_haddr_reg, + NULL, + NULL, + }, + { + "tpbfd_tx_haddr", + NPPU_OAM_CFG_TPBFD_TX_HADDRr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0068, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_tpbfd_tx_haddr_reg, + NULL, + NULL, + }, + { + "tpoam_ccm_tx_haddr", + NPPU_OAM_CFG_TPOAM_CCM_TX_HADDRr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x006c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_tpoam_ccm_tx_haddr_reg, + NULL, + NULL, + }, + { + "ethccm_ma_chk_haddr", + NPPU_OAM_CFG_ETHCCM_MA_CHK_HADDRr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0070, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ethccm_ma_chk_haddr_reg, + NULL, + NULL, + }, + { + "tpccm_ma_chk_haddr", + NPPU_OAM_CFG_TPCCM_MA_CHK_HADDRr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0074, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_tpccm_ma_chk_haddr_reg, + NULL, + NULL, + }, + { + "groupnum_ram_clr", + NPPU_OAM_CFG_GROUPNUM_RAM_CLRr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0078, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_groupnum_ram_clr_reg, + NULL, + NULL, + }, + { + "index_ram0_clr", + NPPU_OAM_CFG_INDEX_RAM0_CLRr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x007c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_index_ram0_clr_reg, + NULL, + NULL, + }, + { + "index_ram1_clr", + NPPU_OAM_CFG_INDEX_RAM1_CLRr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0080, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_index_ram1_clr_reg, + NULL, + NULL, + }, + { + "rmep_ram_clr", + NPPU_OAM_CFG_RMEP_RAM_CLRr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0084, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_rmep_ram_clr_reg, + NULL, + NULL, + }, + { + "ma_ram_clr", + NPPU_OAM_CFG_MA_RAM_CLRr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0088, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ma_ram_clr_reg, + NULL, + NULL, + }, + { + "ram_init_done", + NPPU_OAM_CFG_RAM_INIT_DONEr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x008c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ram_init_done_reg, + NULL, + NULL, + }, + { + "rec_bfd_debug_en", + NPPU_OAM_CFG_REC_BFD_DEBUG_ENr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0090, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_rec_bfd_debug_en_reg, + NULL, + NULL, + }, + { + "oam_session_int", + NPPU_OAM_CFG_OAM_SESSION_INTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0098, + (32/8), + 0, + 0, + 0, + 0, + 6, + g_nppu_oam_cfg_oam_session_int_reg, + NULL, + NULL, + }, + { + "pon_int", + NPPU_OAM_CFG_PON_INTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x009c, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_nppu_oam_cfg_pon_int_reg, + NULL, + NULL, + }, + { + "oam_int_clr", + NPPU_OAM_CFG_OAM_INT_CLRr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x00a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_oam_int_clr_reg, + NULL, + NULL, + }, + { + "type_int_clr0", + NPPU_OAM_CFG_TYPE_INT_CLR0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x00a4, + (32/8), + 0, + 0, + 0, + 0, + 6, + g_nppu_oam_cfg_type_int_clr0_reg, + NULL, + NULL, + }, + { + "type_int_clr1", + NPPU_OAM_CFG_TYPE_INT_CLR1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x00a8, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_nppu_oam_cfg_type_int_clr1_reg, + NULL, + NULL, + }, + { + "interrupt_mask", + NPPU_OAM_CFG_INTERRUPT_MASKr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x00ac, + (32/8), + 0, + 0, + 0, + 0, + 8, + g_nppu_oam_cfg_interrupt_mask_reg, + NULL, + NULL, + }, + { + "int0_index", + NPPU_OAM_CFG_INT0_INDEXr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x00b0, + (32/8), + 0, + 3 + 1, + 0, + 4, + 1, + g_nppu_oam_cfg_int0_index_reg, + NULL, + NULL, + }, + { + "int1_index", + NPPU_OAM_CFG_INT1_INDEXr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x00c0, + (32/8), + 0, + 3 + 1, + 0, + 4, + 1, + g_nppu_oam_cfg_int1_index_reg, + NULL, + NULL, + }, + { + "int0_index_region", + NPPU_OAM_CFG_INT0_INDEX_REGIONr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x00d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_int0_index_region_reg, + NULL, + NULL, + }, + { + "int1_index_region", + NPPU_OAM_CFG_INT1_INDEX_REGIONr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x00d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_int1_index_region_reg, + NULL, + NULL, + }, + { + "bdiinfo_fwft_fifo_th", + NPPU_OAM_CFG_BDIINFO_FWFT_FIFO_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x00d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_bdiinfo_fwft_fifo_th_reg, + NULL, + NULL, + }, + { + "recsec_fwft_fifo_th", + NPPU_OAM_CFG_RECSEC_FWFT_FIFO_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x00dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_recsec_fwft_fifo_th_reg, + NULL, + NULL, + }, + { + "timing_chk_info0_fwft_fifo_th", + NPPU_OAM_CFG_TIMING_CHK_INFO0_FWFT_FIFO_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x00e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_timing_chk_info0_fwft_fifo_th_reg, + NULL, + NULL, + }, + { + "recma_fwft_fifo_th", + NPPU_OAM_CFG_RECMA_FWFT_FIFO_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x00e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_recma_fwft_fifo_th_reg, + NULL, + NULL, + }, + { + "timing_chk_info1_fwft_fifo_th", + NPPU_OAM_CFG_TIMING_CHK_INFO1_FWFT_FIFO_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x00e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_timing_chk_info1_fwft_fifo_th_reg, + NULL, + NULL, + }, + { + "oam_txinst_fifo_th", + NPPU_OAM_CFG_OAM_TXINST_FIFO_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x00ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_oam_txinst_fifo_th_reg, + NULL, + NULL, + }, + { + "oam_rdinfo_fwft_fifo_th", + NPPU_OAM_CFG_OAM_RDINFO_FWFT_FIFO_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x00f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_oam_rdinfo_fwft_fifo_th_reg, + NULL, + NULL, + }, + { + "lm_cnt_fwft_fifo_th", + NPPU_OAM_CFG_LM_CNT_FWFT_FIFO_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x00f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_lm_cnt_fwft_fifo_th_reg, + NULL, + NULL, + }, + { + "oam_pkt_fifo_th", + NPPU_OAM_CFG_OAM_PKT_FIFO_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x00f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_oam_pkt_fifo_th_reg, + NULL, + NULL, + }, + { + "reclm_stat_fifo_th", + NPPU_OAM_CFG_RECLM_STAT_FIFO_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x00fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_reclm_stat_fifo_th_reg, + NULL, + NULL, + }, + { + "txlm_stat_fifo_th", + NPPU_OAM_CFG_TXLM_STAT_FIFO_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x00100, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_txlm_stat_fifo_th_reg, + NULL, + NULL, + }, + { + "oam_chk_fwft_fifo_th", + NPPU_OAM_CFG_OAM_CHK_FWFT_FIFO_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0104, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_oam_chk_fwft_fifo_th_reg, + NULL, + NULL, + }, + { + "txoam_stat_fifo_th", + NPPU_OAM_CFG_TXOAM_STAT_FIFO_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0108, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_txoam_stat_fifo_th_reg, + NULL, + NULL, + }, + { + "recoam_stat_fifo_th", + NPPU_OAM_CFG_RECOAM_STAT_FIFO_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x010c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_recoam_stat_fifo_th_reg, + NULL, + NULL, + }, + { + "txpkt_data_fwft_fifo_th", + NPPU_OAM_CFG_TXPKT_DATA_FWFT_FIFO_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0110, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_txpkt_data_fwft_fifo_th_reg, + NULL, + NULL, + }, + { + "tstpkt_fwft_fifo_th", + NPPU_OAM_CFG_TSTPKT_FWFT_FIFO_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0114, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_tstpkt_fwft_fifo_th_reg, + NULL, + NULL, + }, + { + "tst_txinst_fwft_fifo_th", + NPPU_OAM_CFG_TST_TXINST_FWFT_FIFO_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0118, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_tst_txinst_fwft_fifo_th_reg, + NULL, + NULL, + }, + { + "tstrx_main_en", + NPPU_OAM_CFG_TSTRX_MAIN_ENr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x011c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_tstrx_main_en_reg, + NULL, + NULL, + }, + { + "tsttx_cfg_para_tbl2", + NPPU_OAM_CFG_TSTTX_CFG_PARA_TBL2r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0120, + (32/8), + 0, + 9 + 1, + 0, + 12, + 8, + g_nppu_oam_cfg_tsttx_cfg_para_tbl2_reg, + NULL, + NULL, + }, + { + "tsttx_cfg_para_tbl1", + NPPU_OAM_CFG_TSTTX_CFG_PARA_TBL1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0124, + (32/8), + 0, + 9 + 1, + 0, + 12, + 1, + g_nppu_oam_cfg_tsttx_cfg_para_tbl1_reg, + NULL, + NULL, + }, + { + "tsttx_cfg_para_tbl0", + NPPU_OAM_CFG_TSTTX_CFG_PARA_TBL0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0128, + (32/8), + 0, + 9 + 1, + 0, + 12, + 3, + g_nppu_oam_cfg_tsttx_cfg_para_tbl0_reg, + NULL, + NULL, + }, + { + "tstrx_cfg_para", + NPPU_OAM_CFG_TSTRX_CFG_PARAr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0198, + (32/8), + 0, + 0x9 + 1, + 0, + 4, + 2, + g_nppu_oam_cfg_tstrx_cfg_para_reg, + NULL, + NULL, + }, + { + "fifo_status_int_en_0", + NPPU_OAM_CFG_FIFO_STATUS_INT_EN_0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x01c0, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_nppu_oam_cfg_fifo_status_int_en_0_reg, + NULL, + NULL, + }, + { + "fifo_status_int_en_1", + NPPU_OAM_CFG_FIFO_STATUS_INT_EN_1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x01c4, + (32/8), + 0, + 0, + 0, + 0, + 10, + g_nppu_oam_cfg_fifo_status_int_en_1_reg, + NULL, + NULL, + }, + { + "fifo_status_int_mask_0", + NPPU_OAM_CFG_FIFO_STATUS_INT_MASK_0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x01c8, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_nppu_oam_cfg_fifo_status_int_mask_0_reg, + NULL, + NULL, + }, + { + "fifo_status_int_mask_1", + NPPU_OAM_CFG_FIFO_STATUS_INT_MASK_1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x01cc, + (32/8), + 0, + 0, + 0, + 0, + 10, + g_nppu_oam_cfg_fifo_status_int_mask_1_reg, + NULL, + NULL, + }, + { + "fifo_status_int_status", + NPPU_OAM_CFG_FIFO_STATUS_INT_STATUSr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x01d0, + (32/8), + 0, + 39 + 1, + 0, + 4, + 1, + g_nppu_oam_cfg_fifo_status_int_status_reg, + NULL, + NULL, + }, + { + "main_frequency", + NPPU_OAM_CFG_MAIN_FREQUENCYr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0270, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_main_frequency_reg, + NULL, + NULL, + }, + { + "oam_cfg_type", + NPPU_OAM_CFG_OAM_CFG_TYPEr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0274, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_oam_cfg_type_reg, + NULL, + NULL, + }, + { + "fst_swch_eth_head0", + NPPU_OAM_CFG_FST_SWCH_ETH_HEAD0r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0278, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_fst_swch_eth_head0_reg, + NULL, + NULL, + }, + { + "fst_swch_eth_head1", + NPPU_OAM_CFG_FST_SWCH_ETH_HEAD1r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x027c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_fst_swch_eth_head1_reg, + NULL, + NULL, + }, + { + "fst_swch_eth_head2", + NPPU_OAM_CFG_FST_SWCH_ETH_HEAD2r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0280, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_fst_swch_eth_head2_reg, + NULL, + NULL, + }, + { + "fst_swch_eth_head3", + NPPU_OAM_CFG_FST_SWCH_ETH_HEAD3r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0284, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_fst_swch_eth_head3_reg, + NULL, + NULL, + }, + { + "oam_fs_txinst_fifo_th", + NPPU_OAM_CFG_OAM_FS_TXINST_FIFO_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0288, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_oam_fs_txinst_fifo_th_reg, + NULL, + NULL, + }, + { + "oam_ma_fs_txinst_fifo_th", + NPPU_OAM_CFG_OAM_MA_FS_TXINST_FIFO_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x028c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_oam_ma_fs_txinst_fifo_th_reg, + NULL, + NULL, + }, + { + "pon_int_ram_clr", + NPPU_OAM_CFG_PON_INT_RAM_CLRr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0290, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_pon_int_ram_clr_reg, + NULL, + NULL, + }, + { + "pon_p_int_index", + NPPU_OAM_CFG_PON_P_INT_INDEXr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0294, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_pon_p_int_index_reg, + NULL, + NULL, + }, + { + "pon_protect_pkt_fifo_th", + NPPU_OAM_CFG_PON_PROTECT_PKT_FIFO_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0298, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_pon_protect_pkt_fifo_th_reg, + NULL, + NULL, + }, + { + "pon_laser_off_en", + NPPU_OAM_CFG_PON_LASER_OFF_ENr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x029c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_pon_laser_off_en_reg, + NULL, + NULL, + }, + { + "pon_prtct_pkt_tx_en", + NPPU_OAM_CFG_PON_PRTCT_PKT_TX_ENr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x02a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_pon_prtct_pkt_tx_en_reg, + NULL, + NULL, + }, + { + "cfg_pon_master", + NPPU_OAM_CFG_CFG_PON_MASTERr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x02a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_cfg_pon_master_reg, + NULL, + NULL, + }, + { + "level_mode", + NPPU_OAM_CFG_LEVEL_MODEr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x02a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_level_mode_reg, + NULL, + NULL, + }, + { + "interrupt_en", + NPPU_OAM_CFG_INTERRUPT_ENr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x02ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_interrupt_en_reg, + NULL, + NULL, + }, + { + "pon_laser_on_en", + NPPU_OAM_CFG_PON_LASER_ON_ENr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x02b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_pon_laser_on_en_reg, + NULL, + NULL, + }, + { + "ti_pon_sd", + NPPU_OAM_CFG_TI_PON_SDr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x02b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ti_pon_sd_reg, + NULL, + NULL, + }, + { + "ti_pon_los", + NPPU_OAM_CFG_TI_PON_LOSr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x02b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ti_pon_los_reg, + NULL, + NULL, + }, + { + "ind_dat4", + NPPU_OAM_CFG_IND_DAT4r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x02bc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ind_dat4_reg, + NULL, + NULL, + }, + { + "ind_dat5", + NPPU_OAM_CFG_IND_DAT5r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x02c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ind_dat5_reg, + NULL, + NULL, + }, + { + "ind_dat6", + NPPU_OAM_CFG_IND_DAT6r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x02c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ind_dat6_reg, + NULL, + NULL, + }, + { + "ind_dat7", + NPPU_OAM_CFG_IND_DAT7r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x02c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ind_dat7_reg, + NULL, + NULL, + }, + { + "ind_dat8", + NPPU_OAM_CFG_IND_DAT8r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x02cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ind_dat8_reg, + NULL, + NULL, + }, + { + "ind_dat9", + NPPU_OAM_CFG_IND_DAT9r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x02d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ind_dat9_reg, + NULL, + NULL, + }, + { + "ind_dat10", + NPPU_OAM_CFG_IND_DAT10r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x02d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ind_dat10_reg, + NULL, + NULL, + }, + { + "ind_dat11", + NPPU_OAM_CFG_IND_DAT11r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x02d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ind_dat11_reg, + NULL, + NULL, + }, + { + "ind_dat12", + NPPU_OAM_CFG_IND_DAT12r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x02dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ind_dat12_reg, + NULL, + NULL, + }, + { + "ind_dat13", + NPPU_OAM_CFG_IND_DAT13r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x02e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ind_dat13_reg, + NULL, + NULL, + }, + { + "ind_dat14", + NPPU_OAM_CFG_IND_DAT14r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x02e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ind_dat14_reg, + NULL, + NULL, + }, + { + "ind_dat15", + NPPU_OAM_CFG_IND_DAT15r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x02e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ind_dat15_reg, + NULL, + NULL, + }, + { + "oam_2544_pkt_fifo_th", + NPPU_OAM_CFG_OAM_2544_PKT_FIFO_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x02ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_oam_2544_pkt_fifo_th_reg, + NULL, + NULL, + }, + { + "txinfo_ram_clr", + NPPU_OAM_CFG_TXINFO_RAM_CLRr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x02f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_txinfo_ram_clr_reg, + NULL, + NULL, + }, + { + "txinfo_ram_init_done", + NPPU_OAM_CFG_TXINFO_RAM_INIT_DONEr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x02f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_txinfo_ram_init_done_reg, + NULL, + NULL, + }, + { + "fifo_status_int_status40", + NPPU_OAM_CFG_FIFO_STATUS_INT_STATUS40r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x02f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_fifo_status_int_status40_reg, + NULL, + NULL, + }, + { + "fifo_status_int_status41", + NPPU_OAM_CFG_FIFO_STATUS_INT_STATUS41r, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x02fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_fifo_status_int_status41_reg, + NULL, + NULL, + }, + { + "oam_2544_fun_en", + NPPU_OAM_CFG_OAM_2544_FUN_ENr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0300, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_oam_2544_fun_en_reg, + NULL, + NULL, + }, + { + "oam_2544_stat_clr", + NPPU_OAM_CFG_OAM_2544_STAT_CLRr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0304, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_oam_2544_stat_clr_reg, + NULL, + NULL, + }, + { + "txdis_default", + NPPU_OAM_CFG_TXDIS_DEFAULTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0308, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_txdis_default_reg, + NULL, + NULL, + }, + { + "txdis_default_en", + NPPU_OAM_CFG_TXDIS_DEFAULT_ENr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x030c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_txdis_default_en_reg, + NULL, + NULL, + }, + { + "tpbfd_firstchk_th", + NPPU_OAM_CFG_TPBFD_FIRSTCHK_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0310, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_tpbfd_firstchk_th_reg, + NULL, + NULL, + }, + { + "ethccm_firstchk_th", + NPPU_OAM_CFG_ETHCCM_FIRSTCHK_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0314, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_ethccm_firstchk_th_reg, + NULL, + NULL, + }, + { + "tpccm_firstchk_th", + NPPU_OAM_CFG_TPCCM_FIRSTCHK_THr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_CFG_BASE_ADDR + 0x0318, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_cfg_tpccm_firstchk_th_reg, + NULL, + NULL, + }, + { + "txstat_req_cnt", + NPPU_OAM_STAT_TXSTAT_REQ_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_txstat_req_cnt_reg, + NULL, + NULL, + }, + { + "chkstat_req_cnt", + NPPU_OAM_STAT_CHKSTAT_REQ_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0004, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_chkstat_req_cnt_reg, + NULL, + NULL, + }, + { + "stat_oam_fc_cnt", + NPPU_OAM_STAT_STAT_OAM_FC_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_stat_oam_fc_cnt_reg, + NULL, + NULL, + }, + { + "bfdseq_req_cnt", + NPPU_OAM_STAT_BFDSEQ_REQ_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x000c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_bfdseq_req_cnt_reg, + NULL, + NULL, + }, + { + "lmcnt_req_cnt", + NPPU_OAM_STAT_LMCNT_REQ_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0010, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_lmcnt_req_cnt_reg, + NULL, + NULL, + }, + { + "stat_oam_lm_rsp_cnt", + NPPU_OAM_STAT_STAT_OAM_LM_RSP_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0014, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_stat_oam_lm_rsp_cnt_reg, + NULL, + NULL, + }, + { + "stat_oam_lm_fc_cnt", + NPPU_OAM_STAT_STAT_OAM_LM_FC_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0018, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_stat_oam_lm_fc_cnt_reg, + NULL, + NULL, + }, + { + "se_req_cnt", + NPPU_OAM_STAT_SE_REQ_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x001c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_se_req_cnt_reg, + NULL, + NULL, + }, + { + "se_rsp_cnt", + NPPU_OAM_STAT_SE_RSP_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0020, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_se_rsp_cnt_reg, + NULL, + NULL, + }, + { + "se_oam_fc_cnt", + NPPU_OAM_STAT_SE_OAM_FC_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0024, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_se_oam_fc_cnt_reg, + NULL, + NULL, + }, + { + "oam_se_fc_cnt", + NPPU_OAM_STAT_OAM_SE_FC_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0028, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_oam_se_fc_cnt_reg, + NULL, + NULL, + }, + { + "oam_pktrx_sop_cnt", + NPPU_OAM_STAT_OAM_PKTRX_SOP_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x002c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_oam_pktrx_sop_cnt_reg, + NULL, + NULL, + }, + { + "oam_pktrx_eop_cnt", + NPPU_OAM_STAT_OAM_PKTRX_EOP_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0030, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_oam_pktrx_eop_cnt_reg, + NULL, + NULL, + }, + { + "pktrx_oam_fc_cnt", + NPPU_OAM_STAT_PKTRX_OAM_FC_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0034, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_pktrx_oam_fc_cnt_reg, + NULL, + NULL, + }, + { + "pktrx_oam_tst_fc_cnt", + NPPU_OAM_STAT_PKTRX_OAM_TST_FC_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0038, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_pktrx_oam_tst_fc_cnt_reg, + NULL, + NULL, + }, + { + "odma_oam_sop_cnt", + NPPU_OAM_STAT_ODMA_OAM_SOP_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x003c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_odma_oam_sop_cnt_reg, + NULL, + NULL, + }, + { + "odma_oam_eop_cnt", + NPPU_OAM_STAT_ODMA_OAM_EOP_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0040, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_odma_oam_eop_cnt_reg, + NULL, + NULL, + }, + { + "oam_odma_fc_cnt", + NPPU_OAM_STAT_OAM_ODMA_FC_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0044, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_oam_odma_fc_cnt_reg, + NULL, + NULL, + }, + { + "rec_ma_pkt_illegal_cnt", + NPPU_OAM_STAT_REC_MA_PKT_ILLEGAL_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0048, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_rec_ma_pkt_illegal_cnt_reg, + NULL, + NULL, + }, + { + "rec_rmep_pkt_illegal_cnt", + NPPU_OAM_STAT_REC_RMEP_PKT_ILLEGAL_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x004c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_rec_rmep_pkt_illegal_cnt_reg, + NULL, + NULL, + }, + { + "rec_eth_ais_pkt_cnt", + NPPU_OAM_STAT_REC_ETH_AIS_PKT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0050, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_rec_eth_ais_pkt_cnt_reg, + NULL, + NULL, + }, + { + "rec_tp_ais_pkt_cnt", + NPPU_OAM_STAT_REC_TP_AIS_PKT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0054, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_rec_tp_ais_pkt_cnt_reg, + NULL, + NULL, + }, + { + "rec_tp_csf_pkt_cnt", + NPPU_OAM_STAT_REC_TP_CSF_PKT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0058, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_rec_tp_csf_pkt_cnt_reg, + NULL, + NULL, + }, + { + "rec_eth_level_defect_cnt", + NPPU_OAM_STAT_REC_ETH_LEVEL_DEFECT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x005c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_rec_eth_level_defect_cnt_reg, + NULL, + NULL, + }, + { + "rec_eth_megid_defect_cnt", + NPPU_OAM_STAT_REC_ETH_MEGID_DEFECT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0060, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_rec_eth_megid_defect_cnt_reg, + NULL, + NULL, + }, + { + "rec_eth_mepid_defect_cnt", + NPPU_OAM_STAT_REC_ETH_MEPID_DEFECT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0064, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_rec_eth_mepid_defect_cnt_reg, + NULL, + NULL, + }, + { + "rec_eth_interval_defect_cnt", + NPPU_OAM_STAT_REC_ETH_INTERVAL_DEFECT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0068, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_rec_eth_interval_defect_cnt_reg, + NULL, + NULL, + }, + { + "rec_sess_unenable_cnt", + NPPU_OAM_STAT_REC_SESS_UNENABLE_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x006c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_rec_sess_unenable_cnt_reg, + NULL, + NULL, + }, + { + "oam_2544_rd_pkt_cnt", + NPPU_OAM_STAT_OAM_2544_RD_PKT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0070, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_oam_2544_rd_pkt_cnt_reg, + NULL, + NULL, + }, + { + "debug_cnt_clr", + NPPU_OAM_STAT_DEBUG_CNT_CLRr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0074, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_debug_cnt_clr_reg, + NULL, + NULL, + }, + { + "oam_pktrx_catch_data", + NPPU_OAM_STAT_OAM_PKTRX_CATCH_DATAr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0078, + (32/8), + 0, + 0x1F + 1, + 0, + 4, + 1, + g_nppu_oam_stat_oam_pktrx_catch_data_reg, + NULL, + NULL, + }, + { + "odma_oam_catch_data", + NPPU_OAM_STAT_ODMA_OAM_CATCH_DATAr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x00f8, + (32/8), + 0, + 0x1F + 1, + 0, + 4, + 1, + g_nppu_oam_stat_odma_oam_catch_data_reg, + NULL, + NULL, + }, + { + "tst_session_tx_cnt", + NPPU_OAM_STAT_TST_SESSION_TX_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0178, + (32/8), + 0, + 0x9 + 1, + 0, + 4, + 1, + g_nppu_oam_stat_tst_session_tx_cnt_reg, + NULL, + NULL, + }, + { + "tst_session_rx_cnt", + NPPU_OAM_STAT_TST_SESSION_RX_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x01a0, + (32/8), + 0, + 0x9 + 1, + 0, + 4, + 1, + g_nppu_oam_stat_tst_session_rx_cnt_reg, + NULL, + NULL, + }, + { + "tstrx_lost_cnt", + NPPU_OAM_STAT_TSTRX_LOST_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x01c8, + (32/8), + 0, + 0x9 + 1, + 0, + 4, + 1, + g_nppu_oam_stat_tstrx_lost_cnt_reg, + NULL, + NULL, + }, + { + "bfdseq_wr_cnt", + NPPU_OAM_STAT_BFDSEQ_WR_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x01f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_bfdseq_wr_cnt_reg, + NULL, + NULL, + }, + { + "bfdtime_wr_cnt", + NPPU_OAM_STAT_BFDTIME_WR_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x01f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_bfdtime_wr_cnt_reg, + NULL, + NULL, + }, + { + "lmcnt_wr_cnt", + NPPU_OAM_STAT_LMCNT_WR_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x01f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_lmcnt_wr_cnt_reg, + NULL, + NULL, + }, + { + "oam_fs_pkt_cnt", + NPPU_OAM_STAT_OAM_FS_PKT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x01fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_oam_fs_pkt_cnt_reg, + NULL, + NULL, + }, + { + "oam_ma_fs_pkt_cnt", + NPPU_OAM_STAT_OAM_MA_FS_PKT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0200, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_oam_ma_fs_pkt_cnt_reg, + NULL, + NULL, + }, + { + "rec_tp_level_defect_cnt", + NPPU_OAM_STAT_REC_TP_LEVEL_DEFECT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0204, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_rec_tp_level_defect_cnt_reg, + NULL, + NULL, + }, + { + "rec_tp_megid_defect_cnt", + NPPU_OAM_STAT_REC_TP_MEGID_DEFECT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0208, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_rec_tp_megid_defect_cnt_reg, + NULL, + NULL, + }, + { + "rec_tp_mepid_defect_cnt", + NPPU_OAM_STAT_REC_TP_MEPID_DEFECT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x020c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_rec_tp_mepid_defect_cnt_reg, + NULL, + NULL, + }, + { + "rec_tp_interval_defect_cnt", + NPPU_OAM_STAT_REC_TP_INTERVAL_DEFECT_CNTr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0210, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_rec_tp_interval_defect_cnt_reg, + NULL, + NULL, + }, + { + "rd_reg_clear_mode", + NPPU_OAM_STAT_RD_REG_CLEAR_MODEr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0214, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_rd_reg_clear_mode_reg, + NULL, + NULL, + }, + { + "rd_data_reg_clear_mode", + NPPU_OAM_STAT_RD_DATA_REG_CLEAR_MODEr, + NPPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_NPPU_BASE_ADDR + MODULE_NPPU_OAM_STAT_BASE_ADDR + 0x0218, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_nppu_oam_stat_rd_data_reg_clear_mode_reg, + NULL, + NULL, + }, + { + "oam_int_status_ram_0", + NPPU_OAM_CFG_INDIR_OAM_INT_STATUS_RAM_0r, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x00000000, + (32/8), + 0, + 4095 + 1, + 0, + 1, + 7, + g_nppu_oam_cfg_indir_oam_int_status_ram_0_reg, + NULL, + NULL, + }, + { + "oam_int_status_ram1", + NPPU_OAM_CFG_INDIR_OAM_INT_STATUS_RAM1r, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x10000000, + (32/8), + 0, + 4095 + 1, + 0, + 1, + 12, + g_nppu_oam_cfg_indir_oam_int_status_ram1_reg, + NULL, + NULL, + }, + { + "tst_pkt_tx_para_ram", + NPPU_OAM_CFG_INDIR_TST_PKT_TX_PARA_RAMr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x20000000, + (96/8), + 0, + 127 + 1, + 0, + 1, + 12, + g_nppu_oam_cfg_indir_tst_pkt_tx_para_ram_reg, + NULL, + NULL, + }, + { + "groupnumram", + NPPU_OAM_CFG_INDIR_GROUPNUMRAMr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x30000000, + (32/8), + 0, + 4095 + 1, + 0, + 1, + 1, + g_nppu_oam_cfg_indir_groupnumram_reg, + NULL, + NULL, + }, + { + "oam_tx_tbl_ram", + NPPU_OAM_CFG_INDIR_OAM_TX_TBL_RAMr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x40000000, + (64/8), + 0, + 4095 + 1, + 0, + 1, + 8, + g_nppu_oam_cfg_indir_oam_tx_tbl_ram_reg, + NULL, + NULL, + }, + { + "oam_chk_tbl_ram", + NPPU_OAM_CFG_INDIR_OAM_CHK_TBL_RAMr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x50000000, + (64/8), + 0, + 4095 + 1, + 0, + 1, + 9, + g_nppu_oam_cfg_indir_oam_chk_tbl_ram_reg, + NULL, + NULL, + }, + { + "oam_ma_chk_tbl_ram", + NPPU_OAM_CFG_INDIR_OAM_MA_CHK_TBL_RAMr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x60000000, + (160/8), + 0, + 4095 + 1, + 0, + 1, + 22, + g_nppu_oam_cfg_indir_oam_ma_chk_tbl_ram_reg, + NULL, + NULL, + }, + { + "oam_2544_tx_ram", + NPPU_OAM_CFG_INDIR_OAM_2544_TX_RAMr, + NPPU, + DPP_REG_FLAG_INDIRECT, + DPP_REG_UNI_ARRAY, + 0x90000000, + (64/8), + 0, + 127 + 1, + 0, + 1, + 5, + g_nppu_oam_cfg_indir_oam_2544_tx_ram_reg, + NULL, + NULL, + }, + { + "interrupt_en_r", + PPU_PPU_INTERRUPT_EN_Rr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x004, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_interrupt_en_r_reg, + NULL, + NULL, + }, + { + "mec_host_interrupt", + PPU_PPU_MEC_HOST_INTERRUPTr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_mec_host_interrupt_reg, + NULL, + NULL, + }, + { + "dbg_rtl_date", + PPU_PPU_DBG_RTL_DATEr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x014, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_dbg_rtl_date_reg, + NULL, + NULL, + }, + { + "dup_start_num_cfg", + PPU_PPU_DUP_START_NUM_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x02c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_dup_start_num_cfg_reg, + NULL, + NULL, + }, + { + "debug_data_write_complete", + PPU_PPU_DEBUG_DATA_WRITE_COMPLETEr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x030, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_debug_data_write_complete_reg, + NULL, + NULL, + }, + { + "uc_mc_wrr_cfg", + PPU_PPU_UC_MC_WRR_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x040, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_uc_mc_wrr_cfg_reg, + NULL, + NULL, + }, + { + "debug_pkt_send_en", + PPU_PPU_DEBUG_PKT_SEND_ENr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x044, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_debug_pkt_send_en_reg, + NULL, + NULL, + }, + { + "dup_tbl_ind_access_done", + PPU_PPU_DUP_TBL_IND_ACCESS_DONEr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x04c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_dup_tbl_ind_access_done_reg, + NULL, + NULL, + }, + { + "isu_ppu_demux_fifo_interrupt_mask", + PPU_PPU_ISU_PPU_DEMUX_FIFO_INTERRUPT_MASKr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x080, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_ppu_ppu_isu_ppu_demux_fifo_interrupt_mask_reg, + NULL, + NULL, + }, + { + "ppu_multicast_fifo_interrupt_mask", + PPU_PPU_PPU_MULTICAST_FIFO_INTERRUPT_MASKr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x084, + (32/8), + 0, + 0, + 0, + 0, + 20, + g_ppu_ppu_ppu_multicast_fifo_interrupt_mask_reg, + NULL, + NULL, + }, + { + "ppu_in_schedule_fifo_interrupt_mask", + PPU_PPU_PPU_IN_SCHEDULE_FIFO_INTERRUPT_MASKr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x088, + (32/8), + 0, + 0, + 0, + 0, + 6, + g_ppu_ppu_ppu_in_schedule_fifo_interrupt_mask_reg, + NULL, + NULL, + }, + { + "ppu_mf_out_fifo_interrupt_mask", + PPU_PPU_PPU_MF_OUT_FIFO_INTERRUPT_MASKr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x08c, + (32/8), + 0, + 0, + 0, + 0, + 12, + g_ppu_ppu_ppu_mf_out_fifo_interrupt_mask_reg, + NULL, + NULL, + }, + { + "pbu_mcode_pf_req_schedule_fifo_interrupt_mask", + PPU_PPU_PBU_MCODE_PF_REQ_SCHEDULE_FIFO_INTERRUPT_MASKr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x090, + (32/8), + 0, + 0, + 0, + 0, + 12, + g_ppu_ppu_pbu_mcode_pf_req_schedule_fifo_interrupt_mask_reg, + NULL, + NULL, + }, + { + "pbu_mcode_pf_rsp_schedule_fifo_interrupt_mask", + PPU_PPU_PBU_MCODE_PF_RSP_SCHEDULE_FIFO_INTERRUPT_MASKr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x094, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_ppu_ppu_pbu_mcode_pf_rsp_schedule_fifo_interrupt_mask_reg, + NULL, + NULL, + }, + { + "ppu_mccnt_fifo_interrupt_mask", + PPU_PPU_PPU_MCCNT_FIFO_INTERRUPT_MASKr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x098, + (32/8), + 0, + 0, + 0, + 0, + 6, + g_ppu_ppu_ppu_mccnt_fifo_interrupt_mask_reg, + NULL, + NULL, + }, + { + "coprocessor_fifo_interrupt_mask_l", + PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_MASK_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x09c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_ppu_ppu_coprocessor_fifo_interrupt_mask_l_reg, + NULL, + NULL, + }, + { + "coprocessor_fifo_interrupt_mask_m", + PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_MASK_Mr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x0a0, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_ppu_ppu_coprocessor_fifo_interrupt_mask_m_reg, + NULL, + NULL, + }, + { + "coprocessor_fifo_interrupt_mask_h", + PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_MASK_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa4, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_ppu_ppu_coprocessor_fifo_interrupt_mask_h_reg, + NULL, + NULL, + }, + { + "ppu_ram_check_err_mask", + PPU_PPU_PPU_RAM_CHECK_ERR_MASKr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x0a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_ram_check_err_mask_reg, + NULL, + NULL, + }, + { + "instrmem_fifo_interrupt_mask", + PPU_PPU_INSTRMEM_FIFO_INTERRUPT_MASKr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x0ac, + (32/8), + 0, + 0, + 0, + 0, + 12, + g_ppu_ppu_instrmem_fifo_interrupt_mask_reg, + NULL, + NULL, + }, + { + "isu_ppu_demux_fifo_interrupt_sta", + PPU_PPU_ISU_PPU_DEMUX_FIFO_INTERRUPT_STAr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xc0, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_ppu_ppu_isu_ppu_demux_fifo_interrupt_sta_reg, + NULL, + NULL, + }, + { + "ppu_multicast_fifo_interrupt_sta", + PPU_PPU_PPU_MULTICAST_FIFO_INTERRUPT_STAr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x0c4, + (32/8), + 0, + 0, + 0, + 0, + 20, + g_ppu_ppu_ppu_multicast_fifo_interrupt_sta_reg, + NULL, + NULL, + }, + { + "ppu_in_schedule_fifo_interrupt_sta", + PPU_PPU_PPU_IN_SCHEDULE_FIFO_INTERRUPT_STAr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x0c8, + (32/8), + 0, + 0, + 0, + 0, + 6, + g_ppu_ppu_ppu_in_schedule_fifo_interrupt_sta_reg, + NULL, + NULL, + }, + { + "ppu_mf_out_fifo_interrupt_sta", + PPU_PPU_PPU_MF_OUT_FIFO_INTERRUPT_STAr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xcc, + (32/8), + 0, + 0, + 0, + 0, + 12, + g_ppu_ppu_ppu_mf_out_fifo_interrupt_sta_reg, + NULL, + NULL, + }, + { + "pbu_mcode_pf_req_schedule_fifo_interrupt_sta", + PPU_PPU_PBU_MCODE_PF_REQ_SCHEDULE_FIFO_INTERRUPT_STAr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x0d0, + (32/8), + 0, + 0, + 0, + 0, + 12, + g_ppu_ppu_pbu_mcode_pf_req_schedule_fifo_interrupt_sta_reg, + NULL, + NULL, + }, + { + "pbu_mcode_pf_rsp_schedule_fifo_interrupt_sta", + PPU_PPU_PBU_MCODE_PF_RSP_SCHEDULE_FIFO_INTERRUPT_STAr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x0d4, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_ppu_ppu_pbu_mcode_pf_rsp_schedule_fifo_interrupt_sta_reg, + NULL, + NULL, + }, + { + "ppu_mccnt_fifo_interrupt_sta", + PPU_PPU_PPU_MCCNT_FIFO_INTERRUPT_STAr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x0d8, + (32/8), + 0, + 0, + 0, + 0, + 6, + g_ppu_ppu_ppu_mccnt_fifo_interrupt_sta_reg, + NULL, + NULL, + }, + { + "coprocessor_fifo_interrupt_sta_l", + PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_STA_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x0dc, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_ppu_ppu_coprocessor_fifo_interrupt_sta_l_reg, + NULL, + NULL, + }, + { + "coprocessor_fifo_interrupt_sta_m", + PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_STA_Mr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x0e0, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_ppu_ppu_coprocessor_fifo_interrupt_sta_m_reg, + NULL, + NULL, + }, + { + "coprocessor_fifo_interrupt_sta_h", + PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_STA_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xe4, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_ppu_ppu_coprocessor_fifo_interrupt_sta_h_reg, + NULL, + NULL, + }, + { + "instrmem_fifo_interrupt_sta", + PPU_PPU_INSTRMEM_FIFO_INTERRUPT_STAr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x0e8, + (32/8), + 0, + 0, + 0, + 0, + 8, + g_ppu_ppu_instrmem_fifo_interrupt_sta_reg, + NULL, + NULL, + }, + { + "ppu_ram_check_ecc_err_flag_1", + PPU_PPU_PPU_RAM_CHECK_ECC_ERR_FLAG_1r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x0f0, + (32/8), + 0, + 0, + 0, + 0, + 26, + g_ppu_ppu_ppu_ram_check_ecc_err_flag_1_reg, + NULL, + NULL, + }, + { + "isu_ppu_demux_fifo_interrupt_flag", + PPU_PPU_ISU_PPU_DEMUX_FIFO_INTERRUPT_FLAGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x100, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_ppu_ppu_isu_ppu_demux_fifo_interrupt_flag_reg, + NULL, + NULL, + }, + { + "ppu_multicast_fifo_interrupt_flag", + PPU_PPU_PPU_MULTICAST_FIFO_INTERRUPT_FLAGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x104, + (32/8), + 0, + 0, + 0, + 0, + 20, + g_ppu_ppu_ppu_multicast_fifo_interrupt_flag_reg, + NULL, + NULL, + }, + { + "ppu_in_schedule_fifo_interrupt_flag", + PPU_PPU_PPU_IN_SCHEDULE_FIFO_INTERRUPT_FLAGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x108, + (32/8), + 0, + 0, + 0, + 0, + 6, + g_ppu_ppu_ppu_in_schedule_fifo_interrupt_flag_reg, + NULL, + NULL, + }, + { + "ppu_mf_out_fifo_interrupt_flag", + PPU_PPU_PPU_MF_OUT_FIFO_INTERRUPT_FLAGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x10c, + (32/8), + 0, + 0, + 0, + 0, + 12, + g_ppu_ppu_ppu_mf_out_fifo_interrupt_flag_reg, + NULL, + NULL, + }, + { + "pbu_mcode_pf_req_schedule_fifo_interrupt_flag", + PPU_PPU_PBU_MCODE_PF_REQ_SCHEDULE_FIFO_INTERRUPT_FLAGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x110, + (32/8), + 0, + 0, + 0, + 0, + 12, + g_ppu_ppu_pbu_mcode_pf_req_schedule_fifo_interrupt_flag_reg, + NULL, + NULL, + }, + { + "pbu_mcode_pf_rsp_schedule_fifo_interrupt_flag", + PPU_PPU_PBU_MCODE_PF_RSP_SCHEDULE_FIFO_INTERRUPT_FLAGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x114, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_ppu_ppu_pbu_mcode_pf_rsp_schedule_fifo_interrupt_flag_reg, + NULL, + NULL, + }, + { + "ppu_mccnt_fifo_interrupt_flag", + PPU_PPU_PPU_MCCNT_FIFO_INTERRUPT_FLAGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x118, + (32/8), + 0, + 0, + 0, + 0, + 6, + g_ppu_ppu_ppu_mccnt_fifo_interrupt_flag_reg, + NULL, + NULL, + }, + { + "coprocessor_fifo_interrupt_flag_l", + PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_FLAG_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x11c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_ppu_ppu_coprocessor_fifo_interrupt_flag_l_reg, + NULL, + NULL, + }, + { + "coprocessor_fifo_interrupt_flag_m", + PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_FLAG_Mr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x120, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_ppu_ppu_coprocessor_fifo_interrupt_flag_m_reg, + NULL, + NULL, + }, + { + "coprocessor_fifo_interrupt_flag_h", + PPU_PPU_COPROCESSOR_FIFO_INTERRUPT_FLAG_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x124, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_ppu_ppu_coprocessor_fifo_interrupt_flag_h_reg, + NULL, + NULL, + }, + { + "instrmem_fifo_interrupt_flag", + PPU_PPU_INSTRMEM_FIFO_INTERRUPT_FLAGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x128, + (32/8), + 0, + 0, + 0, + 0, + 12, + g_ppu_ppu_instrmem_fifo_interrupt_flag_reg, + NULL, + NULL, + }, + { + "instrmem_ram_int_out", + PPU_PPU_INSTRMEM_RAM_INT_OUTr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x140, + (32/8), + 0, + 0, + 0, + 0, + 12, + g_ppu_ppu_instrmem_ram_int_out_reg, + NULL, + NULL, + }, + { + "instrmem_ram_int_mask", + PPU_PPU_INSTRMEM_RAM_INT_MASKr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x144, + (32/8), + 0, + 0, + 0, + 0, + 12, + g_ppu_ppu_instrmem_ram_int_mask_reg, + NULL, + NULL, + }, + { + "instrmem_ram_int_stat", + PPU_PPU_INSTRMEM_RAM_INT_STATr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x148, + (32/8), + 0, + 0, + 0, + 0, + 12, + g_ppu_ppu_instrmem_ram_int_stat_reg, + NULL, + NULL, + }, + { + "instrmem_ram_int_flag", + PPU_PPU_INSTRMEM_RAM_INT_FLAGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x14c, + (32/8), + 0, + 0, + 0, + 0, + 12, + g_ppu_ppu_instrmem_ram_int_flag_reg, + NULL, + NULL, + }, + { + "ppu_count_cfg", + PPU_PPU_PPU_COUNT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x158, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_ppu_ppu_ppu_count_cfg_reg, + NULL, + NULL, + }, + { + "ppu_statics_cfg", + PPU_PPU_PPU_STATICS_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x15c, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_ppu_ppu_ppu_statics_cfg_reg, + NULL, + NULL, + }, + { + "ppu_statics_wb_cfg", + PPU_PPU_PPU_STATICS_WB_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x160, + (32/8), + 0, + 0, + 0, + 0, + 6, + g_ppu_ppu_ppu_statics_wb_cfg_reg, + NULL, + NULL, + }, + { + "wr_table_self_rsp_en_cfg", + PPU_PPU_WR_TABLE_SELF_RSP_EN_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x164, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_wr_table_self_rsp_en_cfg_reg, + NULL, + NULL, + }, + { + "ppu_random_arbiter_8to1_cfg", + PPU_PPU_PPU_RANDOM_ARBITER_8TO1_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x168, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_random_arbiter_8to1_cfg_reg, + NULL, + NULL, + }, + { + "ppu_reorder_bypass_flow_num_cfg", + PPU_PPU_PPU_REORDER_BYPASS_FLOW_NUM_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x16c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_reorder_bypass_flow_num_cfg_reg, + NULL, + NULL, + }, + { + "cos_meter_cfg_h", + PPU_PPU_COS_METER_CFG_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x170, + (32/8), + 0, + 7 + 1, + 0, + 8, + 5, + g_ppu_ppu_cos_meter_cfg_h_reg, + NULL, + NULL, + }, + { + "cos_meter_cfg_l", + PPU_PPU_COS_METER_CFG_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x174, + (32/8), + 0, + 7 + 1, + 0, + 8, + 3, + g_ppu_ppu_cos_meter_cfg_l_reg, + NULL, + NULL, + }, + { + "instrmem_rdy", + PPU_PPU_INSTRMEM_RDYr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x1c0, + (32/8), + 0, + 2 + 1, + 0, + 4, + 1, + g_ppu_ppu_instrmem_rdy_reg, + NULL, + NULL, + }, + { + "instrmem_addr", + PPU_PPU_INSTRMEM_ADDRr, + PPU, + DPP_REG_FLAG_WO | DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x1d0, + (32/8), + 0, + 2 + 1, + 0, + 4, + 2, + g_ppu_ppu_instrmem_addr_reg, + NULL, + NULL, + }, + { + "instrmem_ind_access_done", + PPU_PPU_INSTRMEM_IND_ACCESS_DONEr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x1e0, + (32/8), + 0, + 2 + 1, + 0, + 4, + 1, + g_ppu_ppu_instrmem_ind_access_done_reg, + NULL, + NULL, + }, + { + "instrmem_instr0_data_l", + PPU_PPU_INSTRMEM_INSTR0_DATA_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x1f0, + (32/8), + 0, + 2 + 1, + 0, + 4, + 1, + g_ppu_ppu_instrmem_instr0_data_l_reg, + NULL, + NULL, + }, + { + "instrmem_instr0_data_h", + PPU_PPU_INSTRMEM_INSTR0_DATA_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x200, + (32/8), + 0, + 2 + 1, + 0, + 4, + 1, + g_ppu_ppu_instrmem_instr0_data_h_reg, + NULL, + NULL, + }, + { + "instrmem_instr1_data_l", + PPU_PPU_INSTRMEM_INSTR1_DATA_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x210, + (32/8), + 0, + 2 + 1, + 0, + 4, + 1, + g_ppu_ppu_instrmem_instr1_data_l_reg, + NULL, + NULL, + }, + { + "instrmem_instr1_data_h", + PPU_PPU_INSTRMEM_INSTR1_DATA_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x220, + (32/8), + 0, + 2 + 1, + 0, + 4, + 1, + g_ppu_ppu_instrmem_instr1_data_h_reg, + NULL, + NULL, + }, + { + "instrmem_instr2_data_l", + PPU_PPU_INSTRMEM_INSTR2_DATA_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x230, + (32/8), + 0, + 2 + 1, + 0, + 4, + 1, + g_ppu_ppu_instrmem_instr2_data_l_reg, + NULL, + NULL, + }, + { + "instrmem_instr2_data_h", + PPU_PPU_INSTRMEM_INSTR2_DATA_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x240, + (32/8), + 0, + 2 + 1, + 0, + 4, + 1, + g_ppu_ppu_instrmem_instr2_data_h_reg, + NULL, + NULL, + }, + { + "instrmem_instr3_data_l", + PPU_PPU_INSTRMEM_INSTR3_DATA_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x250, + (32/8), + 0, + 2 + 1, + 0, + 4, + 1, + g_ppu_ppu_instrmem_instr3_data_l_reg, + NULL, + NULL, + }, + { + "instrmem_instr3_data_h", + PPU_PPU_INSTRMEM_INSTR3_DATA_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x260, + (32/8), + 0, + 2 + 1, + 0, + 4, + 1, + g_ppu_ppu_instrmem_instr3_data_h_reg, + NULL, + NULL, + }, + { + "instrmem_read_instr0_data_l", + PPU_PPU_INSTRMEM_READ_INSTR0_DATA_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x270, + (32/8), + 0, + 2 + 1, + 0, + 4, + 1, + g_ppu_ppu_instrmem_read_instr0_data_l_reg, + NULL, + NULL, + }, + { + "instrmem_read_instr0_data_h", + PPU_PPU_INSTRMEM_READ_INSTR0_DATA_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x280, + (32/8), + 0, + 2 + 1, + 0, + 4, + 1, + g_ppu_ppu_instrmem_read_instr0_data_h_reg, + NULL, + NULL, + }, + { + "instrmem_read_instr1_data_l", + PPU_PPU_INSTRMEM_READ_INSTR1_DATA_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x290, + (32/8), + 0, + 2 + 1, + 0, + 4, + 1, + g_ppu_ppu_instrmem_read_instr1_data_l_reg, + NULL, + NULL, + }, + { + "instrmem_read_instr1_data_h", + PPU_PPU_INSTRMEM_READ_INSTR1_DATA_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x2a0, + (32/8), + 0, + 2 + 1, + 0, + 4, + 1, + g_ppu_ppu_instrmem_read_instr1_data_h_reg, + NULL, + NULL, + }, + { + "instrmem_read_instr2_data_l", + PPU_PPU_INSTRMEM_READ_INSTR2_DATA_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x2b0, + (32/8), + 0, + 2 + 1, + 0, + 4, + 1, + g_ppu_ppu_instrmem_read_instr2_data_l_reg, + NULL, + NULL, + }, + { + "instrmem_read_instr2_data_h", + PPU_PPU_INSTRMEM_READ_INSTR2_DATA_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x2c0, + (32/8), + 0, + 2 + 1, + 0, + 4, + 1, + g_ppu_ppu_instrmem_read_instr2_data_h_reg, + NULL, + NULL, + }, + { + "instrmem_read_instr3_data_l", + PPU_PPU_INSTRMEM_READ_INSTR3_DATA_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x2d0, + (32/8), + 0, + 2 + 1, + 0, + 4, + 1, + g_ppu_ppu_instrmem_read_instr3_data_l_reg, + NULL, + NULL, + }, + { + "instrmem_read_instr3_data_h", + PPU_PPU_INSTRMEM_READ_INSTR3_DATA_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x2e0, + (32/8), + 0, + 2 + 1, + 0, + 4, + 1, + g_ppu_ppu_instrmem_read_instr3_data_h_reg, + NULL, + NULL, + }, + { + "se_ppu_mc_srh_fc_cnt_h", + PPU_PPU_SE_PPU_MC_SRH_FC_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x300, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_se_ppu_mc_srh_fc_cnt_h_reg, + NULL, + NULL, + }, + { + "se_ppu_mc_srh_fc_cnt_l", + PPU_PPU_SE_PPU_MC_SRH_FC_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x304, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_se_ppu_mc_srh_fc_cnt_l_reg, + NULL, + NULL, + }, + { + "ppu_se_mc_srh_fc_cnt_h", + PPU_PPU_PPU_SE_MC_SRH_FC_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x308, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_se_mc_srh_fc_cnt_h_reg, + NULL, + NULL, + }, + { + "ppu_se_mc_srh_fc_cnt_l", + PPU_PPU_PPU_SE_MC_SRH_FC_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x30c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_se_mc_srh_fc_cnt_l_reg, + NULL, + NULL, + }, + { + "ppu_se_mc_srh_vld_cnt_h", + PPU_PPU_PPU_SE_MC_SRH_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x310, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_se_mc_srh_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "ppu_se_mc_srh_vld_cnt_l", + PPU_PPU_PPU_SE_MC_SRH_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x314, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_se_mc_srh_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "se_ppu_mc_srh_vld_cnt_h", + PPU_PPU_SE_PPU_MC_SRH_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x318, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_se_ppu_mc_srh_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "se_ppu_mc_srh_vld_cnt_l", + PPU_PPU_SE_PPU_MC_SRH_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x31c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_se_ppu_mc_srh_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "pbu_ppu_logic_pf_fc_cnt_h", + PPU_PPU_PBU_PPU_LOGIC_PF_FC_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x320, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pbu_ppu_logic_pf_fc_cnt_h_reg, + NULL, + NULL, + }, + { + "pbu_ppu_logic_pf_fc_cnt_l", + PPU_PPU_PBU_PPU_LOGIC_PF_FC_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x324, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pbu_ppu_logic_pf_fc_cnt_l_reg, + NULL, + NULL, + }, + { + "ppu_pbu_logic_rsp_fc_cnt_h", + PPU_PPU_PPU_PBU_LOGIC_RSP_FC_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x328, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_pbu_logic_rsp_fc_cnt_h_reg, + NULL, + NULL, + }, + { + "ppu_pbu_logic_rsp_fc_cnt_l", + PPU_PPU_PPU_PBU_LOGIC_RSP_FC_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x32c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_pbu_logic_rsp_fc_cnt_l_reg, + NULL, + NULL, + }, + { + "ppu_pbu_logic_pf_req_vld_cnt_h", + PPU_PPU_PPU_PBU_LOGIC_PF_REQ_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x330, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_pbu_logic_pf_req_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "ppu_pbu_logic_pf_req_vld_cnt_l", + PPU_PPU_PPU_PBU_LOGIC_PF_REQ_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x334, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_pbu_logic_pf_req_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "pbu_ppu_logic_pf_rsp_vld_cnt_h", + PPU_PPU_PBU_PPU_LOGIC_PF_RSP_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x338, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pbu_ppu_logic_pf_rsp_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "pbu_ppu_logic_pf_rsp_vld_cnt_l", + PPU_PPU_PBU_PPU_LOGIC_PF_RSP_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x33c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pbu_ppu_logic_pf_rsp_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "pbu_ppu_ifb_rd_fc_cnt_h", + PPU_PPU_PBU_PPU_IFB_RD_FC_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x340, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pbu_ppu_ifb_rd_fc_cnt_h_reg, + NULL, + NULL, + }, + { + "pbu_ppu_ifb_rd_fc_cnt_l", + PPU_PPU_PBU_PPU_IFB_RD_FC_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x344, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pbu_ppu_ifb_rd_fc_cnt_l_reg, + NULL, + NULL, + }, + { + "pbu_ppu_wb_fc_cnt_h", + PPU_PPU_PBU_PPU_WB_FC_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x348, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pbu_ppu_wb_fc_cnt_h_reg, + NULL, + NULL, + }, + { + "pbu_ppu_wb_fc_cnt_l", + PPU_PPU_PBU_PPU_WB_FC_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x34c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pbu_ppu_wb_fc_cnt_l_reg, + NULL, + NULL, + }, + { + "ppu_pbu_mcode_pf_req_vld_cnt_h", + PPU_PPU_PPU_PBU_MCODE_PF_REQ_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x350, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_pbu_mcode_pf_req_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "ppu_pbu_mcode_pf_req_vld_cnt_l", + PPU_PPU_PPU_PBU_MCODE_PF_REQ_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x354, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_pbu_mcode_pf_req_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "pbu_ppu_mcode_pf_rsp_vld_cnt_h", + PPU_PPU_PBU_PPU_MCODE_PF_RSP_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x358, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pbu_ppu_mcode_pf_rsp_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "pbu_ppu_mcode_pf_rsp_vld_cnt_l", + PPU_PPU_PBU_PPU_MCODE_PF_RSP_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x35c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pbu_ppu_mcode_pf_rsp_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "odma_ppu_para_fc_cnt_h", + PPU_PPU_ODMA_PPU_PARA_FC_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x360, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_odma_ppu_para_fc_cnt_h_reg, + NULL, + NULL, + }, + { + "odma_ppu_para_fc_cnt_l", + PPU_PPU_ODMA_PPU_PARA_FC_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x364, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_odma_ppu_para_fc_cnt_l_reg, + NULL, + NULL, + }, + { + "odma_ppu_mccnt_wr_fc_cnt_h", + PPU_PPU_ODMA_PPU_MCCNT_WR_FC_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x368, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_odma_ppu_mccnt_wr_fc_cnt_h_reg, + NULL, + NULL, + }, + { + "odma_ppu_mccnt_wr_fc_cnt_l", + PPU_PPU_ODMA_PPU_MCCNT_WR_FC_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x36c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_odma_ppu_mccnt_wr_fc_cnt_l_reg, + NULL, + NULL, + }, + { + "ppu_odma_mccnt_wr_vld_cnt_h", + PPU_PPU_PPU_ODMA_MCCNT_WR_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x370, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_odma_mccnt_wr_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "ppu_odma_mccnt_wr_vld_cnt_l", + PPU_PPU_PPU_ODMA_MCCNT_WR_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x374, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_odma_mccnt_wr_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "odma_ppu_mccnt_rsp_vld_cnt_h", + PPU_PPU_ODMA_PPU_MCCNT_RSP_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x378, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_odma_ppu_mccnt_rsp_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "odma_ppu_mccnt_rsp_vld_cnt_l", + PPU_PPU_ODMA_PPU_MCCNT_RSP_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x37c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_odma_ppu_mccnt_rsp_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "ppu_pktrx_uc_fc_cnt_h", + PPU_PPU_PPU_PKTRX_UC_FC_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x380, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_pktrx_uc_fc_cnt_h_reg, + NULL, + NULL, + }, + { + "ppu_pktrx_uc_fc_cnt_l", + PPU_PPU_PPU_PKTRX_UC_FC_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x384, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_pktrx_uc_fc_cnt_l_reg, + NULL, + NULL, + }, + { + "ppu_pktrx_mc_fc_cnt_h", + PPU_PPU_PPU_PKTRX_MC_FC_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x388, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_pktrx_mc_fc_cnt_h_reg, + NULL, + NULL, + }, + { + "ppu_pktrx_mc_fc_cnt_l", + PPU_PPU_PPU_PKTRX_MC_FC_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x38c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_pktrx_mc_fc_cnt_l_reg, + NULL, + NULL, + }, + { + "pktrx_ppu_desc_vld_cnt_h", + PPU_PPU_PKTRX_PPU_DESC_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x390, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pktrx_ppu_desc_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "pktrx_ppu_desc_vld_cnt_l", + PPU_PPU_PKTRX_PPU_DESC_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x394, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pktrx_ppu_desc_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "ppu_pbu_ifb_req_vld_cnt_h", + PPU_PPU_PPU_PBU_IFB_REQ_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x398, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_pbu_ifb_req_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "ppu_pbu_ifb_req_vld_cnt_l", + PPU_PPU_PPU_PBU_IFB_REQ_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x39c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_pbu_ifb_req_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "pbu_ppu_ifb_rsp_vld_cnt_h", + PPU_PPU_PBU_PPU_IFB_RSP_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x3a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pbu_ppu_ifb_rsp_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "pbu_ppu_ifb_rsp_vld_cnt_l", + PPU_PPU_PBU_PPU_IFB_RSP_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x3a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pbu_ppu_ifb_rsp_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "ppu_pbu_wb_vld_cnt_h", + PPU_PPU_PPU_PBU_WB_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x3a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_pbu_wb_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "ppu_pbu_wb_vld_cnt_l", + PPU_PPU_PPU_PBU_WB_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x3ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_pbu_wb_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "pbu_ppu_reorder_para_vld_cnt_h", + PPU_PPU_PBU_PPU_REORDER_PARA_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x3b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pbu_ppu_reorder_para_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "pbu_ppu_reorder_para_vld_cnt_l", + PPU_PPU_PBU_PPU_REORDER_PARA_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x3b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pbu_ppu_reorder_para_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "ppu_odma_para_vld_cnt_h", + PPU_PPU_PPU_ODMA_PARA_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x3b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_odma_para_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "ppu_odma_para_vld_cnt_l", + PPU_PPU_PPU_ODMA_PARA_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x3bc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_odma_para_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "statics_isu_ppu_mc_vld_cnt_h", + PPU_PPU_STATICS_ISU_PPU_MC_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x400, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_isu_ppu_mc_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "statics_isu_ppu_mc_vld_cnt_l", + PPU_PPU_STATICS_ISU_PPU_MC_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x404, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_isu_ppu_mc_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "statics_isu_ppu_mc_loop_vld_cnt_h", + PPU_PPU_STATICS_ISU_PPU_MC_LOOP_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x410, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_isu_ppu_mc_loop_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "statics_isu_ppu_mc_loop_vld_cnt_l", + PPU_PPU_STATICS_ISU_PPU_MC_LOOP_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x414, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_isu_ppu_mc_loop_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "statics_isu_ppu_uc_vld_cnt_h", + PPU_PPU_STATICS_ISU_PPU_UC_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x418, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_isu_ppu_uc_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "statics_isu_ppu_uc_vld_cnt_l", + PPU_PPU_STATICS_ISU_PPU_UC_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x41c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_isu_ppu_uc_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "statics_isu_ppu_uc_bufnumis0_vld_cnt_h", + PPU_PPU_STATICS_ISU_PPU_UC_BUFNUMIS0_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x420, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_isu_ppu_uc_bufnumis0_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "statics_isu_ppu_uc_bufnumis0_vld_cnt_l", + PPU_PPU_STATICS_ISU_PPU_UC_BUFNUMIS0_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x424, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_isu_ppu_uc_bufnumis0_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "statics_demux_schedule_mc_vld_cnt_h", + PPU_PPU_STATICS_DEMUX_SCHEDULE_MC_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x438, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_demux_schedule_mc_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "statics_demux_schedule_mc_vld_cnt_l", + PPU_PPU_STATICS_DEMUX_SCHEDULE_MC_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x43c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_demux_schedule_mc_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "statics_demux_schedule_mc_bufnumis0_vld_cnt_h", + PPU_PPU_STATICS_DEMUX_SCHEDULE_MC_BUFNUMIS0_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x440, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_demux_schedule_mc_bufnumis0_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "statics_demux_schedule_mc_bufnumis0_vld_cnt_l", + PPU_PPU_STATICS_DEMUX_SCHEDULE_MC_BUFNUMIS0_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x444, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_demux_schedule_mc_bufnumis0_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "statics_demux_schedule_mc_srcportis0_vld_cnt_h", + PPU_PPU_STATICS_DEMUX_SCHEDULE_MC_SRCPORTIS0_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x448, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_demux_schedule_mc_srcportis0_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "statics_demux_schedule_mc_srcportis0_vld_cnt_l", + PPU_PPU_STATICS_DEMUX_SCHEDULE_MC_SRCPORTIS0_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x44c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_demux_schedule_mc_srcportis0_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "statics_demux_schedule_mc_srcportis1_vld_cnt_h", + PPU_PPU_STATICS_DEMUX_SCHEDULE_MC_SRCPORTIS1_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x450, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_demux_schedule_mc_srcportis1_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "statics_demux_schedule_mc_srcportis1_vld_cnt_l", + PPU_PPU_STATICS_DEMUX_SCHEDULE_MC_SRCPORTIS1_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x454, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_demux_schedule_mc_srcportis1_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "statics_demux_schedule_uc_vld_cnt_h", + PPU_PPU_STATICS_DEMUX_SCHEDULE_UC_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x458, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_demux_schedule_uc_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "statics_demux_schedule_uc_vld_cnt_l", + PPU_PPU_STATICS_DEMUX_SCHEDULE_UC_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x45c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_demux_schedule_uc_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "statics_demux_schedule_uc_bufnumis0_vld_cnt_h", + PPU_PPU_STATICS_DEMUX_SCHEDULE_UC_BUFNUMIS0_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x460, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_demux_schedule_uc_bufnumis0_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "statics_demux_schedule_uc_bufnumis0_vld_cnt_l", + PPU_PPU_STATICS_DEMUX_SCHEDULE_UC_BUFNUMIS0_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x464, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_demux_schedule_uc_bufnumis0_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "statics_demux_schedule_uc_srcportis0_vld_cnt_h", + PPU_PPU_STATICS_DEMUX_SCHEDULE_UC_SRCPORTIS0_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x468, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_demux_schedule_uc_srcportis0_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "statics_demux_schedule_uc_srcportis0_vld_cnt_l", + PPU_PPU_STATICS_DEMUX_SCHEDULE_UC_SRCPORTIS0_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x46c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_demux_schedule_uc_srcportis0_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "statics_demux_schedule_uc_srcportis1_vld_cnt_h", + PPU_PPU_STATICS_DEMUX_SCHEDULE_UC_SRCPORTIS1_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x470, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_demux_schedule_uc_srcportis1_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "statics_demux_schedule_uc_srcportis1_vld_cnt_l", + PPU_PPU_STATICS_DEMUX_SCHEDULE_UC_SRCPORTIS1_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x474, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_demux_schedule_uc_srcportis1_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "statics_ppu_wb_vld_cnt_h", + PPU_PPU_STATICS_PPU_WB_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x478, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_ppu_wb_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "statics_ppu_wb_vld_cnt_l", + PPU_PPU_STATICS_PPU_WB_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x47c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_ppu_wb_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "statics_ppu_wb_bufnumis0_vld_cnt_h", + PPU_PPU_STATICS_PPU_WB_BUFNUMIS0_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x480, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_ppu_wb_bufnumis0_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "statics_ppu_wb_bufnumis0_vld_cnt_l", + PPU_PPU_STATICS_PPU_WB_BUFNUMIS0_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x484, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_ppu_wb_bufnumis0_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "statics_ppu_wb_srcportis0_vld_cnt_h", + PPU_PPU_STATICS_PPU_WB_SRCPORTIS0_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x488, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_ppu_wb_srcportis0_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "statics_ppu_wb_srcportis0_vld_cnt_l", + PPU_PPU_STATICS_PPU_WB_SRCPORTIS0_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x48c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_ppu_wb_srcportis0_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "statics_ppu_wb_srcportis1_vld_cnt_h", + PPU_PPU_STATICS_PPU_WB_SRCPORTIS1_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x490, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_ppu_wb_srcportis1_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "statics_ppu_wb_srcportis1_vld_cnt_l", + PPU_PPU_STATICS_PPU_WB_SRCPORTIS1_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x494, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_ppu_wb_srcportis1_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "statics_ppu_wb_halt_send_type_vld_cnt_h", + PPU_PPU_STATICS_PPU_WB_HALT_SEND_TYPE_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x498, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_ppu_wb_halt_send_type_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "statics_ppu_wb_halt_send_type_vld_cnt_l", + PPU_PPU_STATICS_PPU_WB_HALT_SEND_TYPE_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x49c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_ppu_wb_halt_send_type_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "statics_ppu_wb_mf_type_vld_cnt_h", + PPU_PPU_STATICS_PPU_WB_MF_TYPE_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x4a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_ppu_wb_mf_type_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "statics_ppu_wb_mf_type_vld_cnt_l", + PPU_PPU_STATICS_PPU_WB_MF_TYPE_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x4a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_ppu_wb_mf_type_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "statics_ppu_wb_halt_continue_end_vld_cnt_h", + PPU_PPU_STATICS_PPU_WB_HALT_CONTINUE_END_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x4a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_ppu_wb_halt_continue_end_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "statics_ppu_wb_halt_continue_end_vld_cnt_l", + PPU_PPU_STATICS_PPU_WB_HALT_CONTINUE_END_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x4ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_ppu_wb_halt_continue_end_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "statics_ppu_wb_dup_flag_vld_cnt_h", + PPU_PPU_STATICS_PPU_WB_DUP_FLAG_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x4b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_ppu_wb_dup_flag_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "statics_ppu_wb_dup_flag_vld_cnt_l", + PPU_PPU_STATICS_PPU_WB_DUP_FLAG_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x4b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_ppu_wb_dup_flag_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "statics_ppu_wb_last_flag_vld_cnt_h", + PPU_PPU_STATICS_PPU_WB_LAST_FLAG_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x4b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_ppu_wb_last_flag_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "statics_ppu_wb_last_flag_vld_cnt_l", + PPU_PPU_STATICS_PPU_WB_LAST_FLAG_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x4bc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_ppu_wb_last_flag_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "statics_ppu_wb_dis_flag_vld_cnt_h", + PPU_PPU_STATICS_PPU_WB_DIS_FLAG_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x4c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_ppu_wb_dis_flag_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "statics_ppu_wb_dis_flag_vld_cnt_l", + PPU_PPU_STATICS_PPU_WB_DIS_FLAG_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x4c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_ppu_wb_dis_flag_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "statics_pbu_ppu_reorder_halt_send_type_vld_cnt_h", + PPU_PPU_STATICS_PBU_PPU_REORDER_HALT_SEND_TYPE_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x4c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_pbu_ppu_reorder_halt_send_type_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "statics_pbu_ppu_reorder_halt_send_type_vld_cnt_l", + PPU_PPU_STATICS_PBU_PPU_REORDER_HALT_SEND_TYPE_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x4c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_pbu_ppu_reorder_halt_send_type_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "statics_pbu_ppu_reorder_mf_type_vld_cnt_h", + PPU_PPU_STATICS_PBU_PPU_REORDER_MF_TYPE_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x4d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_pbu_ppu_reorder_mf_type_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "statics_pbu_ppu_reorder_mf_type_vld_cnt_l", + PPU_PPU_STATICS_PBU_PPU_REORDER_MF_TYPE_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x4d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_pbu_ppu_reorder_mf_type_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "statics_pbu_ppu_reorder_halt_continue_end_vld_cnt_h", + PPU_PPU_STATICS_PBU_PPU_REORDER_HALT_CONTINUE_END_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x4d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_pbu_ppu_reorder_halt_continue_end_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "statics_pbu_ppu_reorder_halt_continue_end_vld_cnt_l", + PPU_PPU_STATICS_PBU_PPU_REORDER_HALT_CONTINUE_END_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x4dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_statics_pbu_ppu_reorder_halt_continue_end_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "car_green_pkt_vld_cnt_h", + PPU_PPU_CAR_GREEN_PKT_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x4e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_car_green_pkt_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "car_green_pkt_vld_cnt_l", + PPU_PPU_CAR_GREEN_PKT_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x4e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_car_green_pkt_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "car_yellow_pkt_vld_cnt_h", + PPU_PPU_CAR_YELLOW_PKT_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x4e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_car_yellow_pkt_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "car_yellow_pkt_vld_cnt_l", + PPU_PPU_CAR_YELLOW_PKT_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x4ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_car_yellow_pkt_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "car_red_pkt_vld_cnt_h", + PPU_PPU_CAR_RED_PKT_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x4f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_car_red_pkt_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "car_red_pkt_vld_cnt_l", + PPU_PPU_CAR_RED_PKT_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x4f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_car_red_pkt_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "car_drop_pkt_vld_cnt_h", + PPU_PPU_CAR_DROP_PKT_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x4f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_car_drop_pkt_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "car_drop_pkt_vld_cnt_l", + PPU_PPU_CAR_DROP_PKT_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x4fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_car_drop_pkt_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "ppu_pktrx_mc_ptr_vld_cnt_h", + PPU_PPU_PPU_PKTRX_MC_PTR_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x500, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_pktrx_mc_ptr_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "ppu_pktrx_mc_ptr_vld_cnt_l", + PPU_PPU_PPU_PKTRX_MC_PTR_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x504, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_pktrx_mc_ptr_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "isu_ppu_loopback_fc_cnt_h", + PPU_PPU_ISU_PPU_LOOPBACK_FC_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x508, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_isu_ppu_loopback_fc_cnt_h_reg, + NULL, + NULL, + }, + { + "isu_ppu_loopback_fc_cnt_l", + PPU_PPU_ISU_PPU_LOOPBACK_FC_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x50c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_isu_ppu_loopback_fc_cnt_l_reg, + NULL, + NULL, + }, + { + "ppu_culster_pbu_mcode_pf_req_prog_full_assert_cfg", + PPU_PPU_PPU_CULSTER_PBU_MCODE_PF_REQ_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x540, + (32/8), + 0, + 0x5 + 1, + 0, + 4, + 1, + g_ppu_ppu_ppu_culster_pbu_mcode_pf_req_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_culster_pbu_mcode_pf_req_prog_full_negate_cfg", + PPU_PPU_PPU_CULSTER_PBU_MCODE_PF_REQ_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x558, + (32/8), + 0, + 0x5 + 1, + 0, + 4, + 1, + g_ppu_ppu_ppu_culster_pbu_mcode_pf_req_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_culster_pbu_mcode_pf_req_prog_empty_assert_cfg", + PPU_PPU_PPU_CULSTER_PBU_MCODE_PF_REQ_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x570, + (32/8), + 0, + 0x5 + 1, + 0, + 4, + 1, + g_ppu_ppu_ppu_culster_pbu_mcode_pf_req_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_culster_pbu_mcode_pf_req_prog_empty_negate_cfg", + PPU_PPU_PPU_CULSTER_PBU_MCODE_PF_REQ_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x588, + (32/8), + 0, + 0x5 + 1, + 0, + 4, + 1, + g_ppu_ppu_ppu_culster_pbu_mcode_pf_req_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_pbu_mcode_pf_rsp_prog_full_assert_cfg", + PPU_PPU_PPU_PBU_MCODE_PF_RSP_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x5a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_pbu_mcode_pf_rsp_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_pbu_mcode_pf_rsp_prog_full_negate_cfg", + PPU_PPU_PPU_PBU_MCODE_PF_RSP_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x5a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_pbu_mcode_pf_rsp_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_pbu_mcode_pf_rsp_prog_empty_assert_cfg", + PPU_PPU_PPU_PBU_MCODE_PF_RSP_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x5a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_pbu_mcode_pf_rsp_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_pbu_mcode_pf_rsp_prog_empty_negate_cfg", + PPU_PPU_PPU_PBU_MCODE_PF_RSP_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x5ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_pbu_mcode_pf_rsp_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "mccnt_fifo_prog_full_assert_cfg", + PPU_PPU_MCCNT_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x5b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_mccnt_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "mccnt_fifo_prog_full_negate_cfg", + PPU_PPU_MCCNT_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x5b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_mccnt_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "mccnt_fifo_prog_empty_assert_cfg", + PPU_PPU_MCCNT_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x5b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_mccnt_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "mccnt_fifo_prog_empty_negate_cfg", + PPU_PPU_MCCNT_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x5bc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_mccnt_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "uc_mf_fifo_prog_full_assert_cfg", + PPU_PPU_UC_MF_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x5c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_uc_mf_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "uc_mf_fifo_prog_full_negate_cfg", + PPU_PPU_UC_MF_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x5c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_uc_mf_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "uc_mf_fifo_prog_empty_assert_cfg", + PPU_PPU_UC_MF_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x5c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_uc_mf_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "uc_mf_fifo_prog_empty_negate_cfg", + PPU_PPU_UC_MF_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x5cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_uc_mf_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "mc_mf_fifo_prog_full_assert_cfg", + PPU_PPU_MC_MF_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x5d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_mc_mf_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "mc_mf_fifo_prog_full_negate_cfg", + PPU_PPU_MC_MF_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x5d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_mc_mf_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "mc_mf_fifo_prog_empty_assert_cfg", + PPU_PPU_MC_MF_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x5d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_mc_mf_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "mc_mf_fifo_prog_empty_negate_cfg", + PPU_PPU_MC_MF_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x5dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_mc_mf_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "isu_mf_fifo_prog_full_assert_cfg", + PPU_PPU_ISU_MF_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x5e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_isu_mf_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "isu_mf_fifo_prog_full_negate_cfg", + PPU_PPU_ISU_MF_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x5e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_isu_mf_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "isu_mf_fifo_prog_empty_assert_cfg", + PPU_PPU_ISU_MF_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x5e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_isu_mf_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "isu_mf_fifo_prog_empty_negate_cfg", + PPU_PPU_ISU_MF_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x5ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_isu_mf_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "isu_fwft_mf_fifo_prog_empty_assert_cfg", + PPU_PPU_ISU_FWFT_MF_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x5f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_isu_fwft_mf_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "isu_fwft_mf_fifo_prog_empty_negate_cfg", + PPU_PPU_ISU_FWFT_MF_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x5fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_isu_fwft_mf_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "isu_mc_para_mf_fifo_prog_full_assert_cfg", + PPU_PPU_ISU_MC_PARA_MF_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x600, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_isu_mc_para_mf_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "isu_mc_para_mf_fifo_prog_full_negate_cfg", + PPU_PPU_ISU_MC_PARA_MF_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x604, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_isu_mc_para_mf_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "isu_mc_para_mf_fifo_prog_empty_assert_cfg", + PPU_PPU_ISU_MC_PARA_MF_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x608, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_isu_mc_para_mf_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "isu_mc_para_mf_fifo_prog_empty_negate_cfg", + PPU_PPU_ISU_MC_PARA_MF_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x60c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_isu_mc_para_mf_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "group_id_fifo_prog_full_assert_cfg", + PPU_PPU_GROUP_ID_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x610, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_group_id_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "group_id_fifo_prog_full_negate_cfg", + PPU_PPU_GROUP_ID_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x614, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_group_id_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "group_id_fifo_prog_empty_assert_cfg", + PPU_PPU_GROUP_ID_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x618, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_group_id_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "group_id_fifo_prog_empty_negate_cfg", + PPU_PPU_GROUP_ID_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x61c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_group_id_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "sa_para_fifo_prog_full_assert_cfg", + PPU_PPU_SA_PARA_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x620, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_sa_para_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "sa_para_fifo_prog_full_negate_cfg", + PPU_PPU_SA_PARA_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x624, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_sa_para_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "sa_para_fifo_prog_empty_assert_cfg", + PPU_PPU_SA_PARA_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x628, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_sa_para_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "sa_para_fifo_prog_empty_negate_cfg", + PPU_PPU_SA_PARA_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x62c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_sa_para_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "se_mc_rsp_fifo_prog_full_assert_cfg", + PPU_PPU_SE_MC_RSP_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x630, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_se_mc_rsp_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "se_mc_rsp_fifo_prog_full_negate_cfg", + PPU_PPU_SE_MC_RSP_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x634, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_se_mc_rsp_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "se_mc_rsp_fifo_prog_empty_assert_cfg", + PPU_PPU_SE_MC_RSP_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x638, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_se_mc_rsp_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "se_mc_rsp_fifo_prog_empty_negate_cfg", + PPU_PPU_SE_MC_RSP_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x63c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_se_mc_rsp_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "dup_para_fifo_prog_full_assert_cfg", + PPU_PPU_DUP_PARA_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x640, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_dup_para_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "dup_para_fifo_prog_full_negate_cfg", + PPU_PPU_DUP_PARA_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x644, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_dup_para_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "dup_para_fifo_prog_empty_assert_cfg", + PPU_PPU_DUP_PARA_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x648, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_dup_para_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "dup_para_fifo_prog_empty_negate_cfg", + PPU_PPU_DUP_PARA_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x64c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_dup_para_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "pf_rsp_fifo_prog_full_assert_cfg", + PPU_PPU_PF_RSP_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x650, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pf_rsp_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "pf_rsp_fifo_prog_full_negate_cfg", + PPU_PPU_PF_RSP_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x654, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pf_rsp_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "pf_rsp_fifo_prog_empty_assert_cfg", + PPU_PPU_PF_RSP_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x658, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pf_rsp_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "pf_rsp_fifo_prog_empty_negate_cfg", + PPU_PPU_PF_RSP_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x65c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pf_rsp_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "dup_freeptr_fifo_prog_full_assert_cfg", + PPU_PPU_DUP_FREEPTR_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x660, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_dup_freeptr_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "dup_freeptr_fifo_prog_full_negate_cfg", + PPU_PPU_DUP_FREEPTR_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x664, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_dup_freeptr_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "dup_freeptr_fifo_prog_empty_assert_cfg", + PPU_PPU_DUP_FREEPTR_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x668, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_dup_freeptr_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "dup_freeptr_fifo_prog_empty_negate_cfg", + PPU_PPU_DUP_FREEPTR_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x66c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_dup_freeptr_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "pf_req_fifo_prog_full_assert_cfg", + PPU_PPU_PF_REQ_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x670, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pf_req_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "pf_req_fifo_prog_full_negate_cfg", + PPU_PPU_PF_REQ_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x674, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pf_req_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "pf_req_fifo_prog_empty_assert_cfg", + PPU_PPU_PF_REQ_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x678, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pf_req_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "pf_req_fifo_prog_empty_negate_cfg", + PPU_PPU_PF_REQ_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x67c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pf_req_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "car_flag_fifo_prog_full_assert_cfg", + PPU_PPU_CAR_FLAG_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x680, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_car_flag_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "car_flag_fifo_prog_full_negate_cfg", + PPU_PPU_CAR_FLAG_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x684, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_car_flag_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "car_flag_fifo_prog_empty_assert_cfg", + PPU_PPU_CAR_FLAG_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x688, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_car_flag_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "car_flag_fifo_prog_empty_negate_cfg", + PPU_PPU_CAR_FLAG_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x68c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_car_flag_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cluster_mf_out_afifo_prog_full_assert_cfg", + PPU_PPU_PPU_CLUSTER_MF_OUT_AFIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x690, + (32/8), + 0, + 0x5 + 1, + 0, + 16, + 1, + g_ppu_ppu_ppu_cluster_mf_out_afifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cluster_mf_out_afifo_prog_full_negate_cfg", + PPU_PPU_PPU_CLUSTER_MF_OUT_AFIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x694, + (32/8), + 0, + 0x5 + 1, + 0, + 16, + 1, + g_ppu_ppu_ppu_cluster_mf_out_afifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cluster_mf_out_afifo_prog_empty_assert_cfg", + PPU_PPU_PPU_CLUSTER_MF_OUT_AFIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x698, + (32/8), + 0, + 0x5 + 1, + 0, + 16, + 1, + g_ppu_ppu_ppu_cluster_mf_out_afifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cluster_mf_out_afifo_prog_empty_negate_cfg", + PPU_PPU_PPU_CLUSTER_MF_OUT_AFIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x69c, + (32/8), + 0, + 0x5 + 1, + 0, + 16, + 1, + g_ppu_ppu_ppu_cluster_mf_out_afifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_key_fifo_prog_full_assert_cfg", + PPU_PPU_PPU_COP_KEY_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x6f0, + (32/8), + 0, + 0x5 + 1, + 0, + 16, + 1, + g_ppu_ppu_ppu_cop_key_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_key_fifo_prog_full_negate_cfg", + PPU_PPU_PPU_COP_KEY_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x6f4, + (32/8), + 0, + 0x5 + 1, + 0, + 16, + 1, + g_ppu_ppu_ppu_cop_key_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_key_fifo_prog_empty_assert_cfg", + PPU_PPU_PPU_COP_KEY_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x6f8, + (32/8), + 0, + 0x5 + 1, + 0, + 16, + 1, + g_ppu_ppu_ppu_cop_key_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_key_fifo_prog_empty_negate_cfg", + PPU_PPU_PPU_COP_KEY_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x6fc, + (32/8), + 0, + 0x5 + 1, + 0, + 16, + 1, + g_ppu_ppu_ppu_cop_key_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_random_mod_para_fifo_prog_full_assert_cfg", + PPU_PPU_PPU_COP_RANDOM_MOD_PARA_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x750, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_random_mod_para_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_random_mod_para_fifo_prog_full_negate_cfg", + PPU_PPU_PPU_COP_RANDOM_MOD_PARA_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x754, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_random_mod_para_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_random_mod_para_fifo_prog_empty_assert_cfg", + PPU_PPU_PPU_COP_RANDOM_MOD_PARA_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x758, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_random_mod_para_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_random_mod_para_fifo_prog_empty_negate_cfg", + PPU_PPU_PPU_COP_RANDOM_MOD_PARA_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x75c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_random_mod_para_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_random_mod_result_fifo_prog_full_assert_cfg", + PPU_PPU_PPU_COP_RANDOM_MOD_RESULT_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x760, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_random_mod_result_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_random_mod_result_fifo_prog_full_negate_cfg", + PPU_PPU_PPU_COP_RANDOM_MOD_RESULT_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x764, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_random_mod_result_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_random_mod_result_fifo_prog_empty_assert_cfg", + PPU_PPU_PPU_COP_RANDOM_MOD_RESULT_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x768, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_random_mod_result_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_random_mod_result_fifo_prog_empty_negate_cfg", + PPU_PPU_PPU_COP_RANDOM_MOD_RESULT_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x76c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_random_mod_result_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_checksum_result_fifo_prog_full_assert_cfg", + PPU_PPU_PPU_COP_CHECKSUM_RESULT_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x770, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_checksum_result_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_checksum_result_fifo_prog_full_negate_cfg", + PPU_PPU_PPU_COP_CHECKSUM_RESULT_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x774, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_checksum_result_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_checksum_result_fifo_prog_empty_assert_cfg", + PPU_PPU_PPU_COP_CHECKSUM_RESULT_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x778, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_checksum_result_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_checksum_result_fifo_prog_empty_negate_cfg", + PPU_PPU_PPU_COP_CHECKSUM_RESULT_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x77c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_checksum_result_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_crc_first_para_fifo_prog_full_assert_cfg", + PPU_PPU_PPU_COP_CRC_FIRST_PARA_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x780, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_crc_first_para_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_crc_first_para_fifo_prog_full_negate_cfg", + PPU_PPU_PPU_COP_CRC_FIRST_PARA_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x784, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_crc_first_para_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_crc_first_para_fifo_prog_empty_assert_cfg", + PPU_PPU_PPU_COP_CRC_FIRST_PARA_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x788, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_crc_first_para_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_crc_first_para_fifo_prog_empty_negate_cfg", + PPU_PPU_PPU_COP_CRC_FIRST_PARA_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x78c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_crc_first_para_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_crc_bypass_delay_prog_full_assert_cfg", + PPU_PPU_PPU_COP_CRC_BYPASS_DELAY_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x790, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_crc_bypass_delay_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_crc_bypass_delay_prog_full_negate_cfg", + PPU_PPU_PPU_COP_CRC_BYPASS_DELAY_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x794, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_crc_bypass_delay_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_crc_bypass_delay_prog_empty_assert_cfg", + PPU_PPU_PPU_COP_CRC_BYPASS_DELAY_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x798, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_crc_bypass_delay_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_crc_bypass_delay_prog_empty_negate_cfg", + PPU_PPU_PPU_COP_CRC_BYPASS_DELAY_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x79c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_crc_bypass_delay_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_crc_second_para_fifo_prog_full_assert_cfg", + PPU_PPU_PPU_COP_CRC_SECOND_PARA_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x7a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_crc_second_para_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_crc_second_para_fifo_prog_full_negate_cfg", + PPU_PPU_PPU_COP_CRC_SECOND_PARA_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x7a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_crc_second_para_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_crc_second_para_fifo_prog_empty_assert_cfg", + PPU_PPU_PPU_COP_CRC_SECOND_PARA_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x7a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_crc_second_para_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_crc_second_para_fifo_prog_empty_negate_cfg", + PPU_PPU_PPU_COP_CRC_SECOND_PARA_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x7ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_crc_second_para_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_crc_result_fwft_fifo_prog_full_assert_cfg", + PPU_PPU_PPU_COP_CRC_RESULT_FWFT_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x7b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_crc_result_fwft_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_crc_result_fwft_fifo_prog_full_negate_cfg", + PPU_PPU_PPU_COP_CRC_RESULT_FWFT_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x7b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_crc_result_fwft_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_crc_result_fwft_fifo_prog_empty_assert_cfg", + PPU_PPU_PPU_COP_CRC_RESULT_FWFT_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x7b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_crc_result_fwft_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_crc_result_fwft_fifo_prog_empty_negate_cfg", + PPU_PPU_PPU_COP_CRC_RESULT_FWFT_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x7bc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_crc_result_fwft_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_multiply_para_fifo_prog_full_assert_cfg", + PPU_PPU_PPU_COP_MULTIPLY_PARA_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x7c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_multiply_para_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_multiply_para_fifo_prog_full_negate_cfg", + PPU_PPU_PPU_COP_MULTIPLY_PARA_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x7c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_multiply_para_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_multiply_para_fifo_prog_empty_assert_cfg", + PPU_PPU_PPU_COP_MULTIPLY_PARA_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x7c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_multiply_para_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_multiply_para_fifo_prog_empty_negate_cfg", + PPU_PPU_PPU_COP_MULTIPLY_PARA_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x7cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_multiply_para_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_multiply_para_result_fifo_prog_full_assert_cfg", + PPU_PPU_PPU_COP_MULTIPLY_PARA_RESULT_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x7d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_multiply_para_result_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_multiply_para_result_fifo_prog_full_negate_cfg", + PPU_PPU_PPU_COP_MULTIPLY_PARA_RESULT_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x7d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_multiply_para_result_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_multiply_para_result_fifo_prog_empty_assert_cfg", + PPU_PPU_PPU_COP_MULTIPLY_PARA_RESULT_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x7d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_multiply_para_result_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_multiply_para_result_fifo_prog_empty_negate_cfg", + PPU_PPU_PPU_COP_MULTIPLY_PARA_RESULT_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x7dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_cop_multiply_para_result_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "free_global_num_fwft_fifo_prog_full_assert_cfg", + PPU_PPU_FREE_GLOBAL_NUM_FWFT_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x7e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_free_global_num_fwft_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "free_global_num_fwft_fifo_prog_full_negate_cfg", + PPU_PPU_FREE_GLOBAL_NUM_FWFT_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x7e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_free_global_num_fwft_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "free_global_num_fwft_fifo_prog_empty_assert_cfg", + PPU_PPU_FREE_GLOBAL_NUM_FWFT_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x7e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_free_global_num_fwft_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "free_global_num_fwft_fifo_prog_empty_negate_cfg", + PPU_PPU_FREE_GLOBAL_NUM_FWFT_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x7ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_free_global_num_fwft_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_pktrx_mc_ptr_fifo_prog_full_assert_cfg", + PPU_PPU_PPU_PKTRX_MC_PTR_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x7f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_pktrx_mc_ptr_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_pktrx_mc_ptr_fifo_prog_full_negate_cfg", + PPU_PPU_PPU_PKTRX_MC_PTR_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x7f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_pktrx_mc_ptr_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_pktrx_mc_ptr_fifo_prog_empty_assert_cfg", + PPU_PPU_PPU_PKTRX_MC_PTR_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x7f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_pktrx_mc_ptr_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_pktrx_mc_ptr_fifo_prog_empty_negate_cfg", + PPU_PPU_PPU_PKTRX_MC_PTR_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x7fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_ppu_pktrx_mc_ptr_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "pkt_data0", + PPU_PPU_PKT_DATA0r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x800, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data0_reg, + NULL, + NULL, + }, + { + "pkt_data1", + PPU_PPU_PKT_DATA1r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x804, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data1_reg, + NULL, + NULL, + }, + { + "pkt_data2", + PPU_PPU_PKT_DATA2r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x808, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data2_reg, + NULL, + NULL, + }, + { + "pkt_data3", + PPU_PPU_PKT_DATA3r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x80c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data3_reg, + NULL, + NULL, + }, + { + "pkt_data4", + PPU_PPU_PKT_DATA4r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x810, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data4_reg, + NULL, + NULL, + }, + { + "pkt_data5", + PPU_PPU_PKT_DATA5r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x814, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data5_reg, + NULL, + NULL, + }, + { + "pkt_data6", + PPU_PPU_PKT_DATA6r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x818, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data6_reg, + NULL, + NULL, + }, + { + "pkt_data7", + PPU_PPU_PKT_DATA7r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x81c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data7_reg, + NULL, + NULL, + }, + { + "pkt_data8", + PPU_PPU_PKT_DATA8r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x820, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data8_reg, + NULL, + NULL, + }, + { + "pkt_data9", + PPU_PPU_PKT_DATA9r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x824, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data9_reg, + NULL, + NULL, + }, + { + "pkt_data10", + PPU_PPU_PKT_DATA10r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x828, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data10_reg, + NULL, + NULL, + }, + { + "pkt_data11", + PPU_PPU_PKT_DATA11r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x82c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data11_reg, + NULL, + NULL, + }, + { + "pkt_data12", + PPU_PPU_PKT_DATA12r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x830, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data12_reg, + NULL, + NULL, + }, + { + "pkt_data13", + PPU_PPU_PKT_DATA13r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x834, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data13_reg, + NULL, + NULL, + }, + { + "pkt_data14", + PPU_PPU_PKT_DATA14r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x838, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data14_reg, + NULL, + NULL, + }, + { + "pkt_data15", + PPU_PPU_PKT_DATA15r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x83c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data15_reg, + NULL, + NULL, + }, + { + "pkt_data16", + PPU_PPU_PKT_DATA16r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x840, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data16_reg, + NULL, + NULL, + }, + { + "pkt_data17", + PPU_PPU_PKT_DATA17r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x844, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data17_reg, + NULL, + NULL, + }, + { + "pkt_data18", + PPU_PPU_PKT_DATA18r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x848, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data18_reg, + NULL, + NULL, + }, + { + "pkt_data19", + PPU_PPU_PKT_DATA19r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x84c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data19_reg, + NULL, + NULL, + }, + { + "pkt_data20", + PPU_PPU_PKT_DATA20r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x850, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data20_reg, + NULL, + NULL, + }, + { + "pkt_data21", + PPU_PPU_PKT_DATA21r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x854, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data21_reg, + NULL, + NULL, + }, + { + "pkt_data22", + PPU_PPU_PKT_DATA22r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x858, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data22_reg, + NULL, + NULL, + }, + { + "pkt_data23", + PPU_PPU_PKT_DATA23r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x85c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data23_reg, + NULL, + NULL, + }, + { + "pkt_data24", + PPU_PPU_PKT_DATA24r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x860, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data24_reg, + NULL, + NULL, + }, + { + "pkt_data25", + PPU_PPU_PKT_DATA25r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x864, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data25_reg, + NULL, + NULL, + }, + { + "pkt_data26", + PPU_PPU_PKT_DATA26r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x868, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data26_reg, + NULL, + NULL, + }, + { + "pkt_data27", + PPU_PPU_PKT_DATA27r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x86c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data27_reg, + NULL, + NULL, + }, + { + "pkt_data28", + PPU_PPU_PKT_DATA28r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x870, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data28_reg, + NULL, + NULL, + }, + { + "pkt_data29", + PPU_PPU_PKT_DATA29r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x874, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data29_reg, + NULL, + NULL, + }, + { + "pkt_data30", + PPU_PPU_PKT_DATA30r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x878, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data30_reg, + NULL, + NULL, + }, + { + "pkt_data31", + PPU_PPU_PKT_DATA31r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x87c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data31_reg, + NULL, + NULL, + }, + { + "pkt_data32", + PPU_PPU_PKT_DATA32r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x880, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data32_reg, + NULL, + NULL, + }, + { + "pkt_data33", + PPU_PPU_PKT_DATA33r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x884, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data33_reg, + NULL, + NULL, + }, + { + "pkt_data34", + PPU_PPU_PKT_DATA34r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x888, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data34_reg, + NULL, + NULL, + }, + { + "pkt_data35", + PPU_PPU_PKT_DATA35r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x88c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data35_reg, + NULL, + NULL, + }, + { + "pkt_data36", + PPU_PPU_PKT_DATA36r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x890, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data36_reg, + NULL, + NULL, + }, + { + "pkt_data37", + PPU_PPU_PKT_DATA37r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x894, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data37_reg, + NULL, + NULL, + }, + { + "pkt_data38", + PPU_PPU_PKT_DATA38r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x898, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data38_reg, + NULL, + NULL, + }, + { + "pkt_data39", + PPU_PPU_PKT_DATA39r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x89c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data39_reg, + NULL, + NULL, + }, + { + "pkt_data40", + PPU_PPU_PKT_DATA40r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x8a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data40_reg, + NULL, + NULL, + }, + { + "pkt_data41", + PPU_PPU_PKT_DATA41r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x8a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data41_reg, + NULL, + NULL, + }, + { + "pkt_data42", + PPU_PPU_PKT_DATA42r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x8a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data42_reg, + NULL, + NULL, + }, + { + "pkt_data43", + PPU_PPU_PKT_DATA43r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x8ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data43_reg, + NULL, + NULL, + }, + { + "pkt_data44", + PPU_PPU_PKT_DATA44r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x8b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data44_reg, + NULL, + NULL, + }, + { + "pkt_data45", + PPU_PPU_PKT_DATA45r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x8b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data45_reg, + NULL, + NULL, + }, + { + "pkt_data46", + PPU_PPU_PKT_DATA46r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x8b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data46_reg, + NULL, + NULL, + }, + { + "pkt_data47", + PPU_PPU_PKT_DATA47r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x8bc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data47_reg, + NULL, + NULL, + }, + { + "pkt_data48", + PPU_PPU_PKT_DATA48r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x8c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data48_reg, + NULL, + NULL, + }, + { + "pkt_data49", + PPU_PPU_PKT_DATA49r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x8c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data49_reg, + NULL, + NULL, + }, + { + "pkt_data50", + PPU_PPU_PKT_DATA50r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x8c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data50_reg, + NULL, + NULL, + }, + { + "pkt_data51", + PPU_PPU_PKT_DATA51r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x8cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data51_reg, + NULL, + NULL, + }, + { + "pkt_data52", + PPU_PPU_PKT_DATA52r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x8d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data52_reg, + NULL, + NULL, + }, + { + "pkt_data53", + PPU_PPU_PKT_DATA53r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x8d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data53_reg, + NULL, + NULL, + }, + { + "pkt_data54", + PPU_PPU_PKT_DATA54r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x8d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data54_reg, + NULL, + NULL, + }, + { + "pkt_data55", + PPU_PPU_PKT_DATA55r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x8dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data55_reg, + NULL, + NULL, + }, + { + "pkt_data56", + PPU_PPU_PKT_DATA56r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x8e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data56_reg, + NULL, + NULL, + }, + { + "pkt_data57", + PPU_PPU_PKT_DATA57r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x8e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data57_reg, + NULL, + NULL, + }, + { + "pkt_data58", + PPU_PPU_PKT_DATA58r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x8e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data58_reg, + NULL, + NULL, + }, + { + "pkt_data59", + PPU_PPU_PKT_DATA59r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x8ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data59_reg, + NULL, + NULL, + }, + { + "pkt_data60", + PPU_PPU_PKT_DATA60r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x8f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data60_reg, + NULL, + NULL, + }, + { + "pkt_data61", + PPU_PPU_PKT_DATA61r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x8f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data61_reg, + NULL, + NULL, + }, + { + "pkt_data62", + PPU_PPU_PKT_DATA62r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x8f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data62_reg, + NULL, + NULL, + }, + { + "pkt_data63", + PPU_PPU_PKT_DATA63r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x8fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data63_reg, + NULL, + NULL, + }, + { + "pkt_data64", + PPU_PPU_PKT_DATA64r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x900, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data64_reg, + NULL, + NULL, + }, + { + "pkt_data65", + PPU_PPU_PKT_DATA65r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x904, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data65_reg, + NULL, + NULL, + }, + { + "pkt_data66", + PPU_PPU_PKT_DATA66r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x908, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data66_reg, + NULL, + NULL, + }, + { + "pkt_data67", + PPU_PPU_PKT_DATA67r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x90c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data67_reg, + NULL, + NULL, + }, + { + "pkt_data68", + PPU_PPU_PKT_DATA68r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x910, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data68_reg, + NULL, + NULL, + }, + { + "pkt_data69", + PPU_PPU_PKT_DATA69r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x914, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data69_reg, + NULL, + NULL, + }, + { + "pkt_data70", + PPU_PPU_PKT_DATA70r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x918, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data70_reg, + NULL, + NULL, + }, + { + "pkt_data71", + PPU_PPU_PKT_DATA71r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x91c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data71_reg, + NULL, + NULL, + }, + { + "pkt_data72", + PPU_PPU_PKT_DATA72r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x920, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data72_reg, + NULL, + NULL, + }, + { + "pkt_data73", + PPU_PPU_PKT_DATA73r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x924, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data73_reg, + NULL, + NULL, + }, + { + "pkt_data74", + PPU_PPU_PKT_DATA74r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x928, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data74_reg, + NULL, + NULL, + }, + { + "pkt_data75", + PPU_PPU_PKT_DATA75r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x92c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data75_reg, + NULL, + NULL, + }, + { + "pkt_data76", + PPU_PPU_PKT_DATA76r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x930, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data76_reg, + NULL, + NULL, + }, + { + "pkt_data77", + PPU_PPU_PKT_DATA77r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x934, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data77_reg, + NULL, + NULL, + }, + { + "pkt_data78", + PPU_PPU_PKT_DATA78r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x938, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data78_reg, + NULL, + NULL, + }, + { + "pkt_data79", + PPU_PPU_PKT_DATA79r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x93c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data79_reg, + NULL, + NULL, + }, + { + "pkt_data80", + PPU_PPU_PKT_DATA80r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x940, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data80_reg, + NULL, + NULL, + }, + { + "pkt_data81", + PPU_PPU_PKT_DATA81r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x944, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data81_reg, + NULL, + NULL, + }, + { + "pkt_data82", + PPU_PPU_PKT_DATA82r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x948, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data82_reg, + NULL, + NULL, + }, + { + "pkt_data83", + PPU_PPU_PKT_DATA83r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x94c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data83_reg, + NULL, + NULL, + }, + { + "pkt_data84", + PPU_PPU_PKT_DATA84r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x950, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data84_reg, + NULL, + NULL, + }, + { + "pkt_data85", + PPU_PPU_PKT_DATA85r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x954, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data85_reg, + NULL, + NULL, + }, + { + "pkt_data86", + PPU_PPU_PKT_DATA86r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x958, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data86_reg, + NULL, + NULL, + }, + { + "pkt_data87", + PPU_PPU_PKT_DATA87r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x95c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data87_reg, + NULL, + NULL, + }, + { + "pkt_data88", + PPU_PPU_PKT_DATA88r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x960, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data88_reg, + NULL, + NULL, + }, + { + "pkt_data89", + PPU_PPU_PKT_DATA89r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x964, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data89_reg, + NULL, + NULL, + }, + { + "pkt_data90", + PPU_PPU_PKT_DATA90r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x968, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data90_reg, + NULL, + NULL, + }, + { + "pkt_data91", + PPU_PPU_PKT_DATA91r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x96c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data91_reg, + NULL, + NULL, + }, + { + "pkt_data92", + PPU_PPU_PKT_DATA92r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x970, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data92_reg, + NULL, + NULL, + }, + { + "pkt_data93", + PPU_PPU_PKT_DATA93r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x974, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data93_reg, + NULL, + NULL, + }, + { + "pkt_data94", + PPU_PPU_PKT_DATA94r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x978, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data94_reg, + NULL, + NULL, + }, + { + "pkt_data95", + PPU_PPU_PKT_DATA95r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x97c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data95_reg, + NULL, + NULL, + }, + { + "pkt_data96", + PPU_PPU_PKT_DATA96r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x980, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data96_reg, + NULL, + NULL, + }, + { + "pkt_data97", + PPU_PPU_PKT_DATA97r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x984, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data97_reg, + NULL, + NULL, + }, + { + "pkt_data98", + PPU_PPU_PKT_DATA98r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x988, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data98_reg, + NULL, + NULL, + }, + { + "pkt_data99", + PPU_PPU_PKT_DATA99r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x98c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data99_reg, + NULL, + NULL, + }, + { + "pkt_data100", + PPU_PPU_PKT_DATA100r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x990, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data100_reg, + NULL, + NULL, + }, + { + "pkt_data101", + PPU_PPU_PKT_DATA101r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x994, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data101_reg, + NULL, + NULL, + }, + { + "pkt_data102", + PPU_PPU_PKT_DATA102r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x998, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data102_reg, + NULL, + NULL, + }, + { + "pkt_data103", + PPU_PPU_PKT_DATA103r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x99c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data103_reg, + NULL, + NULL, + }, + { + "pkt_data104", + PPU_PPU_PKT_DATA104r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x9a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data104_reg, + NULL, + NULL, + }, + { + "pkt_data105", + PPU_PPU_PKT_DATA105r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x9a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data105_reg, + NULL, + NULL, + }, + { + "pkt_data106", + PPU_PPU_PKT_DATA106r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x9a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data106_reg, + NULL, + NULL, + }, + { + "pkt_data107", + PPU_PPU_PKT_DATA107r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x9ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data107_reg, + NULL, + NULL, + }, + { + "pkt_data108", + PPU_PPU_PKT_DATA108r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x9b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data108_reg, + NULL, + NULL, + }, + { + "pkt_data109", + PPU_PPU_PKT_DATA109r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x9b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data109_reg, + NULL, + NULL, + }, + { + "pkt_data110", + PPU_PPU_PKT_DATA110r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x9b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data110_reg, + NULL, + NULL, + }, + { + "pkt_data111", + PPU_PPU_PKT_DATA111r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x9bc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data111_reg, + NULL, + NULL, + }, + { + "pkt_data112", + PPU_PPU_PKT_DATA112r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x9c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data112_reg, + NULL, + NULL, + }, + { + "pkt_data113", + PPU_PPU_PKT_DATA113r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x9c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data113_reg, + NULL, + NULL, + }, + { + "pkt_data114", + PPU_PPU_PKT_DATA114r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x9c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data114_reg, + NULL, + NULL, + }, + { + "pkt_data115", + PPU_PPU_PKT_DATA115r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x9cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data115_reg, + NULL, + NULL, + }, + { + "pkt_data116", + PPU_PPU_PKT_DATA116r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x9d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data116_reg, + NULL, + NULL, + }, + { + "pkt_data117", + PPU_PPU_PKT_DATA117r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x9d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data117_reg, + NULL, + NULL, + }, + { + "pkt_data118", + PPU_PPU_PKT_DATA118r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x9d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data118_reg, + NULL, + NULL, + }, + { + "pkt_data119", + PPU_PPU_PKT_DATA119r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x9dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data119_reg, + NULL, + NULL, + }, + { + "pkt_data120", + PPU_PPU_PKT_DATA120r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x9e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data120_reg, + NULL, + NULL, + }, + { + "pkt_data121", + PPU_PPU_PKT_DATA121r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x9e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data121_reg, + NULL, + NULL, + }, + { + "pkt_data122", + PPU_PPU_PKT_DATA122r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x9e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data122_reg, + NULL, + NULL, + }, + { + "pkt_data123", + PPU_PPU_PKT_DATA123r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x9ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data123_reg, + NULL, + NULL, + }, + { + "pkt_data124", + PPU_PPU_PKT_DATA124r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x9f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data124_reg, + NULL, + NULL, + }, + { + "pkt_data125", + PPU_PPU_PKT_DATA125r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x9f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data125_reg, + NULL, + NULL, + }, + { + "pkt_data126", + PPU_PPU_PKT_DATA126r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x9f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data126_reg, + NULL, + NULL, + }, + { + "pkt_data127", + PPU_PPU_PKT_DATA127r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0x9fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_pkt_data127_reg, + NULL, + NULL, + }, + { + "spr0", + PPU_PPU_SPR0r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa00, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr0_reg, + NULL, + NULL, + }, + { + "spr1", + PPU_PPU_SPR1r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa04, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr1_reg, + NULL, + NULL, + }, + { + "spr2", + PPU_PPU_SPR2r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa08, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr2_reg, + NULL, + NULL, + }, + { + "spr3", + PPU_PPU_SPR3r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa0c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr3_reg, + NULL, + NULL, + }, + { + "spr4", + PPU_PPU_SPR4r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa10, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr4_reg, + NULL, + NULL, + }, + { + "spr5", + PPU_PPU_SPR5r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa14, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr5_reg, + NULL, + NULL, + }, + { + "spr6", + PPU_PPU_SPR6r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa18, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr6_reg, + NULL, + NULL, + }, + { + "spr7", + PPU_PPU_SPR7r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa1c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr7_reg, + NULL, + NULL, + }, + { + "spr8", + PPU_PPU_SPR8r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa20, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr8_reg, + NULL, + NULL, + }, + { + "spr9", + PPU_PPU_SPR9r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa24, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr9_reg, + NULL, + NULL, + }, + { + "spr10", + PPU_PPU_SPR10r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa28, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr10_reg, + NULL, + NULL, + }, + { + "spr11", + PPU_PPU_SPR11r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa2c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr11_reg, + NULL, + NULL, + }, + { + "spr12", + PPU_PPU_SPR12r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa30, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr12_reg, + NULL, + NULL, + }, + { + "spr13", + PPU_PPU_SPR13r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa34, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr13_reg, + NULL, + NULL, + }, + { + "spr14", + PPU_PPU_SPR14r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa38, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr14_reg, + NULL, + NULL, + }, + { + "spr15", + PPU_PPU_SPR15r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa3c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr15_reg, + NULL, + NULL, + }, + { + "spr16", + PPU_PPU_SPR16r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa40, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr16_reg, + NULL, + NULL, + }, + { + "spr17", + PPU_PPU_SPR17r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa44, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr17_reg, + NULL, + NULL, + }, + { + "spr18", + PPU_PPU_SPR18r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa48, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr18_reg, + NULL, + NULL, + }, + { + "spr19", + PPU_PPU_SPR19r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa4c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr19_reg, + NULL, + NULL, + }, + { + "spr20", + PPU_PPU_SPR20r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa50, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr20_reg, + NULL, + NULL, + }, + { + "spr21", + PPU_PPU_SPR21r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa54, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr21_reg, + NULL, + NULL, + }, + { + "spr22", + PPU_PPU_SPR22r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa58, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr22_reg, + NULL, + NULL, + }, + { + "spr23", + PPU_PPU_SPR23r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa5c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr23_reg, + NULL, + NULL, + }, + { + "spr24", + PPU_PPU_SPR24r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa60, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr24_reg, + NULL, + NULL, + }, + { + "spr25", + PPU_PPU_SPR25r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa64, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr25_reg, + NULL, + NULL, + }, + { + "spr26", + PPU_PPU_SPR26r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa68, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr26_reg, + NULL, + NULL, + }, + { + "spr27", + PPU_PPU_SPR27r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa6c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr27_reg, + NULL, + NULL, + }, + { + "spr28", + PPU_PPU_SPR28r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa70, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr28_reg, + NULL, + NULL, + }, + { + "spr29", + PPU_PPU_SPR29r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa74, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr29_reg, + NULL, + NULL, + }, + { + "spr30", + PPU_PPU_SPR30r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa78, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr30_reg, + NULL, + NULL, + }, + { + "spr31", + PPU_PPU_SPR31r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa7c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_spr31_reg, + NULL, + NULL, + }, + { + "rsp0", + PPU_PPU_RSP0r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa80, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp0_reg, + NULL, + NULL, + }, + { + "rsp1", + PPU_PPU_RSP1r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa84, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp1_reg, + NULL, + NULL, + }, + { + "rsp2", + PPU_PPU_RSP2r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa88, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp2_reg, + NULL, + NULL, + }, + { + "rsp3", + PPU_PPU_RSP3r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa8c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp3_reg, + NULL, + NULL, + }, + { + "rsp4", + PPU_PPU_RSP4r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa90, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp4_reg, + NULL, + NULL, + }, + { + "rsp5", + PPU_PPU_RSP5r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa94, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp5_reg, + NULL, + NULL, + }, + { + "rsp6", + PPU_PPU_RSP6r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa98, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp6_reg, + NULL, + NULL, + }, + { + "rsp7", + PPU_PPU_RSP7r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xa9c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp7_reg, + NULL, + NULL, + }, + { + "rsp8", + PPU_PPU_RSP8r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xaa0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp8_reg, + NULL, + NULL, + }, + { + "rsp9", + PPU_PPU_RSP9r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xaa4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp9_reg, + NULL, + NULL, + }, + { + "rsp10", + PPU_PPU_RSP10r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xaa8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp10_reg, + NULL, + NULL, + }, + { + "rsp11", + PPU_PPU_RSP11r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xaac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp11_reg, + NULL, + NULL, + }, + { + "rsp12", + PPU_PPU_RSP12r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xab0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp12_reg, + NULL, + NULL, + }, + { + "rsp13", + PPU_PPU_RSP13r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xab4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp13_reg, + NULL, + NULL, + }, + { + "rsp14", + PPU_PPU_RSP14r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xab8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp14_reg, + NULL, + NULL, + }, + { + "rsp15", + PPU_PPU_RSP15r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xabc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp15_reg, + NULL, + NULL, + }, + { + "rsp16", + PPU_PPU_RSP16r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xac0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp16_reg, + NULL, + NULL, + }, + { + "rsp17", + PPU_PPU_RSP17r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xac4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp17_reg, + NULL, + NULL, + }, + { + "rsp18", + PPU_PPU_RSP18r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xac8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp18_reg, + NULL, + NULL, + }, + { + "rsp19", + PPU_PPU_RSP19r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xacc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp19_reg, + NULL, + NULL, + }, + { + "rsp20", + PPU_PPU_RSP20r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xad0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp20_reg, + NULL, + NULL, + }, + { + "rsp21", + PPU_PPU_RSP21r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xad4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp21_reg, + NULL, + NULL, + }, + { + "rsp22", + PPU_PPU_RSP22r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xad8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp22_reg, + NULL, + NULL, + }, + { + "rsp23", + PPU_PPU_RSP23r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xadc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp23_reg, + NULL, + NULL, + }, + { + "rsp24", + PPU_PPU_RSP24r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xae0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp24_reg, + NULL, + NULL, + }, + { + "rsp25", + PPU_PPU_RSP25r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xae4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp25_reg, + NULL, + NULL, + }, + { + "rsp26", + PPU_PPU_RSP26r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xae8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp26_reg, + NULL, + NULL, + }, + { + "rsp27", + PPU_PPU_RSP27r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xaec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp27_reg, + NULL, + NULL, + }, + { + "rsp28", + PPU_PPU_RSP28r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xaf0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp28_reg, + NULL, + NULL, + }, + { + "rsp29", + PPU_PPU_RSP29r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xaf4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp29_reg, + NULL, + NULL, + }, + { + "rsp30", + PPU_PPU_RSP30r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xaf8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp30_reg, + NULL, + NULL, + }, + { + "rsp31", + PPU_PPU_RSP31r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xafc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_rsp31_reg, + NULL, + NULL, + }, + { + "key0", + PPU_PPU_KEY0r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xb00, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_key0_reg, + NULL, + NULL, + }, + { + "key1", + PPU_PPU_KEY1r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xb04, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_key1_reg, + NULL, + NULL, + }, + { + "key2", + PPU_PPU_KEY2r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xb08, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_key2_reg, + NULL, + NULL, + }, + { + "key3", + PPU_PPU_KEY3r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xb0c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_key3_reg, + NULL, + NULL, + }, + { + "key4", + PPU_PPU_KEY4r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xb10, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_key4_reg, + NULL, + NULL, + }, + { + "key5", + PPU_PPU_KEY5r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xb14, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_key5_reg, + NULL, + NULL, + }, + { + "key6", + PPU_PPU_KEY6r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xb18, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_key6_reg, + NULL, + NULL, + }, + { + "key7", + PPU_PPU_KEY7r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xb1c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_key7_reg, + NULL, + NULL, + }, + { + "key8", + PPU_PPU_KEY8r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xb20, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_key8_reg, + NULL, + NULL, + }, + { + "key9", + PPU_PPU_KEY9r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xb24, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_key9_reg, + NULL, + NULL, + }, + { + "key10", + PPU_PPU_KEY10r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xb28, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_key10_reg, + NULL, + NULL, + }, + { + "key11", + PPU_PPU_KEY11r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xb2c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_key11_reg, + NULL, + NULL, + }, + { + "key12", + PPU_PPU_KEY12r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xb30, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_key12_reg, + NULL, + NULL, + }, + { + "key13", + PPU_PPU_KEY13r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xb34, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_key13_reg, + NULL, + NULL, + }, + { + "key14", + PPU_PPU_KEY14r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xb38, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_key14_reg, + NULL, + NULL, + }, + { + "key15", + PPU_PPU_KEY15r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xb3c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_key15_reg, + NULL, + NULL, + }, + { + "key16", + PPU_PPU_KEY16r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xb40, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_key16_reg, + NULL, + NULL, + }, + { + "key17", + PPU_PPU_KEY17r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xb44, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_key17_reg, + NULL, + NULL, + }, + { + "key18", + PPU_PPU_KEY18r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xb48, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_key18_reg, + NULL, + NULL, + }, + { + "key19", + PPU_PPU_KEY19r, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xb4c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ppu_ppu_key19_reg, + NULL, + NULL, + }, + { + "flag", + PPU_PPU_FLAGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_PPU_CSR_BASE_ADDR + 0xb50, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_ppu_ppu_flag_reg, + NULL, + NULL, + }, + { + "int_1200m_flag", + PPU_CLUSTER_INT_1200M_FLAGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x00, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 8, + g_ppu_cluster_int_1200m_flag_reg, + NULL, + NULL, + }, + { + "bp_instr_l", + PPU_CLUSTER_BP_INSTR_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x04, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_bp_instr_l_reg, + NULL, + NULL, + }, + { + "bp_instr_h", + PPU_CLUSTER_BP_INSTR_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x08, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_bp_instr_h_reg, + NULL, + NULL, + }, + { + "bp_addr", + PPU_CLUSTER_BP_ADDRr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x0c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0x7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 4, + 1, + g_ppu_cluster_bp_addr_reg, + NULL, + NULL, + }, + { + "drr", + PPU_CLUSTER_DRRr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x2c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0x7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 4, + 1, + g_ppu_cluster_drr_reg, + NULL, + NULL, + }, + { + "dsr", + PPU_CLUSTER_DSRr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x4c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_dsr_reg, + NULL, + NULL, + }, + { + "dbg_rtl_date", + PPU_CLUSTER_DBG_RTL_DATEr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x50, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_dbg_rtl_date_reg, + NULL, + NULL, + }, + { + "me_continue", + PPU_CLUSTER_ME_CONTINUEr, + PPU, + DPP_REG_FLAG_WO | DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x80, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_me_continue_reg, + NULL, + NULL, + }, + { + "me_step", + PPU_CLUSTER_ME_STEPr, + PPU, + DPP_REG_FLAG_WO | DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x84, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_me_step_reg, + NULL, + NULL, + }, + { + "me_refresh", + PPU_CLUSTER_ME_REFRESHr, + PPU, + DPP_REG_FLAG_WO | DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x88, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_me_refresh_reg, + NULL, + NULL, + }, + { + "drr_clr", + PPU_CLUSTER_DRR_CLRr, + PPU, + DPP_REG_FLAG_WO | DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x8c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_drr_clr_reg, + NULL, + NULL, + }, + { + "me_busy_thresold", + PPU_CLUSTER_ME_BUSY_THRESOLDr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x90, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_me_busy_thresold_reg, + NULL, + NULL, + }, + { + "int_1200m_sta", + PPU_CLUSTER_INT_1200M_STAr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x94, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 8, + g_ppu_cluster_int_1200m_sta_reg, + NULL, + NULL, + }, + { + "int_1200m_me_fifo_mask_l", + PPU_CLUSTER_INT_1200M_ME_FIFO_MASK_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc0, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0x7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 4, + 32, + g_ppu_cluster_int_1200m_me_fifo_mask_l_reg, + NULL, + NULL, + }, + { + "int_1200m_me_fifo_mask_h", + PPU_CLUSTER_INT_1200M_ME_FIFO_MASK_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xe0, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0x7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 4, + 2, + g_ppu_cluster_int_1200m_me_fifo_mask_h_reg, + NULL, + NULL, + }, + { + "me_fifo_interrupt_flag_l", + PPU_CLUSTER_ME_FIFO_INTERRUPT_FLAG_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x100, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0x7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 4, + 32, + g_ppu_cluster_me_fifo_interrupt_flag_l_reg, + NULL, + NULL, + }, + { + "me_fifo_interrupt_flag_h", + PPU_CLUSTER_ME_FIFO_INTERRUPT_FLAG_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x120, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0x7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 4, + 2, + g_ppu_cluster_me_fifo_interrupt_flag_h_reg, + NULL, + NULL, + }, + { + "me_fifo_interrupt_sta_l", + PPU_CLUSTER_ME_FIFO_INTERRUPT_STA_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x140, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0x7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 4, + 32, + g_ppu_cluster_me_fifo_interrupt_sta_l_reg, + NULL, + NULL, + }, + { + "me_fifo_interrupt_sta_h", + PPU_CLUSTER_ME_FIFO_INTERRUPT_STA_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x160, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0x7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 4, + 2, + g_ppu_cluster_me_fifo_interrupt_sta_h_reg, + NULL, + NULL, + }, + { + "int_1200m_cluster_mex_fifo_mask_l", + PPU_CLUSTER_INT_1200M_CLUSTER_MEX_FIFO_MASK_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x800, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 32, + g_ppu_cluster_int_1200m_cluster_mex_fifo_mask_l_reg, + NULL, + NULL, + }, + { + "int_1200m_cluster_mex_fifo_mask_h", + PPU_CLUSTER_INT_1200M_CLUSTER_MEX_FIFO_MASK_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x804, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 19, + g_ppu_cluster_int_1200m_cluster_mex_fifo_mask_h_reg, + NULL, + NULL, + }, + { + "int_1200m_cluster_mex_fifo_flag_l", + PPU_CLUSTER_INT_1200M_CLUSTER_MEX_FIFO_FLAG_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x808, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 32, + g_ppu_cluster_int_1200m_cluster_mex_fifo_flag_l_reg, + NULL, + NULL, + }, + { + "int_1200m_cluster_mex_fifo_flag_h", + PPU_CLUSTER_INT_1200M_CLUSTER_MEX_FIFO_FLAG_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x80c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 19, + g_ppu_cluster_int_1200m_cluster_mex_fifo_flag_h_reg, + NULL, + NULL, + }, + { + "int_1200m_cluster_mex_fifo_stat_l", + PPU_CLUSTER_INT_1200M_CLUSTER_MEX_FIFO_STAT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x810, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 32, + g_ppu_cluster_int_1200m_cluster_mex_fifo_stat_l_reg, + NULL, + NULL, + }, + { + "int_1200m_cluster_mex_fifo_stat_h", + PPU_CLUSTER_INT_1200M_CLUSTER_MEX_FIFO_STAT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x814, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 19, + g_ppu_cluster_int_1200m_cluster_mex_fifo_stat_h_reg, + NULL, + NULL, + }, + { + "ppu_statics_wb_exception_cfg", + PPU_CLUSTER_PPU_STATICS_WB_EXCEPTION_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x824, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 6, + g_ppu_cluster_ppu_statics_wb_exception_cfg_reg, + NULL, + NULL, + }, + { + "thread_switch_en", + PPU_CLUSTER_THREAD_SWITCH_ENr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x8c0, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_thread_switch_en_reg, + NULL, + NULL, + }, + { + "is_me_not_idle", + PPU_CLUSTER_IS_ME_NOT_IDLEr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x8c4, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 8, + g_ppu_cluster_is_me_not_idle_reg, + NULL, + NULL, + }, + { + "ppu_cluster_mf_in_afifo_prog_empty_assert_cfg", + PPU_CLUSTER_PPU_CLUSTER_MF_IN_AFIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc00, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_cluster_mf_in_afifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cluster_mf_in_afifo_prog_empty_negate_cfg", + PPU_CLUSTER_PPU_CLUSTER_MF_IN_AFIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc04, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_cluster_mf_in_afifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "ese_rsp_afifo_prog_empty_assert_cfg", + PPU_CLUSTER_ESE_RSP_AFIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc08, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ese_rsp_afifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "ese_rsp_afifo_prog_empty_negate_cfg", + PPU_CLUSTER_ESE_RSP_AFIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc0c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ese_rsp_afifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "ise_rsp_afifo_prog_empty_assert_cfg", + PPU_CLUSTER_ISE_RSP_AFIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc10, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ise_rsp_afifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "ise_rsp_afifo_prog_empty_negate_cfg", + PPU_CLUSTER_ISE_RSP_AFIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc14, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ise_rsp_afifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_rsp_ptr_fwft_fifo0_prog_full_assert_cfg", + PPU_CLUSTER_PPU_RSP_PTR_FWFT_FIFO0_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc18, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_rsp_ptr_fwft_fifo0_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_rsp_ptr_fwft_fifo0_prog_full_negate_cfg", + PPU_CLUSTER_PPU_RSP_PTR_FWFT_FIFO0_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc1c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_rsp_ptr_fwft_fifo0_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_rsp_ptr_fwft_fifo0_prog_empty_assert_cfg", + PPU_CLUSTER_PPU_RSP_PTR_FWFT_FIFO0_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc20, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_rsp_ptr_fwft_fifo0_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_rsp_ptr_fwft_fifo0_prog_empty_negate_cfg", + PPU_CLUSTER_PPU_RSP_PTR_FWFT_FIFO0_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc24, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_rsp_ptr_fwft_fifo0_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_rsp_ptr_fwft_fifo1_prog_full_assert_cfg", + PPU_CLUSTER_PPU_RSP_PTR_FWFT_FIFO1_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc28, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_rsp_ptr_fwft_fifo1_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_rsp_ptr_fwft_fifo1_prog_full_negate_cfg", + PPU_CLUSTER_PPU_RSP_PTR_FWFT_FIFO1_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc2c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_rsp_ptr_fwft_fifo1_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_rsp_ptr_fwft_fifo1_prog_empty_assert_cfg", + PPU_CLUSTER_PPU_RSP_PTR_FWFT_FIFO1_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc30, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_rsp_ptr_fwft_fifo1_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_rsp_ptr_fwft_fifo1_prog_empty_negate_cfg", + PPU_CLUSTER_PPU_RSP_PTR_FWFT_FIFO1_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc34, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_rsp_ptr_fwft_fifo1_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "sta_rsp_afifo_prog_empty_assert_cfg", + PPU_CLUSTER_STA_RSP_AFIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc38, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_sta_rsp_afifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "sta_rsp_afifo_prog_empty_negate_cfg", + PPU_CLUSTER_STA_RSP_AFIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc3c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_sta_rsp_afifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_sta_rsp_fwft_fifo_prog_full_assert_cfg", + PPU_CLUSTER_PPU_STA_RSP_FWFT_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc40, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_sta_rsp_fwft_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_sta_rsp_fwft_fifo_prog_full_negate_cfg", + PPU_CLUSTER_PPU_STA_RSP_FWFT_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc44, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_sta_rsp_fwft_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_sta_rsp_fwft_fifo_prog_empty_assert_cfg", + PPU_CLUSTER_PPU_STA_RSP_FWFT_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc48, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_sta_rsp_fwft_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_sta_rsp_fwft_fifo_prog_empty_negate_cfg", + PPU_CLUSTER_PPU_STA_RSP_FWFT_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc4c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_sta_rsp_fwft_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "cop_rsp_fifo_prog_full_assert_cfg", + PPU_CLUSTER_COP_RSP_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc50, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_cop_rsp_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "cop_rsp_fifo_prog_full_negate_cfg", + PPU_CLUSTER_COP_RSP_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc54, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_cop_rsp_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "cop_rsp_fifo_prog_empty_assert_cfg", + PPU_CLUSTER_COP_RSP_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc58, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_cop_rsp_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "cop_rsp_fifo_prog_empty_negate_cfg", + PPU_CLUSTER_COP_RSP_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc5c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_cop_rsp_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "mcode_pf_rsp_fifo_prog_full_assert_cfg", + PPU_CLUSTER_MCODE_PF_RSP_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc60, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_mcode_pf_rsp_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "mcode_pf_rsp_fifo_prog_full_negate_cfg", + PPU_CLUSTER_MCODE_PF_RSP_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc64, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_mcode_pf_rsp_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "mcode_pf_rsp_fifo_prog_empty_assert_cfg", + PPU_CLUSTER_MCODE_PF_RSP_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc68, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_mcode_pf_rsp_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "mcode_pf_rsp_fifo_prog_empty_negate_cfg", + PPU_CLUSTER_MCODE_PF_RSP_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc6c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_mcode_pf_rsp_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_rsp_fwft_fifo_prog_full_assert_cfg", + PPU_CLUSTER_PPU_COP_RSP_FWFT_FIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc70, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_cop_rsp_fwft_fifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_rsp_fwft_fifo_prog_full_negate_cfg", + PPU_CLUSTER_PPU_COP_RSP_FWFT_FIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc74, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_cop_rsp_fwft_fifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_rsp_fwft_fifo_prog_empty_assert_cfg", + PPU_CLUSTER_PPU_COP_RSP_FWFT_FIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc78, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_cop_rsp_fwft_fifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cop_rsp_fwft_fifo_prog_empty_negate_cfg", + PPU_CLUSTER_PPU_COP_RSP_FWFT_FIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc7c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_cop_rsp_fwft_fifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_ise_key_afifo_prog_full_assert_cfg", + PPU_CLUSTER_PPU_ISE_KEY_AFIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc80, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_ise_key_afifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_ise_key_afifo_prog_full_negate_cfg", + PPU_CLUSTER_PPU_ISE_KEY_AFIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc84, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_ise_key_afifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_ese_key_afifo_prog_full_assert_cfg", + PPU_CLUSTER_PPU_ESE_KEY_AFIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc88, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_ese_key_afifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_ese_key_afifo_prog_full_negate_cfg", + PPU_CLUSTER_PPU_ESE_KEY_AFIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc8c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_ese_key_afifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_sta_key_afifo_prog_full_assert_cfg", + PPU_CLUSTER_PPU_STA_KEY_AFIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc90, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_sta_key_afifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_sta_key_afifo_prog_full_negate_cfg", + PPU_CLUSTER_PPU_STA_KEY_AFIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0xc94, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_sta_key_afifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "int_600m_cluster_mex_fifo_mask", + PPU_CLUSTER_INT_600M_CLUSTER_MEX_FIFO_MASKr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x4034, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 7, + g_ppu_cluster_int_600m_cluster_mex_fifo_mask_reg, + NULL, + NULL, + }, + { + "cluster_mex_fifo_600m_interrupt_flag", + PPU_CLUSTER_CLUSTER_MEX_FIFO_600M_INTERRUPT_FLAGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x4038, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 7, + g_ppu_cluster_cluster_mex_fifo_600m_interrupt_flag_reg, + NULL, + NULL, + }, + { + "cluster_mex_fifo_600m_interrupt_sta", + PPU_CLUSTER_CLUSTER_MEX_FIFO_600M_INTERRUPT_STAr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x403c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 7, + g_ppu_cluster_cluster_mex_fifo_600m_interrupt_sta_reg, + NULL, + NULL, + }, + { + "mex_cnt_cfg", + PPU_CLUSTER_MEX_CNT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x4050, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 2, + g_ppu_cluster_mex_cnt_cfg_reg, + NULL, + NULL, + }, + { + "int_600m_cluster_mex_ram_ecc_error_interrupt_mask", + PPU_CLUSTER_INT_600M_CLUSTER_MEX_RAM_ECC_ERROR_INTERRUPT_MASKr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x4064, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 6, + g_ppu_cluster_int_600m_cluster_mex_ram_ecc_error_interrupt_mask_reg, + NULL, + NULL, + }, + { + "cluster_mex_ram_600m_ecc_error_interrupt_flag", + PPU_CLUSTER_CLUSTER_MEX_RAM_600M_ECC_ERROR_INTERRUPT_FLAGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x4068, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 6, + g_ppu_cluster_cluster_mex_ram_600m_ecc_error_interrupt_flag_reg, + NULL, + NULL, + }, + { + "cluster_mex_ram_600m_ecc_error_interrupt_sta", + PPU_CLUSTER_CLUSTER_MEX_RAM_600M_ECC_ERROR_INTERRUPT_STAr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x406c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 6, + g_ppu_cluster_cluster_mex_ram_600m_ecc_error_interrupt_sta_reg, + NULL, + NULL, + }, + { + "ppu_cluster_mf_in_afifo_prog_full_assert_cfg", + PPU_CLUSTER_PPU_CLUSTER_MF_IN_AFIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x4400, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_cluster_mf_in_afifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cluster_mf_in_afifo_prog_full_negate_cfg", + PPU_CLUSTER_PPU_CLUSTER_MF_IN_AFIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x4410, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_cluster_mf_in_afifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "ese_rsp_afifo_prog_full_assert_cfg", + PPU_CLUSTER_ESE_RSP_AFIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x4420, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ese_rsp_afifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "ese_rsp_afifo_prog_full_negate_cfg", + PPU_CLUSTER_ESE_RSP_AFIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x4430, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ese_rsp_afifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "ise_rsp_afifo_prog_full_assert_cfg", + PPU_CLUSTER_ISE_RSP_AFIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x4440, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ise_rsp_afifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "ise_rsp_afifo_prog_full_negate_cfg", + PPU_CLUSTER_ISE_RSP_AFIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x4450, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ise_rsp_afifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "sta_rsp_afifo_prog_full_assert_cfg", + PPU_CLUSTER_STA_RSP_AFIFO_PROG_FULL_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x4460, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_sta_rsp_afifo_prog_full_assert_cfg_reg, + NULL, + NULL, + }, + { + "sta_rsp_afifo_prog_full_negate_cfg", + PPU_CLUSTER_STA_RSP_AFIFO_PROG_FULL_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x4470, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_sta_rsp_afifo_prog_full_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_ise_key_afifo_prog_empty_assert_cfg", + PPU_CLUSTER_PPU_ISE_KEY_AFIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x4480, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_ise_key_afifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_ise_key_afifo_prog_empty_negate_cfg", + PPU_CLUSTER_PPU_ISE_KEY_AFIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x4490, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_ise_key_afifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_ese_key_afifo_prog_empty_assert_cfg", + PPU_CLUSTER_PPU_ESE_KEY_AFIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x44a0, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_ese_key_afifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_ese_key_afifo_prog_empty_negate_cfg", + PPU_CLUSTER_PPU_ESE_KEY_AFIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x44b0, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_ese_key_afifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_sta_key_afifo_prog_empty_assert_cfg", + PPU_CLUSTER_PPU_STA_KEY_AFIFO_PROG_EMPTY_ASSERT_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x44c0, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_sta_key_afifo_prog_empty_assert_cfg_reg, + NULL, + NULL, + }, + { + "ppu_sta_key_afifo_prog_empty_negate_cfg", + PPU_CLUSTER_PPU_STA_KEY_AFIFO_PROG_EMPTY_NEGATE_CFGr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x44d0, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_sta_key_afifo_prog_empty_negate_cfg_reg, + NULL, + NULL, + }, + { + "ppu_cluster_mf_vld_cnt_h", + PPU_CLUSTER_PPU_CLUSTER_MF_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x6000, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_cluster_mf_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "ppu_cluster_mf_vld_cnt_l", + PPU_CLUSTER_PPU_CLUSTER_MF_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x6004, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ppu_cluster_mf_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "cluster_ise_key_out_vld_cnt", + PPU_CLUSTER_CLUSTER_ISE_KEY_OUT_VLD_CNTr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x6008, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_cluster_ise_key_out_vld_cnt_reg, + NULL, + NULL, + }, + { + "ise_cluster_rsp_in_vld_cnt", + PPU_CLUSTER_ISE_CLUSTER_RSP_IN_VLD_CNTr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x600c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ise_cluster_rsp_in_vld_cnt_reg, + NULL, + NULL, + }, + { + "cluster_ese_key_out_vld_cnt", + PPU_CLUSTER_CLUSTER_ESE_KEY_OUT_VLD_CNTr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x6010, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_cluster_ese_key_out_vld_cnt_reg, + NULL, + NULL, + }, + { + "ese_cluster_rsp_in_vld_cnt", + PPU_CLUSTER_ESE_CLUSTER_RSP_IN_VLD_CNTr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x6014, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ese_cluster_rsp_in_vld_cnt_reg, + NULL, + NULL, + }, + { + "cluster_stat_cmd_vld_cnt", + PPU_CLUSTER_CLUSTER_STAT_CMD_VLD_CNTr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x6018, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_cluster_stat_cmd_vld_cnt_reg, + NULL, + NULL, + }, + { + "stat_cluster_rsp_vld_cnt", + PPU_CLUSTER_STAT_CLUSTER_RSP_VLD_CNTr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x601c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_stat_cluster_rsp_vld_cnt_reg, + NULL, + NULL, + }, + { + "mex_debug_key_vld_cnt", + PPU_CLUSTER_MEX_DEBUG_KEY_VLD_CNTr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x6020, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_mex_debug_key_vld_cnt_reg, + NULL, + NULL, + }, + { + "ise_cluster_key_fc_cnt", + PPU_CLUSTER_ISE_CLUSTER_KEY_FC_CNTr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x6024, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ise_cluster_key_fc_cnt_reg, + NULL, + NULL, + }, + { + "ese_cluster_key_fc_cnt", + PPU_CLUSTER_ESE_CLUSTER_KEY_FC_CNTr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x6028, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_ese_cluster_key_fc_cnt_reg, + NULL, + NULL, + }, + { + "cluster_ise_rsp_fc_cnt", + PPU_CLUSTER_CLUSTER_ISE_RSP_FC_CNTr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x602c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_cluster_ise_rsp_fc_cnt_reg, + NULL, + NULL, + }, + { + "cluster_ese_rsp_fc_cnt", + PPU_CLUSTER_CLUSTER_ESE_RSP_FC_CNTr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x6030, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_cluster_ese_rsp_fc_cnt_reg, + NULL, + NULL, + }, + { + "stat_cluster_cmd_fc_cnt", + PPU_CLUSTER_STAT_CLUSTER_CMD_FC_CNTr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x6034, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_stat_cluster_cmd_fc_cnt_reg, + NULL, + NULL, + }, + { + "cluster_stat_rsp_fc_cnt", + PPU_CLUSTER_CLUSTER_STAT_RSP_FC_CNTr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x6038, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_cluster_stat_rsp_fc_cnt_reg, + NULL, + NULL, + }, + { + "cluster_ppu_mf_vld_cnt_l", + PPU_CLUSTER_CLUSTER_PPU_MF_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x2000, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_cluster_ppu_mf_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "cluster_ppu_mf_vld_cnt_h", + PPU_CLUSTER_CLUSTER_PPU_MF_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x2004, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_cluster_ppu_mf_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "cluster_cop_key_vld_cnt_l", + PPU_CLUSTER_CLUSTER_COP_KEY_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x2008, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_cluster_cop_key_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "cluster_cop_key_vld_cnt_h", + PPU_CLUSTER_CLUSTER_COP_KEY_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x200c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_cluster_cop_key_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "cop_cluster_rsp_vld_cnt_l", + PPU_CLUSTER_COP_CLUSTER_RSP_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x2010, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_cop_cluster_rsp_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "cop_cluster_rsp_vld_cnt_h", + PPU_CLUSTER_COP_CLUSTER_RSP_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x2014, + (32/8), + DPP_PPU_CLUSTER_NUM, + 0, + DPP_PPU_CLUSTER_SPACE_SIZE, + 0, + 1, + g_ppu_cluster_cop_cluster_rsp_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "mex_me_pkt_in_sop_cnt_l", + PPU_CLUSTER_MEX_ME_PKT_IN_SOP_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x2018, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_mex_me_pkt_in_sop_cnt_l_reg, + NULL, + NULL, + }, + { + "mex_me_pkt_in_sop_cnt_h", + PPU_CLUSTER_MEX_ME_PKT_IN_SOP_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x201c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_mex_me_pkt_in_sop_cnt_h_reg, + NULL, + NULL, + }, + { + "mex_me_pkt_in_eop_cnt_l", + PPU_CLUSTER_MEX_ME_PKT_IN_EOP_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x2020, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_mex_me_pkt_in_eop_cnt_l_reg, + NULL, + NULL, + }, + { + "mex_me_pkt_in_eop_cnt_h", + PPU_CLUSTER_MEX_ME_PKT_IN_EOP_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x2024, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_mex_me_pkt_in_eop_cnt_h_reg, + NULL, + NULL, + }, + { + "mex_me_pkt_in_vld_cnt_l", + PPU_CLUSTER_MEX_ME_PKT_IN_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x2028, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_mex_me_pkt_in_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "mex_me_pkt_in_vld_cnt_h", + PPU_CLUSTER_MEX_ME_PKT_IN_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x202c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_mex_me_pkt_in_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "me_mex_pkt_out_sop_cnt_l", + PPU_CLUSTER_ME_MEX_PKT_OUT_SOP_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x20d8, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_mex_pkt_out_sop_cnt_l_reg, + NULL, + NULL, + }, + { + "me_mex_pkt_out_sop_cnt_h", + PPU_CLUSTER_ME_MEX_PKT_OUT_SOP_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x20dc, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_mex_pkt_out_sop_cnt_h_reg, + NULL, + NULL, + }, + { + "me_mex_pkt_out_eop_cnt_l", + PPU_CLUSTER_ME_MEX_PKT_OUT_EOP_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x20e0, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_mex_pkt_out_eop_cnt_l_reg, + NULL, + NULL, + }, + { + "me_mex_pkt_out_eop_cnt_h", + PPU_CLUSTER_ME_MEX_PKT_OUT_EOP_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x20e4, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_mex_pkt_out_eop_cnt_h_reg, + NULL, + NULL, + }, + { + "me_mex_pkt_out_vld_cnt_l", + PPU_CLUSTER_ME_MEX_PKT_OUT_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x20e8, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_mex_pkt_out_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "me_mex_pkt_out_vld_cnt_h", + PPU_CLUSTER_ME_MEX_PKT_OUT_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x20ec, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_mex_pkt_out_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "me_mex_i_key_out_sop_cnt_l", + PPU_CLUSTER_ME_MEX_I_KEY_OUT_SOP_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x2198, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_mex_i_key_out_sop_cnt_l_reg, + NULL, + NULL, + }, + { + "me_mex_i_key_out_sop_cnt_h", + PPU_CLUSTER_ME_MEX_I_KEY_OUT_SOP_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x219c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_mex_i_key_out_sop_cnt_h_reg, + NULL, + NULL, + }, + { + "me_mex_i_key_out_eop_cnt_l", + PPU_CLUSTER_ME_MEX_I_KEY_OUT_EOP_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x21a0, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_mex_i_key_out_eop_cnt_l_reg, + NULL, + NULL, + }, + { + "me_mex_i_key_out_eop_cnt_h", + PPU_CLUSTER_ME_MEX_I_KEY_OUT_EOP_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x21a4, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_mex_i_key_out_eop_cnt_h_reg, + NULL, + NULL, + }, + { + "me_mex_i_key_out_vld_cnt_l", + PPU_CLUSTER_ME_MEX_I_KEY_OUT_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x21a8, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_mex_i_key_out_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "me_mex_i_key_out_vld_cnt_h", + PPU_CLUSTER_ME_MEX_I_KEY_OUT_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x21ac, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_mex_i_key_out_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "me_mex_e_key_out_sop_cnt_l", + PPU_CLUSTER_ME_MEX_E_KEY_OUT_SOP_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x2258, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_mex_e_key_out_sop_cnt_l_reg, + NULL, + NULL, + }, + { + "me_mex_e_key_out_sop_cnt_h", + PPU_CLUSTER_ME_MEX_E_KEY_OUT_SOP_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x225c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_mex_e_key_out_sop_cnt_h_reg, + NULL, + NULL, + }, + { + "me_mex_e_key_out_eop_cnt_l", + PPU_CLUSTER_ME_MEX_E_KEY_OUT_EOP_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x2260, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_mex_e_key_out_eop_cnt_l_reg, + NULL, + NULL, + }, + { + "me_mex_e_key_out_eop_cnt_h", + PPU_CLUSTER_ME_MEX_E_KEY_OUT_EOP_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x2264, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_mex_e_key_out_eop_cnt_h_reg, + NULL, + NULL, + }, + { + "me_mex_e_key_out_vld_cnt_l", + PPU_CLUSTER_ME_MEX_E_KEY_OUT_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x2268, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_mex_e_key_out_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "me_mex_e_key_out_vld_cnt_h", + PPU_CLUSTER_ME_MEX_E_KEY_OUT_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x226c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_mex_e_key_out_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "me_mex_demux_ise_key_vld_cnt_l", + PPU_CLUSTER_ME_MEX_DEMUX_ISE_KEY_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x2318, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 8, + 1, + g_ppu_cluster_me_mex_demux_ise_key_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "me_mex_demux_ise_key_vld_cnt_h", + PPU_CLUSTER_ME_MEX_DEMUX_ISE_KEY_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x231c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 8, + 1, + g_ppu_cluster_me_mex_demux_ise_key_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "me_mex_demux_ese_key_vld_cnt_l", + PPU_CLUSTER_ME_MEX_DEMUX_ESE_KEY_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x2358, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 8, + 1, + g_ppu_cluster_me_mex_demux_ese_key_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "me_mex_demux_ese_key_vld_cnt_h", + PPU_CLUSTER_ME_MEX_DEMUX_ESE_KEY_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x235c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 8, + 1, + g_ppu_cluster_me_mex_demux_ese_key_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "me_mex_demux_sta_key_vld_cnt_l", + PPU_CLUSTER_ME_MEX_DEMUX_STA_KEY_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x2398, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 8, + 1, + g_ppu_cluster_me_mex_demux_sta_key_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "me_mex_demux_sta_key_vld_cnt_h", + PPU_CLUSTER_ME_MEX_DEMUX_STA_KEY_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x239c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 8, + 1, + g_ppu_cluster_me_mex_demux_sta_key_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "me_mex_demux_cop_key_vld_cnt_l", + PPU_CLUSTER_ME_MEX_DEMUX_COP_KEY_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x23d8, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 8, + 1, + g_ppu_cluster_me_mex_demux_cop_key_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "me_mex_demux_cop_key_vld_cnt_h", + PPU_CLUSTER_ME_MEX_DEMUX_COP_KEY_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x23dc, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 8, + 1, + g_ppu_cluster_me_mex_demux_cop_key_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "mex_me_demux_ise_rsp_vld_cnt_l", + PPU_CLUSTER_MEX_ME_DEMUX_ISE_RSP_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x2418, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 8, + 1, + g_ppu_cluster_mex_me_demux_ise_rsp_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "mex_me_demux_ise_rsp_vld_cnt_h", + PPU_CLUSTER_MEX_ME_DEMUX_ISE_RSP_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x241c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 8, + 1, + g_ppu_cluster_mex_me_demux_ise_rsp_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "mex_me_demux_ese_rsp_vld_cnt_l", + PPU_CLUSTER_MEX_ME_DEMUX_ESE_RSP_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x2458, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 8, + 1, + g_ppu_cluster_mex_me_demux_ese_rsp_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "mex_me_demux_ese_rsp_vld_cnt_h", + PPU_CLUSTER_MEX_ME_DEMUX_ESE_RSP_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x245c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 8, + 1, + g_ppu_cluster_mex_me_demux_ese_rsp_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "mex_me_demux_sta_rsp_vld_cnt_l", + PPU_CLUSTER_MEX_ME_DEMUX_STA_RSP_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x2498, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 8, + 1, + g_ppu_cluster_mex_me_demux_sta_rsp_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "mex_me_demux_sta_rsp_vld_cnt_h", + PPU_CLUSTER_MEX_ME_DEMUX_STA_RSP_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x249c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 8, + 1, + g_ppu_cluster_mex_me_demux_sta_rsp_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "mex_me_demux_cop_rsp_vld_cnt_l", + PPU_CLUSTER_MEX_ME_DEMUX_COP_RSP_VLD_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x24d8, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 8, + 1, + g_ppu_cluster_mex_me_demux_cop_rsp_vld_cnt_l_reg, + NULL, + NULL, + }, + { + "mex_me_demux_cop_rsp_vld_cnt_h", + PPU_CLUSTER_MEX_ME_DEMUX_COP_RSP_VLD_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x24dc, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 8, + 1, + g_ppu_cluster_mex_me_demux_cop_rsp_vld_cnt_h_reg, + NULL, + NULL, + }, + { + "me_exception_code0_cnt_l", + PPU_CLUSTER_ME_EXCEPTION_CODE0_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x2518, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_exception_code0_cnt_l_reg, + NULL, + NULL, + }, + { + "me_exception_code0_cnt_h", + PPU_CLUSTER_ME_EXCEPTION_CODE0_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x251c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_exception_code0_cnt_h_reg, + NULL, + NULL, + }, + { + "me_exception_code1_cnt_l", + PPU_CLUSTER_ME_EXCEPTION_CODE1_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x2520, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_exception_code1_cnt_l_reg, + NULL, + NULL, + }, + { + "me_exception_code1_cnt_h", + PPU_CLUSTER_ME_EXCEPTION_CODE1_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x2524, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_exception_code1_cnt_h_reg, + NULL, + NULL, + }, + { + "me_exception_code2_cnt_l", + PPU_CLUSTER_ME_EXCEPTION_CODE2_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x2528, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_exception_code2_cnt_l_reg, + NULL, + NULL, + }, + { + "me_exception_code2_cnt_h", + PPU_CLUSTER_ME_EXCEPTION_CODE2_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x252c, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_exception_code2_cnt_h_reg, + NULL, + NULL, + }, + { + "me_exception_code3_cnt_l", + PPU_CLUSTER_ME_EXCEPTION_CODE3_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x25d8, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_exception_code3_cnt_l_reg, + NULL, + NULL, + }, + { + "me_exception_code3_cnt_h", + PPU_CLUSTER_ME_EXCEPTION_CODE3_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x25dc, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_exception_code3_cnt_h_reg, + NULL, + NULL, + }, + { + "me_exception_code4_cnt_l", + PPU_CLUSTER_ME_EXCEPTION_CODE4_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x25e0, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_exception_code4_cnt_l_reg, + NULL, + NULL, + }, + { + "me_exception_code4_cnt_h", + PPU_CLUSTER_ME_EXCEPTION_CODE4_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x25e4, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_exception_code4_cnt_h_reg, + NULL, + NULL, + }, + { + "me_exception_code5_cnt_l", + PPU_CLUSTER_ME_EXCEPTION_CODE5_CNT_Lr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x25e8, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_exception_code5_cnt_l_reg, + NULL, + NULL, + }, + { + "me_exception_code5_cnt_h", + PPU_CLUSTER_ME_EXCEPTION_CODE5_CNT_Hr, + PPU, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_PPU_BASE_ADDR + MODULE_CLUSTER0_BASE_ADDR + 0x25ec, + (32/8), + DPP_PPU_CLUSTER_NUM, + 7 + 1, + DPP_PPU_CLUSTER_SPACE_SIZE, + 24, + 1, + g_ppu_cluster_me_exception_code5_cnt_h_reg, + NULL, + NULL, + }, + { + "ppu_soft_rst", + SE_CFG_PPU_SOFT_RSTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_ppu_soft_rst_reg, + NULL, + NULL, + }, + { + "ept_flag", + SE_CFG_EPT_FLAGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000004, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_ept_flag_reg, + NULL, + NULL, + }, + { + "ddr_key_lk0_3", + SE_CFG_DDR_KEY_LK0_3r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000020, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_ddr_key_lk0_3_reg, + NULL, + NULL, + }, + { + "ddr_key_lk0_2", + SE_CFG_DDR_KEY_LK0_2r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000024, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_ddr_key_lk0_2_reg, + NULL, + NULL, + }, + { + "ddr_key_lk0_1", + SE_CFG_DDR_KEY_LK0_1r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000028, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_ddr_key_lk0_1_reg, + NULL, + NULL, + }, + { + "ddr_key_lk0_0", + SE_CFG_DDR_KEY_LK0_0r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000002c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_ddr_key_lk0_0_reg, + NULL, + NULL, + }, + { + "ddr_key_lk1_3", + SE_CFG_DDR_KEY_LK1_3r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000030, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_ddr_key_lk1_3_reg, + NULL, + NULL, + }, + { + "ddr_key_lk1_2", + SE_CFG_DDR_KEY_LK1_2r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000034, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_ddr_key_lk1_2_reg, + NULL, + NULL, + }, + { + "ddr_key_lk1_1", + SE_CFG_DDR_KEY_LK1_1r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000038, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_ddr_key_lk1_1_reg, + NULL, + NULL, + }, + { + "ddr_key_lk1_0", + SE_CFG_DDR_KEY_LK1_0r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000003c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_ddr_key_lk1_0_reg, + NULL, + NULL, + }, + { + "hash_key_lk0_18", + SE_CFG_HASH_KEY_LK0_18r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000080, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk0_18_reg, + NULL, + NULL, + }, + { + "hash_key_lk0_17", + SE_CFG_HASH_KEY_LK0_17r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000084, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk0_17_reg, + NULL, + NULL, + }, + { + "hash_key_lk0_16", + SE_CFG_HASH_KEY_LK0_16r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000088, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk0_16_reg, + NULL, + NULL, + }, + { + "hash_key_lk0_15", + SE_CFG_HASH_KEY_LK0_15r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000008c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk0_15_reg, + NULL, + NULL, + }, + { + "hash_key_lk0_14", + SE_CFG_HASH_KEY_LK0_14r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000090, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk0_14_reg, + NULL, + NULL, + }, + { + "hash_key_lk0_13", + SE_CFG_HASH_KEY_LK0_13r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000094, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk0_13_reg, + NULL, + NULL, + }, + { + "hash_key_lk0_12", + SE_CFG_HASH_KEY_LK0_12r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000098, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk0_12_reg, + NULL, + NULL, + }, + { + "hash_key_lk0_11", + SE_CFG_HASH_KEY_LK0_11r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000009c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk0_11_reg, + NULL, + NULL, + }, + { + "hash_key_lk0_10", + SE_CFG_HASH_KEY_LK0_10r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000000a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk0_10_reg, + NULL, + NULL, + }, + { + "hash_key_lk0_9", + SE_CFG_HASH_KEY_LK0_9r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000000a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk0_9_reg, + NULL, + NULL, + }, + { + "hash_key_lk0_8", + SE_CFG_HASH_KEY_LK0_8r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000000a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk0_8_reg, + NULL, + NULL, + }, + { + "hash_key_lk0_7", + SE_CFG_HASH_KEY_LK0_7r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000000ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk0_7_reg, + NULL, + NULL, + }, + { + "hash_key_lk0_6", + SE_CFG_HASH_KEY_LK0_6r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000000b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk0_6_reg, + NULL, + NULL, + }, + { + "hash_key_lk0_5", + SE_CFG_HASH_KEY_LK0_5r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000000b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk0_5_reg, + NULL, + NULL, + }, + { + "hash_key_lk0_4", + SE_CFG_HASH_KEY_LK0_4r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000000b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk0_4_reg, + NULL, + NULL, + }, + { + "hash_key_lk0_3", + SE_CFG_HASH_KEY_LK0_3r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000000bc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk0_3_reg, + NULL, + NULL, + }, + { + "hash_key_lk0_2", + SE_CFG_HASH_KEY_LK0_2r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000000c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk0_2_reg, + NULL, + NULL, + }, + { + "hash_key_lk0_1", + SE_CFG_HASH_KEY_LK0_1r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000000c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk0_1_reg, + NULL, + NULL, + }, + { + "hash_key_lk0_0", + SE_CFG_HASH_KEY_LK0_0r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000000c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk0_0_reg, + NULL, + NULL, + }, + { + "hash_key_lk1_18", + SE_CFG_HASH_KEY_LK1_18r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000000cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk1_18_reg, + NULL, + NULL, + }, + { + "hash_key_lk1_17", + SE_CFG_HASH_KEY_LK1_17r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000000d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk1_17_reg, + NULL, + NULL, + }, + { + "hash_key_lk1_16", + SE_CFG_HASH_KEY_LK1_16r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000000d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk1_16_reg, + NULL, + NULL, + }, + { + "hash_key_lk1_15", + SE_CFG_HASH_KEY_LK1_15r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000000d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk1_15_reg, + NULL, + NULL, + }, + { + "hash_key_lk1_14", + SE_CFG_HASH_KEY_LK1_14r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000000dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk1_14_reg, + NULL, + NULL, + }, + { + "hash_key_lk1_13", + SE_CFG_HASH_KEY_LK1_13r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000000e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk1_13_reg, + NULL, + NULL, + }, + { + "hash_key_lk1_12", + SE_CFG_HASH_KEY_LK1_12r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000000e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk1_12_reg, + NULL, + NULL, + }, + { + "hash_key_lk1_11", + SE_CFG_HASH_KEY_LK1_11r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000000e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk1_11_reg, + NULL, + NULL, + }, + { + "hash_key_lk1_10", + SE_CFG_HASH_KEY_LK1_10r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000000ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk1_10_reg, + NULL, + NULL, + }, + { + "hash_key_lk1_9", + SE_CFG_HASH_KEY_LK1_9r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000000f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk1_9_reg, + NULL, + NULL, + }, + { + "hash_key_lk1_8", + SE_CFG_HASH_KEY_LK1_8r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000000f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk1_8_reg, + NULL, + NULL, + }, + { + "hash_key_lk1_7", + SE_CFG_HASH_KEY_LK1_7r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000000f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk1_7_reg, + NULL, + NULL, + }, + { + "hash_key_lk1_6", + SE_CFG_HASH_KEY_LK1_6r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000000fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk1_6_reg, + NULL, + NULL, + }, + { + "hash_key_lk1_5", + SE_CFG_HASH_KEY_LK1_5r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000100, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk1_5_reg, + NULL, + NULL, + }, + { + "hash_key_lk1_4", + SE_CFG_HASH_KEY_LK1_4r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000104, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk1_4_reg, + NULL, + NULL, + }, + { + "hash_key_lk1_3", + SE_CFG_HASH_KEY_LK1_3r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000108, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk1_3_reg, + NULL, + NULL, + }, + { + "hash_key_lk1_2", + SE_CFG_HASH_KEY_LK1_2r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000010c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk1_2_reg, + NULL, + NULL, + }, + { + "hash_key_lk1_1", + SE_CFG_HASH_KEY_LK1_1r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000110, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk1_1_reg, + NULL, + NULL, + }, + { + "hash_key_lk1_0", + SE_CFG_HASH_KEY_LK1_0r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000114, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk1_0_reg, + NULL, + NULL, + }, + { + "hash_key_lk2_18", + SE_CFG_HASH_KEY_LK2_18r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000118, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk2_18_reg, + NULL, + NULL, + }, + { + "hash_key_lk2_17", + SE_CFG_HASH_KEY_LK2_17r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000011c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk2_17_reg, + NULL, + NULL, + }, + { + "hash_key_lk2_16", + SE_CFG_HASH_KEY_LK2_16r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000120, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk2_16_reg, + NULL, + NULL, + }, + { + "hash_key_lk2_15", + SE_CFG_HASH_KEY_LK2_15r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000124, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk2_15_reg, + NULL, + NULL, + }, + { + "hash_key_lk2_14", + SE_CFG_HASH_KEY_LK2_14r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000128, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk2_14_reg, + NULL, + NULL, + }, + { + "hash_key_lk2_13", + SE_CFG_HASH_KEY_LK2_13r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000012c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk2_13_reg, + NULL, + NULL, + }, + { + "hash_key_lk2_12", + SE_CFG_HASH_KEY_LK2_12r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000130, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk2_12_reg, + NULL, + NULL, + }, + { + "hash_key_lk2_11", + SE_CFG_HASH_KEY_LK2_11r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000134, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk2_11_reg, + NULL, + NULL, + }, + { + "hash_key_lk2_10", + SE_CFG_HASH_KEY_LK2_10r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000138, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk2_10_reg, + NULL, + NULL, + }, + { + "hash_key_lk2_9", + SE_CFG_HASH_KEY_LK2_9r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000013c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk2_9_reg, + NULL, + NULL, + }, + { + "hash_key_lk2_8", + SE_CFG_HASH_KEY_LK2_8r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000140, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk2_8_reg, + NULL, + NULL, + }, + { + "hash_key_lk2_7", + SE_CFG_HASH_KEY_LK2_7r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000144, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk2_7_reg, + NULL, + NULL, + }, + { + "hash_key_lk2_6", + SE_CFG_HASH_KEY_LK2_6r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000148, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk2_6_reg, + NULL, + NULL, + }, + { + "hash_key_lk2_5", + SE_CFG_HASH_KEY_LK2_5r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000014c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk2_5_reg, + NULL, + NULL, + }, + { + "hash_key_lk2_4", + SE_CFG_HASH_KEY_LK2_4r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000150, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk2_4_reg, + NULL, + NULL, + }, + { + "hash_key_lk2_3", + SE_CFG_HASH_KEY_LK2_3r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000154, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk2_3_reg, + NULL, + NULL, + }, + { + "hash_key_lk2_2", + SE_CFG_HASH_KEY_LK2_2r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000158, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk2_2_reg, + NULL, + NULL, + }, + { + "hash_key_lk2_1", + SE_CFG_HASH_KEY_LK2_1r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000015c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk2_1_reg, + NULL, + NULL, + }, + { + "hash_key_lk2_0", + SE_CFG_HASH_KEY_LK2_0r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000160, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk2_0_reg, + NULL, + NULL, + }, + { + "hash_key_lk3_18", + SE_CFG_HASH_KEY_LK3_18r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000164, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk3_18_reg, + NULL, + NULL, + }, + { + "hash_key_lk3_17", + SE_CFG_HASH_KEY_LK3_17r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000168, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk3_17_reg, + NULL, + NULL, + }, + { + "hash_key_lk3_16", + SE_CFG_HASH_KEY_LK3_16r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000016c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk3_16_reg, + NULL, + NULL, + }, + { + "hash_key_lk3_15", + SE_CFG_HASH_KEY_LK3_15r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000170, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk3_15_reg, + NULL, + NULL, + }, + { + "hash_key_lk3_14", + SE_CFG_HASH_KEY_LK3_14r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000174, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk3_14_reg, + NULL, + NULL, + }, + { + "hash_key_lk3_13", + SE_CFG_HASH_KEY_LK3_13r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000178, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk3_13_reg, + NULL, + NULL, + }, + { + "hash_key_lk3_12", + SE_CFG_HASH_KEY_LK3_12r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000017c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk3_12_reg, + NULL, + NULL, + }, + { + "hash_key_lk3_11", + SE_CFG_HASH_KEY_LK3_11r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000180, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk3_11_reg, + NULL, + NULL, + }, + { + "hash_key_lk3_10", + SE_CFG_HASH_KEY_LK3_10r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000184, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk3_10_reg, + NULL, + NULL, + }, + { + "hash_key_lk3_9", + SE_CFG_HASH_KEY_LK3_9r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000188, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk3_9_reg, + NULL, + NULL, + }, + { + "hash_key_lk3_8", + SE_CFG_HASH_KEY_LK3_8r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000018c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk3_8_reg, + NULL, + NULL, + }, + { + "hash_key_lk3_7", + SE_CFG_HASH_KEY_LK3_7r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000190, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk3_7_reg, + NULL, + NULL, + }, + { + "hash_key_lk3_6", + SE_CFG_HASH_KEY_LK3_6r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000194, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk3_6_reg, + NULL, + NULL, + }, + { + "hash_key_lk3_5", + SE_CFG_HASH_KEY_LK3_5r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000198, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk3_5_reg, + NULL, + NULL, + }, + { + "hash_key_lk3_4", + SE_CFG_HASH_KEY_LK3_4r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000019c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk3_4_reg, + NULL, + NULL, + }, + { + "hash_key_lk3_3", + SE_CFG_HASH_KEY_LK3_3r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000001a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk3_3_reg, + NULL, + NULL, + }, + { + "hash_key_lk3_2", + SE_CFG_HASH_KEY_LK3_2r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000001a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk3_2_reg, + NULL, + NULL, + }, + { + "hash_key_lk3_1", + SE_CFG_HASH_KEY_LK3_1r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000001a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk3_1_reg, + NULL, + NULL, + }, + { + "hash_key_lk3_0", + SE_CFG_HASH_KEY_LK3_0r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000001ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_hash_key_lk3_0_reg, + NULL, + NULL, + }, + { + "lpm_key_lk0_6", + SE_CFG_LPM_KEY_LK0_6r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000002e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk0_6_reg, + NULL, + NULL, + }, + { + "lpm_key_lk0_5", + SE_CFG_LPM_KEY_LK0_5r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000002e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk0_5_reg, + NULL, + NULL, + }, + { + "lpm_key_lk0_4", + SE_CFG_LPM_KEY_LK0_4r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000002e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk0_4_reg, + NULL, + NULL, + }, + { + "lpm_key_lk0_3", + SE_CFG_LPM_KEY_LK0_3r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000002ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk0_3_reg, + NULL, + NULL, + }, + { + "lpm_key_lk0_2", + SE_CFG_LPM_KEY_LK0_2r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000002f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk0_2_reg, + NULL, + NULL, + }, + { + "lpm_key_lk0_1", + SE_CFG_LPM_KEY_LK0_1r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000002f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk0_1_reg, + NULL, + NULL, + }, + { + "lpm_key_lk0_0", + SE_CFG_LPM_KEY_LK0_0r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000002f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk0_0_reg, + NULL, + NULL, + }, + { + "lpm_key_lk1_6", + SE_CFG_LPM_KEY_LK1_6r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000002fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk1_6_reg, + NULL, + NULL, + }, + { + "lpm_key_lk1_5", + SE_CFG_LPM_KEY_LK1_5r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000300, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk1_5_reg, + NULL, + NULL, + }, + { + "lpm_key_lk1_4", + SE_CFG_LPM_KEY_LK1_4r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000304, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk1_4_reg, + NULL, + NULL, + }, + { + "lpm_key_lk1_3", + SE_CFG_LPM_KEY_LK1_3r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000308, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk1_3_reg, + NULL, + NULL, + }, + { + "lpm_key_lk1_2", + SE_CFG_LPM_KEY_LK1_2r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000030c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk1_2_reg, + NULL, + NULL, + }, + { + "lpm_key_lk1_1", + SE_CFG_LPM_KEY_LK1_1r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000310, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk1_1_reg, + NULL, + NULL, + }, + { + "lpm_key_lk1_0", + SE_CFG_LPM_KEY_LK1_0r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000314, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk1_0_reg, + NULL, + NULL, + }, + { + "lpm_key_lk2_6", + SE_CFG_LPM_KEY_LK2_6r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000318, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk2_6_reg, + NULL, + NULL, + }, + { + "lpm_key_lk2_5", + SE_CFG_LPM_KEY_LK2_5r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000031c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk2_5_reg, + NULL, + NULL, + }, + { + "lpm_key_lk2_4", + SE_CFG_LPM_KEY_LK2_4r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000320, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk2_4_reg, + NULL, + NULL, + }, + { + "lpm_key_lk2_3", + SE_CFG_LPM_KEY_LK2_3r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000324, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk2_3_reg, + NULL, + NULL, + }, + { + "lpm_key_lk2_2", + SE_CFG_LPM_KEY_LK2_2r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000328, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk2_2_reg, + NULL, + NULL, + }, + { + "lpm_key_lk2_1", + SE_CFG_LPM_KEY_LK2_1r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000032c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk2_1_reg, + NULL, + NULL, + }, + { + "lpm_key_lk2_0", + SE_CFG_LPM_KEY_LK2_0r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000330, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk2_0_reg, + NULL, + NULL, + }, + { + "lpm_key_lk3_6", + SE_CFG_LPM_KEY_LK3_6r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000334, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk3_6_reg, + NULL, + NULL, + }, + { + "lpm_key_lk3_5", + SE_CFG_LPM_KEY_LK3_5r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000338, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk3_5_reg, + NULL, + NULL, + }, + { + "lpm_key_lk3_4", + SE_CFG_LPM_KEY_LK3_4r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000033c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk3_4_reg, + NULL, + NULL, + }, + { + "lpm_key_lk3_3", + SE_CFG_LPM_KEY_LK3_3r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000340, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk3_3_reg, + NULL, + NULL, + }, + { + "lpm_key_lk3_2", + SE_CFG_LPM_KEY_LK3_2r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000344, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk3_2_reg, + NULL, + NULL, + }, + { + "lpm_key_lk3_1", + SE_CFG_LPM_KEY_LK3_1r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000348, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk3_1_reg, + NULL, + NULL, + }, + { + "lpm_key_lk3_0", + SE_CFG_LPM_KEY_LK3_0r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000034c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_lpm_key_lk3_0_reg, + NULL, + NULL, + }, + { + "etcam_key_lk0_22", + SE_CFG_ETCAM_KEY_LK0_22r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000003c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk0_22_reg, + NULL, + NULL, + }, + { + "etcam_key_lk0_21", + SE_CFG_ETCAM_KEY_LK0_21r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000003c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk0_21_reg, + NULL, + NULL, + }, + { + "etcam_key_lk0_20", + SE_CFG_ETCAM_KEY_LK0_20r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000003c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk0_20_reg, + NULL, + NULL, + }, + { + "etcam_key_lk0_19", + SE_CFG_ETCAM_KEY_LK0_19r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000003cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk0_19_reg, + NULL, + NULL, + }, + { + "etcam_key_lk0_18", + SE_CFG_ETCAM_KEY_LK0_18r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000003d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk0_18_reg, + NULL, + NULL, + }, + { + "etcam_key_lk0_17", + SE_CFG_ETCAM_KEY_LK0_17r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000003d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk0_17_reg, + NULL, + NULL, + }, + { + "etcam_key_lk0_16", + SE_CFG_ETCAM_KEY_LK0_16r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000003d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk0_16_reg, + NULL, + NULL, + }, + { + "etcam_key_lk0_15", + SE_CFG_ETCAM_KEY_LK0_15r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000003dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk0_15_reg, + NULL, + NULL, + }, + { + "etcam_key_lk0_14", + SE_CFG_ETCAM_KEY_LK0_14r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000003e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk0_14_reg, + NULL, + NULL, + }, + { + "etcam_key_lk0_13", + SE_CFG_ETCAM_KEY_LK0_13r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000003e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk0_13_reg, + NULL, + NULL, + }, + { + "etcam_key_lk0_12", + SE_CFG_ETCAM_KEY_LK0_12r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000003e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk0_12_reg, + NULL, + NULL, + }, + { + "etcam_key_lk0_11", + SE_CFG_ETCAM_KEY_LK0_11r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000003ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk0_11_reg, + NULL, + NULL, + }, + { + "etcam_key_lk0_10", + SE_CFG_ETCAM_KEY_LK0_10r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000003f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk0_10_reg, + NULL, + NULL, + }, + { + "etcam_key_lk0_9", + SE_CFG_ETCAM_KEY_LK0_9r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000003f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk0_9_reg, + NULL, + NULL, + }, + { + "etcam_key_lk0_8", + SE_CFG_ETCAM_KEY_LK0_8r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000003f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk0_8_reg, + NULL, + NULL, + }, + { + "etcam_key_lk0_7", + SE_CFG_ETCAM_KEY_LK0_7r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000003fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk0_7_reg, + NULL, + NULL, + }, + { + "etcam_key_lk0_6", + SE_CFG_ETCAM_KEY_LK0_6r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000400, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk0_6_reg, + NULL, + NULL, + }, + { + "etcam_key_lk0_5", + SE_CFG_ETCAM_KEY_LK0_5r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000404, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk0_5_reg, + NULL, + NULL, + }, + { + "etcam_key_lk0_4", + SE_CFG_ETCAM_KEY_LK0_4r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000408, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk0_4_reg, + NULL, + NULL, + }, + { + "etcam_key_lk0_3", + SE_CFG_ETCAM_KEY_LK0_3r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000040c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk0_3_reg, + NULL, + NULL, + }, + { + "etcam_key_lk0_2", + SE_CFG_ETCAM_KEY_LK0_2r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000410, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk0_2_reg, + NULL, + NULL, + }, + { + "etcam_key_lk0_1", + SE_CFG_ETCAM_KEY_LK0_1r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000414, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk0_1_reg, + NULL, + NULL, + }, + { + "etcam_key_lk0_0", + SE_CFG_ETCAM_KEY_LK0_0r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000418, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk0_0_reg, + NULL, + NULL, + }, + { + "etcam_key_lk1_22", + SE_CFG_ETCAM_KEY_LK1_22r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000041c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk1_22_reg, + NULL, + NULL, + }, + { + "etcam_key_lk1_21", + SE_CFG_ETCAM_KEY_LK1_21r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000420, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk1_21_reg, + NULL, + NULL, + }, + { + "etcam_key_lk1_20", + SE_CFG_ETCAM_KEY_LK1_20r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000424, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk1_20_reg, + NULL, + NULL, + }, + { + "etcam_key_lk1_19", + SE_CFG_ETCAM_KEY_LK1_19r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000428, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk1_19_reg, + NULL, + NULL, + }, + { + "etcam_key_lk1_18", + SE_CFG_ETCAM_KEY_LK1_18r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000042c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk1_18_reg, + NULL, + NULL, + }, + { + "etcam_key_lk1_17", + SE_CFG_ETCAM_KEY_LK1_17r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000430, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk1_17_reg, + NULL, + NULL, + }, + { + "etcam_key_lk1_16", + SE_CFG_ETCAM_KEY_LK1_16r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000434, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk1_16_reg, + NULL, + NULL, + }, + { + "etcam_key_lk1_15", + SE_CFG_ETCAM_KEY_LK1_15r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000438, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk1_15_reg, + NULL, + NULL, + }, + { + "etcam_key_lk1_14", + SE_CFG_ETCAM_KEY_LK1_14r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000043c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk1_14_reg, + NULL, + NULL, + }, + { + "etcam_key_lk1_13", + SE_CFG_ETCAM_KEY_LK1_13r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000440, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk1_13_reg, + NULL, + NULL, + }, + { + "etcam_key_lk1_12", + SE_CFG_ETCAM_KEY_LK1_12r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000444, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk1_12_reg, + NULL, + NULL, + }, + { + "etcam_key_lk1_11", + SE_CFG_ETCAM_KEY_LK1_11r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000448, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk1_11_reg, + NULL, + NULL, + }, + { + "etcam_key_lk1_10", + SE_CFG_ETCAM_KEY_LK1_10r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000044c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk1_10_reg, + NULL, + NULL, + }, + { + "etcam_key_lk1_9", + SE_CFG_ETCAM_KEY_LK1_9r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000450, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk1_9_reg, + NULL, + NULL, + }, + { + "etcam_key_lk1_8", + SE_CFG_ETCAM_KEY_LK1_8r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000454, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk1_8_reg, + NULL, + NULL, + }, + { + "etcam_key_lk1_7", + SE_CFG_ETCAM_KEY_LK1_7r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000458, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk1_7_reg, + NULL, + NULL, + }, + { + "etcam_key_lk1_6", + SE_CFG_ETCAM_KEY_LK1_6r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000045c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk1_6_reg, + NULL, + NULL, + }, + { + "etcam_key_lk1_5", + SE_CFG_ETCAM_KEY_LK1_5r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000460, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk1_5_reg, + NULL, + NULL, + }, + { + "etcam_key_lk1_4", + SE_CFG_ETCAM_KEY_LK1_4r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000464, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk1_4_reg, + NULL, + NULL, + }, + { + "etcam_key_lk1_3", + SE_CFG_ETCAM_KEY_LK1_3r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000468, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk1_3_reg, + NULL, + NULL, + }, + { + "etcam_key_lk1_2", + SE_CFG_ETCAM_KEY_LK1_2r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000046c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk1_2_reg, + NULL, + NULL, + }, + { + "etcam_key_lk1_1", + SE_CFG_ETCAM_KEY_LK1_1r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000470, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk1_1_reg, + NULL, + NULL, + }, + { + "etcam_key_lk1_0", + SE_CFG_ETCAM_KEY_LK1_0r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000474, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk1_0_reg, + NULL, + NULL, + }, + { + "etcam_key_lk2_22", + SE_CFG_ETCAM_KEY_LK2_22r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000478, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk2_22_reg, + NULL, + NULL, + }, + { + "etcam_key_lk2_21", + SE_CFG_ETCAM_KEY_LK2_21r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000047c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk2_21_reg, + NULL, + NULL, + }, + { + "etcam_key_lk2_20", + SE_CFG_ETCAM_KEY_LK2_20r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000480, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk2_20_reg, + NULL, + NULL, + }, + { + "etcam_key_lk2_19", + SE_CFG_ETCAM_KEY_LK2_19r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000484, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk2_19_reg, + NULL, + NULL, + }, + { + "etcam_key_lk2_18", + SE_CFG_ETCAM_KEY_LK2_18r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000488, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk2_18_reg, + NULL, + NULL, + }, + { + "etcam_key_lk2_17", + SE_CFG_ETCAM_KEY_LK2_17r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000048c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk2_17_reg, + NULL, + NULL, + }, + { + "etcam_key_lk2_16", + SE_CFG_ETCAM_KEY_LK2_16r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000490, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk2_16_reg, + NULL, + NULL, + }, + { + "etcam_key_lk2_15", + SE_CFG_ETCAM_KEY_LK2_15r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000494, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk2_15_reg, + NULL, + NULL, + }, + { + "etcam_key_lk2_14", + SE_CFG_ETCAM_KEY_LK2_14r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000498, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk2_14_reg, + NULL, + NULL, + }, + { + "etcam_key_lk2_13", + SE_CFG_ETCAM_KEY_LK2_13r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000049c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk2_13_reg, + NULL, + NULL, + }, + { + "etcam_key_lk2_12", + SE_CFG_ETCAM_KEY_LK2_12r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000004a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk2_12_reg, + NULL, + NULL, + }, + { + "etcam_key_lk2_11", + SE_CFG_ETCAM_KEY_LK2_11r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000004a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk2_11_reg, + NULL, + NULL, + }, + { + "etcam_key_lk2_10", + SE_CFG_ETCAM_KEY_LK2_10r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000004a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk2_10_reg, + NULL, + NULL, + }, + { + "etcam_key_lk2_9", + SE_CFG_ETCAM_KEY_LK2_9r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000004ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk2_9_reg, + NULL, + NULL, + }, + { + "etcam_key_lk2_8", + SE_CFG_ETCAM_KEY_LK2_8r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000004b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk2_8_reg, + NULL, + NULL, + }, + { + "etcam_key_lk2_7", + SE_CFG_ETCAM_KEY_LK2_7r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000004b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk2_7_reg, + NULL, + NULL, + }, + { + "etcam_key_lk2_6", + SE_CFG_ETCAM_KEY_LK2_6r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000004b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk2_6_reg, + NULL, + NULL, + }, + { + "etcam_key_lk2_5", + SE_CFG_ETCAM_KEY_LK2_5r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000004bc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk2_5_reg, + NULL, + NULL, + }, + { + "etcam_key_lk2_4", + SE_CFG_ETCAM_KEY_LK2_4r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000004c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk2_4_reg, + NULL, + NULL, + }, + { + "etcam_key_lk2_3", + SE_CFG_ETCAM_KEY_LK2_3r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000004c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk2_3_reg, + NULL, + NULL, + }, + { + "etcam_key_lk2_2", + SE_CFG_ETCAM_KEY_LK2_2r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000004c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk2_2_reg, + NULL, + NULL, + }, + { + "etcam_key_lk2_1", + SE_CFG_ETCAM_KEY_LK2_1r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000004cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk2_1_reg, + NULL, + NULL, + }, + { + "etcam_key_lk2_0", + SE_CFG_ETCAM_KEY_LK2_0r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000004d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk2_0_reg, + NULL, + NULL, + }, + { + "etcam_key_lk3_22", + SE_CFG_ETCAM_KEY_LK3_22r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000004d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk3_22_reg, + NULL, + NULL, + }, + { + "etcam_key_lk3_21", + SE_CFG_ETCAM_KEY_LK3_21r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000004d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk3_21_reg, + NULL, + NULL, + }, + { + "etcam_key_lk3_20", + SE_CFG_ETCAM_KEY_LK3_20r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000004dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk3_20_reg, + NULL, + NULL, + }, + { + "etcam_key_lk3_19", + SE_CFG_ETCAM_KEY_LK3_19r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000004e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk3_19_reg, + NULL, + NULL, + }, + { + "etcam_key_lk3_18", + SE_CFG_ETCAM_KEY_LK3_18r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000004e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk3_18_reg, + NULL, + NULL, + }, + { + "etcam_key_lk3_17", + SE_CFG_ETCAM_KEY_LK3_17r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000004e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk3_17_reg, + NULL, + NULL, + }, + { + "etcam_key_lk3_16", + SE_CFG_ETCAM_KEY_LK3_16r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000004ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk3_16_reg, + NULL, + NULL, + }, + { + "etcam_key_lk3_15", + SE_CFG_ETCAM_KEY_LK3_15r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000004f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk3_15_reg, + NULL, + NULL, + }, + { + "etcam_key_lk3_14", + SE_CFG_ETCAM_KEY_LK3_14r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000004f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk3_14_reg, + NULL, + NULL, + }, + { + "etcam_key_lk3_13", + SE_CFG_ETCAM_KEY_LK3_13r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000004f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk3_13_reg, + NULL, + NULL, + }, + { + "etcam_key_lk3_12", + SE_CFG_ETCAM_KEY_LK3_12r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000004fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk3_12_reg, + NULL, + NULL, + }, + { + "etcam_key_lk3_11", + SE_CFG_ETCAM_KEY_LK3_11r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000500, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk3_11_reg, + NULL, + NULL, + }, + { + "etcam_key_lk3_10", + SE_CFG_ETCAM_KEY_LK3_10r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000504, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk3_10_reg, + NULL, + NULL, + }, + { + "etcam_key_lk3_9", + SE_CFG_ETCAM_KEY_LK3_9r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000508, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk3_9_reg, + NULL, + NULL, + }, + { + "etcam_key_lk3_8", + SE_CFG_ETCAM_KEY_LK3_8r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000050c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk3_8_reg, + NULL, + NULL, + }, + { + "etcam_key_lk3_7", + SE_CFG_ETCAM_KEY_LK3_7r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000510, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk3_7_reg, + NULL, + NULL, + }, + { + "etcam_key_lk3_6", + SE_CFG_ETCAM_KEY_LK3_6r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000514, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk3_6_reg, + NULL, + NULL, + }, + { + "etcam_key_lk3_5", + SE_CFG_ETCAM_KEY_LK3_5r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000518, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk3_5_reg, + NULL, + NULL, + }, + { + "etcam_key_lk3_4", + SE_CFG_ETCAM_KEY_LK3_4r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000051c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk3_4_reg, + NULL, + NULL, + }, + { + "etcam_key_lk3_3", + SE_CFG_ETCAM_KEY_LK3_3r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000520, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk3_3_reg, + NULL, + NULL, + }, + { + "etcam_key_lk3_2", + SE_CFG_ETCAM_KEY_LK3_2r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000524, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk3_2_reg, + NULL, + NULL, + }, + { + "etcam_key_lk3_1", + SE_CFG_ETCAM_KEY_LK3_1r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x00000528, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk3_1_reg, + NULL, + NULL, + }, + { + "etcam_key_lk3_0", + SE_CFG_ETCAM_KEY_LK3_0r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x0000052c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_etcam_key_lk3_0_reg, + NULL, + NULL, + }, + { + "pbu_key_lk0_3", + SE_CFG_PBU_KEY_LK0_3r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000006a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_pbu_key_lk0_3_reg, + NULL, + NULL, + }, + { + "pbu_key_lk0_2", + SE_CFG_PBU_KEY_LK0_2r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000006a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_pbu_key_lk0_2_reg, + NULL, + NULL, + }, + { + "pbu_key_lk0_1", + SE_CFG_PBU_KEY_LK0_1r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000006a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_pbu_key_lk0_1_reg, + NULL, + NULL, + }, + { + "pbu_key_lk0_0", + SE_CFG_PBU_KEY_LK0_0r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000006ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_pbu_key_lk0_0_reg, + NULL, + NULL, + }, + { + "pbu_key_lk1_3", + SE_CFG_PBU_KEY_LK1_3r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000006b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_pbu_key_lk1_3_reg, + NULL, + NULL, + }, + { + "pbu_key_lk1_2", + SE_CFG_PBU_KEY_LK1_2r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000006b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_pbu_key_lk1_2_reg, + NULL, + NULL, + }, + { + "pbu_key_lk1_1", + SE_CFG_PBU_KEY_LK1_1r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000006b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_pbu_key_lk1_1_reg, + NULL, + NULL, + }, + { + "pbu_key_lk1_0", + SE_CFG_PBU_KEY_LK1_0r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000006bc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_pbu_key_lk1_0_reg, + NULL, + NULL, + }, + { + "pbu_key_lk2_3", + SE_CFG_PBU_KEY_LK2_3r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000006c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_pbu_key_lk2_3_reg, + NULL, + NULL, + }, + { + "pbu_key_lk2_2", + SE_CFG_PBU_KEY_LK2_2r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000006c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_pbu_key_lk2_2_reg, + NULL, + NULL, + }, + { + "pbu_key_lk2_1", + SE_CFG_PBU_KEY_LK2_1r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000006c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_pbu_key_lk2_1_reg, + NULL, + NULL, + }, + { + "pbu_key_lk2_0", + SE_CFG_PBU_KEY_LK2_0r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000006cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_pbu_key_lk2_0_reg, + NULL, + NULL, + }, + { + "pbu_key_lk3_3", + SE_CFG_PBU_KEY_LK3_3r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000006d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_pbu_key_lk3_3_reg, + NULL, + NULL, + }, + { + "pbu_key_lk3_2", + SE_CFG_PBU_KEY_LK3_2r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000006d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_pbu_key_lk3_2_reg, + NULL, + NULL, + }, + { + "pbu_key_lk3_1", + SE_CFG_PBU_KEY_LK3_1r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000006d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_pbu_key_lk3_1_reg, + NULL, + NULL, + }, + { + "pbu_key_lk3_0", + SE_CFG_PBU_KEY_LK3_0r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_CFG_BASE_ADDR + 0x000006dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cfg_pbu_key_lk3_0_reg, + NULL, + NULL, + }, + { + "schd_learn_fifo_pfull_ast", + SE_ALG_SCHD_LEARN_FIFO_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x008c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_learn_fifo_pfull_ast_reg, + NULL, + NULL, + }, + { + "schd_learn_fifo_pfull_neg", + SE_ALG_SCHD_LEARN_FIFO_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0090, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_learn_fifo_pfull_neg_reg, + NULL, + NULL, + }, + { + "schd_hash0_fifo_pfull_ast", + SE_ALG_SCHD_HASH0_FIFO_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0094, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_hash0_fifo_pfull_ast_reg, + NULL, + NULL, + }, + { + "schd_hash0_fifo_pfull_neg", + SE_ALG_SCHD_HASH0_FIFO_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0098, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_hash0_fifo_pfull_neg_reg, + NULL, + NULL, + }, + { + "schd_hash1_fifo_pfull_ast", + SE_ALG_SCHD_HASH1_FIFO_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x009c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_hash1_fifo_pfull_ast_reg, + NULL, + NULL, + }, + { + "schd_hash1_fifo_pfull_neg", + SE_ALG_SCHD_HASH1_FIFO_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_hash1_fifo_pfull_neg_reg, + NULL, + NULL, + }, + { + "schd_hash2_fifo_pfull_ast", + SE_ALG_SCHD_HASH2_FIFO_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_hash2_fifo_pfull_ast_reg, + NULL, + NULL, + }, + { + "schd_hash2_fifo_pfull_neg", + SE_ALG_SCHD_HASH2_FIFO_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_hash2_fifo_pfull_neg_reg, + NULL, + NULL, + }, + { + "schd_hash3_fifo_pfull_ast", + SE_ALG_SCHD_HASH3_FIFO_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_hash3_fifo_pfull_ast_reg, + NULL, + NULL, + }, + { + "schd_hash3_fifo_pfull_neg", + SE_ALG_SCHD_HASH3_FIFO_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_hash3_fifo_pfull_neg_reg, + NULL, + NULL, + }, + { + "schd_lpm_fifo_pfull_ast", + SE_ALG_SCHD_LPM_FIFO_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_lpm_fifo_pfull_ast_reg, + NULL, + NULL, + }, + { + "schd_lpm_fifo_pfull_neg", + SE_ALG_SCHD_LPM_FIFO_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_lpm_fifo_pfull_neg_reg, + NULL, + NULL, + }, + { + "hash0_key_fifo_pfull_ast", + SE_ALG_HASH0_KEY_FIFO_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash0_key_fifo_pfull_ast_reg, + NULL, + NULL, + }, + { + "hash0_key_fifo_pfull_neg", + SE_ALG_HASH0_KEY_FIFO_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash0_key_fifo_pfull_neg_reg, + NULL, + NULL, + }, + { + "hash0_sreq_fifo_pfull_ast", + SE_ALG_HASH0_SREQ_FIFO_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash0_sreq_fifo_pfull_ast_reg, + NULL, + NULL, + }, + { + "hash0_sreq_fifo_pfull_neg", + SE_ALG_HASH0_SREQ_FIFO_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash0_sreq_fifo_pfull_neg_reg, + NULL, + NULL, + }, + { + "hash0_int_rsp_fifo_pfull_ast", + SE_ALG_HASH0_INT_RSP_FIFO_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash0_int_rsp_fifo_pfull_ast_reg, + NULL, + NULL, + }, + { + "hash0_int_rsp_fifo_pfull_neg", + SE_ALG_HASH0_INT_RSP_FIFO_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash0_int_rsp_fifo_pfull_neg_reg, + NULL, + NULL, + }, + { + "hash0_ext_rsp_fifo_pfull_ast", + SE_ALG_HASH0_EXT_RSP_FIFO_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash0_ext_rsp_fifo_pfull_ast_reg, + NULL, + NULL, + }, + { + "hash0_ext_rsp_fifo_pfull_neg", + SE_ALG_HASH0_EXT_RSP_FIFO_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash0_ext_rsp_fifo_pfull_neg_reg, + NULL, + NULL, + }, + { + "hash1_key_fifo_pfull_ast", + SE_ALG_HASH1_KEY_FIFO_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash1_key_fifo_pfull_ast_reg, + NULL, + NULL, + }, + { + "hash1_key_fifo_pfull_neg", + SE_ALG_HASH1_KEY_FIFO_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash1_key_fifo_pfull_neg_reg, + NULL, + NULL, + }, + { + "hash1_sreq_fifo_pfull_ast", + SE_ALG_HASH1_SREQ_FIFO_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash1_sreq_fifo_pfull_ast_reg, + NULL, + NULL, + }, + { + "hash1_sreq_fifo_pfull_neg", + SE_ALG_HASH1_SREQ_FIFO_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash1_sreq_fifo_pfull_neg_reg, + NULL, + NULL, + }, + { + "hash1_int_rsp_fifo_pfull_ast", + SE_ALG_HASH1_INT_RSP_FIFO_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash1_int_rsp_fifo_pfull_ast_reg, + NULL, + NULL, + }, + { + "hash1_int_rsp_fifo_pfull_neg", + SE_ALG_HASH1_INT_RSP_FIFO_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0100, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash1_int_rsp_fifo_pfull_neg_reg, + NULL, + NULL, + }, + { + "hash1_ext_rsp_fifo_pfull_ast", + SE_ALG_HASH1_EXT_RSP_FIFO_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0104, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash1_ext_rsp_fifo_pfull_ast_reg, + NULL, + NULL, + }, + { + "hash1_ext_rsp_fifo_pfull_neg", + SE_ALG_HASH1_EXT_RSP_FIFO_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0108, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash1_ext_rsp_fifo_pfull_neg_reg, + NULL, + NULL, + }, + { + "hash2_key_fifo_pfull_ast", + SE_ALG_HASH2_KEY_FIFO_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x010c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash2_key_fifo_pfull_ast_reg, + NULL, + NULL, + }, + { + "hash2_key_fifo_pfull_neg", + SE_ALG_HASH2_KEY_FIFO_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0110, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash2_key_fifo_pfull_neg_reg, + NULL, + NULL, + }, + { + "hash2_sreq_fifo_pfull_ast", + SE_ALG_HASH2_SREQ_FIFO_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0114, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash2_sreq_fifo_pfull_ast_reg, + NULL, + NULL, + }, + { + "hash2_sreq_fifo_pfull_neg", + SE_ALG_HASH2_SREQ_FIFO_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0118, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash2_sreq_fifo_pfull_neg_reg, + NULL, + NULL, + }, + { + "hash2_int_rsp_fifo_pfull_ast", + SE_ALG_HASH2_INT_RSP_FIFO_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x011c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash2_int_rsp_fifo_pfull_ast_reg, + NULL, + NULL, + }, + { + "hash2_int_rsp_fifo_pfull_neg", + SE_ALG_HASH2_INT_RSP_FIFO_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0120, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash2_int_rsp_fifo_pfull_neg_reg, + NULL, + NULL, + }, + { + "hash2_ext_rsp_fifo_pfull_ast", + SE_ALG_HASH2_EXT_RSP_FIFO_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0124, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash2_ext_rsp_fifo_pfull_ast_reg, + NULL, + NULL, + }, + { + "hash2_ext_rsp_fifo_pfull_neg", + SE_ALG_HASH2_EXT_RSP_FIFO_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0128, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash2_ext_rsp_fifo_pfull_neg_reg, + NULL, + NULL, + }, + { + "hash3_key_fifo_pfull_ast", + SE_ALG_HASH3_KEY_FIFO_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x012c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash3_key_fifo_pfull_ast_reg, + NULL, + NULL, + }, + { + "hash3_key_fifo_pfull_neg", + SE_ALG_HASH3_KEY_FIFO_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0130, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash3_key_fifo_pfull_neg_reg, + NULL, + NULL, + }, + { + "hash3_sreq_fifo_pfull_ast", + SE_ALG_HASH3_SREQ_FIFO_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0134, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash3_sreq_fifo_pfull_ast_reg, + NULL, + NULL, + }, + { + "hash3_sreq_fifo_pfull_neg", + SE_ALG_HASH3_SREQ_FIFO_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0138, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash3_sreq_fifo_pfull_neg_reg, + NULL, + NULL, + }, + { + "hash3_int_rsp_fifo_pfull_ast", + SE_ALG_HASH3_INT_RSP_FIFO_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x013c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash3_int_rsp_fifo_pfull_ast_reg, + NULL, + NULL, + }, + { + "hash3_int_rsp_fifo_pfull_neg", + SE_ALG_HASH3_INT_RSP_FIFO_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0140, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash3_int_rsp_fifo_pfull_neg_reg, + NULL, + NULL, + }, + { + "hash3_ext_rsp_fifo_pfull_ast", + SE_ALG_HASH3_EXT_RSP_FIFO_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0144, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash3_ext_rsp_fifo_pfull_ast_reg, + NULL, + NULL, + }, + { + "hash3_ext_rsp_fifo_pfull_neg", + SE_ALG_HASH3_EXT_RSP_FIFO_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0148, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash3_ext_rsp_fifo_pfull_neg_reg, + NULL, + NULL, + }, + { + "lpm_as_info", + SE_ALG_LPM_AS_INFOr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0158, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se_alg_lpm_as_info_reg, + NULL, + NULL, + }, + { + "lpm_ext_rsp_fifo_u0_pfull_neg", + SE_ALG_LPM_EXT_RSP_FIFO_U0_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0160, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_ext_rsp_fifo_u0_pfull_neg_reg, + NULL, + NULL, + }, + { + "lpm_ext_rsp_fifo_u2_pfull_ast", + SE_ALG_LPM_EXT_RSP_FIFO_U2_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x016c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_ext_rsp_fifo_u2_pfull_ast_reg, + NULL, + NULL, + }, + { + "lpm_ext_rsp_fifo_u2_pfull_neg", + SE_ALG_LPM_EXT_RSP_FIFO_U2_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0170, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_ext_rsp_fifo_u2_pfull_neg_reg, + NULL, + NULL, + }, + { + "lpm_ext_rsp_fifo_u3_pfull_ast", + SE_ALG_LPM_EXT_RSP_FIFO_U3_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0174, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_ext_rsp_fifo_u3_pfull_ast_reg, + NULL, + NULL, + }, + { + "lpm_ext_rsp_fifo_u3_pfull_neg", + SE_ALG_LPM_EXT_RSP_FIFO_U3_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0178, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_ext_rsp_fifo_u3_pfull_neg_reg, + NULL, + NULL, + }, + { + "lpm_ext_rsp_fifo_u4_pfull_ast", + SE_ALG_LPM_EXT_RSP_FIFO_U4_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x017c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_ext_rsp_fifo_u4_pfull_ast_reg, + NULL, + NULL, + }, + { + "lpm_ext_rsp_fifo_u4_pfull_neg", + SE_ALG_LPM_EXT_RSP_FIFO_U4_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0180, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_ext_rsp_fifo_u4_pfull_neg_reg, + NULL, + NULL, + }, + { + "lpm_as_rsp_fifo_u0_pfull_ast", + SE_ALG_LPM_AS_RSP_FIFO_U0_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x018c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_as_rsp_fifo_u0_pfull_ast_reg, + NULL, + NULL, + }, + { + "lpm_as_rsp_fifo_u0_pfull_neg", + SE_ALG_LPM_AS_RSP_FIFO_U0_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0190, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_as_rsp_fifo_u0_pfull_neg_reg, + NULL, + NULL, + }, + { + "lpm_as_rsp_fifo_u1_pfull_ast", + SE_ALG_LPM_AS_RSP_FIFO_U1_PFULL_ASTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0194, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_as_rsp_fifo_u1_pfull_ast_reg, + NULL, + NULL, + }, + { + "lpm_as_rsp_fifo_u1_pfull_neg", + SE_ALG_LPM_AS_RSP_FIFO_U1_PFULL_NEGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x0198, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_as_rsp_fifo_u1_pfull_neg_reg, + NULL, + NULL, + }, + { + "lpm_v4_ddr3_base_addr", + SE_ALG_LPM_V4_DDR3_BASE_ADDRr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x019c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_v4_ddr3_base_addr_reg, + NULL, + NULL, + }, + { + "lpm_v6_ddr3_base_addr", + SE_ALG_LPM_V6_DDR3_BASE_ADDRr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x01a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_v6_ddr3_base_addr_reg, + NULL, + NULL, + }, + { + "debug_cnt_mode", + SE_ALG_DEBUG_CNT_MODEr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x01d4, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se_alg_debug_cnt_mode_reg, + NULL, + NULL, + }, + { + "hash_p0_key_vld_cnt", + SE_ALG_HASH_P0_KEY_VLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash_p0_key_vld_cnt_reg, + NULL, + NULL, + }, + { + "hash_p1_key_vld_cnt", + SE_ALG_HASH_P1_KEY_VLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1004, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash_p1_key_vld_cnt_reg, + NULL, + NULL, + }, + { + "hash_p2_key_vld_cnt", + SE_ALG_HASH_P2_KEY_VLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash_p2_key_vld_cnt_reg, + NULL, + NULL, + }, + { + "hash_p3_key_vld_cnt", + SE_ALG_HASH_P3_KEY_VLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x100c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash_p3_key_vld_cnt_reg, + NULL, + NULL, + }, + { + "lpm_p0_key_vld_cnt", + SE_ALG_LPM_P0_KEY_VLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1010, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_p0_key_vld_cnt_reg, + NULL, + NULL, + }, + { + "hash_p0_rsp_vld_cnt", + SE_ALG_HASH_P0_RSP_VLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1014, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash_p0_rsp_vld_cnt_reg, + NULL, + NULL, + }, + { + "hash_p1_rsp_vld_cnt", + SE_ALG_HASH_P1_RSP_VLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1018, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash_p1_rsp_vld_cnt_reg, + NULL, + NULL, + }, + { + "hash_p2_rsp_vld_cnt", + SE_ALG_HASH_P2_RSP_VLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x101c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash_p2_rsp_vld_cnt_reg, + NULL, + NULL, + }, + { + "hash_p3_rsp_vld_cnt", + SE_ALG_HASH_P3_RSP_VLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1020, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash_p3_rsp_vld_cnt_reg, + NULL, + NULL, + }, + { + "lpm_p0_rsp_vld_cnt", + SE_ALG_LPM_P0_RSP_VLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1024, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_p0_rsp_vld_cnt_reg, + NULL, + NULL, + }, + { + "hash_p0_smf_cnt", + SE_ALG_HASH_P0_SMF_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1028, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash_p0_smf_cnt_reg, + NULL, + NULL, + }, + { + "hash_p1_smf_cnt", + SE_ALG_HASH_P1_SMF_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x102c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash_p1_smf_cnt_reg, + NULL, + NULL, + }, + { + "hash_p2_smf_cnt", + SE_ALG_HASH_P2_SMF_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1030, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash_p2_smf_cnt_reg, + NULL, + NULL, + }, + { + "hash_p3_smf_cnt", + SE_ALG_HASH_P3_SMF_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1034, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash_p3_smf_cnt_reg, + NULL, + NULL, + }, + { + "lpm_p0_smf_cnt", + SE_ALG_LPM_P0_SMF_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1038, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_p0_smf_cnt_reg, + NULL, + NULL, + }, + { + "hash_p0_spacevld_cnt", + SE_ALG_HASH_P0_SPACEVLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x103c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash_p0_spacevld_cnt_reg, + NULL, + NULL, + }, + { + "hash_p1_spacevld_cnt", + SE_ALG_HASH_P1_SPACEVLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1040, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash_p1_spacevld_cnt_reg, + NULL, + NULL, + }, + { + "hash_p2_spacevld_cnt", + SE_ALG_HASH_P2_SPACEVLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1044, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash_p2_spacevld_cnt_reg, + NULL, + NULL, + }, + { + "hash_p3_spacevld_cnt", + SE_ALG_HASH_P3_SPACEVLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1048, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash_p3_spacevld_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_p0_req_vld_cnt", + SE_ALG_SMMU1_P0_REQ_VLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x104c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_smmu1_p0_req_vld_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_p1_req_vld_cnt", + SE_ALG_SMMU1_P1_REQ_VLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1050, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_smmu1_p1_req_vld_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_p2_req_vld_cnt", + SE_ALG_SMMU1_P2_REQ_VLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1054, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_smmu1_p2_req_vld_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_p3_req_vld_cnt", + SE_ALG_SMMU1_P3_REQ_VLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1058, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_smmu1_p3_req_vld_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_p4_req_vld_cnt", + SE_ALG_SMMU1_P4_REQ_VLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x105c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_smmu1_p4_req_vld_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_p5_req_vld_cnt", + SE_ALG_SMMU1_P5_REQ_VLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1060, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_smmu1_p5_req_vld_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_p0_rsp_vld_cnt", + SE_ALG_SMMU1_P0_RSP_VLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1064, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_smmu1_p0_rsp_vld_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_p1_rsp_vld_cnt", + SE_ALG_SMMU1_P1_RSP_VLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1068, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_smmu1_p1_rsp_vld_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_p2_rsp_vld_cnt", + SE_ALG_SMMU1_P2_RSP_VLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x106c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_smmu1_p2_rsp_vld_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_p3_rsp_vld_cnt", + SE_ALG_SMMU1_P3_RSP_VLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1070, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_smmu1_p3_rsp_vld_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_p4_rsp_vld_cnt", + SE_ALG_SMMU1_P4_RSP_VLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1074, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_smmu1_p4_rsp_vld_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_p5_rsp_vld_cnt", + SE_ALG_SMMU1_P5_RSP_VLD_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1078, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_smmu1_p5_rsp_vld_cnt_reg, + NULL, + NULL, + }, + { + "schd_learn_fifo_int_cnt", + SE_ALG_SCHD_LEARN_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x107c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_learn_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "schd_hash0_fifo_int_cnt", + SE_ALG_SCHD_HASH0_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1080, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_hash0_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "schd_hash1_fifo_int_cnt", + SE_ALG_SCHD_HASH1_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1084, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_hash1_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "schd_hash2_fifo_int_cnt", + SE_ALG_SCHD_HASH2_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1088, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_hash2_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "schd_hash3_fifo_int_cnt", + SE_ALG_SCHD_HASH3_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x108c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_hash3_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "schd_lpm_fifo_int_cnt", + SE_ALG_SCHD_LPM_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1090, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_lpm_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "schd_learn_fifo_parity_err_cnt", + SE_ALG_SCHD_LEARN_FIFO_PARITY_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1094, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_learn_fifo_parity_err_cnt_reg, + NULL, + NULL, + }, + { + "schd_hash0_fifo_parity_err_cnt", + SE_ALG_SCHD_HASH0_FIFO_PARITY_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1098, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_hash0_fifo_parity_err_cnt_reg, + NULL, + NULL, + }, + { + "schd_hash1_fifo_parity_err_cnt", + SE_ALG_SCHD_HASH1_FIFO_PARITY_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x109c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_hash1_fifo_parity_err_cnt_reg, + NULL, + NULL, + }, + { + "schd_hash2_fifo_parity_err_cnt", + SE_ALG_SCHD_HASH2_FIFO_PARITY_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x10a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_hash2_fifo_parity_err_cnt_reg, + NULL, + NULL, + }, + { + "schd_hash3_fifo_parity_err_cnt", + SE_ALG_SCHD_HASH3_FIFO_PARITY_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x10a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_hash3_fifo_parity_err_cnt_reg, + NULL, + NULL, + }, + { + "schd_lpm_fifo_parity_err_cnt", + SE_ALG_SCHD_LPM_FIFO_PARITY_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x10a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_lpm_fifo_parity_err_cnt_reg, + NULL, + NULL, + }, + { + "rd_init_cft_cnt", + SE_ALG_RD_INIT_CFT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x10ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_rd_init_cft_cnt_reg, + NULL, + NULL, + }, + { + "zgp0_zblk0_ecc_err_cnt", + SE_ALG_ZGP0_ZBLK0_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x10b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp0_zblk0_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp0_zblk1_ecc_err_cnt", + SE_ALG_ZGP0_ZBLK1_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x10b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp0_zblk1_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp0_zblk2_ecc_err_cnt", + SE_ALG_ZGP0_ZBLK2_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x10b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp0_zblk2_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp0_zblk3_ecc_err_cnt", + SE_ALG_ZGP0_ZBLK3_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x10bc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp0_zblk3_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp0_zblk4_ecc_err_cnt", + SE_ALG_ZGP0_ZBLK4_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x10c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp0_zblk4_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp0_zblk5_ecc_err_cnt", + SE_ALG_ZGP0_ZBLK5_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x10c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp0_zblk5_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp0_zblk6_ecc_err_cnt", + SE_ALG_ZGP0_ZBLK6_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x10c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp0_zblk6_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp0_zblk7_ecc_err_cnt", + SE_ALG_ZGP0_ZBLK7_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x10cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp0_zblk7_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp1_zblk0_ecc_err_cnt", + SE_ALG_ZGP1_ZBLK0_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x10d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp1_zblk0_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp1_zblk1_ecc_err_cnt", + SE_ALG_ZGP1_ZBLK1_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x10d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp1_zblk1_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp1_zblk2_ecc_err_cnt", + SE_ALG_ZGP1_ZBLK2_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x10d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp1_zblk2_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp1_zblk3_ecc_err_cnt", + SE_ALG_ZGP1_ZBLK3_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x10dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp1_zblk3_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp1_zblk4_ecc_err_cnt", + SE_ALG_ZGP1_ZBLK4_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x10e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp1_zblk4_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp1_zblk5_ecc_err_cnt", + SE_ALG_ZGP1_ZBLK5_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x10e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp1_zblk5_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp1_zblk6_ecc_err_cnt", + SE_ALG_ZGP1_ZBLK6_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x10e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp1_zblk6_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp1_zblk7_ecc_err_cnt", + SE_ALG_ZGP1_ZBLK7_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x10ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp1_zblk7_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp2_zblk0_ecc_err_cnt", + SE_ALG_ZGP2_ZBLK0_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x10f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp2_zblk0_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp2_zblk1_ecc_err_cnt", + SE_ALG_ZGP2_ZBLK1_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x10f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp2_zblk1_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp2_zblk2_ecc_err_cnt", + SE_ALG_ZGP2_ZBLK2_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x10f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp2_zblk2_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp2_zblk3_ecc_err_cnt", + SE_ALG_ZGP2_ZBLK3_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x10fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp2_zblk3_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp2_zblk4_ecc_err_cnt", + SE_ALG_ZGP2_ZBLK4_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1100, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp2_zblk4_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp2_zblk5_ecc_err_cnt", + SE_ALG_ZGP2_ZBLK5_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1104, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp2_zblk5_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp2_zblk6_ecc_err_cnt", + SE_ALG_ZGP2_ZBLK6_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1108, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp2_zblk6_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp2_zblk7_ecc_err_cnt", + SE_ALG_ZGP2_ZBLK7_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x110c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp2_zblk7_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp3_zblk0_ecc_err_cnt", + SE_ALG_ZGP3_ZBLK0_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1110, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp3_zblk0_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp3_zblk1_ecc_err_cnt", + SE_ALG_ZGP3_ZBLK1_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1114, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp3_zblk1_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp3_zblk2_ecc_err_cnt", + SE_ALG_ZGP3_ZBLK2_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1118, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp3_zblk2_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp3_zblk3_ecc_err_cnt", + SE_ALG_ZGP3_ZBLK3_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x111c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp3_zblk3_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp3_zblk4_ecc_err_cnt", + SE_ALG_ZGP3_ZBLK4_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1120, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp3_zblk4_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp3_zblk5_ecc_err_cnt", + SE_ALG_ZGP3_ZBLK5_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1124, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp3_zblk5_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp3_zblk6_ecc_err_cnt", + SE_ALG_ZGP3_ZBLK6_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1128, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp3_zblk6_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zgp3_zblk7_ecc_err_cnt", + SE_ALG_ZGP3_ZBLK7_ECC_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x112c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zgp3_zblk7_ecc_err_cnt_reg, + NULL, + NULL, + }, + { + "zcam_hash_p0_err_cnt", + SE_ALG_ZCAM_HASH_P0_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1130, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zcam_hash_p0_err_cnt_reg, + NULL, + NULL, + }, + { + "zcam_hash_p1_err_cnt", + SE_ALG_ZCAM_HASH_P1_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1134, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zcam_hash_p1_err_cnt_reg, + NULL, + NULL, + }, + { + "zcam_hash_p2_err_cnt", + SE_ALG_ZCAM_HASH_P2_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1138, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zcam_hash_p2_err_cnt_reg, + NULL, + NULL, + }, + { + "zcam_hash_p3_err_cnt", + SE_ALG_ZCAM_HASH_P3_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x113c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zcam_hash_p3_err_cnt_reg, + NULL, + NULL, + }, + { + "zcam_lpm_err_cnt", + SE_ALG_ZCAM_LPM_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1140, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zcam_lpm_err_cnt_reg, + NULL, + NULL, + }, + { + "hash0_sreq_fifo_parity_err_cnt", + SE_ALG_HASH0_SREQ_FIFO_PARITY_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1144, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash0_sreq_fifo_parity_err_cnt_reg, + NULL, + NULL, + }, + { + "hash0_sreq_fifo_int_cnt", + SE_ALG_HASH0_SREQ_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1148, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash0_sreq_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "hash0_key_fifo_int_cnt", + SE_ALG_HASH0_KEY_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x114c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash0_key_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "hash0_int_rsp_fifo_parity_err_cnt", + SE_ALG_HASH0_INT_RSP_FIFO_PARITY_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1150, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash0_int_rsp_fifo_parity_err_cnt_reg, + NULL, + NULL, + }, + { + "hash0_ext_rsp_fifo_parity_err_cnt", + SE_ALG_HASH0_EXT_RSP_FIFO_PARITY_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1154, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash0_ext_rsp_fifo_parity_err_cnt_reg, + NULL, + NULL, + }, + { + "hash0_ext_rsp_fifo_int_cnt", + SE_ALG_HASH0_EXT_RSP_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1158, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash0_ext_rsp_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "hash0_int_rsp_fifo_int_cnt", + SE_ALG_HASH0_INT_RSP_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x115c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash0_int_rsp_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "hash1_sreq_fifo_parity_err_cnt", + SE_ALG_HASH1_SREQ_FIFO_PARITY_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1160, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash1_sreq_fifo_parity_err_cnt_reg, + NULL, + NULL, + }, + { + "hash1_sreq_fifo_int_cnt", + SE_ALG_HASH1_SREQ_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1164, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash1_sreq_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "hash1_key_fifo_int_cnt", + SE_ALG_HASH1_KEY_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1168, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash1_key_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "hash1_int_rsp_fifo_parity_err_cnt", + SE_ALG_HASH1_INT_RSP_FIFO_PARITY_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x116c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash1_int_rsp_fifo_parity_err_cnt_reg, + NULL, + NULL, + }, + { + "hash1_ext_rsp_fifo_parity_err_cnt", + SE_ALG_HASH1_EXT_RSP_FIFO_PARITY_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1170, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash1_ext_rsp_fifo_parity_err_cnt_reg, + NULL, + NULL, + }, + { + "hash1_ext_rsp_fifo_int_cnt", + SE_ALG_HASH1_EXT_RSP_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1174, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash1_ext_rsp_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "hash1_int_rsp_fifo_int_cnt", + SE_ALG_HASH1_INT_RSP_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1178, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash1_int_rsp_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "hash2_sreq_fifo_parity_err_cnt", + SE_ALG_HASH2_SREQ_FIFO_PARITY_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x117c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash2_sreq_fifo_parity_err_cnt_reg, + NULL, + NULL, + }, + { + "hash2_sreq_fifo_int_cnt", + SE_ALG_HASH2_SREQ_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1180, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash2_sreq_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "hash2_key_fifo_int_cnt", + SE_ALG_HASH2_KEY_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1184, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash2_key_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "hash2_int_rsp_fifo_parity_err_cnt", + SE_ALG_HASH2_INT_RSP_FIFO_PARITY_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1188, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash2_int_rsp_fifo_parity_err_cnt_reg, + NULL, + NULL, + }, + { + "hash2_ext_rsp_fifo_parity_err_cnt", + SE_ALG_HASH2_EXT_RSP_FIFO_PARITY_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x118c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash2_ext_rsp_fifo_parity_err_cnt_reg, + NULL, + NULL, + }, + { + "hash2_ext_rsp_fifo_int_cnt", + SE_ALG_HASH2_EXT_RSP_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1190, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash2_ext_rsp_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "hash2_int_rsp_fifo_int_cnt", + SE_ALG_HASH2_INT_RSP_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1194, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash2_int_rsp_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "hash3_sreq_fifo_parity_err_cnt", + SE_ALG_HASH3_SREQ_FIFO_PARITY_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1198, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash3_sreq_fifo_parity_err_cnt_reg, + NULL, + NULL, + }, + { + "hash3_sreq_fifo_int_cnt", + SE_ALG_HASH3_SREQ_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x119c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash3_sreq_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "hash3_key_fifo_int_cnt", + SE_ALG_HASH3_KEY_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x11a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash3_key_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "hash3_int_rsp_fifo_parity_err_cnt", + SE_ALG_HASH3_INT_RSP_FIFO_PARITY_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x11a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash3_int_rsp_fifo_parity_err_cnt_reg, + NULL, + NULL, + }, + { + "hash3_ext_rsp_fifo_parity_err_cnt", + SE_ALG_HASH3_EXT_RSP_FIFO_PARITY_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x11a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash3_ext_rsp_fifo_parity_err_cnt_reg, + NULL, + NULL, + }, + { + "hash3_ext_rsp_fifo_int_cnt", + SE_ALG_HASH3_EXT_RSP_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x11ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash3_ext_rsp_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "hash3_int_rsp_fifo_int_cnt", + SE_ALG_HASH3_INT_RSP_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x11b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash3_int_rsp_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "lpm_ext_rsp_fifo_int_cnt", + SE_ALG_LPM_EXT_RSP_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x11b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_ext_rsp_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "lpm_ext_v6_fifo_int_cnt", + SE_ALG_LPM_EXT_V6_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x11b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_ext_v6_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "lpm_ext_v4_fifo_int_cnt", + SE_ALG_LPM_EXT_V4_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x11bc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_ext_v4_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "lpm_ext_addr_fifo_int_cnt", + SE_ALG_LPM_EXT_ADDR_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x11c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_ext_addr_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "lpm_ext_v4_fifo_parity_err_cnt", + SE_ALG_LPM_EXT_V4_FIFO_PARITY_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x11c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_ext_v4_fifo_parity_err_cnt_reg, + NULL, + NULL, + }, + { + "lpm_ext_v6_fifo_parity_err_cnt", + SE_ALG_LPM_EXT_V6_FIFO_PARITY_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x11c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_ext_v6_fifo_parity_err_cnt_reg, + NULL, + NULL, + }, + { + "lpm_ext_rsp_fifo_parity_err_cnt", + SE_ALG_LPM_EXT_RSP_FIFO_PARITY_ERR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x11cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_ext_rsp_fifo_parity_err_cnt_reg, + NULL, + NULL, + }, + { + "lpm_as_req_fifo_int_cnt", + SE_ALG_LPM_AS_REQ_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x11d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_as_req_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "lpm_as_int_rsp_fifo_int_cnt", + SE_ALG_LPM_AS_INT_RSP_FIFO_INT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x11d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_as_int_rsp_fifo_int_cnt_reg, + NULL, + NULL, + }, + { + "se_alg_int_status", + SE_ALG_SE_ALG_INT_STATUSr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1800, + (32/8), + 0, + 0, + 0, + 0, + 7, + g_se_alg_se_alg_int_status_reg, + NULL, + NULL, + }, + { + "schd_int_en", + SE_ALG_SCHD_INT_ENr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1804, + (32/8), + 0, + 0, + 0, + 0, + 14, + g_se_alg_schd_int_en_reg, + NULL, + NULL, + }, + { + "schd_int_mask", + SE_ALG_SCHD_INT_MASKr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1808, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_int_mask_reg, + NULL, + NULL, + }, + { + "schd_int_status", + SE_ALG_SCHD_INT_STATUSr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x180c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_schd_int_status_reg, + NULL, + NULL, + }, + { + "zblk_ecc_int_en", + SE_ALG_ZBLK_ECC_INT_ENr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1810, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zblk_ecc_int_en_reg, + NULL, + NULL, + }, + { + "zblk_ecc_int_mask", + SE_ALG_ZBLK_ECC_INT_MASKr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1814, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zblk_ecc_int_mask_reg, + NULL, + NULL, + }, + { + "zblk_ecc_int_status", + SE_ALG_ZBLK_ECC_INT_STATUSr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1818, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_zblk_ecc_int_status_reg, + NULL, + NULL, + }, + { + "hash0_int_en", + SE_ALG_HASH0_INT_ENr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x181c, + (32/8), + 0, + 0, + 0, + 0, + 8, + g_se_alg_hash0_int_en_reg, + NULL, + NULL, + }, + { + "hash0_int_mask", + SE_ALG_HASH0_INT_MASKr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1820, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash0_int_mask_reg, + NULL, + NULL, + }, + { + "hash0_int_status", + SE_ALG_HASH0_INT_STATUSr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1824, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash0_int_status_reg, + NULL, + NULL, + }, + { + "hash1_int_en", + SE_ALG_HASH1_INT_ENr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1828, + (32/8), + 0, + 0, + 0, + 0, + 8, + g_se_alg_hash1_int_en_reg, + NULL, + NULL, + }, + { + "hash1_int_mask", + SE_ALG_HASH1_INT_MASKr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x182c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash1_int_mask_reg, + NULL, + NULL, + }, + { + "hash1_int_status", + SE_ALG_HASH1_INT_STATUSr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1830, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash1_int_status_reg, + NULL, + NULL, + }, + { + "hash2_int_en", + SE_ALG_HASH2_INT_ENr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1834, + (32/8), + 0, + 0, + 0, + 0, + 8, + g_se_alg_hash2_int_en_reg, + NULL, + NULL, + }, + { + "hash2_int_mask", + SE_ALG_HASH2_INT_MASKr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1838, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash2_int_mask_reg, + NULL, + NULL, + }, + { + "hash2_int_status", + SE_ALG_HASH2_INT_STATUSr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x183c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash2_int_status_reg, + NULL, + NULL, + }, + { + "hash3_int_en", + SE_ALG_HASH3_INT_ENr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1840, + (32/8), + 0, + 0, + 0, + 0, + 8, + g_se_alg_hash3_int_en_reg, + NULL, + NULL, + }, + { + "hash3_int_mask", + SE_ALG_HASH3_INT_MASKr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1844, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash3_int_mask_reg, + NULL, + NULL, + }, + { + "hash3_int_status", + SE_ALG_HASH3_INT_STATUSr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1848, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_hash3_int_status_reg, + NULL, + NULL, + }, + { + "lpm_int_en", + SE_ALG_LPM_INT_ENr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x184c, + (32/8), + 0, + 0, + 0, + 0, + 10, + g_se_alg_lpm_int_en_reg, + NULL, + NULL, + }, + { + "lpm_int_mask", + SE_ALG_LPM_INT_MASKr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1850, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_int_mask_reg, + NULL, + NULL, + }, + { + "lpm_int_status", + SE_ALG_LPM_INT_STATUSr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_ALG_BASE_ADDR + 0x1854, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_alg_lpm_int_status_reg, + NULL, + NULL, + }, + { + "zblock_lpm_mask0", + SE_ALG_ZBLOCK_LPM_MASK0r, + SE, + DPP_REG_FLAG_INDIRECT, + DPP_REG_BIN_ARRAY, + 0x10001, + (512/8), + 3 + 1, + 7 + 1, + 0x4000, + 0x800, + 5, + g_se_alg_zblock_lpm_mask0_reg, + NULL, + NULL, + }, + { + "zblock_lpm_mask1", + SE_ALG_ZBLOCK_LPM_MASK1r, + SE, + DPP_REG_FLAG_INDIRECT, + DPP_REG_BIN_ARRAY, + 0x10002, + (512/8), + 3 + 1, + 7 + 1, + 0x4000, + 0x800, + 5, + g_se_alg_zblock_lpm_mask1_reg, + NULL, + NULL, + }, + { + "zblock_lpm_mask2", + SE_ALG_ZBLOCK_LPM_MASK2r, + SE, + DPP_REG_FLAG_INDIRECT, + DPP_REG_BIN_ARRAY, + 0x10003, + (512/8), + 3 + 1, + 7 + 1, + 0x4000, + 0x800, + 5, + g_se_alg_zblock_lpm_mask2_reg, + NULL, + NULL, + }, + { + "zblock_lpm_mask3", + SE_ALG_ZBLOCK_LPM_MASK3r, + SE, + DPP_REG_FLAG_INDIRECT, + DPP_REG_BIN_ARRAY, + 0x10004, + (512/8), + 3 + 1, + 7 + 1, + 0x4000, + 0x800, + 5, + g_se_alg_zblock_lpm_mask3_reg, + NULL, + NULL, + }, + { + "zblock_default_route0", + SE_ALG_ZBLOCK_DEFAULT_ROUTE0r, + SE, + DPP_REG_FLAG_INDIRECT, + DPP_REG_BIN_ARRAY, + 0x10005, + (512/8), + 3 + 1, + 7 + 1, + 0x4000, + 0x800, + 4, + g_se_alg_zblock_default_route0_reg, + NULL, + NULL, + }, + { + "zblock_default_route1", + SE_ALG_ZBLOCK_DEFAULT_ROUTE1r, + SE, + DPP_REG_FLAG_INDIRECT, + DPP_REG_BIN_ARRAY, + 0x10006, + (512/8), + 3 + 1, + 7 + 1, + 0x4000, + 0x800, + 4, + g_se_alg_zblock_default_route1_reg, + NULL, + NULL, + }, + { + "zblock_default_route2", + SE_ALG_ZBLOCK_DEFAULT_ROUTE2r, + SE, + DPP_REG_FLAG_INDIRECT, + DPP_REG_BIN_ARRAY, + 0x10007, + (512/8), + 3 + 1, + 7 + 1, + 0x4000, + 0x800, + 4, + g_se_alg_zblock_default_route2_reg, + NULL, + NULL, + }, + { + "zblock_default_route3", + SE_ALG_ZBLOCK_DEFAULT_ROUTE3r, + SE, + DPP_REG_FLAG_INDIRECT, + DPP_REG_BIN_ARRAY, + 0x10008, + (512/8), + 3 + 1, + 7 + 1, + 0x4000, + 0x800, + 4, + g_se_alg_zblock_default_route3_reg, + NULL, + NULL, + }, + { + "zblock_default_route4", + SE_ALG_ZBLOCK_DEFAULT_ROUTE4r, + SE, + DPP_REG_FLAG_INDIRECT, + DPP_REG_BIN_ARRAY, + 0x10009, + (512/8), + 3 + 1, + 7 + 1, + 0x4000, + 0x800, + 4, + g_se_alg_zblock_default_route4_reg, + NULL, + NULL, + }, + { + "zblock_default_route5", + SE_ALG_ZBLOCK_DEFAULT_ROUTE5r, + SE, + DPP_REG_FLAG_INDIRECT, + DPP_REG_BIN_ARRAY, + 0x1000a, + (512/8), + 3 + 1, + 7 + 1, + 0x4000, + 0x800, + 4, + g_se_alg_zblock_default_route5_reg, + NULL, + NULL, + }, + { + "zblock_default_route6", + SE_ALG_ZBLOCK_DEFAULT_ROUTE6r, + SE, + DPP_REG_FLAG_INDIRECT, + DPP_REG_BIN_ARRAY, + 0x1000b, + (512/8), + 3 + 1, + 7 + 1, + 0x4000, + 0x800, + 4, + g_se_alg_zblock_default_route6_reg, + NULL, + NULL, + }, + { + "zblock_default_route7", + SE_ALG_ZBLOCK_DEFAULT_ROUTE7r, + SE, + DPP_REG_FLAG_INDIRECT, + DPP_REG_BIN_ARRAY, + 0x1000c, + (512/8), + 3 + 1, + 7 + 1, + 0x4000, + 0x800, + 4, + g_se_alg_zblock_default_route7_reg, + NULL, + NULL, + }, + { + "zblock_hash_listtable_item0", + SE_ALG_ZBLOCK_HASH_LISTTABLE_ITEM0r, + SE, + DPP_REG_FLAG_INDIRECT, + DPP_REG_BIN_ARRAY, + 0x1000d, + (512/8), + 3 + 1, + 7 + 1, + 0x4000, + 0x800, + 1, + g_se_alg_zblock_hash_listtable_item0_reg, + NULL, + NULL, + }, + { + "zblock_hash_listtable_item1", + SE_ALG_ZBLOCK_HASH_LISTTABLE_ITEM1r, + SE, + DPP_REG_FLAG_INDIRECT, + DPP_REG_BIN_ARRAY, + 0x1000e, + (512/8), + 3 + 1, + 7 + 1, + 0x4000, + 0x800, + 1, + g_se_alg_zblock_hash_listtable_item1_reg, + NULL, + NULL, + }, + { + "zblock_hash_listtable_item2", + SE_ALG_ZBLOCK_HASH_LISTTABLE_ITEM2r, + SE, + DPP_REG_FLAG_INDIRECT, + DPP_REG_BIN_ARRAY, + 0x1000f, + (512/8), + 3 + 1, + 7 + 1, + 0x4000, + 0x800, + 1, + g_se_alg_zblock_hash_listtable_item2_reg, + NULL, + NULL, + }, + { + "zblock_hash_listtable_item3", + SE_ALG_ZBLOCK_HASH_LISTTABLE_ITEM3r, + SE, + DPP_REG_FLAG_INDIRECT, + DPP_REG_BIN_ARRAY, + 0x10010, + (512/8), + 3 + 1, + 7 + 1, + 0x4000, + 0x800, + 1, + g_se_alg_zblock_hash_listtable_item3_reg, + NULL, + NULL, + }, + { + "zblock_ecc_err_status", + SE_ALG_ZBLOCK_ECC_ERR_STATUSr, + SE, + DPP_REG_FLAG_INDIRECT, + DPP_REG_BIN_ARRAY, + 0x10011, + (512/8), + 3 + 1, + 7 + 1, + 0x4000, + 0x800, + 4, + g_se_alg_zblock_ecc_err_status_reg, + NULL, + NULL, + }, + { + "zblock_lpm_v6_sram_cmp", + SE_ALG_ZBLOCK_LPM_V6_SRAM_CMPr, + SE, + DPP_REG_FLAG_INDIRECT, + DPP_REG_BIN_ARRAY, + 0x10012, + (512/8), + 3 + 1, + 7 + 1, + 0x4000, + 0x800, + 1, + g_se_alg_zblock_lpm_v6_sram_cmp_reg, + NULL, + NULL, + }, + { + "zblock_lpm_v4_sram_cmp", + SE_ALG_ZBLOCK_LPM_V4_SRAM_CMPr, + SE, + DPP_REG_FLAG_INDIRECT, + DPP_REG_BIN_ARRAY, + 0x10013, + (512/8), + 3 + 1, + 5 + 1, + 0x4000, + 0x800, + 1, + g_se_alg_zblock_lpm_v4_sram_cmp_reg, + NULL, + NULL, + }, + { + "kschd_pful_cfg", + SE_PARSER_KSCHD_PFUL_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_PARSER_BASE_ADDR + 0x00000000, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se_parser_kschd_pful_cfg_reg, + NULL, + NULL, + }, + { + "debug_cnt_mode", + SE_PARSER_DEBUG_CNT_MODEr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_PARSER_BASE_ADDR + 0x00000004, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se_parser_debug_cnt_mode_reg, + NULL, + NULL, + }, + { + "parser_int_en", + SE_PARSER_PARSER_INT_ENr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_PARSER_BASE_ADDR + 0x0000000c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_parser_parser_int_en_reg, + NULL, + NULL, + }, + { + "parser_int_mask", + SE_PARSER_PARSER_INT_MASKr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_PARSER_BASE_ADDR + 0x00000010, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_parser_parser_int_mask_reg, + NULL, + NULL, + }, + { + "parser_int_status", + SE_PARSER_PARSER_INT_STATUSr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_PARSER_BASE_ADDR + 0x00000014, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_parser_parser_int_status_reg, + NULL, + NULL, + }, + { + "parser_int_unmask_flag", + SE_PARSER_PARSER_INT_UNMASK_FLAGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_PARSER_BASE_ADDR + 0x00000018, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_parser_parser_int_unmask_flag_reg, + NULL, + NULL, + }, + { + "ecc_bypass_read", + SE_PARSER_ECC_BYPASS_READr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_PARSER_BASE_ADDR + 0x0000001c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_parser_ecc_bypass_read_reg, + NULL, + NULL, + }, + { + "mex0_5_req_cnt", + SE_PARSER_MEX0_5_REQ_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_PARSER_BASE_ADDR + 0x00000400, + (32/8), + 0, + 5 + 1, + 0, + 4, + 1, + g_se_parser_mex0_5_req_cnt_reg, + NULL, + NULL, + }, + { + "kschd_req0_5_cnt", + SE_PARSER_KSCHD_REQ0_5_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_PARSER_BASE_ADDR + 0x00000420, + (32/8), + 0, + 5 + 1, + 0, + 4, + 1, + g_se_parser_kschd_req0_5_cnt_reg, + NULL, + NULL, + }, + { + "kschd_parser_fc0_5_cnt", + SE_PARSER_KSCHD_PARSER_FC0_5_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_PARSER_BASE_ADDR + 0x00000440, + (32/8), + 0, + 5 + 1, + 0, + 4, + 1, + g_se_parser_kschd_parser_fc0_5_cnt_reg, + NULL, + NULL, + }, + { + "se_ppu_mex0_5_fc_cnt", + SE_PARSER_SE_PPU_MEX0_5_FC_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_PARSER_BASE_ADDR + 0x00000460, + (32/8), + 0, + 5 + 1, + 0, + 4, + 1, + g_se_parser_se_ppu_mex0_5_fc_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_marc_fc_cnt", + SE_PARSER_SMMU0_MARC_FC_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_PARSER_BASE_ADDR + 0x00000480, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_parser_smmu0_marc_fc_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_marc_key_cnt", + SE_PARSER_SMMU0_MARC_KEY_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_PARSER_BASE_ADDR + 0x00000484, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_parser_smmu0_marc_key_cnt_reg, + NULL, + NULL, + }, + { + "cmmu_key_cnt", + SE_PARSER_CMMU_KEY_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_PARSER_BASE_ADDR + 0x00000488, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_parser_cmmu_key_cnt_reg, + NULL, + NULL, + }, + { + "cmmu_parser_fc_cnt", + SE_PARSER_CMMU_PARSER_FC_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_PARSER_BASE_ADDR + 0x0000048c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_parser_cmmu_parser_fc_cnt_reg, + NULL, + NULL, + }, + { + "marc_tab_type_err_mex0_5_cnt", + SE_PARSER_MARC_TAB_TYPE_ERR_MEX0_5_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_PARSER_BASE_ADDR + 0x00000490, + (32/8), + 0, + 5 + 1, + 0, + 4, + 1, + g_se_parser_marc_tab_type_err_mex0_5_cnt_reg, + NULL, + NULL, + }, + { + "eram_fulladdr_drop_cnt", + SE_PARSER_ERAM_FULLADDR_DROP_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_PARSER_BASE_ADDR + 0x000004b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_parser_eram_fulladdr_drop_cnt_reg, + NULL, + NULL, + }, + { + "hash0_pful_cfg", + SE_AS_HASH0_PFUL_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000001c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_hash0_pful_cfg_reg, + NULL, + NULL, + }, + { + "hash1_pful_cfg", + SE_AS_HASH1_PFUL_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000001c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_hash1_pful_cfg_reg, + NULL, + NULL, + }, + { + "hash2_pful_cfg", + SE_AS_HASH2_PFUL_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000001c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_hash2_pful_cfg_reg, + NULL, + NULL, + }, + { + "hash3_pful_cfg", + SE_AS_HASH3_PFUL_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000001cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_hash3_pful_cfg_reg, + NULL, + NULL, + }, + { + "pbu_pful_cfg", + SE_AS_PBU_PFUL_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000001d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_pbu_pful_cfg_reg, + NULL, + NULL, + }, + { + "lpm_pful_cfg", + SE_AS_LPM_PFUL_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000001d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_lpm_pful_cfg_reg, + NULL, + NULL, + }, + { + "etcam_pful_cfg", + SE_AS_ETCAM_PFUL_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000001dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_etcam_pful_cfg_reg, + NULL, + NULL, + }, + { + "as_learn0_fifo_cfg", + SE_AS_AS_LEARN0_FIFO_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000001e0, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_se_as_as_learn0_fifo_cfg_reg, + NULL, + NULL, + }, + { + "as_learn1_fifo_cfg", + SE_AS_AS_LEARN1_FIFO_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000001e4, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_se_as_as_learn1_fifo_cfg_reg, + NULL, + NULL, + }, + { + "as_dma_fifo_cfg", + SE_AS_AS_DMA_FIFO_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000001e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_as_dma_fifo_cfg_reg, + NULL, + NULL, + }, + { + "age_pful_cfg", + SE_AS_AGE_PFUL_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000001ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_age_pful_cfg_reg, + NULL, + NULL, + }, + { + "etcam_rsp_cfg", + SE_AS_ETCAM_RSP_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000001f4, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_se_as_etcam_rsp_cfg_reg, + NULL, + NULL, + }, + { + "pbu_ecc_bypass_read", + SE_AS_PBU_ECC_BYPASS_READr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000001fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_pbu_ecc_bypass_read_reg, + NULL, + NULL, + }, + { + "etcam0_ecc_bypass_read", + SE_AS_ETCAM0_ECC_BYPASS_READr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x00000200, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_etcam0_ecc_bypass_read_reg, + NULL, + NULL, + }, + { + "etcam1_ecc_bypass_read", + SE_AS_ETCAM1_ECC_BYPASS_READr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x00000204, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_etcam1_ecc_bypass_read_reg, + NULL, + NULL, + }, + { + "lpm_ecc_bypass_read", + SE_AS_LPM_ECC_BYPASS_READr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x00000208, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_lpm_ecc_bypass_read_reg, + NULL, + NULL, + }, + { + "hash_ecc_bypass_read", + SE_AS_HASH_ECC_BYPASS_READr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x0000020c, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_se_as_hash_ecc_bypass_read_reg, + NULL, + NULL, + }, + { + "hash_learn_ecc_bypass_read", + SE_AS_HASH_LEARN_ECC_BYPASS_READr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x00000210, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_hash_learn_ecc_bypass_read_reg, + NULL, + NULL, + }, + { + "debug_cnt_mode", + SE_AS_DEBUG_CNT_MODEr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000003e8, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se_as_debug_cnt_mode_reg, + NULL, + NULL, + }, + { + "as_int_0_en", + SE_AS_AS_INT_0_ENr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x00000440, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_as_int_0_en_reg, + NULL, + NULL, + }, + { + "as_int_0_mask", + SE_AS_AS_INT_0_MASKr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x00000444, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_as_int_0_mask_reg, + NULL, + NULL, + }, + { + "as_int_1_en", + SE_AS_AS_INT_1_ENr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x00000448, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_as_int_1_en_reg, + NULL, + NULL, + }, + { + "as_int_1_mask", + SE_AS_AS_INT_1_MASKr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x0000044c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_as_int_1_mask_reg, + NULL, + NULL, + }, + { + "as_int_2_en", + SE_AS_AS_INT_2_ENr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x00000450, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_as_int_2_en_reg, + NULL, + NULL, + }, + { + "as_int_2_mask", + SE_AS_AS_INT_2_MASKr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x00000454, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_as_int_2_mask_reg, + NULL, + NULL, + }, + { + "as_int_0_status", + SE_AS_AS_INT_0_STATUSr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x00000458, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_as_int_0_status_reg, + NULL, + NULL, + }, + { + "as_int_1_status", + SE_AS_AS_INT_1_STATUSr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x0000045c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_as_int_1_status_reg, + NULL, + NULL, + }, + { + "as_int_2_status", + SE_AS_AS_INT_2_STATUSr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x00000460, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_as_int_2_status_reg, + NULL, + NULL, + }, + { + "se_as_int_status", + SE_AS_SE_AS_INT_STATUSr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x00000464, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_se_as_se_as_int_status_reg, + NULL, + NULL, + }, + { + "hash0_3_wr_req_cnt", + SE_AS_HASH0_3_WR_REQ_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x0000082c, + (32/8), + 0, + 3 + 1, + 0, + 4, + 1, + g_se_as_hash0_3_wr_req_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_etcam0_1_fc_cnt", + SE_AS_SMMU0_ETCAM0_1_FC_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x0000083c, + (32/8), + 0, + 0 + 1, + 0, + 4, + 1, + g_se_as_smmu0_etcam0_1_fc_cnt_reg, + NULL, + NULL, + }, + { + "etcam0_1_smmu0_req_cnt", + SE_AS_ETCAM0_1_SMMU0_REQ_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x00000844, + (32/8), + 0, + 0 + 1, + 0, + 8, + 1, + g_se_as_etcam0_1_smmu0_req_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_etcam0_1_rsp_cnt", + SE_AS_SMMU0_ETCAM0_1_RSP_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x00000848, + (32/8), + 0, + 0 + 1, + 0, + 8, + 1, + g_se_as_smmu0_etcam0_1_rsp_cnt_reg, + NULL, + NULL, + }, + { + "as_hla_hash_p0_3_key_cnt", + SE_AS_AS_HLA_HASH_P0_3_KEY_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x00000854, + (32/8), + 0, + 3 + 1, + 0, + 4, + 1, + g_se_as_as_hla_hash_p0_3_key_cnt_reg, + NULL, + NULL, + }, + { + "as_hla_lpm_p0_key_cnt", + SE_AS_AS_HLA_LPM_P0_KEY_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x00000864, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_as_hla_lpm_p0_key_cnt_reg, + NULL, + NULL, + }, + { + "alg_as_hash_p0_3_rsp_cnt", + SE_AS_ALG_AS_HASH_P0_3_RSP_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x00000868, + (32/8), + 0, + 3 + 1, + 0, + 8, + 1, + g_se_as_alg_as_hash_p0_3_rsp_cnt_reg, + NULL, + NULL, + }, + { + "alg_as_hash_p0_3_smf_rsp_cnt", + SE_AS_ALG_AS_HASH_P0_3_SMF_RSP_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x0000086c, + (32/8), + 0, + 3 + 1, + 0, + 8, + 1, + g_se_as_alg_as_hash_p0_3_smf_rsp_cnt_reg, + NULL, + NULL, + }, + { + "alg_as_lpm_p0_rsp_cnt", + SE_AS_ALG_AS_LPM_P0_RSP_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x00000888, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_alg_as_lpm_p0_rsp_cnt_reg, + NULL, + NULL, + }, + { + "alg_as_lpm_p0_3_smf_rsp_cnt", + SE_AS_ALG_AS_LPM_P0_3_SMF_RSP_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x0000088c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_alg_as_lpm_p0_3_smf_rsp_cnt_reg, + NULL, + NULL, + }, + { + "as_pbu_key_cnt", + SE_AS_AS_PBU_KEY_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x00000890, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_as_pbu_key_cnt_reg, + NULL, + NULL, + }, + { + "pbu_se_dpi_rsp_dat_cnt", + SE_AS_PBU_SE_DPI_RSP_DAT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x00000894, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_pbu_se_dpi_rsp_dat_cnt_reg, + NULL, + NULL, + }, + { + "as_etcam_ctrl_req0_cnt", + SE_AS_AS_ETCAM_CTRL_REQ0_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x00000898, + (32/8), + 0, + 0 + 1, + 0, + 4, + 1, + g_se_as_as_etcam_ctrl_req0_cnt_reg, + NULL, + NULL, + }, + { + "etcam_ctrl_as_index0_1_cnt", + SE_AS_ETCAM_CTRL_AS_INDEX0_1_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000008a0, + (32/8), + 0, + 0 + 1, + 0, + 8, + 1, + g_se_as_etcam_ctrl_as_index0_1_cnt_reg, + NULL, + NULL, + }, + { + "etcam_ctrl_as_hit0_1_cnt", + SE_AS_ETCAM_CTRL_AS_HIT0_1_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000008a4, + (32/8), + 0, + 0 + 1, + 0, + 8, + 1, + g_se_as_etcam_ctrl_as_hit0_1_cnt_reg, + NULL, + NULL, + }, + { + "as_smmu0_req_cnt", + SE_AS_AS_SMMU0_REQ_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000008b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_as_smmu0_req_cnt_reg, + NULL, + NULL, + }, + { + "learn_hla_wr_cnt", + SE_AS_LEARN_HLA_WR_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000008b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_learn_hla_wr_cnt_reg, + NULL, + NULL, + }, + { + "as_smmu1_req_cnt", + SE_AS_AS_SMMU1_REQ_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000008b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_as_smmu1_req_cnt_reg, + NULL, + NULL, + }, + { + "se_cfg_mac_dat_cnt", + SE_AS_SE_CFG_MAC_DAT_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000008bc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_se_cfg_mac_dat_cnt_reg, + NULL, + NULL, + }, + { + "alg_as_hash_p0_3_fc_cnt", + SE_AS_ALG_AS_HASH_P0_3_FC_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000008c0, + (32/8), + 0, + 3 + 1, + 0, + 4, + 1, + g_se_as_alg_as_hash_p0_3_fc_cnt_reg, + NULL, + NULL, + }, + { + "alg_as_lpm_p0_fc_cnt", + SE_AS_ALG_AS_LPM_P0_FC_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000008d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_alg_as_lpm_p0_fc_cnt_reg, + NULL, + NULL, + }, + { + "as_alg_hash_p0_3_fc_cnt", + SE_AS_AS_ALG_HASH_P0_3_FC_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000008d4, + (32/8), + 0, + 3 + 1, + 0, + 4, + 1, + g_se_as_as_alg_hash_p0_3_fc_cnt_reg, + NULL, + NULL, + }, + { + "as_alg_lpm_p0_fc_cnt", + SE_AS_AS_ALG_LPM_P0_FC_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000008e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_as_alg_lpm_p0_fc_cnt_reg, + NULL, + NULL, + }, + { + "as_pbu_fc_cnt", + SE_AS_AS_PBU_FC_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000008e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_as_pbu_fc_cnt_reg, + NULL, + NULL, + }, + { + "pbu_se_dpi_key_fc_cnt", + SE_AS_PBU_SE_DPI_KEY_FC_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000008ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_pbu_se_dpi_key_fc_cnt_reg, + NULL, + NULL, + }, + { + "as_etcam_ctrl_fc0_1_cnt", + SE_AS_AS_ETCAM_CTRL_FC0_1_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000008f0, + (32/8), + 0, + 0 + 1, + 0, + 4, + 1, + g_se_as_as_etcam_ctrl_fc0_1_cnt_reg, + NULL, + NULL, + }, + { + "etcam_ctrl_as_fc0_1_cnt", + SE_AS_ETCAM_CTRL_AS_FC0_1_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x000008f8, + (32/8), + 0, + 0 + 1, + 0, + 4, + 1, + g_se_as_etcam_ctrl_as_fc0_1_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_as_mac_age_fc_cnt", + SE_AS_SMMU0_AS_MAC_AGE_FC_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x00000900, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_smmu0_as_mac_age_fc_cnt_reg, + NULL, + NULL, + }, + { + "alg_learn_fc_cnt", + SE_AS_ALG_LEARN_FC_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x00000904, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_alg_learn_fc_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_as_fc_cnt", + SE_AS_SMMU1_AS_FC_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x00000908, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_smmu1_as_fc_cnt_reg, + NULL, + NULL, + }, + { + "cfg_se_mac_fc_cnt", + SE_AS_CFG_SE_MAC_FC_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_AS_BASE_ADDR + 0x0000090c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_as_cfg_se_mac_fc_cnt_reg, + NULL, + NULL, + }, + { + "kschd_cpu_rdy", + SE_KSCHD_KSCHD_CPU_RDYr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x00000018, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_kschd_cpu_rdy_reg, + NULL, + NULL, + }, + { + "ppu0_ecc_bypass_read", + SE_KSCHD_PPU0_ECC_BYPASS_READr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x00000024, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_ppu0_ecc_bypass_read_reg, + NULL, + NULL, + }, + { + "pbu_ecc_bypass_read", + SE_KSCHD_PBU_ECC_BYPASS_READr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x00000028, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_pbu_ecc_bypass_read_reg, + NULL, + NULL, + }, + { + "smmu1_ecc_bypass_read", + SE_KSCHD_SMMU1_ECC_BYPASS_READr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x0000002c, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_se_kschd_smmu1_ecc_bypass_read_reg, + NULL, + NULL, + }, + { + "ass_ecc_bypass_read", + SE_KSCHD_ASS_ECC_BYPASS_READr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x00000030, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_ass_ecc_bypass_read_reg, + NULL, + NULL, + }, + { + "sdt_h", + SE_KSCHD_SDT_Hr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x00000040, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_sdt_h_reg, + NULL, + NULL, + }, + { + "sdt_l", + SE_KSCHD_SDT_Lr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x00000044, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_sdt_l_reg, + NULL, + NULL, + }, + { + "hash_key15", + SE_KSCHD_HASH_KEY15r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x00000048, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_se_kschd_hash_key15_reg, + NULL, + NULL, + }, + { + "hash_key14", + SE_KSCHD_HASH_KEY14r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x0000004c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_hash_key14_reg, + NULL, + NULL, + }, + { + "hash_key13", + SE_KSCHD_HASH_KEY13r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x00000050, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_hash_key13_reg, + NULL, + NULL, + }, + { + "hash_key12", + SE_KSCHD_HASH_KEY12r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x00000054, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_hash_key12_reg, + NULL, + NULL, + }, + { + "hash_key11", + SE_KSCHD_HASH_KEY11r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x00000058, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_hash_key11_reg, + NULL, + NULL, + }, + { + "hash_key10", + SE_KSCHD_HASH_KEY10r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x0000005c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_hash_key10_reg, + NULL, + NULL, + }, + { + "hash_key9", + SE_KSCHD_HASH_KEY9r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x00000060, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_hash_key9_reg, + NULL, + NULL, + }, + { + "hash_key8", + SE_KSCHD_HASH_KEY8r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x00000064, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_hash_key8_reg, + NULL, + NULL, + }, + { + "hash_key7", + SE_KSCHD_HASH_KEY7r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x00000068, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_hash_key7_reg, + NULL, + NULL, + }, + { + "hash_key6", + SE_KSCHD_HASH_KEY6r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x0000006c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_hash_key6_reg, + NULL, + NULL, + }, + { + "hash_key5", + SE_KSCHD_HASH_KEY5r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x00000070, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_hash_key5_reg, + NULL, + NULL, + }, + { + "hash_key4", + SE_KSCHD_HASH_KEY4r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x00000074, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_hash_key4_reg, + NULL, + NULL, + }, + { + "hash_key3", + SE_KSCHD_HASH_KEY3r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x00000078, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_hash_key3_reg, + NULL, + NULL, + }, + { + "hash_key2", + SE_KSCHD_HASH_KEY2r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x0000007c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_hash_key2_reg, + NULL, + NULL, + }, + { + "hash_key1", + SE_KSCHD_HASH_KEY1r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x00000080, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_hash_key1_reg, + NULL, + NULL, + }, + { + "hash_key0", + SE_KSCHD_HASH_KEY0r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x00000084, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_hash_key0_reg, + NULL, + NULL, + }, + { + "schd_int_0_en", + SE_KSCHD_SCHD_INT_0_ENr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000000c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_schd_int_0_en_reg, + NULL, + NULL, + }, + { + "schd_int_0_mask", + SE_KSCHD_SCHD_INT_0_MASKr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000000c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_schd_int_0_mask_reg, + NULL, + NULL, + }, + { + "schd_int_1_en", + SE_KSCHD_SCHD_INT_1_ENr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000000c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_schd_int_1_en_reg, + NULL, + NULL, + }, + { + "schd_int_1_mask", + SE_KSCHD_SCHD_INT_1_MASKr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000000cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_schd_int_1_mask_reg, + NULL, + NULL, + }, + { + "schd_int_2_en", + SE_KSCHD_SCHD_INT_2_ENr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000000d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_schd_int_2_en_reg, + NULL, + NULL, + }, + { + "schd_int_2_mask", + SE_KSCHD_SCHD_INT_2_MASKr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000000d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_schd_int_2_mask_reg, + NULL, + NULL, + }, + { + "schd_int_3_en", + SE_KSCHD_SCHD_INT_3_ENr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000000d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_schd_int_3_en_reg, + NULL, + NULL, + }, + { + "schd_int_3_mask", + SE_KSCHD_SCHD_INT_3_MASKr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000000dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_schd_int_3_mask_reg, + NULL, + NULL, + }, + { + "schd_int_4_en", + SE_KSCHD_SCHD_INT_4_ENr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000000e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_schd_int_4_en_reg, + NULL, + NULL, + }, + { + "schd_int_4_mask", + SE_KSCHD_SCHD_INT_4_MASKr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000000e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_schd_int_4_mask_reg, + NULL, + NULL, + }, + { + "schd_int_0_status", + SE_KSCHD_SCHD_INT_0_STATUSr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000000e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_schd_int_0_status_reg, + NULL, + NULL, + }, + { + "schd_int_1_status", + SE_KSCHD_SCHD_INT_1_STATUSr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000000ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_schd_int_1_status_reg, + NULL, + NULL, + }, + { + "schd_int_2_status", + SE_KSCHD_SCHD_INT_2_STATUSr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000000f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_schd_int_2_status_reg, + NULL, + NULL, + }, + { + "schd_int_3_status", + SE_KSCHD_SCHD_INT_3_STATUSr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000000f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_schd_int_3_status_reg, + NULL, + NULL, + }, + { + "schd_int_4_status", + SE_KSCHD_SCHD_INT_4_STATUSr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000000f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_schd_int_4_status_reg, + NULL, + NULL, + }, + { + "se_kschd_int_status", + SE_KSCHD_SE_KSCHD_INT_STATUSr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x00000148, + (32/8), + 0, + 0, + 0, + 0, + 5, + g_se_kschd_se_kschd_int_status_reg, + NULL, + NULL, + }, + { + "debug_cnt_mode", + SE_KSCHD_DEBUG_CNT_MODEr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000003ec, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se_kschd_debug_cnt_mode_reg, + NULL, + NULL, + }, + { + "se_parser_kschd_key0_3_cnt", + SE_KSCHD_SE_PARSER_KSCHD_KEY0_3_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x00000878, + (32/8), + 0, + 5 + 1, + 0, + 4, + 1, + g_se_kschd_se_parser_kschd_key0_3_cnt_reg, + NULL, + NULL, + }, + { + "se_smmu1_key0_3_cnt", + SE_KSCHD_SE_SMMU1_KEY0_3_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x00000890, + (32/8), + 0, + 3 + 1, + 0, + 4, + 1, + g_se_kschd_se_smmu1_key0_3_cnt_reg, + NULL, + NULL, + }, + { + "kschd_as_key0_cnt", + SE_KSCHD_KSCHD_AS_KEY0_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000008a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_kschd_as_key0_cnt_reg, + NULL, + NULL, + }, + { + "kschd_as_key1_cnt", + SE_KSCHD_KSCHD_AS_KEY1_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000008a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_kschd_as_key1_cnt_reg, + NULL, + NULL, + }, + { + "kschd_as_key2_cnt", + SE_KSCHD_KSCHD_AS_KEY2_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000008a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_kschd_as_key2_cnt_reg, + NULL, + NULL, + }, + { + "kschd_as_key3_cnt", + SE_KSCHD_KSCHD_AS_KEY3_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000008ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_kschd_as_key3_cnt_reg, + NULL, + NULL, + }, + { + "kschd_as_key4_cnt", + SE_KSCHD_KSCHD_AS_KEY4_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000008b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_kschd_as_key4_cnt_reg, + NULL, + NULL, + }, + { + "kschd_as_key5_cnt", + SE_KSCHD_KSCHD_AS_KEY5_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000008b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_kschd_as_key5_cnt_reg, + NULL, + NULL, + }, + { + "kschd_as_key6_cnt", + SE_KSCHD_KSCHD_AS_KEY6_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000008b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_kschd_as_key6_cnt_reg, + NULL, + NULL, + }, + { + "kschd_as_key9_cnt", + SE_KSCHD_KSCHD_AS_KEY9_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000008bc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_kschd_as_key9_cnt_reg, + NULL, + NULL, + }, + { + "kschd_se_parser_fc0_3_cnt", + SE_KSCHD_KSCHD_SE_PARSER_FC0_3_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000008c0, + (32/8), + 0, + 5 + 1, + 0, + 4, + 1, + g_se_kschd_kschd_se_parser_fc0_3_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_se_fc0_3_cnt", + SE_KSCHD_SMMU1_SE_FC0_3_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000008d8, + (32/8), + 0, + 3 + 1, + 0, + 4, + 1, + g_se_kschd_smmu1_se_fc0_3_cnt_reg, + NULL, + NULL, + }, + { + "as_kschd_fc_cnt0", + SE_KSCHD_AS_KSCHD_FC_CNT0r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000008e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_as_kschd_fc_cnt0_reg, + NULL, + NULL, + }, + { + "as_kschd_fc_cnt1", + SE_KSCHD_AS_KSCHD_FC_CNT1r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000008ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_as_kschd_fc_cnt1_reg, + NULL, + NULL, + }, + { + "as_kschd_fc_cnt2", + SE_KSCHD_AS_KSCHD_FC_CNT2r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000008f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_as_kschd_fc_cnt2_reg, + NULL, + NULL, + }, + { + "as_kschd_fc_cnt3", + SE_KSCHD_AS_KSCHD_FC_CNT3r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000008f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_as_kschd_fc_cnt3_reg, + NULL, + NULL, + }, + { + "as_kschd_fc_cnt4", + SE_KSCHD_AS_KSCHD_FC_CNT4r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000008f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_as_kschd_fc_cnt4_reg, + NULL, + NULL, + }, + { + "as_kschd_fc_cnt5", + SE_KSCHD_AS_KSCHD_FC_CNT5r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x000008fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_as_kschd_fc_cnt5_reg, + NULL, + NULL, + }, + { + "as_kschd_fc_cnt6", + SE_KSCHD_AS_KSCHD_FC_CNT6r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x00000900, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_as_kschd_fc_cnt6_reg, + NULL, + NULL, + }, + { + "as_kschd_fc_cnt9", + SE_KSCHD_AS_KSCHD_FC_CNT9r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_KSCHD_BASE_ADDR + 0x00000904, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_kschd_as_kschd_fc_cnt9_reg, + NULL, + NULL, + }, + { + "rschd_hash_pful_cfg", + SE_RSCHD_RSCHD_HASH_PFUL_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x00000008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_rschd_hash_pful_cfg_reg, + NULL, + NULL, + }, + { + "rschd_hash_ept_cfg", + SE_RSCHD_RSCHD_HASH_EPT_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x0000000c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_rschd_hash_ept_cfg_reg, + NULL, + NULL, + }, + { + "rschd_pbu_pful_cfg", + SE_RSCHD_RSCHD_PBU_PFUL_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x00000010, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_rschd_pbu_pful_cfg_reg, + NULL, + NULL, + }, + { + "rschd_pbu_ept_cfg", + SE_RSCHD_RSCHD_PBU_EPT_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x00000014, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_rschd_pbu_ept_cfg_reg, + NULL, + NULL, + }, + { + "rschd_lpm_pful_cfg", + SE_RSCHD_RSCHD_LPM_PFUL_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x00000018, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_rschd_lpm_pful_cfg_reg, + NULL, + NULL, + }, + { + "rschd_lpm_ept_cfg", + SE_RSCHD_RSCHD_LPM_EPT_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x0000001c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_rschd_lpm_ept_cfg_reg, + NULL, + NULL, + }, + { + "rschd_etcam_pful_cfg", + SE_RSCHD_RSCHD_ETCAM_PFUL_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x00000020, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_rschd_etcam_pful_cfg_reg, + NULL, + NULL, + }, + { + "rschd_etcam_ept_cfg", + SE_RSCHD_RSCHD_ETCAM_EPT_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x00000024, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_rschd_etcam_ept_cfg_reg, + NULL, + NULL, + }, + { + "smmu0_wb_pful_cfg", + SE_RSCHD_SMMU0_WB_PFUL_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x00000040, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_smmu0_wb_pful_cfg_reg, + NULL, + NULL, + }, + { + "smmu0_wb_ept_cfg", + SE_RSCHD_SMMU0_WB_EPT_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x00000044, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_smmu0_wb_ept_cfg_reg, + NULL, + NULL, + }, + { + "smmu1_wb_pful_cfg", + SE_RSCHD_SMMU1_WB_PFUL_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x00000048, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_smmu1_wb_pful_cfg_reg, + NULL, + NULL, + }, + { + "smmu1_wb_ept_cfg", + SE_RSCHD_SMMU1_WB_EPT_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x0000004c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_smmu1_wb_ept_cfg_reg, + NULL, + NULL, + }, + { + "alg_wb_pful_cfg", + SE_RSCHD_ALG_WB_PFUL_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x00000050, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_alg_wb_pful_cfg_reg, + NULL, + NULL, + }, + { + "alg_wb_ept_cfg", + SE_RSCHD_ALG_WB_EPT_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x00000054, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_alg_wb_ept_cfg_reg, + NULL, + NULL, + }, + { + "wr_rsp_vld_en", + SE_RSCHD_WR_RSP_VLD_ENr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x00000058, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_wr_rsp_vld_en_reg, + NULL, + NULL, + }, + { + "nppu_wb_pful_cfg", + SE_RSCHD_NPPU_WB_PFUL_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x0000005c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_nppu_wb_pful_cfg_reg, + NULL, + NULL, + }, + { + "nppu_wb_ept_cfg", + SE_RSCHD_NPPU_WB_EPT_CFGr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x00000060, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_nppu_wb_ept_cfg_reg, + NULL, + NULL, + }, + { + "port0_int_en", + SE_RSCHD_PORT0_INT_ENr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x000000c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_port0_int_en_reg, + NULL, + NULL, + }, + { + "port0_int_mask", + SE_RSCHD_PORT0_INT_MASKr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x000000c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_port0_int_mask_reg, + NULL, + NULL, + }, + { + "port1_int_en", + SE_RSCHD_PORT1_INT_ENr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x000000c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_port1_int_en_reg, + NULL, + NULL, + }, + { + "port1_int_mask", + SE_RSCHD_PORT1_INT_MASKr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x000000cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_port1_int_mask_reg, + NULL, + NULL, + }, + { + "port0_int_status", + SE_RSCHD_PORT0_INT_STATUSr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x000000d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_port0_int_status_reg, + NULL, + NULL, + }, + { + "port1_int_status", + SE_RSCHD_PORT1_INT_STATUSr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x000000d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_port1_int_status_reg, + NULL, + NULL, + }, + { + "se_rschd_int_status", + SE_RSCHD_SE_RSCHD_INT_STATUSr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x0000018c, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se_rschd_se_rschd_int_status_reg, + NULL, + NULL, + }, + { + "debug_cnt_mode", + SE_RSCHD_DEBUG_CNT_MODEr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x000003ec, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se_rschd_debug_cnt_mode_reg, + NULL, + NULL, + }, + { + "se_ppu_mex0_5_rsp1_cnt", + SE_RSCHD_SE_PPU_MEX0_5_RSP1_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x00000880, + (32/8), + 0, + 5 + 1, + 0, + 4, + 1, + g_se_rschd_se_ppu_mex0_5_rsp1_cnt_reg, + NULL, + NULL, + }, + { + "as_rschd_rsp0_cnt", + SE_RSCHD_AS_RSCHD_RSP0_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x00000898, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_as_rschd_rsp0_cnt_reg, + NULL, + NULL, + }, + { + "as_rschd_rsp1_cnt", + SE_RSCHD_AS_RSCHD_RSP1_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x0000089c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_as_rschd_rsp1_cnt_reg, + NULL, + NULL, + }, + { + "as_rschd_rsp2_cnt", + SE_RSCHD_AS_RSCHD_RSP2_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x000008a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_as_rschd_rsp2_cnt_reg, + NULL, + NULL, + }, + { + "as_rschd_rsp3_cnt", + SE_RSCHD_AS_RSCHD_RSP3_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x000008a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_as_rschd_rsp3_cnt_reg, + NULL, + NULL, + }, + { + "as_rschd_rsp4_cnt", + SE_RSCHD_AS_RSCHD_RSP4_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x000008a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_as_rschd_rsp4_cnt_reg, + NULL, + NULL, + }, + { + "as_rschd_rsp5_cnt", + SE_RSCHD_AS_RSCHD_RSP5_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x000008ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_as_rschd_rsp5_cnt_reg, + NULL, + NULL, + }, + { + "as_rschd_rsp6_cnt", + SE_RSCHD_AS_RSCHD_RSP6_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x000008b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_as_rschd_rsp6_cnt_reg, + NULL, + NULL, + }, + { + "as_rschd_rsp9_cnt", + SE_RSCHD_AS_RSCHD_RSP9_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x000008b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_as_rschd_rsp9_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_se_rsp0_3_cnt", + SE_RSCHD_SMMU1_SE_RSP0_3_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x000008b8, + (32/8), + 0, + 3 + 1, + 0, + 4, + 1, + g_se_rschd_smmu1_se_rsp0_3_cnt_reg, + NULL, + NULL, + }, + { + "ppu_se_mex0_3_fc_cnt", + SE_RSCHD_PPU_SE_MEX0_3_FC_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x000008c4, + (32/8), + 0, + 5 + 1, + 0, + 4, + 1, + g_se_rschd_ppu_se_mex0_3_fc_cnt_reg, + NULL, + NULL, + }, + { + "rschd_as_fc_cnt0", + SE_RSCHD_RSCHD_AS_FC_CNT0r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x000008e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_rschd_as_fc_cnt0_reg, + NULL, + NULL, + }, + { + "rschd_as_fc_cnt1", + SE_RSCHD_RSCHD_AS_FC_CNT1r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x000008e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_rschd_as_fc_cnt1_reg, + NULL, + NULL, + }, + { + "rschd_as_fc_cnt2", + SE_RSCHD_RSCHD_AS_FC_CNT2r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x000008e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_rschd_as_fc_cnt2_reg, + NULL, + NULL, + }, + { + "rschd_as_fc_cnt3", + SE_RSCHD_RSCHD_AS_FC_CNT3r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x000008ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_rschd_as_fc_cnt3_reg, + NULL, + NULL, + }, + { + "rschd_as_fc_cnt4", + SE_RSCHD_RSCHD_AS_FC_CNT4r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x000008f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_rschd_as_fc_cnt4_reg, + NULL, + NULL, + }, + { + "rschd_as_fc_cnt5", + SE_RSCHD_RSCHD_AS_FC_CNT5r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x000008f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_rschd_as_fc_cnt5_reg, + NULL, + NULL, + }, + { + "rschd_as_fc_cnt6", + SE_RSCHD_RSCHD_AS_FC_CNT6r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x000008f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_rschd_as_fc_cnt6_reg, + NULL, + NULL, + }, + { + "rschd_as_fc_cnt9", + SE_RSCHD_RSCHD_AS_FC_CNT9r, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x000008fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_rschd_as_fc_cnt9_reg, + NULL, + NULL, + }, + { + "se_smmu1_fc0_3_cnt", + SE_RSCHD_SE_SMMU1_FC0_3_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x00000900, + (32/8), + 0, + 3 + 1, + 0, + 4, + 1, + g_se_rschd_se_smmu1_fc0_3_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_se_wr_done_cnt", + SE_RSCHD_SMMU0_SE_WR_DONE_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x00000910, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_smmu0_se_wr_done_cnt_reg, + NULL, + NULL, + }, + { + "se_smmu0_wr_done_fc_cnt", + SE_RSCHD_SE_SMMU0_WR_DONE_FC_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x00000914, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_se_smmu0_wr_done_fc_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_se_wr_rsp_cnt", + SE_RSCHD_SMMU1_SE_WR_RSP_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x00000918, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_smmu1_se_wr_rsp_cnt_reg, + NULL, + NULL, + }, + { + "se_smmu1_wr_rsp_fc_cnt", + SE_RSCHD_SE_SMMU1_WR_RSP_FC_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x0000091c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_se_smmu1_wr_rsp_fc_cnt_reg, + NULL, + NULL, + }, + { + "alg_se_wr_rsp_cnt", + SE_RSCHD_ALG_SE_WR_RSP_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x00000920, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_alg_se_wr_rsp_cnt_reg, + NULL, + NULL, + }, + { + "se_alg_wr_rsp_fc_cnt", + SE_RSCHD_SE_ALG_WR_RSP_FC_CNTr, + SE, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_BASE_ADDR + MODULE_SE_RSCHD_BASE_ADDR + 0x00000924, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_rschd_se_alg_wr_rsp_fc_cnt_reg, + NULL, + NULL, + }, + { + "kschd_pful_cfg0", + SMMU0_SMMU0_KSCHD_PFUL_CFG0r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000080, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_smmu0_smmu0_kschd_pful_cfg0_reg, + NULL, + NULL, + }, + { + "kschd_pful_cfg1", + SMMU0_SMMU0_KSCHD_PFUL_CFG1r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000084, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_smmu0_smmu0_kschd_pful_cfg1_reg, + NULL, + NULL, + }, + { + "ctrl_pful1_cfg", + SMMU0_SMMU0_CTRL_PFUL1_CFGr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000088, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_smmu0_smmu0_ctrl_pful1_cfg_reg, + NULL, + NULL, + }, + { + "ctrl_pful2_cfg", + SMMU0_SMMU0_CTRL_PFUL2_CFGr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000008c, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_smmu0_smmu0_ctrl_pful2_cfg_reg, + NULL, + NULL, + }, + { + "ctrl_pful3_cfg", + SMMU0_SMMU0_CTRL_PFUL3_CFGr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000090, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_smmu0_smmu0_ctrl_pful3_cfg_reg, + NULL, + NULL, + }, + { + "rschd_pful_cfg", + SMMU0_SMMU0_RSCHD_PFUL_CFGr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000094, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_smmu0_smmu0_rschd_pful_cfg_reg, + NULL, + NULL, + }, + { + "rschd_ept_cfg", + SMMU0_SMMU0_RSCHD_EPT_CFGr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000098, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_smmu0_smmu0_rschd_ept_cfg_reg, + NULL, + NULL, + }, + { + "alucmd_pful_cfg", + SMMU0_SMMU0_ALUCMD_PFUL_CFGr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000009c, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_smmu0_smmu0_alucmd_pful_cfg_reg, + NULL, + NULL, + }, + { + "aluwr_pful_cfg", + SMMU0_SMMU0_ALUWR_PFUL_CFGr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000000a0, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_smmu0_smmu0_aluwr_pful_cfg_reg, + NULL, + NULL, + }, + { + "wr_arb_pful_cfg0", + SMMU0_SMMU0_WR_ARB_PFUL_CFG0r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000000a4, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_smmu0_smmu0_wr_arb_pful_cfg0_reg, + NULL, + NULL, + }, + { + "wr_arb_pful_cfg1", + SMMU0_SMMU0_WR_ARB_PFUL_CFG1r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000000a8, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_smmu0_smmu0_wr_arb_pful_cfg1_reg, + NULL, + NULL, + }, + { + "ord_pful_cfg", + SMMU0_SMMU0_ORD_PFUL_CFGr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000000ac, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_smmu0_smmu0_ord_pful_cfg_reg, + NULL, + NULL, + }, + { + "cfg_dma_baddr", + SMMU0_SMMU0_CFG_DMA_BADDRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000000c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_cfg_dma_baddr_reg, + NULL, + NULL, + }, + { + "cfg_odma0_baddr", + SMMU0_SMMU0_CFG_ODMA0_BADDRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000000c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_cfg_odma0_baddr_reg, + NULL, + NULL, + }, + { + "cfg_odma1_baddr", + SMMU0_SMMU0_CFG_ODMA1_BADDRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000000c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_cfg_odma1_baddr_reg, + NULL, + NULL, + }, + { + "cfg_odma2_baddr", + SMMU0_SMMU0_CFG_ODMA2_BADDRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000000cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_cfg_odma2_baddr_reg, + NULL, + NULL, + }, + { + "cfg_odma_tdm_baddr", + SMMU0_SMMU0_CFG_ODMA_TDM_BADDRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000000d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_cfg_odma_tdm_baddr_reg, + NULL, + NULL, + }, + { + "cfg_mcast_baddr", + SMMU0_SMMU0_CFG_MCAST_BADDRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000000d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_cfg_mcast_baddr_reg, + NULL, + NULL, + }, + { + "cfg_lpm0", + SMMU0_SMMU0_CFG_LPM0r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000000d8, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_smmu0_smmu0_cfg_lpm0_reg, + NULL, + NULL, + }, + { + "cfg_lpm1", + SMMU0_SMMU0_CFG_LPM1r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000000dc, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_smmu0_smmu0_cfg_lpm1_reg, + NULL, + NULL, + }, + { + "cfg_lpm2", + SMMU0_SMMU0_CFG_LPM2r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000000e0, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_smmu0_smmu0_cfg_lpm2_reg, + NULL, + NULL, + }, + { + "cfg_lpm3", + SMMU0_SMMU0_CFG_LPM3r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000000e4, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_smmu0_smmu0_cfg_lpm3_reg, + NULL, + NULL, + }, + { + "cfg_lpm4", + SMMU0_SMMU0_CFG_LPM4r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000000e8, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_smmu0_smmu0_cfg_lpm4_reg, + NULL, + NULL, + }, + { + "cfg_lpm5", + SMMU0_SMMU0_CFG_LPM5r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000000ec, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_smmu0_smmu0_cfg_lpm5_reg, + NULL, + NULL, + }, + { + "cfg_lpm6", + SMMU0_SMMU0_CFG_LPM6r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000000f0, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_smmu0_smmu0_cfg_lpm6_reg, + NULL, + NULL, + }, + { + "cfg_lpm7", + SMMU0_SMMU0_CFG_LPM7r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000000f4, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_smmu0_smmu0_cfg_lpm7_reg, + NULL, + NULL, + }, + { + "debug_cnt_mode", + SMMU0_SMMU0_DEBUG_CNT_MODEr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000100, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_smmu0_smmu0_debug_cnt_mode_reg, + NULL, + NULL, + }, + { + "stat_overflow_mode", + SMMU0_SMMU0_STAT_OVERFLOW_MODEr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000104, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_stat_overflow_mode_reg, + NULL, + NULL, + }, + { + "init_en_cfg_tmp", + SMMU0_SMMU0_INIT_EN_CFG_TMPr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000013c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_init_en_cfg_tmp_reg, + NULL, + NULL, + }, + { + "smmu0_int_unmask_flag", + SMMU0_SMMU0_SMMU0_INT_UNMASK_FLAGr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000140, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int_unmask_flag_reg, + NULL, + NULL, + }, + { + "smmu0_int0_en", + SMMU0_SMMU0_SMMU0_INT0_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000144, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int0_en_reg, + NULL, + NULL, + }, + { + "smmu0_int0_mask", + SMMU0_SMMU0_SMMU0_INT0_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000148, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int0_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int0_status", + SMMU0_SMMU0_SMMU0_INT0_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000014c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int0_status_reg, + NULL, + NULL, + }, + { + "smmu0_int1_en", + SMMU0_SMMU0_SMMU0_INT1_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000150, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int1_en_reg, + NULL, + NULL, + }, + { + "smmu0_int1_mask", + SMMU0_SMMU0_SMMU0_INT1_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000154, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int1_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int1_status", + SMMU0_SMMU0_SMMU0_INT1_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000158, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int1_status_reg, + NULL, + NULL, + }, + { + "smmu0_int2_en", + SMMU0_SMMU0_SMMU0_INT2_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000015c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int2_en_reg, + NULL, + NULL, + }, + { + "smmu0_int2_mask", + SMMU0_SMMU0_SMMU0_INT2_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000160, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int2_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int2_status", + SMMU0_SMMU0_SMMU0_INT2_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000164, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int2_status_reg, + NULL, + NULL, + }, + { + "smmu0_int3_en", + SMMU0_SMMU0_SMMU0_INT3_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000168, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int3_en_reg, + NULL, + NULL, + }, + { + "smmu0_int3_mask", + SMMU0_SMMU0_SMMU0_INT3_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000016c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int3_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int3_status", + SMMU0_SMMU0_SMMU0_INT3_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000170, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int3_status_reg, + NULL, + NULL, + }, + { + "smmu0_int4_en", + SMMU0_SMMU0_SMMU0_INT4_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000174, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int4_en_reg, + NULL, + NULL, + }, + { + "smmu0_int4_mask", + SMMU0_SMMU0_SMMU0_INT4_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000178, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int4_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int4_status", + SMMU0_SMMU0_SMMU0_INT4_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000017c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int4_status_reg, + NULL, + NULL, + }, + { + "smmu0_int5_en", + SMMU0_SMMU0_SMMU0_INT5_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000180, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int5_en_reg, + NULL, + NULL, + }, + { + "smmu0_int5_mask", + SMMU0_SMMU0_SMMU0_INT5_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000184, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int5_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int5_status", + SMMU0_SMMU0_SMMU0_INT5_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000188, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int5_status_reg, + NULL, + NULL, + }, + { + "smmu0_int6_en", + SMMU0_SMMU0_SMMU0_INT6_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000018c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int6_en_reg, + NULL, + NULL, + }, + { + "smmu0_int6_mask", + SMMU0_SMMU0_SMMU0_INT6_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000190, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int6_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int6_status", + SMMU0_SMMU0_SMMU0_INT6_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000194, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int6_status_reg, + NULL, + NULL, + }, + { + "smmu0_int7_en", + SMMU0_SMMU0_SMMU0_INT7_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000198, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int7_en_reg, + NULL, + NULL, + }, + { + "smmu0_int7_mask", + SMMU0_SMMU0_SMMU0_INT7_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000019c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int7_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int7_status", + SMMU0_SMMU0_SMMU0_INT7_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000001a0, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int7_status_reg, + NULL, + NULL, + }, + { + "smmu0_int8_en", + SMMU0_SMMU0_SMMU0_INT8_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000001a4, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int8_en_reg, + NULL, + NULL, + }, + { + "smmu0_int8_mask", + SMMU0_SMMU0_SMMU0_INT8_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000001a8, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int8_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int8_status", + SMMU0_SMMU0_SMMU0_INT8_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000001ac, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int8_status_reg, + NULL, + NULL, + }, + { + "smmu0_int9_en", + SMMU0_SMMU0_SMMU0_INT9_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000001b0, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int9_en_reg, + NULL, + NULL, + }, + { + "smmu0_int9_mask", + SMMU0_SMMU0_SMMU0_INT9_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000001b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int9_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int9_status", + SMMU0_SMMU0_SMMU0_INT9_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000001b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int9_status_reg, + NULL, + NULL, + }, + { + "smmu0_int10_en", + SMMU0_SMMU0_SMMU0_INT10_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000001bc, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int10_en_reg, + NULL, + NULL, + }, + { + "smmu0_int10_mask", + SMMU0_SMMU0_SMMU0_INT10_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000001c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int10_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int10_status", + SMMU0_SMMU0_SMMU0_INT10_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000001c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int10_status_reg, + NULL, + NULL, + }, + { + "smmu0_int11_en", + SMMU0_SMMU0_SMMU0_INT11_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000001c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int11_en_reg, + NULL, + NULL, + }, + { + "smmu0_int11_mask", + SMMU0_SMMU0_SMMU0_INT11_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000001cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int11_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int11_status", + SMMU0_SMMU0_SMMU0_INT11_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000001d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int11_status_reg, + NULL, + NULL, + }, + { + "smmu0_int12_en", + SMMU0_SMMU0_SMMU0_INT12_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000001d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int12_en_reg, + NULL, + NULL, + }, + { + "smmu0_int12_mask", + SMMU0_SMMU0_SMMU0_INT12_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000001d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int12_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int12_status", + SMMU0_SMMU0_SMMU0_INT12_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000001dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int12_status_reg, + NULL, + NULL, + }, + { + "smmu0_int13_en", + SMMU0_SMMU0_SMMU0_INT13_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000001e0, + (32/8), + 0, + 0, + 0, + 0, + 20, + g_smmu0_smmu0_smmu0_int13_en_reg, + NULL, + NULL, + }, + { + "smmu0_int13_mask", + SMMU0_SMMU0_SMMU0_INT13_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000001e4, + (32/8), + 0, + 0, + 0, + 0, + 20, + g_smmu0_smmu0_smmu0_int13_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int13_status", + SMMU0_SMMU0_SMMU0_INT13_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000001e8, + (32/8), + 0, + 0, + 0, + 0, + 20, + g_smmu0_smmu0_smmu0_int13_status_reg, + NULL, + NULL, + }, + { + "smmu0_int14_en", + SMMU0_SMMU0_SMMU0_INT14_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000001ec, + (32/8), + 0, + 0, + 0, + 0, + 17, + g_smmu0_smmu0_smmu0_int14_en_reg, + NULL, + NULL, + }, + { + "smmu0_int14_mask", + SMMU0_SMMU0_SMMU0_INT14_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000001f0, + (32/8), + 0, + 0, + 0, + 0, + 17, + g_smmu0_smmu0_smmu0_int14_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int14_status", + SMMU0_SMMU0_SMMU0_INT14_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000001f4, + (32/8), + 0, + 0, + 0, + 0, + 17, + g_smmu0_smmu0_smmu0_int14_status_reg, + NULL, + NULL, + }, + { + "smmu0_ecc_unmask_flag", + SMMU0_SMMU0_SMMU0_ECC_UNMASK_FLAGr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000001f8, + (32/8), + 0, + 0, + 0, + 0, + 22, + g_smmu0_smmu0_smmu0_ecc_unmask_flag_reg, + NULL, + NULL, + }, + { + "smmu0_int15_en", + SMMU0_SMMU0_SMMU0_INT15_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000001fc, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int15_en_reg, + NULL, + NULL, + }, + { + "smmu0_int15_mask", + SMMU0_SMMU0_SMMU0_INT15_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000200, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int15_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int15_status", + SMMU0_SMMU0_SMMU0_INT15_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000204, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int15_status_reg, + NULL, + NULL, + }, + { + "smmu0_int16_en", + SMMU0_SMMU0_SMMU0_INT16_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000208, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int16_en_reg, + NULL, + NULL, + }, + { + "smmu0_int16_mask", + SMMU0_SMMU0_SMMU0_INT16_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000020c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int16_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int16_status", + SMMU0_SMMU0_SMMU0_INT16_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000210, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int16_status_reg, + NULL, + NULL, + }, + { + "smmu0_int17_en", + SMMU0_SMMU0_SMMU0_INT17_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000214, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int17_en_reg, + NULL, + NULL, + }, + { + "smmu0_int17_mask", + SMMU0_SMMU0_SMMU0_INT17_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000218, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int17_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int17_status", + SMMU0_SMMU0_SMMU0_INT17_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000021c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int17_status_reg, + NULL, + NULL, + }, + { + "smmu0_int18_en", + SMMU0_SMMU0_SMMU0_INT18_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000220, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int18_en_reg, + NULL, + NULL, + }, + { + "smmu0_int18_mask", + SMMU0_SMMU0_SMMU0_INT18_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000224, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int18_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int18_status", + SMMU0_SMMU0_SMMU0_INT18_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000228, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int18_status_reg, + NULL, + NULL, + }, + { + "smmu0_int19_en", + SMMU0_SMMU0_SMMU0_INT19_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000022c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int19_en_reg, + NULL, + NULL, + }, + { + "smmu0_int19_mask", + SMMU0_SMMU0_SMMU0_INT19_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000230, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int19_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int19_status", + SMMU0_SMMU0_SMMU0_INT19_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000234, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int19_status_reg, + NULL, + NULL, + }, + { + "smmu0_int20_en", + SMMU0_SMMU0_SMMU0_INT20_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000238, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int20_en_reg, + NULL, + NULL, + }, + { + "smmu0_int20_mask", + SMMU0_SMMU0_SMMU0_INT20_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000023c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int20_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int20_status", + SMMU0_SMMU0_SMMU0_INT20_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000240, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int20_status_reg, + NULL, + NULL, + }, + { + "smmu0_int21_en", + SMMU0_SMMU0_SMMU0_INT21_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000244, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int21_en_reg, + NULL, + NULL, + }, + { + "smmu0_int21_mask", + SMMU0_SMMU0_SMMU0_INT21_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000248, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int21_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int21_status", + SMMU0_SMMU0_SMMU0_INT21_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000024c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int21_status_reg, + NULL, + NULL, + }, + { + "smmu0_int22_en", + SMMU0_SMMU0_SMMU0_INT22_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000250, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int22_en_reg, + NULL, + NULL, + }, + { + "smmu0_int22_mask", + SMMU0_SMMU0_SMMU0_INT22_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000254, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int22_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int22_status", + SMMU0_SMMU0_SMMU0_INT22_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000258, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int22_status_reg, + NULL, + NULL, + }, + { + "smmu0_int23_en", + SMMU0_SMMU0_SMMU0_INT23_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000025c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int23_en_reg, + NULL, + NULL, + }, + { + "smmu0_int23_mask", + SMMU0_SMMU0_SMMU0_INT23_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000260, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int23_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int23_status", + SMMU0_SMMU0_SMMU0_INT23_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000264, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int23_status_reg, + NULL, + NULL, + }, + { + "smmu0_int24_en", + SMMU0_SMMU0_SMMU0_INT24_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000268, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int24_en_reg, + NULL, + NULL, + }, + { + "smmu0_int24_mask", + SMMU0_SMMU0_SMMU0_INT24_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000026c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int24_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int24_status", + SMMU0_SMMU0_SMMU0_INT24_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000270, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int24_status_reg, + NULL, + NULL, + }, + { + "smmu0_int25_en", + SMMU0_SMMU0_SMMU0_INT25_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000274, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int25_en_reg, + NULL, + NULL, + }, + { + "smmu0_int25_mask", + SMMU0_SMMU0_SMMU0_INT25_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000278, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int25_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int25_status", + SMMU0_SMMU0_SMMU0_INT25_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000027c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int25_status_reg, + NULL, + NULL, + }, + { + "smmu0_int26_en", + SMMU0_SMMU0_SMMU0_INT26_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000280, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int26_en_reg, + NULL, + NULL, + }, + { + "smmu0_int26_mask", + SMMU0_SMMU0_SMMU0_INT26_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000284, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int26_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int26_status", + SMMU0_SMMU0_SMMU0_INT26_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000288, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int26_status_reg, + NULL, + NULL, + }, + { + "smmu0_int27_en", + SMMU0_SMMU0_SMMU0_INT27_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000028c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int27_en_reg, + NULL, + NULL, + }, + { + "smmu0_int27_mask", + SMMU0_SMMU0_SMMU0_INT27_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000290, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int27_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int27_status", + SMMU0_SMMU0_SMMU0_INT27_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000294, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int27_status_reg, + NULL, + NULL, + }, + { + "smmu0_int28_en", + SMMU0_SMMU0_SMMU0_INT28_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000298, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int28_en_reg, + NULL, + NULL, + }, + { + "smmu0_int28_mask", + SMMU0_SMMU0_SMMU0_INT28_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000029c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int28_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int28_status", + SMMU0_SMMU0_SMMU0_INT28_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000002a0, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int28_status_reg, + NULL, + NULL, + }, + { + "smmu0_int29_en", + SMMU0_SMMU0_SMMU0_INT29_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000002a4, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int29_en_reg, + NULL, + NULL, + }, + { + "smmu0_int29_mask", + SMMU0_SMMU0_SMMU0_INT29_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000002a8, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int29_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int29_status", + SMMU0_SMMU0_SMMU0_INT29_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000002ac, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int29_status_reg, + NULL, + NULL, + }, + { + "smmu0_int30_en", + SMMU0_SMMU0_SMMU0_INT30_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000002b0, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int30_en_reg, + NULL, + NULL, + }, + { + "smmu0_int30_mask", + SMMU0_SMMU0_SMMU0_INT30_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000002b4, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int30_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int30_status", + SMMU0_SMMU0_SMMU0_INT30_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000002b8, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int30_status_reg, + NULL, + NULL, + }, + { + "smmu0_int31_en", + SMMU0_SMMU0_SMMU0_INT31_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000002bc, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int31_en_reg, + NULL, + NULL, + }, + { + "smmu0_int31_mask", + SMMU0_SMMU0_SMMU0_INT31_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000002c0, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int31_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int31_status", + SMMU0_SMMU0_SMMU0_INT31_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000002c4, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int31_status_reg, + NULL, + NULL, + }, + { + "smmu0_int32_en", + SMMU0_SMMU0_SMMU0_INT32_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000002c8, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int32_en_reg, + NULL, + NULL, + }, + { + "smmu0_int32_mask", + SMMU0_SMMU0_SMMU0_INT32_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000002cc, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int32_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int32_status", + SMMU0_SMMU0_SMMU0_INT32_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000002d0, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int32_status_reg, + NULL, + NULL, + }, + { + "smmu0_int33_en", + SMMU0_SMMU0_SMMU0_INT33_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000002d4, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int33_en_reg, + NULL, + NULL, + }, + { + "smmu0_int33_mask", + SMMU0_SMMU0_SMMU0_INT33_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000002d8, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int33_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int33_status", + SMMU0_SMMU0_SMMU0_INT33_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000002dc, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int33_status_reg, + NULL, + NULL, + }, + { + "smmu0_int34_en", + SMMU0_SMMU0_SMMU0_INT34_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000002e0, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int34_en_reg, + NULL, + NULL, + }, + { + "smmu0_int34_mask", + SMMU0_SMMU0_SMMU0_INT34_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000002e4, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int34_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int34_status", + SMMU0_SMMU0_SMMU0_INT34_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000002e8, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_smmu0_int34_status_reg, + NULL, + NULL, + }, + { + "smmu0_int35_en", + SMMU0_SMMU0_SMMU0_INT35_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000002ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int35_en_reg, + NULL, + NULL, + }, + { + "smmu0_int35_mask", + SMMU0_SMMU0_SMMU0_INT35_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000002f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int35_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int35_status", + SMMU0_SMMU0_SMMU0_INT35_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000002f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int35_status_reg, + NULL, + NULL, + }, + { + "smmu0_int36_en", + SMMU0_SMMU0_SMMU0_INT36_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000002f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int36_en_reg, + NULL, + NULL, + }, + { + "smmu0_int36_mask", + SMMU0_SMMU0_SMMU0_INT36_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000002fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int36_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int36_status", + SMMU0_SMMU0_SMMU0_INT36_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000300, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int36_status_reg, + NULL, + NULL, + }, + { + "smmu0_int37_en", + SMMU0_SMMU0_SMMU0_INT37_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000304, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int37_en_reg, + NULL, + NULL, + }, + { + "smmu0_int37_mask", + SMMU0_SMMU0_SMMU0_INT37_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000308, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int37_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int37_status", + SMMU0_SMMU0_SMMU0_INT37_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000030c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int37_status_reg, + NULL, + NULL, + }, + { + "smmu0_int38_en", + SMMU0_SMMU0_SMMU0_INT38_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000310, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int38_en_reg, + NULL, + NULL, + }, + { + "smmu0_int38_mask", + SMMU0_SMMU0_SMMU0_INT38_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000314, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int38_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int38_status", + SMMU0_SMMU0_SMMU0_INT38_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000318, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int38_status_reg, + NULL, + NULL, + }, + { + "smmu0_int39_en", + SMMU0_SMMU0_SMMU0_INT39_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000036c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int39_en_reg, + NULL, + NULL, + }, + { + "smmu0_int39_mask", + SMMU0_SMMU0_SMMU0_INT39_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000370, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int39_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int39_status", + SMMU0_SMMU0_SMMU0_INT39_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000374, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int39_status_reg, + NULL, + NULL, + }, + { + "smmu0_int40_en", + SMMU0_SMMU0_SMMU0_INT40_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000378, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int40_en_reg, + NULL, + NULL, + }, + { + "smmu0_int40_mask", + SMMU0_SMMU0_SMMU0_INT40_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000037c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int40_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int40_status", + SMMU0_SMMU0_SMMU0_INT40_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000380, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int40_status_reg, + NULL, + NULL, + }, + { + "smmu0_int41_en", + SMMU0_SMMU0_SMMU0_INT41_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000384, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int41_en_reg, + NULL, + NULL, + }, + { + "smmu0_int41_mask", + SMMU0_SMMU0_SMMU0_INT41_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000388, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int41_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int41_status", + SMMU0_SMMU0_SMMU0_INT41_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000038c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int41_status_reg, + NULL, + NULL, + }, + { + "smmu0_int42_en", + SMMU0_SMMU0_SMMU0_INT42_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000390, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int42_en_reg, + NULL, + NULL, + }, + { + "smmu0_int42_mask", + SMMU0_SMMU0_SMMU0_INT42_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000394, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int42_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int42_status", + SMMU0_SMMU0_SMMU0_INT42_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000398, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int42_status_reg, + NULL, + NULL, + }, + { + "smmu0_int43_en", + SMMU0_SMMU0_SMMU0_INT43_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000039c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int43_en_reg, + NULL, + NULL, + }, + { + "smmu0_int43_mask", + SMMU0_SMMU0_SMMU0_INT43_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000003a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int43_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int43_status", + SMMU0_SMMU0_SMMU0_INT43_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000003a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int43_status_reg, + NULL, + NULL, + }, + { + "smmu0_int44_en", + SMMU0_SMMU0_SMMU0_INT44_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000003a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int44_en_reg, + NULL, + NULL, + }, + { + "smmu0_int44_mask", + SMMU0_SMMU0_SMMU0_INT44_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000003ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int44_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int44_status", + SMMU0_SMMU0_SMMU0_INT44_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000003b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int44_status_reg, + NULL, + NULL, + }, + { + "smmu0_int45_en", + SMMU0_SMMU0_SMMU0_INT45_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000003b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int45_en_reg, + NULL, + NULL, + }, + { + "smmu0_int45_mask", + SMMU0_SMMU0_SMMU0_INT45_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000003b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int45_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int45_status", + SMMU0_SMMU0_SMMU0_INT45_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000003bc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int45_status_reg, + NULL, + NULL, + }, + { + "smmu0_int46_en", + SMMU0_SMMU0_SMMU0_INT46_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000003c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int46_en_reg, + NULL, + NULL, + }, + { + "smmu0_int46_mask", + SMMU0_SMMU0_SMMU0_INT46_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000003c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int46_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int46_status", + SMMU0_SMMU0_SMMU0_INT46_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000003c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int46_status_reg, + NULL, + NULL, + }, + { + "smmu0_int47_en", + SMMU0_SMMU0_SMMU0_INT47_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000003cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int47_en_reg, + NULL, + NULL, + }, + { + "smmu0_int47_mask", + SMMU0_SMMU0_SMMU0_INT47_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000003d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int47_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int47_status", + SMMU0_SMMU0_SMMU0_INT47_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000003d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int47_status_reg, + NULL, + NULL, + }, + { + "smmu0_int48_en", + SMMU0_SMMU0_SMMU0_INT48_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000003d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int48_en_reg, + NULL, + NULL, + }, + { + "smmu0_int48_mask", + SMMU0_SMMU0_SMMU0_INT48_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000003dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int48_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int48_status", + SMMU0_SMMU0_SMMU0_INT48_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000003e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int48_status_reg, + NULL, + NULL, + }, + { + "smmu0_int49_en", + SMMU0_SMMU0_SMMU0_INT49_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000003e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int49_en_reg, + NULL, + NULL, + }, + { + "smmu0_int49_mask", + SMMU0_SMMU0_SMMU0_INT49_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000003e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int49_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int49_status", + SMMU0_SMMU0_SMMU0_INT49_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000003ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int49_status_reg, + NULL, + NULL, + }, + { + "smmu0_int50_en", + SMMU0_SMMU0_SMMU0_INT50_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000003f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int50_en_reg, + NULL, + NULL, + }, + { + "smmu0_int50_mask", + SMMU0_SMMU0_SMMU0_INT50_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000003f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int50_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int50_status", + SMMU0_SMMU0_SMMU0_INT50_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000003f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int50_status_reg, + NULL, + NULL, + }, + { + "smmu0_int51_en", + SMMU0_SMMU0_SMMU0_INT51_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000003fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int51_en_reg, + NULL, + NULL, + }, + { + "smmu0_int51_mask", + SMMU0_SMMU0_SMMU0_INT51_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000400, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int51_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int51_status", + SMMU0_SMMU0_SMMU0_INT51_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000404, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int51_status_reg, + NULL, + NULL, + }, + { + "smmu0_int52_en", + SMMU0_SMMU0_SMMU0_INT52_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000408, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int52_en_reg, + NULL, + NULL, + }, + { + "smmu0_int52_mask", + SMMU0_SMMU0_SMMU0_INT52_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000040c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int52_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int52_status", + SMMU0_SMMU0_SMMU0_INT52_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000410, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_int52_status_reg, + NULL, + NULL, + }, + { + "smmu0_int53_en", + SMMU0_SMMU0_SMMU0_INT53_ENr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000414, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_smmu0_smmu0_smmu0_int53_en_reg, + NULL, + NULL, + }, + { + "smmu0_int53_mask", + SMMU0_SMMU0_SMMU0_INT53_MASKr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000418, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_smmu0_smmu0_smmu0_int53_mask_reg, + NULL, + NULL, + }, + { + "smmu0_int53_status", + SMMU0_SMMU0_SMMU0_INT53_STATUSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000041c, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_smmu0_smmu0_smmu0_int53_status_reg, + NULL, + NULL, + }, + { + "ctrl0_arbiter_ecc_bypass", + SMMU0_SMMU0_CTRL0_ARBITER_ECC_BYPASSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000031c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl0_arbiter_ecc_bypass_reg, + NULL, + NULL, + }, + { + "ctrl2_arbiter_ecc_bypass", + SMMU0_SMMU0_CTRL2_ARBITER_ECC_BYPASSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000320, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl2_arbiter_ecc_bypass_reg, + NULL, + NULL, + }, + { + "ctrl4_arbiter_ecc_bypass", + SMMU0_SMMU0_CTRL4_ARBITER_ECC_BYPASSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000324, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl4_arbiter_ecc_bypass_reg, + NULL, + NULL, + }, + { + "ctrl6_arbiter_ecc_bypass", + SMMU0_SMMU0_CTRL6_ARBITER_ECC_BYPASSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000328, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl6_arbiter_ecc_bypass_reg, + NULL, + NULL, + }, + { + "ctrl8_arbiter_ecc_bypass", + SMMU0_SMMU0_CTRL8_ARBITER_ECC_BYPASSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000032c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl8_arbiter_ecc_bypass_reg, + NULL, + NULL, + }, + { + "ctrl10_arbiter_ecc_bypass", + SMMU0_SMMU0_CTRL10_ARBITER_ECC_BYPASSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000330, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl10_arbiter_ecc_bypass_reg, + NULL, + NULL, + }, + { + "ctrl12_arbiter_ecc_bypass", + SMMU0_SMMU0_CTRL12_ARBITER_ECC_BYPASSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000334, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl12_arbiter_ecc_bypass_reg, + NULL, + NULL, + }, + { + "ctrl14_arbiter_ecc_bypass", + SMMU0_SMMU0_CTRL14_ARBITER_ECC_BYPASSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000338, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl14_arbiter_ecc_bypass_reg, + NULL, + NULL, + }, + { + "ctrl16_arbiter_ecc_bypass", + SMMU0_SMMU0_CTRL16_ARBITER_ECC_BYPASSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000033c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl16_arbiter_ecc_bypass_reg, + NULL, + NULL, + }, + { + "ctrl18_arbiter_ecc_bypass", + SMMU0_SMMU0_CTRL18_ARBITER_ECC_BYPASSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000340, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl18_arbiter_ecc_bypass_reg, + NULL, + NULL, + }, + { + "ctrl20_arbiter_ecc_bypass", + SMMU0_SMMU0_CTRL20_ARBITER_ECC_BYPASSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000344, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl20_arbiter_ecc_bypass_reg, + NULL, + NULL, + }, + { + "ctrl22_arbiter_ecc_bypass", + SMMU0_SMMU0_CTRL22_ARBITER_ECC_BYPASSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000348, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl22_arbiter_ecc_bypass_reg, + NULL, + NULL, + }, + { + "ctrl24_arbiter_ecc_bypass", + SMMU0_SMMU0_CTRL24_ARBITER_ECC_BYPASSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000034c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl24_arbiter_ecc_bypass_reg, + NULL, + NULL, + }, + { + "ctrl26_arbiter_ecc_bypass", + SMMU0_SMMU0_CTRL26_ARBITER_ECC_BYPASSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000350, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl26_arbiter_ecc_bypass_reg, + NULL, + NULL, + }, + { + "ctrl28_arbiter_ecc_bypass", + SMMU0_SMMU0_CTRL28_ARBITER_ECC_BYPASSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000354, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl28_arbiter_ecc_bypass_reg, + NULL, + NULL, + }, + { + "ctrl30_arbiter_ecc_bypass", + SMMU0_SMMU0_CTRL30_ARBITER_ECC_BYPASSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000358, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl30_arbiter_ecc_bypass_reg, + NULL, + NULL, + }, + { + "ctrl_req_ecc_bypass", + SMMU0_SMMU0_CTRL_REQ_ECC_BYPASSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000035c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_ctrl_req_ecc_bypass_reg, + NULL, + NULL, + }, + { + "ctrl_info_ecc_bypass", + SMMU0_SMMU0_CTRL_INFO_ECC_BYPASSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000360, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_ctrl_info_ecc_bypass_reg, + NULL, + NULL, + }, + { + "smmu0_rschd_ecc_bypass", + SMMU0_SMMU0_SMMU0_RSCHD_ECC_BYPASSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000368, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_rschd_ecc_bypass_reg, + NULL, + NULL, + }, + { + "smmu0_wr_ecc_bypass", + SMMU0_SMMU0_SMMU0_WR_ECC_BYPASSr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000364, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_smmu0_smmu0_smmu0_wr_ecc_bypass_reg, + NULL, + NULL, + }, + { + "ctrl0_arbiter_ecc_err", + SMMU0_SMMU0_CTRL0_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000f50, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl0_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl1_arbiter_ecc_err", + SMMU0_SMMU0_CTRL1_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000f54, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl1_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl2_arbiter_ecc_err", + SMMU0_SMMU0_CTRL2_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000f58, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl2_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl3_arbiter_ecc_err", + SMMU0_SMMU0_CTRL3_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000f5c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl3_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl4_arbiter_ecc_err", + SMMU0_SMMU0_CTRL4_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000f60, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl4_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl5_arbiter_ecc_err", + SMMU0_SMMU0_CTRL5_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000f64, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl5_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl6_arbiter_ecc_err", + SMMU0_SMMU0_CTRL6_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000f68, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl6_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl7_arbiter_ecc_err", + SMMU0_SMMU0_CTRL7_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000f6c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl7_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl8_arbiter_ecc_err", + SMMU0_SMMU0_CTRL8_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000f70, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl8_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl9_arbiter_ecc_err", + SMMU0_SMMU0_CTRL9_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000f74, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl9_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl10_arbiter_ecc_err", + SMMU0_SMMU0_CTRL10_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000f78, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl10_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl11_arbiter_ecc_err", + SMMU0_SMMU0_CTRL11_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000f7c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl11_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl12_arbiter_ecc_err", + SMMU0_SMMU0_CTRL12_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000f80, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl12_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl13_arbiter_ecc_err", + SMMU0_SMMU0_CTRL13_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000f84, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl13_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl14_arbiter_ecc_err", + SMMU0_SMMU0_CTRL14_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000f88, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl14_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl15_arbiter_ecc_err", + SMMU0_SMMU0_CTRL15_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000f8c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl15_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl16_arbiter_ecc_err", + SMMU0_SMMU0_CTRL16_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000f90, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl16_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl17_arbiter_ecc_err", + SMMU0_SMMU0_CTRL17_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000f94, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl17_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl18_arbiter_ecc_err", + SMMU0_SMMU0_CTRL18_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000f98, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl18_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl19_arbiter_ecc_err", + SMMU0_SMMU0_CTRL19_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000f9c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl19_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl20_arbiter_ecc_err", + SMMU0_SMMU0_CTRL20_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000fa0, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl20_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl21_arbiter_ecc_err", + SMMU0_SMMU0_CTRL21_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000fa4, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl21_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl22_arbiter_ecc_err", + SMMU0_SMMU0_CTRL22_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000fa8, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl22_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl23_arbiter_ecc_err", + SMMU0_SMMU0_CTRL23_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000fac, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl23_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl24_arbiter_ecc_err", + SMMU0_SMMU0_CTRL24_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000fb0, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl24_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl25_arbiter_ecc_err", + SMMU0_SMMU0_CTRL25_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000fb4, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl25_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl26_arbiter_ecc_err", + SMMU0_SMMU0_CTRL26_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000fbc, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl26_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl27_arbiter_ecc_err", + SMMU0_SMMU0_CTRL27_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000fc0, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl27_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl28_arbiter_ecc_err", + SMMU0_SMMU0_CTRL28_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000fc4, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl28_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl29_arbiter_ecc_err", + SMMU0_SMMU0_CTRL29_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000fc8, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl29_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl30_arbiter_ecc_err", + SMMU0_SMMU0_CTRL30_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000fcc, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl30_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl31_arbiter_ecc_err", + SMMU0_SMMU0_CTRL31_ARBITER_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000fd0, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_smmu0_smmu0_ctrl31_arbiter_ecc_err_reg, + NULL, + NULL, + }, + { + "ctrl_req_ecc_single_err", + SMMU0_SMMU0_CTRL_REQ_ECC_SINGLE_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000fd4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_ctrl_req_ecc_single_err_reg, + NULL, + NULL, + }, + { + "ctrl_req_ecc_double_err", + SMMU0_SMMU0_CTRL_REQ_ECC_DOUBLE_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000fd8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_ctrl_req_ecc_double_err_reg, + NULL, + NULL, + }, + { + "ctrl_info_ecc_single_err", + SMMU0_SMMU0_CTRL_INFO_ECC_SINGLE_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000fdc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_ctrl_info_ecc_single_err_reg, + NULL, + NULL, + }, + { + "ctrl_info_ecc_double_err", + SMMU0_SMMU0_CTRL_INFO_ECC_DOUBLE_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000fe0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_ctrl_info_ecc_double_err_reg, + NULL, + NULL, + }, + { + "smmu0_wr_ecc_err", + SMMU0_SMMU0_SMMU0_WR_ECC_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000fe4, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_smmu0_smmu0_smmu0_wr_ecc_err_reg, + NULL, + NULL, + }, + { + "smmu0_rschd_ecc_single_err", + SMMU0_SMMU0_SMMU0_RSCHD_ECC_SINGLE_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000fe8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_rschd_ecc_single_err_reg, + NULL, + NULL, + }, + { + "smmu0_rschd_ecc_double_err", + SMMU0_SMMU0_SMMU0_RSCHD_ECC_DOUBLE_ERRr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000fec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_rschd_ecc_double_err_reg, + NULL, + NULL, + }, + { + "ord_fifo_empty", + SMMU0_SMMU0_ORD_FIFO_EMPTYr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000440, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_ord_fifo_empty_reg, + NULL, + NULL, + }, + { + "wr_arb_fifo_empty", + SMMU0_SMMU0_WR_ARB_FIFO_EMPTYr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000444, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_wr_arb_fifo_empty_reg, + NULL, + NULL, + }, + { + "ctrl_fifo_empty0", + SMMU0_SMMU0_CTRL_FIFO_EMPTY0r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000448, + (32/8), + 0, + 0, + 0, + 0, + 6, + g_smmu0_smmu0_ctrl_fifo_empty0_reg, + NULL, + NULL, + }, + { + "ctrl_fifo_empty1", + SMMU0_SMMU0_CTRL_FIFO_EMPTY1r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000044c, + (32/8), + 0, + 0, + 0, + 0, + 6, + g_smmu0_smmu0_ctrl_fifo_empty1_reg, + NULL, + NULL, + }, + { + "ctrl_fifo_empty2", + SMMU0_SMMU0_CTRL_FIFO_EMPTY2r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000450, + (32/8), + 0, + 0, + 0, + 0, + 6, + g_smmu0_smmu0_ctrl_fifo_empty2_reg, + NULL, + NULL, + }, + { + "ctrl_fifo_empty3", + SMMU0_SMMU0_CTRL_FIFO_EMPTY3r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000454, + (32/8), + 0, + 0, + 0, + 0, + 6, + g_smmu0_smmu0_ctrl_fifo_empty3_reg, + NULL, + NULL, + }, + { + "ctrl_fifo_empty4", + SMMU0_SMMU0_CTRL_FIFO_EMPTY4r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000560, + (32/8), + 0, + 0, + 0, + 0, + 6, + g_smmu0_smmu0_ctrl_fifo_empty4_reg, + NULL, + NULL, + }, + { + "ctrl_fifo_empty5", + SMMU0_SMMU0_CTRL_FIFO_EMPTY5r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000564, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_smmu0_smmu0_ctrl_fifo_empty5_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty0", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY0r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000458, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty0_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty1", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY1r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000045c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty1_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty2", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY2r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000460, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty2_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty3", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY3r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000464, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty3_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty4", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY4r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000468, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty4_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty5", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY5r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000046c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty5_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty6", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY6r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000470, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty6_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty7", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY7r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000474, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty7_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty8", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY8r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000478, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty8_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty9", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY9r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000047c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty9_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty10", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY10r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000480, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty10_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty11", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY11r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000484, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty11_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty12", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY12r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000488, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty12_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty13", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY13r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000048c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty13_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty14", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY14r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000490, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty14_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty15", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY15r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000494, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty15_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty16", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY16r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000498, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty16_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty17", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY17r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000049c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty17_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty18", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY18r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000004a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty18_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty19", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY19r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000004a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty19_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty20", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY20r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000004a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty20_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty21", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY21r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000004ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty21_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty22", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY22r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000004b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty22_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty23", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY23r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000004b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty23_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty24", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY24r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000004b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty24_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty25", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY25r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000004bc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty25_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty26", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY26r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000004c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty26_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty27", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY27r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000004c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty27_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty28", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY28r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000004c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty28_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty29", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY29r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000004cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty29_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty30", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY30r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000004d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty30_reg, + NULL, + NULL, + }, + { + "kschd_fifo_empty31", + SMMU0_SMMU0_KSCHD_FIFO_EMPTY31r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000004d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_kschd_fifo_empty31_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty0", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY0r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000004d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty0_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty1", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY1r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000004dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty1_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty2", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY2r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000004e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty2_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty3", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY3r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000004e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty3_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty4", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY4r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000004e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty4_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty5", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY5r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000004ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty5_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty6", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY6r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000004f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty6_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty7", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY7r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000004f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty7_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty8", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY8r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000004f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty8_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty9", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY9r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000004fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty9_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty10", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY10r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000500, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty10_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty11", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY11r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000504, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty11_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty12", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY12r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000508, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty12_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty13", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY13r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000050c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty13_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty14", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY14r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000510, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty14_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty15", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY15r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000514, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty15_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty16", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY16r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000518, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty16_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty17", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY17r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000051c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty17_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty18", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY18r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000520, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty18_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty19", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY19r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000524, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty19_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty20", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY20r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000528, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty20_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty21", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY21r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000052c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty21_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty22", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY22r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000530, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty22_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty23", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY23r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000534, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty23_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty24", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY24r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000538, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty24_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty25", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY25r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000053c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty25_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty26", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY26r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000540, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty26_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty27", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY27r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000544, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty27_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty28", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY28r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000548, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty28_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty29", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY29r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000054c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty29_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty30", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY30r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000550, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty30_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty31", + SMMU0_SMMU0_RSCHD_FIFO_EMPTY31r, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000554, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_rschd_fifo_empty31_reg, + NULL, + NULL, + }, + { + "ept_flag", + SMMU0_SMMU0_EPT_FLAGr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000558, + (32/8), + 0, + 0, + 0, + 0, + 9, + g_smmu0_smmu0_ept_flag_reg, + NULL, + NULL, + }, + { + "ppu_soft_rst", + SMMU0_SMMU0_PPU_SOFT_RSTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000055c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_ppu_soft_rst_reg, + NULL, + NULL, + }, + { + "smmu0_as_mac_age_fc_cnt", + SMMU0_SMMU0_SMMU0_AS_MAC_AGE_FC_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000800, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_as_mac_age_fc_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_marc_se_parser_fc_cnt", + SMMU0_SMMU0_SMMU0_MARC_SE_PARSER_FC_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000804, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_marc_se_parser_fc_cnt_reg, + NULL, + NULL, + }, + { + "wr_arb_cpu_fc_cnt", + SMMU0_SMMU0_WR_ARB_CPU_FC_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000808, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_wr_arb_cpu_fc_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_lpm_as_fc_cnt", + SMMU0_SMMU0_SMMU0_LPM_AS_FC_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000080c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_lpm_as_fc_cnt_reg, + NULL, + NULL, + }, + { + "lpm_as_smmu0_fc_cnt", + SMMU0_SMMU0_LPM_AS_SMMU0_FC_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000810, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_lpm_as_smmu0_fc_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_etcam1_0_as_fc_cnt", + SMMU0_SMMU0_SMMU0_ETCAM1_0_AS_FC_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000814, + (32/8), + 0, + 1 + 1, + 0, + 4, + 1, + g_smmu0_smmu0_smmu0_etcam1_0_as_fc_cnt_reg, + NULL, + NULL, + }, + { + "as_etcam1_0_smmu0_fc_cnt", + SMMU0_SMMU0_AS_ETCAM1_0_SMMU0_FC_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000081c, + (32/8), + 0, + 1 + 1, + 0, + 4, + 1, + g_smmu0_smmu0_as_etcam1_0_smmu0_fc_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_ppu_mcast_fc_cnt", + SMMU0_SMMU0_SMMU0_PPU_MCAST_FC_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000824, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_ppu_mcast_fc_cnt_reg, + NULL, + NULL, + }, + { + "ppu_smmu0_mcast_fc_cnt", + SMMU0_SMMU0_PPU_SMMU0_MCAST_FC_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000828, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_ppu_smmu0_mcast_fc_cnt_reg, + NULL, + NULL, + }, + { + "odma_smmu0_tdm_fc_rsp_fc_cnt", + SMMU0_SMMU0_ODMA_SMMU0_TDM_FC_RSP_FC_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000082c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_odma_smmu0_tdm_fc_rsp_fc_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_odma_tdm_fc_key_fc_cnt", + SMMU0_SMMU0_SMMU0_ODMA_TDM_FC_KEY_FC_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000830, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_odma_tdm_fc_key_fc_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_odma_fc_cnt", + SMMU0_SMMU0_SMMU0_ODMA_FC_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000834, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_odma_fc_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_cfg_tab_rd_fc_cnt", + SMMU0_SMMU0_SMMU0_CFG_TAB_RD_FC_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000838, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_cfg_tab_rd_fc_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_stat_fc15_0_cnt", + SMMU0_SMMU0_SMMU0_STAT_FC15_0_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000083c, + (32/8), + 0, + 15 + 1, + 0, + 4, + 1, + g_smmu0_smmu0_smmu0_stat_fc15_0_cnt_reg, + NULL, + NULL, + }, + { + "stat_smmu0_fc15_0_cnt", + SMMU0_SMMU0_STAT_SMMU0_FC15_0_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000087c, + (32/8), + 0, + 15 + 1, + 0, + 4, + 1, + g_smmu0_smmu0_stat_smmu0_fc15_0_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_ppu_mex5_0_fc_cnt", + SMMU0_SMMU0_SMMU0_PPU_MEX5_0_FC_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000008bc, + (32/8), + 0, + 5 + 1, + 0, + 4, + 1, + g_smmu0_smmu0_smmu0_ppu_mex5_0_fc_cnt_reg, + NULL, + NULL, + }, + { + "ppu_smmu0_mex5_0_fc_cnt", + SMMU0_SMMU0_PPU_SMMU0_MEX5_0_FC_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000008d4, + (32/8), + 0, + 5 + 1, + 0, + 4, + 1, + g_smmu0_smmu0_ppu_smmu0_mex5_0_fc_cnt_reg, + NULL, + NULL, + }, + { + "as_smmu0_mac_age_req_cnt", + SMMU0_SMMU0_AS_SMMU0_MAC_AGE_REQ_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000008ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_as_smmu0_mac_age_req_cnt_reg, + NULL, + NULL, + }, + { + "se_parser_smmu0_marc_key_cnt", + SMMU0_SMMU0_SE_PARSER_SMMU0_MARC_KEY_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000008f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_se_parser_smmu0_marc_key_cnt_reg, + NULL, + NULL, + }, + { + "cpu_ind_rdat_cnt", + SMMU0_SMMU0_CPU_IND_RDAT_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000008f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_cpu_ind_rdat_cnt_reg, + NULL, + NULL, + }, + { + "cpu_ind_rd_req_cnt", + SMMU0_SMMU0_CPU_IND_RD_REQ_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000008f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_cpu_ind_rd_req_cnt_reg, + NULL, + NULL, + }, + { + "cpu_ind_wr_req_cnt", + SMMU0_SMMU0_CPU_IND_WR_REQ_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000008fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_cpu_ind_wr_req_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_plcr_rsp0_cnt", + SMMU0_SMMU0_SMMU0_PLCR_RSP0_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000900, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_plcr_rsp0_cnt_reg, + NULL, + NULL, + }, + { + "plcr_smmu0_req0_cnt", + SMMU0_SMMU0_PLCR_SMMU0_REQ0_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000904, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_plcr_smmu0_req0_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_lpm_as_rsp_cnt", + SMMU0_SMMU0_SMMU0_LPM_AS_RSP_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000908, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_lpm_as_rsp_cnt_reg, + NULL, + NULL, + }, + { + "lpm_as_smmu0_req_cnt", + SMMU0_SMMU0_LPM_AS_SMMU0_REQ_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000090c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_lpm_as_smmu0_req_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_etcam1_0_as_rsp_cnt", + SMMU0_SMMU0_SMMU0_ETCAM1_0_AS_RSP_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000910, + (32/8), + 0, + 1 + 1, + 0, + 4, + 1, + g_smmu0_smmu0_smmu0_etcam1_0_as_rsp_cnt_reg, + NULL, + NULL, + }, + { + "etcam1_0_as_smmu0_req_cnt", + SMMU0_SMMU0_ETCAM1_0_AS_SMMU0_REQ_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000918, + (32/8), + 0, + 1 + 1, + 0, + 4, + 1, + g_smmu0_smmu0_etcam1_0_as_smmu0_req_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_ppu_mcast_rsp_cnt", + SMMU0_SMMU0_SMMU0_PPU_MCAST_RSP_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000920, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_ppu_mcast_rsp_cnt_reg, + NULL, + NULL, + }, + { + "ppu_smmu0_mcast_key_cnt", + SMMU0_SMMU0_PPU_SMMU0_MCAST_KEY_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000924, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_ppu_smmu0_mcast_key_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_odma_tdm_mc_rsp_cnt", + SMMU0_SMMU0_SMMU0_ODMA_TDM_MC_RSP_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000928, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_odma_tdm_mc_rsp_cnt_reg, + NULL, + NULL, + }, + { + "odma_smmu0_tdm_mc_key_cnt", + SMMU0_SMMU0_ODMA_SMMU0_TDM_MC_KEY_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000092c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_odma_smmu0_tdm_mc_key_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_odma_rsp_cnt", + SMMU0_SMMU0_SMMU0_ODMA_RSP_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000930, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_odma_rsp_cnt_reg, + NULL, + NULL, + }, + { + "odma_smmu0_cmd_cnt", + SMMU0_SMMU0_ODMA_SMMU0_CMD_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000934, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_odma_smmu0_cmd_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_cfg_tab_rdat_cnt", + SMMU0_SMMU0_SMMU0_CFG_TAB_RDAT_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000938, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_smmu0_cfg_tab_rdat_cnt_reg, + NULL, + NULL, + }, + { + "cfg_smmu0_tab_rd_cnt", + SMMU0_SMMU0_CFG_SMMU0_TAB_RD_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x0000093c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_cfg_smmu0_tab_rd_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_stat_rsp15_0_cnt", + SMMU0_SMMU0_SMMU0_STAT_RSP15_0_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000940, + (32/8), + 0, + 15 + 1, + 0, + 4, + 1, + g_smmu0_smmu0_smmu0_stat_rsp15_0_cnt_reg, + NULL, + NULL, + }, + { + "stat_smmu0_req15_0_cnt", + SMMU0_SMMU0_STAT_SMMU0_REQ15_0_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000980, + (32/8), + 0, + 15 + 1, + 0, + 4, + 1, + g_smmu0_smmu0_stat_smmu0_req15_0_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_ppu_mex5_0_rsp_cnt", + SMMU0_SMMU0_SMMU0_PPU_MEX5_0_RSP_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000009c0, + (32/8), + 0, + 5 + 1, + 0, + 4, + 1, + g_smmu0_smmu0_smmu0_ppu_mex5_0_rsp_cnt_reg, + NULL, + NULL, + }, + { + "ppu_smmu0_mex5_0_key_cnt", + SMMU0_SMMU0_PPU_SMMU0_MEX5_0_KEY_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000009d8, + (32/8), + 0, + 5 + 1, + 0, + 4, + 1, + g_smmu0_smmu0_ppu_smmu0_mex5_0_key_cnt_reg, + NULL, + NULL, + }, + { + "ftm_stat_smmu0_req0_cnt", + SMMU0_SMMU0_FTM_STAT_SMMU0_REQ0_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000009f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_ftm_stat_smmu0_req0_cnt_reg, + NULL, + NULL, + }, + { + "ftm_stat_smmu0_req1_cnt", + SMMU0_SMMU0_FTM_STAT_SMMU0_REQ1_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000009f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_ftm_stat_smmu0_req1_cnt_reg, + NULL, + NULL, + }, + { + "etm_stat_smmu0_req0_cnt", + SMMU0_SMMU0_ETM_STAT_SMMU0_REQ0_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000009f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_etm_stat_smmu0_req0_cnt_reg, + NULL, + NULL, + }, + { + "etm_stat_smmu0_req1_cnt", + SMMU0_SMMU0_ETM_STAT_SMMU0_REQ1_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x000009fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_smmu0_smmu0_etm_stat_smmu0_req1_cnt_reg, + NULL, + NULL, + }, + { + "req_eram0_31_rd_cnt", + SMMU0_SMMU0_REQ_ERAM0_31_RD_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000a00, + (32/8), + 0, + 31 + 1, + 0, + 8, + 1, + g_smmu0_smmu0_req_eram0_31_rd_cnt_reg, + NULL, + NULL, + }, + { + "req_eram0_31_wr_cnt", + SMMU0_SMMU0_REQ_ERAM0_31_WR_CNTr, + SMMU0, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU0_BASE_ADDR + MODULE_SE_SMMU0_BASE_ADDR + 0x00000a04, + (32/8), + 0, + 31 + 1, + 0, + 8, + 1, + g_smmu0_smmu0_req_eram0_31_wr_cnt_reg, + NULL, + NULL, + }, + { + "ddr_wdat1", + SE_SMMU1_DDR_WDAT1r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000004, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ddr_wdat1_reg, + NULL, + NULL, + }, + { + "ddr_wdat2", + SE_SMMU1_DDR_WDAT2r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ddr_wdat2_reg, + NULL, + NULL, + }, + { + "ddr_wdat3", + SE_SMMU1_DDR_WDAT3r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000000c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ddr_wdat3_reg, + NULL, + NULL, + }, + { + "ddr_wdat4", + SE_SMMU1_DDR_WDAT4r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000010, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ddr_wdat4_reg, + NULL, + NULL, + }, + { + "ddr_wdat5", + SE_SMMU1_DDR_WDAT5r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000014, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ddr_wdat5_reg, + NULL, + NULL, + }, + { + "ddr_wdat6", + SE_SMMU1_DDR_WDAT6r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000018, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ddr_wdat6_reg, + NULL, + NULL, + }, + { + "ddr_wdat7", + SE_SMMU1_DDR_WDAT7r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000001c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ddr_wdat7_reg, + NULL, + NULL, + }, + { + "ddr_wdat8", + SE_SMMU1_DDR_WDAT8r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000020, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ddr_wdat8_reg, + NULL, + NULL, + }, + { + "ddr_wdat9", + SE_SMMU1_DDR_WDAT9r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000024, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ddr_wdat9_reg, + NULL, + NULL, + }, + { + "ddr_wdat10", + SE_SMMU1_DDR_WDAT10r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000028, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ddr_wdat10_reg, + NULL, + NULL, + }, + { + "ddr_wdat11", + SE_SMMU1_DDR_WDAT11r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000002c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ddr_wdat11_reg, + NULL, + NULL, + }, + { + "ddr_wdat12", + SE_SMMU1_DDR_WDAT12r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000030, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ddr_wdat12_reg, + NULL, + NULL, + }, + { + "ddr_wdat13", + SE_SMMU1_DDR_WDAT13r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000034, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ddr_wdat13_reg, + NULL, + NULL, + }, + { + "ddr_wdat14", + SE_SMMU1_DDR_WDAT14r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000038, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ddr_wdat14_reg, + NULL, + NULL, + }, + { + "ddr_wdat15", + SE_SMMU1_DDR_WDAT15r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000003c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ddr_wdat15_reg, + NULL, + NULL, + }, + { + "cnt_stat_cache_en", + SE_SMMU1_CNT_STAT_CACHE_ENr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000040, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cnt_stat_cache_en_reg, + NULL, + NULL, + }, + { + "cnt_stat_cache_clr", + SE_SMMU1_CNT_STAT_CACHE_CLRr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000044, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cnt_stat_cache_clr_reg, + NULL, + NULL, + }, + { + "cnt_stat_cache_req_63_32", + SE_SMMU1_CNT_STAT_CACHE_REQ_63_32r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000048, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cnt_stat_cache_req_63_32_reg, + NULL, + NULL, + }, + { + "cnt_stat_cache_req_31_0", + SE_SMMU1_CNT_STAT_CACHE_REQ_31_0r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000004c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cnt_stat_cache_req_31_0_reg, + NULL, + NULL, + }, + { + "cnt_stat_cache_hit_63_32", + SE_SMMU1_CNT_STAT_CACHE_HIT_63_32r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000050, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cnt_stat_cache_hit_63_32_reg, + NULL, + NULL, + }, + { + "cnt_stat_cache_hit_31_0", + SE_SMMU1_CNT_STAT_CACHE_HIT_31_0r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000054, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cnt_stat_cache_hit_31_0_reg, + NULL, + NULL, + }, + { + "ddr_cmd0", + SE_SMMU1_DDR_CMD0r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000060, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_se_smmu1_ddr_cmd0_reg, + NULL, + NULL, + }, + { + "info_addr", + SE_SMMU1_INFO_ADDRr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000064, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_info_addr_reg, + NULL, + NULL, + }, + { + "ddr_cmd1", + SE_SMMU1_DDR_CMD1r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000068, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se_smmu1_ddr_cmd1_reg, + NULL, + NULL, + }, + { + "clr_start_addr", + SE_SMMU1_CLR_START_ADDRr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000006c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_clr_start_addr_reg, + NULL, + NULL, + }, + { + "clr_end_addr", + SE_SMMU1_CLR_END_ADDRr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000070, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_clr_end_addr_reg, + NULL, + NULL, + }, + { + "clr_tbl_en", + SE_SMMU1_CLR_TBL_ENr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000074, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se_smmu1_clr_tbl_en_reg, + NULL, + NULL, + }, + { + "debug_cnt_mode", + SE_SMMU1_DEBUG_CNT_MODEr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000084, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se_smmu1_debug_cnt_mode_reg, + NULL, + NULL, + }, + { + "init_done", + SE_SMMU1_INIT_DONEr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000088, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_se_smmu1_init_done_reg, + NULL, + NULL, + }, + { + "cpu_rsp_rd_done", + SE_SMMU1_CPU_RSP_RD_DONEr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000008c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cpu_rsp_rd_done_reg, + NULL, + NULL, + }, + { + "ksch_oam_sp_en", + SE_SMMU1_KSCH_OAM_SP_ENr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000090, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ksch_oam_sp_en_reg, + NULL, + NULL, + }, + { + "cfg_cache_en", + SE_SMMU1_CFG_CACHE_ENr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000094, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cfg_cache_en_reg, + NULL, + NULL, + }, + { + "cache_age_en", + SE_SMMU1_CACHE_AGE_ENr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000000b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cache_age_en_reg, + NULL, + NULL, + }, + { + "cpu_rdat0", + SE_SMMU1_CPU_RDAT0r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000000c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cpu_rdat0_reg, + NULL, + NULL, + }, + { + "cpu_rdat1", + SE_SMMU1_CPU_RDAT1r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000000c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cpu_rdat1_reg, + NULL, + NULL, + }, + { + "cpu_rdat2", + SE_SMMU1_CPU_RDAT2r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000000c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cpu_rdat2_reg, + NULL, + NULL, + }, + { + "cpu_rdat3", + SE_SMMU1_CPU_RDAT3r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000000cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cpu_rdat3_reg, + NULL, + NULL, + }, + { + "cpu_rdat4", + SE_SMMU1_CPU_RDAT4r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000000d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cpu_rdat4_reg, + NULL, + NULL, + }, + { + "cpu_rdat5", + SE_SMMU1_CPU_RDAT5r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000000d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cpu_rdat5_reg, + NULL, + NULL, + }, + { + "cpu_rdat6", + SE_SMMU1_CPU_RDAT6r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000000d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cpu_rdat6_reg, + NULL, + NULL, + }, + { + "cpu_rdat7", + SE_SMMU1_CPU_RDAT7r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000000dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cpu_rdat7_reg, + NULL, + NULL, + }, + { + "cpu_rdat8", + SE_SMMU1_CPU_RDAT8r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000000e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cpu_rdat8_reg, + NULL, + NULL, + }, + { + "cpu_rdat9", + SE_SMMU1_CPU_RDAT9r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000000e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cpu_rdat9_reg, + NULL, + NULL, + }, + { + "cpu_rdat10", + SE_SMMU1_CPU_RDAT10r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000000e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cpu_rdat10_reg, + NULL, + NULL, + }, + { + "cpu_rdat11", + SE_SMMU1_CPU_RDAT11r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000000ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cpu_rdat11_reg, + NULL, + NULL, + }, + { + "cpu_rdat12", + SE_SMMU1_CPU_RDAT12r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000000f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cpu_rdat12_reg, + NULL, + NULL, + }, + { + "cpu_rdat13", + SE_SMMU1_CPU_RDAT13r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000000f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cpu_rdat13_reg, + NULL, + NULL, + }, + { + "cpu_rdat14", + SE_SMMU1_CPU_RDAT14r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000000f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cpu_rdat14_reg, + NULL, + NULL, + }, + { + "cpu_rdat15", + SE_SMMU1_CPU_RDAT15r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000000fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cpu_rdat15_reg, + NULL, + NULL, + }, + { + "ctrl_cpu_rd_rdy", + SE_SMMU1_CTRL_CPU_RD_RDYr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000100, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ctrl_cpu_rd_rdy_reg, + NULL, + NULL, + }, + { + "cpu_warbi_rdy_cfg", + SE_SMMU1_CPU_WARBI_RDY_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000104, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cpu_warbi_rdy_cfg_reg, + NULL, + NULL, + }, + { + "dir_arbi_cpu_rpful", + SE_SMMU1_DIR_ARBI_CPU_RPFULr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000108, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se_smmu1_dir_arbi_cpu_rpful_reg, + NULL, + NULL, + }, + { + "dir_arbi_wpful", + SE_SMMU1_DIR_ARBI_WPFULr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000110, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se_smmu1_dir_arbi_wpful_reg, + NULL, + NULL, + }, + { + "cfg_wr_arbi_pful0", + SE_SMMU1_CFG_WR_ARBI_PFUL0r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000118, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se_smmu1_cfg_wr_arbi_pful0_reg, + NULL, + NULL, + }, + { + "cfg_wr_arbi_pful1", + SE_SMMU1_CFG_WR_ARBI_PFUL1r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000011c, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se_smmu1_cfg_wr_arbi_pful1_reg, + NULL, + NULL, + }, + { + "smmu1_wdone_pful_cfg", + SE_SMMU1_SMMU1_WDONE_PFUL_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000124, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_wdone_pful_cfg_reg, + NULL, + NULL, + }, + { + "stat_rate_cfg_cnt", + SE_SMMU1_STAT_RATE_CFG_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000128, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_stat_rate_cfg_cnt_reg, + NULL, + NULL, + }, + { + "ftm_rate_cfg_cnt", + SE_SMMU1_FTM_RATE_CFG_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000012c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ftm_rate_cfg_cnt_reg, + NULL, + NULL, + }, + { + "etm_rate_cfg_cnt", + SE_SMMU1_ETM_RATE_CFG_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000130, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_etm_rate_cfg_cnt_reg, + NULL, + NULL, + }, + { + "dir_rate_cfg_cnt", + SE_SMMU1_DIR_RATE_CFG_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000134, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_dir_rate_cfg_cnt_reg, + NULL, + NULL, + }, + { + "hash_rate_cfg_cnt", + SE_SMMU1_HASH_RATE_CFG_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000138, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_hash_rate_cfg_cnt_reg, + NULL, + NULL, + }, + { + "ftm_tbl_cfg", + SE_SMMU1_FTM_TBL_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000001c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ftm_tbl_cfg_reg, + NULL, + NULL, + }, + { + "lpm_v4_as_tbl_cfg", + SE_SMMU1_LPM_V4_AS_TBL_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000001d0, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_se_smmu1_lpm_v4_as_tbl_cfg_reg, + NULL, + NULL, + }, + { + "lpm_v4_tbl_cfg", + SE_SMMU1_LPM_V4_TBL_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000001d4, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_se_smmu1_lpm_v4_tbl_cfg_reg, + NULL, + NULL, + }, + { + "lpm_v6_tbl_cfg", + SE_SMMU1_LPM_V6_TBL_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000001d8, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_se_smmu1_lpm_v6_tbl_cfg_reg, + NULL, + NULL, + }, + { + "lpm_v6_as_tbl_cfg", + SE_SMMU1_LPM_V6_AS_TBL_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000001dc, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_se_smmu1_lpm_v6_as_tbl_cfg_reg, + NULL, + NULL, + }, + { + "dma_tbl_cfg", + SE_SMMU1_DMA_TBL_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000001e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_dma_tbl_cfg_reg, + NULL, + NULL, + }, + { + "oam_tbl_cfg", + SE_SMMU1_OAM_TBL_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000001e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_oam_tbl_cfg_reg, + NULL, + NULL, + }, + { + "ctrl_rpar_cpu_pful", + SE_SMMU1_CTRL_RPAR_CPU_PFULr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000001e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ctrl_rpar_cpu_pful_reg, + NULL, + NULL, + }, + { + "cfg_ksch_dir_pful", + SE_SMMU1_CFG_KSCH_DIR_PFULr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000001ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cfg_ksch_dir_pful_reg, + NULL, + NULL, + }, + { + "cfg_ksch_hash_pful", + SE_SMMU1_CFG_KSCH_HASH_PFULr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000001f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cfg_ksch_hash_pful_reg, + NULL, + NULL, + }, + { + "cfg_ksch_lpm_pful", + SE_SMMU1_CFG_KSCH_LPM_PFULr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000001f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cfg_ksch_lpm_pful_reg, + NULL, + NULL, + }, + { + "cfg_ksch_lpm_as_pful", + SE_SMMU1_CFG_KSCH_LPM_AS_PFULr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000001f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cfg_ksch_lpm_as_pful_reg, + NULL, + NULL, + }, + { + "cfg_ksch_stat_pful", + SE_SMMU1_CFG_KSCH_STAT_PFULr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000001fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cfg_ksch_stat_pful_reg, + NULL, + NULL, + }, + { + "cfg_ksch_tm_pful", + SE_SMMU1_CFG_KSCH_TM_PFULr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000200, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cfg_ksch_tm_pful_reg, + NULL, + NULL, + }, + { + "cfg_ksch_oam_pful", + SE_SMMU1_CFG_KSCH_OAM_PFULr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000204, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cfg_ksch_oam_pful_reg, + NULL, + NULL, + }, + { + "cfg_ksch_dma_pful", + SE_SMMU1_CFG_KSCH_DMA_PFULr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000208, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cfg_ksch_dma_pful_reg, + NULL, + NULL, + }, + { + "ctrl_wfifo_cfg", + SE_SMMU1_CTRL_WFIFO_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000230, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ctrl_wfifo_cfg_reg, + NULL, + NULL, + }, + { + "rsch_hash_ptr_cfg", + SE_SMMU1_RSCH_HASH_PTR_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000240, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_rsch_hash_ptr_cfg_reg, + NULL, + NULL, + }, + { + "rsch_lpm_ptr_cfg", + SE_SMMU1_RSCH_LPM_PTR_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000244, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_rsch_lpm_ptr_cfg_reg, + NULL, + NULL, + }, + { + "rsch_lpm_as_ptr_cfg", + SE_SMMU1_RSCH_LPM_AS_PTR_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000248, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_rsch_lpm_as_ptr_cfg_reg, + NULL, + NULL, + }, + { + "rsch_stat_ptr_cfg", + SE_SMMU1_RSCH_STAT_PTR_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000024c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_rsch_stat_ptr_cfg_reg, + NULL, + NULL, + }, + { + "rsch_oam_ptr_cfg", + SE_SMMU1_RSCH_OAM_PTR_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000250, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_rsch_oam_ptr_cfg_reg, + NULL, + NULL, + }, + { + "rschd_fifo_pept_cfg", + SE_SMMU1_RSCHD_FIFO_PEPT_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000254, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_rschd_fifo_pept_cfg_reg, + NULL, + NULL, + }, + { + "dir_fifo_pful_cfg", + SE_SMMU1_DIR_FIFO_PFUL_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000258, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_dir_fifo_pful_cfg_reg, + NULL, + NULL, + }, + { + "hash_fifo_pful_cfg", + SE_SMMU1_HASH_FIFO_PFUL_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000025c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_hash_fifo_pful_cfg_reg, + NULL, + NULL, + }, + { + "lpm_fifo_pful_cfg", + SE_SMMU1_LPM_FIFO_PFUL_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000260, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_lpm_fifo_pful_cfg_reg, + NULL, + NULL, + }, + { + "lpm_as_fifo_pful_cfg", + SE_SMMU1_LPM_AS_FIFO_PFUL_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000264, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_lpm_as_fifo_pful_cfg_reg, + NULL, + NULL, + }, + { + "stat_fifo_pful_cfg", + SE_SMMU1_STAT_FIFO_PFUL_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000268, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_stat_fifo_pful_cfg_reg, + NULL, + NULL, + }, + { + "ftm_fifo_pful_cfg", + SE_SMMU1_FTM_FIFO_PFUL_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000026c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ftm_fifo_pful_cfg_reg, + NULL, + NULL, + }, + { + "etm_fifo_pful_cfg", + SE_SMMU1_ETM_FIFO_PFUL_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000270, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_etm_fifo_pful_cfg_reg, + NULL, + NULL, + }, + { + "oam_fifo_pful_cfg", + SE_SMMU1_OAM_FIFO_PFUL_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000274, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_oam_fifo_pful_cfg_reg, + NULL, + NULL, + }, + { + "dma_fifo_pful_cfg", + SE_SMMU1_DMA_FIFO_PFUL_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000278, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_dma_fifo_pful_cfg_reg, + NULL, + NULL, + }, + { + "cache_rsp_rr_fifo_cfg", + SE_SMMU1_CACHE_RSP_RR_FIFO_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000027c, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se_smmu1_cache_rsp_rr_fifo_cfg_reg, + NULL, + NULL, + }, + { + "ddr_rsp_rr_fifo_cfg", + SE_SMMU1_DDR_RSP_RR_FIFO_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000280, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se_smmu1_ddr_rsp_rr_fifo_cfg_reg, + NULL, + NULL, + }, + { + "cpu_cahce_fifo_cfg", + SE_SMMU1_CPU_CAHCE_FIFO_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000284, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se_smmu1_cpu_cahce_fifo_cfg_reg, + NULL, + NULL, + }, + { + "cache_rsp_fifo_cfg", + SE_SMMU1_CACHE_RSP_FIFO_CFGr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000028c, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se_smmu1_cache_rsp_fifo_cfg_reg, + NULL, + NULL, + }, + { + "test_state", + SE_SMMU1_TEST_STATEr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000002c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_test_state_reg, + NULL, + NULL, + }, + { + "cache_fifo_ept", + SE_SMMU1_CACHE_FIFO_EPTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000002f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cache_fifo_ept_reg, + NULL, + NULL, + }, + { + "rr_fifo_ept", + SE_SMMU1_RR_FIFO_EPTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000002fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_rr_fifo_ept_reg, + NULL, + NULL, + }, + { + "wr_fifo_ept", + SE_SMMU1_WR_FIFO_EPTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000304, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_wr_fifo_ept_reg, + NULL, + NULL, + }, + { + "wdone_fifo_ept", + SE_SMMU1_WDONE_FIFO_EPTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000308, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_wdone_fifo_ept_reg, + NULL, + NULL, + }, + { + "kschd_fifo_ept0", + SE_SMMU1_KSCHD_FIFO_EPT0r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000318, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_kschd_fifo_ept0_reg, + NULL, + NULL, + }, + { + "cash_fifo_ept", + SE_SMMU1_CASH_FIFO_EPTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000031c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cash_fifo_ept_reg, + NULL, + NULL, + }, + { + "ctrl_fifo_ept", + SE_SMMU1_CTRL_FIFO_EPTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000320, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ctrl_fifo_ept_reg, + NULL, + NULL, + }, + { + "smmu1_rschd_ept3", + SE_SMMU1_SMMU1_RSCHD_EPT3r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000324, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_rschd_ept3_reg, + NULL, + NULL, + }, + { + "smmu1_rschd_ept2", + SE_SMMU1_SMMU1_RSCHD_EPT2r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000328, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_rschd_ept2_reg, + NULL, + NULL, + }, + { + "smmu1_rschd_ept1", + SE_SMMU1_SMMU1_RSCHD_EPT1r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000032c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_rschd_ept1_reg, + NULL, + NULL, + }, + { + "smmu1_rschd_ept0", + SE_SMMU1_SMMU1_RSCHD_EPT0r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000330, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_rschd_ept0_reg, + NULL, + NULL, + }, + { + "cash0_ecc_err_addr", + SE_SMMU1_CASH0_ECC_ERR_ADDRr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000334, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cash0_ecc_err_addr_reg, + NULL, + NULL, + }, + { + "arbi_cpu_wr_rdy", + SE_SMMU1_ARBI_CPU_WR_RDYr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000354, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_arbi_cpu_wr_rdy_reg, + NULL, + NULL, + }, + { + "smmu1_int_0_en", + SE_SMMU1_SMMU1_INT_0_ENr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000480, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_int_0_en_reg, + NULL, + NULL, + }, + { + "smmu1_int_0_mask", + SE_SMMU1_SMMU1_INT_0_MASKr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000484, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_int_0_mask_reg, + NULL, + NULL, + }, + { + "smmu1_int_1_en", + SE_SMMU1_SMMU1_INT_1_ENr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000488, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_int_1_en_reg, + NULL, + NULL, + }, + { + "smmu1_int_1_mask", + SE_SMMU1_SMMU1_INT_1_MASKr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000048c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_int_1_mask_reg, + NULL, + NULL, + }, + { + "smmu1_int_2_en", + SE_SMMU1_SMMU1_INT_2_ENr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000490, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_int_2_en_reg, + NULL, + NULL, + }, + { + "smmu1_int_2_mask", + SE_SMMU1_SMMU1_INT_2_MASKr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000494, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_int_2_mask_reg, + NULL, + NULL, + }, + { + "smmu1_int_3_en", + SE_SMMU1_SMMU1_INT_3_ENr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000498, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_int_3_en_reg, + NULL, + NULL, + }, + { + "smmu1_int_3_mask", + SE_SMMU1_SMMU1_INT_3_MASKr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000049c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_int_3_mask_reg, + NULL, + NULL, + }, + { + "smmu1_int_0_status", + SE_SMMU1_SMMU1_INT_0_STATUSr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000540, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_int_0_status_reg, + NULL, + NULL, + }, + { + "smmu1_int_1_status", + SE_SMMU1_SMMU1_INT_1_STATUSr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000544, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_int_1_status_reg, + NULL, + NULL, + }, + { + "smmu1_int_2_status", + SE_SMMU1_SMMU1_INT_2_STATUSr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000548, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_int_2_status_reg, + NULL, + NULL, + }, + { + "smmu1_int_3_status", + SE_SMMU1_SMMU1_INT_3_STATUSr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000054c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_int_3_status_reg, + NULL, + NULL, + }, + { + "smmu1_int_status", + SE_SMMU1_SMMU1_INT_STATUSr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000005a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_int_status_reg, + NULL, + NULL, + }, + { + "ctrl_to_cash7_0_fc_cnt", + SE_SMMU1_CTRL_TO_CASH7_0_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000600, + (32/8), + 0, + 7 + 1, + 0, + 24, + 1, + g_se_smmu1_ctrl_to_cash7_0_fc_cnt_reg, + NULL, + NULL, + }, + { + "cash7_0_to_ctrl_req_cnt", + SE_SMMU1_CASH7_0_TO_CTRL_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000604, + (32/8), + 0, + 7 + 1, + 0, + 24, + 1, + g_se_smmu1_cash7_0_to_ctrl_req_cnt_reg, + NULL, + NULL, + }, + { + "rschd_to_cache7_fc_cnt", + SE_SMMU1_RSCHD_TO_CACHE7_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000608, + (32/8), + 0, + 7 + 1, + 0, + 24, + 1, + g_se_smmu1_rschd_to_cache7_fc_cnt_reg, + NULL, + NULL, + }, + { + "cash7_to_cache_rsp_cnt", + SE_SMMU1_CASH7_TO_CACHE_RSP_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000060c, + (32/8), + 0, + 7 + 1, + 0, + 24, + 1, + g_se_smmu1_cash7_to_cache_rsp_cnt_reg, + NULL, + NULL, + }, + { + "cash7_to_ctrl_fc_cnt", + SE_SMMU1_CASH7_TO_CTRL_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000610, + (32/8), + 0, + 7 + 1, + 0, + 24, + 1, + g_se_smmu1_cash7_to_ctrl_fc_cnt_reg, + NULL, + NULL, + }, + { + "ctrl_to_cash7_0_rsp_cnt", + SE_SMMU1_CTRL_TO_CASH7_0_RSP_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000614, + (32/8), + 0, + 7 + 1, + 0, + 24, + 1, + g_se_smmu1_ctrl_to_cash7_0_rsp_cnt_reg, + NULL, + NULL, + }, + { + "kschd_to_cache7_0_req_cnt", + SE_SMMU1_KSCHD_TO_CACHE7_0_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000006c0, + (32/8), + 0, + 7 + 1, + 0, + 4, + 1, + g_se_smmu1_kschd_to_cache7_0_req_cnt_reg, + NULL, + NULL, + }, + { + "cache7_0_to_kschd_fc_cnt", + SE_SMMU1_CACHE7_0_TO_KSCHD_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000006e0, + (32/8), + 0, + 7 + 1, + 0, + 4, + 1, + g_se_smmu1_cache7_0_to_kschd_fc_cnt_reg, + NULL, + NULL, + }, + { + "dma_to_smmu1_rd_req_cnt", + SE_SMMU1_DMA_TO_SMMU1_RD_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000700, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_dma_to_smmu1_rd_req_cnt_reg, + NULL, + NULL, + }, + { + "oam_to_kschd_req_cnt", + SE_SMMU1_OAM_TO_KSCHD_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000704, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_oam_to_kschd_req_cnt_reg, + NULL, + NULL, + }, + { + "oam_rr_state_rsp_cnt", + SE_SMMU1_OAM_RR_STATE_RSP_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000708, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_oam_rr_state_rsp_cnt_reg, + NULL, + NULL, + }, + { + "oam_clash_info_cnt", + SE_SMMU1_OAM_CLASH_INFO_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000070c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_oam_clash_info_cnt_reg, + NULL, + NULL, + }, + { + "oam_to_rr_req_cnt", + SE_SMMU1_OAM_TO_RR_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000710, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_oam_to_rr_req_cnt_reg, + NULL, + NULL, + }, + { + "lpm_as_to_kschd_req_cnt", + SE_SMMU1_LPM_AS_TO_KSCHD_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000714, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_lpm_as_to_kschd_req_cnt_reg, + NULL, + NULL, + }, + { + "lpm_as_rr_state_rsp_cnt", + SE_SMMU1_LPM_AS_RR_STATE_RSP_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000718, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_lpm_as_rr_state_rsp_cnt_reg, + NULL, + NULL, + }, + { + "lpm_as_clash_info_cnt", + SE_SMMU1_LPM_AS_CLASH_INFO_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000071c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_lpm_as_clash_info_cnt_reg, + NULL, + NULL, + }, + { + "lpm_as_to_rr_req_cnt", + SE_SMMU1_LPM_AS_TO_RR_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000720, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_lpm_as_to_rr_req_cnt_reg, + NULL, + NULL, + }, + { + "lpm_to_kschd_req_cnt", + SE_SMMU1_LPM_TO_KSCHD_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000724, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_lpm_to_kschd_req_cnt_reg, + NULL, + NULL, + }, + { + "lpm_rr_state_rsp_cnt", + SE_SMMU1_LPM_RR_STATE_RSP_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000728, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_lpm_rr_state_rsp_cnt_reg, + NULL, + NULL, + }, + { + "lpm_clash_info_cnt", + SE_SMMU1_LPM_CLASH_INFO_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000072c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_lpm_clash_info_cnt_reg, + NULL, + NULL, + }, + { + "lpm_to_rr_req_cnt", + SE_SMMU1_LPM_TO_RR_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000730, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_lpm_to_rr_req_cnt_reg, + NULL, + NULL, + }, + { + "hash3_0_to_kschd_req_cnt", + SE_SMMU1_HASH3_0_TO_KSCHD_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000734, + (32/8), + 0, + 3 + 1, + 0, + 16, + 1, + g_se_smmu1_hash3_0_to_kschd_req_cnt_reg, + NULL, + NULL, + }, + { + "hash3_0_rr_state_rsp_cnt", + SE_SMMU1_HASH3_0_RR_STATE_RSP_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000738, + (32/8), + 0, + 3 + 1, + 0, + 16, + 1, + g_se_smmu1_hash3_0_rr_state_rsp_cnt_reg, + NULL, + NULL, + }, + { + "hash3_0_clash_info_cnt", + SE_SMMU1_HASH3_0_CLASH_INFO_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000073c, + (32/8), + 0, + 3 + 1, + 0, + 16, + 1, + g_se_smmu1_hash3_0_clash_info_cnt_reg, + NULL, + NULL, + }, + { + "hash3_0_to_rr_req_cnt", + SE_SMMU1_HASH3_0_TO_RR_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000740, + (32/8), + 0, + 3 + 1, + 0, + 16, + 1, + g_se_smmu1_hash3_0_to_rr_req_cnt_reg, + NULL, + NULL, + }, + { + "dir3_0_to_kschd_req_cnt", + SE_SMMU1_DIR3_0_TO_KSCHD_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000774, + (32/8), + 0, + 3 + 1, + 0, + 8, + 1, + g_se_smmu1_dir3_0_to_kschd_req_cnt_reg, + NULL, + NULL, + }, + { + "dir3_0_clash_info_cnt", + SE_SMMU1_DIR3_0_CLASH_INFO_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000778, + (32/8), + 0, + 3 + 1, + 0, + 8, + 1, + g_se_smmu1_dir3_0_clash_info_cnt_reg, + NULL, + NULL, + }, + { + "dir_tbl_wr_req_cnt", + SE_SMMU1_DIR_TBL_WR_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000794, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_dir_tbl_wr_req_cnt_reg, + NULL, + NULL, + }, + { + "warbi_to_dir_tbl_warbi_fc_cnt", + SE_SMMU1_WARBI_TO_DIR_TBL_WARBI_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000798, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_warbi_to_dir_tbl_warbi_fc_cnt_reg, + NULL, + NULL, + }, + { + "dir3_0_to_bank_rr_req_cnt", + SE_SMMU1_DIR3_0_TO_BANK_RR_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000079c, + (32/8), + 0, + 3 + 1, + 0, + 4, + 1, + g_se_smmu1_dir3_0_to_bank_rr_req_cnt_reg, + NULL, + NULL, + }, + { + "kschd_to_dir3_0_fc_cnt", + SE_SMMU1_KSCHD_TO_DIR3_0_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000007ac, + (32/8), + 0, + 3 + 1, + 0, + 4, + 1, + g_se_smmu1_kschd_to_dir3_0_fc_cnt_reg, + NULL, + NULL, + }, + { + "dir3_0_rr_state_rsp_cnt", + SE_SMMU1_DIR3_0_RR_STATE_RSP_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000007bc, + (32/8), + 0, + 3 + 1, + 0, + 4, + 1, + g_se_smmu1_dir3_0_rr_state_rsp_cnt_reg, + NULL, + NULL, + }, + { + "wr_done_to_warbi_fc_cnt", + SE_SMMU1_WR_DONE_TO_WARBI_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000007cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_wr_done_to_warbi_fc_cnt_reg, + NULL, + NULL, + }, + { + "wr_done_ptr_req_cnt", + SE_SMMU1_WR_DONE_PTR_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000007d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_wr_done_ptr_req_cnt_reg, + NULL, + NULL, + }, + { + "ctrl7_0_to_warbi_fc_cnt", + SE_SMMU1_CTRL7_0_TO_WARBI_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000007d4, + (32/8), + 0, + 7 + 1, + 0, + 4, + 1, + g_se_smmu1_ctrl7_0_to_warbi_fc_cnt_reg, + NULL, + NULL, + }, + { + "warbi_to_ctrl7_0_wr_req_cnt", + SE_SMMU1_WARBI_TO_CTRL7_0_WR_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000007f4, + (32/8), + 0, + 7 + 1, + 0, + 4, + 1, + g_se_smmu1_warbi_to_ctrl7_0_wr_req_cnt_reg, + NULL, + NULL, + }, + { + "warbi_to_cash7_0_wr_req_cnt", + SE_SMMU1_WARBI_TO_CASH7_0_WR_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000814, + (32/8), + 0, + 7 + 1, + 0, + 4, + 1, + g_se_smmu1_warbi_to_cash7_0_wr_req_cnt_reg, + NULL, + NULL, + }, + { + "warbi_to_cpu_wr_fc_cnt", + SE_SMMU1_WARBI_TO_CPU_WR_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000834, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_warbi_to_cpu_wr_fc_cnt_reg, + NULL, + NULL, + }, + { + "cpu_wr_req_cnt", + SE_SMMU1_CPU_WR_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000838, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cpu_wr_req_cnt_reg, + NULL, + NULL, + }, + { + "ctrl7_0_to_cpu_rd_rsp_cnt", + SE_SMMU1_CTRL7_0_TO_CPU_RD_RSP_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000083c, + (32/8), + 0, + 7 + 1, + 0, + 4, + 1, + g_se_smmu1_ctrl7_0_to_cpu_rd_rsp_cnt_reg, + NULL, + NULL, + }, + { + "cpu_to_ctrl7_0_rd_req_cnt", + SE_SMMU1_CPU_TO_CTRL7_0_RD_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000085c, + (32/8), + 0, + 7 + 1, + 0, + 4, + 1, + g_se_smmu1_cpu_to_ctrl7_0_rd_req_cnt_reg, + NULL, + NULL, + }, + { + "cpu_rd_dir_tbl_rsp_cnt", + SE_SMMU1_CPU_RD_DIR_TBL_RSP_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000087c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cpu_rd_dir_tbl_rsp_cnt_reg, + NULL, + NULL, + }, + { + "cpu_to_dir_tbl_rd_wr_req_cnt", + SE_SMMU1_CPU_TO_DIR_TBL_RD_WR_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000880, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_cpu_to_dir_tbl_rd_wr_req_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_to_mmu_7_0_rsp_fc_cnt", + SE_SMMU1_SMMU1_TO_MMU_7_0_RSP_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000884, + (32/8), + 0, + 7 + 1, + 0, + 24, + 1, + g_se_smmu1_smmu1_to_mmu_7_0_rsp_fc_cnt_reg, + NULL, + NULL, + }, + { + "mmu_7_0_to_smmu1_rd_rsp_cnt", + SE_SMMU1_MMU_7_0_TO_SMMU1_RD_RSP_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000888, + (32/8), + 0, + 7 + 1, + 0, + 24, + 1, + g_se_smmu1_mmu_7_0_to_smmu1_rd_rsp_cnt_reg, + NULL, + NULL, + }, + { + "mmu_7_0_to_smmu1_rd_fc_cnt", + SE_SMMU1_MMU_7_0_TO_SMMU1_RD_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000088c, + (32/8), + 0, + 7 + 1, + 0, + 24, + 1, + g_se_smmu1_mmu_7_0_to_smmu1_rd_fc_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_to_mmu_7_rd_req_cnt", + SE_SMMU1_SMMU1_TO_MMU_7_RD_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000890, + (32/8), + 0, + 7 + 1, + 0, + 24, + 1, + g_se_smmu1_smmu1_to_mmu_7_rd_req_cnt_reg, + NULL, + NULL, + }, + { + "mmu_7_to_smmu1_wr_fc_cnt", + SE_SMMU1_MMU_7_TO_SMMU1_WR_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000894, + (32/8), + 0, + 7 + 1, + 0, + 24, + 1, + g_se_smmu1_mmu_7_to_smmu1_wr_fc_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_to_mmu_7_0_wr_req_cnt", + SE_SMMU1_SMMU1_TO_MMU_7_0_WR_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000898, + (32/8), + 0, + 7 + 1, + 0, + 24, + 1, + g_se_smmu1_smmu1_to_mmu_7_0_wr_req_cnt_reg, + NULL, + NULL, + }, + { + "se_to_smmu1_wr_rsp_fc_cnt", + SE_SMMU1_SE_TO_SMMU1_WR_RSP_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000944, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_se_to_smmu1_wr_rsp_fc_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_to_se_wr_rsp_cnt", + SE_SMMU1_SMMU1_TO_SE_WR_RSP_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000948, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_to_se_wr_rsp_cnt_reg, + NULL, + NULL, + }, + { + "ddr7_0_wr_rsp_cnt", + SE_SMMU1_DDR7_0_WR_RSP_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000094c, + (32/8), + 0, + 7 + 1, + 0, + 4, + 1, + g_se_smmu1_ddr7_0_wr_rsp_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_to_as_fc_cnt", + SE_SMMU1_SMMU1_TO_AS_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000096c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_to_as_fc_cnt_reg, + NULL, + NULL, + }, + { + "as_to_smmu1_wr_req_cnt", + SE_SMMU1_AS_TO_SMMU1_WR_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000970, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_as_to_smmu1_wr_req_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_to_se_parser_fc_cnt", + SE_SMMU1_SMMU1_TO_SE_PARSER_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000974, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_to_se_parser_fc_cnt_reg, + NULL, + NULL, + }, + { + "se_parser_to_smmu1_req_cnt", + SE_SMMU1_SE_PARSER_TO_SMMU1_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000978, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_se_parser_to_smmu1_req_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_to_etm_wr_fc_cnt", + SE_SMMU1_SMMU1_TO_ETM_WR_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000097c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_to_etm_wr_fc_cnt_reg, + NULL, + NULL, + }, + { + "etm_wr_req_cnt", + SE_SMMU1_ETM_WR_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000980, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_etm_wr_req_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_to_ftm_wr_fc_cnt", + SE_SMMU1_SMMU1_TO_FTM_WR_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000984, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_to_ftm_wr_fc_cnt_reg, + NULL, + NULL, + }, + { + "ftm_wr_req_cnt", + SE_SMMU1_FTM_WR_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000988, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ftm_wr_req_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_to_state_wr_fc_cnt", + SE_SMMU1_SMMU1_TO_STATE_WR_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000098c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_to_state_wr_fc_cnt_reg, + NULL, + NULL, + }, + { + "state_wr_req_cnt", + SE_SMMU1_STATE_WR_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000990, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_state_wr_req_cnt_reg, + NULL, + NULL, + }, + { + "se_to_dma_rsp_cnt", + SE_SMMU1_SE_TO_DMA_RSP_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000994, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_se_to_dma_rsp_cnt_reg, + NULL, + NULL, + }, + { + "se_to_dma_fc_cnt", + SE_SMMU1_SE_TO_DMA_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000998, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_se_to_dma_fc_cnt_reg, + NULL, + NULL, + }, + { + "oam_to_smmu1_fc_cnt", + SE_SMMU1_OAM_TO_SMMU1_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000099c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_oam_to_smmu1_fc_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_to_oam_rsp_cnt", + SE_SMMU1_SMMU1_TO_OAM_RSP_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000009a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_to_oam_rsp_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_to_oam_fc_cnt", + SE_SMMU1_SMMU1_TO_OAM_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000009a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_to_oam_fc_cnt_reg, + NULL, + NULL, + }, + { + "oam_to_smmu1_req_cnt", + SE_SMMU1_OAM_TO_SMMU1_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000009a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_oam_to_smmu1_req_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_to_etm_rsp_cnt", + SE_SMMU1_SMMU1_TO_ETM_RSP_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000009ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_to_etm_rsp_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_to_ftm_rsp_cnt", + SE_SMMU1_SMMU1_TO_FTM_RSP_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000009b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_to_ftm_rsp_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_to_etm_fc_cnt", + SE_SMMU1_SMMU1_TO_ETM_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000009b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_to_etm_fc_cnt_reg, + NULL, + NULL, + }, + { + "etm_to_smmu1_req_cnt", + SE_SMMU1_ETM_TO_SMMU1_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000009b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_etm_to_smmu1_req_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_to_ftm_fc_cnt", + SE_SMMU1_SMMU1_TO_FTM_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000009bc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_to_ftm_fc_cnt_reg, + NULL, + NULL, + }, + { + "ftm_to_smmu1_req_cnt", + SE_SMMU1_FTM_TO_SMMU1_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000009c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_ftm_to_smmu1_req_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_to_stat_rsp_cnt", + SE_SMMU1_SMMU1_TO_STAT_RSP_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000009c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_to_stat_rsp_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_to_stat_fc_cnt", + SE_SMMU1_SMMU1_TO_STAT_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000009c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_to_stat_fc_cnt_reg, + NULL, + NULL, + }, + { + "stat_to_smmu1_req_cnt", + SE_SMMU1_STAT_TO_SMMU1_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000009cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_stat_to_smmu1_req_cnt_reg, + NULL, + NULL, + }, + { + "lpm_as_to_smmu1_fc_cnt", + SE_SMMU1_LPM_AS_TO_SMMU1_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000009d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_lpm_as_to_smmu1_fc_cnt_reg, + NULL, + NULL, + }, + { + "lpm_to_smmu1_fc_cnt", + SE_SMMU1_LPM_TO_SMMU1_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000009d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_lpm_to_smmu1_fc_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_to_lpm_as_rsp_cnt", + SE_SMMU1_SMMU1_TO_LPM_AS_RSP_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000009d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_to_lpm_as_rsp_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_to_lpm_rsp_cnt", + SE_SMMU1_SMMU1_TO_LPM_RSP_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000009dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_to_lpm_rsp_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_to_lpm_as_fc_cnt", + SE_SMMU1_SMMU1_TO_LPM_AS_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000009e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_to_lpm_as_fc_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_to_lpm_fc_cnt", + SE_SMMU1_SMMU1_TO_LPM_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000009e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_smmu1_to_lpm_fc_cnt_reg, + NULL, + NULL, + }, + { + "lpm_as_to_smmu1_req_cnt", + SE_SMMU1_LPM_AS_TO_SMMU1_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000009e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_lpm_as_to_smmu1_req_cnt_reg, + NULL, + NULL, + }, + { + "lpm_to_smmu1_req_cnt", + SE_SMMU1_LPM_TO_SMMU1_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000009ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_smmu1_lpm_to_smmu1_req_cnt_reg, + NULL, + NULL, + }, + { + "hash3_0_to_smmu1_fc_cnt", + SE_SMMU1_HASH3_0_TO_SMMU1_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000009f0, + (32/8), + 0, + 3 + 1, + 0, + 4, + 1, + g_se_smmu1_hash3_0_to_smmu1_fc_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_to_hash3_0_rsp_cnt", + SE_SMMU1_SMMU1_TO_HASH3_0_RSP_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000a00, + (32/8), + 0, + 3 + 1, + 0, + 4, + 1, + g_se_smmu1_smmu1_to_hash3_0_rsp_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_to_hash3_0_fc_cnt", + SE_SMMU1_SMMU1_TO_HASH3_0_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000a10, + (32/8), + 0, + 3 + 1, + 0, + 4, + 1, + g_se_smmu1_smmu1_to_hash3_0_fc_cnt_reg, + NULL, + NULL, + }, + { + "hash3_0_to_smmu1_cnt", + SE_SMMU1_HASH3_0_TO_SMMU1_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000a20, + (32/8), + 0, + 3 + 1, + 0, + 4, + 1, + g_se_smmu1_hash3_0_to_smmu1_cnt_reg, + NULL, + NULL, + }, + { + "se_to_smmu1_dir3_0_rsp_fc_cnt", + SE_SMMU1_SE_TO_SMMU1_DIR3_0_RSP_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000a30, + (32/8), + 0, + 3 + 1, + 0, + 4, + 1, + g_se_smmu1_se_to_smmu1_dir3_0_rsp_fc_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_to_se_dir3_0_rsp_cnt", + SE_SMMU1_SMMU1_TO_SE_DIR3_0_RSP_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000a40, + (32/8), + 0, + 3 + 1, + 0, + 4, + 1, + g_se_smmu1_smmu1_to_se_dir3_0_rsp_cnt_reg, + NULL, + NULL, + }, + { + "smmu1_to_se_dir3_0_fc_cnt", + SE_SMMU1_SMMU1_TO_SE_DIR3_0_FC_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000a50, + (32/8), + 0, + 3 + 1, + 0, + 4, + 1, + g_se_smmu1_smmu1_to_se_dir3_0_fc_cnt_reg, + NULL, + NULL, + }, + { + "se_to_smmu1_dir3_0_cnt", + SE_SMMU1_SE_TO_SMMU1_DIR3_0_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000a60, + (32/8), + 0, + 3 + 1, + 0, + 4, + 1, + g_se_smmu1_se_to_smmu1_dir3_0_cnt_reg, + NULL, + NULL, + }, + { + "cache7_0_to_rschd_rsp_cnt", + SE_SMMU1_CACHE7_0_TO_RSCHD_RSP_CNTr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000a70, + (32/8), + 0, + 7 + 1, + 0, + 4, + 1, + g_se_smmu1_cache7_0_to_rschd_rsp_cnt_reg, + NULL, + NULL, + }, + { + "ddr_rw_addr", + SE_CMMU_DDR_RW_ADDRr, + SMMU1, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_CMMU_BASE_ADDR + 0x00000000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cmmu_ddr_rw_addr_reg, + NULL, + NULL, + }, + { + "ddr_rw_mode", + SE_CMMU_DDR_RW_MODEr, + SMMU1, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_CMMU_BASE_ADDR + 0x00000004, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se_cmmu_ddr_rw_mode_reg, + NULL, + NULL, + }, + { + "cp_cmd", + SE_CMMU_CP_CMDr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_CMMU_BASE_ADDR + 0x00000018, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cmmu_cp_cmd_reg, + NULL, + NULL, + }, + { + "cpu_ind_rd_done", + SE_CMMU_CPU_IND_RD_DONEr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_CMMU_BASE_ADDR + 0x0000001c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cmmu_cpu_ind_rd_done_reg, + NULL, + NULL, + }, + { + "cpu_ind_rdat0", + SE_CMMU_CPU_IND_RDAT0r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_CMMU_BASE_ADDR + 0x00000020, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cmmu_cpu_ind_rdat0_reg, + NULL, + NULL, + }, + { + "cpu_ind_rdat1", + SE_CMMU_CPU_IND_RDAT1r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_CMMU_BASE_ADDR + 0x00000024, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cmmu_cpu_ind_rdat1_reg, + NULL, + NULL, + }, + { + "cpu_ind_rdat2", + SE_CMMU_CPU_IND_RDAT2r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_CMMU_BASE_ADDR + 0x00000028, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cmmu_cpu_ind_rdat2_reg, + NULL, + NULL, + }, + { + "cpu_ind_rdat3", + SE_CMMU_CPU_IND_RDAT3r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_CMMU_BASE_ADDR + 0x0000002c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cmmu_cpu_ind_rdat3_reg, + NULL, + NULL, + }, + { + "cpu_ddr_fifo_almful", + SE_CMMU_CPU_DDR_FIFO_ALMFULr, + SMMU1, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_CMMU_BASE_ADDR + 0x00000030, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cmmu_cpu_ddr_fifo_almful_reg, + NULL, + NULL, + }, + { + "debug_cnt_mode", + SE_CMMU_DEBUG_CNT_MODEr, + SMMU1, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_CMMU_BASE_ADDR + 0x00000034, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se_cmmu_debug_cnt_mode_reg, + NULL, + NULL, + }, + { + "cmmu_pful_cfg", + SE_CMMU_CMMU_PFUL_CFGr, + SMMU1, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_CMMU_BASE_ADDR + 0x00000038, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se_cmmu_cmmu_pful_cfg_reg, + NULL, + NULL, + }, + { + "cmmu_stat_pful_cfg", + SE_CMMU_CMMU_STAT_PFUL_CFGr, + SMMU1, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_CMMU_BASE_ADDR + 0x0000003c, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_se_cmmu_cmmu_stat_pful_cfg_reg, + NULL, + NULL, + }, + { + "stat_overflow_mode", + SE_CMMU_STAT_OVERFLOW_MODEr, + SMMU1, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_CMMU_BASE_ADDR + 0x00000040, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cmmu_stat_overflow_mode_reg, + NULL, + NULL, + }, + { + "cmmu_cp_fifo_pful", + SE_CMMU_CMMU_CP_FIFO_PFULr, + SMMU1, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_CMMU_BASE_ADDR + 0x00000044, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cmmu_cmmu_cp_fifo_pful_reg, + NULL, + NULL, + }, + { + "ddr_wr_dat0", + SE_CMMU_DDR_WR_DAT0r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_CMMU_BASE_ADDR + 0x00000078, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cmmu_ddr_wr_dat0_reg, + NULL, + NULL, + }, + { + "ddr_wr_dat1", + SE_CMMU_DDR_WR_DAT1r, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_CMMU_BASE_ADDR + 0x0000007c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cmmu_ddr_wr_dat1_reg, + NULL, + NULL, + }, + { + "cmmu_int_unmask_flag", + SE_CMMU_CMMU_INT_UNMASK_FLAGr, + SMMU1, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_CMMU_BASE_ADDR + 0x00000080, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cmmu_cmmu_int_unmask_flag_reg, + NULL, + NULL, + }, + { + "cmmu_int_en", + SE_CMMU_CMMU_INT_ENr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_CMMU_BASE_ADDR + 0x00000084, + (32/8), + 0, + 0, + 0, + 0, + 13, + g_se_cmmu_cmmu_int_en_reg, + NULL, + NULL, + }, + { + "cmmu_int_mask", + SE_CMMU_CMMU_INT_MASKr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_CMMU_BASE_ADDR + 0x00000088, + (32/8), + 0, + 0, + 0, + 0, + 13, + g_se_cmmu_cmmu_int_mask_reg, + NULL, + NULL, + }, + { + "cmmu_int_status", + SE_CMMU_CMMU_INT_STATUSr, + SMMU1, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_CMMU_BASE_ADDR + 0x0000008c, + (32/8), + 0, + 0, + 0, + 0, + 13, + g_se_cmmu_cmmu_int_status_reg, + NULL, + NULL, + }, + { + "stat_cmmu_req_cnt", + SE_CMMU_STAT_CMMU_REQ_CNTr, + SMMU1, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_CMMU_BASE_ADDR + 0x00000400, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cmmu_stat_cmmu_req_cnt_reg, + NULL, + NULL, + }, + { + "cmmu_fc0_cnt", + SE_CMMU_CMMU_FC0_CNTr, + SMMU1, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_CMMU_BASE_ADDR + 0x00000404, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cmmu_cmmu_fc0_cnt_reg, + NULL, + NULL, + }, + { + "cmmu_fc1_cnt", + SE_CMMU_CMMU_FC1_CNTr, + SMMU1, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_CMMU_BASE_ADDR + 0x00000408, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cmmu_cmmu_fc1_cnt_reg, + NULL, + NULL, + }, + { + "cmmu_fc2_cnt", + SE_CMMU_CMMU_FC2_CNTr, + SMMU1, + DPP_REG_FLAG_INDIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_CMMU_BASE_ADDR + 0x0000040c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_se_cmmu_cmmu_fc2_cnt_reg, + NULL, + NULL, + }, + { + "hash0_tbl0_cfg", + SMMU14K_SE_SMMU1_HASH0_TBL0_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000148, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash0_tbl0_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash0_tbl1_cfg", + SMMU14K_SE_SMMU1_HASH0_TBL1_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000014c, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash0_tbl1_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash0_tbl2_cfg", + SMMU14K_SE_SMMU1_HASH0_TBL2_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000150, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash0_tbl2_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash0_tbl3_cfg", + SMMU14K_SE_SMMU1_HASH0_TBL3_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000154, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash0_tbl3_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash0_tbl4_cfg", + SMMU14K_SE_SMMU1_HASH0_TBL4_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000158, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash0_tbl4_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash0_tbl5_cfg", + SMMU14K_SE_SMMU1_HASH0_TBL5_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000015c, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash0_tbl5_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash0_tbl6_cfg", + SMMU14K_SE_SMMU1_HASH0_TBL6_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000160, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash0_tbl6_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash0_tbl7_cfg", + SMMU14K_SE_SMMU1_HASH0_TBL7_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000164, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash0_tbl7_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash1_tbl0_cfg", + SMMU14K_SE_SMMU1_HASH1_TBL0_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000168, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash1_tbl0_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash1_tbl1_cfg", + SMMU14K_SE_SMMU1_HASH1_TBL1_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000016c, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash1_tbl1_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash1_tbl2_cfg", + SMMU14K_SE_SMMU1_HASH1_TBL2_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000170, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash1_tbl2_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash1_tbl3_cfg", + SMMU14K_SE_SMMU1_HASH1_TBL3_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000174, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash1_tbl3_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash1_tbl4_cfg", + SMMU14K_SE_SMMU1_HASH1_TBL4_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000178, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash1_tbl4_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash1_tbl5_cfg", + SMMU14K_SE_SMMU1_HASH1_TBL5_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000017c, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash1_tbl5_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash1_tbl6_cfg", + SMMU14K_SE_SMMU1_HASH1_TBL6_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000180, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash1_tbl6_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash1_tbl7_cfg", + SMMU14K_SE_SMMU1_HASH1_TBL7_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000184, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash1_tbl7_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash2_tbl0_cfg", + SMMU14K_SE_SMMU1_HASH2_TBL0_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000188, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash2_tbl0_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash2_tbl1_cfg", + SMMU14K_SE_SMMU1_HASH2_TBL1_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000018c, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash2_tbl1_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash2_tbl2_cfg", + SMMU14K_SE_SMMU1_HASH2_TBL2_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000190, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash2_tbl2_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash2_tbl3_cfg", + SMMU14K_SE_SMMU1_HASH2_TBL3_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000194, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash2_tbl3_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash2_tbl4_cfg", + SMMU14K_SE_SMMU1_HASH2_TBL4_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x00000198, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash2_tbl4_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash2_tbl5_cfg", + SMMU14K_SE_SMMU1_HASH2_TBL5_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x0000019c, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash2_tbl5_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash2_tbl6_cfg", + SMMU14K_SE_SMMU1_HASH2_TBL6_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000001a0, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash2_tbl6_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash2_tbl7_cfg", + SMMU14K_SE_SMMU1_HASH2_TBL7_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000001a4, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash2_tbl7_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash3_tbl0_cfg", + SMMU14K_SE_SMMU1_HASH3_TBL0_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000001a8, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash3_tbl0_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash3_tbl1_cfg", + SMMU14K_SE_SMMU1_HASH3_TBL1_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000001ac, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash3_tbl1_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash3_tbl2_cfg", + SMMU14K_SE_SMMU1_HASH3_TBL2_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000001b0, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash3_tbl2_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash3_tbl3_cfg", + SMMU14K_SE_SMMU1_HASH3_TBL3_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000001b4, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash3_tbl3_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash3_tbl4_cfg", + SMMU14K_SE_SMMU1_HASH3_TBL4_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000001b8, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash3_tbl4_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash3_tbl5_cfg", + SMMU14K_SE_SMMU1_HASH3_TBL5_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000001bc, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash3_tbl5_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash3_tbl6_cfg", + SMMU14K_SE_SMMU1_HASH3_TBL6_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000001c0, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash3_tbl6_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "hash3_tbl7_cfg", + SMMU14K_SE_SMMU1_HASH3_TBL7_CFGr, + SMMU14K, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_SE_SMMU1_BASE_ADDR + MODULE_SE_SMMU1_BASE_ADDR + 0x000001c4, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_smmu14k_se_smmu1_hash3_tbl7_cfg_reg, + dpp_se_write, + dpp_se_read, + }, + { + "cpu_ind_eram_wdat1", + STAT_STAT_CFG_CPU_IND_ERAM_WDAT1r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000004, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_eram_wdat1_reg, + NULL, + NULL, + }, + { + "cpu_ind_eram_wdat2", + STAT_STAT_CFG_CPU_IND_ERAM_WDAT2r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_eram_wdat2_reg, + NULL, + NULL, + }, + { + "cpu_ind_eram_wdat3", + STAT_STAT_CFG_CPU_IND_ERAM_WDAT3r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000000c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_eram_wdat3_reg, + NULL, + NULL, + }, + { + "cpu_ind_eram_req_info", + STAT_STAT_CFG_CPU_IND_ERAM_REQ_INFOr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000010, + (32/8), + 0, + 0, + 0, + 0, + 5, + g_stat_stat_cfg_cpu_ind_eram_req_info_reg, + NULL, + NULL, + }, + { + "cpu_ind_eram_rd_done", + STAT_STAT_CFG_CPU_IND_ERAM_RD_DONEr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000014, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_eram_rd_done_reg, + NULL, + NULL, + }, + { + "cpu_ind_eram_rdat0", + STAT_STAT_CFG_CPU_IND_ERAM_RDAT0r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000018, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_eram_rdat0_reg, + NULL, + NULL, + }, + { + "cpu_ind_eram_rdat1", + STAT_STAT_CFG_CPU_IND_ERAM_RDAT1r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000001c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_eram_rdat1_reg, + NULL, + NULL, + }, + { + "cpu_ind_eram_rdat2", + STAT_STAT_CFG_CPU_IND_ERAM_RDAT2r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000020, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_eram_rdat2_reg, + NULL, + NULL, + }, + { + "cpu_ind_eram_rdat3", + STAT_STAT_CFG_CPU_IND_ERAM_RDAT3r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000024, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_eram_rdat3_reg, + NULL, + NULL, + }, + { + "tm_alu_eram_cpu_rdy", + STAT_STAT_CFG_TM_ALU_ERAM_CPU_RDYr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000028, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_tm_alu_eram_cpu_rdy_reg, + NULL, + NULL, + }, + { + "oam_stat_cfg", + STAT_STAT_CFG_OAM_STAT_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000040, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_stat_stat_cfg_oam_stat_cfg_reg, + NULL, + NULL, + }, + { + "ftm_port_sel_cfg", + STAT_STAT_CFG_FTM_PORT_SEL_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000048, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_stat_stat_cfg_ftm_port_sel_cfg_reg, + NULL, + NULL, + }, + { + "oam_eram_base_addr", + STAT_STAT_CFG_OAM_ERAM_BASE_ADDRr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000058, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_oam_eram_base_addr_reg, + NULL, + NULL, + }, + { + "oam_lm_eram_base_addr", + STAT_STAT_CFG_OAM_LM_ERAM_BASE_ADDRr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000005c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_oam_lm_eram_base_addr_reg, + NULL, + NULL, + }, + { + "oam_ddr_base_addr", + STAT_STAT_CFG_OAM_DDR_BASE_ADDRr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000064, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_oam_ddr_base_addr_reg, + NULL, + NULL, + }, + { + "plcr0_schd_pful_cfg", + STAT_STAT_CFG_PLCR0_SCHD_PFUL_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000078, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_plcr0_schd_pful_cfg_reg, + NULL, + NULL, + }, + { + "oam_lm_ord_pful_cfg", + STAT_STAT_CFG_OAM_LM_ORD_PFUL_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000080, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_oam_lm_ord_pful_cfg_reg, + NULL, + NULL, + }, + { + "ddr_schd_pful_cfg", + STAT_STAT_CFG_DDR_SCHD_PFUL_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000084, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_ddr_schd_pful_cfg_reg, + NULL, + NULL, + }, + { + "eram_schd_pful_cfg", + STAT_STAT_CFG_ERAM_SCHD_PFUL_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000088, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_eram_schd_pful_cfg_reg, + NULL, + NULL, + }, + { + "eram_schd_pept_cfg", + STAT_STAT_CFG_ERAM_SCHD_PEPT_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000008c, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_eram_schd_pept_cfg_reg, + NULL, + NULL, + }, + { + "eram_schd_oam_pful_cfg", + STAT_STAT_CFG_ERAM_SCHD_OAM_PFUL_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000090, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_eram_schd_oam_pful_cfg_reg, + NULL, + NULL, + }, + { + "eram_schd_oam_pept_cfg", + STAT_STAT_CFG_ERAM_SCHD_OAM_PEPT_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000094, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_eram_schd_oam_pept_cfg_reg, + NULL, + NULL, + }, + { + "eram_schd_oam_lm_pful_cfg", + STAT_STAT_CFG_ERAM_SCHD_OAM_LM_PFUL_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000098, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_eram_schd_oam_lm_pful_cfg_reg, + NULL, + NULL, + }, + { + "eram_schd_oam_lm_pept_cfg", + STAT_STAT_CFG_ERAM_SCHD_OAM_LM_PEPT_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000009c, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_eram_schd_oam_lm_pept_cfg_reg, + NULL, + NULL, + }, + { + "rschd_pful_cfg", + STAT_STAT_CFG_RSCHD_PFUL_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000000a0, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_rschd_pful_cfg_reg, + NULL, + NULL, + }, + { + "rschd_pept_cfg", + STAT_STAT_CFG_RSCHD_PEPT_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000000a4, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_rschd_pept_cfg_reg, + NULL, + NULL, + }, + { + "rschd_plcr_pful_cfg", + STAT_STAT_CFG_RSCHD_PLCR_PFUL_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000000a8, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_rschd_plcr_pful_cfg_reg, + NULL, + NULL, + }, + { + "rschd_plcr_pept_cfg", + STAT_STAT_CFG_RSCHD_PLCR_PEPT_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000000ac, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_rschd_plcr_pept_cfg_reg, + NULL, + NULL, + }, + { + "rschd_plcr_info_pful_cfg", + STAT_STAT_CFG_RSCHD_PLCR_INFO_PFUL_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000000b0, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_rschd_plcr_info_pful_cfg_reg, + NULL, + NULL, + }, + { + "alu_arb_cpu_pful_cfg", + STAT_STAT_CFG_ALU_ARB_CPU_PFUL_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000000b4, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_alu_arb_cpu_pful_cfg_reg, + NULL, + NULL, + }, + { + "alu_arb_user_pful_cfg", + STAT_STAT_CFG_ALU_ARB_USER_PFUL_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000000b8, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_alu_arb_user_pful_cfg_reg, + NULL, + NULL, + }, + { + "alu_arb_stat_pful_cfg", + STAT_STAT_CFG_ALU_ARB_STAT_PFUL_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000000bc, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_alu_arb_stat_pful_cfg_reg, + NULL, + NULL, + }, + { + "cycmov_dat_pful_cfg", + STAT_STAT_CFG_CYCMOV_DAT_PFUL_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000000c0, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_cycmov_dat_pful_cfg_reg, + NULL, + NULL, + }, + { + "ddr_opr_pful_cfg", + STAT_STAT_CFG_DDR_OPR_PFUL_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000000c4, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_ddr_opr_pful_cfg_reg, + NULL, + NULL, + }, + { + "cycle_mov_pful_cfg", + STAT_STAT_CFG_CYCLE_MOV_PFUL_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000000c8, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_cycle_mov_pful_cfg_reg, + NULL, + NULL, + }, + { + "cntovf_pful_cfg", + STAT_STAT_CFG_CNTOVF_PFUL_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000000cc, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_cntovf_pful_cfg_reg, + NULL, + NULL, + }, + { + "eram_schd_plcr_pful_cfg", + STAT_STAT_CFG_ERAM_SCHD_PLCR_PFUL_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000000d0, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_eram_schd_plcr_pful_cfg_reg, + NULL, + NULL, + }, + { + "eram_schd_plcr_pept_cfg", + STAT_STAT_CFG_ERAM_SCHD_PLCR_PEPT_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000000d4, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_eram_schd_plcr_pept_cfg_reg, + NULL, + NULL, + }, + { + "debug_cnt_mode", + STAT_STAT_CFG_DEBUG_CNT_MODEr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000000d8, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_debug_cnt_mode_reg, + NULL, + NULL, + }, + { + "tm_mov_period_cfg", + STAT_STAT_CFG_TM_MOV_PERIOD_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000000dc, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_tm_mov_period_cfg_reg, + NULL, + NULL, + }, + { + "alu_ddr_cpu_req_pful_cfg", + STAT_STAT_CFG_ALU_DDR_CPU_REQ_PFUL_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000000ec, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_alu_ddr_cpu_req_pful_cfg_reg, + NULL, + NULL, + }, + { + "cycmov_addr_pful_cfg", + STAT_STAT_CFG_CYCMOV_ADDR_PFUL_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000000f0, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_cycmov_addr_pful_cfg_reg, + NULL, + NULL, + }, + { + "ord_ddr_plcr_fifo_empty", + STAT_STAT_CFG_ORD_DDR_PLCR_FIFO_EMPTYr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000100, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_stat_stat_cfg_ord_ddr_plcr_fifo_empty_reg, + NULL, + NULL, + }, + { + "tm_stat_fifo_empty", + STAT_STAT_CFG_TM_STAT_FIFO_EMPTYr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000104, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_tm_stat_fifo_empty_reg, + NULL, + NULL, + }, + { + "eram_schd_fifo_empty_0_1", + STAT_STAT_CFG_ERAM_SCHD_FIFO_EMPTY_0_1r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000108, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_eram_schd_fifo_empty_0_1_reg, + NULL, + NULL, + }, + { + "eram_schd_fifo_empty_2_3", + STAT_STAT_CFG_ERAM_SCHD_FIFO_EMPTY_2_3r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000010c, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_eram_schd_fifo_empty_2_3_reg, + NULL, + NULL, + }, + { + "eram_schd_fifo_empty_4_5", + STAT_STAT_CFG_ERAM_SCHD_FIFO_EMPTY_4_5r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000110, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_eram_schd_fifo_empty_4_5_reg, + NULL, + NULL, + }, + { + "eram_schd_fifo_empty_6_7", + STAT_STAT_CFG_ERAM_SCHD_FIFO_EMPTY_6_7r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000114, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_stat_stat_cfg_eram_schd_fifo_empty_6_7_reg, + NULL, + NULL, + }, + { + "eram_schd_fifo_empty_free_8", + STAT_STAT_CFG_ERAM_SCHD_FIFO_EMPTY_FREE_8r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000118, + (32/8), + 0, + 0, + 0, + 0, + 10, + g_stat_stat_cfg_eram_schd_fifo_empty_free_8_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty_0_3", + STAT_STAT_CFG_RSCHD_FIFO_EMPTY_0_3r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000011c, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_stat_stat_cfg_rschd_fifo_empty_0_3_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty_4_7", + STAT_STAT_CFG_RSCHD_FIFO_EMPTY_4_7r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000120, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_stat_stat_cfg_rschd_fifo_empty_4_7_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty_8_11", + STAT_STAT_CFG_RSCHD_FIFO_EMPTY_8_11r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000124, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_stat_stat_cfg_rschd_fifo_empty_8_11_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty_12_15", + STAT_STAT_CFG_RSCHD_FIFO_EMPTY_12_15r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000128, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_stat_stat_cfg_rschd_fifo_empty_12_15_reg, + NULL, + NULL, + }, + { + "rschd_fifo_empty_plcr_16_17", + STAT_STAT_CFG_RSCHD_FIFO_EMPTY_PLCR_16_17r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000012c, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_stat_stat_cfg_rschd_fifo_empty_plcr_16_17_reg, + NULL, + NULL, + }, + { + "stat_int_unmask_flag", + STAT_STAT_CFG_STAT_INT_UNMASK_FLAGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000140, + (32/8), + 0, + 0, + 0, + 0, + 6, + g_stat_stat_cfg_stat_int_unmask_flag_reg, + NULL, + NULL, + }, + { + "stat_int0_en", + STAT_STAT_CFG_STAT_INT0_ENr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000144, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_stat_stat_cfg_stat_int0_en_reg, + NULL, + NULL, + }, + { + "stat_int0_mask", + STAT_STAT_CFG_STAT_INT0_MASKr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000148, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_stat_stat_cfg_stat_int0_mask_reg, + NULL, + NULL, + }, + { + "stat_int0_status", + STAT_STAT_CFG_STAT_INT0_STATUSr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000014c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_stat_stat_cfg_stat_int0_status_reg, + NULL, + NULL, + }, + { + "stat_int1_en", + STAT_STAT_CFG_STAT_INT1_ENr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000150, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_stat_stat_cfg_stat_int1_en_reg, + NULL, + NULL, + }, + { + "stat_int1_mask", + STAT_STAT_CFG_STAT_INT1_MASKr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000154, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_stat_stat_cfg_stat_int1_mask_reg, + NULL, + NULL, + }, + { + "stat_int1_status", + STAT_STAT_CFG_STAT_INT1_STATUSr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000158, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_stat_stat_cfg_stat_int1_status_reg, + NULL, + NULL, + }, + { + "stat_int2_en", + STAT_STAT_CFG_STAT_INT2_ENr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000015c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_stat_stat_cfg_stat_int2_en_reg, + NULL, + NULL, + }, + { + "stat_int2_mask", + STAT_STAT_CFG_STAT_INT2_MASKr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000160, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_stat_stat_cfg_stat_int2_mask_reg, + NULL, + NULL, + }, + { + "stat_int2_status", + STAT_STAT_CFG_STAT_INT2_STATUSr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000164, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_stat_stat_cfg_stat_int2_status_reg, + NULL, + NULL, + }, + { + "stat_int3_en", + STAT_STAT_CFG_STAT_INT3_ENr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000168, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_stat_stat_cfg_stat_int3_en_reg, + NULL, + NULL, + }, + { + "stat_int3_mask", + STAT_STAT_CFG_STAT_INT3_MASKr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000016c, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_stat_stat_cfg_stat_int3_mask_reg, + NULL, + NULL, + }, + { + "stat_int3_status", + STAT_STAT_CFG_STAT_INT3_STATUSr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000170, + (32/8), + 0, + 0, + 0, + 0, + 32, + g_stat_stat_cfg_stat_int3_status_reg, + NULL, + NULL, + }, + { + "stat_int4_en", + STAT_STAT_CFG_STAT_INT4_ENr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000174, + (32/8), + 0, + 0, + 0, + 0, + 19, + g_stat_stat_cfg_stat_int4_en_reg, + NULL, + NULL, + }, + { + "stat_int4_mask", + STAT_STAT_CFG_STAT_INT4_MASKr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000178, + (32/8), + 0, + 0, + 0, + 0, + 19, + g_stat_stat_cfg_stat_int4_mask_reg, + NULL, + NULL, + }, + { + "stat_int4_status", + STAT_STAT_CFG_STAT_INT4_STATUSr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000017c, + (32/8), + 0, + 0, + 0, + 0, + 19, + g_stat_stat_cfg_stat_int4_status_reg, + NULL, + NULL, + }, + { + "stat_int5_en", + STAT_STAT_CFG_STAT_INT5_ENr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000180, + (32/8), + 0, + 0, + 0, + 0, + 19, + g_stat_stat_cfg_stat_int5_en_reg, + NULL, + NULL, + }, + { + "stat_int5_mask", + STAT_STAT_CFG_STAT_INT5_MASKr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000184, + (32/8), + 0, + 0, + 0, + 0, + 19, + g_stat_stat_cfg_stat_int5_mask_reg, + NULL, + NULL, + }, + { + "stat_int5_status", + STAT_STAT_CFG_STAT_INT5_STATUSr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000188, + (32/8), + 0, + 0, + 0, + 0, + 19, + g_stat_stat_cfg_stat_int5_status_reg, + NULL, + NULL, + }, + { + "rschd_ecc_bypass", + STAT_STAT_CFG_RSCHD_ECC_BYPASSr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000198, + (32/8), + 0, + 0, + 0, + 0, + 19, + g_stat_stat_cfg_rschd_ecc_bypass_reg, + NULL, + NULL, + }, + { + "rschd_ecc_single_err", + STAT_STAT_CFG_RSCHD_ECC_SINGLE_ERRr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000019c, + (32/8), + 0, + 0, + 0, + 0, + 19, + g_stat_stat_cfg_rschd_ecc_single_err_reg, + NULL, + NULL, + }, + { + "rschd_ecc_double_err", + STAT_STAT_CFG_RSCHD_ECC_DOUBLE_ERRr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000001a0, + (32/8), + 0, + 0, + 0, + 0, + 19, + g_stat_stat_cfg_rschd_ecc_double_err_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_wdat0", + STAT_STAT_CFG_CPU_IND_DDR_WDAT0r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000200, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_wdat0_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_wdat1", + STAT_STAT_CFG_CPU_IND_DDR_WDAT1r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000204, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_wdat1_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_wdat2", + STAT_STAT_CFG_CPU_IND_DDR_WDAT2r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000208, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_wdat2_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_wdat3", + STAT_STAT_CFG_CPU_IND_DDR_WDAT3r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000020c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_wdat3_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_wdat4", + STAT_STAT_CFG_CPU_IND_DDR_WDAT4r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000210, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_wdat4_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_wdat5", + STAT_STAT_CFG_CPU_IND_DDR_WDAT5r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000214, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_wdat5_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_wdat6", + STAT_STAT_CFG_CPU_IND_DDR_WDAT6r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000218, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_wdat6_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_wdat7", + STAT_STAT_CFG_CPU_IND_DDR_WDAT7r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000021c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_wdat7_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_wdat8", + STAT_STAT_CFG_CPU_IND_DDR_WDAT8r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000220, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_wdat8_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_wdat9", + STAT_STAT_CFG_CPU_IND_DDR_WDAT9r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000224, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_wdat9_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_wdat10", + STAT_STAT_CFG_CPU_IND_DDR_WDAT10r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000228, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_wdat10_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_wdat11", + STAT_STAT_CFG_CPU_IND_DDR_WDAT11r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000022c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_wdat11_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_wdat12", + STAT_STAT_CFG_CPU_IND_DDR_WDAT12r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000230, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_wdat12_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_wdat13", + STAT_STAT_CFG_CPU_IND_DDR_WDAT13r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000234, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_wdat13_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_wdat14", + STAT_STAT_CFG_CPU_IND_DDR_WDAT14r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000238, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_wdat14_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_wdat15", + STAT_STAT_CFG_CPU_IND_DDR_WDAT15r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000023c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_wdat15_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_req_info", + STAT_STAT_CFG_CPU_IND_DDR_REQ_INFOr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000240, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_stat_stat_cfg_cpu_ind_ddr_req_info_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_rd_done", + STAT_STAT_CFG_CPU_IND_DDR_RD_DONEr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000244, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_rd_done_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_rdat0", + STAT_STAT_CFG_CPU_IND_DDR_RDAT0r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000248, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_rdat0_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_rdat1", + STAT_STAT_CFG_CPU_IND_DDR_RDAT1r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000024c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_rdat1_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_rdat2", + STAT_STAT_CFG_CPU_IND_DDR_RDAT2r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000250, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_rdat2_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_rdat3", + STAT_STAT_CFG_CPU_IND_DDR_RDAT3r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000254, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_rdat3_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_rdat4", + STAT_STAT_CFG_CPU_IND_DDR_RDAT4r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000258, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_rdat4_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_rdat5", + STAT_STAT_CFG_CPU_IND_DDR_RDAT5r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000025c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_rdat5_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_rdat6", + STAT_STAT_CFG_CPU_IND_DDR_RDAT6r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000260, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_rdat6_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_rdat7", + STAT_STAT_CFG_CPU_IND_DDR_RDAT7r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000264, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_rdat7_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_rdat8", + STAT_STAT_CFG_CPU_IND_DDR_RDAT8r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000268, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_rdat8_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_rdat9", + STAT_STAT_CFG_CPU_IND_DDR_RDAT9r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000026c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_rdat9_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_rdat10", + STAT_STAT_CFG_CPU_IND_DDR_RDAT10r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000270, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_rdat10_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_rdat11", + STAT_STAT_CFG_CPU_IND_DDR_RDAT11r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000274, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_rdat11_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_rdat12", + STAT_STAT_CFG_CPU_IND_DDR_RDAT12r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000278, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_rdat12_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_rdat13", + STAT_STAT_CFG_CPU_IND_DDR_RDAT13r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000027c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_rdat13_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_rdat14", + STAT_STAT_CFG_CPU_IND_DDR_RDAT14r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000280, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_rdat14_reg, + NULL, + NULL, + }, + { + "cpu_ind_ddr_rdat15", + STAT_STAT_CFG_CPU_IND_DDR_RDAT15r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000284, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_ind_ddr_rdat15_reg, + NULL, + NULL, + }, + { + "tm_alu_ddr_cpu_rdy", + STAT_STAT_CFG_TM_ALU_DDR_CPU_RDYr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000288, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_tm_alu_ddr_cpu_rdy_reg, + NULL, + NULL, + }, + { + "ept_flag", + STAT_STAT_CFG_EPT_FLAGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000003f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_ept_flag_reg, + NULL, + NULL, + }, + { + "ppu_soft_rst", + STAT_STAT_CFG_PPU_SOFT_RSTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000003fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_ppu_soft_rst_reg, + NULL, + NULL, + }, + { + "stat_smmu0_fc15_0_cnt", + STAT_STAT_CFG_STAT_SMMU0_FC15_0_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000400, + (32/8), + 0, + 15 + 1, + 0, + 4, + 1, + g_stat_stat_cfg_stat_smmu0_fc15_0_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_stat_fc15_0_cnt", + STAT_STAT_CFG_SMMU0_STAT_FC15_0_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000440, + (32/8), + 0, + 15 + 1, + 0, + 4, + 1, + g_stat_stat_cfg_smmu0_stat_fc15_0_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_stat_rsp15_0_cnt", + STAT_STAT_CFG_SMMU0_STAT_RSP15_0_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000480, + (32/8), + 0, + 15 + 1, + 0, + 4, + 1, + g_stat_stat_cfg_smmu0_stat_rsp15_0_cnt_reg, + NULL, + NULL, + }, + { + "stat_smmu0_req15_0_cnt", + STAT_STAT_CFG_STAT_SMMU0_REQ15_0_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000004c0, + (32/8), + 0, + 15 + 1, + 0, + 4, + 1, + g_stat_stat_cfg_stat_smmu0_req15_0_cnt_reg, + NULL, + NULL, + }, + { + "ppu_stat_mec5_0_rsp_fc_cnt", + STAT_STAT_CFG_PPU_STAT_MEC5_0_RSP_FC_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000500, + (32/8), + 0, + 5 + 1, + 0, + 4, + 1, + g_stat_stat_cfg_ppu_stat_mec5_0_rsp_fc_cnt_reg, + NULL, + NULL, + }, + { + "stat_ppu_mec5_0_key_fc_cnt", + STAT_STAT_CFG_STAT_PPU_MEC5_0_KEY_FC_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000518, + (32/8), + 0, + 5 + 1, + 0, + 4, + 1, + g_stat_stat_cfg_stat_ppu_mec5_0_key_fc_cnt_reg, + NULL, + NULL, + }, + { + "stat_ppu_mec5_0_rsp_cnt", + STAT_STAT_CFG_STAT_PPU_MEC5_0_RSP_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000530, + (32/8), + 0, + 5 + 1, + 0, + 4, + 1, + g_stat_stat_cfg_stat_ppu_mec5_0_rsp_cnt_reg, + NULL, + NULL, + }, + { + "ppu_stat_mec5_0_key_cnt", + STAT_STAT_CFG_PPU_STAT_MEC5_0_KEY_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000548, + (32/8), + 0, + 5 + 1, + 0, + 4, + 1, + g_stat_stat_cfg_ppu_stat_mec5_0_key_cnt_reg, + NULL, + NULL, + }, + { + "ppu5_0_no_exist_opcd_ex_cnt", + STAT_STAT_CFG_PPU5_0_NO_EXIST_OPCD_EX_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000560, + (32/8), + 0, + 5 + 1, + 0, + 4, + 1, + g_stat_stat_cfg_ppu5_0_no_exist_opcd_ex_cnt_reg, + NULL, + NULL, + }, + { + "se_etm_stat_wr_fc_cnt", + STAT_STAT_CFG_SE_ETM_STAT_WR_FC_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000578, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_se_etm_stat_wr_fc_cnt_reg, + NULL, + NULL, + }, + { + "se_etm_stat_rd_fc_cnt", + STAT_STAT_CFG_SE_ETM_STAT_RD_FC_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000057c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_se_etm_stat_rd_fc_cnt_reg, + NULL, + NULL, + }, + { + "stat_etm_deq_fc_cnt", + STAT_STAT_CFG_STAT_ETM_DEQ_FC_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000580, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_stat_etm_deq_fc_cnt_reg, + NULL, + NULL, + }, + { + "stat_etm_enq_fc_cnt", + STAT_STAT_CFG_STAT_ETM_ENQ_FC_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000584, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_stat_etm_enq_fc_cnt_reg, + NULL, + NULL, + }, + { + "stat_oam_lm_fc_cnt", + STAT_STAT_CFG_STAT_OAM_LM_FC_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000588, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_stat_oam_lm_fc_cnt_reg, + NULL, + NULL, + }, + { + "oam_stat_lm_fc_cnt", + STAT_STAT_CFG_OAM_STAT_LM_FC_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000058c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_oam_stat_lm_fc_cnt_reg, + NULL, + NULL, + }, + { + "stat_oam_fc_cnt", + STAT_STAT_CFG_STAT_OAM_FC_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000590, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_stat_oam_fc_cnt_reg, + NULL, + NULL, + }, + { + "cmmu_stat_fc_cnt", + STAT_STAT_CFG_CMMU_STAT_FC_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000594, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cmmu_stat_fc_cnt_reg, + NULL, + NULL, + }, + { + "stat_cmmu_req_cnt", + STAT_STAT_CFG_STAT_CMMU_REQ_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x00000598, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_stat_cmmu_req_cnt_reg, + NULL, + NULL, + }, + { + "smmu0_plcr_rsp0_cnt", + STAT_STAT_CFG_SMMU0_PLCR_RSP0_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x0000059c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_smmu0_plcr_rsp0_cnt_reg, + NULL, + NULL, + }, + { + "plcr_smmu0_req0_cnt", + STAT_STAT_CFG_PLCR_SMMU0_REQ0_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000005a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_plcr_smmu0_req0_cnt_reg, + NULL, + NULL, + }, + { + "stat_oam_lm_rsp_cnt", + STAT_STAT_CFG_STAT_OAM_LM_RSP_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000005a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_stat_oam_lm_rsp_cnt_reg, + NULL, + NULL, + }, + { + "oam_stat_lm_req_cnt", + STAT_STAT_CFG_OAM_STAT_LM_REQ_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000005a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_oam_stat_lm_req_cnt_reg, + NULL, + NULL, + }, + { + "oam_stat_req_cnt", + STAT_STAT_CFG_OAM_STAT_REQ_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000005ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_oam_stat_req_cnt_reg, + NULL, + NULL, + }, + { + "se_etm_stat_rsp_cnt", + STAT_STAT_CFG_SE_ETM_STAT_RSP_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000005b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_se_etm_stat_rsp_cnt_reg, + NULL, + NULL, + }, + { + "etm_stat_se_wr_req_cnt", + STAT_STAT_CFG_ETM_STAT_SE_WR_REQ_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000005b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_etm_stat_se_wr_req_cnt_reg, + NULL, + NULL, + }, + { + "etm_stat_se_rd_req_cnt", + STAT_STAT_CFG_ETM_STAT_SE_RD_REQ_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000005b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_etm_stat_se_rd_req_cnt_reg, + NULL, + NULL, + }, + { + "etm_stat_smmu0_req_cnt0", + STAT_STAT_CFG_ETM_STAT_SMMU0_REQ_CNT0r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000005bc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_etm_stat_smmu0_req_cnt0_reg, + NULL, + NULL, + }, + { + "etm_stat_smmu0_req_cnt1", + STAT_STAT_CFG_ETM_STAT_SMMU0_REQ_CNT1r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000005c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_etm_stat_smmu0_req_cnt1_reg, + NULL, + NULL, + }, + { + "tm_stat_eram_cpu_rsp_cnt", + STAT_STAT_CFG_TM_STAT_ERAM_CPU_RSP_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000005c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_tm_stat_eram_cpu_rsp_cnt_reg, + NULL, + NULL, + }, + { + "cpu_rd_eram_req_cnt", + STAT_STAT_CFG_CPU_RD_ERAM_REQ_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000005c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_rd_eram_req_cnt_reg, + NULL, + NULL, + }, + { + "cpu_wr_eram_req_cnt", + STAT_STAT_CFG_CPU_WR_ERAM_REQ_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000005cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_wr_eram_req_cnt_reg, + NULL, + NULL, + }, + { + "tm_stat_ddr_cpu_rsp_cnt", + STAT_STAT_CFG_TM_STAT_DDR_CPU_RSP_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000005d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_tm_stat_ddr_cpu_rsp_cnt_reg, + NULL, + NULL, + }, + { + "cpu_rd_ddr_req_cnt", + STAT_STAT_CFG_CPU_RD_DDR_REQ_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000005d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_rd_ddr_req_cnt_reg, + NULL, + NULL, + }, + { + "cpu_wr_ddr_req_cnt", + STAT_STAT_CFG_CPU_WR_DDR_REQ_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_GLBL_BASE_ADDR + 0x000005d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_stat_cfg_cpu_wr_ddr_req_cnt_reg, + NULL, + NULL, + }, + { + "cpu_ind_wdat1", + STAT_ETCAM_CPU_IND_WDAT1r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_ind_wdat1_reg, + NULL, + NULL, + }, + { + "cpu_ind_wdat2", + STAT_ETCAM_CPU_IND_WDAT2r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x0000000c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_ind_wdat2_reg, + NULL, + NULL, + }, + { + "cpu_ind_wdat3", + STAT_ETCAM_CPU_IND_WDAT3r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000010, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_ind_wdat3_reg, + NULL, + NULL, + }, + { + "cpu_ind_wdat4", + STAT_ETCAM_CPU_IND_WDAT4r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000014, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_ind_wdat4_reg, + NULL, + NULL, + }, + { + "cpu_ind_wdat5", + STAT_ETCAM_CPU_IND_WDAT5r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000018, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_ind_wdat5_reg, + NULL, + NULL, + }, + { + "cpu_ind_wdat6", + STAT_ETCAM_CPU_IND_WDAT6r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x0000001c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_ind_wdat6_reg, + NULL, + NULL, + }, + { + "cpu_ind_wdat7", + STAT_ETCAM_CPU_IND_WDAT7r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000020, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_ind_wdat7_reg, + NULL, + NULL, + }, + { + "cpu_ind_wdat8", + STAT_ETCAM_CPU_IND_WDAT8r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000024, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_ind_wdat8_reg, + NULL, + NULL, + }, + { + "cpu_ind_wdat9", + STAT_ETCAM_CPU_IND_WDAT9r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000028, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_ind_wdat9_reg, + NULL, + NULL, + }, + { + "cpu_ind_wdat10", + STAT_ETCAM_CPU_IND_WDAT10r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x0000002c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_ind_wdat10_reg, + NULL, + NULL, + }, + { + "cpu_ind_wdat11", + STAT_ETCAM_CPU_IND_WDAT11r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000030, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_ind_wdat11_reg, + NULL, + NULL, + }, + { + "cpu_ind_wdat12", + STAT_ETCAM_CPU_IND_WDAT12r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000034, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_ind_wdat12_reg, + NULL, + NULL, + }, + { + "cpu_ind_wdat13", + STAT_ETCAM_CPU_IND_WDAT13r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000038, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_ind_wdat13_reg, + NULL, + NULL, + }, + { + "cpu_ind_wdat14", + STAT_ETCAM_CPU_IND_WDAT14r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x0000003c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_ind_wdat14_reg, + NULL, + NULL, + }, + { + "cpu_ind_wdat15", + STAT_ETCAM_CPU_IND_WDAT15r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000040, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_ind_wdat15_reg, + NULL, + NULL, + }, + { + "cpu_ind_wdat16", + STAT_ETCAM_CPU_IND_WDAT16r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000044, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_ind_wdat16_reg, + NULL, + NULL, + }, + { + "cpu_ind_wdat17", + STAT_ETCAM_CPU_IND_WDAT17r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000048, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_ind_wdat17_reg, + NULL, + NULL, + }, + { + "cpu_ind_wdat18", + STAT_ETCAM_CPU_IND_WDAT18r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x0000004c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_ind_wdat18_reg, + NULL, + NULL, + }, + { + "cpu_ind_wdat19", + STAT_ETCAM_CPU_IND_WDAT19r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000050, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_cpu_ind_wdat19_reg, + NULL, + NULL, + }, + { + "t_strwc_cfg", + STAT_ETCAM_T_STRWC_CFGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000074, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_t_strwc_cfg_reg, + NULL, + NULL, + }, + { + "etcam_int_unmask_flag", + STAT_ETCAM_ETCAM_INT_UNMASK_FLAGr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000080, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_etcam_int_unmask_flag_reg, + NULL, + NULL, + }, + { + "etcam_int_en0", + STAT_ETCAM_ETCAM_INT_EN0r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000084, + (32/8), + 0, + 0, + 0, + 0, + 18, + g_stat_etcam_etcam_int_en0_reg, + NULL, + NULL, + }, + { + "etcam_int_mask0", + STAT_ETCAM_ETCAM_INT_MASK0r, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x0000008c, + (32/8), + 0, + 0, + 0, + 0, + 18, + g_stat_etcam_etcam_int_mask0_reg, + NULL, + NULL, + }, + { + "etcam_int_status", + STAT_ETCAM_ETCAM_INT_STATUSr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000094, + (32/8), + 0, + 0, + 0, + 0, + 18, + g_stat_etcam_etcam_int_status_reg, + NULL, + NULL, + }, + { + "int_tb_ini_ok", + STAT_ETCAM_INT_TB_INI_OKr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x000003f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_int_tb_ini_ok_reg, + NULL, + NULL, + }, + { + "etcam_clk_en", + STAT_ETCAM_ETCAM_CLK_ENr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x000003fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_etcam_clk_en_reg, + NULL, + NULL, + }, + { + "as_etcam_req0_cnt", + STAT_ETCAM_AS_ETCAM_REQ0_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000400, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_as_etcam_req0_cnt_reg, + NULL, + NULL, + }, + { + "as_etcam_req1_cnt", + STAT_ETCAM_AS_ETCAM_REQ1_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000404, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_as_etcam_req1_cnt_reg, + NULL, + NULL, + }, + { + "etcam_as_index0_cnt", + STAT_ETCAM_ETCAM_AS_INDEX0_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000408, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_etcam_as_index0_cnt_reg, + NULL, + NULL, + }, + { + "etcam_as_index1_cnt", + STAT_ETCAM_ETCAM_AS_INDEX1_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x0000040c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_etcam_as_index1_cnt_reg, + NULL, + NULL, + }, + { + "etcam_not_hit0_cnt", + STAT_ETCAM_ETCAM_NOT_HIT0_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000410, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_etcam_not_hit0_cnt_reg, + NULL, + NULL, + }, + { + "etcam_not_hit1_cnt", + STAT_ETCAM_ETCAM_NOT_HIT1_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000414, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_etcam_not_hit1_cnt_reg, + NULL, + NULL, + }, + { + "table_id_not_match_cnt", + STAT_ETCAM_TABLE_ID_NOT_MATCH_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000418, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_table_id_not_match_cnt_reg, + NULL, + NULL, + }, + { + "table_id_clash01_cnt", + STAT_ETCAM_TABLE_ID_CLASH01_CNTr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x0000041c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_table_id_clash01_cnt_reg, + NULL, + NULL, + }, + { + "etcam_cpu_fl", + STAT_ETCAM_ETCAM_CPU_FLr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x0000044c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_etcam_cpu_fl_reg, + NULL, + NULL, + }, + { + "etcam_arb_empty", + STAT_ETCAM_ETCAM_ARB_EMPTYr, + STAT, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_STAT_BASE_ADDR + MODULE_STAT_ETCAM_BASE_ADDR + 0x00000450, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_stat_etcam_etcam_arb_empty_reg, + NULL, + NULL, + }, + { + "cfg_finish_int_event0", + DTB_DTB_CFG_CFG_FINISH_INT_EVENT0r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cfg_finish_int_event0_reg, + NULL, + NULL, + }, + { + "cfg_finish_int_event1", + DTB_DTB_CFG_CFG_FINISH_INT_EVENT1r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0004, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cfg_finish_int_event1_reg, + NULL, + NULL, + }, + { + "cfg_finish_int_event2", + DTB_DTB_CFG_CFG_FINISH_INT_EVENT2r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cfg_finish_int_event2_reg, + NULL, + NULL, + }, + { + "cfg_finish_int_event3", + DTB_DTB_CFG_CFG_FINISH_INT_EVENT3r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x000c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cfg_finish_int_event3_reg, + NULL, + NULL, + }, + { + "cfg_finish_int_maks0", + DTB_DTB_CFG_CFG_FINISH_INT_MAKS0r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0010, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cfg_finish_int_maks0_reg, + NULL, + NULL, + }, + { + "cfg_finish_int_maks1", + DTB_DTB_CFG_CFG_FINISH_INT_MAKS1r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0014, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cfg_finish_int_maks1_reg, + NULL, + NULL, + }, + { + "cfg_finish_int_maks2", + DTB_DTB_CFG_CFG_FINISH_INT_MAKS2r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0018, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cfg_finish_int_maks2_reg, + NULL, + NULL, + }, + { + "cfg_finish_int_maks3", + DTB_DTB_CFG_CFG_FINISH_INT_MAKS3r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x001c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cfg_finish_int_maks3_reg, + NULL, + NULL, + }, + { + "cfg_finish_int_test0", + DTB_DTB_CFG_CFG_FINISH_INT_TEST0r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0020, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cfg_finish_int_test0_reg, + NULL, + NULL, + }, + { + "cfg_finish_int_test1", + DTB_DTB_CFG_CFG_FINISH_INT_TEST1r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0024, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cfg_finish_int_test1_reg, + NULL, + NULL, + }, + { + "cfg_finish_int_test2", + DTB_DTB_CFG_CFG_FINISH_INT_TEST2r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0028, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cfg_finish_int_test2_reg, + NULL, + NULL, + }, + { + "cfg_finish_int_test3", + DTB_DTB_CFG_CFG_FINISH_INT_TEST3r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x002c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cfg_finish_int_test3_reg, + NULL, + NULL, + }, + { + "cfg_dtb_int_to_riscv_sel", + DTB_DTB_CFG_CFG_DTB_INT_TO_RISCV_SELr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0090, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cfg_dtb_int_to_riscv_sel_reg, + NULL, + NULL, + }, + { + "cfg_dtb_ep_int_msix_enable", + DTB_DTB_CFG_CFG_DTB_EP_INT_MSIX_ENABLEr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0094, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cfg_dtb_ep_int_msix_enable_reg, + NULL, + NULL, + }, + { + "cfg_dtb_ep_doorbell_addr_h_0_15", + DTB_DTB_CFG_CFG_DTB_EP_DOORBELL_ADDR_H_0_15r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0100, + (32/8), + 0, + 15 + 1, + 0, + 4, + 1, + g_dtb_dtb_cfg_cfg_dtb_ep_doorbell_addr_h_0_15_reg, + NULL, + NULL, + }, + { + "cfg_dtb_ep_doorbell_addr_l_0_15", + DTB_DTB_CFG_CFG_DTB_EP_DOORBELL_ADDR_L_0_15r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0140, + (32/8), + 0, + 15 + 1, + 0, + 4, + 1, + g_dtb_dtb_cfg_cfg_dtb_ep_doorbell_addr_l_0_15_reg, + NULL, + NULL, + }, + { + "cfg_dtb_debug_mode_en", + DTB_DTB_CFG_CFG_DTB_DEBUG_MODE_ENr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0180, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cfg_dtb_debug_mode_en_reg, + NULL, + NULL, + }, + { + "info_axi_last_rd_table_addr_high", + DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_ADDR_HIGHr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0184, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_info_axi_last_rd_table_addr_high_reg, + NULL, + NULL, + }, + { + "info_axi_last_rd_table_addr_low", + DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_ADDR_LOWr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0188, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_info_axi_last_rd_table_addr_low_reg, + NULL, + NULL, + }, + { + "info_axi_last_rd_table_len", + DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_LENr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x018c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_info_axi_last_rd_table_len_reg, + NULL, + NULL, + }, + { + "info_axi_last_rd_table_user", + DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_USERr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0190, + (32/8), + 0, + 0, + 0, + 0, + 5, + g_dtb_dtb_cfg_info_axi_last_rd_table_user_reg, + NULL, + NULL, + }, + { + "info_axi_last_rd_table_onload_cnt", + DTB_DTB_CFG_INFO_AXI_LAST_RD_TABLE_ONLOAD_CNTr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0194, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_info_axi_last_rd_table_onload_cnt_reg, + NULL, + NULL, + }, + { + "cnt_axi_rd_table_resp_err", + DTB_DTB_CFG_CNT_AXI_RD_TABLE_RESP_ERRr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0198, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cnt_axi_rd_table_resp_err_reg, + NULL, + NULL, + }, + { + "info_axi_last_rd_pd_addr_high", + DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_ADDR_HIGHr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x01a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_info_axi_last_rd_pd_addr_high_reg, + NULL, + NULL, + }, + { + "info_axi_last_rd_pd_addr_low", + DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_ADDR_LOWr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x01a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_info_axi_last_rd_pd_addr_low_reg, + NULL, + NULL, + }, + { + "info_axi_last_rd_pd_len", + DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_LENr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x01a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_info_axi_last_rd_pd_len_reg, + NULL, + NULL, + }, + { + "info_axi_last_rd_pd_user", + DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_USERr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x01ac, + (32/8), + 0, + 0, + 0, + 0, + 5, + g_dtb_dtb_cfg_info_axi_last_rd_pd_user_reg, + NULL, + NULL, + }, + { + "info_axi_last_rd_pd_onload_cnt", + DTB_DTB_CFG_INFO_AXI_LAST_RD_PD_ONLOAD_CNTr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x01b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_info_axi_last_rd_pd_onload_cnt_reg, + NULL, + NULL, + }, + { + "cnt_axi_rd_pd_resp_err", + DTB_DTB_CFG_CNT_AXI_RD_PD_RESP_ERRr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x01b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cnt_axi_rd_pd_resp_err_reg, + NULL, + NULL, + }, + { + "info_axi_last_wr_ctrl_addr_high", + DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_ADDR_HIGHr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x01b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_info_axi_last_wr_ctrl_addr_high_reg, + NULL, + NULL, + }, + { + "info_axi_last_wr_ctrl_addr_low", + DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_ADDR_LOWr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x01bc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_info_axi_last_wr_ctrl_addr_low_reg, + NULL, + NULL, + }, + { + "info_axi_last_wr_ctrl_len", + DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_LENr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x01c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_info_axi_last_wr_ctrl_len_reg, + NULL, + NULL, + }, + { + "info_axi_last_wr_ctrl_user", + DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_USERr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x01c4, + (32/8), + 0, + 0, + 0, + 0, + 5, + g_dtb_dtb_cfg_info_axi_last_wr_ctrl_user_reg, + NULL, + NULL, + }, + { + "info_axi_last_wr_ctrl_onload_cnt", + DTB_DTB_CFG_INFO_AXI_LAST_WR_CTRL_ONLOAD_CNTr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x01c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_info_axi_last_wr_ctrl_onload_cnt_reg, + NULL, + NULL, + }, + { + "cnt_axi_wr_ctrl_resp_err", + DTB_DTB_CFG_CNT_AXI_WR_CTRL_RESP_ERRr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x01cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cnt_axi_wr_ctrl_resp_err_reg, + NULL, + NULL, + }, + { + "info_axi_last_wr_ddr_addr_high", + DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_ADDR_HIGHr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x01d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_info_axi_last_wr_ddr_addr_high_reg, + NULL, + NULL, + }, + { + "info_axi_last_wr_ddr_addr_low", + DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_ADDR_LOWr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x01d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_info_axi_last_wr_ddr_addr_low_reg, + NULL, + NULL, + }, + { + "info_axi_last_wr_ddr_len", + DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_LENr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x01d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_info_axi_last_wr_ddr_len_reg, + NULL, + NULL, + }, + { + "info_axi_last_wr_ddr_user", + DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_USERr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x01dc, + (32/8), + 0, + 0, + 0, + 0, + 5, + g_dtb_dtb_cfg_info_axi_last_wr_ddr_user_reg, + NULL, + NULL, + }, + { + "info_axi_last_wr_ddr_onload_cnt", + DTB_DTB_CFG_INFO_AXI_LAST_WR_DDR_ONLOAD_CNTr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x01e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_info_axi_last_wr_ddr_onload_cnt_reg, + NULL, + NULL, + }, + { + "cnt_axi_wr_ddr_resp_err", + DTB_DTB_CFG_CNT_AXI_WR_DDR_RESP_ERRr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x01e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cnt_axi_wr_ddr_resp_err_reg, + NULL, + NULL, + }, + { + "info_axi_last_wr_fin_addr_high", + DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_ADDR_HIGHr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x01e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_info_axi_last_wr_fin_addr_high_reg, + NULL, + NULL, + }, + { + "info_axi_last_wr_fin_addr_low", + DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_ADDR_LOWr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x01ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_info_axi_last_wr_fin_addr_low_reg, + NULL, + NULL, + }, + { + "info_axi_last_wr_fin_len", + DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_LENr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x01f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_info_axi_last_wr_fin_len_reg, + NULL, + NULL, + }, + { + "info_axi_last_wr_fin_user", + DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_USERr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x01f4, + (32/8), + 0, + 0, + 0, + 0, + 5, + g_dtb_dtb_cfg_info_axi_last_wr_fin_user_reg, + NULL, + NULL, + }, + { + "info_axi_last_wr_fin_onload_cnt", + DTB_DTB_CFG_INFO_AXI_LAST_WR_FIN_ONLOAD_CNTr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x01f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_info_axi_last_wr_fin_onload_cnt_reg, + NULL, + NULL, + }, + { + "cnt_axi_wr_fin_resp_err", + DTB_DTB_CFG_CNT_AXI_WR_FIN_RESP_ERRr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x01fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cnt_axi_wr_fin_resp_err_reg, + NULL, + NULL, + }, + { + "cnt_dtb_wr_smmu0_table_high", + DTB_DTB_CFG_CNT_DTB_WR_SMMU0_TABLE_HIGHr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0200, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cnt_dtb_wr_smmu0_table_high_reg, + NULL, + NULL, + }, + { + "cnt_dtb_wr_smmu0_table_low", + DTB_DTB_CFG_CNT_DTB_WR_SMMU0_TABLE_LOWr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0204, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cnt_dtb_wr_smmu0_table_low_reg, + NULL, + NULL, + }, + { + "cnt_dtb_wr_smmu1_table_high", + DTB_DTB_CFG_CNT_DTB_WR_SMMU1_TABLE_HIGHr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0208, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cnt_dtb_wr_smmu1_table_high_reg, + NULL, + NULL, + }, + { + "cnt_dtb_wr_smmu1_table_low", + DTB_DTB_CFG_CNT_DTB_WR_SMMU1_TABLE_LOWr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x020c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cnt_dtb_wr_smmu1_table_low_reg, + NULL, + NULL, + }, + { + "cnt_dtb_wr_zcam_table_high", + DTB_DTB_CFG_CNT_DTB_WR_ZCAM_TABLE_HIGHr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0210, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cnt_dtb_wr_zcam_table_high_reg, + NULL, + NULL, + }, + { + "cnt_dtb_wr_zcam_table_low", + DTB_DTB_CFG_CNT_DTB_WR_ZCAM_TABLE_LOWr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0214, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cnt_dtb_wr_zcam_table_low_reg, + NULL, + NULL, + }, + { + "cnt_dtb_wr_etcam_table_high", + DTB_DTB_CFG_CNT_DTB_WR_ETCAM_TABLE_HIGHr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0218, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cnt_dtb_wr_etcam_table_high_reg, + NULL, + NULL, + }, + { + "cnt_dtb_wr_etcam_table_low", + DTB_DTB_CFG_CNT_DTB_WR_ETCAM_TABLE_LOWr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x021c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cnt_dtb_wr_etcam_table_low_reg, + NULL, + NULL, + }, + { + "cnt_dtb_wr_hash_table_high", + DTB_DTB_CFG_CNT_DTB_WR_HASH_TABLE_HIGHr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0220, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cnt_dtb_wr_hash_table_high_reg, + NULL, + NULL, + }, + { + "cnt_dtb_wr_hash_table_low", + DTB_DTB_CFG_CNT_DTB_WR_HASH_TABLE_LOWr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0224, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cnt_dtb_wr_hash_table_low_reg, + NULL, + NULL, + }, + { + "cnt_dtb_rd_smmu0_table_high", + DTB_DTB_CFG_CNT_DTB_RD_SMMU0_TABLE_HIGHr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0228, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cnt_dtb_rd_smmu0_table_high_reg, + NULL, + NULL, + }, + { + "cnt_dtb_rd_smmu0_table_low", + DTB_DTB_CFG_CNT_DTB_RD_SMMU0_TABLE_LOWr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x022c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cnt_dtb_rd_smmu0_table_low_reg, + NULL, + NULL, + }, + { + "cnt_dtb_rd_smmu1_table_high", + DTB_DTB_CFG_CNT_DTB_RD_SMMU1_TABLE_HIGHr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0230, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cnt_dtb_rd_smmu1_table_high_reg, + NULL, + NULL, + }, + { + "cnt_dtb_rd_smmu1_table_low", + DTB_DTB_CFG_CNT_DTB_RD_SMMU1_TABLE_LOWr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0234, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cnt_dtb_rd_smmu1_table_low_reg, + NULL, + NULL, + }, + { + "cnt_dtb_rd_zcam_table_high", + DTB_DTB_CFG_CNT_DTB_RD_ZCAM_TABLE_HIGHr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0238, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cnt_dtb_rd_zcam_table_high_reg, + NULL, + NULL, + }, + { + "cnt_dtb_rd_zcam_table_low", + DTB_DTB_CFG_CNT_DTB_RD_ZCAM_TABLE_LOWr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x023c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cnt_dtb_rd_zcam_table_low_reg, + NULL, + NULL, + }, + { + "cnt_dtb_rd_etcam_table_high", + DTB_DTB_CFG_CNT_DTB_RD_ETCAM_TABLE_HIGHr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0240, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cnt_dtb_rd_etcam_table_high_reg, + NULL, + NULL, + }, + { + "cnt_dtb_rd_etcam_table_low", + DTB_DTB_CFG_CNT_DTB_RD_ETCAM_TABLE_LOWr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0244, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cnt_dtb_rd_etcam_table_low_reg, + NULL, + NULL, + }, + { + "info_wr_ctrl_state", + DTB_DTB_CFG_INFO_WR_CTRL_STATEr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0248, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_info_wr_ctrl_state_reg, + NULL, + NULL, + }, + { + "info_rd_table_state", + DTB_DTB_CFG_INFO_RD_TABLE_STATEr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x024c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_info_rd_table_state_reg, + NULL, + NULL, + }, + { + "info_rd_pd_state", + DTB_DTB_CFG_INFO_RD_PD_STATEr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0250, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_info_rd_pd_state_reg, + NULL, + NULL, + }, + { + "info_dump_cmd_state", + DTB_DTB_CFG_INFO_DUMP_CMD_STATEr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0254, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_info_dump_cmd_state_reg, + NULL, + NULL, + }, + { + "info_wr_ddr_state", + DTB_DTB_CFG_INFO_WR_DDR_STATEr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x0258, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_info_wr_ddr_state_reg, + NULL, + NULL, + }, + { + "cfg_dtb_debug_info_clr", + DTB_DTB_CFG_CFG_DTB_DEBUG_INFO_CLRr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_CFG_BASE_ADDR + 0x025c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_dtb_cfg_cfg_dtb_debug_info_clr_reg, + NULL, + NULL, + }, + { + "cfg_ddos_stat_dump_thrd_0_15", + DTB_DDOS_CFG_DDOS_STAT_DUMP_THRD_0_15r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_DDOS_BASE_ADDR + 0x0000, + (32/8), + 0, + 15 + 1, + 0, + 4, + 1, + g_dtb_ddos_cfg_ddos_stat_dump_thrd_0_15_reg, + NULL, + NULL, + }, + { + "cfg_ddos_stat_dump_thrd_comp_en", + DTB_DDOS_CFG_DDOS_STAT_DUMP_THRD_COMP_ENr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_DDOS_BASE_ADDR + 0x0040, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_ddos_cfg_ddos_stat_dump_thrd_comp_en_reg, + NULL, + NULL, + }, + { + "cfg_ddos_dump_stat_num", + DTB_DDOS_CFG_DDOS_DUMP_STAT_NUMr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_DDOS_BASE_ADDR + 0x0044, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_ddos_cfg_ddos_dump_stat_num_reg, + NULL, + NULL, + }, + { + "cfg_ddos_even_hash_table_baddr", + DTB_DDOS_CFG_DDOS_EVEN_HASH_TABLE_BADDRr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_DDOS_BASE_ADDR + 0x0048, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_ddos_cfg_ddos_even_hash_table_baddr_reg, + NULL, + NULL, + }, + { + "cfg_ddos_odd_hash_table_baddr", + DTB_DDOS_CFG_DDOS_ODD_HASH_TABLE_BADDRr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_DDOS_BASE_ADDR + 0x004c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_ddos_cfg_ddos_odd_hash_table_baddr_reg, + NULL, + NULL, + }, + { + "cfg_ddos_stat_index_offset", + DTB_DDOS_CFG_DDOS_STAT_INDEX_OFFSETr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_DDOS_BASE_ADDR + 0x0050, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_ddos_cfg_ddos_stat_index_offset_reg, + NULL, + NULL, + }, + { + "cfg_ddos_ns_flag_cnt", + DTB_DDOS_CFG_DDOS_NS_FLAG_CNTr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_DDOS_BASE_ADDR + 0x0054, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_ddos_cfg_ddos_ns_flag_cnt_reg, + NULL, + NULL, + }, + { + "cfg_ddos_even_stat_table_baddr", + DTB_DDOS_CFG_DDOS_EVEN_STAT_TABLE_BADDRr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_DDOS_BASE_ADDR + 0x0058, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_ddos_cfg_ddos_even_stat_table_baddr_reg, + NULL, + NULL, + }, + { + "cfg_ddos_odd_stat_table_baddr", + DTB_DDOS_CFG_DDOS_ODD_STAT_TABLE_BADDRr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_DDOS_BASE_ADDR + 0x005c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_ddos_cfg_ddos_odd_stat_table_baddr_reg, + NULL, + NULL, + }, + { + "cfg_ddos_even_stat_dump_daddr_h", + DTB_DDOS_CFG_DDOS_EVEN_STAT_DUMP_DADDR_Hr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_DDOS_BASE_ADDR + 0x0060, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_ddos_cfg_ddos_even_stat_dump_daddr_h_reg, + NULL, + NULL, + }, + { + "cfg_ddos_even_stat_dump_daddr_l", + DTB_DDOS_CFG_DDOS_EVEN_STAT_DUMP_DADDR_Lr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_DDOS_BASE_ADDR + 0x0064, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_ddos_cfg_ddos_even_stat_dump_daddr_l_reg, + NULL, + NULL, + }, + { + "cfg_ddos_odd_stat_dump_daddr_h", + DTB_DDOS_CFG_DDOS_ODD_STAT_DUMP_DADDR_Hr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_DDOS_BASE_ADDR + 0x0068, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_ddos_cfg_ddos_odd_stat_dump_daddr_h_reg, + NULL, + NULL, + }, + { + "cfg_ddos_odd_stat_dump_daddr_l", + DTB_DDOS_CFG_DDOS_ODD_STAT_DUMP_DADDR_Lr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_DDOS_BASE_ADDR + 0x006c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_ddos_cfg_ddos_odd_stat_dump_daddr_l_reg, + NULL, + NULL, + }, + { + "cfg_ddos_work_mode_enable", + DTB_DDOS_CFG_DDOS_WORK_MODE_ENABLEr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_DDOS_BASE_ADDR + 0x0070, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_ddos_cfg_ddos_work_mode_enable_reg, + NULL, + NULL, + }, + { + "cfg_ddos_stat_table_len", + DTB_DDOS_CFG_DDOS_STAT_TABLE_LENr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_DDOS_BASE_ADDR + 0x0074, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_ddos_cfg_ddos_stat_table_len_reg, + NULL, + NULL, + }, + { + "cfg_ddos_hash_table_len", + DTB_DDOS_CFG_DDOS_HASH_TABLE_LENr, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_DDOS_BASE_ADDR + 0x0078, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_dtb_ddos_cfg_ddos_hash_table_len_reg, + NULL, + NULL, + }, + { + "traf_ctrl_ram0_0_255", + DTB_DTB_RAM_TRAF_CTRL_RAM0_0_255r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_RAM_BASE_ADDR + 0x00000, + (32/8), + 0, + 255 + 1, + 0, + 4, + 1, + g_dtb_dtb_ram_traf_ctrl_ram0_0_255_reg, + NULL, + NULL, + }, + { + "traf_ctrl_ram1_0_255", + DTB_DTB_RAM_TRAF_CTRL_RAM1_0_255r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_RAM_BASE_ADDR + 0x00400, + (32/8), + 0, + 255 + 1, + 0, + 4, + 1, + g_dtb_dtb_ram_traf_ctrl_ram1_0_255_reg, + NULL, + NULL, + }, + { + "traf_ctrl_ram2_0_255", + DTB_DTB_RAM_TRAF_CTRL_RAM2_0_255r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_RAM_BASE_ADDR + 0x00800, + (32/8), + 0, + 255 + 1, + 0, + 4, + 1, + g_dtb_dtb_ram_traf_ctrl_ram2_0_255_reg, + NULL, + NULL, + }, + { + "traf_ctrl_ram3_0_255", + DTB_DTB_RAM_TRAF_CTRL_RAM3_0_255r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_RAM_BASE_ADDR + 0x00c00, + (32/8), + 0, + 255 + 1, + 0, + 4, + 1, + g_dtb_dtb_ram_traf_ctrl_ram3_0_255_reg, + NULL, + NULL, + }, + { + "traf_ctrl_ram4_0_255", + DTB_DTB_RAM_TRAF_CTRL_RAM4_0_255r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_RAM_BASE_ADDR + 0x01000, + (32/8), + 0, + 255 + 1, + 0, + 4, + 1, + g_dtb_dtb_ram_traf_ctrl_ram4_0_255_reg, + NULL, + NULL, + }, + { + "traf_ctrl_ram5_0_63", + DTB_DTB_RAM_TRAF_CTRL_RAM5_0_63r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_RAM_BASE_ADDR + 0x01400, + (32/8), + 0, + 63 + 1, + 0, + 4, + 1, + g_dtb_dtb_ram_traf_ctrl_ram5_0_63_reg, + NULL, + NULL, + }, + { + "dump_pd_ram_0_2047", + DTB_DTB_RAM_DUMP_PD_RAM_0_2047r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_RAM_BASE_ADDR + 0x02000, + (32/8), + 0, + 2047 + 1, + 0, + 4, + 1, + g_dtb_dtb_ram_dump_pd_ram_0_2047_reg, + NULL, + NULL, + }, + { + "rd_ctrl_ram_0_4095", + DTB_DTB_RAM_RD_CTRL_RAM_0_4095r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_RAM_BASE_ADDR + 0x04000, + (32/8), + 0, + 4095 + 1, + 0, + 4, + 1, + g_dtb_dtb_ram_rd_ctrl_ram_0_4095_reg, + NULL, + NULL, + }, + { + "rd_table_ram_0_8191", + DTB_DTB_RAM_RD_TABLE_RAM_0_8191r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_RAM_BASE_ADDR + 0x08000, + (32/8), + 0, + 8191 + 1, + 0, + 4, + 1, + g_dtb_dtb_ram_rd_table_ram_0_8191_reg, + NULL, + NULL, + }, + { + "dtb_cmd_man_ram_0_16383", + DTB_DTB_RAM_DTB_CMD_MAN_RAM_0_16383r, + DTB, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_DTB_BASE_ADDR + MODULE_DTB_RAM_BASE_ADDR + 0x10000, + (32/8), + 0, + 16383 + 1, + 0, + 4, + 1, + g_dtb_dtb_ram_dtb_cmd_man_ram_0_16383_reg, + NULL, + NULL, + }, + { + "cpu_trpg_ms_st", + TRPG_TRPG_RX_PORT_CPU_TRPG_MS_STr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x0000, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpg_ms_st_reg, + NULL, + NULL, + }, + { + "cpu_trpg_ms_ind", + TRPG_TRPG_RX_PORT_CPU_TRPG_MS_INDr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x0008, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpg_ms_ind_reg, + NULL, + NULL, + }, + { + "cpu_trpg_ms_slave_ind", + TRPG_TRPG_RX_PORT_CPU_TRPG_MS_SLAVE_INDr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x000c, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpg_ms_slave_ind_reg, + NULL, + NULL, + }, + { + "cpu_trpgrx_up_water_level", + TRPG_TRPG_RX_PORT_CPU_TRPGRX_UP_WATER_LEVELr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x0020, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpgrx_up_water_level_reg, + NULL, + NULL, + }, + { + "cpu_trpgrx_low_water_level", + TRPG_TRPG_RX_PORT_CPU_TRPGRX_LOW_WATER_LEVELr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_RX_BASE_ADDR + 0x0024, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_rx_port_cpu_trpgrx_low_water_level_reg, + NULL, + NULL, + }, + { + "cpu_trpg_ms_st", + TRPG_TRPG_TX_PORT_CPU_TRPG_MS_STr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_BASE_ADDR + 0x0000, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_tx_port_cpu_trpg_ms_st_reg, + NULL, + NULL, + }, + { + "cpu_trpg_ms_ind", + TRPG_TRPG_TX_PORT_CPU_TRPG_MS_INDr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_BASE_ADDR + 0x0008, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_tx_port_cpu_trpg_ms_ind_reg, + NULL, + NULL, + }, + { + "cpu_trpg_ms_slave_ind", + TRPG_TRPG_TX_PORT_CPU_TRPG_MS_SLAVE_INDr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_BASE_ADDR + 0x000c, + (32/8), + DPP_TRPG_PORT_NUM, + 0, + DPP_TRPG_PORT_SPACE_SIZE, + 0, + 1, + g_trpg_trpg_tx_port_cpu_trpg_ms_slave_ind_reg, + NULL, + NULL, + }, + { + "cpu_todtime_update_int_event", + TRPG_TRPG_TX_GLB_CPU_TODTIME_UPDATE_INT_EVENTr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_GLB_BASE_ADDR + 0x0004, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_trpg_trpg_tx_glb_cpu_todtime_update_int_event_reg, + NULL, + NULL, + }, + { + "cpu_todtime_update_int_test", + TRPG_TRPG_TX_GLB_CPU_TODTIME_UPDATE_INT_TESTr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_GLB_BASE_ADDR + 0x0008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_trpg_trpg_tx_glb_cpu_todtime_update_int_test_reg, + NULL, + NULL, + }, + { + "cpu_todtime_update_int_addr", + TRPG_TRPG_TX_GLB_CPU_TODTIME_UPDATE_INT_ADDRr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_GLB_BASE_ADDR + 0x0014, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_trpg_trpg_tx_glb_cpu_todtime_update_int_addr_reg, + NULL, + NULL, + }, + { + "trpg_tx_todtime_ram", + TRPG_TRPG_TX_TODTIME_RAM_TRPG_TX_TODTIME_RAMr, + TRPG, + DPP_REG_FLAG_DIRECT, + DPP_REG_UNI_ARRAY, + SYS_TRPG_BASE_ADDR + MODULE_TRPG_TX_TODTIME_RAM_BASE_ADDR + 0x0000, + (32/8), + 0, + 4095 + 1, + 0, + 4, + 1, + g_trpg_trpg_tx_todtime_ram_trpg_tx_todtime_ram_reg, + NULL, + NULL, + }, + { + "cfg_tsn_test_reg", + TSN_TSN_PORT_CFG_TSN_TEST_REGr, + TSN, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TSN_BASE_ADDR + MODULE_TSN_PORT0_BASE_ADDR + 0x000, + (32/8), + DPP_TSN_PORT_NUM, + 0, + DPP_TSN_PORT_SPACE_SIZE, + 0, + 1, + g_tsn_tsn_port_cfg_tsn_test_reg_reg, + NULL, + NULL, + }, + { + "cfg_tsn_port_qbv_enable", + TSN_TSN_PORT_CFG_TSN_PORT_QBV_ENABLEr, + TSN, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TSN_BASE_ADDR + MODULE_TSN_PORT0_BASE_ADDR + 0x0004, + (32/8), + DPP_TSN_PORT_NUM, + 0, + DPP_TSN_PORT_SPACE_SIZE, + 0, + 1, + g_tsn_tsn_port_cfg_tsn_port_qbv_enable_reg, + NULL, + NULL, + }, + { + "cfg_tsn_phy_port_sel", + TSN_TSN_PORT_CFG_TSN_PHY_PORT_SELr, + TSN, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TSN_BASE_ADDR + MODULE_TSN_PORT0_BASE_ADDR + 0x0008, + (32/8), + DPP_TSN_PORT_NUM, + 0, + DPP_TSN_PORT_SPACE_SIZE, + 0, + 1, + g_tsn_tsn_port_cfg_tsn_phy_port_sel_reg, + NULL, + NULL, + }, + { + "cfg_tsn_port_time_sel", + TSN_TSN_PORT_CFG_TSN_PORT_TIME_SELr, + TSN, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TSN_BASE_ADDR + MODULE_TSN_PORT0_BASE_ADDR + 0x000c, + (32/8), + DPP_TSN_PORT_NUM, + 0, + DPP_TSN_PORT_SPACE_SIZE, + 0, + 1, + g_tsn_tsn_port_cfg_tsn_port_time_sel_reg, + NULL, + NULL, + }, + { + "cfg_tsn_clk_freq", + TSN_TSN_PORT_CFG_TSN_CLK_FREQr, + TSN, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TSN_BASE_ADDR + MODULE_TSN_PORT0_BASE_ADDR + 0x0014, + (32/8), + DPP_TSN_PORT_NUM, + 0, + DPP_TSN_PORT_SPACE_SIZE, + 0, + 2, + g_tsn_tsn_port_cfg_tsn_clk_freq_reg, + NULL, + NULL, + }, + { + "cfg_tsn_read_ram_n", + TSN_TSN_PORT_CFG_TSN_READ_RAM_Nr, + TSN, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TSN_BASE_ADDR + MODULE_TSN_PORT0_BASE_ADDR + 0x0018, + (32/8), + DPP_TSN_PORT_NUM, + 0, + DPP_TSN_PORT_SPACE_SIZE, + 0, + 3, + g_tsn_tsn_port_cfg_tsn_read_ram_n_reg, + NULL, + NULL, + }, + { + "cfg_tsn_exe_time", + TSN_TSN_PORT_CFG_TSN_EXE_TIMEr, + TSN, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TSN_BASE_ADDR + MODULE_TSN_PORT0_BASE_ADDR + 0x001c, + (32/8), + DPP_TSN_PORT_NUM, + 0, + DPP_TSN_PORT_SPACE_SIZE, + 0, + 1, + g_tsn_tsn_port_cfg_tsn_exe_time_reg, + NULL, + NULL, + }, + { + "cfg_tsn_port_itr_shift", + TSN_TSN_PORT_CFG_TSN_PORT_ITR_SHIFTr, + TSN, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TSN_BASE_ADDR + MODULE_TSN_PORT0_BASE_ADDR + 0x0020, + (32/8), + DPP_TSN_PORT_NUM, + 0, + DPP_TSN_PORT_SPACE_SIZE, + 0, + 1, + g_tsn_tsn_port_cfg_tsn_port_itr_shift_reg, + NULL, + NULL, + }, + { + "cfg_tsn_port_base_time_h", + TSN_TSN_PORT_CFG_TSN_PORT_BASE_TIME_Hr, + TSN, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TSN_BASE_ADDR + MODULE_TSN_PORT0_BASE_ADDR + 0x0024, + (32/8), + DPP_TSN_PORT_NUM, + 0, + DPP_TSN_PORT_SPACE_SIZE, + 0, + 1, + g_tsn_tsn_port_cfg_tsn_port_base_time_h_reg, + NULL, + NULL, + }, + { + "cfg_tsn_port_base_time_l", + TSN_TSN_PORT_CFG_TSN_PORT_BASE_TIME_Lr, + TSN, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TSN_BASE_ADDR + MODULE_TSN_PORT0_BASE_ADDR + 0x0028, + (32/8), + DPP_TSN_PORT_NUM, + 0, + DPP_TSN_PORT_SPACE_SIZE, + 0, + 1, + g_tsn_tsn_port_cfg_tsn_port_base_time_l_reg, + NULL, + NULL, + }, + { + "cfg_tsn_port_cycle_time_h", + TSN_TSN_PORT_CFG_TSN_PORT_CYCLE_TIME_Hr, + TSN, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TSN_BASE_ADDR + MODULE_TSN_PORT0_BASE_ADDR + 0x0030, + (32/8), + DPP_TSN_PORT_NUM, + 0, + DPP_TSN_PORT_SPACE_SIZE, + 0, + 1, + g_tsn_tsn_port_cfg_tsn_port_cycle_time_h_reg, + NULL, + NULL, + }, + { + "cfg_tsn_port_cycle_time_l", + TSN_TSN_PORT_CFG_TSN_PORT_CYCLE_TIME_Lr, + TSN, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TSN_BASE_ADDR + MODULE_TSN_PORT0_BASE_ADDR + 0x0034, + (32/8), + DPP_TSN_PORT_NUM, + 0, + DPP_TSN_PORT_SPACE_SIZE, + 0, + 1, + g_tsn_tsn_port_cfg_tsn_port_cycle_time_l_reg, + NULL, + NULL, + }, + { + "cfg_tsn_port_guard_band_time", + TSN_TSN_PORT_CFG_TSN_PORT_GUARD_BAND_TIMEr, + TSN, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TSN_BASE_ADDR + MODULE_TSN_PORT0_BASE_ADDR + 0x0040, + (32/8), + DPP_TSN_PORT_NUM, + 7 + 1, + DPP_TSN_PORT_SPACE_SIZE, + 4, + 1, + g_tsn_tsn_port_cfg_tsn_port_guard_band_time_reg, + NULL, + NULL, + }, + { + "cfg_tsn_port_default_gate_en", + TSN_TSN_PORT_CFG_TSN_PORT_DEFAULT_GATE_ENr, + TSN, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TSN_BASE_ADDR + MODULE_TSN_PORT0_BASE_ADDR + 0x0060, + (32/8), + DPP_TSN_PORT_NUM, + 0, + DPP_TSN_PORT_SPACE_SIZE, + 0, + 1, + g_tsn_tsn_port_cfg_tsn_port_default_gate_en_reg, + NULL, + NULL, + }, + { + "cfg_tsn_port_change_gate_en", + TSN_TSN_PORT_CFG_TSN_PORT_CHANGE_GATE_ENr, + TSN, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TSN_BASE_ADDR + MODULE_TSN_PORT0_BASE_ADDR + 0x0064, + (32/8), + DPP_TSN_PORT_NUM, + 0, + DPP_TSN_PORT_SPACE_SIZE, + 0, + 1, + g_tsn_tsn_port_cfg_tsn_port_change_gate_en_reg, + NULL, + NULL, + }, + { + "cfg_tsn_port_init_finish", + TSN_TSN_PORT_CFG_TSN_PORT_INIT_FINISHr, + TSN, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TSN_BASE_ADDR + MODULE_TSN_PORT0_BASE_ADDR + 0x0068, + (32/8), + DPP_TSN_PORT_NUM, + 0, + DPP_TSN_PORT_SPACE_SIZE, + 0, + 1, + g_tsn_tsn_port_cfg_tsn_port_init_finish_reg, + NULL, + NULL, + }, + { + "cfg_tsn_port_change_en", + TSN_TSN_PORT_CFG_TSN_PORT_CHANGE_ENr, + TSN, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TSN_BASE_ADDR + MODULE_TSN_PORT0_BASE_ADDR + 0x006c, + (32/8), + DPP_TSN_PORT_NUM, + 0, + DPP_TSN_PORT_SPACE_SIZE, + 0, + 1, + g_tsn_tsn_port_cfg_tsn_port_change_en_reg, + NULL, + NULL, + }, + { + "cfg_tsn_port_gcl_num0", + TSN_TSN_PORT_CFG_TSN_PORT_GCL_NUM0r, + TSN, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TSN_BASE_ADDR + MODULE_TSN_PORT0_BASE_ADDR + 0x0070, + (32/8), + DPP_TSN_PORT_NUM, + 0, + DPP_TSN_PORT_SPACE_SIZE, + 0, + 1, + g_tsn_tsn_port_cfg_tsn_port_gcl_num0_reg, + NULL, + NULL, + }, + { + "cfg_tsn_port_gcl_num1", + TSN_TSN_PORT_CFG_TSN_PORT_GCL_NUM1r, + TSN, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TSN_BASE_ADDR + MODULE_TSN_PORT0_BASE_ADDR + 0x0074, + (32/8), + DPP_TSN_PORT_NUM, + 0, + DPP_TSN_PORT_SPACE_SIZE, + 0, + 1, + g_tsn_tsn_port_cfg_tsn_port_gcl_num1_reg, + NULL, + NULL, + }, + { + "cfg_tsn_port_gcl_value0", + TSN_TSN_PORT_CFG_TSN_PORT_GCL_VALUE0r, + TSN, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TSN_BASE_ADDR + MODULE_TSN_PORT0_BASE_ADDR + 0x1000, + (32/8), + DPP_TSN_PORT_NUM, + 255 + 1, + DPP_TSN_PORT_SPACE_SIZE, + 4, + 2, + g_tsn_tsn_port_cfg_tsn_port_gcl_value0_reg, + NULL, + NULL, + }, + { + "cfg_tsn_port_gcl_value1", + TSN_TSN_PORT_CFG_TSN_PORT_GCL_VALUE1r, + TSN, + DPP_REG_FLAG_DIRECT, + DPP_REG_BIN_ARRAY, + SYS_TSN_BASE_ADDR + MODULE_TSN_PORT0_BASE_ADDR + 0x2000, + (32/8), + DPP_TSN_PORT_NUM, + 255 + 1, + DPP_TSN_PORT_SPACE_SIZE, + 4, + 2, + g_tsn_tsn_port_cfg_tsn_port_gcl_value1_reg, + NULL, + NULL, + }, + { + "cfg_epid_v_func_num", + AXI_AXI_CONV_CFG_EPID_V_FUNC_NUMr, + AXI, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_AXI_CONV_BASE_ADDR + 0x0010, + (32/8), + 0, + 0, + 0, + 0, + 5, + g_axi_axi_conv_cfg_epid_v_func_num_reg, + NULL, + NULL, + }, + { + "info_axim_rw_hsk_cnt", + AXI_AXI_CONV_INFO_AXIM_RW_HSK_CNTr, + AXI, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_AXI_CONV_BASE_ADDR + 0x0020, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_axi_axi_conv_info_axim_rw_hsk_cnt_reg, + NULL, + NULL, + }, + { + "info_axim_last_wr_id", + AXI_AXI_CONV_INFO_AXIM_LAST_WR_IDr, + AXI, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_AXI_CONV_BASE_ADDR + 0x0024, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_axi_axi_conv_info_axim_last_wr_id_reg, + NULL, + NULL, + }, + { + "info_axim_last_wr_addr_h", + AXI_AXI_CONV_INFO_AXIM_LAST_WR_ADDR_Hr, + AXI, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_AXI_CONV_BASE_ADDR + 0x0030, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_axi_axi_conv_info_axim_last_wr_addr_h_reg, + NULL, + NULL, + }, + { + "info_axim_last_wr_addr_l", + AXI_AXI_CONV_INFO_AXIM_LAST_WR_ADDR_Lr, + AXI, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_AXI_CONV_BASE_ADDR + 0x0034, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_axi_axi_conv_info_axim_last_wr_addr_l_reg, + NULL, + NULL, + }, + { + "cfg_debug_info_clr_en", + AXI_AXI_CONV_CFG_DEBUG_INFO_CLR_ENr, + AXI, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_AXI_CONV_BASE_ADDR + 0x0038, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_axi_axi_conv_cfg_debug_info_clr_en_reg, + NULL, + NULL, + }, + { + "pp1s_interrupt", + PTPTM_PTP_TOP_PP1S_INTERRUPTr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x0000, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_ptptm_ptp_top_pp1s_interrupt_reg, + NULL, + NULL, + }, + { + "pp1s_external_select", + PTPTM_PTP_TOP_PP1S_EXTERNAL_SELECTr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x0004, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptp_top_pp1s_external_select_reg, + NULL, + NULL, + }, + { + "pp1s_out_select", + PTPTM_PTP_TOP_PP1S_OUT_SELECTr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x0008, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptp_top_pp1s_out_select_reg, + NULL, + NULL, + }, + { + "test_pp1s_select", + PTPTM_PTP_TOP_TEST_PP1S_SELECTr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x000c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptp_top_test_pp1s_select_reg, + NULL, + NULL, + }, + { + "local_pp1s_en", + PTPTM_PTP_TOP_LOCAL_PP1S_ENr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x0010, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptp_top_local_pp1s_en_reg, + NULL, + NULL, + }, + { + "local_pp1s_adjust", + PTPTM_PTP_TOP_LOCAL_PP1S_ADJUSTr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x0014, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_ptptm_ptp_top_local_pp1s_adjust_reg, + NULL, + NULL, + }, + { + "local_pp1s_adjust_value", + PTPTM_PTP_TOP_LOCAL_PP1S_ADJUST_VALUEr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x0018, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptp_top_local_pp1s_adjust_value_reg, + NULL, + NULL, + }, + { + "pp1s_to_np_select", + PTPTM_PTP_TOP_PP1S_TO_NP_SELECTr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x001c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptp_top_pp1s_to_np_select_reg, + NULL, + NULL, + }, + { + "pd_u1_sel", + PTPTM_PTP_TOP_PD_U1_SELr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x0040, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_ptptm_ptp_top_pd_u1_sel_reg, + NULL, + NULL, + }, + { + "pd_u1_pd0_shift", + PTPTM_PTP_TOP_PD_U1_PD0_SHIFTr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x0044, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptp_top_pd_u1_pd0_shift_reg, + NULL, + NULL, + }, + { + "pd_u1_pd1_shift", + PTPTM_PTP_TOP_PD_U1_PD1_SHIFTr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x0048, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptp_top_pd_u1_pd1_shift_reg, + NULL, + NULL, + }, + { + "pd_u1_result", + PTPTM_PTP_TOP_PD_U1_RESULTr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x004c, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_ptptm_ptp_top_pd_u1_result_reg, + NULL, + NULL, + }, + { + "pd_u2_sel", + PTPTM_PTP_TOP_PD_U2_SELr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x0050, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_ptptm_ptp_top_pd_u2_sel_reg, + NULL, + NULL, + }, + { + "pd_u2_pd0_shift", + PTPTM_PTP_TOP_PD_U2_PD0_SHIFTr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x0054, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptp_top_pd_u2_pd0_shift_reg, + NULL, + NULL, + }, + { + "pd_u2_pd1_shift", + PTPTM_PTP_TOP_PD_U2_PD1_SHIFTr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x0058, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptp_top_pd_u2_pd1_shift_reg, + NULL, + NULL, + }, + { + "pd_u2_result", + PTPTM_PTP_TOP_PD_U2_RESULTr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x005c, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_ptptm_ptp_top_pd_u2_result_reg, + NULL, + NULL, + }, + { + "tsn_group_nanosecond_delay0", + PTPTM_PTP_TOP_TSN_GROUP_NANOSECOND_DELAY0r, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x0080, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptp_top_tsn_group_nanosecond_delay0_reg, + NULL, + NULL, + }, + { + "tsn_group_fracnanosecond_delay0", + PTPTM_PTP_TOP_TSN_GROUP_FRACNANOSECOND_DELAY0r, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x0084, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptp_top_tsn_group_fracnanosecond_delay0_reg, + NULL, + NULL, + }, + { + "tsn_group_nanosecond_delay1", + PTPTM_PTP_TOP_TSN_GROUP_NANOSECOND_DELAY1r, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x0088, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptp_top_tsn_group_nanosecond_delay1_reg, + NULL, + NULL, + }, + { + "tsn_group_fracnanosecond_delay1", + PTPTM_PTP_TOP_TSN_GROUP_FRACNANOSECOND_DELAY1r, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x008c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptp_top_tsn_group_fracnanosecond_delay1_reg, + NULL, + NULL, + }, + { + "tsn_group_nanosecond_delay2", + PTPTM_PTP_TOP_TSN_GROUP_NANOSECOND_DELAY2r, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x0090, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptp_top_tsn_group_nanosecond_delay2_reg, + NULL, + NULL, + }, + { + "tsn_group_fracnanosecond_delay2", + PTPTM_PTP_TOP_TSN_GROUP_FRACNANOSECOND_DELAY2r, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x0094, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptp_top_tsn_group_fracnanosecond_delay2_reg, + NULL, + NULL, + }, + { + "tsn_group_nanosecond_delay3", + PTPTM_PTP_TOP_TSN_GROUP_NANOSECOND_DELAY3r, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x0098, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptp_top_tsn_group_nanosecond_delay3_reg, + NULL, + NULL, + }, + { + "tsn_group_fracnanosecond_delay3", + PTPTM_PTP_TOP_TSN_GROUP_FRACNANOSECOND_DELAY3r, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x009c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptp_top_tsn_group_fracnanosecond_delay3_reg, + NULL, + NULL, + }, + { + "tsn_ptp1588_rdma_nanosecond_delay", + PTPTM_PTP_TOP_TSN_PTP1588_RDMA_NANOSECOND_DELAYr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x00a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptp_top_tsn_ptp1588_rdma_nanosecond_delay_reg, + NULL, + NULL, + }, + { + "ptp1588_rdma_fracnanosecond_delay", + PTPTM_PTP_TOP_PTP1588_RDMA_FRACNANOSECOND_DELAYr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x00a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptp_top_ptp1588_rdma_fracnanosecond_delay_reg, + NULL, + NULL, + }, + { + "ptp1588_np_nanosecond_delay", + PTPTM_PTP_TOP_PTP1588_NP_NANOSECOND_DELAYr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x00a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptp_top_ptp1588_np_nanosecond_delay_reg, + NULL, + NULL, + }, + { + "ptp1588_np_fracnanosecond_delay", + PTPTM_PTP_TOP_PTP1588_NP_FRACNANOSECOND_DELAYr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x00ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptp_top_ptp1588_np_fracnanosecond_delay_reg, + NULL, + NULL, + }, + { + "time_sync_period", + PTPTM_PTP_TOP_TIME_SYNC_PERIODr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP0_BASE_ADDR + 0x00b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptp_top_time_sync_period_reg, + NULL, + NULL, + }, + { + "module_id", + PTPTM_PTPTM_MODULE_IDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0000, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_module_id_reg, + NULL, + NULL, + }, + { + "module_version", + PTPTM_PTPTM_MODULE_VERSIONr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0008, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_ptptm_ptptm_module_version_reg, + NULL, + NULL, + }, + { + "module_date", + PTPTM_PTPTM_MODULE_DATEr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x000c, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_ptptm_ptptm_module_date_reg, + NULL, + NULL, + }, + { + "interrupt_status", + PTPTM_PTPTM_INTERRUPT_STATUSr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0010, + (32/8), + 0, + 0, + 0, + 0, + 5, + g_ptptm_ptptm_interrupt_status_reg, + NULL, + NULL, + }, + { + "interrupt_event", + PTPTM_PTPTM_INTERRUPT_EVENTr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0014, + (32/8), + 0, + 0, + 0, + 0, + 5, + g_ptptm_ptptm_interrupt_event_reg, + NULL, + NULL, + }, + { + "interrupt_mask", + PTPTM_PTPTM_INTERRUPT_MASKr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0018, + (32/8), + 0, + 0, + 0, + 0, + 5, + g_ptptm_ptptm_interrupt_mask_reg, + NULL, + NULL, + }, + { + "interrupt_test", + PTPTM_PTPTM_INTERRUPT_TESTr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x001c, + (32/8), + 0, + 0, + 0, + 0, + 5, + g_ptptm_ptptm_interrupt_test_reg, + NULL, + NULL, + }, + { + "hw_clock_cycle_integer", + PTPTM_PTPTM_HW_CLOCK_CYCLE_INTEGERr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0028, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_hw_clock_cycle_integer_reg, + NULL, + NULL, + }, + { + "hw_clock_cycle_fraction", + PTPTM_PTPTM_HW_CLOCK_CYCLE_FRACTIONr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x002c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_hw_clock_cycle_fraction_reg, + NULL, + NULL, + }, + { + "ptp_clock_cycle_integer", + PTPTM_PTPTM_PTP_CLOCK_CYCLE_INTEGERr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0030, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_ptp_clock_cycle_integer_reg, + NULL, + NULL, + }, + { + "ptp_clock_cycle_fraction", + PTPTM_PTPTM_PTP_CLOCK_CYCLE_FRACTIONr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0034, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_ptp_clock_cycle_fraction_reg, + NULL, + NULL, + }, + { + "ptp_configuration", + PTPTM_PTPTM_PTP_CONFIGURATIONr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0040, + (32/8), + 0, + 0, + 0, + 0, + 18, + g_ptptm_ptptm_ptp_configuration_reg, + NULL, + NULL, + }, + { + "timer_control", + PTPTM_PTPTM_TIMER_CONTROLr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0044, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_ptptm_ptptm_timer_control_reg, + NULL, + NULL, + }, + { + "pps_income_delay", + PTPTM_PTPTM_PPS_INCOME_DELAYr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0048, + (32/8), + 0, + 0, + 0, + 0, + 2, + g_ptptm_ptptm_pps_income_delay_reg, + NULL, + NULL, + }, + { + "clock_cycle_update", + PTPTM_PTPTM_CLOCK_CYCLE_UPDATEr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x004c, + (32/8), + 0, + 0, + 0, + 0, + 5, + g_ptptm_ptptm_clock_cycle_update_reg, + NULL, + NULL, + }, + { + "cycle_time_of_output_period_pulse_1", + PTPTM_PTPTM_CYCLE_TIME_OF_OUTPUT_PERIOD_PULSE_1r, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0050, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_cycle_time_of_output_period_pulse_1_reg, + NULL, + NULL, + }, + { + "cycle_time_of_output_period_pulse_2", + PTPTM_PTPTM_CYCLE_TIME_OF_OUTPUT_PERIOD_PULSE_2r, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0054, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_cycle_time_of_output_period_pulse_2_reg, + NULL, + NULL, + }, + { + "timer_latch_en", + PTPTM_PTPTM_TIMER_LATCH_ENr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0058, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_timer_latch_en_reg, + NULL, + NULL, + }, + { + "timer_latch_sel", + PTPTM_PTPTM_TIMER_LATCH_SELr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x005c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_timer_latch_sel_reg, + NULL, + NULL, + }, + { + "trigger_in_tod_nanosecond", + PTPTM_PTPTM_TRIGGER_IN_TOD_NANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0060, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_trigger_in_tod_nanosecond_reg, + NULL, + NULL, + }, + { + "trigger_in_lower_tod_second", + PTPTM_PTPTM_TRIGGER_IN_LOWER_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0064, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_trigger_in_lower_tod_second_reg, + NULL, + NULL, + }, + { + "trigger_in_high_tod_second", + PTPTM_PTPTM_TRIGGER_IN_HIGH_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0068, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_trigger_in_high_tod_second_reg, + NULL, + NULL, + }, + { + "trigger_in_fracnanosecond", + PTPTM_PTPTM_TRIGGER_IN_FRACNANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x006c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_trigger_in_fracnanosecond_reg, + NULL, + NULL, + }, + { + "trigger_in_hardware_time_low", + PTPTM_PTPTM_TRIGGER_IN_HARDWARE_TIME_LOWr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0070, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_trigger_in_hardware_time_low_reg, + NULL, + NULL, + }, + { + "trigger_in_hardware_time_high", + PTPTM_PTPTM_TRIGGER_IN_HARDWARE_TIME_HIGHr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0074, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_trigger_in_hardware_time_high_reg, + NULL, + NULL, + }, + { + "trigger_out_tod_nanosecond", + PTPTM_PTPTM_TRIGGER_OUT_TOD_NANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0080, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_trigger_out_tod_nanosecond_reg, + NULL, + NULL, + }, + { + "trigger_out_lower_tod_second", + PTPTM_PTPTM_TRIGGER_OUT_LOWER_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0084, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_trigger_out_lower_tod_second_reg, + NULL, + NULL, + }, + { + "trigger_out_high_tod_second", + PTPTM_PTPTM_TRIGGER_OUT_HIGH_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0088, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_trigger_out_high_tod_second_reg, + NULL, + NULL, + }, + { + "trigger_out_hardware_time_low", + PTPTM_PTPTM_TRIGGER_OUT_HARDWARE_TIME_LOWr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0090, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_trigger_out_hardware_time_low_reg, + NULL, + NULL, + }, + { + "trigger_out_hardware_time_high", + PTPTM_PTPTM_TRIGGER_OUT_HARDWARE_TIME_HIGHr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0094, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_trigger_out_hardware_time_high_reg, + NULL, + NULL, + }, + { + "adjust_tod_nanosecond", + PTPTM_PTPTM_ADJUST_TOD_NANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x00a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_adjust_tod_nanosecond_reg, + NULL, + NULL, + }, + { + "adjust_lower_tod_second", + PTPTM_PTPTM_ADJUST_LOWER_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x00a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_adjust_lower_tod_second_reg, + NULL, + NULL, + }, + { + "adjust_high_tod_second", + PTPTM_PTPTM_ADJUST_HIGH_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x00a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_adjust_high_tod_second_reg, + NULL, + NULL, + }, + { + "adjust_fracnanosecond", + PTPTM_PTPTM_ADJUST_FRACNANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x00ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_adjust_fracnanosecond_reg, + NULL, + NULL, + }, + { + "adjust_hardware_time_low", + PTPTM_PTPTM_ADJUST_HARDWARE_TIME_LOWr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x00b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_adjust_hardware_time_low_reg, + NULL, + NULL, + }, + { + "adjust_hardware_time_high", + PTPTM_PTPTM_ADJUST_HARDWARE_TIME_HIGHr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x00b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_adjust_hardware_time_high_reg, + NULL, + NULL, + }, + { + "latch_tod_nanosecond", + PTPTM_PTPTM_LATCH_TOD_NANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x00c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_latch_tod_nanosecond_reg, + NULL, + NULL, + }, + { + "latch_lower_tod_second", + PTPTM_PTPTM_LATCH_LOWER_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x00c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_latch_lower_tod_second_reg, + NULL, + NULL, + }, + { + "latch_high_tod_second", + PTPTM_PTPTM_LATCH_HIGH_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x00c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_latch_high_tod_second_reg, + NULL, + NULL, + }, + { + "latch_fracnanosecond", + PTPTM_PTPTM_LATCH_FRACNANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x00cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_latch_fracnanosecond_reg, + NULL, + NULL, + }, + { + "latch_hardware_time_low", + PTPTM_PTPTM_LATCH_HARDWARE_TIME_LOWr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x00d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_latch_hardware_time_low_reg, + NULL, + NULL, + }, + { + "latch_hardware_time_high", + PTPTM_PTPTM_LATCH_HARDWARE_TIME_HIGHr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x00d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_latch_hardware_time_high_reg, + NULL, + NULL, + }, + { + "real_tod_nanosecond", + PTPTM_PTPTM_REAL_TOD_NANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x00e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_real_tod_nanosecond_reg, + NULL, + NULL, + }, + { + "real_lower_tod_second", + PTPTM_PTPTM_REAL_LOWER_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x00e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_real_lower_tod_second_reg, + NULL, + NULL, + }, + { + "real_high_tod_second", + PTPTM_PTPTM_REAL_HIGH_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x00e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_real_high_tod_second_reg, + NULL, + NULL, + }, + { + "real_hardware_time_low", + PTPTM_PTPTM_REAL_HARDWARE_TIME_LOWr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x00f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_real_hardware_time_low_reg, + NULL, + NULL, + }, + { + "real_hardware_time_high", + PTPTM_PTPTM_REAL_HARDWARE_TIME_HIGHr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x00f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_real_hardware_time_high_reg, + NULL, + NULL, + }, + { + "ptp1588_event_message_port", + PTPTM_PTPTM_PTP1588_EVENT_MESSAGE_PORTr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0100, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_ptp1588_event_message_port_reg, + NULL, + NULL, + }, + { + "ptp1588_event_message_timestamp_low", + PTPTM_PTPTM_PTP1588_EVENT_MESSAGE_TIMESTAMP_LOWr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0104, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_ptp1588_event_message_timestamp_low_reg, + NULL, + NULL, + }, + { + "ptp1588_event_message_timestamp_high", + PTPTM_PTPTM_PTP1588_EVENT_MESSAGE_TIMESTAMP_HIGHr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0108, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_ptp1588_event_message_timestamp_high_reg, + NULL, + NULL, + }, + { + "ptp1588_event_message_fifo_status", + PTPTM_PTPTM_PTP1588_EVENT_MESSAGE_FIFO_STATUSr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x010c, + (32/8), + 0, + 0, + 0, + 0, + 3, + g_ptptm_ptptm_ptp1588_event_message_fifo_status_reg, + NULL, + NULL, + }, + { + "pp1s_latch_tod_nanosecond", + PTPTM_PTPTM_PP1S_LATCH_TOD_NANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0120, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_pp1s_latch_tod_nanosecond_reg, + NULL, + NULL, + }, + { + "pp1s_latch_lower_tod_second", + PTPTM_PTPTM_PP1S_LATCH_LOWER_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0124, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_pp1s_latch_lower_tod_second_reg, + NULL, + NULL, + }, + { + "pp1s_latch_high_tod_second", + PTPTM_PTPTM_PP1S_LATCH_HIGH_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0128, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_pp1s_latch_high_tod_second_reg, + NULL, + NULL, + }, + { + "pp1s_latch_fracnanosecond", + PTPTM_PTPTM_PP1S_LATCH_FRACNANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x012c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_pp1s_latch_fracnanosecond_reg, + NULL, + NULL, + }, + { + "tsn_time_configuration", + PTPTM_PTPTM_TSN_TIME_CONFIGURATIONr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0140, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_ptptm_ptptm_tsn_time_configuration_reg, + NULL, + NULL, + }, + { + "tsn_timer_control", + PTPTM_PTPTM_TSN_TIMER_CONTROLr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x00144, + (32/8), + 0, + 0, + 0, + 0, + 4, + g_ptptm_ptptm_tsn_timer_control_reg, + NULL, + NULL, + }, + { + "tsn0_clock_cycle_integer", + PTPTM_PTPTM_TSN0_CLOCK_CYCLE_INTEGERr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x00148, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn0_clock_cycle_integer_reg, + NULL, + NULL, + }, + { + "tsn0_clock_cycle_fraction", + PTPTM_PTPTM_TSN0_CLOCK_CYCLE_FRACTIONr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x014c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn0_clock_cycle_fraction_reg, + NULL, + NULL, + }, + { + "tsn1_clock_cycle_integer", + PTPTM_PTPTM_TSN1_CLOCK_CYCLE_INTEGERr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0150, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn1_clock_cycle_integer_reg, + NULL, + NULL, + }, + { + "tsn1_clock_cycle_fraction", + PTPTM_PTPTM_TSN1_CLOCK_CYCLE_FRACTIONr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0154, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn1_clock_cycle_fraction_reg, + NULL, + NULL, + }, + { + "tsn2_clock_cycle_integer", + PTPTM_PTPTM_TSN2_CLOCK_CYCLE_INTEGERr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0158, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn2_clock_cycle_integer_reg, + NULL, + NULL, + }, + { + "tsn2_clock_cycle_fraction", + PTPTM_PTPTM_TSN2_CLOCK_CYCLE_FRACTIONr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x015c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn2_clock_cycle_fraction_reg, + NULL, + NULL, + }, + { + "tsn3_clock_cycle_integer", + PTPTM_PTPTM_TSN3_CLOCK_CYCLE_INTEGERr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0160, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn3_clock_cycle_integer_reg, + NULL, + NULL, + }, + { + "tsn3_clock_cycle_fraction", + PTPTM_PTPTM_TSN3_CLOCK_CYCLE_FRACTIONr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0164, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn3_clock_cycle_fraction_reg, + NULL, + NULL, + }, + { + "tsn0_adjust_tod_nanosecond", + PTPTM_PTPTM_TSN0_ADJUST_TOD_NANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0180, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn0_adjust_tod_nanosecond_reg, + NULL, + NULL, + }, + { + "tsn0_adjust_lower_tod_second", + PTPTM_PTPTM_TSN0_ADJUST_LOWER_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0184, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn0_adjust_lower_tod_second_reg, + NULL, + NULL, + }, + { + "tsn0_adjust_high_tod_second", + PTPTM_PTPTM_TSN0_ADJUST_HIGH_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0188, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn0_adjust_high_tod_second_reg, + NULL, + NULL, + }, + { + "tsn0_adjust_fracnanosecond", + PTPTM_PTPTM_TSN0_ADJUST_FRACNANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x018c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn0_adjust_fracnanosecond_reg, + NULL, + NULL, + }, + { + "tsn1_adjust_tod_nanosecond", + PTPTM_PTPTM_TSN1_ADJUST_TOD_NANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0190, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn1_adjust_tod_nanosecond_reg, + NULL, + NULL, + }, + { + "tsn1_adjust_lower_tod_second", + PTPTM_PTPTM_TSN1_ADJUST_LOWER_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0194, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn1_adjust_lower_tod_second_reg, + NULL, + NULL, + }, + { + "tsn1_adjust_high_tod_second", + PTPTM_PTPTM_TSN1_ADJUST_HIGH_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0198, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn1_adjust_high_tod_second_reg, + NULL, + NULL, + }, + { + "tsn1_adjust_fracnanosecond", + PTPTM_PTPTM_TSN1_ADJUST_FRACNANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x019c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn1_adjust_fracnanosecond_reg, + NULL, + NULL, + }, + { + "tsn2_adjust_tod_nanosecond", + PTPTM_PTPTM_TSN2_ADJUST_TOD_NANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x01a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn2_adjust_tod_nanosecond_reg, + NULL, + NULL, + }, + { + "tsn2_adjust_lower_tod_second", + PTPTM_PTPTM_TSN2_ADJUST_LOWER_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x01a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn2_adjust_lower_tod_second_reg, + NULL, + NULL, + }, + { + "tsn2_adjust_high_tod_second", + PTPTM_PTPTM_TSN2_ADJUST_HIGH_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x01a8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn2_adjust_high_tod_second_reg, + NULL, + NULL, + }, + { + "tsn2_adjust_fracnanosecond", + PTPTM_PTPTM_TSN2_ADJUST_FRACNANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x01ac, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn2_adjust_fracnanosecond_reg, + NULL, + NULL, + }, + { + "tsn3_adjust_tod_nanosecond", + PTPTM_PTPTM_TSN3_ADJUST_TOD_NANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x01b0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn3_adjust_tod_nanosecond_reg, + NULL, + NULL, + }, + { + "tsn3_adjust_lower_tod_second", + PTPTM_PTPTM_TSN3_ADJUST_LOWER_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x01b4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn3_adjust_lower_tod_second_reg, + NULL, + NULL, + }, + { + "tsn3_adjust_high_tod_second", + PTPTM_PTPTM_TSN3_ADJUST_HIGH_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x01b8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn3_adjust_high_tod_second_reg, + NULL, + NULL, + }, + { + "tsn3_adjust_fracnanosecond", + PTPTM_PTPTM_TSN3_ADJUST_FRACNANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x01bc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn3_adjust_fracnanosecond_reg, + NULL, + NULL, + }, + { + "tsn0_latch_tod_nanosecond", + PTPTM_PTPTM_TSN0_LATCH_TOD_NANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x01c0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn0_latch_tod_nanosecond_reg, + NULL, + NULL, + }, + { + "tsn0_latch_lower_tod_second", + PTPTM_PTPTM_TSN0_LATCH_LOWER_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x01c4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn0_latch_lower_tod_second_reg, + NULL, + NULL, + }, + { + "tsn0_latch_high_tod_second", + PTPTM_PTPTM_TSN0_LATCH_HIGH_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x01c8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn0_latch_high_tod_second_reg, + NULL, + NULL, + }, + { + "tsn0_latch_fracnanosecond", + PTPTM_PTPTM_TSN0_LATCH_FRACNANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x01cc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn0_latch_fracnanosecond_reg, + NULL, + NULL, + }, + { + "tsn1_latch_tod_nanosecond", + PTPTM_PTPTM_TSN1_LATCH_TOD_NANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x01d0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn1_latch_tod_nanosecond_reg, + NULL, + NULL, + }, + { + "tsn1_latch_lower_tod_second", + PTPTM_PTPTM_TSN1_LATCH_LOWER_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x01d4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn1_latch_lower_tod_second_reg, + NULL, + NULL, + }, + { + "tsn1_latch_high_tod_second", + PTPTM_PTPTM_TSN1_LATCH_HIGH_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x01d8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn1_latch_high_tod_second_reg, + NULL, + NULL, + }, + { + "tsn1_latch_fracnanosecond", + PTPTM_PTPTM_TSN1_LATCH_FRACNANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x01dc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn1_latch_fracnanosecond_reg, + NULL, + NULL, + }, + { + "tsn2_latch_tod_nanosecond", + PTPTM_PTPTM_TSN2_LATCH_TOD_NANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x01e0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn2_latch_tod_nanosecond_reg, + NULL, + NULL, + }, + { + "tsn2_latch_lower_tod_second", + PTPTM_PTPTM_TSN2_LATCH_LOWER_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x01e4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn2_latch_lower_tod_second_reg, + NULL, + NULL, + }, + { + "tsn2_latch_high_tod_second", + PTPTM_PTPTM_TSN2_LATCH_HIGH_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x01e8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn2_latch_high_tod_second_reg, + NULL, + NULL, + }, + { + "tsn2_latch_fracnanosecond", + PTPTM_PTPTM_TSN2_LATCH_FRACNANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x01ec, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn2_latch_fracnanosecond_reg, + NULL, + NULL, + }, + { + "tsn3_latch_tod_nanosecond", + PTPTM_PTPTM_TSN3_LATCH_TOD_NANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x01f0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn3_latch_tod_nanosecond_reg, + NULL, + NULL, + }, + { + "tsn3_latch_lower_tod_second", + PTPTM_PTPTM_TSN3_LATCH_LOWER_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x01f4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn3_latch_lower_tod_second_reg, + NULL, + NULL, + }, + { + "tsn3_latch_high_tod_second", + PTPTM_PTPTM_TSN3_LATCH_HIGH_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x01f8, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn3_latch_high_tod_second_reg, + NULL, + NULL, + }, + { + "tsn3_latch_fracnanosecond", + PTPTM_PTPTM_TSN3_LATCH_FRACNANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x01fc, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn3_latch_fracnanosecond_reg, + NULL, + NULL, + }, + { + "pp1s_latch_tsn0_tod_nanosecond", + PTPTM_PTPTM_PP1S_LATCH_TSN0_TOD_NANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0200, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_pp1s_latch_tsn0_tod_nanosecond_reg, + NULL, + NULL, + }, + { + "pp1s_latch_tsn0_lower_tod_second", + PTPTM_PTPTM_PP1S_LATCH_TSN0_LOWER_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0204, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_pp1s_latch_tsn0_lower_tod_second_reg, + NULL, + NULL, + }, + { + "pp1s_latch_tsn0_high_tod_second", + PTPTM_PTPTM_PP1S_LATCH_TSN0_HIGH_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0208, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_pp1s_latch_tsn0_high_tod_second_reg, + NULL, + NULL, + }, + { + "pp1s_latch_tsn0_fracnanosecond", + PTPTM_PTPTM_PP1S_LATCH_TSN0_FRACNANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x020c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_pp1s_latch_tsn0_fracnanosecond_reg, + NULL, + NULL, + }, + { + "pp1s_latch_tsn1_tod_nanosecond", + PTPTM_PTPTM_PP1S_LATCH_TSN1_TOD_NANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0210, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_pp1s_latch_tsn1_tod_nanosecond_reg, + NULL, + NULL, + }, + { + "pp1s_latch_tsn1_lower_tod_second", + PTPTM_PTPTM_PP1S_LATCH_TSN1_LOWER_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0214, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_pp1s_latch_tsn1_lower_tod_second_reg, + NULL, + NULL, + }, + { + "pp1s_latch_tsn1_high_tod_second", + PTPTM_PTPTM_PP1S_LATCH_TSN1_HIGH_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0218, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_pp1s_latch_tsn1_high_tod_second_reg, + NULL, + NULL, + }, + { + "pp1s_latch_tsn1_fracnanosecond", + PTPTM_PTPTM_PP1S_LATCH_TSN1_FRACNANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x021c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_pp1s_latch_tsn1_fracnanosecond_reg, + NULL, + NULL, + }, + { + "pp1s_latch_tsn2_tod_nanosecond", + PTPTM_PTPTM_PP1S_LATCH_TSN2_TOD_NANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0220, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_pp1s_latch_tsn2_tod_nanosecond_reg, + NULL, + NULL, + }, + { + "pp1s_latch_tsn2_lower_tod_second", + PTPTM_PTPTM_PP1S_LATCH_TSN2_LOWER_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0224, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_pp1s_latch_tsn2_lower_tod_second_reg, + NULL, + NULL, + }, + { + "pp1s_latch_tsn2_high_tod_second", + PTPTM_PTPTM_PP1S_LATCH_TSN2_HIGH_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0228, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_pp1s_latch_tsn2_high_tod_second_reg, + NULL, + NULL, + }, + { + "pp1s_latch_tsn2_fracnanosecond", + PTPTM_PTPTM_PP1S_LATCH_TSN2_FRACNANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x022c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_pp1s_latch_tsn2_fracnanosecond_reg, + NULL, + NULL, + }, + { + "pp1s_latch_tsn3_tod_nanosecond", + PTPTM_PTPTM_PP1S_LATCH_TSN3_TOD_NANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0230, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_pp1s_latch_tsn3_tod_nanosecond_reg, + NULL, + NULL, + }, + { + "pp1s_latch_tsn3_lower_tod_second", + PTPTM_PTPTM_PP1S_LATCH_TSN3_LOWER_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0234, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_pp1s_latch_tsn3_lower_tod_second_reg, + NULL, + NULL, + }, + { + "pp1s_latch_tsn3_high_tod_second", + PTPTM_PTPTM_PP1S_LATCH_TSN3_HIGH_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0238, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_pp1s_latch_tsn3_high_tod_second_reg, + NULL, + NULL, + }, + { + "pp1s_latch_tsn3_fracnanosecond", + PTPTM_PTPTM_PP1S_LATCH_TSN3_FRACNANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x023c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_pp1s_latch_tsn3_fracnanosecond_reg, + NULL, + NULL, + }, + { + "tsn0_real_tod_nanosecond", + PTPTM_PTPTM_TSN0_REAL_TOD_NANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0240, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn0_real_tod_nanosecond_reg, + NULL, + NULL, + }, + { + "tsn0_real_lower_tod_second", + PTPTM_PTPTM_TSN0_REAL_LOWER_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0244, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn0_real_lower_tod_second_reg, + NULL, + NULL, + }, + { + "tsn0_real_high_tod_second", + PTPTM_PTPTM_TSN0_REAL_HIGH_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0248, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn0_real_high_tod_second_reg, + NULL, + NULL, + }, + { + "tsn1_real_tod_nanosecond", + PTPTM_PTPTM_TSN1_REAL_TOD_NANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x024c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn1_real_tod_nanosecond_reg, + NULL, + NULL, + }, + { + "tsn1_real_lower_tod_second", + PTPTM_PTPTM_TSN1_REAL_LOWER_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0250, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn1_real_lower_tod_second_reg, + NULL, + NULL, + }, + { + "tsn1_real_high_tod_second", + PTPTM_PTPTM_TSN1_REAL_HIGH_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0254, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn1_real_high_tod_second_reg, + NULL, + NULL, + }, + { + "tsn2_real_tod_nanosecond", + PTPTM_PTPTM_TSN2_REAL_TOD_NANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0258, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn2_real_tod_nanosecond_reg, + NULL, + NULL, + }, + { + "tsn2_real_lower_tod_second", + PTPTM_PTPTM_TSN2_REAL_LOWER_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x025c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn2_real_lower_tod_second_reg, + NULL, + NULL, + }, + { + "tsn2_real_high_tod_second", + PTPTM_PTPTM_TSN2_REAL_HIGH_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0260, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn2_real_high_tod_second_reg, + NULL, + NULL, + }, + { + "tsn3_real_tod_nanosecond", + PTPTM_PTPTM_TSN3_REAL_TOD_NANOSECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0264, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn3_real_tod_nanosecond_reg, + NULL, + NULL, + }, + { + "tsn3_real_lower_tod_second", + PTPTM_PTPTM_TSN3_REAL_LOWER_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0268, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn3_real_lower_tod_second_reg, + NULL, + NULL, + }, + { + "tsn3_real_high_tod_second", + PTPTM_PTPTM_TSN3_REAL_HIGH_TOD_SECONDr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x026c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_tsn3_real_high_tod_second_reg, + NULL, + NULL, + }, + { + "real_ptp_clock_cycle_integer", + PTPTM_PTPTM_REAL_PTP_CLOCK_CYCLE_INTEGERr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0280, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_real_ptp_clock_cycle_integer_reg, + NULL, + NULL, + }, + { + "real_ptp_clock_cycle_fraction", + PTPTM_PTPTM_REAL_PTP_CLOCK_CYCLE_FRACTIONr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0284, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_real_ptp_clock_cycle_fraction_reg, + NULL, + NULL, + }, + { + "real_tsn0_clock_cycle_integer", + PTPTM_PTPTM_REAL_TSN0_CLOCK_CYCLE_INTEGERr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0288, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_real_tsn0_clock_cycle_integer_reg, + NULL, + NULL, + }, + { + "real_tsn0_clock_cycle_fraction", + PTPTM_PTPTM_REAL_TSN0_CLOCK_CYCLE_FRACTIONr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x028c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_real_tsn0_clock_cycle_fraction_reg, + NULL, + NULL, + }, + { + "real_tsn1_clock_cycle_integer", + PTPTM_PTPTM_REAL_TSN1_CLOCK_CYCLE_INTEGERr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0290, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_real_tsn1_clock_cycle_integer_reg, + NULL, + NULL, + }, + { + "real_tsn1_clock_cycle_fraction", + PTPTM_PTPTM_REAL_TSN1_CLOCK_CYCLE_FRACTIONr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0294, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_real_tsn1_clock_cycle_fraction_reg, + NULL, + NULL, + }, + { + "real_tsn2_clock_cycle_integer", + PTPTM_PTPTM_REAL_TSN2_CLOCK_CYCLE_INTEGERr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x0298, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_real_tsn2_clock_cycle_integer_reg, + NULL, + NULL, + }, + { + "real_tsn2_clock_cycle_fraction", + PTPTM_PTPTM_REAL_TSN2_CLOCK_CYCLE_FRACTIONr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x029c, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_real_tsn2_clock_cycle_fraction_reg, + NULL, + NULL, + }, + { + "real_tsn3_clock_cycle_integer", + PTPTM_PTPTM_REAL_TSN3_CLOCK_CYCLE_INTEGERr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x02a0, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_real_tsn3_clock_cycle_integer_reg, + NULL, + NULL, + }, + { + "real_tsn3_clock_cycle_fraction", + PTPTM_PTPTM_REAL_TSN3_CLOCK_CYCLE_FRACTIONr, + PTPTM, + DPP_REG_FLAG_DIRECT, + DPP_REG_NUL_ARRAY, + SYS_PTP1_BASE_ADDR + 0x02a4, + (32/8), + 0, + 0, + 0, + 0, + 1, + g_ptptm_ptptm_real_tsn3_clock_cycle_fraction_reg, + NULL, + NULL, + }, +}; diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/table/Kbuild.include new file mode 100644 index 0000000..9c4f663 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/Kbuild.include @@ -0,0 +1,4 @@ +cur_dir := en_np/table/ +subdirs := source/ +src_files += +include $(foreach subdir, $(subdirs), $(dinghai_root)/$(cur_dir)$(subdir)/Kbuild.include) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_api.h b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_api.h new file mode 100644 index 0000000..4ebda14 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_api.h @@ -0,0 +1,172 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_tbl_api.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : +* 完成日期 : 2014/01/27 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef DPP_TBL_API_H +#define DPP_TBL_API_H + +#include "zxic_common.h" +#include "dpp_drv_eram.h" +#include "dpp_tbl_comm.h" + +#define EGR_FLAG_TPID ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, tpid) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_VHCA ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, vhca) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_UPLINK_PORT ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, uplink_port) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_RSS_HASH_FACTOR ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, rss_hash_factor) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_HASH_ALG ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, hash_alg) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_PANEL_ID ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, panel_id) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_LAG_ID ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, lag_id) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_PF_VQM_VFID ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, pf_vqm_vfid) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_MTU ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, mtu) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_HASH_SEARCH_INDEX ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, hash_search_index) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_PORT_BASE_QID ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, port_base_qid) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_FD_EN_OFF ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, fd_enable) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_TM_EN_OFF ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, tm_enable) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_INGRESS_METER_EN_OFF ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, ingress_meter_enable) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_EGRESS_METER_EN_OFF ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, egress_meter_enable) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_INGRESS_MODE ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, ingress_meter_mode) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_EGRESS_MODE ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, egress_meter_mode) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_VEPA_EN_OFF ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, vepa_enable) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_SPOOFCHK_EN_OFF ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, spoof_check_enable) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_INLINE_SEC_OFFLOAD ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, inline_sec_offload) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_OVS_EN_OFF ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, ovs_enable) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_LAG_EN_OFF ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, lag_enable) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_IS_PASSTHROUGH ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, is_passthrough) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_IS_VF ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, is_vf) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_VIRTION_VERSION ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, virtion_version) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_VIRTION_EN_OFF ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, virtio_enable) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_ACCELERATOR_OFFLOAD_FLAG ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, accelerator_offload_flag) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_IPV4_TCP_ASSEMBLE ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, lro_offload) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_IPV6_TCP_ASSEMBLE ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, lro_offload) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_IP_FRAGMENT_OFFLOAD ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, ip_fragment_offload) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_TCP_UDP_CHKSUM ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, tcp_udp_checksum_offload) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_IP_CHKSUM ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, ip_checksum_offload) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_OUTER_IP_CHECKSUM_OFFLOAD ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, outer_ip_checksum_offload) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_VPORT_IS_UP ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, is_up) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_IFF_ALLMULTI_EN_OFF ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, allmulticast_enable) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_HW_BOND_EN_OFF ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, hw_bond_enable) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_RDMA_OFFLOAD_EN_OFF ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, rdma_offload_enable) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_VLAN_FILTER_EN_OFF ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, vlan_filter_enable) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_VLAN_STRIP_OFFLOAD ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, vlan_strip_offload) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_QINQ_VLAN_STRIP_OFFLOAD ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, qinq_vlan_strip_offload) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_RSS_EN_OFF ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, rss_enable) / sizeof(ZXIC_UINT32))) +#define EGR_FLAG_MTU_OFFLOAD_EN_OFF ((ZXIC_UINT32)(offsetof(ZXDH_VPORT_T, mtu_offload_enable) / sizeof(ZXIC_UINT32))) + +#define PANEL_FLAG_OVS_PF_VFID ((ZXIC_UINT32)(offsetof(ZXDH_PANEL_PORT_T, ovs_pf_vfid) / sizeof(ZXIC_UINT32))) +#define PANEL_FLAG_PF_MEMPORT_QID ((ZXIC_UINT32)(offsetof(ZXDH_PANEL_PORT_T, pf_memport_qid) / sizeof(ZXIC_UINT32))) +#define PANEL_FLAG_BOND_PF_VQM_VFID ((ZXIC_UINT32)(offsetof(ZXDH_PANEL_PORT_T, bond_pf_vqm_vfid) / sizeof(ZXIC_UINT32))) +#define PANEL_FLAG_IS_UP ((ZXIC_UINT32)(offsetof(ZXDH_PANEL_PORT_T, is_up) / sizeof(ZXIC_UINT32))) +#define PANEL_FLAG_BOND_LINK_UP ((ZXIC_UINT32)(offsetof(ZXDH_PANEL_PORT_T, bond_link_up) / sizeof(ZXIC_UINT32))) +#define PANEL_FLAG_HW_BOND_ENABLE ((ZXIC_UINT32)(offsetof(ZXDH_PANEL_PORT_T, hw_bond_enable) / sizeof(ZXIC_UINT32))) +#define PANEL_FLAG_MTU ((ZXIC_UINT32)(offsetof(ZXDH_PANEL_PORT_T, mtu) / sizeof(ZXIC_UINT32))) +#define PANEL_FLAG_MTU_OFFLOAD_ENABLE ((ZXIC_UINT32)(offsetof(ZXDH_PANEL_PORT_T, mtu_offload_enable) / sizeof(ZXIC_UINT32))) +#define PANEL_FLAG_TM_BASE_QUEUE ((ZXIC_UINT32)(offsetof(ZXDH_PANEL_PORT_T, tm_base_queue) / sizeof(ZXIC_UINT32))) +#define PANEL_FLAG_PTP_PORT_VFID ((ZXIC_UINT32)(offsetof(ZXDH_PANEL_PORT_T, ptp_port_vfid) / sizeof(ZXIC_UINT32))) +#define PANEL_FLAG_PF_VQM_VFID ((ZXIC_UINT32)(offsetof(ZXDH_PANEL_PORT_T, pf_vqm_vfid) / sizeof(ZXIC_UINT32))) +#define PANEL_FLAG_TM_SHAPE_ENABLE ((ZXIC_UINT32)(offsetof(ZXDH_PANEL_PORT_T, tm_shape_enable) / sizeof(ZXIC_UINT32))) +#define PANEL_FLAG_PTP_TC_ENABLE ((ZXIC_UINT32)(offsetof(ZXDH_PANEL_PORT_T, ptp_tc_enable) / sizeof(ZXIC_UINT32))) +#define PANEL_FLAG_TRUST_MODE ((ZXIC_UINT32)(offsetof(ZXDH_PANEL_PORT_T, trust_mode) / sizeof(ZXIC_UINT32))) + +ZXIC_UINT32 dpp_vport_create(DPP_PF_INFO_T* pf_info); +ZXIC_UINT32 dpp_vport_create_by_vqm_vfid(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 vqm_vfid); +ZXIC_UINT32 dpp_vport_delete(DPP_PF_INFO_T* pf_info); +ZXIC_UINT32 dpp_egr_port_attr_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 attr, ZXIC_UINT32 value); +ZXIC_UINT32 dpp_egr_port_attr_get(DPP_PF_INFO_T* pf_info, ZXDH_VPORT_T *port_attr_entry); +ZXIC_UINT32 dpp_rx_flow_hash_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 hash_mode); +ZXIC_UINT32 dpp_rx_flow_hash_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 *hash_mode); +ZXIC_UINT32 dpp_vport_hash_index_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 *hash_index); +ZXIC_UINT32 dpp_vport_hash_funcs_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 funcs); +ZXIC_UINT32 dpp_vport_rss_en_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 enable); +ZXIC_UINT32 dpp_vport_virtio_en_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 enable); +ZXIC_UINT32 dpp_vport_virtio_version_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 version); +ZXIC_UINT32 dpp_vport_vlan_filter_en_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 enable); +ZXIC_UINT32 dpp_vport_vlan_qinq_en_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 enable); +ZXIC_UINT32 dpp_vport_vlan_strip_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 enable); + +ZXIC_UINT32 dpp_vlan_filter_init(DPP_PF_INFO_T* pf_info); +ZXIC_UINT32 dpp_add_vlan_filter(DPP_PF_INFO_T* pf_info, ZXIC_UINT16 vlan_id); +ZXIC_UINT32 dpp_del_vlan_filter(DPP_PF_INFO_T* pf_info, ZXIC_UINT16 vlan_id); + +ZXIC_UINT32 dpp_vport_bond_pf(DPP_PF_INFO_T* pf_info); +ZXIC_UINT32 dpp_vport_unbond_pf(DPP_PF_INFO_T* pf_info); + +ZXIC_UINT32 dpp_rxfh_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 *queue_list, ZXIC_UINT32 queue_num); +ZXIC_UINT32 dpp_rxfh_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 *queue_list, ZXIC_UINT32 queue_num); +ZXIC_UINT32 dpp_rxfh_del(DPP_PF_INFO_T* pf_info); +ZXIC_UINT32 dpp_thash_key_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 *hash_key, ZXIC_UINT32 key_num); +ZXIC_UINT32 dpp_thash_key_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 *hash_key, ZXIC_UINT32 key_num); + +ZXIC_UINT32 dpp_add_mac(DPP_PF_INFO_T* pf_info, ZXIC_CONST ZXIC_VOID *mac); +ZXIC_UINT32 dpp_del_mac(DPP_PF_INFO_T* pf_info, ZXIC_CONST ZXIC_VOID *mac); +ZXIC_UINT32 dpp_unicast_mac_dump(DPP_PF_INFO_T* pf_info, MAC_VPORT_INFO *p_mac_arr, ZXIC_UINT32 *p_mac_num); +ZXIC_UINT32 dpp_unicast_all_mac_delete(DPP_PF_INFO_T* pf_info); +ZXIC_UINT32 dpp_unicast_all_mac_online_delete(DPP_PF_INFO_T* pf_info); + +ZXIC_UINT32 dpp_multi_mac_add_member(DPP_PF_INFO_T* pf_info, ZXIC_CONST ZXIC_VOID *mac); +ZXIC_UINT32 dpp_multi_mac_del_member(DPP_PF_INFO_T* pf_info, ZXIC_CONST ZXIC_VOID *mac); +ZXIC_UINT32 dpp_multicast_mac_dump(DPP_PF_INFO_T* pf_info, MAC_VPORT_INFO *p_mac_arr, ZXIC_UINT32 *p_mac_num); +ZXIC_UINT32 dpp_multicast_all_mac_delete(DPP_PF_INFO_T* pf_info); +ZXIC_UINT32 dpp_multicast_all_mac_online_delete(DPP_PF_INFO_T* pf_info); + +ZXIC_UINT32 dpp_ptp_port_vfid_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 ptp_port_vfid); +ZXIC_UINT32 dpp_ptp_tc_enable_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 ptp_tc_enable); + +ZXIC_UINT32 dpp_ipsec_enc_entry_add(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT8 *sip, ZXIC_UINT8 *dip, + ZXIC_UINT8 *sip_mask, ZXIC_UINT8 *dip_mask, ZXIC_UINT32 is_ipv4, ZXIC_UINT32 sa_id); +ZXIC_UINT32 dpp_ipsec_enc_entry_del(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index); + +ZXIC_UINT32 dpp_lag_group_create(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 lag_id); +ZXIC_UINT32 dpp_lag_group_delete(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 lag_id); +ZXIC_UINT32 dpp_lag_mode_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 lag_id, ZXIC_UINT8 mode); +ZXIC_UINT32 dpp_lag_group_hash_factor_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 lag_id, ZXIC_UINT8 factor); +ZXIC_UINT32 dpp_lag_group_member_add(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 lag_id, ZXIC_UINT8 panel_id); +ZXIC_UINT32 dpp_lag_group_member_del(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 lag_id, ZXIC_UINT8 panel_id); + +ZXIC_UINT32 dpp_panel_bond_vport(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 panel_id); +ZXIC_UINT32 dpp_panel_hardware_bond_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 panel_id, ZXIC_UINT8 enable); +ZXIC_UINT32 dpp_panel_bond_pf_vqm_vfid_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 panel_id, ZXIC_UINT16 vqm_vfid); +ZXIC_UINT32 dpp_panel_bond_pf_memport_qid_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 panel_id, ZXIC_UINT16 qid); +ZXIC_UINT32 dpp_panel_ovs_pf_vqm_vfid_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 panel_id, ZXIC_UINT16 vqm_vfid); +ZXIC_UINT32 dpp_panel_attr_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 panel_id, ZXIC_UINT32 attr, ZXIC_UINT32 value); + +ZXIC_UINT32 dpp_vport_uc_promisc_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 enable); +ZXIC_UINT32 dpp_vport_mc_promisc_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 enable); + +ZXIC_UINT32 dpp_stat_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_cnt); +ZXIC_UINT32 dpp_stat_cnt_get_128(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_pkB_cnt, ZXIC_UINT64 *p_pk_cnt); +ZXIC_UINT32 dpp_stat_mc_packet_rx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_cnt); +ZXIC_UINT32 dpp_stat_bc_packet_rx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_cnt); +ZXIC_UINT32 dpp_stat_1588_packet_rx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_cnt); +ZXIC_UINT32 dpp_stat_1588_packet_tx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_cnt); +ZXIC_UINT32 dpp_stat_1588_packet_drop_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_cnt); +ZXIC_UINT32 dpp_stat_1588_enc_packet_rx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_cnt); +ZXIC_UINT32 dpp_stat_1588_enc_packet_tx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_cnt); +ZXIC_UINT32 dpp_stat_spoof_packet_drop_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_cnt); +ZXIC_UINT32 dpp_stat_mcode_packet_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_cnt); +ZXIC_UINT32 dpp_stat_port_bc_packet_tx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_cnt); +ZXIC_UINT32 dpp_stat_port_bc_packet_rx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_cnt); +ZXIC_UINT32 dpp_stat_port_RDMA_packet_msg_tx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_pkB_cnt, ZXIC_UINT64 *p_pk_cnt); +ZXIC_UINT32 dpp_stat_port_RDMA_packet_msg_rx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_pkB_cnt, ZXIC_UINT64 *p_pk_cnt); +ZXIC_UINT32 dpp_stat_plcr_packet_drop_tx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_pkB_cnt, ZXIC_UINT64 *p_pk_cnt); +ZXIC_UINT32 dpp_stat_plcr_packet_drop_rx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_pkB_cnt, ZXIC_UINT64 *p_pk_cnt); +ZXIC_UINT32 dpp_stat_MTU_packet_msg_tx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_pkB_cnt, ZXIC_UINT64 *p_pk_cnt); +ZXIC_UINT32 dpp_stat_MTU_packet_msg_rx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_pkB_cnt, ZXIC_UINT64 *p_pk_cnt); + +ZXIC_UINT32 dpp_vport_vhca_id_add(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 vhca_id); +ZXIC_UINT32 dpp_vport_vhca_id_del(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 vhca_id); +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_bc.h b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_bc.h new file mode 100644 index 0000000..01f42cc --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_bc.h @@ -0,0 +1,39 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_tbl_bc.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : +* 完成日期 : 2014/01/27 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef DPP_TBL_BC_H +#define DPP_TBL_BC_H + +#include "zxic_common.h" +#include "dpp_type_api.h" + +#define BC_GROUP_NUM (4) +#define BC_MEMBER_NUM_IN_GROUP (64) + +typedef struct dpp_vport_bc_info_t +{ + ZXIC_UINT64 bc_bitmap[BC_GROUP_NUM]; +} DPP_VPORT_BC_INFO_T; + +typedef struct dpp_vport_bc_table_t +{ + DPP_VPORT_BC_INFO_T bc_info; +} DPP_VPORT_BC_TABLE_T; + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_comm.h b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_comm.h new file mode 100644 index 0000000..7e6852f --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_comm.h @@ -0,0 +1,79 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_tbl_comm.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : +* 完成日期 : 2014/01/27 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef DPP_TBL_COMM_H +#define DPP_TBL_COMM_H + +#include "zxic_common.h" +#include "dpp_type_api.h" +#include "dpp_tbl_mc.h" +#include "dpp_tbl_mac.h" +#include "dpp_tbl_qid.h" +#include "dpp_tbl_port.h" +#include "dpp_tbl_bc.h" +#include "dpp_tbl_promisc.h" + +#define VF_ACTIVE(VPORT) ((VPORT & 0x0800) >> 11) +#define EPID(VPORT) ((VPORT & 0x7000) >> 12) +#define FUNC_NUM(VPORT) ((VPORT & 0x0700) >> 8) +#define VFUNC_NUM(VPORT) ((VPORT & 0x00FF)) + +#define PF_VQM_VFID_OFFSET (1152) +#define IS_PF(VPORT) (!VF_ACTIVE(VPORT)) +#define VQM_VFID(VPORT) (IS_PF(VPORT) ? \ + (PF_VQM_VFID_OFFSET + (EPID(VPORT) * 8) + FUNC_NUM(VPORT)) : \ + ((EPID(VPORT) * 256) + VFUNC_NUM(VPORT))) + +#define OWNER_PF_VQM_VFID(VPORT) (PF_VQM_VFID_OFFSET + (EPID(VPORT) * 8) + FUNC_NUM(VPORT)) +#define OWNER_PF_VPORT(VPORT) (((EPID(VPORT)) << 12) | ((FUNC_NUM(VPORT)) << 8)) + +#define VQM_VFID_MAX_NUM (2048) + +typedef struct dpp_vport_mgr_t +{ + DPP_VPORT_BC_TABLE_T bc_table; + DPP_VPORT_MC_TABLE_T mc_table; + DPP_VPORT_PROMISC_TABLE_T uc_promisc_table; + DPP_VPORT_PROMISC_TABLE_T mc_promisc_table; +} DPP_VPORT_MGR_T; + +typedef struct +{ + uint8_t addr[6]; + uint16_t vport; +}MAC_VPORT_INFO; + +typedef struct +{ + uint8_t mc_addr[6]; + uint16_t pf_flag; +}MC_PF_FLAG_MGR; + +ZXIC_UINT32 dpp_data_print(ZXIC_UINT8 *data, ZXIC_UINT32 len); +ZXIC_UINT32 dpp_vport_attr_value_show(ZXIC_VOID); +ZXIC_UINT32 dpp_vport_mgr_init(DPP_PF_INFO_T* pf_info); +ZXIC_UINT32 dpp_vport_mgr_release(DPP_PF_INFO_T* pf_info); +ZXIC_UINT32 dpp_vport_bc_table_get(DPP_PF_INFO_T* pf_info, DPP_VPORT_BC_TABLE_T** bc_table); +ZXIC_UINT32 dpp_vport_mc_table_get(DPP_PF_INFO_T* pf_info, DPP_VPORT_MC_TABLE_T** mc_table); +ZXIC_UINT32 dpp_vport_uc_promisc_table_get(DPP_PF_INFO_T* pf_info, DPP_VPORT_PROMISC_TABLE_T** promisc_table); +ZXIC_UINT32 dpp_vport_mc_promisc_table_get(DPP_PF_INFO_T* pf_info, DPP_VPORT_PROMISC_TABLE_T** promisc_table); +ZXIC_UINT32 dpp_vport_get_by_vqm_vfid(ZXIC_UINT16 pf_vport, ZXIC_UINT32 vqm_vfid, ZXIC_UINT16* vport); +ZXIC_UINT32 dpp_vport_get_by_mc_bitmap(ZXIC_UINT16 pf_vport, ZXIC_UINT32 group_id, ZXIC_UINT64 mc_bitmap, ZXIC_UINT16 vport[64], ZXIC_UINT32* vport_num); + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_diag.h b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_diag.h new file mode 100644 index 0000000..e2c609d --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_diag.h @@ -0,0 +1,56 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_tbl_diag.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : +* 完成日期 : 2014/01/27 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef DPP_TBL_DIAG_H +#define DPP_TBL_DIAG_H + +#include "zxic_common.h" +#include "dpp_type_api.h" + +ZXIC_CONST ZXIC_CHAR* dpp_vport_table_attr_name_get(ZXIC_UINT32 attr); +ZXIC_CONST ZXIC_CHAR* dpp_vport_panel_table_attr_name_get(ZXIC_UINT32 attr); + +ZXIC_UINT32 diag_dpp_vport_mac_add(ZXIC_UINT16 slot, ZXIC_UINT16 vport, + ZXIC_UINT8 mac0, ZXIC_UINT8 mac1, ZXIC_UINT8 mac2, + ZXIC_UINT8 mac3, ZXIC_UINT8 mac4, ZXIC_UINT8 mac5); +ZXIC_UINT32 diag_dpp_vport_mac_del(ZXIC_UINT16 slot, ZXIC_UINT16 vport, + ZXIC_UINT8 mac0, ZXIC_UINT8 mac1, ZXIC_UINT8 mac2, + ZXIC_UINT8 mac3, ZXIC_UINT8 mac4, ZXIC_UINT8 mac5); +ZXIC_UINT32 diag_dpp_vport_mac_prt(ZXIC_UINT16 slot, ZXIC_UINT16 vport); +ZXIC_UINT32 diag_dpp_vport_mc_mac_add(ZXIC_UINT16 slot, ZXIC_UINT16 vport, + ZXIC_UINT8 mac0, ZXIC_UINT8 mac1, ZXIC_UINT8 mac2, + ZXIC_UINT8 mac3, ZXIC_UINT8 mac4, ZXIC_UINT8 mac5); +ZXIC_UINT32 diag_dpp_vport_mc_mac_del(ZXIC_UINT16 slot, ZXIC_UINT16 vport, + ZXIC_UINT8 mac0, ZXIC_UINT8 mac1, ZXIC_UINT8 mac2, + ZXIC_UINT8 mac3, ZXIC_UINT8 mac4, ZXIC_UINT8 mac5); +ZXIC_UINT32 diag_dpp_vport_mc_mac_prt(ZXIC_UINT16 slot, ZXIC_UINT16 vport); +ZXIC_UINT32 diag_dpp_vport_table_set(ZXIC_UINT16 slot, ZXIC_UINT16 vport, ZXIC_UINT32 attr, + ZXIC_UINT32 value); +ZXIC_UINT32 diag_dpp_vport_table_prt(ZXIC_UINT16 slot, ZXIC_UINT16 vport); +ZXIC_UINT32 diag_dpp_vport_panel_table_set(ZXIC_UINT16 slot, ZXIC_UINT16 vport, ZXIC_UINT8 panel_id, + ZXIC_UINT32 attr, ZXIC_UINT32 value); +ZXIC_UINT32 diag_dpp_vport_panel_table_prt(ZXIC_UINT16 slot, ZXIC_UINT16 vport, ZXIC_UINT8 panel_id); +ZXIC_UINT32 diag_dpp_vport_bc_table_set(ZXIC_UINT16 slot, ZXIC_UINT16 vport, ZXIC_UINT32 enable); +ZXIC_UINT32 diag_dpp_vport_bc_table_prt(ZXIC_UINT16 slot, ZXIC_UINT16 vport); +ZXIC_UINT32 diag_dpp_vport_uc_promisc_table_set(ZXIC_UINT16 slot, ZXIC_UINT16 vport, ZXIC_UINT32 enable); +ZXIC_UINT32 diag_dpp_vport_uc_promisc_table_prt(ZXIC_UINT16 slot, ZXIC_UINT16 vport); +ZXIC_UINT32 diag_dpp_vport_mc_promisc_table_set(ZXIC_UINT16 slot, ZXIC_UINT16 vport, ZXIC_UINT32 enable); +ZXIC_UINT32 diag_dpp_vport_mc_promisc_table_prt(ZXIC_UINT16 slot, ZXIC_UINT16 vport); + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_ipsec.h b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_ipsec.h new file mode 100644 index 0000000..b08438e --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_ipsec.h @@ -0,0 +1,26 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_tbl_ipsec.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : +* 完成日期 : 2014/01/27 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef DPP_TBL_IPSEC_H +#define DPP_TBL_IPSEC_H + +#include "zxic_common.h" +#include "dpp_type_api.h" + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_lag.h b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_lag.h new file mode 100644 index 0000000..0238159 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_lag.h @@ -0,0 +1,29 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_tbl_lag.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : +* 完成日期 : 2014/01/27 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef DPP_TBL_LAG_H +#define DPP_TBL_LAG_H + +#include "zxic_common.h" +#include "dpp_type_api.h" + +#define LAG_LACP_MODE (2) +#define LAG_STANDBY_MODE (1) + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_mac.h b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_mac.h new file mode 100644 index 0000000..1eeea0a --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_mac.h @@ -0,0 +1,26 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_tbl_mac.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : +* 完成日期 : 2014/01/27 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef DPP_TBL_MAC_H +#define DPP_TBL_MAC_H + +#include "zxic_common.h" +#include "dpp_type_api.h" + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_mc.h b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_mc.h new file mode 100644 index 0000000..97a354b --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_mc.h @@ -0,0 +1,43 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_tbl_mc.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : +* 完成日期 : 2014/01/27 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef DPP_TBL_MC_H +#define DPP_TBL_MC_H + +#include "zxic_common.h" +#include "dpp_type_api.h" + +#define MC_TABLE_SIZE (32) +#define MC_GROUP_NUM (4) +#define MC_MEMBER_NUM_IN_GROUP (64) + +typedef struct dpp_vport_mc_info_t +{ + ZXIC_UINT32 is_valid; + ZXIC_UINT8 mac[6]; + ZXIC_UINT32 mc_pf_enable; + ZXIC_UINT64 mc_bitmap[MC_GROUP_NUM]; +} DPP_VPORT_MC_INFO_T; + +typedef struct dpp_vport_mc_table_t +{ + DPP_VPORT_MC_INFO_T mc_info[MC_TABLE_SIZE]; +} DPP_VPORT_MC_TABLE_T; + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_panel.h b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_panel.h new file mode 100644 index 0000000..0936a09 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_panel.h @@ -0,0 +1,26 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_tbl_panel.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : +* 完成日期 : 2014/01/27 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef DPP_TBL_PANEL_H +#define DPP_TBL_PANEL_H + +#include "zxic_common.h" +#include "dpp_type_api.h" + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_port.h b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_port.h new file mode 100644 index 0000000..af21260 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_port.h @@ -0,0 +1,26 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_tbl_port.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : +* 完成日期 : 2014/01/27 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef DPP_TBL_PORT_H +#define DPP_TBL_PORT_H + +#include "zxic_common.h" +#include "dpp_type_api.h" + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_promisc.h b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_promisc.h new file mode 100644 index 0000000..e97a7c7 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_promisc.h @@ -0,0 +1,40 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_tbl_promisc.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : +* 完成日期 : 2014/01/27 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef DPP_TBL_PROMISC_H +#define DPP_TBL_PROMISC_H + +#include "zxic_common.h" +#include "dpp_type_api.h" + +#define PROMISC_GROUP_NUM (4) +#define PROMISC_MEMBER_NUM_IN_GROUP (64) + +typedef struct dpp_vport_promisc_info_t +{ + ZXIC_UINT32 pf_enable; + ZXIC_UINT64 bitmap[PROMISC_GROUP_NUM]; +} DPP_VPORT_PROMISC_INFO_T; + +typedef struct dpp_vport_uc_promisc_table_t +{ + DPP_VPORT_PROMISC_INFO_T promisc_info; +} DPP_VPORT_PROMISC_TABLE_T; + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_ptp.h b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_ptp.h new file mode 100644 index 0000000..eca6ec5 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_ptp.h @@ -0,0 +1,26 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_tbl_port.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : +* 完成日期 : 2014/01/27 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef DPP_TBL_PTP_H +#define DPP_TBL_PTP_H + +#include "zxic_common.h" +#include "dpp_type_api.h" + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_qid.h b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_qid.h new file mode 100644 index 0000000..b233da2 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_qid.h @@ -0,0 +1,28 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_tbl_qid.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : +* 完成日期 : 2014/01/27 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef DPP_TBL_QID_H +#define DPP_TBL_QID_H + +#include "zxic_common.h" +#include "dpp_type_api.h" + +#define RSS_TO_VQID_GROUP_NUM (32) + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_stat.h b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_stat.h new file mode 100644 index 0000000..4a18728 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_stat.h @@ -0,0 +1,77 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_tbl_stat.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : +* 完成日期 : 2014/01/27 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef DPP_TBL_STAT_H +#define DPP_TBL_STAT_H + +#include "zxic_common.h" +#include "dpp_type_api.h" + +#define DPP_STAT_MC_PACKET_RX_CNT_ERAM_BAADDR ((ZXIC_UINT32)(0x1A)) +#define DPP_STAT_MC_PACKET_RX_CNT_ERAM_DEPTH ((ZXIC_UINT32)(40)) + +#define DPP_STAT_BC_PACKET_RX_CNT_ERAM_BAADDR ((ZXIC_UINT32)(0x42)) +#define DPP_STAT_BC_PACKET_RX_CNT_ERAM_DEPTH ((ZXIC_UINT32)(40 * 1024)) + +#define DPP_STAT_1588_PACKET_RX_CNT_ERAM_BAADDR ((ZXIC_UINT32)(0xA042)) +#define DPP_STAT_1588_PACKET_RX_CNT_ERAM_DEPTH ((ZXIC_UINT32)(0x800)) + +#define DPP_STAT_1588_PACKET_TX_CNT_ERAM_BAADDR ((ZXIC_UINT32)(0xA842)) +#define DPP_STAT_1588_PACKET_TX_CNT_ERAM_DEPTH ((ZXIC_UINT32)(0x800)) + +#define DPP_STAT_1588_PACKET_DROP_CNT_ERAM_BAADDR ((ZXIC_UINT32)(0xB042)) +#define DPP_STAT_1588_PACKET_DROP_CNT_ERAM_DEPTH ((ZXIC_UINT32)(0x800)) + +#define DPP_STAT_1588_ENC_PACKET_RX_CNT_ERAM_BAADDR ((ZXIC_UINT32)(0xC042)) +#define DPP_STAT_1588_ENC_PACKET_RX_CNT_ERAM_DEPTH ((ZXIC_UINT32)(0x800)) + +#define DPP_STAT_1588_ENC_PACKET_TX_CNT_ERAM_BAADDR ((ZXIC_UINT32)(0xB842)) +#define DPP_STAT_1588_ENC_PACKET_TX_CNT_ERAM_DEPTH ((ZXIC_UINT32)(0x800)) + +#define DPP_STAT_SPOOF_PACKET_DROP_CNT_ERAM_BAADDR ((ZXIC_UINT32)(0xC842)) +#define DPP_STAT_SPOOF_PACKET_DROP_CNT_ERAM_DEPTH ((ZXIC_UINT32)(0x40)) + +#define DPP_STAT_MCODE_PACKET_CNT_ERAM_BAADDR ((ZXIC_UINT32)(0xC882)) +#define DPP_STAT_MCODE_PACKET_CNT_ERAM_DEPTH ((ZXIC_UINT32)(0x80)) + +#define DPP_STAT_PORT_BC_PACKET_TX_CNT_ERAM_BAADDR ((ZXIC_UINT32)(0xC902)) +#define DPP_STAT_PORT_BC_PACKET_TX_CNT_ERAM_DEPTH ((ZXIC_UINT32)(0x800)) + +#define DPP_STAT_PORT_BC_PACKET_RX_CNT_ERAM_BAADDR ((ZXIC_UINT32)(0xD102)) +#define DPP_STAT_PORT_BC_PACKET_RX_CNT_ERAM_DEPTH ((ZXIC_UINT32)(0x800)) + +#define DPP_STAT_PORT_RDMA_PACKET_TX_CNT_ERAM_BAADDR ((ZXIC_UINT32)(0x6C81)) // 128bit +#define DPP_STAT_PORT_RDMA_PACKET_TX_CNT_ERAM_DEPTH ((ZXIC_UINT32)(0x400)) + +#define DPP_STAT_PORT_RDMA_PACKET_RX_CNT_ERAM_BAADDR ((ZXIC_UINT32)(0x7081)) // 128bit +#define DPP_STAT_PORT_RDMA_PACKET_RX_CNT_ERAM_DEPTH ((ZXIC_UINT32)(0x400)) + +#define DPP_STAT_PLCR_PACKET_DROP_TX_CNT_ERAM_BAADDR ((ZXIC_UINT32)(0x7481)) +#define DPP_STAT_PLCR_PACKET_DROP_TX_CNT_ERAM_DEPTH ((ZXIC_UINT32)(0x800)) + +#define DPP_STAT_PLCR_PACKET_DROP_RX_CNT_ERAM_BAADDR ((ZXIC_UINT32)(0x7C81)) +#define DPP_STAT_PLCR_PACKET_DROP_RX_CNT_ERAM_DEPTH ((ZXIC_UINT32)(0x800)) + +#define DPP_STAT_MTU_PACKET_DROP_TX_CNT_ERAM_BAADDR ((ZXIC_UINT32)(0x8481)) // 128bit +#define DPP_STAT_MTU_PACKET_DROP_TX_CNT_ERAM_DEPTH ((ZXIC_UINT32)(0x500)) + +#define DPP_STAT_MTU_PACKET_DROP_RX_CNT_ERAM_BAADDR ((ZXIC_UINT32)(0x8981)) // 128bit +#define DPP_STAT_MTU_PACKET_DROP_RX_CNT_ERAM_DEPTH ((ZXIC_UINT32)(0x500)) + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_tm.h b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_tm.h new file mode 100644 index 0000000..88b215a --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_tm.h @@ -0,0 +1,45 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_tbl_tm.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : +* 完成日期 : 2014/01/27 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef DPP_TBL_TM_H +#define DPP_TBL_TM_H + +#include "zxic_common.h" +#include "dpp_type_api.h" +#include "dpp_dev.h" + +#define TM_BASE_QUEUE_VALID (0x1000) +#define TRUST_MODE_VALID (0x10) +#define UP_VALID (0x10) +#define TC_VALID (0x10) +#define TM_SWITCH_ON (1) +#define TM_SWITCH_OFF (0) + +ZXIC_UINT32 dpp_tm_flowid_pport_table_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 port, ZXIC_UINT32 flow_id); +ZXIC_UINT32 dpp_tm_flowid_pport_table_del(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 port); +ZXIC_UINT32 dpp_tm_pport_trust_mode_table_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 port, ZXIC_UINT32 mode); +ZXIC_UINT32 dpp_tm_pport_trust_mode_table_del(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 port); +ZXIC_UINT32 dpp_tm_pport_dscp_map_table_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 port, ZXIC_UINT32 dscp_id, ZXIC_UINT32 up_id); +ZXIC_UINT32 dpp_tm_pport_dscp_map_table_del(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 port, ZXIC_UINT32 dscp_id); +ZXIC_UINT32 dpp_tm_pport_up_map_table_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 port, ZXIC_UINT32 up_id, ZXIC_UINT32 tc_id); +ZXIC_UINT32 dpp_tm_pport_up_map_table_del(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 port, ZXIC_UINT32 up_id); +ZXIC_UINT32 dpp_tm_pport_mcode_switch_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 port, ZXIC_UINT32 mode); +ZXIC_UINT32 dpp_tm_pport_mcode_switch_del(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 port); + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_vlan.h b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_vlan.h new file mode 100644 index 0000000..22950e1 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/include/dpp_tbl_vlan.h @@ -0,0 +1,29 @@ +/************************************************************** +* 版权所有 (C)2013-2015, 深圳市中兴通讯股份有限公司 +* 文件名称 : dpp_tbl_vlan.h +* 文件标识 : +* 内容摘要 : +* 其它说明 : +* 当前版本 : +* 作 者 : +* 完成日期 : 2014/01/27 +* DEPARTMENT: ASIC_FPGA_R&D_Dept +* MANUAL_PERCENT: 100% + +* 修改记录1: +* 修改日期: +* 版 本 号: +* 修 改 人: +* 修改内容: +***************************************************************/ + +#ifndef DPP_TBL_VLAN_H +#define DPP_TBL_VLAN_H + +#include "zxic_common.h" +#include "dpp_type_api.h" + +#define VLAN_GROUP_NUM (35) +#define VLAN_ID_NUM_IN_GROUP (120) + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/source/Kbuild.include b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/Kbuild.include new file mode 100644 index 0000000..0560e3a --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/Kbuild.include @@ -0,0 +1,2 @@ +cur_dir := en_np/table/source/ +src_files += $(addprefix $(cur_dir),$(notdir $(wildcard $(dinghai_root)/$(cur_dir)*.c))) \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_bc.c b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_bc.c new file mode 100644 index 0000000..d313222 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_bc.c @@ -0,0 +1,196 @@ +#include "dpp_drv_init.h" +#include "dpp_drv_acl.h" +#include "dpp_drv_hash.h" +#include "dpp_drv_eram.h" +#include "dpp_drv_sdt.h" +#include "dpp_dev.h" +#include "dpp_dtb.h" +#include "dpp_hash.h" +#include "dpp_dtb_table.h" +#include "dpp_dtb_table_api.h" +#include "dpp_tbl_api.h" +#include "dpp_tbl_comm.h" +#include "dpp_tbl_bc.h" + +ZXIC_UINT32 dpp_vport_bc_info_add(DPP_PF_INFO_T* pf_info) +{ + ZXIC_UINT32 group_id = 0; + ZXIC_UINT32 vfunc_num = 0; + ZXIC_UINT32 rc = DPP_OK; + + DPP_VPORT_BC_TABLE_T* bc_table = NULL; + + ZXIC_COMM_CHECK_POINT(pf_info); + + rc = dpp_vport_bc_table_get(pf_info, &bc_table); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_bc_table_get"); + ZXIC_COMM_CHECK_POINT(bc_table); + + vfunc_num = VFUNC_NUM(pf_info->vport); + ZXIC_COMM_CHECK_INDEX(vfunc_num, 0, (BC_GROUP_NUM * BC_MEMBER_NUM_IN_GROUP) - 1); + + group_id = vfunc_num / BC_MEMBER_NUM_IN_GROUP; + ZXIC_COMM_CHECK_INDEX(group_id, 0, BC_GROUP_NUM - 1); + + bc_table->bc_info.bc_bitmap[group_id] |= ((ZXIC_UINT64)(1) << (BC_MEMBER_NUM_IN_GROUP - 1 - + (vfunc_num % BC_MEMBER_NUM_IN_GROUP))); + + return DPP_OK; +} + +ZXIC_UINT32 dpp_vport_bc_info_del(DPP_PF_INFO_T* pf_info) +{ + ZXIC_UINT32 group_id = 0; + ZXIC_UINT32 vfunc_num = 0; + ZXIC_UINT32 rc = DPP_OK; + + DPP_VPORT_BC_TABLE_T* bc_table = NULL; + + ZXIC_COMM_CHECK_POINT(pf_info); + + rc = dpp_vport_bc_table_get(pf_info, &bc_table); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_bc_table_get"); + ZXIC_COMM_CHECK_POINT(bc_table); + + vfunc_num = VFUNC_NUM(pf_info->vport); + ZXIC_COMM_CHECK_INDEX(vfunc_num, 0, (BC_GROUP_NUM * BC_MEMBER_NUM_IN_GROUP) - 1); + + group_id = vfunc_num / BC_MEMBER_NUM_IN_GROUP; + ZXIC_COMM_CHECK_INDEX(group_id, 0, BC_GROUP_NUM - 1); + + bc_table->bc_info.bc_bitmap[group_id] &= ~((ZXIC_UINT64)(1) << (BC_MEMBER_NUM_IN_GROUP - 1 - + (vfunc_num % BC_MEMBER_NUM_IN_GROUP))); + + return DPP_OK; +} + +ZXIC_UINT32 dpp_vport_bc_info_clear_all(DPP_PF_INFO_T* pf_info) +{ + ZXIC_UINT32 group_id = 0; + ZXIC_UINT32 rc = DPP_OK; + + DPP_VPORT_BC_TABLE_T* bc_table = NULL; + + ZXIC_COMM_CHECK_POINT(pf_info); + + rc = dpp_vport_bc_table_get(pf_info, &bc_table); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_bc_table_get"); + ZXIC_COMM_CHECK_POINT(bc_table); + + for (group_id = 0; group_id < BC_GROUP_NUM; group_id++) + { + bc_table->bc_info.bc_bitmap[group_id] = 0; + } + + return DPP_OK; +} + +ZXIC_UINT32 dpp_vport_bc_table_insert(DPP_PF_INFO_T* pf_info) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 group_id = 0; + ZXIC_UINT32 index = 0; + ZXIC_UINT32 sdt_no = ZXDH_SDT_BC_TABLE; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 rc = DPP_OK; + + ZXDH_BC_T bc_entry = {0}; + DPP_VPORT_BC_TABLE_T *bc_table = NULL; + + ZXIC_COMM_CHECK_POINT(pf_info); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + rc = dpp_vport_bc_table_get(pf_info, &bc_table); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_bc_table_get"); + ZXIC_COMM_CHECK_POINT(bc_table); + + for (group_id = 0; group_id < BC_GROUP_NUM; group_id++) + { + index = (((OWNER_PF_VQM_VFID(pf_info->vport) - PF_VQM_VFID_OFFSET) << 2)| group_id); + bc_entry.hit_flag = 1; + bc_entry.bc_bitmap = bc_table->bc_info.bc_bitmap[group_id]; + + rc = dpp_apt_dtb_eram_insert(&dev, queue, sdt_no, index, &bc_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_insert"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u group_id: %u index: 0x%02x.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, sdt_no, group_id, index); + ZXIC_COMM_PRINT("[%s] bc_bitmap: %02x %02x %02x %02x %02x %02x %02x %02x.\n", __FUNCTION__, + *((ZXIC_UINT8*)(&bc_entry.bc_bitmap) + 7), + *((ZXIC_UINT8*)(&bc_entry.bc_bitmap) + 6), + *((ZXIC_UINT8*)(&bc_entry.bc_bitmap) + 5), + *((ZXIC_UINT8*)(&bc_entry.bc_bitmap) + 4), + *((ZXIC_UINT8*)(&bc_entry.bc_bitmap) + 3), + *((ZXIC_UINT8*)(&bc_entry.bc_bitmap) + 2), + *((ZXIC_UINT8*)(&bc_entry.bc_bitmap) + 1), + *((ZXIC_UINT8*)(&bc_entry.bc_bitmap) + 0)); + } + + return DPP_OK; +} + +ZXIC_UINT32 dpp_vport_bond_pf(DPP_PF_INFO_T* pf_info) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x start.\n", __FUNCTION__, + pf_info->slot, pf_info->vport); + + if (IS_PF(pf_info->vport)) + { + rc = dpp_vport_bc_info_clear_all(pf_info); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_bc_info_clear_all"); + } + else + { + rc = dpp_vport_bc_info_add(pf_info); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_bc_info_add"); + } + + rc = dpp_vport_bc_table_insert(pf_info); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_bc_table_insert"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_vport_bond_pf); + +ZXIC_UINT32 dpp_vport_unbond_pf(DPP_PF_INFO_T* pf_info) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x start.\n", __FUNCTION__, + pf_info->slot, pf_info->vport); + + if (IS_PF(pf_info->vport)) + { + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x is pf, no vf to del.\n", __FUNCTION__, + pf_info->slot, pf_info->vport); + return DPP_ERR; + } + + rc = dpp_vport_bc_info_del(pf_info); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_bc_info_del"); + + rc = dpp_vport_bc_table_insert(pf_info); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_bc_table_insert"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_vport_unbond_pf); diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_comm.c b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_comm.c new file mode 100644 index 0000000..cc7cf33 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_comm.c @@ -0,0 +1,286 @@ +#include "dpp_drv_init.h" +#include "dpp_drv_acl.h" +#include "dpp_drv_hash.h" +#include "dpp_drv_eram.h" +#include "dpp_drv_sdt.h" +#include "dpp_dev.h" +#include "dpp_dtb.h" +#include "dpp_hash.h" +#include "dpp_dtb_table.h" +#include "dpp_dtb_table_api.h" +#include "dpp_tbl_mc.h" +#include "dpp_tbl_bc.h" +#include "dpp_tbl_promisc.h" +#include "dpp_tbl_comm.h" +#include "dpp_tbl_api.h" + +static DPP_VPORT_MGR_T g_vport_mgr[DPP_PCIE_SLOT_MAX][DPP_PCIE_CHANNEL_MAX] = {0}; + +ZXIC_UINT32 dpp_data_print(ZXIC_UINT8 *data, ZXIC_UINT32 len) +{ + ZXIC_UINT32 i = 0; + ZXIC_UINT32 loop_cnt = len / 16; + ZXIC_UINT32 last_line_len = len % 16; + + ZXIC_COMM_PRINT("-----------------------------------------------\n"); + for (i = 0; i < loop_cnt; i++) + { + ZXIC_COMM_PRINT("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", + *(data + (i * 16) + 0), *(data + (i * 16) + 1), *(data + (i * 16) + 2), *(data + (i * 16) + 3), + *(data + (i * 16) + 4), *(data + (i * 16) + 5), *(data + (i * 16) + 6), *(data + (i * 16) + 7), + *(data + (i * 16) + 8), *(data + (i * 16) + 9), *(data + (i * 16) + 10), *(data + (i * 16) + 11), + *(data + (i * 16) + 12), *(data + (i * 16) + 13), *(data + (i * 16) + 14), *(data + (i * 16) + 15)); + } + if (last_line_len != 0) + { + if (last_line_len == 1) + { + ZXIC_COMM_PRINT("%02x\n", *(data + (i * 16) + 0)); + } + else if (last_line_len == 2) + { + ZXIC_COMM_PRINT("%02x %02x\n", *(data + (i * 16) + 0), *(data + (i * 16) + 1)); + } + else if (last_line_len == 3) + { + ZXIC_COMM_PRINT("%02x %02x %02x\n", *(data + (i * 16) + 0), *(data + (i * 16) + 1), *(data + (i * 16) + 2)); + } + else if (last_line_len == 4) + { + ZXIC_COMM_PRINT("%02x %02x %02x %02x\n", + *(data + (i * 16) + 0), *(data + (i * 16) + 1), *(data + (i * 16) + 2), *(data + (i * 16) + 3)); + } + else if (last_line_len == 5) + { + ZXIC_COMM_PRINT("%02x %02x %02x %02x %02x\n", + *(data + (i * 16) + 0), *(data + (i * 16) + 1), *(data + (i * 16) + 2), *(data + (i * 16) + 3), + *(data + (i * 16) + 4)); + } + else if (last_line_len == 6) + { + ZXIC_COMM_PRINT("%02x %02x %02x %02x %02x %02x\n", + *(data + (i * 16) + 0), *(data + (i * 16) + 1), *(data + (i * 16) + 2), *(data + (i * 16) + 3), + *(data + (i * 16) + 4), *(data + (i * 16) + 5)); + } + else if (last_line_len == 7) + { + ZXIC_COMM_PRINT("%02x %02x %02x %02x %02x %02x %02x\n", + *(data + (i * 16) + 0), *(data + (i * 16) + 1), *(data + (i * 16) + 2), *(data + (i * 16) + 3), + *(data + (i * 16) + 4), *(data + (i * 16) + 5), *(data + (i * 16) + 6)); + } + else if (last_line_len == 8) + { + ZXIC_COMM_PRINT("%02x %02x %02x %02x %02x %02x %02x %02x\n", + *(data + (i * 16) + 0), *(data + (i * 16) + 1), *(data + (i * 16) + 2), *(data + (i * 16) + 3), + *(data + (i * 16) + 4), *(data + (i * 16) + 5), *(data + (i * 16) + 6), *(data + (i * 16) + 7)); + } + else if (last_line_len == 9) + { + ZXIC_COMM_PRINT("%02x %02x %02x %02x %02x %02x %02x %02x %02x\n", + *(data + (i * 16) + 0), *(data + (i * 16) + 1), *(data + (i * 16) + 2), *(data + (i * 16) + 3), + *(data + (i * 16) + 4), *(data + (i * 16) + 5), *(data + (i * 16) + 6), *(data + (i * 16) + 7), + *(data + (i * 16) + 8)); + } + else if (last_line_len == 10) + { + ZXIC_COMM_PRINT("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", + *(data + (i * 16) + 0), *(data + (i * 16) + 1), *(data + (i * 16) + 2), *(data + (i * 16) + 3), + *(data + (i * 16) + 4), *(data + (i * 16) + 5), *(data + (i * 16) + 6), *(data + (i * 16) + 7), + *(data + (i * 16) + 8), *(data + (i * 16) + 9)); + } + else if (last_line_len == 11) + { + ZXIC_COMM_PRINT("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", + *(data + (i * 16) + 0), *(data + (i * 16) + 1), *(data + (i * 16) + 2), *(data + (i * 16) + 3), + *(data + (i * 16) + 4), *(data + (i * 16) + 5), *(data + (i * 16) + 6), *(data + (i * 16) + 7), + *(data + (i * 16) + 8), *(data + (i * 16) + 9), *(data + (i * 16) + 10)); + } + else if (last_line_len == 12) + { + ZXIC_COMM_PRINT("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", + *(data + (i * 16) + 0), *(data + (i * 16) + 1), *(data + (i * 16) + 2), *(data + (i * 16) + 3), + *(data + (i * 16) + 4), *(data + (i * 16) + 5), *(data + (i * 16) + 6), *(data + (i * 16) + 7), + *(data + (i * 16) + 8), *(data + (i * 16) + 9), *(data + (i * 16) + 10), *(data + (i * 16) + 11)); + } + else if (last_line_len == 13) + { + ZXIC_COMM_PRINT("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", + *(data + (i * 16) + 0), *(data + (i * 16) + 1), *(data + (i * 16) + 2), *(data + (i * 16) + 3), + *(data + (i * 16) + 4), *(data + (i * 16) + 5), *(data + (i * 16) + 6), *(data + (i * 16) + 7), + *(data + (i * 16) + 8), *(data + (i * 16) + 9), *(data + (i * 16) + 10), *(data + (i * 16) + 11), + *(data + (i * 16) + 12)); + } + else if (last_line_len == 14) + { + ZXIC_COMM_PRINT("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", + *(data + (i * 16) + 0), *(data + (i * 16) + 1), *(data + (i * 16) + 2), *(data + (i * 16) + 3), + *(data + (i * 16) + 4), *(data + (i * 16) + 5), *(data + (i * 16) + 6), *(data + (i * 16) + 7), + *(data + (i * 16) + 8), *(data + (i * 16) + 9), *(data + (i * 16) + 10), *(data + (i * 16) + 11), + *(data + (i * 16) + 12), *(data + (i * 16) + 13)); + } + else if (last_line_len == 15) + { + ZXIC_COMM_PRINT("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", + *(data + (i * 16) + 0), *(data + (i * 16) + 1), *(data + (i * 16) + 2), *(data + (i * 16) + 3), + *(data + (i * 16) + 4), *(data + (i * 16) + 5), *(data + (i * 16) + 6), *(data + (i * 16) + 7), + *(data + (i * 16) + 8), *(data + (i * 16) + 9), *(data + (i * 16) + 10), *(data + (i * 16) + 11), + *(data + (i * 16) + 12), *(data + (i * 16) + 13), *(data + (i * 16) + 14)); + } + } + ZXIC_COMM_PRINT("-----------------------------------------------\n"); + + return DPP_OK; +} + +ZXIC_UINT32 dpp_vport_mgr_init(DPP_PF_INFO_T* pf_info) +{ + ZXIC_UINT16 slot = 0; + ZXIC_UINT16 channel_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + slot = pf_info->slot; + ZXIC_COMM_CHECK_INDEX(slot, 0, DPP_PCIE_SLOT_MAX - 1); + + channel_id = DPP_PCIE_CHANNEL_ID(pf_info->vport); + ZXIC_COMM_CHECK_INDEX(channel_id, 0, DPP_PCIE_CHANNEL_MAX - 1); + + ZXIC_COMM_MEMSET(&g_vport_mgr[slot][channel_id], 0x00, sizeof(DPP_VPORT_MGR_T)); + + return DPP_OK; +} + +ZXIC_UINT32 dpp_vport_mgr_release(DPP_PF_INFO_T* pf_info) +{ + ZXIC_UINT16 slot = 0; + ZXIC_UINT16 channel_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + slot = pf_info->slot; + ZXIC_COMM_CHECK_INDEX(slot, 0, DPP_PCIE_SLOT_MAX - 1); + + channel_id = DPP_PCIE_CHANNEL_ID(pf_info->vport); + ZXIC_COMM_CHECK_INDEX(channel_id, 0, DPP_PCIE_CHANNEL_MAX - 1); + + ZXIC_COMM_MEMSET(&g_vport_mgr[slot][channel_id], 0x00, sizeof(DPP_VPORT_MGR_T)); + + return DPP_OK; +} + +ZXIC_UINT32 dpp_vport_bc_table_get(DPP_PF_INFO_T* pf_info, DPP_VPORT_BC_TABLE_T** bc_table) +{ + ZXIC_UINT16 slot = 0; + ZXIC_UINT16 channel_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + ZXIC_COMM_CHECK_POINT(bc_table); + + slot = pf_info->slot; + ZXIC_COMM_CHECK_INDEX(slot, 0, DPP_PCIE_SLOT_MAX - 1); + + channel_id = DPP_PCIE_CHANNEL_ID(pf_info->vport); + ZXIC_COMM_CHECK_INDEX(channel_id, 0, DPP_PCIE_CHANNEL_MAX - 1); + + *bc_table = &g_vport_mgr[slot][channel_id].bc_table; + + return DPP_OK; +} + +ZXIC_UINT32 dpp_vport_mc_table_get(DPP_PF_INFO_T* pf_info, DPP_VPORT_MC_TABLE_T** mc_table) +{ + ZXIC_UINT16 slot = 0; + ZXIC_UINT16 channel_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + ZXIC_COMM_CHECK_POINT(mc_table); + + slot = pf_info->slot; + ZXIC_COMM_CHECK_INDEX(slot, 0, DPP_PCIE_SLOT_MAX - 1); + + channel_id = DPP_PCIE_CHANNEL_ID(pf_info->vport); + ZXIC_COMM_CHECK_INDEX(channel_id, 0, DPP_PCIE_CHANNEL_MAX - 1); + + *mc_table = &g_vport_mgr[slot][channel_id].mc_table; + + return DPP_OK; +} + +ZXIC_UINT32 dpp_vport_uc_promisc_table_get(DPP_PF_INFO_T* pf_info, DPP_VPORT_PROMISC_TABLE_T** promisc_table) +{ + ZXIC_UINT16 slot = 0; + ZXIC_UINT16 channel_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + ZXIC_COMM_CHECK_POINT(promisc_table); + + slot = pf_info->slot; + ZXIC_COMM_CHECK_INDEX(slot, 0, DPP_PCIE_SLOT_MAX - 1); + + channel_id = DPP_PCIE_CHANNEL_ID(pf_info->vport); + ZXIC_COMM_CHECK_INDEX(channel_id, 0, DPP_PCIE_CHANNEL_MAX - 1); + + *promisc_table = &g_vport_mgr[slot][channel_id].uc_promisc_table; + + return DPP_OK; +} + +ZXIC_UINT32 dpp_vport_mc_promisc_table_get(DPP_PF_INFO_T* pf_info, DPP_VPORT_PROMISC_TABLE_T** promisc_table) +{ + ZXIC_UINT16 slot = 0; + ZXIC_UINT16 channel_id = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + ZXIC_COMM_CHECK_POINT(promisc_table); + + slot = pf_info->slot; + ZXIC_COMM_CHECK_INDEX(slot, 0, DPP_PCIE_SLOT_MAX - 1); + + channel_id = DPP_PCIE_CHANNEL_ID(pf_info->vport); + ZXIC_COMM_CHECK_INDEX(channel_id, 0, DPP_PCIE_CHANNEL_MAX - 1); + + *promisc_table = &g_vport_mgr[slot][channel_id].mc_promisc_table; + + return DPP_OK; +} + +ZXIC_UINT32 dpp_vport_get_by_vqm_vfid(ZXIC_UINT16 pf_vport, ZXIC_UINT32 vqm_vfid, ZXIC_UINT16* vport) +{ + ZXIC_COMM_CHECK_POINT(vport); + + if (vqm_vfid >= PF_VQM_VFID_OFFSET) + { + *vport = pf_vport; + } + else + { + *vport = ((EPID(pf_vport) << 12) | 0x800 | (FUNC_NUM(pf_vport) << 8) | (vqm_vfid - (EPID(pf_vport) * 256))); + } + return DPP_OK; +} + +ZXIC_UINT32 dpp_vport_get_by_mc_bitmap(ZXIC_UINT16 pf_vport, ZXIC_UINT32 group_id, ZXIC_UINT64 mc_bitmap, + ZXIC_UINT16 vport[64], ZXIC_UINT32* p_vport_num) +{ + ZXIC_UINT32 i = 0; + + ZXIC_UINT32 vport_num = 0; + + ZXIC_COMM_CHECK_POINT(vport); + ZXIC_COMM_CHECK_POINT(p_vport_num); + + for (i = 0; i < MC_MEMBER_NUM_IN_GROUP; i++) + { + if ((mc_bitmap >> i) & 1) + { + vport[vport_num] = ((EPID(pf_vport) << 12) | 0x800 | (FUNC_NUM(pf_vport) << 8) | + ((group_id * MC_MEMBER_NUM_IN_GROUP) + MC_MEMBER_NUM_IN_GROUP - 1 - i)); + vport_num ++; + } + } + + *p_vport_num = vport_num; + + return DPP_OK; +} + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_diag.c b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_diag.c new file mode 100644 index 0000000..e1cdbd3 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_diag.c @@ -0,0 +1,466 @@ +#include "dpp_tbl_api.h" +#include "dpp_tbl_comm.h" +#include "dpp_dtb.h" +#include "dpp_drv_sdt.h" + +ZXIC_CONST ZXIC_CHAR* g_vport_table_attr_name[] = { + "tpid","vhca","uplink_port","rss_hash_factor","hash_alg","panel_id","lag_id","pf_vqm_vfid","rsv3", + "mtu","port_base_qid","hash_search_index","rsv1","tm_enable","ingress_meter_enable","egress_meter_enable", + "ingress_meter_mode","egress_meter_mode","fd_enable","vepa_enable","spoof_check_enable","inline_sec_offload", + "ovs_enable","lag_enable","is_passthrough","is_vf","virtion_version","virtio_enable","accelerator_offload_flag", + "lro_offload","ip_fragment_offload","tcp_udp_checksum_offload","ip_checksum_offload","outer_ip_checksum_offload", + "is_up","allmulticast_enable","hw_bond_enable","rdma_offload_enable","vlan_filter_enable","vlan_strip_offload", + "qinq_vlan_strip_offload","rss_enable","mtu_offload_enable","hit_flag" +}; + +ZXIC_CONST ZXIC_CHAR* g_vport_panel_table_attr_name[] = { + "rsv7","ovs_pf_vfid","rsv6","pf_memport_qid","rsv5","bond_pf_vqm_vfid","rsv4","is_up","bond_link_up","hw_bond_enable", + "mtu","mtu_offload_enable","rsv3","tm_base_queue","ptp_port_vfid","rsv2","pf_vqm_vfid","tm_shape_enable","ptp_tc_enable", + "trust_mode","hit_flag" +}; + +ZXIC_CONST ZXIC_CHAR* dpp_vport_table_attr_name_get(ZXIC_UINT32 attr) +{ + if (attr >= (sizeof(ZXDH_VPORT_T) / sizeof(ZXIC_UINT32))) + { + return NULL; + } + + return g_vport_table_attr_name[attr]; +} + +ZXIC_CONST ZXIC_CHAR* dpp_vport_panel_table_attr_name_get(ZXIC_UINT32 attr) +{ + if (attr >= (sizeof(ZXDH_PANEL_PORT_T) / sizeof(ZXIC_UINT32))) + { + return NULL; + } + + return g_vport_panel_table_attr_name[attr]; +} + +ZXIC_UINT32 diag_dpp_vport_mac_add(ZXIC_UINT16 slot, ZXIC_UINT16 vport, + ZXIC_UINT8 mac0, ZXIC_UINT8 mac1, ZXIC_UINT8 mac2, + ZXIC_UINT8 mac3, ZXIC_UINT8 mac4, ZXIC_UINT8 mac5) +{ + DPP_PF_INFO_T pf_info = {slot, vport}; + + ZXIC_UINT8 mac[6]; + ZXIC_UINT32 rc = DPP_OK; + + mac[0] = mac0; + mac[1] = mac1; + mac[2] = mac2; + mac[3] = mac3; + mac[4] = mac4; + mac[5] = mac5; + + rc = dpp_add_mac(&pf_info, mac); + ZXIC_COMM_CHECK_RC(rc, "dpp_add_mac"); + + return DPP_OK; +} + +ZXIC_UINT32 diag_dpp_vport_mac_del(ZXIC_UINT16 slot, ZXIC_UINT16 vport, + ZXIC_UINT8 mac0, ZXIC_UINT8 mac1, ZXIC_UINT8 mac2, + ZXIC_UINT8 mac3, ZXIC_UINT8 mac4, ZXIC_UINT8 mac5) +{ + DPP_PF_INFO_T pf_info = {slot, vport}; + + ZXIC_UINT8 mac[6]; + ZXIC_UINT32 rc = DPP_OK; + + mac[0] = mac0; + mac[1] = mac1; + mac[2] = mac2; + mac[3] = mac3; + mac[4] = mac4; + mac[5] = mac5; + + rc = dpp_del_mac(&pf_info, mac); + ZXIC_COMM_CHECK_RC(rc, "dpp_del_mac"); + + return DPP_OK; +} + +ZXIC_UINT32 diag_dpp_vport_mac_prt(ZXIC_UINT16 slot, ZXIC_UINT16 vport) +{ + ZXIC_UINT32 mac_num = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 rc = DPP_OK; + + DPP_PF_INFO_T pf_info = {slot, vport}; + + MAC_VPORT_INFO *p_mac_arr = (MAC_VPORT_INFO *)ZXIC_COMM_MALLOC(DTB_DUMP_UNICAST_MAC_DUMP_NUM * + sizeof(MAC_VPORT_INFO)); + ZXIC_COMM_CHECK_POINT(p_mac_arr); + + rc = dpp_unicast_mac_dump(&pf_info, p_mac_arr, &mac_num); + ZXIC_COMM_CHECK_RC_MEMORY_FREE(rc, "dpp_unicast_mac_dump", p_mac_arr); + + ZXIC_COMM_PRINT("-----------------------------------------------\n"); + for (i = 0; i < mac_num; i++) + { + ZXIC_COMM_PRINT("slot: %u vport: 0x%04x mac: %02x:%02x:%02x:%02x:%02x:%02x\n", + slot, p_mac_arr[i].vport, + p_mac_arr[i].addr[0], p_mac_arr[i].addr[1], + p_mac_arr[i].addr[2], p_mac_arr[i].addr[3], + p_mac_arr[i].addr[4], p_mac_arr[i].addr[5]); + } + ZXIC_COMM_PRINT("-----------------------------------------------\n"); + + ZXIC_COMM_FREE(p_mac_arr); + + return DPP_OK; +} + +ZXIC_UINT32 diag_dpp_vport_mc_mac_add(ZXIC_UINT16 slot, ZXIC_UINT16 vport, + ZXIC_UINT8 mac0, ZXIC_UINT8 mac1, ZXIC_UINT8 mac2, + ZXIC_UINT8 mac3, ZXIC_UINT8 mac4, ZXIC_UINT8 mac5) +{ + DPP_PF_INFO_T pf_info = {slot, vport}; + + ZXIC_UINT8 mac[6]; + ZXIC_UINT32 rc = DPP_OK; + + mac[0] = mac0; + mac[1] = mac1; + mac[2] = mac2; + mac[3] = mac3; + mac[4] = mac4; + mac[5] = mac5; + + rc = dpp_multi_mac_add_member(&pf_info, mac); + ZXIC_COMM_CHECK_RC(rc, "dpp_multi_mac_add_member"); + + return DPP_OK; +} + +ZXIC_UINT32 diag_dpp_vport_mc_mac_del(ZXIC_UINT16 slot, ZXIC_UINT16 vport, + ZXIC_UINT8 mac0, ZXIC_UINT8 mac1, ZXIC_UINT8 mac2, + ZXIC_UINT8 mac3, ZXIC_UINT8 mac4, ZXIC_UINT8 mac5) +{ + DPP_PF_INFO_T pf_info = {slot, vport}; + + ZXIC_UINT8 mac[6]; + ZXIC_UINT32 rc = DPP_OK; + + mac[0] = mac0; + mac[1] = mac1; + mac[2] = mac2; + mac[3] = mac3; + mac[4] = mac4; + mac[5] = mac5; + + rc = dpp_multi_mac_del_member(&pf_info, mac); + ZXIC_COMM_CHECK_RC(rc, "dpp_multi_mac_del_member"); + + return DPP_OK; +} + +ZXIC_UINT32 diag_dpp_vport_mc_mac_prt(ZXIC_UINT16 slot, ZXIC_UINT16 vport) +{ + ZXIC_UINT32 mac_num = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 rc = DPP_OK; + + DPP_PF_INFO_T pf_info = {slot, vport}; + + MAC_VPORT_INFO *p_mac_arr = (MAC_VPORT_INFO *)ZXIC_COMM_MALLOC(DTB_DUMP_MULTICAST_MAC_DUMP_NUM * + sizeof(MAC_VPORT_INFO)); + ZXIC_COMM_CHECK_POINT(p_mac_arr); + + rc = dpp_multicast_mac_dump(&pf_info, p_mac_arr, &mac_num); + ZXIC_COMM_CHECK_RC_MEMORY_FREE(rc, "dpp_multicast_mac_dump", p_mac_arr); + + ZXIC_COMM_PRINT("-----------------------------------------------\n"); + for (i = 0; i < mac_num; i++) + { + ZXIC_COMM_PRINT("slot: %u vport: 0x%04x mac: %02x:%02x:%02x:%02x:%02x:%02x\n", + slot, p_mac_arr[i].vport, + p_mac_arr[i].addr[0], p_mac_arr[i].addr[1], + p_mac_arr[i].addr[2], p_mac_arr[i].addr[3], + p_mac_arr[i].addr[4], p_mac_arr[i].addr[5]); + } + ZXIC_COMM_PRINT("-----------------------------------------------\n"); + + ZXIC_COMM_FREE(p_mac_arr); + + return DPP_OK; +} + +ZXIC_UINT32 diag_dpp_vport_table_set(ZXIC_UINT16 slot, ZXIC_UINT16 vport, ZXIC_UINT32 attr, + ZXIC_UINT32 value) +{ + DPP_PF_INFO_T pf_info = {slot, vport}; + + ZXIC_UINT32 rc = DPP_OK; + + rc = dpp_egr_port_attr_set(&pf_info, attr, value); + ZXIC_COMM_CHECK_RC(rc, "dpp_egr_port_attr_set"); + + return DPP_OK; +} + +ZXIC_UINT32 diag_dpp_vport_table_prt(ZXIC_UINT16 slot, ZXIC_UINT16 vport) +{ + ZXDH_VPORT_T port_table = {0}; + DPP_PF_INFO_T pf_info = {slot, vport}; + + ZXIC_UINT32 rc = DPP_OK; + + rc = dpp_egr_port_attr_get(&pf_info, &port_table); + ZXIC_COMM_CHECK_RC(rc, "dpp_egr_port_attr_set"); + + ZXIC_COMM_PRINT("-----------------------------------------------\n"); + ZXIC_COMM_PRINT("hit_flag = %u\n", port_table.hit_flag); + ZXIC_COMM_PRINT("%02u mtu_offload_enable = %u\n", EGR_FLAG_MTU_OFFLOAD_EN_OFF, port_table.mtu_offload_enable); + ZXIC_COMM_PRINT("%02u rss_enable = %u\n", EGR_FLAG_RSS_EN_OFF, port_table.rss_enable); + ZXIC_COMM_PRINT("%02u qinq_vlan_strip_offload = %u\n", EGR_FLAG_QINQ_VLAN_STRIP_OFFLOAD, port_table.qinq_vlan_strip_offload); + ZXIC_COMM_PRINT("%02u vlan_strip_offload = %u\n", EGR_FLAG_VLAN_STRIP_OFFLOAD, port_table.vlan_strip_offload); + ZXIC_COMM_PRINT("%02u vlan_filter_enable = %u\n", EGR_FLAG_VLAN_FILTER_EN_OFF, port_table.vlan_filter_enable); + ZXIC_COMM_PRINT("%02u rdma_offload_enable = %u\n", EGR_FLAG_RDMA_OFFLOAD_EN_OFF, port_table.rdma_offload_enable); + ZXIC_COMM_PRINT("%02u hw_bond_enable = %u\n", EGR_FLAG_HW_BOND_EN_OFF, port_table.hw_bond_enable); + ZXIC_COMM_PRINT("%02u allmulticast_enable = %u\n", EGR_FLAG_IFF_ALLMULTI_EN_OFF, port_table.allmulticast_enable); + ZXIC_COMM_PRINT("%02u is_up = %u\n", EGR_FLAG_VPORT_IS_UP, port_table.is_up); + ZXIC_COMM_PRINT("%02u outer_ip_checksum_offload = %u\n", EGR_FLAG_OUTER_IP_CHECKSUM_OFFLOAD, port_table.outer_ip_checksum_offload); + ZXIC_COMM_PRINT("%02u ip_checksum_offload = %u\n", EGR_FLAG_IP_CHKSUM, port_table.ip_checksum_offload); + ZXIC_COMM_PRINT("%02u tcp_udp_checksum_offload = %u\n", EGR_FLAG_TCP_UDP_CHKSUM, port_table.tcp_udp_checksum_offload); + ZXIC_COMM_PRINT("%02u ip_fragment_offload = %u\n", EGR_FLAG_IP_FRAGMENT_OFFLOAD, port_table.ip_fragment_offload); + ZXIC_COMM_PRINT("%02u lro_offload = %u\n", EGR_FLAG_IPV6_TCP_ASSEMBLE, port_table.lro_offload); + ZXIC_COMM_PRINT("%02u lro_offload = %u\n", EGR_FLAG_IPV4_TCP_ASSEMBLE, port_table.lro_offload); + ZXIC_COMM_PRINT("%02u accelerator_offload_flag = %u\n", EGR_FLAG_ACCELERATOR_OFFLOAD_FLAG, port_table.accelerator_offload_flag); + ZXIC_COMM_PRINT("%02u virtio_enable = %u\n", EGR_FLAG_VIRTION_EN_OFF, port_table.virtio_enable); + ZXIC_COMM_PRINT("%02u virtion_version = %u\n", EGR_FLAG_VIRTION_VERSION, port_table.virtion_version); + ZXIC_COMM_PRINT("%02u is_vf = %u\n", EGR_FLAG_IS_VF, port_table.is_vf); + ZXIC_COMM_PRINT("%02u is_passthrough = %u\n", EGR_FLAG_IS_PASSTHROUGH, port_table.is_passthrough); + ZXIC_COMM_PRINT("%02u lag_enable = %u\n", EGR_FLAG_LAG_EN_OFF, port_table.lag_enable); + ZXIC_COMM_PRINT("%02u ovs_enable = %u\n", EGR_FLAG_OVS_EN_OFF, port_table.ovs_enable); + ZXIC_COMM_PRINT("%02u inline_sec_offload = %u\n", EGR_FLAG_INLINE_SEC_OFFLOAD, port_table.inline_sec_offload); + ZXIC_COMM_PRINT("%02u spoof_check_enable = %u\n", EGR_FLAG_SPOOFCHK_EN_OFF, port_table.spoof_check_enable); + ZXIC_COMM_PRINT("%02u vepa_enable = %u\n", EGR_FLAG_VEPA_EN_OFF, port_table.vepa_enable); + ZXIC_COMM_PRINT("%02u fd_enable = %u\n", EGR_FLAG_FD_EN_OFF, port_table.fd_enable); + ZXIC_COMM_PRINT("%02u egress_meter_mode = %u\n", EGR_FLAG_EGRESS_MODE, port_table.egress_meter_mode); + ZXIC_COMM_PRINT("%02u ingress_meter_mode = %u\n", EGR_FLAG_INGRESS_MODE, port_table.ingress_meter_mode); + ZXIC_COMM_PRINT("%02u egress_meter_enable = %u\n", EGR_FLAG_EGRESS_METER_EN_OFF, port_table.egress_meter_enable); + ZXIC_COMM_PRINT("%02u ingress_meter_enable = %u\n", EGR_FLAG_INGRESS_METER_EN_OFF, port_table.ingress_meter_enable); + ZXIC_COMM_PRINT("%02u tm_enable = %u\n", EGR_FLAG_TM_EN_OFF, port_table.tm_enable); + ZXIC_COMM_PRINT("%02u hash_search_index = %u\n", EGR_FLAG_HASH_SEARCH_INDEX, port_table.hash_search_index); + ZXIC_COMM_PRINT("%02u port_base_qid = %u\n", EGR_FLAG_PORT_BASE_QID, port_table.port_base_qid); + ZXIC_COMM_PRINT("%02u mtu = %u\n", EGR_FLAG_MTU, port_table.mtu); + ZXIC_COMM_PRINT("%02u pf_vqm_vfid = %u\n", EGR_FLAG_PF_VQM_VFID, port_table.pf_vqm_vfid); + ZXIC_COMM_PRINT("%02u lag_id = %u\n", EGR_FLAG_LAG_ID, port_table.lag_id); + ZXIC_COMM_PRINT("%02u panel_id = %u\n", EGR_FLAG_PANEL_ID, port_table.panel_id); + ZXIC_COMM_PRINT("%02u hash_alg = %u\n", EGR_FLAG_HASH_ALG, port_table.hash_alg); + ZXIC_COMM_PRINT("%02u rss_hash_factor = %u\n", EGR_FLAG_RSS_HASH_FACTOR, port_table.rss_hash_factor); + ZXIC_COMM_PRINT("%02u uplink_port = %u\n", EGR_FLAG_UPLINK_PORT, port_table.uplink_port); + ZXIC_COMM_PRINT("%02u vhca = %u\n", EGR_FLAG_VHCA, port_table.vhca); + ZXIC_COMM_PRINT("%02u tpid = %u\n", EGR_FLAG_TPID, port_table.tpid); + ZXIC_COMM_PRINT("-----------------------------------------------\n"); + + return DPP_OK; +} + +ZXIC_UINT32 diag_dpp_vport_panel_table_set(ZXIC_UINT16 slot, ZXIC_UINT16 vport, ZXIC_UINT8 panel_id, + ZXIC_UINT32 attr, ZXIC_UINT32 value) +{ + DPP_PF_INFO_T pf_info = {slot, vport}; + + ZXIC_UINT32 rc = DPP_OK; + + rc = dpp_panel_attr_set(&pf_info, panel_id, attr, value); + ZXIC_COMM_CHECK_RC(rc, "dpp_panel_attr_set"); + + return DPP_OK; +} + +ZXIC_UINT32 diag_dpp_vport_panel_table_prt(ZXIC_UINT16 slot, ZXIC_UINT16 vport, ZXIC_UINT8 panel_id) +{ + DPP_DEV_T dev = {0}; + ZXDH_PANEL_PORT_T panel_table = {0}; + DPP_PF_INFO_T pf_info = {slot, vport}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 sdt_no = ZXDH_SDT_PANEL_PORT_ATTR_TABLE; + ZXIC_UINT32 rc = DPP_OK; + + rc = dpp_dev_get(dev_id, &pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, &pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + rc = dpp_apt_dtb_eram_get(&dev, queue, sdt_no, panel_id, &panel_table); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_get"); + + ZXIC_COMM_PRINT("-----------------------------------------------\n"); + ZXIC_COMM_PRINT("hit_flag = %u\n", panel_table.hit_flag); + ZXIC_COMM_PRINT("%02u trust_mode = %u\n", PANEL_FLAG_TRUST_MODE, panel_table.trust_mode); + ZXIC_COMM_PRINT("%02u ptp_tc_enable = %u\n", PANEL_FLAG_PTP_TC_ENABLE, panel_table.ptp_tc_enable); + ZXIC_COMM_PRINT("%02u tm_shape_enable = %u\n", PANEL_FLAG_TM_SHAPE_ENABLE, panel_table.tm_shape_enable); + ZXIC_COMM_PRINT("%02u pf_vqm_vfid = %u\n", PANEL_FLAG_PF_VQM_VFID, panel_table.pf_vqm_vfid); + ZXIC_COMM_PRINT("%02u ptp_port_vfid = %u\n", PANEL_FLAG_PTP_PORT_VFID, panel_table.ptp_port_vfid); + ZXIC_COMM_PRINT("%02u tm_base_queue = %u\n", PANEL_FLAG_TM_BASE_QUEUE, panel_table.tm_base_queue); + ZXIC_COMM_PRINT("%02u mtu_offload_enable = %u\n", PANEL_FLAG_MTU_OFFLOAD_ENABLE, panel_table.mtu_offload_enable); + ZXIC_COMM_PRINT("%02u mtu = %u\n", PANEL_FLAG_MTU, panel_table.mtu); + ZXIC_COMM_PRINT("%02u hw_bond_enable = %u\n", PANEL_FLAG_HW_BOND_ENABLE, panel_table.hw_bond_enable); + ZXIC_COMM_PRINT("%02u bond_link_up = %u\n", PANEL_FLAG_BOND_LINK_UP, panel_table.bond_link_up); + ZXIC_COMM_PRINT("%02u is_up = %u\n", PANEL_FLAG_IS_UP, panel_table.is_up); + ZXIC_COMM_PRINT("%02u bond_pf_vqm_vfid = %u\n", PANEL_FLAG_BOND_PF_VQM_VFID, panel_table.bond_pf_vqm_vfid); + ZXIC_COMM_PRINT("%02u pf_memport_qid = %u\n", PANEL_FLAG_PF_MEMPORT_QID, panel_table.pf_memport_qid); + ZXIC_COMM_PRINT("%02u ovs_pf_vfid = %u\n", PANEL_FLAG_OVS_PF_VFID, panel_table.ovs_pf_vfid); + ZXIC_COMM_PRINT("-----------------------------------------------\n"); + + return DPP_OK; +} + +ZXIC_UINT32 diag_dpp_vport_bc_table_set(ZXIC_UINT16 slot, ZXIC_UINT16 vport, ZXIC_UINT32 enable) +{ + DPP_PF_INFO_T pf_info = {slot, vport}; + + ZXIC_UINT32 rc = DPP_OK; + + if (enable == 1) + { + rc = dpp_vport_bond_pf(&pf_info); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_bond_pf"); + } + else + { + rc = dpp_vport_unbond_pf(&pf_info); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_unbond_pf"); + } + + return DPP_OK; +} + +ZXIC_UINT32 diag_dpp_vport_bc_table_prt(ZXIC_UINT16 slot, ZXIC_UINT16 vport) +{ + DPP_DEV_T dev = {0}; + ZXDH_BC_T bc_table = {0}; + DPP_PF_INFO_T pf_info = {slot, vport}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 sdt_no = ZXDH_SDT_BC_TABLE; + ZXIC_UINT32 group_id = 0; + ZXIC_UINT32 index = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 rc = DPP_OK; + + rc = dpp_dev_get(dev_id, &pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, &pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + ZXIC_COMM_PRINT("-----------------------------------------------\n"); + for (group_id = 0; group_id < BC_GROUP_NUM; group_id++) + { + index = (((OWNER_PF_VQM_VFID(pf_info.vport) - PF_VQM_VFID_OFFSET) << 2)| group_id); + + rc = dpp_apt_dtb_eram_get(&dev, queue, sdt_no, index, &bc_table); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_get"); + + if (bc_table.hit_flag == 1) + { + for (i = 0; i < BC_MEMBER_NUM_IN_GROUP; i++) + { + if ((bc_table.bc_bitmap & ((ZXIC_UINT64)(1) << (BC_MEMBER_NUM_IN_GROUP - 1 - i))) != 0) + { + ZXIC_COMM_PRINT("vf %u enable\n", i + (group_id * BC_MEMBER_NUM_IN_GROUP)); + } + } + } + } + ZXIC_COMM_PRINT("-----------------------------------------------\n"); + + return DPP_OK; +} + +ZXIC_UINT32 diag_dpp_vport_promisc_table_prt(ZXIC_UINT16 slot, ZXIC_UINT16 vport, ZXIC_UINT32 sdt_no) +{ + DPP_DEV_T dev = {0}; + ZXDH_PROMISC_T promisc_table[4] = {0}; + DPP_PF_INFO_T pf_info = {slot, vport}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 group_id = 0; + ZXIC_UINT32 index = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 rc = DPP_OK; + + rc = dpp_dev_get(dev_id, &pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, &pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + ZXIC_COMM_PRINT("-----------------------------------------------\n"); + for (group_id = 0; group_id < BC_GROUP_NUM; group_id++) + { + index = (((OWNER_PF_VQM_VFID(pf_info.vport) - PF_VQM_VFID_OFFSET) << 2)| group_id); + + rc = dpp_apt_dtb_eram_get(&dev, queue, sdt_no, index, &promisc_table[group_id]); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_get"); + + if (promisc_table[group_id].hit_flag == 1) + { + for (i = 0; i < PROMISC_MEMBER_NUM_IN_GROUP; i++) + { + if ((promisc_table[group_id].bitmap & ((ZXIC_UINT64)(1) << (PROMISC_MEMBER_NUM_IN_GROUP - 1 - i))) != 0) + { + ZXIC_COMM_PRINT("vf %u enable\n", i + (group_id * PROMISC_MEMBER_NUM_IN_GROUP)); + } + } + } + } + if ((promisc_table[0].pf_enable == 1) && (promisc_table[1].pf_enable == 1) && + (promisc_table[2].pf_enable == 1) && (promisc_table[3].pf_enable == 1)) + { + ZXIC_COMM_PRINT("pf enable\n"); + } + ZXIC_COMM_PRINT("-----------------------------------------------\n"); + + return DPP_OK; +} + +ZXIC_UINT32 diag_dpp_vport_uc_promisc_table_set(ZXIC_UINT16 slot, ZXIC_UINT16 vport, ZXIC_UINT32 enable) +{ + DPP_PF_INFO_T pf_info = {slot, vport}; + + ZXIC_UINT32 rc = DPP_OK; + + rc = dpp_vport_uc_promisc_set(&pf_info, enable); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_uc_promisc_set"); + + return DPP_OK; +} + +ZXIC_UINT32 diag_dpp_vport_uc_promisc_table_prt(ZXIC_UINT16 slot, ZXIC_UINT16 vport) +{ + diag_dpp_vport_promisc_table_prt(slot, vport, ZXDH_SDT_UC_PROMISC_TABLE); + + return DPP_OK; +} + +ZXIC_UINT32 diag_dpp_vport_mc_promisc_table_set(ZXIC_UINT16 slot, ZXIC_UINT16 vport, ZXIC_UINT32 enable) +{ + DPP_PF_INFO_T pf_info = {slot, vport}; + + ZXIC_UINT32 rc = DPP_OK; + + rc = dpp_vport_mc_promisc_set(&pf_info, enable); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_mc_promisc_set"); + + return DPP_OK; +} + +ZXIC_UINT32 diag_dpp_vport_mc_promisc_table_prt(ZXIC_UINT16 slot, ZXIC_UINT16 vport) +{ + diag_dpp_vport_promisc_table_prt(slot, vport, ZXDH_SDT_MC_PROMISC_TABLE); + + return DPP_OK; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_ipsec.c b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_ipsec.c new file mode 100644 index 0000000..05f5fef --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_ipsec.c @@ -0,0 +1,107 @@ +#include "dpp_drv_init.h" +#include "dpp_drv_acl.h" +#include "dpp_drv_hash.h" +#include "dpp_drv_eram.h" +#include "dpp_drv_sdt.h" +#include "dpp_dev.h" +#include "dpp_dtb.h" +#include "dpp_hash.h" +#include "dpp_dtb_table.h" +#include "dpp_dtb_table_api.h" +#include "dpp_tbl_comm.h" +#include "dpp_tbl_ipsec.h" + +ZXIC_UINT32 dpp_ipsec_enc_entry_add(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, + ZXIC_UINT8 *sip, ZXIC_UINT8 *dip, + ZXIC_UINT8 *sip_mask, ZXIC_UINT8 *dip_mask, + ZXIC_UINT32 is_ipv4, ZXIC_UINT32 sa_id) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + + ZXIC_UINT32 sdt_no = ZXDH_SDT_IPSEC_ENC_TABLE; + ZXIC_UINT32 rc = DPP_OK; + + ZXDH_IPSEC_ENC_T ipsec_enc_entry = {0}; + + ZXIC_COMM_CHECK_POINT(pf_info); + ZXIC_COMM_CHECK_POINT(sip); + ZXIC_COMM_CHECK_POINT(dip); + ZXIC_COMM_CHECK_POINT(sip_mask); + ZXIC_COMM_CHECK_POINT(dip_mask); + + ZXIC_COMM_MEMSET(&ipsec_enc_entry, 0, sizeof(ZXDH_IPSEC_ENC_T)); + + ipsec_enc_entry.index = index; + + ZXIC_COMM_MEMCPY(ipsec_enc_entry.key.sip, sip, is_ipv4? 4 : 16); + ZXIC_COMM_MEMCPY(ipsec_enc_entry.key.dip, dip, is_ipv4? 4 : 16); + ZXIC_COMM_MEMCPY(ipsec_enc_entry.mask.sip, sip_mask, is_ipv4? 4 : 16); + ZXIC_COMM_MEMCPY(ipsec_enc_entry.mask.dip, dip_mask, is_ipv4? 4 : 16); + + ipsec_enc_entry.entry.sa_id = sa_id; + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + rc = dpp_apt_dtb_acl_entry_insert(&dev, queue, sdt_no, &ipsec_enc_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_acl_entry_insert"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u index: %u sa_id: %u is_ipv4: %u.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, sdt_no, index, sa_id, is_ipv4); + + ZXIC_COMM_PRINT("[%s] sip:\n", __FUNCTION__); + dpp_data_print(sip, is_ipv4? 4 : 16); + + ZXIC_COMM_PRINT("[%s] sip_mask:\n", __FUNCTION__); + dpp_data_print(sip_mask, is_ipv4? 4 : 16); + + ZXIC_COMM_PRINT("[%s] dip:\n", __FUNCTION__); + dpp_data_print(dip, is_ipv4? 4 : 16); + + ZXIC_COMM_PRINT("[%s] dip_mask:\n", __FUNCTION__); + dpp_data_print(dip_mask, is_ipv4? 4 : 16); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_ipsec_enc_entry_add); + +ZXIC_UINT32 dpp_ipsec_enc_entry_del(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + + ZXIC_UINT32 sdt_no = ZXDH_SDT_IPSEC_ENC_TABLE; + ZXIC_UINT32 rc = DPP_OK; + + ZXDH_IPSEC_ENC_T ipsec_enc_entry = {0}; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_MEMSET(&ipsec_enc_entry, 0, sizeof(ZXDH_IPSEC_ENC_T)); + ZXIC_COMM_MEMSET(&ipsec_enc_entry.mask, 0xFF, sizeof(ZXDH_IPSEC_ENC_MASK)); + + ipsec_enc_entry.index = index; + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + rc = dpp_apt_dtb_acl_entry_insert(&dev, queue, sdt_no, &ipsec_enc_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_acl_entry_insert"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u index: %u.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, sdt_no, index); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_ipsec_enc_entry_del); diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_lag.c b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_lag.c new file mode 100644 index 0000000..14bbfef --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_lag.c @@ -0,0 +1,253 @@ +#include "dpp_drv_init.h" +#include "dpp_drv_acl.h" +#include "dpp_drv_hash.h" +#include "dpp_drv_eram.h" +#include "dpp_drv_sdt.h" +#include "dpp_dev.h" +#include "dpp_dtb.h" +#include "dpp_hash.h" +#include "dpp_dtb_table.h" +#include "dpp_dtb_table_api.h" +#include "dpp_tbl_api.h" +#include "dpp_tbl_comm.h" +#include "dpp_tbl_port.h" +#include "dpp_tbl_lag.h" + +ZXIC_UINT32 dpp_lag_group_create(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 lag_id) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 sdt_no = ZXDH_SDT_LAG_TABLE; + ZXIC_UINT32 rc = DPP_OK; + + ZXDH_LAG_T lag_entry = {0}; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u lag_id: %u start.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, sdt_no, lag_id); + + ZXIC_COMM_MEMSET(&lag_entry, 0, sizeof(ZXDH_LAG_T)); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + lag_entry.hit_flag = 1; + lag_entry.bond_mode = LAG_LACP_MODE; + + rc = dpp_apt_dtb_eram_insert(&dev, queue, sdt_no, lag_id, &lag_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_insert"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u lag_id: %u success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, sdt_no, lag_id); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_lag_group_create); + +ZXIC_UINT32 dpp_lag_group_delete(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 lag_id) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 sdt_no = ZXDH_SDT_LAG_TABLE; + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u lag_id: %u start.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, sdt_no, lag_id); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + rc = dpp_apt_dtb_eram_clear(&dev, queue, sdt_no, lag_id); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_clear"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u lag_id: %u success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, sdt_no, lag_id); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_lag_group_delete); + +ZXIC_UINT32 dpp_lag_mode_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 lag_id, ZXIC_UINT8 mode) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 sdt_no = ZXDH_SDT_LAG_TABLE; + ZXIC_UINT32 rc = DPP_OK; + + ZXDH_LAG_T lag_entry = {0}; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u lag_id: %u mode: %u start.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, sdt_no, lag_id, mode); + + ZXIC_COMM_CHECK_INDEX(mode, LAG_STANDBY_MODE, LAG_LACP_MODE); + + ZXIC_COMM_MEMSET(&lag_entry, 0, sizeof(ZXDH_LAG_T)); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + rc = dpp_apt_dtb_eram_get(&dev, queue, sdt_no, lag_id, &lag_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_get"); + + lag_entry.hit_flag = 1; + lag_entry.bond_mode = mode; + + rc = dpp_apt_dtb_eram_insert(&dev, queue, sdt_no, lag_id, &lag_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_insert"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u lag_id: %u mode: %u success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, sdt_no, lag_id, mode); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_lag_mode_set); + +ZXIC_UINT32 dpp_lag_group_hash_factor_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 lag_id, ZXIC_UINT8 factor) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 sdt_no = ZXDH_SDT_LAG_TABLE; + ZXIC_UINT32 rc = DPP_OK; + + ZXDH_LAG_T lag_entry = {0}; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u lag_id: %u factor: %u start.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, sdt_no, lag_id, factor); + + ZXIC_COMM_MEMSET(&lag_entry, 0, sizeof(ZXDH_LAG_T)); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + rc = dpp_apt_dtb_eram_get(&dev, queue, sdt_no, lag_id, &lag_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_get"); + + lag_entry.hit_flag = 1; + lag_entry.hash_factor = factor; + + rc = dpp_apt_dtb_eram_insert(&dev, queue, sdt_no, lag_id, &lag_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_insert"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u lag_id: %u factor: %u success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, sdt_no, lag_id, factor); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_lag_group_hash_factor_set); + +ZXIC_UINT32 dpp_lag_group_member_add(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 lag_id, ZXIC_UINT8 panel_id) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 sdt_no = ZXDH_SDT_LAG_TABLE; + ZXIC_UINT32 rc = DPP_OK; + + ZXDH_LAG_T lag_entry = {0}; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u lag_id: %u panel_id: %u start.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, sdt_no, lag_id, panel_id); + + ZXIC_COMM_MEMSET(&lag_entry, 0, sizeof(ZXDH_LAG_T)); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + rc = dpp_apt_dtb_eram_get(&dev, queue, sdt_no, lag_id, &lag_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_get"); + + lag_entry.hit_flag = 1; + + if ((lag_entry.member_bitmap & (1 << (15 - panel_id))) == 0) + { + lag_entry.member_bitmap |= (1 << (15 - panel_id)); + lag_entry.member_num++; + } + + rc = dpp_apt_dtb_eram_insert(&dev, queue, sdt_no, lag_id, &lag_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_insert"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u lag_id: %u panel_id: %u success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, sdt_no, lag_id, panel_id); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_lag_group_member_add); + +ZXIC_UINT32 dpp_lag_group_member_del(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 lag_id, ZXIC_UINT8 panel_id) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 sdt_no = ZXDH_SDT_LAG_TABLE; + ZXIC_UINT32 rc = DPP_OK; + + ZXDH_LAG_T lag_entry = {0}; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u lag_id: %u panel_id: %u start.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, sdt_no, lag_id, panel_id); + + ZXIC_COMM_MEMSET(&lag_entry, 0, sizeof(ZXDH_LAG_T)); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + rc = dpp_apt_dtb_eram_get(&dev, queue, sdt_no, lag_id, &lag_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_get"); + + lag_entry.hit_flag = 1; + + if ((lag_entry.member_bitmap & (1 << (15 - panel_id))) != 0) + { + lag_entry.member_bitmap &= ~(1 << (15 - panel_id)); + lag_entry.member_num--; + } + + rc = dpp_apt_dtb_eram_insert(&dev, queue, sdt_no, lag_id, &lag_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_insert"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u lag_id: %u panel_id: %u success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, sdt_no, lag_id, panel_id); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_lag_group_member_del); diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_mac.c b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_mac.c new file mode 100644 index 0000000..ef2df77 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_mac.c @@ -0,0 +1,256 @@ +#include "dpp_drv_init.h" +#include "dpp_drv_acl.h" +#include "dpp_drv_hash.h" +#include "dpp_drv_eram.h" +#include "dpp_drv_sdt.h" +#include "dpp_dev.h" +#include "dpp_dtb.h" +#include "dpp_hash.h" +#include "dpp_dtb_table.h" +#include "dpp_dtb_table_api.h" +#include "dpp_tbl_comm.h" +#include "dpp_tbl_mac.h" +#include "dpp_tbl_api.h" + +ZXIC_VOID dpp_l2_entry_print(ZXDH_L2_ENTRY_T *l2_entry) +{ + ZXIC_COMM_TRACE_INFO("key--mac: %02x:%02x:%02x:%02x:%02x:%02x.\n", + l2_entry->key.dmac_addr[0], l2_entry->key.dmac_addr[1], + l2_entry->key.dmac_addr[2], l2_entry->key.dmac_addr[3], + l2_entry->key.dmac_addr[4], l2_entry->key.dmac_addr[5]); + ZXIC_COMM_TRACE_INFO("key--rsv: 0x%02x\n", l2_entry->key.rsv); + + ZXIC_COMM_TRACE_INFO("entry--vqm_vfid: 0x%02x\n", l2_entry->entry.vqm_vfid); + ZXIC_COMM_TRACE_INFO("entry--rsv: 0x%02x\n", l2_entry->entry.rsv); + ZXIC_COMM_TRACE_INFO("entry--hit_flag: 0x%02x\n", l2_entry->entry.hit_flag); +} + +ZXIC_UINT32 dpp_add_mac(DPP_PF_INFO_T* pf_info, ZXIC_CONST ZXIC_VOID *mac) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 sdt_no = 0; + ZXIC_UINT32 hash_index = 0; + ZXIC_UINT32 rc = DPP_OK; + + ZXDH_L2_ENTRY_T l2_entry = {0}; + + ZXIC_COMM_CHECK_POINT(pf_info); + ZXIC_COMM_CHECK_POINT(mac); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x start.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + ZXIC_COMM_MEMSET(&l2_entry, 0, sizeof(ZXDH_L2_ENTRY_T)); + + memmove(l2_entry.key.dmac_addr, mac, 6); + l2_entry.entry.vqm_vfid = VQM_VFID(pf_info->vport); + l2_entry.entry.hit_flag = 0x00; + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + rc = dpp_vport_hash_index_get(pf_info, &hash_index); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_hash_index_get"); + + sdt_no = ZXDH_SDT_L2_ENTRY_TABLE_PHYPORT0 + hash_index; + + rc = dpp_apt_dtb_hash_insert(&dev, queue, sdt_no, &l2_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_hash_insert"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u vqm_vfid: %u mac: %02x:%02x:%02x:%02x:%02x:%02x.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, sdt_no, + l2_entry.entry.vqm_vfid, + l2_entry.key.dmac_addr[0], l2_entry.key.dmac_addr[1], + l2_entry.key.dmac_addr[2], l2_entry.key.dmac_addr[3], + l2_entry.key.dmac_addr[4], l2_entry.key.dmac_addr[5]); + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x success.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + return DPP_OK; +} +EXPORT_SYMBOL(dpp_add_mac); + +ZXIC_UINT32 dpp_del_mac(DPP_PF_INFO_T* pf_info, ZXIC_CONST ZXIC_VOID *mac) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 sdt_no = 0; + ZXIC_UINT32 hash_index = 0; + ZXIC_UINT32 rc = DPP_OK; + + ZXDH_L2_ENTRY_T l2_entry = {0}; + + ZXIC_COMM_CHECK_POINT(pf_info); + ZXIC_COMM_CHECK_POINT(mac); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x start.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + ZXIC_COMM_MEMSET(&l2_entry, 0, sizeof(ZXDH_L2_ENTRY_T)); + + memmove(l2_entry.key.dmac_addr, mac, 6); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + rc = dpp_vport_hash_index_get(pf_info, &hash_index); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_hash_index_get"); + + sdt_no = ZXDH_SDT_L2_ENTRY_TABLE_PHYPORT0 + hash_index; + + rc = dpp_apt_dtb_hash_delete(&dev, queue, sdt_no, &l2_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_hash_delete"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u vqm_vfid: %u mac: %02x:%02x:%02x:%02x:%02x:%02x success.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, sdt_no, + l2_entry.entry.vqm_vfid, + l2_entry.key.dmac_addr[0], l2_entry.key.dmac_addr[1], + l2_entry.key.dmac_addr[2], l2_entry.key.dmac_addr[3], + l2_entry.key.dmac_addr[4], l2_entry.key.dmac_addr[5]); + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x success.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + return DPP_OK; +} +EXPORT_SYMBOL(dpp_del_mac); + +ZXIC_UINT32 dpp_unicast_mac_dump(DPP_PF_INFO_T* pf_info, MAC_VPORT_INFO *p_mac_arr, ZXIC_UINT32 *p_mac_num) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 index = 0; + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue_id = 0; + ZXIC_UINT32 hash_index = 0; + ZXIC_UINT32 sdt_no = 0; + ZXIC_UINT32 current_vqm_vfid = 0; + ZXIC_UINT16 current_vport = 0; + + ZXIC_UINT32 max_item_num = DTB_DUMP_UNICAST_MAC_DUMP_NUM; + ZXIC_UINT32 entryNum = 0; + ZXDH_L2_ENTRY_T *pL2DataArr = NULL; + ZXDH_L2_ENTRY_T *p_l2_temp_entry = NULL; + MAC_VPORT_INFO *p_temp_mac_info = NULL; + + ZXIC_COMM_CHECK_POINT(pf_info); + ZXIC_COMM_CHECK_POINT(p_mac_arr); + ZXIC_COMM_CHECK_POINT(p_mac_num); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue_id); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + rc = dpp_vport_hash_index_get(pf_info, &hash_index); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_hash_index_get"); + + sdt_no = ZXDH_SDT_L2_ENTRY_TABLE_PHYPORT0 + hash_index; + + pL2DataArr = (ZXDH_L2_ENTRY_T *)ZXIC_COMM_MALLOC(max_item_num * sizeof(ZXDH_L2_ENTRY_T)); + ZXIC_COMM_CHECK_POINT_NO_ASSERT(pL2DataArr); + + rc = dpp_apt_dtb_hash_table_unicast_mac_dump(&dev, queue_id, sdt_no, pL2DataArr, &entryNum); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_apt_dtb_hash_table_unicast_mac_dump", pL2DataArr); + + ZXIC_COMM_TRACE_INFO("unicast mac dump num:0x%x\n", entryNum); + + for(index = 0; index < entryNum; index ++) + { + p_l2_temp_entry = pL2DataArr + index; + p_temp_mac_info = p_mac_arr + index; + + ZXIC_COMM_TRACE_INFO("l2 entry index:0x%x\n", index); + dpp_l2_entry_print(p_l2_temp_entry); + + //从l2中获取mac地址给mac_info,再转换vport信息 + ZXIC_COMM_MEMCPY(p_temp_mac_info->addr, p_l2_temp_entry->key.dmac_addr, 6); + current_vqm_vfid = p_l2_temp_entry->entry.vqm_vfid; + + rc = dpp_vport_get_by_vqm_vfid(OWNER_PF_VPORT(pf_info->vport), current_vqm_vfid, ¤t_vport); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_vport_get_by_vqm_vfid", pL2DataArr); + p_temp_mac_info->vport = current_vport; + ZXIC_COMM_TRACE_INFO("current_vqm_vfid:0x%x --> current_vport:0x%x\n", current_vqm_vfid, current_vport); + } + + *p_mac_num = entryNum; + + ZXIC_COMM_FREE(pL2DataArr); + return DPP_OK; +} +EXPORT_SYMBOL(dpp_unicast_mac_dump); + +ZXIC_UINT32 dpp_unicast_all_mac_delete(DPP_PF_INFO_T* pf_info) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue_id = 0; + ZXIC_UINT32 sdt_no = 0; + ZXIC_UINT32 hash_index = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x start.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue_id); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + rc = dpp_vport_hash_index_get(pf_info, &hash_index); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_hash_index_get"); + + sdt_no = ZXDH_SDT_L2_ENTRY_TABLE_PHYPORT0 + hash_index; + + rc = dpp_dtb_hash_offline_delete(&dev, queue_id, sdt_no); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_hash_offline_delete"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x success.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_unicast_all_mac_delete); + +ZXIC_UINT32 dpp_unicast_all_mac_online_delete(DPP_PF_INFO_T* pf_info) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue_id = 0; + ZXIC_UINT32 sdt_no = 0; + ZXIC_UINT32 hash_index = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x start.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue_id); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + rc = dpp_vport_hash_index_get(pf_info, &hash_index); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_hash_index_get"); + + sdt_no = ZXDH_SDT_L2_ENTRY_TABLE_PHYPORT0 + hash_index; + + rc = dpp_dtb_hash_online_delete(&dev, queue_id, sdt_no); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_hash_online_delete"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x success.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_unicast_all_mac_online_delete); + diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_mc.c b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_mc.c new file mode 100644 index 0000000..d3d1423 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_mc.c @@ -0,0 +1,491 @@ +#include "dpp_drv_init.h" +#include "dpp_drv_acl.h" +#include "dpp_drv_hash.h" +#include "dpp_drv_eram.h" +#include "dpp_drv_sdt.h" +#include "dpp_dev.h" +#include "dpp_dtb.h" +#include "dpp_hash.h" +#include "dpp_dtb_table.h" +#include "dpp_dtb_table_api.h" +#include "dpp_tbl_comm.h" +#include "dpp_tbl_mc.h" +#include "dpp_tbl_bc.h" +#include "dpp_tbl_api.h" + +ZXIC_VOID dpp_mc_entry_print(ZXDH_MC_T *mc_entry) +{ + ZXIC_COMM_TRACE_INFO("key--mc_mac: %02x:%02x:%02x:%02x:%02x:%02x.\n", + mc_entry->key.mc_mac[0], mc_entry->key.mc_mac[1], + mc_entry->key.mc_mac[2], mc_entry->key.mc_mac[3], + mc_entry->key.mc_mac[4], mc_entry->key.mc_mac[5]); + ZXIC_COMM_TRACE_INFO("key--group_id: 0x%02x\n", mc_entry->key.group_id); + ZXIC_COMM_TRACE_INFO("key--rsv: 0x%02x\n", mc_entry->key.rsv); + + ZXIC_COMM_TRACE_INFO("entry--mc_bitmap: 0x%016llx\n", mc_entry->entry.mc_bitmap); + ZXIC_COMM_TRACE_INFO("entry--rsv2: 0x%02x\n", mc_entry->entry.rsv2); + ZXIC_COMM_TRACE_INFO("entry--rsv1: 0x%02x\n", mc_entry->entry.rsv1); + ZXIC_COMM_TRACE_INFO("entry--mc_pf_enable: 0x%02x\n", mc_entry->entry.mc_pf_enable); + ZXIC_COMM_TRACE_INFO("entry--hit_flag: 0x%02x\n", mc_entry->entry.hit_flag); +} + +ZXIC_UINT32 dpp_vport_mc_info_add(DPP_PF_INFO_T* pf_info, ZXIC_CONST ZXIC_VOID *mac) +{ + ZXIC_UINT32 index = 0; + ZXIC_UINT32 group_id = 0; + ZXIC_UINT32 vfunc_num = 0; + ZXIC_UINT32 rc = DPP_OK; + + DPP_VPORT_MC_TABLE_T* mc_table = NULL; + + ZXIC_COMM_CHECK_POINT(pf_info); + ZXIC_COMM_CHECK_POINT(mac); + + rc = dpp_vport_mc_table_get(pf_info, &mc_table); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_mc_table_get"); + ZXIC_COMM_CHECK_POINT(mc_table); + + vfunc_num = VFUNC_NUM(pf_info->vport); + ZXIC_COMM_CHECK_INDEX(vfunc_num, 0, (MC_GROUP_NUM * MC_MEMBER_NUM_IN_GROUP) - 1); + + group_id = vfunc_num / MC_MEMBER_NUM_IN_GROUP; + ZXIC_COMM_CHECK_INDEX(group_id, 0, MC_GROUP_NUM - 1); + + for (index = 0; index < MC_TABLE_SIZE; index++) + { + if (mc_table->mc_info[index].is_valid == 0) + { + continue; + } + if (ZXIC_COMM_MEMCMP(mc_table->mc_info[index].mac, mac, 6) == 0) + { + if (IS_PF(pf_info->vport)) + { + mc_table->mc_info[index].mc_pf_enable = 1; + } + else + { + mc_table->mc_info[index].mc_bitmap[group_id] |= ((ZXIC_UINT64)(1) << (MC_MEMBER_NUM_IN_GROUP - 1 - + (vfunc_num % MC_MEMBER_NUM_IN_GROUP))); + } + return DPP_OK; + } + } + + for (index = 0; index < MC_TABLE_SIZE; index++) + { + if (mc_table->mc_info[index].is_valid == 1) + { + continue; + } + mc_table->mc_info[index].is_valid = 1; + memmove(mc_table->mc_info[index].mac, mac, 6); + + if (IS_PF(pf_info->vport)) + { + mc_table->mc_info[index].mc_pf_enable = 1; + } + else + { + mc_table->mc_info[index].mc_bitmap[group_id] |= ((ZXIC_UINT64)(1) << (MC_MEMBER_NUM_IN_GROUP - 1 - + (vfunc_num % MC_MEMBER_NUM_IN_GROUP))); + } + + return DPP_OK; + } + + return DPP_RC_TABLE_RANGE_INVALID; +} + +ZXIC_UINT32 dpp_vport_mc_info_del(DPP_PF_INFO_T* pf_info, ZXIC_CONST ZXIC_VOID *mac) +{ + ZXIC_UINT32 index = 0; + ZXIC_UINT32 group_id = 0; + ZXIC_UINT32 vfunc_num = 0; + ZXIC_UINT32 rc = DPP_OK; + + DPP_VPORT_MC_TABLE_T* mc_table = NULL; + + ZXIC_COMM_CHECK_POINT(pf_info); + ZXIC_COMM_CHECK_POINT(mac); + + rc = dpp_vport_mc_table_get(pf_info, &mc_table); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_mc_table_get"); + ZXIC_COMM_CHECK_POINT(mc_table); + + vfunc_num = VFUNC_NUM(pf_info->vport); + ZXIC_COMM_CHECK_INDEX(vfunc_num, 0, (MC_GROUP_NUM * MC_MEMBER_NUM_IN_GROUP) - 1); + + group_id = vfunc_num / MC_MEMBER_NUM_IN_GROUP; + ZXIC_COMM_CHECK_INDEX(group_id, 0, MC_GROUP_NUM - 1); + + for (index = 0; index < MC_TABLE_SIZE; index++) + { + if (mc_table->mc_info[index].is_valid == 0) + { + continue; + } + if (ZXIC_COMM_MEMCMP(mc_table->mc_info[index].mac, mac, 6) == 0) + { + if (IS_PF(pf_info->vport)) + { + mc_table->mc_info[index].mc_pf_enable = 0; + } + else + { + mc_table->mc_info[index].mc_bitmap[group_id] &= ~((ZXIC_UINT64)(1) << (MC_MEMBER_NUM_IN_GROUP - 1 - + (vfunc_num % MC_MEMBER_NUM_IN_GROUP))); + } + + if ((mc_table->mc_info[index].mc_bitmap[0] == 0) && (mc_table->mc_info[index].mc_bitmap[1] == 0) && + (mc_table->mc_info[index].mc_bitmap[2] == 0) && (mc_table->mc_info[index].mc_bitmap[3] == 0) && + (mc_table->mc_info[index].mc_pf_enable == 0)) + { + mc_table->mc_info[index].is_valid = 0; + ZXIC_COMM_MEMSET(mc_table->mc_info[index].mac, 0x00, 6); + } + + return DPP_OK; + } + } + + return DPP_OK; +} + +ZXIC_UINT32 dpp_vport_mc_table_insert(DPP_PF_INFO_T* pf_info, ZXIC_CONST ZXIC_VOID *mac) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 index = 0; + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 sdt_no = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 group_id = 0; + ZXIC_UINT32 hash_index = 0; + ZXIC_UINT32 rc = DPP_OK; + + ZXDH_MC_T mc_entry = {0}; + DPP_VPORT_MC_TABLE_T* mc_table = NULL; + + ZXIC_COMM_CHECK_POINT(pf_info); + ZXIC_COMM_CHECK_POINT(mac); + + ZXIC_COMM_MEMSET(&mc_entry, 0, sizeof(ZXDH_MC_T)); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + rc = dpp_vport_hash_index_get(pf_info, &hash_index); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_hash_index_get"); + + sdt_no = ZXDH_SDT_MC_TABLE_PHYPORT0 + hash_index; + + rc = dpp_vport_mc_table_get(pf_info, &mc_table); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_mc_table_get"); + ZXIC_COMM_CHECK_POINT(mc_table); + + for (index = 0; index < MC_TABLE_SIZE; index++) + { + if (mc_table->mc_info[index].is_valid == 0) + { + continue; + } + if (ZXIC_COMM_MEMCMP(mc_table->mc_info[index].mac, mac, 6) != 0) + { + continue; + } + for (group_id = 0; group_id < MC_GROUP_NUM; group_id++) + { + memmove(mc_entry.key.mc_mac, mac, 6); + mc_entry.key.group_id = group_id; + mc_entry.entry.hit_flag = 0x00; + mc_entry.entry.mc_pf_enable = mc_table->mc_info[index].mc_pf_enable; + mc_entry.entry.mc_bitmap = mc_table->mc_info[index].mc_bitmap[group_id]; + + rc = dpp_apt_dtb_hash_insert(&dev, queue, sdt_no, &mc_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_hash_insert"); + + ZXIC_COMM_PRINT("[%s] slot %u vport: 0x%04x sdt_no: %u group_id: %u.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, sdt_no, group_id); + ZXIC_COMM_PRINT("[%s] mac: %02x:%02x:%02x:%02x:%02x:%02x.\n", __FUNCTION__, + mc_entry.key.mc_mac[0], mc_entry.key.mc_mac[1], + mc_entry.key.mc_mac[2], mc_entry.key.mc_mac[3], + mc_entry.key.mc_mac[4], mc_entry.key.mc_mac[5]); + ZXIC_COMM_PRINT("[%s] mc_bitmap: %02x %02x %02x %02x %02x %02x %02x %02x.\n", __FUNCTION__, + *((ZXIC_UINT8*)(&mc_entry.entry.mc_bitmap) + 7), + *((ZXIC_UINT8*)(&mc_entry.entry.mc_bitmap) + 6), + *((ZXIC_UINT8*)(&mc_entry.entry.mc_bitmap) + 5), + *((ZXIC_UINT8*)(&mc_entry.entry.mc_bitmap) + 4), + *((ZXIC_UINT8*)(&mc_entry.entry.mc_bitmap) + 3), + *((ZXIC_UINT8*)(&mc_entry.entry.mc_bitmap) + 2), + *((ZXIC_UINT8*)(&mc_entry.entry.mc_bitmap) + 1), + *((ZXIC_UINT8*)(&mc_entry.entry.mc_bitmap) + 0)); + } + return DPP_OK; + } + + for (group_id = 0; group_id < MC_GROUP_NUM; group_id++) + { + memmove(mc_entry.key.mc_mac, mac, 6); + mc_entry.key.group_id = group_id; + + rc = dpp_apt_dtb_hash_delete(&dev, queue, sdt_no, &mc_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_hash_insert"); + + ZXIC_COMM_PRINT("[%s] delete mc table.\n", __FUNCTION__); + ZXIC_COMM_PRINT("[%s] slot %u vport: 0x%04x sdt_no: %u group_id: %u.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, sdt_no, group_id); + ZXIC_COMM_PRINT("[%s] mac: %02x:%02x:%02x:%02x:%02x:%02x.\n", __FUNCTION__, + mc_entry.key.mc_mac[0], mc_entry.key.mc_mac[1], + mc_entry.key.mc_mac[2], mc_entry.key.mc_mac[3], + mc_entry.key.mc_mac[4], mc_entry.key.mc_mac[5]); + } + + return DPP_OK; +} + +ZXIC_UINT32 dpp_multi_mac_add_member(DPP_PF_INFO_T* pf_info, ZXIC_CONST ZXIC_VOID *mac) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x start.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + rc = dpp_vport_mc_info_add(pf_info, mac); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_mc_info_add"); + + rc = dpp_vport_mc_table_insert(pf_info, mac); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_mc_table_insert"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x success.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_multi_mac_add_member); + +ZXIC_UINT32 dpp_multi_mac_del_member(DPP_PF_INFO_T* pf_info, ZXIC_CONST ZXIC_VOID *mac) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x start.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + rc = dpp_vport_mc_info_del(pf_info, mac); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_mc_info_del"); + + rc = dpp_vport_mc_table_insert(pf_info, mac); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_mc_table_insert"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x success.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_multi_mac_del_member); + +ZXIC_UINT32 dpp_mc_pf_flag_add(MC_PF_FLAG_MGR * p_flag_mgr, ZXIC_UINT32 index, ZXIC_UINT8 *mc_addr) +{ + ZXIC_COMM_MEMCPY(p_flag_mgr[index].mc_addr, mc_addr, 6); + p_flag_mgr[index].pf_flag = 1; + return DPP_OK; +} + +ZXIC_UINT32 dpp_mc_pf_flag_search(MC_PF_FLAG_MGR * p_flag_mgr, ZXIC_UINT8 *mc_addr) +{ + ZXIC_UINT32 index = 0; + + for(index = 0; index < MC_TABLE_SIZE; index ++) + { + if (ZXIC_COMM_MEMCMP(p_flag_mgr[index].mc_addr, mc_addr, 6) == 0) + { + break; + } + } + + if (index == MC_TABLE_SIZE) + { + ZXIC_COMM_TRACE_INFO("dpp_mc_pf_flag_search failed\n"); + return DPP_ERR; + } + + return DPP_OK; +} + +ZXIC_UINT32 dpp_multicast_mac_dump(DPP_PF_INFO_T* pf_info, MAC_VPORT_INFO *p_mac_arr, ZXIC_UINT32 *p_mac_num) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 index = 0; + ZXIC_UINT32 mac_info_index = 0; + ZXIC_UINT32 num = 0; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue_id = 0; + ZXIC_UINT32 sdt_no = 0; + ZXIC_UINT32 hash_index = 0; + ZXIC_UINT32 current_group_id = 0; + ZXIC_UINT64 current_mc_bitmap = 0; + ZXIC_UINT32 current_mc_pf_enable = 0; + + ZXIC_UINT16 current_vport[64] = {0}; + ZXIC_UINT32 current_vport_num = 0; + + MC_PF_FLAG_MGR mc_pf_flag_mgr[MC_TABLE_SIZE] = {0}; + ZXIC_UINT32 pf_flag_count = 0; + + ZXIC_UINT32 max_item_num = DTB_DUMP_MULTICAST_MAC_DUMP_NUM; + ZXIC_UINT32 entryNum = 0; + + ZXDH_MC_T *pMcDataArr = NULL; + ZXDH_MC_T *p_mc_temp_entry = NULL; + MAC_VPORT_INFO *p_temp_mac_info = NULL; + + ZXIC_COMM_CHECK_POINT(pf_info); + ZXIC_COMM_CHECK_POINT(p_mac_arr); + ZXIC_COMM_CHECK_POINT(p_mac_num); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue_id); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + rc = dpp_vport_hash_index_get(pf_info, &hash_index); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_hash_index_get"); + + sdt_no = ZXDH_SDT_MC_TABLE_PHYPORT0 + hash_index; + + pMcDataArr = (ZXDH_MC_T *)ZXIC_COMM_MALLOC(max_item_num * sizeof(ZXDH_MC_T)); + ZXIC_COMM_CHECK_POINT_NO_ASSERT(pMcDataArr); + + rc = dpp_apt_dtb_hash_table_multicast_mac_dump(&dev, queue_id, sdt_no, pMcDataArr, &entryNum); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_apt_dtb_hash_table_multicast_mac_dump", pMcDataArr); + + ZXIC_COMM_TRACE_INFO("multicast mac dump num:0x%x\n", entryNum); + + for(index = 0; index < entryNum; index ++) + { + p_mc_temp_entry = pMcDataArr + index; + + ZXIC_COMM_TRACE_INFO("mc entry index:0x%x\n", index); + dpp_mc_entry_print(p_mc_temp_entry); + + // 从mc中获取mac地址给mac_info,再转换group_id 和 bitmap信息 + current_group_id = p_mc_temp_entry->key.group_id; + current_mc_bitmap = p_mc_temp_entry->entry.mc_bitmap; + current_mc_pf_enable = p_mc_temp_entry->entry.mc_pf_enable; + + if(current_mc_pf_enable) + { + p_temp_mac_info = p_mac_arr + mac_info_index; + if(dpp_mc_pf_flag_search(mc_pf_flag_mgr, p_mc_temp_entry->key.mc_mac)) + { + //没差中 + dpp_mc_pf_flag_add(mc_pf_flag_mgr, pf_flag_count, p_mc_temp_entry->key.mc_mac); + pf_flag_count++; + + ZXIC_COMM_MEMCPY(p_temp_mac_info->addr, p_mc_temp_entry->key.mc_mac, 6); + p_temp_mac_info->vport = OWNER_PF_VPORT(pf_info->vport); + + mac_info_index = mac_info_index + 1; + } + } + + rc = dpp_vport_get_by_mc_bitmap(OWNER_PF_VPORT(pf_info->vport), current_group_id, current_mc_bitmap, current_vport, ¤t_vport_num); + ZXIC_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, "dpp_vport_get_by_mc_bitmap", pMcDataArr); + + ZXIC_COMM_TRACE_INFO("index %d get vf num %d\n", index, current_vport_num); + + for(num = 0; num < current_vport_num; num++) + { + p_temp_mac_info = p_mac_arr + mac_info_index; + ZXIC_COMM_MEMCPY(p_temp_mac_info->addr, p_mc_temp_entry->key.mc_mac, 6); + p_temp_mac_info->vport = current_vport[num]; + mac_info_index = mac_info_index + 1; + } + ZXIC_COMM_TRACE_INFO("mac_info_index 0x%x\n", mac_info_index); + + } + + ZXIC_COMM_FREE(pMcDataArr); + + *p_mac_num = mac_info_index; + + ZXIC_COMM_TRACE_INFO("dump mac num: 0x%x\n", *p_mac_num); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_multicast_mac_dump); + +ZXIC_UINT32 dpp_multicast_all_mac_delete(DPP_PF_INFO_T* pf_info) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue_id = 0; + ZXIC_UINT32 sdt_no = 0; + ZXIC_UINT32 hash_index = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x start.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue_id); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + rc = dpp_vport_hash_index_get(pf_info, &hash_index); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_hash_index_get"); + + sdt_no = ZXDH_SDT_MC_TABLE_PHYPORT0 + hash_index; + + rc = dpp_dtb_hash_offline_delete(&dev, queue_id, sdt_no); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_hash_offline_delete"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x success.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_multicast_all_mac_delete); + +ZXIC_UINT32 dpp_multicast_all_mac_online_delete(DPP_PF_INFO_T* pf_info) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue_id = 0; + ZXIC_UINT32 sdt_no = 0; + ZXIC_UINT32 hash_index = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x start.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue_id); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + rc = dpp_vport_hash_index_get(pf_info, &hash_index); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_hash_index_get"); + + sdt_no = ZXDH_SDT_MC_TABLE_PHYPORT0 + hash_index; + + rc = dpp_dtb_hash_online_delete(&dev, queue_id, sdt_no); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_hash_online_delete"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x success.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_multicast_all_mac_online_delete); diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_panel.c b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_panel.c new file mode 100644 index 0000000..12f8c46 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_panel.c @@ -0,0 +1,135 @@ +#include "dpp_drv_init.h" +#include "dpp_drv_acl.h" +#include "dpp_drv_hash.h" +#include "dpp_drv_eram.h" +#include "dpp_drv_sdt.h" +#include "dpp_dev.h" +#include "dpp_dtb.h" +#include "dpp_hash.h" +#include "dpp_dtb_table.h" +#include "dpp_dtb_table_api.h" +#include "dpp_tbl_api.h" +#include "dpp_tbl_comm.h" +#include "dpp_tbl_port.h" +#include "dpp_tbl_panel.h" +#include "dpp_tbl_diag.h" + +ZXIC_UINT32 dpp_panel_bond_vport(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 panel_id) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(pf_info); + + rc = dpp_egr_port_attr_set(pf_info, EGR_FLAG_PANEL_ID, panel_id); + ZXIC_COMM_CHECK_RC(rc, "dpp_egr_port_attr_set"); + + rc = dpp_panel_attr_set(pf_info, panel_id, PANEL_FLAG_PF_VQM_VFID, OWNER_PF_VQM_VFID(pf_info->vport)); + ZXIC_COMM_CHECK_RC(rc, "dpp_panel_attr_set"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_panel_bond_vport); + +ZXIC_UINT32 dpp_panel_hardware_bond_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 panel_id, ZXIC_UINT8 enable) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 attr = PANEL_FLAG_HW_BOND_ENABLE; + + rc = dpp_panel_attr_set(pf_info, panel_id, attr, enable); + ZXIC_COMM_CHECK_RC(rc, "dpp_panel_attr_set"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_panel_hardware_bond_set); + +ZXIC_UINT32 dpp_panel_bond_pf_vqm_vfid_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 panel_id, ZXIC_UINT16 vqm_vfid) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 attr = PANEL_FLAG_BOND_PF_VQM_VFID; + + rc = dpp_panel_attr_set(pf_info, panel_id, attr, vqm_vfid); + ZXIC_COMM_CHECK_RC(rc, "dpp_panel_attr_set"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_panel_bond_pf_vqm_vfid_set); + +ZXIC_UINT32 dpp_panel_bond_pf_memport_qid_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 panel_id, ZXIC_UINT16 qid) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 attr = PANEL_FLAG_PF_MEMPORT_QID; + + rc = dpp_panel_attr_set(pf_info, panel_id, attr, qid); + ZXIC_COMM_CHECK_RC(rc, "dpp_panel_attr_set"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_panel_bond_pf_memport_qid_set); + +ZXIC_UINT32 dpp_panel_ovs_pf_vqm_vfid_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 panel_id, ZXIC_UINT16 vqm_vfid) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 attr = PANEL_FLAG_OVS_PF_VFID; + + rc = dpp_panel_attr_set(pf_info, panel_id, attr, vqm_vfid); + ZXIC_COMM_CHECK_RC(rc, "dpp_panel_attr_set"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_panel_ovs_pf_vqm_vfid_set); + +ZXIC_UINT32 dpp_panel_attr_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 panel_id, ZXIC_UINT32 attr, ZXIC_UINT32 value) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 sdt_no = ZXDH_SDT_PANEL_PORT_ATTR_TABLE; + ZXIC_UINT32 rc = DPP_OK; + + ZXDH_PANEL_PORT_T panel_port = {0}; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u index: %u attr: %s(%u) value: %u start.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, sdt_no, panel_id, + dpp_vport_panel_table_attr_name_get(attr), attr, value); + + ZXIC_COMM_CHECK_INDEX(attr, 0, (ZXIC_UINT32)((sizeof(ZXDH_PANEL_PORT_T) / sizeof(ZXIC_UINT32)) - 1)); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = zxic_comm_mutex_lock(DEV_PCIE_MUTEX(&dev)); + ZXIC_COMM_CHECK_RC(rc, "zxic_comm_mutex_lock"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u index: %u attr: %s(%u) value: %u lock.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, sdt_no, panel_id, + dpp_vport_panel_table_attr_name_get(attr), attr, value); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC_UNLOCK(rc, "dpp_dtb_queue_id_get", DEV_PCIE_MUTEX(&dev)); + + rc = dpp_apt_dtb_eram_get(&dev, queue, sdt_no, panel_id, &panel_port); + ZXIC_COMM_CHECK_RC_UNLOCK(rc, "dpp_apt_dtb_eram_get", DEV_PCIE_MUTEX(&dev)); + + panel_port.hit_flag = 1; + *((((ZXIC_UINT32 *)(&panel_port)) + attr)) = value; + + rc = dpp_apt_dtb_eram_insert(&dev, queue, sdt_no, panel_id, &panel_port); + ZXIC_COMM_CHECK_RC_UNLOCK(rc, "dpp_apt_dtb_eram_insert", DEV_PCIE_MUTEX(&dev)); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u index: %u attr: %s(%u) value: %u unlock.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, sdt_no, panel_id, + dpp_vport_panel_table_attr_name_get(attr), attr, value); + + rc = zxic_comm_mutex_unlock(DEV_PCIE_MUTEX(&dev)); + ZXIC_COMM_CHECK_RC(rc, "zxic_comm_mutex_unlock"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u index: %u attr: %s(%u) value: %u success.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, sdt_no, panel_id, + dpp_vport_panel_table_attr_name_get(attr), attr, value); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_panel_attr_set); diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_port.c b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_port.c new file mode 100644 index 0000000..976499f --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_port.c @@ -0,0 +1,333 @@ +#include "dpp_drv_init.h" +#include "dpp_drv_acl.h" +#include "dpp_drv_hash.h" +#include "dpp_drv_eram.h" +#include "dpp_drv_sdt.h" +#include "dpp_dev.h" +#include "dpp_dtb.h" +#include "dpp_hash.h" +#include "dpp_dtb_table.h" +#include "dpp_dtb_table_api.h" +#include "dpp_tbl_api.h" +#include "dpp_tbl_comm.h" +#include "dpp_tbl_port.h" +#include "dpp_tbl_diag.h" + +ZXIC_UINT32 dpp_vport_create(DPP_PF_INFO_T* pf_info) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x start.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + rc = dpp_vport_create_by_vqm_vfid(pf_info, VQM_VFID(pf_info->vport)); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_create_by_vqm_vfid"); + + rc = dpp_egr_port_attr_set(pf_info, EGR_FLAG_IS_VF, !IS_PF(pf_info->vport)); + ZXIC_COMM_CHECK_RC(rc, "dpp_egr_port_attr_set"); + + rc = dpp_egr_port_attr_set(pf_info, EGR_FLAG_PF_VQM_VFID, OWNER_PF_VQM_VFID(pf_info->vport)); + ZXIC_COMM_CHECK_RC(rc, "dpp_egr_port_attr_set"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x success.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_vport_create); + +ZXIC_UINT32 dpp_vport_create_by_vqm_vfid(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 vqm_vfid) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 sdt_no = ZXDH_SDT_VPORT_ATTR_TABLE; + ZXIC_UINT32 index = vqm_vfid; + ZXIC_UINT32 rc = DPP_OK; + + ZXDH_VPORT_T port_attr_entry = {0}; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u index: %u start.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, sdt_no, index); + + ZXIC_COMM_MEMSET(&port_attr_entry, 0, sizeof(ZXDH_VPORT_T)); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + port_attr_entry.hit_flag = 1; + + rc = dpp_apt_dtb_eram_insert(&dev, queue, sdt_no, index, &port_attr_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_insert"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u index: %u success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, sdt_no, index); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_vport_create_by_vqm_vfid); + +ZXIC_UINT32 dpp_vport_delete(DPP_PF_INFO_T* pf_info) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 sdt_no = ZXDH_SDT_VPORT_ATTR_TABLE; + ZXIC_UINT32 index = 0; + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(pf_info); + + index = VQM_VFID(pf_info->vport); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u index: %u start.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, sdt_no, index); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + rc = dpp_apt_dtb_eram_clear(&dev, queue, sdt_no, index); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_clear"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u index: %u success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, sdt_no, index); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_vport_delete); + +ZXIC_UINT32 dpp_egr_port_attr_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 attr, ZXIC_UINT32 value) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 sdt_no = ZXDH_SDT_VPORT_ATTR_TABLE; + ZXIC_UINT32 index = 0; + ZXIC_UINT32 rc = DPP_OK; + + ZXDH_VPORT_T port_attr_entry = {0}; + + ZXIC_COMM_CHECK_POINT(pf_info); + + index = VQM_VFID(pf_info->vport); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u index: %u attr: %s(%u) value: %u start.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, sdt_no, index, + dpp_vport_table_attr_name_get(attr), attr, value); + + ZXIC_COMM_CHECK_INDEX(attr, 0, (ZXIC_UINT32)((sizeof(ZXDH_VPORT_T) / sizeof(ZXIC_UINT32)) - 1)); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + rc = dpp_apt_dtb_eram_get(&dev, queue, sdt_no, index, &port_attr_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_get"); + + port_attr_entry.hit_flag = 1; + *((((ZXIC_UINT32 *)(&port_attr_entry)) + attr)) = value; + + rc = dpp_apt_dtb_eram_insert(&dev, queue, sdt_no, index, &port_attr_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_insert"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u index: %u attr: %s(%u) value: %u success.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, sdt_no, index, + dpp_vport_table_attr_name_get(attr), attr, value); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_egr_port_attr_set); + +ZXIC_UINT32 dpp_egr_port_attr_get(DPP_PF_INFO_T* pf_info, ZXDH_VPORT_T *port_attr_entry) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 sdt_no = ZXDH_SDT_VPORT_ATTR_TABLE; + ZXIC_UINT32 index = 0; + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(pf_info); + ZXIC_COMM_CHECK_POINT(port_attr_entry); + + index = VQM_VFID(pf_info->vport); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x index: %u start.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, index); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + rc = dpp_apt_dtb_eram_get(&dev, queue, sdt_no, index, port_attr_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_get"); + ZXIC_COMM_CHECK_INDEX_NOT_EQUAL(port_attr_entry->hit_flag, 1); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x index: %u success.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, index); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_egr_port_attr_get); + +ZXIC_UINT32 dpp_rx_flow_hash_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 hash_mode) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 attr = EGR_FLAG_RSS_HASH_FACTOR; + + rc = dpp_egr_port_attr_set(pf_info, attr, hash_mode & 0xff); + ZXIC_COMM_CHECK_RC(rc, "dpp_egr_port_attr_set"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_rx_flow_hash_set); + +ZXIC_UINT32 dpp_rx_flow_hash_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 *hash_mode) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXDH_VPORT_T port_attr_entry = {0}; + + ZXIC_COMM_CHECK_POINT(pf_info); + ZXIC_COMM_CHECK_POINT(hash_mode); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x start.\n", + __FUNCTION__, pf_info->slot, pf_info->vport); + + rc = dpp_egr_port_attr_get(pf_info, &port_attr_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_egr_port_attr_get"); + + *hash_mode = port_attr_entry.rss_hash_factor; + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x factor: %u.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, *hash_mode); + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x success.\n", + __FUNCTION__, pf_info->slot, pf_info->vport); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_rx_flow_hash_get); + +ZXIC_UINT32 dpp_vport_hash_index_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 *hash_index) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXDH_VPORT_T port_attr_entry = {0}; + + ZXIC_COMM_CHECK_POINT(pf_info); + ZXIC_COMM_CHECK_POINT(hash_index); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x start.\n", + __FUNCTION__, pf_info->slot, pf_info->vport); + + rc = dpp_egr_port_attr_get(pf_info, &port_attr_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_egr_port_attr_get"); + + *hash_index = port_attr_entry.hash_search_index; + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x hash_search_index: %u.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, *hash_index); + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x success.\n", + __FUNCTION__, pf_info->slot, pf_info->vport); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_vport_hash_index_get); + +ZXIC_UINT32 dpp_vport_hash_funcs_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 funcs) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 attr = EGR_FLAG_HASH_ALG; + + rc = dpp_egr_port_attr_set(pf_info, attr, funcs & 0x0f); + ZXIC_COMM_CHECK_RC(rc, "dpp_egr_port_attr_set"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_vport_hash_funcs_set); + +ZXIC_UINT32 dpp_vport_rss_en_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 enable) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 attr = EGR_FLAG_RSS_EN_OFF; + + rc = dpp_egr_port_attr_set(pf_info, attr, enable & 0x1); + ZXIC_COMM_CHECK_RC(rc, "dpp_egr_port_attr_set"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_vport_rss_en_set); + +ZXIC_UINT32 dpp_vport_virtio_en_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 enable) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 attr = EGR_FLAG_VIRTION_EN_OFF; + + rc = dpp_egr_port_attr_set(pf_info, attr, enable & 0x1); + ZXIC_COMM_CHECK_RC(rc, "dpp_egr_port_attr_set"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_vport_virtio_en_set); + +ZXIC_UINT32 dpp_vport_virtio_version_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 version) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 attr = EGR_FLAG_VIRTION_VERSION; + + rc = dpp_egr_port_attr_set(pf_info, attr, version & 0x3); + ZXIC_COMM_CHECK_RC(rc, "dpp_egr_port_attr_set"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_vport_virtio_version_set); + +ZXIC_UINT32 dpp_vport_vlan_filter_en_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 enable) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 attr = EGR_FLAG_VLAN_FILTER_EN_OFF; + + rc = dpp_egr_port_attr_set(pf_info, attr, enable & 0x1); + ZXIC_COMM_CHECK_RC(rc, "dpp_egr_port_attr_set"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_vport_vlan_filter_en_set); + +ZXIC_UINT32 dpp_vport_vlan_qinq_en_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 enable) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 attr = EGR_FLAG_QINQ_VLAN_STRIP_OFFLOAD; + + rc = dpp_egr_port_attr_set(pf_info, attr, enable & 0x1); + ZXIC_COMM_CHECK_RC(rc, "dpp_egr_port_attr_set"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_vport_vlan_qinq_en_set); + +ZXIC_UINT32 dpp_vport_vlan_strip_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 enable) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 attr = EGR_FLAG_VLAN_STRIP_OFFLOAD; + + rc = dpp_egr_port_attr_set(pf_info, attr, enable & 0x1); + ZXIC_COMM_CHECK_RC(rc, "dpp_egr_port_attr_set"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_vport_vlan_strip_set); diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_promisc.c b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_promisc.c new file mode 100644 index 0000000..19878da --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_promisc.c @@ -0,0 +1,145 @@ +#include "dpp_drv_init.h" +#include "dpp_drv_acl.h" +#include "dpp_drv_hash.h" +#include "dpp_drv_eram.h" +#include "dpp_drv_sdt.h" +#include "dpp_dev.h" +#include "dpp_dtb.h" +#include "dpp_hash.h" +#include "dpp_dtb_table.h" +#include "dpp_dtb_table_api.h" +#include "dpp_tbl_api.h" +#include "dpp_tbl_comm.h" +#include "dpp_tbl_promisc.h" + +ZXIC_UINT32 dpp_vport_promisc_info_set(DPP_PF_INFO_T* pf_info, DPP_VPORT_PROMISC_TABLE_T* promisc_table, ZXIC_UINT32 enable) +{ + ZXIC_UINT32 group_id = 0; + ZXIC_UINT32 vfunc_num = 0; + ZXIC_UINT64 bitmap_mask = 0; + + ZXIC_COMM_CHECK_POINT(pf_info); + ZXIC_COMM_CHECK_POINT(promisc_table); + ZXIC_COMM_CHECK_INDEX(enable, 0, 1); + + vfunc_num = VFUNC_NUM(pf_info->vport); + ZXIC_COMM_CHECK_INDEX(vfunc_num, 0, (PROMISC_GROUP_NUM * PROMISC_MEMBER_NUM_IN_GROUP) - 1); + + group_id = vfunc_num / PROMISC_MEMBER_NUM_IN_GROUP; + ZXIC_COMM_CHECK_INDEX(group_id, 0, PROMISC_GROUP_NUM - 1); + + bitmap_mask = ((ZXIC_UINT64)(1) << (PROMISC_MEMBER_NUM_IN_GROUP - 1 - (vfunc_num % PROMISC_MEMBER_NUM_IN_GROUP))); + + if (IS_PF(pf_info->vport)) + { + promisc_table->promisc_info.pf_enable = enable; + } + else + { + promisc_table->promisc_info.bitmap[group_id] = (enable == 1) ? + (promisc_table->promisc_info.bitmap[group_id] | bitmap_mask) : + (promisc_table->promisc_info.bitmap[group_id] & ~bitmap_mask); + } + + return DPP_OK; +} + +ZXIC_UINT32 dpp_vport_promisc_table_insert(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 sdt_no, DPP_VPORT_PROMISC_TABLE_T* promisc_table) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 group_id = 0; + ZXIC_UINT32 index = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 rc = DPP_OK; + + ZXDH_PROMISC_T promisc_entry = {0}; + + ZXIC_COMM_CHECK_POINT(pf_info); + ZXIC_COMM_CHECK_POINT(promisc_table); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + for (group_id = 0; group_id < PROMISC_GROUP_NUM; group_id++) + { + index = (((OWNER_PF_VQM_VFID(pf_info->vport) - PF_VQM_VFID_OFFSET) << 2)| group_id); + promisc_entry.hit_flag = 1; + promisc_entry.pf_enable = promisc_table->promisc_info.pf_enable; + promisc_entry.bitmap = promisc_table->promisc_info.bitmap[group_id]; + + rc = dpp_apt_dtb_eram_insert(&dev, queue, sdt_no, index, &promisc_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_insert"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u group_id: %u index: 0x%02x.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, sdt_no, group_id, index); + ZXIC_COMM_PRINT("[%s] pf_enable: %u bitmap: %02x %02x %02x %02x %02x %02x %02x %02x.\n", __FUNCTION__, + promisc_entry.pf_enable, + *((ZXIC_UINT8*)(&promisc_entry.bitmap) + 7), + *((ZXIC_UINT8*)(&promisc_entry.bitmap) + 6), + *((ZXIC_UINT8*)(&promisc_entry.bitmap) + 5), + *((ZXIC_UINT8*)(&promisc_entry.bitmap) + 4), + *((ZXIC_UINT8*)(&promisc_entry.bitmap) + 3), + *((ZXIC_UINT8*)(&promisc_entry.bitmap) + 2), + *((ZXIC_UINT8*)(&promisc_entry.bitmap) + 1), + *((ZXIC_UINT8*)(&promisc_entry.bitmap) + 0)); + } + + return DPP_OK; +} + +ZXIC_UINT32 dpp_vport_uc_promisc_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 enable) +{ + ZXIC_UINT32 rc = DPP_OK; + DPP_VPORT_PROMISC_TABLE_T* promisc_table = NULL; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x enable: %u start.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, enable); + + rc = dpp_vport_uc_promisc_table_get(pf_info, &promisc_table); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_uc_promisc_table_get"); + + rc = dpp_vport_promisc_info_set(pf_info, promisc_table, enable); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_promisc_info_set"); + + rc = dpp_vport_promisc_table_insert(pf_info, ZXDH_SDT_UC_PROMISC_TABLE, promisc_table); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_promisc_table_insert"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x enable: %u success.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, enable); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_vport_uc_promisc_set); + +ZXIC_UINT32 dpp_vport_mc_promisc_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 enable) +{ + ZXIC_UINT32 rc = DPP_OK; + DPP_VPORT_PROMISC_TABLE_T* promisc_table = NULL; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x enable: %u start.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, enable); + + rc = dpp_vport_mc_promisc_table_get(pf_info, &promisc_table); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_mc_promisc_table_get"); + + rc = dpp_vport_promisc_info_set(pf_info, promisc_table, enable); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_promisc_info_set"); + + rc = dpp_vport_promisc_table_insert(pf_info, ZXDH_SDT_MC_PROMISC_TABLE, promisc_table); + ZXIC_COMM_CHECK_RC(rc, "dpp_vport_promisc_table_insert"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x enable: %u success.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, enable); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_vport_mc_promisc_set); diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_ptp.c b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_ptp.c new file mode 100644 index 0000000..0e09625 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_ptp.c @@ -0,0 +1,47 @@ +#include "dpp_drv_init.h" +#include "dpp_drv_acl.h" +#include "dpp_drv_hash.h" +#include "dpp_drv_eram.h" +#include "dpp_drv_sdt.h" +#include "dpp_dev.h" +#include "dpp_dtb.h" +#include "dpp_hash.h" +#include "dpp_dtb_table.h" +#include "dpp_dtb_table_api.h" +#include "dpp_tbl_api.h" +#include "dpp_tbl_comm.h" +#include "dpp_tbl_ptp.h" + +ZXIC_UINT32 dpp_ptp_port_vfid_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 ptp_port_vfid) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 attr = PANEL_FLAG_PTP_PORT_VFID; + + ZXDH_VPORT_T port_attr_entry = {0}; + + rc = dpp_egr_port_attr_get(pf_info, &port_attr_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_egr_port_attr_get"); + + rc = dpp_panel_attr_set(pf_info, port_attr_entry.panel_id, attr, ptp_port_vfid); + ZXIC_COMM_CHECK_RC(rc, "dpp_panel_attr_set"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_ptp_port_vfid_set); + +ZXIC_UINT32 dpp_ptp_tc_enable_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 ptp_tc_enable) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 attr = PANEL_FLAG_PTP_TC_ENABLE; + + ZXDH_VPORT_T port_attr_entry = {0}; + + rc = dpp_egr_port_attr_get(pf_info, &port_attr_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_egr_port_attr_get"); + + rc = dpp_panel_attr_set(pf_info, port_attr_entry.panel_id, attr, ptp_tc_enable); + ZXIC_COMM_CHECK_RC(rc, "dpp_panel_attr_set"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_ptp_tc_enable_set); diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_qid.c b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_qid.c new file mode 100644 index 0000000..85d797b --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_qid.c @@ -0,0 +1,208 @@ +#include "dpp_drv_init.h" +#include "dpp_drv_acl.h" +#include "dpp_drv_hash.h" +#include "dpp_drv_eram.h" +#include "dpp_drv_sdt.h" +#include "dpp_dev.h" +#include "dpp_ppu.h" +#include "dpp_dtb.h" +#include "dpp_hash.h" +#include "dpp_dtb_table.h" +#include "dpp_dtb_table_api.h" +#include "dpp_tbl_comm.h" +#include "dpp_tbl_qid.h" + +ZXIC_UINT32 dpp_rxfh_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 *queue_list, ZXIC_UINT32 queue_num) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 group_id = 0; + ZXIC_UINT32 sdt_no = ZXDH_SDT_RSS_TO_VQID_TABLE; + ZXIC_UINT32 index = 0; + ZXIC_UINT32 rc = DPP_OK; + + ZXDH_RSS_TO_VQID_T rss_to_vqid_entry = {0}; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x start.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + ZXIC_COMM_CHECK_POINT(queue_list); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + index = VQM_VFID(pf_info->vport) * RSS_TO_VQID_GROUP_NUM; + rss_to_vqid_entry.hit_flag = 1; + + for (group_id = 0; group_id < RSS_TO_VQID_GROUP_NUM; group_id++) + { + for (i = 0; i < 8; i++) + { + rss_to_vqid_entry.vqm_qid[i] = queue_list[((group_id * 8) + i) % queue_num]; + } + + rc = dpp_apt_dtb_eram_insert(&dev, queue, sdt_no, index + group_id, &rss_to_vqid_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_insert"); + + ZXIC_COMM_TRACE_INFO("[%s] slot: %u vport: 0x%04x sdt_no: %u index: 0x%04x.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, sdt_no, index + group_id); + + ZXIC_COMM_TRACE_INFO("[%s] vqm_qid0: 0x%04x vqm_qid1: 0x%04x vqm_qid2: 0x%04x vqm_qid3: 0x%04x.\n", __FUNCTION__, + rss_to_vqid_entry.vqm_qid[0], rss_to_vqid_entry.vqm_qid[1], + rss_to_vqid_entry.vqm_qid[2], rss_to_vqid_entry.vqm_qid[3]); + ZXIC_COMM_TRACE_INFO("[%s] vqm_qid4: 0x%04x vqm_qid5: 0x%04x vqm_qid6: 0x%04x vqm_qid7: 0x%04x.\n", __FUNCTION__, + rss_to_vqid_entry.vqm_qid[4], rss_to_vqid_entry.vqm_qid[5], + rss_to_vqid_entry.vqm_qid[6], rss_to_vqid_entry.vqm_qid[7]); + } + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x success.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_rxfh_set); + +ZXIC_UINT32 dpp_rxfh_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 *queue_list, ZXIC_UINT32 queue_num) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 i = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 group_id = 0; + ZXIC_UINT32 sdt_no = ZXDH_SDT_RSS_TO_VQID_TABLE; + ZXIC_UINT32 index = 0; + ZXIC_UINT32 rc = DPP_OK; + + ZXDH_RSS_TO_VQID_T rss_to_vqid_entry = {0}; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x start.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + ZXIC_COMM_CHECK_POINT(queue_list); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + index = VQM_VFID(pf_info->vport) * RSS_TO_VQID_GROUP_NUM; + for (group_id = 0; group_id < RSS_TO_VQID_GROUP_NUM; group_id++) + { + rc = dpp_apt_dtb_eram_get(&dev, queue, sdt_no, index + group_id, &rss_to_vqid_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_get"); + ZXIC_COMM_CHECK_INDEX_NOT_EQUAL(rss_to_vqid_entry.hit_flag, 1); + + for (i = 0; i < 8; i++) + { + queue_list[((group_id * 8) + i) % queue_num] = rss_to_vqid_entry.vqm_qid[i]; + } + } + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x success.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_rxfh_get); + +ZXIC_UINT32 dpp_rxfh_del(DPP_PF_INFO_T* pf_info) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 group_id = 0; + ZXIC_UINT32 sdt_no = ZXDH_SDT_RSS_TO_VQID_TABLE; + ZXIC_UINT32 index = 0; + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x start.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + index = VQM_VFID(pf_info->vport) * RSS_TO_VQID_GROUP_NUM; + for (group_id = 0; group_id < RSS_TO_VQID_GROUP_NUM; group_id++) + { + rc = dpp_apt_dtb_eram_clear(&dev, queue, sdt_no, index + group_id); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_clear"); + } + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x success.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_rxfh_del); + +ZXIC_UINT32 dpp_thash_key_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 *hash_key, ZXIC_UINT32 key_num) +{ + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 rc = DPP_OK; + + DPP_DEV_T dev = {0}; + DPP_PPU_PPU_COP_THASH_RSK_T *thash = (DPP_PPU_PPU_COP_THASH_RSK_T*)hash_key; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x start.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + ZXIC_COMM_CHECK_POINT(thash); + ZXIC_COMM_CHECK_INDEX_LOWER(key_num, (ZXIC_UINT32)sizeof(DPP_PPU_PPU_COP_THASH_RSK_T)); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_ppu_ppu_cop_thash_rsk_set(&dev, thash); + ZXIC_COMM_CHECK_RC(rc, "dpp_ppu_ppu_cop_thash_rsk_set"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x hash_key:\n", __FUNCTION__, pf_info->slot, pf_info->vport); + dpp_data_print(hash_key, key_num); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x success.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_thash_key_set); + +ZXIC_UINT32 dpp_thash_key_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 *hash_key, ZXIC_UINT32 key_num) +{ + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 rc = DPP_OK; + + DPP_DEV_T dev = {0}; + DPP_PPU_PPU_COP_THASH_RSK_T *thash = (DPP_PPU_PPU_COP_THASH_RSK_T*)hash_key; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x start.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + ZXIC_COMM_CHECK_POINT(thash); + ZXIC_COMM_CHECK_INDEX_LOWER(key_num, (ZXIC_UINT32)sizeof(DPP_PPU_PPU_COP_THASH_RSK_T)); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_ppu_ppu_cop_thash_rsk_get(&dev, thash); + ZXIC_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_ppu_ppu_cop_thash_rsk_get"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x hash_key:\n", __FUNCTION__, pf_info->slot, pf_info->vport); + dpp_data_print(hash_key, key_num); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x success.\n", __FUNCTION__, pf_info->slot, pf_info->vport); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_thash_key_get); diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_stat.c b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_stat.c new file mode 100644 index 0000000..ec43525 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_stat.c @@ -0,0 +1,386 @@ +#include "dpp_drv_init.h" +#include "dpp_drv_acl.h" +#include "dpp_drv_hash.h" +#include "dpp_drv_eram.h" +#include "dpp_drv_sdt.h" +#include "dpp_dev.h" +#include "dpp_dtb.h" +#include "dpp_hash.h" +#include "dpp_dtb_table.h" +#include "dpp_dtb_table_api.h" +#include "dpp_stat_api.h" +#include "dpp_tbl_api.h" +#include "dpp_tbl_comm.h" +#include "dpp_tbl_stat.h" + +ZXIC_UINT32 dpp_stat_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_cnt) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 buff[2] = {0}; + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_TRACE_INFO("[%s] slot: %u vport: 0x%04x index: %u mode: %u start.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, index, mode); + + ZXIC_COMM_CHECK_POINT(p_cnt); + ZXIC_COMM_CHECK_INDEX(mode, STAT_RD_CLR_MODE_UNCLR, STAT_RD_CLR_MODE_CLR); + ZXIC_COMM_CHECK_INDEX(index, 0, ZXDH_STAT_PPU_ERAM_DEPTH - 1); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + if (mode == STAT_RD_CLR_MODE_CLR) + { + rc = dpp_stat_ppu_cnt_get(&dev, STAT_64_MODE, index, STAT_RD_CLR_MODE_CLR, buff); + ZXIC_COMM_CHECK_RC(rc, "dpp_stat_ppu_cnt_get"); + } + else + { + rc = dpp_dtb_eram_stat_data_get(&dev, queue, ZXDH_STAT_PPU_ERAM_BAADDR, + ERAM128_TBL_64b, index, buff); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_eram_stat_data_get"); + } + + *p_cnt = ((ZXIC_UINT64)buff[0] << 32) | buff[1]; + + ZXIC_COMM_TRACE_INFO("[%s] slot: %u vport: 0x%04x index: %u mode: %u cnt: %llu success.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, index, mode, *p_cnt); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_stat_cnt_get); + +ZXIC_UINT32 dpp_stat_cnt_get_128(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_pkB_cnt, ZXIC_UINT64 *p_pk_cnt) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 buff[4] = {0}; + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_TRACE_INFO("[%s] slot: %u vport: 0x%04x index: %u mode: %u start.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, index, mode); + + ZXIC_COMM_CHECK_POINT(p_pkB_cnt); + ZXIC_COMM_CHECK_POINT(p_pk_cnt); + ZXIC_COMM_CHECK_INDEX(mode, STAT_RD_CLR_MODE_UNCLR, STAT_RD_CLR_MODE_CLR); + ZXIC_COMM_CHECK_INDEX(index, 0, ((ZXDH_STAT_PPU_ERAM_DEPTH / 2) - 1)); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + if (mode == STAT_RD_CLR_MODE_CLR) + { + rc = dpp_stat_ppu_cnt_get(&dev, STAT_128_MODE, index, STAT_RD_CLR_MODE_CLR, buff); + ZXIC_COMM_CHECK_RC(rc, "dpp_stat_ppu_cnt_get"); + } + else + { + rc = dpp_dtb_eram_stat_data_get(&dev, queue, ZXDH_STAT_PPU_ERAM_BAADDR, + ERAM128_TBL_128b, index, buff); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_eram_stat_data_get"); + } + + *p_pk_cnt = ((ZXIC_UINT64)buff[0] << 32) | buff[1]; + *p_pkB_cnt = ((ZXIC_UINT64)buff[2] << 32) | buff[3]; + + ZXIC_COMM_TRACE_INFO("[%s] slot: %u vport: 0x%04x index: %u mode: %u h64_cnt: %llu success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, index, mode, *p_pk_cnt); + ZXIC_COMM_TRACE_INFO("[%s] slot: %u vport: 0x%04x index: %u mode: %u l64_cnt: %llu success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, index, mode, *p_pkB_cnt); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_stat_cnt_get_128); + +ZXIC_UINT32 dpp_stat_mc_packet_rx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_cnt) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(p_cnt); + ZXIC_COMM_CHECK_INDEX(index, 0, DPP_STAT_MC_PACKET_RX_CNT_ERAM_DEPTH - 1); + + rc = dpp_stat_cnt_get(pf_info, index + DPP_STAT_MC_PACKET_RX_CNT_ERAM_BAADDR, mode, p_cnt); + ZXIC_COMM_CHECK_RC(rc, "dpp_stat_cnt_get"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x index: %u cnt: %llu success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, index, *p_cnt); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_stat_mc_packet_rx_cnt_get); + +ZXIC_UINT32 dpp_stat_bc_packet_rx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_cnt) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(p_cnt); + ZXIC_COMM_CHECK_INDEX(index, 0, DPP_STAT_BC_PACKET_RX_CNT_ERAM_DEPTH - 1); + + rc = dpp_stat_cnt_get(pf_info, index + DPP_STAT_BC_PACKET_RX_CNT_ERAM_BAADDR, mode, p_cnt); + ZXIC_COMM_CHECK_RC(rc, "dpp_stat_cnt_get"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x index: %u cnt: %llu success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, index, *p_cnt); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_stat_bc_packet_rx_cnt_get); + +ZXIC_UINT32 dpp_stat_1588_packet_rx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_cnt) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(p_cnt); + ZXIC_COMM_CHECK_INDEX(index, 0, DPP_STAT_1588_PACKET_RX_CNT_ERAM_DEPTH - 1); + + rc = dpp_stat_cnt_get(pf_info, index + DPP_STAT_1588_PACKET_RX_CNT_ERAM_BAADDR, mode, p_cnt); + ZXIC_COMM_CHECK_RC(rc, "dpp_stat_cnt_get"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x index: %u cnt: %llu success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, index, *p_cnt); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_stat_1588_packet_rx_cnt_get); + +ZXIC_UINT32 dpp_stat_1588_packet_tx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_cnt) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(p_cnt); + ZXIC_COMM_CHECK_INDEX(index, 0, DPP_STAT_1588_PACKET_TX_CNT_ERAM_DEPTH - 1); + + rc = dpp_stat_cnt_get(pf_info, index + DPP_STAT_1588_PACKET_TX_CNT_ERAM_BAADDR, mode, p_cnt); + ZXIC_COMM_CHECK_RC(rc, "dpp_stat_cnt_get"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x index: %u cnt: %llu success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, index, *p_cnt); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_stat_1588_packet_tx_cnt_get); + +ZXIC_UINT32 dpp_stat_1588_packet_drop_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_cnt) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(p_cnt); + ZXIC_COMM_CHECK_INDEX(index, 0, DPP_STAT_1588_PACKET_DROP_CNT_ERAM_DEPTH - 1); + + rc = dpp_stat_cnt_get(pf_info, index + DPP_STAT_1588_PACKET_DROP_CNT_ERAM_BAADDR, mode, p_cnt); + ZXIC_COMM_CHECK_RC(rc, "dpp_stat_cnt_get"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x index: %u cnt: %llu success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, index, *p_cnt); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_stat_1588_packet_drop_cnt_get); + +ZXIC_UINT32 dpp_stat_1588_enc_packet_rx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_cnt) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(p_cnt); + ZXIC_COMM_CHECK_INDEX(index, 0, DPP_STAT_1588_ENC_PACKET_RX_CNT_ERAM_DEPTH - 1); + + rc = dpp_stat_cnt_get(pf_info, index + DPP_STAT_1588_ENC_PACKET_RX_CNT_ERAM_BAADDR, mode, p_cnt); + ZXIC_COMM_CHECK_RC(rc, "dpp_stat_cnt_get"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x index: %u cnt: %llu success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, index, *p_cnt); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_stat_1588_enc_packet_rx_cnt_get); + +ZXIC_UINT32 dpp_stat_1588_enc_packet_tx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_cnt) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(p_cnt); + ZXIC_COMM_CHECK_INDEX(index, 0, DPP_STAT_1588_ENC_PACKET_TX_CNT_ERAM_DEPTH - 1); + + rc = dpp_stat_cnt_get(pf_info, index + DPP_STAT_1588_ENC_PACKET_TX_CNT_ERAM_BAADDR, mode, p_cnt); + ZXIC_COMM_CHECK_RC(rc, "dpp_stat_cnt_get"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x index: %u cnt: %llu success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, index, *p_cnt); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_stat_1588_enc_packet_tx_cnt_get); + +ZXIC_UINT32 dpp_stat_spoof_packet_drop_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_cnt) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(p_cnt); + ZXIC_COMM_CHECK_INDEX(index, 0, DPP_STAT_SPOOF_PACKET_DROP_CNT_ERAM_DEPTH - 1); + + rc = dpp_stat_cnt_get(pf_info, index + DPP_STAT_SPOOF_PACKET_DROP_CNT_ERAM_BAADDR, mode, p_cnt); + ZXIC_COMM_CHECK_RC(rc, "dpp_stat_cnt_get"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_stat_spoof_packet_drop_cnt_get); + +ZXIC_UINT32 dpp_stat_mcode_packet_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_cnt) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(p_cnt); + ZXIC_COMM_CHECK_INDEX(index, 0, DPP_STAT_MCODE_PACKET_CNT_ERAM_DEPTH - 1); + + rc = dpp_stat_cnt_get(pf_info, index + DPP_STAT_MCODE_PACKET_CNT_ERAM_BAADDR, mode, p_cnt); + ZXIC_COMM_CHECK_RC(rc, "dpp_stat_cnt_get"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x index: %u cnt: %llu success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, index, *p_cnt); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_stat_mcode_packet_cnt_get); + +ZXIC_UINT32 dpp_stat_port_bc_packet_tx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_cnt) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(p_cnt); + ZXIC_COMM_CHECK_INDEX(index, 0, DPP_STAT_PORT_BC_PACKET_TX_CNT_ERAM_DEPTH - 1); + + rc = dpp_stat_cnt_get(pf_info, index + DPP_STAT_PORT_BC_PACKET_TX_CNT_ERAM_BAADDR, mode, p_cnt); + ZXIC_COMM_CHECK_RC(rc, "dpp_stat_cnt_get"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_stat_port_bc_packet_tx_cnt_get); + +ZXIC_UINT32 dpp_stat_port_bc_packet_rx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_cnt) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(p_cnt); + ZXIC_COMM_CHECK_INDEX(index, 0, DPP_STAT_PORT_BC_PACKET_RX_CNT_ERAM_DEPTH - 1); + + rc = dpp_stat_cnt_get(pf_info, index + DPP_STAT_PORT_BC_PACKET_RX_CNT_ERAM_BAADDR, mode, p_cnt); + ZXIC_COMM_CHECK_RC(rc, "dpp_stat_cnt_get"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_stat_port_bc_packet_rx_cnt_get); + +ZXIC_UINT32 dpp_stat_port_RDMA_packet_msg_tx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_pkB_cnt, ZXIC_UINT64 *p_pk_cnt) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(p_pkB_cnt); + ZXIC_COMM_CHECK_POINT(p_pk_cnt); + ZXIC_COMM_CHECK_INDEX(index, 0, DPP_STAT_PORT_RDMA_PACKET_TX_CNT_ERAM_DEPTH - 1); + + rc = dpp_stat_cnt_get_128(pf_info, index + DPP_STAT_PORT_RDMA_PACKET_TX_CNT_ERAM_BAADDR, mode, p_pkB_cnt, p_pk_cnt); + ZXIC_COMM_CHECK_RC(rc, "dpp_stat_cnt_get_128"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x index: %u h64_cnt: %llu success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, index, *p_pk_cnt); + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x index: %u l64_cnt: %llu success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, index, *p_pkB_cnt); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_stat_port_RDMA_packet_msg_tx_cnt_get); + +ZXIC_UINT32 dpp_stat_port_RDMA_packet_msg_rx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_pkB_cnt, ZXIC_UINT64 *p_pk_cnt) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(p_pkB_cnt); + ZXIC_COMM_CHECK_POINT(p_pk_cnt); + ZXIC_COMM_CHECK_INDEX(index, 0, DPP_STAT_PORT_RDMA_PACKET_RX_CNT_ERAM_DEPTH - 1); + + rc = dpp_stat_cnt_get_128(pf_info, index + DPP_STAT_PORT_RDMA_PACKET_RX_CNT_ERAM_BAADDR, mode, p_pkB_cnt, p_pk_cnt); + ZXIC_COMM_CHECK_RC(rc, "dpp_stat_cnt_get_128"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x index: %u h64_cnt: %llu success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, index, *p_pk_cnt); + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x index: %u l64_cnt: %llu success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, index, *p_pkB_cnt); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_stat_port_RDMA_packet_msg_rx_cnt_get); + +ZXIC_UINT32 dpp_stat_plcr_packet_drop_tx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_pkB_cnt, ZXIC_UINT64 *p_pk_cnt) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(p_pkB_cnt); + ZXIC_COMM_CHECK_POINT(p_pk_cnt); + ZXIC_COMM_CHECK_INDEX(index, 0, DPP_STAT_PLCR_PACKET_DROP_TX_CNT_ERAM_DEPTH - 1); + + rc = dpp_stat_cnt_get_128(pf_info, index + DPP_STAT_PLCR_PACKET_DROP_TX_CNT_ERAM_BAADDR, mode, p_pkB_cnt, p_pk_cnt); + ZXIC_COMM_CHECK_RC(rc, "dpp_stat_cnt_get_128"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_stat_plcr_packet_drop_tx_cnt_get); + +ZXIC_UINT32 dpp_stat_plcr_packet_drop_rx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_pkB_cnt, ZXIC_UINT64 *p_pk_cnt) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(p_pkB_cnt); + ZXIC_COMM_CHECK_POINT(p_pk_cnt); + ZXIC_COMM_CHECK_INDEX(index, 0, DPP_STAT_PLCR_PACKET_DROP_RX_CNT_ERAM_DEPTH - 1); + + rc = dpp_stat_cnt_get_128(pf_info, index + DPP_STAT_PLCR_PACKET_DROP_RX_CNT_ERAM_BAADDR, mode, p_pkB_cnt, p_pk_cnt); + ZXIC_COMM_CHECK_RC(rc, "dpp_stat_cnt_get_128"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_stat_plcr_packet_drop_rx_cnt_get); + +ZXIC_UINT32 dpp_stat_MTU_packet_msg_tx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_pkB_cnt, ZXIC_UINT64 *p_pk_cnt) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(p_pkB_cnt); + ZXIC_COMM_CHECK_POINT(p_pk_cnt); + ZXIC_COMM_CHECK_INDEX(index, 0, DPP_STAT_MTU_PACKET_DROP_TX_CNT_ERAM_DEPTH - 1); + + rc = dpp_stat_cnt_get_128(pf_info, index + DPP_STAT_MTU_PACKET_DROP_TX_CNT_ERAM_BAADDR, mode, p_pkB_cnt, p_pk_cnt); + ZXIC_COMM_CHECK_RC(rc, "dpp_stat_cnt_get_128"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_stat_MTU_packet_msg_tx_cnt_get); + +ZXIC_UINT32 dpp_stat_MTU_packet_msg_rx_cnt_get(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 index, ZXIC_UINT32 mode, ZXIC_UINT64 *p_pkB_cnt, ZXIC_UINT64 *p_pk_cnt) +{ + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(p_pkB_cnt); + ZXIC_COMM_CHECK_POINT(p_pk_cnt); + ZXIC_COMM_CHECK_INDEX(index, 0, DPP_STAT_MTU_PACKET_DROP_RX_CNT_ERAM_DEPTH - 1); + + rc = dpp_stat_cnt_get_128(pf_info, index + DPP_STAT_MTU_PACKET_DROP_RX_CNT_ERAM_BAADDR, mode, p_pkB_cnt, p_pk_cnt); + ZXIC_COMM_CHECK_RC(rc, "dpp_stat_cnt_get_128"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_stat_MTU_packet_msg_rx_cnt_get); \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_tm.c b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_tm.c new file mode 100644 index 0000000..735d7ff --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_tm.c @@ -0,0 +1,175 @@ +#include "dpp_tbl_tm.h" +#include "dpp_dev.h" +#include "dpp_drv_sdt.h" +#include "dpp_drv_eram.h" +#include "dpp_drv_qos.h" +#include "dpp_dtb.h" +#include "dpp_apt_se_api.h" +#include "dpp_tbl_api.h" + +ZXIC_UINT32 dpp_tm_flowid_pport_table_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 port, ZXIC_UINT32 flow_id) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 attr = PANEL_FLAG_TM_BASE_QUEUE; + + rc = dpp_panel_attr_set(pf_info, port, attr, flow_id); + ZXIC_COMM_CHECK_RC(rc, "dpp_panel_attr_set"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_tm_flowid_pport_table_set); + +ZXIC_UINT32 dpp_tm_flowid_pport_table_del(DPP_PF_INFO_T* pf_info, ZXIC_UINT8 port) +{ + ZXIC_UINT32 rc = DPP_OK; + + rc = dpp_tm_flowid_pport_table_set(pf_info, port, TM_BASE_QUEUE_VALID); + ZXIC_COMM_CHECK_RC(rc, "dpp_tm_flowid_pport_table_set"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_tm_flowid_pport_table_del); + +ZXIC_UINT32 dpp_tm_pport_trust_mode_table_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 port, ZXIC_UINT32 mode) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 attr = PANEL_FLAG_TRUST_MODE; + + rc = dpp_panel_attr_set(pf_info, port, attr, mode); + ZXIC_COMM_CHECK_RC(rc, "dpp_panel_attr_set"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_tm_pport_trust_mode_table_set); + +ZXIC_UINT32 dpp_tm_pport_trust_mode_table_del(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 port) +{ + ZXIC_UINT32 rc = DPP_OK; + + rc = dpp_tm_pport_trust_mode_table_set(pf_info, port, TRUST_MODE_VALID); + ZXIC_COMM_CHECK_RC(rc, "dpp_tm_pport_trust_mode_table_set"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_tm_pport_trust_mode_table_del); + +ZXIC_UINT32 dpp_tm_pport_dscp_map_table_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 port, ZXIC_UINT32 dscp_id, ZXIC_UINT32 up_id) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 sdt_no = ZXDH_SDT_DSCP_TO_UP_TABLE; + ZXIC_UINT32 index = 0x3ff & ((port << 6) | (dscp_id & 0x3f)); + ZXIC_UINT32 rc = DPP_OK; + + ZXDH_DSCP_TO_UP_T dscp_to_up = {0}; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u index: %u start.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, sdt_no, index); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + // dpp_apt_dtb_eram_get(&dev, queue, sdt_no, index, &dscp_to_up); + + dscp_to_up.hit_flag = 1; + dscp_to_up.up = up_id; + + rc = dpp_apt_dtb_eram_insert(&dev, queue, sdt_no, index, &dscp_to_up); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_insert"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u index: %u success.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, sdt_no, index); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_tm_pport_dscp_map_table_set); + +ZXIC_UINT32 dpp_tm_pport_dscp_map_table_del(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 port, ZXIC_UINT32 dscp_id) +{ + ZXIC_UINT32 rc = DPP_OK; + + rc = dpp_tm_pport_dscp_map_table_set(pf_info, port, dscp_id, UP_VALID); + ZXIC_COMM_CHECK_RC(rc, "dpp_tm_pport_dscp_map_table_set"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_tm_pport_dscp_map_table_del); + +ZXIC_UINT32 dpp_tm_pport_up_map_table_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 port, ZXIC_UINT32 up_id, ZXIC_UINT32 tc_id) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 sdt_no = ZXDH_SDT_UP_TO_TC_TABLE; + ZXIC_UINT32 index = 0x7F & ((port << 3) | (up_id & 0x7)); + ZXIC_UINT32 rc = DPP_OK; + + ZXDH_UP_TO_TC_T up_to_tc = {0}; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u index: %u start.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, sdt_no, index); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + // dpp_apt_dtb_eram_get(&dev, queue, sdt_no, index, &up_to_tc); + + up_to_tc.hit_flag = 1; + up_to_tc.tc = tc_id; + + rc = dpp_apt_dtb_eram_insert(&dev, queue, sdt_no, index, &up_to_tc); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_insert"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u index: %u success.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, sdt_no, index); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_tm_pport_up_map_table_set); + +ZXIC_UINT32 dpp_tm_pport_up_map_table_del(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 port, ZXIC_UINT32 up_id) +{ + ZXIC_UINT32 rc = DPP_OK; + + rc = dpp_tm_pport_up_map_table_set(pf_info, port, up_id, TC_VALID); + ZXIC_COMM_CHECK_RC(rc, "dpp_tm_pport_dscp_map_table_set"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_tm_pport_up_map_table_del); + +ZXIC_UINT32 dpp_tm_pport_mcode_switch_set(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 port, ZXIC_UINT32 mode) +{ + ZXIC_UINT32 rc = DPP_OK; + ZXIC_UINT32 attr = PANEL_FLAG_TM_SHAPE_ENABLE; + + rc = dpp_panel_attr_set(pf_info, port, attr, mode); + ZXIC_COMM_CHECK_RC(rc, "dpp_panel_attr_set"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_tm_pport_mcode_switch_set); + +ZXIC_UINT32 dpp_tm_pport_mcode_switch_del(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 port) +{ + ZXIC_UINT32 rc = DPP_OK; + + rc = dpp_tm_pport_mcode_switch_set(pf_info, port, TM_SWITCH_OFF); + ZXIC_COMM_CHECK_RC(rc, "dpp_tm_pport_mcode_switch_set"); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_tm_pport_mcode_switch_del); diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_vhca.c b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_vhca.c new file mode 100644 index 0000000..ee81c05 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_vhca.c @@ -0,0 +1,81 @@ +#include "dpp_drv_init.h" +#include "dpp_drv_acl.h" +#include "dpp_drv_hash.h" +#include "dpp_drv_eram.h" +#include "dpp_drv_sdt.h" +#include "dpp_dev.h" +#include "dpp_dtb.h" +#include "dpp_hash.h" +#include "dpp_dtb_table.h" +#include "dpp_dtb_table_api.h" +#include "dpp_tbl_api.h" +#include "dpp_tbl_comm.h" +#include "dpp_tbl_port.h" + +// ZXIC_UINT32 dpp_vport_vhca_id_add(ZXIC_UINT16 vport, ZXIC_UINT32 vhca_id, ZXIC_UINT32 vqm_vfid) +ZXIC_UINT32 dpp_vport_vhca_id_add(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 vhca_id) +{ + ZXIC_UINT32 rc = DPP_OK; + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 sdt_no = ZXDH_SDT_VHCA_TABLE; + + ZXDH_VHCA_T vhca_entry = {0}; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u vhca_id: %u start.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, sdt_no, vhca_id); + + ZXIC_COMM_MEMSET(&vhca_entry, 0, sizeof(ZXDH_VHCA_T)); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + vhca_entry.valid = 1; + vhca_entry.vqm_vfid = VQM_VFID(pf_info->vport); + + rc = dpp_apt_dtb_eram_insert(&dev, queue, sdt_no, vhca_id, &vhca_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_insert"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u vhca_id: %u success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, sdt_no, vhca_id); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_vport_vhca_id_add); + +ZXIC_UINT32 dpp_vport_vhca_id_del(DPP_PF_INFO_T* pf_info, ZXIC_UINT32 vhca_id) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 sdt_no = ZXDH_SDT_VHCA_TABLE; + ZXIC_UINT32 rc = DPP_OK; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u vhca_id: %u start.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, sdt_no, vhca_id); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + rc = dpp_apt_dtb_eram_clear(&dev, queue, sdt_no, vhca_id); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_clear"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u vhca_id: %u success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport, sdt_no, vhca_id); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_vport_vhca_id_del); \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_vlan.c b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_vlan.c new file mode 100644 index 0000000..6266bbf --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_np/table/source/dpp_tbl_vlan.c @@ -0,0 +1,152 @@ +#include "dpp_drv_init.h" +#include "dpp_drv_acl.h" +#include "dpp_drv_hash.h" +#include "dpp_drv_eram.h" +#include "dpp_drv_sdt.h" +#include "dpp_dev.h" +#include "dpp_dtb.h" +#include "dpp_hash.h" +#include "dpp_dtb_table.h" +#include "dpp_dtb_table_api.h" +#include "dpp_tbl_comm.h" +#include "dpp_tbl_vlan.h" + +ZXIC_UINT32 dpp_vlan_filter_init(DPP_PF_INFO_T* pf_info) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 sdt_no = ZXDH_SDT_VLAN_FILTER_TABLE; + ZXIC_UINT32 vlan_group_id = 0; + ZXIC_UINT32 index = 0; + ZXIC_UINT32 rc = DPP_OK; + + ZXDH_VLAN_FILTER_T vlan_filter_entry = {0}; + + ZXIC_COMM_CHECK_POINT(pf_info); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x start.\n", __FUNCTION__, + pf_info->slot, pf_info->vport); + + ZXIC_COMM_MEMSET(&vlan_filter_entry, 0, sizeof(ZXDH_VLAN_FILTER_T)); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + vlan_filter_entry.hit_flag = 1; + + for (vlan_group_id = 0; vlan_group_id < VLAN_GROUP_NUM; vlan_group_id++) + { + index = ((vlan_group_id << 11) | (VQM_VFID(pf_info->vport))); + rc = dpp_apt_dtb_eram_insert(&dev, queue, sdt_no, index, &vlan_filter_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_insert"); + } + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x success.\n", __FUNCTION__, + pf_info->slot, pf_info->vport); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_vlan_filter_init); + +ZXIC_UINT32 dpp_add_vlan_filter(DPP_PF_INFO_T* pf_info, ZXIC_UINT16 vlan_id) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 sdt_no = ZXDH_SDT_VLAN_FILTER_TABLE; + + ZXIC_UINT32 vlan_group_id = vlan_id / VLAN_ID_NUM_IN_GROUP; + ZXIC_UINT32 vlan_remainder = vlan_id % VLAN_ID_NUM_IN_GROUP; + + ZXIC_UINT32 index = 0; + ZXIC_UINT32 rc = DPP_OK; + + ZXDH_VLAN_FILTER_T vlan_filter_entry = {0}; + + ZXIC_COMM_CHECK_POINT(pf_info); + + index = ((vlan_group_id << 11) | (VQM_VFID(pf_info->vport))); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u index: 0x%04x group_id: %u vlan_id: %u start.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, sdt_no, index, vlan_group_id, vlan_id); + + ZXIC_COMM_MEMSET(&vlan_filter_entry, 0, sizeof(ZXDH_VLAN_FILTER_T)); + + ZXIC_COMM_CHECK_INDEX(vlan_id, 0, 4095); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + rc = dpp_apt_dtb_eram_get(&dev, queue, sdt_no, index, &vlan_filter_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_get"); + + vlan_filter_entry.hit_flag = 1; + vlan_filter_entry.vport_bitmap[vlan_remainder / 8] |= 1 << (7 - (vlan_remainder % 8)); + + rc = dpp_apt_dtb_eram_insert(&dev, queue, sdt_no, index, &vlan_filter_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_insert"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u index: 0x%04x group_id: %u vlan_id: %u success.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, sdt_no, index, vlan_group_id, vlan_id); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_add_vlan_filter); + +ZXIC_UINT32 dpp_del_vlan_filter(DPP_PF_INFO_T* pf_info, ZXIC_UINT16 vlan_id) +{ + DPP_DEV_T dev = {0}; + + ZXIC_UINT32 dev_id = 0; + ZXIC_UINT32 queue = 0; + ZXIC_UINT32 sdt_no = ZXDH_SDT_VLAN_FILTER_TABLE; + + ZXIC_UINT32 vlan_group_id = vlan_id / VLAN_ID_NUM_IN_GROUP; + ZXIC_UINT32 vlan_remainder = vlan_id % VLAN_ID_NUM_IN_GROUP; + + ZXIC_UINT32 index = 0; + ZXIC_UINT32 rc = DPP_OK; + + ZXDH_VLAN_FILTER_T vlan_filter_entry = {0}; + + ZXIC_COMM_CHECK_POINT(pf_info); + + index = ((vlan_group_id << 11) | (VQM_VFID(pf_info->vport))); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u index: 0x%04x group_id: %u vlan_id: %u start.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, sdt_no, index, vlan_group_id, vlan_id); + + ZXIC_COMM_MEMSET(&vlan_filter_entry, 0, sizeof(ZXDH_VLAN_FILTER_T)); + + ZXIC_COMM_CHECK_INDEX(vlan_id, 0, 4095); + + rc = dpp_dev_get(dev_id, pf_info, &dev); + ZXIC_COMM_CHECK_RC(rc, "dpp_dev_get"); + + rc = dpp_dtb_queue_id_get(dev_id, pf_info, &queue); + ZXIC_COMM_CHECK_RC(rc, "dpp_dtb_queue_id_get"); + + rc = dpp_apt_dtb_eram_get(&dev, queue, sdt_no, index, &vlan_filter_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_get"); + + vlan_filter_entry.hit_flag = 1; + vlan_filter_entry.vport_bitmap[vlan_remainder / 8] &= ~(1 << (7 - (vlan_remainder % 8))); + + rc = dpp_apt_dtb_eram_insert(&dev, queue, sdt_no, index, &vlan_filter_entry); + ZXIC_COMM_CHECK_RC(rc, "dpp_apt_dtb_eram_insert"); + + ZXIC_COMM_PRINT("[%s] slot: %u vport: 0x%04x sdt_no: %u index: 0x%04x group_id: %u vlan_id: %u success.\n", + __FUNCTION__, pf_info->slot, pf_info->vport, sdt_no, index, vlan_group_id, vlan_id); + + return DPP_OK; +} +EXPORT_SYMBOL(dpp_del_vlan_filter); diff --git a/src/net/drivers/net/ethernet/dinghai/en_pf.c b/src/net/drivers/net/ethernet/dinghai/en_pf.c new file mode 100755 index 0000000..9b71b3d --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_pf.c @@ -0,0 +1,2275 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "en_pf.h" +#include "./en_pf/irq.h" +#include "./en_pf/eq.h" +#include "./en_pf/events.h" +#include "en_aux.h" +#include "en_sf.h" +#include "en_np/init/include/dpp_np_init.h" +#include "en_pf/msg_func.h" +#include "msg_common.h" + +#ifdef CONFIG_ZXDH_SF +#include +#endif + +#ifdef DRIVER_VERSION_VAL + #define DRV_VERSION DRIVER_VERSION_VAL +#else + #define DRV_VERSION "1.0-1" +#endif + +#define DRV_SUMMARY "ZTE(R) zxdh-net driver" + +const char zxdh_pf_driver_version[] = DRV_VERSION; +static const char zxdh_pf_driver_string[] = DRV_SUMMARY; +static const char zxdh_pf_copyright[] = "Copyright (c) 2022-23, ZTE Corporation."; + +MODULE_AUTHOR("ZTE Corporation"); +MODULE_DESCRIPTION(DRV_SUMMARY); +MODULE_VERSION(DRV_VERSION); +MODULE_LICENSE("Dual BSD/GPL"); + +uint32_t dh_debug_mask; +module_param_named(debug_mask, dh_debug_mask, uint, 0644); +MODULE_PARM_DESC(debug_mask, "debug mask: 1 = dump cmd data, 2 = dump cmd exec time, 3 = both. Default=0"); + +static const struct pci_device_id dh_pf_pci_table[] = { + { PCI_DEVICE(ZXDH_PF_VENDOR_ID, ZXDH_PF_DEVICE_ID), 0 }, + { PCI_DEVICE(ZXDH_PF_VENDOR_ID, ZXDH_VF_DEVICE_ID), 0 }, + { PCI_DEVICE(ZXDH_PF_BSI_VENDOR_ID, ZXDH_PF_DEVICE_ID), 0 }, + { PCI_DEVICE(ZXDH_PF_BSI_VENDOR_ID, ZXDH_VF_DEVICE_ID), 0 }, + { PCI_DEVICE(ZXDH_PF_VENDOR_ID, ZXDH_INICA_BOND_DEVICE_ID), 0 }, /* bond */ + { PCI_DEVICE(ZXDH_PF_VENDOR_ID, ZXDH_INICB_BOND_DEVICE_ID), 0 }, /* bond */ + { PCI_DEVICE(ZXDH_PF_VENDOR_ID, ZXDH_DPUA_BOND_DEVICE_ID), 0 }, /* bond */ + { PCI_DEVICE(ZXDH_PF_VENDOR_ID, ZXDH_INICA_UPF_BOND_DEVICE_ID), 0 }, /* bond */ + { PCI_DEVICE(ZXDH_PF_VENDOR_ID, ZXDH_PF_E310_DEVICE_ID), 0 }, + { PCI_DEVICE(ZXDH_PF_VENDOR_ID, ZXDH_VF_E310_DEVICE_ID), 0 }, + { PCI_DEVICE(ZXDH_PF_VENDOR_ID, ZXDH_PF_E312_DEVICE_ID), 0 }, + { PCI_DEVICE(ZXDH_PF_VENDOR_ID, ZXDH_VF_E312_DEVICE_ID), 0 }, + { PCI_DEVICE(ZXDH_PF_VENDOR_ID, ZXDH_PF_DPUB_NOF_DEVICE_ID), 0 }, + { PCI_DEVICE(ZXDH_PF_VENDOR_ID, ZXDH_PF_DPUB_PF_DEVICE_ID), 0 }, + { PCI_DEVICE(ZXDH_PF_VENDOR_ID, ZXDH_PF_DPUB_INITIATOR1_DEVICE_ID), 0 }, + { PCI_DEVICE(ZXDH_PF_VENDOR_ID, ZXDH_PF_DPUB_INITIATOR2_DEVICE_ID), 0 }, + { PCI_DEVICE(ZXDH_PF_VENDOR_ID, ZXDH_PF_DPUB_RDMA_DEVICE_ID), 0 }, + { PCI_DEVICE(ZXDH_PF_VENDOR_ID, ZXDH_VF_DPUB_RDMA_DEVICE_ID), 0 }, + { PCI_DEVICE(ZXDH_PF_VENDOR_ID, ZXDH_UPF_PF_I512_DEVICE_ID), 0 }, + { PCI_DEVICE(ZXDH_PF_VENDOR_ID, ZXDH_UPF_VF_I512_DEVICE_ID), 0 }, + { PCI_DEVICE(ZXDH_PF_VENDOR_ID, ZXDH_INICA_RDMA_PF_DEVICE_ID), 0 }, + { PCI_DEVICE(ZXDH_PF_VENDOR_ID, ZXDH_INICA_RDMA_VF_DEVICE_ID), 0 }, + { 0, } +}; + +MODULE_DEVICE_TABLE(pci, dh_pf_pci_table); + +extern struct devlink_ops dh_pf_devlink_ops; +extern struct dh_core_devlink_ops dh_pf_core_devlink_ops; + +#ifdef PTP_DRIVER_INTERFACE_EN +int zxdh_ptp_init(struct dh_core_dev *zxdev); +void zxdh_ptp_stop(struct dh_core_dev *zxdev); +#endif + +int32_t dh_pf_pci_init(struct dh_core_dev *dev) +{ + int32_t ret = 0; + struct zxdh_pf_device *pf_dev = NULL; + + pci_set_drvdata(dev->pdev, dev); + + ret = pci_enable_device(dev->pdev); + if (ret != 0) + { + LOG_ERR("pci_enable_device failed: %d\n", ret); + return -ENOMEM; + } + + ret = dma_set_mask_and_coherent(dev->device, DMA_BIT_MASK(64)); + if (ret != 0) + { + ret = dma_set_mask_and_coherent(dev->device, DMA_BIT_MASK(32)); + if (ret != 0) + { + LOG_ERR("dma_set_mask_and_coherent failed: %d\n", ret); + goto err_pci; + } + } + + ret = pci_request_selected_regions(dev->pdev, pci_select_bars(dev->pdev, IORESOURCE_MEM), "dh-pf"); + if (ret != 0) + { + LOG_ERR("pci_request_selected_regions failed: %d\n", ret); + goto err_pci; + } + + pci_enable_pcie_error_reporting(dev->pdev); + pci_set_master(dev->pdev); + ret = pci_save_state(dev->pdev); + if (ret != 0) + { + LOG_ERR("pci_save_state failed: %d\n", ret); + goto err_pci_save_state; + } + + pf_dev = dh_core_priv(dev); + pf_dev->pci_ioremap_addr[0] = (uint64_t)ioremap(pci_resource_start(dev->pdev, 0), pci_resource_len(dev->pdev, 0)); + if (pf_dev->pci_ioremap_addr[0] == 0) + { + ret = -1; + LOG_ERR("ioremap(0x%llx, 0x%llx) failed\n", pci_resource_start(dev->pdev, 0), pci_resource_len(dev->pdev, 0)); + goto err_pci_save_state; + } + + return 0; + +err_pci_save_state: + pci_disable_pcie_error_reporting(dev->pdev); + pci_release_selected_regions(dev->pdev, pci_select_bars(dev->pdev, IORESOURCE_MEM)); +err_pci: + pci_disable_device(dev->pdev); + return ret; +} + +void dh_pf_pci_close(struct dh_core_dev *dev) +{ + struct zxdh_pf_device *pf_dev = NULL; + + pf_dev = dh_core_priv(dev); + iounmap((void *)pf_dev->pci_ioremap_addr[0]); + pci_disable_pcie_error_reporting(dev->pdev); + pci_release_selected_regions(dev->pdev, pci_select_bars(dev->pdev, IORESOURCE_MEM)); + pci_disable_device(dev->pdev); + + return; +} + +int32_t zxdh_pf_pci_find_capability(struct pci_dev *pdev, uint8_t cfg_type, uint32_t ioresource_types, int32_t *bars) +{ + int32_t pos = 0; + uint8_t type = 0; + uint8_t bar = 0; + + for (pos = pci_find_capability(pdev, PCI_CAP_ID_VNDR); pos > 0; pos = pci_find_next_capability(pdev, pos, PCI_CAP_ID_VNDR)) + { + pci_read_config_byte(pdev, pos + offsetof(struct zxdh_pf_pci_cap, cfg_type), &type); + pci_read_config_byte(pdev, pos + offsetof(struct zxdh_pf_pci_cap, bar), &bar); + + /* ignore structures with reserved BAR values */ + if (bar > ZXDH_PF_MAX_BAR_VAL) + { + continue; + } + + if (type == cfg_type) + { + if (pci_resource_len(pdev, bar) && pci_resource_flags(pdev, bar) & ioresource_types) + { + *bars |= (1 << bar); + return pos; + } + } + } + + return 0; +} + +void __iomem *zxdh_pf_map_capability(struct dh_core_dev *dh_dev, int32_t off, + size_t minlen, uint32_t align, uint32_t start, + uint32_t size, size_t *len, resource_size_t *pa) +{ + struct pci_dev *pdev = dh_dev->pdev; + uint8_t bar = 0; + uint32_t offset = 0; + uint32_t length = 0; + void __iomem *p = NULL; + + pci_read_config_byte(pdev, off + offsetof(struct zxdh_pf_pci_cap, bar), &bar); + pci_read_config_dword(pdev, off + offsetof(struct zxdh_pf_pci_cap, offset), &offset); + pci_read_config_dword(pdev, off + offsetof(struct zxdh_pf_pci_cap, length), &length); + + if (length <= start) + { + LOG_ERR("bad capability len %u (>%u expected)\n", length, start); + return NULL; + } + + if (length - start < minlen) + { + LOG_ERR("bad capability len %u (>=%zu expected)\n", length, minlen); + return NULL; + } + + length -= start; + if (start + offset < offset) + { + LOG_ERR("map wrap-around %u+%u\n", start, offset); + return NULL; + } + + offset += start; + if (offset & (align - 1)) + { + LOG_ERR("offset %u not aligned to %u\n", offset, align); + return NULL; + } + + if (length > size) + { + length = size; + } + + if (len) + { + *len = length; + } + + if (minlen + offset < minlen || minlen + offset > pci_resource_len(pdev, bar)) + { + LOG_ERR("map custom queue %zu@%u " "out of range on bar %i length %lu\n", + minlen, offset, bar, (unsigned long)pci_resource_len(pdev, bar)); + return NULL; + } + + p = pci_iomap_range(pdev, bar, offset, length); + if (unlikely(p == NULL)) + { + LOG_ERR("unable to map custom queue %u@%u on bar %i\n", length, offset, bar); + } + else if (pa) + { + *pa = pci_resource_start(pdev, bar) + offset; + } + + return p; +} + +int32_t zxdh_pf_common_cfg_init(struct dh_core_dev *dh_dev) +{ + int32_t common = 0; + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + struct pci_dev *pdev = dh_dev->pdev; + + /* check for a common config: if not, use legacy mode (bar 0). */ + common = zxdh_pf_pci_find_capability(pdev, ZXDH_PCI_CAP_COMMON_CFG, IORESOURCE_IO | IORESOURCE_MEM, &pf_dev->modern_bars); + if (common == 0) + { + LOG_ERR("missing capabilities %i, leaving for legacy driver\n", common); + return -ENODEV; + } + + pf_dev->common = zxdh_pf_map_capability(dh_dev, common, + sizeof(struct zxdh_pf_pci_common_cfg), ZXDH_PF_ALIGN4, 0, + sizeof(struct zxdh_pf_pci_common_cfg), NULL, NULL); + if (unlikely(pf_dev->common == NULL)) + { + LOG_ERR("pf_dev->common is null\n"); + return -EINVAL; + } + + return 0; +} + +int32_t zxdh_pf_notify_cfg_init(struct dh_core_dev *dh_dev) +{ + int32_t notify = 0; + uint32_t notify_length = 0; + uint32_t notify_offset = 0; + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + struct pci_dev *pdev = dh_dev->pdev; + + /* If common is there, these should be too... */ + notify = zxdh_pf_pci_find_capability(pdev, ZXDH_PCI_CAP_NOTIFY_CFG, IORESOURCE_IO | IORESOURCE_MEM, &pf_dev->modern_bars); + if (notify == 0) + { + LOG_ERR("missing capabilities %i\n", notify); + return -EINVAL; + } + + pci_read_config_dword(pdev, notify + offsetof(struct zxdh_pf_pci_notify_cap, notify_off_multiplier), &pf_dev->notify_offset_multiplier); + pci_read_config_dword(pdev, notify + offsetof(struct zxdh_pf_pci_notify_cap, cap.length), ¬ify_length); + pci_read_config_dword(pdev, notify + offsetof(struct zxdh_pf_pci_notify_cap, cap.offset), ¬ify_offset); + + /* We don't know how many VQs we'll map, ahead of the time. + * If notify length is small, map it all now. Otherwise, map each VQ individually later. */ + if ((uint64_t)notify_length + (notify_offset % PAGE_SIZE) <= PAGE_SIZE) + { + pf_dev->notify_base = zxdh_pf_map_capability(dh_dev, notify, ZXDH_PF_MAP_MINLEN2, ZXDH_PF_ALIGN2, + 0, notify_length, &pf_dev->notify_len, &pf_dev->notify_pa); + if (unlikely(pf_dev->notify_base == NULL)) + { + LOG_ERR("pf_dev->notify_base is null\n"); + return -EINVAL; + } + } + else + { + pf_dev->notify_map_cap = notify; + } + + return 0; +} + +int32_t zxdh_pf_device_cfg_init(struct dh_core_dev *dh_dev) +{ + int32_t device = 0; + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + struct pci_dev *pdev = dh_dev->pdev; + + /* Device capability is only mandatory for devices that have device-specific configuration. */ + device = zxdh_pf_pci_find_capability(pdev, ZXDH_PCI_CAP_DEVICE_CFG, IORESOURCE_IO | IORESOURCE_MEM, &pf_dev->modern_bars); + + /* we don't know how much we should map, but PAGE_SIZE is more than enough for all existing devices. */ + if (device) + { + pf_dev->device = zxdh_pf_map_capability(dh_dev, device, 0, ZXDH_PF_ALIGN4, 0, PAGE_SIZE, &pf_dev->device_len, NULL); + if (unlikely(pf_dev->device == NULL)) + { + LOG_ERR("pf_dev->device is null\n"); + return -EINVAL; + } + } + return 0; +} + +void zxdh_pf_modern_cfg_uninit(struct dh_core_dev *dh_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + struct pci_dev *pdev = dh_dev->pdev; + + if (pf_dev->device) + { + pci_iounmap(pdev, pf_dev->device); + } + if (pf_dev->notify_base) + { + pci_iounmap(pdev, pf_dev->notify_base); + } + pci_iounmap(pdev, pf_dev->common); +} + +int32_t zxdh_pf_modern_cfg_init(struct dh_core_dev *dh_dev) +{ + int32_t ret = 0; + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + struct pci_dev *pdev = dh_dev->pdev; + + ret = zxdh_pf_common_cfg_init(dh_dev); + if (ret != 0) + { + LOG_ERR("zxdh_pf_common_cfg_init failed: %d\n", ret); + return -EINVAL; + } + + ret = zxdh_pf_notify_cfg_init(dh_dev); + if (ret != 0) + { + LOG_ERR("zxdh_pf_notify_cfg_init failed: %d\n", ret); + goto err_map_notify; + } + + ret = zxdh_pf_device_cfg_init(dh_dev); + if (ret != 0) + { + LOG_ERR("zxdh_pf_device_cfg_init failed: %d\n", ret); + goto err_map_device; + } + + return 0; + +err_map_device: + if (pf_dev->notify_base) + { + pci_iounmap(pdev, pf_dev->notify_base); + } +err_map_notify: + pci_iounmap(pdev, pf_dev->common); + return -EINVAL; +} + +uint16_t zxdh_pf_get_queue_notify_off(struct dh_core_dev *dh_dev, uint16_t index) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + iowrite16(index, &pf_dev->common->queue_select); + + return ioread16(&pf_dev->common->queue_notify_off); +} + +void __iomem * zxdh_pf_map_vq_notify(struct dh_core_dev *dh_dev, uint32_t index, resource_size_t *pa) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + uint16_t off = 0; + + off = zxdh_pf_get_queue_notify_off(dh_dev, index); + + if (pf_dev->notify_base) + { + /* offset should not wrap */ + if ((uint64_t)off * pf_dev->notify_offset_multiplier + 2 > pf_dev->notify_len) + { + LOG_ERR("bad notification offset %u (x %u) " "for queue %u > %zd", + off, pf_dev->notify_offset_multiplier, index, pf_dev->notify_len); + return NULL; + } + + if (pa) + { + *pa = pf_dev->notify_pa + off * pf_dev->notify_offset_multiplier; + } + + return pf_dev->notify_base + off * pf_dev->notify_offset_multiplier; + } + else + { + return zxdh_pf_map_capability(dh_dev, pf_dev->notify_map_cap, 2, 2, + off * pf_dev->notify_offset_multiplier, 2, NULL, pa); + } +} + +void zxdh_pf_unmap_vq_notify(struct dh_core_dev *dh_dev, void *priv) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + if (!pf_dev->notify_base) + { + pci_iounmap(dh_dev->pdev, priv); + } +} + +void zxdh_pf_set_status(struct dh_core_dev *dh_dev, uint8_t status) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + iowrite8(status, &pf_dev->common->device_status); + + return; +} + +uint8_t zxdh_pf_get_status(struct dh_core_dev *dh_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + return ioread8(&pf_dev->common->device_status); +} + +void zxdh_pf_get_vf_mac(struct dh_core_dev *dh_dev, uint8_t *mac, int32_t vf_id) +{ + uint32_t DEV_MAC_L = 0; + uint16_t DEV_MAC_H = 0; + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + DEV_MAC_L = ioread32((const void __iomem *)(pf_dev->pf_sriov_cap_base + (pf_dev->sriov_bar_size) * vf_id + ZXDH_DEV_MAC_LOW_OFFSET)); + mac[0] = DEV_MAC_L & 0xff; + mac[1] = (DEV_MAC_L >> 8) & 0xff; + mac[2] = (DEV_MAC_L >> 16) & 0xff; + mac[3] = (DEV_MAC_L >> 24) & 0xff; + DEV_MAC_H = ioread16((const void __iomem *)(pf_dev->pf_sriov_cap_base + (pf_dev->sriov_bar_size) * vf_id + ZXDH_DEV_MAC_HIGH_OFFSET)); + mac[4] = DEV_MAC_H & 0xff; + mac[5] = (DEV_MAC_H >> 8) & 0xff; + return; +} + +void zxdh_pf_set_vf_mac(struct dh_core_dev *dh_dev, uint8_t *mac, int32_t vf_id) +{ + uint32_t DEV_MAC_L = 0; + uint16_t DEV_MAC_H = 0; + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + DEV_MAC_L = mac[0] | (mac[1] << 8) | (mac[2] << 16) | (mac[3] << 24); + DEV_MAC_H = mac[4] | (mac[5] << 8); + iowrite32(DEV_MAC_L, (void __iomem *)(pf_dev->pf_sriov_cap_base + (pf_dev->sriov_bar_size) * vf_id + ZXDH_DEV_MAC_LOW_OFFSET)); + iowrite16(DEV_MAC_H, (void __iomem *)(pf_dev->pf_sriov_cap_base + (pf_dev->sriov_bar_size) * vf_id + ZXDH_DEV_MAC_HIGH_OFFSET)); + return; +} + +void zxdh_set_mac(struct dh_core_dev *dh_dev, uint8_t *mac) +{ + uint32_t DEV_MAC_L = 0; + uint16_t DEV_MAC_H = 0; + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + DEV_MAC_L = mac[0] | (mac[1] << 8) | (mac[2] << 16) | (mac[3] << 24); + DEV_MAC_H = mac[4] | (mac[5] << 8); + iowrite32(DEV_MAC_L, (void __iomem *)(pf_dev->pci_ioremap_addr[0] + ZXDH_DEV_MAC_LOW_OFFSET)); + iowrite16(DEV_MAC_H, (void __iomem *)(pf_dev->pci_ioremap_addr[0] + ZXDH_DEV_MAC_HIGH_OFFSET)); + return; +} + +void zxdh_get_mac(struct dh_core_dev *dh_dev, uint8_t *mac) +{ + uint32_t DEV_MAC_L = 0; + uint16_t DEV_MAC_H = 0; + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + DEV_MAC_L = ioread32((void __iomem *)(pf_dev->pci_ioremap_addr[0] + ZXDH_DEV_MAC_LOW_OFFSET)); + mac[0] = DEV_MAC_L & 0xff; + mac[1] = (DEV_MAC_L >> 8) & 0xff; + mac[2] = (DEV_MAC_L >> 16) & 0xff; + mac[3] = (DEV_MAC_L >> 24) & 0xff; + DEV_MAC_H = ioread16((void __iomem *)(pf_dev->pci_ioremap_addr[0] + ZXDH_DEV_MAC_HIGH_OFFSET)); + mac[4] = DEV_MAC_H & 0xff; + mac[5] = (DEV_MAC_H >> 8) & 0xff; + return; +} + +uint64_t zxdh_pf_get_features(struct dh_core_dev *dh_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + uint64_t device_feature = 0; + + iowrite32(0, &pf_dev->common->device_feature_select); + device_feature = ioread32(&pf_dev->common->device_feature); + iowrite32(1, &pf_dev->common->device_feature_select); + device_feature |= ((uint64_t)ioread32(&pf_dev->common->device_feature) << 32); + + return device_feature; +} + +void zxdh_pf_set_features(struct dh_core_dev *dh_dev, uint64_t features) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + iowrite32(0, &pf_dev->common->guest_feature_select); + iowrite32((uint32_t)features, &pf_dev->common->guest_feature); + iowrite32(1, &pf_dev->common->guest_feature_select); + iowrite32(features >> 32, &pf_dev->common->guest_feature); + + return; +} + +void zxdh_pf_set_queue_enable(struct dh_core_dev *dh_dev, uint16_t index, bool enable) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + iowrite16(index, &pf_dev->common->queue_select); + iowrite16(enable, &pf_dev->common->queue_enable); +} + +uint32_t zxdh_pf_get_epbdf(struct dh_core_dev *dh_dev) +{ + struct pci_dev *pdev = dh_dev->pdev; + uint32_t domain = 0; + uint32_t bus = 0; + uint32_t devid = 0; + uint32_t function = 0; + uint32_t epbdf = 0; + + if (pdev == NULL) + { + LOG_ERR("err: pdev null, return epbdf data 0.\n"); + return 0; + } + + if(sscanf(pci_name(pdev), "%x:%x:%x.%u", &domain, &bus, &devid, &function) != 4) + { + LOG_ERR("failed to get pcie bus-info\n"); + return 0; + } + epbdf = BDF_ECAM(bus, devid, function); + + return epbdf; +} + +int zxdh_pf_get_pannel_port_num(struct dh_core_dev *dh_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + return pf_dev->pannel_port_num; +} + +uint16_t zxdh_pf_get_vport(struct dh_core_dev *dh_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + return pf_dev->vport; +} + +enum dh_coredev_type zxdh_pf_get_coredev_type(struct dh_core_dev *dh_dev) +{ + return dh_dev->coredev_type; +} + +uint16_t zxdh_pf_get_pcie_id(struct dh_core_dev *dh_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + return pf_dev->pcie_id; +} + +uint16_t zxdh_pf_get_slot_id(struct dh_core_dev *dh_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + return pf_dev->slot_id; +} + +bool zxdh_pf_is_bond(struct dh_core_dev *dh_dev) +{ + bool flags = false; + + if (!dh_core_is_pf(dh_dev)) + { + return false; + } + + if ((dh_dev->pdev->device == ZXDH_INICA_BOND_DEVICE_ID) + || (dh_dev->pdev->device == ZXDH_INICB_BOND_DEVICE_ID) + || (dh_dev->pdev->device == ZXDH_INICA_UPF_BOND_DEVICE_ID) + || (dh_dev->pdev->device == ZXDH_DPUA_BOND_DEVICE_ID)) + { + flags = true; + } + + return flags; +} + +bool zxdh_pf_is_upf(struct dh_core_dev *dh_dev) +{ + bool flags = false; + + if ((dh_dev->pdev->device == ZXDH_UPF_PF_I512_DEVICE_ID) + || (dh_dev->pdev->device == ZXDH_UPF_VF_I512_DEVICE_ID)) + { + flags = true; + } + + return flags; +} + +struct zxdh_vf_item *zxdh_pf_get_vf_item(struct dh_core_dev *dh_dev, uint16_t vf_idx) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + if (dh_dev->coredev_type != DH_COREDEV_PF) + { + LOG_ERR("Invalid device\n"); + return ERR_PTR(-EINVAL); + } + + if (vf_idx >= ZXDH_VF_NUM_MAX) + { + LOG_ERR("vf idx(%u) out of range(0~255)\n", vf_idx); + return ERR_PTR(-EINVAL); + } + + if (pf_dev->vf_item == NULL) + { + LOG_ERR("vf_item is NULL\n"); + return ERR_PTR(-EINVAL); + } + + if (!pf_dev->vf_item[vf_idx].enable) + { + LOG_ERR("vf(%u) is disable\n", vf_idx); + return ERR_PTR(-EINVAL); + } + + return &(pf_dev->vf_item[vf_idx]); +} + +int32_t zxdh_pf_dpp_init(struct dh_core_dev *dh_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = pf_dev->slot_id; + pf_info.vport = pf_dev->vport; + return dpp_vport_register(&pf_info, dh_dev->pdev); +} + +int32_t zxdh_pf_dpp_uninit(struct dh_core_dev *dh_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = pf_dev->slot_id; + pf_info.vport = pf_dev->vport; + return dpp_vport_unregister(&pf_info); +} + +void zxdh_pf_ip6mac_lock_init(struct dh_core_dev *dh_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + if (dh_dev->coredev_type == DH_COREDEV_PF) + { + spin_lock_init(&pf_dev->vf_ip6mac_lock); + } +} + +int32_t zxdh_init_ip6mac_tbl(struct dh_core_dev *dh_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + struct zxdh_ipv6_mac_entry *ip6mac_entry_list = NULL; + unsigned int ip6mact_size = DEV_MULTICAST_MAX_NUM; + int i; + + pf_dev->ip6mac_tbl = kvzalloc(struct_size(pf_dev->ip6mac_tbl, hash_list, ip6mact_size), GFP_KERNEL); + if (!pf_dev->ip6mac_tbl) + { + LOG_ERR("kvzalloc ip6mac_tbl failed\n"); + return -ENOMEM; + } + + pf_dev->ip6mac_tbl->ip6mact_size = ip6mact_size; + + INIT_LIST_HEAD(&pf_dev->ip6mac_tbl->ip6mac_free_head); + + rwlock_init(&pf_dev->ip6mac_tbl->lock); + + for (i = 0; i < pf_dev->ip6mac_tbl->ip6mact_size; ++i) + INIT_LIST_HEAD(&pf_dev->ip6mac_tbl->hash_list[i]); + + ip6mac_entry_list = kvcalloc(pf_dev->ip6mac_tbl->ip6mact_size, sizeof(struct zxdh_ipv6_mac_entry), GFP_KERNEL); + if (!ip6mac_entry_list) { + kvfree(pf_dev->ip6mac_tbl); + LOG_ERR("kvcalloc ip6mac_entry_list failed\n"); + return -ENOMEM; + } + pf_dev->ip6mac_tbl->ip6mac_entry_list = (void *)ip6mac_entry_list; + + for (i = 0; i < pf_dev->ip6mac_tbl->ip6mact_size; i++) { + INIT_LIST_HEAD(&ip6mac_entry_list[i].list); + list_add_tail(&ip6mac_entry_list[i].list, &pf_dev->ip6mac_tbl->ip6mac_free_head); + } + + return 0; +} + +void zxdh_cleanup_ip6mac_tbl(struct dh_core_dev *dh_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + struct zxdh_ipv6_mac_tbl *ip6mac_tbl = pf_dev->ip6mac_tbl; + + if (ip6mac_tbl) + { + if (ip6mac_tbl->ip6mac_entry_list) + { + kvfree(ip6mac_tbl->ip6mac_entry_list); + ip6mac_tbl->ip6mac_entry_list = NULL; + } + kvfree(ip6mac_tbl); + pf_dev->ip6mac_tbl = NULL; + } +} + +void zxdh_pf_initialized_init(struct dh_core_dev *dh_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + pf_dev->initialized_flags = 0; + spin_lock_init(&pf_dev->initialized_lock); +} + +void zxdh_pf_initialized_uninit(struct dh_core_dev *dh_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + pf_dev->initialized_flags = 0; +} + +struct pci_dev *zxdh_pf_get_pdev(struct dh_core_dev *dh_dev) +{ + return dh_dev->pdev; +} + +uint64_t zxdh_pf_get_bar_virt_addr(struct dh_core_dev *dh_dev, uint8_t bar_num) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + return pf_dev->pci_ioremap_addr[bar_num]; +} + +int32_t zxdh_pf_msg_send_cmd(struct dh_core_dev *dh_dev, uint16_t module_id, void *msg, void *ack, bool is_sync) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + zxdh_reps_info *reps = (zxdh_reps_info *)(ack); + uint64_t vaddr = 0; + int32_t err = 0; + + vaddr = (uint64_t)ZXDH_BAR_MSG_BASE(pf_dev->pci_ioremap_addr[0]); + + err = zxdh_send_command(vaddr, pf_dev->pcie_id, module_id, msg, ack, TRUE); + if (err != 0) + { + LOG_ERR("zxdh_send_command failed, err=%d\n", err); + return -1; + } + + if (reps->flag != ZXDH_REPS_SUCC) + { + LOG_ERR("failed reps->flag: 0x%x\n", reps->flag); + return -1; + } + + return err; +} + +int32_t zxdh_pf_query_port(struct dh_core_dev *dh_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + struct port_message_recv recv = {0}; + struct port_message_recv *recv_data = &recv; + struct zxdh_port_msg msg = {0}; + struct zxdh_port_msg *payload = &msg; + struct zxdh_pannle_port *pnlport, *recvport; + int32_t ret = 0, idx = 0; + + payload->pcie_id = zxdh_pf_get_pcie_id(dh_dev); + + ret = zxdh_pf_msg_send_cmd(dh_dev, MODULE_PHYPORT_QUERY, payload, recv_data, true); + if (ret != 0) + { + LOG_ERR("zxdh_pf_query_port send message failed \n"); + goto out; + } + + pf_dev->port_resource.pannel_num = recv_data->port_num; + + LOG_INFO("zxdh query port num: %u\n", (uint32_t)recv_data->port_num); + for (idx = 0; idx < recv_data->port_num; idx++) + { + if (idx >= ZXDH_PANNEL_PORT_MAX) + { + LOG_ERR("query port num from fw out of range. \n"); + continue; + } + + pnlport = &pf_dev->port_resource.port[idx]; + recvport = (struct zxdh_pannle_port *)((uint8_t *)&recv_data->data[idx]); + + pnlport->phyport = recvport->phyport; + pnlport->pannel_id = recvport->pannel_id; + pnlport->link_check_bit = recvport->link_check_bit; + pnlport->flags = 0; + + LOG_INFO("[%d] pannel %u, phyport %u link check bit %u\n", idx, + (uint32_t)pnlport->pannel_id, (uint32_t)pnlport->phyport, (uint32_t)pnlport->link_check_bit); + } + +out: + return ret; +} + +int32_t zxdh_pf_query_fwinfo(struct dh_core_dev *dh_dev) +{ + int32_t ret = 0; + + ret = zxdh_pf_query_port(dh_dev); + if (ret != 0) + { + return ret; + } + + return 0; +} + +uint16_t zxdh_pf_get_queue_num(struct dh_core_dev *dh_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + uint16_t qnum = 0; + + qnum = ioread16(&pf_dev->common->num_queues); + + return qnum; +} + +uint16_t zxdh_pf_get_queue_size(struct dh_core_dev *dh_dev, uint16_t index) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + uint16_t queue_size = 0; + + iowrite16(index, &pf_dev->common->queue_select); + queue_size = ioread16(&pf_dev->common->queue_size); + + return queue_size; +} + +uint16_t zxdh_pf_get_queue_vector(struct dh_core_dev *dh_dev, uint16_t channel, struct list_head * eqs_list, uint16_t queue_index) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + struct zxdh_pf_pci_common_cfg __iomem *cfg = pf_dev->common; + struct dh_eq_vqs *eq_vqs = NULL; + struct dh_eq_vqs *n; + int32_t i = 0; + int32_t msix_vec = ZXDH_MSI_NO_VECTOR; + + iowrite16(queue_index, &cfg->queue_select); + + list_for_each_entry_safe(eq_vqs, n, eqs_list, list) + { + if (i++ == channel) + { + iowrite16(eq_vqs->vq_s.core.irq->index, &cfg->queue_msix_vector); + break; + } + } + + msix_vec = ioread16(&cfg->queue_msix_vector); + + /* Flush the write out to device */ + return msix_vec; +} + +void zxdh_pf_release_queue_vector(struct dh_core_dev *dh_dev, int32_t queue_index) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + struct zxdh_pf_pci_common_cfg __iomem *cfg = pf_dev->common; + + iowrite16(queue_index, &cfg->queue_select); + iowrite16(ZXDH_MSI_NO_VECTOR, &cfg->queue_msix_vector); +} + +void zxdh_pf_set_queue_size(struct dh_core_dev *dh_dev, uint32_t index, uint16_t size) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + iowrite16(index, &pf_dev->common->queue_select); + iowrite16(size, &pf_dev->common->queue_size); +} + +void zxdh_pf_set_queue_address(struct dh_core_dev *dh_dev, uint32_t index, + uint64_t desc_addr, uint64_t driver_addr, uint64_t device_addr) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + iowrite16(index, &pf_dev->common->queue_select); + iowrite32((uint32_t)desc_addr, &pf_dev->common->queue_desc_lo); + iowrite32(desc_addr>>32, &pf_dev->common->queue_desc_hi); + iowrite32((uint32_t)driver_addr, &pf_dev->common->queue_avail_lo); + iowrite32(driver_addr>>32, &pf_dev->common->queue_avail_hi); + iowrite32((uint32_t)device_addr, &pf_dev->common->queue_used_lo); + iowrite32(device_addr>>32, &pf_dev->common->queue_used_hi); +} + +int32_t zxdh_pf_get_vq_lock(struct dh_core_dev *dh_dev) +{ + int32_t i = 0; + int32_t val = 0; + int32_t wait_time = ZXDH_PF_WAIT_COUNT; + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + for (i = 0; i < wait_time; i++) + { + val = ioread32((const void __iomem *)(pf_dev->pci_ioremap_addr[0] + VQM_HOST_BAR_OFFSET + LOCK_VQ_REG_OFFSET)); + udelay(ZXDH_PF_DELAY_US); + if (val & ZXDH_PF_LOCK_ENABLE_MASK) + { + break; + } + } + + if ((val & ZXDH_PF_LOCK_ENABLE_MASK) == 0) + { + LOG_INFO("get phy vq_id is busy\n"); + return -1; + } + + return 0; +} + +int32_t zxdh_pf_release_vq_lock(struct dh_core_dev *dh_dev) +{ + int32_t val = 0; + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + val = ioread32((const void __iomem *)(pf_dev->pci_ioremap_addr[0] + VQM_HOST_BAR_OFFSET + LOCK_VQ_REG_OFFSET)); + if (val & ZXDH_PF_LOCK_ENABLE_MASK) + { + iowrite32(ZXDH_PF_RELEASE_LOCK_VAL, (void __iomem *)(pf_dev->pci_ioremap_addr[0] + VQM_HOST_BAR_OFFSET + LOCK_VQ_REG_OFFSET)); + return 0; + } + else + { + LOG_INFO("no lock need to be released\n"); + return -1; + } +} + +int32_t zxdh_pf_get_phy_vq(struct dh_core_dev *dh_dev, uint16_t index) +{ + int32_t phy_vq_reg = 0; + int32_t vq_reg_num = ZXDH_MAX_QUEUES_NUM / ZXDH_PHY_REG_BITS; + uint32_t val = 0; + uint32_t done = 0; + uint8_t queue_type = 0; + int32_t j = 0; + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + int32_t phy_index = 0; + + for (phy_vq_reg = 0; phy_vq_reg < vq_reg_num; phy_vq_reg++) + { + val = ioread32((const void __iomem *)(pf_dev->pci_ioremap_addr[0] + PHY_VQ_REG_OFFSET + phy_vq_reg * 4)); + + if (index % ZXDH_PF_POWER_INDEX2 == 0) + { + queue_type = ZXDH_PF_RQ_TYPE; + } + else + { + queue_type = ZXDH_PF_TQ_TYPE; + } + + for (j = queue_type; j < ZXDH_PHY_REG_BITS; j = j + ZXDH_PF_POWER_INDEX2) + { + if ((val & (ZXDH_PF_GET_PHY_INDEX_BIT << j)) == 0) + { + val |= (ZXDH_PF_GET_PHY_INDEX_BIT << j); + iowrite32(val, (void __iomem *)(pf_dev->pci_ioremap_addr[0] + PHY_VQ_REG_OFFSET + phy_vq_reg * 4)); + phy_index = phy_vq_reg * ZXDH_PHY_REG_BITS + j; + done = ZXDH_PF_GET_PHY_INDEX_DONE; + break; + } + } + + if (done == ZXDH_PF_GET_PHY_INDEX_DONE) + { + return phy_index; + } + } + + LOG_INFO("no availd phy_index\n"); + + return -1; +} + +int32_t zxdh_pf_release_phy_vq(struct dh_core_dev *dh_dev, uint32_t *phy_index, uint16_t total_qnum) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + uint16_t lch = 0; + uint16_t widx = 0; + uint16_t bidx = 0; + uint32_t val = 0; + + for (lch = 0; lch < total_qnum; lch++) + { + if (phy_index[lch] >= ZXDH_MAX_QUEUES_NUM) + { + continue; + } + + widx = phy_index[lch] / 32; //4byte -> 32bits + bidx = phy_index[lch] % 32; + + udelay(ZXDH_PF_DELAY_US); + val = ioread32((const void __iomem *)(pf_dev->pci_ioremap_addr[0] + PHY_VQ_REG_OFFSET + widx * 4)); + val &= ~(1 << bidx); + iowrite32(val, (void __iomem *)(pf_dev->pci_ioremap_addr[0] + PHY_VQ_REG_OFFSET + widx * 4)); + } + + return 0; +} + + +void zxdh_pf_update_link_info(struct dh_core_dev *dh_dev, struct link_info_struct *link_info_val) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + if(pf_dev->link_up && link_info_val->speed == SPEED_UNKNOWN) + { + LOG_INFO("pf_dev->link_up is %d and link_info_val->speed is %d, can't update pf info\n",pf_dev->link_up ,link_info_val->speed); + return; + } + pf_dev->speed = link_info_val->speed; + pf_dev->autoneg_enable = link_info_val->autoneg_enable; + pf_dev->supported_speed_modes = link_info_val->supported_speed_modes; + pf_dev->advertising_speed_modes = link_info_val->advertising_speed_modes; + pf_dev->duplex = link_info_val->duplex; +} + +int32_t zxdh_pf_get_drv_msg(struct dh_core_dev *dh_dev, uint8_t *drv_version, uint8_t *drv_version_len) +{ + *drv_version_len = sizeof(zxdh_pf_driver_version); + memcpy(drv_version, zxdh_pf_driver_version, *drv_version_len); + return 0; +} + +void zxdh_pf_set_vepa(struct dh_core_dev *dh_dev, bool setting) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + pf_dev->vepa = setting; +} + +bool zxdh_pf_get_vepa(struct dh_core_dev *dh_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + return pf_dev->vepa; +} + +int32_t zxdh_pf_request_port(struct dh_core_dev *dh_dev, void *data) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + uint8_t port_num = pf_dev->port_resource.pannel_num; + struct zxdh_pannle_port *port; + struct zxdh_pannle_port *req_data = (struct zxdh_pannle_port *)data; + int32_t idx = 0; + + for (idx = 0; idx < port_num; idx++) + { + port = &pf_dev->port_resource.port[idx]; + if (!(port->flags & PORT_FLAGS_ALLOC_STAT)) + { + req_data->phyport = port->phyport; + req_data->pannel_id = port->pannel_id; + req_data->link_check_bit = port->link_check_bit; + port->flags |= PORT_FLAGS_ALLOC_STAT; + break; + } + } + + if (idx == port_num) + { + LOG_ERR("failed to obtain the panel information from the riscv, or this part is not released when the aux is removed\n"); + return -1; + } + + return 0; +} + +int32_t zxdh_pf_release_port(struct dh_core_dev *dh_dev, uint32_t pnl_id) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + uint8_t port_num = pf_dev->port_resource.pannel_num; + struct zxdh_pannle_port *port; + int32_t idx = 0; + + for (idx = 0; idx < port_num; idx++) + { + port = &pf_dev->port_resource.port[idx]; + if (pnl_id == port->pannel_id) + { + port->flags &= ~PORT_FLAGS_ALLOC_STAT; + break; + } + } + + return 0; +} + +void zxdh_pf_set_bond_num(struct dh_core_dev *dh_dev, bool add) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + if (add) + { + pf_dev->bond_num++; + } + else + { + pf_dev->bond_num--; + } +} + +bool zxdh_pf_if_init(struct dh_core_dev *dh_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + if (pf_dev->bond_num == 0) + { + return true; + } + + return false; +} + +void zxdh_pf_set_init_comp_flag(struct dh_core_dev *dh_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + pf_dev->aux_comp_flag = ZXDH_AUX_COMP_FLAG; + return; +} + +struct zxdh_ipv6_mac_tbl * zxdh_pf_get_ip6mac_tbl(struct dh_core_dev *dh_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + return pf_dev->ip6mac_tbl; +} + +struct zxdh_en_sf_if en_sf_ops = +{ + .en_sf_map_vq_notify = zxdh_pf_map_vq_notify, + .en_sf_unmap_vq_notify = zxdh_pf_unmap_vq_notify, + .en_sf_set_status = zxdh_pf_set_status, + .en_sf_get_status = zxdh_pf_get_status, + .en_sf_get_features = zxdh_pf_get_features, + .en_sf_set_features = zxdh_pf_set_features, + .en_sf_set_vf_mac = zxdh_pf_set_vf_mac, + .en_sf_get_vf_mac = zxdh_pf_get_vf_mac, + .en_sf_set_mac = zxdh_set_mac, + .en_sf_get_mac = zxdh_get_mac, + .en_sf_set_queue_enable = zxdh_pf_set_queue_enable, + .en_sf_get_channels_num = zxdh_pf_get_vqs_channels_num, + .en_sf_get_queue_num = zxdh_pf_get_queue_num, + .en_sf_get_queue_size = zxdh_pf_get_queue_size, + .en_sf_get_queue_vector = zxdh_pf_get_queue_vector, + .en_sf_release_queue_vector = zxdh_pf_release_queue_vector, + .en_sf_set_queue_size = zxdh_pf_set_queue_size, + .en_sf_set_queue_address = zxdh_pf_set_queue_address, + .en_sf_vq_irqs_request = zxdh_pf_vq_irqs_request, + .en_sf_affinity_irqs_release = zxdh_pf_affinity_irqs_release, + .en_sf_switch_irq = zxdh_pf_switch_irq, + .en_sf_get_vq_lock = zxdh_pf_get_vq_lock, + .en_sf_release_vq_lock = zxdh_pf_release_vq_lock, + .en_sf_get_phy_vq = zxdh_pf_get_phy_vq, + .en_sf_release_phy_vq = zxdh_pf_release_phy_vq, + .en_sf_get_epbdf = zxdh_pf_get_epbdf, + .en_sf_get_vport = zxdh_pf_get_vport, + .en_sf_get_coredev_type = zxdh_pf_get_coredev_type, + .en_sf_get_pcie_id = zxdh_pf_get_pcie_id, + .en_sf_get_slot_id = zxdh_pf_get_slot_id, + .en_sf_is_bond = zxdh_pf_is_bond, + .en_sf_is_upf = zxdh_pf_is_upf, + .en_sf_get_pdev = zxdh_pf_get_pdev, + .en_sf_get_bar_virt_addr = zxdh_pf_get_bar_virt_addr, + .en_sf_msg_send_cmd = zxdh_pf_msg_send_cmd, + .en_sf_async_eq_enable = zxdh_pf_async_eq_enable, + .en_sf_get_vf_item = zxdh_pf_get_vf_item, + .en_sf_set_pf_link_up = zxdh_pf_set_pf_link_up, + .en_sf_get_pf_link_up = zxdh_pf_get_pf_link_up, + .en_sf_update_pf_link_info = zxdh_pf_update_link_info, + .en_sf_get_drv_msg = zxdh_pf_get_drv_msg, + .en_sf_get_vepa = zxdh_pf_get_vepa, + .en_sf_set_vepa = zxdh_pf_set_vepa, + .en_sf_set_bond_num = zxdh_pf_set_bond_num, + .en_sf_if_init = zxdh_pf_if_init, + .en_sf_request_port_info = zxdh_pf_request_port, + .en_sf_release_port_info = zxdh_pf_release_port, + .en_sf_get_link_info_from_vqm = zxdh_pf_get_link_info_from_vqm, + .en_sf_set_vf_link_info = zxdh_pf_set_vf_link_info, + .en_sf_set_pf_phy_port = zxdh_pf_set_pf_phy_port, + .en_sf_get_pf_phy_port = zxdh_pf_get_pf_phy_port, + .en_sf_set_init_comp_flag = zxdh_pf_set_init_comp_flag, + .en_sf_get_ip6mac_tbl = zxdh_pf_get_ip6mac_tbl, +}; + +void zxdh_adev_release(struct device *dev) +{ + +} + +static DEFINE_IDA(zxdh_adev_ida); + +int32_t zxdh_plug_aux_dev(struct dh_core_dev *dh_dev, int32_t idx) +{ + struct zxdh_auxiliary_device *adev = NULL; + struct zxdh_pf_device *pf_dev = NULL; + struct zxdh_en_sf_container *sf_con = NULL; + struct zxdh_pf_adev *pf_adevs_table = NULL; + int32_t ret = 0; + + pf_dev = dh_core_priv(dh_dev); + + if (idx >= pf_dev->adevs_num) + { + return 0; + } + + pf_adevs_table = &pf_dev->adevs_table[idx]; + if (pf_adevs_table->adev != NULL) + { + return 0; + } + + sf_con = kzalloc(sizeof(struct zxdh_en_sf_container), GFP_KERNEL); + + if (unlikely(sf_con == NULL)) + { + LOG_ERR("zxadev kzalloc is null\n"); + return -ENOMEM; + } + + pf_adevs_table->aux_idx = ida_alloc(&zxdh_adev_ida, GFP_KERNEL); + if (pf_adevs_table->aux_idx < 0) + { + LOG_ERR("failed to allocate device id for aux drvs\n"); + goto free_kzalloc; + } + + adev = &sf_con->adev; + + adev->id = pf_adevs_table->aux_idx; + adev->dev.parent = &dh_dev->pdev->dev; + adev->dev.release = zxdh_adev_release; + adev->name = ZXDH_PF_EN_SF_DEV_ID_NAME; + + pf_adevs_table->adev = adev; + sf_con->dh_dev = dh_dev; + sf_con->ops = &en_sf_ops; + + ret = zxdh_auxiliary_device_init(adev); + if (ret != 0) + { + LOG_ERR("zxdh_auxiliary_device_init failed: %d\n", ret); + goto free_ida_alloc; + } + + ret = zxdh_auxiliary_device_add(adev); + if (ret != 0) + { + LOG_ERR("zxdh_auxiliary_device_add failed: %d\n", ret); + goto release_aux_init; + } + + return 0; + +release_aux_init: + zxdh_auxiliary_device_uninit(adev); +free_ida_alloc: + ida_simple_remove(&zxdh_adev_ida, pf_adevs_table->aux_idx); + pf_adevs_table->aux_idx = -1; +free_kzalloc: + kfree(sf_con); + sf_con = NULL; + return ret; +} + +void zxdh_unplug_aux_dev(struct dh_core_dev *dh_dev, int32_t idx) +{ + struct zxdh_pf_device *pf_dev = NULL; + struct zxdh_en_sf_container *sf_con = NULL; + struct zxdh_pf_adev *pf_adevs_table = NULL; + + pf_dev = dh_core_priv(dh_dev); + if (idx >= pf_dev->adevs_num) + { + return; + } + + pf_adevs_table = &pf_dev->adevs_table[idx]; + if (!pf_adevs_table->adev) + { + return; + } + + sf_con = container_of(pf_adevs_table->adev, struct zxdh_en_sf_container, adev); + + zxdh_auxiliary_device_delete(pf_adevs_table->adev); + zxdh_auxiliary_device_uninit(pf_adevs_table->adev); + ida_simple_remove(&zxdh_adev_ida, pf_adevs_table->aux_idx); + pf_adevs_table->aux_idx = -1; + kfree(sf_con); + sf_con = NULL; + + return; +} + +int32_t dh_pf_vf_vport_get(struct dh_core_dev *dev, uint16_t vf_idx, uint16_t *vport) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dev); + uint16_t pcie_id = 0; + struct zxdh_pci_bar_msg in = {0}; + struct zxdh_msg_recviver_mem result = {0}; + uint8_t recv_buf[8] = {0}; + int32_t ret = 0; + + if (vport == NULL) + { + return BAR_MSG_ERR_NULL; + } + + pcie_id = FIND_VF_PCIE_ID(pf_dev->pcie_id, vf_idx); + + in.virt_addr = (uint64_t)ZXDH_BAR_MSG_BASE(pf_dev->pci_ioremap_addr[0]); + in.payload_addr = &pcie_id; + in.payload_len = sizeof(pcie_id); + in.src = MSG_CHAN_END_PF; + in.dst = MSG_CHAN_END_RISC; + in.event_id = MODULE_VPORT_GET; + in.src_pcieid = pf_dev->pcie_id; + + result.recv_buffer = recv_buf; + result.buffer_len = sizeof(recv_buf); + + ret = zxdh_bar_chan_sync_msg_send(&in, &result); + switch (ret) + { + case BAR_MSG_OK: + { + *vport = *(uint16_t *)(recv_buf + 4); + LOG_INFO("pf(0x%x) get vf(%u) vport(0x%x) success\n", pf_dev->pcie_id, vf_idx, *vport); + break; + } + default: + { + LOG_ERR("Failed to pf(0x%x) get vf(%u) vport, ret:%d.\n", pcie_id, vf_idx, ret); + break; + } + } + + return ret; +} + +int32_t dh_pf_vf_item_init(struct dh_core_dev *dev, uint16_t vf_idx) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dev); + struct zxdh_vf_item *vf_item = NULL; + + if (pf_dev->vf_item == NULL) + { + LOG_ERR("vf_item is NULL\n"); + return -EINVAL; + } + vf_item = &pf_dev->vf_item[vf_idx]; + vf_item->link_forced = false; + vf_item->vport = pf_dev->vf_item[0].vport + vf_idx; + vf_item->enable = true; + vf_item->spoofchk = true; + return 0; +} + +int32_t dh_pf_vf_item_uninit(struct dh_core_dev *dev, uint16_t vf_idx) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dev); + struct zxdh_vf_item *vf_item = NULL; + + if (pf_dev->vf_item == NULL) + { + LOG_ERR("vf_item is NULL\n"); + return -EINVAL; + } + vf_item = &pf_dev->vf_item[vf_idx]; + eth_zero_addr(vf_item->mac); + vf_item->pf_set_mac = false; + vf_item->enable = false; + vf_item->vlan = 0; + vf_item->qos = 0; + vf_item->spoofchk = false; + return 0; +} + +int32_t dh_pf_vf_enable(struct dh_core_dev *dev, int32_t num_vfs) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dev); + int32_t vf_idx = 0; + int32_t ret = 0; + + ret = dh_pf_vf_vport_get(dev, 0, &pf_dev->vf_item[0].vport); + if (ret != 0) + { + return ret; + } + + for (vf_idx = 0; vf_idx < num_vfs; vf_idx++) + { + ret = dh_pf_vf_item_init(dev, vf_idx); + if (ret != 0) + { + LOG_ERR("Failed to init vf(%d) item\n", vf_idx); + return ret; + } + } + + return ret; +} + +void dh_pf_vf_disable(struct dh_core_dev *dev, int32_t num_vfs) +{ + int32_t vf_idx = 0; + + for (vf_idx = 0; vf_idx < num_vfs; vf_idx++) + { + dh_pf_vf_item_uninit(dev, vf_idx); + } +} + +int32_t dh_pf_sriov_enable(struct pci_dev *pdev, int32_t num_vfs) +{ + struct dh_core_dev *dev = pci_get_drvdata(pdev); + int32_t pre_existing_vfs = pci_num_vf(pdev); + int32_t ret = 0; + + if ((pre_existing_vfs != 0) && (pre_existing_vfs == num_vfs)) + { + return 0; + } + + ret = dh_pf_vf_enable(dev, num_vfs); + if (ret != 0) + { + LOG_ERR("Failed to enable vf\n"); + return ret; + } + +#ifdef ZXDH_SRIOV_SYSFS_EN + ret = zxdh_create_vfs_sysfs(dev, num_vfs); + if (ret != 0) + { + LOG_ERR("zxdh_create_vfs_sysfs failed : %d\n", ret); + goto err_create_vfs_sysfs; + } +#endif + + ret = pci_enable_sriov(pdev, num_vfs); + if (ret != 0) + { + LOG_ERR("pci_enable_sriov failed : %d\n", ret); + goto err_pci_enable_sriov; + } + + return ret; + +err_pci_enable_sriov: +#ifdef ZXDH_SRIOV_SYSFS_EN + zxdh_sriov_sysfs_exit(dev); +err_create_vfs_sysfs: +#endif + dh_pf_vf_disable(dev, num_vfs); + + return ret; +} + +void dh_pf_sriov_disable(struct pci_dev *pdev) +{ + struct dh_core_dev *dev = pci_get_drvdata(pdev); + int32_t num_vfs = pci_num_vf(pdev); + + pci_disable_sriov(pdev); +#ifdef ZXDH_SRIOV_SYSFS_EN + zxdh_destroy_vfs_sysfs(dev, num_vfs); +#endif + dh_pf_vf_disable(dev, num_vfs); +} + +int32_t dh_pf_vf_item_create(struct dh_core_dev *dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dev); + + if (dev->coredev_type == DH_COREDEV_PF) + { + pf_dev->vf_item = kzalloc(sizeof(struct zxdh_vf_item) * ZXDH_VF_NUM_MAX, GFP_KERNEL); + if (pf_dev->vf_item == NULL) + { + LOG_ERR("pf_dev->vf_item kzalloc failed\n"); + return -ENOMEM; + } + } + + return 0; +} + +void dh_pf_vf_item_destroy(struct dh_core_dev *dev, bool disable_vf) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dev); + + if (dev->coredev_type == DH_COREDEV_PF) + { + if (disable_vf) + { + pci_disable_sriov(dev->pdev); + } + if (pf_dev->vf_item != NULL) + { + kfree(pf_dev->vf_item); + pf_dev->vf_item = NULL; + } + } +} + +int32_t dh_pf_pcie_id_get(struct dh_core_dev *dh_dev) +{ + int32_t pos = 0; + uint8_t type = 0; + uint16_t padding = 0; + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + struct pci_dev *pdev = dh_dev->pdev; + + if (dh_dev->coredev_type == DH_COREDEV_PF) + { + if (pdev->bus == NULL) + { + LOG_ERR("pdev->bus is NULL!\n"); + return -1; + } + pf_dev->slot_id = pdev->bus->number; + LOG_INFO("pf_dev->slot_id: %d\n", pf_dev->slot_id); + } + for (pos = pci_find_capability(pdev, PCI_CAP_ID_VNDR); pos > 0; pos = pci_find_next_capability(pdev, pos, PCI_CAP_ID_VNDR)) + { + pci_read_config_byte(pdev, pos + offsetof(struct zxdh_pf_pci_cap, cfg_type), &type); + + if (type == ZXDH_PCI_CAP_PCI_CFG) + { + pci_read_config_word(pdev, pos + offsetof(struct zxdh_pf_pci_cap, padding[0]), &padding); + pf_dev->pcie_id = padding; + LOG_INFO("pf_dev->pcie_id: 0x%x\n", pf_dev->pcie_id); + return 0; + } + } + + LOG_INFO("the pci_cap that meets the requirements is not matched\n"); + return -1; +} + +static uint64_t pci_size(uint64_t base, uint64_t maxbase, uint64_t mask) +{ + uint64_t size = mask & maxbase; + + if (!size) + return 0; + size = size & ~(size-1); + if (base == maxbase && ((base | (size - 1)) & mask) != mask) + return 0; + return size; +} + +int32_t zxdh_send_pxe_status_to_riscv(struct dh_core_dev *dh_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + zxdh_cfg_np_msg msg = {0}; + uint64_t vaddr = 0; + int32_t err = 0; + + if (dh_dev->coredev_type != DH_COREDEV_PF) + { + return 0; + } + + msg.dev_id = 0; + msg.type = ZXDH_CFG_NPSDK_TYPE; + msg.operate_mode = ZXDH_STOP_PXE_MODE; + + vaddr = (uint64_t)ZXDH_BAR_MSG_BASE(pf_dev->pci_ioremap_addr[0]); + + err = zxdh_send_command(vaddr, pf_dev->pcie_id, MODULE_NPSDK, &msg, &msg, true); + if (err != 0) + { + LOG_ERR("send pxe status to config np failed: %d\n", err); + } + + return err; +} + +int32_t dh_pf_sriov_cap_cfg_init(struct dh_core_dev *dh_dev) +{ + int32_t pos = 0; + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + struct pci_dev *pdev = dh_dev->pdev; + uint32_t bar_address32 = 0; + uint64_t bar_address64 = 0; + uint64_t bar_size64 = 0; + uint32_t bar_size32 = 0; + uint64_t mask64 = 0; + uint32_t mem_type = 0; + uint16_t nr_virtfn = 0; + + if(dh_dev->coredev_type == DH_COREDEV_VF) + { + return 0; + } + + pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_SRIOV); + if (pos == 0) + { + return 0; + } + pci_read_config_word(pdev, pos + PCI_SRIOV_TOTAL_VF, &nr_virtfn); + + if (nr_virtfn == 0) + { + return 0; + } + + pci_read_config_dword(pdev, pos + PCI_SRIOV_BAR, &bar_address32); + pci_write_config_dword(pdev, pos + PCI_SRIOV_BAR, ~0); + pci_read_config_dword(pdev, pos + PCI_SRIOV_BAR, &bar_size32); + pci_write_config_dword(pdev, pos + PCI_SRIOV_BAR, bar_address32); + + bar_size64 = bar_size32 & PCI_BASE_ADDRESS_MEM_MASK; + bar_address64 = bar_address32 & PCI_BASE_ADDRESS_MEM_MASK; + mask64 = (uint32_t)PCI_BASE_ADDRESS_MEM_MASK; + mem_type = bar_address32 & PCI_BASE_ADDRESS_MEM_TYPE_MASK; + + if(mem_type == PCI_BASE_ADDRESS_MEM_TYPE_64) + { + pci_read_config_dword(pdev, pos + PCI_SRIOV_BAR + 4, &bar_address32); + pci_write_config_dword(pdev, pos + PCI_SRIOV_BAR + 4, ~0); + pci_read_config_dword(pdev, pos + PCI_SRIOV_BAR + 4, &bar_size32); + pci_write_config_dword(pdev, pos + PCI_SRIOV_BAR + 4, bar_address32); + + bar_size64 |= ((uint64_t)bar_size32 << 32); + bar_address64 |= ((uint64_t)bar_address32 << 32); + mask64 |= ((uint64_t)~0 << 32); + } + + bar_size64 = pci_size(bar_address64, bar_size64, mask64); + if (!bar_size64) { + LOG_ERR( "reg 0x%x: invalid BAR (can't size)\n", pos); + } + + pf_dev->pf_sriov_cap_base = (void __iomem *)ioremap(bar_address64, bar_size64 * nr_virtfn); + + if (!pf_dev->pf_sriov_cap_base) + { + LOG_ERR("ioremap(0x%llx, 0x%llx) failed\n", bar_address64, bar_size64 * nr_virtfn); + return -1; + } + pf_dev->sriov_bar_size = bar_size64; + return 0; +} + +static uint8_t zxdh_pf_fwcap_readb(struct dh_core_dev *dh_dev, uint32_t offset) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + uint64_t vaddr = (uint64_t)ZXDH_BAR_FWCAP(pf_dev->pci_ioremap_addr[0]); + + return readb((const volatile void __iomem *)(vaddr + offset)); +} + +static bool zxdh_pf_is_ovs(struct dh_core_dev *dh_dev) +{ + uint8_t product = 0; + + product = zxdh_pf_fwcap_readb(dh_dev, ZXDH_PRODUCT_TYPE); + LOG_INFO("fwcap read product type: %d\n", (int32_t)product); + + if ((product == ZXDH_PRODUCT_OVS) + || (product == ZXDH_PRODUCT_NEO) + || (product == ZXDH_PRODUCT_EVB_EP0) + || (product == ZXDH_PRODUCT_EVB_EP0_EP4)) + { + return true; + } + + return false; +} + +static void zxdh_pf_set_pannel_port_num(struct dh_core_dev *dh_dev, int port_num) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + pf_dev->pannel_port_num = port_num; + + return; +} + +static void zxdh_pf_request_pannel_port_num(struct dh_core_dev *dh_dev, int *port_num) +{ + *port_num = (int)zxdh_pf_fwcap_readb(dh_dev, ZXDH_PANNEL_PORT_NUM); +} + +static int32_t zxdh_pf_lag_init(struct dh_core_dev *dh_dev, int32_t *port_num) +{ + int port_num_default = 1; + + /* BOND PF && 非OVS场景,则产生异常 */ + if (zxdh_pf_is_bond(dh_dev) && !zxdh_pf_is_ovs(dh_dev)) + { + return -1; + } + + if (!dh_core_is_pf(dh_dev) || !zxdh_pf_is_bond(dh_dev) || !zxdh_pf_is_ovs(dh_dev)) + { + goto out; + } + + zxdh_pf_request_pannel_port_num(dh_dev, &port_num_default); + zxdh_pf_set_pannel_port_num(dh_dev, port_num_default); + zxdh_regitster_ldev(dh_dev); + + LOG_INFO("zxdh pf lag init finish(port num %d)\n", port_num_default); +out: + zxdh_pf_set_pannel_port_num(dh_dev, port_num_default); + *port_num = port_num_default; + return 0; +} + +static void zxdh_pf_lag_exit(struct dh_core_dev *dh_dev) +{ + zxdh_unregitster_ldev(dh_dev); +} + +int32_t dh_pf_adevs_table_init(struct dh_core_dev *dh_dev, int32_t nr) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + pf_dev->adevs_table = kzalloc(sizeof(*(pf_dev->adevs_table)) * nr, GFP_KERNEL); + if (!pf_dev->adevs_table) + { + pf_dev->adevs_num = 0; + LOG_ERR("pf_dev->adevs_table kzalloc failed\n"); + return -ENOMEM; + } + + pf_dev->adevs_num = nr; + + return 0; +} + +void dh_pf_adevs_table_destroy(struct dh_core_dev *dh_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + if (dh_dev->coredev_type == DH_COREDEV_PF) + { + if (pf_dev->adevs_table != NULL) + { + kfree(pf_dev->adevs_table); + pf_dev->adevs_table = NULL; + pf_dev->adevs_num = 0; + } + } +} + +void zxdh_unplug_aux_dev_all(struct dh_core_dev *dh_dev) +{ + int32_t idx; + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + for (idx = 0; idx < pf_dev->adevs_num; idx++) + { + zxdh_unplug_aux_dev(dh_dev, idx); + } +} + +static int32_t dh_pf_probe(struct pci_dev *pdev, const struct pci_device_id *id) +{ + struct dh_core_dev *dh_dev = NULL; + struct zxdh_pf_device *pf_dev = NULL; + struct devlink *devlink = NULL; + int32_t ret = 0; + int32_t idx = 0; + int32_t port_num = 0; + + LOG_INFO("pf level driver probe start\n"); + + devlink = zxdh_devlink_alloc(&pdev->dev, &dh_pf_devlink_ops, sizeof(struct zxdh_pf_device)); + if (devlink == NULL) + { + LOG_ERR("devlink alloc failed\n"); + return -ENOMEM; + } + + dh_dev = devlink_priv(devlink); + dh_dev->device = &pdev->dev; + dh_dev->pdev = pdev; + dh_dev->devlink_ops = &dh_pf_core_devlink_ops; + + pf_dev = dh_core_priv(dh_dev); + pf_dev->vepa = false; + + dh_dev->coredev_type = GET_COREDEV_TYPE(pdev); + LOG_INFO("%s device: %s\n", (dh_dev->coredev_type == DH_COREDEV_PF) ? "PF" : "VF", pci_name(pdev)); + + ret = dh_pf_pci_init(dh_dev); + if (ret != 0) + { + LOG_ERR("dh_pf_pci_init failed: %d\n", ret); + goto err_irq_table_init; + } + + ret = dh_pf_pcie_id_get(dh_dev); + if (ret != 0) + { + LOG_ERR("dh_pf_pcie_id_get failed: %d\n", ret); + goto err_pci; + } + + ret = dh_pf_vf_item_create(dh_dev); + if (ret != 0) + { + LOG_ERR("Failed to alloc vf item\n"); + goto err_pci; + } + + ret = dh_pf_irq_table_init(dh_dev); + if (ret != 0) + { + LOG_ERR("Failed to alloc IRQs\n"); + goto err_vf_item; + } + + ret = dh_pf_eq_table_init(dh_dev); + if (ret != 0) + { + LOG_ERR("Failed to alloc IRQs\n"); + goto err_eq_table_init; + } + + ret = dh_pf_events_init(dh_dev); + if (ret != 0) + { + LOG_ERR("failed to initialize events\n"); + goto err_events_init; + } + + ret = dh_pf_irq_table_create(dh_dev); + if (ret != 0) + { + LOG_ERR("Failed to alloc IRQs\n"); + goto err_irq_table_create; + } + + ret = dh_pf_eq_table_create(dh_dev); + if (ret != 0) + { + LOG_ERR("Failed to alloc EQs\n"); + goto err_eq_table_create; + } + + ret = dh_pf_sriov_cap_cfg_init(dh_dev); + if (ret != 0) + { + LOG_ERR("dh_pf_sriov_cap_cfg_init failed: %d\n", ret); + goto err_sriov_cap_init; + } + + ret = zxdh_pf_modern_cfg_init(dh_dev); + if (ret != 0) + { + LOG_ERR("zxdh_pf_modern_cfg_init failed: %d\n", ret); + goto err_cfg_init; + } + + ret = zxdh_send_pxe_status_to_riscv(dh_dev); + if (ret != 0) + { + LOG_ERR("zxdh_send_pxe_status_to_riscv failed: %d\n", ret); + goto err_send_pxe_status; + } + +#ifdef HAVE_DEVLINK_REGISTER_GET_1_PARAMS + zxdh_devlink_register(devlink); +#else + zxdh_devlink_register(devlink, &pdev->dev); +#endif + + zxdh_pf_initialized_init(dh_dev); + + ret = zxdh_pf_dpp_init(dh_dev); + if (ret != 0) + { + LOG_ERR("zxdh_pf_dpp_init failed: %d\n", ret); + goto err_dpp_init; + } + + ret = zxdh_pf_query_fwinfo(dh_dev); + if (ret != 0) + { + LOG_ERR("zxdh_pf_query_fwinfo failed: %d\n", ret); + goto err_query_fwinfo; + } + + ret = zxdh_pf_lag_init(dh_dev, &port_num); + if (ret != 0) + { + LOG_ERR("zxdh_pf_lag_init failed: %d\n", ret); + goto err_query_fwinfo; + } + + ret = dh_pf_adevs_table_init(dh_dev, port_num); + if (ret != 0) + { + LOG_ERR("dh_pf_adevs_table_init failed: %d\n", ret); + goto err_adevs_tbl_init; + } + + for (idx = 0; idx < port_num; idx++) + { + zxdh_plug_aux_dev(dh_dev, idx); + } + +#ifdef PTP_DRIVER_INTERFACE_EN + if (dh_dev->coredev_type == DH_COREDEV_PF) + { + ret = zxdh_ptp_init(dh_dev); + if (ret != 0) + { + LOG_ERR("zxdh_ptp_init failed: %d\n", ret); + goto err_ptp_init; + } + } +#endif + + if (!zxdh_pf_is_upf(dh_dev)) + { + ret = zxdh_tsn_init(dh_dev); + if (ret != 0) + { + LOG_ERR("zxdh_tsn_init failed: %d\n", ret); + goto err_tsn_init; + } + } + +#ifdef ZXDH_SRIOV_SYSFS_EN + ret = zxdh_sriov_sysfs_init(dh_dev); + if (ret != 0) + { + LOG_ERR("zxdh_sriov_sysfs_init failed: %d, vport = %x\n", ret, pf_dev->vport); + goto err_sriov_sysfs; + } +#endif + + zxdh_pf_ip6mac_lock_init(dh_dev); + + ret = zxdh_init_ip6mac_tbl(dh_dev); + if (ret != 0) + { + LOG_ERR("zxdh_init_ip6mac_tbl failed: %d, vport = %x\n", ret, pf_dev->vport); + goto err_tsn_init; + } + + LOG_INFO("pf level driver probe completed\n"); + + return 0; + +#ifdef ZXDH_SRIOV_SYSFS_EN +err_sriov_sysfs: +#endif +err_tsn_init: + if (!zxdh_pf_is_upf(dh_dev)) + { + zxdh_tsn_exit(dh_dev); + } +err_ptp_init: + zxdh_ptp_stop(dh_dev); +err_adevs_tbl_init: + zxdh_pf_lag_exit(dh_dev); +err_query_fwinfo: + zxdh_pf_dpp_uninit(dh_dev); +err_dpp_init: + zxdh_pf_initialized_uninit(dh_dev); + zxdh_devlink_unregister(devlink); +err_send_pxe_status: + zxdh_pf_modern_cfg_uninit(dh_dev); +err_cfg_init: + dh_pf_sriov_cap_cfg_uninit(dh_dev); +err_sriov_cap_init: + dh_pf_eq_table_destroy(dh_dev); +err_eq_table_create: + dh_pf_irq_table_destroy(dh_dev); +err_irq_table_create: + dh_pf_events_uninit(dh_dev); +err_events_init: + dh_eq_table_cleanup(dh_dev); +err_eq_table_init: + dh_irq_table_cleanup(dh_dev); +err_vf_item: + dh_pf_vf_item_destroy(dh_dev, true); +err_pci: + dh_pf_pci_close(dh_dev); +err_irq_table_init: + zxdh_devlink_free(devlink); + return ret; +} + +static void dh_pf_remove(struct pci_dev *pdev) +{ + struct dh_core_dev *dh_dev = pci_get_drvdata(pdev); + struct devlink *devlink = priv_to_devlink(dh_dev); + + LOG_INFO("pf level driver remove start\n"); + zxdh_cleanup_ip6mac_tbl(dh_dev); +#ifdef ZXDH_SRIOV_SYSFS_EN + zxdh_sriov_sysfs_exit(dh_dev); +#endif + if (!zxdh_pf_is_upf(dh_dev)) + { + zxdh_tsn_exit(dh_dev); + } +#ifdef PTP_DRIVER_INTERFACE_EN + if (dh_dev->coredev_type == DH_COREDEV_PF) + { + zxdh_ptp_stop(dh_dev); + } +#endif + zxdh_unplug_aux_dev_all(dh_dev); + dh_pf_adevs_table_destroy(dh_dev); + + zxdh_pf_lag_exit(dh_dev); + zxdh_pf_dpp_uninit(dh_dev); + zxdh_pf_initialized_uninit(dh_dev); + + zxdh_devlink_unregister(devlink); + zxdh_pf_modern_cfg_uninit(dh_dev); + dh_pf_sriov_cap_cfg_uninit(dh_dev); + dh_pf_eq_table_destroy(dh_dev); + dh_pf_irq_table_destroy(dh_dev); + dh_pf_events_uninit(dh_dev); + dh_eq_table_cleanup(dh_dev); + dh_irq_table_cleanup(dh_dev); + dh_pf_vf_item_destroy(dh_dev, true); + dh_pf_pci_close(dh_dev); + zxdh_devlink_free(devlink); + + pci_set_drvdata(pdev, NULL); + LOG_INFO("pf level driver remove completed\n"); + + return; +} + +static int32_t dh_pf_suspend(struct pci_dev *pdev, pm_message_t state) +{ + + return 0; +} + +static int32_t dh_pf_resume(struct pci_dev *pdev) +{ + + return 0; +} + +static void dh_pf_shutdown(struct pci_dev *pdev) +{ + struct dh_core_dev *dh_dev = pci_get_drvdata(pdev); + struct devlink *devlink = priv_to_devlink(dh_dev); + + LOG_INFO("pf level driver shutdown start\n"); + dh_pf_adevs_table_destroy(dh_dev); + + zxdh_pf_lag_exit(dh_dev); + zxdh_pf_dpp_uninit(dh_dev); + zxdh_pf_initialized_uninit(dh_dev); + + zxdh_devlink_unregister(devlink); + zxdh_pf_modern_cfg_uninit(dh_dev); + dh_pf_sriov_cap_cfg_uninit(dh_dev); + dh_pf_eq_table_destroy(dh_dev); + dh_pf_irq_table_destroy(dh_dev); + dh_pf_events_uninit(dh_dev); + dh_eq_table_cleanup(dh_dev); + dh_irq_table_cleanup(dh_dev); + dh_pf_vf_item_destroy(dh_dev, false); + dh_pf_pci_close(dh_dev); + zxdh_devlink_free(devlink); + + pci_set_drvdata(pdev, NULL); + LOG_INFO("pf level driver shutdown completed\n"); +} + +static pci_ers_result_t dh_pci_err_detected(struct pci_dev *pdev, + pci_channel_state_t state) +{ + return PCI_ERS_RESULT_NONE; +} + +static pci_ers_result_t dh_pf_pci_slot_reset(struct pci_dev *pdev) +{ + return PCI_ERS_RESULT_NONE; +} + +static void dh_pf_pci_resume(struct pci_dev *pdev) +{ + +} + +int32_t dh_pf_sriov_configure(struct pci_dev *pdev, int32_t num_vfs) +{ + struct dh_core_dev *dev = pci_get_drvdata(pdev); + struct zxdh_pf_device *pf_dev = dh_core_priv(dev); + int32_t ret = 0; + + if (dev->coredev_type != DH_COREDEV_PF) + { + LOG_ERR("This device is not capable of SR-IOV\n"); + return -EOPNOTSUPP; + } + + if (num_vfs > 0) + { + ret = dh_pf_sriov_enable(pdev, num_vfs); + if (ret != 0) + { + LOG_ERR("Failed to enable sriov, num_vfs:%d\n", num_vfs); + return ret; + } + } + else + { + dh_pf_sriov_disable(pdev); + } + + pf_dev->num_vfs = (uint16_t)num_vfs; + + return num_vfs; +} + +static const struct pci_error_handlers dh_pf_err_handler = { + .error_detected = dh_pci_err_detected, + .slot_reset = dh_pf_pci_slot_reset, + .resume = dh_pf_pci_resume +}; + +static struct pci_driver dh_pf_driver = { + .name = KBUILD_MODNAME, + .id_table = dh_pf_pci_table, + .probe = dh_pf_probe, + .remove = dh_pf_remove, + .suspend = dh_pf_suspend, + .resume = dh_pf_resume, + .shutdown = dh_pf_shutdown, + .err_handler = &dh_pf_err_handler, + .sriov_configure = dh_pf_sriov_configure, +}; + +static int32_t __init dh_pf_pci_init_module(void) +{ + int32_t ret = 0; + + LOG_INFO("%s - version %s\n", zxdh_pf_driver_string, zxdh_pf_driver_version); + LOG_INFO("%s\n", zxdh_pf_copyright); + + ret = pci_register_driver(&dh_pf_driver); + if (ret != 0) + { + LOG_ERR("pci_register_driver failed: %d\n", ret); + goto err_register_driver; + } + +#ifdef CONFIG_ZXDH_SF + ret = zxdh_en_sf_driver_register(); + if (ret != 0) + { + LOG_ERR("zxdh_en_sf_driver_register failed: %d\n", ret); + goto err_sf_driver_register; + } +#endif + + ret = dh_pf_msg_recv_func_register(); + if (ret != 0) + { + LOG_ERR("dh_pf_msg_recv_func_register failed: %d\n", ret); + goto err_msg_recv_func_registe; + } + + return 0; + +err_msg_recv_func_registe: +#ifdef CONFIG_ZXDH_SF + zxdh_en_sf_driver_unregister(); +err_sf_driver_register: +#endif + pci_unregister_driver(&dh_pf_driver); +err_register_driver: + return ret; +} + +static void dh_pf_pci_exit_module(void) +{ + LOG_INFO("%s - version %s\n", zxdh_pf_driver_string, zxdh_pf_driver_version); + LOG_INFO("%s\n", zxdh_pf_copyright); + + dh_pf_msg_recv_func_unregister(); + +#ifdef CONFIG_ZXDH_SF + zxdh_en_sf_driver_unregister(); +#endif + + pci_unregister_driver(&dh_pf_driver); + + return; +} + +module_init(dh_pf_pci_init_module); +module_exit(dh_pf_pci_exit_module); diff --git a/src/net/drivers/net/ethernet/dinghai/en_pf.h b/src/net/drivers/net/ethernet/dinghai/en_pf.h new file mode 100644 index 0000000..21d10d7 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_pf.h @@ -0,0 +1,179 @@ +#ifndef __ZXDH_EN_PF_H__ +#define __ZXDH_EN_PF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include "plcr.h" +#include "en_tsn/zxdh_tsn.h" + +/* Common configuration */ +#define ZXDH_PCI_CAP_COMMON_CFG 1 +/* Notifications */ +#define ZXDH_PCI_CAP_NOTIFY_CFG 2 +/* ISR access */ +#define ZXDH_PCI_CAP_ISR_CFG 3 +/* Device specific configuration */ +#define ZXDH_PCI_CAP_DEVICE_CFG 4 +/* PCI configuration access */ +#define ZXDH_PCI_CAP_PCI_CFG 5 + +#define ZXDH_PF_MAX_BAR_VAL 0x5 +#define ZXDH_PF_ALIGN4 4 +#define ZXDH_PF_ALIGN2 2 +#define ZXDH_PF_MAP_MINLEN2 2 + +#define ZXDH_DEV_MAC_LOW_OFFSET 0x40 +#define ZXDH_DEV_MAC_HIGH_OFFSET 0x44 +#define ZXDH_DEV_SPEED_OFFSET 0x4c +#define ZXDH_DEV_DUPLEX_OFFSET 0x50 + +#define ZXDH_CFG_NPSDK_TYPE 7 +#define ZXDH_STOP_PXE_MODE 1 + +#define ZXDH_PANNEL_PORT_MAX (10) + +#define GET_COREDEV_TYPE(pdev) \ + ((pdev->device == ZXDH_VF_DEVICE_ID) || (pdev->device == ZXDH_VF_E310_DEVICE_ID) || \ + (pdev->device == ZXDH_VF_E312_DEVICE_ID) || (pdev->device == ZXDH_UPF_VF_I512_DEVICE_ID) || \ + (pdev->device == ZXDH_INICA_RDMA_VF_DEVICE_ID) || \ + (pdev->device == ZXDH_VF_DPUB_RDMA_DEVICE_ID)) ? \ + DH_COREDEV_VF : DH_COREDEV_PF \ + +#define ZXDH_AUX_COMP_FLAG 1 +#define ZXDH_AUX_COMP_FLAG_CHECK(pf_dev) \ + do { \ + if (pf_dev->aux_comp_flag != ZXDH_AUX_COMP_FLAG) \ + { \ + return; \ + } \ + } while (0) + +#define PORT_FLAGS_ALLOC_STAT (1 << 0) + + +struct dh_core_dev; + +struct zxdh_pf_adev { + struct zxdh_auxiliary_device *adev; + int32_t aux_idx; +}; + +struct zxdh_pannle_port +{ + uint8_t pannel_id; + uint8_t phyport; + uint8_t link_check_bit; + uint8_t flags; +} __attribute__((packed)); + +struct zxdh_port_resource +{ + uint8_t pannel_num; + uint8_t rsv[3]; + struct zxdh_pannle_port port[ZXDH_PANNEL_PORT_MAX]; +} __attribute__((packed)); + +struct zxdh_pf_device { + struct list_head virtqueues; + + struct zxdh_pf_pci_common_cfg __iomem *common; + /* Device-specific data (non-legacy mode) */ + /* Base of vq notifications (non-legacy mode). */ + void __iomem *device; + void __iomem *notify_base; + void __iomem *pf_sriov_cap_base; + /* Physical base of vq notifications */ + resource_size_t notify_pa; + /* Where to read and clear interrupt */ + uint8_t __iomem *isr; + /* So we can sanity-check accesses. */ + size_t notify_len; + size_t device_len; + /* Capability for when we need to map notifications per-vq. */ + int32_t notify_map_cap; + /* Multiply queue_notify_off by this value. (non-legacy mode). */ + uint32_t notify_offset_multiplier; + int32_t modern_bars; + + uint64_t pci_ioremap_addr[6]; + + uint32_t speed; + uint32_t autoneg_enable; + uint32_t supported_speed_modes; + uint32_t advertising_speed_modes; + uint8_t duplex; + + uint16_t pcie_id; + uint16_t slot_id; + uint16_t vport; + struct zxdh_vf_item *vf_item; + uint16_t num_vfs; + bool vepa; + uint8_t phy_port; + + bool link_up; + struct work_struct riscv_ready_work; + struct work_struct riscv2pf_msg_proc_work; + struct work_struct vf2pf_msg_proc_work; + struct work_struct link_info_irq_update_vf_bond_pf_work; + struct work_struct riscv_ext_pps_work; + struct work_struct riscv_local_pps_work; + + uint64_t sriov_bar_size; + + struct zxdh_plcr_table plcr_table; + struct zxdh_sriov_sysfs sriov; + struct zxdh_pf_adev *adevs_table; + int32_t adevs_num; + + struct zxdh_port_resource port_resource; + struct zxdh_lag *ldev; + int32_t pannel_port_num; + + uint32_t initialized_flags; + spinlock_t initialized_lock; + + /* initialization completion flag */ + uint8_t aux_comp_flag; + uint8_t bond_num; + struct zxdh_ptp_private *ptp; + struct zxdh_tsn_private *tsn; + struct zxdh_ipv6_mac_tbl *ip6mac_tbl; + spinlock_t vf_ip6mac_lock; +}; + +struct zxdh_ipv6_mac_entry { + spinlock_t lock; + refcount_t refcnt; + struct list_head list; + uint8_t ipv6_mac[ETH_ALEN]; +}; + +struct zxdh_ipv6_mac_tbl { + unsigned int ip6mact_size; + rwlock_t lock; + struct list_head ip6mac_free_head; + void *ip6mac_entry_list; + struct list_head hash_list[]; +}; + +#define IS_MSGQ_DEV(en_dev) if ((en_dev->ops->get_coredev_type(en_dev->parent) == DH_COREDEV_PF) && \ + ((!en_dev->ops->is_bond(en_dev->parent)) || \ + (en_dev->ops->is_bond(en_dev->parent) && en_dev->ops->if_init(en_dev->parent)))) +#define NEED_MSGQ(en_dev) if (en_dev->need_msgq) + +bool zxdh_pf_is_bond(struct dh_core_dev *dh_dev); +bool zxdh_pf_is_upf(struct dh_core_dev *dh_dev); +int32_t zxdh_pf_msg_send_cmd(struct dh_core_dev *dh_dev, uint16_t module_id, void *msg, void *ack, bool is_sync); +struct zxdh_vf_item *zxdh_pf_get_vf_item(struct dh_core_dev *dh_dev, uint16_t vf_idx); +int zxdh_pf_get_pannel_port_num(struct dh_core_dev *dh_dev); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_pf/devlink.c b/src/net/drivers/net/ethernet/dinghai/en_pf/devlink.c new file mode 100755 index 0000000..4875424 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_pf/devlink.c @@ -0,0 +1,132 @@ +#include +#include +#include "devlink.h" + + +struct devlink_ops dh_pf_devlink_ops = { + +}; + +enum { + DH_PF_PARAMS_MAX, +}; + +static int32_t __attribute__((unused)) sample_check(struct dh_core_dev *dev) +{ + return 1; +} + +enum dh_pf_devlink_param_id { + DH_PF_DEVLINK_PARAM_ID_BASE = DEVLINK_PARAM_GENERIC_ID_MAX, + DH_PF_DEVLINK_PARAM_ID_SAMPLE, +}; + + +static int32_t dh_devlink_sample_set(struct devlink *devlink, uint32_t id, + struct devlink_param_gset_ctx *ctx) +{ + struct dh_core_dev * __attribute__((unused)) dev = devlink_priv(devlink); + + return 0; +} + +static int32_t dh_devlink_sample_get(struct devlink *devlink, uint32_t id, + struct devlink_param_gset_ctx *ctx) +{ + struct dh_core_dev * __attribute__((unused)) dev = devlink_priv(devlink); + + return 0; +} + +#ifdef HAVE_DEVLINK_PARAM_REGISTER +static const struct devlink_params { + const char *name; + int32_t (*check)(struct dh_core_dev *dev); + struct devlink_param param; +} devlink_params[] = { + [DH_PF_PARAMS_MAX] = { .name = "sample", + .check = &sample_check, + .param = DEVLINK_PARAM_DRIVER(DH_PF_DEVLINK_PARAM_ID_SAMPLE, + "sample", DEVLINK_PARAM_TYPE_BOOL, + BIT(DEVLINK_PARAM_CMODE_RUNTIME),dh_devlink_sample_get, + dh_devlink_sample_set, + NULL), + } +}; + +static int32_t params_register(struct devlink *devlink) +{ + int32_t i = 0; + int32_t err = 0; + struct dh_core_dev *dh_dev = devlink_priv(devlink); + + for (i = 0; i < ARRAY_SIZE(devlink_params); i++) + { + if(devlink_params[i].check(dh_dev)) + { + err = devlink_param_register(devlink, &devlink_params[i].param); + if (err) + { + goto rollback; + } + } + } + + return 0; + +rollback: + if (i == 0) + { + return err; + } + + for (; i > 0; i--) + { + devlink_param_unregister(devlink, &devlink_params[i].param); + } + + return err; +} + +static int32_t params_unregister(struct devlink *devlink) +{ + int32_t i = 0; + + for (i = 0; i < ARRAY_SIZE(devlink_params); i++) + { + devlink_param_unregister(devlink, &devlink_params[i].param); + } + + return 0; +} +#else +static struct devlink_param devlink_params [] = { + [DH_PF_PARAMS_MAX] = DEVLINK_PARAM_DRIVER(DH_PF_DEVLINK_PARAM_ID_SAMPLE, + "sample", DEVLINK_PARAM_TYPE_BOOL, + BIT(DEVLINK_PARAM_CMODE_RUNTIME),dh_devlink_sample_get, + dh_devlink_sample_set, + NULL), +}; + +static int32_t params_register(struct devlink *devlink) +{ + struct dh_core_dev * __attribute__((unused)) dh_dev = devlink_priv(devlink); + int32_t err = 0; + + err = devlink_params_register(devlink, devlink_params, ARRAY_SIZE(devlink_params)); + + return err; +} +static int32_t params_unregister(struct devlink *devlink) +{ + devlink_params_unregister(devlink, devlink_params, ARRAY_SIZE(devlink_params)); + + return 0; +} +#endif + +struct dh_core_devlink_ops dh_pf_core_devlink_ops = { + .params_register = params_register, + .params_unregister = params_unregister +}; + diff --git a/src/net/drivers/net/ethernet/dinghai/en_pf/devlink.h b/src/net/drivers/net/ethernet/dinghai/en_pf/devlink.h new file mode 100755 index 0000000..116d09d --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_pf/devlink.h @@ -0,0 +1,16 @@ +#ifndef __ZXDH_DEVLINK_H__ +#define __ZXDH_DEVLINK_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + + + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_pf/en_rep.c b/src/net/drivers/net/ethernet/dinghai/en_pf/en_rep.c new file mode 100755 index 0000000..e69de29 diff --git a/src/net/drivers/net/ethernet/dinghai/en_pf/eq.c b/src/net/drivers/net/ethernet/dinghai/en_pf/eq.c new file mode 100755 index 0000000..ae2e6d1 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_pf/eq.c @@ -0,0 +1,455 @@ +#include +#include +#include +#include +#include +#include "irq.h" +#include "eq.h" +#include "../en_pf.h" + +extern irqreturn_t msix_extern_pps_irq_from_risc_handler(struct zxdh_pf_device *dev); +extern irqreturn_t msix_local_pps_irq_from_risc_handler(struct zxdh_pf_device *dev); +static int32_t create_async_eqs(struct dh_core_dev *dev); + + +int32_t dh_pf_eq_table_init(struct dh_core_dev *dev) +{ + struct dh_pf_eq_table *table_priv = NULL; + + table_priv = kvzalloc(sizeof(*table_priv), GFP_KERNEL); + if (unlikely(table_priv == NULL)) + { + LOG_ERR("dh_pf_eq_table kvzalloc failed\n"); + return -ENOMEM; + } + + dh_eq_table_init(dev, table_priv); + + return 0; +} + +uint16_t zxdh_pf_get_vqs_channels_num(struct dh_core_dev *dh_dev) +{ + if ((dh_dev->pdev->device == ZXDH_INICA_BOND_DEVICE_ID) + || (dh_dev->pdev->device == ZXDH_INICB_BOND_DEVICE_ID) + || (dh_dev->pdev->device == ZXDH_INICA_UPF_BOND_DEVICE_ID) + || (dh_dev->pdev->device == ZXDH_DPUA_BOND_DEVICE_ID)) + { + return ZXDH_BOND_VQS_CHANNELS_NUM; + } + + return ZXDH_VQS_CHANNELS_NUM; +} + +void zxdh_pf_switch_irq(struct dh_core_dev *dh_dev, int32_t i, int32_t op) +{ + if (op) + { + enable_irq(i); + return; + } + + disable_irq(i); + return; +} + +int32_t zxdh_pf_vq_irqs_request(struct dh_core_dev *dh_dev, struct dh_irq **vq_irqs, int32_t vq_channels) +{ + struct dh_irq_table *irq_table = &dh_dev->irq_table; + struct dh_pf_irq_table *pf_irq_table = irq_table->priv; + int32_t ret = 0; + int32_t vqs_irq_num = vq_channels; + + ret = dh_irq_affinity_irqs_request_auto(pf_irq_table->pf_vq_pool, vq_irqs, vqs_irq_num); + if (ret < vqs_irq_num) + { + LOG_ERR("the actual obtain irq_num %d < need request irq_num %d\n", ret, vqs_irq_num); + return -1; + } + + return ret; +} + +void zxdh_pf_affinity_irqs_release(struct dh_core_dev *dh_dev, struct dh_irq **vq_irqs, int32_t num_irqs) +{ + struct dh_irq_table *irq_table = &dh_dev->irq_table; + struct dh_pf_irq_table *pf_irq_table = irq_table->priv; + + dh_irq_affinity_irqs_release(pf_irq_table->pf_vq_pool, vq_irqs, num_irqs); +} + +static int32_t destroy_async_eq(struct dh_core_dev *dev) +{ + struct dh_eq_table *eq_table = &dev->eq_table; + struct zxdh_pf_device *pf_dev = dh_core_priv(dev); + struct msix_para in = {0}; + int32_t err = 0; + + in.vector_risc = ZXDH_PF_INVALID_MSIX_VEC; + in.vector_pfvf = ZXDH_PF_INVALID_MSIX_VEC; + in.vector_mpf = ZXDH_PF_INVALID_MSIX_VEC; + in.driver_type = MSG_CHAN_END_PF; + in.pdev = dev->pdev; + in.virt_addr = pf_dev->pci_ioremap_addr[0] + ZXDH_BAR_MSG_OFFSET; + in.pcie_id = pf_dev->pcie_id; + + mutex_lock(&eq_table->lock); + + err = zxdh_bar_enable_chan(&in, &pf_dev->vport); + if (err != 0) + { + LOG_ERR("zxdh_bar_disable_chan failed\n"); + } + + mutex_unlock(&eq_table->lock); + + return err; +} + +int32_t dh_pf_eq_table_create(struct dh_core_dev *dev) +{ + int32_t err = 0; + + err = create_async_eqs(dev); + if (err != 0) + { + LOG_ERR("Failed to create async EQs: %d\n", err); + return err; + } + + return 0; +} + +/*create eventq*/ +static int32_t create_async_eq(struct dh_core_dev *dev, struct dh_irq *riscv, struct dh_irq *pf) +{ + struct dh_eq_table *eq_table = &dev->eq_table; + struct zxdh_pf_device *pf_dev = dh_core_priv(dev); + struct msix_para in = {0}; + int ret = 0; + + in.vector_risc = riscv->index; + in.vector_pfvf = pf->index; + in.vector_mpf = ZXDH_PF_INVALID_MSIX_VEC; + in.driver_type = MSG_CHAN_END_PF; + in.pdev = dev->pdev; + in.virt_addr = pf_dev->pci_ioremap_addr[0] + ZXDH_BAR_MSG_OFFSET; + in.pcie_id = pf_dev->pcie_id; + + mutex_lock(&eq_table->lock); + + LOG_DEBUG("msix vector riscv: %d, pfvf: %d\n", riscv->index, pf->index); + ret = zxdh_bar_enable_chan(&in, &pf_dev->vport); + + mutex_unlock(&eq_table->lock); + + return ret; +} + +static int32_t dh_eq_async_riscv_int(struct notifier_block *nb, unsigned long action, void *data) +{ + struct dh_eq_async *eq_riscv_async = container_of(nb, struct dh_eq_async, irq_nb); + struct dh_core_dev *dev = (struct dh_core_dev *)eq_riscv_async->priv; + struct zxdh_pf_device *pf_dev = dh_core_priv(dev); + struct dh_eq_table *eq_table = &dev->eq_table; + struct dh_events *events = dev->events; + struct dh_event_nb *event_nb = NULL; + uint64_t virt_addr = 0; + int32_t event_type = 0; + uint16_t event_idx = 0; + uint16_t i = 0; + uint8_t src = MSG_CHAN_END_RISC; + uint8_t dst = MSG_CHAN_END_VF; + + if(dev->coredev_type == DH_COREDEV_PF) + { + dst = MSG_CHAN_END_PF; + } + + virt_addr = pf_dev->pci_ioremap_addr[0] + ZXDH_BAR_MSG_OFFSET; + event_idx = zxdh_get_event_id(virt_addr, src, dst); + event_type = dh_eq_event_type_get(event_idx); + LOG_INFO("------------- event_idx: %d, event_type: %d------------\n", event_idx, event_type); + + if(events == NULL) + { + LOG_ERR("riscv_irq trigger, events is null\n"); + return 0; + } + + for (i = 0; i < events->evt_num; i++) + { + event_nb = &events->notifiers[i]; + if (event_type == event_nb->nb.event_type) + { + LOG_INFO("en_pf async riscv irq_handler called\n"); + atomic_notifier_call_chain(&eq_table->nh[event_type], event_type, NULL); + return 0; + } + } + + return 0; +} + +static int32_t dh_eq_async_pf_int(struct notifier_block *nb, unsigned long action, void *data) +{ + struct dh_eq_async *eq_riscv_async = container_of(nb, struct dh_eq_async, irq_nb); + struct dh_core_dev *dev = (struct dh_core_dev *)eq_riscv_async->priv; + struct zxdh_pf_device *pf_dev = dh_core_priv(dev); + struct dh_eq_table *eq_table = &dev->eq_table; + struct dh_events *events = dev->events; + struct dh_event_nb *event_nb = NULL; + uint64_t virt_addr = 0; + int32_t event_type = 0; + uint16_t event_idx = 0; + uint16_t i = 0; + + if(dev->coredev_type == DH_COREDEV_VF) + { + return 0; + } + + virt_addr = pf_dev->pci_ioremap_addr[0] + ZXDH_BAR_MSG_OFFSET + ZXDH_BAR_PFVF_MSG_OFFSET; + event_idx = zxdh_get_event_id(virt_addr, MSG_CHAN_END_VF, MSG_CHAN_END_PF); + event_type = dh_eq_event_type_get(event_idx); + LOG_INFO("------------- event_idx: %d, event_type: %d------------\n", event_idx, event_type); + + for (i = 0; i < events->evt_num; i++) + { + event_nb = &events->notifiers[i]; + + if (event_type == event_nb->nb.event_type) + { + LOG_INFO("en_pf async pf/vf irq_handler called\n"); + atomic_notifier_call_chain(&eq_table->nh[event_type], event_type, NULL); + return 0; + } + } + + return 0; +} + +static int32_t dh_eq_async_link_info_int_bond_pf(struct notifier_block *nb, unsigned long action, void *data) +{ + struct dh_eq_async *eq_riscv_async = container_of(nb, struct dh_eq_async, irq_nb); + struct dh_core_dev *dev = (struct dh_core_dev *)eq_riscv_async->priv; + struct zxdh_pf_device *pf_dev = dh_core_priv(dev); + + if(!zxdh_pf_is_bond(dev)) + { + LOG_INFO("isn't bond_pf exit\n"); + return 0; + } + + zxdh_events_work_enqueue(dev, &pf_dev->link_info_irq_update_vf_bond_pf_work); + return 0; +} + +static int32_t dh_eq_async_extpps_int(struct notifier_block *nb, unsigned long action, void *data) +{ + struct dh_eq_async *eq_pps_async = container_of(nb, struct dh_eq_async, irq_nb); + struct dh_core_dev *dev = (struct dh_core_dev *)eq_pps_async->priv; + struct dh_eq_table *eq_table = &dev->eq_table; + + atomic_notifier_call_chain(&eq_table->nh[DH_EVENT_TYPE_NOTIFY_RISC_EXT_PPS], DH_EVENT_TYPE_NOTIFY_RISC_EXT_PPS, NULL); + return 0; +} + +static int32_t dh_eq_async_local_pps_int(struct notifier_block *nb, unsigned long action, void *data) +{ + struct dh_eq_async *eq_pps_async = container_of(nb, struct dh_eq_async, irq_nb); + struct dh_core_dev *dev = (struct dh_core_dev *)eq_pps_async->priv; + struct dh_eq_table *eq_table = &dev->eq_table; + + atomic_notifier_call_chain(&eq_table->nh[DH_EVENT_TYPE_NOTIFY_RISC_LOCAL_PPS], DH_EVENT_TYPE_NOTIFY_RISC_LOCAL_PPS, NULL); + return 0; +} + +static struct dh_pf_async_irq_table dh_pf_async_irq_tbl[] = +{ + {"link_info", dh_eq_async_link_info_int_bond_pf}, + {"riscv", dh_eq_async_riscv_int}, + {"pf", dh_eq_async_pf_int}, + {"expps", dh_eq_async_extpps_int}, + {"localpps", dh_eq_async_local_pps_int}, +}; + +static void cleanup_async_eq(struct dh_core_dev *dev, struct dh_eq_async *eq, const char *name) +{ + dh_eq_disable(dev, &eq->core, &eq->irq_nb); +} + +static void destroy_async_eqs(struct dh_core_dev *dev) +{ + struct dh_eq_table *table = &dev->eq_table; + struct dh_pf_eq_table *table_priv = table->priv; + int32_t tbl_size = ARRAY_SIZE(dh_pf_async_irq_tbl); + int32_t i = 0; + + for (i = 0; i < tbl_size; ++i) + { + cleanup_async_eq(dev, &table_priv->async_eq_tbl[i], dh_pf_async_irq_tbl[i].name); + } + destroy_async_eq(dev); + dh_irqs_release_vectors(table_priv->async_irq_tbl, tbl_size); +} + +void dh_pf_eq_table_destroy(struct dh_core_dev *dev) +{ + destroy_async_eqs(dev); +} + +static int32_t create_async_eqs(struct dh_core_dev *dev) +{ + struct dh_eq_table *table = &dev->eq_table; + struct dh_pf_eq_table *table_priv = table->priv; + struct dh_eq_param param = {}; + int32_t err = 0; + int32_t tbl_size = ARRAY_SIZE(dh_pf_async_irq_tbl); + int32_t i = 0; + int32_t j = 0; + int32_t k = 0; + + for (i = 0; i < tbl_size ; ++i) + { + table_priv->async_irq_tbl[i] = dh_pf_async_irq_request(dev); + if (IS_ERR(table_priv->async_irq_tbl[i])) + { + err = PTR_ERR(table_priv->async_irq_tbl[i]); + LOG_ERR("Failed to get async_irq_tbl[%d]\n", i); + goto err_async_irq_request; + } + } + + err = create_async_eq(dev, table_priv->async_irq_tbl[1], table_priv->async_irq_tbl[2]); + if (err != 0) + { + LOG_ERR("Failed to create async_eq\n"); + goto err_async_irq_request; + } + + param.nent = 10; + param.event_type = DH_EVENT_QUEUE_TYPE_RISCV; + for (j = 0; j < tbl_size; ++j) + { + param.irq = table_priv->async_irq_tbl[j], + err = setup_async_eq(dev, &table_priv->async_eq_tbl[j], ¶m,\ + dh_pf_async_irq_tbl[j].async_int, dh_pf_async_irq_tbl[j].name,\ + dev); + if (err != 0) + { + LOG_ERR("Failed to setup async_eq_tbl[%d]\n", j); + goto err_setup_async_eq; + } + } + + return 0; + +err_setup_async_eq: + for (k = 0; k < j; ++k) + { + cleanup_async_eq(dev, &table_priv->async_eq_tbl[j], dh_pf_async_irq_tbl[j].name); + } + destroy_async_eq(dev); +err_async_irq_request: + dh_irqs_release_vectors(table_priv->async_irq_tbl, i); + return err; +} + +int32_t zxdh_pf_async_eq_enable(struct dh_core_dev *dh_dev, \ + struct dh_eq_async *eq, const char *name, bool attach) +{ + struct dh_eq_table *table = &dh_dev->eq_table; + struct dh_pf_eq_table *table_priv = table->priv; + int32_t err = 0; + int32_t tbl_size = ARRAY_SIZE(dh_pf_async_irq_tbl); + int32_t i = 0; + + for (i = 0; i < tbl_size; ++i) + { + if(strcmp(dh_pf_async_irq_tbl[i].name, name) == 0) + { + eq->core.irq = table_priv->async_irq_tbl[i]; + break; + } + } + + if (i == tbl_size) + { + LOG_ERR("failed to find %s irq\n", name); + return -1; + } + + LOG_DEBUG("%s attach[%d] irq[%d]\n", name, attach, eq->core.irq->index); + if (attach) + { + err = dh_eq_enable(dh_dev, &eq->core, &eq->irq_nb); + if (err != 0) + { + LOG_WARN("failed to enable EQ %d\n", err); + } + } + else + { + dh_eq_disable(dh_dev, &eq->core, &eq->irq_nb); + } + + return err; +} + +void zxdh_pf_get_link_info_from_vqm(struct dh_core_dev *dh_dev, uint8_t *link_up) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + uint32_t dev_link_up = 0; + + dev_link_up = ioread32((void __iomem *)(pf_dev->pci_ioremap_addr[0] + ZXDH_DEV_MAC_HIGH_OFFSET)); + *link_up = (dev_link_up >> 16) & 0xff; + + LOG_INFO("dev pcieid:0x%x ******** link_up: %d ********\n", pf_dev->pcie_id, *link_up); + return; +} + +void zxdh_pf_set_vf_link_info(struct dh_core_dev *dh_dev, uint16_t vf_idx, uint8_t link_up) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + uint32_t dev_link_up = 0; + + dev_link_up = ioread32((void __iomem *)(pf_dev->pf_sriov_cap_base + (pf_dev->sriov_bar_size) * vf_idx + ZXDH_DEV_MAC_HIGH_OFFSET)); + dev_link_up = (dev_link_up & ~(0xFF << 16)) | ((uint32_t)(link_up) << 16); + iowrite32(dev_link_up, (void __iomem *)(pf_dev->pf_sriov_cap_base + (pf_dev->sriov_bar_size) * vf_idx + ZXDH_DEV_MAC_HIGH_OFFSET)); + + return; +} + +void zxdh_pf_set_pf_phy_port(struct dh_core_dev *dh_dev, uint8_t phy_port) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + pf_dev->phy_port = phy_port; + if (dh_dev->coredev_type == DH_COREDEV_PF) + { + if (pf_dev->tsn == NULL) + { + LOG_ERR("pf_dev->tsn is null\n"); + return; + } + pf_dev->tsn->phy_port_id = phy_port; + } +} + +uint8_t zxdh_pf_get_pf_phy_port(struct dh_core_dev *dh_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + return pf_dev->phy_port; +} + +void zxdh_pf_set_pf_link_up(struct dh_core_dev *dh_dev, bool link_up) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + pf_dev->link_up = link_up; +} + +bool zxdh_pf_get_pf_link_up(struct dh_core_dev *dh_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + return pf_dev->link_up; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_pf/eq.h b/src/net/drivers/net/ethernet/dinghai/en_pf/eq.h new file mode 100755 index 0000000..5c53635 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_pf/eq.h @@ -0,0 +1,53 @@ +#ifndef __ZXDH_PF_EQ_H__ +#define __ZXDH_PF_EQ_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include + +#define ZXDH_PF_INVALID_MSIX_VEC 0xffff + +int32_t dh_pf_eq_table_create(struct dh_core_dev *dev); +void dh_pf_eq_table_destroy(struct dh_core_dev *dev); +int32_t dh_pf_eq_table_init(struct dh_core_dev *dev); +uint16_t zxdh_pf_get_vqs_channels_num(struct dh_core_dev *dh_dev); + +void zxdh_pf_switch_irq(struct dh_core_dev *dh_dev, int32_t i, int32_t op); +int32_t zxdh_pf_vq_irqs_request(struct dh_core_dev *dh_dev, struct dh_irq **vq_irqs, int32_t vq_channels); +void zxdh_pf_affinity_irqs_release(struct dh_core_dev *dh_dev, struct dh_irq **vq_irqs, int32_t num_irqs); +void zxdh_enable_irq(struct dh_core_dev *dh_dev, int32_t irq_index); + +int32_t zxdh_pf_async_eq_enable(struct dh_core_dev *dev, struct dh_eq_async *eq, const char *name, bool attach); +void zxdh_pf_set_pf_link_up(struct dh_core_dev *dh_dev, bool link_up); +bool zxdh_pf_get_pf_link_up(struct dh_core_dev *dh_dev); +void zxdh_pf_set_vf_link_info(struct dh_core_dev *dh_dev, uint16_t vf_idx, uint8_t link_up); +void zxdh_pf_get_link_info_from_vqm(struct dh_core_dev *dh_dev, uint8_t *link_up); +void zxdh_pf_set_pf_phy_port(struct dh_core_dev *dh_dev, uint8_t phy_port); +uint8_t zxdh_pf_get_pf_phy_port(struct dh_core_dev *dh_dev); + +#define ZXDH_PF_ASYNC_IRQ_NUM 5 +struct dh_pf_eq_table { + struct dh_irq **vq_irqs; + int32_t vq_irq_num; + struct list_head vqs_eqs_list; + struct dh_irq *async_irq_tbl[ZXDH_PF_ASYNC_IRQ_NUM]; + struct dh_eq_async async_eq_tbl[ZXDH_PF_ASYNC_IRQ_NUM]; +}; + +struct dh_pf_async_irq_table +{ + char name[64]; + notifier_fn_t async_int; +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_pf/events.c b/src/net/drivers/net/ethernet/dinghai/en_pf/events.c new file mode 100644 index 0000000..319132d --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_pf/events.c @@ -0,0 +1,318 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "events.h" +#include "../en_pf.h" +#include "../msg_common.h" +#include "eq.h" + +static int32_t riscv2pf_notifier(struct notifier_block *, unsigned long, void *); +static int32_t riscv_ready_notifier(struct notifier_block *, unsigned long, void *); +static int32_t vf2pf_notifier(struct notifier_block *, unsigned long, void *); +static int32_t riscv_ext_pps_notifier(struct notifier_block *, unsigned long, void *); +static int32_t riscv_local_pps_notifier(struct notifier_block *nb, unsigned long type, void *data); + +extern irqreturn_t msix_extern_pps_irq_from_risc_handler(struct zxdh_pf_device *dev); +extern irqreturn_t msix_local_pps_irq_from_risc_handler(struct zxdh_pf_device *dev); + +static struct dh_nb pf_events[] = { + {.nb.notifier_call = riscv_ready_notifier, .event_type = DH_EVENT_TYPE_RISCV_READY}, + {.nb.notifier_call = vf2pf_notifier, .event_type = DH_EVENT_TYPE_NOTIFY_VF_TO_PF}, + {.nb.notifier_call = riscv_ext_pps_notifier, .event_type = DH_EVENT_TYPE_NOTIFY_RISC_EXT_PPS}, + {.nb.notifier_call = riscv_local_pps_notifier, .event_type = DH_EVENT_TYPE_NOTIFY_RISC_LOCAL_PPS}, + {.nb.notifier_call = riscv2pf_notifier, .event_type = DH_EVENT_TYPE_NOTIFY_ANY}, +}; + +static int32_t riscv2pf_notifier(struct notifier_block *nb, unsigned long type, void *data) +{ + struct dh_event_nb *event_nb = dh_nb_cof(nb, struct dh_event_nb, nb); + struct dh_core_dev *dh_dev = (struct dh_core_dev *)event_nb->ctx; + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + zxdh_events_work_enqueue(dh_dev, &pf_dev->riscv2pf_msg_proc_work); + + return NOTIFY_OK; +} + +static int32_t riscv_ready_notifier(struct notifier_block *nb, unsigned long type, void *data) +{ + struct dh_event_nb *event_nb = dh_nb_cof(nb, struct dh_event_nb, nb); + struct dh_core_dev *dh_dev = (struct dh_core_dev *)event_nb->ctx; + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + uint64_t virt_addr = pf_dev->pci_ioremap_addr[0] + ZXDH_BAR_MSG_OFFSET; + zxdh_bar_reset_valid(virt_addr); + zxdh_events_work_enqueue(dh_dev, &pf_dev->riscv_ready_work); + + return NOTIFY_OK; +} + +static int32_t vf2pf_notifier(struct notifier_block *nb, unsigned long type, void *data) +{ + struct dh_event_nb *event_nb = dh_nb_cof(nb, struct dh_event_nb, nb); + struct dh_core_dev *dh_dev = (struct dh_core_dev *)event_nb->ctx; + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + LOG_INFO("is called\n"); + + zxdh_events_work_enqueue(dh_dev, &pf_dev->vf2pf_msg_proc_work); + + return NOTIFY_OK; +} + +static int32_t riscv_ext_pps_notifier(struct notifier_block *nb, unsigned long type, void *data) +{ + struct dh_event_nb *event_nb = dh_nb_cof(nb, struct dh_event_nb, nb); + struct dh_core_dev *dh_dev = (struct dh_core_dev *)event_nb->ctx; + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + LOG_INFO("is called\n"); + + zxdh_events_work_enqueue(dh_dev, &pf_dev->riscv_ext_pps_work); + + return NOTIFY_OK; +} + +static int32_t riscv_local_pps_notifier(struct notifier_block *nb, unsigned long type, void *data) +{ + struct dh_event_nb *event_nb = dh_nb_cof(nb, struct dh_event_nb, nb); + struct dh_core_dev *dh_dev = (struct dh_core_dev *)event_nb->ctx; + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + LOG_INFO("is called\n"); + + zxdh_events_work_enqueue(dh_dev, &pf_dev->riscv_local_pps_work); + + return NOTIFY_OK; +} + +extern int32_t zxdh_plug_aux_dev(struct dh_core_dev *dh_dev); + +static void riscv2pf_msg_proc_work_handler(struct work_struct *_work) +{ + struct zxdh_pf_device *pf_dev = container_of(_work, struct zxdh_pf_device, riscv2pf_msg_proc_work); + + uint16_t src = MSG_CHAN_END_RISC; + uint16_t dst = MSG_CHAN_END_PF; + uint64_t virt_addr = pf_dev->pci_ioremap_addr[0] + ZXDH_BAR_MSG_OFFSET; + + ZXDH_AUX_COMP_FLAG_CHECK(pf_dev); + + zxdh_bar_irq_recv(src, dst, virt_addr, NULL); +} + +static void vf2pf_msg_proc_work_handler(struct work_struct *_work) +{ + struct zxdh_pf_device *pf_dev = container_of(_work, struct zxdh_pf_device, vf2pf_msg_proc_work); + + uint16_t src = MSG_CHAN_END_VF; + uint16_t dst = MSG_CHAN_END_PF; + uint64_t virt_addr = pf_dev->pci_ioremap_addr[0] + ZXDH_BAR_MSG_OFFSET + ZXDH_BAR_PFVF_MSG_OFFSET; + + ZXDH_AUX_COMP_FLAG_CHECK(pf_dev); + + zxdh_bar_irq_recv(src, dst, virt_addr, pf_dev); +} + +static void riscv_ready_work_handler(struct work_struct *_work) +{ + struct zxdh_pf_device *pf_dev = container_of(_work, struct zxdh_pf_device, riscv_ready_work); + struct dh_core_dev * dh_dev = container_of((void*)pf_dev, struct dh_core_dev, priv); + + ZXDH_AUX_COMP_FLAG_CHECK(pf_dev); + + zxdh_plug_aux_dev(dh_dev); +} + + +int32_t findFirstSetBit(uint8_t link_up_val) { + uint8_t i = 0; + for ( ; i < 8; i++) + { + if (link_up_val & (1 << i)) + { + return i; // 返回第一个设置位的位置 + } + } + return -1; // 没有找到 +} + +int32_t get_link_up_phyport(uint8_t link_up_val,struct zxdh_pf_device *pf_dev, uint8_t *phyport_val) +{ + int16_t first_link_up_idx = -1; + uint8_t port_num = pf_dev->port_resource.pannel_num; + struct zxdh_pannle_port *port; + int32_t idx = 0; + + first_link_up_idx = findFirstSetBit(link_up_val); + if(first_link_up_idx<0) + { + return -1; + } + //基于first_link_up_idx找到phyport值TODO:待完善 + for (idx = 0; idx < port_num; idx++) + { + port = &pf_dev->port_resource.port[idx]; + if (port->link_check_bit == first_link_up_idx) + { + *phyport_val = port->phyport; + LOG_INFO("first link_up idx %d <-> phyport 0x%x\n", first_link_up_idx, port->phyport); + return 0; + } + } + + return -1; +} + +static void link_info_irq_update_vf_bond_pf_work_handler(struct work_struct *_work) +{ + struct zxdh_pf_device *pf_dev = container_of(_work, struct zxdh_pf_device, link_info_irq_update_vf_bond_pf_work); + struct dh_core_dev * dh_dev = container_of((void*)pf_dev, struct dh_core_dev, priv); + struct zxdh_vf_item *vf_item = NULL; + int32_t err = 0; + uint16_t vf_idx = 0; + struct pci_dev *pdev = dh_dev->pdev; + uint16_t num_vfs = 0; + uint8_t link_up_val = 0; + uint8_t phyport_val = 0; + uint8_t link_info = 0; + uint16_t func_no = 0; + uint16_t pf_no = FIND_PF_ID(pf_dev->pcie_id); + union zxdh_msg msg = {0}; + + ZXDH_AUX_COMP_FLAG_CHECK(pf_dev); + + zxdh_pf_get_link_info_from_vqm(dh_dev, &link_up_val); + LOG_INFO("[pf_level] bond_pf pcie_id:0x%x read from VQM, val: 0x%x\n", pf_dev->pcie_id, link_up_val); + pf_dev->link_up = (link_up_val == 0) ? FALSE : TRUE; + + if(pf_dev->link_up) + { + if(get_link_up_phyport(link_up_val, pf_dev, &phyport_val)<0) + { + LOG_ERR("failed to get link up phyport\n"); + return; + } + link_up_val = 1; + } + + link_info = (phyport_val & 0x0F) << 4 | (link_up_val & 0x0F); + msg.payload.hdr_to_agt.op_code = AGENT_DEV_STATUS_NOTIFY; + msg.payload.hdr_to_agt.pcie_id = pf_dev->pcie_id; + num_vfs = pci_num_vf(pdev); + for (vf_idx = 0; vf_idx < num_vfs; vf_idx++) + { + vf_item = zxdh_pf_get_vf_item(dh_dev, vf_idx); + if(vf_item->link_forced == FALSE && vf_item->is_probed) + { + func_no = GET_FUNC_NO(pf_no, vf_idx); + msg.payload.pcie_msix_msg.func_no[msg.payload.pcie_msix_msg.num++] = func_no; + zxdh_pf_set_vf_link_info(dh_dev, vf_idx, link_info); + LOG_INFO("[pf_level] bond_pf pcie_id:0x%x write phyport[0x%x] and link_up[%d] to VF[%d] VQM[0x%x]\n", pf_dev->pcie_id, phyport_val, link_up_val, vf_idx, link_info); + } + } + LOG_INFO("vf num:%d\n",msg.payload.pcie_msix_msg.num); + if(msg.payload.pcie_msix_msg.num > 0) + { + err = zxdh_pf_msg_send_cmd(dh_dev, MODULE_MAC, &msg, &msg, true); + if (err != 0) + { + LOG_ERR("failed to update VF link info\n"); + } + } +} + +static void riscv_extern_pps_handler(struct work_struct *_work) +{ + struct zxdh_pf_device *pf_dev = container_of(_work, struct zxdh_pf_device, riscv_ext_pps_work); + + msix_extern_pps_irq_from_risc_handler(pf_dev); +} + +static void riscv_local_pps_handler(struct work_struct *_work) +{ + struct zxdh_pf_device *pf_dev = container_of(_work, struct zxdh_pf_device, riscv_local_pps_work); + + msix_local_pps_irq_from_risc_handler(pf_dev); +} + +int32_t dh_pf_events_init(struct dh_core_dev *dev) +{ + struct dh_events *events = NULL; + struct zxdh_pf_device *pf_dev = dh_core_priv(dev); + int32_t i = 0; + int32_t ret = 0; + uint32_t evt_num = ARRAY_SIZE(pf_events); + + if (pf_dev->bond_num != 0) + { + evt_num -= 1; + } + events = kzalloc((sizeof(*events) + evt_num * sizeof(struct dh_event_nb)), GFP_KERNEL); + if (unlikely(events == NULL)) + { + LOG_ERR("events kzalloc failed: %p\n", events); + ret = -ENOMEM; + goto err_events_kzalloc; + } + + events->evt_num = evt_num; + events->dev = dev; + dev->events = events; + events->wq = create_singlethread_workqueue("dh_pf_events"); + if (!events->wq) + { + LOG_ERR("events->wq create_singlethread_workqueue failed: %p\n", events->wq); + ret = -ENOMEM; + goto err_create_wq; + } + + INIT_WORK(&pf_dev->riscv_ready_work, riscv_ready_work_handler); + INIT_WORK(&pf_dev->riscv2pf_msg_proc_work, riscv2pf_msg_proc_work_handler); + INIT_WORK(&pf_dev->vf2pf_msg_proc_work, vf2pf_msg_proc_work_handler); + INIT_WORK(&pf_dev->link_info_irq_update_vf_bond_pf_work, link_info_irq_update_vf_bond_pf_work_handler); + INIT_WORK(&pf_dev->riscv_ext_pps_work, riscv_extern_pps_handler); + INIT_WORK(&pf_dev->riscv_local_pps_work, riscv_local_pps_handler); + + for (i = 0; i < evt_num; i++) + { + events->notifiers[i].nb = pf_events[i]; + events->notifiers[i].ctx = dev; + dh_eq_notifier_register(&dev->eq_table, &events->notifiers[i].nb); + } + + return 0; + +err_create_wq: + kfree(events); +err_events_kzalloc: + return ret; +} + +void dh_pf_events_uninit(struct dh_core_dev *dev) +{ + struct dh_events *events = dev->events; + int32_t i = 0; + + for (i = events->evt_num - 1; i >= 0 ; i--) + { + dh_eq_notifier_unregister(&dev->eq_table, &events->notifiers[i].nb); + } + + zxdh_events_cleanup(dev); + return; +} + + +void dh_pf_sriov_cap_cfg_uninit(struct dh_core_dev *dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dev); + if (dev->coredev_type == DH_COREDEV_PF && pf_dev->pf_sriov_cap_base != NULL) + { + iounmap((void *)pf_dev->pf_sriov_cap_base); + pf_dev->pf_sriov_cap_base = NULL; + } + return; +} \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_pf/events.h b/src/net/drivers/net/ethernet/dinghai/en_pf/events.h new file mode 100644 index 0000000..9905db9 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_pf/events.h @@ -0,0 +1,17 @@ +#ifndef __ZXDH_PF_EVENTS_H__ +#define __ZXDH_PF_EVENTS_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +int32_t dh_pf_events_init(struct dh_core_dev *dev); +void dh_pf_events_uninit(struct dh_core_dev *dev); +void dh_pf_sriov_cap_cfg_uninit(struct dh_core_dev *dev); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_pf/irq.c b/src/net/drivers/net/ethernet/dinghai/en_pf/irq.c new file mode 100755 index 0000000..c6bcb9e --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_pf/irq.c @@ -0,0 +1,180 @@ +#include +#include +#include +#include "irq.h" +#include "eq.h" + +#define ZXDH_PF_ASYNC_IRQ_MIN_COMP 0 +#define ZXDH_PF_ASYNC_IRQ_MAX_COMP 19 + +#define ZXDH_PF_RDMA_IRQ_MIN 0 +#define ZXDH_PF_RDMA_IRQ_MAX 12 + +#define ZXDH_PF_COMP_IRQ_MIN_COMP 0 +#define ZXDH_PF_COMP_IRQ_MAX_COMP 1 + +#define ZXDH_PF_VQ_IRQ_MIN 0 +#define ZXDH_PF_VQ_IRQ_MAX 33 + + +struct dh_irq_range { + int32_t start; + int32_t size; +}; + +static struct dh_irq_range __attribute__((unused)) dh_get_pf_range(struct dh_core_dev *dev) +{ + struct dh_irq_range tmp = { + .start = 0, + .size = 0 + }; + + return tmp; +} + +static int32_t irq_pools_init(struct dh_core_dev *dev, int vq_n, int pf_async_vec) +{ + struct dh_irq_table *table = &dev->irq_table; + struct dh_pf_irq_table *pf_irq_table = (struct dh_pf_irq_table *)table->priv; + int32_t err = 0; + struct dh_irq_range irq_range; + + if(vq_n > 0) + { + irq_range.start = ZXDH_VQS_IRQ_START_IDX; + irq_range.size = vq_n; + + pf_irq_table->pf_vq_pool = irq_pool_alloc(dev, irq_range.start, + irq_range.size, "zxdh_pf_vq", + ZXDH_PF_VQ_IRQ_MIN, + ZXDH_PF_VQ_IRQ_MAX); + if (IS_ERR_OR_NULL(pf_irq_table->pf_vq_pool)) + { + LOG_ERR("pf_irq_table->pf_vq_pool irq_pool_alloc failed\n"); + return PTR_ERR(pf_irq_table->pf_vq_pool); + } + + pf_irq_table->pf_vq_pool->irqs_per_cpu = kcalloc(nr_cpu_ids, sizeof(u16), GFP_KERNEL); + if (unlikely(pf_irq_table->pf_vq_pool->irqs_per_cpu == NULL)) + { + LOG_ERR("pf_irq_table->pf_vq_pool->irqs_per_cpu kcalloc failed\n"); + err = -ENOMEM; + goto err_irqs_per_cpu; + } + } + + if (pf_async_vec > 0) + { + irq_range.start = 0; + irq_range.size = pf_async_vec; + pf_irq_table->pf_async_pool = irq_pool_alloc(dev, irq_range.start, irq_range.size, "zxdh_pf_async", + ZXDH_PF_ASYNC_IRQ_MIN_COMP, + ZXDH_PF_ASYNC_IRQ_MAX_COMP); + if (IS_ERR_OR_NULL(pf_irq_table->pf_async_pool)) + { + LOG_ERR("pf_irq_table->pf_async_pool irq_pool_alloc failed\n"); + err = PTR_ERR(pf_irq_table->pf_async_pool); + goto err_irqs_per_cpu; + } + } + + irq_range.start = ZXDH_RDMA_IRQ_START_IDX; + irq_range.size = ZXDH_RDMA_CHANNELS_NUM; + pf_irq_table->pf_rdma_pool = irq_pool_alloc(dev, irq_range.start, irq_range.size, "zxdh_pf_rdma", + ZXDH_PF_RDMA_IRQ_MIN, + ZXDH_PF_RDMA_IRQ_MAX); + if (IS_ERR_OR_NULL(pf_irq_table->pf_rdma_pool)) + { + LOG_ERR("pf_irq_table->pf_rdma_pool irq_pool_alloc failed\n"); + err = PTR_ERR(pf_irq_table->pf_rdma_pool); + goto err_pf_rdma; + } + + return 0; + +err_pf_rdma: + irq_pool_free(pf_irq_table->pf_async_pool); +err_irqs_per_cpu: + irq_pool_free(pf_irq_table->pf_vq_pool); + return err; +} + +static void irq_pools_destroy(struct dh_irq_table *table) +{ + struct dh_pf_irq_table* pf_irq_table = NULL; + + pf_irq_table = (struct dh_pf_irq_table*)table->priv; + pf_irq_table->pf_vq_pool ? irq_pool_free(pf_irq_table->pf_vq_pool) : 0; + pf_irq_table->pf_async_pool ? irq_pool_free(pf_irq_table->pf_async_pool) : 0; + pf_irq_table->pf_rdma_pool ? irq_pool_free(pf_irq_table->pf_rdma_pool) : 0; +} + +static int32_t zxdh_get_total_vec(struct dh_core_dev *dev) +{ + return ZXDH_VQS_CHANNELS_NUM + ZXDH_ASYNC_CHANNELS_NUM + ZXDH_RDMA_CHANNELS_NUM; +} + +int32_t dh_pf_irq_table_create(struct dh_core_dev *dev) +{ + int32_t total_vec = 0; + int32_t err = 0; + + total_vec = zxdh_get_total_vec(dev); + + total_vec = pci_alloc_irq_vectors(dev->pdev, total_vec, total_vec, PCI_IRQ_MSIX); + if (total_vec < 0) + { + LOG_ERR("pci_alloc_irq_vectors failed: %d\n", total_vec); + return total_vec; + } + + err = irq_pools_init(dev, ZXDH_VQS_CHANNELS_NUM, ZXDH_ASYNC_CHANNELS_NUM); + if (err != 0) + { + LOG_ERR("irq_pools_init failed: %d\n", err); + pci_free_irq_vectors(dev->pdev); + } + + return err; +} + +void dh_pf_irq_table_destroy(struct dh_core_dev *dev) +{ + struct dh_irq_table *table = &dev->irq_table; + + /* There are cases where IRQs still will be in used when we reaching + * to here. Hence, making sure all the irqs are released. + */ + irq_pools_destroy(table); + pci_free_irq_vectors(dev->pdev); +} + +struct dh_irq *dh_pf_async_irq_request(struct dh_core_dev *dev) +{ + struct dh_irq_table *table = &dev->irq_table; + struct dh_pf_irq_table* pf_irq_table; + + pf_irq_table = (struct dh_pf_irq_table*)table->priv; + + return pf_irq_table->pf_async_pool ? zxdh_get_irq_of_pool(dev, pf_irq_table->pf_async_pool) : NULL; +} + +/* irq_table API */ +int32_t dh_pf_irq_table_init(struct dh_core_dev *dev) +{ + struct dh_irq_table *irq_table; + struct dh_pf_irq_table* pf_irq_table = NULL; + + irq_table = &dev->irq_table; + + pf_irq_table = kvzalloc(sizeof(*pf_irq_table), GFP_KERNEL); + if (unlikely(pf_irq_table == NULL)) + { + LOG_ERR("pf_irq_table kvzalloc failed\n"); + return -ENOMEM; + } + + irq_table->priv = pf_irq_table; + + return 0; +} \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_pf/irq.h b/src/net/drivers/net/ethernet/dinghai/en_pf/irq.h new file mode 100755 index 0000000..6cacd5c --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_pf/irq.h @@ -0,0 +1,27 @@ +#ifndef __ZXDH_PF_IRQ_H__ +#define __ZXDH_PF_IRQ_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +struct dh_irq *dh_pf_async_irq_request(struct dh_core_dev *dev); +int32_t dh_pf_irq_table_create(struct dh_core_dev *dev); +void dh_pf_irq_table_destroy(struct dh_core_dev *dev); +int32_t dh_pf_irq_table_init(struct dh_core_dev *dev); + +struct dh_pf_irq_table { + struct dh_irq_pool *sf_comp_pool; + struct dh_irq_pool *pf_async_pool; + struct dh_irq_pool *pf_rdma_pool; + struct dh_irq_pool *pf_vq_pool; +}; + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_pf/msg_func.c b/src/net/drivers/net/ethernet/dinghai/en_pf/msg_func.c new file mode 100644 index 0000000..7ce3c32 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_pf/msg_func.c @@ -0,0 +1,1473 @@ +#include +#include +#include "../msg_common.h" +#include "../en_pf.h" +#include "../en_aux/en_cmd.h" +#include "../en_aux.h" +#include "../en_np/init/include/dpp_np_init.h" +#include "eq.h" +#include "msg_func.h" + +#define FUNC_NAME_SIZE_MAX 32 + +typedef uint32_t (*zxdh_vf_msg_func)(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev); + +typedef struct +{ + zxdh_msg_op_code op_code; + uint8_t proc_name[FUNC_NAME_SIZE_MAX]; + zxdh_vf_msg_func msg_proc; +} zxdh_vf_msg_proc; + +void zxdh_u32_array_print(uint32_t *array, uint16_t size) +{ + uint16_t i; + + for (i = 0; i < size; ++i) + { + printk(KERN_CONT "%u ", array[i]); + if ((i + 1) % 8 == 0) + { + printk(KERN_CONT "\n"); + } + } +} +EXPORT_SYMBOL(zxdh_u32_array_print); + +static void zxdh_vf_link_state_get_proc(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + int vf_idx = msg->hdr.pcie_id & (0xff); + uint32_t dev_link_up_reg = 0; + uint8_t vf_link_up = 0; + + if(vf_item->link_forced) + { + vf_link_up = vf_item->link_up ? 1 : 0; + } + else + { + vf_link_up = pf_dev->link_up ? 1 : 0; + } + + dev_link_up_reg = ioread32((void __iomem *)(pf_dev->pf_sriov_cap_base + (pf_dev->sriov_bar_size) * vf_idx + ZXDH_DEV_MAC_HIGH_OFFSET)); + dev_link_up_reg = (dev_link_up_reg & ~(0xFF << 16)) | ((uint32_t)(vf_link_up) << 16); + iowrite32(dev_link_up_reg, (void __iomem *)(pf_dev->pf_sriov_cap_base + (pf_dev->sriov_bar_size) * vf_idx + ZXDH_DEV_MAC_HIGH_OFFSET)); + + LOG_INFO("vf[%d] link_forced is [%s], link state[%s] update ok.\n", vf_idx, vf_item->link_forced?"TRUE":"FALSE", (vf_link_up==1)?"UP":"DOWN"); + +} + +int32_t zxdh_vf_flush_mac(DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item) +{ + int32_t err = 0; + uint8_t i = 0; + uint8_t *addr = NULL; + + /* 删除此VF的所有单播mac地址 */ + for (i = 0; i < DEV_UNICAST_MAX_NUM; ++i) + { + addr = vf_item->vf_mac_info.unicast_mac[i]; + + if (!is_zero_ether_addr(addr)) /* mac不全为0 */ + { +#ifdef MAC_CONFIG_DEBUG + LOG_INFO("the deleted unicast mac is %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",\ + addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); +#endif /* MAC_CONFIG_DEBUG */ + + err = dpp_del_mac(pf_info, addr); + if (err != 0) + { + LOG_ERR("dpp_del_mac failed\n"); + return err; + } + } + } + + /* 删除此VF的所有组播mac地址 */ + for (i = 0; i < DEV_MULTICAST_MAX_NUM; ++i) + { + addr = vf_item->vf_mac_info.multicast_mac[i]; + + if (!is_zero_ether_addr(addr)) /* mac不全为0 */ + { +#ifdef MAC_CONFIG_DEBUG + LOG_INFO("the deleted multicasat mac is %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",\ + addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); +#endif /* MAC_CONFIG_DEBUG */ + + err = dpp_multi_mac_del_member(pf_info, addr); + if (err != 0) + { + LOG_ERR("dpp_multi_mac_del_member failed\n"); + return err; + } + } + } + + /* 将vf_mac_info结构体全部清零 */ + memset(&vf_item->vf_mac_info, 0, sizeof(vf_item->vf_mac_info)); + + return err; +} + +static uint32_t zxdh_vf_port_init(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + uint32_t ret = 0; + uint8_t mac[6] = {0}; + + ret = dpp_vport_create(pf_info); + if (ret != 0) + { + LOG_ERR("dpp_vport_create failed, ret: %d\n", ret); + return ret; + } + + if (msg->vf_init_msg.is_upf) + { + ret = dpp_egr_port_attr_set(pf_info, EGR_FLAG_LAG_ID, 0); + if (ret != 0) + { + LOG_ERR("dpp_egr_port_attr_set panel_id %d failed: %d\n", pf_dev->phy_port, ret); + goto err_init; + } + + ret = dpp_egr_port_attr_set(pf_info, EGR_FLAG_LAG_EN_OFF, 1); + if (ret != 0) + { + LOG_ERR("dpp_egr_port_attr_set hash_search_idx %u failed: %d\n", msg->vf_init_msg.hash_search_idx, ret); + goto err_init; + } + } + else + { + ret = dpp_egr_port_attr_set(pf_info, EGR_FLAG_PANEL_ID, pf_dev->phy_port); + if (ret != 0) + { + LOG_ERR("dpp_egr_port_attr_set panel_id %d failed: %d\n", pf_dev->phy_port, ret); + goto err_init; + } + } + + ret = dpp_egr_port_attr_set(pf_info, EGR_FLAG_HASH_SEARCH_INDEX, msg->vf_init_msg.hash_search_idx); + if (ret != 0) + { + LOG_ERR("dpp_egr_port_attr_set hash_search_idx %u failed: %d\n", msg->vf_init_msg.hash_search_idx, ret); + goto err_init; + } + + ret = dpp_vport_bond_pf(pf_info); + if (ret != 0) + { + LOG_ERR("dpp_vport_bond_pf failed, ret: %d\n", ret); + goto err_init; + } + + ret = dpp_vport_rss_en_set(pf_info, msg->vf_init_msg.rss_enable); + if (ret != 0) + { + LOG_ERR("dpp_vport_rss_en_set failed, ret: %d\n", ret); + goto err_init; + } + + ret = dpp_vport_hash_funcs_set(pf_info, ZXDH_FUNC_TOP); + if (ret != 0) + { + LOG_ERR("dpp_vport_hash_funcs_set failed, ret: %d\n", ret); + goto err_init; + } + + ret = dpp_rx_flow_hash_set(pf_info, ZXDH_NET_RX_FLOW_HASH_SDFNT); + if (ret != 0) + { + LOG_ERR("dpp_rx_flow_hash_set failed, ret: %d\n", ret); + goto err_init; + } + + ret = dpp_egr_port_attr_set(pf_info, EGR_FLAG_VEPA_EN_OFF, (uint32_t)pf_dev->vepa); + if (ret != 0) + { + LOG_ERR("dpp_egr_port_attr_set vport(0x%x) %s mode failed: %d\n", msg->hdr.vport, pf_dev->vepa?"vepa":"veb", ret); + goto err_init; + } + LOG_INFO("Initialize vport(0x%x) to %s mode\n", msg->hdr.vport, pf_dev->vepa?"vepa":"veb"); + + ret = dpp_egr_port_attr_set(pf_info, EGR_FLAG_PORT_BASE_QID, msg->vf_init_msg.base_qid); + if (ret != 0) + { + LOG_ERR("set_base_qid %d failed: %d\n", msg->vf_init_msg.base_qid, ret); + goto err_init; + } + + ret = dpp_egr_port_attr_set(pf_info, EGR_FLAG_SPOOFCHK_EN_OFF, vf_item->spoofchk); + if (0 != ret) + { + LOG_ERR("dpp_egr_port_attr_set spookchk %s failed: %d\n", vf_item->spoofchk? "on":"off", ret); + goto err_init; + } + + ret = dpp_egr_port_attr_set(pf_info, EGR_FLAG_IPV4_TCP_ASSEMBLE, 1); + if (ret != 0) + { + LOG_ERR("dpp_egr_port_attr_set tcp assemble failed: %d\n", ret); + goto err_init; + } + + ret = dpp_egr_port_attr_set(pf_info, EGR_FLAG_IPV6_TCP_ASSEMBLE, 1); + if (ret != 0) + { + LOG_ERR("dpp_egr_port_attr_set tcp assemble failed: %d\n", ret); + goto err_init; + } + + ret = dpp_egr_port_attr_set(pf_info, EGR_FLAG_IP_CHKSUM, 1); + if (ret != 0) + { + LOG_ERR("dpp_egr_port_attr_set rx ip checksum failed: %d\n", ret); + goto err_init; + } + + ret = dpp_egr_port_attr_set(pf_info, EGR_FLAG_TCP_UDP_CHKSUM, 1); + if (ret != 0) + { + LOG_ERR("dpp_egr_port_attr_set rx l4 checksum failed: %d\n", ret); + goto err_init; + } + + ret = dpp_egr_port_attr_set(pf_info, EGR_FLAG_ACCELERATOR_OFFLOAD_FLAG, 1); + if (ret != 0) + { + LOG_ERR("dpp_egr_port_attr_set accelerator offload failed: %d\n", ret); + goto err_init; + } + + ret = dpp_egr_port_attr_set(pf_info, EGR_FLAG_OUTER_IP_CHECKSUM_OFFLOAD, 1); + if (ret != 0) + { + LOG_ERR("dpp_egr_port_attr_set vxlan outer ip checksum failed: %d\n", ret); + goto err_init; + } + ret = dpp_vport_vlan_filter_en_set(pf_info, 0); + if (ret != 0) + { + LOG_ERR("dpp_vport_vlan_filter_en_set failed, ret: %d\n", ret); + goto err_init; + } + + ret = dpp_vlan_filter_init(pf_info); + if (ret != 0) + { + LOG_ERR("dpp_vlan_filter_init failed: %d\n", ret); + goto err_init; + } + + ret = zxdh_vf_flush_mac(pf_info, vf_item); + if (ret != 0) + { + goto err_init; + } + + ether_addr_copy(mac, vf_item->mac); + if (is_zero_ether_addr(mac)) + { + get_random_bytes(mac, 6); + mac[0] &= 0xfe; + LOG_INFO("vf set random mac %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + } + LOG_INFO("zxdh_vf_port_init mac %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + ret = dpp_add_mac(pf_info, mac); + if (ret != 0) + { + LOG_ERR("dpp_add_mac failed, ret: %d\n", ret); + return ret; + } + + dpp_vport_uc_promisc_set(pf_info, 0); + dpp_vport_mc_promisc_set(pf_info, 0); + + ether_addr_copy(vf_item->vf_mac_info.unicast_mac[0], mac); + ether_addr_copy(reps->vf_init_msg.mac_addr, mac); + reps->vf_init_msg.phy_port = pf_dev->phy_port; + reps->vf_init_msg.link_up = pf_dev->link_up; + reps->vf_init_msg.speed = pf_dev->speed; + reps->vf_init_msg.duplex = pf_dev->duplex; + reps->vf_init_msg.autoneg_enable = pf_dev->autoneg_enable; + reps->vf_init_msg.sup_link_modes = pf_dev->supported_speed_modes; + reps->vf_init_msg.adv_link_modes = pf_dev->advertising_speed_modes; + + zxdh_vf_link_state_get_proc(msg, reps, pf_info, vf_item, pf_dev); + vf_item->is_probed = true; + return 0; + +err_init: + dpp_vport_delete(pf_info); + return ret; +} + +static uint32_t zxdh_vf_port_uninit(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + int32_t ret = 0; + + dpp_vport_uc_promisc_set(pf_info, 0); + dpp_vport_mc_promisc_set(pf_info, 0); + + ret = zxdh_vf_flush_mac(pf_info, vf_item); + if (ret != 0) + { + LOG_ERR("zxdh_vf_flush_macf failed, ret: %d\n", ret); + return ret; + } + + ret = dpp_vport_unbond_pf(pf_info); + if (ret != 0) + { + LOG_ERR("dpp_vport_unbond_pf failed, ret: %d\n", ret); + return ret; + } + + ret = dpp_vport_delete(pf_info); + if (ret != 0) + { + LOG_ERR("dpp_vport_delete failed, ret: %d\n", ret); + return ret; + } + + ret = dpp_vport_unregister(pf_info); + if (ret != 0) + { + LOG_ERR("dpp_vport_unregister failed, ret: %d\n", ret); + return ret; + } + + vf_item->is_probed = false; + return ret; +} + +void zxdh_vf_item_mac_add(struct zxdh_vf_item *vf_item, uint8_t *mac_addr) +{ + uint8_t *addr = NULL; + uint8_t i = 0; + + if (is_unicast_ether_addr(mac_addr)) + { + for (i = 1; i < DEV_UNICAST_MAX_NUM; ++i) + { + addr = vf_item->vf_mac_info.unicast_mac[i]; + if (is_zero_ether_addr(addr)) /*查询没使用的数组*/ + { + /* 将此mac添加到zxdh_vf_item中 */ + memcpy(addr, mac_addr, ETH_ALEN); + break; + } + } + } + else + { + for (i = 0; i < DEV_MULTICAST_MAX_NUM; ++i) + { + addr = vf_item->vf_mac_info.multicast_mac[i]; + + if (is_zero_ether_addr(addr)) + { + /* 将此mac添加到zxdh_vf_item中 */ + memcpy(addr, mac_addr, ETH_ALEN); + break; + } + } + } + + return; +} + +void zxdh_vf_item_mac_del(struct zxdh_vf_item *vf_item, uint8_t *mac_addr) +{ + uint8_t i = 0; + uint8_t *addr = NULL; + + if (is_unicast_ether_addr(mac_addr)) + { + for (i = 1; i < DEV_UNICAST_MAX_NUM; ++i) + { + /* 获取此mac地址 */ + addr = vf_item->vf_mac_info.unicast_mac[i]; + + if (ether_addr_equal(addr, mac_addr))/* 查询到此mac */ + { +#ifdef MAC_CONFIG_DEBUG + LOG_INFO("the mac is %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", \ + addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); +#endif /* MAC_CONFIG_DEBUG */ + + /* 在地址数组中将此mac清空*/ + memset(addr, 0, ETH_ALEN); + break; + } + } + } + else + { + for (i = 0; i < DEV_MULTICAST_MAX_NUM; ++i) + { + addr = vf_item->vf_mac_info.multicast_mac[i]; + + if (ether_addr_equal(addr, mac_addr))/* 查询到此mac */ + { +#ifdef MAC_CONFIG_DEBUG + LOG_INFO("the mac is %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", + addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); +#endif /* MAC_CONFIG_DEBUG */ + + /* 在地址数组中将此mac清空 */ + memset(addr, 0, ETH_ALEN); + break; + } + } + } + + return; +} + +static uint32_t zxdh_vf_mac_add(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + int32_t ret = 0; + + if (ether_addr_equal(vf_item->mac, msg->mac_addr_set_msg.mac_addr) || (vf_item->pf_set_mac && vf_item->trusted) || (vf_item->pf_set_mac == false)) + { + ether_addr_copy(vf_item->vf_mac_info.unicast_mac[0], msg->mac_addr_set_msg.mac_addr); + ether_addr_copy(vf_item->mac, msg->mac_addr_set_msg.mac_addr); + ret = dpp_add_mac(pf_info, msg->mac_addr_set_msg.mac_addr); + if (ret != 0) + { + LOG_ERR("dpp_add_mac failed, ret: %d\n", ret); + return ret; + } + } + else + { + LOG_ERR("zxdh_vf_mac_add failed, vf not Trusted\n"); + return -1; + } + + return ret; +} + +static uint32_t zxdh_vf_mac_del(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + int32_t ret = 0; + uint8_t i = 0; + uint8_t *addr = NULL; + + if (msg->mac_addr_set_msg.mac_flag == true) + { + if ((vf_item->pf_set_mac && vf_item->trusted) || (vf_item->pf_set_mac == false)) + { + eth_zero_addr(vf_item->mac); + ret = dpp_del_mac(pf_info, msg->mac_addr_set_msg.mac_addr); + if (ret != 0) + { + LOG_ERR("dpp_del_mac failed, ret: %d\n", ret); + return ret; + } + } + else + { + LOG_ERR("zxdh_vf_mac_del failed, vf not Trusted\n"); + return -1; + } + } + + if(msg->mac_addr_set_msg.mac_addr == vf_item->vf_mac_info.unicast_mac[0]) + { + for (i = 1; i < DEV_UNICAST_MAX_NUM; ++i) + { + addr = vf_item->vf_mac_info.unicast_mac[i]; + if (is_zero_ether_addr(addr)) + { + memcpy(addr, vf_item->vf_mac_info.unicast_mac[0], ETH_ALEN); + break; + } + } + } + + return ret; +} + +static uint32_t zxdh_vf_filter_mac_add(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + uint32_t err = 0; + +#ifdef MAC_CONFIG_DEBUG + /* 将获取到的mac地址配置到NP中 */ + LOG_INFO("msg->mac_addr_set_msg.mac_addr is %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", \ + msg->mac_addr_set_msg.mac_addr[0], msg->mac_addr_set_msg.mac_addr[1], \ + msg->mac_addr_set_msg.mac_addr[2], msg->mac_addr_set_msg.mac_addr[3], \ + msg->mac_addr_set_msg.mac_addr[4], msg->mac_addr_set_msg.mac_addr[5]); +#endif /*MAC_CONFIG_DEBUG */ + + err = dpp_add_mac(pf_info, msg->mac_addr_set_msg.mac_addr); + if (err != 0) + { + LOG_ERR("dpp_add_mac failed \n"); + return err; + } + + /* 将此mac地址添加到zxdh_vf_item */ + zxdh_vf_item_mac_add(vf_item, msg->mac_addr_set_msg.mac_addr); + + return err; +} + +static uint32_t zxdh_vf_filter_mac_del(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + uint32_t err = 0; + +#ifdef MAC_CONFIG_DEBUG + /* 将获取到的mac地址从NP中删除 */ + LOG_INFO("msg->mac_addr_set_msg.mac_addr is %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", \ + msg->mac_addr_set_msg.mac_addr[0], msg->mac_addr_set_msg.mac_addr[1], \ + msg->mac_addr_set_msg.mac_addr[2], msg->mac_addr_set_msg.mac_addr[3], \ + msg->mac_addr_set_msg.mac_addr[4], msg->mac_addr_set_msg.mac_addr[5]); +#endif /* MAC_CONFIG_DEBUG */ + + err = dpp_del_mac(pf_info, msg->mac_addr_set_msg.mac_addr); + if (err != 0) + { + LOG_ERR("dpp_mac_del failed\n"); + return err; + } + + /* 将此mac从zxdh_vf_item中删除 */ + zxdh_vf_item_mac_del(vf_item, msg->mac_addr_set_msg.mac_addr); + + return err; +} + +static uint32_t zxdh_vf_multi_mac_add(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + uint32_t err = 0; + +#ifdef MAC_CONFIG_DEBUG + /* 将此mac地址添加到np中 */ + LOG_INFO("msg->mac_addr_set_msg.mac_addr is %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", \ + msg->mac_addr_set_msg.mac_addr[0], msg->mac_addr_set_msg.mac_addr[1], \ + msg->mac_addr_set_msg.mac_addr[2], msg->mac_addr_set_msg.mac_addr[3], \ + msg->mac_addr_set_msg.mac_addr[4], msg->mac_addr_set_msg.mac_addr[5]); +#endif /* MAC_CONFIG_DEBUG*/ + + err = dpp_multi_mac_add_member(pf_info, msg->mac_addr_set_msg.mac_addr); + if (err != 0) + { + if (err == DPP_RC_TABLE_RANGE_INVALID) + { + LOG_ERR("multicast mac is beyond 32\n"); + return DPP_RC_TABLE_RANGE_INVALID; + } + LOG_ERR("dpp_multi_mac_add_member failed %d\n", err); + return err; + } + + /* 将此mac添加到zxdh_vf_item中 */ + zxdh_vf_item_mac_add(vf_item, msg->mac_addr_set_msg.mac_addr); + + return err; +} + +static uint32_t zxdh_vf_multi_mac_del(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + uint32_t err = 0; + +#ifdef MAC_CONFIG_DEBUG + LOG_INFO("msg->mac_addr_set_msg.mac_addr is %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", \ + msg->mac_addr_set_msg.mac_addr[0], msg->mac_addr_set_msg.mac_addr[1], \ + msg->mac_addr_set_msg.mac_addr[2], msg->mac_addr_set_msg.mac_addr[3], \ + msg->mac_addr_set_msg.mac_addr[4], msg->mac_addr_set_msg.mac_addr[5]); +#endif /* MAC_CONFIG_DEBUG */ + + /* 将此组播mac地址从np中删除 */ + err = dpp_multi_mac_del_member(pf_info, msg->mac_addr_set_msg.mac_addr); + if (err != 0) + { + LOG_INFO("dpp_multi_mac_del_member failed %d\n", err); + return err; + } + + /* 将此mac从zxdh_vf_item中删除 */ + zxdh_vf_item_mac_del(vf_item, msg->mac_addr_set_msg.mac_addr); + + return err; +} + +static uint32_t zxdh_vf_all_mac_add(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + /* 配置组播mac*/ + if (!is_unicast_ether_addr(msg->mac_addr_set_msg.mac_addr)) + { + return zxdh_vf_multi_mac_add(msg, reps, pf_info, vf_item, pf_dev); + } + + /* 配置本机mac*/ + if (msg->mac_addr_set_msg.filter_flag == UNFILTER_MAC) + { + return zxdh_vf_mac_add(msg, reps, pf_info, vf_item, pf_dev); + } + + /* 配置过滤用的单播mac*/ + return zxdh_vf_filter_mac_add(msg, reps, pf_info, vf_item, pf_dev); +} + +static uint32_t zxdh_vf_all_mac_del(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + /* 删除组播mac */ + if (!is_unicast_ether_addr(msg->mac_addr_set_msg.mac_addr)) + { + return zxdh_vf_multi_mac_del(msg, reps, pf_info, vf_item, pf_dev); + } + + /* 删除本机mac */ + if (msg->mac_addr_set_msg.filter_flag == UNFILTER_MAC) + { + return zxdh_vf_mac_del(msg, reps, pf_info, vf_item, pf_dev); + } + + /* 删除过滤用的单播mac*/ + return zxdh_vf_filter_mac_del(msg, reps, pf_info, vf_item, pf_dev); +} + +static uint32_t zxdh_vf_ipv6_mac_add(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + uint32_t err = 0; + + spin_lock_bh(&pf_dev->vf_ip6mac_lock); + + err = zxdh_vf_multi_mac_add(msg, reps, pf_info, vf_item, pf_dev); + if (err != 0) + { + LOG_ERR("zxdh_vf_multi_mac_add failed\n"); + } + + spin_unlock_bh(&pf_dev->vf_ip6mac_lock); + + return err; +} + +static uint32_t zxdh_vf_ipv6_mac_del(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + uint32_t err = 0; + + spin_lock_bh(&pf_dev->vf_ip6mac_lock); + + err = zxdh_vf_multi_mac_del(msg, reps, pf_info, vf_item, pf_dev); + if (err != 0) + { + LOG_ERR("zxdh_vf_multi_mac_del failed\n"); + } + + spin_unlock_bh(&pf_dev->vf_ip6mac_lock); + + return err; +} + +static uint32_t zxdh_vf_mac_get(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + ether_addr_copy(reps->vf_mac_addr_get_msg.mac_addr, vf_item->mac); + return 0; +} + +static uint32_t zxdh_vf_rss_state_set(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + return dpp_vport_rss_en_set(pf_info, msg->rss_enable_msg.rss_enable); +} + +static uint32_t zxdh_vf_rxfh_set(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + return dpp_rxfh_set(pf_info, msg->rxfh_set_msg.queue_map, ZXDH_INDIR_RQT_SIZE); +} + +static uint32_t zxdh_vf_rxfh_get(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + uint32_t err = 0; + + err = dpp_rxfh_get(pf_info, reps->rxfh_get_msg.queue_map, ZXDH_INDIR_RQT_SIZE); + if (err != 0) + { + LOG_ERR("dpp_rxfh_get failed: %d\n", err); + return err; + } + + return 0; +} + +static uint32_t zxdh_vf_rxfh_del(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + return dpp_rxfh_del(pf_info); +} + +static uint32_t zxdh_vf_thash_key_set(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + return dpp_thash_key_set(pf_info, msg->thash_key_set_msg.key_map, ZXDH_NET_HASH_KEY_SIZE); +} + +static uint32_t zxdh_vf_thash_key_get(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + return dpp_thash_key_get(pf_info, reps->thash_key_set_msg.key_map, ZXDH_NET_HASH_KEY_SIZE); +} + +static uint32_t zxdh_vf_hash_funcs_set(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + return dpp_vport_hash_funcs_set(pf_info, msg->hfunc_set_msg.func); +} + +static uint32_t zxdh_vf_rx_flow_hash_set(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + return dpp_rx_flow_hash_set(pf_info, msg->rx_flow_hash_set_msg.hash_mode); +} + +static uint32_t zxdh_vf_vlan_strip_set(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + if (msg->vlan_strip_msg.flag == VLAN_STRIP_MSG_TYPE) + { + return dpp_vport_vlan_strip_set(pf_info, msg->vlan_strip_msg.enable); + } + else + { + return dpp_vport_vlan_qinq_en_set(pf_info, msg->vlan_strip_msg.enable); + } +} + +static uint32_t zxdh_vf_qinq_tpid_cfg(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + return dpp_egr_port_attr_set(pf_info, EGR_FLAG_TPID, msg->tpid_cfg_msg.tpid); +} + +static uint32_t zxdh_vf_rx_flow_hash_get(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + return dpp_rx_flow_hash_get(pf_info, &reps->rx_flow_hash_set_msg.hash_mode); +} + +static uint32_t zxdh_vf_port_attrs_set(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + if (msg->port_attr_set_msg.mode == EGR_FLAG_TCP_UDP_CHKSUM) + { + dpp_egr_port_attr_set(pf_info, EGR_FLAG_IP_CHKSUM, msg->port_attr_set_msg.value); + } + + return dpp_egr_port_attr_set(pf_info, msg->port_attr_set_msg.mode, msg->port_attr_set_msg.value); +} + +static uint32_t zxdh_vf_port_attrs_get(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + return dpp_egr_port_attr_get(pf_info, &reps->port_attr_get_msg.port_attr_entry); +} + +static uint32_t zxdh_vf_promisc_set(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + uint32_t err = 0; + + if (!vf_item->trusted) + { + LOG_ERR("vf untrusted!\n"); + return 0; + } + + if (msg->promisc_set_msg.mode == ZXDH_PROMISC_MODE) + { + LOG_INFO("PROMISC_EN_SET: %d", msg->promisc_set_msg.value); + err = dpp_vport_uc_promisc_set(pf_info, msg->promisc_set_msg.value); + if (err != 0) + { + LOG_ERR("dpp_vport_uc_promisc_set failed: %d\n", err); + return err; + } + if (msg->promisc_set_msg.mc_follow != 0) + { + LOG_DEBUG("allmulti_follow\n"); + err = dpp_vport_mc_promisc_set(pf_info, msg->promisc_set_msg.value); + if (err != 0) + { + LOG_ERR("dpp_vport_mc_promisc_set failed: %d\n", err); + return err; + } + } + vf_item->promisc = msg->promisc_set_msg.value; + } + else if (msg->promisc_set_msg.mode == ZXDH_ALLMULTI_MODE) + { + LOG_INFO("ALLMULTI_EN_SET: %d", msg->promisc_set_msg.value); + err = dpp_vport_mc_promisc_set(pf_info, msg->promisc_set_msg.value); + if (err != 0) + { + LOG_ERR("dpp_vport_mc_promisc_set failed: %d\n", err); + return err; + } + vf_item->mc_promisc = msg->promisc_set_msg.value; + } + else + { + LOG_ERR("promisc_set_msg.mode[%d] error\n", msg->promisc_set_msg.mode); + return 1; + } + + return err; +} + +static uint32_t zxdh_vf_vlan_filter_set(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + bool vf_vlan_filter_enable = msg->vlan_filter_set_msg.enable; + + return dpp_vport_vlan_filter_en_set(pf_info, vf_vlan_filter_enable); +} + +static uint32_t zxdh_vf_rx_vid_add(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + uint16_t vid = msg->rx_vid_add_msg.vlan_id; + + return dpp_add_vlan_filter(pf_info, vid); +} + +static uint32_t zxdh_vf_rx_vid_del(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + uint16_t vid = msg->rx_vid_del_msg.vlan_id; + + return dpp_del_vlan_filter(pf_info, vid); +} + +static uint32_t zxdh_vf_np_stats_get(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + uint32_t vf_id = msg->hdr.vf_id; + + dpp_stat_port_bc_packet_rx_cnt_get(pf_info, vf_id, msg->np_stats_get_msg.clear_mode, + &reps->np_stats_msg.np_rx_broadcast); + dpp_stat_port_bc_packet_tx_cnt_get(pf_info, vf_id, msg->np_stats_get_msg.clear_mode, + &reps->np_stats_msg.np_tx_broadcast); + + dpp_stat_MTU_packet_msg_rx_cnt_get(pf_info, vf_id, msg->np_stats_get_msg.clear_mode, + &reps->np_stats_msg.np_rx_mtu_drop_bytes, &reps->np_stats_msg.np_rx_mtu_drop_pkts); + dpp_stat_MTU_packet_msg_tx_cnt_get(pf_info, vf_id, msg->np_stats_get_msg.clear_mode, + &reps->np_stats_msg.np_tx_mtu_drop_bytes, &reps->np_stats_msg.np_tx_mtu_drop_pkts); + + dpp_stat_plcr_packet_drop_rx_cnt_get(pf_info, vf_id, msg->np_stats_get_msg.clear_mode, + &reps->np_stats_msg.np_rx_plcr_drop_bytes, &reps->np_stats_msg.np_rx_plcr_drop_pkts); + dpp_stat_plcr_packet_drop_tx_cnt_get(pf_info, vf_id, msg->np_stats_get_msg.clear_mode, + &reps->np_stats_msg.np_tx_plcr_drop_bytes, &reps->np_stats_msg.np_tx_plcr_drop_pkts); + + return 0; +} + +static uint32_t zxdh_vf_rate_limit_set(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + int32_t rtn; + uint16_t vport = msg->hdr.vport; + uint32_t flowid = msg->rate_limit_set_msg.flowid; + uint32_t car_type = msg->rate_limit_set_msg.car_type; + uint32_t max_rate = msg->rate_limit_set_msg.max_rate; + uint32_t min_rate = msg->rate_limit_set_msg.min_rate; + uint32_t is_packet = msg->rate_limit_set_msg.is_packet; + + PLCR_FUNC_DBG_ENTER(); + + rtn = zxdh_plcr_set_rate_limit(pf_dev, is_packet, car_type, vport, flowid, max_rate, min_rate); + reps->rate_limit_set_rsp.err_code = rtn; + + if (PLCR_REMOVE_RATE_LIMIT == rtn) + { + return 0; + } + else + { + return rtn; + } +} + +static uint32_t zxdh_vf_plcr_uninit(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + uint16_t vport; + unsigned long flow_id; + E_PLCR_CAR_TYPE car_index; + struct xarray *xarray_flow; + struct zxdh_plcr_flow *flow = NULL; + + PLCR_FUNC_DBG_ENTER(); + + vport = msg->hdr.vport; + + //deal with car A's flowid + for(car_index=E_PLCR_CAR_A; car_index <= E_PLCR_CAR_B; car_index++) + { + xarray_flow = &(pf_dev->plcr_table.plcr_flows[car_index]); + xa_for_each_range(xarray_flow, flow_id, flow, 0, gaudPlcrCarxFlowIdNum[car_index]) + { + if(flow->vport == vport) + { + zxdh_plcr_remove_rate_limit(pf_dev, car_index, (uint32_t)flow_id); + + //clear vport mappings between car B and car C. + if(E_PLCR_CAR_B == car_index) + { + zxdh_plcr_clear_map(pf_dev, car_index, flow_id); + } + } + } + } + + zxdh_plcr_count_profiles(pf_dev); + + return 0; +} + +static uint32_t zxdh_vf_plcr_flowid_map(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + int32_t rtn = 0; + uint32_t car_type = 0; + uint32_t flowid = 0; + uint32_t map_flowid = 0; + uint32_t map_sp = 0; + + /*提取消息中的参数字段*/ + car_type = msg->plcr_flowid_map_msg.car_type; + flowid = msg->plcr_flowid_map_msg.flowid; + map_flowid = msg->plcr_flowid_map_msg.map_flowid; + map_sp = msg->plcr_flowid_map_msg.sp; + + //前面的流程会判断是否需要进行映射,不会出现vf端口原来是非0group,现在会被group 0覆盖的情况 + PLCR_LOG_INFO("dpp_car_queue_map_set: pf_info->vport = 0x%x, car_type = %d, flowid = %d, map_flowid = %d\n", pf_info->vport, car_type, flowid, map_flowid); + rtn = dpp_car_queue_map_set(pf_info, car_type, flowid, map_flowid, map_sp); + PLCR_COMM_ASSERT(rtn); + + zxdh_plcr_stroe_map(pf_dev, car_type, flowid, map_flowid); + + return 0; +} + +static uint32_t zxdh_vf_plcr_mode_init(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + int32_t rtn = 0; + + //set mode0 + rtn = zxdh_plcr_set_mode(pf_dev, msg->hdr.vport, E_RATE_LIMIT_MODE0); + + PLCR_COMM_ASSERT(rtn); + + return rtn; +} + +static uint32_t zxdh_vf_plcr_flow_init(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + int rtn = 0; + uint32_t car_type; + uint32_t flowid; + uint32_t vf_idx; + uint32_t vport; + uint32_t vfid; + uint32_t map_flowid; + + car_type = msg->plcr_flow_init_msg.car_type; + flowid = msg->plcr_flow_init_msg.flowid; + pf_info->slot = pf_dev->slot_id; + pf_info->vport = pf_dev->vport; + + if (car_type == E_PLCR_CAR_C) + { + //对于carC flow的初始化,需检查目标group中num_vfs是否为0,确定其是否是本次移动前新建 + for (vf_idx = 0; vf_idx < pf_dev->num_vfs; vf_idx ++) + { + rtn = zxdh_plcr_get_vport_vfid(pf_dev, vf_idx, &vport, &vfid); + PLCR_COMM_ASSERT(rtn); + rtn = zxdh_plcr_get_next_map(pf_dev, E_PLCR_CAR_B, vfid * 2, &map_flowid); + PLCR_COMM_ASSERT(rtn); + if (!rtn && flowid == map_flowid) + { + PLCR_LOG_INFO("Group is currently being used by at least one VF\n"); + return 0; + } + } + } + PLCR_LOG_INFO("dpp_car_queue_cfg_set: vport = 0x%x, car_type = %d, flowid = %d, plcr_en = 0\n", + pf_dev->vport, car_type, flowid); + rtn = dpp_car_queue_cfg_set(pf_info, (uint32_t)car_type, flowid, DROP_DISABLE, PLCR_DISABLE, 0); + if (rtn) + PLCR_LOG_ERR("failed to call dpp_car_queue_cfg_set()\n"); + + return rtn; +} + +static uint32_t zxdh_vf_plcr_profile_id_add(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + int32_t rtn = 0; + uint32_t car_type = 0; + uint16_t profile_id = 0; + + LOG_INFO("%s-%d:enter\n", __FUNCTION__, __LINE__); + /*1. 提取消息中的模板参数*/ + car_type = msg->vf_plcr_profile_id_add_msg.car_type; + + /*2. 申请新的profile*/ + rtn = zxdh_plcr_req_profile(pf_dev, car_type, &profile_id); + if (rtn) + { + LOG_ERR("%s-%d : failed !\n", __FUNCTION__, __LINE__); + return rtn; + } + + /*3. 返回消息*/ + reps->vf_plcr_profile_id_add_rsp.profile_id = profile_id; + + return 0; +} + +static uint32_t zxdh_vf_plcr_profile_id_delete(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + int32_t rtn = 0; + uint32_t car_type = 0; + uint16_t profile_id = 0; + + LOG_INFO("%s-%d:enter\n", __FUNCTION__, __LINE__); + /*1. 提取消息中的模板参数*/ + car_type = msg->vf_plcr_profile_id_delete_msg.car_type; + profile_id = msg->vf_plcr_profile_id_delete_msg.profile_id; + + /*2. 限速模板使用计数-1:在下面的解除绑定zxdh_vf_plcr_queue_cfg_set()负责对使用计数-1*/ + + /*3. 释放限速模板资源*/ + rtn = zxdh_plcr_release_profile(pf_dev, car_type, profile_id); + if (rtn) + { + LOG_ERR("%s-%d : failed !\n", __FUNCTION__, __LINE__); + return rtn; + } + + /*4. 没有返回消息*/ + + return rtn; +} + +static uint32_t zxdh_vf_plcr_profile_cfg_set(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + int32_t rtn = 0; + uint32_t car_type = 0; + uint32_t pkt_mode = 0; + uint16_t profile_id = 0; + uint32_t max_rate = 0; + uint32_t min_rate = 0; + struct xarray *xarray_profile = NULL; + struct zxdh_plcr_profile *plcr_profile = NULL; + union zxdh_plcr_profile_cfg profile_cfg; + + LOG_INFO("%s-%d:enter\n", __FUNCTION__, __LINE__); + /*1. 提取消息中的模板参数*/ + car_type = msg->vf_plcr_profile_cfg_set_msg.car_type; + pkt_mode = msg->vf_plcr_profile_cfg_set_msg.pkt_mode; + profile_id = msg->vf_plcr_profile_cfg_set_msg.profile_id; + + /*2. 校验外面的profile id和里面的profile id必须一致:限速模板联合体下包限速和字节限速结构体的前面2个成员是一样的(profile_id和pkt_sign)*/ + if(profile_id != msg->vf_plcr_profile_cfg_set_msg.profile_cfg.byte_profile_cfg.profile_id) + { + LOG_ERR("%s-%d : failed\n", __FUNCTION__, __LINE__); + return -EINVAL; + } + + /*3. 校验外面的pkt_mode和里面的pkt_sign必须一致:限速模板联合体下包限速和字节限速结构体的前面2个成员是一样的(profile_id和pkt_sign)*/ + if(pkt_mode != msg->vf_plcr_profile_cfg_set_msg.profile_cfg.byte_profile_cfg.pkt_sign) + { + LOG_ERR("%s-%d : failed\n", __FUNCTION__, __LINE__); + return -EINVAL; + } + + /*2. 获取profile*/ + xarray_profile = &(pf_dev->plcr_table.plcr_profiles[car_type]); + plcr_profile = xa_load(xarray_profile, profile_id); + + /*3. 包限速处理*/ + if(1 ==pkt_mode) + { + /*3.1 获取用户传递的字节限速模板参数*/ + profile_cfg.pkt_profile_cfg = msg->vf_plcr_profile_cfg_set_msg.profile_cfg.pkt_profile_cfg; + + /*3.2 包模式下直接使用限速模板里的包限速值*/ + max_rate = profile_cfg.pkt_profile_cfg.cir; + min_rate = profile_cfg.pkt_profile_cfg.cir; + + /*3.2 将限速模板的参数,配置到寄存器中去:包限速模板和字节限速模板前面2个成员profile_id和pkt_sign一样,保证了下面接口可以兼容包和字节限速配置*/ + rtn = zxdh_plcr_cfg_profile(pf_dev, car_type, &profile_cfg.byte_profile_cfg); + if (rtn) + { + LOG_ERR("%s-%d : failed\n", __FUNCTION__, __LINE__); + return -EINVAL; + } + } + /*4. 字节限速处理*/ + else + { + /*4.1 获取用户传递的字节限速模板参数*/ + profile_cfg.byte_profile_cfg = msg->vf_plcr_profile_cfg_set_msg.profile_cfg.byte_profile_cfg; + + /*4.2 将寄存器中的配置值,转换成用户限速值(单位:Mbit/s)*/ + max_rate = zxdh_plcr_reg_maxrate_user(profile_cfg.byte_profile_cfg.eir); + min_rate = zxdh_plcr_reg_maxrate_user(profile_cfg.byte_profile_cfg.cir); + + /*4.3 将限速模板的参数,配置到寄存器中去*/ + rtn = zxdh_plcr_cfg_profile(pf_dev, car_type, &profile_cfg.byte_profile_cfg); + if (rtn) + { + LOG_ERR("%s-%d : failed\n", __FUNCTION__, __LINE__); + return -EINVAL; + } + } + + /*5. 将限速模板参数保存到profile下面*/ + rtn = zxdh_plcr_store_profile(pf_dev, car_type, max_rate, min_rate, &profile_cfg.byte_profile_cfg); + if (rtn) + { + LOG_ERR("%s-%d : failed\n", __FUNCTION__, __LINE__); + return -EINVAL; + } + + /*6. 没有返回消息*/ + + return 0; +} + +static uint32_t zxdh_vf_plcr_profile_cfg_get(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + int32_t rtn = 0; + uint32_t car_type = 0; + uint32_t pkt_mode = 0; + uint16_t profile_id = 0; + + LOG_INFO("%s-%d:enter\n", __FUNCTION__, __LINE__); + /*1. 提取消息中的模板参数*/ + car_type = msg->vf_plcr_profile_cfg_get_msg.car_type; + pkt_mode = msg->vf_plcr_profile_cfg_get_msg.pkt_mode; + profile_id = msg->vf_plcr_profile_cfg_get_msg.profile_id; + + /*2. 从寄存器中,获取限速模板的参数*/ + rtn = zxdh_plcr_get_profile(pf_dev, car_type, pkt_mode, profile_id, &reps->vf_plcr_profile_cfg_get_rsp.profile_cfg.byte_profile_cfg); + if (rtn) + { + LOG_ERR("%s-%d : failed to call zxdh_plcr_cfg_profile()\n", __FUNCTION__, __LINE__); + return rtn; + } + + /*3. 返回消息:上面已经填充好返回消息*/ + + return 0; +} + +static uint32_t zxdh_vf_plcr_queue_cfg_set(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + int32_t rtn = 0; + uint32_t car_type = 0; + uint32_t drop_flag = 0; + uint32_t plcr_en = 0; + uint32_t flow_id = 0; + uint32_t profile_id = 0; + uint16_t vport = msg->hdr.vport; + struct xarray *xarray_profile = NULL; + struct zxdh_plcr_flow *plcr_flow = NULL; + struct zxdh_plcr_profile *plcr_profile = NULL; + + LOG_INFO("%s-%d:enter\n", __FUNCTION__, __LINE__); + LOG_INFO("%s-%d:vport = 0x%x\n", __FUNCTION__, __LINE__, vport); + + /*1. 提取消息中的模板参数*/ + car_type = msg->vf_plcr_queue_cfg_set_msg.car_type; + drop_flag = msg->vf_plcr_queue_cfg_set_msg.drop_flag; + plcr_en = msg->vf_plcr_queue_cfg_set_msg.plcr_en; + flow_id = msg->vf_plcr_queue_cfg_set_msg.flow_id; + profile_id = msg->vf_plcr_queue_cfg_set_msg.profile_id; + + /*2. 获取xarray中存储的profile*/ + xarray_profile = &(pf_dev->plcr_table.plcr_profiles[car_type]); + plcr_profile = xa_load(xarray_profile, profile_id); + if(NULL == plcr_profile) + { + LOG_ERR("%s-%d : failed\n", __FUNCTION__, __LINE__); + return -EINVAL; + } + + /*3. 绑定flow和profile*/ + if(PLCR_ENABLE == plcr_en) + { + /*3.1 申请flow结构体,并存储到xarray*/ + rtn = zxdh_plcr_req_flow(pf_dev, car_type, flow_id, &plcr_flow); + if (rtn) + { + LOG_ERR("%s-%d : kzalloc failed\n", __FUNCTION__, __LINE__); + return -EINVAL; + } + + /*3.2 更新flow信息*/ + zxdh_plcr_update_flow(plcr_flow, vport, plcr_profile->max_rate, plcr_profile->min_rate); + + /*3.3 更新flow信息*/ + plcr_flow->profile_id = profile_id; + + /*3.4 将flow与profile进行绑定*/ + rtn = dpp_car_queue_cfg_set(pf_info, car_type, flow_id, drop_flag, plcr_en, profile_id); + if (rtn) + { + LOG_ERR("%s-%d : failed to call dpp_car_queue_cfg_set()\n", __FUNCTION__, __LINE__); + + /*释放先前申请的flow*/ + zxdh_plcr_release_flow(pf_dev, car_type, flow_id); + return -EINVAL; + } + + /*3.4 模板使用计数+1*/ + zxdh_plcr_count_up_profile(pf_dev, car_type, profile_id); + } + /*4. 解除绑定flow和profile*/ + else + { + /*4.1 解除绑定flow与profile*/ + rtn = dpp_car_queue_cfg_set(pf_info, car_type, flow_id, drop_flag, plcr_en, profile_id); + if (rtn) + { + LOG_ERR("%s-%d : failed to call dpp_car_queue_cfg_set()\n", __FUNCTION__, __LINE__); + return -EINVAL; + } + + /*4.2 释放flow*/ + zxdh_plcr_release_flow(pf_dev, car_type, flow_id); + + /*4.3 模板使用计数-1*/ + zxdh_plcr_count_down_profile(pf_dev, car_type, profile_id); + } + + /*5. 没有返回消息*/ + + return 0; +} + +static uint32_t zxdh_vf_plcr_port_meter_stat_clr(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + int32_t rtn = 0; + uint64_t pkB_cnt = 0; + uint64_t pk_cnt = 0; + + LOG_INFO("%s-%d:enter\n", __FUNCTION__, __LINE__); + /*1. dpp接口函数原型如下:mode = 1,表示读清零*/ + dpp_stat_plcr_packet_drop_tx_cnt_get(pf_info, msg->hdr.vf_id, 1, &pkB_cnt, &pk_cnt); + dpp_stat_plcr_packet_drop_rx_cnt_get(pf_info, msg->hdr.vf_id, 1, &pkB_cnt, &pk_cnt); + + /*2. 没有返回消息*/ + return rtn; +} + +static uint32_t zxdh_vf_plcr_port_meter_stat_get(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + int32_t rtn = 0; + uint32_t direction = 0; + uint32_t is_clr = 0; + uint64_t *p_pkB_cnt = NULL; + uint64_t *p_pk_cnt = NULL; + + LOG_INFO("%s-%d:enter\n", __FUNCTION__, __LINE__); + /*1. 提取消息中的参数*/ + direction = msg->vf_plcr_port_meter_stat_get_msg.direction; + is_clr = msg->vf_plcr_port_meter_stat_get_msg.is_clr; + + /*2. 获取返回信息地址*/ + p_pkB_cnt = &(reps->vf_plcr_port_meter_stat_get_rsp.drop_pkB_cnt); + p_pk_cnt = &(reps->vf_plcr_port_meter_stat_get_rsp.drop_pk_cnt); + + /*2. 获取丢包统计*/ + if(1 == direction) + { + dpp_stat_plcr_packet_drop_tx_cnt_get(pf_info, msg->hdr.vf_id, is_clr, p_pkB_cnt, p_pk_cnt); + } + else + { + dpp_stat_plcr_packet_drop_rx_cnt_get(pf_info, msg->hdr.vf_id, is_clr, p_pkB_cnt, p_pk_cnt); + } + + /*3. 返回丢包统计值*/ + + return rtn; +} + +static uint32_t zxdh_vf_call_np_1588(zxdh_msg_info *msg, zxdh_reps_info *reps, \ + DPP_PF_INFO_T *pf_info, struct zxdh_vf_item *vf_item, struct zxdh_pf_device *pf_dev) +{ + uint32_t vfid = msg->vf_1588_call_np.vfid; + uint32_t interface_num = msg->vf_1588_call_np.call_np_interface_num; + uint32_t opt = msg->vf_1588_call_np.ptp_tc_enable_opt; + + switch (interface_num) + { + case PTP_PORT_VFID_SET: + { + LOG_INFO("call dpp_ptp_port_vfid_set\n"); + dpp_ptp_port_vfid_set(pf_info, vfid); + break; + } + case PTP_TC_ENABLE_SET: + { + LOG_INFO("call dpp_ptp_tc_enable_set\n"); + dpp_ptp_tc_enable_set(pf_info, opt); + break; + } + default: + { + LOG_ERR("cannot found the interface_num %u\n", interface_num); + return -1; + } + } + + return 0; +} + +zxdh_vf_msg_proc vf_msg_proc[] = +{ + {ZXDH_VF_PORT_INIT, "vf_port_init", zxdh_vf_port_init}, + {ZXDH_VF_PORT_UNINIT, "vf_port_uninit", zxdh_vf_port_uninit}, + {ZXDH_MAC_ADD, "vf_all_mac_add", zxdh_vf_all_mac_add}, + {ZXDH_MAC_DEL, "vf_all_mac_del", zxdh_vf_all_mac_del}, + {ZXDH_IPV6_MAC_ADD, "vf_ipv6_mac_add", zxdh_vf_ipv6_mac_add}, + {ZXDH_IPV6_MAC_DEL, "vf_ipv6_mac_del", zxdh_vf_ipv6_mac_del}, + {ZXDH_MAC_GET, "vf_mac_get", zxdh_vf_mac_get}, + {ZXDH_RSS_EN_SET, "vf_rss_state_set", zxdh_vf_rss_state_set}, + {ZXDH_RXFH_SET, "vf_rxfh_set", zxdh_vf_rxfh_set}, + {ZXDH_RXFH_GET, "vf_rxfh_get", zxdh_vf_rxfh_get}, + {ZXDH_RXFH_DEL, "vf_rxfh_del", zxdh_vf_rxfh_del}, + {ZXDH_THASH_KEY_SET, "vf_thash_key_set", zxdh_vf_thash_key_set}, + {ZXDH_THASH_KEY_GET, "vf_thash_key_get", zxdh_vf_thash_key_get}, + {ZXDH_HASH_FUNC_SET, "vf_hash_funcs_set", zxdh_vf_hash_funcs_set}, + {ZXDH_RX_FLOW_HASH_SET, "vf_rx_flow_hash_set", zxdh_vf_rx_flow_hash_set}, + {ZXDH_RX_FLOW_HASH_GET, "vf_rx_flow_hash_get", zxdh_vf_rx_flow_hash_get}, + {ZXDH_PORT_ATTRS_SET, "vf_port_attrs_set", zxdh_vf_port_attrs_set}, + {ZXDH_PORT_ATTRS_GET, "vf_port_attrs_get", zxdh_vf_port_attrs_get}, + {ZXDH_PROMISC_SET, "vf_promisc_set", zxdh_vf_promisc_set}, + {ZXDH_VLAN_FILTER_SET, "vf_vlan_filter_set", zxdh_vf_vlan_filter_set}, + {ZXDH_VLAN_FILTER_ADD, "vf_rx_vid_add", zxdh_vf_rx_vid_add}, + {ZXDH_VLAN_FILTER_DEL, "vf_rx_vid_del", zxdh_vf_rx_vid_del}, + {ZXDH_GET_NP_STATS, "vf_np_stats_get", zxdh_vf_np_stats_get}, + {ZXDH_VF_RATE_LIMIT_SET, "vf_rate_limit_set", zxdh_vf_rate_limit_set}, + {ZXDH_PLCR_UNINIT, "vf_plcr_uninit", zxdh_vf_plcr_uninit}, + {ZXDH_MAP_PLCR_FLOWID, "vf_map_plcr_flowid", zxdh_vf_plcr_flowid_map}, + {ZXDH_PLCR_MODE_INIT, "vf_plcr_mode_init", zxdh_vf_plcr_mode_init}, + {ZXDH_PLCR_FLOW_INIT, "vf_plcr_flow_init", zxdh_vf_plcr_flow_init}, + {ZXDH_VLAN_OFFLOAD_SET, "vf_vlan_strip_set", zxdh_vf_vlan_strip_set}, + {ZXDH_SET_TPID, "vf_qinq_tpid_cfg", zxdh_vf_qinq_tpid_cfg}, + {ZXDH_PLCR_CAR_PROFILE_ID_ADD, "vf_plcr_profile_id_add", zxdh_vf_plcr_profile_id_add}, + {ZXDH_PLCR_CAR_PROFILE_ID_DELETE, "vf_plcr_profile_id_detele", zxdh_vf_plcr_profile_id_delete}, + {ZXDH_PLCR_CAR_PROFILE_CFG_SET, "vf_plcr_profile_cfg_set", zxdh_vf_plcr_profile_cfg_set}, + {ZXDH_PLCR_CAR_PROFILE_CFG_GET, "vf_plcr_profile_cfg_get", zxdh_vf_plcr_profile_cfg_get}, + {ZXDH_PLCR_CAR_QUEUE_CFG_SET, "vf_plcr_queue_cfg_set", zxdh_vf_plcr_queue_cfg_set}, + {ZXDH_PORT_METER_STAT_CLR, "vf_plcr_port_meter_stat_clr",zxdh_vf_plcr_port_meter_stat_clr}, + {ZXDH_PORT_METER_STAT_GET, "vf_plcr_port_meter_stat_get",zxdh_vf_plcr_port_meter_stat_get}, + {ZXDH_VF_1588_CALL_NP, "vf_1588_call_np", zxdh_vf_call_np_1588}, +}; + +int32_t dh_pf_msg_recv_func(void *pay_load, uint16_t len, void *reps_buffer, uint16_t *reps_len, void *dev) +{ + zxdh_msg_info *msg = (zxdh_msg_info *)pay_load; + zxdh_reps_info *reps = (zxdh_reps_info *)reps_buffer; + struct zxdh_pf_device *pf_dev = (struct zxdh_pf_device *)dev; + struct zxdh_vf_item *vf_item = NULL; + uint32_t ret = 0; + int32_t i = 0; + int32_t num = 0; + DPP_PF_INFO_T pf_info = {0}; + + if (pf_dev == NULL) + { + LOG_ERR("dev is NULL\n"); + return -1; + } + + LOG_DEBUG("vport: 0x%x\n", msg->hdr.vport); + pf_info.slot = pf_dev->slot_id; + pf_info.vport = msg->hdr.vport; + num = sizeof(vf_msg_proc)/sizeof(zxdh_vf_msg_proc); + vf_item = &pf_dev->vf_item[(msg->hdr.pcie_id & (0xff))]; + for (i = 0; i < num; i++) + { + *reps_len = sizeof(union zxdh_msg); + if (vf_msg_proc[i].op_code == msg->hdr.op_code) + { + LOG_INFO("%s is called", vf_msg_proc[i].proc_name); + ret = vf_msg_proc[i].msg_proc(msg, reps, &pf_info, vf_item, pf_dev); + if (ret != 0) + { + if (((msg->hdr.op_code == ZXDH_MAC_ADD)||(msg->hdr.op_code == ZXDH_IPV6_MAC_ADD)) && (ret == DPP_RC_TABLE_RANGE_INVALID)) + { + reps->flag = ZXDH_REPS_BEOND_MAC; + return -1; + } + reps->flag = ZXDH_REPS_FAIL; + LOG_ERR("%s failed, ret: %d\n", vf_msg_proc[i].proc_name, ret); + return -1; + } + + reps->flag = ZXDH_REPS_SUCC; + return 0; + } + } + + LOG_ERR("invalid op_code: [%u]\n", msg->hdr.op_code); + return -2; +} + +int32_t dh_pf_msg_recv_func_register(void) +{ + int32_t ret = 0; + + ret = zxdh_bar_chan_msg_recv_register(MODULE_VF_BAR_MSG_TO_PF, dh_pf_msg_recv_func); + if (ret != 0) + { + LOG_ERR("event_id[%d] register failed: %d\n", MODULE_VF_BAR_MSG_TO_PF, ret); + return ret; + } + + return ret; +} + +void dh_pf_msg_recv_func_unregister(void) +{ + zxdh_bar_chan_msg_recv_unregister(MODULE_VF_BAR_MSG_TO_PF); +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_pf/msg_func.h b/src/net/drivers/net/ethernet/dinghai/en_pf/msg_func.h new file mode 100644 index 0000000..d54ccff --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_pf/msg_func.h @@ -0,0 +1,25 @@ +#ifndef __ZXDH_PF_MSG_FUNC_H__ +#define __ZXDH_PF_MSG_FUNC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +typedef enum +{ + PTP_PORT_VFID_SET, + PTP_TC_ENABLE_SET, + + MAX_VF_CALL_NP_NUM, +} vf_call_np_num; + +int32_t dh_pf_msg_recv_func_register(void); +void dh_pf_msg_recv_func_unregister(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __ZXDH_PF_MSG_FUNC_H__ */ diff --git a/src/net/drivers/net/ethernet/dinghai/en_pf/rdma.c b/src/net/drivers/net/ethernet/dinghai/en_pf/rdma.c new file mode 100755 index 0000000..e69de29 diff --git a/src/net/drivers/net/ethernet/dinghai/en_ptp/tod_driver.c b/src/net/drivers/net/ethernet/dinghai/en_ptp/tod_driver.c new file mode 100644 index 0000000..e58d6e8 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_ptp/tod_driver.c @@ -0,0 +1,437 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "tod_driver.h" +//#include "../msg_chan_driver/msg_chan_pub.h" +#include +#include "zxdh_ptp_common.h" + +static uint64_t virt_addr = 0; +static uint64_t pcie_id = 0; +static dev_t tod_device_no = 0; +static struct device *tod_device = NULL; +static struct file *tod_device_file = NULL; +static struct cdev *tod_device_cdev = NULL; +static struct class *tod_device_class = NULL; + +#define TOD_DEVICE_NAME "tod_device" + +int32_t tod_device_set_bar_virtual_addr(uint64_t virtaddr, uint16_t pcieid) +{ + virt_addr = virtaddr; + pcie_id = pcieid; + PTP_LOG_INFO("%s: bar msg virtaddr: 0x%llx\n", __FUNCTION__, virtaddr); + return 0; +} +EXPORT_SYMBOL(tod_device_set_bar_virtual_addr); + +static int32_t tod_device_sync_msg_send(uint8_t *req, uint32_t req_len, uint8_t *resp, uint32_t resp_len) +{ + int32_t result = 0; + uint32_t payload_len = 0; + struct zxdh_pci_bar_msg in = {0}; + struct zxdh_msg_recviver_mem out = {0}; + + if (req == NULL || req_len < 4) + { + PTP_LOG_ERR("%s: arg invalid, req: %px, req_len: %u.\n", __FUNCTION__, req, req_len); + return -EINVAL; + } + + out.buffer_len = 4 + 4 + resp_len; // 4B 消息头 + 4B result + resp_len实际应答消息 + out.recv_buffer = (uint8_t*)kmalloc(out.buffer_len, GFP_KERNEL); + if (out.recv_buffer == NULL) + { + PTP_LOG_ERR("%s: no space left on device.\n", __FUNCTION__); + return -ENOSPC; + } + memset(out.recv_buffer, 0, out.buffer_len); + + in.virt_addr = virt_addr; + in.event_id = MODULE_TOD; + in.src = MSG_CHAN_END_PF; + in.dst = MSG_CHAN_END_RISC; + in.payload_addr = req; + in.payload_len = req_len; + in.src_pcieid = pcie_id; + + if(zxdh_bar_chan_sync_msg_send(&in, &out) != BAR_MSG_OK) + { + kfree(out.recv_buffer); + PTP_LOG_ERR("%s: zxdh_bar_chan_sync_msg_send failed.\n", __FUNCTION__); + return -EINVAL; + } + + // 消息应答格式: header(4B) + payload(nB), payload最大2048 - 12 + // header格式: 0xFF(1B) + payload_len(2B) + rsv(1B) + // payload格式: result(4B) + msg((n - 4)B) + payload_len = *(uint16_t*)((uint8_t*)out.recv_buffer + 1); + if (payload_len < 4) + { + kfree(out.recv_buffer); + PTP_LOG_ERR("%s: payload_len: %u check failed.\n", __FUNCTION__, payload_len); + return -EINVAL; + } + + result = *(int32_t*)((uint8_t*)out.recv_buffer + 4); + if (result != 0) + { + kfree(out.recv_buffer); + PTP_LOG_ERR("%s: result: %d check failed.\n", __FUNCTION__, result); + return result; + } + + if (payload_len > 4 && resp != NULL) + { + memcpy(resp, out.recv_buffer + 8, (((payload_len - 4) > resp_len) ? resp_len : (payload_len - 4))); + } + + kfree(out.recv_buffer); + + return 0; +} + +static int tod_device_open(struct inode *inode, struct file *file) +{ + int32_t result = 0; + const char *device = "/dev/ttyAMA1"; + struct tod_device_msg msg; + + printk(KERN_INFO "%s.\n", __FUNCTION__); + + if (tod_device_file != NULL) + { + PTP_LOG_INFO("%s: device already open.\n", __FUNCTION__); + return 0; + } + + memset(&msg, 0x00, sizeof(struct tod_device_msg)); + msg.type = TOD_DEVICE_MSG_OPEN; + memcpy(msg.data, device, strlen(device) + 1); + + result = tod_device_sync_msg_send((uint8_t*)(&msg), sizeof(struct tod_device_msg), (uint8_t*)(&tod_device_file), sizeof(struct file*)); + if (result != 0) + { + tod_device_file = NULL; + printk(KERN_ERR "%s: tod_device_sync_msg_send failed, result: %d.\n", __FUNCTION__, result); + return -EINVAL; + } + PTP_LOG_INFO("%s: file %px open success.\n", __FUNCTION__, tod_device_file); + + return 0; +} + +static int tod_device_release(struct inode *inode, struct file *file) +{ + int32_t result = 0; + struct tod_device_msg msg; + + PTP_LOG_INFO("%s.\n", __FUNCTION__); + + if (tod_device_file == NULL) + { + PTP_LOG_ERR("%s: device already close.\n", __FUNCTION__); + return 0; + } + + memset(&msg, 0x00, sizeof(struct tod_device_msg)); + msg.type = TOD_DEVICE_MSG_CLOSE; + msg.file = tod_device_file; + + result = tod_device_sync_msg_send((uint8_t*)(&msg), sizeof(struct tod_device_msg), NULL, 0); + if (result != 0) + { + PTP_LOG_ERR("%s: tod_device_sync_msg_send failed, result: %d.\n", __FUNCTION__, result); + return -EINVAL; + } + PTP_LOG_INFO("%s: file %px close success.\n", __FUNCTION__, tod_device_file); + tod_device_file = NULL; + + return 0; +} + +static ssize_t tod_device_read(struct file *file, char *buf, size_t count, loff_t *f_pos) +{ + int32_t result = 0; + uint8_t *resp = NULL; + struct tod_device_msg msg; + + PTP_LOG_INFO("%s.\n", __FUNCTION__); + + if (tod_device_file == NULL) + { + PTP_LOG_ERR("%s: no such device.\n", __FUNCTION__); + return -ENODEV; + } + + if (count > (2048 - 12 - sizeof(int32_t) - sizeof(size_t))) // common bar: 2048 - 12, result: 4, count: 8. + { + PTP_LOG_ERR("%s: no space left on device.\n", __FUNCTION__); + return -ENOSPC; + } + + resp = (uint8_t*)kmalloc(sizeof(size_t) + count, GFP_KERNEL); + if (resp == NULL) + { + PTP_LOG_ERR("%s: no space left on device.\n", __FUNCTION__); + return -ENOSPC; + } + + memset(&msg, 0x00, sizeof(struct tod_device_msg)); + msg.type = TOD_DEVICE_MSG_READ; + msg.count = count; + msg.file = tod_device_file; + + result = tod_device_sync_msg_send((uint8_t*)(&msg), sizeof(struct tod_device_msg), resp, sizeof(size_t) + count); + if (result != 0) + { + kfree(resp); + PTP_LOG_ERR("%s: tod_device_sync_msg_send failed, result: %d.\n", __FUNCTION__, result); + return -EINVAL; + } + + count = *((size_t*)(resp)); + if (count > msg.count) + { + PTP_LOG_ERR("%s: no space left on device.\n", __FUNCTION__); + kfree(resp); + return -ENOSPC; + } + + result = copy_to_user(buf, resp + sizeof(size_t), count); + if (result != 0) + { + kfree(resp); + PTP_LOG_ERR("%s: copy_to_user failed, result: %d.\n", __FUNCTION__, result); + return -EINVAL; + } + + kfree(resp); + PTP_LOG_INFO("%s: file %px read %lu bytes success.\n", __FUNCTION__, tod_device_file, count); + + return count; +} + +static ssize_t tod_device_write(struct file *file, const char *buf, size_t count, loff_t *f_pos) +{ + int32_t result = 0; + struct tod_device_msg msg; + + PTP_LOG_INFO("%s.\n", __FUNCTION__); + + if (tod_device_file == NULL) + { + PTP_LOG_ERR("%s: no such device.\n", __FUNCTION__); + return -ENODEV; + } + + if (count > sizeof(msg.data)) + { + PTP_LOG_ERR("%s: no space left on device.\n", __FUNCTION__); + return -ENOSPC; + } + + memset(&msg, 0x00, sizeof(struct tod_device_msg)); + msg.type = TOD_DEVICE_MSG_WRITE; + msg.count = count; + msg.file = tod_device_file; + result = copy_from_user(msg.data, buf, count); + if (result != 0) + { + PTP_LOG_ERR("%s: copy_from_user failed, result: %d.\n", __FUNCTION__, result); + return -EINVAL; + } + + result = tod_device_sync_msg_send((uint8_t*)(&msg), sizeof(struct tod_device_msg), (uint8_t*)(&count), sizeof(size_t)); + if (result != 0) + { + PTP_LOG_ERR("%s: tod_device_sync_msg_send failed, result: %d.\n", __FUNCTION__, result); + return -EINVAL; + } + PTP_LOG_INFO("%s: file %px write %lu bytes success.\n", __FUNCTION__, tod_device_file, count); + + return count; +} + +static __poll_t tod_device_poll(struct file *file, struct poll_table_struct *wait) +{ + int32_t result = 0; + uint16_t poll_mask = 0; + struct tod_device_msg msg; + + PTP_LOG_INFO("%s.\n", __FUNCTION__); + + if (tod_device_file == NULL) + { + PTP_LOG_ERR("%s: no such device.\n", __FUNCTION__); + return POLLERR; + } + + memset(&msg, 0x00, sizeof(struct tod_device_msg)); + msg.type = TOD_DEVICE_MSG_POLL; + msg.file = tod_device_file; + + result = tod_device_sync_msg_send((uint8_t*)(&msg), sizeof(struct tod_device_msg), (uint8_t*)(&poll_mask), sizeof(uint16_t)); + if (result != 0) + { + PTP_LOG_ERR("%s: tod_device_sync_msg_send failed, result: %d.\n", __FUNCTION__, result); + return POLLERR; + } + PTP_LOG_INFO("%s: file %px poll mask 0x%04x success.\n", __FUNCTION__, tod_device_file, poll_mask); + + return poll_mask; +} + +static long tod_device_ioctl(struct file *file, uint32_t request, unsigned long args) +{ + int32_t result = 0; + uint8_t *resp = NULL; + struct tod_device_msg msg; + + PTP_LOG_INFO("%s.\n", __FUNCTION__); + + if (tod_device_file == NULL) + { + PTP_LOG_ERR("%s: no such device.\n", __FUNCTION__); + return -ENODEV; + } + + resp = (uint8_t*)kmalloc(sizeof(struct termios), GFP_KERNEL); + if (resp == NULL) + { + PTP_LOG_ERR("%s: no space left on device.\n", __FUNCTION__); + return -ENOSPC; + } + + memset(&msg, 0x00, sizeof(struct tod_device_msg)); + msg.type = TOD_DEVICE_MSG_IOCTL; + msg.file = tod_device_file; + msg.command = request; + + if ((struct termios*)args != NULL) + { + result = copy_from_user(msg.data, (uint8_t*)args, sizeof(struct termios)); + if (result != 0) + { + PTP_LOG_ERR("%s: copy_from_user failed, result: %d.\n", __FUNCTION__, result); + kfree(resp); + return -EINVAL; + } + } + + result = tod_device_sync_msg_send((uint8_t*)(&msg), sizeof(struct tod_device_msg), resp, sizeof(struct termios)); + if (result != 0) + { + kfree(resp); + PTP_LOG_ERR("%s: tod_device_sync_msg_send failed, result: %d.\n", __FUNCTION__, result); + return -EINVAL; + } + + if ((struct termios*)args != NULL) + { + result = copy_to_user((uint8_t*)args, resp, sizeof(struct termios)); + if (result != 0) + { + kfree(resp); + PTP_LOG_ERR("%s: copy_to_user failed, result: %d.\n", __FUNCTION__, result); + return -EINVAL; + } + } + + kfree(resp); + PTP_LOG_INFO("%s: file %px ioctl success.\n", __FUNCTION__, tod_device_file); + + return 0; +} + +struct file_operations tod_device_ops = { + .owner = THIS_MODULE, + .open = tod_device_open, + .release = tod_device_release, + .read = tod_device_read, + .write = tod_device_write, + .poll = tod_device_poll, + .unlocked_ioctl = tod_device_ioctl +}; + +static int32_t __init tod_device_init(void) +{ + int32_t result = 0; + + PTP_LOG_INFO("%s: start.\n", __FUNCTION__); + + result = alloc_chrdev_region(&tod_device_no, 0, 1, TOD_DEVICE_NAME); + if (result < 0) + { + PTP_LOG_ERR("%s: alloc_chrdev_region failed, result: %d.\n", __FUNCTION__, result); + return -EINVAL; + } + + tod_device_cdev = cdev_alloc(); + if (tod_device_cdev == NULL) + { + PTP_LOG_ERR("%s: cdev_alloc failed, result: %d.\n", __FUNCTION__, result); + unregister_chrdev_region(tod_device_no, 1); + return -EINVAL; + } + + cdev_init(tod_device_cdev, &tod_device_ops); + tod_device_cdev->owner = THIS_MODULE; + result = cdev_add(tod_device_cdev, tod_device_no, 1); + if (result != 0) + { + PTP_LOG_ERR("%s: cdev_add failed, result: %d.\n", __FUNCTION__, result); + unregister_chrdev_region(tod_device_no, 1); + return -EINVAL; + } + + tod_device_class = class_create(THIS_MODULE, TOD_DEVICE_NAME); + if (IS_ERR(tod_device_class)) + { + PTP_LOG_ERR("%s: class_create failed, err: %lu.\n", __FUNCTION__, PTR_ERR(tod_device_class)); + cdev_del(tod_device_cdev); + unregister_chrdev_region(tod_device_no, 1); + return -EINVAL; + } + + tod_device = device_create(tod_device_class, NULL, tod_device_no, NULL, TOD_DEVICE_NAME); + if (IS_ERR(tod_device)) + { + PTP_LOG_ERR("%s: device_create failed, err: %lu.\n", __FUNCTION__, PTR_ERR(tod_device)); + class_destroy(tod_device_class); + cdev_del(tod_device_cdev); + unregister_chrdev_region(tod_device_no, 1); + return -EINVAL; + } + + PTP_LOG_INFO("%s: success.\n", __FUNCTION__); + + return 0; +} + +static void __exit tod_device_exit(void) +{ + PTP_LOG_INFO("%s: start.\n", __FUNCTION__); + + device_destroy(tod_device_class, tod_device_no); + + class_destroy(tod_device_class); + + cdev_del(tod_device_cdev); + + unregister_chrdev_region(tod_device_no, 1); + + PTP_LOG_ERR("%s: success.\n", __FUNCTION__); +} + +module_init(tod_device_init); +module_exit(tod_device_exit); + +MODULE_LICENSE("GPL"); diff --git a/src/net/drivers/net/ethernet/dinghai/en_ptp/tod_driver.h b/src/net/drivers/net/ethernet/dinghai/en_ptp/tod_driver.h new file mode 100644 index 0000000..b02f70a --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_ptp/tod_driver.h @@ -0,0 +1,24 @@ +#ifndef _TOD_DRIVER_H_ +#define _TOD_DRIVER_H_ + +#include + +#define TOD_DEVICE_MSG_OPEN ((uint32_t)(0)) +#define TOD_DEVICE_MSG_CLOSE ((uint32_t)(1)) +#define TOD_DEVICE_MSG_READ ((uint32_t)(2)) +#define TOD_DEVICE_MSG_WRITE ((uint32_t)(3)) +#define TOD_DEVICE_MSG_POLL ((uint32_t)(4)) +#define TOD_DEVICE_MSG_IOCTL ((uint32_t)(5)) + +#define TOD_DEVICE_DATA_LEN ((uint32_t)(512)) + +struct tod_device_msg +{ + uint32_t type; + uint32_t command; + size_t count; + void* file; + uint8_t data[TOD_DEVICE_DATA_LEN]; +}; + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_ptp/tod_driver_stub.c b/src/net/drivers/net/ethernet/dinghai/en_ptp/tod_driver_stub.c new file mode 100644 index 0000000..890efa5 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_ptp/tod_driver_stub.c @@ -0,0 +1,62 @@ +#include +//#include "../msg_chan_driver/msg_chan_pub.h" +#include +#if 0 +typedef uint16_t (*rsc_recv_func_ptr)(uint8_t *pay_load, uint16_t len, uint8_t *reps_buffer, uint16_t *reps_len); + +static rsc_recv_func_ptr g_riscv_event[100] = {0}; + +uint16_t RSC_MsgProRegister(uint8_t event_id, rsc_recv_func_ptr msg_pro_fun) +{ + if(100 <= event_id) + return 0; + g_riscv_event[event_id] = msg_pro_fun; + return 0; +} +EXPORT_SYMBOL(RSC_MsgProRegister); + +uint16_t RSC_MsgProUnregister(uint8_t event_id) +{ + if(100 <= event_id) + return 0; + g_riscv_event[event_id] = NULL; + return 0; +} +EXPORT_SYMBOL(RSC_MsgProUnregister); + + +// int zxdh_bar_chan_sync_msg_send(struct zxdh_pci_bar_msg *in, struct zxdh_msg_recviver_mem *result) +// { +// uint16_t reps_len = 0; +// uint8_t *reps_buffer = NULL; +// rsc_recv_func_ptr ptr = NULL; + +// reps_buffer = (uint8_t*)kmalloc(2048 - 12 + 4, GFP_KERNEL); +// if (reps_buffer == NULL) +// { +// printk(KERN_ERR "%s: no space left on device.\n", __FUNCTION__); +// return -ENOSPC; +// } +// memset(reps_buffer, 0x00, 2048 - 12 + 4); // 消息应答净荷长度最大2048 - 12, 再加上4B消息头 + +// ptr = g_riscv_event[in->event_id]; +// if (ptr(in->payload_addr, in->payload_len, reps_buffer + 4, &reps_len) != 0) +// { +// kfree(reps_buffer); +// printk(KERN_ERR "%s: rsc_recv_func_ptr failed.\n", __FUNCTION__); +// return -EINVAL; +// } + +// *(uint8_t*)reps_buffer = 0xFF; +// *(uint16_t*)((((uint8_t*)reps_buffer )+ 1)) = reps_len; + +// memcpy(result->recv_buffer, reps_buffer, result->buffer_len); + +// kfree(reps_buffer); + +// return 0; +// } +// EXPORT_SYMBOL(zxdh_bar_chan_sync_msg_send); + +MODULE_LICENSE("GPL"); +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_ptp/zxdh_ptp.c b/src/net/drivers/net/ethernet/dinghai/en_ptp/zxdh_ptp.c new file mode 100644 index 0000000..7724802 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_ptp/zxdh_ptp.c @@ -0,0 +1,1477 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "en_aux.h" +#include "zxdh_ptp.h" +#include "zxdh_ptp_regs.h" +#include "zxdh_ptp_common.h" + +#define ZXDH_PF_BAR0 0 + +char pps[3][15] = { + "pp1s_out", + "pp1s_1588", + "pp1s_external" +}; + +// all tsn timer name: tsn0 tsn1 tsn2 tsn3, so the return value is 0/1/2/3. +static int get_tsn_timer_no(char *clock_name) +{ + int ret; + int timer_no; + ret = sscanf(clock_name, "tsn%d", &timer_no); + if(ret != 1) + { + PTP_LOG_INFO(" tsn: %s get timer no fail!\n", clock_name); + return -1; + } + return timer_no; +} + +static uint32_t tsn_clock_cycle_integer_reg(int timer_no) +{ + if (0 == timer_no) + return TSN_CLOCK_CYCLE_INTEGER(0); + else if (1 == timer_no) + return TSN_CLOCK_CYCLE_INTEGER(1); + else if (2 == timer_no) + return TSN_CLOCK_CYCLE_INTEGER(2); + else if (3 == timer_no) + return TSN_CLOCK_CYCLE_INTEGER(3); + + return 0; +} + +static uint32_t tsn_clock_cycle_fraction_reg(int timer_no) +{ + if (0 == timer_no) + return TSN_CLOCK_CYCLE_FRACTION(0); + else if (1 == timer_no) + return TSN_CLOCK_CYCLE_FRACTION(1); + else if (2 == timer_no) + return TSN_CLOCK_CYCLE_FRACTION(2); + else if (3 == timer_no) + return TSN_CLOCK_CYCLE_FRACTION(3); + + return 0; +} + +#define GET_TSN_ADJUST_NANO_REG(tsn_no) \ + ({ \ + if (0 == tsn_no) \ + nano_sec_reg = TSN_ADJUST_NANO_SEC(0); \ + else if (1 == tsn_no) \ + nano_sec_reg = TSN_ADJUST_NANO_SEC(1); \ + else if (2 == tsn_no) \ + nano_sec_reg = TSN_ADJUST_NANO_SEC(2); \ + else if (3 == tsn_no) \ + nano_sec_reg = TSN_ADJUST_NANO_SEC(3); \ + }) + +#define GET_TSN_ADJUST_LOW_SEC_REG(tsn_no) \ + ({ \ + if (0 == tsn_no) \ + low_sec_reg = TSN_ADJUST_LOW_SECOND(0); \ + else if (1 == tsn_no) \ + low_sec_reg = TSN_ADJUST_LOW_SECOND(1); \ + else if (2 == tsn_no) \ + low_sec_reg = TSN_ADJUST_LOW_SECOND(2); \ + else if (3 == tsn_no) \ + low_sec_reg = TSN_ADJUST_LOW_SECOND(3); \ + }) + +#define GET_TSN_ADJUST_HIGH_SEC_REG(tsn_no) \ + ({ \ + if (0 == tsn_no) \ + high_sec_reg = TSN_ADJUST_HIGH_SECOND(0); \ + else if (1 == tsn_no) \ + high_sec_reg = TSN_ADJUST_HIGH_SECOND(1); \ + else if (2 == tsn_no) \ + high_sec_reg = TSN_ADJUST_HIGH_SECOND(2); \ + else if (3 == tsn_no) \ + high_sec_reg = TSN_ADJUST_HIGH_SECOND(3); \ + }) + +#define GET_TSN_ADJUST_FRAC_NANO_SEC_REG(tsn_no) \ + ({ \ + if (0 == tsn_no) \ + frac_nano_reg = TSN_ADJUST_FRAC_NANO_SEC(0); \ + else if (1 == tsn_no) \ + frac_nano_reg = TSN_ADJUST_FRAC_NANO_SEC(1); \ + else if (2 == tsn_no) \ + frac_nano_reg = TSN_ADJUST_FRAC_NANO_SEC(2); \ + else if (3 == tsn_no) \ + frac_nano_reg = TSN_ADJUST_FRAC_NANO_SEC(3); \ + }) + +#define GET_TSN_LATCH_NANO_REG(tsn_no) \ + ({ \ + if (0 == tsn_no) \ + nano_sec_reg = TSN_LATCH_NANO_SEC(0); \ + else if (1 == tsn_no) \ + nano_sec_reg = TSN_LATCH_NANO_SEC(1); \ + else if (2 == tsn_no) \ + nano_sec_reg = TSN_LATCH_NANO_SEC(2); \ + else if (3 == tsn_no) \ + nano_sec_reg = TSN_LATCH_NANO_SEC(3); \ + }) + +#define GET_TSN_LATCH_LOW_SEC_REG(tsn_no) \ + ({ \ + if (0 == tsn_no) \ + low_sec_reg = TSN_LATCH_LOW_SECOND(0); \ + else if (1 == tsn_no) \ + low_sec_reg = TSN_LATCH_LOW_SECOND(1); \ + else if (2 == tsn_no) \ + low_sec_reg = TSN_LATCH_LOW_SECOND(2); \ + else if (3 == tsn_no) \ + low_sec_reg = TSN_LATCH_LOW_SECOND(3); \ + }) + +#define GET_TSN_LATCH_HIGH_SEC_REG(tsn_no) \ + ({ \ + if (0 == tsn_no) \ + high_sec_reg = TSN_LATCH_HIGH_SECOND(0); \ + else if (1 == tsn_no) \ + high_sec_reg = TSN_LATCH_HIGH_SECOND(1); \ + else if (2 == tsn_no) \ + high_sec_reg = TSN_LATCH_HIGH_SECOND(2); \ + else if (3 == tsn_no) \ + high_sec_reg = TSN_LATCH_HIGH_SECOND(3); \ + }) + +#define GET_TSN_LATCH_FRAC_NANO_SEC_REG(tsn_no) \ + ({ \ + if (0 == tsn_no) \ + frac_nano_reg = TSN_LATCH_FRAC_NANO_SEC(0); \ + else if (1 == tsn_no) \ + frac_nano_reg = TSN_LATCH_FRAC_NANO_SEC(1); \ + else if (2 == tsn_no) \ + frac_nano_reg = TSN_LATCH_FRAC_NANO_SEC(2); \ + else if (3 == tsn_no) \ + frac_nano_reg = TSN_LATCH_FRAC_NANO_SEC(3); \ + }) + +#define GET_PPS_LATCH_TSN_NANO_REG(tsn_no) \ + ({ \ + if (1 == tsn_no) \ + nano_sec_reg = PPS_LATCH_TSN_NANO_SEC(0); \ + else if (2 == tsn_no) \ + nano_sec_reg = PPS_LATCH_TSN_NANO_SEC(1); \ + else if (3 == tsn_no) \ + nano_sec_reg = PPS_LATCH_TSN_NANO_SEC(2); \ + else if (4 == tsn_no) \ + nano_sec_reg = PPS_LATCH_TSN_NANO_SEC(3); \ + }) + +#define GET_PPS_LATCH_TSN_LOW_SEC_REG(tsn_no) \ + ({ \ + if (1 == tsn_no) \ + low_sec_reg = PPS_LATCH_TSN_LOW_SECOND(0); \ + else if (2 == tsn_no) \ + low_sec_reg = PPS_LATCH_TSN_LOW_SECOND(1); \ + else if (3 == tsn_no) \ + low_sec_reg = PPS_LATCH_TSN_LOW_SECOND(2); \ + else if (4 == tsn_no) \ + low_sec_reg = PPS_LATCH_TSN_LOW_SECOND(3); \ + }) + +#define GET_PPS_LATCH_TSN_HIGH_SEC_REG(tsn_no) \ + ({ \ + if (1 == tsn_no) \ + high_sec_reg = PPS_LATCH_TSN_HIGH_SECOND(0); \ + else if (2 == tsn_no) \ + high_sec_reg = PPS_LATCH_TSN_HIGH_SECOND(1); \ + else if (3 == tsn_no) \ + high_sec_reg = PPS_LATCH_TSN_HIGH_SECOND(2); \ + else if (4 == tsn_no) \ + high_sec_reg = PPS_LATCH_TSN_HIGH_SECOND(3); \ + }) + +#define GET_PPS_LATCH_TSN_FRAC_NANO_SEC_REG(tsn_no) \ + ({ \ + if (1 == tsn_no) \ + frac_nano_reg = PPS_LATCH_TSN_FRAC_NANO_SEC(0); \ + else if (2 == tsn_no) \ + frac_nano_reg = PPS_LATCH_TSN_FRAC_NANO_SEC(1); \ + else if (3 == tsn_no) \ + frac_nano_reg = PPS_LATCH_TSN_FRAC_NANO_SEC(2); \ + else if (4 == tsn_no) \ + frac_nano_reg = PPS_LATCH_TSN_FRAC_NANO_SEC(3); \ + }) + +enum reg_module +{ + PTP_TOP, + PTP_M, + PTP_S0, + PTP_S1, + PTP_S2, +}; + +static inline uint32_t zxdh_read_reg(uint64_t base_addr, uint32_t offset) +{ + return readl((const volatile void *)(base_addr + offset)); +} + +static inline void zxdh_write_reg(uint64_t base_addr, uint32_t offset, uint32_t val) +{ + writel(val, (volatile void *)(base_addr + offset)); +} + +static uint64_t zxdh_ptp_get_bar_addr(struct zxdh_ptp_private *adapter) +{ + struct zxdh_pf_device *pf_dev = adapter->pdev; + return pf_dev->pci_ioremap_addr[0]; +} + +static struct zxdh_ptp_private* zxdh_ptp_get_ptp_private(struct zxdh_en_device *en_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(en_dev->parent->parent); + return pf_dev->ptp; +} +/** + * zx_ptp_adjfreq - adjust ptp cycle frequency + * @ptp: the ptp clock structure + * @ppb: parts per billion adjustment from base + * + */ +static int zx_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb) +{ + unsigned long flags; + int neg_adj = 0; + uint32_t cur_nano, cur_frac_nano; + uint64_t tmp_frac_nano; + uint64_t base_addr; + uint64_t bar_addr; + uint64_t freq_adj; + struct zxdh_ptp_private *adapter = container_of(ptp, struct zxdh_ptp_private, ptp_caps[0]); + + PTP_LOG_INFO("name: %s, ppb: %d\n", ptp->name, ppb); + + if (ppb == 0) + return 0; + + if (ppb < 0) + { + ppb = -ppb; + neg_adj = 1; + } + bar_addr = zxdh_ptp_get_bar_addr(adapter); + + base_addr = bar_addr + PTP_HOST_BAR_OFFSET + PTPM_OFFSET_WITH_TOP; + cur_nano = zxdh_read_reg(base_addr, PTP_CLOCK_CYCLE_INTEGER); + cur_frac_nano = zxdh_read_reg(base_addr, PTP_CLOCK_CYCLE_FRACTION); + + tmp_frac_nano = ((unsigned long long)cur_nano << 32) + cur_frac_nano; + + PTP_LOG_INFO("cur_nano: %u, cur_frac_nano: %u, tmp_frac_nano: 0x%llx\n", cur_nano, cur_frac_nano, + tmp_frac_nano); + + /* positive adjust */ + if (0 == neg_adj) + { + tmp_frac_nano += tmp_frac_nano * ppb / 1000000000; + } + else /* negative adjust */ + { + freq_adj = tmp_frac_nano * ppb / 1000000000; + if(tmp_frac_nano > freq_adj) + tmp_frac_nano -= freq_adj; + } + PTP_LOG_INFO("new tmp_frac_nano: 0x%llx\n", tmp_frac_nano); + cur_nano = (uint32_t)(tmp_frac_nano >> 32); + cur_frac_nano = tmp_frac_nano & 0xffffffff; + + PTP_LOG_INFO("cur_nano: %u, cur_frac_nano: %u\n", cur_nano, cur_frac_nano); + spin_lock_irqsave(&adapter->tmreg_lock, flags); + + zxdh_write_reg(base_addr, PTP_CLOCK_CYCLE_INTEGER, cur_nano); + zxdh_write_reg(base_addr, PTP_CLOCK_CYCLE_FRACTION, cur_frac_nano); + zxdh_write_reg(base_addr, CLOCK_CYCLE_UPDATE, 1); + + spin_unlock_irqrestore(&adapter->tmreg_lock, flags); + + return 0; +} + + +static int zxdh_ptp_adjtime(struct ptp_clock_info *ptp_clock, s64 delta) +{ + unsigned long flags; + uint32_t run_mode; + uint32_t reg_val; + uint64_t adjust; + // s32 rem; + uint64_t sec; + uint32_t nsec; + + uint64_t base_addr; + uint64_t bar_addr; + struct zxdh_ptp_private *adapter; + PTP_LOG_INFO("name: %s, delta: %lld\n", ptp_clock->name, delta); + + adapter = container_of(ptp_clock, struct zxdh_ptp_private, ptp_caps[0]); + bar_addr = zxdh_ptp_get_bar_addr(adapter); + + base_addr = bar_addr + PTP_HOST_BAR_OFFSET + PTPM_OFFSET_WITH_TOP; + + spin_lock_irqsave(&adapter->tmreg_lock, flags); + // timecounter_adjtime(&adapter->tc, delta); + + /* 1588 timer, update mode */ + if (delta > 0) + { + run_mode = INCRE_MODE; + adjust = delta; + } + else + { + run_mode = DECRE_MODE; + adjust = -delta; + } + + /* adjust value */ + sec = div_u64_rem(adjust, NSEC_PER_SEC, &nsec); + PTP_LOG_INFO("sec: %llu, nsec: %u\n", sec, nsec); + // nsec = rem; + zxdh_write_reg(base_addr, ADJUST_HIGH_TOD_SECOND, (uint32_t)(sec >> 32)); + zxdh_write_reg(base_addr, ADJUST_LOWER_TOD_SECOND, (uint32_t)(sec & 0xffffffff)); + zxdh_write_reg(base_addr, ADJUST_TOD_NANO_SECOND, nsec); + + reg_val = zxdh_read_reg(base_addr, PTP_CONFIGURATION); + reg_val &= ~(0x3 << 4); + reg_val |= run_mode << 4 | 1 << TIMER_1588_UPT_EN_BIT; + zxdh_write_reg(base_addr, PTP_CONFIGURATION, reg_val); + + /* enable adjust */ + zxdh_write_reg(base_addr, TIMER_CONTROL, 1 << 1); + + spin_unlock_irqrestore(&adapter->tmreg_lock, flags); + + return 0; +} + + +static int zxdh_ptp_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts) +{ + uint32_t ns; + uint64_t s; + uint32_t reg_val; + unsigned long flags; + + uint64_t base_addr; + struct zxdh_ptp_private *adapter = container_of(ptp, struct zxdh_ptp_private, ptp_caps[0]); + uint64_t bar_addr = zxdh_ptp_get_bar_addr(adapter); + PTP_LOG_INFO("name: %s\n", ptp->name); + + base_addr = bar_addr + PTP_HOST_BAR_OFFSET + PTPM_OFFSET_WITH_TOP; + + mutex_lock(&adapter->ptp_clk_mutex); + spin_lock_irqsave(&adapter->tmreg_lock, flags); + + // normal mode. + reg_val = zxdh_read_reg(base_addr, PTP_CONFIGURATION); + reg_val &= ~(0x3 << PPS_RUN_MODE_BIT); + reg_val |= NORMAL_MODE << PPS_RUN_MODE_BIT; + zxdh_write_reg(base_addr, PTP_CONFIGURATION, reg_val); + zxdh_write_reg(base_addr, TIMER_LACTH_SEL, 1 << LATCH_1588_TIMER); + zxdh_write_reg(base_addr, TIMER_LATCH_EN, 1); + + ns = zxdh_read_reg(base_addr, LATCH_TOD_NANO_SECOND); + s = zxdh_read_reg(base_addr, LATCH_LOWER_TOD_SECOND); + s |= (uint64_t)zxdh_read_reg(base_addr, LATCH_HIGH_TOD_SECOND) << 32; + + spin_unlock_irqrestore(&adapter->tmreg_lock, flags); + mutex_unlock(&adapter->ptp_clk_mutex); + + // *ts = ns_to_timespec64(ns); + ts->tv_sec = s; + ts->tv_nsec = ns; + PTP_LOG_INFO("kernel get clock time: %lld.%09ld\n", ts->tv_sec, ts->tv_nsec); + + return 0; +} + +static int zxdh_ptp_settime(struct ptp_clock_info *ptp, const struct timespec64 *ts) +{ + unsigned long flags; + uint32_t reg_val; + + uint64_t base_addr; + struct zxdh_ptp_private *adapter = container_of(ptp, struct zxdh_ptp_private, ptp_caps[0]); + + uint64_t bar_addr = zxdh_ptp_get_bar_addr(adapter); + PTP_LOG_INFO("name: %s, sec: %lld, nsec: %ld\n", ptp->name, ts->tv_sec, ts->tv_nsec); + + base_addr = bar_addr + PTP_HOST_BAR_OFFSET + PTPM_OFFSET_WITH_TOP; + + mutex_lock(&adapter->ptp_clk_mutex); + + spin_lock_irqsave(&adapter->tmreg_lock, flags); + + /* adjust value */ + zxdh_write_reg(base_addr, ADJUST_HIGH_TOD_SECOND, (uint32_t)(ts->tv_sec >> 32) & 0xffff); + zxdh_write_reg(base_addr, ADJUST_LOWER_TOD_SECOND, (uint32_t)(ts->tv_sec & 0xffffffff)); + zxdh_write_reg(base_addr, ADJUST_TOD_NANO_SECOND, ts->tv_nsec); + + /* 1588 timer, update mode */ + reg_val = zxdh_read_reg(base_addr, PTP_CONFIGURATION); + reg_val &= ~(0x3 << 4); + reg_val |= UPDATE_MODE << 4 | 1 << TIMER_1588_UPT_EN_BIT; + zxdh_write_reg(base_addr, PTP_CONFIGURATION, reg_val); + + /* enable adjust */ + zxdh_write_reg(base_addr, TIMER_CONTROL, 1 << 1); + + spin_unlock_irqrestore(&adapter->tmreg_lock, flags); + mutex_unlock(&adapter->ptp_clk_mutex); + + return 0; +} + +#if 0 +static int zxdh_ptp_enable_pps(struct zxdh_ptp_private *adapter, int on) +{ + uint32_t reg_val = 0; + uint64_t base_addr; + + uint64_t bar_addr = zxdh_ptp_get_bar_addr(adapter); + + base_addr = bar_addr + PTP_HOST_BAR_OFFSET + PTPM_OFFSET_WITH_TOP; + + // bit14 enable ptp pps output + reg_val = zxdh_read_reg(base_addr, PTP_CONFIGURATION); + reg_val &= ~(1 << 14); + reg_val |= on << 14; + zxdh_write_reg(base_addr, PTP_CONFIGURATION, reg_val); + return 0; +} +#endif +/** + * zxdh_ptp_enable + * @ptp: the ptp clock structure + * @rq: the requested feature to change + * @on: whether to enable or disable the feature + * + */ +static int zxdh_ptp_enable(struct ptp_clock_info *ptp, struct ptp_clock_request *rq, int on) +{ +#if 1 + PTP_LOG_INFO("name: %s, rq->type: %d\n", ptp->name, rq->type); +#else + struct zxdh_ptp_private *adapter = container_of(ptp, struct zxdh_ptp_private, ptp_caps[0]); + int ret = 0; + int pin = -1; + + switch (rq->type) + { + case PTP_CLK_REQ_PPS: + ret = zxdh_ptp_enable_pps(adapter, on); + return ret; + case PTP_CLK_REQ_EXTTS: + if (on) + { + // pin = ptp_find_pin(adapter->ptp_clock[0], PTP_PF_EXTTS, + // rq->extts.index); + // if (pin < 0) + // return -EBUSY; + if (rq->extts.index == 1 || rq->extts.index == 2) // 选择pps0 or pps1做为capture和中断源 + { + adapter->pps_channel = rq->extts.index; + zxdh_write_reg(adapter, PP1S_EXTERNAL_SEL, rq->extts.index - 1, PTP_TOP); + } + } + return 0; + + case PTP_CLK_REQ_PEROUT: + return 0; + } + return -EOPNOTSUPP; +#endif + return 0; +} + +static int zxdh_tsn_adjfreq(struct ptp_clock_info *ptp, s32 ppb) +{ + unsigned long flags; + int neg_adj = 0; + uint32_t cur_nano, cur_frac_nano; + uint64_t tmp_frac_nano; + int timer_no; + uint32_t integer_reg; + uint32_t fraction_reg; + uint64_t base_addr; + uint64_t bar_addr; + uint64_t freq_adj; + struct zxdh_ptp_private *adapter; + + PTP_LOG_INFO("name: %s, ppb: %d\n", ptp->name, ppb); + timer_no = get_tsn_timer_no(ptp->name); + PTP_CHECK_RANGE_WITH_RETURN(timer_no, TSN_TIMER_NAME_MIN_NO, TSN_TIMER_NAME_MAX_NO, -1); + + adapter = container_of(ptp, struct zxdh_ptp_private, ptp_caps[timer_no + 1]); + + bar_addr = zxdh_ptp_get_bar_addr(adapter); + base_addr = bar_addr + PTP_HOST_BAR_OFFSET + PTPM_OFFSET_WITH_TOP; + + if (ppb == 0) + return 0; + + if (ppb < 0) + { + ppb = -ppb; + neg_adj = 1; + } + + integer_reg = tsn_clock_cycle_integer_reg(timer_no); + fraction_reg = tsn_clock_cycle_fraction_reg(timer_no); + + cur_nano = zxdh_read_reg(base_addr, integer_reg); + cur_frac_nano = zxdh_read_reg(base_addr, fraction_reg); + + tmp_frac_nano = ((unsigned long long)cur_nano << 32) + cur_frac_nano; + + PTP_LOG_INFO("cur_nano: %u, cur_frac_nano: %u, tmp_frac_nano: 0x%llx\n", cur_nano, cur_frac_nano, + tmp_frac_nano); + + /* positive adjust */ + if (0 == neg_adj) + { + tmp_frac_nano += tmp_frac_nano * ppb / 1000000000; + } + else /* negative adjust */ + { + freq_adj = tmp_frac_nano * ppb / 1000000000; + if(tmp_frac_nano > freq_adj) + tmp_frac_nano -= freq_adj; + } + + PTP_LOG_INFO("new tmp_frac_nano: 0x%llx\n", tmp_frac_nano); + cur_nano = (uint32_t)(tmp_frac_nano >> 32); + cur_frac_nano = tmp_frac_nano & 0xffffffff; + + PTP_LOG_INFO("cur_nano: %u, cur_frac_nano: %u\n", cur_nano, cur_frac_nano); + spin_lock_irqsave(&adapter->tmreg_lock, flags); + + zxdh_write_reg(base_addr, integer_reg, cur_nano); + zxdh_write_reg(base_addr, fraction_reg, cur_frac_nano); + + zxdh_write_reg(base_addr, CLOCK_CYCLE_UPDATE, 1 << (timer_no + 1)); + + spin_unlock_irqrestore(&adapter->tmreg_lock, flags); + + return 0; +} + + +static int zxdh_tsn_adjtime(struct ptp_clock_info *ptp, s64 delta) +{ + unsigned long flags; + uint32_t run_mode; + uint32_t reg_val; + uint64_t adjust; + uint64_t sec; + uint32_t nsec; + int timer_no; + uint32_t nano_sec_reg; + uint32_t low_sec_reg; + uint32_t high_sec_reg; + int run_mode_bit_shift; + uint64_t base_addr; + uint64_t bar_addr; + struct zxdh_ptp_private *adapter; + + PTP_LOG_INFO("name: %s, delta: %lld\n", ptp->name, delta); + timer_no = get_tsn_timer_no(ptp->name); + PTP_CHECK_RANGE_WITH_RETURN(timer_no, TSN_TIMER_NAME_MIN_NO, TSN_TIMER_NAME_MAX_NO, -1); + + adapter = container_of(ptp, struct zxdh_ptp_private, ptp_caps[timer_no + 1]); + bar_addr = zxdh_ptp_get_bar_addr(adapter); + base_addr = bar_addr + PTP_HOST_BAR_OFFSET + PTPM_OFFSET_WITH_TOP; + + spin_lock_irqsave(&adapter->tmreg_lock, flags); + + /* 1588 timer, update mode */ + if (delta > 0) + { + run_mode = INCRE_MODE; + adjust = delta; + } + else + { + run_mode = DECRE_MODE; + adjust = -delta; + } + + GET_TSN_ADJUST_NANO_REG(timer_no); + GET_TSN_ADJUST_LOW_SEC_REG(timer_no); + GET_TSN_ADJUST_HIGH_SEC_REG(timer_no); + + /* adjust value */ + sec = div_u64_rem(adjust, NSEC_PER_SEC, &nsec); + + PTP_LOG_INFO("sec: %llu, nsec: %u\n", sec, nsec); + // nsec = rem; + zxdh_write_reg(base_addr, high_sec_reg, (uint32_t)(sec >> 32)); + zxdh_write_reg(base_addr, low_sec_reg, (uint32_t)(sec & 0xffffffff)); + zxdh_write_reg(base_addr, nano_sec_reg, nsec); + + run_mode_bit_shift = 4 + timer_no * 2; + reg_val = zxdh_read_reg(base_addr, TSN_TIME_CONFIGURATION); + reg_val &= ~(0x3 << run_mode_bit_shift); + reg_val |= run_mode << run_mode_bit_shift; + zxdh_write_reg(base_addr, TSN_TIME_CONFIGURATION, reg_val); + /* enable adjust */ + zxdh_write_reg(base_addr, TSN_TIMER_CONTROL, 1 << timer_no); + + spin_unlock_irqrestore(&adapter->tmreg_lock, flags); + + return 0; +} + + +static int zxdh_tsn_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts) +{ + uint32_t ns; + uint64_t s; + unsigned long flags; + int timer_no; + uint32_t reg_val; + int run_mode_bit_shift; + uint32_t nano_sec_reg; + uint32_t low_sec_reg; + uint32_t high_sec_reg; + uint64_t base_addr; + uint64_t bar_addr; + struct zxdh_ptp_private *adapter; + + PTP_LOG_INFO("name: %s\n", ptp->name); + timer_no = get_tsn_timer_no(ptp->name); + PTP_CHECK_RANGE_WITH_RETURN(timer_no, TSN_TIMER_NAME_MIN_NO, TSN_TIMER_NAME_MAX_NO, -1); + + adapter = container_of(ptp, struct zxdh_ptp_private, ptp_caps[timer_no + 1]); + bar_addr = zxdh_ptp_get_bar_addr(adapter); + base_addr = bar_addr + PTP_HOST_BAR_OFFSET + PTPM_OFFSET_WITH_TOP; + + mutex_lock(&adapter->ptp_clk_mutex); + + spin_lock_irqsave(&adapter->tmreg_lock, flags); + + // bit11~bit4, configure normal mode, should make sure bit15~bit12 enable + // first. + run_mode_bit_shift = 4 + timer_no * 2; + reg_val = zxdh_read_reg(base_addr, TSN_TIME_CONFIGURATION); + reg_val &= ~(0x3 << run_mode_bit_shift); + reg_val |= NORMAL_MODE << run_mode_bit_shift; + zxdh_write_reg(base_addr, TSN_TIME_CONFIGURATION, reg_val); + + // config latch one tsn timer + reg_val = 0; + reg_val = 1 << (timer_no + 2); + zxdh_write_reg(base_addr, TIMER_LACTH_SEL, reg_val); + + // enable latch + zxdh_write_reg(base_addr, TIMER_LATCH_EN, 1); + + GET_TSN_LATCH_NANO_REG(timer_no); + GET_TSN_LATCH_LOW_SEC_REG(timer_no); + GET_TSN_LATCH_HIGH_SEC_REG(timer_no); + + ns = zxdh_read_reg(base_addr, nano_sec_reg); + s = zxdh_read_reg(base_addr, low_sec_reg); + s |= (uint64_t)zxdh_read_reg(base_addr, high_sec_reg) << 32; + + spin_unlock_irqrestore(&adapter->tmreg_lock, flags); + mutex_unlock(&adapter->ptp_clk_mutex); + + // *ts = ns_to_timespec64(ns); + ts->tv_sec = s; + ts->tv_nsec = ns; + PTP_LOG_INFO("kernel get %s clock time: %lld.%09ld\n", ptp->name, ts->tv_sec, ts->tv_nsec); + + return 0; +} + +/** + * zxdh_tsn_settime + * @ptp: the ptp clock struct + * @ts: the timespec containing the new time + */ +static int zxdh_tsn_settime(struct ptp_clock_info *ptp, const struct timespec64 *ts) +{ + unsigned long flags; + uint32_t reg_val; + int timer_no; + int run_mode_bit_shift; + uint32_t nano_sec_reg; + uint32_t low_sec_reg; + uint32_t high_sec_reg; + uint64_t base_addr; + uint64_t bar_addr; + struct zxdh_ptp_private *adapter; + + PTP_LOG_INFO("name: %s, sec: %lld, nsec: %ld\n", ptp->name, ts->tv_sec, ts->tv_nsec); + timer_no = get_tsn_timer_no(ptp->name); + PTP_CHECK_RANGE_WITH_RETURN(timer_no, TSN_TIMER_NAME_MIN_NO, TSN_TIMER_NAME_MAX_NO, -1); + + adapter = container_of(ptp, struct zxdh_ptp_private, ptp_caps[timer_no + 1]); + bar_addr = zxdh_ptp_get_bar_addr(adapter); + base_addr = bar_addr + PTP_HOST_BAR_OFFSET + PTPM_OFFSET_WITH_TOP; + + mutex_lock(&adapter->ptp_clk_mutex); + + spin_lock_irqsave(&adapter->tmreg_lock, flags); + + GET_TSN_ADJUST_NANO_REG(timer_no); + GET_TSN_ADJUST_LOW_SEC_REG(timer_no); + GET_TSN_ADJUST_HIGH_SEC_REG(timer_no); + + /* adjust value */ + zxdh_write_reg(base_addr, high_sec_reg, (uint32_t)(ts->tv_sec >> 32)); + zxdh_write_reg(base_addr, low_sec_reg, (uint32_t)(ts->tv_sec & 0xffffffff)); + zxdh_write_reg(base_addr, nano_sec_reg, ts->tv_nsec); + + run_mode_bit_shift = 4 + timer_no * 2; + reg_val = zxdh_read_reg(base_addr, TSN_TIME_CONFIGURATION); + reg_val &= ~(0x3 << run_mode_bit_shift); + reg_val |= UPDATE_MODE << run_mode_bit_shift; + zxdh_write_reg(base_addr, TSN_TIME_CONFIGURATION, reg_val); + /* enable adjust */ + zxdh_write_reg(base_addr, TSN_TIMER_CONTROL, 1 << timer_no); + + spin_unlock_irqrestore(&adapter->tmreg_lock, flags); + mutex_unlock(&adapter->ptp_clk_mutex); + + return 0; +} +#if 0 +static int zxdh_tsn_enable_pps(struct zxdh_pf_device *pf_dev, int tsn_timer, int on) +{ + uint32_t reg_val = 0; + + uint64_t base_addr; + + uint64_t bar_addr = zxdh_ptp_get_bar_addr(adapter); + + base_addr = bar_addr + PTP_HOST_BAR_OFFSET + PTPM_OFFSET_WITH_TOP; + + // enable or disable tsn pps + reg_val = zxdh_read_reg(base_addr, TSN_TIME_CONFIGURATION); + reg_val &= ~(1 << (16 + tsn_timer)); + reg_val |= on << (16 + tsn_timer); + zxdh_write_reg(base_addr, TSN_TIME_CONFIGURATION, reg_val); + + // select tsn pps output from test_1pps + // reg_val = 0x4 + tsn_timer; + // zxdh_write_reg(base_addr, TEST_PP1S_SEL, reg_val, PTP_TOP); // + // 这里先不关联配置test_pps输出,单独用ioctl配置test_pps输出 + return 0; +} +#endif +/** + * zxdh_tsn_enable + * @ptp: the ptp clock structure + * @rq: the requested feature to change + * @on: whether to enable or disable the feature + * + */ +static int zxdh_tsn_enable(struct ptp_clock_info *ptp, struct ptp_clock_request *rq, int on) +{ +#if 1 + PTP_LOG_INFO("name: %s, tsn_no: %d, rq->type: %d\n", ptp->name, get_tsn_timer_no(ptp->name), + rq->type); +#else + int timer_no; + timer_no = get_tsn_timer_no(ptp->name); + PTP_CHECK_RANGE_WITH_RETURN(timer_no, TSN_TIMER_NAME_MIN_NO, TSN_TIMER_NAME_MAX_NO, -1); + + struct zxdh_ptp_private *adapter = container_of(ptp, struct zxdh_ptp_private, ptp_caps[timer_no + 1]); + struct zxdh_pf_device *pf_dev = container_of(adapter, struct zxdh_pf_device, ptp); + + int ret = 0; + int pin = -1; + + switch (rq->type) + { + case PTP_CLK_REQ_PPS: + ret = zxdh_tsn_enable_pps(pf_dev, timer_no, on); + return ret; + case PTP_CLK_REQ_EXTTS: + if (on) + { + // pin = ptp_find_pin(adapter->ptp_clock[timer_no+1], PTP_PF_EXTTS, + // rq->extts.index); + // if (pin < 0) + // return -EBUSY; + if (rq->extts.index == 1 || rq->extts.index == 2) // 选择pps0 or pps1做为capture和中断源 + { + adapter->pps_channel = rq->extts.index; + zxdh_write_reg(adapter, PP1S_EXTERNAL_SEL, rq->extts.index - 1, PTP_TOP); + } + } + return 0; + + case PTP_CLK_REQ_PEROUT: + return 0; + } + + return -EOPNOTSUPP; +#endif + return 0; +} + +/* This function handle the pps interrupt event. */ +irqreturn_t msix_extern_pps_irq_from_risc_handler(struct zxdh_pf_device *dev) +{ + uint32_t high_sec, low_sec, nsec; + struct ptp_clock_event event; + int i; + struct zxdh_pf_device *zxdev = dev; + struct zxdh_ptp_private *adapter; + uint64_t bar_addr = 0x0; + uint64_t base_addr = 0x0; + + __u32 pps_event; + __u32 clear_event; + __u32 pps_mask; + + uint32_t nano_sec_reg; + uint32_t low_sec_reg; + uint32_t high_sec_reg; + // PTP_LOG_INFO("irq: %d\n", irq); + + adapter = zxdev->ptp; + bar_addr = zxdh_ptp_get_bar_addr(adapter); + base_addr = bar_addr + PTP_HOST_BAR_OFFSET + PTPM_OFFSET_WITH_TOP; + pps_event = zxdh_read_reg(base_addr, INTERRUPT_EVENT); // 0x10 + pps_mask = zxdh_read_reg(base_addr, INTERRUPT_MASK); + PTP_LOG_INFO("bar_addr: 0x%llx, pps_event: 0x%x,pps_mask: 0x%x, capture_timer: %d\n",bar_addr, pps_event, pps_mask, zxdev->ptp->interrupt_capture_timer); + + // disable int + for(i = 0; i < PTPM_INTERRUPT_BIT_NUM; i++) + { + if(pps_event & (1 << i)) + zxdh_write_reg(base_addr, INTERRUPT_MASK, pps_mask & (~(1 << i))); + } + + // 清中断event + clear_event = pps_mask & pps_event; // 0x10 + zxdh_write_reg(base_addr, INTERRUPT_EVENT, clear_event); + + if(zxdev->ptp->interrupt_capture_timer > INTERRUPT_CAP_TIMER_MAX_NO) + { + PTP_LOG_INFO("capture_timer: %u out of range!\n", zxdev->ptp->interrupt_capture_timer); + return -1; + } + // 用status不如用event准 + if (pps_event & (1 << EXTERNAL_PPS_BIT)) // 外部PPS信号产生的中断,Capture模式抓到的TOD + { + // 1588 timer + if (zxdev->ptp->interrupt_capture_timer == 0) + { + nsec = zxdh_read_reg(base_addr, PPS_LATCH_TOD_NANO_SECOND); + low_sec = zxdh_read_reg(base_addr, PPS_LATCH_LOWER_TOD_SECOND); + high_sec = zxdh_read_reg(base_addr, PPS_LATCH_HIGH_TOD_SECOND); + } + else // tsn timer + { + GET_PPS_LATCH_TSN_HIGH_SEC_REG(zxdev->ptp->interrupt_capture_timer); + GET_PPS_LATCH_TSN_LOW_SEC_REG(zxdev->ptp->interrupt_capture_timer); + GET_PPS_LATCH_TSN_NANO_REG(zxdev->ptp->interrupt_capture_timer); + nsec = zxdh_read_reg(base_addr, nano_sec_reg); + low_sec = zxdh_read_reg(base_addr, low_sec_reg); + high_sec = zxdh_read_reg(base_addr, high_sec_reg); + } + } + else if (pps_event & (1 << TRIGGER_IN_BIT)) // trigger in信号捕捉的TOD + { + nsec = zxdh_read_reg(base_addr, TRIGGER_IN_TOD_NANO_SECOND); + low_sec = zxdh_read_reg(base_addr, TRIGGER_IN_LOWER_TOD_SECOND); + high_sec = zxdh_read_reg(base_addr, TRIGGER_IN_HIGH_TOD_SECOND); + } + else + { + PTP_LOG_INFO("unknown pps irq\n"); + nsec = 0; + low_sec = 0; + high_sec = 0; + } + + event.type = PTP_CLOCK_EXTTS; + event.index = 0; + event.timestamp = (((uint64_t)high_sec << 32) | low_sec) * 1000000000ULL + nsec; + PTP_LOG_INFO("nsec: %u, low_sec: %u, high_sec: %u\n", nsec, low_sec, high_sec); + PTP_LOG_INFO("capture_timer: %u, timestamp: %u.%09u\n", zxdev->ptp->interrupt_capture_timer, low_sec, + nsec); + ptp_clock_event(zxdev->ptp->ptp_clock[zxdev->ptp->interrupt_capture_timer], &event); + + // enable int + zxdh_write_reg(base_addr, INTERRUPT_MASK, pps_mask); + + return IRQ_HANDLED; +} +EXPORT_SYMBOL(msix_extern_pps_irq_from_risc_handler); + +irqreturn_t msix_local_pps_irq_from_risc_handler(struct zxdh_pf_device *dev) +{ + struct ptp_clock_event event; + __u32 reg_int; + struct zxdh_pf_device *zxdev = dev; + struct zxdh_ptp_private *adapter; + uint64_t bar_addr = 0x0; + uint64_t base_addr = 0x0; + + adapter = zxdev->ptp; + bar_addr = zxdh_ptp_get_bar_addr(adapter); + base_addr = bar_addr + PTP_HOST_BAR_OFFSET; + // PTP_LOG_INFO("irq: %d\n", irq); + event.type = PTP_CLOCK_PPS; + + /* adapter->ptp_clock[0]中创建pps, 用pps对应local_pps的中断 */ + if (!zxdev->ptp->ptp_clock[0]) + return IRQ_HANDLED; + + ptp_clock_event(zxdev->ptp->ptp_clock[0], &event); + + base_addr = bar_addr + PTP_HOST_BAR_OFFSET; + reg_int = zxdh_read_reg(base_addr, LOCAL_PPS_INTERRUPT); // 0x10 + PTP_LOG_INFO("bar_addr: 0x%llx, reg_int: 0x%x\n",bar_addr, reg_int); + reg_int |= 1 << 1; + zxdh_write_reg(base_addr, LOCAL_PPS_INTERRUPT, reg_int); + +#if 0 // only debug for local pps + uint64_t ns; + uint32_t s; + static uint64_t last_ns; + static uint32_t last_s; + + reg_val = zxdh_read_reg(adapter, PTP_CONFIGURATION, PTP_M); + reg_val &= ~(0x3 << 4); + reg_val |= NORMAL_MODE << 4; + zxdh_write_reg(adapter, PTP_CONFIGURATION, reg_val, PTP_M); + + // config latch 1588 timer + zxdh_write_reg(adapter, TIMER_LACTH_SEL, 1 << LATCH_1588_TIMER, PTP_M); + + // enable latch + zxdh_write_reg(adapter, TIMER_LATCH_EN, 1, PTP_M); + + + ns = zxdh_read_reg(adapter, LATCH_TOD_NANO_SECOND, PTP_M); + s = zxdh_read_reg(adapter, LATCH_LOWER_TOD_SECOND, PTP_M); + // hwts->s |= (uint64_t)zxdh_read_reg(adapter, LATCH_HIGH_TOD_SECOND, PTP_M) << 32; + + // ns += s * 1000000000ULL; + last_ns = ns; + last_s = s; + PTP_LOG_INFO("timestamp: cur:%llu.%09lu\n", low_sec*200, nsec); + +#endif + + return IRQ_HANDLED; +} +EXPORT_SYMBOL(msix_local_pps_irq_from_risc_handler); + +// for net_device driver get timestamp, param ptp get from get_tsn_clock +// function. hw timestamp only use 32 bit. +int get_pkt_timestamp(int32_t clock_no, struct zxdh_en_device *en_dev, struct time_stamps *ts, u32 *hwts) +{ + u32 nano_sec_reg; + u32 low_sec_reg; + u32 high_sec_reg; + int timer_no; + int run_mode_bit_shift; + u32 reg_val; + struct time_stamps temp_ts; + unsigned long flags; + uint64_t base_addr; + uint64_t bar_addr; + struct zxdh_ptp_private *adapter; + struct ptp_clock_info *ptp; + int phcidx; + + + if (NULL == en_dev || NULL == ts || NULL == hwts) + return -1; + + adapter = zxdh_ptp_get_ptp_private(en_dev); + for(phcidx = 0; phcidx < ZX_CLOCK_TIMER_NUM; phcidx++) + { + if(clock_no == ptp_clock_index(adapter->ptp_clock[phcidx])) + { + ptp = &adapter->ptp_caps[phcidx]; + break; + } + } + if(phcidx == ZX_CLOCK_TIMER_NUM) + { + PTP_LOG_ERR("get phcindex fail\n"); + return -1; + } + bar_addr = zxdh_ptp_get_bar_addr(adapter); + base_addr = bar_addr + PTP_HOST_BAR_OFFSET + PTPM_OFFSET_WITH_TOP; + + + PTP_LOG_INFO("ptp->name: %s, bar_addr: 0x%llx\n", ptp->name, bar_addr); + // first 80bit and second 80bit: both are 1588 timestamp + if (0 == strcmp(ptp->name, "ptp0")) + { + PTP_LOG_INFO("ptp0\n"); + spin_lock_irqsave(&adapter->tmreg_lock, flags); + + reg_val = zxdh_read_reg(base_addr, PTP_CONFIGURATION); + reg_val &= ~(0x3 << PPS_RUN_MODE_BIT); + reg_val |= NORMAL_MODE << PPS_RUN_MODE_BIT; + zxdh_write_reg(base_addr, PTP_CONFIGURATION, reg_val); + + // config latch 1588 timer and hw timer + zxdh_write_reg(base_addr, TIMER_LACTH_SEL, 1 << LATCH_1588_TIMER | 1 << LATCH_HW_TIMER); + + // enable latch + zxdh_write_reg(base_addr, TIMER_LATCH_EN, 1); + + temp_ts.ns = zxdh_read_reg(base_addr, LATCH_TOD_NANO_SECOND); + temp_ts.s = zxdh_read_reg(base_addr, LATCH_LOWER_TOD_SECOND); + temp_ts.s |= (u64)zxdh_read_reg(base_addr, LATCH_HIGH_TOD_SECOND) << 32; + + ts->ns = temp_ts.ns; + ts->s = temp_ts.s; + + ts++; + ts->ns = temp_ts.ns; + ts->s = temp_ts.s; + + *hwts = zxdh_read_reg(base_addr, LATCH_HARDWARE_TIME_LOW); + + spin_unlock_irqrestore(&adapter->tmreg_lock, flags); + // PTP_LOG_INFO("ts[]: 0x%x.%x, hwts: 0x%x\n", ts->s, ts->ns, *hwts); + } + else // first 80bit is 1588 timestamp, second 80bit is one tsn timestamp + { + timer_no = get_tsn_timer_no(ptp->name); + PTP_LOG_INFO("tsn: %d\n", timer_no); + PTP_CHECK_RANGE_WITH_RETURN(timer_no, TSN_TIMER_NAME_MIN_NO, TSN_TIMER_NAME_MAX_NO, -1); + + spin_lock_irqsave(&adapter->tmreg_lock, flags); + + reg_val = zxdh_read_reg(base_addr, PTP_CONFIGURATION); + reg_val &= ~(0x3 << PPS_RUN_MODE_BIT); + reg_val |= NORMAL_MODE << PPS_RUN_MODE_BIT; + zxdh_write_reg(base_addr, PTP_CONFIGURATION, reg_val); + + // bit11~bit4, configure normal mode, should make sure bit15~bit12 enable + // first. + run_mode_bit_shift = 4 + timer_no * 2; + reg_val = zxdh_read_reg(base_addr, TSN_TIME_CONFIGURATION); + reg_val &= ~(0x3 << run_mode_bit_shift); + reg_val |= NORMAL_MODE << run_mode_bit_shift; + zxdh_write_reg(base_addr, TSN_TIME_CONFIGURATION, reg_val); + + // config latch 1588 and one tsn timer and hw timer + zxdh_write_reg(base_addr, TIMER_LACTH_SEL, 1 << LATCH_1588_TIMER | 1 << LATCH_HW_TIMER | 1 << (timer_no + 2)); + + // enable latch + zxdh_write_reg(base_addr, TIMER_LATCH_EN, 1); + + // read 1588 timer + ts->ns = zxdh_read_reg(base_addr, LATCH_TOD_NANO_SECOND); + ts->s = zxdh_read_reg(base_addr, LATCH_LOWER_TOD_SECOND); + ts->s |= (u64)zxdh_read_reg(base_addr, LATCH_HIGH_TOD_SECOND) << 32; + + ts++; + + GET_TSN_LATCH_NANO_REG(timer_no); + GET_TSN_LATCH_LOW_SEC_REG(timer_no); + GET_TSN_LATCH_HIGH_SEC_REG(timer_no); + // read one tsn timer + ts->ns = zxdh_read_reg(base_addr, nano_sec_reg); + ts->s = zxdh_read_reg(base_addr, low_sec_reg); + ts->s |= (u64)zxdh_read_reg(base_addr, high_sec_reg) << 32; + + *hwts = zxdh_read_reg(base_addr, LATCH_HARDWARE_TIME_LOW); + + spin_unlock_irqrestore(&adapter->tmreg_lock, flags); + // PTP_LOG_INFO("ts[]: 0x%x.%x, hwts: 0x%x\n", ts->s, ts->ns, *hwts); + } + + return 0; +} +EXPORT_SYMBOL(get_pkt_timestamp); + +#define PTPS_NUMS 3 +int enable_write_ts_to_fifo(struct zxdh_en_device *en_dev, u32 enable, u32 mac_number) +{ + uint64_t base_addr; + uint64_t bar_addr; + struct zxdh_ptp_private *adapter; + + if (PTPS_NUMS <= mac_number) + { + PTP_LOG_ERR("mac number out of range\n"); + return -1; + } + + + if (NULL == en_dev) + return -1; + + adapter = zxdh_ptp_get_ptp_private(en_dev); + bar_addr = zxdh_ptp_get_bar_addr(adapter); + base_addr = bar_addr + PTPS_HOST_BAR_OFFSET; + + PTP_LOG_INFO("bar_addr: 0x%llx, enable: %u, mac: %u\n", bar_addr, enable, mac_number); + zxdh_write_reg(base_addr, PTPS_CONFIGURATION, enable); + + return 0; +} +EXPORT_SYMBOL(enable_write_ts_to_fifo); + +int get_event_ts_info(struct zxdh_en_device *en_dev, struct ptp_buff *p_tsInfo, u32 mac_number) +{ + u32 count; + int i; + uint64_t base_addr; + uint64_t bar_addr; + // enum reg_module ptps_module; + struct zxdh_ptp_private *adapter; + + if (PTPS_NUMS <= mac_number) + { + PTP_LOG_ERR("mac number out of range\n"); + return -1; + } + + if (NULL == en_dev || NULL == p_tsInfo) + { + PTP_LOG_ERR("input pointer null\n"); + return -1; + } + + adapter = zxdh_ptp_get_ptp_private(en_dev); + bar_addr = zxdh_ptp_get_bar_addr(adapter); + base_addr = bar_addr + PTPS_HOST_BAR_OFFSET; + + // the maximum count is 64 + count = zxdh_read_reg(base_addr, PTP1588_EVENT_MESSAGE_FIFO_STATUS) & 0xff; + // half is timestamp and half is match info(messageType, sourcePortIdentity, + // sequenceId) + if(count > PTP_ENCRYPTED_MESG_MAX_NUM) + { + PTP_LOG_ERR("encrypted ptp message out of range!\n"); + return -1; + } + count /= 2; + PTP_LOG_INFO("count: %d\n", count); + + for (i = 0; i < count; i++) + { + zxdh_write_reg(base_addr, PTPS_TIMER_CONTROL, 1); + // read timestamp + p_tsInfo->ptpRegInfo[i].cfVal[0] = zxdh_read_reg(base_addr, PTP1588_EVENT_MESSAGE_TS_LOW); + p_tsInfo->ptpRegInfo[i].cfVal[1] = zxdh_read_reg(base_addr, PTP1588_EVENT_MESSAGE_TS_HIGH); + + PTP_LOG_INFO("i: %d, low: 0x%x, high: 0x%x\n", i, p_tsInfo->ptpRegInfo[i].cfVal[0], p_tsInfo->ptpRegInfo[i].cfVal[1]); + zxdh_write_reg(base_addr, PTPS_TIMER_CONTROL, 1); + // read messageType, sourcePortIdentity, sequenceId + p_tsInfo->ptpRegInfo[i].matchInfo = zxdh_read_reg(base_addr, PTP1588_EVENT_MESSAGE_TS_LOW); + PTP_LOG_INFO("i: %d, matchInfo: 0x%x\n", i, p_tsInfo->ptpRegInfo[i].matchInfo); + } + p_tsInfo->cfCount = count; + PTP_LOG_INFO("success\n"); + return 0; +} +EXPORT_SYMBOL(get_event_ts_info); + +int32_t set_interrupt_capture_timer(struct zxdh_en_device *en_dev, uint32_t index) +{ + struct zxdh_ptp_private *adapter; + if (NULL == en_dev) + return -1; + + if(index > INTERRUPT_CAP_TIMER_MAX_NO) + { + PTP_LOG_INFO("capture_timer: %u out of range!\n", index); + return -1; + } + adapter = zxdh_ptp_get_ptp_private(en_dev); + adapter->interrupt_capture_timer = index; + PTP_LOG_INFO("index: %u\n",index); + PTP_LOG_INFO("pci_ioremap_addr[0]=0x%llx,pcie_id: 0x%x, vport: 0x%x, phy_port: %u\n",adapter->pdev->pci_ioremap_addr[0], adapter->pdev->pcie_id, adapter->pdev->vport, adapter->pdev->phy_port); + return 0; +} +EXPORT_SYMBOL(set_interrupt_capture_timer); + +int32_t zxdh_set_pps_selection(struct zxdh_en_device *en_dev, uint32_t pps_type, uint32_t selection) +{ + struct zxdh_ptp_private *adapter; + uint64_t base_addr; + uint64_t bar_addr; + if (NULL == en_dev) + return -1; + + if(pps_type > PP1S_EXTERNAL || selection > PP1S_TSN3) + return -1; + + adapter = zxdh_ptp_get_ptp_private(en_dev); + bar_addr = zxdh_ptp_get_bar_addr(adapter); + base_addr = bar_addr + PTP_HOST_BAR_OFFSET; + + PTP_LOG_INFO("pps_type: %s, selection: %u\n", pps[pps_type], selection); + + switch (pps_type) + { + case PP1S_OUT: + zxdh_write_reg(base_addr, PP1S_OUT_SEL, selection); + break; + case PP1S_TEST: + zxdh_write_reg(base_addr, TEST_PP1S_SEL, selection); + break; + case PP1S_EXTERNAL: + // zxdh_write_reg(adapter, PP1S_EXTERNAL_SEL, sel->config, PTP_TOP);// + // 这个用PTP_CLK_REQ_EXTTS来配置 + break; + default: + break; + } + + return 0; +} +EXPORT_SYMBOL(zxdh_set_pps_selection); + +int32_t zxdh_set_pd_detection(struct zxdh_en_device *en_dev, uint32_t pd_index, uint32_t pd_input1, uint32_t pd_input2) +{ + struct zxdh_ptp_private *adapter; + uint64_t base_addr; + uint32_t reg_val; + uint64_t bar_addr; + if (NULL == en_dev) + return -1; + + adapter = zxdh_ptp_get_ptp_private(en_dev); + bar_addr = zxdh_ptp_get_bar_addr(adapter); + base_addr = bar_addr + PTP_HOST_BAR_OFFSET; + + PTP_LOG_INFO("pd_index: %u, pd_input1: %u, pd_input2: %u\n", pd_index, pd_input1, pd_input2); + + // bit1~0: Pd_U1_Sel0 bit3~2: Pd_U1_Sel1. + reg_val = pd_input1 | pd_input2 << 3; + + if (PHASE_DETECTION1 == pd_index) + { + zxdh_write_reg(base_addr, PD_U1_SEL, reg_val); + } + else if(PHASE_DETECTION2 == pd_index) + { + zxdh_write_reg(base_addr, PD_U2_SEL, reg_val); + } + else + { + PTP_LOG_ERR("pd_index error\n"); + return -1; + } + + return 0; +} +EXPORT_SYMBOL(zxdh_set_pd_detection); + +int32_t zxdh_get_pd_value(struct zxdh_en_device *en_dev, uint32_t pd_index, uint32_t *pd_result) +{ + struct zxdh_ptp_private *adapter; + uint64_t base_addr; + uint64_t bar_addr; + if (NULL == en_dev) + return -1; + + adapter = zxdh_ptp_get_ptp_private(en_dev); + bar_addr = zxdh_ptp_get_bar_addr(adapter); + base_addr = bar_addr + PTP_HOST_BAR_OFFSET; + + if (PHASE_DETECTION1 == pd_index) + { + *pd_result = zxdh_read_reg(base_addr, PD_U1_RESULT); + } + else if(PHASE_DETECTION2 == pd_index) + { + *pd_result = zxdh_read_reg(base_addr, PD_U2_RESULT); + } + else + { + PTP_LOG_ERR("pd_index error\n"); + return -1; + } + PTP_LOG_INFO("pd_index: %u, pd_result: 0x%x\n", pd_index, *pd_result); + + return 0; +} +EXPORT_SYMBOL(zxdh_get_pd_value); + +int get_hw_timestamp(struct zxdh_en_device *en_dev, u32 *hwts) +{ + u32 reg_val; + unsigned long flags; + uint64_t base_addr; + uint64_t bar_addr; + struct zxdh_ptp_private *adapter; + + + if (NULL == en_dev || NULL == hwts) + return -1; + + adapter = zxdh_ptp_get_ptp_private(en_dev); + bar_addr = zxdh_ptp_get_bar_addr(adapter); + base_addr = bar_addr + PTP_HOST_BAR_OFFSET + PTPM_OFFSET_WITH_TOP; + + spin_lock_irqsave(&adapter->tmreg_lock, flags); + + + reg_val = zxdh_read_reg(base_addr, PTP_CONFIGURATION); + reg_val &= ~(0x3 << PPS_RUN_MODE_BIT); + reg_val |= NORMAL_MODE << PPS_RUN_MODE_BIT; + zxdh_write_reg(base_addr, PTP_CONFIGURATION, reg_val); + + // config latch hw timer + zxdh_write_reg(base_addr, TIMER_LACTH_SEL, 1 << LATCH_HW_TIMER); + + // enable latch + zxdh_write_reg(base_addr, TIMER_LATCH_EN, 1); + + *hwts = zxdh_read_reg(base_addr, LATCH_HARDWARE_TIME_LOW); + + + spin_unlock_irqrestore(&adapter->tmreg_lock, flags); + // PTP_LOG_INFO("ts[]: 0x%x.%x, hwts: 0x%x\n", ts->s, ts->ns, *hwts); + + return 0; +} +EXPORT_SYMBOL(get_hw_timestamp); + + +int zxdh_ptp_init(struct dh_core_dev *zxdev) +{ + struct zxdh_ptp_private *zxp; + int err = -ENOMEM; + int i; + + uint32_t reg; + uint64_t base_addr; + int size; + struct zxdh_pf_device *pf_dev = dh_core_priv(zxdev); + + base_addr = pf_dev->pci_ioremap_addr[0] + PTP_HOST_BAR_OFFSET; + + zxp = kzalloc(sizeof(*zxp), GFP_KERNEL); + if (!zxp) + { + PTP_LOG_ERR("zxp kzalloc failed\n"); + goto no_memory; + } + + err = -ENODEV; + + zxp->ptp_caps[0].owner = THIS_MODULE; + strlcpy(zxp->ptp_caps[0].name, "ptp0", sizeof(zxp->ptp_caps[0].name)); + + zxp->ptp_caps[0].max_adj = 999999999; + zxp->ptp_caps[0].n_alarm = 0; + zxp->ptp_caps[0].n_ext_ts = 0; // ptp_chardev.c: ptp_ioctl: if (req.extts.index >= ops->n_ext_ts) 需要改初值 + zxp->ptp_caps[0].n_per_out = 0; + zxp->ptp_caps[0].n_pins = 0; // + zxp->ptp_caps[0].pps = 1; + zxp->ptp_caps[0].adjfreq = zx_ptp_adjfreq; + zxp->ptp_caps[0].adjtime = zxdh_ptp_adjtime; + zxp->ptp_caps[0].gettime64 = zxdh_ptp_gettime; + zxp->ptp_caps[0].settime64 = zxdh_ptp_settime; + zxp->ptp_caps[0].enable = zxdh_ptp_enable; + + zxp->ptp_clock[0] = ptp_clock_register(&zxp->ptp_caps[0], &zxdev->pdev->dev); + if (IS_ERR(zxp->ptp_clock[0])) + { + zxp->ptp_clock[0] = NULL; + PTP_LOG_ERR("ptp_clock_register ptp0 failed\n"); + goto no_clock; + } + + for (i = 0; i < ZX_TSN_TIMER_NUM; i++) + { + zxp->ptp_caps[i+1].owner = THIS_MODULE; + size = snprintf(zxp->ptp_caps[i + 1].name, sizeof(zxp->ptp_caps[i+1].name), "tsn%d", i); + if(size >= sizeof(zxp->ptp_caps[i+1].name)) + zxp->ptp_caps[i + 1].name[sizeof(zxp->ptp_caps[i+1].name)-1] = '\0'; + + zxp->ptp_caps[i + 1].max_adj = 999999999; + zxp->ptp_caps[i + 1].n_alarm = 0; + zxp->ptp_caps[i + 1].n_ext_ts = 0; + zxp->ptp_caps[i + 1].n_per_out = 0; + zxp->ptp_caps[i + 1].n_pins = 0; + zxp->ptp_caps[i + 1].pps = 0; + zxp->ptp_caps[i + 1].adjfreq = zxdh_tsn_adjfreq; + zxp->ptp_caps[i + 1].adjtime = zxdh_tsn_adjtime; + zxp->ptp_caps[i + 1].gettime64 = zxdh_tsn_gettime; + zxp->ptp_caps[i + 1].settime64 = zxdh_tsn_settime; + zxp->ptp_caps[i + 1].enable = zxdh_tsn_enable; + zxp->ptp_clock[i + 1] = ptp_clock_register(&zxp->ptp_caps[i + 1], &zxdev->pdev->dev); + if (IS_ERR(zxp->ptp_clock[i + 1])) + { + zxp->ptp_clock[i + 1] = NULL; + PTP_LOG_ERR("ptp_clock_register tsn%d failed\n", i); + goto no_clock; + } + } + + spin_lock_init(&zxp->tmreg_lock); + mutex_init(&zxp->ptp_clk_mutex); + + pf_dev->ptp = zxp; + zxp->pdev = pf_dev; + + reg = zxdh_read_reg(base_addr + PTPM_OFFSET_WITH_TOP, PTP_CONFIGURATION); + reg |= 1 << 15; + zxdh_write_reg(base_addr + PTPM_OFFSET_WITH_TOP, PTP_CONFIGURATION, reg); + // enable four tsn timer and tsn pps enable + zxdh_write_reg(base_addr + PTPM_OFFSET_WITH_TOP, TSN_TIME_CONFIGURATION, 0xff000); + + // timesync delay + zxdh_write_reg(base_addr, TSN_GROUP_NANO_SEC_DELAY0, 0x1); + zxdh_write_reg(base_addr, TSN_GROUP_NANO_SEC_DELAY1, 0x1); + zxdh_write_reg(base_addr, TSN_GROUP_NANO_SEC_DELAY2, 0x1); + zxdh_write_reg(base_addr, TSN_GROUP_NANO_SEC_DELAY3, 0x1); + zxdh_write_reg(base_addr, PTP1588_NP_NANO_SEC_DELAY, 0x1); + zxdh_write_reg(base_addr, PTP1588_NVME_NANO_SEC_DELAY1, 0x13); + zxdh_write_reg(base_addr, PTP1588_NVME_NANO_SEC_DELAY2, 0x13); + zxdh_write_reg(base_addr, PTP1588_RDMA_NANO_SEC_DELAY, 0xC); + + return 0; + +no_clock: + kfree(zxp); +no_memory: + return err; +} +EXPORT_SYMBOL(zxdh_ptp_init); + +void zxdh_ptp_stop(struct dh_core_dev *zxdev) +{ + int i; + struct zxdh_pf_device *pf_dev = dh_core_priv(zxdev); + struct zxdh_ptp_private *zxp = pf_dev->ptp; + + if (NULL == zxp) + return; + + for (i = 0; i < ZX_CLOCK_TIMER_NUM; i++) + { + if (zxp->ptp_clock[i]) + ptp_clock_unregister(zxp->ptp_clock[i]); + } + + kfree(zxp); +} +EXPORT_SYMBOL(zxdh_ptp_stop); diff --git a/src/net/drivers/net/ethernet/dinghai/en_ptp/zxdh_ptp.h b/src/net/drivers/net/ethernet/dinghai/en_ptp/zxdh_ptp.h new file mode 100644 index 0000000..56d8155 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_ptp/zxdh_ptp.h @@ -0,0 +1,103 @@ +#ifndef _ZX_PTP_H +#define _ZX_PTP_H + +#include +#include "../en_pf.h" + +#define ZX_CLOCK_TIMER_NUM 5 // 1st: ptp, other: tsn +#define ZX_TSN_TIMER_NUM 4 + +#define PTP_REG_INFO_NUM 32 +#define PTP_ENCRYPTED_MESG_MAX_NUM 64 + +#define PTP_DRIVER_UNINIT 0 +#define PTP_DRIVER_INITED 1 + +#define PTP_HOST_BAR_OFFSET 0xc000 +#define PTPS_HOST_BAR_OFFSET 0x34000 + +#define PHASE_DETECTION1 1 +#define PHASE_DETECTION2 2 + +#define PTPM_INTERRUPT_BIT_NUM 5 + +#define TSN_TIMER_NAME_MIN_NO 0 +#define TSN_TIMER_NAME_MAX_NO 3 + +#define INTERRUPT_CAP_TIMER_MIN_NO 0 +#define INTERRUPT_CAP_TIMER_MAX_NO 4 +#define PTP_CHECK_RANGE_WITH_RETURN(val, min, max, ret) \ + do { \ + if(!(min <= val && val <= max)) \ + return ret; \ + }while(0) + +struct time_stamps +{ + u64 s; + u32 ns; +}; + +struct pkt_hw_ts +{ + struct time_stamps ts[2]; +}; + +enum +{ + PP1S_OUT, + PP1S_TEST, + PP1S_EXTERNAL, // maybe use PTP_CLK_REQ_EXTTS +}; + +typedef enum +{ + // PPS_OUT / TEST_PP1S / EXTERNAL_PP1S selection: + PP1S_REF0, + PP1S_REF1, + // PPS_OUT / TEST_PP1S selection: + PP1S_LOCAL, + PP1S_1588, + // TEST PP1S selection only: + PP1S_TSN0, + PP1S_TSN1, + PP1S_TSN2, + PP1S_TSN3 +}PPS_SELECT; + +struct zxdh_ptp_private { + // void __iomem *ptpm_regs; + // void __iomem *ptp_top_regs; + // void __iomem *ptps0_regs; + // void __iomem *ptps1_regs; + // void __iomem *ptps2_regs; + + struct mutex ptp_clk_mutex; + struct zxdh_pf_device *pdev; + struct ptp_clock *ptp_clock[ZX_CLOCK_TIMER_NUM]; + struct ptp_clock_info ptp_caps[ZX_CLOCK_TIMER_NUM]; + unsigned int pps_channel; // externel pps0/pps1 + unsigned int interrupt_capture_timer; + + spinlock_t tmreg_lock; + +}; + +struct ptp_reg_info +{ + uint32_t cfVal[2]; + uint32_t matchInfo; +}; + +struct ptp_buff +{ + uint32_t cfCount; + struct ptp_reg_info ptpRegInfo[PTP_REG_INFO_NUM]; +}; + +int zxdh_ptp_init(struct dh_core_dev *zxdev); +void zxdh_ptp_stop(struct dh_core_dev *zxdev); +irqreturn_t msix_extern_pps_irq_from_risc_handler(struct zxdh_pf_device *dev); +irqreturn_t msix_local_pps_irq_from_risc_handler(struct zxdh_pf_device *dev); + +#endif /* _ZX_PTP_H */ diff --git a/src/net/drivers/net/ethernet/dinghai/en_ptp/zxdh_ptp_common.h b/src/net/drivers/net/ethernet/dinghai/en_ptp/zxdh_ptp_common.h new file mode 100644 index 0000000..902e507 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_ptp/zxdh_ptp_common.h @@ -0,0 +1,12 @@ +#ifndef _ZX_PTP_COMMON_H +#define _ZX_PTP_COMMON_H + +#include + +#define PTP_LOG_ERR(fmt, arg...) DH_LOG_ERR(MODULE_PTP, fmt, ##arg); +#define PTP_LOG_INFO(fmt, arg...) DH_LOG_INFO(MODULE_PTP, fmt, ##arg); +#define PTP_LOG_DEBUG(fmt, arg...) DH_LOG_DEBUG(MODULE_PTP, fmt, ##arg); +#define PTP_LOG_WARN(fmt, arg...) DH_LOG_WARNING(MODULE_PTP, fmt, ##arg); + + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_ptp/zxdh_ptp_regs.h b/src/net/drivers/net/ethernet/dinghai/en_ptp/zxdh_ptp_regs.h new file mode 100644 index 0000000..0103e92 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_ptp/zxdh_ptp_regs.h @@ -0,0 +1,460 @@ +#ifndef _ZX_REGS_H +#define _ZX_REGS_H + +/**************************** ptpm start **************************/ + +#define PTPM_OFFSET_WITH_TOP 0x4000 + +#define EXTERNAL_PPS_BIT 4 +#define TRIGGER_OUT_BIT 1 +#define TRIGGER_IN_BIT 0 +/* bit4: pps_in_status + 0: not receive pps + 1: receive pps */ +#define INTERRUPT_STATUS 0x00000010 +/* bit4: pps income event, writing 1 to the bit clearing it + 0: not receive pps + 1: receive pps */ +#define INTERRUPT_EVENT 0x00000014 +/* bit4: pps income event mask + 0: mask + 1: no mask */ +#define INTERRUPT_MASK 0x00000018 +/* bit4: trigger pps income event test + 0: not occur + 1: occur */ +#define INTERRUPT_TEST 0x0000001C + +/* adjust clock cycle, for 1588 and hw timer */ +#define PTP_CLOCK_CYCLE_INTEGER 0x00000030 +#define PTP_CLOCK_CYCLE_FRACTION 0x00000034 + +/* + BIT18: trig oe + 1: trig out + 0: trig in + bit17: hw timer update enable, used when timer run mode is update,increment or decrement + 0: update disable + 1: update enable + bit16: 1588 timer update enable, used when timer run mode is update,increment or decrement + 0: update disable + 1: update enable + bit15: 1588 and hw time timer enable + 0: timer disable + 1: timer enable + bit8: pps input select + 0: select internal pps + 1: select external pps + bit5:4 1588 tod and hw timer run mode + 0: normal + 1: update + 2: increment + 3: decrement + bit2: trigger out enable + 0:disable + 1:enable + bit1: trigger in enable + 0:disable + 1:enable + bit0: 1588 tod timer slave/capture mode + 0:capture mode, capture 1588 tod timer when input pps pulse + 1:slave mode, the timer make the input pps as reference +*/ +#define PTP_CONFIGURATION 0x00000040 + +#define PPS_TRIGGER_IN_BIT 1 +#define PPS_TRIGGER_OUT_BIT 2 +#define PPS_RUN_MODE_BIT 4 +#define PPS_INPUT_SEL_BIT 8 +#define TIMER_EN_BIT 15 +#define TIMER_1588_UPT_EN_BIT 16 +#define TIMER_HW_UPT_EN_BIT 17 +#define TRIG_OE 18 +enum timer_run_mode { + NORMAL_MODE, + UPDATE_MODE, + INCRE_MODE, + DECRE_MODE, +}; +/* bit1: adjust the 1588 tod and hw timer + 0: not adjust + 1: adjust the timer with add/sub/ or update + */ +#define TIMER_CONTROL 0x00000044 +#define ADJ_TIMER_BIT 1 + +/* + bit4: tsn3 clock cycle update enable + bit3: tsn2 clock cycle update enable + bit2: tsn1 clock cycle update enable + bit1: tsn0 clock cycle update enable + bit0: 1588 clock cycle update enable +*/ +#define CLOCK_CYCLE_UPDATE 0x0000004C + +/* bit31~16: nanosecond 0~0xffff + bit15~0 : frac nanosecond 0~0xffff */ +#define PPS_INCOME_DELAY 0x00000048 +/* bit0, 0:not latch, 1:latch the timer */ +#define TIMER_LATCH_EN 0x00000058 +/* bit5:0, select the latch timer + bit0: 1588 timer + bit1: hw timer + bit2: tsn0 timer + bit3: tsn1 timer + bit4: tsn2 timer + bit5: tsn3 tiemr */ +#define TIMER_LACTH_SEL 0x0000005C + +enum latch_timer_type { + LATCH_1588_TIMER, + LATCH_HW_TIMER, + LATCH_TSN0_TIMER, + LATCH_TSN1_TIMER, + LATCH_TSN2_TIMER, + LATCH_TSN3_TIMER, +}; + +// trigger in +#define TRIGGER_IN_TOD_NANO_SECOND 0x00000060 +#define TRIGGER_IN_LOWER_TOD_SECOND 0x00000064 +#define TRIGGER_IN_HIGH_TOD_SECOND 0x00000068 +#define TRIGGER_IN_FRAC_NANO_SECOND 0x0000006C + +#define TRIGGER_IN_HARDWARE_TIME_LOW 0x00000070 +#define TRIGGER_IN_HARDWARE_TIME_HIGH 0x00000074 + +// trigger out +#define TRIGGER_OUT_TOD_NANO_SECOND 0x00000080 +#define TRIGGER_OUT_LOWER_TOD_SECOND 0x00000084 +#define TRIGGER_OUT_HIGH_TOD_SECOND 0x00000088 +// #define TRIGGER_OUT_FRAC_NANO_SECOND 0x0000008C // none + +#define TRIGGER_OUT_HARDWARE_TIME_LOW 0x00000090 +#define TRIGGER_OUT_HARDWARE_TIME_HIGH 0x00000094 + + +/* adjust 1588 timer */ +#define ADJUST_TOD_NANO_SECOND 0x000000A0 +#define ADJUST_LOWER_TOD_SECOND 0x000000A4 +#define ADJUST_HIGH_TOD_SECOND 0x000000A8 +#define ADJUST_FRAC_NANO_SECOND 0x000000AC +/* adjust hardware timer */ +#define ADJUST_HARDWARE_TIME_LOW 0x000000B0 +#define ADJUST_HARDWARE_TIME_HIGH 0x000000B4 + +/* 1588 timer latched time */ +#define LATCH_TOD_NANO_SECOND 0x000000C0 +#define LATCH_LOWER_TOD_SECOND 0x000000C4 +#define LATCH_HIGH_TOD_SECOND 0x000000C8 +#define LATCH_FRAC_NANO_SECOND 0x000000CC +/* hw timer latched time */ +#define LATCH_HARDWARE_TIME_LOW 0x000000D0 +#define LATCH_HARDWARE_TIME_HIGH 0x000000D4 + +/* pps capture tod time*/ +#define PPS_LATCH_TOD_NANO_SECOND 0x00000120 +#define PPS_LATCH_LOWER_TOD_SECOND 0x00000124 +#define PPS_LATCH_HIGH_TOD_SECOND 0x00000128 +#define PPS_LATCH_FRAC_NANO_SECOND 0x0000012C + +/* bit19~16 tsn pps enable + bit19: tsn3 + bit18: tsn2 + bit17: tsn1 + bit16: tsn0 + bit15~12 tsn timer enable + bit15: tsn3 + bit14: tsn2 + bit13: tsn1 + bit12: tsn0 + bit11~10 tsn0 timer run mode + bit9~8 tsn1 timer run mode, + bit7~6 tsn2 timer run mode, + bit5~4 tsn3 timer run mode, + 0: normal + 1: update + 2: increment + 3: decrement + bit3~0: tsn timer slave/capture mode, 0 is capture mode, 1 is slave mode + bit3: tsn3 + bit2: tsn2 + bit1: tsn1 + bit0: tsn0 +*/ +#define TSN_TIME_CONFIGURATION 0x00000140 +/* + bit3: adjust tsn3 timer + bit2: adjust tsn2 timer + bit1: adjust tsn1 timer + bit0: adjust tsn0 timer +*/ +#define TSN_TIMER_CONTROL 0x00000144 +#define TSN0_ADJ_EN_BIT 0 +#define TSN1_ADJ_EN_BIT 1 +#define TSN2_ADJ_EN_BIT 2 +#define TSN3_ADJ_EN_BIT 3 + +/* adjust clock cycle, for four tsn timer */ +#define TSN0_CLOCK_CYCLE_INTEGER 0x00000148 +#define TSN0_CLOCK_CYCLE_FRACTION 0x0000014C +#define TSN1_CLOCK_CYCLE_INTEGER 0x00000150 +#define TSN1_CLOCK_CYCLE_FRACTION 0x00000154 +#define TSN2_CLOCK_CYCLE_INTEGER 0x00000158 +#define TSN2_CLOCK_CYCLE_FRACTION 0x0000015C +#define TSN3_CLOCK_CYCLE_INTEGER 0x00000160 +#define TSN3_CLOCK_CYCLE_FRACTION 0x00000164 + +#define TSN_CLOCK_CYCLE_INTEGER(tsn_no) TSN##tsn_no##_CLOCK_CYCLE_INTEGER +#define TSN_CLOCK_CYCLE_FRACTION(tsn_no) TSN##tsn_no##_CLOCK_CYCLE_FRACTION + +/* adjust tsn timer */ +#define TSN0_ADJUST_TOD_NANO_SECOND 0x00000180 +#define TSN0_ADJUST_LOWER_TOD_SECOND 0x00000184 +#define TSN0_ADJUST_HIGH_TOD_SECOND 0x00000188 +#define TSN0_ADJUST_FRAC_NANO_SECOND 0x0000018C + +#define TSN1_ADJUST_TOD_NANO_SECOND 0x00000190 +#define TSN1_ADJUST_LOWER_TOD_SECOND 0x00000194 +#define TSN1_ADJUST_HIGH_TOD_SECOND 0x00000198 +#define TSN1_ADJUST_FRAC_NANO_SECOND 0x0000019C + +#define TSN2_ADJUST_TOD_NANO_SECOND 0x000001A0 +#define TSN2_ADJUST_LOWER_TOD_SECOND 0x000001A4 +#define TSN2_ADJUST_HIGH_TOD_SECOND 0x000001A8 +#define TSN2_ADJUST_FRAC_NANO_SECOND 0x000001AC + +#define TSN3_ADJUST_TOD_NANO_SECOND 0x000001B0 +#define TSN3_ADJUST_LOWER_TOD_SECOND 0x000001B4 +#define TSN3_ADJUST_HIGH_TOD_SECOND 0x000001B8 +#define TSN3_ADJUST_FRAC_NANO_SECOND 0x000001BC + +#define TSN_ADJUST_NANO_SEC(tsn_no) TSN##tsn_no##_ADJUST_TOD_NANO_SECOND +#define TSN_ADJUST_LOW_SECOND(tsn_no) TSN##tsn_no##_ADJUST_LOWER_TOD_SECOND +#define TSN_ADJUST_HIGH_SECOND(tsn_no) TSN##tsn_no##_ADJUST_HIGH_TOD_SECOND +#define TSN_ADJUST_FRAC_NANO_SEC(tsn_no) TSN##tsn_no##_ADJUST_FRAC_NANO_SECOND + +/* tsn0 timer latched time */ +#define TSN0_LATCH_TOD_NANO_SECOND 0x000001C0 +#define TSN0_LATCH_LOWER_TOD_SECOND 0x000001C4 +#define TSN0_LATCH_HIGH_TOD_SECOND 0x000001C8 +#define TSN0_LATCH_FRAC_NANO_SECOND 0x000001CC +/* tsn1 timer latched time */ +#define TSN1_LATCH_TOD_NANO_SECOND 0x000001D0 +#define TSN1_LATCH_LOWER_TOD_SECOND 0x000001D4 +#define TSN1_LATCH_HIGH_TOD_SECOND 0x000001D8 +#define TSN1_LATCH_FRAC_NANO_SECOND 0x000001DC +/* tsn2 timer latched time */ +#define TSN2_LATCH_TOD_NANO_SECOND 0x000001E0 +#define TSN2_LATCH_LOWER_TOD_SECOND 0x000001E4 +#define TSN2_LATCH_HIGH_TOD_SECOND 0x000001E8 +#define TSN2_LATCH_FRAC_NANO_SECOND 0x000001EC +/* tsn3 timer latched time */ +#define TSN3_LATCH_TOD_NANO_SECOND 0x000001F0 +#define TSN3_LATCH_LOWER_TOD_SECOND 0x000001F4 +#define TSN3_LATCH_HIGH_TOD_SECOND 0x000001F8 +#define TSN3_LATCH_FRAC_NANO_SECOND 0x000001FC + +#define TSN_LATCH_NANO_SEC(tsn_no) TSN##tsn_no##_LATCH_TOD_NANO_SECOND +#define TSN_LATCH_LOW_SECOND(tsn_no) TSN##tsn_no##_LATCH_LOWER_TOD_SECOND +#define TSN_LATCH_HIGH_SECOND(tsn_no) TSN##tsn_no##_LATCH_HIGH_TOD_SECOND +#define TSN_LATCH_FRAC_NANO_SEC(tsn_no) TSN##tsn_no##_LATCH_FRAC_NANO_SECOND + +/* pps capture tsn0 time*/ +#define PPS_LATCH_TSN0_NANO_SECOND 0x00000200 +#define PPS_LATCH_TSN0_LOWER_SECOND 0x00000204 +#define PPS_LATCH_TSN0_HIGH_SECOND 0x00000208 +#define PPS_LATCH_TSN0_FRAC_NANO 0x0000020C +/* pps capture tsn1 time*/ +#define PPS_LATCH_TSN1_NANO_SECOND 0x00000210 +#define PPS_LATCH_TSN1_LOWER_SECOND 0x00000214 +#define PPS_LATCH_TSN1_HIGH_SECOND 0x00000218 +#define PPS_LATCH_TSN1_FRAC_NANO 0x0000021C +/* pps capture tsn2 time*/ +#define PPS_LATCH_TSN2_NANO_SECOND 0x00000220 +#define PPS_LATCH_TSN2_LOWER_SECOND 0x00000224 +#define PPS_LATCH_TSN2_HIGH_SECOND 0x00000228 +#define PPS_LATCH_TSN2_FRAC_NANO 0x0000022C +/* pps capture tsn3 time*/ +#define PPS_LATCH_TSN3_NANO_SECOND 0x00000230 +#define PPS_LATCH_TSN3_LOWER_SECOND 0x00000234 +#define PPS_LATCH_TSN3_HIGH_SECOND 0x00000238 +#define PPS_LATCH_TSN3_FRAC_NANO 0x0000023C + +#define PPS_LATCH_TSN_NANO_SEC(tsn_no) PPS_LATCH_TSN##tsn_no##_NANO_SECOND +#define PPS_LATCH_TSN_LOW_SECOND(tsn_no) PPS_LATCH_TSN##tsn_no##_LOWER_SECOND +#define PPS_LATCH_TSN_HIGH_SECOND(tsn_no) PPS_LATCH_TSN##tsn_no##_HIGH_SECOND +#define PPS_LATCH_TSN_FRAC_NANO_SEC(tsn_no) PPS_LATCH_TSN##tsn_no##_FRAC_NANO + +/**************************** ptpm end **************************/ + + +/**************************** ptp_top start **************************/ + +/* bit3: local pp1s status + 0: not generate local pp1s + 1: generate local pp1s + bit2: trigger local pp1s event test + 0: not occur + 1: occur + bit1: writing 1 to the bit clearing local pp1s status + 0: not clear + 1: clear + bit0: local pp1s event enable + 0: no enable + 1: enable */ +#define LOCAL_PPS_INTERRUPT 0x00000000 +// bit0: 0 ref0 1 ref1 +#define PP1S_EXTERNAL_SEL 0x00000004 +/* bit1~0: select pp1s out: + 00: pp1s ref0 + 01: pp1s ref1 + 10: local pp1s + 11: 1588 pp1s */ +#define PP1S_OUT_SEL 0x00000008 +/* bit2~0: select test pp1s: + 000: pp1s ref0 + 001: pp1s ref1 + 010: local pp1s + 011: 1588 pp1s + 100: tsn0 pp1s + 101: tsn1 pp1s + 110: tsn2 pp1s + 111: tsn3 pp1s */ +#define TEST_PP1S_SEL 0x0000000C + +#define LOCAL_PP1S_EN 0x00000010 // use local_pp1s need enable this reg +/* bit2~1: select local pp1s adjust reference + 00: pp1s ref0 + 01: pp1s ref1 + 10,11: 1588 pp1s + bit0: adjust local pp1s phase once */ +#define LOCAL_PP1S_ADJUST 0x00000014 +/* bit29~0: adjust local pp1s value, must below 10e9, 1bit is 1 nanosecond */ +#define LOCAL_PP1S_ADJUST_VALUE 0x00000018 + +/* bit5~3: Pd_U1_Sel1 + 000: pp1s ref0 + 001: pp1s ref1 + 010: local pp1s + 011: 1588 pp1s + 100: tsn0 pp1s + 101: tsn1 pp1s + 110: tsn2 pp1s + 111: tsn3 pp1s + bit2~0: Pd_U1_Sel0 + 000: pp1s ref0 + 001: pp1s ref1 + 010: local pp1s + 011: 1588 pp1s + 100: tsn0 pp1s + 101: tsn1 pp1s + 110: tsn2 pp1s + 111: tsn3 pp1s */ +#define PD_U1_SEL 0x00000040 +// bit29~0: phase detector module 1 select0 input pp1s shift value. +#define PD_U1_PD0_SHIFT 0x00000044 +// bit29~0: phase detector module 1 select1 input pp1s shift value. +#define PD_U1_PD1_SHIFT 0x00000048 + +/* bit30: Pd_U1_Result_sign + 1: positive + 0: negative + bit29: Pd_U1_Overflow: the interval between two pp1s pluse is greater than 0x1FFF_FFFF, 1 is overflow + bit28~0: phase detector module 1 resule value, must below 5*10e8, 1 bit is 1 nanosecond. */ +#define PD_U1_RESULT 0x0000004C + +/* bit5~3: Pd_U2_Sel1 + 000: pp1s ref0 + 001: pp1s ref1 + 010: local pp1s + 011: 1588 pp1s + 100: tsn0 pp1s + 101: tsn1 pp1s + 110: tsn2 pp1s + 111: tsn3 pp1s + bit2~0: Pd_U2_Sel0 + 000: pp1s ref0 + 001: pp1s ref1 + 010: local pp1s + 011: 1588 pp1s + 100: tsn0 pp1s + 101: tsn1 pp1s + 110: tsn2 pp1s + 111: tsn3 pp1s */ +#define PD_U2_SEL 0x00000050 +// bit29~0: phase detector module 2 select0 input pp1s shift value. +#define PD_U2_PD0_SHIFT 0x00000054 +// bit29~0: phase detector module 2 select1 input pp1s shift value. +#define PD_U2_PD1_SHIFT 0x00000058 +/* bit30: Pd_U2_Result_sign + 1: positive + 0: negative + bit29: Pd_U2_Overflow: the interval between two pp1s pluse is greater than 0x1FFF_FFFF, 1 is overflow + bit28~0: phase detector module 2 resule value, must below 5*10e8, 1 bit is 1 nanosecond. */ +#define PD_U2_RESULT 0x0000005C + +#define TSN_GROUP_NANO_SEC_DELAY0 0x00000080 +#define TSN_GROUP_FRAC_NANO_SEC_DELAY0 0x00000084 +#define TSN_GROUP_NANO_SEC_DELAY1 0x00000088 +#define TSN_GROUP_FRAC_NANO_SEC_DELAY1 0x0000008C +#define TSN_GROUP_NANO_SEC_DELAY2 0x00000090 +#define TSN_GROUP_FRAC_NANO_SEC_DELAY2 0x00000094 +#define TSN_GROUP_NANO_SEC_DELAY3 0x00000098 +#define TSN_GROUP_FRAC_NANO_SEC_DELAY3 0x0000009C +#define PTP1588_RDMA_NANO_SEC_DELAY 0x000000A0 +#define PTP1588_RDMA_FRAC_NANO_SEC_DELAY 0x000000A4 +#define PTP1588_NP_NANO_SEC_DELAY 0x000000A8 +#define PTP1588_NP_FRAC_NANO_SEC_DELAY 0x000000AC +#define PTP1588_NVME_NANO_SEC_DELAY1 0x000000C0 +#define PTP1588_NVME_FRAC_NANO_SEC_DELAY1 0x000000C4 +#define PTP1588_NVME_NANO_SEC_DELAY2 0x000000C8 +#define PTP1588_NVME_FRAC_NANO_SEC_DELAY2 0x000000CC + + +/**************************** ptp_top end **************************/ + + +/**************************** ptps start **************************/ +/* bit0: enable writing timestamps to the FIFO + 0: disable + 1: enable */ +#define PTPS_CONFIGURATION 0x00000020 + +/* bit0: PTP1588 FIFO read command + 0: not read + 1: read */ +#define PTPS_TIMER_CONTROL 0x00000024 + +/* bit15~0: integral nanosecond of sync Hardware Time compensaion, 1 bit is 1 nanosecond */ +#define SYNC_HW_TIME_COMPENSATION 0x00000038 + +/* 对于加密报文,先读 PTP event timestamps count,然后读时间戳和匹配信息,读时间戳和匹配信息之前,都要先配置TIMER_CONTROL. + 匹配信息是在PTP1588_EVENT_MESSAGE_TS_LOW里,具体对应关系: BIT[23:0]: messageType, sourcePortIdentity[3:0],sequenceId[15:0] */ +/* ptp1588 event message timestamp[31:0] */ +#define PTP1588_EVENT_MESSAGE_TS_LOW 0x00000084 +/* ptp1588 event message timestamp[63:32] */ +#define PTP1588_EVENT_MESSAGE_TS_HIGH 0x00000088 + +/* bit9: FIFO full + bit8: FIFO empty + bit7~0: PTP event timestamps count */ +#define PTP1588_EVENT_MESSAGE_FIFO_STATUS 0x0000008C + +struct event_ts_info +{ + u32 ts_low; + u32 ts_high; + unsigned char messageType; + unsigned char srcPortId; + short sequenceId; +}; + +#define EVENT_MESSAGE_MAX_NUM 32 + +/**************************** ptps end **************************/ + + + + +#endif /* _ZX_REGS_H */ diff --git a/src/net/drivers/net/ethernet/dinghai/en_sf.c b/src/net/drivers/net/ethernet/dinghai/en_sf.c new file mode 100644 index 0000000..3ef97ea --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_sf.c @@ -0,0 +1,781 @@ +#include +#include +#ifdef HAVE_DEV_PRINTK_OPS +#include +#endif +#include +#include +#include +#include +#include "en_aux.h" +#include "en_sf.h" +#include "./en_sf/eq.h" + +extern struct devlink_ops dh_sf_devlink_ops; +extern struct dh_core_devlink_ops dh_sf_core_devlink_ops; + +int32_t zxdh_sf_get_vq_lock(struct dh_core_dev *dh_dev) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + int32_t ret = 0; + + ret= en_sf_dev->sf_ops->en_sf_get_vq_lock(dh_dev->parent); + if (ret != 0) + { + LOG_ERR("en_sf_get_vq_lock failed: %d\n", ret); + return ret; + } + + return 0; +} + +int32_t zxdh_sf_release_vq_lock(struct dh_core_dev *dh_dev) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + int32_t ret = 0; + + ret= en_sf_dev->sf_ops->en_sf_release_vq_lock(dh_dev->parent); + if (ret != 0) + { + LOG_ERR("en_sf_release_vq_lock failed: %d\n", ret); + return ret; + } + + return 0; +} + +int32_t zxdh_sf_get_phy_vq(struct dh_core_dev *dh_dev, uint16_t index) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + int32_t phy_index = 0; + + phy_index= en_sf_dev->sf_ops->en_sf_get_phy_vq(dh_dev->parent, index); + if (phy_index < 0) + { + LOG_ERR("en_sf_get_phy_vq failed: %d\n", phy_index); + } + + return phy_index; +} + +int32_t zxdh_sf_release_phy_vq(struct dh_core_dev *dh_dev, uint32_t *phy_index, uint16_t total_qnum) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + int32_t ret = 0; + + ret= en_sf_dev->sf_ops->en_sf_release_phy_vq(dh_dev->parent, phy_index, total_qnum); + if (ret != 0) + { + LOG_ERR("en_sf_relaese_phy_vq failed: %d\n", ret); + return ret; + } + + return 0; +} + +bool zxdh_en_sf_is_bond(struct dh_core_dev *dh_dev) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + return en_sf_dev->sf_ops->en_sf_is_bond(dh_dev->parent); +} + +bool zxdh_en_sf_is_upf(struct dh_core_dev *dh_dev) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + return en_sf_dev->sf_ops->en_sf_is_upf(dh_dev->parent); +} + +int32_t zxdh_en_sf_get_phy_vq(struct dh_core_dev *dh_dev, uint16_t index) +{ + int32_t ret = 0; + int32_t phy_index = 0; + + ret = zxdh_sf_get_vq_lock(dh_dev); + if (ret < 0) + { + return ret; + } + + phy_index = zxdh_sf_get_phy_vq(dh_dev, index); + + ret = zxdh_sf_release_vq_lock(dh_dev); + if (ret < 0) + { + return ret; + } + + return phy_index; +} + +int32_t zxdh_en_sf_release_phy_vq(struct dh_core_dev *dh_dev, uint32_t *phy_index, uint16_t total_qnum) +{ + int32_t ret = 0; + + ret = zxdh_sf_get_vq_lock(dh_dev); + if (ret < 0) + { + return ret; + } + + zxdh_sf_release_phy_vq(dh_dev, phy_index, total_qnum); + + zxdh_sf_release_vq_lock(dh_dev); + + return ret; +} + +void zxdh_en_sf_set_status(struct dh_core_dev *dh_dev, uint8_t status) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + en_sf_dev->sf_ops->en_sf_set_status(dh_dev->parent, status); + + return; +} + +uint8_t zxdh_en_sf_get_status(struct dh_core_dev *dh_dev) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + uint8_t status = 0; + + status = en_sf_dev->sf_ops->en_sf_get_status(dh_dev->parent); + + return status; +} + +void zxdh_en_sf_set_vf_mac(struct dh_core_dev *dh_dev, uint8_t *mac, int32_t vf_id) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + en_sf_dev->sf_ops->en_sf_set_vf_mac(dh_dev->parent, mac, vf_id); + + return; +} + +void zxdh_en_sf_get_vf_mac(struct dh_core_dev *dh_dev, uint8_t *mac, int32_t vf_id) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + en_sf_dev->sf_ops->en_sf_get_vf_mac(dh_dev->parent, mac, vf_id); + + return ; +} + +void zxdh_en_sf_set_mac(struct dh_core_dev *dh_dev, uint8_t *mac) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + en_sf_dev->sf_ops->en_sf_set_mac(dh_dev->parent, mac); + + return; +} + +void zxdh_en_sf_get_mac(struct dh_core_dev *dh_dev, uint8_t *mac) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + en_sf_dev->sf_ops->en_sf_get_mac(dh_dev->parent, mac); + + return ; +} + +uint64_t zxdh_en_sf_get_features(struct dh_core_dev *dh_dev) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + uint64_t device_feature = 0; + + device_feature = en_sf_dev->sf_ops->en_sf_get_features(dh_dev->parent); + + return device_feature; +} + +void zxdh_en_sf_set_features(struct dh_core_dev *dh_dev, uint64_t features) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + en_sf_dev->sf_ops->en_sf_set_features(dh_dev->parent, features); + + return; +} + +uint16_t zxdh_en_sf_get_queue_num(struct dh_core_dev *dh_dev) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + uint16_t qnum = 0; + + qnum = en_sf_dev->sf_ops->en_sf_get_queue_num(dh_dev->parent); + + return qnum; +} + +uint16_t zxdh_en_sf_get_queue_size(struct dh_core_dev *dh_dev, uint32_t index) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + uint16_t queue_size = 0; + + queue_size = en_sf_dev->sf_ops->en_sf_get_queue_size(dh_dev->parent, index); + + return queue_size; +} + +struct pci_dev *zxdh_en_sf_get_pdev(struct dh_core_dev *dh_dev) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + return en_sf_dev->sf_ops->en_sf_get_pdev(dh_dev->parent); +} + +uint64_t zxdh_en_sf_get_bar_virt_addr(struct dh_core_dev *dh_dev, uint8_t bar_num) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + return en_sf_dev->sf_ops->en_sf_get_bar_virt_addr(dh_dev->parent, bar_num); +} + +int32_t zxdh_en_sf_msg_send_cmd(struct dh_core_dev *dh_dev, uint16_t module_id, void *msg, void *ack, bool is_sync) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + return en_sf_dev->sf_ops->en_sf_msg_send_cmd(dh_dev->parent, module_id, msg, ack, is_sync); +} + +int32_t zxdh_en_sf_async_eq_enable(struct dh_core_dev *dh_dev, struct dh_eq_async *eq, const char *name, bool attach) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + return en_sf_dev->sf_ops->en_sf_async_eq_enable(dh_dev->parent, eq, name, attach); +} + +void zxdh_en_sf_set_pf_link_up(struct dh_core_dev *dh_dev, bool link_up) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + en_sf_dev->sf_ops->en_sf_set_pf_link_up(dh_dev->parent, link_up); + return; +} + +bool zxdh_en_sf_get_pf_link_up(struct dh_core_dev *dh_dev) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + return en_sf_dev->sf_ops->en_sf_get_pf_link_up(dh_dev->parent); +} + +void zxdh_en_sf_update_pf_link_info(struct dh_core_dev *dh_dev, struct link_info_struct *link_info_val) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + en_sf_dev->sf_ops->en_sf_update_pf_link_info(dh_dev->parent, link_info_val); + return; +} + +int32_t zxdh_en_sf_get_pf_drv_msg(struct dh_core_dev *dh_dev, uint8_t *drv_version, uint8_t *drv_version_len) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + return en_sf_dev->sf_ops->en_sf_get_drv_msg(dh_dev, drv_version, drv_version_len); +} + +void zxdh_en_sf_set_vepa(struct dh_core_dev *dh_dev, bool setting) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + en_sf_dev->sf_ops->en_sf_set_vepa(dh_dev->parent, setting); + return; +} + +bool zxdh_en_sf_get_vepa(struct dh_core_dev *dh_dev) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + return en_sf_dev->sf_ops->en_sf_get_vepa(dh_dev->parent); +} + +void zxdh_en_sf_get_link_info_from_vqm(struct dh_core_dev *dh_dev, uint8_t *link_up) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + en_sf_dev->sf_ops->en_sf_get_link_info_from_vqm(dh_dev->parent, link_up); + return; +} + +void zxdh_en_sf_set_vf_link_info(struct dh_core_dev *dh_dev, uint16_t vf_idx, uint8_t link_up) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + en_sf_dev->sf_ops->en_sf_set_vf_link_info(dh_dev->parent, vf_idx, link_up); + return; +} + +void zxdh_en_sf_set_pf_phy_port(struct dh_core_dev *dh_dev, uint8_t phy_port) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + en_sf_dev->sf_ops->en_sf_set_pf_phy_port(dh_dev->parent, phy_port); + return; +} + +uint8_t zxdh_en_sf_get_pf_phy_port(struct dh_core_dev *dh_dev) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + return en_sf_dev->sf_ops->en_sf_get_pf_phy_port(dh_dev->parent); +} + +void zxdh_en_sf_set_rdma_netdev(struct dh_core_dev *dh_dev, void *data) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + en_sf_dev->netdev = data; + return; +} + +void *zxdh_en_sf_get_rdma_netdev(struct dh_core_dev *dh_dev) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + return en_sf_dev->netdev; +} + +struct zxdh_rdma_if rdma_ops = { + .get_rdma_netdev = zxdh_en_sf_get_rdma_netdev, +}; + +static int32_t zxdh_en_sf_request_port(struct dh_core_dev *dh_dev, void *data) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + return en_sf_dev->sf_ops->en_sf_request_port_info(dh_dev->parent, data); +} + +static int32_t zxdh_en_sf_release_port(struct dh_core_dev *dh_dev, uint32_t pnl_id) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + return en_sf_dev->sf_ops->en_sf_release_port_info(dh_dev->parent, pnl_id); +} + +static void zxdh_en_sf_set_bond_num(struct dh_core_dev *dh_dev, bool add) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + return en_sf_dev->sf_ops->en_sf_set_bond_num(dh_dev->parent, add); +} + +static bool zxdh_en_sf_if_init(struct dh_core_dev *dh_dev) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + return en_sf_dev->sf_ops->en_sf_if_init(dh_dev->parent); +} + +void zxdh_en_sf_set_init_comp_flag(struct dh_core_dev *dh_dev) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + en_sf_dev->sf_ops->en_sf_set_init_comp_flag(dh_dev->parent); + return; +} + +struct zxdh_ipv6_mac_tbl *zxdh_en_sf_get_ip6mac_tbl(struct dh_core_dev *dh_dev) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + return en_sf_dev->sf_ops->en_sf_get_ip6mac_tbl(dh_dev->parent); +} + +struct zxdh_en_if en_ops = { + .get_channels_num = zxdh_en_sf_get_vqs_channels_num, + .create_vqs_channels = zxdh_en_sf_create_vqs_channels, + .destroy_vqs_channels = zxdh_en_sf_destroy_vqs_channels, + .switch_vqs_channel = zxdh_en_sf_switch_vqs_channel, + .vqs_channel_bind_handler = zxdh_en_sf_vqs_channel_bind_handler, + .vqs_channel_unbind_handler = zxdh_en_sf_vqs_channel_unbind_handler, + .vq_bind_channel = zxdh_en_sf_vq_bind_channel, + .vq_unbind_channel = zxdh_en_sf_vq_unbind_channel, + .vqs_bind_eqs = zxdh_en_sf_vqs_bind_eqs, + .vqs_unbind_eqs = zxdh_en_sf_vqs_unbind_eqs, + .vp_modern_map_vq_notify = zxdh_en_sf_map_vq_notify, + .vp_modern_unmap_vq_notify = zxdh_en_sf_unmap_vq_notify, + .activate_phy_vq = zxdh_en_sf_activate_phy_vq, + .get_phy_vq = zxdh_en_sf_get_phy_vq, + .release_phy_vq = zxdh_en_sf_release_phy_vq, + .set_status = zxdh_en_sf_set_status, + .get_status = zxdh_en_sf_get_status, + .set_vf_mac = zxdh_en_sf_set_vf_mac, + .get_vf_mac = zxdh_en_sf_get_vf_mac, + .set_mac = zxdh_en_sf_set_mac, + .get_mac = zxdh_en_sf_get_mac, + .get_features = zxdh_en_sf_get_features, + .set_features = zxdh_en_sf_set_features, + .get_queue_num = zxdh_en_sf_get_queue_num, + .get_queue_size = zxdh_en_sf_get_queue_size, + .set_queue_enable = zxdh_en_sf_set_queue_enable, + .get_epbdf = zxdh_en_sf_get_epbdf, + .get_vport = zxdh_en_sf_get_vport, + .get_pcie_id = zxdh_en_sf_get_pcie_id, + .get_slot_id = zxdh_en_sf_get_slot_id, + .is_bond = zxdh_en_sf_is_bond, + .is_upf = zxdh_en_sf_is_upf, + .get_coredev_type = zxdh_en_sf_get_coredev_type, + .get_pdev = zxdh_en_sf_get_pdev, + .get_bar_virt_addr = zxdh_en_sf_get_bar_virt_addr, + .msg_send_cmd = zxdh_en_sf_msg_send_cmd, + .async_eq_enable = zxdh_en_sf_async_eq_enable, + .get_vf_item = zxdh_en_sf_get_vf_item, + .set_pf_link_up = zxdh_en_sf_set_pf_link_up, + .get_pf_link_up = zxdh_en_sf_get_pf_link_up, + .update_pf_link_info = zxdh_en_sf_update_pf_link_info, + .get_pf_drv_msg = zxdh_en_sf_get_pf_drv_msg, + .set_vepa = zxdh_en_sf_set_vepa, + .get_vepa = zxdh_en_sf_get_vepa, + .get_link_info_from_vqm = zxdh_en_sf_get_link_info_from_vqm, + .set_vf_link_info = zxdh_en_sf_set_vf_link_info, + .request_port = zxdh_en_sf_request_port, + .release_port = zxdh_en_sf_release_port, + .set_bond_num = zxdh_en_sf_set_bond_num, + .if_init = zxdh_en_sf_if_init, + .set_pf_phy_port = zxdh_en_sf_set_pf_phy_port, + .set_rdma_netdev = zxdh_en_sf_set_rdma_netdev, + .get_pf_phy_port = zxdh_en_sf_get_pf_phy_port, + .set_init_comp_flag = zxdh_en_sf_set_init_comp_flag, + .get_ip6mac_tbl = zxdh_en_sf_get_ip6mac_tbl, +}; + +void zxdh_aux_adev_release(struct device *dev) +{ + +} + +int32_t zxdh_rdma_infos_request_reset(struct zxdh_rdma_dev_info *rdma_infos, enum zxdh_rdma_reset_type reset_type) +{ + return 0; +} + +static struct zxdh_rdma_dev_ops rdma_handle_ops = +{ + .request_reset = zxdh_rdma_infos_request_reset, +}; + +struct zxdh_rdma_dev_info *zxdh_rdma_infos_init(struct dh_core_dev *dh_dev, struct zxdh_auxiliary_device *adev) +{ + struct zxdh_en_container *en_container = container_of(adev, struct zxdh_en_container, adev); + struct zxdh_rdma_dev_info *rdma_infos = NULL; + + en_container->rdma_infos = kzalloc(sizeof(*en_container->rdma_infos), GFP_KERNEL); + if (unlikely(en_container->rdma_infos == NULL)) + { + LOG_ERR("en_container->rdma_infos kzalloc failed\n"); + return NULL; + } + + rdma_infos = en_container->rdma_infos; + rdma_infos->pdev = zxdh_en_sf_get_pdev(dh_dev); + rdma_infos->hw_addr = (uint8_t __iomem *)zxdh_en_sf_get_bar_virt_addr(dh_dev, 0); + rdma_infos->ver.major = ZXDH_MAJOR_VER; + rdma_infos->ver.minor = ZXDH_MINOR_VER; + rdma_infos->rdma_protocol = ZXDH_RDMA_PROTOCOL_IWARP; + rdma_infos->ops = &rdma_handle_ops; + rdma_infos->ftype = ZXDH_FUNCTION_TYPE_PF; + rdma_infos->vport_id = zxdh_en_sf_get_vport(dh_dev); + if (zxdh_en_sf_get_coredev_type(dh_dev) == DH_COREDEV_VF) + { + rdma_infos->ftype = ZXDH_FUNCTION_TYPE_VF; + } + + rdma_infos->msix_count = ZXDH_RDMA_CHANNELS_NUM; + rdma_infos->msix_entries.entry = ZXDH_RDMA_IRQ_START_IDX; + rdma_infos->msix_entries.vector = pci_irq_vector(rdma_infos->pdev, ZXDH_RDMA_IRQ_START_IDX); + + return rdma_infos; +} + +int32_t zxdh_net_adev_handle(struct dh_core_dev *dh_dev, struct zxdh_auxiliary_device *adev) +{ + struct zxdh_en_container *en_container = container_of(adev, struct zxdh_en_container, adev); + + adev->name = ZXDH_EN_DEV_ID_NAME; + adev->dev.parent = dh_dev->device; + en_container->rdma_infos = NULL; + en_container->ops = &en_ops; + + return 0; +} + +int32_t zxdh_rdma_adev_handle(struct dh_core_dev *dh_dev, struct zxdh_auxiliary_device *adev) +{ + struct zxdh_en_container *en_container = container_of(adev, struct zxdh_en_container, adev); + struct zxdh_rdma_dev_info *rdma_infos = NULL; + + adev->name = ZXDH_RDMA_DEV_NAME; + rdma_infos = zxdh_rdma_infos_init(dh_dev, adev); + if (unlikely(rdma_infos == NULL)) + { + LOG_ERR("zxdh_rdma_infos_init failed, return NULL\n"); + return -1; + } + rdma_infos->adev = adev; + adev->dev.parent = &rdma_infos->pdev->dev; + en_container->rdma_ops = &rdma_ops; + + return 0; +} + +struct zxdh_adev_handle_table zxdh_adev_handle_table[] = +{ + {NET_AUX_DEVICE, zxdh_net_adev_handle}, + {RDMA_AUX_DEVICE, zxdh_rdma_adev_handle}, +}; + +int32_t zxdh_adev_handle(struct dh_core_dev *dh_dev, struct zxdh_auxiliary_device *adev, enum AUX_DEVICE_TYPE adev_type) +{ + uint32_t i = 0; + int32_t ret = 0; + + for (i = 0; i < ARRAY_SIZE(zxdh_adev_handle_table); i++) + { + if((zxdh_adev_handle_table[i].adev_type == adev_type) && (zxdh_adev_handle_table[i].cb_fn)) + { + ret = zxdh_adev_handle_table[i].cb_fn(dh_dev, adev); + } + } + + return ret; +} + +static DEFINE_IDA(zxdh_aux_adev_ida); + +int32_t zxdh_aux_plug_aux_dev(struct dh_core_dev *dh_dev, enum AUX_DEVICE_TYPE adev_type) +{ + struct zxdh_auxiliary_device *adev = NULL; + struct zxdh_en_sf_device *en_sf_dev = NULL; + struct zxdh_en_container *en_container = NULL; + struct zxdh_rdma_dev_info *rdma_infos = NULL; + int32_t ret = 0; + en_sf_dev = dh_core_priv(dh_dev); + + en_container = kzalloc(sizeof(struct zxdh_en_container), GFP_KERNEL); + if (unlikely(en_container == NULL)) + { + LOG_ERR("sf_con kzalloc is null\n"); + return -ENOMEM; + } + + en_container->aux_id = ida_alloc(&zxdh_aux_adev_ida, GFP_KERNEL); + if (en_container->aux_id < 0) + { + LOG_ERR("failed to allocate device id for aux drvs\n"); + goto free_kzalloc; + } + + adev = &en_container->adev; + + adev->id = en_container->aux_id; + adev->dev.release = zxdh_aux_adev_release; + ret = zxdh_adev_handle(dh_dev, adev, adev_type); + if (ret != 0) + { + LOG_ERR("zxdh_adev_handle failed: %d\n", ret); + goto free_ida_alloc; + } + + if (en_sf_dev->aux_idx < 0) + goto free_rdma_infos_alloc; + en_sf_dev->adev[en_sf_dev->aux_idx] = adev; + en_sf_dev->aux_idx++; + + en_container->parent = dh_dev; + + ret = zxdh_auxiliary_device_init(adev); + if (ret != 0) + { + LOG_ERR("zxdh_auxiliary_device_init failed: %d\n", ret); + goto free_rdma_infos_alloc; + } + + ret = zxdh_auxiliary_device_add(adev); + if (ret != 0) + { + LOG_ERR("zxdh_auxiliary_device_add failed: %d\n", ret); + goto release_aux_init; + } + + return 0; + +release_aux_init: + zxdh_auxiliary_device_uninit(adev); +free_rdma_infos_alloc: + if (adev_type == RDMA_AUX_DEVICE) + { + kfree(rdma_infos); + rdma_infos = NULL; + } +free_ida_alloc: + ida_simple_remove(&zxdh_aux_adev_ida, en_container->aux_id); + en_container->aux_id = -1; +free_kzalloc: + kfree(en_container); + en_container = NULL; + return ret; +} + +void zxdh_aux_unplug_aux_dev(struct dh_core_dev *dh_dev) +{ + struct zxdh_en_sf_device *en_sf_dev = NULL; + struct zxdh_en_container *en_container = NULL; + int16_t i = 0; + + en_sf_dev = dh_core_priv(dh_dev); + for (i = en_sf_dev->aux_idx - 1; i >= 0; i--) + { + en_container = container_of(en_sf_dev->adev[i], struct zxdh_en_container, adev); + + zxdh_auxiliary_device_delete(en_sf_dev->adev[i]); + zxdh_auxiliary_device_uninit(en_sf_dev->adev[i]); + if (en_container->rdma_infos != NULL) + { + kfree(en_container->rdma_infos); + en_container->rdma_infos = NULL; + } + ida_simple_remove(&zxdh_aux_adev_ida, en_container->aux_id); + en_container->aux_id = -1; + kfree(en_container); + en_container = NULL; + } + + return; +} + +static int32_t zxdh_en_sf_dev_probe(struct zxdh_auxiliary_device *adev, const struct zxdh_auxiliary_device_id *id) +{ + int32_t err = 0; + struct zxdh_en_sf_container *sf_con = container_of(adev, struct zxdh_en_sf_container, adev); + struct dh_core_dev *dh_dev = NULL; + struct devlink *devlink = NULL; + struct zxdh_en_sf_device *en_sf_dev = NULL; + struct zxdh_en_sf_if *sf_ops = sf_con->ops; + + LOG_INFO("sf level driver probe start\n"); + + devlink = zxdh_devlink_alloc(&adev->dev, &dh_sf_devlink_ops, sizeof(struct zxdh_en_sf_device)); + if (devlink == NULL) + { + LOG_ERR("devlink alloc failed\n"); + return -ENOMEM; + } + + dh_dev = devlink_priv(devlink); + en_sf_dev = dh_core_priv(dh_dev); + dh_dev->parent = sf_con->dh_dev; + dh_dev->device = &adev->dev; + dh_dev->irq_table = dh_dev->parent->irq_table; + en_sf_dev->max_channels = sf_con->max_channels; + en_sf_dev->sf_ops = sf_ops; + en_sf_dev->aux_idx = 0; + sf_con->cdev = dh_dev; + dh_dev->devlink = devlink; + dh_dev->devlink_ops = &dh_sf_core_devlink_ops; + + err = dh_en_sf_eq_table_init(dh_dev); + if (err != 0) + { + LOG_ERR("Failed to alloc IRQs\n"); + goto err_eq_table_init; + } + + dh_en_sf_eq_table_create(dh_dev, sf_ops); + +#ifdef HAVE_DEVLINK_REGISTER_GET_1_PARAMS + zxdh_devlink_register(devlink); +#else + zxdh_devlink_register(devlink, &adev->dev); +#endif + + zxdh_aux_plug_aux_dev(dh_dev, NET_AUX_DEVICE); + zxdh_aux_plug_aux_dev(dh_dev, RDMA_AUX_DEVICE); + + LOG_INFO("sf level driver probe completed\n"); + + return 0; + +err_eq_table_init: + zxdh_devlink_free(devlink); + return err; +} + +static int32_t zxdh_en_sf_dev_remove(struct zxdh_auxiliary_device *adev) +{ + struct zxdh_en_sf_container *sf_con = container_of(adev, struct zxdh_en_sf_container, adev); + struct dh_core_dev *dh_dev = NULL; + struct devlink *devlink = NULL; + + LOG_INFO("sf level driver remove start\n"); + dh_dev = sf_con->cdev; + devlink = dh_dev->devlink; + + zxdh_aux_unplug_aux_dev(dh_dev); + zxdh_devlink_unregister(devlink); + dh_sf_eq_table_destroy(dh_dev); + dh_eq_table_cleanup(dh_dev); + zxdh_devlink_free(devlink); + LOG_INFO("sf level driver remove completed\n"); + + return 0; +} + +static void zxdh_en_sf_dev_shutdown(struct zxdh_auxiliary_device *adev) +{ + struct zxdh_en_sf_container *sf_con = container_of(adev, struct zxdh_en_sf_container, adev); + struct dh_core_dev *dh_dev = NULL; + struct devlink *devlink = NULL; + + LOG_INFO("sf level driver shutdown start\n"); +#ifdef CONFIG_ZXDH_SF + dh_dev = sf_con->cdev; + devlink = dh_dev->devlink; + + zxdh_devlink_unregister(devlink); + dh_sf_eq_table_destroy(dh_dev); + dh_eq_table_cleanup(dh_dev); + zxdh_devlink_free(devlink); +#endif + LOG_INFO("sf level driver shutdown completed\n"); +} + +static const struct zxdh_auxiliary_device_id zxdh_en_dev_id_table[] = { + { .name = ZXDH_PF_NAME "." ZXDH_PF_EN_SF_DEV_ID_NAME, }, + //{ .name = ZXDH_MPF_NAME "." ZXDH_MPF_EN_SF_DEV_ID_NAME, }, + { }, +}; + +MODULE_DEVICE_TABLE(zxdh_auxiliary, zxdh_en_dev_id_table); + +static struct zxdh_auxiliary_driver zxdh_en_sf_driver = { + .name = ZXDH_PF_EN_SF_DEV_ID_NAME, + .probe = zxdh_en_sf_dev_probe, + .remove = zxdh_en_sf_dev_remove, + .shutdown = zxdh_en_sf_dev_shutdown, + .id_table = zxdh_en_dev_id_table, +}; + +int32_t zxdh_en_sf_driver_register(void) +{ + int32_t err = 0; + + err = zxdh_auxiliary_driver_register(&zxdh_en_sf_driver); + if (err != 0) + { + goto err; + } + + return 0; + +err: + return err; +} + +void zxdh_en_sf_driver_unregister(void) +{ + zxdh_auxiliary_driver_unregister(&zxdh_en_sf_driver); +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_sf.h b/src/net/drivers/net/ethernet/dinghai/en_sf.h new file mode 100644 index 0000000..028b951 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_sf.h @@ -0,0 +1,107 @@ +#ifndef __ZXDH_PF_EN_SF_H__ +#define __ZXDH_PF_EN_SF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include + +#define ZXDH_MAJOR_VER 10 +#define ZXDH_MINOR_VER 1 +#define ZXDH_SF_ADEV_NUM 32 + +struct zxdh_rdma_dev_info; + +enum AUX_DEVICE_TYPE +{ + NET_AUX_DEVICE, + RDMA_AUX_DEVICE, +}; + +struct zxdh_adev_handle_table +{ + enum AUX_DEVICE_TYPE adev_type; + int32_t (*cb_fn)(struct dh_core_dev *dh_dev, struct zxdh_auxiliary_device *adev); +}; + +struct zxdh_ver_info +{ + uint16_t major; + uint16_t minor; + uint64_t support; +}; + +enum zxdh_function_type +{ + ZXDH_FUNCTION_TYPE_PF, + ZXDH_FUNCTION_TYPE_VF, +}; + +enum zxdh_rdma_protocol +{ + ZXDH_RDMA_PROTOCOL_IWARP = BIT(0), + ZXDH_RDMA_PROTOCOL_ROCEV2 = BIT(1), +}; + +struct zxdh_rdma_qos_params +{ + uint8_t reserve; +}; + +enum zxdh_rdma_reset_type +{ + ZXDH_RESET_MTU_CHANGE, + ZXDH_RESET_HW_ERROR, +}; + +struct zxdh_rdma_dev_ops +{ + int32_t (*request_reset)(struct zxdh_rdma_dev_info *rdma_infos, enum zxdh_rdma_reset_type reset_type); +}; + +/* auxiliary driver tailored information about the core PCI dev */ +struct zxdh_rdma_dev_info +{ + struct pci_dev *pdev; + struct zxdh_auxiliary_device *adev; + + uint8_t __iomem *hw_addr; + int32_t adev_info_id; + struct zxdh_ver_info ver; + + void *auxiliary_priv; + + enum zxdh_function_type ftype; + uint16_t vport_id; + /* Current active RDMA protocol */ + enum zxdh_rdma_protocol rdma_protocol; + + struct zxdh_rdma_qos_params qos_info; + + struct msix_entry msix_entries; + /* How many vectors are reserved for this device */ + uint16_t msix_count; + /* function pointers to be initialized by core PCI driver and called by auxiliary driver */ + struct zxdh_rdma_dev_ops *ops; +}; + +struct zxdh_en_sf_device { + int32_t max_channels; + struct zxdh_en_sf_if *sf_ops; + void *netdev; + + struct zxdh_auxiliary_device *adev[ZXDH_SF_ADEV_NUM]; + int32_t aux_idx; +}; + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_sf/devlink.c b/src/net/drivers/net/ethernet/dinghai/en_sf/devlink.c new file mode 100644 index 0000000..0a65b75 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_sf/devlink.c @@ -0,0 +1,131 @@ +#include +#include +#include "devlink.h" + + +struct devlink_ops dh_sf_devlink_ops = { + +}; + +enum { + DH_SF_PARAMS_MAX, +}; + +static int32_t __attribute__((unused)) sample_check(struct dh_core_dev *dev) +{ + return 1; +} + +enum dh_sf_devlink_param_id { + DH_SF_DEVLINK_PARAM_ID_BASE = DEVLINK_PARAM_GENERIC_ID_MAX, + DH_SF_DEVLINK_PARAM_ID_SAMPLE, +}; + + +static int32_t dh_devlink_sample_set(struct devlink *devlink, uint32_t id, + struct devlink_param_gset_ctx *ctx) +{ + struct dh_core_dev * __attribute__((unused)) dev = devlink_priv(devlink); + + return 0; +} + +static int32_t dh_devlink_sample_get(struct devlink *devlink, uint32_t id, + struct devlink_param_gset_ctx *ctx) +{ + struct dh_core_dev * __attribute__((unused)) dev = devlink_priv(devlink); + + return 0; +} + +#ifdef HAVE_DEVLINK_PARAM_REGISTER +static const struct devlink_params { + const char *name; + int32_t (*check)(struct dh_core_dev *dev); + struct devlink_param param; +} devlink_params[] = { + [DH_SF_PARAMS_MAX] = { .name = "sample", + .check = &sample_check, + .param = DEVLINK_PARAM_DRIVER(DH_SF_DEVLINK_PARAM_ID_SAMPLE, + "sample", DEVLINK_PARAM_TYPE_BOOL, + BIT(DEVLINK_PARAM_CMODE_RUNTIME),dh_devlink_sample_get, + dh_devlink_sample_set, + NULL), + } +}; + +static int32_t params_register(struct devlink *devlink) +{ + int32_t i = 0; + int32_t err = 0; + struct dh_core_dev *dh_dev = devlink_priv(devlink); + + for (i = 0; i < ARRAY_SIZE(devlink_params); i++) + { + if(devlink_params[i].check(dh_dev)) + { + err = devlink_param_register(devlink, &devlink_params[i].param); + if (err) + { + goto rollback; + } + } + } + + return 0; + +rollback: + if (i == 0) + { + return err; + } + + for (; i > 0; i--) + { + devlink_param_unregister(devlink, &devlink_params[i].param); + } + + return err; +} + +static int32_t params_unregister(struct devlink *devlink) +{ + int32_t i = 0; + + for (i = 0; i < ARRAY_SIZE(devlink_params); i++) + { + devlink_param_unregister(devlink, &devlink_params[i].param); + } + + return 0; +} +#else +static struct devlink_param devlink_params [] = { + [DH_SF_PARAMS_MAX] = DEVLINK_PARAM_DRIVER(DH_SF_DEVLINK_PARAM_ID_SAMPLE, + "sample", DEVLINK_PARAM_TYPE_BOOL, + BIT(DEVLINK_PARAM_CMODE_RUNTIME),dh_devlink_sample_get, + dh_devlink_sample_set, + NULL), +}; + +static int32_t params_register(struct devlink *devlink) +{ + struct dh_core_dev * __attribute__((unused)) dh_dev = devlink_priv(devlink); + int32_t err = 0; + + err = devlink_params_register(devlink, devlink_params, ARRAY_SIZE(devlink_params)); + + return err; +} +static int32_t params_unregister(struct devlink *devlink) +{ + devlink_params_unregister(devlink, devlink_params, ARRAY_SIZE(devlink_params)); + + return 0; +} +#endif + +struct dh_core_devlink_ops dh_sf_core_devlink_ops = { + .params_register = params_register, + .params_unregister = params_unregister +}; \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_sf/devlink.h b/src/net/drivers/net/ethernet/dinghai/en_sf/devlink.h new file mode 100644 index 0000000..6622934 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_sf/devlink.h @@ -0,0 +1,15 @@ +#ifndef __ZXDH_SF_DEVLINK_H__ +#define __ZXDH_SF_DEVLINK_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_sf/eq.c b/src/net/drivers/net/ethernet/dinghai/en_sf/eq.c new file mode 100644 index 0000000..1999aa4 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_sf/eq.c @@ -0,0 +1,391 @@ +#include +#include +#include +#include +#include +#include +#include "irq.h" +#include "eq.h" +#include "../en_sf.h" + + +static int32_t create_async_eqs(struct dh_core_dev *dev) +{ + return 0; +} + +int32_t dh_en_sf_eq_table_create(struct dh_core_dev *dev, struct zxdh_en_sf_if *ops) +{ + int32_t err; + + err = create_async_eqs(dev); + + return err; +} + +void dh_sf_eq_table_destroy(struct dh_core_dev *dev) +{ + return; +} + +void zxdh_set_queue_size(struct dh_core_dev *dh_dev, uint32_t index, uint16_t size) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + en_sf_dev->sf_ops->en_sf_set_queue_size(dh_dev->parent, index, size); +} + +void zxdh_queue_address(struct dh_core_dev *dh_dev, uint32_t index, + uint64_t desc_addr, uint64_t driver_addr, uint64_t device_addr) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + en_sf_dev->sf_ops->en_sf_set_queue_address(dh_dev->parent, index, desc_addr, driver_addr, device_addr); +} + +void zxdh_en_sf_activate_phy_vq(struct dh_core_dev *dh_dev, uint32_t phy_index, int32_t queue_size, uint64_t desc_addr, uint64_t avail_addr, uint64_t used_addr) +{ + zxdh_set_queue_size(dh_dev, phy_index, queue_size); + zxdh_queue_address(dh_dev, phy_index, desc_addr, avail_addr, used_addr); +} + +int32_t dh_en_sf_eq_table_init(struct dh_core_dev *dev) +{ + struct dh_eq_table *eq_table = &dev->eq_table; + struct dh_en_sf_eq_table *table_priv = NULL; + int32_t err = 0; + + table_priv = kvzalloc(sizeof(*table_priv), GFP_KERNEL); + if (unlikely(table_priv == NULL)) + { + LOG_ERR("dh_en_sf_eq_table kvzalloc failed\n"); + err = -ENOMEM; + goto err_table_priv; + } + dh_eq_table_init(dev, table_priv); + + return 0; + +err_table_priv: + kvfree(eq_table); + return err; +} + +static void vqs_irqs_release(struct dh_core_dev *dh_dev) +{ + struct dh_eq_table *table = &dh_dev->eq_table; + struct dh_en_sf_eq_table *sf_eq_table = table->priv; + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + int32_t vqs_channel_num = 0; + + vqs_channel_num = zxdh_en_sf_get_vqs_channels_num(dh_dev); + + en_sf_dev->sf_ops->en_sf_affinity_irqs_release(dh_dev->parent, sf_eq_table->vq_irqs, vqs_channel_num); + + dh_irqs_release_vectors(sf_eq_table->vq_irqs, sf_eq_table->vq_irq_num); +} + +static void clean_vqs_eqs(struct dh_core_dev *dh_dev) +{ + struct dh_eq_table *table = &dh_dev->eq_table; + struct dh_en_sf_eq_table *sf_eq_table = table->priv; + struct dh_eq_vqs *eq; + struct dh_eq_vqs *n; + + list_for_each_entry_safe(eq, n, &sf_eq_table->vqs_eqs_list, list) + { + list_del(&eq->list); + kfree(eq); + } +} + +static void destroy_vqs_eqs(struct dh_core_dev *dh_dev, int32_t vqs_channel_num) +{ + struct dh_eq_table *table = &dh_dev->eq_table; + struct dh_en_sf_eq_table *sf_eq_table = table->priv; + struct dh_eq_vqs *eq; + struct dh_eq_vqs *n; + int32_t i = 0; + + list_for_each_entry_safe(eq, n, &sf_eq_table->vqs_eqs_list, list) + { + if (i <= vqs_channel_num) + { + dh_eq_disable(dh_dev, &eq->vq_s.core, &eq->vq_s.irq_nb); + } + i++; + } +} + +uint16_t zxdh_en_sf_get_vqs_channels_num(struct dh_core_dev *dh_dev) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + uint16_t channels_num = 0; + + channels_num = en_sf_dev->sf_ops->en_sf_get_channels_num(dh_dev->parent); + + return channels_num; +} + +static int32_t create_map_eq(struct dh_core_dev *dev, struct dh_eq *eq, struct dh_eq_param *param) +{ + eq->irq = param->irq; + + return 0; +} + +void zxdh_en_sf_destroy_vqs_channels(struct dh_core_dev *dh_dev) +{ + struct dh_eq_table *table = &dh_dev->eq_table; + struct dh_en_sf_eq_table *sf_eq_table = table->priv; + + clean_vqs_eqs(dh_dev); + vqs_irqs_release(dh_dev); + kfree(sf_eq_table->vq_irqs); +} + +void zxdh_en_sf_switch_vqs_channel(struct dh_core_dev *dh_dev, int32_t channel, int32_t op) +{ + struct dh_eq_table *table = &dh_dev->eq_table; + struct dh_en_sf_eq_table *sf_eq_table = table->priv; + struct dh_irq *irq = sf_eq_table->vq_irqs[channel]; + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + en_sf_dev->sf_ops->en_sf_switch_irq(dh_dev->parent, irq->irqn, op); +} + +int32_t zxdh_en_sf_create_vqs_channels(struct dh_core_dev *dh_dev) +{ + struct dh_eq_table *table = &dh_dev->eq_table; + struct dh_en_sf_eq_table *sf_eq_table = table->priv; + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + int32_t vqs_channel_num = 0; + int32_t i = 0; + struct dh_eq_vqs *eq_vqs = NULL; + int32_t err = 0; + + vqs_channel_num = zxdh_en_sf_get_vqs_channels_num(dh_dev); + + sf_eq_table->vq_irqs = kcalloc(vqs_channel_num, sizeof(*sf_eq_table->vq_irqs), GFP_KERNEL); + if (unlikely(sf_eq_table->vq_irqs == NULL)) + { + LOG_ERR("sf_eq_table->vq_irqs kcalloc null\n"); + return -ENOMEM; + } + + vqs_channel_num = en_sf_dev->sf_ops->en_sf_vq_irqs_request(dh_dev->parent, sf_eq_table->vq_irqs, vqs_channel_num); + if (vqs_channel_num < 0) + { + LOG_ERR("en_sf_vq_irqs_request failed: %d\n", vqs_channel_num); + kfree(sf_eq_table->vq_irqs); + return vqs_channel_num; + } + + sf_eq_table->vq_irq_num = vqs_channel_num; + + INIT_LIST_HEAD(&sf_eq_table->vqs_eqs_list); + + for (i = 0; i < vqs_channel_num; i++) + { + eq_vqs = kzalloc(sizeof(struct dh_eq_vqs), GFP_KERNEL); + if (unlikely(eq_vqs == NULL)) + { + LOG_ERR("eq_vqs %d kzalloc null\n", i); + err = -ENOMEM; + goto clean; + } + + INIT_LIST_HEAD(&eq_vqs->vqs); + + list_add_tail(&eq_vqs->list, &sf_eq_table->vqs_eqs_list); + } + + return vqs_channel_num; + +clean: + zxdh_en_sf_destroy_vqs_channels(dh_dev); + return err; +} + +void zxdh_en_sf_vqs_unbind_eqs(struct dh_core_dev *dh_dev, int32_t vqs_channel_num) +{ + struct dh_eq_table *table = &dh_dev->eq_table; + struct dh_en_sf_eq_table *sf_eq_table = table->priv; + struct dh_eq_vqs *eq; + struct dh_eq_vqs *n; + int32_t i = 0; + + list_for_each_entry_safe(eq, n, &sf_eq_table->vqs_eqs_list, list) + { + if (i++ <= vqs_channel_num) + { + list_del(&eq->vqs); + } + } + + return; +} + +int32_t zxdh_en_sf_vqs_bind_eqs(struct dh_core_dev *dh_dev, int32_t vqs_channel_num, struct list_head *vq_node) +{ + struct dh_eq_table *table = &dh_dev->eq_table; + struct dh_en_sf_eq_table *sf_eq_table = table->priv; + struct dh_eq_vqs *eq; + struct dh_eq_vqs *n; + int32_t i = 0; + + list_for_each_entry_safe(eq, n, &sf_eq_table->vqs_eqs_list, list) + { + if (i++ == vqs_channel_num) + { + list_add_tail(vq_node, &eq->vqs); + return 0; + } + } + + return -ENOENT; +} + +void __iomem *zxdh_en_sf_map_vq_notify(struct dh_core_dev *dh_dev, uint32_t index, resource_size_t *pa) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + void __iomem *notify_addr = NULL; + + notify_addr = en_sf_dev->sf_ops->en_sf_map_vq_notify(dh_dev->parent, index, pa); + + return notify_addr; +} + +void zxdh_en_sf_unmap_vq_notify(struct dh_core_dev *dh_dev, void *priv) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + en_sf_dev->sf_ops->en_sf_unmap_vq_notify(dh_dev->parent, priv); +} + +void zxdh_en_sf_set_queue_enable(struct dh_core_dev *dh_dev, uint16_t index, bool enable) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + en_sf_dev->sf_ops->en_sf_set_queue_enable(dh_dev->parent, index, enable); +} + +uint16_t zxdh_en_sf_get_queue_vector(struct dh_core_dev *dh_dev, uint16_t channel, uint16_t queue_index) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + struct dh_eq_table *table = &dh_dev->eq_table; + struct dh_en_sf_eq_table *sf_eq_table = table->priv; + int32_t msix_vec = ZXDH_MSI_NO_VECTOR; + + msix_vec = en_sf_dev->sf_ops->en_sf_get_queue_vector(dh_dev->parent, channel, &sf_eq_table->vqs_eqs_list, queue_index); + + return msix_vec; +} + +void zxdh_en_sf_vq_unbind_channel(struct dh_core_dev *dh_dev, int32_t queue_index) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + en_sf_dev->sf_ops->en_sf_release_queue_vector(dh_dev->parent, queue_index); +} + +int32_t zxdh_en_sf_vq_bind_channel(struct dh_core_dev *dh_dev, int32_t channel_num, int32_t queue_index) +{ + int32_t msix_vec = ZXDH_MSI_NO_VECTOR; + + msix_vec = zxdh_en_sf_get_queue_vector(dh_dev, channel_num, queue_index); + + if (msix_vec == ZXDH_MSI_NO_VECTOR) + { + return -EBUSY; + } + + return msix_vec; +} + +void zxdh_en_sf_vqs_channel_unbind_handler(struct dh_core_dev *dh_dev, int32_t vqs_channel_num) +{ + destroy_vqs_eqs(dh_dev, vqs_channel_num); + return; +} + +int32_t zxdh_en_sf_vqs_channel_bind_handler(struct dh_core_dev *dh_dev, int32_t vqs_channel_num, struct dh_vq_handler *handler) +{ + struct dh_eq_table *table = &dh_dev->eq_table; + struct dh_en_sf_eq_table *sf_eq_table = table->priv; + int32_t i = 0; + struct dh_eq_vqs *eq_vqs; + struct dh_eq_vqs *n; + int32_t err = 0; + + list_for_each_entry_safe(eq_vqs, n, &sf_eq_table->vqs_eqs_list, list) + { + if (i == vqs_channel_num) + { + struct dh_eq_param param = {}; + + eq_vqs->vq_s.irq_nb.notifier_call = handler->callback; + eq_vqs->vq_s.para = handler->para; + param = (struct dh_eq_param) { + .irq = sf_eq_table->vq_irqs[i], + .nent = 0, + }; + create_map_eq(dh_dev, &eq_vqs->vq_s.core, ¶m); + + err = dh_eq_enable(dh_dev, &eq_vqs->vq_s.core, &eq_vqs->vq_s.irq_nb); + if(err != 0) + { + LOG_ERR("dh_eq_enable failed: %d\n", err); + goto clean_eq; + } + return 0; + } + i++; + } + +clean_eq: + destroy_vqs_eqs(dh_dev, vqs_channel_num); + return err; +} + +uint32_t zxdh_en_sf_get_epbdf(struct dh_core_dev *dh_dev) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + return en_sf_dev->sf_ops->en_sf_get_epbdf(dh_dev->parent); +} + +uint16_t zxdh_en_sf_get_vport(struct dh_core_dev *dh_dev) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + return en_sf_dev->sf_ops->en_sf_get_vport(dh_dev->parent); +} + +enum dh_coredev_type zxdh_en_sf_get_coredev_type(struct dh_core_dev *dh_dev) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + return en_sf_dev->sf_ops->en_sf_get_coredev_type(dh_dev->parent); +} + +uint16_t zxdh_en_sf_get_pcie_id(struct dh_core_dev *dh_dev) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + return en_sf_dev->sf_ops->en_sf_get_pcie_id(dh_dev->parent); +} + +uint16_t zxdh_en_sf_get_slot_id(struct dh_core_dev *dh_dev) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + return en_sf_dev->sf_ops->en_sf_get_slot_id(dh_dev->parent); +} + +struct zxdh_vf_item *zxdh_en_sf_get_vf_item(struct dh_core_dev *dh_dev, uint16_t vf_idx) +{ + struct zxdh_en_sf_device *en_sf_dev = dh_core_priv(dh_dev); + + return en_sf_dev->sf_ops->en_sf_get_vf_item(dh_dev->parent, vf_idx); +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_sf/eq.h b/src/net/drivers/net/ethernet/dinghai/en_sf/eq.h new file mode 100644 index 0000000..1f6127e --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_sf/eq.h @@ -0,0 +1,57 @@ +#ifndef __ZXDH_SF_EQ_H__ +#define __ZXDH_SF_EQ_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include + +void dh_en_sf_eq_table_destroy(struct dh_core_dev *dev); +int32_t dh_en_sf_eq_table_init(struct dh_core_dev *dev); +int32_t dh_en_sf_eq_table_create(struct dh_core_dev *dev, struct zxdh_en_sf_if *ops); +void dh_sf_eq_table_destroy(struct dh_core_dev *dev); + +uint16_t zxdh_en_sf_get_vqs_channels_num(struct dh_core_dev *dh_dev); +int32_t zxdh_en_sf_create_vqs_channels(struct dh_core_dev *dh_dev); +void zxdh_en_sf_destroy_vqs_channels(struct dh_core_dev *dh_dev); +void zxdh_en_sf_switch_vqs_channel(struct dh_core_dev *dh_dev, int32_t channel, int32_t op); +int32_t zxdh_en_sf_vqs_channel_bind_handler(struct dh_core_dev *dh_dev, int32_t vqs_channel_num, struct dh_vq_handler *handler); +void zxdh_en_sf_vqs_channel_unbind_handler(struct dh_core_dev *dh_dev, int32_t vqs_channel_num); +int32_t zxdh_en_sf_vq_bind_channel(struct dh_core_dev *dh_dev, int32_t channel_num, int32_t queue_index); +void zxdh_en_sf_vq_unbind_channel(struct dh_core_dev *dh_dev, int32_t queue_index); +int32_t zxdh_en_sf_vqs_bind_eqs(struct dh_core_dev *dh_dev, int32_t vqs_channel_num, struct list_head *vq_node); +void zxdh_en_sf_vqs_unbind_eqs(struct dh_core_dev *dh_dev, int32_t vqs_channel_num); +void __iomem *zxdh_en_sf_map_vq_notify(struct dh_core_dev *dh_dev, uint32_t index, resource_size_t *pa); +void zxdh_en_sf_unmap_vq_notify(struct dh_core_dev *dh_dev, void *priv); +void zxdh_en_sf_activate_phy_vq(struct dh_core_dev *dh_dev, uint32_t phy_index, int32_t queue_size, uint64_t desc_addr, uint64_t avail_addr, uint64_t used_addr); +void zxdh_en_sf_set_queue_enable(struct dh_core_dev *dh_dev, uint16_t index, bool enable); +uint32_t zxdh_en_sf_get_epbdf(struct dh_core_dev *dh_dev); +uint16_t zxdh_en_sf_get_vport(struct dh_core_dev *dh_dev); +uint16_t zxdh_en_sf_get_pcie_id(struct dh_core_dev *dh_dev); +uint16_t zxdh_en_sf_get_slot_id(struct dh_core_dev *dh_dev); +enum dh_coredev_type zxdh_en_sf_get_coredev_type(struct dh_core_dev *dh_dev); +void zxdh_en_sf_dpp_np_init(struct dh_core_dev *dh_dev, uint32_t vport); +struct pci_dev *zxdh_en_sf_get_pdev(struct dh_core_dev *dh_dev); +uint64_t zxdh_en_sf_get_bar_virt_addr(struct dh_core_dev *dh_dev, uint8_t bar_num); +int32_t zxdh_en_sf_do_cmd_exec(struct dh_core_dev *dh_dev, uint32_t dst, uint32_t id, uint32_t len, void *payload, void *ack); +struct zxdh_vf_item *zxdh_en_sf_get_vf_item(struct dh_core_dev *dh_dev, uint16_t vf_idx); + +struct dh_en_sf_eq_table { + struct dh_irq **vq_irqs; + struct dh_irq *async_irq; + struct dh_eq_async async_eq; + int32_t vq_irq_num; + struct list_head vqs_eqs_list; +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/en_sf/irq.c b/src/net/drivers/net/ethernet/dinghai/en_sf/irq.c new file mode 100644 index 0000000..3243540 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_sf/irq.c @@ -0,0 +1,5 @@ +#include +#include +#include +#include "irq.h" + diff --git a/src/net/drivers/net/ethernet/dinghai/en_sf/irq.h b/src/net/drivers/net/ethernet/dinghai/en_sf/irq.h new file mode 100644 index 0000000..250305b --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_sf/irq.h @@ -0,0 +1,24 @@ +#ifndef __ZXDH_PF_IRQ_H__ +#define __ZXDH_PF_IRQ_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +struct dh_irq* dh_pf_async_irq_request(struct dh_core_dev *dev); +int32_t dh_pf_irq_table_create(struct dh_core_dev *dev); +void dh_pf_irq_table_destroy(struct dh_core_dev *dev); +int32_t dh_pf_irq_table_init(struct dh_core_dev *dev); + +struct dh_en_sf_irq_table { + struct dh_irq_pool *sf_vq_pool; +}; + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn.c b/src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn.c new file mode 100644 index 0000000..bc6ac94 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn.c @@ -0,0 +1,71 @@ +#include +#include +#include +#include "en_pf.h" +#include "zxdh_tsn.h" +#include "zxdh_tsn_reg.h" +#include "zxdh_tsn_comm.h" +#include "zxdh_tsn_ioctl.h" + +int32_t zxdh_tsn_init(struct dh_core_dev* dh_dev) +{ + struct zxdh_tsn_private* tsn = NULL; + struct zxdh_pf_device* pf_dev = NULL; + + ZXDH_TSN_COMM_CHECK_POINT(dh_dev); + ZXDH_TSN_COMM_CHECK_INDEX_EQUAL_RETURN_OK(dh_dev->coredev_type, DH_COREDEV_PF); + + pf_dev = dh_core_priv(dh_dev); + ZXDH_TSN_COMM_CHECK_POINT(pf_dev); + + tsn = kzalloc(sizeof(struct zxdh_tsn_private), GFP_KERNEL); + ZXDH_TSN_COMM_CHECK_POINT(tsn); + + pf_dev->tsn = tsn; + + memset(tsn, 0x00, sizeof(struct zxdh_tsn_private)); + + tsn->tsn_qbv_cap.ct_min = TSN_CYCLE_TIME_MIN; + tsn->tsn_qbv_cap.ct_max = TSN_CYCLE_TIME_MAX; + tsn->tsn_qbv_cap.it_min = TSN_INTERVAL_TIME_MIN; + tsn->tsn_qbv_cap.it_max = TSN_INTERVAL_TIME_MAX; + tsn->tsn_qbv_cap.gcl_num = TSN_PORT_GCL_NUM; + tsn->tsn_port_id.port_id = TSN_PORT_PORT_ID_DEF; + tsn->pci_ioremap_addr = pf_dev->pci_ioremap_addr[0]; + + spin_lock_init(&tsn->tsn_spin_lock); + + hrtimer_init(&tsn->tsn_qbv_change_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + tsn->tsn_qbv_change_timer.function = zxdh_tsn_qbv_change_timer_callback; + + return TSN_OK; +} +EXPORT_SYMBOL(zxdh_tsn_init); + +void zxdh_tsn_exit(struct dh_core_dev* dh_dev) +{ + struct zxdh_tsn_private* tsn = NULL; + struct zxdh_pf_device* pf_dev = NULL; + + ZXDH_TSN_COMM_CHECK_POINT_RETURN_NONE(dh_dev); + ZXDH_TSN_COMM_CHECK_INDEX_EQUAL_RETURN_NONE(dh_dev->coredev_type, DH_COREDEV_PF); + + pf_dev = dh_core_priv(dh_dev); + ZXDH_TSN_COMM_CHECK_POINT_RETURN_NONE(pf_dev); + + tsn = pf_dev->tsn; + ZXDH_TSN_COMM_CHECK_POINT_RETURN_NONE(tsn); + + hrtimer_cancel(&tsn->tsn_qbv_change_timer); + + if (!IS_ERR_OR_NULL((void*)(tsn->tsn_reg_base_addr))) + { + tsn_port_disable_set(tsn); + tsn_port_phy_port_set(tsn, TSN_PORT_PORT_ID_DEF); + } + + kfree(tsn); +} +EXPORT_SYMBOL(zxdh_tsn_exit); + +MODULE_LICENSE("GPL"); diff --git a/src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn.h b/src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn.h new file mode 100644 index 0000000..077a483 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn.h @@ -0,0 +1,112 @@ +#ifndef __ZXDH_TSN_H__ +#define __ZXDH_TSN_H__ + +#ifdef __cplusplus +extern "C"{ +#endif + +#include +#include +#include +#include + +#define TSN_PORT_RAM_NUM (2) +#define TSN_PORT_RAM_MAX (TSN_PORT_RAM_NUM -1) +#define TSN_PORT_GCL_NUM (250) +#define TSN_PORT_GCL_EXT_NUM (6) +#define TSN_PORT_GCL_MAX (TSN_PORT_GCL_NUM + TSN_PORT_GCL_EXT_NUM - 1) +#define TSN_PORT_QUEUE_NUM (8) +#define TSN_PORT_QUEUE_MAX (TSN_PORT_QUEUE_NUM - 1) +#define TSN_PORT_PORT_ID_NUM (4) +#define TSN_PORT_PORT_ID_MAX (TSN_PORT_PORT_ID_NUM - 1) +#define TSN_PORT_PORT_ID_DEF (15) +#define TSN_PORT_TIMER_ID_NUM (4) +#define TSN_PORT_TIMER_ID_MAX (TSN_PORT_TIMER_ID_NUM - 1) + +#define TSN_PORT_GATE_ENABLE (1) +#define TSN_PORT_GATE_DISABLE (0) +#define TSN_PORT_INIT_ENABLE (1) +#define TSN_PORT_INIT_DISABLE (0) +#define TSN_PORT_CHANGE_ENABLE (1) +#define TSN_PORT_CHANGE_DISABLE (0) + +#define TSN_PORT_GATE_IDLE (0) +#define TSN_PORT_GATE_RUNNING (1) +#define TSN_PORT_GATE_CHANGING (2) +#define TSN_PORT_GATE_PENDING (3) + +#define TSN_CYCLE_TIME_MIN (500000) +#define TSN_CYCLE_TIME_MAX (4000000000) +#define TSN_INTERVAL_TIME_MIN (1000) +#define TSN_INTERVAL_TIME_MAX (16000000) + +struct zxdh_tsn_port_id +{ + uint32_t port_id; +}; + +struct zxdh_tsn_timer_id +{ + uint32_t timer_id; +}; + +struct zxdh_tsn_qbv_cap +{ + uint64_t ct_min; + uint64_t ct_max; + uint32_t it_min; + uint32_t it_max; + uint32_t gcl_num; +}; + +struct zxdh_tsn_qbv_entry +{ + uint32_t gate_state; + uint32_t time_interval; +}; + +struct zxdh_tsn_qbv_basic +{ + uint64_t base_time; + uint64_t cycle_time; + uint32_t maxsdu[TSN_PORT_QUEUE_NUM]; + uint32_t guard_band_time[TSN_PORT_QUEUE_NUM]; + uint32_t control_list_length; + struct zxdh_tsn_qbv_entry control_list[TSN_PORT_GCL_NUM]; +}; + +struct zxdh_tsn_qbv_conf +{ + uint32_t enable; + struct zxdh_tsn_qbv_basic admin; +}; + +struct zxdh_tsn_qbv_status +{ + uint64_t current_time; + uint32_t current_status; + struct zxdh_tsn_qbv_basic oper; +}; + +struct zxdh_tsn_private +{ + uint32_t phy_port_id; + uint64_t pci_ioremap_addr; + uint64_t tsn_reg_base_addr; + + struct zxdh_tsn_port_id tsn_port_id; + struct zxdh_tsn_qbv_cap tsn_qbv_cap; + struct zxdh_tsn_qbv_conf tsn_qbv_conf[TSN_PORT_RAM_NUM]; + struct hrtimer tsn_qbv_change_timer; + + spinlock_t tsn_spin_lock; +}; + +int32_t zxdh_tsn_init(struct dh_core_dev* dh_dev); +void zxdh_tsn_exit(struct dh_core_dev* dh_dev); + +#ifdef __cplusplus +} +#endif + +#endif /* __ZXDH_TSN_H__ */ diff --git a/src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn_comm.h b/src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn_comm.h new file mode 100644 index 0000000..4a8e529 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn_comm.h @@ -0,0 +1,228 @@ +#ifndef __ZXDH_TSN_COMM_H__ +#define __ZXDH_TSN_COMM_H__ + +#ifdef __cplusplus +extern "C"{ +#endif + +#include +#include "log.h" + +#ifndef TSN_OK +#define TSN_OK (0) +#endif + +#define ZXDH_TSN_COMM_CHECK_RC(rc)\ +do{\ + if(TSN_OK != (rc))\ + {\ + DH_LOG_ERR(MODULE_TSN, "[ErrorCode: %d] !\n", rc);\ + return rc;\ + }\ +}while(0) + +#define ZXDH_TSN_COMM_CHECK_RC_RETURN_NONE(rc)\ +do{\ + if(TSN_OK != (rc))\ + {\ + DH_LOG_ERR(MODULE_TSN, "[ErrorCode: %d] !\n", rc);\ + return;\ + }\ +}while(0) + +#define ZXDH_TSN_COMM_CHECK_RC_UNLOCK_RETURN_NONE(rc, lock)\ +do{\ + if(TSN_OK != (rc))\ + {\ + DH_LOG_ERR(MODULE_TSN, "[ErrorCode: %d] !\n", rc);\ + spin_unlock(lock);\ + return;\ + }\ +}while(0) + +#define ZXDH_TSN_COMM_CHECK_RC_UNLOCK_RETURN_VALUE(rc, lock, value)\ +do{\ + if(TSN_OK != (rc))\ + {\ + DH_LOG_ERR(MODULE_TSN, "[ErrorCode: %d] !\n", rc);\ + spin_unlock(lock);\ + return value;\ + }\ +}while(0) + +#define ZXDH_TSN_COMM_CHECK_RC_UNLOCKIRQ_MEMORY_FREE(rc, lock, flags, ptr)\ +do{\ + if(TSN_OK != (rc))\ + {\ + DH_LOG_ERR(MODULE_TSN, "[ErrorCode: %d] !\n", rc);\ + spin_unlock_irqrestore(lock, flags);\ + kfree(ptr);\ + return rc;\ + }\ +}while(0) + +#define ZXDH_TSN_COMM_CHECK_RC_UNLOCK_MEMORY_FREE_RETURN_NONE(rc, lock, ptr)\ +do{\ + if(TSN_OK != (rc))\ + {\ + DH_LOG_ERR(MODULE_TSN, "[ErrorCode: %d] !\n", rc);\ + spin_unlock(lock);\ + kfree(ptr);\ + return;\ + }\ +}while(0) + +#define ZXDH_TSN_COMM_CHECK_RC_UNLOCK_MEMORY_FREE_RETURN_VALUE(rc, lock, ptr, value)\ +do{\ + if(TSN_OK != (rc))\ + {\ + DH_LOG_ERR(MODULE_TSN, "[ErrorCode: %d] !\n", rc);\ + spin_unlock(lock);\ + kfree(ptr);\ + return value;\ + }\ +}while(0) + +#define ZXDH_TSN_COMM_CHECK_RC_MEMORY_FREE(rc, ptr)\ +do{\ + if(TSN_OK != (rc))\ + {\ + DH_LOG_ERR(MODULE_TSN, "[ErrorCode: %d] !\n", rc);\ + kfree(ptr);\ + return rc;\ + }\ +} while(0) + +#define ZXDH_TSN_COMM_CHECK_POINT(point)\ +do{\ + if(NULL == (point))\ + {\ + DH_LOG_ERR(MODULE_TSN, "[Error: POINT NULL] !\n");\ + return -EINVAL;\ + }\ +}while(0) + +#define ZXDH_TSN_COMM_CHECK_POINT_RETURN_NONE(point)\ +do{\ + if(NULL == (point))\ + {\ + DH_LOG_ERR(MODULE_TSN, "[Error: POINT NULL] !\n");\ + return;\ + }\ +}while(0) + +#define ZXDH_TSN_COMM_CHECK_POINT_RETURN_VALUE(point, value)\ +do{\ + if(NULL == (point))\ + {\ + DH_LOG_ERR(MODULE_TSN, "[Error: POINT NULL] !\n");\ + return value;\ + }\ +}while(0) + +#define ZXDH_TSN_COMM_CHECK_POINT_UNLOCK_RETURN_NONE(point, lock)\ +do{\ + if(NULL == (point))\ + {\ + DH_LOG_ERR(MODULE_TSN, "[Error: POINT NULL] !\n");\ + spin_unlock(lock);\ + return;\ + }\ +}while(0) + +#define ZXDH_TSN_COMM_CHECK_POINT_UNLOCK_RETURN_VALUE(point, lock, value)\ +do{\ + if(NULL == (point))\ + {\ + DH_LOG_ERR(MODULE_TSN, "[Error: POINT NULL] !\n");\ + spin_unlock(lock);\ + return value;\ + }\ +}while(0) + +#define ZXDH_TSN_COMM_CHECK_POINT_UNLOCK_MEMORY_FREE_RETURN_NONE(point, lock, ptr)\ +do{\ + if(NULL == (point))\ + {\ + DH_LOG_ERR(MODULE_TSN, "[Error: POINT NULL] !\n");\ + spin_unlock(lock);\ + kfree(ptr);\ + return;\ + }\ +}while(0) + +#define ZXDH_TSN_COMM_CHECK_INDEX(val, min, max)\ +do{\ + if(((val) < (min)) || ((val) > (max)))\ + {\ + DH_LOG_ERR(MODULE_TSN, "[Error: VALUE %u INVALID] [MIN %u MAX %u] !\n", val, min, max);\ + return -EINVAL;\ + }\ +}while(0) + +#define ZXDH_TSN_COMM_CHECK_INDEX_64(val, min, max)\ +do{\ + if(((val) < (min)) || ((val) > (max)))\ + {\ + DH_LOG_ERR(MODULE_TSN, "[Error: VALUE %llu INVALID] [MIN %llu MAX %llu] !\n", val, min, max);\ + return -EINVAL;\ + }\ +}while(0) + +#define ZXDH_TSN_COMM_CHECK_INDEX_MAX(val, max)\ +do{\ + if((val) > (max))\ + {\ + DH_LOG_ERR(MODULE_TSN, "[Error: VALUE %u INVALID] [MAX %u] !\n", val, max);\ + return -EINVAL;\ + }\ +}while(0) + +#define ZXDH_TSN_COMM_CHECK_INDEX_MAX_MEMORY_FREE(val, max, ptr)\ +do{\ + if((val) > (max))\ + {\ + DH_LOG_ERR(MODULE_TSN, "[Error: VALUE %u INVALID] [MAX %u] !\n", val, max);\ + kfree(ptr);\ + return -EINVAL;\ + }\ +}while(0) + +#define ZXDH_TSN_COMM_CHECK_INDEX_EQUAL(val, equal)\ +do{\ + if((val) != (equal))\ + {\ + DH_LOG_ERR(MODULE_TSN, "[Error: VALUE %u INVALID] [EQUAL %u] !\n", val, equal);\ + return -EINVAL;\ + }\ +}while(0) + +#define ZXDH_TSN_COMM_CHECK_INDEX_EQUAL_64(val, equal)\ +do{\ + if((val) != (equal))\ + {\ + DH_LOG_ERR(MODULE_TSN, "[Error: VALUE %llu INVALID] [EQUAL %llu] !\n", val, equal);\ + return -EINVAL;\ + }\ +}while(0) + +#define ZXDH_TSN_COMM_CHECK_INDEX_EQUAL_RETURN_OK(val, equal)\ +do{\ + if((val) != (equal))\ + {\ + return TSN_OK;\ + }\ +}while(0) + +#define ZXDH_TSN_COMM_CHECK_INDEX_EQUAL_RETURN_NONE(val, equal)\ +do{\ + if((val) != (equal))\ + {\ + return;\ + }\ +}while(0) + +#ifdef __cplusplus +} +#endif +#endif /* __ZXDH_TSN_COMM_H__ */ diff --git a/src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn_ioctl.c b/src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn_ioctl.c new file mode 100644 index 0000000..f11b5e0 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn_ioctl.c @@ -0,0 +1,695 @@ +#include +#include "log.h" +#include "en_pf.h" +#include "en_aux.h" +#include "zxdh_tsn.h" +#include "zxdh_tsn_reg.h" +#include "zxdh_tsn_ioctl.h" +#include "zxdh_tsn_comm.h" +#ifndef HAVE_IOPOLL_OPS +#include +#endif + +static int32_t zxdh_tsn_qbv_disable(struct zxdh_tsn_private* tsn) +{ + int32_t ret = 0; + + ret = tsn_port_disable_set(tsn); + ZXDH_TSN_COMM_CHECK_RC(ret); + + memset(tsn->tsn_qbv_conf, 0x00, sizeof(tsn->tsn_qbv_conf)); + + hrtimer_cancel(&tsn->tsn_qbv_change_timer); + + DH_LOG_INFO(MODULE_TSN, "tsn port id %u is disable.\n", tsn->tsn_port_id.port_id); + + return TSN_OK; +} + +static int32_t zxdh_tsn_port_id_set(struct zxdh_tsn_private* tsn, struct zxdh_tsn_msg* msg) +{ + int32_t ret = 0; + uint64_t reg_base_addr = 0; + struct zxdh_tsn_port_id* tsn_port_id = NULL; + + ZXDH_TSN_COMM_CHECK_INDEX_EQUAL(msg->len, (uint32_t)sizeof(struct zxdh_tsn_port_id)); + + tsn_port_id = (struct zxdh_tsn_port_id*)msg->data; + ZXDH_TSN_COMM_CHECK_POINT(tsn_port_id); + + ZXDH_TSN_COMM_CHECK_INDEX_MAX(tsn_port_id->port_id, TSN_PORT_PORT_ID_MAX); + + if (!IS_ERR_OR_NULL((void*)(tsn->tsn_reg_base_addr))) + { + ret = tsn_port_disable_set(tsn); + ZXDH_TSN_COMM_CHECK_RC(ret); + + ret = tsn_port_phy_port_set(tsn, TSN_PORT_PORT_ID_DEF); + ZXDH_TSN_COMM_CHECK_RC(ret); + } + + reg_base_addr = tsn->pci_ioremap_addr + TSN_PORT_REG_BAR_OFFSET + ((tsn_port_id->port_id) * TSN_PORT_REG_BAR_SIZE); + ret = tsn_write(reg_base_addr, TSN_PORT_PHY_PORT_SEL, tsn->phy_port_id); + ZXDH_TSN_COMM_CHECK_RC(ret); + + DH_LOG_INFO(MODULE_TSN, "tsn port id %u is bound to phy port id %u.\n", tsn_port_id->port_id, + tsn->phy_port_id); + tsn->tsn_reg_base_addr = reg_base_addr; + tsn->tsn_port_id.port_id = tsn_port_id->port_id; + + ret = zxdh_tsn_qbv_disable(tsn); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +static int32_t zxdh_tsn_port_id_get(struct zxdh_tsn_private* tsn, struct zxdh_tsn_msg* msg) +{ + struct zxdh_tsn_port_id tsn_port_id; + + ZXDH_TSN_COMM_CHECK_INDEX_EQUAL(msg->len, (uint32_t)sizeof(struct zxdh_tsn_port_id)); + + tsn_port_id.port_id = tsn->tsn_port_id.port_id; + + memcpy(msg->data, &tsn_port_id, sizeof(struct zxdh_tsn_port_id)); + + return TSN_OK; +} + +static int32_t zxdh_tsn_timer_id_set(struct zxdh_tsn_private* tsn, struct zxdh_tsn_msg* msg) +{ + int32_t ret = 0; + struct zxdh_tsn_timer_id* tsn_timer_id = NULL; + + ZXDH_TSN_COMM_CHECK_INDEX_EQUAL(msg->len, (uint32_t)sizeof(struct zxdh_tsn_timer_id)); + + tsn_timer_id = (struct zxdh_tsn_timer_id*)msg->data; + ZXDH_TSN_COMM_CHECK_POINT(tsn_timer_id); + + ZXDH_TSN_COMM_CHECK_INDEX_MAX(tsn_timer_id->timer_id, TSN_PORT_TIMER_ID_MAX); + + ret = tsn_port_timer_id_set(tsn, tsn_timer_id->timer_id); + ZXDH_TSN_COMM_CHECK_RC(ret); + + DH_LOG_INFO(MODULE_TSN, "tsn port id %u is bound to timer id %u.\n", tsn->tsn_port_id.port_id, + tsn_timer_id->timer_id); + + return TSN_OK; +} + +static int32_t zxdh_tsn_timer_id_get(struct zxdh_tsn_private* tsn, struct zxdh_tsn_msg* msg) +{ + int32_t ret = 0; + struct zxdh_tsn_timer_id tsn_timer_id; + + ZXDH_TSN_COMM_CHECK_INDEX_EQUAL(msg->len, (uint32_t)sizeof(struct zxdh_tsn_timer_id)); + + ret = tsn_port_timer_id_get(tsn, &tsn_timer_id.timer_id); + ZXDH_TSN_COMM_CHECK_RC(ret); + + memcpy(msg->data, &tsn_timer_id, sizeof(struct zxdh_tsn_timer_id)); + + return TSN_OK; +} + +static int32_t zxdh_tsn_qbv_conf_check(struct zxdh_tsn_private* tsn, struct zxdh_tsn_qbv_conf* tsn_qbv_conf) +{ + uint32_t index = 0; + uint64_t time_interval_sum = 0; + struct zxdh_tsn_qbv_basic* tsn_qbv_basic = &tsn_qbv_conf->admin; + struct zxdh_tsn_qbv_entry* tsn_qbv_entry = tsn_qbv_conf->admin.control_list; + + ZXDH_TSN_COMM_CHECK_INDEX_MAX(tsn_qbv_conf->enable, TSN_PORT_GATE_ENABLE); + + ZXDH_TSN_COMM_CHECK_INDEX_64(tsn_qbv_basic->cycle_time, tsn->tsn_qbv_cap.ct_min, tsn->tsn_qbv_cap.ct_max); + + ZXDH_TSN_COMM_CHECK_INDEX(tsn_qbv_basic->control_list_length, 1, tsn->tsn_qbv_cap.gcl_num); + + for (index = 0; index < tsn_qbv_basic->control_list_length; index++) + { + ZXDH_TSN_COMM_CHECK_INDEX(tsn_qbv_entry[index].time_interval, tsn->tsn_qbv_cap.it_min, tsn->tsn_qbv_cap.it_max); + time_interval_sum += tsn_qbv_entry[index].time_interval; + } + + ZXDH_TSN_COMM_CHECK_INDEX_EQUAL_64(tsn_qbv_basic->cycle_time, time_interval_sum); + + return TSN_OK; +} + +static int32_t zxdh_tsn_qbv_base_time_cal(struct zxdh_tsn_private* tsn, struct zxdh_tsn_qbv_conf* tsn_qbv_conf_oper, + struct zxdh_tsn_qbv_conf* tsn_qbv_conf_admin, + uint64_t real_tod_time, uint32_t status) +{ + uint64_t oper_base_time = 0; + uint64_t oper_cycle_time = 0; + uint64_t admin_base_time = 0; + uint64_t admin_cycle_time = 0; + uint64_t cycle_time_extension = 0; + + ZXDH_TSN_COMM_CHECK_POINT(tsn_qbv_conf_oper); + ZXDH_TSN_COMM_CHECK_POINT(tsn_qbv_conf_admin); + + oper_base_time = tsn_qbv_conf_oper->admin.base_time; + oper_cycle_time = tsn_qbv_conf_oper->admin.cycle_time; + + admin_base_time = tsn_qbv_conf_admin->admin.base_time; + admin_cycle_time = tsn_qbv_conf_admin->admin.cycle_time; + + if (real_tod_time >= admin_base_time) + { + admin_base_time += admin_cycle_time * (((real_tod_time - admin_base_time) / admin_cycle_time) + 1); + if ((admin_base_time - real_tod_time) < TSN_SOFT_RESERVED_TIME) + { + admin_base_time += TSN_RESERVED_TIME(admin_cycle_time); + } + DH_LOG_INFO(MODULE_TSN, "tsn port id %u admin_base_time change to %llu real_tod_time %llu diff %llu.\n", + tsn->tsn_port_id.port_id, admin_base_time, real_tod_time, admin_base_time - real_tod_time); + } + else if ((admin_base_time - real_tod_time) < TSN_SOFT_RESERVED_TIME) + { + admin_base_time += TSN_RESERVED_TIME(admin_cycle_time); + DH_LOG_INFO(MODULE_TSN, "tsn port id %u admin_base_time change to %llu real_tod_time %llu diff %llu.\n", + tsn->tsn_port_id.port_id, admin_base_time, real_tod_time, admin_base_time - real_tod_time); + } + + if (status != TSN_PORT_GATE_IDLE) + { + if (real_tod_time >= oper_base_time) + { + cycle_time_extension = (admin_base_time - oper_base_time) % oper_cycle_time; + if (cycle_time_extension < TSN_CYCLE_TIME_EXTENSION_MIN) + { + cycle_time_extension += oper_cycle_time; + } + DH_LOG_INFO(MODULE_TSN, "tsn port id %u cycle_time_extension %llu .\n", tsn->tsn_port_id.port_id, cycle_time_extension); + + if (cycle_time_extension < oper_cycle_time) + { + oper_base_time += oper_cycle_time * (((real_tod_time - oper_base_time) / oper_cycle_time) + 1); + if ((oper_base_time - real_tod_time) < TSN_SOFT_RESERVED_TIME) + { + oper_base_time += TSN_RESERVED_TIME(oper_cycle_time); + } + } + else + { + oper_base_time += oper_cycle_time * (((real_tod_time - oper_base_time) / oper_cycle_time) + 2); + if ((oper_base_time - oper_cycle_time - real_tod_time) < TSN_SOFT_RESERVED_TIME) + { + oper_base_time += TSN_RESERVED_TIME(oper_cycle_time); + } + } + DH_LOG_INFO(MODULE_TSN, "tsn port id %u oper_base_time change to %llu real_tod_time %llu diff %llu.\n", + tsn->tsn_port_id.port_id, oper_base_time, real_tod_time, oper_base_time - real_tod_time); + } + + if (oper_base_time > admin_base_time) + { + if (cycle_time_extension == oper_cycle_time) + { + admin_base_time += admin_cycle_time * (((oper_base_time - admin_base_time) / admin_cycle_time)); + } + else + { + admin_base_time += admin_cycle_time * (((oper_base_time - admin_base_time) / admin_cycle_time) + 1); + } + DH_LOG_INFO(MODULE_TSN, "tsn port id %u admin_base_time change to %llu oper_base_time %llu diff %llu.\n", + tsn->tsn_port_id.port_id, admin_base_time, oper_base_time, admin_base_time - oper_base_time); + } + } + + tsn_qbv_conf_admin->admin.base_time = admin_base_time; + + return TSN_OK; +} + +static int32_t zxdh_tsn_qbv_cycle_time_extension_cal(struct zxdh_tsn_private* tsn, struct zxdh_tsn_qbv_conf* tsn_qbv_conf_oper, + struct zxdh_tsn_qbv_conf* tsn_qbv_conf_admin, + uint64_t* cycle_time_extension) +{ + uint64_t admin_base_time = 0; + uint64_t oper_base_time = 0; + uint64_t oper_cycle_time = 0; + + ZXDH_TSN_COMM_CHECK_POINT(tsn_qbv_conf_oper); + ZXDH_TSN_COMM_CHECK_POINT(tsn_qbv_conf_admin); + ZXDH_TSN_COMM_CHECK_POINT(cycle_time_extension); + + oper_base_time = tsn_qbv_conf_oper->admin.base_time; + oper_cycle_time = tsn_qbv_conf_oper->admin.cycle_time; + + admin_base_time = tsn_qbv_conf_admin->admin.base_time; + + if ((admin_base_time > oper_base_time) && (oper_cycle_time != 0)) + { + oper_base_time += oper_cycle_time * ((admin_base_time - oper_base_time) / oper_cycle_time); + if (admin_base_time >= oper_base_time) + { + *cycle_time_extension = admin_base_time - oper_base_time; + if ((*cycle_time_extension) < TSN_CYCLE_TIME_EXTENSION_MIN) + { + *cycle_time_extension += oper_cycle_time; + } + DH_LOG_INFO(MODULE_TSN, "tsn port id %u cycle_time_extension %llu.\n", tsn->tsn_port_id.port_id, + *cycle_time_extension); + return TSN_OK; + } + } + + return -EINVAL; +} + +static int32_t zxdh_tsn_qbv_gate_status_get(struct zxdh_tsn_private* tsn, uint32_t* p_ram_n_idle, uint32_t* p_status) +{ + int32_t ret = 0; + uint32_t init_finish = 0; + uint32_t change_en = 0; + uint32_t ram_n = 0; + uint32_t status = 0; + uint32_t enable = 0; + uint64_t admin_base_time = 0; + uint64_t real_tod_time = 0; + uint64_t cycle_time_extension = 0; + + ret = tsn_port_status_get(tsn, &ram_n, &status); + ZXDH_TSN_COMM_CHECK_RC(ret); + + ret = tsn_port_init_finish_get(tsn, &init_finish); + ZXDH_TSN_COMM_CHECK_RC(ret); + + ret = tsn_port_change_en_get(tsn, &change_en); + ZXDH_TSN_COMM_CHECK_RC(ret); + + ret = tsn_port_enable_get(tsn, &enable); + ZXDH_TSN_COMM_CHECK_RC(ret); + + *p_ram_n_idle = (ram_n == 0)? 0 : ((ram_n == 1)? 1 : ((ram_n == 2)? 0 : 2)); + ZXDH_TSN_COMM_CHECK_INDEX_MAX(*p_ram_n_idle, TSN_PORT_RAM_MAX); + + if ((status == 0) && (init_finish == 0) && (change_en == 0) && (enable == TSN_PORT_GATE_DISABLE)) + { + *p_status = TSN_PORT_GATE_IDLE; + DH_LOG_INFO(MODULE_TSN, "tsn port id %u idle status %u init_finish %u change_en %u enable %u.\n", + tsn->tsn_port_id.port_id, status, init_finish, change_en, enable); + return TSN_OK; + } + + if (((status >= 3) && (status <= 8)) && (init_finish == 0) && (change_en == 0) && (enable == TSN_PORT_GATE_ENABLE)) + { + *p_status = TSN_PORT_GATE_RUNNING; + DH_LOG_INFO(MODULE_TSN, "tsn port id %u running status %u init_finish %u change_en %u enable %u.\n", + tsn->tsn_port_id.port_id, status, init_finish, change_en, enable); + return TSN_OK; + } + + if (((status >= 3) && (status <= 8)) && (init_finish == 0) && (change_en == 1) && (enable == TSN_PORT_GATE_ENABLE)) + { + admin_base_time = tsn->tsn_qbv_conf[*p_ram_n_idle].admin.base_time; + ret = zxdh_tsn_qbv_cycle_time_extension_cal(tsn, &tsn->tsn_qbv_conf[TSN_RAM_N_IN_SERVICE(*p_ram_n_idle)], + &tsn->tsn_qbv_conf[*p_ram_n_idle], &cycle_time_extension); + ZXDH_TSN_COMM_CHECK_RC(ret); + + ret = tsn_port_real_tod_time_get(tsn, &real_tod_time); + ZXDH_TSN_COMM_CHECK_RC(ret); + + if ((admin_base_time - cycle_time_extension - TSN_SOFT_RESERVED_TIME) > real_tod_time) + { + *p_status = TSN_PORT_GATE_CHANGING; + DH_LOG_INFO(MODULE_TSN, "tsn port id %u changing status %u init_finish %u change_en %u enable %u.\n", + tsn->tsn_port_id.port_id, status, init_finish, change_en, enable); + return TSN_OK; + } + } + + *p_status = TSN_PORT_GATE_PENDING; + DH_LOG_INFO(MODULE_TSN, "tsn port id %u pending status %u init_finish %u change_en %u enable %u.\n", + tsn->tsn_port_id.port_id, status, init_finish, change_en, enable); + return TSN_OK; +} + +static int32_t zxdh_tsn_qbv_basic_set(struct zxdh_tsn_private* tsn, struct zxdh_tsn_qbv_conf* tsn_qbv_conf, uint32_t ram_n_idle) +{ + int32_t ret = 0; + uint32_t index = 0; + + ret = tsn_port_default_gate_set(tsn, 0x00); + ZXDH_TSN_COMM_CHECK_RC(ret); + + ret = tsn_port_change_gate_set(tsn, 0xFF); + ZXDH_TSN_COMM_CHECK_RC(ret); + + for (index = 0; index < TSN_PORT_QUEUE_NUM; index++) + { + ret = tsn_port_guard_band_time_set(tsn, index, tsn_qbv_conf->admin.guard_band_time[index]); + ZXDH_TSN_COMM_CHECK_RC(ret); + } + + ret = tsn_port_gcl_num_set(tsn, ram_n_idle, tsn_qbv_conf->admin.control_list_length); + ZXDH_TSN_COMM_CHECK_RC(ret); + + for (index = 0; index < tsn_qbv_conf->admin.control_list_length; index++) + { + ret = tsn_port_gcl_control_set(tsn, ram_n_idle, index, tsn_qbv_conf->admin.control_list[index].gate_state, + tsn_qbv_conf->admin.control_list[index].time_interval); + ZXDH_TSN_COMM_CHECK_RC(ret); + } + + ret = tsn_port_enable_set(tsn, TSN_PORT_GATE_ENABLE); + ZXDH_TSN_COMM_CHECK_RC(ret); + + ret = tsn_port_cycle_time_set(tsn, tsn_qbv_conf->admin.cycle_time); + ZXDH_TSN_COMM_CHECK_RC(ret); + + ret = tsn_port_base_time_set(tsn, tsn_qbv_conf->admin.base_time); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +static int32_t zxdh_tsn_qbv_change_set(struct zxdh_tsn_private* tsn, struct zxdh_tsn_qbv_conf* tsn_qbv_conf, uint32_t ram_n_idle) +{ + int32_t ret = 0; + + ret = tsn_port_change_en_set(tsn, TSN_PORT_CHANGE_DISABLE); + ZXDH_TSN_COMM_CHECK_RC(ret); + + ret = zxdh_tsn_qbv_basic_set(tsn, tsn_qbv_conf, ram_n_idle); + ZXDH_TSN_COMM_CHECK_RC(ret); + + ret = tsn_port_change_en_set(tsn, TSN_PORT_CHANGE_ENABLE); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +static int32_t zxdh_tsn_qbv_set(struct zxdh_tsn_private* tsn, struct zxdh_tsn_msg* msg) +{ + int32_t ret = 0; + uint32_t ram_n_idle = 0; + uint32_t status = 0; + uint64_t cycle_time_extension = 0; + uint64_t real_tod_time = 0; + uint64_t expires_in_nanosecond = 0; + struct zxdh_tsn_qbv_conf* tsn_qbv_conf = NULL; + + ZXDH_TSN_COMM_CHECK_INDEX_EQUAL(msg->len, (uint32_t)sizeof(struct zxdh_tsn_qbv_conf)); + + tsn_qbv_conf = (struct zxdh_tsn_qbv_conf*)msg->data; + ZXDH_TSN_COMM_CHECK_POINT(tsn_qbv_conf); + + if (tsn_qbv_conf->enable == TSN_PORT_GATE_DISABLE) + { + ret = zxdh_tsn_qbv_disable(tsn); + ZXDH_TSN_COMM_CHECK_RC(ret); + return TSN_OK; + } + + ret = zxdh_tsn_qbv_conf_check(tsn, tsn_qbv_conf); + ZXDH_TSN_COMM_CHECK_RC(ret); + + ret = zxdh_tsn_qbv_gate_status_get(tsn, &ram_n_idle, &status); + ZXDH_TSN_COMM_CHECK_RC(ret); + + if (status == TSN_PORT_GATE_PENDING) + { + DH_LOG_ERR(MODULE_TSN, "tsn port id %u is pending.\n", tsn->tsn_port_id.port_id); + return -EBUSY; + } + + ret = tsn_port_real_tod_time_get(tsn, &real_tod_time); + ZXDH_TSN_COMM_CHECK_RC(ret); + + ret = zxdh_tsn_qbv_base_time_cal(tsn, &tsn->tsn_qbv_conf[TSN_RAM_N_IN_SERVICE(ram_n_idle)], tsn_qbv_conf, + real_tod_time, status); + ZXDH_TSN_COMM_CHECK_RC(ret); + + if (status == TSN_PORT_GATE_IDLE) + { + ret = zxdh_tsn_qbv_basic_set(tsn, tsn_qbv_conf, ram_n_idle); + ZXDH_TSN_COMM_CHECK_RC(ret); + + ret = tsn_port_init_finish_set(tsn, TSN_PORT_INIT_ENABLE); + ZXDH_TSN_COMM_CHECK_RC(ret); + + memcpy(&tsn->tsn_qbv_conf[ram_n_idle], tsn_qbv_conf, sizeof(struct zxdh_tsn_qbv_conf)); + + DH_LOG_INFO(MODULE_TSN, "tsn port id %u ram %u is enable.\n", tsn->tsn_port_id.port_id, ram_n_idle); + } + else + { + ret = zxdh_tsn_qbv_cycle_time_extension_cal(tsn, &tsn->tsn_qbv_conf[TSN_RAM_N_IN_SERVICE(ram_n_idle)], tsn_qbv_conf, + &cycle_time_extension); + ZXDH_TSN_COMM_CHECK_RC(ret); + + // if (cycle_time_extension < TSN_CYCLE_TIME_EXTENSION_MIN) + // { + // ret = zxdh_tsn_qbv_change_set(tsn, tsn_qbv_conf, ram_n_idle); + // ZXDH_TSN_COMM_CHECK_RC(ret); + + // memcpy(&tsn->tsn_qbv_conf[ram_n_idle], tsn_qbv_conf, sizeof(struct zxdh_tsn_qbv_conf)); + + // hrtimer_cancel(&tsn->tsn_qbv_change_timer); + + // DH_LOG_INFO(MODULE_TSN, "tsn port id %u ram %u is going to change.\n", tsn->tsn_port_id.port_id, ram_n_idle); + // } + // else + // { + memcpy(&tsn->tsn_qbv_conf[ram_n_idle], tsn_qbv_conf, sizeof(struct zxdh_tsn_qbv_conf)); + + expires_in_nanosecond = tsn->tsn_qbv_conf[ram_n_idle].admin.base_time - cycle_time_extension - + TSN_TIMER_RESERVED_TIME - real_tod_time; + hrtimer_start(&tsn->tsn_qbv_change_timer, ns_to_ktime(expires_in_nanosecond), HRTIMER_MODE_REL); + + DH_LOG_INFO(MODULE_TSN, "tsn port id %u timer wake up in %llu ns later.\n", tsn->tsn_port_id.port_id, expires_in_nanosecond); + // } + } + + return TSN_OK; +} + +static int32_t zxdh_tsn_qbv_status_get(struct zxdh_tsn_private* tsn, struct zxdh_tsn_msg* msg) +{ + int32_t ret = 0; + uint32_t ram_n_idle = 0; + struct zxdh_tsn_qbv_status* tsn_qbv_status; + + ZXDH_TSN_COMM_CHECK_INDEX_EQUAL(msg->len, (uint32_t)sizeof(struct zxdh_tsn_qbv_status)); + + tsn_qbv_status = (struct zxdh_tsn_qbv_status*)msg->data; + ZXDH_TSN_COMM_CHECK_POINT(tsn_qbv_status); + + ret = zxdh_tsn_qbv_gate_status_get(tsn, &ram_n_idle, &tsn_qbv_status->current_status); + ZXDH_TSN_COMM_CHECK_RC(ret); + + ret = tsn_port_real_tod_time_get(tsn, &tsn_qbv_status->current_time); + ZXDH_TSN_COMM_CHECK_RC(ret); + + memcpy(&tsn_qbv_status->oper, &tsn->tsn_qbv_conf[TSN_RAM_N_IN_SERVICE(ram_n_idle)].admin, sizeof(struct zxdh_tsn_qbv_basic)); + + return TSN_OK; +} + +static int32_t zxdh_tsn_qbv_cycle_time_extension_set(struct zxdh_tsn_private* tsn, struct zxdh_tsn_qbv_conf* tsn_qbv_conf, + uint64_t cycle_time_extension, uint32_t ram_n_idle) +{ + int32_t ret = 0; + uint32_t index = 0; + uint32_t gate_state = 0; + uint32_t change_gate_status = 0; + uint32_t time_interval = 0; + uint64_t real_tod_time = 0; + uint64_t cycle_time_reserved = 0; + + ret = tsn_port_real_tod_time_get(tsn, &real_tod_time); + ZXDH_TSN_COMM_CHECK_RC(ret); + + memcpy(tsn_qbv_conf, &tsn->tsn_qbv_conf[TSN_RAM_N_IN_SERVICE(ram_n_idle)], sizeof(struct zxdh_tsn_qbv_conf)); + + if (cycle_time_extension > tsn_qbv_conf->admin.cycle_time) + { + cycle_time_reserved = cycle_time_extension - tsn_qbv_conf->admin.cycle_time; + + for (index = 0; index < TSN_PORT_GCL_EXT_NUM; index++) + { + gate_state = tsn_qbv_conf->admin.control_list[index].gate_state; + time_interval = tsn_qbv_conf->admin.control_list[index].time_interval; + + ret = tsn_port_gcl_control_set(tsn, ram_n_idle, tsn_qbv_conf->admin.control_list_length + index, + gate_state, time_interval); + ZXDH_TSN_COMM_CHECK_RC(ret); + + if (cycle_time_reserved > time_interval) + { + cycle_time_reserved = cycle_time_reserved - time_interval; + continue; + } + break; + } + } + + tsn_qbv_conf->admin.base_time = tsn->tsn_qbv_conf[ram_n_idle].admin.base_time - cycle_time_extension + + TSN_HW_RESERVED_TIME; + tsn_qbv_conf->admin.cycle_time = cycle_time_extension - (2 * TSN_HW_RESERVED_TIME); + tsn_qbv_conf->admin.control_list[0].time_interval -= TSN_HW_RESERVED_TIME; + + ret = zxdh_tsn_qbv_change_set(tsn, tsn_qbv_conf, ram_n_idle); + ZXDH_TSN_COMM_CHECK_RC(ret); + + change_gate_status = tsn_qbv_conf->admin.control_list[0].gate_state; + ret = tsn_port_change_gate_set(tsn, change_gate_status); + ZXDH_TSN_COMM_CHECK_RC(ret); + + ret = tsn_port_gcl_num_set(tsn, ram_n_idle, tsn_qbv_conf->admin.control_list_length + index + 1); + ZXDH_TSN_COMM_CHECK_RC(ret); + + DH_LOG_INFO(MODULE_TSN, "tsn port id %u admin_base_time %llu real_tod_time %llu diff %llu.\n", tsn->tsn_port_id.port_id, + tsn_qbv_conf->admin.base_time, real_tod_time, tsn_qbv_conf->admin.base_time - real_tod_time); + DH_LOG_INFO(MODULE_TSN, "tsn port id %u ram %u is going to change in timer.\n", tsn->tsn_port_id.port_id, ram_n_idle); + + return TSN_OK; +} + +enum hrtimer_restart zxdh_tsn_qbv_change_timer_callback(struct hrtimer* t) +{ + int32_t ret = 0; + uint32_t change_en = 0; + uint32_t change_gate_status = 0; + uint32_t ram_n_idle = 0; + uint32_t status = 0; + uint64_t real_tod_time = 0; + uint64_t cycle_time_extension = 0; + struct zxdh_tsn_private* tsn = NULL; + struct zxdh_tsn_qbv_conf* tsn_qbv_conf = NULL; + + tsn = container_of(t, struct zxdh_tsn_private, tsn_qbv_change_timer); + ZXDH_TSN_COMM_CHECK_POINT_RETURN_VALUE(tsn, HRTIMER_NORESTART); + + spin_lock(&tsn->tsn_spin_lock); + + tsn_qbv_conf = kzalloc(sizeof(struct zxdh_tsn_qbv_conf), GFP_KERNEL); + ZXDH_TSN_COMM_CHECK_POINT_UNLOCK_RETURN_VALUE(tsn_qbv_conf, &tsn->tsn_spin_lock, HRTIMER_NORESTART); + + ret = zxdh_tsn_qbv_gate_status_get(tsn, &ram_n_idle, &status); + ZXDH_TSN_COMM_CHECK_RC_UNLOCK_MEMORY_FREE_RETURN_VALUE(ret, &tsn->tsn_spin_lock, tsn_qbv_conf, HRTIMER_NORESTART); + + ret = zxdh_tsn_qbv_cycle_time_extension_cal(tsn, &tsn->tsn_qbv_conf[TSN_RAM_N_IN_SERVICE(ram_n_idle)], + &tsn->tsn_qbv_conf[ram_n_idle], &cycle_time_extension); + ZXDH_TSN_COMM_CHECK_RC_UNLOCK_MEMORY_FREE_RETURN_VALUE(ret, &tsn->tsn_spin_lock, tsn_qbv_conf, HRTIMER_NORESTART); + + ret = zxdh_tsn_qbv_cycle_time_extension_set(tsn, tsn_qbv_conf, cycle_time_extension, ram_n_idle); + ZXDH_TSN_COMM_CHECK_RC_UNLOCK_MEMORY_FREE_RETURN_VALUE(ret, &tsn->tsn_spin_lock, tsn_qbv_conf, HRTIMER_NORESTART); + + ret = readx_poll_timeout_atomic(readl, ((const volatile void *)((tsn->tsn_reg_base_addr) + TSN_PORT_CHANGE_EN)), + change_en, (change_en == 0), 1, (TSN_TIMER_RESERVED_TIME * 2)); + ZXDH_TSN_COMM_CHECK_RC_UNLOCK_MEMORY_FREE_RETURN_VALUE(ret, &tsn->tsn_spin_lock, tsn_qbv_conf, HRTIMER_NORESTART); + + change_gate_status = tsn_qbv_conf->admin.control_list[tsn_qbv_conf->admin.control_list_length - 1].gate_state; + + ret = tsn_port_real_tod_time_get(tsn, &real_tod_time); + ZXDH_TSN_COMM_CHECK_RC_UNLOCK_MEMORY_FREE_RETURN_VALUE(ret, &tsn->tsn_spin_lock, tsn_qbv_conf, HRTIMER_NORESTART); + + memcpy(tsn_qbv_conf, &tsn->tsn_qbv_conf[ram_n_idle], sizeof(struct zxdh_tsn_qbv_conf)); + memcpy(&tsn->tsn_qbv_conf[ram_n_idle], &tsn->tsn_qbv_conf[TSN_RAM_N_IN_SERVICE(ram_n_idle)], sizeof(struct zxdh_tsn_qbv_conf)); + + ret = zxdh_tsn_qbv_gate_status_get(tsn, &ram_n_idle, &status); + ZXDH_TSN_COMM_CHECK_RC_UNLOCK_MEMORY_FREE_RETURN_VALUE(ret, &tsn->tsn_spin_lock, tsn_qbv_conf, HRTIMER_NORESTART); + + ret = zxdh_tsn_qbv_change_set(tsn, tsn_qbv_conf, ram_n_idle); + ZXDH_TSN_COMM_CHECK_RC_UNLOCK_MEMORY_FREE_RETURN_VALUE(ret, &tsn->tsn_spin_lock, tsn_qbv_conf, HRTIMER_NORESTART); + + ret = tsn_port_change_gate_set(tsn, change_gate_status); + ZXDH_TSN_COMM_CHECK_RC_UNLOCK_MEMORY_FREE_RETURN_VALUE(ret, &tsn->tsn_spin_lock, tsn_qbv_conf, HRTIMER_NORESTART); + + memcpy(&tsn->tsn_qbv_conf[ram_n_idle], tsn_qbv_conf, sizeof(struct zxdh_tsn_qbv_conf)); + + DH_LOG_INFO(MODULE_TSN, "tsn port id %u admin_base_time %llu real_tod_time %llu diff %llu.\n", tsn->tsn_port_id.port_id, + tsn_qbv_conf->admin.base_time, real_tod_time, tsn_qbv_conf->admin.base_time - real_tod_time); + + kfree(tsn_qbv_conf); + + spin_unlock(&tsn->tsn_spin_lock); + + DH_LOG_INFO(MODULE_TSN, "tsn port id %u ram %u is going to change in timer.\n", tsn->tsn_port_id.port_id, ram_n_idle); + + return HRTIMER_NORESTART; +} + +static struct zxdh_tsn_ioctl_table tsn_ioctl_table[] = +{ + {TSN_PORT_ID_SET, zxdh_tsn_port_id_set}, + {TSN_PORT_ID_GET, zxdh_tsn_port_id_get}, + {TSN_TIMER_ID_SET, zxdh_tsn_timer_id_set}, + {TSN_TIMER_ID_GET, zxdh_tsn_timer_id_get}, + {TSN_QBV_CONF_SET, zxdh_tsn_qbv_set}, + {TSN_QBV_STATUS_GET, zxdh_tsn_qbv_status_get}, +}; + +int32_t zxdh_en_tsn_func(struct net_device* netdev, struct ifreq* ifr) +{ + int32_t ret = 0; + uint32_t index = 0; + uint32_t table_size = 0; + uint64_t start_time = 0; + uint64_t end_time = 0; + unsigned long flags = 0; + struct zxdh_en_priv* en_priv = NULL; + struct zxdh_en_device* en_dev = NULL; + struct zxdh_pf_device* pf_dev = NULL; + struct zxdh_tsn_private* tsn = NULL; + struct zxdh_tsn_msg* msg = NULL; + + ZXDH_TSN_COMM_CHECK_POINT(netdev); + ZXDH_TSN_COMM_CHECK_POINT(ifr); + + en_priv = netdev_priv(netdev); + ZXDH_TSN_COMM_CHECK_POINT(en_priv); + + en_dev = &en_priv->edev; + ZXDH_TSN_COMM_CHECK_POINT(en_dev); + + pf_dev = dh_core_priv(en_dev->parent->parent); + ZXDH_TSN_COMM_CHECK_POINT(pf_dev); + + tsn = pf_dev->tsn; + ZXDH_TSN_COMM_CHECK_POINT(tsn); + + msg = kzalloc(sizeof(struct zxdh_tsn_msg), GFP_KERNEL); + ZXDH_TSN_COMM_CHECK_POINT(msg); + + ret = unlikely(copy_from_user(msg, ifr->ifr_ifru.ifru_data, sizeof(struct zxdh_tsn_msg))); + ZXDH_TSN_COMM_CHECK_RC_MEMORY_FREE(ret, msg); + + table_size = (uint32_t)(sizeof(tsn_ioctl_table) / sizeof(struct zxdh_tsn_ioctl_table)); + + for(index = 0; index < table_size; index++) + { + if((msg->cmd == tsn_ioctl_table[index].cmd) && (tsn_ioctl_table[index].func != NULL)) + { + spin_lock_irqsave(&tsn->tsn_spin_lock, flags); + + start_time = ktime_get_ns(); + + ret = tsn_ioctl_table[index].func(tsn, msg); + ZXDH_TSN_COMM_CHECK_RC_UNLOCKIRQ_MEMORY_FREE(ret, &tsn->tsn_spin_lock, flags, msg); + + end_time = ktime_get_ns(); + + spin_unlock_irqrestore(&tsn->tsn_spin_lock, flags); + + DH_LOG_INFO(MODULE_TSN, "tsn port id %u cmd %u total take up %lld ns.\n", tsn->tsn_port_id.port_id, + msg->cmd, end_time - start_time); + break; + } + } + + ZXDH_TSN_COMM_CHECK_INDEX_MAX_MEMORY_FREE(index, table_size - 1, msg); + + ret = unlikely(copy_to_user(ifr->ifr_ifru.ifru_data, msg, sizeof(struct zxdh_tsn_msg))); + ZXDH_TSN_COMM_CHECK_RC_MEMORY_FREE(ret, msg); + + kfree(msg); + + return TSN_OK; +} + +EXPORT_SYMBOL_GPL(zxdh_en_tsn_func); diff --git a/src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn_ioctl.h b/src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn_ioctl.h new file mode 100644 index 0000000..e7140be --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn_ioctl.h @@ -0,0 +1,48 @@ +#ifndef __ZXDH_TSN_IOCTL_H__ +#define __ZXDH_TSN_IOCTL_H__ + +#ifdef __cplusplus +extern "C"{ +#endif + +#include +#include + +#define TSN_MSG_LEN (4096 - 8) + +#define TSN_PORT_ID_SET (0) +#define TSN_PORT_ID_GET (1) +#define TSN_TIMER_ID_SET (2) +#define TSN_TIMER_ID_GET (3) +#define TSN_QBV_CONF_SET (4) +#define TSN_QBV_STATUS_GET (5) + +#define TSN_SOFT_RESERVED_TIME (500000) +#define TSN_HW_RESERVED_TIME (200) +#define TSN_TIMER_RESERVED_TIME (300000) +#define TSN_RESERVED_TIME(CT) ((((CT) < TSN_SOFT_RESERVED_TIME)? \ + ((TSN_SOFT_RESERVED_TIME / (CT)) + 1) : 1) * (CT)) +#define TSN_RAM_N_IN_SERVICE(RAM_N_IDLE) ((~(RAM_N_IDLE)) & 1) + +#define TSN_CYCLE_TIME_EXTENSION_MIN (500000) + +struct zxdh_tsn_msg +{ + uint32_t cmd; + uint32_t len; + uint8_t data[TSN_MSG_LEN]; +}; + +struct zxdh_tsn_ioctl_table +{ + int32_t cmd; + int32_t (*func)(struct zxdh_tsn_private* tsn, struct zxdh_tsn_msg* msg); +}; + +enum hrtimer_restart zxdh_tsn_qbv_change_timer_callback(struct hrtimer* t); +int32_t zxdh_en_tsn_func(struct net_device* netdev, struct ifreq* ifr); + +#ifdef __cplusplus +} +#endif +#endif /* __ZXDH_TSN_IOCTL_H__ */ diff --git a/src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn_reg.c b/src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn_reg.c new file mode 100644 index 0000000..fc9ef4d --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn_reg.c @@ -0,0 +1,428 @@ +#include +#include "zxdh_tsn.h" +#include "zxdh_tsn_reg.h" +#include "zxdh_tsn_comm.h" + +int32_t tsn_read(uint64_t base_addr, uint32_t offset, uint32_t* p_val) +{ + if (IS_ERR_OR_NULL((void*)(base_addr))) + { + DH_LOG_ERR(MODULE_TSN, "base_addr 0x%llx invalid.\n", base_addr); + return -EINVAL; + } + + *p_val = readl((const volatile void *)(base_addr + offset)); + + return TSN_OK; +} + +int32_t tsn_write(uint64_t base_addr, uint32_t offset, uint32_t val) +{ + if (IS_ERR_OR_NULL((void*)(base_addr))) + { + DH_LOG_ERR(MODULE_TSN, "base_addr 0x%llx invalid.\n", base_addr); + return -EINVAL; + } + + writel(val, (volatile void *)(base_addr + offset)); + + return TSN_OK; +} + +int32_t tsn_reg_read(struct zxdh_tsn_private* tsn, uint32_t offset, uint32_t* p_val) +{ + int32_t ret = 0; + + ZXDH_TSN_COMM_CHECK_POINT(tsn); + ZXDH_TSN_COMM_CHECK_POINT(p_val); + + ret = tsn_read(tsn->tsn_reg_base_addr, offset, p_val); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_reg_write(struct zxdh_tsn_private* tsn, uint32_t offset, uint32_t val) +{ + int32_t ret = 0; + + ZXDH_TSN_COMM_CHECK_POINT(tsn); + + ret = tsn_write(tsn->tsn_reg_base_addr, offset, val); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_enable_set(struct zxdh_tsn_private* tsn, uint32_t enable) +{ + int32_t ret = 0; + + ret = tsn_reg_write(tsn, TSN_PORT_QBV_ENABLE, enable); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_enable_get(struct zxdh_tsn_private* tsn, uint32_t* p_enable) +{ + int32_t ret = 0; + + ret = tsn_reg_read(tsn, TSN_PORT_QBV_ENABLE, p_enable); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_phy_port_set(struct zxdh_tsn_private* tsn, uint32_t phy_port) +{ + int32_t ret = 0; + + ret = tsn_reg_write(tsn, TSN_PORT_PHY_PORT_SEL, phy_port); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_phy_port_get(struct zxdh_tsn_private* tsn, uint32_t* p_phy_port) +{ + int32_t ret = 0; + + ret = tsn_reg_read(tsn, TSN_PORT_PHY_PORT_SEL, p_phy_port); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_timer_id_set(struct zxdh_tsn_private* tsn, uint32_t timer_id) +{ + int32_t ret = 0; + + ret = tsn_reg_write(tsn, TSN_PORT_TIME_SEL, timer_id); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_timer_id_get(struct zxdh_tsn_private* tsn, uint32_t* p_time_id) +{ + int32_t ret = 0; + + ret = tsn_reg_read(tsn, TSN_PORT_TIME_SEL, p_time_id); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_status_get(struct zxdh_tsn_private* tsn, uint32_t* p_ram_n, uint32_t* p_status) +{ + int32_t ret = 0; + uint32_t val = 0; + + ZXDH_TSN_COMM_CHECK_POINT(p_ram_n); + ZXDH_TSN_COMM_CHECK_POINT(p_status); + + ret = tsn_reg_read(tsn, TSN_PORT_READ_RAM_N, &val); + ZXDH_TSN_COMM_CHECK_RC(ret); + + *p_ram_n = val & 0x3; + *p_status = (val & 0x3C) >> 2; + + return TSN_OK; +} + +int32_t tsn_port_base_time_l_set(struct zxdh_tsn_private* tsn, uint32_t base_time) +{ + int32_t ret = 0; + + ret = tsn_reg_write(tsn, TSN_PORT_BASE_TIME_L, base_time); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_base_time_h_set(struct zxdh_tsn_private* tsn, uint32_t base_time) +{ + int32_t ret = 0; + + ret = tsn_reg_write(tsn, TSN_PORT_BASE_TIME_H, base_time); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_base_time_set(struct zxdh_tsn_private* tsn, uint64_t base_time) +{ + int32_t ret = 0; + uint32_t base_time_l = (uint32_t)((base_time) & 0xffffffff); + uint32_t base_time_h = (uint32_t)((base_time >> 32) & 0xffffffff); + + ret = tsn_port_base_time_l_set(tsn, base_time_l); + ZXDH_TSN_COMM_CHECK_RC(ret); + + ret = tsn_port_base_time_h_set(tsn, base_time_h); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_base_time_get(struct zxdh_tsn_private* tsn, uint64_t* p_base_time) +{ + int32_t ret = 0; + uint32_t base_time_l = 0; + uint32_t base_time_h = 0; + + ZXDH_TSN_COMM_CHECK_POINT(p_base_time); + + ret = tsn_reg_read(tsn, TSN_PORT_BASE_TIME_L, &base_time_l); + ZXDH_TSN_COMM_CHECK_RC(ret); + + ret = tsn_reg_read(tsn, TSN_PORT_BASE_TIME_H, &base_time_h); + ZXDH_TSN_COMM_CHECK_RC(ret); + + *p_base_time = (uint64_t)((((uint64_t)(base_time_h)) << 32) | ((uint64_t)(base_time_l))); + + return TSN_OK; +} + +int32_t tsn_port_cycle_time_l_set(struct zxdh_tsn_private* tsn, uint32_t cycle_time) +{ + int32_t ret = 0; + + ret = tsn_reg_write(tsn, TSN_PORT_CYCLE_TIME_L, cycle_time); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_cycle_time_h_set(struct zxdh_tsn_private* tsn, uint32_t cycle_time) +{ + int32_t ret = 0; + + ret = tsn_reg_write(tsn, TSN_PORT_CYCLE_TIME_H, cycle_time); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_cycle_time_set(struct zxdh_tsn_private* tsn, uint64_t cycle_time) +{ + int32_t ret = 0; + uint32_t cycle_time_l = (uint32_t)((cycle_time) & 0x000fffff); + uint32_t cycle_time_h = (uint32_t)((cycle_time >> 20) & 0x000fffff); + + ret = tsn_port_cycle_time_l_set(tsn, cycle_time_l); + ZXDH_TSN_COMM_CHECK_RC(ret); + + ret = tsn_port_cycle_time_h_set(tsn, cycle_time_h); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_cycle_time_get(struct zxdh_tsn_private* tsn, uint64_t* p_cycle_time) +{ + int32_t ret = 0; + uint32_t cycle_time_l = 0; + uint32_t cycle_time_h = 0; + + ZXDH_TSN_COMM_CHECK_POINT(p_cycle_time); + + ret = tsn_reg_read(tsn, TSN_PORT_CYCLE_TIME_L, &cycle_time_l); + ZXDH_TSN_COMM_CHECK_RC(ret); + + ret = tsn_reg_read(tsn, TSN_PORT_CYCLE_TIME_H, &cycle_time_h); + ZXDH_TSN_COMM_CHECK_RC(ret); + + *p_cycle_time = (uint64_t)((((uint64_t)(cycle_time_h)) << 20) | ((uint64_t)(cycle_time_l))); + + return TSN_OK; +} + +int32_t tsn_port_guard_band_time_set(struct zxdh_tsn_private* tsn, uint32_t cos, uint32_t band_time) +{ + int32_t ret = 0; + + ZXDH_TSN_COMM_CHECK_INDEX_MAX(cos, TSN_PORT_QUEUE_MAX); + + ret = tsn_reg_write(tsn, TSN_PORT_GUARD_BAND_TIME + (cos * 4), band_time); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_guard_band_time_get(struct zxdh_tsn_private* tsn, uint32_t cos, uint32_t* p_band_time) +{ + int32_t ret = 0; + + ZXDH_TSN_COMM_CHECK_INDEX_MAX(cos, TSN_PORT_QUEUE_MAX); + + ret = tsn_reg_read(tsn, TSN_PORT_GUARD_BAND_TIME + (cos * 4), p_band_time); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_default_gate_set(struct zxdh_tsn_private* tsn, uint32_t gate_state) +{ + int32_t ret = 0; + + ret = tsn_reg_write(tsn, TSN_PORT_DEFAULT_GATE_EN, gate_state); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_default_gate_get(struct zxdh_tsn_private* tsn, uint32_t* p_gate_state) +{ + int32_t ret = 0; + + ret = tsn_reg_read(tsn, TSN_PORT_DEFAULT_GATE_EN, p_gate_state); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_change_gate_set(struct zxdh_tsn_private* tsn, uint32_t gate_state) +{ + int32_t ret = 0; + + ret = tsn_reg_write(tsn, TSN_PORT_CHANGE_GATE_EN, gate_state); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_init_finish_set(struct zxdh_tsn_private* tsn, uint32_t init_finish) +{ + int32_t ret = 0; + + ret = tsn_reg_write(tsn, TSN_PORT_INIT_FINISH, init_finish); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_init_finish_get(struct zxdh_tsn_private* tsn, uint32_t* p_init_finish) +{ + int32_t ret = 0; + + ret = tsn_reg_read(tsn, TSN_PORT_INIT_FINISH, p_init_finish); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_change_en_set(struct zxdh_tsn_private* tsn, uint32_t change_en) +{ + int32_t ret = 0; + + ret = tsn_reg_write(tsn, TSN_PORT_CHANGE_EN, change_en); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_change_en_get(struct zxdh_tsn_private* tsn, uint32_t* p_change_en) +{ + int32_t ret = 0; + + ret = tsn_reg_read(tsn, TSN_PORT_CHANGE_EN, p_change_en); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_gcl_num_set(struct zxdh_tsn_private* tsn, uint32_t ram_n, uint32_t gcl_num) +{ + int32_t ret = 0; + uint32_t tsn_port_gcl_num[TSN_PORT_RAM_NUM] = {TSN_PORT_GCL_NUM0, TSN_PORT_GCL_NUM1}; + + ZXDH_TSN_COMM_CHECK_INDEX_MAX(ram_n, TSN_PORT_RAM_MAX); + + ret = tsn_reg_write(tsn, tsn_port_gcl_num[ram_n], gcl_num); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_gcl_num_get(struct zxdh_tsn_private* tsn, uint32_t ram_n, uint32_t* p_gcl_num) +{ + int32_t ret = 0; + uint32_t tsn_port_gcl_num[TSN_PORT_RAM_NUM] = {TSN_PORT_GCL_NUM0, TSN_PORT_GCL_NUM1}; + + ZXDH_TSN_COMM_CHECK_INDEX_MAX(ram_n, TSN_PORT_RAM_MAX); + + ret = tsn_reg_read(tsn, tsn_port_gcl_num[ram_n], p_gcl_num); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_gcl_control_set(struct zxdh_tsn_private* tsn, uint32_t ram_n, uint32_t index, uint32_t gate_state, uint32_t internal) +{ + int32_t ret = 0; + uint32_t tsn_port_gcl_value[TSN_PORT_RAM_NUM] = {TSN_PORT_GCL_VALUE0, TSN_PORT_GCL_VALUE1}; + + ZXDH_TSN_COMM_CHECK_INDEX_MAX(ram_n, TSN_PORT_RAM_MAX); + ZXDH_TSN_COMM_CHECK_INDEX_MAX(index, TSN_PORT_GCL_MAX); + + ret = tsn_reg_write(tsn, tsn_port_gcl_value[ram_n] + (index * 4), (gate_state << 24) | internal); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_disable_set(struct zxdh_tsn_private* tsn) +{ + int32_t ret = 0; + + ret = tsn_port_enable_set(tsn, TSN_PORT_GATE_DISABLE); + ZXDH_TSN_COMM_CHECK_RC(ret); + + ret = tsn_port_init_finish_set(tsn, TSN_PORT_INIT_DISABLE); + ZXDH_TSN_COMM_CHECK_RC(ret); + + ret = tsn_port_change_en_set(tsn, TSN_PORT_CHANGE_DISABLE); + ZXDH_TSN_COMM_CHECK_RC(ret); + + return TSN_OK; +} + +int32_t tsn_port_real_tod_time_get(struct zxdh_tsn_private* tsn, uint64_t* p_tod_time) +{ + int32_t ret = 0; + uint32_t tsn_timer_id = 0; + uint32_t tod_second_h = 0; + uint32_t tod_second_l = 0; + uint32_t tod_nanosecond = 0; + + uint32_t tsn_real_tod_nanosecond_reg_offset[TSN_PORT_TIMER_ID_NUM] = { + TSN0_REAL_TOD_NANOSECOND, TSN1_REAL_TOD_NANOSECOND, TSN2_REAL_TOD_NANOSECOND, TSN3_REAL_TOD_NANOSECOND + }; + uint32_t tsn_real_high_tod_second_reg_offset[TSN_PORT_TIMER_ID_NUM] = { + TSN0_REAL_HIGH_TOD_SECOND, TSN1_REAL_HIGH_TOD_SECOND, TSN2_REAL_HIGH_TOD_SECOND, TSN3_REAL_HIGH_TOD_SECOND + }; + uint32_t tsn_real_lower_tod_second_reg_offset[TSN_PORT_TIMER_ID_NUM] = { + TSN0_REAL_LOWER_TOD_SECOND, TSN1_REAL_LOWER_TOD_SECOND, TSN2_REAL_LOWER_TOD_SECOND, TSN3_REAL_LOWER_TOD_SECOND + }; + + ZXDH_TSN_COMM_CHECK_POINT(p_tod_time); + + ret = tsn_port_timer_id_get(tsn, &tsn_timer_id); + ZXDH_TSN_COMM_CHECK_RC(ret); + ZXDH_TSN_COMM_CHECK_INDEX_MAX(tsn_timer_id, TSN_PORT_TIMER_ID_MAX); + + ret = tsn_read(tsn->pci_ioremap_addr + 0xC000, tsn_real_high_tod_second_reg_offset[tsn_timer_id], &tod_second_h); + ZXDH_TSN_COMM_CHECK_RC(ret); + + ret = tsn_read(tsn->pci_ioremap_addr + 0xC000, tsn_real_lower_tod_second_reg_offset[tsn_timer_id], &tod_second_l); + ZXDH_TSN_COMM_CHECK_RC(ret); + + ret = tsn_read(tsn->pci_ioremap_addr + 0xC000, tsn_real_tod_nanosecond_reg_offset[tsn_timer_id], &tod_nanosecond); + ZXDH_TSN_COMM_CHECK_RC(ret); + + *p_tod_time = ((((uint64_t)tod_second_h << 32) | (uint64_t)tod_second_l) * NSEC_PER_SEC) + tod_nanosecond; + + return TSN_OK; +} diff --git a/src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn_reg.h b/src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn_reg.h new file mode 100644 index 0000000..a884482 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/en_tsn/zxdh_tsn_reg.h @@ -0,0 +1,86 @@ +#ifndef __ZXDH_TSN_REG_H__ +#define __ZXDH_TSN_REG_H__ + +#ifdef __cplusplus +extern "C"{ +#endif + +#include +#include + +#define TSN_PORT_REG_BAR_SIZE (0x4000) +#define TSN_PORT_REG_BAR_OFFSET (0x14000) + +#define TSN_PORT_QBV_ENABLE (0x0004) +#define TSN_PORT_PHY_PORT_SEL (0x0008) +#define TSN_PORT_TIME_SEL (0x000C) +#define TSN_PORT_CLK_FREQ (0x0014) +#define TSN_PORT_READ_RAM_N (0x0018) +#define TSN_PORT_EXE_TIME (0x001C) +#define TSN_PORT_ITR_SHIFT (0x0020) +#define TSN_PORT_BASE_TIME_H (0x0024) +#define TSN_PORT_BASE_TIME_L (0x0028) +#define TSN_PORT_CYCLE_TIME_H (0x0030) +#define TSN_PORT_CYCLE_TIME_L (0x0034) +#define TSN_PORT_GUARD_BAND_TIME (0x0040) +#define TSN_PORT_DEFAULT_GATE_EN (0x0060) +#define TSN_PORT_CHANGE_GATE_EN (0x0064) +#define TSN_PORT_INIT_FINISH (0x0068) +#define TSN_PORT_CHANGE_EN (0x006C) +#define TSN_PORT_GCL_NUM0 (0x0070) +#define TSN_PORT_GCL_NUM1 (0x0074) +#define TSN_PORT_GCL_VALUE0 (0x1000) +#define TSN_PORT_GCL_VALUE1 (0x2000) + +#define TSN0_REAL_TOD_NANOSECOND (0x4240) +#define TSN0_REAL_LOWER_TOD_SECOND (0x4244) +#define TSN0_REAL_HIGH_TOD_SECOND (0x4248) +#define TSN1_REAL_TOD_NANOSECOND (0x424C) +#define TSN1_REAL_LOWER_TOD_SECOND (0x4250) +#define TSN1_REAL_HIGH_TOD_SECOND (0x4254) +#define TSN2_REAL_TOD_NANOSECOND (0x4258) +#define TSN2_REAL_LOWER_TOD_SECOND (0x425C) +#define TSN2_REAL_HIGH_TOD_SECOND (0x4260) +#define TSN3_REAL_TOD_NANOSECOND (0x4264) +#define TSN3_REAL_LOWER_TOD_SECOND (0x4268) +#define TSN3_REAL_HIGH_TOD_SECOND (0x426C) + +int32_t tsn_read(uint64_t base_addr, uint32_t offset, uint32_t* p_val); +int32_t tsn_write(uint64_t base_addr, uint32_t offset, uint32_t val); +int32_t tsn_reg_read(struct zxdh_tsn_private* tsn, uint32_t offset, uint32_t* p_val); +int32_t tsn_reg_write(struct zxdh_tsn_private* tsn, uint32_t offset, uint32_t val); +int32_t tsn_port_enable_set(struct zxdh_tsn_private* tsn, uint32_t enable); +int32_t tsn_port_enable_get(struct zxdh_tsn_private* tsn, uint32_t* p_enable); +int32_t tsn_port_phy_port_set(struct zxdh_tsn_private* tsn, uint32_t phy_port); +int32_t tsn_port_phy_port_get(struct zxdh_tsn_private* tsn, uint32_t* p_phy_port); +int32_t tsn_port_timer_id_set(struct zxdh_tsn_private* tsn, uint32_t timer_id); +int32_t tsn_port_timer_id_get(struct zxdh_tsn_private* tsn, uint32_t* p_time_id); +int32_t tsn_port_status_get(struct zxdh_tsn_private* tsn, uint32_t* p_ram_n, uint32_t* p_status); +int32_t tsn_port_base_time_l_set(struct zxdh_tsn_private* tsn, uint32_t base_time); +int32_t tsn_port_base_time_h_set(struct zxdh_tsn_private* tsn, uint32_t base_time); +int32_t tsn_port_base_time_set(struct zxdh_tsn_private* tsn, uint64_t base_time); +int32_t tsn_port_base_time_get(struct zxdh_tsn_private* tsn, uint64_t* p_base_time); +int32_t tsn_port_cycle_time_l_set(struct zxdh_tsn_private* tsn, uint32_t cycle_time); +int32_t tsn_port_cycle_time_h_set(struct zxdh_tsn_private* tsn, uint32_t cycle_time); +int32_t tsn_port_cycle_time_set(struct zxdh_tsn_private* tsn, uint64_t cycle_time); +int32_t tsn_port_cycle_time_get(struct zxdh_tsn_private* tsn, uint64_t* p_cycle_time); +int32_t tsn_port_guard_band_time_set(struct zxdh_tsn_private* tsn, uint32_t cos, uint32_t band_time); +int32_t tsn_port_guard_band_time_get(struct zxdh_tsn_private* tsn, uint32_t cos, uint32_t* p_band_time); +int32_t tsn_port_default_gate_set(struct zxdh_tsn_private* tsn, uint32_t gate_state); +int32_t tsn_port_default_gate_get(struct zxdh_tsn_private* tsn, uint32_t* p_gate_state); +int32_t tsn_port_change_gate_set(struct zxdh_tsn_private* tsn, uint32_t gate_state); +int32_t tsn_port_init_finish_set(struct zxdh_tsn_private* tsn, uint32_t init_finish); +int32_t tsn_port_init_finish_get(struct zxdh_tsn_private* tsn, uint32_t* p_init_finish); +int32_t tsn_port_change_en_set(struct zxdh_tsn_private* tsn, uint32_t change_en); +int32_t tsn_port_change_en_get(struct zxdh_tsn_private* tsn, uint32_t* p_change_en); +int32_t tsn_port_gcl_num_set(struct zxdh_tsn_private* tsn, uint32_t ram_n, uint32_t gcl_num); +int32_t tsn_port_gcl_num_get(struct zxdh_tsn_private* tsn, uint32_t ram_n, uint32_t* p_gcl_num); +int32_t tsn_port_gcl_control_set(struct zxdh_tsn_private* tsn, uint32_t ram_n, uint32_t index, uint32_t gate_state, uint32_t internal); +int32_t tsn_port_disable_set(struct zxdh_tsn_private* tsn); +int32_t tsn_port_real_tod_time_get(struct zxdh_tsn_private* tsn, uint64_t* p_tod_time); + +#ifdef __cplusplus +} +#endif + +#endif /* __ZXDH_TSN_REG_H__ */ diff --git a/src/net/drivers/net/ethernet/dinghai/en_vf.c b/src/net/drivers/net/ethernet/dinghai/en_vf.c new file mode 100755 index 0000000..e69de29 diff --git a/src/net/drivers/net/ethernet/dinghai/eq.c b/src/net/drivers/net/ethernet/dinghai/eq.c new file mode 100755 index 0000000..be1cbb3 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/eq.c @@ -0,0 +1,108 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +int32_t dh_eq_enable(struct dh_core_dev *dev, struct dh_eq *eq, + struct notifier_block *nb) +{ + return dh_irq_attach_nb(eq->irq, nb); +} + +int32_t setup_async_eq(struct dh_core_dev *dev, struct dh_eq_async *eq, \ + struct dh_eq_param *param, notifier_fn_t dh_eq_async_int, \ + const char *name, void *priv) +{ + struct dh_eq *eq_core = NULL; + int32_t err = 0; + + eq->irq_nb.notifier_call = dh_eq_async_int; + eq->priv = priv; + spin_lock_init(&eq->lock);//unused + + eq_core = &eq->core; + eq_core->irq = param->irq; + + err = dh_eq_enable(dev, &eq->core, &eq->irq_nb); + if (err != 0) + { + LOG_WARN("failed to enable %s EQ %d\n", name, err); + } + + return err; +} + +void dh_eq_disable(struct dh_core_dev *dev, struct dh_eq *eq, + struct notifier_block *nb) +{ + dh_irq_detach_nb(eq->irq, nb); +} +//EXPORT_SYMBOL(dh_eq_disable); + + +void dh_eq_table_cleanup(struct dh_core_dev *dev) +{ + kvfree(dev->eq_table.priv); +} + +int32_t dh_inet6_addr_change_notifier_register(struct notifier_block *inet6_addr_change_notifier) +{ + return register_inet6addr_notifier(inet6_addr_change_notifier); +} + +int32_t dh_inet6_addr_change_notifier_unregister(struct notifier_block *inet6_addr_change_notifier) +{ + return unregister_inet6addr_notifier(inet6_addr_change_notifier); +} + +int32_t dh_eq_notifier_register(struct dh_eq_table *eqt, struct dh_nb *nb) +{ + return atomic_notifier_chain_register(&eqt->nh[nb->event_type], &nb->nb); +} +//EXPORT_SYMBOL(dh_eq_notifier_register); + + +int32_t dh_eq_notifier_unregister(struct dh_eq_table *eqt, struct dh_nb *nb) +{ + return atomic_notifier_chain_unregister(&eqt->nh[nb->event_type], &nb->nb); +} +//EXPORT_SYMBOL(dh_eq_notifier_unregister); + +void dh_eq_table_init(struct dh_core_dev *dev, void *table_priv) +{ + struct dh_eq_table *eq_table = &dev->eq_table; + int32_t i; + + eq_table->priv = table_priv; + + mutex_init(&eq_table->lock); + for (i = 0; i < DH_EVENT_TYPE_MAX; i++) + { + ATOMIC_INIT_NOTIFIER_HEAD(&eq_table->nh[i]); + } + + eq_table->irq_table = &dev->irq_table; +} + + +static uint16_t event_type_map[MSG_MODULE_NUM] = { + [MODULE_VF_BAR_MSG_TO_PF] = DH_EVENT_TYPE_NOTIFY_VF_TO_PF, + [MODULE_RISC_READY] = DH_EVENT_TYPE_RISCV_READY, + [MODULE_PF_BAR_MSG_TO_VF] = DH_EVENT_TYPE_NOTIFY_PF_TO_VF, + [MODULE_VIRTIO] = DH_EVENT_TYPE_NOTIFY_ANY, + [MODULE_DHTOOL] = DH_EVENT_TYPE_NOTIFY_RISCV_TO_AUX, + [MODULE_RESET_MSG] = DH_EVENT_TYPE_NOTIFY_ANY, + [MODULE_DEMO] = DH_EVENT_TYPE_NOTIFY_ANY, +}; + +uint16_t dh_eq_event_type_get(uint16_t event_id) +{ + return event_type_map[event_id]; +} +//EXPORT_SYMBOL(dh_eq_event_type_get); diff --git a/src/net/drivers/net/ethernet/dinghai/events.c b/src/net/drivers/net/ethernet/dinghai/events.c new file mode 100755 index 0000000..a551fd8 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/events.c @@ -0,0 +1,13 @@ +#include + +void zxdh_events_work_enqueue(struct dh_core_dev *dev, struct work_struct *work) +{ + queue_work(dev->events->wq, work); +} + +void zxdh_events_cleanup(struct dh_core_dev *dev) +{ + destroy_workqueue(dev->events->wq); + kfree(dev->events); +} + diff --git a/src/net/drivers/net/ethernet/dinghai/irq_affinity.c b/src/net/drivers/net/ethernet/dinghai/irq_affinity.c new file mode 100755 index 0000000..7b68fcf --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/irq_affinity.c @@ -0,0 +1,278 @@ +#include +#include +#include + + +static void cpu_put(struct dh_irq_pool *pool, int32_t cpu) +{ + pool->irqs_per_cpu[cpu]--; +} + +static void cpu_get(struct dh_irq_pool *pool, int32_t cpu) +{ + pool->irqs_per_cpu[cpu]++; +} + +/* Gets the least loaded CPU. e.g.: the CPU with least IRQs bound to it */ +static int32_t cpu_get_least_loaded(struct dh_irq_pool *pool, + const struct cpumask *req_mask) +{ + int32_t best_cpu = -1; + int32_t cpu; + + for_each_cpu_and(cpu, req_mask, cpu_online_mask) + { + /* CPU has zero IRQs on it. No need to search any more CPUs. */ + if (!pool->irqs_per_cpu[cpu]) + { + best_cpu = cpu; + break; + } + if (best_cpu < 0) + { + best_cpu = cpu; + } + if (pool->irqs_per_cpu[cpu] < pool->irqs_per_cpu[best_cpu]) + { + best_cpu = cpu; + } + } + + if (best_cpu == -1) + { + /* There isn't online CPUs in req_mask */ + LOG_ERR("NO online CPUs in req_mask (%*pbl)\n", cpumask_pr_args(req_mask)); + best_cpu = cpumask_first(cpu_online_mask); + } + pool->irqs_per_cpu[best_cpu]++; + + return best_cpu; +} + +/* Creating an IRQ from irq_pool */ +struct dh_irq *irq_pool_request_irq(struct dh_irq_pool *pool, const struct cpumask *req_mask) +{ + cpumask_var_t auto_mask; + struct dh_irq *irq = NULL; + u32 irq_index = 0; + int32_t err = 0; + + if (!zalloc_cpumask_var(&auto_mask, GFP_KERNEL)) + { + LOG_ERR("zalloc_cpumask_var failed, ERR_PTR(-ENOMEM)=0x%llx", (unsigned long long)ERR_PTR(-ENOMEM)); + return ERR_PTR(-ENOMEM); + } + + err = xa_alloc(&pool->irqs, &irq_index, NULL, pool->xa_num_irqs, GFP_KERNEL); + if (err) + { + if (err == -EBUSY) + { + err = -EUSERS; + } + LOG_ERR("xa_alloc failed, ERR_PTR(err)=0x%llx", (unsigned long long)ERR_PTR(err)); + return ERR_PTR(err); + } + + if (pool->irqs_per_cpu) + { + if (cpumask_weight(req_mask) > 1) + { + /* if req_mask contain more then one CPU, set the least loadad CPU + * of req_mask + */ + cpumask_set_cpu(cpu_get_least_loaded(pool, req_mask), auto_mask); + } + else + { + cpu_get(pool, cpumask_first(req_mask)); + } + } + + irq = dh_irq_alloc(pool, irq_index, cpumask_empty(auto_mask) ? req_mask : auto_mask); + if (IS_ERR_OR_NULL(irq)) + { + LOG_ERR("dh_irq_alloc failed, irq=%p\n", irq); + return irq; + } + free_cpumask_var(auto_mask); + + return irq; +} + +/* Looking for the IRQ with the smallest refcount that fits req_mask. + * If pool is sf_comp_pool, then we are looking for an IRQ with any of the + * requested CPUs in req_mask. + * for example: req_mask = 0xf, irq0_mask = 0x10, irq1_mask = 0x1. irq0_mask + * isn't subset of req_mask, so we will skip it. irq1_mask is subset of req_mask, + * we don't skip it. + * If pool is sf_ctrl_pool, then all IRQs have the same mask, so any IRQ will + * fit. And since mask is subset of itself, we will pass the first if bellow. + */ +static struct dh_irq *irq_pool_find_least_loaded(struct dh_irq_pool *pool, const struct cpumask *req_mask) +{ + int32_t start = pool->xa_num_irqs.min; + int32_t end = pool->xa_num_irqs.max; + struct dh_irq *irq = NULL; + struct dh_irq *iter; + int32_t irq_refcount = 0; + unsigned long index; + + lockdep_assert_held(&pool->lock); + xa_for_each_range(&pool->irqs, index, iter, start, end) + { + struct cpumask *iter_mask = dh_irq_get_affinity_mask(iter); + int32_t iter_refcount = dh_irq_read_locked(iter); + + if (!cpumask_subset(iter_mask, req_mask)) + { + /* skip IRQs with a mask which is not subset of req_mask */ + continue; + } + if (iter_refcount < pool->min_threshold) + { + /* If we found an IRQ with less than min_thres, return it */ + return iter; + } + if (!irq || iter_refcount < irq_refcount) + { + /* In case we won't find an IRQ with less than min_thres, + * keep a pointer to the least used IRQ + */ + irq_refcount = iter_refcount; + irq = iter; + } + } + + return irq; +} + +/** + * dh_irq_affinity_request - request an IRQ according to the given mask. + * @pool: IRQ pool to request from. + * @req_mask: cpumask requested for this IRQ. + * + * This function returns a pointer to IRQ, or ERR_PTR in case of error. + */ +struct dh_irq *dh_irq_affinity_request(struct dh_irq_pool *pool, const struct cpumask *req_mask) +{ + struct dh_irq *least_loaded_irq = NULL; + struct dh_irq *new_irq = NULL; + + mutex_lock(&pool->lock); + + least_loaded_irq = irq_pool_find_least_loaded(pool, req_mask); + if (least_loaded_irq && dh_irq_read_locked(least_loaded_irq) < pool->min_threshold) + { + LOG_ERR("least_loaded_irq error: pool->min_threshold=%d\r\n", pool->min_threshold); + goto out; + } + + /* We didn't find an IRQ with less than min_thres, try to allocate a new IRQ */ + new_irq = irq_pool_request_irq(pool, req_mask); + if (IS_ERR_OR_NULL(new_irq)) + { + if (!least_loaded_irq) + { + /* We failed to create an IRQ and we didn't find an IRQ */ + LOG_ERR("Didn't find a matching IRQ. err = %ld\n", PTR_ERR(new_irq)); + mutex_unlock(&pool->lock); + return new_irq; + } + /* We failed to create a new IRQ for the requested affinity, + * sharing existing IRQ. + */ + LOG_ERR("new_irq error\r\n"); + goto out; + } + + least_loaded_irq = new_irq; + goto unlock; + +out: + dh_irq_get_locked(least_loaded_irq); + if (dh_irq_read_locked(least_loaded_irq) > pool->max_threshold) + LOG_DEBUG("IRQ %u overloaded, pool_name: %s, %u EQs on this irq\n", + pci_irq_vector(pool->dev->pdev, dh_irq_get_index(least_loaded_irq)), + pool->name, dh_irq_read_locked(least_loaded_irq) / DH_EQ_REFS_PER_IRQ); +unlock: + mutex_unlock(&pool->lock); + return least_loaded_irq; +} + +void dh_irq_affinity_irqs_release(struct dh_irq_pool *pool, struct dh_irq **irqs, int32_t num_irqs) +{ + int32_t i; + + for (i = 0; i < num_irqs; i++) + { + int32_t cpu = cpumask_first(dh_irq_get_affinity_mask(irqs[i])); + + synchronize_irq(pci_irq_vector(pool->dev->pdev, dh_irq_get_index(irqs[i]))); + + if (pool->irqs_per_cpu) + { + cpu_put(pool, cpu); + } + } +} + +/** + * dh_irq_affinity_irqs_request_auto - request one or more IRQs for zxdh device. + * @pool: requesting the IRQs from the irqs pool. + * @num_irqs: number of IRQs to request. + * @irqs: an output array of IRQs pointers. + * + * Each IRQ is bounded to at most 1 CPU. + * This function is requesting IRQs according to the default assignment. + * The default assignment policy is: + * - in each iteration, request the least loaded IRQ which is not bound to any + * CPU of the previous IRQs requested. + * + * This function returns the number of IRQs requested, (which might be smaller than + * @nirqs), if successful, or a negative error code in case of an error. + */ +int32_t dh_irq_affinity_irqs_request_auto(struct dh_irq_pool *pool, struct dh_irq **irqs, int32_t num_irqs) +{ + cpumask_var_t req_mask; + struct dh_irq *irq = NULL; + int32_t i = 0; + + if (!zalloc_cpumask_var(&req_mask, GFP_KERNEL)) + { + LOG_ERR("zalloc_cpumask_var failed\n"); + return -ENOMEM; + } + + cpumask_copy(req_mask, cpu_online_mask); + for (i = 0; i < num_irqs; i++) + { + irq = irq_pool_request_irq(pool, req_mask); + if (IS_ERR_OR_NULL(irq)) + { + LOG_INFO("irq_pool_request_irq %d failed, req_mask=%p, irq=%p, break\n", i, req_mask, irq); + break; + } + + irqs[i] = irq; + if (i < (num_online_cpus() - 1)) + { + cpumask_clear_cpu(cpumask_first(dh_irq_get_affinity_mask(irq)), req_mask); + } + LOG_DEBUG("IRQ %u mapped to cpu %*pbl, %u EQs on this irq\n", + pci_irq_vector(pool->dev->pdev, dh_irq_get_index(irq)), + cpumask_pr_args(dh_irq_get_affinity_mask(irq)), + dh_irq_read_locked(irq) / DH_EQ_REFS_PER_IRQ); + } + + free_cpumask_var(req_mask); + if (i != num_irqs) + { + LOG_ERR("Failed to request %d irq_num, %d irq_num requested\n", num_irqs, i); + dh_irq_affinity_irqs_release(pool, irqs, i); + dh_irqs_release_vectors(irqs, i); + return PTR_ERR(irq); + } + + return i; +} \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/lag/lag.c b/src/net/drivers/net/ethernet/dinghai/lag/lag.c new file mode 100644 index 0000000..f1429fc --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/lag/lag.c @@ -0,0 +1,867 @@ +#include +#include +#include +#include +#include + +#include "lag.h" +#include "en_pf.h" +#include "dpp_tbl_api.h" + + +static DEFINE_SPINLOCK(lag_lock); +static DEFINE_MUTEX(zxdh_intf_mutex); + +void zxdh_dev_list_lock(void) +{ + mutex_lock(&zxdh_intf_mutex); +} + +void zxdh_dev_list_unlock(void) +{ + mutex_unlock(&zxdh_intf_mutex); +} + +int zxdh_dev_list_trylock(void) +{ + return mutex_trylock(&zxdh_intf_mutex); +} + +struct zxdh_lag *lag_get_ldev(struct dh_core_dev *dh_dev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + return pf_dev->ldev; +} + +void lag_set_ldev(struct dh_core_dev *dh_dev, struct zxdh_lag *ldev) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + pf_dev->ldev = ldev; +} + +void ldev_kref_free(struct kref *ref) +{ + struct zxdh_lag *ldev = container_of(ref, struct zxdh_lag, ref); + + if (ldev->nb.notifier_call) + { + unregister_netdevice_notifier_net(&init_net, &ldev->nb); + } + + cancel_delayed_work_sync(&ldev->bond_work); + destroy_workqueue(ldev->wq); + + lag_set_ldev(ldev->parent, NULL); + kfree(ldev); + + LAG_LOG_INFO("pf lag device alloced memory free \n"); +} + +static void zxdh_queue_bond_work(struct zxdh_lag *ldev, unsigned long delay) +{ + queue_delayed_work(ldev->wq, &ldev->bond_work, delay); +} + +void lag_dev_release(struct dh_core_dev *dh_dev, struct zxdh_lag *ldev) +{ + int i; + struct dh_core_dev *parent; + + for (i = 0; i < ZXDH_MAX_PORTS; i++) + { + if (!ldev->lagfunc[i].dev) + { + continue; + } + + parent = ldev->lagfunc[i].dev->parent; + if (parent == dh_dev) + { + ldev->lagfunc[i].dev = NULL; + } + } +} + +/** + * lag_get_netdev_idx - get the index of netdev generated by en_aux + * @ldev: zxdh lag dev + * @ndev: netdev to search for + **/ +int32_t lag_get_netdev_idx(struct zxdh_lag *ldev, struct net_device *ndev) +{ + int i; + + for (i = 0; i < ZXDH_MAX_PORTS; i++) + { + if (ldev->lagfunc[i].netdev == ndev) + { + return i; + } + } + + return -ENOENT; +} + +void ldev_remove_netdev(struct dh_core_dev *dh_dev, struct net_device *netdev) +{ + int32_t index = 0; + struct zxdh_lag *ldev; + + ldev = lag_get_ldev(dh_dev->parent); + if (!ldev) + { + return; + } + + spin_lock(&lag_lock); + + index = lag_get_netdev_idx(ldev, netdev); + if (index < 0) + { + goto out; + } + + ldev->lagfunc[index].netdev = NULL; +out: + spin_unlock(&lag_lock); +} + +/** + * ldev_add_netdev - add net_device to lag dev + * @dev: zxdh core device + * @id: the index that joined to ldev + * @netdev: netdev to adding for + * @attr: some configs info from aux + **/ +static void ldev_add_netdev(struct dh_core_dev *dh_dev, + uint16_t id, struct net_device *netdev, struct zxdh_lag_attrs *attr) +{ + struct zxdh_lag *ldev; + + if (id >= ZXDH_MAX_PORTS) + { + LAG_LOG_ERR("%s: index[%hu] out of range. \n", netdev_name(netdev), id); + return; + } + + ldev = lag_get_ldev(dh_dev->parent); + + spin_lock(&lag_lock); + ldev->lagfunc[id].dev = dh_dev; + ldev->lagfunc[id].netdev = netdev; + ldev->lagfunc[id].attrs = *attr; + ldev->lagfunc[id].valid = true; + ldev->tracker.netdev_state[id].link_up = 0; + ldev->tracker.netdev_state[id].tx_enabled = 0; + ldev->lag_func_index++; + spin_unlock(&lag_lock); + + zxdh_queue_bond_work(ldev, 0); +} + +static bool zxdh_netdev_belongs(struct zxdh_lag *ldev, struct net_device *netdev) +{ + int32_t idx = 0; + + idx = lag_get_netdev_idx(ldev, netdev); + if (idx < 0) + { + return false; + } + + return true; +} + +/** + * handle_changeupper_event - handle change upper device event + * @ldev: zxdh lag dev + * @tracker: the tracker of zxdh lag dev + * @ndev: upper netdev + * @info: upper dev attribute passed from bonding + **/ +static int handle_changeupper_event(struct zxdh_lag *ldev, + struct lag_tracker *tracker, + struct net_device *ndev, + struct netdev_notifier_changeupper_info *info) +{ + struct net_device *upper = info->upper_dev, *ndev_tmp, *slave_dev; + struct netdev_lag_upper_info *lag_upper_info = NULL; + bool is_bonded = false; + bool mode_supported = false; + int changed = 0; + int bond_status = 0; + int num_slaves = 0; + int idx = 0; + + if (!netif_is_lag_master(upper)) + { + LAG_LOG_INFO("changeupper received, but not master. \n"); + return 0; + } + + if (strcmp("bondxi5", upper->name)) + { + slave_dev = netdev_notifier_info_to_dev((void *)info); + if (!zxdh_netdev_belongs(ldev, slave_dev)) + { + LAG_LOG_INFO("%s is not dinghai bond, ignore. \n", upper->name); + return 0; + } + } + + if (info->linking) + { + lag_upper_info = info->upper_info; + } + + rcu_read_lock(); + for_each_netdev_in_bond_rcu(upper, ndev_tmp) + { + idx = lag_get_netdev_idx(ldev, ndev_tmp); + if (idx >= 0) + { + bond_status |= (1 << idx); + } + + num_slaves++; + } + rcu_read_unlock(); + + ldev->slaves = bond_status; + + /* None of this lagdev's netdevs are slaves of this master. */ + if (!bond_status) + { + is_bonded = false; + goto out; + } + + if (lag_upper_info) + { + tracker->tx_type = lag_upper_info->tx_type; + tracker->hash_type = lag_upper_info->hash_type; + } + + LAG_LOG_INFO("lag tx type: %d [%d-active-backup %d-lacp], hash type %d. \n", + tracker->tx_type, NETDEV_LAG_TX_TYPE_ACTIVEBACKUP, NETDEV_LAG_TX_TYPE_HASH, tracker->hash_type); + + /* Lag mode must be activebackup or hash. */ + mode_supported = (tracker->tx_type == NETDEV_LAG_TX_TYPE_ACTIVEBACKUP) || + (tracker->tx_type == NETDEV_LAG_TX_TYPE_HASH); + + /* if slaves exist */ + is_bonded = !!bond_status && mode_supported; + +out: + if ((tracker->is_bonded != is_bonded)) + { + tracker->is_bonded = is_bonded; + changed = 1; + } + + LAG_LOG_INFO("master: %s slaves num: %d, mask: 0x%x, changed: %d, mode supported: %s\n", + upper->name, num_slaves, bond_status, changed, mode_supported ? "true" : "false"); + + return changed; +} + +/** + * handle_changelowerstate_event - handle changed lower device state event + * @ldev: zxdh lag dev + * @tracker: the tracker of zxdh lag dev + * @ndev: lower netdev + * @info: lower dev attribute passed from bonding + **/ +static int handle_changelowerstate_event(struct zxdh_lag *ldev, + struct lag_tracker *tracker, + struct net_device *ndev, + struct netdev_notifier_changelowerstate_info *info) +{ + struct netdev_lag_lower_state_info *lag_lower_info; + int idx; + + if (!netif_is_lag_port(ndev)) + { + return 0; + } + + idx = lag_get_netdev_idx(ldev, ndev); + if (idx < 0) + { + return 0; + } + + lag_lower_info = info->lower_state_info; + if (!lag_lower_info) + { + return 0; + } + + /* update netdev state from bonding */ + tracker->netdev_state[idx] = *lag_lower_info; + + LAG_LOG_INFO("%s: link up %u tx enable %u \n", ndev->name, + (uint32_t)lag_lower_info->link_up, (uint32_t)lag_lower_info->tx_enabled); + + return 1; +} + +bool lag_check_aux_netdev_ready(struct zxdh_lag *ldev) +{ + int ix = 0; + int lag_netdev_cnt = 0; + int lag_pannel_num = zxdh_pf_get_pannel_port_num(ldev->parent); + + for (ix = 0; ix < ZXDH_MAX_PORTS; ix++) + { + if (ldev->lagfunc[ix].netdev) + { + lag_netdev_cnt++; + } + } + + return (lag_pannel_num == lag_netdev_cnt) ? true : false; +} + +static int lag_netdev_event(struct notifier_block *this, unsigned long event, void *ptr) +{ + struct net_device *ndev = netdev_notifier_info_to_dev(ptr); + struct lag_tracker tracker; + struct zxdh_lag *ldev; + int changed = 0; + + if ((event != NETDEV_CHANGEUPPER) && (event != NETDEV_CHANGELOWERSTATE)) + { + return NOTIFY_DONE; + } + + ldev = container_of(this, struct zxdh_lag, nb); + if (!lag_check_aux_netdev_ready(ldev)) + { + return NOTIFY_DONE; + } + + LAG_LOG_INFO("received %s\n", netdev_cmd_to_name(event)); + + tracker = ldev->tracker; + + switch (event) + { + case NETDEV_CHANGEUPPER: + { + changed = handle_changeupper_event(ldev, &tracker, ndev, ptr); + break; + } + case NETDEV_CHANGELOWERSTATE: + { + changed = handle_changelowerstate_event(ldev, &tracker, ndev, ptr); + break; + } + } + + ldev->tracker = tracker; + + if (changed) + { + zxdh_queue_bond_work(ldev, 0); + } + + return NOTIFY_DONE; +} + +static int32_t lag_find_first_netdev_pf_info(struct zxdh_lag *ldev, DPP_PF_INFO_T *pf_info) +{ + int i; + struct lag_func *func; + + for (i = 0; i < ZXDH_MAX_PORTS; i++) + { + func = &ldev->lagfunc[i]; + + if (func->netdev) + { + pf_info->vport = func->attrs.vport; + pf_info->slot = func->attrs.slot_id; + return 0; + } + } + + return -EOPNOTSUPP; +} + +static int32_t zxdh_disable_lag(struct zxdh_lag *ldev) +{ + int i; + uint8_t phy_port = 0; + struct lag_func *func; + DPP_PF_INFO_T pf_info = {0}; + + for (i = 0; i < ZXDH_MAX_PORTS; i++) + { + func = &ldev->lagfunc[i]; + + if (!func->netdev) + { + continue; + } + + pf_info.slot = func->attrs.slot_id; + pf_info.vport = func->attrs.vport; + phy_port = func->attrs.phy_port; + + dpp_lag_group_member_del(&pf_info, ZXDH_LGA_ID, phy_port); + dpp_panel_attr_set(&pf_info, phy_port, PANEL_FLAG_BOND_LINK_UP, LAG_FLAGS_DISABLE); + } + + ldev->flags &= ~ZXDH_LAG_MODE_FLAGS; + LAG_LOG_INFO("zxdh lag disabled. vport 0x%hx lag id %d.\n", pf_info.vport, ZXDH_LGA_ID); + + return 0; +} + +static int32_t zxdh_lag_active_backup(struct zxdh_lag *ldev) +{ + int i; + bool porten = false; + uint8_t phy_port = ZXDH_ACTIVE_PHY_PORT_NA; + uint8_t active_phy_port = ZXDH_ACTIVE_PHY_PORT_NA; + int32_t err = 0; + struct lag_func *func; + struct lag_tracker *tracker = &ldev->tracker; + DPP_PF_INFO_T pf_info = {0}; + + err = lag_find_first_netdev_pf_info(ldev, &pf_info); + if (err != 0) + { + LAG_LOG_ERR("vport %d is incorrect\n", pf_info.vport); + return -EOPNOTSUPP; + } + + dpp_lag_mode_set(&pf_info, ZXDH_LGA_ID, LAG_MODE_ACTIVE_BACKUP); + + for (i = ZXDH_MAX_PORTS - 1; i >= 0; i--) + { + func = &ldev->lagfunc[i]; + + if (!func->netdev) + { + continue; + } + + phy_port = func->attrs.phy_port; + pf_info.slot = func->attrs.slot_id; + pf_info.vport = func->attrs.vport; + + dpp_lag_group_member_del(&pf_info, ZXDH_LGA_ID, phy_port); + dpp_panel_attr_set(&pf_info, phy_port, PANEL_FLAG_BOND_LINK_UP, LAG_FLAGS_DISABLE); + + porten = tracker->netdev_state[i].tx_enabled && tracker->netdev_state[i].link_up; + if (porten && (ldev->slaves & (1 << i))) + { + active_phy_port = phy_port; + LAG_LOG_INFO("[backup]: select acitve phyport %hu pannel port %hu \n", + active_phy_port, func->attrs.pannel_id); + } + + LAG_LOG_INFO("[backup]: phyport %hhu pannel port %hhu tx enable %d link up %d\n", + phy_port, func->attrs.pannel_id, + (int32_t)tracker->netdev_state[i].tx_enabled, + (int32_t)tracker->netdev_state[i].link_up); + } + + if (active_phy_port != ZXDH_ACTIVE_PHY_PORT_NA) + { + dpp_lag_group_member_add(&pf_info, ZXDH_LGA_ID, active_phy_port); + dpp_panel_attr_set(&pf_info, active_phy_port, PANEL_FLAG_BOND_LINK_UP, LAG_FLAGS_ENABLE); + } + + ldev->flags |= ZXDH_LAG_FLAG_BACKUP; + + return 0; +} + +uint32_t zxdh_covert_hash_type_2_np(uint32_t hash_type) +{ + uint32_t np_hash_type = 0; + + switch (hash_type) + { + case NETDEV_LAG_HASH_L2: + { + np_hash_type = ZXDH_NP_HASH_TYPE_L2; + break; + } + case NETDEV_LAG_HASH_L23: + { + np_hash_type = ZXDH_NP_HASH_TYPE_L23; + break; + } + case NETDEV_LAG_HASH_L34: + { + np_hash_type = ZXDH_NP_HASH_TYPE_L34; + break; + } + default: + { + np_hash_type = ZXDH_NP_HASH_TYPE_DEFAULT; + break; + } + } + + return np_hash_type; +} + +static int32_t zxdh_lag_lacp(struct zxdh_lag *ldev) +{ + int i; + bool porten = false; + uint8_t phy_port = 0; + uint8_t flags = 0; + uint32_t np_hash_type = 0; + int32_t err = 0; + struct lag_func *func; + struct lag_tracker *tracker = &ldev->tracker; + DPP_PF_INFO_T pf_info = {0}; + + err = lag_find_first_netdev_pf_info(ldev, &pf_info); + if (err != 0) + { + LAG_LOG_ERR("vport %d is incorrect\n", pf_info.vport); + return -EOPNOTSUPP; + } + +#if 0 + np_hash_type = zxdh_covert_hash_type_2_np((uint32_t)tracker->hash_type); +#else + /* 顾剑总要求,HASH模式直接写死Layer3+4 */ + np_hash_type = ZXDH_NP_HASH_TYPE_L34; +#endif + + dpp_lag_group_hash_factor_set(&pf_info, ZXDH_LGA_ID, (uint8_t)np_hash_type); + dpp_lag_mode_set(&pf_info, ZXDH_LGA_ID, LAG_MODE_802_3AD); + + for (i = 0; i < ZXDH_MAX_PORTS; i++) + { + func = &ldev->lagfunc[i]; + + if (!func->netdev) + { + continue; + } + + phy_port = func->attrs.phy_port; + pf_info.slot = func->attrs.slot_id; + pf_info.vport = func->attrs.vport; + + porten = tracker->netdev_state[i].tx_enabled && tracker->netdev_state[i].link_up; + if (porten && (ldev->slaves & (1 << i))) + { + dpp_lag_group_member_add(&pf_info, ZXDH_LGA_ID, phy_port); + dpp_panel_attr_set(&pf_info, phy_port, PANEL_FLAG_BOND_LINK_UP, LAG_FLAGS_ENABLE); + flags = LAG_FLAGS_ENABLE; + } + else + { + dpp_lag_group_member_del(&pf_info, ZXDH_LGA_ID, phy_port); + dpp_panel_attr_set(&pf_info, phy_port, PANEL_FLAG_BOND_LINK_UP, LAG_FLAGS_DISABLE); + flags = LAG_FLAGS_DISABLE; + } + + LAG_LOG_INFO("[lacp] %s, vport %hu, pannel port %hu, phy port %hu, slave mask 0x%x, tx enable %d, link up %d \n", + (flags == LAG_FLAGS_ENABLE) ? "enable" : "disable", pf_info.vport, + func->attrs.pannel_id, phy_port, ldev->slaves, + (int32_t)tracker->netdev_state[i].tx_enabled, + (int32_t)tracker->netdev_state[i].link_up); + } + + ldev->flags |= ZXDH_LAG_FLAG_HASH; + + return 0; +} + +static void zxdh_lagtracker_info(struct lag_tracker *tracker) +{ + const char *bond_tx_mode, *bonded, *hash_type; + + bonded = tracker->is_bonded ? "BONDED" : "UNBONDED"; + + switch (tracker->tx_type) + { + case NETDEV_LAG_TX_TYPE_HASH: + { + bond_tx_mode = "LACP"; + break; + } + case NETDEV_LAG_TX_TYPE_ACTIVEBACKUP: + { + bond_tx_mode = "ACTIVE-BACKUP"; + break; + } + default: + { + bond_tx_mode = "UNKOWN"; + } + } + + switch (tracker->hash_type) + { + case ZXDH_NP_HASH_TYPE_L2: + { + hash_type = "layer2"; + break; + } + case ZXDH_NP_HASH_TYPE_L23: + { + hash_type = "layer2+3"; + break; + } + case ZXDH_NP_HASH_TYPE_L34: + { + hash_type = "layer2+3"; + break; + } + default: + { + hash_type = "layer2"; + } + } + + LAG_LOG_INFO("%s: tx type: %s, hash type %s.\n", bonded, bond_tx_mode, hash_type); +} + +static void do_bond(struct zxdh_lag *ldev) +{ + bool do_bond; + struct lag_tracker *tracker = &ldev->tracker; + + zxdh_lagtracker_info(tracker); + + do_bond = tracker->is_bonded; + + if (do_bond && lag_is_backup(ldev)) + { + zxdh_lag_active_backup(ldev); + } + else if (do_bond && lag_is_hash(ldev)) + { + zxdh_lag_lacp(ldev); + } + else + { + zxdh_disable_lag(ldev); + } +} + +static void zxdh_do_bond_work(struct work_struct *work) +{ + struct delayed_work *delayed_work = to_delayed_work(work); + struct zxdh_lag *ldev = container_of(delayed_work, struct zxdh_lag, bond_work); + int status; + + status = zxdh_dev_list_trylock(); + if (!status) + { + zxdh_queue_bond_work(ldev, HZ); + return; + } + + do_bond(ldev); + zxdh_dev_list_unlock(); +} + +static struct zxdh_lag *lag_dev_alloc(struct dh_core_dev *dev) +{ + struct zxdh_lag *ldev; + + ldev = kzalloc(sizeof(*ldev), GFP_KERNEL); + if (!ldev) + { + return NULL; + } + + ldev->wq = create_singlethread_workqueue("zxdh_lag"); + if (!ldev->wq) + { + kfree(ldev); + return NULL; + } + + kref_init(&ldev->ref); + INIT_DELAYED_WORK(&ldev->bond_work, zxdh_do_bond_work); + + ldev->nb.notifier_call = lag_netdev_event; + if (register_netdevice_notifier_net(&init_net, &ldev->nb)) + { + ldev->nb.notifier_call = NULL; + LAG_LOG_ERR("Failed to register LAG netdev notifier\n"); + } + + ldev->parent = dev; + + return ldev; +} + +static int lag_dev_create(struct dh_core_dev *dh_dev) +{ + struct zxdh_lag *ldev = NULL; + static bool init_once = false; + + ldev = lag_get_ldev(dh_dev); + if (!ldev) + { + ldev = lag_dev_alloc(dh_dev); + if (!ldev) + { + LAG_LOG_ERR("Failed to alloc lag dev.\n"); + return 0; + } + } + + if (init_once) + { + get_ldev_kref(ldev); + } + init_once = true; + + lag_set_ldev(dh_dev, ldev); + + return 0; +} + +int32_t lag_dpp_pannel_init(struct zxdh_lag_attrs *attr) +{ + uint16_t pannel_id = attr->pannel_id; + uint16_t pf_id = (attr->pcie_id >> 8) & PCIE_ID_PF_INDEX_MASK; + uint16_t ep_id = (attr->pcie_id >> 12) & PCIE_ID_EP_INDEX_MASK; + uint16_t bond_vfid = ZXDH_PF_VFID(ep_id, pf_id); + uint16_t ovs_vfid = ZXDH_PF_VFID(ep_id, (pf_id + 1)); + uint8_t phy_port = attr->phy_port; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = attr->slot_id; + pf_info.vport = attr->vport; + dpp_panel_bond_vport(&pf_info, phy_port); + dpp_panel_bond_pf_vqm_vfid_set(&pf_info, phy_port, bond_vfid); + dpp_panel_bond_pf_memport_qid_set(&pf_info, phy_port, attr->qid[0]); + dpp_panel_ovs_pf_vqm_vfid_set(&pf_info, phy_port, ovs_vfid); + + dpp_panel_hardware_bond_set(&pf_info, phy_port, LAG_FLAGS_ENABLE); + dpp_egr_port_attr_set(&pf_info, EGR_FLAG_HW_BOND_EN_OFF, LAG_FLAGS_ENABLE); + + dpp_lag_group_create(&pf_info, ZXDH_LGA_ID); + + LAG_LOG_INFO("vport 0x%hx, pannel id %hu, phy port %hu, rx qid %hu tx qid %hu bond vfid %d, ovs vfid %d \n", + pf_info.vport, pannel_id, phy_port, attr->qid[0], attr->qid[1], bond_vfid, ovs_vfid); + + return 0; +} + +int32_t lag_dpp_pannel_release(struct zxdh_lag_attrs *attr) +{ + uint8_t phy_port = attr->phy_port; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = attr->slot_id; + pf_info.vport = attr->vport; + dpp_panel_hardware_bond_set(&pf_info, phy_port, LAG_FLAGS_DISABLE); + dpp_egr_port_attr_set(&pf_info, EGR_FLAG_HW_BOND_EN_OFF, LAG_FLAGS_DISABLE); + + return 0; +} + +int32_t lag_netdev_input_check(struct dh_core_dev *dh_dev, struct zxdh_lag_attrs *attr) +{ + struct zxdh_lag *ldev; + + if (!dh_core_is_pf(dh_dev->parent)) + { + LAG_LOG_ERR("dh_core_dev type PF needs to be used\n"); + return -EINVAL; + } + + ldev = lag_get_ldev(dh_dev->parent); + if (!ldev) + { + LAG_LOG_ERR("ldev can not be null\n"); + return -EINVAL; + } + + if (attr->pannel_id >= ZXDH_MAX_PORTS) + { + LAG_LOG_ERR("pannel id %hu out of range.\n", attr->pannel_id); + return -EINVAL; + } + + return 0; +} + +/** + * zxdh_regitster_ldev - create lagdev and add to dh core dev + * @dh_dev: zxdh lag dev + * the function called by pf driver + **/ +void zxdh_regitster_ldev(struct dh_core_dev *dh_dev) +{ + zxdh_dev_list_lock(); + lag_dev_create(dh_dev); + zxdh_dev_list_unlock(); +} + +void zxdh_unregitster_ldev(struct dh_core_dev *dh_dev) +{ + struct zxdh_lag *ldev; + + zxdh_dev_list_lock(); + ldev = lag_get_ldev(dh_dev); + if (!ldev) + { + zxdh_dev_list_unlock(); + return; + } + + lag_dev_release(dh_dev, ldev); + put_ldev_kref(ldev); + + zxdh_dev_list_unlock(); +} + +/** + * zxdh_ldev_add_netdev - add net device to lag device + * @dh_dev: sf core dev + * @ida: netdev idx + * @netdev: the net device which en aux created + * @attr: netdev info + * this function may called by en aux + **/ +int32_t zxdh_ldev_add_netdev(struct dh_core_dev *dh_dev, uint16_t ida, + struct net_device *netdev, struct zxdh_lag_attrs *attr) +{ + int32_t ret = 0; + + zxdh_dev_list_lock(); + ret = lag_netdev_input_check(dh_dev, attr); + if (ret != 0) + { + zxdh_dev_list_unlock(); + return -EINVAL; + } + + lag_dpp_pannel_init(attr); + ldev_add_netdev(dh_dev, ida, netdev, attr); + zxdh_dev_list_unlock(); + + return 0; +} +EXPORT_SYMBOL(zxdh_ldev_add_netdev); + +void zxdh_ldev_remove_netdev(struct dh_core_dev *dh_dev, struct net_device *netdev, struct zxdh_lag_attrs *attr) +{ + zxdh_dev_list_lock(); + + lag_dpp_pannel_release(attr); + ldev_remove_netdev(dh_dev, netdev); + zxdh_dev_list_unlock(); +} +EXPORT_SYMBOL(zxdh_ldev_remove_netdev); \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/lag/lag.h b/src/net/drivers/net/ethernet/dinghai/lag/lag.h new file mode 100644 index 0000000..df5db5b --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/lag/lag.h @@ -0,0 +1,120 @@ +#ifndef _ZXDH_ETH_LAG_H_ +#define _ZXDH_ETH_LAG_H_ + +#include +#include +#include +#include +#include + +#define LAG_LOG_ERR(fmt, arg...) DH_LOG_ERR(MODULE_LAG, fmt, ##arg); +#define LAG_LOG_INFO(fmt, arg...) DH_LOG_INFO(MODULE_LAG, fmt, ##arg); +#define LAG_LOG_DEBUG(fmt, arg...) DH_LOG_DEBUG(MODULE_LAG, fmt, ##arg); +#define LAG_LOG_WARN(fmt, arg...) DH_LOG_WARNING(MODULE_LAG, fmt, ##arg); + +/* max panel port */ +#define ZXDH_MAX_PORTS (6) + +#define ZXDH_LGA_ID (0) +#define ZXDH_ACTIVE_PHY_PORT_NA (0xFF) + +#define PCIE_ID_PF_INDEX_MASK (0x7) +#define PCIE_ID_EP_INDEX_MASK (0x7) + +enum +{ + ZXDH_LAG_FLAG_BACKUP = 1 << 0, + ZXDH_LAG_FLAG_HASH = 1 << 1, + ZXDH_LAG_FLAG_READY = 1 << 2, +}; + +#define ZXDH_LAG_MODE_FLAGS (ZXDH_LAG_FLAG_BACKUP | ZXDH_LAG_FLAG_HASH) + +enum +{ + LAG_FLAGS_DISABLE = 0, + LAG_FLAGS_ENABLE = 1, +}; + +enum +{ + LAG_MODE_ACTIVE_BACKUP = 1, + LAG_MODE_802_3AD = 2, +}; + +/* define hash type for NP SDK */ +enum +{ + ZXDH_NP_HASH_TYPE_DEFAULT = 0, + ZXDH_NP_HASH_TYPE_L2 = 1, + ZXDH_NP_HASH_TYPE_L23 = 2, + ZXDH_NP_HASH_TYPE_L34 = 4, +}; + +struct lag_func +{ + bool valid; + struct dh_core_dev *dev; + struct net_device *netdev; + struct zxdh_lag_attrs attrs; +}; + +struct lag_tracker +{ + enum netdev_lag_tx_type tx_type; + struct netdev_lag_lower_state_info netdev_state[ZXDH_MAX_PORTS]; + bool is_bonded; + enum netdev_lag_hash hash_type; + char master_name[IFNAMSIZ]; +}; + +struct zxdh_lag +{ + uint32_t flags; + uint32_t lag_func_index; + uint32_t slaves; + int32_t mode_changes_in_progress; + struct kref ref; + struct lag_func lagfunc[ZXDH_MAX_PORTS]; + struct workqueue_struct *wq; + struct delayed_work bond_work; + struct notifier_block nb; + struct lag_tracker tracker; + struct dh_core_dev *parent; + + struct zxdh_lag_if *ops; +}; + +static inline bool lag_is_ready(struct zxdh_lag *ldev) +{ + return true; +} + +static inline bool lag_is_backup(struct zxdh_lag *ldev) +{ + return ldev->tracker.tx_type == NETDEV_LAG_TX_TYPE_ACTIVEBACKUP ? true : false; +} + +static inline bool lag_is_hash(struct zxdh_lag *ldev) +{ + return ldev->tracker.tx_type == NETDEV_LAG_TX_TYPE_HASH ? true : false; +} + +static inline bool lag_is_port_invalid(struct zxdh_lag *ldev, uint32_t index) +{ + BUG_ON(index >= ZXDH_MAX_PORTS); + return !ldev->lagfunc[index].dev || !ldev->lagfunc[index].netdev; +} + +void ldev_kref_free(struct kref *ref); +static inline void get_ldev_kref(struct zxdh_lag *ldev) +{ + kref_get(&ldev->ref); +} + +static inline void put_ldev_kref(struct zxdh_lag *ldev) +{ + kref_put(&ldev->ref, ldev_kref_free); +} + +#endif /* _ZXDH_ETH_LAG_H_ */ \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/lag/lag_procfs.c b/src/net/drivers/net/ethernet/dinghai/lag/lag_procfs.c new file mode 100644 index 0000000..62ca8e5 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/lag/lag_procfs.c @@ -0,0 +1,62 @@ +#include +#include +#include + +#include "dh_procfs.h" +#include "lag.h" + +void *lag_info_seq_start(struct seq_file *seq, loff_t *pos) +{ + if (*pos == 0) + { + return SEQ_START_TOKEN; + } + + return NULL; +} + +void *lag_info_seq_next(struct seq_file *seq, void *v, loff_t *pos) +{ +#if 0 + struct test *tst = PDE_DATA(file_inode(seq->file)); + + ++*pos; + if (v == SEQ_START_TOKEN) + pr_info("%s first *pos = %u\n", __FUNCTION__, (uint32_t)*pos); + + pr_info("%s *pos = %u\n", __FUNCTION__, (uint32_t)*pos); + if (*pos < 5) + { + return tst; + } +#endif + return NULL; +} + +void lag_info_seq_stop(struct seq_file *seq, void *v) +{ + pr_info("%s \n", __FUNCTION__); +} + +int lag_info_seq_show(struct seq_file *seq, void *v) +{ +#if 0 + struct zxdh_lag *lag = PDE_DATA(file_inode(seq->file)); + + if (v == SEQ_START_TOKEN) + { + seq_printf(seq, "Port Mode: %u", tst->port); + seq_printf(seq, "Num Mode: %u", tst->age); + seq_printf(seq, "\n"); + } +#endif + return 0; +} + +struct seq_operations lag_info_seq_ops = +{ + .start = lag_info_seq_start, + .next = lag_info_seq_next, + .stop = lag_info_seq_stop, + .show = lag_info_seq_show, +}; \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/msg_common.h b/src/net/drivers/net/ethernet/dinghai/msg_common.h new file mode 100644 index 0000000..92110ea --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/msg_common.h @@ -0,0 +1,719 @@ +#ifndef __ZXDH_MSG_COMMON_H__ +#define __ZXDH_MSG_COMMON_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "en_np/table/include/dpp_tbl_api.h" +#include "en_aux/queue.h" +#include "en_pf.h" + +#define FW_VERSION_LEN 32 + +typedef enum +{ + ZXDH_NULL = 0, + + ZXDH_VF_PORT_INIT = 1, + ZXDH_VF_PORT_UNINIT = 2, + ZXDH_MAC_ADD = 3, + ZXDH_MAC_DEL = 4, + ZXDH_MAC_GET = 5, + + ZXDH_RSS_EN_SET = 7, + ZXDH_RXFH_SET = 8, + ZXDH_RXFH_GET = 9, + ZXDH_RXFH_DEL = 10, + ZXDH_THASH_KEY_SET = 11, + ZXDH_THASH_KEY_GET = 12, + ZXDH_HASH_FUNC_SET = 13, + ZXDH_HASH_FUNC_GET = 14, + ZXDH_RX_FLOW_HASH_SET = 15, + ZXDH_RX_FLOW_HASH_GET = 16, + + ZXDH_VLAN_FILTER_SET = 17, + ZXDH_VLAN_FILTER_ADD = 18, + ZXDH_VLAN_FILTER_DEL = 19, + ZXDH_VLAN_OFFLOAD_SET = 21, + + ZXDH_PORT_ATTRS_GET = 22, + ZXDH_SET_TPID = 23, + ZXDH_VXLAN_PORT = 24, + ZXDH_PORT_ATTRS_SET = 25, + ZXDH_PROMISC_SET = 26, + + /*sriov msg type*/ + ZXDH_SRIOV_RESET = 27, + + ZXDH_SET_VF_LINK_STATE = 28, + ZXDH_PF_SET_VF_VLAN = 29, + ZXDH_SET_VF_RESET = 30, + ZXDH_GET_NP_STATS = 31, + + ZXDH_VF_RATE_LIMIT_SET = 32, + ZXDH_PLCR_UNINIT = 33, + ZXDH_MAP_PLCR_FLOWID = 34, + ZXDH_PLCR_MODE_INIT = 35, + ZXDH_PLCR_FLOW_INIT = 36, + ZXDH_PLCR_CAR_PROFILE_ID_ADD = 37, + ZXDH_PLCR_CAR_PROFILE_ID_DELETE = 38, + ZXDH_PLCR_CAR_PROFILE_CFG_SET = 39, + ZXDH_PLCR_CAR_PROFILE_CFG_GET = 40, + ZXDH_PLCR_CAR_QUEUE_CFG_SET = 41, + ZXDH_PORT_METER_STAT_CLR = 42, + ZXDH_PORT_METER_STAT_GET = 43, + ZXDH_PF_GET_VF_QUEUE_INFO = 44, + + ZXDH_VF_1588_CALL_NP, + ZXDH_MSG_TYPE_CNT_MAX, + + ZXDH_IPV6_MAC_ADD, + ZXDH_IPV6_MAC_DEL, +} __attribute__((packed)) zxdh_msg_op_code; + +typedef struct +{ + zxdh_msg_op_code op_code; + uint16_t vport; + uint16_t vf_id; + uint16_t pcie_id; +} __attribute__((packed)) zxdh_msg_head_to_pf; + +typedef struct +{ + zxdh_msg_op_code op_code; + uint16_t dst_pcie_id; +} __attribute__((packed)) zxdh_msg_head_to_vf; + +typedef struct +{ + bool link_up; + bool is_upf; + uint16_t base_qid; + uint8_t mac_addr[ZXDH_MAC_NUM]; + uint32_t speed; + uint32_t autoneg_enable; + uint32_t sup_link_modes; + uint32_t adv_link_modes; + uint8_t hash_search_idx; + uint8_t duplex; + uint8_t phy_port; + uint8_t rss_enable; +} __attribute__((packed)) zxdh_vf_init_msg; + +typedef struct +{ + uint32_t vfid; + uint32_t call_np_interface_num; + uint32_t ptp_tc_enable_opt; +} __attribute__((packed)) zxdh_vf_1588_call_np; + +typedef struct +{ + uint8_t rss_enable; +} __attribute__((packed)) zxdh_rss_enable_msg; + +typedef struct +{ + bool enable; +#define VLAN_STRIP_MSG_TYPE 0 +#define QINQ_STRIP_MSG_TYPE 1 + uint8_t flag; +} __attribute__((packed)) zxdh_strip_enable_msg; + +typedef struct +{ + uint16_t vf_idx; + uint16_t vlan_id; + uint8_t qos; + uint8_t rsv; + uint16_t protocl; +} __attribute__((packed)) zxdh_set_vf_vlan_msg; + +typedef struct +{ + uint16_t tpid; +} __attribute__((packed)) zxdh_qinq_tpid_cfg_msg; + +typedef struct +{ + uint32_t queue_map[ZXDH_INDIR_RQT_SIZE]; +} __attribute__((packed)) zxdh_rxfh_set_msg; + +typedef struct +{ + uint8_t key_map[ZXDH_NET_HASH_KEY_SIZE]; +} __attribute__((packed)) zxdh_thash_key_set_msg; + +typedef struct +{ + uint8_t func; +} __attribute__((packed)) zxdh_hfunc_set_msg; + +typedef struct +{ + uint32_t hash_mode; +} __attribute__((packed)) zxdh_rx_flow_hash_set_msg; + +typedef struct +{ + bool mac_flag; + uint8_t filter_flag; /* 0xaa表示过滤,0Xff表示其他*/ + uint8_t mac_addr[ZXDH_MAC_NUM]; +} __attribute__((packed)) zxdh_mac_addr_msg; + +typedef struct +{ + uint8_t mac_addr[ZXDH_MAC_NUM]; +} __attribute__((packed)) zxdh_ipv6_mac_addr_msg; + +typedef struct +{ + uint32_t mode; + uint32_t value; + uint8_t allmulti_follow; +} __attribute__((packed)) zxdh_port_attr_set_msg; + +#define ZXDH_PROMISC_MODE 1 +#define ZXDH_ALLMULTI_MODE 2 +typedef struct +{ + uint8_t mode; + uint8_t value; + uint8_t mc_follow; +} __attribute__((packed)) zxdh_promisc_set_msg; + +typedef struct +{ + uint8_t rsv2; + uint16_t read_bytes; + uint8_t value; +}__attribute__((packed)) common_recv_msg; + +typedef struct +{ + uint8_t rsv2; + uint16_t read_bytes; + uint16_t queue_nums; + uint16_t phy_qidx[256]; +}__attribute__((packed)) common_vq_msg; + +typedef enum +{ + AGENT_MAC_STATS_GET = 10, + AGENT_MAC_STATS_CLEAR, + AGENT_MAC_PHYPORT_INIT, + AGENT_MAC_AUTONEG_SET, + AGENT_MAC_LINK_INFO_GET, + AGENT_MAC_LED_BLINK, + AGENT_MAC_FEC_MODE_SET, + AGENT_MAC_FEC_MODE_GET, + AGENT_MAC_FC_MODE_SET, + AGENT_MAC_FC_MODE_GET, + AGENT_MAC_MODULE_EEPROM_READ, + AGENT_VQM_DEVICE_STATS_GET, + AGENT_VQM_STATS_CLEAR, + AGENT_FLASH_FIR_VERSION_GET = 23, + AGENT_DEV_STATUS_NOTIFY, + AGENT_DEBUG_LLDP_ENABLE_SET, + AGENT_DEBUG_LLDP_ENABLE_GET, + AGENT_SSHD_START, + AGENT_SSHD_STOP, + AGENT_FLASH_MAC_READ, + AGENT_FLASH_MAC_WRITE, + AGENT_FLASH_MAC_ERASE, + AGENT_MAC_RECOVERY_CLK_SET, + AGENT_MAC_SYNCE_CLK_STATS_GET, + AGENT_MAC_PORT_TSTAMP_ENABLE_SET, + AGENT_MAC_PORT_TSTAMP_ENABLE_GET, + AGENT_MAC_PORT_TSTAMP_MODE_SET, + AGENT_MAC_PORT_TSTAMP_MODE_GET, + AGENT_MAC_PORT_DELAY_VALUE_GET, + AGENT_MAC_PORT_DELAY_VALUE_CLR, + AGENT_EP0_BUS_GET = 40, + AGENT_OS_TYPE_GET = 41, + AGENT_MAC_MSG_NUM_MAX, /* should be at last */ +} __attribute__((packed)) agent_msg_op_code; + +typedef struct +{ + agent_msg_op_code op_code; + uint8_t port_id; + uint8_t phyport; + uint8_t is_upf; + uint16_t vf_id; + uint16_t pcie_id; +} __attribute__((packed)) agent_msg_hdr; + +typedef struct +{ + uint8_t autoneg; + uint8_t link_state; + uint8_t blink_enable; + uint8_t duplex; + uint32_t speed_modes; + uint32_t speed; +} __attribute__((packed)) agent_mac_autoneg_msg; + +typedef struct +{ + uint64_t rx_total; + uint64_t tx_total; + uint64_t rx_bytes; + uint64_t tx_bytes; + uint64_t rx_error; + uint64_t tx_error; + uint64_t rx_drop; + uint64_t tx_drop; + uint64_t rx_multicast; + uint64_t tx_multicast; + uint64_t rx_broadcast; + uint64_t tx_broadcast; + uint64_t rx_size_64; + uint64_t rx_size_65_127; + uint64_t rx_size_128_255; + uint64_t rx_size_256_511; + uint64_t rx_size_512_1023; + uint64_t rx_size_1024_1518; + uint64_t rx_size_1519_mru; +} __attribute__((packed)) agent_stats; + +typedef struct +{ + uint64_t np_rx_broadcast; + uint64_t np_tx_broadcast; + uint64_t np_rx_mtu_drop_pkts; + uint64_t np_tx_mtu_drop_pkts; + uint64_t np_rx_mtu_drop_bytes; + uint64_t np_tx_mtu_drop_bytes; + uint64_t np_rx_plcr_drop_pkts; + uint64_t np_tx_plcr_drop_pkts; + uint64_t np_rx_plcr_drop_bytes; + uint64_t np_tx_plcr_drop_bytes; +}__attribute__((packed)) np_stats; + +typedef struct +{ + uint8_t fec_cfg; + uint8_t fec_cap; + uint8_t fec_link; +} __attribute__((packed)) agent_mac_fec_mode_msg; + +typedef struct +{ + uint8_t fc_mode; +} __attribute__((packed)) agent_mac_fc_mode_msg; + +typedef struct +{ + uint8_t index; +} __attribute__((packed)) agent_flash_read_msg; + +typedef struct +{ + uint8_t i2c_addr; + uint8_t bank; + uint8_t page; + uint8_t offset; + uint8_t length; + uint8_t data[128]; +} __attribute__((packed)) agent_mac_module_eeprom_msg; + +typedef struct +{ + bool is_link_force_set; + bool link_forced; + bool link_up; + uint32_t speed; + uint32_t autoneg_enable; + uint32_t supported_speed_modes; + uint32_t advertising_speed_modes; + uint8_t duplex; +} __attribute__((packed)) zxdh_link_state_msg; + +typedef struct +{ + bool enable; +} __attribute__((packed)) zxdh_vlan_filter_set_msg; + +typedef struct +{ + uint16_t vlan_id; +} __attribute__((packed)) zxdh_rx_vid_add_msg; + +typedef struct +{ + uint16_t vlan_id; +} __attribute__((packed)) zxdh_rx_vid_del_msg; + +typedef struct +{ + uint8_t type; + uint8_t field; + uint16_t pcie_id; + uint16_t write_bytes; + uint16_t rsv; +} __attribute__((packed)) zxdh_common_tbl_hdr; + +typedef struct +{ + uint8_t tmmng_type; + uint8_t dir; + uint16_t year; + uint8_t month; + uint8_t day; + uint8_t hour; + uint8_t min; + uint8_t sec; +} __attribute__((packed)) zxdh_cfg_time_msg; + +typedef struct +{ + uint16_t pcie_id; + uint16_t write_bytes; +} __attribute__((packed)) zxdh_common_time_hdr; + +typedef struct +{ + uint8_t clk_speed; + uint8_t clk_stats; +} __attribute__((packed)) zxdh_synce_clk_msg; + +typedef struct +{ + uint32_t tx_enable; + uint32_t rx_enable; + uint32_t tx_mode; + uint32_t rx_mode; +} __attribute__((packed)) zxdh_mac_tstamp_msg; + +typedef struct +{ + uint64_t min_delay; + uint64_t max_delay; +} __attribute__((packed)) zxdh_delay_statistics_val; + +typedef struct +{ + uint16_t pcieid; // 发送者自己的pcie id + uint16_t extern_pps_vector; // 外部pps中断向量 + uint16_t local_pps_vector; // local pps中断向量 +} __attribute__((packed)) zxdh_bar_msg_pps; + +typedef struct +{ + uint8_t dev_id; //用dbg module的id, 为0 + uint8_t type; //区分PXE下和正常的np配表流程, 0: PXE 7: 配np + uint8_t operate_mode; //区分PXE开始和结束, 0: 开始 1: 结束 + uint8_t pfNum; + uint32_t portNum[10]; + uint32_t evid[10]; + uint32_t qid[10]; +} __attribute__((packed)) zxdh_cfg_np_msg; + +#define MAX_HDR_LEN 8 + +typedef struct +{ + char ifname[IFNAMSIZ]; + uint8_t mac[ETH_ALEN]; + uint16_t pannel_id; + uint16_t ctl; + uint16_t rsv; +} __attribute__((packed)) zxdh_pf_cfg_mac_msg; + +#define MAX_VF_NUM 256 +typedef struct +{ + uint16_t num; + uint16_t func_no[MAX_VF_NUM]; +} __attribute__((packed)) agent_pcie_msix_msg; + +typedef struct +{ + bool lldp_enable; +} __attribute__((packed)) zxdh_lldp_enable_msg; + +typedef struct +{ + uint32_t flowid; + uint32_t car_type; + uint32_t is_packet; + uint32_t max_rate; + uint32_t min_rate; +} __attribute__((packed)) zxdh_rate_limit_set_msg; + +/*vf send message to pf to map flow id between CARS*/ +typedef struct +{ + uint32_t car_type; + uint32_t flowid; + uint32_t map_flowid; + uint32_t sp; +} __attribute__((packed)) zxdh_plcr_flowid_map_msg; + +typedef struct +{ + uint32_t car_type; + uint32_t flowid; + uint32_t profile_id; +} __attribute__((packed)) zxdh_plcr_flow_init_msg; + +typedef struct +{ + uint32_t vir_queue_start; + uint32_t vir_queue_num; +} __attribute__((packed)) zxdh_plcr_pf_get_vf_queue_info_msg; + +/*用户态QOS申请限速模板*/ +typedef struct +{ + uint8_t car_type; +} __attribute__((packed)) zxdh_vf_plcr_profile_id_add_msg; + +/*用户态QOS删除限速模板*/ +typedef struct +{ + uint8_t car_type; + uint8_t rsvd; + uint16_t profile_id; +} __attribute__((packed)) zxdh_vf_plcr_profile_id_delete_msg; + +/*用户态QOS配置限速模板*/ +typedef struct +{ + uint8_t car_type; + uint8_t pkt_mode; + uint16_t profile_id; + union zxdh_plcr_profile_cfg profile_cfg; +} __attribute__((packed)) zxdh_vf_plcr_profile_cfg_set_msg; + +/*用户态QOS获取限速模板*/ +typedef struct +{ + uint8_t car_type; + uint8_t pkt_mode; + uint16_t profile_id; +} __attribute__((packed)) zxdh_vf_plcr_profile_cfg_get_msg; + +/*用户态QOS绑定flow和profile*/ +typedef struct +{ + uint8_t car_type; + uint8_t drop_flag; + uint8_t plcr_en; + uint8_t rsvd; + uint16_t flow_id; + uint16_t profile_id; +} __attribute__((packed)) zxdh_vf_plcr_queue_cfg_set_msg; + +/*用户态QOS获取plcr丢包统计*/ +typedef struct +{ + uint8_t direction; //取值为1:获取tx方向的统计计数;取值为0:获取rx方向的统计计数 + uint8_t is_clr; //取值为1:读取之后,计数器清零,取值为0:读取之后,计数器不清零 +} __attribute__((packed)) zxdh_vf_plcr_port_meter_stat_get_msg; + +typedef struct +{ + uint32_t clear_mode; +} __attribute__((packed)) zxdh_np_stats_get_msg; + +struct zxdh_port_msg +{ + uint16_t pcie_id; + uint8_t rsv[2]; +} __attribute__((packed)); + +struct port_message_recv +{ + uint8_t hdr[4]; + uint8_t port_num; + uint8_t rsv[3]; + struct zxdh_pannle_port data[16]; +} __attribute__((packed)); + +typedef struct +{ + union + { + uint8_t len[MAX_HDR_LEN]; + zxdh_msg_head_to_pf hdr; + zxdh_msg_head_to_vf hdr_vf; + agent_msg_hdr hdr_to_agt; + zxdh_common_tbl_hdr hdr_to_cmn; + zxdh_common_time_hdr hdr_time_to_cmn; + }; /* should be no more than MAX_HDR_LEN */ + + union + { + zxdh_rss_enable_msg rss_enable_msg; + zxdh_rxfh_set_msg rxfh_set_msg; + zxdh_thash_key_set_msg thash_key_set_msg; + zxdh_hfunc_set_msg hfunc_set_msg; + zxdh_rx_flow_hash_set_msg rx_flow_hash_set_msg; + zxdh_mac_addr_msg mac_addr_set_msg; + zxdh_port_attr_set_msg port_attr_set_msg; + zxdh_promisc_set_msg promisc_set_msg; + zxdh_link_state_msg link_state_msg; + zxdh_vlan_filter_set_msg vlan_filter_set_msg; + zxdh_rx_vid_add_msg rx_vid_add_msg; + zxdh_rx_vid_del_msg rx_vid_del_msg; + agent_mac_autoneg_msg mac_set_msg; + agent_mac_fec_mode_msg mac_fec_mode_msg; + agent_mac_fc_mode_msg mac_fc_mode_msg; + agent_mac_module_eeprom_msg module_eeprom_msg; + agent_flash_read_msg flash_read_msg; + zxdh_vf_init_msg vf_init_msg; + zxdh_strip_enable_msg vlan_strip_msg; + zxdh_set_vf_vlan_msg vf_vlan_msg; + zxdh_qinq_tpid_cfg_msg tpid_cfg_msg; + zxdh_pf_cfg_mac_msg mac_cfg_msg; + zxdh_cfg_time_msg time_cfg_msg; + agent_pcie_msix_msg pcie_msix_msg; + zxdh_lldp_enable_msg lldp_msg; + zxdh_rate_limit_set_msg rate_limit_set_msg; + zxdh_plcr_flowid_map_msg plcr_flowid_map_msg; + zxdh_plcr_flow_init_msg plcr_flow_init_msg; + zxdh_plcr_pf_get_vf_queue_info_msg plcr_pf_get_vf_queue_info_msg; + /*用户态QOS申请限速模板*/ + zxdh_vf_plcr_profile_id_add_msg vf_plcr_profile_id_add_msg; + /*用户态QOS删除限速模板*/ + zxdh_vf_plcr_profile_id_delete_msg vf_plcr_profile_id_delete_msg; + /*用户态QOS配置限速模板*/ + zxdh_vf_plcr_profile_cfg_set_msg vf_plcr_profile_cfg_set_msg; + /*用户态QOS获取限速模板*/ + zxdh_vf_plcr_profile_cfg_get_msg vf_plcr_profile_cfg_get_msg; + /*用户态QOS绑定flow和profile*/ + zxdh_vf_plcr_queue_cfg_set_msg vf_plcr_queue_cfg_set_msg; + /*用户态QOS获取plcr丢包统计*/ + zxdh_vf_plcr_port_meter_stat_get_msg vf_plcr_port_meter_stat_get_msg; + zxdh_np_stats_get_msg np_stats_get_msg; + + zxdh_vf_1588_call_np vf_1588_call_np; + zxdh_synce_clk_msg synce_clk_recovery_port; + zxdh_mac_tstamp_msg mac_tstamp_msg; + zxdh_bar_msg_pps msg_pps; + uint16_t cmn_tbl_msg[257]; + }; +} zxdh_msg_info; + +typedef enum +{ + ZXDH_REPS_FAIL, + ZXDH_REPS_SUCC = 0xaa, + ZXDH_REPS_BEOND_MAC = 0xfe, +} __attribute__((packed)) zxdh_reps_flag; + +typedef struct +{ + uint8_t lldp_status; +} __attribute__((packed)) agent_debug_lldp_msg; + +typedef struct +{ + uint8_t firmware_version[FW_VERSION_LEN]; +} __attribute__((packed)) agent_flash_msg; + +typedef struct +{ + uint8_t mac[ETH_ALEN]; +} __attribute__((packed)) agent_flash_mac_read_msg; + +typedef struct +{ + uint32_t phy_queue_num; + uint16_t phy_rxq[16]; + uint16_t phy_txq[16]; +} __attribute__((packed)) zxdh_plcr_pf_get_vf_queue_info_rsp; + +typedef struct +{ + uint32_t err_code; +} __attribute__((packed)) zxdh_rate_limit_set_rsp; + +/*用户态QOS申请限速模板,返回模板profile_id*/ +typedef struct +{ + uint16_t profile_id; +} __attribute__((packed)) zxdh_vf_plcr_profile_id_add_rsp; + +/*用户态QOS获取限速模板,返回模板参数*/ +typedef struct +{ + union zxdh_plcr_profile_cfg profile_cfg; +} __attribute__((packed)) zxdh_vf_plcr_profile_cfg_get_rsp; + +/*用户态QOS获取丢包统计*/ +typedef struct +{ + uint64_t drop_pkB_cnt; //丢数据包:包数统计 + uint64_t drop_pk_cnt; //丢数据包:字节数计数 +} __attribute__((packed)) zxdh_vf_plcr_port_meter_stat_get_rsp; + +typedef struct +{ + uint8_t bus_info; //ep0的bus号 +} __attribute__((packed)) zxdh_ep0_bus_get_rsp; + +typedef struct +{ + uint8_t is_zios; //riscv是否为zios +} __attribute__((packed)) zxdh_os_type_get_rsp; + +typedef struct +{ + ZXDH_VPORT_T port_attr_entry; +} __attribute__((packed)) zxdh_port_attr_get_msg; + +typedef struct +{ + zxdh_reps_flag flag; + union + { + zxdh_thash_key_set_msg thash_key_set_msg; + zxdh_rx_flow_hash_set_msg rx_flow_hash_set_msg; + zxdh_link_state_msg link_state_msg; + agent_mac_autoneg_msg mac_set_msg; + agent_stats stats_msg; + np_stats np_stats_msg; + agent_mac_fec_mode_msg mac_fec_mode_msg; + agent_mac_fc_mode_msg mac_fc_mode_msg; + agent_mac_module_eeprom_msg module_eeprom_msg; + common_recv_msg cmn_recv_msg; + common_vq_msg cmn_vq_msg; + zxdh_mac_addr_msg vf_mac_addr_get_msg; + zxdh_vf_init_msg vf_init_msg; + agent_flash_msg flash_msg; + agent_flash_mac_read_msg flash_mac_read_msg; + agent_debug_lldp_msg debug_lldp_msg; + zxdh_plcr_pf_get_vf_queue_info_rsp plcr_pf_get_vf_queue_info_rsp; + zxdh_rate_limit_set_rsp rate_limit_set_rsp; + /*用户态QOS申请限速模板返回profile_id*/ + zxdh_vf_plcr_profile_id_add_rsp vf_plcr_profile_id_add_rsp; + /*用户态QOS获取限速模板*/ + zxdh_vf_plcr_profile_cfg_get_rsp vf_plcr_profile_cfg_get_rsp; + /*用户态QOS获取丢包统计*/ + zxdh_vf_plcr_port_meter_stat_get_rsp vf_plcr_port_meter_stat_get_rsp; + zxdh_synce_clk_msg synce_clk_recovery_port; + zxdh_mac_tstamp_msg mac_tstamp_msg; + zxdh_delay_statistics_val delay_statistics_val; + zxdh_ep0_bus_get_rsp ep0_bus_msg; + zxdh_os_type_get_rsp os_type_msg; + zxdh_port_attr_get_msg port_attr_get_msg; + zxdh_rxfh_set_msg rxfh_get_msg; + }; +} zxdh_reps_info; + +union zxdh_msg +{ + zxdh_msg_info payload; + zxdh_reps_info reps; +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/pci_irq.c b/src/net/drivers/net/ethernet/dinghai/pci_irq.c new file mode 100755 index 0000000..f1f9e7b --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/pci_irq.c @@ -0,0 +1,573 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DH_PF_IRQ_CTRL_NUM (1) + +#define DH_SFS_PER_CTRL_IRQ 64 +#define DH_IRQ_CTRL_SF_MAX 8 +/* min num of vectors for SFs to be enabled */ +#define DH_IRQ_VEC_COMP_BASE_SF 2 + +#define DH_EQ_SHARE_IRQ_MAX_COMP (8) +#define DH_EQ_SHARE_IRQ_MAX_CTRL (UINT_MAX) +#define DH_EQ_SHARE_IRQ_MIN_COMP (1) +#define DH_EQ_SHARE_IRQ_MIN_CTRL (4) + +static void irq_release(struct dh_irq *irq) +{ + struct dh_irq_pool *pool = irq->pool; + + xa_erase(&pool->irqs, irq->index); + /* free_irq requires that affinity_hint and rmap will be cleared + * before calling it. This is why there is asymmetry with set_rmap + * which should be called after alloc_irq but before request_irq. + */ + // irq_update_affinity_hint(irq->irqn, NULL); + irq_set_affinity_hint(irq->irqn, NULL); + free_cpumask_var(irq->mask); + free_irq(irq->irqn, &irq->nh); + kfree(irq); +} + +int32_t dh_irq_put(struct dh_irq *irq) +{ + struct dh_irq_pool *pool = irq->pool; + int32_t ret = 0; + + mutex_lock(&pool->lock); + irq->refcount--; + if (!irq->refcount) + { + irq_release(irq); + ret = 1; + } + mutex_unlock(&pool->lock); + + return ret; +} + +int32_t dh_irq_read_locked(struct dh_irq *irq) +{ + lockdep_assert_held(&irq->pool->lock); + + return irq->refcount; +} + +int32_t dh_irq_get_locked(struct dh_irq *irq) +{ + lockdep_assert_held(&irq->pool->lock); + if (WARN_ON_ONCE(!irq->refcount)) + { + return 0; + } + + irq->refcount++; + + return 1; +} + +static int32_t irq_get(struct dh_irq *irq) +{ + int32_t err = 0; + + mutex_lock(&irq->pool->lock); + err = dh_irq_get_locked(irq); + mutex_unlock(&irq->pool->lock); + + return err; +} + +static irqreturn_t irq_int_handler(int32_t irq, void *nh) +{ + atomic_notifier_call_chain(nh, 0, NULL); + + return IRQ_HANDLED; +} + +static void irq_set_name(struct dh_irq_pool *pool, char *name, int32_t vecidx) +{ + if (!strcmp(pool->name, "zxdh_pf_vq")) + { + int type = (vecidx - pool->xa_num_irqs.min) % 2; + snprintf(name, DH_MAX_IRQ_NAME, "vq_%s_%d", type ? "output" : "input", vecidx); + return; + } + else if (!strcmp(pool->name, "zxdh_pf_async")) + { + snprintf(name, DH_MAX_IRQ_NAME, "async_%d", vecidx); + return; + } + else if (!strcmp(pool->name, "zxdh_mpf_gdma")) + { + snprintf(name, DH_MAX_IRQ_NAME, "gdma_%d", vecidx); + return; + } +} + +struct dh_irq *dh_irq_alloc(struct dh_irq_pool *pool, int32_t i, const struct cpumask *affinity) +{ + struct dh_core_dev *dev = pool->dev; + char name[DH_MAX_IRQ_NAME] = {}; + struct dh_irq *irq = NULL; + int32_t err = 0; + int32_t num_cpu = 0; + int32_t cpu_loop = 0; + + irq = kzalloc(sizeof(*irq), GFP_KERNEL); + if (unlikely(irq == NULL)) + { + LOG_ERR("irq kzalloc failed\n"); + return ERR_PTR(-ENOMEM); + } + + irq->irqn = pci_irq_vector(dev->pdev, i); + irq_set_name(pool, name, i); + ATOMIC_INIT_NOTIFIER_HEAD(&irq->nh); + snprintf(irq->name, DH_MAX_IRQ_NAME, "%s@pci:%s", name, pci_name(dev->pdev)); + LOG_DEBUG("i=%d, irqn=%d, name=%s\r\n", i, irq->irqn, irq->name); + + err = request_irq(irq->irqn, irq_int_handler, 0, irq->name, &irq->nh); + if (err != 0) + { + LOG_ERR("Failed to request irq. err = %d\n", err); + goto err_req_irq; + } + + if (!zalloc_cpumask_var(&irq->mask, GFP_KERNEL)) + { + LOG_WARN("zalloc_cpumask_var failed\n"); + err = -ENOMEM; + goto err_cpumask; + } + + if (affinity != NULL) + { + cpumask_copy(irq->mask, affinity); + irq_set_affinity_hint(irq->irqn, irq->mask); + } + else + { + num_cpu = num_online_cpus(); + for (cpu_loop= 0; cpu_loop < num_cpu; cpu_loop++) + { + cpumask_set_cpu(cpu_loop, irq->mask); + } + irq_set_affinity_hint(irq->irqn, irq->mask); + } + + irq->pool = pool; + irq->refcount = 1; + irq->index = i; + err = xa_err(xa_store(&pool->irqs, irq->index, irq, GFP_KERNEL)); + if (err != 0) + { + LOG_ERR("Failed to alloc xa entry for irq(%u). err = %d\n", irq->index, err); + goto err_xa; + } + + return irq; + +err_xa: + irq_set_affinity_hint(irq->irqn, NULL); + free_cpumask_var(irq->mask); +err_cpumask: + free_irq(irq->irqn, &irq->nh); +err_req_irq: + kfree(irq); + return ERR_PTR(err); +} + +int32_t dh_irq_attach_nb(struct dh_irq *irq, struct notifier_block *nb) +{ + int32_t ret = 0; + + ret = irq_get(irq); + if (ret == 0) + { + return -ENOENT; + } + + ret = atomic_notifier_chain_register(&irq->nh, nb); + if (ret != 0) + { + dh_irq_put(irq); + } + + return ret; +} + +int32_t dh_irq_detach_nb(struct dh_irq *irq, struct notifier_block *nb) +{ + int32_t err = 0; + + err = atomic_notifier_chain_unregister(&irq->nh, nb); + dh_irq_put(irq); + + return err; +} + +struct cpumask *dh_irq_get_affinity_mask(struct dh_irq *irq) +{ + return irq->mask; +} + +int32_t dh_irq_get_index(struct dh_irq *irq) +{ + return irq->index; +} + +/* irq_pool API */ +static int32_t __attribute__((unused)) irq_pool_size_get(struct dh_irq_pool *pool) +{ + return pool->xa_num_irqs.max - pool->xa_num_irqs.min + 1; +} + +/* requesting an irq from a given pool according to given index */ +static struct dh_irq *irq_pool_request_vector(struct dh_irq_pool *pool, int32_t vecidx, + const struct cpumask *affinity, u8 exclude) +{ + struct dh_irq *irq = NULL; + + mutex_lock(&pool->lock); + irq = xa_load(&pool->irqs, vecidx); + if (irq != NULL) + { + if (exclude) + { + return ERR_PTR(-EEXIST); + } + dh_irq_get_locked(irq); + goto unlock; + } + + irq = dh_irq_alloc(pool, vecidx, affinity); +unlock: + mutex_unlock(&pool->lock); + return irq; +} + +/** + * dh_irqs_release - release one or more IRQs back to the system. + * @irqs: IRQs to be released. + * @nirqs: number of IRQs to be released. + */ +static void dh_irqs_release(struct dh_irq **irqs, int32_t nirqs) +{ + int32_t i; + + for (i = 0; i < nirqs; i++) + { + synchronize_irq(irqs[i]->irqn); + dh_irq_put(irqs[i]); + } +} + +/** + * dh_ctrl_irq_release - release a ctrl IRQ back to the system. + * @ctrl_irq: ctrl IRQ to be released. + */ +void dh_ctrl_irq_release(struct dh_irq *ctrl_irq) +{ + dh_irqs_release(&ctrl_irq, 1); +} + +/* get a irq from pool*/ +struct dh_irq *zxdh_get_irq_of_pool(struct dh_core_dev *dev, struct dh_irq_pool *pool) +{ + cpumask_var_t req_mask; + struct dh_irq *irq = NULL; + + if (!zalloc_cpumask_var(&req_mask, GFP_KERNEL)) + { + LOG_ERR("zalloc_cpumask_var failed\n"); + return ERR_PTR(-ENOMEM); + } + cpumask_copy(req_mask, cpu_online_mask); + + irq = dh_irq_affinity_request(pool, req_mask); + + free_cpumask_var(req_mask); + if (IS_ERR_OR_NULL(irq)) + { + LOG_ERR("irq=0x%llx dh_irq_affinity_request failed\n", (unsigned long long)irq); + } + + return irq; +} + +/** + * dh_irq_request - request an IRQ for zxdh PF/VF device. + * @pool: requesting the IRQ from the irqs pool. + * @vecidx: vector index of the IRQ. This argument is ignore if affinity is + * provided. + * @affinity: cpumask requested for this IRQ. + * + * This function returns a pointer to IRQ, or ERR_PTR in case of error. + */ +struct dh_irq *dh_irq_request(struct dh_irq_pool *pool, u16 vecidx, + const struct cpumask *affinity, u8 exclude) +{ + struct dh_irq *irq = NULL; + + irq = irq_pool_request_vector(pool, vecidx, affinity, exclude); + if (IS_ERR_OR_NULL(irq)) + return irq; + LOG_DEBUG("irq %u mapped to cpu %*pbl, %u EQs on this irq\n", + irq->irqn, cpumask_pr_args(affinity), + irq->refcount / DH_EQ_REFS_PER_IRQ); + + return irq; +} + +/** + * dh_irqs_release_vectors - release one or more IRQs back to the system. + * @irqs: IRQs to be released. + * @nirqs: number of IRQs to be released. + */ +void dh_irqs_release_vectors(struct dh_irq **irqs, int32_t nirqs) +{ + dh_irqs_release(irqs, nirqs); +} + +/** + * dh_irqs_request_vectors - request one or more IRQs for zxdh device. + * @pool: requesting the IRQs from the irqs pool. + * @cpus: CPUs array for binding the IRQs + * @nirqs: number of IRQs to request. + * @irqs: an output array of IRQs pointers. + * + * Each IRQ is bound to at most 1 CPU. + * This function is requests nirqs IRQs, starting from @vecidx. + * + * This function returns the number of IRQs requested, (which might be smaller than + * @nirqs), if successful, or a negative error code in case of an error. + */ +int32_t dh_irqs_request_vectors(struct dh_irq_pool *pool, uint16_t *cpus, int32_t nirqs, + struct dh_irq **irqs) +{ + cpumask_var_t req_mask; + struct dh_irq *irq = NULL; + int32_t i; + + if (!zalloc_cpumask_var(&req_mask, GFP_KERNEL)) + { + return -ENOMEM; + } + + for (i = 0; i < nirqs; i++) + { + cpumask_set_cpu(cpus[i], req_mask); + irq = dh_irq_request(pool, i, req_mask, 0); + if (IS_ERR_OR_NULL(irq)) + { + break; + } + cpumask_clear(req_mask); + irqs[i] = irq; + } + + free_cpumask_var(req_mask); + + return i ? i : PTR_ERR(irq); +} + +static int32_t req_mask_local_spread(int32_t i, int32_t node, + const struct cpumask *irqs_req_mask) +{ + int32_t cpu; + + if (node == NUMA_NO_NODE) + { + for_each_cpu_and(cpu, cpu_online_mask, irqs_req_mask) + { + if (i-- == 0) + { + return cpu; + } + } + } + else + { + /* NUMA first. */ + for_each_cpu_and(cpu, cpumask_of_node(node), irqs_req_mask) + { + if (cpu_online(cpu)) + { + if (i-- == 0) + { + return cpu; + } + } + } + + for_each_online_cpu(cpu) + { + /* Skip NUMA nodes, done above. */ + if (cpumask_test_cpu(cpu, cpumask_of_node(node))) + { + continue; + } + + if (i-- == 0) + { + return cpu; + } + } + } + WARN_ON(true); + + return cpumask_first(cpu_online_mask); +} + +/** + * dh_irqs_request_mask - request one or more IRQs for zxdh device. + * @pool: requesting the IRQs from the irqs pool. + * @irqs: an output array of IRQs pointers. + * @irqs_req_mask: cpumask requested for these IRQs. + * + * Each IRQ is bounded to at most 1 CPU. + * This function returns the number of IRQs requested, (which might be smaller than + * cpumask_weight(@irqs_req_mask)), if successful, or a negative error code in + * case of an error. + */ +int32_t dh_irqs_request_mask(struct dh_irq_pool *pool, struct dh_irq **irqs, + struct cpumask *irqs_req_mask) +{ + struct dh_irq *irq = NULL; + int32_t nirqs; + int32_t cpu; + int32_t i; + + /* Request an IRQ for each online CPU in the given mask */ + cpumask_and(irqs_req_mask, irqs_req_mask, cpu_online_mask); + nirqs = cpumask_weight(irqs_req_mask); + for (i = 0; i < nirqs; i++) + { + /* Iterate over the mask the caller provided in numa aware fashion. + * Local CPUs are requested first, followed by non-local ones. + */ + cpu = req_mask_local_spread(i, pool->dev->numa_node, irqs_req_mask); + + if (dh_irq_pool_is_sf_pool(pool)) + { + irq = dh_irq_affinity_request(pool, cpumask_of(cpu)); + } + else + { + irq = dh_irq_request(pool, i, cpumask_of(cpu), 0); + } + if (IS_ERR_OR_NULL(irq)) + { + if (i == 0) + { + return PTR_ERR(irq); + } + return i; + } + + irqs[i] = irq; + LOG_DEBUG("IRQ %u mapped to cpu %*pbl, %u EQs on this irq\n", + pci_irq_vector(pool->dev->pdev, dh_irq_get_index(irq)), + cpumask_pr_args(dh_irq_get_affinity_mask(irq)), + dh_irq_read_locked(irq) / DH_EQ_REFS_PER_IRQ); + } + + return i; +} + +struct dh_irq_pool *irq_pool_alloc(struct dh_core_dev *dev, int32_t start, + int32_t size, char *name, + u32 min_threshold, u32 max_threshold) +{ + struct dh_irq_pool *pool = kvzalloc(sizeof(*pool), GFP_KERNEL); + + if (unlikely(pool == NULL)) + { + LOG_ERR("pool kvzalloc failed\n"); + return ERR_PTR(-ENOMEM); + } + + pool->dev = dev; + mutex_init(&pool->lock); + xa_init_flags(&pool->irqs, XA_FLAGS_ALLOC); + pool->xa_num_irqs.min = start; + pool->xa_num_irqs.max = start + size - 1; + + if (name) + { + snprintf(pool->name, DH_MAX_IRQ_NAME - DH_MAX_IRQ_IDX_CHARS, "%s", name); + } + + pool->min_threshold = min_threshold * DH_EQ_REFS_PER_IRQ; + pool->max_threshold = max_threshold * DH_EQ_REFS_PER_IRQ; + + return pool; +} + +void irq_pool_free(struct dh_irq_pool *pool) +{ + struct dh_irq *irq = NULL; + unsigned long index; + uint32_t cpu; + + /* There are cases in which we are destrying the irq_table before + * freeing all the IRQs, fast teardown for example. Hence, free the irqs + * which might not have been freed. + */ + xa_for_each(&pool->irqs, index, irq) + { + irq_release(irq); + } + xa_destroy(&pool->irqs); + mutex_destroy(&pool->lock); + + if (pool->irqs_per_cpu) + { + for_each_online_cpu(cpu) + { + WARN_ON(pool->irqs_per_cpu[cpu]); + } + kfree(pool->irqs_per_cpu); + } + + kvfree(pool); +} + +void dh_irq_table_cleanup(struct dh_core_dev *dev) +{ + if (dh_core_is_sf(dev)) + { + return; + } + + kvfree(dev->irq_table.priv); +} + +void dh_irq_rename(struct dh_core_dev *dev, struct dh_irq *irq, const char *name) +{ + char *dst_name = irq->name; + + if (!name) + { + char default_name[DH_MAX_IRQ_NAME]; + + irq_set_name(irq->pool, default_name, irq->index); + snprintf(dst_name, DH_MAX_IRQ_NAME, "%s@pci:%s", default_name, pci_name(dev->pdev)); + } + else + { + snprintf(dst_name, DH_MAX_IRQ_NAME, "%s-%d", name, irq->index - DH_PF_IRQ_CTRL_NUM); + } +} diff --git a/src/net/drivers/net/ethernet/dinghai/plcr.c b/src/net/drivers/net/ethernet/dinghai/plcr.c new file mode 100644 index 0000000..8e6eaa8 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/plcr.c @@ -0,0 +1,2371 @@ +#include +#include +#include +#include +#include +#include +#include +#include "en_aux.h" +#include "en_ethtool/ethtool.h" +#include +#include +#include +#include "en_np/table/include/dpp_tbl_api.h" +#include "en_aux/events.h" +#include "en_aux/eq.h" +#include "en_aux/en_cmd.h" +#include "msg_common.h" +#include "en_pf.h" +#include +#include "en_aux/en_ioctl.h" +#ifdef TIME_STAMP_1588 +#include "en_aux/en_1588_pkt_proc.h" +#endif + +const uint32_t gaudPlcrCarxProfileNum[E_PLCR_CAR_NUM]={ + PLCR_CAR_A_PROFILE_RES_NUM, //一级CAR:512个限速模板 + PLCR_CAR_B_PROFILE_RES_NUM, //二级CAR:128个限速模板 + PLCR_CAR_C_PROFILE_RES_NUM, //三级CAR:32个限速模板 +}; + +const uint32_t gaudPlcrCarxFlowIdNum[E_PLCR_CAR_NUM]={ + PLCR_CAR_A_FLOWID_RES_NUM, //一级CAR:包含内核和dpdk的id + PLCR_CAR_B_FLOWID_RES_NUM, //二级CAR:前2304个分配给vf,后64个个分配给pf + PLCR_CAR_C_FLOWID_RES_NUM, //三级CAR +}; + +struct zxdh_plcr_cbs gat_carA_byte_rate_limit_cbs[] = +{ + {0, 500, 4*1024*1024}, + {500, 800, 10*1024*1024}, + {800, 1500, 12*1024*1024}, + {1500, 3000, 15*1024*1024}, + {3000, 12000, 20*1024*1024}, + {12000, 20000, 30*1024*1024}, + {20000, 500000, 50*1024*1024}, +}; + +struct zxdh_plcr_cbs gat_carB_byte_rate_limit_cbs[] = +{ + {0, 4000, 8*1024*1024}, + {4000, 8000, 16*1024*1024}, + {8000, 16000, 64*1024*1024}, + {16000, 500000, 128*1024*1024 - 1}, +}; + +static inline struct zxdh_en_device *pf_dev_get_edev(struct zxdh_pf_device *pf_dev) +{ + struct zxdh_auxiliary_device *adev = NULL; + struct zxdh_en_sf_container *sf_con = NULL; + struct zxdh_en_sf_device *en_sf_dev = NULL; + struct zxdh_en_priv *en_priv = NULL; + struct zxdh_en_device *en_dev = NULL; + + adev = pf_dev->adevs_table[0].adev; //sf adev + sf_con = container_of(adev, struct zxdh_en_sf_container, adev); + en_sf_dev = dh_core_priv(sf_con->cdev); //sf cdev + en_priv = en_sf_dev->adev[0]->dev.driver_data; //en adev + en_dev = &en_priv->edev; + + if (!en_dev->init_comp_flag) { + LOG_ERR("en_device not initialized!\n"); + return ERR_PTR(-ENODEV); + } + + return en_dev; +} + +uint32_t zxdh_plcr_get_cbs(E_PLCR_CAR_TYPE car_type, E_RATE_LIMIT_PKT_BYTE is_pkt_mode, uint32_t user_rate_limit, uint32_t *cbs) +{ + uint32_t num; + uint32_t index; + uint32_t flag; + struct zxdh_plcr_cbs *plcr_cbs; + + if (E_RATE_LIMIT_BYTE == is_pkt_mode) + { + if (E_PLCR_CAR_A == car_type) + { + num = sizeof(gat_carA_byte_rate_limit_cbs)/sizeof(struct zxdh_plcr_cbs); + plcr_cbs = &gat_carA_byte_rate_limit_cbs[0]; + } + else if (E_PLCR_CAR_B == car_type) + { + num = sizeof(gat_carB_byte_rate_limit_cbs)/sizeof(struct zxdh_plcr_cbs); + plcr_cbs = &gat_carB_byte_rate_limit_cbs[0]; + } + else if (E_PLCR_CAR_C == car_type) + { + //todo:需要遍历测试得到cbs + *cbs = 8*1024*1024; + return 0; + } + else + { + return -ERANGE; + } + + for(index=0,flag=0; index= plcr_cbs[index].min_rate) && (user_rate_limit < plcr_cbs[index].max_rate)) + { + *cbs = plcr_cbs[index].cbs; + flag = 1; + break; + } + } + if(0 == flag) + { + return -ERANGE; + } + } + else + { + //todo:包限速对应的cbs需要后续遍历测试得到 + return -ERANGE; + } + + return 0; +} + +/* +todo: +rsvd字段为1标识失败,为0标识成功 +修改原有的限速值,只用修改限速模板,不用再调用关联函数; +还有代码中在配置限速模板的时候引用+1了,会影响现有的流程的(结果可能没问题,需要考虑是不是将+1和-1更换位置); +如果找到共享模板,在配置队列失败的时候会减一,加一和减一的位置不对称,会导致计数值不正确。 +*/ + +/* +函数功能:将用户输入的速率,转换成限速模板配置寄存器的格式 +入参: + ---max_rate : 单位是Mbit/s + +返回值:返回vqm中的发送队列号,发送队列号为奇数 +*/ +uint32_t zxdh_plcr_user_maxrate_2_reg(uint32_t user_max_rate) +{ + uint64_t reg_maxrate; + + PLCR_FUNC_DBG_ENTER(); + + reg_maxrate = ((uint64_t)user_max_rate * 1024 / PLCR_STEP_SIZE);//改为61kbps的倍数,单位由"Mbps"转化为"61Kbps" (uint32_t)(max_rate + 0.5)* 1000 / PLCR_STEP_SIZE + + reg_maxrate = (reg_maxrate < PLCR_MIN_RATE) ? PLCR_MIN_RATE : reg_maxrate; + reg_maxrate = (reg_maxrate > PLCR_MAX_RATE) ? PLCR_MAX_RATE : reg_maxrate; + + return (uint32_t)reg_maxrate; +} + +/* +函数功能:将寄存器中的配置值,转换成用户的限速值() +将用户输入的速率,转换成限速模板配置寄存器的格式 +入参: + ---maxrate_cfg : 单位是61Kb/s +出参: + ---user_max_rate : 单位是Mbit/s + +返回值:返回vqm中的发送队列号,发送队列号为奇数 +*/ +uint32_t zxdh_plcr_reg_maxrate_user(uint32_t reg_maxrate) +{ + uint32_t user_max_rate; + + PLCR_FUNC_DBG_ENTER(); + + user_max_rate = reg_maxrate * PLCR_STEP_SIZE / 1024; + + return user_max_rate; +} + +/* +函数功能:查找是否有共享的限速模板 +入参: + ---pf_dev : pf设备结构体 + ---car_type : plcr CAR层级,取值:CAR_A,CAR_B,CAR_C + ---profile_cfg: 待查询的限速模板参数,可能是字节限速模板或者包限速模板 + ---profile_id : 保存查询到的限速模板的id + +返回值:0表示查询成功,其它值表示查询失败 +*/ +static int32_t zxdh_plcr_match_profile(struct zxdh_pf_device *pf_dev, + E_PLCR_CAR_TYPE car_type, + DPP_STAT_CAR_PROFILE_CFG_T *profile_cfg, + uint16_t *profile_id) +{ + struct xarray *xarray_profile = &(pf_dev->plcr_table.plcr_profiles[car_type]); + struct zxdh_plcr_profile *profile; + unsigned long index; + DPP_STAT_CAR_PKT_PROFILE_CFG_T *pkt_profile_cfg = (DPP_STAT_CAR_PKT_PROFILE_CFG_T *)(profile_cfg); + uint32_t profile_max_num = gaudPlcrCarxProfileNum[car_type]; + + PLCR_FUNC_DBG_ENTER(); + + /*遍历vf申请的某一级CAR所有限速模板,是否有指定速率的限速模板存在*/ + xa_for_each_range(xarray_profile, index, profile, 0, profile_max_num) + { + if(0 == profile->ref_cnt) + { + continue; + } + + /*包限速模板比较*/ + if (E_RATE_LIMIT_PACKET ==profile_cfg->pkt_sign) + { + if ((pkt_profile_cfg->pkt_sign == (((DPP_STAT_CAR_PKT_PROFILE_CFG_T *)(&profile->profile_cfg))->pkt_sign)) && + (pkt_profile_cfg->cir == (((DPP_STAT_CAR_PKT_PROFILE_CFG_T *)(&profile->profile_cfg))->cir)) && + (pkt_profile_cfg->cbs == (((DPP_STAT_CAR_PKT_PROFILE_CFG_T *)(&profile->profile_cfg))->cbs))) + { + *profile_id = profile->profile_id; + PLCR_LOG_INFO("profile_id = %d\n", *profile_id); + + return 0; + } + } + //字节限速模板比较 + else if (E_RATE_LIMIT_BYTE ==profile_cfg->pkt_sign) + { + if((profile->profile_cfg.pkt_sign == profile_cfg->pkt_sign) && + (profile->profile_cfg.cd == profile_cfg->cd) && /**< @brief CD算法标志/令牌桶算法标志 0:srtcm 1:trtcm 2:MEF10.1*/ + (profile->profile_cfg.cf == profile_cfg->cf) && /**< @brief CF溢出耦合标志,0:不溢出,1:溢出*/ + (profile->profile_cfg.cm == profile_cfg->cm) && /**< @brief CM色盲/色敏标志,0:色盲模式,1:色敏模式 */ + (profile->profile_cfg.cir == profile_cfg->cir) && /**< @brief C令牌桶添加速率(0~X, X Gbps/64kbps),最小值为64Kbps,步长为64Kbps*/ + (profile->profile_cfg.cbs == profile_cfg->cbs) && /**< @brief C桶桶深(XM),配置范围为0~XMByte-1,步长为1Byte*/ + (profile->profile_cfg.eir == profile_cfg->eir) && /**< @brief E令牌桶添加速率(0~X, XGbps/64kbps),最小值为64Kbps,步长为64Kbps*/ + (profile->profile_cfg.ebs == profile_cfg->ebs)) /**< @brief E桶桶深(XM),配置范围为0~XMByte-1,步长为1Byte*/ + { + *profile_id = profile->profile_id; + PLCR_LOG_INFO("profile_id = %d\n", *profile_id); + + return 0; + } + } + } + + /* 未搜索到匹配项*/ + return -ERANGE; +} + +/* +函数功能:为flowid申请一个xarray成员 +入参: + ---pf_dev : pf设备结构体 + ---car_type : plcr CAR层级,一级,二级或三级 + ---flow_id : 作为xarray的索引 +返回值:返回创建的zxdh_plcr_flow *指针 +*/ +int32_t zxdh_plcr_req_flow(struct zxdh_pf_device *pf_dev, + E_PLCR_CAR_TYPE car_type, + uint16_t flow_id, + struct zxdh_plcr_flow **flow) +{ + struct zxdh_plcr_flow *flow_old; + struct xarray *xarray_flow = &(pf_dev->plcr_table.plcr_flows[car_type]); + + PLCR_FUNC_DBG_ENTER(); + + /*1. malloc一个flow结构体*/ + *flow = kzalloc(sizeof(struct zxdh_plcr_flow), GFP_KERNEL); + if (unlikely(NULL == *flow)) + { + PLCR_LOG_ERR("failed to kzalloc \n"); + return -EINVAL; + } + + /*2. 存储到xarray*/ + flow_old = xa_store(xarray_flow, flow_id, *flow, GFP_KERNEL); + if (flow_old) + { + /* 正常情况下,这里应该都是空的*/ + kfree(flow_old); + } + + return 0; +} + +/* +函数功能:释放一个xarray下的flowid成员 +入参: + ---pf_dev : pf设备结构体 + ---car_type : plcr CAR层级,一级,二级或三级 + ---flow_id : 作为xarray的索引 +返回值:返回创建的zxdh_plcr_flow *指针 +*/ +int32_t zxdh_plcr_release_flow(struct zxdh_pf_device *pf_dev, + E_PLCR_CAR_TYPE car_type, + uint16_t flow_id) +{ + struct zxdh_plcr_flow *flow; + struct xarray *xarray_flow = &(pf_dev->plcr_table.plcr_flows[car_type]); + + PLCR_FUNC_DBG_ENTER(); + + /*1. 检查xarray里是否有该flow*/ + flow = xa_load(xarray_flow, flow_id); + if (NULL == flow) + { + PLCR_LOG_ERR("failed to release an invalid flow_id=%d\n", flow_id); + return EINVAL; + } + + /*2. 从xarray删除该成员*/ + xa_erase(xarray_flow, flow_id); + + /*3. 释放flow*/ + kfree(flow); + + return 0; +} + +/* +函数功能:更新flow的成员信息 +入参: + ---flow : xarray的成员 + ---vport : + ---max_rate : + ---min_rate : +返回值:无 +*/ +void zxdh_plcr_update_flow(struct zxdh_plcr_flow *flow, + uint16_t vport, + uint32_t max_rate, + uint32_t min_rate) +{ + flow->vport = vport; + flow->max_rate = max_rate; + flow->min_rate = min_rate; +} + +/* +函数功能:申请一个指定CAR的限速模板 +入参: + ---pf_dev : pf设备结构体 + ---car_type : plcr CAR层级,一级,二级或三级 + ---vport : vf端口号 + ---profile_id_out : 返回申请到的限速模板的profile_id +返回值:成功返回0,失败返回其它值 +*/ +int zxdh_plcr_req_profile(struct zxdh_pf_device *pf_dev, + E_PLCR_CAR_TYPE car_type, + uint16_t *profile_id_out) +{ + int rtn = 0; + struct zxdh_plcr_profile *profile; + struct zxdh_plcr_profile *profile_old; + struct xarray *xarray_profile = &(pf_dev->plcr_table.plcr_profiles[car_type]); + uint16_t profile_id = 0; + uint64_t cred_id = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = pf_dev->slot_id; + pf_info.vport = pf_dev->vport; + + PLCR_FUNC_DBG_ENTER(); + + /*在指定的CAR申请一个新的限速模板*/ + rtn = dpp_car_profile_id_add(&pf_info, (uint32_t)car_type, &cred_id); + if (rtn) + { + /*判断消息交互是否正常*/ + PLCR_LOG_ERR("failed to request a new profile\n"); + return -EINVAL; + } + + /*判断riscv是否成功返回了有效的profile:bit[56 - 63]为0标识成功,为1标识失败*/ + if (0 != ((cred_id >> 56) & 0xFF)) + { + PLCR_LOG_ERR("failed to request a new profile\n"); + return -EINVAL; + } + + /*提取profile id*/ + profile_id = PROFILE_ID(cred_id); + *profile_id_out = profile_id; + PLCR_LOG_INFO("dpp_car_profile_id_add: pf_info.vport = 0x%x, car_type = %d, profile_id = %d, cred_id = 0x%llx\n", pf_info.vport, car_type, profile_id, cred_id); + + /*申请一个限速模板结构体,保存限速模板信息*/ + profile = kzalloc(sizeof(struct zxdh_plcr_profile), GFP_KERNEL); + if (unlikely(NULL == profile)) + { + dpp_car_profile_id_delete(&pf_info, (uint32_t)car_type, cred_id); + PLCR_LOG_ERR("failed to kzalloc profile\n"); + + return -EINVAL; + } + profile->ref_cnt = 0; + profile->max_rate = 0; + profile->min_rate = 0; + profile->cred_id = cred_id; + profile->profile_id = profile_id; + profile->vport = pf_dev->vport; + + /*将申请到的限速模板资源存储起来*/ + profile_old = xa_store(xarray_profile, profile_id, profile, GFP_KERNEL); + if (profile_old) //正常情况下,这里应该都是空的 + { + PLCR_LOG_ERR("failed to unreachable branch\n"); + kfree(profile_old); + } + + + return rtn; +} + +/* +函数功能:释放一个指定CAR的限速模板 +入参: + ---pf_dev : pf设备结构体 + ---car_type : plcr CAR层级,一级,二级或三级 + ---Profile_id : 限速模板的profile_id +返回值:成功返回0,失败返回其它值 +*/ +int zxdh_plcr_release_profile(struct zxdh_pf_device *pf_dev, + E_PLCR_CAR_TYPE car_type, + uint16_t profile_id) +{ + int rtn = 0; + struct xarray *xarray_profile = &(pf_dev->plcr_table.plcr_profiles[car_type]); + struct zxdh_plcr_profile *profile; + DPP_PF_INFO_T pf_info = {0}; + + PLCR_FUNC_DBG_ENTER(); + + /*判断是有是有效成员*/ + profile = xa_load(xarray_profile, profile_id); + if (NULL == profile) + { + PLCR_LOG_ERR("failed to release an invalid profile=%d\n", profile_id); + return EINVAL; + } + + /*如果引用计数为0,则可以释放所有资源*/ + if (0 == profile->ref_cnt) + { + pf_info.slot = pf_dev->slot_id; + pf_info.vport = profile->vport; + PLCR_LOG_INFO("dpp_car_profile_id_delete: pf_info.vport = 0x%x, car_type = %d, profile_id = %d, cred_id = 0x%llx\n", pf_info.vport, car_type, profile_id, profile->cred_id); + + /*归还限速模板资源(注意,引用计数为0表示没有关联的flow了)*/ + rtn = dpp_car_profile_id_delete(&pf_info, car_type, profile->cred_id); + if (rtn) + { + PLCR_LOG_ERR("failed to call dpp_car_profile_id_delete, car_type=%d,profile_id=%d)\n", car_type, profile_id); + rtn = EINVAL; + } + + /*删除xarray中的元素*/ + xa_erase(xarray_profile, profile_id); + + /*释放profile指针*/ + kfree(profile); + } + + /*如果引用计数不为0,就不释放任何资源*/ + return rtn; +} + +/* +函数功能:内核态使用的接口,根据car_type & is_byte_rate_limit & max_rate & min_rate 这4个参数生成限速模板配置参数 + 内核态下各限速场景使用的参数应该是固定的,我们自己根据这4个参数生成完整的结构体参数:DPP_STAT_CAR_PROFILE_CFG_T + 用户态的场景下,会通过消息直接传递过来,不需要组装 +入参: + ---is_pkt_mode: 包限速还是字节限速 + ---car_type : plcr CAR层级,一级,二级或三级 + ---is_byte_rate_limit : 是否是字节限速,为后续包限速预留参数,这个值传参的时候暂时固定为1, + 后续可能会有一个全局变量进行指示,会提供对应的接口来获取这个入参值进行传递 + ---max_rate : 用户指定的最大限速值 + ---min_rate : 用户指定的最小承诺速率 + ---profile_cfg : 返回值,填充好的限速模板参数 +返回值:成功返回0,失败返回其它值 +*/ +static int zxdh_plcr_gen_profile(struct zxdh_pf_device *pf_dev, + E_RATE_LIMIT_PKT_BYTE is_pkt_mode, + E_PLCR_CAR_TYPE car_type, + uint32_t max_rate, + uint32_t min_rate, + DPP_STAT_CAR_PROFILE_CFG_T *profile_cfg) +{ + int rtn = 0; + int pri = 0; + uint32_t cbs = 0; + uint32_t ebs = 0; + DPP_STAT_CAR_PKT_PROFILE_CFG_T *pkt_profile_cfg = (DPP_STAT_CAR_PKT_PROFILE_CFG_T *)(profile_cfg); + + PLCR_FUNC_DBG_ENTER(); + + //入参检测 + if ((E_RATE_LIMIT_PACKET == is_pkt_mode) && (E_PLCR_CAR_A != car_type)) + { + PLCR_LOG_ERR("failed and only CAR A supports packet rate limit\n"); + rtn = EINVAL; + } + + /*2. 重新生成参数*/ + + /*填充限速模板的参数,准备将这些参数配置到寄存器*/ + memset(profile_cfg, 0, sizeof(*profile_cfg)); + if (E_RATE_LIMIT_BYTE == is_pkt_mode) + { + profile_cfg->pkt_sign = E_RATE_LIMIT_BYTE; + profile_cfg->cf = 1; //溢出标志,默认使能 + + if (pf_dev->plcr_table.burst_size) + { + cbs = pf_dev->plcr_table.burst_size; + ebs = pf_dev->plcr_table.burst_size; + } + else + { + rtn = zxdh_plcr_get_cbs(car_type, E_RATE_LIMIT_BYTE, min_rate, &cbs); + PLCR_COMM_ASSERT(rtn); + rtn = zxdh_plcr_get_cbs(car_type, E_RATE_LIMIT_BYTE, max_rate, &ebs); + PLCR_COMM_ASSERT(rtn); + } + + profile_cfg->cbs = cbs; + profile_cfg->ebs = ebs; + profile_cfg->random_disc_c = 0; + profile_cfg->random_disc_e = 0; + + if (E_PLCR_CAR_A == car_type) + { + profile_cfg->cm = 0; //色盲模式 + profile_cfg->cd = 0; //0: srTCM,单速率;1:双速率 + profile_cfg->cir = zxdh_plcr_user_maxrate_2_reg(max_rate); + profile_cfg->eir = 0; + } + else if (E_PLCR_CAR_B == car_type) + { + profile_cfg->cm = 0; //色盲模式,todo:根据实际测试情况来调整 + profile_cfg->cd = 1; //0: srTCM,单速率;1:双速率 + profile_cfg->cir = zxdh_plcr_user_maxrate_2_reg(min_rate); + profile_cfg->eir = zxdh_plcr_user_maxrate_2_reg(max_rate); + } + else if (E_PLCR_CAR_C == car_type) + { + //todo:端口组限速,待调试确认 + profile_cfg->cm = 1; //色敏模式,todo:根据实际测试情况来调整 + profile_cfg->cd = 0; //0: srTCM,单速率;1:双速率 + profile_cfg->cir = zxdh_plcr_user_maxrate_2_reg(max_rate); + profile_cfg->eir = 0; + } + + for (pri = 0; pri < DPP_CAR_PRI_MAX; pri ++) + { + profile_cfg->c_pri[pri] = 0; + profile_cfg->e_green_pri[pri] = 0; + profile_cfg->e_yellow_pri[pri] = 0; + } + + PLCR_LOG_INFO("cir = 0x%x, eir = 0x%x, cbs = 0x%x, ebs = 0x%x\n", profile_cfg->cir, profile_cfg->eir, profile_cfg->cbs, profile_cfg->ebs); + } + else + { + pkt_profile_cfg->pkt_sign = E_RATE_LIMIT_PACKET; + pkt_profile_cfg->cbs = PLCR_CAR_PROFILE_GENERAL_CBS; + pkt_profile_cfg->cir = max_rate; + + PLCR_LOG_INFO("cir = 0x%x, cbs = 0x%x\n", pkt_profile_cfg->cir, pkt_profile_cfg->cbs); + } + + return rtn; +} + +/* +函数功能:更新限速模板参数 +入参: + ---profile_cfg: 限速模板参数结构体 + ---Profile_id : 限速模板的profile_id +返回值:无 +*/ +static void zxdh_plcr_update_profile(DPP_STAT_CAR_PROFILE_CFG_T *profile_cfg, u_int16_t profile_id) +{ + PLCR_FUNC_DBG_ENTER(); + + /*1. 重新生成参数*/ + profile_cfg->profile_id = profile_id; +} + +/* +函数功能:将限速模板参数,存储到profile下 +入参: + ---pf_dev : pf设备结构体 + ---car_type : plcr CAR层级,一级,二级或三级 + ---max_rate : 用户原始的限速速率,单位是Mbit/s + ---min_rate : 用户原始的限速速率,单位是Mbit/s + ---profile_cfg: 要存储到profile中的,限速模板参数 +返回值:成功返回0,失败返回其它值 +*/ +int zxdh_plcr_store_profile(struct zxdh_pf_device *pf_dev, + E_PLCR_CAR_TYPE car_type, + uint32_t user_max_rate, + uint32_t user_min_rate, + DPP_STAT_CAR_PROFILE_CFG_T *profile_cfg) +{ + int rtn = 0; + uint16_t profile_id; + struct zxdh_plcr_profile *profile; + struct xarray *xarray_profile = &(pf_dev->plcr_table.plcr_profiles[car_type]); + + PLCR_FUNC_DBG_ENTER(); + + /*1. 从限速模板结构体,获取profile_id*/ + profile_id = profile_cfg->profile_id; + + /*2. 从xarray获取profile*/ + profile = xa_load(xarray_profile, profile_id); + if (NULL == profile) + { + PLCR_LOG_ERR("failed to specify an invalid profile, profile_id=%d\n", profile_id); + return -EINVAL; + } + + /*3. 更新profile的参数*/ + profile->max_rate = user_max_rate; + profile->min_rate = user_min_rate; + + /*4. 将完整的限速模板参数,存储到profile结构体下*/ + memcpy(&profile->profile_cfg, profile_cfg, sizeof(DPP_STAT_CAR_PROFILE_CFG_T)); + + return rtn; +} + +/* +函数功能:将限速模板参数,配置到plcr寄存器中去 +入参: + ---pf_dev : pf设备结构体 + ---car_type : plcr CAR层级,一级,二级或三级 + ---profile_cfg: 要配置个plcr寄存器的限速模板参数 +返回值:成功返回0,失败返回其它值 +*/ +int zxdh_plcr_cfg_profile(struct zxdh_pf_device *pf_dev, + E_PLCR_CAR_TYPE car_type, + DPP_STAT_CAR_PROFILE_CFG_T *profile_cfg) +{ + int rtn = 0; + uint16_t profile_id = 0; + uint32_t pkt_sign = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = pf_dev->slot_id; + pf_info.vport = pf_dev->vport; + + PLCR_FUNC_DBG_ENTER(); + + /*1. 根据限速模板参数,获取profile_id*/ + profile_id = profile_cfg->profile_id; + + /*2. 根据限速模板参数,获取包/字节模式*/ + pkt_sign = profile_cfg->pkt_sign; + + /*3. 将限速模板参数,配置到寄存器中去*/ + rtn = dpp_car_profile_cfg_set(&pf_info, (uint32_t)car_type, pkt_sign, profile_id, profile_cfg); + if (rtn) + { + PLCR_LOG_ERR("failed to configure the profile registers, car_type=%d,profile_id=%d\n", car_type, profile_id); + return -EINVAL; + } + PLCR_LOG_INFO("dpp_car_profile_cfg_set: pf_info.vport = 0x%x, car_type = %d, profile_id = %d, pkt_sign = %d\n", pf_info.vport, car_type, profile_id, pkt_sign); + + return rtn; +} + +/* +函数功能:获取寄存器中限速模板的参数 +入参: + ---pf_dev : pf设备结构体 + ---car_type : plcr CAR层级,一级,二级或三级 + ---profile_cfg: 要配置个plcr寄存器的限速模板参数 +返回值:成功返回0,失败返回其它值 +*/ +int zxdh_plcr_get_profile(struct zxdh_pf_device *pf_dev, + E_PLCR_CAR_TYPE car_type, + uint32_t pkt_sign, + uint16_t profile_id, + DPP_STAT_CAR_PROFILE_CFG_T *profile_cfg) +{ + int rtn = 0; + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = pf_dev->slot_id; + pf_info.vport = pf_dev->vport; + + PLCR_FUNC_DBG_ENTER(); + + /*3. 将限速模板参数,配置到寄存器中去*/ + PLCR_LOG_INFO("dpp_car_profile_cfg_get: pf_info.vport = 0x%x, car_type = %d, profile_id = %d, pkt_sign = %d\n", pf_info.vport, car_type, profile_id, pkt_sign); + rtn = dpp_car_profile_cfg_get(&pf_info, car_type, pkt_sign, profile_id, profile_cfg); + if (rtn) + { + PLCR_LOG_ERR("failed to call dpp_car_profile_cfg_get(), car_type=%d,profile_id=%d\n", car_type, profile_id); + return -EINVAL; + } + + return rtn; +} + +/* +函数功能:配置指定CAR的限速模板:考虑plcr三级CAR能共享接口 +入参: + ---pf_dev : pf设备结构体 + ---car_type : plcr CAR层级,一级,二级或三级 + ---flowid : 指定CAR的flow编号 + ---profile_id : 申请到的指定CAR层级的profile资源的id +返回值:成功返回0,失败返回其它值 +*/ +static int zxdh_plcr_bind_flow_profile(struct zxdh_pf_device *pf_dev, + E_PLCR_CAR_TYPE car_type, + uint32_t flowid, + uint16_t profile_id) +{ + int rtn = 0; + struct zxdh_plcr_flow *plcr_flow; + struct xarray *xarray_flow = &(pf_dev->plcr_table.plcr_flows[car_type]); + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = pf_dev->slot_id; + pf_info.vport = pf_dev->vport; + + PLCR_FUNC_DBG_ENTER(); + + /*1. 获取plcr*/ + plcr_flow = xa_load(xarray_flow, flowid); + if (NULL == plcr_flow) + { + PLCR_LOG_ERR("failed to xa_load an invalid element,car_type=%d,flowid=%d,profile_id=%d\n", car_type, flowid, profile_id); + return -EINVAL; + } + + /*2. 调用接口,将flow与profile进行绑定*/ + PLCR_LOG_INFO("dpp_car_queue_cfg_set: pf_info.vport = 0x%x, car_type = %d, flowid = %d, profile_id = %d\n", pf_info.vport, car_type, flowid, profile_id); + rtn = dpp_car_queue_cfg_set(&pf_info, (uint32_t)car_type, flowid, DROP_DISABLE, PLCR_ENABLE, profile_id); + if (rtn) + { + PLCR_LOG_ERR("failed to call dpp_car_queue_cfg_set(),car_type=%d,flowid=%d,profile_id=%d\n", car_type, flowid, profile_id); + return -EINVAL; + } + PLCR_LOG_INFO("Bind profile_%d to flow_%d complete\n", profile_id, flowid); + + /*3. 将profile_id更新到plcr中*/ + plcr_flow->profile_id = profile_id; + + return rtn; +} + +/* +函数功能:解除flow和profile之间的绑定 & 删除xarray中的元素 & 释放flow指针 +入参: + ---pf_dev : pf设备结构体 + ---car_type : plcr CAR层级,一级,二级或三级 + ---flowid : 指定CAR的flow编号 + ---profile_id : 申请到的指定CAR层级的profile资源的id +返回值:成功返回0,失败返回其它值 +*/ +int zxdh_plcr_unbind_flow_profile(struct zxdh_pf_device *pf_dev, + E_PLCR_CAR_TYPE car_type, + uint32_t flowid, + uint16_t profile_id) +{ + int rtn = 0; + struct zxdh_plcr_flow *plcr_flow; + struct xarray *xarray_flow = &(pf_dev->plcr_table.plcr_flows[car_type]); + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = pf_dev->slot_id; + pf_info.vport = pf_dev->vport; + + PLCR_FUNC_DBG_ENTER(); + + /*1. 检查flow是否与profile是否已绑定*/ + plcr_flow = xa_load(xarray_flow, flowid); + if (NULL == plcr_flow) + { + PLCR_LOG_ERR("xa_load an invalid element, flowid=%d,profile_id=%d\n", flowid, profile_id); + return -EINVAL; + } + if (profile_id != plcr_flow->profile_id) + { + PLCR_LOG_ERR("xa_load an invalid element, profile_id=%d,plcr_flow->profile_id=%d\n", profile_id, plcr_flow->profile_id); + return -EINVAL; + } + + /*调用接口,将flow与profile进行解除绑定:配置flow,将其不要指向profile*/ + PLCR_LOG_INFO("dpp_car_queue_cfg_set: pf_info.vport = 0x%x, car_type = %d, flowid = %d, profile_id = %d\n", pf_info.vport, car_type, flowid, profile_id); + rtn = dpp_car_queue_cfg_set(&pf_info, (uint32_t)car_type, flowid, DROP_DISABLE, PLCR_DISABLE, profile_id); + if (rtn) + { + PLCR_LOG_ERR("failed to call dpp_car_queue_cfg_set(),car_type=%d,flowid=%d,profile_id=%d\n", car_type, flowid,profile_id); + return rtn; + } + + return rtn; +} + +int zxdh_plcr_count_up_profile(struct zxdh_pf_device *pf_dev, + E_PLCR_CAR_TYPE car_type, + uint16_t profile_id) +{ + int rtn = 0; + struct zxdh_plcr_profile *plcr_profile; + struct xarray *xarray_profile = &(pf_dev->plcr_table.plcr_profiles[car_type]); + + PLCR_FUNC_DBG_ENTER(); + + plcr_profile = xa_load(xarray_profile, profile_id); + if (NULL == plcr_profile) + { + PLCR_LOG_ERR("failed to load element form xarray_profile, car_type=%d,profile_id=%d\n", car_type, profile_id); + return -EINVAL; + } + + plcr_profile->ref_cnt++; + + return rtn; +} + +int zxdh_plcr_count_down_profile(struct zxdh_pf_device *pf_dev, + E_PLCR_CAR_TYPE car_type, + uint16_t profile_id) +{ + int rtn = 0; + struct zxdh_plcr_profile *plcr_profile; + struct xarray *xarray_profile = &(pf_dev->plcr_table.plcr_profiles[car_type]); + + PLCR_FUNC_DBG_ENTER(); + + plcr_profile = xa_load(xarray_profile, profile_id); + if (NULL == plcr_profile) + { + PLCR_LOG_ERR("failed to load element form xarray_profile, car_type=%d,profile_id=%d\n", car_type, profile_id); + return -EINVAL; + } + + //不能对计数为0的profile进行减操作 + if (0 == plcr_profile->ref_cnt) + { + PLCR_LOG_ERR("failed and plcr_profile->ref_cnt=0\n"); + return -EINVAL; + } + + plcr_profile->ref_cnt--; + + return rtn; +} + +static int zxdh_plcr_get_profile_by_flowid(struct zxdh_pf_device *pf_dev, + E_PLCR_CAR_TYPE car_type, + uint32_t flowid, + struct zxdh_plcr_profile **pplcr_profile) +{ + int rtn = 0; + uint16_t profile_id = 0; + struct zxdh_plcr_profile *plcr_profile; + struct zxdh_plcr_flow *plcr_flow; + struct xarray *xarray_profile = &(pf_dev->plcr_table.plcr_profiles[car_type]); + struct xarray *xarray_flow = &(pf_dev->plcr_table.plcr_flows[car_type]); + + PLCR_FUNC_DBG_ENTER(); + + plcr_flow = xa_load(xarray_flow, flowid); + if (NULL == plcr_flow) + { + PLCR_LOG_ERR("failed to load element form xarray_flow, car_type=%d,flowid=%d\n", car_type, flowid); + return -EINVAL; + } + profile_id = plcr_flow->profile_id; + + plcr_profile = xa_load(xarray_profile, profile_id); + if (NULL == plcr_profile) + { + PLCR_LOG_ERR("failed to load element form xarray_profile,car_type=%d,profile_id=%d\n", car_type, profile_id); + return -EINVAL; + } + + *pplcr_profile = plcr_profile; + + return rtn; +} + +/*******************************下面是新实现的代码*******************************/ +/* +函数功能:将car之间flowid的映射关系存储起来 + +入参: + --- +出参: + --- + +返回值:成功返回0,失败返回其它值 +*/ +int32_t zxdh_plcr_stroe_map(struct zxdh_pf_device *pf_dev, + E_PLCR_CAR_TYPE car_type, + uint32_t flowid, + uint32_t map_flowid) +{ int32_t rtn = 0; + + struct xarray *xarray_map = &(pf_dev->plcr_table.plcr_maps[car_type]); + if((E_PLCR_CAR_A == car_type) || (E_PLCR_CAR_B == car_type)) + { + xa_store(xarray_map, flowid, (void *)(uintptr_t)(FLOWID_2_XARRAY(map_flowid)), GFP_KERNEL); + } + + return rtn; +} + +int32_t zxdh_plcr_clear_map(struct zxdh_pf_device *pf_dev, + E_PLCR_CAR_TYPE car_type, + uint32_t flowid) +{ int32_t rtn = 0; + void * xarray_element; + + struct xarray *xarray_map = &(pf_dev->plcr_table.plcr_maps[car_type]); + if((E_PLCR_CAR_A == car_type) || (E_PLCR_CAR_B == car_type)) + { + xarray_element = xa_load(xarray_map, flowid); + if(NULL != xarray_element) + { + xa_erase(xarray_map, flowid); + } + } + + return rtn; +} + +/* +函数功能:指定前一级的flowid,查询下一级映射的flowid + +入参: + --- +出参: + --- + +返回值:成功返回0,失败返回其它值 +*/ +int32_t zxdh_plcr_get_next_map(struct zxdh_pf_device *pf_dev, + E_PLCR_CAR_TYPE car_type, + uint32_t flowid, + uint32_t *map_flowid) +{ + int32_t rtn = 0; + void * xarray_element; + + struct xarray *xarray_map = &(pf_dev->plcr_table.plcr_maps[car_type]); + if((E_PLCR_CAR_A == car_type) || (E_PLCR_CAR_B == car_type)) + { + xarray_element = xa_load(xarray_map, flowid); + if(NULL == xarray_element) + { + rtn = -EINVAL; + } + else + { + *map_flowid = XARRAY_2_FLOWID((uint32_t)(uintptr_t)xarray_element); + } + } + else + { + rtn = -ERANGE; + } + + return rtn; +} + +/* +函数功能:检查指定的car_type所在的三级car flowid链是否全都没有限速,如果是就进行资源清理 +入参: + ---pf_dev : 设备结构体 + ---vport : 标识vf端口 +场景说明: + 1. 为什么要引入这个接口? + 新的方案引入了mode 0,mode 1,mode 2三种模式; + vport在三级car上有一条完整的flowid映射链; + 用户在解除某一级car指定flowid的限速之后,驱动程序需要检查这个链上是不是没有限速了,且car C是不是处于group 0,如果是这样的话就要切换到模式0; + 2. 切换到模式0的必要性 + 驱动程序中很多限速要需要先判断当前的限速模式; + 如果当前链上已经没有限速,且car C还是处于group 0,就必须切换回模式0,这也是从模式1和模式2切换回模式0的唯一途径 + 3. 在什么时候需要调用这个接口? + 用户在解除某一级car指定flowid的限速之后,需要调用这个接口。 + 4.流程: + 3.1 如果是对car C的group解除限速,说明group是非0的,函数直接返回(废弃,因为有可能是将vf端口从非0group移动到group0) + 3.2 根据vport得到car B的flowid + 3.3 根据car B的flowid,查询得到car c的flowid + 3.4.1 如果car C的flowid处于group 0,就进行模式切换 + 3.4.2 如果car C的flowid不处于group 0,就不进行模式切换,函数返回 + 5.plcr_maps是否需要清除? + 这个资源不需要清除:只有本函数会用到这个记录,且进行限速配置的时候会重新进行映射,且存储的成员不是动态分配的内存,没有必要清理资源; + +返回值:成功返回0,失败返回其它值 +*/ +int zxdh_plcr_check_release_flow_chain(struct zxdh_pf_device *pf_dev, uint16_t vport) +{ + int rtn = 0; + E_PLCR_CAR_TYPE car_type; + uint32_t flag1 = 0; + uint32_t flag2 = 0; + unsigned long flow_index; + uint32_t flowid_car_B; + uint32_t flowid_car_C; + struct zxdh_plcr_flow *flow; + struct xarray *xarray_flow; + + //统计car A和car B上是否有限速 + for(car_type = E_PLCR_CAR_A, flag1 = 0; car_type < E_PLCR_CAR_C; car_type++) + { + xarray_flow = &(pf_dev->plcr_table.plcr_flows[car_type]); + + xa_for_each_range(xarray_flow, flow_index, flow, 0, gaudPlcrCarxFlowIdNum[car_type]) + { + if(vport == flow->vport) + { + flag1 = 1; + break; + } + } + if(1 == flag1) + { + break; + } + } + + //检查是否处于group 0 + if(0 == flag1) + { + //如果是vf,就要检查group是否为0 + if (VF_ACTIVE(vport)) + { + flowid_car_B = VQM_VFID(vport) * 2; + rtn = zxdh_plcr_get_next_map(pf_dev, E_PLCR_CAR_B, flowid_car_B, &flowid_car_C); + PLCR_LOG_INFO("flowid_car_B = 0x%x\n", flowid_car_B); + PLCR_LOG_INFO("flowid_car_C = 0x%x\n", flowid_car_C); + PLCR_COMM_ASSERT(rtn); + + //4个EP * 8PF * 2收发方向,每个pf占32个car c flowid,前面2个映射到group 0 + if (0 == (flowid_car_C%(PLCR_CAR_C_FLOWIDS_PER_PF))) + { + flag2 = 1; + } + } + else + { + //如果是pf(队列限速),就没有car B和Car C + flag2 = 1; + } + + } + + if(0 != flag2) + { + //执行清理操作 + + //1.清理级间映射 + // for (index=0; indexplcr_table.plcr_flows[car_type]); + struct zxdh_plcr_flow *plcr_flow = xa_load(xarray_flowid, flowid); + struct zxdh_plcr_profile *profile_old = NULL; + + PLCR_FUNC_DBG_ENTER(); + + /*1. 如果二次修改的限速值和原来的一样,这个配置操作无意义,直接结束*/ + if (E_PLCR_CAR_A == car_type) + { + if (plcr_flow->max_rate == max_rate) + { + PLCR_LOG_ERR("failed and invalid max_rate=%d on flowid=%d\n", max_rate, flowid); + PLCR_COMM_ASSERT(PLCR_MODIFY_RATE_LIMIT_INVALID_OPERATION_ERR); + } + } + else if((E_PLCR_CAR_B == car_type) || (E_PLCR_CAR_C == car_type)) + { + if ((plcr_flow->max_rate == max_rate) && (plcr_flow->min_rate == min_rate)) + { + PLCR_LOG_ERR("failed and invalid max_rate=%d, min_rate=%d on flowid=%d\n", max_rate, min_rate, flowid); + PLCR_COMM_ASSERT(PLCR_MODIFY_RATE_LIMIT_INVALID_OPERATION_ERR); + } + } + + /*2. 根据新的限速值,生成限速模板参数*/ + rtn = zxdh_plcr_gen_profile(pf_dev, is_pkt_mode, car_type, max_rate, min_rate, &profile_cfg); + PLCR_COMM_ASSERT(rtn); + + /*3. 获取原来关联的限速模板*/ + rtn = zxdh_plcr_get_profile_by_flowid(pf_dev, car_type, flowid, &profile_old); + PLCR_COMM_ASSERT(rtn); + + /*3. 先查询有没有相同速率的限速模板*/ + rtn = zxdh_plcr_match_profile(pf_dev, car_type, &profile_cfg, &profile_id); + if (rtn) + { + /*3.1 没有找到能共享的限速模板*/ + + /*3.2 原来的模板不是共享模板:直接修改限速模板的限速值*/ + if (1 == profile_old->ref_cnt) + { + /*3.2.1 将profile_id更新到限速模板参数中去*/ + zxdh_plcr_update_profile(&profile_cfg, profile_old->profile_id); + + /*3.2.2 将限速模板的参数,配置到寄存器中去*/ + rtn = zxdh_plcr_cfg_profile(pf_dev, car_type, &profile_cfg); + PLCR_COMM_ASSERT(rtn); + + /*3.2.3 将限速模板配置参数,保存到zxdh_plcr_profile结构体*/ + rtn = zxdh_plcr_store_profile(pf_dev, car_type, max_rate, min_rate, &profile_cfg); + PLCR_COMM_ASSERT(rtn); + + /* 更新flow中记录的用户原始限速值,todo:是否使用bind函数,要考虑后期在哪里加锁*/ + zxdh_plcr_update_flow(plcr_flow, plcr_flow->vport, max_rate, min_rate); + + /*这种情况只修改限速模板的寄存器,flowid先前已经与profile绑定了*/ + return rtn; + } + + /*3.3 原来的限速模板是共享模板,所以要申请新的限速模板*/ + rtn = zxdh_plcr_req_profile(pf_dev, car_type, &profile_id); + PLCR_COMM_ASSERT(rtn); + + /*3.4 将profile_id更新到限速模板参数中去*/ + zxdh_plcr_update_profile(&profile_cfg, profile_id); + + /*3.5 将限速模板的参数,配置到寄存器中去*/ + rtn = zxdh_plcr_cfg_profile(pf_dev, car_type, &profile_cfg); + if (rtn) + { + PLCR_LOG_ERR("failed to call zxdh_plcr_cfg_profile()\n"); + goto err4; + } + + /*3.6 将限速模板配置参数,保存到zxdh_plcr_profile结构体*/ + rtn = zxdh_plcr_store_profile(pf_dev, car_type, max_rate, min_rate, &profile_cfg); + if (rtn) + { + PLCR_LOG_ERR("failed to call zxdh_plcr_store_profile()\n"); + goto err4; + } + + /*3.7 接下来的绑定流程,和下面是共享的*/ + } + /*4. 查询到共享的限速模板:直接进行绑定即可*/ + rtn = zxdh_plcr_bind_flow_profile(pf_dev, car_type, flowid, profile_id); + if (rtn) + { + PLCR_LOG_ERR("failed to call zxdh_plcr_bind_flow_profile()\n"); + goto err4; + } + + /*5. 更新flow中记录的用户原始限速值*/ + zxdh_plcr_update_flow(plcr_flow, plcr_flow->vport, max_rate, min_rate); + + /*6. 新模板使用计数+1*/ + rtn = zxdh_plcr_count_up_profile(pf_dev, car_type, profile_id); + if (rtn) + { + PLCR_LOG_ERR("failed to call zxdh_plcr_count_up_profile()\n"); + goto err4; + } + + /*7. 旧的计数模板-1*/ + rtn = zxdh_plcr_count_down_profile(pf_dev, car_type, profile_old->profile_id); + if (rtn) + { + PLCR_LOG_ERR("failed to call zxdh_plcr_count_up_profile()\n"); + goto err4; + } + + zxdh_plcr_release_profile(pf_dev, car_type, profile_old->profile_id); + + return rtn; + +err4: + zxdh_plcr_release_profile(pf_dev, car_type, profile_id); + return rtn; +} + +int zxdh_plcr_remove_rate_limit(struct zxdh_pf_device *pf_dev, + E_PLCR_CAR_TYPE car_type, + uint32_t flowid) +{ + int rtn = 0; + struct zxdh_plcr_profile *profile_old = NULL; + + PLCR_FUNC_DBG_ENTER(); + + PLCR_LOG_INFO("car_type=%d,flowid=%d\n",car_type,flowid); + + /* 获取原来关联的限速模板*/ + rtn = zxdh_plcr_get_profile_by_flowid(pf_dev, car_type, flowid, &profile_old); + PLCR_COMM_ASSERT(rtn); + + /*解除绑定*/ + rtn = zxdh_plcr_unbind_flow_profile(pf_dev, car_type, flowid, profile_old->profile_id); + //PLCR_COMM_ASSERT(rtn); + + /*限速模板引用计数 -1*/ + rtn = zxdh_plcr_count_down_profile(pf_dev, car_type, profile_old->profile_id); + //PLCR_COMM_ASSERT(rtn); + + /*释放限速模板:如果引用计数为0,归还模板资源 & 删除xarray元素 & 释放profile指针*/ + rtn = zxdh_plcr_release_profile(pf_dev, car_type, profile_old->profile_id); + //PLCR_COMM_ASSERT(rtn); + + /*释放掉flow*/ + rtn = zxdh_plcr_release_flow(pf_dev, car_type, flowid); + //PLCR_COMM_ASSERT(rtn); + + return rtn; +} + +void zxdh_plcr_count_profiles(struct zxdh_pf_device *pf_dev) +{ + struct zxdh_plcr_profile *profile; + unsigned long index; + uint32_t count = 0; + E_PLCR_CAR_TYPE car_type; + + PLCR_FUNC_DBG_ENTER(); + + for (car_type = E_PLCR_CAR_A; car_type < E_PLCR_CAR_NUM; car_type ++) + { + count = 0; + xa_for_each_range(&(pf_dev->plcr_table.plcr_profiles[car_type]), index, profile, 0, gaudPlcrCarxProfileNum[car_type]) + { + count++; + } + PLCR_LOG_INFO("car_type = %d, profiles_num = %d\n", car_type, count); + } +} + +int zxdh_plcr_set_rate_limit(struct zxdh_pf_device *pf_dev, + E_RATE_LIMIT_PKT_BYTE is_pkt_mode, + E_PLCR_CAR_TYPE car_type, + uint16_t vport, + uint32_t flowid, + uint32_t max_rate, + uint32_t min_rate) +{ + int rtn = 0; + struct xarray *xarray_flow = &(pf_dev->plcr_table.plcr_flows[car_type]); + struct zxdh_plcr_flow *flow = NULL; + + PLCR_FUNC_DBG_ENTER(); + + /*1. 判断该队列先前是否已经配置过限速值*/ + flow = xa_load(xarray_flow, flowid); + if (NULL == flow) + { + /*1.1 初次配置限速值*/ + rtn = zxdh_plcr_create_rate_limit(pf_dev, is_pkt_mode, car_type, vport, flowid, max_rate, min_rate); + PLCR_COMM_ASSERT(rtn); + } + else if ((max_rate != 0) || (min_rate != 0)) + { + /*1.2 修改限速值*/ + rtn = zxdh_plcr_modify_rate_limit(pf_dev, is_pkt_mode, car_type, flowid, max_rate, min_rate); + PLCR_COMM_ASSERT(rtn); + } + else + { + /*1.3.1 解除限速:即,第二次配置,且max_rate=0,表示用户要解除限速*/ + rtn = zxdh_plcr_remove_rate_limit(pf_dev, car_type, flowid); + PLCR_COMM_ASSERT(rtn); + + zxdh_plcr_check_release_flow_chain(pf_dev, vport); + + //不是错误码,用来标记是进行了解除限速的操作 + rtn = PLCR_REMOVE_RATE_LIMIT; + } + + zxdh_plcr_count_profiles(pf_dev); + + return rtn; +} + +E_RATE_LIMIT_MODE g_plcr_mode[PF_VQM_VFID_OFFSET + 32] = {0xff}; +int zxdh_plcr_set_mode(struct zxdh_pf_device *pf_dev, uint16_t vport, E_RATE_LIMIT_MODE mode) +{ + uint16_t vfid = VQM_VFID(vport); +#if 1 + g_plcr_mode[vfid] = mode; +#else + //todo:设置vf端口当前的模式 +#endif + PLCR_LOG_INFO("zxdh_plcr_set_mode():g_plcr_mode[%d]=%d\n", vfid, g_plcr_mode[vfid]); + + return 0; +} + +int zxdh_plcr_get_mode(struct zxdh_pf_device *pf_dev, uint16_t vport, E_RATE_LIMIT_MODE *mode) +{ + uint16_t vfid = VQM_VFID(vport); + +#if 1 + *mode = g_plcr_mode[vfid]; +#else + //todo:获取vf端口当前的模式 +#endif + PLCR_LOG_INFO("zxdh_plcr_get_mode():g_plcr_mode[%d]=%d\n", vfid, g_plcr_mode[vfid]); + + return 0; +} + +int zxdh_plcr_show_rate_limit_paras(zxdh_plcr_rate_limit_paras *rate_limit_paras) +{ + PLCR_LOG_INFO("rate_limit_paras->req_type = 0x%x\n", rate_limit_paras->req_type); + PLCR_LOG_INFO("rate_limit_paras->direction = 0x%x\n", rate_limit_paras->direction); + PLCR_LOG_INFO("rate_limit_paras->mode = 0x%x\n", rate_limit_paras->mode); + PLCR_LOG_INFO("rate_limit_paras->max_rate = 0x%x\n", rate_limit_paras->max_rate); + PLCR_LOG_INFO("rate_limit_paras->min_rate = 0x%x\n", rate_limit_paras->min_rate); + PLCR_LOG_INFO("rate_limit_paras->queue_id = 0x%x\n", rate_limit_paras->queue_id); + PLCR_LOG_INFO("rate_limit_paras->vf_idx = 0x%x\n", rate_limit_paras->vf_idx); + PLCR_LOG_INFO("rate_limit_paras->vfid = 0x%x\n", rate_limit_paras->vfid); + PLCR_LOG_INFO("rate_limit_paras->vport = 0x%x\n", rate_limit_paras->vport); + PLCR_LOG_INFO("rate_limit_paras->group_id = 0x%x\n", rate_limit_paras->group_id); + + return 0; +} + +int zxdh_plcr_check_req_type(struct zxdh_pf_device *pf_dev, E_RATE_LIMIT_MODE mode, zxdh_plcr_rate_limit_paras *rate_limit_paras, E_RATE_LIMIT_REQ_TYPE *req_type) +{ + PLCR_FUNC_DBG_ENTER(); + + //队列字节限速 + if ((rate_limit_paras->req_type == E_RATE_LIMIT_REQ_QUEUE_BYTE) && + (rate_limit_paras->mode == E_RATE_LIMIT_BYTE) && + ((rate_limit_paras->min_rate != PLCR_INVALID_PARAM) || (rate_limit_paras->max_rate != PLCR_INVALID_PARAM)) && + (rate_limit_paras->direction == E_RATE_LIMIT_TX) && + (rate_limit_paras->vf_idx == PLCR_INVALID_PARAM) && + (rate_limit_paras->group_id == PLCR_INVALID_PARAM) && + (rate_limit_paras->queue_id < PLCR_MAX_QUEUE_PAIRS)) + { + *req_type = E_RATE_LIMIT_REQ_QUEUE_BYTE; + + //mode2模式下不支持队列字节限速 + if(E_RATE_LIMIT_MODE2 == mode) + { + PLCR_LOG_ERR("E_RATE_LIMIT_REQ_QUEUE_BYTE is not supported under E_RATE_LIMIT_MODE2\n"); + return PLCR_GET_REQ_TYPE_INVALID_ERR; + } + + //端口组默认为0 + rate_limit_paras->group_id = 0; + + return 0; + } + //vf端口字节限速 + else if ((rate_limit_paras->req_type == E_RATE_LIMIT_REQ_VF_BYTE) && + (rate_limit_paras->mode == E_RATE_LIMIT_BYTE) && + ((rate_limit_paras->min_rate != PLCR_INVALID_PARAM) || (rate_limit_paras->max_rate != PLCR_INVALID_PARAM)) && + ((rate_limit_paras->direction == E_RATE_LIMIT_RX) || (rate_limit_paras->direction == E_RATE_LIMIT_TX)) && + (rate_limit_paras->group_id == PLCR_INVALID_PARAM) && + (rate_limit_paras->vf_idx != PLCR_INVALID_PARAM)) + { + + //端口组默认为0: + rate_limit_paras->group_id = 0; + + *req_type = E_RATE_LIMIT_REQ_VF_BYTE; + return 0; + } + //vf端口包限速 + else if ((rate_limit_paras->req_type == E_RATE_LIMIT_REQ_VF_PKT) && + (rate_limit_paras->mode == E_RATE_LIMIT_PACKET) && + ((rate_limit_paras->min_rate != PLCR_INVALID_PARAM) || (rate_limit_paras->max_rate != PLCR_INVALID_PARAM)) && + ((rate_limit_paras->direction == E_RATE_LIMIT_RX) || (rate_limit_paras->direction == E_RATE_LIMIT_TX)) && + (rate_limit_paras->group_id == PLCR_INVALID_PARAM) && + (rate_limit_paras->vf_idx != PLCR_INVALID_PARAM)) + { + *req_type = E_RATE_LIMIT_REQ_VF_PKT; + //mode1模式下不支持端口包限速 + if(E_RATE_LIMIT_MODE1 == mode) + { + PLCR_LOG_ERR("E_RATE_LIMIT_REQ_VF_PKT is not supported under E_RATE_LIMIT_MODE1\n"); + return PLCR_GET_REQ_TYPE_INVALID_ERR; + } + + //端口组默认为0 + rate_limit_paras->group_id = 0; + + return 0; + } + //端口组字节限速 + else if ((rate_limit_paras->req_type == E_RATE_LIMIT_REQ_VF_GROUP_BYTE) && + (rate_limit_paras->mode == E_RATE_LIMIT_BYTE) && + ((rate_limit_paras->min_rate != PLCR_INVALID_PARAM) || (rate_limit_paras->max_rate != PLCR_INVALID_PARAM)) && + ((rate_limit_paras->direction == E_RATE_LIMIT_RX) || (rate_limit_paras->direction == E_RATE_LIMIT_TX)) && + (rate_limit_paras->vf_idx == PLCR_INVALID_PARAM) && //不需要flowid级间映射,不需要vf_idx,不需要Vfid + (rate_limit_paras->group_id != PLCR_INVALID_PARAM)) + { + *req_type = E_RATE_LIMIT_REQ_VF_GROUP_BYTE; + return 0; + } + //移动vf端口组 + else if ((rate_limit_paras->req_type == E_RATE_LIMIT_REQ_MOVE_VF_GROUP) && + (rate_limit_paras->mode == PLCR_INVALID_PARAM) && + ((rate_limit_paras->min_rate == PLCR_INVALID_PARAM) && (rate_limit_paras->max_rate == PLCR_INVALID_PARAM)) && + ((rate_limit_paras->direction == E_RATE_LIMIT_RX) || (rate_limit_paras->direction == E_RATE_LIMIT_TX)) && + (rate_limit_paras->vf_idx != PLCR_INVALID_PARAM) && + (rate_limit_paras->group_id != PLCR_INVALID_PARAM)) + { + *req_type = E_RATE_LIMIT_REQ_MOVE_VF_GROUP; + return 0; + } + else + { + //将入参中的请求信息打印出来 + zxdh_plcr_show_rate_limit_paras(rate_limit_paras); + + return PLCR_GET_REQ_TYPE_INVALID_ERR; + } +} + +int32_t zxdh_pf_get_vf_queue_info(struct zxdh_pf_device *pf_dev, int32_t vf_idx, int32_t *phy_queue_num, int32_t *phy_rx_queue, int32_t *phy_tx_queue) +{ + int32_t rtn = 0; + int32_t i; + union zxdh_msg msg = {0}; + int32_t queue_pair_index; + int32_t queue_num; + int32_t queue_pair = 0; + struct dh_core_dev *dh_dev = container_of((void*)pf_dev, struct dh_core_dev, priv); + struct zxdh_en_device *en_dev; + + PLCR_FUNC_DBG_ENTER(); + + en_dev = pf_dev_get_edev(pf_dev); + if (IS_ERR(en_dev)) + return PTR_ERR(en_dev); + + msg.payload.hdr_vf.op_code = ZXDH_PF_GET_VF_QUEUE_INFO; + msg.payload.hdr_vf.dst_pcie_id = FIND_VF_PCIE_ID(pf_dev->pcie_id, vf_idx); + + for(queue_pair_index = 0; queue_pair_index < PLCR_MAX_QUEUE_PAIRS;) + { + msg.payload.plcr_pf_get_vf_queue_info_msg.vir_queue_start = queue_pair_index; + msg.payload.plcr_pf_get_vf_queue_info_msg.vir_queue_num = 16; + + //get rx&tx phy queue + PLCR_LOG_INFO("msg.payload.plcr_pf_get_vf_queue_info_msg.vir_queue_start = 0x%x\n", msg.payload.plcr_pf_get_vf_queue_info_msg.vir_queue_start); + PLCR_LOG_INFO("msg.payload.plcr_pf_get_vf_queue_info_msg.vir_queue_num = 0x%x\n", msg.payload.plcr_pf_get_vf_queue_info_msg.vir_queue_num); + rtn = zxdh_pf_msg_send_cmd(dh_dev, MODULE_PF_BAR_MSG_TO_VF, &msg, &msg, true); + PLCR_COMM_ASSERT(rtn); + + queue_num = msg.reps.plcr_pf_get_vf_queue_info_rsp.phy_queue_num; + for(i = 0; i < queue_num; i++) + { + phy_rx_queue[queue_pair_index*16 + i] = msg.reps.plcr_pf_get_vf_queue_info_rsp.phy_rxq[i]; + phy_tx_queue[queue_pair_index*16 + i] = msg.reps.plcr_pf_get_vf_queue_info_rsp.phy_txq[i]; + + PLCR_LOG_INFO("rxq: 0x%x - 0x%x\n", queue_pair_index*16 + i, phy_rx_queue[queue_pair_index*16 + i]); + PLCR_LOG_INFO("txq: 0x%x - 0x%x\n", queue_pair_index*16 + i, phy_tx_queue[queue_pair_index*16 + i]); + } + + queue_pair += queue_num; + + if(queue_num < 16) + { + *phy_queue_num = queue_pair; + + PLCR_LOG_INFO("phy_queue_num = 0x%x\n", *phy_queue_num); + + return rtn; + } + else + { + queue_pair_index += 16; + } + } + + return rtn; +} + +int zxdh_plcr_map_flowid(struct zxdh_pf_device *pf_dev, E_PLCR_CAR_TYPE car_type, uint32_t flowid, uint32_t map_flowid) +{ + int rtn = 0; + uint32_t map_sp = 0; //priority + union zxdh_msg msg = {0}; + DPP_PF_INFO_T pf_info = {0}; + struct dh_core_dev *dh_dev = container_of((void*)pf_dev, struct dh_core_dev, priv); + + PLCR_FUNC_DBG_ENTER(); + PLCR_LOG_INFO("car_type = 0x%x, flowid = 0x%x, map_flowid = 0x%x\n", car_type, flowid, map_flowid); + + if (dh_dev->coredev_type == DH_COREDEV_PF) + { + //前面的流程会判断是否需要进行映射,不会出现vf端口原来是非0group,现在会被group 0覆盖的情况 + PLCR_LOG_INFO("flowid=0x%x, map_flowid=0x%x\n", flowid, map_flowid); + pf_info.slot = pf_dev->slot_id; + pf_info.vport = pf_dev->vport; + PLCR_LOG_INFO("dpp_car_queue_map_set: pf_info.vport = 0x%x, car_type = %d, flowid = %d, map_flowid = %d\n", pf_info.vport, car_type, flowid, map_flowid); + rtn = dpp_car_queue_map_set(&pf_info, car_type, flowid, map_flowid, map_sp); + PLCR_COMM_ASSERT(rtn); + + rtn = zxdh_plcr_stroe_map(pf_dev, car_type, flowid, map_flowid); + } + else + { + msg.payload.hdr.op_code = ZXDH_MAP_PLCR_FLOWID; + msg.payload.hdr.vport = pf_dev->vport; + msg.payload.hdr.pcie_id = pf_dev->pcie_id; + msg.payload.hdr.vf_id = pf_dev->pcie_id & (0xff); + + msg.payload.plcr_flowid_map_msg.car_type = car_type; + msg.payload.plcr_flowid_map_msg.flowid = flowid; + msg.payload.plcr_flowid_map_msg.map_flowid = map_flowid; + msg.payload.plcr_flowid_map_msg.sp = map_sp; + PLCR_LOG_INFO("flowid=0x%x, map_flowid=0x%x\n", flowid, map_flowid); + + rtn = zxdh_pf_msg_send_cmd(dh_dev, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg, true); + PLCR_COMM_ASSERT(rtn); + } + + return rtn; +} + +int zxdh_plcr_mode_init(struct zxdh_pf_device *pf_dev) +{ + int32_t rtn = 0; + union zxdh_msg msg = {0}; + struct dh_core_dev *dh_dev = container_of((void*)pf_dev, struct dh_core_dev, priv); + DPP_PF_INFO_T pf_info = {0}; + + pf_info.slot = pf_dev->slot_id; + pf_info.vport = pf_dev->vport; + + PLCR_FUNC_DBG_ENTER(); + + if (dh_dev->coredev_type == DH_COREDEV_PF) + { + //set mode0 + rtn = zxdh_plcr_set_mode(pf_dev, pf_dev->vport, E_RATE_LIMIT_MODE0); + PLCR_COMM_ASSERT(rtn); + } + else if (dh_dev->coredev_type == DH_COREDEV_VF) + { + msg.payload.hdr.op_code = ZXDH_PLCR_MODE_INIT; + msg.payload.hdr.vport = pf_dev->vport; + msg.payload.hdr.pcie_id = pf_dev->pcie_id; + msg.payload.hdr.vf_id = pf_dev->pcie_id & (0xff); + + rtn = zxdh_pf_msg_send_cmd(dh_dev, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg, true); + PLCR_COMM_ASSERT(rtn); + } + + return rtn; +} + +int32_t zxdh_plcr_init(struct zxdh_en_priv *en_priv) +{ + int32_t rtn = 0; + struct zxdh_en_device *en_dev = &en_priv->edev; + struct dh_core_dev *dh_dev = en_dev->parent->parent; + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + if (dh_dev->coredev_type == DH_COREDEV_PF) + { + xa_init(&pf_dev->plcr_table.plcr_profiles[E_PLCR_CAR_A]); + xa_init(&pf_dev->plcr_table.plcr_flows[E_PLCR_CAR_A]); + xa_init(&pf_dev->plcr_table.plcr_maps[E_PLCR_CAR_A]); + + xa_init(&pf_dev->plcr_table.plcr_profiles[E_PLCR_CAR_B]); + xa_init(&pf_dev->plcr_table.plcr_flows[E_PLCR_CAR_B]); + xa_init(&pf_dev->plcr_table.plcr_maps[E_PLCR_CAR_B]); + + xa_init(&pf_dev->plcr_table.plcr_profiles[E_PLCR_CAR_C]); + xa_init(&pf_dev->plcr_table.plcr_flows[E_PLCR_CAR_C]); + + pf_dev->plcr_table.burst_size = 0; + } + + //vf需要设置到mode0模式 + rtn = zxdh_plcr_mode_init(pf_dev); + PLCR_COMM_ASSERT(rtn); + + return rtn; +} +EXPORT_SYMBOL(zxdh_plcr_init); + +/*释放PF/VF*/ +int32_t zxdh_plcr_uninit(struct zxdh_en_priv *en_priv) +{ + int rtn = 0; + union zxdh_msg msg = {0}; + struct zxdh_en_device *en_dev = &en_priv->edev; + struct dh_core_dev *dh_dev = en_dev->parent->parent; + struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev); + + unsigned long flow_id; + E_PLCR_CAR_TYPE car_index; + struct xarray *xarray_flow; + struct xarray *xarray_profile; + struct zxdh_plcr_flow *flow = NULL; + + PLCR_FUNC_DBG_ENTER(); + + if (dh_dev->coredev_type == DH_COREDEV_PF) + { + for(car_index = E_PLCR_CAR_A; car_index <= E_PLCR_CAR_C; car_index ++) + { + xarray_flow = &(pf_dev->plcr_table.plcr_flows[car_index]); + xarray_profile = &(pf_dev->plcr_table.plcr_profiles[car_index]); + xa_for_each_range(xarray_flow, flow_id, flow, 0, gaudPlcrCarxFlowIdNum[car_index]) + { + zxdh_plcr_remove_rate_limit(pf_dev, car_index, flow_id); + + //clear all vport mappings between car B and car C. + if(E_PLCR_CAR_B == car_index) + { + zxdh_plcr_clear_map(pf_dev, car_index, flow_id); + } + } + xa_destroy(xarray_flow); + xa_destroy(xarray_profile); + } + } + else if (dh_dev->coredev_type == DH_COREDEV_VF) + { + //解除一二级flowid与profile之间的绑定关系,并释放profile + msg.payload.hdr.op_code = ZXDH_PLCR_UNINIT; + msg.payload.hdr.vport = pf_dev->vport; + msg.payload.hdr.pcie_id = pf_dev->pcie_id; + msg.payload.hdr.vf_id = pf_dev->pcie_id & (0xff); + + rtn = zxdh_pf_msg_send_cmd(dh_dev, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg, true); + PLCR_COMM_ASSERT(rtn); + } + return rtn; +} +EXPORT_SYMBOL(zxdh_plcr_uninit); + + + +/*******************************下面是新实现的代码*******************************/ +/* +函数功能:获取car A的flowid +入参: + --- + --- +场景: + ---1. 如果处于mode0模式,用户请求队列字节限速,则car A的flowid就是队列 + 这种场景下,pf和vf调用各自的钩子函数,所以通过en_dev直接获取队列信息 + ---2. 如果处于mode0模式,用户请求非队列字节限速,则car A的flowid就是vf端口 + ---3. 如果处于mode1模式,则不管用户是什么请求,没有必要获取car A的flowid,因为场景1已经进行了映射 + ---4. 如果处于mode2模式,则不管用户是什么请求,没有必要获取car A的flowid,因为场景2已经进行了映射 +返回值:成功返回0,失败返回其它值 +*/ +int zxdh_plcr_get_car_a_flowid(struct zxdh_pf_device *pf_dev, E_RATE_LIMIT_MODE mode, zxdh_plcr_rate_limit_paras *rate_limit_paras, zxdh_plcr_flowids *flowids) +{ + int rtn = 0; + uint32_t queue_pair_index; + struct zxdh_en_device *en_dev; + + PLCR_FUNC_DBG_ENTER(); + + PLCR_LOG_INFO("mode = %d, rate_limit_paras->req_type = %d\n", mode, rate_limit_paras->req_type); + + en_dev = pf_dev_get_edev(pf_dev); + if (IS_ERR(en_dev)) + return PTR_ERR(en_dev); + + if (PLCR_MAX_QUEUE_PAIRS < (en_dev->curr_queue_pairs)) + { + PLCR_COMM_ASSERT(PLCR_DEV_ALL_QID_2_FLOWID_QUEUE_PAIRS_OVERFLOW); + } + + PLCR_LOG_INFO("rate_limit_paras->req_type = 0x%x\n", rate_limit_paras->req_type); + + if (E_RATE_LIMIT_REQ_VF_GROUP_BYTE == rate_limit_paras->req_type) + { + PLCR_LOG_INFO("E_RATE_LIMIT_REQ_VF_GROUP_BYTE does not need car A flowid!\n"); + return 0; + } + else if ((((E_RATE_LIMIT_MODE0 == mode)) || ((E_RATE_LIMIT_MODE1 == mode))) && (E_RATE_LIMIT_REQ_QUEUE_BYTE == rate_limit_paras->req_type)) + { + //队列字节限速调用的是pf和vf各自的钩子,所以这里直接使用en_dev->curr_queue_pairs + for (queue_pair_index=0; queue_pair_index < en_dev->curr_queue_pairs; queue_pair_index++) + { + //rx + flowids->flowids_A[0][queue_pair_index] = en_dev->rq[queue_pair_index].vq->phy_index; + + //tx + flowids->flowids_A[1][queue_pair_index] = en_dev->sq[queue_pair_index].vq->phy_index; + + PLCR_LOG_INFO("flowids->flowids_A[0][%d] = 0x%x\n", queue_pair_index, flowids->flowids_A[0][queue_pair_index]); + PLCR_LOG_INFO("flowids->flowids_A[1][%d] = 0x%x\n", queue_pair_index, flowids->flowids_A[1][queue_pair_index]); + } + flowids->queue_pairs = en_dev->curr_queue_pairs; + + PLCR_LOG_INFO("flowids->queue_pairs = 0x%x\n", flowids->queue_pairs); + } + else if (((E_RATE_LIMIT_MODE0 == mode) && (E_RATE_LIMIT_REQ_QUEUE_BYTE != rate_limit_paras->req_type)) || + ((E_RATE_LIMIT_MODE2 == mode) && (E_RATE_LIMIT_REQ_VF_PKT == rate_limit_paras->req_type))) + { + flowids->flowid_A[0] = rate_limit_paras->vfid * 2 + PLCR_CAR_A_DPDK_FLOWID_OFFSET; + flowids->flowid_A[1] = rate_limit_paras->vfid * 2 + 1 + PLCR_CAR_A_DPDK_FLOWID_OFFSET; + PLCR_LOG_INFO("flowids->flowid_A[0] = 0x%x\n", flowids->flowid_A[0]); + PLCR_LOG_INFO("flowids->flowid_A[1] = 0x%x\n", flowids->flowid_A[1]); + } + else + { + PLCR_LOG_INFO("Car A's flowid is not needed!\n"); + return 0; + } + + return rtn; +} + +int zxdh_plcr_get_car_b_flowid(struct zxdh_pf_device *pf_dev, E_RATE_LIMIT_MODE mode, zxdh_plcr_rate_limit_paras *rate_limit_paras, zxdh_plcr_flowids *flowids) +{ + int rtn = 0; + + PLCR_FUNC_DBG_ENTER(); + + //pf队列字节限速不需要指定vf_idx,视作一个特殊vf端口,同样根据vqm_vfid分配flowid + //端口组字节限速的前提是先建立端口组,在后面流程会直接退出 + flowids->flowid_B[0] = rate_limit_paras->vfid * 2; + flowids->flowid_B[1] = rate_limit_paras->vfid * 2 + 1; + + PLCR_LOG_INFO("flowids->flowid_B[0] = 0x%x\n", flowids->flowid_B[0]); + PLCR_LOG_INFO("flowids->flowid_B[1] = 0x%x\n", flowids->flowid_B[1]); + + + return rtn; +} + +/* +函数功能:获取car c的flowid +资源分配: + ---car c有1024个flowid资源 + ---4个EP * 8个PF * 2个方向(接收和发送)= 64 + ---1024 / 64 = 16,即每个pf分配16个group + +背景描述: + ---除了队列限速,其它所有限速都是操作pf下的文件系统,en_priv对应的肯定是pf设备 + ---rate_limit_paras->vport,这个指向的是vf_idx对应的vf设备 + ---所以,我们需要通过en_priv获取ep和pf func num + +返回值:成功返回0,失败返回其它值 +*/ +int zxdh_plcr_get_car_c_flowid(struct zxdh_pf_device *pf_dev, E_RATE_LIMIT_MODE mode, zxdh_plcr_rate_limit_paras *rate_limit_paras, zxdh_plcr_flowids *flowids) +{ + uint16_t vport = 0; + uint32_t epid = 0; + uint32_t pf_num = 0; + + PLCR_FUNC_DBG_ENTER(); + + vport = pf_dev->vport; + PLCR_LOG_INFO("pf's info : vport = 0x%x\n0", vport); + + if(rate_limit_paras->group_id >= 16) + { + PLCR_LOG_ERR("group_id must be less than 16!\n"); + return -ERANGE; + } + + //用户设置vf的队列限速的时候,这里的vport是vf端口,不是pf端口 + //vf的vport和pf的vport一样,都包含了相同的epid和pf function + epid = EPID(vport); + pf_num = FUNC_NUM(vport); + PLCR_LOG_INFO("pf's info : epid = 0x%x, pf_num = 0x%x\n", epid, pf_num); + + //端口组要么是0,要么是用户指定(端口组字节限速,移动端口组) + flowids->flowid_C[0] = epid * PLCR_CAR_C_FLOWIDS_PER_EP + pf_num * PLCR_CAR_C_FLOWIDS_PER_PF + rate_limit_paras->group_id * 2; + flowids->flowid_C[1] = epid * PLCR_CAR_C_FLOWIDS_PER_EP + pf_num * PLCR_CAR_C_FLOWIDS_PER_PF + rate_limit_paras->group_id * 2 + 1; + + PLCR_LOG_INFO("flowids->flowid_C[0] = 0x%x\n", flowids->flowid_C[0]); + PLCR_LOG_INFO("flowids->flowid_C[1] = 0x%x\n", flowids->flowid_C[1]); + + return 0; +} + +/* +函数功能:获取对应的Vfi +入参: + ---vf_idx : pf内vf的编号,vf_idx是查找vport的索引,是中间工具,最终使用Vfid来定位vport + ---vfid : vport的Vfid +场景: + ---1. pf队列字节限速: 用户使用echo, 调用pf的钩子函数,走if分支, 不需要指定vf_idx,不需要Vfid(不需要进行级间映射) + ---2. vf队列字节限速: 用户命令使用echo, 调用vf的否子函数,走else分支, 不需要指定vf_idx + ---3. vf端口字节限速: 用户命令使用ip link,调用pf的钩子函数,走if分支, 需要指定vf_idx + ---3. vf端口字节限速: 后期会支持echo, 调用pf的钩子函数,走if分支, 需要指定vf_idx + ---4. vf端口包限速: 用户命令使用echo, 调用pf的钩子函数,走if分支, 需要指定vf_idx + ---5. vf端口组字节限速:用户命令使用echo, 调用pf的钩子函数,走if分支, 不需要指定vf_idx,不需要Vfid(不需要进行级间映射) + ---6. vf端口移动组: 用户命令使用echo, 调用pf的钩子函数,走if分支, 需要指定vf_idx +返回值:成功返回0,失败返回其它值 +*/ +int zxdh_plcr_get_vport_vfid(struct zxdh_pf_device *pf_dev, uint32_t vf_idx, uint32_t *vport, uint32_t *vfid) +{ + int32_t rtn = 0; + struct zxdh_vf_item *vf_item; + struct dh_core_dev *dh_dev = container_of((void*)pf_dev, struct dh_core_dev, priv); + + PLCR_FUNC_DBG_ENTER(); + + if (dh_dev->coredev_type == DH_COREDEV_PF) + { + PLCR_LOG_INFO("pf: pf_dev->vport = 0x%x, pf_dev->pcie_id = 0x%x\n", pf_dev->vport, pf_dev->pcie_id); + //场景中有不需要指定vf_idx的情况,不会生成vf_id + if (PLCR_INVALID_PARAM == vf_idx) + { + //pf队列限速和vf端口组字节限速,都不需要指定vf_idx + //但vf端口组字节限速必须要用到vport, pf队列也需分配一个carb flowid + *vport = pf_dev->vport; + *vfid = VQM_VFID(pf_dev->vport); + + PLCR_LOG_INFO("vf_idx is not specified! vport = %x, vfid = %x\n", pf_dev->vport, *vfid); + return rtn; + } + else + { + vf_item = &pf_dev->vf_item[vf_idx]; + if(ERR_PTR(-EINVAL) == vf_item) + { + return -EINVAL; + } + + *vport = vf_item->vport; + *vfid = VQM_VFID(vf_item->vport); + + PLCR_LOG_INFO("vf_idx = 0x%x, vf_item->vport = 0x%x, vfid = 0x%x\n", vf_idx, vf_item->vport, *vfid); + PLCR_LOG_INFO("mac address = %x %x %x %x %x %x\n", vf_item->mac[0],vf_item->mac[1],vf_item->mac[2],vf_item->mac[3],vf_item->mac[4],vf_item->mac[5]); + } + } + else + { + PLCR_LOG_INFO("vf: pf_dev->vport = 0x%x, pf_dev->pcie_id = 0x%x\n", pf_dev->vport, pf_dev->pcie_id); + + *vport = pf_dev->vport; + *vfid = VQM_VFID(pf_dev->vport); + + PLCR_LOG_INFO("vf_idx = 0x%x, pf_dev->vport = 0x%x, vfid = 0x%x\n", vf_idx, pf_dev->vport, *vfid); + } + + return rtn; +} + +int zxdh_plcr_get_cars_flowid(struct zxdh_pf_device *pf_dev, E_RATE_LIMIT_MODE mode, zxdh_plcr_rate_limit_paras *rate_limit_paras, zxdh_plcr_flowids *flowids) +{ + int rtn = 0; + + PLCR_FUNC_DBG_ENTER(); + + //init the pointer flowids with invalid value + memset(flowids, 0xff, sizeof(zxdh_plcr_flowids)); + + //get car A flowid + rtn = zxdh_plcr_get_car_a_flowid(pf_dev, mode, rate_limit_paras, flowids); + PLCR_COMM_ASSERT(rtn); + + //get car B flowid + rtn = zxdh_plcr_get_car_b_flowid(pf_dev, mode, rate_limit_paras, flowids); + PLCR_COMM_ASSERT(rtn); + + //get car C flowid + rtn = zxdh_plcr_get_car_c_flowid(pf_dev, mode, rate_limit_paras, flowids); + PLCR_COMM_ASSERT(rtn); + + return rtn; +} + +int zxdh_plcr_get_next_mode(struct zxdh_pf_device *pf_dev, zxdh_plcr_rate_limit_paras *rate_limit_paras, uint32_t *next_mode) +{ + int rtn = 0; + E_RATE_LIMIT_MODE cur_mode; + + //get vport current mode + rtn = zxdh_plcr_get_mode(pf_dev, rate_limit_paras->vport, &cur_mode); + PLCR_COMM_ASSERT(rtn); + + if(E_RATE_LIMIT_MODE0 == cur_mode) + { + if(E_RATE_LIMIT_REQ_QUEUE_BYTE == rate_limit_paras->req_type) + { + *next_mode = E_RATE_LIMIT_MODE1; + } + else + { + *next_mode = E_RATE_LIMIT_MODE2; + } + + return 0; + } + else + { + return -EINVAL; + } + + return rtn; +} + +int zxdh_plcr_init_flow(struct zxdh_pf_device *pf_dev, E_PLCR_CAR_TYPE car_type, uint32_t flowid) +{ + int rtn = 0; + uint32_t vf_idx; + uint32_t vport; + uint32_t vfid; + uint32_t map_flowid; + union zxdh_msg msg = {0}; + DPP_PF_INFO_T pf_info = {0}; + struct dh_core_dev *dh_dev = container_of((void*)pf_dev, struct dh_core_dev, priv); + + PLCR_FUNC_DBG_ENTER(); + + if (dh_dev->coredev_type == DH_COREDEV_PF) + { + if (car_type == E_PLCR_CAR_C) + { + //对于carC flow的初始化,需检查目标group中num_vfs是否为0,确定其是否是本次移动前新建 + for (vf_idx = 0; vf_idx < pf_dev->num_vfs; vf_idx ++) + { + rtn = zxdh_plcr_get_vport_vfid(pf_dev, vf_idx, &vport, &vfid); + PLCR_COMM_ASSERT(rtn); + rtn = zxdh_plcr_get_next_map(pf_dev, E_PLCR_CAR_B, vfid * 2, &map_flowid); + PLCR_COMM_ASSERT(rtn); + if (!rtn && flowid == map_flowid) + { + PLCR_LOG_INFO("Group is currently being used by at least one VF\n"); + return 0; + } + } + } + pf_info.slot = pf_dev->slot_id; + pf_info.vport = pf_dev->vport; + PLCR_LOG_INFO("dpp_car_queue_cfg_set: vport = 0x%x, car_type = %d, flowid = %d, plcr_en = 0\n", + pf_dev->vport, car_type, flowid); + rtn = dpp_car_queue_cfg_set(&pf_info, (uint32_t)car_type, flowid, DROP_DISABLE, PLCR_DISABLE, 0); + if (rtn) + PLCR_LOG_ERR("failed to call dpp_car_queue_cfg_set()\n"); + } + else + { + //针对vf队列限速的场景 + msg.payload.hdr.op_code = ZXDH_PLCR_FLOW_INIT; + msg.payload.hdr.vport = pf_dev->vport; + msg.payload.hdr.pcie_id = pf_dev->pcie_id; + msg.payload.hdr.vf_id = pf_dev->pcie_id & (0xff); + + msg.payload.plcr_flow_init_msg.car_type = car_type; + msg.payload.plcr_flow_init_msg.flowid = flowid; + + rtn = zxdh_pf_msg_send_cmd(dh_dev, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg, true); + PLCR_COMM_ASSERT(rtn); + } + + return rtn; +} + +/* +函数功能:根据不同的场景进行三级映射,下面枚举出所有场景。 + + 原始模式 限速请求 转换模式 映射 + + mode0 队列字节限速 mode1 (car A -> car B) & (car B -> car C) + mode0 端口字节限速 mode2 (car A -> car B) & (car B -> car C) + mode0 端口包限速 mode2 (car A -> car B) & (car B -> car C) + mode0 移动组 mode2 (car A -> car B) & (car B -> car C) + + mode1 队列字节限速 mode1 不需要 + mode1 端口字节限速 mode1 不需要 + mode1 移动组 mode1 (car B -> car C) + + mode2 端口包限速 mode2 不需要 + mode2 端口字节限速 mode2 不需要 + mode2 移动组 mode2 (car B -> car C) + + x 端口组字节限速 无端口,无模式 不需要映射,直接配置限速 +*/ +int zxdh_plcr_set_cars_map(struct zxdh_pf_device *pf_dev, zxdh_plcr_rate_limit_paras *rate_limit_paras, zxdh_plcr_flowids *flowids) +{ + int rtn = 0; + uint32_t flowid; + uint32_t map_flowid; + E_RATE_LIMIT_MODE mode; + E_RATE_LIMIT_REQ_TYPE req_type; + int queue_pair_index; + + PLCR_FUNC_DBG_ENTER(); + + //get vport and vfid + rtn = zxdh_plcr_get_vport_vfid(pf_dev, rate_limit_paras->vf_idx, &rate_limit_paras->vport, &rate_limit_paras->vfid); + PLCR_COMM_ASSERT(rtn); + + //get vport current mode + rtn = zxdh_plcr_get_mode(pf_dev, rate_limit_paras->vport, &mode); + PLCR_COMM_ASSERT(rtn); + + //get rate limit type + rtn = zxdh_plcr_check_req_type(pf_dev, mode, rate_limit_paras, &req_type); + PLCR_COMM_ASSERT(rtn); + + //获取三级car的flowid + rtn = zxdh_plcr_get_cars_flowid(pf_dev, mode, rate_limit_paras, flowids); + PLCR_COMM_ASSERT(rtn); + + if (E_RATE_LIMIT_MODE0 == mode) + { + if (E_RATE_LIMIT_REQ_QUEUE_BYTE == req_type) + { + for(queue_pair_index = 0; queue_pair_index < flowids->queue_pairs; queue_pair_index++) + { + //rxq:初始化flow,避免有复位前的配置遗留,将car A flowid映射到car B flowid + flowid = flowids->flowids_A[0][queue_pair_index]; + map_flowid = flowids->flowid_B[0]; + PLCR_LOG_INFO("car_type = 0x%x, flowid = 0x%x, map_flowid = 0x%x\n", E_PLCR_CAR_A, flowid, map_flowid); + + rtn = zxdh_plcr_init_flow(pf_dev, E_PLCR_CAR_A, flowid); + PLCR_COMM_ASSERT(rtn); + rtn = zxdh_plcr_map_flowid(pf_dev, E_PLCR_CAR_A, flowid, map_flowid); + PLCR_COMM_ASSERT(rtn); + + + //txq:初始化car A flow,映射到car B flowid + flowid = flowids->flowids_A[1][queue_pair_index]; + map_flowid = flowids->flowid_B[1]; + PLCR_LOG_INFO("car_type = 0x%x, flowid = 0x%x, map_flowid = 0x%x\n", E_PLCR_CAR_A, flowid, map_flowid); + + rtn = zxdh_plcr_init_flow(pf_dev, E_PLCR_CAR_A, flowid); + PLCR_COMM_ASSERT(rtn); + rtn = zxdh_plcr_map_flowid(pf_dev, E_PLCR_CAR_A, flowid, map_flowid); + PLCR_COMM_ASSERT(rtn); + } + } + else if ((E_RATE_LIMIT_REQ_VF_PKT == req_type) || (E_RATE_LIMIT_REQ_VF_BYTE == req_type) || (E_RATE_LIMIT_REQ_MOVE_VF_GROUP == req_type)) + { + //vfid's rx :初始化car A flow,映射到car B flowid + flowid = flowids->flowid_A[0]; + map_flowid = flowids->flowid_B[0]; + PLCR_LOG_INFO("car_type = 0x%x, flowid = 0x%x, map_flowid = 0x%x\n", E_PLCR_CAR_A, flowid, map_flowid); + + rtn = zxdh_plcr_init_flow(pf_dev, E_PLCR_CAR_A, flowid); + PLCR_COMM_ASSERT(rtn); + rtn = zxdh_plcr_map_flowid(pf_dev, E_PLCR_CAR_A, flowid, map_flowid); + PLCR_COMM_ASSERT(rtn); + + + //vfid's tx :初始化car A flow,映射到car B flowid + flowid = flowids->flowid_A[1]; + map_flowid = flowids->flowid_B[1]; + PLCR_LOG_INFO("car_type = 0x%x, flowid = 0x%x, map_flowid = 0x%x\n", E_PLCR_CAR_A, flowid, map_flowid); + + rtn = zxdh_plcr_init_flow(pf_dev, E_PLCR_CAR_A, flowid); + PLCR_COMM_ASSERT(rtn); + rtn = zxdh_plcr_map_flowid(pf_dev, E_PLCR_CAR_A, flowid, map_flowid); + PLCR_COMM_ASSERT(rtn); + } + } + + /* + 功能:car B的flowid映射到car C的flowid + 场景: + ---1.当前mode0模式,用户请求队列字节限速, 用户未指定group:group默认为0 + ---2.当前mode0模式,用户请求vf端口字节限速,用户未指定group:group默认为0 + ---3.当前mode0模式,用户请求vf端口包限速, 用户未指定group:group默认为0 + ---4.当前mode0模式,用户请求端口组字节限速, 用户指定group:不需要car B到car C的映射,直接设置限速 + + ---5.任意模式, 用户请求移动group, 用户指定group:按照用户指定的group + ---其它场景下:不需要进行映射 + */ + if (((E_RATE_LIMIT_MODE0 == mode) && (E_RATE_LIMIT_REQ_VF_GROUP_BYTE != req_type)) || (E_RATE_LIMIT_REQ_MOVE_VF_GROUP == req_type)) + { + //car B rx flowid is mapped to car C rx flowid + flowid = flowids->flowid_B[0]; + map_flowid = flowids->flowid_C[0]; + PLCR_LOG_INFO("car_type = 0x%x, flowid = 0x%x, map_flowid = 0x%x\n", E_PLCR_CAR_B, flowid, map_flowid); + + if (E_RATE_LIMIT_MODE0 == mode) + { + rtn = zxdh_plcr_init_flow(pf_dev, E_PLCR_CAR_B, flowid); + PLCR_COMM_ASSERT(rtn); + } + rtn = zxdh_plcr_init_flow(pf_dev, E_PLCR_CAR_C, map_flowid); + PLCR_COMM_ASSERT(rtn); + + rtn = zxdh_plcr_map_flowid(pf_dev, E_PLCR_CAR_B, flowid, map_flowid); + PLCR_COMM_ASSERT(rtn); + + + //car B tx flowid is mapped to car C tx flowid + flowid = flowids->flowid_B[1]; + map_flowid = flowids->flowid_C[1]; + PLCR_LOG_INFO("car_type = 0x%x, flowid = 0x%x, map_flowid = 0x%x\n", E_PLCR_CAR_B, flowid, map_flowid); + + if (E_RATE_LIMIT_MODE0 == mode) + { + rtn = zxdh_plcr_init_flow(pf_dev, E_PLCR_CAR_B, flowid); + PLCR_COMM_ASSERT(rtn); + } + rtn = zxdh_plcr_init_flow(pf_dev, E_PLCR_CAR_C, map_flowid); + PLCR_COMM_ASSERT(rtn); + + rtn = zxdh_plcr_map_flowid(pf_dev, E_PLCR_CAR_B, flowid, map_flowid); + PLCR_COMM_ASSERT(rtn); + PLCR_LOG_INFO("Successfull to map!\n"); + } + + return rtn; +} + +int zxdh_plcr_unified_set_rate_limit(struct zxdh_pf_device *pf_dev, + zxdh_plcr_rate_limit_paras *rate_limit_paras) +{ + int rtn = 0; + union zxdh_msg msg = {0}; + zxdh_plcr_flowids flowids; + uint32_t next_mode; + E_RATE_LIMIT_REQ_TYPE req_type; + uint32_t vport = 0; + uint32_t flowid = 0; + uint32_t car_type = 0; + uint32_t is_packet = 0; + uint32_t max_rate = 0; + uint32_t min_rate = 0; + struct dh_core_dev *dh_dev = container_of((void*)pf_dev, struct dh_core_dev, priv); + + PLCR_FUNC_DBG_ENTER(); + + //map car A's flowid to car B's flowid, car B's flowid to car C's flowid + rtn = zxdh_plcr_set_cars_map(pf_dev, rate_limit_paras, &flowids); + PLCR_COMM_ASSERT(rtn); + + req_type = rate_limit_paras->req_type; + + //移动vf端口组:不需要设置限速,只需要级间映射(上面已经完成映射) + if (E_RATE_LIMIT_REQ_MOVE_VF_GROUP == req_type) + { + PLCR_LOG_INFO("E_RATE_LIMIT_REQ_MOVE_VF_GROUP does not need set rate limit!\n\n"); + + return 0; + }//队列字节限速 + else if (E_RATE_LIMIT_REQ_QUEUE_BYTE == req_type) + { + if (E_RATE_LIMIT_RX == rate_limit_paras->direction) + { + flowid = flowids.flowids_A[0][rate_limit_paras->queue_id]; + } + else + { + flowid = flowids.flowids_A[1][rate_limit_paras->queue_id]; + } + + max_rate = rate_limit_paras->max_rate; + min_rate = 0; + car_type = E_PLCR_CAR_A; + is_packet = E_RATE_LIMIT_BYTE; + }//vf端口字节限速 + else if(E_RATE_LIMIT_REQ_VF_BYTE == req_type) + { + if (E_RATE_LIMIT_RX == rate_limit_paras->direction) + { + flowid = flowids.flowid_B[0]; + } + else + { + flowid = flowids.flowid_B[1]; + } + + max_rate = rate_limit_paras->max_rate; + min_rate = rate_limit_paras->min_rate; + car_type = E_PLCR_CAR_B; + is_packet = E_RATE_LIMIT_BYTE; + }//端口组字节限速 + else if(E_RATE_LIMIT_REQ_VF_GROUP_BYTE == req_type) + { + if (E_RATE_LIMIT_RX == rate_limit_paras->direction) + { + flowid = flowids.flowid_C[0]; + } + else + { + flowid = flowids.flowid_C[1]; + } + + max_rate = rate_limit_paras->max_rate; + min_rate = 0; + car_type = E_PLCR_CAR_C; + is_packet = E_RATE_LIMIT_BYTE; + } + else + { + return -EINVAL; + } + + + PLCR_LOG_INFO("flowid = 0x%x\n", flowid); + PLCR_LOG_INFO("car_type = 0x%x\n", car_type); + PLCR_LOG_INFO("is_packet = 0x%x\n", is_packet); + PLCR_LOG_INFO("max_rate = 0x%x\n", max_rate); + PLCR_LOG_INFO("min_rate = 0x%x\n", min_rate); + + vport = rate_limit_paras->vport; + + //set rate limit + if (dh_dev->coredev_type == DH_COREDEV_PF) + { + rtn = zxdh_plcr_set_rate_limit(pf_dev, is_packet, car_type, vport, flowid, max_rate, min_rate); + } + else if (dh_dev->coredev_type == DH_COREDEV_VF) + { + msg.payload.hdr.op_code = ZXDH_VF_RATE_LIMIT_SET; + msg.payload.hdr.vport = pf_dev->vport; + msg.payload.hdr.pcie_id = pf_dev->pcie_id; + msg.payload.hdr.vf_id = pf_dev->pcie_id & (0xff); + + msg.payload.rate_limit_set_msg.flowid = flowid; + msg.payload.rate_limit_set_msg.car_type = car_type; + msg.payload.rate_limit_set_msg.is_packet = is_packet; + msg.payload.rate_limit_set_msg.max_rate = max_rate; + msg.payload.rate_limit_set_msg.min_rate = min_rate; + + PLCR_LOG_INFO("msg.payload.rate_limit_set_msg.flowid = 0x%x\n", msg.payload.rate_limit_set_msg.flowid); + PLCR_LOG_INFO("msg.payload.rate_limit_set_msg.car_type = 0x%x\n", msg.payload.rate_limit_set_msg.car_type); + PLCR_LOG_INFO("msg.payload.rate_limit_set_msg.is_packet = 0x%x\n", msg.payload.rate_limit_set_msg.is_packet); + PLCR_LOG_INFO("msg.payload.rate_limit_set_msg.max_rate = 0x%x\n", msg.payload.rate_limit_set_msg.max_rate); + PLCR_LOG_INFO("msg.payload.rate_limit_set_msg.min_rate = 0x%x\n", msg.payload.rate_limit_set_msg.min_rate); + + rtn = zxdh_pf_msg_send_cmd(dh_dev, MODULE_VF_BAR_MSG_TO_PF, &msg, &msg, true); + PLCR_COMM_ASSERT(rtn); + + rtn = msg.reps.rate_limit_set_rsp.err_code; + } + //0:限速设置成功 + //PLCR_REMOVE_RATE_LIMIT:解除限速成功 + //其它值:错误码 + PLCR_COMM_ASSERT((0 != rtn) && (PLCR_REMOVE_RATE_LIMIT != rtn)); + + /*************下面2种场景需要模式切换************* + * 1. mode 0 -> mode 1 + * 2. mode 0 -> mode 2 + * 一般情况下,vport处于mode 1或者mode 2保持不变,只有在解除限速的时候可能会跳转到mode 0 + ****************************************/ + if (0 == rtn) //解除限速的场景就不需要进行模式切换 + { + rtn = zxdh_plcr_get_next_mode(pf_dev, rate_limit_paras, &next_mode); + if(0 == rtn) + { + rtn = zxdh_plcr_set_mode(pf_dev, vport, next_mode); + PLCR_COMM_ASSERT(rtn); + } + } + + return 0; + +} +EXPORT_SYMBOL(zxdh_plcr_unified_set_rate_limit); + diff --git a/src/net/drivers/net/ethernet/dinghai/plcr.h b/src/net/drivers/net/ethernet/dinghai/plcr.h new file mode 100644 index 0000000..981f0fa --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/plcr.h @@ -0,0 +1,359 @@ +#ifndef __ZXDH_QOS_H__ +#define __ZXDH_QOS_H__ + +#ifdef __cplusplus +extern "C" { +#endif +#include +#include +#include +#include +#include +#include "dpp_drv_qos.h" +#include "en_sf.h" + +/* 注意:启用plcr会大幅度增加初始化时间 */ +// #define ZXDH_PLCR_OPEN +// #define ZXDH_SRIOV_SYSFS_EN +#ifdef ZXDH_PLCR_OPEN + #define ZXDH_PLCR_DEBUG +#endif + +/* +注意事项:将编码过程中的约定和需要关注的点列在这里 +1. vqm tx队列与CAR A的flow id映射关系:一一映射 + vqm队列编号 0 - 4096,其中偶数队列为接收队列,奇数队列为发送队列; + 所以,队列1,3,5,7,9等就是tx队列,它们对应的flow id就是1,3,5,7,9 + 这个映射转换,对应的接口是:static int zxdh_pf_qid_2_flowid(struct zxdh_en_device *en_dev, uint32_t qid) + + +2.需要增加一个释放限速模板的接口 + 释放限速模板(模板计数操作与释放操作独立,释放的时候判断计数不为0就不释放,这样就能保证共享模板不被释放,新申请的会被释放) + +3.dpp相关的接口,里面进行pf与vf的判断 + +4.错误打印,加上行号 + +5.找孙泽明确认pcie_id和port_id的格式,参考链接: + https://i.zte.com.cn/#/space/4e62cb2b730540ff8721c1a8552b2356/wiki/page/ff8178f1304e45dc9457e92ff196cce5/view + +6. 考虑如何加锁 + +7.如果用户只指定一个速率,iplink是如何获取到另外一个速率的? +*/ + +#define DROP_ENABLE 1 +#define DROP_DISABLE 0 +#define PLCR_ENABLE 1 +#define PLCR_DISABLE 0 + +// #define DPP_CAR_PRI_MAX +#define PLCR_STEP_SIZE 61u +#define PLCR_MIN_RATE 1u +#define PLCR_MAX_RATE 6875908u + +#define TXQ_MAX_BYTE_RATE PLCR_MAX_RATE / 1000 * PLCR_STEP_SIZE +#define TXQ_MAX_PKT_RATE 0xFFFFFFFF //todo:不确定包限速最大限速值是多少 + +#define CRED_ID(vport, car_type, profile_id) ((vport & 0xffff) << 20) | ((car_type & 0xf) << 16) | (profile_id & 0x1FF); +#define PROFILE_ID(cred_id) ((cred_id & 0x1FF)) +#define VQM_QUEUE_PAIRS_MAX_NUM 2048 + +#define PLCR_CAR_A_PROFILE_RES_NUM 512 +#define PLCR_CAR_B_PROFILE_RES_NUM 128 +#define PLCR_CAR_C_PROFILE_RES_NUM 32 + +#define PLCR_CAR_A_FLOWID_RES_NUM 10240 +#define PLCR_CAR_B_FLOWID_RES_NUM 2368 // 2304 + 64 +#define PLCR_CAR_C_FLOWID_RES_NUM 1024 +#define PLCR_CAR_B_PF_DEFAULT_FLOWID 2048 + +#define PLCR_CAR_C_FLOWIDS_PER_EP 256 +#define PLCR_CAR_C_FLOWIDS_PER_PF 32 + +//todo:实际调试时确定这个cbs的值; +#define PLCR_CAR_PROFILE_GENERAL_CBS (14*1024*4) + +/********************************** definition of types **********************************/ +#define FLOWID_2_XARRAY(flowid) ((flowid + 1)*8) +#define XARRAY_2_FLOWID(flowid) ((flowid / 8)-1) + +#define PLCR_INVALID_PARAM 0xffffffff +#define PLCR_CAR_A_DPDK_FLOWID_OFFSET 8192 +#define PLCR_MAX_QUEUE_PAIRS 64 +#define PLCR_DEBUG + +#ifdef PLCR_DEBUG +#define PLCR_FUNC_DBG_ENTER()\ + LOG_INFO("%s-%d:enter !\n", __FUNCTION__, __LINE__) + +#define PLCR_LOG_INFO(fmt, arg...)\ + LOG_INFO("%s-%d: ", __FUNCTION__, __LINE__)\ + DH_LOG_INFO(MODULE_PF, fmt, ##arg) + +#define PLCR_LOG_ERR(fmt, arg...)\ + LOG_INFO("%s-%d: ", __FUNCTION__, __LINE__)\ + DH_LOG_ERR(MODULE_PF, fmt, ##arg) + +#define PLCR_COMM_ASSERT(rtn)\ + do{\ + if(0 != rtn)\ + {\ + PLCR_LOG_ERR("failed and rtn=0x%x\n", rtn)\ + return rtn;\ + }\ + }while(0) +#else +#define PLCR_FUNC_DBG_ENTER() + +#define PLCR_LOG_INFO(fmt, arg...) + +#define PLCR_LOG_ERR(fmt, arg...)\ + LOG_INFO("%s-%d: ", __FUNCTION__, __LINE__);\ + DH_LOG_ERR(MODULE_PF, fmt, ##arg) + +#define PLCR_COMM_ASSERT(rtn)\ + do{\ + if(0 != rtn)\ + {\ + return rtn;\ + }\ + }while(0) +#endif + +typedef enum +{ + PLCR_DEV_ALL_QID_2_FLOWID_QUEUE_PAIRS_OVERFLOW = 1, + PLCR_GET_REQ_TYPE_INVALID_ERR, + + PLCR_CREATE_RATE_LIMIT_INVALID_OPERATION_ERR, + PLCR_MODIFY_RATE_LIMIT_INVALID_OPERATION_ERR, + + PLCR_REMOVE_RATE_LIMIT, + + PLCR_ERROR_NUM +} E_PLCR_ERR_CODE; + +// Define the type of PLCR card +typedef enum{ + E_PLCR_CAR_A = 0, // PLCR card type A + E_PLCR_CAR_B = 1, // PLCR card type B + E_PLCR_CAR_C = 2, // PLCR card type C + E_PLCR_CAR_NUM = 3, // Number of PLCR card types +} E_PLCR_CAR_TYPE; + +// Define the union for PLCR profile configuration +union zxdh_plcr_profile_cfg +{ + DPP_STAT_CAR_PROFILE_CFG_T byte_profile_cfg; // Byte rate limit profile configuration + DPP_STAT_CAR_PKT_PROFILE_CFG_T pkt_profile_cfg; // Packet rate limit profile configuration +}; + +typedef enum { + E_RATE_LIMIT_MODE0 = 0, // mode 0:no limit + E_RATE_LIMIT_MODE1, // mode 1:queue is mapped to car A flowid + E_RATE_LIMIT_MODE2, // mode 2:vfid is mapped to car A flowid +} E_RATE_LIMIT_MODE; + +typedef enum { + E_RATE_LIMIT_REQ_QUEUE_BYTE = 0, // queue byte rate limit + E_RATE_LIMIT_REQ_VF_BYTE, // vf byte rate limit + E_RATE_LIMIT_REQ_VF_GROUP_BYTE, // vf group byte rate limit + E_RATE_LIMIT_REQ_VF_PKT, // vf packet rate limit + E_RATE_LIMIT_REQ_MOVE_VF_GROUP, //just to move vf to other group + E_RATE_LIMIT_REQ_TYPE_NUM, // +} E_RATE_LIMIT_REQ_TYPE; + +/* Define rate limit direction */ +typedef enum { + E_RATE_LIMIT_RX = 0, // Receive direction + E_RATE_LIMIT_TX, // Send direction +} E_RATE_LIMIT_DIRECTION; + +/* Define rate limit type */ +typedef enum { + E_RATE_LIMIT_BYTE = 0, // Byte rate limit + E_RATE_LIMIT_PACKET, // Packet rate limit +} E_RATE_LIMIT_PKT_BYTE; + +/* Define the structure for rate limit parameters */ +typedef struct { + E_RATE_LIMIT_REQ_TYPE req_type; // Limit scope + E_RATE_LIMIT_DIRECTION direction; // Limit direction + E_RATE_LIMIT_PKT_BYTE mode; // Limit mode + uint32_t max_rate; // Maximum rate limit + uint32_t min_rate; // Minimum rate limit + uint32_t queue_id; // Queue id + uint32_t vf_idx; // VF index in PF + uint32_t vfid; // VF id is global + uint32_t vport; // VF id is global + uint32_t group_id; // Group id +} zxdh_plcr_rate_limit_paras; + +typedef struct { + uint16_t queue_pairs; + uint16_t flowids_A[2][PLCR_MAX_QUEUE_PAIRS]; // flowid in car A + uint16_t flowid_A[2]; // flowid in car A + uint16_t flowid_B[2]; // flowid in car B + uint16_t flowid_C[2]; // flowid in car C +} zxdh_plcr_flowids; + +// Define the structure for PLCR profile +struct zxdh_plcr_profile +{ + uint16_t ref_cnt; // Reference count + uint16_t profile_id; // Profile ID + uint16_t vport; // Virtual port + uint32_t max_rate; // Maximum rate + uint32_t min_rate; // Minimum rate + uint64_t cred_id; // Credit ID + DPP_STAT_CAR_PROFILE_CFG_T profile_cfg; // Profile configuration +}; + +// Define the structure for PLCR flow +struct zxdh_plcr_flow +{ + uint16_t vport; // Virtual port + uint16_t vf_id; // VF ID + uint16_t profile_id; // Profile ID + uint16_t flowid; // flowid + uint16_t map_flowid; // net car's flowid + uint16_t next_flowid; // next car's flowid + uint32_t max_rate; // Maximum rate + uint32_t min_rate; // Minimum rate +}; + +struct dh_core_dev; +struct zxdh_pf_device; +struct zxdh_en_priv; + +typedef enum{ + ZXDH_GROUP_RX_RATE = 0, + ZXDH_GROUP_TX_RATE = 1, +}ZXDH_GROUP_DATA_TYPE; + +struct zxdh_group_obj +{ + struct zxdh_pf_device *pf_dev; + struct kobject kobj; + struct completion free_group_comp; + + struct list_head list; + int32_t group_id; + int32_t num_vfs; + uint32_t max_tx_rate; + uint32_t max_rx_rate; +}; + +struct zxdh_group_work { + struct work_struct work; + struct zxdh_group_obj *group_obj; +}; + +typedef enum{ + ZXDH_VF_MIN_RATE = 0, + ZXDH_VF_MAX_RATE = 1, +}ZXDH_VF_METER_DATA_TYPE; + +typedef enum{ + VF_METER_RX_BPS = 0, + VF_METER_RX_PPS = 1, + VF_METER_TX_BPS = 2, + VF_METER_TX_PPS = 3, + VF_METER_TYPE_NUM, +}ZXDH_VF_METER_TYPE; + +#define IS_TX_METER(meter_type) (meter_type == VF_METER_TX_BPS || meter_type == VF_METER_TX_PPS) +#define IS_PPS_METER(meter_type) (meter_type == VF_METER_RX_PPS || meter_type == VF_METER_TX_PPS) + +struct zxdh_vf_meter_obj +{ + struct zxdh_pf_device *pf_dev; + struct zxdh_vf_obj *vf_obj; + struct kobject kobj; + uint32_t meter_type; + uint32_t min_rate; + uint32_t max_rate; +}; + +struct zxdh_vf_meters +{ + struct kobject *kobj; + struct kobject *rx_obj; + struct kobject *tx_obj; + struct zxdh_vf_meter_obj xps[4]; +}; + +struct zxdh_vf_obj +{ + struct zxdh_pf_device *pf_dev; + struct kobject kobj; + uint16_t vport; + uint16_t vf_idx; + struct zxdh_group_obj *group; + struct zxdh_vf_meters *meters; +}; + +struct zxdh_sriov_sysfs +{ + struct kobject *sriov_obj; +#ifdef ZXDH_PLCR_DEBUG + struct kobj_attribute burst_attr; + struct kobj_attribute profile_attr; +#endif + struct kobject *groups_obj; + struct zxdh_group_obj *group_0; + struct list_head groups_head; + struct zxdh_vf_obj *vfs; +}; + +struct zxdh_plcr_table { + struct xarray plcr_profiles[E_PLCR_CAR_NUM]; // Array of PLCR profiles(index = prfile id) + struct xarray plcr_flows[E_PLCR_CAR_NUM]; // Array of PLCR flows(index = flowid) + struct xarray plcr_maps[E_PLCR_CAR_NUM]; // Array of PLCR flows mapping relationship + uint32_t burst_size; +}; + +struct zxdh_plcr_cbs +{ + uint32_t min_rate; + uint32_t max_rate; + uint32_t cbs; +}; +extern const uint32_t gaudPlcrCarxProfileNum[E_PLCR_CAR_NUM]; +extern const uint32_t gaudPlcrCarxFlowIdNum[E_PLCR_CAR_NUM]; +int zxdh_plcr_remove_rate_limit(struct zxdh_pf_device *pf_dev, E_PLCR_CAR_TYPE car_type, uint32_t flowid); +void zxdh_plcr_count_profiles(struct zxdh_pf_device *pf_dev); +int zxdh_plcr_set_rate_limit(struct zxdh_pf_device *pf_dev, E_RATE_LIMIT_PKT_BYTE is_pkt_mode, E_PLCR_CAR_TYPE car_type, uint16_t vport, uint32_t flowid, uint32_t max_rate, uint32_t min_rate); +int32_t zxdh_plcr_get_next_map(struct zxdh_pf_device *pf_dev, E_PLCR_CAR_TYPE car_type, uint32_t flowid, uint32_t *map_flowid); +int32_t zxdh_plcr_init(struct zxdh_en_priv *en_priv); +int32_t zxdh_plcr_uninit(struct zxdh_en_priv *en_priv); +int zxdh_plcr_get_vport_vfid(struct zxdh_pf_device *pf_dev, uint32_t vf_idx, uint32_t *vport, uint32_t *vfid); +int zxdh_plcr_req_profile(struct zxdh_pf_device *pf_dev, E_PLCR_CAR_TYPE car_type, uint16_t *profile_id_out); +int zxdh_plcr_release_profile(struct zxdh_pf_device *pf_dev, E_PLCR_CAR_TYPE car_type, uint16_t profile_id); +int zxdh_plcr_count_up_profile(struct zxdh_pf_device *pf_dev, E_PLCR_CAR_TYPE car_type, uint16_t profile_id); +int zxdh_plcr_count_down_profile(struct zxdh_pf_device *pf_dev, E_PLCR_CAR_TYPE car_type, uint16_t profile_id); +int zxdh_plcr_cfg_profile(struct zxdh_pf_device *pf_dev, E_PLCR_CAR_TYPE car_type, DPP_STAT_CAR_PROFILE_CFG_T *profile_cfg); +int zxdh_plcr_get_profile(struct zxdh_pf_device *pf_dev, E_PLCR_CAR_TYPE car_type, uint32_t pkt_sign, uint16_t profile_id, DPP_STAT_CAR_PROFILE_CFG_T *profile_cfg); +uint32_t zxdh_plcr_reg_maxrate_user(uint32_t reg_maxrate); +int32_t zxdh_plcr_req_flow(struct zxdh_pf_device *pf_dev, E_PLCR_CAR_TYPE car_type, uint16_t flow_id, struct zxdh_plcr_flow **flow); +int32_t zxdh_plcr_release_flow(struct zxdh_pf_device *pf_dev, E_PLCR_CAR_TYPE car_type, uint16_t flow_id); +void zxdh_plcr_update_flow(struct zxdh_plcr_flow *flow, uint16_t vport, uint32_t max_rate, uint32_t min_rate); +int zxdh_plcr_store_profile(struct zxdh_pf_device *pf_dev, E_PLCR_CAR_TYPE car_type, uint32_t user_max_rate, uint32_t user_min_rate, DPP_STAT_CAR_PROFILE_CFG_T *profile_cfg); +int32_t zxdh_plcr_stroe_map(struct zxdh_pf_device *pf_dev, E_PLCR_CAR_TYPE car_type, uint32_t flowid, uint32_t map_flowid); +int32_t zxdh_plcr_clear_map(struct zxdh_pf_device *pf_dev, E_PLCR_CAR_TYPE car_type, uint32_t flowid); +int zxdh_plcr_get_mode(struct zxdh_pf_device *pf_dev, uint16_t vport, E_RATE_LIMIT_MODE *mode); +int zxdh_plcr_set_mode(struct zxdh_pf_device *pf_dev, uint16_t vport, E_RATE_LIMIT_MODE mode); +int zxdh_plcr_unified_set_rate_limit(struct zxdh_pf_device *pf_dev, zxdh_plcr_rate_limit_paras *rate_limit_paras); + +int zxdh_vf_update_sysfs_group(struct zxdh_pf_device *pf_dev, struct zxdh_vf_obj *vf, int32_t group_id); +int zxdh_create_vfs_sysfs(struct dh_core_dev *dev, int32_t num_vfs); +void zxdh_destroy_vfs_sysfs(struct dh_core_dev *dev, int32_t num_vfs); +int zxdh_sriov_sysfs_init(struct dh_core_dev *dev); +void zxdh_sriov_sysfs_exit(struct dh_core_dev *dev); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/sriov_sysfs.c b/src/net/drivers/net/ethernet/dinghai/sriov_sysfs.c new file mode 100644 index 0000000..9c34f26 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/sriov_sysfs.c @@ -0,0 +1,1483 @@ +#include +#include +#include +#include +#include +#include "en_aux.h" +#include +#include "en_np/table/include/dpp_tbl_api.h" +#include "en_aux/en_cmd.h" +#include "msg_common.h" +#include "en_pf.h" +#include +#ifdef TIME_STAMP_1588 +#include "en_aux/en_1588_pkt_proc.h" +#endif +#include +#include +#include +#include +#include +#include + + +#define ZXDH_DEFAULT_VF_GROUP_ID 0 +#define ZXDH_MAX_VF_GROUP_OBJ_ID 255 +#define ZXDH_MAX_VF_GROUP_OBJ_NUM (ZXDH_MAX_VF_GROUP_OBJ_ID + 1) +#define ZXDH_MAX_VF_OBJ_ID 255 +#define ZXDH_MAX_VF_OBJ_NUM (ZXDH_MAX_VF_OBJ_ID + 1) + + +/************************************************ + * sriov attr: + * burst: WO,配置当前PF的流量突发尺寸 + * profile: RO,打印当前PF对三级car的profile占用情况 +************************************************/ + + +/************************************************ + * group attr: + * config: RO,打印当前vf端口组所有配置 + * max_rx_rate: WO,配置当前vf端口组最大接收速率 + * max_tx_rate: WO,配置当前vf端口组最大发送速率 +************************************************/ + + +/************************************************ + * vf attr: + * config: RO,打印当前vf所有配置 + * group: WO,指定当前vf端口所属group,默认group-0 + * meter + * rx + * bps + * max_rate: WO,配置当前vf端口接收方向字节限速 + * min_rate: WO,配置当前vf端口接收方向字节最小保障带宽 + * pkt_dropped: RO, 查询丢包数量/字节数 + * pps + * rate: WO,配置当前vf端口接收方向包限速 + * pkt_dropped: RO, 查询丢包数量/字节数 + * tx + * bps + * max_rate: WO,配置当前vf端口发送方向字节限速 + * max_rate: WO,配置当前vf端口发送方向字节最小保障带宽 + * pkt_dropped: RO, 查询丢包数量/字节数 + + * pps + * pps_rate: WO,配置当前vf端口发送方向包限速 + * pkt_dropped: RO, 查询丢包数量/字节数 +************************************************/ + + +struct zxdh_group_attribute { + struct attribute attr; + ssize_t (*show)(struct zxdh_group_obj *group, + struct zxdh_group_attribute *attr, char *buf); + ssize_t (*store)(struct zxdh_group_obj *group, + struct zxdh_group_attribute *attr, const char *buf, size_t count); +}; + +#define to_zxdh_group_attr(x) container_of(x, struct zxdh_group_attribute, attr) +#define to_zxdh_group_obj(x) container_of(x, struct zxdh_group_obj, kobj) + +struct zxdh_vf_attribute { + struct attribute attr; + ssize_t (*show)(struct zxdh_vf_obj *vf, + struct zxdh_vf_attribute *attr, char *buf); + ssize_t (*store)(struct zxdh_vf_obj *vf, + struct zxdh_vf_attribute *attr, const char *buf, size_t count); +}; + +#define to_zxdh_vf_attr(x) container_of(x, struct zxdh_vf_attribute, attr) +#define to_zxdh_vf_obj(x) container_of(x, struct zxdh_vf_obj, kobj) + +struct zxdh_vf_meter_attribute { + struct attribute attr; + ssize_t (*show)(struct zxdh_vf_meter_obj *xps, + struct zxdh_vf_meter_attribute *attr, char *buf); + ssize_t (*store)(struct zxdh_vf_meter_obj *xps, + struct zxdh_vf_meter_attribute *attr, const char *buf, size_t count); +}; + +#define to_zxdh_vf_meter_attr(x) container_of(x, struct zxdh_vf_meter_attribute, attr) +#define to_zxdh_vf_meter_obj(x) container_of(x, struct zxdh_vf_meter_obj, kobj) + +/* + * The default show function that must be passed to sysfs. This will be + * called by sysfs for whenever a show function is called by the user on a + * sysfs file associated with the kobjects we have registered. We need to + * transpose back from a "default" kobject to our custom struct foo_obj and + * then call the show function for that specific object. + */ +static ssize_t zxdh_group_attr_show(struct kobject *kobj, + struct attribute *attr, + char *buf) +{ + struct zxdh_group_attribute *attribute; + struct zxdh_group_obj *group; + + attribute = to_zxdh_group_attr(attr); + group = to_zxdh_group_obj(kobj); + + if (!attribute->show) + return -EIO; + + return attribute->show(group, attribute, buf); +} + +/* + * Just like the default show function above, but this one is for when the + * sysfs "store" is requested (when a value is written to a file.) + */ +static ssize_t zxdh_group_attr_store(struct kobject *kobj, + struct attribute *attr, + const char *buf, size_t len) +{ + struct zxdh_group_attribute *attribute; + struct zxdh_group_obj *group; + + attribute = to_zxdh_group_attr(attr); + group = to_zxdh_group_obj(kobj); + + if (!attribute->store) + return -EIO; + + return attribute->store(group, attribute, buf, len); +} + +static ssize_t zxdh_vf_attr_show(struct kobject *kobj, + struct attribute *attr, + char *buf) +{ + struct zxdh_vf_attribute *attribute; + struct zxdh_vf_obj *vf; + + attribute = to_zxdh_vf_attr(attr); + vf = to_zxdh_vf_obj(kobj); + + if (!attribute->show) + return -EIO; + + return attribute->show(vf, attribute, buf); +} + +static ssize_t zxdh_vf_attr_store(struct kobject *kobj, + struct attribute *attr, + const char *buf, size_t len) +{ + struct zxdh_vf_attribute *attribute; + struct zxdh_vf_obj *vf; + + attribute = to_zxdh_vf_attr(attr); + vf = to_zxdh_vf_obj(kobj); + + if (!attribute->store) + return -EIO; + + return attribute->store(vf, attribute, buf, len); +} + +static ssize_t zxdh_vf_meter_attr_show(struct kobject *kobj, + struct attribute *attr, + char *buf) +{ + struct zxdh_vf_meter_attribute *attribute; + struct zxdh_vf_meter_obj *xps; + + attribute = to_zxdh_vf_meter_attr(attr); + xps = to_zxdh_vf_meter_obj(kobj); + + if (!attribute->show) + return -EIO; + + return attribute->show(xps, attribute, buf); +} + +static ssize_t zxdh_vf_meter_attr_store(struct kobject *kobj, + struct attribute *attr, + const char *buf, size_t len) +{ + struct zxdh_vf_meter_attribute *attribute; + struct zxdh_vf_meter_obj *xps; + + attribute = to_zxdh_vf_meter_attr(attr); + xps = to_zxdh_vf_meter_obj(kobj); + + if (!attribute->store) + return -EIO; + + return attribute->store(xps, attribute, buf, len); +} + +/* Our custom sysfs_ops that we will associate with our ktype later on */ +static const struct sysfs_ops zxdh_group_sysfs_ops = { + .show = zxdh_group_attr_show, + .store = zxdh_group_attr_store, +}; + +static const struct sysfs_ops zxdh_vf_sysfs_ops = { + .show = zxdh_vf_attr_show, + .store = zxdh_vf_attr_store, +}; + +static const struct sysfs_ops zxdh_vf_meter_sysfs_ops = { + .show = zxdh_vf_meter_attr_show, + .store = zxdh_vf_meter_attr_store, +}; + +/* + * The release function for our object. This is REQUIRED by the kernel to + * have. We free the memory held in our object here. + * + * NEVER try to get away with just a "blank" release function to try to be + * smarter than the kernel. Turns out, no one ever is... + */ +/*static void zxdh_group_release(struct kobject *kobj) +{ + struct zxdh_group_obj *group; + + LOG_INFO("enter\n"); + group = to_zxdh_group_obj(kobj); + kfree(group); +} + +static void zxdh_vf_release(struct kobject *kobj) +{ + struct zxdh_vf_obj *vf; + + LOG_INFO("enter\n"); + vf = to_zxdh_vf_obj(kobj); + kfree(vf); +} + +static void zxdh_vf_meter_release(struct kobject *kobj) +{ + struct zxdh_vf_meter_obj *xps; + + LOG_INFO("enter\n"); + xps = to_zxdh_vf_meter_obj(kobj); + kfree(xps); +}*/ + +#define _sprintf(p, buf, format, arg...) \ + ((PAGE_SIZE - (int)(p - buf)) <= 0 ? 0 : \ + scnprintf(p, PAGE_SIZE - (int)(p - buf), format, ## arg)) + +#ifdef ZXDH_PLCR_DEBUG +static ssize_t zxdh_burst_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + struct zxdh_pf_device *pf_dev; + struct zxdh_sriov_sysfs *sriov; + + LOG_INFO("enter\n"); + sriov = container_of(attr, struct zxdh_sriov_sysfs, burst_attr); + pf_dev = container_of(sriov, struct zxdh_pf_device, sriov); + + return sysfs_emit(buf, + "the burst size = %d\n", pf_dev->plcr_table.burst_size); +} + +static ssize_t zxdh_burst_store(struct kobject *kobj, + struct kobj_attribute *attr, const char *buf, size_t count) +{ + int rtn = 0; + uint32_t burst; + struct zxdh_pf_device *pf_dev; + struct zxdh_sriov_sysfs *sriov; + + LOG_INFO("enter\n"); + sriov = container_of(attr, struct zxdh_sriov_sysfs, burst_attr); + pf_dev = container_of(sriov, struct zxdh_pf_device, sriov); + + rtn = kstrtoint(buf, 10, &burst); + if (rtn) + return rtn; + + /* When the burst changes, the rate limit of the specified flow needs + to be reconfigured to update its burst. + The scope of the burst includes the current PF and its associated VFs. + Write 0 to set the burst to the default value.*/ + + pf_dev->plcr_table.burst_size = burst; + + return count; +} + +static ssize_t zxdh_profile_stat_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + struct zxdh_sriov_sysfs *sriov = container_of(attr, struct zxdh_sriov_sysfs, profile_attr); + struct zxdh_pf_device *pf_dev = container_of(sriov, struct zxdh_pf_device, sriov); + struct zxdh_plcr_profile *profile; + unsigned long index; + uint32_t count = 0; + E_PLCR_CAR_TYPE car_type; + char *p = buf; + + LOG_INFO("enter\n"); + for (car_type = E_PLCR_CAR_A; car_type < E_PLCR_CAR_NUM; car_type ++) + { + count = 0; + xa_for_each_range(&(pf_dev->plcr_table.plcr_profiles[car_type]), index, + profile, 0, gaudPlcrCarxProfileNum[car_type]) + { + count++; + } + p += _sprintf(p, buf, "car_type = %d, profiles_num = %d\n", car_type, count); + } + return (ssize_t)(p - buf); +} +#endif + +#ifdef ZXDH_PLCR_OPEN +static uint16_t zxdh_group_to_flowid(struct zxdh_group_obj *group, int32_t data_type) +{ + uint16_t flowid; + uint16_t vport = group->pf_dev->vport; + int32_t group_id = group->group_id; + int32_t global_group_id; + + global_group_id = EPID(vport) * 128 + FUNC_NUM(vport) * 16 + group_id; + flowid = (data_type == ZXDH_GROUP_TX_RATE) ? + (global_group_id * 2 + 1) : (global_group_id * 2); + + return flowid; +} + +static uint16_t zxdh_vport_to_flowid(uint16_t vport, int32_t req_type, int32_t direction) +{ + uint16_t vfid; + uint16_t flowid; + + LOG_INFO("enter\n"); + vfid = VQM_VFID(vport); + if (req_type == E_RATE_LIMIT_BYTE) + { + flowid = direction ? (vfid * 2 + 1) : (vfid * 2); + } + else if (req_type == E_RATE_LIMIT_PACKET) + { + flowid = direction ? (vfid * 2 + 1) : (vfid * 2) + PLCR_CAR_A_DPDK_FLOWID_OFFSET; + } + + return flowid; +} + +static uint32_t zxdh_vf_meter_obj_to_flowid(struct zxdh_vf_meter_obj *xps) +{ + uint16_t vport; + uint16_t vfid; + uint16_t flowid; + + LOG_INFO("enter\n"); + vport = xps->vf_obj->vport; + vfid = VQM_VFID(vport); + flowid = IS_TX_METER(xps->meter_type) ? (vfid * 2 + 1) : (vfid * 2); + + return flowid; +} + +static int zxdh_set_vf_group_rate_limit(struct zxdh_group_obj *group, int32_t direction, uint32_t max_rate) +{ + int rtn = 0; + zxdh_plcr_rate_limit_paras rate_limit_paras; + + LOG_INFO("enter\n"); + + // en_priv = pf_dev_get_en_priv(group->pf_dev); + // if (IS_ERR(en_priv)) + // return PTR_ERR(en_priv); + + rate_limit_paras.req_type = E_RATE_LIMIT_REQ_VF_GROUP_BYTE; + rate_limit_paras.direction = direction; // rx:0, tx:1 + rate_limit_paras.mode = E_RATE_LIMIT_BYTE; + rate_limit_paras.max_rate = max_rate; + rate_limit_paras.min_rate = PLCR_INVALID_PARAM; + + rate_limit_paras.queue_id = PLCR_INVALID_PARAM; + rate_limit_paras.vf_idx = PLCR_INVALID_PARAM; + rate_limit_paras.vfid = PLCR_INVALID_PARAM; + rate_limit_paras.group_id = group->group_id; + + rtn = zxdh_plcr_unified_set_rate_limit(group->pf_dev, &rate_limit_paras); + PLCR_COMM_ASSERT(rtn); + + return rtn; +} + +static int zxdh_move_vf_to_group(struct zxdh_vf_obj *vf, struct zxdh_group_obj *group) +{ + int rtn = 0; + zxdh_plcr_rate_limit_paras rate_limit_paras; + + LOG_INFO("enter\n"); + rate_limit_paras.req_type = E_RATE_LIMIT_REQ_MOVE_VF_GROUP; + rate_limit_paras.direction = E_RATE_LIMIT_RX; + rate_limit_paras.mode = PLCR_INVALID_PARAM; + rate_limit_paras.max_rate = PLCR_INVALID_PARAM; + rate_limit_paras.min_rate = PLCR_INVALID_PARAM; + + rate_limit_paras.queue_id = PLCR_INVALID_PARAM; + rate_limit_paras.vf_idx = vf->vf_idx; + rate_limit_paras.vfid = PLCR_INVALID_PARAM; + rate_limit_paras.group_id = group->group_id; + + rtn = zxdh_plcr_unified_set_rate_limit(vf->pf_dev, &rate_limit_paras); + PLCR_COMM_ASSERT(rtn); + + rate_limit_paras.direction = E_RATE_LIMIT_TX; + rtn = zxdh_plcr_unified_set_rate_limit(vf->pf_dev, &rate_limit_paras); + PLCR_COMM_ASSERT(rtn); + // todo:由plcr代码处理 + // if (rtn) + // { + // PLCR_LOG_ERR("failed and rtn=0x%x\n", rtn) + + // rate_limit_paras.direction = E_RATE_LIMIT_RX; + // rate_limit_paras.group_id = vf->group->group_id; + // zxdh_plcr_unified_set_rate_limit(vf->pf_dev, &rate_limit_paras); + // } + + return rtn; +} +#endif + +static ssize_t zxdh_group_max_rate_store(struct zxdh_group_obj *group, + struct zxdh_group_attribute *attr, const char *buf, + size_t count, int32_t direction) +{ + int32_t max_rate; + // uint16_t flowid; + int rtn = 0; + LOG_INFO("enter\n"); + + if (group == group->pf_dev->sriov.group_0) + return -EINVAL; + + rtn = kstrtoint(buf, 10, &max_rate); + if (rtn < 0) + return -EINVAL; + LOG_INFO("max_%s_rate = %d\n", direction ? "tx" : "rx", max_rate); + + if ((direction ? group->max_tx_rate : group->max_rx_rate) == max_rate) + return -EINVAL; + + // flowid = zxdh_group_to_flowid(group, direction); + +#ifdef ZXDH_PLCR_OPEN + //调用限速统一接口,配置vf group限速 + rtn = zxdh_set_vf_group_rate_limit(group, direction, max_rate); + if (rtn) + return rtn; + + PLCR_LOG_INFO("The Max %s Rate of group%d has been set to %d Mbit/s\n", + direction ? "Tx" : "Rx", group->group_id, max_rate); +#endif + + if (direction == ZXDH_GROUP_TX_RATE) + group->max_tx_rate = max_rate; + else + group->max_rx_rate = max_rate; + + return rtn ? rtn : count; +} + +static ssize_t zxdh_group_max_rx_rate_show(struct zxdh_group_obj *group, + struct zxdh_group_attribute *attr, char *buf) +{ + + LOG_INFO("enter\n"); + return sysfs_emit(buf, + "usage: write to set VF group max rx rate\n"); +} + +static ssize_t zxdh_group_max_rx_rate_store(struct zxdh_group_obj *group, + struct zxdh_group_attribute *attr, const char *buf, size_t count) +{ + return zxdh_group_max_rate_store(group, attr, buf, count, ZXDH_GROUP_RX_RATE); +} + +/* + * The "max_tx_rate" file where the .max_tx_rate variable is read from and written to. + */ +static ssize_t zxdh_group_max_tx_rate_show(struct zxdh_group_obj *group, + struct zxdh_group_attribute *attr, char *buf) +{ + + LOG_INFO("enter\n"); + return sysfs_emit(buf, + "usage: write to set VF group max tx rate\n"); +} + +static ssize_t zxdh_group_max_tx_rate_store(struct zxdh_group_obj *group, + struct zxdh_group_attribute *attr, const char *buf, size_t count) +{ + return zxdh_group_max_rate_store(group, attr, buf, count, ZXDH_GROUP_TX_RATE); +} + +static ssize_t zxdh_group_config_show(struct zxdh_group_obj *group, + struct zxdh_group_attribute *attr, char *buf) +{ + //打印当前group配置信息 + char *p = buf; + uint16_t vf_idx; + int32_t num_vfs = group->pf_dev->num_vfs; + struct zxdh_vf_obj *vf; + + LOG_INFO("enter\n"); + // if (!mutex_trylock(&esw->state_lock)) + // return -EBUSY; + + p += _sprintf(p, buf, "GroupID : %d\n", group->group_id); + p += _sprintf(p, buf, "Num VFs : %d\n", group->num_vfs); + p += _sprintf(p, buf, "MaxTxRate : %d\n", group->max_tx_rate); + p += _sprintf(p, buf, "MaxRxRate : %d\n", group->max_rx_rate); + + if (group->num_vfs) + { + p += _sprintf(p, buf, "VFs : "); + for (vf_idx = 0; vf_idx < num_vfs; vf_idx ++) + { + vf = group->pf_dev->sriov.vfs + vf_idx; + if (vf->group == group) + p += _sprintf(p, buf, "VF%d ", vf_idx); + } + p += _sprintf(p, buf, "\n"); + } + + // mutex_unlock(&esw->state_lock); + + return (ssize_t)(p - buf); +} + +static ssize_t zxdh_group_config_store(struct zxdh_group_obj *group, + struct zxdh_group_attribute *attr, const char *buf, size_t count) +{ + LOG_INFO("enter\n"); + return -ENOTSUPP; +} + +static ssize_t zxdh_vf_config_show(struct zxdh_vf_obj *vf, + struct zxdh_vf_attribute *attr, char *buf) +{ + //打印当前vf配置信息 +#ifdef ZXDH_PLCR_OPEN + struct zxdh_pf_device *pf_dev = vf->pf_dev; + struct xarray *xa_bps_flow, *xa_pps_flow; + struct zxdh_plcr_flow *flow_bps_rx, *flow_bps_tx, *flow_pps_rx, *flow_pps_tx; + uint32_t id_bps_rx, id_bps_tx, id_pps_rx, id_pps_tx; + E_RATE_LIMIT_MODE mode; +#endif + char *p = buf; + + LOG_INFO("enter\n"); + // mutex_lock(&esw->state_lock); + +#ifdef ZXDH_PLCR_OPEN + xa_bps_flow = &(pf_dev->plcr_table.plcr_flows[E_PLCR_CAR_B]); + zxdh_plcr_get_mode(pf_dev, vf->vport, &mode); + + id_bps_rx = zxdh_vport_to_flowid(vf->vport, E_RATE_LIMIT_BYTE, E_RATE_LIMIT_RX); + id_bps_tx = zxdh_vport_to_flowid(vf->vport, E_RATE_LIMIT_BYTE, E_RATE_LIMIT_TX); + flow_bps_rx = xa_load(xa_bps_flow, id_bps_rx); + flow_bps_tx = xa_load(xa_bps_flow, id_bps_tx); +#endif + + p += _sprintf(p, buf, "VF : VF%d\n", vf->vf_idx); + p += _sprintf(p, buf, "RateGroup : %d\n", vf->group->group_id); +#ifdef ZXDH_PLCR_OPEN + p += _sprintf(p, buf, "VportQosMode: %d\n", mode); + + if (flow_bps_rx) + { + p += _sprintf(p, buf, "MinRxRate : %dMbit/s\n", flow_bps_rx->min_rate); + p += _sprintf(p, buf, "MaxRxRate : %dMbit/s\n", flow_bps_rx->max_rate); + } + + if (flow_bps_tx) + { + p += _sprintf(p, buf, "MinTxRate : %dMbit/s\n", flow_bps_tx->min_rate); + p += _sprintf(p, buf, "MaxTxRate : %dMbit/s\n", flow_bps_tx->max_rate); + } + // if (mode == E_RATE_LIMIT_MODE0) + // { + + // } + // else if (mode == E_RATE_LIMIT_MODE1) + // { + + // } + if (mode == E_RATE_LIMIT_MODE2) + { + xa_pps_flow = &(pf_dev->plcr_table.plcr_flows[E_PLCR_CAR_A]); + id_pps_rx = zxdh_vport_to_flowid(vf->vport, E_RATE_LIMIT_PACKET, E_RATE_LIMIT_RX); + id_pps_tx = zxdh_vport_to_flowid(vf->vport, E_RATE_LIMIT_PACKET, E_RATE_LIMIT_TX); + flow_pps_rx = xa_load(xa_pps_flow, id_pps_rx); + flow_pps_tx = xa_load(xa_pps_flow, id_pps_tx); + + if (flow_pps_rx) + p += _sprintf(p, buf, "MaxRxRate : %dPackets/s\n", flow_pps_rx->max_rate); + + if (flow_pps_tx) + p += _sprintf(p, buf, "MaxTxRate : %dPackets/s\n", flow_pps_tx->min_rate); + } + +#endif + + // mutex_unlock(&esw->state_lock); + + return (ssize_t)(p - buf); +} + +static ssize_t zxdh_vf_config_store(struct zxdh_vf_obj *vf, + struct zxdh_vf_attribute *attr, const char *buf, size_t count) +{ + LOG_INFO("enter\n"); + return -ENOTSUPP; +} + +static ssize_t zxdh_vf_group_show(struct zxdh_vf_obj *vf, + struct zxdh_vf_attribute *attr, char *buf) +{ + LOG_INFO("enter\n"); + + return sysfs_emit(buf, + "usage: write <0-%d> to set VF vport group\n", ZXDH_MAX_VF_GROUP_OBJ_ID); +} + +static ssize_t zxdh_vf_group_store(struct zxdh_vf_obj *vf, + struct zxdh_vf_attribute *attr, const char *buf, size_t count) +{ + int32_t group_id; + int rtn = 0; + LOG_INFO("enter\n"); + + rtn = kstrtoint(buf, 10, &group_id); + if (rtn < 0) + return -EINVAL; + LOG_INFO("group = %d\n", group_id); + + rtn = zxdh_vf_update_sysfs_group(vf->pf_dev, vf, group_id); + if (rtn) + { + LOG_ERR("zxdh_vf_update_sysfs_group failed\n"); + return rtn; + } + + PLCR_LOG_INFO("VF%d has been moved to group%d\n", vf-> vf_idx, group_id); + + return count; +} + +static ssize_t zxdh_vf_meter_rate_store(struct zxdh_vf_meter_obj *xps, + struct zxdh_vf_meter_attribute *attr, const char *buf, + size_t count, int32_t data_type) +{ +#ifdef ZXDH_PLCR_OPEN + struct zxdh_pf_device *pf_dev = xps->pf_dev; + struct xarray *xarray_flowid = &(pf_dev->plcr_table.plcr_flows[E_PLCR_CAR_B]); + struct zxdh_plcr_flow *plcr_flow; + zxdh_plcr_rate_limit_paras rate_limit_paras; + uint32_t flowid; + uint16_t vport; + const char *direction; +#endif + int32_t data; + int rtn = 0; + + LOG_INFO("enter\n"); + rtn = kstrtoint(buf, 10, &data); + if (rtn < 0) + return -EINVAL; + +#ifdef ZXDH_PLCR_OPEN + vport = xps->vf_obj->vport; + flowid = zxdh_vf_meter_obj_to_flowid(xps); + plcr_flow = xa_load(xarray_flowid, flowid); + + //调用限速统一接口,配置vf限速 + if (IS_PPS_METER(xps->meter_type)) + { + LOG_INFO("max_rate = %d Packets/s\n", data); + rate_limit_paras.req_type = E_RATE_LIMIT_REQ_VF_PKT; + rate_limit_paras.mode = E_RATE_LIMIT_PACKET; + rate_limit_paras.min_rate = 0; + rate_limit_paras.max_rate = data; + } + else + { + rate_limit_paras.req_type = E_RATE_LIMIT_REQ_VF_BYTE; + rate_limit_paras.mode = E_RATE_LIMIT_BYTE; + + if (data_type == ZXDH_VF_MIN_RATE) + { + LOG_INFO("min_rate = %d Mbit/s\n", data); + rate_limit_paras.min_rate = data; + if (plcr_flow) + rate_limit_paras.max_rate = plcr_flow->max_rate; + else + rate_limit_paras.max_rate = data; + } + else if (data_type == ZXDH_VF_MAX_RATE) + { + LOG_INFO("max_rate = %d Mbit/s\n", data); + if (plcr_flow) + rate_limit_paras.min_rate = plcr_flow->min_rate; + else + rate_limit_paras.min_rate = 0; + rate_limit_paras.max_rate = data; + } + else + return -EINVAL; + + if (rate_limit_paras.max_rate < rate_limit_paras.min_rate) + rate_limit_paras.max_rate = rate_limit_paras.min_rate; + } + + rate_limit_paras.direction = IS_TX_METER(xps->meter_type) ? E_RATE_LIMIT_TX : E_RATE_LIMIT_RX; + rate_limit_paras.queue_id = PLCR_INVALID_PARAM; + rate_limit_paras.vf_idx = xps->vf_obj->vf_idx; + rate_limit_paras.vfid = PLCR_INVALID_PARAM; + rate_limit_paras.group_id = PLCR_INVALID_PARAM; + + rtn = zxdh_plcr_unified_set_rate_limit(pf_dev, &rate_limit_paras); + PLCR_COMM_ASSERT(rtn); + + direction = IS_TX_METER(xps->meter_type) ? "Tx" : "Rx"; + if (IS_PPS_METER(xps->meter_type)) + { + PLCR_LOG_INFO( + "The Max %s Rate of VF%d has been set to %d Packets/s\n", + direction, xps->vf_obj->vf_idx, data); + } + else + { + PLCR_LOG_INFO( + "The Rate of VF%d has been set to: Min %s Rate: %d Mbit/s, Max %s Rate: %d Mbit/s\n", + xps->vf_obj->vf_idx, + direction, rate_limit_paras.min_rate, + direction, rate_limit_paras.max_rate); + } +#endif + + if (data_type == ZXDH_VF_MIN_RATE) + xps->min_rate = data; + else + xps->max_rate = data; + + return rtn ? rtn : count; +} + +static ssize_t zxdh_vf_meter_min_rate_show(struct zxdh_vf_meter_obj *xps, + struct zxdh_vf_meter_attribute *attr, char *buf) +{ + uint32_t meter_type = xps->meter_type; + LOG_INFO("enter\n"); + + return sysfs_emit(buf, + "usage: write to set VF %s min rate\n", + IS_TX_METER(meter_type) ? "tx" : "rx"); +} + +static ssize_t zxdh_vf_meter_min_rate_store(struct zxdh_vf_meter_obj *xps, + struct zxdh_vf_meter_attribute *attr, const char *buf, size_t count) +{ + return zxdh_vf_meter_rate_store(xps, attr, buf, count, ZXDH_VF_MIN_RATE); +} + +static ssize_t zxdh_vf_meter_max_rate_show(struct zxdh_vf_meter_obj *xps, + struct zxdh_vf_meter_attribute *attr, char *buf) +{ + uint32_t meter_type = xps->meter_type; + LOG_INFO("enter\n"); + + return sysfs_emit(buf, + "usage: write to set VF %s max rate\n", + IS_PPS_METER(meter_type) ? "Packets/s" : "Mbit/s", + IS_TX_METER(meter_type) ? "tx" : "rx"); +} + +static ssize_t zxdh_vf_meter_max_rate_store(struct zxdh_vf_meter_obj *xps, + struct zxdh_vf_meter_attribute *attr, const char *buf, size_t count) +{ + return zxdh_vf_meter_rate_store(xps, attr, buf, count, ZXDH_VF_MAX_RATE); +} + + +#define ZXDH_RATE_GROUP_ATTR(_name) \ + static struct zxdh_group_attribute zxdh_group_##_name = \ + __ATTR(_name, 0644, zxdh_group_##_name##_show, zxdh_group_##_name##_store) + +#define ZXDH_VF_ATTR(_name) \ + static struct zxdh_vf_attribute zxdh_vf_##_name = \ + __ATTR(_name, 0644, zxdh_vf_##_name##_show, zxdh_vf_##_name##_store) + +#define ZXDH_VF_METER_ATTR(_name) \ + static struct zxdh_vf_meter_attribute zxdh_vf_meter_##_name = \ + __ATTR(_name, 0644, zxdh_vf_meter_##_name##_show, zxdh_vf_meter_##_name##_store) + +/* Sysfs attributes cannot be world-writable. */ +ZXDH_RATE_GROUP_ATTR(max_tx_rate); +ZXDH_RATE_GROUP_ATTR(max_rx_rate); +ZXDH_RATE_GROUP_ATTR(config); +ZXDH_VF_ATTR(config); +ZXDH_VF_ATTR(group); +ZXDH_VF_METER_ATTR(min_rate); +ZXDH_VF_METER_ATTR(max_rate); + +// static struct zxdh_group_attribute zxdh_group_max_tx_rate __ro_after_init +// = __ATTR(max_tx_rate, 0200, NULL, zxdh_group_max_tx_rate_store); + +// static struct zxdh_group_attribute zxdh_group_config __ro_after_init +// = __ATTR(config, 0444, zxdh_group_config_show, NULL); + +// static struct zxdh_vf_attribute zxdh_vf_group __ro_after_init +// = __ATTR(group, 0644, zxdh_vf_group_show, zxdh_vf_group_store); + +/* + * Create a group of attributes so that we can create and destroy them all + * at once. + */ +static struct attribute *zxdh_group_default_attrs[] = { + &zxdh_group_max_tx_rate.attr, + &zxdh_group_max_rx_rate.attr, + &zxdh_group_config.attr, + NULL, /* need to NULL terminate the list of attributes */ +}; +ATTRIBUTE_GROUPS(zxdh_group_default); + +static struct attribute *zxdh_vf_default_attrs[] = { + &zxdh_vf_config.attr, + &zxdh_vf_group.attr, + NULL, +}; +ATTRIBUTE_GROUPS(zxdh_vf_default); + +static struct attribute *zxdh_vf_meter_bps_attrs[] = { + &zxdh_vf_meter_min_rate.attr, + &zxdh_vf_meter_max_rate.attr, + NULL, +}; +ATTRIBUTE_GROUPS(zxdh_vf_meter_bps); + +static struct attribute *zxdh_vf_meter_pps_attrs[] = { + &zxdh_vf_meter_max_rate.attr, + NULL, +}; +ATTRIBUTE_GROUPS(zxdh_vf_meter_pps); + +/* + * Our own ktype for our kobjects. Here we specify our sysfs ops, the + * release function, and the set of default attributes we want created + * whenever a kobject of this type is registered with the kernel. + */ +// static const struct kobj_type +static struct kobj_type zxdh_group_ktype = { + .sysfs_ops = &zxdh_group_sysfs_ops, + // .release = zxdh_group_release, + .default_groups = zxdh_group_default_groups, +}; + +// static const struct kobj_type +static struct kobj_type zxdh_vf_ktype = { + .sysfs_ops = &zxdh_vf_sysfs_ops, + // .release = zxdh_vf_release, + .default_groups = zxdh_vf_default_groups, +}; + +static struct kobj_type zxdh_vf_meter_bps_ktype = { + .sysfs_ops = &zxdh_vf_meter_sysfs_ops, + // .release = zxdh_vf_meter_release, + .default_groups = zxdh_vf_meter_bps_groups, +}; + +static struct kobj_type zxdh_vf_meter_pps_ktype = { + .sysfs_ops = &zxdh_vf_meter_sysfs_ops, + // .release = zxdh_vf_meter_release, + .default_groups = zxdh_vf_meter_pps_groups, +}; + +static struct zxdh_group_obj * +zxdh_create_group_obj(struct zxdh_pf_device *pf_dev, int32_t group_id) +{ + struct kobject *groups_obj = pf_dev->sriov.groups_obj; + struct zxdh_group_obj *group; + int rtn = 0; + + LOG_INFO("enter\n"); + /* allocate the memory for the whole object */ + group = kzalloc(sizeof(struct zxdh_group_obj), GFP_KERNEL); + if (!group) + return ERR_PTR(-ENOMEM); + + group->pf_dev = pf_dev; + group->group_id = group_id; + + rtn = kobject_init_and_add(&group->kobj, &zxdh_group_ktype, groups_obj, "group%d", group_id); + if (rtn) + { + LOG_INFO("create group-%d kobject failed\n", group_id); + kobject_put(&group->kobj); + kfree(group); + return ERR_PTR(rtn); + } + + /* We are always responsible for sending the uevent that the kobject + * was added to the system. + */ + kobject_uevent(&group->kobj, KOBJ_ADD); + + list_add_tail(&group->list, &pf_dev->sriov.groups_head); + + init_completion(&group->free_group_comp); + + return group; +} + +int zxdh_create_vf_obj(struct zxdh_pf_device *pf_dev, uint16_t vf_idx) +{ + struct zxdh_vf_obj *vf_obj; + int rtn; + + LOG_INFO("enter\n"); + + vf_obj = pf_dev->sriov.vfs + vf_idx; + vf_obj->pf_dev = pf_dev; + vf_obj->vport = pf_dev->vf_item[vf_idx].vport; + vf_obj->vf_idx = vf_idx; + vf_obj->group = pf_dev->sriov.group_0; + + LOG_INFO("p_sriov_obj = %p, vport = %d\n", pf_dev->sriov.sriov_obj, pf_dev->vport); + LOG_INFO("vf_idx = %d, vport = %d, group_id = %d\n",\ + pf_dev->sriov.vfs[vf_idx].vf_idx, pf_dev->sriov.vfs[vf_idx].vport, pf_dev->sriov.vfs[vf_idx].group->group_id); + + rtn = kobject_init_and_add(&vf_obj->kobj, &zxdh_vf_ktype, pf_dev->sriov.sriov_obj, + "vf%d", vf_idx); + if (rtn) + { + LOG_INFO("create vf-%d kobject failed\n", vf_idx); + kobject_put(&vf_obj->kobj); + return -ENOMEM; + } + + vf_obj->group->num_vfs ++; + + kobject_uevent(&vf_obj->kobj, KOBJ_ADD); + + return rtn; +} + +static void zxdh_destroy_group_obj_work(struct work_struct *work) +{ + struct zxdh_group_work *group_work = container_of(work, struct zxdh_group_work, work); + struct zxdh_group_obj *group_obj = group_work->group_obj; + + LOG_INFO("enter\n"); + kobject_put(&group_obj->kobj); + complete_all(&group_obj->free_group_comp); + kfree(group_work); +} + +void zxdh_destroy_group_obj(struct zxdh_group_obj *group_obj) +{ + struct zxdh_group_work *group_work; + + LOG_INFO("enter\n"); + group_work = kzalloc(sizeof *group_work, GFP_ATOMIC); + if (unlikely(NULL == group_work)) + { + kobject_put(&group_obj->kobj); + complete_all(&group_obj->free_group_comp); + + list_del(&group_obj->list); + return; + } + + INIT_WORK(&group_work->work, zxdh_destroy_group_obj_work); + group_work->group_obj = group_obj; + queue_work(system_wq, &group_work->work); + + list_del(&group_obj->list); +} + +void zxdh_destroy_vf_obj(struct zxdh_pf_device *pf_dev, uint16_t vf_idx) +{ + struct zxdh_vf_obj *vf_obj; + + LOG_INFO("enter\n"); + vf_obj = pf_dev->sriov.vfs + vf_idx; + kobject_put(&vf_obj->kobj); +} + + +/********************************************** +**********************************************/ + +static struct zxdh_group_obj * +zxdh_find_sysfs_group(struct zxdh_pf_device *pf_dev, int32_t group_id) +{ + struct zxdh_group_obj *group; + + list_for_each_entry(group, &pf_dev->sriov.groups_head, list) + { + if (group->group_id == group_id) + return group; + } + + return NULL; +} + +int zxdh_vf_update_sysfs_group(struct zxdh_pf_device *pf_dev, struct zxdh_vf_obj *vf, int32_t group_id) +{ + struct zxdh_group_obj *curr_group; + struct zxdh_group_obj *new_group; + int rtn = 0; +#ifdef ZXDH_PLCR_OPEN + struct xarray *xarray_flowid; + struct zxdh_plcr_flow *plcr_rx_flow; + struct zxdh_plcr_flow *plcr_tx_flow; + int16_t curr_rx_id; + int16_t curr_tx_id; +#endif + + // mutex_lock(&esw->state_lock); + + curr_group = vf->group; + if (curr_group && curr_group->group_id == group_id) + { + LOG_ERR("VF is already in the group%d\n", group_id); + goto out; + } + + if (group_id) + { + new_group = zxdh_find_sysfs_group(pf_dev, group_id); + if (!new_group) + { + new_group = zxdh_create_group_obj(pf_dev, group_id); + if (IS_ERR(new_group)) + { + rtn = PTR_ERR(new_group); + LOG_ERR("create new sysfs group-%d failed (%d)\n", group_id, rtn); + goto out; + } + } + } + else + { + new_group = pf_dev->sriov.group_0; + } + +#ifdef ZXDH_PLCR_OPEN + //调用限速统一接口,映射vf到目标group + rtn = zxdh_move_vf_to_group(vf, new_group); + if (rtn) + { + PLCR_LOG_ERR("failed and rtn=0x%x\n", rtn) + goto err_update; + } +#endif + + vf->group = new_group; + new_group->num_vfs++; + if (!curr_group) + goto out; + curr_group->num_vfs--; + + if (curr_group != pf_dev->sriov.group_0 && !curr_group->num_vfs) + { + zxdh_destroy_group_obj(curr_group); + +#ifdef ZXDH_PLCR_OPEN + //限速统一接口,移除当前carc flow限速 + curr_rx_id = zxdh_group_to_flowid(curr_group, ZXDH_GROUP_RX_RATE); + curr_tx_id = zxdh_group_to_flowid(curr_group, ZXDH_GROUP_TX_RATE); + + xarray_flowid = &(pf_dev->plcr_table.plcr_flows[E_PLCR_CAR_C]); + plcr_rx_flow = xa_load(xarray_flowid, curr_rx_id); + plcr_tx_flow = xa_load(xarray_flowid, curr_tx_id); + + if (xa_load(xarray_flowid, curr_rx_id)) + rtn = zxdh_set_vf_group_rate_limit(curr_group, ZXDH_GROUP_RX_RATE, 0); + if (xa_load(xarray_flowid, curr_rx_id)) + rtn = zxdh_set_vf_group_rate_limit(curr_group, ZXDH_GROUP_TX_RATE, 0); +#endif + + wait_for_completion(&curr_group->free_group_comp); + kfree(curr_group); + } + goto out; + +#ifdef ZXDH_PLCR_OPEN +err_update: + if (new_group != pf_dev->sriov.group_0 && !new_group->num_vfs) + { + zxdh_destroy_group_obj(new_group); + + wait_for_completion(&new_group->free_group_comp); + kfree(new_group); + } +#endif +out: + // mutex_unlock(&esw->state_lock); + return rtn; +} + +static int zxdh_creat_vf_meter_obj(struct zxdh_vf_obj *vf, + struct zxdh_vf_meters *meters, + uint32_t meter_type) +{ + struct zxdh_vf_meter_obj *xps; + struct kobject *parent; + struct kobj_type *ktype; + const char *name; + int rtn; + + if (meter_type >= VF_METER_TYPE_NUM) + return -EINVAL; + + xps = &meters->xps[meter_type]; + + if (IS_TX_METER(meter_type)) + parent = meters->tx_obj; + else + parent = meters->rx_obj; + + if (IS_PPS_METER(meter_type)) + { + ktype = &zxdh_vf_meter_pps_ktype; + name = "pps"; + } + else + { + ktype = &zxdh_vf_meter_bps_ktype; + name = "bps"; + } + + rtn = kobject_init_and_add(&xps->kobj, ktype, parent, name); + if (rtn) + { + kobject_put(&xps->kobj); + return rtn; + } + + xps->pf_dev = vf->pf_dev; + xps->vf_obj = vf; + xps->meter_type = meter_type; + + return 0; +} + +int zxdh_create_vf_meters_sysfs(struct zxdh_pf_device *pf_dev, uint16_t vf_idx) +{ + int rtn = 0; + struct zxdh_vf_obj *vf; + struct zxdh_vf_meters *meters; + + LOG_INFO("enter\n"); + + vf = pf_dev->sriov.vfs + vf_idx; + + meters = kzalloc(sizeof(struct zxdh_vf_meters), GFP_KERNEL); + if (!meters) + { + return -ENOMEM; + } + + meters->kobj = kobject_create_and_add("meters", &vf->kobj); + if (!meters->kobj) + { + rtn = -EINVAL; + goto err_vf_meters; + } + + meters->rx_obj = kobject_create_and_add("rx", meters->kobj); + if (!meters->rx_obj) + { + rtn = -EINVAL; + goto err_vf_meters; + } + + meters->tx_obj = kobject_create_and_add("tx", meters->kobj); + if (!meters->tx_obj) + { + rtn = -EINVAL; + goto err_vf_meters; + } + + rtn = zxdh_creat_vf_meter_obj(vf, meters, VF_METER_RX_BPS); + if (rtn) + goto err_vf_meters; + + rtn = zxdh_creat_vf_meter_obj(vf, meters, VF_METER_RX_PPS); + if (rtn) + goto err_put_xps_0; + + rtn = zxdh_creat_vf_meter_obj(vf, meters, VF_METER_TX_BPS); + if (rtn) + goto err_put_xps_1; + + rtn = zxdh_creat_vf_meter_obj(vf, meters, VF_METER_TX_PPS); + if (rtn) + goto err_put_xps_2; + + vf->meters = meters; + + return 0; + +err_put_xps_2: + kobject_put(&meters->xps[VF_METER_TX_BPS].kobj); +err_put_xps_1: + kobject_put(&meters->xps[VF_METER_RX_PPS].kobj); +err_put_xps_0: + kobject_put(&meters->xps[VF_METER_RX_BPS].kobj); +err_vf_meters: + kobject_put(meters->rx_obj); + kobject_put(meters->tx_obj); + kobject_put(meters->kobj); + + kfree(meters); + + return rtn; +} + +static void zxdh_destroy_vf_meters_sysfs(struct zxdh_pf_device *pf_dev, uint16_t vf_idx) +{ + struct zxdh_vf_obj *vf; + struct zxdh_vf_meters *meters; + uint32_t meter_type; + + LOG_INFO("enter\n"); + + vf = pf_dev->sriov.vfs + vf_idx; + meters = vf->meters; + if (!meters) + return; + + //限速统一接口,移除当前vf所有限速 todo:en层的vf remove应该已经执行了该操作 + + for (meter_type = 0; meter_type < 4; meter_type++) + kobject_put(&meters->xps[meter_type].kobj); + + kobject_put(meters->rx_obj); + kobject_put(meters->tx_obj); + kobject_put(meters->kobj); + + kfree(meters); +} + +int zxdh_create_vfs_sysfs(struct dh_core_dev *dev, int32_t num_vfs) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dev); + int rtn = 0; + uint16_t vf_idx; + + LOG_INFO("enter\n"); + pf_dev->sriov.vfs = kcalloc(num_vfs, sizeof(struct zxdh_vf_obj), GFP_KERNEL); + if (!pf_dev->sriov.vfs) + { + LOG_ERR("kcalloc vfs failed\n"); + return -ENOMEM; + } + + for (vf_idx = 0; vf_idx < num_vfs; vf_idx++) + { + rtn = zxdh_create_vf_obj(pf_dev, vf_idx); + if (rtn) + { + LOG_ERR("zxdh_create_vf_obj failed\n"); + goto err_vf; + } + + rtn = zxdh_create_vf_meters_sysfs(pf_dev, vf_idx); + if (rtn) + { + zxdh_destroy_vf_obj(pf_dev, vf_idx); + LOG_ERR("zxdh_create_vf_meters_sysfs failed\n"); + goto err_vf; + } + } + + return 0; + +err_vf: + for (; vf_idx > 0; --vf_idx) + { + zxdh_destroy_vf_meters_sysfs(pf_dev, vf_idx); + + zxdh_destroy_vf_obj(pf_dev, vf_idx); + } + + kfree(pf_dev->sriov.vfs); + pf_dev->sriov.vfs = NULL; + + return rtn; +} + +void zxdh_destroy_vfs_sysfs(struct dh_core_dev *dev, int32_t num_vfs) +{ + struct zxdh_pf_device *pf_dev = dh_core_priv(dev); + struct zxdh_vf_obj *vf; + uint16_t vf_idx; + + LOG_INFO("enter\n"); + if (!num_vfs || !pf_dev->sriov.vfs) + return; + + for (vf_idx = 0; vf_idx < num_vfs; vf_idx++) + { + vf = pf_dev->sriov.vfs + vf_idx; + + if (vf->group != pf_dev->sriov.group_0) + zxdh_vf_update_sysfs_group(pf_dev, vf, 0); + + zxdh_destroy_vf_meters_sysfs(pf_dev, vf_idx); + + zxdh_destroy_vf_obj(pf_dev, vf_idx); + } + kfree(pf_dev->sriov.vfs); + pf_dev->sriov.vfs = NULL; +} + +void zxdh_cleanup_sysfs_group(struct zxdh_pf_device *pf_dev) +{ + struct zxdh_group_obj *group, *tmp; + + LOG_INFO("enter\n"); + list_for_each_entry_safe(group, tmp, &pf_dev->sriov.groups_head, list) + { + list_del(&group->list); + kfree(group); + } +} + +#ifdef ZXDH_PLCR_DEBUG +int zxdh_sriov_attr_create(struct zxdh_pf_device *pf_dev) +{ + int rtn; + struct zxdh_sriov_sysfs *sriov = &pf_dev->sriov; + + LOG_INFO("enter\n"); + + sriov->burst_attr.attr.name = "burst"; + sriov->burst_attr.attr.mode = 0644; + sriov->burst_attr.show = zxdh_burst_show; + sriov->burst_attr.store = zxdh_burst_store; + rtn = sysfs_create_file(sriov->sriov_obj, &sriov->burst_attr.attr); + if (rtn) + { + LOG_ERR("burst sysfs_create_file failed!") + return rtn; + } + + sriov->profile_attr.attr.name = "profiles_stat"; + sriov->profile_attr.attr.mode = 0444; + sriov->profile_attr.show = zxdh_profile_stat_show; + sriov->profile_attr.store = NULL; + rtn = sysfs_create_file(sriov->sriov_obj, &sriov->profile_attr.attr); + if (rtn) + { + LOG_ERR("profiles_stat sysfs_create_file failed!") + goto err_profile_attr; + } + + return rtn; + +err_profile_attr: + sysfs_remove_file(sriov->sriov_obj, &sriov->burst_attr.attr); + return rtn; +} + +void zxdh_sriov_attr_remove(struct zxdh_pf_device *pf_dev) +{ + struct zxdh_sriov_sysfs *sriov = &pf_dev->sriov; + + LOG_INFO("enter\n"); + sysfs_remove_file(sriov->sriov_obj, &sriov->profile_attr.attr); + sysfs_remove_file(sriov->sriov_obj, &sriov->burst_attr.attr); +} +#endif + +int zxdh_sriov_sysfs_init(struct dh_core_dev *dev) +{ + struct device *device = dev->device; + struct zxdh_pf_device *pf_dev = dh_core_priv(dev); + int rtn = 0; + + if (dev->coredev_type != DH_COREDEV_PF) + return rtn; + + pf_dev->sriov.sriov_obj = kobject_create_and_add("sriov", &device->kobj); + if (!pf_dev->sriov.sriov_obj) + { + LOG_ERR("zxdh create sriov sysfs failed (%d)\n", -ENOMEM); + return -ENOMEM; + } + +#ifdef ZXDH_PLCR_DEBUG + rtn = zxdh_sriov_attr_create(pf_dev); + if (rtn) + { + LOG_ERR("zxdh_sriov_attr_create failed (%d)\n", rtn); + goto err_attr; + } +#endif + + pf_dev->sriov.groups_obj = kobject_create_and_add("groups", pf_dev->sriov.sriov_obj); + if (!pf_dev->sriov.groups_obj) + { + LOG_ERR("zxdh create groups sysfs failed (%d)\n", -ENOMEM); + rtn = -ENOMEM; + goto err_groups; + } + + INIT_LIST_HEAD(&pf_dev->sriov.groups_head); + pf_dev->sriov.group_0 = zxdh_create_group_obj(pf_dev, ZXDH_DEFAULT_VF_GROUP_ID); + if (IS_ERR(pf_dev->sriov.group_0)) + { + LOG_ERR("zxdh create rate group 0 failed (%ld)\n", PTR_ERR(pf_dev->sriov.group_0)); + rtn = PTR_ERR(pf_dev->sriov.group_0); + goto err_group0; + } + + LOG_INFO("p_sriov_obj = %p, vport = 0x%x\n", pf_dev->sriov.sriov_obj, pf_dev->vport); + + return rtn; + +err_group0: + kobject_put(pf_dev->sriov.groups_obj); + pf_dev->sriov.groups_obj = NULL; +err_groups: +#ifdef ZXDH_PLCR_DEBUG + zxdh_sriov_attr_remove(pf_dev); +err_attr: +#endif + kobject_put(pf_dev->sriov.sriov_obj); + pf_dev->sriov.sriov_obj = NULL; + + return rtn; +} + +void zxdh_sriov_sysfs_exit(struct dh_core_dev *dev) +{ + // struct device *device = &dev->pdev->dev; + struct zxdh_pf_device *pf_dev = dh_core_priv(dev); + + if (dev->coredev_type != DH_COREDEV_PF) + return; + + LOG_INFO("enter\n"); + zxdh_destroy_group_obj(pf_dev->sriov.group_0); + wait_for_completion(&pf_dev->sriov.group_0->free_group_comp); + kfree(pf_dev->sriov.group_0); + + zxdh_cleanup_sysfs_group(pf_dev); + + kobject_put(pf_dev->sriov.groups_obj); + pf_dev->sriov.groups_obj = NULL; +#ifdef ZXDH_PLCR_DEBUG + zxdh_sriov_attr_remove(pf_dev); +#endif + kobject_put(pf_dev->sriov.sriov_obj); + pf_dev->sriov.sriov_obj = NULL; +} diff --git a/src/net/drivers/net/ethernet/dinghai/wq.c b/src/net/drivers/net/ethernet/dinghai/wq.c new file mode 100755 index 0000000..e69de29 diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/bar_chan_user/normal_send_eg.c b/src/net/drivers/net/ethernet/dinghai/zf_mpf/bar_chan_user/normal_send_eg.c new file mode 100644 index 0000000..a25dab8 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/bar_chan_user/normal_send_eg.c @@ -0,0 +1,137 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define BAR_CHAN_PLOAD_SIZE (2036) +#define BAR_REPS_HDR_LEN (4) +#define DEVICE_FILE "/dev/bar_ioctl_dev" +#define BAR_IOCTL_CMD_NORMAL _IOW('a', 1, msg_entity_t) + +struct zxdh_pci_bar_msg +{ + uint64_t virt_addr; /**< 4k空间地址, 若src为MPF该参数不生效>**/ + void *payload_addr; /**< 消息净荷地址>**/ + uint16_t payload_len; /**< 消息净荷长度>**/ + uint16_t emec; /**< 消息紧急类型>**/ + uint16_t src; /**< 消息发送源,参考BAR_DRIVER_TYPE>**/ + uint16_t dst; /**< 消息接收者,参考BAR_DRIVER_TYPE>**/ + uint32_t module_id; /**< 事件id>**/ + uint16_t src_pcieid; /**< 源 pcie_id>**/ + uint16_t dst_pcieid; /**< 目的pcie_id>**/ +}; +struct zxdh_msg_recviver_mem +{ + void *recv_buffer; /**< 消息接收缓存>**/ + uint16_t buffer_len; /**< 消息缓存长度>**/ +}; + +struct zxdh_ioctl_send_paras +{ + uint16_t pload_len; + uint16_t src; + uint16_t dst; + uint16_t event_id; +}; + +struct zxdh_ioctl_recv_paras +{ + int ioctl_state; //ioctrl级别返回值 + int bar_state; //bar通道接口级别返回值 +}; + +typedef struct normal_msg_entity +{ + union ioctl_ctrl_hdr //私有消息控制头 + { + struct zxdh_ioctl_send_paras send_msg_hdr; //普通消息发送头 + struct zxdh_ioctl_recv_paras recv_msg_hdr; //普通消息发送头 + }hdr; + uint8_t pload[BAR_CHAN_PLOAD_SIZE + BAR_REPS_HDR_LEN]; +}msg_entity_t; + +struct zxdh_bar_reps_hdr +{ + uint8_t is_replied; + uint16_t reps_len; + uint8_t rsv; +}__attribute__((packed)); + +struct zxdh_bar_reps +{ + struct zxdh_bar_reps_hdr hdr; + uint8_t reps_data[BAR_CHAN_PLOAD_SIZE]; +}__attribute__((packed)); + +int zxdh_bar_chan_mpf_ioctl_msg_send(struct zxdh_pci_bar_msg *in, struct zxdh_msg_recviver_mem *result) +{ + int fd, ret; + struct normal_msg_entity entity = {0}; + struct zxdh_bar_reps *reps = NULL; + + entity.hdr.send_msg_hdr.pload_len = in->payload_len; + entity.hdr.send_msg_hdr.src = in->src; + entity.hdr.send_msg_hdr.dst = in->dst; + entity.hdr.send_msg_hdr.event_id = in->module_id; + + /* 用户态长度异常*/ + if (in->payload_len > BAR_CHAN_PLOAD_SIZE) + { + return -1; + } + /* 拷贝消息到iotcl结构体*/ + memcpy(entity.pload, in->payload_addr, in->payload_len); + + fd = open(DEVICE_FILE, O_RDWR); + if (fd < 0) { + perror("Failed to open the device."); + return 1; + } + + ret = ioctl(fd, BAR_IOCTL_CMD_NORMAL, &entity); + if (ret < 0) { + perror("IOCTL command failed."); + ret = 1; + goto out; + } + printf("reps: 0x%llx.\n", *(uint64_t*)entity.pload); + + /* ioctl通信异常*/ + if (entity.hdr.recv_msg_hdr.ioctl_state != 0) + { + //return IOCTL_ERR + printf("ioctl failed, state: %d\n", entity.hdr.recv_msg_hdr.ioctl_state); + ret = -1; + goto out; + } + + /* 调用bar通道内核态接口错误*/ + if (entity.hdr.recv_msg_hdr.bar_state != 0) + { + //return IOCTL_ERR + printf("bar send err, state: %d\n", entity.hdr.recv_msg_hdr.bar_state); + ret = entity.hdr.recv_msg_hdr.bar_state; + goto out; + } + + /* 判断返回的消息长度是否足够放下*/ + reps = (struct zxdh_bar_reps *)(entity.pload); + if (reps->hdr.reps_len + 4 > result->buffer_len) + { + printf("reps_len is %d, but buffer_len is%d.\n", reps->hdr.reps_len + 4, + result->buffer_len); + ret = -1; + goto out; + } + memcpy(result->recv_buffer, reps, reps->hdr.reps_len + 4); +out: + close(fd); + return 0; +} \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/bar_chan_user/pci_res_query_eg.c b/src/net/drivers/net/ethernet/dinghai/zf_mpf/bar_chan_user/pci_res_query_eg.c new file mode 100644 index 0000000..b7ca92e --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/bar_chan_user/pci_res_query_eg.c @@ -0,0 +1,214 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DEVICE_FILE "/dev/bar_ioctl_dev" +#define ZXDH_PF_DEV_NUM (40) +#define BAR_IOCTL_CMD_SINGLE_DEV _IOW('a', 2, pci_res_st) +#define BAR_IOCTL_CMD_ALL_DEV _IOW('a', 3, pci_res_st) +#define PF_PCIE_ID(pf_idx) (((pf_idx % 8) << 8) | (1 << 11) | ((pf_idx / 8) << 12)) + +struct zxdh_mpf_pci_res_item +{ + uint16_t device_id; + uint16_t pcie_id; + uint16_t bdf; + uint8_t link_state; + uint8_t dev_type; + uint16_t total_vfs; + uint16_t initial_vfs; + uint16_t num_vfs; + uint8_t vf_stride; + uint8_t first_vf_offset; + int res; + uint8_t pad[4]; //预留字段 +}; + +/* zf内核态和risc通信的约定结构体*/ +struct zxdh_mpf_pci_res_list +{ + uint16_t num; + uint16_t verno; //版本号 + int res; //0表示返回成功, 其他表示失败, 包括消息发送失败 + struct zxdh_mpf_pci_res_item pci_res_lis[ZXDH_PF_DEV_NUM]; +}; + +struct zxdh_mpf_query_pci_res_msg +{ + uint16_t pcie_id; + uint8_t dev_type; + uint8_t pad[5]; + struct zxdh_mpf_pci_res_list reply; +}; + +typedef struct zxdh_mpf_query_bar_msg +{ + int ioctl_state; + int bar_state; + struct zxdh_mpf_query_pci_res_msg pci_res_msg; +}pci_res_st; + +void print_pf_pci_res(struct zxdh_mpf_pci_res_item *item) +{ + printf("device_id: 0x%x.\n", item->device_id); + printf("link_state: %d.\n",item->link_state); + printf("pcie_id: 0x%x.\n",item->pcie_id); + printf("bdf: 0x%x.\n",item->bdf); + printf("dev_type: %d.\n",item->dev_type); + printf("total_vfs: %d.\n",item->total_vfs); + printf("initial_vfs: %d.\n",item->initial_vfs); + printf("num_vfs: %d.\n",item->num_vfs); + printf("vf_stride: %d.\n",item->vf_stride); + printf("first_vf_offset: %d.\n",item->first_vf_offset); + return; +} + +static int zxdh_get_dev_pci_resource(uint16_t pcie_id, struct zxdh_mpf_query_bar_msg *data, int cmd) +{ + int fd, ret; + struct zxdh_mpf_query_bar_msg msg = {0}; + + msg.pci_res_msg.pcie_id = pcie_id; + msg.pci_res_msg.dev_type = 8; + + fd = open(DEVICE_FILE, O_RDWR); + if (fd < 0) + { + perror("Failed to open the device."); + return 1; + } + + ret = ioctl(fd, cmd, &msg); + if (ret < 0) + { + perror("IOCTL command failed."); + ret = 1; + goto out; + } + + /* ioctl通信异常*/ + if (msg.ioctl_state != 0) + { + //return IOCTL_ERR + printf("ioctl failed, state: %d\n", msg.ioctl_state); + ret = -1; + goto out; + } + + /* 调用bar通道内核态接口错误*/ + if (msg.bar_state != 0) + { + //return IOCTL_ERR + printf("bar send err, state: %d\n", msg.bar_state); + ret = msg.bar_state; + goto out; + } + + *data = msg; +out: + close(fd); + return ret; +} + +int zxdh_get_dev_pci_resource_single(uint16_t pcie_id, struct zxdh_mpf_query_bar_msg *data) +{ + return zxdh_get_dev_pci_resource(pcie_id, data, BAR_IOCTL_CMD_SINGLE_DEV); +} + +int zxdh_get_dev_pci_resource_all(struct zxdh_mpf_query_bar_msg *data) +{ + return zxdh_get_dev_pci_resource(0, data, BAR_IOCTL_CMD_ALL_DEV); +} + +void test_pci_res_query_single(uint16_t pcie_id) +{ + int ret = 0; + struct zxdh_mpf_query_bar_msg data = {0}; + + printf("**************pcie_id: 0x%x**************.\n", pcie_id); + ret = zxdh_get_dev_pci_resource_single(pcie_id, &data); + if (ret != 0) + { + printf("ioctl msg failed, ret: %d.\n", ret); + return; + } + if (data.pci_res_msg.reply.res != 0) + { + printf("data.pci_res_msg.reply.res is %d.\n", data.pci_res_msg.reply.res); + return; + } + print_pf_pci_res(&data.pci_res_msg.reply.pci_res_lis[0]); + return; +} + +void test_pci_res_query_all() +{ + int pf_idx = 0; + int ret = 0; + uint16_t pcie_id = 0; + struct zxdh_mpf_query_bar_msg data = {0}; + + ret = zxdh_get_dev_pci_resource_all(&data); + if (ret != 0) + { + printf("ioctl msg failed, ret:%d.\n", ret); + } + + printf("res: %d.\n", data.pci_res_msg.reply.res); + printf("num: %d.\n", data.pci_res_msg.reply.num); + + for (pf_idx = 0; pf_idx < 40; pf_idx++) + { + printf("********%dth dev, ep:%d, pf: %d**********.\n", pf_idx, pf_idx / 8, pf_idx % 8); + + if (data.pci_res_msg.reply.pci_res_lis[pf_idx].res != 0) + { + printf("invalid res.\n"); + continue; + } + print_pf_pci_res(&data.pci_res_msg.reply.pci_res_lis[pf_idx]); + } +} + +int main(int argc, char *argv[]) +{ + uint16_t pcie_id = 0; + + if (argc < 2) + { + goto help; + } + if (strcmp(argv[1], "all") == 0) + { + test_pci_res_query_all(); + goto out; + } + else if(strcmp(argv[1], "dev") == 0) + { + if (argc < 3) + { + goto help; + } + pcie_id = strtol(argv[2],NULL, 16); + test_pci_res_query_single(pcie_id); + goto out; + } + else + { + goto help; + } + +help: + printf("./test all ------------------print all pci_dev resources.\n"); + printf("./test dev [pcie_id] --------print pci_dev resource.\n"); +out: + return 0; +} diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/cfg_sf.c b/src/net/drivers/net/ethernet/dinghai/zf_mpf/cfg_sf.c new file mode 100755 index 0000000..1927049 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/cfg_sf.c @@ -0,0 +1,53 @@ +#include +#include + +#include "cfg_sf.h" + +static int32_t zxdh_cfg_resume(struct zxdh_auxiliary_device *adev) +{ + return 0; +} + +static int32_t zxdh_cfg_suspend(struct zxdh_auxiliary_device *adev, pm_message_t state) +{ + return 0; +} + +static int32_t zxdh_cfg_probe(struct zxdh_auxiliary_device *adev, + const struct zxdh_auxiliary_device_id *id) +{ + struct cfg_sf_dev * __attribute__((unused)) cfg_sf_dev = container_of(adev, struct cfg_sf_dev, adev); + + return 0; +} + +static int32_t zxdh_cfg_remove(struct zxdh_auxiliary_device *adev) +{ + return 0; +} + +static const struct zxdh_auxiliary_device_id zxdh_cfg_id_table[] = { + { .name = ZXDH_EN_SF_NAME ".mpf_cfg", }, + {}, +}; + +//MODULE_DEVICE_TABLE(auxiliary_zxdh_id_table, zxdh_cfg_id_table); + +static struct zxdh_auxiliary_driver zxdh_cfg_driver = { + .name = "mpf_cfg", + .probe = zxdh_cfg_probe, + .remove = zxdh_cfg_remove, + .suspend = zxdh_cfg_suspend, + .resume = zxdh_cfg_resume, + .id_table = zxdh_cfg_id_table, +}; + +int32_t zxdh_mpf_sf_driver_register(void) +{ + return zxdh_auxiliary_driver_register(&zxdh_cfg_driver);; +} + +void zxdh_mpf_sf_driver_uregister(void) +{ + zxdh_auxiliary_driver_unregister(&zxdh_cfg_driver);; +} diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/cfg_sf.h b/src/net/drivers/net/ethernet/dinghai/zf_mpf/cfg_sf.h new file mode 100755 index 0000000..ec0fdd0 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/cfg_sf.h @@ -0,0 +1,30 @@ +#ifndef __ZXDH_MPF_CFG_SF_H__ +#define __ZXDH_MPF_CFG_SF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +struct cfg_sf_ops { + +}; + +struct cfg_sf_dev { + struct zxdh_auxiliary_device adev; + struct dh_core_dev *dh_dev; + struct cfg_sf_ops *ops; +}; + +int32_t zxdh_mpf_sf_driver_register(void); +void zxdh_mpf_sf_driver_uregister(void); + + +#ifdef __cplusplus +} +#endif + + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/devlink.c b/src/net/drivers/net/ethernet/dinghai/zf_mpf/devlink.c new file mode 100755 index 0000000..e89a752 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/devlink.c @@ -0,0 +1,130 @@ +#include +#include +#include "devlink.h" + +struct devlink_ops dh_mpf_devlink_ops = { + +}; + +enum { + DH_MPF_PARAMS_MAX, +}; + +static int32_t __attribute__((unused)) sample_check(struct dh_core_dev *dev) +{ + return 1; +} + +enum dh_mpf_devlink_param_id { + DH_MPF_DEVLINK_PARAM_ID_BASE = DEVLINK_PARAM_GENERIC_ID_MAX, + DH_MPF_DEVLINK_PARAM_ID_SAMPLE, +}; + + +static int32_t dh_devlink_sample_set(struct devlink *devlink, uint32_t id, + struct devlink_param_gset_ctx *ctx) +{ + struct dh_core_dev * __attribute__((unused)) dev = devlink_priv(devlink); + + return 0; +} + +static int32_t dh_devlink_sample_get(struct devlink *devlink, uint32_t id, + struct devlink_param_gset_ctx *ctx) +{ + struct dh_core_dev * __attribute__((unused)) dev = devlink_priv(devlink); + + return 0; +} + +#ifdef HAVE_DEVLINK_PARAM_REGISTER +static const struct devlink_params { + const char *name; + int32_t (*check)(struct dh_core_dev *dev); + struct devlink_param param; +} devlink_params[] = { + [DH_MPF_PARAMS_MAX] = { .name = "sample", + .check = &sample_check, + .param = DEVLINK_PARAM_DRIVER(DH_MPF_DEVLINK_PARAM_ID_SAMPLE, + "sample", DEVLINK_PARAM_TYPE_BOOL, + BIT(DEVLINK_PARAM_CMODE_RUNTIME),dh_devlink_sample_get, + dh_devlink_sample_set, + NULL), + } +}; + +static int32_t params_register(struct devlink *devlink) +{ + int32_t i = 0; + int32_t err = 0; + struct dh_core_dev *dh_dev = devlink_priv(devlink); + + for (i = 0; i < ARRAY_SIZE(devlink_params); i++) + { + if(devlink_params[i].check(dh_dev)) + { + err = devlink_param_register(devlink, &devlink_params[i].param); + if (err) + { + goto rollback; + } + } + } + + return 0; + +rollback: + if (i == 0) + { + return err; + } + + for (; i > 0; i--) + { + devlink_param_unregister(devlink, &devlink_params[i].param); + } + + return err; +} + +static int32_t params_unregister(struct devlink *devlink) +{ + int32_t i = 0; + + for (i = 0; i < ARRAY_SIZE(devlink_params); i++) + { + devlink_param_unregister(devlink, &devlink_params[i].param); + } + + return 0; +} +#else +static struct devlink_param devlink_params [] = { + [DH_MPF_PARAMS_MAX] = DEVLINK_PARAM_DRIVER(DH_MPF_DEVLINK_PARAM_ID_SAMPLE, + "sample", DEVLINK_PARAM_TYPE_BOOL, + BIT(DEVLINK_PARAM_CMODE_RUNTIME),dh_devlink_sample_get, + dh_devlink_sample_set, + NULL), +}; + +static int32_t params_register(struct devlink *devlink) +{ + struct dh_core_dev * __attribute__((unused)) dh_dev = devlink_priv(devlink); + int32_t err = 0; + + err = devlink_params_register(devlink, devlink_params, ARRAY_SIZE(devlink_params)); + + return err; +} +static int32_t params_unregister(struct devlink *devlink) +{ + devlink_params_unregister(devlink, devlink_params, ARRAY_SIZE(devlink_params)); + + return 0; +} +#endif + +struct dh_core_devlink_ops dh_mpf_core_devlink_ops = { + .params_register = params_register, + .params_unregister = params_unregister +}; diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/devlink.h b/src/net/drivers/net/ethernet/dinghai/zf_mpf/devlink.h new file mode 100755 index 0000000..a45fd10 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/devlink.h @@ -0,0 +1,16 @@ +#ifndef __ZXDH_MPF_DEVLINK_H__ +#define __ZXDH_MPF_DEVLINK_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + + + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/Makefile b/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/Makefile new file mode 100644 index 0000000..ad4897b --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/Makefile @@ -0,0 +1,11 @@ +KDIR=/home/ls/kernel-5.10.y + +obj-m += zte-epc.o +zte-epc-y += pcie-zte-zf-hdma.o pcie-zte-zf-epc.o virt-dma.o + + +all: + make -C $(KDIR) M=$(PWD) modules + +clean: + make -C $(KDIR) M=$(PWD) clean diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/dmaengine.c b/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/dmaengine.c new file mode 100644 index 0000000..a768da4 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/dmaengine.c @@ -0,0 +1,1636 @@ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "dmaengine.h" + +static DEFINE_MUTEX(dma_list_mutex); +static DEFINE_IDA(dma_ida); +static LIST_HEAD(dma_device_list); +static long dmaengine_ref_count; + +/* --- debugfs implementation --- */ +#ifdef CONFIG_DEBUG_FS +#include + +static struct dentry *rootdir; + +static void zxdh_dmaengine_debug_register(struct dma_device *dma_dev) +{ + dma_dev->dbg_dev_root = debugfs_create_dir(dev_name(dma_dev->dev), + rootdir); + if (IS_ERR(dma_dev->dbg_dev_root)) + dma_dev->dbg_dev_root = NULL; +} + +static void zxdh_dmaengine_debug_unregister(struct dma_device *dma_dev) +{ + debugfs_remove_recursive(dma_dev->dbg_dev_root); + dma_dev->dbg_dev_root = NULL; +} + +static void zxdh_dmaengine_dbg_summary_show(struct seq_file *s, + struct dma_device *dma_dev) +{ + struct dma_chan *chan; + + list_for_each_entry(chan, &dma_dev->channels, device_node) { + if (chan->client_count) { + seq_printf(s, " %-13s| %s", dma_chan_name(chan), + chan->dbg_client_name ?: "in-use"); + + if (chan->router) + seq_printf(s, " (via router: %s)\n", + dev_name(chan->router->dev)); + else + seq_puts(s, "\n"); + } + } +} + +static int zxdh_dmaengine_summary_show(struct seq_file *s, void *data) +{ + struct dma_device *dma_dev = NULL; + + mutex_lock(&dma_list_mutex); + list_for_each_entry(dma_dev, &dma_device_list, global_node) { + seq_printf(s, "dma%d (%s): number of channels: %u\n", + dma_dev->dev_id, dev_name(dma_dev->dev), + dma_dev->chancnt); + + if (dma_dev->dbg_summary_show) + dma_dev->dbg_summary_show(s, dma_dev); + else + zxdh_dmaengine_dbg_summary_show(s, dma_dev); + + if (!list_is_last(&dma_dev->global_node, &dma_device_list)) + seq_puts(s, "\n"); + } + mutex_unlock(&dma_list_mutex); + + return 0; +} +DEFINE_SHOW_ATTRIBUTE(dmaengine_summary); + +static void __init zxdh_dmaengine_debugfs_init(void) +{ + rootdir = debugfs_create_dir("dmaengine", NULL); + + /* /sys/kernel/debug/dmaengine/summary */ + debugfs_create_file("summary", 0444, rootdir, NULL, + &dmaengine_summary_fops); +} +#else +static inline void zxdh_dmaengine_debugfs_init(void) { } +static inline int zxdh_dmaengine_debug_register(struct dma_device *dma_dev) +{ + return 0; +} + +static inline void zxdh_dmaengine_debug_unregister(struct dma_device *dma_dev) { } +#endif /* DEBUG_FS */ + +/* --- sysfs implementation --- */ + +#define DMA_SLAVE_NAME "slave" + +/** + * zxdh_dev_to_dma_chan - convert a device pointer to its sysfs container object + * @dev: device node + * + * Must be called under dma_list_mutex. + */ +static struct dma_chan *zxdh_dev_to_dma_chan(struct device *dev) +{ + struct dma_chan_dev *chan_dev; + + chan_dev = container_of(dev, typeof(*chan_dev), device); + return chan_dev->chan; +} + +static ssize_t zxdh_memcpy_count_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dma_chan *chan; + unsigned long count = 0; + int i; + int err; + + mutex_lock(&dma_list_mutex); + chan = zxdh_dev_to_dma_chan(dev); + if (chan) { + for_each_possible_cpu(i) + count += per_cpu_ptr(chan->local, i)->memcpy_count; + err = sprintf(buf, "%lu\n", count); + } else + err = -ENODEV; + mutex_unlock(&dma_list_mutex); + + return err; +} +static DEVICE_ATTR_RO(memcpy_count); + +static ssize_t zxdh_bytes_transferred_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dma_chan *chan; + unsigned long count = 0; + int i; + int err; + + mutex_lock(&dma_list_mutex); + chan = zxdh_dev_to_dma_chan(dev); + if (chan) { + for_each_possible_cpu(i) + count += per_cpu_ptr(chan->local, i)->bytes_transferred; + err = sprintf(buf, "%lu\n", count); + } else + err = -ENODEV; + mutex_unlock(&dma_list_mutex); + + return err; +} +static DEVICE_ATTR_RO(bytes_transferred); + +static ssize_t zxdh_in_use_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct dma_chan *chan; + int err; + + mutex_lock(&dma_list_mutex); + chan = zxdh_dev_to_dma_chan(dev); + if (chan) + err = sprintf(buf, "%d\n", chan->client_count); + else + err = -ENODEV; + mutex_unlock(&dma_list_mutex); + + return err; +} +static DEVICE_ATTR_RO(in_use); + +static struct attribute *dma_dev_attrs[] = { + &dev_attr_memcpy_count.attr, + &dev_attr_bytes_transferred.attr, + &dev_attr_in_use.attr, + NULL, +}; +ATTRIBUTE_GROUPS(dma_dev); + +static void zxdh_chan_dev_release(struct device *dev) +{ + struct dma_chan_dev *chan_dev; + + chan_dev = container_of(dev, typeof(*chan_dev), device); + kfree(chan_dev); +} + +static struct class dma_devclass = { + .name = "dma", + .dev_groups = dma_dev_groups, + .dev_release = zxdh_chan_dev_release, +}; + +/* --- client and device registration --- */ + +/* enable iteration over all operation types */ +static dma_cap_mask_t dma_cap_mask_all; + +/** + * struct dma_chan_tbl_ent - tracks channel allocations per core/operation + * @chan: associated channel for this entry + */ +struct dma_chan_tbl_ent { + struct dma_chan *chan; +}; + +/* percpu lookup table for memory-to-memory offload providers */ +static struct dma_chan_tbl_ent __percpu *channel_table[DMA_TX_TYPE_END]; + +static int __init zxdh_dma_channel_table_init(void) +{ + enum dma_transaction_type cap; + int err = 0; + + bitmap_fill(dma_cap_mask_all.bits, DMA_TX_TYPE_END); + + /* 'interrupt', 'private', and 'slave' are channel capabilities, + * but are not associated with an operation so they do not need + * an entry in the channel_table + */ + clear_bit(DMA_INTERRUPT, dma_cap_mask_all.bits); + clear_bit(DMA_PRIVATE, dma_cap_mask_all.bits); + clear_bit(DMA_SLAVE, dma_cap_mask_all.bits); + + for_each_dma_cap_mask(cap, dma_cap_mask_all) { + channel_table[cap] = alloc_percpu(struct dma_chan_tbl_ent); + if (!channel_table[cap]) { + err = -ENOMEM; + break; + } + } + + if (err) { + pr_err("dmaengine zxdh_dma_channel_table_init failure: %d\n", err); + for_each_dma_cap_mask(cap, dma_cap_mask_all) + free_percpu(channel_table[cap]); + } + + return err; +} +arch_initcall(zxdh_dma_channel_table_init); + +/** + * zxdh_dma_chan_is_local - checks if the channel is in the same NUMA-node as the CPU + * @chan: DMA channel to test + * @cpu: CPU index which the channel should be close to + * + * Returns true if the channel is in the same NUMA-node as the CPU. + */ +static bool zxdh_dma_chan_is_local(struct dma_chan *chan, int cpu) +{ + int node = dev_to_node(chan->device->dev); + return node == NUMA_NO_NODE || + cpumask_test_cpu(cpu, cpumask_of_node(node)); +} + +/** + * zxdh_min_chan - finds the channel with min count and in the same NUMA-node as the CPU + * @cap: capability to match + * @cpu: CPU index which the channel should be close to + * + * If some channels are close to the given CPU, the one with the lowest + * reference count is returned. Otherwise, CPU is ignored and only the + * reference count is taken into account. + * + * Must be called under dma_list_mutex. + */ +static struct dma_chan *zxdh_min_chan(enum dma_transaction_type cap, int cpu) +{ + struct dma_device *device; + struct dma_chan *chan; + struct dma_chan *min = NULL; + struct dma_chan *localmin = NULL; + + list_for_each_entry(device, &dma_device_list, global_node) { + if (!dma_has_cap(cap, device->cap_mask) || + dma_has_cap(DMA_PRIVATE, device->cap_mask)) + continue; + list_for_each_entry(chan, &device->channels, device_node) { + if (!chan->client_count) + continue; + if (!min || chan->table_count < min->table_count) + min = chan; + + if (zxdh_dma_chan_is_local(chan, cpu)) + if (!localmin || + chan->table_count < localmin->table_count) + localmin = chan; + } + } + + chan = localmin ? localmin : min; + + if (chan) + chan->table_count++; + + return chan; +} + +/** + * zxdh_dma_channel_rebalance - redistribute the available channels + * + * Optimize for CPU isolation (each CPU gets a dedicated channel for an + * operation type) in the SMP case, and operation isolation (avoid + * multi-tasking channels) in the non-SMP case. + * + * Must be called under dma_list_mutex. + */ +static void zxdh_dma_channel_rebalance(void) +{ + struct dma_chan *chan; + struct dma_device *device; + int cpu; + int cap; + + /* undo the last distribution */ + for_each_dma_cap_mask(cap, dma_cap_mask_all) + for_each_possible_cpu(cpu) + per_cpu_ptr(channel_table[cap], cpu)->chan = NULL; + + list_for_each_entry(device, &dma_device_list, global_node) { + if (dma_has_cap(DMA_PRIVATE, device->cap_mask)) + continue; + list_for_each_entry(chan, &device->channels, device_node) + chan->table_count = 0; + } + + /* don't populate the channel_table if no clients are available */ + if (!dmaengine_ref_count) + return; + + /* redistribute available channels */ + for_each_dma_cap_mask(cap, dma_cap_mask_all) + for_each_online_cpu(cpu) { + chan = zxdh_min_chan(cap, cpu); + per_cpu_ptr(channel_table[cap], cpu)->chan = chan; + } +} + +static int zxdh_dma_device_satisfies_mask(struct dma_device *device, + const dma_cap_mask_t *want) +{ + dma_cap_mask_t has; + + bitmap_and(has.bits, want->bits, device->cap_mask.bits, + DMA_TX_TYPE_END); + return bitmap_equal(want->bits, has.bits, DMA_TX_TYPE_END); +} + +static struct module *zxdh_dma_chan_to_owner(struct dma_chan *chan) +{ + return chan->device->owner; +} + +/** + * zxdh_balance_ref_count - catch up the channel reference count + * @chan: channel to balance ->client_count versus dmaengine_ref_count + * + * Must be called under dma_list_mutex. + */ +static void zxdh_balance_ref_count(struct dma_chan *chan) +{ + struct module *owner = zxdh_dma_chan_to_owner(chan); + + while (chan->client_count < dmaengine_ref_count) { + __module_get(owner); + chan->client_count++; + } +} + +static void zxdh_dma_device_release(struct kref *ref) +{ + struct dma_device *device = container_of(ref, struct dma_device, ref); + + list_del_rcu(&device->global_node); + zxdh_dma_channel_rebalance(); + + if (device->device_release) + device->device_release(device); +} + +static void zxdh_dma_device_put(struct dma_device *device) +{ + lockdep_assert_held(&dma_list_mutex); + kref_put(&device->ref, zxdh_dma_device_release); +} + +/** + * zxdh_dma_chan_get - try to grab a DMA channel's parent driver module + * @chan: channel to grab + * + * Must be called under dma_list_mutex. + */ +static int zxdh_dma_chan_get(struct dma_chan *chan) +{ + struct module *owner = zxdh_dma_chan_to_owner(chan); + int ret; + + /* The channel is already in use, update client count */ + if (chan->client_count) { + __module_get(owner); + goto out; + } + + if (!try_module_get(owner)) + return -ENODEV; + + ret = kref_get_unless_zero(&chan->device->ref); + if (!ret) { + ret = -ENODEV; + goto module_put_out; + } + + /* allocate upon first client reference */ + if (chan->device->device_alloc_chan_resources) { + ret = chan->device->device_alloc_chan_resources(chan); + if (ret < 0) + goto err_out; + } + + if (!dma_has_cap(DMA_PRIVATE, chan->device->cap_mask)) + zxdh_balance_ref_count(chan); + +out: + chan->client_count++; + return 0; + +err_out: + zxdh_dma_device_put(chan->device); +module_put_out: + module_put(owner); + return ret; +} + +/** + * zxdh_dma_chan_put - drop a reference to a DMA channel's parent driver module + * @chan: channel to release + * + * Must be called under dma_list_mutex. + */ +static void zxdh_dma_chan_put(struct dma_chan *chan) +{ + /* This channel is not in use, bail out */ + if (!chan->client_count) + return; + + chan->client_count--; + + /* This channel is not in use anymore, free it */ + if (!chan->client_count && chan->device->device_free_chan_resources) { + /* Make sure all operations have completed */ + dmaengine_synchronize(chan); + chan->device->device_free_chan_resources(chan); + } + + /* If the channel is used via a DMA request router, free the mapping */ + if (chan->router && chan->router->route_free) { + chan->router->route_free(chan->router->dev, chan->route_data); + chan->router = NULL; + chan->route_data = NULL; + } + + zxdh_dma_device_put(chan->device); + module_put(zxdh_dma_chan_to_owner(chan)); +} + +enum dma_status zxdh_dma_sync_wait(struct dma_chan *chan, dma_cookie_t cookie) +{ + enum dma_status status; + unsigned long zxdh_dma_sync_wait_timeout = jiffies + msecs_to_jiffies(5000); + + dma_async_issue_pending(chan); + do { + status = dma_async_is_tx_complete(chan, cookie); + if (time_after_eq(jiffies, zxdh_dma_sync_wait_timeout)) { + dev_err(chan->device->dev, "%s: timeout!\n", __func__); + return DMA_ERROR; + } + if (status != DMA_IN_PROGRESS) + break; + cpu_relax(); + } while (1); + + return status; +} + + +/** + * zxdh_dma_find_channel - find a channel to carry out the operation + * @tx_type: transaction type + */ +struct dma_chan *zxdh_dma_find_channel(enum dma_transaction_type tx_type) +{ + return this_cpu_read(channel_table[tx_type]->chan); +} + + +/** + * zxdh_dma_issue_pending_all - flush all pending operations across all channels + */ +void zxdh_dma_issue_pending_all(void) +{ + struct dma_device *device; + struct dma_chan *chan; + + rcu_read_lock(); + list_for_each_entry_rcu(device, &dma_device_list, global_node) { + if (dma_has_cap(DMA_PRIVATE, device->cap_mask)) + continue; + list_for_each_entry(chan, &device->channels, device_node) + if (chan->client_count) + device->device_issue_pending(chan); + } + rcu_read_unlock(); +} + + +int zxdh_dma_get_slave_caps(struct dma_chan *chan, struct dma_slave_caps *caps) +{ + struct dma_device *device; + + if (!chan || !caps) + return -EINVAL; + + device = chan->device; + + /* check if the channel supports slave transactions */ + if (!(test_bit(DMA_SLAVE, device->cap_mask.bits) || + test_bit(DMA_CYCLIC, device->cap_mask.bits))) + return -ENXIO; + + /* + * Check whether it reports it uses the generic slave + * capabilities, if not, that means it doesn't support any + * kind of slave capabilities reporting. + */ + if (!device->directions) + return -ENXIO; + + caps->src_addr_widths = device->src_addr_widths; + caps->dst_addr_widths = device->dst_addr_widths; + caps->directions = device->directions; + caps->min_burst = device->min_burst; + caps->max_burst = device->max_burst; + caps->max_sg_burst = device->max_sg_burst; + caps->residue_granularity = device->residue_granularity; + caps->descriptor_reuse = device->descriptor_reuse; + caps->cmd_pause = !!device->device_pause; + caps->cmd_resume = !!device->device_resume; + caps->cmd_terminate = !!device->device_terminate_all; + + /* + * DMA engine device might be configured with non-uniformly + * distributed slave capabilities per device channels. In this + * case the corresponding driver may provide the device_caps + * callback to override the generic capabilities with + * channel-specific ones. + */ + if (device->device_caps) + device->device_caps(chan, caps); + + return 0; +} + + +static struct dma_chan *zxdh_private_candidate(const dma_cap_mask_t *mask, + struct dma_device *dev, + dma_filter_fn fn, void *fn_param) +{ + struct dma_chan *chan; + + if (mask && !zxdh_dma_device_satisfies_mask(dev, mask)) { + dev_dbg(dev->dev, "%s: wrong capabilities\n", __func__); + return NULL; + } + /* devices with multiple channels need special handling as we need to + * ensure that all channels are either private or public. + */ + if (dev->chancnt > 1 && !dma_has_cap(DMA_PRIVATE, dev->cap_mask)) + list_for_each_entry(chan, &dev->channels, device_node) { + /* some channels are already publicly allocated */ + if (chan->client_count) + return NULL; + } + + list_for_each_entry(chan, &dev->channels, device_node) { + if (chan->client_count) { + dev_dbg(dev->dev, "%s: %s busy\n", + __func__, dma_chan_name(chan)); + continue; + } + if (fn && !fn(chan, fn_param)) { + dev_dbg(dev->dev, "%s: %s filter said false\n", + __func__, dma_chan_name(chan)); + continue; + } + return chan; + } + + return NULL; +} + +static struct dma_chan *zxdh_find_candidate(struct dma_device *device, + const dma_cap_mask_t *mask, + dma_filter_fn fn, void *fn_param) +{ + struct dma_chan *chan = zxdh_private_candidate(mask, device, fn, fn_param); + int err; + + if (chan) { + /* Found a suitable channel, try to grab, prep, and return it. + * We first set DMA_PRIVATE to disable zxdh_balance_ref_count as this + * channel will not be published in the general-purpose + * allocator + */ + dma_cap_set(DMA_PRIVATE, device->cap_mask); + device->privatecnt++; + err = zxdh_dma_chan_get(chan); + + if (err) { + if (err == -ENODEV) { + dev_dbg(device->dev, "%s: %s module removed\n", + __func__, dma_chan_name(chan)); + list_del_rcu(&device->global_node); + } else + dev_dbg(device->dev, + "%s: failed to get %s: (%d)\n", + __func__, dma_chan_name(chan), err); + + if (--device->privatecnt == 0) + dma_cap_clear(DMA_PRIVATE, device->cap_mask); + + chan = ERR_PTR(err); + } + } + + return chan ? chan : ERR_PTR(-EPROBE_DEFER); +} + +/** + * zxdh_dma_get_slave_channel - try to get specific channel exclusively + * @chan: target channel + */ +struct dma_chan *zxdh_dma_get_slave_channel(struct dma_chan *chan) +{ + int err = -EBUSY; + + /* lock against __zxdh__zxdh_dma_request_channel */ + mutex_lock(&dma_list_mutex); + + if (chan->client_count == 0) { + struct dma_device *device = chan->device; + + dma_cap_set(DMA_PRIVATE, device->cap_mask); + device->privatecnt++; + err = zxdh_dma_chan_get(chan); + if (err) { + dev_dbg(chan->device->dev, + "%s: failed to get %s: (%d)\n", + __func__, dma_chan_name(chan), err); + chan = NULL; + if (--device->privatecnt == 0) + dma_cap_clear(DMA_PRIVATE, device->cap_mask); + } + } else + chan = NULL; + + mutex_unlock(&dma_list_mutex); + + + return chan; +} + + +struct dma_chan *zxdh_dma_get_any_slave_channel(struct dma_device *device) +{ + dma_cap_mask_t mask; + struct dma_chan *chan; + + dma_cap_zero(mask); + dma_cap_set(DMA_SLAVE, mask); + + /* lock against __zxdh__zxdh_dma_request_channel */ + mutex_lock(&dma_list_mutex); + + chan = zxdh_find_candidate(device, &mask, NULL, NULL); + + mutex_unlock(&dma_list_mutex); + + return IS_ERR(chan) ? NULL : chan; +} + + +/** + * __zxdh__zxdh_dma_request_channel - try to allocate an exclusive channel + * @mask: capabilities that the channel must satisfy + * @fn: optional callback to disposition available channels + * @fn_param: opaque parameter to pass to dma_filter_fn() + * @np: device node to look for DMA channels + * + * Returns pointer to appropriate DMA channel on success or NULL. + */ +struct dma_chan *__zxdh__zxdh_dma_request_channel(const dma_cap_mask_t *mask, + dma_filter_fn fn, void *fn_param, + struct device_node *np) +{ + struct dma_device *device, *_d; + struct dma_chan *chan = NULL; + + /* Find a channel */ + mutex_lock(&dma_list_mutex); + list_for_each_entry_safe(device, _d, &dma_device_list, global_node) { + /* Finds a DMA controller with matching device node */ + if (np && device->dev->of_node && np != device->dev->of_node) + continue; + + chan = zxdh_find_candidate(device, mask, fn, fn_param); + if (!IS_ERR(chan)) + break; + + chan = NULL; + } + mutex_unlock(&dma_list_mutex); + + pr_debug("%s: %s (%s)\n", + __func__, + chan ? "success" : "fail", + chan ? dma_chan_name(chan) : NULL); + + return chan; +} + + +static const struct dma_slave_map *zxdh_dma_filter_match(struct dma_device *device, + const char *name, + struct device *dev) +{ + int i; + + if (!device->filter.mapcnt) + return NULL; + + for (i = 0; i < device->filter.mapcnt; i++) { + const struct dma_slave_map *map = &device->filter.map[i]; + + if (!strcmp(map->devname, dev_name(dev)) && + !strcmp(map->slave, name)) + return map; + } + + return NULL; +} + +/** + * zxdh_dma_request_chan - try to allocate an exclusive slave channel + * @dev: pointer to client device structure + * @name: slave channel name + * + * Returns pointer to appropriate DMA channel on success or an error pointer. + */ +struct dma_chan *zxdh_dma_request_chan(struct device *dev, const char *name) +{ + struct dma_device *d, *_d; + struct dma_chan *chan = NULL; + + /* If device-tree is present get slave info from here */ + if (dev->of_node) + chan = of_dma_request_slave_channel(dev->of_node, name); + + /* If device was enumerated by ACPI get slave info from here */ + if (has_acpi_companion(dev) && !chan) + chan = acpi_dma_request_slave_chan_by_name(dev, name); + + if (PTR_ERR(chan) == -EPROBE_DEFER) + return chan; + + if (!IS_ERR_OR_NULL(chan)) + goto found; + + /* Try to find the channel via the DMA filter map(s) */ + mutex_lock(&dma_list_mutex); + list_for_each_entry_safe(d, _d, &dma_device_list, global_node) { + dma_cap_mask_t mask; + const struct dma_slave_map *map = zxdh_dma_filter_match(d, name, dev); + + if (!map) + continue; + + dma_cap_zero(mask); + dma_cap_set(DMA_SLAVE, mask); + + chan = zxdh_find_candidate(d, &mask, d->filter.fn, map->param); + if (!IS_ERR(chan)) + break; + } + mutex_unlock(&dma_list_mutex); + + if (IS_ERR(chan)) + return chan; + if (!chan) + return ERR_PTR(-EPROBE_DEFER); + +found: +#ifdef CONFIG_DEBUG_FS + chan->dbg_client_name = kasprintf(GFP_KERNEL, "%s:%s", dev_name(dev), + name); +#endif + + chan->name = kasprintf(GFP_KERNEL, "dma:%s", name); + if (!chan->name) + return chan; + chan->slave = dev; + + if (sysfs_create_link(&chan->dev->device.kobj, &dev->kobj, + DMA_SLAVE_NAME)) + dev_warn(dev, "Cannot create DMA %s symlink\n", DMA_SLAVE_NAME); + if (sysfs_create_link(&dev->kobj, &chan->dev->device.kobj, chan->name)) + dev_warn(dev, "Cannot create DMA %s symlink\n", chan->name); + + return chan; +} + + +/** + * zxdh_dma_request_chan_by_mask - allocate a channel satisfying certain capabilities + * @mask: capabilities that the channel must satisfy + * + * Returns pointer to appropriate DMA channel on success or an error pointer. + */ +struct dma_chan *zxdh_dma_request_chan_by_mask(const dma_cap_mask_t *mask) +{ + struct dma_chan *chan; + + if (!mask) + return ERR_PTR(-ENODEV); + + chan = __zxdh__zxdh_dma_request_channel(mask, NULL, NULL, NULL); + if (!chan) { + mutex_lock(&dma_list_mutex); + if (list_empty(&dma_device_list)) + chan = ERR_PTR(-EPROBE_DEFER); + else + chan = ERR_PTR(-ENODEV); + mutex_unlock(&dma_list_mutex); + } + + return chan; +} + + +void zxdh_dma_release_channel(struct dma_chan *chan) +{ + mutex_lock(&dma_list_mutex); + WARN_ONCE(chan->client_count != 1, + "chan reference count %d != 1\n", chan->client_count); + zxdh_dma_chan_put(chan); + /* drop PRIVATE cap enabled by __zxdh__zxdh_dma_request_channel() */ + if (--chan->device->privatecnt == 0) + dma_cap_clear(DMA_PRIVATE, chan->device->cap_mask); + + if (chan->slave) { + sysfs_remove_link(&chan->dev->device.kobj, DMA_SLAVE_NAME); + sysfs_remove_link(&chan->slave->kobj, chan->name); + kfree(chan->name); + chan->name = NULL; + chan->slave = NULL; + } + +#ifdef CONFIG_DEBUG_FS + kfree(chan->dbg_client_name); + chan->dbg_client_name = NULL; +#endif + mutex_unlock(&dma_list_mutex); +} + + +/** + * zxdh_dmaengine_get - register interest in dma_channels + */ +void zxdh_dmaengine_get(void) +{ + struct dma_device *device, *_d; + struct dma_chan *chan; + int err; + + mutex_lock(&dma_list_mutex); + dmaengine_ref_count++; + + /* try to grab channels */ + list_for_each_entry_safe(device, _d, &dma_device_list, global_node) { + if (dma_has_cap(DMA_PRIVATE, device->cap_mask)) + continue; + list_for_each_entry(chan, &device->channels, device_node) { + err = zxdh_dma_chan_get(chan); + if (err == -ENODEV) { + /* module removed before we could use it */ + list_del_rcu(&device->global_node); + break; + } else if (err) + dev_dbg(chan->device->dev, + "%s: failed to get %s: (%d)\n", + __func__, dma_chan_name(chan), err); + } + } + + /* if this is the first reference and there were channels + * waiting we need to rebalance to get those channels + * incorporated into the channel table + */ + if (dmaengine_ref_count == 1) + zxdh_dma_channel_rebalance(); + mutex_unlock(&dma_list_mutex); +} + + +/** + * zxdh_dmaengine_put - let DMA drivers be removed when ref_count == 0 + */ +void zxdh_dmaengine_put(void) +{ + struct dma_device *device, *_d; + struct dma_chan *chan; + + mutex_lock(&dma_list_mutex); + dmaengine_ref_count--; + BUG_ON(dmaengine_ref_count < 0); + /* drop channel references */ + list_for_each_entry_safe(device, _d, &dma_device_list, global_node) { + if (dma_has_cap(DMA_PRIVATE, device->cap_mask)) + continue; + list_for_each_entry(chan, &device->channels, device_node) + zxdh_dma_chan_put(chan); + } + mutex_unlock(&dma_list_mutex); +} + + +static bool zxdh_device_has_all_tx_types(struct dma_device *device) +{ + /* A device that satisfies this test has channels that will never cause + * an async_tx channel switch event as all possible operation types can + * be handled. + */ + #ifdef CONFIG_ASYNC_TX_DMA + if (!dma_has_cap(DMA_INTERRUPT, device->cap_mask)) + return false; + #endif + + #if IS_ENABLED(CONFIG_ASYNC_MEMCPY) + if (!dma_has_cap(DMA_MEMCPY, device->cap_mask)) + return false; + #endif + + #if IS_ENABLED(CONFIG_ASYNC_XOR) + if (!dma_has_cap(DMA_XOR, device->cap_mask)) + return false; + + #ifndef CONFIG_ASYNC_TX_DISABLE_XOR_VAL_DMA + if (!dma_has_cap(DMA_XOR_VAL, device->cap_mask)) + return false; + #endif + #endif + + #if IS_ENABLED(CONFIG_ASYNC_PQ) + if (!dma_has_cap(DMA_PQ, device->cap_mask)) + return false; + + #ifndef CONFIG_ASYNC_TX_DISABLE_PQ_VAL_DMA + if (!dma_has_cap(DMA_PQ_VAL, device->cap_mask)) + return false; + #endif + #endif + + return true; +} + +static int zxdh_get_dma_id(struct dma_device *device) +{ + int rc = ida_alloc(&dma_ida, GFP_KERNEL); + + if (rc < 0) + return rc; + device->dev_id = rc; + return 0; +} + +static int __zxdh_dma_async_device_channel_register(struct dma_device *device, + struct dma_chan *chan) +{ + int rc; + + chan->local = alloc_percpu(typeof(*chan->local)); + if (!chan->local) + return -ENOMEM; + chan->dev = kzalloc(sizeof(*chan->dev), GFP_KERNEL); + if (!chan->dev) { + rc = -ENOMEM; + goto err_free_local; + } + + /* + * When the chan_id is a negative value, we are dynamically adding + * the channel. Otherwise we are static enumerating. + */ + mutex_lock(&device->chan_mutex); + chan->chan_id = ida_alloc(&device->chan_ida, GFP_KERNEL); + mutex_unlock(&device->chan_mutex); + if (chan->chan_id < 0) { + pr_err("%s: unable to alloc ida for chan: %d\n", + __func__, chan->chan_id); + rc = chan->chan_id; + goto err_free_dev; + } + + chan->dev->device.class = &dma_devclass; + chan->dev->device.parent = device->dev; + chan->dev->chan = chan; + chan->dev->dev_id = device->dev_id; + dev_set_name(&chan->dev->device, "dma%dchan%d", + device->dev_id, chan->chan_id); + rc = device_register(&chan->dev->device); + if (rc) + goto err_out_ida; + chan->client_count = 0; + device->chancnt++; + + return 0; + + err_out_ida: + mutex_lock(&device->chan_mutex); + ida_free(&device->chan_ida, chan->chan_id); + mutex_unlock(&device->chan_mutex); + err_free_dev: + kfree(chan->dev); + err_free_local: + free_percpu(chan->local); + chan->local = NULL; + return rc; +} + +int zxdh_dma_async_device_channel_register(struct dma_device *device, + struct dma_chan *chan) +{ + int rc; + + rc = __zxdh_dma_async_device_channel_register(device, chan); + if (rc < 0) + return rc; + + zxdh_dma_channel_rebalance(); + return 0; +} + + +static void __zxdh__dma_async_device_channel_unregister(struct dma_device *device, + struct dma_chan *chan) +{ + WARN_ONCE(!device->device_release && chan->client_count, + "%s called while %d clients hold a reference\n", + __func__, chan->client_count); + mutex_lock(&dma_list_mutex); + device->chancnt--; + chan->dev->chan = NULL; + mutex_unlock(&dma_list_mutex); + mutex_lock(&device->chan_mutex); + ida_free(&device->chan_ida, chan->chan_id); + mutex_unlock(&device->chan_mutex); + device_unregister(&chan->dev->device); + free_percpu(chan->local); +} + +void zxdh_dma_async_device_channel_unregister(struct dma_device *device, + struct dma_chan *chan) +{ + __zxdh__dma_async_device_channel_unregister(device, chan); + zxdh_dma_channel_rebalance(); +} + + +/** + * dma_async_device_register - registers DMA devices found + * @device: pointer to &struct dma_device + * + * After calling this routine the structure should not be freed except in the + * device_release() callback which will be called after + * zxdh_dma_async_device_unregister() is called and no further references are taken. + */ +int zxdh_dma_async_device_register(struct dma_device *device) +{ + int rc = 0; + struct dma_chan* chan = NULL; + + DH_LOG_INFO(MODULE_MPF, "enter\n"); + + if (!device) + return -ENODEV; + + /* validate device routines */ + if (!device->dev) { + pr_err("DMAdevice must have dev\n"); + return -EIO; + } + + device->owner = device->dev->driver->owner; + + if (dma_has_cap(DMA_MEMCPY, device->cap_mask) && !device->device_prep_dma_memcpy) { + dev_err(device->dev, + "Device claims capability %s, but op is not defined\n", + "DMA_MEMCPY"); + return -EIO; + } + + if (dma_has_cap(DMA_MEMCPY_SG, device->cap_mask) && !device->device_prep_dma_memcpy_sg) { + dev_err(device->dev, + "Device claims capability %s, but op is not defined\n", + "DMA_MEMCPY_SG"); + return -EIO; + } + + if (dma_has_cap(DMA_XOR, device->cap_mask) && !device->device_prep_dma_xor) { + dev_err(device->dev, + "Device claims capability %s, but op is not defined\n", + "DMA_XOR"); + return -EIO; + } + + if (dma_has_cap(DMA_XOR_VAL, device->cap_mask) && !device->device_prep_dma_xor_val) { + dev_err(device->dev, + "Device claims capability %s, but op is not defined\n", + "DMA_XOR_VAL"); + return -EIO; + } + + if (dma_has_cap(DMA_PQ, device->cap_mask) && !device->device_prep_dma_pq) { + dev_err(device->dev, + "Device claims capability %s, but op is not defined\n", + "DMA_PQ"); + return -EIO; + } + + if (dma_has_cap(DMA_PQ_VAL, device->cap_mask) && !device->device_prep_dma_pq_val) { + dev_err(device->dev, + "Device claims capability %s, but op is not defined\n", + "DMA_PQ_VAL"); + return -EIO; + } + + if (dma_has_cap(DMA_MEMSET, device->cap_mask) && !device->device_prep_dma_memset) { + dev_err(device->dev, + "Device claims capability %s, but op is not defined\n", + "DMA_MEMSET"); + return -EIO; + } + + if (dma_has_cap(DMA_INTERRUPT, device->cap_mask) && !device->device_prep_dma_interrupt) { + dev_err(device->dev, + "Device claims capability %s, but op is not defined\n", + "DMA_INTERRUPT"); + return -EIO; + } + + if (dma_has_cap(DMA_CYCLIC, device->cap_mask) && !device->device_prep_dma_cyclic) { + dev_err(device->dev, + "Device claims capability %s, but op is not defined\n", + "DMA_CYCLIC"); + return -EIO; + } + + if (dma_has_cap(DMA_INTERLEAVE, device->cap_mask) && !device->device_prep_interleaved_dma) { + dev_err(device->dev, + "Device claims capability %s, but op is not defined\n", + "DMA_INTERLEAVE"); + return -EIO; + } + + + if (!device->device_tx_status) { + dev_err(device->dev, "Device tx_status is not defined\n"); + return -EIO; + } + + + if (!device->device_issue_pending) { + dev_err(device->dev, "Device issue_pending is not defined\n"); + return -EIO; + } + + if (!device->device_release) + dev_dbg(device->dev, + "WARN: Device release is not defined so it is not safe to unbind this driver while in use\n"); + + kref_init(&device->ref); + + /* note: this only matters in the + * CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH=n case + */ + if (zxdh_device_has_all_tx_types(device)) + dma_cap_set(DMA_ASYNC_TX, device->cap_mask); + + rc = zxdh_get_dma_id(device); + if (rc != 0) + return rc; + + mutex_init(&device->chan_mutex); + ida_init(&device->chan_ida); + + /* represent channels in sysfs. Probably want devs too */ + list_for_each_entry(chan, &device->channels, device_node) { + rc = __zxdh_dma_async_device_channel_register(device, chan); + if (rc < 0) + goto err_out; + } + + mutex_lock(&dma_list_mutex); + /* take references on public channels */ + if (dmaengine_ref_count && !dma_has_cap(DMA_PRIVATE, device->cap_mask)) + list_for_each_entry(chan, &device->channels, device_node) { + /* if clients are already waiting for channels we need + * to take references on their behalf + */ + if (zxdh_dma_chan_get(chan) == -ENODEV) { + /* note we can only get here for the first + * channel as the remaining channels are + * guaranteed to get a reference + */ + rc = -ENODEV; + mutex_unlock(&dma_list_mutex); + goto err_out; + } + } + list_add_tail_rcu(&device->global_node, &dma_device_list); + if (dma_has_cap(DMA_PRIVATE, device->cap_mask)) + device->privatecnt++; /* Always private */ + zxdh_dma_channel_rebalance(); + mutex_unlock(&dma_list_mutex); + + zxdh_dmaengine_debug_register(device); + + return 0; + +err_out: + /* if we never registered a channel just release the idr */ + if (!device->chancnt) { + ida_free(&dma_ida, device->dev_id); + return rc; + } + + list_for_each_entry(chan, &device->channels, device_node) { + if (chan->local == NULL) + continue; + mutex_lock(&dma_list_mutex); + chan->dev->chan = NULL; + mutex_unlock(&dma_list_mutex); + device_unregister(&chan->dev->device); + free_percpu(chan->local); + } + return rc; +} + + +/** + * zxdh_dma_async_device_unregister - unregister a DMA device + * @device: pointer to &struct dma_device + * + * This routine is called by dma driver exit routines, dmaengine holds module + * references to prevent it being called while channels are in use. + */ +void zxdh_dma_async_device_unregister(struct dma_device *device) +{ + struct dma_chan *chan, *n; + + zxdh_dmaengine_debug_unregister(device); + + list_for_each_entry_safe(chan, n, &device->channels, device_node) + __zxdh__dma_async_device_channel_unregister(device, chan); + + mutex_lock(&dma_list_mutex); + /* + * setting DMA_PRIVATE ensures the device being torn down will not + * be used in the channel_table + */ + dma_cap_set(DMA_PRIVATE, device->cap_mask); + zxdh_dma_channel_rebalance(); + ida_free(&dma_ida, device->dev_id); + zxdh_dma_device_put(device); + mutex_unlock(&dma_list_mutex); +} + + +static void zxdh_dmam_device_release(struct device *dev, void *res) +{ + struct dma_device *device; + + device = *(struct dma_device **)res; + zxdh_dma_async_device_unregister(device); +} + +/** + * zxdh_dmaenginem_async_device_register - registers DMA devices found + * @device: pointer to &struct dma_device + * + * The operation is managed and will be undone on driver detach. + */ +int zxdh_dmaenginem_async_device_register(struct dma_device *device) +{ + void *p; + int ret; + + p = devres_alloc(zxdh_dmam_device_release, sizeof(void *), GFP_KERNEL); + if (!p) + return -ENOMEM; + + ret = dma_async_device_register(device); + if (!ret) { + *(struct dma_device **)p = device; + devres_add(device->dev, p); + } else { + devres_free(p); + } + + return ret; +} + + +struct zxdh_dmaengine_unmap_pool { + struct kmem_cache *cache; + const char *name; + mempool_t *pool; + size_t size; +}; + +#define __UNMAP_POOL(x) { .size = x, .name = "dmaengine-unmap-" __stringify(x) } +static struct zxdh_dmaengine_unmap_pool unmap_pool[] = { + __UNMAP_POOL(2), + #if IS_ENABLED(CONFIG_DMA_ENGINE_RAID) + __UNMAP_POOL(16), + __UNMAP_POOL(128), + __UNMAP_POOL(256), + #endif +}; + +static struct zxdh_dmaengine_unmap_pool *__zxdh_get_unmap_pool(int nr) +{ + int order = get_count_order(nr); + + switch (order) { + case 0 ... 1: + return &unmap_pool[0]; +#if IS_ENABLED(CONFIG_DMA_ENGINE_RAID) + case 2 ... 4: + return &unmap_pool[1]; + case 5 ... 7: + return &unmap_pool[2]; + case 8: + return &unmap_pool[3]; +#endif + default: + BUG(); + return NULL; + } +} + +static void zxdh_dmaengine_unmap(struct kref *kref) +{ + struct dmaengine_unmap_data *unmap = container_of(kref, typeof(*unmap), kref); + struct device *dev = unmap->dev; + int cnt, i; + + cnt = unmap->to_cnt; + for (i = 0; i < cnt; i++) + dma_unmap_page(dev, unmap->addr[i], unmap->len, + DMA_TO_DEVICE); + cnt += unmap->from_cnt; + for (; i < cnt; i++) + dma_unmap_page(dev, unmap->addr[i], unmap->len, + DMA_FROM_DEVICE); + cnt += unmap->bidi_cnt; + for (; i < cnt; i++) { + if (unmap->addr[i] == 0) + continue; + dma_unmap_page(dev, unmap->addr[i], unmap->len, + DMA_BIDIRECTIONAL); + } + cnt = unmap->map_cnt; + mempool_free(unmap, __zxdh_get_unmap_pool(cnt)->pool); +} + +void zxdh_dmaengine_unmap_put(struct dmaengine_unmap_data *unmap) +{ + if (unmap) + kref_put(&unmap->kref, zxdh_dmaengine_unmap); +} + + +static void zxdh_dmaengine_destroy_unmap_pool(void) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(unmap_pool); i++) { + struct zxdh_dmaengine_unmap_pool *p = &unmap_pool[i]; + + mempool_destroy(p->pool); + p->pool = NULL; + kmem_cache_destroy(p->cache); + p->cache = NULL; + } +} + +static int __init zxdh_dmaengine_init_unmap_pool(void) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(unmap_pool); i++) { + struct zxdh_dmaengine_unmap_pool *p = &unmap_pool[i]; + size_t size; + + size = sizeof(struct dmaengine_unmap_data) + + sizeof(dma_addr_t) * p->size; + + p->cache = kmem_cache_create(p->name, size, 0, + SLAB_HWCACHE_ALIGN, NULL); + if (!p->cache) + break; + p->pool = mempool_create_slab_pool(1, p->cache); + if (!p->pool) + break; + } + + if (i == ARRAY_SIZE(unmap_pool)) + return 0; + + zxdh_dmaengine_destroy_unmap_pool(); + return -ENOMEM; +} + +struct dmaengine_unmap_data * +zxdh_dmaengine_get_unmap_data(struct device *dev, int nr, gfp_t flags) +{ + struct dmaengine_unmap_data *unmap; + + unmap = mempool_alloc(__zxdh_get_unmap_pool(nr)->pool, flags); + if (!unmap) + return NULL; + + memset(unmap, 0, sizeof(*unmap)); + kref_init(&unmap->kref); + unmap->dev = dev; + unmap->map_cnt = nr; + + return unmap; +} + + +void zxdh_dma_async_tx_descriptor_init(struct dma_async_tx_descriptor *tx, + struct dma_chan *chan) +{ + tx->chan = chan; + #ifdef CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH + spin_lock_init(&tx->lock); + #endif +} + +static inline int zxdh_desc_check_and_set_metadata_mode( + struct dma_async_tx_descriptor *desc, enum dma_desc_metadata_mode mode) +{ + /* Make sure that the metadata mode is not mixed */ + if (!desc->desc_metadata_mode) { + if (dmaengine_is_metadata_mode_supported(desc->chan, mode)) + desc->desc_metadata_mode = mode; + else + return -ENOTSUPP; + } else if (desc->desc_metadata_mode != mode) { + return -EINVAL; + } + + return 0; +} + +int zxdh_dmaengine_desc_attach_metadata(struct dma_async_tx_descriptor *desc, + void *data, size_t len) +{ + int ret; + + if (!desc) + return -EINVAL; + + ret = zxdh_desc_check_and_set_metadata_mode(desc, DESC_METADATA_CLIENT); + if (ret) + return ret; + + if (!desc->metadata_ops || !desc->metadata_ops->attach) + return -ENOTSUPP; + + return desc->metadata_ops->attach(desc, data, len); +} + + +void *zxdh_dmaengine_desc_get_metadata_ptr(struct dma_async_tx_descriptor *desc, + size_t *payload_len, size_t *max_len) +{ + int ret; + + if (!desc) + return ERR_PTR(-EINVAL); + + ret = zxdh_desc_check_and_set_metadata_mode(desc, DESC_METADATA_ENGINE); + if (ret) + return ERR_PTR(ret); + + if (!desc->metadata_ops || !desc->metadata_ops->get_ptr) + return ERR_PTR(-ENOTSUPP); + + return desc->metadata_ops->get_ptr(desc, payload_len, max_len); +} + + +int zxdh_dmaengine_desc_set_metadata_len(struct dma_async_tx_descriptor *desc, + size_t payload_len) +{ + int ret; + + if (!desc) + return -EINVAL; + + ret = zxdh_desc_check_and_set_metadata_mode(desc, DESC_METADATA_ENGINE); + if (ret) + return ret; + + if (!desc->metadata_ops || !desc->metadata_ops->set_len) + return -ENOTSUPP; + + return desc->metadata_ops->set_len(desc, payload_len); +} + + +/** + * zxdh_dma_wait_for_async_tx - spin wait for a transaction to complete + * @tx: in-flight transaction to wait on + */ +enum dma_status +zxdh_dma_wait_for_async_tx(struct dma_async_tx_descriptor *tx) +{ + unsigned long zxdh_dma_sync_wait_timeout = jiffies + msecs_to_jiffies(5000); + + if (!tx) + return DMA_COMPLETE; + + while (tx->cookie == -EBUSY) { + if (time_after_eq(jiffies, zxdh_dma_sync_wait_timeout)) { + dev_err(tx->chan->device->dev, + "%s timeout waiting for descriptor submission\n", + __func__); + return DMA_ERROR; + } + cpu_relax(); + } + return zxdh_dma_sync_wait(tx->chan, tx->cookie); +} + + +/** + * zxdh_dma_run_dependencies - process dependent operations on the target channel + * @tx: transaction with dependencies + * + * Helper routine for DMA drivers to process (start) dependent operations + * on their target channel. + */ +void zxdh_dma_run_dependencies(struct dma_async_tx_descriptor *tx) +{ + struct dma_async_tx_descriptor *dep = txd_next(tx); + struct dma_async_tx_descriptor *dep_next; + struct dma_chan *chan; + + if (!dep) + return; + + /* we'll submit tx->next now, so clear the link */ + txd_clear_next(tx); + chan = dep->chan; + + /* keep submitting up until a channel switch is detected + * in that case we will be called again as a result of + * processing the interrupt from async_tx_channel_switch + */ + for (; dep; dep = dep_next) { + txd_lock(dep); + txd_clear_parent(dep); + dep_next = txd_next(dep); + if (dep_next && dep_next->chan == chan) + txd_clear_next(dep); /* ->next will be submitted */ + else + dep_next = NULL; /* submit current dep and terminate */ + txd_unlock(dep); + + dep->tx_submit(dep); + } + + chan->device->device_issue_pending(chan); +} + + +static int __init zxdh_dma_bus_init(void) +{ + int err = zxdh_dmaengine_init_unmap_pool(); + + if (err) + return err; + + err = class_register(&dma_devclass); + if (!err) + zxdh_dmaengine_debugfs_init(); + + return err; +} +arch_initcall(zxdh_dma_bus_init); diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/dmaengine.h b/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/dmaengine.h new file mode 100644 index 0000000..5fc8b18 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/dmaengine.h @@ -0,0 +1,205 @@ +#ifndef ZXDH_DMAENGINE_H +#define ZXDH_DMAENGINE_H + +#include +#include + + +/** + * zxdh_dma_cookie_init - initialize the cookies for a DMA channel + * @chan: dma channel to initialize + */ +static inline void zxdh_dma_cookie_init(struct dma_chan *chan) +{ + chan->cookie = DMA_MIN_COOKIE; + chan->completed_cookie = DMA_MIN_COOKIE; +} + +/** + * zxdh_dma_cookie_assign - assign a DMA engine cookie to the descriptor + * @tx: descriptor needing cookie + * + * Assign a unique non-zero per-channel cookie to the descriptor. + * Note: caller is expected to hold a lock to prevent concurrency. + */ +static inline dma_cookie_t zxdh_dma_cookie_assign(struct dma_async_tx_descriptor *tx) +{ + struct dma_chan *chan = tx->chan; + dma_cookie_t cookie; + + cookie = chan->cookie + 1; + if (cookie < DMA_MIN_COOKIE) + cookie = DMA_MIN_COOKIE; + tx->cookie = chan->cookie = cookie; + + return cookie; +} + +/** + * zxdh_dma_cookie_complete - complete a descriptor + * @tx: descriptor to complete + * + * Mark this descriptor complete by updating the channels completed + * cookie marker. Zero the descriptors cookie to prevent accidental + * repeated completions. + * + * Note: caller is expected to hold a lock to prevent concurrency. + */ +static inline void zxdh_dma_cookie_complete(struct dma_async_tx_descriptor *tx) +{ + BUG_ON(tx->cookie < DMA_MIN_COOKIE); + tx->chan->completed_cookie = tx->cookie; + tx->cookie = 0; +} + +/** + * zxdh_dma_cookie_status - report cookie status + * @chan: dma channel + * @cookie: cookie we are interested in + * @state: dma_tx_state structure to return last/used cookies + * + * Report the status of the cookie, filling in the state structure if + * non-NULL. No locking is required. + */ +static inline enum dma_status zxdh_dma_cookie_status(struct dma_chan *chan, + dma_cookie_t cookie, struct dma_tx_state *state) +{ + dma_cookie_t used, complete; + + used = chan->cookie; + complete = chan->completed_cookie; + barrier(); + if (state) { + state->residue = 0; + state->in_flight_bytes = 0; + } + + if (complete <= used) { + if ((cookie <= complete) || (cookie > used)) + return DMA_COMPLETE; + } else { + if ((cookie <= complete) && (cookie > used)) + return DMA_COMPLETE; + } + return DMA_IN_PROGRESS; +} + +static inline void zxdh_dma_set_residue(struct dma_tx_state *state, u32 residue) +{ + if (state) + state->residue = residue; +} + +static inline void zxdh_dma_set_in_flight_bytes(struct dma_tx_state *state, + u32 in_flight_bytes) +{ + if (state) + state->in_flight_bytes = in_flight_bytes; +} + +struct zxdh_dmaengine_desc_callback { + dma_async_tx_callback callback; + dma_async_tx_callback_result callback_result; + void *callback_param; +}; + +/** + * zxdh_dmaengine_desc_get_callback - get the passed in callback function + * @tx: tx descriptor + * @cb: temp struct to hold the callback info + * + * Fill the passed in cb struct with what's available in the passed in + * tx descriptor struct + * No locking is required. + */ +static inline void +zxdh_dmaengine_desc_get_callback(struct dma_async_tx_descriptor *tx, + struct zxdh_dmaengine_desc_callback *cb) +{ + cb->callback = tx->callback; + cb->callback_result = tx->callback_result; + cb->callback_param = tx->callback_param; +} + +/** + * zxdh_dmaengine_desc_callback_invoke - call the callback function in cb struct + * @cb: temp struct that is holding the callback info + * @result: transaction result + * + * Call the callback function provided in the cb struct with the parameter + * in the cb struct. + * Locking is dependent on the driver. + */ +static inline void +zxdh_dmaengine_desc_callback_invoke(struct zxdh_dmaengine_desc_callback *cb, + const struct dmaengine_result *result) +{ + struct dmaengine_result dummy_result = { + .result = DMA_TRANS_NOERROR, + .residue = 0 + }; + + if (cb->callback_result) { + if (!result) + result = &dummy_result; + cb->callback_result(cb->callback_param, result); + } else if (cb->callback) { + cb->callback(cb->callback_param); + } +} + +/** + * zxdh_dmaengine_desc_get_callback_invoke - get the callback in tx descriptor and + * then immediately call the callback. + * @tx: dma async tx descriptor + * @result: transaction result + * + * Call zxdh_dmaengine_desc_get_callback() and zxdh_dmaengine_desc_callback_invoke() + * in a single function since no work is necessary in between for the driver. + * Locking is dependent on the driver. + */ +static inline void +zxdh_dmaengine_desc_get_callback_invoke(struct dma_async_tx_descriptor *tx, + const struct dmaengine_result *result) +{ + struct zxdh_dmaengine_desc_callback cb; + + zxdh_dmaengine_desc_get_callback(tx, &cb); + zxdh_dmaengine_desc_callback_invoke(&cb, result); +} + +/** + * zxdh_dmaengine_desc_callback_valid - verify the callback is valid in cb + * @cb: callback info struct + * + * Return a bool that verifies whether callback in cb is valid or not. + * No locking is required. + */ +static inline bool +zxdh_dmaengine_desc_callback_valid(struct zxdh_dmaengine_desc_callback *cb) +{ + return cb->callback || cb->callback_result; +} + +struct dma_chan *zxdh_dma_get_slave_channel(struct dma_chan *chan); +struct dma_chan *zxdh_dma_get_any_slave_channel(struct dma_device *device); +void zxdh_dma_async_tx_descriptor_init(struct dma_async_tx_descriptor *tx, + struct dma_chan *chan); + +#ifdef CONFIG_DEBUG_FS +#include + +static inline struct dentry * +zxdh_zxdh_dmaengine_get_debugfs_root(struct dma_device *dma_dev) { + return dma_dev->dbg_dev_root; +} +#else +struct dentry; +static inline struct dentry * +zxdh_zxdh_dmaengine_get_debugfs_root(struct dma_device *dma_dev) +{ + return NULL; +} +#endif /* CONFIG_DEBUG_FS */ + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/pcie-zte-zf-epc.c b/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/pcie-zte-zf-epc.c new file mode 100644 index 0000000..7125e82 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/pcie-zte-zf-epc.c @@ -0,0 +1,1647 @@ +#include "pcie-zte-zf-epc.h" +#include "pcie-zte-zf-hdma.h" + +struct pcie_zf_ep *zf_ep = NULL; + +// PRE_FUNC +#if 1 +int pcie_zf_read(void __iomem *addr, int size, u32 *val) +{ + *val = 0; + if (!IS_ALIGNED((unsigned long)addr, size)) + return PCIBIOS_BAD_REGISTER_NUMBER; + + if (size == 4) + *val = readl(addr); + else if (size == 2) + *val = readw(addr); + else if (size == 1) + *val = readb(addr); + else + return PCIBIOS_BAD_REGISTER_NUMBER; + + return PCIBIOS_SUCCESSFUL; +} +int pcie_zf_write(void __iomem *addr, int size, u32 val) +{ + if (!IS_ALIGNED((unsigned long)addr, size)) + return PCIBIOS_BAD_REGISTER_NUMBER; + + if (size == 4) + writel(val, addr); + else if (size == 2) + writew(val, addr); + else if (size == 1) + writeb(val, addr); + else + return PCIBIOS_BAD_REGISTER_NUMBER; + + return PCIBIOS_SUCCESSFUL; +} +u32 cfg_phy_rmw(u64 phy_addr, u32 value, u32 mask) +{ + u32 reg_val = 0; + void __iomem *virt_addr = NULL; + u64 tmp_addr = 0; + u64 offset = 0; + u64 size = 0; + int ret = 0; + + offset = phy_addr % PAGE_SIZE; + if (phy_addr < offset) + { + DH_LOG_ERR(MODULE_MPF, "data overflow! phy_addr=0x%llx, offset=0x%llx\n", phy_addr, offset); + return PCIBIOS_BAD_REGISTER_NUMBER; + } + else + { + tmp_addr = phy_addr - offset; + } + if (offset <= (PAGE_SIZE - 4)) + { + size = PAGE_SIZE; + } + else + { + size = 2 * PAGE_SIZE; + } + + virt_addr = ioremap(tmp_addr, size); + if (NULL == virt_addr) + { + DH_LOG_ERR(MODULE_MPF, "cfg_phy_rmw ioremap failed!\n"); + return PCIBIOS_BAD_REGISTER_NUMBER; + } + + ret = pcie_zf_read((virt_addr + offset), 4, ®_val); + if (ret) + goto err; + + reg_val &= (~mask); + reg_val |= (value & mask); + + ret = pcie_zf_write(virt_addr + offset, 4, reg_val); +err: + iounmap(virt_addr); + return ret; +} + +u8 pcie_zf_readb_dbi(struct pcie_dpu_ep *ep, u32 reg) +{ + u32 val = 0; + + pcie_zf_read(ep->dbi_base + reg, 0x1, &val); + + return val; +} + +u16 pcie_zf_readw_dbi(struct pcie_dpu_ep *ep, u32 reg) +{ + int ret; + u32 val; + + ret = pcie_zf_read(ep->dbi_base + reg, 0x2, &val); + if (ret) + DH_LOG_ERR(MODULE_MPF, "Read DBIw address failed\r\n"); + + return val; +} +u32 pcie_zf_readl_dbi(struct pcie_dpu_ep *ep, u32 reg) +{ + int ret = 0; + u32 val = 0; + + ret = pcie_zf_read(ep->dbi_base + reg, 0x4, &val); + if (ret) + DH_LOG_ERR(MODULE_MPF, "Read DBIl address failed\r\n"); + + return val; +} + +void pcie_zf_writeb_dbi(struct pcie_dpu_ep *ep, u32 reg, u32 val) +{ + pcie_zf_write(ep->dbi_base + reg, 0x1, val); +} + +void pcie_zf_writew_dbi(struct pcie_dpu_ep *ep, u32 reg, u32 val) +{ + int ret = 0; + + ret = pcie_zf_write(ep->dbi_base + reg, 0x2, val); + if (ret) + DH_LOG_ERR(MODULE_MPF, "Write DBI address failed\r\n"); +} +void pcie_zf_writel_dbi(struct pcie_dpu_ep *ep, u32 reg, u32 val) +{ + int ret = 0; + + ret = pcie_zf_write(ep->dbi_base + reg, 0x4, val); + if (ret) + DH_LOG_ERR(MODULE_MPF, "Write DBI address failed\r\n"); +} + +void pcie_zf_writeb_dbi2(struct pcie_dpu_ep *ep, u32 reg, u32 val) +{ + pcie_zf_write(ep->dbi_base + PCIE_DPU_EP_DBI2_OFFSET + reg, 0x1, val); +} + +void pcie_zf_writew_dbi2(struct pcie_dpu_ep *ep, u32 reg, u32 val) +{ + int ret = 0; + + ret = pcie_zf_write(ep->dbi_base + PCIE_DPU_EP_DBI2_OFFSET + reg, 0x2, val); + if (ret) + DH_LOG_ERR(MODULE_MPF, "Write DBI address failed\r\n"); +} +void pcie_zf_writel_dbi2(struct pcie_dpu_ep *ep, u32 reg, u32 val) +{ + int ret; + + ret = pcie_zf_write(ep->dbi_base + PCIE_DPU_EP_DBI2_OFFSET + reg, 0x4, val); + if (ret) + DH_LOG_ERR(MODULE_MPF, "Write DBI address failed\r\n"); +} +void pcie_zf_writel_atu(struct pcie_dpu_ep *ep, u32 reg, u32 val) +{ + int ret = 0; + + ret = pcie_zf_write(ep->atu_base + reg, 0x4, val); + if (ret) + DH_LOG_ERR(MODULE_MPF, "Write ATU address failed\r\n"); +} +static u32 pcie_zf_readl_atu(struct pcie_dpu_ep *ep, u32 reg) +{ + int ret = 0; + u32 val = 0; + + ret = pcie_zf_read(ep->atu_base + reg, 4, &val); + if (ret) + DH_LOG_ERR(MODULE_MPF, "Read ATU address failed\r\n"); + + return val; +} +static u64 zte_pcie_dma_atu_addr_remapping(u64 addr_input) +{ + u64 addr_output = 0; + // DMA and ATU地址重映射,将地址的bit12~18左移4位,设置bit15 = 0 + addr_output = (((addr_input & (0x7F << 12)) << 4) | (addr_input & 0xFFF)) & (~(1 << 15)); + + return addr_output; +} +static u32 pcie_zf_readl_ib_unroll(struct pcie_dpu_ep *ep, u32 index, u32 reg) +{ + u32 offset = zte_pcie_dma_atu_addr_remapping(PCIE_GET_ATU_INB_UNR_REG_OFFSET(index)); + + return pcie_zf_readl_atu(ep, offset + reg); +} +static void pcie_zf_writel_ib_unroll(struct pcie_dpu_ep *ep, u32 index, u32 reg, u32 val) +{ + u32 offset = zte_pcie_dma_atu_addr_remapping(PCIE_GET_ATU_INB_UNR_REG_OFFSET(index)); + + pcie_zf_writel_atu(ep, offset + reg, val); +} +static u32 pcie_zf_readl_ob_unroll(struct pcie_dpu_ep *ep, u32 index, u32 reg) +{ + u32 offset = zte_pcie_dma_atu_addr_remapping(PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(index)); + + return pcie_zf_readl_atu(ep, offset + reg); +} +static void pcie_zf_writel_ob_unroll(struct pcie_dpu_ep *ep, u32 index, u32 reg, u32 val) +{ + u32 offset = zte_pcie_dma_atu_addr_remapping(PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(index)); + + pcie_zf_writel_atu(ep, offset + reg, val); +} +static void pcie_zf_dbi_ro_wr_en(struct pcie_dpu_ep *ep) +{ + u64 reg = 0; + u32 val = 0; + + reg = PCIE_MISC_CONTROL_1_OFF; + val = pcie_zf_readl_dbi(ep, reg); + val |= PCIE_DBI_RO_WR_EN; + pcie_zf_writel_dbi(ep, reg, val); +} +static void pcie_zf_dbi_ro_wr_dis(struct pcie_dpu_ep *ep) +{ + u64 reg = 0; + u32 val = 0; + + reg = PCIE_MISC_CONTROL_1_OFF; + val = pcie_zf_readl_dbi(ep, reg); + val &= ~PCIE_DBI_RO_WR_EN; + pcie_zf_writel_dbi(ep, reg, val); +} +static void pcie_dpu_ep_sriov_enable(struct pcie_dpu_ep *ep, u64 sriov_ecap_offset) +{ + u32 val = pcie_zf_readl_dbi(ep, sriov_ecap_offset + PCIE_SRIOV_CTRL); + val |= PCIE_SRIOV_CTRL_VFE; + pcie_zf_writel_dbi(ep, sriov_ecap_offset + PCIE_SRIOV_CTRL, val); +} +static void pcie_dpu_ep_sriov_disable(struct pcie_dpu_ep *ep, u64 sriov_ecap_offset) +{ + u32 val = pcie_zf_readl_dbi(ep, sriov_ecap_offset + PCIE_SRIOV_CTRL); + val &= ~PCIE_SRIOV_CTRL_VFE; + pcie_zf_writel_dbi(ep, sriov_ecap_offset + PCIE_SRIOV_CTRL, val); +} +struct pcie_dpu_ep_func *pcie_dpu_ep_get_func_from_ep(struct pcie_dpu_ep *ep, u8 func_no, u8 vfunc_no) +{ + struct pcie_dpu_ep_func *ep_func = NULL; + + list_for_each_entry(ep_func, &ep->func_list, list) + { + if (ep_func->func_no == func_no && ep_func->vfunc_no == vfunc_no) + return ep_func; + } + + return NULL; +} +static u32 pcie_dpu_ep_func_select(u8 func_no, u8 vfunc_no) +{ + u32 func_offset = 0; + + if (isPF(func_no)) + { + func_offset = func_no & PCIE_DPU_EP_GET_PF_NO; + } + else + { + func_offset = (func_no & PCIE_DPU_EP_GET_PF_NO) + (vfunc_no << DBI_VF_CFG_OFFSET_BIT) + VF_ACT_BIT; + } + + return func_offset * PCIE_DPU_EP_FUNC_CFG_SIZE; +} +static u8 pcie_dpu_ep_find_next_cap(struct pcie_dpu_ep *ep, + u32 func_offset, u8 cap_ptr, u8 capid) +{ + u8 now_cap_id = 0, next_cap_ptr = 0; + u16 reg = 0; + + if (!cap_ptr) + return 0; + + reg = pcie_zf_readl_dbi(ep, func_offset + cap_ptr); + now_cap_id = (reg & 0x00ff); + + if (now_cap_id > PCI_CAP_ID_MAX) + return 0; + + if (now_cap_id == capid) + return cap_ptr; + + next_cap_ptr = (reg & 0xff00) >> 8; + return pcie_dpu_ep_find_next_cap(ep, func_offset, next_cap_ptr, capid); +} +static u8 pcie_dpu_ep_find_cap(struct pcie_dpu_ep *ep, u32 func_offset, u8 capid) +{ + u8 next_cap_ptr = 0; + u16 reg = 0; + + reg = pcie_zf_readl_dbi(ep, func_offset + PCI_CAPABILITY_LIST); + next_cap_ptr = (reg & 0x00ff); + + return pcie_dpu_ep_find_next_cap(ep, func_offset, next_cap_ptr, capid); +} +static int pcie_dpu_ep_find_extcap(struct pcie_dpu_ep *ep, u32 func_offset, u8 ext_cap_id, u8 vsecid) +{ + u32 now_cap_id = 0; + u32 vsec_id = 0; + u32 ext_cap_offset = PCIE_ECAP_POINTER_OFF; + + now_cap_id = pcie_zf_readl_dbi(ep, func_offset + ext_cap_offset); + if (now_cap_id == 0x0 || now_cap_id == 0xFFFF) + { + DH_LOG_ERR(MODULE_MPF, "pcie_zf_ep get extcap0 failed!\n"); + return -ENXIO; + } + + while (1) + { + if ((now_cap_id & 0xFFFF) == ext_cap_id) + { + if (ext_cap_id == PCIE_ECAP_VSEC_ID) + { + vsec_id = pcie_zf_readl_dbi(ep, func_offset + ext_cap_offset + 4); + if (vsec_id == vsecid) + { + break; + } + } + else + { + break; + } + } + + ext_cap_offset = (now_cap_id >> 20) & 0xFFF; + if (0x0 == ext_cap_offset) + { + DH_LOG_ERR(MODULE_MPF, "pcie_zf_ep find extcap failed\n"); + return -ENXIO; + } + + now_cap_id = pcie_zf_readl_dbi(ep, func_offset + ext_cap_offset); + } + + return ext_cap_offset; +} + +static int zf_atu_is_used(struct pcie_dpu_ep *ep, int ib_no) +{ + return (pcie_zf_readl_ib_unroll(ep, ib_no, PCIE_ATU_UNR_REGION_CTRL2) & PCIE_ATU_ENABLE) ? 1 : 0; +} + +static int zf_func_is_set_ib(struct pcie_dpu_ep *ep, u8 func_no, enum pci_barno bar, int ib_no) +{ + int func_val = 0, bar_val = 0; + int ctl1_val = pcie_zf_readl_ib_unroll(ep, ib_no, PCIE_ATU_UNR_REGION_CTRL1); + int ctl2_val = pcie_zf_readl_ib_unroll(ep, ib_no, PCIE_ATU_UNR_REGION_CTRL2); + + func_val = PCIE_ATU_FUNC_NUM(func_no & PCIE_DPU_EP_GET_PF_NO); + if ((ctl1_val & PCIE_ATU_FUNC_NUM_MASK) != func_val) + return 0; + + if (isPF(func_no)) + { + if (ctl2_val & PCIE_ATU_VFBAR_MATCH_MODE_ENABLE) + return 0; + } + else + { + if (!(ctl2_val & PCIE_ATU_VFBAR_MATCH_MODE_ENABLE)) + return 0; + } + bar_val = (bar << 8); + return ((ctl2_val & PCIE_ATU_BAR_NUM_MASK) == bar_val); +} + +static int pcie_zf_prog_inbound_atu(struct pcie_dpu_ep *ep, u8 func_no, int index, int bar, dma_addr_t dpu_addr, enum pcie_dpu_as_type as_type) +{ + int type = 0; + u32 retries = 0, val = 0; + int vf_flag = 0; + + dpu_addr = dpu_addr | ZF_PREFIX_ADDR; // dpu addr route + + if (!isPF(func_no)) + { + vf_flag = 1; + } + + pcie_zf_writel_ib_unroll(ep, index, PCIE_ATU_UNR_LOWER_TARGET, lower_32_bits(dpu_addr)); + pcie_zf_writel_ib_unroll(ep, index, PCIE_ATU_UNR_UPPER_TARGET, upper_32_bits(dpu_addr)); + + switch (as_type) + { + case PCIE_DPU_AS_MEM: + type = PCIE_ATU_TYPE_MEM; + break; + case PCIE_DPU_AS_IO: + if (vf_flag == 1) + { + return -EINVAL; + } + type = PCIE_ATU_TYPE_IO; + break; + default: + return -EINVAL; + } + + pcie_zf_writel_ib_unroll(ep, index, PCIE_ATU_UNR_REGION_CTRL1, type | PCIE_ATU_INCREASE_REGION_SIZE | PCIE_ATU_FUNC_NUM(func_no & PCIE_DPU_EP_GET_PF_NO)); + if (vf_flag) + { + pcie_zf_writel_ib_unroll(ep, index, PCIE_ATU_UNR_REGION_CTRL2, + PCIE_ATU_FUNC_NUM_MATCH_EN | + PCIE_ATU_ENABLE | + PCIE_ATU_VFBAR_MATCH_MODE_ENABLE | + PCIE_ATU_BAR_MODE_ENABLE | (bar << 8)); + } + else + { + pcie_zf_writel_ib_unroll(ep, index, PCIE_ATU_UNR_REGION_CTRL2, + PCIE_ATU_FUNC_NUM_MATCH_EN | + PCIE_ATU_ENABLE | + PCIE_ATU_BAR_MODE_ENABLE | (bar << 8)); + } + + /* + * Make sure ATU enable takes effect before any subsequent config + * and I/O accesses. + */ + for (retries = 0; retries < LINK_WAIT_MAX_IATU_RETRIES; retries++) + { + val = pcie_zf_readl_ib_unroll(ep, index, PCIE_ATU_UNR_REGION_CTRL2); + if (val & PCIE_ATU_ENABLE) + return 0; + + mdelay((u32)LINK_WAIT_IATU); + } + DH_LOG_ERR(MODULE_MPF, "Inbound iATU is not being enabled\r\n"); + + return -EBUSY; +} + +static int pcie_dpu_ep_inbound_atu(struct pcie_dpu_ep *ep, u8 func_no, enum pci_barno bar, dma_addr_t dpu_addr, enum pcie_dpu_as_type as_type) +{ + int ret = 0, free_win = -1, atu_id = 0; + u32 vf_bar_off = 0; + u32 is_pf = 0; + u32 bar_to_atu_index = 0; + + if ((func_no & PCIE_DPU_EP_GET_PF_NO) >= PCIE_DPU_PF_NUMS) + { + DH_LOG_ERR(MODULE_MPF, "func_no is err!\n"); + return -EINVAL; + } + + is_pf = isPF(func_no); + if (!is_pf) + { + vf_bar_off = PCIE_VF_BARS_OFF; + } + + spin_lock(&ep->ib_window_lock); + for (atu_id = 0; atu_id < PCIE_DPU_IATU_NUM; atu_id++) + { + if (zf_func_is_set_ib(ep, func_no, bar, atu_id)) + { + free_win = atu_id; + break; + } + } + + if (-1 == free_win) + { + free_win = find_first_zero_bit(ep->ib_window_map, ep->num_ib_windows); + if (free_win >= ep->num_ib_windows) + { + spin_unlock(&ep->ib_window_lock); + DH_LOG_ERR(MODULE_MPF, "No free inbound window\r\n"); + return -EINVAL; + } + } + set_bit(free_win, ep->ib_window_map); + + ret = pcie_zf_prog_inbound_atu(ep, func_no, free_win, bar, dpu_addr, as_type); + spin_unlock(&ep->ib_window_lock); + if (ret < 0) + { + DH_LOG_ERR(MODULE_MPF, "Failed to program IB window\r\n"); + return ret; + } + DH_LOG_INFO(MODULE_MPF, "ep%d func%d bar%d set aitu%d\n", ep->ep_id, func_no, bar, free_win); + + bar_to_atu_index = (u32)bar + vf_bar_off; + if (bar_to_atu_index < (PCI_STD_NUM_BARS * 2 + 1)) + { + ep->bar_to_atu[func_no & PCIE_DPU_EP_GET_PF_NO][bar_to_atu_index] = free_win; + } + else + { + DH_LOG_ERR(MODULE_MPF, "error bar_to_atu index %d\r\n", bar_to_atu_index); + return -EINVAL; + } + + return 0; +} + +static void pcie_zf_prog_outbound_atu(struct pcie_dpu_ep *ep, u8 func_no, u8 vfunc_no, int index, int type, u64 dpu_addr, u64 host_addr, size_t size) +{ + u32 retries = 0, val = 0; + u64 limit_addr = 0; + u64 limit_addr_tmp = 0; + + if (size == 0) + { + DH_LOG_ERR(MODULE_MPF, "data error! dpu_addr=0x%llx, size=0x%lx\r\n", dpu_addr, size); + return; + } + else + { + limit_addr_tmp = ULLONG_MAX - size + 1; + if (dpu_addr > limit_addr_tmp) + { + DH_LOG_ERR(MODULE_MPF, "data overflow!\r\n"); + return; + } + limit_addr = dpu_addr + size - 1; + } + + pcie_zf_writel_ob_unroll(ep, index, PCIE_ATU_UNR_LOWER_BASE, lower_32_bits(dpu_addr)); + pcie_zf_writel_ob_unroll(ep, index, PCIE_ATU_UNR_UPPER_BASE, upper_32_bits(dpu_addr)); + pcie_zf_writel_ob_unroll(ep, index, PCIE_ATU_UNR_LOWER_LIMIT, lower_32_bits(limit_addr)); + pcie_zf_writel_ob_unroll(ep, index, PCIE_ATU_UNR_UPPER_LIMIT, upper_32_bits(limit_addr)); + pcie_zf_writel_ob_unroll(ep, index, PCIE_ATU_UNR_LOWER_TARGET, lower_32_bits(host_addr)); + pcie_zf_writel_ob_unroll(ep, index, PCIE_ATU_UNR_UPPER_TARGET, upper_32_bits(host_addr)); + pcie_zf_writel_ob_unroll(ep, index, PCIE_ATU_UNR_REGION_CTRL1, + type | PCIE_ATU_FUNC_NUM(func_no & PCIE_DPU_EP_GET_PF_NO)); + + if (type == 4 || type == 5) + { + pcie_zf_writel_ob_unroll(ep, index, PCIE_ATU_UNR_REGION_CTRL2, PCIE_ATU_ENABLE | PCIE_ATU_CFG_SHIFT_MODE | PCIE_ATU_DMA_BYPSS); + } + else + { + pcie_zf_writel_ob_unroll(ep, index, PCIE_ATU_UNR_REGION_CTRL2, PCIE_ATU_ENABLE | PCIE_ATU_DMA_BYPSS); + } + + if (isPF(func_no)) + { + pcie_zf_writel_ob_unroll(ep, index, PCIE_ATU_UNR_REGION_CTRL3, 0x0); + } + else + { + pcie_zf_writel_ob_unroll(ep, index, PCIE_ATU_UNR_REGION_CTRL3, PCIE_ATU_OB_VF_ACTIVE | vfunc_no); + } + + /* + * Make sure ATU enable takes effect before any subsequent config + * and I/O accesses. + */ + for (retries = 0; retries < LINK_WAIT_MAX_IATU_RETRIES; retries++) + { + val = pcie_zf_readl_ob_unroll(ep, index, PCIE_ATU_UNR_REGION_CTRL2); + if (val & PCIE_ATU_ENABLE) + return; + + mdelay((u32)LINK_WAIT_IATU); + } + DH_LOG_ERR(MODULE_MPF, "Outbound iATU is not being enabled\r\n"); +} + +static int pcie_dpu_ep_outbound_atu(struct pcie_dpu_ep *ep, u8 func_no, u8 vfunc_no, phys_addr_t dpu_offset, u64 host_addr, size_t size) +{ + u32 free_win = 0; + + free_win = find_first_zero_bit(ep->ob_window_map, ep->num_ob_windows); + if (free_win >= ep->num_ob_windows) + { + DH_LOG_ERR(MODULE_MPF, "No free outbound window\r\n"); + return -EINVAL; + } + + pcie_zf_prog_outbound_atu(ep, func_no, vfunc_no, free_win, PCIE_ATU_TYPE_MEM, + dpu_offset, host_addr, size); + + set_bit(free_win, ep->ob_window_map); + ep->ob_src_addr[free_win] = dpu_offset; + + return 0; +} + +static void pcie_dpu_ep_reset_bar(struct pcie_dpu_ep *ep, u8 func_no, u8 vfunc_no, + enum pci_barno bar, int flags) +{ + int sriov_cap_offset = 0; + u32 reg = 0; + u32 func_offset = pcie_dpu_ep_func_select(func_no & PCIE_DPU_EP_GET_PF_NO, vfunc_no); + + if (isPF(func_no)) + { + reg = func_offset + (u32)(PCI_BASE_ADDRESS_0) + (u32)(PCIE_NEXT_BAR_OFFSET * bar); + pcie_zf_dbi_ro_wr_en(ep); + // pcie_zf_writel_dbi2(ep, reg, 0x0); + pcie_zf_writel_dbi(ep, reg, 0xc); + // pcie_zf_writel_dbi2(ep, reg + PCIE_NEXT_BAR_OFFSET, 0x0); + // pcie_zf_writel_dbi(ep, reg + PCIE_NEXT_BAR_OFFSET, 0x0); + pcie_zf_dbi_ro_wr_dis(ep); + } + else + { + sriov_cap_offset = pcie_dpu_ep_find_extcap(ep, func_offset, PCI_EXT_CAP_ID_SRIOV, 0); + if (sriov_cap_offset < 0) + { + DH_LOG_ERR(MODULE_MPF, "find_extcap failed!!\n"); + } + + reg = func_offset + (u32)sriov_cap_offset + (u32)(PCIE_SRIOV_ECAP_BAR0_OFFSET) + (u32)(bar * PCIE_NEXT_BAR_OFFSET); + pcie_zf_writel_dbi(ep, reg, 0xc); + pcie_zf_writel_dbi(ep, reg + PCIE_NEXT_BAR_OFFSET, 0x0); + + // reg = func_offset + sriov_cap_offset; + // pcie_dpu_ep_sriov_disable(ep, reg); + // pcie_zf_writel_dbi2(ep, reg + PCIE_SRIOV_ECAP_BAR0_OFFSET + bar * PCIE_NEXT_BAR_OFFSET, 0x0); + // pcie_zf_writel_dbi2(ep, reg + PCIE_SRIOV_ECAP_BAR0_OFFSET + (bar + 1) * PCIE_NEXT_BAR_OFFSET, 0x0); + // pcie_dpu_ep_sriov_enable(ep, reg); + } +} + +void pcie_zf_disable_atu(struct pcie_dpu_ep *ep, int index, + enum pcie_dpu_region_type type) +{ + u32 val = 0; + switch (type) + { + case PCIE_DPU_REGION_INBOUND: + val = pcie_zf_readl_ib_unroll(ep, index, PCIE_ATU_UNR_REGION_CTRL2); + val &= (u32)(~PCIE_ATU_ENABLE); + pcie_zf_writel_ib_unroll(ep, index, PCIE_ATU_UNR_REGION_CTRL2, val); + break; + case PCIE_DPU_REGION_OUTBOUND: + val = pcie_zf_readl_ob_unroll(ep, index, PCIE_ATU_UNR_REGION_CTRL2); + val &= (u32)(~PCIE_ATU_ENABLE); + pcie_zf_writel_ob_unroll(ep, index, PCIE_ATU_UNR_REGION_CTRL2, val); + break; + default: + return; + } +} + +static int pcie_zf_find_index(struct pcie_dpu_ep *ep, phys_addr_t dpu_offset, + u32 *atu_index) +{ + u32 index = 0; + + for (index = 0; index < ep->num_ob_windows; index++) + { + if (ep->ob_src_addr[index] != dpu_offset) + continue; + *atu_index = index; + return 0; + } + + return -EINVAL; +} +#endif + +// if ep is link up, return 1 +int pcie_zf_link_up(int ep_id) +{ + u32 val = 0; + + if (ep_id < 0 || ep_id >= PCIE_DPU_EP_NUM) + { + DH_LOG_ERR(MODULE_MPF, "pcie_zf_link_up:err ep_id!\n"); + return -1; + } + + val = readl(zf_ep->dpu_ep_array[ep_id]->dbi_base + PCIE_PORT_DEBUG1); + return ((val & PCIE_PORT_DEBUG1_ZTE_ZF_LINK_UP) && + (!(val & PCIE_PORT_DEBUG1_LINK_IN_TRAINING))); +} +EXPORT_SYMBOL_GPL(pcie_zf_link_up); + +void ep_power_reset(int ep_id) +{ + u64 csr_base_addr = 0; + + csr_base_addr = zf_ep->mpf_paddr + PCIE_DPU_MPF_CSR_ADDR(PCIE_DPU_EP_CSR_SIZE * ep_id); + cfg_phy_rmw(csr_base_addr + PCIE_DPU_EP_CSR_PRST_ADDR, 0x0, 0x2); + cfg_phy_rmw(csr_base_addr + PCIE_DPU_EP_CSR_PRST_ADDR, 0x2, 0x2); +} +EXPORT_SYMBOL_GPL(ep_power_reset); + +int ep_virtio_module_set(int ep_id, int pf_idx, int en) +{ + u64 csr_base_addr = 0; + + csr_base_addr = zf_ep->mpf_paddr + PCIE_DPU_MPF_CSR_ADDR(PCIE_DPU_EP_CSR_SIZE * ep_id); + if ((0 != en) & (1 != en)) + { + DH_LOG_ERR(MODULE_MPF, "err module!\n"); + return -EINVAL; + } + cfg_phy_rmw(csr_base_addr + PCIE_DPU_EP_CSR_VIRT_ADDR, en << pf_idx, 0x1 << pf_idx); + return 0; +} +EXPORT_SYMBOL_GPL(ep_virtio_module_set); + +static phys_addr_t ob_addr_set(int ep_id, phys_addr_t phys_addr) +{ + phys_addr_t rel_addr; + u64 addr_mask = 0xffff; + + rel_addr = (phys_addr & addr_mask) | ep_id << 16 | ((phys_addr & ~addr_mask) << EP_ID_LEN); + return rel_addr; +} + +int pcie_zte_epc_ob_read(struct pci_epc *epc, phys_addr_t phys_addr, unsigned int size, unsigned int *val) +{ + void __iomem *vaddr = NULL; + struct pcie_dpu_ep *dpu_dev = NULL; + + if (!epc) + { + DH_LOG_ERR(MODULE_MPF, "epc is NULL!\n"); + return -ENOMEM; + } + + if (phys_addr < zf_ep->mpf_paddr || phys_addr >= zf_ep->mpf_paddr + zf_ep->ob_size) + { + DH_LOG_ERR(MODULE_MPF, "err:phys_addr out of range!\n"); + return -ENOMEM; + } + + dpu_dev = epc_get_drvdata(epc); + vaddr = zf_ep->mpf_vaddr + ob_addr_set(dpu_dev->ep_id + 5, phys_addr - zf_ep->mpf_paddr); + + return pcie_zf_read(vaddr, size, val); +} +EXPORT_SYMBOL_GPL(pcie_zte_epc_ob_read); + +int pcie_zte_epc_ob_write(struct pci_epc *epc, phys_addr_t phys_addr, int size, int val) +{ + void __iomem *vaddr = NULL; + struct pcie_dpu_ep *dpu_dev = NULL; + + if (!epc) + { + DH_LOG_ERR(MODULE_MPF, "epc is NULL\n"); + return -ENOMEM; + } + + if (phys_addr < zf_ep->mpf_paddr || phys_addr >= zf_ep->mpf_paddr + zf_ep->ob_size) + { + DH_LOG_ERR(MODULE_MPF, "err:phys_addr out of range\n"); + return -ENOMEM; + } + + dpu_dev = epc_get_drvdata(epc); + + vaddr = zf_ep->mpf_vaddr + ob_addr_set(dpu_dev->ep_id + 5, phys_addr - zf_ep->mpf_paddr); + + return pcie_zf_write(vaddr, size, val); +} +EXPORT_SYMBOL_GPL(pcie_zte_epc_ob_write); + +/*################the ops of epc###################*/ +#if 1 +static int pcie_dpu_ep_write_header(struct pci_epc *epc, u8 func_no, u8 vfunc_no, + struct pci_epf_header *hdr) +{ + struct pcie_dpu_ep *ep = epc_get_drvdata(epc); + u32 func_offset = 0, sriov_offset = 0; + int sriov_cap_offset = 0; + int pf_no = func_no & PCIE_DPU_EP_GET_PF_NO; + + DH_LOG_INFO(MODULE_MPF, "func_no = 0x%x, vfunc_no = 0x%x\n", func_no, vfunc_no); + + pcie_zf_dbi_ro_wr_en(ep); + if (isPF(func_no)) + { + func_offset = pcie_dpu_ep_func_select(func_no, 0); + pcie_zf_writew_dbi(ep, func_offset + PCI_VENDOR_ID, hdr->vendorid); + pcie_zf_writew_dbi(ep, func_offset + PCI_DEVICE_ID, hdr->deviceid); + pcie_zf_writel_dbi(ep, func_offset + PCI_CLASS_REVISION, hdr->revid | hdr->progif_code << 8 | hdr->subclass_code << 16 | hdr->baseclass_code << 24); + pcie_zf_writew_dbi(ep, func_offset + PCI_SUBSYSTEM_VENDOR_ID, hdr->subsys_vendor_id); + pcie_zf_writew_dbi(ep, func_offset + PCI_SUBSYSTEM_ID, hdr->subsys_id); + } + else + { + func_offset = pcie_dpu_ep_func_select(pf_no, 0); + sriov_cap_offset = pcie_dpu_ep_find_extcap(ep, func_offset, PCI_EXT_CAP_ID_SRIOV, 0); + if (sriov_cap_offset < 0) + { + DH_LOG_ERR(MODULE_MPF, "find_extcap failed!!\n"); + } + sriov_offset = func_offset + (u32)sriov_cap_offset; + pcie_zf_writew_dbi(ep, sriov_offset + PCIE_SRIOV_ECAP_DEVICE_ID, hdr->deviceid); + } + pcie_zf_dbi_ro_wr_dis(ep); + + return 0; +} + +static int pcie_dpu_ep_set_pf_bar(struct pci_epc *epc, u8 func_no, u8 vfunc_no, + struct pci_epf_bar *epf_bar) +{ + int ret = 0; + struct pcie_dpu_ep *ep = epc_get_drvdata(epc); + enum pci_barno barno = epf_bar->barno; + size_t size = epf_bar->size; + int flags = epf_bar->flags; + enum pcie_dpu_as_type as_type; + u32 reg = 0; + u32 func_offset = 0; + u64 dpu_addr = 0; + + dpu_addr = epf_bar->phys_addr | ZF_PREFIX_ADDR; + + if (!(flags & PCI_BASE_ADDRESS_SPACE)) + as_type = PCIE_DPU_AS_MEM; + else + as_type = PCIE_DPU_AS_IO; + + if (barno != BAR_4) + { + ret = pcie_dpu_ep_inbound_atu(ep, func_no, barno, dpu_addr, as_type); + if (ret) + return ret; + } + else + { + return 0; + } + + func_offset = pcie_dpu_ep_func_select(func_no, vfunc_no); + + if (barno != BAR_ROM) + { + reg = PCI_BASE_ADDRESS_0 + (4 * barno) + func_offset; + } + else + { + reg = PCI_ROM_ADDRESS + func_offset; + } + + if (size) + { + pcie_zf_dbi_ro_wr_en(ep); + + pcie_zf_writel_dbi2(ep, reg, 1); + pcie_zf_writel_dbi2(ep, reg, lower_32_bits(size - 1)); + pcie_zf_writel_dbi(ep, reg, flags | BIT(3)); + if (barno != BAR_ROM) + { + pcie_zf_writel_dbi2(ep, reg + PCIE_NEXT_BAR_OFFSET, upper_32_bits(size - 1)); + pcie_zf_writel_dbi(ep, reg + PCIE_NEXT_BAR_OFFSET, 0); + } + pcie_zf_dbi_ro_wr_dis(ep); + } + + return 0; +} + +static int pcie_dpu_ep_set_vf_bar(struct pci_epc *epc, u8 func_no, u8 vfunc_no, + struct pci_epf_bar *epf_bar) +{ + int ret = 0; + struct pcie_dpu_ep *ep = epc_get_drvdata(epc); + enum pci_barno barno = epf_bar->barno; + int flags = epf_bar->flags; + u32 reg = 0; + u32 func_offset = 0; + int sriov_cap_offset = 0; + u32 pf_func_no = func_no & PCIE_DPU_EP_GET_PF_NO; + u64 dpu_addr = epf_bar->phys_addr | ZF_PREFIX_ADDR; + + if (flags & PCI_BASE_ADDRESS_SPACE) + { + DH_LOG_ERR(MODULE_MPF, "error:vf bar must be mem\n"); + return -EINVAL; + } + + DH_LOG_DEBUG(MODULE_MPF, "pf%x vf%x bar->flags:%d\n", pf_func_no, vfunc_no, flags); + + if (barno != BAR_4) + { + ret = pcie_dpu_ep_inbound_atu(ep, func_no, barno, + dpu_addr, PCIE_DPU_AS_MEM); + if (ret) + return ret; + } + else + { + return 0; + } + + func_offset = pcie_dpu_ep_func_select(pf_func_no, 0); + sriov_cap_offset = pcie_dpu_ep_find_extcap(ep, func_offset, PCI_EXT_CAP_ID_SRIOV, 0); + if (sriov_cap_offset < 0) + { + DH_LOG_ERR(MODULE_MPF, "find_extcap failed!!\n"); + return -ENXIO; + } + + reg = func_offset + sriov_cap_offset; + pcie_dpu_ep_sriov_disable(ep, reg); + if (epf_bar->size) + { + pcie_zf_writel_dbi2(ep, reg + PCIE_SRIOV_ECAP_BAR0_OFFSET + barno * PCIE_NEXT_BAR_OFFSET, 1); + pcie_zf_writel_dbi2(ep, reg + PCIE_SRIOV_ECAP_BAR0_OFFSET + barno * PCIE_NEXT_BAR_OFFSET, lower_32_bits(epf_bar->size - 1)); + pcie_zf_writel_dbi2(ep, reg + PCIE_SRIOV_ECAP_BAR0_OFFSET + (barno + 1) * PCIE_NEXT_BAR_OFFSET, upper_32_bits(epf_bar->size - 1)); + } + pcie_zf_dbi_ro_wr_en(ep); + pcie_zf_writel_dbi(ep, reg + PCIE_SRIOV_ECAP_BAR0_OFFSET + barno * PCIE_NEXT_BAR_OFFSET, epf_bar->flags | BIT(3)); + pcie_zf_dbi_ro_wr_dis(ep); + + pcie_dpu_ep_sriov_enable(ep, reg); + + return 0; +} + +static int pcie_dpu_ep_set_bar(struct pci_epc *epc, u8 func_no, u8 vfunc_no, struct pci_epf_bar *epf_bar) +{ + DH_LOG_DEBUG(MODULE_MPF, "func:0x%x vfunc:0x%x\n", func_no, vfunc_no); + if (isPF(func_no)) + { + return pcie_dpu_ep_set_pf_bar(epc, func_no, vfunc_no, epf_bar); + } + else if (vfunc_no == 0) + { + return pcie_dpu_ep_set_vf_bar(epc, func_no, vfunc_no, epf_bar); + } + + return 0; +} + +static void pcie_dpu_ep_clear_bar(struct pci_epc *epc, u8 func_no, u8 vfunc_no, + bool clear_vf, struct pci_epf_bar *epf_bar) +{ + struct pcie_dpu_ep *ep = epc_get_drvdata(epc); + u32 vf_bar_off = 0; + enum pci_barno barno = epf_bar->barno; + int atu_index = 0; + u32 bar_to_atu_index = 0; + + if ((func_no & PCIE_DPU_EP_GET_PF_NO) >= PCIE_DPU_PF_NUMS) + { + DH_LOG_ERR(MODULE_MPF, "func_no is err!\n"); + return; + } + + if ((barno == BAR_4) || (!isPF(func_no) && !vfunc_no)) + { + return; + } + + if (!isPF(func_no)) + { + vf_bar_off = PCIE_VF_BARS_OFF; + } + + bar_to_atu_index = (u32)barno + vf_bar_off; + if (bar_to_atu_index < (PCI_STD_NUM_BARS * 2 + 1)) + { + atu_index = ep->bar_to_atu[func_no & PCIE_DPU_EP_GET_PF_NO][bar_to_atu_index]; + } + else + { + DH_LOG_ERR(MODULE_MPF, "error bar_to_atu index %d\r\n", bar_to_atu_index); + return; + } + + pcie_dpu_ep_reset_bar(ep, func_no, vfunc_no, barno, epf_bar->flags); + + pcie_zf_disable_atu(ep, atu_index, PCIE_DPU_REGION_INBOUND); + spin_lock(&ep->ib_window_lock); + clear_bit(atu_index, ep->ib_window_map); + spin_unlock(&ep->ib_window_lock); +} + +static int pcie_dpu_ep_map_addr(struct pci_epc *epc, u8 func_no, u8 vfunc_no, + phys_addr_t dpu_offset, u64 host_addr, size_t size) +{ + int ret = 0; + struct pcie_dpu_ep *ep = epc_get_drvdata(epc); + + DH_LOG_INFO(MODULE_MPF, "func_no = 0x%x, dpu_addr = 0x%llx, host_addr = 0x%llx\n", func_no, dpu_offset, host_addr); + ret = pcie_dpu_ep_outbound_atu(ep, func_no, vfunc_no, dpu_offset - zf_ep->mpf_paddr, host_addr, size); + if (ret) + { + DH_LOG_ERR(MODULE_MPF, "Failed to enable address\r\n"); + return ret; + } + + return 0; +} + +static void pcie_dpu_ep_unmap_addr(struct pci_epc *epc, u8 func_no, + u8 vfunc_no, phys_addr_t dpu_offset) +{ + int ret = 0; + u32 atu_index = 0; + struct pcie_dpu_ep *ep = epc_get_drvdata(epc); + + ret = pcie_zf_find_index(ep, dpu_offset - zf_ep->mpf_paddr, &atu_index); + if (ret < 0) + return; + + pcie_zf_disable_atu(ep, atu_index, PCIE_DPU_REGION_OUTBOUND); + clear_bit(atu_index, ep->ob_window_map); +} + +static int pcie_dpu_ep_set_msi(struct pci_epc *epc, u8 func_no, u8 vfunc_no, u8 interrupts) +{ + DH_LOG_ERR(MODULE_MPF, "error:pcie_dpu_ep can't set msi#\n"); + return -ESRCH; +} + +static int pcie_dpu_ep_get_msi(struct pci_epc *epc, u8 func_no, u8 vfunc_no) +{ + DH_LOG_ERR(MODULE_MPF, "error:pcie_dpu_ep can't get msi#\n"); + return -ESRCH; +} + +static int pcie_dpu_ep_set_msix(struct pci_epc *epc, u8 func_no, u8 vfunc_no, + u16 interrupts, enum pci_barno bir, u32 bar_offset) +{ + /* + * MSIX tables are fixed in BAR4 (mapped to PCIe IP), other configs + * will make MSIX unable to function. + */ + dev_warn(&epc->dev, "MSIX config is not supported by ZF epc\n"); + + return 0; +} + +int pcie_dpu_ep_get_msix(struct pci_epc *epc, u8 func_no, u8 vfunc_no) +{ + struct pcie_dpu_ep *dpu_dev = epc_get_drvdata(epc); + u32 val, reg; + u32 func_offset = 0; + struct pcie_dpu_ep_func *ep_func; + + ep_func = pcie_dpu_ep_get_func_from_ep(dpu_dev, func_no, vfunc_no); + if (!ep_func || !ep_func->msix_cap) + return -EINVAL; + + func_offset = pcie_dpu_ep_func_select(func_no, vfunc_no); + + reg = func_offset + ep_func->msix_cap + PCI_MSIX_FLAGS; + val = pcie_zf_readw_dbi(dpu_dev, reg); + if (!(val & PCI_MSIX_FLAGS_ENABLE)) + return -EINVAL; + + val &= PCI_MSIX_FLAGS_QSIZE; + + return val; +} + +int pcie_dpu_ep_raise_legacy_irq(struct pci_epc *epc, u8 func_no, u8 vfunc_no) +{ + DH_LOG_ERR(MODULE_MPF, "EP cannot trigger legacy IRQs\r\n"); + + return -EINVAL; +} + +int pcie_dpu_ep_raise_msi_irq(struct pci_epc *epc, u8 func_no, u8 vfunc_no, u8 interrupt_num) +{ + DH_LOG_ERR(MODULE_MPF, "EP cannot trigger msi IRQs\r\n"); + + return -EINVAL; +} + +int pcie_dpu_ep_raise_msix_irq(struct pci_epc *epc, u8 func_no, u8 vfunc_no, u8 interrupt_num) +{ + struct pcie_dpu_ep *dpu_dev = epc_get_drvdata(epc); + u32 msg_data = 0; + + // DH_LOG_INFO(MODULE_MPF, "func_no = 0x%x, vfunc_no = 0x%x, interrupt_num = 0x%x\n", func_no, vfunc_no, interrupt_num); + + if (isPF(func_no)) + { + msg_data = (func_no << PCIE_MSIX_DOORBELL_PF_SHIFT) | (interrupt_num); + } + else + { + msg_data = ((func_no & PCIE_DPU_EP_GET_PF_NO) << PCIE_MSIX_DOORBELL_PF_SHIFT) | + MSIX_DOORBELL_VF_ACTIVE | (vfunc_no << PCIE_MSIX_DOORBELL_VF_SHIFT) | + (interrupt_num); + } + + pcie_zf_writel_dbi(dpu_dev, PCIE_MSIX_DOORBELL, msg_data); + + return 0; +} + +static int pcie_dpu_ep_raise_irq(struct pci_epc *epc, u8 func_no, u8 vfunc_no, + enum pci_epc_irq_type type, u16 interrupt_num) +{ + switch (type) + { + case PCI_EPC_IRQ_LEGACY: + return pcie_dpu_ep_raise_legacy_irq(epc, func_no, vfunc_no); + case PCI_EPC_IRQ_MSI: + return pcie_dpu_ep_raise_msi_irq(epc, func_no, vfunc_no, interrupt_num - 1); + case PCI_EPC_IRQ_MSIX: + return pcie_dpu_ep_raise_msix_irq(epc, func_no, vfunc_no, interrupt_num - 1); + default: + DH_LOG_ERR(MODULE_MPF, "UNKNOWN IRQ type\r\n"); + } + return 0; +} + +static int pcie_dpu_ep_get_max_vfs(struct pci_epc *epc, u8 func_no) +{ + struct pcie_dpu_ep *dpu_dev = NULL; + u32 vf_total_num = 0; + + if (epc == NULL) + { + DH_LOG_ERR(MODULE_MPF, "epc is NULL!!!\n"); + return -EINVAL; + } + dpu_dev = epc_get_drvdata(epc); + vf_total_num = func_no & PCIE_DPU_EP_GET_PF_NO; + if (vf_total_num >= PCIE_DPU_PF_NUMS) + { + DH_LOG_ERR(MODULE_MPF, "error vf_total_num=%d\n", vf_total_num); + return -EINVAL; + } + + DH_LOG_INFO(MODULE_MPF, "get vf max_num:%d\n", dpu_dev->vf_total_num[vf_total_num]); + return dpu_dev->vf_total_num[vf_total_num]; +} + +static void pcie_dpu_ep_stop(struct pci_epc *epc) +{ + DH_LOG_INFO(MODULE_MPF, "%s\n", __func__); + return; +} + +static int pcie_dpu_ep_start(struct pci_epc *epc) +{ + DH_LOG_INFO(MODULE_MPF, "%s\n", __func__); + return 0; +} + +static const struct pci_epc_features pcie_zf_epc_features = { + .linkup_notifier = false, + .msi_capable = false, + .msix_capable = true, + .reserved_bar = PCIE_DPU_EP_REAERVED_BAR, + .bar_fixed_64bit = PCIE_DPU_EP_BAR_FIXED_64BIT, + .align = PCIE_DPU_EP_ALIGN, +}; + +static const struct pci_epc_features * +pcie_dpu_ep_get_features(struct pci_epc *epc, u8 func_no, u8 vfunc_no) +{ + return &pcie_zf_epc_features; +} + +static int pci_dpu_ep_get_port_id(struct pci_epc *epc, + enum pci_epc_port_id_type *id) +{ + struct pcie_dpu_ep *dpu_dev = epc_get_drvdata(epc); + + *id = dpu_dev->ep_id + 5; + return 0; +} + +static int pci_dpu_ep_calc_pfns(struct pci_epc *epc, phys_addr_t phys, + size_t n_pfns, unsigned long *pfn) +{ + enum pci_epc_port_id_type port = 0; + phys_addr_t offset = 0, base = zf_ep->mpf_paddr; + size_t i = 0; + + if (phys < base || + phys - base + (n_pfns << PAGE_SHIFT) > zf_ep->ob_size) + return -EINVAL; + + pci_dpu_ep_get_port_id(epc, &port); + + for (i = 0; i < n_pfns; i++) + { + offset = phys - base + (i << PAGE_SHIFT); + pfn[i] = (base + EP_DPU_PA(offset, port)) >> PAGE_SHIFT; + } + return 0; +} + +#endif + +static const struct pci_epc_ops epc_ops = { + .write_header = pcie_dpu_ep_write_header, + .set_bar = pcie_dpu_ep_set_bar, + .clear_bar = pcie_dpu_ep_clear_bar, + .map_addr = pcie_dpu_ep_map_addr, + .unmap_addr = pcie_dpu_ep_unmap_addr, + .set_msi = pcie_dpu_ep_set_msi, + .get_msi = pcie_dpu_ep_get_msi, + .set_msix = pcie_dpu_ep_set_msix, + .get_msix = pcie_dpu_ep_get_msix, + .raise_irq = pcie_dpu_ep_raise_irq, + .get_max_vfs = pcie_dpu_ep_get_max_vfs, + .start = pcie_dpu_ep_start, + .stop = pcie_dpu_ep_stop, + .get_features = pcie_dpu_ep_get_features, + .get_port_id = pci_dpu_ep_get_port_id, + .calc_pfns = pci_dpu_ep_calc_pfns, + .get_xdma_chan = zf_pcie_get_hdma_chan, +}; + +static void dpu_ep_default_set(int ep_id) +{ + u32 pf_idx = 0; + u32 func_offset = 0; + int sriov_cap_offset = 0; + u32 reg = 0; + struct pcie_dpu_ep *ep = zf_ep->dpu_ep_array[ep_id]; + + pcie_zf_dbi_ro_wr_en(ep); + for (pf_idx = 0; pf_idx < PCIE_DPU_PF_NUMS; ++pf_idx) + { + if (!(ep->permissible_pf_map & (0x1 << pf_idx))) + { + continue; + } + pcie_zf_writel_dbi(ep, pf_idx * PCIE_DPU_EP_FUNC_CFG_SIZE, PCIE_DPU_PF_INITIAL_ID); + pcie_zf_writel_dbi(ep, pf_idx * PCIE_DPU_EP_FUNC_CFG_SIZE + PCI_CLASS_REVISION, PCIE_DPU_PF_DEFAUTL_CLASSCODE); + pcie_zf_writel_dbi2(ep, pf_idx * PCIE_DPU_EP_FUNC_CFG_SIZE + PCI_ROM_ADDRESS, ZF_DISABLE); + + pcie_zf_writel_dbi2(ep, pf_idx * PCIE_DPU_EP_FUNC_CFG_SIZE + PCI_BASE_ADDRESS_4, ZF_ENABLE); + pcie_zf_writel_dbi2(ep, pf_idx * PCIE_DPU_EP_FUNC_CFG_SIZE + PCI_BASE_ADDRESS_4, lower_32_bits(BAR4_DEFAULT_SIZE - 1)); + pcie_zf_writel_dbi2(ep, pf_idx * PCIE_DPU_EP_FUNC_CFG_SIZE + PCI_BASE_ADDRESS_4 + PCIE_NEXT_BAR_OFFSET, upper_32_bits(BAR4_DEFAULT_SIZE - 1)); + pcie_zf_writel_dbi(ep, pf_idx * PCIE_DPU_EP_FUNC_CFG_SIZE + PCI_BASE_ADDRESS_4, PCIE_DEFAULT_BAR_FLAG); + + func_offset = pcie_dpu_ep_func_select(pf_idx, 0); + sriov_cap_offset = pcie_dpu_ep_find_extcap(ep, func_offset, PCI_EXT_CAP_ID_SRIOV, 0); + if (sriov_cap_offset < 0) + { + DH_LOG_ERR(MODULE_MPF, "find_extcap failed!!\n"); + return; + } + + reg = func_offset + sriov_cap_offset; + pcie_dpu_ep_sriov_disable(ep, reg); + pcie_zf_writel_dbi(ep, reg + PCIE_SRIOV_ECAP_BAR4_OFFSET, PCIE_DEFAULT_BAR_FLAG); + pcie_zf_writel_dbi2(ep, reg + PCIE_SRIOV_ECAP_BAR4_OFFSET, 0x1); + pcie_zf_writel_dbi2(ep, reg + PCIE_SRIOV_ECAP_BAR4_OFFSET, lower_32_bits(BAR4_DEFAULT_SIZE - 1)); + pcie_zf_writel_dbi2(ep, reg + PCIE_SRIOV_ECAP_BAR4_OFFSET + PCIE_NEXT_BAR_OFFSET, upper_32_bits(BAR4_DEFAULT_SIZE - 1)); + pcie_dpu_ep_sriov_enable(ep, reg); + } + pcie_zf_dbi_ro_wr_dis(ep); +} + +static int dpu_ep_iatu_init(struct device *dev, int id) +{ + int iatu_no = 0; + + zf_ep->dpu_ep_array[id]->num_ib_windows = PCIE_DPU_IATU_NUM; + zf_ep->dpu_ep_array[id]->num_ob_windows = PCIE_DPU_IATU_NUM; + zf_ep->dpu_ep_array[id]->ib_window_map = devm_kcalloc(dev, BITS_TO_LONGS(zf_ep->dpu_ep_array[id]->num_ib_windows), + sizeof(long), GFP_KERNEL); + if (!zf_ep->dpu_ep_array[id]->ib_window_map) + { + DH_LOG_ERR(MODULE_MPF, "get ib_map err\n"); + return -ENOMEM; + } + + zf_ep->dpu_ep_array[id]->ob_window_map = devm_kcalloc(dev, BITS_TO_LONGS(zf_ep->dpu_ep_array[id]->num_ob_windows), + sizeof(long), GFP_KERNEL); + if (!zf_ep->dpu_ep_array[id]->ob_window_map) + { + DH_LOG_ERR(MODULE_MPF, "get ob_map err\n"); + goto free_ib_map; + } + + zf_ep->dpu_ep_array[id]->ob_src_addr = devm_kcalloc(dev, zf_ep->dpu_ep_array[id]->num_ob_windows, sizeof(phys_addr_t), + GFP_KERNEL); + if (!zf_ep->dpu_ep_array[id]->ob_src_addr) + { + DH_LOG_ERR(MODULE_MPF, "get ob_src_addr err\n"); + goto free_ob_map; + } + + // 确定哪些inbound已经被使用 + for (iatu_no = 0; iatu_no < PCIE_DPU_IATU_NUM; iatu_no++) + { + if (zf_atu_is_used(zf_ep->dpu_ep_array[id], iatu_no)) + { + set_bit(iatu_no, zf_ep->dpu_ep_array[id]->ib_window_map); + } + } + + spin_lock_init(&zf_ep->dpu_ep_array[id]->ib_window_lock); + + return 0; + +free_ob_map: + devm_kfree(dev, zf_ep->dpu_ep_array[id]->ob_window_map); +free_ib_map: + devm_kfree(dev, zf_ep->dpu_ep_array[id]->ib_window_map); + return -ENOMEM; +} + +static int dpu_ep_func_list_init(struct device *dev, int id) +{ + u8 func_no = 0, vfunc_no = 0; + u8 vf_total_num = 0; + u32 func_offset = 0; + struct pcie_dpu_ep_func *ep_func = NULL; + + INIT_LIST_HEAD(&zf_ep->dpu_ep_array[id]->func_list); + for (func_no = 0; func_no < PCIE_DPU_PF_NUMS; ++func_no) + { + if (!(zf_ep->dpu_ep_array[id]->permissible_pf_map & (0x1 << func_no))) + { + continue; + } + ep_func = devm_kzalloc(dev, sizeof(*ep_func), GFP_KERNEL); + if (!ep_func) + { + return -ENOMEM; + } + + ep_func->func_no = func_no; + func_offset = pcie_dpu_ep_func_select(func_no, vfunc_no); + ep_func->msix_cap = pcie_dpu_ep_find_cap(zf_ep->dpu_ep_array[id], func_offset, PCI_CAP_ID_MSIX); + + list_add_tail(&ep_func->list, &zf_ep->dpu_ep_array[id]->func_list); + + vf_total_num = (u8)zf_ep->dpu_ep_array[id]->vf_total_num[func_no]; + for (vfunc_no = 0; vfunc_no < vf_total_num; ++vfunc_no) + { + ep_func = devm_kzalloc(dev, sizeof(*ep_func), GFP_KERNEL); + if (!ep_func) + { + return -ENOMEM; + } + + ep_func->func_no = PCIE_DPU_EP_FUNC_IS_VF | func_no; + ep_func->vfunc_no = vfunc_no; + func_offset = pcie_dpu_ep_func_select(ep_func->func_no, vfunc_no); + ep_func->msix_cap = pcie_dpu_ep_find_cap(zf_ep->dpu_ep_array[id], + func_offset, PCI_CAP_ID_MSIX); + + list_add_tail(&ep_func->list, &zf_ep->dpu_ep_array[id]->func_list); + } + } + + return 0; +} + +static int dpu_ep_vf_total_num_get(int id) +{ + int func_no = 0, func_offset = 0, sriov_cap_offset = 0, vf_total_num_addr = 0; + + for (func_no = 0; func_no < PCIE_DPU_PF_NUMS; ++func_no) + { + func_offset = pcie_dpu_ep_func_select(func_no, 0); + sriov_cap_offset = pcie_dpu_ep_find_extcap(zf_ep->dpu_ep_array[id], func_offset, PCI_EXT_CAP_ID_SRIOV, 0); + if (sriov_cap_offset < 0) + { + DH_LOG_ERR(MODULE_MPF, "find_extcap failed!!\n"); + return -ENXIO; + } + vf_total_num_addr = func_offset + sriov_cap_offset + PCIE_SRIOV_TOTAL_VFS; + zf_ep->dpu_ep_array[id]->vf_total_num[func_no] = pcie_zf_readw_dbi(zf_ep->dpu_ep_array[id], vf_total_num_addr); + } + + return 0; +} + +static int dpu_ep_get_permissible_pf(int id) +{ + int func_no = 0, func_offset = 0; + u32 func_id = 0; + + for (func_no = 0; func_no < PCIE_DPU_PF_NUMS; ++func_no) + { + func_offset = pcie_dpu_ep_func_select(func_no, 0); + func_id = pcie_zf_readl_dbi(zf_ep->dpu_ep_array[id], func_offset); + if (PCIE_DPU_PF_DEFAUTL_ID1 == func_id || PCIE_DPU_PF_DEFAUTL_ID2 == func_id || + PCIE_DPU_PF_DEFAUTL_ID3 == func_id || PCIE_DPU_PF_DEFAUTL_ID4 == func_id) + { + zf_ep->dpu_ep_array[id]->permissible_pf_map |= (0x1 << func_no); + } + } + + return 0; +} + +static void epc_dev_release(struct device *dev) +{ +} + +static int pci_zte_epc_dev_init_one(struct pci_dev *pdev, int id) +{ + struct pci_epc *epc = NULL; + struct device *dev = NULL; + struct device_node *np = NULL; + struct platform_device *zf_pdev = NULL; + struct platform_device *zf_pdev_dma = NULL; + char class_name[PCIE_DPU_EP_CLASS_NAME] = {0}; + int node = 0, i = 0; + int ret = -ENOMEM; + + snprintf(class_name, sizeof(class_name) - 1,"zf_epc_class%d", id); + zf_pdev = platform_device_register_simple(class_name, -1, NULL, 0); + if (!zf_pdev) + { + DH_LOG_ERR(MODULE_MPF, "Error platform_device_register zf_pdev failed\n"); + return ret; + } + + snprintf(class_name, sizeof(class_name) - 1,"zf_epc_dma_rd%d", id); + zf_pdev_dma = platform_device_register_simple(class_name, -1, NULL, 0); + if (!zf_pdev_dma) + { + DH_LOG_ERR(MODULE_MPF, "Error platform_device_register zf_pdev_dma failed\n"); + return ret; + } + + zf_pdev->dev.driver = pdev->dev.driver; + zf_pdev_dma->dev.driver = pdev->dev.driver; + + dev = &zf_pdev->dev; + np = dev->of_node; + epc = pci_epc_create(dev, &epc_ops); + if (IS_ERR_OR_NULL(epc)) + { + DH_LOG_ERR(MODULE_MPF, "Failed %ld to create epc device\n", PTR_ERR(epc)); + ret = -EPERM; + goto free_pdev; + } + + epc->dev.release = epc_dev_release; + epc->max_functions = PCIE_DPU_PF_NUMS; + epc->is_dpu_epc = 1; + + ret = pci_epc_mem_init(epc, zf_ep->mpf_paddr, zf_ep->ob_size, PAGE_SIZE); + if (ret < 0) + { + DH_LOG_ERR(MODULE_MPF, "ep%d failed to initialize the memory space\n", id); + goto free_epc; + } + + node = dev_to_node(dev); // 多核 + if (node == NUMA_NO_NODE) + set_dev_node(dev, first_memory_node); + + /*##################zf_dev init##################*/ + zf_ep->dpu_ep_array[id] = kzalloc_node(sizeof(struct pcie_dpu_ep), GFP_KERNEL, node); + if (!zf_ep->dpu_ep_array[id]) + { + DH_LOG_ERR(MODULE_MPF, "Error kzalloc node\n"); + ret = -ENOMEM; + goto free_epc_mem; + } + + zf_ep->dpu_ep_array[id]->ep_id = id; + zf_ep->dpu_ep_array[id]->epc = epc; + zf_ep->dpu_ep_array[id]->dbi_base = zf_ep->dbi_vaddr + PCIE_DPU_EP_DBI_SIZE * id; + zf_ep->dpu_ep_array[id]->atu_base = zf_ep->dpu_ep_array[id]->dbi_base + DEFAULT_DBI_ATU_OFFSET; + zf_ep->dpu_ep_array[id]->zf_pdev = zf_pdev; + zf_ep->dpu_ep_array[id]->zf_pdev_dma = zf_pdev_dma; + + dpu_ep_default_set(id); + + epc_set_drvdata(epc, zf_ep->dpu_ep_array[id]); + + dpu_ep_get_permissible_pf(id); + for (i = 0; i < PCIE_DPU_PF_NUMS; i++) + { + if (!(zf_ep->dpu_ep_array[id]->permissible_pf_map & (0x1 << i))) + { + DH_LOG_INFO(MODULE_MPF, "ep%d pf%d can't uesd\n", id, i); + set_bit(i, &epc->function_num_map); + } + } + + ret |= dpu_ep_iatu_init(&pdev->dev, id); + ret |= dpu_ep_vf_total_num_get(id); + ret |= dpu_ep_func_list_init(&pdev->dev, id); + + if (ret) + goto free_dpu_ep; + + return 0; + +free_dpu_ep: + kfree(zf_ep->dpu_ep_array[id]); +free_epc_mem: + pci_epc_mem_exit(epc); +free_epc: + pci_epc_destroy(epc); +free_pdev: + platform_device_unregister(zf_pdev); + platform_device_unregister(zf_pdev_dma); + return ret; +} + +static void pci_zte_epc_dev_free_one(struct pci_dev *pdev, int id) +{ + pcie_zf_dma_free(zf_ep->dpu_ep_array[id], pdev); + pci_epc_destroy(zf_ep->dpu_ep_array[id]->epc); + zf_ep->dpu_ep_array[id]->zf_pdev->dev.driver = NULL; + zf_ep->dpu_ep_array[id]->zf_pdev_dma->dev.driver = NULL; + platform_device_unregister(zf_ep->dpu_ep_array[id]->zf_pdev); + platform_device_unregister(zf_ep->dpu_ep_array[id]->zf_pdev_dma); + kfree(zf_ep->dpu_ep_array[id]); +} + +static int zf_dev_map(struct pci_dev *pdev) +{ + zf_ep->dbi_vaddr = ioremap(zf_ep->dbi_paddr, PCIE_DPU_EP_DBI_SIZE * PCIE_DPU_EP_NUM); + if (!zf_ep->dbi_vaddr) + { + pci_release_mem_regions(pdev); + return -ENODEV; + } + + zf_ep->mpf_vaddr = ioremap(zf_ep->mpf_paddr, pci_resource_len(pdev, BAR_0)); + if (!zf_ep->mpf_vaddr) + { + iounmap(zf_ep->dbi_vaddr); + pci_release_mem_regions(pdev); + return -ENODEV; + } + + return 0; +} + +static void zf_dev_unmap(struct pci_dev *pdev) +{ + if (zf_ep->dbi_vaddr) + iounmap(zf_ep->dbi_vaddr); + if (zf_ep->mpf_vaddr) + iounmap(zf_ep->mpf_vaddr); + pci_release_mem_regions(pdev); +} + +static int pci_zte_epc_dev_init(struct pci_dev *pdev, int num) +{ + int i = 0, j = 0, ret = 0; + + for (i = 0; i < num; i++) + { + ret = pci_zte_epc_dev_init_one(pdev, i); + if (zf_ep->dpu_ep_array[i] == NULL) + { + DH_LOG_ERR(MODULE_MPF, "pci_zte_epc_dev_init_one failed\n"); + for (j = 0; j < i; j++) + { + pci_zte_epc_dev_free_one(pdev, j); + } + return -ENODEV; + } + DH_LOG_INFO(MODULE_MPF, "pci_zte_epc_dev_init_ep%d success!\n", i); + + ret = pcie_zf_dma_init(zf_ep->dpu_ep_array[i], pdev); + if (ret) + { + DH_LOG_ERR(MODULE_MPF, "pcie_zf_dma_init failed\n"); + return ret; + } + } + + return ret; +} + +int pcie_zte_zf_epc_init(struct dh_core_dev *dh_dev, const struct pci_device_id *id) +{ + int ret = -ENXIO; + u32 val = 0; + + dh_dev->zf_ep = (struct pcie_zf_ep *)kzalloc(sizeof(struct pcie_zf_ep), GFP_KERNEL); + if (!dh_dev->zf_ep) + { + DH_LOG_ERR(MODULE_MPF, "kzalloc zf_ep err\n"); + return -ENODEV; + } + zf_ep = dh_dev->zf_ep; + + dh_dev->zf_ep->dpu_ep_array = kzalloc(PCIE_DPU_EP_NUM * sizeof(struct pcie_dpu_ep *), GFP_KERNEL); + if (!dh_dev->zf_ep->dpu_ep_array) + { + DH_LOG_ERR(MODULE_MPF, "kzalloc dpu_ep_array err\n"); + ret = -ENODEV; + goto free_zf_ep; + } + + dh_dev->zf_ep->dbi_paddr = pci_resource_start(dh_dev->pdev, BAR_2); + dh_dev->zf_ep->mpf_paddr = pci_resource_start(dh_dev->pdev, BAR_0); + dh_dev->zf_ep->ob_size = pci_resource_len(dh_dev->pdev, BAR_0) >> EP_ID_LEN; + dh_dev->zf_ep->dpu_ep_num = PCIE_DPU_EP_NUM; + ret = zf_dev_map(dh_dev->pdev); + if (ret) + { + DH_LOG_ERR(MODULE_MPF, "zf_dev_map err\n"); + goto free_dpu_ep_array; + } + + pcie_zf_read(dh_dev->zf_ep->dbi_vaddr, 4, &val); + if (val == 0x0 || val == 0xffffffff) + { + DH_LOG_ERR(MODULE_MPF, "the dbi_addr is err!\n"); + ret = -EINVAL; + goto free_dpu_ep_array; + } + + ret = pci_zte_epc_dev_init(dh_dev->pdev, PCIE_DPU_EP_NUM); + if (ret) + { + goto unmap; + } + + DH_LOG_INFO(MODULE_MPF, "INFO:the EP0~3 pci_dev created successed!\n"); + return ret; + +unmap: + zf_dev_unmap(dh_dev->pdev); +free_dpu_ep_array: + kfree(dh_dev->zf_ep->dpu_ep_array); +free_zf_ep: + kfree(dh_dev->zf_ep); + return ret; +} + +void pcie_zte_zf_epc_free(struct dh_core_dev *dh_dev) +{ + int ep_id = 0; + + DH_LOG_INFO(MODULE_MPF, "INFO===>TODO:removed can't finish!\n"); + + zf_dev_unmap(dh_dev->pdev); + for (ep_id = 0; ep_id < PCIE_DPU_EP_NUM; ep_id++) + { + pci_zte_epc_dev_free_one(dh_dev->pdev, ep_id); + } + kfree(dh_dev->zf_ep->dpu_ep_array); + kfree(dh_dev->zf_ep); + DH_LOG_INFO(MODULE_MPF, "the EP0~3 pci_dev removed successed!\n"); +} diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/pcie-zte-zf-epc.h b/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/pcie-zte-zf-epc.h new file mode 100644 index 0000000..c275c1b --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/pcie-zte-zf-epc.h @@ -0,0 +1,244 @@ +#ifndef __PCIE_ZTE_ZF_EPC_H +#define __PCIE_ZTE_ZF_EPC_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _cplusplus +extern "C" { +#endif + +#define ZF_DISABLE 0x0 +#define ZF_ENABLE 0x1 + +// ZF INFO +#define PCI_VENDOR_ID_ZTE 0x1cf2 +#define PCIE_DPU_EP_CLASS_NAME 32 + +#define PCIE_DPU_EP_NUM 4 +#define EP_ID_LEN 4 +#define PCIE_DPU_PF_NUMS 8 +#define PCIE_DPU_IATU_NUM 41 +#define PCIE_VF_BARS_OFF 7 +#define PCIE_BAR0_ADDR_SET(off) (((off) & 0xFFFF) | (((off) & 0xFFFFFFFFFFFF0000) << EP_ID_LEN)) + +#define PCIE_DPU_PF_INITIAL_ID 0x000016c3 +#define PCIE_DPU_PF_DEFAUTL_ID1 0x10011af4 +#define PCIE_DPU_PF_DEFAUTL_ID2 0x80531cf2 +#define PCIE_DPU_PF_DEFAUTL_ID3 0x000016c3 +#define PCIE_DPU_PF_DEFAUTL_ID4 0x80331cf2 +#define PCIE_DPU_PF_DEFAUTL_CLASSCODE 0x02000000 + +// dpu func_no&addr set +#define PCIE_DPU_EP_FUNC_IS_VF BIT(7) +#define PCIE_DPU_EP_GET_PF_NO 0x7f +#define DBI_VF_CFG_OFFSET_BIT 4 +#define VF_ACT_BIT BIT(3) +#define isPF(func_no) ((func_no & PCIE_DPU_EP_FUNC_IS_VF) ? 0 : 1) + +#define ZF_PREFIX_ADDR 0x9000000000000000 +#define DEFAULT_DBI_ATU_OFFSET 0x6000000 +#define PCIE_DPU_EP_DBI_SIZE 0x8000000 +#define PCIE_DPU_EP_OUTBOUND_SIZE 0x40000000 +#define PCIE_DPU_EP_DBI2_OFFSET 0x2000000 +#define PCIE_DPU_MPF_CSR_OFFSET 0x14000 +#define PCIE_DPU_MPF_CSR_ADDR(offset) PCIE_BAR0_ADDR_SET(PCIE_DPU_MPF_CSR_OFFSET + offset) +#define PCIE_DPU_EP_FUNC_CFG_SIZE 0X1000 +#define PCIE_DPU_EP_CSR_SIZE 0x2000 +#define PCIE_DPU_EP_CSR_PRST_ADDR 0x448 +#define PCIE_DPU_EP_CSR_VIRT_ADDR 0x1200 +#define BAR4_DEFAULT_SIZE 0x10000 + +// epc features +#define PCIE_DPU_EP_REAERVED_BAR 0x30 +#define PCIE_DPU_EP_BAR_FIXED_64BIT 0x15 +#define PCIE_DPU_EP_ALIGN 0x1000 + +#define EP_ID_SHIFT 16 +#define EP_ADDR_MASK ((1 << EP_ID_SHIFT) - 1) +#define EP_DPU_PA(addr, ep_id) \ + ((addr & ~EP_ADDR_MASK) << EP_ID_LEN | (addr & EP_ADDR_MASK) | \ + ep_id << EP_ID_SHIFT) + +// PCIE Register +#if 1 +#define LINK_WAIT_MAX_RETRIES 10 +#define LINK_WAIT_USLEEP_MIN 90000 +#define LINK_WAIT_USLEEP_MAX 100000 +#define LINK_WAIT_MAX_IATU_RETRIES 0x10 +#define LINK_WAIT_IATU 10 + +// PCIE_PORT_DEBUG1 cap +#define PCIE_PORT_DEBUG1 0x72C +#define PCIE_PORT_DEBUG1_ZTE_ZF_LINK_UP BIT(4) +#define PCIE_PORT_DEBUG1_LINK_IN_TRAINING BIT(29) + +// PCIE CAP +#define PCIE_ECAP_POINTER_OFF 0x100 +#define PCIE_ECAP_VSEC_ID 0x0B + +#define PCIE_NEXT_BAR_OFFSET 0x4 +#define PCIE_DEFAULT_BAR_FLAG (BIT(3) | BIT(2)) +#define PCIE_SRIOV_ECAP_DEVICE_ID 0x1a +#define PCIE_SRIOV_ECAP_BAR0_OFFSET 0x24 +#define PCIE_SRIOV_ECAP_BAR4_OFFSET 0x34 +#define PCIE_SRIOV_CTRL 0x08 +#define PCIE_SRIOV_TOTAL_VFS 0x0e +#define PCIE_SRIOV_CTRL_VFE 0x01 + +#define PCIE_MSI_ADDR_LO 0x820 +#define PCIE_MSI_ADDR_HI 0x824 +#define PCIE_MSI_INTR0_ENABLE 0x828 +#define PCIE_MSI_INTR0_MASK 0x82C +#define PCIE_MSI_INTR0_STATUS 0x830 + +#define PCIE_PORT_MULTI_LANE_CTRL 0x8C0 +#define PORT_MLTI_UPCFG_SUPPORT BIT(7) + +/* ATU register*/ +#define PCIE_ATU_CR1 0x904 +#define PCIE_ATU_TYPE_MEM 0x0 +#define PCIE_ATU_TYPE_IO 0x2 +#define PCIE_ATU_FUNC_NUM(pf) ((pf) << 20) +#define PCIE_ATU_FUNC_NUM_MASK 0xF00000 +#define PCIE_ATU_BAR_NUM_MASK 0x700 +#define PCIE_ATU_ENABLE BIT(31) +#define PCIE_ATU_BAR_MODE_ENABLE BIT(30) +#define PCIE_ATU_CFG_SHIFT_MODE BIT(28) +#define PCIE_ATU_DMA_BYPSS BIT(27) +#define PCIE_ATU_FUNC_NUM_MATCH_EN BIT(19) +#define PCIE_ATU_VFBAR_MATCH_MODE_ENABLE BIT(26) +#define PCIE_ATU_VF_MATCH_ENABLE BIT(20) +#define PCIE_ATU_OB_VF_ACTIVE BIT(31) + +/*MSIX register*/ +#define MSIX_ADDRESS_MATCH_LOW_OFF 0x940 +#define MSI_ADDRESS_MATCH_EN BIT(0) +#define MSIX_ADDRESS_MATCH_HIGH_OFF 0x944 +#define MSIX_DOORBELL_OFF 0x948 +#define MSIX_DOORBELL_PF 24 +#define MSIX_DOORBELL_PF_MASK 0x1F +#define MSIX_DOORBELL_VF 16 +#define MSIX_DOORBELL_VF_MASK 0xFF +#define MSIX_DOORBELL_VF_ACTIVE BIT(15) +#define MSIX_DOORBELL_VECTOR 0 +#define MSIX_DOORBELL_VECTOR_MASK 0x7FF + +#define LINK_WAIT_DMA 20 + +#define PCIE_MISC_CONTROL_1_OFF 0x8BC +#define PCIE_DBI_RO_WR_EN BIT(0) + +#define PCIE_MSIX_DOORBELL 0x948 +#define PCIE_MSIX_DOORBELL_PF_SHIFT 24 +#define PCIE_MSIX_DOORBELL_VF_SHIFT 16 +#define MSIX_DOORBELL_VF_ACTIVE BIT(15) + +/* Register address builder */ +#define PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(region) ((region) << 9) +#define PCIE_GET_ATU_INB_UNR_REG_OFFSET(region) (((region) << 9) | BIT(8)) + +#define PCIE_ATU_UNR_REGION_CTRL1 0x00 +#define PCIE_ATU_UNR_REGION_CTRL2 0x04 +#define PCIE_ATU_UNR_LOWER_BASE 0x08 +#define PCIE_ATU_UNR_UPPER_BASE 0x0C +#define PCIE_ATU_UNR_LOWER_LIMIT 0x10 +#define PCIE_ATU_UNR_LOWER_TARGET 0x14 +#define PCIE_ATU_UNR_UPPER_TARGET 0x18 +#define PCIE_ATU_UNR_REGION_CTRL3 0x1c +#define PCIE_ATU_UNR_UPPER_LIMIT 0x20 +#define PCIE_ATU_INCREASE_REGION_SIZE BIT(13) + +#endif + +enum pcie_dpu_func_type { + PCIE_FUNC_TYPE_PF = 0, + PCIE_FUNC_TYPE_VF, + PCIE_FUNC_TYPE_NUM +}; + +enum pcie_dpu_as_type { + PCIE_DPU_AS_UNKNOWN, + PCIE_DPU_AS_MEM, + PCIE_DPU_AS_IO, +}; + +enum pcie_dpu_region_type { + PCIE_DPU_REGION_UNKNOWN, + PCIE_DPU_REGION_INBOUND, + PCIE_DPU_REGION_OUTBOUND, +}; + +struct pcie_dpu_ep_func { + struct list_head list; + u8 func_no; + u8 vfunc_no; + u8 msi_cap; /* MSI capability offset */ + u8 msix_cap; /* MSI-X capability offset */ +}; + +struct pcie_dpu_ep { + int ep_id; + int permissible_pf_map; + struct pci_epc *epc; + struct platform_device *zf_pdev; + struct platform_device *zf_pdev_dma; + struct dma_device *wr_dd; + struct dma_device *rd_dd; + + void __iomem *dbi_base; + void __iomem *atu_base; + + struct list_head func_list; + int bar_to_atu[PCIE_DPU_PF_NUMS][(PCI_STD_NUM_BARS * 2) + 1]; + int vf_total_num[PCIE_DPU_PF_NUMS]; + phys_addr_t *ob_src_addr; + unsigned long *ib_window_map; + unsigned long *ob_window_map; + spinlock_t ib_window_lock; + u32 num_ib_windows; + u32 num_ob_windows; +}; + +struct pcie_zf_ep { + unsigned long dbi_paddr; + unsigned long mpf_paddr; + unsigned long ob_size; + void __iomem *dbi_vaddr; + void __iomem *mpf_vaddr; + int dpu_ep_num; + struct pcie_dpu_ep **dpu_ep_array; + struct device_driver *dma_driver; +}; + +int pcie_zte_zf_epc_init(struct dh_core_dev *dh_dev, const struct pci_device_id *id); +int pcie_zf_dma_init(struct pcie_dpu_ep *dpu_dev, struct pci_dev *pdev); +void pcie_zte_zf_epc_free(struct dh_core_dev *dh_dev); +void pcie_zf_dma_free(struct pcie_dpu_ep *dpu_dev, struct pci_dev *pdev); +int zf_pcie_get_hdma_chan(struct pci_epc *epc, u8 func_no, u8 vfunc_no, struct dma_chan **rchan, struct dma_chan **wchan); +u32 cfg_phy_rmw(u64 phy_addr, u32 value, u32 mask); +int pcie_zte_epc_ob_read(struct pci_epc *epc, phys_addr_t phys_addr, unsigned int size, unsigned int *val); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/pcie-zte-zf-hdma.c b/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/pcie-zte-zf-hdma.c new file mode 100644 index 0000000..6ed82dd --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/pcie-zte-zf-hdma.c @@ -0,0 +1,748 @@ +#include "pcie-zte-zf-hdma.h" + +static struct task_struct *callback_thread[PCIE_DPU_EP_NUM]; + +static int __attribute__((unused)) cfg_phy_write(u32 value, u64 PhyAddr) +{ + void __iomem *virt_addr = NULL; + u64 tmp_addr = 0; + u64 offset = 0; + u64 size = 0; + + offset = PhyAddr % 0x1000; + if (PhyAddr < offset) + { + DH_LOG_ERR(MODULE_MPF, "data overflow! PhyAddr=0x%llx, offset=0x%llx\n", PhyAddr, offset); + return PCIBIOS_BAD_REGISTER_NUMBER; + } + else + { + tmp_addr = PhyAddr - offset; + } + + if (offset <= (0x1000 - 4)) + { + size = 0x1000; + } + else + { + size = 2 * 0x1000; + } + + virt_addr = ioremap(tmp_addr, size); + if (NULL == virt_addr) + { + DH_LOG_ERR(MODULE_MPF, "cfg_write ioremap failed!\n"); + return PCIBIOS_BAD_REGISTER_NUMBER; + } + + writel(value, (virt_addr + offset)); + + iounmap(virt_addr); + return 0; +} + +static inline struct zf_hdma_chan *to_zf_hdma_chan(struct dma_chan *chan) +{ + return container_of(chan, struct zf_hdma_chan, zxdh_vc.chan); +} + +static u64 zte_pcie_dma_atu_addr_remapping(u64 addr_input) +{ + u64 addr_output = 0; + // DMA and ATU地址重映射,将地址的bit12~18左移4位,设置bit15 = 0 + addr_output = (((addr_input & (0x7F << 12)) << 4) | (addr_input & 0xFFF)) & (~(1UL << 15)); + + return addr_output; +} + +static inline void read_ch(struct zf_hdma_chan *zf_chan, u32 is_read, int offset, u32 *val) +{ + u64 register_offet = 0; + + void __iomem *addr = zf_chan->base_addr; + + register_offet = zte_pcie_dma_atu_addr_remapping(((u64)zf_chan->id * (u64)ZF_HDMA_PER_CHANNEL_SIZE)) + ((u64)is_read * (u64)ZF_HDMA_RDCH_OFFSET); + *val = readl(addr + register_offet + offset); +} + +static inline void write_ch(struct zf_hdma_chan *zf_chan, u32 is_read, int offset, u32 val) +{ + u64 register_off = 0; + void __iomem *addr = zf_chan->base_addr; + + register_off = zte_pcie_dma_atu_addr_remapping(((u64)zf_chan->id * (u64)ZF_HDMA_PER_CHANNEL_SIZE)) + ((u64)is_read * (u64)ZF_HDMA_RDCH_OFFSET); + writel(val, addr + register_off + offset); +} + +static inline void rmw_ch(struct zf_hdma_chan *zf_chan, u32 is_read, int offset, u32 val, u32 mask) +{ + u32 reg_val = 0; + + read_ch(zf_chan, is_read, offset, ®_val); + reg_val &= (~mask); + reg_val |= (val & mask); + write_ch(zf_chan, is_read, offset, reg_val); +} + +static int zf_hdma_alloc_chan_resources(struct dma_chan *chan) +{ + u32 is_read = 0; + // struct zf_hdma_chan *zf_chan = to_zf_hdma_chan(chan); + + if (chan->device->directions == BIT(DMA_MEM_TO_DEV)) + { + is_read = HDMA_RD; + } + else if (chan->device->directions == BIT(DMA_DEV_TO_MEM)) + { + is_read = HDMA_WR; + } + else + { + DH_LOG_ERR(MODULE_MPF, "err direct\n"); + return -EINVAL; + } + + /* 开启dma通道中断 */ + // rmw_ch(zf_chan, is_read, HDMA_INT_SETUP_OFF, 0x0 << HDMA_INT_MASK_BIT, HDMA_INT_MASK << HDMA_INT_MASK_BIT); + // rmw_ch(zf_chan, is_read, HDMA_INT_SETUP_OFF, 0x1 << HDMA_LSIE_BIT, HDMA_LSIE_MASK << HDMA_LSIE_BIT); + + return 0; +} + +static void zf_hdma_free_chan_resources(struct dma_chan *chan) +{ + u32 is_read = 0; + // struct zf_hdma_chan *zf_chan = to_zf_hdma_chan(chan); + + if (chan->device->directions == BIT(DMA_MEM_TO_DEV)) + { + is_read = HDMA_RD; + } + else if (chan->device->directions == BIT(DMA_DEV_TO_MEM)) + { + is_read = HDMA_WR; + } + else + { + DH_LOG_ERR(MODULE_MPF, "err direct\n"); + return; + } + + /* 释放dma通道中断 */ + // rmw_ch(zf_chan, is_read, HDMA_INT_SETUP_OFF, 0x7 << HDMA_INT_MASK_BIT, HDMA_INT_MASK << HDMA_INT_MASK_BIT); + // rmw_ch(zf_chan, is_read, HDMA_INT_SETUP_OFF, 0x0 << HDMA_LSIE_BIT, HDMA_LSIE_MASK << HDMA_LSIE_BIT); +} + +static int zf_hdma_device_config(struct dma_chan *chan, struct dma_slave_config *config) +{ + // struct zf_hdma_chan *zf_chan = to_zf_hdma_chan(chan); + // u32 is_read = HDMA_WR; + + return 0; +} + +static struct dma_async_tx_descriptor *zf_hdma_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src, size_t len, unsigned long flags) +{ + u32 is_read = HDMA_WR; + struct zf_hdma_sqe *sqe = NULL, *tem_sqe = NULL; + struct zf_hdma_tx *tx = NULL, *tem_tx = NULL; + struct dma_async_tx_descriptor *tx_desc = NULL; + struct zf_hdma_chan *zf_chan = to_zf_hdma_chan(chan); + int tx_num = 0; + + DH_LOG_DEBUG(MODULE_MPF, "enter\n"); + if (chan->device->directions == BIT(DMA_MEM_TO_DEV)) + { + is_read = HDMA_RD; + dest |= ZF_PREFIX_ADDR; + } + else if (chan->device->directions == BIT(DMA_DEV_TO_MEM)) + { + is_read = HDMA_WR; + src |= ZF_PREFIX_ADDR; + } + else + { + DH_LOG_ERR(MODULE_MPF, "err direct\n"); + return NULL; + } + + tem_sqe = zf_chan->sqe_list; + sqe = devm_kzalloc(&zf_chan->ep_pdev->dev, sizeof(struct zf_hdma_sqe), GFP_KERNEL); + if (!sqe) + { + DH_LOG_ERR(MODULE_MPF, "err alloc sqe\n"); + return NULL; + } + sqe->length = len; + sqe->src_addr = src; + sqe->dst_addr = dest; + + while (NULL != tem_sqe->next) + { + tem_sqe = tem_sqe->next; + } + tem_sqe->next = sqe; + + tx_desc = zxdh_vchan_tx_prep(&zf_chan->zxdh_vc, &zf_chan->zxdh_vd, flags); + tem_tx = zf_chan->tx_list; + tx = devm_kzalloc(&zf_chan->ep_pdev->dev, sizeof(struct zf_hdma_tx), GFP_KERNEL); + if (!tx) + { + DH_LOG_ERR(MODULE_MPF, "err alloc tx\n"); + devm_kfree(&zf_chan->ep_pdev->dev, sqe); + return NULL; + } + tx->tx_desc = tx_desc; + + while (NULL != tem_tx->next) + { + tem_tx = tem_tx->next; + tx_num++; + } + tx->tx_id = tx_num; + tem_tx->next = tx; + + return tx_desc; +} + +static int zf_hdma_terminate_all(struct dma_chan *chan) +{ + u32 is_read = HDMA_WR; + struct zf_hdma_chan *zf_chan = to_zf_hdma_chan(chan); + + if (chan->device->directions == BIT(DMA_MEM_TO_DEV)) + { + is_read = HDMA_RD; + } + + write_ch(zf_chan, is_read, HDMA_DOORBELL_OFF, HDMA_DOORBELL_STOP); + + return 0; +} + +static enum dma_status zf_hdma_tx_status(struct dma_chan *chan, dma_cookie_t cookie, struct dma_tx_state *txstate) +{ + return 0; +} + +static struct dma_async_tx_descriptor *zf_hdma_device_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl, unsigned int len, enum dma_transfer_direction direction, unsigned long flags, void *context) +{ + struct zf_hdma_chan *zf_chan = to_zf_hdma_chan(chan); + u32 is_read = HDMA_WR; + + DH_LOG_INFO(MODULE_MPF, "enter\n"); + + if (chan->device->directions == BIT(DMA_MEM_TO_DEV)) + { + is_read = HDMA_RD; + } + else if (chan->device->directions == BIT(DMA_DEV_TO_MEM)) + { + is_read = HDMA_WR; + } + else + { + DH_LOG_ERR(MODULE_MPF, "err direct\n"); + return NULL; + } + + return zxdh_vchan_tx_prep(&zf_chan->zxdh_vc, &zf_chan->zxdh_vd, flags); +} + +static struct dma_async_tx_descriptor *zf_hdma_device_prep_dma_cyclic(struct dma_chan *chan, dma_addr_t paddr, size_t len, size_t count, enum dma_transfer_direction direction, unsigned long flags) +{ + struct zf_hdma_chan *zf_chan = to_zf_hdma_chan(chan); + + return zxdh_vchan_tx_prep(&zf_chan->zxdh_vc, &zf_chan->zxdh_vd, flags); +} + +static void free_used_sqe(struct zf_hdma_chan *zf_chan) +{ + struct zf_hdma_sqe *temp = NULL; + + temp = zf_chan->sqe_list->next; + zf_chan->sqe_list->next = zf_chan->sqe_list->next->next; + + devm_kfree(&zf_chan->ep_pdev->dev, temp); +} + +static void zf_hdma_register_set(struct zf_hdma_chan *zf_chan, u32 is_read, struct zf_hdma_sqe *sqe) +{ + /* DMA Engine enable */ + write_ch(zf_chan, is_read, HDMA_EN_OFF, HDMA_EN); + + /* DMA transfer Size */ + write_ch(zf_chan, is_read, HDMA_XFERSIZE_OFF, (u32)sqe->length); + + /* DMA SAR & DAR */ + write_ch(zf_chan, is_read, HDMA_SAR_LOW_OFF, (sqe->src_addr & 0xffffffff)); + write_ch(zf_chan, is_read, HDMA_SAR_HIGH_OFF, ((sqe->src_addr >> 32) & 0xffffffff)); + write_ch(zf_chan, is_read, HDMA_DAR_LOW_OFF, (sqe->dst_addr & 0xffffffff)); + write_ch(zf_chan, is_read, HDMA_DAR_HIGH_OFF, ((sqe->dst_addr >> 32) & 0xffffffff)); + + /* func_no */ + write_ch(zf_chan, is_read, HDMA_FUNC_NUM_OFF, ((zf_chan->func_no & PCIE_DPU_EP_GET_PF_NO) | (zf_chan->vfunc_no << HDMA_FUNC_NUM_OFF_VF) | (!isPF(zf_chan->func_no) << HDMA_FUNC_NUM_OFF_VF_ENABLE))); + + /* DMA Doorbell */ + write_ch(zf_chan, is_read, HDMA_DOORBELL_OFF, HDMA_DOORBELL_START); + return; +} + +static void zf_hdma_issue_pending(struct dma_chan *chan) +{ + // u32 is_read = HDMA_WR; + unsigned long flags = 0; + struct zf_hdma_chan *zf_chan = NULL; + struct zf_hdma_tx *tx_temp = NULL; + + zf_chan = to_zf_hdma_chan(chan); + + tx_temp = zf_chan->tx_list->next; + while (tx_temp->next != NULL) + { + tx_temp = tx_temp->next; + } + + tx_temp->callback = tx_temp->tx_desc->callback; + tx_temp->callback_param = tx_temp->tx_desc->callback_param; + + spin_lock_irqsave(&zf_chan->zxdh_vc.lock, flags); + zxdh_vchan_issue_pending(&zf_chan->zxdh_vc); + spin_unlock_irqrestore(&zf_chan->zxdh_vc.lock, flags); + + return; +} + +static void free_used_tx(struct zf_hdma_chan *zf_chan) +{ + struct zf_hdma_tx *temp = NULL; + + temp = zf_chan->tx_list->next; + zf_chan->tx_list->next = zf_chan->tx_list->next->next; + + devm_kfree(&zf_chan->ep_pdev->dev, temp); +} + +int zf_hdma_wr_handler(void *data) +{ + u32 chan_status, chan_int_status; + struct pcie_dpu_ep *dpu_dev = data; + struct dma_chan *chan = NULL; + struct zf_hdma_chan *zf_chan = NULL; + struct zf_hdma_tx *zf_tx_desc = NULL; + + list_for_each_entry(chan, &dpu_dev->wr_dd->channels, device_node) + { + zf_chan = to_zf_hdma_chan(chan); + if (!zf_chan->tx_list->next || !zf_chan->tx_list->next->tx_desc || !zf_chan->tx_list->next->callback) + { + DH_LOG_INFO(MODULE_MPF, "wr_zf_chan%d is not used!\n", zf_chan->id); + continue; + } + else + { + zf_tx_desc = zf_chan->tx_list->next; + } + read_ch(zf_chan, HDMA_WR, HDMA_STATUS_OFF, &chan_status); + read_ch(zf_chan, HDMA_WR, HDMA_INT_STATUS_OFF, &chan_int_status); + + // if (((chan_status & HDMA_STATUS_OFF_STATUS) & HDMA_STATUS_STOPPED) && (chan_int_status & HDMA_STOP_INT_STATUS)) + // { + spin_lock(&zf_chan->zxdh_vc.lock); + zf_tx_desc->callback(zf_tx_desc->callback_param); + free_used_tx(zf_chan); + zf_chan->is_busy = HDMA_CHAN_IDLE; + spin_unlock(&zf_chan->zxdh_vc.lock); + break; + // } + } + + return 0; +} + +int zf_hdma_rd_handler(void *data) +{ + u32 chan_status = 0, chan_int_status = 0; + struct pcie_dpu_ep *dpu_dev = data; + struct dma_chan *chan = NULL; + struct zf_hdma_chan *zf_chan = NULL; + struct zf_hdma_tx *zf_tx_desc = NULL; + + list_for_each_entry(chan, &dpu_dev->rd_dd->channels, device_node) + { + zf_chan = to_zf_hdma_chan(chan); + if (!zf_chan->tx_list->next || !zf_chan->tx_list->next->tx_desc || !zf_chan->tx_list->next->callback) + { + DH_LOG_INFO(MODULE_MPF, "rd_zf_chan%d is not used!\n", zf_chan->id); + continue; + } + else + { + zf_tx_desc = zf_chan->tx_list->next; + } + read_ch(zf_chan, HDMA_RD, HDMA_STATUS_OFF, &chan_status); + read_ch(zf_chan, HDMA_RD, HDMA_INT_STATUS_OFF, &chan_int_status); + + // if (((chan_status & HDMA_STATUS_OFF_STATUS) & HDMA_STATUS_STOPPED) && (chan_int_status & HDMA_STOP_INT_STATUS)) + // { + spin_lock(&zf_chan->zxdh_vc.lock); + zf_tx_desc->callback(zf_tx_desc->callback_param); + free_used_tx(zf_chan); + zf_chan->is_busy = HDMA_CHAN_IDLE; + spin_unlock(&zf_chan->zxdh_vc.lock); + break; + // } + } + + return 0; +} + +static void zf_hdma_desc_free(struct zxdh_virt_dma_desc *zxdh_vd) +{ + dma_descriptor_unmap(&zxdh_vd->tx); +} + +static bool zf_dma_filter_fn(struct dma_chan *chan, void *node) +{ + unsigned long dev_node = (unsigned long)dev_to_node(&chan->dev->device); + return (dev_node == (unsigned long)node); +} + +struct dma_chan *zte_get_chan_for_dma(struct pci_epc *epc, u32 is_read) +{ + int node = 0; + dma_cap_mask_t dma_mask; + struct dma_chan *chan = NULL; + struct pcie_dpu_ep *ep = NULL; + + if (IS_ERR_OR_NULL(epc)) + { + DH_LOG_ERR(MODULE_MPF, "not found epc\n"); + return NULL; + } + + ep = epc_get_drvdata(epc); + if (!ep) + { + DH_LOG_ERR(MODULE_MPF, " not found ep\n"); + return NULL; + } + + if (is_read) + { + node = dev_to_node(ep->rd_dd->dev); + } + else + { + node = dev_to_node(ep->wr_dd->dev); + } + + dma_cap_zero(dma_mask); + dma_cap_set(DMA_MEMCPY, dma_mask); + chan = dma_request_channel(dma_mask, zf_dma_filter_fn, (void *)(unsigned long)node); + + return chan; +} +EXPORT_SYMBOL_GPL(zte_get_chan_for_dma); + +void zte_zf_pcie_set_pfvf_no(struct dma_chan *chan, u8 func_no, u8 vfunc_no) +{ + struct zf_hdma_chan *zf_chan = to_zf_hdma_chan(chan); + + DH_LOG_INFO(MODULE_MPF, "func_no = 0x%x, vfunc_no = 0x%x\n",func_no, vfunc_no); + + zf_chan->func_no = func_no; + zf_chan->vfunc_no = vfunc_no; +} +EXPORT_SYMBOL_GPL(zte_zf_pcie_set_pfvf_no); + +int zf_pcie_get_hdma_chan(struct pci_epc *epc, u8 func_no, u8 vfunc_no, + struct dma_chan **rchan, struct dma_chan **wchan) +{ + struct dma_chan *rch, *wch; + + wch = zte_get_chan_for_dma(epc, HDMA_WR); + if (IS_ERR_OR_NULL(wch)) + { + DH_LOG_ERR(MODULE_MPF, "failed to get write chan\n"); + return -EFAULT; + } + + rch = zte_get_chan_for_dma(epc, HDMA_RD); + if (IS_ERR_OR_NULL(rch)) + { + DH_LOG_ERR(MODULE_MPF, "failed to get read chan\n"); + dma_release_channel(rch); + return -EFAULT; + } + + zte_zf_pcie_set_pfvf_no(rch, func_no, vfunc_no); + zte_zf_pcie_set_pfvf_no(wch, func_no, vfunc_no); + + *rchan = rch; + *wchan = wch; + return 0; +} + +static int zf_hdma_virtual_channels_init(struct dma_device *dma_dev, struct pci_dev *pdev, void __iomem *addr) +{ + struct zf_hdma_chan *zf_chan = NULL; + u32 i = 0; + + INIT_LIST_HEAD(&dma_dev->channels); + + /* + * Register as many memcpy as we have physical channels, + * we won't always be able to use all but the code will have + * to cope with that situation. + */ + for (i = 0; i < (u32)ZF_HDMA_CHAN_NUM; i++) + { + zf_chan = devm_kzalloc(&pdev->dev, sizeof(*zf_chan), GFP_KERNEL); + if (!zf_chan) + { + // TODO free + return -ENOMEM; + } + zf_chan->sqe_list = devm_kzalloc(&pdev->dev, sizeof(struct zf_hdma_sqe), GFP_KERNEL); + if (!zf_chan->sqe_list) + { + // TODO free + return -ENOMEM; + } + zf_chan->tx_list = devm_kzalloc(&pdev->dev, sizeof(struct zf_hdma_tx), GFP_KERNEL); + if (!zf_chan->tx_list) + { + // TODO free + return -ENOMEM; + } + zf_chan->tx_list->tx_id = 0; + + zf_chan->id = i + ZF_HDMA_CHAN_FIRST_IDX; + zf_chan->ep_pdev = pdev; + zf_chan->base_addr = addr + ZF_HDMA_ADDR_OFFSET; + zf_chan->is_busy = HDMA_CHAN_IDLE; + + zf_chan->name = kasprintf(GFP_KERNEL, "chan%d", i); + if (!zf_chan->name) + return -ENOMEM; + + zf_chan->zxdh_vc.desc_free = zf_hdma_desc_free; + + zxdh_vchan_init(&zf_chan->zxdh_vc, dma_dev); + } + + return i; +} + +void zf_hdma_device_init(struct device *dev, struct dma_device *dd, u32 is_read) +{ + dd->device_alloc_chan_resources = zf_hdma_alloc_chan_resources; // 3,4,8,9 unneccessary + dd->device_free_chan_resources = zf_hdma_free_chan_resources; + dd->device_config = zf_hdma_device_config; + dd->device_tx_status = zf_hdma_tx_status; + dd->device_issue_pending = zf_hdma_issue_pending; // push pending transactions to hardware + dd->device_prep_dma_memcpy = zf_hdma_prep_dma_memcpy; + dd->device_terminate_all = zf_hdma_terminate_all; + dd->device_prep_slave_sg = zf_hdma_device_prep_slave_sg; // prepares a slave dma operation + dd->device_prep_dma_cyclic = zf_hdma_device_prep_dma_cyclic; // prepare a cyclic dma operation suitable for audio. The function takes a buffer of size buf_len. The callback function will be called after period_len bytes have been transferred. + + dd->chancnt = ZF_HDMA_CHAN_NUM; + dd->privatecnt = 0; + dd->copy_align = ZF_HDMA_ALIGN_SIZE; + dd->src_addr_widths = ZF_HDMA_DMA_BUSWIDTHS; + dd->dst_addr_widths = ZF_HDMA_DMA_BUSWIDTHS; + dd->residue_granularity = DMA_RESIDUE_GRANULARITY_SEGMENT; + dd->dev = dev; + + if (is_read) + { + dd->directions = BIT(DMA_MEM_TO_DEV); + } + else + { + dd->directions = BIT(DMA_DEV_TO_MEM); + } + + dma_cap_zero(dd->cap_mask); + dma_cap_set(DMA_MEMCPY, dd->cap_mask); +} + +int callback_thread_function(void *data) +{ + u32 chan_status = 0; + struct pcie_dpu_ep *dpu_dev = data; + struct dma_chan *chan = NULL; + struct zf_hdma_chan *zf_chan = NULL; + struct zf_hdma_tx *zf_tx_desc = NULL; + + DH_LOG_INFO(MODULE_MPF, "enter!\n"); + + while (!kthread_should_stop()) + { + list_for_each_entry(chan, &dpu_dev->rd_dd->channels, device_node) + { + zf_chan = to_zf_hdma_chan(chan); + if (!zf_chan->tx_list->next || !zf_chan->tx_list->next->tx_desc || !zf_chan->tx_list->next->callback) + { + continue; + } + else + { + if ((zf_chan->sqe_list->next != NULL) && (zf_chan->is_busy == HDMA_CHAN_IDLE)) + { + zf_hdma_register_set(zf_chan, HDMA_RD, zf_chan->sqe_list->next); + zf_chan->is_busy = HDMA_CHAN_USED; + // DH_LOG_DEBUG(MODULE_MPF, "zf_chan->id:%d is_pending\n", zf_chan->id); + free_used_sqe(zf_chan); + } + + zf_tx_desc = zf_chan->tx_list->next; + // DH_LOG_DEBUG(MODULE_MPF, "rd_zf_chan%d is used!\n", zf_chan->id); + + read_ch(zf_chan, HDMA_RD, HDMA_STATUS_OFF, &chan_status); + + if ((chan_status & HDMA_STATUS_OFF_STATUS) == HDMA_STATUS_STOPPED && (zf_chan->is_busy == HDMA_CHAN_USED)) + { + spin_lock(&zf_chan->zxdh_vc.lock); + zf_tx_desc->callback(zf_tx_desc->callback_param); + free_used_tx(zf_chan); + spin_unlock(&zf_chan->zxdh_vc.lock); + zf_chan->is_busy = HDMA_CHAN_IDLE; + } + } + } + + list_for_each_entry(chan, &dpu_dev->wr_dd->channels, device_node) + { + zf_chan = to_zf_hdma_chan(chan); + if (!zf_chan->tx_list->next || !zf_chan->tx_list->next->tx_desc || !zf_chan->tx_list->next->callback) + { + continue; + } + else + { + if ((zf_chan->sqe_list->next != NULL) && (zf_chan->is_busy == HDMA_CHAN_IDLE)) + { + zf_hdma_register_set(zf_chan, HDMA_WR, zf_chan->sqe_list->next); + zf_chan->is_busy = HDMA_CHAN_USED; + // DH_LOG_DEBUG(MODULE_MPF, "zf_chan->id:%d is_pending\n", zf_chan->id); + free_used_sqe(zf_chan); + } + + zf_tx_desc = zf_chan->tx_list->next; + // DH_LOG_DEBUG(MODULE_MPF, "wr_zf_chan%d is used!\n", zf_chan->id); + read_ch(zf_chan, HDMA_WR, HDMA_STATUS_OFF, &chan_status); + + if ((chan_status & HDMA_STATUS_OFF_STATUS) == HDMA_STATUS_STOPPED && (zf_chan->is_busy == HDMA_CHAN_USED)) + { + spin_lock(&zf_chan->zxdh_vc.lock); + zf_tx_desc->callback(zf_tx_desc->callback_param); + free_used_tx(zf_chan); + spin_unlock(&zf_chan->zxdh_vc.lock); + zf_chan->is_busy = HDMA_CHAN_IDLE; + } + } + } + msleep(1); + } + + DH_LOG_INFO(MODULE_MPF, "Kernel thread is stopping\n"); + return 0; +} + +int pcie_zf_dma_init(struct pcie_dpu_ep *dpu_dev, struct pci_dev *pdev) +{ + int ret = 0; + int node = 0; + struct device *dev_wr = NULL, *dev_rd = NULL; + struct dma_device *wr_dd = NULL, *rd_dd = NULL; + + if (IS_ERR_OR_NULL(dpu_dev)) + { + DH_LOG_ERR(MODULE_MPF, "err input\n"); + return -ENOENT; + } + + dev_wr = &(dpu_dev->zf_pdev->dev); + dev_rd = &(dpu_dev->zf_pdev_dma->dev); + + node = dev_to_node(dev_wr); + + wr_dd = kzalloc_node(sizeof(struct dma_device), GFP_KERNEL, node); + if (!wr_dd) + { + DH_LOG_ERR(MODULE_MPF, "Error kzalloc node\n"); + return -ENODEV; + } + + rd_dd = kzalloc_node(sizeof(struct dma_device), GFP_KERNEL, node); + if (!rd_dd) + { + DH_LOG_ERR(MODULE_MPF, "Error kzalloc node\n"); + kfree(wr_dd); + return -ENODEV; + } + + zf_hdma_device_init(dev_wr, wr_dd, HDMA_WR); + zf_hdma_device_init(dev_rd, rd_dd, HDMA_RD); + + zf_hdma_virtual_channels_init(wr_dd, pdev, dpu_dev->dbi_base); + zf_hdma_virtual_channels_init(rd_dd, pdev, dpu_dev->dbi_base); + + ret = dma_async_device_register(wr_dd); + ret |= dma_async_device_register(rd_dd); + if (ret) + { + DH_LOG_ERR(MODULE_MPF, "dma_async_device_register failed\n"); + goto free_dma_device; + } + + dpu_dev->wr_dd = wr_dd; + dpu_dev->rd_dd = rd_dd; + DH_LOG_INFO(MODULE_MPF, "success!\n"); + + if (dpu_dev->ep_id >=0 && dpu_dev->ep_id < PCIE_DPU_EP_NUM) + { + callback_thread[dpu_dev->ep_id] = kthread_run(callback_thread_function, dpu_dev, "my_thread"); + if (callback_thread[dpu_dev->ep_id]) + { + DH_LOG_INFO(MODULE_MPF, "Thread created successfully\n"); + } + else + { + DH_LOG_ERR(MODULE_MPF, "Thread creation failed\n"); + } + } + + return 0; + +free_dma_device: + kfree(wr_dd); + kfree(rd_dd); + return ret; +} + +void pcie_zf_dma_free(struct pcie_dpu_ep *dpu_dev, struct pci_dev *pdev) +{ + + if (callback_thread[dpu_dev->ep_id]) + { + kthread_stop(callback_thread[dpu_dev->ep_id]); + DH_LOG_INFO(MODULE_MPF, "Thread created successfully\n"); + } + + if (dpu_dev->wr_dd) + { + dma_async_device_unregister(dpu_dev->wr_dd); + kfree(dpu_dev->wr_dd); + } + if (dpu_dev->rd_dd) + { + dma_async_device_unregister(dpu_dev->rd_dd); + kfree(dpu_dev->rd_dd); + } +} diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/pcie-zte-zf-hdma.h b/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/pcie-zte-zf-hdma.h new file mode 100644 index 0000000..b958917 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/pcie-zte-zf-hdma.h @@ -0,0 +1,159 @@ +#ifndef __PCIE_ZTE_ZF_HDMA_H +#define __PCIE_ZTE_ZF_HDMA_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "pcie-zte-zf-epc.h" +#include "virt-dma.h" + +#define ZF_HDMA_DRIVER_NAME "dh_hdma" +#define ZF_HDMA_ADDR_OFFSET (0x6800000) +#define ZF_HDMA_PER_CHANNEL_SIZE (0x200) +#define ZF_HDMA_RDCH_OFFSET (0x100) +#define HDMA_RD 1 +#define HDMA_WR 0 + +/* ZF HDMA init*/ +#define DPU_HDMA_CHAN_NUM (36) +#define ZF_HDMA_CHAN_FIRST_IDX (18) +#define ZF_HDMA_CHAN_NUM (DPU_HDMA_CHAN_NUM - ZF_HDMA_CHAN_FIRST_IDX) +#define ZF_HDMA_VIRT_CHAN_NUM ZF_HDMA_CHAN_NUM +#define ZF_HDMA_ALIGN_SIZE (1) +#define ZF_HDMA_DMA_BUSWIDTHS (BIT(DMA_SLAVE_BUSWIDTH_4_BYTES)) +#define ZF_HDMA_WAIT_SLEEP_TIMES (10) +#define ZF_HDMA_MAX_WAIT_TIMES (100) + +/* HDMA register*/ +#define HDMA_EN_OFF (0x0) +#define HDMA_DOORBELL_OFF (0x4) +#define HDMA_ELEM_PF_OFF (0x8) +#define HDMA_HANDSHAKE_OFF (0xc) +#define HDMA_LLP_LOW_OFF (0x10) +#define HDMA_LLP_HIGH_OFF (0x14) +#define HDMA_CYCLE_OFF (0x18) +#define HDMA_XFERSIZE_OFF (0x1c) +#define HDMA_XFERSIZE_OFF_COMPLETE (0x0) +#define HDMA_SAR_LOW_OFF (0x20) +#define HDMA_SAR_HIGH_OFF (0x24) +#define HDMA_DAR_LOW_OFF (0x28) +#define HDMA_DAR_HIGH_OFF (0x2c) +#define HDMA_WATERMARK_EN_OFF (0x30) +#define HDMA_CONTROL1_OFF (0x34) +#define HDMA_FUNC_NUM_OFF (0x38) +#define HDMA_FUNC_NUM_OFF_VF_ENABLE (16) +#define HDMA_FUNC_NUM_OFF_VF (17) +#define HDMA_QOS_OFF (0x3c) + +#define HDMA_STATUS_OFF (0x80) +#define HDMA_STATUS_OFF_STATUS (0x3) +#define HDMA_STATUS_STOPPED (0x3) +#define HDMA_INT_STATUS_OFF (0x84) +#define HDMA_STOP_INT_STATUS (0x1) +#define HDMA_INT_SETUP_OFF (0x88) +#define HDMA_INT_MASK_BIT (0x0) +#define HDMA_INT_MASK (0x7) +#define HDMA_LSIE_BIT (0x4) +#define HDMA_LSIE_MASK (0x1) +#define HDMA_INT_CLEAR_OFF (0x8c) +#define HDMA_MSI_STOP_LOW_OFF (0x90) +#define HDMA_MSI_STOP_HIGH_OFF (0x94) +#define HDMA_MSI_WATERMARK_LOW_OFF (0x98) +#define HDMA_MSI_WATERMARK_HIGH_OFF (0x9c) +#define HDMA_MSI_ABORT_LOW_OFF (0xa0) +#define HDMA_MSI_ABORT_HIGH_OFF (0xa4) +#define HDMA_MSI_MSI_MSGD_OFF (0xa8) + +/* HDMA register val*/ +#define HDMA_EN (BIT(0)) +#define HDMA_DOORBELL_STOP (BIT(1)) +#define HDMA_DOORBELL_START (BIT(0)) +#define HDMA_TRANSFER_DONE (0x3) + +/*LL module*/ +#define HDMA_LL_CONTROL_OFFSET 0x0 +#define HDMA_LL_SIZE_OFFSET 0x4 +#define HDMA_LL_SAR_LOW_OFFSET 0x8 +#define HDMA_LL_SAR_HIGH_OFFSET 0xc +#define HDMA_LL_DAR_LOW_OFFSET 0x10 +#define HDMA_LL_DAR_HIGH_OFFSET 0x14 +#define HDMA_LL_NEXT_ELEMENT 0x18 +#define HDMA_LL_LINK_CONTROL_OFFSET 0x0 +#define HDMA_LL_LINK_EMPTY_OFFSET 0x4 +#define HDMA_LL_LINK_POINTER_LOW_OFFSET 0x8 +#define HDMA_LL_LINK_POINTER_HIGH_OFFSET 0xc +#define HDMA_LL_DATA_CONTROL 0x1 +#define HDMA_LL_LINK_CONTROL 0x6 +#define HDMA_LL_PREFETCH 0x8 +#define PF_DEPTH 0x1f + +enum hdma_mode { + HDMA_MODE_LEGACY = 0, + HDMA_MODE_SLAVE, + HDMA_MODE_UNROLL +}; + +enum hdma_chan_status { + HDMA_CHAN_IDLE = 0, + HDMA_CHAN_USED, + HDMA_CHAN_UNDEFINE +}; + +struct zf_hdma_sqe { + size_t length; + dma_addr_t src_addr; + dma_addr_t dst_addr; + struct zf_hdma_sqe *next; +}; + +struct zf_hdma_tx { + int tx_id; + struct dma_async_tx_descriptor *tx_desc; + dma_async_tx_callback callback; + void *callback_param; + struct zf_hdma_tx *next; +}; + +struct hdma_ll_element { + size_t length; + dma_addr_t src_addr; + dma_addr_t dst_addr; +}; + +struct zf_hdma_chan { + u32 id; + struct list_head list; + const char *name; + struct pci_dev *ep_pdev; + struct zxdh_virt_dma_chan zxdh_vc; + struct zxdh_virt_dma_desc zxdh_vd; + void __iomem *base_addr; // 对应HDMA寄存器基址 + struct zf_hdma_sqe *sqe_list; + struct zf_hdma_tx *tx_list; + int is_busy; + u8 func_no; + u8 vfunc_no; +}; + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/virt-dma.c b/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/virt-dma.c new file mode 100644 index 0000000..98c516e --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/virt-dma.c @@ -0,0 +1,135 @@ +#include +#include +#include +#include + +#include "virt-dma.h" + +static struct zxdh_virt_dma_desc *zxdh_to_virt_desc(struct dma_async_tx_descriptor *tx) +{ + return container_of(tx, struct zxdh_virt_dma_desc, tx); +} + +dma_cookie_t zxdh_vchan_tx_submit(struct dma_async_tx_descriptor *tx) +{ + struct zxdh_virt_dma_chan *zxdh_vc = zxdh_to_virt_chan(tx->chan); + struct zxdh_virt_dma_desc *zxdh_vd = zxdh_to_virt_desc(tx); + unsigned long flags; + dma_cookie_t cookie; + + spin_lock_irqsave(&zxdh_vc->lock, flags); + cookie = zxdh_dma_cookie_assign(tx); + + list_move_tail(&zxdh_vd->node, &zxdh_vc->desc_submitted); + spin_unlock_irqrestore(&zxdh_vc->lock, flags); + + pr_debug("%s vchan %p: txd %p[%x]: submitted\n", + __func__, zxdh_vc, zxdh_vd, cookie); + + return cookie; +} +EXPORT_SYMBOL_GPL(zxdh_vchan_tx_submit); + +/** + * zxdh_vchan_tx_desc_free - free a reusable descriptor + * @tx: the transfer + * + * This function frees a previously allocated reusable descriptor. The only + * other way is to clear the DMA_CTRL_REUSE flag and submit one last time the + * transfer. + * + * Returns 0 upon success + */ +int zxdh_vchan_tx_desc_free(struct dma_async_tx_descriptor *tx) +{ + struct zxdh_virt_dma_chan *zxdh_vc = zxdh_to_virt_chan(tx->chan); + struct zxdh_virt_dma_desc *zxdh_vd = zxdh_to_virt_desc(tx); + unsigned long flags; + + spin_lock_irqsave(&zxdh_vc->lock, flags); + list_del(&zxdh_vd->node); + spin_unlock_irqrestore(&zxdh_vc->lock, flags); + + pr_debug("%s vchan %p: txd %p[%x]: freeing\n", + __func__, zxdh_vc, zxdh_vd, zxdh_vd->tx.cookie); + + zxdh_vc->desc_free(zxdh_vd); + return 0; +} +EXPORT_SYMBOL_GPL(zxdh_vchan_tx_desc_free); + +struct zxdh_virt_dma_desc *zxdh_vchan_find_desc(struct zxdh_virt_dma_chan *zxdh_vc, + dma_cookie_t cookie) +{ + struct zxdh_virt_dma_desc *zxdh_vd; + + list_for_each_entry(zxdh_vd, &zxdh_vc->desc_issued, node) + if (zxdh_vd->tx.cookie == cookie) + return zxdh_vd; + + return NULL; +} +EXPORT_SYMBOL_GPL(zxdh_vchan_find_desc); + +/* + * This tasklet handles the completion of a DMA descriptor by + * calling its callback and freeing it. + */ +static void zxdh_vchan_complete(struct tasklet_struct *t) +{ + struct zxdh_virt_dma_chan *zxdh_vc = from_tasklet(zxdh_vc, t, task); + struct zxdh_virt_dma_desc *zxdh_vd, *_vd; + struct zxdh_dmaengine_desc_callback cb; + LIST_HEAD(head); + + spin_lock_irq(&zxdh_vc->lock); + list_splice_tail_init(&zxdh_vc->desc_completed, &head); + zxdh_vd = zxdh_vc->cyclic; + if (zxdh_vd) { + zxdh_vc->cyclic = NULL; + zxdh_dmaengine_desc_get_callback(&zxdh_vd->tx, &cb); + } else { + memset(&cb, 0, sizeof(cb)); + } + spin_unlock_irq(&zxdh_vc->lock); + + zxdh_dmaengine_desc_callback_invoke(&cb, &zxdh_vd->tx_result); + + list_for_each_entry_safe(zxdh_vd, _vd, &head, node) { + zxdh_dmaengine_desc_get_callback(&zxdh_vd->tx, &cb); + + list_del(&zxdh_vd->node); + zxdh_dmaengine_desc_callback_invoke(&cb, &zxdh_vd->tx_result); + zxdh_vchan_vdesc_fini(zxdh_vd); + } +} + +void zxdh_vchan_dma_desc_free_list(struct zxdh_virt_dma_chan *zxdh_vc, struct list_head *head) +{ + struct zxdh_virt_dma_desc *zxdh_vd, *_vd; + + list_for_each_entry_safe(zxdh_vd, _vd, head, node) { + list_del(&zxdh_vd->node); + zxdh_vchan_vdesc_fini(zxdh_vd); + } +} +EXPORT_SYMBOL_GPL(zxdh_vchan_dma_desc_free_list); + +void zxdh_vchan_init(struct zxdh_virt_dma_chan *zxdh_vc, struct dma_device *dmadev) +{ + zxdh_dma_cookie_init(&zxdh_vc->chan); + + spin_lock_init(&zxdh_vc->lock); + INIT_LIST_HEAD(&zxdh_vc->desc_allocated); + INIT_LIST_HEAD(&zxdh_vc->desc_submitted); + INIT_LIST_HEAD(&zxdh_vc->desc_issued); + INIT_LIST_HEAD(&zxdh_vc->desc_completed); + INIT_LIST_HEAD(&zxdh_vc->desc_terminated); + + tasklet_setup(&zxdh_vc->task, zxdh_vchan_complete); + + zxdh_vc->chan.device = dmadev; + list_add_tail(&zxdh_vc->chan.device_node, &dmadev->channels); +} +EXPORT_SYMBOL_GPL(zxdh_vchan_init); + diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/virt-dma.h b/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/virt-dma.h new file mode 100644 index 0000000..eb1ff78 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/epc/virt-dma.h @@ -0,0 +1,221 @@ +#ifndef ZXDH_VIRT_DMA_H +#define ZXDH_VIRT_DMA_H + +#include +#include + +#include "dmaengine.h" + +struct zxdh_virt_dma_desc { + struct dma_async_tx_descriptor tx; + struct dmaengine_result tx_result; + /* protected by zxdh_vc.lock */ + struct list_head node; +}; + +struct zxdh_virt_dma_chan { + struct dma_chan chan; + struct tasklet_struct task; + void (*desc_free)(struct zxdh_virt_dma_desc *); + + spinlock_t lock; + + /* protected by zxdh_vc.lock */ + struct list_head desc_allocated; + struct list_head desc_submitted; + struct list_head desc_issued; + struct list_head desc_completed; + struct list_head desc_terminated; + + struct zxdh_virt_dma_desc *cyclic; +}; + +static inline struct zxdh_virt_dma_chan *zxdh_to_virt_chan(struct dma_chan *chan) +{ + return container_of(chan, struct zxdh_virt_dma_chan, chan); +} + +void zxdh_vchan_dma_desc_free_list(struct zxdh_virt_dma_chan *zxdh_vc, struct list_head *head); +void zxdh_vchan_init(struct zxdh_virt_dma_chan *zxdh_vc, struct dma_device *dmadev); +struct zxdh_virt_dma_desc *zxdh_vchan_find_desc(struct zxdh_virt_dma_chan *, dma_cookie_t); +extern dma_cookie_t zxdh_vchan_tx_submit(struct dma_async_tx_descriptor *); +extern int zxdh_vchan_tx_desc_free(struct dma_async_tx_descriptor *); + +/** + * zxdh_vchan_tx_prep - prepare a descriptor + * @zxdh_vc: virtual channel allocating this descriptor + * @zxdh_vd: virtual descriptor to prepare + * @tx_flags: flags argument passed in to prepare function + */ +static inline struct dma_async_tx_descriptor *zxdh_vchan_tx_prep(struct zxdh_virt_dma_chan *zxdh_vc, + struct zxdh_virt_dma_desc *zxdh_vd, unsigned long tx_flags) +{ + unsigned long flags; + + dma_async_tx_descriptor_init(&zxdh_vd->tx, &zxdh_vc->chan); + zxdh_vd->tx.flags = tx_flags; + zxdh_vd->tx.tx_submit = zxdh_vchan_tx_submit; + zxdh_vd->tx.desc_free = zxdh_vchan_tx_desc_free; + + zxdh_vd->tx_result.result = DMA_TRANS_NOERROR; + zxdh_vd->tx_result.residue = 0; + + spin_lock_irqsave(&zxdh_vc->lock, flags); + list_add_tail(&zxdh_vd->node, &zxdh_vc->desc_allocated); + spin_unlock_irqrestore(&zxdh_vc->lock, flags); + + return &zxdh_vd->tx; +} + +/** + * zxdh_vchan_issue_pending - move submitted descriptors to issued list + * @zxdh_vc: virtual channel to update + * + * zxdh_vc.lock must be held by caller + */ +static inline bool zxdh_vchan_issue_pending(struct zxdh_virt_dma_chan *zxdh_vc) +{ + list_splice_tail_init(&zxdh_vc->desc_submitted, &zxdh_vc->desc_issued); + return !list_empty(&zxdh_vc->desc_issued); +} + +/** + * zxdh_vchan_cookie_complete - report completion of a descriptor + * @zxdh_vd: virtual descriptor to update + * + * zxdh_vc.lock must be held by caller + */ +static inline void zxdh_vchan_cookie_complete(struct zxdh_virt_dma_desc *zxdh_vd) +{ + struct zxdh_virt_dma_chan *zxdh_vc = zxdh_to_virt_chan(zxdh_vd->tx.chan); + dma_cookie_t cookie; + + cookie = zxdh_vd->tx.cookie; + zxdh_dma_cookie_complete(&zxdh_vd->tx); + dev_vdbg(zxdh_vc->chan.device->dev, "txd %p[%x]: marked complete\n", + zxdh_vd, cookie); + list_add_tail(&zxdh_vd->node, &zxdh_vc->desc_completed); + + tasklet_schedule(&zxdh_vc->task); +} + +/** + * zxdh_vchan_vdesc_fini - Free or reuse a descriptor + * @zxdh_vd: virtual descriptor to free/reuse + */ +static inline void zxdh_vchan_vdesc_fini(struct zxdh_virt_dma_desc *zxdh_vd) +{ + struct zxdh_virt_dma_chan *zxdh_vc = zxdh_to_virt_chan(zxdh_vd->tx.chan); + + if (dmaengine_desc_test_reuse(&zxdh_vd->tx)) { + unsigned long flags; + + spin_lock_irqsave(&zxdh_vc->lock, flags); + list_add(&zxdh_vd->node, &zxdh_vc->desc_allocated); + spin_unlock_irqrestore(&zxdh_vc->lock, flags); + } else { + zxdh_vc->desc_free(zxdh_vd); + } +} + +/** + * zxdh_vchan_cyclic_callback - report the completion of a period + * @zxdh_vd: virtual descriptor + */ +static inline void zxdh_vchan_cyclic_callback(struct zxdh_virt_dma_desc *zxdh_vd) +{ + struct zxdh_virt_dma_chan *zxdh_vc = zxdh_to_virt_chan(zxdh_vd->tx.chan); + + zxdh_vc->cyclic = zxdh_vd; + tasklet_schedule(&zxdh_vc->task); +} + +/** + * zxdh_vchan_terminate_vdesc - Disable pending cyclic callback + * @zxdh_vd: virtual descriptor to be terminated + * + * zxdh_vc.lock must be held by caller + */ +static inline void zxdh_vchan_terminate_vdesc(struct zxdh_virt_dma_desc *zxdh_vd) +{ + struct zxdh_virt_dma_chan *zxdh_vc = zxdh_to_virt_chan(zxdh_vd->tx.chan); + + list_add_tail(&zxdh_vd->node, &zxdh_vc->desc_terminated); + + if (zxdh_vc->cyclic == zxdh_vd) + zxdh_vc->cyclic = NULL; +} + +/** + * zxdh_vchan_next_desc - peek at the next descriptor to be processed + * @zxdh_vc: virtual channel to obtain descriptor from + * + * zxdh_vc.lock must be held by caller + */ +static inline struct zxdh_virt_dma_desc *zxdh_vchan_next_desc(struct zxdh_virt_dma_chan *zxdh_vc) +{ + return list_first_entry_or_null(&zxdh_vc->desc_issued, + struct zxdh_virt_dma_desc, node); +} + +/** + * zxdh_vchan_get_all_descriptors - obtain all submitted and issued descriptors + * @zxdh_vc: virtual channel to get descriptors from + * @head: list of descriptors found + * + * zxdh_vc.lock must be held by caller + * + * Removes all submitted and issued descriptors from internal lists, and + * provides a list of all descriptors found + */ +static inline void zxdh_vchan_get_all_descriptors(struct zxdh_virt_dma_chan *zxdh_vc, + struct list_head *head) +{ + list_splice_tail_init(&zxdh_vc->desc_allocated, head); + list_splice_tail_init(&zxdh_vc->desc_submitted, head); + list_splice_tail_init(&zxdh_vc->desc_issued, head); + list_splice_tail_init(&zxdh_vc->desc_completed, head); + list_splice_tail_init(&zxdh_vc->desc_terminated, head); +} + +static inline void zxdh_vchan_free_chan_resources(struct zxdh_virt_dma_chan *zxdh_vc) +{ + struct zxdh_virt_dma_desc *zxdh_vd; + unsigned long flags; + LIST_HEAD(head); + + spin_lock_irqsave(&zxdh_vc->lock, flags); + zxdh_vchan_get_all_descriptors(zxdh_vc, &head); + list_for_each_entry(zxdh_vd, &head, node) + dmaengine_desc_clear_reuse(&zxdh_vd->tx); + spin_unlock_irqrestore(&zxdh_vc->lock, flags); + + zxdh_vchan_dma_desc_free_list(zxdh_vc, &head); +} + +/** + * zxdh_vchan_synchronize() - synchronize callback execution to the current context + * @zxdh_vc: virtual channel to synchronize + * + * Makes sure that all scheduled or active callbacks have finished running. For + * proper operation the caller has to ensure that no new callbacks are scheduled + * after the invocation of this function started. + * Free up the terminated cyclic descriptor to prevent memory leakage. + */ +static inline void zxdh_vchan_synchronize(struct zxdh_virt_dma_chan *zxdh_vc) +{ + LIST_HEAD(head); + unsigned long flags; + + tasklet_kill(&zxdh_vc->task); + + spin_lock_irqsave(&zxdh_vc->lock, flags); + + list_splice_tail_init(&zxdh_vc->desc_terminated, &head); + + spin_unlock_irqrestore(&zxdh_vc->lock, flags); + + zxdh_vchan_dma_desc_free_list(zxdh_vc, &head); +} + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/epf/pcie-zte-zf-epf.c b/src/net/drivers/net/ethernet/dinghai/zf_mpf/epf/pcie-zte-zf-epf.c new file mode 100644 index 0000000..8297b93 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/epf/pcie-zte-zf-epf.c @@ -0,0 +1,1024 @@ +#include "pcie-zte-zf-epf.h" +#include "./../epc/pcie-zte-zf-epc.h" + +#define EPF_MDEV_OPS 1 +#define MDEV_FOPS 1 + +extern void *pci_epf_alloc_space(struct pci_epf *epf, size_t size, enum pci_barno bar, size_t align); +extern void pci_epf_free_space(struct pci_epf *epf, void *addr, enum pci_barno bar); +extern int ep_virtio_module_set(int ep_id, int pf_idx, int en); +extern int pcie_zte_epc_ob_read(struct pci_epc *epc, phys_addr_t phys_addr, unsigned int size, unsigned int *val); + +#if EPF_MDEV_OPS +static int pci_epf_dev_set_pf_bar(struct pci_epf *epf) +{ + int bar_no = 0, add = 0; + int ret = 0; + struct pci_epf_bar *epf_bar = NULL; + struct pci_epc *epc = epf->epc; + struct device *dev = &epf->dev; + struct pci_epf_mdev_dev *epf_mdev_dev = epf_get_drvdata(epf); + const struct pci_epc_features *epc_features = NULL; + + epc_features = epf_mdev_dev->epc_features; + + for (bar_no = 0; bar_no < PCI_STD_NUM_BARS; bar_no += add) + { + epf_bar = &epf->bar[bar_no]; + epf_bar->flags |= BIT(3); + add = (epf_bar->flags & PCI_BASE_ADDRESS_MEM_TYPE_64) ? 2 : 1; + if (!!(epc_features->reserved_bar & (1 << bar_no))) + continue; + + ret = pci_epc_set_bar(epc, epf->func_no, epf->vfunc_no, epf_bar); + if (ret) + { + dev_err(dev, "Failed to set BAR%d\n", bar_no); + } + } + + // set oprom bar + if (epf->header->pf_rom_size != 0) + { + epf->bar[BAR_ROM].phys_addr = page_to_phys(epf->header->pf_rom_page); + ret = pci_epc_set_bar(epc, epf->func_no, epf->vfunc_no, &epf->bar[BAR_ROM]); + if (ret) + { + dev_err(dev, "Failed to set BAR_ROM\n"); + } + } + + return 0; +} + +static int pci_epf_dev_set_vf_bar(struct pci_epf *epf) +{ + int bar_no = 0, add = 0; + int ret = 0; + struct pci_epf_bar *epf_bar; + struct pci_epc *epc = epf->epc; + struct device *dev = &epf->dev; + struct pci_epf_mdev_dev *epf_mdev_dev = epf_get_drvdata(epf); + const struct pci_epc_features *epc_features; + + epc_features = epf_mdev_dev->epc_features; + + for (bar_no = 0; bar_no < PCI_STD_NUM_BARS; bar_no += add) + { + epf_bar = &epf->epf_pf->vf_bar[bar_no]; + epf_bar->flags |= BIT(3); + add = (epf_bar->flags & PCI_BASE_ADDRESS_MEM_TYPE_64) ? 2 : 1; + if (!!(epc_features->reserved_bar & (1 << bar_no))) + continue; + + ret = pci_epc_set_bar(epc, epf->func_no, epf->vfunc_no, epf_bar); + if (ret) + { + dev_err(dev, "Failed to set BAR%d\n", bar_no); + } + } + return 0; +} + +// 根据epf来配置epc的bar、header、msi、msi-x +static int pci_epf_dev_core_init(struct pci_epf *epf) +{ + const struct pci_epc_features *epc_features; + struct device *dev = &epf->dev; + bool msix_capable = false; + int ret = 0; + + epc_features = pci_epc_get_features(epf->epc, epf->func_no, epf->vfunc_no); + if (epc_features) + { + msix_capable = epc_features->msix_capable; + } + + ret = pci_epc_write_header(epf->epc, epf->func_no, epf->vfunc_no, epf->header); + if (ret) + { + dev_err(dev, "Configuration header write failed\n"); + return ret; + } + + if (isPF(epf->func_no)) + { + ret = pci_epf_dev_set_pf_bar(epf); + } + else if (epf->vfunc_no == 0) + { + ret = pci_epf_dev_set_vf_bar(epf); + } + + return ret; +} + +static int get_vf_number(struct pci_epf *epf) +{ + struct pcie_dpu_ep *dpu_ep = epc_get_drvdata(epf->epc); + int vf_total_num = 0; + + if (!dpu_ep) + { + DH_LOG_ERR(MODULE_MPF, "epc is NULL!!!\n"); + return -EINVAL; + } + + vf_total_num = epf->func_no & PCIE_DPU_EP_GET_PF_NO; + if (vf_total_num >= PCIE_DPU_PF_NUMS) + { + DH_LOG_ERR(MODULE_MPF, "error vf_total_num=%d\n", vf_total_num); + return -EINVAL; + } + return dpu_ep->vf_total_num[vf_total_num]; +} + +// 填充pci_epf_bar结构体内容 +static int alloc_bar_space(struct pci_epf *epf) +{ + u16 bar_no = 0; + int vf_num = 0; + struct pci_epf_mdev_dev *epf_mdev_dev = NULL; + + if (!epf) + { + DH_LOG_ERR(MODULE_MPF, "epf is NULL!\n"); + return -EINVAL; + } + if (!epf->epc) + { + DH_LOG_ERR(MODULE_MPF, "epf->epc is NULL!\n"); + return -EINVAL; + } + + if (!epf->epc->ops->get_max_vfs) + { + DH_LOG_ERR(MODULE_MPF, "get_max_vfs is NULL!\n"); + return -EINVAL; + } + + epf_mdev_dev = epf_get_drvdata(epf); + vf_num = get_vf_number(epf); + + if (isPF(epf->func_no)) + { + epf->bar[BAR_0].size = epf->header->pf_bar0_size; + epf->bar[BAR_2].size = epf->header->pf_bar2_size; + epf->bar[BAR_4].size = epf->header->pf_bar4_size; + } + else + { + epf->epf_pf->vf_bar[4].size = epf->epf_pf->header->vf_bar4_size; + } + + // 申请物理空间 + for (bar_no = 0; bar_no < PCI_STD_NUM_BARS - 2; bar_no += 2) + { + epf->bar[bar_no].addr = pci_epf_alloc_space(epf, epf->bar[bar_no].size, bar_no, GFP_KERNEL); + if (!epf->bar[bar_no].addr) + { + DH_LOG_ERR(MODULE_MPF, "Don't have enough memory!\n"); + return -ENOMEM; + } + } + + for (bar_no = 0; bar_no < PCI_STD_NUM_BARS; bar_no += 2) + { + // PF的信息获取 + epf->bar[bar_no].barno = bar_no; + epf->bar[bar_no].flags |= PCI_BASE_ADDRESS_MEM_TYPE_64; + if (isPF(epf->func_no)) + { + // PF下的VF的信息获取 + epf->vf_bar[bar_no].barno = bar_no; + epf->vf_bar[bar_no].flags |= PCI_BASE_ADDRESS_MEM_TYPE_64; + } + } + + return 0; +} + +static void pci_epf_mdev_unbind(struct pci_epf *epf) +{ + int bar_no = 0; + struct pci_epc *epc = epf->epc; + + DH_LOG_ERR(MODULE_MPF, "pf = 0x%x, vf = 0x%x\n", epf->func_no, epf->vfunc_no); + if (epf->vfunc_no == 0) + { + for (bar_no = 0; bar_no < PCI_STD_NUM_BARS - 2; bar_no += 2) + { + pci_epf_free_space(epf, epf->bar[bar_no].addr, bar_no); + } + } + + if (isPF(epf->func_no)) + { + clear_bit(epf->func_no, &epc->function_num_map); + } +} + +static int pci_epf_mdev_bind(struct pci_epf *epf) +{ + int ret = 0; + struct pci_epf_mdev_dev *epf_mdev_dev = epf_get_drvdata(epf); + const struct pci_epc_features *epc_features = NULL; + struct pci_epc *epc = epf->epc; + bool linkup_notifier = false; + bool core_init_notifier = false; + + if (!epc) + { + DH_LOG_ERR(MODULE_MPF, "epc is NULL!!!\n"); + return -EINVAL; + } + + if (isPF(epf->func_no)) + { + epf->is_vf = PCI_EPF_SRIOV_PF; + } + else + { + epf->is_vf = PCI_EPF_SRIOV_VF; + } + + ret = alloc_bar_space(epf); + if (ret) + { + DH_LOG_ERR(MODULE_MPF, "Alloc bar sapce error!\n"); + return ret; + } + + epc_features = pci_epc_get_features(epc, epf->func_no, epf->vfunc_no); + if (!epc_features) + { + dev_err(&epf->dev, "epc_features not implemented\n"); + return -EOPNOTSUPP; + } + + linkup_notifier = epc_features->linkup_notifier; + core_init_notifier = epc_features->core_init_notifier; + epf_mdev_dev->epc_features = epc_features; + if (!core_init_notifier) + { + ret = pci_epf_dev_core_init(epf); + if (ret) + { + return ret; + } + } + + return 0; +} + +static const struct pci_epf_device_id pci_epf_dev_ids[] = { + { + .name = "pci-epf-mdev", + }, + {}, +}; + +static struct pci_epf_ops epf_mdev_ops = { + .unbind = pci_epf_mdev_unbind, + .bind = pci_epf_mdev_bind, +}; +#endif + +#if MDEV_FOPS +// sample_pci_mdev_dev_show +static ssize_t sample_pci_mdev_dev_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + return sprintf(buf, "This is pci-epf-mdev device\n"); +} +static DEVICE_ATTR_RO(sample_pci_mdev_dev); + +static struct attribute *pci_mdev_dev_attrs[] = { + &dev_attr_sample_pci_mdev_dev.attr, + NULL, +}; + +static const struct attribute_group pci_mdev_dev_group = { + .name = "pcie_mdev_dev", + .attrs = pci_mdev_dev_attrs, +}; + +static const struct attribute_group *pci_mdev_dev_groups[] = { + &pci_mdev_dev_group, + NULL, +}; + +// sample_mdev_dev_show +static ssize_t sample_mdev_dev_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + if (mdev_from_dev(dev)) + return sprintf(buf, "This is MDEV %s\n", dev_name(dev)); + + return sprintf(buf, "\n"); +} + +static DEVICE_ATTR_RO(sample_mdev_dev); + +static struct attribute *mdev_dev_attrs[] = { + &dev_attr_sample_mdev_dev.attr, + NULL, +}; + +static const struct attribute_group mdev_dev_group = { + .name = "vendor", + .attrs = mdev_dev_attrs, +}; + +static const struct attribute_group *mdev_dev_groups[] = { + &mdev_dev_group, + NULL, +}; + +// name_show +++ device_api_show +static ssize_t name_show(struct mdev_type *mtype, + struct mdev_type_attribute *attr, char *buf) +{ + const char *name_str = {"ZTE epf mdev"}; + return sysfs_emit(buf, "%s\n", name_str); +} +static MDEV_TYPE_ATTR_RO(name); + +static ssize_t device_api_show(struct mdev_type *mtype, + struct mdev_type_attribute *attr, char *buf) +{ + return sprintf(buf, "%s\n", VFIO_DEVICE_API_PCI_STRING); +} + +static MDEV_TYPE_ATTR_RO(device_api); + +static struct attribute *mdev_types_attrs[] = { + &mdev_type_attr_name.attr, + &mdev_type_attr_device_api.attr, + NULL, +}; + +static struct attribute_group mdev_type_group = { + .name = "single", + .attrs = mdev_types_attrs, +}; + +static struct attribute_group *mdev_type_groups[] = { + &mdev_type_group, + NULL, +}; + +static int pci_mdev_create(struct mdev_device *mdev) +{ + struct mdev_state *mdev_state = NULL; + struct device *dev = mdev->type->parent->dev; + struct pci_epf *epf = container_of(dev, struct pci_epf, dev); + struct pci_epf_mdev_dev *epf_mdev_dev = epf_get_drvdata(epf); + int ret = 0; + + if (epf_mdev_dev->created_flag == 1) + { + DH_LOG_ERR(MODULE_MPF, "This mdev has been created!!!\n"); + return -EPERM; + } + + mdev_state = kzalloc(sizeof(struct mdev_state), GFP_KERNEL); + if (!mdev_state) + { + return -ENOMEM; + } + + mdev_state->irq_index = -1; + mdev_state->epf_mdev_dev = epf_mdev_dev; + mdev_state->mdev = mdev; + mutex_init(&mdev_state->ops_lock); + mutex_init(&mdev_state->ioeventfds_lock); + INIT_LIST_HEAD(&mdev_state->ioeventfds_list); + + mdev_set_drvdata(mdev, mdev_state); + + epf_mdev_dev->created_flag = 1; + + return ret; +} + +static int pci_mdev_remove(struct mdev_device *mdev) +{ + int ret = 0; + // int bar_no = 0; + struct mdev_state *mdev_state = NULL; + struct epf_mdev_ioeventfd *ioeventfd = NULL, *temp = NULL; + struct device *dev = NULL; + struct pci_epf *epf = NULL; + struct pci_epf_mdev_dev *epf_mdev_dev = NULL; + + mdev_state = mdev_get_drvdata(mdev); + if (!mdev_state) + { + DH_LOG_ERR(MODULE_MPF, "mdev_state NULL\n"); + return 0; + } + dev = mdev->type->parent->dev; + if (!dev) + { + DH_LOG_ERR(MODULE_MPF, "dev NULL\n"); + return 0; + } + epf = container_of(dev, struct pci_epf, dev); + epf_mdev_dev = epf_get_drvdata(epf); + if (epf_mdev_dev == NULL) + { + DH_LOG_ERR(MODULE_MPF, "epf_mdev_dev NULL\n"); + return 0; + } + + mutex_lock(&mdev_state->ioeventfds_lock); + list_for_each_entry_safe(ioeventfd, temp, &mdev_state->ioeventfds_list, next) + { + vfio_virqfd_disable(&ioeventfd->virqfd); + list_del(&ioeventfd->next); + mdev_state->ioeventfds_nr--; + kfree(ioeventfd); + } + mutex_unlock(&mdev_state->ioeventfds_lock); + mutex_destroy(&mdev_state->ioeventfds_lock); + mutex_destroy(&mdev_state->ops_lock); + kfree(mdev_state); // todo LJP + + epf_mdev_dev->created_flag = 0; + + return ret; +} + +static int pci_mdev_open(struct mdev_device *mdev) +{ + return 0; +} + +static void pci_mdev_close(struct mdev_device *mdev) +{ +} + +static ssize_t pci_mdev_read(struct mdev_device *mdev, char __user *buf, + size_t count, loff_t *ppos) +{ + int ret = 0; + + return ret; +} + +static ssize_t pci_mdev_write(struct mdev_device *mdev, const char __user *buf, + size_t count, loff_t *ppos) +{ + int ret = 0; + struct mdev_state *mdev_state = mdev_get_drvdata(mdev); + + if (!mdev_state) + { + DH_LOG_ERR(MODULE_MPF, "mdev_state is NULL!!!\n"); + return -EINVAL; + } + + return ret; +} + +static int pci_mdev_mmap(struct mdev_device *mdev, struct vm_area_struct *vma) +{ + struct device *dev = mdev->type->parent->dev; + struct pci_epf *epf = container_of(dev, struct pci_epf, dev); + struct pci_epc *epc = epf->epc; + // struct pci_epf_mdev_dev *epf_mdev_dev = epf_get_drvdata(epf); + int ret = 0; + int bar_no = vma->vm_pgoff; + + if (!epc) + { + DH_LOG_ERR(MODULE_MPF, "epc is NULL!!!\n"); + } + + if (vma->vm_end < vma->vm_start) + { + goto parameter_error; + } + + if (vma->vm_end - vma->vm_start > epf->bar[bar_no].size) + { + goto parameter_error; + } + + if ((vma->vm_flags & VM_SHARED) == 0) + { + goto parameter_error; + } + + ret = remap_vmalloc_range_partial(vma, vma->vm_start, epf->bar[bar_no].addr, 0, vma->vm_end - vma->vm_start); + + if (ret) + { + DH_LOG_ERR(MODULE_MPF, "remap_vmalloc_range_partial error!!!\n"); + } + + return ret; + +parameter_error: + DH_LOG_ERR(MODULE_MPF, "vm area parameter error!!!\n"); + return -EINVAL; +} + +#if 1 // ioctl +static int zte_get_device_info(struct mdev_device *mdev, struct vfio_device_info *dev_info) +{ + dev_info->flags = VFIO_DEVICE_FLAGS_PCI; + dev_info->num_regions = VFIO_PCI_NUM_REGIONS; + dev_info->num_irqs = VFIO_PCI_NUM_IRQS; + + return 0; +} + +static int zte_get_region_info(struct mdev_device *mdev, struct vfio_region_info *region_info) +{ + struct mdev_state *mdev_state = NULL; + struct device *dev = mdev->type->parent->dev; + struct pci_epf *epf = container_of(dev, struct pci_epf, dev); + int bar_no = 0; + int bar_size = 0; + + mdev_state = mdev_get_drvdata(mdev); + if (!mdev_state) + { + return -EINVAL; + } + + bar_no = region_info->index; + if (bar_no >= VFIO_PCI_BAR5_REGION_INDEX) + { + DH_LOG_ERR(MODULE_MPF, "bar index invaild!\n"); + return -EINVAL; + } + + mutex_lock(&mdev_state->ops_lock); + + if (bar_no == VFIO_PCI_BAR0_REGION_INDEX || bar_no == VFIO_PCI_BAR2_REGION_INDEX || bar_no == VFIO_PCI_BAR4_REGION_INDEX) + { + bar_size = epf->bar[bar_no].size; + } + else + { + DH_LOG_ERR(MODULE_MPF, "bar index invaild!\n"); + return -EINVAL; + } + + mdev_state->region_info[bar_no].size = bar_size; + + region_info->offset = (bar_no << 12); + region_info->size = bar_size; + region_info->flags = VFIO_REGION_INFO_FLAG_READ | VFIO_REGION_INFO_FLAG_WRITE; + mutex_unlock(&mdev_state->ops_lock); + return 0; +} + +static void __attribute__((unused)) epf_mdev_ioeventfd_thread(void *opaque, void *unused) +{ + // 打桩 +} + +int epf_mdev_ioeventfd_handler(void *opaque, void *unused) +{ + int ret = 0; + struct epf_mdev_ioeventfd *ioeventfd = opaque; + struct mdev_state *mdev_state = ioeventfd->mdev_state; + struct pci_epf_mdev_dev *epf_mdev_dev = mdev_state->epf_mdev_dev; + struct pci_epf *epf = epf_mdev_dev->epf; + struct pci_epc *epc = epf->epc; + enum pci_epc_irq_type irq_type = PCI_EPC_IRQ_MSIX; + + pci_epc_raise_irq(epc, epf->func_no, epf->vfunc_no, irq_type, ioeventfd->offset + 1); + return ret; +} + +#if 0 +int epf_mdev_ioeventfd_func(struct mdev_state *mdev_state, loff_t offset, u64 data, int count, int fd) +{ + int ret = 0; + struct epf_mdev_ioeventfd *ioeventfd = NULL, *temp = NULL; + +#ifndef iowrite64 + if (count == 8) + return -EINVAL; +#endif + + mutex_lock(&mdev_state->ioeventfds_lock); + list_for_each_entry_safe(ioeventfd, temp, &mdev_state->ioeventfds_list, next) + { + if (ioeventfd->offset == offset) + { + if (fd == -1 || data == 0) + { + vfio_virqfd_disable(&ioeventfd->virqfd); + list_del(&ioeventfd->next); + mdev_state->ioeventfds_nr--; + kfree(ioeventfd); + ret = 0; + } + else if (data == 1) + { + vfio_virqfd_disable(&ioeventfd->virqfd); + list_del(&ioeventfd->next); + mdev_state->ioeventfds_nr--; + kfree(ioeventfd); + goto eventfds_set; + } + else + { + ret = -EEXIST; + } + + goto out_unlock; + } + } + + if (fd < 0) + { + ret = -ENODEV; + goto out_unlock; + } + + if (mdev_state->ioeventfds_nr >= EPF_MDEV_IOEVENTFD_MAX) + { + ret = -ENOSPC; + goto out_unlock; + } + +eventfds_set: + ioeventfd = kzalloc(sizeof(*ioeventfd), GFP_KERNEL); + if (!ioeventfd) + { + ret = -ENOMEM; + goto out_unlock; + } + + ioeventfd->mdev_state = mdev_state; + ioeventfd->data = data; + ioeventfd->offset = offset; + ioeventfd->count = count; + + ret = vfio_virqfd_enable(ioeventfd, epf_mdev_ioeventfd_handler, + epf_mdev_ioeventfd_thread, NULL, + &ioeventfd->virqfd, fd); + if (ret) + { + kfree(ioeventfd); + goto out_unlock; + } + + list_add(&ioeventfd->next, &mdev_state->ioeventfds_list); + mdev_state->ioeventfds_nr++; + +out_unlock: + mutex_unlock(&mdev_state->ioeventfds_lock); + + return ret; +} +#endif + +static int device_get_info(struct mdev_device *mdev, struct mdev_state *mdev_state, unsigned long arg) +{ + unsigned long minsz = 0; + struct vfio_device_info info = {0}; + + minsz = offsetofend(struct vfio_device_info, num_irqs); + if (copy_from_user(&info, (void __user *)arg, minsz)) + { + return -EFAULT; + } + + if (info.argsz < minsz) + { + return -EINVAL; + } + + zte_get_device_info(mdev, &info); + + memcpy(&mdev_state->dev_info, &info, sizeof(info)); + if (copy_to_user((void __user *)arg, &info, minsz)) + return -EFAULT; + return 0; +} + +static int device_get_region_info(struct mdev_device *mdev, struct mdev_state *mdev_state, unsigned long arg) +{ + struct vfio_region_info info = {0}; + unsigned long minsz = 0; + int ret = 0; + + minsz = offsetofend(struct vfio_region_info, offset); + if (copy_from_user(&info, (void __user *)arg, minsz)) + return -EFAULT; + + if (info.argsz < minsz) + return -EINVAL; + + ret = zte_get_region_info(mdev, &info); + if (ret) + return ret; + + if (copy_to_user((void __user *)arg, &info, minsz)) + { + return -EFAULT; + } + + return 0; +} + +static int vfio_device_ioeventfd(struct mdev_device *mdev, struct mdev_state *mdev_state, unsigned long arg) +{ + struct vfio_device_ioeventfd ioeventfd = {0}; + int ret = 0; + int count = 0; + unsigned long minsz = 0; + struct pci_epf_mdev_dev *epf_mdev_dev = mdev_state->epf_mdev_dev; + struct pci_epf *epf = epf_mdev_dev->epf; + + minsz = offsetofend(struct vfio_device_ioeventfd, fd); + if (copy_from_user(&ioeventfd, (void __user *)arg, minsz)) + { + DH_LOG_ERR(MODULE_MPF, "copy from user failed! minsz=0x%lx\n", minsz); + return -EFAULT; + } + + DH_LOG_INFO(MODULE_MPF, "func = 0x%x, vfunc_no = 0x%x, offset = 0x%llx, data = 0x%llx, minsz=0x%lx\n", epf->func_no, epf->vfunc_no, ioeventfd.offset, ioeventfd.data, minsz); + if (ioeventfd.argsz < minsz) + { + return -EINVAL; + } + + if (ioeventfd.flags & ~VFIO_DEVICE_IOEVENTFD_SIZE_MASK) + { + return -EINVAL; + } + + count = ioeventfd.flags & VFIO_DEVICE_IOEVENTFD_SIZE_MASK; + + if (hweight8(count) != 1 || ioeventfd.fd < -1) + return -EINVAL; + + // ret = epf_mdev_ioeventfd_func(mdev_state, (loff_t)ioeventfd.offset, (u64)ioeventfd.data, count, (int)ioeventfd.fd); + DH_LOG_ERR(MODULE_MPF, "error: epf_mdev_ioeventfd_func not called!\n"); + return ret; +} + +static int vfio_outbound_set(struct mdev_device *mdev, struct mdev_state *mdev_state, unsigned long arg) +{ + int ret = 0; + struct pci_epf_mdev_dev *epf_mdev_dev = mdev_state->epf_mdev_dev; + struct pci_epf *epf = epf_mdev_dev->epf; + struct pci_epc *epc = epf->epc; + struct ioctl_ob_data ob = {0}; + void __iomem *dst_addr = NULL; + phys_addr_t dst_phys_addr = 0; + + if (copy_from_user(&ob, (void *)arg, sizeof(struct ioctl_ob_data))) + { + DH_LOG_ERR(MODULE_MPF, "err:copy_from_user failed!\n"); + return -EFAULT; + } + DH_LOG_INFO(MODULE_MPF, "ob->host = 0x%llx, ob->size = 0x%lxs\n", ob.host_addr, ob.size); + + dst_addr = pci_epc_mem_alloc_addr(epc, &dst_phys_addr, ob.size); + if (!dst_addr) + { + DH_LOG_ERR(MODULE_MPF, "Failed to allocate destination address\n"); + return -ENOMEM; + } + + ret = pci_epc_map_addr(epc, epf->func_no, epf->vfunc_no, dst_phys_addr, ob.host_addr, ob.size); + if (ret) + { + DH_LOG_ERR(MODULE_MPF, "pci_epc_map_addr err!!!\n"); + return ret; + } + ob.dpu_vaddr = (unsigned long long)dst_addr; + ob.dpu_paddr = dst_phys_addr; + if (copy_to_user((void *)arg, &ob, sizeof(struct ioctl_ob_data))) + { + DH_LOG_ERR(MODULE_MPF, "err:copy_to_user failed!\n"); + return -EFAULT; + } + + return 0; +} + +static int vfio_outbound_read(struct mdev_device *mdev, struct mdev_state *mdev_state, unsigned long arg) +{ + struct pci_epf_mdev_dev *epf_mdev_dev = mdev_state->epf_mdev_dev; + struct pci_epf *epf = epf_mdev_dev->epf; + struct pci_epc *epc = epf->epc; + struct pci_ob_rw_data ob_rw_data = {0}; + + if (copy_from_user(&ob_rw_data, (void *)arg, sizeof(struct pci_ob_rw_data))) + { + DH_LOG_ERR(MODULE_MPF, "err:copy_from_user failed!\n"); + return -EFAULT; + } + DH_LOG_INFO(MODULE_MPF, "ob_rw_data.phys_addr = 0x%llx, ob_rw_data.size = 0x%x\n", ob_rw_data.phys_addr, ob_rw_data.size); + + pcie_zte_epc_ob_read(epc, (phys_addr_t)ob_rw_data.phys_addr, ob_rw_data.size, &ob_rw_data.val); + + if (copy_to_user((void *)arg, &ob_rw_data, sizeof(struct pci_ob_rw_data))) + { + DH_LOG_ERR(MODULE_MPF, "err:copy_to_user failed!\n"); + return -EFAULT; + } + + return 0; +} + +static int vfio_outbound_clear(struct mdev_device *mdev, struct mdev_state *mdev_state, unsigned long arg) +{ + struct pci_epf_mdev_dev *epf_mdev_dev = mdev_state->epf_mdev_dev; + struct pci_epf *epf = epf_mdev_dev->epf; + struct pci_epc *epc = epf->epc; + struct ioctl_ob_data ob = {0}; + + if (copy_from_user(&ob, (void *)arg, sizeof(struct ioctl_ob_data))) + { + DH_LOG_ERR(MODULE_MPF, "err:copy_from_user failed!\n"); + return -EFAULT; + } + + pci_epc_unmap_addr(epc, epf->func_no, epf->vfunc_no, ob.dpu_vaddr); + pci_epc_mem_free_addr(epc, ob.dpu_paddr, (void *)ob.dpu_vaddr, ob.size); + + return 0; +} + +static int vfio_virtio_module_set(unsigned long arg) +{ + struct ioctl_virtio_data virtio_data = {0}; + + if (copy_from_user(&virtio_data, (void *)arg, sizeof(struct ioctl_virtio_data))) + { + DH_LOG_ERR(MODULE_MPF, "err:copy_from_user failed!\n"); + return -EFAULT; + } + + return ep_virtio_module_set(virtio_data.ep_id, virtio_data.pf_id, virtio_data.en); +} + +static long pci_mdev_ioctl(struct mdev_device *mdev, unsigned int cmd, unsigned long arg) +{ + int ret = 0; + struct mdev_state *mdev_state; + struct device *dev = NULL; + // struct pci_epf *epf = container_of(dev, struct pci_epf, dev); + // struct pci_epf_mdev_dev *epf_mdev_dev = epf_get_drvdata(epf); + + if (mdev == NULL) + { + DH_LOG_ERR(MODULE_MPF, "err: mdev is NULL!\n"); + return -EINVAL; + } + dev = mdev->type->parent->dev; + + mdev_state = mdev_get_drvdata(mdev); + if (!mdev_state) + return -ENODEV; + + switch (cmd) + { + case VFIO_DEVICE_GET_INFO: + return device_get_info(mdev, mdev_state, arg); + case VFIO_DEVICE_GET_REGION_INFO: + return device_get_region_info(mdev, mdev_state, arg); + case VFIO_DEVICE_IOEVENTFD: + return vfio_device_ioeventfd(mdev, mdev_state, arg); + case VFIO_OUTBOUND_SET: + return vfio_outbound_set(mdev, mdev_state, arg); + case VFIO_OUTBOUND_CLEAR: + return vfio_outbound_clear(mdev, mdev_state, arg); + case VFIO_POWER_RESET: + ep_power_reset(arg); + return 0; + case VFIO_VIRTIO_MODULE_SET: + return vfio_virtio_module_set(arg); + case VFIO_LINKUP: + return pcie_zf_link_up(arg); + case VFIO_OUTBOUND_READ: + return vfio_outbound_read(mdev, mdev_state, arg); + // case VFIO_EP4_LINKUP: + // return is_ep4_link_up(); + default: + DH_LOG_ERR(MODULE_MPF, "zte-pci-epf-mdev ioctl cmd error!\n"); + ret = -ENOTTY; + } + + return ret; +} +#endif + +static const struct mdev_parent_ops mdev_fops = { + .owner = THIS_MODULE, + .dev_attr_groups = pci_mdev_dev_groups, + .mdev_attr_groups = mdev_dev_groups, + .supported_type_groups = mdev_type_groups, + .create = pci_mdev_create, + .remove = pci_mdev_remove, + .open = pci_mdev_open, + .release = pci_mdev_close, + .read = pci_mdev_read, + .write = pci_mdev_write, + .mmap = pci_mdev_mmap, + .ioctl = pci_mdev_ioctl, +}; +#endif + +static int pci_epf_mdev_probe(struct pci_epf *epf) +{ + struct pci_epf_mdev_dev *epf_mdev_dev; + struct device *dev = &epf->dev; + int ret = 0; + + epf_mdev_dev = devm_kzalloc(dev, sizeof(*epf_mdev_dev), GFP_KERNEL); + if (!epf_mdev_dev) + return -ENOMEM; + + epf_mdev_dev->epf = epf; + epf->header = devm_kzalloc(dev, sizeof(struct pci_epf_header), GFP_KERNEL); + if (!epf->header) + { + ret = -ENOMEM; + goto err; + } + + epf_mdev_dev->created_flag = 0; + + // DMA一致性设置(未必有效,待查) + dev->coherent_dma_mask = ~((u64)0x0); + + epf_set_drvdata(epf, epf_mdev_dev); + + ret = mdev_register_device(dev, &mdev_fops); + if (ret) + { + DH_LOG_ERR(MODULE_MPF, "mdev_register_device failed %d\n", ret); + goto err; + } + + return 0; + +err: + devm_kfree(dev, epf->header); + devm_kfree(dev, epf_mdev_dev); + return ret; +} + +static int pci_epf_remove(struct pci_epf *epf) +{ + struct device *dev = &epf->dev; + struct pci_epf_mdev_dev *epf_mdev_dev = epf_get_drvdata(epf); + + mdev_unregister_device(&epf->dev); + if (epf->header) + { + devm_kfree(dev, epf->header); + } + if (epf_mdev_dev) + { + devm_kfree(dev, epf_mdev_dev); + } + + return 0; +} + +static struct pci_epf_driver pci_epf_mdev_driver = { + .driver.name = "pci-epf-mdev", + .probe = pci_epf_mdev_probe, + .remove = pci_epf_remove, + .id_table = pci_epf_dev_ids, + .ops = &epf_mdev_ops, + .owner = THIS_MODULE, +}; + +static int __init pci_epf_mdev_init(void) +{ + int ret = 0; + + ret = pci_epf_register_driver(&pci_epf_mdev_driver); + if (ret) + { + pr_err("Failed to register pci epf test driver --> %d\n", ret); + return ret; + } + + DH_LOG_ERR(MODULE_MPF, "zte_epf driver regist successful\n"); + return ret; +} +module_init(pci_epf_mdev_init); + +static void __exit pci_epf_mdev_exit(void) +{ + pci_epf_unregister_driver(&pci_epf_mdev_driver); +} +module_exit(pci_epf_mdev_exit); + +MODULE_DESCRIPTION("PCI EPF MDEV DRIVER"); +MODULE_AUTHOR("ZTE"); +MODULE_LICENSE("GPL v2"); diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/epf/pcie-zte-zf-epf.h b/src/net/drivers/net/ethernet/dinghai/zf_mpf/epf/pcie-zte-zf-epf.h new file mode 100644 index 0000000..8fdc09e --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/epf/pcie-zte-zf-epf.h @@ -0,0 +1,142 @@ +#ifndef __ZTE_EPF_H +#define __ZTE_EPF_H + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../epc/pcie-zte-zf-epc.h" + +#define EPF_MDEV_IOEVENTFD_MAX 20 + +/* ioctl cmd */ +#define VFIO_OUTBOUND_SET _IO(VFIO_TYPE, VFIO_BASE + 30) +#define VFIO_OUTBOUND_CLEAR _IO(VFIO_TYPE, VFIO_BASE + 31) +#define VFIO_POWER_RESET _IO(VFIO_TYPE, VFIO_BASE + 32) +#define VFIO_VIRTIO_MODULE_SET _IO(VFIO_TYPE, VFIO_BASE + 33) +#define VFIO_LINKUP _IO(VFIO_TYPE, VFIO_BASE + 34) +#define VFIO_OUTBOUND_READ _IO(VFIO_TYPE, VFIO_BASE + 35) +// #define VFIO_EP4_LINKUP _IO(VFIO_TYPE, VFIO_BASE + 35) + +extern int pcie_zf_link_up(int ep_id); +// extern int is_ep4_link_up(void); +extern void ep_power_reset(int ep_id); +extern int ep_virtio_module_set(int ep_id, int pf_id, int en); + +struct ioctl_virtio_data { + int ep_id; + int pf_id; + int en; +}; + +struct ioctl_ob_data { + unsigned long long dpu_paddr; + unsigned long long dpu_vaddr; + unsigned long long host_addr; + unsigned long size; +}; + +struct pci_epf_mdev_dev { + struct pci_epf *epf; + enum pci_barno epf_barno; + size_t msix_table_offset; + const struct pci_epc_features *epc_features; + int created_flag; // 0:Not created, 1:created + void *pf_bar_vaddr[PCI_STD_NUM_BARS + 1]; + void *vf_bar_vaddr[PCI_STD_NUM_BARS]; +}; + +struct epf_mdev_ioeventfd { + struct list_head next; + struct mdev_state *mdev_state; + struct virqfd *virqfd; + u64 data; + loff_t pos; + u64 offset; + int count; +}; + +struct mdev_region_info { + u64 start; + u64 phys_start; + u32 size; + u64 vfio_offset; + u32 argsz; +}; + +struct mdev_state { + int irq_fd; + struct eventfd_ctx *intx_evtfd; + struct eventfd_ctx *msi_evtfd; + struct eventfd_ctx *msix_evtfd; + int irq_index; + struct mutex ops_lock; + struct mdev_device *mdev; + struct mdev_region_info region_info[VFIO_PCI_NUM_REGIONS]; + u32 bar_mask[VFIO_PCI_NUM_REGIONS]; + struct list_head next; + struct vfio_device_info dev_info; + struct pci_epf_mdev_dev *epf_mdev_dev; + struct mutex ioeventfds_lock; + struct list_head ioeventfds_list; + int ioeventfds_nr; +}; + +// mdev_private struct +struct mdev_parent { + struct device *dev; + const struct mdev_parent_ops *ops; + struct kref ref; + struct list_head next; + struct kset *mdev_types_kset; + struct list_head type_list; + struct rw_semaphore unreg_sem; +}; + +struct mdev_type { + struct kobject kobj; + struct kobject *devices_kobj; + struct mdev_parent *parent; + struct list_head next; + unsigned int type_group_id; +}; +// mdev_private struct end + +struct pci_ob_rw_data { + unsigned long long phys_addr; + unsigned int size; + unsigned int val; +}; + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/eq.c b/src/net/drivers/net/ethernet/dinghai/zf_mpf/eq.c new file mode 100755 index 0000000..88d012b --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/eq.c @@ -0,0 +1,502 @@ +#include +#include +#include +#include +#include +#include "irq.h" +#include "eq.h" +#include "zf_mpf.h" +#include "gdma.h" + +struct dh_mpf_eq_table { + struct dh_irq **comp_irqs; + struct dh_irq *async_risc_irq; + struct dh_irq *async_pf_irq; + struct dh_irq *async_irq1; + struct dh_irq *async_irq2; + struct dh_irq *async_irq3; + struct dh_irq *async_irq4; + struct dh_irq **gdma_irqs; + struct dh_eq_async async_risc_eq; + struct dh_eq_async async_pf_eq; + struct dh_eq_async async_eq1; + struct dh_eq_async async_eq2; + struct dh_eq_async async_eq3; + struct dh_eq_async async_eq4; + struct dh_eq_async gdma_eq[ZXDH_MPF_GDMA_IRQ_NUM]; +}; + +static int32_t create_async_eqs(struct dh_core_dev *dev); + +#ifdef CONFIG_ZF_GDMA +static int32_t create_gdma_eqs(struct dh_core_dev *dev); +void cleanup_gdma_eq(struct dh_core_dev *dev, struct dh_mpf_eq_table *table_priv, uint16_t num); +#endif + +static int32_t __attribute__((unused)) create_eq_map(struct dh_eq_param *param) +{ + int32_t err = 0; + + /* inform device*/ + return err; +} + +int32_t dh_mpf_eq_table_init(struct dh_core_dev *dev) +{ + struct dh_mpf_eq_table *table_priv = NULL; + + table_priv = kvzalloc(sizeof(*table_priv), GFP_KERNEL); + if (unlikely(table_priv == NULL)) + { + return -ENOMEM; + } + + dh_eq_table_init(dev, table_priv); + + return 0; +} + +/*todo*/ +int32_t dh_eq_get_comp_eqs(struct dh_core_dev *dev) +{ + return 0; +} + +static int32_t create_comp_eqs(struct dh_core_dev *dev) +{ + if (IS_ERR_OR_NULL(dev)) + { + dh_err(dev, "error dev\n"); + return PTR_ERR(dev); + } + + return 0; +} + +static int32_t destroy_async_eq(struct dh_core_dev *dev) +{ + struct dh_eq_table *eq_table = &dev->eq_table; + + mutex_lock(&eq_table->lock); + /*unmap inform device*/ + mutex_unlock(&eq_table->lock); + + return 0; +} + +static void cleanup_async_eq(struct dh_core_dev *dev, + struct dh_eq_async *eq, const char *name) +{ + dh_eq_disable(dev, &eq->core, &eq->irq_nb); +} + +static void destroy_async_eqs(struct dh_core_dev *dev) +{ + struct dh_eq_table *table = &dev->eq_table; + struct dh_mpf_eq_table *table_priv = table->priv; + + cleanup_async_eq(dev, &table_priv->async_risc_eq, "riscv"); + cleanup_async_eq(dev, &table_priv->async_pf_eq, "pf"); + cleanup_async_eq(dev, &table_priv->async_eq1, "eq1"); + cleanup_async_eq(dev, &table_priv->async_eq2, "eq2"); + cleanup_async_eq(dev, &table_priv->async_eq3, "eq3"); + cleanup_async_eq(dev, &table_priv->async_eq4, "eq4"); + destroy_async_eq(dev); + dh_irqs_release_vectors(&table_priv->async_risc_irq, 1); + dh_irqs_release_vectors(&table_priv->async_pf_irq, 1); + dh_irqs_release_vectors(&table_priv->async_irq1, 1); + dh_irqs_release_vectors(&table_priv->async_irq2, 1); + dh_irqs_release_vectors(&table_priv->async_irq3, 1); + dh_irqs_release_vectors(&table_priv->async_irq4, 1); +} + +void destroy_comp_eqs(struct dh_core_dev *dev) +{ + +} + +#ifdef CONFIG_ZF_GDMA +static void destroy_gdma_eqs(struct dh_core_dev *dev) +{ + struct dh_eq_table *eq_table = &dev->eq_table; + struct dh_mpf_eq_table *mpf_eq_table = eq_table->priv; + struct dh_irq_table *irq_table = &dev->irq_table; + struct dh_mpf_irq_table *mpf_irq_table = irq_table->priv; + + cleanup_gdma_eq(dev, mpf_eq_table, ZXDH_MPF_GDMA_IRQ_NUM); + + dh_irq_affinity_irqs_release(mpf_irq_table->mpf_gdma_pool, mpf_eq_table->gdma_irqs, ZXDH_MPF_GDMA_IRQ_NUM); + dh_irqs_release_vectors(mpf_eq_table->gdma_irqs, ZXDH_MPF_GDMA_IRQ_NUM); +} +#endif + +void dh_mpf_eq_table_destroy(struct dh_core_dev *dev) +{ + destroy_comp_eqs(dev); + destroy_async_eqs(dev); +#ifdef CONFIG_ZF_GDMA + destroy_gdma_eqs(dev); +#endif +} + +int32_t dh_mpf_eq_table_create(struct dh_core_dev *dev) +{ + int32_t err = 0; + + err = create_async_eqs(dev); + if (err != 0) + { + dh_err(dev, "Failed to create async EQs\n"); + goto err_async_eqs; + } + + err = create_comp_eqs(dev); + if (err != 0) + { + dh_err(dev, "Failed to create completion EQs\n"); + goto err_comp_eqs; + } + +#ifdef CONFIG_ZF_GDMA + err = create_gdma_eqs(dev); + if (err != 0) + { + dh_err(dev, "Failed to create gdma EQs\n"); + goto err_comp_eqs; + } +#endif + + return 0; + +err_comp_eqs: + destroy_async_eqs(dev); +err_async_eqs: + return err; +} + +/*create eventq*/ +static int32_t create_async_eq(struct dh_core_dev *dev, struct dh_irq *risc, struct dh_irq *pf) +{ + struct dh_eq_table *eq_table = &dev->eq_table; + struct dh_en_mpf_dev *mpf_dev = dh_core_priv(dev); + struct msix_para in = {0}; + int32_t err = 0; + + in.vector_risc = risc->index; + in.vector_pfvf = pf->index; + in.vector_mpf = 0xff; + in.driver_type = MSG_CHAN_END_PF;//TODO + in.pdev = dev->pdev; + in.virt_addr = mpf_dev->pci_ioremap_addr + ZXDH_BAR1_CHAN_OFFSET; + in.pcie_id = mpf_dev->pcie_id; + DH_LOG_INFO(MODULE_MPF, "pcie_id = 0x%x\n", mpf_dev->pcie_id); + + mutex_lock(&eq_table->lock); + + err = zxdh_bar_enable_chan(&in, &mpf_dev->vport); + + mutex_unlock(&eq_table->lock); + + return err; +} + +static int32_t dh_eq_async_riscv_int(struct notifier_block *nb, unsigned long action, void *data) +{ + struct dh_eq_async *eq_riscv_async = container_of(nb, struct dh_eq_async, irq_nb); + struct dh_core_dev *dev = (struct dh_core_dev *)eq_riscv_async->priv; + struct dh_eq_table *eq_table = &dev->eq_table; + + atomic_notifier_call_chain(&eq_table->nh[DH_EVENT_TYPE_NOTIFY_RISC_TO_MPF], DH_EVENT_TYPE_NOTIFY_RISC_TO_MPF, NULL); + + return 0; +} + +static int32_t dh_eq_async_mpf_int(struct notifier_block *nb, unsigned long action, void *data) +{ + struct dh_eq_async *eq_riscv_async = container_of(nb, struct dh_eq_async, irq_nb); + struct dh_core_dev *dev = (struct dh_core_dev *)eq_riscv_async->priv; + struct dh_eq_table *eq_table = &dev->eq_table; + + atomic_notifier_call_chain(&eq_table->nh[DH_EVENT_TYPE_NOTIFY_PF_TO_MPF], DH_EVENT_TYPE_NOTIFY_PF_TO_MPF, NULL); + + return 0; +} + +static int32_t dh_eq_async_int1(struct notifier_block *nb, unsigned long action, void *data) +{ + struct dh_eq_async *eq_riscv_async = container_of(nb, struct dh_eq_async, irq_nb); + struct dh_core_dev *dev = (struct dh_core_dev *)eq_riscv_async->priv; + struct dh_eq_table *eq_table = &dev->eq_table; + + atomic_notifier_call_chain(&eq_table->nh[DH_EVENT_TYPE_NOTIFY_1], DH_EVENT_TYPE_NOTIFY_1, dev); + + return 0; +} + +static int32_t dh_eq_async_int2(struct notifier_block *nb, unsigned long action, void *data) +{ + struct dh_eq_async *eq_riscv_async = container_of(nb, struct dh_eq_async, irq_nb); + struct dh_core_dev *dev = (struct dh_core_dev *)eq_riscv_async->priv; + struct dh_eq_table *eq_table = &dev->eq_table; + + atomic_notifier_call_chain(&eq_table->nh[DH_EVENT_TYPE_NOTIFY_2], DH_EVENT_TYPE_NOTIFY_2, dev); + + return 0; +} + +static int32_t dh_eq_async_int3(struct notifier_block *nb, unsigned long action, void *data) +{ + struct dh_eq_async *eq_riscv_async = container_of(nb, struct dh_eq_async, irq_nb); + struct dh_core_dev *dev = (struct dh_core_dev *)eq_riscv_async->priv; + struct dh_eq_table *eq_table = &dev->eq_table; + + atomic_notifier_call_chain(&eq_table->nh[DH_EVENT_TYPE_NOTIFY_3], DH_EVENT_TYPE_NOTIFY_3, dev); + + return 0; +} + +static int32_t dh_eq_async_int4(struct notifier_block *nb, unsigned long action, void *data) +{ + struct dh_eq_async *eq_riscv_async = container_of(nb, struct dh_eq_async, irq_nb); + struct dh_core_dev *dev = (struct dh_core_dev *)eq_riscv_async->priv; + struct dh_eq_table *eq_table = &dev->eq_table; + + atomic_notifier_call_chain(&eq_table->nh[DH_EVENT_TYPE_NOTIFY_4], DH_EVENT_TYPE_NOTIFY_4, dev); + + return 0; +} + +static int32_t create_async_eqs(struct dh_core_dev *dev) +{ + struct dh_eq_table *table = &dev->eq_table; + struct dh_mpf_eq_table *table_priv = table->priv; + struct dh_eq_param param = {}; + int32_t err = 0; + + dh_dbg(dev, "start\r\n"); + table_priv->async_risc_irq = dh_mpf_async_irq_request(dev); + if (IS_ERR_OR_NULL(table_priv->async_risc_irq)) + { + dh_err(dev, "Failed to get async_risc_irq\n"); + return PTR_ERR(table_priv->async_risc_irq); + } + + table_priv->async_pf_irq = dh_mpf_async_irq_request(dev); + if (IS_ERR_OR_NULL(table_priv->async_pf_irq)) + { + err = PTR_ERR(table_priv->async_pf_irq); + dh_err(dev, "Failed to get async_pf_irq\n"); + goto err_irq_request; + } + + table_priv->async_irq1 = dh_mpf_async_irq_request(dev); + if (IS_ERR_OR_NULL(table_priv->async_irq1)) + { + err = PTR_ERR(table_priv->async_irq1); + dh_err(dev, "Failed to get async_irq1\n"); + goto err_irq_request1; + } + + table_priv->async_irq2 = dh_mpf_async_irq_request(dev); + if (IS_ERR_OR_NULL(table_priv->async_irq2)) + { + err = PTR_ERR(table_priv->async_irq2); + dh_err(dev, "Failed to get async_irq2\n"); + goto err_irq_request2; + } + + table_priv->async_irq3 = dh_mpf_async_irq_request(dev); + if (IS_ERR_OR_NULL(table_priv->async_irq3)) + { + err = PTR_ERR(table_priv->async_irq3); + dh_err(dev, "Failed to get async_irq3\n"); + goto err_irq_request3; + } + + table_priv->async_irq4 = dh_mpf_async_irq_request(dev); + if (IS_ERR_OR_NULL(table_priv->async_irq4)) + { + err = PTR_ERR(table_priv->async_irq4); + dh_err(dev, "Failed to get async_irq4\n"); + goto err_irq_request4; + } + + err = create_async_eq(dev, table_priv->async_risc_irq, table_priv->async_pf_irq); + if (err != 0) + { + dh_err(dev, "Failed to create async_eq\n"); + goto err_create_async_eq; + } + + param = (struct dh_eq_param) { + .irq = table_priv->async_risc_irq, + .nent = 10, + .event_type = DH_EVENT_QUEUE_TYPE_RISCV /* used for inform dpu */ + }; + err = setup_async_eq(dev, &table_priv->async_risc_eq, ¶m, dh_eq_async_riscv_int, "riscv", dev); + if (err != 0) + { + dh_err(dev, "Failed to setup async_risc_eq\n"); + goto err_setup_async_risc_eq; + } + + param.irq = table_priv->async_pf_irq, + err = setup_async_eq(dev, &table_priv->async_pf_eq, ¶m, dh_eq_async_mpf_int, "pf", dev); + if (err != 0) + { + dh_err(dev, "Failed to setup async_pf_eq\n"); + goto err_setup_async_pf_eq; + } + + param.irq = table_priv->async_irq1, + err = setup_async_eq(dev, &table_priv->async_eq1, ¶m, dh_eq_async_int1, "irq1", dev); + if (err != 0) + { + dh_err(dev, "Failed to setup async_eq1\n"); + goto err_setup_async_eq1; + } + + param.irq = table_priv->async_irq2, + err = setup_async_eq(dev, &table_priv->async_eq2, ¶m, dh_eq_async_int2, "irq2", dev); + if (err != 0) + { + dh_err(dev, "Failed to setup async_eq1\n"); + goto err_setup_async_eq2; + } + + param.irq = table_priv->async_irq3, + err = setup_async_eq(dev, &table_priv->async_eq3, ¶m, dh_eq_async_int3, "irq3", dev); + if (err != 0) + { + dh_err(dev, "Failed to setup async_eq3\n"); + goto err_setup_async_eq3; + } + + param.irq = table_priv->async_irq4, + err = setup_async_eq(dev, &table_priv->async_eq4, ¶m, dh_eq_async_int4, "irq4", dev); + if (err != 0) + { + dh_err(dev, "Failed to setup async_eq4\n"); + goto err_setup_async_eq4; + } + + return 0; + +err_setup_async_eq4: + cleanup_async_eq(dev, &table_priv->async_eq3, "irq3"); +err_setup_async_eq3: + cleanup_async_eq(dev, &table_priv->async_eq2, "irq2"); +err_setup_async_eq2: + cleanup_async_eq(dev, &table_priv->async_eq1, "irq1"); +err_setup_async_eq1: + cleanup_async_eq(dev, &table_priv->async_pf_eq, "pf"); +err_setup_async_pf_eq: + cleanup_async_eq(dev, &table_priv->async_risc_eq, "riscv"); +err_setup_async_risc_eq: + destroy_async_eq(dev); +err_create_async_eq: + dh_irqs_release_vectors(&table_priv->async_irq4, 1); +err_irq_request4: + dh_irqs_release_vectors(&table_priv->async_irq3, 1); +err_irq_request3: + dh_irqs_release_vectors(&table_priv->async_irq2, 1); +err_irq_request2: + dh_irqs_release_vectors(&table_priv->async_irq1, 1); +err_irq_request1: + dh_irqs_release_vectors(&table_priv->async_pf_irq, 1); +err_irq_request: + dh_irqs_release_vectors(&table_priv->async_risc_irq, 1); + return err; +} + +#ifdef CONFIG_ZF_GDMA +void cleanup_gdma_eq(struct dh_core_dev *dev, struct dh_mpf_eq_table *table_priv, uint16_t num) +{ + uint16_t i = 0; + + for (i = 0; i < num; i++) + { + cleanup_async_eq(dev, &table_priv->gdma_eq[i], NULL); + } +} + +int32_t setup_gdma_eq(struct dh_core_dev *dev, struct dh_mpf_eq_table *table_priv, uint16_t gdma_irq_num) +{ + struct dh_en_mpf_dev *mpf_dev = dh_core_priv(dev); + struct zf_gdma_dev *gdev = mpf_dev->gdev; + struct dh_eq_param param = {}; + uint16_t i = 0; + int32_t ret = 0; + void *priv = NULL; + notifier_fn_t callback; + + if (gdma_irq_num > ZXDH_MPF_GDMA_IRQ_NUM) + { + dh_err(dev, "gdma_irq_num %d is invalid\n", gdma_irq_num); + return -1; + } + + for (i = 0; i < gdma_irq_num; i++) + { + if (i < ZF_GDMA_CHAN_NUM) + { + callback = zf_gdma_chan_irq_handle; + priv = &gdev->chan[i]; + } + else + { + callback = zf_gdma_err_irq_handle; + priv = dev; + } + + param.irq = table_priv->gdma_irqs[i]; + ret = setup_async_eq(dev, &table_priv->gdma_eq[i], ¶m, callback, "gdma", priv); + if (ret != 0) + { + LOG_ERR("Failed to setup gdma %d eq\n", i); + cleanup_gdma_eq(dev, table_priv, i); + return ret; + } + } + + return 0; +} + +static int32_t create_gdma_eqs(struct dh_core_dev *dev) +{ + struct dh_eq_table *eq_table = &dev->eq_table; + struct dh_mpf_eq_table *mpf_eq_table = eq_table->priv; + struct dh_irq_table *irq_table = &dev->irq_table; + struct dh_mpf_irq_table *mpf_irq_table = irq_table->priv; + int32_t ret = 0; + + mpf_eq_table->gdma_irqs = kcalloc(ZXDH_MPF_GDMA_IRQ_NUM, sizeof(struct dh_irq *), GFP_KERNEL); + if (unlikely(mpf_eq_table->gdma_irqs == NULL)) + { + LOG_ERR("Failed to alloc mpf_eq_table->gdma_irqs\n"); + return -ENOMEM; + } + + ret = dh_irq_affinity_irqs_request_auto(mpf_irq_table->mpf_gdma_pool, mpf_eq_table->gdma_irqs, ZXDH_MPF_GDMA_IRQ_NUM); + if (ret < 0) + { + dh_err(dev, "Failed to get gdma irq\n"); + goto err_gdma_irq; + } + + ret = setup_gdma_eq(dev, mpf_eq_table, ZXDH_MPF_GDMA_IRQ_NUM); + if (ret != 0) + { + goto err_gdma_eq; + } + + return 0; + +err_gdma_eq: + dh_irq_affinity_irqs_release(mpf_irq_table->mpf_gdma_pool, mpf_eq_table->gdma_irqs, ZXDH_MPF_GDMA_IRQ_NUM); + dh_irqs_release_vectors(mpf_eq_table->gdma_irqs, ZXDH_MPF_GDMA_IRQ_NUM); +err_gdma_irq: + kfree(mpf_eq_table->gdma_irqs); + return ret; +} +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/eq.h b/src/net/drivers/net/ethernet/dinghai/zf_mpf/eq.h new file mode 100755 index 0000000..4aaaaae --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/eq.h @@ -0,0 +1,19 @@ +#ifndef __ZXDH_MPF_EQ_H__ +#define __ZXDH_MPF_EQ_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +int32_t dh_mpf_eq_table_init(struct dh_core_dev *dev); + +int32_t dh_mpf_eq_table_create(struct dh_core_dev *dev); +void dh_mpf_eq_table_destroy(struct dh_core_dev *dev); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hotplug.c b/src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hotplug.c new file mode 100644 index 0000000..77f0f3d --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hotplug.c @@ -0,0 +1,224 @@ +#include +#include "fuc_hotplug.h" +#include "fuc_hotplug_commom.h" + +extern int zxdh_bar_chan_sync_msg_send(struct zxdh_pci_bar_msg *in, struct zxdh_msg_recviver_mem *result); +extern int get_fuc_hp_ret(void); +extern int reset_fuc_hp_ret(void); +static int fuc_hotplug_trigger(u64 arg); +static int fuc_hotplug_get_pf_state(u64 arg); +static int ep_hotplug(u64 arg); + +static struct func_sel ioctl_func_sel[] = { + {FUC_HP_IOCTL_CMD0, fuc_hotplug_trigger }, + {FUC_HP_IOCTL_CMD1, fuc_hotplug_get_pf_state }, + {FUC_HP_IOCTL_CMD2, ep_hotplug }, +}; + +static int pcie_mt_send_msg(void *msg_info, u32 msg_size, void *resp_msg, u32 resp_size) +{ + struct zxdh_pci_bar_msg in = {0}; + struct zxdh_msg_recviver_mem result = {0}; + struct pci_dev *pdev = NULL; + void __iomem *bar_virt_addr = NULL; + u16 ret = 0, pcie_id = 0; + u64 bar_addr = 0; + + if (msg_info == NULL) + { + DH_LOG_ERR(MODULE_FUC_HP, "The msg_info is NULL\n"); + return -EINVAL; + } + + pdev = pci_get_device(FUC_HP_VENDOR_ID, FUC_HP_DEVICE_ID, NULL); + if (pdev == NULL) + { + DH_LOG_ERR(MODULE_FUC_HP, "Can not find devices: deviceID %x, VendorID: %x\n", FUC_HP_VENDOR_ID, FUC_HP_DEVICE_ID); + return -EINVAL; + } + + bar_addr = pci_resource_start(pdev, 0); + DH_LOG_INFO(MODULE_FUC_HP, "bar_addr->0x%llx\n", bar_addr); + bar_virt_addr = ioremap(bar_addr, FUC_HP_IOREMAP_SIZE); + + /* 填充用户参数in */ + in.virt_addr = (u64)bar_virt_addr + FUC_HP_BAR_MSG_OFFSET; /* 使用PF1的bar0偏移8k */ + in.payload_addr = msg_info; /* 消息静荷buffer地址 */ + in.payload_len = msg_size; /* 消息长度 */ + in.src = MSG_CHAN_END_PF; /* 从mpf通道下发 */ + in.dst = MSG_CHAN_END_RISC; /* 消息发到risc */ + in.event_id = FUC_HP_EVENT_ID; /* 调用PCIE的消息处理函数 */ + in.src_pcieid = pcie_id; + + result.buffer_len = BUF_SIZE; /* 用户准备一个存放消息回复的buffer, buffer长度 */ + result.recv_buffer = kmalloc(result.buffer_len, GFP_KERNEL); /* 消息回复buffer地址 */ + if (!result.recv_buffer) + { + DH_LOG_ERR(MODULE_FUC_HP, "Failed to allocate recv_buffer\n"); + return -EINVAL; + } + + memset(result.recv_buffer, 0, result.buffer_len); + + ret = zxdh_bar_chan_sync_msg_send(&in, &result); /* 发送同步消息 */ + + iounmap(bar_virt_addr); + + /* 如果接口返回值不为0,则说明消息失败 */ + if (ret != 0) + { + DH_LOG_ERR(MODULE_FUC_HP, "pcie send msg failed, ret:%d.\n", ret); + goto exit; + } + + /* 如果消息发送成功, 从recv_buffer + 1的位置往后两字节取回复数据长度, recv_buffer + 4的位置开始取数据内容 */ + if (*((u8 *)(result.recv_buffer + 4)) == 0x1) + { + memcpy(resp_msg, result.recv_buffer + 4, resp_size); + ret = 0; + } + else + { + DH_LOG_ERR(MODULE_FUC_HP, "pcie result failed!\n"); + ret = -EINVAL; + } + +exit: + kfree(result.recv_buffer); + result.recv_buffer = NULL; + return ret; +} + +static int fuc_hotplug_trigger(u64 arg) +{ + int ret = 0; + int resp_msg = 0; + struct fuc_hotplug_bar_msg fuc_hotplug_bar_msg = {0}; + + if (copy_from_user(&fuc_hotplug_bar_msg, (void __user *)arg, sizeof(struct fuc_hotplug_bar_msg))) + { + DH_LOG_ERR(MODULE_FUC_HP, "Can not copy from user\n"); + return -EFAULT; + } + + ret = pcie_mt_send_msg(&fuc_hotplug_bar_msg, sizeof(struct fuc_hotplug_bar_msg), &resp_msg, sizeof(int)); + if (ret != 0) + { + DH_LOG_ERR(MODULE_FUC_HP, "send failed\n"); + fuc_hotplug_bar_msg.cpl_chk = FUC_HP_RET_FAILED; + } + else + { + fuc_hotplug_bar_msg.cpl_chk = FUC_HP_RET_FINISH; + } + + if (copy_to_user((void __user *)arg, &fuc_hotplug_bar_msg, sizeof(struct fuc_hotplug_bar_msg))) + { + DH_LOG_ERR(MODULE_FUC_HP, "Can not copy to user\n"); + ret = -EFAULT; + } + + return ret; +} + +static int fuc_hotplug_get_pf_state(u64 arg) +{ + int ret = FUC_HP_OK; + struct get_pf_state_resp get_pf_state_resp = {0}; + struct get_pf_state_info get_pf_state_info = {0}; + + if (copy_from_user(&get_pf_state_info, (void __user *)arg, sizeof(struct get_pf_state_info))) + { + DH_LOG_ERR(MODULE_FUC_HP, "Can not copy from user\n"); + return -EFAULT; + } + + ret = pcie_mt_send_msg(&get_pf_state_info, sizeof(struct get_pf_state_info), (void *)&get_pf_state_resp, sizeof(struct get_pf_state_resp)); + if (ret) + { + DH_LOG_ERR(MODULE_FUC_HP, "Remote test failed\n"); + goto finish; + } + + if (get_pf_state_info.ep_no >= MAX_FUCTION_HOTPLUG_EP_NUMS) + { + DH_LOG_ERR(MODULE_FUC_HP, "Invalid ep_id\n"); + ret = -EINVAL; + goto finish; + } + + get_pf_state_info.cpl_chk = ( get_pf_state_resp.pf_state_of_ep[get_pf_state_info.ep_no] >> get_pf_state_info.pf_no) & 0x1; + if (copy_to_user((void __user *)arg, &get_pf_state_info, sizeof(struct get_pf_state_info))) + { + DH_LOG_ERR(MODULE_FUC_HP, "Can not copy to user\n"); + ret = -EFAULT; + } + + return ret; + +finish: + get_pf_state_info.cpl_chk = FUNCTION_INVALID_TYPE; + if (copy_to_user((void __user *)arg, &get_pf_state_info, sizeof(struct get_pf_state_info))) + { + DH_LOG_ERR(MODULE_FUC_HP, "Can not copy to user\n"); + ret = -EFAULT; + } + + return ret; +} + +static int ep_hotplug(u64 arg) +{ + int ret = FUC_HP_OK; + struct ep_hotplug_resp ep_hotplug_resp = {0}; + struct ep_hotplug_info ep_hotplug_info = {0}; + + if (copy_from_user(&ep_hotplug_info, (void __user *)arg, sizeof(struct ep_hotplug_info))) + { + DH_LOG_ERR(MODULE_FUC_HP, "Can not copy from user\n"); + return -EFAULT; + } + + ret = pcie_mt_send_msg(&ep_hotplug_info, sizeof(struct ep_hotplug_info), (void *)&ep_hotplug_resp, sizeof(struct ep_hotplug_resp)); + if (ret) + { + DH_LOG_ERR(MODULE_FUC_HP, "Remote test failed\n"); + goto finish; + } + + ep_hotplug_info.cpl_chk = FUC_HP_RET_FINISH; + if (copy_to_user((void __user *)arg, &ep_hotplug_info, sizeof(struct ep_hotplug_info))) + { + DH_LOG_ERR(MODULE_FUC_HP, "Can not copy to user\n"); + ret = -EFAULT; + } + + return ret; + +finish: + ep_hotplug_info.cpl_chk = FUC_HP_RET_FAILED; + if (copy_to_user((void __user *)arg, &ep_hotplug_info, sizeof(struct ep_hotplug_info))) + { + DH_LOG_ERR(MODULE_FUC_HP, "Can not copy to user\n"); + ret = -EFAULT; + } + + return ret; +} + + +long fuc_hp_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + u32 i = 0; + u32 ioctl_func_nums = sizeof(ioctl_func_sel) / sizeof(struct func_sel); + + for (i = 0; i < ioctl_func_nums; i++) + { + if (ioctl_func_sel[i].cmd == cmd) + { + return ioctl_func_sel[i].ioctl_func(arg); + } + } + + return -EINVAL; +} diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hotplug.h b/src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hotplug.h new file mode 100644 index 0000000..d2ec80b --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hotplug.h @@ -0,0 +1,62 @@ +#ifndef _FUC_HOTPLUG_H_ +#define _FUC_HOTPLUG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define FUC_HP_EVENT_ID 44 +#define BUF_SIZE 0x1000 + +/* bar消息通道使用pf信息 */ +#define FUC_HP_BAR_MSG_OFFSET (0x2000) +#define FUC_HP_VENDOR_ID (0x1cf2) +#define FUC_HP_DEVICE_ID (0x8044) +#define FUC_HP_IOREMAP_SIZE (0x3000) + +#define FUC_HP_POLLING_SPAN 100 +#define FUC_HP_TIMEOUT_TH 3000 + +/* data type */ +typedef unsigned long long int u64; +typedef signed long long int s64; + +typedef unsigned int u32; +typedef signed int s32; + +typedef unsigned short int u16; +typedef signed short int s16; + +typedef unsigned char u8; +typedef signed char s8; + +struct func_sel { + unsigned int cmd; + int (*ioctl_func)(unsigned long long arg); +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hotplug_commom.h b/src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hotplug_commom.h new file mode 100644 index 0000000..c759a56 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hotplug_commom.h @@ -0,0 +1,79 @@ +#ifndef __FUC_HOTPLUG_COMMOM_H +#define __FUC_HOTPLUG_COMMOM_H + +#define ARG_START_NO 3 +#define ARG_TYPE_NO 1 +#define FUC_HP_OK 0 +#define FUC_HP_FAILED -1 + + +#define FUC_HP_IOCTL_TYPE '>' +#define FUC_HP_IOCTL_MAGIC 117 /* random */ +#define FUC_HP_IOCTL_CMD0 (_IO(FUC_HP_IOCTL_TYPE, FUC_HP_IOCTL_MAGIC + 0)) +#define FUC_HP_IOCTL_CMD1 (_IO(FUC_HP_IOCTL_TYPE, FUC_HP_IOCTL_MAGIC + 1)) +#define FUC_HP_IOCTL_CMD2 (_IO(FUC_HP_IOCTL_TYPE, FUC_HP_IOCTL_MAGIC + 2)) + +#define MIN_EP_ID 5 +#define MAX_FUCTION_HOTPLUG_EP_NUMS 4 + +#define FUC_HOTPLUG_MEMBER_NUMS 10 +struct fuc_hotplug_bar_msg { + unsigned int cmd; + unsigned int fuc_hotplug_info; + unsigned int timeout; + unsigned int cpl_chk; +}; + +#define FUC_HOTPLUG_TIMEOUT_NUMS 1 +struct fuc_hotplug_set_timeout { + unsigned int timeout; + unsigned int cpl_chk; +}; + +struct get_pf_state_info { + unsigned int cmd; + unsigned int ep_no; + unsigned int pf_no; + unsigned int cpl_chk; +}; + +struct get_pf_state_resp { + uint8_t check_cpl; + uint8_t pf_state_of_ep[MAX_FUCTION_HOTPLUG_EP_NUMS]; +}; + +#define EP_HOTPLUG_MEMBER_NUMS 4 +struct ep_hotplug_info { + unsigned int cmd; + unsigned int ops_type; + unsigned int ep_no; + unsigned int cpl_chk; +}; + +struct ep_hotplug_resp { + uint8_t check_cpl; +}; + + +typedef enum { + FUC_HP_RET_TIMEOUT = 0, + FUC_HP_RET_FINISH, + FUC_HP_RET_FAILED, + INVALID_FUC_HP_RETURE +} FUC_HP_RETURE; + +typedef enum { + FUNCTION_REMOVE = 1, + FUNCTION_INSERT, + FUNCTION_INVALID_TYPE, +} FUNCTION_HP_TYPE; + +typedef enum { + FUC_HP_BAR_MSG_CMD = 1, + USED_BY_HOST_HP, + GET_STATE_BAR_MSG_CMD, + EP_HP_BAR_MSG_CMD, + INVALID_CMD, +} HOTPLUG_CMD; + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hotplug_ioctl.c b/src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hotplug_ioctl.c new file mode 100644 index 0000000..af486e0 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hotplug_ioctl.c @@ -0,0 +1,76 @@ +#include "fuc_hotplug_ioctl.h" +#include "fuc_hotplug_commom.h" + +static dev_t dev; +static struct cdev c_dev; +static struct class *cl; + +extern long fuc_hp_ioctl(struct file *filp, unsigned int cmd, unsigned long arg); + +static int fuc_hp_open(struct inode *inode, struct file *file) +{ + if (inode->i_private) + { + file->private_data = inode->i_private; + } + + return FUC_HP_OK; +} + +static int fuc_hp_dev_release(struct inode *i, struct file *f) +{ + DH_LOG_INFO(MODULE_FUC_HP, "fuc_hp device released!\n"); + return FUC_HP_OK; +} + +static struct file_operations fuc_hp_fops = +{ + .owner = THIS_MODULE, + .open = fuc_hp_open, + .release = fuc_hp_dev_release, + .unlocked_ioctl = fuc_hp_ioctl, +}; + +int zxdh_host_fuc_hotplug_driver_init(void) +{ + int ret = FUC_HP_OK; + + if (alloc_chrdev_region(&dev, 0, 1, DEVICE_NAME) < 0) + { + return -EBUSY; + } + + if ((cl = class_create(THIS_MODULE, CLASS_NAME)) == NULL) + { + unregister_chrdev_region(dev, 1); + return -ENOMEM; + } + + if (device_create(cl, NULL, dev, NULL, DEVICE_NAME) == NULL) + { + class_destroy(cl); + unregister_chrdev_region(dev, 1); + return -ENOMEM; + } + + cdev_init(&c_dev, &fuc_hp_fops); + + if (cdev_add(&c_dev, dev, 1) == FUC_HP_FAILED) + { + device_destroy(cl, dev); + class_destroy(cl); + unregister_chrdev_region(dev, 1); + return -ENOMEM; + } + DH_LOG_INFO(MODULE_FUC_HP, "fuction_hotplug device registered\n"); + return ret; +} + +void zxdh_host_fuc_hotplug_driver_exit(void) +{ + cdev_del(&c_dev); + device_destroy(cl, dev); + class_destroy(cl); + unregister_chrdev_region(dev, 1); + DH_LOG_INFO(MODULE_FUC_HP, "fuc_hp device unregistered\n"); +} \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hotplug_ioctl.h b/src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hotplug_ioctl.h new file mode 100644 index 0000000..58eb6e6 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hotplug_ioctl.h @@ -0,0 +1,20 @@ +#ifndef __DPU_FUC_HOTPLUG_IOCTL_H +#define __DPU_FUC_HOTPLUG_IOCTL_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DEVICE_NAME "fuc_hp_ioctl" +#define CLASS_NAME "fuc_hp_class" + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hp_app/build.sh b/src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hp_app/build.sh new file mode 100755 index 0000000..724f8d5 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hp_app/build.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +# 按需选择是否需要静态编译 +gcc fuc_hp_app.c -o dpu_hotplug +# gcc -static gcc fuc_hp_app.c -o dpu_hotplug diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hp_app/fuc_hp_app.c b/src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hp_app/fuc_hp_app.c new file mode 100644 index 0000000..940ad51 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hp_app/fuc_hp_app.c @@ -0,0 +1,271 @@ +#include "fuc_hp_app.h" +#include "../fuc_hotplug_commom.h" + +static int printf_usage(int argc, char *argv[]); +static int fuc_hp(int argc, char *argv[]); +static int ep_hp(int argc, char *argv[]); + +static int printf_usage(int argc, char *argv[]) +{ + printf("** dpu_hotplug -s fuc -e epid -p pfid -v vfid -o add/del -t time \n"); + printf("** -s 指定拔插场景,fuction级热插拔固定输入:fuc \n"); + printf("** -e 指定epid \n"); + printf("** -p 指定pfid \n"); + printf("** -v 指定vfid, vfid为0,表示pf \n"); + printf("** vfid > 0,表示vf,vfid_real = vfid - 1 \n"); + printf("** -o 指定插拔操作, add 插入,del 拔出 \n"); + printf("** -t 指定超时时间,单位:s \n"); + printf("** \n"); + printf("** dpu_hotplug -s ep -e epid -o add/del \n"); + printf("** -s 指定拔插场景,ep级热插拔固定输入:ep \n"); + printf("** -e 指定epid \n"); + printf("** -o 指定插拔操作, add 插入,del 拔出 \n"); + return FUC_HP_OK; +}; + +struct fuc_hp_app_input fuc_hp_app_input[] = { + /* ops_type ops_value*/ + {"-e", 0}, + {"-p", 0}, + {"-v", 0}, + {"-o", 0}, + {"-t", 0} +}; + +struct fuc_hp_app_input ep_hp_app_input[] = { + /* ops_type ops_value*/ + {"-e", 0}, + {"-o", 0}, +}; + +static int parse_fuc_hp_input(struct fuc_hotplug_bar_msg *fuc_hotplug_bar_msg) +{ + fuc_hotplug_bar_msg->fuc_hotplug_info = ((fuc_hp_app_input[EP_ID].input_value + MIN_EP_ID) << FUNC_HP_EP_ID_START_BIT) + | (fuc_hp_app_input[PF_ID].input_value << FUNC_HP_PF_ID_START_BIT); + + if (fuc_hp_app_input[VF_ID].input_value != 0) + { + fuc_hotplug_bar_msg->fuc_hotplug_info |= ((fuc_hp_app_input[2].input_value - 1) << FUNC_HP_VF_ID_START_BIT); + fuc_hotplug_bar_msg->fuc_hotplug_info |= (1 << FUNC_HP_FUNC_TYPE_START_BIT); + } + + if (fuc_hp_app_input[OPS_ID].input_value != 0) + { + fuc_hotplug_bar_msg->fuc_hotplug_info |= (fuc_hp_app_input[OPS_ID].input_value << FUNC_HP_SCENE_CODE_START_BIT); + } + else + { + return FUC_HP_FAILED; + } + + fuc_hotplug_bar_msg->timeout = fuc_hp_app_input[TIMEOUT_ID].input_value; + + printf("value:0x%x timeout:%ds\n", fuc_hotplug_bar_msg->fuc_hotplug_info, fuc_hotplug_bar_msg->timeout); + + return FUC_HP_OK; +} + +static int fuc_hp(int argc, char *argv[]) +{ + int ret = FUC_HP_OK; + int fd = 0; + int arg_no = ARG_START_NO; + int input_no = 0; + char *stop_at = NULL; + struct fuc_hotplug_bar_msg *fuc_hotplug_bar_msg = NULL; + + fuc_hotplug_bar_msg = malloc(sizeof(struct fuc_hotplug_bar_msg)); + + fuc_hotplug_bar_msg->fuc_hotplug_info = 0; + + if (argc != FUC_HOTPLUG_MEMBER_NUMS + ARG_START_NO) + { + printf("[%s]: Invalid argument count %d\n", __func__, argc); + printf_usage(argc, argv); + goto failed; + } + + while (arg_no < argc) + { + if (strcmp(argv[arg_no++], fuc_hp_app_input[input_no].input_type) == 0) + { + if (input_no == OPS_ID) + { + fuc_hp_app_input[input_no++].input_value = strcmp(argv[arg_no], "add") == 0 ? FUNCTION_INSERT : + strcmp(argv[arg_no], "del") == 0 ? FUNCTION_REMOVE : 0; + arg_no++; + } + else + { + fuc_hp_app_input[input_no++].input_value = strtoul(argv[arg_no++], &stop_at, 0); + } + } + else + { + printf("[%s]: Invalid input %s\n", __func__, fuc_hp_app_input[input_no].input_type); + printf_usage(argc, argv); + goto failed; + } + } + + ret = parse_fuc_hp_input(fuc_hotplug_bar_msg); + if(ret != FUC_HP_OK) + { + printf_usage(argc, argv); + goto failed; + } + + fuc_hotplug_bar_msg->cmd = FUC_HP_BAR_MSG_CMD; + + fd = open(FUC_HP_IOCTRL_DEV_NAME, O_RDWR, 0); + if (fd < 0) + { + printf("[%s]: Can not open %s \n", __func__, FUC_HP_IOCTRL_DEV_NAME); + goto failed; + } + + ret = ioctl(fd, FUC_HP_IOCTL_CMD0, fuc_hotplug_bar_msg); + if (ret) + { + printf("[%s]: ERR --> %d\n", __func__, ret); + goto finish; + } + + if (fuc_hotplug_bar_msg->cpl_chk == FUC_HP_RET_FINISH) + { + printf("[%s] fuction hotplug finish!!\n", __func__); + } + else if (fuc_hotplug_bar_msg->cpl_chk == FUC_HP_RET_FAILED) + { + printf("[%s] fuction hotplug failed!\n", __func__); + } + else + { + printf("[%s] fuction hotplug timeout!!!\n", __func__); + } + +finish: + free(fuc_hotplug_bar_msg); + fuc_hotplug_bar_msg = NULL; + close(fd); + return ret; + +failed: + free(fuc_hotplug_bar_msg); + fuc_hotplug_bar_msg = NULL; + return ret; +} + +static int ep_hp(int argc, char *argv[]) +{ + int ret = FUC_HP_OK; + int fd = 0; + int arg_no = ARG_START_NO; + int input_no = 0; + char *stop_at = NULL; + struct ep_hotplug_info *ep_hotplug_info = NULL; + + ep_hotplug_info = malloc(sizeof(struct ep_hotplug_info)); + + if (argc != EP_HOTPLUG_MEMBER_NUMS + ARG_START_NO) + { + printf("[%s]: Invalid argument count %d\n", __func__, argc); + printf_usage(argc, argv); + goto failed; + } + + while (arg_no < argc) + { + if (strcmp(argv[arg_no++], ep_hp_app_input[input_no].input_type) == 0) + { + if (input_no == E_OPS_ID) + { + ep_hp_app_input[input_no++].input_value = strcmp(argv[arg_no], "add") == 0 ? FUNCTION_INSERT : + strcmp(argv[arg_no], "del") == 0 ? FUNCTION_REMOVE : 0; + arg_no++; + } + else + { + ep_hp_app_input[input_no++].input_value = strtoul(argv[arg_no++], &stop_at, 0); + } + } + else + { + printf("[%s]: Invalid input %s\n", __func__, ep_hp_app_input[input_no].input_type); + printf_usage(argc, argv); + goto failed; + } + } + + ep_hotplug_info->cmd = EP_HP_BAR_MSG_CMD; + ep_hotplug_info->ep_no = ep_hp_app_input[E_EP_ID].input_value; + ep_hotplug_info->ops_type = ep_hp_app_input[E_OPS_ID].input_value; + + fd = open(FUC_HP_IOCTRL_DEV_NAME, O_RDWR, 0); + if (fd < 0) + { + printf("[%s]: Can not open %s \n", __func__, FUC_HP_IOCTRL_DEV_NAME); + goto failed; + } + + ret = ioctl(fd, FUC_HP_IOCTL_CMD2, ep_hotplug_info); + if (ret) + { + printf("[%s]: ERR --> %d\n", __func__, ret); + goto finish; + } + + if (ep_hotplug_info->cpl_chk == FUC_HP_RET_FINISH) + { + printf("[%s] ep hotplug finish!!\n", __func__); + } + else if (ep_hotplug_info->cpl_chk == FUC_HP_RET_FAILED) + { + printf("[%s] ep hotplug failed!\n", __func__); + } + else + { + printf("[%s] ep hotplug timeout!!!\n", __func__); + } + +finish: + free(ep_hotplug_info); + ep_hotplug_info = NULL; + close(fd); + return ret; + +failed: + free(ep_hotplug_info); + ep_hotplug_info = NULL; + return ret; +} + +int main(int argc, char *argv[]) +{ + int ret = 0; + int arg_no = ARG_TYPE_NO; + + if (argc < ARG_START_NO) + { + printf("[%s]: Invalid argument count %d\n", __func__, argc); + printf_usage(argc, argv); + ret = FUC_HP_FAILED; + goto failed; + } + + printf("start\n"); + if (strcmp(argv[arg_no++], "-s") == 0) + { + if (strcmp(argv[arg_no], "ep") == 0) + { + ret = ep_hp(argc, argv); + } + else if(strcmp(argv[arg_no], "fuc") == 0) + { + ret = fuc_hp(argc, argv); + } + } + +failed: + return ret; +} diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hp_app/fuc_hp_app.h b/src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hp_app/fuc_hp_app.h new file mode 100644 index 0000000..2770481 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/fuc_hotplug/fuc_hp_app/fuc_hp_app.h @@ -0,0 +1,51 @@ +#ifndef __DPMT_APP_H +#define __DPMT_APP_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "sys/ioctl.h" + +#define FUC_HP_IOCTRL_DEV_NAME "/dev/fuc_hp_ioctl" + + +#define FUNC_HP_SCENE_CODE_START_BIT 21 +#define FUNC_HP_FUNC_TYPE_START_BIT 20 +#define FUNC_HP_EP_ID_START_BIT 16 +#define FUNC_HP_PF_ID_START_BIT 12 +#define FUNC_HP_VF_ID_START_BIT 0 + +struct hp_app_func { + char *name; + int (*func)(int argc, char *argv[]); +}; + +struct fuc_hp_app_input { + char *input_type; + unsigned int input_value; +}; + +typedef enum { + EP_ID = 0, + PF_ID, + VF_ID, + OPS_ID, + TIMEOUT_ID, + INVALID_FUC_HP_INPUT +} FUC_HP_INPUT; + +typedef enum { + E_EP_ID = 0, + E_OPS_ID, + E_INVALID_FUC_HP_INPUT +} EP_HP_INPUT; + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/gdma.c b/src/net/drivers/net/ethernet/dinghai/zf_mpf/gdma.c new file mode 100644 index 0000000..8335534 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/gdma.c @@ -0,0 +1,550 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gdma.h" +#include "zf_mpf.h" + +/* + * User define: + * ep_id-bit[15:12] vfunc_num-bit[11:4] func_num-bit[3:1] vfunc_active-bit0 + * host ep_id:5~8 zf ep_id:9 + */ +#define ZF_GDMA_ZF_USER (0x9000) /* ep4 pf0 */ +#define ZF_GDMA_PF_NUM_SHIFT (1) +#define ZF_GDMA_VF_NUM_SHIFT (4) +#define ZF_GDMA_EP_ID_SHIFT (12) +#define ZF_GDMA_VF_EN (1) +#define ZF_GDMA_VF_MASK (1UL << 7) + +/* Register offset */ +#define ZF_GDMA_BASE_OFFSET (0x100000) +#define ZF_GDMA_CHAN_SHIFT (0x80) +#define ZF_GDMA_EXT_ADDR_OFFSET (0x218) +#define ZF_GDMA_SAR_LOW_OFFSET (0x200) +#define ZF_GDMA_DAR_LOW_OFFSET (0x204) +#define ZF_GDMA_SAR_HIGH_OFFSET (0x234) +#define ZF_GDMA_DAR_HIGH_OFFSET (0x238) +#define ZF_GDMA_XFERSIZE_OFFSET (0x208) +#define ZF_GDMA_CONTROL_OFFSET (0x230) +#define ZF_GDMA_TC_STATUS_OFFSET (0x0) +#define ZF_GDMA_STATUS_CLEAN_OFFSET (0x80) +#define ZF_GDMA_LINKADDR_LOW_OFFSET (0x21c) +#define ZF_GDMA_LINKADDR_HIGH_OFFSET (0x220) +#define ZF_GDMA_CHAN_CONTINUE_OFFSET (0x224) +#define ZF_GDMA_TC_CNT_OFFSET (0x23c) +#define ZF_GDMA_LLI_USER_OFFSET (0x228) +#define ZF_GDMA_PULSE_WIDTH_OFFSET (0x1ec) + +/* Control register */ +#define ZF_GDMA_CHAN_ENABLE (1UL) +#define ZF_GDMA_SOFT_CHAN (1UL << 1) +#define ZF_GDMA_TC_INTR_ENABLE (1UL << 4) +#define ZF_GDMA_ERR_INTR_ENABLE (1UL << 5) +#define ZF_GDMA_SBS_SHIFT (6) /* src burst size */ +#define ZF_GDMA_SBL_SHIFT (9) /* src burst length */ +#define ZF_GDMA_DBS_SHIFT (13) /* dest burst size */ +#define ZF_GDMA_BURST_SIZE_MIN (0x1) /* 1 byte */ +#define ZF_GDMA_BURST_SIZE_MEDIUM (0x4) /* 4 word */ +#define ZF_GDMA_BURST_SIZE_MAX (0x6) /* 16 word */ +#define ZF_GDMA_DEFAULT_BURST_LEN (0xf) /* 16 beats */ +#define ZF_GDMA_TC_CNT_ENABLE (1UL << 27) +#define ZF_GDMA_CHAN_FORCE_CLOSE (1UL << 31) + +/* TC count & Error interrupt status register */ +#define ZF_GDMA_SRC_LLI_ERR (1UL << 16) +#define ZF_GDMA_SRC_DATA_ERR (1UL << 17) +#define ZF_GDMA_DST_ADDR_ERR (1UL << 18) +#define ZF_GDMA_ERR_STATUS (1UL << 19) +#define ZF_GDMA_ERR_RPT_ENABLE (1UL << 20) +#define ZF_GDMA_TC_CNT_CLEAN (1) + +#define ZF_GDMA_ALIGN_SIZE (1) +#define ZF_GDMA_DMA_BUSWIDTHS (BIT(DMA_SLAVE_BUSWIDTH_4_BYTES)) +#define ZF_GDMA_BUFF_SIZE_MAX (0xfffff) + +#define LOW16_MASK (0xffff) +#define LOW32_MASK (0xffffffff) + +void gchan_irq_tasklet_process(unsigned long data); +static void zf_gdma_enqueue_buff(struct zf_gdma_chan *gchan); + +static struct zf_gdma_chan *to_zf_gdma_chan(struct dma_chan *chan) +{ + return container_of(chan, struct zf_gdma_chan, vc.chan); +} + +static struct zf_gdma_desc *to_zf_gdma_desc(struct zxdh_virt_dma_desc *vdesc) +{ + return container_of(vdesc, struct zf_gdma_desc, vd); +} + +static inline uint32_t zf_gdma_read_reg(struct zf_gdma_chan *gchan, uint16_t chan_id, uint32_t offset) +{ + uint64_t addr = chan_id * ZF_GDMA_CHAN_SHIFT + offset; + + return *(volatile uint32_t *)(gchan->gdev->base_addr + addr); +} + +static inline void zf_gdma_write_reg(struct zf_gdma_chan *gchan, uint16_t chan_id, uint32_t offset, uint32_t val) +{ + uint64_t addr = chan_id * ZF_GDMA_CHAN_SHIFT + offset; + + *(volatile uint32_t *)(gchan->gdev->base_addr + addr) = val; +} + +static inline void zf_gdma_user_get(struct zf_rbp_info *rbp_info, uint32_t *user) +{ + uint32_t pf_id = rbp_info->pfid; + + //host addr + if (rbp_info->host) + { + if ((pf_id & ZF_GDMA_VF_MASK) != 0) + { + pf_id &= ~ZF_GDMA_VF_MASK; + *user = (ZF_GDMA_VF_EN | (rbp_info->vfid << ZF_GDMA_VF_NUM_SHIFT)); + } + *user |= ((rbp_info->epid << ZF_GDMA_EP_ID_SHIFT) | (pf_id << ZF_GDMA_PF_NUM_SHIFT)); + } + else + { + *user = ZF_GDMA_ZF_USER; + } +} + +static inline void zf_gdma_cfg_get(uint32_t *val, uint8_t tc_enable) +{ + *val = (ZF_GDMA_CHAN_ENABLE | ZF_GDMA_SOFT_CHAN | + ZF_GDMA_TC_INTR_ENABLE | ZF_GDMA_ERR_INTR_ENABLE | + (ZF_GDMA_DEFAULT_BURST_LEN << ZF_GDMA_SBL_SHIFT) | + (ZF_GDMA_BURST_SIZE_MAX << ZF_GDMA_SBS_SHIFT) | + (ZF_GDMA_BURST_SIZE_MAX << ZF_GDMA_DBS_SHIFT)); + + if (tc_enable != 0) + { + *val |= ZF_GDMA_TC_CNT_ENABLE; + } +} + +static void zf_gdma_desc_free(struct zxdh_virt_dma_desc *vd) +{ + if (vd != NULL) + { + kfree(to_zf_gdma_desc(vd)); + } +} + +static int32_t zf_gdma_alloc_chan_resources(struct dma_chan *chan) +{ + return 0; +} + +static void zf_gdma_free_chan_resources(struct dma_chan *chan) +{ + +} + +static int32_t zf_gdma_device_config(struct dma_chan *chan, struct dma_slave_config *config) +{ + return 0; +} + +static struct dma_async_tx_descriptor *zf_gdma_prep_dma_memcpy(struct dma_chan *chan, + dma_addr_t dst, + dma_addr_t src, + size_t len, + unsigned long flags) +{ + struct zf_gdma_chan *gchan = NULL; + struct zf_gdma_desc *desc = NULL; + struct zf_dma_addr_rbp *srbp = NULL; + struct zf_dma_addr_rbp *drbp = NULL; + uint32_t src_user = 0; + uint32_t dst_user = 0; + unsigned long status = 0; + + if ((chan == NULL) || ((void *)dst == NULL) || ((void *)src == NULL)) + { + printk(KERN_ERR "%s:param is invalid\n", __func__); + return ERR_PTR(-EINVAL); + } + + gchan = to_zf_gdma_chan(chan); + srbp = (struct zf_dma_addr_rbp *)src; + drbp = (struct zf_dma_addr_rbp *)dst; + + desc = kzalloc(sizeof(struct zf_gdma_desc), GFP_KERNEL); + if (desc == NULL) + { + printk(KERN_ERR "%s: Failed to alloc gdma desc\n", __func__); + return ERR_PTR(-ENOMEM); + } + + zf_gdma_user_get(&srbp->rbp_info, &src_user); + zf_gdma_user_get(&drbp->rbp_info, &dst_user); + + desc->user = ((src_user & LOW16_MASK) | (dst_user << 16)); + desc->src = (uint64_t)(srbp->addr); + desc->dst = (uint64_t)(drbp->addr); + desc->len = (uint64_t)len; + desc->chan = gchan; + spin_lock_irqsave(&gchan->chan_lock, status); + list_add_tail(&desc->node, &gchan->desc_list); + spin_unlock_irqrestore(&gchan->chan_lock, status); + + return zxdh_vchan_tx_prep(&gchan->vc, &desc->vd, flags); +} + +static void zf_gdma_issue_pending(struct dma_chan *chan) +{ + struct zf_gdma_chan *gchan = NULL; + unsigned long flags = 0; + bool pending = false; + + if (chan == NULL) + return; + + gchan = to_zf_gdma_chan(chan); + + spin_lock_irqsave(&gchan->vc.lock, flags); + if (zxdh_vchan_issue_pending(&gchan->vc)) + { + pending = true; + } + spin_unlock_irqrestore(&gchan->vc.lock, flags); + + if (pending) + { + zf_gdma_enqueue_buff(gchan); + } + + return; +} + +static enum dma_status zf_gdma_tx_status(struct dma_chan *chan, dma_cookie_t cookie, struct dma_tx_state *state) +{ + return 0; +} + +static int32_t zf_gdma_terminate_all(struct dma_chan *chan) +{ + return 0; +} + +void zf_gdma_dev_init(struct device *dev, struct dma_device *dd) +{ + dd->device_alloc_chan_resources = zf_gdma_alloc_chan_resources; + dd->device_free_chan_resources = zf_gdma_free_chan_resources; + dd->device_config = zf_gdma_device_config; + dd->device_prep_dma_memcpy = zf_gdma_prep_dma_memcpy; + dd->device_issue_pending = zf_gdma_issue_pending; + dd->device_tx_status = zf_gdma_tx_status; + dd->device_terminate_all = zf_gdma_terminate_all; + + dd->chancnt = ZF_GDMA_CHAN_NUM; + dd->privatecnt = 0; + dd->copy_align = ZF_GDMA_ALIGN_SIZE; + dd->src_addr_widths = ZF_GDMA_DMA_BUSWIDTHS; + dd->dst_addr_widths = ZF_GDMA_DMA_BUSWIDTHS; + dd->residue_granularity = DMA_RESIDUE_GRANULARITY_SEGMENT; + dd->dev = dev; + + dma_cap_zero(dd->cap_mask); + dma_cap_set(DMA_RBP, dd->cap_mask); +} + +static int32_t zf_gdma_virt_chan_init(struct zf_gdma_dev *gdev) +{ + struct zf_gdma_chan *gchan = NULL; + uint32_t val = 0; + uint16_t i = 0; + + INIT_LIST_HEAD(&gdev->dd->channels); + for (i = 0; i < ZF_GDMA_CHAN_NUM; i++) + { + gchan = &gdev->chan[i]; + gchan->status = GDMA_CHAN_IDLE; + gchan->chan_id = ZF_GDMA_CHAN_BASE + i; + gchan->gdev = gdev; + gchan->vc.desc_free = zf_gdma_desc_free; + tasklet_init(&gchan->task, gchan_irq_tasklet_process, (unsigned long)gchan); + + zxdh_vchan_init(&gchan->vc, gdev->dd); + spin_lock_init(&gchan->chan_lock); + INIT_LIST_HEAD(&gchan->desc_list); + + /* reset gdma channel */ + val = ZF_GDMA_CHAN_FORCE_CLOSE; + zf_gdma_write_reg(gchan, gchan->chan_id, ZF_GDMA_CONTROL_OFFSET, val); + + val = ZF_GDMA_ERR_RPT_ENABLE | ZF_GDMA_ERR_STATUS | ZF_GDMA_TC_CNT_CLEAN; + zf_gdma_write_reg(gchan, gchan->chan_id, ZF_GDMA_TC_CNT_OFFSET, val); + } + + /* Configure interrupt pulse width to 8 cycle */ + zf_gdma_write_reg(gchan, 0, ZF_GDMA_PULSE_WIDTH_OFFSET, 7); + + return 0; +} + +static int32_t zf_gdma_xmit_done(struct zf_gdma_chan *gchan) +{ + struct zxdh_virt_dma_desc *vdesc = NULL; + uint32_t widx = gchan->chan_id / 32; + uint32_t bidx = gchan->chan_id % 32; + uint32_t val = 0; + unsigned long flags = 0; + + val = zf_gdma_read_reg(gchan, 0, ZF_GDMA_TC_STATUS_OFFSET + (widx * sizeof(uint32_t))); + if ((val & (1UL << bidx)) == 0) + { + printk(KERN_ERR "%s:chan%d tc status error\n", __func__, gchan->chan_id); + spin_lock(&gchan->chan_lock); + gchan->status = GDMA_CHAN_ERR; + spin_unlock(&gchan->chan_lock); + return -1; + } + + pr_debug("chan%d transfer success\n", gchan->chan_id); + zf_gdma_write_reg(gchan, 0, ZF_GDMA_STATUS_CLEAN_OFFSET + (widx * sizeof(uint32_t)), 1 << bidx); + + spin_lock(&gchan->chan_lock); + if (gchan->desc == NULL) + { + printk(KERN_ERR "%s:chan%d descriptor missing\n", __func__, gchan->chan_id); + gchan->status = GDMA_CHAN_ERR; + spin_unlock(&gchan->chan_lock); + return -1; + } + + if (gchan->desc->len == 0) + { + list_del(&gchan->desc->node); + vdesc = &gchan->desc->vd; + gchan->desc = NULL; + + spin_lock_irqsave(&gchan->vc.lock, flags); + list_del(&vdesc->node); + zxdh_vchan_cookie_complete(vdesc); + spin_unlock_irqrestore(&gchan->vc.lock, flags); + } + gchan->status = GDMA_CHAN_IDLE; + spin_unlock(&gchan->chan_lock); + + return 0; +} + +static void zf_gdma_enqueue_buff(struct zf_gdma_chan *gchan) +{ + struct zf_gdma_desc *desc = NULL; + struct zxdh_virt_dma_desc *vdesc = NULL; + uint32_t val = 0; + uint64_t cur_len = 0; + unsigned long flags = 0; + + spin_lock_irqsave(&gchan->chan_lock, flags); + if (gchan->status != GDMA_CHAN_IDLE) + { + goto out; + } + spin_lock(&gchan->vc.lock); + vdesc = zxdh_vchan_next_desc(&gchan->vc); + spin_unlock(&gchan->vc.lock); + if (vdesc == NULL) + { + goto out; + } + gchan->status = GDMA_CHAN_BUSY; + spin_unlock_irqrestore(&gchan->chan_lock, flags); + + desc = to_zf_gdma_desc(vdesc); + gchan->desc = desc; + cur_len = (desc->len > ZF_GDMA_BUFF_SIZE_MAX) ? ZF_GDMA_BUFF_SIZE_MAX : desc->len; + + zf_gdma_write_reg(gchan, gchan->chan_id, ZF_GDMA_SAR_LOW_OFFSET, desc->src & LOW32_MASK); + zf_gdma_write_reg(gchan, gchan->chan_id, ZF_GDMA_SAR_HIGH_OFFSET, (desc->src >> 32) & LOW32_MASK); + + zf_gdma_write_reg(gchan, gchan->chan_id, ZF_GDMA_DAR_LOW_OFFSET, desc->dst & LOW32_MASK); + zf_gdma_write_reg(gchan, gchan->chan_id, ZF_GDMA_DAR_HIGH_OFFSET, (desc->dst >> 32) & LOW32_MASK); + + zf_gdma_write_reg(gchan, gchan->chan_id, ZF_GDMA_XFERSIZE_OFFSET, cur_len); + + zf_gdma_write_reg(gchan, gchan->chan_id, ZF_GDMA_EXT_ADDR_OFFSET, desc->user); + + zf_gdma_cfg_get(&val, 1); + zf_gdma_write_reg(gchan, gchan->chan_id, ZF_GDMA_CONTROL_OFFSET, val); + + desc->src += cur_len; + desc->dst += cur_len; + desc->len -= cur_len; + + return; + +out: + spin_unlock_irqrestore(&gchan->chan_lock, flags); +} + +static void zf_gdma_free_channels(struct zf_gdma_dev *gdev) +{ + struct zf_gdma_chan *gchan = NULL; + struct zf_gdma_desc *desc = NULL; + struct zf_gdma_desc *tmp = NULL; + uint16_t i = 0; + unsigned long flags = 0; + + for (i = 0; i < ZF_GDMA_CHAN_NUM; i++) + { + gchan = &gdev->chan[i]; + tasklet_kill(&gchan->task); + + spin_lock_irqsave(&gchan->chan_lock, flags); + spin_lock(&gchan->vc.lock); + list_for_each_entry_safe(desc, tmp, &gchan->desc_list, node) + { + list_del(&desc->vd.node); + list_del(&desc->node); + kfree(desc); + } + spin_unlock(&gchan->vc.lock); + spin_unlock_irqrestore(&gchan->chan_lock, flags); + } +} + +int32_t dh_zf_mpf_gdma_init(struct dh_core_dev *dh_dev) +{ + struct dh_en_mpf_dev *mpf_dev = dh_core_priv(dh_dev); + struct zf_gdma_dev *gdev = NULL; + struct device *dev = NULL; + int32_t node = 0; + int32_t ret = 0; + + if (dh_dev->pdev == NULL) + { + printk(KERN_ERR "%s: pdev is invalid\n", __func__); + return -ENODEV; + } + + if (mpf_dev->pci_ioremap_addr == 0) + { + printk(KERN_ERR "%s: pci_ioremap_addr is invalid\n", __func__); + return -ENAVAIL; + } + + gdev = kzalloc(sizeof(struct zf_gdma_dev), GFP_KERNEL); + if (gdev == NULL) + { + printk(KERN_ERR "%s: Failed to alloc gdev\n", __FUNCTION__); + return -ENOMEM; + } + mpf_dev->gdev = gdev; + + gdev->base_addr = mpf_dev->pci_ioremap_addr + ZF_GDMA_BASE_OFFSET; + gdev->pdev = dh_dev->pdev; + dev = &(dh_dev->pdev->dev); + node = dev_to_node(dev); + gdev->dd = kzalloc_node(sizeof(struct dma_device), GFP_KERNEL, node); + if (gdev->dd == NULL) + { + printk(KERN_ERR "%s: Failed to alloc dma_device\n", __FUNCTION__); + ret = -ENOMEM; + goto free_gdev; + } + + zf_gdma_dev_init(dev, gdev->dd); + zf_gdma_virt_chan_init(gdev); + + ret = dma_async_device_register(gdev->dd); + if (ret != 0) + { + printk(KERN_ERR "%s: Failed to register gdma device\n", __func__); + goto err_out; + } + + return 0; + +err_out: + zf_gdma_free_channels(gdev); + kfree(gdev->dd); +free_gdev: + kfree(gdev); + return ret; +} + +void dh_zf_mpf_gdma_uninit(struct dh_core_dev *dh_dev) +{ + struct dh_en_mpf_dev *mpf_dev = dh_core_priv(dh_dev); + struct zf_gdma_dev *gdev = NULL; + + if (mpf_dev->gdev == NULL) + { + printk(KERN_ERR "%s:gdev is invalid\n", __func__); + return; + } + gdev = mpf_dev->gdev; + + if (gdev->dd != NULL) + { + dma_async_device_unregister(gdev->dd); + kfree(gdev->dd); + } + zf_gdma_free_channels(gdev); + kfree(gdev); +} + +int32_t zf_gdma_err_irq_handle(struct notifier_block *nb, unsigned long action, void *data) +{ + pr_debug("%s is called\n", __func__); + + return 0; +} + +int32_t zf_gdma_chan_irq_handle(struct notifier_block *nb, unsigned long action, void *data) +{ + struct dh_eq_async *eq = container_of(nb, struct dh_eq_async, irq_nb); + struct zf_gdma_chan *gchan = NULL; + + if (eq->priv == NULL) + { + printk(KERN_ERR "%s:eq->priv is NULL\n", __func__); + return -1; + } + gchan = (struct zf_gdma_chan *)eq->priv; + tasklet_hi_schedule(&gchan->task); + + return 0; +} + +void gchan_irq_tasklet_process(unsigned long data) +{ + struct zf_gdma_chan *gchan = NULL; + + if (unlikely(data == 0)) + { + printk(KERN_ERR "%s:param is invalid\n", __func__); + return; + } + + gchan = (struct zf_gdma_chan *)data; + if (zf_gdma_xmit_done(gchan) != 0) + return; + + zf_gdma_enqueue_buff(gchan); +} \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/gdma.h b/src/net/drivers/net/ethernet/dinghai/zf_mpf/gdma.h new file mode 100644 index 0000000..303be03 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/gdma.h @@ -0,0 +1,67 @@ +#ifndef __GDMA_H +#define __GDMA_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "./epc/virt-dma.h" + +#define ZF_GDMA_CHAN_NUM (4) +#define ZF_GDMA_CHAN_BASE (58) + +enum zf_gdma_chan_status +{ + GDMA_CHAN_IDLE = 0, + GDMA_CHAN_BUSY, + GDMA_CHAN_ERR +}; + +struct zf_gdma_chan +{ + enum zf_gdma_chan_status status; + uint16_t chan_id; + + struct list_head desc_list; + spinlock_t chan_lock; + + struct zf_gdma_dev *gdev; + struct zxdh_virt_dma_chan vc; + struct zf_gdma_desc *desc; + struct tasklet_struct task; +}; + +struct zf_gdma_desc +{ + uint64_t src; /* src addr */ + uint64_t dst; + uint64_t len; + uint32_t user; + struct zxdh_virt_dma_desc vd; + struct list_head node; + struct zf_gdma_chan *chan; +}; + +struct zf_gdma_dev +{ + uint64_t base_addr; + struct dma_device *dd; + struct pci_dev *pdev; + struct zf_gdma_chan chan[ZF_GDMA_CHAN_NUM]; +}; + +int32_t dh_zf_mpf_gdma_init(struct dh_core_dev *dh_dev); +void dh_zf_mpf_gdma_uninit(struct dh_core_dev *dh_dev); +int32_t zf_gdma_err_irq_handle(struct notifier_block *nb, unsigned long action, void *data); +int32_t zf_gdma_chan_irq_handle(struct notifier_block *nb, unsigned long action, void *data); + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/irq.c b/src/net/drivers/net/ethernet/dinghai/zf_mpf/irq.c new file mode 100755 index 0000000..9e957a7 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/irq.c @@ -0,0 +1,169 @@ +#include +#include +#include +#include "irq.h" + +static struct dh_irq_range zxdh_get_mpf_range(struct dh_core_dev *dev) +{ + struct dh_irq_range tmp = { + .start = 0, + .size = ZXDH_MPF_ASYNC_IRQ_NUM + }; + + return tmp; +} +static struct dh_irq_range zxdh_get_comp_mpf_range(struct dh_core_dev *dev) +{ + struct dh_irq_range tmp = { + .start = ZXDH_MPF_ASYNC_IRQ_NUM, + .size = ZXDH_MPF_COMP_IRQ_NUM + }; + + return tmp; +} + +static struct dh_irq_range zxdh_get_gdma_irq_range(struct dh_core_dev *dev) +{ + struct dh_irq_range tmp = { + .start = ZXDH_MPF_GDMA_MSIX_VEC_BASE, + .size = ZXDH_MPF_GDMA_IRQ_NUM + }; + + return tmp; +} + +static int32_t irq_pools_init(struct dh_core_dev *dev) +{ + struct dh_irq_table *table = &dev->irq_table; + int32_t err = 0; + struct dh_irq_range irq_range; + struct dh_mpf_irq_table * mpf_irq_table = table->priv; + + /* init mpf_pool */ + irq_range = zxdh_get_mpf_range(dev); + mpf_irq_table->mpf_async_pool = irq_pool_alloc(dev, irq_range.start, irq_range.size, "zxdh_mpf_msg", + ZXDH_MPF_ASYNC_IRQ_MIN_COMP, + ZXDH_MPF_ASYNC_IRQ_MAX_COMP); + if (IS_ERR_OR_NULL(mpf_irq_table->mpf_async_pool)) + { + return PTR_ERR(mpf_irq_table->mpf_async_pool); + } + + /* init sf_comp_pool */ + irq_range = zxdh_get_comp_mpf_range(dev); + mpf_irq_table->mpf_comp_pool = irq_pool_alloc(dev, irq_range.start, + irq_range.size, "zxdh_mpf_comp", + ZXDH_MPF_COMP_IRQ_MIN_COMP, + ZXDH_MPF_COMP_IRQ_MAX_COMP); + if (IS_ERR_OR_NULL(mpf_irq_table->mpf_comp_pool)) + { + err = PTR_ERR(mpf_irq_table->mpf_comp_pool); + goto err_mpf_comp; + } + + mpf_irq_table->mpf_comp_pool->irqs_per_cpu = kcalloc(nr_cpu_ids, sizeof(u16), GFP_KERNEL); + if (unlikely(mpf_irq_table->mpf_comp_pool->irqs_per_cpu == NULL)) + { + err = -ENOMEM; + goto err_irqs_per_cpu; + } + + /* init gdma_irq_pool */ + irq_range = zxdh_get_gdma_irq_range(dev); + mpf_irq_table->mpf_gdma_pool = irq_pool_alloc(dev, irq_range.start, irq_range.size, "zxdh_mpf_gdma", + ZXDH_MPF_GDMA_IRQ_MIN, + ZXDH_MPF_GDMA_IRQ_MAX); + if (IS_ERR_OR_NULL(mpf_irq_table->mpf_gdma_pool)) + { + err = PTR_ERR(mpf_irq_table->mpf_gdma_pool); + goto err_irqs_per_cpu; + } + + return 0; + +err_irqs_per_cpu: + irq_pool_free(mpf_irq_table->mpf_comp_pool); +err_mpf_comp: + irq_pool_free(mpf_irq_table->mpf_async_pool); + return err; +} + +static void irq_pools_destroy(struct dh_irq_table *table) +{ + struct dh_mpf_irq_table *mpf_irq_table = (struct dh_mpf_irq_table *)table->priv; + + irq_pool_free(mpf_irq_table->mpf_comp_pool); + irq_pool_free(mpf_irq_table->mpf_async_pool); + irq_pool_free(mpf_irq_table->mpf_gdma_pool); +} + +/*todo*/ +static int32_t zxdh_get_total_vec(struct dh_core_dev *dev) +{ + return ZXDH_ZF_MPF_IRQ_NUM_TOTAL; +} + +int32_t dh_mpf_irq_table_create(struct dh_core_dev *dev) +{ + int32_t total_vec = 0; + int32_t err = 0; + + total_vec = zxdh_get_total_vec(dev); + + total_vec = pci_alloc_irq_vectors(dev->pdev, total_vec, total_vec, PCI_IRQ_MSIX); + if (total_vec < 0) + { + dh_err(dev, "pci_alloc_irq_vectors failed: %d\n", total_vec); + return total_vec; + } + + err = irq_pools_init(dev); + if (err != 0) + { + pci_free_irq_vectors(dev->pdev); + } + + return err; +} + +void dh_mpf_irq_table_destroy(struct dh_core_dev *dev) +{ + struct dh_irq_table *table = &dev->irq_table; + + /* There are cases where IRQs still will be in used when we reaching + * to here. Hence, making sure all the irqs are released. + */ + irq_pools_destroy(table); + pci_free_irq_vectors(dev->pdev); +} + +struct dh_irq *dh_mpf_async_irq_request(struct dh_core_dev *dev) +{ + struct dh_irq_table *table = &dev->irq_table; + struct dh_mpf_irq_table *mpf_irq_table = (struct dh_mpf_irq_table *)table->priv; + + struct dh_irq *irq = zxdh_get_irq_of_pool(dev, mpf_irq_table->mpf_async_pool); + if (IS_ERR_OR_NULL(irq)) + dh_err(dev, "irq=0x%llx\r\n", (unsigned long long)irq); + dh_dbg(dev, "end\r\n"); + return irq; +} + +/* irq_table API */ +int32_t dh_mpf_irq_table_init(struct dh_core_dev *dev) +{ + struct dh_irq_table *irq_table; + struct dh_mpf_irq_table *mpf_irq_table = NULL; + + irq_table = &dev->irq_table; + + mpf_irq_table = kvzalloc(sizeof(*mpf_irq_table), GFP_KERNEL); + if (unlikely(mpf_irq_table == NULL)) + { + return -ENOMEM; + } + + irq_table->priv = mpf_irq_table; + + return 0; +} diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/irq.h b/src/net/drivers/net/ethernet/dinghai/zf_mpf/irq.h new file mode 100755 index 0000000..7cdb29b --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/irq.h @@ -0,0 +1,49 @@ +#ifndef __ZXDH_MPF_IRQ_H__ +#define __ZXDH_MPF_IRQ_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#include "gdma.h" + +#define ZXDH_MPF_ASYNC_IRQ_NUM 6 +#define ZXDH_MPF_ASYNC_IRQ_MIN_COMP 0 +#define ZXDH_MPF_ASYNC_IRQ_MAX_COMP 1 + +#define ZXDH_MPF_COMP_IRQ_NUM 1 +#define ZXDH_MPF_COMP_IRQ_MIN_COMP 0 +#define ZXDH_MPF_COMP_IRQ_MAX_COMP 1 + +#define ZXDH_MPF_GDMA_IRQ_NUM (ZF_GDMA_CHAN_NUM + 1) +#define ZXDH_MPF_GDMA_MSIX_VEC_BASE 10 +#define ZXDH_MPF_GDMA_IRQ_MIN 0 +#define ZXDH_MPF_GDMA_IRQ_MAX 1 + +/* async irq:<0-5> comp irq:<6> gdma irq:<10-14> */ +#define ZXDH_ZF_MPF_IRQ_NUM_TOTAL 16 + +struct dh_mpf_irq_table { + struct dh_irq_pool *mpf_comp_pool; + struct dh_irq_pool *mpf_async_pool; + struct dh_irq_pool *mpf_gdma_pool; +}; + +struct dh_irq_range { + int32_t start; + int32_t size; +}; + +struct dh_irq *dh_mpf_async_irq_request(struct dh_core_dev *dev); +void dh_mpf_irq_table_destroy(struct dh_core_dev *dev); +int32_t dh_mpf_irq_table_create(struct dh_core_dev *dev); +int32_t dh_mpf_irq_table_init(struct dh_core_dev *dev); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_chan_ioctl.c b/src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_chan_ioctl.c new file mode 100644 index 0000000..a6dbf1b --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_chan_ioctl.c @@ -0,0 +1,284 @@ +#include +#include +#include +#include +#include +#include "zf_chan_ioctl.h" + +static dev_t dev; +static struct cdev c_dev; +static struct class *cl; + +#define BAR_IOCTL_CMD_NORMAL _IOW('a', 1, msg_entity_t) +#define BAR_IOCTL_CMD_SINGLE_DEV _IOW('a', 2, pci_res_st) +#define BAR_IOCTL_CMD_ALL_DEV _IOW('a', 3, pci_res_st) + +struct zxdh_bar_ioctl_dev +{ + uint16_t pcie_id; + uint64_t bar0_base_virt_addr; + uint64_t is_valid; +}ioctl_dev = {0}; + +struct zxdh_bar_ioctl_dev *zxdh_get_bar_ioctl_dev(void) +{ + return &ioctl_dev; +} + +int zxdh_init_bar_ioctl_dev(struct dh_core_dev *core_dev) +{ + struct zxdh_bar_ioctl_dev *dev = zxdh_get_bar_ioctl_dev(); + struct dh_en_mpf_dev *mpf_dev = dh_core_priv(core_dev); + + dev->pcie_id = mpf_dev->pcie_id; + dev->bar0_base_virt_addr = mpf_dev->pci_ioremap_addr; + dev->is_valid = 1; + return 0; +} + +int (*ioctl_bar_chan_func)(unsigned int cmd, unsigned long arg); + +int bar_chan_common_sync_send(unsigned int cmd, unsigned long arg) +{ + int ret = 0; + struct normal_msg_entity *user_msg = NULL; + struct zxdh_ioctl_send_paras *send_paras = NULL; + struct zxdh_pci_bar_msg in = {0}; + struct zxdh_msg_recviver_mem result = {0}; + struct zxdh_bar_ioctl_dev *dev = zxdh_get_bar_ioctl_dev(); + + /* 按照既定的申请内存*/ + user_msg = kmalloc(sizeof(struct normal_msg_entity), GFP_KERNEL); + if (NULL == user_msg) + { + LOG_ERR("malloc failed.\n"); + return -1; + } + /* 初始化并且按照约定的大小从用户态拷贝数据,保证不拷贝到脏数据*/ + memset(user_msg, 0, sizeof(struct normal_msg_entity)); + if (copy_from_user(user_msg, (msg_entity_t __user *)arg, sizeof(struct normal_msg_entity))) + { + user_msg->hdr.recv_msg_hdr.ioctl_state = IOCTRL_ERR_MSG_GET; + goto out; + } + + send_paras = &user_msg->hdr.send_msg_hdr; + if (send_paras->pload_len > BAR_CHAN_PLOAD_SIZE) + { + user_msg->hdr.recv_msg_hdr.bar_state = IOCTRL_ERR_MSG_GET; + goto out; + } + + in.virt_addr = dev->bar0_base_virt_addr + ZXDH_BAR1_CHAN_OFFSET; + in.payload_addr = user_msg->pload; + in.payload_len = send_paras->pload_len; + in.src = MSG_CHAN_END_PF; + in.dst = MSG_CHAN_END_RISC; + in.event_id = send_paras->event_id; + in.src_pcieid = dev->pcie_id; + + /* pload直接透传上去*/ + result.buffer_len = sizeof(user_msg->pload); + result.recv_buffer = (void *)user_msg->pload; + + ret = zxdh_bar_chan_sync_msg_send(&in, &result); + if (ret != 0) + { + LOG_ERR("pcie send msg failed, ret:%d.\n", ret); + } + + user_msg->hdr.recv_msg_hdr.bar_state = ret; + user_msg->hdr.recv_msg_hdr.ioctl_state = 0; +out: + ret = copy_to_user((int *)arg, user_msg, sizeof(*user_msg)); + if (0 != ret) + { + /* msg may not reply to user, but we can locate by demsg*/ + LOG_ERR("reply ioctl msg failed, ret: %d.\n", ret); + } + /* free the user_msg_data*/ + if (NULL != user_msg) + { + kfree(user_msg); + } + return 0; +} + +static int remove_recv_hdr(uint8_t *buffer, size_t len) +{ + if (len <= BAR_REV_HDR_LEN) + { + return -1; + } + memmove(buffer, buffer + BAR_REV_HDR_LEN, len - BAR_REV_HDR_LEN); + + return 0; +} + +static char temp_recv_buf[BAR_CHAN_PLOAD_SIZE + BAR_REV_HDR_LEN] = {0}; +int bar_chan_pci_res_get(unsigned int cmd, unsigned long arg, uint16_t mode) +{ + int ret = 0; + struct zxdh_mpf_query_bar_msg *entity = NULL; + struct zxdh_pci_query_hdr query_hdr = {0}; + struct zxdh_pci_bar_msg in = {0}; + struct zxdh_msg_recviver_mem result = {0}; + struct zxdh_bar_ioctl_dev *dev = zxdh_get_bar_ioctl_dev(); + + entity = kmalloc(sizeof(*entity), GFP_KERNEL); + if (NULL == entity) + { + LOG_ERR("malloc failed.\n"); + return -1; + } + memset(entity, 0,sizeof(*entity)); + if (copy_from_user(entity, (pci_res_st __user *)arg, sizeof(*entity))) + { + entity->ioctl_state = IOCTRL_ERR_MSG_GET; + goto out; + } + + query_hdr.mode = mode; + query_hdr.pcie_id = entity->pci_res_msg.pcie_id; + + in.virt_addr = dev->bar0_base_virt_addr + ZXDH_BAR1_CHAN_OFFSET; + in.payload_addr = &query_hdr; + in.payload_len = sizeof(query_hdr); + in.src = MSG_CHAN_END_PF; + in.dst = MSG_CHAN_END_RISC; + in.event_id = MODULE_PCIE_RES_QUERY; + in.src_pcieid = dev->pcie_id; + + result.recv_buffer = temp_recv_buf; + result.buffer_len = sizeof(temp_recv_buf); + + ret = zxdh_bar_chan_sync_msg_send(&in, &result); + if (ret != 0) + { + LOG_ERR("pcie send msg failed, ret:%d.\n", ret); + goto out; + } + + ret = remove_recv_hdr(result.recv_buffer, result.buffer_len); + memcpy(&entity->pci_res_msg.reply, result.recv_buffer, sizeof(struct zxdh_mpf_pci_res_list)); + + entity->ioctl_state = 0; +out: + entity->bar_state = ret; + ret = copy_to_user((int *)arg, entity, sizeof(*entity)); + if (0 != ret) + { + LOG_ERR("reply tp user failed.\n"); + } + if (NULL != entity) + { + kfree(entity); + } + return 0; +} + +int bar_chan_pci_res_get_single(unsigned int cmd, unsigned long arg) +{ + return bar_chan_pci_res_get(cmd, arg, PCI_QUERY_TYPE_SINGLE); +} + +int bar_chan_pci_res_get_all(unsigned int cmd, unsigned long arg) +{ + return bar_chan_pci_res_get(cmd, arg, PCI_QUERY_TYPE_ALL); +} + +struct bar_chan_func_sel +{ + unsigned int cmd; + int (*ioctl_bar_chan_func)(unsigned int cmd, unsigned long arg); +}ioctl_func_arr[] = { + {BAR_IOCTL_CMD_NORMAL, bar_chan_common_sync_send}, + {BAR_IOCTL_CMD_SINGLE_DEV, bar_chan_pci_res_get_single}, + {BAR_IOCTL_CMD_ALL_DEV, bar_chan_pci_res_get_all}, +}; + +static long bar_msg_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + int i, ret = 0; + int ioctl_func_nums = sizeof(ioctl_func_arr)/sizeof(ioctl_func_arr[0]); + + for (i = 0; i < ioctl_func_nums; i++) + { + if (ioctl_func_arr[i].cmd == cmd) + { + ret = ioctl_func_arr[i].ioctl_bar_chan_func(cmd, arg); + break; + } + } + return 0; +} + +static struct file_operations fops = +{ + .owner = THIS_MODULE, + .unlocked_ioctl = bar_msg_ioctl, +}; + +int bar_msg_ioctl_init(void) +{ + int ret = 0; + + if (alloc_chrdev_region(&dev, 0, 1, DEVICE_NAME) < 0) + { + return -EBUSY; + } + + if ((cl = class_create(THIS_MODULE, DEVICE_NAME)) == NULL) + { + unregister_chrdev_region(dev, 1); + return -ENOMEM; + } + + if (device_create(cl, NULL, dev, NULL, DEVICE_NAME) == NULL) + { + class_destroy(cl); + unregister_chrdev_region(dev, 1); + return -ENOMEM; + } + + cdev_init(&c_dev, &fops); + if (cdev_add(&c_dev, dev, 1) == -1) + { + device_destroy(cl, dev); + class_destroy(cl); + unregister_chrdev_region(dev, 1); + return -ENOMEM; + } + + LOG_INFO("Custom device registered\n"); + return ret; +} + +void bar_msg_ioctl_exit(void) +{ + cdev_del(&c_dev); + device_destroy(cl, dev); + class_destroy(cl); + unregister_chrdev_region(dev, 1); + LOG_INFO("Custom device unregistered\n"); +} + + +int zxdh_bar_ioctl_msg_mdl_init(struct dh_core_dev *core_dev) +{ + int ret = 0; + + zxdh_init_bar_ioctl_dev(core_dev); + ret = bar_msg_ioctl_init(); + if (ret != 0) + { + LOG_ERR("custom init failed, ret:%d.\n", ret); + return -1; + } + return 0; +} + +void zxdh_bar_ioctl_msg_mdl_exit(struct dh_core_dev *core_dev) +{ + bar_msg_ioctl_exit(); +} diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_chan_ioctl.h b/src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_chan_ioctl.h new file mode 100644 index 0000000..9c34b23 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_chan_ioctl.h @@ -0,0 +1,100 @@ +#ifndef _ZXDH_MSG_CHAN_IOCTL_H_ +#define _ZXDH_MSG_CHAN_IOCTL_H_ + +#ifdef __cplusplus +extern "C" { +#endif +#include "zf_mpf.h" + +#define DEVICE_NAME "bar_ioctl_dev" +#define BAR_CHAN_SIZE (1024 * 2) +#define BAR_CHAN_PLOAD_SIZE (BAR_CHAN_SIZE - 12) +#define BAR_REV_HDR_LEN (4) +#define ZXDH_PF_DEV_NUM (40) + +#define PCI_QUERY_TYPE_SINGLE (1) +#define PCI_QUERY_TYPE_ALL (2) + +struct zxdh_ioctl_send_paras +{ + uint16_t pload_len; + uint16_t src; + uint16_t dst; + uint16_t event_id; +}; + +struct zxdh_ioctl_recv_paras +{ + int ioctl_state; //ioctrl级别返回值 + int bar_state; //bar通道接口级别返回值 +}; + +enum { + IOCTRL_OK, + IOCTRL_ERR_MALLOC, + IOCTRL_ERR_MSG_GET, +}; + +typedef struct normal_msg_entity +{ + union ioctl_ctrl_hdr //私有消息控制头 + { + struct zxdh_ioctl_send_paras send_msg_hdr; //普通消息发送头 + struct zxdh_ioctl_recv_paras recv_msg_hdr; //普通消息发送头 + }hdr; + uint8_t pload[BAR_CHAN_PLOAD_SIZE + BAR_REV_HDR_LEN]; +}msg_entity_t; + +struct zxdh_mpf_pci_res_item +{ + uint16_t device_id; + uint16_t pcie_id; + uint16_t bdf; + uint8_t link_state; + uint8_t dev_type; + uint16_t total_vfs; + uint16_t initial_vfs; + uint16_t num_vfs; + uint8_t vf_stride; + uint8_t first_vf_offset; + uint8_t pad[8]; //预留字段 +}; + +/* zf内核态和risc通信的约定结构体*/ +struct zxdh_mpf_pci_res_list +{ + uint16_t num; + uint16_t verno; //版本号 + int res; //0表示返回成功, 其他表示失败, 包括消息发送失败 + struct zxdh_mpf_pci_res_item pci_res_lis[ZXDH_PF_DEV_NUM]; +}; + +struct zxdh_mpf_query_pci_res_msg +{ + uint16_t pcie_id; + uint8_t dev_type; + uint8_t pad[5]; + struct zxdh_mpf_pci_res_list reply; +}; + +typedef struct zxdh_mpf_query_bar_msg +{ + int ioctl_state; + int bar_state; + struct zxdh_mpf_query_pci_res_msg pci_res_msg; +}pci_res_st; + +struct zxdh_pci_query_hdr +{ + uint16_t mode; + uint16_t pcie_id; +}; + +int zxdh_bar_ioctl_msg_mdl_init(struct dh_core_dev *core_dev); +void zxdh_bar_ioctl_msg_mdl_exit(struct dh_core_dev *core_dev); + +#ifdef __cplusplus +} +#endif + +#endif /* _ZXDH_MSG_CHAN_IOCTL_H_ */ diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_events.c b/src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_events.c new file mode 100755 index 0000000..f393001 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_events.c @@ -0,0 +1,192 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "zf_events.h" +#include "../en_mpf.h" + +static int32_t zf_riscv_notifier(struct notifier_block *nb, unsigned long type, void *data); +static int32_t zf_pf_notifier(struct notifier_block *nb, unsigned long type, void *data); +static int32_t irq1_notifier(struct notifier_block *nb, unsigned long type, void *data); +static int32_t fuc_hotplug_failed_notifier(struct notifier_block *nb, unsigned long type, void *data); +static int32_t fuc_hotplug_finish_notifier(struct notifier_block *nb, unsigned long type, void *data); +static int32_t irq4_notifier(struct notifier_block *nb, unsigned long type, void *data); +int get_fuc_hp_ret(void); +int finish_flag = 0; + +static struct dh_nb zf_mpf_events[] = { + {.nb.notifier_call = zf_riscv_notifier, .event_type = DH_EVENT_TYPE_NOTIFY_RISC_TO_MPF}, + {.nb.notifier_call = zf_pf_notifier, .event_type = DH_EVENT_TYPE_NOTIFY_PF_TO_MPF}, + {.nb.notifier_call = irq1_notifier, .event_type = DH_EVENT_TYPE_NOTIFY_1}, + {.nb.notifier_call = fuc_hotplug_failed_notifier, .event_type = DH_EVENT_TYPE_NOTIFY_2}, + {.nb.notifier_call = fuc_hotplug_finish_notifier, .event_type = DH_EVENT_TYPE_NOTIFY_3}, + {.nb.notifier_call = irq4_notifier, .event_type = DH_EVENT_TYPE_NOTIFY_4} +}; + +static int32_t zf_riscv_notifier(struct notifier_block *nb, unsigned long type, void *data) +{ + struct dh_event_nb *event_nb = dh_nb_cof(nb, struct dh_event_nb, nb); + struct dh_core_dev *dh_dev = (struct dh_core_dev *)event_nb->ctx; + struct dh_en_mpf_dev *mpf_dev = dh_core_priv(dh_dev); + + LOG_INFO("is called, type=%ld\n", type); + zxdh_events_work_enqueue(dh_dev, &mpf_dev->dh_np_sdk_from_risc); + + return NOTIFY_OK; +} + +static int32_t zf_pf_notifier(struct notifier_block *nb, unsigned long type, void *data) +{ + struct dh_event_nb *event_nb = dh_nb_cof(nb, struct dh_event_nb, nb); + struct dh_core_dev *dh_dev = (struct dh_core_dev *)event_nb->ctx; + struct dh_en_mpf_dev *mpf_dev = dh_core_priv(dh_dev); + + LOG_INFO("is called, type=%ld\n", type); + zxdh_events_work_enqueue(dh_dev, &mpf_dev->dh_np_sdk_from_pf); + + return NOTIFY_OK; +} + +static int32_t irq1_notifier(struct notifier_block *nb, unsigned long type, void *data) +{ + struct dh_event_nb *event_nb = dh_nb_cof(nb, struct dh_event_nb, nb); + struct dh_core_dev *dh_dev = (struct dh_core_dev *)event_nb->ctx; + struct dh_en_mpf_dev *mpf_dev = dh_core_priv(dh_dev); + + LOG_INFO("is called, ep_bdf=0x%x, pcie_id=%d\n", mpf_dev->ep_bdf, mpf_dev->pcie_id); + + return zf_hdma_wr_handler((void *)dh_dev->zf_ep->dpu_ep_array[0]); +} + +static int32_t fuc_hotplug_failed_notifier(struct notifier_block *nb, unsigned long type, void *data) +{ + finish_flag = FUC_HP_RET_FAILED; + LOG_ERR("hotplug failed\n"); + return NOTIFY_OK; +} +static int32_t fuc_hotplug_finish_notifier(struct notifier_block *nb, unsigned long type, void *data) +{ + finish_flag = FUC_HP_RET_FINISH; + LOG_INFO("hotplug success\n"); + return NOTIFY_OK; +} + +static int32_t irq4_notifier(struct notifier_block *nb, unsigned long type, void *data) +{ + struct dh_event_nb *event_nb = dh_nb_cof(nb, struct dh_event_nb, nb); + struct dh_core_dev *dh_dev = (struct dh_core_dev *)event_nb->ctx; + struct dh_en_mpf_dev *mpf_dev = dh_core_priv(dh_dev); + + LOG_INFO("is called, ep_bdf=0x%x, pcie_id=%d\n", mpf_dev->ep_bdf, mpf_dev->pcie_id); + + return NOTIFY_OK; +} + +static void zf_np_sdk_handler_from_risc(struct work_struct *p_work) +{ + struct dh_en_mpf_dev *mpf_dev = container_of(p_work, struct dh_en_mpf_dev, dh_np_sdk_from_risc); + + LOG_INFO("is called\n"); + zxdh_bar_irq_recv(MSG_CHAN_END_RISC, MSG_CHAN_END_MPF, mpf_dev->pci_ioremap_addr + ZXDH_BAR1_CHAN_OFFSET, NULL); + return; +} + +static void zf_np_sdk_handler_from_pf(struct work_struct *p_work) +{ + struct dh_en_mpf_dev *mpf_dev = container_of(p_work, struct dh_en_mpf_dev, dh_np_sdk_from_pf); + + LOG_INFO("is called\n"); + zxdh_bar_irq_recv(MSG_CHAN_END_PF, MSG_CHAN_END_MPF, mpf_dev->pci_ioremap_addr + ZXDH_BAR2_CHAN_OFFSET, NULL); + return; +} + +void zxdh_zf_events_start(struct dh_core_dev *dev) +{ + struct dh_events *events = dev->events; + int32_t i = 0; + int32_t err = 0; + + for (i = 0; i < ARRAY_SIZE(zf_mpf_events); i++) + { + events->notifiers[i].nb = zf_mpf_events[i]; + events->notifiers[i].ctx = dev; + err = dh_eq_notifier_register(&dev->eq_table, &events->notifiers[i].nb); + if (err != 0) + { + LOG_ERR("i: %d, err: %d.\n", i, err); + } + } +} + +void dh_zf_events_stop(struct dh_core_dev *dev) +{ + struct dh_events *events = dev->events; + int32_t i = 0; + + for (i = ARRAY_SIZE(zf_mpf_events) - 1; i >= 0 ; i--) + { + dh_eq_notifier_unregister(&dev->eq_table, &events->notifiers[i].nb); + } + + zxdh_events_cleanup(dev); +} + +int32_t dh_zf_mpf_events_init(struct dh_core_dev *dev) +{ + struct dh_events *events = NULL; + struct dh_en_mpf_dev *mpf_dev = dh_core_priv(dev); + int32_t ret = 0; + + events = kzalloc((sizeof(*events) + ARRAY_SIZE(zf_mpf_events) * sizeof(struct dh_event_nb)), GFP_KERNEL); + if (unlikely(events == NULL)) + { + LOG_ERR("events kzalloc failed: %p\n", events); + ret = -ENOMEM; + goto err_events_kzalloc; + } + + events->evt_num = ARRAY_SIZE(zf_mpf_events); + events->dev = dev; + dev->events = events; + events->wq = create_singlethread_workqueue("dh_zf_mpf_events"); + if (!events->wq) + { + LOG_ERR("events->wq create_singlethread_workqueue failed: %p\n", events->wq); + ret = -ENOMEM; + goto err_create_wq; + } + + INIT_WORK(&mpf_dev->dh_np_sdk_from_risc, zf_np_sdk_handler_from_risc); + INIT_WORK(&mpf_dev->dh_np_sdk_from_pf, zf_np_sdk_handler_from_pf); + + zxdh_zf_events_start(dev); + + return 0; + +err_create_wq: + kfree(events); +err_events_kzalloc: + return ret; +} + +void dh_zf_mpf_events_uninit(struct dh_core_dev *dev) +{ + return dh_zf_events_stop(dev); +} + +void reset_fuc_hp_ret(void) +{ + finish_flag = 0; + return; +} + +int get_fuc_hp_ret(void) +{ + return finish_flag; +} \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_events.h b/src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_events.h new file mode 100755 index 0000000..5ba057b --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_events.h @@ -0,0 +1,24 @@ +#ifndef __ZXDH_ZF_MPF_EVENTS_H__ +#define __ZXDH_ZF_MPF_EVENTS_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "epc/pcie-zte-zf-epc.h" +#include "fuc_hotplug/fuc_hotplug_commom.h" + +int32_t dh_zf_mpf_events_init(struct dh_core_dev *dev); +void zxdh_zf_events_start(struct dh_core_dev *dev); +int32_t dh_zf_mpf_events_init(struct dh_core_dev *dev); +void dh_zf_events_stop(struct dh_core_dev *dev); +void dh_zf_mpf_events_uninit(struct dh_core_dev *dev); +int zf_hdma_wr_handler(void *data); +int zf_hdma_rd_handler(void *data); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_mpf.c b/src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_mpf.c new file mode 100755 index 0000000..8cbe1e4 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_mpf.c @@ -0,0 +1,437 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "zf_events.h" +#include "eq.h" +#include "irq.h" +#include "cfg_sf.h" +#include "zf_mpf.h" +#include "gdma.h" + +#ifdef PCIE_ZF_EPC_OPEN +#include "epc/pcie-zte-zf-epc.h" +#endif + +#ifdef DRIVER_VERSION_VAL + #define DRV_VERSION DRIVER_VERSION_VAL +#else + #define DRV_VERSION "1.0-1" +#endif + +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_VERSION(DRV_VERSION); + +uint32_t zf_dh_debug_mask; +module_param_named(debug_mask, zf_dh_debug_mask, uint, 0644); +MODULE_PARM_DESC(debug_mask, "debug mask: 1 = dump cmd data, 2 = dump cmd exec time, 3 = both. Default=0"); + +extern struct devlink_ops dh_mpf_devlink_ops; +extern struct dh_core_devlink_ops dh_mpf_core_devlink_ops; + +extern int zxdh_host_reset_driver_init(struct dh_core_dev *core_dev); +extern void zxdh_host_reset_driver_exit(struct dh_core_dev *core_dev); +extern int zxdh_host_fuc_hotplug_driver_init(void); +extern void zxdh_host_fuc_hotplug_driver_exit(void); +extern int zf_reset_finish_flag_init(struct dh_core_dev *dh_dev, unsigned long ep_mpf_paddr); +extern void zf_reset_finish_flag_exit(void); +extern int zxdh_bar_ioctl_msg_mdl_init(struct dh_core_dev *core_dev); +extern void zxdh_bar_ioctl_msg_mdl_exit(struct dh_core_dev *core_dev); + +static int32_t dh_zf_mpf_pci_init(struct dh_core_dev *dev) +{ + int32_t ret = 0; + struct dh_en_mpf_dev *mpf_dev = NULL; + + pci_set_drvdata(dev->pdev, dev); + + ret = pci_enable_device(dev->pdev); + if (ret) + { + dev_err(dev->device, "pci_enable_device failed: %d\n", ret); + return -ENOMEM; + } + + ret = dma_set_mask_and_coherent(dev->device, DMA_BIT_MASK(64)); + if (ret != 0) + { + ret = dma_set_mask_and_coherent(dev->device, DMA_BIT_MASK(32)); + if (ret != 0) + { + dev_err(dev->device, "dma_set_mask_and_coherent failed: %d\n", ret); + goto err_pci; + } + } + + ret = pci_request_selected_regions(dev->pdev, pci_select_bars(dev->pdev, IORESOURCE_MEM), "dh-mpf"); + if (ret != 0) + { + dev_err(dev->device, "pci_request_selected_regions failed: %d\n", ret); + goto err_pci; + } + + pci_enable_pcie_error_reporting(dev->pdev); + pci_set_master(dev->pdev); + ret = pci_save_state(dev->pdev); + if (ret != 0) + { + dev_err(dev->device, "pci_save_state failed: %d\n", ret); + goto err_pci_save_state; + } + + mpf_dev = dh_core_priv(dev); + mpf_dev->pci_ioremap_addr = (uint64_t)ioremap(pci_resource_start(dev->pdev, 0), pci_resource_len(dev->pdev, 0)); + LOG_INFO("pci_ioremap_addr=0x%llx, ioremap(0x%llx, 0x%llx)\n", mpf_dev->pci_ioremap_addr, pci_resource_start(dev->pdev, 0), pci_resource_len(dev->pdev, 0)); + if (mpf_dev->pci_ioremap_addr == 0) + { + ret = -1; + LOG_ERR("ioremap(0x%llx, 0x%llx) failed\n", pci_resource_start(dev->pdev, 0), pci_resource_len(dev->pdev, 0)); + goto err_pci_save_state; + } + + return 0; + +err_pci_save_state: + pci_disable_pcie_error_reporting(dev->pdev); + pci_release_selected_regions(dev->pdev, pci_select_bars(dev->pdev, IORESOURCE_MEM)); +err_pci: + pci_disable_device(dev->pdev); + return ret; +} + +static const struct pci_device_id dh_zf_mpf_pci_table[] = { + { PCI_DEVICE(ZXDH_MPF_VENDOR_ID, ZXDH_MPF_DEVICE_ID), 0 }, + { 0, } +}; + +MODULE_DEVICE_TABLE(pci, dh_zf_mpf_pci_table); + +void dh_zf_mpf_pci_close(struct dh_core_dev *dev) +{ + struct dh_en_mpf_dev *mpf_dev = NULL; + + mpf_dev = dh_core_priv(dev); + iounmap((void __iomem *)mpf_dev->pci_ioremap_addr); + pci_disable_pcie_error_reporting(dev->pdev); + pci_release_selected_regions(dev->pdev, pci_select_bars(dev->pdev, IORESOURCE_MEM)); + pci_disable_device(dev->pdev); + + return; +} + +int32_t dh_zf_mpf_pcie_id_get(struct dh_core_dev *dh_dev) +{ + u8 pos = 0; + uint8_t type = 0; + uint16_t padding = 0; + struct dh_en_mpf_dev *mpf_dev = dh_core_priv(dh_dev); + struct pci_dev *pdev = dh_dev->pdev; + + for (pos = pci_find_capability(pdev, PCI_CAP_ID_VNDR); pos > 0; pos = pci_find_next_capability(pdev, pos, PCI_CAP_ID_VNDR)) + { + pci_read_config_byte(pdev, pos + offsetof(struct zxdh_pf_pci_cap, cfg_type), &type); + + if (type == ZXDH_PCI_CAP_PCI_CFG) + { + pci_read_config_word(pdev, pos + offsetof(struct zxdh_pf_pci_cap, padding[0]), &padding); + mpf_dev->pcie_id = padding; + LOG_INFO("pf_dev->pcie_id: 0x%x\n", mpf_dev->pcie_id); + return 0; + } + } + return -1; +} + +static int32_t dh_zf_mpf_probe(struct pci_dev *pdev, const struct pci_device_id *id) +{ + struct dh_core_dev *dh_dev = NULL; + struct devlink *devlink = NULL; + int32_t err = 0; + + LOG_INFO("mpf driver start to probe\n"); + + devlink = zxdh_devlink_alloc(&pdev->dev, &dh_mpf_devlink_ops, sizeof(struct dh_en_mpf_dev)); + if (devlink == NULL) + { + dev_err(&pdev->dev, "devlink alloc failed\n"); + return -ENOMEM; + } + + dh_dev = devlink_priv(devlink); + dh_dev->device = &pdev->dev; + dh_dev->pdev = pdev; + dh_dev->devlink_ops = &dh_mpf_core_devlink_ops; + + err = dh_zf_mpf_pci_init(dh_dev); + if (err != 0) + { + dev_err(&pdev->dev, "%s failed: %d\n", __func__, err); + goto err_devlink_cleanup; + } + +#ifdef CONFIG_ZF_GDMA + err = dh_zf_mpf_gdma_init(dh_dev); + if (err != 0) + { + dh_err(dh_dev, "Failed to initialize gdma module\n"); + goto err_gdma_init; + } +#endif + + err = dh_zf_mpf_pcie_id_get(dh_dev); + if (err != 0) + { + dev_err(&pdev->dev, "dh_pf_pcie_id_get failed: %d\n", err); + goto err_pci; + } + + err = dh_mpf_irq_table_init(dh_dev); // dh_dev->irq_table.priv = kvzalloc(sizeof(struct dh_mpf_irq_table), GFP_KERNEL); + if (err != 0) + { + dh_err(dh_dev, "Failed to alloc IRQs\n"); + goto err_pci; + } + + err = dh_mpf_eq_table_init(dh_dev); + if (err != 0) + { + dh_err(dh_dev, "Failed to alloc IRQs\n"); + goto err_eq_table_init; + } + + err = dh_mpf_irq_table_create(dh_dev); + if (err != 0) + { + dh_err(dh_dev, "Failed to alloc IRQs\n"); + goto err_irq_table_create; + } + + err = dh_mpf_eq_table_create(dh_dev); + if (err != 0) + { + dh_err(dh_dev, "Failed to alloc EQs\n"); + goto err_eq_table_create; + } + +#ifdef PCIE_ZF_EPC_OPEN + err = pcie_zte_zf_epc_init(dh_dev, id); + if (err != 0) + { + dh_err(dh_dev, "failed to initialize epc\n"); + goto err_epc_init; + } +#endif + +#ifdef PCIE_ZF_RST_FINISH_FLAG_OPEN + err = zf_reset_finish_flag_init(dh_dev, dh_dev->zf_ep->mpf_paddr); + if (err != 0) + { + dh_err(dh_dev, "failed to initialize zf_reset_finish_flag_init\n"); + goto err_zf_reset_finish_flag_init_cleanup; + } +#endif + + err = dh_zf_mpf_events_init(dh_dev); + if (err != 0) + { + dh_err(dh_dev, "failed to initialize events\n"); + goto err_events_init_cleanup; + } + + err = zxdh_host_reset_driver_init(dh_dev); + if (err != 0) + { + LOG_ERR("zxdh_host_reset_driver_init failed: %d\n", err); + goto err_zf_host_reset; + } + + err = zxdh_bar_ioctl_msg_mdl_init(dh_dev); + if (err != 0) + { + LOG_ERR("zxdh_bar_ioctl_msg_mdl_init failed: %d\n", err); + goto err_zf_host_reset; + } + +#ifdef HAVE_DEVLINK_REGISTER_GET_1_PARAMS + zxdh_devlink_register(devlink); +#else + zxdh_devlink_register(devlink, &pdev->dev); +#endif + + LOG_INFO("mpf driver probe completed\n"); + return 0; + +err_zf_host_reset: + zxdh_host_reset_driver_exit(dh_dev); +err_events_init_cleanup: +#ifdef PCIE_ZF_RST_FINISH_FLAG_OPEN + zf_reset_finish_flag_exit(); +err_zf_reset_finish_flag_init_cleanup: +#endif +#ifdef PCIE_ZF_EPC_OPEN + pcie_zte_zf_epc_free(dh_dev); +err_epc_init: +#endif + dh_mpf_eq_table_destroy(dh_dev); +err_eq_table_create: + dh_mpf_irq_table_destroy(dh_dev); +err_irq_table_create: + dh_eq_table_cleanup(dh_dev); +err_eq_table_init: + dh_irq_table_cleanup(dh_dev); +err_pci: +#ifdef CONFIG_ZF_GDMA + dh_zf_mpf_gdma_uninit(dh_dev); +err_gdma_init: +#endif + dh_zf_mpf_pci_close(dh_dev); +err_devlink_cleanup: + zxdh_devlink_free(devlink); + return err; +} + +static void dh_zf_mpf_remove(struct pci_dev *pdev) +{ + struct dh_core_dev *dh_dev = pci_get_drvdata(pdev); + struct devlink *devlink = priv_to_devlink(dh_dev); + + LOG_INFO("mpf driver start to remove"); + +#ifdef PCIE_ZF_RST_FINISH_FLAG_OPEN + zf_reset_finish_flag_exit(); +#endif + zxdh_devlink_unregister(devlink); +#ifdef PCIE_ZF_EPC_OPEN + pcie_zte_zf_epc_free(dh_dev); +#endif + zxdh_bar_ioctl_msg_mdl_exit(dh_dev); + zxdh_host_reset_driver_exit(dh_dev); + dh_zf_mpf_events_uninit(dh_dev); + dh_mpf_eq_table_destroy(dh_dev); + dh_mpf_irq_table_destroy(dh_dev); + dh_eq_table_cleanup(dh_dev); + dh_irq_table_cleanup(dh_dev); +#ifdef CONFIG_ZF_GDMA + dh_zf_mpf_gdma_uninit(dh_dev); +#endif + dh_zf_mpf_pci_close(dh_dev); + zxdh_devlink_free(devlink); + + pci_set_drvdata(pdev, NULL); + + LOG_INFO("mpf driver remove completed\n"); +} + +static int32_t dh_zf_mpf_suspend(struct pci_dev *pdev, pm_message_t state) +{ + + return 0; +} + +static int32_t dh_zf_mpf_resume(struct pci_dev *pdev) +{ + + return 0; +} + +static void dh_zf_mpf_shutdown(struct pci_dev *pdev) +{ + dh_zf_mpf_remove(pdev); +} + +static pci_ers_result_t dh_pci_err_detected(struct pci_dev *pdev, + pci_channel_state_t state) +{ + return PCI_ERS_RESULT_NONE; +} + +static pci_ers_result_t dh_zf_mpf_pci_slot_reset(struct pci_dev *pdev) +{ + return PCI_ERS_RESULT_NONE; +} + +static void dh_zf_mpf_pci_resume(struct pci_dev *pdev) +{ + +} + +static const struct pci_error_handlers dh_zf_mpf_err_handler = { + .error_detected = dh_pci_err_detected, + .slot_reset = dh_zf_mpf_pci_slot_reset, + .resume = dh_zf_mpf_pci_resume +}; + +static struct pci_driver zf_dh_mpf_driver = { + .name = KBUILD_MODNAME, + .id_table = dh_zf_mpf_pci_table, + .probe = dh_zf_mpf_probe, + .remove = dh_zf_mpf_remove, + .suspend = dh_zf_mpf_suspend, + .resume = dh_zf_mpf_resume, + .shutdown = dh_zf_mpf_shutdown, + .err_handler = &dh_zf_mpf_err_handler, +}; + +static int32_t __init init(void) +{ + int32_t err = 0; + + err = pci_register_driver(&zf_dh_mpf_driver); + if (err != 0) + { + LOG_ERR("pci_register_driver failed: %d\n", err); + return err; + } + +#ifdef CONFIG_ZXDH_SF + err = zxdh_mpf_sf_driver_register(); + if (err != 0) + { + LOG_ERR("zxdh_en_sf_driver_register failed: %d\n", err); + goto err_sf; + } +#endif + + err = zxdh_host_fuc_hotplug_driver_init(); + if (err != 0){ + LOG_ERR("fuc_hotplug_driver_init failed: %d\n", err); + goto err_fuc_hotplug; + } + LOG_INFO("zxdh_mpf driver init success\n"); + + return 0; + +err_fuc_hotplug: + +#ifdef CONFIG_ZXDH_SF +err_sf: + pci_unregister_driver(&zf_dh_mpf_driver); +#endif + + return err; +} + +static void __exit cleanup(void) +{ +#ifdef CONFIG_ZXDH_SF + zxdh_mpf_sf_driver_uregister(); +#endif + zxdh_host_fuc_hotplug_driver_exit(); + pci_unregister_driver(&zf_dh_mpf_driver); + +#ifdef PCIE_ZF_RST_FINISH_FLAG_OPEN + zf_reset_finish_flag_exit(); +#endif + + LOG_INFO("zxdh_mpf driver remove success\n"); +} + +module_init(init); +module_exit(cleanup); diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_mpf.h b/src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_mpf.h new file mode 100755 index 0000000..34cd934 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_mpf.h @@ -0,0 +1,36 @@ +#ifndef __ZXDH_ZF_MPF_H__ +#define __ZXDH_ZF_MPF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include "gdma.h" + +#define ZXDH_MPF_VENDOR_ID 0x1cf2 +#define ZXDH_MPF_DEVICE_ID 0x8044 + +#define ZXDH_BAR1_CHAN_OFFSET 0x2000//0x7801000 +#define ZXDH_BAR2_CHAN_OFFSET 0x3000//0x7802000 +#define PCIE_ZF_RST_FINISH_FLAG_OPEN 1 + +struct dh_en_mpf_dev { + uint16_t ep_bdf; + uint16_t pcie_id; + uint16_t vport; + + uint64_t pci_ioremap_addr; + + struct work_struct dh_np_sdk_from_risc; + struct work_struct dh_np_sdk_from_pf; + + struct zf_gdma_dev *gdev; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* __ZXDH_EN_MPF_H__ */ \ No newline at end of file diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_reset_finish_flag.c b/src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_reset_finish_flag.c new file mode 100755 index 0000000..0bd473a --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/zf_reset_finish_flag.c @@ -0,0 +1,95 @@ +#include +#include +#include +#include +#include +#include +#include +#include "epc/pcie-zte-zf-epc.h" + +#define FLAG_ID 0x1 +#define SYSFS_ZF_RESET_FINISH_FLAG_DIR "zf_reset_finish_flag" +#define ZF_RESET_FINISH_FLAG_MODE 0664 +#define ZF_RESET_FINISH_FLAG flag +#define NOTIFY_OFFEST (PCIE_DPU_MPF_CSR_ADDR(PCIE_DPU_EP_CSR_SIZE * PCIE_DPU_EP_NUM) + 4) +#define NOTIFY_VALUE (1 << 1) +#define NOTIFY_MASK (1 << 1) + +static char flag_data[PAGE_SIZE]; +static struct kobject *zf_reset_finish_flag_kobj = NULL; +unsigned long op_paddr = 0; + +static int notify_host_zf_reset_finished(void) +{ + int ret = 0; + + ret = cfg_phy_rmw(op_paddr + NOTIFY_OFFEST, NOTIFY_VALUE, NOTIFY_MASK); + + if (ret) { + printk(KERN_ERR "notify_host_zf_reset_finished, cfg_phy_rmw write failed!\n"); + } + + return ret; +} + +static ssize_t read_flag(struct kobject *kobj, struct kobj_attribute *attr, + char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%s", flag_data); +} + +static ssize_t write_flag(struct kobject *kobj, struct kobj_attribute *attr, + const char *buf, size_t count) +{ + int size = 0; + unsigned long flag = 0; + char *end = NULL; + + size = snprintf(flag_data, PAGE_SIZE, "%s", buf); + flag = simple_strtoul(flag_data, &end, 16); + if (FLAG_ID == flag) + { + notify_host_zf_reset_finished(); + } + + return size; +} + +static struct kobj_attribute flag_attribute = + __ATTR(ZF_RESET_FINISH_FLAG, ZF_RESET_FINISH_FLAG_MODE, read_flag, write_flag); + +int zf_reset_finish_flag_init(struct dh_core_dev *dh_dev, unsigned long ep_mpf_paddr) +{ + int ret = 0; + + op_paddr = ep_mpf_paddr; + if (zf_reset_finish_flag_kobj == NULL) + { + zf_reset_finish_flag_kobj = kobject_create_and_add(SYSFS_ZF_RESET_FINISH_FLAG_DIR, kernel_kobj); + if (!zf_reset_finish_flag_kobj) + return -ENOMEM; + + ret = sysfs_create_file(zf_reset_finish_flag_kobj, &flag_attribute.attr); + if (ret) + { + kobject_put(zf_reset_finish_flag_kobj); + zf_reset_finish_flag_kobj = NULL; + } + } + else + { + dh_err(dh_dev, "zf_reset_finish_flag_kobj is not NULL!, can't create zf_reset_finish_flag!\n"); + ret = -EINVAL; + } + + return ret; +} + +void zf_reset_finish_flag_exit(void) +{ + if (zf_reset_finish_flag_kobj != NULL) { + sysfs_remove_file(zf_reset_finish_flag_kobj, &flag_attribute.attr); + kobject_put(zf_reset_finish_flag_kobj); + zf_reset_finish_flag_kobj = NULL; + } +} diff --git a/src/net/drivers/net/ethernet/dinghai/zf_mpf/zxdh_reset_zf.c b/src/net/drivers/net/ethernet/dinghai/zf_mpf/zxdh_reset_zf.c new file mode 100755 index 0000000..d8f8082 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zf_mpf/zxdh_reset_zf.c @@ -0,0 +1,242 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "zf_mpf.h" + +#define ZXDH_SYSFS_DIR "zxdh_host_reset" +#define ZXDH_SYSFS_FILE_EP_CHECK_REGISTER "ep_check_register" +#define ZXDH_SYSFS_FILE_EP_RESET_INFO "ep_reset_info" + + +struct zxdh_reset_dev +{ + uint16_t pcie_id; + uint64_t bar0_base_virt_addr; + uint64_t is_valid; +}reset_dev = {0}; + +struct zxdh_reset_dev *zxdh_get_reset_dev(void) +{ + return &reset_dev; +} + +int zxdh_init_reset_dev(struct dh_core_dev *core_dev) +{ + struct zxdh_reset_dev *dev = zxdh_get_reset_dev(); + + struct dh_en_mpf_dev *mpf_dev = dh_core_priv(core_dev); + dev->bar0_base_virt_addr = mpf_dev->pci_ioremap_addr; + dev->is_valid = 1; + dev->pcie_id = mpf_dev->pcie_id; + return 0; +} + + +extern int zxdh_bar_chan_sync_msg_send(struct zxdh_pci_bar_msg *in, struct zxdh_msg_recviver_mem *result); +extern int zxdh_bar_chan_msg_recv_register(uint8_t event_id, zxdh_bar_chan_msg_recv_callback callback); +extern int zxdh_bar_chan_msg_recv_unregister(uint8_t event_id); + +enum e_reset_event +{ + EV_HOST_RESET = 0, + EV_ZF_RESET = 1, + EV_DINGHAI_RESET = 2, + EV_ZXDH_RESET_TEST = 3, + EV_MAX_RESET +}; + + +struct host_reset_ev_info +{ + int ep_no; +}; + +struct zxdh_reset_priv { + enum e_reset_event e_reset_event; + union + { + struct host_reset_ev_info host_reset_ev; + } ev_info; + struct work_struct work; +}; + +/* 本模块在ZF中insmod + +使用sysfs接口,主目录:/sys/zxdh_host_reset/,包含下述文件 +1、ep_check_register +功能:业务通知risc-v需要进行检测的ep +参数:16进制的字符串。例子:0xffffffff +字符串转为4个字节长度的数值,每个bit位代表一个ep。bit0~bit31代表ep0~ep31。 +当bit位设置为1时,表示该ep需要进行复位检测上报。 +当bit位设置为0时,表示该ep不需要进行复位检测上报。 +用户操作: +1)向 ep_check_register 写入 value + 含义:通知risc-v需要进行检测的ep +2)读取ep_check_register + 返回value,表示当前监测的ep +2、ep_reset_info +功能:ep复位后,业务通过这个文件查询 +参数:16进制的字符串。例子:0xffffffff +字符串转为4个字节长度的数值,每个bit位代表一个ep。bit0~bit31代表ep0~ep31。 +当bit位为1时,表示该ep发生了reset。 +当bit位为0时,表示该ep没有发生reset。 +用户操作: +1)读取ep_reset_info + 返回value,获取发生reset的ep信息 +2)向 ep_reset_info 写入 value + 将发生reset的ep信息清0 +*/ +unsigned int ep_check_register = 0; +unsigned int ep_reset_info = 0; + +struct kobject *kobj_zxdh_host_reset = NULL; + + +/*该函数被调用在sysfs文件被读时*/ +static ssize_t sysfs_show_ep_check_register(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + return sprintf(buf, "0x%08x", ep_check_register); +} + +/* 该函数被调用在sysfs文件被写时*/ +static ssize_t sysfs_store_ep_check_register(struct kobject *kobj, + struct kobj_attribute *attr,const char *buf, size_t count) +{ + uint16_t ret = 0; + + struct zxdh_pci_bar_msg in = {0}; + struct zxdh_msg_recviver_mem result = {0}; + uint8_t recv_buffer[20] = {0}; + uint16_t recv_buff_len = 20; + struct zxdh_reset_dev *dev = zxdh_get_reset_dev(); + sscanf(buf,"0x%x",&ep_check_register); + + in.virt_addr = dev->bar0_base_virt_addr + ZXDH_BAR1_CHAN_OFFSET; + in.payload_addr = &ep_check_register; + in.payload_len = sizeof(ep_check_register); + in.src = MSG_CHAN_END_PF;//MSG_CHAN_END_MPF; + in.dst = MSG_CHAN_END_RISC; + in.event_id = MODULE_RESET_MSG;/* 事件号 */ + in.src_pcieid = dev->pcie_id; + + result.recv_buffer = recv_buffer; + result.buffer_len = recv_buff_len; + + ret = zxdh_bar_chan_sync_msg_send(&in, &result); + if (ret) + { + pr_err(" '%s' zxdh_bar_chan_sync_msg_send failed.\n", __FUNCTION__); + } + return count; +} + +/*该函数被调用在sysfs文件被读时*/ +static ssize_t sysfs_show_ep_reset_info(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + return sprintf(buf, "0x%08x", ep_reset_info); +} + +/* 该函数被调用在sysfs文件被写时*/ +static ssize_t sysfs_store_ep_reset_info(struct kobject *kobj, + struct kobj_attribute *attr,const char *buf, size_t count) +{ + sscanf(buf,"0x%x",&ep_reset_info); + return count; +} + +/*使用__ATTR宏初始化zxdh_host_reset_attr结构体,该宏定义在include/linux/sysfs.h*/ +struct kobj_attribute zxdh_host_reset_attr_ep_check_register = __ATTR(ep_check_register, 0664, sysfs_show_ep_check_register, sysfs_store_ep_check_register); +struct kobj_attribute zxdh_host_reset_attr_ep_reset_info = __ATTR(ep_reset_info, 0664, sysfs_show_ep_reset_info, sysfs_store_ep_reset_info); + +int32_t zxdh_reset_zf_rec_risc(void *pay_load, uint16_t len, void *reps_buffer, uint16_t *reps_len, void *dev) +{ + struct zxdh_reset_priv *priv = NULL; + uint32_t ep_no = 0; + uint32_t ep_reset_info_tmp = ep_reset_info; + + if (pay_load && len && reps_buffer && reps_len) + { + pr_info("%s: para check ok ok ok.(%p, %x, %p, %p)\n", __func__, pay_load, len, reps_buffer, reps_len); + } + else + { + pr_err("%s: para error.(%p, %x, %p, %p)\n", __func__, pay_load, len, reps_buffer, reps_len); + return (uint16_t)-1; + } + + + priv = pay_load; + ep_no = priv->ev_info.host_reset_ev.ep_no; + + pr_info(" %s: received msg from RISC-V: event_id[%d] len 0x%x, ep_no=%u\n", __FUNCTION__, MODULE_RESET_MSG, len, ep_no); + + ep_reset_info |= 1 << ep_no; + pr_info(" %s: ep_reset_info 0x%08x -> 0x%08x\n", __FUNCTION__, ep_reset_info_tmp, ep_reset_info); + + return 0; +} + + +/*模块初始化函数*/ +int zxdh_host_reset_driver_init(struct dh_core_dev *core_dev) +{ + int32_t ret = 0; + /*创建一个目录在/sys下 */ + kobj_zxdh_host_reset = kobject_create_and_add(ZXDH_SYSFS_DIR,NULL); + + zxdh_init_reset_dev(core_dev); + + /*在ZXDH_SYSFS_DIR目录下创建文件*/ + if(sysfs_create_file(kobj_zxdh_host_reset,&zxdh_host_reset_attr_ep_check_register.attr)){ + pr_err(" 'ep_check_register' sysfs create failed.\n"); + goto error_sysfs; + } + + if(sysfs_create_file(kobj_zxdh_host_reset,&zxdh_host_reset_attr_ep_reset_info.attr)){ + pr_err(" 'ep_reset_info' sysfs create failed.\n"); + goto error_sysfs; + } + + ret = zxdh_bar_chan_msg_recv_register(MODULE_RESET_MSG, zxdh_reset_zf_rec_risc); + if (ret != 0) + { + pr_err(" zxdh_bar_chan_msg_recv_register: event_id[%d] register failed: %d\n", MODULE_RESET_MSG, ret); + //return ret; + } + + pr_info(" zxdh host reset module init ok.\n"); + return 0; + +error_sysfs: + zxdh_bar_chan_msg_recv_unregister(MODULE_RESET_MSG); + sysfs_remove_file(kernel_kobj, &zxdh_host_reset_attr_ep_reset_info.attr); + sysfs_remove_file(kernel_kobj, &zxdh_host_reset_attr_ep_check_register.attr); + kobject_put(kobj_zxdh_host_reset); + return -1; + +} + +/*模块退出函数*/ +void zxdh_host_reset_driver_exit(struct dh_core_dev *core_dev) +{ + zxdh_bar_chan_msg_recv_unregister(MODULE_RESET_MSG); + sysfs_remove_file(kernel_kobj, &zxdh_host_reset_attr_ep_reset_info.attr); + sysfs_remove_file(kernel_kobj, &zxdh_host_reset_attr_ep_check_register.attr); + kobject_put(kobj_zxdh_host_reset); + pr_info(" zxdh host reset module remove ok.\n"); +} +#if 0 +module_init(zxdh_host_reset_driver_init); +module_exit(zxdh_host_reset_driver_exit); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("zxdh"); +MODULE_DESCRIPTION("for zxdh host reset"); +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/zxdh_tools/zxdh_tools_ioctl.c b/src/net/drivers/net/ethernet/dinghai/zxdh_tools/zxdh_tools_ioctl.c new file mode 100755 index 0000000..ac88256 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zxdh_tools/zxdh_tools_ioctl.c @@ -0,0 +1,476 @@ +#include +#include +#include "../en_aux.h" +#include "../cmd/msg_chan_priv.h" +#include "../en_aux/priv_queue.h" +#include "zxdh_tools_ioctl.h" + + +uint32_t user_event_pid = 0; + +/* Started by AICoder, pid:x7951lc26423ce61419e0a0a502a9b6cc494ddd1 */ +int32_t zxdh_tools_mark_event_info(struct net_device *netdev, struct ifreq *ifr) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct zxdh_tools_msg *msg = NULL; + struct zxdh_tools_reps tools_reps = {0}; + struct dhtool_dev_pcieid_get dev_pcieid_get = {0}; + + DHTOOLS_LOG_INFO("is called!\n"); + msg = (struct zxdh_tools_msg *)kzalloc(sizeof(struct zxdh_tools_msg), GFP_KERNEL); + if(msg == NULL) + { + DHTOOLS_LOG_ERR(" kzalloc msg failed!!!\n"); + return -1; + } + + if (copy_from_user(msg, ifr->ifr_ifru.ifru_data, sizeof(struct zxdh_tools_msg))) { + DHTOOLS_LOG_ERR("copy_from_user failed!!!\n"); + kfree(msg); + return -EFAULT; + } + + user_event_pid = msg->event_pid; + tools_reps.status = MSG_RECV_OK; + tools_reps.data[0] = msg->event_id; + + DHTOOLS_LOG_INFO("en_dev->pcie_id=0x%x\n", en_dev->pcie_id); + DHTOOLS_LOG_INFO("user_event_pid=%d\n", user_event_pid); + dev_pcieid_get.dev_pcieid = en_dev->pcie_id; + + if (unlikely(copy_to_user((void __user *)msg->msg_reps, &dev_pcieid_get, sizeof(struct dhtool_dev_pcieid_get)))) + { + DHTOOLS_LOG_ERR("copy_to_user failed!!!\n"); + kfree(msg); + return -EFAULT; + } + + if (unlikely(copy_to_user((void __user *)msg->tools_reps, &tools_reps, sizeof(struct zxdh_tools_reps)))) + { + DHTOOLS_LOG_ERR("copy_to_user failed!!!\n"); + kfree(msg); + return -EFAULT; + } + kfree(msg); + return 0; +} +/* Ended by AICoder, pid:x7951lc26423ce61419e0a0a502a9b6cc494ddd1 */ + +int32_t zxdh_tools_ioctl_barchan_send(struct net_device *netdev, struct ifreq *ifr) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct zxdh_tools_msg *msg = NULL; + uint8_t *payload_addr = NULL; + uint8_t *msg_reps = NULL; + uint16_t msg_reps_len = 0; + struct zxdh_tools_reps tools_reps = {0}; + struct zxdh_pci_bar_msg in = {0}; + struct zxdh_msg_recviver_mem result = {0}; + int32_t ret = 0; + + DHTOOLS_LOG_INFO("is called!\n"); + DHTOOLS_LOG_INFO("en_dev->pcie_id=0x%x\n", en_dev->pcie_id); + + msg = (struct zxdh_tools_msg *)kzalloc(sizeof(struct zxdh_tools_msg), GFP_KERNEL); + if(msg == NULL) + { + DHTOOLS_LOG_ERR("kzalloc msg failed!!!\n"); + return -1; + } + + if (copy_from_user(msg, ifr->ifr_ifru.ifru_data, sizeof(struct zxdh_tools_msg))) { + DHTOOLS_LOG_ERR("copy_from_user failed!!!\n"); + kfree(msg); + return -EFAULT; + } + + if(msg->payload_len == 0 || msg->payload_len > BAR_MSG_PAYLOAD_MAX_LEN) + { + DHTOOLS_LOG_ERR("send para ERR: invalid payload len: %d!\n", msg->payload_len); + kfree(msg); + return -1; + } + + payload_addr = vmalloc(msg->payload_len); + if(payload_addr == NULL) + { + DHTOOLS_LOG_ERR("vmalloc payload_addr failed!!!\n"); + kfree(msg); + return -1; + } + + if (copy_from_user(payload_addr, ifr->ifr_ifru.ifru_data + sizeof(struct zxdh_tools_msg), msg->payload_len)){ + DHTOOLS_LOG_ERR("copy_from_user failed!!!\n"); + vfree(payload_addr); + kfree(msg); + return -EFAULT; + } + +/*调试*/ +#if 0 + DHTOOLS_LOG_INFO("msg->payload_len = %u\n", msg->payload_len); + int i; + for(i = 0; i < msg->payload_len; i+=sizeof(uint32_t)) + { + DHTOOLS_LOG_INFO("*(uint32_t*)(payload_addr + %d) = %d\n", i, *(uint32_t*)(payload_addr + i)); + } +#endif + + in.virt_addr = (uint64_t)ZXDH_BAR_MSG_BASE(en_dev->ops->get_bar_virt_addr(en_dev->parent, 0)); + in.payload_addr = payload_addr; + in.payload_len = msg->payload_len; + in.src = MSG_CHAN_END_PF; + in.dst = msg->dst; + in.event_id = msg->event_id; + in.src_pcieid = en_dev->pcie_id; + in.dst_pcieid = msg->dst_pcieid; + + if(msg->msg_reps_len == 0 || msg->msg_reps_len > BAR_MSG_PAYLOAD_MAX_LEN) + { + DHTOOLS_LOG_ERR("send para ERR: invalid msg_reps_len: %d!\n", msg->msg_reps_len); + vfree(payload_addr); + kfree(msg); + return -1; + } + result.buffer_len = msg->msg_reps_len + REPS_HEADER_PAYLOAD_OFFSET; + result.recv_buffer = vmalloc(result.buffer_len); + if(result.recv_buffer == NULL) + { + DHTOOLS_LOG_ERR("vmalloc result.recv_buffer failed!!!\n"); + vfree(payload_addr); + kfree(msg); + return -1; + } + msg_reps = (uint8_t *)result.recv_buffer + REPS_HEADER_PAYLOAD_OFFSET; + msg_reps_len = msg->msg_reps_len; + + ret = zxdh_bar_chan_sync_msg_send(&in, &result); + if (ret != BAR_MSG_OK) + { + DHTOOLS_LOG_ERR("zxdh_bar_chan_sync_msg_send failed, ret=%d!!!\n", ret); + } + + tools_reps.bar_or_vq_chan_ret = ret; + tools_reps.status = MSG_RECV_OK; + tools_reps.data[0] = msg->event_id; + + /*调试*/ + //DHTOOLS_LOG_INFO("result.recv_buffer 8 bytes: 0x%llx\n", *(uint64_t *)result.recv_buffer); + + if (unlikely(copy_to_user((void __user *)msg->msg_reps, msg_reps, msg_reps_len))) + { + DHTOOLS_LOG_ERR("copy_to_user failed!!!\n"); + vfree(result.recv_buffer); + vfree(payload_addr); + kfree(msg); + return -EFAULT; + } + + if (unlikely(copy_to_user((void __user *)msg->tools_reps, &tools_reps, sizeof(struct zxdh_tools_reps)))) + { + DHTOOLS_LOG_ERR("copy_to_user failed!!!\n"); + vfree(result.recv_buffer); + vfree(payload_addr); + kfree(msg); + return -EFAULT; + } + + vfree(result.recv_buffer); + vfree(payload_addr); + kfree(msg); + return 0; +} + + +#ifdef ZXDH_MSGQ +int32_t zxdh_tools_ioctl_msgq_send(struct net_device *netdev, struct ifreq *ifr) +{ + struct zxdh_en_device *en_dev = NULL; + struct msgq_dev *msgq_dev = NULL; + struct msgq_pkt_info pkt_info = {0}; + struct zxdh_tools_msg *msg = NULL; + uint8_t *payload_addr = NULL; + struct zxdh_tools_reps tools_reps = {0}; + struct reps_info msg_reps = {0}; + int32_t ret = 0; + + CHECK_EQUAL_ERR(ifr, NULL, -EADDRNOTAVAIL, "ifr is null!\n"); + CHECK_EQUAL_ERR(netdev, NULL, -EADDRNOTAVAIL, "netdev is null!\n"); + + en_dev = netdev_priv(netdev); + if (en_dev == NULL) + { + LOG_ERR("en_dev is null!\n"); + return -1; + } + msgq_dev = (struct msgq_dev *)en_dev->msgq_dev; + if (msgq_dev == NULL) + { + LOG_ERR("msgq_dev null!\n"); + return -1; + } + + DHTOOLS_LOG_INFO("is called!\n"); + DHTOOLS_LOG_INFO("en_dev->pcie_id=0x%x\n", en_dev->pcie_id); + + msg = (struct zxdh_tools_msg *)kzalloc(sizeof(struct zxdh_tools_msg), GFP_KERNEL); + if(msg == NULL) + { + DHTOOLS_LOG_ERR("kzalloc msg failed!!!\n"); + return -1; + } + + if (copy_from_user(msg, ifr->ifr_ifru.ifru_data, sizeof(struct zxdh_tools_msg))) { + DHTOOLS_LOG_ERR("copy_from_user failed!!!\n"); + kfree(msg); + return -1; + } + + if(msg->payload_len == 0 || msg->payload_len > MAX_PACKET_LEN) + { + DHTOOLS_LOG_ERR("send para ERR: invalid payload len: %d!\n", msg->payload_len); + kfree(msg); + return -1; + } + + payload_addr = kzalloc(msg->payload_len + PRIV_HEADER_LEN, GFP_KERNEL); + if(payload_addr == NULL) + { + DHTOOLS_LOG_ERR("vmalloc payload_addr failed!!!\n"); + kfree(msg); + return -1; + } + + if (copy_from_user(payload_addr + PRIV_HEADER_LEN, ifr->ifr_ifru.ifru_data + sizeof(struct zxdh_tools_msg), msg->payload_len)){ + DHTOOLS_LOG_ERR("copy_from_user failed!!!\n"); + kfree(payload_addr); + kfree(msg); + return -1; + } + +/*调试*/ +#if 0 + DHTOOLS_LOG_INFO("msg->payload_len = %u\n", msg->payload_len); + int i; + for(i = 0; i < msg->payload_len; i+=sizeof(uint32_t)) + { + DHTOOLS_LOG_INFO("*(uint32_t*)(payload_addr + %d) = %d\n", i, *(uint32_t*)(payload_addr + i)); + } +#endif + + pkt_info.event_id = msg->event_id; + pkt_info.timeout_us = 400000; + pkt_info.is_async = msg->sync_or_async; + pkt_info.len = msg->payload_len + PRIV_HEADER_LEN; + pkt_info.addr = payload_addr; + DHTOOLS_LOG_INFO("data_len: %d\n", pkt_info.len); + + if(msg->msg_reps_len == 0 || msg->msg_reps_len > MAX_PACKET_LEN) + { + DHTOOLS_LOG_ERR("send para ERR: invalid msg_reps_len: %d!\n", msg->msg_reps_len); + kfree(payload_addr); + kfree(msg); + return -1; + } + msg_reps.len = msg->msg_reps_len; + msg_reps.addr = vmalloc(msg_reps.len); + if(msg_reps.addr == NULL) + { + DHTOOLS_LOG_ERR("vmalloc msg_reps.addr failed!!!\n"); + kfree(payload_addr); + kfree(msg); + return -1; + } + + ret = zxdh_msgq_send_cmd(msgq_dev, &pkt_info, &msg_reps); + if (ret != MSGQ_RET_OK) + { + DHTOOLS_LOG_ERR("zxdh_msgq_send_cmd failed: %d\n", ret); + } + + tools_reps.bar_or_vq_chan_ret = ret; + tools_reps.status = MSG_RECV_OK; + tools_reps.data[0] = msg->event_id; + + if (unlikely(copy_to_user((void __user *)msg->msg_reps, msg_reps.addr, msg_reps.len))) + { + DHTOOLS_LOG_ERR("copy_to_user failed!!!\n"); + goto err_ret; + } + + if (unlikely(copy_to_user((void __user *)msg->tools_reps, &tools_reps, sizeof(struct zxdh_tools_reps)))) + { + DHTOOLS_LOG_ERR("copy_to_user failed!!!\n"); + goto err_ret; + } + + vfree(msg_reps.addr); + kfree(msg); + return 0; + +err_ret: + vfree(msg_reps.addr); + kfree(msg); + return -1; +} +#endif + +int32_t dhtool_device_info_get(struct net_device *netdev, struct ifreq *ifr) +{ + struct zxdh_en_priv *en_priv = netdev_priv(netdev); + struct zxdh_en_device *en_dev = &en_priv->edev; + struct pci_dev *pdev = NULL; + struct pci_dev *swdsp_pdev = NULL; + struct pci_dev *swusp_pdev = NULL; + struct pci_dev *rp_pdev = NULL; + + struct zxdh_tools_msg *msg = NULL; + struct zxdh_tools_reps tools_reps = {0}; + struct dhtool_dev_info_get_reps dev_info_get = {0}; + int sscanf_ret = 0; + + DHTOOLS_LOG_INFO("is called!\n"); + msg = (struct zxdh_tools_msg *)kzalloc(sizeof(struct zxdh_tools_msg), GFP_KERNEL); + if(msg == NULL) + { + DHTOOLS_LOG_ERR(" kzalloc msg failed!!!\n"); + return -1; + } + + if (copy_from_user(msg, ifr->ifr_ifru.ifru_data, sizeof(struct zxdh_tools_msg))) { + DHTOOLS_LOG_ERR("copy_from_user failed!!!\n"); + kfree(msg); + return -EFAULT; + } + + tools_reps.status = MSG_RECV_OK; + + pdev = en_dev->ops->get_pdev(en_dev->parent); + if (!pdev){ + DHTOOLS_LOG_ERR("pdev is NULL\n"); + kfree(msg); + return -EINVAL; + } + + sscanf_ret = sscanf(pci_name(pdev), "%x:%x:%x.%u", &dev_info_get.dev_info.domain_no, &dev_info_get.dev_info.bus_no, \ + &dev_info_get.dev_info.device_no, &dev_info_get.dev_info.func_no); + if(sscanf_ret != 4){ + DHTOOLS_LOG_ERR("could not get dev domain_no、bus_no、device_no、func_no from pci_name(pdev)\n"); + kfree(msg); + return -1; + + } + DHTOOLS_LOG_INFO("dev_info, domain:bus:device.func = %04x:%02x:%02x.%x\n", dev_info_get.dev_info.domain_no, dev_info_get.dev_info.bus_no, \ + dev_info_get.dev_info.device_no, dev_info_get.dev_info.func_no); + + swdsp_pdev = pci_upstream_bridge(pdev); + if (!swdsp_pdev){ + DHTOOLS_LOG_ERR("swdsp_pdev is NULL\n"); + kfree(msg); + return -EINVAL; + } + + if(swdsp_pdev->device == SWITCH_DEVICE_ID && swdsp_pdev->vendor == SWITCH_VENDOR_ID){ + swusp_pdev = pci_upstream_bridge(swdsp_pdev); + if (!swusp_pdev){ + DHTOOLS_LOG_ERR("swusp_pdev is NULL\n"); + kfree(msg); + return -EINVAL; + } + + rp_pdev = pci_upstream_bridge(swusp_pdev); + if (!rp_pdev) + { + DHTOOLS_LOG_ERR("rp_pdev is NULL\n"); + kfree(msg); + return -EINVAL; + } + dev_info_get.switch_or_noswitch = SWITCH; + sscanf_ret = sscanf(pci_name(rp_pdev), "%x:%x:%x.%u", &dev_info_get.rp_info.domain_no, &dev_info_get.rp_info.bus_no, \ + &dev_info_get.rp_info.device_no, &dev_info_get.rp_info.func_no); + if(sscanf_ret != 4){ + DHTOOLS_LOG_ERR("could not get rp domain_no、bus_no、device_no、func_no from pci_name(rp_pdev)\n"); + kfree(msg); + return -1; + } + sscanf_ret = sscanf(pci_name(swusp_pdev), "%x:%x:%x.%u", &dev_info_get.swusp_info.domain_no, &dev_info_get.swusp_info.bus_no, \ + &dev_info_get.swusp_info.device_no, &dev_info_get.swusp_info.func_no); + if(sscanf_ret != 4){ + DHTOOLS_LOG_ERR("could not get swusp domain_no、bus_no、device_no、func_no from pci_name(swusp_pdev)\n"); + kfree(msg); + return -1; + } + } + else{ + dev_info_get.switch_or_noswitch = NO_SWITCH; + sscanf_ret = sscanf(pci_name(swdsp_pdev), "%x:%x:%x.%u", &dev_info_get.rp_info.domain_no, &dev_info_get.rp_info.bus_no, \ + &dev_info_get.rp_info.device_no, &dev_info_get.rp_info.func_no); + if(sscanf_ret != 4){ + DHTOOLS_LOG_ERR("could not get rp domain_no、bus_no、device_no、func_no from pci_name(swdsp_pdev)\n"); + kfree(msg); + return -1; + } + } + DHTOOLS_LOG_INFO("rp_info, domain:bus:device.func = %04x:%02x:%02x.%x\n", dev_info_get.rp_info.domain_no, dev_info_get.rp_info.bus_no, \ + dev_info_get.rp_info.device_no, dev_info_get.rp_info.func_no); + + if (unlikely(copy_to_user((void __user *)msg->msg_reps, &dev_info_get, sizeof(struct dhtool_dev_info_get_reps)))) + { + DHTOOLS_LOG_ERR("copy_to_user failed!!!\n"); + kfree(msg); + return -EFAULT; + } + + if (unlikely(copy_to_user((void __user *)msg->tools_reps, &tools_reps, sizeof(struct zxdh_tools_reps)))) + { + DHTOOLS_LOG_ERR("copy_to_user failed!!!\n"); + kfree(msg); + return -EFAULT; + } + kfree(msg); + return 0; +} + +struct zxdh_tools_ioctl_subcmd_info subcmd_table[] = { + {MSG_MARK_INFO, zxdh_tools_mark_event_info}, +#ifdef ZXDH_TOOLS_MSGQ + {MSG_SEND_TO_RISCV, zxdh_tools_ioctl_msgq_send}, +#else + {MSG_SEND_TO_RISCV, zxdh_tools_ioctl_barchan_send}, +#endif + {MSG_DEVICE_INFO_GET, dhtool_device_info_get}, +}; + +int32_t zxdh_tools_ioctl_dispatcher(struct net_device *netdev, struct ifreq *ifr) +{ + struct zxdh_tools_msg *msg = NULL; + int32_t ret = 0; + uint32_t i = 0; + + DHTOOLS_LOG_INFO("is called!\n"); + msg = (struct zxdh_tools_msg *)kzalloc(sizeof(struct zxdh_tools_msg), GFP_KERNEL); + if(msg == NULL) + { + DHTOOLS_LOG_ERR("kzalloc msg failed!!!\n"); + return -1; + } + + if (copy_from_user(msg, ifr->ifr_ifru.ifru_data, sizeof(struct zxdh_tools_msg))) { + DHTOOLS_LOG_ERR("copy_from_user failed!!!\n"); + kfree(msg); + return -EFAULT; + } + + for (i = 0; i < ARRAY_SIZE(subcmd_table); i++){ + if((subcmd_table[i].subcmd == msg->subcmd) && (subcmd_table[i].subcmd_callback)){ + ret = subcmd_table[i].subcmd_callback(netdev, ifr); + } + } + + kfree(msg); + return ret; +} + + diff --git a/src/net/drivers/net/ethernet/dinghai/zxdh_tools/zxdh_tools_ioctl.h b/src/net/drivers/net/ethernet/dinghai/zxdh_tools/zxdh_tools_ioctl.h new file mode 100755 index 0000000..0e1978b --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zxdh_tools/zxdh_tools_ioctl.h @@ -0,0 +1,88 @@ +#ifndef ZXDH_TOOLS_IOCTL_H_ +#define ZXDH_TOOLS_IOCTL_H_ + +#include + +//#define ZXDH_TOOLS_MSGQ + +#define SWITCH_DEVICE_ID 0x1113 +#define SWITCH_VENDOR_ID 0x1556 +typedef enum +{ + MSG_MARK_INFO = 0, + MSG_SEND_TO_RISCV, + MSG_DEVICE_INFO_GET, + SUBCMD_NUM=10, +}MSG_SUBCMD; + + +typedef enum +{ + MSG_RECV_OK = 1, +}MSG_RESPONSE; + +typedef enum +{ + NO_SWITCH = 0, + SWITCH = 1, +}SWITCH_FLAG; + +struct zxdh_tools_msg +{ + uint32_t subcmd; //provider care + uint32_t event_pid; //provider care + void* tools_reps; //provider care + uint32_t event_id; //caller care + uint16_t dst; //caller care + uint16_t dst_pcieid; //caller care + void* msg_reps; //caller care + uint16_t msg_reps_len; //caller care + uint16_t sync_or_async; //caller care + uint16_t payload_len; //caller care + uint16_t reserved; //caller care + uint8_t payload[0]; +}__attribute__((packed)); + +struct zxdh_tools_reps +{ + uint32_t status; /* must be */ + int32_t bar_or_vq_chan_ret; + uint32_t data[15]; +}; + +struct zxdh_tools_ioctl_subcmd_info +{ + MSG_SUBCMD subcmd; + int32_t (*subcmd_callback)(struct net_device *netdev, struct ifreq *ifr); +}; + +struct dhtool_dev_pcieid_get +{ + uint32_t dev_pcieid; +}; +struct dhtool_dev_info +{ + uint32_t domain_no; + uint32_t bus_no; + uint32_t device_no; + uint32_t func_no; +}; + +struct dhtool_dev_info_get_reps +{ + SWITCH_FLAG switch_or_noswitch; + struct dhtool_dev_info dev_info; + struct dhtool_dev_info rp_info; + union + { + struct dhtool_dev_info swusp_info; + }; +}; + +int32_t zxdh_tools_ioctl_dispatcher(struct net_device *netdev, struct ifreq *ifr); + +#define DHTOOLS_LOG_ERR(fmt, arg...) DH_LOG_ERR(MODULE_DHTOOLS, fmt, ##arg); +#define DHTOOLS_LOG_INFO(fmt, arg...) DH_LOG_INFO(MODULE_DHTOOLS, fmt, ##arg); + + +#endif diff --git a/src/net/drivers/net/ethernet/dinghai/zxdh_tools/zxdh_tools_netlink.c b/src/net/drivers/net/ethernet/dinghai/zxdh_tools/zxdh_tools_netlink.c new file mode 100644 index 0000000..d17113b --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zxdh_tools/zxdh_tools_netlink.c @@ -0,0 +1,178 @@ +#include +#include +#include +#include "../en_aux.h" +#include "zxdh_tools_ioctl.h" +#include "zxdh_tools_netlink.h" + + +int32_t zxdh_tools_genl_recv_doit(struct sk_buff *skb, struct genl_info *info); + /* operation definition */ +#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 10, 0)) +static struct nla_policy zxdh_tools_genl_policy[ZXDH_TOOLS_A_MAX + 1] = { + [ZXDH_TOOLS_A_MSG] = { .type = NLA_NUL_STRING }, +}; +#endif + +struct genl_ops zxdh_tools_gnl_ops[] = { + { + .cmd = ZXDH_TOOLS_C_ECHO, + .flags = 0, +#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 10, 0)) + .policy = zxdh_tools_genl_policy, +#endif + .doit = zxdh_tools_genl_recv_doit, + .dumpit = NULL, + } +}; + +static struct genl_family zxdh_tools_msg_family = { + .hdrsize = 0, + .name = ZXDH_TOOLS_NETLINK_NAME, + .version = 1, + .maxattr = ZXDH_TOOLS_A_MAX, + .ops = zxdh_tools_gnl_ops, + .n_ops = 1, +}; + +/* +* genl_msg_prepare_usr_msg : 构建netlink及gennetlink首部 +* @cmd : genl_ops的cmd +* @size : gen_netlink用户数据的长度(包括用户定义的首部) +*/ +int32_t zxdh_tools_genl_msg_prepare_usr_msg(u8 cmd, size_t size, uint32_t pid, struct sk_buff **skbp) +{ + struct sk_buff *skb; + DHTOOLS_LOG_INFO("is called!\n"); + /* create a new netlink msg */ + skb = genlmsg_new(size, GFP_KERNEL); + if (skb == NULL) + { + DHTOOLS_LOG_ERR("genlmsg_new failed!!!\n"); + return -ENOMEM; + } + /* Add a new netlink message to an skb */ + genlmsg_put(skb, pid, 0, &zxdh_tools_msg_family, 0, cmd); + *skbp = skb; + return 0; +} + +/* +* 添加用户数据,及添加一个netlink addribute +*@type : nlattr的type +*@len : nlattr中的len +*@data : 用户数据 +*/ +int32_t zxdh_tools_genl_msg_mk_usr_msg(struct sk_buff *skb, int type, void *data, int len) +{ + int rc; + DHTOOLS_LOG_INFO("is called!\n"); + /* add a netlink attribute to a socket buffer */ + if ((rc = nla_put(skb, type, len, data)) != 0) + { + DHTOOLS_LOG_ERR("nla_put failed, rc=%d!!!\n",rc); + return rc; + } + return 0; +} + +/** +* genl_msg_send_to_user - 通过generic netlink发送数据到netlink +* +* @data: 发送数据缓存 +* @len: 数据长度 单位:byte +* @pid: 发送到的客户端pid +*/ +int32_t zxdh_tools_genl_msg_send_to_user(void *data, uint16_t len, uint32_t pid) +{ + struct sk_buff *skb; + uint16_t size; + int rc; + + DHTOOLS_LOG_INFO("is called!\n"); + size = nla_total_size(len); /* total length of attribute including padding */ + rc = zxdh_tools_genl_msg_prepare_usr_msg(ZXDH_TOOLS_C_ECHO, size, pid, &skb); + if (rc) + { + DHTOOLS_LOG_ERR("zxdh_tools_genl_msg_prepare_usr_msg failed,rc=%d!!!\n", rc); + return rc; + } + + rc = zxdh_tools_genl_msg_mk_usr_msg(skb, ZXDH_TOOLS_A_MSG, data, len); + if (rc) + { + DHTOOLS_LOG_ERR("zxdh_tools_genl_msg_mk_usr_msg failed,rc=%d!!!\n", rc); + kfree_skb(skb); + return rc; + } + + rc = genlmsg_unicast(&init_net, skb, pid); + if (rc < 0) + { + DHTOOLS_LOG_ERR("genlmsg_unicast failed, rc=%d!!!\n", rc); + return rc; + } + DHTOOLS_LOG_INFO("genlmsg_unicast is called, and send msg to user success.\n"); + return 0; +} + +extern uint32_t user_event_pid; +int32_t zxdh_tools_sendto_user_netlink(void *pay_load, uint16_t len, void *reps_buffer, uint16_t *reps_len, void *dev) +{ + struct zxdh_en_device *en_dev = (struct zxdh_en_device *)dev; + int32_t ret = 0; + + DHTOOLS_LOG_INFO("is called!\n"); + if (en_dev == NULL) + { + DHTOOLS_LOG_ERR("dev is NULL\n"); + return -1; + } + + if ((pay_load == NULL) || (len == 0)) { + DHTOOLS_LOG_ERR("invalid para, pay_load = 0x%llx, len = %d\n", (uint64_t)pay_load, len); + return -1; + } + + DHTOOLS_LOG_INFO("en_dev->pcie_id=0x%x\n", en_dev->pcie_id); + DHTOOLS_LOG_INFO("user_event_pid=%d\n", user_event_pid); + DHTOOLS_LOG_INFO("pay_load = 0x%llx, payload_len = %d\n", (uint64_t)pay_load, len); + DHTOOLS_LOG_INFO("*(uint32_t *)pay_load(op_code)=%d\n", *(uint32_t *)pay_load); + + ret = zxdh_tools_genl_msg_send_to_user(pay_load, len, user_event_pid); + if (ret) + { + DHTOOLS_LOG_ERR("zxdh_tools_genl_msg_send_to_user failed, ret=%d!!!\n", ret); + return ret; + } + DHTOOLS_LOG_INFO("zxdh_tools_sendto_user_netlink end, send msg to user success.\n"); + return 0; +} + + +/* doit函数*/ +int32_t zxdh_tools_genl_recv_doit(struct sk_buff *skb, struct genl_info *info) +{ + DHTOOLS_LOG_INFO("is called!\n"); + return 0; +} + +int32_t zxdh_tools_netlink_register(void) +{ + int ret = 0; + ret = genl_register_family(&zxdh_tools_msg_family); + if(ret) + { + DHTOOLS_LOG_ERR("zxdh_tools_netlink_family register failed, ret=%d!!!\n", ret); + return 1; + } + + return 0; +} + + +void zxdh_tools_netlink_unregister(void) +{ + genl_unregister_family(&zxdh_tools_msg_family); +} + diff --git a/src/net/drivers/net/ethernet/dinghai/zxdh_tools/zxdh_tools_netlink.h b/src/net/drivers/net/ethernet/dinghai/zxdh_tools/zxdh_tools_netlink.h new file mode 100644 index 0000000..53f6825 --- /dev/null +++ b/src/net/drivers/net/ethernet/dinghai/zxdh_tools/zxdh_tools_netlink.h @@ -0,0 +1,53 @@ +#ifndef ZXDH_TOOLS_NETLINK_H_ +#define ZXDH_TOOLS_NETLINK_H_ + + +#ifdef __cplusplus +extern "C" { +#endif + +#define NLA_DATA(na) ((void *)((char *)(na) + NLA_HDRLEN)) +#define ZXDH_TOOLS_NETLINK_NAME "tools_family" + +/* 属性类型*/ +enum { + ZXDH_TOOLS_A_UNSPEC, + ZXDH_TOOLS_A_MSG, + __ZXDH_TOOLS_A_MAX, +}; +#define ZXDH_TOOLS_A_MAX (__ZXDH_TOOLS_A_MAX - 1) + +/* 操作码*/ +enum { + ZXDH_TOOLS_C_UNSPEC, + ZXDH_TOOLS_C_ECHO, + __ZXDH_TOOLS_C_ECHO, +}; +#define ZXDH_TOOLS_C_MAX (__ZXDH_TOOLS_C_MAX - 1) + +typedef enum +{ + FWUPDATE = 27, +} event_op_code; + +struct zxdh_tools_recv_msg { + event_op_code op_code; + uint8_t status; +}; + + +int32_t zxdh_tools_sendto_user_netlink(void *pay_load, uint16_t len, void *reps_buffer, uint16_t *reps_len, void *dev); +int zxdh_tools_netlink_register(void); +void zxdh_tools_netlink_unregister(void); + + +#ifdef __cplusplus +} +#endif + + +#endif /* ZXDH_TOOLS_NETLINK_H_ */ + + + + diff --git a/src/net/drivers/pcie/zxdh_pcie/Makefile b/src/net/drivers/pcie/zxdh_pcie/Makefile new file mode 100644 index 0000000..9ce6b5c --- /dev/null +++ b/src/net/drivers/pcie/zxdh_pcie/Makefile @@ -0,0 +1,16 @@ +subdir-ccflags-y += -I$(src) +subdir-ccflags-y += -I$(CWD)/include/ +subdir-ccflags-y += -include $(CWD)/autoconf.h +ccflags-y += -Werror + + +ifeq ($(CONFIG_DRIVER_VERSION),) +EXTRA_CFLAGS += -DDRIVER_VERSION_VAL=\"1.0-1\" +$(info CONFIG_HPF_DRIVER_VERSION is null, EXTRA_CFLAGS=$(EXTRA_CFLAGS)) +else +EXTRA_CFLAGS += -DDRIVER_VERSION_VAL=\"$(CONFIG_DRIVER_VERSION)\" +$(info CONFIG_HPF_DRIVER_VERSION is not null, EXTRA_CFLAGS=$(EXTRA_CFLAGS)) +endif + +obj-$(CONFIG_DINGHAI_HPF) += zxdh_hpf.o +zxdh_hpf-y := zxdh_pcie.o function_hotplug.o pcie_msix.o pcie_common.o bar_msg.o \ No newline at end of file diff --git a/src/net/drivers/pcie/zxdh_pcie/bar_msg.c b/src/net/drivers/pcie/zxdh_pcie/bar_msg.c new file mode 100644 index 0000000..1aa187f --- /dev/null +++ b/src/net/drivers/pcie/zxdh_pcie/bar_msg.c @@ -0,0 +1,79 @@ +#include "bar_msg.h" +#include "pcie_common.h" + +int pcie_mt_send_msg(void *msg_info, u32 msg_size, void *resp_msg, u32 resp_size) +{ + struct zxdh_pci_bar_msg in = {0}; + struct zxdh_msg_recviver_mem result = {0}; + struct pci_dev *pdev = NULL; + void __iomem *bar_virt_addr = NULL; + u8 head_data = 0xFF; + u16 ret = 0; + u16 pcie_id = 0; + u64 bar_addr = 0; + + if (msg_info == NULL) + { + DH_LOG_ERR(MODULE_FUC_HP, "The msg_info is NULL\n"); + return -EINVAL; + } + + pdev = pci_get_device(HP_VENDOR_ID, HP_DEVICE_ID, NULL); + if (pdev == NULL) + { + DH_LOG_ERR(MODULE_FUC_HP, "Can not find devices: deviceID %x, VendorID: %x\n", HP_VENDOR_ID, HP_DEVICE_ID); + return -EINVAL; + } + + bar_addr = pci_resource_start(pdev, 0); + bar_virt_addr = ioremap(bar_addr, HP_IOREMAP_SIZE); + + /* 填充用户参数in */ + in.virt_addr = (u64)bar_virt_addr + HP_BAR_MSG_OFFSET; /* 使用PF1的bar0偏移8k */ + in.payload_addr = msg_info; /* 消息静荷buffer地址 */ + in.payload_len = msg_size; /* 消息长度 */ + in.src = MSG_CHAN_END_PF; /* 从mpf通道下发 */ + in.dst = MSG_CHAN_END_RISC; /* 消息发到risc */ + in.event_id = PCIE_FUNC_HP_EVENT_ID; /* 调用PCIE的消息处理函数 */ + in.src_pcieid = pcie_id; + + result.buffer_len = BUF_SIZE; /* 用户准备一个存放消息回复的buffer, buffer长度 */ + result.recv_buffer = kmalloc(result.buffer_len, GFP_KERNEL); /* 消息回复buffer地址 */ + if (!result.recv_buffer) + { + DH_LOG_ERR(MODULE_FUC_HP, "Failed to allocate recv_buffer\n"); + return -EINVAL; + } + memset(result.recv_buffer, 0, result.buffer_len); + + ret = zxdh_bar_chan_sync_msg_send(&in, &result); /* 发送同步消息 */ + + iounmap(bar_virt_addr); + bar_virt_addr = NULL; + + /* 如果接口返回值不为0,则说明消息失败 */ + if (ret != 0) + { + DH_LOG_ERR(MODULE_FUC_HP, "pcie mt send msg failed, ret:%d.\n", ret); + goto exit; + } + + /* 如果消息发送成功, 从recv_buffer + 1的位置往后两字节取回复数据长度, recv_buffer + 4的位置开始取数据内容 */ + head_data = *((u8 *)(result.recv_buffer + 4)); + if (head_data == 0x1) + { + DH_LOG_INFO(MODULE_FUC_HP, "pcie mt remote SUCCESS!\n"); + memcpy(resp_msg, result.recv_buffer + 4, resp_size); + ret = 0; + } + else + { + DH_LOG_ERR(MODULE_FUC_HP, "pcie mt test FAIL!\n"); + ret = -EINVAL; + } + +exit: + kfree(result.recv_buffer); + result.recv_buffer = NULL; + return ret; +} \ No newline at end of file diff --git a/src/net/drivers/pcie/zxdh_pcie/bar_msg.h b/src/net/drivers/pcie/zxdh_pcie/bar_msg.h new file mode 100644 index 0000000..91472a0 --- /dev/null +++ b/src/net/drivers/pcie/zxdh_pcie/bar_msg.h @@ -0,0 +1,165 @@ +#ifndef _ZXDH_MSG_CHAN_PUB_H_ +#define _ZXDH_MSG_CHAN_PUB_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +// #include + +#define PCIE_FUNC_HP_EVENT_ID 44 +#define BUF_SIZE 0x1000 + +/* bar消息通道使用pf信息 */ +#define HP_BAR_MSG_OFFSET 0x2000 +#define HP_VENDOR_ID 0x1cf2 +#define HP_DEVICE_ID 0x8031 +// #define HP_VENDOR_ID 0x16c3 +// #define HP_DEVICE_ID 0 +#define HP_IOREMAP_SIZE 0x3000 + +/* data type */ +typedef unsigned long long int u64; +typedef signed long long int s64; + +typedef unsigned int u32; +typedef signed int s32; + +typedef unsigned short int u16; +typedef signed short int s16; + +typedef unsigned char u8; +typedef signed char s8; + +/* printk level */ + + +/* + * The interface for communication among HOST, RISC-V and ZF drivers + * is as follows... + * + * A. COMMUNICATION THROUGH BAR CHANNEL + * + * + * B. COMMUNICATION THROUGH PKT CHANNEL + * + * Make sure you have allocated private queues and MSI-X interrupt for them. + * Then set callback of the vector with virtnet_poll_private(). + * Choose the proper paramaters and fill them in the zxdh_pkt_chan_msg_send(). + * Enjoying communicating with others whenever you want. + */ + +/* Value that the zxdh_pkt_chan_msg_send() can be returned */ +#define MSG_CHAN_RET_OK 0 +#define MSG_CHAN_RET_ERR_NULL_PTR (-1) +#define MSG_CHAN_RET_ERR_INVALID_PARA (-2) +#define MSG_CHAN_RET_ERR_NO_ENOUGH_MEM (-4) +#define MSG_CHAN_RET_ERR_CHANNEL_NOT_READY (-5) +#define MSG_CHAN_RET_ERR_CHAN_BUSY (-6) +#define MSG_CHAN_RET_ERR_CHAN_BROKEN (-7) +#define MSG_CHAN_RET_ERR_XMIT_FAIL (-8) +#define MSG_CHAN_RET_ERR_CALLBACK_OUT_OF_TIME (-9) +#define MSG_CHAN_RET_ERR_NO_PRIV_QUEUE (-10) +#define MSG_CHAN_RET_ERR_CALLBACK_FAIL (-11) +#define MSG_CHAN_RET_ERR_FREEPAGE_FAIL (-12) + +typedef enum { + TYPE_DEBUG = 0, + DST_RISCV, + DST_MPF, + DST_PF_OR_VF, + DST_ZF, + MSG_TYPE_NUM, +} MSG_TYPE; + +typedef enum BAR_DRIVER_TYPE { + MSG_CHAN_END_MPF = 0, + MSG_CHAN_END_PF, + MSG_CHAN_END_VF, + MSG_CHAN_END_RISC, + MSG_CHAN_END_ERR, +} BAR_DRIVER_TYPE; + +#define BDF_ECAM(bus, devid, func) ((bus & 0xff) << 8) | (func & 0x07) | ((devid & 0x1f) << 3) + +/* bar通道错误码 */ +typedef enum BAR_MSG_RTN { + BAR_MSG_OK = 0, + BAR_MSG_ERR_NULL, /* < 空指针 > */ + BAR_MSG_ERR_TYPE, /* < 消息类型异常 > */ + BAR_MSG_ERR_MODULE, /* < 模块ID异常 > */ + BAR_MSG_ERR_BODY_NULL, /* < 消息体异常 > */ + BAR_MSG_ERR_LEN, /* < 消息长度异常 > */ + BAR_MSG_ERR_TIME_OUT, /* < 消息超时 > */ + BAR_MSG_ERR_NOT_READY, /* < 消息发送条件异常,BUF不可以用> */ + BAR_MEG_ERR_NULL_FUNC, /* < 空的接收处理函数指针> */ + BAR_MSG_ERR_REPEAT_REGISTER, /* < 模块重复注册> */ + BAR_MSG_ERR_UNGISTER, /* < 重复解注册> */ + BAR_MSG_ERR_NULL_PARA, /* < 参数空指针> */ + BAR_MSG_ERR_REPSBUFF_LEN, /* < reps_buff长度异常> */ + BAR_MSG_ERR_MODULE_NOEXIST, /* < 查找不到该模块对应的消息处理函数> */ + BAR_MSG_ERR_VIRTADDR_NULL, /* < 发送接口传入参数中的虚拟地址为空> */ + BAR_MSG_ERR_REPLY, /* < seq_id匹配失败> */ + BAR_MSG_ERR_MSGID, /* < seq_id申请失败> */ + BAR_MSG_ERR_MPF_NOT_SCANED, /* < MPF通道不可用> */ + BAR_MSG_ERR_USR_RET_ERR, /* < 处理函数返回值错误> */ + BAR_MSG_ERR_ERR_PCIEID, /* < pcieID错误> */ + BAR_MSG_ERR_NOT_MATCH, +} BAR_MSG_RTN; + + + +/* msix消息参数结构体 */ +struct msix_para { + u16 vector_risc; + u16 vector_pfvf; + u16 vector_mpf; + u16 driver_type; + struct pci_dev *pdev; + u64 virt_addr; +}; + +struct zxdh_pci_bar_msg { + u64 virt_addr; /* < 4k空间地址, 若src为MPF该参数不生效> */ + void *payload_addr; /* < 消息净荷地址> */ + u16 payload_len; /* < 消息净荷长度> */ + u16 emec; /* < 消息紧急类型> */ + u16 src; /* < 消息发送源,参考BAR_DRIVER_TYPE> */ + u16 dst; /* < 消息接收者,参考BAR_DRIVER_TYPE> */ + u32 event_id; /* < 事件id> */ + u16 src_pcieid; /* < 源 pcie_id> */ + u16 dst_pcieid; /* < 目的pcie_id> */ +}; + +struct zxdh_msg_recviver_mem { + void *recv_buffer; /* < 消息接收缓存> */ + u16 buffer_len; /* < 消息缓存长度> */ +}; + +/* 消息处理函数,payload和len表示来的消息 */ +typedef int (*zxdh_bar_chan_msg_recv_callback)(void *pay_load, u16 len, void *reps_buffer, u16 *reps_len, void *dev); + +/* + * zxdh_bar_chan_sync_msg_send - 通过PCIE BAR空间发送同步消息 + * @in: 消息发送信息 + * @result: 消息结果反馈 + * @return: 0 成功,其他失败 + */ +int zxdh_bar_chan_sync_msg_send(struct zxdh_pci_bar_msg *in, struct zxdh_msg_recviver_mem *result); + +int pcie_mt_send_msg(void *msg_info, u32 msg_size, void *resp_msg, u32 resp_size); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/pcie/zxdh_pcie/function_hotplug.c b/src/net/drivers/pcie/zxdh_pcie/function_hotplug.c new file mode 100644 index 0000000..e7dbe25 --- /dev/null +++ b/src/net/drivers/pcie/zxdh_pcie/function_hotplug.c @@ -0,0 +1,461 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "bar_msg.h" +#include "function_hotplug.h" +#include "pcie_common.h" + +extern int pci_sriov_configure_simple(struct pci_dev *dev, int nr_virtfn); + +char bind_type_name[FUNCTION_HP_TYPE_COUNT][FILE_PATH_LEN] = {"unbind", "bind"}; + +static struct zte_dpu_id_info zte_dpu_id_info[] = { + /* name, device_id, vendor_id,*/ + {"virtio_blk", 0x1001, 0x1af4}, + {"nvme", 0x8053, 0x1cf2}, +}; + +int init_pf_hotplug_info() +{ + // pf_hotplug_info.cmd = 11; // TODO + + return 0; +} + +int remove_pci_dev(struct func_hotplug_req *hp_req) +{ + int ret = PCIE_SUCCESS; + struct pci_dev *pdev = NULL; + + DH_LOG_DEBUG(MODULE_FUC_HP,"domain=0x%x, bdf=0x%x\n", hp_req->domain, hp_req->bdf); + pdev = zxdh_get_pci_device(hp_req->domain, hp_req->bdf); + if (!pdev) + { + DH_LOG_DEBUG(MODULE_FUC_HP, "This device has removed\n"); + goto finish; + } + + pci_sriov_configure_simple(pdev, 0); + + pci_stop_and_remove_bus_device_locked(pdev); + + pdev = zxdh_get_pci_device(hp_req->domain, hp_req->bdf); + if (pdev) + { + DH_LOG_ERR(MODULE_FUC_HP, "remove fail! domain=0x%x, bdf=0x%x\n", hp_req->domain, hp_req->bdf); + ret = PCIE_FAILED; + } + +finish: + return ret; +} + +int all_ep_rescan(void) +{ + int ret = PCIE_SUCCESS; + int size = 0; + struct file *filp = NULL; + char filename[FILE_PATH_LEN] = {0}; + char date = '1'; + + size = snprintf(filename, FILE_PATH_LEN, "%s/%s", SYS_BUS_PCI_DIR, "rescan"); + if (size >= sizeof(filename)) + { + filename[sizeof(filename) - 1] = '\0'; + } + DH_LOG_INFO(MODULE_FUC_HP, "filename=%s\n", filename); + + filp = filp_open(filename, O_WRONLY, 0); + if (IS_ERR(filp)) + { + DH_LOG_ERR(MODULE_FUC_HP, "open file error\n"); + return PCIE_FAILED; + } + + kernel_write(filp, &date, sizeof(char), &filp->f_pos); + filp_close(filp, NULL); + + return ret; +} + +int rescan_pci_dev(struct func_hotplug_req *hp_req) +{ + int ret = PCIE_SUCCESS; + struct pci_dev *pdev = NULL; + + DH_LOG_DEBUG(MODULE_FUC_HP, "domain=0x%x, rescan bdf=0x%x\n", hp_req->domain, hp_req->bdf); + hp_req->bdf = hp_req->bdf & (~BDF_NO_FUNC_NO_MASK); + DH_LOG_DEBUG(MODULE_FUC_HP, "domain=0x%x, bdf=0x%x\n", hp_req->domain, hp_req->bdf); + + pdev = zxdh_get_pci_device(hp_req->domain, hp_req->bdf); + if (!pdev) + { + all_ep_rescan(); + } + else + { + pci_rescan_bus(pdev->bus); + } + + init_pf_state(); + + return ret; +} + +int vf_bind_unbind(struct func_hotplug_req *hp_req) +{ + int ret = PCIE_SUCCESS; + int size = 0; + struct file *filp = NULL; + char filename[FILE_PATH_LEN] = {0}; + char bdf[FILE_PATH_LEN] = {0}; + unsigned int scene_code = 0; + u32 bus_no = 0; + u32 device_no = 0; + u32 func_no = 0; + + memset(filename, 0, FILE_PATH_LEN); + + scene_code = SCENE_CODE_OF_FUNC_HP_INFO(hp_req->hotplug_info); + bus_no = (hp_req->bdf & BDF_NO_BUS_NO_MASK) >> BDF_B_START_BIT; + device_no = (hp_req->bdf & BDF_NO_DEV_NO_MASK) >> BDF_D_START_BIT; + func_no = (hp_req->bdf & BDF_NO_FUNC_NO_MASK) >> BDF_F_START_BIT; + size = snprintf(bdf, FILE_PATH_LEN, "%x:%x:%x.%x", hp_req->domain, bus_no, device_no, func_no); + if (size >= sizeof(bdf)) + { + bdf[sizeof(bdf) - 1] = '\0'; + } + DH_LOG_INFO(MODULE_FUC_HP, "scene_code=%d, bind_type_name=%s, bdf=%s\n", scene_code, bind_type_name[scene_code - FUNCTION_REMOVE], bdf); + + ret = parse_bdf(bdf); + if (ret != PCIE_SUCCESS) + { + DH_LOG_ERR(MODULE_FUC_HP, "%s: parse bdf fail\n", __func__); + return PCIE_FAILED; + } + + size = snprintf(filename, FILE_PATH_LEN, "%s/%s/%s/%s", PCI_DEVICES_DIR, bdf, PCI_PHYSFN_DRV_PATH, bind_type_name[scene_code - FUNCTION_REMOVE]); + if (size >= sizeof(filename)) + { + filename[sizeof(filename) - 1] = '\0'; + } + DH_LOG_INFO(MODULE_FUC_HP, "filename=%s\n", filename); + + filp = filp_open(filename, O_WRONLY, 0); + if (IS_ERR(filp)) + { + DH_LOG_ERR(MODULE_FUC_HP, "open file error\n"); + return PCIE_FAILED; + } + + kernel_write(filp, (unsigned char*)bdf, sizeof(bdf), &filp->f_pos); + filp_close(filp, NULL); + + return ret; +} + +static void print_func_hotplug_req(struct func_hotplug_req *func_hp_req) +{ + DH_LOG_DEBUG(MODULE_FUC_HP, "scene_code=0x%x, function_type=0x%x, ep_id=0x%x, pf_id=0x%x, vf_id=0x%x, domain=0x%x, bdf=0x%x\n", + SCENE_CODE_OF_FUNC_HP_INFO(func_hp_req->hotplug_info), FUNC_TYPE_OF_FUNC_HP_INFO(func_hp_req->hotplug_info), + EP_ID_OF_FUNC_HP_INFO(func_hp_req->hotplug_info), PF_ID_OF_FUNC_HP_INFO(func_hp_req->hotplug_info), + VF_ID_OF_FUNC_HP_INFO(func_hp_req->hotplug_info), func_hp_req->domain, func_hp_req->bdf); +} + +static void func_hp_info_decode(struct func_hotplug_req *hp_req, struct func_hotplug_info *hp_info) +{ + hp_info->scene_code = SCENE_CODE_OF_FUNC_HP_INFO(hp_req->hotplug_info); + hp_info->function_type = FUNC_TYPE_OF_FUNC_HP_INFO(hp_req->hotplug_info); + hp_info->ep_id = EP_ID_OF_FUNC_HP_INFO(hp_req->hotplug_info); + hp_info->pf_id = PF_ID_OF_FUNC_HP_INFO(hp_req->hotplug_info); + hp_info->vf_id = VF_ID_OF_FUNC_HP_INFO(hp_req->hotplug_info); + DH_LOG_DEBUG(MODULE_FUC_HP, "scene_code=0x%x, function_type=0x%x, ep_id=0x%x, pf_id=0x%x, vf_id=0x%x, hotplug_info=0x%x\n", + hp_info->scene_code, hp_info->function_type, + hp_info->ep_id, hp_info->pf_id, + hp_info->vf_id, hp_req->hotplug_info); +} + +static int func_remove(unsigned int function_type, struct func_hotplug_req *hp_req) +{ + int ret = PCIE_SUCCESS; + + if (function_type == PCIE_FUNC_TYPE_PF) + { + ret = init_pf_state(); + } + else if (function_type == PCIE_FUNC_TYPE_VF) + { + ret = vf_bind_unbind(hp_req); + } + else + { + DH_LOG_ERR(MODULE_FUC_HP, "error function_type=0x%x\n", function_type); + ret = PCIE_FAILED; + } + + return ret; +} + +static int func_insert(unsigned int function_type, struct func_hotplug_req *hp_req) +{ + int ret = PCIE_SUCCESS; + + if (function_type == PCIE_FUNC_TYPE_PF) + { + ret = rescan_pci_dev(hp_req); + } + else if (function_type == PCIE_FUNC_TYPE_VF) + { + ret = vf_bind_unbind(hp_req); + } + else + { + DH_LOG_ERR(MODULE_FUC_HP, "error function_type=0x%x\n", function_type); + ret = PCIE_FAILED; + } + + return ret; +} + +int func_hp(void) +{ + int ret = PCIE_SUCCESS; + struct pci_dev *hp_pdev = NULL; + struct func_hotplug_req hp_req = {0}; + struct func_hotplug_result hp_result = {0}; + struct func_hotplug_info hp_info = {0}; + void __iomem *bar_virt_addr = NULL; + u64 bar_addr = 0; + int resp_msg = 0; + + hp_pdev = pci_get_device(HP_VENDOR_ID, HP_DEVICE_ID, NULL); + if (IS_ERR_OR_NULL(hp_pdev)) + { + DH_LOG_ERR(MODULE_FUC_HP, "This hp device was not found. Please confirm the BDF\n"); + return PCIE_FAILED; + } + + bar_addr = pci_resource_start(hp_pdev, 0); + bar_virt_addr = (void __iomem *)ioremap(bar_addr, HP_IOREMAP_SIZE); + if (bar_virt_addr == NULL) + { + DH_LOG_ERR(MODULE_FUC_HP, "bar_virt_addr map failed\n"); + return PCIE_FAILED; + } + + memcpy(&hp_req, bar_virt_addr, sizeof(struct func_hotplug_req)); + func_hp_info_decode(&hp_req, &hp_info); + print_func_hotplug_req(&hp_req); + + switch (hp_info.scene_code) + { + case FUNCTION_REMOVE: + { + ret = func_remove(hp_info.function_type, &hp_req); + break; + } + case FUNCTION_INSERT: + { + ret = func_insert(hp_info.function_type, &hp_req); + break; + } + default: + { + DH_LOG_ERR(MODULE_FUC_HP, "error scene_code=0x%x\n", hp_info.scene_code); + ret = PCIE_FAILED; + } + } + + hp_result.cmd = PCIE_HOTPLUG_FINISH; + hp_result.hotplug_info = hp_req.hotplug_info; + hp_result.result = (ret == PCIE_SUCCESS) ? FUNC_HP_RESULT_SUCC : FUNC_HP_RESULT_FAIL; + + ret = pcie_mt_send_msg(&hp_result, sizeof(struct func_hotplug_result), &resp_msg, sizeof(int)); + if (ret) + { + DH_LOG_ERR(MODULE_FUC_HP, "send failed\n"); + } + + iounmap(bar_virt_addr); + bar_virt_addr = NULL; + return ret; +} + +int enable_vf(void) +{ + int pos = 0; + u16 total_vf_nums = 0; + int ret = PCIE_SUCCESS; + struct pci_dev *dev = NULL; + int i = 0; + int entry_num = sizeof(zte_dpu_id_info) / sizeof(struct zte_dpu_id_info); + + for(i = 0; i < entry_num; i++) + { + while ((dev = pci_get_device(zte_dpu_id_info[i].vendor_id, zte_dpu_id_info[i].device_id, dev)) != NULL) + { + pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_SRIOV); + if (!pos) + { + continue; + } + pci_read_config_word(dev, (pos + PCI_SRIOV_TOTAL_VF), &total_vf_nums); + DH_LOG_DEBUG(MODULE_FUC_HP, "Total VFs: %d ", total_vf_nums); + pci_sriov_configure_simple(dev, total_vf_nums); + } + } + + return ret; +} + +int init_bdf(void) +{ + int ret = PCIE_SUCCESS; + int resp_msg = 0; + struct fuc_hotplug_bar_msg fuc_hotplug_bar_msg = {0}; + + fuc_hotplug_bar_msg.cmd = PCIE_HOTPLUG_START; + fuc_hotplug_bar_msg.fuc_hotplug_info = FUC_HOTPLUG_PF_INIT_FLAG; + + ret = hotplug_device_enable(1); + if (ret != 0) + { + DH_LOG_ERR(MODULE_FUC_HP, "enable hotplug device failed.\n"); + return ret; + } + + ret = pcie_mt_send_msg(&fuc_hotplug_bar_msg, sizeof(struct fuc_hotplug_bar_msg), &resp_msg, sizeof(int)); + if (ret != 0) + { + DH_LOG_ERR(MODULE_FUC_HP, "get dbf failed\n"); + } + + return PCIE_SUCCESS; +} + +int init_pf_state(void) +{ + u64 bar_addr = 0; + u8 ep_no = 0; + u8 pf_no = 0; + u32 mask_idx = 0; + struct func_hotplug_req hp_req = {0}; + struct func_hotplug_info hp_info = {0}; + struct func_hotplug_state func_hotplug_state = {0}; + u32 pf_state_mask = 0; + struct pci_dev *hp_pdev = NULL; + void __iomem *bar_virt_addr = NULL; + + hp_pdev = pci_get_device(HP_VENDOR_ID, HP_DEVICE_ID, NULL); + if (IS_ERR_OR_NULL(hp_pdev)) + { + DH_LOG_ERR(MODULE_FUC_HP, "This hp device was not found. Please confirm the BDF\n"); + return PCIE_FAILED; + } + + bar_addr = pci_resource_start(hp_pdev, 0); + bar_virt_addr = (void __iomem *)ioremap(bar_addr, HP_IOREMAP_SIZE); + if (bar_virt_addr == NULL) + { + DH_LOG_ERR(MODULE_FUC_HP, "bar_virt_addr map failed\n"); + return -ENOMEM; + } + + // 获取当前操作的pf + memcpy(&hp_req, bar_virt_addr, sizeof(struct func_hotplug_req)); + func_hp_info_decode(&hp_req, &hp_info); + + memcpy(&func_hotplug_state, bar_virt_addr + FUC_HOTPLUG_PF_STATE_FLAG_OFFSET, sizeof(struct func_hotplug_state)); + + pf_state_mask = func_hotplug_state.pf_state_mask | 0x1; + + for (mask_idx = 0; mask_idx < MAX_PF_NUMS; mask_idx++) + { + ep_no = mask_idx / MAX_PF_NUMS_OF_EP; + pf_no = mask_idx % MAX_PF_NUMS_OF_EP; + hp_req.domain = func_hotplug_state.domain[ep_no]; + hp_req.bdf = func_hotplug_state.bdf[ep_no]; + hp_req.bdf = hp_req.bdf + pf_no; + if (!((pf_state_mask >> mask_idx)& 0x1)) + { + // 修改当前操作的pf状态,恢复其它pf的状态 + if (hp_info.scene_code == FUNCTION_INSERT + && hp_info.function_type == PCIE_FUNC_TYPE_PF + && (hp_info.ep_id - 5) == ep_no + && hp_info.pf_id == pf_no) + { + continue; + } + remove_pci_dev(&hp_req); + DH_LOG_DEBUG(MODULE_FUC_HP, "domain: %x", hp_req.domain); + DH_LOG_DEBUG(MODULE_FUC_HP, "bdf: %x", hp_req.bdf); + } + } + + iounmap(bar_virt_addr); + bar_virt_addr = NULL; + return PCIE_SUCCESS; +} + +int hotplug_device_enable(int enable_flag) +{ + int ret = PCIE_SUCCESS; + struct pci_dev *hp_pdev = NULL; + + hp_pdev = pci_get_device(HP_VENDOR_ID, HP_DEVICE_ID, NULL); + if (IS_ERR_OR_NULL(hp_pdev)) + { + DH_LOG_ERR(MODULE_FUC_HP, "This hp device was not found. Please confirm the BDF\n"); + return PCIE_FAILED; + } + + if (enable_flag == 1) + { + ret = pci_enable_device(hp_pdev); + } + else if (enable_flag == 0) + { + pci_disable_device(hp_pdev); + } + if (ret != 0) + { + DH_LOG_ERR(MODULE_FUC_HP, "pci_enable_device failed: %d\n", ret); + return ret; + } + + return ret; +} + +irqreturn_t func_hp_msix_handler(int irq_no, void *data) +{ + pr_info("irq[%d] has been triggered\n", irq_no); + + return IRQ_WAKE_THREAD; +} + +irqreturn_t irq_handler2(int irq_no, void *data) +{ + pr_info("irq[%d] has been triggered\n", irq_no); + + return IRQ_WAKE_THREAD; +} + +irqreturn_t func_hp_msix_thread(int irq, void *data) +{ + func_hp(); + return IRQ_HANDLED; +} + +irqreturn_t irq_thread2(int irq, void *data) +{ + return IRQ_HANDLED; +} diff --git a/src/net/drivers/pcie/zxdh_pcie/function_hotplug.h b/src/net/drivers/pcie/zxdh_pcie/function_hotplug.h new file mode 100644 index 0000000..3040bf7 --- /dev/null +++ b/src/net/drivers/pcie/zxdh_pcie/function_hotplug.h @@ -0,0 +1,128 @@ +#ifndef _ZXDH_PF_HOT_PLUG_H_ +#define _ZXDH_PF_HOT_PLUG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#define FUNC_HP_RESULT_SUCC 1 +#define FUNC_HP_RESULT_FAIL 2 + +#define FUNC_HP_SCENE_CODE_START_BIT 21 +#define FUNC_HP_FUNC_TYPE_START_BIT 20 +#define FUNC_HP_EP_ID_START_BIT 16 +#define FUNC_HP_PF_ID_START_BIT 12 +#define FUNC_HP_VF_ID_START_BIT 0 + +#define FUNC_HP_SCENE_CODE_MASK (0x7 << FUNC_HP_SCENE_CODE_START_BIT) +#define FUNC_HP_FUNC_TYPE_MASK (0x1 << FUNC_HP_FUNC_TYPE_START_BIT) +#define FUNC_HP_EP_ID_MASK (0xF << FUNC_HP_EP_ID_START_BIT) +#define FUNC_HP_PF_ID_MASK (0xF << FUNC_HP_PF_ID_START_BIT) +#define FUNC_HP_VF_ID_MASK (0xFFF << FUNC_HP_VF_ID_START_BIT) + +#define SCENE_CODE_OF_FUNC_HP_INFO(hotplug_info) ((hotplug_info & FUNC_HP_SCENE_CODE_MASK) >> FUNC_HP_SCENE_CODE_START_BIT) +#define FUNC_TYPE_OF_FUNC_HP_INFO(hotplug_info) ((hotplug_info & FUNC_HP_FUNC_TYPE_MASK) >> FUNC_HP_FUNC_TYPE_START_BIT) +#define EP_ID_OF_FUNC_HP_INFO(hotplug_info) ((hotplug_info & FUNC_HP_EP_ID_MASK) >> FUNC_HP_EP_ID_START_BIT) +#define PF_ID_OF_FUNC_HP_INFO(hotplug_info) ((hotplug_info & FUNC_HP_PF_ID_MASK) >> FUNC_HP_PF_ID_START_BIT) +#define VF_ID_OF_FUNC_HP_INFO(hotplug_info) ((hotplug_info & FUNC_HP_VF_ID_MASK) >> FUNC_HP_VF_ID_START_BIT) + +#define FUNCTION_HP_TYPE_COUNT 2 +#define MAX_EP_NUMS 4 +#define MAX_PF_NUMS_OF_EP 8 +#define MAX_PF_NUMS (MAX_PF_NUMS_OF_EP * MAX_EP_NUMS) + +#define FUC_HOTPLUG_PF_INIT_FLAG_OFFSET 0x10 +#define FUC_HOTPLUG_PF_STATE_FLAG_OFFSET 0x20 +#define FUC_HOTPLUG_PF_INIT_FLAG 0x450000 + +enum FUC_HOTPLUG_INFO_ { + PCIE_HOTPLUG_START = 1, + PCIE_HOTPLUG_FINISH, +}; + +enum zte_pcie_func_type { + PCIE_FUNC_TYPE_PF = 0, + PCIE_FUNC_TYPE_VF, + PCIE_FUNC_TYPE_NUM +}; + +typedef enum { + FUNCTION_REMOVE = 1, + FUNCTION_INSERT, +} FUNCTION_HP_TYPE; + +struct func_hotplug_info { + unsigned int reserved: 8; + unsigned int scene_code: 3; // 1-热拔;2-热插; + unsigned int function_type: 1; // pf-0;vf-1; + unsigned int ep_id: 4; // 5~9(对应ep0~4) + unsigned int pf_id: 4; // 0~7 + unsigned int vf_id: 12; // 0~127 +}; + +struct func_hotplug_req { + /* hotplug_info + bit[31:24]: reserved: + bit[23:21]: scene_code 1-热拔、2-热插 + bit[20]: function_type 0-PF、1-VF + bit[19:16]: ep_id 范围: 5~9(对应ep0~4) + bit[15:12]: pf_id 范围: 0~7 + bit[11:0]: vf_id 范围: 0~127 + */ + u32 hotplug_info; + u32 domain; + u32 bdf; +}; + +struct func_hotplug_result { + unsigned int cmd; + + /* hotplug_info + bit[31:24]: reserved: + bit[23:21]: scene_code 0-热拔、1-热插 + bit[20]: function_type 0-PF、1-VF + bit[19:16]: ep_id 范围: 5~9(对应ep0~4) + bit[15:12]: pf_id 范围: 0~7 + bit[11:0]: vf_id 范围: 0~127 + */ + u32 hotplug_info; + u32 result; +}; + +struct func_hotplug_state { + u32 pf_state_mask; + u32 domain[4]; + u32 bdf[4]; +}; + +struct zte_dpu_id_info { + char *name; + u16 device_id; + u16 vendor_id; +}; + +struct fuc_hotplug_bar_msg { + unsigned int cmd; + unsigned int fuc_hotplug_info; + unsigned int timeout; + unsigned int cpl_chk; +}; + +int init_pf_hotplug_info(void); +int remove_pci_dev(struct func_hotplug_req *hp_info); +int rescan_pci_dev(struct func_hotplug_req *hp_info); +int vf_bind_unbind(struct func_hotplug_req *hp_req); +int request_msix(void); +int free_msix(void); +int enable_vf(void); +int init_bdf(void); +int init_pf_state(void); +int hotplug_device_enable(int enable_flag); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/pcie/zxdh_pcie/pcie_common.c b/src/net/drivers/pcie/zxdh_pcie/pcie_common.c new file mode 100644 index 0000000..75eae38 --- /dev/null +++ b/src/net/drivers/pcie/zxdh_pcie/pcie_common.c @@ -0,0 +1,153 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pcie_common.h" + +struct pci_dev *zxdh_get_pci_device(u32 domain, u32 bdf) +{ + struct pci_bus *bus = NULL; + struct pci_dev *dev = NULL; + + bus = pci_find_bus(domain, (bdf >> 8)); + if (!bus) + { + DH_LOG_ERR(MODULE_FUC_HP, "Can not find this bus\n"); + return NULL; + } + + while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) + { + if (dev->bus == bus && PCI_SLOT(dev->devfn) == PCI_SLOT(bdf) && PCI_FUNC(dev->devfn) == PCI_FUNC(bdf)) + { + return dev; + } + } + + return NULL; +} + +int fill_domain_bdf_str(const char *token, char *dst_str, const int len) +{ + int ret = PCIE_SUCCESS; + int i = 0; + int j = 0; + + if (strlen(token) < len) + { + for (i = 0; i < (len - strlen(token)); ++i) + { + dst_str[i] = '0'; + } + for (j = i; j < len; ++j) + { + dst_str[j] = token[j - i]; + } + dst_str[j] = 0; + } + else if (strlen(token) > len) + { + DH_LOG_ERR(MODULE_FUC_HP, "error token, size=%ld\n", strlen(token)); + ret = PCIE_FAILED; + } + else + { + memcpy(dst_str, token, strlen(token) + 1); + } + + return ret; +} + +int parse_bdf(char *str) +{ + int ret = PCIE_SUCCESS; + int size = 0; + char *token = NULL; + struct domain_bdf domain_bdf = {0}; + char *tempString = kstrdup(str, GFP_KERNEL); + + memset(&domain_bdf, 0, sizeof(struct domain_bdf)); + + if (tempString == NULL) + { + DH_LOG_ERR(MODULE_FUC_HP, "tempString is NULL\n"); + return PCIE_FAILED; + } + + token = strsep(&tempString, ":"); + if (token == NULL) + { + DH_LOG_ERR(MODULE_FUC_HP, "strsep fail\n"); + goto failed; + } + ret = fill_domain_bdf_str(token, domain_bdf.domain, DOMAIN_LEN); + if (ret != PCIE_SUCCESS) + { + DH_LOG_ERR(MODULE_FUC_HP, "error domain, token=%s\n", token); + goto failed; + } + + token = strsep(&tempString, ":"); + if (token == NULL) + { + DH_LOG_ERR(MODULE_FUC_HP, "strsep fail\n"); + goto failed; + } + ret = fill_domain_bdf_str(token, domain_bdf.bus, BUS_LEN); + if (ret != PCIE_SUCCESS) + { + DH_LOG_ERR(MODULE_FUC_HP, "rror bus\n"); + goto failed; + } + + token = strsep(&tempString, "."); + if (token == NULL) + { + DH_LOG_ERR(MODULE_FUC_HP, "strsep fail\n"); + goto failed; + } + ret = fill_domain_bdf_str(token, domain_bdf.device, DEVICE_LEN); + if (ret != PCIE_SUCCESS) + { + DH_LOG_ERR(MODULE_FUC_HP, "error device\n"); + goto failed; + } + + token = strsep(&tempString, "."); + if (token == NULL) + { + DH_LOG_ERR(MODULE_FUC_HP, "strsep fail\n"); + goto failed; + } + ret = fill_domain_bdf_str(token, domain_bdf.func, FUNC_LEN); + if (ret != PCIE_SUCCESS) + { + DH_LOG_ERR(MODULE_FUC_HP,"error func\n"); + goto failed; + } + + size = snprintf(str, FILE_PATH_LEN, "%s:%s:%s.%s", domain_bdf.domain, domain_bdf.bus, domain_bdf.device, domain_bdf.func); + if (size >= FILE_PATH_LEN) + { + str[FILE_PATH_LEN - 1] = '\0'; + } + + kfree(tempString); + tempString = NULL; + + return PCIE_SUCCESS; + +failed: + kfree(tempString); + tempString = NULL; + DH_LOG_ERR(MODULE_FUC_HP, "Input format error, refer to '[domain]:[bus_no]:[dev_no].[func_no]'\n"); + return PCIE_FAILED; +} diff --git a/src/net/drivers/pcie/zxdh_pcie/pcie_common.h b/src/net/drivers/pcie/zxdh_pcie/pcie_common.h new file mode 100644 index 0000000..d4abaf4 --- /dev/null +++ b/src/net/drivers/pcie/zxdh_pcie/pcie_common.h @@ -0,0 +1,53 @@ +#ifndef _ZXDH_PCIE_COMMON_H_ +#define _ZXDH_PCIE_COMMON_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include +#include + +#define PCIE_SUCCESS 0 +#define PCIE_FAILED -1 + +#define KERNEL_VFIO_VFIO_TEST_NAME "/dev/vfio/vfio" +#define PCI_DEVICES_DIR "/sys/bus/pci/devices" +#define SYS_BUS_PCI_DIR "/sys/bus/pci" +#define PCI_PHYSFN_DRV_PATH "physfn/driver" +#define FILE_PATH_LEN 100 + +#define DOMAIN_LEN 4 +#define BUS_LEN 2 +#define DEVICE_LEN 2 +#define FUNC_LEN 1 + +#define BDF_NO_BUS_NO_MASK (0xFF << 8) +#define BDF_NO_DEV_NO_MASK (0x1F << 3) +#define BDF_NO_FUNC_NO_MASK (0x7 << 0) + +#define BDF_F_START_BIT 0 +#define BDF_D_START_BIT 3 +#define BDF_B_START_BIT 8 + +struct domain_bdf { + char domain[DOMAIN_LEN + 1]; + char bus[BUS_LEN + 1]; + char device[DEVICE_LEN + 1]; + char func[FUNC_LEN + 1]; +}; + +struct pci_dev *zxdh_get_pci_device(u32 domain, u32 bdf); +int fill_domain_bdf_str(const char *token, char *dst_str, const int len); +int parse_bdf(char *str); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/pcie/zxdh_pcie/pcie_msix.c b/src/net/drivers/pcie/zxdh_pcie/pcie_msix.c new file mode 100644 index 0000000..0aa5fbb --- /dev/null +++ b/src/net/drivers/pcie/zxdh_pcie/pcie_msix.c @@ -0,0 +1,88 @@ +#include +#include +#include +#include +#include +#include + +#include "bar_msg.h" +#include "pcie_msix.h" +#include "function_hotplug.h" +#include "pcie_common.h" + +extern irqreturn_t func_hp_msix_handler(int irq_no, void *data); +extern irqreturn_t irq_handler2(int irq_no, void *data); +extern irqreturn_t func_hp_msix_thread(int irq_no, void *data); +extern irqreturn_t irq_thread2(int irq_no, void *data); + +static struct msix_handler_info msix_handler_info_arr[] = { + /* irq_id, irq_handler irq_thread irq_name */ + {IRQ_NO_INIT_VALUE, func_hp_msix_handler, func_hp_msix_thread, "function_hotplug_msix"}, + {IRQ_NO_INIT_VALUE, irq_handler2, irq_thread2, "irq_thread2"}, +}; + +int request_msix(void) +{ + int ret = 0; + int i = 0; + int msix_nums = 0; + struct pci_dev *pdev = NULL; + + pdev = pci_get_device(HP_VENDOR_ID, HP_DEVICE_ID, pdev); + if (IS_ERR_OR_NULL(pdev)) + { + DH_LOG_ERR(MODULE_FUC_HP, "pci get device fail! deviceid=0x%x, vendorid=0x%x\n", HP_DEVICE_ID, HP_VENDOR_ID); + return -EINVAL; + } + + if (pci_enable_device(pdev)) + { + DH_LOG_ERR(MODULE_FUC_HP, "enbale dev failed\n"); + } + + msix_nums = sizeof(msix_handler_info_arr) / sizeof(struct msix_handler_info); + ret = pci_alloc_irq_vectors(pdev, msix_nums, msix_nums, PCI_IRQ_MSIX); + if (ret < 0) + { + DH_LOG_ERR(MODULE_FUC_HP, "Can not alloc msix irq vector msix_nums=%d, ret=%d\n", msix_nums, ret); + return ret; + } + + for (i = 0; i < msix_nums; ++i) + { + msix_handler_info_arr[i].irq_id = i; + + ret = pci_request_irq(pdev, i, msix_handler_info_arr[i].irq_handler_func, msix_handler_info_arr[i].irq_thread_func, + &msix_handler_info_arr[i].irq_id, "%s%d", msix_handler_info_arr[i].irq_name, i); + if (ret) + { + pci_free_irq_vectors(pdev); + DH_LOG_ERR(MODULE_FUC_HP, "request msix[%d] failed --> %d\n", i, ret); + } + } + + return ret; +} + +int free_msix(void) +{ + int msix_nums = 0; + int i = 0; + struct pci_dev *pdev = NULL; + + pdev = pci_get_device(HP_VENDOR_ID, HP_DEVICE_ID, pdev); + if (IS_ERR_OR_NULL(pdev)) + { + DH_LOG_WARNING(MODULE_FUC_HP, "pdev has released\n"); + return 0; + } + + msix_nums = sizeof(msix_handler_info_arr) / sizeof(struct msix_handler_info); + for (i = 0; i < msix_nums; ++i) + { + pci_free_irq(pdev, msix_handler_info_arr[i].irq_id, &msix_handler_info_arr[i].irq_id); + } + pci_free_irq_vectors(pdev); + + return 0; +} diff --git a/src/net/drivers/pcie/zxdh_pcie/pcie_msix.h b/src/net/drivers/pcie/zxdh_pcie/pcie_msix.h new file mode 100644 index 0000000..1ab4d87 --- /dev/null +++ b/src/net/drivers/pcie/zxdh_pcie/pcie_msix.h @@ -0,0 +1,29 @@ +#ifndef _ZXDH_PF_HOT_PLUG_H_ +#define _ZXDH_PF_HOT_PLUG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include + +typedef irqreturn_t (*irq_handler)(int irq_no, void *data); +typedef irqreturn_t (*irq_thread)(int irq, void *data); + +#define IRQ_NO_INIT_VALUE (-1) +#define MSIX_NAME_LEN 30 +struct msix_handler_info { + int irq_id; + irq_handler irq_handler_func; + irq_thread irq_thread_func; + char irq_name[MSIX_NAME_LEN]; +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/drivers/pcie/zxdh_pcie/zxdh_pcie.c b/src/net/drivers/pcie/zxdh_pcie/zxdh_pcie.c new file mode 100644 index 0000000..7b590db --- /dev/null +++ b/src/net/drivers/pcie/zxdh_pcie/zxdh_pcie.c @@ -0,0 +1,167 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "bar_msg.h" +#include "function_hotplug.h" +#include "pcie_common.h" + +#ifdef DRIVER_VERSION_VAL + #define DRV_VERSION DRIVER_VERSION_VAL +#else + #define DRV_VERSION "1.0-1" +#endif + +int zxdh_pcie_init(void) +{ + int ret = 0; + + ret = init_pf_hotplug_info(); + if (ret != 0) + { + DH_LOG_ERR(MODULE_FUC_HP, "int pf hot plug info failed.\n"); + return ret; + } + + + ret = init_pf_state(); + if (ret != 0) + { + DH_LOG_ERR(MODULE_FUC_HP, "init_pf_state failed\n"); + return ret; + } + + ret = enable_vf(); + if (ret != 0) + { + DH_LOG_ERR(MODULE_FUC_HP, "enable_vf failed\n"); + return ret; + } + + DH_LOG_INFO(MODULE_FUC_HP, "zxdh pf hotplug module init success.\n"); + return ret; +} + +void zxdh_pcie_exit(void) +{ + free_msix(); + DH_LOG_INFO(MODULE_FUC_HP, "zxdh pcie remove success.\n"); +} + +static const struct pci_device_id dh_hpf_pci_table[] = { + { PCI_DEVICE(HP_VENDOR_ID, HP_DEVICE_ID), 0 }, + { 0, } +}; + +MODULE_DEVICE_TABLE(pci, dh_hpf_pci_table); + +static int32_t dh_hpf_probe(struct pci_dev *pdev, const struct pci_device_id *id) +{ + int32_t ret = 0; + + ret = init_bdf(); + if (ret != 0) + { + DH_LOG_ERR(MODULE_FUC_HP, "init_bdf failed.\n"); + } + + ret = request_msix(); + if(ret != 0) + { + DH_LOG_ERR(MODULE_FUC_HP, "request_msix failed\n"); + return ret; + } + DH_LOG_INFO(MODULE_FUC_HP,"hpf driver probe completed\n"); + return 0; +} + +static void dh_hpf_remove(struct pci_dev *pdev) +{ + zxdh_pcie_exit(); + DH_LOG_INFO(MODULE_FUC_HP,"hpf driver remove completed\n"); +} + + +static int32_t dh_hpf_suspend(struct pci_dev *pdev, pm_message_t state) +{ + return 0; +} + +static int32_t dh_hpf_resume(struct pci_dev *pdev) +{ + return 0; +} + +static void dh_hpf_shutdown(struct pci_dev *pdev) +{ + dh_hpf_remove(pdev); +} + +static pci_ers_result_t dh_pci_err_detected(struct pci_dev *pdev, + pci_channel_state_t state) +{ + return PCI_ERS_RESULT_NONE; +} + +static pci_ers_result_t dh_hpf_pci_slot_reset(struct pci_dev *pdev) +{ + return PCI_ERS_RESULT_NONE; +} + +static void dh_hpf_pci_resume(struct pci_dev *pdev) +{ + +} + +static const struct pci_error_handlers dh_hpf_err_handler = { + .error_detected = dh_pci_err_detected, + .slot_reset = dh_hpf_pci_slot_reset, + .resume = dh_hpf_pci_resume +}; + +static struct pci_driver dh_hpf_driver = { + .name = KBUILD_MODNAME, + .id_table = dh_hpf_pci_table, + .probe = dh_hpf_probe, + .remove = dh_hpf_remove, + .suspend = dh_hpf_suspend, + .resume = dh_hpf_resume, + .shutdown = dh_hpf_shutdown, + .err_handler = &dh_hpf_err_handler, +}; + +static int32_t __init init(void) +{ + int32_t err = 0; + + err = pci_register_driver(&dh_hpf_driver); + if (err != 0) + { + DH_LOG_ERR(MODULE_FUC_HP,"pci_register_driver failed: %d\n", err); + return err; + } + + zxdh_pcie_init(); + + DH_LOG_INFO(MODULE_FUC_HP,"zxdh_hpf driver init success\n"); + return err; +} + +static void __exit cleanup(void) +{ + pci_unregister_driver(&dh_hpf_driver); + DH_LOG_INFO(MODULE_FUC_HP,"zxdh_hpf driver remove success\n"); +} + +module_init(init); +module_exit(cleanup); +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("ZTE ZXDH HP"); +MODULE_VERSION(DRV_VERSION); diff --git a/src/net/include/linux/dinghai/auxiliary_bus.h b/src/net/include/linux/dinghai/auxiliary_bus.h new file mode 100755 index 0000000..6bb6509 --- /dev/null +++ b/src/net/include/linux/dinghai/auxiliary_bus.h @@ -0,0 +1,153 @@ + +#ifndef _AUXILIARY_BUS_H_ +#define _AUXILIARY_BUS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + + +#define ZXDH_AUXILIARY_NAME_SIZE 32 +#define ZXDH_AUXILIARY_MODULE_PREFIX "zxdh_auxiliary:" + +struct zxdh_auxiliary_device_id +{ + char name[ZXDH_AUXILIARY_NAME_SIZE]; + kernel_ulong_t driver_data; +}; + +struct zxdh_auxiliary_device { + struct device dev; + const char *name; + uint32_t id; +}; + +/** + * struct zxdh_auxiliary_driver - Definition of an auxiliary bus driver + * @probe: Called when a matching device is added to the bus. + * @remove: Called when device is removed from the bus. + * @shutdown: Called at shut-down time to quiesce the device. + * @suspend: Called to put the device to sleep mode. Usually to a power state. + * @resume: Called to bring a device from sleep mode. + * @name: Driver name. + * @driver: Core driver structure. + * @id_table: Table of devices this driver should match on the bus. + * + * Auxiliary drivers follow the standard driver model convention, where + * discovery/enumeration is handled by the core, and drivers provide probe() + * and remove() methods. They support power management and shutdown + * notifications using the standard conventions. + * + * Auxiliary drivers register themselves with the bus by calling + * zxdh_auxiliary_driver_register(). The id_table contains the match_names of + * auxiliary devices that a driver can bind with. + * + * .. code-block:: c + * + * static const struct zxdh_auxiliary_device_id my_auxiliary_id_table[] = { + * { .name = "foo_mod.foo_dev" }, + * {}, + * }; + * + * MODULE_DEVICE_TABLE(zxdh_auxiliary, my_auxiliary_id_table); + * + * struct zxdh_auxiliary_driver my_drv = { + * .name = "myauxiliarydrv", + * .id_table = my_auxiliary_id_table, + * .probe = my_drv_probe, + * .remove = my_drv_remove + * }; + */ +struct zxdh_auxiliary_driver { + int32_t (*probe)(struct zxdh_auxiliary_device *auxdev, const struct zxdh_auxiliary_device_id *id); + int32_t (*remove)(struct zxdh_auxiliary_device *auxdev); + void (*shutdown)(struct zxdh_auxiliary_device *auxdev); + int32_t (*suspend)(struct zxdh_auxiliary_device *auxdev, pm_message_t state); + int32_t (*resume)(struct zxdh_auxiliary_device *auxdev); + const char *name; + struct device_driver driver; + const struct zxdh_auxiliary_device_id *id_table; +}; + +static inline void *zxdh_auxiliary_get_drvdata(struct zxdh_auxiliary_device *auxdev) +{ + return dev_get_drvdata(&auxdev->dev); +} + +static inline void zxdh_auxiliary_set_drvdata(struct zxdh_auxiliary_device *auxdev, void *data) +{ + dev_set_drvdata(&auxdev->dev, data); +} + +static inline struct zxdh_auxiliary_device *zxdh_to_auxiliary_dev(struct device *dev) +{ + return container_of(dev, struct zxdh_auxiliary_device, dev); +} + +static inline struct zxdh_auxiliary_driver *zxdh_to_auxiliary_drv(struct device_driver *drv) +{ + return container_of(drv, struct zxdh_auxiliary_driver, driver); +} + +int32_t zxdh_auxiliary_device_init(struct zxdh_auxiliary_device *auxdev); +int32_t zxdh_aux_dev_add(struct zxdh_auxiliary_device *auxdev, const char *modname); +#define zxdh_auxiliary_device_add(auxdev) zxdh_aux_dev_add(auxdev, KBUILD_MODNAME) + +static inline void zxdh_auxiliary_device_uninit(struct zxdh_auxiliary_device *auxdev) +{ + put_device(&auxdev->dev); +} + +static inline void zxdh_auxiliary_device_delete(struct zxdh_auxiliary_device *auxdev) +{ + device_del(&auxdev->dev); +} + +int32_t zxdh_aux_drv_register(struct zxdh_auxiliary_driver *auxdrv, struct module *owner, + const char *modname); +#define zxdh_auxiliary_driver_register(auxdrv) \ + zxdh_aux_drv_register(auxdrv, THIS_MODULE, KBUILD_MODNAME) + +void zxdh_auxiliary_driver_unregister(struct zxdh_auxiliary_driver *auxdrv); + +/** + * module_auxiliary_driver() - Helper macro for registering an auxiliary driver + * @__auxiliary_driver: auxiliary driver struct + * + * Helper macro for auxiliary drivers which do not do anything special in + * module init/exit. This eliminates a lot of boilerplate. Each module may only + * use this macro once, and calling it replaces module_init() and module_exit() + * + * .. code-block:: c + * + * module_auxiliary_driver(my_drv); + */ +#define module_auxiliary_driver(__auxiliary_driver) \ + module_driver(__auxiliary_driver, zxdh_auxiliary_driver_register, zxdh_auxiliary_driver_unregister) + +#ifdef HAVE_LINUX_DEVICE_BUS_H +struct zxdh_auxiliary_device *zxdh_auxiliary_find_device(struct device *start, + const void *data, + int32_t (*match)(struct device *dev, const void *data)); +#else +#ifdef HAVE_BUS_FIND_DEVICE_GET_CONST +struct zxdh_auxiliary_device * +zxdh_auxiliary_find_device(struct device *start, + const void *data, + int32_t (*match)(struct device *dev, const void *data)); +#else +struct zxdh_auxiliary_device * +zxdh_auxiliary_find_device(struct device *start, + void *data, + int32_t (*match)(struct device *dev, void *data)); +#endif /* HAVE_BUS_FIND_DEVICE_GET_CONST */ +#endif /* HAVE_LINUX_DEVICE_BUS_H */ + +#ifdef __cplusplus +} +#endif + +#endif /* _AUXILIARY_BUS_H_ */ diff --git a/src/net/include/linux/dinghai/device.h b/src/net/include/linux/dinghai/device.h new file mode 100755 index 0000000..651a5ea --- /dev/null +++ b/src/net/include/linux/dinghai/device.h @@ -0,0 +1,155 @@ +#ifndef DINGHAI_DEVICE_H +#define DINGHAI_DEVICE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* helper macros */ +#define __dh_nullp(typ) ((struct dh_ifc_##typ##_bits *)0) +#define __dh_bit_sz(typ, fld) sizeof(__dh_nullp(typ)->fld) +#define __dh_bit_off(typ, fld) (offsetof(struct dh_ifc_##typ##_bits, fld)) +#define __dh_16_off(typ, fld) (__dh_bit_off(typ, fld) / 16) +#define __dh_dw_off(typ, fld) (__dh_bit_off(typ, fld) / 32) +#define __dh_64_off(typ, fld) (__dh_bit_off(typ, fld) / 64) +#define __dh_16_bit_off(typ, fld) (16 - __dh_bit_sz(typ, fld) - (__dh_bit_off(typ, fld) & 0xf)) +#define __dh_dw_bit_off(typ, fld) (32 - __dh_bit_sz(typ, fld) - (__dh_bit_off(typ, fld) & 0x1f)) +#define __dh_mask(typ, fld) ((u32)((1ull << __dh_bit_sz(typ, fld)) - 1)) +#define __dh_dw_mask(typ, fld) (__dh_mask(typ, fld) << __dh_dw_bit_off(typ, fld)) +#define __dh_mask16(typ, fld) ((u16)((1ull << __dh_bit_sz(typ, fld)) - 1)) +#define __dh_16_mask(typ, fld) (__dh_mask16(typ, fld) << __dh_16_bit_off(typ, fld)) +#define __dh_st_sz_bits(typ) sizeof(struct dh_ifc_##typ##_bits) + +#define DH_FLD_SZ_BYTES(typ, fld) (__dh_bit_sz(typ, fld) / 8) +#define DH_ST_SZ_BYTES(typ) (sizeof(struct dh_ifc_##typ##_bits) / 8) +#define DH_ST_SZ_DW(typ) (sizeof(struct dh_ifc_##typ##_bits) / 32) +#define DH_ST_SZ_QW(typ) (sizeof(struct dh_ifc_##typ##_bits) / 64) +#define DH_UN_SZ_BYTES(typ) (sizeof(union dh_ifc_##typ##_bits) / 8) +#define DH_UN_SZ_DW(typ) (sizeof(union dh_ifc_##typ##_bits) / 32) +#define DH_BYTE_OFF(typ, fld) (__dh_bit_off(typ, fld) / 8) +#define DH_ADDR_OF(typ, p, fld) ((void *)((uint8_t *)(p) + DH_BYTE_OFF(typ, fld))) + +/* insert a value to a struct */ +#define DH_SET(typ, p, fld, v) do { \ + u32 _v = v; \ + BUILD_BUG_ON(__dh_st_sz_bits(typ) % 32); \ + *((__be32 *)(p) + __dh_dw_off(typ, fld)) = \ + cpu_to_be32((be32_to_cpu(*((__be32 *)(p) + __dh_dw_off(typ, fld))) & \ + (~__dh_dw_mask(typ, fld))) | (((_v) & __dh_mask(typ, fld)) \ + << __dh_dw_bit_off(typ, fld))); \ +} while (0) + +#define DH_ARRAY_SET(typ, p, fld, idx, v) do { \ + BUILD_BUG_ON(__dh_bit_off(typ, fld) % 32); \ + DH_SET(typ, p, fld[idx], v); \ +} while (0) + +#define DH_SET_TO_ONES(typ, p, fld) do { \ + BUILD_BUG_ON(__dh_st_sz_bits(typ) % 32); \ + *((__be32 *)(p) + __dh_dw_off(typ, fld)) = \ + cpu_to_be32((be32_to_cpu(*((__be32 *)(p) + __dh_dw_off(typ, fld))) & \ + (~__dh_dw_mask(typ, fld))) | ((__dh_mask(typ, fld)) \ + << __dh_dw_bit_off(typ, fld))); \ +} while (0) + +#define DH_GET(typ, p, fld) ((be32_to_cpu(*((__be32 *)(p) + \ +__dh_dw_off(typ, fld))) >> __dh_dw_bit_off(typ, fld)) & \ +__dh_mask(typ, fld)) + +#define DH_GET_PR(typ, p, fld) ({ \ + u32 ___t = DH_GET(typ, p, fld); \ + pr_debug(#fld " = 0x%x\n", ___t); \ + ___t; \ +}) + +#define __DH_SET64(typ, p, fld, v) do { \ + BUILD_BUG_ON(__dh_bit_sz(typ, fld) != 64); \ + *((__be64 *)(p) + __dh_64_off(typ, fld)) = cpu_to_be64(v); \ +} while (0) + +#define DH_SET64(typ, p, fld, v) do { \ + BUILD_BUG_ON(__dh_bit_off(typ, fld) % 64); \ + __DH_SET64(typ, p, fld, v); \ +} while (0) + +#define DH_ARRAY_SET64(typ, p, fld, idx, v) do { \ + BUILD_BUG_ON(__dh_bit_off(typ, fld) % 64); \ + __DH_SET64(typ, p, fld[idx], v); \ +} while (0) + +#define DH_GET64(typ, p, fld) be64_to_cpu(*((__be64 *)(p) + __dh_64_off(typ, fld))) + +#define DH_GET64_PR(typ, p, fld) ({ \ + u64 ___t = DH_GET64(typ, p, fld); \ + pr_debug(#fld " = 0x%llx\n", ___t); \ + ___t; \ +}) + +#define DH_GET16(typ, p, fld) ((be16_to_cpu(*((__be16 *)(p) + \ +__dh_16_off(typ, fld))) >> __dh_16_bit_off(typ, fld)) & \ +__dh_mask16(typ, fld)) + +#define DH_SET16(typ, p, fld, v) do { \ + u16 _v = v; \ + BUILD_BUG_ON(__dh_st_sz_bits(typ) % 16); \ + *((__be16 *)(p) + __dh_16_off(typ, fld)) = \ + cpu_to_be16((be16_to_cpu(*((__be16 *)(p) + __dh_16_off(typ, fld))) & \ + (~__dh_16_mask(typ, fld))) | (((_v) & __dh_mask16(typ, fld)) \ + << __dh_16_bit_off(typ, fld))); \ +} while (0) + +/* Big endian getters */ +#define DH_GET64_BE(typ, p, fld) (*((__be64 *)(p) + \ + __dh_64_off(typ, fld))) + +#define DH_GET_BE(type_t, typ, p, fld) ({ \ + type_t tmp; \ + switch (sizeof(tmp)) { \ + case sizeof(u8): \ + tmp = (__force type_t)DH_GET(typ, p, fld); \ + break; \ + case sizeof(u16): \ + tmp = (__force type_t)cpu_to_be16(DH_GET(typ, p, fld)); \ + break; \ + case sizeof(u32): \ + tmp = (__force type_t)cpu_to_be32(DH_GET(typ, p, fld)); \ + break; \ + case sizeof(u64): \ + tmp = (__force type_t)DH_GET64_BE(typ, p, fld); \ + break; \ + } \ + tmp; \ + }) + +enum dh_cap_type { + DH_CAP_GENERAL = 0, +}; +/* GET Dev Caps macros */ +#define DH_CAP_GEN(mdev, cap) \ + DH_GET(cmd_hca_cap, mdev->caps.hca[DH_CAP_GENERAL]->cur, cap) + +#define DH_CAP_GEN_64(mdev, cap) \ + DH_GET64(cmd_hca_cap, mdev->caps.hca[DH_CAP_GENERAL]->cur, cap) + +#define DH_CAP_GEN_MAX(mdev, cap) \ + DH_GET(cmd_hca_cap, mdev->caps.hca[DH_CAP_GENERAL]->max, cap) + + + + +enum dh_event_queue_type { + DH_EVENT_QUEUE_TYPE_SAMPLE, + DH_EVENT_QUEUE_TYPE_RISCV +}; + +struct dh_mpf_priv { + +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/include/linux/dinghai/devlink.h b/src/net/include/linux/dinghai/devlink.h new file mode 100755 index 0000000..1801a58 --- /dev/null +++ b/src/net/include/linux/dinghai/devlink.h @@ -0,0 +1,32 @@ +#ifndef __ZXDH_DEVLINK_H__ +#define __ZXDH_DEVLINK_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +struct devlink *zxdh_devlink_alloc(struct device *dev, struct devlink_ops *dh_devlink_ops, size_t priv_size); +void zxdh_devlink_free(struct devlink *devlink); + +#ifdef HAVE_DEVLINK_REGISTER_GET_1_PARAMS +int32_t zxdh_devlink_register(struct devlink *devlink); +#else +int32_t zxdh_devlink_register(struct devlink *devlink, struct device *dev); +#endif + +void zxdh_devlink_unregister(struct devlink *devlink); + +static inline struct net *dh_core_net(struct dh_core_dev *dev) +{ + return devlink_net(priv_to_devlink(dev)); +} + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/net/include/linux/dinghai/dh_cmd.h b/src/net/include/linux/dinghai/dh_cmd.h new file mode 100644 index 0000000..29779fc --- /dev/null +++ b/src/net/include/linux/dinghai/dh_cmd.h @@ -0,0 +1,266 @@ +#ifndef _ZXDH_MSG_CHAN_PUB_H_ +#define _ZXDH_MSG_CHAN_PUB_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + + +#define INVALID_NUM 0xff +#define ZXDH_MPF_PCIEID 0x800 +#define ZXDH_NET_ACK_OK 0 +#define RISCV_MAC_OK 0xaa +#define BAR_MSG_REPS_OK 0xff +#define COMMON_TBL_OK 0xaa +#define RISCV_DEBUG_OK 0xaa +#define PCIEID_PF_ID_MASK (0x0700) +#define PCIEID_PF_ID_OFFSET (8) + +#define FIND_PF_PCIE_ID(value) ((value & 0xff00) | BIT(11)) +#define FIND_VF_PCIE_ID(pf_pcie_id, vf_id) ((pf_pcie_id & (~BIT(11))) | (vf_id)) +#define FIND_PF_ID(pf_pcie_id) ((pf_pcie_id & PCIEID_PF_ID_MASK) >> PCIEID_PF_ID_OFFSET) +#define GET_FUNC_NO(pf_no, vf_idx) ((pf_no & 0xF) | ((vf_idx & 0xFF) << 8)) + +#define PFVF_FLAG_OFFSET 11 // 用于判断pcie_id的第11位为0或1 + +typedef enum +{ + MODULE_DBG = 0, /* 中断测试*/ + MODULE_TBL, /* 资源表交互*/ + MODULE_MSIX, /* Msix配置*/ + MODULE_SDA, /* Sda消息*/ + MODULE_RDMA, /* Rdma调试*/ + MODULE_DEMO, /* 通路测试*/ + MODULE_SMMU, /* Smmu调试*/ + MODULE_MAC, /* MAC相关*/ + MODULE_VDPA, /* vdpa热迁移*/ + MODULE_VQM, /* vqm消息*/ + MODULE_MSGQ, + MODULE_VPORT_GET, /* 获取vport接口*/ + MODULE_BDF_GET, /* 获取bdf接口*/ + MODULE_RISC_READY, /* risc ready信号*/ + MODULE_REVERSE, /* 字节流取反*/ + MODULE_NVME, /* NVME调试*/ + MODULE_NPSDK, /* Np配表*/ + MODULE_TOD, /* UART通信*/ + MODULE_VF_BAR_MSG_TO_PF, /* VF发送给PF的消息 */ + MODULE_PF_BAR_MSG_TO_VF, /* PF发送给VF的消息 */ + MODULE_DEBUG = 20, /* 调用debug接口 */ + MODULE_PPS = 23, /*pps中断相关消息*/ + MODULE_VIRTIO = 25, + MODULE_FLASH = 32, /* 读取flash信息 */ + MODULE_OFFSET_GET = 33, + MODULE_CFG_MAC = 34, + MODULE_PHYPORT_QUERY = 37, /* BOND 获取phyport*/ + MODULE_DHTOOL = 39, /*dhtool,riscv发送给AUX层的消息,将其转发给user*/ + MODULE_RESET_MSG = 40, /* host复位消息的ID号 */ + MODULE_PF_TIMER_TO_RISC_MSG = 41, /* server rsicv time */ + MODULE_LOGIN_CTRL = 43, /* 控制riscv上sshd守护进程开启和关闭*/ + MODULE_PCIE_RES_QUERY = 52, /* pcie资源查询*/ + MSG_MODULE_NUM = 100, +} MSG_MODULE_ID; + + +/* 消息端*/ +typedef enum BAR_DRIVER_TYPE +{ + MSG_CHAN_END_MPF = 0, + MSG_CHAN_END_PF, + MSG_CHAN_END_VF, + MSG_CHAN_END_RISC, + MSG_CHAN_END_ERR, +} BAR_DRIVER_TYPE; + +#define BDF_ECAM(bus, devid, func) ((bus & 0xff) << 8) | (func & 0x07) | ((devid & 0x1f) << 3) + +/* bar通道错误码*/ +typedef enum BAR_MSG_RTN +{ + BAR_MSG_OK = 0, + BAR_MSG_ERR_NULL, /* 空指针*/ + BAR_MSG_ERR_TYPE, /* 消息类型异常 */ + BAR_MSG_ERR_MODULE , /* 模块ID异常 */ + BAR_MSG_ERR_BODY_NULL, /* 消息体异常 */ + BAR_MSG_ERR_LEN, /* 消息长度异常 */ + BAR_MSG_ERR_TIME_OUT, /* 消息发送超长 */ + BAR_MSG_ERR_NOT_READY, /* 消息发送条件异常,BUF不可以用*/ + BAR_MEG_ERR_NULL_FUNC, /* 空的接收处理函数指针*/ + BAR_MSG_ERR_REPEAT_REGISTER, /* 模块重复注册*/ + BAR_MSG_ERR_UNGISTER, /* 重复解注册*/ + BAR_MSG_ERR_NULL_PARA, /* 发送接口参数界结构体指针为空*/ + BAR_MSG_ERR_REPSBUFF_LEN, /* reps_buff的长度太短*/ + BAR_MSG_ERR_MODULE_NOEXIST, /*查找不到该模块对应的消息处理函数*/ + BAR_MSG_ERR_VIRTADDR_NULL, /*发送接口传入参数中的虚拟地址为空*/ + BAR_MSG_ERR_REPLY, /**< seq_id匹配失败>**/ + BAR_MSG_ERR_MSGID, /**< seq_id申请失败>**/ + BAR_MSG_ERR_MPF_NOT_SCANED, /**< MPF通道不可用>**/ + BAR_MSG_ERR_USR_RET_ERR, /**< 处理函数返回值错误>**/ + BAR_MSG_ERR_ERR_PCIEID, /**< pcieID错误>**/ + BAR_MSG_ERR_NOT_MATCH, +} BAR_MSG_RTN; + +enum pciebar_layout_type +{ + URI_VQM = 0, + URI_SPINLOCK = 1, + URI_FWCAP = 2, + URI_FWSHR = 3, + URI_DRS_SEC = 4, + URI_RSV = 5, + URI_CTRLCH = 6, + URI_1588 = 7, + URI_QBV = 8, + URI_MACPCS = 9, + URI_RDMA = 10, +/* DEBUG PF */ + URI_MNP = 11, + URI_MSPM = 12, + URI_MVQM = 13, + URI_MDPI = 14, + URI_NP = 15, +/* END DEBUG PF */ + URI_MAX, +}; + +typedef enum +{ + BAR_MSG_MSIX_FROM_VF = 0, + BAR_MSG_MSIX_FROM_MPF, + BAR_MSG_MSIX_FROM_RISCV, + BAR_MSG_MSIX_NUM_MAX +} bar_msg_msix_irq_type; + +/* msix消息参数结构体*/ +struct msix_para +{ + uint16_t vector_risc; + uint16_t vector_pfvf; + uint16_t vector_mpf; + uint16_t driver_type; + uint16_t pcie_id; + struct pci_dev *pdev; + uint64_t virt_addr; +}; + +struct bar_offset_params +{ + uint64_t virt_addr; + uint16_t pcie_id; + uint16_t type; +}; +struct bar_offset_res +{ + uint32_t bar_offset; + uint32_t bar_length; +}; + +struct zxdh_pci_bar_msg +{ + uint64_t virt_addr; /**< 4k空间地址, 若src为MPF该参数不生效>**/ + void *payload_addr; /**< 消息净荷地址>**/ + uint16_t payload_len; /**< 消息净荷长度>**/ + uint16_t emec; /**< 消息紧急类型>**/ + uint16_t src; /**< 消息发送源,参考BAR_DRIVER_TYPE>**/ + uint16_t dst; /**< 消息接收者,参考BAR_DRIVER_TYPE>**/ + uint32_t event_id; /**< 事件id>**/ + uint16_t src_pcieid; /**< 源 pcie_id>**/ + uint16_t dst_pcieid; /**< 目的pcie_id>**/ +}; + +struct link_info_struct +{ + uint32_t speed; + uint32_t autoneg_enable; + uint32_t supported_speed_modes; + uint32_t advertising_speed_modes; + uint8_t duplex; +}; + +struct zxdh_msg_recviver_mem +{ + void *recv_buffer; /**< 消息接收缓存>**/ + uint16_t buffer_len; /**< 消息缓存长度>**/ +}; + +/** + * zxdh_bar_chan_msg_recv_callback - 消息处理函数 + * @pay_load: 消息内容 + * @len: 消息长度 + * @reps_buffer: 回复消息 + * @reps_len: 回复消息长度 + * @dev: 私有数据 + */ +typedef int (*zxdh_bar_chan_msg_recv_callback)(void *pay_load, uint16_t len, void *reps_buffer, uint16_t *reps_len, void *dev); + +/** + * zxdh_bar_chan_sync_msg_send - 通过PCIE BAR空间发送同步消息 + * @in: 消息发送信息 + * @result: 消息结果反馈 + * @return: 0 成功,其他失败 + */ +int zxdh_bar_chan_sync_msg_send(struct zxdh_pci_bar_msg *in, struct zxdh_msg_recviver_mem *result); + +/** + * zxdh_bar_chan_msg_recv_register - PCIE BAR空间消息方式,注册消息接收回调 + * @event_id: 注册模块id + * @callback: 模块实现的接收处理函数指针 + * @return: 0 成功,其他失败 + * 在驱动初始化时调用 + */ +int zxdh_bar_chan_msg_recv_register(uint8_t event_id, zxdh_bar_chan_msg_recv_callback callback); + +/** + * zxdh_bar_chan_msg_recv_unregister - PCIE BAR空间消息方式,解注册消息接收回调 + * @event_id: 内核PCIE设备地址 + * @return:0 成功,其他失败 + * 在驱动卸载时需要调用 + */ +int zxdh_bar_chan_msg_recv_unregister(uint8_t event_id); + +/** + * zxdh_bar_enable_chan - 驱动使能通道函数 + * @_msix_para: msix中断配置信息 + * @pcie_id: 查询到的pcie_id + * @vport: 查询到的vport + * @return: 0 成功,其他失败 + */ +int zxdh_bar_enable_chan(struct msix_para *_msix_para, uint16_t *vport); + +/** + * zxdh_get_bar_offset - 获取指定模块的偏移值 + * @bar_offset_params: 输入参数 + * @bar_offset_res: 模块偏移和长度 + */ +int zxdh_get_bar_offset(struct bar_offset_params *paras, struct bar_offset_res *res); + +int32_t zxdh_send_command(uint64_t vaddr, uint16_t pcie_id, uint16_t module_id, \ + void *msg, void *ack ,bool is_sync_msg); + +int zxdh_bar_msg_chan_init(void); +int zxdh_bar_msg_chan_remove(void); + +/** + * zxdh_bar_reset_valid - 重置risc发来消息的valid + * @subchan_addr: 4k首地址 + * @return: 0 成功,其他失败 + */ +void zxdh_bar_reset_valid(uint64_t subchan_addr); + +/** + * zxdh_get_event_id - 获取risc发来消息的event_id + * @subchan_addr: 4k首地址 + * @return: event_id + */ +uint16_t zxdh_get_event_id(uint64_t subchan_addr, uint8_t src_type, uint8_t dst_type); + +int zxdh_bar_irq_recv(uint8_t src, uint8_t dst, uint64_t virt_addr, void *dev); +int32_t call_msg_recv_func_tbl(uint16_t event_id, void *pay_load, uint16_t len, void *reps_buffer, uint16_t *reps_len, void *dev); + +#ifdef __cplusplus +} +#endif + +#endif /* _ZXDH_MSG_CHAN_PUB_H_ */ diff --git a/src/net/include/linux/dinghai/dh_ifc.h b/src/net/include/linux/dinghai/dh_ifc.h new file mode 100755 index 0000000..0006aad --- /dev/null +++ b/src/net/include/linux/dinghai/dh_ifc.h @@ -0,0 +1,51 @@ +#ifndef DINGHAI_IFC_H +#define DINGHAI_IFC_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +struct dh_ifc_cmd_hca_cap_bits { + +}; +union dh_ifc_hca_cap_union_bits{ + +}; + +struct dh_ifc_mbox_in_bits { + uint8_t opcode[0x10]; + uint8_t uid[0x10]; + + uint8_t reserved_at_20[0x10]; + uint8_t op_mod[0x10]; + + uint8_t reserved_at_40[0x40]; +}; + +struct dh_ifc_mbox_out_bits { + uint8_t status[0x8]; + uint8_t reserved_at_8[0x18]; + + uint8_t syndrome[0x20]; + + uint8_t reserved_at_40[0x40]; +}; + +struct dh_ifc_query_hca_cap_out_bits { + uint8_t status[0x8]; + uint8_t reserved_at_8[0x18]; + + uint8_t syndrome[0x20]; + + uint8_t reserved_at_40[0x40]; + + union dh_ifc_hca_cap_union_bits capability; +}; + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/net/include/linux/dinghai/dinghai_irq.h b/src/net/include/linux/dinghai/dinghai_irq.h new file mode 100755 index 0000000..7caaa62 --- /dev/null +++ b/src/net/include/linux/dinghai/dinghai_irq.h @@ -0,0 +1,68 @@ +#ifndef __DINGHAI_IRQ_H__ +#define __DINGHAI_IRQ_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#define DH_COMP_EQS_PER_SF 8 + +struct dh_irq; + +int32_t dh_irq_table_init(struct dh_core_dev *dev); +void dh_irq_table_cleanup(struct dh_core_dev *dev); +int32_t dh_irq_table_create(struct dh_core_dev *dev); +void dh_irq_table_destroy(struct dh_core_dev *dev); +int32_t dh_irq_table_get_num_comp(struct dh_irq_table *table); +// int32_t dh_irq_table_get_sfs_vec(struct dh_irq_table *table); +// bool dh_irq_table_have_dedicated_sfs_irqs(struct dh_irq_table *table); + +void dh_irq_rename(struct dh_core_dev *dev, struct dh_irq *irq, + const char *name); +int32_t dh_get_default_msix_vec_count(struct dh_core_dev *dev, int32_t num_vfs); + + +void dh_ctrl_irq_release(struct dh_irq *ctrl_irq); +struct dh_irq *dh_irq_request(struct dh_irq_pool *pool, uint16_t vecidx, + const struct cpumask *affinity, uint8_t exclude); +int32_t dh_irqs_request_vectors(struct dh_irq_pool *pool, uint16_t *cpus, int32_t nirqs, + struct dh_irq **irqs); +void dh_irqs_release_vectors(struct dh_irq **irqs, int32_t nirqs); +int32_t dh_irqs_request_mask(struct dh_irq_pool *pool, struct dh_irq **irqs, + struct cpumask *irqs_req_mask); +int32_t dh_irq_attach_nb(struct dh_irq *irq, struct notifier_block *nb); +int32_t dh_irq_detach_nb(struct dh_irq *irq, struct notifier_block *nb); +struct cpumask *dh_irq_get_affinity_mask(struct dh_irq *irq); +int32_t dh_irq_get_index(struct dh_irq *irq); + +struct dh_irq_pool; +#ifdef CONFIG_ZXDH_SF + +int32_t dh_irq_affinity_irqs_request_auto(struct dh_irq_pool *pool, struct dh_irq **irqs, int32_t num_irqs); +struct dh_irq *dh_irq_affinity_request(struct dh_irq_pool *pool, + const struct cpumask *req_mask); +void dh_irq_affinity_irqs_release(struct dh_irq_pool *pool, struct dh_irq **irqs, int32_t num_irqs); +#else +static inline int32_t dh_irq_affinity_irqs_request_auto(struct dh_irq_pool *pool, struct dh_irq **irqs, int32_t num_irqs) +{ + return -EOPNOTSUPP; +} + +static inline struct dh_irq * +dh_irq_affinity_request(struct dh_irq_pool *pool, const struct cpumask *req_mask) +{ + return ERR_PTR(-EOPNOTSUPP); +} + +static inline void dh_irq_affinity_irqs_release(struct dh_irq_pool *pool, + struct dh_irq **irqs, int32_t num_irqs) {} +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/include/linux/dinghai/driver.h b/src/net/include/linux/dinghai/driver.h new file mode 100755 index 0000000..bfff65f --- /dev/null +++ b/src/net/include/linux/dinghai/driver.h @@ -0,0 +1,219 @@ +#ifndef __DINGHAI_DRIVER_H__ +#define __DINGHAI_DRIVER_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include + +struct dh_irq_table { + void *priv; +}; + +/*core dev*/ +enum dh_coredev_type { + DH_COREDEV_PF, + DH_COREDEV_VF, + DH_COREDEV_SF, + DH_COREDEV_MPF +}; + +typedef void (*zxdh_cmd_cbk_t)(int32_t status, void *context); + +struct dh_core_dev; + +struct dh_core_devlink_ops { + int32_t (*params_register)(struct devlink *devlink); + int32_t (*params_unregister)(struct devlink *devlink); +}; + +struct dh_core_dev { + struct device *device; /* pdev->dev or zxdh auxiliary device*/ + enum dh_coredev_type coredev_type; + struct pci_dev *pdev; /* parent pdev*/ + struct pcie_zf_ep *zf_ep; + struct dh_eq_table eq_table; + struct dh_irq_table irq_table; + struct dh_core_dev *parent; + struct dh_events *events; + int32_t numa_node; + struct devlink *devlink; + struct dh_core_devlink_ops *devlink_ops; + char priv[] __aligned(32); +}; + +#define VF_MAX_UNICAST_MAC 32 +#define VF_MAX_MULTICAST_MAC 32 +typedef struct +{ + uint8_t unicast_mac[VF_MAX_UNICAST_MAC][ETH_ALEN]; + uint8_t multicast_mac[VF_MAX_MULTICAST_MAC][ETH_ALEN]; +}device_mac; + +struct zxdh_vf_item { + uint8_t mac[6]; + uint16_t vlan; + uint8_t qos; + bool spoofchk; + bool trusted; + bool pf_set_mac; + bool link_forced; + bool link_up; + bool promisc; + bool mc_promisc; + bool enable; + uint32_t min_tx_rate; + uint32_t max_tx_rate; + uint16_t vport; + bool is_probed; + device_mac vf_mac_info; +}; + +static inline bool dh_core_is_pf(const struct dh_core_dev *dev) +{ + return dev->coredev_type == DH_COREDEV_PF; +} + +static inline bool dh_core_is_vf(const struct dh_core_dev *dev) +{ + return dev->coredev_type == DH_COREDEV_VF; +} + +static inline void *dh_core_priv(struct dh_core_dev *dh_coredev) +{ + BUG_ON(!dh_coredev); + return &dh_coredev->priv; +} + +int32_t zxdh_cmd_exec(struct dh_core_dev *dev, void *in, int32_t in_size, void *out, + int32_t out_size); + +#define zxdh_cmd_exec_inout(dev, ifc_cmd, in, out) \ + ({ \ + zxdh_cmd_exec(dev, in, DH_ST_SZ_BYTES(ifc_cmd##_in), out, \ + DH_ST_SZ_BYTES(ifc_cmd##_out)); \ + }) + +#define zxdh_cmd_exec_in(dev, ifc_cmd, in) \ + ({ \ + uint32_t _out[DH_ST_SZ_DW(ifc_cmd##_out)] = {}; \ + zxdh_cmd_exec_inout(dev, ifc_cmd, in, _out); \ + }) + +#define LOG_ERR(fmt, arg...) DH_LOG_ERR(MODULE_PF, fmt, ##arg); +#define LOG_INFO(fmt, arg...) DH_LOG_INFO(MODULE_PF, fmt, ##arg); +#define LOG_DEBUG(fmt, arg...) DH_LOG_DEBUG(MODULE_PF, fmt, ##arg); +#define LOG_WARN(fmt, arg...) DH_LOG_WARNING(MODULE_PF, fmt, ##arg); + +#define ZXDH_ADEV_NAME "dh_adev" +#define ZXDH_EN_SF_NAME "zxdh_en" +#define ZXDH_EN_DEV_ID_NAME "en_aux" +#define ZXDH_PF_EN_SF_DEV_ID_NAME "pf_en_sf" +#define ZXDH_EN_AUX_NAME "zxdh_en_aux" +#define ZXDH_PF_NAME "zxdh_pf" +#define ZXDH_MPF_EN_SF_DEV_ID_NAME "mpf_en_sf" +#define ZXDH_MPF_NAME "zxdh_mpf" +#define ZXDH_RDMA_DEV_NAME "rdma_aux" + + +#define ZXDH_PF_BSI_VENDOR_ID 0x16c3 +#define ZXDH_PF_VENDOR_ID 0x1cf2 +#define ZXDH_PF_DEVICE_ID 0x8040 +#define ZXDH_VF_DEVICE_ID 0x8041 +#define ZXDH_INICA_BOND_DEVICE_ID 0x8045 +#define ZXDH_INICB_BOND_DEVICE_ID 0x8063 +#define ZXDH_DPUA_BOND_DEVICE_ID 0x8047 +#define ZXDH_PF_DPUB_NOF_DEVICE_ID 0x804a +#define ZXDH_PF_DPUB_PF_DEVICE_ID 0x804b +#define ZXDH_PF_DPUB_INITIATOR1_DEVICE_ID 0x804c +#define ZXDH_PF_DPUB_INITIATOR2_DEVICE_ID 0x804d +#define ZXDH_PF_DPUB_RDMA_DEVICE_ID 0x806b +#define ZXDH_VF_DPUB_RDMA_DEVICE_ID 0x806c +#define ZXDH_PF_E310_DEVICE_ID 0x8061 +#define ZXDH_VF_E310_DEVICE_ID 0x8062 +#define ZXDH_PF_E312_DEVICE_ID 0x8049 +#define ZXDH_VF_E312_DEVICE_ID 0x8060 +#define ZXDH_UPF_PF_I512_DEVICE_ID 0x804e +#define ZXDH_UPF_VF_I512_DEVICE_ID 0x804f +#define ZXDH_INICA_RDMA_PF_DEVICE_ID 0x806d +#define ZXDH_INICA_RDMA_VF_DEVICE_ID 0x806e +#define ZXDH_INICA_UPF_BOND_DEVICE_ID 0x806f + +#define ZXDH_BAR_MSG_OFFSET 0x2000 +#define ZXDH_BAR_PFVF_MSG_OFFSET 0x1000 +#define ZXDH_BAR_MSG_BASE(vaddr) (ZXDH_BAR_MSG_OFFSET + vaddr) + +#define ZXDH_BAR_FWCAP(vaddr) (0x1000 + vaddr) +#define ZXDH_BOARD_TYPE (0X1) +#define ZXDH_PRODUCT_TYPE (0X2) +#define ZXDH_PANNEL_PORT_NUM (0X3) + + +enum +{ + ZXDH_DPU_A = 0, + ZXDH_DPU_B = 1, + ZXDH_INIC_A = 2, + ZXDH_INIC_B = 3, + ZXDH_STD_A = 4, + ZXDH_STD_B = 5, + ZXDH_EVB_EP0 = 6, + ZXDH_EVB_EP0_EP4 = 7, +}; + +/* Warning: Must be modified together with firmware */ +enum +{ + ZXDH_PRODUCT_STD = 0, + ZXDH_PRODUCT_DPI = 1, + ZXDH_PRODUCT_NEO = 2, + ZXDH_PRODUCT_OVS = 3, + ZXDH_PRODUCT_EVB_EP0 = 4, + ZXDH_PRODUCT_EVB_EP0_EP4 = 5, +}; + +#define ZXDH_VF_NUM_MAX 256 + +struct resource_range { + phys_addr_t base; + resource_size_t size; +}; + +struct dh_sf_dev { + struct zxdh_auxiliary_device adev; + struct dh_core_dev *parent_mdev; + struct dh_core_dev *mdev; + int32_t res_num; + struct resource_range *ranges; +}; + +struct zf_rbp_info +{ + bool host; /* true: host addr false: zf addr*/ + uint32_t pfid; /* bit7: 0-pf 1-vf */ + uint32_t vfid; + uint32_t epid; +}; + +struct zf_dma_addr_rbp +{ + dma_addr_t addr; /* src/dst addr */ + uint32_t flag; /* no support */ + struct zf_rbp_info rbp_info; +}; + +void zxdh_dev_list_lock(void); +void zxdh_dev_list_unlock(void); +int zxdh_dev_list_trylock(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/include/linux/dinghai/en_aux.h b/src/net/include/linux/dinghai/en_aux.h new file mode 100644 index 0000000..522f67e --- /dev/null +++ b/src/net/include/linux/dinghai/en_aux.h @@ -0,0 +1,69 @@ +#ifndef _EN_ZUX_H_ +#define _EN_ZUX_H_ + +#ifdef __cplusplus +extern "C" { +#endif + + +struct eth_stats +{ + uint64_t rx_pkts; /* gorc */ + uint64_t rx_bytes; /* gorc */ + uint64_t rx_unicast; /* uprc */ + uint64_t rx_multicast; /* mprc */ + uint64_t rx_broadcast; /* bprc */ + uint64_t rx_discards; /* rdpc */ + uint64_t rx_errors; /* rupp */ + uint64_t tx_pkts; /* gorc */ + uint64_t tx_bytes; /* gotc */ + uint64_t tx_unicast; /* uptc */ + uint64_t tx_multicast; /* mptc */ + uint64_t tx_broadcast; /* bptc */ + uint64_t tx_discards; /* tdpc */ + uint64_t tx_errors; /* tepc */ + uint64_t rx_size_64; /* prc64 */ + uint64_t rx_size_127; /* prc127 */ + uint64_t rx_size_255; /* prc255 */ + uint64_t rx_size_511; /* prc511 */ + uint64_t rx_size_1023; /* prc1023 */ + uint64_t rx_size_1518; + uint64_t rx_size_1522; /* prc1522 */ + uint64_t rx_size_1548; + uint64_t rx_size_2047; + uint64_t rx_size_4095; + uint64_t rx_size_8191; + uint64_t rx_size_9215; + uint64_t rx_undersize; /* ruc */ + uint64_t rx_oversize; /* roc */ + uint64_t tx_size_64; /* ptc64 */ + uint64_t tx_size_127; /* ptc127 */ + uint64_t tx_size_255; /* ptc255 */ + uint64_t tx_size_511; /* ptc511 */ + uint64_t tx_size_1023; /* ptc1023 */ + uint64_t tx_size_1518; + uint64_t tx_size_1522; /* prc1522 */ + uint64_t tx_size_1548; + uint64_t tx_size_2047; + uint64_t tx_size_4095; + uint64_t tx_size_8191; + uint64_t tx_size_9215; + uint64_t tx_undersize; /* ruc */ + uint64_t tx_oversize; /* roc */ +}; + +struct zxdh_pf_eth_stats +{ + struct eth_stats eth_total_stat; + struct eth_stats mac0_stat; + struct eth_stats mac1_stat; + struct eth_stats mac2_stat; + struct eth_stats mac3_stat; +}; + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/include/linux/dinghai/en_sf.h b/src/net/include/linux/dinghai/en_sf.h new file mode 100755 index 0000000..5d8bee2 --- /dev/null +++ b/src/net/include/linux/dinghai/en_sf.h @@ -0,0 +1,83 @@ +#ifndef __ZXDH_EN_SF_H__ +#define __ZXDH_EN_SF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +struct zxdh_en_sf_if { + int (*en_sf_vq_irqs_request)(struct dh_core_dev *dh_dev, struct dh_irq **vq_irqs, int vq_channels); + void (*en_sf_affinity_irqs_release)(struct dh_core_dev *dh_dev, struct dh_irq **irqs, int32_t num_irqs); + void __iomem * (*en_sf_map_vq_notify)(struct dh_core_dev *dh_dev, uint32_t index, resource_size_t *pa); + void (*en_sf_unmap_vq_notify)(struct dh_core_dev *dh_dev, void *priv); + void (*en_sf_set_status)(struct dh_core_dev *dh_dev, uint8_t status); + uint8_t (*en_sf_get_status)(struct dh_core_dev *dh_dev); + void (*en_sf_set_vf_mac)(struct dh_core_dev *dh_dev, uint8_t *mac, int32_t vf_id); + void (*en_sf_get_vf_mac)(struct dh_core_dev *dh_dev, uint8_t *mac, int32_t vf_id); + void (*en_sf_set_mac)(struct dh_core_dev *dh_dev, uint8_t *mac); + void (*en_sf_get_mac)(struct dh_core_dev *dh_dev, uint8_t *mac); + uint64_t (*en_sf_get_features)(struct dh_core_dev *dh_dev); + void (*en_sf_set_features)(struct dh_core_dev *dh_dev, uint64_t features); + void (*en_sf_set_queue_enable)(struct dh_core_dev *dh_dev, uint16_t index, bool enable); + uint16_t (*en_sf_get_channels_num)(struct dh_core_dev *dh_dev); + uint16_t (*en_sf_get_queue_num)(struct dh_core_dev *dh_dev); + uint16_t (*en_sf_get_queue_size)(struct dh_core_dev *dh_dev, uint16_t index); + uint16_t (*en_sf_get_queue_vector)(struct dh_core_dev *dh_dev, uint16_t channel, struct list_head *eqs_list, uint16_t queue_index); + void (*en_sf_release_queue_vector)(struct dh_core_dev *dh_dev, int32_t queue_index); + void (*en_sf_set_queue_size)(struct dh_core_dev *dh_dev, uint32_t index, uint16_t size); + void (*en_sf_set_queue_address)(struct dh_core_dev *dh_dev, uint32_t index, uint64_t desc_addr, uint64_t driver_addr, uint64_t device_addr); + void (*en_sf_switch_irq)(struct dh_core_dev *dh_dev, int32_t i, int32_t op); + int32_t (*en_sf_get_vq_lock)(struct dh_core_dev *dh_dev); + int32_t (*en_sf_release_vq_lock)(struct dh_core_dev *dh_dev); + int32_t (*en_sf_get_phy_vq)(struct dh_core_dev *dh_dev, uint16_t index); + int32_t (*en_sf_release_phy_vq)(struct dh_core_dev *dh_dev, uint32_t *phy_index, uint16_t total_qnum); + uint32_t (*en_sf_get_epbdf)(struct dh_core_dev *dh_dev); + uint16_t (*en_sf_get_vport)(struct dh_core_dev *dh_dev); + enum dh_coredev_type (*en_sf_get_coredev_type)(struct dh_core_dev *dh_dev); + uint16_t (*en_sf_get_pcie_id)(struct dh_core_dev *dh_dev); + uint16_t (*en_sf_get_slot_id)(struct dh_core_dev *dh_dev); + bool (*en_sf_is_bond)(struct dh_core_dev *dh_dev); + bool (*en_sf_is_upf)(struct dh_core_dev *dh_dev); + struct pci_dev * (*en_sf_get_pdev)(struct dh_core_dev *dh_dev); + uint64_t (*en_sf_get_bar_virt_addr)(struct dh_core_dev *dh_dev, uint8_t bar_num); + int32_t (*en_sf_msg_send_cmd)(struct dh_core_dev *dh_dev, uint16_t module_id, void *msg, void *ack, bool is_sync); + int32_t (*en_sf_async_eq_enable)(struct dh_core_dev *dh_dev, struct dh_eq_async *eq, const char *name, bool attach); + struct zxdh_vf_item *(*en_sf_get_vf_item)(struct dh_core_dev *dh_dev, uint16_t vf_idx); + void (*en_sf_set_pf_link_up)(struct dh_core_dev *dh_dev, bool link_up); + bool (*en_sf_get_pf_link_up)(struct dh_core_dev *dh_dev); + void (*en_sf_update_pf_link_info)(struct dh_core_dev *dh_dev, struct link_info_struct *link_info_val); + int32_t (*en_sf_get_drv_msg)(struct dh_core_dev *dh_dev, uint8_t *drv_version, uint8_t *drv_version_len); + void (*en_sf_set_vepa)(struct dh_core_dev *dh_dev, bool vepa); + bool (*en_sf_get_vepa)(struct dh_core_dev *dh_dev); + void (*en_sf_set_bond_num)(struct dh_core_dev *dh_dev, bool add); + bool (*en_sf_if_init)(struct dh_core_dev *dh_dev); + int32_t (*en_sf_request_port_info)(struct dh_core_dev *dh_dev, void *data); + int32_t (*en_sf_release_port_info)(struct dh_core_dev *dh_dev, uint32_t port_id); + void (*en_sf_get_link_info_from_vqm)(struct dh_core_dev *dh_dev, uint8_t *link_up); + void (*en_sf_set_vf_link_info)(struct dh_core_dev *dh_dev, uint16_t vf_idx, uint8_t link_up); + void (*en_sf_set_pf_phy_port)(struct dh_core_dev *dh_dev, uint8_t phy_port); + uint8_t (*en_sf_get_pf_phy_port)(struct dh_core_dev *dh_dev); + void (*en_sf_set_init_comp_flag)(struct dh_core_dev *dh_dev); + struct zxdh_ipv6_mac_tbl * (*en_sf_get_ip6mac_tbl)(struct dh_core_dev *dh_dev); +}; + +struct zxdh_en_sf_container { + struct zxdh_auxiliary_device adev; + struct dh_core_dev *dh_dev; + struct dh_core_dev *cdev; + struct zxdh_en_sf_if *ops; + int max_channels; +}; + +int32_t zxdh_en_sf_driver_register(void); +void zxdh_en_sf_driver_unregister(void); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/include/linux/dinghai/eq.h b/src/net/include/linux/dinghai/eq.h new file mode 100755 index 0000000..ea3c9a0 --- /dev/null +++ b/src/net/include/linux/dinghai/eq.h @@ -0,0 +1,111 @@ +#ifndef __DINGHAI_EQ_H__ +#define __DINGHAI_EQ_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +struct dh_irq; + +#define INVALID_EVENT_TYPE 0 + +enum DH_EVENT_TYPE { + DH_EVENT_TYPE_RISCV_READY = 13, + DH_EVENT_TYPE_NOTIFY_ANY = 14, + DH_EVENT_TYPE_NOTIFY_RISC_TO_MPF = 15, + DH_EVENT_TYPE_NOTIFY_PF_TO_MPF = 16, + DH_EVENT_TYPE_NOTIFY_VF_TO_PF = 18, + DH_EVENT_TYPE_NOTIFY_PF_TO_VF = 19, + DH_EVENT_TYPE_NOTIFY_1 = 20, + DH_EVENT_TYPE_NOTIFY_2 = 21, + DH_EVENT_TYPE_NOTIFY_3 = 22, + DH_EVENT_TYPE_NOTIFY_4 = 23, + DH_EVENT_TYPE_NOTIFY_RISCV_TO_AUX = 24, + DH_EVENT_TYPE_NOTIFY_RISC_EXT_PPS = 25, + DH_EVENT_TYPE_NOTIFY_RISC_LOCAL_PPS = 26, + DH_EVENT_TYPE_MAX = 100, +}; + +/* eq core */ +struct dh_eq { + struct dh_core_dev *dev; + __be32 __iomem *doorbell; + uint32_t cons_index; + struct dh_irq *irq; /* interrupt core */ +}; + +/* asynchronous interrupt */ +struct dh_eq_async { + struct dh_eq core; + struct notifier_block irq_nb; /* interrupt: notification chain related to the event queue*/ + void *priv; + spinlock_t lock; /* To avoid irq EQ handle races with resiliency flows */ +}; + +struct dh_eq_param { + int32_t nent; /* queue depth */ + enum dh_event_queue_type event_type; + struct dh_irq *irq; /* interrupt associated with the event queue*/ +}; + +/* event type in the event queue */ +struct dh_nb { + struct notifier_block nb; + int32_t event_type; +}; + +struct dh_irq_table; + +struct dh_eq_table { + struct atomic_notifier_head nh[DH_EVENT_TYPE_MAX]; + struct mutex lock; + struct dh_irq_table *irq_table; + void *priv; +}; + +struct dh_eq_vq { + struct dh_eq core; + struct notifier_block irq_nb; + void *para; +}; + +struct dh_eq_vqs { + struct dh_eq_vq vq_s; + struct list_head vqs; + struct list_head list; +}; + +#define DH_NB_INIT(name, handler, event) do { \ + (name)->nb.notifier_call = handler; \ + (name)->event_type = DH_EVENT_TYPE_##event; \ +} while (0) + +void dh_eq_table_cleanup(struct dh_core_dev *dev); +void dh_eq_table_init(struct dh_core_dev *dev, void *table_priv); +int32_t setup_async_eq(struct dh_core_dev *dev, struct dh_eq_async *eq, + struct dh_eq_param *param, notifier_fn_t dh_eq_async_int, const char *name, void *priv); +int32_t dh_inet6_addr_change_notifier_register(struct notifier_block *inet6_addr_change_notifier); +int32_t dh_inet6_addr_change_notifier_unregister(struct notifier_block *inet6_addr_change_notifier); +int32_t dh_eq_notifier_register(struct dh_eq_table *eqt, struct dh_nb *nb); +void dh_eq_disable(struct dh_core_dev *dev, struct dh_eq *eq, struct notifier_block *nb); +int32_t dh_eq_enable(struct dh_core_dev *dev, struct dh_eq *eq, struct notifier_block *nb); +int32_t dh_eq_notifier_unregister(struct dh_eq_table *eqt, struct dh_nb *nb); +uint16_t dh_eq_event_type_get(uint16_t event_id); + +typedef int32_t (*zxdh_callchain_cbk_t)(struct notifier_block *nb, unsigned long action, void *data); + +struct dh_vq_handler { + zxdh_callchain_cbk_t callback; + void *para; +}; + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/include/linux/dinghai/events.h b/src/net/include/linux/dinghai/events.h new file mode 100755 index 0000000..550fce8 --- /dev/null +++ b/src/net/include/linux/dinghai/events.h @@ -0,0 +1,35 @@ +#ifndef __ZXDH_EVENTS_H__ +#define __ZXDH_EVENTS_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +struct dh_event_nb { + struct dh_nb nb; + void *ctx; +}; + +struct dh_events { + struct dh_core_dev *dev; + struct workqueue_struct *wq; + int32_t evt_num; + struct dh_event_nb notifiers[0]; +}; + +void zxdh_events_work_enqueue(struct dh_core_dev *dev, struct work_struct *work); +void zxdh_events_cleanup(struct dh_core_dev *dev); + +#define dh_nb_cof(ptr, type, member) \ + (container_of(container_of(ptr, struct dh_nb, nb), type, member)) + + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/net/include/linux/dinghai/helper.h b/src/net/include/linux/dinghai/helper.h new file mode 100755 index 0000000..249cc4c --- /dev/null +++ b/src/net/include/linux/dinghai/helper.h @@ -0,0 +1,81 @@ +#ifndef DINGHAI_HELPER_H +#define DINGHAI_HELPER_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef HAVE_DEV_PRINTK_OPS +#include +#endif +#include +#include + +extern uint32_t dh_debug_mask; +#define dh_dbg(__dev, format, ...) \ + dev_dbg((__dev)->device, "%s:%d:(pid %d): " format, \ + __func__, __LINE__, current->pid, \ + ##__VA_ARGS__) + +#define dh_dbg_once(__dev, format, ...) \ + dev_dbg_once((__dev)->device, \ + "%s:%d:(pid %d): " format, \ + __func__, __LINE__, current->pid, \ + ##__VA_ARGS__) + +#define dh_dbg_mask(__dev, mask, format, ...) \ +do { \ + if ((mask) & dh_debug_mask) \ + dh_dbg(__dev, format, ##__VA_ARGS__); \ +} while (0) + +#define dh_err(__dev, format, ...) \ + dev_err((__dev)->device, "%s:%d:(pid %d): " format, \ + __func__, __LINE__, current->pid, \ + ##__VA_ARGS__) + +#define dh_err_rl(__dev, format, ...) \ + dev_err_ratelimited((__dev)->device, \ + "%s:%d:(pid %d): " format, \ + __func__, __LINE__, current->pid, \ + ##__VA_ARGS__) + +#define dh_warn(__dev, format, ...) \ + dev_warn((__dev)->device, "%s:%d:(pid %d): " format, \ + __func__, __LINE__, current->pid, \ + ##__VA_ARGS__) + +#define dh_warn_once(__dev, format, ...) \ + dev_warn_once((__dev)->device, "%s:%d:(pid %d): " format, \ + __func__, __LINE__, current->pid, \ + ##__VA_ARGS__) + +#define dh_warn_rl(__dev, format, ...) \ + dev_warn_ratelimited((__dev)->device, \ + "%s:%d:(pid %d): " format, \ + __func__, __LINE__, current->pid, \ + ##__VA_ARGS__) + +#define dh_info(__dev, format, ...) \ + dev_info((__dev)->device, format, ##__VA_ARGS__) + +#define dh_info_rl(__dev, format, ...) \ + dev_info_ratelimited((__dev)->device, \ + "%s:%d:(pid %d): " format, \ + __func__, __LINE__, current->pid, \ + ##__VA_ARGS__) + +enum { + ZXDH_PCI_DEV_IS_VF = 1 << 0, +}; + +static inline bool dh_core_is_sf(const struct dh_core_dev *dev) +{ + return dev->coredev_type == DH_COREDEV_SF; +} + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/net/include/linux/dinghai/kcompat.h b/src/net/include/linux/dinghai/kcompat.h new file mode 100644 index 0000000..5429625 --- /dev/null +++ b/src/net/include/linux/dinghai/kcompat.h @@ -0,0 +1,7333 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright(c) 2013 - 2021 Intel Corporation. */ + +#ifndef _KCOMPAT_H_ +#define _KCOMPAT_H_ + +#ifndef LINUX_VERSION_CODE +#include +#else +#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef GCC_VERSION +#define GCC_VERSION (__GNUC__ * 10000 \ + + __GNUC_MINOR__ * 100 \ + + __GNUC_PATCHLEVEL__) +#endif /* GCC_VERSION */ + +/* Backport macros for controlling GCC diagnostics */ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,18,0) ) + +/* Compilers before gcc-4.6 do not understand "#pragma GCC diagnostic push" */ +#if GCC_VERSION >= 40600 +#define __diag_str1(s) #s +#define __diag_str(s) __diag_str1(s) +#define __diag(s) _Pragma(__diag_str(GCC diagnostic s)) +#else +#define __diag(s) +#endif /* GCC_VERSION >= 4.6 */ +#define __diag_push() __diag(push) +#define __diag_pop() __diag(pop) +#endif /* LINUX_VERSION < 4.18.0 */ + +#ifndef NSEC_PER_MSEC +#define NSEC_PER_MSEC 1000000L +#endif +#include +/* UTS_RELEASE is in a different header starting in kernel 2.6.18 */ +#ifndef UTS_RELEASE +/* utsrelease.h changed locations in 2.6.33 */ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33) ) +#include +#else +#include +#endif +#endif + +/* NAPI enable/disable flags here */ +#define NAPI + +#ifdef DISABLE_NET_POLL_CONTROLLER +#undef CONFIG_NET_POLL_CONTROLLER +#endif + +/* generic boolean compatibility */ +#undef TRUE +#undef FALSE +#define TRUE true +#define FALSE false +#ifdef GCC_VERSION +#if ( GCC_VERSION < 3000 ) +#define _Bool char +#endif +#else +#define _Bool char +#endif + +#ifndef BIT +#define BIT(nr) (1UL << (nr)) +#endif + +#undef __always_unused +#define __always_unused __attribute__((__unused__)) + +#undef __maybe_unused +#define __maybe_unused __attribute__((__unused__)) + +/* kernels less than 2.4.14 don't have this */ +#ifndef ETH_P_8021Q +#define ETH_P_8021Q 0x8100 +#endif + +#ifndef module_param +#define module_param(v,t,p) MODULE_PARM(v, "i"); +#endif + +#ifndef DMA_64BIT_MASK +#define DMA_64BIT_MASK 0xffffffffffffffffULL +#endif + +#ifndef DMA_32BIT_MASK +#define DMA_32BIT_MASK 0x00000000ffffffffULL +#endif + +#ifndef PCI_CAP_ID_EXP +#define PCI_CAP_ID_EXP 0x10 +#endif + +#ifndef uninitialized_var +#define uninitialized_var(x) x = x +#endif + +#ifndef SET_NETDEV_DEV +#define SET_NETDEV_DEV(net, pdev) +#endif + +#if !defined(HAVE_FREE_NETDEV) && ( LINUX_VERSION_CODE < KERNEL_VERSION(3,1,0) ) +#define free_netdev(x) kfree(x) +#endif + +#ifdef HAVE_POLL_CONTROLLER +#define CONFIG_NET_POLL_CONTROLLER +#endif + +#ifndef SKB_DATAREF_SHIFT +/* if we do not have the infrastructure to detect if skb_header is cloned + just return false in all cases */ +#define skb_header_cloned(x) 0 +#endif + +#ifndef NETIF_F_GSO +#define gso_size tso_size +#define gso_segs tso_segs +#endif + +#ifndef NETIF_F_GRO +#define vlan_gro_receive(_napi, _vlgrp, _vlan, _skb) \ + vlan_hwaccel_receive_skb(_skb, _vlgrp, _vlan) +#define napi_gro_receive(_napi, _skb) netif_receive_skb(_skb) +#endif + +#ifndef NETIF_F_LRO +#define NETIF_F_LRO BIT(15) +#endif + +#ifndef NETIF_F_NTUPLE +#define NETIF_F_NTUPLE BIT(27) +#endif + +#ifndef NETIF_F_ALL_FCOE +#define NETIF_F_ALL_FCOE (NETIF_F_FCOE_CRC | NETIF_F_FCOE_MTU | \ + NETIF_F_FSO) +#endif + +#ifndef IPPROTO_SCTP +#define IPPROTO_SCTP 132 +#endif + +#ifndef IPPROTO_UDPLITE +#define IPPROTO_UDPLITE 136 +#endif + +#ifndef CHECKSUM_PARTIAL +#define CHECKSUM_PARTIAL CHECKSUM_HW +#define CHECKSUM_COMPLETE CHECKSUM_HW +#endif + +#ifndef unlikely +#define unlikely(_x) _x +#define likely(_x) _x +#endif + +#ifndef WARN_ON +#define WARN_ON(x) +#endif + +#ifndef PCI_DEVICE +#define PCI_DEVICE(vend,dev) \ + .vendor = (vend), .device = (dev), \ + .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID +#endif + +#ifndef node_online +#define node_online(node) ((node) == 0) +#endif + +// #ifndef cpu_online +// #define cpu_online(cpuid) test_bit((cpuid), &cpu_online_map) +// #endif + +#ifndef _LINUX_RANDOM_H +#include +#endif + +#ifndef BITS_PER_TYPE +#define BITS_PER_TYPE(type) (sizeof(type) * BITS_PER_BYTE) +#endif + +#ifndef BITS_TO_LONGS +#define BITS_TO_LONGS(bits) (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG) +#endif + +#ifndef DECLARE_BITMAP +#define DECLARE_BITMAP(name,bits) long name[BITS_TO_LONGS(bits)] +#endif + +#ifndef VLAN_HLEN +#define VLAN_HLEN 4 +#endif + +#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS +#if defined(__i386__) || defined(__x86_64__) +#define CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS +#endif +#endif + +/* taken from 2.6.24 definition in linux/kernel.h */ +#ifndef IS_ALIGNED +#define IS_ALIGNED(x,a) (((x) % ((typeof(x))(a))) == 0) +#endif + +#ifdef IS_ENABLED +#undef IS_ENABLED +#undef __ARG_PLACEHOLDER_1 +#undef config_enabled +#undef _config_enabled +#undef __config_enabled +#undef ___config_enabled +#endif + +#define __ARG_PLACEHOLDER_1 0, +#define config_enabled(cfg) _config_enabled(cfg) +#define _config_enabled(value) __config_enabled(__ARG_PLACEHOLDER_##value) +#define __config_enabled(arg1_or_junk) ___config_enabled(arg1_or_junk 1, 0) +#define ___config_enabled(__ignored, val, ...) val + +#define IS_ENABLED(option) \ + (config_enabled(option) || config_enabled(option##_MODULE)) + +#if !defined(NETIF_F_HW_VLAN_TX) && !defined(NETIF_F_HW_VLAN_CTAG_TX) +struct _kc_vlan_ethhdr { + unsigned char h_dest[ETH_ALEN]; + unsigned char h_source[ETH_ALEN]; + __be16 h_vlan_proto; + __be16 h_vlan_TCI; + __be16 h_vlan_encapsulated_proto; +}; +#define vlan_ethhdr _kc_vlan_ethhdr +struct _kc_vlan_hdr { + __be16 h_vlan_TCI; + __be16 h_vlan_encapsulated_proto; +}; +#define vlan_hdr _kc_vlan_hdr +#define vlan_tx_tag_present(_skb) 0 +#define vlan_tx_tag_get(_skb) 0 +#endif /* NETIF_F_HW_VLAN_TX && NETIF_F_HW_VLAN_CTAG_TX */ + +#ifndef VLAN_PRIO_SHIFT +#define VLAN_PRIO_SHIFT 13 +#endif + +#ifndef PCI_EXP_LNKSTA_CLS_2_5GB +#define PCI_EXP_LNKSTA_CLS_2_5GB 0x0001 +#endif + +#ifndef PCI_EXP_LNKSTA_CLS_5_0GB +#define PCI_EXP_LNKSTA_CLS_5_0GB 0x0002 +#endif + +#ifndef PCI_EXP_LNKSTA_CLS_8_0GB +#define PCI_EXP_LNKSTA_CLS_8_0GB 0x0003 +#endif + +#ifndef PCI_EXP_LNKSTA_NLW_X1 +#define PCI_EXP_LNKSTA_NLW_X1 0x0010 +#endif + +#ifndef PCI_EXP_LNKSTA_NLW_X2 +#define PCI_EXP_LNKSTA_NLW_X2 0x0020 +#endif + +#ifndef PCI_EXP_LNKSTA_NLW_X4 +#define PCI_EXP_LNKSTA_NLW_X4 0x0040 +#endif + +#ifndef PCI_EXP_LNKSTA_NLW_X8 +#define PCI_EXP_LNKSTA_NLW_X8 0x0080 +#endif + +#ifndef __GFP_COLD +#define __GFP_COLD 0 +#endif + +#ifndef __GFP_COMP +#define __GFP_COMP 0 +#endif + +#ifndef IP_OFFSET +#define IP_OFFSET 0x1FFF /* "Fragment Offset" part */ +#endif + +#ifndef ETH_GSTRING_LEN +#define ETH_GSTRING_LEN 32 +#endif + +#ifndef ETHTOOL_GSTATS +#define ETHTOOL_GSTATS 0x1d +#undef ethtool_drvinfo +#define ethtool_drvinfo k_ethtool_drvinfo +struct k_ethtool_drvinfo { + u32 cmd; + char driver[32]; + char version[32]; + char fw_version[32]; + char bus_info[32]; + char reserved1[32]; + char reserved2[16]; + u32 n_stats; + u32 testinfo_len; + u32 eedump_len; + u32 regdump_len; +}; + +struct ethtool_stats { + u32 cmd; + u32 n_stats; + u64 data[0]; +}; +#endif /* ETHTOOL_GSTATS */ + +#ifndef ETHTOOL_GSTRINGS +#define ETHTOOL_GSTRINGS 0x1b +enum ethtool_stringset { + ETH_SS_TEST = 0, + ETH_SS_STATS, +}; +struct ethtool_gstrings { + u32 cmd; /* ETHTOOL_GSTRINGS */ + u32 string_set; /* string set id e.c. ETH_SS_TEST, etc*/ + u32 len; /* number of strings in the string set */ + u8 data[0]; +}; +#endif /* ETHTOOL_GSTRINGS */ + +#ifndef ETHTOOL_TEST +#define ETHTOOL_TEST 0x1a +enum ethtool_test_flags { + ETH_TEST_FL_OFFLINE = BIT(0), + ETH_TEST_FL_FAILED = BIT(1), +}; +struct ethtool_test { + u32 cmd; + u32 flags; + u32 reserved; + u32 len; + u64 data[0]; +}; +#endif /* ETHTOOL_TEST */ + +#ifndef ETHTOOL_GEEPROM +#define ETHTOOL_GEEPROM 0xb +#undef ETHTOOL_GREGS +struct ethtool_eeprom { + u32 cmd; + u32 magic; + u32 offset; + u32 len; + u8 data[0]; +}; + +struct ethtool_value { + u32 cmd; + u32 data; +}; +#endif /* ETHTOOL_GEEPROM */ + +#ifndef ETHTOOL_GLINK +#define ETHTOOL_GLINK 0xa +#endif /* ETHTOOL_GLINK */ + +#ifndef ETHTOOL_GWOL +#define ETHTOOL_GWOL 0x5 +#define ETHTOOL_SWOL 0x6 +#define SOPASS_MAX 6 +struct ethtool_wolinfo { + u32 cmd; + u32 supported; + u32 wolopts; + u8 sopass[SOPASS_MAX]; /* SecureOn(tm) password */ +}; +#endif /* ETHTOOL_GWOL */ + +#ifndef ETHTOOL_GREGS +#define ETHTOOL_GREGS 0x00000004 /* Get NIC registers */ +#define ethtool_regs _kc_ethtool_regs +/* for passing big chunks of data */ +struct _kc_ethtool_regs { + u32 cmd; + u32 version; /* driver-specific, indicates different chips/revs */ + u32 len; /* bytes */ + u8 data[0]; +}; +#endif /* ETHTOOL_GREGS */ + +#ifndef ETHTOOL_GMSGLVL +#define ETHTOOL_GMSGLVL 0x00000007 /* Get driver message level */ +#endif +#ifndef ETHTOOL_SMSGLVL +#define ETHTOOL_SMSGLVL 0x00000008 /* Set driver msg level, priv. */ +#endif +#ifndef ETHTOOL_NWAY_RST +#define ETHTOOL_NWAY_RST 0x00000009 /* Restart autonegotiation, priv */ +#endif +#ifndef ETHTOOL_GLINK +#define ETHTOOL_GLINK 0x0000000a /* Get link status */ +#endif +#ifndef ETHTOOL_GEEPROM +#define ETHTOOL_GEEPROM 0x0000000b /* Get EEPROM data */ +#endif +#ifndef ETHTOOL_SEEPROM +#define ETHTOOL_SEEPROM 0x0000000c /* Set EEPROM data */ +#endif +#ifndef ETHTOOL_GCOALESCE +#define ETHTOOL_GCOALESCE 0x0000000e /* Get coalesce config */ + +#define ethtool_coalesce _kc_ethtool_coalesce +struct _kc_ethtool_coalesce { + u32 cmd; + + u32 rx_coalesce_usecs; + + u32 rx_max_coalesced_frames; + + u32 rx_coalesce_usecs_irq; + u32 rx_max_coalesced_frames_irq; + + u32 tx_coalesce_usecs; + + u32 tx_max_coalesced_frames; + + u32 tx_coalesce_usecs_irq; + u32 tx_max_coalesced_frames_irq; + + u32 stats_block_coalesce_usecs; + + u32 use_adaptive_rx_coalesce; + u32 use_adaptive_tx_coalesce; + + u32 pkt_rate_low; + u32 rx_coalesce_usecs_low; + u32 rx_max_coalesced_frames_low; + u32 tx_coalesce_usecs_low; + u32 tx_max_coalesced_frames_low; + + u32 pkt_rate_high; + u32 rx_coalesce_usecs_high; + u32 rx_max_coalesced_frames_high; + u32 tx_coalesce_usecs_high; + u32 tx_max_coalesced_frames_high; + + u32 rate_sample_interval; +}; +#endif /* ETHTOOL_GCOALESCE */ + +#ifndef ETHTOOL_SCOALESCE +#define ETHTOOL_SCOALESCE 0x0000000f /* Set coalesce config. */ +#endif +#ifndef ETHTOOL_GRINGPARAM +#define ETHTOOL_GRINGPARAM 0x00000010 /* Get ring parameters */ + +#define ethtool_ringparam _kc_ethtool_ringparam +struct _kc_ethtool_ringparam { + u32 cmd; + + u32 rx_max_pending; + u32 rx_mini_max_pending; + u32 rx_jumbo_max_pending; + u32 tx_max_pending; + + u32 rx_pending; + u32 rx_mini_pending; + u32 rx_jumbo_pending; + u32 tx_pending; +}; +#endif /* ETHTOOL_GRINGPARAM */ + +#ifndef ETHTOOL_SRINGPARAM +#define ETHTOOL_SRINGPARAM 0x00000011 /* Set ring parameters, priv. */ +#endif +#ifndef ETHTOOL_GPAUSEPARAM +#define ETHTOOL_GPAUSEPARAM 0x00000012 /* Get pause parameters */ + +#define ethtool_pauseparam _kc_ethtool_pauseparam +struct _kc_ethtool_pauseparam { + u32 cmd; + u32 autoneg; + u32 rx_pause; + u32 tx_pause; +}; +#endif /* ETHTOOL_GPAUSEPARAM */ + +#ifndef ETHTOOL_SPAUSEPARAM +#define ETHTOOL_SPAUSEPARAM 0x00000013 /* Set pause parameters. */ +#endif +#ifndef ETHTOOL_GRXCSUM +#define ETHTOOL_GRXCSUM 0x00000014 /* Get RX hw csum enable (ethtool_value) */ +#endif +#ifndef ETHTOOL_SRXCSUM +#define ETHTOOL_SRXCSUM 0x00000015 /* Set RX hw csum enable (ethtool_value) */ +#endif +#ifndef ETHTOOL_GTXCSUM +#define ETHTOOL_GTXCSUM 0x00000016 /* Get TX hw csum enable (ethtool_value) */ +#endif +#ifndef ETHTOOL_STXCSUM +#define ETHTOOL_STXCSUM 0x00000017 /* Set TX hw csum enable (ethtool_value) */ +#endif +#ifndef ETHTOOL_GSG +#define ETHTOOL_GSG 0x00000018 /* Get scatter-gather enable + * (ethtool_value) */ +#endif +#ifndef ETHTOOL_SSG +#define ETHTOOL_SSG 0x00000019 /* Set scatter-gather enable + * (ethtool_value). */ +#endif +#ifndef ETHTOOL_TEST +#define ETHTOOL_TEST 0x0000001a /* execute NIC self-test, priv. */ +#endif +#ifndef ETHTOOL_GSTRINGS +#define ETHTOOL_GSTRINGS 0x0000001b /* get specified string set */ +#endif +#ifndef ETHTOOL_GSTATS +#define ETHTOOL_GSTATS 0x0000001d /* get NIC-specific statistics */ +#endif +#ifndef ETHTOOL_GTSO +#define ETHTOOL_GTSO 0x0000001e /* Get TSO enable (ethtool_value) */ +#endif +#ifndef ETHTOOL_STSO +#define ETHTOOL_STSO 0x0000001f /* Set TSO enable (ethtool_value) */ +#endif + +#ifndef ETHTOOL_BUSINFO_LEN +#define ETHTOOL_BUSINFO_LEN 32 +#endif + +#ifndef WAKE_FILTER +#define WAKE_FILTER BIT(7) +#endif + +#ifndef SPEED_2500 +#define SPEED_2500 2500 +#endif +#ifndef SPEED_5000 +#define SPEED_5000 5000 +#endif +#ifndef SPEED_14000 +#define SPEED_14000 14000 +#endif +#ifndef SPEED_25000 +#define SPEED_25000 25000 +#endif +#ifndef SPEED_50000 +#define SPEED_50000 50000 +#endif +#ifndef SPEED_56000 +#define SPEED_56000 56000 +#endif +#ifndef SPEED_100000 +#define SPEED_100000 100000 +#endif + +#ifndef RHEL_RELEASE_VERSION +#define RHEL_RELEASE_VERSION(a,b) (((a) << 8) + (b)) +#endif +#ifndef AX_RELEASE_VERSION +#define AX_RELEASE_VERSION(a,b) (((a) << 8) + (b)) +#endif + +#ifndef AX_RELEASE_CODE +#define AX_RELEASE_CODE 0 +#endif + +#if (AX_RELEASE_CODE && AX_RELEASE_CODE == AX_RELEASE_VERSION(3,0)) +#define RHEL_RELEASE_CODE RHEL_RELEASE_VERSION(5,0) +#elif (AX_RELEASE_CODE && AX_RELEASE_CODE == AX_RELEASE_VERSION(3,1)) +#define RHEL_RELEASE_CODE RHEL_RELEASE_VERSION(5,1) +#elif (AX_RELEASE_CODE && AX_RELEASE_CODE == AX_RELEASE_VERSION(3,2)) +#define RHEL_RELEASE_CODE RHEL_RELEASE_VERSION(5,3) +#endif + +#ifndef RHEL_RELEASE_CODE +/* NOTE: RHEL_RELEASE_* introduced in RHEL4.5 */ +#define RHEL_RELEASE_CODE 0 +#endif + +/* RHEL 7 didn't backport the parameter change in + * create_singlethread_workqueue. + * If/when RH corrects this we will want to tighten up the version check. + */ +#if (RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,0)) +#undef create_singlethread_workqueue +#define create_singlethread_workqueue(name) \ + alloc_ordered_workqueue("%s", WQ_MEM_RECLAIM, name) +#endif + +/* Ubuntu Release ABI is the 4th digit of their kernel version. You can find + * it in /usr/src/linux/$(uname -r)/include/generated/utsrelease.h for new + * enough versions of Ubuntu. Otherwise you can simply see it in the output of + * uname as the 4th digit of the kernel. The UTS_UBUNTU_RELEASE_ABI is not in + * the linux-source package, but in the linux-headers package. It begins to + * appear in later releases of 14.04 and 14.10. + * + * Ex: + * + * $uname -r + * 3.13.0-45-generic + * ABI is 45 + * + * + * $uname -r + * 3.16.0-23-generic + * ABI is 23 + */ +#ifndef UTS_UBUNTU_RELEASE_ABI +#define UTS_UBUNTU_RELEASE_ABI 0 +#define UBUNTU_VERSION_CODE 0 +#else +/* Ubuntu does not provide actual release version macro, so we use the kernel + * version plus the ABI to generate a unique version code specific to Ubuntu. + * In addition, we mask the lower 8 bits of LINUX_VERSION_CODE in order to + * ignore differences in sublevel which are not important since we have the + * ABI value. Otherwise, it becomes impossible to correlate ABI to version for + * ordering checks. + */ +#define UBUNTU_VERSION_CODE (((~0xFF & LINUX_VERSION_CODE) << 8) + \ + UTS_UBUNTU_RELEASE_ABI) + +#if UTS_UBUNTU_RELEASE_ABI > 255 +#error UTS_UBUNTU_RELEASE_ABI is too large... +#endif /* UTS_UBUNTU_RELEASE_ABI > 255 */ + +#if ( LINUX_VERSION_CODE <= KERNEL_VERSION(3,0,0) ) +/* Our version code scheme does not make sense for non 3.x or newer kernels, + * and we have no support in kcompat for this scenario. Thus, treat this as a + * non-Ubuntu kernel. Possibly might be better to error here. + */ +#define UTS_UBUNTU_RELEASE_ABI 0 +#define UBUNTU_VERSION_CODE 0 +#endif + +#endif + +/* Note that the 3rd digit is always zero, and will be ignored. This is + * because Ubuntu kernels are based on x.y.0-ABI values, and while their linux + * version codes are 3 digit, this 3rd digit is superseded by the ABI value. + */ +#define UBUNTU_VERSION(a,b,c,d) ((KERNEL_VERSION(a,b,0) << 8) + (d)) + +/* SuSE version macros are the same as Linux kernel version macro */ +#ifndef SLE_VERSION +#define SLE_VERSION(a,b,c) KERNEL_VERSION(a,b,c) +#endif +#define SLE_LOCALVERSION(a,b,c) KERNEL_VERSION(a,b,c) +#ifdef CONFIG_SUSE_KERNEL +#if ( LINUX_VERSION_CODE == KERNEL_VERSION(2,6,27) ) +/* SLES11 GA is 2.6.27 based */ +#define SLE_VERSION_CODE SLE_VERSION(11,0,0) +#elif ( LINUX_VERSION_CODE == KERNEL_VERSION(2,6,32) ) +/* SLES11 SP1 is 2.6.32 based */ +#define SLE_VERSION_CODE SLE_VERSION(11,1,0) +#elif ( LINUX_VERSION_CODE == KERNEL_VERSION(3,0,13) ) +/* SLES11 SP2 GA is 3.0.13-0.27 */ +#define SLE_VERSION_CODE SLE_VERSION(11,2,0) +#elif ((LINUX_VERSION_CODE == KERNEL_VERSION(3,0,76))) +/* SLES11 SP3 GA is 3.0.76-0.11 */ +#define SLE_VERSION_CODE SLE_VERSION(11,3,0) +#elif (LINUX_VERSION_CODE == KERNEL_VERSION(3,0,101)) + #if (SLE_LOCALVERSION_CODE < SLE_LOCALVERSION(0,8,0)) + /* some SLES11sp2 update kernels up to 3.0.101-0.7.x */ + #define SLE_VERSION_CODE SLE_VERSION(11,2,0) + #elif (SLE_LOCALVERSION_CODE < SLE_LOCALVERSION(63,0,0)) + /* most SLES11sp3 update kernels */ + #define SLE_VERSION_CODE SLE_VERSION(11,3,0) + #else + /* SLES11 SP4 GA (3.0.101-63) and update kernels 3.0.101-63+ */ + #define SLE_VERSION_CODE SLE_VERSION(11,4,0) + #endif +#elif (LINUX_VERSION_CODE == KERNEL_VERSION(3,12,28)) +/* SLES12 GA is 3.12.28-4 + * kernel updates 3.12.xx-<33 through 52>[.yy] */ +#define SLE_VERSION_CODE SLE_VERSION(12,0,0) +#elif (LINUX_VERSION_CODE == KERNEL_VERSION(3,12,49)) +/* SLES12 SP1 GA is 3.12.49-11 + * updates 3.12.xx-60.yy where xx={51..} */ +#define SLE_VERSION_CODE SLE_VERSION(12,1,0) +#elif ((LINUX_VERSION_CODE >= KERNEL_VERSION(4,4,21) && \ + (LINUX_VERSION_CODE <= KERNEL_VERSION(4,4,59))) || \ + (LINUX_VERSION_CODE >= KERNEL_VERSION(4,4,74) && \ + LINUX_VERSION_CODE < KERNEL_VERSION(4,5,0) && \ + SLE_LOCALVERSION_CODE >= KERNEL_VERSION(92,0,0) && \ + SLE_LOCALVERSION_CODE < KERNEL_VERSION(93,0,0))) +/* SLES12 SP2 GA is 4.4.21-69. + * SLES12 SP2 updates before SLES12 SP3 are: 4.4.{21,38,49,59} + * SLES12 SP2 updates after SLES12 SP3 are: 4.4.{74,90,103,114,120} + * but they all use a SLE_LOCALVERSION_CODE matching 92.nn.y */ +#define SLE_VERSION_CODE SLE_VERSION(12,2,0) +#elif ((LINUX_VERSION_CODE == KERNEL_VERSION(4,4,73) || \ + LINUX_VERSION_CODE == KERNEL_VERSION(4,4,82) || \ + LINUX_VERSION_CODE == KERNEL_VERSION(4,4,92)) || \ + (LINUX_VERSION_CODE == KERNEL_VERSION(4,4,103) && \ + (SLE_LOCALVERSION_CODE == KERNEL_VERSION(6,33,0) || \ + SLE_LOCALVERSION_CODE == KERNEL_VERSION(6,38,0))) || \ + (LINUX_VERSION_CODE >= KERNEL_VERSION(4,4,114) && \ + LINUX_VERSION_CODE < KERNEL_VERSION(4,5,0) && \ + SLE_LOCALVERSION_CODE >= KERNEL_VERSION(94,0,0) && \ + SLE_LOCALVERSION_CODE < KERNEL_VERSION(95,0,0)) ) +/* SLES12 SP3 GM is 4.4.73-5 and update kernels are 4.4.82-6.3. + * SLES12 SP3 updates not conflicting with SP2 are: 4.4.{82,92} + * SLES12 SP3 updates conflicting with SP2 are: + * - 4.4.103-6.33.1, 4.4.103-6.38.1 + * - 4.4.{114,120}-94.nn.y */ +#define SLE_VERSION_CODE SLE_VERSION(12,3,0) +#elif (LINUX_VERSION_CODE == KERNEL_VERSION(4,12,14) && \ + (SLE_LOCALVERSION_CODE == KERNEL_VERSION(94,41,0) || \ + (SLE_LOCALVERSION_CODE >= KERNEL_VERSION(95,0,0) && \ + SLE_LOCALVERSION_CODE < KERNEL_VERSION(96,0,0)))) +/* SLES12 SP4 GM is 4.12.14-94.41 and update kernel is 4.12.14-95.x. */ +#define SLE_VERSION_CODE SLE_VERSION(12,4,0) +#elif (LINUX_VERSION_CODE == KERNEL_VERSION(4,12,14) && \ + (SLE_LOCALVERSION_CODE == KERNEL_VERSION(23,0,0) || \ + SLE_LOCALVERSION_CODE == KERNEL_VERSION(2,0,0) || \ + SLE_LOCALVERSION_CODE == KERNEL_VERSION(136,0,0) || \ + (SLE_LOCALVERSION_CODE >= KERNEL_VERSION(25,0,0) && \ + SLE_LOCALVERSION_CODE < KERNEL_VERSION(26,0,0)) || \ + (SLE_LOCALVERSION_CODE >= KERNEL_VERSION(150,0,0) && \ + SLE_LOCALVERSION_CODE < KERNEL_VERSION(151,0,0)))) +/* SLES15 Beta1 is 4.12.14-2 + * SLES15 GM is 4.12.14-23 and update kernel is 4.12.14-{25,136}, + * and 4.12.14-150.14. + */ +#define SLE_VERSION_CODE SLE_VERSION(15,0,0) +#elif (LINUX_VERSION_CODE == KERNEL_VERSION(4,12,14) && \ + SLE_LOCALVERSION_CODE >= KERNEL_VERSION(25,23,0)) +/* SLES15 SP1 Beta1 is 4.12.14-25.23 */ +#define SLE_VERSION_CODE SLE_VERSION(15,1,0) +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,13)) +/* SLES15 SP2 Beta1 is 5.3.13 */ +#define SLE_VERSION_CODE SLE_VERSION(15,2,0) + +/* new SLES kernels must be added here with >= based on kernel + * the idea is to order from newest to oldest and just catch all + * of them using the >= + */ +#endif /* LINUX_VERSION_CODE == KERNEL_VERSION(x,y,z) */ +#endif /* CONFIG_SUSE_KERNEL */ +#ifndef SLE_VERSION_CODE +#define SLE_VERSION_CODE 0 +#endif /* SLE_VERSION_CODE */ +#ifndef SLE_LOCALVERSION_CODE +#define SLE_LOCALVERSION_CODE 0 +#endif /* SLE_LOCALVERSION_CODE */ + +/* + * ADQ depends on __TC_MQPRIO_MODE_MAX and related kernel code + * added around 4.15. Some distributions (e.g. Oracle Linux 7.7) + * have done a partial back-port of that to their kernels based + * on older mainline kernels that did not include all the necessary + * kernel enablement to support ADQ. + * Undefine __TC_MQPRIO_MODE_MAX for all OSV distributions with + * kernels based on mainline kernels older than 4.15 except for + * RHEL, SLES and Ubuntu which are known to have good back-ports. + */ +#if (!RHEL_RELEASE_CODE && !SLE_VERSION_CODE && !UBUNTU_VERSION_CODE) + #if (LINUX_VERSION_CODE < KERNEL_VERSION(4,15,0)) + #undef __TC_MQPRIO_MODE_MAX + #endif /* LINUX_VERSION_CODE == KERNEL_VERSION(4,15,0) */ +#endif /* if (NOT RHEL && NOT SLES && NOT UBUNTU) */ + +#ifdef __KLOCWORK__ +/* The following are not compiled into the binary driver; they are here + * only to tune Klocwork scans to workaround false-positive issues. + */ +#ifdef ARRAY_SIZE +#undef ARRAY_SIZE +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#endif + +#define memcpy(dest, src, len) memcpy_s(dest, len, src, len) +#define memset(dest, ch, len) memset_s(dest, len, ch, len) + +static inline int _kc_test_and_clear_bit(int nr, volatile unsigned long *addr) +{ + unsigned long mask = BIT_MASK(nr); + unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); + unsigned long old; + unsigned long flags = 0; + + _atomic_spin_lock_irqsave(p, flags); + old = *p; + *p = old & ~mask; + _atomic_spin_unlock_irqrestore(p, flags); + + return (old & mask) != 0; +} +#define test_and_clear_bit(nr, addr) _kc_test_and_clear_bit(nr, addr) + +static inline int _kc_test_and_set_bit(int nr, volatile unsigned long *addr) +{ + unsigned long mask = BIT_MASK(nr); + unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); + unsigned long old; + unsigned long flags = 0; + + _atomic_spin_lock_irqsave(p, flags); + old = *p; + *p = old | mask; + _atomic_spin_unlock_irqrestore(p, flags); + + return (old & mask) != 0; +} +#define test_and_set_bit(nr, addr) _kc_test_and_set_bit(nr, addr) + +#ifdef CONFIG_DYNAMIC_DEBUG +#undef dev_dbg +#define dev_dbg(dev, format, arg...) dev_printk(KERN_DEBUG, dev, format, ##arg) +#undef pr_debug +#define pr_debug(format, arg...) printk(KERN_DEBUG format, ##arg) +#endif /* CONFIG_DYNAMIC_DEBUG */ + +#undef hlist_for_each_entry_safe +#define hlist_for_each_entry_safe(pos, n, head, member) \ + for (n = NULL, pos = hlist_entry_safe((head)->first, typeof(*(pos)), \ + member); \ + pos; \ + pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member)) + +#ifdef uninitialized_var +#undef uninitialized_var +#define uninitialized_var(x) x = *(&(x)) +#endif + +#ifdef WRITE_ONCE +#undef WRITE_ONCE +#define WRITE_ONCE(x, val) ((x) = (val)) +#endif /* WRITE_ONCE */ +#endif /* __KLOCWORK__ */ + +#include "kcompat_vfd.h" +struct vfd_objects *create_vfd_sysfs(struct pci_dev *pdev, int num_alloc_vfs); +void destroy_vfd_sysfs(struct pci_dev *pdev, struct vfd_objects *vfd_obj); + +/* Older versions of GCC will trigger -Wformat-nonliteral warnings for const + * char * strings. Unfortunately, the implementation of do_trace_printk does + * this, in order to add a storage attribute to the memory. This was fixed in + * GCC 5.1, but we still use older distributions built with GCC 4.x. + * + * The string pointer is only passed as a const char * to the __trace_bprintk + * function. Since that function has the __printf attribute, it will trigger + * the warnings. We can't remove the attribute, so instead we'll use the + * __diag macro to disable -Wformat-nonliteral around the call to + * __trace_bprintk. + */ +#if GCC_VERSION < 50100 +#define __trace_bprintk(ip, fmt, args...) ({ \ + int err; \ + __diag_push(); \ + __diag(ignored "-Wformat-nonliteral"); \ + err = __trace_bprintk(ip, fmt, ##args); \ + __diag_pop(); \ + err; \ +}) +#endif /* GCC_VERSION < 5.1.0 */ + +/* Newer kernels removed */ +#if ((LINUX_VERSION_CODE < KERNEL_VERSION(5,4,0)) && \ + (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(8,3))) +#define HAVE_PCI_ASPM_H +#endif + +/*****************************************************************************/ +/* 2.4.3 => 2.4.0 */ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,3) ) + +/**************************************/ +/* PCI DRIVER API */ + +#ifndef pci_set_dma_mask +#define pci_set_dma_mask _kc_pci_set_dma_mask +int _kc_pci_set_dma_mask(struct pci_dev *dev, dma_addr_t mask); +#endif + +#ifndef pci_request_regions +#define pci_request_regions _kc_pci_request_regions +int _kc_pci_request_regions(struct pci_dev *pdev, char *res_name); +#endif + +#ifndef pci_release_regions +#define pci_release_regions _kc_pci_release_regions +void _kc_pci_release_regions(struct pci_dev *pdev); +#endif + +/**************************************/ +/* NETWORK DRIVER API */ + +#ifndef alloc_etherdev +#define alloc_etherdev _kc_alloc_etherdev +struct net_device * _kc_alloc_etherdev(int sizeof_priv); +#endif + +#ifndef is_valid_ether_addr +#define is_valid_ether_addr _kc_is_valid_ether_addr +int _kc_is_valid_ether_addr(u8 *addr); +#endif + +/**************************************/ +#ifndef INIT_TQUEUE +#define INIT_TQUEUE(_tq, _routine, _data) \ + do { \ + INIT_LIST_HEAD(&(_tq)->list); \ + (_tq)->sync = 0; \ + (_tq)->routine = _routine; \ + (_tq)->data = _data; \ + } while (0) +#endif + +#endif /* 2.4.3 => 2.4.0 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,5) ) +/* Generic MII registers. */ +#define MII_BMCR 0x00 /* Basic mode control register */ +#define MII_BMSR 0x01 /* Basic mode status register */ +#define MII_PHYSID1 0x02 /* PHYS ID 1 */ +#define MII_PHYSID2 0x03 /* PHYS ID 2 */ +#define MII_ADVERTISE 0x04 /* Advertisement control reg */ +#define MII_LPA 0x05 /* Link partner ability reg */ +#define MII_EXPANSION 0x06 /* Expansion register */ +/* Basic mode control register. */ +#define BMCR_FULLDPLX 0x0100 /* Full duplex */ +#define BMCR_ANENABLE 0x1000 /* Enable auto negotiation */ +/* Basic mode status register. */ +#define BMSR_ERCAP 0x0001 /* Ext-reg capability */ +#define BMSR_ANEGCAPABLE 0x0008 /* Able to do auto-negotiation */ +#define BMSR_10HALF 0x0800 /* Can do 10mbps, half-duplex */ +#define BMSR_10FULL 0x1000 /* Can do 10mbps, full-duplex */ +#define BMSR_100HALF 0x2000 /* Can do 100mbps, half-duplex */ +#define BMSR_100FULL 0x4000 /* Can do 100mbps, full-duplex */ +/* Advertisement control register. */ +#define ADVERTISE_CSMA 0x0001 /* Only selector supported */ +#define ADVERTISE_10HALF 0x0020 /* Try for 10mbps half-duplex */ +#define ADVERTISE_10FULL 0x0040 /* Try for 10mbps full-duplex */ +#define ADVERTISE_100HALF 0x0080 /* Try for 100mbps half-duplex */ +#define ADVERTISE_100FULL 0x0100 /* Try for 100mbps full-duplex */ +#define ADVERTISE_ALL (ADVERTISE_10HALF | ADVERTISE_10FULL | \ + ADVERTISE_100HALF | ADVERTISE_100FULL) +/* Expansion register for auto-negotiation. */ +#define EXPANSION_ENABLENPAGE 0x0004 /* This enables npage words */ +#endif + +/*****************************************************************************/ +/* 2.4.6 => 2.4.3 */ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,6) ) + +#ifndef pci_set_power_state +#define pci_set_power_state _kc_pci_set_power_state +int _kc_pci_set_power_state(struct pci_dev *dev, int state); +#endif + +#ifndef pci_enable_wake +#define pci_enable_wake _kc_pci_enable_wake +int _kc_pci_enable_wake(struct pci_dev *pdev, u32 state, int enable); +#endif + +#ifndef pci_disable_device +#define pci_disable_device _kc_pci_disable_device +void _kc_pci_disable_device(struct pci_dev *pdev); +#endif + +/* PCI PM entry point syntax changed, so don't support suspend/resume */ +#undef CONFIG_PM + +#endif /* 2.4.6 => 2.4.3 */ + +/*****************************************************************************/ +/* 2.4.10 => 2.4.9 */ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,10) ) + +/**************************************/ +/* MODULE API */ + +#ifndef MODULE_LICENSE + #define MODULE_LICENSE(X) +#endif + +/**************************************/ +/* OTHER */ + +#undef min +#define min(x,y) ({ \ + const typeof(x) _x = (x); \ + const typeof(y) _y = (y); \ + (void) (&_x == &_y); \ + _x < _y ? _x : _y; }) + +#undef max +#define max(x,y) ({ \ + const typeof(x) _x = (x); \ + const typeof(y) _y = (y); \ + (void) (&_x == &_y); \ + _x > _y ? _x : _y; }) + +#define min_t(type,x,y) ({ \ + type _x = (x); \ + type _y = (y); \ + _x < _y ? _x : _y; }) + +#define max_t(type,x,y) ({ \ + type _x = (x); \ + type _y = (y); \ + _x > _y ? _x : _y; }) + +#ifndef list_for_each_safe +#define list_for_each_safe(pos, n, head) \ + for (pos = (head)->next, n = pos->next; pos != (head); \ + pos = n, n = pos->next) +#endif + +#ifndef ____cacheline_aligned_in_smp +#ifdef CONFIG_SMP +#define ____cacheline_aligned_in_smp ____cacheline_aligned +#else +#define ____cacheline_aligned_in_smp +#endif /* CONFIG_SMP */ +#endif + +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,8) ) +int _kc_snprintf(char * buf, size_t size, const char *fmt, ...); +#define snprintf(buf, size, fmt, args...) _kc_snprintf(buf, size, fmt, ##args) +int _kc_vsnprintf(char *buf, size_t size, const char *fmt, va_list args); +#define vsnprintf(buf, size, fmt, args) _kc_vsnprintf(buf, size, fmt, args) +#else /* 2.4.8 => 2.4.9 */ +int snprintf(char * buf, size_t size, const char *fmt, ...); +int vsnprintf(char *buf, size_t size, const char *fmt, va_list args); +#endif +#endif /* 2.4.10 -> 2.4.6 */ + + +/*****************************************************************************/ +/* 2.4.12 => 2.4.10 */ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,12) ) +#ifndef HAVE_NETIF_MSG +#define HAVE_NETIF_MSG 1 +enum { + NETIF_MSG_DRV = 0x0001, + NETIF_MSG_PROBE = 0x0002, + NETIF_MSG_LINK = 0x0004, + NETIF_MSG_TIMER = 0x0008, + NETIF_MSG_IFDOWN = 0x0010, + NETIF_MSG_IFUP = 0x0020, + NETIF_MSG_RX_ERR = 0x0040, + NETIF_MSG_TX_ERR = 0x0080, + NETIF_MSG_TX_QUEUED = 0x0100, + NETIF_MSG_INTR = 0x0200, + NETIF_MSG_TX_DONE = 0x0400, + NETIF_MSG_RX_STATUS = 0x0800, + NETIF_MSG_PKTDATA = 0x1000, + NETIF_MSG_HW = 0x2000, + NETIF_MSG_WOL = 0x4000, +}; + +#define netif_msg_drv(p) ((p)->msg_enable & NETIF_MSG_DRV) +#define netif_msg_probe(p) ((p)->msg_enable & NETIF_MSG_PROBE) +#define netif_msg_link(p) ((p)->msg_enable & NETIF_MSG_LINK) +#define netif_msg_timer(p) ((p)->msg_enable & NETIF_MSG_TIMER) +#define netif_msg_ifdown(p) ((p)->msg_enable & NETIF_MSG_IFDOWN) +#define netif_msg_ifup(p) ((p)->msg_enable & NETIF_MSG_IFUP) +#define netif_msg_rx_err(p) ((p)->msg_enable & NETIF_MSG_RX_ERR) +#define netif_msg_tx_err(p) ((p)->msg_enable & NETIF_MSG_TX_ERR) +#define netif_msg_tx_queued(p) ((p)->msg_enable & NETIF_MSG_TX_QUEUED) +#define netif_msg_intr(p) ((p)->msg_enable & NETIF_MSG_INTR) +#define netif_msg_tx_done(p) ((p)->msg_enable & NETIF_MSG_TX_DONE) +#define netif_msg_rx_status(p) ((p)->msg_enable & NETIF_MSG_RX_STATUS) +#define netif_msg_pktdata(p) ((p)->msg_enable & NETIF_MSG_PKTDATA) +#endif /* !HAVE_NETIF_MSG */ +#endif /* 2.4.12 => 2.4.10 */ + +/*****************************************************************************/ +/* 2.4.13 => 2.4.12 */ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,13) ) + +/**************************************/ +/* PCI DMA MAPPING */ + +#ifndef virt_to_page + #define virt_to_page(v) (mem_map + (virt_to_phys(v) >> PAGE_SHIFT)) +#endif + +#ifndef pci_map_page +#define pci_map_page _kc_pci_map_page +u64 _kc_pci_map_page(struct pci_dev *dev, struct page *page, unsigned long offset, size_t size, int direction); +#endif + +#ifndef pci_unmap_page +#define pci_unmap_page _kc_pci_unmap_page +void _kc_pci_unmap_page(struct pci_dev *dev, u64 dma_addr, size_t size, int direction); +#endif + +/* pci_set_dma_mask takes dma_addr_t, which is only 32-bits prior to 2.4.13 */ + +#undef DMA_32BIT_MASK +#define DMA_32BIT_MASK 0xffffffff +#undef DMA_64BIT_MASK +#define DMA_64BIT_MASK 0xffffffff + +/**************************************/ +/* OTHER */ + +#ifndef cpu_relax +#define cpu_relax() rep_nop() +#endif + +struct vlan_ethhdr { + unsigned char h_dest[ETH_ALEN]; + unsigned char h_source[ETH_ALEN]; + unsigned short h_vlan_proto; + unsigned short h_vlan_TCI; + unsigned short h_vlan_encapsulated_proto; +}; +#endif /* 2.4.13 => 2.4.12 */ + +/*****************************************************************************/ +/* 2.4.17 => 2.4.12 */ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,17) ) + +#ifndef __devexit_p + #define __devexit_p(x) &(x) +#endif + +#endif /* 2.4.17 => 2.4.13 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18) ) +#define NETIF_MSG_HW 0x2000 +#define NETIF_MSG_WOL 0x4000 + +#ifndef netif_msg_hw +#define netif_msg_hw(p) ((p)->msg_enable & NETIF_MSG_HW) +#endif +#ifndef netif_msg_wol +#define netif_msg_wol(p) ((p)->msg_enable & NETIF_MSG_WOL) +#endif +#endif /* 2.4.18 */ + +/*****************************************************************************/ + +/*****************************************************************************/ +/* 2.4.20 => 2.4.19 */ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,20) ) + +/* we won't support NAPI on less than 2.4.20 */ +#ifdef NAPI +#undef NAPI +#endif + +#endif /* 2.4.20 => 2.4.19 */ + +/*****************************************************************************/ +/* 2.4.22 => 2.4.17 */ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,22) ) +#define pci_name(x) ((x)->slot_name) + +#ifndef SUPPORTED_10000baseT_Full +#define SUPPORTED_10000baseT_Full BIT(12) +#endif +#ifndef ADVERTISED_10000baseT_Full +#define ADVERTISED_10000baseT_Full BIT(12) +#endif +#endif + +/*****************************************************************************/ +/*****************************************************************************/ +/* 2.4.23 => 2.4.22 */ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23) ) +/*****************************************************************************/ +#ifdef NAPI +#ifndef netif_poll_disable +#define netif_poll_disable(x) _kc_netif_poll_disable(x) +static inline void _kc_netif_poll_disable(struct net_device *netdev) +{ + while (test_and_set_bit(__LINK_STATE_RX_SCHED, &netdev->state)) { + /* No hurry */ + current->state = TASK_INTERRUPTIBLE; + schedule_timeout(1); + } +} +#endif +#ifndef netif_poll_enable +#define netif_poll_enable(x) _kc_netif_poll_enable(x) +static inline void _kc_netif_poll_enable(struct net_device *netdev) +{ + clear_bit(__LINK_STATE_RX_SCHED, &netdev->state); +} +#endif +#endif /* NAPI */ +#ifndef netif_tx_disable +#define netif_tx_disable(x) _kc_netif_tx_disable(x) +static inline void _kc_netif_tx_disable(struct net_device *dev) +{ + spin_lock_bh(&dev->xmit_lock); + netif_stop_queue(dev); + spin_unlock_bh(&dev->xmit_lock); +} +#endif +#else /* 2.4.23 => 2.4.22 */ +#define HAVE_SCTP +#endif /* 2.4.23 => 2.4.22 */ + +/*****************************************************************************/ +/* 2.6.4 => 2.6.0 */ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,25) || \ + ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) && \ + LINUX_VERSION_CODE < KERNEL_VERSION(2,6,4) ) ) +#define ETHTOOL_OPS_COMPAT +#endif /* 2.6.4 => 2.6.0 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,27) ) +#define __user +#endif /* < 2.4.27 */ + +/*****************************************************************************/ +/* 2.5.71 => 2.4.x */ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,5,71) ) +#define sk_protocol protocol +#define pci_get_device pci_find_device +#endif /* 2.5.70 => 2.4.x */ + +/*****************************************************************************/ +/* < 2.4.27 or 2.6.0 <= 2.6.5 */ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,27) || \ + ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) && \ + LINUX_VERSION_CODE < KERNEL_VERSION(2,6,5) ) ) + +#ifndef netif_msg_init +#define netif_msg_init _kc_netif_msg_init +static inline u32 _kc_netif_msg_init(int debug_value, int default_msg_enable_bits) +{ + /* use default */ + if (debug_value < 0 || debug_value >= (sizeof(u32) * 8)) + return default_msg_enable_bits; + if (debug_value == 0) /* no output */ + return 0; + /* set low N bits */ + return (1 << debug_value) -1; +} +#endif + +#endif /* < 2.4.27 or 2.6.0 <= 2.6.5 */ +/*****************************************************************************/ +#if (( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,27) ) || \ + (( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) ) && \ + ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,3) ))) +#define netdev_priv(x) x->priv +#endif + +/*****************************************************************************/ +/* <= 2.5.0 */ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ) +#include +#undef pci_register_driver +#define pci_register_driver pci_module_init + +/* + * Most of the dma compat code is copied/modifed from the 2.4.37 + * /include/linux/libata-compat.h header file + */ +/* These definitions mirror those in pci.h, so they can be used + * interchangeably with their PCI_ counterparts */ +enum dma_data_direction { + DMA_BIDIRECTIONAL = 0, + DMA_TO_DEVICE = 1, + DMA_FROM_DEVICE = 2, + DMA_NONE = 3, +}; + +struct device { + struct pci_dev pdev; +}; + +static inline struct pci_dev *to_pci_dev (struct device *dev) +{ + return (struct pci_dev *) dev; +} +static inline struct device *pci_dev_to_dev(struct pci_dev *pdev) +{ + return (struct device *) pdev; +} +#define pdev_printk(lvl, pdev, fmt, args...) \ + printk("%s %s: " fmt, lvl, pci_name(pdev), ## args) +#define dev_err(dev, fmt, args...) \ + pdev_printk(KERN_ERR, to_pci_dev(dev), fmt, ## args) +#define dev_info(dev, fmt, args...) \ + pdev_printk(KERN_INFO, to_pci_dev(dev), fmt, ## args) +#define dev_warn(dev, fmt, args...) \ + pdev_printk(KERN_WARNING, to_pci_dev(dev), fmt, ## args) +#define dev_notice(dev, fmt, args...) \ + pdev_printk(KERN_NOTICE, to_pci_dev(dev), fmt, ## args) +#define dev_dbg(dev, fmt, args...) \ + pdev_printk(KERN_DEBUG, to_pci_dev(dev), fmt, ## args) + +/* NOTE: dangerous! we ignore the 'gfp' argument */ +#define dma_alloc_coherent(dev,sz,dma,gfp) \ + pci_alloc_consistent(to_pci_dev(dev),(sz),(dma)) +#define dma_free_coherent(dev,sz,addr,dma_addr) \ + pci_free_consistent(to_pci_dev(dev),(sz),(addr),(dma_addr)) + +#define dma_map_page(dev,a,b,c,d) \ + pci_map_page(to_pci_dev(dev),(a),(b),(c),(d)) +#define dma_unmap_page(dev,a,b,c) \ + pci_unmap_page(to_pci_dev(dev),(a),(b),(c)) + +#define dma_map_single(dev,a,b,c) \ + pci_map_single(to_pci_dev(dev),(a),(b),(c)) +#define dma_unmap_single(dev,a,b,c) \ + pci_unmap_single(to_pci_dev(dev),(a),(b),(c)) + +#define dma_map_sg(dev, sg, nents, dir) \ + pci_map_sg(to_pci_dev(dev), (sg), (nents), (dir) +#define dma_unmap_sg(dev, sg, nents, dir) \ + pci_unmap_sg(to_pci_dev(dev), (sg), (nents), (dir) + +#define dma_sync_single(dev,a,b,c) \ + pci_dma_sync_single(to_pci_dev(dev),(a),(b),(c)) + +/* for range just sync everything, that's all the pci API can do */ +#define dma_sync_single_range(dev,addr,off,sz,dir) \ + pci_dma_sync_single(to_pci_dev(dev),(addr),(off)+(sz),(dir)) + +#define dma_set_mask(dev,mask) \ + pci_set_dma_mask(to_pci_dev(dev),(mask)) + +/* hlist_* code - double linked lists */ +struct hlist_head { + struct hlist_node *first; +}; + +struct hlist_node { + struct hlist_node *next, **pprev; +}; + +static inline void __hlist_del(struct hlist_node *n) +{ + struct hlist_node *next = n->next; + struct hlist_node **pprev = n->pprev; + *pprev = next; + if (next) + next->pprev = pprev; +} + +static inline void hlist_del(struct hlist_node *n) +{ + __hlist_del(n); + n->next = NULL; + n->pprev = NULL; +} + +static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h) +{ + struct hlist_node *first = h->first; + n->next = first; + if (first) + first->pprev = &n->next; + h->first = n; + n->pprev = &h->first; +} + +static inline int hlist_empty(const struct hlist_head *h) +{ + return !h->first; +} +#define HLIST_HEAD_INIT { .first = NULL } +#define HLIST_HEAD(name) struct hlist_head name = { .first = NULL } +#define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL) +static inline void INIT_HLIST_NODE(struct hlist_node *h) +{ + h->next = NULL; + h->pprev = NULL; +} + +#ifndef might_sleep +#define might_sleep() +#endif +#else +static inline struct device *pci_dev_to_dev(struct pci_dev *pdev) +{ + return &pdev->dev; +} +#endif /* <= 2.5.0 */ + +/*****************************************************************************/ +/* 2.5.28 => 2.4.23 */ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,5,28) ) + +#include +#define work_struct tq_struct +#undef INIT_WORK +#define INIT_WORK(a,b) INIT_TQUEUE(a,(void (*)(void *))b,a) +#undef container_of +#define container_of list_entry +#define schedule_work schedule_task +#define flush_scheduled_work flush_scheduled_tasks +#define cancel_work_sync(x) flush_scheduled_work() + +#endif /* 2.5.28 => 2.4.17 */ + +/*****************************************************************************/ +/* 2.6.0 => 2.5.28 */ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) ) +#ifndef read_barrier_depends +#define read_barrier_depends() rmb() +#endif + +#ifndef rcu_head +struct __kc_callback_head { + struct __kc_callback_head *next; + void (*func)(struct callback_head *head); +}; +#define rcu_head __kc_callback_head +#endif + +#undef get_cpu +#define get_cpu() smp_processor_id() +#undef put_cpu +#define put_cpu() do { } while(0) +#define MODULE_INFO(version, _version) +#ifndef CONFIG_E1000_DISABLE_PACKET_SPLIT +#define CONFIG_E1000_DISABLE_PACKET_SPLIT 1 +#endif +#ifndef CONFIG_IGB_DISABLE_PACKET_SPLIT +#define CONFIG_IGB_DISABLE_PACKET_SPLIT 1 +#endif +#ifndef CONFIG_IGC_DISABLE_PACKET_SPLIT +#define CONFIG_IGC_DISABLE_PACKET_SPLIT 1 +#endif + +#define dma_set_coherent_mask(dev,mask) 1 + +#undef dev_put +#define dev_put(dev) __dev_put(dev) + +#ifndef skb_fill_page_desc +#define skb_fill_page_desc _kc_skb_fill_page_desc +void _kc_skb_fill_page_desc(struct sk_buff *skb, int i, struct page *page, int off, int size); +#endif + +#undef ALIGN +#define ALIGN(x,a) (((x)+(a)-1)&~((a)-1)) + +#ifndef page_count +#define page_count(p) atomic_read(&(p)->count) +#endif + +#ifdef MAX_NUMNODES +#undef MAX_NUMNODES +#endif +#define MAX_NUMNODES 1 + +/* find_first_bit and find_next bit are not defined for most + * 2.4 kernels (except for the redhat 2.4.21 kernels + */ +#include +#define BITOP_WORD(nr) ((nr) / BITS_PER_LONG) +#undef find_next_bit +#define find_next_bit _kc_find_next_bit +unsigned long _kc_find_next_bit(const unsigned long *addr, unsigned long size, + unsigned long offset); +#define find_first_bit(addr, size) find_next_bit((addr), (size), 0) + +#ifndef netdev_name +static inline const char *_kc_netdev_name(const struct net_device *dev) +{ + if (strchr(dev->name, '%')) + return "(unregistered net_device)"; + return dev->name; +} +#define netdev_name(netdev) _kc_netdev_name(netdev) +#endif /* netdev_name */ + +#ifndef strlcpy +#define strlcpy _kc_strlcpy +size_t _kc_strlcpy(char *dest, const char *src, size_t size); +#endif /* strlcpy */ + +#ifndef do_div +#if BITS_PER_LONG == 64 +# define do_div(n,base) ({ \ + uint32_t __base = (base); \ + uint32_t __rem; \ + __rem = ((uint64_t)(n)) % __base; \ + (n) = ((uint64_t)(n)) / __base; \ + __rem; \ + }) +#elif BITS_PER_LONG == 32 +uint32_t _kc__div64_32(uint64_t *dividend, uint32_t divisor); +# define do_div(n,base) ({ \ + uint32_t __base = (base); \ + uint32_t __rem; \ + if (likely(((n) >> 32) == 0)) { \ + __rem = (uint32_t)(n) % __base; \ + (n) = (uint32_t)(n) / __base; \ + } else \ + __rem = _kc__div64_32(&(n), __base); \ + __rem; \ + }) +#else /* BITS_PER_LONG == ?? */ +# error do_div() does not yet support the C64 +#endif /* BITS_PER_LONG */ +#endif /* do_div */ + +#ifndef NSEC_PER_SEC +#define NSEC_PER_SEC 1000000000L +#endif + +#undef HAVE_I2C_SUPPORT +#else /* 2.6.0 */ + +#endif /* 2.6.0 => 2.5.28 */ +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,3) ) +#define dma_pool pci_pool +#define dma_pool_destroy pci_pool_destroy +#define dma_pool_alloc pci_pool_alloc +#define dma_pool_free pci_pool_free + +#define dma_pool_create(name,dev,size,align,allocation) \ + pci_pool_create((name),to_pci_dev(dev),(size),(align),(allocation)) +#endif /* < 2.6.3 */ + +/*****************************************************************************/ +/* 2.6.4 => 2.6.0 */ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,4) ) +#define MODULE_VERSION(_version) MODULE_INFO(version, _version) +#endif /* 2.6.4 => 2.6.0 */ + +/*****************************************************************************/ +/* 2.6.5 => 2.6.0 */ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,5) ) +#define dma_sync_single_for_cpu dma_sync_single +#define dma_sync_single_for_device dma_sync_single +#define dma_sync_single_range_for_cpu dma_sync_single_range +#define dma_sync_single_range_for_device dma_sync_single_range +#ifndef pci_dma_mapping_error +#define pci_dma_mapping_error _kc_pci_dma_mapping_error +static inline int _kc_pci_dma_mapping_error(dma_addr_t dma_addr) +{ + return dma_addr == 0; +} +#endif +#endif /* 2.6.5 => 2.6.0 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,4) ) +int _kc_scnprintf(char * buf, size_t size, const char *fmt, ...); +#define scnprintf(buf, size, fmt, args...) _kc_scnprintf(buf, size, fmt, ##args) +#endif /* < 2.6.4 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,6) ) +/* taken from 2.6 include/linux/bitmap.h */ +#undef bitmap_zero +#define bitmap_zero _kc_bitmap_zero +static inline void _kc_bitmap_zero(unsigned long *dst, int nbits) +{ + if (nbits <= BITS_PER_LONG) + *dst = 0UL; + else { + int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long); + memset(dst, 0, len); + } +} +#define page_to_nid(x) 0 + +#endif /* < 2.6.6 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7) ) +#undef if_mii +#define if_mii _kc_if_mii +static inline struct mii_ioctl_data *_kc_if_mii(struct ifreq *rq) +{ + return (struct mii_ioctl_data *) &rq->ifr_ifru; +} + +#ifndef __force +#define __force +#endif +#endif /* < 2.6.7 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,8) ) +#ifndef PCI_EXP_DEVCTL +#define PCI_EXP_DEVCTL 8 +#endif +#ifndef PCI_EXP_DEVCTL_CERE +#define PCI_EXP_DEVCTL_CERE 0x0001 +#endif +#define PCI_EXP_FLAGS 2 /* Capabilities register */ +#define PCI_EXP_FLAGS_VERS 0x000f /* Capability version */ +#define PCI_EXP_FLAGS_TYPE 0x00f0 /* Device/Port type */ +#define PCI_EXP_TYPE_ENDPOINT 0x0 /* Express Endpoint */ +#define PCI_EXP_TYPE_LEG_END 0x1 /* Legacy Endpoint */ +#define PCI_EXP_TYPE_ROOT_PORT 0x4 /* Root Port */ +#define PCI_EXP_TYPE_DOWNSTREAM 0x6 /* Downstream Port */ +#define PCI_EXP_FLAGS_SLOT 0x0100 /* Slot implemented */ +#define PCI_EXP_DEVCAP 4 /* Device capabilities */ +#define PCI_EXP_DEVSTA 10 /* Device Status */ +#define msleep(x) do { set_current_state(TASK_UNINTERRUPTIBLE); \ + schedule_timeout((x * HZ)/1000 + 2); \ + } while (0) + +#endif /* < 2.6.8 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,9)) +#include +#define __iomem + +#ifndef kcalloc +#define kcalloc(n, size, flags) _kc_kzalloc(((n) * (size)), flags) +void *_kc_kzalloc(size_t size, int flags); +#endif +#define MSEC_PER_SEC 1000L +static inline unsigned int _kc_jiffies_to_msecs(const unsigned long j) +{ +#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ) + return (MSEC_PER_SEC / HZ) * j; +#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC) + return (j + (HZ / MSEC_PER_SEC) - 1)/(HZ / MSEC_PER_SEC); +#else + return (j * MSEC_PER_SEC) / HZ; +#endif +} +static inline unsigned long _kc_msecs_to_jiffies(const unsigned int m) +{ + if (m > _kc_jiffies_to_msecs(MAX_JIFFY_OFFSET)) + return MAX_JIFFY_OFFSET; +#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ) + return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ); +#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC) + return m * (HZ / MSEC_PER_SEC); +#else + return (m * HZ + MSEC_PER_SEC - 1) / MSEC_PER_SEC; +#endif +} + +#define msleep_interruptible _kc_msleep_interruptible +static inline unsigned long _kc_msleep_interruptible(unsigned int msecs) +{ + unsigned long timeout = _kc_msecs_to_jiffies(msecs) + 1; + + while (timeout && !signal_pending(current)) { + __set_current_state(TASK_INTERRUPTIBLE); + timeout = schedule_timeout(timeout); + } + return _kc_jiffies_to_msecs(timeout); +} + +/* Basic mode control register. */ +#define BMCR_SPEED1000 0x0040 /* MSB of Speed (1000) */ + +#ifndef __le16 +#define __le16 u16 +#endif +#ifndef __le32 +#define __le32 u32 +#endif +#ifndef __le64 +#define __le64 u64 +#endif +#ifndef __be16 +#define __be16 u16 +#endif +#ifndef __be32 +#define __be32 u32 +#endif +#ifndef __be64 +#define __be64 u64 +#endif + +static inline struct vlan_ethhdr *vlan_eth_hdr(const struct sk_buff *skb) +{ + return (struct vlan_ethhdr *)skb->mac.raw; +} + +/* Wake-On-Lan options. */ +#define WAKE_PHY BIT(0) +#define WAKE_UCAST BIT(1) +#define WAKE_MCAST BIT(2) +#define WAKE_BCAST BIT(3) +#define WAKE_ARP BIT(4) +#define WAKE_MAGIC BIT(5) +#define WAKE_MAGICSECURE BIT(6) /* only meaningful if WAKE_MAGIC */ + +#define skb_header_pointer _kc_skb_header_pointer +static inline void *_kc_skb_header_pointer(const struct sk_buff *skb, + int offset, int len, void *buffer) +{ + int hlen = skb_headlen(skb); + + if (hlen - offset >= len) + return skb->data + offset; + +#ifdef MAX_SKB_FRAGS + if (skb_copy_bits(skb, offset, buffer, len) < 0) + return NULL; + + return buffer; +#else + return NULL; +#endif + +#ifndef NETDEV_TX_OK +#define NETDEV_TX_OK 0 +#endif +#ifndef NETDEV_TX_BUSY +#define NETDEV_TX_BUSY 1 +#endif +#ifndef NETDEV_TX_LOCKED +#define NETDEV_TX_LOCKED -1 +#endif +} + +#ifndef __bitwise +#define __bitwise +#endif +#endif /* < 2.6.9 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10) ) +#ifdef module_param_array_named +#undef module_param_array_named +#define module_param_array_named(name, array, type, nump, perm) \ + static struct kparam_array __param_arr_##name \ + = { ARRAY_SIZE(array), nump, param_set_##type, param_get_##type, \ + sizeof(array[0]), array }; \ + module_param_call(name, param_array_set, param_array_get, \ + &__param_arr_##name, perm) +#endif /* module_param_array_named */ +/* + * num_online is broken for all < 2.6.10 kernels. This is needed to support + * Node module parameter of ixgbe. + */ +#undef num_online_nodes +#define num_online_nodes(n) 1 +extern DECLARE_BITMAP(_kcompat_node_online_map, MAX_NUMNODES); +#undef node_online_map +#define node_online_map _kcompat_node_online_map +#define pci_get_class pci_find_class +#endif /* < 2.6.10 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,11) ) +#define PCI_D0 0 +#define PCI_D1 1 +#define PCI_D2 2 +#define PCI_D3hot 3 +#define PCI_D3cold 4 +typedef int pci_power_t; +#define pci_choose_state(pdev,state) state +#define PMSG_SUSPEND 3 +#define PCI_EXP_LNKCTL 16 + +#undef NETIF_F_LLTX + +#ifndef ARCH_HAS_PREFETCH +#define prefetch(X) +#endif + +#ifndef NET_IP_ALIGN +#define NET_IP_ALIGN 2 +#endif + +#define KC_USEC_PER_SEC 1000000L +#define usecs_to_jiffies _kc_usecs_to_jiffies +static inline unsigned int _kc_jiffies_to_usecs(const unsigned long j) +{ +#if HZ <= KC_USEC_PER_SEC && !(KC_USEC_PER_SEC % HZ) + return (KC_USEC_PER_SEC / HZ) * j; +#elif HZ > KC_USEC_PER_SEC && !(HZ % KC_USEC_PER_SEC) + return (j + (HZ / KC_USEC_PER_SEC) - 1)/(HZ / KC_USEC_PER_SEC); +#else + return (j * KC_USEC_PER_SEC) / HZ; +#endif +} +static inline unsigned long _kc_usecs_to_jiffies(const unsigned int m) +{ + if (m > _kc_jiffies_to_usecs(MAX_JIFFY_OFFSET)) + return MAX_JIFFY_OFFSET; +#if HZ <= KC_USEC_PER_SEC && !(KC_USEC_PER_SEC % HZ) + return (m + (KC_USEC_PER_SEC / HZ) - 1) / (KC_USEC_PER_SEC / HZ); +#elif HZ > KC_USEC_PER_SEC && !(HZ % KC_USEC_PER_SEC) + return m * (HZ / KC_USEC_PER_SEC); +#else + return (m * HZ + KC_USEC_PER_SEC - 1) / KC_USEC_PER_SEC; +#endif +} + +#define PCI_EXP_LNKCAP 12 /* Link Capabilities */ +#define PCI_EXP_LNKSTA 18 /* Link Status */ +#define PCI_EXP_SLTCAP 20 /* Slot Capabilities */ +#define PCI_EXP_SLTCTL 24 /* Slot Control */ +#define PCI_EXP_SLTSTA 26 /* Slot Status */ +#define PCI_EXP_RTCTL 28 /* Root Control */ +#define PCI_EXP_RTCAP 30 /* Root Capabilities */ +#define PCI_EXP_RTSTA 32 /* Root Status */ +#endif /* < 2.6.11 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,12) ) +#include +#define USE_REBOOT_NOTIFIER + +/* Generic MII registers. */ +#define MII_CTRL1000 0x09 /* 1000BASE-T control */ +#define MII_STAT1000 0x0a /* 1000BASE-T status */ +/* Advertisement control register. */ +#define ADVERTISE_PAUSE_CAP 0x0400 /* Try for pause */ +#define ADVERTISE_PAUSE_ASYM 0x0800 /* Try for asymmetric pause */ +/* Link partner ability register. */ +#define LPA_PAUSE_CAP 0x0400 /* Can pause */ +#define LPA_PAUSE_ASYM 0x0800 /* Can pause asymetrically */ +/* 1000BASE-T Control register */ +#define ADVERTISE_1000FULL 0x0200 /* Advertise 1000BASE-T full duplex */ +#define ADVERTISE_1000HALF 0x0100 /* Advertise 1000BASE-T half duplex */ +/* 1000BASE-T Status register */ +#define LPA_1000LOCALRXOK 0x2000 /* Link partner local receiver status */ +#define LPA_1000REMRXOK 0x1000 /* Link partner remote receiver status */ + +#ifndef is_zero_ether_addr +#define is_zero_ether_addr _kc_is_zero_ether_addr +static inline int _kc_is_zero_ether_addr(const u8 *addr) +{ + return !(addr[0] | addr[1] | addr[2] | addr[3] | addr[4] | addr[5]); +} +#endif /* is_zero_ether_addr */ +#ifndef is_multicast_ether_addr +#define is_multicast_ether_addr _kc_is_multicast_ether_addr +static inline int _kc_is_multicast_ether_addr(const u8 *addr) +{ + return addr[0] & 0x01; +} +#endif /* is_multicast_ether_addr */ +#endif /* < 2.6.12 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13) ) +#ifndef kstrdup +#define kstrdup _kc_kstrdup +char *_kc_kstrdup(const char *s, unsigned int gfp); +#endif +#endif /* < 2.6.13 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14) ) +#define pm_message_t u32 +#ifndef kzalloc +#define kzalloc _kc_kzalloc +void *_kc_kzalloc(size_t size, int flags); +#endif + +/* Generic MII registers. */ +#define MII_ESTATUS 0x0f /* Extended Status */ +/* Basic mode status register. */ +#define BMSR_ESTATEN 0x0100 /* Extended Status in R15 */ +/* Extended status register. */ +#define ESTATUS_1000_TFULL 0x2000 /* Can do 1000BT Full */ +#define ESTATUS_1000_THALF 0x1000 /* Can do 1000BT Half */ + +#define SUPPORTED_Pause BIT(13) +#define SUPPORTED_Asym_Pause BIT(14) +#define ADVERTISED_Pause BIT(13) +#define ADVERTISED_Asym_Pause BIT(14) + +#if (!(RHEL_RELEASE_CODE && \ + (RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(4,3)) && \ + (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(5,0)))) +#if ((LINUX_VERSION_CODE == KERNEL_VERSION(2,6,9)) && !defined(gfp_t)) +#define gfp_t unsigned +#else +typedef unsigned gfp_t; +#endif +#endif /* !RHEL4.3->RHEL5.0 */ + +#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,9) ) +#ifdef CONFIG_X86_64 +#define dma_sync_single_range_for_cpu(dev, addr, off, sz, dir) \ + dma_sync_single_for_cpu((dev), (addr), (off) + (sz), (dir)) +#define dma_sync_single_range_for_device(dev, addr, off, sz, dir) \ + dma_sync_single_for_device((dev), (addr), (off) + (sz), (dir)) +#endif +#endif +#endif /* < 2.6.14 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15) ) +#ifndef kfree_rcu +/* this is placed here due to a lack of rcu_barrier in previous kernels */ +#define kfree_rcu(_ptr, _offset) kfree(_ptr) +#endif /* kfree_rcu */ +#ifndef vmalloc_node +#define vmalloc_node(a,b) vmalloc(a) +#endif /* vmalloc_node*/ + +#define setup_timer(_timer, _function, _data) \ +do { \ + (_timer)->function = _function; \ + (_timer)->data = _data; \ + init_timer(_timer); \ +} while (0) +#ifndef device_can_wakeup +#define device_can_wakeup(dev) (1) +#endif +#ifndef device_set_wakeup_enable +#define device_set_wakeup_enable(dev, val) do{}while(0) +#endif +#ifndef device_init_wakeup +#define device_init_wakeup(dev,val) do {} while (0) +#endif +static inline unsigned _kc_compare_ether_addr(const u8 *addr1, const u8 *addr2) +{ + const u16 *a = (const u16 *) addr1; + const u16 *b = (const u16 *) addr2; + + return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2])) != 0; +} +#undef compare_ether_addr +#define compare_ether_addr(addr1, addr2) _kc_compare_ether_addr(addr1, addr2) +#endif /* < 2.6.15 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16) ) +#undef DEFINE_MUTEX +#define DEFINE_MUTEX(x) DECLARE_MUTEX(x) +#define mutex_lock(x) down_interruptible(x) +#define mutex_unlock(x) up(x) + +#ifndef ____cacheline_internodealigned_in_smp +#ifdef CONFIG_SMP +#define ____cacheline_internodealigned_in_smp ____cacheline_aligned_in_smp +#else +#define ____cacheline_internodealigned_in_smp +#endif /* CONFIG_SMP */ +#endif /* ____cacheline_internodealigned_in_smp */ +#undef HAVE_PCI_ERS +#else /* 2.6.16 and above */ +#undef HAVE_PCI_ERS +#define HAVE_PCI_ERS +#if ( SLE_VERSION_CODE && SLE_VERSION_CODE == SLE_VERSION(10,4,0) ) +#ifdef device_can_wakeup +#undef device_can_wakeup +#endif /* device_can_wakeup */ +#define device_can_wakeup(dev) 1 +#endif /* SLE_VERSION(10,4,0) */ +#endif /* < 2.6.16 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17) ) +#ifndef dev_notice +#define dev_notice(dev, fmt, args...) \ + dev_printk(KERN_NOTICE, dev, fmt, ## args) +#endif + +#ifndef first_online_node +#define first_online_node 0 +#endif +#ifndef NET_SKB_PAD +#define NET_SKB_PAD 16 +#endif +#endif /* < 2.6.17 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) ) + +#ifndef IRQ_HANDLED +#define irqreturn_t void +#define IRQ_HANDLED +#define IRQ_NONE +#endif + +#ifndef IRQF_PROBE_SHARED +#ifdef SA_PROBEIRQ +#define IRQF_PROBE_SHARED SA_PROBEIRQ +#else +#define IRQF_PROBE_SHARED 0 +#endif +#endif + +#ifndef IRQF_SHARED +#define IRQF_SHARED SA_SHIRQ +#endif + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#endif + +#ifndef skb_is_gso +#ifdef NETIF_F_TSO +#define skb_is_gso _kc_skb_is_gso +static inline int _kc_skb_is_gso(const struct sk_buff *skb) +{ + return skb_shinfo(skb)->gso_size; +} +#else +#define skb_is_gso(a) 0 +#endif +#endif + +#ifndef resource_size_t +#define resource_size_t unsigned long +#endif + +#ifdef skb_pad +#undef skb_pad +#endif +#define skb_pad(x,y) _kc_skb_pad(x, y) +int _kc_skb_pad(struct sk_buff *skb, int pad); +#ifdef skb_padto +#undef skb_padto +#endif +#define skb_padto(x,y) _kc_skb_padto(x, y) +static inline int _kc_skb_padto(struct sk_buff *skb, unsigned int len) +{ + unsigned int size = skb->len; + if(likely(size >= len)) + return 0; + return _kc_skb_pad(skb, len - size); +} + +#ifndef DECLARE_PCI_UNMAP_ADDR +#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) \ + dma_addr_t ADDR_NAME +#define DECLARE_PCI_UNMAP_LEN(LEN_NAME) \ + u32 LEN_NAME +#define pci_unmap_addr(PTR, ADDR_NAME) \ + ((PTR)->ADDR_NAME) +#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) \ + (((PTR)->ADDR_NAME) = (VAL)) +#define pci_unmap_len(PTR, LEN_NAME) \ + ((PTR)->LEN_NAME) +#define pci_unmap_len_set(PTR, LEN_NAME, VAL) \ + (((PTR)->LEN_NAME) = (VAL)) +#endif /* DECLARE_PCI_UNMAP_ADDR */ +#endif /* < 2.6.18 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) ) +enum pcie_link_width { + PCIE_LNK_WIDTH_RESRV = 0x00, + PCIE_LNK_X1 = 0x01, + PCIE_LNK_X2 = 0x02, + PCIE_LNK_X4 = 0x04, + PCIE_LNK_X8 = 0x08, + PCIE_LNK_X12 = 0x0C, + PCIE_LNK_X16 = 0x10, + PCIE_LNK_X32 = 0x20, + PCIE_LNK_WIDTH_UNKNOWN = 0xFF, +}; + +#if (!(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(5,0))) +#define i_private u.generic_ip +#endif /* >= RHEL 5.0 */ + +#ifndef DIV_ROUND_UP +#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) +#endif +#ifndef __ALIGN_MASK +#define __ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask)) +#endif +#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) ) +#if (!((RHEL_RELEASE_CODE && \ + ((RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(4,4) && \ + RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(5,0)) || \ + (RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(5,0)))))) +typedef irqreturn_t (*irq_handler_t)(int, void*, struct pt_regs *); +#endif +#if (RHEL_RELEASE_CODE && RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(6,0)) +#undef CONFIG_INET_LRO +#undef CONFIG_INET_LRO_MODULE +#endif +typedef irqreturn_t (*new_handler_t)(int, void*); +static inline irqreturn_t _kc_request_irq(unsigned int irq, new_handler_t handler, unsigned long flags, const char *devname, void *dev_id) +#else /* 2.4.x */ +typedef void (*irq_handler_t)(int, void*, struct pt_regs *); +typedef void (*new_handler_t)(int, void*); +static inline int _kc_request_irq(unsigned int irq, new_handler_t handler, unsigned long flags, const char *devname, void *dev_id) +#endif /* >= 2.5.x */ +{ + irq_handler_t new_handler = (irq_handler_t) handler; + return request_irq(irq, new_handler, flags, devname, dev_id); +} + +#undef request_irq +#define request_irq(irq, handler, flags, devname, dev_id) _kc_request_irq((irq), (handler), (flags), (devname), (dev_id)) + +#define irq_handler_t new_handler_t + +#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,11) ) +#ifndef skb_checksum_help +static inline int __kc_skb_checksum_help(struct sk_buff *skb) +{ + return skb_checksum_help(skb, 0); +} +#define skb_checksum_help(skb) __kc_skb_checksum_help((skb)) +#endif +#endif /* < 2.6.19 && >= 2.6.11 */ + +/* pci_restore_state and pci_save_state handles MSI/PCIE from 2.6.19 */ +#if (!(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(5,4))) +#define PCIE_CONFIG_SPACE_LEN 256 +#define PCI_CONFIG_SPACE_LEN 64 +#define PCIE_LINK_STATUS 0x12 +#define pci_config_space_ich8lan() do {} while(0) +#undef pci_save_state +int _kc_pci_save_state(struct pci_dev *); +#define pci_save_state(pdev) _kc_pci_save_state(pdev) +#undef pci_restore_state +void _kc_pci_restore_state(struct pci_dev *); +#define pci_restore_state(pdev) _kc_pci_restore_state(pdev) +#endif /* !(RHEL_RELEASE_CODE >= RHEL 5.4) */ + +#ifdef HAVE_PCI_ERS +#undef free_netdev +void _kc_free_netdev(struct net_device *); +#define free_netdev(netdev) _kc_free_netdev(netdev) +#endif +static inline int pci_enable_pcie_error_reporting(struct pci_dev __always_unused *dev) +{ + return 0; +} +#define pci_disable_pcie_error_reporting(dev) do {} while (0) +#define pci_cleanup_aer_uncorrect_error_status(dev) do {} while (0) + +void *_kc_kmemdup(const void *src, size_t len, unsigned gfp); +#define kmemdup(src, len, gfp) _kc_kmemdup(src, len, gfp) +#ifndef bool +#define bool _Bool +#define true 1 +#define false 0 +#endif +#else /* 2.6.19 */ +#include +#include + +#define NEW_SKB_CSUM_HELP +#endif /* < 2.6.19 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) ) +#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,28) ) +#undef INIT_WORK +#define INIT_WORK(_work, _func) \ +do { \ + INIT_LIST_HEAD(&(_work)->entry); \ + (_work)->pending = 0; \ + (_work)->func = (void (*)(void *))_func; \ + (_work)->data = _work; \ + init_timer(&(_work)->timer); \ +} while (0) +#endif + +#ifndef PCI_VDEVICE +#define PCI_VDEVICE(ven, dev) \ + PCI_VENDOR_ID_##ven, (dev), \ + PCI_ANY_ID, PCI_ANY_ID, 0, 0 +#endif + +#ifndef PCI_VENDOR_ID_INTEL +#define PCI_VENDOR_ID_INTEL 0x8086 +#endif + +#ifndef round_jiffies +#define round_jiffies(x) x +#endif + +#define csum_offset csum + +#define HAVE_EARLY_VMALLOC_NODE +#define dev_to_node(dev) -1 +#undef set_dev_node +/* remove compiler warning with b=b, for unused variable */ +#define set_dev_node(a, b) do { (b) = (b); } while(0) + +#if (!(RHEL_RELEASE_CODE && \ + (((RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(4,7)) && \ + (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(5,0))) || \ + (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(5,6)))) && \ + !(SLE_VERSION_CODE && SLE_VERSION_CODE >= SLE_VERSION(10,2,0))) +typedef __u16 __bitwise __sum16; +typedef __u32 __bitwise __wsum; +#endif + +#if (!(RHEL_RELEASE_CODE && \ + (((RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(4,7)) && \ + (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(5,0))) || \ + (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(5,4)))) && \ + !(SLE_VERSION_CODE && SLE_VERSION_CODE >= SLE_VERSION(10,2,0))) +static inline __wsum csum_unfold(__sum16 n) +{ + return (__force __wsum)n; +} +#endif + +#else /* < 2.6.20 */ +#define HAVE_DEVICE_NUMA_NODE +#endif /* < 2.6.20 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21) ) +#define to_net_dev(class) container_of(class, struct net_device, class_dev) +#define NETDEV_CLASS_DEV +#if (!(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(5,5))) +#define vlan_group_get_device(vg, id) (vg->vlan_devices[id]) +#define vlan_group_set_device(vg, id, dev) \ + do { \ + if (vg) vg->vlan_devices[id] = dev; \ + } while (0) +#endif /* !(RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(5,5)) */ +#define pci_channel_offline(pdev) (pdev->error_state && \ + pdev->error_state != pci_channel_io_normal) +#define pci_request_selected_regions(pdev, bars, name) \ + pci_request_regions(pdev, name) +#define pci_release_selected_regions(pdev, bars) pci_release_regions(pdev); + +#ifndef __aligned +#define __aligned(x) __attribute__((aligned(x))) +#endif + +struct pci_dev *_kc_netdev_to_pdev(struct net_device *netdev); +#define netdev_to_dev(netdev) \ + pci_dev_to_dev(_kc_netdev_to_pdev(netdev)) +#define devm_kzalloc(dev, size, flags) kzalloc(size, flags) +#define devm_kfree(dev, p) kfree(p) +#else /* 2.6.21 */ +static inline struct device *netdev_to_dev(struct net_device *netdev) +{ + return &netdev->dev; +} + +#endif /* < 2.6.21 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22) ) +#define tcp_hdr(skb) (skb->h.th) +#define tcp_hdrlen(skb) (skb->h.th->doff << 2) +#define skb_transport_offset(skb) (skb->h.raw - skb->data) +#define skb_transport_header(skb) (skb->h.raw) +#define ipv6_hdr(skb) (skb->nh.ipv6h) +#define ip_hdr(skb) (skb->nh.iph) +#define skb_network_offset(skb) (skb->nh.raw - skb->data) +#define skb_network_header(skb) (skb->nh.raw) +#define skb_tail_pointer(skb) skb->tail +#define skb_reset_tail_pointer(skb) \ + do { \ + skb->tail = skb->data; \ + } while (0) +#define skb_set_tail_pointer(skb, offset) \ + do { \ + skb->tail = skb->data + offset; \ + } while (0) +#define skb_copy_to_linear_data(skb, from, len) \ + memcpy(skb->data, from, len) +#define skb_copy_to_linear_data_offset(skb, offset, from, len) \ + memcpy(skb->data + offset, from, len) +#define skb_network_header_len(skb) (skb->h.raw - skb->nh.raw) +#define pci_register_driver pci_module_init +#define skb_mac_header(skb) skb->mac.raw + +#ifdef NETIF_F_MULTI_QUEUE +#ifndef alloc_etherdev_mq +#define alloc_etherdev_mq(_a, _b) alloc_etherdev(_a) +#endif +#endif /* NETIF_F_MULTI_QUEUE */ + +#ifndef ETH_FCS_LEN +#define ETH_FCS_LEN 4 +#endif +#define cancel_work_sync(x) flush_scheduled_work() +#ifndef udp_hdr +#define udp_hdr _udp_hdr +static inline struct udphdr *_udp_hdr(const struct sk_buff *skb) +{ + return (struct udphdr *)skb_transport_header(skb); +} +#endif + +#ifdef cpu_to_be16 +#undef cpu_to_be16 +#endif +#define cpu_to_be16(x) __constant_htons(x) + +#if (!(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(5,1))) +enum { + DUMP_PREFIX_NONE, + DUMP_PREFIX_ADDRESS, + DUMP_PREFIX_OFFSET +}; +#endif /* !(RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(5,1)) */ +#ifndef hex_asc +#define hex_asc(x) "0123456789abcdef"[x] +#endif +#include +void _kc_print_hex_dump(const char *level, const char *prefix_str, + int prefix_type, int rowsize, int groupsize, + const void *buf, size_t len, bool ascii); +#define print_hex_dump(lvl, s, t, r, g, b, l, a) \ + _kc_print_hex_dump(lvl, s, t, r, g, b, l, a) +#ifndef ADVERTISED_2500baseX_Full +#define ADVERTISED_2500baseX_Full BIT(15) +#endif +#ifndef SUPPORTED_2500baseX_Full +#define SUPPORTED_2500baseX_Full BIT(15) +#endif + +#ifndef ETH_P_PAUSE +#define ETH_P_PAUSE 0x8808 +#endif + +static inline int compound_order(struct page *page) +{ + return 0; +} + +#define __must_be_array(a) 0 + +#ifndef SKB_WITH_OVERHEAD +#define SKB_WITH_OVERHEAD(X) \ + ((X) - SKB_DATA_ALIGN(sizeof(struct skb_shared_info))) +#endif +#else /* 2.6.22 */ +#define ETH_TYPE_TRANS_SETS_DEV +#define HAVE_NETDEV_STATS_IN_NETDEV +#endif /* < 2.6.22 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE > KERNEL_VERSION(2,6,22) ) +#endif /* > 2.6.22 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23) ) +#define netif_subqueue_stopped(_a, _b) 0 +#ifndef PTR_ALIGN +#define PTR_ALIGN(p, a) ((typeof(p))ALIGN((unsigned long)(p), (a))) +#endif + +#ifndef CONFIG_PM_SLEEP +#define CONFIG_PM_SLEEP CONFIG_PM +#endif + +#if ( LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13) ) +#define HAVE_ETHTOOL_GET_PERM_ADDR +#endif /* 2.6.14 through 2.6.22 */ + +static inline int __kc_skb_cow_head(struct sk_buff *skb, unsigned int headroom) +{ + int delta = 0; + + if (headroom > (skb->data - skb->head)) + delta = headroom - (skb->data - skb->head); + + if (delta || skb_header_cloned(skb)) + return pskb_expand_head(skb, ALIGN(delta, NET_SKB_PAD), 0, + GFP_ATOMIC); + return 0; +} +#define skb_cow_head(s, h) __kc_skb_cow_head((s), (h)) +#endif /* < 2.6.23 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) ) +#ifndef ETH_FLAG_LRO +#define ETH_FLAG_LRO NETIF_F_LRO +#endif + +#ifndef ACCESS_ONCE +#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x)) +#endif + +/* if GRO is supported then the napi struct must already exist */ +#ifndef NETIF_F_GRO +/* NAPI API changes in 2.6.24 break everything */ +struct napi_struct { + /* used to look up the real NAPI polling routine */ + int (*poll)(struct napi_struct *, int); + struct net_device *dev; + int weight; +}; +#endif + +#ifdef NAPI +int __kc_adapter_clean(struct net_device *, int *); +/* The following definitions are multi-queue aware, and thus we have a driver + * define list which determines which drivers support multiple queues, and + * thus need these stronger defines. If a driver does not support multi-queue + * functionality, you don't need to add it to this list. + */ +struct net_device *napi_to_poll_dev(const struct napi_struct *napi); + +static inline void __kc_mq_netif_napi_add(struct net_device *dev, struct napi_struct *napi, + int (*poll)(struct napi_struct *, int), int weight) +{ + struct net_device *poll_dev = napi_to_poll_dev(napi); + poll_dev->poll = __kc_adapter_clean; + poll_dev->priv = napi; + poll_dev->weight = weight; + set_bit(__LINK_STATE_RX_SCHED, &poll_dev->state); + set_bit(__LINK_STATE_START, &poll_dev->state); + dev_hold(poll_dev); + napi->poll = poll; + napi->weight = weight; + napi->dev = dev; +} +#define netif_napi_add __kc_mq_netif_napi_add + +static inline void __kc_mq_netif_napi_del(struct napi_struct *napi) +{ + struct net_device *poll_dev = napi_to_poll_dev(napi); + WARN_ON(!test_bit(__LINK_STATE_RX_SCHED, &poll_dev->state)); + dev_put(poll_dev); + memset(poll_dev, 0, sizeof(struct net_device)); +} + +#define netif_napi_del __kc_mq_netif_napi_del + +static inline bool __kc_mq_napi_schedule_prep(struct napi_struct *napi) +{ + return netif_running(napi->dev) && + netif_rx_schedule_prep(napi_to_poll_dev(napi)); +} +#define napi_schedule_prep __kc_mq_napi_schedule_prep + +static inline void __kc_mq_napi_schedule(struct napi_struct *napi) +{ + if (napi_schedule_prep(napi)) + __netif_rx_schedule(napi_to_poll_dev(napi)); +} +#define napi_schedule __kc_mq_napi_schedule + +#define napi_enable(_napi) netif_poll_enable(napi_to_poll_dev(_napi)) +#define napi_disable(_napi) netif_poll_disable(napi_to_poll_dev(_napi)) +#ifdef CONFIG_SMP +static inline void napi_synchronize(const struct napi_struct *n) +{ + struct net_device *dev = napi_to_poll_dev(n); + + while (test_bit(__LINK_STATE_RX_SCHED, &dev->state)) { + /* No hurry. */ + msleep(1); + } +} +#else +#define napi_synchronize(n) barrier() +#endif /* CONFIG_SMP */ +#define __napi_schedule(_napi) __netif_rx_schedule(napi_to_poll_dev(_napi)) +static inline void _kc_napi_complete(struct napi_struct *napi) +{ +#ifdef NETIF_F_GRO + napi_gro_flush(napi); +#endif + netif_rx_complete(napi_to_poll_dev(napi)); +} +#define napi_complete _kc_napi_complete +#else /* NAPI */ + +/* The following definitions are only used if we don't support NAPI at all. */ + +static inline __kc_netif_napi_add(struct net_device *dev, struct napi_struct *napi, + int (*poll)(struct napi_struct *, int), int weight) +{ + dev->poll = poll; + dev->weight = weight; + napi->poll = poll; + napi->weight = weight; + napi->dev = dev; +} +#define netif_napi_del(_a) do {} while (0) +#endif /* NAPI */ + +#undef dev_get_by_name +#define dev_get_by_name(_a, _b) dev_get_by_name(_b) +#define __netif_subqueue_stopped(_a, _b) netif_subqueue_stopped(_a, _b) +#ifndef DMA_BIT_MASK +#define DMA_BIT_MASK(n) (((n) == 64) ? DMA_64BIT_MASK : ((1ULL<<(n))-1)) +#endif + +#ifdef NETIF_F_TSO6 +#define skb_is_gso_v6 _kc_skb_is_gso_v6 +static inline int _kc_skb_is_gso_v6(const struct sk_buff *skb) +{ + return skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6; +} +#endif /* NETIF_F_TSO6 */ + +#ifndef KERN_CONT +#define KERN_CONT "" +#endif +#ifndef pr_err +#define pr_err(fmt, arg...) \ + printk(KERN_ERR fmt, ##arg) +#endif + +#ifndef rounddown_pow_of_two +#define rounddown_pow_of_two(n) \ + __builtin_constant_p(n) ? ( \ + (n == 1) ? 0 : \ + (1UL << ilog2(n))) : \ + (1UL << (fls_long(n) - 1)) +#endif + +#else /* < 2.6.24 */ +#define HAVE_ETHTOOL_GET_SSET_COUNT +#define HAVE_NETDEV_NAPI_LIST +#endif /* < 2.6.24 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24) ) +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0) ) +#define INCLUDE_PM_QOS_PARAMS_H +#include +#else /* >= 3.2.0 */ +#include +#endif /* else >= 3.2.0 */ +#endif /* > 2.6.24 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) ) +#define PM_QOS_CPU_DMA_LATENCY 1 + +#if ( LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18) ) +#include +#define PM_QOS_DEFAULT_VALUE INFINITE_LATENCY +#define pm_qos_add_requirement(pm_qos_class, name, value) \ + set_acceptable_latency(name, value) +#define pm_qos_remove_requirement(pm_qos_class, name) \ + remove_acceptable_latency(name) +#define pm_qos_update_requirement(pm_qos_class, name, value) \ + modify_acceptable_latency(name, value) +#else +#define PM_QOS_DEFAULT_VALUE -1 +#define pm_qos_add_requirement(pm_qos_class, name, value) +#define pm_qos_remove_requirement(pm_qos_class, name) +#define pm_qos_update_requirement(pm_qos_class, name, value) { \ + if (value != PM_QOS_DEFAULT_VALUE) { \ + printk(KERN_WARNING "%s: unable to set PM QoS requirement\n", \ + pci_name(adapter->pdev)); \ + } \ +} + +#endif /* > 2.6.18 */ + +#define pci_enable_device_mem(pdev) pci_enable_device(pdev) + +#ifndef DEFINE_PCI_DEVICE_TABLE +#define DEFINE_PCI_DEVICE_TABLE(_table) struct pci_device_id _table[] +#endif /* DEFINE_PCI_DEVICE_TABLE */ + +#ifndef strict_strtol +#define strict_strtol(s, b, r) _kc_strict_strtol(s, b, r) +static inline int _kc_strict_strtol(const char *buf, unsigned int base, long *res) +{ + /* adapted from strict_strtoul() in 2.6.25 */ + char *tail; + long val; + size_t len; + + *res = 0; + len = strlen(buf); + if (!len) + return -EINVAL; + val = simple_strtol(buf, &tail, base); + if (tail == buf) + return -EINVAL; + if ((*tail == '\0') || + ((len == (size_t)(tail - buf) + 1) && (*tail == '\n'))) { + *res = val; + return 0; + } + + return -EINVAL; +} +#endif + +#else /* < 2.6.25 */ + +#endif /* < 2.6.25 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) ) +#ifndef clamp_t +#define clamp_t(type, val, min, max) ({ \ + type __val = (val); \ + type __min = (min); \ + type __max = (max); \ + __val = __val < __min ? __min : __val; \ + __val > __max ? __max : __val; }) +#endif /* clamp_t */ +#undef kzalloc_node +#define kzalloc_node(_size, _flags, _node) kzalloc(_size, _flags) + +void _kc_pci_disable_link_state(struct pci_dev *dev, int state); +#define pci_disable_link_state(p, s) _kc_pci_disable_link_state(p, s) +#else /* < 2.6.26 */ +#define NETDEV_CAN_SET_GSO_MAX_SIZE +#ifdef HAVE_PCI_ASPM_H +#include +#endif +#define HAVE_NETDEV_VLAN_FEATURES +#ifndef PCI_EXP_LNKCAP_ASPMS +#define PCI_EXP_LNKCAP_ASPMS 0x00000c00 /* ASPM Support */ +#endif /* PCI_EXP_LNKCAP_ASPMS */ +#endif /* < 2.6.26 */ +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) ) +static inline void _kc_ethtool_cmd_speed_set(struct ethtool_cmd *ep, + __u32 speed) +{ + ep->speed = (__u16)speed; + /* ep->speed_hi = (__u16)(speed >> 16); */ +} +#define ethtool_cmd_speed_set _kc_ethtool_cmd_speed_set + +static inline __u32 _kc_ethtool_cmd_speed(struct ethtool_cmd *ep) +{ + /* no speed_hi before 2.6.27, and probably no need for it yet */ + return (__u32)ep->speed; +} +#define ethtool_cmd_speed _kc_ethtool_cmd_speed + +#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15) ) +#if ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) && defined(CONFIG_PM)) +#define ANCIENT_PM 1 +#elif ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)) && \ + (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) && \ + defined(CONFIG_PM_SLEEP)) +#define NEWER_PM 1 +#endif +#if defined(ANCIENT_PM) || defined(NEWER_PM) +#undef device_set_wakeup_enable +#define device_set_wakeup_enable(dev, val) \ + do { \ + u16 pmc = 0; \ + int pm = pci_find_capability(adapter->pdev, PCI_CAP_ID_PM); \ + if (pm) { \ + pci_read_config_word(adapter->pdev, pm + PCI_PM_PMC, \ + &pmc); \ + } \ + (dev)->power.can_wakeup = !!(pmc >> 11); \ + (dev)->power.should_wakeup = (val && (pmc >> 11)); \ + } while (0) +#endif /* 2.6.15-2.6.22 and CONFIG_PM or 2.6.23-2.6.25 and CONFIG_PM_SLEEP */ +#endif /* 2.6.15 through 2.6.27 */ +#ifndef netif_napi_del +#define netif_napi_del(_a) do {} while (0) +#ifdef NAPI +#ifdef CONFIG_NETPOLL +#undef netif_napi_del +#define netif_napi_del(_a) list_del(&(_a)->dev_list); +#endif +#endif +#endif /* netif_napi_del */ +#ifdef dma_mapping_error +#undef dma_mapping_error +#endif +#define dma_mapping_error(dev, dma_addr) pci_dma_mapping_error(dma_addr) + +#ifdef CONFIG_NETDEVICES_MULTIQUEUE +#define HAVE_TX_MQ +#endif + +#ifndef DMA_ATTR_WEAK_ORDERING +#define DMA_ATTR_WEAK_ORDERING 0 +#endif + +#ifdef HAVE_TX_MQ +void _kc_netif_tx_stop_all_queues(struct net_device *); +void _kc_netif_tx_wake_all_queues(struct net_device *); +void _kc_netif_tx_start_all_queues(struct net_device *); +#define netif_tx_stop_all_queues(a) _kc_netif_tx_stop_all_queues(a) +#define netif_tx_wake_all_queues(a) _kc_netif_tx_wake_all_queues(a) +#define netif_tx_start_all_queues(a) _kc_netif_tx_start_all_queues(a) +#undef netif_stop_subqueue +#define netif_stop_subqueue(_ndev,_qi) do { \ + if (netif_is_multiqueue((_ndev))) \ + netif_stop_subqueue((_ndev), (_qi)); \ + else \ + netif_stop_queue((_ndev)); \ + } while (0) +#undef netif_start_subqueue +#define netif_start_subqueue(_ndev,_qi) do { \ + if (netif_is_multiqueue((_ndev))) \ + netif_start_subqueue((_ndev), (_qi)); \ + else \ + netif_start_queue((_ndev)); \ + } while (0) +#else /* HAVE_TX_MQ */ +#define netif_tx_stop_all_queues(a) netif_stop_queue(a) +#define netif_tx_wake_all_queues(a) netif_wake_queue(a) +#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12) ) +#define netif_tx_start_all_queues(a) netif_start_queue(a) +#else +#define netif_tx_start_all_queues(a) do {} while (0) +#endif +#define netif_stop_subqueue(_ndev,_qi) netif_stop_queue((_ndev)) +#define netif_start_subqueue(_ndev,_qi) netif_start_queue((_ndev)) +#endif /* HAVE_TX_MQ */ +#ifndef NETIF_F_MULTI_QUEUE +#define NETIF_F_MULTI_QUEUE 0 +#define netif_is_multiqueue(a) 0 +#define netif_wake_subqueue(a, b) +#endif /* NETIF_F_MULTI_QUEUE */ + +#ifndef __WARN_printf +void __kc_warn_slowpath(const char *file, const int line, + const char *fmt, ...) __attribute__((format(printf, 3, 4))); +#define __WARN_printf(arg...) __kc_warn_slowpath(__FILE__, __LINE__, arg) +#endif /* __WARN_printf */ + +#ifndef WARN +#define WARN(condition, format...) ({ \ + int __ret_warn_on = !!(condition); \ + if (unlikely(__ret_warn_on)) \ + __WARN_printf(format); \ + unlikely(__ret_warn_on); \ +}) +#endif /* WARN */ +#undef HAVE_IXGBE_DEBUG_FS +#undef HAVE_IGB_DEBUG_FS +#define qdisc_reset_all_tx(a) +#else /* < 2.6.27 */ +#include +#define ethtool_cmd_speed_set _kc_ethtool_cmd_speed_set +static inline void _kc_ethtool_cmd_speed_set(struct ethtool_cmd *ep, + __u32 speed) +{ + ep->speed = (__u16)(speed & 0xFFFF); + ep->speed_hi = (__u16)(speed >> 16); +} +#define HAVE_TX_MQ +#define HAVE_NETDEV_SELECT_QUEUE +#ifdef CONFIG_DEBUG_FS +#define HAVE_IXGBE_DEBUG_FS +#define HAVE_IGB_DEBUG_FS +#endif /* CONFIG_DEBUG_FS */ +#endif /* < 2.6.27 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28) ) +#define pci_ioremap_bar(pdev, bar) ioremap(pci_resource_start(pdev, bar), \ + pci_resource_len(pdev, bar)) +#define pci_wake_from_d3 _kc_pci_wake_from_d3 +#define pci_prepare_to_sleep _kc_pci_prepare_to_sleep +int _kc_pci_wake_from_d3(struct pci_dev *dev, bool enable); +int _kc_pci_prepare_to_sleep(struct pci_dev *dev); +#define netdev_alloc_page(a) alloc_page(GFP_ATOMIC) +#ifndef __skb_queue_head_init +static inline void __kc_skb_queue_head_init(struct sk_buff_head *list) +{ + list->prev = list->next = (struct sk_buff *)list; + list->qlen = 0; +} +#define __skb_queue_head_init(_q) __kc_skb_queue_head_init(_q) +#endif + +#define PCI_EXP_DEVCAP2 36 /* Device Capabilities 2 */ +#define PCI_EXP_DEVCTL2 40 /* Device Control 2 */ + +#define PCI_EXP_DEVCAP_FLR 0x10000000 /* Function Level Reset */ +#define PCI_EXP_DEVCTL_BCR_FLR 0x8000 /* Bridge Configuration Retry / FLR */ + +#endif /* < 2.6.28 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) ) +#ifndef swap +#define swap(a, b) \ + do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0) +#endif +#define pci_request_selected_regions_exclusive(pdev, bars, name) \ + pci_request_selected_regions(pdev, bars, name) +#ifndef CONFIG_NR_CPUS +#define CONFIG_NR_CPUS 1 +#endif /* CONFIG_NR_CPUS */ +#ifndef pcie_aspm_enabled +#define pcie_aspm_enabled() (1) +#endif /* pcie_aspm_enabled */ + +#define PCI_EXP_SLTSTA_PDS 0x0040 /* Presence Detect State */ + +#ifndef PCI_EXP_LNKSTA_CLS +#define PCI_EXP_LNKSTA_CLS 0x000f /* Current Link Speed */ +#endif +#ifndef PCI_EXP_LNKSTA_NLW +#define PCI_EXP_LNKSTA_NLW 0x03f0 /* Negotiated Link Width */ +#endif + +#ifndef pci_clear_master +void _kc_pci_clear_master(struct pci_dev *dev); +#define pci_clear_master(dev) _kc_pci_clear_master(dev) +#endif + +#ifndef PCI_EXP_LNKCTL_ASPMC +#define PCI_EXP_LNKCTL_ASPMC 0x0003 /* ASPM Control */ +#endif + +#ifndef PCI_EXP_LNKCAP_MLW +#define PCI_EXP_LNKCAP_MLW 0x000003f0 /* Maximum Link Width */ +#endif + +#else /* < 2.6.29 */ +#ifndef HAVE_NET_DEVICE_OPS +#define HAVE_NET_DEVICE_OPS +#endif +#ifdef CONFIG_DCB +#define HAVE_PFC_MODE_ENABLE +#endif /* CONFIG_DCB */ +#endif /* < 2.6.29 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30) ) +#define NO_PTP_SUPPORT +#define skb_rx_queue_recorded(a) false +#define skb_get_rx_queue(a) 0 +#define skb_record_rx_queue(a, b) do {} while (0) +#define skb_tx_hash(n, s) ___kc_skb_tx_hash((n), (s), (n)->real_num_tx_queues) +#ifndef CONFIG_PCI_IOV +#undef pci_enable_sriov +#define pci_enable_sriov(a, b) -ENOTSUPP +#undef pci_disable_sriov +#define pci_disable_sriov(a) do {} while (0) +#endif /* CONFIG_PCI_IOV */ +#ifndef pr_cont +#define pr_cont(fmt, ...) \ + printk(KERN_CONT fmt, ##__VA_ARGS__) +#endif /* pr_cont */ +static inline void _kc_synchronize_irq(unsigned int a) +{ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,5,28) ) + synchronize_irq(); +#else /* < 2.5.28 */ + synchronize_irq(a); +#endif /* < 2.5.28 */ +} +#undef synchronize_irq +#define synchronize_irq(a) _kc_synchronize_irq(a) + +#define PCI_EXP_LNKCTL2 48 /* Link Control 2 */ + +#ifdef nr_cpus_node +#undef nr_cpus_node +#define nr_cpus_node(node) cpumask_weight(cpumask_of_node(node)) +#endif + +#if (RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(5,5)) +#define HAVE_PCI_DEV_IS_VIRTFN_BIT +#endif /* RHEL >= 5.5 */ + +#if (!(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(5,5))) +static inline bool pci_is_root_bus(struct pci_bus *pbus) +{ + return !(pbus->parent); +} +#endif + +#else /* < 2.6.30 */ +#define HAVE_ASPM_QUIRKS +#define HAVE_PCI_DEV_IS_VIRTFN_BIT +#endif /* < 2.6.30 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31) ) +#define ETH_P_1588 0x88F7 +#define ETH_P_FIP 0x8914 +#ifndef netdev_uc_count +#define netdev_uc_count(dev) ((dev)->uc_count) +#endif +#ifndef netdev_for_each_uc_addr +#define netdev_for_each_uc_addr(uclist, dev) \ + for (uclist = dev->uc_list; uclist; uclist = uclist->next) +#endif +#ifndef PORT_OTHER +#define PORT_OTHER 0xff +#endif +#ifndef MDIO_PHY_ID_PRTAD +#define MDIO_PHY_ID_PRTAD 0x03e0 +#endif +#ifndef MDIO_PHY_ID_DEVAD +#define MDIO_PHY_ID_DEVAD 0x001f +#endif +#ifndef skb_dst +#define skb_dst(s) ((s)->dst) +#endif + +#ifndef SUPPORTED_1000baseKX_Full +#define SUPPORTED_1000baseKX_Full BIT(17) +#endif +#ifndef SUPPORTED_10000baseKX4_Full +#define SUPPORTED_10000baseKX4_Full BIT(18) +#endif +#ifndef SUPPORTED_10000baseKR_Full +#define SUPPORTED_10000baseKR_Full BIT(19) +#endif + +#ifndef ADVERTISED_1000baseKX_Full +#define ADVERTISED_1000baseKX_Full BIT(17) +#endif +#ifndef ADVERTISED_10000baseKX4_Full +#define ADVERTISED_10000baseKX4_Full BIT(18) +#endif +#ifndef ADVERTISED_10000baseKR_Full +#define ADVERTISED_10000baseKR_Full BIT(19) +#endif + +static inline unsigned long dev_trans_start(struct net_device *dev) +{ + return dev->trans_start; +} +#else /* < 2.6.31 */ +#ifndef HAVE_NETDEV_STORAGE_ADDRESS +#define HAVE_NETDEV_STORAGE_ADDRESS +#endif +#ifndef HAVE_NETDEV_HW_ADDR +#define HAVE_NETDEV_HW_ADDR +#endif +#ifndef HAVE_TRANS_START_IN_QUEUE +#define HAVE_TRANS_START_IN_QUEUE +#endif +#ifndef HAVE_INCLUDE_LINUX_MDIO_H +#define HAVE_INCLUDE_LINUX_MDIO_H +#endif +#include +#endif /* < 2.6.31 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32) ) +#undef netdev_tx_t +#define netdev_tx_t int +#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) +#ifndef NETIF_F_FCOE_MTU +#define NETIF_F_FCOE_MTU BIT(26) +#endif +#endif /* CONFIG_FCOE || CONFIG_FCOE_MODULE */ + +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) ) +static inline int _kc_pm_runtime_get_sync() +{ + return 1; +} +#define pm_runtime_get_sync(dev) _kc_pm_runtime_get_sync() +#else /* 2.6.0 => 2.6.32 */ +static inline int _kc_pm_runtime_get_sync(struct device __always_unused *dev) +{ + return 1; +} +#ifndef pm_runtime_get_sync +#define pm_runtime_get_sync(dev) _kc_pm_runtime_get_sync(dev) +#endif +#endif /* 2.6.0 => 2.6.32 */ +#ifndef pm_runtime_put +#define pm_runtime_put(dev) do {} while (0) +#endif +#ifndef pm_runtime_put_sync +#define pm_runtime_put_sync(dev) do {} while (0) +#endif +#ifndef pm_runtime_resume +#define pm_runtime_resume(dev) do {} while (0) +#endif +#ifndef pm_schedule_suspend +#define pm_schedule_suspend(dev, t) do {} while (0) +#endif +#ifndef pm_runtime_set_suspended +#define pm_runtime_set_suspended(dev) do {} while (0) +#endif +#ifndef pm_runtime_disable +#define pm_runtime_disable(dev) do {} while (0) +#endif +#ifndef pm_runtime_put_noidle +#define pm_runtime_put_noidle(dev) do {} while (0) +#endif +#ifndef pm_runtime_set_active +#define pm_runtime_set_active(dev) do {} while (0) +#endif +#ifndef pm_runtime_enable +#define pm_runtime_enable(dev) do {} while (0) +#endif +#ifndef pm_runtime_get_noresume +#define pm_runtime_get_noresume(dev) do {} while (0) +#endif +#else /* < 2.6.32 */ +#if (RHEL_RELEASE_CODE && \ + (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,2)) && \ + (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(7,0))) +#define HAVE_RHEL6_NET_DEVICE_EXTENDED +#endif /* RHEL >= 6.2 && RHEL < 7.0 */ +#if (RHEL_RELEASE_CODE && \ + (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,6)) && \ + (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(7,0))) +#define HAVE_RHEL6_NET_DEVICE_OPS_EXT +#define HAVE_NDO_SET_FEATURES +#endif /* RHEL >= 6.6 && RHEL < 7.0 */ +#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) +#ifndef HAVE_NETDEV_OPS_FCOE_ENABLE +#define HAVE_NETDEV_OPS_FCOE_ENABLE +#endif +#endif /* CONFIG_FCOE || CONFIG_FCOE_MODULE */ +#ifdef CONFIG_DCB +#ifndef HAVE_DCBNL_OPS_GETAPP +#define HAVE_DCBNL_OPS_GETAPP +#endif +#endif /* CONFIG_DCB */ +#include +/* IOV bad DMA target work arounds require at least this kernel rev support */ +#define HAVE_PCIE_TYPE +#endif /* < 2.6.32 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33) ) +#ifndef pci_pcie_cap +#define pci_pcie_cap(pdev) pci_find_capability(pdev, PCI_CAP_ID_EXP) +#endif +#ifndef IPV4_FLOW +#define IPV4_FLOW 0x10 +#endif /* IPV4_FLOW */ +#ifndef IPV6_FLOW +#define IPV6_FLOW 0x11 +#endif /* IPV6_FLOW */ +/* Features back-ported to RHEL6 or SLES11 SP1 after 2.6.32 */ +#if ( (RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,0)) || \ + (SLE_VERSION_CODE && SLE_VERSION_CODE >= SLE_VERSION(11,1,0)) ) +#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) +#ifndef HAVE_NETDEV_OPS_FCOE_GETWWN +#define HAVE_NETDEV_OPS_FCOE_GETWWN +#endif +#endif /* CONFIG_FCOE || CONFIG_FCOE_MODULE */ +#endif /* RHEL6 or SLES11 SP1 */ +#ifndef __percpu +#define __percpu +#endif /* __percpu */ + +#ifndef PORT_DA +#define PORT_DA PORT_OTHER +#endif /* PORT_DA */ +#ifndef PORT_NONE +#define PORT_NONE PORT_OTHER +#endif + +#if ((RHEL_RELEASE_CODE && \ + (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,3)) && \ + (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(7,0)))) +#if !defined(CONFIG_X86_32) && !defined(CONFIG_NEED_DMA_MAP_STATE) +#undef DEFINE_DMA_UNMAP_ADDR +#define DEFINE_DMA_UNMAP_ADDR(ADDR_NAME) dma_addr_t ADDR_NAME +#undef DEFINE_DMA_UNMAP_LEN +#define DEFINE_DMA_UNMAP_LEN(LEN_NAME) __u32 LEN_NAME +#undef dma_unmap_addr +#define dma_unmap_addr(PTR, ADDR_NAME) ((PTR)->ADDR_NAME) +#undef dma_unmap_addr_set +#define dma_unmap_addr_set(PTR, ADDR_NAME, VAL) (((PTR)->ADDR_NAME) = (VAL)) +#undef dma_unmap_len +#define dma_unmap_len(PTR, LEN_NAME) ((PTR)->LEN_NAME) +#undef dma_unmap_len_set +#define dma_unmap_len_set(PTR, LEN_NAME, VAL) (((PTR)->LEN_NAME) = (VAL)) +#endif /* CONFIG_X86_64 && !CONFIG_NEED_DMA_MAP_STATE */ +#endif /* RHEL_RELEASE_CODE */ + +#if (!(RHEL_RELEASE_CODE && \ + (((RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(5,8)) && \ + (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(6,0))) || \ + ((RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,1)) && \ + (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(7,0)))))) +static inline bool pci_is_pcie(struct pci_dev *dev) +{ + return !!pci_pcie_cap(dev); +} +#endif /* RHEL_RELEASE_CODE */ + +#if (!(RHEL_RELEASE_CODE && \ + (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,2)))) +#define sk_tx_queue_get(_sk) (-1) +#define sk_tx_queue_set(_sk, _tx_queue) do {} while(0) +#endif /* !(RHEL >= 6.2) */ + +#if (RHEL_RELEASE_CODE && \ + (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,4)) && \ + (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(7,0))) +#define HAVE_RHEL6_ETHTOOL_OPS_EXT_STRUCT +#define HAVE_ETHTOOL_GRXFHINDIR_SIZE +#define HAVE_ETHTOOL_SET_PHYS_ID +#define HAVE_ETHTOOL_GET_TS_INFO +#if (RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(6,5)) +#define HAVE_ETHTOOL_GSRSSH +#define HAVE_RHEL6_SRIOV_CONFIGURE +#define HAVE_RXFH_NONCONST +#endif /* RHEL > 6.5 */ +#endif /* RHEL >= 6.4 && RHEL < 7.0 */ + +#else /* < 2.6.33 */ +#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) +#ifndef HAVE_NETDEV_OPS_FCOE_GETWWN +#define HAVE_NETDEV_OPS_FCOE_GETWWN +#endif +#endif /* CONFIG_FCOE || CONFIG_FCOE_MODULE */ +#endif /* < 2.6.33 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34) ) +#if (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(6,0)) +#ifndef pci_num_vf +#define pci_num_vf(pdev) _kc_pci_num_vf(pdev) +int _kc_pci_num_vf(struct pci_dev *dev); +#endif +#endif /* RHEL_RELEASE_CODE */ + +#ifndef dev_is_pci +#define dev_is_pci(d) ((d)->bus == &pci_bus_type) +#endif + +#ifndef ETH_FLAG_NTUPLE +#define ETH_FLAG_NTUPLE NETIF_F_NTUPLE +#endif + +#ifndef netdev_mc_count +#define netdev_mc_count(dev) ((dev)->mc_count) +#endif +#ifndef netdev_mc_empty +#define netdev_mc_empty(dev) (netdev_mc_count(dev) == 0) +#endif +#ifndef netdev_for_each_mc_addr +#define netdev_for_each_mc_addr(mclist, dev) \ + for (mclist = dev->mc_list; mclist; mclist = mclist->next) +#endif +#ifndef netdev_uc_count +#define netdev_uc_count(dev) ((dev)->uc.count) +#endif +#ifndef netdev_uc_empty +#define netdev_uc_empty(dev) (netdev_uc_count(dev) == 0) +#endif +#ifndef netdev_for_each_uc_addr +#define netdev_for_each_uc_addr(ha, dev) \ + list_for_each_entry(ha, &dev->uc.list, list) +#endif +#ifndef dma_set_coherent_mask +#define dma_set_coherent_mask(dev,mask) \ + pci_set_consistent_dma_mask(to_pci_dev(dev),(mask)) +#endif +#ifndef pci_dev_run_wake +#define pci_dev_run_wake(pdev) (0) +#endif + +/* netdev logging taken from include/linux/netdevice.h */ +#ifndef netdev_name +static inline const char *_kc_netdev_name(const struct net_device *dev) +{ + if (dev->reg_state != NETREG_REGISTERED) + return "(unregistered net_device)"; + return dev->name; +} +#define netdev_name(netdev) _kc_netdev_name(netdev) +#endif /* netdev_name */ + +#undef netdev_printk +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) ) +#define netdev_printk(level, netdev, format, args...) \ +do { \ + struct pci_dev *pdev = _kc_netdev_to_pdev(netdev); \ + printk(level "%s: " format, pci_name(pdev), ##args); \ +} while(0) +#elif ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21) ) +#define netdev_printk(level, netdev, format, args...) \ +do { \ + struct pci_dev *pdev = _kc_netdev_to_pdev(netdev); \ + struct device *dev = pci_dev_to_dev(pdev); \ + dev_printk(level, dev, "%s: " format, \ + netdev_name(netdev), ##args); \ +} while(0) +#else /* 2.6.21 => 2.6.34 */ +#define netdev_printk(level, netdev, format, args...) \ + dev_printk(level, (netdev)->dev.parent, \ + "%s: " format, \ + netdev_name(netdev), ##args) +#endif /* <2.6.0 <2.6.21 <2.6.34 */ +#undef netdev_emerg +#define netdev_emerg(dev, format, args...) \ + netdev_printk(KERN_EMERG, dev, format, ##args) +#undef netdev_alert +#define netdev_alert(dev, format, args...) \ + netdev_printk(KERN_ALERT, dev, format, ##args) +#undef netdev_crit +#define netdev_crit(dev, format, args...) \ + netdev_printk(KERN_CRIT, dev, format, ##args) +#undef netdev_err +#define netdev_err(dev, format, args...) \ + netdev_printk(KERN_ERR, dev, format, ##args) +#undef netdev_warn +#define netdev_warn(dev, format, args...) \ + netdev_printk(KERN_WARNING, dev, format, ##args) +#undef netdev_notice +#define netdev_notice(dev, format, args...) \ + netdev_printk(KERN_NOTICE, dev, format, ##args) +#undef netdev_info +#define netdev_info(dev, format, args...) \ + netdev_printk(KERN_INFO, dev, format, ##args) +#undef netdev_dbg +#if defined(DEBUG) +#define netdev_dbg(__dev, format, args...) \ + netdev_printk(KERN_DEBUG, __dev, format, ##args) +#elif defined(CONFIG_DYNAMIC_DEBUG) +#define netdev_dbg(__dev, format, args...) \ +do { \ + dynamic_dev_dbg((__dev)->dev.parent, "%s: " format, \ + netdev_name(__dev), ##args); \ +} while (0) +#else /* DEBUG */ +#define netdev_dbg(__dev, format, args...) \ +({ \ + if (0) \ + netdev_printk(KERN_DEBUG, __dev, format, ##args); \ + 0; \ +}) +#endif /* DEBUG */ + +#undef netif_printk +#define netif_printk(priv, type, level, dev, fmt, args...) \ +do { \ + if (netif_msg_##type(priv)) \ + netdev_printk(level, (dev), fmt, ##args); \ +} while (0) + +#undef netif_emerg +#define netif_emerg(priv, type, dev, fmt, args...) \ + netif_level(emerg, priv, type, dev, fmt, ##args) +#undef netif_alert +#define netif_alert(priv, type, dev, fmt, args...) \ + netif_level(alert, priv, type, dev, fmt, ##args) +#undef netif_crit +#define netif_crit(priv, type, dev, fmt, args...) \ + netif_level(crit, priv, type, dev, fmt, ##args) +#undef netif_err +#define netif_err(priv, type, dev, fmt, args...) \ + netif_level(err, priv, type, dev, fmt, ##args) +#undef netif_warn +#define netif_warn(priv, type, dev, fmt, args...) \ + netif_level(warn, priv, type, dev, fmt, ##args) +#undef netif_notice +#define netif_notice(priv, type, dev, fmt, args...) \ + netif_level(notice, priv, type, dev, fmt, ##args) +#undef netif_info +#define netif_info(priv, type, dev, fmt, args...) \ + netif_level(info, priv, type, dev, fmt, ##args) +#undef netif_dbg +#define netif_dbg(priv, type, dev, fmt, args...) \ + netif_level(dbg, priv, type, dev, fmt, ##args) + +#ifdef SET_SYSTEM_SLEEP_PM_OPS +#define HAVE_SYSTEM_SLEEP_PM_OPS +#endif + +#ifndef for_each_set_bit +#define for_each_set_bit(bit, addr, size) \ + for ((bit) = find_first_bit((addr), (size)); \ + (bit) < (size); \ + (bit) = find_next_bit((addr), (size), (bit) + 1)) +#endif /* for_each_set_bit */ + +#ifndef DEFINE_DMA_UNMAP_ADDR +#define DEFINE_DMA_UNMAP_ADDR DECLARE_PCI_UNMAP_ADDR +#define DEFINE_DMA_UNMAP_LEN DECLARE_PCI_UNMAP_LEN +#define dma_unmap_addr pci_unmap_addr +#define dma_unmap_addr_set pci_unmap_addr_set +#define dma_unmap_len pci_unmap_len +#define dma_unmap_len_set pci_unmap_len_set +#endif /* DEFINE_DMA_UNMAP_ADDR */ + +#if (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(6,3)) +#ifdef IGB_HWMON +#ifdef CONFIG_DEBUG_LOCK_ALLOC +#define sysfs_attr_init(attr) \ + do { \ + static struct lock_class_key __key; \ + (attr)->key = &__key; \ + } while (0) +#else +#define sysfs_attr_init(attr) do {} while (0) +#endif /* CONFIG_DEBUG_LOCK_ALLOC */ +#endif /* IGB_HWMON */ +#endif /* RHEL_RELEASE_CODE */ + +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) ) +static inline bool _kc_pm_runtime_suspended() +{ + return false; +} +#define pm_runtime_suspended(dev) _kc_pm_runtime_suspended() +#else /* 2.6.0 => 2.6.34 */ +static inline bool _kc_pm_runtime_suspended(struct device __always_unused *dev) +{ + return false; +} +#ifndef pm_runtime_suspended +#define pm_runtime_suspended(dev) _kc_pm_runtime_suspended(dev) +#endif +#endif /* 2.6.0 => 2.6.34 */ + +#ifndef pci_bus_speed +/* override pci_bus_speed introduced in 2.6.19 with an expanded enum type */ +enum _kc_pci_bus_speed { + _KC_PCIE_SPEED_2_5GT = 0x14, + _KC_PCIE_SPEED_5_0GT = 0x15, + _KC_PCIE_SPEED_8_0GT = 0x16, + _KC_PCI_SPEED_UNKNOWN = 0xff, +}; +#define pci_bus_speed _kc_pci_bus_speed +#define PCIE_SPEED_2_5GT _KC_PCIE_SPEED_2_5GT +#define PCIE_SPEED_5_0GT _KC_PCIE_SPEED_5_0GT +#define PCIE_SPEED_8_0GT _KC_PCIE_SPEED_8_0GT +#define PCI_SPEED_UNKNOWN _KC_PCI_SPEED_UNKNOWN +#endif /* pci_bus_speed */ + +#else /* < 2.6.34 */ +#define HAVE_SYSTEM_SLEEP_PM_OPS +#ifndef HAVE_SET_RX_MODE +#define HAVE_SET_RX_MODE +#endif + +#endif /* < 2.6.34 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35) ) +ssize_t _kc_simple_write_to_buffer(void *to, size_t available, loff_t *ppos, + const void __user *from, size_t count); +#define simple_write_to_buffer _kc_simple_write_to_buffer + +#if (!(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,4))) +static inline struct pci_dev *pci_physfn(struct pci_dev *dev) +{ +#ifdef HAVE_PCI_DEV_IS_VIRTFN_BIT +#ifdef CONFIG_PCI_IOV + if (dev->is_virtfn) + dev = dev->physfn; +#endif /* CONFIG_PCI_IOV */ +#endif /* HAVE_PCI_DEV_IS_VIRTFN_BIT */ + return dev; +} +#endif /* ! RHEL >= 6.4 */ + +#ifndef PCI_EXP_LNKSTA_NLW_SHIFT +#define PCI_EXP_LNKSTA_NLW_SHIFT 4 +#endif + +#ifndef numa_node_id +#define numa_node_id() 0 +#endif +#ifndef numa_mem_id +#define numa_mem_id numa_node_id +#endif +#if (!(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,0))) +#ifdef HAVE_TX_MQ +#include +#ifndef CONFIG_NETDEVICES_MULTIQUEUE +int _kc_netif_set_real_num_tx_queues(struct net_device *, unsigned int); +#else /* CONFIG_NETDEVICES_MULTI_QUEUE */ +static inline int _kc_netif_set_real_num_tx_queues(struct net_device *dev, + unsigned int txq) +{ + dev->egress_subqueue_count = txq; + return 0; +} +#endif /* CONFIG_NETDEVICES_MULTI_QUEUE */ +#else /* HAVE_TX_MQ */ +static inline int _kc_netif_set_real_num_tx_queues(struct net_device __always_unused *dev, + unsigned int __always_unused txq) +{ + return 0; +} +#endif /* HAVE_TX_MQ */ +#define netif_set_real_num_tx_queues(dev, txq) \ + _kc_netif_set_real_num_tx_queues(dev, txq) +#endif /* !(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,0)) */ +#ifndef ETH_FLAG_RXHASH +#define ETH_FLAG_RXHASH (1<<28) +#endif /* ETH_FLAG_RXHASH */ +#if (RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,0)) +#define HAVE_IRQ_AFFINITY_HINT +#endif +struct device_node; +#else /* < 2.6.35 */ +#define HAVE_STRUCT_DEVICE_OF_NODE +#define HAVE_PM_QOS_REQUEST_LIST +#define HAVE_IRQ_AFFINITY_HINT +#include +#endif /* < 2.6.35 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36) ) +int _kc_ethtool_op_set_flags(struct net_device *, u32, u32); +#define ethtool_op_set_flags _kc_ethtool_op_set_flags +u32 _kc_ethtool_op_get_flags(struct net_device *); +#define ethtool_op_get_flags _kc_ethtool_op_get_flags + +enum { + WQ_UNBOUND = 0, + WQ_RESCUER = 0, +}; + +#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS +#ifdef NET_IP_ALIGN +#undef NET_IP_ALIGN +#endif +#define NET_IP_ALIGN 0 +#endif /* CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS */ + +#ifdef NET_SKB_PAD +#undef NET_SKB_PAD +#endif + +#if (L1_CACHE_BYTES > 32) +#define NET_SKB_PAD L1_CACHE_BYTES +#else +#define NET_SKB_PAD 32 +#endif + +static inline struct sk_buff *_kc_netdev_alloc_skb_ip_align(struct net_device *dev, + unsigned int length) +{ + struct sk_buff *skb; + + skb = alloc_skb(length + NET_SKB_PAD + NET_IP_ALIGN, GFP_ATOMIC); + if (skb) { +#if (NET_IP_ALIGN + NET_SKB_PAD) + skb_reserve(skb, NET_IP_ALIGN + NET_SKB_PAD); +#endif + skb->dev = dev; + } + return skb; +} + +#ifdef netdev_alloc_skb_ip_align +#undef netdev_alloc_skb_ip_align +#endif +#define netdev_alloc_skb_ip_align(n, l) _kc_netdev_alloc_skb_ip_align(n, l) + +#undef netif_level +#define netif_level(level, priv, type, dev, fmt, args...) \ +do { \ + if (netif_msg_##type(priv)) \ + netdev_##level(dev, fmt, ##args); \ +} while (0) + +#if (!(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,3))) +#undef usleep_range +#define usleep_range(min, max) msleep(DIV_ROUND_UP(min, 1000)) +#endif + +#define u64_stats_update_begin(a) do { } while(0) +#define u64_stats_update_end(a) do { } while(0) +#define u64_stats_fetch_begin(a) do { } while(0) +#define u64_stats_fetch_retry_bh(a,b) (0) +#define u64_stats_fetch_begin_bh(a) (0) + +#if (RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,1)) +#define HAVE_8021P_SUPPORT +#endif + +/* RHEL6.4 and SLES11sp2 backported skb_tx_timestamp */ +#if (!(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,4)) && \ + !(SLE_VERSION_CODE >= SLE_VERSION(11,2,0))) +static inline void skb_tx_timestamp(struct sk_buff __always_unused *skb) +{ + return; +} +#endif + +#else /* < 2.6.36 */ + +#define HAVE_PM_QOS_REQUEST_ACTIVE +#define HAVE_8021P_SUPPORT +#define HAVE_NDO_GET_STATS64 +#endif /* < 2.6.36 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37) ) +#define HAVE_NON_CONST_PCI_DRIVER_NAME +#ifndef netif_set_real_num_tx_queues +static inline int _kc_netif_set_real_num_tx_queues(struct net_device *dev, + unsigned int txq) +{ + netif_set_real_num_tx_queues(dev, txq); + return 0; +} +#define netif_set_real_num_tx_queues(dev, txq) \ + _kc_netif_set_real_num_tx_queues(dev, txq) +#endif +#ifndef netif_set_real_num_rx_queues +static inline int __kc_netif_set_real_num_rx_queues(struct net_device __always_unused *dev, + unsigned int __always_unused rxq) +{ + return 0; +} +#define netif_set_real_num_rx_queues(dev, rxq) \ + __kc_netif_set_real_num_rx_queues((dev), (rxq)) +#endif +#ifndef ETHTOOL_RXNTUPLE_ACTION_CLEAR +#define ETHTOOL_RXNTUPLE_ACTION_CLEAR (-2) +#endif +#ifndef VLAN_N_VID +#define VLAN_N_VID VLAN_GROUP_ARRAY_LEN +#endif /* VLAN_N_VID */ +#ifndef ETH_FLAG_TXVLAN +#define ETH_FLAG_TXVLAN BIT(7) +#endif /* ETH_FLAG_TXVLAN */ +#ifndef ETH_FLAG_RXVLAN +#define ETH_FLAG_RXVLAN BIT(8) +#endif /* ETH_FLAG_RXVLAN */ + +#define WQ_MEM_RECLAIM WQ_RESCUER + +static inline void _kc_skb_checksum_none_assert(struct sk_buff *skb) +{ + WARN_ON(skb->ip_summed != CHECKSUM_NONE); +} +#define skb_checksum_none_assert(skb) _kc_skb_checksum_none_assert(skb) + +static inline void *_kc_vzalloc_node(unsigned long size, int node) +{ + void *addr = vmalloc_node(size, node); + if (addr) + memset(addr, 0, size); + return addr; +} +#define vzalloc_node(_size, _node) _kc_vzalloc_node(_size, _node) + +static inline void *_kc_vzalloc(unsigned long size) +{ + void *addr = vmalloc(size); + if (addr) + memset(addr, 0, size); + return addr; +} +#define vzalloc(_size) _kc_vzalloc(_size) + +#if (!(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(5,7)) || \ + (RHEL_RELEASE_CODE == RHEL_RELEASE_VERSION(6,0))) +static inline __be16 vlan_get_protocol(const struct sk_buff *skb) +{ + if (vlan_tx_tag_present(skb) || + skb->protocol != cpu_to_be16(ETH_P_8021Q)) + return skb->protocol; + + if (skb_headlen(skb) < sizeof(struct vlan_ethhdr)) + return 0; + + return ((struct vlan_ethhdr*)skb->data)->h_vlan_encapsulated_proto; +} +#endif /* !RHEL5.7+ || RHEL6.0 */ + +#ifdef HAVE_HW_TIME_STAMP +#define SKBTX_HW_TSTAMP BIT(0) +#define SKBTX_IN_PROGRESS BIT(2) +#define SKB_SHARED_TX_IS_UNION +#endif + +#ifndef device_wakeup_enable +#define device_wakeup_enable(dev) device_set_wakeup_enable(dev, true) +#endif + +#if ( LINUX_VERSION_CODE > KERNEL_VERSION(2,4,18) ) +#ifndef HAVE_VLAN_RX_REGISTER +#define HAVE_VLAN_RX_REGISTER +#endif +#endif /* > 2.4.18 */ +#endif /* < 2.6.37 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38) ) +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22) ) +#define skb_checksum_start_offset(skb) skb_transport_offset(skb) +#else /* 2.6.22 -> 2.6.37 */ +static inline int _kc_skb_checksum_start_offset(const struct sk_buff *skb) +{ + return skb->csum_start - skb_headroom(skb); +} +#define skb_checksum_start_offset(skb) _kc_skb_checksum_start_offset(skb) +#endif /* 2.6.22 -> 2.6.37 */ +#if IS_ENABLED(CONFIG_DCB) +#ifndef IEEE_8021QAZ_MAX_TCS +#define IEEE_8021QAZ_MAX_TCS 8 +#endif +#ifndef DCB_CAP_DCBX_HOST +#define DCB_CAP_DCBX_HOST 0x01 +#endif +#ifndef DCB_CAP_DCBX_LLD_MANAGED +#define DCB_CAP_DCBX_LLD_MANAGED 0x02 +#endif +#ifndef DCB_CAP_DCBX_VER_CEE +#define DCB_CAP_DCBX_VER_CEE 0x04 +#endif +#ifndef DCB_CAP_DCBX_VER_IEEE +#define DCB_CAP_DCBX_VER_IEEE 0x08 +#endif +#ifndef DCB_CAP_DCBX_STATIC +#define DCB_CAP_DCBX_STATIC 0x10 +#endif +#endif /* CONFIG_DCB */ +#if (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,2)) +#define CONFIG_XPS +#endif /* RHEL_RELEASE_VERSION(6,2) */ +#endif /* < 2.6.38 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,39) ) +#ifndef TC_BITMASK +#define TC_BITMASK 15 +#endif +#ifndef NETIF_F_RXCSUM +#define NETIF_F_RXCSUM BIT(29) +#endif +#ifndef skb_queue_reverse_walk_safe +#define skb_queue_reverse_walk_safe(queue, skb, tmp) \ + for (skb = (queue)->prev, tmp = skb->prev; \ + skb != (struct sk_buff *)(queue); \ + skb = tmp, tmp = skb->prev) +#endif +#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) +#ifndef FCOE_MTU +#define FCOE_MTU 2158 +#endif +#endif +#if IS_ENABLED(CONFIG_DCB) +#ifndef IEEE_8021QAZ_APP_SEL_ETHERTYPE +#define IEEE_8021QAZ_APP_SEL_ETHERTYPE 1 +#endif +#endif +#if (!(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,4))) +#define kstrtoul(a, b, c) ((*(c)) = simple_strtoul((a), NULL, (b)), 0) +#define kstrtouint(a, b, c) ((*(c)) = simple_strtoul((a), NULL, (b)), 0) +#define kstrtou32(a, b, c) ((*(c)) = simple_strtoul((a), NULL, (b)), 0) +#endif /* !(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,4)) */ +#if (!(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(6,0))) +u16 ___kc_skb_tx_hash(struct net_device *, const struct sk_buff *, u16); +#define __skb_tx_hash(n, s, q) ___kc_skb_tx_hash((n), (s), (q)) +u8 _kc_netdev_get_num_tc(struct net_device *dev); +#define netdev_get_num_tc(dev) _kc_netdev_get_num_tc(dev) +int _kc_netdev_set_num_tc(struct net_device *dev, u8 num_tc); +#define netdev_set_num_tc(dev, tc) _kc_netdev_set_num_tc((dev), (tc)) +#define netdev_reset_tc(dev) _kc_netdev_set_num_tc((dev), 0) +#define netdev_set_tc_queue(dev, tc, cnt, off) do {} while (0) +u8 _kc_netdev_get_prio_tc_map(struct net_device *dev, u8 up); +#define netdev_get_prio_tc_map(dev, up) _kc_netdev_get_prio_tc_map(dev, up) +#define netdev_set_prio_tc_map(dev, up, tc) do {} while (0) +#else /* RHEL6.1 or greater */ +#ifndef HAVE_MQPRIO +#define HAVE_MQPRIO +#endif /* HAVE_MQPRIO */ +#if IS_ENABLED(CONFIG_DCB) +#ifndef HAVE_DCBNL_IEEE +#define HAVE_DCBNL_IEEE +#ifndef IEEE_8021QAZ_TSA_STRICT +#define IEEE_8021QAZ_TSA_STRICT 0 +#endif +#ifndef IEEE_8021QAZ_TSA_ETS +#define IEEE_8021QAZ_TSA_ETS 2 +#endif +#ifndef IEEE_8021QAZ_APP_SEL_ETHERTYPE +#define IEEE_8021QAZ_APP_SEL_ETHERTYPE 1 +#endif +#endif +#endif /* CONFIG_DCB */ +#endif /* !(RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(6,0)) */ + +#ifndef udp_csum +#define udp_csum __kc_udp_csum +static inline __wsum __kc_udp_csum(struct sk_buff *skb) +{ + __wsum csum = csum_partial(skb_transport_header(skb), + sizeof(struct udphdr), skb->csum); + + for (skb = skb_shinfo(skb)->frag_list; skb; skb = skb->next) { + csum = csum_add(csum, skb->csum); + } + return csum; +} +#endif /* udp_csum */ +#else /* < 2.6.39 */ +#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) +#ifndef HAVE_NETDEV_OPS_FCOE_DDP_TARGET +#define HAVE_NETDEV_OPS_FCOE_DDP_TARGET +#endif +#endif /* CONFIG_FCOE || CONFIG_FCOE_MODULE */ +#ifndef HAVE_MQPRIO +#define HAVE_MQPRIO +#endif +#ifndef HAVE_SETUP_TC +#define HAVE_SETUP_TC +#endif +#ifdef CONFIG_DCB +#ifndef HAVE_DCBNL_IEEE +#define HAVE_DCBNL_IEEE +#endif +#endif /* CONFIG_DCB */ +#ifndef HAVE_NDO_SET_FEATURES +#define HAVE_NDO_SET_FEATURES +#endif +#define HAVE_IRQ_AFFINITY_NOTIFY +#endif /* < 2.6.39 */ + +/*****************************************************************************/ +/* use < 2.6.40 because of a Fedora 15 kernel update where they + * updated the kernel version to 2.6.40.x and they back-ported 3.0 features + * like set_phys_id for ethtool. + */ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,40) ) +#ifdef ETHTOOL_GRXRINGS +#ifndef FLOW_EXT +#define FLOW_EXT 0x80000000 +union _kc_ethtool_flow_union { + struct ethtool_tcpip4_spec tcp_ip4_spec; + struct ethtool_usrip4_spec usr_ip4_spec; + __u8 hdata[60]; +}; +struct _kc_ethtool_flow_ext { + __be16 vlan_etype; + __be16 vlan_tci; + __be32 data[2]; +}; +struct _kc_ethtool_rx_flow_spec { + __u32 flow_type; + union _kc_ethtool_flow_union h_u; + struct _kc_ethtool_flow_ext h_ext; + union _kc_ethtool_flow_union m_u; + struct _kc_ethtool_flow_ext m_ext; + __u64 ring_cookie; + __u32 location; +}; +#define ethtool_rx_flow_spec _kc_ethtool_rx_flow_spec +#endif /* FLOW_EXT */ +#endif + +#define pci_disable_link_state_locked pci_disable_link_state + +#ifndef PCI_LTR_VALUE_MASK +#define PCI_LTR_VALUE_MASK 0x000003ff +#endif +#ifndef PCI_LTR_SCALE_MASK +#define PCI_LTR_SCALE_MASK 0x00001c00 +#endif +#ifndef PCI_LTR_SCALE_SHIFT +#define PCI_LTR_SCALE_SHIFT 10 +#endif + +#else /* < 2.6.40 */ +#define HAVE_ETHTOOL_SET_PHYS_ID +#endif /* < 2.6.40 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0) ) +#define USE_LEGACY_PM_SUPPORT +#ifndef kfree_rcu +#define kfree_rcu(_ptr, _rcu_head) do { \ + void __kc_kfree_rcu(struct rcu_head *rcu_head) \ + { \ + void *ptr = container_of(rcu_head, \ + typeof(*_ptr), \ + _rcu_head); \ + kfree(ptr); \ + } \ + call_rcu(&(_ptr)->_rcu_head, __kc_kfree_rcu); \ +} while (0) +#define HAVE_KFREE_RCU_BARRIER +#endif /* kfree_rcu */ +#ifndef kstrtol_from_user +#define kstrtol_from_user(s, c, b, r) _kc_kstrtol_from_user(s, c, b, r) +static inline int _kc_kstrtol_from_user(const char __user *s, size_t count, + unsigned int base, long *res) +{ + /* sign, base 2 representation, newline, terminator */ + char buf[1 + sizeof(long) * 8 + 1 + 1]; + + count = min(count, sizeof(buf) - 1); + if (copy_from_user(buf, s, count)) + return -EFAULT; + buf[count] = '\0'; + return strict_strtol(buf, base, res); +} +#endif + +#if (RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(7,0) || \ + RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(5,7))) +/* 20000base_blah_full Supported and Advertised Registers */ +#define SUPPORTED_20000baseMLD2_Full BIT(21) +#define SUPPORTED_20000baseKR2_Full BIT(22) +#define ADVERTISED_20000baseMLD2_Full BIT(21) +#define ADVERTISED_20000baseKR2_Full BIT(22) +#endif /* RHEL_RELEASE_CODE */ +#endif /* < 3.0.0 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,1,0) ) +#ifndef __netdev_alloc_skb_ip_align +#define __netdev_alloc_skb_ip_align(d,l,_g) netdev_alloc_skb_ip_align(d,l) +#endif /* __netdev_alloc_skb_ip_align */ +#define dcb_ieee_setapp(dev, app) dcb_setapp(dev, app) +#define dcb_ieee_delapp(dev, app) 0 +#define dcb_ieee_getapp_mask(dev, app) (1 << app->priority) + +/* 1000BASE-T Control register */ +#define CTL1000_AS_MASTER 0x0800 +#define CTL1000_ENABLE_MASTER 0x1000 + +/* kernels less than 3.0.0 don't have this */ +#ifndef ETH_P_8021AD +#define ETH_P_8021AD 0x88A8 +#endif + +/* Stub definition for !CONFIG_OF is introduced later */ +#ifdef CONFIG_OF +static inline struct device_node * +pci_device_to_OF_node(struct pci_dev __maybe_unused *pdev) +{ +#ifdef HAVE_STRUCT_DEVICE_OF_NODE + return pdev ? pdev->dev.of_node : NULL; +#else + return NULL; +#endif /* !HAVE_STRUCT_DEVICE_OF_NODE */ +} +#endif /* CONFIG_OF */ +#else /* < 3.1.0 */ +#ifndef HAVE_DCBNL_IEEE_DELAPP +#define HAVE_DCBNL_IEEE_DELAPP +#endif +#endif /* < 3.1.0 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0) ) +#ifndef dma_zalloc_coherent +#define dma_zalloc_coherent(d, s, h, f) _kc_dma_zalloc_coherent(d, s, h, f) +static inline void *_kc_dma_zalloc_coherent(struct device *dev, size_t size, + dma_addr_t *dma_handle, gfp_t flag) +{ + void *ret = dma_alloc_coherent(dev, size, dma_handle, flag); + if (ret) + memset(ret, 0, size); + return ret; +} +#endif +#ifdef ETHTOOL_GRXRINGS +#define HAVE_ETHTOOL_GET_RXNFC_VOID_RULE_LOCS +#endif /* ETHTOOL_GRXRINGS */ + +#ifndef skb_frag_size +#define skb_frag_size(frag) _kc_skb_frag_size(frag) +static inline unsigned int _kc_skb_frag_size(const skb_frag_t *frag) +{ + return frag->size; +} +#endif /* skb_frag_size */ + +#ifndef skb_frag_size_sub +#define skb_frag_size_sub(frag, delta) _kc_skb_frag_size_sub(frag, delta) +static inline void _kc_skb_frag_size_sub(skb_frag_t *frag, int delta) +{ + frag->size -= delta; +} +#endif /* skb_frag_size_sub */ + +#ifndef skb_frag_page +#define skb_frag_page(frag) _kc_skb_frag_page(frag) +static inline struct page *_kc_skb_frag_page(const skb_frag_t *frag) +{ + return frag->page; +} +#endif /* skb_frag_page */ + +#ifndef skb_frag_address +#define skb_frag_address(frag) _kc_skb_frag_address(frag) +static inline void *_kc_skb_frag_address(const skb_frag_t *frag) +{ + return page_address(skb_frag_page(frag)) + frag->page_offset; +} +#endif /* skb_frag_address */ + +#ifndef skb_frag_dma_map +#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) ) +#include +#endif +#define skb_frag_dma_map(dev,frag,offset,size,dir) \ + _kc_skb_frag_dma_map(dev,frag,offset,size,dir) +static inline dma_addr_t _kc_skb_frag_dma_map(struct device *dev, + const skb_frag_t *frag, + size_t offset, size_t size, + enum dma_data_direction dir) +{ + return dma_map_page(dev, skb_frag_page(frag), + frag->page_offset + offset, size, dir); +} +#endif /* skb_frag_dma_map */ + +#ifndef __skb_frag_unref +#define __skb_frag_unref(frag) __kc_skb_frag_unref(frag) +static inline void __kc_skb_frag_unref(skb_frag_t *frag) +{ + put_page(skb_frag_page(frag)); +} +#endif /* __skb_frag_unref */ + +#ifndef SPEED_UNKNOWN +#define SPEED_UNKNOWN -1 +#endif +#ifndef DUPLEX_UNKNOWN +#define DUPLEX_UNKNOWN 0xff +#endif +#if ((RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,3)) ||\ + (SLE_VERSION_CODE && SLE_VERSION_CODE >= SLE_VERSION(11,3,0))) +#ifndef HAVE_PCI_DEV_FLAGS_ASSIGNED +#define HAVE_PCI_DEV_FLAGS_ASSIGNED +#endif +#endif +#else /* < 3.2.0 */ +#ifndef HAVE_PCI_DEV_FLAGS_ASSIGNED +#define HAVE_PCI_DEV_FLAGS_ASSIGNED +#define HAVE_VF_SPOOFCHK_CONFIGURE +#endif +#ifndef HAVE_SKB_L4_RXHASH +#define HAVE_SKB_L4_RXHASH +#endif +#define HAVE_IOMMU_PRESENT +#define HAVE_PM_QOS_REQUEST_LIST_NEW +#endif /* < 3.2.0 */ + +#if (RHEL_RELEASE_CODE && RHEL_RELEASE_CODE == RHEL_RELEASE_VERSION(6,2)) +#undef ixgbe_get_netdev_tc_txq +#define ixgbe_get_netdev_tc_txq(dev, tc) (&netdev_extended(dev)->qos_data.tc_to_txq[tc]) +#endif +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0) ) +/* NOTE: the order of parameters to _kc_alloc_workqueue() is different than + * alloc_workqueue() to avoid compiler warning from -Wvarargs + */ +static inline struct workqueue_struct * __attribute__ ((format(printf, 3, 4))) +_kc_alloc_workqueue(__maybe_unused int flags, __maybe_unused int max_active, + const char *fmt, ...) +{ + struct workqueue_struct *wq; + va_list args, temp; + unsigned int len; + char *p; + + va_start(args, fmt); + va_copy(temp, args); + len = vsnprintf(NULL, 0, fmt, temp); + va_end(temp); + + p = kmalloc(len + 1, GFP_KERNEL); + if (!p) { + va_end(args); + return NULL; + } + + vsnprintf(p, len + 1, fmt, args); + va_end(args); +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36) ) + wq = create_workqueue(p); +#else + wq = alloc_workqueue(p, flags, max_active); +#endif + kfree(p); + + return wq; +} +#ifdef alloc_workqueue +#undef alloc_workqueue +#endif +#define alloc_workqueue(fmt, flags, max_active, args...) \ + _kc_alloc_workqueue(flags, max_active, fmt, ##args) + +#if !(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,5)) +typedef u32 netdev_features_t; +#endif +#undef PCI_EXP_TYPE_RC_EC +#define PCI_EXP_TYPE_RC_EC 0xa /* Root Complex Event Collector */ +#ifndef CONFIG_BQL +#define netdev_tx_completed_queue(_q, _p, _b) do {} while (0) +#define netdev_completed_queue(_n, _p, _b) do {} while (0) +#define netdev_tx_sent_queue(_q, _b) do {} while (0) +#define netdev_sent_queue(_n, _b) do {} while (0) +#define netdev_tx_reset_queue(_q) do {} while (0) +#define netdev_reset_queue(_n) do {} while (0) +#endif +#if (SLE_VERSION_CODE && SLE_VERSION_CODE >= SLE_VERSION(11,3,0)) +#define HAVE_ETHTOOL_GRXFHINDIR_SIZE +#endif /* SLE_VERSION(11,3,0) */ +#define netif_xmit_stopped(_q) netif_tx_queue_stopped(_q) +#if !(SLE_VERSION_CODE && SLE_VERSION_CODE >= SLE_VERSION(11,4,0)) +static inline int __kc_ipv6_skip_exthdr(const struct sk_buff *skb, int start, + u8 *nexthdrp, + __be16 __always_unused *frag_offp) +{ + return ipv6_skip_exthdr(skb, start, nexthdrp); +} +#undef ipv6_skip_exthdr +#define ipv6_skip_exthdr(a,b,c,d) __kc_ipv6_skip_exthdr((a), (b), (c), (d)) +#endif /* !SLES11sp4 or greater */ + +#if (!(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,4)) && \ + !(SLE_VERSION_CODE >= SLE_VERSION(11,3,0))) +static inline u32 ethtool_rxfh_indir_default(u32 index, u32 n_rx_rings) +{ + return index % n_rx_rings; +} +#endif + +#else /* ! < 3.3.0 */ +#define HAVE_ETHTOOL_GRXFHINDIR_SIZE +#define HAVE_INT_NDO_VLAN_RX_ADD_VID +#ifdef ETHTOOL_SRXNTUPLE +#undef ETHTOOL_SRXNTUPLE +#endif +#endif /* < 3.3.0 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0) ) +#ifndef NETIF_F_RXFCS +#define NETIF_F_RXFCS 0 +#endif /* NETIF_F_RXFCS */ +#ifndef NETIF_F_RXALL +#define NETIF_F_RXALL 0 +#endif /* NETIF_F_RXALL */ + +#if !(SLE_VERSION_CODE && SLE_VERSION_CODE >= SLE_VERSION(11,3,0)) +#define NUMTCS_RETURNS_U8 + +int _kc_simple_open(struct inode *inode, struct file *file); +#define simple_open _kc_simple_open +#endif /* !(SLE_VERSION_CODE && SLE_VERSION_CODE >= SLE_VERSION(11,3,0)) */ + +#ifndef skb_add_rx_frag +#define skb_add_rx_frag _kc_skb_add_rx_frag +void _kc_skb_add_rx_frag(struct sk_buff * skb, int i, struct page *page, + int off, int size, unsigned int truesize); +#endif +#ifdef NET_ADDR_RANDOM +#define eth_hw_addr_random(N) do { \ + eth_random_addr(N->dev_addr); \ + N->addr_assign_type |= NET_ADDR_RANDOM; \ + } while (0) +#else /* NET_ADDR_RANDOM */ +#define eth_hw_addr_random(N) eth_random_addr(N->dev_addr) +#endif /* NET_ADDR_RANDOM */ + +#ifndef for_each_set_bit_from +#define for_each_set_bit_from(bit, addr, size) \ + for ((bit) = find_next_bit((addr), (size), (bit)); \ + (bit) < (size); \ + (bit) = find_next_bit((addr), (size), (bit) + 1)) +#endif /* for_each_set_bit_from */ + +#else /* < 3.4.0 */ +#include +#endif /* >= 3.4.0 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0) ) || \ + ( RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,4) ) +#if !defined(NO_PTP_SUPPORT) && IS_ENABLED(CONFIG_PTP_1588_CLOCK) +#define HAVE_PTP_1588_CLOCK +#endif /* !NO_PTP_SUPPORT && IS_ENABLED(CONFIG_PTP_1588_CLOCK) */ +#endif /* >= 3.0.0 || RHEL_RELEASE > 6.4 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0) ) + +#ifndef SIZE_MAX +#define SIZE_MAX (~(size_t)0) +#endif + +#ifndef BITS_PER_LONG_LONG +#define BITS_PER_LONG_LONG 64 +#endif + +#ifndef ether_addr_equal +static inline bool __kc_ether_addr_equal(const u8 *addr1, const u8 *addr2) +{ + return !compare_ether_addr(addr1, addr2); +} +#define ether_addr_equal(_addr1, _addr2) __kc_ether_addr_equal((_addr1),(_addr2)) +#endif + +/* Definitions for !CONFIG_OF_NET are introduced in 3.10 */ +#ifdef CONFIG_OF_NET +static inline int of_get_phy_mode(struct device_node __always_unused *np) +{ + return -ENODEV; +} + +static inline const void * +of_get_mac_address(struct device_node __always_unused *np) +{ + return NULL; +} +#endif +#else +#include +#define HAVE_FDB_OPS +#define HAVE_ETHTOOL_GET_TS_INFO +#endif /* < 3.5.0 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0) ) +#define PCI_EXP_LNKCAP2 44 /* Link Capability 2 */ + +#ifndef MDIO_EEE_100TX +#define MDIO_EEE_100TX 0x0002 /* 100TX EEE cap */ +#endif +#ifndef MDIO_EEE_1000T +#define MDIO_EEE_1000T 0x0004 /* 1000T EEE cap */ +#endif +#ifndef MDIO_EEE_10GT +#define MDIO_EEE_10GT 0x0008 /* 10GT EEE cap */ +#endif +#ifndef MDIO_EEE_1000KX +#define MDIO_EEE_1000KX 0x0010 /* 1000KX EEE cap */ +#endif +#ifndef MDIO_EEE_10GKX4 +#define MDIO_EEE_10GKX4 0x0020 /* 10G KX4 EEE cap */ +#endif +#ifndef MDIO_EEE_10GKR +#define MDIO_EEE_10GKR 0x0040 /* 10G KR EEE cap */ +#endif + +#ifndef __GFP_MEMALLOC +#define __GFP_MEMALLOC 0 +#endif + +#ifndef eth_broadcast_addr +#define eth_broadcast_addr _kc_eth_broadcast_addr +static inline void _kc_eth_broadcast_addr(u8 *addr) +{ + memset(addr, 0xff, ETH_ALEN); +} +#endif + +#ifndef eth_random_addr +#define eth_random_addr _kc_eth_random_addr +static inline void _kc_eth_random_addr(u8 *addr) +{ + get_random_bytes(addr, ETH_ALEN); + addr[0] &= 0xfe; /* clear multicast */ + addr[0] |= 0x02; /* set local assignment */ +} +#endif /* eth_random_addr */ + +#ifndef DMA_ATTR_SKIP_CPU_SYNC +#define DMA_ATTR_SKIP_CPU_SYNC 0 +#endif +#else /* < 3.6.0 */ +#define HAVE_STRUCT_PAGE_PFMEMALLOC +#endif /* < 3.6.0 */ + +/******************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,7,0) ) +#include +#ifndef ADVERTISED_40000baseKR4_Full +/* these defines were all added in one commit, so should be safe + * to trigger activiation on one define + */ +#define SUPPORTED_40000baseKR4_Full BIT(23) +#define SUPPORTED_40000baseCR4_Full BIT(24) +#define SUPPORTED_40000baseSR4_Full BIT(25) +#define SUPPORTED_40000baseLR4_Full BIT(26) +#define ADVERTISED_40000baseKR4_Full BIT(23) +#define ADVERTISED_40000baseCR4_Full BIT(24) +#define ADVERTISED_40000baseSR4_Full BIT(25) +#define ADVERTISED_40000baseLR4_Full BIT(26) +#endif + +#ifndef mmd_eee_cap_to_ethtool_sup_t +/** + * mmd_eee_cap_to_ethtool_sup_t + * @eee_cap: value of the MMD EEE Capability register + * + * A small helper function that translates MMD EEE Capability (3.20) bits + * to ethtool supported settings. + */ +static inline u32 __kc_mmd_eee_cap_to_ethtool_sup_t(u16 eee_cap) +{ + u32 supported = 0; + + if (eee_cap & MDIO_EEE_100TX) + supported |= SUPPORTED_100baseT_Full; + if (eee_cap & MDIO_EEE_1000T) + supported |= SUPPORTED_1000baseT_Full; + if (eee_cap & MDIO_EEE_10GT) + supported |= SUPPORTED_10000baseT_Full; + if (eee_cap & MDIO_EEE_1000KX) + supported |= SUPPORTED_1000baseKX_Full; + if (eee_cap & MDIO_EEE_10GKX4) + supported |= SUPPORTED_10000baseKX4_Full; + if (eee_cap & MDIO_EEE_10GKR) + supported |= SUPPORTED_10000baseKR_Full; + + return supported; +} +#define mmd_eee_cap_to_ethtool_sup_t(eee_cap) \ + __kc_mmd_eee_cap_to_ethtool_sup_t(eee_cap) +#endif /* mmd_eee_cap_to_ethtool_sup_t */ + +#ifndef mmd_eee_adv_to_ethtool_adv_t +/** + * mmd_eee_adv_to_ethtool_adv_t + * @eee_adv: value of the MMD EEE Advertisement/Link Partner Ability registers + * + * A small helper function that translates the MMD EEE Advertisement (7.60) + * and MMD EEE Link Partner Ability (7.61) bits to ethtool advertisement + * settings. + */ +static inline u32 __kc_mmd_eee_adv_to_ethtool_adv_t(u16 eee_adv) +{ + u32 adv = 0; + + if (eee_adv & MDIO_EEE_100TX) + adv |= ADVERTISED_100baseT_Full; + if (eee_adv & MDIO_EEE_1000T) + adv |= ADVERTISED_1000baseT_Full; + if (eee_adv & MDIO_EEE_10GT) + adv |= ADVERTISED_10000baseT_Full; + if (eee_adv & MDIO_EEE_1000KX) + adv |= ADVERTISED_1000baseKX_Full; + if (eee_adv & MDIO_EEE_10GKX4) + adv |= ADVERTISED_10000baseKX4_Full; + if (eee_adv & MDIO_EEE_10GKR) + adv |= ADVERTISED_10000baseKR_Full; + + return adv; +} + +#define mmd_eee_adv_to_ethtool_adv_t(eee_adv) \ + __kc_mmd_eee_adv_to_ethtool_adv_t(eee_adv) +#endif /* mmd_eee_adv_to_ethtool_adv_t */ + +#ifndef ethtool_adv_to_mmd_eee_adv_t +/** + * ethtool_adv_to_mmd_eee_adv_t + * @adv: the ethtool advertisement settings + * + * A small helper function that translates ethtool advertisement settings + * to EEE advertisements for the MMD EEE Advertisement (7.60) and + * MMD EEE Link Partner Ability (7.61) registers. + */ +static inline u16 __kc_ethtool_adv_to_mmd_eee_adv_t(u32 adv) +{ + u16 reg = 0; + + if (adv & ADVERTISED_100baseT_Full) + reg |= MDIO_EEE_100TX; + if (adv & ADVERTISED_1000baseT_Full) + reg |= MDIO_EEE_1000T; + if (adv & ADVERTISED_10000baseT_Full) + reg |= MDIO_EEE_10GT; + if (adv & ADVERTISED_1000baseKX_Full) + reg |= MDIO_EEE_1000KX; + if (adv & ADVERTISED_10000baseKX4_Full) + reg |= MDIO_EEE_10GKX4; + if (adv & ADVERTISED_10000baseKR_Full) + reg |= MDIO_EEE_10GKR; + + return reg; +} +#define ethtool_adv_to_mmd_eee_adv_t(adv) __kc_ethtool_adv_to_mmd_eee_adv_t(adv) +#endif /* ethtool_adv_to_mmd_eee_adv_t */ + +#ifndef pci_pcie_type +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) ) +static inline u8 pci_pcie_type(struct pci_dev *pdev) +{ + int pos; + u16 reg16; + + pos = pci_find_capability(pdev, PCI_CAP_ID_EXP); + BUG_ON(!pos); + pci_read_config_word(pdev, pos + PCI_EXP_FLAGS, ®16); + return (reg16 & PCI_EXP_FLAGS_TYPE) >> 4; +} +#else /* < 2.6.24 */ +#define pci_pcie_type(x) (x)->pcie_type +#endif /* < 2.6.24 */ +#endif /* pci_pcie_type */ + +#if ( ! ( RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,4) ) ) && \ + ( ! ( SLE_VERSION_CODE >= SLE_VERSION(11,3,0) ) ) && \ + ( LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0) ) +#define ptp_clock_register(caps, args...) ptp_clock_register(caps) +#endif + +#ifndef pcie_capability_read_word +int __kc_pcie_capability_read_word(struct pci_dev *dev, int pos, u16 *val); +#define pcie_capability_read_word(d,p,v) __kc_pcie_capability_read_word(d,p,v) +#endif /* pcie_capability_read_word */ + +#ifndef pcie_capability_read_dword +int __kc_pcie_capability_read_dword(struct pci_dev *dev, int pos, u32 *val); +#define pcie_capability_read_dword(d,p,v) __kc_pcie_capability_read_dword(d,p,v) +#endif + +#ifndef pcie_capability_write_word +int __kc_pcie_capability_write_word(struct pci_dev *dev, int pos, u16 val); +#define pcie_capability_write_word(d,p,v) __kc_pcie_capability_write_word(d,p,v) +#endif /* pcie_capability_write_word */ + +#ifndef pcie_capability_clear_and_set_word +int __kc_pcie_capability_clear_and_set_word(struct pci_dev *dev, int pos, + u16 clear, u16 set); +#define pcie_capability_clear_and_set_word(d,p,c,s) \ + __kc_pcie_capability_clear_and_set_word(d,p,c,s) +#endif /* pcie_capability_clear_and_set_word */ + +#ifndef pcie_capability_clear_word +int __kc_pcie_capability_clear_word(struct pci_dev *dev, int pos, + u16 clear); +#define pcie_capability_clear_word(d, p, c) \ + __kc_pcie_capability_clear_word(d, p, c) +#endif /* pcie_capability_clear_word */ + +#ifndef PCI_EXP_LNKSTA2 +#define PCI_EXP_LNKSTA2 50 /* Link Status 2 */ +#endif + +#if (SLE_VERSION_CODE && SLE_VERSION_CODE >= SLE_VERSION(11,3,0)) +#define USE_CONST_DEV_UC_CHAR +#define HAVE_NDO_FDB_ADD_NLATTR +#endif + +#if !(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,8)) +#define napi_gro_flush(_napi, _flush_old) napi_gro_flush(_napi) +#endif /* !RHEL6.8+ */ + +#if (RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,6)) +#include +#else + +#define DEFINE_HASHTABLE(name, bits) \ + struct hlist_head name[1 << (bits)] = \ + { [0 ... ((1 << (bits)) - 1)] = HLIST_HEAD_INIT } + +#define DECLARE_HASHTABLE(name, bits) \ + struct hlist_head name[1 << (bits)] + +#define HASH_SIZE(name) (ARRAY_SIZE(name)) +#define HASH_BITS(name) ilog2(HASH_SIZE(name)) + +/* Use hash_32 when possible to allow for fast 32bit hashing in 64bit kernels. */ +#define hash_min(val, bits) \ + (sizeof(val) <= 4 ? hash_32(val, bits) : hash_long(val, bits)) + +static inline void __hash_init(struct hlist_head *ht, unsigned int sz) +{ + unsigned int i; + + for (i = 0; i < sz; i++) + INIT_HLIST_HEAD(&ht[i]); +} + +#define hash_init(hashtable) __hash_init(hashtable, HASH_SIZE(hashtable)) + +#define hash_add(hashtable, node, key) \ + hlist_add_head(node, &hashtable[hash_min(key, HASH_BITS(hashtable))]) + +static inline bool hash_hashed(struct hlist_node *node) +{ + return !hlist_unhashed(node); +} + +static inline bool __hash_empty(struct hlist_head *ht, unsigned int sz) +{ + unsigned int i; + + for (i = 0; i < sz; i++) + if (!hlist_empty(&ht[i])) + return false; + + return true; +} + +#define hash_empty(hashtable) __hash_empty(hashtable, HASH_SIZE(hashtable)) + +static inline void hash_del(struct hlist_node *node) +{ + hlist_del_init(node); +} +#endif /* RHEL >= 6.6 */ + +/* We don't have @flags support prior to 3.7, so we'll simply ignore the flags + * parameter on these older kernels. + */ +#define __setup_timer(_timer, _fn, _data, _flags) \ + setup_timer((_timer), (_fn), (_data)) \ + +#if ( ! ( RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,7) ) ) && \ + ( ! ( SLE_VERSION_CODE >= SLE_VERSION(12,0,0) ) ) + +#ifndef mod_delayed_work +/** + * __mod_delayed_work - modify delay or queue delayed work + * @wq: workqueue to use + * @dwork: delayed work to queue + * @delay: number of jiffies to wait before queueing + * + * Return: %true if @dwork was pending and was rescheduled; + * %false if it wasn't pending + * + * Note: the dwork parameter was declared as a void* + * to avoid comptibility problems with early 2.6 kernels + * where struct delayed_work is not declared. Unlike the original + * implementation flags are not preserved and it shouldn't be + * used in the interrupt context. + */ +static inline bool __mod_delayed_work(struct workqueue_struct *wq, + void *dwork, + unsigned long delay) +{ + bool ret = cancel_delayed_work(dwork); + queue_delayed_work(wq, dwork, delay); + return ret; +} +#define mod_delayed_work(wq, dwork, delay) __mod_delayed_work(wq, dwork, delay) +#endif /* mod_delayed_work */ + +#endif /* !(RHEL >= 6.7) && !(SLE >= 12.0) */ +#else /* >= 3.7.0 */ +#include +#define HAVE_CONST_STRUCT_PCI_ERROR_HANDLERS +#define USE_CONST_DEV_UC_CHAR +#define HAVE_NDO_FDB_ADD_NLATTR +#endif /* >= 3.7.0 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0) ) +#if (!(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,5)) && \ + !(SLE_VERSION_CODE && SLE_VERSION_CODE >= SLE_VERSION(11,4,0))) +#ifndef pci_sriov_set_totalvfs +static inline int __kc_pci_sriov_set_totalvfs(struct pci_dev __always_unused *dev, u16 __always_unused numvfs) +{ + return 0; +} +#define pci_sriov_set_totalvfs(a, b) __kc_pci_sriov_set_totalvfs((a), (b)) +#endif +#endif /* !(RHEL_RELEASE_CODE >= 6.5 && SLE_VERSION_CODE >= 11.4) */ +#ifndef PCI_EXP_LNKCTL_ASPM_L0S +#define PCI_EXP_LNKCTL_ASPM_L0S 0x01 /* L0s Enable */ +#endif +#ifndef PCI_EXP_LNKCTL_ASPM_L1 +#define PCI_EXP_LNKCTL_ASPM_L1 0x02 /* L1 Enable */ +#endif +#define HAVE_CONFIG_HOTPLUG +/* Reserved Ethernet Addresses per IEEE 802.1Q */ +static const u8 eth_reserved_addr_base[ETH_ALEN] __aligned(2) = { + 0x01, 0x80, 0xc2, 0x00, 0x00, 0x00 }; + +#ifndef is_link_local_ether_addr +static inline bool __kc_is_link_local_ether_addr(const u8 *addr) +{ + __be16 *a = (__be16 *)addr; + static const __be16 *b = (const __be16 *)eth_reserved_addr_base; + static const __be16 m = cpu_to_be16(0xfff0); + + return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | ((a[2] ^ b[2]) & m)) == 0; +} +#define is_link_local_ether_addr(addr) __kc_is_link_local_ether_addr(addr) +#endif /* is_link_local_ether_addr */ + +#ifndef FLOW_MAC_EXT +#define FLOW_MAC_EXT 0x40000000 +#endif /* FLOW_MAC_EXT */ + +#if (SLE_VERSION_CODE && SLE_VERSION_CODE >= SLE_VERSION(11,4,0)) +#define HAVE_SRIOV_CONFIGURE +#endif + +#ifndef PCI_EXP_LNKCAP_SLS_2_5GB +#define PCI_EXP_LNKCAP_SLS_2_5GB 0x00000001 /* LNKCAP2 SLS Vector bit 0 */ +#endif + +#ifndef PCI_EXP_LNKCAP_SLS_5_0GB +#define PCI_EXP_LNKCAP_SLS_5_0GB 0x00000002 /* LNKCAP2 SLS Vector bit 1 */ +#endif + +#undef PCI_EXP_LNKCAP2_SLS_2_5GB +#define PCI_EXP_LNKCAP2_SLS_2_5GB 0x00000002 /* Supported Speed 2.5GT/s */ + +#undef PCI_EXP_LNKCAP2_SLS_5_0GB +#define PCI_EXP_LNKCAP2_SLS_5_0GB 0x00000004 /* Supported Speed 5GT/s */ + +#undef PCI_EXP_LNKCAP2_SLS_8_0GB +#define PCI_EXP_LNKCAP2_SLS_8_0GB 0x00000008 /* Supported Speed 8GT/s */ + +#else /* >= 3.8.0 */ +#ifndef __devinit +#define __devinit +#endif + +#ifndef __devinitdata +#define __devinitdata +#endif + +#ifndef __devinitconst +#define __devinitconst +#endif + +#ifndef __devexit +#define __devexit +#endif + +#ifndef __devexit_p +#define __devexit_p +#endif + +#ifndef HAVE_ENCAP_CSUM_OFFLOAD +#define HAVE_ENCAP_CSUM_OFFLOAD +#endif + +#ifndef HAVE_GRE_ENCAP_OFFLOAD +#define HAVE_GRE_ENCAP_OFFLOAD +#endif + +#ifndef HAVE_SRIOV_CONFIGURE +#define HAVE_SRIOV_CONFIGURE +#endif + +#define HAVE_BRIDGE_ATTRIBS +#ifndef BRIDGE_MODE_VEB +#define BRIDGE_MODE_VEB 0 /* Default loopback mode */ +#endif /* BRIDGE_MODE_VEB */ +#ifndef BRIDGE_MODE_VEPA +#define BRIDGE_MODE_VEPA 1 /* 802.1Qbg defined VEPA mode */ +#endif /* BRIDGE_MODE_VEPA */ +#endif /* >= 3.8.0 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0) ) + +#undef BUILD_BUG_ON +#ifdef __CHECKER__ +#define BUILD_BUG_ON(condition) (0) +#else /* __CHECKER__ */ +#ifndef __compiletime_warning +#if defined(__GNUC__) && ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100) >= 40400) +#define __compiletime_warning(message) __attribute__((warning(message))) +#else /* __GNUC__ */ +#define __compiletime_warning(message) +#endif /* __GNUC__ */ +#endif /* __compiletime_warning */ +#ifndef __compiletime_error +#if defined(__GNUC__) && ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100) >= 40400) +#define __compiletime_error(message) __attribute__((error(message))) +#define __compiletime_error_fallback(condition) do { } while (0) +#else /* __GNUC__ */ +#define __compiletime_error(message) +#define __compiletime_error_fallback(condition) \ + do { ((void)sizeof(char[1 - 2 * condition])); } while (0) +#endif /* __GNUC__ */ +#else /* __compiletime_error */ +#define __compiletime_error_fallback(condition) do { } while (0) +#endif /* __compiletime_error */ +#define __compiletime_assert(condition, msg, prefix, suffix) \ + do { \ + bool __cond = !(condition); \ + extern void prefix ## suffix(void) __compiletime_error(msg); \ + if (__cond) \ + prefix ## suffix(); \ + __compiletime_error_fallback(__cond); \ + } while (0) + +#define _compiletime_assert(condition, msg, prefix, suffix) \ + __compiletime_assert(condition, msg, prefix, suffix) +#define compiletime_assert(condition, msg) \ + _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) +#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) +#ifndef __OPTIMIZE__ +#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) +#else /* __OPTIMIZE__ */ +#define BUILD_BUG_ON(condition) \ + BUILD_BUG_ON_MSG(condition, "BUILD_BUG_ON failed: " #condition) +#endif /* __OPTIMIZE__ */ +#endif /* __CHECKER__ */ + +#undef hlist_entry +#define hlist_entry(ptr, type, member) container_of(ptr,type,member) + +#undef hlist_entry_safe +#define hlist_entry_safe(ptr, type, member) \ + ({ typeof(ptr) ____ptr = (ptr); \ + ____ptr ? hlist_entry(____ptr, type, member) : NULL; \ + }) + +#undef hlist_for_each_entry +#define hlist_for_each_entry(pos, head, member) \ + for (pos = hlist_entry_safe((head)->first, typeof(*(pos)), member); \ + pos; \ + pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member)) + +#undef hlist_for_each_entry_safe +#define hlist_for_each_entry_safe(pos, n, head, member) \ + for (pos = hlist_entry_safe((head)->first, typeof(*pos), member); \ + pos && ({ n = pos->member.next; 1; }); \ + pos = hlist_entry_safe(n, typeof(*pos), member)) + +#undef hlist_for_each_entry_continue +#define hlist_for_each_entry_continue(pos, member) \ + for (pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member);\ + pos; \ + pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member)) + +#undef hlist_for_each_entry_from +#define hlist_for_each_entry_from(pos, member) \ + for (; pos; \ + pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member)) + +#undef hash_for_each +#define hash_for_each(name, bkt, obj, member) \ + for ((bkt) = 0, obj = NULL; obj == NULL && (bkt) < HASH_SIZE(name);\ + (bkt)++)\ + hlist_for_each_entry(obj, &name[bkt], member) + +#undef hash_for_each_safe +#define hash_for_each_safe(name, bkt, tmp, obj, member) \ + for ((bkt) = 0, obj = NULL; obj == NULL && (bkt) < HASH_SIZE(name);\ + (bkt)++)\ + hlist_for_each_entry_safe(obj, tmp, &name[bkt], member) + +#undef hash_for_each_possible +#define hash_for_each_possible(name, obj, member, key) \ + hlist_for_each_entry(obj, &name[hash_min(key, HASH_BITS(name))], member) + +#undef hash_for_each_possible_safe +#define hash_for_each_possible_safe(name, obj, tmp, member, key) \ + hlist_for_each_entry_safe(obj, tmp,\ + &name[hash_min(key, HASH_BITS(name))], member) + +#ifdef CONFIG_XPS +int __kc_netif_set_xps_queue(struct net_device *, const struct cpumask *, u16); +#define netif_set_xps_queue(_dev, _mask, _idx) __kc_netif_set_xps_queue((_dev), (_mask), (_idx)) +#else /* CONFIG_XPS */ +#define netif_set_xps_queue(_dev, _mask, _idx) do {} while (0) +#endif /* CONFIG_XPS */ + +#ifdef HAVE_NETDEV_SELECT_QUEUE +#define _kc_hashrnd 0xd631614b /* not so random hash salt */ +u16 __kc_netdev_pick_tx(struct net_device *dev, struct sk_buff *skb); +#define __netdev_pick_tx __kc_netdev_pick_tx +#endif /* HAVE_NETDEV_SELECT_QUEUE */ +#else +#define HAVE_BRIDGE_FILTER +#define HAVE_FDB_DEL_NLATTR +#endif /* < 3.9.0 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) ) +#ifndef NAPI_POLL_WEIGHT +#define NAPI_POLL_WEIGHT 64 +#endif +#ifdef CONFIG_PCI_IOV +int __kc_pci_vfs_assigned(struct pci_dev *dev); +#else +static inline int __kc_pci_vfs_assigned(struct pci_dev __always_unused *dev) +{ + return 0; +} +#endif +#define pci_vfs_assigned(dev) __kc_pci_vfs_assigned(dev) + +#ifndef list_first_entry_or_null +#define list_first_entry_or_null(ptr, type, member) \ + (!list_empty(ptr) ? list_first_entry(ptr, type, member) : NULL) +#endif + +#ifndef VLAN_TX_COOKIE_MAGIC +static inline struct sk_buff *__kc__vlan_hwaccel_put_tag(struct sk_buff *skb, + u16 vlan_tci) +{ +#ifdef VLAN_TAG_PRESENT + vlan_tci |= VLAN_TAG_PRESENT; +#endif + skb->vlan_tci = vlan_tci; + return skb; +} +#define __vlan_hwaccel_put_tag(skb, vlan_proto, vlan_tci) \ + __kc__vlan_hwaccel_put_tag(skb, vlan_tci) +#endif + +#ifdef HAVE_FDB_OPS +#if defined(HAVE_NDO_FDB_ADD_NLATTR) +int __kc_ndo_dflt_fdb_add(struct ndmsg *ndm, struct nlattr *tb[], + struct net_device *dev, + const unsigned char *addr, u16 flags); +#elif defined(USE_CONST_DEV_UC_CHAR) +int __kc_ndo_dflt_fdb_add(struct ndmsg *ndm, struct net_device *dev, + const unsigned char *addr, u16 flags); +#else +int __kc_ndo_dflt_fdb_add(struct ndmsg *ndm, struct net_device *dev, + unsigned char *addr, u16 flags); +#endif /* HAVE_NDO_FDB_ADD_NLATTR */ +#if defined(HAVE_FDB_DEL_NLATTR) +int __kc_ndo_dflt_fdb_del(struct ndmsg *ndm, struct nlattr *tb[], + struct net_device *dev, + const unsigned char *addr); +#elif defined(USE_CONST_DEV_UC_CHAR) +int __kc_ndo_dflt_fdb_del(struct ndmsg *ndm, struct net_device *dev, + const unsigned char *addr); +#else +int __kc_ndo_dflt_fdb_del(struct ndmsg *ndm, struct net_device *dev, + unsigned char *addr); +#endif /* HAVE_FDB_DEL_NLATTR */ +#define ndo_dflt_fdb_add __kc_ndo_dflt_fdb_add +#define ndo_dflt_fdb_del __kc_ndo_dflt_fdb_del +#endif /* HAVE_FDB_OPS */ + +#ifndef PCI_DEVID +#define PCI_DEVID(bus, devfn) ((((u16)(bus)) << 8) | (devfn)) +#endif + +/* The definitions for these functions when CONFIG_OF_NET is defined are + * pulled in from . For kernels older than 3.5 we already have + * backports for when CONFIG_OF_NET is true. These are separated and + * duplicated in order to cover all cases so that all kernels get either the + * real definitions (when CONFIG_OF_NET is defined) or the stub definitions + * (when CONFIG_OF_NET is not defined, or the kernel is too old to have real + * definitions). + */ +#ifndef CONFIG_OF_NET +static inline int of_get_phy_mode(struct device_node __always_unused *np) +{ + return -ENODEV; +} + +static inline const void * +of_get_mac_address(struct device_node __always_unused *np) +{ + return NULL; +} +#endif + +#else /* >= 3.10.0 */ +#define HAVE_ENCAP_TSO_OFFLOAD +#define USE_DEFAULT_FDB_DEL_DUMP +#define HAVE_SKB_INNER_NETWORK_HEADER + +#if (RHEL_RELEASE_CODE && \ + (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,0))) +#if (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(8,0)) +#define HAVE_RHEL7_PCI_DRIVER_RH +#if (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,2)) +#define HAVE_RHEL7_PCI_RESET_NOTIFY +#endif /* RHEL >= 7.2 */ +#if (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,3)) +#if (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(7,5)) +#define HAVE_GENEVE_RX_OFFLOAD +#endif /* RHEL < 7.5 */ +#define HAVE_ETHTOOL_FLOW_UNION_IP6_SPEC +#define HAVE_RHEL7_NET_DEVICE_OPS_EXT +#if !defined(HAVE_UDP_ENC_TUNNEL) && IS_ENABLED(CONFIG_GENEVE) +#define HAVE_UDP_ENC_TUNNEL +#endif /* !HAVE_UDP_ENC_TUNNEL && CONFIG_GENEVE */ +#endif /* RHEL >= 7.3 */ + +/* new hooks added to net_device_ops_extended in RHEL7.4 */ +#if (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,4)) +#define HAVE_RHEL7_NETDEV_OPS_EXT_NDO_SET_VF_VLAN +#define HAVE_RHEL7_NETDEV_OPS_EXT_NDO_UDP_TUNNEL +#define HAVE_UDP_ENC_RX_OFFLOAD +#endif /* RHEL >= 7.4 */ +#else /* RHEL >= 8.0 */ +#define HAVE_TCF_BLOCK_CB_REGISTER_EXTACK +#define NO_NETDEV_BPF_PROG_ATTACHED +#define HAVE_NDO_SELECT_QUEUE_SB_DEV +#endif /* RHEL >= 8.0 */ +#endif /* RHEL >= 7.0 */ +#endif /* >= 3.10.0 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0) ) +#define netdev_notifier_info_to_dev(ptr) ptr +#ifndef time_in_range64 +#define time_in_range64(a, b, c) \ + (time_after_eq64(a, b) && \ + time_before_eq64(a, c)) +#endif /* time_in_range64 */ +#if ((RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,6)) ||\ + (SLE_VERSION_CODE && SLE_VERSION_CODE >= SLE_VERSION(11,4,0))) +#define HAVE_NDO_SET_VF_LINK_STATE +#endif +#if RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(7,2)) +#define HAVE_NDO_SELECT_QUEUE_ACCEL_FALLBACK +#endif +#else /* >= 3.11.0 */ +#define HAVE_NDO_SET_VF_LINK_STATE +#define HAVE_SKB_INNER_PROTOCOL +#define HAVE_MPLS_FEATURES +#endif /* >= 3.11.0 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,12,0) ) +int __kc_pcie_get_minimum_link(struct pci_dev *dev, enum pci_bus_speed *speed, + enum pcie_link_width *width); +#ifndef pcie_get_minimum_link +#define pcie_get_minimum_link(_p, _s, _w) __kc_pcie_get_minimum_link(_p, _s, _w) +#endif + +#if (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(6,7)) +int _kc_pci_wait_for_pending_transaction(struct pci_dev *dev); +#define pci_wait_for_pending_transaction _kc_pci_wait_for_pending_transaction +#endif /* = 3.12.0 */ +#if ( SLE_VERSION_CODE && SLE_VERSION_CODE >= SLE_VERSION(12,0,0)) +#define HAVE_NDO_SELECT_QUEUE_ACCEL_FALLBACK +#endif +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,8,0) ) +#define HAVE_VXLAN_RX_OFFLOAD +#if !defined(HAVE_UDP_ENC_TUNNEL) && IS_ENABLED(CONFIG_VXLAN) +#define HAVE_UDP_ENC_TUNNEL +#endif +#endif /* < 4.8.0 */ +#define HAVE_NDO_GET_PHYS_PORT_ID +#define HAVE_NETIF_SET_XPS_QUEUE_CONST_MASK +#endif /* >= 3.12.0 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,13,0) ) +#define dma_set_mask_and_coherent(_p, _m) __kc_dma_set_mask_and_coherent(_p, _m) +int __kc_dma_set_mask_and_coherent(struct device *dev, u64 mask); +#ifndef u64_stats_init +#define u64_stats_init(a) do { } while(0) +#endif +#undef BIT_ULL +#define BIT_ULL(n) (1ULL << (n)) + +#if (!(SLE_VERSION_CODE && SLE_VERSION_CODE >= SLE_VERSION(12,0,0)) && \ + !(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,0))) +static inline struct pci_dev *pci_upstream_bridge(struct pci_dev *dev) +{ + dev = pci_physfn(dev); + if (pci_is_root_bus(dev->bus)) + return NULL; + + return dev->bus->self; +} +#endif + +#if (SLE_VERSION_CODE && SLE_VERSION_CODE >= SLE_VERSION(12,1,0)) +#undef HAVE_STRUCT_PAGE_PFMEMALLOC +#define HAVE_DCBNL_OPS_SETAPP_RETURN_INT +#endif +#ifndef list_next_entry +#define list_next_entry(pos, member) \ + list_entry((pos)->member.next, typeof(*(pos)), member) +#endif +#ifndef list_prev_entry +#define list_prev_entry(pos, member) \ + list_entry((pos)->member.prev, typeof(*(pos)), member) +#endif + +#if ( LINUX_VERSION_CODE > KERNEL_VERSION(2,6,20) ) +#define devm_kcalloc(dev, cnt, size, flags) \ + devm_kzalloc(dev, cnt * size, flags) +#endif /* > 2.6.20 */ + +#if (!(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,2))) +#define list_last_entry(ptr, type, member) list_entry((ptr)->prev, type, member) +#endif + +#if (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(7,0)) +bool _kc_pci_device_is_present(struct pci_dev *pdev); +#define pci_device_is_present _kc_pci_device_is_present +#endif /* = 3.13.0 */ +#define HAVE_VXLAN_CHECKS +#if (UBUNTU_VERSION_CODE && UBUNTU_VERSION_CODE >= UBUNTU_VERSION(3,13,0,24)) +#define HAVE_NDO_SELECT_QUEUE_ACCEL_FALLBACK +#else +#define HAVE_NDO_SELECT_QUEUE_ACCEL +#endif +#define HAVE_HWMON_DEVICE_REGISTER_WITH_GROUPS +#endif + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0) ) + +#ifndef U16_MAX +#define U16_MAX ((u16)~0U) +#endif + +#ifndef U32_MAX +#define U32_MAX ((u32)~0U) +#endif + +#ifndef U64_MAX +#define U64_MAX ((u64)~0ULL) +#endif + +#if (!(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,2))) +#define dev_consume_skb_any(x) dev_kfree_skb_any(x) +#define dev_consume_skb_irq(x) dev_kfree_skb_irq(x) +#endif + +#if (!(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,0)) && \ + !(SLE_VERSION_CODE && SLE_VERSION_CODE >= SLE_VERSION(12,0,0))) + +/* it isn't expected that this would be a #define unless we made it so */ +#ifndef skb_set_hash + +#define PKT_HASH_TYPE_NONE 0 +#define PKT_HASH_TYPE_L2 1 +#define PKT_HASH_TYPE_L3 2 +#define PKT_HASH_TYPE_L4 3 + +enum _kc_pkt_hash_types { + _KC_PKT_HASH_TYPE_NONE = PKT_HASH_TYPE_NONE, + _KC_PKT_HASH_TYPE_L2 = PKT_HASH_TYPE_L2, + _KC_PKT_HASH_TYPE_L3 = PKT_HASH_TYPE_L3, + _KC_PKT_HASH_TYPE_L4 = PKT_HASH_TYPE_L4, +}; +#define pkt_hash_types _kc_pkt_hash_types + +#define skb_set_hash __kc_skb_set_hash +static inline void __kc_skb_set_hash(struct sk_buff __maybe_unused *skb, + u32 __maybe_unused hash, + int __maybe_unused type) +{ +#ifdef HAVE_SKB_L4_RXHASH + skb->l4_rxhash = (type == PKT_HASH_TYPE_L4); +#endif +#ifdef NETIF_F_RXHASH + skb->rxhash = hash; +#endif +} +#endif /* !skb_set_hash */ + +#else /* RHEL_RELEASE_CODE >= 7.0 || SLE_VERSION_CODE >= 12.0 */ + +#if ((RHEL_RELEASE_CODE && RHEL_RELEASE_CODE <= RHEL_RELEASE_VERSION(7,0)) ||\ + (SLE_VERSION_CODE && SLE_VERSION_CODE <= SLE_VERSION(12,1,0))) +/* GPLv2 code taken from 5.10-rc2 kernel source include/linux/pci.h, Copyright + * original authors. + */ +static inline int pci_enable_msix_exact(struct pci_dev *dev, + struct msix_entry *entries, int nvec) +{ + int rc = pci_enable_msix_range(dev, entries, nvec, nvec); + if (rc < 0) + return rc; + return 0; +} +#endif /* <=EL7.0 || <=SLES 12.1 */ +#if (!(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,5))) +#ifndef HAVE_VXLAN_RX_OFFLOAD +#define HAVE_VXLAN_RX_OFFLOAD +#endif /* HAVE_VXLAN_RX_OFFLOAD */ +#endif + +#if !defined(HAVE_UDP_ENC_TUNNEL) && IS_ENABLED(CONFIG_VXLAN) +#define HAVE_UDP_ENC_TUNNEL +#endif + +#ifndef HAVE_VXLAN_CHECKS +#define HAVE_VXLAN_CHECKS +#endif /* HAVE_VXLAN_CHECKS */ +#endif /* !(RHEL_RELEASE_CODE >= 7.0 && SLE_VERSION_CODE >= 12.0) */ + +#if ((RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,3)) ||\ + (SLE_VERSION_CODE && SLE_VERSION_CODE >= SLE_VERSION(12,0,0))) +#define HAVE_NDO_DFWD_OPS +#endif + +#ifndef pci_enable_msix_range +int __kc_pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, + int minvec, int maxvec); +#define pci_enable_msix_range __kc_pci_enable_msix_range +#endif + +#ifndef ether_addr_copy +#define ether_addr_copy __kc_ether_addr_copy +static inline void __kc_ether_addr_copy(u8 *dst, const u8 *src) +{ +#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) + *(u32 *)dst = *(const u32 *)src; + *(u16 *)(dst + 4) = *(const u16 *)(src + 4); +#else + u16 *a = (u16 *)dst; + const u16 *b = (const u16 *)src; + + a[0] = b[0]; + a[1] = b[1]; + a[2] = b[2]; +#endif +} +#endif /* ether_addr_copy */ +int __kc_ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset, + int target, unsigned short *fragoff, int *flags); +#define ipv6_find_hdr(a, b, c, d, e) __kc_ipv6_find_hdr((a), (b), (c), (d), (e)) + +#ifndef OPTIMIZE_HIDE_VAR +#ifdef __GNUC__ +#define OPTIMIZER_HIDE_VAR(var) __asm__ ("" : "=r" (var) : "0" (var)) +#else +#include +#define OPTIMIZE_HIDE_VAR(var) barrier() +#endif +#endif + +#if (!(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(7,0)) && \ + !(SLE_VERSION_CODE && SLE_VERSION_CODE >= SLE_VERSION(10,4,0))) +static inline __u32 skb_get_hash_raw(const struct sk_buff *skb) +{ +#ifdef NETIF_F_RXHASH + return skb->rxhash; +#else + return 0; +#endif /* NETIF_F_RXHASH */ +} +#endif /* !RHEL > 5.9 && !SLES >= 10.4 */ + +#if (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(7,5)) +#define request_firmware_direct request_firmware +#endif /* !RHEL || RHEL < 7.5 */ + +#else /* >= 3.14.0 */ + +/* for ndo_dfwd_ ops add_station, del_station and _start_xmit */ +#ifndef HAVE_NDO_DFWD_OPS +#define HAVE_NDO_DFWD_OPS +#endif +#define HAVE_NDO_SELECT_QUEUE_ACCEL_FALLBACK +#endif /* 3.14.0 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,15,0) ) +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35) ) +#define HAVE_SKBUFF_RXHASH +#endif /* >= 2.6.35 */ +#if (!(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(7,1)) && \ + !(UBUNTU_VERSION_CODE && UBUNTU_VERSION_CODE >= UBUNTU_VERSION(3,13,0,30))) +#define u64_stats_fetch_begin_irq u64_stats_fetch_begin_bh +#define u64_stats_fetch_retry_irq u64_stats_fetch_retry_bh +#endif + +char *_kc_devm_kstrdup(struct device *dev, const char *s, gfp_t gfp); +#define devm_kstrdup(dev, s, gfp) _kc_devm_kstrdup(dev, s, gfp) + +#else /* >= 3.15.0 */ +#define HAVE_NET_GET_RANDOM_ONCE +#define HAVE_PTP_1588_CLOCK_PINS +#define HAVE_NETDEV_PORT +#endif /* 3.15.0 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,16,0) ) +#ifndef smp_mb__before_atomic +#define smp_mb__before_atomic() smp_mb() +#define smp_mb__after_atomic() smp_mb() +#endif +#ifndef __dev_uc_sync +#ifdef HAVE_SET_RX_MODE +#ifdef NETDEV_HW_ADDR_T_UNICAST +int __kc_hw_addr_sync_dev(struct netdev_hw_addr_list *list, + struct net_device *dev, + int (*sync)(struct net_device *, const unsigned char *), + int (*unsync)(struct net_device *, const unsigned char *)); +void __kc_hw_addr_unsync_dev(struct netdev_hw_addr_list *list, + struct net_device *dev, + int (*unsync)(struct net_device *, const unsigned char *)); +#endif +#ifndef NETDEV_HW_ADDR_T_MULTICAST +int __kc_dev_addr_sync_dev(struct dev_addr_list **list, int *count, + struct net_device *dev, + int (*sync)(struct net_device *, const unsigned char *), + int (*unsync)(struct net_device *, const unsigned char *)); +void __kc_dev_addr_unsync_dev(struct dev_addr_list **list, int *count, + struct net_device *dev, + int (*unsync)(struct net_device *, const unsigned char *)); +#endif +#endif /* HAVE_SET_RX_MODE */ + +static inline int __kc_dev_uc_sync(struct net_device __maybe_unused *dev, + int __maybe_unused (*sync)(struct net_device *, const unsigned char *), + int __maybe_unused (*unsync)(struct net_device *, const unsigned char *)) +{ +#ifdef NETDEV_HW_ADDR_T_UNICAST + return __kc_hw_addr_sync_dev(&dev->uc, dev, sync, unsync); +#elif defined(HAVE_SET_RX_MODE) + return __kc_dev_addr_sync_dev(&dev->uc_list, &dev->uc_count, + dev, sync, unsync); +#else + return 0; +#endif +} +#define __dev_uc_sync __kc_dev_uc_sync + +static inline void __kc_dev_uc_unsync(struct net_device __maybe_unused *dev, + int __maybe_unused (*unsync)(struct net_device *, const unsigned char *)) +{ +#ifdef HAVE_SET_RX_MODE +#ifdef NETDEV_HW_ADDR_T_UNICAST + __kc_hw_addr_unsync_dev(&dev->uc, dev, unsync); +#else /* NETDEV_HW_ADDR_T_MULTICAST */ + __kc_dev_addr_unsync_dev(&dev->uc_list, &dev->uc_count, dev, unsync); +#endif /* NETDEV_HW_ADDR_T_UNICAST */ +#endif /* HAVE_SET_RX_MODE */ +} +#define __dev_uc_unsync __kc_dev_uc_unsync + +static inline int __kc_dev_mc_sync(struct net_device __maybe_unused *dev, + int __maybe_unused (*sync)(struct net_device *, const unsigned char *), + int __maybe_unused (*unsync)(struct net_device *, const unsigned char *)) +{ +#ifdef NETDEV_HW_ADDR_T_MULTICAST + return __kc_hw_addr_sync_dev(&dev->mc, dev, sync, unsync); +#elif defined(HAVE_SET_RX_MODE) + return __kc_dev_addr_sync_dev(&dev->mc_list, &dev->mc_count, + dev, sync, unsync); +#else + return 0; +#endif + +} +#define __dev_mc_sync __kc_dev_mc_sync + +static inline void __kc_dev_mc_unsync(struct net_device __maybe_unused *dev, + int __maybe_unused (*unsync)(struct net_device *, const unsigned char *)) +{ +#ifdef HAVE_SET_RX_MODE +#ifdef NETDEV_HW_ADDR_T_MULTICAST + __kc_hw_addr_unsync_dev(&dev->mc, dev, unsync); +#else /* NETDEV_HW_ADDR_T_MULTICAST */ + __kc_dev_addr_unsync_dev(&dev->mc_list, &dev->mc_count, dev, unsync); +#endif /* NETDEV_HW_ADDR_T_MULTICAST */ +#endif /* HAVE_SET_RX_MODE */ +} +#define __dev_mc_unsync __kc_dev_mc_unsync +#endif /* __dev_uc_sync */ + +#if RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(7,1)) +#define HAVE_NDO_SET_VF_MIN_MAX_TX_RATE +#endif + +#ifndef NETIF_F_GSO_UDP_TUNNEL_CSUM +/* if someone backports this, hopefully they backport as a #define. + * declare it as zero on older kernels so that if it get's or'd in + * it won't effect anything, therefore preventing core driver changes + */ +#define NETIF_F_GSO_UDP_TUNNEL_CSUM 0 +#define SKB_GSO_UDP_TUNNEL_CSUM 0 +#endif +void *__kc_devm_kmemdup(struct device *dev, const void *src, size_t len, + gfp_t gfp); +#define devm_kmemdup __kc_devm_kmemdup + +#else +#if ( ( LINUX_VERSION_CODE < KERNEL_VERSION(4,13,0) ) && \ + ! ( SLE_VERSION_CODE && ( SLE_VERSION_CODE >= SLE_VERSION(12,4,0)) ) ) +#define HAVE_PCI_ERROR_HANDLER_RESET_NOTIFY +#endif /* >= 3.16.0 && < 4.13.0 && !(SLES >= 12sp4) */ +#define HAVE_NDO_SET_VF_MIN_MAX_TX_RATE +#endif /* 3.16.0 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,17,0) ) +#if !(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,8) && \ + RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(7,0)) && \ + !(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,2)) +#ifndef timespec64 +#define timespec64 timespec +static inline struct timespec64 timespec_to_timespec64(const struct timespec ts) +{ + return ts; +} +static inline struct timespec timespec64_to_timespec(const struct timespec64 ts64) +{ + return ts64; +} +#define timespec64_equal timespec_equal +#define timespec64_compare timespec_compare +#define set_normalized_timespec64 set_normalized_timespec +#define timespec64_add_safe timespec_add_safe +#define timespec64_add timespec_add +#define timespec64_sub timespec_sub +#define timespec64_valid timespec_valid +#define timespec64_valid_strict timespec_valid_strict +#define timespec64_to_ns timespec_to_ns +#define ns_to_timespec64 ns_to_timespec +#define ktime_to_timespec64 ktime_to_timespec +#define ktime_get_ts64 ktime_get_ts +#define ktime_get_real_ts64 ktime_get_real_ts +#define timespec64_add_ns timespec_add_ns +#endif /* timespec64 */ +#endif /* !(RHEL6.8= RHEL_RELEASE_VERSION(6,8) && \ + RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(7,0)) +static inline void ktime_get_real_ts64(struct timespec64 *ts) +{ + *ts = ktime_to_timespec64(ktime_get_real()); +} + +static inline void ktime_get_ts64(struct timespec64 *ts) +{ + *ts = ktime_to_timespec64(ktime_get()); +} +#endif + +#if !(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,4)) +#define hlist_add_behind(_a, _b) hlist_add_after(_b, _a) +#endif + +#if (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(7,5)) +#endif /* RHEL_RELEASE_CODE < RHEL7.5 */ + +#if RHEL_RELEASE_CODE && \ + RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(6,3) && \ + RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(7,3) +static inline u64 ktime_get_ns(void) +{ + return ktime_to_ns(ktime_get()); +} + +static inline u64 ktime_get_real_ns(void) +{ + return ktime_to_ns(ktime_get_real()); +} + +static inline u64 ktime_get_boot_ns(void) +{ + return ktime_to_ns(ktime_get_boottime()); +} +#endif /* RHEL < 7.3 */ + +#else +#define HAVE_DCBNL_OPS_SETAPP_RETURN_INT +#include +#define HAVE_RHASHTABLE +#endif /* 3.17.0 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,18,0) ) +#ifndef NO_PTP_SUPPORT +#include +struct sk_buff *__kc_skb_clone_sk(struct sk_buff *skb); +void __kc_skb_complete_tx_timestamp(struct sk_buff *skb, + struct skb_shared_hwtstamps *hwtstamps); +#define skb_clone_sk __kc_skb_clone_sk +#define skb_complete_tx_timestamp __kc_skb_complete_tx_timestamp +#endif +#if (!(RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,2)))) +u32 __kc_eth_get_headlen(const struct net_device *dev, unsigned char *data, + unsigned int max_len); +#else +unsigned int __kc_eth_get_headlen(unsigned char *data, unsigned int max_len); +#endif /* !RHEL >= 8.2 */ + +#define eth_get_headlen __kc_eth_get_headlen +#ifndef ETH_P_XDSA +#define ETH_P_XDSA 0x00F8 +#endif +/* RHEL 7.1 backported csum_level, but SLES 12 and 12-SP1 did not */ +#if RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,1)) +#define HAVE_SKBUFF_CSUM_LEVEL +#endif /* >= RH 7.1 */ + +/* RHEL 7.3 backported xmit_more */ +#if (RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,3)) +#define HAVE_SKB_XMIT_MORE +#endif /* >= RH 7.3 */ + +#undef GENMASK +#define GENMASK(h, l) \ + (((~0UL) << (l)) & (~0UL >> (BITS_PER_LONG - 1 - (h)))) +#undef GENMASK_ULL +#define GENMASK_ULL(h, l) \ + (((~0ULL) << (l)) & (~0ULL >> (BITS_PER_LONG_LONG - 1 - (h)))) + +#else /* 3.18.0 */ +#define HAVE_SKBUFF_CSUM_LEVEL +#define HAVE_SKB_XMIT_MORE +#define HAVE_SKB_INNER_PROTOCOL_TYPE +#endif /* 3.18.0 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,18,4) ) +#else +#define HAVE_NDO_FEATURES_CHECK +#endif /* 3.18.4 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,18,13) ) +#ifndef WRITE_ONCE +#define WRITE_ONCE(x, val) ({ ACCESS_ONCE(x) = (val); }) +#endif +#endif /* 3.18.13 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0) ) +/* netdev_phys_port_id renamed to netdev_phys_item_id */ +#define netdev_phys_item_id netdev_phys_port_id + +static inline void _kc_napi_complete_done(struct napi_struct *napi, + int __always_unused work_done) { + napi_complete(napi); +} +/* don't use our backport if the distro kernels already have it */ +#if (SLE_VERSION_CODE && (SLE_VERSION_CODE < SLE_VERSION(12,3,0))) || \ + (RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(7,5))) +#define napi_complete_done _kc_napi_complete_done +#endif + +int _kc_bitmap_print_to_pagebuf(bool list, char *buf, + const unsigned long *maskp, int nmaskbits); +#define bitmap_print_to_pagebuf _kc_bitmap_print_to_pagebuf + +#ifndef NETDEV_RSS_KEY_LEN +#define NETDEV_RSS_KEY_LEN (13 * 4) +#endif +#if (!(RHEL_RELEASE_CODE && \ + ((RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,7) && RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(7,0)) || \ + (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,2))))) +#define netdev_rss_key_fill(buffer, len) __kc_netdev_rss_key_fill(buffer, len) +#endif /* RHEL_RELEASE_CODE */ +void __kc_netdev_rss_key_fill(void *buffer, size_t len); +#define SPEED_20000 20000 +#define SPEED_40000 40000 +#ifndef dma_rmb +#define dma_rmb() rmb() +#endif +#ifndef dev_alloc_pages +#ifndef NUMA_NO_NODE +#define NUMA_NO_NODE -1 +#endif +#define dev_alloc_pages(_order) alloc_pages_node(NUMA_NO_NODE, (GFP_ATOMIC | __GFP_COLD | __GFP_COMP | __GFP_MEMALLOC), (_order)) +#endif +#ifndef dev_alloc_page +#define dev_alloc_page() dev_alloc_pages(0) +#endif +#if !defined(eth_skb_pad) && !defined(skb_put_padto) +/** + * __kc_skb_put_padto - increase size and pad an skbuff up to a minimal size + * @skb: buffer to pad + * @len: minimal length + * + * Pads up a buffer to ensure the trailing bytes exist and are + * blanked. If the buffer already contains sufficient data it + * is untouched. Otherwise it is extended. Returns zero on + * success. The skb is freed on error. + */ +static inline int __kc_skb_put_padto(struct sk_buff *skb, unsigned int len) +{ + unsigned int size = skb->len; + + if (unlikely(size < len)) { + len -= size; + if (skb_pad(skb, len)) + return -ENOMEM; + __skb_put(skb, len); + } + return 0; +} +#define skb_put_padto(skb, len) __kc_skb_put_padto(skb, len) + +static inline int __kc_eth_skb_pad(struct sk_buff *skb) +{ + return __kc_skb_put_padto(skb, ETH_ZLEN); +} +#define eth_skb_pad(skb) __kc_eth_skb_pad(skb) +#endif /* eth_skb_pad && skb_put_padto */ + +#ifndef SKB_ALLOC_NAPI +/* RHEL 7.2 backported napi_alloc_skb and friends */ +static inline struct sk_buff *__kc_napi_alloc_skb(struct napi_struct *napi, unsigned int length) +{ + return netdev_alloc_skb_ip_align(napi->dev, length); +} +#define napi_alloc_skb(napi,len) __kc_napi_alloc_skb(napi,len) +#define __napi_alloc_skb(napi,len,mask) __kc_napi_alloc_skb(napi,len) +#endif /* SKB_ALLOC_NAPI */ +#define HAVE_CONFIG_PM_RUNTIME +#if (RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(6,7)) && \ + (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(7,0))) +#define HAVE_RXFH_HASHFUNC +#endif /* 6.7 < RHEL < 7.0 */ +#if RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(7,1)) +#define HAVE_RXFH_HASHFUNC +#define NDO_DFLT_BRIDGE_GETLINK_HAS_BRFLAGS +#endif /* RHEL > 7.1 */ +#ifndef napi_schedule_irqoff +#define napi_schedule_irqoff napi_schedule +#endif +#ifndef READ_ONCE +#define READ_ONCE(_x) ACCESS_ONCE(_x) +#endif +#if RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(7,2)) +#define HAVE_NDO_FDB_ADD_VID +#endif +#ifndef ETH_MODULE_SFF_8636 +#define ETH_MODULE_SFF_8636 0x3 +#endif +#ifndef ETH_MODULE_SFF_8636_LEN +#define ETH_MODULE_SFF_8636_LEN 256 +#endif +#ifndef ETH_MODULE_SFF_8436 +#define ETH_MODULE_SFF_8436 0x4 +#endif +#ifndef ETH_MODULE_SFF_8436_LEN +#define ETH_MODULE_SFF_8436_LEN 256 +#endif +#ifndef writel_relaxed +#define writel_relaxed writel +#endif +#else /* 3.19.0 */ +#define HAVE_NDO_FDB_ADD_VID +#define HAVE_RXFH_HASHFUNC +#define NDO_DFLT_BRIDGE_GETLINK_HAS_BRFLAGS +#endif /* 3.19.0 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,20,0) ) +/* vlan_tx_xx functions got renamed to skb_vlan */ +#ifndef skb_vlan_tag_get +#define skb_vlan_tag_get vlan_tx_tag_get +#endif +#ifndef skb_vlan_tag_present +#define skb_vlan_tag_present vlan_tx_tag_present +#endif +#if RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(7,1)) +#define HAVE_INCLUDE_LINUX_TIMECOUNTER_H +#endif +#if RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(7,2)) +#define HAVE_NDO_BRIDGE_SET_DEL_LINK_FLAGS +#endif +#else +#define HAVE_INCLUDE_LINUX_TIMECOUNTER_H +#define HAVE_NDO_BRIDGE_SET_DEL_LINK_FLAGS +#endif /* 3.20.0 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) +/* Definition for CONFIG_OF was introduced earlier */ +#if !defined(CONFIG_OF) && \ + !(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(7,2)) +static inline struct device_node * +pci_device_to_OF_node(const struct pci_dev __always_unused *pdev) { return NULL; } +#else /* !CONFIG_OF && RHEL < 7.3 */ +#define HAVE_DDP_PROFILE_UPLOAD_SUPPORT +#endif /* !CONFIG_OF && RHEL < 7.3 */ +#else /* < 4.0 */ +#define HAVE_DDP_PROFILE_UPLOAD_SUPPORT +#endif /* < 4.0 */ + +/*****************************************************************************/ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,1,0) ) +#ifndef NO_PTP_SUPPORT +#ifdef HAVE_INCLUDE_LINUX_TIMECOUNTER_H +#include +#else +#include +#endif +static inline void __kc_timecounter_adjtime(struct timecounter *tc, s64 delta) +{ + tc->nsec += delta; +} + +static inline struct net_device * +of_find_net_device_by_node(struct device_node __always_unused *np) +{ + return NULL; +} + +#define timecounter_adjtime __kc_timecounter_adjtime +#endif +#if ((RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,2))) || \ + (SLE_VERSION_CODE && (SLE_VERSION_CODE >= SLE_VERSION(12,2,0)))) +#define HAVE_NDO_SET_VF_RSS_QUERY_EN +#endif +#if RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(7,2)) +#define HAVE_NDO_BRIDGE_GETLINK_NLFLAGS +#define HAVE_RHEL7_EXTENDED_NDO_SET_TX_MAXRATE +#define HAVE_NDO_SET_TX_MAXRATE +#endif +#if !((RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(6,8) && RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(7,0)) && \ + (RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(7,2)) && \ + (SLE_VERSION_CODE > SLE_VERSION(12,1,0))) +unsigned int _kc_cpumask_local_spread(unsigned int i, int node); +#define cpumask_local_spread _kc_cpumask_local_spread +#endif +#ifdef HAVE_RHASHTABLE +#define rhashtable_loopup_fast(ht, key, params) \ + do { \ + (void)params; \ + rhashtable_lookup((ht), (key)); \ + } while (0) + +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0) ) +#define rhashtable_insert_fast(ht, obj, params) \ + do { \ + (void)params; \ + rhashtable_insert((ht), (obj), GFP_KERNEL); \ + } while (0) + +#define rhashtable_remove_fast(ht, obj, params) \ + do { \ + (void)params; \ + rhashtable_remove((ht), (obj), GFP_KERNEL); \ + } while (0) + +#else /* >= 3,19,0 */ +#define rhashtable_insert_fast(ht, obj, params) \ + do { \ + (void)params; \ + rhashtable_insert((ht), (obj)); \ + } while (0) + +#define rhashtable_remove_fast(ht, obj, params) \ + do { \ + (void)params; \ + rhashtable_remove((ht), (obj)); \ + } while (0) + +#endif /* 3,19,0 */ +#endif /* HAVE_RHASHTABLE */ +#else /* >= 4,1,0 */ +#define HAVE_NDO_GET_PHYS_PORT_NAME +#define HAVE_PTP_CLOCK_INFO_GETTIME64 +#define HAVE_NDO_BRIDGE_GETLINK_NLFLAGS +#define HAVE_PASSTHRU_FEATURES_CHECK +#define HAVE_NDO_SET_VF_RSS_QUERY_EN +#define HAVE_NDO_SET_TX_MAXRATE +#endif /* 4,1,0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,1,9)) +#if (!(RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(7,2)) && \ + !((SLE_VERSION_CODE == SLE_VERSION(11,3,0)) && \ + (SLE_LOCALVERSION_CODE >= SLE_LOCALVERSION(0,47,71))) && \ + !((SLE_VERSION_CODE == SLE_VERSION(11,4,0)) && \ + (SLE_LOCALVERSION_CODE >= SLE_LOCALVERSION(65,0,0))) && \ + !(SLE_VERSION_CODE >= SLE_VERSION(12,1,0))) +static inline bool page_is_pfmemalloc(struct page __maybe_unused *page) +{ +#ifdef HAVE_STRUCT_PAGE_PFMEMALLOC + return page->pfmemalloc; +#else + return false; +#endif +} +#endif /* !RHEL7.2+ && !SLES11sp3(3.0.101-0.47.71+ update) && !SLES11sp4(3.0.101-65+ update) & !SLES12sp1+ */ +#else +#undef HAVE_STRUCT_PAGE_PFMEMALLOC +#endif /* 4.1.9 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,2,0)) +#if (!(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,2)) && \ + !(SLE_VERSION_CODE >= SLE_VERSION(12,1,0))) +#define ETHTOOL_RX_FLOW_SPEC_RING 0x00000000FFFFFFFFULL +#define ETHTOOL_RX_FLOW_SPEC_RING_VF 0x000000FF00000000ULL +#define ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF 32 +static inline __u64 ethtool_get_flow_spec_ring(__u64 ring_cookie) +{ + return ETHTOOL_RX_FLOW_SPEC_RING & ring_cookie; +}; + +static inline __u64 ethtool_get_flow_spec_ring_vf(__u64 ring_cookie) +{ + return (ETHTOOL_RX_FLOW_SPEC_RING_VF & ring_cookie) >> + ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF; +}; +#endif /* ! RHEL >= 7.2 && ! SLES >= 12.1 */ +#if (RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,4)) +#define HAVE_NDO_DFLT_BRIDGE_GETLINK_VLAN_SUPPORT +#endif + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,27)) +#if (!((RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,8) && \ + RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(7,0)) || \ + RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,2))) +static inline bool pci_ari_enabled(struct pci_bus *bus) +{ + return bus->self && bus->self->ari_enabled; +} +#if (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,2)) +#define HAVE_VF_STATS +#endif /* (RHEL7.2+) */ +#endif /* !(RHEL6.8+ || RHEL7.2+) */ +#else +static inline bool pci_ari_enabled(struct pci_bus *bus) +{ + return false; +} +#endif /* 2.6.27 */ +#else +#define HAVE_NDO_DFLT_BRIDGE_GETLINK_VLAN_SUPPORT +#define HAVE_VF_STATS +#endif /* 4.2.0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,3,0)) +#if (!(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,4)) && \ + !(SLE_VERSION_CODE >= SLE_VERSION(12,2,0))) +/** + * _kc_flow_dissector_key_ipv4_addrs: + * @src: source ip address + * @dst: destination ip address + */ +struct _kc_flow_dissector_key_ipv4_addrs { + __be32 src; + __be32 dst; +}; + +/** + * _kc_flow_dissector_key_ipv6_addrs: + * @src: source ip address + * @dst: destination ip address + */ +struct _kc_flow_dissector_key_ipv6_addrs { + struct in6_addr src; + struct in6_addr dst; +}; + +/** + * _kc_flow_dissector_key_addrs: + * @v4addrs: IPv4 addresses + * @v6addrs: IPv6 addresses + */ +struct _kc_flow_dissector_key_addrs { + union { + struct _kc_flow_dissector_key_ipv4_addrs v4addrs; + struct _kc_flow_dissector_key_ipv6_addrs v6addrs; + }; +}; + +/** + * _kc_flow_dissector_key_tp_ports: + * @ports: port numbers of Transport header + * src: source port number + * dst: destination port number + */ +struct _kc_flow_dissector_key_ports { + union { + __be32 ports; + struct { + __be16 src; + __be16 dst; + }; + }; +}; + +/** + * _kc_flow_dissector_key_basic: + * @n_proto: Network header protocol (eg. IPv4/IPv6) + * @ip_proto: Transport header protocol (eg. TCP/UDP) + * @padding: padding for alignment + */ +struct _kc_flow_dissector_key_basic { + __be16 n_proto; + u8 ip_proto; + u8 padding; +}; + +struct _kc_flow_keys { + struct _kc_flow_dissector_key_basic basic; + struct _kc_flow_dissector_key_ports ports; + struct _kc_flow_dissector_key_addrs addrs; +}; + +/* These are all the include files for kernels inside this #ifdef block that + * have any reference to the in kernel definition of struct flow_keys. The + * reason for putting them here is to make 100% sure that these files do not get + * included after re-defining flow_keys to _kc_flow_keys. This is done to + * prevent any possible ABI issues that this structure re-definition could case. + */ +#if ((LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0) && \ + LINUX_VERSION_CODE < KERNEL_VERSION(4,2,0)) || \ + RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6,7) || \ + SLE_VERSION_CODE >= SLE_VERSION(11,4,0)) +#include +#endif /* (>= 3.3.0 && < 4.2.0) || >= RHEL 6.7 || >= SLE 11.4 */ +#if (LINUX_VERSION_CODE == KERNEL_VERSION(4,2,0)) +#include +#endif /* 4.2.0 */ +#include +#include +#include +#include + +#define flow_keys _kc_flow_keys +bool +_kc_skb_flow_dissect_flow_keys(const struct sk_buff *skb, + struct flow_keys *flow, + unsigned int __always_unused flags); +#define skb_flow_dissect_flow_keys _kc_skb_flow_dissect_flow_keys +#endif /* ! >= RHEL 7.4 && ! >= SLES 12.2 */ + +#if ((RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,3)) || \ + (SLE_VERSION_CODE >= SLE_VERSION(12,2,0))) +#include +#endif /* >= RHEL7.3 || >= SLE12sp2 */ +#else /* >= 4.3.0 */ +#include +#endif /* 4.3.0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,4,0)) +#if (RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,3)) +#define HAVE_NDO_SET_VF_TRUST +#endif /* (RHEL_RELEASE >= 7.3) */ +#ifndef CONFIG_64BIT +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)) +#include /* 32-bit readq/writeq */ +#else /* 3.3.0 => 4.3.x */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)) +#include +#endif /* 2.6.26 => 3.3.0 */ +#ifndef readq +static inline __u64 readq(const volatile void __iomem *addr) +{ + const volatile u32 __iomem *p = addr; + u32 low, high; + + low = readl(p); + high = readl(p + 1); + + return low + ((u64)high << 32); +} +#define readq readq +#endif + +#ifndef writeq +static inline void writeq(__u64 val, volatile void __iomem *addr) +{ + writel(val, addr); + writel(val >> 32, addr + 4); +} +#define writeq writeq +#endif +#endif /* < 3.3.0 */ +#endif /* !CONFIG_64BIT */ +#else /* < 4.4.0 */ +#define HAVE_NDO_SET_VF_TRUST + +#ifndef CONFIG_64BIT +#include /* 32-bit readq/writeq */ +#endif /* !CONFIG_64BIT */ +#endif /* 4.4.0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,5,0)) +/* protect against a likely backport */ +#ifndef NETIF_F_CSUM_MASK +#define NETIF_F_CSUM_MASK NETIF_F_ALL_CSUM +#endif /* NETIF_F_CSUM_MASK */ +#if (!(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,3))) +#define eth_platform_get_mac_address _kc_eth_platform_get_mac_address +int _kc_eth_platform_get_mac_address(struct device *dev __maybe_unused, + u8 *mac_addr __maybe_unused); +#endif /* !(RHEL_RELEASE >= 7.3) */ +#else /* 4.5.0 */ +#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,8,0) ) +#define HAVE_GENEVE_RX_OFFLOAD +#if !defined(HAVE_UDP_ENC_TUNNEL) && IS_ENABLED(CONFIG_GENEVE) +#define HAVE_UDP_ENC_TUNNEL +#endif +#endif /* < 4.8.0 */ +#define HAVE_NETIF_NAPI_ADD_CALLS_NAPI_HASH_ADD +#define HAVE_NETDEV_UPPER_INFO +#endif /* 4.5.0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0)) +#if !(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(7,3)) +static inline unsigned char *skb_checksum_start(const struct sk_buff *skb) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)) + return skb->head + skb->csum_start; +#else /* < 2.6.22 */ + return skb_transport_header(skb); +#endif +} +#endif + +#if !(UBUNTU_VERSION_CODE && \ + UBUNTU_VERSION_CODE >= UBUNTU_VERSION(4,4,0,21)) && \ + !(RHEL_RELEASE_CODE && \ + (RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(7,2))) && \ + !(SLE_VERSION_CODE && (SLE_VERSION_CODE >= SLE_VERSION(12,3,0))) +static inline void napi_consume_skb(struct sk_buff *skb, + int __always_unused budget) +{ + dev_consume_skb_any(skb); +} + +#endif /* UBUNTU 4,4,0,21, RHEL 7.2, SLES12 SP3 */ +#if !(SLE_VERSION_CODE && (SLE_VERSION_CODE >= SLE_VERSION(12,3,0))) && \ + !(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,4)) +static inline void csum_replace_by_diff(__sum16 *sum, __wsum diff) +{ + * sum = csum_fold(csum_add(diff, ~csum_unfold(*sum))); +} +#endif +#if !(RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(7,2))) && \ + !(SLE_VERSION_CODE && (SLE_VERSION_CODE > SLE_VERSION(12,3,0))) +static inline void page_ref_inc(struct page *page) +{ + get_page(page); +} +#else +#define HAVE_PAGE_COUNT_BULK_UPDATE +#endif +#ifndef IPV4_USER_FLOW +#define IPV4_USER_FLOW 0x0d /* spec only (usr_ip4_spec) */ +#endif + +#if (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,4)) +#define HAVE_TC_SETUP_CLSFLOWER +#define HAVE_TC_FLOWER_ENC +#endif + +#if ((RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,7)) || \ + (SLE_VERSION_CODE >= SLE_VERSION(12,2,0))) +#define HAVE_TC_SETUP_CLSU32 +#endif + +#if (SLE_VERSION_CODE >= SLE_VERSION(12,2,0)) +#define HAVE_TC_SETUP_CLSFLOWER +#endif + +#else /* >= 4.6.0 */ +#define HAVE_PAGE_COUNT_BULK_UPDATE +#define HAVE_ETHTOOL_FLOW_UNION_IP6_SPEC +#define HAVE_PTP_CROSSTIMESTAMP +#define HAVE_TC_SETUP_CLSFLOWER +#define HAVE_TC_SETUP_CLSU32 +#endif /* 4.6.0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)) +#if ((SLE_VERSION_CODE >= SLE_VERSION(12,3,0)) ||\ + (RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,4))) +#define HAVE_NETIF_TRANS_UPDATE +#endif /* SLES12sp3+ || RHEL7.4+ */ +#if ((RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,3)) ||\ + (SLE_VERSION_CODE >= SLE_VERSION(12,3,0))) +#define HAVE_ETHTOOL_25G_BITS +#define HAVE_ETHTOOL_50G_BITS +#define HAVE_ETHTOOL_100G_BITS +#endif /* RHEL7.3+ || SLES12sp3+ */ +#else /* 4.7.0 */ +#define HAVE_NETIF_TRANS_UPDATE +#define HAVE_ETHTOOL_CONVERT_U32_AND_LINK_MODE +#define HAVE_ETHTOOL_25G_BITS +#define HAVE_ETHTOOL_50G_BITS +#define HAVE_ETHTOOL_100G_BITS +#define HAVE_TCF_MIRRED_REDIRECT +#endif /* 4.7.0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,8,0)) +#if !(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,4)) +enum udp_parsable_tunnel_type { + UDP_TUNNEL_TYPE_VXLAN, + UDP_TUNNEL_TYPE_GENEVE, +}; +struct udp_tunnel_info { + unsigned short type; + sa_family_t sa_family; + __be16 port; +}; +#endif + +#if (RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,5)) +#define HAVE_TCF_EXTS_TO_LIST +#endif + +#if (UBUNTU_VERSION_CODE && UBUNTU_VERSION_CODE < UBUNTU_VERSION(4,8,0,0)) +#define tc_no_actions(_exts) true +#define tc_for_each_action(_a, _exts) while (0) +#endif +#if !(SLE_VERSION_CODE && (SLE_VERSION_CODE >= SLE_VERSION(12,3,0))) &&\ + !(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,4)) +static inline int +#ifdef HAVE_NON_CONST_PCI_DRIVER_NAME +pci_request_io_regions(struct pci_dev *pdev, char *name) +#else +pci_request_io_regions(struct pci_dev *pdev, const char *name) +#endif +{ + return pci_request_selected_regions(pdev, + pci_select_bars(pdev, IORESOURCE_IO), name); +} + +static inline void +pci_release_io_regions(struct pci_dev *pdev) +{ + return pci_release_selected_regions(pdev, + pci_select_bars(pdev, IORESOURCE_IO)); +} + +static inline int +#ifdef HAVE_NON_CONST_PCI_DRIVER_NAME +pci_request_mem_regions(struct pci_dev *pdev, char *name) +#else +pci_request_mem_regions(struct pci_dev *pdev, const char *name) +#endif +{ + return pci_request_selected_regions(pdev, + pci_select_bars(pdev, IORESOURCE_MEM), name); +} + +static inline void +pci_release_mem_regions(struct pci_dev *pdev) +{ + return pci_release_selected_regions(pdev, + pci_select_bars(pdev, IORESOURCE_MEM)); +} +#endif /* !SLE_VERSION(12,3,0) */ +#if ((RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,4)) ||\ + (SLE_VERSION_CODE >= SLE_VERSION(12,3,0))) +#define HAVE_ETHTOOL_NEW_50G_BITS +#endif /* RHEL7.4+ || SLES12sp3+ */ +#else +#define HAVE_UDP_ENC_RX_OFFLOAD +#define HAVE_TCF_EXTS_TO_LIST +#define HAVE_ETHTOOL_NEW_50G_BITS +#endif /* 4.8.0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,9,0)) +#ifdef HAVE_TC_SETUP_CLSFLOWER +#if (!(RHEL_RELEASE_CODE) && !(SLE_VERSION_CODE) || \ + (SLE_VERSION_CODE && (SLE_VERSION_CODE < SLE_VERSION(12,3,0)))) +#define HAVE_TC_FLOWER_VLAN_IN_TAGS +#endif /* !RHEL_RELEASE_CODE && !SLE_VERSION_CODE || = RHEL_RELEASE_VERSION(7,4)) +#define HAVE_ETHTOOL_NEW_1G_BITS +#define HAVE_ETHTOOL_NEW_10G_BITS +#endif /* RHEL7.4+ */ +#if (!(SLE_VERSION_CODE) && !(RHEL_RELEASE_CODE)) || \ + SLE_VERSION_CODE && (SLE_VERSION_CODE <= SLE_VERSION(12,3,0)) || \ + RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE <= RHEL_RELEASE_VERSION(7,5)) +#define time_is_before_jiffies64(a) time_after64(get_jiffies_64(), a) +#endif /* !SLE_VERSION_CODE && !RHEL_RELEASE_CODE || (SLES <= 12.3.0) || (RHEL <= 7.5) */ +#if (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(7,4)) +static inline void bitmap_from_u64(unsigned long *dst, u64 mask) +{ + dst[0] = mask & ULONG_MAX; + + if (sizeof(mask) > sizeof(unsigned long)) + dst[1] = mask >> 32; +} +#endif /* = RHEL_RELEASE_VERSION(7,4)) && \ + !(SLE_VERSION_CODE >= SLE_VERSION(12,3,0)) && \ + !(UBUNTU_VERSION_CODE >= UBUNTU_VERSION(4,13,0,16))) +static inline bool eth_type_vlan(__be16 ethertype) +{ + switch (ethertype) { + case htons(ETH_P_8021Q): +#ifdef ETH_P_8021AD + case htons(ETH_P_8021AD): +#endif + return true; + default: + return false; + } +} +#endif /* Linux < 4.9 || RHEL < 7.4 || SLES < 12.3 || Ubuntu < 4.3.0-16 */ +#else /* >=4.9 */ +#define HAVE_FLOW_DISSECTOR_KEY_VLAN_PRIO +#define HAVE_ETHTOOL_NEW_1G_BITS +#define HAVE_ETHTOOL_NEW_10G_BITS +#endif /* KERNEL_VERSION(4.9.0) */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,10,0)) +/* SLES 12.3 and RHEL 7.5 backported this interface */ +#if (!SLE_VERSION_CODE && !RHEL_RELEASE_CODE) || \ + (SLE_VERSION_CODE && (SLE_VERSION_CODE < SLE_VERSION(12,3,0))) || \ + (RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(7,5))) +static inline bool _kc_napi_complete_done2(struct napi_struct *napi, + int __always_unused work_done) +{ + /* it was really hard to get napi_complete_done to be safe to call + * recursively without running into our own kcompat, so just use + * napi_complete + */ + napi_complete(napi); + + /* true means that the stack is telling the driver to go-ahead and + * re-enable interrupts + */ + return true; +} + +#ifdef napi_complete_done +#undef napi_complete_done +#endif +#define napi_complete_done _kc_napi_complete_done2 +#endif /* sles and rhel exclusion for < 4.10 */ +#if (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,4)) +#define HAVE_DEV_WALK_API +#define HAVE_ETHTOOL_NEW_2500MB_BITS +#define HAVE_ETHTOOL_5G_BITS +#endif /* RHEL7.4+ */ +#if (SLE_VERSION_CODE && (SLE_VERSION_CODE == SLE_VERSION(12,3,0))) +#define HAVE_STRUCT_DMA_ATTRS +#endif /* (SLES == 12.3.0) */ +#if (SLE_VERSION_CODE && (SLE_VERSION_CODE >= SLE_VERSION(12,3,0))) +#define HAVE_NETDEVICE_MIN_MAX_MTU +#endif /* (SLES >= 12.3.0) */ +#if (RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,5))) +#define HAVE_STRUCT_DMA_ATTRS +#define HAVE_RHEL7_EXTENDED_MIN_MAX_MTU +#define HAVE_NETDEVICE_MIN_MAX_MTU +#endif +#if (!(SLE_VERSION_CODE && (SLE_VERSION_CODE >= SLE_VERSION(12,3,0))) && \ + !(RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,5)))) +#ifndef dma_map_page_attrs +#define dma_map_page_attrs __kc_dma_map_page_attrs +static inline dma_addr_t __kc_dma_map_page_attrs(struct device *dev, + struct page *page, + size_t offset, size_t size, + enum dma_data_direction dir, + unsigned long __always_unused attrs) +{ + return dma_map_page(dev, page, offset, size, dir); +} +#endif + +#ifndef dma_unmap_page_attrs +#define dma_unmap_page_attrs __kc_dma_unmap_page_attrs +static inline void __kc_dma_unmap_page_attrs(struct device *dev, + dma_addr_t addr, size_t size, + enum dma_data_direction dir, + unsigned long __always_unused attrs) +{ + dma_unmap_page(dev, addr, size, dir); +} +#endif + +static inline void __page_frag_cache_drain(struct page *page, + unsigned int count) +{ +#ifdef HAVE_PAGE_COUNT_BULK_UPDATE + if (!page_ref_sub_and_test(page, count)) + return; + + init_page_count(page); +#else + BUG_ON(count > 1); + if (!count) + return; +#endif + __free_pages(page, compound_order(page)); +} +#endif /* !SLE_VERSION(12,3,0) && !RHEL_VERSION(7,5) */ +#if ((SLE_VERSION_CODE && (SLE_VERSION_CODE > SLE_VERSION(12,3,0))) ||\ + (RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,5))) +#define HAVE_SWIOTLB_SKIP_CPU_SYNC +#endif + +#if ((SLE_VERSION_CODE && (SLE_VERSION_CODE < SLE_VERSION(15,0,0))) ||\ + (RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE <= RHEL_RELEASE_VERSION(7,4)))) +#define page_frag_free __free_page_frag +#endif +#ifndef ETH_MIN_MTU +#define ETH_MIN_MTU 68 +#endif /* ETH_MIN_MTU */ +#else /* >= 4.10 */ +#define HAVE_TC_FLOWER_ENC +#define HAVE_NETDEVICE_MIN_MAX_MTU +#define HAVE_SWIOTLB_SKIP_CPU_SYNC +#define HAVE_NETDEV_TC_RESETS_XPS +#define HAVE_XPS_QOS_SUPPORT +#define HAVE_DEV_WALK_API +#define HAVE_ETHTOOL_NEW_2500MB_BITS +#define HAVE_ETHTOOL_5G_BITS +/* kernel 4.10 onwards, as part of busy_poll rewrite, new state were added + * which is part of NAPI:state. If NAPI:state=NAPI_STATE_IN_BUSY_POLL, + * it means napi_poll is invoked in busy_poll context + */ +#define HAVE_NAPI_STATE_IN_BUSY_POLL +#define HAVE_TCF_MIRRED_EGRESS_REDIRECT +#endif /* 4.10.0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,11,0)) +#ifdef CONFIG_NET_RX_BUSY_POLL +#define HAVE_NDO_BUSY_POLL +#endif /* CONFIG_NET_RX_BUSY_POLL */ +#if ((SLE_VERSION_CODE && (SLE_VERSION_CODE >= SLE_VERSION(12,3,0))) || \ + (RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,5)))) +#define HAVE_VOID_NDO_GET_STATS64 +#endif /* (SLES >= 12.3.0) && (RHEL >= 7.5) */ + +static inline void _kc_dev_kfree_skb_irq(struct sk_buff *skb) +{ + if (!skb) + return; + dev_kfree_skb_irq(skb); +} + +#undef dev_kfree_skb_irq +#define dev_kfree_skb_irq _kc_dev_kfree_skb_irq + +static inline void _kc_dev_consume_skb_irq(struct sk_buff *skb) +{ + if (!skb) + return; + dev_consume_skb_irq(skb); +} + +#undef dev_consume_skb_irq +#define dev_consume_skb_irq _kc_dev_consume_skb_irq + +static inline void _kc_dev_kfree_skb_any(struct sk_buff *skb) +{ + if (!skb) + return; + dev_kfree_skb_any(skb); +} + +#undef dev_kfree_skb_any +#define dev_kfree_skb_any _kc_dev_kfree_skb_any + +static inline void _kc_dev_consume_skb_any(struct sk_buff *skb) +{ + if (!skb) + return; + dev_consume_skb_any(skb); +} + +#undef dev_consume_skb_any +#define dev_consume_skb_any _kc_dev_consume_skb_any + +#else /* > 4.11 */ +#define HAVE_VOID_NDO_GET_STATS64 +#define HAVE_VM_OPS_FAULT_NO_VMA +#endif /* 4.11.0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,12,0)) +#if (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,7) && \ + RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(8,0)) +/* The RHEL 7.7+ NL_SET_ERR_MSG_MOD triggers unused parameter warnings */ +#undef NL_SET_ERR_MSG_MOD +#endif +#ifndef NL_SET_ERR_MSG_MOD +#define NL_SET_ERR_MSG_MOD(extack, msg) \ + do { \ + uninitialized_var(extack); \ + pr_err(KBUILD_MODNAME ": " msg); \ + } while (0) +#endif /* !NL_SET_ERR_MSG_MOD */ +#endif /* 4.12 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,13,0)) +#if ((SLE_VERSION_CODE && (SLE_VERSION_CODE > SLE_VERSION(12,3,0))) || \ + (RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,5))) +#define HAVE_TCF_EXTS_HAS_ACTION +#endif +#define PCI_EXP_LNKCAP_SLS_8_0GB 0x00000003 /* LNKCAP2 SLS Vector bit 2 */ +#if (SLE_VERSION_CODE && (SLE_VERSION_CODE >= SLE_VERSION(12,4,0))) +#define HAVE_PCI_ERROR_HANDLER_RESET_PREPARE +#endif /* SLES >= 12sp4 */ +#if (!(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,5)) && \ + !(SLE_VERSION_CODE >= SLE_VERSION(12,4,0))) +#define UUID_SIZE 16 +typedef struct { + __u8 b[UUID_SIZE]; +} uuid_t; +#define UUID_INIT(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7) \ +((uuid_t) \ +{{ ((a) >> 24) & 0xff, ((a) >> 16) & 0xff, ((a) >> 8) & 0xff, (a) & 0xff, \ + ((b) >> 8) & 0xff, (b) & 0xff, \ + ((c) >> 8) & 0xff, (c) & 0xff, \ + (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }}) + +static inline bool uuid_equal(const uuid_t *u1, const uuid_t *u2) +{ + return memcmp(u1, u2, sizeof(uuid_t)) == 0; +} +#else +#define HAVE_METADATA_PORT_INFO +#endif /* !(RHEL >= 7.5) && !(SLES >= 12.4) */ +#else /* > 4.13 */ +#define HAVE_METADATA_PORT_INFO +#define HAVE_HWTSTAMP_FILTER_NTP_ALL +#define HAVE_NDO_SETUP_TC_CHAIN_INDEX +#define HAVE_PCI_ERROR_HANDLER_RESET_PREPARE +#define HAVE_PTP_CLOCK_DO_AUX_WORK +#endif /* 4.13.0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0)) +#ifdef ETHTOOL_GLINKSETTINGS +#ifndef ethtool_link_ksettings_del_link_mode +#define ethtool_link_ksettings_del_link_mode(ptr, name, mode) \ + __clear_bit(ETHTOOL_LINK_MODE_ ## mode ## _BIT, (ptr)->link_modes.name) +#endif +#endif /* ETHTOOL_GLINKSETTINGS */ +#if (SLE_VERSION_CODE && (SLE_VERSION_CODE >= SLE_VERSION(12,4,0))) +#define HAVE_NDO_SETUP_TC_REMOVE_TC_TO_NETDEV +#endif + +#if (RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,5))) +#define HAVE_NDO_SETUP_TC_REMOVE_TC_TO_NETDEV +#define HAVE_RHEL7_NETDEV_OPS_EXT_NDO_SETUP_TC +#endif + +#define TIMER_DATA_TYPE unsigned long +#define TIMER_FUNC_TYPE void (*)(TIMER_DATA_TYPE) + +#define timer_setup(timer, callback, flags) \ + __setup_timer((timer), (TIMER_FUNC_TYPE)(callback), \ + (TIMER_DATA_TYPE)(timer), (flags)) + +#define from_timer(var, callback_timer, timer_fieldname) \ + container_of(callback_timer, typeof(*var), timer_fieldname) + +#ifndef xdp_do_flush_map +#define xdp_do_flush_map() do {} while (0) +#endif +struct _kc_xdp_buff { + void *data; + void *data_end; + void *data_hard_start; +}; +#define xdp_buff _kc_xdp_buff +struct _kc_bpf_prog { +}; +#define bpf_prog _kc_bpf_prog +#ifndef DIV_ROUND_DOWN_ULL +#define DIV_ROUND_DOWN_ULL(ll, d) \ + ({ unsigned long long _tmp = (ll); do_div(_tmp, d); _tmp; }) +#endif /* DIV_ROUND_DOWN_ULL */ +#else /* > 4.14 */ +#define HAVE_XDP_SUPPORT +#define HAVE_NDO_SETUP_TC_REMOVE_TC_TO_NETDEV +#define HAVE_TCF_EXTS_HAS_ACTION +#endif /* 4.14.0 */ + +/*****************************************************************************/ +#ifndef ETHTOOL_GLINKSETTINGS + +#define __ETHTOOL_LINK_MODE_MASK_NBITS 32 +#define ETHTOOL_LINK_MASK_SIZE BITS_TO_LONGS(__ETHTOOL_LINK_MODE_MASK_NBITS) + +/** + * struct ethtool_link_ksettings + * @link_modes: supported and advertising, single item arrays + * @link_modes.supported: bitmask of supported link speeds + * @link_modes.advertising: bitmask of currently advertised speeds + * @base: base link details + * @base.speed: current link speed + * @base.port: current port type + * @base.duplex: current duplex mode + * @base.autoneg: current autonegotiation settings + * + * This struct and the following macros provide a way to support the old + * ethtool get/set_settings API on older kernels, but in the style of the new + * GLINKSETTINGS API. In this way, the same code can be used to support both + * APIs as seemlessly as possible. + * + * It should be noted the old API only has support up to the first 32 bits. + */ +struct ethtool_link_ksettings { + struct { + u32 speed; + u8 port; + u8 duplex; + u8 autoneg; + } base; + struct { + unsigned long supported[ETHTOOL_LINK_MASK_SIZE]; + unsigned long advertising[ETHTOOL_LINK_MASK_SIZE]; + } link_modes; +}; + +#define ETHTOOL_LINK_NAME_advertising(mode) ADVERTISED_ ## mode +#define ETHTOOL_LINK_NAME_supported(mode) SUPPORTED_ ## mode +#define ETHTOOL_LINK_NAME(name) ETHTOOL_LINK_NAME_ ## name +#define ETHTOOL_LINK_CONVERT(name, mode) ETHTOOL_LINK_NAME(name)(mode) + +/** + * ethtool_link_ksettings_zero_link_mode + * @ptr: ptr to ksettings struct + * @name: supported or advertising + */ +#define ethtool_link_ksettings_zero_link_mode(ptr, name)\ + (*((ptr)->link_modes.name) = 0x0) + +/** + * ethtool_link_ksettings_add_link_mode + * @ptr: ptr to ksettings struct + * @name: supported or advertising + * @mode: link mode to add + */ +#define ethtool_link_ksettings_add_link_mode(ptr, name, mode)\ + (*((ptr)->link_modes.name) |= (typeof(*((ptr)->link_modes.name)))ETHTOOL_LINK_CONVERT(name, mode)) + +/** + * ethtool_link_ksettings_del_link_mode + * @ptr: ptr to ksettings struct + * @name: supported or advertising + * @mode: link mode to delete + */ +#define ethtool_link_ksettings_del_link_mode(ptr, name, mode)\ + (*((ptr)->link_modes.name) &= ~(typeof(*((ptr)->link_modes.name)))ETHTOOL_LINK_CONVERT(name, mode)) + +/** + * ethtool_link_ksettings_test_link_mode + * @ptr: ptr to ksettings struct + * @name: supported or advertising + * @mode: link mode to add + */ +#define ethtool_link_ksettings_test_link_mode(ptr, name, mode)\ + (!!(*((ptr)->link_modes.name) & ETHTOOL_LINK_CONVERT(name, mode))) + +/** + * _kc_ethtool_ksettings_to_cmd - Convert ethtool_link_ksettings to ethtool_cmd + * @ks: ethtool_link_ksettings struct + * @cmd: ethtool_cmd struct + * + * Convert an ethtool_link_ksettings structure into the older ethtool_cmd + * structure. We provide this in kcompat.h so that drivers can easily + * implement the older .{get|set}_settings as wrappers around the new api. + * Hence, we keep it prefixed with _kc_ to make it clear this isn't actually + * a real function in the kernel. + */ +static inline void +_kc_ethtool_ksettings_to_cmd(struct ethtool_link_ksettings *ks, + struct ethtool_cmd *cmd) +{ + cmd->supported = (u32)ks->link_modes.supported[0]; + cmd->advertising = (u32)ks->link_modes.advertising[0]; + ethtool_cmd_speed_set(cmd, ks->base.speed); + cmd->duplex = ks->base.duplex; + cmd->autoneg = ks->base.autoneg; + cmd->port = ks->base.port; +} + +#endif /* !ETHTOOL_GLINKSETTINGS */ + +/*****************************************************************************/ +#if ((LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0)) || \ + (SLE_VERSION_CODE && (SLE_VERSION_CODE <= SLE_VERSION(12,3,0))) || \ + (RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE <= RHEL_RELEASE_VERSION(7,5)))) +#define phy_speed_to_str _kc_phy_speed_to_str +const char *_kc_phy_speed_to_str(int speed); +#else /* (LINUX >= 4.14.0) || (SLES > 12.3.0) || (RHEL > 7.5) */ +#include +#endif /* (LINUX < 4.14.0) || (SLES <= 12.3.0) || (RHEL <= 7.5) */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,15,0)) +#if ((RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,6))) || \ + (SLE_VERSION_CODE && (SLE_VERSION_CODE >= SLE_VERSION(15,1,0)))) +#define HAVE_TC_CB_AND_SETUP_QDISC_MQPRIO +#define HAVE_TCF_BLOCK +#else /* RHEL >= 7.6 || SLES >= 15.1 */ +#define TC_SETUP_QDISC_MQPRIO TC_SETUP_MQPRIO +#endif /* !(RHEL >= 7.6) && !(SLES >= 15.1) */ +void _kc_ethtool_intersect_link_masks(struct ethtool_link_ksettings *dst, + struct ethtool_link_ksettings *src); +#define ethtool_intersect_link_masks _kc_ethtool_intersect_link_masks +#else /* >= 4.15 */ +#define HAVE_NDO_BPF +#define HAVE_XDP_BUFF_DATA_META +#define HAVE_TC_CB_AND_SETUP_QDISC_MQPRIO +#define HAVE_TCF_BLOCK +#endif /* 4.15.0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,16,0)) +#if (!(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,7)) && \ + !(SLE_VERSION_CODE >= SLE_VERSION(12,4,0) && \ + SLE_VERSION_CODE < SLE_VERSION(15,0,0)) && \ + !(SLE_VERSION_CODE >= SLE_VERSION(15,1,0))) +/* The return value of the strscpy() and strlcpy() functions is different. + * This could be potentially hazard for the future. + * To avoid this the void result is forced. + * So it is not possible use this function with the return value. + * Return value is required in kernel 4.3 through 4.15 + */ +#define strscpy(...) (void)(strlcpy(__VA_ARGS__)) +#endif /* !RHEL >= 7.7 && !SLES12sp4+ && !SLES15sp1+ */ + +#define pci_printk(level, pdev, fmt, arg...) \ + dev_printk(level, &(pdev)->dev, fmt, ##arg) +#define pci_emerg(pdev, fmt, arg...) dev_emerg(&(pdev)->dev, fmt, ##arg) +#define pci_alert(pdev, fmt, arg...) dev_alert(&(pdev)->dev, fmt, ##arg) +#define pci_crit(pdev, fmt, arg...) dev_crit(&(pdev)->dev, fmt, ##arg) +#define pci_err(pdev, fmt, arg...) dev_err(&(pdev)->dev, fmt, ##arg) +#define pci_warn(pdev, fmt, arg...) dev_warn(&(pdev)->dev, fmt, ##arg) +#define pci_notice(pdev, fmt, arg...) dev_notice(&(pdev)->dev, fmt, ##arg) +#define pci_info(pdev, fmt, arg...) dev_info(&(pdev)->dev, fmt, ##arg) +#define pci_dbg(pdev, fmt, arg...) dev_dbg(&(pdev)->dev, fmt, ##arg) + +#ifndef array_index_nospec +static inline unsigned long _kc_array_index_mask_nospec(unsigned long index, + unsigned long size) +{ + /* + * Always calculate and emit the mask even if the compiler + * thinks the mask is not needed. The compiler does not take + * into account the value of @index under speculation. + */ + OPTIMIZER_HIDE_VAR(index); + return ~(long)(index | (size - 1UL - index)) >> (BITS_PER_LONG - 1); +} + +#define array_index_nospec(index, size) \ +({ \ + typeof(index) _i = (index); \ + typeof(size) _s = (size); \ + unsigned long _mask = _kc_array_index_mask_nospec(_i, _s); \ + \ + BUILD_BUG_ON(sizeof(_i) > sizeof(long)); \ + BUILD_BUG_ON(sizeof(_s) > sizeof(long)); \ + \ + (typeof(_i)) (_i & _mask); \ +}) +#endif /* array_index_nospec */ +#if (!(RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,6))) && \ + !(SLE_VERSION_CODE && (SLE_VERSION_CODE >= SLE_VERSION(15,1,0)))) +#ifdef HAVE_TC_CB_AND_SETUP_QDISC_MQPRIO +#include +static inline bool +tc_cls_can_offload_and_chain0(const struct net_device *dev, + struct tc_cls_common_offload *common) +{ + if (!tc_can_offload(dev)) + return false; + if (common->chain_index) + return false; + + return true; +} +#endif /* HAVE_TC_CB_AND_SETUP_QDISC_MQPRIO */ +#endif /* !(RHEL >= 7.6) && !(SLES >= 15.1) */ +#ifndef sizeof_field +#define sizeof_field(TYPE, MEMBER) (sizeof((((TYPE *)0)->MEMBER))) +#endif /* sizeof_field */ +#if !(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,0)) && \ + !(SLE_VERSION_CODE >= SLE_VERSION(12,5,0) && \ + SLE_VERSION_CODE < SLE_VERSION(15,0,0) || \ + SLE_VERSION_CODE >= SLE_VERSION(15,1,0)) +/* + * Copy bitmap and clear tail bits in last word. + */ +static inline void +bitmap_copy_clear_tail(unsigned long *dst, const unsigned long *src, unsigned int nbits) +{ + bitmap_copy(dst, src, nbits); + if (nbits % BITS_PER_LONG) + dst[nbits / BITS_PER_LONG] &= BITMAP_LAST_WORD_MASK(nbits); +} + +/* + * On 32-bit systems bitmaps are represented as u32 arrays internally, and + * therefore conversion is not needed when copying data from/to arrays of u32. + */ +#if BITS_PER_LONG == 64 +void bitmap_from_arr32(unsigned long *bitmap, const u32 *buf, unsigned int nbits); +#else +#define bitmap_from_arr32(bitmap, buf, nbits) \ + bitmap_copy_clear_tail((unsigned long *) (bitmap), \ + (const unsigned long *) (buf), (nbits)) +#endif /* BITS_PER_LONG == 64 */ +#endif /* !(RHEL >= 8.0) && !(SLES >= 12.5 && SLES < 15.0 || SLES >= 15.1) */ +#else /* >= 4.16 */ +#include +#define HAVE_XDP_BUFF_RXQ +#define HAVE_TC_FLOWER_OFFLOAD_COMMON_EXTACK +#define HAVE_TCF_MIRRED_DEV +#define HAVE_VF_STATS_DROPPED +#endif /* 4.16.0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,17,0)) +#include +#include +#define PCIE_SPEED_16_0GT 0x17 +#define PCI_EXP_LNKCAP_SLS_16_0GB 0x00000004 /* LNKCAP2 SLS Vector bit 3 */ +#define PCI_EXP_LNKSTA_CLS_16_0GB 0x0004 /* Current Link Speed 16.0GT/s */ +#define PCI_EXP_LNKCAP2_SLS_16_0GB 0x00000010 /* Supported Speed 16GT/s */ +void _kc_pcie_print_link_status(struct pci_dev *dev); +#define pcie_print_link_status _kc_pcie_print_link_status +#else /* >= 4.17.0 */ +#define HAVE_XDP_BUFF_IN_XDP_H +#endif /* 4.17.0 */ + +/*****************************************************************************/ +#if IS_ENABLED(CONFIG_NET_DEVLINK) && \ + (LINUX_VERSION_CODE < KERNEL_VERSION(5,9,0)) +#include +#if ((LINUX_VERSION_CODE < KERNEL_VERSION(4,18,0)) && \ + (SLE_VERSION_CODE < SLE_VERSION(15,1,0)) && \ + (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(7,7))) +enum devlink_port_flavour { + DEVLINK_PORT_FLAVOUR_PHYSICAL, + DEVLINK_PORT_FLAVOUR_CPU, + DEVLINK_PORT_FLAVOUR_DSA, + DEVLINK_PORT_FLAVOUR_PCI_PF, + DEVLINK_PORT_FLAVOUR_PCI_VF, +}; +#endif /* <4.18.0 && +#ifndef macvlan_supports_dest_filter +#define macvlan_supports_dest_filter _kc_macvlan_supports_dest_filter +static inline bool _kc_macvlan_supports_dest_filter(struct net_device *dev) +{ + struct macvlan_dev *macvlan = netdev_priv(dev); + + return macvlan->mode == MACVLAN_MODE_PRIVATE || + macvlan->mode == MACVLAN_MODE_VEPA || + macvlan->mode == MACVLAN_MODE_BRIDGE; +} +#endif + +#if (!SLE_VERSION_CODE || (SLE_VERSION_CODE < SLE_VERSION(15,1,0))) +#ifndef macvlan_accel_priv +#define macvlan_accel_priv _kc_macvlan_accel_priv +static inline void *_kc_macvlan_accel_priv(struct net_device *dev) +{ + struct macvlan_dev *macvlan = netdev_priv(dev); + + return macvlan->fwd_priv; +} +#endif + +#ifndef macvlan_release_l2fw_offload +#define macvlan_release_l2fw_offload _kc_macvlan_release_l2fw_offload +static inline int _kc_macvlan_release_l2fw_offload(struct net_device *dev) +{ + struct macvlan_dev *macvlan = netdev_priv(dev); + + macvlan->fwd_priv = NULL; + return dev_uc_add(macvlan->lowerdev, dev->dev_addr); +} +#endif +#endif /* !SLES || SLES < 15.1 */ +#endif /* NETIF_F_HW_L2FW_DOFFLOAD */ +#include "kcompat_overflow.h" + +#if (SLE_VERSION_CODE < SLE_VERSION(15,1,0)) +#define firmware_request_nowarn request_firmware_direct + +#if (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(7,7)) +#if IS_ENABLED(CONFIG_NET_DEVLINK) && !defined(devlink_port_attrs_set) +static inline void +_kc_devlink_port_attrs_set(struct devlink_port *devlink_port, + struct _kc_devlink_port_attrs *attrs) +{ + if (attrs->split) + devlink_port_split_set(devlink_port, attrs->phys.port_number); +} + +#define devlink_port_attrs_set _kc_devlink_port_attrs_set +#endif /* CONFIG_NET_DEVLINK && !devlink_port_attrs_set */ +#endif /* +#include +#define HAVE_XDP_FRAME_STRUCT +#define HAVE_XDP_SOCK +#define HAVE_NDO_XDP_XMIT_BULK_AND_FLAGS +#define NO_NDO_XDP_FLUSH +#define HAVE_AF_XDP_SUPPORT +#endif /* 4.18.0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,19,0)) +#if (RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,0)) && \ + (RHEL_RELEASE_CODE <= RHEL_RELEASE_VERSION(8,2))) +#define HAVE_DEVLINK_REGIONS +#endif /* RHEL >= 8.0 && RHEL <= 8.2 */ +#define bitmap_alloc(nbits, flags) \ + kmalloc_array(BITS_TO_LONGS(nbits), sizeof(unsigned long), flags) +#define bitmap_zalloc(nbits, flags) bitmap_alloc(nbits, ((flags) | __GFP_ZERO)) +#define bitmap_free(bitmap) kfree(bitmap) +#ifdef ETHTOOL_GLINKSETTINGS +#define ethtool_ks_clear(ptr, name) \ + ethtool_link_ksettings_zero_link_mode(ptr, name) +#define ethtool_ks_add_mode(ptr, name, mode) \ + ethtool_link_ksettings_add_link_mode(ptr, name, mode) +#define ethtool_ks_del_mode(ptr, name, mode) \ + ethtool_link_ksettings_del_link_mode(ptr, name, mode) +#define ethtool_ks_test(ptr, name, mode) \ + ethtool_link_ksettings_test_link_mode(ptr, name, mode) +#endif /* ETHTOOL_GLINKSETTINGS */ +#define HAVE_NETPOLL_CONTROLLER +#define REQUIRE_PCI_CLEANUP_AER_ERROR_STATUS +#if (SLE_VERSION_CODE && (SLE_VERSION_CODE >= SLE_VERSION(15,1,0))) +#define HAVE_TCF_MIRRED_DEV +#define HAVE_NDO_SELECT_QUEUE_SB_DEV +#define HAVE_TCF_BLOCK_CB_REGISTER_EXTACK +#endif +#if ((RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,0)) ||\ + (SLE_VERSION_CODE >= SLE_VERSION(15,1,0))) +#define HAVE_TCF_EXTS_FOR_EACH_ACTION +#undef HAVE_TCF_EXTS_TO_LIST +#endif /* RHEL8.0+ */ + +static inline void __kc_metadata_dst_free(void *md_dst) +{ + kfree(md_dst); +} + +#define metadata_dst_free(md_dst) __kc_metadata_dst_free(md_dst) +#elif (LINUX_VERSION_CODE > KERNEL_VERSION(4,19,0)) +#define HAVE_TCF_BLOCK_CB_REGISTER_EXTACK +#define NO_NETDEV_BPF_PROG_ATTACHED +#define HAVE_NDO_SELECT_QUEUE_SB_DEV +#define HAVE_NETDEV_SB_DEV +#undef HAVE_TCF_EXTS_TO_LIST +#define HAVE_TCF_EXTS_FOR_EACH_ACTION +#define HAVE_TCF_VLAN_TPID +#define HAVE_RHASHTABLE_TYPES +#define HAVE_DEVLINK_REGIONS +#define HAVE_DEVLINK_PARAMS +#define HAVE_UDP_TUNNEL_OPS +#define HAVE_IOPOLL_OPS +#define HAVE_DEV_PRINTK_OPS +#else /* = 4.19.0 */ +static inline int __sysfs_emit(char *buf, const char *fmt, ...) +{ + int ret; + va_list args; + + if (WARN(!buf || offset_in_page(buf), + "invalid sysfs_emit: buf:%p\n", buf)) + return 0; + + va_start(args, fmt); + ret = vscnprintf(buf, PAGE_SIZE, fmt, args); + va_end(args); + return ret; +} +#define sysfs_emit __sysfs_emit +#endif /* 4.19.0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,20,0)) +#define HAVE_XDP_UMEM_PROPS +#ifdef HAVE_AF_XDP_SUPPORT +#ifndef napi_if_scheduled_mark_missed +static inline bool __kc_napi_if_scheduled_mark_missed(struct napi_struct *n) +{ + unsigned long val, new; + + do { + val = READ_ONCE(n->state); + if (val & NAPIF_STATE_DISABLE) + return true; + + if (!(val & NAPIF_STATE_SCHED)) + return false; + + new = val | NAPIF_STATE_MISSED; + } while (cmpxchg(&n->state, val, new) != val); + + return true; +} + +#define napi_if_scheduled_mark_missed __kc_napi_if_scheduled_mark_missed +#endif /* !napi_if_scheduled_mark_missed */ +#endif /* HAVE_AF_XDP_SUPPORT */ +#if (RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,0))) +#define HAVE_DEVLINK_ESWITCH_OPS_EXTACK +#endif /* RHEL >= 8.0 */ +#if ((SLE_VERSION_CODE >= SLE_VERSION(12,5,0) && \ + SLE_VERSION_CODE < SLE_VERSION(15,0,0)) || \ + (SLE_VERSION_CODE >= SLE_VERSION(15,1,0))) +#define HAVE_DEVLINK_ESWITCH_OPS_EXTACK +#endif /* SLE == 12sp5 || SLE >= 15sp1 */ +#else /* >= 4.20.0 */ +#define HAVE_DEVLINK_ESWITCH_OPS_EXTACK +#define HAVE_AF_XDP_ZC_SUPPORT +#define HAVE_VXLAN_TYPE +#define HAVE_ETF_SUPPORT /* Earliest TxTime First */ +#endif /* 4.20.0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5,0,0)) +#if (!(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(8,0))) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,12,0)) +#define NETLINK_MAX_COOKIE_LEN 20 +struct netlink_ext_ack { + const char *_msg; + const struct nlattr *bad_attr; + u8 cookie[NETLINK_MAX_COOKIE_LEN]; + u8 cookie_len; +}; + +#endif /* < 4.12 */ +static inline int _kc_dev_open(struct net_device *netdev, + struct netlink_ext_ack __always_unused *extack) +{ + return dev_open(netdev); +} + +#define dev_open _kc_dev_open + +static inline int +_kc_dev_change_flags(struct net_device *netdev, unsigned int flags, + struct netlink_ext_ack __always_unused *extack) +{ + return dev_change_flags(netdev, flags); +} + +#define dev_change_flags _kc_dev_change_flags +#endif /* !(RHEL_RELEASE_CODE && RHEL > RHEL(8,0)) */ +#if (RHEL_RELEASE_CODE && \ + (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7,7) && \ + RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(8,0)) || \ + (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,1))) +#define HAVE_PTP_SYS_OFFSET_EXTENDED_IOCTL +#else /* RHEL >= 7.7 && RHEL < 8.0 || RHEL >= 8.1 */ +struct ptp_system_timestamp { + struct timespec64 pre_ts; + struct timespec64 post_ts; +}; + +static inline void +ptp_read_system_prets(struct ptp_system_timestamp __always_unused *sts) +{ + ; +} + +static inline void +ptp_read_system_postts(struct ptp_system_timestamp __always_unused *sts) +{ + ; +} +#endif /* !(RHEL >= 7.7 && RHEL != 8.0) */ +#if (RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,1))) +#define HAVE_NDO_BRIDGE_SETLINK_EXTACK +#endif /* RHEL 8.1 */ +#if (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,2)) +#define HAVE_TC_INDIR_BLOCK +#endif /* RHEL 8.2 */ +#else /* >= 5.0.0 */ +#define HAVE_PTP_SYS_OFFSET_EXTENDED_IOCTL +#define HAVE_NDO_BRIDGE_SETLINK_EXTACK +#define HAVE_DMA_ALLOC_COHERENT_ZEROES_MEM +#define HAVE_GENEVE_TYPE +#define HAVE_TC_INDIR_BLOCK +#endif /* 5.0.0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5,1,0)) +#if (RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,1))) +#define HAVE_TC_FLOW_RULE_INFRASTRUCTURE +#define HAVE_NDO_FDB_ADD_EXTACK +#define HAVE_DEVLINK_INFO_GET +#define HAVE_DEVLINK_FLASH_UPDATE +#else /* RHEL < 8.1 */ +#ifdef HAVE_TC_SETUP_CLSFLOWER +#include + +struct flow_match { + struct flow_dissector *dissector; + void *mask; + void *key; +}; + +struct flow_match_basic { + struct flow_dissector_key_basic *key, *mask; +}; + +struct flow_match_control { + struct flow_dissector_key_control *key, *mask; +}; + +struct flow_match_eth_addrs { + struct flow_dissector_key_eth_addrs *key, *mask; +}; + +#ifdef HAVE_TC_FLOWER_ENC +struct flow_match_enc_keyid { + struct flow_dissector_key_keyid *key, *mask; +}; +#endif + +#ifndef HAVE_TC_FLOWER_VLAN_IN_TAGS +struct flow_match_vlan { + struct flow_dissector_key_vlan *key, *mask; +}; +#endif + +struct flow_match_ipv4_addrs { + struct flow_dissector_key_ipv4_addrs *key, *mask; +}; + +struct flow_match_ipv6_addrs { + struct flow_dissector_key_ipv6_addrs *key, *mask; +}; + +struct flow_match_ports { + struct flow_dissector_key_ports *key, *mask; +}; + +struct flow_rule { + struct flow_match match; +#if 0 + /* In 5.1+ kernels, action is a member of struct flow_rule but is + * not compatible with how we kcompat tc_cls_flower_offload_flow_rule + * below. By not declaring it here, any driver that attempts to use + * action as an element of struct flow_rule will fail to compile + * instead of silently trying to access memory that shouldn't be. + */ + struct flow_action action; +#endif +}; + +void flow_rule_match_basic(const struct flow_rule *rule, + struct flow_match_basic *out); +void flow_rule_match_control(const struct flow_rule *rule, + struct flow_match_control *out); +void flow_rule_match_eth_addrs(const struct flow_rule *rule, + struct flow_match_eth_addrs *out); +#ifndef HAVE_TC_FLOWER_VLAN_IN_TAGS +void flow_rule_match_vlan(const struct flow_rule *rule, + struct flow_match_vlan *out); +#endif +void flow_rule_match_ipv4_addrs(const struct flow_rule *rule, + struct flow_match_ipv4_addrs *out); +void flow_rule_match_ipv6_addrs(const struct flow_rule *rule, + struct flow_match_ipv6_addrs *out); +void flow_rule_match_ports(const struct flow_rule *rule, + struct flow_match_ports *out); +#ifdef HAVE_TC_FLOWER_ENC +void flow_rule_match_enc_ports(const struct flow_rule *rule, + struct flow_match_ports *out); +void flow_rule_match_enc_control(const struct flow_rule *rule, + struct flow_match_control *out); +void flow_rule_match_enc_ipv4_addrs(const struct flow_rule *rule, + struct flow_match_ipv4_addrs *out); +void flow_rule_match_enc_ipv6_addrs(const struct flow_rule *rule, + struct flow_match_ipv6_addrs *out); +void flow_rule_match_enc_keyid(const struct flow_rule *rule, + struct flow_match_enc_keyid *out); +#endif + +static inline struct flow_rule * +tc_cls_flower_offload_flow_rule(struct tc_cls_flower_offload *tc_flow_cmd) +{ + return (struct flow_rule *)&tc_flow_cmd->dissector; +} + +static inline bool flow_rule_match_key(const struct flow_rule *rule, + enum flow_dissector_key_id key) +{ + return dissector_uses_key(rule->match.dissector, key); +} +#endif /* HAVE_TC_SETUP_CLSFLOWER */ + +#endif /* RHEL < 8.1 */ + +#if (!(RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,1))) +#define devlink_params_publish(devlink) do { } while (0) +#define devlink_params_unpublish(devlink) do { } while (0) +#endif + +#else /* >= 5.1.0 */ +#define HAVE_NDO_FDB_ADD_EXTACK +#define NO_XDP_QUERY_XSK_UMEM +#define HAVE_AF_XDP_NETDEV_UMEM +#define HAVE_TC_FLOW_RULE_INFRASTRUCTURE +#define HAVE_TC_FLOWER_ENC_IP +#define HAVE_DEVLINK_INFO_GET +#define HAVE_DEVLINK_FLASH_UPDATE +#define HAVE_DEVLINK_PORT_PARAMS +#endif /* 5.1.0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5,2,0)) +#if (defined HAVE_SKB_XMIT_MORE) && \ +(!(RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,2)))) +#define netdev_xmit_more() (skb->xmit_more) +#else +#define netdev_xmit_more() (0) +#endif + +#if (!(RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,2)))) +#ifndef eth_get_headlen +static inline u32 +__kc_eth_get_headlen(const struct net_device __always_unused *dev, void *data, + unsigned int len) +{ + return eth_get_headlen(data, len); +} + +#define eth_get_headlen(dev, data, len) __kc_eth_get_headlen(dev, data, len) +#endif /* !eth_get_headlen */ +#endif /* !RHEL >= 8.2 */ + +#ifndef mmiowb +#ifdef CONFIG_IA64 +#define mmiowb() asm volatile ("mf.a" ::: "memory") +#else +#define mmiowb() +#endif +#endif /* mmiowb */ + +#if (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(8,2)) +#if IS_ENABLED(CONFIG_NET_DEVLINK) && !defined(devlink_port_attrs_set) +static inline void +_kc_devlink_port_attrs_set(struct devlink_port *devlink_port, + struct _kc_devlink_port_attrs *attrs) +{ + devlink_port_attrs_set(devlink_port, attrs->flavour, + attrs->phys.port_number, attrs->split, + attrs->phys.split_subport_number); +} + +#define devlink_port_attrs_set _kc_devlink_port_attrs_set +#endif /* CONFIG_NET_DEVLINK && !devlink_port_attrs_set */ +#endif /* RHEL_RELEASE_VERSION(8,1)) +#define HAVE_NDO_GET_DEVLINK_PORT +#endif /* RHEL > 8.1 */ + +#else /* >= 5.2.0 */ +#define HAVE_NDO_SELECT_QUEUE_FALLBACK_REMOVED +#define SPIN_UNLOCK_IMPLIES_MMIOWB +#define HAVE_NDO_GET_DEVLINK_PORT +#endif /* 5.2.0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5,3,0)) +#if (!(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,2))) +#define flow_block_offload tc_block_offload +#define flow_block_command tc_block_command +#define flow_cls_offload tc_cls_flower_offload +#define flow_block_binder_type tcf_block_binder_type +#define flow_cls_common_offload tc_cls_common_offload +#define flow_cls_offload_flow_rule tc_cls_flower_offload_flow_rule +#define FLOW_CLS_REPLACE TC_CLSFLOWER_REPLACE +#define FLOW_CLS_DESTROY TC_CLSFLOWER_DESTROY +#define FLOW_CLS_STATS TC_CLSFLOWER_STATS +#define FLOW_CLS_TMPLT_CREATE TC_CLSFLOWER_TMPLT_CREATE +#define FLOW_CLS_TMPLT_DESTROY TC_CLSFLOWER_TMPLT_DESTROY +#define FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS \ + TCF_BLOCK_BINDER_TYPE_CLSACT_INGRESS +#define FLOW_BLOCK_BIND TC_BLOCK_BIND +#define FLOW_BLOCK_UNBIND TC_BLOCK_UNBIND + +#ifdef HAVE_TC_CB_AND_SETUP_QDISC_MQPRIO +#include + +int _kc_flow_block_cb_setup_simple(struct flow_block_offload *f, + struct list_head *driver_list, + tc_setup_cb_t *cb, + void *cb_ident, void *cb_priv, + bool ingress_only); + +#define flow_block_cb_setup_simple(f, driver_list, cb, cb_ident, cb_priv, \ + ingress_only) \ + _kc_flow_block_cb_setup_simple(f, driver_list, cb, cb_ident, cb_priv, \ + ingress_only) +#endif /* HAVE_TC_CB_AND_SETUP_QDISC_MQPRIO */ +#else /* RHEL >= 8.2 */ +#define HAVE_FLOW_BLOCK_API +#define HAVE_DEVLINK_PORT_ATTR_PCI_VF +#endif /* RHEL >= 8.2 */ + +#ifndef ETH_P_LLDP +#define ETH_P_LLDP 0x88CC +#endif /* !ETH_P_LLDP */ + +#if (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(8,2)) +#if IS_ENABLED(CONFIG_NET_DEVLINK) +static inline void +devlink_flash_update_begin_notify(struct devlink __always_unused *devlink) +{ +} + +static inline void +devlink_flash_update_end_notify(struct devlink __always_unused *devlink) +{ +} + +static inline void +devlink_flash_update_status_notify(struct devlink __always_unused *devlink, + const char __always_unused *status_msg, + const char __always_unused *component, + unsigned long __always_unused done, + unsigned long __always_unused total) +{ +} +#endif /* CONFIG_NET_DEVLINK */ +#endif /* = 5.3.0 */ +#define XSK_UMEM_RETURNS_XDP_DESC +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5,8,0)) +#define HAVE_XSK_UMEM_HAS_ADDRS +#endif /* < 5.8.0*/ +#define HAVE_FLOW_BLOCK_API +#define HAVE_DEVLINK_PORT_ATTR_PCI_VF +#if IS_ENABLED(CONFIG_DIMLIB) +#define HAVE_CONFIG_DIMLIB +#endif +#endif /* 5.3.0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5,4,0)) +#if (!(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,2)) && \ + !(SLE_VERSION_CODE >= SLE_VERSION(15,2,0))) +static inline unsigned int skb_frag_off(const skb_frag_t *frag) +{ + return frag->page_offset; +} + +static inline void skb_frag_off_add(skb_frag_t *frag, int delta) +{ + frag->page_offset += delta; +} +#define __flow_indr_block_cb_register __tc_indr_block_cb_register +#define __flow_indr_block_cb_unregister __tc_indr_block_cb_unregister +#endif /* !(RHEL >= 8.2) && !(SLES >= 15sp2) */ +#if (SLE_VERSION_CODE >= SLE_VERSION(15,2,0)) +#define HAVE_NDO_XSK_WAKEUP +#endif /* SLES15sp2 */ +#else /* >= 5.4.0 */ +#define HAVE_NDO_XSK_WAKEUP +#endif /* 5.4.0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5,5,0)) +static inline unsigned long _kc_bitmap_get_value8(const unsigned long *map, + unsigned long start) +{ + const size_t index = BIT_WORD(start); + const unsigned long offset = start % BITS_PER_LONG; + + return (map[index] >> offset) & 0xFF; +} +#define bitmap_get_value8 _kc_bitmap_get_value8 + +static inline void _kc_bitmap_set_value8(unsigned long *map, + unsigned long value, + unsigned long start) +{ + const size_t index = BIT_WORD(start); + const unsigned long offset = start % BITS_PER_LONG; + + map[index] &= ~(0xFFUL << offset); + map[index] |= value << offset; +} +#define bitmap_set_value8 _kc_bitmap_set_value8 + +#endif /* 5.5.0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5,6,0)) +#ifdef HAVE_AF_XDP_SUPPORT +#define xsk_umem_release_addr xsk_umem_discard_addr +#define xsk_umem_release_addr_rq xsk_umem_discard_addr_rq +#endif /* HAVE_AF_XDP_SUPPORT */ +#if (RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,3))) +#define HAVE_TX_TIMEOUT_TXQUEUE +#endif +#else /* >= 5.6.0 */ +#define HAVE_TX_TIMEOUT_TXQUEUE +#endif /* 5.6.0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5,7,0)) +u64 _kc_pci_get_dsn(struct pci_dev *dev); +#define pci_get_dsn(dev) _kc_pci_get_dsn(dev) +#if !(SLE_VERSION_CODE > SLE_VERSION(15,2,0)) && \ + !((LINUX_VERSION_CODE == KERNEL_VERSION(5,3,18)) && \ + (SLE_LOCALVERSION_CODE >= KERNEL_VERSION(14,0,0))) && \ + !(RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,3))) +#define pci_aer_clear_nonfatal_status pci_cleanup_aer_uncorrect_error_status +#endif + +#define cpu_latency_qos_update_request pm_qos_update_request +#define cpu_latency_qos_add_request(arg1, arg2) pm_qos_add_request(arg1, PM_QOS_CPU_DMA_LATENCY, arg2) +#define cpu_latency_qos_remove_request pm_qos_remove_request + +#ifndef DEVLINK_INFO_VERSION_GENERIC_FW_BUNDLE_ID +#define DEVLINK_INFO_VERSION_GENERIC_FW_BUNDLE_ID "fw.bundle_id" +#endif + +#ifdef HAVE_DEVLINK_REGIONS +#if IS_ENABLED(CONFIG_NET_DEVLINK) +struct devlink_region_ops { + const char *name; + void (*destructor)(const void *data); +}; + +#ifndef devlink_region_create +static inline struct devlink_region * +_kc_devlink_region_create(struct devlink *devlink, + const struct devlink_region_ops *ops, + u32 region_max_snapshots, u64 region_size) +{ + return devlink_region_create(devlink, ops->name, region_max_snapshots, + region_size); +} + +#define devlink_region_create _kc_devlink_region_create +#endif /* devlink_region_create */ +#endif /* CONFIG_NET_DEVLINK */ +#define HAVE_DEVLINK_SNAPSHOT_CREATE_DESTRUCTOR +#endif /* HAVE_DEVLINK_REGIONS */ +#else /* >= 5.7.0 */ +#define HAVE_DEVLINK_REGION_OPS_SNAPSHOT +#define HAVE_ETHTOOL_COALESCE_PARAMS_SUPPORT +#endif /* 5.7.0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5,8,0)) +#if !(RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,4))) +#define xdp_convert_buff_to_frame convert_to_xdp_frame +#endif /* (RHEL < 8.4) */ +#define flex_array_size(p, member, count) \ + array_size(count, sizeof(*(p)->member) + __must_be_array((p)->member)) +#ifdef HAVE_AF_XDP_ZC_SUPPORT +#ifndef xsk_umem_get_rx_frame_size +static inline u32 _xsk_umem_get_rx_frame_size(struct xdp_umem *umem) +{ + return umem->chunk_size_nohr - XDP_PACKET_HEADROOM; +} + +#define xsk_umem_get_rx_frame_size _xsk_umem_get_rx_frame_size +#endif /* xsk_umem_get_rx_frame_size */ +#endif /* HAVE_AF_XDP_ZC_SUPPORT */ +#else /* >= 5.8.0 */ +#define HAVE_TC_FLOW_INDIR_DEV +#define HAVE_TC_FLOW_INDIR_BLOCK_CLEANUP +#define HAVE_XDP_BUFF_FRAME_SZ +#define HAVE_MEM_TYPE_XSK_BUFF_POOL +#endif /* 5.8.0 */ +#if (RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,3))) +#define HAVE_TC_FLOW_INDIR_DEV +#endif + +/*****************************************************************************/ +#if (RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,4))) +#if IS_ENABLED(CONFIG_NET_DEVLINK) && !defined(devlink_port_attrs_set) +#undef devlink_port_attrs +#define devlink_port_attrs_set devlink_port_attrs_set +#endif /* CONFIG_NET_DEVLINK && !devlink_port_attrs_set */ +#endif /* (RHEL >= 8.4) */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5,9,0)) +#if IS_ENABLED(CONFIG_NET_DEVLINK) && !defined(devlink_port_attrs_set) +static inline void +_kc_devlink_port_attrs_set(struct devlink_port *devlink_port, + struct _kc_devlink_port_attrs *attrs) +{ + devlink_port_attrs_set(devlink_port, attrs->flavour, + attrs->phys.port_number, attrs->split, + attrs->phys.split_subport_number, + attrs->switch_id.id, attrs->switch_id.id_len); +} + +#define devlink_port_attrs_set _kc_devlink_port_attrs_set +#endif /* CONFIG_NET_DEVLINK && !devlink_port_attrs_set */ +#define HAVE_XDP_QUERY_PROG +#else /* >= 5.9.0 */ +#define HAVE_FLOW_INDIR_BLOCK_QDISC +#define HAVE_UDP_TUNNEL_NIC_INFO +#endif /* 5.9.0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5,10,0)) +struct devlink_flash_update_params { + const char *file_name; + const char *component; + u32 overwrite_mask; +}; + +#ifndef DEVLINK_FLASH_OVERWRITE_SETTINGS +#define DEVLINK_FLASH_OVERWRITE_SETTINGS BIT(0) +#endif + +#ifndef DEVLINK_FLASH_OVERWRITE_IDENTIFIERS +#define DEVLINK_FLASH_OVERWRITE_IDENTIFIERS BIT(1) +#endif + +#if IS_ENABLED(CONFIG_NET_DEVLINK) +#include +static inline void +devlink_flash_update_timeout_notify(struct devlink *devlink, + const char *status_msg, + const char *component, + unsigned long __always_unused timeout) +{ + devlink_flash_update_status_notify(devlink, status_msg, component, 0, 0); +} +#endif /* CONFIG_NET_DEVLINK */ + +#if !(RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,4))) +static inline void net_prefetch(void *p) +{ + prefetch(p); +#if L1_CACHE_BYTES < 128 + prefetch((u8 *)p + L1_CACHE_BYTES); +#endif +} +#endif /* (RHEL < 8.4) */ + +#define XDP_SETUP_XSK_POOL XDP_SETUP_XSK_UMEM +#define xsk_get_pool_from_qid xdp_get_umem_from_qid +#define xsk_pool_get_rx_frame_size xsk_umem_get_rx_frame_size +#define xsk_pool_set_rxq_info xsk_buff_set_rxq_info +#define xsk_pool_dma_unmap xsk_buff_dma_unmap +#define xsk_pool_dma_map xsk_buff_dma_map +#define xsk_tx_peek_desc xsk_umem_consume_tx +#define xsk_tx_release xsk_umem_consume_tx_done +#define xsk_tx_completed xsk_umem_complete_tx +#define xsk_uses_need_wakeup xsk_umem_uses_need_wakeup +#ifdef HAVE_MEM_TYPE_XSK_BUFF_POOL +#include +static inline void +_kc_xsk_buff_dma_sync_for_cpu(struct xdp_buff *xdp, + void __always_unused *pool) +{ + xsk_buff_dma_sync_for_cpu(xdp); +} + +#define xsk_buff_dma_sync_for_cpu(xdp, pool) \ + _kc_xsk_buff_dma_sync_for_cpu(xdp, pool) +#endif /* HAVE_MEM_TYPE_XSK_BUFF_POOL */ +#else /* >= 5.10.0 */ +#define HAVE_DEVLINK_REGION_OPS_SNAPSHOT_OPS +#define HAVE_DEVLINK_FLASH_UPDATE_PARAMS +#define HAVE_NETDEV_BPF_XSK_POOL +#endif /* 5.10.0 */ + +/*****************************************************************************/ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5,11,0)) +#ifdef HAVE_XDP_BUFF_RXQ +#include +static inline int +_kc_xdp_rxq_info_reg(struct xdp_rxq_info *xdp_rxq, struct net_device *dev, + u32 queue_index, unsigned int __always_unused napi_id) +{ + return xdp_rxq_info_reg(xdp_rxq, dev, queue_index); +} + +#define xdp_rxq_info_reg(xdp_rxq, dev, queue_index, napi_id) \ + _kc_xdp_rxq_info_reg(xdp_rxq, dev, queue_index, napi_id) +#endif /* HAVE_XDP_BUFF_RXQ */ +#define HAVE_DEVLINK_FLASH_UPDATE_BEGIN_END_NOTIFY +#else /* >= 5.11.0 */ +#define HAVE_DEVLINK_FLASH_UPDATE_PARAMS_FW +#endif /* 5.11.0 */ + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,13,0)) +#define HAVE_ETHTOOL_GET_MODULE_EEPROM_BY_PAGE +#endif + +#endif /* _KCOMPAT_H_ */ diff --git a/src/net/include/linux/dinghai/kcompat_vfd.h b/src/net/include/linux/dinghai/kcompat_vfd.h new file mode 100644 index 0000000..a0c6c7b --- /dev/null +++ b/src/net/include/linux/dinghai/kcompat_vfd.h @@ -0,0 +1,189 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright(c) 2013 - 2021 Intel Corporation. */ + +#ifndef _KCOMPAT_VFD_H_ +#define _KCOMPAT_VFD_H_ + +#define VFD_PROMISC_OFF 0x00 +#define VFD_PROMISC_UNICAST 0x01 +#define VFD_PROMISC_MULTICAST 0x02 + +#define VFD_LINKSTATE_OFF 0x00 +#define VFD_LINKSTATE_ON 0x01 +#define VFD_LINKSTATE_AUTO 0x02 + +#define VFD_EGRESS_MIRROR_OFF -1 +#define VFD_INGRESS_MIRROR_OFF -1 + +#define VFD_QUEUE_TYPE_RSS 0x00 +#define VFD_QUEUE_TYPE_QOS 0x01 + +#define VFD_NUM_TC 0x8 + +/** + * struct vfd_objects - VF-d kobjects information struct + * @num_vfs: number of VFs allocated + * @sriov_kobj: pointer to the top sriov kobject + * @vf_kobj: array of pointer to each VF's kobjects + */ +struct vfd_objects { + int num_vfs; + struct kobject *sriov_kobj; + struct vfd_vf_obj *vfs; + struct vfd_qos_objects *qos; +}; + +/** + * struct vfd_vf_obj - VF-d VF kobjects information struct + * @vf_kobj: pointer to VF qos kobject + * @vf_qos_kobj: pointer to VF kobject + * @vf_tc_kobj: pointer to VF TC kobjects + */ +struct vfd_vf_obj { + struct kobject *vf_qos_kobj; + struct kobject *vf_kobj; + struct kobject *vf_tc_kobjs[VFD_NUM_TC]; +}; + +/** + * struct vfd_qos_objects - VF-d qos kobjects information struct + * @qos_kobj: pointer to PF qos kobject + * @pf_qos_kobj: pointer to PF TC kobjects + */ +struct vfd_qos_objects { + struct kobject *qos_kobj; + struct kobject *pf_qos_kobjs[VFD_NUM_TC]; +}; + +struct vfd_macaddr { + u8 mac[ETH_ALEN]; + struct list_head list; +}; + +#define VFD_LINK_SPEED_2_5GB_SHIFT 0x0 +#define VFD_LINK_SPEED_100MB_SHIFT 0x1 +#define VFD_LINK_SPEED_1GB_SHIFT 0x2 +#define VFD_LINK_SPEED_10GB_SHIFT 0x3 +#define VFD_LINK_SPEED_40GB_SHIFT 0x4 +#define VFD_LINK_SPEED_20GB_SHIFT 0x5 +#define VFD_LINK_SPEED_25GB_SHIFT 0x6 +#define VFD_LINK_SPEED_5GB_SHIFT 0x7 + + +enum vfd_link_speed { + VFD_LINK_SPEED_UNKNOWN = 0, + VFD_LINK_SPEED_100MB = BIT(VFD_LINK_SPEED_100MB_SHIFT), + VFD_LINK_SPEED_1GB = BIT(VFD_LINK_SPEED_1GB_SHIFT), + VFD_LINK_SPEED_2_5GB = BIT(VFD_LINK_SPEED_2_5GB_SHIFT), + VFD_LINK_SPEED_5GB = BIT(VFD_LINK_SPEED_5GB_SHIFT), + VFD_LINK_SPEED_10GB = BIT(VFD_LINK_SPEED_10GB_SHIFT), + VFD_LINK_SPEED_40GB = BIT(VFD_LINK_SPEED_40GB_SHIFT), + VFD_LINK_SPEED_20GB = BIT(VFD_LINK_SPEED_20GB_SHIFT), + VFD_LINK_SPEED_25GB = BIT(VFD_LINK_SPEED_25GB_SHIFT), +}; + +struct vfd_ops { + int (*get_trunk)(struct pci_dev *pdev, int vf_id, unsigned long *buff); + int (*set_trunk)(struct pci_dev *pdev, int vf_id, + const unsigned long *buff); + int (*get_vlan_mirror)(struct pci_dev *pdev, int vf_id, + unsigned long *buff); + int (*set_vlan_mirror)(struct pci_dev *pdev, int vf_id, + const unsigned long *buff); + int (*get_egress_mirror)(struct pci_dev *pdev, int vf_id, int *data); + int (*set_egress_mirror)(struct pci_dev *pdev, int vf_id, + const int data); + int (*get_ingress_mirror)(struct pci_dev *pdev, int vf_id, int *data); + int (*set_ingress_mirror)(struct pci_dev *pdev, int vf_id, + const int data); + int (*get_mac_anti_spoof)(struct pci_dev *pdev, int vf_id, bool *data); + int (*set_mac_anti_spoof)(struct pci_dev *pdev, int vf_id, + const bool data); + int (*get_vlan_anti_spoof)(struct pci_dev *pdev, int vf_id, bool *data); + int (*set_vlan_anti_spoof)(struct pci_dev *pdev, int vf_id, + const bool data); + int (*get_allow_untagged)(struct pci_dev *pdev, int vf_id, bool *data); + int (*set_allow_untagged)(struct pci_dev *pdev, int vf_id, + const bool data); + int (*get_loopback)(struct pci_dev *pdev, int vf_id, bool *data); + int (*set_loopback)(struct pci_dev *pdev, int vf_id, const bool data); + int (*get_mac)(struct pci_dev *pdev, int vf_id, u8 *macaddr); + int (*set_mac)(struct pci_dev *pdev, int vf_id, const u8 *macaddr); + int (*get_mac_list)(struct pci_dev *pdev, int vf_id, + struct list_head *mac_list); + int (*add_macs_to_list)(struct pci_dev *pdev, int vf_id, + struct list_head *mac_list); + int (*rem_macs_from_list)(struct pci_dev *pdev, int vf_id, + struct list_head *mac_list); + int (*get_promisc)(struct pci_dev *pdev, int vf_id, u8 *data); + int (*set_promisc)(struct pci_dev *pdev, int vf_id, const u8 data); + int (*get_vlan_strip)(struct pci_dev *pdev, int vf_id, bool *data); + int (*set_vlan_strip)(struct pci_dev *pdev, int vf_id, const bool data); + int (*get_link_state)(struct pci_dev *pdev, int vf_id, bool *enabled, + enum vfd_link_speed *link_speed); + int (*set_link_state)(struct pci_dev *pdev, int vf_id, const u8 data); + int (*get_max_tx_rate)(struct pci_dev *pdev, int vf_id, + unsigned int *max_tx_rate); + int (*set_max_tx_rate)(struct pci_dev *pdev, int vf_id, + unsigned int *max_tx_rate); + int (*get_min_tx_rate)(struct kobject *, + struct kobj_attribute *, char *); + int (*set_min_tx_rate)(struct kobject *, struct kobj_attribute *, + const char *, size_t); + int (*get_spoofcheck)(struct kobject *, + struct kobj_attribute *, char *); + int (*set_spoofcheck)(struct kobject *, struct kobj_attribute *, + const char *, size_t); + int (*get_trust)(struct kobject *, + struct kobj_attribute *, char *); + int (*set_trust)(struct kobject *, struct kobj_attribute *, + const char *, size_t); + int (*get_vf_enable)(struct pci_dev *pdev, int vf_id, bool *data); + int (*set_vf_enable)(struct pci_dev *pdev, int vf_id, const bool data); + int (*get_rx_bytes) (struct pci_dev *pdev, int vf_id, u64 *data); + int (*get_rx_dropped)(struct pci_dev *pdev, int vf_id, u64 *data); + int (*get_rx_packets)(struct pci_dev *pdev, int vf_id, u64 *data); + int (*get_tx_bytes) (struct pci_dev *pdev, int vf_id, u64 *data); + int (*get_tx_dropped)(struct pci_dev *pdev, int vf_id, u64 *data); + int (*get_tx_packets)(struct pci_dev *pdev, int vf_id, u64 *data); + int (*get_tx_spoofed)(struct pci_dev *pdev, int vf_id, u64 *data); + int (*get_tx_errors)(struct pci_dev *pdev, int vf_id, u64 *data); + int (*reset_stats)(struct pci_dev *pdev, int vf_id); + int (*set_vf_bw_share)(struct pci_dev *pdev, int vf_id, u8 bw_share); + int (*get_vf_bw_share)(struct pci_dev *pdev, int vf_id, u8 *bw_share); + int (*set_pf_qos_apply)(struct pci_dev *pdev); + int (*get_pf_ingress_mirror)(struct pci_dev *pdev, int *data); + int (*set_pf_ingress_mirror)(struct pci_dev *pdev, const int data); + int (*get_pf_egress_mirror)(struct pci_dev *pdev, int *data); + int (*set_pf_egress_mirror)(struct pci_dev *pdev, const int data); + int (*get_pf_tpid)(struct pci_dev *pdev, u16 *data); + int (*set_pf_tpid)(struct pci_dev *pdev, const u16 data); + int (*get_num_queues)(struct pci_dev *pdev, int vf_id, int *num_queues); + int (*set_num_queues)(struct pci_dev *pdev, int vf_id, const int num_queues); + int (*get_trust_state)(struct pci_dev *pdev, int vf_id, bool *data); + int (*set_trust_state)(struct pci_dev *pdev, int vf_id, bool data); + int (*get_queue_type)(struct pci_dev *pdev, int vf_id, u8 *data); + int (*set_queue_type)(struct pci_dev *pdev, int vf_id, const u8 data); + int (*get_allow_bcast)(struct pci_dev *pdev, int vf_id, bool *data); + int (*set_allow_bcast)(struct pci_dev *pdev, int vf_id, const bool data); + int (*get_pf_qos_tc_max_bw)(struct pci_dev *pdev, int tc, u16 *req_bw); + int (*set_pf_qos_tc_max_bw)(struct pci_dev *pdev, int tc, u16 req_bw); + int (*get_pf_qos_tc_lsp)(struct pci_dev *pdev, int tc, bool *on); + int (*set_pf_qos_tc_lsp)(struct pci_dev *pdev, int tc, bool on); + int (*get_pf_qos_tc_priority)(struct pci_dev *pdev, int tc, + char *tc_bitmap); + int (*set_pf_qos_tc_priority)(struct pci_dev *pdev, int tc, + char tc_bitmap); + int (*get_vf_qos_tc_share)(struct pci_dev *pdev, int vf_id, int tc, + u8 *share); + int (*set_vf_qos_tc_share)(struct pci_dev *pdev, int vf_id, int tc, + u8 share); + int (*get_vf_max_tc_tx_rate)(struct pci_dev *pdev, int vf_id, int tc, + int *rate); + int (*set_vf_max_tc_tx_rate)(struct pci_dev *pdev, int vf_id, int tc, + int rate); +}; + +extern const struct vfd_ops *vfd_ops; + +#endif /* _KCOMPAT_VFD_H_ */ diff --git a/src/net/include/linux/dinghai/lag.h b/src/net/include/linux/dinghai/lag.h new file mode 100644 index 0000000..819297f --- /dev/null +++ b/src/net/include/linux/dinghai/lag.h @@ -0,0 +1,26 @@ +#ifndef __DINGHAI_LAG_H__ +#define __DINGHAI_LAG_H__ + +#include +#include + +#define ZXDH_PF_VFID(ep, pf) (1152 + ep * 8 + pf) + +struct zxdh_lag_attrs +{ + uint16_t pannel_id; + uint16_t vport; + uint32_t qid[2]; + uint16_t slot_id; + uint16_t pcie_id; + uint8_t phy_port; + uint8_t rsv; +}; + +void zxdh_regitster_ldev(struct dh_core_dev *dh_devs); +void zxdh_unregitster_ldev(struct dh_core_dev *dh_dev); + +int32_t zxdh_ldev_add_netdev(struct dh_core_dev *dev, uint16_t ida, struct net_device *netdev, struct zxdh_lag_attrs *attr); +void zxdh_ldev_remove_netdev(struct dh_core_dev *dh_dev, struct net_device *netdev, struct zxdh_lag_attrs *attr); + +#endif /* __DINGHAI_LAG_H__ */ \ No newline at end of file diff --git a/src/net/include/linux/dinghai/log.h b/src/net/include/linux/dinghai/log.h new file mode 100644 index 0000000..9d8bfbe --- /dev/null +++ b/src/net/include/linux/dinghai/log.h @@ -0,0 +1,39 @@ +#ifndef __KERNEL_LOG_H__ +#define __KERNEL_LOG_H__ + +#include +#include + +#define MODULE_CMD "zxdh_cmd" +#define MODULE_NP "zxdh_np" +#define MODULE_PF "zxdh_pf" +#define MODULE_PTP "zxdh_ptp" +#define MODULE_TSN "zxdh_tsn" +#define MODULE_LAG "zxdh_lag" +#define MODULE_DHTOOLS "zxdh_tool" +#define MODULE_SEC "zxdh_sec" +#define MODULE_MPF "zxdh_mpf" +#define MODULE_FUC_HP "zxdh_func_hp" + +#define DH_LOG_EMERG(module, fmt, arg...) \ + printk(KERN_EMERG "[%s][%s][%d] "fmt"", module, __func__, __LINE__, ##arg); + +#define DH_LOG_ALERT(module, fmt, arg...) \ + printk(KERN_ALERT "[%s][%s][%d] "fmt"", module, __func__, __LINE__, ##arg); + +#define DH_LOG_CRIT(module, fmt, arg...) \ + printk(KERN_CRIT "[%s][%s][%d] "fmt"", module, __func__, __LINE__, ##arg); + +#define DH_LOG_ERR(module, fmt, arg...) \ + printk(KERN_ERR "[%s][%s][%d] "fmt"", module, __func__, __LINE__, ##arg); + +#define DH_LOG_WARNING(module, fmt, arg...) \ + printk(KERN_WARNING "[%s][%s][%d] "fmt"", module, __func__, __LINE__, ##arg); + +#define DH_LOG_INFO(module, fmt, arg...) \ + printk(KERN_INFO "[%s][%s][%d] "fmt"", module, __func__, __LINE__, ##arg); + +#define DH_LOG_DEBUG(module, fmt, arg...) \ + printk(KERN_DEBUG "[%s][%s][%d] "fmt"", module, __func__, __LINE__, ##arg); + +#endif /* __KERNEL_LOG_H__ */ diff --git a/src/net/include/linux/dinghai/pci_irq.h b/src/net/include/linux/dinghai/pci_irq.h new file mode 100755 index 0000000..4ffb05d --- /dev/null +++ b/src/net/include/linux/dinghai/pci_irq.h @@ -0,0 +1,70 @@ +#ifndef DINGHAI_PCI_IRQ_H +#define DINGHAI_PCI_IRQ_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#define DH_MAX_IRQ_NAME 100 +#define DH_FW_RESERVED_EQS 16 +/* max irq_index is 2047, so four chars */ +#define DH_MAX_IRQ_IDX_CHARS (4) +#define DH_EQ_REFS_PER_IRQ (2) + +#define ZXDH_VQS_CHANNELS_NUM (64+2) +#define ZXDH_BOND_VQS_CHANNELS_NUM 3 +#define ZXDH_ASYNC_CHANNELS_NUM 38 +#define ZXDH_RDMA_CHANNELS_NUM 24 +#define ZXDH_RDMA_IRQ_START_IDX 38 +#define ZXDH_VQS_IRQ_START_IDX 62 + +struct dh_irq; + +struct dh_irq_pool { + char name[DH_MAX_IRQ_NAME]; + struct xa_limit xa_num_irqs; + struct mutex lock; /* sync IRQs creations */ + struct xarray irqs; + uint32_t max_threshold; + uint32_t min_threshold; + uint16_t *irqs_per_cpu; + struct dh_core_dev *dev; +}; + +static inline bool dh_irq_pool_is_sf_pool(struct dh_irq_pool *pool) +{ + return !strncmp("dh_mpf_sf", pool->name, strlen("dh_mpf_sf")); +} + +struct dh_irq *zxdh_get_irq_of_pool(struct dh_core_dev *dev, struct dh_irq_pool *pool); + +struct dh_irq *dh_irq_alloc(struct dh_irq_pool *pool, int32_t i, + const struct cpumask *affinity); + +int32_t dh_irq_read_locked(struct dh_irq *irq); +int32_t dh_irq_get_locked(struct dh_irq *irq); +int32_t dh_irq_put(struct dh_irq *irq); + +void irq_pool_free(struct dh_irq_pool *pool); +struct dh_irq_pool * +irq_pool_alloc(struct dh_core_dev *dev, int32_t start, int32_t size, char *name, + uint32_t min_threshold, uint32_t max_threshold); + +struct dh_irq { + struct atomic_notifier_head nh; /* notification chain invoked when an interruption is triggered. the invocation environment is the atomic context */ + cpumask_var_t mask; /* interrupt affinity */ + char name[DH_MAX_IRQ_NAME]; /* interrupt name */ + struct dh_irq_pool *pool; /* interrupt pool */ + int32_t refcount; + uint32_t index; /* interrupt vec index */ + int32_t irqn; /* interrupt number */ +}; + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/net/include/linux/dinghai/queue.h b/src/net/include/linux/dinghai/queue.h new file mode 100644 index 0000000..29cce9e --- /dev/null +++ b/src/net/include/linux/dinghai/queue.h @@ -0,0 +1,78 @@ +#ifndef __DINGHAI_QUEUE_H__ +#define __DINGHAI_QUEUE_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Vector value used to disable MSI for queue */ +#define ZXDH_MSI_NO_VECTOR 0xffff + +/* Status byte for guest to report progress, and synchronize features */ +/* We have seen device and processed generic fields */ +#define ZXDH_CONFIG_S_ACKNOWLEDGE 1 +/* We have found a driver for the device. */ +#define ZXDH_CONFIG_S_DRIVER 2 +/* Driver has used its parts of the config, and is happy */ +#define ZXDH_CONFIG_S_DRIVER_OK 4 +/* Driver has finished configuring features */ +#define ZXDH_CONFIG_S_FEATURES_OK 8 +/* Device entered invalid state, driver must reset it */ +#define ZXDH_CONFIG_S_NEEDS_RESET 0x40 +/* We've given up on this device */ +#define ZXDH_CONFIG_S_FAILED 0x80 + + +/* This is the PCI capability header: */ +struct zxdh_pf_pci_cap +{ + __u8 cap_vndr; /* Generic PCI field: PCI_CAP_ID_VNDR */ + __u8 cap_next; /* Generic PCI field: next ptr. */ + __u8 cap_len; /* Generic PCI field: capability length */ + __u8 cfg_type; /* Identifies the structure. */ + __u8 bar; /* Where to find it. */ + __u8 id; /* Multiple capabilities of the same type */ + __u8 padding[2]; /* Pad to full dword. */ + __le32 offset; /* Offset within bar. */ + __le32 length; /* Length of the structure, in bytes. */ +}; + +/* Fields in ZXDH_PF_PCI_CAP_COMMON_CFG: */ +struct zxdh_pf_pci_common_cfg +{ + /* About the whole device. */ + __le32 device_feature_select; /* read-write */ + __le32 device_feature; /* read-only */ + __le32 guest_feature_select; /* read-write */ + __le32 guest_feature; /* read-write */ + __le16 msix_config; /* read-write */ + __le16 num_queues; /* read-only */ + __u8 device_status; /* read-write */ + __u8 config_generation; /* read-only */ + + /* About a specific virtqueue. */ + __le16 queue_select; /* read-write */ + __le16 queue_size; /* read-write, power of 2. */ + __le16 queue_msix_vector; /* read-write */ + __le16 queue_enable; /* read-write */ + __le16 queue_notify_off; /* read-only */ + __le32 queue_desc_lo; /* read-write */ + __le32 queue_desc_hi; /* read-write */ + __le32 queue_avail_lo; /* read-write */ + __le32 queue_avail_hi; /* read-write */ + __le32 queue_used_lo; /* read-write */ + __le32 queue_used_hi; /* read-write */ +}; + +struct zxdh_pf_pci_notify_cap +{ + struct zxdh_pf_pci_cap cap; + __le32 notify_off_multiplier; /* Multiplier for queue_notify_off. */ +}; + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/net/include/linux/types.h b/src/net/include/linux/types.h new file mode 100755 index 0000000..0553b4e --- /dev/null +++ b/src/net/include/linux/types.h @@ -0,0 +1,5 @@ +#ifndef _COMPAT_LINUX_TYPES_H +#define _COMPAT_LINUX_TYPES_H 1 +#include_next + +#endif \ No newline at end of file diff --git a/src/net/pci.updates b/src/net/pci.updates new file mode 100644 index 0000000..f9fd22e --- /dev/null +++ b/src/net/pci.updates @@ -0,0 +1,44 @@ +# SPDX-License-Identifier: GPL-2.0-only +# Copyright (C) 1999 - 2023 ZTE Corporation + +# updates for the system pci.ids file +# +# IMPORTANT! Entries in this list must be sorted as they +# would appear in the system pci.ids file. Entries +# are sorted by ven, dev, subven, subdev +# (numerical order). +# + +# Vendors, devices and subsystems. Please keep sorted. + +# Syntax: +# vendor vendor_name +# device device_name <-- single tab +# subvendor subdevice subsystem_name <-- two tabs + +1111 Santa Cruz Operation + 1041 MPF Ethernet Controller +16c3 Synopsys, Inc. + 8040 PF BSI Ethernet Controller + 8041 VF BSI Ethernet Controller Virtual Function +1cf2 ZTE Corporation + 8040 NEO X510 SRIOV PF Ethernet Controller + 8041 NEO X510 SRIOV VF Ethernet Controller Virtual Function + 8042 NX I512 VDPA VF Ethernet Controller Virtual Function + 8044 NEO X510 MPF Ethernet Controller + 8045 NX I512 BOND PF Ethernet Controller + 8046 NX I512 OVS PF Ethernet Controller + 8047 NEO X510 BOND PF Ethernet Controller + 8048 NEO X510 OVS PF Ethernet Controller + 8049 NX E312 SRIOV PF Ethernet Controller + 8060 NX E312 SRIOV VF Ethernet Controller Virtual Function + 8061 NX E310 SRIOV PF Ethernet Controller + 8062 NX E310 SRIOV VF Ethernet Controller Virtual Function + 8063 NX I510 BOND PF Ethernet Controller + 8064 NX I510 OVS PF Ethernet Controller + 8065 NX I510 VDPA VF Ethernet Controller Virtual Function + 8066 NX I511 BOND PF Ethernet Controller + 8067 NX I511 OVS PF Ethernet Controller + 8068 NX I511 VDPA VF Ethernet Controller Virtual Function + + diff --git a/src/net/scripts/.gitignore b/src/net/scripts/.gitignore new file mode 100644 index 0000000..a6c1131 --- /dev/null +++ b/src/net/scripts/.gitignore @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: GPL-2.0-only +bin2c +kallsyms +unifdef +recordmcount +sorttable +asn1_compiler +extract-cert +sign-file +insert-sys-cert +/module.lds diff --git a/src/net/scripts/Kbuild.include b/src/net/scripts/Kbuild.include new file mode 100644 index 0000000..0d6e118 --- /dev/null +++ b/src/net/scripts/Kbuild.include @@ -0,0 +1,328 @@ +# SPDX-License-Identifier: GPL-2.0 +#### +# kbuild: Generic definitions + +# Convenient variables +comma := , +quote := " +squote := ' +empty := +space := $(empty) $(empty) +space_escape := _-_SPACE_-_ +pound := \# + +### +# Name of target with a '.' as filename prefix. foo/bar.o => foo/.bar.o +dot-target = $(dir $@).$(notdir $@) + +### +# The temporary file to save gcc -MMD generated dependencies must not +# contain a comma +depfile = $(subst $(comma),_,$(dot-target).d) + +### +# filename of target with directory and extension stripped +basetarget = $(basename $(notdir $@)) + +### +# real prerequisites without phony targets +real-prereqs = $(filter-out $(PHONY), $^) + +### +# Escape single quote for use in echo statements +escsq = $(subst $(squote),'\$(squote)',$1) + +### +# Quote a string to pass it to C files. foo => '"foo"' +stringify = $(squote)$(quote)$1$(quote)$(squote) + +### +# Easy method for doing a status message + kecho := : + quiet_kecho := echo +silent_kecho := : +kecho := $($(quiet)kecho) + +### +# filechk is used to check if the content of a generated file is updated. +# Sample usage: +# +# filechk_sample = echo $(KERNELRELEASE) +# version.h: FORCE +# $(call filechk,sample) +# +# The rule defined shall write to stdout the content of the new file. +# The existing file will be compared with the new one. +# - If no file exist it is created +# - If the content differ the new file is used +# - If they are equal no change, and no timestamp update +define filechk + $(Q)set -e; \ + mkdir -p $(dir $@); \ + trap "rm -f $(dot-target).tmp" EXIT; \ + { $(filechk_$(1)); } > $(dot-target).tmp; \ + if [ ! -r $@ ] || ! cmp -s $@ $(dot-target).tmp; then \ + $(kecho) ' UPD $@'; \ + mv -f $(dot-target).tmp $@; \ + fi +endef + +###### +# gcc support functions +# See documentation in Documentation/kbuild/makefiles.rst + +# cc-cross-prefix +# Usage: CROSS_COMPILE := $(call cc-cross-prefix, m68k-linux-gnu- m68k-linux-) +# Return first where a gcc is found in PATH. +# If no gcc found in PATH with listed prefixes return nothing +# +# Note: '2>/dev/null' is here to force Make to invoke a shell. Otherwise, it +# would try to directly execute the shell builtin 'command'. This workaround +# should be kept for a long time since this issue was fixed only after the +# GNU Make 4.2.1 release. +cc-cross-prefix = $(firstword $(foreach c, $(1), \ + $(if $(shell command -v -- $(c)gcc 2>/dev/null), $(c)))) + +# output directory for tests below +TMPOUT = $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/).tmp_$$$$ + +# try-run +# Usage: option = $(call try-run, $(CC)...-o "$$TMP",option-ok,otherwise) +# Exit code chooses option. "$$TMP" serves as a temporary file and is +# automatically cleaned up. +try-run = $(shell set -e; \ + TMP=$(TMPOUT)/tmp; \ + TMPO=$(TMPOUT)/tmp.o; \ + mkdir -p $(TMPOUT); \ + trap "rm -rf $(TMPOUT)" EXIT; \ + if ($(1)) >/dev/null 2>&1; \ + then echo "$(2)"; \ + else echo "$(3)"; \ + fi) + +# as-option +# Usage: cflags-y += $(call as-option,-Wa$(comma)-isa=foo,) + +as-option = $(call try-run,\ + $(CC) $(KBUILD_CFLAGS) $(1) -c -x assembler /dev/null -o "$$TMP",$(1),$(2)) + +# as-instr +# Usage: cflags-y += $(call as-instr,instr,option1,option2) + +as-instr = $(call try-run,\ + printf "%b\n" "$(1)" | $(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" -,$(2),$(3)) + +# __cc-option +# Usage: MY_CFLAGS += $(call __cc-option,$(CC),$(MY_CFLAGS),-march=winchip-c6,-march=i586) +__cc-option = $(call try-run,\ + $(1) -Werror $(2) $(3) -c -x c /dev/null -o "$$TMP",$(3),$(4)) + +# cc-option +# Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586) + +cc-option = $(call __cc-option, $(CC),\ + $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS),$(1),$(2)) + +# cc-option-yn +# Usage: flag := $(call cc-option-yn,-march=winchip-c6) +cc-option-yn = $(call try-run,\ + $(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",y,n) + +# cc-disable-warning +# Usage: cflags-y += $(call cc-disable-warning,unused-but-set-variable) +cc-disable-warning = $(call try-run,\ + $(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1))) + +# cc-ifversion +# Usage: EXTRA_CFLAGS += $(call cc-ifversion, -lt, 0402, -O1) +cc-ifversion = $(shell [ $(CONFIG_GCC_VERSION)0 $(1) $(2)000 ] && echo $(3) || echo $(4)) + +# ld-option +# Usage: KBUILD_LDFLAGS += $(call ld-option, -X, -Y) +ld-option = $(call try-run, $(LD) $(KBUILD_LDFLAGS) $(1) -v,$(1),$(2),$(3)) + +# ld-version +# Note this is mainly for HJ Lu's 3 number binutil versions +ld-version = $(shell $(LD) --version | $(srctree)/scripts/ld-version.sh) + +# ld-ifversion +# Usage: $(call ld-ifversion, -ge, 22252, y) +ld-ifversion = $(shell [ $(ld-version) $(1) $(2) ] && echo $(3) || echo $(4)) + +###### + +### +# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj= +# Usage: +# $(Q)$(MAKE) $(build)=dir +build := -f $(srctree)/scripts/Makefile.build obj + +### +# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.dtbinst obj= +# Usage: +# $(Q)$(MAKE) $(dtbinst)=dir +dtbinst := -f $(srctree)/scripts/Makefile.dtbinst obj + +### +# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.clean obj= +# Usage: +# $(Q)$(MAKE) $(clean)=dir +clean := -f $(srctree)/scripts/Makefile.clean obj + +# echo command. +# Short version is used, if $(quiet) equals `quiet_', otherwise full one. +echo-cmd = $(if $($(quiet)cmd_$(1)),\ + echo ' $(call escsq,$($(quiet)cmd_$(1)))$(echo-why)';) + +# sink stdout for 'make -s' + redirect := + quiet_redirect := +silent_redirect := exec >/dev/null; + +# printing commands +cmd = @set -e; $(echo-cmd) $($(quiet)redirect) $(cmd_$(1)) + +### +# if_changed - execute command if any prerequisite is newer than +# target, or command line has changed +# if_changed_dep - as if_changed, but uses fixdep to reveal dependencies +# including used config symbols +# if_changed_rule - as if_changed but execute rule instead +# See Documentation/kbuild/makefiles.rst for more info + +ifneq ($(KBUILD_NOCMDDEP),1) +# Check if both commands are the same including their order. Result is empty +# string if equal. User may override this check using make KBUILD_NOCMDDEP=1 +cmd-check = $(filter-out $(subst $(space),$(space_escape),$(strip $(cmd_$@))), \ + $(subst $(space),$(space_escape),$(strip $(cmd_$1)))) +else +cmd-check = $(if $(strip $(cmd_$@)),,1) +endif + +# Replace >$< with >$$< to preserve $ when reloading the .cmd file +# (needed for make) +# Replace >#< with >$(pound)< to avoid starting a comment in the .cmd file +# (needed for make) +# Replace >'< with >'\''< to be able to enclose the whole string in '...' +# (needed for the shell) +make-cmd = $(call escsq,$(subst $(pound),$$(pound),$(subst $$,$$$$,$(cmd_$(1))))) + +# Find any prerequisites that are newer than target or that do not exist. +# (This is not true for now; $? should contain any non-existent prerequisites, +# but it does not work as expected when .SECONDARY is present. This seems a bug +# of GNU Make.) +# PHONY targets skipped in both cases. +newer-prereqs = $(filter-out $(PHONY),$?) + +# Execute command if command has changed or prerequisite(s) are updated. +if_changed = $(if $(newer-prereqs)$(cmd-check), \ + $(cmd); \ + printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:) + +# Execute the command and also postprocess generated .d dependencies file. +if_changed_dep = $(if $(newer-prereqs)$(cmd-check),$(cmd_and_fixdep),@:) + +cmd_and_fixdep = \ + $(cmd); \ + scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(dot-target).cmd;\ + rm -f $(depfile) + +# Usage: $(call if_changed_rule,foo) +# Will check if $(cmd_foo) or any of the prerequisites changed, +# and if so will execute $(rule_foo). +if_changed_rule = $(if $(newer-prereqs)$(cmd-check),$(rule_$(1)),@:) + +### +# why - tell why a target got built +# enabled by make V=2 +# Output (listed in the order they are checked): +# (1) - due to target is PHONY +# (2) - due to target missing +# (3) - due to: file1.h file2.h +# (4) - due to command line change +# (5) - due to missing .cmd file +# (6) - due to target not in $(targets) +# (1) PHONY targets are always build +# (2) No target, so we better build it +# (3) Prerequisite is newer than target +# (4) The command line stored in the file named dir/.target.cmd +# differed from actual command line. This happens when compiler +# options changes +# (5) No dir/.target.cmd file (used to store command line) +# (6) No dir/.target.cmd file and target not listed in $(targets) +# This is a good hint that there is a bug in the kbuild file +ifeq ($(KBUILD_VERBOSE),2) +why = \ + $(if $(filter $@, $(PHONY)),- due to target is PHONY, \ + $(if $(wildcard $@), \ + $(if $(newer-prereqs),- due to: $(newer-prereqs), \ + $(if $(cmd-check), \ + $(if $(cmd_$@),- due to command line change, \ + $(if $(filter $@, $(targets)), \ + - due to missing .cmd file, \ + - due to $(notdir $@) not in $$(targets) \ + ) \ + ) \ + ) \ + ), \ + - due to target missing \ + ) \ + ) + +echo-why = $(call escsq, $(strip $(why))) +endif + +############################################################################### +# +# When a Kconfig string contains a filename, it is suitable for +# passing to shell commands. It is surrounded by double-quotes, and +# any double-quotes or backslashes within it are escaped by +# backslashes. +# +# This is no use for dependencies or $(wildcard). We need to strip the +# surrounding quotes and the escaping from quotes and backslashes, and +# we *do* need to escape any spaces in the string. So, for example: +# +# Usage: $(eval $(call config_filename,FOO)) +# +# Defines FOO_FILENAME based on the contents of the CONFIG_FOO option, +# transformed as described above to be suitable for use within the +# makefile. +# +# Also, if the filename is a relative filename and exists in the source +# tree but not the build tree, define FOO_SRCPREFIX as $(srctree)/ to +# be prefixed to *both* command invocation and dependencies. +# +# Note: We also print the filenames in the quiet_cmd_foo text, and +# perhaps ought to have a version specially escaped for that purpose. +# But it's only cosmetic, and $(patsubst "%",%,$(CONFIG_FOO)) is good +# enough. It'll strip the quotes in the common case where there's no +# space and it's a simple filename, and it'll retain the quotes when +# there's a space. There are some esoteric cases in which it'll print +# the wrong thing, but we don't really care. The actual dependencies +# and commands *do* get it right, with various combinations of single +# and double quotes, backslashes and spaces in the filenames. +# +############################################################################### +# +define config_filename +ifneq ($$(CONFIG_$(1)),"") +$(1)_FILENAME := $$(subst \\,\,$$(subst \$$(quote),$$(quote),$$(subst $$(space_escape),\$$(space),$$(patsubst "%",%,$$(subst $$(space),$$(space_escape),$$(CONFIG_$(1))))))) +ifneq ($$(patsubst /%,%,$$(firstword $$($(1)_FILENAME))),$$(firstword $$($(1)_FILENAME))) +else +ifeq ($$(wildcard $$($(1)_FILENAME)),) +ifneq ($$(wildcard $$(srctree)/$$($(1)_FILENAME)),) +$(1)_SRCPREFIX := $(srctree)/ +endif +endif +endif +endif +endef +# +############################################################################### + +# delete partially updated (i.e. corrupted) files on error +.DELETE_ON_ERROR: + +# do not delete intermediate files automatically +.SECONDARY: diff --git a/src/net/scripts/Kconfig.include b/src/net/scripts/Kconfig.include new file mode 100644 index 0000000..a5fe72c --- /dev/null +++ b/src/net/scripts/Kconfig.include @@ -0,0 +1,50 @@ +# SPDX-License-Identifier: GPL-2.0-only +# Kconfig helper macros + +# Convenient variables +comma := , +quote := " +squote := ' +empty := +space := $(empty) $(empty) +dollar := $ +right_paren := ) +left_paren := ( + +# $(if-success,,,) +# Return if exits with 0, otherwise. +if-success = $(shell,{ $(1); } >/dev/null 2>&1 && echo "$(2)" || echo "$(3)") + +# $(success,) +# Return y if exits with 0, n otherwise +success = $(if-success,$(1),y,n) + +# $(failure,) +# Return n if exits with 0, y otherwise +failure = $(if-success,$(1),n,y) + +# $(cc-option,) +# Return y if the compiler supports , n otherwise +cc-option = $(success,mkdir .tmp_$$$$; trap "rm -rf .tmp_$$$$" EXIT; $(CC) -Werror $(CLANG_FLAGS) $(1) -c -x c /dev/null -o .tmp_$$$$/tmp.o) + +# $(ld-option,) +# Return y if the linker supports , n otherwise +ld-option = $(success,$(LD) -v $(1)) + +# $(as-instr,) +# Return y if the assembler supports , n otherwise +as-instr = $(success,printf "%b\n" "$(1)" | $(CC) $(CLANG_FLAGS) -c -x assembler -o /dev/null -) + +# check if $(CC) and $(LD) exist +$(error-if,$(failure,command -v $(CC)),compiler '$(CC)' not found) +$(error-if,$(failure,command -v $(LD)),linker '$(LD)' not found) + +# Fail if the linker is gold as it's not capable of linking the kernel proper +$(error-if,$(success, $(LD) -v | grep -q gold), gold linker '$(LD)' not supported) + +# machine bit flags +# $(m32-flag): -m32 if the compiler supports it, or an empty string otherwise. +# $(m64-flag): -m64 if the compiler supports it, or an empty string otherwise. +cc-option-bit = $(if-success,$(CC) -Werror $(1) -E -x c /dev/null -o /dev/null,$(1)) +m32-flag := $(cc-option-bit,-m32) +m64-flag := $(cc-option-bit,-m64) diff --git a/src/net/scripts/Lindent b/src/net/scripts/Lindent new file mode 100755 index 0000000..1688c44 --- /dev/null +++ b/src/net/scripts/Lindent @@ -0,0 +1,26 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 + +PARAM="-npro -kr -i8 -ts8 -sob -l80 -ss -ncs -cp1" + +RES=`indent --version | cut -d' ' -f3` +if [ "$RES" = "" ]; then + exit 1 +fi +V1=`echo $RES | cut -d'.' -f1` +V2=`echo $RES | cut -d'.' -f2` +V3=`echo $RES | cut -d'.' -f3` + +if [ $V1 -gt 2 ]; then + PARAM="$PARAM -il0" +elif [ $V1 -eq 2 ]; then + if [ $V2 -gt 2 ]; then + PARAM="$PARAM -il0" + elif [ $V2 -eq 2 ]; then + if [ $V3 -ge 10 ]; then + PARAM="$PARAM -il0" + fi + fi +fi + +indent $PARAM "$@" diff --git a/src/net/scripts/Makefile b/src/net/scripts/Makefile new file mode 100644 index 0000000..399ebfb --- /dev/null +++ b/src/net/scripts/Makefile @@ -0,0 +1,56 @@ +# SPDX-License-Identifier: GPL-2.0 +### +# scripts contains sources for various helper programs used throughout +# the kernel for the build process. + +CRYPTO_LIBS = $(shell pkg-config --libs libcrypto 2> /dev/null || echo -lcrypto) +CRYPTO_CFLAGS = $(shell pkg-config --cflags libcrypto 2> /dev/null) + +hostprogs-always-$(CONFIG_BUILD_BIN2C) += bin2c +hostprogs-always-$(CONFIG_KALLSYMS) += kallsyms +hostprogs-always-$(BUILD_C_RECORDMCOUNT) += recordmcount +hostprogs-always-$(CONFIG_BUILDTIME_TABLE_SORT) += sorttable +hostprogs-always-$(CONFIG_ASN1) += asn1_compiler +hostprogs-always-$(CONFIG_MODULE_SIG_FORMAT) += sign-file +hostprogs-always-$(CONFIG_SYSTEM_TRUSTED_KEYRING) += extract-cert +hostprogs-always-$(CONFIG_SYSTEM_EXTRA_CERTIFICATE) += insert-sys-cert +hostprogs-always-$(CONFIG_SYSTEM_REVOCATION_LIST) += extract-cert + +HOSTCFLAGS_sorttable.o = -I$(srctree)/tools/include +HOSTLDLIBS_sorttable = -lpthread +HOSTCFLAGS_asn1_compiler.o = -I$(srctree)/include +HOSTCFLAGS_sign-file.o = $(CRYPTO_CFLAGS) +HOSTLDLIBS_sign-file = $(CRYPTO_LIBS) +HOSTCFLAGS_extract-cert.o = $(CRYPTO_CFLAGS) +HOSTLDLIBS_extract-cert = $(CRYPTO_LIBS) + +ifdef CONFIG_UNWINDER_ORC +ifneq ($(filter loongarch loongarch64, $(ARCH)),) +HOSTCFLAGS_sorttable.o += -I$(srctree)/tools/arch/loongarch/include +HOSTCFLAGS_sorttable.o += -DUNWINDER_ORC_ENABLED +HOSTLDLIBS_sorttable = -lpthread +else +ifeq ($(ARCH),x86_64) +ARCH := x86 +endif +HOSTCFLAGS_sorttable.o += -I$(srctree)/tools/arch/x86/include +HOSTCFLAGS_sorttable.o += -DUNWINDER_ORC_ENABLED +endif +endif + +ifdef CONFIG_BUILDTIME_MCOUNT_SORT +HOSTCFLAGS_sorttable.o += -DMCOUNT_SORT_ENABLED +endif + +# The following programs are only built on demand +hostprogs += unifdef + +# The module linker script is preprocessed on demand +targets += module.lds + +subdir-$(CONFIG_GCC_PLUGINS) += gcc-plugins +subdir-$(CONFIG_MODVERSIONS) += genksyms +subdir-$(CONFIG_SECURITY_SELINUX) += selinux + +# Let clean descend into subdirs +subdir- += basic dtc gdb kconfig mod diff --git a/src/net/scripts/Makefile.asm-generic b/src/net/scripts/Makefile.asm-generic new file mode 100644 index 0000000..82ad63d --- /dev/null +++ b/src/net/scripts/Makefile.asm-generic @@ -0,0 +1,58 @@ +# SPDX-License-Identifier: GPL-2.0 +# include/asm-generic contains a lot of files that are used +# verbatim by several architectures. +# +# This Makefile reads the file arch/$(SRCARCH)/include/(uapi/)/asm/Kbuild +# and for each file listed in this file with generic-y creates +# a small wrapper file in arch/$(SRCARCH)/include/generated/(uapi/)/asm. + +PHONY := all +all: + +src := $(subst /generated,,$(obj)) +-include $(src)/Kbuild + +# $(generic)/Kbuild lists mandatory-y. Exclude um since it is a special case. +ifneq ($(SRCARCH),um) +include $(generic)/Kbuild +endif + +include scripts/Kbuild.include + +redundant := $(filter $(mandatory-y) $(generated-y), $(generic-y)) +redundant += $(foreach f, $(generic-y), $(if $(wildcard $(srctree)/$(src)/$(f)),$(f))) +redundant := $(sort $(redundant)) +$(if $(redundant),\ + $(warning redundant generic-y found in $(src)/Kbuild: $(redundant))) + +# If arch does not implement mandatory headers, fallback to asm-generic ones. +mandatory-y := $(filter-out $(generated-y), $(mandatory-y)) +generic-y += $(foreach f, $(mandatory-y), $(if $(wildcard $(srctree)/$(src)/$(f)),,$(f))) + +generic-y := $(addprefix $(obj)/, $(generic-y)) +generated-y := $(addprefix $(obj)/, $(generated-y)) + +# Remove stale wrappers when the corresponding files are removed from generic-y +old-headers := $(wildcard $(obj)/*.h) +unwanted := $(filter-out $(generic-y) $(generated-y),$(old-headers)) + +quiet_cmd_wrap = WRAP $@ + cmd_wrap = echo "\#include " > $@ + +quiet_cmd_remove = REMOVE $(unwanted) + cmd_remove = rm -f $(unwanted) + +all: $(generic-y) + $(if $(unwanted),$(call cmd,remove)) + @: + +$(obj)/%.h: + $(call cmd,wrap) + +# Create output directory. Skip it if at least one old header exists +# since we know the output directory already exists. +ifeq ($(old-headers),) +$(shell mkdir -p $(obj)) +endif + +.PHONY: $(PHONY) diff --git a/src/net/scripts/Makefile.build b/src/net/scripts/Makefile.build new file mode 100644 index 0000000..17e8b20 --- /dev/null +++ b/src/net/scripts/Makefile.build @@ -0,0 +1,533 @@ +# SPDX-License-Identifier: GPL-2.0 +# ========================================================================== +# Building +# ========================================================================== + +src := $(obj) + +PHONY := __build +__build: + +# Init all relevant variables used in kbuild files so +# 1) they have correct type +# 2) they do not inherit any value from the environment +obj-y := +obj-m := +lib-y := +lib-m := +always := +always-y := +always-m := +targets := +subdir-y := +subdir-m := +EXTRA_AFLAGS := +EXTRA_CFLAGS := +EXTRA_CPPFLAGS := +EXTRA_LDFLAGS := +asflags-y := +ccflags-y := +cppflags-y := +ldflags-y := + +subdir-asflags-y := +subdir-ccflags-y := + +# Read auto.conf if it exists, otherwise ignore +-include include/config/auto.conf + +include scripts/Kbuild.include + +# The filename Kbuild has precedence over Makefile +kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) +kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile) +include $(kbuild-file) + +include scripts/Makefile.lib + +# Do not include hostprogs rules unless needed. +# $(sort ...) is used here to remove duplicated words and excessive spaces. +hostprogs := $(sort $(hostprogs)) +ifneq ($(hostprogs),) +include scripts/Makefile.host +endif + +# Do not include userprogs rules unless needed. +# $(sort ...) is used here to remove duplicated words and excessive spaces. +userprogs := $(sort $(userprogs)) +ifneq ($(userprogs),) +include scripts/Makefile.userprogs +endif + +ifndef obj +$(warning kbuild: Makefile.build is included improperly) +endif + +ifeq ($(need-modorder),) +ifneq ($(obj-m),) +$(warning $(patsubst %.o,'%.ko',$(obj-m)) will not be built even though obj-m is specified.) +$(warning You cannot use subdir-y/m to visit a module Makefile. Use obj-y/m instead.) +endif +endif + +# =========================================================================== + +# subdir-builtin and subdir-modorder may contain duplications. Use $(sort ...) +subdir-builtin := $(sort $(filter %/built-in.a, $(real-obj-y))) +subdir-modorder := $(sort $(filter %/modules.order, $(obj-m))) + +targets-for-builtin := $(extra-y) + +ifneq ($(strip $(lib-y) $(lib-m) $(lib-)),) +targets-for-builtin += $(obj)/lib.a +endif + +ifdef need-builtin +targets-for-builtin += $(obj)/built-in.a +endif + +targets-for-modules := $(patsubst %.o, %.mod, $(filter %.o, $(obj-m))) + +ifdef need-modorder +targets-for-modules += $(obj)/modules.order +endif + +targets += $(targets-for-builtin) $(targets-for-modules) + +# Linus' kernel sanity checking tool +ifeq ($(KBUILD_CHECKSRC),1) + quiet_cmd_checksrc = CHECK $< + cmd_checksrc = $(CHECK) $(CHECKFLAGS) $(c_flags) $< +else ifeq ($(KBUILD_CHECKSRC),2) + quiet_cmd_force_checksrc = CHECK $< + cmd_force_checksrc = $(CHECK) $(CHECKFLAGS) $(c_flags) $< +endif + +ifneq ($(KBUILD_EXTRA_WARN),) + cmd_checkdoc = $(srctree)/scripts/kernel-doc -none $< +endif + +# Compile C sources (.c) +# --------------------------------------------------------------------------- + +quiet_cmd_cc_s_c = CC $(quiet_modtag) $@ + cmd_cc_s_c = $(CC) $(filter-out $(DEBUG_CFLAGS), $(c_flags)) -fverbose-asm -S -o $@ $< + +$(obj)/%.s: $(src)/%.c FORCE + $(call if_changed_dep,cc_s_c) + +quiet_cmd_cpp_i_c = CPP $(quiet_modtag) $@ +cmd_cpp_i_c = $(CPP) $(c_flags) -o $@ $< + +$(obj)/%.i: $(src)/%.c FORCE + $(call if_changed_dep,cpp_i_c) + +# These mirror gensymtypes_S and co below, keep them in synch. +cmd_gensymtypes_c = \ + $(CPP) -D__GENKSYMS__ $(c_flags) $< | \ + scripts/genksyms/genksyms $(if $(1), -T $(2)) \ + $(patsubst y,-R,$(CONFIG_MODULE_REL_CRCS)) \ + $(if $(KBUILD_PRESERVE),-p) \ + -r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null)) + +quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@ +cmd_cc_symtypes_c = \ + $(call cmd_gensymtypes_c,true,$@) >/dev/null; \ + test -s $@ || rm -f $@ + +$(obj)/%.symtypes : $(src)/%.c FORCE + $(call cmd,cc_symtypes_c) + +# LLVM assembly +# Generate .ll files from .c +quiet_cmd_cc_ll_c = CC $(quiet_modtag) $@ + cmd_cc_ll_c = $(CC) $(c_flags) -emit-llvm -S -o $@ $< + +$(obj)/%.ll: $(src)/%.c FORCE + $(call if_changed_dep,cc_ll_c) + +# C (.c) files +# The C file is compiled and updated dependency information is generated. +# (See cmd_cc_o_c + relevant part of rule_cc_o_c) + +quiet_cmd_cc_o_c = CC $(quiet_modtag) $@ + cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $< + +ifdef CONFIG_MODVERSIONS +# When module versioning is enabled the following steps are executed: +# o compile a .o from .c +# o if .o doesn't contain a __ksymtab version, i.e. does +# not export symbols, it's done. +# o otherwise, we calculate symbol versions using the good old +# genksyms on the preprocessed source and postprocess them in a way +# that they are usable as a linker script +# o generate .tmp_.o from .o using the linker to +# replace the unresolved symbols __crc_exported_symbol with +# the actual value of the checksum generated by genksyms +# o remove .tmp_.o to .o + +cmd_modversions_c = \ + if $(OBJDUMP) -h $@ | grep -q __ksymtab; then \ + $(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \ + > $(@D)/.tmp_$(@F:.o=.ver); \ + \ + $(LD) $(KBUILD_LDFLAGS) -r -o $(@D)/.tmp_$(@F) $@ \ + -T $(@D)/.tmp_$(@F:.o=.ver); \ + mv -f $(@D)/.tmp_$(@F) $@; \ + rm -f $(@D)/.tmp_$(@F:.o=.ver); \ + fi +endif + +ifdef CONFIG_FTRACE_MCOUNT_RECORD +ifndef CC_USING_RECORD_MCOUNT +# compiler will not generate __mcount_loc use recordmcount or recordmcount.pl +ifdef BUILD_C_RECORDMCOUNT +ifeq ("$(origin RECORDMCOUNT_WARN)", "command line") + RECORDMCOUNT_FLAGS = -w +endif +# Due to recursion, we must skip empty.o. +# The empty.o file is created in the make process in order to determine +# the target endianness and word size. It is made before all other C +# files, including recordmcount. +sub_cmd_record_mcount = \ + if [ $(@) != "scripts/mod/empty.o" ]; then \ + $(objtree)/scripts/recordmcount $(RECORDMCOUNT_FLAGS) "$(@)"; \ + fi; +recordmcount_source := $(srctree)/scripts/recordmcount.c \ + $(srctree)/scripts/recordmcount.h +else +sub_cmd_record_mcount = perl $(srctree)/scripts/recordmcount.pl "$(ARCH)" \ + "$(if $(CONFIG_CPU_BIG_ENDIAN),big,little)" \ + "$(if $(CONFIG_64BIT),64,32)" \ + "$(OBJDUMP)" "$(OBJCOPY)" "$(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS)" \ + "$(LD) $(KBUILD_LDFLAGS)" "$(NM)" "$(RM)" "$(MV)" \ + "$(if $(part-of-module),1,0)" "$(@)"; +recordmcount_source := $(srctree)/scripts/recordmcount.pl +endif # BUILD_C_RECORDMCOUNT +cmd_record_mcount = $(if $(findstring $(strip $(CC_FLAGS_FTRACE)),$(_c_flags)), \ + $(sub_cmd_record_mcount)) +endif # CC_USING_RECORD_MCOUNT +endif # CONFIG_FTRACE_MCOUNT_RECORD + +ifdef CONFIG_STACK_VALIDATION +ifneq ($(SKIP_STACK_VALIDATION),1) + +__objtool_obj := $(objtree)/tools/objtool/objtool + +objtool_args = $(if $(CONFIG_UNWINDER_ORC),orc generate,check) + +objtool_args += $(if $(part-of-module), --module,) + +ifndef CONFIG_FRAME_POINTER +objtool_args += --no-fp +endif +ifdef CONFIG_GCOV_KERNEL +objtool_args += --no-unreachable +endif +ifdef CONFIG_RETPOLINE + objtool_args += --retpoline +endif +ifdef CONFIG_RETHUNK + objtool_args += --rethunk +endif +ifdef CONFIG_X86_SMAP + objtool_args += --uaccess +endif +ifdef CONFIG_SLS + objtool_args += --sls +endif + +# 'OBJECT_FILES_NON_STANDARD := y': skip objtool checking for a directory +# 'OBJECT_FILES_NON_STANDARD_foo.o := 'y': skip objtool checking for a file +# 'OBJECT_FILES_NON_STANDARD_foo.o := 'n': override directory skip for a file +cmd_objtool = $(if $(patsubst y%,, \ + $(OBJECT_FILES_NON_STANDARD_$(basetarget).o)$(OBJECT_FILES_NON_STANDARD)n), \ + $(__objtool_obj) $(objtool_args) $@) +objtool_obj = $(if $(patsubst y%,, \ + $(OBJECT_FILES_NON_STANDARD_$(basetarget).o)$(OBJECT_FILES_NON_STANDARD)n), \ + $(__objtool_obj)) + +endif # SKIP_STACK_VALIDATION +endif # CONFIG_STACK_VALIDATION + +# Rebuild all objects when objtool changes, or is enabled/disabled. +objtool_dep = $(objtool_obj) \ + $(wildcard include/config/orc/unwinder.h \ + include/config/stack/validation.h) + +ifdef CONFIG_TRIM_UNUSED_KSYMS +cmd_gen_ksymdeps = \ + $(CONFIG_SHELL) $(srctree)/scripts/gen_ksymdeps.sh $@ >> $(dot-target).cmd + +# List module undefined symbols +undefined_syms = $(NM) $< | $(AWK) '$$1 == "U" { printf("%s%s", x++ ? " " : "", $$2) }'; +endif + +define rule_cc_o_c + $(call cmd_and_fixdep,cc_o_c) + $(call cmd,gen_ksymdeps) + $(call cmd,checksrc) + $(call cmd,checkdoc) + $(call cmd,objtool) + $(call cmd,modversions_c) + $(call cmd,record_mcount) +endef + +define rule_as_o_S + $(call cmd_and_fixdep,as_o_S) + $(call cmd,gen_ksymdeps) + $(call cmd,objtool) + $(call cmd,modversions_S) +endef + +# Built-in and composite module parts +.SECONDEXPANSION: +$(obj)/%.o: $(src)/%.c $(recordmcount_source) $$(objtool_dep) FORCE + $(call if_changed_rule,cc_o_c) + $(call cmd,force_checksrc) + +cmd_mod = { \ + echo $(if $($*-objs)$($*-y)$($*-m), $(addprefix $(obj)/, $($*-objs) $($*-y) $($*-m)), $(@:.mod=.o)); \ + $(undefined_syms) echo; \ + } > $@ + +$(obj)/%.mod: $(obj)/%.o FORCE + $(call if_changed,mod) + +quiet_cmd_cc_lst_c = MKLST $@ + cmd_cc_lst_c = $(CC) $(c_flags) -g -c -o $*.o $< && \ + $(CONFIG_SHELL) $(srctree)/scripts/makelst $*.o \ + System.map $(OBJDUMP) > $@ + +$(obj)/%.lst: $(src)/%.c FORCE + $(call if_changed_dep,cc_lst_c) + +# Compile assembler sources (.S) +# --------------------------------------------------------------------------- + +# .S file exports must have their C prototypes defined in asm/asm-prototypes.h +# or a file that it includes, in order to get versioned symbols. We build a +# dummy C file that includes asm-prototypes and the EXPORT_SYMBOL lines from +# the .S file (with trailing ';'), and run genksyms on that, to extract vers. +# +# This is convoluted. The .S file must first be preprocessed to run guards and +# expand names, then the resulting exports must be constructed into plain +# EXPORT_SYMBOL(symbol); to build our dummy C file, and that gets preprocessed +# to make the genksyms input. +# +# These mirror gensymtypes_c and co above, keep them in synch. +cmd_gensymtypes_S = \ + { echo "\#include " ; \ + echo "\#include " ; \ + $(CPP) $(a_flags) $< | \ + grep "\<___EXPORT_SYMBOL\>" | \ + sed 's/.*___EXPORT_SYMBOL[[:space:]]*\([a-zA-Z0-9_]*\)[[:space:]]*,.*/EXPORT_SYMBOL(\1);/' ; } | \ + $(CPP) -D__GENKSYMS__ $(c_flags) -xc - | \ + scripts/genksyms/genksyms $(if $(1), -T $(2)) \ + $(patsubst y,-R,$(CONFIG_MODULE_REL_CRCS)) \ + $(if $(KBUILD_PRESERVE),-p) \ + -r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null)) + +quiet_cmd_cc_symtypes_S = SYM $(quiet_modtag) $@ +cmd_cc_symtypes_S = \ + $(call cmd_gensymtypes_S,true,$@) >/dev/null; \ + test -s $@ || rm -f $@ + +$(obj)/%.symtypes : $(src)/%.S FORCE + $(call cmd,cc_symtypes_S) + + +quiet_cmd_cpp_s_S = CPP $(quiet_modtag) $@ +cmd_cpp_s_S = $(CPP) $(a_flags) -o $@ $< + +$(obj)/%.s: $(src)/%.S FORCE + $(call if_changed_dep,cpp_s_S) + +quiet_cmd_as_o_S = AS $(quiet_modtag) $@ + cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $< + +ifdef CONFIG_ASM_MODVERSIONS + +# versioning matches the C process described above, with difference that +# we parse asm-prototypes.h C header to get function definitions. + +cmd_modversions_S = \ + if $(OBJDUMP) -h $@ | grep -q __ksymtab; then \ + $(call cmd_gensymtypes_S,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \ + > $(@D)/.tmp_$(@F:.o=.ver); \ + \ + $(LD) $(KBUILD_LDFLAGS) -r -o $(@D)/.tmp_$(@F) $@ \ + -T $(@D)/.tmp_$(@F:.o=.ver); \ + mv -f $(@D)/.tmp_$(@F) $@; \ + rm -f $(@D)/.tmp_$(@F:.o=.ver); \ + fi +endif + +$(obj)/%.o: $(src)/%.S $$(objtool_dep) FORCE + $(call if_changed_rule,as_o_S) + +targets += $(filter-out $(subdir-builtin), $(real-obj-y)) +targets += $(filter-out $(subdir-modorder), $(real-obj-m)) +targets += $(lib-y) $(always-y) $(MAKECMDGOALS) + +# Linker scripts preprocessor (.lds.S -> .lds) +# --------------------------------------------------------------------------- +quiet_cmd_cpp_lds_S = LDS $@ + cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -U$(ARCH) \ + -D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $< + +$(obj)/%.lds: $(src)/%.lds.S FORCE + $(call if_changed_dep,cpp_lds_S) + +# ASN.1 grammar +# --------------------------------------------------------------------------- +quiet_cmd_asn1_compiler = ASN.1 $(basename $@).[ch] + cmd_asn1_compiler = $(objtree)/scripts/asn1_compiler $< \ + $(basename $@).c $(basename $@).h + +$(obj)/%.asn1.c $(obj)/%.asn1.h: $(src)/%.asn1 $(objtree)/scripts/asn1_compiler + $(call cmd,asn1_compiler) + +# Build the compiled-in targets +# --------------------------------------------------------------------------- + +# To build objects in subdirs, we need to descend into the directories +$(subdir-builtin): $(obj)/%/built-in.a: $(obj)/% ; +$(subdir-modorder): $(obj)/%/modules.order: $(obj)/% ; + +# +# Rule to compile a set of .o files into one .a file (without symbol table) +# + +quiet_cmd_ar_builtin = AR $@ + cmd_ar_builtin = rm -f $@; $(AR) cDPrST $@ $(real-prereqs) + +$(obj)/built-in.a: $(real-obj-y) FORCE + $(call if_changed,ar_builtin) + +# +# Rule to create modules.order file +# +# Create commands to either record .ko file or cat modules.order from +# a subdirectory +# Add $(obj-m) as the prerequisite to avoid updating the timestamp of +# modules.order unless contained modules are updated. + +cmd_modules_order = { $(foreach m, $(real-prereqs), \ + $(if $(filter %/modules.order, $m), cat $m, echo $(patsubst %.o,%.ko,$m));) :; } \ + | $(AWK) '!x[$$0]++' - > $@ + +$(obj)/modules.order: $(obj-m) FORCE + $(call if_changed,modules_order) + +# +# Rule to compile a set of .o files into one .a file (with symbol table) +# +$(obj)/lib.a: $(lib-y) FORCE + $(call if_changed,ar) + +# NOTE: +# Do not replace $(filter %.o,^) with $(real-prereqs). When a single object +# module is turned into a multi object module, $^ will contain header file +# dependencies recorded in the .*.cmd file. +quiet_cmd_link_multi-m = LD [M] $@ + cmd_link_multi-m = $(LD) $(ld_flags) -r -o $@ $(filter %.o,$^) + +$(multi-used-m): FORCE + $(call if_changed,link_multi-m) +$(call multi_depend, $(multi-used-m), .o, -objs -y -m) + +targets += $(multi-used-m) +targets := $(filter-out $(PHONY), $(targets)) + +# Add intermediate targets: +# When building objects with specific suffix patterns, add intermediate +# targets that the final targets are derived from. +intermediate_targets = $(foreach sfx, $(2), \ + $(patsubst %$(strip $(1)),%$(sfx), \ + $(filter %$(strip $(1)), $(targets)))) +# %.asn1.o <- %.asn1.[ch] <- %.asn1 +# %.dtb.o <- %.dtb.S <- %.dtb <- %.dts +# %.lex.o <- %.lex.c <- %.l +# %.tab.o <- %.tab.[ch] <- %.y +targets += $(call intermediate_targets, .asn1.o, .asn1.c .asn1.h) \ + $(call intermediate_targets, .dtb.o, .dtb.S .dtb) \ + $(call intermediate_targets, .lex.o, .lex.c) \ + $(call intermediate_targets, .tab.o, .tab.c .tab.h) + +# Build +# --------------------------------------------------------------------------- + +ifdef single-build + +KBUILD_SINGLE_TARGETS := $(filter $(obj)/%, $(KBUILD_SINGLE_TARGETS)) + +curdir-single := $(sort $(foreach x, $(KBUILD_SINGLE_TARGETS), \ + $(if $(filter $(x) $(basename $(x)).o, $(targets)), $(x)))) + +# Handle single targets without any rule: show "Nothing to be done for ..." or +# "No rule to make target ..." depending on whether the target exists. +unknown-single := $(filter-out $(addsuffix /%, $(subdir-ym)), \ + $(filter-out $(curdir-single), $(KBUILD_SINGLE_TARGETS))) + +single-subdirs := $(foreach d, $(subdir-ym), \ + $(if $(filter $(d)/%, $(KBUILD_SINGLE_TARGETS)), $(d))) + +__build: $(curdir-single) $(single-subdirs) +ifneq ($(unknown-single),) + $(Q)$(MAKE) -f /dev/null $(unknown-single) +endif + @: + +ifeq ($(curdir-single),) +# Nothing to do in this directory. Do not include any .*.cmd file for speed-up +targets := +else +targets += $(curdir-single) +endif + +else + +__build: $(if $(KBUILD_BUILTIN), $(targets-for-builtin)) \ + $(if $(KBUILD_MODULES), $(targets-for-modules)) \ + $(subdir-ym) $(always-y) + @: + +endif + +# Descending +# --------------------------------------------------------------------------- + +PHONY += $(subdir-ym) +$(subdir-ym): + $(Q)$(MAKE) $(build)=$@ \ + $(if $(filter $@/, $(KBUILD_SINGLE_TARGETS)),single-build=) \ + need-builtin=$(if $(filter $@/built-in.a, $(subdir-builtin)),1) \ + need-modorder=$(if $(filter $@/modules.order, $(subdir-modorder)),1) + +# Add FORCE to the prequisites of a target to force it to be always rebuilt. +# --------------------------------------------------------------------------- + +PHONY += FORCE + +FORCE: + +# Read all saved command lines and dependencies for the $(targets) we +# may be building above, using $(if_changed{,_dep}). As an +# optimization, we don't need to read them if the target does not +# exist, we will rebuild anyway in that case. + +existing-targets := $(wildcard $(sort $(targets))) + +-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd) + +# Create directories for object files if they do not exist +obj-dirs := $(sort $(patsubst %/,%, $(dir $(targets)))) +# If targets exist, their directories apparently exist. Skip mkdir. +existing-dirs := $(sort $(patsubst %/,%, $(dir $(existing-targets)))) +obj-dirs := $(strip $(filter-out $(existing-dirs), $(obj-dirs))) +ifneq ($(obj-dirs),) +$(shell mkdir -p $(obj-dirs)) +endif + +.PHONY: $(PHONY) diff --git a/src/net/scripts/Makefile.clean b/src/net/scripts/Makefile.clean new file mode 100644 index 0000000..d9e0cea --- /dev/null +++ b/src/net/scripts/Makefile.clean @@ -0,0 +1,73 @@ +# SPDX-License-Identifier: GPL-2.0 +# ========================================================================== +# Cleaning up +# ========================================================================== + +src := $(obj) + +PHONY := __clean +__clean: + +include scripts/Kbuild.include + +# The filename Kbuild has precedence over Makefile +kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) +include $(if $(wildcard $(kbuild-dir)/Kbuild), $(kbuild-dir)/Kbuild, $(kbuild-dir)/Makefile) + +# Figure out what we need to build from the various variables +# ========================================================================== + +subdir-ymn := $(sort $(subdir-y) $(subdir-m) $(subdir-) \ + $(patsubst %/,%, $(filter %/, $(obj-y) $(obj-m) $(obj-)))) + +# Add subdir path + +subdir-ymn := $(addprefix $(obj)/,$(subdir-ymn)) + +# build a list of files to remove, usually relative to the current +# directory + +__clean-files := \ + $(clean-files) $(targets) $(hostprogs) $(userprogs) \ + $(extra-y) $(extra-m) $(extra-) \ + $(always-y) $(always-m) $(always-) \ + $(hostprogs-always-y) $(hostprogs-always-m) $(hostprogs-always-) \ + $(userprogs-always-y) $(userprogs-always-m) $(userprogs-always-) + +# deprecated +__clean-files += $(always) $(hostprogs-y) $(hostprogs-m) $(hostprogs-) + +__clean-files := $(filter-out $(no-clean-files), $(__clean-files)) + +# clean-files is given relative to the current directory, unless it +# starts with $(objtree)/ (which means "./", so do not add "./" unless +# you want to delete a file from the toplevel object directory). + +__clean-files := $(wildcard \ + $(addprefix $(obj)/, $(filter-out $(objtree)/%, $(__clean-files))) \ + $(filter $(objtree)/%, $(__clean-files))) + +# ========================================================================== + +quiet_cmd_clean = CLEAN $(obj) + cmd_clean = rm -rf $(__clean-files) + +__clean: $(subdir-ymn) +ifneq ($(strip $(__clean-files)),) + $(call cmd,clean) +endif + @: + + +# =========================================================================== +# Generic stuff +# =========================================================================== + +# Descending +# --------------------------------------------------------------------------- + +PHONY += $(subdir-ymn) +$(subdir-ymn): + $(Q)$(MAKE) $(clean)=$@ + +.PHONY: $(PHONY) diff --git a/src/net/scripts/Makefile.dtbinst b/src/net/scripts/Makefile.dtbinst new file mode 100644 index 0000000..50d580d --- /dev/null +++ b/src/net/scripts/Makefile.dtbinst @@ -0,0 +1,36 @@ +# SPDX-License-Identifier: GPL-2.0 +# ========================================================================== +# Installing dtb files +# +# Installs all dtb files listed in $(dtb-y) either in the +# INSTALL_DTBS_PATH directory or the default location: +# +# $INSTALL_PATH/dtbs/$KERNELRELEASE +# ========================================================================== + +src := $(obj) + +PHONY := __dtbs_install +__dtbs_install: + +include include/config/auto.conf +include scripts/Kbuild.include +include $(src)/Makefile + +dtbs := $(addprefix $(dst)/, $(dtb-y) $(if $(CONFIG_OF_ALL_DTBS),$(dtb-))) +subdirs := $(addprefix $(obj)/, $(subdir-y) $(subdir-m)) + +__dtbs_install: $(dtbs) $(subdirs) + @: + +quiet_cmd_dtb_install = INSTALL $@ + cmd_dtb_install = install -D $< $@ + +$(dst)/%.dtb: $(obj)/%.dtb + $(call cmd,dtb_install) + +PHONY += $(subdirs) +$(subdirs): + $(Q)$(MAKE) $(dtbinst)=$@ dst=$(patsubst $(obj)/%,$(dst)/%,$@) + +.PHONY: $(PHONY) diff --git a/src/net/scripts/Makefile.extrawarn b/src/net/scripts/Makefile.extrawarn new file mode 100644 index 0000000..23d3967 --- /dev/null +++ b/src/net/scripts/Makefile.extrawarn @@ -0,0 +1,96 @@ +# SPDX-License-Identifier: GPL-2.0 +# ========================================================================== +# make W=... settings +# +# There are three warning groups enabled by W=1, W=2, W=3. +# They are independent, and can be combined like W=12 or W=123. +# ========================================================================== + +KBUILD_CFLAGS += $(call cc-disable-warning, packed-not-aligned) + +# backward compatibility +KBUILD_EXTRA_WARN ?= $(KBUILD_ENABLE_EXTRA_GCC_CHECKS) + +ifeq ("$(origin W)", "command line") + KBUILD_EXTRA_WARN := $(W) +endif + +export KBUILD_EXTRA_WARN + +# +# W=1 - warnings which may be relevant and do not occur too often +# +ifneq ($(findstring 1, $(KBUILD_EXTRA_WARN)),) + +KBUILD_CFLAGS += -Wextra -Wunused -Wno-unused-parameter +KBUILD_CFLAGS += -Wmissing-declarations +KBUILD_CFLAGS += -Wmissing-format-attribute +KBUILD_CFLAGS += -Wmissing-prototypes +KBUILD_CFLAGS += -Wold-style-definition +KBUILD_CFLAGS += -Wmissing-include-dirs +KBUILD_CFLAGS += $(call cc-option, -Wunused-but-set-variable) +KBUILD_CFLAGS += $(call cc-option, -Wunused-const-variable) +KBUILD_CFLAGS += $(call cc-option, -Wpacked-not-aligned) +KBUILD_CFLAGS += $(call cc-option, -Wstringop-truncation) +# The following turn off the warnings enabled by -Wextra +KBUILD_CFLAGS += -Wno-missing-field-initializers +KBUILD_CFLAGS += -Wno-sign-compare +KBUILD_CFLAGS += -Wno-type-limits + +KBUILD_CPPFLAGS += -DKBUILD_EXTRA_WARN1 + +else + +# Some diagnostics enabled by default are noisy. +# Suppress them by using -Wno... except for W=1. + +ifdef CONFIG_CC_IS_CLANG +KBUILD_CFLAGS += -Wno-initializer-overrides +KBUILD_CFLAGS += -Wno-format +KBUILD_CFLAGS += -Wno-sign-compare +KBUILD_CFLAGS += -Wno-format-zero-length +KBUILD_CFLAGS += $(call cc-disable-warning, pointer-to-enum-cast) +KBUILD_CFLAGS += -Wno-tautological-constant-out-of-range-compare +KBUILD_CFLAGS += $(call cc-disable-warning, unaligned-access) +endif + +endif + +# +# W=2 - warnings which occur quite often but may still be relevant +# +ifneq ($(findstring 2, $(KBUILD_EXTRA_WARN)),) + +KBUILD_CFLAGS += -Wdisabled-optimization +KBUILD_CFLAGS += -Wnested-externs +KBUILD_CFLAGS += -Wshadow +KBUILD_CFLAGS += $(call cc-option, -Wlogical-op) +KBUILD_CFLAGS += -Wmissing-field-initializers +KBUILD_CFLAGS += -Wtype-limits +KBUILD_CFLAGS += $(call cc-option, -Wmaybe-uninitialized) +KBUILD_CFLAGS += $(call cc-option, -Wunused-macros) + +KBUILD_CPPFLAGS += -DKBUILD_EXTRA_WARN2 + +endif + +# +# W=3 - more obscure warnings, can most likely be ignored +# +ifneq ($(findstring 3, $(KBUILD_EXTRA_WARN)),) + +KBUILD_CFLAGS += -Wbad-function-cast +KBUILD_CFLAGS += -Wcast-align +KBUILD_CFLAGS += -Wcast-qual +KBUILD_CFLAGS += -Wconversion +KBUILD_CFLAGS += -Wpacked +KBUILD_CFLAGS += -Wpadded +KBUILD_CFLAGS += -Wpointer-arith +KBUILD_CFLAGS += -Wredundant-decls +KBUILD_CFLAGS += -Wsign-compare +KBUILD_CFLAGS += -Wswitch-default +KBUILD_CFLAGS += $(call cc-option, -Wpacked-bitfield-compat) + +KBUILD_CPPFLAGS += -DKBUILD_EXTRA_WARN3 + +endif diff --git a/src/net/scripts/Makefile.gcc-plugins b/src/net/scripts/Makefile.gcc-plugins new file mode 100644 index 0000000..4aad284 --- /dev/null +++ b/src/net/scripts/Makefile.gcc-plugins @@ -0,0 +1,65 @@ +# SPDX-License-Identifier: GPL-2.0 + +gcc-plugin-$(CONFIG_GCC_PLUGIN_CYC_COMPLEXITY) += cyc_complexity_plugin.so + +gcc-plugin-$(CONFIG_GCC_PLUGIN_LATENT_ENTROPY) += latent_entropy_plugin.so +gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_LATENT_ENTROPY) \ + += -DLATENT_ENTROPY_PLUGIN +ifdef CONFIG_GCC_PLUGIN_LATENT_ENTROPY + DISABLE_LATENT_ENTROPY_PLUGIN += -fplugin-arg-latent_entropy_plugin-disable +endif +export DISABLE_LATENT_ENTROPY_PLUGIN + +gcc-plugin-$(CONFIG_GCC_PLUGIN_SANCOV) += sancov_plugin.so + +gcc-plugin-$(CONFIG_GCC_PLUGIN_STRUCTLEAK) += structleak_plugin.so +gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK_VERBOSE) \ + += -fplugin-arg-structleak_plugin-verbose +gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF) \ + += -fplugin-arg-structleak_plugin-byref +gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL) \ + += -fplugin-arg-structleak_plugin-byref-all +ifdef CONFIG_GCC_PLUGIN_STRUCTLEAK + DISABLE_STRUCTLEAK_PLUGIN += -fplugin-arg-structleak_plugin-disable +endif +export DISABLE_STRUCTLEAK_PLUGIN +gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK) \ + += -DSTRUCTLEAK_PLUGIN + +gcc-plugin-$(CONFIG_GCC_PLUGIN_RANDSTRUCT) += randomize_layout_plugin.so +gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_RANDSTRUCT) \ + += -DRANDSTRUCT_PLUGIN +gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_RANDSTRUCT_PERFORMANCE) \ + += -fplugin-arg-randomize_layout_plugin-performance-mode + +gcc-plugin-$(CONFIG_GCC_PLUGIN_STACKLEAK) += stackleak_plugin.so +gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STACKLEAK) \ + += -DSTACKLEAK_PLUGIN +gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STACKLEAK) \ + += -fplugin-arg-stackleak_plugin-track-min-size=$(CONFIG_STACKLEAK_TRACK_MIN_SIZE) +gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STACKLEAK) \ + += -fplugin-arg-stackleak_plugin-arch=$(SRCARCH) +ifdef CONFIG_GCC_PLUGIN_STACKLEAK + DISABLE_STACKLEAK_PLUGIN += -fplugin-arg-stackleak_plugin-disable +endif +export DISABLE_STACKLEAK_PLUGIN + +gcc-plugin-$(CONFIG_GCC_PLUGIN_ARM_SSP_PER_TASK) += arm_ssp_per_task_plugin.so +ifdef CONFIG_GCC_PLUGIN_ARM_SSP_PER_TASK + DISABLE_ARM_SSP_PER_TASK_PLUGIN += -fplugin-arg-arm_ssp_per_task_plugin-disable +endif +export DISABLE_ARM_SSP_PER_TASK_PLUGIN + +# All the plugin CFLAGS are collected here in case a build target needs to +# filter them out of the KBUILD_CFLAGS. +GCC_PLUGINS_CFLAGS := $(strip $(addprefix -fplugin=$(objtree)/scripts/gcc-plugins/, $(gcc-plugin-y)) $(gcc-plugin-cflags-y)) +# The sancov_plugin.so is included via CFLAGS_KCOV, so it is removed here. +GCC_PLUGINS_CFLAGS := $(filter-out %/sancov_plugin.so, $(GCC_PLUGINS_CFLAGS)) +export GCC_PLUGINS_CFLAGS + +# Add the flags to the build! +KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS) + +# All enabled GCC plugins are collected here for building below. +GCC_PLUGIN := $(gcc-plugin-y) +export GCC_PLUGIN diff --git a/src/net/scripts/Makefile.headersinst b/src/net/scripts/Makefile.headersinst new file mode 100644 index 0000000..708fbd0 --- /dev/null +++ b/src/net/scripts/Makefile.headersinst @@ -0,0 +1,84 @@ +# SPDX-License-Identifier: GPL-2.0 +# ========================================================================== +# Installing headers +# +# All headers under include/uapi, include/generated/uapi, +# arch//include/uapi and arch//include/generated/uapi are +# exported. +# They are preprocessed to remove __KERNEL__ section of the file. +# +# ========================================================================== + +PHONY := __headers +__headers: + +include scripts/Kbuild.include + +src := $(srctree)/$(obj) +gen := $(objtree)/$(subst include/,include/generated/,$(obj)) +dst := usr/include + +-include $(src)/Kbuild + +# $(filter %/, ...) is a workaround for GNU Make <= 4.2.1, where +# $(wildcard $(src)/*/) contains not only directories but also regular files. +src-subdirs := $(patsubst $(src)/%/,%,$(filter %/, $(wildcard $(src)/*/))) +gen-subdirs := $(patsubst $(gen)/%/,%,$(filter %/, $(wildcard $(gen)/*/))) +all-subdirs := $(sort $(src-subdirs) $(gen-subdirs)) + +src-headers := $(if $(src-subdirs), $(shell cd $(src) && find $(src-subdirs) -name '*.h')) +src-headers := $(filter-out $(no-export-headers), $(src-headers)) +gen-headers := $(if $(gen-subdirs), $(shell cd $(gen) && find $(gen-subdirs) -name '*.h')) +gen-headers := $(filter-out $(no-export-headers), $(gen-headers)) + +# If the same header is exported from source and generated directories, +# the former takes precedence, but this should be warned. +duplicated := $(filter $(gen-headers), $(src-headers)) +$(if $(duplicated), $(warning duplicated header export: $(duplicated))) + +gen-headers := $(filter-out $(duplicated), $(gen-headers)) + +# Add dst path prefix +all-subdirs := $(addprefix $(dst)/, $(all-subdirs)) +src-headers := $(addprefix $(dst)/, $(src-headers)) +gen-headers := $(addprefix $(dst)/, $(gen-headers)) +all-headers := $(src-headers) $(gen-headers) + +# Work out what needs to be removed +old-subdirs := $(wildcard $(all-subdirs)) +old-headers := $(if $(old-subdirs),$(shell find $(old-subdirs) -name '*.h')) +unwanted := $(filter-out $(all-headers), $(old-headers)) + +# Create directories +existing-dirs := $(sort $(dir $(old-headers))) +wanted-dirs := $(sort $(dir $(all-headers))) +new-dirs := $(filter-out $(existing-dirs), $(wanted-dirs)) +$(if $(new-dirs), $(shell mkdir -p $(new-dirs))) + +# Rules +quiet_cmd_install = HDRINST $@ + cmd_install = $(CONFIG_SHELL) $(srctree)/scripts/headers_install.sh $< $@ + +$(src-headers): $(dst)/%.h: $(src)/%.h $(srctree)/scripts/headers_install.sh FORCE + $(call if_changed,install) + +$(gen-headers): $(dst)/%.h: $(gen)/%.h $(srctree)/scripts/headers_install.sh FORCE + $(call if_changed,install) + +quiet_cmd_remove = REMOVE $(unwanted) + cmd_remove = rm -f $(unwanted) + +__headers: $(all-headers) +ifneq ($(unwanted),) + $(call cmd,remove) +endif + @: + +existing-headers := $(filter $(old-headers), $(all-headers)) + +-include $(foreach f,$(existing-headers),$(dir $(f)).$(notdir $(f)).cmd) + +PHONY += FORCE +FORCE: + +.PHONY: $(PHONY) diff --git a/src/net/scripts/Makefile.host b/src/net/scripts/Makefile.host new file mode 100644 index 0000000..278b4d6 --- /dev/null +++ b/src/net/scripts/Makefile.host @@ -0,0 +1,132 @@ +# SPDX-License-Identifier: GPL-2.0 + +# LEX +# --------------------------------------------------------------------------- +quiet_cmd_flex = LEX $@ + cmd_flex = $(LEX) -o$@ -L $< + +$(obj)/%.lex.c: $(src)/%.l FORCE + $(call if_changed,flex) + +# YACC +# --------------------------------------------------------------------------- +quiet_cmd_bison = YACC $(basename $@).[ch] + cmd_bison = $(YACC) -o $(basename $@).c --defines=$(basename $@).h -t -l $< + +$(obj)/%.tab.c $(obj)/%.tab.h: $(src)/%.y FORCE + $(call if_changed,bison) + +# ========================================================================== +# Building binaries on the host system +# Binaries are used during the compilation of the kernel, for example +# to preprocess a data file. +# +# Both C and C++ are supported, but preferred language is C for such utilities. +# +# Sample syntax (see Documentation/kbuild/makefiles.rst for reference) +# hostprogs := bin2hex +# Will compile bin2hex.c and create an executable named bin2hex +# +# hostprogs := lxdialog +# lxdialog-objs := checklist.o lxdialog.o +# Will compile lxdialog.c and checklist.c, and then link the executable +# lxdialog, based on checklist.o and lxdialog.o +# +# hostprogs := qconf +# qconf-cxxobjs := qconf.o +# qconf-objs := menu.o +# Will compile qconf as a C++ program, and menu as a C program. +# They are linked as C++ code to the executable qconf + +# C code +# Executables compiled from a single .c file +host-csingle := $(foreach m,$(hostprogs), \ + $(if $($(m)-objs)$($(m)-cxxobjs),,$(m))) + +# C executables linked based on several .o files +host-cmulti := $(foreach m,$(hostprogs),\ + $(if $($(m)-cxxobjs),,$(if $($(m)-objs),$(m)))) + +# Object (.o) files compiled from .c files +host-cobjs := $(sort $(foreach m,$(hostprogs),$($(m)-objs))) + +# C++ code +# C++ executables compiled from at least one .cc file +# and zero or more .c files +host-cxxmulti := $(foreach m,$(hostprogs),$(if $($(m)-cxxobjs),$(m))) + +# C++ Object (.o) files compiled from .cc files +host-cxxobjs := $(sort $(foreach m,$(host-cxxmulti),$($(m)-cxxobjs))) + +host-csingle := $(addprefix $(obj)/,$(host-csingle)) +host-cmulti := $(addprefix $(obj)/,$(host-cmulti)) +host-cobjs := $(addprefix $(obj)/,$(host-cobjs)) +host-cxxmulti := $(addprefix $(obj)/,$(host-cxxmulti)) +host-cxxobjs := $(addprefix $(obj)/,$(host-cxxobjs)) + +##### +# Handle options to gcc. Support building with separate output directory + +_hostc_flags = $(KBUILD_HOSTCFLAGS) $(HOST_EXTRACFLAGS) \ + $(HOSTCFLAGS_$(target-stem).o) +_hostcxx_flags = $(KBUILD_HOSTCXXFLAGS) $(HOST_EXTRACXXFLAGS) \ + $(HOSTCXXFLAGS_$(target-stem).o) + +# $(objtree)/$(obj) for including generated headers from checkin source files +ifeq ($(KBUILD_EXTMOD),) +ifdef building_out_of_srctree +_hostc_flags += -I $(objtree)/$(obj) +_hostcxx_flags += -I $(objtree)/$(obj) +endif +endif + +hostc_flags = -Wp,-MMD,$(depfile) $(_hostc_flags) +hostcxx_flags = -Wp,-MMD,$(depfile) $(_hostcxx_flags) + +##### +# Compile programs on the host + +# Create executable from a single .c file +# host-csingle -> Executable +quiet_cmd_host-csingle = HOSTCC $@ + cmd_host-csingle = $(HOSTCC) $(hostc_flags) $(KBUILD_HOSTLDFLAGS) -o $@ $< \ + $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(target-stem)) +$(host-csingle): $(obj)/%: $(src)/%.c FORCE + $(call if_changed_dep,host-csingle) + +# Link an executable based on list of .o files, all plain c +# host-cmulti -> executable +quiet_cmd_host-cmulti = HOSTLD $@ + cmd_host-cmulti = $(HOSTCC) $(KBUILD_HOSTLDFLAGS) -o $@ \ + $(addprefix $(obj)/, $($(target-stem)-objs)) \ + $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(target-stem)) +$(host-cmulti): FORCE + $(call if_changed,host-cmulti) +$(call multi_depend, $(host-cmulti), , -objs) + +# Create .o file from a single .c file +# host-cobjs -> .o +quiet_cmd_host-cobjs = HOSTCC $@ + cmd_host-cobjs = $(HOSTCC) $(hostc_flags) -c -o $@ $< +$(host-cobjs): $(obj)/%.o: $(src)/%.c FORCE + $(call if_changed_dep,host-cobjs) + +# Link an executable based on list of .o files, a mixture of .c and .cc +# host-cxxmulti -> executable +quiet_cmd_host-cxxmulti = HOSTLD $@ + cmd_host-cxxmulti = $(HOSTCXX) $(KBUILD_HOSTLDFLAGS) -o $@ \ + $(foreach o,objs cxxobjs,\ + $(addprefix $(obj)/, $($(target-stem)-$(o)))) \ + $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(target-stem)) +$(host-cxxmulti): FORCE + $(call if_changed,host-cxxmulti) +$(call multi_depend, $(host-cxxmulti), , -objs -cxxobjs) + +# Create .o file from a single .cc (C++) file +quiet_cmd_host-cxxobjs = HOSTCXX $@ + cmd_host-cxxobjs = $(HOSTCXX) $(hostcxx_flags) -c -o $@ $< +$(host-cxxobjs): $(obj)/%.o: $(src)/%.cc FORCE + $(call if_changed_dep,host-cxxobjs) + +targets += $(host-csingle) $(host-cmulti) $(host-cobjs) \ + $(host-cxxmulti) $(host-cxxobjs) diff --git a/src/net/scripts/Makefile.kasan b/src/net/scripts/Makefile.kasan new file mode 100644 index 0000000..127012f --- /dev/null +++ b/src/net/scripts/Makefile.kasan @@ -0,0 +1,51 @@ +# SPDX-License-Identifier: GPL-2.0 +CFLAGS_KASAN_NOSANITIZE := -fno-builtin +KASAN_SHADOW_OFFSET ?= $(CONFIG_KASAN_SHADOW_OFFSET) + +cc-param = $(call cc-option, -mllvm -$(1), $(call cc-option, --param $(1))) + +ifdef CONFIG_KASAN_GENERIC + +ifdef CONFIG_KASAN_INLINE + call_threshold := 10000 +else + call_threshold := 0 +endif + +CFLAGS_KASAN_MINIMAL := -fsanitize=kernel-address + +# -fasan-shadow-offset fails without -fsanitize +CFLAGS_KASAN_SHADOW := $(call cc-option, -fsanitize=kernel-address \ + -fasan-shadow-offset=$(KASAN_SHADOW_OFFSET), \ + $(call cc-option, -fsanitize=kernel-address \ + -mllvm -asan-mapping-offset=$(KASAN_SHADOW_OFFSET))) + +ifeq ($(strip $(CFLAGS_KASAN_SHADOW)),) + CFLAGS_KASAN := $(CFLAGS_KASAN_MINIMAL) +else + # Now add all the compiler specific options that are valid standalone + CFLAGS_KASAN := $(CFLAGS_KASAN_SHADOW) \ + $(call cc-param,asan-globals=1) \ + $(call cc-param,asan-instrumentation-with-call-threshold=$(call_threshold)) \ + $(call cc-param,asan-stack=$(CONFIG_KASAN_STACK)) \ + $(call cc-param,asan-instrument-allocas=1) +endif + +endif # CONFIG_KASAN_GENERIC + +ifdef CONFIG_KASAN_SW_TAGS + +ifdef CONFIG_KASAN_INLINE + instrumentation_flags := $(call cc-param,hwasan-mapping-offset=$(KASAN_SHADOW_OFFSET)) +else + instrumentation_flags := $(call cc-param,hwasan-instrument-with-calls=1) +endif + +CFLAGS_KASAN := -fsanitize=kernel-hwaddress \ + $(call cc-param,hwasan-instrument-stack=$(CONFIG_KASAN_STACK)) \ + $(call cc-param,hwasan-use-short-granules=0) \ + $(instrumentation_flags) + +endif # CONFIG_KASAN_SW_TAGS + +export CFLAGS_KASAN CFLAGS_KASAN_NOSANITIZE diff --git a/src/net/scripts/Makefile.kcov b/src/net/scripts/Makefile.kcov new file mode 100644 index 0000000..67e8cfe --- /dev/null +++ b/src/net/scripts/Makefile.kcov @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: GPL-2.0-only +kcov-flags-$(CONFIG_CC_HAS_SANCOV_TRACE_PC) += -fsanitize-coverage=trace-pc +kcov-flags-$(CONFIG_KCOV_ENABLE_COMPARISONS) += -fsanitize-coverage=trace-cmp +kcov-flags-$(CONFIG_GCC_PLUGIN_SANCOV) += -fplugin=$(objtree)/scripts/gcc-plugins/sancov_plugin.so + +export CFLAGS_KCOV := $(kcov-flags-y) diff --git a/src/net/scripts/Makefile.kcsan b/src/net/scripts/Makefile.kcsan new file mode 100644 index 0000000..37cb504 --- /dev/null +++ b/src/net/scripts/Makefile.kcsan @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: GPL-2.0 +# GCC and Clang accept backend options differently. Do not wrap in cc-option, +# because Clang accepts "--param" even if it is unused. +ifdef CONFIG_CC_IS_CLANG +cc-param = -mllvm -$(1) +else +cc-param = --param $(1) +endif + +# Keep most options here optional, to allow enabling more compilers if absence +# of some options does not break KCSAN nor causes false positive reports. +export CFLAGS_KCSAN := -fsanitize=thread \ + $(call cc-option,$(call cc-param,tsan-instrument-func-entry-exit=0) -fno-optimize-sibling-calls) \ + $(call cc-option,$(call cc-param,tsan-compound-read-before-write=1),$(call cc-option,$(call cc-param,tsan-instrument-read-before-write=1))) \ + $(call cc-param,tsan-distinguish-volatile=1) diff --git a/src/net/scripts/Makefile.lib b/src/net/scripts/Makefile.lib new file mode 100644 index 0000000..9413370 --- /dev/null +++ b/src/net/scripts/Makefile.lib @@ -0,0 +1,478 @@ +# SPDX-License-Identifier: GPL-2.0 +# Backward compatibility +asflags-y += $(EXTRA_AFLAGS) +ccflags-y += $(EXTRA_CFLAGS) +cppflags-y += $(EXTRA_CPPFLAGS) +ldflags-y += $(EXTRA_LDFLAGS) +ifneq ($(always),) +$(warning 'always' is deprecated. Please use 'always-y' instead) +always-y += $(always) +endif +ifneq ($(hostprogs-y),) +$(warning 'hostprogs-y' is deprecated. Please use 'hostprogs' instead) +hostprogs += $(hostprogs-y) +endif +ifneq ($(hostprogs-m),) +$(warning 'hostprogs-m' is deprecated. Please use 'hostprogs' instead) +hostprogs += $(hostprogs-m) +endif + +# flags that take effect in current and sub directories +KBUILD_AFLAGS += $(subdir-asflags-y) +KBUILD_CFLAGS += $(subdir-ccflags-y) + +# Figure out what we need to build from the various variables +# =========================================================================== + +# When an object is listed to be built compiled-in and modular, +# only build the compiled-in version +obj-m := $(filter-out $(obj-y),$(obj-m)) + +# Libraries are always collected in one lib file. +# Filter out objects already built-in +lib-y := $(filter-out $(obj-y), $(sort $(lib-y) $(lib-m))) + +# Subdirectories we need to descend into +subdir-ym := $(sort $(subdir-y) $(subdir-m) \ + $(patsubst %/,%, $(filter %/, $(obj-y) $(obj-m)))) + +# Handle objects in subdirs: +# - If we encounter foo/ in $(obj-y), replace it by foo/built-in.a and +# foo/modules.order +# - If we encounter foo/ in $(obj-m), replace it by foo/modules.order +# +# Generate modules.order to determine modorder. Unfortunately, we don't have +# information about ordering between -y and -m subdirs. Just put -y's first. + +ifdef need-modorder +obj-m := $(patsubst %/,%/modules.order, $(filter %/, $(obj-y)) $(obj-m)) +else +obj-m := $(filter-out %/, $(obj-m)) +endif + +ifdef need-builtin +obj-y := $(patsubst %/, %/built-in.a, $(obj-y)) +else +obj-y := $(filter-out %/, $(obj-y)) +endif + +# If $(foo-objs), $(foo-y), $(foo-m), or $(foo-) exists, foo.o is a composite object +multi-used-y := $(sort $(foreach m,$(obj-y), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y)) $($(m:.o=-))), $(m)))) +multi-used-m := $(sort $(foreach m,$(obj-m), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y)) $($(m:.o=-m)) $($(m:.o=-))), $(m)))) +multi-used := $(multi-used-y) $(multi-used-m) + +# Replace multi-part objects by their individual parts, +# including built-in.a from subdirectories +real-obj-y := $(foreach m, $(obj-y), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y)) $($(m:.o=-))),$($(m:.o=-objs)) $($(m:.o=-y)),$(m))) +real-obj-m := $(foreach m, $(obj-m), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y)) $($(m:.o=-m)) $($(m:.o=-))),$($(m:.o=-objs)) $($(m:.o=-y)) $($(m:.o=-m)),$(m))) + +always-y += $(always-m) + +# hostprogs-always-y += foo +# ... is a shorthand for +# hostprogs += foo +# always-y += foo +hostprogs += $(hostprogs-always-y) $(hostprogs-always-m) +always-y += $(hostprogs-always-y) $(hostprogs-always-m) + +# userprogs-always-y is likewise. +userprogs += $(userprogs-always-y) $(userprogs-always-m) +always-y += $(userprogs-always-y) $(userprogs-always-m) + +# DTB +# If CONFIG_OF_ALL_DTBS is enabled, all DT blobs are built +extra-y += $(dtb-y) +extra-$(CONFIG_OF_ALL_DTBS) += $(dtb-) + +ifneq ($(CHECK_DTBS),) +extra-y += $(patsubst %.dtb,%.dt.yaml, $(dtb-y)) +extra-$(CONFIG_OF_ALL_DTBS) += $(patsubst %.dtb,%.dt.yaml, $(dtb-)) +endif + +# Add subdir path + +extra-y := $(addprefix $(obj)/,$(extra-y)) +always-y := $(addprefix $(obj)/,$(always-y)) +targets := $(addprefix $(obj)/,$(targets)) +obj-m := $(addprefix $(obj)/,$(obj-m)) +lib-y := $(addprefix $(obj)/,$(lib-y)) +real-obj-y := $(addprefix $(obj)/,$(real-obj-y)) +real-obj-m := $(addprefix $(obj)/,$(real-obj-m)) +multi-used-m := $(addprefix $(obj)/,$(multi-used-m)) +subdir-ym := $(addprefix $(obj)/,$(subdir-ym)) + +# Finds the multi-part object the current object will be linked into. +# If the object belongs to two or more multi-part objects, list them all. +modname-multi = $(sort $(foreach m,$(multi-used),\ + $(if $(filter $*.o, $($(m:.o=-objs)) $($(m:.o=-y)) $($(m:.o=-m))),$(m:.o=)))) + +__modname = $(if $(modname-multi),$(modname-multi),$(basetarget)) + +modname = $(subst $(space),:,$(__modname)) +modfile = $(addprefix $(obj)/,$(__modname)) + +# target with $(obj)/ and its suffix stripped +target-stem = $(basename $(patsubst $(obj)/%,%,$@)) + +# These flags are needed for modversions and compiling, so we define them here +# $(modname_flags) defines KBUILD_MODNAME as the name of the module it will +# end up in (or would, if it gets compiled in) +name-fix = $(call stringify,$(subst $(comma),_,$(subst -,_,$1))) +basename_flags = -DKBUILD_BASENAME=$(call name-fix,$(basetarget)) +modname_flags = -DKBUILD_MODNAME=$(call name-fix,$(modname)) +modfile_flags = -DKBUILD_MODFILE=$(call stringify,$(modfile)) + +_c_flags = $(filter-out $(CFLAGS_REMOVE_$(target-stem).o), \ + $(filter-out $(ccflags-remove-y), \ + $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(ccflags-y)) \ + $(CFLAGS_$(target-stem).o)) +_a_flags = $(filter-out $(AFLAGS_REMOVE_$(target-stem).o), \ + $(filter-out $(asflags-remove-y), \ + $(KBUILD_CPPFLAGS) $(KBUILD_AFLAGS) $(asflags-y)) \ + $(AFLAGS_$(target-stem).o)) +_cpp_flags = $(KBUILD_CPPFLAGS) $(cppflags-y) $(CPPFLAGS_$(target-stem).lds) + +# +# Enable gcov profiling flags for a file, directory or for all files depending +# on variables GCOV_PROFILE_obj.o, GCOV_PROFILE and CONFIG_GCOV_PROFILE_ALL +# (in this order) +# +ifeq ($(CONFIG_GCOV_KERNEL),y) +_c_flags += $(if $(patsubst n%,, \ + $(GCOV_PROFILE_$(basetarget).o)$(GCOV_PROFILE)$(CONFIG_GCOV_PROFILE_ALL)), \ + $(CFLAGS_GCOV)) +endif + +# +# Enable address sanitizer flags for kernel except some files or directories +# we don't want to check (depends on variables KASAN_SANITIZE_obj.o, KASAN_SANITIZE) +# +ifeq ($(CONFIG_KASAN),y) +_c_flags += $(if $(patsubst n%,, \ + $(KASAN_SANITIZE_$(basetarget).o)$(KASAN_SANITIZE)y), \ + $(CFLAGS_KASAN), $(CFLAGS_KASAN_NOSANITIZE)) +endif + +ifeq ($(CONFIG_UBSAN),y) +_c_flags += $(if $(patsubst n%,, \ + $(UBSAN_SANITIZE_$(basetarget).o)$(UBSAN_SANITIZE)$(CONFIG_UBSAN_SANITIZE_ALL)), \ + $(CFLAGS_UBSAN)) +endif + +ifeq ($(CONFIG_KCOV),y) +_c_flags += $(if $(patsubst n%,, \ + $(KCOV_INSTRUMENT_$(basetarget).o)$(KCOV_INSTRUMENT)$(CONFIG_KCOV_INSTRUMENT_ALL)), \ + $(CFLAGS_KCOV)) +endif + +# +# Enable KCSAN flags except some files or directories we don't want to check +# (depends on variables KCSAN_SANITIZE_obj.o, KCSAN_SANITIZE) +# +ifeq ($(CONFIG_KCSAN),y) +_c_flags += $(if $(patsubst n%,, \ + $(KCSAN_SANITIZE_$(basetarget).o)$(KCSAN_SANITIZE)y), \ + $(CFLAGS_KCSAN)) +endif + +# $(srctree)/$(src) for including checkin headers from generated source files +# $(objtree)/$(obj) for including generated headers from checkin source files +ifeq ($(KBUILD_EXTMOD),) +ifdef building_out_of_srctree +_c_flags += -I $(srctree)/$(src) -I $(objtree)/$(obj) +_a_flags += -I $(srctree)/$(src) -I $(objtree)/$(obj) +_cpp_flags += -I $(srctree)/$(src) -I $(objtree)/$(obj) +endif +endif + +part-of-module = $(if $(filter $(basename $@).o, $(real-obj-m)),y) +quiet_modtag = $(if $(part-of-module),[M], ) + +modkern_cflags = \ + $(if $(part-of-module), \ + $(KBUILD_CFLAGS_MODULE) $(CFLAGS_MODULE), \ + $(KBUILD_CFLAGS_KERNEL) $(CFLAGS_KERNEL) $(modfile_flags)) + +modkern_aflags = $(if $(part-of-module), \ + $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE), \ + $(KBUILD_AFLAGS_KERNEL) $(AFLAGS_KERNEL)) + +c_flags = -Wp,-MMD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \ + -include $(srctree)/include/linux/compiler_types.h \ + $(_c_flags) $(modkern_cflags) \ + $(basename_flags) $(modname_flags) + +a_flags = -Wp,-MMD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \ + $(_a_flags) $(modkern_aflags) + +cpp_flags = -Wp,-MMD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \ + $(_cpp_flags) + +ld_flags = $(KBUILD_LDFLAGS) $(ldflags-y) $(LDFLAGS_$(@F)) + +DTC_INCLUDE := $(srctree)/scripts/dtc/include-prefixes + +dtc_cpp_flags = -Wp,-MMD,$(depfile).pre.tmp -nostdinc \ + $(addprefix -I,$(DTC_INCLUDE)) \ + -undef -D__DTS__ + +# Useful for describing the dependency of composite objects +# Usage: +# $(call multi_depend, multi_used_targets, suffix_to_remove, suffix_to_add) +define multi_depend +$(foreach m, $(notdir $1), \ + $(eval $(obj)/$m: \ + $(addprefix $(obj)/, $(foreach s, $3, $($(m:%$(strip $2)=%$(s))))))) +endef + +quiet_cmd_copy = COPY $@ + cmd_copy = cp $< $@ + +# Shipped files +# =========================================================================== + +quiet_cmd_shipped = SHIPPED $@ +cmd_shipped = cat $< > $@ + +$(obj)/%: $(src)/%_shipped + $(call cmd,shipped) + +# Commands useful for building a boot image +# =========================================================================== +# +# Use as following: +# +# target: source(s) FORCE +# $(if_changed,ld/objcopy/gzip) +# +# and add target to extra-y so that we know we have to +# read in the saved command line + +# Linking +# --------------------------------------------------------------------------- + +quiet_cmd_ld = LD $@ + cmd_ld = $(LD) $(ld_flags) $(real-prereqs) -o $@ + +# Archive +# --------------------------------------------------------------------------- + +quiet_cmd_ar = AR $@ + cmd_ar = rm -f $@; $(AR) cDPrsT $@ $(real-prereqs) + +# Objcopy +# --------------------------------------------------------------------------- + +quiet_cmd_objcopy = OBJCOPY $@ +cmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@ + +# Gzip +# --------------------------------------------------------------------------- + +quiet_cmd_gzip = GZIP $@ + cmd_gzip = cat $(real-prereqs) | $(KGZIP) -n -f -9 > $@ + +# DTC +# --------------------------------------------------------------------------- +DTC ?= $(objtree)/scripts/dtc/dtc +DTC_FLAGS += -Wno-interrupt_provider + +# Disable noisy checks by default +ifeq ($(findstring 1,$(KBUILD_EXTRA_WARN)),) +DTC_FLAGS += -Wno-unit_address_vs_reg \ + -Wno-unit_address_format \ + -Wno-avoid_unnecessary_addr_size \ + -Wno-alias_paths \ + -Wno-graph_child_address \ + -Wno-simple_bus_reg \ + -Wno-unique_unit_address \ + -Wno-pci_device_reg +endif + +ifneq ($(findstring 2,$(KBUILD_EXTRA_WARN)),) +DTC_FLAGS += -Wnode_name_chars_strict \ + -Wproperty_name_chars_strict \ + -Winterrupt_provider +endif + +DTC_FLAGS += $(DTC_FLAGS_$(basetarget)) + +# Generate an assembly file to wrap the output of the device tree compiler +quiet_cmd_dt_S_dtb= DTB $@ +cmd_dt_S_dtb= \ +{ \ + echo '\#include '; \ + echo '.section .dtb.init.rodata,"a"'; \ + echo '.balign STRUCT_ALIGNMENT'; \ + echo '.global __dtb_$(subst -,_,$(*F))_begin'; \ + echo '__dtb_$(subst -,_,$(*F))_begin:'; \ + echo '.incbin "$<" '; \ + echo '__dtb_$(subst -,_,$(*F))_end:'; \ + echo '.global __dtb_$(subst -,_,$(*F))_end'; \ + echo '.balign STRUCT_ALIGNMENT'; \ +} > $@ + +$(obj)/%.dtb.S: $(obj)/%.dtb FORCE + $(call if_changed,dt_S_dtb) + +quiet_cmd_dtc = DTC $@ +cmd_dtc = $(HOSTCC) -E $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ; \ + $(DTC) -O $(patsubst .%,%,$(suffix $@)) -o $@ -b 0 \ + $(addprefix -i,$(dir $<) $(DTC_INCLUDE)) $(DTC_FLAGS) \ + -d $(depfile).dtc.tmp $(dtc-tmp) ; \ + cat $(depfile).pre.tmp $(depfile).dtc.tmp > $(depfile) + +$(obj)/%.dtb: $(src)/%.dts $(DTC) FORCE + $(call if_changed_dep,dtc) + +DT_CHECKER ?= dt-validate +DT_BINDING_DIR := Documentation/devicetree/bindings +# DT_TMP_SCHEMA may be overridden from Documentation/devicetree/bindings/Makefile +DT_TMP_SCHEMA ?= $(objtree)/$(DT_BINDING_DIR)/processed-schema.json + +quiet_cmd_dtb_check = CHECK $@ + cmd_dtb_check = $(DT_CHECKER) -u $(srctree)/$(DT_BINDING_DIR) -p $(DT_TMP_SCHEMA) $@ + +define rule_dtc + $(call cmd_and_fixdep,dtc) + $(call cmd,dtb_check) +endef + +$(obj)/%.dt.yaml: $(src)/%.dts $(DTC) $(DT_TMP_SCHEMA) FORCE + $(call if_changed_rule,dtc,yaml) + +dtc-tmp = $(subst $(comma),_,$(dot-target).dts.tmp) + +# Bzip2 +# --------------------------------------------------------------------------- + +# Bzip2 and LZMA do not include size in file... so we have to fake that; +# append the size as a 32-bit littleendian number as gzip does. +size_append = printf $(shell \ +dec_size=0; \ +for F in $(real-prereqs); do \ + fsize=$$($(CONFIG_SHELL) $(srctree)/scripts/file-size.sh $$F); \ + dec_size=$$(expr $$dec_size + $$fsize); \ +done; \ +printf "%08x\n" $$dec_size | \ + sed 's/\(..\)/\1 /g' | { \ + read ch0 ch1 ch2 ch3; \ + for ch in $$ch3 $$ch2 $$ch1 $$ch0; do \ + printf '%s%03o' '\\' $$((0x$$ch)); \ + done; \ + } \ +) + +quiet_cmd_bzip2 = BZIP2 $@ + cmd_bzip2 = { cat $(real-prereqs) | $(KBZIP2) -9; $(size_append); } > $@ + +# Lzma +# --------------------------------------------------------------------------- + +quiet_cmd_lzma = LZMA $@ + cmd_lzma = { cat $(real-prereqs) | $(LZMA) -9; $(size_append); } > $@ + +quiet_cmd_lzo = LZO $@ + cmd_lzo = { cat $(real-prereqs) | $(KLZOP) -9; $(size_append); } > $@ + +quiet_cmd_lz4 = LZ4 $@ + cmd_lz4 = { cat $(real-prereqs) | $(LZ4) -l -c1 stdin stdout; \ + $(size_append); } > $@ + +# U-Boot mkimage +# --------------------------------------------------------------------------- + +MKIMAGE := $(srctree)/scripts/mkuboot.sh + +# SRCARCH just happens to match slightly more than ARCH (on sparc), so reduces +# the number of overrides in arch makefiles +UIMAGE_ARCH ?= $(SRCARCH) +UIMAGE_COMPRESSION ?= $(if $(2),$(2),none) +UIMAGE_OPTS-y ?= +UIMAGE_TYPE ?= kernel +UIMAGE_LOADADDR ?= arch_must_set_this +UIMAGE_ENTRYADDR ?= $(UIMAGE_LOADADDR) +UIMAGE_NAME ?= 'Linux-$(KERNELRELEASE)' + +quiet_cmd_uimage = UIMAGE $@ + cmd_uimage = $(BASH) $(MKIMAGE) -A $(UIMAGE_ARCH) -O linux \ + -C $(UIMAGE_COMPRESSION) $(UIMAGE_OPTS-y) \ + -T $(UIMAGE_TYPE) \ + -a $(UIMAGE_LOADADDR) -e $(UIMAGE_ENTRYADDR) \ + -n $(UIMAGE_NAME) -d $< $@ + +# XZ +# --------------------------------------------------------------------------- +# Use xzkern to compress the kernel image and xzmisc to compress other things. +# +# xzkern uses a big LZMA2 dictionary since it doesn't increase memory usage +# of the kernel decompressor. A BCJ filter is used if it is available for +# the target architecture. xzkern also appends uncompressed size of the data +# using size_append. The .xz format has the size information available at +# the end of the file too, but it's in more complex format and it's good to +# avoid changing the part of the boot code that reads the uncompressed size. +# Note that the bytes added by size_append will make the xz tool think that +# the file is corrupt. This is expected. +# +# xzmisc doesn't use size_append, so it can be used to create normal .xz +# files. xzmisc uses smaller LZMA2 dictionary than xzkern, because a very +# big dictionary would increase the memory usage too much in the multi-call +# decompression mode. A BCJ filter isn't used either. +quiet_cmd_xzkern = XZKERN $@ + cmd_xzkern = { cat $(real-prereqs) | sh $(srctree)/scripts/xz_wrap.sh; \ + $(size_append); } > $@ + +quiet_cmd_xzmisc = XZMISC $@ + cmd_xzmisc = cat $(real-prereqs) | $(XZ) --check=crc32 --lzma2=dict=1MiB > $@ + +# ZSTD +# --------------------------------------------------------------------------- +# Appends the uncompressed size of the data using size_append. The .zst +# format has the size information available at the beginning of the file too, +# but it's in a more complex format and it's good to avoid changing the part +# of the boot code that reads the uncompressed size. +# +# Note that the bytes added by size_append will make the zstd tool think that +# the file is corrupt. This is expected. +# +# zstd uses a maximum window size of 8 MB. zstd22 uses a maximum window size of +# 128 MB. zstd22 is used for kernel compression because it is decompressed in a +# single pass, so zstd doesn't need to allocate a window buffer. When streaming +# decompression is used, like initramfs decompression, zstd22 should likely not +# be used because it would require zstd to allocate a 128 MB buffer. + +quiet_cmd_zstd = ZSTD $@ + cmd_zstd = { cat $(real-prereqs) | $(ZSTD) -19; $(size_append); } > $@ + +quiet_cmd_zstd22 = ZSTD22 $@ + cmd_zstd22 = { cat $(real-prereqs) | $(ZSTD) -22 --ultra; $(size_append); } > $@ + +# ASM offsets +# --------------------------------------------------------------------------- + +# Default sed regexp - multiline due to syntax constraints +# +# Use [:space:] because LLVM's integrated assembler inserts around +# the .ascii directive whereas GCC keeps the as-is. +define sed-offsets + 's:^[[:space:]]*\.ascii[[:space:]]*"\(.*\)".*:\1:; \ + /^->/{s:->#\(.*\):/* \1 */:; \ + s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; \ + s:->::; p;}' +endef + +# Use filechk to avoid rebuilds when a header changes, but the resulting file +# does not +define filechk_offsets + echo "#ifndef $2"; \ + echo "#define $2"; \ + echo "/*"; \ + echo " * DO NOT MODIFY."; \ + echo " *"; \ + echo " * This file was generated by Kbuild"; \ + echo " */"; \ + echo ""; \ + sed -ne $(sed-offsets) < $<; \ + echo ""; \ + echo "#endif" +endef diff --git a/src/net/scripts/Makefile.modfinal b/src/net/scripts/Makefile.modfinal new file mode 100644 index 0000000..ae01baf --- /dev/null +++ b/src/net/scripts/Makefile.modfinal @@ -0,0 +1,59 @@ +# SPDX-License-Identifier: GPL-2.0-only +# =========================================================================== +# Module final link +# =========================================================================== + +PHONY := __modfinal +__modfinal: + +include $(srctree)/scripts/Kbuild.include + +# for c_flags +include $(srctree)/scripts/Makefile.lib + +# find all modules listed in modules.order +modules := $(sort $(shell cat $(MODORDER))) + +__modfinal: $(modules) + @: + +# modname and part-of-module are set to make c_flags define proper module flags +modname = $(notdir $(@:.mod.o=)) +part-of-module = y + +quiet_cmd_cc_o_c = CC [M] $@ + cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $< + +%.mod.o: %.mod.c FORCE + $(call if_changed_dep,cc_o_c) + +ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(SRCARCH)/Makefile.postlink) + +quiet_cmd_ld_ko_o = LD [M] $@ + cmd_ld_ko_o = \ + $(LD) -r $(KBUILD_LDFLAGS) \ + $(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE) \ + -T scripts/module.lds -o $@ $(filter %.o, $^); \ + $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true) + +$(modules): %.ko: %.o %.mod.o scripts/module.lds FORCE + +$(call if_changed,ld_ko_o) + +targets += $(modules) $(modules:.ko=.mod.o) + +# Add FORCE to the prequisites of a target to force it to be always rebuilt. +# --------------------------------------------------------------------------- + +PHONY += FORCE +FORCE: + +# Read all saved command lines and dependencies for the $(targets) we +# may be building above, using $(if_changed{,_dep}). As an +# optimization, we don't need to read them if the target does not +# exist, we will rebuild anyway in that case. + +existing-targets := $(wildcard $(sort $(targets))) + +-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd) + +.PHONY: $(PHONY) diff --git a/src/net/scripts/Makefile.modinst b/src/net/scripts/Makefile.modinst new file mode 100644 index 0000000..5a4579e --- /dev/null +++ b/src/net/scripts/Makefile.modinst @@ -0,0 +1,35 @@ +# SPDX-License-Identifier: GPL-2.0 +# ========================================================================== +# Installing modules +# ========================================================================== + +PHONY := __modinst +__modinst: + +include scripts/Kbuild.include + +modules := $(sort $(shell cat $(if $(KBUILD_EXTMOD),$(KBUILD_EXTMOD)/)modules.order)) + +PHONY += $(modules) +__modinst: $(modules) + @: + +# Don't stop modules_install if we can't sign external modules. +quiet_cmd_modules_install = INSTALL $@ + cmd_modules_install = \ + mkdir -p $(2) ; \ + cp $@ $(2) ; \ + $(mod_strip_cmd) $(2)/$(notdir $@) ; \ + $(mod_sign_cmd) $(2)/$(notdir $@) $(patsubst %,|| true,$(KBUILD_EXTMOD)) ; \ + $(mod_compress_cmd) $(2)/$(notdir $@) + +# Modules built outside the kernel source tree go into extra by default +INSTALL_MOD_DIR ?= extra +ext-mod-dir = $(INSTALL_MOD_DIR)$(subst $(patsubst %/,%,$(KBUILD_EXTMOD)),,$(@D)) + +modinst_dir = $(if $(KBUILD_EXTMOD),$(ext-mod-dir),kernel/$(@D)) + +$(modules): + $(call cmd,modules_install,$(MODLIB)/$(modinst_dir)) + +.PHONY: $(PHONY) diff --git a/src/net/scripts/Makefile.modpost b/src/net/scripts/Makefile.modpost new file mode 100644 index 0000000..12a87be --- /dev/null +++ b/src/net/scripts/Makefile.modpost @@ -0,0 +1,142 @@ +# SPDX-License-Identifier: GPL-2.0 +# =========================================================================== +# Module versions +# =========================================================================== +# +# Stage one of module building created the following: +# a) The individual .o files used for the module +# b) A .o file which is the .o files above linked together +# c) A .mod file, listing the name of the preliminary .o file, +# plus all .o files +# d) modules.order, which lists all the modules + +# Stage 2 is handled by this file and does the following +# 1) Find all modules listed in modules.order +# 2) modpost is then used to +# 3) create one .mod.c file pr. module +# 4) create one Module.symvers file with CRC for all exported symbols + +# Step 3 is used to place certain information in the module's ELF +# section, including information such as: +# Version magic (see include/linux/vermagic.h for full details) +# - Kernel release +# - SMP is CONFIG_SMP +# - PREEMPT is CONFIG_PREEMPT[_RT] +# - GCC Version +# Module info +# - Module version (MODULE_VERSION) +# - Module alias'es (MODULE_ALIAS) +# - Module license (MODULE_LICENSE) +# - See include/linux/module.h for more details + +# Step 4 is solely used to allow module versioning in external modules, +# where the CRC of each module is retrieved from the Module.symvers file. + +# KBUILD_MODPOST_WARN can be set to avoid error out in case of undefined +# symbols in the final module linking stage +# KBUILD_MODPOST_NOFINAL can be set to skip the final link of modules. +# This is solely useful to speed up test compiles + +PHONY := __modpost +__modpost: + +include include/config/auto.conf +include scripts/Kbuild.include + +MODPOST = scripts/mod/modpost \ + $(if $(CONFIG_MODVERSIONS),-m) \ + $(if $(CONFIG_MODULE_SRCVERSION_ALL),-a) \ + $(if $(CONFIG_SECTION_MISMATCH_WARN_ONLY),,-E) \ + $(if $(KBUILD_MODPOST_WARN),-w) \ + -o $@ + +ifdef MODPOST_VMLINUX + +quiet_cmd_modpost = MODPOST $@ + cmd_modpost = $(MODPOST) $< + +vmlinux.symvers: vmlinux.o + $(call cmd,modpost) + +__modpost: vmlinux.symvers + +else + +ifeq ($(KBUILD_EXTMOD),) + +input-symdump := vmlinux.symvers +output-symdump := modules-only.symvers + +quiet_cmd_cat = GEN $@ + cmd_cat = cat $(real-prereqs) > $@ + +ifneq ($(wildcard vmlinux.symvers),) + +__modpost: Module.symvers +Module.symvers: vmlinux.symvers modules-only.symvers FORCE + $(call if_changed,cat) + +targets += Module.symvers + +endif + +else + +# set src + obj - they may be used in the modules's Makefile +obj := $(KBUILD_EXTMOD) +src := $(obj) + +# Include the module's Makefile to find KBUILD_EXTRA_SYMBOLS +include $(if $(wildcard $(KBUILD_EXTMOD)/Kbuild), \ + $(KBUILD_EXTMOD)/Kbuild, $(KBUILD_EXTMOD)/Makefile) + +# modpost option for external modules +MODPOST += -e + +input-symdump := Module.symvers $(KBUILD_EXTRA_SYMBOLS) +output-symdump := $(KBUILD_EXTMOD)/Module.symvers + +endif + +# modpost options for modules (both in-kernel and external) +MODPOST += \ + $(addprefix -i ,$(wildcard $(input-symdump))) \ + $(if $(KBUILD_NSDEPS),-d $(MODULES_NSDEPS)) \ + $(if $(CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS)$(KBUILD_NSDEPS),-N) + +# 'make -i -k' ignores compile errors, and builds as many modules as possible. +ifneq ($(findstring i,$(filter-out --%,$(MAKEFLAGS))),) +MODPOST += -n +endif + +# Clear VPATH to not search for *.symvers in $(srctree). Check only $(objtree). +VPATH := +$(input-symdump): + @echo >&2 'WARNING: Symbol version dump "$@" is missing.' + @echo >&2 ' Modules may not have dependencies or modversions.' + +# Read out modules.order to pass in modpost. +# Otherwise, allmodconfig would fail with "Argument list too long". +quiet_cmd_modpost = MODPOST $@ + cmd_modpost = sed 's/ko$$/o/' $< | $(MODPOST) -T - + +$(output-symdump): $(MODORDER) $(input-symdump) FORCE + $(call if_changed,modpost) + +targets += $(output-symdump) + +__modpost: $(output-symdump) +ifneq ($(KBUILD_MODPOST_NOFINAL),1) + $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modfinal +endif + +PHONY += FORCE +FORCE: + +existing-targets := $(wildcard $(sort $(targets))) + +-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd) + +endif + +.PHONY: $(PHONY) diff --git a/src/net/scripts/Makefile.modsign b/src/net/scripts/Makefile.modsign new file mode 100644 index 0000000..d7325ce --- /dev/null +++ b/src/net/scripts/Makefile.modsign @@ -0,0 +1,29 @@ +# SPDX-License-Identifier: GPL-2.0 +# ========================================================================== +# Signing modules +# ========================================================================== + +PHONY := __modsign +__modsign: + +include scripts/Kbuild.include + +modules := $(sort $(shell cat modules.order)) + +PHONY += $(modules) +__modsign: $(modules) + @: + +quiet_cmd_sign_ko = SIGN [M] $(2)/$(notdir $@) + cmd_sign_ko = $(mod_sign_cmd) $(2)/$(notdir $@) + +# Modules built outside the kernel source tree go into extra by default +INSTALL_MOD_DIR ?= extra +ext-mod-dir = $(INSTALL_MOD_DIR)$(subst $(patsubst %/,%,$(KBUILD_EXTMOD)),,$(@D)) + +modinst_dir = $(if $(KBUILD_EXTMOD),$(ext-mod-dir),kernel/$(@D)) + +$(modules): + $(call cmd,sign_ko,$(MODLIB)/$(modinst_dir)) + +.PHONY: $(PHONY) diff --git a/src/net/scripts/Makefile.package b/src/net/scripts/Makefile.package new file mode 100644 index 0000000..f952fb6 --- /dev/null +++ b/src/net/scripts/Makefile.package @@ -0,0 +1,161 @@ +# SPDX-License-Identifier: GPL-2.0-only +# Makefile for the different targets used to generate full packages of a kernel + +include $(srctree)/scripts/Kbuild.include + +# RPM target +# --------------------------------------------------------------------------- +# The rpm target generates two rpm files: +# /usr/src/packages/SRPMS/kernel-2.6.7rc2-1.src.rpm +# /usr/src/packages/RPMS/i386/kernel-2.6.7rc2-1..rpm +# The src.rpm files includes all source for the kernel being built +# The .rpm includes kernel configuration, modules etc. +# +# Process to create the rpm files +# a) clean the kernel +# b) Generate .spec file +# c) Build a tar ball, using symlink to make kernel version +# first entry in the path +# d) and pack the result to a tar.gz file +# e) generate the rpm files, based on kernel.spec +# - Use /. to avoid tar packing just the symlink + +# Note that the rpm-pkg target cannot be used with KBUILD_OUTPUT, +# but the binrpm-pkg target can; for some reason O= gets ignored. + +# Remove hyphens since they have special meaning in RPM filenames +KERNELPATH := kernel-$(subst -,_,$(KERNELRELEASE)) +KDEB_SOURCENAME ?= linux-$(KERNELRELEASE) +KBUILD_PKG_ROOTCMD ?="fakeroot -u" +export KDEB_SOURCENAME +# Include only those top-level files that are needed by make, plus the GPL copy +TAR_CONTENT := $(KBUILD_ALLDIRS) .config .scmversion Makefile \ + Kbuild Kconfig COPYING $(wildcard localversion*) +MKSPEC := $(srctree)/scripts/package/mkspec + +quiet_cmd_src_tar = TAR $(2).tar.gz + cmd_src_tar = \ +if test "$(objtree)" != "$(srctree)"; then \ + echo >&2; \ + echo >&2 " ERROR:"; \ + echo >&2 " Building source tarball is not possible outside the"; \ + echo >&2 " kernel source tree. Don't set KBUILD_OUTPUT, or use the"; \ + echo >&2 " binrpm-pkg or bindeb-pkg target instead."; \ + echo >&2; \ + false; \ +fi ; \ +$(srctree)/scripts/setlocalversion --save-scmversion; \ +tar -I $(KGZIP) -c $(RCS_TAR_IGNORE) -f $(2).tar.gz \ + --transform 's:^:$(2)/:S' $(TAR_CONTENT) $(3); \ +rm -f $(objtree)/.scmversion + +# rpm-pkg +# --------------------------------------------------------------------------- +PHONY += rpm-pkg +rpm-pkg: + $(MAKE) clean + $(CONFIG_SHELL) $(MKSPEC) >$(objtree)/kernel.spec + $(call cmd,src_tar,$(KERNELPATH),kernel.spec) + +rpmbuild $(RPMOPTS) --target $(UTS_MACHINE) -ta $(KERNELPATH).tar.gz \ + --define='_smp_mflags %{nil}' + +# binrpm-pkg +# --------------------------------------------------------------------------- +PHONY += binrpm-pkg +binrpm-pkg: + $(MAKE) -f $(srctree)/Makefile + $(CONFIG_SHELL) $(MKSPEC) prebuilt > $(objtree)/binkernel.spec + +rpmbuild $(RPMOPTS) --define "_builddir $(objtree)" --target \ + $(UTS_MACHINE) -bb $(objtree)/binkernel.spec + +PHONY += deb-pkg +deb-pkg: + $(MAKE) clean + $(CONFIG_SHELL) $(srctree)/scripts/package/mkdebian + $(call cmd,src_tar,$(KDEB_SOURCENAME)) + origversion=$$(dpkg-parsechangelog -SVersion |sed 's/-[^-]*$$//');\ + mv $(KDEB_SOURCENAME).tar.gz ../$(KDEB_SOURCENAME)_$${origversion}.orig.tar.gz + +dpkg-buildpackage -r$(KBUILD_PKG_ROOTCMD) -a$$(cat debian/arch) $(DPKG_FLAGS) -i.git -us -uc + +PHONY += bindeb-pkg +bindeb-pkg: + $(CONFIG_SHELL) $(srctree)/scripts/package/mkdebian + +dpkg-buildpackage -r$(KBUILD_PKG_ROOTCMD) -a$$(cat debian/arch) $(DPKG_FLAGS) -b -nc -uc + +PHONY += intdeb-pkg +intdeb-pkg: + +$(CONFIG_SHELL) $(srctree)/scripts/package/builddeb + +# snap-pkg +# --------------------------------------------------------------------------- +PHONY += snap-pkg +snap-pkg: + rm -rf $(objtree)/snap + mkdir $(objtree)/snap + $(MAKE) clean + $(call cmd,src_tar,$(KERNELPATH)) + sed "s@KERNELRELEASE@$(KERNELRELEASE)@; \ + s@SRCTREE@$(shell realpath $(KERNELPATH).tar.gz)@" \ + $(srctree)/scripts/package/snapcraft.template > \ + $(objtree)/snap/snapcraft.yaml + cd $(objtree)/snap && \ + snapcraft --target-arch=$(UTS_MACHINE) + +# tarball targets +# --------------------------------------------------------------------------- +tar-pkgs := dir-pkg tar-pkg targz-pkg tarbz2-pkg tarxz-pkg +PHONY += $(tar-pkgs) +$(tar-pkgs): + $(MAKE) -f $(srctree)/Makefile + +$(CONFIG_SHELL) $(srctree)/scripts/package/buildtar $@ + +# perf-pkg - generate a source tarball with perf source +# --------------------------------------------------------------------------- + +perf-tar=perf-$(KERNELVERSION) + +quiet_cmd_perf_tar = TAR + cmd_perf_tar = \ +git --git-dir=$(srctree)/.git archive --prefix=$(perf-tar)/ \ + HEAD^{tree} $$(cd $(srctree); \ + echo $$(cat tools/perf/MANIFEST)) \ + -o $(perf-tar).tar; \ +mkdir -p $(perf-tar); \ +git --git-dir=$(srctree)/.git rev-parse HEAD > $(perf-tar)/HEAD; \ +(cd $(srctree)/tools/perf; \ +util/PERF-VERSION-GEN $(CURDIR)/$(perf-tar)/); \ +tar rf $(perf-tar).tar $(perf-tar)/HEAD $(perf-tar)/PERF-VERSION-FILE; \ +rm -r $(perf-tar); \ +$(if $(findstring tar-src,$@),, \ +$(if $(findstring bz2,$@),$(KBZIP2), \ +$(if $(findstring gz,$@),$(KGZIP), \ +$(if $(findstring xz,$@),$(XZ), \ +$(error unknown target $@)))) \ + -f -9 $(perf-tar).tar) + +perf-tar-pkgs := perf-tar-src-pkg perf-targz-src-pkg perf-tarbz2-src-pkg perf-tarxz-src-pkg +PHONY += $(perf-tar-pkgs) +$(perf-tar-pkgs): + $(call cmd,perf_tar) + +# Help text displayed when executing 'make help' +# --------------------------------------------------------------------------- +PHONY += help +help: + @echo ' rpm-pkg - Build both source and binary RPM kernel packages' + @echo ' binrpm-pkg - Build only the binary kernel RPM package' + @echo ' deb-pkg - Build both source and binary deb kernel packages' + @echo ' bindeb-pkg - Build only the binary kernel deb package' + @echo ' snap-pkg - Build only the binary kernel snap package' + @echo ' (will connect to external hosts)' + @echo ' dir-pkg - Build the kernel as a plain directory structure' + @echo ' tar-pkg - Build the kernel as an uncompressed tarball' + @echo ' targz-pkg - Build the kernel as a gzip compressed tarball' + @echo ' tarbz2-pkg - Build the kernel as a bzip2 compressed tarball' + @echo ' tarxz-pkg - Build the kernel as a xz compressed tarball' + @echo ' perf-tar-src-pkg - Build $(perf-tar).tar source tarball' + @echo ' perf-targz-src-pkg - Build $(perf-tar).tar.gz source tarball' + @echo ' perf-tarbz2-src-pkg - Build $(perf-tar).tar.bz2 source tarball' + @echo ' perf-tarxz-src-pkg - Build $(perf-tar).tar.xz source tarball' + +.PHONY: $(PHONY) diff --git a/src/net/scripts/Makefile.ubsan b/src/net/scripts/Makefile.ubsan new file mode 100644 index 0000000..6f61aa4 --- /dev/null +++ b/src/net/scripts/Makefile.ubsan @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: GPL-2.0 + +# Enable available and selected UBSAN features. +ubsan-cflags-$(CONFIG_UBSAN_ALIGNMENT) += -fsanitize=alignment +ubsan-cflags-$(CONFIG_UBSAN_ONLY_BOUNDS) += -fsanitize=bounds +ubsan-cflags-$(CONFIG_UBSAN_ARRAY_BOUNDS) += -fsanitize=array-bounds +ubsan-cflags-$(CONFIG_UBSAN_LOCAL_BOUNDS) += -fsanitize=local-bounds +ubsan-cflags-$(CONFIG_UBSAN_SHIFT) += -fsanitize=shift +ubsan-cflags-$(CONFIG_UBSAN_DIV_ZERO) += -fsanitize=integer-divide-by-zero +ubsan-cflags-$(CONFIG_UBSAN_UNREACHABLE) += -fsanitize=unreachable +ubsan-cflags-$(CONFIG_UBSAN_BOOL) += -fsanitize=bool +ubsan-cflags-$(CONFIG_UBSAN_ENUM) += -fsanitize=enum +ubsan-cflags-$(CONFIG_UBSAN_TRAP) += -fsanitize-undefined-trap-on-error + +export CFLAGS_UBSAN := $(ubsan-cflags-y) \ No newline at end of file diff --git a/src/net/scripts/Makefile.userprogs b/src/net/scripts/Makefile.userprogs new file mode 100644 index 0000000..fb41529 --- /dev/null +++ b/src/net/scripts/Makefile.userprogs @@ -0,0 +1,45 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Build userspace programs for the target system +# + +# Executables compiled from a single .c file +user-csingle := $(foreach m, $(userprogs), $(if $($(m)-objs),,$(m))) + +# Executables linked based on several .o files +user-cmulti := $(foreach m, $(userprogs), $(if $($(m)-objs),$(m))) + +# Objects compiled from .c files +user-cobjs := $(sort $(foreach m, $(userprogs), $($(m)-objs))) + +user-csingle := $(addprefix $(obj)/, $(user-csingle)) +user-cmulti := $(addprefix $(obj)/, $(user-cmulti)) +user-cobjs := $(addprefix $(obj)/, $(user-cobjs)) + +user_ccflags = -Wp,-MMD,$(depfile) $(KBUILD_USERCFLAGS) $(userccflags) \ + $($(target-stem)-userccflags) +user_ldflags = $(KBUILD_USERLDFLAGS) $(userldflags) $($(target-stem)-userldflags) + +# Create an executable from a single .c file +quiet_cmd_user_cc_c = CC [U] $@ + cmd_user_cc_c = $(CC) $(user_ccflags) $(user_ldflags) -o $@ $< \ + $($(target-stem)-userldlibs) +$(user-csingle): $(obj)/%: $(src)/%.c FORCE + $(call if_changed_dep,user_cc_c) + +# Link an executable based on list of .o files +quiet_cmd_user_ld = LD [U] $@ + cmd_user_ld = $(CC) $(user_ldflags) -o $@ \ + $(addprefix $(obj)/, $($(target-stem)-objs)) \ + $($(target-stem)-userldlibs) +$(user-cmulti): FORCE + $(call if_changed,user_ld) +$(call multi_depend, $(user-cmulti), , -objs) + +# Create .o file from a .c file +quiet_cmd_user_cc_o_c = CC [U] $@ + cmd_user_cc_o_c = $(CC) $(user_ccflags) -c -o $@ $< +$(user-cobjs): $(obj)/%.o: $(src)/%.c FORCE + $(call if_changed_dep,user_cc_o_c) + +targets += $(user-csingle) $(user-cmulti) $(user-cobjs) diff --git a/src/net/scripts/adjust_autoksyms.sh b/src/net/scripts/adjust_autoksyms.sh new file mode 100755 index 0000000..2b366d9 --- /dev/null +++ b/src/net/scripts/adjust_autoksyms.sh @@ -0,0 +1,76 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0-only + +# Script to update include/generated/autoksyms.h and dependency files +# +# Copyright: (C) 2016 Linaro Limited +# Created by: Nicolas Pitre, January 2016 +# + +# Update the include/generated/autoksyms.h file. +# +# For each symbol being added or removed, the corresponding dependency +# file's timestamp is updated to force a rebuild of the affected source +# file. All arguments passed to this script are assumed to be a command +# to be exec'd to trigger a rebuild of those files. + +set -e + +cur_ksyms_file="include/generated/autoksyms.h" +new_ksyms_file="include/generated/autoksyms.h.tmpnew" + +info() { + if [ "$quiet" != "silent_" ]; then + printf " %-7s %s\n" "$1" "$2" + fi +} + +info "CHK" "$cur_ksyms_file" + +# Use "make V=1" to debug this script. +case "$KBUILD_VERBOSE" in +*1*) + set -x + ;; +esac + +# We need access to CONFIG_ symbols +. include/config/auto.conf + +# Generate a new symbol list file +$CONFIG_SHELL $srctree/scripts/gen_autoksyms.sh "$new_ksyms_file" + +# Extract changes between old and new list and touch corresponding +# dependency files. +changed=$( +count=0 +sort "$cur_ksyms_file" "$new_ksyms_file" | uniq -u | +sed -n 's/^#define __KSYM_\(.*\) 1/\1/p' | tr "A-Z_" "a-z/" | +while read sympath; do + if [ -z "$sympath" ]; then continue; fi + depfile="include/ksym/${sympath}.h" + mkdir -p "$(dirname "$depfile")" + touch "$depfile" + # Filesystems with coarse time precision may create timestamps + # equal to the one from a file that was very recently built and that + # needs to be rebuild. Let's guard against that by making sure our + # dep files are always newer than the first file we created here. + while [ ! "$depfile" -nt "$new_ksyms_file" ]; do + touch "$depfile" + done + echo $((count += 1)) +done | tail -1 ) +changed=${changed:-0} + +if [ $changed -gt 0 ]; then + # Replace the old list with tne new one + old=$(grep -c "^#define __KSYM_" "$cur_ksyms_file" || true) + new=$(grep -c "^#define __KSYM_" "$new_ksyms_file" || true) + info "KSYMS" "symbols: before=$old, after=$new, changed=$changed" + info "UPD" "$cur_ksyms_file" + mv -f "$new_ksyms_file" "$cur_ksyms_file" + # Then trigger a rebuild of affected source files + exec $@ +else + rm -f "$new_ksyms_file" +fi diff --git a/src/net/scripts/asn1_compiler.c b/src/net/scripts/asn1_compiler.c new file mode 100644 index 0000000..adabd41 --- /dev/null +++ b/src/net/scripts/asn1_compiler.c @@ -0,0 +1,1611 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* Simplified ASN.1 notation parser + * + * Copyright (C) 2012 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum token_type { + DIRECTIVE_ABSENT, + DIRECTIVE_ALL, + DIRECTIVE_ANY, + DIRECTIVE_APPLICATION, + DIRECTIVE_AUTOMATIC, + DIRECTIVE_BEGIN, + DIRECTIVE_BIT, + DIRECTIVE_BMPString, + DIRECTIVE_BOOLEAN, + DIRECTIVE_BY, + DIRECTIVE_CHARACTER, + DIRECTIVE_CHOICE, + DIRECTIVE_CLASS, + DIRECTIVE_COMPONENT, + DIRECTIVE_COMPONENTS, + DIRECTIVE_CONSTRAINED, + DIRECTIVE_CONTAINING, + DIRECTIVE_DEFAULT, + DIRECTIVE_DEFINED, + DIRECTIVE_DEFINITIONS, + DIRECTIVE_EMBEDDED, + DIRECTIVE_ENCODED, + DIRECTIVE_ENCODING_CONTROL, + DIRECTIVE_END, + DIRECTIVE_ENUMERATED, + DIRECTIVE_EXCEPT, + DIRECTIVE_EXPLICIT, + DIRECTIVE_EXPORTS, + DIRECTIVE_EXTENSIBILITY, + DIRECTIVE_EXTERNAL, + DIRECTIVE_FALSE, + DIRECTIVE_FROM, + DIRECTIVE_GeneralString, + DIRECTIVE_GeneralizedTime, + DIRECTIVE_GraphicString, + DIRECTIVE_IA5String, + DIRECTIVE_IDENTIFIER, + DIRECTIVE_IMPLICIT, + DIRECTIVE_IMPLIED, + DIRECTIVE_IMPORTS, + DIRECTIVE_INCLUDES, + DIRECTIVE_INSTANCE, + DIRECTIVE_INSTRUCTIONS, + DIRECTIVE_INTEGER, + DIRECTIVE_INTERSECTION, + DIRECTIVE_ISO646String, + DIRECTIVE_MAX, + DIRECTIVE_MIN, + DIRECTIVE_MINUS_INFINITY, + DIRECTIVE_NULL, + DIRECTIVE_NumericString, + DIRECTIVE_OBJECT, + DIRECTIVE_OCTET, + DIRECTIVE_OF, + DIRECTIVE_OPTIONAL, + DIRECTIVE_ObjectDescriptor, + DIRECTIVE_PATTERN, + DIRECTIVE_PDV, + DIRECTIVE_PLUS_INFINITY, + DIRECTIVE_PRESENT, + DIRECTIVE_PRIVATE, + DIRECTIVE_PrintableString, + DIRECTIVE_REAL, + DIRECTIVE_RELATIVE_OID, + DIRECTIVE_SEQUENCE, + DIRECTIVE_SET, + DIRECTIVE_SIZE, + DIRECTIVE_STRING, + DIRECTIVE_SYNTAX, + DIRECTIVE_T61String, + DIRECTIVE_TAGS, + DIRECTIVE_TRUE, + DIRECTIVE_TeletexString, + DIRECTIVE_UNION, + DIRECTIVE_UNIQUE, + DIRECTIVE_UNIVERSAL, + DIRECTIVE_UTCTime, + DIRECTIVE_UTF8String, + DIRECTIVE_UniversalString, + DIRECTIVE_VideotexString, + DIRECTIVE_VisibleString, + DIRECTIVE_WITH, + NR__DIRECTIVES, + TOKEN_ASSIGNMENT = NR__DIRECTIVES, + TOKEN_OPEN_CURLY, + TOKEN_CLOSE_CURLY, + TOKEN_OPEN_SQUARE, + TOKEN_CLOSE_SQUARE, + TOKEN_OPEN_ACTION, + TOKEN_CLOSE_ACTION, + TOKEN_COMMA, + TOKEN_NUMBER, + TOKEN_TYPE_NAME, + TOKEN_ELEMENT_NAME, + NR__TOKENS +}; + +static const unsigned char token_to_tag[NR__TOKENS] = { + /* EOC goes first */ + [DIRECTIVE_BOOLEAN] = ASN1_BOOL, + [DIRECTIVE_INTEGER] = ASN1_INT, + [DIRECTIVE_BIT] = ASN1_BTS, + [DIRECTIVE_OCTET] = ASN1_OTS, + [DIRECTIVE_NULL] = ASN1_NULL, + [DIRECTIVE_OBJECT] = ASN1_OID, + [DIRECTIVE_ObjectDescriptor] = ASN1_ODE, + [DIRECTIVE_EXTERNAL] = ASN1_EXT, + [DIRECTIVE_REAL] = ASN1_REAL, + [DIRECTIVE_ENUMERATED] = ASN1_ENUM, + [DIRECTIVE_EMBEDDED] = 0, + [DIRECTIVE_UTF8String] = ASN1_UTF8STR, + [DIRECTIVE_RELATIVE_OID] = ASN1_RELOID, + /* 14 */ + /* 15 */ + [DIRECTIVE_SEQUENCE] = ASN1_SEQ, + [DIRECTIVE_SET] = ASN1_SET, + [DIRECTIVE_NumericString] = ASN1_NUMSTR, + [DIRECTIVE_PrintableString] = ASN1_PRNSTR, + [DIRECTIVE_T61String] = ASN1_TEXSTR, + [DIRECTIVE_TeletexString] = ASN1_TEXSTR, + [DIRECTIVE_VideotexString] = ASN1_VIDSTR, + [DIRECTIVE_IA5String] = ASN1_IA5STR, + [DIRECTIVE_UTCTime] = ASN1_UNITIM, + [DIRECTIVE_GeneralizedTime] = ASN1_GENTIM, + [DIRECTIVE_GraphicString] = ASN1_GRASTR, + [DIRECTIVE_VisibleString] = ASN1_VISSTR, + [DIRECTIVE_GeneralString] = ASN1_GENSTR, + [DIRECTIVE_UniversalString] = ASN1_UNITIM, + [DIRECTIVE_CHARACTER] = ASN1_CHRSTR, + [DIRECTIVE_BMPString] = ASN1_BMPSTR, +}; + +static const char asn1_classes[4][5] = { + [ASN1_UNIV] = "UNIV", + [ASN1_APPL] = "APPL", + [ASN1_CONT] = "CONT", + [ASN1_PRIV] = "PRIV" +}; + +static const char asn1_methods[2][5] = { + [ASN1_UNIV] = "PRIM", + [ASN1_APPL] = "CONS" +}; + +static const char *const asn1_universal_tags[32] = { + "EOC", + "BOOL", + "INT", + "BTS", + "OTS", + "NULL", + "OID", + "ODE", + "EXT", + "REAL", + "ENUM", + "EPDV", + "UTF8STR", + "RELOID", + NULL, /* 14 */ + NULL, /* 15 */ + "SEQ", + "SET", + "NUMSTR", + "PRNSTR", + "TEXSTR", + "VIDSTR", + "IA5STR", + "UNITIM", + "GENTIM", + "GRASTR", + "VISSTR", + "GENSTR", + "UNISTR", + "CHRSTR", + "BMPSTR", + NULL /* 31 */ +}; + +static const char *filename; +static const char *grammar_name; +static const char *outputname; +static const char *headername; + +static const char *const directives[NR__DIRECTIVES] = { +#define _(X) [DIRECTIVE_##X] = #X + _(ABSENT), + _(ALL), + _(ANY), + _(APPLICATION), + _(AUTOMATIC), + _(BEGIN), + _(BIT), + _(BMPString), + _(BOOLEAN), + _(BY), + _(CHARACTER), + _(CHOICE), + _(CLASS), + _(COMPONENT), + _(COMPONENTS), + _(CONSTRAINED), + _(CONTAINING), + _(DEFAULT), + _(DEFINED), + _(DEFINITIONS), + _(EMBEDDED), + _(ENCODED), + [DIRECTIVE_ENCODING_CONTROL] = "ENCODING-CONTROL", + _(END), + _(ENUMERATED), + _(EXCEPT), + _(EXPLICIT), + _(EXPORTS), + _(EXTENSIBILITY), + _(EXTERNAL), + _(FALSE), + _(FROM), + _(GeneralString), + _(GeneralizedTime), + _(GraphicString), + _(IA5String), + _(IDENTIFIER), + _(IMPLICIT), + _(IMPLIED), + _(IMPORTS), + _(INCLUDES), + _(INSTANCE), + _(INSTRUCTIONS), + _(INTEGER), + _(INTERSECTION), + _(ISO646String), + _(MAX), + _(MIN), + [DIRECTIVE_MINUS_INFINITY] = "MINUS-INFINITY", + [DIRECTIVE_NULL] = "NULL", + _(NumericString), + _(OBJECT), + _(OCTET), + _(OF), + _(OPTIONAL), + _(ObjectDescriptor), + _(PATTERN), + _(PDV), + [DIRECTIVE_PLUS_INFINITY] = "PLUS-INFINITY", + _(PRESENT), + _(PRIVATE), + _(PrintableString), + _(REAL), + [DIRECTIVE_RELATIVE_OID] = "RELATIVE-OID", + _(SEQUENCE), + _(SET), + _(SIZE), + _(STRING), + _(SYNTAX), + _(T61String), + _(TAGS), + _(TRUE), + _(TeletexString), + _(UNION), + _(UNIQUE), + _(UNIVERSAL), + _(UTCTime), + _(UTF8String), + _(UniversalString), + _(VideotexString), + _(VisibleString), + _(WITH) +}; + +struct action { + struct action *next; + char *name; + unsigned char index; +}; + +static struct action *action_list; +static unsigned nr_actions; + +struct token { + unsigned short line; + enum token_type token_type : 8; + unsigned char size; + struct action *action; + char *content; + struct type *type; +}; + +static struct token *token_list; +static unsigned nr_tokens; +static bool verbose_opt; +static bool debug_opt; + +#define verbose(fmt, ...) do { if (verbose_opt) printf(fmt, ## __VA_ARGS__); } while (0) +#define debug(fmt, ...) do { if (debug_opt) printf(fmt, ## __VA_ARGS__); } while (0) + +static int directive_compare(const void *_key, const void *_pdir) +{ + const struct token *token = _key; + const char *const *pdir = _pdir, *dir = *pdir; + size_t dlen, clen; + int val; + + dlen = strlen(dir); + clen = (dlen < token->size) ? dlen : token->size; + + //debug("cmp(%s,%s) = ", token->content, dir); + + val = memcmp(token->content, dir, clen); + if (val != 0) { + //debug("%d [cmp]\n", val); + return val; + } + + if (dlen == token->size) { + //debug("0\n"); + return 0; + } + //debug("%d\n", (int)dlen - (int)token->size); + return dlen - token->size; /* shorter -> negative */ +} + +/* + * Tokenise an ASN.1 grammar + */ +static void tokenise(char *buffer, char *end) +{ + struct token *tokens; + char *line, *nl, *start, *p, *q; + unsigned tix, lineno; + + /* Assume we're going to have half as many tokens as we have + * characters + */ + token_list = tokens = calloc((end - buffer) / 2, sizeof(struct token)); + if (!tokens) { + perror(NULL); + exit(1); + } + tix = 0; + + lineno = 0; + while (buffer < end) { + /* First of all, break out a line */ + lineno++; + line = buffer; + nl = memchr(line, '\n', end - buffer); + if (!nl) { + buffer = nl = end; + } else { + buffer = nl + 1; + *nl = '\0'; + } + + /* Remove "--" comments */ + p = line; + next_comment: + while ((p = memchr(p, '-', nl - p))) { + if (p[1] == '-') { + /* Found a comment; see if there's a terminator */ + q = p + 2; + while ((q = memchr(q, '-', nl - q))) { + if (q[1] == '-') { + /* There is - excise the comment */ + q += 2; + memmove(p, q, nl - q); + goto next_comment; + } + q++; + } + *p = '\0'; + nl = p; + break; + } else { + p++; + } + } + + p = line; + while (p < nl) { + /* Skip white space */ + while (p < nl && isspace(*p)) + *(p++) = 0; + if (p >= nl) + break; + + tokens[tix].line = lineno; + start = p; + + /* Handle string tokens */ + if (isalpha(*p)) { + const char **dir; + + /* Can be a directive, type name or element + * name. Find the end of the name. + */ + q = p + 1; + while (q < nl && (isalnum(*q) || *q == '-' || *q == '_')) + q++; + tokens[tix].size = q - p; + p = q; + + tokens[tix].content = malloc(tokens[tix].size + 1); + if (!tokens[tix].content) { + perror(NULL); + exit(1); + } + memcpy(tokens[tix].content, start, tokens[tix].size); + tokens[tix].content[tokens[tix].size] = 0; + + /* If it begins with a lowercase letter then + * it's an element name + */ + if (islower(tokens[tix].content[0])) { + tokens[tix++].token_type = TOKEN_ELEMENT_NAME; + continue; + } + + /* Otherwise we need to search the directive + * table + */ + dir = bsearch(&tokens[tix], directives, + sizeof(directives) / sizeof(directives[1]), + sizeof(directives[1]), + directive_compare); + if (dir) { + tokens[tix++].token_type = dir - directives; + continue; + } + + tokens[tix++].token_type = TOKEN_TYPE_NAME; + continue; + } + + /* Handle numbers */ + if (isdigit(*p)) { + /* Find the end of the number */ + q = p + 1; + while (q < nl && (isdigit(*q))) + q++; + tokens[tix].size = q - p; + p = q; + tokens[tix].content = malloc(tokens[tix].size + 1); + if (!tokens[tix].content) { + perror(NULL); + exit(1); + } + memcpy(tokens[tix].content, start, tokens[tix].size); + tokens[tix].content[tokens[tix].size] = 0; + tokens[tix++].token_type = TOKEN_NUMBER; + continue; + } + + if (nl - p >= 3) { + if (memcmp(p, "::=", 3) == 0) { + p += 3; + tokens[tix].size = 3; + tokens[tix].content = "::="; + tokens[tix++].token_type = TOKEN_ASSIGNMENT; + continue; + } + } + + if (nl - p >= 2) { + if (memcmp(p, "({", 2) == 0) { + p += 2; + tokens[tix].size = 2; + tokens[tix].content = "({"; + tokens[tix++].token_type = TOKEN_OPEN_ACTION; + continue; + } + if (memcmp(p, "})", 2) == 0) { + p += 2; + tokens[tix].size = 2; + tokens[tix].content = "})"; + tokens[tix++].token_type = TOKEN_CLOSE_ACTION; + continue; + } + } + + if (nl - p >= 1) { + tokens[tix].size = 1; + switch (*p) { + case '{': + p += 1; + tokens[tix].content = "{"; + tokens[tix++].token_type = TOKEN_OPEN_CURLY; + continue; + case '}': + p += 1; + tokens[tix].content = "}"; + tokens[tix++].token_type = TOKEN_CLOSE_CURLY; + continue; + case '[': + p += 1; + tokens[tix].content = "["; + tokens[tix++].token_type = TOKEN_OPEN_SQUARE; + continue; + case ']': + p += 1; + tokens[tix].content = "]"; + tokens[tix++].token_type = TOKEN_CLOSE_SQUARE; + continue; + case ',': + p += 1; + tokens[tix].content = ","; + tokens[tix++].token_type = TOKEN_COMMA; + continue; + default: + break; + } + } + + fprintf(stderr, "%s:%u: Unknown character in grammar: '%c'\n", + filename, lineno, *p); + exit(1); + } + } + + nr_tokens = tix; + verbose("Extracted %u tokens\n", nr_tokens); + +#if 0 + { + int n; + for (n = 0; n < nr_tokens; n++) + debug("Token %3u: '%s'\n", n, token_list[n].content); + } +#endif +} + +static void build_type_list(void); +static void parse(void); +static void dump_elements(void); +static void render(FILE *out, FILE *hdr); + +/* + * + */ +int main(int argc, char **argv) +{ + struct stat st; + ssize_t readlen; + FILE *out, *hdr; + char *buffer, *p; + char *kbuild_verbose; + int fd; + + kbuild_verbose = getenv("KBUILD_VERBOSE"); + if (kbuild_verbose) + verbose_opt = atoi(kbuild_verbose); + + while (argc > 4) { + if (strcmp(argv[1], "-v") == 0) + verbose_opt = true; + else if (strcmp(argv[1], "-d") == 0) + debug_opt = true; + else + break; + memmove(&argv[1], &argv[2], (argc - 2) * sizeof(char *)); + argc--; + } + + if (argc != 4) { + fprintf(stderr, "Format: %s [-v] [-d] \n", + argv[0]); + exit(2); + } + + filename = argv[1]; + outputname = argv[2]; + headername = argv[3]; + + fd = open(filename, O_RDONLY); + if (fd < 0) { + perror(filename); + exit(1); + } + + if (fstat(fd, &st) < 0) { + perror(filename); + exit(1); + } + + if (!(buffer = malloc(st.st_size + 1))) { + perror(NULL); + exit(1); + } + + if ((readlen = read(fd, buffer, st.st_size)) < 0) { + perror(filename); + exit(1); + } + + if (close(fd) < 0) { + perror(filename); + exit(1); + } + + if (readlen != st.st_size) { + fprintf(stderr, "%s: Short read\n", filename); + exit(1); + } + + p = strrchr(argv[1], '/'); + p = p ? p + 1 : argv[1]; + grammar_name = strdup(p); + if (!p) { + perror(NULL); + exit(1); + } + p = strchr(grammar_name, '.'); + if (p) + *p = '\0'; + + buffer[readlen] = 0; + tokenise(buffer, buffer + readlen); + build_type_list(); + parse(); + dump_elements(); + + out = fopen(outputname, "w"); + if (!out) { + perror(outputname); + exit(1); + } + + hdr = fopen(headername, "w"); + if (!hdr) { + perror(headername); + exit(1); + } + + render(out, hdr); + + if (fclose(out) < 0) { + perror(outputname); + exit(1); + } + + if (fclose(hdr) < 0) { + perror(headername); + exit(1); + } + + return 0; +} + +enum compound { + NOT_COMPOUND, + SET, + SET_OF, + SEQUENCE, + SEQUENCE_OF, + CHOICE, + ANY, + TYPE_REF, + TAG_OVERRIDE +}; + +struct element { + struct type *type_def; + struct token *name; + struct token *type; + struct action *action; + struct element *children; + struct element *next; + struct element *render_next; + struct element *list_next; + uint8_t n_elements; + enum compound compound : 8; + enum asn1_class class : 8; + enum asn1_method method : 8; + uint8_t tag; + unsigned entry_index; + unsigned flags; +#define ELEMENT_IMPLICIT 0x0001 +#define ELEMENT_EXPLICIT 0x0002 +#define ELEMENT_TAG_SPECIFIED 0x0004 +#define ELEMENT_RENDERED 0x0008 +#define ELEMENT_SKIPPABLE 0x0010 +#define ELEMENT_CONDITIONAL 0x0020 +}; + +struct type { + struct token *name; + struct token *def; + struct element *element; + unsigned ref_count; + unsigned flags; +#define TYPE_STOP_MARKER 0x0001 +#define TYPE_BEGIN 0x0002 +}; + +static struct type *type_list; +static struct type **type_index; +static unsigned nr_types; + +static int type_index_compare(const void *_a, const void *_b) +{ + const struct type *const *a = _a, *const *b = _b; + + if ((*a)->name->size != (*b)->name->size) + return (*a)->name->size - (*b)->name->size; + else + return memcmp((*a)->name->content, (*b)->name->content, + (*a)->name->size); +} + +static int type_finder(const void *_key, const void *_ti) +{ + const struct token *token = _key; + const struct type *const *ti = _ti; + const struct type *type = *ti; + + if (token->size != type->name->size) + return token->size - type->name->size; + else + return memcmp(token->content, type->name->content, + token->size); +} + +/* + * Build up a list of types and a sorted index to that list. + */ +static void build_type_list(void) +{ + struct type *types; + unsigned nr, t, n; + + nr = 0; + for (n = 0; n < nr_tokens - 1; n++) + if (token_list[n + 0].token_type == TOKEN_TYPE_NAME && + token_list[n + 1].token_type == TOKEN_ASSIGNMENT) + nr++; + + if (nr == 0) { + fprintf(stderr, "%s: No defined types\n", filename); + exit(1); + } + + nr_types = nr; + types = type_list = calloc(nr + 1, sizeof(type_list[0])); + if (!type_list) { + perror(NULL); + exit(1); + } + type_index = calloc(nr, sizeof(type_index[0])); + if (!type_index) { + perror(NULL); + exit(1); + } + + t = 0; + types[t].flags |= TYPE_BEGIN; + for (n = 0; n < nr_tokens - 1; n++) { + if (token_list[n + 0].token_type == TOKEN_TYPE_NAME && + token_list[n + 1].token_type == TOKEN_ASSIGNMENT) { + types[t].name = &token_list[n]; + type_index[t] = &types[t]; + t++; + } + } + types[t].name = &token_list[n + 1]; + types[t].flags |= TYPE_STOP_MARKER; + + qsort(type_index, nr, sizeof(type_index[0]), type_index_compare); + + verbose("Extracted %u types\n", nr_types); +#if 0 + for (n = 0; n < nr_types; n++) { + struct type *type = type_index[n]; + debug("- %*.*s\n", type->name->content); + } +#endif +} + +static struct element *parse_type(struct token **_cursor, struct token *stop, + struct token *name); + +/* + * Parse the token stream + */ +static void parse(void) +{ + struct token *cursor; + struct type *type; + + /* Parse one type definition statement at a time */ + type = type_list; + do { + cursor = type->name; + + if (cursor[0].token_type != TOKEN_TYPE_NAME || + cursor[1].token_type != TOKEN_ASSIGNMENT) + abort(); + cursor += 2; + + type->element = parse_type(&cursor, type[1].name, NULL); + type->element->type_def = type; + + if (cursor != type[1].name) { + fprintf(stderr, "%s:%d: Parse error at token '%s'\n", + filename, cursor->line, cursor->content); + exit(1); + } + + } while (type++, !(type->flags & TYPE_STOP_MARKER)); + + verbose("Extracted %u actions\n", nr_actions); +} + +static struct element *element_list; + +static struct element *alloc_elem(struct token *type) +{ + struct element *e = calloc(1, sizeof(*e)); + if (!e) { + perror(NULL); + exit(1); + } + e->list_next = element_list; + element_list = e; + return e; +} + +static struct element *parse_compound(struct token **_cursor, struct token *end, + int alternates); + +/* + * Parse one type definition statement + */ +static struct element *parse_type(struct token **_cursor, struct token *end, + struct token *name) +{ + struct element *top, *element; + struct action *action, **ppaction; + struct token *cursor = *_cursor; + struct type **ref; + char *p; + int labelled = 0, implicit = 0; + + top = element = alloc_elem(cursor); + element->class = ASN1_UNIV; + element->method = ASN1_PRIM; + element->tag = token_to_tag[cursor->token_type]; + element->name = name; + + /* Extract the tag value if one given */ + if (cursor->token_type == TOKEN_OPEN_SQUARE) { + cursor++; + if (cursor >= end) + goto overrun_error; + switch (cursor->token_type) { + case DIRECTIVE_UNIVERSAL: + element->class = ASN1_UNIV; + cursor++; + break; + case DIRECTIVE_APPLICATION: + element->class = ASN1_APPL; + cursor++; + break; + case TOKEN_NUMBER: + element->class = ASN1_CONT; + break; + case DIRECTIVE_PRIVATE: + element->class = ASN1_PRIV; + cursor++; + break; + default: + fprintf(stderr, "%s:%d: Unrecognised tag class token '%s'\n", + filename, cursor->line, cursor->content); + exit(1); + } + + if (cursor >= end) + goto overrun_error; + if (cursor->token_type != TOKEN_NUMBER) { + fprintf(stderr, "%s:%d: Missing tag number '%s'\n", + filename, cursor->line, cursor->content); + exit(1); + } + + element->tag &= ~0x1f; + element->tag |= strtoul(cursor->content, &p, 10); + element->flags |= ELEMENT_TAG_SPECIFIED; + if (p - cursor->content != cursor->size) + abort(); + cursor++; + + if (cursor >= end) + goto overrun_error; + if (cursor->token_type != TOKEN_CLOSE_SQUARE) { + fprintf(stderr, "%s:%d: Missing closing square bracket '%s'\n", + filename, cursor->line, cursor->content); + exit(1); + } + cursor++; + if (cursor >= end) + goto overrun_error; + labelled = 1; + } + + /* Handle implicit and explicit markers */ + if (cursor->token_type == DIRECTIVE_IMPLICIT) { + element->flags |= ELEMENT_IMPLICIT; + implicit = 1; + cursor++; + if (cursor >= end) + goto overrun_error; + } else if (cursor->token_type == DIRECTIVE_EXPLICIT) { + element->flags |= ELEMENT_EXPLICIT; + cursor++; + if (cursor >= end) + goto overrun_error; + } + + if (labelled) { + if (!implicit) + element->method |= ASN1_CONS; + element->compound = implicit ? TAG_OVERRIDE : SEQUENCE; + element->children = alloc_elem(cursor); + element = element->children; + element->class = ASN1_UNIV; + element->method = ASN1_PRIM; + element->tag = token_to_tag[cursor->token_type]; + element->name = name; + } + + /* Extract the type we're expecting here */ + element->type = cursor; + switch (cursor->token_type) { + case DIRECTIVE_ANY: + element->compound = ANY; + cursor++; + break; + + case DIRECTIVE_NULL: + case DIRECTIVE_BOOLEAN: + case DIRECTIVE_ENUMERATED: + case DIRECTIVE_INTEGER: + element->compound = NOT_COMPOUND; + cursor++; + break; + + case DIRECTIVE_EXTERNAL: + element->method = ASN1_CONS; + + case DIRECTIVE_BMPString: + case DIRECTIVE_GeneralString: + case DIRECTIVE_GraphicString: + case DIRECTIVE_IA5String: + case DIRECTIVE_ISO646String: + case DIRECTIVE_NumericString: + case DIRECTIVE_PrintableString: + case DIRECTIVE_T61String: + case DIRECTIVE_TeletexString: + case DIRECTIVE_UniversalString: + case DIRECTIVE_UTF8String: + case DIRECTIVE_VideotexString: + case DIRECTIVE_VisibleString: + case DIRECTIVE_ObjectDescriptor: + case DIRECTIVE_GeneralizedTime: + case DIRECTIVE_UTCTime: + element->compound = NOT_COMPOUND; + cursor++; + break; + + case DIRECTIVE_BIT: + case DIRECTIVE_OCTET: + element->compound = NOT_COMPOUND; + cursor++; + if (cursor >= end) + goto overrun_error; + if (cursor->token_type != DIRECTIVE_STRING) + goto parse_error; + cursor++; + break; + + case DIRECTIVE_OBJECT: + element->compound = NOT_COMPOUND; + cursor++; + if (cursor >= end) + goto overrun_error; + if (cursor->token_type != DIRECTIVE_IDENTIFIER) + goto parse_error; + cursor++; + break; + + case TOKEN_TYPE_NAME: + element->compound = TYPE_REF; + ref = bsearch(cursor, type_index, nr_types, sizeof(type_index[0]), + type_finder); + if (!ref) { + fprintf(stderr, "%s:%d: Type '%s' undefined\n", + filename, cursor->line, cursor->content); + exit(1); + } + cursor->type = *ref; + (*ref)->ref_count++; + cursor++; + break; + + case DIRECTIVE_CHOICE: + element->compound = CHOICE; + cursor++; + element->children = parse_compound(&cursor, end, 1); + break; + + case DIRECTIVE_SEQUENCE: + element->compound = SEQUENCE; + element->method = ASN1_CONS; + cursor++; + if (cursor >= end) + goto overrun_error; + if (cursor->token_type == DIRECTIVE_OF) { + element->compound = SEQUENCE_OF; + cursor++; + if (cursor >= end) + goto overrun_error; + element->children = parse_type(&cursor, end, NULL); + } else { + element->children = parse_compound(&cursor, end, 0); + } + break; + + case DIRECTIVE_SET: + element->compound = SET; + element->method = ASN1_CONS; + cursor++; + if (cursor >= end) + goto overrun_error; + if (cursor->token_type == DIRECTIVE_OF) { + element->compound = SET_OF; + cursor++; + if (cursor >= end) + goto parse_error; + element->children = parse_type(&cursor, end, NULL); + } else { + element->children = parse_compound(&cursor, end, 1); + } + break; + + default: + fprintf(stderr, "%s:%d: Token '%s' does not introduce a type\n", + filename, cursor->line, cursor->content); + exit(1); + } + + /* Handle elements that are optional */ + if (cursor < end && (cursor->token_type == DIRECTIVE_OPTIONAL || + cursor->token_type == DIRECTIVE_DEFAULT) + ) { + cursor++; + top->flags |= ELEMENT_SKIPPABLE; + } + + if (cursor < end && cursor->token_type == TOKEN_OPEN_ACTION) { + cursor++; + if (cursor >= end) + goto overrun_error; + if (cursor->token_type != TOKEN_ELEMENT_NAME) { + fprintf(stderr, "%s:%d: Token '%s' is not an action function name\n", + filename, cursor->line, cursor->content); + exit(1); + } + + action = malloc(sizeof(struct action)); + if (!action) { + perror(NULL); + exit(1); + } + action->index = 0; + action->name = cursor->content; + + for (ppaction = &action_list; + *ppaction; + ppaction = &(*ppaction)->next + ) { + int cmp = strcmp(action->name, (*ppaction)->name); + if (cmp == 0) { + free(action); + action = *ppaction; + goto found; + } + if (cmp < 0) { + action->next = *ppaction; + *ppaction = action; + nr_actions++; + goto found; + } + } + action->next = NULL; + *ppaction = action; + nr_actions++; + found: + + element->action = action; + cursor->action = action; + cursor++; + if (cursor >= end) + goto overrun_error; + if (cursor->token_type != TOKEN_CLOSE_ACTION) { + fprintf(stderr, "%s:%d: Missing close action, got '%s'\n", + filename, cursor->line, cursor->content); + exit(1); + } + cursor++; + } + + *_cursor = cursor; + return top; + +parse_error: + fprintf(stderr, "%s:%d: Unexpected token '%s'\n", + filename, cursor->line, cursor->content); + exit(1); + +overrun_error: + fprintf(stderr, "%s: Unexpectedly hit EOF\n", filename); + exit(1); +} + +/* + * Parse a compound type list + */ +static struct element *parse_compound(struct token **_cursor, struct token *end, + int alternates) +{ + struct element *children, **child_p = &children, *element; + struct token *cursor = *_cursor, *name; + + if (cursor->token_type != TOKEN_OPEN_CURLY) { + fprintf(stderr, "%s:%d: Expected compound to start with brace not '%s'\n", + filename, cursor->line, cursor->content); + exit(1); + } + cursor++; + if (cursor >= end) + goto overrun_error; + + if (cursor->token_type == TOKEN_OPEN_CURLY) { + fprintf(stderr, "%s:%d: Empty compound\n", + filename, cursor->line); + exit(1); + } + + for (;;) { + name = NULL; + if (cursor->token_type == TOKEN_ELEMENT_NAME) { + name = cursor; + cursor++; + if (cursor >= end) + goto overrun_error; + } + + element = parse_type(&cursor, end, name); + if (alternates) + element->flags |= ELEMENT_SKIPPABLE | ELEMENT_CONDITIONAL; + + *child_p = element; + child_p = &element->next; + + if (cursor >= end) + goto overrun_error; + if (cursor->token_type != TOKEN_COMMA) + break; + cursor++; + if (cursor >= end) + goto overrun_error; + } + + children->flags &= ~ELEMENT_CONDITIONAL; + + if (cursor->token_type != TOKEN_CLOSE_CURLY) { + fprintf(stderr, "%s:%d: Expected compound closure, got '%s'\n", + filename, cursor->line, cursor->content); + exit(1); + } + cursor++; + + *_cursor = cursor; + return children; + +overrun_error: + fprintf(stderr, "%s: Unexpectedly hit EOF\n", filename); + exit(1); +} + +static void dump_element(const struct element *e, int level) +{ + const struct element *c; + const struct type *t = e->type_def; + const char *name = e->name ? e->name->content : "."; + const char *tname = t && t->name ? t->name->content : "."; + char tag[32]; + + if (e->class == 0 && e->method == 0 && e->tag == 0) + strcpy(tag, "<...>"); + else if (e->class == ASN1_UNIV) + sprintf(tag, "%s %s %s", + asn1_classes[e->class], + asn1_methods[e->method], + asn1_universal_tags[e->tag]); + else + sprintf(tag, "%s %s %u", + asn1_classes[e->class], + asn1_methods[e->method], + e->tag); + + printf("%c%c%c%c%c %c %*s[*] \e[33m%s\e[m %s %s \e[35m%s\e[m\n", + e->flags & ELEMENT_IMPLICIT ? 'I' : '-', + e->flags & ELEMENT_EXPLICIT ? 'E' : '-', + e->flags & ELEMENT_TAG_SPECIFIED ? 'T' : '-', + e->flags & ELEMENT_SKIPPABLE ? 'S' : '-', + e->flags & ELEMENT_CONDITIONAL ? 'C' : '-', + "-tTqQcaro"[e->compound], + level, "", + tag, + tname, + name, + e->action ? e->action->name : ""); + if (e->compound == TYPE_REF) + dump_element(e->type->type->element, level + 3); + else + for (c = e->children; c; c = c->next) + dump_element(c, level + 3); +} + +static void dump_elements(void) +{ + if (debug_opt) + dump_element(type_list[0].element, 0); +} + +static void render_element(FILE *out, struct element *e, struct element *tag); +static void render_out_of_line_list(FILE *out); + +static int nr_entries; +static int render_depth = 1; +static struct element *render_list, **render_list_p = &render_list; + +__attribute__((format(printf, 2, 3))) +static void render_opcode(FILE *out, const char *fmt, ...) +{ + va_list va; + + if (out) { + fprintf(out, "\t[%4d] =%*s", nr_entries, render_depth, ""); + va_start(va, fmt); + vfprintf(out, fmt, va); + va_end(va); + } + nr_entries++; +} + +__attribute__((format(printf, 2, 3))) +static void render_more(FILE *out, const char *fmt, ...) +{ + va_list va; + + if (out) { + va_start(va, fmt); + vfprintf(out, fmt, va); + va_end(va); + } +} + +/* + * Render the grammar into a state machine definition. + */ +static void render(FILE *out, FILE *hdr) +{ + struct element *e; + struct action *action; + struct type *root; + int index; + + fprintf(hdr, "/*\n"); + fprintf(hdr, " * Automatically generated by asn1_compiler. Do not edit\n"); + fprintf(hdr, " *\n"); + fprintf(hdr, " * ASN.1 parser for %s\n", grammar_name); + fprintf(hdr, " */\n"); + fprintf(hdr, "#include \n"); + fprintf(hdr, "\n"); + fprintf(hdr, "extern const struct asn1_decoder %s_decoder;\n", grammar_name); + if (ferror(hdr)) { + perror(headername); + exit(1); + } + + fprintf(out, "/*\n"); + fprintf(out, " * Automatically generated by asn1_compiler. Do not edit\n"); + fprintf(out, " *\n"); + fprintf(out, " * ASN.1 parser for %s\n", grammar_name); + fprintf(out, " */\n"); + fprintf(out, "#include \n"); + fprintf(out, "#include \"%s.asn1.h\"\n", grammar_name); + fprintf(out, "\n"); + if (ferror(out)) { + perror(outputname); + exit(1); + } + + /* Tabulate the action functions we might have to call */ + fprintf(hdr, "\n"); + index = 0; + for (action = action_list; action; action = action->next) { + action->index = index++; + fprintf(hdr, + "extern int %s(void *, size_t, unsigned char," + " const void *, size_t);\n", + action->name); + } + fprintf(hdr, "\n"); + + fprintf(out, "enum %s_actions {\n", grammar_name); + for (action = action_list; action; action = action->next) + fprintf(out, "\tACT_%s = %u,\n", + action->name, action->index); + fprintf(out, "\tNR__%s_actions = %u\n", grammar_name, nr_actions); + fprintf(out, "};\n"); + + fprintf(out, "\n"); + fprintf(out, "static const asn1_action_t %s_action_table[NR__%s_actions] = {\n", + grammar_name, grammar_name); + for (action = action_list; action; action = action->next) + fprintf(out, "\t[%4u] = %s,\n", action->index, action->name); + fprintf(out, "};\n"); + + if (ferror(out)) { + perror(outputname); + exit(1); + } + + /* We do two passes - the first one calculates all the offsets */ + verbose("Pass 1\n"); + nr_entries = 0; + root = &type_list[0]; + render_element(NULL, root->element, NULL); + render_opcode(NULL, "ASN1_OP_COMPLETE,\n"); + render_out_of_line_list(NULL); + + for (e = element_list; e; e = e->list_next) + e->flags &= ~ELEMENT_RENDERED; + + /* And then we actually render */ + verbose("Pass 2\n"); + fprintf(out, "\n"); + fprintf(out, "static const unsigned char %s_machine[] = {\n", + grammar_name); + + nr_entries = 0; + root = &type_list[0]; + render_element(out, root->element, NULL); + render_opcode(out, "ASN1_OP_COMPLETE,\n"); + render_out_of_line_list(out); + + fprintf(out, "};\n"); + + fprintf(out, "\n"); + fprintf(out, "const struct asn1_decoder %s_decoder = {\n", grammar_name); + fprintf(out, "\t.machine = %s_machine,\n", grammar_name); + fprintf(out, "\t.machlen = sizeof(%s_machine),\n", grammar_name); + fprintf(out, "\t.actions = %s_action_table,\n", grammar_name); + fprintf(out, "};\n"); +} + +/* + * Render the out-of-line elements + */ +static void render_out_of_line_list(FILE *out) +{ + struct element *e, *ce; + const char *act; + int entry; + + while ((e = render_list)) { + render_list = e->render_next; + if (!render_list) + render_list_p = &render_list; + + render_more(out, "\n"); + e->entry_index = entry = nr_entries; + render_depth++; + for (ce = e->children; ce; ce = ce->next) + render_element(out, ce, NULL); + render_depth--; + + act = e->action ? "_ACT" : ""; + switch (e->compound) { + case SEQUENCE: + render_opcode(out, "ASN1_OP_END_SEQ%s,\n", act); + break; + case SEQUENCE_OF: + render_opcode(out, "ASN1_OP_END_SEQ_OF%s,\n", act); + render_opcode(out, "_jump_target(%u),\n", entry); + break; + case SET: + render_opcode(out, "ASN1_OP_END_SET%s,\n", act); + break; + case SET_OF: + render_opcode(out, "ASN1_OP_END_SET_OF%s,\n", act); + render_opcode(out, "_jump_target(%u),\n", entry); + break; + default: + break; + } + if (e->action) + render_opcode(out, "_action(ACT_%s),\n", + e->action->name); + render_opcode(out, "ASN1_OP_RETURN,\n"); + } +} + +/* + * Render an element. + */ +static void render_element(FILE *out, struct element *e, struct element *tag) +{ + struct element *ec, *x; + const char *cond, *act; + int entry, skippable = 0, outofline = 0; + + if (e->flags & ELEMENT_SKIPPABLE || + (tag && tag->flags & ELEMENT_SKIPPABLE)) + skippable = 1; + + if ((e->type_def && e->type_def->ref_count > 1) || + skippable) + outofline = 1; + + if (e->type_def && out) { + render_more(out, "\t// %s\n", e->type_def->name->content); + } + + /* Render the operation */ + cond = (e->flags & ELEMENT_CONDITIONAL || + (tag && tag->flags & ELEMENT_CONDITIONAL)) ? "COND_" : ""; + act = e->action ? "_ACT" : ""; + switch (e->compound) { + case ANY: + render_opcode(out, "ASN1_OP_%sMATCH_ANY%s%s,", + cond, act, skippable ? "_OR_SKIP" : ""); + if (e->name) + render_more(out, "\t\t// %s", e->name->content); + render_more(out, "\n"); + goto dont_render_tag; + + case TAG_OVERRIDE: + render_element(out, e->children, e); + return; + + case SEQUENCE: + case SEQUENCE_OF: + case SET: + case SET_OF: + render_opcode(out, "ASN1_OP_%sMATCH%s%s,", + cond, + outofline ? "_JUMP" : "", + skippable ? "_OR_SKIP" : ""); + break; + + case CHOICE: + goto dont_render_tag; + + case TYPE_REF: + if (e->class == ASN1_UNIV && e->method == ASN1_PRIM && e->tag == 0) + goto dont_render_tag; + default: + render_opcode(out, "ASN1_OP_%sMATCH%s%s,", + cond, act, + skippable ? "_OR_SKIP" : ""); + break; + } + + x = tag ?: e; + if (x->name) + render_more(out, "\t\t// %s", x->name->content); + render_more(out, "\n"); + + /* Render the tag */ + if (!tag || !(tag->flags & ELEMENT_TAG_SPECIFIED)) + tag = e; + + if (tag->class == ASN1_UNIV && + tag->tag != 14 && + tag->tag != 15 && + tag->tag != 31) + render_opcode(out, "_tag(%s, %s, %s),\n", + asn1_classes[tag->class], + asn1_methods[tag->method | e->method], + asn1_universal_tags[tag->tag]); + else + render_opcode(out, "_tagn(%s, %s, %2u),\n", + asn1_classes[tag->class], + asn1_methods[tag->method | e->method], + tag->tag); + tag = NULL; +dont_render_tag: + + /* Deal with compound types */ + switch (e->compound) { + case TYPE_REF: + render_element(out, e->type->type->element, tag); + if (e->action) + render_opcode(out, "ASN1_OP_%sACT,\n", + skippable ? "MAYBE_" : ""); + break; + + case SEQUENCE: + if (outofline) { + /* Render out-of-line for multiple use or + * skipability */ + render_opcode(out, "_jump_target(%u),", e->entry_index); + if (e->type_def && e->type_def->name) + render_more(out, "\t\t// --> %s", + e->type_def->name->content); + render_more(out, "\n"); + if (!(e->flags & ELEMENT_RENDERED)) { + e->flags |= ELEMENT_RENDERED; + *render_list_p = e; + render_list_p = &e->render_next; + } + return; + } else { + /* Render inline for single use */ + render_depth++; + for (ec = e->children; ec; ec = ec->next) + render_element(out, ec, NULL); + render_depth--; + render_opcode(out, "ASN1_OP_END_SEQ%s,\n", act); + } + break; + + case SEQUENCE_OF: + case SET_OF: + if (outofline) { + /* Render out-of-line for multiple use or + * skipability */ + render_opcode(out, "_jump_target(%u),", e->entry_index); + if (e->type_def && e->type_def->name) + render_more(out, "\t\t// --> %s", + e->type_def->name->content); + render_more(out, "\n"); + if (!(e->flags & ELEMENT_RENDERED)) { + e->flags |= ELEMENT_RENDERED; + *render_list_p = e; + render_list_p = &e->render_next; + } + return; + } else { + /* Render inline for single use */ + entry = nr_entries; + render_depth++; + render_element(out, e->children, NULL); + render_depth--; + if (e->compound == SEQUENCE_OF) + render_opcode(out, "ASN1_OP_END_SEQ_OF%s,\n", act); + else + render_opcode(out, "ASN1_OP_END_SET_OF%s,\n", act); + render_opcode(out, "_jump_target(%u),\n", entry); + } + break; + + case SET: + /* I can't think of a nice way to do SET support without having + * a stack of bitmasks to make sure no element is repeated. + * The bitmask has also to be checked that no non-optional + * elements are left out whilst not preventing optional + * elements from being left out. + */ + fprintf(stderr, "The ASN.1 SET type is not currently supported.\n"); + exit(1); + + case CHOICE: + for (ec = e->children; ec; ec = ec->next) + render_element(out, ec, ec); + if (!skippable) + render_opcode(out, "ASN1_OP_COND_FAIL,\n"); + if (e->action) + render_opcode(out, "ASN1_OP_ACT,\n"); + break; + + default: + break; + } + + if (e->action) + render_opcode(out, "_action(ACT_%s),\n", e->action->name); +} diff --git a/src/net/scripts/atomic/atomic-tbl.sh b/src/net/scripts/atomic/atomic-tbl.sh new file mode 100755 index 0000000..81d5c32 --- /dev/null +++ b/src/net/scripts/atomic/atomic-tbl.sh @@ -0,0 +1,186 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# helpers for dealing with atomics.tbl + +#meta_in(meta, match) +meta_in() +{ + case "$1" in + [$2]) return 0;; + esac + + return 1 +} + +#meta_has_ret(meta) +meta_has_ret() +{ + meta_in "$1" "bBiIfFlR" +} + +#meta_has_acquire(meta) +meta_has_acquire() +{ + meta_in "$1" "BFIlR" +} + +#meta_has_release(meta) +meta_has_release() +{ + meta_in "$1" "BFIRs" +} + +#meta_has_relaxed(meta) +meta_has_relaxed() +{ + meta_in "$1" "BFIR" +} + +#find_fallback_template(pfx, name, sfx, order) +find_fallback_template() +{ + local pfx="$1"; shift + local name="$1"; shift + local sfx="$1"; shift + local order="$1"; shift + + local base="" + local file="" + + # We may have fallbacks for a specific case (e.g. read_acquire()), or + # an entire class, e.g. *inc*(). + # + # Start at the most specific, and fall back to the most general. Once + # we find a specific fallback, don't bother looking for more. + for base in "${pfx}${name}${sfx}${order}" "${name}"; do + file="${ATOMICDIR}/fallbacks/${base}" + + if [ -f "${file}" ]; then + printf "${file}" + break + fi + done +} + +#gen_ret_type(meta, int) +gen_ret_type() { + local meta="$1"; shift + local int="$1"; shift + + case "${meta}" in + [sv]) printf "void";; + [bB]) printf "bool";; + [aiIfFlR]) printf "${int}";; + esac +} + +#gen_ret_stmt(meta) +gen_ret_stmt() +{ + if meta_has_ret "${meta}"; then + printf "return "; + fi +} + +# gen_param_name(arg) +gen_param_name() +{ + # strip off the leading 'c' for 'cv' + local name="${1#c}" + printf "${name#*:}" +} + +# gen_param_type(arg, int, atomic) +gen_param_type() +{ + local type="${1%%:*}"; shift + local int="$1"; shift + local atomic="$1"; shift + + case "${type}" in + i) type="${int} ";; + p) type="${int} *";; + v) type="${atomic}_t *";; + cv) type="const ${atomic}_t *";; + esac + + printf "${type}" +} + +#gen_param(arg, int, atomic) +gen_param() +{ + local arg="$1"; shift + local int="$1"; shift + local atomic="$1"; shift + local name="$(gen_param_name "${arg}")" + local type="$(gen_param_type "${arg}" "${int}" "${atomic}")" + + printf "${type}${name}" +} + +#gen_params(int, atomic, arg...) +gen_params() +{ + local int="$1"; shift + local atomic="$1"; shift + + while [ "$#" -gt 0 ]; do + gen_param "$1" "${int}" "${atomic}" + [ "$#" -gt 1 ] && printf ", " + shift; + done +} + +#gen_args(arg...) +gen_args() +{ + while [ "$#" -gt 0 ]; do + printf "$(gen_param_name "$1")" + [ "$#" -gt 1 ] && printf ", " + shift; + done +} + +#gen_proto_order_variants(meta, pfx, name, sfx, ...) +gen_proto_order_variants() +{ + local meta="$1"; shift + local pfx="$1"; shift + local name="$1"; shift + local sfx="$1"; shift + + gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "" "$@" + + if meta_has_acquire "${meta}"; then + gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_acquire" "$@" + fi + if meta_has_release "${meta}"; then + gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_release" "$@" + fi + if meta_has_relaxed "${meta}"; then + gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_relaxed" "$@" + fi +} + +#gen_proto_variants(meta, name, ...) +gen_proto_variants() +{ + local meta="$1"; shift + local name="$1"; shift + local pfx="" + local sfx="" + + meta_in "${meta}" "fF" && pfx="fetch_" + meta_in "${meta}" "R" && sfx="_return" + + gen_proto_order_variants "${meta}" "${pfx}" "${name}" "${sfx}" "$@" +} + +#gen_proto(meta, ...) +gen_proto() { + local meta="$1"; shift + for m in $(echo "${meta}" | grep -o .); do + gen_proto_variants "${m}" "$@" + done +} diff --git a/src/net/scripts/atomic/atomics.tbl b/src/net/scripts/atomic/atomics.tbl new file mode 100755 index 0000000..fbee2f6 --- /dev/null +++ b/src/net/scripts/atomic/atomics.tbl @@ -0,0 +1,41 @@ +# name meta args... +# +# Where meta contains a string of variants to generate. +# Upper-case implies _{acquire,release,relaxed} variants. +# Valid meta values are: +# * B/b - bool: returns bool +# * v - void: returns void +# * I/i - int: returns base type +# * R - return: returns base type (has _return variants) +# * F/f - fetch: returns base type (has fetch_ variants) +# * l - load: returns base type (has _acquire order variant) +# * s - store: returns void (has _release order variant) +# +# Where args contains list of type[:name], where type is: +# * cv - const pointer to atomic base type (atomic_t/atomic64_t/atomic_long_t) +# * v - pointer to atomic base type (atomic_t/atomic64_t/atomic_long_t) +# * i - base type (int/s64/long) +# * p - pointer to base type (int/s64/long) +# +read l cv +set s v i +add vRF i v +sub vRF i v +inc vRF v +dec vRF v +and vF i v +andnot vF i v +or vF i v +xor vF i v +xchg I v i +cmpxchg I v i:old i:new +try_cmpxchg B v p:old i:new +sub_and_test b i v +dec_and_test b v +inc_and_test b v +add_negative b i v +add_unless fb v i:a i:u +inc_not_zero b v +inc_unless_negative b v +dec_unless_positive b v +dec_if_positive i v diff --git a/src/net/scripts/atomic/check-atomics.sh b/src/net/scripts/atomic/check-atomics.sh new file mode 100755 index 0000000..82748d4 --- /dev/null +++ b/src/net/scripts/atomic/check-atomics.sh @@ -0,0 +1,34 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# +# Check if atomic headers are up-to-date + +ATOMICDIR=$(dirname $0) +ATOMICTBL=${ATOMICDIR}/atomics.tbl +LINUXDIR=${ATOMICDIR}/../.. + +echo '' | sha1sum - > /dev/null 2>&1 +if [ $? -ne 0 ]; then + printf "sha1sum not available, skipping atomic header checks.\n" + exit 0 +fi + +cat < 0)) + return false; + } while (!${arch}${atomic}_try_cmpxchg(v, &c, c - 1)); + + return true; +} +EOF diff --git a/src/net/scripts/atomic/fallbacks/fence b/src/net/scripts/atomic/fallbacks/fence new file mode 100755 index 0000000..3764fc8 --- /dev/null +++ b/src/net/scripts/atomic/fallbacks/fence @@ -0,0 +1,11 @@ +cat <counter); +} +EOF diff --git a/src/net/scripts/atomic/fallbacks/release b/src/net/scripts/atomic/fallbacks/release new file mode 100755 index 0000000..f8906d5 --- /dev/null +++ b/src/net/scripts/atomic/fallbacks/release @@ -0,0 +1,8 @@ +cat <counter, i); +} +EOF diff --git a/src/net/scripts/atomic/fallbacks/sub_and_test b/src/net/scripts/atomic/fallbacks/sub_and_test new file mode 100755 index 0000000..c580f4c --- /dev/null +++ b/src/net/scripts/atomic/fallbacks/sub_and_test @@ -0,0 +1,16 @@ +cat < + +EOF + +for xchg in "${ARCH}xchg" "${ARCH}cmpxchg" "${ARCH}cmpxchg64"; do + gen_xchg_fallbacks "${xchg}" +done + +gen_try_cmpxchg_fallbacks + +grep '^[a-z]' "$1" | while read name meta args; do + gen_proto "${meta}" "${name}" "${ARCH}" "atomic" "int" ${args} +done + +cat < +#endif + +EOF + +grep '^[a-z]' "$1" | while read name meta args; do + gen_proto "${meta}" "${name}" "${ARCH}" "atomic64" "s64" ${args} +done + +cat < +#include +#include + +EOF + +grep '^[a-z]' "$1" | while read name meta args; do + gen_proto "${meta}" "${name}" "atomic" "int" ${args} +done + +grep '^[a-z]' "$1" | while read name meta args; do + gen_proto "${meta}" "${name}" "atomic64" "s64" ${args} +done + +for xchg in "xchg" "cmpxchg" "cmpxchg64" "try_cmpxchg"; do + for order in "" "_acquire" "_release" "_relaxed"; do + gen_optional_xchg "${xchg}" "${order}" + done +done + +for xchg in "cmpxchg_local" "cmpxchg64_local" "sync_cmpxchg"; do + gen_xchg "${xchg}" "" + printf "\n" +done + +gen_xchg "cmpxchg_double" "2 * " + +printf "\n\n" + +gen_xchg "cmpxchg_double_local" "2 * " + +cat < +#include + +#ifdef CONFIG_64BIT +typedef atomic64_t atomic_long_t; +#define ATOMIC_LONG_INIT(i) ATOMIC64_INIT(i) +#define atomic_long_cond_read_acquire atomic64_cond_read_acquire +#define atomic_long_cond_read_relaxed atomic64_cond_read_relaxed +#else +typedef atomic_t atomic_long_t; +#define ATOMIC_LONG_INIT(i) ATOMIC_INIT(i) +#define atomic_long_cond_read_acquire atomic_cond_read_acquire +#define atomic_long_cond_read_relaxed atomic_cond_read_relaxed +#endif + +#ifdef CONFIG_64BIT + +EOF + +grep '^[a-z]' "$1" | while read name meta args; do + gen_proto "${meta}" "${name}" "atomic64" "s64" ${args} +done + +cat < ${LINUXDIR}/include/${header} + HASH="$(sha1sum ${LINUXDIR}/include/${header})" + HASH="${HASH%% *}" + printf "// %s\n" "${HASH}" >> ${LINUXDIR}/include/${header} +done diff --git a/src/net/scripts/basic/.gitignore b/src/net/scripts/basic/.gitignore new file mode 100644 index 0000000..98ae1f5 --- /dev/null +++ b/src/net/scripts/basic/.gitignore @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: GPL-2.0-only +fixdep diff --git a/src/net/scripts/basic/Makefile b/src/net/scripts/basic/Makefile new file mode 100644 index 0000000..eeb6a38 --- /dev/null +++ b/src/net/scripts/basic/Makefile @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# fixdep: used to generate dependency information during build process + +hostprogs-always-y += fixdep diff --git a/src/net/scripts/basic/fixdep.c b/src/net/scripts/basic/fixdep.c new file mode 100644 index 0000000..d985405 --- /dev/null +++ b/src/net/scripts/basic/fixdep.c @@ -0,0 +1,404 @@ +/* + * "Optimize" a list of dependencies as spit out by gcc -MD + * for the kernel build + * =========================================================================== + * + * Author Kai Germaschewski + * Copyright 2002 by Kai Germaschewski + * + * This software may be used and distributed according to the terms + * of the GNU General Public License, incorporated herein by reference. + * + * + * Introduction: + * + * gcc produces a very nice and correct list of dependencies which + * tells make when to remake a file. + * + * To use this list as-is however has the drawback that virtually + * every file in the kernel includes autoconf.h. + * + * If the user re-runs make *config, autoconf.h will be + * regenerated. make notices that and will rebuild every file which + * includes autoconf.h, i.e. basically all files. This is extremely + * annoying if the user just changed CONFIG_HIS_DRIVER from n to m. + * + * So we play the same trick that "mkdep" played before. We replace + * the dependency on autoconf.h by a dependency on every config + * option which is mentioned in any of the listed prerequisites. + * + * kconfig populates a tree in include/config/ with an empty file + * for each config symbol and when the configuration is updated + * the files representing changed config options are touched + * which then let make pick up the changes and the files that use + * the config symbols are rebuilt. + * + * So if the user changes his CONFIG_HIS_DRIVER option, only the objects + * which depend on "include/config/his/driver.h" will be rebuilt, + * so most likely only his driver ;-) + * + * The idea above dates, by the way, back to Michael E Chastain, AFAIK. + * + * So to get dependencies right, there are two issues: + * o if any of the files the compiler read changed, we need to rebuild + * o if the command line given to the compile the file changed, we + * better rebuild as well. + * + * The former is handled by using the -MD output, the later by saving + * the command line used to compile the old object and comparing it + * to the one we would now use. + * + * Again, also this idea is pretty old and has been discussed on + * kbuild-devel a long time ago. I don't have a sensibly working + * internet connection right now, so I rather don't mention names + * without double checking. + * + * This code here has been based partially based on mkdep.c, which + * says the following about its history: + * + * Copyright abandoned, Michael Chastain, . + * This is a C version of syncdep.pl by Werner Almesberger. + * + * + * It is invoked as + * + * fixdep + * + * and will read the dependency file + * + * The transformed dependency snipped is written to stdout. + * + * It first generates a line + * + * cmd_ = + * + * and then basically copies the ..d file to stdout, in the + * process filtering out the dependency on autoconf.h and adding + * dependencies on include/config/my/option.h for every + * CONFIG_MY_OPTION encountered in any of the prerequisites. + * + * We don't even try to really parse the header files, but + * merely grep, i.e. if CONFIG_FOO is mentioned in a comment, it will + * be picked up as well. It's not a problem with respect to + * correctness, since that can only give too many dependencies, thus + * we cannot miss a rebuild. Since people tend to not mention totally + * unrelated CONFIG_ options all over the place, it's not an + * efficiency problem either. + * + * (Note: it'd be easy to port over the complete mkdep state machine, + * but I don't think the added complexity is worth it) + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static void usage(void) +{ + fprintf(stderr, "Usage: fixdep \n"); + exit(1); +} + +/* + * In the intended usage of this program, the stdout is redirected to .*.cmd + * files. The return value of printf() and putchar() must be checked to catch + * any error, e.g. "No space left on device". + */ +static void xprintf(const char *format, ...) +{ + va_list ap; + int ret; + + va_start(ap, format); + ret = vprintf(format, ap); + if (ret < 0) { + perror("fixdep"); + exit(1); + } + va_end(ap); +} + +static void xputchar(int c) +{ + int ret; + + ret = putchar(c); + if (ret == EOF) { + perror("fixdep"); + exit(1); + } +} + +/* + * Print out a dependency path from a symbol name + */ +static void print_dep(const char *m, int slen, const char *dir) +{ + int c, prev_c = '/', i; + + xprintf(" $(wildcard %s/", dir); + for (i = 0; i < slen; i++) { + c = m[i]; + if (c == '_') + c = '/'; + else + c = tolower(c); + if (c != '/' || prev_c != '/') + xputchar(c); + prev_c = c; + } + xprintf(".h) \\\n"); +} + +struct item { + struct item *next; + unsigned int len; + unsigned int hash; + char name[]; +}; + +#define HASHSZ 256 +static struct item *hashtab[HASHSZ]; + +static unsigned int strhash(const char *str, unsigned int sz) +{ + /* fnv32 hash */ + unsigned int i, hash = 2166136261U; + + for (i = 0; i < sz; i++) + hash = (hash ^ str[i]) * 0x01000193; + return hash; +} + +/* + * Lookup a value in the configuration string. + */ +static int is_defined_config(const char *name, int len, unsigned int hash) +{ + struct item *aux; + + for (aux = hashtab[hash % HASHSZ]; aux; aux = aux->next) { + if (aux->hash == hash && aux->len == len && + memcmp(aux->name, name, len) == 0) + return 1; + } + return 0; +} + +/* + * Add a new value to the configuration string. + */ +static void define_config(const char *name, int len, unsigned int hash) +{ + struct item *aux = malloc(sizeof(*aux) + len); + + if (!aux) { + perror("fixdep:malloc"); + exit(1); + } + memcpy(aux->name, name, len); + aux->len = len; + aux->hash = hash; + aux->next = hashtab[hash % HASHSZ]; + hashtab[hash % HASHSZ] = aux; +} + +/* + * Record the use of a CONFIG_* word. + */ +static void use_config(const char *m, int slen) +{ + unsigned int hash = strhash(m, slen); + + if (is_defined_config(m, slen, hash)) + return; + + define_config(m, slen, hash); + print_dep(m, slen, "include/config"); +} + +/* test if s ends in sub */ +static int str_ends_with(const char *s, int slen, const char *sub) +{ + int sublen = strlen(sub); + + if (sublen > slen) + return 0; + + return !memcmp(s + slen - sublen, sub, sublen); +} + +static void parse_config_file(const char *p) +{ + const char *q, *r; + const char *start = p; + + while ((p = strstr(p, "CONFIG_"))) { + if (p > start && (isalnum(p[-1]) || p[-1] == '_')) { + p += 7; + continue; + } + p += 7; + q = p; + while (isalnum(*q) || *q == '_') + q++; + if (str_ends_with(p, q - p, "_MODULE")) + r = q - 7; + else + r = q; + if (r > p) + use_config(p, r - p); + p = q; + } +} + +static void *read_file(const char *filename) +{ + struct stat st; + int fd; + char *buf; + + fd = open(filename, O_RDONLY); + if (fd < 0) { + fprintf(stderr, "fixdep: error opening file: "); + perror(filename); + exit(2); + } + if (fstat(fd, &st) < 0) { + fprintf(stderr, "fixdep: error fstat'ing file: "); + perror(filename); + exit(2); + } + buf = malloc(st.st_size + 1); + if (!buf) { + perror("fixdep: malloc"); + exit(2); + } + if (read(fd, buf, st.st_size) != st.st_size) { + perror("fixdep: read"); + exit(2); + } + buf[st.st_size] = '\0'; + close(fd); + + return buf; +} + +/* Ignore certain dependencies */ +static int is_ignored_file(const char *s, int len) +{ + return str_ends_with(s, len, "include/generated/autoconf.h") || + str_ends_with(s, len, "include/generated/autoksyms.h"); +} + +/* + * Important: The below generated source_foo.o and deps_foo.o variable + * assignments are parsed not only by make, but also by the rather simple + * parser in scripts/mod/sumversion.c. + */ +static void parse_dep_file(char *m, const char *target) +{ + char *p; + int is_last, is_target; + int saw_any_target = 0; + int is_first_dep = 0; + void *buf; + + while (1) { + /* Skip any "white space" */ + while (*m == ' ' || *m == '\\' || *m == '\n') + m++; + + if (!*m) + break; + + /* Find next "white space" */ + p = m; + while (*p && *p != ' ' && *p != '\\' && *p != '\n') + p++; + is_last = (*p == '\0'); + /* Is the token we found a target name? */ + is_target = (*(p-1) == ':'); + /* Don't write any target names into the dependency file */ + if (is_target) { + /* The /next/ file is the first dependency */ + is_first_dep = 1; + } else if (!is_ignored_file(m, p - m)) { + *p = '\0'; + + /* + * Do not list the source file as dependency, so that + * kbuild is not confused if a .c file is rewritten + * into .S or vice versa. Storing it in source_* is + * needed for modpost to compute srcversions. + */ + if (is_first_dep) { + /* + * If processing the concatenation of multiple + * dependency files, only process the first + * target name, which will be the original + * source name, and ignore any other target + * names, which will be intermediate temporary + * files. + */ + if (!saw_any_target) { + saw_any_target = 1; + xprintf("source_%s := %s\n\n", + target, m); + xprintf("deps_%s := \\\n", target); + } + is_first_dep = 0; + } else { + xprintf(" %s \\\n", m); + } + + buf = read_file(m); + parse_config_file(buf); + free(buf); + } + + if (is_last) + break; + + /* + * Start searching for next token immediately after the first + * "whitespace" character that follows this token. + */ + m = p + 1; + } + + if (!saw_any_target) { + fprintf(stderr, "fixdep: parse error; no targets found\n"); + exit(1); + } + + xprintf("\n%s: $(deps_%s)\n\n", target, target); + xprintf("$(deps_%s):\n", target); +} + +int main(int argc, char *argv[]) +{ + const char *depfile, *target, *cmdline; + void *buf; + + if (argc != 4) + usage(); + + depfile = argv[1]; + target = argv[2]; + cmdline = argv[3]; + + xprintf("cmd_%s := %s\n\n", target, cmdline); + + buf = read_file(depfile); + parse_dep_file(buf, target); + free(buf); + + return 0; +} diff --git a/src/net/scripts/bin2c.c b/src/net/scripts/bin2c.c new file mode 100644 index 0000000..c3d7eef --- /dev/null +++ b/src/net/scripts/bin2c.c @@ -0,0 +1,36 @@ +/* + * Unloved program to convert a binary on stdin to a C include on stdout + * + * Jan 1999 Matt Mackall + * + * This software may be used and distributed according to the terms + * of the GNU General Public License, incorporated herein by reference. + */ + +#include + +int main(int argc, char *argv[]) +{ + int ch, total = 0; + + if (argc > 1) + printf("const char %s[] %s=\n", + argv[1], argc > 2 ? argv[2] : ""); + + do { + printf("\t\""); + while ((ch = getchar()) != EOF) { + total++; + printf("\\x%02x", ch); + if (total % 16 == 0) + break; + } + printf("\"\n"); + } while (ch != EOF); + + if (argc > 1) + printf("\t;\n\n#include \n\nconst size_t %s_size = %d;\n", + argv[1], total); + + return 0; +} diff --git a/src/net/scripts/bloat-o-meter b/src/net/scripts/bloat-o-meter new file mode 100755 index 0000000..dcd8d87 --- /dev/null +++ b/src/net/scripts/bloat-o-meter @@ -0,0 +1,104 @@ +#!/usr/bin/env python3 +# +# Copyright 2004 Matt Mackall +# +# inspired by perl Bloat-O-Meter (c) 1997 by Andi Kleen +# +# This software may be used and distributed according to the terms +# of the GNU General Public License, incorporated herein by reference. + +import sys, os, re +from signal import signal, SIGPIPE, SIG_DFL + +signal(SIGPIPE, SIG_DFL) + +if len(sys.argv) < 3: + sys.stderr.write("usage: %s [option] file1 file2\n" % sys.argv[0]) + sys.stderr.write("The options are:\n") + sys.stderr.write("-c categorize output based on symbol type\n") + sys.stderr.write("-d Show delta of Data Section\n") + sys.stderr.write("-t Show delta of text Section\n") + sys.exit(-1) + +re_NUMBER = re.compile(r'\.[0-9]+') + +def getsizes(file, format): + sym = {} + with os.popen("nm --size-sort " + file) as f: + for line in f: + if line.startswith("\n") or ":" in line: + continue + size, type, name = line.split() + if type in format: + # strip generated symbols + if name.startswith("__mod_"): continue + if name.startswith("__se_sys"): continue + if name.startswith("__se_compat_sys"): continue + if name.startswith("__addressable_"): continue + if name == "linux_banner": continue + # statics and some other optimizations adds random .NUMBER + name = re_NUMBER.sub('', name) + sym[name] = sym.get(name, 0) + int(size, 16) + return sym + +def calc(oldfile, newfile, format): + old = getsizes(oldfile, format) + new = getsizes(newfile, format) + grow, shrink, add, remove, up, down = 0, 0, 0, 0, 0, 0 + delta, common = [], {} + otot, ntot = 0, 0 + + for a in old: + if a in new: + common[a] = 1 + + for name in old: + otot += old[name] + if name not in common: + remove += 1 + down += old[name] + delta.append((-old[name], name)) + + for name in new: + ntot += new[name] + if name not in common: + add += 1 + up += new[name] + delta.append((new[name], name)) + + for name in common: + d = new.get(name, 0) - old.get(name, 0) + if d>0: grow, up = grow+1, up+d + if d<0: shrink, down = shrink+1, down-d + delta.append((d, name)) + + delta.sort() + delta.reverse() + return grow, shrink, add, remove, up, down, delta, old, new, otot, ntot + +def print_result(symboltype, symbolformat, argc): + grow, shrink, add, remove, up, down, delta, old, new, otot, ntot = \ + calc(sys.argv[argc - 1], sys.argv[argc], symbolformat) + + print("add/remove: %s/%s grow/shrink: %s/%s up/down: %s/%s (%s)" % \ + (add, remove, grow, shrink, up, -down, up-down)) + print("%-40s %7s %7s %+7s" % (symboltype, "old", "new", "delta")) + for d, n in delta: + if d: print("%-40s %7s %7s %+7d" % (n, old.get(n,"-"), new.get(n,"-"), d)) + + if otot: + percent = (ntot - otot) * 100.0 / otot + else: + percent = 0 + print("Total: Before=%d, After=%d, chg %+.2f%%" % (otot, ntot, percent)) + +if sys.argv[1] == "-c": + print_result("Function", "tT", 3) + print_result("Data", "dDbB", 3) + print_result("RO Data", "rR", 3) +elif sys.argv[1] == "-d": + print_result("Data", "dDbBrR", 3) +elif sys.argv[1] == "-t": + print_result("Function", "tT", 3) +else: + print_result("Function", "tTdDbBrR", 2) diff --git a/src/net/scripts/bootgraph.pl b/src/net/scripts/bootgraph.pl new file mode 100755 index 0000000..79c9032 --- /dev/null +++ b/src/net/scripts/bootgraph.pl @@ -0,0 +1,224 @@ +#!/usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0-only + +# Copyright 2008, Intel Corporation +# +# This file is part of the Linux kernel +# +# Authors: +# Arjan van de Ven + + +# +# This script turns a dmesg output into a SVG graphic that shows which +# functions take how much time. You can view SVG graphics with various +# programs, including Inkscape, The Gimp and Firefox. +# +# +# For this script to work, the kernel needs to be compiled with the +# CONFIG_PRINTK_TIME configuration option enabled, and with +# "initcall_debug" passed on the kernel command line. +# +# usage: +# dmesg | perl scripts/bootgraph.pl > output.svg +# + +use strict; +use Getopt::Long; +my $header = 0; + +sub help { + my $text = << "EOM"; +Usage: +1) dmesg | perl scripts/bootgraph.pl [OPTION] > output.svg +2) perl scripts/bootgraph.pl -h + +Options: + -header Insert kernel version and date +EOM + my $std=shift; + if ($std == 1) { + print STDERR $text; + } else { + print $text; + } + exit; +} + +GetOptions( + 'h|help' =>\&help, + 'header' =>\$header +); + +my %start; +my %end; +my %type; +my $done = 0; +my $maxtime = 0; +my $firsttime = 99999; +my $count = 0; +my %pids; +my %pidctr; + +my $headerstep = 20; +my $xheader = 15; +my $yheader = 25; +my $cyheader = 0; + +while (<>) { + my $line = $_; + if ($line =~ /([0-9\.]+)\] calling ([a-zA-Z0-9\_\.]+)\+/) { + my $func = $2; + if ($done == 0) { + $start{$func} = $1; + $type{$func} = 0; + if ($1 < $firsttime) { + $firsttime = $1; + } + } + if ($line =~ /\@ ([0-9]+)/) { + $pids{$func} = $1; + } + $count = $count + 1; + } + + if ($line =~ /([0-9\.]+)\] async_waiting @ ([0-9]+)/) { + my $pid = $2; + my $func; + if (!defined($pidctr{$pid})) { + $func = "wait_" . $pid . "_1"; + $pidctr{$pid} = 1; + } else { + $pidctr{$pid} = $pidctr{$pid} + 1; + $func = "wait_" . $pid . "_" . $pidctr{$pid}; + } + if ($done == 0) { + $start{$func} = $1; + $type{$func} = 1; + if ($1 < $firsttime) { + $firsttime = $1; + } + } + $pids{$func} = $pid; + $count = $count + 1; + } + + if ($line =~ /([0-9\.]+)\] initcall ([a-zA-Z0-9\_\.]+)\+.*returned/) { + if ($done == 0) { + $end{$2} = $1; + $maxtime = $1; + } + } + + if ($line =~ /([0-9\.]+)\] async_continuing @ ([0-9]+)/) { + my $pid = $2; + my $func = "wait_" . $pid . "_" . $pidctr{$pid}; + $end{$func} = $1; + $maxtime = $1; + } + if ($line =~ /Write protecting the/) { + $done = 1; + } + if ($line =~ /Freeing unused kernel memory/) { + $done = 1; + } +} + +if ($count == 0) { + print STDERR < \n"; +print "\n"; + + +if ($header) { + my $version = `uname -a`; + my $date = `date`; + print "Kernel version: $version\n"; + $cyheader = $yheader+$headerstep; + print "Date: $date\n"; +} + +my @styles; + +$styles[0] = "fill:rgb(0,0,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; +$styles[1] = "fill:rgb(0,255,0);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; +$styles[2] = "fill:rgb(255,0,20);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; +$styles[3] = "fill:rgb(255,255,20);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; +$styles[4] = "fill:rgb(255,0,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; +$styles[5] = "fill:rgb(0,255,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; +$styles[6] = "fill:rgb(0,128,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; +$styles[7] = "fill:rgb(0,255,128);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; +$styles[8] = "fill:rgb(255,0,128);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; +$styles[9] = "fill:rgb(255,255,128);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; +$styles[10] = "fill:rgb(255,128,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; +$styles[11] = "fill:rgb(128,255,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; + +my $style_wait = "fill:rgb(128,128,128);fill-opacity:0.5;stroke-width:0;stroke:rgb(0,0,0)"; + +my $mult = 1950.0 / ($maxtime - $firsttime); +my $threshold2 = ($maxtime - $firsttime) / 120.0; +my $threshold = $threshold2/10; +my $stylecounter = 0; +my %rows; +my $rowscount = 1; +my @initcalls = sort { $start{$a} <=> $start{$b} } keys(%start); + +foreach my $key (@initcalls) { + my $duration = $end{$key} - $start{$key}; + + if ($duration >= $threshold) { + my ($s, $s2, $s3, $e, $w, $y, $y2, $style); + my $pid = $pids{$key}; + + if (!defined($rows{$pid})) { + $rows{$pid} = $rowscount; + $rowscount = $rowscount + 1; + } + $s = ($start{$key} - $firsttime) * $mult; + $s2 = $s + 6; + $s3 = $s + 1; + $e = ($end{$key} - $firsttime) * $mult; + $w = $e - $s; + + $y = $rows{$pid} * 150; + $y2 = $y + 4; + + $style = $styles[$stylecounter]; + $stylecounter = $stylecounter + 1; + if ($stylecounter > 11) { + $stylecounter = 0; + }; + + if ($type{$key} == 1) { + $y = $y + 15; + print "\n"; + } else { + print "\n"; + if ($duration >= $threshold2) { + print "$key\n"; + } else { + print "$key\n"; + } + } + } +} + + +# print the time line on top +my $time = $firsttime; +my $step = ($maxtime - $firsttime) / 15; +while ($time < $maxtime) { + my $s3 = ($time - $firsttime) * $mult; + my $tm = int($time * 100) / 100.0; + print "$tm\n"; + $time = $time + $step; +} + +print "\n"; diff --git a/src/net/scripts/bpf_helpers_doc.py b/src/net/scripts/bpf_helpers_doc.py new file mode 100755 index 0000000..8b82974 --- /dev/null +++ b/src/net/scripts/bpf_helpers_doc.py @@ -0,0 +1,611 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2018-2019 Netronome Systems, Inc. + +# In case user attempts to run with Python 2. +from __future__ import print_function + +import argparse +import re +import sys, os + +class NoHelperFound(BaseException): + pass + +class ParsingError(BaseException): + def __init__(self, line='', reader=None): + if reader: + BaseException.__init__(self, + 'Error at file offset %d, parsing line: %s' % + (reader.tell(), line)) + else: + BaseException.__init__(self, 'Error parsing line: %s' % line) + +class Helper(object): + """ + An object representing the description of an eBPF helper function. + @proto: function prototype of the helper function + @desc: textual description of the helper function + @ret: description of the return value of the helper function + """ + def __init__(self, proto='', desc='', ret=''): + self.proto = proto + self.desc = desc + self.ret = ret + + def proto_break_down(self): + """ + Break down helper function protocol into smaller chunks: return type, + name, distincts arguments. + """ + arg_re = re.compile('((\w+ )*?(\w+|...))( (\**)(\w+))?$') + res = {} + proto_re = re.compile('(.+) (\**)(\w+)\(((([^,]+)(, )?){1,5})\)$') + + capture = proto_re.match(self.proto) + res['ret_type'] = capture.group(1) + res['ret_star'] = capture.group(2) + res['name'] = capture.group(3) + res['args'] = [] + + args = capture.group(4).split(', ') + for a in args: + capture = arg_re.match(a) + res['args'].append({ + 'type' : capture.group(1), + 'star' : capture.group(5), + 'name' : capture.group(6) + }) + + return res + +class HeaderParser(object): + """ + An object used to parse a file in order to extract the documentation of a + list of eBPF helper functions. All the helpers that can be retrieved are + stored as Helper object, in the self.helpers() array. + @filename: name of file to parse, usually include/uapi/linux/bpf.h in the + kernel tree + """ + def __init__(self, filename): + self.reader = open(filename, 'r') + self.line = '' + self.helpers = [] + + def parse_helper(self): + proto = self.parse_proto() + desc = self.parse_desc() + ret = self.parse_ret() + return Helper(proto=proto, desc=desc, ret=ret) + + def parse_proto(self): + # Argument can be of shape: + # - "void" + # - "type name" + # - "type *name" + # - Same as above, with "const" and/or "struct" in front of type + # - "..." (undefined number of arguments, for bpf_trace_printk()) + # There is at least one term ("void"), and at most five arguments. + p = re.compile(' \* ?((.+) \**\w+\((((const )?(struct )?(\w+|\.\.\.)( \**\w+)?)(, )?){1,5}\))$') + capture = p.match(self.line) + if not capture: + raise NoHelperFound + self.line = self.reader.readline() + return capture.group(1) + + def parse_desc(self): + p = re.compile(' \* ?(?:\t| {5,8})Description$') + capture = p.match(self.line) + if not capture: + # Helper can have empty description and we might be parsing another + # attribute: return but do not consume. + return '' + # Description can be several lines, some of them possibly empty, and it + # stops when another subsection title is met. + desc = '' + while True: + self.line = self.reader.readline() + if self.line == ' *\n': + desc += '\n' + else: + p = re.compile(' \* ?(?:\t| {5,8})(?:\t| {8})(.*)') + capture = p.match(self.line) + if capture: + desc += capture.group(1) + '\n' + else: + break + return desc + + def parse_ret(self): + p = re.compile(' \* ?(?:\t| {5,8})Return$') + capture = p.match(self.line) + if not capture: + # Helper can have empty retval and we might be parsing another + # attribute: return but do not consume. + return '' + # Return value description can be several lines, some of them possibly + # empty, and it stops when another subsection title is met. + ret = '' + while True: + self.line = self.reader.readline() + if self.line == ' *\n': + ret += '\n' + else: + p = re.compile(' \* ?(?:\t| {5,8})(?:\t| {8})(.*)') + capture = p.match(self.line) + if capture: + ret += capture.group(1) + '\n' + else: + break + return ret + + def run(self): + # Advance to start of helper function descriptions. + offset = self.reader.read().find('* Start of BPF helper function descriptions:') + if offset == -1: + raise Exception('Could not find start of eBPF helper descriptions list') + self.reader.seek(offset) + self.reader.readline() + self.reader.readline() + self.line = self.reader.readline() + + while True: + try: + helper = self.parse_helper() + self.helpers.append(helper) + except NoHelperFound: + break + + self.reader.close() + +############################################################################### + +class Printer(object): + """ + A generic class for printers. Printers should be created with an array of + Helper objects, and implement a way to print them in the desired fashion. + @helpers: array of Helper objects to print to standard output + """ + def __init__(self, helpers): + self.helpers = helpers + + def print_header(self): + pass + + def print_footer(self): + pass + + def print_one(self, helper): + pass + + def print_all(self): + self.print_header() + for helper in self.helpers: + self.print_one(helper) + self.print_footer() + +class PrinterRST(Printer): + """ + A printer for dumping collected information about helpers as a ReStructured + Text page compatible with the rst2man program, which can be used to + generate a manual page for the helpers. + @helpers: array of Helper objects to print to standard output + """ + def print_header(self): + header = '''\ +.. Copyright (C) All BPF authors and contributors from 2014 to present. +.. See git log include/uapi/linux/bpf.h in kernel tree for details. +.. +.. %%%LICENSE_START(VERBATIM) +.. Permission is granted to make and distribute verbatim copies of this +.. manual provided the copyright notice and this permission notice are +.. preserved on all copies. +.. +.. Permission is granted to copy and distribute modified versions of this +.. manual under the conditions for verbatim copying, provided that the +.. entire resulting derived work is distributed under the terms of a +.. permission notice identical to this one. +.. +.. Since the Linux kernel and libraries are constantly changing, this +.. manual page may be incorrect or out-of-date. The author(s) assume no +.. responsibility for errors or omissions, or for damages resulting from +.. the use of the information contained herein. The author(s) may not +.. have taken the same level of care in the production of this manual, +.. which is licensed free of charge, as they might when working +.. professionally. +.. +.. Formatted or processed versions of this manual, if unaccompanied by +.. the source, must acknowledge the copyright and authors of this work. +.. %%%LICENSE_END +.. +.. Please do not edit this file. It was generated from the documentation +.. located in file include/uapi/linux/bpf.h of the Linux kernel sources +.. (helpers description), and from scripts/bpf_helpers_doc.py in the same +.. repository (header and footer). + +=========== +BPF-HELPERS +=========== +------------------------------------------------------------------------------- +list of eBPF helper functions +------------------------------------------------------------------------------- + +:Manual section: 7 + +DESCRIPTION +=========== + +The extended Berkeley Packet Filter (eBPF) subsystem consists in programs +written in a pseudo-assembly language, then attached to one of the several +kernel hooks and run in reaction of specific events. This framework differs +from the older, "classic" BPF (or "cBPF") in several aspects, one of them being +the ability to call special functions (or "helpers") from within a program. +These functions are restricted to a white-list of helpers defined in the +kernel. + +These helpers are used by eBPF programs to interact with the system, or with +the context in which they work. For instance, they can be used to print +debugging messages, to get the time since the system was booted, to interact +with eBPF maps, or to manipulate network packets. Since there are several eBPF +program types, and that they do not run in the same context, each program type +can only call a subset of those helpers. + +Due to eBPF conventions, a helper can not have more than five arguments. + +Internally, eBPF programs call directly into the compiled helper functions +without requiring any foreign-function interface. As a result, calling helpers +introduces no overhead, thus offering excellent performance. + +This document is an attempt to list and document the helpers available to eBPF +developers. They are sorted by chronological order (the oldest helpers in the +kernel at the top). + +HELPERS +======= +''' + print(header) + + def print_footer(self): + footer = ''' +EXAMPLES +======== + +Example usage for most of the eBPF helpers listed in this manual page are +available within the Linux kernel sources, at the following locations: + +* *samples/bpf/* +* *tools/testing/selftests/bpf/* + +LICENSE +======= + +eBPF programs can have an associated license, passed along with the bytecode +instructions to the kernel when the programs are loaded. The format for that +string is identical to the one in use for kernel modules (Dual licenses, such +as "Dual BSD/GPL", may be used). Some helper functions are only accessible to +programs that are compatible with the GNU Privacy License (GPL). + +In order to use such helpers, the eBPF program must be loaded with the correct +license string passed (via **attr**) to the **bpf**\ () system call, and this +generally translates into the C source code of the program containing a line +similar to the following: + +:: + + char ____license[] __attribute__((section("license"), used)) = "GPL"; + +IMPLEMENTATION +============== + +This manual page is an effort to document the existing eBPF helper functions. +But as of this writing, the BPF sub-system is under heavy development. New eBPF +program or map types are added, along with new helper functions. Some helpers +are occasionally made available for additional program types. So in spite of +the efforts of the community, this page might not be up-to-date. If you want to +check by yourself what helper functions exist in your kernel, or what types of +programs they can support, here are some files among the kernel tree that you +may be interested in: + +* *include/uapi/linux/bpf.h* is the main BPF header. It contains the full list + of all helper functions, as well as many other BPF definitions including most + of the flags, structs or constants used by the helpers. +* *net/core/filter.c* contains the definition of most network-related helper + functions, and the list of program types from which they can be used. +* *kernel/trace/bpf_trace.c* is the equivalent for most tracing program-related + helpers. +* *kernel/bpf/verifier.c* contains the functions used to check that valid types + of eBPF maps are used with a given helper function. +* *kernel/bpf/* directory contains other files in which additional helpers are + defined (for cgroups, sockmaps, etc.). +* The bpftool utility can be used to probe the availability of helper functions + on the system (as well as supported program and map types, and a number of + other parameters). To do so, run **bpftool feature probe** (see + **bpftool-feature**\ (8) for details). Add the **unprivileged** keyword to + list features available to unprivileged users. + +Compatibility between helper functions and program types can generally be found +in the files where helper functions are defined. Look for the **struct +bpf_func_proto** objects and for functions returning them: these functions +contain a list of helpers that a given program type can call. Note that the +**default:** label of the **switch ... case** used to filter helpers can call +other functions, themselves allowing access to additional helpers. The +requirement for GPL license is also in those **struct bpf_func_proto**. + +Compatibility between helper functions and map types can be found in the +**check_map_func_compatibility**\ () function in file *kernel/bpf/verifier.c*. + +Helper functions that invalidate the checks on **data** and **data_end** +pointers for network processing are listed in function +**bpf_helper_changes_pkt_data**\ () in file *net/core/filter.c*. + +SEE ALSO +======== + +**bpf**\ (2), +**bpftool**\ (8), +**cgroups**\ (7), +**ip**\ (8), +**perf_event_open**\ (2), +**sendmsg**\ (2), +**socket**\ (7), +**tc-bpf**\ (8)''' + print(footer) + + def print_proto(self, helper): + """ + Format function protocol with bold and italics markers. This makes RST + file less readable, but gives nice results in the manual page. + """ + proto = helper.proto_break_down() + + print('**%s %s%s(' % (proto['ret_type'], + proto['ret_star'].replace('*', '\\*'), + proto['name']), + end='') + + comma = '' + for a in proto['args']: + one_arg = '{}{}'.format(comma, a['type']) + if a['name']: + if a['star']: + one_arg += ' {}**\ '.format(a['star'].replace('*', '\\*')) + else: + one_arg += '** ' + one_arg += '*{}*\\ **'.format(a['name']) + comma = ', ' + print(one_arg, end='') + + print(')**') + + def print_one(self, helper): + self.print_proto(helper) + + if (helper.desc): + print('\tDescription') + # Do not strip all newline characters: formatted code at the end of + # a section must be followed by a blank line. + for line in re.sub('\n$', '', helper.desc, count=1).split('\n'): + print('{}{}'.format('\t\t' if line else '', line)) + + if (helper.ret): + print('\tReturn') + for line in helper.ret.rstrip().split('\n'): + print('{}{}'.format('\t\t' if line else '', line)) + + print('') + +class PrinterHelpers(Printer): + """ + A printer for dumping collected information about helpers as C header to + be included from BPF program. + @helpers: array of Helper objects to print to standard output + """ + + type_fwds = [ + 'struct bpf_fib_lookup', + 'struct bpf_sk_lookup', + 'struct bpf_perf_event_data', + 'struct bpf_perf_event_value', + 'struct bpf_pidns_info', + 'struct bpf_redir_neigh', + 'struct bpf_sock', + 'struct bpf_sock_addr', + 'struct bpf_sock_ops', + 'struct bpf_sock_tuple', + 'struct bpf_spin_lock', + 'struct bpf_sysctl', + 'struct bpf_tcp_sock', + 'struct bpf_tunnel_key', + 'struct bpf_xfrm_state', + 'struct linux_binprm', + 'struct pt_regs', + 'struct sk_reuseport_md', + 'struct sockaddr', + 'struct tcphdr', + 'struct seq_file', + 'struct tcp6_sock', + 'struct tcp_sock', + 'struct tcp_timewait_sock', + 'struct tcp_request_sock', + 'struct udp6_sock', + 'struct task_struct', + + 'struct __sk_buff', + 'struct sk_msg_md', + 'struct xdp_md', + 'struct path', + 'struct btf_ptr', + 'struct inode', + ] + known_types = { + '...', + 'void', + 'const void', + 'char', + 'const char', + 'int', + 'long', + 'unsigned long', + + '__be16', + '__be32', + '__wsum', + + 'struct bpf_fib_lookup', + 'struct bpf_perf_event_data', + 'struct bpf_perf_event_value', + 'struct bpf_pidns_info', + 'struct bpf_redir_neigh', + 'struct bpf_sk_lookup', + 'struct bpf_sock', + 'struct bpf_sock_addr', + 'struct bpf_sock_ops', + 'struct bpf_sock_tuple', + 'struct bpf_spin_lock', + 'struct bpf_sysctl', + 'struct bpf_tcp_sock', + 'struct bpf_tunnel_key', + 'struct bpf_xfrm_state', + 'struct linux_binprm', + 'struct pt_regs', + 'struct sk_reuseport_md', + 'struct sockaddr', + 'struct tcphdr', + 'struct seq_file', + 'struct tcp6_sock', + 'struct tcp_sock', + 'struct tcp_timewait_sock', + 'struct tcp_request_sock', + 'struct udp6_sock', + 'struct task_struct', + 'struct path', + 'struct btf_ptr', + 'struct inode', + } + mapped_types = { + 'u8': '__u8', + 'u16': '__u16', + 'u32': '__u32', + 'u64': '__u64', + 's8': '__s8', + 's16': '__s16', + 's32': '__s32', + 's64': '__s64', + 'size_t': 'unsigned long', + 'struct bpf_map': 'void', + 'struct sk_buff': 'struct __sk_buff', + 'const struct sk_buff': 'const struct __sk_buff', + 'struct sk_msg_buff': 'struct sk_msg_md', + 'struct xdp_buff': 'struct xdp_md', + } + # Helpers overloaded for different context types. + overloaded_helpers = [ + 'bpf_get_socket_cookie', + 'bpf_sk_assign', + ] + + def print_header(self): + header = '''\ +/* This is auto-generated file. See bpf_helpers_doc.py for details. */ + +/* Forward declarations of BPF structs */''' + + print(header) + for fwd in self.type_fwds: + print('%s;' % fwd) + print('') + + def print_footer(self): + footer = '' + print(footer) + + def map_type(self, t): + if t in self.known_types: + return t + if t in self.mapped_types: + return self.mapped_types[t] + print("Unrecognized type '%s', please add it to known types!" % t, + file=sys.stderr) + sys.exit(1) + + seen_helpers = set() + + def print_one(self, helper): + proto = helper.proto_break_down() + + if proto['name'] in self.seen_helpers: + return + self.seen_helpers.add(proto['name']) + + print('/*') + print(" * %s" % proto['name']) + print(" *") + if (helper.desc): + # Do not strip all newline characters: formatted code at the end of + # a section must be followed by a blank line. + for line in re.sub('\n$', '', helper.desc, count=1).split('\n'): + print(' *{}{}'.format(' \t' if line else '', line)) + + if (helper.ret): + print(' *') + print(' * Returns') + for line in helper.ret.rstrip().split('\n'): + print(' *{}{}'.format(' \t' if line else '', line)) + + print(' */') + print('static %s %s(*%s)(' % (self.map_type(proto['ret_type']), + proto['ret_star'], proto['name']), end='') + comma = '' + for i, a in enumerate(proto['args']): + t = a['type'] + n = a['name'] + if proto['name'] in self.overloaded_helpers and i == 0: + t = 'void' + n = 'ctx' + one_arg = '{}{}'.format(comma, self.map_type(t)) + if n: + if a['star']: + one_arg += ' {}'.format(a['star']) + else: + one_arg += ' ' + one_arg += '{}'.format(n) + comma = ', ' + print(one_arg, end='') + + print(') = (void *) %d;' % len(self.seen_helpers)) + print('') + +############################################################################### + +# If script is launched from scripts/ from kernel tree and can access +# ../include/uapi/linux/bpf.h, use it as a default name for the file to parse, +# otherwise the --filename argument will be required from the command line. +script = os.path.abspath(sys.argv[0]) +linuxRoot = os.path.dirname(os.path.dirname(script)) +bpfh = os.path.join(linuxRoot, 'include/uapi/linux/bpf.h') + +argParser = argparse.ArgumentParser(description=""" +Parse eBPF header file and generate documentation for eBPF helper functions. +The RST-formatted output produced can be turned into a manual page with the +rst2man utility. +""") +argParser.add_argument('--header', action='store_true', + help='generate C header file') +if (os.path.isfile(bpfh)): + argParser.add_argument('--filename', help='path to include/uapi/linux/bpf.h', + default=bpfh) +else: + argParser.add_argument('--filename', help='path to include/uapi/linux/bpf.h') +args = argParser.parse_args() + +# Parse file. +headerParser = HeaderParser(args.filename) +headerParser.run() + +# Print formatted output to standard output. +if args.header: + printer = PrinterHelpers(headerParser.helpers) +else: + printer = PrinterRST(headerParser.helpers) +printer.print_all() diff --git a/src/net/scripts/cc-can-link.sh b/src/net/scripts/cc-can-link.sh new file mode 100755 index 0000000..6efcead --- /dev/null +++ b/src/net/scripts/cc-can-link.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 + +cat << "END" | $@ -x c - -o /dev/null >/dev/null 2>&1 +#include +int main(void) +{ + printf(""); + return 0; +} +END diff --git a/src/net/scripts/check-sysctl-docs b/src/net/scripts/check-sysctl-docs new file mode 100755 index 0000000..8bcb9e2 --- /dev/null +++ b/src/net/scripts/check-sysctl-docs @@ -0,0 +1,181 @@ +#!/usr/bin/gawk -f +# SPDX-License-Identifier: GPL-2.0 + +# Script to check sysctl documentation against source files +# +# Copyright (c) 2020 Stephen Kitt + +# Example invocation: +# scripts/check-sysctl-docs -vtable="kernel" \ +# Documentation/admin-guide/sysctl/kernel.rst \ +# $(git grep -l register_sysctl_) +# +# Specify -vdebug=1 to see debugging information + +BEGIN { + if (!table) { + print "Please specify the table to look for using the table variable" > "/dev/stderr" + exit 1 + } +} + +# The following globals are used: +# children: maps ctl_table names and procnames to child ctl_table names +# documented: maps documented entries (each key is an entry) +# entries: maps ctl_table names and procnames to counts (so +# enumerating the subkeys for a given ctl_table lists its +# procnames) +# files: maps procnames to source file names +# paths: maps ctl_path names to paths +# curpath: the name of the current ctl_path struct +# curtable: the name of the current ctl_table struct +# curentry: the name of the current proc entry (procname when parsing +# a ctl_table, constructed path when parsing a ctl_path) + + +# Remove punctuation from the given value +function trimpunct(value) { + while (value ~ /^["&]/) { + value = substr(value, 2) + } + while (value ~ /[]["&,}]$/) { + value = substr(value, 1, length(value) - 1) + } + return value +} + +# Print the information for the given entry +function printentry(entry) { + seen[entry]++ + printf "* %s from %s", entry, file[entry] + if (documented[entry]) { + printf " (documented)" + } + print "" +} + + +# Stage 1: build the list of documented entries +FNR == NR && /^=+$/ { + if (prevline ~ /Documentation for/) { + # This is the main title + next + } + + # The previous line is a section title, parse it + $0 = prevline + if (debug) print "Parsing " $0 + inbrackets = 0 + for (i = 1; i <= NF; i++) { + if (length($i) == 0) { + continue + } + if (!inbrackets && substr($i, 1, 1) == "(") { + inbrackets = 1 + } + if (!inbrackets) { + token = trimpunct($i) + if (length(token) > 0 && token != "and") { + if (debug) print trimpunct($i) + documented[trimpunct($i)]++ + } + } + if (inbrackets && substr($i, length($i), 1) == ")") { + inbrackets = 0 + } + } +} + +FNR == NR { + prevline = $0 + next +} + + +# Stage 2: process each file and find all sysctl tables +BEGINFILE { + delete children + delete entries + delete paths + curpath = "" + curtable = "" + curentry = "" + if (debug) print "Processing file " FILENAME +} + +/^static struct ctl_path/ { + match($0, /static struct ctl_path ([^][]+)/, tables) + curpath = tables[1] + if (debug) print "Processing path " curpath +} + +/^static struct ctl_table/ { + match($0, /static struct ctl_table ([^][]+)/, tables) + curtable = tables[1] + if (debug) print "Processing table " curtable +} + +/^};$/ { + curpath = "" + curtable = "" + curentry = "" +} + +curpath && /\.procname[\t ]*=[\t ]*".+"/ { + match($0, /.procname[\t ]*=[\t ]*"([^"]+)"/, names) + if (curentry) { + curentry = curentry "/" names[1] + } else { + curentry = names[1] + } + if (debug) print "Setting path " curpath " to " curentry + paths[curpath] = curentry +} + +curtable && /\.procname[\t ]*=[\t ]*".+"/ { + match($0, /.procname[\t ]*=[\t ]*"([^"]+)"/, names) + curentry = names[1] + if (debug) print "Adding entry " curentry " to table " curtable + entries[curtable][curentry]++ + file[curentry] = FILENAME +} + +/\.child[\t ]*=/ { + child = trimpunct($NF) + if (debug) print "Linking child " child " to table " curtable " entry " curentry + children[curtable][curentry] = child +} + +/register_sysctl_table\(.*\)/ { + match($0, /register_sysctl_table\(([^)]+)\)/, tables) + if (debug) print "Registering table " tables[1] + if (children[tables[1]][table]) { + for (entry in entries[children[tables[1]][table]]) { + printentry(entry) + } + } +} + +/register_sysctl_paths\(.*\)/ { + match($0, /register_sysctl_paths\(([^)]+), ([^)]+)\)/, tables) + if (debug) print "Attaching table " tables[2] " to path " tables[1] + if (paths[tables[1]] == table) { + for (entry in entries[tables[2]]) { + printentry(entry) + } + } + split(paths[tables[1]], components, "/") + if (length(components) > 1 && components[1] == table) { + # Count the first subdirectory as seen + seen[components[2]]++ + } +} + + +END { + for (entry in documented) { + if (!seen[entry]) { + print "No implementation for " entry + } + } +} diff --git a/src/net/scripts/check_extable.sh b/src/net/scripts/check_extable.sh new file mode 100755 index 0000000..93af93c --- /dev/null +++ b/src/net/scripts/check_extable.sh @@ -0,0 +1,147 @@ +#! /bin/bash +# SPDX-License-Identifier: GPL-2.0 +# (c) 2015, Quentin Casasnovas + +obj=$1 + +file ${obj} | grep -q ELF || (echo "${obj} is not and ELF file." 1>&2 ; exit 0) + +# Bail out early if there isn't an __ex_table section in this object file. +objdump -hj __ex_table ${obj} 2> /dev/null > /dev/null +[ $? -ne 0 ] && exit 0 + +white_list=.text,.fixup + +suspicious_relocs=$(objdump -rj __ex_table ${obj} | tail -n +6 | + grep -v $(eval echo -e{${white_list}}) | awk '{print $3}') + +# No suspicious relocs in __ex_table, jobs a good'un +[ -z "${suspicious_relocs}" ] && exit 0 + + +# After this point, something is seriously wrong since we just found out we +# have some relocations in __ex_table which point to sections which aren't +# white listed. If you're adding a new section in the Linux kernel, and +# you're expecting this section to contain code which can fault (i.e. the +# __ex_table relocation to your new section is expected), simply add your +# new section to the white_list variable above. If not, you're probably +# doing something wrong and the rest of this code is just trying to print +# you more information about it. + +function find_section_offset_from_symbol() +{ + eval $(objdump -t ${obj} | grep ${1} | sed 's/\([0-9a-f]\+\) .\{7\} \([^ \t]\+\).*/section="\2"; section_offset="0x\1" /') + + # addr2line takes addresses in hexadecimal... + section_offset=$(printf "0x%016x" $(( ${section_offset} + $2 )) ) +} + +function find_symbol_and_offset_from_reloc() +{ + # Extract symbol and offset from the objdump output + eval $(echo $reloc | sed 's/\([^+]\+\)+\?\(0x[0-9a-f]\+\)\?/symbol="\1"; symbol_offset="\2"/') + + # When the relocation points to the begining of a symbol or section, it + # won't print the offset since it is zero. + if [ -z "${symbol_offset}" ]; then + symbol_offset=0x0 + fi +} + +function find_alt_replacement_target() +{ + # The target of the .altinstr_replacement is the relocation just before + # the .altinstr_replacement one. + eval $(objdump -rj .altinstructions ${obj} | grep -B1 "${section}+${section_offset}" | head -n1 | awk '{print $3}' | + sed 's/\([^+]\+\)+\(0x[0-9a-f]\+\)/alt_target_section="\1"; alt_target_offset="\2"/') +} + +function handle_alt_replacement_reloc() +{ + # This will define alt_target_section and alt_target_section_offset + find_alt_replacement_target ${section} ${section_offset} + + echo "Error: found a reference to .altinstr_replacement in __ex_table:" + addr2line -fip -j ${alt_target_section} -e ${obj} ${alt_target_offset} | awk '{print "\t" $0}' + + error=true +} + +function is_executable_section() +{ + objdump -hwj ${section} ${obj} | grep -q CODE + return $? +} + +function handle_suspicious_generic_reloc() +{ + if is_executable_section ${section}; then + # We've got a relocation to a non white listed _executable_ + # section, print a warning so the developper adds the section to + # the white list or fix his code. We try to pretty-print the file + # and line number where that relocation was added. + echo "Warning: found a reference to section \"${section}\" in __ex_table:" + addr2line -fip -j ${section} -e ${obj} ${section_offset} | awk '{print "\t" $0}' + else + # Something is definitively wrong here since we've got a relocation + # to a non-executable section, there's no way this would ever be + # running in the kernel. + echo "Error: found a reference to non-executable section \"${section}\" in __ex_table at offset ${section_offset}" + error=true + fi +} + +function handle_suspicious_reloc() +{ + case "${section}" in + ".altinstr_replacement") + handle_alt_replacement_reloc ${section} ${section_offset} + ;; + *) + handle_suspicious_generic_reloc ${section} ${section_offset} + ;; + esac +} + +function diagnose() +{ + + for reloc in ${suspicious_relocs}; do + # Let's find out where the target of the relocation in __ex_table + # is, this will define ${symbol} and ${symbol_offset} + find_symbol_and_offset_from_reloc ${reloc} + + # When there's a global symbol at the place of the relocation, + # objdump will use it instead of giving us a section+offset, so + # let's find out which section is this symbol in and the total + # offset withing that section. + find_section_offset_from_symbol ${symbol} ${symbol_offset} + + # In this case objdump was presenting us with a reloc to a symbol + # rather than a section. Now that we've got the actual section, + # we can skip it if it's in the white_list. + if [ -z "$( echo $section | grep -v $(eval echo -e{${white_list}}))" ]; then + continue; + fi + + # Will either print a warning if the relocation happens to be in a + # section we do not know but has executable bit set, or error out. + handle_suspicious_reloc + done +} + +function check_debug_info() { + objdump -hj .debug_info ${obj} 2> /dev/null > /dev/null || + echo -e "${obj} does not contain debug information, the addr2line output will be limited.\n" \ + "Recompile ${obj} with CONFIG_DEBUG_INFO to get a more useful output." +} + +check_debug_info + +diagnose + +if [ "${error}" ]; then + exit 1 +fi + +exit 0 diff --git a/src/net/scripts/checkincludes.pl b/src/net/scripts/checkincludes.pl new file mode 100755 index 0000000..b514a95 --- /dev/null +++ b/src/net/scripts/checkincludes.pl @@ -0,0 +1,98 @@ +#!/usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0 +# +# checkincludes: find/remove files included more than once +# +# Copyright abandoned, 2000, Niels Kristian Bech Jensen . +# Copyright 2009 Luis R. Rodriguez +# +# This script checks for duplicate includes. It also has support +# to remove them in place. Note that this will not take into +# consideration macros so you should run this only if you know +# you do have real dups and do not have them under #ifdef's. You +# could also just review the results. + +use strict; + +sub usage { + print "Usage: checkincludes.pl [-r]\n"; + print "By default we just warn of duplicates\n"; + print "To remove duplicated includes in place use -r\n"; + exit 1; +} + +my $remove = 0; + +if ($#ARGV < 0) { + usage(); +} + +if ($#ARGV >= 1) { + if ($ARGV[0] =~ /^-/) { + if ($ARGV[0] eq "-r") { + $remove = 1; + shift; + } else { + usage(); + } + } +} + +my $dup_counter = 0; + +foreach my $file (@ARGV) { + open(my $f, '<', $file) + or die "Cannot open $file: $!.\n"; + + my %includedfiles = (); + my @file_lines = (); + + while (<$f>) { + if (m/^\s*#\s*include\s*[<"](\S*)[>"]/o) { + ++$includedfiles{$1}; + } + push(@file_lines, $_); + } + + close($f); + + if (!$remove) { + foreach my $filename (keys %includedfiles) { + if ($includedfiles{$filename} > 1) { + print "$file: $filename is included more than once.\n"; + ++$dup_counter; + } + } + next; + } + + open($f, '>', $file) + or die("Cannot write to $file: $!"); + + my $dups = 0; + foreach (@file_lines) { + if (m/^\s*#\s*include\s*[<"](\S*)[>"]/o) { + foreach my $filename (keys %includedfiles) { + if ($1 eq $filename) { + if ($includedfiles{$filename} > 1) { + $includedfiles{$filename}--; + $dups++; + ++$dup_counter; + } else { + print {$f} $_; + } + } + } + } else { + print {$f} $_; + } + } + if ($dups > 0) { + print "$file: removed $dups duplicate includes\n"; + } + close($f); +} + +if ($dup_counter == 0) { + print "No duplicate includes found.\n"; +} diff --git a/src/net/scripts/checkkconfigsymbols.py b/src/net/scripts/checkkconfigsymbols.py new file mode 100755 index 0000000..1548f9c --- /dev/null +++ b/src/net/scripts/checkkconfigsymbols.py @@ -0,0 +1,476 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0-only + +"""Find Kconfig symbols that are referenced but not defined.""" + +# (c) 2014-2017 Valentin Rothberg +# (c) 2014 Stefan Hengelein +# + + +import argparse +import difflib +import os +import re +import signal +import subprocess +import sys +from multiprocessing import Pool, cpu_count + + +# regex expressions +OPERATORS = r"&|\(|\)|\||\!" +SYMBOL = r"(?:\w*[A-Z0-9]\w*){2,}" +DEF = r"^\s*(?:menu){,1}config\s+(" + SYMBOL + r")\s*" +EXPR = r"(?:" + OPERATORS + r"|\s|" + SYMBOL + r")+" +DEFAULT = r"default\s+.*?(?:if\s.+){,1}" +STMT = r"^\s*(?:if|select|imply|depends\s+on|(?:" + DEFAULT + r"))\s+" + EXPR +SOURCE_SYMBOL = r"(?:\W|\b)+[D]{,1}CONFIG_(" + SYMBOL + r")" + +# regex objects +REGEX_FILE_KCONFIG = re.compile(r".*Kconfig[\.\w+\-]*$") +REGEX_SYMBOL = re.compile(r'(?!\B)' + SYMBOL + r'(?!\B)') +REGEX_SOURCE_SYMBOL = re.compile(SOURCE_SYMBOL) +REGEX_KCONFIG_DEF = re.compile(DEF) +REGEX_KCONFIG_EXPR = re.compile(EXPR) +REGEX_KCONFIG_STMT = re.compile(STMT) +REGEX_KCONFIG_HELP = re.compile(r"^\s+help\s*$") +REGEX_FILTER_SYMBOLS = re.compile(r"[A-Za-z0-9]$") +REGEX_NUMERIC = re.compile(r"0[xX][0-9a-fA-F]+|[0-9]+") +REGEX_QUOTES = re.compile("(\"(.*?)\")") + + +def parse_options(): + """The user interface of this module.""" + usage = "Run this tool to detect Kconfig symbols that are referenced but " \ + "not defined in Kconfig. If no option is specified, " \ + "checkkconfigsymbols defaults to check your current tree. " \ + "Please note that specifying commits will 'git reset --hard\' " \ + "your current tree! You may save uncommitted changes to avoid " \ + "losing data." + + parser = argparse.ArgumentParser(description=usage) + + parser.add_argument('-c', '--commit', dest='commit', action='store', + default="", + help="check if the specified commit (hash) introduces " + "undefined Kconfig symbols") + + parser.add_argument('-d', '--diff', dest='diff', action='store', + default="", + help="diff undefined symbols between two commits " + "(e.g., -d commmit1..commit2)") + + parser.add_argument('-f', '--find', dest='find', action='store_true', + default=False, + help="find and show commits that may cause symbols to be " + "missing (required to run with --diff)") + + parser.add_argument('-i', '--ignore', dest='ignore', action='store', + default="", + help="ignore files matching this Python regex " + "(e.g., -i '.*defconfig')") + + parser.add_argument('-s', '--sim', dest='sim', action='store', default="", + help="print a list of max. 10 string-similar symbols") + + parser.add_argument('--force', dest='force', action='store_true', + default=False, + help="reset current Git tree even when it's dirty") + + parser.add_argument('--no-color', dest='color', action='store_false', + default=True, + help="don't print colored output (default when not " + "outputting to a terminal)") + + args = parser.parse_args() + + if args.commit and args.diff: + sys.exit("Please specify only one option at once.") + + if args.diff and not re.match(r"^[\w\-\.\^]+\.\.[\w\-\.\^]+$", args.diff): + sys.exit("Please specify valid input in the following format: " + "\'commit1..commit2\'") + + if args.commit or args.diff: + if not args.force and tree_is_dirty(): + sys.exit("The current Git tree is dirty (see 'git status'). " + "Running this script may\ndelete important data since it " + "calls 'git reset --hard' for some performance\nreasons. " + " Please run this script in a clean Git tree or pass " + "'--force' if you\nwant to ignore this warning and " + "continue.") + + if args.commit: + args.find = False + + if args.ignore: + try: + re.match(args.ignore, "this/is/just/a/test.c") + except: + sys.exit("Please specify a valid Python regex.") + + return args + + +def main(): + """Main function of this module.""" + args = parse_options() + + global COLOR + COLOR = args.color and sys.stdout.isatty() + + if args.sim and not args.commit and not args.diff: + sims = find_sims(args.sim, args.ignore) + if sims: + print("%s: %s" % (yel("Similar symbols"), ', '.join(sims))) + else: + print("%s: no similar symbols found" % yel("Similar symbols")) + sys.exit(0) + + # dictionary of (un)defined symbols + defined = {} + undefined = {} + + if args.commit or args.diff: + head = get_head() + + # get commit range + commit_a = None + commit_b = None + if args.commit: + commit_a = args.commit + "~" + commit_b = args.commit + elif args.diff: + split = args.diff.split("..") + commit_a = split[0] + commit_b = split[1] + undefined_a = {} + undefined_b = {} + + # get undefined items before the commit + reset(commit_a) + undefined_a, _ = check_symbols(args.ignore) + + # get undefined items for the commit + reset(commit_b) + undefined_b, defined = check_symbols(args.ignore) + + # report cases that are present for the commit but not before + for symbol in sorted(undefined_b): + # symbol has not been undefined before + if symbol not in undefined_a: + files = sorted(undefined_b.get(symbol)) + undefined[symbol] = files + # check if there are new files that reference the undefined symbol + else: + files = sorted(undefined_b.get(symbol) - + undefined_a.get(symbol)) + if files: + undefined[symbol] = files + + # reset to head + reset(head) + + # default to check the entire tree + else: + undefined, defined = check_symbols(args.ignore) + + # now print the output + for symbol in sorted(undefined): + print(red(symbol)) + + files = sorted(undefined.get(symbol)) + print("%s: %s" % (yel("Referencing files"), ", ".join(files))) + + sims = find_sims(symbol, args.ignore, defined) + sims_out = yel("Similar symbols") + if sims: + print("%s: %s" % (sims_out, ', '.join(sims))) + else: + print("%s: %s" % (sims_out, "no similar symbols found")) + + if args.find: + print("%s:" % yel("Commits changing symbol")) + commits = find_commits(symbol, args.diff) + if commits: + for commit in commits: + commit = commit.split(" ", 1) + print("\t- %s (\"%s\")" % (yel(commit[0]), commit[1])) + else: + print("\t- no commit found") + print() # new line + + +def reset(commit): + """Reset current git tree to %commit.""" + execute(["git", "reset", "--hard", commit]) + + +def yel(string): + """ + Color %string yellow. + """ + return "\033[33m%s\033[0m" % string if COLOR else string + + +def red(string): + """ + Color %string red. + """ + return "\033[31m%s\033[0m" % string if COLOR else string + + +def execute(cmd): + """Execute %cmd and return stdout. Exit in case of error.""" + try: + stdout = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=False) + stdout = stdout.decode(errors='replace') + except subprocess.CalledProcessError as fail: + exit(fail) + return stdout + + +def find_commits(symbol, diff): + """Find commits changing %symbol in the given range of %diff.""" + commits = execute(["git", "log", "--pretty=oneline", + "--abbrev-commit", "-G", + symbol, diff]) + return [x for x in commits.split("\n") if x] + + +def tree_is_dirty(): + """Return true if the current working tree is dirty (i.e., if any file has + been added, deleted, modified, renamed or copied but not committed).""" + stdout = execute(["git", "status", "--porcelain"]) + for line in stdout: + if re.findall(r"[URMADC]{1}", line[:2]): + return True + return False + + +def get_head(): + """Return commit hash of current HEAD.""" + stdout = execute(["git", "rev-parse", "HEAD"]) + return stdout.strip('\n') + + +def partition(lst, size): + """Partition list @lst into eveni-sized lists of size @size.""" + return [lst[i::size] for i in range(size)] + + +def init_worker(): + """Set signal handler to ignore SIGINT.""" + signal.signal(signal.SIGINT, signal.SIG_IGN) + + +def find_sims(symbol, ignore, defined=[]): + """Return a list of max. ten Kconfig symbols that are string-similar to + @symbol.""" + if defined: + return difflib.get_close_matches(symbol, set(defined), 10) + + pool = Pool(cpu_count(), init_worker) + kfiles = [] + for gitfile in get_files(): + if REGEX_FILE_KCONFIG.match(gitfile): + kfiles.append(gitfile) + + arglist = [] + for part in partition(kfiles, cpu_count()): + arglist.append((part, ignore)) + + for res in pool.map(parse_kconfig_files, arglist): + defined.extend(res[0]) + + return difflib.get_close_matches(symbol, set(defined), 10) + + +def get_files(): + """Return a list of all files in the current git directory.""" + # use 'git ls-files' to get the worklist + stdout = execute(["git", "ls-files"]) + if len(stdout) > 0 and stdout[-1] == "\n": + stdout = stdout[:-1] + + files = [] + for gitfile in stdout.rsplit("\n"): + if ".git" in gitfile or "ChangeLog" in gitfile or \ + ".log" in gitfile or os.path.isdir(gitfile) or \ + gitfile.startswith("tools/"): + continue + files.append(gitfile) + return files + + +def check_symbols(ignore): + """Find undefined Kconfig symbols and return a dict with the symbol as key + and a list of referencing files as value. Files matching %ignore are not + checked for undefined symbols.""" + pool = Pool(cpu_count(), init_worker) + try: + return check_symbols_helper(pool, ignore) + except KeyboardInterrupt: + pool.terminate() + pool.join() + sys.exit(1) + + +def check_symbols_helper(pool, ignore): + """Helper method for check_symbols(). Used to catch keyboard interrupts in + check_symbols() in order to properly terminate running worker processes.""" + source_files = [] + kconfig_files = [] + defined_symbols = [] + referenced_symbols = dict() # {file: [symbols]} + + for gitfile in get_files(): + if REGEX_FILE_KCONFIG.match(gitfile): + kconfig_files.append(gitfile) + else: + if ignore and not re.match(ignore, gitfile): + continue + # add source files that do not match the ignore pattern + source_files.append(gitfile) + + # parse source files + arglist = partition(source_files, cpu_count()) + for res in pool.map(parse_source_files, arglist): + referenced_symbols.update(res) + + # parse kconfig files + arglist = [] + for part in partition(kconfig_files, cpu_count()): + arglist.append((part, ignore)) + for res in pool.map(parse_kconfig_files, arglist): + defined_symbols.extend(res[0]) + referenced_symbols.update(res[1]) + defined_symbols = set(defined_symbols) + + # inverse mapping of referenced_symbols to dict(symbol: [files]) + inv_map = dict() + for _file, symbols in referenced_symbols.items(): + for symbol in symbols: + inv_map[symbol] = inv_map.get(symbol, set()) + inv_map[symbol].add(_file) + referenced_symbols = inv_map + + undefined = {} # {symbol: [files]} + for symbol in sorted(referenced_symbols): + # filter some false positives + if symbol == "FOO" or symbol == "BAR" or \ + symbol == "FOO_BAR" or symbol == "XXX": + continue + if symbol not in defined_symbols: + if symbol.endswith("_MODULE"): + # avoid false positives for kernel modules + if symbol[:-len("_MODULE")] in defined_symbols: + continue + undefined[symbol] = referenced_symbols.get(symbol) + return undefined, defined_symbols + + +def parse_source_files(source_files): + """Parse each source file in @source_files and return dictionary with source + files as keys and lists of references Kconfig symbols as values.""" + referenced_symbols = dict() + for sfile in source_files: + referenced_symbols[sfile] = parse_source_file(sfile) + return referenced_symbols + + +def parse_source_file(sfile): + """Parse @sfile and return a list of referenced Kconfig symbols.""" + lines = [] + references = [] + + if not os.path.exists(sfile): + return references + + with open(sfile, "r", encoding='utf-8', errors='replace') as stream: + lines = stream.readlines() + + for line in lines: + if "CONFIG_" not in line: + continue + symbols = REGEX_SOURCE_SYMBOL.findall(line) + for symbol in symbols: + if not REGEX_FILTER_SYMBOLS.search(symbol): + continue + references.append(symbol) + + return references + + +def get_symbols_in_line(line): + """Return mentioned Kconfig symbols in @line.""" + return REGEX_SYMBOL.findall(line) + + +def parse_kconfig_files(args): + """Parse kconfig files and return tuple of defined and references Kconfig + symbols. Note, @args is a tuple of a list of files and the @ignore + pattern.""" + kconfig_files = args[0] + ignore = args[1] + defined_symbols = [] + referenced_symbols = dict() + + for kfile in kconfig_files: + defined, references = parse_kconfig_file(kfile) + defined_symbols.extend(defined) + if ignore and re.match(ignore, kfile): + # do not collect references for files that match the ignore pattern + continue + referenced_symbols[kfile] = references + return (defined_symbols, referenced_symbols) + + +def parse_kconfig_file(kfile): + """Parse @kfile and update symbol definitions and references.""" + lines = [] + defined = [] + references = [] + skip = False + + if not os.path.exists(kfile): + return defined, references + + with open(kfile, "r", encoding='utf-8', errors='replace') as stream: + lines = stream.readlines() + + for i in range(len(lines)): + line = lines[i] + line = line.strip('\n') + line = line.split("#")[0] # ignore comments + + if REGEX_KCONFIG_DEF.match(line): + symbol_def = REGEX_KCONFIG_DEF.findall(line) + defined.append(symbol_def[0]) + skip = False + elif REGEX_KCONFIG_HELP.match(line): + skip = True + elif skip: + # ignore content of help messages + pass + elif REGEX_KCONFIG_STMT.match(line): + line = REGEX_QUOTES.sub("", line) + symbols = get_symbols_in_line(line) + # multi-line statements + while line.endswith("\\"): + i += 1 + line = lines[i] + line = line.strip('\n') + symbols.extend(get_symbols_in_line(line)) + for symbol in set(symbols): + if REGEX_NUMERIC.match(symbol): + # ignore numeric values + continue + references.append(symbol) + + return defined, references + + +if __name__ == "__main__": + main() diff --git a/src/net/scripts/checkpatch.pl b/src/net/scripts/checkpatch.pl new file mode 100755 index 0000000..0ad235e --- /dev/null +++ b/src/net/scripts/checkpatch.pl @@ -0,0 +1,7092 @@ +#!/usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0 +# +# (c) 2001, Dave Jones. (the file handling bit) +# (c) 2005, Joel Schopp (the ugly bit) +# (c) 2007,2008, Andy Whitcroft (new conditions, test suite) +# (c) 2008-2010 Andy Whitcroft +# (c) 2010-2018 Joe Perches + +use strict; +use warnings; +use POSIX; +use File::Basename; +use Cwd 'abs_path'; +use Term::ANSIColor qw(:constants); +use Encode qw(decode encode); + +my $P = $0; +my $D = dirname(abs_path($P)); + +my $V = '0.32'; + +use Getopt::Long qw(:config no_auto_abbrev); + +my $quiet = 0; +my $tree = 1; +my $chk_signoff = 1; +my $chk_patch = 1; +my $tst_only; +my $emacs = 0; +my $terse = 0; +my $showfile = 0; +my $file = 0; +my $git = 0; +my %git_commits = (); +my $check = 0; +my $check_orig = 0; +my $summary = 1; +my $mailback = 0; +my $summary_file = 0; +my $show_types = 0; +my $list_types = 0; +my $fix = 0; +my $fix_inplace = 0; +my $root; +my $gitroot = $ENV{'GIT_DIR'}; +$gitroot = ".git" if !defined($gitroot); +my %debug; +my %camelcase = (); +my %use_type = (); +my @use = (); +my %ignore_type = (); +my @ignore = (); +my $help = 0; +my $configuration_file = ".checkpatch.conf"; +my $max_line_length = 100; +my $ignore_perl_version = 0; +my $minimum_perl_version = 5.10.0; +my $min_conf_desc_length = 4; +my $spelling_file = "$D/spelling.txt"; +my $codespell = 0; +my $codespellfile = "/usr/share/codespell/dictionary.txt"; +my $conststructsfile = "$D/const_structs.checkpatch"; +my $typedefsfile; +my $color = "auto"; +my $allow_c99_comments = 1; # Can be overridden by --ignore C99_COMMENT_TOLERANCE +# git output parsing needs US English output, so first set backtick child process LANGUAGE +my $git_command ='export LANGUAGE=en_US.UTF-8; git'; +my $tabsize = 8; +my ${CONFIG_} = "CONFIG_"; + +sub help { + my ($exitcode) = @_; + + print << "EOM"; +Usage: $P [OPTION]... [FILE]... +Version: $V + +Options: + -q, --quiet quiet + --no-tree run without a kernel tree + --no-signoff do not check for 'Signed-off-by' line + --patch treat FILE as patchfile (default) + --emacs emacs compile window format + --terse one line per report + --showfile emit diffed file position, not input file position + -g, --git treat FILE as a single commit or git revision range + single git commit with: + + ^ + ~n + multiple git commits with: + .. + ... + - + git merges are ignored + -f, --file treat FILE as regular source file + --subjective, --strict enable more subjective tests + --list-types list the possible message types + --types TYPE(,TYPE2...) show only these comma separated message types + --ignore TYPE(,TYPE2...) ignore various comma separated message types + --show-types show the specific message type in the output + --max-line-length=n set the maximum line length, (default $max_line_length) + if exceeded, warn on patches + requires --strict for use with --file + --min-conf-desc-length=n set the min description length, if shorter, warn + --tab-size=n set the number of spaces for tab (default $tabsize) + --root=PATH PATH to the kernel tree root + --no-summary suppress the per-file summary + --mailback only produce a report in case of warnings/errors + --summary-file include the filename in summary + --debug KEY=[0|1] turn on/off debugging of KEY, where KEY is one of + 'values', 'possible', 'type', and 'attr' (default + is all off) + --test-only=WORD report only warnings/errors containing WORD + literally + --fix EXPERIMENTAL - may create horrible results + If correctable single-line errors exist, create + ".EXPERIMENTAL-checkpatch-fixes" + with potential errors corrected to the preferred + checkpatch style + --fix-inplace EXPERIMENTAL - may create horrible results + Is the same as --fix, but overwrites the input + file. It's your fault if there's no backup or git + --ignore-perl-version override checking of perl version. expect + runtime errors. + --codespell Use the codespell dictionary for spelling/typos + (default:/usr/share/codespell/dictionary.txt) + --codespellfile Use this codespell dictionary + --typedefsfile Read additional types from this file + --color[=WHEN] Use colors 'always', 'never', or only when output + is a terminal ('auto'). Default is 'auto'. + --kconfig-prefix=WORD use WORD as a prefix for Kconfig symbols (default + ${CONFIG_}) + -h, --help, --version display this help and exit + +When FILE is - read standard input. +EOM + + exit($exitcode); +} + +sub uniq { + my %seen; + return grep { !$seen{$_}++ } @_; +} + +sub list_types { + my ($exitcode) = @_; + + my $count = 0; + + local $/ = undef; + + open(my $script, '<', abs_path($P)) or + die "$P: Can't read '$P' $!\n"; + + my $text = <$script>; + close($script); + + my @types = (); + # Also catch when type or level is passed through a variable + for ($text =~ /(?:(?:\bCHK|\bWARN|\bERROR|&\{\$msg_level})\s*\(|\$msg_type\s*=)\s*"([^"]+)"/g) { + push (@types, $_); + } + @types = sort(uniq(@types)); + print("#\tMessage type\n\n"); + foreach my $type (@types) { + print(++$count . "\t" . $type . "\n"); + } + + exit($exitcode); +} + +my $conf = which_conf($configuration_file); +if (-f $conf) { + my @conf_args; + open(my $conffile, '<', "$conf") + or warn "$P: Can't find a readable $configuration_file file $!\n"; + + while (<$conffile>) { + my $line = $_; + + $line =~ s/\s*\n?$//g; + $line =~ s/^\s*//g; + $line =~ s/\s+/ /g; + + next if ($line =~ m/^\s*#/); + next if ($line =~ m/^\s*$/); + + my @words = split(" ", $line); + foreach my $word (@words) { + last if ($word =~ m/^#/); + push (@conf_args, $word); + } + } + close($conffile); + unshift(@ARGV, @conf_args) if @conf_args; +} + +# Perl's Getopt::Long allows options to take optional arguments after a space. +# Prevent --color by itself from consuming other arguments +foreach (@ARGV) { + if ($_ eq "--color" || $_ eq "-color") { + $_ = "--color=$color"; + } +} + +GetOptions( + 'q|quiet+' => \$quiet, + 'tree!' => \$tree, + 'signoff!' => \$chk_signoff, + 'patch!' => \$chk_patch, + 'emacs!' => \$emacs, + 'terse!' => \$terse, + 'showfile!' => \$showfile, + 'f|file!' => \$file, + 'g|git!' => \$git, + 'subjective!' => \$check, + 'strict!' => \$check, + 'ignore=s' => \@ignore, + 'types=s' => \@use, + 'show-types!' => \$show_types, + 'list-types!' => \$list_types, + 'max-line-length=i' => \$max_line_length, + 'min-conf-desc-length=i' => \$min_conf_desc_length, + 'tab-size=i' => \$tabsize, + 'root=s' => \$root, + 'summary!' => \$summary, + 'mailback!' => \$mailback, + 'summary-file!' => \$summary_file, + 'fix!' => \$fix, + 'fix-inplace!' => \$fix_inplace, + 'ignore-perl-version!' => \$ignore_perl_version, + 'debug=s' => \%debug, + 'test-only=s' => \$tst_only, + 'codespell!' => \$codespell, + 'codespellfile=s' => \$codespellfile, + 'typedefsfile=s' => \$typedefsfile, + 'color=s' => \$color, + 'no-color' => \$color, #keep old behaviors of -nocolor + 'nocolor' => \$color, #keep old behaviors of -nocolor + 'kconfig-prefix=s' => \${CONFIG_}, + 'h|help' => \$help, + 'version' => \$help +) or help(1); + +help(0) if ($help); + +list_types(0) if ($list_types); + +$fix = 1 if ($fix_inplace); +$check_orig = $check; + +die "$P: --git cannot be used with --file or --fix\n" if ($git && ($file || $fix)); + +my $exit = 0; + +my $perl_version_ok = 1; +if ($^V && $^V lt $minimum_perl_version) { + $perl_version_ok = 0; + printf "$P: requires at least perl version %vd\n", $minimum_perl_version; + exit(1) if (!$ignore_perl_version); +} + +#if no filenames are given, push '-' to read patch from stdin +if ($#ARGV < 0) { + push(@ARGV, '-'); +} + +if ($color =~ /^[01]$/) { + $color = !$color; +} elsif ($color =~ /^always$/i) { + $color = 1; +} elsif ($color =~ /^never$/i) { + $color = 0; +} elsif ($color =~ /^auto$/i) { + $color = (-t STDOUT); +} else { + die "$P: Invalid color mode: $color\n"; +} + +# skip TAB size 1 to avoid additional checks on $tabsize - 1 +die "$P: Invalid TAB size: $tabsize\n" if ($tabsize < 2); + +sub hash_save_array_words { + my ($hashRef, $arrayRef) = @_; + + my @array = split(/,/, join(',', @$arrayRef)); + foreach my $word (@array) { + $word =~ s/\s*\n?$//g; + $word =~ s/^\s*//g; + $word =~ s/\s+/ /g; + $word =~ tr/[a-z]/[A-Z]/; + + next if ($word =~ m/^\s*#/); + next if ($word =~ m/^\s*$/); + + $hashRef->{$word}++; + } +} + +sub hash_show_words { + my ($hashRef, $prefix) = @_; + + if (keys %$hashRef) { + print "\nNOTE: $prefix message types:"; + foreach my $word (sort keys %$hashRef) { + print " $word"; + } + print "\n"; + } +} + +hash_save_array_words(\%ignore_type, \@ignore); +hash_save_array_words(\%use_type, \@use); + +my $dbg_values = 0; +my $dbg_possible = 0; +my $dbg_type = 0; +my $dbg_attr = 0; +for my $key (keys %debug) { + ## no critic + eval "\${dbg_$key} = '$debug{$key}';"; + die "$@" if ($@); +} + +my $rpt_cleaners = 0; + +if ($terse) { + $emacs = 1; + $quiet++; +} + +if ($tree) { + if (defined $root) { + if (!top_of_kernel_tree($root)) { + die "$P: $root: --root does not point at a valid tree\n"; + } + } else { + if (top_of_kernel_tree('.')) { + $root = '.'; + } elsif ($0 =~ m@(.*)/scripts/[^/]*$@ && + top_of_kernel_tree($1)) { + $root = $1; + } + } + + if (!defined $root) { + print "Must be run from the top-level dir. of a kernel tree\n"; + exit(2); + } +} + +my $emitted_corrupt = 0; + +our $Ident = qr{ + [A-Za-z_][A-Za-z\d_]* + (?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)* + }x; +our $Storage = qr{extern|static|asmlinkage}; +our $Sparse = qr{ + __user| + __kernel| + __force| + __iomem| + __must_check| + __kprobes| + __ref| + __refconst| + __refdata| + __rcu| + __private + }x; +our $InitAttributePrefix = qr{__(?:mem|cpu|dev|net_|)}; +our $InitAttributeData = qr{$InitAttributePrefix(?:initdata\b)}; +our $InitAttributeConst = qr{$InitAttributePrefix(?:initconst\b)}; +our $InitAttributeInit = qr{$InitAttributePrefix(?:init\b)}; +our $InitAttribute = qr{$InitAttributeData|$InitAttributeConst|$InitAttributeInit}; + +# Notes to $Attribute: +# We need \b after 'init' otherwise 'initconst' will cause a false positive in a check +our $Attribute = qr{ + const| + __percpu| + __nocast| + __safe| + __bitwise| + __packed__| + __packed2__| + __naked| + __maybe_unused| + __always_unused| + __noreturn| + __used| + __cold| + __pure| + __noclone| + __deprecated| + __read_mostly| + __ro_after_init| + __kprobes| + $InitAttribute| + ____cacheline_aligned| + ____cacheline_aligned_in_smp| + ____cacheline_internodealigned_in_smp| + __weak + }x; +our $Modifier; +our $Inline = qr{inline|__always_inline|noinline|__inline|__inline__}; +our $Member = qr{->$Ident|\.$Ident|\[[^]]*\]}; +our $Lval = qr{$Ident(?:$Member)*}; + +our $Int_type = qr{(?i)llu|ull|ll|lu|ul|l|u}; +our $Binary = qr{(?i)0b[01]+$Int_type?}; +our $Hex = qr{(?i)0x[0-9a-f]+$Int_type?}; +our $Int = qr{[0-9]+$Int_type?}; +our $Octal = qr{0[0-7]+$Int_type?}; +our $String = qr{"[X\t]*"}; +our $Float_hex = qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?}; +our $Float_dec = qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?}; +our $Float_int = qr{(?i)[0-9]+e-?[0-9]+[fl]?}; +our $Float = qr{$Float_hex|$Float_dec|$Float_int}; +our $Constant = qr{$Float|$Binary|$Octal|$Hex|$Int}; +our $Assignment = qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=}; +our $Compare = qr{<=|>=|==|!=|<|(?}; +our $Arithmetic = qr{\+|-|\*|\/|%}; +our $Operators = qr{ + <=|>=|==|!=| + =>|->|<<|>>|<|>|!|~| + &&|\|\||,|\^|\+\+|--|&|\||$Arithmetic + }x; + +our $c90_Keywords = qr{do|for|while|if|else|return|goto|continue|switch|default|case|break}x; + +our $BasicType; +our $NonptrType; +our $NonptrTypeMisordered; +our $NonptrTypeWithAttr; +our $Type; +our $TypeMisordered; +our $Declare; +our $DeclareMisordered; + +our $NON_ASCII_UTF8 = qr{ + [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte + | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs + | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte + | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates + | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 + | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15 + | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 +}x; + +our $UTF8 = qr{ + [\x09\x0A\x0D\x20-\x7E] # ASCII + | $NON_ASCII_UTF8 +}x; + +our $typeC99Typedefs = qr{(?:__)?(?:[us]_?)?int_?(?:8|16|32|64)_t}; +our $typeOtherOSTypedefs = qr{(?x: + u_(?:char|short|int|long) | # bsd + u(?:nchar|short|int|long) # sysv +)}; +our $typeKernelTypedefs = qr{(?x: + (?:__)?(?:u|s|be|le)(?:8|16|32|64)| + atomic_t +)}; +our $typeTypedefs = qr{(?x: + $typeC99Typedefs\b| + $typeOtherOSTypedefs\b| + $typeKernelTypedefs\b +)}; + +our $zero_initializer = qr{(?:(?:0[xX])?0+$Int_type?|NULL|false)\b}; + +our $logFunctions = qr{(?x: + printk(?:_ratelimited|_once|_deferred_once|_deferred|)| + (?:[a-z0-9]+_){1,2}(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)| + TP_printk| + WARN(?:_RATELIMIT|_ONCE|)| + panic| + MODULE_[A-Z_]+| + seq_vprintf|seq_printf|seq_puts +)}; + +our $allocFunctions = qr{(?x: + (?:(?:devm_)? + (?:kv|k|v)[czm]alloc(?:_node|_array)? | + kstrdup(?:_const)? | + kmemdup(?:_nul)?) | + (?:\w+)?alloc_skb(?:_ip_align)? | + # dev_alloc_skb/netdev_alloc_skb, et al + dma_alloc_coherent +)}; + +our $signature_tags = qr{(?xi: + Signed-off-by:| + Co-developed-by:| + Acked-by:| + Tested-by:| + Reviewed-by:| + Reported-by:| + Suggested-by:| + To:| + Cc: +)}; + +our @typeListMisordered = ( + qr{char\s+(?:un)?signed}, + qr{int\s+(?:(?:un)?signed\s+)?short\s}, + qr{int\s+short(?:\s+(?:un)?signed)}, + qr{short\s+int(?:\s+(?:un)?signed)}, + qr{(?:un)?signed\s+int\s+short}, + qr{short\s+(?:un)?signed}, + qr{long\s+int\s+(?:un)?signed}, + qr{int\s+long\s+(?:un)?signed}, + qr{long\s+(?:un)?signed\s+int}, + qr{int\s+(?:un)?signed\s+long}, + qr{int\s+(?:un)?signed}, + qr{int\s+long\s+long\s+(?:un)?signed}, + qr{long\s+long\s+int\s+(?:un)?signed}, + qr{long\s+long\s+(?:un)?signed\s+int}, + qr{long\s+long\s+(?:un)?signed}, + qr{long\s+(?:un)?signed}, +); + +our @typeList = ( + qr{void}, + qr{(?:(?:un)?signed\s+)?char}, + qr{(?:(?:un)?signed\s+)?short\s+int}, + qr{(?:(?:un)?signed\s+)?short}, + qr{(?:(?:un)?signed\s+)?int}, + qr{(?:(?:un)?signed\s+)?long\s+int}, + qr{(?:(?:un)?signed\s+)?long\s+long\s+int}, + qr{(?:(?:un)?signed\s+)?long\s+long}, + qr{(?:(?:un)?signed\s+)?long}, + qr{(?:un)?signed}, + qr{float}, + qr{double}, + qr{bool}, + qr{struct\s+$Ident}, + qr{union\s+$Ident}, + qr{enum\s+$Ident}, + qr{${Ident}_t}, + qr{${Ident}_handler}, + qr{${Ident}_handler_fn}, + @typeListMisordered, +); + +our $C90_int_types = qr{(?x: + long\s+long\s+int\s+(?:un)?signed| + long\s+long\s+(?:un)?signed\s+int| + long\s+long\s+(?:un)?signed| + (?:(?:un)?signed\s+)?long\s+long\s+int| + (?:(?:un)?signed\s+)?long\s+long| + int\s+long\s+long\s+(?:un)?signed| + int\s+(?:(?:un)?signed\s+)?long\s+long| + + long\s+int\s+(?:un)?signed| + long\s+(?:un)?signed\s+int| + long\s+(?:un)?signed| + (?:(?:un)?signed\s+)?long\s+int| + (?:(?:un)?signed\s+)?long| + int\s+long\s+(?:un)?signed| + int\s+(?:(?:un)?signed\s+)?long| + + int\s+(?:un)?signed| + (?:(?:un)?signed\s+)?int +)}; + +our @typeListFile = (); +our @typeListWithAttr = ( + @typeList, + qr{struct\s+$InitAttribute\s+$Ident}, + qr{union\s+$InitAttribute\s+$Ident}, +); + +our @modifierList = ( + qr{fastcall}, +); +our @modifierListFile = (); + +our @mode_permission_funcs = ( + ["module_param", 3], + ["module_param_(?:array|named|string)", 4], + ["module_param_array_named", 5], + ["debugfs_create_(?:file|u8|u16|u32|u64|x8|x16|x32|x64|size_t|atomic_t|bool|blob|regset32|u32_array)", 2], + ["proc_create(?:_data|)", 2], + ["(?:CLASS|DEVICE|SENSOR|SENSOR_DEVICE|IIO_DEVICE)_ATTR", 2], + ["IIO_DEV_ATTR_[A-Z_]+", 1], + ["SENSOR_(?:DEVICE_|)ATTR_2", 2], + ["SENSOR_TEMPLATE(?:_2|)", 3], + ["__ATTR", 2], +); + +my $word_pattern = '\b[A-Z]?[a-z]{2,}\b'; + +#Create a search pattern for all these functions to speed up a loop below +our $mode_perms_search = ""; +foreach my $entry (@mode_permission_funcs) { + $mode_perms_search .= '|' if ($mode_perms_search ne ""); + $mode_perms_search .= $entry->[0]; +} +$mode_perms_search = "(?:${mode_perms_search})"; + +our %deprecated_apis = ( + "synchronize_rcu_bh" => "synchronize_rcu", + "synchronize_rcu_bh_expedited" => "synchronize_rcu_expedited", + "call_rcu_bh" => "call_rcu", + "rcu_barrier_bh" => "rcu_barrier", + "synchronize_sched" => "synchronize_rcu", + "synchronize_sched_expedited" => "synchronize_rcu_expedited", + "call_rcu_sched" => "call_rcu", + "rcu_barrier_sched" => "rcu_barrier", + "get_state_synchronize_sched" => "get_state_synchronize_rcu", + "cond_synchronize_sched" => "cond_synchronize_rcu", +); + +#Create a search pattern for all these strings to speed up a loop below +our $deprecated_apis_search = ""; +foreach my $entry (keys %deprecated_apis) { + $deprecated_apis_search .= '|' if ($deprecated_apis_search ne ""); + $deprecated_apis_search .= $entry; +} +$deprecated_apis_search = "(?:${deprecated_apis_search})"; + +our $mode_perms_world_writable = qr{ + S_IWUGO | + S_IWOTH | + S_IRWXUGO | + S_IALLUGO | + 0[0-7][0-7][2367] +}x; + +our %mode_permission_string_types = ( + "S_IRWXU" => 0700, + "S_IRUSR" => 0400, + "S_IWUSR" => 0200, + "S_IXUSR" => 0100, + "S_IRWXG" => 0070, + "S_IRGRP" => 0040, + "S_IWGRP" => 0020, + "S_IXGRP" => 0010, + "S_IRWXO" => 0007, + "S_IROTH" => 0004, + "S_IWOTH" => 0002, + "S_IXOTH" => 0001, + "S_IRWXUGO" => 0777, + "S_IRUGO" => 0444, + "S_IWUGO" => 0222, + "S_IXUGO" => 0111, +); + +#Create a search pattern for all these strings to speed up a loop below +our $mode_perms_string_search = ""; +foreach my $entry (keys %mode_permission_string_types) { + $mode_perms_string_search .= '|' if ($mode_perms_string_search ne ""); + $mode_perms_string_search .= $entry; +} +our $single_mode_perms_string_search = "(?:${mode_perms_string_search})"; +our $multi_mode_perms_string_search = qr{ + ${single_mode_perms_string_search} + (?:\s*\|\s*${single_mode_perms_string_search})* +}x; + +sub perms_to_octal { + my ($string) = @_; + + return trim($string) if ($string =~ /^\s*0[0-7]{3,3}\s*$/); + + my $val = ""; + my $oval = ""; + my $to = 0; + my $curpos = 0; + my $lastpos = 0; + while ($string =~ /\b(($single_mode_perms_string_search)\b(?:\s*\|\s*)?\s*)/g) { + $curpos = pos($string); + my $match = $2; + my $omatch = $1; + last if ($lastpos > 0 && ($curpos - length($omatch) != $lastpos)); + $lastpos = $curpos; + $to |= $mode_permission_string_types{$match}; + $val .= '\s*\|\s*' if ($val ne ""); + $val .= $match; + $oval .= $omatch; + } + $oval =~ s/^\s*\|\s*//; + $oval =~ s/\s*\|\s*$//; + return sprintf("%04o", $to); +} + +our $allowed_asm_includes = qr{(?x: + irq| + memory| + time| + reboot +)}; +# memory.h: ARM has a custom one + +# Load common spelling mistakes and build regular expression list. +my $misspellings; +my %spelling_fix; + +if (open(my $spelling, '<', $spelling_file)) { + while (<$spelling>) { + my $line = $_; + + $line =~ s/\s*\n?$//g; + $line =~ s/^\s*//g; + + next if ($line =~ m/^\s*#/); + next if ($line =~ m/^\s*$/); + + my ($suspect, $fix) = split(/\|\|/, $line); + + $spelling_fix{$suspect} = $fix; + } + close($spelling); +} else { + warn "No typos will be found - file '$spelling_file': $!\n"; +} + +if ($codespell) { + if (open(my $spelling, '<', $codespellfile)) { + while (<$spelling>) { + my $line = $_; + + $line =~ s/\s*\n?$//g; + $line =~ s/^\s*//g; + + next if ($line =~ m/^\s*#/); + next if ($line =~ m/^\s*$/); + next if ($line =~ m/, disabled/i); + + $line =~ s/,.*$//; + + my ($suspect, $fix) = split(/->/, $line); + + $spelling_fix{$suspect} = $fix; + } + close($spelling); + } else { + warn "No codespell typos will be found - file '$codespellfile': $!\n"; + } +} + +$misspellings = join("|", sort keys %spelling_fix) if keys %spelling_fix; + +sub read_words { + my ($wordsRef, $file) = @_; + + if (open(my $words, '<', $file)) { + while (<$words>) { + my $line = $_; + + $line =~ s/\s*\n?$//g; + $line =~ s/^\s*//g; + + next if ($line =~ m/^\s*#/); + next if ($line =~ m/^\s*$/); + if ($line =~ /\s/) { + print("$file: '$line' invalid - ignored\n"); + next; + } + + $$wordsRef .= '|' if (defined $$wordsRef); + $$wordsRef .= $line; + } + close($file); + return 1; + } + + return 0; +} + +my $const_structs; +if (show_type("CONST_STRUCT")) { + read_words(\$const_structs, $conststructsfile) + or warn "No structs that should be const will be found - file '$conststructsfile': $!\n"; +} + +if (defined($typedefsfile)) { + my $typeOtherTypedefs; + read_words(\$typeOtherTypedefs, $typedefsfile) + or warn "No additional types will be considered - file '$typedefsfile': $!\n"; + $typeTypedefs .= '|' . $typeOtherTypedefs if (defined $typeOtherTypedefs); +} + +sub build_types { + my $mods = "(?x: \n" . join("|\n ", (@modifierList, @modifierListFile)) . "\n)"; + my $all = "(?x: \n" . join("|\n ", (@typeList, @typeListFile)) . "\n)"; + my $Misordered = "(?x: \n" . join("|\n ", @typeListMisordered) . "\n)"; + my $allWithAttr = "(?x: \n" . join("|\n ", @typeListWithAttr) . "\n)"; + $Modifier = qr{(?:$Attribute|$Sparse|$mods)}; + $BasicType = qr{ + (?:$typeTypedefs\b)| + (?:${all}\b) + }x; + $NonptrType = qr{ + (?:$Modifier\s+|const\s+)* + (?: + (?:typeof|__typeof__)\s*\([^\)]*\)| + (?:$typeTypedefs\b)| + (?:${all}\b) + ) + (?:\s+$Modifier|\s+const)* + }x; + $NonptrTypeMisordered = qr{ + (?:$Modifier\s+|const\s+)* + (?: + (?:${Misordered}\b) + ) + (?:\s+$Modifier|\s+const)* + }x; + $NonptrTypeWithAttr = qr{ + (?:$Modifier\s+|const\s+)* + (?: + (?:typeof|__typeof__)\s*\([^\)]*\)| + (?:$typeTypedefs\b)| + (?:${allWithAttr}\b) + ) + (?:\s+$Modifier|\s+const)* + }x; + $Type = qr{ + $NonptrType + (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+){0,4} + (?:\s+$Inline|\s+$Modifier)* + }x; + $TypeMisordered = qr{ + $NonptrTypeMisordered + (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+){0,4} + (?:\s+$Inline|\s+$Modifier)* + }x; + $Declare = qr{(?:$Storage\s+(?:$Inline\s+)?)?$Type}; + $DeclareMisordered = qr{(?:$Storage\s+(?:$Inline\s+)?)?$TypeMisordered}; +} +build_types(); + +our $Typecast = qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*}; + +# Using $balanced_parens, $LvalOrFunc, or $FuncArg +# requires at least perl version v5.10.0 +# Any use must be runtime checked with $^V + +our $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/; +our $LvalOrFunc = qr{((?:[\&\*]\s*)?$Lval)\s*($balanced_parens{0,1})\s*}; +our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant|$String)}; + +our $declaration_macros = qr{(?x: + (?:$Storage\s+)?(?:[A-Z_][A-Z0-9]*_){0,2}(?:DEFINE|DECLARE)(?:_[A-Z0-9]+){1,6}\s*\(| + (?:$Storage\s+)?[HLP]?LIST_HEAD\s*\(| + (?:SKCIPHER_REQUEST|SHASH_DESC|AHASH_REQUEST)_ON_STACK\s*\( +)}; + +sub deparenthesize { + my ($string) = @_; + return "" if (!defined($string)); + + while ($string =~ /^\s*\(.*\)\s*$/) { + $string =~ s@^\s*\(\s*@@; + $string =~ s@\s*\)\s*$@@; + } + + $string =~ s@\s+@ @g; + + return $string; +} + +sub seed_camelcase_file { + my ($file) = @_; + + return if (!(-f $file)); + + local $/; + + open(my $include_file, '<', "$file") + or warn "$P: Can't read '$file' $!\n"; + my $text = <$include_file>; + close($include_file); + + my @lines = split('\n', $text); + + foreach my $line (@lines) { + next if ($line !~ /(?:[A-Z][a-z]|[a-z][A-Z])/); + if ($line =~ /^[ \t]*(?:#[ \t]*define|typedef\s+$Type)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)/) { + $camelcase{$1} = 1; + } elsif ($line =~ /^\s*$Declare\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[\(\[,;]/) { + $camelcase{$1} = 1; + } elsif ($line =~ /^\s*(?:union|struct|enum)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[;\{]/) { + $camelcase{$1} = 1; + } + } +} + +our %maintained_status = (); + +sub is_maintained_obsolete { + my ($filename) = @_; + + return 0 if (!$tree || !(-e "$root/scripts/get_maintainer.pl")); + + if (!exists($maintained_status{$filename})) { + $maintained_status{$filename} = `perl $root/scripts/get_maintainer.pl --status --nom --nol --nogit --nogit-fallback -f $filename 2>&1`; + } + + return $maintained_status{$filename} =~ /obsolete/i; +} + +sub is_SPDX_License_valid { + my ($license) = @_; + + return 1 if (!$tree || which("python") eq "" || !(-e "$root/scripts/spdxcheck.py") || !(-e "$gitroot")); + + my $root_path = abs_path($root); + my $status = `cd "$root_path"; echo "$license" | python scripts/spdxcheck.py -`; + return 0 if ($status ne ""); + return 1; +} + +my $camelcase_seeded = 0; +sub seed_camelcase_includes { + return if ($camelcase_seeded); + + my $files; + my $camelcase_cache = ""; + my @include_files = (); + + $camelcase_seeded = 1; + + if (-e "$gitroot") { + my $git_last_include_commit = `${git_command} log --no-merges --pretty=format:"%h%n" -1 -- include`; + chomp $git_last_include_commit; + $camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit"; + } else { + my $last_mod_date = 0; + $files = `find $root/include -name "*.h"`; + @include_files = split('\n', $files); + foreach my $file (@include_files) { + my $date = POSIX::strftime("%Y%m%d%H%M", + localtime((stat $file)[9])); + $last_mod_date = $date if ($last_mod_date < $date); + } + $camelcase_cache = ".checkpatch-camelcase.date.$last_mod_date"; + } + + if ($camelcase_cache ne "" && -f $camelcase_cache) { + open(my $camelcase_file, '<', "$camelcase_cache") + or warn "$P: Can't read '$camelcase_cache' $!\n"; + while (<$camelcase_file>) { + chomp; + $camelcase{$_} = 1; + } + close($camelcase_file); + + return; + } + + if (-e "$gitroot") { + $files = `${git_command} ls-files "include/*.h"`; + @include_files = split('\n', $files); + } + + foreach my $file (@include_files) { + seed_camelcase_file($file); + } + + if ($camelcase_cache ne "") { + unlink glob ".checkpatch-camelcase.*"; + open(my $camelcase_file, '>', "$camelcase_cache") + or warn "$P: Can't write '$camelcase_cache' $!\n"; + foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) { + print $camelcase_file ("$_\n"); + } + close($camelcase_file); + } +} + +sub git_is_single_file { + my ($filename) = @_; + + return 0 if ((which("git") eq "") || !(-e "$gitroot")); + + my $output = `${git_command} ls-files -- $filename 2>/dev/null`; + my $count = $output =~ tr/\n//; + return $count eq 1 && $output =~ m{^${filename}$}; +} + +sub git_commit_info { + my ($commit, $id, $desc) = @_; + + return ($id, $desc) if ((which("git") eq "") || !(-e "$gitroot")); + + my $output = `${git_command} log --no-color --format='%H %s' -1 $commit 2>&1`; + $output =~ s/^\s*//gm; + my @lines = split("\n", $output); + + return ($id, $desc) if ($#lines < 0); + + if ($lines[0] =~ /^error: short SHA1 $commit is ambiguous/) { +# Maybe one day convert this block of bash into something that returns +# all matching commit ids, but it's very slow... +# +# echo "checking commits $1..." +# git rev-list --remotes | grep -i "^$1" | +# while read line ; do +# git log --format='%H %s' -1 $line | +# echo "commit $(cut -c 1-12,41-)" +# done + } elsif ($lines[0] =~ /^fatal: ambiguous argument '$commit': unknown revision or path not in the working tree\./) { + $id = undef; + } else { + $id = substr($lines[0], 0, 12); + $desc = substr($lines[0], 41); + } + + return ($id, $desc); +} + +$chk_signoff = 0 if ($file); + +my @rawlines = (); +my @lines = (); +my @fixed = (); +my @fixed_inserted = (); +my @fixed_deleted = (); +my $fixlinenr = -1; + +# If input is git commits, extract all commits from the commit expressions. +# For example, HEAD-3 means we need check 'HEAD, HEAD~1, HEAD~2'. +die "$P: No git repository found\n" if ($git && !-e "$gitroot"); + +if ($git) { + my @commits = (); + foreach my $commit_expr (@ARGV) { + my $git_range; + if ($commit_expr =~ m/^(.*)-(\d+)$/) { + $git_range = "-$2 $1"; + } elsif ($commit_expr =~ m/\.\./) { + $git_range = "$commit_expr"; + } else { + $git_range = "-1 $commit_expr"; + } + my $lines = `${git_command} log --no-color --no-merges --pretty=format:'%H %s' $git_range`; + foreach my $line (split(/\n/, $lines)) { + $line =~ /^([0-9a-fA-F]{40,40}) (.*)$/; + next if (!defined($1) || !defined($2)); + my $sha1 = $1; + my $subject = $2; + unshift(@commits, $sha1); + $git_commits{$sha1} = $subject; + } + } + die "$P: no git commits after extraction!\n" if (@commits == 0); + @ARGV = @commits; +} + +my $vname; +$allow_c99_comments = !defined $ignore_type{"C99_COMMENT_TOLERANCE"}; +for my $filename (@ARGV) { + my $FILE; + my $is_git_file = git_is_single_file($filename); + my $oldfile = $file; + $file = 1 if ($is_git_file); + if ($git) { + open($FILE, '-|', "git format-patch -M --stdout -1 $filename") || + die "$P: $filename: git format-patch failed - $!\n"; + } elsif ($file) { + open($FILE, '-|', "diff -u /dev/null $filename") || + die "$P: $filename: diff failed - $!\n"; + } elsif ($filename eq '-') { + open($FILE, '<&STDIN'); + } else { + open($FILE, '<', "$filename") || + die "$P: $filename: open failed - $!\n"; + } + if ($filename eq '-') { + $vname = 'Your patch'; + } elsif ($git) { + $vname = "Commit " . substr($filename, 0, 12) . ' ("' . $git_commits{$filename} . '")'; + } else { + $vname = $filename; + } + while (<$FILE>) { + chomp; + push(@rawlines, $_); + $vname = qq("$1") if ($filename eq '-' && $_ =~ m/^Subject:\s+(.+)/i); + } + close($FILE); + + if ($#ARGV > 0 && $quiet == 0) { + print '-' x length($vname) . "\n"; + print "$vname\n"; + print '-' x length($vname) . "\n"; + } + + if (!process($filename)) { + $exit = 1; + } + @rawlines = (); + @lines = (); + @fixed = (); + @fixed_inserted = (); + @fixed_deleted = (); + $fixlinenr = -1; + @modifierListFile = (); + @typeListFile = (); + build_types(); + $file = $oldfile if ($is_git_file); +} + +if (!$quiet) { + hash_show_words(\%use_type, "Used"); + hash_show_words(\%ignore_type, "Ignored"); + + if (!$perl_version_ok) { + print << "EOM" + +NOTE: perl $^V is not modern enough to detect all possible issues. + An upgrade to at least perl $minimum_perl_version is suggested. +EOM + } + if ($exit) { + print << "EOM" + +NOTE: If any of the errors are false positives, please report + them to the maintainer, see CHECKPATCH in MAINTAINERS. +EOM + } +} + +exit($exit); + +sub top_of_kernel_tree { + my ($root) = @_; + + my @tree_check = ( + "COPYING", "CREDITS", "Kbuild", "MAINTAINERS", "Makefile", + "README", "Documentation", "arch", "include", "drivers", + "fs", "init", "ipc", "kernel", "lib", "scripts", + ); + + foreach my $check (@tree_check) { + if (! -e $root . '/' . $check) { + return 0; + } + } + return 1; +} + +sub parse_email { + my ($formatted_email) = @_; + + my $name = ""; + my $name_comment = ""; + my $address = ""; + my $comment = ""; + + if ($formatted_email =~ /^(.*)<(\S+\@\S+)>(.*)$/) { + $name = $1; + $address = $2; + $comment = $3 if defined $3; + } elsif ($formatted_email =~ /^\s*<(\S+\@\S+)>(.*)$/) { + $address = $1; + $comment = $2 if defined $2; + } elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) { + $address = $1; + $comment = $2 if defined $2; + $formatted_email =~ s/\Q$address\E.*$//; + $name = $formatted_email; + $name = trim($name); + $name =~ s/^\"|\"$//g; + # If there's a name left after stripping spaces and + # leading quotes, and the address doesn't have both + # leading and trailing angle brackets, the address + # is invalid. ie: + # "joe smith joe@smith.com" bad + # "joe smith ]+>$/) { + $name = ""; + $address = ""; + $comment = ""; + } + } + + $comment = trim($comment); + $name = trim($name); + $name =~ s/^\"|\"$//g; + if ($name =~ s/(\s*\([^\)]+\))\s*//) { + $name_comment = trim($1); + } + $address = trim($address); + $address =~ s/^\<|\>$//g; + + if ($name =~ /[^\w \-]/i) { ##has "must quote" chars + $name =~ s/(?"; + } + $formatted_email .= "$comment"; + return $formatted_email; +} + +sub reformat_email { + my ($email) = @_; + + my ($email_name, $name_comment, $email_address, $comment) = parse_email($email); + return format_email($email_name, $name_comment, $email_address, $comment); +} + +sub same_email_addresses { + my ($email1, $email2, $match_comment) = @_; + + my ($email1_name, $name1_comment, $email1_address, $comment1) = parse_email($email1); + my ($email2_name, $name2_comment, $email2_address, $comment2) = parse_email($email2); + + if ($match_comment != 1) { + return $email1_name eq $email2_name && + $email1_address eq $email2_address; + } + return $email1_name eq $email2_name && + $email1_address eq $email2_address && + $name1_comment eq $name2_comment && + $comment1 eq $comment2; +} + +sub which { + my ($bin) = @_; + + foreach my $path (split(/:/, $ENV{PATH})) { + if (-e "$path/$bin") { + return "$path/$bin"; + } + } + + return ""; +} + +sub which_conf { + my ($conf) = @_; + + foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) { + if (-e "$path/$conf") { + return "$path/$conf"; + } + } + + return ""; +} + +sub expand_tabs { + my ($str) = @_; + + my $res = ''; + my $n = 0; + for my $c (split(//, $str)) { + if ($c eq "\t") { + $res .= ' '; + $n++; + for (; ($n % $tabsize) != 0; $n++) { + $res .= ' '; + } + next; + } + $res .= $c; + $n++; + } + + return $res; +} +sub copy_spacing { + (my $res = shift) =~ tr/\t/ /c; + return $res; +} + +sub line_stats { + my ($line) = @_; + + # Drop the diff line leader and expand tabs + $line =~ s/^.//; + $line = expand_tabs($line); + + # Pick the indent from the front of the line. + my ($white) = ($line =~ /^(\s*)/); + + return (length($line), length($white)); +} + +my $sanitise_quote = ''; + +sub sanitise_line_reset { + my ($in_comment) = @_; + + if ($in_comment) { + $sanitise_quote = '*/'; + } else { + $sanitise_quote = ''; + } +} +sub sanitise_line { + my ($line) = @_; + + my $res = ''; + my $l = ''; + + my $qlen = 0; + my $off = 0; + my $c; + + # Always copy over the diff marker. + $res = substr($line, 0, 1); + + for ($off = 1; $off < length($line); $off++) { + $c = substr($line, $off, 1); + + # Comments we are whacking completely including the begin + # and end, all to $;. + if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') { + $sanitise_quote = '*/'; + + substr($res, $off, 2, "$;$;"); + $off++; + next; + } + if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') { + $sanitise_quote = ''; + substr($res, $off, 2, "$;$;"); + $off++; + next; + } + if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') { + $sanitise_quote = '//'; + + substr($res, $off, 2, $sanitise_quote); + $off++; + next; + } + + # A \ in a string means ignore the next character. + if (($sanitise_quote eq "'" || $sanitise_quote eq '"') && + $c eq "\\") { + substr($res, $off, 2, 'XX'); + $off++; + next; + } + # Regular quotes. + if ($c eq "'" || $c eq '"') { + if ($sanitise_quote eq '') { + $sanitise_quote = $c; + + substr($res, $off, 1, $c); + next; + } elsif ($sanitise_quote eq $c) { + $sanitise_quote = ''; + } + } + + #print "c<$c> SQ<$sanitise_quote>\n"; + if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") { + substr($res, $off, 1, $;); + } elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") { + substr($res, $off, 1, $;); + } elsif ($off != 0 && $sanitise_quote && $c ne "\t") { + substr($res, $off, 1, 'X'); + } else { + substr($res, $off, 1, $c); + } + } + + if ($sanitise_quote eq '//') { + $sanitise_quote = ''; + } + + # The pathname on a #include may be surrounded by '<' and '>'. + if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) { + my $clean = 'X' x length($1); + $res =~ s@\<.*\>@<$clean>@; + + # The whole of a #error is a string. + } elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) { + my $clean = 'X' x length($1); + $res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@; + } + + if ($allow_c99_comments && $res =~ m@(//.*$)@) { + my $match = $1; + $res =~ s/\Q$match\E/"$;" x length($match)/e; + } + + return $res; +} + +sub get_quoted_string { + my ($line, $rawline) = @_; + + return "" if (!defined($line) || !defined($rawline)); + return "" if ($line !~ m/($String)/g); + return substr($rawline, $-[0], $+[0] - $-[0]); +} + +sub ctx_statement_block { + my ($linenr, $remain, $off) = @_; + my $line = $linenr - 1; + my $blk = ''; + my $soff = $off; + my $coff = $off - 1; + my $coff_set = 0; + + my $loff = 0; + + my $type = ''; + my $level = 0; + my @stack = (); + my $p; + my $c; + my $len = 0; + + my $remainder; + while (1) { + @stack = (['', 0]) if ($#stack == -1); + + #warn "CSB: blk<$blk> remain<$remain>\n"; + # If we are about to drop off the end, pull in more + # context. + if ($off >= $len) { + for (; $remain > 0; $line++) { + last if (!defined $lines[$line]); + next if ($lines[$line] =~ /^-/); + $remain--; + $loff = $len; + $blk .= $lines[$line] . "\n"; + $len = length($blk); + $line++; + last; + } + # Bail if there is no further context. + #warn "CSB: blk<$blk> off<$off> len<$len>\n"; + if ($off >= $len) { + last; + } + if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) { + $level++; + $type = '#'; + } + } + $p = $c; + $c = substr($blk, $off, 1); + $remainder = substr($blk, $off); + + #warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>\n"; + + # Handle nested #if/#else. + if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) { + push(@stack, [ $type, $level ]); + } elsif ($remainder =~ /^#\s*(?:else|elif)\b/) { + ($type, $level) = @{$stack[$#stack - 1]}; + } elsif ($remainder =~ /^#\s*endif\b/) { + ($type, $level) = @{pop(@stack)}; + } + + # Statement ends at the ';' or a close '}' at the + # outermost level. + if ($level == 0 && $c eq ';') { + last; + } + + # An else is really a conditional as long as its not else if + if ($level == 0 && $coff_set == 0 && + (!defined($p) || $p =~ /(?:\s|\}|\+)/) && + $remainder =~ /^(else)(?:\s|{)/ && + $remainder !~ /^else\s+if\b/) { + $coff = $off + length($1) - 1; + $coff_set = 1; + #warn "CSB: mark coff<$coff> soff<$soff> 1<$1>\n"; + #warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]\n"; + } + + if (($type eq '' || $type eq '(') && $c eq '(') { + $level++; + $type = '('; + } + if ($type eq '(' && $c eq ')') { + $level--; + $type = ($level != 0)? '(' : ''; + + if ($level == 0 && $coff < $soff) { + $coff = $off; + $coff_set = 1; + #warn "CSB: mark coff<$coff>\n"; + } + } + if (($type eq '' || $type eq '{') && $c eq '{') { + $level++; + $type = '{'; + } + if ($type eq '{' && $c eq '}') { + $level--; + $type = ($level != 0)? '{' : ''; + + if ($level == 0) { + if (substr($blk, $off + 1, 1) eq ';') { + $off++; + } + last; + } + } + # Preprocessor commands end at the newline unless escaped. + if ($type eq '#' && $c eq "\n" && $p ne "\\") { + $level--; + $type = ''; + $off++; + last; + } + $off++; + } + # We are truly at the end, so shuffle to the next line. + if ($off == $len) { + $loff = $len + 1; + $line++; + $remain--; + } + + my $statement = substr($blk, $soff, $off - $soff + 1); + my $condition = substr($blk, $soff, $coff - $soff + 1); + + #warn "STATEMENT<$statement>\n"; + #warn "CONDITION<$condition>\n"; + + #print "coff<$coff> soff<$off> loff<$loff>\n"; + + return ($statement, $condition, + $line, $remain + 1, $off - $loff + 1, $level); +} + +sub statement_lines { + my ($stmt) = @_; + + # Strip the diff line prefixes and rip blank lines at start and end. + $stmt =~ s/(^|\n)./$1/g; + $stmt =~ s/^\s*//; + $stmt =~ s/\s*$//; + + my @stmt_lines = ($stmt =~ /\n/g); + + return $#stmt_lines + 2; +} + +sub statement_rawlines { + my ($stmt) = @_; + + my @stmt_lines = ($stmt =~ /\n/g); + + return $#stmt_lines + 2; +} + +sub statement_block_size { + my ($stmt) = @_; + + $stmt =~ s/(^|\n)./$1/g; + $stmt =~ s/^\s*{//; + $stmt =~ s/}\s*$//; + $stmt =~ s/^\s*//; + $stmt =~ s/\s*$//; + + my @stmt_lines = ($stmt =~ /\n/g); + my @stmt_statements = ($stmt =~ /;/g); + + my $stmt_lines = $#stmt_lines + 2; + my $stmt_statements = $#stmt_statements + 1; + + if ($stmt_lines > $stmt_statements) { + return $stmt_lines; + } else { + return $stmt_statements; + } +} + +sub ctx_statement_full { + my ($linenr, $remain, $off) = @_; + my ($statement, $condition, $level); + + my (@chunks); + + # Grab the first conditional/block pair. + ($statement, $condition, $linenr, $remain, $off, $level) = + ctx_statement_block($linenr, $remain, $off); + #print "F: c<$condition> s<$statement> remain<$remain>\n"; + push(@chunks, [ $condition, $statement ]); + if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) { + return ($level, $linenr, @chunks); + } + + # Pull in the following conditional/block pairs and see if they + # could continue the statement. + for (;;) { + ($statement, $condition, $linenr, $remain, $off, $level) = + ctx_statement_block($linenr, $remain, $off); + #print "C: c<$condition> s<$statement> remain<$remain>\n"; + last if (!($remain > 0 && $condition =~ /^(?:\s*\n[+-])*\s*(?:else|do)\b/s)); + #print "C: push\n"; + push(@chunks, [ $condition, $statement ]); + } + + return ($level, $linenr, @chunks); +} + +sub ctx_block_get { + my ($linenr, $remain, $outer, $open, $close, $off) = @_; + my $line; + my $start = $linenr - 1; + my $blk = ''; + my @o; + my @c; + my @res = (); + + my $level = 0; + my @stack = ($level); + for ($line = $start; $remain > 0; $line++) { + next if ($rawlines[$line] =~ /^-/); + $remain--; + + $blk .= $rawlines[$line]; + + # Handle nested #if/#else. + if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) { + push(@stack, $level); + } elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) { + $level = $stack[$#stack - 1]; + } elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) { + $level = pop(@stack); + } + + foreach my $c (split(//, $lines[$line])) { + ##print "C<$c>L<$level><$open$close>O<$off>\n"; + if ($off > 0) { + $off--; + next; + } + + if ($c eq $close && $level > 0) { + $level--; + last if ($level == 0); + } elsif ($c eq $open) { + $level++; + } + } + + if (!$outer || $level <= 1) { + push(@res, $rawlines[$line]); + } + + last if ($level == 0); + } + + return ($level, @res); +} +sub ctx_block_outer { + my ($linenr, $remain) = @_; + + my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0); + return @r; +} +sub ctx_block { + my ($linenr, $remain) = @_; + + my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0); + return @r; +} +sub ctx_statement { + my ($linenr, $remain, $off) = @_; + + my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off); + return @r; +} +sub ctx_block_level { + my ($linenr, $remain) = @_; + + return ctx_block_get($linenr, $remain, 0, '{', '}', 0); +} +sub ctx_statement_level { + my ($linenr, $remain, $off) = @_; + + return ctx_block_get($linenr, $remain, 0, '(', ')', $off); +} + +sub ctx_locate_comment { + my ($first_line, $end_line) = @_; + + # If c99 comment on the current line, or the line before or after + my ($current_comment) = ($rawlines[$end_line - 1] =~ m@^\+.*(//.*$)@); + return $current_comment if (defined $current_comment); + ($current_comment) = ($rawlines[$end_line - 2] =~ m@^[\+ ].*(//.*$)@); + return $current_comment if (defined $current_comment); + ($current_comment) = ($rawlines[$end_line] =~ m@^[\+ ].*(//.*$)@); + return $current_comment if (defined $current_comment); + + # Catch a comment on the end of the line itself. + ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@); + return $current_comment if (defined $current_comment); + + # Look through the context and try and figure out if there is a + # comment. + my $in_comment = 0; + $current_comment = ''; + for (my $linenr = $first_line; $linenr < $end_line; $linenr++) { + my $line = $rawlines[$linenr - 1]; + #warn " $line\n"; + if ($linenr == $first_line and $line =~ m@^.\s*\*@) { + $in_comment = 1; + } + if ($line =~ m@/\*@) { + $in_comment = 1; + } + if (!$in_comment && $current_comment ne '') { + $current_comment = ''; + } + $current_comment .= $line . "\n" if ($in_comment); + if ($line =~ m@\*/@) { + $in_comment = 0; + } + } + + chomp($current_comment); + return($current_comment); +} +sub ctx_has_comment { + my ($first_line, $end_line) = @_; + my $cmt = ctx_locate_comment($first_line, $end_line); + + ##print "LINE: $rawlines[$end_line - 1 ]\n"; + ##print "CMMT: $cmt\n"; + + return ($cmt ne ''); +} + +sub raw_line { + my ($linenr, $cnt) = @_; + + my $offset = $linenr - 1; + $cnt++; + + my $line; + while ($cnt) { + $line = $rawlines[$offset++]; + next if (defined($line) && $line =~ /^-/); + $cnt--; + } + + return $line; +} + +sub get_stat_real { + my ($linenr, $lc) = @_; + + my $stat_real = raw_line($linenr, 0); + for (my $count = $linenr + 1; $count <= $lc; $count++) { + $stat_real = $stat_real . "\n" . raw_line($count, 0); + } + + return $stat_real; +} + +sub get_stat_here { + my ($linenr, $cnt, $here) = @_; + + my $herectx = $here . "\n"; + for (my $n = 0; $n < $cnt; $n++) { + $herectx .= raw_line($linenr, $n) . "\n"; + } + + return $herectx; +} + +sub cat_vet { + my ($vet) = @_; + my ($res, $coded); + + $res = ''; + while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) { + $res .= $1; + if ($2 ne '') { + $coded = sprintf("^%c", unpack('C', $2) + 64); + $res .= $coded; + } + } + $res =~ s/$/\$/; + + return $res; +} + +my $av_preprocessor = 0; +my $av_pending; +my @av_paren_type; +my $av_pend_colon; + +sub annotate_reset { + $av_preprocessor = 0; + $av_pending = '_'; + @av_paren_type = ('E'); + $av_pend_colon = 'O'; +} + +sub annotate_values { + my ($stream, $type) = @_; + + my $res; + my $var = '_' x length($stream); + my $cur = $stream; + + print "$stream\n" if ($dbg_values > 1); + + while (length($cur)) { + @av_paren_type = ('E') if ($#av_paren_type < 0); + print " <" . join('', @av_paren_type) . + "> <$type> <$av_pending>" if ($dbg_values > 1); + if ($cur =~ /^(\s+)/o) { + print "WS($1)\n" if ($dbg_values > 1); + if ($1 =~ /\n/ && $av_preprocessor) { + $type = pop(@av_paren_type); + $av_preprocessor = 0; + } + + } elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') { + print "CAST($1)\n" if ($dbg_values > 1); + push(@av_paren_type, $type); + $type = 'c'; + + } elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) { + print "DECLARE($1)\n" if ($dbg_values > 1); + $type = 'T'; + + } elsif ($cur =~ /^($Modifier)\s*/) { + print "MODIFIER($1)\n" if ($dbg_values > 1); + $type = 'T'; + + } elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) { + print "DEFINE($1,$2)\n" if ($dbg_values > 1); + $av_preprocessor = 1; + push(@av_paren_type, $type); + if ($2 ne '') { + $av_pending = 'N'; + } + $type = 'E'; + + } elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) { + print "UNDEF($1)\n" if ($dbg_values > 1); + $av_preprocessor = 1; + push(@av_paren_type, $type); + + } elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) { + print "PRE_START($1)\n" if ($dbg_values > 1); + $av_preprocessor = 1; + + push(@av_paren_type, $type); + push(@av_paren_type, $type); + $type = 'E'; + + } elsif ($cur =~ /^(\#\s*(?:else|elif))/o) { + print "PRE_RESTART($1)\n" if ($dbg_values > 1); + $av_preprocessor = 1; + + push(@av_paren_type, $av_paren_type[$#av_paren_type]); + + $type = 'E'; + + } elsif ($cur =~ /^(\#\s*(?:endif))/o) { + print "PRE_END($1)\n" if ($dbg_values > 1); + + $av_preprocessor = 1; + + # Assume all arms of the conditional end as this + # one does, and continue as if the #endif was not here. + pop(@av_paren_type); + push(@av_paren_type, $type); + $type = 'E'; + + } elsif ($cur =~ /^(\\\n)/o) { + print "PRECONT($1)\n" if ($dbg_values > 1); + + } elsif ($cur =~ /^(__attribute__)\s*\(?/o) { + print "ATTR($1)\n" if ($dbg_values > 1); + $av_pending = $type; + $type = 'N'; + + } elsif ($cur =~ /^(sizeof)\s*(\()?/o) { + print "SIZEOF($1)\n" if ($dbg_values > 1); + if (defined $2) { + $av_pending = 'V'; + } + $type = 'N'; + + } elsif ($cur =~ /^(if|while|for)\b/o) { + print "COND($1)\n" if ($dbg_values > 1); + $av_pending = 'E'; + $type = 'N'; + + } elsif ($cur =~/^(case)/o) { + print "CASE($1)\n" if ($dbg_values > 1); + $av_pend_colon = 'C'; + $type = 'N'; + + } elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) { + print "KEYWORD($1)\n" if ($dbg_values > 1); + $type = 'N'; + + } elsif ($cur =~ /^(\()/o) { + print "PAREN('$1')\n" if ($dbg_values > 1); + push(@av_paren_type, $av_pending); + $av_pending = '_'; + $type = 'N'; + + } elsif ($cur =~ /^(\))/o) { + my $new_type = pop(@av_paren_type); + if ($new_type ne '_') { + $type = $new_type; + print "PAREN('$1') -> $type\n" + if ($dbg_values > 1); + } else { + print "PAREN('$1')\n" if ($dbg_values > 1); + } + + } elsif ($cur =~ /^($Ident)\s*\(/o) { + print "FUNC($1)\n" if ($dbg_values > 1); + $type = 'V'; + $av_pending = 'V'; + + } elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) { + if (defined $2 && $type eq 'C' || $type eq 'T') { + $av_pend_colon = 'B'; + } elsif ($type eq 'E') { + $av_pend_colon = 'L'; + } + print "IDENT_COLON($1,$type>$av_pend_colon)\n" if ($dbg_values > 1); + $type = 'V'; + + } elsif ($cur =~ /^($Ident|$Constant)/o) { + print "IDENT($1)\n" if ($dbg_values > 1); + $type = 'V'; + + } elsif ($cur =~ /^($Assignment)/o) { + print "ASSIGN($1)\n" if ($dbg_values > 1); + $type = 'N'; + + } elsif ($cur =~/^(;|{|})/) { + print "END($1)\n" if ($dbg_values > 1); + $type = 'E'; + $av_pend_colon = 'O'; + + } elsif ($cur =~/^(,)/) { + print "COMMA($1)\n" if ($dbg_values > 1); + $type = 'C'; + + } elsif ($cur =~ /^(\?)/o) { + print "QUESTION($1)\n" if ($dbg_values > 1); + $type = 'N'; + + } elsif ($cur =~ /^(:)/o) { + print "COLON($1,$av_pend_colon)\n" if ($dbg_values > 1); + + substr($var, length($res), 1, $av_pend_colon); + if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') { + $type = 'E'; + } else { + $type = 'N'; + } + $av_pend_colon = 'O'; + + } elsif ($cur =~ /^(\[)/o) { + print "CLOSE($1)\n" if ($dbg_values > 1); + $type = 'N'; + + } elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) { + my $variant; + + print "OPV($1)\n" if ($dbg_values > 1); + if ($type eq 'V') { + $variant = 'B'; + } else { + $variant = 'U'; + } + + substr($var, length($res), 1, $variant); + $type = 'N'; + + } elsif ($cur =~ /^($Operators)/o) { + print "OP($1)\n" if ($dbg_values > 1); + if ($1 ne '++' && $1 ne '--') { + $type = 'N'; + } + + } elsif ($cur =~ /(^.)/o) { + print "C($1)\n" if ($dbg_values > 1); + } + if (defined $1) { + $cur = substr($cur, length($1)); + $res .= $type x length($1); + } + } + + return ($res, $var); +} + +sub possible { + my ($possible, $line) = @_; + my $notPermitted = qr{(?: + ^(?: + $Modifier| + $Storage| + $Type| + DEFINE_\S+ + )$| + ^(?: + goto| + return| + case| + else| + asm|__asm__| + do| + \#| + \#\#| + )(?:\s|$)| + ^(?:typedef|struct|enum)\b + )}x; + warn "CHECK<$possible> ($line)\n" if ($dbg_possible > 2); + if ($possible !~ $notPermitted) { + # Check for modifiers. + $possible =~ s/\s*$Storage\s*//g; + $possible =~ s/\s*$Sparse\s*//g; + if ($possible =~ /^\s*$/) { + + } elsif ($possible =~ /\s/) { + $possible =~ s/\s*$Type\s*//g; + for my $modifier (split(' ', $possible)) { + if ($modifier !~ $notPermitted) { + warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible); + push(@modifierListFile, $modifier); + } + } + + } else { + warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible); + push(@typeListFile, $possible); + } + build_types(); + } else { + warn "NOTPOSS: $possible ($line)\n" if ($dbg_possible > 1); + } +} + +my $prefix = ''; + +sub show_type { + my ($type) = @_; + + $type =~ tr/[a-z]/[A-Z]/; + + return defined $use_type{$type} if (scalar keys %use_type > 0); + + return !defined $ignore_type{$type}; +} + +sub report { + my ($level, $type, $msg) = @_; + + if (!show_type($type) || + (defined $tst_only && $msg !~ /\Q$tst_only\E/)) { + return 0; + } + my $output = ''; + if ($color) { + if ($level eq 'ERROR') { + $output .= RED; + } elsif ($level eq 'WARNING') { + $output .= YELLOW; + } else { + $output .= GREEN; + } + } + $output .= $prefix . $level . ':'; + if ($show_types) { + $output .= BLUE if ($color); + $output .= "$type:"; + } + $output .= RESET if ($color); + $output .= ' ' . $msg . "\n"; + + if ($showfile) { + my @lines = split("\n", $output, -1); + splice(@lines, 1, 1); + $output = join("\n", @lines); + } + $output = (split('\n', $output))[0] . "\n" if ($terse); + + push(our @report, $output); + + return 1; +} + +sub report_dump { + our @report; +} + +sub fixup_current_range { + my ($lineRef, $offset, $length) = @_; + + if ($$lineRef =~ /^\@\@ -\d+,\d+ \+(\d+),(\d+) \@\@/) { + my $o = $1; + my $l = $2; + my $no = $o + $offset; + my $nl = $l + $length; + $$lineRef =~ s/\+$o,$l \@\@/\+$no,$nl \@\@/; + } +} + +sub fix_inserted_deleted_lines { + my ($linesRef, $insertedRef, $deletedRef) = @_; + + my $range_last_linenr = 0; + my $delta_offset = 0; + + my $old_linenr = 0; + my $new_linenr = 0; + + my $next_insert = 0; + my $next_delete = 0; + + my @lines = (); + + my $inserted = @{$insertedRef}[$next_insert++]; + my $deleted = @{$deletedRef}[$next_delete++]; + + foreach my $old_line (@{$linesRef}) { + my $save_line = 1; + my $line = $old_line; #don't modify the array + if ($line =~ /^(?:\+\+\+|\-\-\-)\s+\S+/) { #new filename + $delta_offset = 0; + } elsif ($line =~ /^\@\@ -\d+,\d+ \+\d+,\d+ \@\@/) { #new hunk + $range_last_linenr = $new_linenr; + fixup_current_range(\$line, $delta_offset, 0); + } + + while (defined($deleted) && ${$deleted}{'LINENR'} == $old_linenr) { + $deleted = @{$deletedRef}[$next_delete++]; + $save_line = 0; + fixup_current_range(\$lines[$range_last_linenr], $delta_offset--, -1); + } + + while (defined($inserted) && ${$inserted}{'LINENR'} == $old_linenr) { + push(@lines, ${$inserted}{'LINE'}); + $inserted = @{$insertedRef}[$next_insert++]; + $new_linenr++; + fixup_current_range(\$lines[$range_last_linenr], $delta_offset++, 1); + } + + if ($save_line) { + push(@lines, $line); + $new_linenr++; + } + + $old_linenr++; + } + + return @lines; +} + +sub fix_insert_line { + my ($linenr, $line) = @_; + + my $inserted = { + LINENR => $linenr, + LINE => $line, + }; + push(@fixed_inserted, $inserted); +} + +sub fix_delete_line { + my ($linenr, $line) = @_; + + my $deleted = { + LINENR => $linenr, + LINE => $line, + }; + + push(@fixed_deleted, $deleted); +} + +sub ERROR { + my ($type, $msg) = @_; + + if (report("ERROR", $type, $msg)) { + our $clean = 0; + our $cnt_error++; + return 1; + } + return 0; +} +sub WARN { + my ($type, $msg) = @_; + + if (report("WARNING", $type, $msg)) { + our $clean = 0; + our $cnt_warn++; + return 1; + } + return 0; +} +sub CHK { + my ($type, $msg) = @_; + + if ($check && report("CHECK", $type, $msg)) { + our $clean = 0; + our $cnt_chk++; + return 1; + } + return 0; +} + +sub check_absolute_file { + my ($absolute, $herecurr) = @_; + my $file = $absolute; + + ##print "absolute<$absolute>\n"; + + # See if any suffix of this path is a path within the tree. + while ($file =~ s@^[^/]*/@@) { + if (-f "$root/$file") { + ##print "file<$file>\n"; + last; + } + } + if (! -f _) { + return 0; + } + + # It is, so see if the prefix is acceptable. + my $prefix = $absolute; + substr($prefix, -length($file)) = ''; + + ##print "prefix<$prefix>\n"; + if ($prefix ne ".../") { + WARN("USE_RELATIVE_PATH", + "use relative pathname instead of absolute in changelog text\n" . $herecurr); + } +} + +sub trim { + my ($string) = @_; + + $string =~ s/^\s+|\s+$//g; + + return $string; +} + +sub ltrim { + my ($string) = @_; + + $string =~ s/^\s+//; + + return $string; +} + +sub rtrim { + my ($string) = @_; + + $string =~ s/\s+$//; + + return $string; +} + +sub string_find_replace { + my ($string, $find, $replace) = @_; + + $string =~ s/$find/$replace/g; + + return $string; +} + +sub tabify { + my ($leading) = @_; + + my $source_indent = $tabsize; + my $max_spaces_before_tab = $source_indent - 1; + my $spaces_to_tab = " " x $source_indent; + + #convert leading spaces to tabs + 1 while $leading =~ s@^([\t]*)$spaces_to_tab@$1\t@g; + #Remove spaces before a tab + 1 while $leading =~ s@^([\t]*)( {1,$max_spaces_before_tab})\t@$1\t@g; + + return "$leading"; +} + +sub pos_last_openparen { + my ($line) = @_; + + my $pos = 0; + + my $opens = $line =~ tr/\(/\(/; + my $closes = $line =~ tr/\)/\)/; + + my $last_openparen = 0; + + if (($opens == 0) || ($closes >= $opens)) { + return -1; + } + + my $len = length($line); + + for ($pos = 0; $pos < $len; $pos++) { + my $string = substr($line, $pos); + if ($string =~ /^($FuncArg|$balanced_parens)/) { + $pos += length($1) - 1; + } elsif (substr($line, $pos, 1) eq '(') { + $last_openparen = $pos; + } elsif (index($string, '(') == -1) { + last; + } + } + + return length(expand_tabs(substr($line, 0, $last_openparen))) + 1; +} + +sub get_raw_comment { + my ($line, $rawline) = @_; + my $comment = ''; + + for my $i (0 .. (length($line) - 1)) { + if (substr($line, $i, 1) eq "$;") { + $comment .= substr($rawline, $i, 1); + } + } + + return $comment; +} + +sub process { + my $filename = shift; + + my $linenr=0; + my $prevline=""; + my $prevrawline=""; + my $stashline=""; + my $stashrawline=""; + + my $length; + my $indent; + my $previndent=0; + my $stashindent=0; + + our $clean = 1; + my $signoff = 0; + my $author = ''; + my $authorsignoff = 0; + my $author_sob = ''; + my $is_patch = 0; + my $is_binding_patch = -1; + my $in_header_lines = $file ? 0 : 1; + my $in_commit_log = 0; #Scanning lines before patch + my $has_patch_separator = 0; #Found a --- line + my $has_commit_log = 0; #Encountered lines before patch + my $commit_log_lines = 0; #Number of commit log lines + my $commit_log_possible_stack_dump = 0; + my $commit_log_long_line = 0; + my $commit_log_has_diff = 0; + my $reported_maintainer_file = 0; + my $non_utf8_charset = 0; + + my $last_blank_line = 0; + my $last_coalesced_string_linenr = -1; + + our @report = (); + our $cnt_lines = 0; + our $cnt_error = 0; + our $cnt_warn = 0; + our $cnt_chk = 0; + + # Trace the real file/line as we go. + my $realfile = ''; + my $realline = 0; + my $realcnt = 0; + my $here = ''; + my $context_function; #undef'd unless there's a known function + my $in_comment = 0; + my $comment_edge = 0; + my $first_line = 0; + my $p1_prefix = ''; + + my $prev_values = 'E'; + + # suppression flags + my %suppress_ifbraces; + my %suppress_whiletrailers; + my %suppress_export; + my $suppress_statement = 0; + + my %signatures = (); + + # Pre-scan the patch sanitizing the lines. + # Pre-scan the patch looking for any __setup documentation. + # + my @setup_docs = (); + my $setup_docs = 0; + + my $camelcase_file_seeded = 0; + + my $checklicenseline = 1; + + sanitise_line_reset(); + my $line; + foreach my $rawline (@rawlines) { + $linenr++; + $line = $rawline; + + push(@fixed, $rawline) if ($fix); + + if ($rawline=~/^\+\+\+\s+(\S+)/) { + $setup_docs = 0; + if ($1 =~ m@Documentation/admin-guide/kernel-parameters.txt$@) { + $setup_docs = 1; + } + #next; + } + if ($rawline =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) { + $realline=$1-1; + if (defined $2) { + $realcnt=$3+1; + } else { + $realcnt=1+1; + } + $in_comment = 0; + + # Guestimate if this is a continuing comment. Run + # the context looking for a comment "edge". If this + # edge is a close comment then we must be in a comment + # at context start. + my $edge; + my $cnt = $realcnt; + for (my $ln = $linenr + 1; $cnt > 0; $ln++) { + next if (defined $rawlines[$ln - 1] && + $rawlines[$ln - 1] =~ /^-/); + $cnt--; + #print "RAW<$rawlines[$ln - 1]>\n"; + last if (!defined $rawlines[$ln - 1]); + if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ && + $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) { + ($edge) = $1; + last; + } + } + if (defined $edge && $edge eq '*/') { + $in_comment = 1; + } + + # Guestimate if this is a continuing comment. If this + # is the start of a diff block and this line starts + # ' *' then it is very likely a comment. + if (!defined $edge && + $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@) + { + $in_comment = 1; + } + + ##print "COMMENT:$in_comment edge<$edge> $rawline\n"; + sanitise_line_reset($in_comment); + + } elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) { + # Standardise the strings and chars within the input to + # simplify matching -- only bother with positive lines. + $line = sanitise_line($rawline); + } + push(@lines, $line); + + if ($realcnt > 1) { + $realcnt-- if ($line =~ /^(?:\+| |$)/); + } else { + $realcnt = 0; + } + + #print "==>$rawline\n"; + #print "-->$line\n"; + + if ($setup_docs && $line =~ /^\+/) { + push(@setup_docs, $line); + } + } + + $prefix = ''; + + $realcnt = 0; + $linenr = 0; + $fixlinenr = -1; + foreach my $line (@lines) { + $linenr++; + $fixlinenr++; + my $sline = $line; #copy of $line + $sline =~ s/$;/ /g; #with comments as spaces + + my $rawline = $rawlines[$linenr - 1]; + my $raw_comment = get_raw_comment($line, $rawline); + +# check if it's a mode change, rename or start of a patch + if (!$in_commit_log && + ($line =~ /^ mode change [0-7]+ => [0-7]+ \S+\s*$/ || + ($line =~ /^rename (?:from|to) \S+\s*$/ || + $line =~ /^diff --git a\/[\w\/\.\_\-]+ b\/\S+\s*$/))) { + $is_patch = 1; + } + +#extract the line range in the file after the patch is applied + if (!$in_commit_log && + $line =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@(.*)/) { + my $context = $4; + $is_patch = 1; + $first_line = $linenr + 1; + $realline=$1-1; + if (defined $2) { + $realcnt=$3+1; + } else { + $realcnt=1+1; + } + annotate_reset(); + $prev_values = 'E'; + + %suppress_ifbraces = (); + %suppress_whiletrailers = (); + %suppress_export = (); + $suppress_statement = 0; + if ($context =~ /\b(\w+)\s*\(/) { + $context_function = $1; + } else { + undef $context_function; + } + next; + +# track the line number as we move through the hunk, note that +# new versions of GNU diff omit the leading space on completely +# blank context lines so we need to count that too. + } elsif ($line =~ /^( |\+|$)/) { + $realline++; + $realcnt-- if ($realcnt != 0); + + # Measure the line length and indent. + ($length, $indent) = line_stats($rawline); + + # Track the previous line. + ($prevline, $stashline) = ($stashline, $line); + ($previndent, $stashindent) = ($stashindent, $indent); + ($prevrawline, $stashrawline) = ($stashrawline, $rawline); + + #warn "line<$line>\n"; + + } elsif ($realcnt == 1) { + $realcnt--; + } + + my $hunk_line = ($realcnt != 0); + + $here = "#$linenr: " if (!$file); + $here = "#$realline: " if ($file); + + my $found_file = 0; + # extract the filename as it passes + if ($line =~ /^diff --git.*?(\S+)$/) { + $realfile = $1; + $realfile =~ s@^([^/]*)/@@ if (!$file); + $in_commit_log = 0; + $found_file = 1; + } elsif ($line =~ /^\+\+\+\s+(\S+)/) { + $realfile = $1; + $realfile =~ s@^([^/]*)/@@ if (!$file); + $in_commit_log = 0; + + $p1_prefix = $1; + if (!$file && $tree && $p1_prefix ne '' && + -e "$root/$p1_prefix") { + WARN("PATCH_PREFIX", + "patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n"); + } + + if ($realfile =~ m@^include/asm/@) { + ERROR("MODIFIED_INCLUDE_ASM", + "do not modify files in include/asm, change architecture specific files in include/asm-\n" . "$here$rawline\n"); + } + $found_file = 1; + } + +#make up the handle for any error we report on this line + if ($showfile) { + $prefix = "$realfile:$realline: " + } elsif ($emacs) { + if ($file) { + $prefix = "$filename:$realline: "; + } else { + $prefix = "$filename:$linenr: "; + } + } + + if ($found_file) { + if (is_maintained_obsolete($realfile)) { + WARN("OBSOLETE", + "$realfile is marked as 'obsolete' in the MAINTAINERS hierarchy. No unnecessary modifications please.\n"); + } + if ($realfile =~ m@^(?:drivers/net/|net/|drivers/staging/)@) { + $check = 1; + } else { + $check = $check_orig; + } + $checklicenseline = 1; + + if ($realfile !~ /^MAINTAINERS/) { + my $last_binding_patch = $is_binding_patch; + + $is_binding_patch = () = $realfile =~ m@^(?:Documentation/devicetree/|include/dt-bindings/)@; + + if (($last_binding_patch != -1) && + ($last_binding_patch ^ $is_binding_patch)) { + WARN("DT_SPLIT_BINDING_PATCH", + "DT binding docs and includes should be a separate patch. See: Documentation/devicetree/bindings/submitting-patches.rst\n"); + } + } + + next; + } + + $here .= "FILE: $realfile:$realline:" if ($realcnt != 0); + + my $hereline = "$here\n$rawline\n"; + my $herecurr = "$here\n$rawline\n"; + my $hereprev = "$here\n$prevrawline\n$rawline\n"; + + $cnt_lines++ if ($realcnt != 0); + +# Verify the existence of a commit log if appropriate +# 2 is used because a $signature is counted in $commit_log_lines + if ($in_commit_log) { + if ($line !~ /^\s*$/) { + $commit_log_lines++; #could be a $signature + } + } elsif ($has_commit_log && $commit_log_lines < 2) { + WARN("COMMIT_MESSAGE", + "Missing commit description - Add an appropriate one\n"); + $commit_log_lines = 2; #warn only once + } + +# Check if the commit log has what seems like a diff which can confuse patch + if ($in_commit_log && !$commit_log_has_diff && + (($line =~ m@^\s+diff\b.*a/([\w/]+)@ && + $line =~ m@^\s+diff\b.*a/[\w/]+\s+b/$1\b@) || + $line =~ m@^\s*(?:\-\-\-\s+a/|\+\+\+\s+b/)@ || + $line =~ m/^\s*\@\@ \-\d+,\d+ \+\d+,\d+ \@\@/)) { + ERROR("DIFF_IN_COMMIT_MSG", + "Avoid using diff content in the commit message - patch(1) might not work\n" . $herecurr); + $commit_log_has_diff = 1; + } + +# Check for incorrect file permissions + if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) { + my $permhere = $here . "FILE: $realfile\n"; + if ($realfile !~ m@scripts/@ && + $realfile !~ /\.(py|pl|awk|sh)$/) { + ERROR("EXECUTE_PERMISSIONS", + "do not set execute permissions for source files\n" . $permhere); + } + } + +# Check the patch for a From: + if (decode("MIME-Header", $line) =~ /^From:\s*(.*)/) { + $author = $1; + my $curline = $linenr; + while(defined($rawlines[$curline]) && ($rawlines[$curline++] =~ /^[ \t]\s*(.*)/)) { + $author .= $1; + } + $author = encode("utf8", $author) if ($line =~ /=\?utf-8\?/i); + $author =~ s/"//g; + $author = reformat_email($author); + } + +# Check the patch for a signoff: + if ($line =~ /^\s*signed-off-by:\s*(.*)/i) { + $signoff++; + $in_commit_log = 0; + if ($author ne '' && $authorsignoff != 1) { + if (same_email_addresses($1, $author, 1)) { + $authorsignoff = 1; + } else { + my $ctx = $1; + my ($email_name, $email_comment, $email_address, $comment1) = parse_email($ctx); + my ($author_name, $author_comment, $author_address, $comment2) = parse_email($author); + + if ($email_address eq $author_address && $email_name eq $author_name) { + $author_sob = $ctx; + $authorsignoff = 2; + } elsif ($email_address eq $author_address) { + $author_sob = $ctx; + $authorsignoff = 3; + } elsif ($email_name eq $author_name) { + $author_sob = $ctx; + $authorsignoff = 4; + + my $address1 = $email_address; + my $address2 = $author_address; + + if ($address1 =~ /(\S+)\+\S+(\@.*)/) { + $address1 = "$1$2"; + } + if ($address2 =~ /(\S+)\+\S+(\@.*)/) { + $address2 = "$1$2"; + } + if ($address1 eq $address2) { + $authorsignoff = 5; + } + } + } + } + } + +# Check for patch separator + if ($line =~ /^---$/) { + $has_patch_separator = 1; + $in_commit_log = 0; + } + +# Check if MAINTAINERS is being updated. If so, there's probably no need to +# emit the "does MAINTAINERS need updating?" message on file add/move/delete + if ($line =~ /^\s*MAINTAINERS\s*\|/) { + $reported_maintainer_file = 1; + } + +# Check signature styles + if (!$in_header_lines && + $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) { + my $space_before = $1; + my $sign_off = $2; + my $space_after = $3; + my $email = $4; + my $ucfirst_sign_off = ucfirst(lc($sign_off)); + + if ($sign_off !~ /$signature_tags/) { + WARN("BAD_SIGN_OFF", + "Non-standard signature: $sign_off\n" . $herecurr); + } + if (defined $space_before && $space_before ne "") { + if (WARN("BAD_SIGN_OFF", + "Do not use whitespace before $ucfirst_sign_off\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] = + "$ucfirst_sign_off $email"; + } + } + if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) { + if (WARN("BAD_SIGN_OFF", + "'$ucfirst_sign_off' is the preferred signature form\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] = + "$ucfirst_sign_off $email"; + } + + } + if (!defined $space_after || $space_after ne " ") { + if (WARN("BAD_SIGN_OFF", + "Use a single space after $ucfirst_sign_off\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] = + "$ucfirst_sign_off $email"; + } + } + + my ($email_name, $name_comment, $email_address, $comment) = parse_email($email); + my $suggested_email = format_email(($email_name, $name_comment, $email_address, $comment)); + if ($suggested_email eq "") { + ERROR("BAD_SIGN_OFF", + "Unrecognized email address: '$email'\n" . $herecurr); + } else { + my $dequoted = $suggested_email; + $dequoted =~ s/^"//; + $dequoted =~ s/" \]/) || + $line =~ /^(?:\s+\w+:\s+[0-9a-fA-F]+){3,3}/ || + $line =~ /^\s*\#\d+\s*\[[0-9a-fA-F]+\]\s*\w+ at [0-9a-fA-F]+/) { + # stack dump address styles + $commit_log_possible_stack_dump = 1; + } + +# Check for line lengths > 75 in commit log, warn once + if ($in_commit_log && !$commit_log_long_line && + length($line) > 75 && + !($line =~ /^\s*[a-zA-Z0-9_\/\.]+\s+\|\s+\d+/ || + # file delta changes + $line =~ /^\s*(?:[\w\.\-]+\/)++[\w\.\-]+:/ || + # filename then : + $line =~ /^\s*(?:Fixes:|Link:)/i || + # A Fixes: or Link: line + $commit_log_possible_stack_dump)) { + WARN("COMMIT_LOG_LONG_LINE", + "Possible unwrapped commit description (prefer a maximum 75 chars per line)\n" . $herecurr); + $commit_log_long_line = 1; + } + +# Reset possible stack dump if a blank line is found + if ($in_commit_log && $commit_log_possible_stack_dump && + $line =~ /^\s*$/) { + $commit_log_possible_stack_dump = 0; + } + +# Check for git id commit length and improperly formed commit descriptions + if ($in_commit_log && !$commit_log_possible_stack_dump && + $line !~ /^\s*(?:Link|Patchwork|http|https|BugLink|base-commit):/i && + $line !~ /^This reverts commit [0-9a-f]{7,40}/ && + ($line =~ /\bcommit\s+[0-9a-f]{5,}\b/i || + ($line =~ /(?:\s|^)[0-9a-f]{12,40}(?:[\s"'\(\[]|$)/i && + $line !~ /[\<\[][0-9a-f]{12,40}[\>\]]/i && + $line !~ /\bfixes:\s*[0-9a-f]{12,40}/i))) { + my $init_char = "c"; + my $orig_commit = ""; + my $short = 1; + my $long = 0; + my $case = 1; + my $space = 1; + my $hasdesc = 0; + my $hasparens = 0; + my $id = '0123456789ab'; + my $orig_desc = "commit description"; + my $description = ""; + + if ($line =~ /\b(c)ommit\s+([0-9a-f]{5,})\b/i) { + $init_char = $1; + $orig_commit = lc($2); + } elsif ($line =~ /\b([0-9a-f]{12,40})\b/i) { + $orig_commit = lc($1); + } + + $short = 0 if ($line =~ /\bcommit\s+[0-9a-f]{12,40}/i); + $long = 1 if ($line =~ /\bcommit\s+[0-9a-f]{41,}/i); + $space = 0 if ($line =~ /\bcommit [0-9a-f]/i); + $case = 0 if ($line =~ /\b[Cc]ommit\s+[0-9a-f]{5,40}[^A-F]/); + if ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)"\)/i) { + $orig_desc = $1; + $hasparens = 1; + } elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s*$/i && + defined $rawlines[$linenr] && + $rawlines[$linenr] =~ /^\s*\("([^"]+)"\)/) { + $orig_desc = $1; + $hasparens = 1; + } elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("[^"]+$/i && + defined $rawlines[$linenr] && + $rawlines[$linenr] =~ /^\s*[^"]+"\)/) { + $line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)$/i; + $orig_desc = $1; + $rawlines[$linenr] =~ /^\s*([^"]+)"\)/; + $orig_desc .= " " . $1; + $hasparens = 1; + } + + ($id, $description) = git_commit_info($orig_commit, + $id, $orig_desc); + + if (defined($id) && + ($short || $long || $space || $case || ($orig_desc ne $description) || !$hasparens)) { + ERROR("GIT_COMMIT_ID", + "Please use git commit description style 'commit <12+ chars of sha1> (\"\")' - ie: '${init_char}ommit $id (\"$description\")'\n" . $herecurr); + } + } + +# Check for added, moved or deleted files + if (!$reported_maintainer_file && !$in_commit_log && + ($line =~ /^(?:new|deleted) file mode\s*\d+\s*$/ || + $line =~ /^rename (?:from|to) [\w\/\.\-]+\s*$/ || + ($line =~ /\{\s*([\w\/\.\-]*)\s*\=\>\s*([\w\/\.\-]*)\s*\}/ && + (defined($1) || defined($2))))) { + $is_patch = 1; + $reported_maintainer_file = 1; + WARN("FILE_PATH_CHANGES", + "added, moved or deleted file(s), does MAINTAINERS need updating?\n" . $herecurr); + } + +# Check for adding new DT bindings not in schema format + if (!$in_commit_log && + ($line =~ /^new file mode\s*\d+\s*$/) && + ($realfile =~ m@^Documentation/devicetree/bindings/.*\.txt$@)) { + WARN("DT_SCHEMA_BINDING_PATCH", + "DT bindings should be in DT schema format. See: Documentation/devicetree/writing-schema.rst\n"); + } + +# Check for wrappage within a valid hunk of the file + if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) { + ERROR("CORRUPTED_PATCH", + "patch seems to be corrupt (line wrapped?)\n" . + $herecurr) if (!$emitted_corrupt++); + } + +# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php + if (($realfile =~ /^$/ || $line =~ /^\+/) && + $rawline !~ m/^$UTF8*$/) { + my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/); + + my $blank = copy_spacing($rawline); + my $ptr = substr($blank, 0, length($utf8_prefix)) . "^"; + my $hereptr = "$hereline$ptr\n"; + + CHK("INVALID_UTF8", + "Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr); + } + +# Check if it's the start of a commit log +# (not a header line and we haven't seen the patch filename) + if ($in_header_lines && $realfile =~ /^$/ && + !($rawline =~ /^\s+(?:\S|$)/ || + $rawline =~ /^(?:commit\b|from\b|[\w-]+:)/i)) { + $in_header_lines = 0; + $in_commit_log = 1; + $has_commit_log = 1; + } + +# Check if there is UTF-8 in a commit log when a mail header has explicitly +# declined it, i.e defined some charset where it is missing. + if ($in_header_lines && + $rawline =~ /^Content-Type:.+charset="(.+)".*$/ && + $1 !~ /utf-8/i) { + $non_utf8_charset = 1; + } + + if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ && + $rawline =~ /$NON_ASCII_UTF8/) { + WARN("UTF8_BEFORE_PATCH", + "8-bit UTF-8 used in possible commit log\n" . $herecurr); + } + +# Check for absolute kernel paths in commit message + if ($tree && $in_commit_log) { + while ($line =~ m{(?:^|\s)(/\S*)}g) { + my $file = $1; + + if ($file =~ m{^(.*?)(?::\d+)+:?$} && + check_absolute_file($1, $herecurr)) { + # + } else { + check_absolute_file($file, $herecurr); + } + } + } + +# Check for various typo / spelling mistakes + if (defined($misspellings) && + ($in_commit_log || $line =~ /^(?:\+|Subject:)/i)) { + while ($rawline =~ /(?:^|[^a-z@])($misspellings)(?:\b|$|[^a-z@])/gi) { + my $typo = $1; + my $typo_fix = $spelling_fix{lc($typo)}; + $typo_fix = ucfirst($typo_fix) if ($typo =~ /^[A-Z]/); + $typo_fix = uc($typo_fix) if ($typo =~ /^[A-Z]+$/); + my $msg_level = \&WARN; + $msg_level = \&CHK if ($file); + if (&{$msg_level}("TYPO_SPELLING", + "'$typo' may be misspelled - perhaps '$typo_fix'?\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/(^|[^A-Za-z@])($typo)($|[^A-Za-z@])/$1$typo_fix$3/; + } + } + } + +# check for invalid commit id + if ($in_commit_log && $line =~ /(^fixes:|\bcommit)\s+([0-9a-f]{6,40})\b/i) { + my $id; + my $description; + ($id, $description) = git_commit_info($2, undef, undef); + if (!defined($id)) { + WARN("UNKNOWN_COMMIT_ID", + "Unknown commit id '$2', maybe rebased or not pulled?\n" . $herecurr); + } + } + +# check for repeated words separated by a single space + if ($rawline =~ /^\+/ || $in_commit_log) { + while ($rawline =~ /\b($word_pattern) (?=($word_pattern))/g) { + + my $first = $1; + my $second = $2; + + if ($first =~ /(?:struct|union|enum)/) { + pos($rawline) += length($first) + length($second) + 1; + next; + } + + next if ($first ne $second); + next if ($first eq 'long'); + + if (WARN("REPEATED_WORD", + "Possible repeated word: '$first'\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/\b$first $second\b/$first/; + } + } + + # if it's a repeated word on consecutive lines in a comment block + if ($prevline =~ /$;+\s*$/ && + $prevrawline =~ /($word_pattern)\s*$/) { + my $last_word = $1; + if ($rawline =~ /^\+\s*\*\s*$last_word /) { + if (WARN("REPEATED_WORD", + "Possible repeated word: '$last_word'\n" . $hereprev) && + $fix) { + $fixed[$fixlinenr] =~ s/(\+\s*\*\s*)$last_word /$1/; + } + } + } + } + +# ignore non-hunk lines and lines being removed + next if (!$hunk_line || $line =~ /^-/); + +#trailing whitespace + if ($line =~ /^\+.*\015/) { + my $herevet = "$here\n" . cat_vet($rawline) . "\n"; + if (ERROR("DOS_LINE_ENDINGS", + "DOS line endings\n" . $herevet) && + $fix) { + $fixed[$fixlinenr] =~ s/[\s\015]+$//; + } + } elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) { + my $herevet = "$here\n" . cat_vet($rawline) . "\n"; + if (ERROR("TRAILING_WHITESPACE", + "trailing whitespace\n" . $herevet) && + $fix) { + $fixed[$fixlinenr] =~ s/\s+$//; + } + + $rpt_cleaners = 1; + } + +# Check for FSF mailing addresses. + if ($rawline =~ /\bwrite to the Free/i || + $rawline =~ /\b675\s+Mass\s+Ave/i || + $rawline =~ /\b59\s+Temple\s+Pl/i || + $rawline =~ /\b51\s+Franklin\s+St/i) { + my $herevet = "$here\n" . cat_vet($rawline) . "\n"; + my $msg_level = \&ERROR; + $msg_level = \&CHK if ($file); + &{$msg_level}("FSF_MAILING_ADDRESS", + "Do not include the paragraph about writing to the Free Software Foundation's mailing address from the sample GPL notice. The FSF has changed addresses in the past, and may do so again. Linux already includes a copy of the GPL.\n" . $herevet) + } + +# check for Kconfig help text having a real description +# Only applies when adding the entry originally, after that we do not have +# sufficient context to determine whether it is indeed long enough. + if ($realfile =~ /Kconfig/ && + # 'choice' is usually the last thing on the line (though + # Kconfig supports named choices), so use a word boundary + # (\b) rather than a whitespace character (\s) + $line =~ /^\+\s*(?:config|menuconfig|choice)\b/) { + my $length = 0; + my $cnt = $realcnt; + my $ln = $linenr + 1; + my $f; + my $is_start = 0; + my $is_end = 0; + for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) { + $f = $lines[$ln - 1]; + $cnt-- if ($lines[$ln - 1] !~ /^-/); + $is_end = $lines[$ln - 1] =~ /^\+/; + + next if ($f =~ /^-/); + last if (!$file && $f =~ /^\@\@/); + + if ($lines[$ln - 1] =~ /^\+\s*(?:bool|tristate|prompt)\s*["']/) { + $is_start = 1; + } elsif ($lines[$ln - 1] =~ /^\+\s*(?:---)?help(?:---)?$/) { + $length = -1; + } + + $f =~ s/^.//; + $f =~ s/#.*//; + $f =~ s/^\s+//; + next if ($f =~ /^$/); + + # This only checks context lines in the patch + # and so hopefully shouldn't trigger false + # positives, even though some of these are + # common words in help texts + if ($f =~ /^\s*(?:config|menuconfig|choice|endchoice| + if|endif|menu|endmenu|source)\b/x) { + $is_end = 1; + last; + } + $length++; + } + if ($is_start && $is_end && $length < $min_conf_desc_length) { + WARN("CONFIG_DESCRIPTION", + "please write a paragraph that describes the config symbol fully\n" . $herecurr); + } + #print "is_start<$is_start> is_end<$is_end> length<$length>\n"; + } + +# check MAINTAINERS entries + if ($realfile =~ /^MAINTAINERS$/) { +# check MAINTAINERS entries for the right form + if ($rawline =~ /^\+[A-Z]:/ && + $rawline !~ /^\+[A-Z]:\t\S/) { + if (WARN("MAINTAINERS_STYLE", + "MAINTAINERS entries use one tab after TYPE:\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/^(\+[A-Z]):\s*/$1:\t/; + } + } +# check MAINTAINERS entries for the right ordering too + my $preferred_order = 'MRLSWQBCPTFXNK'; + if ($rawline =~ /^\+[A-Z]:/ && + $prevrawline =~ /^[\+ ][A-Z]:/) { + $rawline =~ /^\+([A-Z]):\s*(.*)/; + my $cur = $1; + my $curval = $2; + $prevrawline =~ /^[\+ ]([A-Z]):\s*(.*)/; + my $prev = $1; + my $prevval = $2; + my $curindex = index($preferred_order, $cur); + my $previndex = index($preferred_order, $prev); + if ($curindex < 0) { + WARN("MAINTAINERS_STYLE", + "Unknown MAINTAINERS entry type: '$cur'\n" . $herecurr); + } else { + if ($previndex >= 0 && $curindex < $previndex) { + WARN("MAINTAINERS_STYLE", + "Misordered MAINTAINERS entry - list '$cur:' before '$prev:'\n" . $hereprev); + } elsif ((($prev eq 'F' && $cur eq 'F') || + ($prev eq 'X' && $cur eq 'X')) && + ($prevval cmp $curval) > 0) { + WARN("MAINTAINERS_STYLE", + "Misordered MAINTAINERS entry - list file patterns in alphabetic order\n" . $hereprev); + } + } + } + } + +# discourage the use of boolean for type definition attributes of Kconfig options + if ($realfile =~ /Kconfig/ && + $line =~ /^\+\s*\bboolean\b/) { + WARN("CONFIG_TYPE_BOOLEAN", + "Use of boolean is deprecated, please use bool instead.\n" . $herecurr); + } + + if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) && + ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) { + my $flag = $1; + my $replacement = { + 'EXTRA_AFLAGS' => 'asflags-y', + 'EXTRA_CFLAGS' => 'ccflags-y', + 'EXTRA_CPPFLAGS' => 'cppflags-y', + 'EXTRA_LDFLAGS' => 'ldflags-y', + }; + + WARN("DEPRECATED_VARIABLE", + "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.\n" . $herecurr) if ($replacement->{$flag}); + } + +# check for DT compatible documentation + if (defined $root && + (($realfile =~ /\.dtsi?$/ && $line =~ /^\+\s*compatible\s*=\s*\"/) || + ($realfile =~ /\.[ch]$/ && $line =~ /^\+.*\.compatible\s*=\s*\"/))) { + + my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g; + + my $dt_path = $root . "/Documentation/devicetree/bindings/"; + my $vp_file = $dt_path . "vendor-prefixes.yaml"; + + foreach my $compat (@compats) { + my $compat2 = $compat; + $compat2 =~ s/\,[a-zA-Z0-9]*\-/\,<\.\*>\-/; + my $compat3 = $compat; + $compat3 =~ s/\,([a-z]*)[0-9]*\-/\,$1<\.\*>\-/; + `grep -Erq "$compat|$compat2|$compat3" $dt_path`; + if ( $? >> 8 ) { + WARN("UNDOCUMENTED_DT_STRING", + "DT compatible string \"$compat\" appears un-documented -- check $dt_path\n" . $herecurr); + } + + next if $compat !~ /^([a-zA-Z0-9\-]+)\,/; + my $vendor = $1; + `grep -Eq "\\"\\^\Q$vendor\E,\\.\\*\\":" $vp_file`; + if ( $? >> 8 ) { + WARN("UNDOCUMENTED_DT_STRING", + "DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file\n" . $herecurr); + } + } + } + +# check for using SPDX license tag at beginning of files + if ($realline == $checklicenseline) { + if ($rawline =~ /^[ \+]\s*\#\!\s*\//) { + $checklicenseline = 2; + } elsif ($rawline =~ /^\+/) { + my $comment = ""; + if ($realfile =~ /\.(h|s|S)$/) { + $comment = '/*'; + } elsif ($realfile =~ /\.(c|dts|dtsi)$/) { + $comment = '//'; + } elsif (($checklicenseline == 2) || $realfile =~ /\.(sh|pl|py|awk|tc|yaml)$/) { + $comment = '#'; + } elsif ($realfile =~ /\.rst$/) { + $comment = '..'; + } + +# check SPDX comment style for .[chsS] files + if ($realfile =~ /\.[chsS]$/ && + $rawline =~ /SPDX-License-Identifier:/ && + $rawline !~ m@^\+\s*\Q$comment\E\s*@) { + WARN("SPDX_LICENSE_TAG", + "Improper SPDX comment style for '$realfile', please use '$comment' instead\n" . $herecurr); + } + + if ($comment !~ /^$/ && + $rawline !~ m@^\+\Q$comment\E SPDX-License-Identifier: @) { + WARN("SPDX_LICENSE_TAG", + "Missing or malformed SPDX-License-Identifier tag in line $checklicenseline\n" . $herecurr); + } elsif ($rawline =~ /(SPDX-License-Identifier: .*)/) { + my $spdx_license = $1; + if (!is_SPDX_License_valid($spdx_license)) { + WARN("SPDX_LICENSE_TAG", + "'$spdx_license' is not supported in LICENSES/...\n" . $herecurr); + } + if ($realfile =~ m@^Documentation/devicetree/bindings/@ && + not $spdx_license =~ /GPL-2\.0.*BSD-2-Clause/) { + my $msg_level = \&WARN; + $msg_level = \&CHK if ($file); + if (&{$msg_level}("SPDX_LICENSE_TAG", + + "DT binding documents should be licensed (GPL-2.0-only OR BSD-2-Clause)\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/SPDX-License-Identifier: .*/SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)/; + } + } + } + } + } + +# check for embedded filenames + if ($rawline =~ /^\+.*\Q$realfile\E/) { + WARN("EMBEDDED_FILENAME", + "It's generally not useful to have the filename in the file\n" . $herecurr); + } + +# check we are in a valid source file if not then ignore this hunk + next if ($realfile !~ /\.(h|c|s|S|sh|dtsi|dts)$/); + +# check for using SPDX-License-Identifier on the wrong line number + if ($realline != $checklicenseline && + $rawline =~ /\bSPDX-License-Identifier:/ && + substr($line, @-, @+ - @-) eq "$;" x (@+ - @-)) { + WARN("SPDX_LICENSE_TAG", + "Misplaced SPDX-License-Identifier tag - use line $checklicenseline instead\n" . $herecurr); + } + +# line length limit (with some exclusions) +# +# There are a few types of lines that may extend beyond $max_line_length: +# logging functions like pr_info that end in a string +# lines with a single string +# #defines that are a single string +# lines with an RFC3986 like URL +# +# There are 3 different line length message types: +# LONG_LINE_COMMENT a comment starts before but extends beyond $max_line_length +# LONG_LINE_STRING a string starts before but extends beyond $max_line_length +# LONG_LINE all other lines longer than $max_line_length +# +# if LONG_LINE is ignored, the other 2 types are also ignored +# + + if ($line =~ /^\+/ && $length > $max_line_length) { + my $msg_type = "LONG_LINE"; + + # Check the allowed long line types first + + # logging functions that end in a string that starts + # before $max_line_length + if ($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(?:KERN_\S+\s*|[^"]*))?($String\s*(?:|,|\)\s*;)\s*)$/ && + length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) { + $msg_type = ""; + + # lines with only strings (w/ possible termination) + # #defines with only strings + } elsif ($line =~ /^\+\s*$String\s*(?:\s*|,|\)\s*;)\s*$/ || + $line =~ /^\+\s*#\s*define\s+\w+\s+$String$/) { + $msg_type = ""; + + # More special cases + } elsif ($line =~ /^\+.*\bEFI_GUID\s*\(/ || + $line =~ /^\+\s*(?:\w+)?\s*DEFINE_PER_CPU/) { + $msg_type = ""; + + # URL ($rawline is used in case the URL is in a comment) + } elsif ($rawline =~ /^\+.*\b[a-z][\w\.\+\-]*:\/\/\S+/i) { + $msg_type = ""; + + # Otherwise set the alternate message types + + # a comment starts before $max_line_length + } elsif ($line =~ /($;[\s$;]*)$/ && + length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) { + $msg_type = "LONG_LINE_COMMENT" + + # a quoted string starts before $max_line_length + } elsif ($sline =~ /\s*($String(?:\s*(?:\\|,\s*|\)\s*;\s*))?)$/ && + length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) { + $msg_type = "LONG_LINE_STRING" + } + + if ($msg_type ne "" && + (show_type("LONG_LINE") || show_type($msg_type))) { + my $msg_level = \&WARN; + $msg_level = \&CHK if ($file); + &{$msg_level}($msg_type, + "line length of $length exceeds $max_line_length columns\n" . $herecurr); + } + } + +# check for adding lines without a newline. + if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) { + WARN("MISSING_EOF_NEWLINE", + "adding a line without newline at end of file\n" . $herecurr); + } + +# check we are in a valid source file C or perl if not then ignore this hunk + next if ($realfile !~ /\.(h|c|pl|dtsi|dts)$/); + +# at the beginning of a line any tabs must come first and anything +# more than $tabsize must use tabs. + if ($rawline =~ /^\+\s* \t\s*\S/ || + $rawline =~ /^\+\s* \s*/) { + my $herevet = "$here\n" . cat_vet($rawline) . "\n"; + $rpt_cleaners = 1; + if (ERROR("CODE_INDENT", + "code indent should use tabs where possible\n" . $herevet) && + $fix) { + $fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e; + } + } + +# check for space before tabs. + if ($rawline =~ /^\+/ && $rawline =~ / \t/) { + my $herevet = "$here\n" . cat_vet($rawline) . "\n"; + if (WARN("SPACE_BEFORE_TAB", + "please, no space before tabs\n" . $herevet) && + $fix) { + while ($fixed[$fixlinenr] =~ + s/(^\+.*) {$tabsize,$tabsize}\t/$1\t\t/) {} + while ($fixed[$fixlinenr] =~ + s/(^\+.*) +\t/$1\t/) {} + } + } + +# check for assignments on the start of a line + if ($sline =~ /^\+\s+($Assignment)[^=]/) { + CHK("ASSIGNMENT_CONTINUATIONS", + "Assignment operator '$1' should be on the previous line\n" . $hereprev); + } + +# check for && or || at the start of a line + if ($rawline =~ /^\+\s*(&&|\|\|)/) { + CHK("LOGICAL_CONTINUATIONS", + "Logical continuations should be on the previous line\n" . $hereprev); + } + +# check indentation starts on a tab stop + if ($perl_version_ok && + $sline =~ /^\+\t+( +)(?:$c90_Keywords\b|\{\s*$|\}\s*(?:else\b|while\b|\s*$)|$Declare\s*$Ident\s*[;=])/) { + my $indent = length($1); + if ($indent % $tabsize) { + if (WARN("TABSTOP", + "Statements should start on a tabstop\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s@(^\+\t+) +@$1 . "\t" x ($indent/$tabsize)@e; + } + } + } + +# check multi-line statement indentation matches previous line + if ($perl_version_ok && + $prevline =~ /^\+([ \t]*)((?:$c90_Keywords(?:\s+if)\s*)|(?:$Declare\s*)?(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*|(?:\*\s*)*$Lval\s*=\s*$Ident\s*)\(.*(\&\&|\|\||,)\s*$/) { + $prevline =~ /^\+(\t*)(.*)$/; + my $oldindent = $1; + my $rest = $2; + + my $pos = pos_last_openparen($rest); + if ($pos >= 0) { + $line =~ /^(\+| )([ \t]*)/; + my $newindent = $2; + + my $goodtabindent = $oldindent . + "\t" x ($pos / $tabsize) . + " " x ($pos % $tabsize); + my $goodspaceindent = $oldindent . " " x $pos; + + if ($newindent ne $goodtabindent && + $newindent ne $goodspaceindent) { + + if (CHK("PARENTHESIS_ALIGNMENT", + "Alignment should match open parenthesis\n" . $hereprev) && + $fix && $line =~ /^\+/) { + $fixed[$fixlinenr] =~ + s/^\+[ \t]*/\+$goodtabindent/; + } + } + } + } + +# check for space after cast like "(int) foo" or "(struct foo) bar" +# avoid checking a few false positives: +# "sizeof(<type>)" or "__alignof__(<type>)" +# function pointer declarations like "(*foo)(int) = bar;" +# structure definitions like "(struct foo) { 0 };" +# multiline macros that define functions +# known attributes or the __attribute__ keyword + if ($line =~ /^\+(.*)\(\s*$Type\s*\)([ \t]++)((?![={]|\\$|$Attribute|__attribute__))/ && + (!defined($1) || $1 !~ /\b(?:sizeof|__alignof__)\s*$/)) { + if (CHK("SPACING", + "No space is necessary after a cast\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ + s/(\(\s*$Type\s*\))[ \t]+/$1/; + } + } + +# Block comment styles +# Networking with an initial /* + if ($realfile =~ m@^(drivers/net/|net/)@ && + $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ && + $rawline =~ /^\+[ \t]*\*/ && + $realline > 3) { # Do not warn about the initial copyright comment block after SPDX-License-Identifier + WARN("NETWORKING_BLOCK_COMMENT_STYLE", + "networking block comments don't use an empty /* line, use /* Comment...\n" . $hereprev); + } + +# Block comments use * on subsequent lines + if ($prevline =~ /$;[ \t]*$/ && #ends in comment + $prevrawline =~ /^\+.*?\/\*/ && #starting /* + $prevrawline !~ /\*\/[ \t]*$/ && #no trailing */ + $rawline =~ /^\+/ && #line is new + $rawline !~ /^\+[ \t]*\*/) { #no leading * + WARN("BLOCK_COMMENT_STYLE", + "Block comments use * on subsequent lines\n" . $hereprev); + } + +# Block comments use */ on trailing lines + if ($rawline !~ m@^\+[ \t]*\*/[ \t]*$@ && #trailing */ + $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ && #inline /*...*/ + $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ && #trailing **/ + $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) { #non blank */ + WARN("BLOCK_COMMENT_STYLE", + "Block comments use a trailing */ on a separate line\n" . $herecurr); + } + +# Block comment * alignment + if ($prevline =~ /$;[ \t]*$/ && #ends in comment + $line =~ /^\+[ \t]*$;/ && #leading comment + $rawline =~ /^\+[ \t]*\*/ && #leading * + (($prevrawline =~ /^\+.*?\/\*/ && #leading /* + $prevrawline !~ /\*\/[ \t]*$/) || #no trailing */ + $prevrawline =~ /^\+[ \t]*\*/)) { #leading * + my $oldindent; + $prevrawline =~ m@^\+([ \t]*/?)\*@; + if (defined($1)) { + $oldindent = expand_tabs($1); + } else { + $prevrawline =~ m@^\+(.*/?)\*@; + $oldindent = expand_tabs($1); + } + $rawline =~ m@^\+([ \t]*)\*@; + my $newindent = $1; + $newindent = expand_tabs($newindent); + if (length($oldindent) ne length($newindent)) { + WARN("BLOCK_COMMENT_STYLE", + "Block comments should align the * on each line\n" . $hereprev); + } + } + +# check for missing blank lines after struct/union declarations +# with exceptions for various attributes and macros + if ($prevline =~ /^[\+ ]};?\s*$/ && + $line =~ /^\+/ && + !($line =~ /^\+\s*$/ || + $line =~ /^\+\s*EXPORT_SYMBOL/ || + $line =~ /^\+\s*MODULE_/i || + $line =~ /^\+\s*\#\s*(?:end|elif|else)/ || + $line =~ /^\+[a-z_]*init/ || + $line =~ /^\+\s*(?:static\s+)?[A-Z_]*ATTR/ || + $line =~ /^\+\s*DECLARE/ || + $line =~ /^\+\s*builtin_[\w_]*driver/ || + $line =~ /^\+\s*__setup/)) { + if (CHK("LINE_SPACING", + "Please use a blank line after function/struct/union/enum declarations\n" . $hereprev) && + $fix) { + fix_insert_line($fixlinenr, "\+"); + } + } + +# check for multiple consecutive blank lines + if ($prevline =~ /^[\+ ]\s*$/ && + $line =~ /^\+\s*$/ && + $last_blank_line != ($linenr - 1)) { + if (CHK("LINE_SPACING", + "Please don't use multiple blank lines\n" . $hereprev) && + $fix) { + fix_delete_line($fixlinenr, $rawline); + } + + $last_blank_line = $linenr; + } + +# check for missing blank lines after declarations + if ($sline =~ /^\+\s+\S/ && #Not at char 1 + # actual declarations + ($prevline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ || + # function pointer declarations + $prevline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ || + # foo bar; where foo is some local typedef or #define + $prevline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ || + # known declaration macros + $prevline =~ /^\+\s+$declaration_macros/) && + # for "else if" which can look like "$Ident $Ident" + !($prevline =~ /^\+\s+$c90_Keywords\b/ || + # other possible extensions of declaration lines + $prevline =~ /(?:$Compare|$Assignment|$Operators)\s*$/ || + # not starting a section or a macro "\" extended line + $prevline =~ /(?:\{\s*|\\)$/) && + # looks like a declaration + !($sline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ || + # function pointer declarations + $sline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ || + # foo bar; where foo is some local typedef or #define + $sline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ || + # known declaration macros + $sline =~ /^\+\s+$declaration_macros/ || + # start of struct or union or enum + $sline =~ /^\+\s+(?:static\s+)?(?:const\s+)?(?:union|struct|enum|typedef)\b/ || + # start or end of block or continuation of declaration + $sline =~ /^\+\s+(?:$|[\{\}\.\#\"\?\:\(\[])/ || + # bitfield continuation + $sline =~ /^\+\s+$Ident\s*:\s*\d+\s*[,;]/ || + # other possible extensions of declaration lines + $sline =~ /^\+\s+\(?\s*(?:$Compare|$Assignment|$Operators)/) && + # indentation of previous and current line are the same + (($prevline =~ /\+(\s+)\S/) && $sline =~ /^\+$1\S/)) { + if (WARN("LINE_SPACING", + "Missing a blank line after declarations\n" . $hereprev) && + $fix) { + fix_insert_line($fixlinenr, "\+"); + } + } + +# check for spaces at the beginning of a line. +# Exceptions: +# 1) within comments +# 2) indented preprocessor commands +# 3) hanging labels + if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/) { + my $herevet = "$here\n" . cat_vet($rawline) . "\n"; + if (WARN("LEADING_SPACE", + "please, no spaces at the start of a line\n" . $herevet) && + $fix) { + $fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e; + } + } + +# check we are in a valid C source file if not then ignore this hunk + next if ($realfile !~ /\.(h|c)$/); + +# check for unusual line ending [ or ( + if ($line =~ /^\+.*([\[\(])\s*$/) { + CHK("OPEN_ENDED_LINE", + "Lines should not end with a '$1'\n" . $herecurr); + } + +# check if this appears to be the start function declaration, save the name + if ($sline =~ /^\+\{\s*$/ && + $prevline =~ /^\+(?:(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*)?($Ident)\(/) { + $context_function = $1; + } + +# check if this appears to be the end of function declaration + if ($sline =~ /^\+\}\s*$/) { + undef $context_function; + } + +# check indentation of any line with a bare else +# (but not if it is a multiple line "if (foo) return bar; else return baz;") +# if the previous line is a break or return and is indented 1 tab more... + if ($sline =~ /^\+([\t]+)(?:}[ \t]*)?else(?:[ \t]*{)?\s*$/) { + my $tabs = length($1) + 1; + if ($prevline =~ /^\+\t{$tabs,$tabs}break\b/ || + ($prevline =~ /^\+\t{$tabs,$tabs}return\b/ && + defined $lines[$linenr] && + $lines[$linenr] !~ /^[ \+]\t{$tabs,$tabs}return/)) { + WARN("UNNECESSARY_ELSE", + "else is not generally useful after a break or return\n" . $hereprev); + } + } + +# check indentation of a line with a break; +# if the previous line is a goto or return and is indented the same # of tabs + if ($sline =~ /^\+([\t]+)break\s*;\s*$/) { + my $tabs = $1; + if ($prevline =~ /^\+$tabs(?:goto|return)\b/) { + WARN("UNNECESSARY_BREAK", + "break is not useful after a goto or return\n" . $hereprev); + } + } + +# check for RCS/CVS revision markers + if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) { + WARN("CVS_KEYWORD", + "CVS style keyword markers, these will _not_ be updated\n". $herecurr); + } + +# check for old HOTPLUG __dev<foo> section markings + if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) { + WARN("HOTPLUG_SECTION", + "Using $1 is unnecessary\n" . $herecurr); + } + +# Check for potential 'bare' types + my ($stat, $cond, $line_nr_next, $remain_next, $off_next, + $realline_next); +#print "LINE<$line>\n"; + if ($linenr > $suppress_statement && + $realcnt && $sline =~ /.\s*\S/) { + ($stat, $cond, $line_nr_next, $remain_next, $off_next) = + ctx_statement_block($linenr, $realcnt, 0); + $stat =~ s/\n./\n /g; + $cond =~ s/\n./\n /g; + +#print "linenr<$linenr> <$stat>\n"; + # If this statement has no statement boundaries within + # it there is no point in retrying a statement scan + # until we hit end of it. + my $frag = $stat; $frag =~ s/;+\s*$//; + if ($frag !~ /(?:{|;)/) { +#print "skip<$line_nr_next>\n"; + $suppress_statement = $line_nr_next; + } + + # Find the real next line. + $realline_next = $line_nr_next; + if (defined $realline_next && + (!defined $lines[$realline_next - 1] || + substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) { + $realline_next++; + } + + my $s = $stat; + $s =~ s/{.*$//s; + + # Ignore goto labels. + if ($s =~ /$Ident:\*$/s) { + + # Ignore functions being called + } elsif ($s =~ /^.\s*$Ident\s*\(/s) { + + } elsif ($s =~ /^.\s*else\b/s) { + + # declarations always start with types + } elsif ($prev_values eq 'E' && $s =~ /^.\s*(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?((?:\s*$Ident)+?)\b(?:\s+$Sparse)?\s*\**\s*(?:$Ident|\(\*[^\)]*\))(?:\s*$Modifier)?\s*(?:;|=|,|\()/s) { + my $type = $1; + $type =~ s/\s+/ /g; + possible($type, "A:" . $s); + + # definitions in global scope can only start with types + } elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) { + possible($1, "B:" . $s); + } + + # any (foo ... *) is a pointer cast, and foo is a type + while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) { + possible($1, "C:" . $s); + } + + # Check for any sort of function declaration. + # int foo(something bar, other baz); + # void (*store_gdt)(x86_descr_ptr *); + if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) { + my ($name_len) = length($1); + + my $ctx = $s; + substr($ctx, 0, $name_len + 1, ''); + $ctx =~ s/\)[^\)]*$//; + + for my $arg (split(/\s*,\s*/, $ctx)) { + if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) { + + possible($1, "D:" . $s); + } + } + } + + } + +# +# Checks which may be anchored in the context. +# + +# Check for switch () and associated case and default +# statements should be at the same indent. + if ($line=~/\bswitch\s*\(.*\)/) { + my $err = ''; + my $sep = ''; + my @ctx = ctx_block_outer($linenr, $realcnt); + shift(@ctx); + for my $ctx (@ctx) { + my ($clen, $cindent) = line_stats($ctx); + if ($ctx =~ /^\+\s*(case\s+|default:)/ && + $indent != $cindent) { + $err .= "$sep$ctx\n"; + $sep = ''; + } else { + $sep = "[...]\n"; + } + } + if ($err ne '') { + ERROR("SWITCH_CASE_INDENT_LEVEL", + "switch and case should be at the same indent\n$hereline$err"); + } + } + +# if/while/etc brace do not go on next line, unless defining a do while loop, +# or if that brace on the next line is for something else + if ($line =~ /(.*)\b((?:if|while|for|switch|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) { + my $pre_ctx = "$1$2"; + + my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0); + + if ($line =~ /^\+\t{6,}/) { + WARN("DEEP_INDENTATION", + "Too many leading tabs - consider code refactoring\n" . $herecurr); + } + + my $ctx_cnt = $realcnt - $#ctx - 1; + my $ctx = join("\n", @ctx); + + my $ctx_ln = $linenr; + my $ctx_skip = $realcnt; + + while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt && + defined $lines[$ctx_ln - 1] && + $lines[$ctx_ln - 1] =~ /^-/)) { + ##print "SKIP<$ctx_skip> CNT<$ctx_cnt>\n"; + $ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/); + $ctx_ln++; + } + + #print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n"; + #print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n"; + + if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln - 1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) { + ERROR("OPEN_BRACE", + "that open brace { should be on the previous line\n" . + "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n"); + } + if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ && + $ctx =~ /\)\s*\;\s*$/ && + defined $lines[$ctx_ln - 1]) + { + my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]); + if ($nindent > $indent) { + WARN("TRAILING_SEMICOLON", + "trailing semicolon indicates no statements, indent implies otherwise\n" . + "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n"); + } + } + } + +# Check relative indent for conditionals and blocks. + if ($line =~ /\b(?:(?:if|while|for|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|(?:do|else)\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) { + ($stat, $cond, $line_nr_next, $remain_next, $off_next) = + ctx_statement_block($linenr, $realcnt, 0) + if (!defined $stat); + my ($s, $c) = ($stat, $cond); + + substr($s, 0, length($c), ''); + + # remove inline comments + $s =~ s/$;/ /g; + $c =~ s/$;/ /g; + + # Find out how long the conditional actually is. + my @newlines = ($c =~ /\n/gs); + my $cond_lines = 1 + $#newlines; + + # Make sure we remove the line prefixes as we have + # none on the first line, and are going to readd them + # where necessary. + $s =~ s/\n./\n/gs; + while ($s =~ /\n\s+\\\n/) { + $cond_lines += $s =~ s/\n\s+\\\n/\n/g; + } + + # We want to check the first line inside the block + # starting at the end of the conditional, so remove: + # 1) any blank line termination + # 2) any opening brace { on end of the line + # 3) any do (...) { + my $continuation = 0; + my $check = 0; + $s =~ s/^.*\bdo\b//; + $s =~ s/^\s*{//; + if ($s =~ s/^\s*\\//) { + $continuation = 1; + } + if ($s =~ s/^\s*?\n//) { + $check = 1; + $cond_lines++; + } + + # Also ignore a loop construct at the end of a + # preprocessor statement. + if (($prevline =~ /^.\s*#\s*define\s/ || + $prevline =~ /\\\s*$/) && $continuation == 0) { + $check = 0; + } + + my $cond_ptr = -1; + $continuation = 0; + while ($cond_ptr != $cond_lines) { + $cond_ptr = $cond_lines; + + # If we see an #else/#elif then the code + # is not linear. + if ($s =~ /^\s*\#\s*(?:else|elif)/) { + $check = 0; + } + + # Ignore: + # 1) blank lines, they should be at 0, + # 2) preprocessor lines, and + # 3) labels. + if ($continuation || + $s =~ /^\s*?\n/ || + $s =~ /^\s*#\s*?/ || + $s =~ /^\s*$Ident\s*:/) { + $continuation = ($s =~ /^.*?\\\n/) ? 1 : 0; + if ($s =~ s/^.*?\n//) { + $cond_lines++; + } + } + } + + my (undef, $sindent) = line_stats("+" . $s); + my $stat_real = raw_line($linenr, $cond_lines); + + # Check if either of these lines are modified, else + # this is not this patch's fault. + if (!defined($stat_real) || + $stat !~ /^\+/ && $stat_real !~ /^\+/) { + $check = 0; + } + if (defined($stat_real) && $cond_lines > 1) { + $stat_real = "[...]\n$stat_real"; + } + + #print "line<$line> prevline<$prevline> indent<$indent> sindent<$sindent> check<$check> continuation<$continuation> s<$s> cond_lines<$cond_lines> stat_real<$stat_real> stat<$stat>\n"; + + if ($check && $s ne '' && + (($sindent % $tabsize) != 0 || + ($sindent < $indent) || + ($sindent == $indent && + ($s !~ /^\s*(?:\}|\{|else\b)/)) || + ($sindent > $indent + $tabsize))) { + WARN("SUSPECT_CODE_INDENT", + "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n"); + } + } + + # Track the 'values' across context and added lines. + my $opline = $line; $opline =~ s/^./ /; + my ($curr_values, $curr_vars) = + annotate_values($opline . "\n", $prev_values); + $curr_values = $prev_values . $curr_values; + if ($dbg_values) { + my $outline = $opline; $outline =~ s/\t/ /g; + print "$linenr > .$outline\n"; + print "$linenr > $curr_values\n"; + print "$linenr > $curr_vars\n"; + } + $prev_values = substr($curr_values, -1); + +#ignore lines not being added + next if ($line =~ /^[^\+]/); + +# check for self assignments used to avoid compiler warnings +# e.g.: int foo = foo, *bar = NULL; +# struct foo bar = *(&(bar)); + if ($line =~ /^\+\s*(?:$Declare)?([A-Za-z_][A-Za-z\d_]*)\s*=/) { + my $var = $1; + if ($line =~ /^\+\s*(?:$Declare)?$var\s*=\s*(?:$var|\*\s*\(?\s*&\s*\(?\s*$var\s*\)?\s*\)?)\s*[;,]/) { + WARN("SELF_ASSIGNMENT", + "Do not use self-assignments to avoid compiler warnings\n" . $herecurr); + } + } + +# check for dereferences that span multiple lines + if ($prevline =~ /^\+.*$Lval\s*(?:\.|->)\s*$/ && + $line =~ /^\+\s*(?!\#\s*(?!define\s+|if))\s*$Lval/) { + $prevline =~ /($Lval\s*(?:\.|->))\s*$/; + my $ref = $1; + $line =~ /^.\s*($Lval)/; + $ref .= $1; + $ref =~ s/\s//g; + WARN("MULTILINE_DEREFERENCE", + "Avoid multiple line dereference - prefer '$ref'\n" . $hereprev); + } + +# check for declarations of signed or unsigned without int + while ($line =~ m{\b($Declare)\s*(?!char\b|short\b|int\b|long\b)\s*($Ident)?\s*[=,;\[\)\(]}g) { + my $type = $1; + my $var = $2; + $var = "" if (!defined $var); + if ($type =~ /^(?:(?:$Storage|$Inline|$Attribute)\s+)*((?:un)?signed)((?:\s*\*)*)\s*$/) { + my $sign = $1; + my $pointer = $2; + + $pointer = "" if (!defined $pointer); + + if (WARN("UNSPECIFIED_INT", + "Prefer '" . trim($sign) . " int" . rtrim($pointer) . "' to bare use of '$sign" . rtrim($pointer) . "'\n" . $herecurr) && + $fix) { + my $decl = trim($sign) . " int "; + my $comp_pointer = $pointer; + $comp_pointer =~ s/\s//g; + $decl .= $comp_pointer; + $decl = rtrim($decl) if ($var eq ""); + $fixed[$fixlinenr] =~ s@\b$sign\s*\Q$pointer\E\s*$var\b@$decl$var@; + } + } + } + +# TEST: allow direct testing of the type matcher. + if ($dbg_type) { + if ($line =~ /^.\s*$Declare\s*$/) { + ERROR("TEST_TYPE", + "TEST: is type\n" . $herecurr); + } elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) { + ERROR("TEST_NOT_TYPE", + "TEST: is not type ($1 is)\n". $herecurr); + } + next; + } +# TEST: allow direct testing of the attribute matcher. + if ($dbg_attr) { + if ($line =~ /^.\s*$Modifier\s*$/) { + ERROR("TEST_ATTR", + "TEST: is attr\n" . $herecurr); + } elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) { + ERROR("TEST_NOT_ATTR", + "TEST: is not attr ($1 is)\n". $herecurr); + } + next; + } + +# check for initialisation to aggregates open brace on the next line + if ($line =~ /^.\s*{/ && + $prevline =~ /(?:^|[^=])=\s*$/) { + if (ERROR("OPEN_BRACE", + "that open brace { should be on the previous line\n" . $hereprev) && + $fix && $prevline =~ /^\+/ && $line =~ /^\+/) { + fix_delete_line($fixlinenr - 1, $prevrawline); + fix_delete_line($fixlinenr, $rawline); + my $fixedline = $prevrawline; + $fixedline =~ s/\s*=\s*$/ = {/; + fix_insert_line($fixlinenr, $fixedline); + $fixedline = $line; + $fixedline =~ s/^(.\s*)\{\s*/$1/; + fix_insert_line($fixlinenr, $fixedline); + } + } + +# +# Checks which are anchored on the added line. +# + +# check for malformed paths in #include statements (uses RAW line) + if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) { + my $path = $1; + if ($path =~ m{//}) { + ERROR("MALFORMED_INCLUDE", + "malformed #include filename\n" . $herecurr); + } + if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) { + ERROR("UAPI_INCLUDE", + "No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr); + } + } + +# no C99 // comments + if ($line =~ m{//}) { + if (ERROR("C99_COMMENTS", + "do not use C99 // comments\n" . $herecurr) && + $fix) { + my $line = $fixed[$fixlinenr]; + if ($line =~ /\/\/(.*)$/) { + my $comment = trim($1); + $fixed[$fixlinenr] =~ s@\/\/(.*)$@/\* $comment \*/@; + } + } + } + # Remove C99 comments. + $line =~ s@//.*@@; + $opline =~ s@//.*@@; + +# EXPORT_SYMBOL should immediately follow the thing it is exporting, consider +# the whole statement. +#print "APW <$lines[$realline_next - 1]>\n"; + if (defined $realline_next && + exists $lines[$realline_next - 1] && + !defined $suppress_export{$realline_next} && + ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ || + $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) { + # Handle definitions which produce identifiers with + # a prefix: + # XXX(foo); + # EXPORT_SYMBOL(something_foo); + my $name = $1; + if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ && + $name =~ /^${Ident}_$2/) { +#print "FOO C name<$name>\n"; + $suppress_export{$realline_next} = 1; + + } elsif ($stat !~ /(?: + \n.}\s*$| + ^.DEFINE_$Ident\(\Q$name\E\)| + ^.DECLARE_$Ident\(\Q$name\E\)| + ^.LIST_HEAD\(\Q$name\E\)| + ^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(| + \b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\() + )/x) { +#print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n"; + $suppress_export{$realline_next} = 2; + } else { + $suppress_export{$realline_next} = 1; + } + } + if (!defined $suppress_export{$linenr} && + $prevline =~ /^.\s*$/ && + ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ || + $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) { +#print "FOO B <$lines[$linenr - 1]>\n"; + $suppress_export{$linenr} = 2; + } + if (defined $suppress_export{$linenr} && + $suppress_export{$linenr} == 2) { + WARN("EXPORT_SYMBOL", + "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr); + } + +# check for global initialisers. + if ($line =~ /^\+$Type\s*$Ident(?:\s+$Modifier)*\s*=\s*($zero_initializer)\s*;/) { + if (ERROR("GLOBAL_INITIALISERS", + "do not initialise globals to $1\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/(^.$Type\s*$Ident(?:\s+$Modifier)*)\s*=\s*$zero_initializer\s*;/$1;/; + } + } +# check for static initialisers. + if ($line =~ /^\+.*\bstatic\s.*=\s*($zero_initializer)\s*;/) { + if (ERROR("INITIALISED_STATIC", + "do not initialise statics to $1\n" . + $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/(\bstatic\s.*?)\s*=\s*$zero_initializer\s*;/$1;/; + } + } + +# check for misordered declarations of char/short/int/long with signed/unsigned + while ($sline =~ m{(\b$TypeMisordered\b)}g) { + my $tmp = trim($1); + WARN("MISORDERED_TYPE", + "type '$tmp' should be specified in [[un]signed] [short|int|long|long long] order\n" . $herecurr); + } + +# check for unnecessary <signed> int declarations of short/long/long long + while ($sline =~ m{\b($TypeMisordered(\s*\*)*|$C90_int_types)\b}g) { + my $type = trim($1); + next if ($type !~ /\bint\b/); + next if ($type !~ /\b(?:short|long\s+long|long)\b/); + my $new_type = $type; + $new_type =~ s/\b\s*int\s*\b/ /; + $new_type =~ s/\b\s*(?:un)?signed\b\s*/ /; + $new_type =~ s/^const\s+//; + $new_type = "unsigned $new_type" if ($type =~ /\bunsigned\b/); + $new_type = "const $new_type" if ($type =~ /^const\b/); + $new_type =~ s/\s+/ /g; + $new_type = trim($new_type); + if (WARN("UNNECESSARY_INT", + "Prefer '$new_type' over '$type' as the int is unnecessary\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/\b\Q$type\E\b/$new_type/; + } + } + +# check for static const char * arrays. + if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) { + WARN("STATIC_CONST_CHAR_ARRAY", + "static const char * array should probably be static const char * const\n" . + $herecurr); + } + +# check for initialized const char arrays that should be static const + if ($line =~ /^\+\s*const\s+(char|unsigned\s+char|_*u8|(?:[us]_)?int8_t)\s+\w+\s*\[\s*(?:\w+\s*)?\]\s*=\s*"/) { + if (WARN("STATIC_CONST_CHAR_ARRAY", + "const array should probably be static const\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/(^.\s*)const\b/${1}static const/; + } + } + +# check for static char foo[] = "bar" declarations. + if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) { + WARN("STATIC_CONST_CHAR_ARRAY", + "static char array declaration should probably be static const char\n" . + $herecurr); + } + +# check for const <foo> const where <foo> is not a pointer or array type + if ($sline =~ /\bconst\s+($BasicType)\s+const\b/) { + my $found = $1; + if ($sline =~ /\bconst\s+\Q$found\E\s+const\b\s*\*/) { + WARN("CONST_CONST", + "'const $found const *' should probably be 'const $found * const'\n" . $herecurr); + } elsif ($sline !~ /\bconst\s+\Q$found\E\s+const\s+\w+\s*\[/) { + WARN("CONST_CONST", + "'const $found const' should probably be 'const $found'\n" . $herecurr); + } + } + +# check for non-global char *foo[] = {"bar", ...} declarations. + if ($line =~ /^.\s+(?:static\s+|const\s+)?char\s+\*\s*\w+\s*\[\s*\]\s*=\s*\{/) { + WARN("STATIC_CONST_CHAR_ARRAY", + "char * array declaration might be better as static const\n" . + $herecurr); + } + +# check for sizeof(foo)/sizeof(foo[0]) that could be ARRAY_SIZE(foo) + if ($line =~ m@\bsizeof\s*\(\s*($Lval)\s*\)@) { + my $array = $1; + if ($line =~ m@\b(sizeof\s*\(\s*\Q$array\E\s*\)\s*/\s*sizeof\s*\(\s*\Q$array\E\s*\[\s*0\s*\]\s*\))@) { + my $array_div = $1; + if (WARN("ARRAY_SIZE", + "Prefer ARRAY_SIZE($array)\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/\Q$array_div\E/ARRAY_SIZE($array)/; + } + } + } + +# check for function declarations without arguments like "int foo()" + if ($line =~ /(\b$Type\s*$Ident)\s*\(\s*\)/) { + if (ERROR("FUNCTION_WITHOUT_ARGS", + "Bad function definition - $1() should probably be $1(void)\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/; + } + } + +# check for new typedefs, only function parameters and sparse annotations +# make sense. + if ($line =~ /\btypedef\s/ && + $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ && + $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ && + $line !~ /\b$typeTypedefs\b/ && + $line !~ /\b__bitwise\b/) { + WARN("NEW_TYPEDEFS", + "do not add new typedefs\n" . $herecurr); + } + +# * goes on variable not on type + # (char*[ const]) + while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) { + #print "AA<$1>\n"; + my ($ident, $from, $to) = ($1, $2, $2); + + # Should start with a space. + $to =~ s/^(\S)/ $1/; + # Should not end with a space. + $to =~ s/\s+$//; + # '*'s should not have spaces between. + while ($to =~ s/\*\s+\*/\*\*/) { + } + +## print "1: from<$from> to<$to> ident<$ident>\n"; + if ($from ne $to) { + if (ERROR("POINTER_LOCATION", + "\"(foo$from)\" should be \"(foo$to)\"\n" . $herecurr) && + $fix) { + my $sub_from = $ident; + my $sub_to = $ident; + $sub_to =~ s/\Q$from\E/$to/; + $fixed[$fixlinenr] =~ + s@\Q$sub_from\E@$sub_to@; + } + } + } + while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) { + #print "BB<$1>\n"; + my ($match, $from, $to, $ident) = ($1, $2, $2, $3); + + # Should start with a space. + $to =~ s/^(\S)/ $1/; + # Should not end with a space. + $to =~ s/\s+$//; + # '*'s should not have spaces between. + while ($to =~ s/\*\s+\*/\*\*/) { + } + # Modifiers should have spaces. + $to =~ s/(\b$Modifier$)/$1 /; + +## print "2: from<$from> to<$to> ident<$ident>\n"; + if ($from ne $to && $ident !~ /^$Modifier$/) { + if (ERROR("POINTER_LOCATION", + "\"foo${from}bar\" should be \"foo${to}bar\"\n" . $herecurr) && + $fix) { + + my $sub_from = $match; + my $sub_to = $match; + $sub_to =~ s/\Q$from\E/$to/; + $fixed[$fixlinenr] =~ + s@\Q$sub_from\E@$sub_to@; + } + } + } + +# avoid BUG() or BUG_ON() + if ($line =~ /\b(?:BUG|BUG_ON)\b/) { + my $msg_level = \&WARN; + $msg_level = \&CHK if ($file); + &{$msg_level}("AVOID_BUG", + "Avoid crashing the kernel - try using WARN_ON & recovery code rather than BUG() or BUG_ON()\n" . $herecurr); + } + +# avoid LINUX_VERSION_CODE + if ($line =~ /\bLINUX_VERSION_CODE\b/) { + WARN("LINUX_VERSION_CODE", + "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged\n" . $herecurr); + } + +# check for uses of printk_ratelimit + if ($line =~ /\bprintk_ratelimit\s*\(/) { + WARN("PRINTK_RATELIMITED", + "Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr); + } + +# printk should use KERN_* levels + if ($line =~ /\bprintk\s*\(\s*(?!KERN_[A-Z]+\b)/) { + WARN("PRINTK_WITHOUT_KERN_LEVEL", + "printk() should include KERN_<LEVEL> facility level\n" . $herecurr); + } + + if ($line =~ /\bprintk\s*\(\s*KERN_([A-Z]+)/) { + my $orig = $1; + my $level = lc($orig); + $level = "warn" if ($level eq "warning"); + my $level2 = $level; + $level2 = "dbg" if ($level eq "debug"); + WARN("PREFER_PR_LEVEL", + "Prefer [subsystem eg: netdev]_$level2([subsystem]dev, ... then dev_$level2(dev, ... then pr_$level(... to printk(KERN_$orig ...\n" . $herecurr); + } + + if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) { + my $orig = $1; + my $level = lc($orig); + $level = "warn" if ($level eq "warning"); + $level = "dbg" if ($level eq "debug"); + WARN("PREFER_DEV_LEVEL", + "Prefer dev_$level(... to dev_printk(KERN_$orig, ...\n" . $herecurr); + } + +# trace_printk should not be used in production code. + if ($line =~ /\b(trace_printk|trace_puts|ftrace_vprintk)\s*\(/) { + WARN("TRACE_PRINTK", + "Do not use $1() in production code (this can be ignored if built only with a debug config option)\n" . $herecurr); + } + +# ENOSYS means "bad syscall nr" and nothing else. This will have a small +# number of false positives, but assembly files are not checked, so at +# least the arch entry code will not trigger this warning. + if ($line =~ /\bENOSYS\b/) { + WARN("ENOSYS", + "ENOSYS means 'invalid syscall nr' and nothing else\n" . $herecurr); + } + +# ENOTSUPP is not a standard error code and should be avoided in new patches. +# Folks usually mean EOPNOTSUPP (also called ENOTSUP), when they type ENOTSUPP. +# Similarly to ENOSYS warning a small number of false positives is expected. + if (!$file && $line =~ /\bENOTSUPP\b/) { + if (WARN("ENOTSUPP", + "ENOTSUPP is not a SUSV4 error code, prefer EOPNOTSUPP\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/\bENOTSUPP\b/EOPNOTSUPP/; + } + } + +# function brace can't be on same line, except for #defines of do while, +# or if closed on same line + if ($perl_version_ok && + $sline =~ /$Type\s*$Ident\s*$balanced_parens\s*\{/ && + $sline !~ /\#\s*define\b.*do\s*\{/ && + $sline !~ /}/) { + if (ERROR("OPEN_BRACE", + "open brace '{' following function definitions go on the next line\n" . $herecurr) && + $fix) { + fix_delete_line($fixlinenr, $rawline); + my $fixed_line = $rawline; + $fixed_line =~ /(^..*$Type\s*$Ident\(.*\)\s*)\{(.*)$/; + my $line1 = $1; + my $line2 = $2; + fix_insert_line($fixlinenr, ltrim($line1)); + fix_insert_line($fixlinenr, "\+{"); + if ($line2 !~ /^\s*$/) { + fix_insert_line($fixlinenr, "\+\t" . trim($line2)); + } + } + } + +# open braces for enum, union and struct go on the same line. + if ($line =~ /^.\s*{/ && + $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) { + if (ERROR("OPEN_BRACE", + "open brace '{' following $1 go on the same line\n" . $hereprev) && + $fix && $prevline =~ /^\+/ && $line =~ /^\+/) { + fix_delete_line($fixlinenr - 1, $prevrawline); + fix_delete_line($fixlinenr, $rawline); + my $fixedline = rtrim($prevrawline) . " {"; + fix_insert_line($fixlinenr, $fixedline); + $fixedline = $rawline; + $fixedline =~ s/^(.\s*)\{\s*/$1\t/; + if ($fixedline !~ /^\+\s*$/) { + fix_insert_line($fixlinenr, $fixedline); + } + } + } + +# missing space after union, struct or enum definition + if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident){1,2}[=\{]/) { + if (WARN("SPACING", + "missing space after $1 definition\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ + s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/; + } + } + +# Function pointer declarations +# check spacing between type, funcptr, and args +# canonical declaration is "type (*funcptr)(args...)" + if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)($Ident)(\s*)\)(\s*)\(/) { + my $declare = $1; + my $pre_pointer_space = $2; + my $post_pointer_space = $3; + my $funcname = $4; + my $post_funcname_space = $5; + my $pre_args_space = $6; + +# the $Declare variable will capture all spaces after the type +# so check it for a missing trailing missing space but pointer return types +# don't need a space so don't warn for those. + my $post_declare_space = ""; + if ($declare =~ /(\s+)$/) { + $post_declare_space = $1; + $declare = rtrim($declare); + } + if ($declare !~ /\*$/ && $post_declare_space =~ /^$/) { + WARN("SPACING", + "missing space after return type\n" . $herecurr); + $post_declare_space = " "; + } + +# unnecessary space "type (*funcptr)(args...)" +# This test is not currently implemented because these declarations are +# equivalent to +# int foo(int bar, ...) +# and this is form shouldn't/doesn't generate a checkpatch warning. +# +# elsif ($declare =~ /\s{2,}$/) { +# WARN("SPACING", +# "Multiple spaces after return type\n" . $herecurr); +# } + +# unnecessary space "type ( *funcptr)(args...)" + if (defined $pre_pointer_space && + $pre_pointer_space =~ /^\s/) { + WARN("SPACING", + "Unnecessary space after function pointer open parenthesis\n" . $herecurr); + } + +# unnecessary space "type (* funcptr)(args...)" + if (defined $post_pointer_space && + $post_pointer_space =~ /^\s/) { + WARN("SPACING", + "Unnecessary space before function pointer name\n" . $herecurr); + } + +# unnecessary space "type (*funcptr )(args...)" + if (defined $post_funcname_space && + $post_funcname_space =~ /^\s/) { + WARN("SPACING", + "Unnecessary space after function pointer name\n" . $herecurr); + } + +# unnecessary space "type (*funcptr) (args...)" + if (defined $pre_args_space && + $pre_args_space =~ /^\s/) { + WARN("SPACING", + "Unnecessary space before function pointer arguments\n" . $herecurr); + } + + if (show_type("SPACING") && $fix) { + $fixed[$fixlinenr] =~ + s/^(.\s*)$Declare\s*\(\s*\*\s*$Ident\s*\)\s*\(/$1 . $declare . $post_declare_space . '(*' . $funcname . ')('/ex; + } + } + +# check for spacing round square brackets; allowed: +# 1. with a type on the left -- int [] a; +# 2. at the beginning of a line for slice initialisers -- [0...10] = 5, +# 3. inside a curly brace -- = { [0...10] = 5 } + while ($line =~ /(.*?\s)\[/g) { + my ($where, $prefix) = ($-[1], $1); + if ($prefix !~ /$Type\s+$/ && + ($where != 0 || $prefix !~ /^.\s+$/) && + $prefix !~ /[{,:]\s+$/) { + if (ERROR("BRACKET_SPACE", + "space prohibited before open square bracket '['\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ + s/^(\+.*?)\s+\[/$1\[/; + } + } + } + +# check for spaces between functions and their parentheses. + while ($line =~ /($Ident)\s+\(/g) { + my $name = $1; + my $ctx_before = substr($line, 0, $-[1]); + my $ctx = "$ctx_before$name"; + + # Ignore those directives where spaces _are_ permitted. + if ($name =~ /^(?: + if|for|while|switch|return|case| + volatile|__volatile__| + __attribute__|format|__extension__| + asm|__asm__)$/x) + { + # cpp #define statements have non-optional spaces, ie + # if there is a space between the name and the open + # parenthesis it is simply not a parameter group. + } elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) { + + # cpp #elif statement condition may start with a ( + } elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) { + + # If this whole things ends with a type its most + # likely a typedef for a function. + } elsif ($ctx =~ /$Type$/) { + + } else { + if (WARN("SPACING", + "space prohibited between function name and open parenthesis '('\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ + s/\b$name\s+\(/$name\(/; + } + } + } + +# Check operator spacing. + if (!($line=~/\#\s*include/)) { + my $fixed_line = ""; + my $line_fixed = 0; + + my $ops = qr{ + <<=|>>=|<=|>=|==|!=| + \+=|-=|\*=|\/=|%=|\^=|\|=|&=| + =>|->|<<|>>|<|>|=|!|~| + &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%| + \?:|\?|: + }x; + my @elements = split(/($ops|;)/, $opline); + +## print("element count: <" . $#elements . ">\n"); +## foreach my $el (@elements) { +## print("el: <$el>\n"); +## } + + my @fix_elements = (); + my $off = 0; + + foreach my $el (@elements) { + push(@fix_elements, substr($rawline, $off, length($el))); + $off += length($el); + } + + $off = 0; + + my $blank = copy_spacing($opline); + my $last_after = -1; + + for (my $n = 0; $n < $#elements; $n += 2) { + + my $good = $fix_elements[$n] . $fix_elements[$n + 1]; + +## print("n: <$n> good: <$good>\n"); + + $off += length($elements[$n]); + + # Pick up the preceding and succeeding characters. + my $ca = substr($opline, 0, $off); + my $cc = ''; + if (length($opline) >= ($off + length($elements[$n + 1]))) { + $cc = substr($opline, $off + length($elements[$n + 1])); + } + my $cb = "$ca$;$cc"; + + my $a = ''; + $a = 'V' if ($elements[$n] ne ''); + $a = 'W' if ($elements[$n] =~ /\s$/); + $a = 'C' if ($elements[$n] =~ /$;$/); + $a = 'B' if ($elements[$n] =~ /(\[|\()$/); + $a = 'O' if ($elements[$n] eq ''); + $a = 'E' if ($ca =~ /^\s*$/); + + my $op = $elements[$n + 1]; + + my $c = ''; + if (defined $elements[$n + 2]) { + $c = 'V' if ($elements[$n + 2] ne ''); + $c = 'W' if ($elements[$n + 2] =~ /^\s/); + $c = 'C' if ($elements[$n + 2] =~ /^$;/); + $c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/); + $c = 'O' if ($elements[$n + 2] eq ''); + $c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/); + } else { + $c = 'E'; + } + + my $ctx = "${a}x${c}"; + + my $at = "(ctx:$ctx)"; + + my $ptr = substr($blank, 0, $off) . "^"; + my $hereptr = "$hereline$ptr\n"; + + # Pull out the value of this operator. + my $op_type = substr($curr_values, $off + 1, 1); + + # Get the full operator variant. + my $opv = $op . substr($curr_vars, $off, 1); + + # Ignore operators passed as parameters. + if ($op_type ne 'V' && + $ca =~ /\s$/ && $cc =~ /^\s*[,\)]/) { + +# # Ignore comments +# } elsif ($op =~ /^$;+$/) { + + # ; should have either the end of line or a space or \ after it + } elsif ($op eq ';') { + if ($ctx !~ /.x[WEBC]/ && + $cc !~ /^\\/ && $cc !~ /^;/) { + if (ERROR("SPACING", + "space required after that '$op' $at\n" . $hereptr)) { + $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " "; + $line_fixed = 1; + } + } + + # // is a comment + } elsif ($op eq '//') { + + # : when part of a bitfield + } elsif ($opv eq ':B') { + # skip the bitfield test for now + + # No spaces for: + # -> + } elsif ($op eq '->') { + if ($ctx =~ /Wx.|.xW/) { + if (ERROR("SPACING", + "spaces prohibited around that '$op' $at\n" . $hereptr)) { + $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]); + if (defined $fix_elements[$n + 2]) { + $fix_elements[$n + 2] =~ s/^\s+//; + } + $line_fixed = 1; + } + } + + # , must not have a space before and must have a space on the right. + } elsif ($op eq ',') { + my $rtrim_before = 0; + my $space_after = 0; + if ($ctx =~ /Wx./) { + if (ERROR("SPACING", + "space prohibited before that '$op' $at\n" . $hereptr)) { + $line_fixed = 1; + $rtrim_before = 1; + } + } + if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) { + if (ERROR("SPACING", + "space required after that '$op' $at\n" . $hereptr)) { + $line_fixed = 1; + $last_after = $n; + $space_after = 1; + } + } + if ($rtrim_before || $space_after) { + if ($rtrim_before) { + $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]); + } else { + $good = $fix_elements[$n] . trim($fix_elements[$n + 1]); + } + if ($space_after) { + $good .= " "; + } + } + + # '*' as part of a type definition -- reported already. + } elsif ($opv eq '*_') { + #warn "'*' is part of type\n"; + + # unary operators should have a space before and + # none after. May be left adjacent to another + # unary operator, or a cast + } elsif ($op eq '!' || $op eq '~' || + $opv eq '*U' || $opv eq '-U' || + $opv eq '&U' || $opv eq '&&U') { + if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) { + if (ERROR("SPACING", + "space required before that '$op' $at\n" . $hereptr)) { + if ($n != $last_after + 2) { + $good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]); + $line_fixed = 1; + } + } + } + if ($op eq '*' && $cc =~/\s*$Modifier\b/) { + # A unary '*' may be const + + } elsif ($ctx =~ /.xW/) { + if (ERROR("SPACING", + "space prohibited after that '$op' $at\n" . $hereptr)) { + $good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]); + if (defined $fix_elements[$n + 2]) { + $fix_elements[$n + 2] =~ s/^\s+//; + } + $line_fixed = 1; + } + } + + # unary ++ and unary -- are allowed no space on one side. + } elsif ($op eq '++' or $op eq '--') { + if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) { + if (ERROR("SPACING", + "space required one side of that '$op' $at\n" . $hereptr)) { + $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " "; + $line_fixed = 1; + } + } + if ($ctx =~ /Wx[BE]/ || + ($ctx =~ /Wx./ && $cc =~ /^;/)) { + if (ERROR("SPACING", + "space prohibited before that '$op' $at\n" . $hereptr)) { + $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]); + $line_fixed = 1; + } + } + if ($ctx =~ /ExW/) { + if (ERROR("SPACING", + "space prohibited after that '$op' $at\n" . $hereptr)) { + $good = $fix_elements[$n] . trim($fix_elements[$n + 1]); + if (defined $fix_elements[$n + 2]) { + $fix_elements[$n + 2] =~ s/^\s+//; + } + $line_fixed = 1; + } + } + + # << and >> may either have or not have spaces both sides + } elsif ($op eq '<<' or $op eq '>>' or + $op eq '&' or $op eq '^' or $op eq '|' or + $op eq '+' or $op eq '-' or + $op eq '*' or $op eq '/' or + $op eq '%') + { + if ($check) { + if (defined $fix_elements[$n + 2] && $ctx !~ /[EW]x[EW]/) { + if (CHK("SPACING", + "spaces preferred around that '$op' $at\n" . $hereptr)) { + $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " "; + $fix_elements[$n + 2] =~ s/^\s+//; + $line_fixed = 1; + } + } elsif (!defined $fix_elements[$n + 2] && $ctx !~ /Wx[OE]/) { + if (CHK("SPACING", + "space preferred before that '$op' $at\n" . $hereptr)) { + $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]); + $line_fixed = 1; + } + } + } elsif ($ctx =~ /Wx[^WCE]|[^WCE]xW/) { + if (ERROR("SPACING", + "need consistent spacing around '$op' $at\n" . $hereptr)) { + $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " "; + if (defined $fix_elements[$n + 2]) { + $fix_elements[$n + 2] =~ s/^\s+//; + } + $line_fixed = 1; + } + } + + # A colon needs no spaces before when it is + # terminating a case value or a label. + } elsif ($opv eq ':C' || $opv eq ':L') { + if ($ctx =~ /Wx./) { + if (ERROR("SPACING", + "space prohibited before that '$op' $at\n" . $hereptr)) { + $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]); + $line_fixed = 1; + } + } + + # All the others need spaces both sides. + } elsif ($ctx !~ /[EWC]x[CWE]/) { + my $ok = 0; + + # Ignore email addresses <foo@bar> + if (($op eq '<' && + $cc =~ /^\S+\@\S+>/) || + ($op eq '>' && + $ca =~ /<\S+\@\S+$/)) + { + $ok = 1; + } + + # for asm volatile statements + # ignore a colon with another + # colon immediately before or after + if (($op eq ':') && + ($ca =~ /:$/ || $cc =~ /^:/)) { + $ok = 1; + } + + # messages are ERROR, but ?: are CHK + if ($ok == 0) { + my $msg_level = \&ERROR; + $msg_level = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/); + + if (&{$msg_level}("SPACING", + "spaces required around that '$op' $at\n" . $hereptr)) { + $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " "; + if (defined $fix_elements[$n + 2]) { + $fix_elements[$n + 2] =~ s/^\s+//; + } + $line_fixed = 1; + } + } + } + $off += length($elements[$n + 1]); + +## print("n: <$n> GOOD: <$good>\n"); + + $fixed_line = $fixed_line . $good; + } + + if (($#elements % 2) == 0) { + $fixed_line = $fixed_line . $fix_elements[$#elements]; + } + + if ($fix && $line_fixed && $fixed_line ne $fixed[$fixlinenr]) { + $fixed[$fixlinenr] = $fixed_line; + } + + + } + +# check for whitespace before a non-naked semicolon + if ($line =~ /^\+.*\S\s+;\s*$/) { + if (WARN("SPACING", + "space prohibited before semicolon\n" . $herecurr) && + $fix) { + 1 while $fixed[$fixlinenr] =~ + s/^(\+.*\S)\s+;/$1;/; + } + } + +# check for multiple assignments + if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) { + CHK("MULTIPLE_ASSIGNMENTS", + "multiple assignments should be avoided\n" . $herecurr); + } + +## # check for multiple declarations, allowing for a function declaration +## # continuation. +## if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ && +## $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) { +## +## # Remove any bracketed sections to ensure we do not +## # falsly report the parameters of functions. +## my $ln = $line; +## while ($ln =~ s/\([^\(\)]*\)//g) { +## } +## if ($ln =~ /,/) { +## WARN("MULTIPLE_DECLARATION", +## "declaring multiple variables together should be avoided\n" . $herecurr); +## } +## } + +#need space before brace following if, while, etc + if (($line =~ /\(.*\)\{/ && $line !~ /\($Type\)\{/) || + $line =~ /\b(?:else|do)\{/) { + if (ERROR("SPACING", + "space required before the open brace '{'\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/^(\+.*(?:do|else|\)))\{/$1 {/; + } + } + +## # check for blank lines before declarations +## if ($line =~ /^.\t+$Type\s+$Ident(?:\s*=.*)?;/ && +## $prevrawline =~ /^.\s*$/) { +## WARN("SPACING", +## "No blank lines before declarations\n" . $hereprev); +## } +## + +# closing brace should have a space following it when it has anything +# on the line + if ($line =~ /}(?!(?:,|;|\)|\}))\S/) { + if (ERROR("SPACING", + "space required after that close brace '}'\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ + s/}((?!(?:,|;|\)))\S)/} $1/; + } + } + +# check spacing on square brackets + if ($line =~ /\[\s/ && $line !~ /\[\s*$/) { + if (ERROR("SPACING", + "space prohibited after that open square bracket '['\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ + s/\[\s+/\[/; + } + } + if ($line =~ /\s\]/) { + if (ERROR("SPACING", + "space prohibited before that close square bracket ']'\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ + s/\s+\]/\]/; + } + } + +# check spacing on parentheses + if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ && + $line !~ /for\s*\(\s+;/) { + if (ERROR("SPACING", + "space prohibited after that open parenthesis '('\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ + s/\(\s+/\(/; + } + } + if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ && + $line !~ /for\s*\(.*;\s+\)/ && + $line !~ /:\s+\)/) { + if (ERROR("SPACING", + "space prohibited before that close parenthesis ')'\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ + s/\s+\)/\)/; + } + } + +# check unnecessary parentheses around addressof/dereference single $Lvals +# ie: &(foo->bar) should be &foo->bar and *(foo->bar) should be *foo->bar + + while ($line =~ /(?:[^&]&\s*|\*)\(\s*($Ident\s*(?:$Member\s*)+)\s*\)/g) { + my $var = $1; + if (CHK("UNNECESSARY_PARENTHESES", + "Unnecessary parentheses around $var\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/\(\s*\Q$var\E\s*\)/$var/; + } + } + +# check for unnecessary parentheses around function pointer uses +# ie: (foo->bar)(); should be foo->bar(); +# but not "if (foo->bar) (" to avoid some false positives + if ($line =~ /(\bif\s*|)(\(\s*$Ident\s*(?:$Member\s*)+\))[ \t]*\(/ && $1 !~ /^if/) { + my $var = $2; + if (CHK("UNNECESSARY_PARENTHESES", + "Unnecessary parentheses around function pointer $var\n" . $herecurr) && + $fix) { + my $var2 = deparenthesize($var); + $var2 =~ s/\s//g; + $fixed[$fixlinenr] =~ s/\Q$var\E/$var2/; + } + } + +# check for unnecessary parentheses around comparisons in if uses +# when !drivers/staging or command-line uses --strict + if (($realfile !~ m@^(?:drivers/staging/)@ || $check_orig) && + $perl_version_ok && defined($stat) && + $stat =~ /(^.\s*if\s*($balanced_parens))/) { + my $if_stat = $1; + my $test = substr($2, 1, -1); + my $herectx; + while ($test =~ /(?:^|[^\w\&\!\~])+\s*\(\s*([\&\!\~]?\s*$Lval\s*(?:$Compare\s*$FuncArg)?)\s*\)/g) { + my $match = $1; + # avoid parentheses around potential macro args + next if ($match =~ /^\s*\w+\s*$/); + if (!defined($herectx)) { + $herectx = $here . "\n"; + my $cnt = statement_rawlines($if_stat); + for (my $n = 0; $n < $cnt; $n++) { + my $rl = raw_line($linenr, $n); + $herectx .= $rl . "\n"; + last if $rl =~ /^[ \+].*\{/; + } + } + CHK("UNNECESSARY_PARENTHESES", + "Unnecessary parentheses around '$match'\n" . $herectx); + } + } + +#goto labels aren't indented, allow a single space however + if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and + !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) { + if (WARN("INDENTED_LABEL", + "labels should not be indented\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ + s/^(.)\s+/$1/; + } + } + +# check if a statement with a comma should be two statements like: +# foo = bar(), /* comma should be semicolon */ +# bar = baz(); + if (defined($stat) && + $stat =~ /^\+\s*(?:$Lval\s*$Assignment\s*)?$FuncArg\s*,\s*(?:$Lval\s*$Assignment\s*)?$FuncArg\s*;\s*$/) { + my $cnt = statement_rawlines($stat); + my $herectx = get_stat_here($linenr, $cnt, $here); + WARN("SUSPECT_COMMA_SEMICOLON", + "Possible comma where semicolon could be used\n" . $herectx); + } + +# return is not a function + if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) { + my $spacing = $1; + if ($perl_version_ok && + $stat =~ /^.\s*return\s*($balanced_parens)\s*;\s*$/) { + my $value = $1; + $value = deparenthesize($value); + if ($value =~ m/^\s*$FuncArg\s*(?:\?|$)/) { + ERROR("RETURN_PARENTHESES", + "return is not a function, parentheses are not required\n" . $herecurr); + } + } elsif ($spacing !~ /\s+/) { + ERROR("SPACING", + "space required before the open parenthesis '('\n" . $herecurr); + } + } + +# unnecessary return in a void function +# at end-of-function, with the previous line a single leading tab, then return; +# and the line before that not a goto label target like "out:" + if ($sline =~ /^[ \+]}\s*$/ && + $prevline =~ /^\+\treturn\s*;\s*$/ && + $linenr >= 3 && + $lines[$linenr - 3] =~ /^[ +]/ && + $lines[$linenr - 3] !~ /^[ +]\s*$Ident\s*:/) { + WARN("RETURN_VOID", + "void function return statements are not generally useful\n" . $hereprev); + } + +# if statements using unnecessary parentheses - ie: if ((foo == bar)) + if ($perl_version_ok && + $line =~ /\bif\s*((?:\(\s*){2,})/) { + my $openparens = $1; + my $count = $openparens =~ tr@\(@\(@; + my $msg = ""; + if ($line =~ /\bif\s*(?:\(\s*){$count,$count}$LvalOrFunc\s*($Compare)\s*$LvalOrFunc(?:\s*\)){$count,$count}/) { + my $comp = $4; #Not $1 because of $LvalOrFunc + $msg = " - maybe == should be = ?" if ($comp eq "=="); + WARN("UNNECESSARY_PARENTHESES", + "Unnecessary parentheses$msg\n" . $herecurr); + } + } + +# comparisons with a constant or upper case identifier on the left +# avoid cases like "foo + BAR < baz" +# only fix matches surrounded by parentheses to avoid incorrect +# conversions like "FOO < baz() + 5" being "misfixed" to "baz() > FOO + 5" + if ($perl_version_ok && + $line =~ /^\+(.*)\b($Constant|[A-Z_][A-Z0-9_]*)\s*($Compare)\s*($LvalOrFunc)/) { + my $lead = $1; + my $const = $2; + my $comp = $3; + my $to = $4; + my $newcomp = $comp; + if ($lead !~ /(?:$Operators|\.)\s*$/ && + $to !~ /^(?:Constant|[A-Z_][A-Z0-9_]*)$/ && + WARN("CONSTANT_COMPARISON", + "Comparisons should place the constant on the right side of the test\n" . $herecurr) && + $fix) { + if ($comp eq "<") { + $newcomp = ">"; + } elsif ($comp eq "<=") { + $newcomp = ">="; + } elsif ($comp eq ">") { + $newcomp = "<"; + } elsif ($comp eq ">=") { + $newcomp = "<="; + } + $fixed[$fixlinenr] =~ s/\(\s*\Q$const\E\s*$Compare\s*\Q$to\E\s*\)/($to $newcomp $const)/; + } + } + +# Return of what appears to be an errno should normally be negative + if ($sline =~ /\breturn(?:\s*\(+\s*|\s+)(E[A-Z]+)(?:\s*\)+\s*|\s*)[;:,]/) { + my $name = $1; + if ($name ne 'EOF' && $name ne 'ERROR') { + WARN("USE_NEGATIVE_ERRNO", + "return of an errno should typically be negative (ie: return -$1)\n" . $herecurr); + } + } + +# Need a space before open parenthesis after if, while etc + if ($line =~ /\b(if|while|for|switch)\(/) { + if (ERROR("SPACING", + "space required before the open parenthesis '('\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ + s/\b(if|while|for|switch)\(/$1 \(/; + } + } + +# Check for illegal assignment in if conditional -- and check for trailing +# statements after the conditional. + if ($line =~ /do\s*(?!{)/) { + ($stat, $cond, $line_nr_next, $remain_next, $off_next) = + ctx_statement_block($linenr, $realcnt, 0) + if (!defined $stat); + my ($stat_next) = ctx_statement_block($line_nr_next, + $remain_next, $off_next); + $stat_next =~ s/\n./\n /g; + ##print "stat<$stat> stat_next<$stat_next>\n"; + + if ($stat_next =~ /^\s*while\b/) { + # If the statement carries leading newlines, + # then count those as offsets. + my ($whitespace) = + ($stat_next =~ /^((?:\s*\n[+-])*\s*)/s); + my $offset = + statement_rawlines($whitespace) - 1; + + $suppress_whiletrailers{$line_nr_next + + $offset} = 1; + } + } + if (!defined $suppress_whiletrailers{$linenr} && + defined($stat) && defined($cond) && + $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) { + my ($s, $c) = ($stat, $cond); + + if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) { + if (ERROR("ASSIGN_IN_IF", + "do not use assignment in if condition\n" . $herecurr) && + $fix && $perl_version_ok) { + if ($rawline =~ /^\+(\s+)if\s*\(\s*(\!)?\s*\(\s*(($Lval)\s*=\s*$LvalOrFunc)\s*\)\s*(?:($Compare)\s*($FuncArg))?\s*\)\s*(\{)?\s*$/) { + my $space = $1; + my $not = $2; + my $statement = $3; + my $assigned = $4; + my $test = $8; + my $against = $9; + my $brace = $15; + fix_delete_line($fixlinenr, $rawline); + fix_insert_line($fixlinenr, "$space$statement;"); + my $newline = "${space}if ("; + $newline .= '!' if defined($not); + $newline .= '(' if (defined $not && defined($test) && defined($against)); + $newline .= "$assigned"; + $newline .= " $test $against" if (defined($test) && defined($against)); + $newline .= ')' if (defined $not && defined($test) && defined($against)); + $newline .= ')'; + $newline .= " {" if (defined($brace)); + fix_insert_line($fixlinenr + 1, $newline); + } + } + } + + # Find out what is on the end of the line after the + # conditional. + substr($s, 0, length($c), ''); + $s =~ s/\n.*//g; + $s =~ s/$;//g; # Remove any comments + if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ && + $c !~ /}\s*while\s*/) + { + # Find out how long the conditional actually is. + my @newlines = ($c =~ /\n/gs); + my $cond_lines = 1 + $#newlines; + my $stat_real = ''; + + $stat_real = raw_line($linenr, $cond_lines) + . "\n" if ($cond_lines); + if (defined($stat_real) && $cond_lines > 1) { + $stat_real = "[...]\n$stat_real"; + } + + ERROR("TRAILING_STATEMENTS", + "trailing statements should be on next line\n" . $herecurr . $stat_real); + } + } + +# Check for bitwise tests written as boolean + if ($line =~ / + (?: + (?:\[|\(|\&\&|\|\|) + \s*0[xX][0-9]+\s* + (?:\&\&|\|\|) + | + (?:\&\&|\|\|) + \s*0[xX][0-9]+\s* + (?:\&\&|\|\||\)|\]) + )/x) + { + WARN("HEXADECIMAL_BOOLEAN_TEST", + "boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr); + } + +# if and else should not have general statements after it + if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) { + my $s = $1; + $s =~ s/$;//g; # Remove any comments + if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) { + ERROR("TRAILING_STATEMENTS", + "trailing statements should be on next line\n" . $herecurr); + } + } +# if should not continue a brace + if ($line =~ /}\s*if\b/) { + ERROR("TRAILING_STATEMENTS", + "trailing statements should be on next line (or did you mean 'else if'?)\n" . + $herecurr); + } +# case and default should not have general statements after them + if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g && + $line !~ /\G(?: + (?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$| + \s*return\s+ + )/xg) + { + ERROR("TRAILING_STATEMENTS", + "trailing statements should be on next line\n" . $herecurr); + } + + # Check for }<nl>else {, these must be at the same + # indent level to be relevant to each other. + if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ && + $previndent == $indent) { + if (ERROR("ELSE_AFTER_BRACE", + "else should follow close brace '}'\n" . $hereprev) && + $fix && $prevline =~ /^\+/ && $line =~ /^\+/) { + fix_delete_line($fixlinenr - 1, $prevrawline); + fix_delete_line($fixlinenr, $rawline); + my $fixedline = $prevrawline; + $fixedline =~ s/}\s*$//; + if ($fixedline !~ /^\+\s*$/) { + fix_insert_line($fixlinenr, $fixedline); + } + $fixedline = $rawline; + $fixedline =~ s/^(.\s*)else/$1} else/; + fix_insert_line($fixlinenr, $fixedline); + } + } + + if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ && + $previndent == $indent) { + my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0); + + # Find out what is on the end of the line after the + # conditional. + substr($s, 0, length($c), ''); + $s =~ s/\n.*//g; + + if ($s =~ /^\s*;/) { + if (ERROR("WHILE_AFTER_BRACE", + "while should follow close brace '}'\n" . $hereprev) && + $fix && $prevline =~ /^\+/ && $line =~ /^\+/) { + fix_delete_line($fixlinenr - 1, $prevrawline); + fix_delete_line($fixlinenr, $rawline); + my $fixedline = $prevrawline; + my $trailing = $rawline; + $trailing =~ s/^\+//; + $trailing = trim($trailing); + $fixedline =~ s/}\s*$/} $trailing/; + fix_insert_line($fixlinenr, $fixedline); + } + } + } + +#Specific variable tests + while ($line =~ m{($Constant|$Lval)}g) { + my $var = $1; + +#CamelCase + if ($var !~ /^$Constant$/ && + $var =~ /[A-Z][a-z]|[a-z][A-Z]/ && +#Ignore Page<foo> variants + $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ && +#Ignore SI style variants like nS, mV and dB +#(ie: max_uV, regulator_min_uA_show, RANGE_mA_VALUE) + $var !~ /^(?:[a-z0-9_]*|[A-Z0-9_]*)?_?[a-z][A-Z](?:_[a-z0-9_]+|_[A-Z0-9_]+)?$/ && +#Ignore some three character SI units explicitly, like MiB and KHz + $var !~ /^(?:[a-z_]*?)_?(?:[KMGT]iB|[KMGT]?Hz)(?:_[a-z_]+)?$/) { + while ($var =~ m{($Ident)}g) { + my $word = $1; + next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/); + if ($check) { + seed_camelcase_includes(); + if (!$file && !$camelcase_file_seeded) { + seed_camelcase_file($realfile); + $camelcase_file_seeded = 1; + } + } + if (!defined $camelcase{$word}) { + $camelcase{$word} = 1; + CHK("CAMELCASE", + "Avoid CamelCase: <$word>\n" . $herecurr); + } + } + } + } + +#no spaces allowed after \ in define + if ($line =~ /\#\s*define.*\\\s+$/) { + if (WARN("WHITESPACE_AFTER_LINE_CONTINUATION", + "Whitespace after \\ makes next lines useless\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/\s+$//; + } + } + +# warn if <asm/foo.h> is #included and <linux/foo.h> is available and includes +# itself <asm/foo.h> (uses RAW line) + if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) { + my $file = "$1.h"; + my $checkfile = "include/linux/$file"; + if (-f "$root/$checkfile" && + $realfile ne $checkfile && + $1 !~ /$allowed_asm_includes/) + { + my $asminclude = `grep -Ec "#include\\s+<asm/$file>" $root/$checkfile`; + if ($asminclude > 0) { + if ($realfile =~ m{^arch/}) { + CHK("ARCH_INCLUDE_LINUX", + "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr); + } else { + WARN("INCLUDE_LINUX", + "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr); + } + } + } + } + +# multi-statement macros should be enclosed in a do while loop, grab the +# first statement and ensure its the whole macro if its not enclosed +# in a known good container + if ($realfile !~ m@/vmlinux.lds.h$@ && + $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) { + my $ln = $linenr; + my $cnt = $realcnt; + my ($off, $dstat, $dcond, $rest); + my $ctx = ''; + my $has_flow_statement = 0; + my $has_arg_concat = 0; + ($dstat, $dcond, $ln, $cnt, $off) = + ctx_statement_block($linenr, $realcnt, 0); + $ctx = $dstat; + #print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n"; + #print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n"; + + $has_flow_statement = 1 if ($ctx =~ /\b(goto|return)\b/); + $has_arg_concat = 1 if ($ctx =~ /\#\#/ && $ctx !~ /\#\#\s*(?:__VA_ARGS__|args)\b/); + + $dstat =~ s/^.\s*\#\s*define\s+$Ident(\([^\)]*\))?\s*//; + my $define_args = $1; + my $define_stmt = $dstat; + my @def_args = (); + + if (defined $define_args && $define_args ne "") { + $define_args = substr($define_args, 1, length($define_args) - 2); + $define_args =~ s/\s*//g; + $define_args =~ s/\\\+?//g; + @def_args = split(",", $define_args); + } + + $dstat =~ s/$;//g; + $dstat =~ s/\\\n.//g; + $dstat =~ s/^\s*//s; + $dstat =~ s/\s*$//s; + + # Flatten any parentheses and braces + while ($dstat =~ s/\([^\(\)]*\)/1u/ || + $dstat =~ s/\{[^\{\}]*\}/1u/ || + $dstat =~ s/.\[[^\[\]]*\]/1u/) + { + } + + # Flatten any obvious string concatenation. + while ($dstat =~ s/($String)\s*$Ident/$1/ || + $dstat =~ s/$Ident\s*($String)/$1/) + { + } + + # Make asm volatile uses seem like a generic function + $dstat =~ s/\b_*asm_*\s+_*volatile_*\b/asm_volatile/g; + + my $exceptions = qr{ + $Declare| + module_param_named| + MODULE_PARM_DESC| + DECLARE_PER_CPU| + DEFINE_PER_CPU| + __typeof__\(| + union| + struct| + \.$Ident\s*=\s*| + ^\"|\"$| + ^\[ + }x; + #print "REST<$rest> dstat<$dstat> ctx<$ctx>\n"; + + $ctx =~ s/\n*$//; + my $stmt_cnt = statement_rawlines($ctx); + my $herectx = get_stat_here($linenr, $stmt_cnt, $here); + + if ($dstat ne '' && + $dstat !~ /^(?:$Ident|-?$Constant),$/ && # 10, // foo(), + $dstat !~ /^(?:$Ident|-?$Constant);$/ && # foo(); + $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ && # 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz + $dstat !~ /^'X'$/ && $dstat !~ /^'XX'$/ && # character constants + $dstat !~ /$exceptions/ && + $dstat !~ /^\.$Ident\s*=/ && # .foo = + $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ && # stringification #foo + $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ && # do {...} while (...); // do {...} while (...) + $dstat !~ /^while\s*$Constant\s*$Constant\s*$/ && # while (...) {...} + $dstat !~ /^for\s*$Constant$/ && # for (...) + $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ && # for (...) bar() + $dstat !~ /^do\s*{/ && # do {... + $dstat !~ /^\(\{/ && # ({... + $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/) + { + if ($dstat =~ /^\s*if\b/) { + ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE", + "Macros starting with if should be enclosed by a do - while loop to avoid possible if/else logic defects\n" . "$herectx"); + } elsif ($dstat =~ /;/) { + ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE", + "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx"); + } else { + ERROR("COMPLEX_MACRO", + "Macros with complex values should be enclosed in parentheses\n" . "$herectx"); + } + + } + + # Make $define_stmt single line, comment-free, etc + my @stmt_array = split('\n', $define_stmt); + my $first = 1; + $define_stmt = ""; + foreach my $l (@stmt_array) { + $l =~ s/\\$//; + if ($first) { + $define_stmt = $l; + $first = 0; + } elsif ($l =~ /^[\+ ]/) { + $define_stmt .= substr($l, 1); + } + } + $define_stmt =~ s/$;//g; + $define_stmt =~ s/\s+/ /g; + $define_stmt = trim($define_stmt); + +# check if any macro arguments are reused (ignore '...' and 'type') + foreach my $arg (@def_args) { + next if ($arg =~ /\.\.\./); + next if ($arg =~ /^type$/i); + my $tmp_stmt = $define_stmt; + $tmp_stmt =~ s/\b(sizeof|typeof|__typeof__|__builtin\w+|typecheck\s*\(\s*$Type\s*,|\#+)\s*\(*\s*$arg\s*\)*\b//g; + $tmp_stmt =~ s/\#+\s*$arg\b//g; + $tmp_stmt =~ s/\b$arg\s*\#\#//g; + my $use_cnt = () = $tmp_stmt =~ /\b$arg\b/g; + if ($use_cnt > 1) { + CHK("MACRO_ARG_REUSE", + "Macro argument reuse '$arg' - possible side-effects?\n" . "$herectx"); + } +# check if any macro arguments may have other precedence issues + if ($tmp_stmt =~ m/($Operators)?\s*\b$arg\b\s*($Operators)?/m && + ((defined($1) && $1 ne ',') || + (defined($2) && $2 ne ','))) { + CHK("MACRO_ARG_PRECEDENCE", + "Macro argument '$arg' may be better as '($arg)' to avoid precedence issues\n" . "$herectx"); + } + } + +# check for macros with flow control, but without ## concatenation +# ## concatenation is commonly a macro that defines a function so ignore those + if ($has_flow_statement && !$has_arg_concat) { + my $cnt = statement_rawlines($ctx); + my $herectx = get_stat_here($linenr, $cnt, $here); + + WARN("MACRO_WITH_FLOW_CONTROL", + "Macros with flow control statements should be avoided\n" . "$herectx"); + } + +# check for line continuations outside of #defines, preprocessor #, and asm + + } else { + if ($prevline !~ /^..*\\$/ && + $line !~ /^\+\s*\#.*\\$/ && # preprocessor + $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ && # asm + $line =~ /^\+.*\\$/) { + WARN("LINE_CONTINUATIONS", + "Avoid unnecessary line continuations\n" . $herecurr); + } + } + +# do {} while (0) macro tests: +# single-statement macros do not need to be enclosed in do while (0) loop, +# macro should not end with a semicolon + if ($perl_version_ok && + $realfile !~ m@/vmlinux.lds.h$@ && + $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) { + my $ln = $linenr; + my $cnt = $realcnt; + my ($off, $dstat, $dcond, $rest); + my $ctx = ''; + ($dstat, $dcond, $ln, $cnt, $off) = + ctx_statement_block($linenr, $realcnt, 0); + $ctx = $dstat; + + $dstat =~ s/\\\n.//g; + $dstat =~ s/$;/ /g; + + if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) { + my $stmts = $2; + my $semis = $3; + + $ctx =~ s/\n*$//; + my $cnt = statement_rawlines($ctx); + my $herectx = get_stat_here($linenr, $cnt, $here); + + if (($stmts =~ tr/;/;/) == 1 && + $stmts !~ /^\s*(if|while|for|switch)\b/) { + WARN("SINGLE_STATEMENT_DO_WHILE_MACRO", + "Single statement macros should not use a do {} while (0) loop\n" . "$herectx"); + } + if (defined $semis && $semis ne "") { + WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON", + "do {} while (0) macros should not be semicolon terminated\n" . "$herectx"); + } + } elsif ($dstat =~ /^\+\s*#\s*define\s+$Ident.*;\s*$/) { + $ctx =~ s/\n*$//; + my $cnt = statement_rawlines($ctx); + my $herectx = get_stat_here($linenr, $cnt, $here); + + WARN("TRAILING_SEMICOLON", + "macros should not use a trailing semicolon\n" . "$herectx"); + } + } + +# check for redundant bracing round if etc + if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) { + my ($level, $endln, @chunks) = + ctx_statement_full($linenr, $realcnt, 1); + #print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n"; + #print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n"; + if ($#chunks > 0 && $level == 0) { + my @allowed = (); + my $allow = 0; + my $seen = 0; + my $herectx = $here . "\n"; + my $ln = $linenr - 1; + for my $chunk (@chunks) { + my ($cond, $block) = @{$chunk}; + + # If the condition carries leading newlines, then count those as offsets. + my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s); + my $offset = statement_rawlines($whitespace) - 1; + + $allowed[$allow] = 0; + #print "COND<$cond> whitespace<$whitespace> offset<$offset>\n"; + + # We have looked at and allowed this specific line. + $suppress_ifbraces{$ln + $offset} = 1; + + $herectx .= "$rawlines[$ln + $offset]\n[...]\n"; + $ln += statement_rawlines($block) - 1; + + substr($block, 0, length($cond), ''); + + $seen++ if ($block =~ /^\s*{/); + + #print "cond<$cond> block<$block> allowed<$allowed[$allow]>\n"; + if (statement_lines($cond) > 1) { + #print "APW: ALLOWED: cond<$cond>\n"; + $allowed[$allow] = 1; + } + if ($block =~/\b(?:if|for|while)\b/) { + #print "APW: ALLOWED: block<$block>\n"; + $allowed[$allow] = 1; + } + if (statement_block_size($block) > 1) { + #print "APW: ALLOWED: lines block<$block>\n"; + $allowed[$allow] = 1; + } + $allow++; + } + if ($seen) { + my $sum_allowed = 0; + foreach (@allowed) { + $sum_allowed += $_; + } + if ($sum_allowed == 0) { + WARN("BRACES", + "braces {} are not necessary for any arm of this statement\n" . $herectx); + } elsif ($sum_allowed != $allow && + $seen != $allow) { + CHK("BRACES", + "braces {} should be used on all arms of this statement\n" . $herectx); + } + } + } + } + if (!defined $suppress_ifbraces{$linenr - 1} && + $line =~ /\b(if|while|for|else)\b/) { + my $allowed = 0; + + # Check the pre-context. + if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) { + #print "APW: ALLOWED: pre<$1>\n"; + $allowed = 1; + } + + my ($level, $endln, @chunks) = + ctx_statement_full($linenr, $realcnt, $-[0]); + + # Check the condition. + my ($cond, $block) = @{$chunks[0]}; + #print "CHECKING<$linenr> cond<$cond> block<$block>\n"; + if (defined $cond) { + substr($block, 0, length($cond), ''); + } + if (statement_lines($cond) > 1) { + #print "APW: ALLOWED: cond<$cond>\n"; + $allowed = 1; + } + if ($block =~/\b(?:if|for|while)\b/) { + #print "APW: ALLOWED: block<$block>\n"; + $allowed = 1; + } + if (statement_block_size($block) > 1) { + #print "APW: ALLOWED: lines block<$block>\n"; + $allowed = 1; + } + # Check the post-context. + if (defined $chunks[1]) { + my ($cond, $block) = @{$chunks[1]}; + if (defined $cond) { + substr($block, 0, length($cond), ''); + } + if ($block =~ /^\s*\{/) { + #print "APW: ALLOWED: chunk-1 block<$block>\n"; + $allowed = 1; + } + } + if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) { + my $cnt = statement_rawlines($block); + my $herectx = get_stat_here($linenr, $cnt, $here); + + WARN("BRACES", + "braces {} are not necessary for single statement blocks\n" . $herectx); + } + } + +# check for single line unbalanced braces + if ($sline =~ /^.\s*\}\s*else\s*$/ || + $sline =~ /^.\s*else\s*\{\s*$/) { + CHK("BRACES", "Unbalanced braces around else statement\n" . $herecurr); + } + +# check for unnecessary blank lines around braces + if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) { + if (CHK("BRACES", + "Blank lines aren't necessary before a close brace '}'\n" . $hereprev) && + $fix && $prevrawline =~ /^\+/) { + fix_delete_line($fixlinenr - 1, $prevrawline); + } + } + if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) { + if (CHK("BRACES", + "Blank lines aren't necessary after an open brace '{'\n" . $hereprev) && + $fix) { + fix_delete_line($fixlinenr, $rawline); + } + } + +# no volatiles please + my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b}; + if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) { + WARN("VOLATILE", + "Use of volatile is usually wrong: see Documentation/process/volatile-considered-harmful.rst\n" . $herecurr); + } + +# Check for user-visible strings broken across lines, which breaks the ability +# to grep for the string. Make exceptions when the previous string ends in a +# newline (multiple lines in one string constant) or '\t', '\r', ';', or '{' +# (common in inline assembly) or is a octal \123 or hexadecimal \xaf value + if ($line =~ /^\+\s*$String/ && + $prevline =~ /"\s*$/ && + $prevrawline !~ /(?:\\(?:[ntr]|[0-7]{1,3}|x[0-9a-fA-F]{1,2})|;\s*|\{\s*)"\s*$/) { + if (WARN("SPLIT_STRING", + "quoted string split across lines\n" . $hereprev) && + $fix && + $prevrawline =~ /^\+.*"\s*$/ && + $last_coalesced_string_linenr != $linenr - 1) { + my $extracted_string = get_quoted_string($line, $rawline); + my $comma_close = ""; + if ($rawline =~ /\Q$extracted_string\E(\s*\)\s*;\s*$|\s*,\s*)/) { + $comma_close = $1; + } + + fix_delete_line($fixlinenr - 1, $prevrawline); + fix_delete_line($fixlinenr, $rawline); + my $fixedline = $prevrawline; + $fixedline =~ s/"\s*$//; + $fixedline .= substr($extracted_string, 1) . trim($comma_close); + fix_insert_line($fixlinenr - 1, $fixedline); + $fixedline = $rawline; + $fixedline =~ s/\Q$extracted_string\E\Q$comma_close\E//; + if ($fixedline !~ /\+\s*$/) { + fix_insert_line($fixlinenr, $fixedline); + } + $last_coalesced_string_linenr = $linenr; + } + } + +# check for missing a space in a string concatenation + if ($prevrawline =~ /[^\\]\w"$/ && $rawline =~ /^\+[\t ]+"\w/) { + WARN('MISSING_SPACE', + "break quoted strings at a space character\n" . $hereprev); + } + +# check for an embedded function name in a string when the function is known +# This does not work very well for -f --file checking as it depends on patch +# context providing the function name or a single line form for in-file +# function declarations + if ($line =~ /^\+.*$String/ && + defined($context_function) && + get_quoted_string($line, $rawline) =~ /\b$context_function\b/ && + length(get_quoted_string($line, $rawline)) != (length($context_function) + 2)) { + WARN("EMBEDDED_FUNCTION_NAME", + "Prefer using '\"%s...\", __func__' to using '$context_function', this function's name, in a string\n" . $herecurr); + } + +# check for spaces before a quoted newline + if ($rawline =~ /^.*\".*\s\\n/) { + if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE", + "unnecessary whitespace before a quoted newline\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/^(\+.*\".*)\s+\\n/$1\\n/; + } + + } + +# concatenated string without spaces between elements + if ($line =~ /$String[A-Za-z0-9_]/ || $line =~ /[A-Za-z0-9_]$String/) { + if (CHK("CONCATENATED_STRING", + "Concatenated strings should use spaces between elements\n" . $herecurr) && + $fix) { + while ($line =~ /($String)/g) { + my $extracted_string = substr($rawline, $-[0], $+[0] - $-[0]); + $fixed[$fixlinenr] =~ s/\Q$extracted_string\E([A-Za-z0-9_])/$extracted_string $1/; + $fixed[$fixlinenr] =~ s/([A-Za-z0-9_])\Q$extracted_string\E/$1 $extracted_string/; + } + } + } + +# uncoalesced string fragments + if ($line =~ /$String\s*"/) { + if (WARN("STRING_FRAGMENTS", + "Consecutive strings are generally better as a single string\n" . $herecurr) && + $fix) { + while ($line =~ /($String)(?=\s*")/g) { + my $extracted_string = substr($rawline, $-[0], $+[0] - $-[0]); + $fixed[$fixlinenr] =~ s/\Q$extracted_string\E\s*"/substr($extracted_string, 0, -1)/e; + } + } + } + +# check for non-standard and hex prefixed decimal printf formats + my $show_L = 1; #don't show the same defect twice + my $show_Z = 1; + while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) { + my $string = substr($rawline, $-[1], $+[1] - $-[1]); + $string =~ s/%%/__/g; + # check for %L + if ($show_L && $string =~ /%[\*\d\.\$]*L([diouxX])/) { + WARN("PRINTF_L", + "\%L$1 is non-standard C, use %ll$1\n" . $herecurr); + $show_L = 0; + } + # check for %Z + if ($show_Z && $string =~ /%[\*\d\.\$]*Z([diouxX])/) { + WARN("PRINTF_Z", + "%Z$1 is non-standard C, use %z$1\n" . $herecurr); + $show_Z = 0; + } + # check for 0x<decimal> + if ($string =~ /0x%[\*\d\.\$\Llzth]*[diou]/) { + ERROR("PRINTF_0XDECIMAL", + "Prefixing 0x with decimal output is defective\n" . $herecurr); + } + } + +# check for line continuations in quoted strings with odd counts of " + if ($rawline =~ /\\$/ && $sline =~ tr/"/"/ % 2) { + WARN("LINE_CONTINUATIONS", + "Avoid line continuations in quoted strings\n" . $herecurr); + } + +# warn about #if 0 + if ($line =~ /^.\s*\#\s*if\s+0\b/) { + WARN("IF_0", + "Consider removing the code enclosed by this #if 0 and its #endif\n" . $herecurr); + } + +# warn about #if 1 + if ($line =~ /^.\s*\#\s*if\s+1\b/) { + WARN("IF_1", + "Consider removing the #if 1 and its #endif\n" . $herecurr); + } + +# check for needless "if (<foo>) fn(<foo>)" uses + if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) { + my $tested = quotemeta($1); + my $expr = '\s*\(\s*' . $tested . '\s*\)\s*;'; + if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?|(?:kmem_cache|mempool|dma_pool)_destroy)$expr/) { + my $func = $1; + if (WARN('NEEDLESS_IF', + "$func(NULL) is safe and this check is probably not required\n" . $hereprev) && + $fix) { + my $do_fix = 1; + my $leading_tabs = ""; + my $new_leading_tabs = ""; + if ($lines[$linenr - 2] =~ /^\+(\t*)if\s*\(\s*$tested\s*\)\s*$/) { + $leading_tabs = $1; + } else { + $do_fix = 0; + } + if ($lines[$linenr - 1] =~ /^\+(\t+)$func\s*\(\s*$tested\s*\)\s*;\s*$/) { + $new_leading_tabs = $1; + if (length($leading_tabs) + 1 ne length($new_leading_tabs)) { + $do_fix = 0; + } + } else { + $do_fix = 0; + } + if ($do_fix) { + fix_delete_line($fixlinenr - 1, $prevrawline); + $fixed[$fixlinenr] =~ s/^\+$new_leading_tabs/\+$leading_tabs/; + } + } + } + } + +# check for unnecessary "Out of Memory" messages + if ($line =~ /^\+.*\b$logFunctions\s*\(/ && + $prevline =~ /^[ \+]\s*if\s*\(\s*(\!\s*|NULL\s*==\s*)?($Lval)(\s*==\s*NULL\s*)?\s*\)/ && + (defined $1 || defined $3) && + $linenr > 3) { + my $testval = $2; + my $testline = $lines[$linenr - 3]; + + my ($s, $c) = ctx_statement_block($linenr - 3, $realcnt, 0); +# print("line: <$line>\nprevline: <$prevline>\ns: <$s>\nc: <$c>\n\n\n"); + + if ($s =~ /(?:^|\n)[ \+]\s*(?:$Type\s*)?\Q$testval\E\s*=\s*(?:\([^\)]*\)\s*)?\s*$allocFunctions\s*\(/ && + $s !~ /\b__GFP_NOWARN\b/ ) { + WARN("OOM_MESSAGE", + "Possible unnecessary 'out of memory' message\n" . $hereprev); + } + } + +# check for logging functions with KERN_<LEVEL> + if ($line !~ /printk(?:_ratelimited|_once)?\s*\(/ && + $line =~ /\b$logFunctions\s*\(.*\b(KERN_[A-Z]+)\b/) { + my $level = $1; + if (WARN("UNNECESSARY_KERN_LEVEL", + "Possible unnecessary $level\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/\s*$level\s*//; + } + } + +# check for logging continuations + if ($line =~ /\bprintk\s*\(\s*KERN_CONT\b|\bpr_cont\s*\(/) { + WARN("LOGGING_CONTINUATION", + "Avoid logging continuation uses where feasible\n" . $herecurr); + } + +# check for mask then right shift without a parentheses + if ($perl_version_ok && + $line =~ /$LvalOrFunc\s*\&\s*($LvalOrFunc)\s*>>/ && + $4 !~ /^\&/) { # $LvalOrFunc may be &foo, ignore if so + WARN("MASK_THEN_SHIFT", + "Possible precedence defect with mask then right shift - may need parentheses\n" . $herecurr); + } + +# check for pointer comparisons to NULL + if ($perl_version_ok) { + while ($line =~ /\b$LvalOrFunc\s*(==|\!=)\s*NULL\b/g) { + my $val = $1; + my $equal = "!"; + $equal = "" if ($4 eq "!="); + if (CHK("COMPARISON_TO_NULL", + "Comparison to NULL could be written \"${equal}${val}\"\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/\b\Q$val\E\s*(?:==|\!=)\s*NULL\b/$equal$val/; + } + } + } + +# check for bad placement of section $InitAttribute (e.g.: __initdata) + if ($line =~ /(\b$InitAttribute\b)/) { + my $attr = $1; + if ($line =~ /^\+\s*static\s+(?:const\s+)?(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*[=;]/) { + my $ptr = $1; + my $var = $2; + if ((($ptr =~ /\b(union|struct)\s+$attr\b/ && + ERROR("MISPLACED_INIT", + "$attr should be placed after $var\n" . $herecurr)) || + ($ptr !~ /\b(union|struct)\s+$attr\b/ && + WARN("MISPLACED_INIT", + "$attr should be placed after $var\n" . $herecurr))) && + $fix) { + $fixed[$fixlinenr] =~ s/(\bstatic\s+(?:const\s+)?)(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*([=;])\s*/"$1" . trim(string_find_replace($2, "\\s*$attr\\s*", " ")) . " " . trim(string_find_replace($3, "\\s*$attr\\s*", "")) . " $attr" . ("$4" eq ";" ? ";" : " = ")/e; + } + } + } + +# check for $InitAttributeData (ie: __initdata) with const + if ($line =~ /\bconst\b/ && $line =~ /($InitAttributeData)/) { + my $attr = $1; + $attr =~ /($InitAttributePrefix)(.*)/; + my $attr_prefix = $1; + my $attr_type = $2; + if (ERROR("INIT_ATTRIBUTE", + "Use of const init definition must use ${attr_prefix}initconst\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ + s/$InitAttributeData/${attr_prefix}initconst/; + } + } + +# check for $InitAttributeConst (ie: __initconst) without const + if ($line !~ /\bconst\b/ && $line =~ /($InitAttributeConst)/) { + my $attr = $1; + if (ERROR("INIT_ATTRIBUTE", + "Use of $attr requires a separate use of const\n" . $herecurr) && + $fix) { + my $lead = $fixed[$fixlinenr] =~ + /(^\+\s*(?:static\s+))/; + $lead = rtrim($1); + $lead = "$lead " if ($lead !~ /^\+$/); + $lead = "${lead}const "; + $fixed[$fixlinenr] =~ s/(^\+\s*(?:static\s+))/$lead/; + } + } + +# check for __read_mostly with const non-pointer (should just be const) + if ($line =~ /\b__read_mostly\b/ && + $line =~ /($Type)\s*$Ident/ && $1 !~ /\*\s*$/ && $1 =~ /\bconst\b/) { + if (ERROR("CONST_READ_MOSTLY", + "Invalid use of __read_mostly with const type\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/\s+__read_mostly\b//; + } + } + +# don't use __constant_<foo> functions outside of include/uapi/ + if ($realfile !~ m@^include/uapi/@ && + $line =~ /(__constant_(?:htons|ntohs|[bl]e(?:16|32|64)_to_cpu|cpu_to_[bl]e(?:16|32|64)))\s*\(/) { + my $constant_func = $1; + my $func = $constant_func; + $func =~ s/^__constant_//; + if (WARN("CONSTANT_CONVERSION", + "$constant_func should be $func\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/\b$constant_func\b/$func/g; + } + } + +# prefer usleep_range over udelay + if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) { + my $delay = $1; + # ignore udelay's < 10, however + if (! ($delay < 10) ) { + CHK("USLEEP_RANGE", + "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.rst\n" . $herecurr); + } + if ($delay > 2000) { + WARN("LONG_UDELAY", + "long udelay - prefer mdelay; see arch/arm/include/asm/delay.h\n" . $herecurr); + } + } + +# warn about unexpectedly long msleep's + if ($line =~ /\bmsleep\s*\((\d+)\);/) { + if ($1 < 20) { + WARN("MSLEEP", + "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.rst\n" . $herecurr); + } + } + +# check for comparisons of jiffies + if ($line =~ /\bjiffies\s*$Compare|$Compare\s*jiffies\b/) { + WARN("JIFFIES_COMPARISON", + "Comparing jiffies is almost always wrong; prefer time_after, time_before and friends\n" . $herecurr); + } + +# check for comparisons of get_jiffies_64() + if ($line =~ /\bget_jiffies_64\s*\(\s*\)\s*$Compare|$Compare\s*get_jiffies_64\s*\(\s*\)/) { + WARN("JIFFIES_COMPARISON", + "Comparing get_jiffies_64() is almost always wrong; prefer time_after64, time_before64 and friends\n" . $herecurr); + } + +# warn about #ifdefs in C files +# if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) { +# print "#ifdef in C files should be avoided\n"; +# print "$herecurr"; +# $clean = 0; +# } + +# warn about spacing in #ifdefs + if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) { + if (ERROR("SPACING", + "exactly one space required after that #$1\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ + s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /; + } + + } + +# check for spinlock_t definitions without a comment. + if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ || + $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) { + my $which = $1; + if (!ctx_has_comment($first_line, $linenr)) { + CHK("UNCOMMENTED_DEFINITION", + "$1 definition without comment\n" . $herecurr); + } + } +# check for memory barriers without a comment. + + my $barriers = qr{ + mb| + rmb| + wmb + }x; + my $barrier_stems = qr{ + mb__before_atomic| + mb__after_atomic| + store_release| + load_acquire| + store_mb| + (?:$barriers) + }x; + my $all_barriers = qr{ + (?:$barriers)| + smp_(?:$barrier_stems)| + virt_(?:$barrier_stems) + }x; + + if ($line =~ /\b(?:$all_barriers)\s*\(/) { + if (!ctx_has_comment($first_line, $linenr)) { + WARN("MEMORY_BARRIER", + "memory barrier without comment\n" . $herecurr); + } + } + + my $underscore_smp_barriers = qr{__smp_(?:$barrier_stems)}x; + + if ($realfile !~ m@^include/asm-generic/@ && + $realfile !~ m@/barrier\.h$@ && + $line =~ m/\b(?:$underscore_smp_barriers)\s*\(/ && + $line !~ m/^.\s*\#\s*define\s+(?:$underscore_smp_barriers)\s*\(/) { + WARN("MEMORY_BARRIER", + "__smp memory barriers shouldn't be used outside barrier.h and asm-generic\n" . $herecurr); + } + +# check for waitqueue_active without a comment. + if ($line =~ /\bwaitqueue_active\s*\(/) { + if (!ctx_has_comment($first_line, $linenr)) { + WARN("WAITQUEUE_ACTIVE", + "waitqueue_active without comment\n" . $herecurr); + } + } + +# check for data_race without a comment. + if ($line =~ /\bdata_race\s*\(/) { + if (!ctx_has_comment($first_line, $linenr)) { + WARN("DATA_RACE", + "data_race without comment\n" . $herecurr); + } + } + +# check of hardware specific defines + if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) { + CHK("ARCH_DEFINES", + "architecture specific defines should be avoided\n" . $herecurr); + } + +# check that the storage class is not after a type + if ($line =~ /\b($Type)\s+($Storage)\b/) { + WARN("STORAGE_CLASS", + "storage class '$2' should be located before type '$1'\n" . $herecurr); + } +# Check that the storage class is at the beginning of a declaration + if ($line =~ /\b$Storage\b/ && + $line !~ /^.\s*$Storage/ && + $line =~ /^.\s*(.+?)\$Storage\s/ && + $1 !~ /[\,\)]\s*$/) { + WARN("STORAGE_CLASS", + "storage class should be at the beginning of the declaration\n" . $herecurr); + } + +# check the location of the inline attribute, that it is between +# storage class and type. + if ($line =~ /\b$Type\s+$Inline\b/ || + $line =~ /\b$Inline\s+$Storage\b/) { + ERROR("INLINE_LOCATION", + "inline keyword should sit between storage class and type\n" . $herecurr); + } + +# Check for __inline__ and __inline, prefer inline + if ($realfile !~ m@\binclude/uapi/@ && + $line =~ /\b(__inline__|__inline)\b/) { + if (WARN("INLINE", + "plain inline is preferred over $1\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/\b(__inline__|__inline)\b/inline/; + + } + } + +# Check for __attribute__ packed, prefer __packed + if ($realfile !~ m@\binclude/uapi/@ && + $line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) { + WARN("PREFER_PACKED", + "__packed is preferred over __attribute__((packed))\n" . $herecurr); + } + +# Check for __attribute__ aligned, prefer __aligned + if ($realfile !~ m@\binclude/uapi/@ && + $line =~ /\b__attribute__\s*\(\s*\(.*aligned/) { + WARN("PREFER_ALIGNED", + "__aligned(size) is preferred over __attribute__((aligned(size)))\n" . $herecurr); + } + +# Check for __attribute__ section, prefer __section + if ($realfile !~ m@\binclude/uapi/@ && + $line =~ /\b__attribute__\s*\(\s*\(.*_*section_*\s*\(\s*("[^"]*")/) { + my $old = substr($rawline, $-[1], $+[1] - $-[1]); + my $new = substr($old, 1, -1); + if (WARN("PREFER_SECTION", + "__section($new) is preferred over __attribute__((section($old)))\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*_*section_*\s*\(\s*\Q$old\E\s*\)\s*\)\s*\)/__section($new)/; + } + } + +# Check for __attribute__ format(printf, prefer __printf + if ($realfile !~ m@\binclude/uapi/@ && + $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) { + if (WARN("PREFER_PRINTF", + "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf\s*,\s*(.*)\)\s*\)\s*\)/"__printf(" . trim($1) . ")"/ex; + + } + } + +# Check for __attribute__ format(scanf, prefer __scanf + if ($realfile !~ m@\binclude/uapi/@ && + $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) { + if (WARN("PREFER_SCANF", + "__scanf(string-index, first-to-check) is preferred over __attribute__((format(scanf, string-index, first-to-check)))\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\s*,\s*(.*)\)\s*\)\s*\)/"__scanf(" . trim($1) . ")"/ex; + } + } + +# Check for __attribute__ weak, or __weak declarations (may have link issues) + if ($perl_version_ok && + $line =~ /(?:$Declare|$DeclareMisordered)\s*$Ident\s*$balanced_parens\s*(?:$Attribute)?\s*;/ && + ($line =~ /\b__attribute__\s*\(\s*\(.*\bweak\b/ || + $line =~ /\b__weak\b/)) { + ERROR("WEAK_DECLARATION", + "Using weak declarations can have unintended link defects\n" . $herecurr); + } + +# check for c99 types like uint8_t used outside of uapi/ and tools/ + if ($realfile !~ m@\binclude/uapi/@ && + $realfile !~ m@\btools/@ && + $line =~ /\b($Declare)\s*$Ident\s*[=;,\[]/) { + my $type = $1; + if ($type =~ /\b($typeC99Typedefs)\b/) { + $type = $1; + my $kernel_type = 'u'; + $kernel_type = 's' if ($type =~ /^_*[si]/); + $type =~ /(\d+)/; + $kernel_type .= $1; + if (CHK("PREFER_KERNEL_TYPES", + "Prefer kernel type '$kernel_type' over '$type'\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/\b$type\b/$kernel_type/; + } + } + } + +# check for cast of C90 native int or longer types constants + if ($line =~ /(\(\s*$C90_int_types\s*\)\s*)($Constant)\b/) { + my $cast = $1; + my $const = $2; + if (WARN("TYPECAST_INT_CONSTANT", + "Unnecessary typecast of c90 int constant\n" . $herecurr) && + $fix) { + my $suffix = ""; + my $newconst = $const; + $newconst =~ s/${Int_type}$//; + $suffix .= 'U' if ($cast =~ /\bunsigned\b/); + if ($cast =~ /\blong\s+long\b/) { + $suffix .= 'LL'; + } elsif ($cast =~ /\blong\b/) { + $suffix .= 'L'; + } + $fixed[$fixlinenr] =~ s/\Q$cast\E$const\b/$newconst$suffix/; + } + } + +# check for sizeof(&) + if ($line =~ /\bsizeof\s*\(\s*\&/) { + WARN("SIZEOF_ADDRESS", + "sizeof(& should be avoided\n" . $herecurr); + } + +# check for sizeof without parenthesis + if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) { + if (WARN("SIZEOF_PARENTHESIS", + "sizeof $1 should be sizeof($1)\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex; + } + } + +# check for struct spinlock declarations + if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) { + WARN("USE_SPINLOCK_T", + "struct spinlock should be spinlock_t\n" . $herecurr); + } + +# check for seq_printf uses that could be seq_puts + if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) { + my $fmt = get_quoted_string($line, $rawline); + $fmt =~ s/%%//g; + if ($fmt !~ /%/) { + if (WARN("PREFER_SEQ_PUTS", + "Prefer seq_puts to seq_printf\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/\bseq_printf\b/seq_puts/; + } + } + } + +# check for vsprintf extension %p<foo> misuses + if ($perl_version_ok && + defined $stat && + $stat =~ /^\+(?![^\{]*\{\s*).*\b(\w+)\s*\(.*$String\s*,/s && + $1 !~ /^_*volatile_*$/) { + my $stat_real; + + my $lc = $stat =~ tr@\n@@; + $lc = $lc + $linenr; + for (my $count = $linenr; $count <= $lc; $count++) { + my $specifier; + my $extension; + my $qualifier; + my $bad_specifier = ""; + my $fmt = get_quoted_string($lines[$count - 1], raw_line($count, 0)); + $fmt =~ s/%%//g; + + while ($fmt =~ /(\%[\*\d\.]*p(\w)(\w*))/g) { + $specifier = $1; + $extension = $2; + $qualifier = $3; + if ($extension !~ /[SsBKRraEehMmIiUDdgVCbGNOxtf]/ || + ($extension eq "f" && + defined $qualifier && $qualifier !~ /^w/)) { + $bad_specifier = $specifier; + last; + } + if ($extension eq "x" && !defined($stat_real)) { + if (!defined($stat_real)) { + $stat_real = get_stat_real($linenr, $lc); + } + WARN("VSPRINTF_SPECIFIER_PX", + "Using vsprintf specifier '\%px' potentially exposes the kernel memory layout, if you don't really need the address please consider using '\%p'.\n" . "$here\n$stat_real\n"); + } + } + if ($bad_specifier ne "") { + my $stat_real = get_stat_real($linenr, $lc); + my $ext_type = "Invalid"; + my $use = ""; + if ($bad_specifier =~ /p[Ff]/) { + $use = " - use %pS instead"; + $use =~ s/pS/ps/ if ($bad_specifier =~ /pf/); + } + + WARN("VSPRINTF_POINTER_EXTENSION", + "$ext_type vsprintf pointer extension '$bad_specifier'$use\n" . "$here\n$stat_real\n"); + } + } + } + +# Check for misused memsets + if ($perl_version_ok && + defined $stat && + $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/) { + + my $ms_addr = $2; + my $ms_val = $7; + my $ms_size = $12; + + if ($ms_size =~ /^(0x|)0$/i) { + ERROR("MEMSET", + "memset to 0's uses 0 as the 2nd argument, not the 3rd\n" . "$here\n$stat\n"); + } elsif ($ms_size =~ /^(0x|)1$/i) { + WARN("MEMSET", + "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . "$here\n$stat\n"); + } + } + +# Check for memcpy(foo, bar, ETH_ALEN) that could be ether_addr_copy(foo, bar) +# if ($perl_version_ok && +# defined $stat && +# $stat =~ /^\+(?:.*?)\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) { +# if (WARN("PREFER_ETHER_ADDR_COPY", +# "Prefer ether_addr_copy() over memcpy() if the Ethernet addresses are __aligned(2)\n" . "$here\n$stat\n") && +# $fix) { +# $fixed[$fixlinenr] =~ s/\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/ether_addr_copy($2, $7)/; +# } +# } + +# Check for memcmp(foo, bar, ETH_ALEN) that could be ether_addr_equal*(foo, bar) +# if ($perl_version_ok && +# defined $stat && +# $stat =~ /^\+(?:.*?)\bmemcmp\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) { +# WARN("PREFER_ETHER_ADDR_EQUAL", +# "Prefer ether_addr_equal() or ether_addr_equal_unaligned() over memcmp()\n" . "$here\n$stat\n") +# } + +# check for memset(foo, 0x0, ETH_ALEN) that could be eth_zero_addr +# check for memset(foo, 0xFF, ETH_ALEN) that could be eth_broadcast_addr +# if ($perl_version_ok && +# defined $stat && +# $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) { +# +# my $ms_val = $7; +# +# if ($ms_val =~ /^(?:0x|)0+$/i) { +# if (WARN("PREFER_ETH_ZERO_ADDR", +# "Prefer eth_zero_addr over memset()\n" . "$here\n$stat\n") && +# $fix) { +# $fixed[$fixlinenr] =~ s/\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*,\s*ETH_ALEN\s*\)/eth_zero_addr($2)/; +# } +# } elsif ($ms_val =~ /^(?:0xff|255)$/i) { +# if (WARN("PREFER_ETH_BROADCAST_ADDR", +# "Prefer eth_broadcast_addr() over memset()\n" . "$here\n$stat\n") && +# $fix) { +# $fixed[$fixlinenr] =~ s/\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*,\s*ETH_ALEN\s*\)/eth_broadcast_addr($2)/; +# } +# } +# } + +# typecasts on min/max could be min_t/max_t + if ($perl_version_ok && + defined $stat && + $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) { + if (defined $2 || defined $7) { + my $call = $1; + my $cast1 = deparenthesize($2); + my $arg1 = $3; + my $cast2 = deparenthesize($7); + my $arg2 = $8; + my $cast; + + if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) { + $cast = "$cast1 or $cast2"; + } elsif ($cast1 ne "") { + $cast = $cast1; + } else { + $cast = $cast2; + } + WARN("MINMAX", + "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . "$here\n$stat\n"); + } + } + +# check usleep_range arguments + if ($perl_version_ok && + defined $stat && + $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) { + my $min = $1; + my $max = $7; + if ($min eq $max) { + WARN("USLEEP_RANGE", + "usleep_range should not use min == max args; see Documentation/timers/timers-howto.rst\n" . "$here\n$stat\n"); + } elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ && + $min > $max) { + WARN("USLEEP_RANGE", + "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.rst\n" . "$here\n$stat\n"); + } + } + +# check for naked sscanf + if ($perl_version_ok && + defined $stat && + $line =~ /\bsscanf\b/ && + ($stat !~ /$Ident\s*=\s*sscanf\s*$balanced_parens/ && + $stat !~ /\bsscanf\s*$balanced_parens\s*(?:$Compare)/ && + $stat !~ /(?:$Compare)\s*\bsscanf\s*$balanced_parens/)) { + my $lc = $stat =~ tr@\n@@; + $lc = $lc + $linenr; + my $stat_real = get_stat_real($linenr, $lc); + WARN("NAKED_SSCANF", + "unchecked sscanf return value\n" . "$here\n$stat_real\n"); + } + +# check for simple sscanf that should be kstrto<foo> + if ($perl_version_ok && + defined $stat && + $line =~ /\bsscanf\b/) { + my $lc = $stat =~ tr@\n@@; + $lc = $lc + $linenr; + my $stat_real = get_stat_real($linenr, $lc); + if ($stat_real =~ /\bsscanf\b\s*\(\s*$FuncArg\s*,\s*("[^"]+")/) { + my $format = $6; + my $count = $format =~ tr@%@%@; + if ($count == 1 && + $format =~ /^"\%(?i:ll[udxi]|[udxi]ll|ll|[hl]h?[udxi]|[udxi][hl]h?|[hl]h?|[udxi])"$/) { + WARN("SSCANF_TO_KSTRTO", + "Prefer kstrto<type> to single variable sscanf\n" . "$here\n$stat_real\n"); + } + } + } + +# check for new externs in .h files. + if ($realfile =~ /\.h$/ && + $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) { + if (CHK("AVOID_EXTERNS", + "extern prototypes should be avoided in .h files\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/(.*)\bextern\b\s*(.*)/$1$2/; + } + } + +# check for new externs in .c files. + if ($realfile =~ /\.c$/ && defined $stat && + $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s) + { + my $function_name = $1; + my $paren_space = $2; + + my $s = $stat; + if (defined $cond) { + substr($s, 0, length($cond), ''); + } + if ($s =~ /^\s*;/) + { + WARN("AVOID_EXTERNS", + "externs should be avoided in .c files\n" . $herecurr); + } + + if ($paren_space =~ /\n/) { + WARN("FUNCTION_ARGUMENTS", + "arguments for function declarations should follow identifier\n" . $herecurr); + } + + } elsif ($realfile =~ /\.c$/ && defined $stat && + $stat =~ /^.\s*extern\s+/) + { + WARN("AVOID_EXTERNS", + "externs should be avoided in .c files\n" . $herecurr); + } + +# check for function declarations that have arguments without identifier names + if (defined $stat && + $stat =~ /^.\s*(?:extern\s+)?$Type\s*(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*\(\s*([^{]+)\s*\)\s*;/s && + $1 ne "void") { + my $args = trim($1); + while ($args =~ m/\s*($Type\s*(?:$Ident|\(\s*\*\s*$Ident?\s*\)\s*$balanced_parens)?)/g) { + my $arg = trim($1); + if ($arg =~ /^$Type$/ && $arg !~ /enum\s+$Ident$/) { + WARN("FUNCTION_ARGUMENTS", + "function definition argument '$arg' should also have an identifier name\n" . $herecurr); + } + } + } + +# check for function definitions + if ($perl_version_ok && + defined $stat && + $stat =~ /^.\s*(?:$Storage\s+)?$Type\s*($Ident)\s*$balanced_parens\s*{/s) { + $context_function = $1; + +# check for multiline function definition with misplaced open brace + my $ok = 0; + my $cnt = statement_rawlines($stat); + my $herectx = $here . "\n"; + for (my $n = 0; $n < $cnt; $n++) { + my $rl = raw_line($linenr, $n); + $herectx .= $rl . "\n"; + $ok = 1 if ($rl =~ /^[ \+]\{/); + $ok = 1 if ($rl =~ /\{/ && $n == 0); + last if $rl =~ /^[ \+].*\{/; + } + if (!$ok) { + ERROR("OPEN_BRACE", + "open brace '{' following function definitions go on the next line\n" . $herectx); + } + } + +# checks for new __setup's + if ($rawline =~ /\b__setup\("([^"]*)"/) { + my $name = $1; + + if (!grep(/$name/, @setup_docs)) { + CHK("UNDOCUMENTED_SETUP", + "__setup appears un-documented -- check Documentation/admin-guide/kernel-parameters.txt\n" . $herecurr); + } + } + +# check for pointless casting of alloc functions + if ($line =~ /\*\s*\)\s*$allocFunctions\b/) { + WARN("UNNECESSARY_CASTS", + "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr); + } + +# alloc style +# p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...) + if ($perl_version_ok && + $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*((?:kv|k|v)[mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) { + CHK("ALLOC_SIZEOF_STRUCT", + "Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr); + } + +# check for k[mz]alloc with multiplies that could be kmalloc_array/kcalloc + if ($perl_version_ok && + defined $stat && + $stat =~ /^\+\s*($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)\s*,/) { + my $oldfunc = $3; + my $a1 = $4; + my $a2 = $10; + my $newfunc = "kmalloc_array"; + $newfunc = "kcalloc" if ($oldfunc eq "kzalloc"); + my $r1 = $a1; + my $r2 = $a2; + if ($a1 =~ /^sizeof\s*\S/) { + $r1 = $a2; + $r2 = $a1; + } + if ($r1 !~ /^sizeof\b/ && $r2 =~ /^sizeof\s*\S/ && + !($r1 =~ /^$Constant$/ || $r1 =~ /^[A-Z_][A-Z0-9_]*$/)) { + my $cnt = statement_rawlines($stat); + my $herectx = get_stat_here($linenr, $cnt, $here); + + if (WARN("ALLOC_WITH_MULTIPLY", + "Prefer $newfunc over $oldfunc with multiply\n" . $herectx) && + $cnt == 1 && + $fix) { + $fixed[$fixlinenr] =~ s/\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)/$1 . ' = ' . "$newfunc(" . trim($r1) . ', ' . trim($r2)/e; + } + } + } + +# check for krealloc arg reuse + if ($perl_version_ok && + $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*($Lval)\s*,/ && + $1 eq $3) { + WARN("KREALLOC_ARG_REUSE", + "Reusing the krealloc arg is almost always a bug\n" . $herecurr); + } + +# check for alloc argument mismatch + if ($line =~ /\b(kcalloc|kmalloc_array)\s*\(\s*sizeof\b/) { + WARN("ALLOC_ARRAY_ARGS", + "$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr); + } + +# check for multiple semicolons + if ($line =~ /;\s*;\s*$/) { + if (WARN("ONE_SEMICOLON", + "Statements terminations use 1 semicolon\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/(\s*;\s*){2,}$/;/g; + } + } + +# check for #defines like: 1 << <digit> that could be BIT(digit), it is not exported to uapi + if ($realfile !~ m@^include/uapi/@ && + $line =~ /#\s*define\s+\w+\s+\(?\s*1\s*([ulUL]*)\s*\<\<\s*(?:\d+|$Ident)\s*\)?/) { + my $ull = ""; + $ull = "_ULL" if (defined($1) && $1 =~ /ll/i); + if (CHK("BIT_MACRO", + "Prefer using the BIT$ull macro\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/\(?\s*1\s*[ulUL]*\s*<<\s*(\d+|$Ident)\s*\)?/BIT${ull}($1)/; + } + } + +# check for IS_ENABLED() without CONFIG_<FOO> ($rawline for comments too) + if ($rawline =~ /\bIS_ENABLED\s*\(\s*(\w+)\s*\)/ && $1 !~ /^${CONFIG_}/) { + WARN("IS_ENABLED_CONFIG", + "IS_ENABLED($1) is normally used as IS_ENABLED(${CONFIG_}$1)\n" . $herecurr); + } + +# check for #if defined CONFIG_<FOO> || defined CONFIG_<FOO>_MODULE + if ($line =~ /^\+\s*#\s*if\s+defined(?:\s*\(?\s*|\s+)(${CONFIG_}[A-Z_]+)\s*\)?\s*\|\|\s*defined(?:\s*\(?\s*|\s+)\1_MODULE\s*\)?\s*$/) { + my $config = $1; + if (WARN("PREFER_IS_ENABLED", + "Prefer IS_ENABLED(<FOO>) to ${CONFIG_}<FOO> || ${CONFIG_}<FOO>_MODULE\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] = "\+#if IS_ENABLED($config)"; + } + } + +# check for /* fallthrough */ like comment, prefer fallthrough; + my @fallthroughs = ( + 'fallthrough', + '@fallthrough@', + 'lint -fallthrough[ \t]*', + 'intentional(?:ly)?[ \t]*fall(?:(?:s | |-)[Tt]|t)hr(?:ough|u|ew)', + '(?:else,?\s*)?FALL(?:S | |-)?THR(?:OUGH|U|EW)[ \t.!]*(?:-[^\n\r]*)?', + 'Fall(?:(?:s | |-)[Tt]|t)hr(?:ough|u|ew)[ \t.!]*(?:-[^\n\r]*)?', + 'fall(?:s | |-)?thr(?:ough|u|ew)[ \t.!]*(?:-[^\n\r]*)?', + ); + if ($raw_comment ne '') { + foreach my $ft (@fallthroughs) { + if ($raw_comment =~ /$ft/) { + my $msg_level = \&WARN; + $msg_level = \&CHK if ($file); + &{$msg_level}("PREFER_FALLTHROUGH", + "Prefer 'fallthrough;' over fallthrough comment\n" . $herecurr); + last; + } + } + } + +# check for switch/default statements without a break; + if ($perl_version_ok && + defined $stat && + $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) { + my $cnt = statement_rawlines($stat); + my $herectx = get_stat_here($linenr, $cnt, $here); + + WARN("DEFAULT_NO_BREAK", + "switch default: should use break\n" . $herectx); + } + +# check for gcc specific __FUNCTION__ + if ($line =~ /\b__FUNCTION__\b/) { + if (WARN("USE_FUNC", + "__func__ should be used instead of gcc specific __FUNCTION__\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/\b__FUNCTION__\b/__func__/g; + } + } + +# check for uses of __DATE__, __TIME__, __TIMESTAMP__ + while ($line =~ /\b(__(?:DATE|TIME|TIMESTAMP)__)\b/g) { + ERROR("DATE_TIME", + "Use of the '$1' macro makes the build non-deterministic\n" . $herecurr); + } + +# check for use of yield() + if ($line =~ /\byield\s*\(\s*\)/) { + WARN("YIELD", + "Using yield() is generally wrong. See yield() kernel-doc (sched/core.c)\n" . $herecurr); + } + +# check for comparisons against true and false + if ($line =~ /\+\s*(.*?)\b(true|false|$Lval)\s*(==|\!=)\s*(true|false|$Lval)\b(.*)$/i) { + my $lead = $1; + my $arg = $2; + my $test = $3; + my $otype = $4; + my $trail = $5; + my $op = "!"; + + ($arg, $otype) = ($otype, $arg) if ($arg =~ /^(?:true|false)$/i); + + my $type = lc($otype); + if ($type =~ /^(?:true|false)$/) { + if (("$test" eq "==" && "$type" eq "true") || + ("$test" eq "!=" && "$type" eq "false")) { + $op = ""; + } + + CHK("BOOL_COMPARISON", + "Using comparison to $otype is error prone\n" . $herecurr); + +## maybe suggesting a correct construct would better +## "Using comparison to $otype is error prone. Perhaps use '${lead}${op}${arg}${trail}'\n" . $herecurr); + + } + } + +# check for semaphores initialized locked + if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) { + WARN("CONSIDER_COMPLETION", + "consider using a completion\n" . $herecurr); + } + +# recommend kstrto* over simple_strto* and strict_strto* + if ($line =~ /\b((simple|strict)_(strto(l|ll|ul|ull)))\s*\(/) { + WARN("CONSIDER_KSTRTO", + "$1 is obsolete, use k$3 instead\n" . $herecurr); + } + +# check for __initcall(), use device_initcall() explicitly or more appropriate function please + if ($line =~ /^.\s*__initcall\s*\(/) { + WARN("USE_DEVICE_INITCALL", + "please use device_initcall() or more appropriate function instead of __initcall() (see include/linux/init.h)\n" . $herecurr); + } + +# check for spin_is_locked(), suggest lockdep instead + if ($line =~ /\bspin_is_locked\(/) { + WARN("USE_LOCKDEP", + "Where possible, use lockdep_assert_held instead of assertions based on spin_is_locked\n" . $herecurr); + } + +# check for deprecated apis + if ($line =~ /\b($deprecated_apis_search)\b\s*\(/) { + my $deprecated_api = $1; + my $new_api = $deprecated_apis{$deprecated_api}; + WARN("DEPRECATED_API", + "Deprecated use of '$deprecated_api', prefer '$new_api' instead\n" . $herecurr); + } + +# check for various structs that are normally const (ops, kgdb, device_tree) +# and avoid what seem like struct definitions 'struct foo {' + if (defined($const_structs) && + $line !~ /\bconst\b/ && + $line =~ /\bstruct\s+($const_structs)\b(?!\s*\{)/) { + WARN("CONST_STRUCT", + "struct $1 should normally be const\n" . $herecurr); + } + +# use of NR_CPUS is usually wrong +# ignore definitions of NR_CPUS and usage to define arrays as likely right + if ($line =~ /\bNR_CPUS\b/ && + $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ && + $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ && + $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ && + $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ && + $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/) + { + WARN("NR_CPUS", + "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr); + } + +# Use of __ARCH_HAS_<FOO> or ARCH_HAVE_<BAR> is wrong. + if ($line =~ /\+\s*#\s*define\s+((?:__)?ARCH_(?:HAS|HAVE)\w*)\b/) { + ERROR("DEFINE_ARCH_HAS", + "#define of '$1' is wrong - use Kconfig variables or standard guards instead\n" . $herecurr); + } + +# likely/unlikely comparisons similar to "(likely(foo) > 0)" + if ($perl_version_ok && + $line =~ /\b((?:un)?likely)\s*\(\s*$FuncArg\s*\)\s*$Compare/) { + WARN("LIKELY_MISUSE", + "Using $1 should generally have parentheses around the comparison\n" . $herecurr); + } + +# nested likely/unlikely calls + if ($line =~ /\b(?:(?:un)?likely)\s*\(\s*!?\s*(IS_ERR(?:_OR_NULL|_VALUE)?|WARN)/) { + WARN("LIKELY_MISUSE", + "nested (un)?likely() calls, $1 already uses unlikely() internally\n" . $herecurr); + } + +# whine mightly about in_atomic + if ($line =~ /\bin_atomic\s*\(/) { + if ($realfile =~ m@^drivers/@) { + ERROR("IN_ATOMIC", + "do not use in_atomic in drivers\n" . $herecurr); + } elsif ($realfile !~ m@^kernel/@) { + WARN("IN_ATOMIC", + "use of in_atomic() is incorrect outside core kernel code\n" . $herecurr); + } + } + +# check for mutex_trylock_recursive usage + if ($line =~ /mutex_trylock_recursive/) { + ERROR("LOCKING", + "recursive locking is bad, do not use this ever.\n" . $herecurr); + } + +# check for lockdep_set_novalidate_class + if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ || + $line =~ /__lockdep_no_validate__\s*\)/ ) { + if ($realfile !~ m@^kernel/lockdep@ && + $realfile !~ m@^include/linux/lockdep@ && + $realfile !~ m@^drivers/base/core@) { + ERROR("LOCKDEP", + "lockdep_no_validate class is reserved for device->mutex.\n" . $herecurr); + } + } + + if ($line =~ /debugfs_create_\w+.*\b$mode_perms_world_writable\b/ || + $line =~ /DEVICE_ATTR.*\b$mode_perms_world_writable\b/) { + WARN("EXPORTED_WORLD_WRITABLE", + "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr); + } + +# check for DEVICE_ATTR uses that could be DEVICE_ATTR_<FOO> +# and whether or not function naming is typical and if +# DEVICE_ATTR permissions uses are unusual too + if ($perl_version_ok && + defined $stat && + $stat =~ /\bDEVICE_ATTR\s*\(\s*(\w+)\s*,\s*\(?\s*(\s*(?:${multi_mode_perms_string_search}|0[0-7]{3,3})\s*)\s*\)?\s*,\s*(\w+)\s*,\s*(\w+)\s*\)/) { + my $var = $1; + my $perms = $2; + my $show = $3; + my $store = $4; + my $octal_perms = perms_to_octal($perms); + if ($show =~ /^${var}_show$/ && + $store =~ /^${var}_store$/ && + $octal_perms eq "0644") { + if (WARN("DEVICE_ATTR_RW", + "Use DEVICE_ATTR_RW\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*$show\s*,\s*$store\s*\)/DEVICE_ATTR_RW(${var})/; + } + } elsif ($show =~ /^${var}_show$/ && + $store =~ /^NULL$/ && + $octal_perms eq "0444") { + if (WARN("DEVICE_ATTR_RO", + "Use DEVICE_ATTR_RO\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*$show\s*,\s*NULL\s*\)/DEVICE_ATTR_RO(${var})/; + } + } elsif ($show =~ /^NULL$/ && + $store =~ /^${var}_store$/ && + $octal_perms eq "0200") { + if (WARN("DEVICE_ATTR_WO", + "Use DEVICE_ATTR_WO\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*NULL\s*,\s*$store\s*\)/DEVICE_ATTR_WO(${var})/; + } + } elsif ($octal_perms eq "0644" || + $octal_perms eq "0444" || + $octal_perms eq "0200") { + my $newshow = "$show"; + $newshow = "${var}_show" if ($show ne "NULL" && $show ne "${var}_show"); + my $newstore = $store; + $newstore = "${var}_store" if ($store ne "NULL" && $store ne "${var}_store"); + my $rename = ""; + if ($show ne $newshow) { + $rename .= " '$show' to '$newshow'"; + } + if ($store ne $newstore) { + $rename .= " '$store' to '$newstore'"; + } + WARN("DEVICE_ATTR_FUNCTIONS", + "Consider renaming function(s)$rename\n" . $herecurr); + } else { + WARN("DEVICE_ATTR_PERMS", + "DEVICE_ATTR unusual permissions '$perms' used\n" . $herecurr); + } + } + +# Mode permission misuses where it seems decimal should be octal +# This uses a shortcut match to avoid unnecessary uses of a slow foreach loop +# o Ignore module_param*(...) uses with a decimal 0 permission as that has a +# specific definition of not visible in sysfs. +# o Ignore proc_create*(...) uses with a decimal 0 permission as that means +# use the default permissions + if ($perl_version_ok && + defined $stat && + $line =~ /$mode_perms_search/) { + foreach my $entry (@mode_permission_funcs) { + my $func = $entry->[0]; + my $arg_pos = $entry->[1]; + + my $lc = $stat =~ tr@\n@@; + $lc = $lc + $linenr; + my $stat_real = get_stat_real($linenr, $lc); + + my $skip_args = ""; + if ($arg_pos > 1) { + $arg_pos--; + $skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}"; + } + my $test = "\\b$func\\s*\\(${skip_args}($FuncArg(?:\\|\\s*$FuncArg)*)\\s*[,\\)]"; + if ($stat =~ /$test/) { + my $val = $1; + $val = $6 if ($skip_args ne ""); + if (!($func =~ /^(?:module_param|proc_create)/ && $val eq "0") && + (($val =~ /^$Int$/ && $val !~ /^$Octal$/) || + ($val =~ /^$Octal$/ && length($val) ne 4))) { + ERROR("NON_OCTAL_PERMISSIONS", + "Use 4 digit octal (0777) not decimal permissions\n" . "$here\n" . $stat_real); + } + if ($val =~ /^$Octal$/ && (oct($val) & 02)) { + ERROR("EXPORTED_WORLD_WRITABLE", + "Exporting writable files is usually an error. Consider more restrictive permissions.\n" . "$here\n" . $stat_real); + } + } + } + } + +# check for uses of S_<PERMS> that could be octal for readability + while ($line =~ m{\b($multi_mode_perms_string_search)\b}g) { + my $oval = $1; + my $octal = perms_to_octal($oval); + if (WARN("SYMBOLIC_PERMS", + "Symbolic permissions '$oval' are not preferred. Consider using octal permissions '$octal'.\n" . $herecurr) && + $fix) { + $fixed[$fixlinenr] =~ s/\Q$oval\E/$octal/; + } + } + +# validate content of MODULE_LICENSE against list from include/linux/module.h + if ($line =~ /\bMODULE_LICENSE\s*\(\s*($String)\s*\)/) { + my $extracted_string = get_quoted_string($line, $rawline); + my $valid_licenses = qr{ + GPL| + GPL\ v2| + GPL\ and\ additional\ rights| + Dual\ BSD/GPL| + Dual\ MIT/GPL| + Dual\ MPL/GPL| + Proprietary + }x; + if ($extracted_string !~ /^"(?:$valid_licenses)"$/x) { + WARN("MODULE_LICENSE", + "unknown module license " . $extracted_string . "\n" . $herecurr); + } + } + +# check for sysctl duplicate constants + if ($line =~ /\.extra[12]\s*=\s*&(zero|one|int_max)\b/) { + WARN("DUPLICATED_SYSCTL_CONST", + "duplicated sysctl range checking value '$1', consider using the shared one in include/linux/sysctl.h\n" . $herecurr); + } + } + + # If we have no input at all, then there is nothing to report on + # so just keep quiet. + if ($#rawlines == -1) { + exit(0); + } + + # In mailback mode only produce a report in the negative, for + # things that appear to be patches. + if ($mailback && ($clean == 1 || !$is_patch)) { + exit(0); + } + + # This is not a patch, and we are are in 'no-patch' mode so + # just keep quiet. + if (!$chk_patch && !$is_patch) { + exit(0); + } + + if (!$is_patch && $filename !~ /cover-letter\.patch$/) { + ERROR("NOT_UNIFIED_DIFF", + "Does not appear to be a unified-diff format patch\n"); + } + if ($is_patch && $has_commit_log && $chk_signoff) { + if ($signoff == 0) { + ERROR("MISSING_SIGN_OFF", + "Missing Signed-off-by: line(s)\n"); + } elsif ($authorsignoff != 1) { + # authorsignoff values: + # 0 -> missing sign off + # 1 -> sign off identical + # 2 -> names and addresses match, comments mismatch + # 3 -> addresses match, names different + # 4 -> names match, addresses different + # 5 -> names match, addresses excluding subaddress details (refer RFC 5233) match + + my $sob_msg = "'From: $author' != 'Signed-off-by: $author_sob'"; + + if ($authorsignoff == 0) { + ERROR("NO_AUTHOR_SIGN_OFF", + "Missing Signed-off-by: line by nominal patch author '$author'\n"); + } elsif ($authorsignoff == 2) { + CHK("FROM_SIGN_OFF_MISMATCH", + "From:/Signed-off-by: email comments mismatch: $sob_msg\n"); + } elsif ($authorsignoff == 3) { + WARN("FROM_SIGN_OFF_MISMATCH", + "From:/Signed-off-by: email name mismatch: $sob_msg\n"); + } elsif ($authorsignoff == 4) { + WARN("FROM_SIGN_OFF_MISMATCH", + "From:/Signed-off-by: email address mismatch: $sob_msg\n"); + } elsif ($authorsignoff == 5) { + WARN("FROM_SIGN_OFF_MISMATCH", + "From:/Signed-off-by: email subaddress mismatch: $sob_msg\n"); + } + } + } + + print report_dump(); + if ($summary && !($clean == 1 && $quiet == 1)) { + print "$filename " if ($summary_file); + print "total: $cnt_error errors, $cnt_warn warnings, " . + (($check)? "$cnt_chk checks, " : "") . + "$cnt_lines lines checked\n"; + } + + if ($quiet == 0) { + # If there were any defects found and not already fixing them + if (!$clean and !$fix) { + print << "EOM" + +NOTE: For some of the reported defects, checkpatch may be able to + mechanically convert to the typical style using --fix or --fix-inplace. +EOM + } + # If there were whitespace errors which cleanpatch can fix + # then suggest that. + if ($rpt_cleaners) { + $rpt_cleaners = 0; + print << "EOM" + +NOTE: Whitespace errors detected. + You may wish to use scripts/cleanpatch or scripts/cleanfile +EOM + } + } + + if ($clean == 0 && $fix && + ("@rawlines" ne "@fixed" || + $#fixed_inserted >= 0 || $#fixed_deleted >= 0)) { + my $newfile = $filename; + $newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace); + my $linecount = 0; + my $f; + + @fixed = fix_inserted_deleted_lines(\@fixed, \@fixed_inserted, \@fixed_deleted); + + open($f, '>', $newfile) + or die "$P: Can't open $newfile for write\n"; + foreach my $fixed_line (@fixed) { + $linecount++; + if ($file) { + if ($linecount > 3) { + $fixed_line =~ s/^\+//; + print $f $fixed_line . "\n"; + } + } else { + print $f $fixed_line . "\n"; + } + } + close($f); + + if (!$quiet) { + print << "EOM"; + +Wrote EXPERIMENTAL --fix correction(s) to '$newfile' + +Do _NOT_ trust the results written to this file. +Do _NOT_ submit these changes without inspecting them for correctness. + +This EXPERIMENTAL file is simply a convenience to help rewrite patches. +No warranties, expressed or implied... +EOM + } + } + + if ($quiet == 0) { + print "\n"; + if ($clean == 1) { + print "$vname has no obvious style problems and is ready for submission.\n"; + } else { + print "$vname has style problems, please review.\n"; + } + } + return $clean; +} diff --git a/src/net/scripts/checkstack.pl b/src/net/scripts/checkstack.pl new file mode 100755 index 0000000..d2c3858 --- /dev/null +++ b/src/net/scripts/checkstack.pl @@ -0,0 +1,201 @@ +#!/usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0 + +# Check the stack usage of functions +# +# Copyright Joern Engel <joern@lazybastard.org> +# Inspired by Linus Torvalds +# Original idea maybe from Keith Owens +# s390 port and big speedup by Arnd Bergmann <arnd@bergmann-dalldorf.de> +# Mips port by Juan Quintela <quintela@mandrakesoft.com> +# IA64 port via Andreas Dilger +# Arm port by Holger Schurig +# sh64 port by Paul Mundt +# Random bits by Matt Mackall <mpm@selenic.com> +# M68k port by Geert Uytterhoeven and Andreas Schwab +# AArch64, PARISC ports by Kyle McMartin +# sparc port by Martin Habets <errandir_news@mph.eclipse.co.uk> +# ppc64le port by Breno Leitao <leitao@debian.org> +# +# Usage: +# objdump -d vmlinux | scripts/checkstack.pl [arch] +# +# TODO : Port to all architectures (one regex per arch) + +use strict; + +# check for arch +# +# $re is used for two matches: +# $& (whole re) matches the complete objdump line with the stack growth +# $1 (first bracket) matches the size of the stack growth +# +# $dre is similar, but for dynamic stack redutions: +# $& (whole re) matches the complete objdump line with the stack growth +# $1 (first bracket) matches the dynamic amount of the stack growth +# +# $sub: subroutine for special handling to check stack usage. +# +# use anything else and feel the pain ;) +my (@stack, $re, $dre, $sub, $x, $xs, $funcre, $min_stack); +{ + my $arch = shift; + if ($arch eq "") { + $arch = `uname -m`; + chomp($arch); + } + + $min_stack = shift; + if ($min_stack eq "" || $min_stack !~ /^\d+$/) { + $min_stack = 100; + } + + $x = "[0-9a-f]"; # hex character + $xs = "[0-9a-f ]"; # hex character or space + $funcre = qr/^$x* <(.*)>:$/; + if ($arch =~ '^(aarch|arm)64$') { + #ffffffc0006325cc: a9bb7bfd stp x29, x30, [sp, #-80]! + #a110: d11643ff sub sp, sp, #0x590 + $re = qr/^.*stp.*sp, \#-([0-9]{1,8})\]\!/o; + $dre = qr/^.*sub.*sp, sp, #(0x$x{1,8})/o; + } elsif ($arch eq 'arm') { + #c0008ffc: e24dd064 sub sp, sp, #100 ; 0x64 + $re = qr/.*sub.*sp, sp, #([0-9]{1,4})/o; + $sub = \&arm_push_handling; + } elsif ($arch =~ /^x86(_64)?$/ || $arch =~ /^i[3456]86$/) { + #c0105234: 81 ec ac 05 00 00 sub $0x5ac,%esp + # or + # 2f60: 48 81 ec e8 05 00 00 sub $0x5e8,%rsp + $re = qr/^.*[as][du][db] \$(0x$x{1,8}),\%(e|r)sp$/o; + $dre = qr/^.*[as][du][db] (%.*),\%(e|r)sp$/o; + } elsif ($arch eq 'ia64') { + #e0000000044011fc: 01 0f fc 8c adds r12=-384,r12 + $re = qr/.*adds.*r12=-(([0-9]{2}|[3-9])[0-9]{2}),r12/o; + } elsif ($arch eq 'm68k') { + # 2b6c: 4e56 fb70 linkw %fp,#-1168 + # 1df770: defc ffe4 addaw #-28,%sp + $re = qr/.*(?:linkw %fp,|addaw )#-([0-9]{1,4})(?:,%sp)?$/o; + } elsif ($arch eq 'mips64') { + #8800402c: 67bdfff0 daddiu sp,sp,-16 + $re = qr/.*daddiu.*sp,sp,-(([0-9]{2}|[3-9])[0-9]{2})/o; + } elsif ($arch eq 'mips') { + #88003254: 27bdffe0 addiu sp,sp,-32 + $re = qr/.*addiu.*sp,sp,-(([0-9]{2}|[3-9])[0-9]{2})/o; + } elsif ($arch eq 'nios2') { + #25a8: defffb04 addi sp,sp,-20 + $re = qr/.*addi.*sp,sp,-(([0-9]{2}|[3-9])[0-9]{2})/o; + } elsif ($arch eq 'openrisc') { + # c000043c: 9c 21 fe f0 l.addi r1,r1,-272 + $re = qr/.*l\.addi.*r1,r1,-(([0-9]{2}|[3-9])[0-9]{2})/o; + } elsif ($arch eq 'parisc' || $arch eq 'parisc64') { + $re = qr/.*ldo ($x{1,8})\(sp\),sp/o; + } elsif ($arch eq 'powerpc' || $arch =~ /^ppc(64)?(le)?$/ ) { + # powerpc : 94 21 ff 30 stwu r1,-208(r1) + # ppc64(le) : 81 ff 21 f8 stdu r1,-128(r1) + $re = qr/.*st[dw]u.*r1,-($x{1,8})\(r1\)/o; + } elsif ($arch =~ /^s390x?$/) { + # 11160: a7 fb ff 60 aghi %r15,-160 + # or + # 100092: e3 f0 ff c8 ff 71 lay %r15,-56(%r15) + $re = qr/.*(?:lay|ag?hi).*\%r15,-(([0-9]{2}|[3-9])[0-9]{2}) + (?:\(\%r15\))?$/ox; + } elsif ($arch =~ /^sh64$/) { + #XXX: we only check for the immediate case presently, + # though we will want to check for the movi/sub + # pair for larger users. -- PFM. + #a00048e0: d4fc40f0 addi.l r15,-240,r15 + $re = qr/.*addi\.l.*r15,-(([0-9]{2}|[3-9])[0-9]{2}),r15/o; + } elsif ($arch eq 'sparc' || $arch eq 'sparc64') { + # f0019d10: 9d e3 bf 90 save %sp, -112, %sp + $re = qr/.*save.*%sp, -(([0-9]{2}|[3-9])[0-9]{2}), %sp/o; + } else { + print("wrong or unknown architecture \"$arch\"\n"); + exit + } +} + +# +# To count stack usage of push {*, fp, ip, lr, pc} instruction in ARM, +# if FRAME POINTER is enabled. +# e.g. c01f0d48: e92ddff0 push {r4, r5, r6, r7, r8, r9, sl, fp, ip, lr, pc} +# +sub arm_push_handling { + my $regex = qr/.*push.*fp, ip, lr, pc}/o; + my $size = 0; + my $line_arg = shift; + + if ($line_arg =~ m/$regex/) { + $size = $line_arg =~ tr/,//; + $size = ($size + 1) * 4; + } + + return $size; +} + +# +# main() +# +my ($func, $file, $lastslash, $total_size, $addr, $intro); + +$total_size = 0; + +while (my $line = <STDIN>) { + if ($line =~ m/$funcre/) { + $func = $1; + next if $line !~ m/^($xs*)/; + if ($total_size > $min_stack) { + push @stack, "$intro$total_size\n"; + } + + $addr = $1; + $addr =~ s/ /0/g; + $addr = "0x$addr"; + + $intro = "$addr $func [$file]:"; + my $padlen = 56 - length($intro); + while ($padlen > 0) { + $intro .= ' '; + $padlen -= 8; + } + + $total_size = 0; + } + elsif ($line =~ m/(.*):\s*file format/) { + $file = $1; + $file =~ s/\.ko//; + $lastslash = rindex($file, "/"); + if ($lastslash != -1) { + $file = substr($file, $lastslash + 1); + } + } + elsif ($line =~ m/$re/) { + my $size = $1; + $size = hex($size) if ($size =~ /^0x/); + + if ($size > 0xf0000000) { + $size = - $size; + $size += 0x80000000; + $size += 0x80000000; + } + next if ($size > 0x10000000); + + $total_size += $size; + } + elsif (defined $dre && $line =~ m/$dre/) { + my $size = $1; + + $size = hex($size) if ($size =~ /^0x/); + $total_size += $size; + } + elsif (defined $sub) { + my $size = &$sub($line); + + $total_size += $size; + } +} +if ($total_size > $min_stack) { + push @stack, "$intro$total_size\n"; +} + +# Sort output by size (last field) +print sort { ($b =~ /:\t*(\d+)$/)[0] <=> ($a =~ /:\t*(\d+)$/)[0] } @stack; diff --git a/src/net/scripts/checksyscalls.sh b/src/net/scripts/checksyscalls.sh new file mode 100755 index 0000000..b760995 --- /dev/null +++ b/src/net/scripts/checksyscalls.sh @@ -0,0 +1,269 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# +# Check if current architecture are missing any function calls compared +# to i386. +# i386 define a number of legacy system calls that are i386 specific +# and listed below so they are ignored. +# +# Usage: +# checksyscalls.sh gcc gcc-options +# + +ignore_list() { +cat << EOF +#include <asm/types.h> +#include <asm/unistd.h> + +/* *at */ +#define __IGNORE_open /* openat */ +#define __IGNORE_link /* linkat */ +#define __IGNORE_unlink /* unlinkat */ +#define __IGNORE_mknod /* mknodat */ +#define __IGNORE_chmod /* fchmodat */ +#define __IGNORE_chown /* fchownat */ +#define __IGNORE_mkdir /* mkdirat */ +#define __IGNORE_rmdir /* unlinkat */ +#define __IGNORE_lchown /* fchownat */ +#define __IGNORE_access /* faccessat */ +#define __IGNORE_rename /* renameat2 */ +#define __IGNORE_readlink /* readlinkat */ +#define __IGNORE_symlink /* symlinkat */ +#define __IGNORE_utimes /* futimesat */ +#define __IGNORE_stat /* fstatat */ +#define __IGNORE_lstat /* fstatat */ +#define __IGNORE_stat64 /* fstatat64 */ +#define __IGNORE_lstat64 /* fstatat64 */ + +#ifndef __ARCH_WANT_SET_GET_RLIMIT +#define __IGNORE_getrlimit /* getrlimit */ +#define __IGNORE_setrlimit /* setrlimit */ +#endif + +#ifndef __ARCH_WANT_MEMFD_SECRET +#define __IGNORE_memfd_secret +#endif + +/* Missing flags argument */ +#define __IGNORE_renameat /* renameat2 */ + +/* CLOEXEC flag */ +#define __IGNORE_pipe /* pipe2 */ +#define __IGNORE_dup2 /* dup3 */ +#define __IGNORE_epoll_create /* epoll_create1 */ +#define __IGNORE_inotify_init /* inotify_init1 */ +#define __IGNORE_eventfd /* eventfd2 */ +#define __IGNORE_signalfd /* signalfd4 */ + +/* MMU */ +#ifndef CONFIG_MMU +#define __IGNORE_madvise +#define __IGNORE_mbind +#define __IGNORE_mincore +#define __IGNORE_mlock +#define __IGNORE_mlockall +#define __IGNORE_munlock +#define __IGNORE_munlockall +#define __IGNORE_mprotect +#define __IGNORE_msync +#define __IGNORE_migrate_pages +#define __IGNORE_move_pages +#define __IGNORE_remap_file_pages +#define __IGNORE_get_mempolicy +#define __IGNORE_set_mempolicy +#define __IGNORE_swapoff +#define __IGNORE_swapon +#endif + +/* System calls for 32-bit kernels only */ +#if BITS_PER_LONG == 64 +#define __IGNORE_sendfile64 +#define __IGNORE_ftruncate64 +#define __IGNORE_truncate64 +#define __IGNORE_stat64 +#define __IGNORE_lstat64 +#define __IGNORE_fstat64 +#define __IGNORE_fcntl64 +#define __IGNORE_fadvise64_64 +#define __IGNORE_fstatat64 +#define __IGNORE_fstatfs64 +#define __IGNORE_statfs64 +#define __IGNORE_llseek +#define __IGNORE_mmap2 +#define __IGNORE_clock_gettime64 +#define __IGNORE_clock_settime64 +#define __IGNORE_clock_adjtime64 +#define __IGNORE_clock_getres_time64 +#define __IGNORE_clock_nanosleep_time64 +#define __IGNORE_timer_gettime64 +#define __IGNORE_timer_settime64 +#define __IGNORE_timerfd_gettime64 +#define __IGNORE_timerfd_settime64 +#define __IGNORE_utimensat_time64 +#define __IGNORE_pselect6_time64 +#define __IGNORE_ppoll_time64 +#define __IGNORE_io_pgetevents_time64 +#define __IGNORE_recvmmsg_time64 +#define __IGNORE_mq_timedsend_time64 +#define __IGNORE_mq_timedreceive_time64 +#define __IGNORE_semtimedop_time64 +#define __IGNORE_rt_sigtimedwait_time64 +#define __IGNORE_futex_time64 +#define __IGNORE_sched_rr_get_interval_time64 +#else +#define __IGNORE_sendfile +#define __IGNORE_ftruncate +#define __IGNORE_truncate +#define __IGNORE_stat +#define __IGNORE_lstat +#define __IGNORE_fstat +#define __IGNORE_fcntl +#define __IGNORE_fadvise64 +#define __IGNORE_newfstatat +#define __IGNORE_fstatfs +#define __IGNORE_statfs +#define __IGNORE_lseek +#define __IGNORE_mmap +#define __IGNORE_clock_gettime +#define __IGNORE_clock_settime +#define __IGNORE_clock_adjtime +#define __IGNORE_clock_getres +#define __IGNORE_clock_nanosleep +#define __IGNORE_timer_gettime +#define __IGNORE_timer_settime +#define __IGNORE_timerfd_gettime +#define __IGNORE_timerfd_settime +#define __IGNORE_utimensat +#define __IGNORE_pselect6 +#define __IGNORE_ppoll +#define __IGNORE_io_pgetevents +#define __IGNORE_recvmmsg +#define __IGNORE_mq_timedsend +#define __IGNORE_mq_timedreceive +#define __IGNORE_semtimedop +#define __IGNORE_rt_sigtimedwait +#define __IGNORE_futex +#define __IGNORE_sched_rr_get_interval +#define __IGNORE_gettimeofday +#define __IGNORE_settimeofday +#define __IGNORE_wait4 +#define __IGNORE_adjtimex +#define __IGNORE_nanosleep +#define __IGNORE_io_getevents +#define __IGNORE_recvmmsg +#endif + +/* i386-specific or historical system calls */ +#define __IGNORE_break +#define __IGNORE_stty +#define __IGNORE_gtty +#define __IGNORE_ftime +#define __IGNORE_prof +#define __IGNORE_lock +#define __IGNORE_mpx +#define __IGNORE_ulimit +#define __IGNORE_profil +#define __IGNORE_ioperm +#define __IGNORE_iopl +#define __IGNORE_idle +#define __IGNORE_modify_ldt +#define __IGNORE_ugetrlimit +#define __IGNORE_vm86 +#define __IGNORE_vm86old +#define __IGNORE_set_thread_area +#define __IGNORE_get_thread_area +#define __IGNORE_madvise1 +#define __IGNORE_oldstat +#define __IGNORE_oldfstat +#define __IGNORE_oldlstat +#define __IGNORE_oldolduname +#define __IGNORE_olduname +#define __IGNORE_umount +#define __IGNORE_waitpid +#define __IGNORE_stime +#define __IGNORE_nice +#define __IGNORE_signal +#define __IGNORE_sigaction +#define __IGNORE_sgetmask +#define __IGNORE_sigsuspend +#define __IGNORE_sigpending +#define __IGNORE_ssetmask +#define __IGNORE_readdir +#define __IGNORE_socketcall +#define __IGNORE_ipc +#define __IGNORE_sigreturn +#define __IGNORE_sigprocmask +#define __IGNORE_bdflush +#define __IGNORE__llseek +#define __IGNORE__newselect +#define __IGNORE_create_module +#define __IGNORE_query_module +#define __IGNORE_get_kernel_syms +#define __IGNORE_sysfs +#define __IGNORE_uselib +#define __IGNORE__sysctl +#define __IGNORE_arch_prctl +#define __IGNORE_nfsservctl + +/* ... including the "new" 32-bit uid syscalls */ +#define __IGNORE_lchown32 +#define __IGNORE_getuid32 +#define __IGNORE_getgid32 +#define __IGNORE_geteuid32 +#define __IGNORE_getegid32 +#define __IGNORE_setreuid32 +#define __IGNORE_setregid32 +#define __IGNORE_getgroups32 +#define __IGNORE_setgroups32 +#define __IGNORE_fchown32 +#define __IGNORE_setresuid32 +#define __IGNORE_getresuid32 +#define __IGNORE_setresgid32 +#define __IGNORE_getresgid32 +#define __IGNORE_chown32 +#define __IGNORE_setuid32 +#define __IGNORE_setgid32 +#define __IGNORE_setfsuid32 +#define __IGNORE_setfsgid32 + +/* these can be expressed using other calls */ +#define __IGNORE_alarm /* setitimer */ +#define __IGNORE_creat /* open */ +#define __IGNORE_fork /* clone */ +#define __IGNORE_futimesat /* utimensat */ +#define __IGNORE_getpgrp /* getpgid */ +#define __IGNORE_getdents /* getdents64 */ +#define __IGNORE_pause /* sigsuspend */ +#define __IGNORE_poll /* ppoll */ +#define __IGNORE_select /* pselect6 */ +#define __IGNORE_epoll_wait /* epoll_pwait */ +#define __IGNORE_time /* gettimeofday */ +#define __IGNORE_uname /* newuname */ +#define __IGNORE_ustat /* statfs */ +#define __IGNORE_utime /* utimes */ +#define __IGNORE_vfork /* clone */ + +/* sync_file_range had a stupid ABI. Allow sync_file_range2 instead */ +#ifdef __NR_sync_file_range2 +#define __IGNORE_sync_file_range +#endif + +/* Unmerged syscalls for AFS, STREAMS, etc. */ +#define __IGNORE_afs_syscall +#define __IGNORE_getpmsg +#define __IGNORE_putpmsg +#define __IGNORE_vserver +EOF +} + +syscall_list() { + grep '^[0-9]' "$1" | sort -n | + while read nr abi name entry ; do + echo "#if !defined(__NR_${name}) && !defined(__IGNORE_${name})" + echo "#warning syscall ${name} not implemented" + echo "#endif" + done +} + +(ignore_list && syscall_list $(dirname $0)/../arch/x86/entry/syscalls/syscall_32.tbl) | \ +$* -E -x c - > /dev/null diff --git a/src/net/scripts/checkversion.pl b/src/net/scripts/checkversion.pl new file mode 100755 index 0000000..f67b125 --- /dev/null +++ b/src/net/scripts/checkversion.pl @@ -0,0 +1,72 @@ +#! /usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0 +# +# checkversion find uses of LINUX_VERSION_CODE or KERNEL_VERSION +# without including <linux/version.h>, or cases of +# including <linux/version.h> that don't need it. +# Copyright (C) 2003, Randy Dunlap <rdunlap@xenotime.net> + +use strict; + +$| = 1; + +my $debugging; + +foreach my $file (@ARGV) { + next if $file =~ "include/linux/version\.h"; + # Open this file. + open( my $f, '<', $file ) + or die "Can't open $file: $!\n"; + + # Initialize variables. + my ($fInComment, $fInString, $fUseVersion); + my $iLinuxVersion = 0; + + while (<$f>) { + # Strip comments. + $fInComment && (s+^.*?\*/+ +o ? ($fInComment = 0) : next); + m+/\*+o && (s+/\*.*?\*/+ +go, (s+/\*.*$+ +o && ($fInComment = 1))); + + # Pick up definitions. + if ( m/^\s*#/o ) { + $iLinuxVersion = $. if m/^\s*#\s*include\s*"linux\/version\.h"/o; + } + + # Strip strings. + $fInString && (s+^.*?"+ +o ? ($fInString = 0) : next); + m+"+o && (s+".*?"+ +go, (s+".*$+ +o && ($fInString = 1))); + + # Pick up definitions. + if ( m/^\s*#/o ) { + $iLinuxVersion = $. if m/^\s*#\s*include\s*<linux\/version\.h>/o; + } + + # Look for uses: LINUX_VERSION_CODE, KERNEL_VERSION, UTS_RELEASE + if (($_ =~ /LINUX_VERSION_CODE/) || ($_ =~ /\WKERNEL_VERSION/)) { + $fUseVersion = 1; + last if $iLinuxVersion; + } + } + + # Report used version IDs without include? + if ($fUseVersion && ! $iLinuxVersion) { + print "$file: $.: need linux/version.h\n"; + } + + # Report superfluous includes. + if ($iLinuxVersion && ! $fUseVersion) { + print "$file: $iLinuxVersion linux/version.h not needed.\n"; + } + + # debug: report OK results: + if ($debugging) { + if ($iLinuxVersion && $fUseVersion) { + print "$file: version use is OK ($iLinuxVersion)\n"; + } + if (! $iLinuxVersion && ! $fUseVersion) { + print "$file: version use is OK (none)\n"; + } + } + + close($f); +} diff --git a/src/net/scripts/clang-tools/gen_compile_commands.py b/src/net/scripts/clang-tools/gen_compile_commands.py new file mode 100755 index 0000000..8bf55bb --- /dev/null +++ b/src/net/scripts/clang-tools/gen_compile_commands.py @@ -0,0 +1,237 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0 +# +# Copyright (C) Google LLC, 2018 +# +# Author: Tom Roeder <tmroeder@google.com> +# +"""A tool for generating compile_commands.json in the Linux kernel.""" + +import argparse +import json +import logging +import os +import re +import subprocess +import sys + +_DEFAULT_OUTPUT = 'compile_commands.json' +_DEFAULT_LOG_LEVEL = 'WARNING' + +_FILENAME_PATTERN = r'^\..*\.cmd$' +_LINE_PATTERN = r'^cmd_[^ ]*\.o := (.* )([^ ]*\.c)$' +_VALID_LOG_LEVELS = ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'] + + +def parse_arguments(): + """Sets up and parses command-line arguments. + + Returns: + log_level: A logging level to filter log output. + directory: The work directory where the objects were built. + ar: Command used for parsing .a archives. + output: Where to write the compile-commands JSON file. + paths: The list of files/directories to handle to find .cmd files. + """ + usage = 'Creates a compile_commands.json database from kernel .cmd files' + parser = argparse.ArgumentParser(description=usage) + + directory_help = ('specify the output directory used for the kernel build ' + '(defaults to the working directory)') + parser.add_argument('-d', '--directory', type=str, default='.', + help=directory_help) + + output_help = ('path to the output command database (defaults to ' + + _DEFAULT_OUTPUT + ')') + parser.add_argument('-o', '--output', type=str, default=_DEFAULT_OUTPUT, + help=output_help) + + log_level_help = ('the level of log messages to produce (defaults to ' + + _DEFAULT_LOG_LEVEL + ')') + parser.add_argument('--log_level', choices=_VALID_LOG_LEVELS, + default=_DEFAULT_LOG_LEVEL, help=log_level_help) + + ar_help = 'command used for parsing .a archives' + parser.add_argument('-a', '--ar', type=str, default='llvm-ar', help=ar_help) + + paths_help = ('directories to search or files to parse ' + '(files should be *.o, *.a, or modules.order). ' + 'If nothing is specified, the current directory is searched') + parser.add_argument('paths', type=str, nargs='*', help=paths_help) + + args = parser.parse_args() + + return (args.log_level, + os.path.abspath(args.directory), + args.output, + args.ar, + args.paths if len(args.paths) > 0 else [args.directory]) + + +def cmdfiles_in_dir(directory): + """Generate the iterator of .cmd files found under the directory. + + Walk under the given directory, and yield every .cmd file found. + + Args: + directory: The directory to search for .cmd files. + + Yields: + The path to a .cmd file. + """ + + filename_matcher = re.compile(_FILENAME_PATTERN) + + for dirpath, _, filenames in os.walk(directory): + for filename in filenames: + if filename_matcher.match(filename): + yield os.path.join(dirpath, filename) + + +def to_cmdfile(path): + """Return the path of .cmd file used for the given build artifact + + Args: + Path: file path + + Returns: + The path to .cmd file + """ + dir, base = os.path.split(path) + return os.path.join(dir, '.' + base + '.cmd') + + +def cmdfiles_for_o(obj): + """Generate the iterator of .cmd files associated with the object + + Yield the .cmd file used to build the given object + + Args: + obj: The object path + + Yields: + The path to .cmd file + """ + yield to_cmdfile(obj) + + +def cmdfiles_for_a(archive, ar): + """Generate the iterator of .cmd files associated with the archive. + + Parse the given archive, and yield every .cmd file used to build it. + + Args: + archive: The archive to parse + + Yields: + The path to every .cmd file found + """ + for obj in subprocess.check_output([ar, '-t', archive]).decode().split(): + yield to_cmdfile(obj) + + +def cmdfiles_for_modorder(modorder): + """Generate the iterator of .cmd files associated with the modules.order. + + Parse the given modules.order, and yield every .cmd file used to build the + contained modules. + + Args: + modorder: The modules.order file to parse + + Yields: + The path to every .cmd file found + """ + with open(modorder) as f: + for line in f: + ko = line.rstrip() + base, ext = os.path.splitext(ko) + if ext != '.ko': + sys.exit('{}: module path must end with .ko'.format(ko)) + mod = base + '.mod' + # The first line of *.mod lists the objects that compose the module. + with open(mod) as m: + for obj in m.readline().split(): + yield to_cmdfile(obj) + + +def process_line(root_directory, command_prefix, file_path): + """Extracts information from a .cmd line and creates an entry from it. + + Args: + root_directory: The directory that was searched for .cmd files. Usually + used directly in the "directory" entry in compile_commands.json. + command_prefix: The extracted command line, up to the last element. + file_path: The .c file from the end of the extracted command. + Usually relative to root_directory, but sometimes absolute. + + Returns: + An entry to append to compile_commands. + + Raises: + ValueError: Could not find the extracted file based on file_path and + root_directory or file_directory. + """ + # The .cmd files are intended to be included directly by Make, so they + # escape the pound sign '#', either as '\#' or '$(pound)' (depending on the + # kernel version). The compile_commands.json file is not interepreted + # by Make, so this code replaces the escaped version with '#'. + prefix = command_prefix.replace('\#', '#').replace('$(pound)', '#') + + # Use os.path.abspath() to normalize the path resolving '.' and '..' . + abs_path = os.path.abspath(os.path.join(root_directory, file_path)) + if not os.path.exists(abs_path): + raise ValueError('File %s not found' % abs_path) + return { + 'directory': root_directory, + 'file': abs_path, + 'command': prefix + file_path, + } + + +def main(): + """Walks through the directory and finds and parses .cmd files.""" + log_level, directory, output, ar, paths = parse_arguments() + + level = getattr(logging, log_level) + logging.basicConfig(format='%(levelname)s: %(message)s', level=level) + + line_matcher = re.compile(_LINE_PATTERN) + + compile_commands = [] + + for path in paths: + # If 'path' is a directory, handle all .cmd files under it. + # Otherwise, handle .cmd files associated with the file. + # Most of built-in objects are linked via archives (built-in.a or lib.a) + # but some objects are linked to vmlinux directly. + # Modules are listed in modules.order. + if os.path.isdir(path): + cmdfiles = cmdfiles_in_dir(path) + elif path.endswith('.o'): + cmdfiles = cmdfiles_for_o(path) + elif path.endswith('.a'): + cmdfiles = cmdfiles_for_a(path, ar) + elif path.endswith('modules.order'): + cmdfiles = cmdfiles_for_modorder(path) + else: + sys.exit('{}: unknown file type'.format(path)) + + for cmdfile in cmdfiles: + with open(cmdfile, 'rt') as f: + result = line_matcher.match(f.readline()) + if result: + try: + entry = process_line(directory, result.group(1), + result.group(2)) + compile_commands.append(entry) + except ValueError as err: + logging.info('Could not add line from %s: %s', + cmdfile, err) + + with open(output, 'wt') as f: + json.dump(compile_commands, f, indent=2, sort_keys=True) + + +if __name__ == '__main__': + main() diff --git a/src/net/scripts/clang-tools/run-clang-tools.py b/src/net/scripts/clang-tools/run-clang-tools.py new file mode 100755 index 0000000..f754415 --- /dev/null +++ b/src/net/scripts/clang-tools/run-clang-tools.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0 +# +# Copyright (C) Google LLC, 2020 +# +# Author: Nathan Huckleberry <nhuck@google.com> +# +"""A helper routine run clang-tidy and the clang static-analyzer on +compile_commands.json. +""" + +import argparse +import json +import multiprocessing +import os +import subprocess +import sys + + +def parse_arguments(): + """Set up and parses command-line arguments. + Returns: + args: Dict of parsed args + Has keys: [path, type] + """ + usage = """Run clang-tidy or the clang static-analyzer on a + compilation database.""" + parser = argparse.ArgumentParser(description=usage) + + type_help = "Type of analysis to be performed" + parser.add_argument("type", + choices=["clang-tidy", "clang-analyzer"], + help=type_help) + path_help = "Path to the compilation database to parse" + parser.add_argument("path", type=str, help=path_help) + + return parser.parse_args() + + +def init(l, a): + global lock + global args + lock = l + args = a + + +def run_analysis(entry): + # Disable all checks, then re-enable the ones we want + checks = "-checks=-*," + if args.type == "clang-tidy": + checks += "linuxkernel-*" + else: + checks += "clang-analyzer-*" + p = subprocess.run(["clang-tidy", "-p", args.path, checks, entry["file"]], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + cwd=entry["directory"]) + with lock: + sys.stderr.buffer.write(p.stdout) + + +def main(): + args = parse_arguments() + + lock = multiprocessing.Lock() + pool = multiprocessing.Pool(initializer=init, initargs=(lock, args)) + # Read JSON data into the datastore variable + with open(args.path, "r") as f: + datastore = json.load(f) + pool.map(run_analysis, datastore) + + +if __name__ == "__main__": + main() diff --git a/src/net/scripts/clang-version.sh b/src/net/scripts/clang-version.sh new file mode 100755 index 0000000..6fabf06 --- /dev/null +++ b/src/net/scripts/clang-version.sh @@ -0,0 +1,19 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# +# clang-version clang-command +# +# Print the compiler version of `clang-command' in a 5 or 6-digit form +# such as `50001' for clang-5.0.1 etc. + +compiler="$*" + +if ! ( $compiler --version | grep -q clang) ; then + echo 0 + exit 1 +fi + +MAJOR=$(echo __clang_major__ | $compiler -E -x c - | tail -n 1) +MINOR=$(echo __clang_minor__ | $compiler -E -x c - | tail -n 1) +PATCHLEVEL=$(echo __clang_patchlevel__ | $compiler -E -x c - | tail -n 1) +printf "%d%02d%02d\\n" $MAJOR $MINOR $PATCHLEVEL diff --git a/src/net/scripts/cleanfile b/src/net/scripts/cleanfile new file mode 100755 index 0000000..c00c69b --- /dev/null +++ b/src/net/scripts/cleanfile @@ -0,0 +1,178 @@ +#!/usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0 +# +# Clean a text file -- or directory of text files -- of stealth whitespace. +# WARNING: this can be a highly destructive operation. Use with caution. +# + +use warnings; +use bytes; +use File::Basename; + +# Default options +$max_width = 79; + +# Clean up space-tab sequences, either by removing spaces or +# replacing them with tabs. +sub clean_space_tabs($) +{ + no bytes; # Tab alignment depends on characters + + my($li) = @_; + my($lo) = ''; + my $pos = 0; + my $nsp = 0; + my($i, $c); + + for ($i = 0; $i < length($li); $i++) { + $c = substr($li, $i, 1); + if ($c eq "\t") { + my $npos = ($pos+$nsp+8) & ~7; + my $ntab = ($npos >> 3) - ($pos >> 3); + $lo .= "\t" x $ntab; + $pos = $npos; + $nsp = 0; + } elsif ($c eq "\n" || $c eq "\r") { + $lo .= " " x $nsp; + $pos += $nsp; + $nsp = 0; + $lo .= $c; + $pos = 0; + } elsif ($c eq " ") { + $nsp++; + } else { + $lo .= " " x $nsp; + $pos += $nsp; + $nsp = 0; + $lo .= $c; + $pos++; + } + } + $lo .= " " x $nsp; + return $lo; +} + +# Compute the visual width of a string +sub strwidth($) { + no bytes; # Tab alignment depends on characters + + my($li) = @_; + my($c, $i); + my $pos = 0; + my $mlen = 0; + + for ($i = 0; $i < length($li); $i++) { + $c = substr($li,$i,1); + if ($c eq "\t") { + $pos = ($pos+8) & ~7; + } elsif ($c eq "\n") { + $mlen = $pos if ($pos > $mlen); + $pos = 0; + } else { + $pos++; + } + } + + $mlen = $pos if ($pos > $mlen); + return $mlen; +} + +$name = basename($0); + +@files = (); + +while (defined($a = shift(@ARGV))) { + if ($a =~ /^-/) { + if ($a eq '-width' || $a eq '-w') { + $max_width = shift(@ARGV)+0; + } else { + print STDERR "Usage: $name [-width #] files...\n"; + exit 1; + } + } else { + push(@files, $a); + } +} + +foreach $f ( @files ) { + print STDERR "$name: $f\n"; + + if (! -f $f) { + print STDERR "$f: not a file\n"; + next; + } + + if (!open(FILE, '+<', $f)) { + print STDERR "$name: Cannot open file: $f: $!\n"; + next; + } + + binmode FILE; + + # First, verify that it is not a binary file; consider any file + # with a zero byte to be a binary file. Is there any better, or + # additional, heuristic that should be applied? + $is_binary = 0; + + while (read(FILE, $data, 65536) > 0) { + if ($data =~ /\0/) { + $is_binary = 1; + last; + } + } + + if ($is_binary) { + print STDERR "$name: $f: binary file\n"; + next; + } + + seek(FILE, 0, 0); + + $in_bytes = 0; + $out_bytes = 0; + $blank_bytes = 0; + + @blanks = (); + @lines = (); + $lineno = 0; + + while ( defined($line = <FILE>) ) { + $lineno++; + $in_bytes += length($line); + $line =~ s/[ \t\r]*$//; # Remove trailing spaces + $line = clean_space_tabs($line); + + if ( $line eq "\n" ) { + push(@blanks, $line); + $blank_bytes += length($line); + } else { + push(@lines, @blanks); + $out_bytes += $blank_bytes; + push(@lines, $line); + $out_bytes += length($line); + @blanks = (); + $blank_bytes = 0; + } + + $l_width = strwidth($line); + if ($max_width && $l_width > $max_width) { + print STDERR + "$f:$lineno: line exceeds $max_width characters ($l_width)\n"; + } + } + + # Any blanks at the end of the file are discarded + + if ($in_bytes != $out_bytes) { + # Only write to the file if changed + seek(FILE, 0, 0); + print FILE @lines; + + if ( !defined($where = tell(FILE)) || + !truncate(FILE, $where) ) { + die "$name: Failed to truncate modified file: $f: $!\n"; + } + } + + close(FILE); +} diff --git a/src/net/scripts/cleanpatch b/src/net/scripts/cleanpatch new file mode 100755 index 0000000..9f17552 --- /dev/null +++ b/src/net/scripts/cleanpatch @@ -0,0 +1,260 @@ +#!/usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0 +# +# Clean a patch file -- or directory of patch files -- of stealth whitespace. +# WARNING: this can be a highly destructive operation. Use with caution. +# + +use warnings; +use bytes; +use File::Basename; + +# Default options +$max_width = 79; + +# Clean up space-tab sequences, either by removing spaces or +# replacing them with tabs. +sub clean_space_tabs($) +{ + no bytes; # Tab alignment depends on characters + + my($li) = @_; + my($lo) = ''; + my $pos = 0; + my $nsp = 0; + my($i, $c); + + for ($i = 0; $i < length($li); $i++) { + $c = substr($li, $i, 1); + if ($c eq "\t") { + my $npos = ($pos+$nsp+8) & ~7; + my $ntab = ($npos >> 3) - ($pos >> 3); + $lo .= "\t" x $ntab; + $pos = $npos; + $nsp = 0; + } elsif ($c eq "\n" || $c eq "\r") { + $lo .= " " x $nsp; + $pos += $nsp; + $nsp = 0; + $lo .= $c; + $pos = 0; + } elsif ($c eq " ") { + $nsp++; + } else { + $lo .= " " x $nsp; + $pos += $nsp; + $nsp = 0; + $lo .= $c; + $pos++; + } + } + $lo .= " " x $nsp; + return $lo; +} + +# Compute the visual width of a string +sub strwidth($) { + no bytes; # Tab alignment depends on characters + + my($li) = @_; + my($c, $i); + my $pos = 0; + my $mlen = 0; + + for ($i = 0; $i < length($li); $i++) { + $c = substr($li,$i,1); + if ($c eq "\t") { + $pos = ($pos+8) & ~7; + } elsif ($c eq "\n") { + $mlen = $pos if ($pos > $mlen); + $pos = 0; + } else { + $pos++; + } + } + + $mlen = $pos if ($pos > $mlen); + return $mlen; +} + +$name = basename($0); + +@files = (); + +while (defined($a = shift(@ARGV))) { + if ($a =~ /^-/) { + if ($a eq '-width' || $a eq '-w') { + $max_width = shift(@ARGV)+0; + } else { + print STDERR "Usage: $name [-width #] files...\n"; + exit 1; + } + } else { + push(@files, $a); + } +} + +foreach $f ( @files ) { + print STDERR "$name: $f\n"; + + if (! -f $f) { + print STDERR "$f: not a file\n"; + next; + } + + if (!open(FILE, '+<', $f)) { + print STDERR "$name: Cannot open file: $f: $!\n"; + next; + } + + binmode FILE; + + # First, verify that it is not a binary file; consider any file + # with a zero byte to be a binary file. Is there any better, or + # additional, heuristic that should be applied? + $is_binary = 0; + + while (read(FILE, $data, 65536) > 0) { + if ($data =~ /\0/) { + $is_binary = 1; + last; + } + } + + if ($is_binary) { + print STDERR "$name: $f: binary file\n"; + next; + } + + seek(FILE, 0, 0); + + $in_bytes = 0; + $out_bytes = 0; + $lineno = 0; + + @lines = (); + + $in_hunk = 0; + $err = 0; + + while ( defined($line = <FILE>) ) { + $lineno++; + $in_bytes += length($line); + + if (!$in_hunk) { + if ($line =~ + /^\@\@\s+\-([0-9]+),([0-9]+)\s+\+([0-9]+),([0-9]+)\s\@\@/) { + $minus_lines = $2; + $plus_lines = $4; + if ($minus_lines || $plus_lines) { + $in_hunk = 1; + @hunk_lines = ($line); + } + } else { + push(@lines, $line); + $out_bytes += length($line); + } + } else { + # We're in a hunk + + if ($line =~ /^\+/) { + $plus_lines--; + + $text = substr($line, 1); + $text =~ s/[ \t\r]*$//; # Remove trailing spaces + $text = clean_space_tabs($text); + + $l_width = strwidth($text); + if ($max_width && $l_width > $max_width) { + print STDERR + "$f:$lineno: adds line exceeds $max_width ", + "characters ($l_width)\n"; + } + + push(@hunk_lines, '+'.$text); + } elsif ($line =~ /^\-/) { + $minus_lines--; + push(@hunk_lines, $line); + } elsif ($line =~ /^ /) { + $plus_lines--; + $minus_lines--; + push(@hunk_lines, $line); + } else { + print STDERR "$name: $f: malformed patch\n"; + $err = 1; + last; + } + + if ($plus_lines < 0 || $minus_lines < 0) { + print STDERR "$name: $f: malformed patch\n"; + $err = 1; + last; + } elsif ($plus_lines == 0 && $minus_lines == 0) { + # End of a hunk. Process this hunk. + my $i; + my $l; + my @h = (); + my $adj = 0; + my $done = 0; + + for ($i = scalar(@hunk_lines)-1; $i > 0; $i--) { + $l = $hunk_lines[$i]; + if (!$done && $l eq "+\n") { + $adj++; # Skip this line + } elsif ($l =~ /^[ +]/) { + $done = 1; + unshift(@h, $l); + } else { + unshift(@h, $l); + } + } + + $l = $hunk_lines[0]; # Hunk header + undef @hunk_lines; # Free memory + + if ($adj) { + die unless + ($l =~ /^\@\@\s+\-([0-9]+),([0-9]+)\s+\+([0-9]+),([0-9]+)\s\@\@(.*)$/); + my $mstart = $1; + my $mlin = $2; + my $pstart = $3; + my $plin = $4; + my $tail = $5; # doesn't include the final newline + + $l = sprintf("@@ -%d,%d +%d,%d @@%s\n", + $mstart, $mlin, $pstart, $plin-$adj, + $tail); + } + unshift(@h, $l); + + # Transfer to the output array + foreach $l (@h) { + $out_bytes += length($l); + push(@lines, $l); + } + + $in_hunk = 0; + } + } + } + + if ($in_hunk) { + print STDERR "$name: $f: malformed patch\n"; + $err = 1; + } + + if (!$err) { + if ($in_bytes != $out_bytes) { + # Only write to the file if changed + seek(FILE, 0, 0); + print FILE @lines; + + if ( !defined($where = tell(FILE)) || + !truncate(FILE, $where) ) { + die "$name: Failed to truncate modified file: $f: $!\n"; + } + } + } + + close(FILE); +} diff --git a/src/net/scripts/coccicheck b/src/net/scripts/coccicheck new file mode 100755 index 0000000..209bb04 --- /dev/null +++ b/src/net/scripts/coccicheck @@ -0,0 +1,273 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 +# Linux kernel coccicheck +# +# Read Documentation/dev-tools/coccinelle.rst +# +# This script requires at least spatch +# version 1.0.0-rc11. + +DIR="$(dirname $(readlink -f $0))/.." +SPATCH="`which ${SPATCH:=spatch}`" + +if [ ! -x "$SPATCH" ]; then + echo 'spatch is part of the Coccinelle project and is available at http://coccinelle.lip6.fr/' + exit 1 +fi + +SPATCH_VERSION=$($SPATCH --version | head -1 | awk '{print $3}') +SPATCH_VERSION_NUM=$(echo $SPATCH_VERSION | ${DIR}/scripts/ld-version.sh) + +USE_JOBS="no" +$SPATCH --help | grep "\-\-jobs" > /dev/null && USE_JOBS="yes" + +# The verbosity may be set by the environmental parameter V= +# as for example with 'make V=1 coccicheck' + +if [ -n "$V" -a "$V" != "0" ]; then + VERBOSE="$V" +else + VERBOSE=0 +fi + +FLAGS="--very-quiet" + +# You can use SPFLAGS to append extra arguments to coccicheck or override any +# heuristics done in this file as Coccinelle accepts the last options when +# options conflict. +# +# A good example for use of SPFLAGS is if you want to debug your cocci script, +# you can for instance use the following: +# +# $ export COCCI=scripts/coccinelle/misc/irqf_oneshot.cocci +# $ make coccicheck MODE=report DEBUG_FILE="all.err" SPFLAGS="--profile --show-trying" M=./drivers/mfd/arizona-irq.c +# +# "--show-trying" should show you what rule is being processed as it goes to +# stdout, you do not need a debug file for that. The profile output will be +# be sent to stdout, if you provide a DEBUG_FILE the profiling data can be +# inspected there. +# +# --profile will not output if --very-quiet is used, so avoid it. +echo $SPFLAGS | egrep -e "--profile|--show-trying" 2>&1 > /dev/null +if [ $? -eq 0 ]; then + FLAGS="--quiet" +fi + +# spatch only allows include directories with the syntax "-I include" +# while gcc also allows "-Iinclude" and "-include include" +COCCIINCLUDE=${LINUXINCLUDE//-I/-I } +COCCIINCLUDE=${COCCIINCLUDE// -include/ --include} + +if [ "$C" = "1" -o "$C" = "2" ]; then + ONLINE=1 + + # Take only the last argument, which is the C file to test + shift $(( $# - 1 )) + OPTIONS="$COCCIINCLUDE $1" + + # No need to parallelize Coccinelle since this mode takes one input file. + NPROC=1 +else + ONLINE=0 + if [ "$KBUILD_EXTMOD" = "" ] ; then + OPTIONS="--dir $srctree $COCCIINCLUDE" + else + OPTIONS="--dir $KBUILD_EXTMOD $COCCIINCLUDE" + fi + + # Use only one thread per core by default if hyperthreading is enabled + THREADS_PER_CORE=$(lscpu | grep "Thread(s) per core: " | tr -cd "[:digit:]") + if [ -z "$J" ]; then + NPROC=$(getconf _NPROCESSORS_ONLN) + if [ $THREADS_PER_CORE -gt 1 -a $NPROC -gt 4 ] ; then + NPROC=$((NPROC/2)) + fi + else + NPROC="$J" + fi +fi + +if [ "$KBUILD_EXTMOD" != "" ] ; then + OPTIONS="--patch $srctree $OPTIONS" +fi + +# You can override by using SPFLAGS +if [ "$USE_JOBS" = "no" ]; then + trap kill_running SIGTERM SIGINT + declare -a SPATCH_PID +elif [ "$NPROC" != "1" ]; then + # Using 0 should work as well, refer to _SC_NPROCESSORS_ONLN use on + # https://github.com/rdicosmo/parmap/blob/master/setcore_stubs.c + OPTIONS="$OPTIONS --jobs $NPROC --chunksize 1" +fi + +if [ "$MODE" = "" ] ; then + if [ "$ONLINE" = "0" ] ; then + echo 'You have not explicitly specified the mode to use. Using default "report" mode.' + echo 'Available modes are the following: patch, report, context, org, chain' + echo 'You can specify the mode with "make coccicheck MODE=<mode>"' + echo 'Note however that some modes are not implemented by some semantic patches.' + fi + MODE="report" +fi + +if [ "$MODE" = "chain" ] ; then + if [ "$ONLINE" = "0" ] ; then + echo 'You have selected the "chain" mode.' + echo 'All available modes will be tried (in that order): patch, report, context, org' + fi +elif [ "$MODE" = "report" -o "$MODE" = "org" ] ; then + FLAGS="--no-show-diff $FLAGS" +fi + +if [ "$ONLINE" = "0" ] ; then + echo '' + echo 'Please check for false positives in the output before submitting a patch.' + echo 'When using "patch" mode, carefully review the patch before submitting it.' + echo '' +fi + +run_cmd_parmap() { + if [ $VERBOSE -ne 0 ] ; then + echo "Running ($NPROC in parallel): $@" + fi + if [ "$DEBUG_FILE" != "/dev/null" -a "$DEBUG_FILE" != "" ]; then + echo $@>>$DEBUG_FILE + $@ 2>>$DEBUG_FILE + else + echo $@ + $@ 2>&1 + fi + + err=$? + if [[ $err -ne 0 ]]; then + echo "coccicheck failed" + exit $err + fi +} + +run_cmd_old() { + local i + if [ $VERBOSE -ne 0 ] ; then + echo "Running ($NPROC in parallel): $@" + fi + for i in $(seq 0 $(( NPROC - 1)) ); do + eval "$@ --max $NPROC --index $i &" + SPATCH_PID[$i]=$! + if [ $VERBOSE -eq 2 ] ; then + echo "${SPATCH_PID[$i]} running" + fi + done + wait +} + +run_cmd() { + if [ "$USE_JOBS" = "yes" ]; then + run_cmd_parmap $@ + else + run_cmd_old $@ + fi +} + +kill_running() { + for i in $(seq 0 $(( NPROC - 1 )) ); do + if [ $VERBOSE -eq 2 ] ; then + echo "Killing ${SPATCH_PID[$i]}" + fi + kill ${SPATCH_PID[$i]} 2>/dev/null + done +} + +# You can override heuristics with SPFLAGS, these must always go last +OPTIONS="$OPTIONS $SPFLAGS" + +coccinelle () { + COCCI="$1" + + OPT=`grep "Options:" $COCCI | cut -d':' -f2` + REQ=`grep "Requires:" $COCCI | cut -d':' -f2 | sed "s| ||"` + REQ_NUM=$(echo $REQ | ${DIR}/scripts/ld-version.sh) + if [ "$REQ_NUM" != "0" ] ; then + if [ "$SPATCH_VERSION_NUM" -lt "$REQ_NUM" ] ; then + echo "Skipping coccinelle SmPL patch: $COCCI" + echo "You have coccinelle: $SPATCH_VERSION" + echo "This SmPL patch requires: $REQ" + return + fi + fi + +# The option '--parse-cocci' can be used to syntactically check the SmPL files. +# +# $SPATCH -D $MODE $FLAGS -parse_cocci $COCCI $OPT > /dev/null + + if [ $VERBOSE -ne 0 -a $ONLINE -eq 0 ] ; then + + FILE=${COCCI#$srctree/} + + echo "Processing `basename $COCCI`" + echo "with option(s) \"$OPT\"" + echo '' + echo 'Message example to submit a patch:' + + sed -ne 's|^///||p' $COCCI + + if [ "$MODE" = "patch" ] ; then + echo ' The semantic patch that makes this change is available' + elif [ "$MODE" = "report" ] ; then + echo ' The semantic patch that makes this report is available' + elif [ "$MODE" = "context" ] ; then + echo ' The semantic patch that spots this code is available' + elif [ "$MODE" = "org" ] ; then + echo ' The semantic patch that makes this Org report is available' + else + echo ' The semantic patch that makes this output is available' + fi + echo " in $FILE." + echo '' + echo ' More information about semantic patching is available at' + echo ' http://coccinelle.lip6.fr/' + echo '' + + if [ "`sed -ne 's|^//#||p' $COCCI`" ] ; then + echo 'Semantic patch information:' + sed -ne 's|^//#||p' $COCCI + echo '' + fi + fi + + if [ "$MODE" = "chain" ] ; then + run_cmd $SPATCH -D patch \ + $FLAGS --cocci-file $COCCI $OPT $OPTIONS || \ + run_cmd $SPATCH -D report \ + $FLAGS --cocci-file $COCCI $OPT $OPTIONS --no-show-diff || \ + run_cmd $SPATCH -D context \ + $FLAGS --cocci-file $COCCI $OPT $OPTIONS || \ + run_cmd $SPATCH -D org \ + $FLAGS --cocci-file $COCCI $OPT $OPTIONS --no-show-diff || exit 1 + elif [ "$MODE" = "rep+ctxt" ] ; then + run_cmd $SPATCH -D report \ + $FLAGS --cocci-file $COCCI $OPT $OPTIONS --no-show-diff && \ + run_cmd $SPATCH -D context \ + $FLAGS --cocci-file $COCCI $OPT $OPTIONS || exit 1 + else + run_cmd $SPATCH -D $MODE $FLAGS --cocci-file $COCCI $OPT $OPTIONS || exit 1 + fi + +} + +if [ "$DEBUG_FILE" != "/dev/null" -a "$DEBUG_FILE" != "" ]; then + if [ -f $DEBUG_FILE ]; then + echo "Debug file $DEBUG_FILE exists, bailing" + exit + fi +else + DEBUG_FILE="/dev/null" +fi + +if [ "$COCCI" = "" ] ; then + for f in `find $srctree/scripts/coccinelle/ -name '*.cocci' -type f | sort`; do + coccinelle $f + done +else + coccinelle $COCCI +fi diff --git a/src/net/scripts/coccinelle/api/alloc/alloc_cast.cocci b/src/net/scripts/coccinelle/api/alloc/alloc_cast.cocci new file mode 100644 index 0000000..f6f0ccd --- /dev/null +++ b/src/net/scripts/coccinelle/api/alloc/alloc_cast.cocci @@ -0,0 +1,123 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Remove casting the values returned by memory allocation functions +/// like kmalloc, kzalloc, kmem_cache_alloc, kmem_cache_zalloc etc. +/// +//# This makes an effort to find cases of casting of values returned by +//# kmalloc, kzalloc, kcalloc, kmem_cache_alloc, kmem_cache_zalloc, +//# kmem_cache_alloc_node, kmalloc_node and kzalloc_node and removes +//# the casting as it is not required. The result in the patch case may +//# need some reformatting. +// +// Confidence: High +// Copyright: (C) 2014 Himangi Saraogi +// Copyright: (C) 2017 Himanshu Jha +// Comments: +// Options: --no-includes --include-headers +// + +virtual context +virtual patch +virtual org +virtual report + +@initialize:python@ +@@ +import re +pattern = '__' +m = re.compile(pattern) + +@r1 depends on context || patch@ +type T; +@@ + + (T *) + \(kmalloc\|kzalloc\|kcalloc\|kmem_cache_alloc\|kmem_cache_zalloc\| + kmem_cache_alloc_node\|kmalloc_node\|kzalloc_node\|vmalloc\|vzalloc\| + dma_alloc_coherent\|devm_kmalloc\|devm_kzalloc\| + kvmalloc\|kvzalloc\|kvmalloc_node\|kvzalloc_node\|pci_alloc_consistent\| + pci_zalloc_consistent\|kmem_alloc\|kmem_zalloc\|kmem_zone_alloc\| + kmem_zone_zalloc\|vmalloc_node\|vzalloc_node\)(...) + +//---------------------------------------------------------- +// For context mode +//---------------------------------------------------------- + +@script:python depends on context@ +t << r1.T; +@@ + +if m.search(t) != None: + cocci.include_match(False) + +@depends on context && r1@ +type r1.T; +@@ + +* (T *) + \(kmalloc\|kzalloc\|kcalloc\|kmem_cache_alloc\|kmem_cache_zalloc\| + kmem_cache_alloc_node\|kmalloc_node\|kzalloc_node\|vmalloc\|vzalloc\| + dma_alloc_coherent\|devm_kmalloc\|devm_kzalloc\| + kvmalloc\|kvzalloc\|kvmalloc_node\|kvzalloc_node\|pci_alloc_consistent\| + pci_zalloc_consistent\|kmem_alloc\|kmem_zalloc\|kmem_zone_alloc\| + kmem_zone_zalloc\|vmalloc_node\|vzalloc_node\)(...) + +//---------------------------------------------------------- +// For patch mode +//---------------------------------------------------------- + +@script:python depends on patch@ +t << r1.T; +@@ + +if m.search(t) != None: + cocci.include_match(False) + +@depends on patch && r1@ +type r1.T; +@@ + +- (T *) + \(kmalloc\|kzalloc\|kcalloc\|kmem_cache_alloc\|kmem_cache_zalloc\| + kmem_cache_alloc_node\|kmalloc_node\|kzalloc_node\|vmalloc\|vzalloc\| + dma_alloc_coherent\|devm_kmalloc\|devm_kzalloc\| + kvmalloc\|kvzalloc\|kvmalloc_node\|kvzalloc_node\|pci_alloc_consistent\| + pci_zalloc_consistent\|kmem_alloc\|kmem_zalloc\|kmem_zone_alloc\| + kmem_zone_zalloc\|vmalloc_node\|vzalloc_node\)(...) + +//---------------------------------------------------------- +// For org and report mode +//---------------------------------------------------------- + +@r2 depends on org || report@ +type T; +position p; +@@ + + (T@p *) + \(kmalloc\|kzalloc\|kcalloc\|kmem_cache_alloc\|kmem_cache_zalloc\| + kmem_cache_alloc_node\|kmalloc_node\|kzalloc_node\|vmalloc\|vzalloc\| + dma_alloc_coherent\|devm_kmalloc\|devm_kzalloc\| + kvmalloc\|kvzalloc\|kvmalloc_node\|kvzalloc_node\|pci_alloc_consistent\| + pci_zalloc_consistent\|kmem_alloc\|kmem_zalloc\|kmem_zone_alloc\| + kmem_zone_zalloc\|vmalloc_node\|vzalloc_node\)(...) + +@script:python depends on org@ +p << r2.p; +t << r2.T; +@@ + +if m.search(t) != None: + cocci.include_match(False) +else: + coccilib.org.print_safe_todo(p[0], t) + +@script:python depends on report@ +p << r2.p; +t << r2.T; +@@ + +if m.search(t) != None: + cocci.include_match(False) +else: + msg="WARNING: casting value returned by memory allocation function to (%s *) is useless." % (t) + coccilib.report.print_report(p[0], msg) diff --git a/src/net/scripts/coccinelle/api/alloc/pool_zalloc-simple.cocci b/src/net/scripts/coccinelle/api/alloc/pool_zalloc-simple.cocci new file mode 100644 index 0000000..9c61a23 --- /dev/null +++ b/src/net/scripts/coccinelle/api/alloc/pool_zalloc-simple.cocci @@ -0,0 +1,85 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// +/// Use *_pool_zalloc rather than *_pool_alloc followed by memset with 0 +/// +// Copyright: (C) 2015 Intel Corp. +// Options: --no-includes --include-headers +// +// Keywords: dma_pool_zalloc, pci_pool_zalloc +// + +virtual context +virtual patch +virtual org +virtual report + +//---------------------------------------------------------- +// For context mode +//---------------------------------------------------------- + +@depends on context@ +expression x; +statement S; +@@ + +* x = \(dma_pool_alloc\|pci_pool_alloc\)(...); + if ((x==NULL) || ...) S +* memset(x,0, ...); + +//---------------------------------------------------------- +// For patch mode +//---------------------------------------------------------- + +@depends on patch@ +expression x; +expression a,b,c; +statement S; +@@ + +- x = dma_pool_alloc(a,b,c); ++ x = dma_pool_zalloc(a,b,c); + if ((x==NULL) || ...) S +- memset(x,0,...); + +@depends on patch@ +expression x; +expression a,b,c; +statement S; +@@ + +- x = pci_pool_alloc(a,b,c); ++ x = pci_pool_zalloc(a,b,c); + if ((x==NULL) || ...) S +- memset(x,0,...); + +//---------------------------------------------------------- +// For org and report mode +//---------------------------------------------------------- + +@r depends on org || report@ +expression x; +expression a,b,c; +statement S; +position p; +@@ + + x = @p\(dma_pool_alloc\|pci_pool_alloc\)(a,b,c); + if ((x==NULL) || ...) S + memset(x,0, ...); + +@script:python depends on org@ +p << r.p; +x << r.x; +@@ + +msg="%s" % (x) +msg_safe=msg.replace("[","@(").replace("]",")") +coccilib.org.print_todo(p[0], msg_safe) + +@script:python depends on report@ +p << r.p; +x << r.x; +@@ + +msg="WARNING: *_pool_zalloc should be used for %s, instead of *_pool_alloc/memset" % (x) +coccilib.report.print_report(p[0], msg) diff --git a/src/net/scripts/coccinelle/api/alloc/zalloc-simple.cocci b/src/net/scripts/coccinelle/api/alloc/zalloc-simple.cocci new file mode 100644 index 0000000..b3d0c3c --- /dev/null +++ b/src/net/scripts/coccinelle/api/alloc/zalloc-simple.cocci @@ -0,0 +1,411 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// +/// Use zeroing allocator rather than allocator followed by memset with 0 +/// +/// This considers some simple cases that are common and easy to validate +/// Note in particular that there are no ...s in the rule, so all of the +/// matched code has to be contiguous +/// +// Confidence: High +// Copyright: (C) 2009-2010 Julia Lawall, Nicolas Palix, DIKU. +// Copyright: (C) 2009-2010 Gilles Muller, INRIA/LiP6. +// Copyright: (C) 2017 Himanshu Jha +// URL: http://coccinelle.lip6.fr/rules/kzalloc.html +// Options: --no-includes --include-headers +// +// Keywords: kmalloc, kzalloc +// Version min: < 2.6.12 kmalloc +// Version min: 2.6.14 kzalloc +// + +virtual context +virtual patch +virtual org +virtual report + +//---------------------------------------------------------- +// For context mode +//---------------------------------------------------------- + +@depends on context@ +type T, T2; +expression x; +expression E1; +statement S; +@@ + +* x = (T)\(kmalloc(E1, ...)\|vmalloc(E1)\|dma_alloc_coherent(...,E1,...)\| + kmalloc_node(E1, ...)\|kmem_cache_alloc(...)\|kmem_alloc(E1, ...)\| + devm_kmalloc(...,E1,...)\|kvmalloc(E1, ...)\|kvmalloc_node(E1,...)\); + if ((x==NULL) || ...) S +* memset((T2)x,0,E1); + +//---------------------------------------------------------- +// For patch mode +//---------------------------------------------------------- + +@depends on patch@ +type T, T2; +expression x; +expression E1,E2,E3,E4; +statement S; +@@ + +( +- x = kmalloc(E1,E2); ++ x = kzalloc(E1,E2); +| +- x = (T *)kmalloc(E1,E2); ++ x = kzalloc(E1,E2); +| +- x = (T)kmalloc(E1,E2); ++ x = (T)kzalloc(E1,E2); +| +- x = vmalloc(E1); ++ x = vzalloc(E1); +| +- x = (T *)vmalloc(E1); ++ x = vzalloc(E1); +| +- x = (T)vmalloc(E1); ++ x = (T)vzalloc(E1); +| +- x = kmalloc_node(E1,E2,E3); ++ x = kzalloc_node(E1,E2,E3); +| +- x = (T *)kmalloc_node(E1,E2,E3); ++ x = kzalloc_node(E1,E2,E3); +| +- x = (T)kmalloc_node(E1,E2,E3); ++ x = (T)kzalloc_node(E1,E2,E3); +| +- x = kmem_cache_alloc(E3,E4); ++ x = kmem_cache_zalloc(E3,E4); +| +- x = (T *)kmem_cache_alloc(E3,E4); ++ x = kmem_cache_zalloc(E3,E4); +| +- x = (T)kmem_cache_alloc(E3,E4); ++ x = (T)kmem_cache_zalloc(E3,E4); +| +- x = kmem_alloc(E1,E2); ++ x = kmem_zalloc(E1,E2); +| +- x = (T *)kmem_alloc(E1,E2); ++ x = kmem_zalloc(E1,E2); +| +- x = (T)kmem_alloc(E1,E2); ++ x = (T)kmem_zalloc(E1,E2); +| +- x = devm_kmalloc(E2,E1,E3); ++ x = devm_kzalloc(E2,E1,E3); +| +- x = (T *)devm_kmalloc(E2,E1,E3); ++ x = devm_kzalloc(E2,E1,E3); +| +- x = (T)devm_kmalloc(E2,E1,E3); ++ x = (T)devm_kzalloc(E2,E1,E3); +| +- x = kvmalloc(E1,E2); ++ x = kvzalloc(E1,E2); +| +- x = (T *)kvmalloc(E1,E2); ++ x = kvzalloc(E1,E2); +| +- x = (T)kvmalloc(E1,E2); ++ x = (T)kvzalloc(E1,E2); +| +- x = kvmalloc_node(E1,E2,E3); ++ x = kvzalloc_node(E1,E2,E3); +| +- x = (T *)kvmalloc_node(E1,E2,E3); ++ x = kvzalloc_node(E1,E2,E3); +| +- x = (T)kvmalloc_node(E1,E2,E3); ++ x = (T)kvzalloc_node(E1,E2,E3); +) + if ((x==NULL) || ...) S +- memset((T2)x,0,E1); + +@depends on patch@ +type T, T2; +expression x; +expression E1,E2,E3,E4; +statement S; +@@ + x = (T)dma_alloc_coherent(E1, E2, E3, E4); + if ((x==NULL) || ...) S +- memset((T2)x, 0, E2); + +//---------------------------------------------------------- +// For org mode +//---------------------------------------------------------- + +@r depends on org || report@ +type T, T2; +expression x; +expression E1,E2; +statement S; +position p; +@@ + + x = (T)kmalloc@p(E1,E2); + if ((x==NULL) || ...) S + memset((T2)x,0,E1); + +@script:python depends on org@ +p << r.p; +x << r.x; +@@ + +msg="%s" % (x) +msg_safe=msg.replace("[","@(").replace("]",")") +coccilib.org.print_todo(p[0], msg_safe) + +@script:python depends on report@ +p << r.p; +x << r.x; +@@ + +msg="WARNING: kzalloc should be used for %s, instead of kmalloc/memset" % (x) +coccilib.report.print_report(p[0], msg) + +//----------------------------------------------------------------- +@r1 depends on org || report@ +type T, T2; +expression x; +expression E1; +statement S; +position p; +@@ + + x = (T)vmalloc@p(E1); + if ((x==NULL) || ...) S + memset((T2)x,0,E1); + +@script:python depends on org@ +p << r1.p; +x << r1.x; +@@ + +msg="%s" % (x) +msg_safe=msg.replace("[","@(").replace("]",")") +coccilib.org.print_todo(p[0], msg_safe) + +@script:python depends on report@ +p << r1.p; +x << r1.x; +@@ + +msg="WARNING: vzalloc should be used for %s, instead of vmalloc/memset" % (x) +coccilib.report.print_report(p[0], msg) + +//----------------------------------------------------------------- +@r2 depends on org || report@ +type T, T2; +expression x; +expression E1,E2,E3,E4; +statement S; +position p; +@@ + + x = (T)dma_alloc_coherent@p(E1,E2,E3,E4); + if ((x==NULL) || ...) S + memset((T2)x,0,E2); + +@script:python depends on org@ +p << r2.p; +x << r2.x; +@@ + +msg="%s" % (x) +msg_safe=msg.replace("[","@(").replace("]",")") +coccilib.org.print_todo(p[0], msg_safe) + +@script:python depends on report@ +p << r2.p; +x << r2.x; +@@ + +msg="WARNING: dma_alloc_coherent used in %s already zeroes out memory, so memset is not needed" % (x) +coccilib.report.print_report(p[0], msg) + +//----------------------------------------------------------------- +@r3 depends on org || report@ +type T, T2; +expression x; +expression E1,E2,E3; +statement S; +position p; +@@ + + x = (T)kmalloc_node@p(E1,E2,E3); + if ((x==NULL) || ...) S + memset((T2)x,0,E1); + +@script:python depends on org@ +p << r3.p; +x << r3.x; +@@ + +msg="%s" % (x) +msg_safe=msg.replace("[","@(").replace("]",")") +coccilib.org.print_todo(p[0], msg_safe) + +@script:python depends on report@ +p << r3.p; +x << r3.x; +@@ + +msg="WARNING: kzalloc_node should be used for %s, instead of kmalloc_node/memset" % (x) +coccilib.report.print_report(p[0], msg) + +//----------------------------------------------------------------- +@r4 depends on org || report@ +type T, T2; +expression x; +expression E1,E2,E3; +statement S; +position p; +@@ + + x = (T)kmem_cache_alloc@p(E2,E3); + if ((x==NULL) || ...) S + memset((T2)x,0,E1); + +@script:python depends on org@ +p << r4.p; +x << r4.x; +@@ + +msg="%s" % (x) +msg_safe=msg.replace("[","@(").replace("]",")") +coccilib.org.print_todo(p[0], msg_safe) + +@script:python depends on report@ +p << r4.p; +x << r4.x; +@@ + +msg="WARNING: kmem_cache_zalloc should be used for %s, instead of kmem_cache_alloc/memset" % (x) +coccilib.report.print_report(p[0], msg) + +//----------------------------------------------------------------- +@r5 depends on org || report@ +type T, T2; +expression x; +expression E1,E2; +statement S; +position p; +@@ + + x = (T)kmem_alloc@p(E1,E2); + if ((x==NULL) || ...) S + memset((T2)x,0,E1); + +@script:python depends on org@ +p << r5.p; +x << r5.x; +@@ + +msg="%s" % (x) +msg_safe=msg.replace("[","@(").replace("]",")") +coccilib.org.print_todo(p[0], msg_safe) + +@script:python depends on report@ +p << r5.p; +x << r5.x; +@@ + +msg="WARNING: kmem_zalloc should be used for %s, instead of kmem_alloc/memset" % (x) +coccilib.report.print_report(p[0], msg) + +//----------------------------------------------------------------- +@r6 depends on org || report@ +type T, T2; +expression x; +expression E1,E2,E3; +statement S; +position p; +@@ + + x = (T)devm_kmalloc@p(E2,E1,E3); + if ((x==NULL) || ...) S + memset((T2)x,0,E1); + +@script:python depends on org@ +p << r6.p; +x << r6.x; +@@ + +msg="%s" % (x) +msg_safe=msg.replace("[","@(").replace("]",")") +coccilib.org.print_todo(p[0], msg_safe) + +@script:python depends on report@ +p << r6.p; +x << r6.x; +@@ + +msg="WARNING: devm_kzalloc should be used for %s, instead of devm_kmalloc/memset" % (x) +coccilib.report.print_report(p[0], msg) + +//----------------------------------------------------------------- +@r7 depends on org || report@ +type T, T2; +expression x; +expression E1,E2; +statement S; +position p; +@@ + + x = (T)kvmalloc@p(E1,E2); + if ((x==NULL) || ...) S + memset((T2)x,0,E1); + +@script:python depends on org@ +p << r7.p; +x << r7.x; +@@ + +msg="%s" % (x) +msg_safe=msg.replace("[","@(").replace("]",")") +coccilib.org.print_todo(p[0], msg_safe) + +@script:python depends on report@ +p << r7.p; +x << r7.x; +@@ + +msg="WARNING: kvzalloc should be used for %s, instead of kvmalloc/memset" % (x) +coccilib.report.print_report(p[0], msg) + +//----------------------------------------------------------------- +@r9 depends on org || report@ +type T, T2; +expression x; +expression E1,E2,E3; +statement S; +position p; +@@ + + x = (T)kvmalloc_node@p(E1,E2,E3); + if ((x==NULL) || ...) S + memset((T2)x,0,E1); + +@script:python depends on org@ +p << r9.p; +x << r9.x; +@@ + +msg="%s" % (x) +msg_safe=msg.replace("[","@(").replace("]",")") +coccilib.org.print_todo(p[0], msg_safe) + +@script:python depends on report@ +p << r9.p; +x << r9.x; +@@ + +msg="WARNING: kvzalloc_node should be used for %s, instead of kvmalloc_node/memset" % (x) +coccilib.report.print_report(p[0], msg) diff --git a/src/net/scripts/coccinelle/api/atomic_as_refcounter.cocci b/src/net/scripts/coccinelle/api/atomic_as_refcounter.cocci new file mode 100644 index 0000000..0f78d94 --- /dev/null +++ b/src/net/scripts/coccinelle/api/atomic_as_refcounter.cocci @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: GPL-2.0-only +// Check if refcount_t type and API should be used +// instead of atomic_t type when dealing with refcounters +// +// Copyright (c) 2016-2017, Elena Reshetova, Intel Corporation +// +// Confidence: Moderate +// URL: http://coccinelle.lip6.fr/ +// Options: --include-headers --very-quiet + +virtual report + +@r1 exists@ +identifier a, x; +position p1, p2; +identifier fname =~ ".*free.*"; +identifier fname2 =~ ".*destroy.*"; +identifier fname3 =~ ".*del.*"; +identifier fname4 =~ ".*queue_work.*"; +identifier fname5 =~ ".*schedule_work.*"; +identifier fname6 =~ ".*call_rcu.*"; + +@@ + +( + atomic_dec_and_test@p1(&(a)->x) +| + atomic_dec_and_lock@p1(&(a)->x, ...) +| + atomic_long_dec_and_lock@p1(&(a)->x, ...) +| + atomic_long_dec_and_test@p1(&(a)->x) +| + atomic64_dec_and_test@p1(&(a)->x) +| + local_dec_and_test@p1(&(a)->x) +) +... +( + fname@p2(a, ...); +| + fname2@p2(...); +| + fname3@p2(...); +| + fname4@p2(...); +| + fname5@p2(...); +| + fname6@p2(...); +) + + +@script:python depends on report@ +p1 << r1.p1; +p2 << r1.p2; +@@ +msg = "atomic_dec_and_test variation before object free at line %s." +coccilib.report.print_report(p1[0], msg % (p2[0].line)) + +@r4 exists@ +identifier a, x, y; +position p1, p2; +identifier fname =~ ".*free.*"; + +@@ + +( + atomic_dec_and_test@p1(&(a)->x) +| + atomic_dec_and_lock@p1(&(a)->x, ...) +| + atomic_long_dec_and_lock@p1(&(a)->x, ...) +| + atomic_long_dec_and_test@p1(&(a)->x) +| + atomic64_dec_and_test@p1(&(a)->x) +| + local_dec_and_test@p1(&(a)->x) +) +... +y=a +... +fname@p2(y, ...); + + +@script:python depends on report@ +p1 << r4.p1; +p2 << r4.p2; +@@ +msg = "atomic_dec_and_test variation before object free at line %s." +coccilib.report.print_report(p1[0], msg % (p2[0].line)) + +@r2 exists@ +identifier a, x; +position p1; +@@ + +( +atomic_add_unless(&(a)->x,-1,1)@p1 +| +atomic_long_add_unless(&(a)->x,-1,1)@p1 +| +atomic64_add_unless(&(a)->x,-1,1)@p1 +) + +@script:python depends on report@ +p1 << r2.p1; +@@ +msg = "atomic_add_unless" +coccilib.report.print_report(p1[0], msg) + +@r3 exists@ +identifier x; +position p1; +@@ + +( +x = atomic_add_return@p1(-1, ...); +| +x = atomic_long_add_return@p1(-1, ...); +| +x = atomic64_add_return@p1(-1, ...); +) + +@script:python depends on report@ +p1 << r3.p1; +@@ +msg = "x = atomic_add_return(-1, ...)" +coccilib.report.print_report(p1[0], msg) diff --git a/src/net/scripts/coccinelle/api/check_bq27xxx_data.cocci b/src/net/scripts/coccinelle/api/check_bq27xxx_data.cocci new file mode 100644 index 0000000..fae539e --- /dev/null +++ b/src/net/scripts/coccinelle/api/check_bq27xxx_data.cocci @@ -0,0 +1,162 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Detect BQ27XXX_DATA structures with identical registers, dm registers or +/// properties. +//# Doesn't unfold macros used in register or property fields. +//# Requires OCaml scripting +/// +// Confidence: High +// Copyright: (C) 2017 Julia Lawall, Inria/LIP6, +// URL: http://coccinelle.lip6.fr/ +// Requires: 1.0.7 +// Keywords: BQ27XXX_DATA + +virtual report + +@initialize:ocaml@ +@@ + +let print_report p msg = + let p = List.hd p in + Printf.printf "%s:%d:%d-%d: %s" p.file p.line p.col p.col_end msg + +@str depends on report@ +type t; +identifier i,i1,i2; +expression e1,e2; +@@ + +t i[] = { + ..., + [e1] = BQ27XXX_DATA(i1,...), + ..., + [e2] = BQ27XXX_DATA(i2,...), + ..., +}; + +@script:ocaml tocheck@ +i1 << str.i1; +i2 << str.i2; +i1regs; i2regs; +i1dmregs; i2dmregs; +i1props; i2props; +@@ + +if not(i1 = i2) +then + begin + i1regs := make_ident (i1 ^ "_regs"); + i2regs := make_ident (i2 ^ "_regs"); + i1dmregs := make_ident (i1 ^ "_dm_regs"); + i2dmregs := make_ident (i2 ^ "_dm_regs"); + i1props := make_ident (i1 ^ "_props"); + i2props := make_ident (i2 ^ "_props") + end + +(* ---------------------------------------------------------------- *) + +@getregs1@ +typedef u8; +identifier tocheck.i1regs; +initializer list i1regs_vals; +position p1; +@@ + +u8 i1regs@p1[...] = { i1regs_vals, }; + +@getregs2@ +identifier tocheck.i2regs; +initializer list i2regs_vals; +position p2; +@@ + +u8 i2regs@p2[...] = { i2regs_vals, }; + +@script:ocaml@ +(_,i1regs_vals) << getregs1.i1regs_vals; +(_,i2regs_vals) << getregs2.i2regs_vals; +i1regs << tocheck.i1regs; +i2regs << tocheck.i2regs; +p1 << getregs1.p1; +p2 << getregs2.p2; +@@ + +if i1regs < i2regs && + List.sort compare i1regs_vals = List.sort compare i2regs_vals +then + let msg = + Printf.sprintf + "WARNING %s and %s (line %d) are identical\n" + i1regs i2regs (List.hd p2).line in + print_report p1 msg + +(* ---------------------------------------------------------------- *) + +@getdmregs1@ +identifier tocheck.i1dmregs; +initializer list i1dmregs_vals; +position p1; +@@ + +struct bq27xxx_dm_reg i1dmregs@p1[] = { i1dmregs_vals, }; + +@getdmregs2@ +identifier tocheck.i2dmregs; +initializer list i2dmregs_vals; +position p2; +@@ + +struct bq27xxx_dm_reg i2dmregs@p2[] = { i2dmregs_vals, }; + +@script:ocaml@ +(_,i1dmregs_vals) << getdmregs1.i1dmregs_vals; +(_,i2dmregs_vals) << getdmregs2.i2dmregs_vals; +i1dmregs << tocheck.i1dmregs; +i2dmregs << tocheck.i2dmregs; +p1 << getdmregs1.p1; +p2 << getdmregs2.p2; +@@ + +if i1dmregs < i2dmregs && + List.sort compare i1dmregs_vals = List.sort compare i2dmregs_vals +then + let msg = + Printf.sprintf + "WARNING %s and %s (line %d) are identical\n" + i1dmregs i2dmregs (List.hd p2).line in + print_report p1 msg + +(* ---------------------------------------------------------------- *) + +@getprops1@ +identifier tocheck.i1props; +initializer list[n1] i1props_vals; +position p1; +@@ + +enum power_supply_property i1props@p1[] = { i1props_vals, }; + +@getprops2@ +identifier tocheck.i2props; +initializer list[n2] i2props_vals; +position p2; +@@ + +enum power_supply_property i2props@p2[] = { i2props_vals, }; + +@script:ocaml@ +(_,i1props_vals) << getprops1.i1props_vals; +(_,i2props_vals) << getprops2.i2props_vals; +i1props << tocheck.i1props; +i2props << tocheck.i2props; +p1 << getprops1.p1; +p2 << getprops2.p2; +@@ + +if i1props < i2props && + List.sort compare i1props_vals = List.sort compare i2props_vals +then + let msg = + Printf.sprintf + "WARNING %s and %s (line %d) are identical\n" + i1props i2props (List.hd p2).line in + print_report p1 msg diff --git a/src/net/scripts/coccinelle/api/d_find_alias.cocci b/src/net/scripts/coccinelle/api/d_find_alias.cocci new file mode 100644 index 0000000..47e0501 --- /dev/null +++ b/src/net/scripts/coccinelle/api/d_find_alias.cocci @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: GPL-2.0 +/// Make sure calls to d_find_alias() have a corresponding call to dput(). +// +// Keywords: d_find_alias, dput +// +// Confidence: Moderate +// URL: http://coccinelle.lip6.fr/ +// Options: --include-headers + +virtual context +virtual org +virtual patch +virtual report + +@r exists@ +local idexpression struct dentry *dent; +expression E, E1; +statement S1, S2; +position p1, p2; +@@ +( + if (!(dent@p1 = d_find_alias(...))) S1 +| + dent@p1 = d_find_alias(...) +) + +<...when != dput(dent) + when != if (...) { <+... dput(dent) ...+> } + when != true !dent || ... + when != dent = E + when != E = dent +if (!dent || ...) S2 +...> +( + return <+...dent...+>; +| + return @p2 ...; +| + dent@p2 = E1; +| + E1 = dent; +) + +@depends on context@ +local idexpression struct dentry *r.dent; +position r.p1,r.p2; +@@ +* dent@p1 = ... + ... +( +* return@p2 ...; +| +* dent@p2 +) + + +@script:python depends on org@ +p1 << r.p1; +p2 << r.p2; +@@ +cocci.print_main("Missing call to dput()",p1) +cocci.print_secs("",p2) + +@depends on patch@ +local idexpression struct dentry *r.dent; +position r.p2; +@@ +( ++ dput(dent); + return @p2 ...; +| ++ dput(dent); + dent@p2 = ...; +) + +@script:python depends on report@ +p1 << r.p1; +p2 << r.p2; +@@ +msg = "Missing call to dput() at line %s." +coccilib.report.print_report(p1[0], msg % (p2[0].line)) diff --git a/src/net/scripts/coccinelle/api/debugfs/debugfs_simple_attr.cocci b/src/net/scripts/coccinelle/api/debugfs/debugfs_simple_attr.cocci new file mode 100644 index 0000000..7c31231 --- /dev/null +++ b/src/net/scripts/coccinelle/api/debugfs/debugfs_simple_attr.cocci @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: GPL-2.0 +/// Use DEFINE_DEBUGFS_ATTRIBUTE rather than DEFINE_SIMPLE_ATTRIBUTE +/// for debugfs files. +/// +//# Rationale: DEFINE_SIMPLE_ATTRIBUTE + debugfs_create_file() +//# imposes some significant overhead as compared to +//# DEFINE_DEBUGFS_ATTRIBUTE + debugfs_create_file_unsafe(). +// +// Copyright (C): 2016 Nicolai Stange +// Options: --no-includes +// + +virtual context +virtual patch +virtual org +virtual report + +@dsa@ +declarer name DEFINE_SIMPLE_ATTRIBUTE; +identifier dsa_fops; +expression dsa_get, dsa_set, dsa_fmt; +position p; +@@ +DEFINE_SIMPLE_ATTRIBUTE@p(dsa_fops, dsa_get, dsa_set, dsa_fmt); + +@dcf@ +expression name, mode, parent, data; +identifier dsa.dsa_fops; +@@ +debugfs_create_file(name, mode, parent, data, &dsa_fops) + + +@context_dsa depends on context && dcf@ +declarer name DEFINE_DEBUGFS_ATTRIBUTE; +identifier dsa.dsa_fops; +expression dsa.dsa_get, dsa.dsa_set, dsa.dsa_fmt; +@@ +* DEFINE_SIMPLE_ATTRIBUTE(dsa_fops, dsa_get, dsa_set, dsa_fmt); + + +@patch_dcf depends on patch expression@ +expression name, mode, parent, data; +identifier dsa.dsa_fops; +@@ +- debugfs_create_file(name, mode, parent, data, &dsa_fops) ++ debugfs_create_file_unsafe(name, mode, parent, data, &dsa_fops) + +@patch_dsa depends on patch_dcf && patch@ +identifier dsa.dsa_fops; +expression dsa.dsa_get, dsa.dsa_set, dsa.dsa_fmt; +@@ +- DEFINE_SIMPLE_ATTRIBUTE(dsa_fops, dsa_get, dsa_set, dsa_fmt); ++ DEFINE_DEBUGFS_ATTRIBUTE(dsa_fops, dsa_get, dsa_set, dsa_fmt); + + +@script:python depends on org && dcf@ +fops << dsa.dsa_fops; +p << dsa.p; +@@ +msg="%s should be defined with DEFINE_DEBUGFS_ATTRIBUTE" % (fops) +coccilib.org.print_todo(p[0], msg) + +@script:python depends on report && dcf@ +fops << dsa.dsa_fops; +p << dsa.p; +@@ +msg="WARNING: %s should be defined with DEFINE_DEBUGFS_ATTRIBUTE" % (fops) +coccilib.report.print_report(p[0], msg) diff --git a/src/net/scripts/coccinelle/api/device_attr_show.cocci b/src/net/scripts/coccinelle/api/device_attr_show.cocci new file mode 100644 index 0000000..a28dc06 --- /dev/null +++ b/src/net/scripts/coccinelle/api/device_attr_show.cocci @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// +/// From Documentation/filesystems/sysfs.rst: +/// show() must not use snprintf() when formatting the value to be +/// returned to user space. If you can guarantee that an overflow +/// will never happen you can use sprintf() otherwise you must use +/// scnprintf(). +/// +// Confidence: High +// Copyright: (C) 2020 Denis Efremov ISPRAS +// Options: --no-includes --include-headers +// + +virtual report +virtual org +virtual context +virtual patch + +@r depends on !patch@ +identifier show, dev, attr, buf; +position p; +@@ + +ssize_t show(struct device *dev, struct device_attribute *attr, char *buf) +{ + <... +* return snprintf@p(...); + ...> +} + +@rp depends on patch@ +identifier show, dev, attr, buf; +@@ + +ssize_t show(struct device *dev, struct device_attribute *attr, char *buf) +{ + <... + return +- snprintf ++ scnprintf + (...); + ...> +} + +@script: python depends on report@ +p << r.p; +@@ + +coccilib.report.print_report(p[0], "WARNING: use scnprintf or sprintf") + +@script: python depends on org@ +p << r.p; +@@ + +coccilib.org.print_todo(p[0], "WARNING: use scnprintf or sprintf") diff --git a/src/net/scripts/coccinelle/api/err_cast.cocci b/src/net/scripts/coccinelle/api/err_cast.cocci new file mode 100644 index 0000000..0e661c8 --- /dev/null +++ b/src/net/scripts/coccinelle/api/err_cast.cocci @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// +/// Use ERR_CAST inlined function instead of ERR_PTR(PTR_ERR(...)) +/// +// Confidence: High +// Copyright: (C) 2009, 2010 Nicolas Palix, DIKU. +// Copyright: (C) 2009, 2010 Julia Lawall, DIKU. +// Copyright: (C) 2009, 2010 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Options: +// +// Keywords: ERR_PTR, PTR_ERR, ERR_CAST +// Version min: 2.6.25 +// + +virtual context +virtual patch +virtual org +virtual report + + +@ depends on context && !patch && !org && !report@ +expression x; +@@ + +* ERR_PTR(PTR_ERR(x)) + +@ depends on !context && patch && !org && !report @ +expression x; +@@ + +- ERR_PTR(PTR_ERR(x)) ++ ERR_CAST(x) + +@r depends on !context && !patch && (org || report)@ +expression x; +position p; +@@ + + ERR_PTR@p(PTR_ERR(x)) + +@script:python depends on org@ +p << r.p; +x << r.x; +@@ + +msg="WARNING ERR_CAST can be used with %s" % (x) +msg_safe=msg.replace("[","@(").replace("]",")") +coccilib.org.print_todo(p[0], msg_safe) + +@script:python depends on report@ +p << r.p; +x << r.x; +@@ + +msg="WARNING: ERR_CAST can be used with %s" % (x) +coccilib.report.print_report(p[0], msg) diff --git a/src/net/scripts/coccinelle/api/kfree_mismatch.cocci b/src/net/scripts/coccinelle/api/kfree_mismatch.cocci new file mode 100644 index 0000000..d46a9b3 --- /dev/null +++ b/src/net/scripts/coccinelle/api/kfree_mismatch.cocci @@ -0,0 +1,228 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// +/// Check that kvmalloc'ed memory is freed by kfree functions, +/// vmalloc'ed by vfree functions and kvmalloc'ed by kvfree +/// functions. +/// +// Confidence: High +// Copyright: (C) 2020 Denis Efremov ISPRAS +// Options: --no-includes --include-headers +// + +virtual patch +virtual report +virtual org +virtual context + +@alloc@ +expression E, E1; +position kok, vok; +@@ + +( + if (...) { + ... + E = \(kmalloc\|kzalloc\|krealloc\|kcalloc\| + kmalloc_node\|kzalloc_node\|kmalloc_array\| + kmalloc_array_node\|kcalloc_node\)(...)@kok + ... + } else { + ... + E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\| + vzalloc_node\|vmalloc_exec\|vmalloc_32\| + vmalloc_32_user\|__vmalloc\|__vmalloc_node_range\| + __vmalloc_node\)(...)@vok + ... + } +| + E = \(kmalloc\|kzalloc\|krealloc\|kcalloc\|kmalloc_node\|kzalloc_node\| + kmalloc_array\|kmalloc_array_node\|kcalloc_node\)(...)@kok + ... when != E = E1 + when any + if (E == NULL) { + ... + E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\| + vzalloc_node\|vmalloc_exec\|vmalloc_32\| + vmalloc_32_user\|__vmalloc\|__vmalloc_node_range\| + __vmalloc_node\)(...)@vok + ... + } +) + +@free@ +expression E; +position fok; +@@ + + E = \(kvmalloc\|kvzalloc\|kvcalloc\|kvzalloc_node\|kvmalloc_node\| + kvmalloc_array\)(...) + ... + kvfree(E)@fok + +@vfree depends on !patch@ +expression E; +position a != alloc.kok; +position f != free.fok; +@@ + +* E = \(kmalloc\|kzalloc\|krealloc\|kcalloc\|kmalloc_node\| +* kzalloc_node\|kmalloc_array\|kmalloc_array_node\| +* kcalloc_node\)(...)@a + ... when != if (...) { ... E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|vzalloc_node\|vmalloc_exec\|vmalloc_32\|vmalloc_32_user\|__vmalloc\|__vmalloc_node_range\|__vmalloc_node\)(...); ... } + when != is_vmalloc_addr(E) + when any +* \(vfree\|vfree_atomic\|kvfree\)(E)@f + +@depends on patch exists@ +expression E; +position a != alloc.kok; +position f != free.fok; +@@ + + E = \(kmalloc\|kzalloc\|krealloc\|kcalloc\|kmalloc_node\| + kzalloc_node\|kmalloc_array\|kmalloc_array_node\| + kcalloc_node\)(...)@a + ... when != if (...) { ... E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|vzalloc_node\|vmalloc_exec\|vmalloc_32\|vmalloc_32_user\|__vmalloc\|__vmalloc_node_range\|__vmalloc_node\)(...); ... } + when != is_vmalloc_addr(E) + when any +- \(vfree\|vfree_atomic\|kvfree\)(E)@f ++ kfree(E) + +@kfree depends on !patch@ +expression E; +position a != alloc.vok; +position f != free.fok; +@@ + +* E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|vzalloc_node\| +* vmalloc_exec\|vmalloc_32\|vmalloc_32_user\|__vmalloc\| +* __vmalloc_node_range\|__vmalloc_node\)(...)@a + ... when != is_vmalloc_addr(E) + when any +* \(kfree\|kfree_sensitive\|kvfree\)(E)@f + +@depends on patch exists@ +expression E; +position a != alloc.vok; +position f != free.fok; +@@ + + E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|vzalloc_node\| + vmalloc_exec\|vmalloc_32\|vmalloc_32_user\|__vmalloc\| + __vmalloc_node_range\|__vmalloc_node\)(...)@a + ... when != is_vmalloc_addr(E) + when any +- \(kfree\|kvfree\)(E)@f ++ vfree(E) + +@kvfree depends on !patch@ +expression E; +position a, f; +@@ + +* E = \(kvmalloc\|kvzalloc\|kvcalloc\|kvzalloc_node\|kvmalloc_node\| +* kvmalloc_array\)(...)@a + ... when != is_vmalloc_addr(E) + when any +* \(kfree\|kfree_sensitive\|vfree\|vfree_atomic\)(E)@f + +@depends on patch exists@ +expression E; +@@ + + E = \(kvmalloc\|kvzalloc\|kvcalloc\|kvzalloc_node\|kvmalloc_node\| + kvmalloc_array\)(...) + ... when != is_vmalloc_addr(E) + when any +- \(kfree\|vfree\)(E) ++ kvfree(E) + +@kvfree_switch depends on !patch@ +expression alloc.E; +position f; +@@ + + ... when != is_vmalloc_addr(E) + when any +* \(kfree\|kfree_sensitive\|vfree\|vfree_atomic\)(E)@f + +@depends on patch exists@ +expression alloc.E; +position f; +@@ + + ... when != is_vmalloc_addr(E) + when any +( +- \(kfree\|vfree\)(E)@f ++ kvfree(E) +| +- kfree_sensitive(E)@f ++ kvfree_sensitive(E) +) + +@script: python depends on report@ +a << vfree.a; +f << vfree.f; +@@ + +msg = "WARNING kmalloc is used to allocate this memory at line %s" % (a[0].line) +coccilib.report.print_report(f[0], msg) + +@script: python depends on org@ +a << vfree.a; +f << vfree.f; +@@ + +msg = "WARNING kmalloc is used to allocate this memory at line %s" % (a[0].line) +coccilib.org.print_todo(f[0], msg) + +@script: python depends on report@ +a << kfree.a; +f << kfree.f; +@@ + +msg = "WARNING vmalloc is used to allocate this memory at line %s" % (a[0].line) +coccilib.report.print_report(f[0], msg) + +@script: python depends on org@ +a << kfree.a; +f << kfree.f; +@@ + +msg = "WARNING vmalloc is used to allocate this memory at line %s" % (a[0].line) +coccilib.org.print_todo(f[0], msg) + +@script: python depends on report@ +a << kvfree.a; +f << kvfree.f; +@@ + +msg = "WARNING kvmalloc is used to allocate this memory at line %s" % (a[0].line) +coccilib.report.print_report(f[0], msg) + +@script: python depends on org@ +a << kvfree.a; +f << kvfree.f; +@@ + +msg = "WARNING kvmalloc is used to allocate this memory at line %s" % (a[0].line) +coccilib.org.print_todo(f[0], msg) + +@script: python depends on report@ +ka << alloc.kok; +va << alloc.vok; +f << kvfree_switch.f; +@@ + +msg = "WARNING kmalloc (line %s) && vmalloc (line %s) are used to allocate this memory" % (ka[0].line, va[0].line) +coccilib.report.print_report(f[0], msg) + +@script: python depends on org@ +ka << alloc.kok; +va << alloc.vok; +f << kvfree_switch.f; +@@ + +msg = "WARNING kmalloc (line %s) && vmalloc (line %s) are used to allocate this memory" % (ka[0].line, va[0].line) +coccilib.org.print_todo(f[0], msg) diff --git a/src/net/scripts/coccinelle/api/kfree_sensitive.cocci b/src/net/scripts/coccinelle/api/kfree_sensitive.cocci new file mode 100644 index 0000000..8d980eb --- /dev/null +++ b/src/net/scripts/coccinelle/api/kfree_sensitive.cocci @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// +/// Use kfree_sensitive, kvfree_sensitive rather than memset or +/// memzero_explicit followed by kfree. +/// +// Confidence: High +// Copyright: (C) 2020 Denis Efremov ISPRAS +// Options: --no-includes --include-headers +// +// Keywords: kfree_sensitive, kvfree_sensitive +// + +virtual context +virtual patch +virtual org +virtual report + +@initialize:python@ +@@ +# kmalloc_oob_in_memset uses memset to explicitly trigger out-of-bounds access +filter = frozenset(['kmalloc_oob_in_memset', + 'kfree_sensitive', 'kvfree_sensitive']) + +def relevant(p): + return not (filter & {el.current_element for el in p}) + +@cond@ +position ok; +@@ + +if (...) + \(memset@ok\|memzero_explicit@ok\)(...); + +@r depends on !patch forall@ +expression E; +position p : script:python() { relevant(p) }; +position m != cond.ok; +type T; +@@ + +( +* memset@m((T)E, 0, ...); +| +* memzero_explicit@m((T)E, ...); +) + ... when != E + when strict +* \(kfree\|vfree\|kvfree\)(E)@p; + +@rp_memzero depends on patch@ +expression E, size; +position p : script:python() { relevant(p) }; +position m != cond.ok; +type T; +@@ + +- memzero_explicit@m((T)E, size); + ... when != E + when strict +( +- kfree(E)@p; ++ kfree_sensitive(E); +| +- \(vfree\|kvfree\)(E)@p; ++ kvfree_sensitive(E, size); +) + +@rp_memset depends on patch@ +expression E, size; +position p : script:python() { relevant(p) }; +position m != cond.ok; +type T; +@@ + +- memset@m((T)E, 0, size); + ... when != E + when strict +( +- kfree(E)@p; ++ kfree_sensitive(E); +| +- \(vfree\|kvfree\)(E)@p; ++ kvfree_sensitive(E, size); +) + +@script:python depends on report@ +p << r.p; +m << r.m; +@@ + +msg = "WARNING opportunity for kfree_sensitive/kvfree_sensitive (memset at line %s)" +coccilib.report.print_report(p[0], msg % (m[0].line)) + +@script:python depends on org@ +p << r.p; +m << r.m; +@@ + +msg = "WARNING opportunity for kfree_sensitive/kvfree_sensitive (memset at line %s)" +coccilib.org.print_todo(p[0], msg % (m[0].line)) diff --git a/src/net/scripts/coccinelle/api/kobj_to_dev.cocci b/src/net/scripts/coccinelle/api/kobj_to_dev.cocci new file mode 100644 index 0000000..cd5d31c --- /dev/null +++ b/src/net/scripts/coccinelle/api/kobj_to_dev.cocci @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// +/// Use kobj_to_dev() instead of container_of() +/// +// Confidence: High +// Copyright: (C) 2020 Denis Efremov ISPRAS +// Options: --no-includes --include-headers +// +// Keywords: kobj_to_dev, container_of +// + +virtual context +virtual report +virtual org +virtual patch + + +@r depends on !patch@ +expression ptr; +symbol kobj; +position p; +@@ + +* container_of(ptr, struct device, kobj)@p + + +@depends on patch@ +expression ptr; +@@ + +- container_of(ptr, struct device, kobj) ++ kobj_to_dev(ptr) + + +@script:python depends on report@ +p << r.p; +@@ + +coccilib.report.print_report(p[0], "WARNING opportunity for kobj_to_dev()") + +@script:python depends on org@ +p << r.p; +@@ + +coccilib.org.print_todo(p[0], "WARNING opportunity for kobj_to_dev()") diff --git a/src/net/scripts/coccinelle/api/kstrdup.cocci b/src/net/scripts/coccinelle/api/kstrdup.cocci new file mode 100644 index 0000000..3c6dc54 --- /dev/null +++ b/src/net/scripts/coccinelle/api/kstrdup.cocci @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Use kstrdup rather than duplicating its implementation +/// +// Confidence: High +// Copyright: (C) 2010-2012 Nicolas Palix. +// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. +// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual patch +virtual context +virtual org +virtual report + +@depends on patch@ +expression from,to; +expression flag,E1,E2; +statement S; +@@ + +- to = kmalloc(strlen(from) + 1,flag); ++ to = kstrdup(from, flag); + ... when != \(from = E1 \| to = E1 \) + if (to==NULL || ...) S + ... when != \(from = E2 \| to = E2 \) +- strcpy(to, from); + +@depends on patch@ +expression x,from,to; +expression flag,E1,E2,E3; +statement S; +@@ + +- x = strlen(from) + 1; + ... when != \( x = E1 \| from = E1 \) +- to = \(kmalloc\|kzalloc\)(x,flag); ++ to = kstrdup(from, flag); + ... when != \(x = E2 \| from = E2 \| to = E2 \) + if (to==NULL || ...) S + ... when != \(x = E3 \| from = E3 \| to = E3 \) +- memcpy(to, from, x); + +// --------------------------------------------------------------------- + +@r1 depends on !patch exists@ +expression from,to; +expression flag,E1,E2; +statement S; +position p1,p2; +@@ + +* to = kmalloc@p1(strlen(from) + 1,flag); + ... when != \(from = E1 \| to = E1 \) + if (to==NULL || ...) S + ... when != \(from = E2 \| to = E2 \) +* strcpy@p2(to, from); + +@r2 depends on !patch exists@ +expression x,from,to; +expression flag,E1,E2,E3; +statement S; +position p1,p2; +@@ + +* x = strlen(from) + 1; + ... when != \( x = E1 \| from = E1 \) +* to = \(kmalloc@p1\|kzalloc@p1\)(x,flag); + ... when != \(x = E2 \| from = E2 \| to = E2 \) + if (to==NULL || ...) S + ... when != \(x = E3 \| from = E3 \| to = E3 \) +* memcpy@p2(to, from, x); + +@script:python depends on org@ +p1 << r1.p1; +p2 << r1.p2; +@@ + +cocci.print_main("WARNING opportunity for kstrdup",p1) +cocci.print_secs("strcpy",p2) + +@script:python depends on org@ +p1 << r2.p1; +p2 << r2.p2; +@@ + +cocci.print_main("WARNING opportunity for kstrdup",p1) +cocci.print_secs("memcpy",p2) + +@script:python depends on report@ +p1 << r1.p1; +p2 << r1.p2; +@@ + +msg = "WARNING opportunity for kstrdup (strcpy on line %s)" % (p2[0].line) +coccilib.report.print_report(p1[0], msg) + +@script:python depends on report@ +p1 << r2.p1; +p2 << r2.p2; +@@ + +msg = "WARNING opportunity for kstrdup (memcpy on line %s)" % (p2[0].line) +coccilib.report.print_report(p1[0], msg) diff --git a/src/net/scripts/coccinelle/api/kvmalloc.cocci b/src/net/scripts/coccinelle/api/kvmalloc.cocci new file mode 100644 index 0000000..c30dab7 --- /dev/null +++ b/src/net/scripts/coccinelle/api/kvmalloc.cocci @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// +/// Find if/else condition with kmalloc/vmalloc calls. +/// Suggest to use kvmalloc instead. Same for kvfree. +/// +// Confidence: High +// Copyright: (C) 2020 Denis Efremov ISPRAS +// Options: --no-includes --include-headers +// + +virtual patch +virtual report +virtual org +virtual context + +@initialize:python@ +@@ +filter = frozenset(['kvfree']) + +def relevant(p): + return not (filter & {el.current_element for el in p}) + +@kvmalloc depends on !patch@ +expression E, E1, size; +identifier flags; +binary operator cmp = {<=, <, ==, >, >=}; +identifier x; +type T; +position p; +@@ + +( +* if (size cmp E1 || ...)@p { + ... +* E = \(kmalloc\|kzalloc\|kcalloc\|kmalloc_node\|kzalloc_node\| +* kmalloc_array\|kmalloc_array_node\|kcalloc_node\) +* (..., size, \(flags\|GFP_KERNEL\|\(GFP_KERNEL\|flags\)|__GFP_NOWARN\), ...) + ... + } else { + ... +* E = \(vmalloc\|vzalloc\|vmalloc_node\|vzalloc_node\)(..., size, ...) + ... + } +| +* E = \(kmalloc\|kzalloc\|kcalloc\|kmalloc_node\|kzalloc_node\| +* kmalloc_array\|kmalloc_array_node\|kcalloc_node\) +* (..., size, \(flags\|GFP_KERNEL\|\(GFP_KERNEL\|flags\)|__GFP_NOWARN\), ...) + ... when != E = E1 + when != size = E1 + when any +* if (E == NULL)@p { + ... +* E = \(vmalloc\|vzalloc\|vmalloc_node\|vzalloc_node\)(..., size, ...) + ... + } +| +* T x = \(kmalloc\|kzalloc\|kcalloc\|kmalloc_node\|kzalloc_node\| +* kmalloc_array\|kmalloc_array_node\|kcalloc_node\) +* (..., size, \(flags\|GFP_KERNEL\|\(GFP_KERNEL\|flags\)|__GFP_NOWARN\), ...); + ... when != x = E1 + when != size = E1 + when any +* if (x == NULL)@p { + ... +* x = \(vmalloc\|vzalloc\|vmalloc_node\|vzalloc_node\)(..., size, ...) + ... + } +) + +@kvfree depends on !patch@ +expression E; +position p : script:python() { relevant(p) }; +@@ + +* if (is_vmalloc_addr(E))@p { + ... +* vfree(E) + ... + } else { + ... when != krealloc(E, ...) + when any +* \(kfree\|kzfree\)(E) + ... + } + +@depends on patch@ +expression E, E1, size, node; +binary operator cmp = {<=, <, ==, >, >=}; +identifier flags, x; +type T; +@@ + +( +- if (size cmp E1) +- E = kmalloc(size, flags); +- else +- E = vmalloc(size); ++ E = kvmalloc(size, flags); +| +- if (size cmp E1) +- E = kmalloc(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\)); +- else +- E = vmalloc(size); ++ E = kvmalloc(size, GFP_KERNEL); +| +- E = kmalloc(size, flags | __GFP_NOWARN); +- if (E == NULL) +- E = vmalloc(size); ++ E = kvmalloc(size, flags); +| +- E = kmalloc(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\)); +- if (E == NULL) +- E = vmalloc(size); ++ E = kvmalloc(size, GFP_KERNEL); +| +- T x = kmalloc(size, flags | __GFP_NOWARN); +- if (x == NULL) +- x = vmalloc(size); ++ T x = kvmalloc(size, flags); +| +- T x = kmalloc(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\)); +- if (x == NULL) +- x = vmalloc(size); ++ T x = kvmalloc(size, GFP_KERNEL); +| +- if (size cmp E1) +- E = kzalloc(size, flags); +- else +- E = vzalloc(size); ++ E = kvzalloc(size, flags); +| +- if (size cmp E1) +- E = kzalloc(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\)); +- else +- E = vzalloc(size); ++ E = kvzalloc(size, GFP_KERNEL); +| +- E = kzalloc(size, flags | __GFP_NOWARN); +- if (E == NULL) +- E = vzalloc(size); ++ E = kvzalloc(size, flags); +| +- E = kzalloc(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\)); +- if (E == NULL) +- E = vzalloc(size); ++ E = kvzalloc(size, GFP_KERNEL); +| +- T x = kzalloc(size, flags | __GFP_NOWARN); +- if (x == NULL) +- x = vzalloc(size); ++ T x = kvzalloc(size, flags); +| +- T x = kzalloc(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\)); +- if (x == NULL) +- x = vzalloc(size); ++ T x = kvzalloc(size, GFP_KERNEL); +| +- if (size cmp E1) +- E = kmalloc_node(size, flags, node); +- else +- E = vmalloc_node(size, node); ++ E = kvmalloc_node(size, flags, node); +| +- if (size cmp E1) +- E = kmalloc_node(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\), node); +- else +- E = vmalloc_node(size, node); ++ E = kvmalloc_node(size, GFP_KERNEL, node); +| +- E = kmalloc_node(size, flags | __GFP_NOWARN, node); +- if (E == NULL) +- E = vmalloc_node(size, node); ++ E = kvmalloc_node(size, flags, node); +| +- E = kmalloc_node(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\), node); +- if (E == NULL) +- E = vmalloc_node(size, node); ++ E = kvmalloc_node(size, GFP_KERNEL, node); +| +- T x = kmalloc_node(size, flags | __GFP_NOWARN, node); +- if (x == NULL) +- x = vmalloc_node(size, node); ++ T x = kvmalloc_node(size, flags, node); +| +- T x = kmalloc_node(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\), node); +- if (x == NULL) +- x = vmalloc_node(size, node); ++ T x = kvmalloc_node(size, GFP_KERNEL, node); +| +- if (size cmp E1) +- E = kvzalloc_node(size, flags, node); +- else +- E = vzalloc_node(size, node); ++ E = kvzalloc_node(size, flags, node); +| +- if (size cmp E1) +- E = kvzalloc_node(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\), node); +- else +- E = vzalloc_node(size, node); ++ E = kvzalloc_node(size, GFP_KERNEL, node); +| +- E = kvzalloc_node(size, flags | __GFP_NOWARN, node); +- if (E == NULL) +- E = vzalloc_node(size, node); ++ E = kvzalloc_node(size, flags, node); +| +- E = kvzalloc_node(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\), node); +- if (E == NULL) +- E = vzalloc_node(size, node); ++ E = kvzalloc_node(size, GFP_KERNEL, node); +| +- T x = kvzalloc_node(size, flags | __GFP_NOWARN, node); +- if (x == NULL) +- x = vzalloc_node(size, node); ++ T x = kvzalloc_node(size, flags, node); +| +- T x = kvzalloc_node(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\), node); +- if (x == NULL) +- x = vzalloc_node(size, node); ++ T x = kvzalloc_node(size, GFP_KERNEL, node); +) + +@depends on patch@ +expression E; +position p : script:python() { relevant(p) }; +@@ + +- if (is_vmalloc_addr(E))@p +- vfree(E); +- else +- kfree(E); ++ kvfree(E); + +@script: python depends on report@ +p << kvmalloc.p; +@@ + +coccilib.report.print_report(p[0], "WARNING opportunity for kvmalloc") + +@script: python depends on org@ +p << kvmalloc.p; +@@ + +coccilib.org.print_todo(p[0], "WARNING opportunity for kvmalloc") + +@script: python depends on report@ +p << kvfree.p; +@@ + +coccilib.report.print_report(p[0], "WARNING opportunity for kvfree") + +@script: python depends on org@ +p << kvfree.p; +@@ + +coccilib.org.print_todo(p[0], "WARNING opportunity for kvfree") diff --git a/src/net/scripts/coccinelle/api/memdup.cocci b/src/net/scripts/coccinelle/api/memdup.cocci new file mode 100644 index 0000000..30b15df --- /dev/null +++ b/src/net/scripts/coccinelle/api/memdup.cocci @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Use kmemdup rather than duplicating its implementation +/// +// Confidence: High +// Copyright: (C) 2010-2012 Nicolas Palix. +// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. +// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual patch +virtual context +virtual org +virtual report + +@r1@ +expression from,to; +expression flag; +position p; +@@ + + to = \(kmalloc@p\|kzalloc@p\)(strlen(from) + 1,flag); + +@r2@ +expression x,from,to; +expression flag,E1; +position p; +@@ + + x = strlen(from) + 1; + ... when != \( x = E1 \| from = E1 \) + to = \(kmalloc@p\|kzalloc@p\)(x,flag); + +@depends on patch@ +expression from,to,size,flag; +position p != {r1.p,r2.p}; +statement S; +@@ + +- to = \(kmalloc@p\|kzalloc@p\)(size,flag); ++ to = kmemdup(from,size,flag); + if (to==NULL || ...) S +- memcpy(to, from, size); + +@r depends on !patch@ +expression from,to,size,flag; +position p != {r1.p,r2.p}; +statement S; +@@ + +* to = \(kmalloc@p\|kzalloc@p\)(size,flag); + if (to==NULL || ...) S +* memcpy(to, from, size); + +@script:python depends on org@ +p << r.p; +@@ + +coccilib.org.print_todo(p[0], "WARNING opportunity for kmemdup") + +@script:python depends on report@ +p << r.p; +@@ + +coccilib.report.print_report(p[0], "WARNING opportunity for kmemdup") diff --git a/src/net/scripts/coccinelle/api/memdup_user.cocci b/src/net/scripts/coccinelle/api/memdup_user.cocci new file mode 100644 index 0000000..e01e951 --- /dev/null +++ b/src/net/scripts/coccinelle/api/memdup_user.cocci @@ -0,0 +1,119 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Use memdup_user rather than duplicating its implementation +/// This is a little bit restricted to reduce false positives +/// +// Confidence: High +// Copyright: (C) 2010-2012 Nicolas Palix. +// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. +// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual patch +virtual context +virtual org +virtual report + +@initialize:python@ +@@ +filter = frozenset(['memdup_user', 'vmemdup_user']) + +def relevant(p): + return not (filter & {el.current_element for el in p}) + +@depends on patch@ +expression from,to,size; +identifier l1,l2; +position p : script:python() { relevant(p) }; +@@ + +- to = \(kmalloc@p\|kzalloc@p\) +- (size,\(GFP_KERNEL\|GFP_USER\| +- \(GFP_KERNEL\|GFP_USER\)|__GFP_NOWARN\)); ++ to = memdup_user(from,size); + if ( +- to==NULL ++ IS_ERR(to) + || ...) { + <+... when != goto l1; +- -ENOMEM ++ PTR_ERR(to) + ...+> + } +- if (copy_from_user(to, from, size) != 0) { +- <+... when != goto l2; +- -EFAULT +- ...+> +- } + +@depends on patch@ +expression from,to,size; +identifier l1,l2; +position p : script:python() { relevant(p) }; +@@ + +- to = \(kvmalloc@p\|kvzalloc@p\)(size,\(GFP_KERNEL\|GFP_USER\)); ++ to = vmemdup_user(from,size); + if ( +- to==NULL ++ IS_ERR(to) + || ...) { + <+... when != goto l1; +- -ENOMEM ++ PTR_ERR(to) + ...+> + } +- if (copy_from_user(to, from, size) != 0) { +- <+... when != goto l2; +- -EFAULT +- ...+> +- } + +@r depends on !patch@ +expression from,to,size; +position p : script:python() { relevant(p) }; +statement S1,S2; +@@ + +* to = \(kmalloc@p\|kzalloc@p\) + (size,\(GFP_KERNEL\|GFP_USER\| + \(GFP_KERNEL\|GFP_USER\)|__GFP_NOWARN\)); + if (to==NULL || ...) S1 + if (copy_from_user(to, from, size) != 0) + S2 + +@rv depends on !patch@ +expression from,to,size; +position p : script:python() { relevant(p) }; +statement S1,S2; +@@ + +* to = \(kvmalloc@p\|kvzalloc@p\)(size,\(GFP_KERNEL\|GFP_USER\)); + if (to==NULL || ...) S1 + if (copy_from_user(to, from, size) != 0) + S2 + +@script:python depends on org@ +p << r.p; +@@ + +coccilib.org.print_todo(p[0], "WARNING opportunity for memdup_user") + +@script:python depends on report@ +p << r.p; +@@ + +coccilib.report.print_report(p[0], "WARNING opportunity for memdup_user") + +@script:python depends on org@ +p << rv.p; +@@ + +coccilib.org.print_todo(p[0], "WARNING opportunity for vmemdup_user") + +@script:python depends on report@ +p << rv.p; +@@ + +coccilib.report.print_report(p[0], "WARNING opportunity for vmemdup_user") diff --git a/src/net/scripts/coccinelle/api/platform_get_irq.cocci b/src/net/scripts/coccinelle/api/platform_get_irq.cocci new file mode 100644 index 0000000..06b6a95 --- /dev/null +++ b/src/net/scripts/coccinelle/api/platform_get_irq.cocci @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: GPL-2.0 +/// Remove dev_err() messages after platform_get_irq*() failures +// +// Confidence: Medium +// Options: --include-headers + +virtual patch +virtual context +virtual org +virtual report + +@depends on context@ +expression ret; +struct platform_device *E; +@@ + +ret = +( +platform_get_irq +| +platform_get_irq_byname +)(E, ...); + +if ( \( ret < 0 \| ret <= 0 \) ) +{ +( +if (ret != -EPROBE_DEFER) +{ ... +*dev_err(...); +... } +| +... +*dev_err(...); +) +... +} + +@depends on patch@ +expression ret; +struct platform_device *E; +@@ + +ret = +( +platform_get_irq +| +platform_get_irq_byname +)(E, ...); + +if ( \( ret < 0 \| ret <= 0 \) ) +{ +( +-if (ret != -EPROBE_DEFER) +-{ ... +-dev_err(...); +-... } +| +... +-dev_err(...); +) +... +} + +@r depends on org || report@ +position p1; +expression ret; +struct platform_device *E; +@@ + +ret = +( +platform_get_irq +| +platform_get_irq_byname +)(E, ...); + +if ( \( ret < 0 \| ret <= 0 \) ) +{ +( +if (ret != -EPROBE_DEFER) +{ ... +dev_err@p1(...); +... } +| +... +dev_err@p1(...); +) +... +} + +@script:python depends on org@ +p1 << r.p1; +@@ + +cocci.print_main(p1) + +@script:python depends on report@ +p1 << r.p1; +@@ + +msg = "line %s is redundant because platform_get_irq() already prints an error" % (p1[0].line) +coccilib.report.print_report(p1[0],msg) diff --git a/src/net/scripts/coccinelle/api/platform_no_drv_owner.cocci b/src/net/scripts/coccinelle/api/platform_no_drv_owner.cocci new file mode 100644 index 0000000..8fa050e --- /dev/null +++ b/src/net/scripts/coccinelle/api/platform_no_drv_owner.cocci @@ -0,0 +1,180 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Remove .owner field if calls are used which set it automatically +/// +// Confidence: High +// Copyright: (C) 2014 Wolfram Sang. + +virtual patch +virtual context +virtual org +virtual report + +@match1@ +declarer name module_i2c_driver; +declarer name module_platform_driver; +declarer name module_platform_driver_probe; +identifier __driver; +@@ +( + module_i2c_driver(__driver); +| + module_platform_driver(__driver); +| + module_platform_driver_probe(__driver, ...); +) + +@fix1 depends on match1 && patch && !context && !org && !report@ +identifier match1.__driver; +@@ + static struct platform_driver __driver = { + .driver = { +- .owner = THIS_MODULE, + } + }; + +@fix1_i2c depends on match1 && patch && !context && !org && !report@ +identifier match1.__driver; +@@ + static struct i2c_driver __driver = { + .driver = { +- .owner = THIS_MODULE, + } + }; + +@match2@ +identifier __driver; +@@ +( + platform_driver_register(&__driver) +| + platform_driver_probe(&__driver, ...) +| + platform_create_bundle(&__driver, ...) +| + i2c_add_driver(&__driver) +) + +@fix2 depends on match2 && patch && !context && !org && !report@ +identifier match2.__driver; +@@ + static struct platform_driver __driver = { + .driver = { +- .owner = THIS_MODULE, + } + }; + +@fix2_i2c depends on match2 && patch && !context && !org && !report@ +identifier match2.__driver; +@@ + static struct i2c_driver __driver = { + .driver = { +- .owner = THIS_MODULE, + } + }; + +// ---------------------------------------------------------------------------- + +@fix1_context depends on match1 && !patch && (context || org || report)@ +identifier match1.__driver; +position j0; +@@ + + static struct platform_driver __driver = { + .driver = { +* .owner@j0 = THIS_MODULE, + } + }; + +@fix1_i2c_context depends on match1 && !patch && (context || org || report)@ +identifier match1.__driver; +position j0; +@@ + + static struct i2c_driver __driver = { + .driver = { +* .owner@j0 = THIS_MODULE, + } + }; + +@fix2_context depends on match2 && !patch && (context || org || report)@ +identifier match2.__driver; +position j0; +@@ + + static struct platform_driver __driver = { + .driver = { +* .owner@j0 = THIS_MODULE, + } + }; + +@fix2_i2c_context depends on match2 && !patch && (context || org || report)@ +identifier match2.__driver; +position j0; +@@ + + static struct i2c_driver __driver = { + .driver = { +* .owner@j0 = THIS_MODULE, + } + }; + +// ---------------------------------------------------------------------------- + +@script:python fix1_org depends on org@ +j0 << fix1_context.j0; +@@ + +msg = "No need to set .owner here. The core will do it." +coccilib.org.print_todo(j0[0], msg) + +@script:python fix1_i2c_org depends on org@ +j0 << fix1_i2c_context.j0; +@@ + +msg = "No need to set .owner here. The core will do it." +coccilib.org.print_todo(j0[0], msg) + +@script:python fix2_org depends on org@ +j0 << fix2_context.j0; +@@ + +msg = "No need to set .owner here. The core will do it." +coccilib.org.print_todo(j0[0], msg) + +@script:python fix2_i2c_org depends on org@ +j0 << fix2_i2c_context.j0; +@@ + +msg = "No need to set .owner here. The core will do it." +coccilib.org.print_todo(j0[0], msg) + +// ---------------------------------------------------------------------------- + +@script:python fix1_report depends on report@ +j0 << fix1_context.j0; +@@ + +msg = "No need to set .owner here. The core will do it." +coccilib.report.print_report(j0[0], msg) + +@script:python fix1_i2c_report depends on report@ +j0 << fix1_i2c_context.j0; +@@ + +msg = "No need to set .owner here. The core will do it." +coccilib.report.print_report(j0[0], msg) + +@script:python fix2_report depends on report@ +j0 << fix2_context.j0; +@@ + +msg = "No need to set .owner here. The core will do it." +coccilib.report.print_report(j0[0], msg) + +@script:python fix2_i2c_report depends on report@ +j0 << fix2_i2c_context.j0; +@@ + +msg = "No need to set .owner here. The core will do it." +coccilib.report.print_report(j0[0], msg) + diff --git a/src/net/scripts/coccinelle/api/pm_runtime.cocci b/src/net/scripts/coccinelle/api/pm_runtime.cocci new file mode 100644 index 0000000..1ccce3f --- /dev/null +++ b/src/net/scripts/coccinelle/api/pm_runtime.cocci @@ -0,0 +1,114 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Make sure pm_runtime_* calls does not use unnecessary IS_ERR_VALUE +/// +// Keywords: pm_runtime +// Confidence: Medium +// Copyright (C) 2013 Texas Instruments Incorporated - +// URL: http://coccinelle.lip6.fr/ +// Options: --include-headers + +virtual patch +virtual context +virtual org +virtual report + +//---------------------------------------------------------- +// Detection +//---------------------------------------------------------- + +@runtime_bad_err_handle exists@ +expression ret; +position p; +@@ +( +ret@p = \(pm_runtime_idle\| + pm_runtime_suspend\| + pm_runtime_autosuspend\| + pm_runtime_resume\| + pm_request_idle\| + pm_request_resume\| + pm_request_autosuspend\| + pm_runtime_get\| + pm_runtime_get_sync\| + pm_runtime_put\| + pm_runtime_put_autosuspend\| + pm_runtime_put_sync\| + pm_runtime_put_sync_suspend\| + pm_runtime_put_sync_autosuspend\| + pm_runtime_set_active\| + pm_schedule_suspend\| + pm_runtime_barrier\| + pm_generic_runtime_suspend\| + pm_generic_runtime_resume\)(...); +... +IS_ERR_VALUE(ret) +... +) + +//---------------------------------------------------------- +// For context mode +//---------------------------------------------------------- + +@depends on context@ +identifier pm_runtime_api; +expression ret; +position runtime_bad_err_handle.p; +@@ +( +ret@p = pm_runtime_api(...); +... +* IS_ERR_VALUE(ret) +... +) + +//---------------------------------------------------------- +// For patch mode +//---------------------------------------------------------- + +@depends on patch@ +identifier pm_runtime_api; +expression ret; +position runtime_bad_err_handle.p; +@@ +( +ret@p = pm_runtime_api(...); +... +- IS_ERR_VALUE(ret) ++ ret < 0 +... +) + +//---------------------------------------------------------- +// For org and report mode +//---------------------------------------------------------- + +@r depends on (org || report) exists@ +position p1, p2; +identifier pm_runtime_api; +expression ret; +position runtime_bad_err_handle.p; +@@ +( +ret@p = pm_runtime_api@p1(...); +... +IS_ERR_VALUE@p2(ret) +... +) + +@script:python depends on org@ +p1 << r.p1; +p2 << r.p2; +pm_runtime_api << r.pm_runtime_api; +@@ + +cocci.print_main(pm_runtime_api,p1) +cocci.print_secs("IS_ERR_VALUE",p2) + +@script:python depends on report@ +p1 << r.p1; +p2 << r.p2; +pm_runtime_api << r.pm_runtime_api; +@@ + +msg = "%s returns < 0 as error. Unecessary IS_ERR_VALUE at line %s" % (pm_runtime_api, p2[0].line) +coccilib.report.print_report(p1[0],msg) diff --git a/src/net/scripts/coccinelle/api/ptr_ret.cocci b/src/net/scripts/coccinelle/api/ptr_ret.cocci new file mode 100644 index 0000000..e76cd5d --- /dev/null +++ b/src/net/scripts/coccinelle/api/ptr_ret.cocci @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// +/// Use PTR_ERR_OR_ZERO rather than if(IS_ERR(...)) + PTR_ERR +/// +// Confidence: High +// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. +// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Options: --no-includes --include-headers +// +// Keywords: ERR_PTR, PTR_ERR, PTR_ERR_OR_ZERO +// Version min: 2.6.39 +// + +virtual context +virtual patch +virtual org +virtual report + +@depends on patch@ +expression ptr; +@@ + +- if (IS_ERR(ptr)) return PTR_ERR(ptr); else return 0; ++ return PTR_ERR_OR_ZERO(ptr); + +@depends on patch@ +expression ptr; +@@ + +- if (IS_ERR(ptr)) return PTR_ERR(ptr); return 0; ++ return PTR_ERR_OR_ZERO(ptr); + +@depends on patch@ +expression ptr; +@@ + +- (IS_ERR(ptr) ? PTR_ERR(ptr) : 0) ++ PTR_ERR_OR_ZERO(ptr) + +@r1 depends on !patch@ +expression ptr; +position p1; +@@ + +* if@p1 (IS_ERR(ptr)) return PTR_ERR(ptr); else return 0; + +@r2 depends on !patch@ +expression ptr; +position p2; +@@ + +* if@p2 (IS_ERR(ptr)) return PTR_ERR(ptr); return 0; + +@r3 depends on !patch@ +expression ptr; +position p3; +@@ + +* IS_ERR@p3(ptr) ? PTR_ERR(ptr) : 0 + +@script:python depends on org@ +p << r1.p1; +@@ + +coccilib.org.print_todo(p[0], "WARNING: PTR_ERR_OR_ZERO can be used") + + +@script:python depends on org@ +p << r2.p2; +@@ + +coccilib.org.print_todo(p[0], "WARNING: PTR_ERR_OR_ZERO can be used") + +@script:python depends on org@ +p << r3.p3; +@@ + +coccilib.org.print_todo(p[0], "WARNING: PTR_ERR_OR_ZERO can be used") + +@script:python depends on report@ +p << r1.p1; +@@ + +coccilib.report.print_report(p[0], "WARNING: PTR_ERR_OR_ZERO can be used") + +@script:python depends on report@ +p << r2.p2; +@@ + +coccilib.report.print_report(p[0], "WARNING: PTR_ERR_OR_ZERO can be used") + +@script:python depends on report@ +p << r3.p3; +@@ + +coccilib.report.print_report(p[0], "WARNING: PTR_ERR_OR_ZERO can be used") diff --git a/src/net/scripts/coccinelle/api/resource_size.cocci b/src/net/scripts/coccinelle/api/resource_size.cocci new file mode 100644 index 0000000..a9a571a --- /dev/null +++ b/src/net/scripts/coccinelle/api/resource_size.cocci @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// +/// Use resource_size function on resource object +/// instead of explicit computation. +/// +// Confidence: High +// Copyright: (C) 2009, 2010 Nicolas Palix, DIKU. +// Copyright: (C) 2009, 2010 Julia Lawall, DIKU. +// Copyright: (C) 2009, 2010 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Options: +// +// Keywords: resource_size +// Version min: 2.6.27 resource_size +// + +virtual context +virtual patch +virtual org +virtual report + +//---------------------------------------------------------- +// For context mode +//---------------------------------------------------------- + +@r_context depends on context && !patch && !org@ +struct resource *res; +@@ + +* (res->end - res->start) + 1 + +//---------------------------------------------------------- +// For patch mode +//---------------------------------------------------------- + +@r_patch depends on !context && patch && !org@ +struct resource *res; +@@ + +- (res->end - res->start) + 1 ++ resource_size(res) + +//---------------------------------------------------------- +// For org mode +//---------------------------------------------------------- + + +@r_org depends on !context && !patch && (org || report)@ +struct resource *res; +position p; +@@ + + (res->end@p - res->start) + 1 + +@rbad_org depends on !context && !patch && (org || report)@ +struct resource *res; +position p != r_org.p; +@@ + + res->end@p - res->start + +@script:python depends on org@ +p << r_org.p; +x << r_org.res; +@@ + +msg="ERROR with %s" % (x) +msg_safe=msg.replace("[","@(").replace("]",")") +coccilib.org.print_todo(p[0], msg_safe) + +@script:python depends on report@ +p << r_org.p; +x << r_org.res; +@@ + +msg="ERROR: Missing resource_size with %s" % (x) +coccilib.report.print_report(p[0], msg) + +@script:python depends on org@ +p << rbad_org.p; +x << rbad_org.res; +@@ + +msg="WARNING with %s" % (x) +msg_safe=msg.replace("[","@(").replace("]",")") +coccilib.org.print_todo(p[0], msg_safe) + +@script:python depends on report@ +p << rbad_org.p; +x << rbad_org.res; +@@ + +msg="WARNING: Suspicious code. resource_size is maybe missing with %s" % (x) +coccilib.report.print_report(p[0], msg) diff --git a/src/net/scripts/coccinelle/api/simple_open.cocci b/src/net/scripts/coccinelle/api/simple_open.cocci new file mode 100644 index 0000000..c121876 --- /dev/null +++ b/src/net/scripts/coccinelle/api/simple_open.cocci @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: GPL-2.0 +/// Remove an open coded simple_open() function +/// and replace file operations references to the function +/// with simple_open() instead. +/// +// Confidence: High +// Comments: +// Options: --no-includes --include-headers + +virtual patch +virtual report + +@ open depends on patch @ +identifier open_f != simple_open; +identifier i, f; +@@ +-int open_f(struct inode *i, struct file *f) +-{ +( +-if (i->i_private) +-f->private_data = i->i_private; +| +-f->private_data = i->i_private; +) +-return 0; +-} + +@ has_open depends on open @ +identifier fops; +identifier open.open_f; +@@ +struct file_operations fops = { +..., +-.open = open_f, ++.open = simple_open, +... +}; + +@ openr depends on report @ +identifier open_f != simple_open; +identifier i, f; +position p; +@@ +int open_f@p(struct inode *i, struct file *f) +{ +( +if (i->i_private) +f->private_data = i->i_private; +| +f->private_data = i->i_private; +) +return 0; +} + +@ has_openr depends on openr @ +identifier fops; +identifier openr.open_f; +position p; +@@ +struct file_operations fops = { +..., +.open = open_f@p, +... +}; + +@script:python@ +pf << openr.p; +ps << has_openr.p; +@@ + +coccilib.report.print_report(pf[0],"WARNING opportunity for simple_open, see also structure on line %s"%(ps[0].line)) diff --git a/src/net/scripts/coccinelle/api/stream_open.cocci b/src/net/scripts/coccinelle/api/stream_open.cocci new file mode 100644 index 0000000..df00d66 --- /dev/null +++ b/src/net/scripts/coccinelle/api/stream_open.cocci @@ -0,0 +1,370 @@ +// SPDX-License-Identifier: GPL-2.0 +// Author: Kirill Smelkov (kirr@nexedi.com) +// +// Search for stream-like files that are using nonseekable_open and convert +// them to stream_open. A stream-like file is a file that does not use ppos in +// its read and write. Rationale for the conversion is to avoid deadlock in +// between read and write. + +virtual report +virtual patch +virtual explain // explain decisions in the patch (SPFLAGS="-D explain") + +// stream-like reader & writer - ones that do not depend on f_pos. +@ stream_reader @ +identifier readstream, ppos; +identifier f, buf, len; +type loff_t; +@@ + ssize_t readstream(struct file *f, char *buf, size_t len, loff_t *ppos) + { + ... when != ppos + } + +@ stream_writer @ +identifier writestream, ppos; +identifier f, buf, len; +type loff_t; +@@ + ssize_t writestream(struct file *f, const char *buf, size_t len, loff_t *ppos) + { + ... when != ppos + } + + +// a function that blocks +@ blocks @ +identifier block_f; +identifier wait =~ "^wait_.*"; +@@ + block_f(...) { + ... when exists + wait(...) + ... when exists + } + +// stream_reader that can block inside. +// +// XXX wait_* can be called not directly from current function (e.g. func -> f -> g -> wait()) +// XXX currently reader_blocks supports only direct and 1-level indirect cases. +@ reader_blocks_direct @ +identifier stream_reader.readstream; +identifier wait =~ "^wait_.*"; +@@ + readstream(...) + { + ... when exists + wait(...) + ... when exists + } + +@ reader_blocks_1 @ +identifier stream_reader.readstream; +identifier blocks.block_f; +@@ + readstream(...) + { + ... when exists + block_f(...) + ... when exists + } + +@ reader_blocks depends on reader_blocks_direct || reader_blocks_1 @ +identifier stream_reader.readstream; +@@ + readstream(...) { + ... + } + + +// file_operations + whether they have _any_ .read, .write, .llseek ... at all. +// +// XXX add support for file_operations xxx[N] = ... (sound/core/pcm_native.c) +@ fops0 @ +identifier fops; +@@ + struct file_operations fops = { + ... + }; + +@ has_read @ +identifier fops0.fops; +identifier read_f; +@@ + struct file_operations fops = { + .read = read_f, + }; + +@ has_read_iter @ +identifier fops0.fops; +identifier read_iter_f; +@@ + struct file_operations fops = { + .read_iter = read_iter_f, + }; + +@ has_write @ +identifier fops0.fops; +identifier write_f; +@@ + struct file_operations fops = { + .write = write_f, + }; + +@ has_write_iter @ +identifier fops0.fops; +identifier write_iter_f; +@@ + struct file_operations fops = { + .write_iter = write_iter_f, + }; + +@ has_llseek @ +identifier fops0.fops; +identifier llseek_f; +@@ + struct file_operations fops = { + .llseek = llseek_f, + }; + +@ has_no_llseek @ +identifier fops0.fops; +@@ + struct file_operations fops = { + .llseek = no_llseek, + }; + +@ has_noop_llseek @ +identifier fops0.fops; +@@ + struct file_operations fops = { + .llseek = noop_llseek, + }; + +@ has_mmap @ +identifier fops0.fops; +identifier mmap_f; +@@ + struct file_operations fops = { + .mmap = mmap_f, + }; + +@ has_copy_file_range @ +identifier fops0.fops; +identifier copy_file_range_f; +@@ + struct file_operations fops = { + .copy_file_range = copy_file_range_f, + }; + +@ has_remap_file_range @ +identifier fops0.fops; +identifier remap_file_range_f; +@@ + struct file_operations fops = { + .remap_file_range = remap_file_range_f, + }; + +@ has_splice_read @ +identifier fops0.fops; +identifier splice_read_f; +@@ + struct file_operations fops = { + .splice_read = splice_read_f, + }; + +@ has_splice_write @ +identifier fops0.fops; +identifier splice_write_f; +@@ + struct file_operations fops = { + .splice_write = splice_write_f, + }; + + +// file_operations that is candidate for stream_open conversion - it does not +// use mmap and other methods that assume @offset access to file. +// +// XXX for simplicity require no .{read/write}_iter and no .splice_{read/write} for now. +// XXX maybe_steam.fops cannot be used in other rules - it gives "bad rule maybe_stream or bad variable fops". +@ maybe_stream depends on (!has_llseek || has_no_llseek || has_noop_llseek) && !has_mmap && !has_copy_file_range && !has_remap_file_range && !has_read_iter && !has_write_iter && !has_splice_read && !has_splice_write @ +identifier fops0.fops; +@@ + struct file_operations fops = { + }; + + +// ---- conversions ---- + +// XXX .open = nonseekable_open -> .open = stream_open +// XXX .open = func -> openfunc -> nonseekable_open + +// read & write +// +// if both are used in the same file_operations together with an opener - +// under that conditions we can use stream_open instead of nonseekable_open. +@ fops_rw depends on maybe_stream @ +identifier fops0.fops, openfunc; +identifier stream_reader.readstream; +identifier stream_writer.writestream; +@@ + struct file_operations fops = { + .open = openfunc, + .read = readstream, + .write = writestream, + }; + +@ report_rw depends on report @ +identifier fops_rw.openfunc; +position p1; +@@ + openfunc(...) { + <... + nonseekable_open@p1 + ...> + } + +@ script:python depends on report && reader_blocks @ +fops << fops0.fops; +p << report_rw.p1; +@@ +coccilib.report.print_report(p[0], + "ERROR: %s: .read() can deadlock .write(); change nonseekable_open -> stream_open to fix." % (fops,)) + +@ script:python depends on report && !reader_blocks @ +fops << fops0.fops; +p << report_rw.p1; +@@ +coccilib.report.print_report(p[0], + "WARNING: %s: .read() and .write() have stream semantic; safe to change nonseekable_open -> stream_open." % (fops,)) + + +@ explain_rw_deadlocked depends on explain && reader_blocks @ +identifier fops_rw.openfunc; +@@ + openfunc(...) { + <... +- nonseekable_open ++ nonseekable_open /* read & write (was deadlock) */ + ...> + } + + +@ explain_rw_nodeadlock depends on explain && !reader_blocks @ +identifier fops_rw.openfunc; +@@ + openfunc(...) { + <... +- nonseekable_open ++ nonseekable_open /* read & write (no direct deadlock) */ + ...> + } + +@ patch_rw depends on patch @ +identifier fops_rw.openfunc; +@@ + openfunc(...) { + <... +- nonseekable_open ++ stream_open + ...> + } + + +// read, but not write +@ fops_r depends on maybe_stream && !has_write @ +identifier fops0.fops, openfunc; +identifier stream_reader.readstream; +@@ + struct file_operations fops = { + .open = openfunc, + .read = readstream, + }; + +@ report_r depends on report @ +identifier fops_r.openfunc; +position p1; +@@ + openfunc(...) { + <... + nonseekable_open@p1 + ...> + } + +@ script:python depends on report @ +fops << fops0.fops; +p << report_r.p1; +@@ +coccilib.report.print_report(p[0], + "WARNING: %s: .read() has stream semantic; safe to change nonseekable_open -> stream_open." % (fops,)) + +@ explain_r depends on explain @ +identifier fops_r.openfunc; +@@ + openfunc(...) { + <... +- nonseekable_open ++ nonseekable_open /* read only */ + ...> + } + +@ patch_r depends on patch @ +identifier fops_r.openfunc; +@@ + openfunc(...) { + <... +- nonseekable_open ++ stream_open + ...> + } + + +// write, but not read +@ fops_w depends on maybe_stream && !has_read @ +identifier fops0.fops, openfunc; +identifier stream_writer.writestream; +@@ + struct file_operations fops = { + .open = openfunc, + .write = writestream, + }; + +@ report_w depends on report @ +identifier fops_w.openfunc; +position p1; +@@ + openfunc(...) { + <... + nonseekable_open@p1 + ...> + } + +@ script:python depends on report @ +fops << fops0.fops; +p << report_w.p1; +@@ +coccilib.report.print_report(p[0], + "WARNING: %s: .write() has stream semantic; safe to change nonseekable_open -> stream_open." % (fops,)) + +@ explain_w depends on explain @ +identifier fops_w.openfunc; +@@ + openfunc(...) { + <... +- nonseekable_open ++ nonseekable_open /* write only */ + ...> + } + +@ patch_w depends on patch @ +identifier fops_w.openfunc; +@@ + openfunc(...) { + <... +- nonseekable_open ++ stream_open + ...> + } + + +// no read, no write - don't change anything diff --git a/src/net/scripts/coccinelle/api/vma_pages.cocci b/src/net/scripts/coccinelle/api/vma_pages.cocci new file mode 100644 index 0000000..10511b9 --- /dev/null +++ b/src/net/scripts/coccinelle/api/vma_pages.cocci @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: GPL-2.0 +/// +/// Use vma_pages function on vma object instead of explicit computation. +/// +// Confidence: High +// Keywords: vma_pages vma +// Comment: Based on resource_size.cocci + +virtual context +virtual patch +virtual org +virtual report + +//---------------------------------------------------------- +// For context mode +//---------------------------------------------------------- + +@r_context depends on context && !patch && !org && !report@ +struct vm_area_struct *vma; +@@ + +* (vma->vm_end - vma->vm_start) >> PAGE_SHIFT + +//---------------------------------------------------------- +// For patch mode +//---------------------------------------------------------- + +@r_patch depends on !context && patch && !org && !report@ +struct vm_area_struct *vma; +@@ + +- ((vma->vm_end - vma->vm_start) >> PAGE_SHIFT) ++ vma_pages(vma) + +//---------------------------------------------------------- +// For org mode +//---------------------------------------------------------- + +@r_org depends on !context && !patch && (org || report)@ +struct vm_area_struct *vma; +position p; +@@ + + (vma->vm_end@p - vma->vm_start) >> PAGE_SHIFT + +@script:python depends on report@ +p << r_org.p; +x << r_org.vma; +@@ + +msg="WARNING: Consider using vma_pages helper on %s" % (x) +coccilib.report.print_report(p[0], msg) + +@script:python depends on org@ +p << r_org.p; +x << r_org.vma; +@@ + +msg="WARNING: Consider using vma_pages helper on %s" % (x) +msg_safe=msg.replace("[","@(").replace("]",")") +coccilib.org.print_todo(p[0], msg_safe) diff --git a/src/net/scripts/coccinelle/free/clk_put.cocci b/src/net/scripts/coccinelle/free/clk_put.cocci new file mode 100644 index 0000000..7237b49 --- /dev/null +++ b/src/net/scripts/coccinelle/free/clk_put.cocci @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Find missing clk_puts. +/// +//# This only signals a missing clk_put when there is a clk_put later +//# in the same function. +//# False positives can be due to loops. +// +// Confidence: Moderate +// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. +// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: + +virtual context +virtual org +virtual report + +@clk@ +expression e; +statement S,S1; +int ret; +position p1,p2,p3; +@@ + +e = clk_get@p1(...) +... when != clk_put(e) +if (<+...e...+>) S +... when any + when != clk_put(e) + when != if (...) { ... clk_put(e); ... } +( + if (ret == 0) S1 +| +if (...) + { ... + return 0; } +| +if (...) + { ... + return <+...e...+>; } +| +*if@p2 (...) + { ... when != clk_put(e) + when forall + return@p3 ...; } +) +... when any +clk_put(e); + +@script:python depends on org@ +p1 << clk.p1; +p2 << clk.p2; +p3 << clk.p3; +@@ + +cocci.print_main("clk_get",p1) +cocci.print_secs("if",p2) +cocci.print_secs("needed clk_put",p3) + +@script:python depends on report@ +p1 << clk.p1; +p2 << clk.p2; +p3 << clk.p3; +@@ + +msg = "ERROR: missing clk_put; clk_get on line %s and execution via conditional on line %s" % (p1[0].line,p2[0].line) +coccilib.report.print_report(p3[0],msg) diff --git a/src/net/scripts/coccinelle/free/devm_free.cocci b/src/net/scripts/coccinelle/free/devm_free.cocci new file mode 100644 index 0000000..da80050 --- /dev/null +++ b/src/net/scripts/coccinelle/free/devm_free.cocci @@ -0,0 +1,143 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Find uses of standard freeing functons on values allocated using devm_ +/// functions. Values allocated using the devm_functions are freed when +/// the device is detached, and thus the use of the standard freeing +/// function would cause a double free. +/// See Documentation/driver-api/driver-model/devres.rst for more information. +/// +/// A difficulty of detecting this problem is that the standard freeing +/// function might be called from a different function than the one +/// containing the allocation function. It is thus necessary to make the +/// connection between the allocation function and the freeing function. +/// Here this is done using the specific argument text, which is prone to +/// false positives. There is no rule for the request_region and +/// request_mem_region variants because this heuristic seems to be a bit +/// less reliable in these cases. +/// +// Confidence: Moderate +// Copyright: (C) 2011 Julia Lawall, INRIA/LIP6. +// Copyright: (C) 2011 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual org +virtual report +virtual context + +@r depends on context || org || report@ +expression x; +@@ + +( + x = devm_kmalloc(...) +| + x = devm_kvasprintf(...) +| + x = devm_kasprintf(...) +| + x = devm_kzalloc(...) +| + x = devm_kmalloc_array(...) +| + x = devm_kcalloc(...) +| + x = devm_kstrdup(...) +| + x = devm_kmemdup(...) +| + x = devm_get_free_pages(...) +| + x = devm_request_irq(...) +| + x = devm_ioremap(...) +| + x = devm_ioport_map(...) +) + +@safe depends on context || org || report exists@ +expression x; +position p; +@@ + +( + x = kmalloc(...) +| + x = kvasprintf(...) +| + x = kasprintf(...) +| + x = kzalloc(...) +| + x = kmalloc_array(...) +| + x = kcalloc(...) +| + x = kstrdup(...) +| + x = kmemdup(...) +| + x = get_free_pages(...) +| + x = request_irq(...) +| + x = ioremap(...) +| + x = ioport_map(...) +) +... +( + kfree@p(x) +| + kfree_sensitive@p(x) +| + krealloc@p(x, ...) +| + free_pages@p(x, ...) +| + free_page@p(x) +| + free_irq@p(x) +| + iounmap@p(x) +| + ioport_unmap@p(x) +) + +@pb@ +expression r.x; +position p != safe.p; +@@ + +( +* kfree@p(x) +| +* kfree_sensitive@p(x) +| +* krealloc@p(x, ...) +| +* free_pages@p(x, ...) +| +* free_page@p(x) +| +* free_irq@p(x) +| +* iounmap@p(x) +| +* ioport_unmap@p(x) +) + +@script:python depends on org@ +p << pb.p; +@@ + +msg="WARNING: invalid free of devm_ allocated data" +coccilib.org.print_todo(p[0], msg) + +@script:python depends on report@ +p << pb.p; +@@ + +msg="WARNING: invalid free of devm_ allocated data" +coccilib.report.print_report(p[0], msg) + diff --git a/src/net/scripts/coccinelle/free/ifnullfree.cocci b/src/net/scripts/coccinelle/free/ifnullfree.cocci new file mode 100644 index 0000000..285b92d --- /dev/null +++ b/src/net/scripts/coccinelle/free/ifnullfree.cocci @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// NULL check before some freeing functions is not needed. +/// +/// Based on checkpatch warning +/// "kfree(NULL) is safe this check is probably not required" +/// and kfreeaddr.cocci by Julia Lawall. +/// +// Copyright: (C) 2014 Fabian Frederick. +// Comments: - +// Options: --no-includes --include-headers + +virtual patch +virtual org +virtual report +virtual context + +@r2 depends on patch@ +expression E; +@@ +- if (E != NULL) +( + kfree(E); +| + kvfree(E); +| + kfree_sensitive(E); +| + kvfree_sensitive(E, ...); +| + vfree(E); +| + debugfs_remove(E); +| + debugfs_remove_recursive(E); +| + usb_free_urb(E); +| + kmem_cache_destroy(E); +| + mempool_destroy(E); +| + dma_pool_destroy(E); +) + +@r depends on context || report || org @ +expression E; +position p; +@@ + +* if (E != NULL) +* \(kfree@p\|kvfree@p\|kfree_sensitive@p\|kvfree_sensitive@p\|vfree@p\| +* debugfs_remove@p\|debugfs_remove_recursive@p\| +* usb_free_urb@p\|kmem_cache_destroy@p\|mempool_destroy@p\| +* dma_pool_destroy@p\)(E, ...); + +@script:python depends on org@ +p << r.p; +@@ + +cocci.print_main("NULL check before that freeing function is not needed", p) + +@script:python depends on report@ +p << r.p; +@@ + +msg = "WARNING: NULL check before some freeing functions is not needed." +coccilib.report.print_report(p[0], msg) diff --git a/src/net/scripts/coccinelle/free/iounmap.cocci b/src/net/scripts/coccinelle/free/iounmap.cocci new file mode 100644 index 0000000..63b81d0 --- /dev/null +++ b/src/net/scripts/coccinelle/free/iounmap.cocci @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Find missing iounmaps. +/// +//# This only signals a missing iounmap when there is an iounmap later +//# in the same function. +//# False positives can be due to loops. +// +// Confidence: Moderate +// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. +// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: + +virtual context +virtual org +virtual report + +@iom@ +expression e; +statement S,S1; +int ret; +position p1,p2,p3; +@@ + +e = \(ioremap@p1\)(...) +... when != iounmap(e) +if (<+...e...+>) S +... when any + when != iounmap(e) + when != if (...) { ... iounmap(e); ... } +( + if (ret == 0) S1 +| +if (...) + { ... + return 0; } +| +if (...) + { ... + return <+...e...+>; } +| +*if@p2 (...) + { ... when != iounmap(e) + when forall + return@p3 ...; } +) +... when any +iounmap(e); + +@script:python depends on org@ +p1 << iom.p1; +p2 << iom.p2; +p3 << iom.p3; +@@ + +cocci.print_main("ioremap",p1) +cocci.print_secs("if",p2) +cocci.print_secs("needed iounmap",p3) + +@script:python depends on report@ +p1 << iom.p1; +p2 << iom.p2; +p3 << iom.p3; +@@ + +msg = "ERROR: missing iounmap; ioremap on line %s and execution via conditional on line %s" % (p1[0].line,p2[0].line) +coccilib.report.print_report(p3[0],msg) diff --git a/src/net/scripts/coccinelle/free/kfree.cocci b/src/net/scripts/coccinelle/free/kfree.cocci new file mode 100644 index 0000000..1685683 --- /dev/null +++ b/src/net/scripts/coccinelle/free/kfree.cocci @@ -0,0 +1,134 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Find a use after free. +//# Values of variables may imply that some +//# execution paths are not possible, resulting in false positives. +//# Another source of false positives are macros such as +//# SCTP_DBG_OBJCNT_DEC that do not actually evaluate their argument +/// +// Confidence: Moderate +// Copyright: (C) 2010-2012 Nicolas Palix. +// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. +// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual org +virtual report + +@free@ +expression E; +position p1; +@@ + +( +* kfree@p1(E) +| +* kfree_sensitive@p1(E) +) + +@print expression@ +constant char [] c; +expression free.E,E2; +type T; +position p; +identifier f; +@@ + +( + f(...,c,...,(T)E@p,...) +| + E@p == E2 +| + E@p != E2 +| + E2 == E@p +| + E2 != E@p +| + !E@p +| + E@p || ... +) + +@sz@ +expression free.E; +position p; +@@ + + sizeof(<+...E@p...+>) + +@loop exists@ +expression E; +identifier l; +position ok; +@@ + +while (1) { ... +( +* kfree@ok(E) +| +* kfree_sensitive@ok(E) +) + ... when != break; + when != goto l; + when forall +} + +@r exists@ +expression free.E, subE<=free.E, E2; +expression E1; +iterator iter; +statement S; +position free.p1!=loop.ok,p2!={print.p,sz.p}; +@@ + +( +* kfree@p1(E,...) +| +* kfree_sensitive@p1(E,...) +) +... +( + iter(...,subE,...) S // no use +| + list_remove_head(E1,subE,...) +| + subE = E2 +| + subE++ +| + ++subE +| + --subE +| + subE-- +| + &subE +| + BUG(...) +| + BUG_ON(...) +| + return_VALUE(...) +| + return_ACPI_STATUS(...) +| + E@p2 // bad use +) + +@script:python depends on org@ +p1 << free.p1; +p2 << r.p2; +@@ + +cocci.print_main("kfree",p1) +cocci.print_secs("ref",p2) + +@script:python depends on report@ +p1 << free.p1; +p2 << r.p2; +@@ + +msg = "ERROR: reference preceded by free on line %s" % (p1[0].line) +coccilib.report.print_report(p2[0],msg) diff --git a/src/net/scripts/coccinelle/free/kfreeaddr.cocci b/src/net/scripts/coccinelle/free/kfreeaddr.cocci new file mode 100644 index 0000000..142af63 --- /dev/null +++ b/src/net/scripts/coccinelle/free/kfreeaddr.cocci @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Free of a structure field +/// +// Confidence: High +// Copyright: (C) 2013 Julia Lawall, INRIA/LIP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual org +virtual report +virtual context + +@r depends on context || report || org @ +expression e; +identifier f; +position p; +@@ + +( +* kfree@p(&e->f) +| +* kfree_sensitive@p(&e->f) +) + +@script:python depends on org@ +p << r.p; +@@ + +cocci.print_main("kfree",p) + +@script:python depends on report@ +p << r.p; +@@ + +msg = "ERROR: invalid free of structure field" +coccilib.report.print_report(p[0],msg) diff --git a/src/net/scripts/coccinelle/free/pci_free_consistent.cocci b/src/net/scripts/coccinelle/free/pci_free_consistent.cocci new file mode 100644 index 0000000..d51e925 --- /dev/null +++ b/src/net/scripts/coccinelle/free/pci_free_consistent.cocci @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Find missing pci_free_consistent for every pci_alloc_consistent. +/// +// Confidence: Moderate +// Copyright: (C) 2013 Petr Strnad. +// URL: http://coccinelle.lip6.fr/ +// Keywords: pci_free_consistent, pci_alloc_consistent +// Options: --no-includes --include-headers + +virtual report +virtual org + +@search@ +local idexpression id; +expression x,y,z,e; +position p1,p2; +type T; +@@ + +id = pci_alloc_consistent@p1(x,y,&z) +... when != e = id +if (id == NULL || ...) { ... return ...; } +... when != pci_free_consistent(x,y,id,z) + when != if (id) { ... pci_free_consistent(x,y,id,z) ... } + when != if (y) { ... pci_free_consistent(x,y,id,z) ... } + when != e = (T)id + when exists +( +return 0; +| +return 1; +| +return id; +| +return@p2 ...; +) + +@script:python depends on report@ +p1 << search.p1; +p2 << search.p2; +@@ + +msg = "ERROR: missing pci_free_consistent; pci_alloc_consistent on line %s and return without freeing on line %s" % (p1[0].line,p2[0].line) +coccilib.report.print_report(p2[0],msg) + +@script:python depends on org@ +p1 << search.p1; +p2 << search.p2; +@@ + +msg = "ERROR: missing pci_free_consistent; pci_alloc_consistent on line %s and return without freeing on line %s" % (p1[0].line,p2[0].line) +cocci.print_main(msg,p1) +cocci.print_secs("",p2) diff --git a/src/net/scripts/coccinelle/free/put_device.cocci b/src/net/scripts/coccinelle/free/put_device.cocci new file mode 100644 index 0000000..1209213 --- /dev/null +++ b/src/net/scripts/coccinelle/free/put_device.cocci @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: GPL-2.0 +/// Find missing put_device for every of_find_device_by_node. +/// +// Confidence: Moderate +// Copyright: (C) 2018-2019 Wen Yang, ZTE. +// Comments: +// Options: --no-includes --include-headers + +virtual report +virtual org + +@search exists@ +local idexpression id; +expression x,e,e1; +position p1,p2; +type T,T1,T2,T3; +@@ + +id = of_find_device_by_node@p1(x) +... when != e = id +if (id == NULL || ...) { ... return ...; } +... when != put_device(&id->dev) + when != platform_device_put(id) + when != of_dev_put(id) + when != if (id) { ... put_device(&id->dev) ... } + when != e1 = (T)id + when != e1 = (T)(&id->dev) + when != e1 = get_device(&id->dev) + when != e1 = (T1)platform_get_drvdata(id) +( + return +( id +| (T2)dev_get_drvdata(&id->dev) +| (T3)platform_get_drvdata(id) +| &id->dev +); +| return@p2 ...; +) + +@script:python depends on report@ +p1 << search.p1; +p2 << search.p2; +@@ + +coccilib.report.print_report(p2[0], + "ERROR: missing put_device; call of_find_device_by_node on line " + + p1[0].line + + ", but without a corresponding object release within this function.") + +@script:python depends on org@ +p1 << search.p1; +p2 << search.p2; +@@ + +cocci.print_main("of_find_device_by_node", p1) +cocci.print_secs("needed put_device", p2) diff --git a/src/net/scripts/coccinelle/iterators/device_node_continue.cocci b/src/net/scripts/coccinelle/iterators/device_node_continue.cocci new file mode 100644 index 0000000..f8cd14d --- /dev/null +++ b/src/net/scripts/coccinelle/iterators/device_node_continue.cocci @@ -0,0 +1,104 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Device node iterators put the previous value of the index variable, so an +/// explicit put causes a double put. +/// +// Confidence: High +// Copyright: (C) 2015 Julia Lawall, Inria. +// URL: http://coccinelle.lip6.fr/ +// Options: --no-includes --include-headers +// Requires: 1.0.4 +// Keywords: for_each_child_of_node, etc. + +// This uses a conjunction, which requires at least coccinelle >= 1.0.4 + +virtual patch +virtual context +virtual org +virtual report + +@r exists@ +expression e1,e2; +local idexpression n; +iterator name for_each_node_by_name, for_each_node_by_type, +for_each_compatible_node, for_each_matching_node, +for_each_matching_node_and_match, for_each_child_of_node, +for_each_available_child_of_node, for_each_node_with_property; +iterator i; +position p1,p2; +statement S; +@@ + +( +( +for_each_node_by_name(n,e1) S +| +for_each_node_by_type(n,e1) S +| +for_each_compatible_node(n,e1,e2) S +| +for_each_matching_node(n,e1) S +| +for_each_matching_node_and_match(n,e1,e2) S +| +for_each_child_of_node(e1,n) S +| +for_each_available_child_of_node(e1,n) S +| +for_each_node_with_property(n,e1) S +) +& +i@p1(...) { + ... when != of_node_get(n) + when any + of_node_put@p2(n); + ... when any +} +) + +@s exists@ +local idexpression r.n; +statement S; +position r.p1,r.p2; +iterator i; +@@ + + of_node_put@p2(n); + ... when any + i@p1(..., n, ...) + S + +@t depends on s && patch && !context && !org && !report@ +local idexpression n; +position r.p2; +@@ + +- of_node_put@p2(n); + +// ---------------------------------------------------------------------------- + +@t_context depends on s && !patch && (context || org || report)@ +local idexpression n; +position r.p2; +position j0; +@@ + +* of_node_put@j0@p2(n); + +// ---------------------------------------------------------------------------- + +@script:python t_org depends on org@ +j0 << t_context.j0; +@@ + +msg = "ERROR: probable double put." +coccilib.org.print_todo(j0[0], msg) + +// ---------------------------------------------------------------------------- + +@script:python t_report depends on report@ +j0 << t_context.j0; +@@ + +msg = "ERROR: probable double put." +coccilib.report.print_report(j0[0], msg) + diff --git a/src/net/scripts/coccinelle/iterators/fen.cocci b/src/net/scripts/coccinelle/iterators/fen.cocci new file mode 100644 index 0000000..b69f966 --- /dev/null +++ b/src/net/scripts/coccinelle/iterators/fen.cocci @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// These iterators only exit normally when the loop cursor is NULL, so there +/// is no point to call of_node_put on the final value. +/// +// Confidence: High +// Copyright: (C) 2010-2012 Nicolas Palix. +// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. +// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual patch +virtual context +virtual org +virtual report + +@depends on patch@ +iterator name for_each_node_by_name; +expression np,E; +identifier l; +@@ + +for_each_node_by_name(np,...) { + ... when != break; + when != goto l; +} +... when != np = E +- of_node_put(np); + +@depends on patch@ +iterator name for_each_node_by_type; +expression np,E; +identifier l; +@@ + +for_each_node_by_type(np,...) { + ... when != break; + when != goto l; +} +... when != np = E +- of_node_put(np); + +@depends on patch@ +iterator name for_each_compatible_node; +expression np,E; +identifier l; +@@ + +for_each_compatible_node(np,...) { + ... when != break; + when != goto l; +} +... when != np = E +- of_node_put(np); + +@depends on patch@ +iterator name for_each_matching_node; +expression np,E; +identifier l; +@@ + +for_each_matching_node(np,...) { + ... when != break; + when != goto l; +} +... when != np = E +- of_node_put(np); + +// ---------------------------------------------------------------------- + +@r depends on !patch forall@ +//iterator name for_each_node_by_name; +//iterator name for_each_node_by_type; +//iterator name for_each_compatible_node; +//iterator name for_each_matching_node; +expression np,E; +identifier l; +position p1,p2; +@@ + +( +*for_each_node_by_name@p1(np,...) +{ + ... when != break; + when != goto l; +} +| +*for_each_node_by_type@p1(np,...) +{ + ... when != break; + when != goto l; +} +| +*for_each_compatible_node@p1(np,...) +{ + ... when != break; + when != goto l; +} +| +*for_each_matching_node@p1(np,...) +{ + ... when != break; + when != goto l; +} +) +... when != np = E +* of_node_put@p2(np); + +@script:python depends on org@ +p1 << r.p1; +p2 << r.p2; +@@ + +cocci.print_main("unneeded of_node_put",p2) +cocci.print_secs("iterator",p1) + +@script:python depends on report@ +p1 << r.p1; +p2 << r.p2; +@@ + +msg = "ERROR: of_node_put not needed after iterator on line %s" % (p1[0].line) +coccilib.report.print_report(p2[0], msg) diff --git a/src/net/scripts/coccinelle/iterators/for_each_child.cocci b/src/net/scripts/coccinelle/iterators/for_each_child.cocci new file mode 100644 index 0000000..bc39461 --- /dev/null +++ b/src/net/scripts/coccinelle/iterators/for_each_child.cocci @@ -0,0 +1,358 @@ +// SPDX-License-Identifier: GPL-2.0-only +// Adds missing of_node_put() before return/break/goto statement within a for_each iterator for child nodes. +//# False positives can be due to function calls within the for_each +//# loop that may encapsulate an of_node_put. +/// +// Confidence: High +// Copyright: (C) 2020 Sumera Priyadarsini +// URL: http://coccinelle.lip6.fr +// Options: --no-includes --include-headers + +virtual patch +virtual context +virtual org +virtual report + +@r@ +local idexpression n; +expression e1,e2; +iterator name for_each_node_by_name, for_each_node_by_type, +for_each_compatible_node, for_each_matching_node, +for_each_matching_node_and_match, for_each_child_of_node, +for_each_available_child_of_node, for_each_node_with_property; +iterator i; +statement S; +expression list [n1] es; +@@ + +( +( +for_each_node_by_name(n,e1) S +| +for_each_node_by_type(n,e1) S +| +for_each_compatible_node(n,e1,e2) S +| +for_each_matching_node(n,e1) S +| +for_each_matching_node_and_match(n,e1,e2) S +| +for_each_child_of_node(e1,n) S +| +for_each_available_child_of_node(e1,n) S +| +for_each_node_with_property(n,e1) S +) +& +i(es,n,...) S +) + +@ruleone depends on patch && !context && !org && !report@ + +local idexpression r.n; +iterator r.i,i1; +expression e; +expression list [r.n1] es; +statement S; +@@ + + i(es,n,...) { + ... +( + of_node_put(n); +| + e = n +| + return n; +| + i1(...,n,...) S +| +- return of_node_get(n); ++ return n; +| ++ of_node_put(n); +? return ...; +) + ... when any + } + +@ruletwo depends on patch && !context && !org && !report@ + +local idexpression r.n; +iterator r.i,i1,i2; +expression e,e1; +expression list [r.n1] es; +statement S,S2; +@@ + + i(es,n,...) { + ... +( + of_node_put(n); +| + e = n +| + i1(...,n,...) S +| ++ of_node_put(n); +? break; +) + ... when any + } +... when != n + when strict + when forall +( + n = e1; +| +?i2(...,n,...) S2 +) + +@rulethree depends on patch && !context && !org && !report exists@ + +local idexpression r.n; +iterator r.i,i1,i2; +expression e,e1; +identifier l; +expression list [r.n1] es; +statement S,S2; +@@ + + i(es,n,...) { + ... +( + of_node_put(n); +| + e = n +| + i1(...,n,...) S +| ++ of_node_put(n); +? goto l; +) + ... when any + } +... when exists +l: ... when != n + when strict + when forall +( + n = e1; +| +?i2(...,n,...) S2 +) + +// ---------------------------------------------------------------------------- + +@ruleone_context depends on !patch && (context || org || report) exists@ +statement S; +expression e; +expression list[r.n1] es; +iterator r.i, i1; +local idexpression r.n; +position j0, j1; +@@ + + i@j0(es,n,...) { + ... +( + of_node_put(n); +| + e = n +| + return n; +| + i1(...,n,...) S +| + return @j1 ...; +) + ... when any + } + +@ruleone_disj depends on !patch && (context || org || report)@ +expression list[r.n1] es; +iterator r.i; +local idexpression r.n; +position ruleone_context.j0, ruleone_context.j1; +@@ + +* i@j0(es,n,...) { + ... +*return @j1...; + ... when any + } + +@ruletwo_context depends on !patch && (context || org || report) exists@ +statement S, S2; +expression e, e1; +expression list[r.n1] es; +iterator r.i, i1, i2; +local idexpression r.n; +position j0, j2; +@@ + + i@j0(es,n,...) { + ... +( + of_node_put(n); +| + e = n +| + i1(...,n,...) S +| + break@j2; +) + ... when any + } +... when != n + when strict + when forall +( + n = e1; +| +?i2(...,n,...) S2 +) + +@ruletwo_disj depends on !patch && (context || org || report)@ +statement S2; +expression e1; +expression list[r.n1] es; +iterator r.i, i2; +local idexpression r.n; +position ruletwo_context.j0, ruletwo_context.j2; +@@ + +* i@j0(es,n,...) { + ... +*break @j2; + ... when any + } +... when != n + when strict + when forall +( + n = e1; +| +?i2(...,n,...) S2 +) + +@rulethree_context depends on !patch && (context || org || report) exists@ +identifier l; +statement S,S2; +expression e, e1; +expression list[r.n1] es; +iterator r.i, i1, i2; +local idexpression r.n; +position j0, j3; +@@ + + i@j0(es,n,...) { + ... +( + of_node_put(n); +| + e = n +| + i1(...,n,...) S +| + goto l@j3; +) + ... when any + } +... when exists +l: +... when != n + when strict + when forall +( + n = e1; +| +?i2(...,n,...) S2 +) + +@rulethree_disj depends on !patch && (context || org || report) exists@ +identifier l; +statement S2; +expression e1; +expression list[r.n1] es; +iterator r.i, i2; +local idexpression r.n; +position rulethree_context.j0, rulethree_context.j3; +@@ + +* i@j0(es,n,...) { + ... +*goto l@j3; + ... when any + } +... when exists + l: + ... when != n + when strict + when forall +( + n = e1; +| +?i2(...,n,...) S2 +) + +// ---------------------------------------------------------------------------- + +@script:python ruleone_org depends on org@ +i << r.i; +j0 << ruleone_context.j0; +j1 << ruleone_context. j1; +@@ + +msg = "WARNING: Function \"%s\" should have of_node_put() before return " % (i) +coccilib.org.print_safe_todo(j0[0], msg) +coccilib.org.print_link(j1[0], "") + +@script:python ruletwo_org depends on org@ +i << r.i; +j0 << ruletwo_context.j0; +j2 << ruletwo_context.j2; +@@ + +msg = "WARNING: Function \"%s\" should have of_node_put() before break " % (i) +coccilib.org.print_safe_todo(j0[0], msg) +coccilib.org.print_link(j2[0], "") + +@script:python rulethree_org depends on org@ +i << r.i; +j0 << rulethree_context.j0; +j3 << rulethree_context.j3; +@@ + +msg = "WARNING: Function \"%s\" should have of_node_put() before goto " % (i) +coccilib.org.print_safe_todo(j0[0], msg) +coccilib.org.print_link(j3[0], "") + +// ---------------------------------------------------------------------------- + +@script:python ruleone_report depends on report@ +i << r.i; +j0 << ruleone_context.j0; +j1 << ruleone_context.j1; +@@ + +msg = "WARNING: Function \"%s\" should have of_node_put() before return around line %s." % (i, j1[0].line) +coccilib.report.print_report(j0[0], msg) + +@script:python ruletwo_report depends on report@ +i << r.i; +j0 << ruletwo_context.j0; +j2 << ruletwo_context.j2; +@@ + +msg = "WARNING: Function \"%s\" should have of_node_put() before break around line %s." % (i,j2[0].line) +coccilib.report.print_report(j0[0], msg) + +@script:python rulethree_report depends on report@ +i << r.i; +j0 << rulethree_context.j0; +j3 << rulethree_context.j3; +@@ + +msg = "WARNING: Function \"%s\" should have of_node_put() before goto around lines %s." % (i,j3[0].line) +coccilib.report.print_report(j0[0], msg) diff --git a/src/net/scripts/coccinelle/iterators/itnull.cocci b/src/net/scripts/coccinelle/iterators/itnull.cocci new file mode 100644 index 0000000..9b362b9 --- /dev/null +++ b/src/net/scripts/coccinelle/iterators/itnull.cocci @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Many iterators have the property that the first argument is always bound +/// to a real list element, never NULL. +//# False positives arise for some iterators that do not have this property, +//# or in cases when the loop cursor is reassigned. The latter should only +//# happen when the matched code is on the way to a loop exit (break, goto, +//# or return). +/// +// Confidence: Moderate +// Copyright: (C) 2010-2012 Nicolas Palix. +// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. +// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual patch +virtual context +virtual org +virtual report + +@depends on patch@ +iterator I; +expression x,E,E1,E2; +statement S,S1,S2; +@@ + +I(x,...) { <... +( +- if (x == NULL && ...) S +| +- if (x != NULL || ...) + S +| +- (x == NULL) || + E +| +- (x != NULL) && + E +| +- (x == NULL && ...) ? E1 : + E2 +| +- (x != NULL || ...) ? + E1 +- : E2 +| +- if (x == NULL && ...) S1 else + S2 +| +- if (x != NULL || ...) + S1 +- else S2 +| ++ BAD( + x == NULL ++ ) +| ++ BAD( + x != NULL ++ ) +) + ...> } + +@r depends on !patch exists@ +iterator I; +expression x,E; +position p1,p2; +@@ + +*I@p1(x,...) +{ ... when != x = E +( +* x@p2 == NULL +| +* x@p2 != NULL +) + ... when any +} + +@script:python depends on org@ +p1 << r.p1; +p2 << r.p2; +@@ + +cocci.print_main("iterator-bound variable",p1) +cocci.print_secs("useless NULL test",p2) + +@script:python depends on report@ +p1 << r.p1; +p2 << r.p2; +@@ + +msg = "ERROR: iterator variable bound on line %s cannot be NULL" % (p1[0].line) +coccilib.report.print_report(p2[0], msg) diff --git a/src/net/scripts/coccinelle/iterators/list_entry_update.cocci b/src/net/scripts/coccinelle/iterators/list_entry_update.cocci new file mode 100644 index 0000000..d62e8a1 --- /dev/null +++ b/src/net/scripts/coccinelle/iterators/list_entry_update.cocci @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// list_for_each_entry uses its first argument to get from one element of +/// the list to the next, so it is usually not a good idea to reassign it. +/// The first rule finds such a reassignment and the second rule checks +/// that there is a path from the reassignment back to the top of the loop. +/// +// Confidence: High +// Copyright: (C) 2010 Nicolas Palix, DIKU. +// Copyright: (C) 2010 Julia Lawall, DIKU. +// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual context +virtual org +virtual report + +@r exists@ +iterator name list_for_each_entry; +expression x,E; +position p1,p2; +@@ + +list_for_each_entry@p1(x,...) { <... x =@p2 E ...> } + +@depends on context && !org && !report@ +expression x,E; +position r.p1,r.p2; +statement S; +@@ + +*x =@p2 E +... +list_for_each_entry@p1(x,...) S + +// ------------------------------------------------------------------------ + +@back depends on (org || report) && !context exists@ +expression x,E; +position r.p1,r.p2; +statement S; +@@ + +x =@p2 E +... +list_for_each_entry@p1(x,...) S + +@script:python depends on back && org@ +p1 << r.p1; +p2 << r.p2; +@@ + +cocci.print_main("iterator",p1) +cocci.print_secs("update",p2) + +@script:python depends on back && report@ +p1 << r.p1; +p2 << r.p2; +@@ + +msg = "iterator with update on line %s" % (p2[0].line) +coccilib.report.print_report(p1[0],msg) diff --git a/src/net/scripts/coccinelle/iterators/use_after_iter.cocci b/src/net/scripts/coccinelle/iterators/use_after_iter.cocci new file mode 100644 index 0000000..9be48b5 --- /dev/null +++ b/src/net/scripts/coccinelle/iterators/use_after_iter.cocci @@ -0,0 +1,151 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// If list_for_each_entry, etc complete a traversal of the list, the iterator +/// variable ends up pointing to an address at an offset from the list head, +/// and not a meaningful structure. Thus this value should not be used after +/// the end of the iterator. +//#False positives arise when there is a goto in the iterator and the +//#reported reference is at the label of this goto. Some flag tests +//#may also cause a report to be a false positive. +/// +// Confidence: Moderate +// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. +// Copyright: (C) 2012 Gilles Muller, INRIA/LIP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual context +virtual org +virtual report + +@r exists@ +identifier c,member; +expression E,x; +iterator name list_for_each_entry; +iterator name list_for_each_entry_reverse; +iterator name list_for_each_entry_continue; +iterator name list_for_each_entry_continue_reverse; +iterator name list_for_each_entry_from; +iterator name list_for_each_entry_safe; +iterator name list_for_each_entry_safe_continue; +iterator name list_for_each_entry_safe_from; +iterator name list_for_each_entry_safe_reverse; +iterator name hlist_for_each_entry; +iterator name hlist_for_each_entry_continue; +iterator name hlist_for_each_entry_from; +iterator name hlist_for_each_entry_safe; +statement S; +position p1,p2; +type T; +@@ + +( +list_for_each_entry@p1(c,...,member) { ... when != break; + when forall + when strict +} +| +list_for_each_entry_reverse@p1(c,...,member) { ... when != break; + when forall + when strict +} +| +list_for_each_entry_continue@p1(c,...,member) { ... when != break; + when forall + when strict +} +| +list_for_each_entry_continue_reverse@p1(c,...,member) { ... when != break; + when forall + when strict +} +| +list_for_each_entry_from@p1(c,...,member) { ... when != break; + when forall + when strict +} +| +list_for_each_entry_safe@p1(c,...,member) { ... when != break; + when forall + when strict +} +| +list_for_each_entry_safe_continue@p1(c,...,member) { ... when != break; + when forall + when strict +} +| +list_for_each_entry_safe_from@p1(c,...,member) { ... when != break; + when forall + when strict +} +| +list_for_each_entry_safe_reverse@p1(c,...,member) { ... when != break; + when forall + when strict +} +) +... +( +list_for_each_entry(c,...) S +| +list_for_each_entry_reverse(c,...) S +| +list_for_each_entry_continue(c,...) S +| +list_for_each_entry_continue_reverse(c,...) S +| +list_for_each_entry_from(c,...) S +| +list_for_each_entry_safe(c,...) S +| +list_for_each_entry_safe(x,c,...) S +| +list_for_each_entry_safe_continue(c,...) S +| +list_for_each_entry_safe_continue(x,c,...) S +| +list_for_each_entry_safe_from(c,...) S +| +list_for_each_entry_safe_from(x,c,...) S +| +list_for_each_entry_safe_reverse(c,...) S +| +list_for_each_entry_safe_reverse(x,c,...) S +| +hlist_for_each_entry(c,...) S +| +hlist_for_each_entry_continue(c,...) S +| +hlist_for_each_entry_from(c,...) S +| +hlist_for_each_entry_safe(c,...) S +| +list_remove_head(x,c,...) +| +sizeof(<+...c...+>) +| + &c->member +| +T c; +| +c = E +| +*c@p2 +) + +@script:python depends on org@ +p1 << r.p1; +p2 << r.p2; +@@ + +cocci.print_main("invalid iterator index reference",p2) +cocci.print_secs("iterator",p1) + +@script:python depends on report@ +p1 << r.p1; +p2 << r.p2; +@@ + +msg = "ERROR: invalid reference to the index variable of the iterator on line %s" % (p1[0].line) +coccilib.report.print_report(p2[0], msg) diff --git a/src/net/scripts/coccinelle/locks/call_kern.cocci b/src/net/scripts/coccinelle/locks/call_kern.cocci new file mode 100644 index 0000000..5ca0d81 --- /dev/null +++ b/src/net/scripts/coccinelle/locks/call_kern.cocci @@ -0,0 +1,106 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Find functions that refer to GFP_KERNEL but are called with locks held. +//# The proposed change of converting the GFP_KERNEL is not necessarily the +//# correct one. It may be desired to unlock the lock, or to not call the +//# function under the lock in the first place. +/// +// Confidence: Moderate +// Copyright: (C) 2012 Nicolas Palix. +// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. +// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual patch +virtual context +virtual org +virtual report + +@gfp exists@ +identifier fn; +position p; +@@ + +fn(...) { + ... when != read_unlock_irq(...) + when != write_unlock_irq(...) + when != read_unlock_irqrestore(...) + when != write_unlock_irqrestore(...) + when != spin_unlock(...) + when != spin_unlock_irq(...) + when != spin_unlock_irqrestore(...) + when != local_irq_enable(...) + when any + GFP_KERNEL@p + ... when any +} + +@locked exists@ +identifier gfp.fn; +position p1,p2; +@@ + +( +read_lock_irq@p1 +| +write_lock_irq@p1 +| +read_lock_irqsave@p1 +| +write_lock_irqsave@p1 +| +spin_lock@p1 +| +spin_trylock@p1 +| +spin_lock_irq@p1 +| +spin_lock_irqsave@p1 +| +local_irq_disable@p1 +) + (...) +... when != read_unlock_irq(...) + when != write_unlock_irq(...) + when != read_unlock_irqrestore(...) + when != write_unlock_irqrestore(...) + when != spin_unlock(...) + when != spin_unlock_irq(...) + when != spin_unlock_irqrestore(...) + when != local_irq_enable(...) +fn@p2(...) + +@depends on locked && patch@ +position gfp.p; +@@ + +- GFP_KERNEL@p ++ GFP_ATOMIC + +@depends on locked && !patch@ +position gfp.p; +@@ + +* GFP_KERNEL@p + +@script:python depends on !patch && org@ +p << gfp.p; +fn << gfp.fn; +p1 << locked.p1; +p2 << locked.p2; +@@ + +cocci.print_main("lock",p1) +cocci.print_secs("call",p2) +cocci.print_secs("GFP_KERNEL",p) + +@script:python depends on !patch && report@ +p << gfp.p; +fn << gfp.fn; +p1 << locked.p1; +p2 << locked.p2; +@@ + +msg = "ERROR: function %s called on line %s inside lock on line %s but uses GFP_KERNEL" % (fn,p2[0].line,p1[0].line) +coccilib.report.print_report(p[0], msg) diff --git a/src/net/scripts/coccinelle/locks/double_lock.cocci b/src/net/scripts/coccinelle/locks/double_lock.cocci new file mode 100644 index 0000000..9e88a57 --- /dev/null +++ b/src/net/scripts/coccinelle/locks/double_lock.cocci @@ -0,0 +1,93 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Find double locks. False positives may occur when some paths cannot +/// occur at execution, due to the values of variables, and when there is +/// an intervening function call that releases the lock. +/// +// Confidence: Moderate +// Copyright: (C) 2010 Nicolas Palix, DIKU. +// Copyright: (C) 2010 Julia Lawall, DIKU. +// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual org +virtual report + +@locked@ +position p1; +expression E1; +position p; +@@ + +( +mutex_lock@p1 +| +mutex_trylock@p1 +| +spin_lock@p1 +| +spin_trylock@p1 +| +read_lock@p1 +| +read_trylock@p1 +| +write_lock@p1 +| +write_trylock@p1 +) (E1@p,...); + +@balanced@ +position p1 != locked.p1; +position locked.p; +identifier lock,unlock; +expression x <= locked.E1; +expression E,locked.E1; +expression E2; +@@ + +if (E) { + <+... when != E1 + lock(E1@p,...) + ...+> +} +... when != E1 + when != \(x = E2\|&x\) + when forall +if (E) { + <+... when != E1 + unlock@p1(E1,...) + ...+> +} + +@r depends on !balanced exists@ +expression x <= locked.E1; +expression locked.E1; +expression E2; +identifier lock; +position locked.p,p1,p2; +@@ + +lock@p1 (E1@p,...); +... when != E1 + when != \(x = E2\|&x\) +lock@p2 (E1,...); + +@script:python depends on org@ +p1 << r.p1; +p2 << r.p2; +lock << r.lock; +@@ + +cocci.print_main(lock,p1) +cocci.print_secs("second lock",p2) + +@script:python depends on report@ +p1 << r.p1; +p2 << r.p2; +lock << r.lock; +@@ + +msg = "second lock on line %s" % (p2[0].line) +coccilib.report.print_report(p1[0],msg) diff --git a/src/net/scripts/coccinelle/locks/flags.cocci b/src/net/scripts/coccinelle/locks/flags.cocci new file mode 100644 index 0000000..7f990cd --- /dev/null +++ b/src/net/scripts/coccinelle/locks/flags.cocci @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Find nested lock+irqsave functions that use the same flags variables +/// +// Confidence: High +// Copyright: (C) 2010-2012 Nicolas Palix. +// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. +// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual context +virtual org +virtual report + +@r exists@ +expression lock1,lock2,flags; +position p1,p2; +@@ + +( +spin_lock_irqsave@p1(lock1,flags) +| +read_lock_irqsave@p1(lock1,flags) +| +write_lock_irqsave@p1(lock1,flags) +) +... when != flags +( +spin_lock_irqsave(lock1,flags) +| +read_lock_irqsave(lock1,flags) +| +write_lock_irqsave(lock1,flags) +| +spin_lock_irqsave@p2(lock2,flags) +| +read_lock_irqsave@p2(lock2,flags) +| +write_lock_irqsave@p2(lock2,flags) +) + +@d exists@ +expression f <= r.flags; +expression lock1,lock2,flags; +position r.p1, r.p2; +@@ + +( +*spin_lock_irqsave@p1(lock1,flags) +| +*read_lock_irqsave@p1(lock1,flags) +| +*write_lock_irqsave@p1(lock1,flags) +) +... when != f +( +*spin_lock_irqsave@p2(lock2,flags) +| +*read_lock_irqsave@p2(lock2,flags) +| +*write_lock_irqsave@p2(lock2,flags) +) + +// ---------------------------------------------------------------------- + +@script:python depends on d && org@ +p1 << r.p1; +p2 << r.p2; +@@ + +cocci.print_main("original lock",p1) +cocci.print_secs("nested lock+irqsave that reuses flags",p2) + +@script:python depends on d && report@ +p1 << r.p1; +p2 << r.p2; +@@ + +msg="ERROR: nested lock+irqsave that reuses flags from line %s." % (p1[0].line) +coccilib.report.print_report(p2[0], msg) diff --git a/src/net/scripts/coccinelle/locks/mini_lock.cocci b/src/net/scripts/coccinelle/locks/mini_lock.cocci new file mode 100644 index 0000000..c3ad098 --- /dev/null +++ b/src/net/scripts/coccinelle/locks/mini_lock.cocci @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Find missing unlocks. This semantic match considers the specific case +/// where the unlock is missing from an if branch, and there is a lock +/// before the if and an unlock after the if. False positives are due to +/// cases where the if branch represents a case where the function is +/// supposed to exit with the lock held, or where there is some preceding +/// function call that releases the lock. +/// +// Confidence: Moderate +// Copyright: (C) 2010-2012 Nicolas Palix. +// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. +// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual context +virtual org +virtual report + +@prelocked@ +position p1,p; +expression E1; +@@ + +( +mutex_lock@p1 +| +mutex_trylock@p1 +| +spin_lock@p1 +| +spin_trylock@p1 +| +read_lock@p1 +| +read_trylock@p1 +| +write_lock@p1 +| +write_trylock@p1 +| +read_lock_irq@p1 +| +write_lock_irq@p1 +| +read_lock_irqsave@p1 +| +write_lock_irqsave@p1 +| +spin_lock_irq@p1 +| +spin_lock_irqsave@p1 +) (E1@p,...); + +@looped@ +position r; +@@ + +for(...;...;...) { <+... return@r ...; ...+> } + +@err exists@ +expression E1; +position prelocked.p; +position up != prelocked.p1; +position r!=looped.r; +identifier lock,unlock; +@@ + +*lock(E1@p,...); +... when != E1 + when any +if (...) { + ... when != E1 +* return@r ...; +} +... when != E1 + when any +*unlock@up(E1,...); + +@script:python depends on org@ +p << prelocked.p1; +lock << err.lock; +unlock << err.unlock; +p2 << err.r; +@@ + +cocci.print_main(lock,p) +cocci.print_secs(unlock,p2) + +@script:python depends on report@ +p << prelocked.p1; +lock << err.lock; +unlock << err.unlock; +p2 << err.r; +@@ + +msg = "preceding lock on line %s" % (p[0].line) +coccilib.report.print_report(p2[0],msg) diff --git a/src/net/scripts/coccinelle/misc/add_namespace.cocci b/src/net/scripts/coccinelle/misc/add_namespace.cocci new file mode 100644 index 0000000..cbf1614 --- /dev/null +++ b/src/net/scripts/coccinelle/misc/add_namespace.cocci @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: GPL-2.0-only +// +/// Adds missing MODULE_IMPORT_NS statements to source files +/// +/// This script is usually called from scripts/nsdeps with -D ns=<namespace> to +/// add a missing namespace tag to a module source file. +/// + +virtual nsdeps +virtual report + +@has_ns_import@ +declarer name MODULE_IMPORT_NS; +identifier virtual.ns; +@@ +MODULE_IMPORT_NS(ns); + +// Add missing imports, but only adjacent to a MODULE_LICENSE statement. +// That ensures we are adding it only to the main module source file. +@do_import depends on !has_ns_import && nsdeps@ +declarer name MODULE_LICENSE; +expression license; +identifier virtual.ns; +@@ +MODULE_LICENSE(license); ++ MODULE_IMPORT_NS(ns); + +// Dummy rule for report mode that would otherwise be empty and make spatch +// fail ("No rules apply.") +@script:python depends on report@ +@@ diff --git a/src/net/scripts/coccinelle/misc/array_size.cocci b/src/net/scripts/coccinelle/misc/array_size.cocci new file mode 100644 index 0000000..4d25187 --- /dev/null +++ b/src/net/scripts/coccinelle/misc/array_size.cocci @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Use ARRAY_SIZE instead of dividing sizeof array with sizeof an element +/// +//# This makes an effort to find cases where ARRAY_SIZE can be used such as +//# where there is a division of sizeof the array by the sizeof its first +//# element or by any indexed element or the element type. It replaces the +//# division of the two sizeofs by ARRAY_SIZE. +// +// Confidence: High +// Copyright: (C) 2014 Himangi Saraogi. +// Comments: +// Options: --no-includes --include-headers + +virtual patch +virtual context +virtual org +virtual report + +@i@ +@@ + +#include <linux/kernel.h> + +//---------------------------------------------------------- +// For context mode +//---------------------------------------------------------- + +@depends on i&&context@ +type T; +T[] E; +@@ +( +* (sizeof(E)/sizeof(*E)) +| +* (sizeof(E)/sizeof(E[...])) +| +* (sizeof(E)/sizeof(T)) +) + +//---------------------------------------------------------- +// For patch mode +//---------------------------------------------------------- + +@depends on i&&patch@ +type T; +T[] E; +@@ +( +- (sizeof(E)/sizeof(*E)) ++ ARRAY_SIZE(E) +| +- (sizeof(E)/sizeof(E[...])) ++ ARRAY_SIZE(E) +| +- (sizeof(E)/sizeof(T)) ++ ARRAY_SIZE(E) +) + +//---------------------------------------------------------- +// For org and report mode +//---------------------------------------------------------- + +@r depends on (org || report)@ +type T; +T[] E; +position p; +@@ +( + (sizeof(E)@p /sizeof(*E)) +| + (sizeof(E)@p /sizeof(E[...])) +| + (sizeof(E)@p /sizeof(T)) +) + +@script:python depends on org@ +p << r.p; +@@ + +coccilib.org.print_todo(p[0], "WARNING should use ARRAY_SIZE") + +@script:python depends on report@ +p << r.p; +@@ + +msg="WARNING: Use ARRAY_SIZE" +coccilib.report.print_report(p[0], msg) + diff --git a/src/net/scripts/coccinelle/misc/array_size_dup.cocci b/src/net/scripts/coccinelle/misc/array_size_dup.cocci new file mode 100644 index 0000000..fbc2ba1 --- /dev/null +++ b/src/net/scripts/coccinelle/misc/array_size_dup.cocci @@ -0,0 +1,209 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// +/// Check for array_size(), array3_size(), struct_size() duplicates. +/// These patterns are detected: +/// 1. An opencoded expression is used before array_size() to compute the same size +/// 2. An opencoded expression is used after array_size() to compute the same size +/// From security point of view only first case is relevant. These functions +/// perform arithmetic overflow check. Thus, if we use an opencoded expression +/// before a call to the *_size() function we can miss an overflow. +/// +// Confidence: High +// Copyright: (C) 2020 Denis Efremov ISPRAS +// Options: --no-includes --include-headers --no-loops + +virtual context +virtual report +virtual org + +@as@ +expression E1, E2; +@@ + +array_size(E1, E2) + +@as_next@ +expression subE1 <= as.E1; +expression subE2 <= as.E2; +expression as.E1, as.E2, E3; +assignment operator aop; +position p1, p2; +@@ + +* E1 * E2@p1 + ... when != \(subE1\|subE2\) aop E3 + when != &\(subE1\|subE2\) +* array_size(E1, E2)@p2 + +@script:python depends on report@ +p1 << as_next.p1; +p2 << as_next.p2; +@@ + +msg = "WARNING: array_size is used later (line %s) to compute the same size" % (p2[0].line) +coccilib.report.print_report(p1[0], msg) + +@script:python depends on org@ +p1 << as_next.p1; +p2 << as_next.p2; +@@ + +msg = "WARNING: array_size is used later (line %s) to compute the same size" % (p2[0].line) +coccilib.org.print_todo(p1[0], msg) + +@as_prev@ +expression subE1 <= as.E1; +expression subE2 <= as.E2; +expression as.E1, as.E2, E3; +assignment operator aop; +position p1, p2; +@@ + +* array_size(E1, E2)@p1 + ... when != \(subE1\|subE2\) aop E3 + when != &\(subE1\|subE2\) +* E1 * E2@p2 + +@script:python depends on report@ +p1 << as_prev.p1; +p2 << as_prev.p2; +@@ + +msg = "WARNING: array_size is already used (line %s) to compute the same size" % (p1[0].line) +coccilib.report.print_report(p2[0], msg) + +@script:python depends on org@ +p1 << as_prev.p1; +p2 << as_prev.p2; +@@ + +msg = "WARNING: array_size is already used (line %s) to compute the same size" % (p1[0].line) +coccilib.org.print_todo(p2[0], msg) + +@as3@ +expression E1, E2, E3; +@@ + +array3_size(E1, E2, E3) + +@as3_next@ +expression subE1 <= as3.E1; +expression subE2 <= as3.E2; +expression subE3 <= as3.E3; +expression as3.E1, as3.E2, as3.E3, E4; +assignment operator aop; +position p1, p2; +@@ + +* E1 * E2 * E3@p1 + ... when != \(subE1\|subE2\|subE3\) aop E4 + when != &\(subE1\|subE2\|subE3\) +* array3_size(E1, E2, E3)@p2 + +@script:python depends on report@ +p1 << as3_next.p1; +p2 << as3_next.p2; +@@ + +msg = "WARNING: array3_size is used later (line %s) to compute the same size" % (p2[0].line) +coccilib.report.print_report(p1[0], msg) + +@script:python depends on org@ +p1 << as3_next.p1; +p2 << as3_next.p2; +@@ + +msg = "WARNING: array3_size is used later (line %s) to compute the same size" % (p2[0].line) +coccilib.org.print_todo(p1[0], msg) + +@as3_prev@ +expression subE1 <= as3.E1; +expression subE2 <= as3.E2; +expression subE3 <= as3.E3; +expression as3.E1, as3.E2, as3.E3, E4; +assignment operator aop; +position p1, p2; +@@ + +* array3_size(E1, E2, E3)@p1 + ... when != \(subE1\|subE2\|subE3\) aop E4 + when != &\(subE1\|subE2\|subE3\) +* E1 * E2 * E3@p2 + +@script:python depends on report@ +p1 << as3_prev.p1; +p2 << as3_prev.p2; +@@ + +msg = "WARNING: array3_size is already used (line %s) to compute the same size" % (p1[0].line) +coccilib.report.print_report(p2[0], msg) + +@script:python depends on org@ +p1 << as3_prev.p1; +p2 << as3_prev.p2; +@@ + +msg = "WARNING: array3_size is already used (line %s) to compute the same size" % (p1[0].line) +coccilib.org.print_todo(p2[0], msg) + +@ss@ +expression E1, E2, E3; +@@ + +struct_size(E1, E2, E3) + +@ss_next@ +expression subE3 <= ss.E3; +expression ss.E1, ss.E2, ss.E3, E4; +assignment operator aop; +position p1, p2; +@@ + +* E1 * E2 + E3@p1 + ... when != subE3 aop E4 + when != &subE3 +* struct_size(E1, E2, E3)@p2 + +@script:python depends on report@ +p1 << ss_next.p1; +p2 << ss_next.p2; +@@ + +msg = "WARNING: struct_size is used later (line %s) to compute the same size" % (p2[0].line) +coccilib.report.print_report(p1[0], msg) + +@script:python depends on org@ +p1 << ss_next.p1; +p2 << ss_next.p2; +@@ + +msg = "WARNING: struct_size is used later (line %s) to compute the same size" % (p2[0].line) +coccilib.org.print_todo(p1[0], msg) + +@ss_prev@ +expression subE3 <= ss.E3; +expression ss.E1, ss.E2, ss.E3, E4; +assignment operator aop; +position p1, p2; +@@ + +* struct_size(E1, E2, E3)@p1 + ... when != subE3 aop E4 + when != &subE3 +* E1 * E2 + E3@p2 + +@script:python depends on report@ +p1 << ss_prev.p1; +p2 << ss_prev.p2; +@@ + +msg = "WARNING: struct_size is already used (line %s) to compute the same size" % (p1[0].line) +coccilib.report.print_report(p2[0], msg) + +@script:python depends on org@ +p1 << ss_prev.p1; +p2 << ss_prev.p2; +@@ + +msg = "WARNING: struct_size is already used (line %s) to compute the same size" % (p1[0].line) +coccilib.org.print_todo(p2[0], msg) diff --git a/src/net/scripts/coccinelle/misc/badty.cocci b/src/net/scripts/coccinelle/misc/badty.cocci new file mode 100644 index 0000000..ed3e0b8 --- /dev/null +++ b/src/net/scripts/coccinelle/misc/badty.cocci @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Correct the size argument to alloc functions +/// +//# This makes an effort to find cases where the argument to sizeof is wrong +//# in memory allocation functions by checking the type of the allocated memory +//# when it is a double pointer and ensuring the sizeof argument takes a pointer +//# to the the memory being allocated. There are false positives in cases the +//# sizeof argument is not used in constructing the return value. The result +//# may need some reformatting. +// +// Confidence: Moderate +// Copyright: (C) 2014 Himangi Saraogi. +// Comments: +// Options: + +virtual patch +virtual context +virtual org +virtual report + +//---------------------------------------------------------- +// For context mode +//---------------------------------------------------------- + +@depends on context disable sizeof_type_expr@ +type T; +T **x; +@@ + + x = + <+...sizeof( +* T + )...+> + +//---------------------------------------------------------- +// For patch mode +//---------------------------------------------------------- + +@depends on patch disable sizeof_type_expr@ +type T; +T **x; +@@ + + x = + <+...sizeof( +- T ++ *x + )...+> + +//---------------------------------------------------------- +// For org and report mode +//---------------------------------------------------------- + +@r depends on (org || report) disable sizeof_type_expr@ +type T; +T **x; +position p; +@@ + + x = + <+...sizeof( + T@p + )...+> + +@script:python depends on org@ +p << r.p; +@@ + +coccilib.org.print_todo(p[0], "WARNING sizeof argument should be pointer type, not structure type") + +@script:python depends on report@ +p << r.p; +@@ + +msg="WARNING: Use correct pointer type argument for sizeof" +coccilib.report.print_report(p[0], msg) + diff --git a/src/net/scripts/coccinelle/misc/boolconv.cocci b/src/net/scripts/coccinelle/misc/boolconv.cocci new file mode 100644 index 0000000..392994e --- /dev/null +++ b/src/net/scripts/coccinelle/misc/boolconv.cocci @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Remove unneeded conversion to bool +/// +//# Relational and logical operators evaluate to bool, +//# explicit conversion is overly verbose and unneeded. +// +// Copyright: (C) 2016 Andrew F. Davis <afd@ti.com> + +virtual patch +virtual context +virtual org +virtual report + +//---------------------------------------------------------- +// For patch mode +//---------------------------------------------------------- + +@depends on patch@ +expression A, B; +symbol true, false; +@@ + +( + A == B +| + A != B +| + A > B +| + A < B +| + A >= B +| + A <= B +| + A && B +| + A || B +) +- ? true : false + +//---------------------------------------------------------- +// For context mode +//---------------------------------------------------------- + +@r depends on !patch@ +expression A, B; +symbol true, false; +position p; +@@ + +( + A == B +| + A != B +| + A > B +| + A < B +| + A >= B +| + A <= B +| + A && B +| + A || B +) +* ? true : false@p + +//---------------------------------------------------------- +// For org mode +//---------------------------------------------------------- + +@script:python depends on r&&org@ +p << r.p; +@@ + +msg = "WARNING: conversion to bool not needed here" +coccilib.org.print_todo(p[0], msg) + +//---------------------------------------------------------- +// For report mode +//---------------------------------------------------------- + +@script:python depends on r&&report@ +p << r.p; +@@ + +msg = "WARNING: conversion to bool not needed here" +coccilib.report.print_report(p[0], msg) diff --git a/src/net/scripts/coccinelle/misc/boolinit.cocci b/src/net/scripts/coccinelle/misc/boolinit.cocci new file mode 100644 index 0000000..fed6126 --- /dev/null +++ b/src/net/scripts/coccinelle/misc/boolinit.cocci @@ -0,0 +1,195 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Bool initializations should use true and false. Bool tests don't need +/// comparisons. Based on contributions from Joe Perches, Rusty Russell +/// and Bruce W Allan. +/// +// Confidence: High +// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. +// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Options: --include-headers + +virtual patch +virtual context +virtual org +virtual report + +@boolok@ +symbol true,false; +@@ +( +true +| +false +) + +@depends on patch@ +bool t; +@@ + +( +- t == true ++ t +| +- true == t ++ t +| +- t != true ++ !t +| +- true != t ++ !t +| +- t == false ++ !t +| +- false == t ++ !t +| +- t != false ++ t +| +- false != t ++ t +) + +@depends on patch disable is_zero, isnt_zero@ +bool t; +@@ + +( +- t == 1 ++ t +| +- t != 1 ++ !t +| +- t == 0 ++ !t +| +- t != 0 ++ t +) + +@depends on patch && boolok@ +bool b; +@@ +( + b = +- 0 ++ false +| + b = +- 1 ++ true +) + +// --------------------------------------------------------------------- + +@r1 depends on !patch@ +bool t; +position p; +@@ + +( +* t@p == true +| +* true == t@p +| +* t@p != true +| +* true != t@p +| +* t@p == false +| +* false == t@p +| +* t@p != false +| +* false != t@p +) + +@r2 depends on !patch disable is_zero, isnt_zero@ +bool t; +position p; +@@ + +( +* t@p == 1 +| +* t@p != 1 +| +* t@p == 0 +| +* t@p != 0 +) + +@r3 depends on !patch && boolok@ +bool b; +position p1; +@@ +( +*b@p1 = 0 +| +*b@p1 = 1 +) + +@r4 depends on !patch@ +bool b; +position p2; +identifier i; +constant c != {0,1}; +@@ +( + b = i +| +*b@p2 = c +) + +@script:python depends on org@ +p << r1.p; +@@ + +cocci.print_main("WARNING: Comparison to bool",p) + +@script:python depends on org@ +p << r2.p; +@@ + +cocci.print_main("WARNING: Comparison of 0/1 to bool variable",p) + +@script:python depends on org@ +p1 << r3.p1; +@@ + +cocci.print_main("WARNING: Assignment of 0/1 to bool variable",p1) + +@script:python depends on org@ +p2 << r4.p2; +@@ + +cocci.print_main("ERROR: Assignment of non-0/1 constant to bool variable",p2) + +@script:python depends on report@ +p << r1.p; +@@ + +coccilib.report.print_report(p[0],"WARNING: Comparison to bool") + +@script:python depends on report@ +p << r2.p; +@@ + +coccilib.report.print_report(p[0],"WARNING: Comparison of 0/1 to bool variable") + +@script:python depends on report@ +p1 << r3.p1; +@@ + +coccilib.report.print_report(p1[0],"WARNING: Assignment of 0/1 to bool variable") + +@script:python depends on report@ +p2 << r4.p2; +@@ + +coccilib.report.print_report(p2[0],"ERROR: Assignment of non-0/1 constant to bool variable") diff --git a/src/net/scripts/coccinelle/misc/boolreturn.cocci b/src/net/scripts/coccinelle/misc/boolreturn.cocci new file mode 100644 index 0000000..29d2bf4 --- /dev/null +++ b/src/net/scripts/coccinelle/misc/boolreturn.cocci @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: GPL-2.0 +/// Return statements in functions returning bool should use +/// true/false instead of 1/0. +// +// Confidence: High +// Options: --no-includes --include-headers + +virtual patch +virtual report +virtual context + +@r1 depends on patch@ +identifier fn; +typedef bool; +symbol false; +symbol true; +@@ + +bool fn ( ... ) +{ +<... +return +( +- 0 ++ false +| +- 1 ++ true +) + ; +...> +} + +@r2 depends on report || context@ +identifier fn; +position p; +@@ + +bool fn ( ... ) +{ +<... +return +( +* 0@p +| +* 1@p +) + ; +...> +} + + +@script:python depends on report@ +p << r2.p; +fn << r2.fn; +@@ + +msg = "WARNING: return of 0/1 in function '%s' with return type bool" % fn +coccilib.report.print_report(p[0], msg) diff --git a/src/net/scripts/coccinelle/misc/bugon.cocci b/src/net/scripts/coccinelle/misc/bugon.cocci new file mode 100644 index 0000000..8d595c3 --- /dev/null +++ b/src/net/scripts/coccinelle/misc/bugon.cocci @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Use BUG_ON instead of a if condition followed by BUG. +/// +//# This makes an effort to find cases where BUG() follows an if +//# condition on an expression and replaces the if condition and BUG() +//# with a BUG_ON having the conditional expression of the if statement +//# as argument. +// +// Confidence: High +// Copyright: (C) 2014 Himangi Saraogi. +// Comments: +// Options: --no-includes --include-headers + +virtual patch +virtual context +virtual org +virtual report + +//---------------------------------------------------------- +// For context mode +//---------------------------------------------------------- + +@depends on context@ +expression e; +@@ + +*if (e) BUG(); + +//---------------------------------------------------------- +// For patch mode +//---------------------------------------------------------- + +@depends on patch@ +expression e; +@@ + +-if (e) BUG(); ++BUG_ON(e); + +//---------------------------------------------------------- +// For org and report mode +//---------------------------------------------------------- + +@r depends on (org || report)@ +expression e; +position p; +@@ + + if (e) BUG@p (); + +@script:python depends on org@ +p << r.p; +@@ + +coccilib.org.print_todo(p[0], "WARNING use BUG_ON") + +@script:python depends on report@ +p << r.p; +@@ + +msg="WARNING: Use BUG_ON instead of if condition followed by BUG.\nPlease make sure the condition has no side effects (see conditional BUG_ON definition in include/asm-generic/bug.h)" +coccilib.report.print_report(p[0], msg) + diff --git a/src/net/scripts/coccinelle/misc/cond_no_effect.cocci b/src/net/scripts/coccinelle/misc/cond_no_effect.cocci new file mode 100644 index 0000000..91d16a8 --- /dev/null +++ b/src/net/scripts/coccinelle/misc/cond_no_effect.cocci @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: GPL-2.0-only +///Find conditions where if and else branch are functionally +// identical. +// +// There can be false positives in cases where the positional +// information is used (as with lockdep) or where the identity +// is a placeholder for not yet handled cases. +// Unfortunately there also seems to be a tendency to use +// the last if else/else as a "default behavior" - which some +// might consider a legitimate coding pattern. From discussion +// on kernelnewbies though it seems that this is not really an +// accepted pattern and if at all it would need to be commented +// +// In the Linux kernel it does not seem to actually report +// false positives except for those that were documented as +// being intentional. +// the two known cases are: +// arch/sh/kernel/traps_64.c:read_opcode() +// } else if ((pc & 1) == 0) { +// /* SHcompact */ +// /* TODO : provide handling for this. We don't really support +// user-mode SHcompact yet, and for a kernel fault, this would +// have to come from a module built for SHcompact. */ +// return -EFAULT; +// } else { +// /* misaligned */ +// return -EFAULT; +// } +// fs/kernfs/file.c:kernfs_fop_open() +// * Both paths of the branch look the same. They're supposed to +// * look that way and give @of->mutex different static lockdep keys. +// */ +// if (has_mmap) +// mutex_init(&of->mutex); +// else +// mutex_init(&of->mutex); +// +// All other cases look like bugs or at least lack of documentation +// +// Confidence: Moderate +// Copyright: (C) 2016 Nicholas Mc Guire, OSADL. +// Comments: +// Options: --no-includes --include-headers + +virtual org +virtual report + +@cond@ +statement S1; +position p; +@@ + +* if@p (...) S1 else S1 + +@script:python depends on org@ +p << cond.p; +@@ + +cocci.print_main("WARNING: possible condition with no effect (if == else)",p) + +@script:python depends on report@ +p << cond.p; +@@ + +coccilib.report.print_report(p[0],"WARNING: possible condition with no effect (if == else)") diff --git a/src/net/scripts/coccinelle/misc/cstptr.cocci b/src/net/scripts/coccinelle/misc/cstptr.cocci new file mode 100644 index 0000000..c52e3c8 --- /dev/null +++ b/src/net/scripts/coccinelle/misc/cstptr.cocci @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// PTR_ERR should be applied before its argument is reassigned, typically +/// to NULL +/// +// Confidence: High +// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. +// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual org +virtual report +virtual context + +@r exists@ +expression e,e1; +constant c; +position p1,p2; +@@ + +*e@p1 = c +... when != e = e1 + when != &e + when != true IS_ERR(e) +*PTR_ERR@p2(e) + +@script:python depends on org@ +p1 << r.p1; +p2 << r.p2; +@@ + +cocci.print_main("PTR_ERR",p2) +cocci.print_secs("assignment",p1) + +@script:python depends on report@ +p1 << r.p1; +p2 << r.p2; +@@ + +msg = "ERROR: PTR_ERR applied after initialization to constant on line %s" % (p1[0].line) +coccilib.report.print_report(p2[0],msg) diff --git a/src/net/scripts/coccinelle/misc/doubleinit.cocci b/src/net/scripts/coccinelle/misc/doubleinit.cocci new file mode 100644 index 0000000..2f80d3a --- /dev/null +++ b/src/net/scripts/coccinelle/misc/doubleinit.cocci @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Find duplicate field initializations. This has a high rate of false +/// positives due to #ifdefs, which Coccinelle is not aware of in a structure +/// initialization. +/// +// Confidence: Low +// Copyright: (C) 2010-2012 Nicolas Palix. +// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. +// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: requires at least Coccinelle 0.2.4, lex or parse error otherwise +// Options: --no-includes --include-headers + +virtual org +virtual report + +@r@ +identifier I, s, fld; +position p0,p; +expression E; +@@ + +struct I s =@p0 { ..., .fld@p = E, ...}; + +@s@ +identifier I, s, r.fld; +position r.p0,p; +expression E; +@@ + +struct I s =@p0 { ..., .fld@p = E, ...}; + +@script:python depends on org@ +p0 << r.p0; +fld << r.fld; +ps << s.p; +pr << r.p; +@@ + +if int(ps[0].line) < int(pr[0].line) or (int(ps[0].line) == int(pr[0].line) and int(ps[0].column) < int(pr[0].column)): + cocci.print_main(fld,p0) + cocci.print_secs("s",ps) + cocci.print_secs("r",pr) + +@script:python depends on report@ +p0 << r.p0; +fld << r.fld; +ps << s.p; +pr << r.p; +@@ + +if int(ps[0].line) < int(pr[0].line) or (int(ps[0].line) == int(pr[0].line) and int(ps[0].column) < int(pr[0].column)): + msg = "%s: first occurrence line %s, second occurrence line %s" % (fld,ps[0].line,pr[0].line) + coccilib.report.print_report(p0[0],msg) diff --git a/src/net/scripts/coccinelle/misc/excluded_middle.cocci b/src/net/scripts/coccinelle/misc/excluded_middle.cocci new file mode 100644 index 0000000..ab28393 --- /dev/null +++ b/src/net/scripts/coccinelle/misc/excluded_middle.cocci @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// +/// Condition !A || A && B is equivalent to !A || B. +/// +// Confidence: High +// Copyright: (C) 2020 Denis Efremov ISPRAS +// Options: --no-includes --include-headers + +virtual patch +virtual context +virtual org +virtual report + +@r depends on !patch@ +expression A, B; +position p; +@@ + +* !A || (A &&@p B) + +@depends on patch@ +expression A, B; +@@ + + !A || +- (A && B) ++ B + +@script:python depends on report@ +p << r.p; +@@ + +coccilib.report.print_report(p[0], "WARNING !A || A && B is equivalent to !A || B") + +@script:python depends on org@ +p << r.p; +@@ + +coccilib.org.print_todo(p[0], "WARNING !A || A && B is equivalent to !A || B") diff --git a/src/net/scripts/coccinelle/misc/flexible_array.cocci b/src/net/scripts/coccinelle/misc/flexible_array.cocci new file mode 100644 index 0000000..947fbaf --- /dev/null +++ b/src/net/scripts/coccinelle/misc/flexible_array.cocci @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// +/// Zero-length and one-element arrays are deprecated, see +/// Documentation/process/deprecated.rst +/// Flexible-array members should be used instead. +/// +// +// Confidence: High +// Copyright: (C) 2020 Denis Efremov ISPRAS. +// Comments: +// Options: --no-includes --include-headers + +virtual context +virtual report +virtual org +virtual patch + +@initialize:python@ +@@ +def relevant(positions): + for p in positions: + if "uapi" in p.file: + return False + return True + +@r depends on !patch@ +identifier name, array; +type T; +position p : script:python() { relevant(p) }; +@@ + +( + struct name { + ... +* T array@p[\(0\|1\)]; + }; +| + struct { + ... +* T array@p[\(0\|1\)]; + }; +| + union name { + ... +* T array@p[\(0\|1\)]; + }; +| + union { + ... +* T array@p[\(0\|1\)]; + }; +) + +@depends on patch@ +identifier name, array; +type T; +position p : script:python() { relevant(p) }; +@@ + +( + struct name { + ... + T array@p[ +- 0 + ]; + }; +| + struct { + ... + T array@p[ +- 0 + ]; + }; +) + +@script: python depends on report@ +p << r.p; +@@ + +msg = "WARNING use flexible-array member instead (https://www.kernel.org/doc/html/latest/process/deprecated.html#zero-length-and-one-element-arrays)" +coccilib.report.print_report(p[0], msg) + +@script: python depends on org@ +p << r.p; +@@ + +msg = "WARNING use flexible-array member instead (https://www.kernel.org/doc/html/latest/process/deprecated.html#zero-length-and-one-element-arrays)" +coccilib.org.print_todo(p[0], msg) diff --git a/src/net/scripts/coccinelle/misc/ifaddr.cocci b/src/net/scripts/coccinelle/misc/ifaddr.cocci new file mode 100644 index 0000000..fc92e8f --- /dev/null +++ b/src/net/scripts/coccinelle/misc/ifaddr.cocci @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// The address of a variable or field is likely always to be non-zero. +/// +// Confidence: High +// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. +// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual org +virtual report +virtual context + +@r@ +expression x; +statement S1,S2; +position p; +@@ + +*if@p (&x) + S1 else S2 + +@script:python depends on org@ +p << r.p; +@@ + +cocci.print_main("test of a variable/field address",p) + +@script:python depends on report@ +p << r.p; +@@ + +msg = "ERROR: test of a variable/field address" +coccilib.report.print_report(p[0],msg) diff --git a/src/net/scripts/coccinelle/misc/ifcol.cocci b/src/net/scripts/coccinelle/misc/ifcol.cocci new file mode 100644 index 0000000..da0351e --- /dev/null +++ b/src/net/scripts/coccinelle/misc/ifcol.cocci @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Find confusingly indented code in or after an if. An if branch should +/// be indented. The code following an if should not be indented. +/// Sometimes, code after an if that is indented is actually intended to be +/// part of the if branch. +/// +//# This has a high rate of false positives, because Coccinelle's column +//# calculation does not distinguish between spaces and tabs, so code that +//# is not visually aligned may be considered to be in the same column. +// +// Confidence: Low +// Copyright: (C) 2010 Nicolas Palix, DIKU. +// Copyright: (C) 2010 Julia Lawall, DIKU. +// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual org +virtual report + +@r disable braces4@ +position p1,p2; +statement S1,S2; +@@ + +( +if (...) { ... } +| +if (...) S1@p1 S2@p2 +) + +@script:python depends on org@ +p1 << r.p1; +p2 << r.p2; +@@ + +if (p1[0].column == p2[0].column): + cocci.print_main("branch",p1) + cocci.print_secs("after",p2) + +@script:python depends on report@ +p1 << r.p1; +p2 << r.p2; +@@ + +if (p1[0].column == p2[0].column): + msg = "code aligned with following code on line %s" % (p2[0].line) + coccilib.report.print_report(p1[0],msg) diff --git a/src/net/scripts/coccinelle/misc/irqf_oneshot.cocci b/src/net/scripts/coccinelle/misc/irqf_oneshot.cocci new file mode 100644 index 0000000..7b48287 --- /dev/null +++ b/src/net/scripts/coccinelle/misc/irqf_oneshot.cocci @@ -0,0 +1,113 @@ +// SPDX-License-Identifier: GPL-2.0 +/// Since commit 1c6c69525b40 ("genirq: Reject bogus threaded irq requests") +/// threaded IRQs without a primary handler need to be requested with +/// IRQF_ONESHOT, otherwise the request will fail. +/// +/// So pass the IRQF_ONESHOT flag in this case. +/// +// +// Confidence: Moderate +// Comments: +// Options: --no-includes + +virtual patch +virtual context +virtual org +virtual report + +@r1@ +expression dev, irq, thread_fn; +position p; +@@ +( +request_threaded_irq@p(irq, NULL, thread_fn, +( +IRQF_ONESHOT | ... +| +IRQF_ONESHOT +) +, ...) +| +devm_request_threaded_irq@p(dev, irq, NULL, thread_fn, +( +IRQF_ONESHOT | ... +| +IRQF_ONESHOT +) +, ...) +) + +@r2@ +expression dev, irq, thread_fn, flags, e; +position p != r1.p; +@@ +( +flags = IRQF_ONESHOT | ... +| +flags |= IRQF_ONESHOT | ... +) +... when != flags = e +( +request_threaded_irq@p(irq, NULL, thread_fn, flags, ...); +| +devm_request_threaded_irq@p(dev, irq, NULL, thread_fn, flags, ...); +) + +@depends on patch@ +expression dev, irq, thread_fn, flags; +position p != {r1.p,r2.p}; +@@ +( +request_threaded_irq@p(irq, NULL, thread_fn, +( +-0 ++IRQF_ONESHOT +| +-flags ++flags | IRQF_ONESHOT +) +, ...) +| +devm_request_threaded_irq@p(dev, irq, NULL, thread_fn, +( +-0 ++IRQF_ONESHOT +| +-flags ++flags | IRQF_ONESHOT +) +, ...) +) + +@depends on context@ +expression dev, irq; +position p != {r1.p,r2.p}; +@@ +( +*request_threaded_irq@p(irq, NULL, ...) +| +*devm_request_threaded_irq@p(dev, irq, NULL, ...) +) + + +@match depends on report || org@ +expression dev, irq; +position p != {r1.p,r2.p}; +@@ +( +request_threaded_irq@p(irq, NULL, ...) +| +devm_request_threaded_irq@p(dev, irq, NULL, ...) +) + +@script:python depends on org@ +p << match.p; +@@ +msg = "ERROR: Threaded IRQ with no primary handler requested without IRQF_ONESHOT" +coccilib.org.print_todo(p[0],msg) + +@script:python depends on report@ +p << match.p; +@@ +msg = "ERROR: Threaded IRQ with no primary handler requested without IRQF_ONESHOT" +coccilib.report.print_report(p[0],msg) diff --git a/src/net/scripts/coccinelle/misc/newline_in_nl_msg.cocci b/src/net/scripts/coccinelle/misc/newline_in_nl_msg.cocci new file mode 100644 index 0000000..c175886 --- /dev/null +++ b/src/net/scripts/coccinelle/misc/newline_in_nl_msg.cocci @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// +/// Catch strings ending in newline with GENL_SET_ERR_MSG, NL_SET_ERR_MSG, +/// NL_SET_ERR_MSG_MOD. +/// +// Confidence: Very High +// Copyright: (C) 2020 Intel Corporation +// URL: http://coccinelle.lip6.fr/ +// Options: --no-includes --include-headers + +virtual context +virtual org +virtual report + +@r depends on context || org || report@ +expression e; +constant m; +position p; +@@ + \(GENL_SET_ERR_MSG\|NL_SET_ERR_MSG\|NL_SET_ERR_MSG_MOD\)(e,m@p) + +@script:python@ +m << r.m; +@@ + +if not m.endswith("\\n\""): + cocci.include_match(False) + +@r1 depends on r@ +identifier fname; +expression r.e; +constant r.m; +position r.p; +@@ + fname(e,m@p) + +//---------------------------------------------------------- +// For context mode +//---------------------------------------------------------- + +@depends on context && r@ +identifier r1.fname; +expression r.e; +constant r.m; +@@ +* fname(e,m) + +//---------------------------------------------------------- +// For org mode +//---------------------------------------------------------- + +@script:python depends on org@ +fname << r1.fname; +m << r.m; +p << r.p; +@@ + +if m.endswith("\\n\""): + msg="WARNING avoid newline at end of message in %s" % (fname) + msg_safe=msg.replace("[","@(").replace("]",")") + coccilib.org.print_todo(p[0], msg_safe) + +//---------------------------------------------------------- +// For report mode +//---------------------------------------------------------- + +@script:python depends on report@ +fname << r1.fname; +m << r.m; +p << r.p; +@@ + +if m.endswith("\\n\""): + msg="WARNING avoid newline at end of message in %s" % (fname) + coccilib.report.print_report(p[0], msg) diff --git a/src/net/scripts/coccinelle/misc/noderef.cocci b/src/net/scripts/coccinelle/misc/noderef.cocci new file mode 100644 index 0000000..72de62a --- /dev/null +++ b/src/net/scripts/coccinelle/misc/noderef.cocci @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// sizeof when applied to a pointer typed expression gives the size of +/// the pointer +/// +// Confidence: High +// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. +// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual org +virtual report +virtual context +virtual patch + +@depends on patch@ +expression *x; +expression f; +expression i; +type T; +@@ + +( +x = <+... sizeof( +- x ++ *x + ) ...+> +| +f(...,(T)(x),...,sizeof( +- x ++ *x + ),...) +| +f(...,sizeof( +- x ++ *x + ),...,(T)(x),...) +| +f(...,(T)(x),...,i*sizeof( +- x ++ *x + ),...) +| +f(...,i*sizeof( +- x ++ *x + ),...,(T)(x),...) +) + +@r depends on !patch@ +expression *x; +expression f; +expression i; +position p; +type T; +@@ + +( +*x = <+... sizeof@p(x) ...+> +| +*f(...,(T)(x),...,sizeof@p(x),...) +| +*f(...,sizeof@p(x),...,(T)(x),...) +| +*f(...,(T)(x),...,i*sizeof@p(x),...) +| +*f(...,i*sizeof@p(x),...,(T)(x),...) +) + +@script:python depends on org@ +p << r.p; +@@ + +cocci.print_main("application of sizeof to pointer",p) + +@script:python depends on report@ +p << r.p; +@@ + +msg = "ERROR: application of sizeof to pointer" +coccilib.report.print_report(p[0],msg) diff --git a/src/net/scripts/coccinelle/misc/of_table.cocci b/src/net/scripts/coccinelle/misc/of_table.cocci new file mode 100644 index 0000000..4693ea7 --- /dev/null +++ b/src/net/scripts/coccinelle/misc/of_table.cocci @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: GPL-2.0 +/// Make sure (of/i2c/platform)_device_id tables are NULL terminated +// +// Keywords: of_table i2c_table platform_table +// Confidence: Medium +// Options: --include-headers + +virtual patch +virtual context +virtual org +virtual report + +@depends on context@ +identifier var, arr; +expression E; +@@ +( +struct \(of_device_id \| i2c_device_id \| platform_device_id\) arr[] = { + ..., + { + .var = E, +* } +}; +| +struct \(of_device_id \| i2c_device_id \| platform_device_id\) arr[] = { + ..., +* { ..., E, ... }, +}; +) + +@depends on patch@ +identifier var, arr; +expression E; +@@ +( +struct \(of_device_id \| i2c_device_id \| platform_device_id\) arr[] = { + ..., + { + .var = E, +- } ++ }, ++ { } +}; +| +struct \(of_device_id \| i2c_device_id \| platform_device_id\) arr[] = { + ..., + { ..., E, ... }, ++ { }, +}; +) + +@r depends on org || report@ +position p1; +identifier var, arr; +expression E; +@@ +( +struct \(of_device_id \| i2c_device_id \| platform_device_id\) arr[] = { + ..., + { + .var = E, + } + @p1 +}; +| +struct \(of_device_id \| i2c_device_id \| platform_device_id\) arr[] = { + ..., + { ..., E, ... } + @p1 +}; +) + +@script:python depends on org@ +p1 << r.p1; +arr << r.arr; +@@ + +cocci.print_main(arr,p1) + +@script:python depends on report@ +p1 << r.p1; +arr << r.arr; +@@ + +msg = "%s is not NULL terminated at line %s" % (arr, p1[0].line) +coccilib.report.print_report(p1[0],msg) diff --git a/src/net/scripts/coccinelle/misc/orplus.cocci b/src/net/scripts/coccinelle/misc/orplus.cocci new file mode 100644 index 0000000..52203dc --- /dev/null +++ b/src/net/scripts/coccinelle/misc/orplus.cocci @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Check for constants that are added but are used elsewhere as bitmasks +/// The results should be checked manually to ensure that the nonzero +/// bits in the two constants are actually disjoint. +/// +// Confidence: Moderate +// Copyright: (C) 2013 Julia Lawall, INRIA/LIP6. +// Copyright: (C) 2013 Gilles Muller, INRIA/LIP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual org +virtual report +virtual context + +@r@ +constant c,c1; +identifier i,i1; +position p; +@@ + +( + c1 + c - 1 +| + c1@i1 +@p c@i +) + +@s@ +constant r.c, r.c1; +identifier i; +expression e; +@@ + +( +e | c@i +| +e & c@i +| +e |= c@i +| +e &= c@i +| +e | c1@i +| +e & c1@i +| +e |= c1@i +| +e &= c1@i +) + +@depends on s@ +position r.p; +constant c1,c2; +@@ + +* c1 +@p c2 + +@script:python depends on s && org@ +p << r.p; +@@ + +cocci.print_main("sum of probable bitmasks, consider |",p) + +@script:python depends on s && report@ +p << r.p; +@@ + +msg = "WARNING: sum of probable bitmasks, consider |" +coccilib.report.print_report(p[0],msg) diff --git a/src/net/scripts/coccinelle/misc/returnvar.cocci b/src/net/scripts/coccinelle/misc/returnvar.cocci new file mode 100644 index 0000000..ce0d9ee --- /dev/null +++ b/src/net/scripts/coccinelle/misc/returnvar.cocci @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// +/// Remove unneeded variable used to store return value. +/// +// Confidence: Moderate +// Copyright: (C) 2012 Peter Senna Tschudin, INRIA/LIP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: Comments on code can be deleted if near code that is removed. +// "when strict" can be removed to get more hits, but adds false +// positives +// Options: --no-includes --include-headers + +virtual patch +virtual report +virtual context +virtual org + +@depends on patch@ +type T; +constant C; +identifier ret; +@@ +- T ret = C; +... when != ret + when strict +return +- ret ++ C +; + +@depends on context@ +type T; +constant C; +identifier ret; +@@ +* T ret = C; +... when != ret + when strict +* return ret; + +@r1 depends on report || org@ +type T; +constant C; +identifier ret; +position p1, p2; +@@ +T ret@p1 = C; +... when != ret + when strict +return ret@p2; + +@script:python depends on report@ +p1 << r1.p1; +p2 << r1.p2; +C << r1.C; +ret << r1.ret; +@@ +coccilib.report.print_report(p1[0], "Unneeded variable: \"" + ret + "\". Return \"" + C + "\" on line " + p2[0].line) + +@script:python depends on org@ +p1 << r1.p1; +p2 << r1.p2; +C << r1.C; +ret << r1.ret; +@@ +cocci.print_main("unneeded \"" + ret + "\" variable", p1) +cocci.print_sec("return " + C + " here", p2) diff --git a/src/net/scripts/coccinelle/misc/semicolon.cocci b/src/net/scripts/coccinelle/misc/semicolon.cocci new file mode 100644 index 0000000..a53edb0 --- /dev/null +++ b/src/net/scripts/coccinelle/misc/semicolon.cocci @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// +/// Remove unneeded semicolon. +/// +// Confidence: Moderate +// Copyright: (C) 2012 Peter Senna Tschudin, INRIA/LIP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: Some false positives on empty default cases in switch statements. +// Options: --no-includes --include-headers + +virtual patch +virtual report +virtual context +virtual org + +@r_default@ +position p; +@@ +switch (...) +{ +default: ...;@p +} + +@r_case@ +position p; +@@ +( +switch (...) +{ +case ...:;@p +} +| +switch (...) +{ +case ...:... +case ...:;@p +} +| +switch (...) +{ +case ...:... +case ...: +case ...:;@p +} +) + +@r1@ +statement S; +position p1; +position p != {r_default.p, r_case.p}; +identifier label; +@@ +( +label:; +| +S@p1;@p +) + +@script:python@ +p << r1.p; +p1 << r1.p1; +@@ +if p[0].line != p1[0].line_end: + cocci.include_match(False) + +@depends on patch@ +position r1.p; +@@ +-;@p + +@script:python depends on report@ +p << r1.p; +@@ +coccilib.report.print_report(p[0],"Unneeded semicolon") + +@depends on context@ +position r1.p; +@@ +*;@p + +@script:python depends on org@ +p << r1.p; +@@ +cocci.print_main("Unneeded semicolon",p) diff --git a/src/net/scripts/coccinelle/misc/uninitialized_var.cocci b/src/net/scripts/coccinelle/misc/uninitialized_var.cocci new file mode 100644 index 0000000..8fa845c --- /dev/null +++ b/src/net/scripts/coccinelle/misc/uninitialized_var.cocci @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// +/// Please, don't reintroduce uninitialized_var(). +/// From Documentation/process/deprecated.rst: +/// For any compiler warnings about uninitialized variables, just add +/// an initializer. Using warning-silencing tricks is dangerous as it +/// papers over real bugs (or can in the future), and suppresses unrelated +/// compiler warnings (e.g. "unused variable"). If the compiler thinks it +/// is uninitialized, either simply initialize the variable or make compiler +/// changes. Keep in mind that in most cases, if an initialization is +/// obviously redundant, the compiler's dead-store elimination pass will make +/// sure there are no needless variable writes. +/// +// Confidence: High +// Copyright: (C) 2020 Denis Efremov ISPRAS +// Options: --no-includes --include-headers +// + +virtual context +virtual report +virtual org + +@r@ +identifier var; +type T; +position p; +@@ + +( +* T var =@p var; +| +* T var =@p *(&(var)); +| +* var =@p var +| +* var =@p *(&(var)) +) + +@script:python depends on report@ +p << r.p; +@@ + +coccilib.report.print_report(p[0], + "WARNING this kind of initialization is deprecated (https://www.kernel.org/doc/html/latest/process/deprecated.html#uninitialized-var)") + +@script:python depends on org@ +p << r.p; +@@ + +coccilib.org.print_todo(p[0], + "WARNING this kind of initialization is deprecated (https://www.kernel.org/doc/html/latest/process/deprecated.html#uninitialized-var)") diff --git a/src/net/scripts/coccinelle/misc/warn.cocci b/src/net/scripts/coccinelle/misc/warn.cocci new file mode 100644 index 0000000..e379661 --- /dev/null +++ b/src/net/scripts/coccinelle/misc/warn.cocci @@ -0,0 +1,110 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Use WARN(1,...) rather than printk followed by WARN_ON(1) +/// +// Confidence: High +// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. +// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual patch +virtual context +virtual org +virtual report + +@bad1@ +position p; +@@ + +printk(...); +printk@p(...); +WARN_ON(1); + +@r1 depends on context || report || org@ +position p != bad1.p; +@@ + + printk@p(...); +*WARN_ON(1); + +@script:python depends on org@ +p << r1.p; +@@ + +cocci.print_main("printk + WARN_ON can be just WARN",p) + +@script:python depends on report@ +p << r1.p; +@@ + +msg = "SUGGESTION: printk + WARN_ON can be just WARN" +coccilib.report.print_report(p[0],msg) + +@ok1 depends on patch@ +expression list es; +position p != bad1.p; +@@ + +-printk@p( ++WARN(1, + es); +-WARN_ON(1); + +@depends on patch@ +expression list ok1.es; +@@ + +if (...) +- { + WARN(1,es); +- } + +// -------------------------------------------------------------------- + +@bad2@ +position p; +@@ + +printk(...); +printk@p(...); +WARN_ON_ONCE(1); + +@r2 depends on context || report || org@ +position p != bad1.p; +@@ + + printk@p(...); +*WARN_ON_ONCE(1); + +@script:python depends on org@ +p << r2.p; +@@ + +cocci.print_main("printk + WARN_ON_ONCE can be just WARN_ONCE",p) + +@script:python depends on report@ +p << r2.p; +@@ + +msg = "SUGGESTION: printk + WARN_ON_ONCE can be just WARN_ONCE" +coccilib.report.print_report(p[0],msg) + +@ok2 depends on patch@ +expression list es; +position p != bad2.p; +@@ + +-printk@p( ++WARN_ONCE(1, + es); +-WARN_ON_ONCE(1); + +@depends on patch@ +expression list ok2.es; +@@ + +if (...) +- { + WARN_ONCE(1,es); +- } diff --git a/src/net/scripts/coccinelle/null/badzero.cocci b/src/net/scripts/coccinelle/null/badzero.cocci new file mode 100644 index 0000000..882dd65 --- /dev/null +++ b/src/net/scripts/coccinelle/null/badzero.cocci @@ -0,0 +1,239 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Compare pointer-typed values to NULL rather than 0 +/// +//# This makes an effort to choose between !x and x == NULL. !x is used +//# if it has previously been used with the function used to initialize x. +//# This relies on type information. More type information can be obtained +//# using the option -all_includes and the option -I to specify an +//# include path. +// +// Confidence: High +// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. +// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Requires: 1.0.0 +// Options: + +virtual patch +virtual context +virtual org +virtual report + +@initialize:ocaml@ +@@ +let negtable = Hashtbl.create 101 + +@depends on patch@ +expression *E; +identifier f; +@@ + +( + (E = f(...)) == +- 0 ++ NULL +| + (E = f(...)) != +- 0 ++ NULL +| +- 0 ++ NULL + == (E = f(...)) +| +- 0 ++ NULL + != (E = f(...)) +) + + +@t1 depends on !patch@ +expression *E; +identifier f; +position p; +@@ + +( + (E = f(...)) == +* 0@p +| + (E = f(...)) != +* 0@p +| +* 0@p + == (E = f(...)) +| +* 0@p + != (E = f(...)) +) + +@script:python depends on org@ +p << t1.p; +@@ + +coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0") + +@script:python depends on report@ +p << t1.p; +@@ + +coccilib.report.print_report(p[0], "WARNING comparing pointer to 0") + +// Tests of returned values + +@s@ +identifier f; +expression E,E1; +@@ + + E = f(...) + ... when != E = E1 + !E + +@script:ocaml depends on s@ +f << s.f; +@@ + +try let _ = Hashtbl.find negtable f in () +with Not_found -> Hashtbl.add negtable f () + +@ r disable is_zero,isnt_zero exists @ +expression *E; +identifier f; +@@ + +E = f(...) +... +(E == 0 +|E != 0 +|0 == E +|0 != E +) + +@script:ocaml@ +f << r.f; +@@ + +try let _ = Hashtbl.find negtable f in () +with Not_found -> include_match false + +// This rule may lead to inconsistent path problems, if E is defined in two +// places +@ depends on patch disable is_zero,isnt_zero @ +expression *E; +expression E1; +identifier r.f; +@@ + +E = f(...) +<... +( +- E == 0 ++ !E +| +- E != 0 ++ E +| +- 0 == E ++ !E +| +- 0 != E ++ E +) +...> +?E = E1 + +@t2 depends on !patch disable is_zero,isnt_zero @ +expression *E; +expression E1; +identifier r.f; +position p1; +position p2; +@@ + +E = f(...) +<... +( +* E == 0@p1 +| +* E != 0@p2 +| +* 0@p1 == E +| +* 0@p1 != E +) +...> +?E = E1 + +@script:python depends on org@ +p << t2.p1; +@@ + +coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0, suggest !E") + +@script:python depends on org@ +p << t2.p2; +@@ + +coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0") + +@script:python depends on report@ +p << t2.p1; +@@ + +coccilib.report.print_report(p[0], "WARNING comparing pointer to 0, suggest !E") + +@script:python depends on report@ +p << t2.p2; +@@ + +coccilib.report.print_report(p[0], "WARNING comparing pointer to 0") + +@ depends on patch disable is_zero,isnt_zero @ +expression *E; +@@ + +( + E == +- 0 ++ NULL +| + E != +- 0 ++ NULL +| +- 0 ++ NULL + == E +| +- 0 ++ NULL + != E +) + +@ t3 depends on !patch disable is_zero,isnt_zero @ +expression *E; +position p; +@@ + +( +* E == 0@p +| +* E != 0@p +| +* 0@p == E +| +* 0@p != E +) + +@script:python depends on org@ +p << t3.p; +@@ + +coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0") + +@script:python depends on report@ +p << t3.p; +@@ + +coccilib.report.print_report(p[0], "WARNING comparing pointer to 0") diff --git a/src/net/scripts/coccinelle/null/deref_null.cocci b/src/net/scripts/coccinelle/null/deref_null.cocci new file mode 100644 index 0000000..98f1e7f --- /dev/null +++ b/src/net/scripts/coccinelle/null/deref_null.cocci @@ -0,0 +1,283 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// +/// A variable is dereferenced under a NULL test. +/// Even though it is known to be NULL. +/// +// Confidence: Moderate +// Copyright: (C) 2010 Nicolas Palix, DIKU. +// Copyright: (C) 2010 Julia Lawall, DIKU. +// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: -I ... -all_includes can give more complete results +// Options: + +virtual context +virtual org +virtual report + +// The following two rules are separate, because both can match a single +// expression in different ways +@pr1 expression@ +expression E; +identifier f; +position p1; +@@ + + (E != NULL && ...) ? <+...E->f@p1...+> : ... + +@pr2 expression@ +expression E; +identifier f; +position p2; +@@ + +( + (E != NULL) && ... && <+...E->f@p2...+> +| + (E == NULL) || ... || <+...E->f@p2...+> +| + sizeof(<+...E->f@p2...+>) +) + +@ifm@ +expression *E; +statement S1,S2; +position p1; +@@ + +if@p1 ((E == NULL && ...) || ...) S1 else S2 + +// For org and report modes + +@r depends on !context && (org || report) exists@ +expression subE <= ifm.E; +expression *ifm.E; +expression E1,E2; +identifier f; +statement S1,S2,S3,S4; +iterator iter; +position p!={pr1.p1,pr2.p2}; +position ifm.p1; +@@ + +if@p1 ((E == NULL && ...) || ...) +{ + ... when != if (...) S1 else S2 +( + iter(subE,...) S4 // no use +| + list_remove_head(E2,subE,...) +| + subE = E1 +| + for(subE = E1;...;...) S4 +| + subE++ +| + ++subE +| + --subE +| + subE-- +| + &subE +| + E->f@p // bad use +) + ... when any + return ...; +} +else S3 + +@script:python depends on !context && !org && report@ +p << r.p; +p1 << ifm.p1; +x << ifm.E; +@@ + +msg="ERROR: %s is NULL but dereferenced." % (x) +coccilib.report.print_report(p[0], msg) +cocci.include_match(False) + +@script:python depends on !context && org && !report@ +p << r.p; +p1 << ifm.p1; +x << ifm.E; +@@ + +msg="ERROR: %s is NULL but dereferenced." % (x) +msg_safe=msg.replace("[","@(").replace("]",")") +cocci.print_main(msg_safe,p) +cocci.include_match(False) + +@s depends on !context && (org || report) exists@ +expression subE <= ifm.E; +expression *ifm.E; +expression E1,E2; +identifier f; +statement S1,S2,S3,S4; +iterator iter; +position p!={pr1.p1,pr2.p2}; +position ifm.p1; +@@ + +if@p1 ((E == NULL && ...) || ...) +{ + ... when != if (...) S1 else S2 +( + iter(subE,...) S4 // no use +| + list_remove_head(E2,subE,...) +| + subE = E1 +| + for(subE = E1;...;...) S4 +| + subE++ +| + ++subE +| + --subE +| + subE-- +| + &subE +| + E->f@p // bad use +) + ... when any +} +else S3 + +@script:python depends on !context && !org && report@ +p << s.p; +p1 << ifm.p1; +x << ifm.E; +@@ + +msg="ERROR: %s is NULL but dereferenced." % (x) +coccilib.report.print_report(p[0], msg) + +@script:python depends on !context && org && !report@ +p << s.p; +p1 << ifm.p1; +x << ifm.E; +@@ + +msg="ERROR: %s is NULL but dereferenced." % (x) +msg_safe=msg.replace("[","@(").replace("]",")") +cocci.print_main(msg_safe,p) + +// For context mode + +@depends on context && !org && !report exists@ +expression subE <= ifm.E; +expression *ifm.E; +expression E1,E2; +identifier f; +statement S1,S2,S3,S4; +iterator iter; +position p!={pr1.p1,pr2.p2}; +position ifm.p1; +@@ + +if@p1 ((E == NULL && ...) || ...) +{ + ... when != if (...) S1 else S2 +( + iter(subE,...) S4 // no use +| + list_remove_head(E2,subE,...) +| + subE = E1 +| + for(subE = E1;...;...) S4 +| + subE++ +| + ++subE +| + --subE +| + subE-- +| + &subE +| +* E->f@p // bad use +) + ... when any + return ...; +} +else S3 + +// The following three rules are duplicates of ifm, pr1 and pr2 respectively. +// It is need because the previous rule as already made a "change". + +@pr11 depends on context && !org && !report expression@ +expression E; +identifier f; +position p1; +@@ + + (E != NULL && ...) ? <+...E->f@p1...+> : ... + +@pr12 depends on context && !org && !report expression@ +expression E; +identifier f; +position p2; +@@ + +( + (E != NULL) && ... && <+...E->f@p2...+> +| + (E == NULL) || ... || <+...E->f@p2...+> +| + sizeof(<+...E->f@p2...+>) +) + +@ifm1 depends on context && !org && !report@ +expression *E; +statement S1,S2; +position p1; +@@ + +if@p1 ((E == NULL && ...) || ...) S1 else S2 + +@depends on context && !org && !report exists@ +expression subE <= ifm1.E; +expression *ifm1.E; +expression E1,E2; +identifier f; +statement S1,S2,S3,S4; +iterator iter; +position p!={pr11.p1,pr12.p2}; +position ifm1.p1; +@@ + +if@p1 ((E == NULL && ...) || ...) +{ + ... when != if (...) S1 else S2 +( + iter(subE,...) S4 // no use +| + list_remove_head(E2,subE,...) +| + subE = E1 +| + for(subE = E1;...;...) S4 +| + subE++ +| + ++subE +| + --subE +| + subE-- +| + &subE +| +* E->f@p // bad use +) + ... when any +} +else S3 diff --git a/src/net/scripts/coccinelle/null/eno.cocci b/src/net/scripts/coccinelle/null/eno.cocci new file mode 100644 index 0000000..81584ff --- /dev/null +++ b/src/net/scripts/coccinelle/null/eno.cocci @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// The various basic memory allocation functions don't return ERR_PTR +/// +// Confidence: High +// Copyright: (C) 2010-2012 Nicolas Palix. +// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. +// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual patch +virtual context +virtual org +virtual report + +@depends on patch@ +expression x,E; +@@ + +x = \(kmalloc\|kzalloc\|kcalloc\|kmem_cache_alloc\|kmem_cache_zalloc\|kmem_cache_alloc_node\|kmalloc_node\|kzalloc_node\)(...) +... when != x = E +- IS_ERR(x) ++ !x + +@r depends on !patch exists@ +expression x,E; +position p1,p2; +@@ + +*x = \(kmalloc@p1\|kzalloc@p1\|kcalloc@p1\|kmem_cache_alloc@p1\|kmem_cache_zalloc@p1\|kmem_cache_alloc_node@p1\|kmalloc_node@p1\|kzalloc_node@p1\)(...) +... when != x = E +* IS_ERR@p2(x) + +@script:python depends on org@ +p1 << r.p1; +p2 << r.p2; +@@ + +cocci.print_main("alloc call",p1) +cocci.print_secs("IS_ERR that should be NULL tests",p2) + +@script:python depends on report@ +p1 << r.p1; +p2 << r.p2; +@@ + +msg = "ERROR: allocation function on line %s returns NULL not ERR_PTR on failure" % (p1[0].line) +coccilib.report.print_report(p2[0], msg) diff --git a/src/net/scripts/coccinelle/null/kmerr.cocci b/src/net/scripts/coccinelle/null/kmerr.cocci new file mode 100644 index 0000000..d0e004d --- /dev/null +++ b/src/net/scripts/coccinelle/null/kmerr.cocci @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// This semantic patch looks for kmalloc etc that are not followed by a +/// NULL check. It only gives a report in the case where there is some +/// error handling code later in the function, which may be helpful +/// in determining what the error handling code for the call to kmalloc etc +/// should be. +/// +// Confidence: High +// Copyright: (C) 2010 Nicolas Palix, DIKU. +// Copyright: (C) 2010 Julia Lawall, DIKU. +// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual context +virtual org +virtual report + +@withtest@ +expression x; +position p; +identifier f,fld; +@@ + +x@p = f(...); +... when != x->fld +\(x == NULL \| x != NULL\) + +@fixed depends on context && !org && !report@ +expression x,x1; +position p1 != withtest.p; +statement S; +position any withtest.p; +identifier f; +@@ + +*x@p1 = \(kmalloc\|kzalloc\|kcalloc\)(...); +... +*x1@p = f(...); +if (!x1) S + +// ------------------------------------------------------------------------ + +@rfixed depends on (org || report) && !context exists@ +expression x,x1; +position p1 != withtest.p; +position p2; +statement S; +position any withtest.p; +identifier f; +@@ + +x@p1 = \(kmalloc\|kzalloc\|kcalloc\)(...); +... +x1@p = f@p2(...); +if (!x1) S + +@script:python depends on org@ +p1 << rfixed.p1; +p2 << rfixed.p2; +@@ + +cocci.print_main("alloc call",p1) +cocci.print_secs("possible model",p2) + +@script:python depends on report@ +p1 << rfixed.p1; +p2 << rfixed.p2; +@@ + +msg = "alloc with no test, possible model on line %s" % (p2[0].line) +coccilib.report.print_report(p1[0],msg) diff --git a/src/net/scripts/coccinelle/tests/doublebitand.cocci b/src/net/scripts/coccinelle/tests/doublebitand.cocci new file mode 100644 index 0000000..0f0b94e --- /dev/null +++ b/src/net/scripts/coccinelle/tests/doublebitand.cocci @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Find bit operations that include the same argument more than once +//# One source of false positives is when the argument performs a side +//# effect. Another source of false positives is when a neutral value +//# such as 0 for | is used to indicate no information, to maintain the +//# same structure as other similar expressions +/// +// Confidence: Moderate +// Copyright: (C) 2010 Nicolas Palix, DIKU. +// Copyright: (C) 2010 Julia Lawall, DIKU. +// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual context +virtual org +virtual report + +@r expression@ +expression E; +position p; +@@ + +( +* E@p + & ... & E +| +* E@p + | ... | E +| +* E@p + & ... & !E +| +* E@p + | ... | !E +| +* !E@p + & ... & E +| +* !E@p + | ... | E +) + +@script:python depends on org@ +p << r.p; +@@ + +cocci.print_main("duplicated argument to & or |",p) + +@script:python depends on report@ +p << r.p; +@@ + +coccilib.report.print_report(p[0],"duplicated argument to & or |") diff --git a/src/net/scripts/coccinelle/tests/doubletest.cocci b/src/net/scripts/coccinelle/tests/doubletest.cocci new file mode 100644 index 0000000..b35519c --- /dev/null +++ b/src/net/scripts/coccinelle/tests/doubletest.cocci @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Find &&/|| operations that include the same argument more than once +//# A common source of false positives is when the expression, or +//# another expresssion in the same && or || operation, performs a +//# side effect. +/// +// Confidence: Moderate +// Copyright: (C) 2010 Nicolas Palix, DIKU. +// Copyright: (C) 2010 Julia Lawall, DIKU. +// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual context +virtual org +virtual report + +@r expression@ +expression E; +position p; +@@ + +( + E@p || ... || E +| + E@p && ... && E +) + +@bad@ +expression r.E,e1,e2,fn; +position r.p; +assignment operator op; +@@ + +( +E@p +& + <+... \(fn(...)\|e1 op e2\|e1++\|e1--\|++e1\|--e1\) ...+> +) + +@depends on context && !bad@ +expression r.E; +position r.p; +@@ + +*E@p + +@script:python depends on org && !bad@ +p << r.p; +@@ + +cocci.print_main("duplicated argument to && or ||",p) + +@script:python depends on report && !bad@ +p << r.p; +@@ + +coccilib.report.print_report(p[0],"duplicated argument to && or ||") diff --git a/src/net/scripts/coccinelle/tests/odd_ptr_err.cocci b/src/net/scripts/coccinelle/tests/odd_ptr_err.cocci new file mode 100644 index 0000000..11d4e2b --- /dev/null +++ b/src/net/scripts/coccinelle/tests/odd_ptr_err.cocci @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// PTR_ERR should access the value just tested by IS_ERR +//# There can be false positives in the patch case, where it is the call to +//# IS_ERR that is wrong. +/// +// Confidence: High +// Copyright: (C) 2012, 2015 Julia Lawall, INRIA. +// Copyright: (C) 2012, 2015 Gilles Muller, INRIA. +// URL: http://coccinelle.lip6.fr/ +// Options: --no-includes --include-headers + +virtual patch +virtual context +virtual org +virtual report + +@ok1 exists@ +expression x,e; +position p; +@@ + +if (IS_ERR(x=e) || ...) { + <... + PTR_ERR@p(x) + ...> +} + +@ok2 exists@ +expression x,e1,e2; +position p; +@@ + +if (IS_ERR(x) || ...) { + <... +( + PTR_ERR@p(\(e1 ? e2 : x\|e1 ? x : e2\)) +| + PTR_ERR@p(x) +) + ...> +} + +@r1 depends on patch && !context && !org && !report exists@ +expression x,y; +position p != {ok1.p,ok2.p}; +@@ + +if (IS_ERR(x) || ...) { + ... when any + when != IS_ERR(...) +( + PTR_ERR(x) +| + PTR_ERR@p( +- y ++ x + ) +) + ... when any +} + +// ---------------------------------------------------------------------------- + +@r1_context depends on !patch && (context || org || report) exists@ +position p != {ok1.p,ok2.p}; +expression x, y; +position j0, j1; +@@ + +if (IS_ERR@j0(x) || ...) { + ... when any + when != IS_ERR(...) +( + PTR_ERR(x) +| + PTR_ERR@j1@p( + y + ) +) + ... when any +} + +@r1_disj depends on !patch && (context || org || report) exists@ +position p != {ok1.p,ok2.p}; +expression x, y; +position r1_context.j0, r1_context.j1; +@@ + +* if (IS_ERR@j0(x) || ...) { + ... when any + when != IS_ERR(...) +* PTR_ERR@j1@p( + y + ) + ... when any +} + +// ---------------------------------------------------------------------------- + +@script:python r1_org depends on org@ +j0 << r1_context.j0; +j1 << r1_context.j1; +@@ + +msg = "inconsistent IS_ERR and PTR_ERR" +coccilib.org.print_todo(j0[0], msg) +coccilib.org.print_link(j1[0], "") + +// ---------------------------------------------------------------------------- + +@script:python r1_report depends on report@ +j0 << r1_context.j0; +j1 << r1_context.j1; +@@ + +msg = "inconsistent IS_ERR and PTR_ERR on line %s." % (j1[0].line) +coccilib.report.print_report(j0[0], msg) + diff --git a/src/net/scripts/coccinelle/tests/unsigned_lesser_than_zero.cocci b/src/net/scripts/coccinelle/tests/unsigned_lesser_than_zero.cocci new file mode 100644 index 0000000..91e286a --- /dev/null +++ b/src/net/scripts/coccinelle/tests/unsigned_lesser_than_zero.cocci @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Unsigned expressions cannot be lesser than zero. Presence of +/// comparisons 'unsigned (<|<=|>|>=) 0' often indicates a bug, +/// usually wrong type of variable. +/// +/// To reduce number of false positives following tests have been added: +/// - parts of range checks are skipped, eg. "if (u < 0 || u > 15) ...", +/// developers prefer to keep such code, +/// - comparisons "<= 0" and "> 0" are performed only on results of +/// signed functions/macros, +/// - hardcoded list of signed functions/macros with always non-negative +/// result is used to avoid false positives difficult to detect by other ways +/// +// Confidence: Average +// Copyright: (C) 2015 Andrzej Hajda, Samsung Electronics Co., Ltd. +// URL: http://coccinelle.lip6.fr/ +// Options: --all-includes + +virtual context +virtual org +virtual report + +@r_cmp@ +position p; +typedef bool, u8, u16, u32, u64; +{unsigned char, unsigned short, unsigned int, unsigned long, unsigned long long, + size_t, bool, u8, u16, u32, u64} v; +expression e; +@@ + + \( v = e \| &v \) + ... + (\( v@p < 0 \| v@p <= 0 \| v@p >= 0 \| v@p > 0 \)) + +@r@ +position r_cmp.p; +typedef s8, s16, s32, s64; +{char, short, int, long, long long, ssize_t, s8, s16, s32, s64} vs; +expression c, e, v; +identifier f !~ "^(ata_id_queue_depth|btrfs_copy_from_user|dma_map_sg|dma_map_sg_attrs|fls|fls64|gameport_time|get_write_extents|nla_len|ntoh24|of_flat_dt_match|of_get_child_count|uart_circ_chars_pending|[A-Z0-9_]+)$"; +@@ + +( + v = f(...)@vs; + ... when != v = e; +* (\( v@p <=@e 0 \| v@p >@e 0 \)) + ... when any +| +( + (\( v@p < 0 \| v@p <= 0 \)) || ... || (\( v >= c \| v > c \)) +| + (\( v >= c \| v > c \)) || ... || (\( v@p < 0 \| v@p <= 0 \)) +| + (\( v@p >= 0 \| v@p > 0 \)) && ... && (\( v < c \| v <= c \)) +| + ((\( v < c \| v <= c \) && ... && \( v@p >= 0 \| v@p > 0 \))) +| +* (\( v@p <@e 0 \| v@p >=@e 0 \)) +) +) + +@script:python depends on org@ +p << r_cmp.p; +e << r.e; +@@ + +msg = "WARNING: Unsigned expression compared with zero: %s" % (e) +coccilib.org.print_todo(p[0], msg) + +@script:python depends on report@ +p << r_cmp.p; +e << r.e; +@@ + +msg = "WARNING: Unsigned expression compared with zero: %s" % (e) +coccilib.report.print_report(p[0], msg) diff --git a/src/net/scripts/config b/src/net/scripts/config new file mode 100755 index 0000000..8c8d7c3 --- /dev/null +++ b/src/net/scripts/config @@ -0,0 +1,229 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: GPL-2.0 +# Manipulate options in a .config file from the command line + +myname=${0##*/} + +# If no prefix forced, use the default CONFIG_ +CONFIG_="${CONFIG_-CONFIG_}" + +# We use an uncommon delimiter for sed substitutions +SED_DELIM=$(echo -en "\001") + +usage() { + cat >&2 <<EOL +Manipulate options in a .config file from the command line. +Usage: +$myname options command ... +commands: + --enable|-e option Enable option + --disable|-d option Disable option + --module|-m option Turn option into a module + --set-str option string + Set option to "string" + --set-val option value + Set option to value + --undefine|-u option Undefine option + --state|-s option Print state of option (n,y,m,undef) + + --enable-after|-E beforeopt option + Enable option directly after other option + --disable-after|-D beforeopt option + Disable option directly after other option + --module-after|-M beforeopt option + Turn option into module directly after other option + + commands can be repeated multiple times + +options: + --file config-file .config file to change (default .config) + --keep-case|-k Keep next symbols' case (dont' upper-case it) + +$myname doesn't check the validity of the .config file. This is done at next +make time. + +By default, $myname will upper-case the given symbol. Use --keep-case to keep +the case of all following symbols unchanged. + +$myname uses 'CONFIG_' as the default symbol prefix. Set the environment +variable CONFIG_ to the prefix to use. Eg.: CONFIG_="FOO_" $myname ... +EOL + exit 1 +} + +checkarg() { + ARG="$1" + if [ "$ARG" = "" ] ; then + usage + fi + case "$ARG" in + ${CONFIG_}*) + ARG="${ARG/${CONFIG_}/}" + ;; + esac + if [ "$MUNGE_CASE" = "yes" ] ; then + ARG="`echo $ARG | tr a-z A-Z`" + fi +} + +txt_append() { + local anchor="$1" + local insert="$2" + local infile="$3" + local tmpfile="$infile.swp" + + # sed append cmd: 'a\' + newline + text + newline + cmd="$(printf "a\\%b$insert" "\n")" + + sed -e "/$anchor/$cmd" "$infile" >"$tmpfile" + # replace original file with the edited one + mv "$tmpfile" "$infile" +} + +txt_subst() { + local before="$1" + local after="$2" + local infile="$3" + local tmpfile="$infile.swp" + + sed -e "s$SED_DELIM$before$SED_DELIM$after$SED_DELIM" "$infile" >"$tmpfile" + # replace original file with the edited one + mv "$tmpfile" "$infile" +} + +txt_delete() { + local text="$1" + local infile="$2" + local tmpfile="$infile.swp" + + sed -e "/$text/d" "$infile" >"$tmpfile" + # replace original file with the edited one + mv "$tmpfile" "$infile" +} + +set_var() { + local name=$1 new=$2 before=$3 + + name_re="^($name=|# $name is not set)" + before_re="^($before=|# $before is not set)" + if test -n "$before" && grep -Eq "$before_re" "$FN"; then + txt_append "^$before=" "$new" "$FN" + txt_append "^# $before is not set" "$new" "$FN" + elif grep -Eq "$name_re" "$FN"; then + txt_subst "^$name=.*" "$new" "$FN" + txt_subst "^# $name is not set" "$new" "$FN" + else + echo "$new" >>"$FN" + fi +} + +undef_var() { + local name=$1 + + txt_delete "^$name=" "$FN" + txt_delete "^# $name is not set" "$FN" +} + +if [ "$1" = "--file" ]; then + FN="$2" + if [ "$FN" = "" ] ; then + usage + fi + shift 2 +else + FN=.config +fi + +if [ "$1" = "" ] ; then + usage +fi + +MUNGE_CASE=yes +while [ "$1" != "" ] ; do + CMD="$1" + shift + case "$CMD" in + --keep-case|-k) + MUNGE_CASE=no + continue + ;; + --refresh) + ;; + --*-after|-E|-D|-M) + checkarg "$1" + A=$ARG + checkarg "$2" + B=$ARG + shift 2 + ;; + -*) + checkarg "$1" + shift + ;; + esac + case "$CMD" in + --enable|-e) + set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=y" + ;; + + --disable|-d) + set_var "${CONFIG_}$ARG" "# ${CONFIG_}$ARG is not set" + ;; + + --module|-m) + set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=m" + ;; + + --set-str) + # sed swallows one level of escaping, so we need double-escaping + set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=\"${1//\"/\\\\\"}\"" + shift + ;; + + --set-val) + set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=$1" + shift + ;; + --undefine|-u) + undef_var "${CONFIG_}$ARG" + ;; + + --state|-s) + if grep -q "# ${CONFIG_}$ARG is not set" $FN ; then + echo n + else + V="$(grep "^${CONFIG_}$ARG=" $FN)" + if [ $? != 0 ] ; then + echo undef + else + V="${V/#${CONFIG_}$ARG=/}" + V="${V/#\"/}" + V="${V/%\"/}" + V="${V//\\\"/\"}" + echo "${V}" + fi + fi + ;; + + --enable-after|-E) + set_var "${CONFIG_}$B" "${CONFIG_}$B=y" "${CONFIG_}$A" + ;; + + --disable-after|-D) + set_var "${CONFIG_}$B" "# ${CONFIG_}$B is not set" "${CONFIG_}$A" + ;; + + --module-after|-M) + set_var "${CONFIG_}$B" "${CONFIG_}$B=m" "${CONFIG_}$A" + ;; + + # undocumented because it ignores --file (fixme) + --refresh) + yes "" | make oldconfig + ;; + + *) + usage + ;; + esac +done diff --git a/src/net/scripts/const_structs.checkpatch b/src/net/scripts/const_structs.checkpatch new file mode 100644 index 0000000..1aae4f4 --- /dev/null +++ b/src/net/scripts/const_structs.checkpatch @@ -0,0 +1,68 @@ +acpi_dock_ops +address_space_operations +backlight_ops +block_device_operations +clk_ops +comedi_lrange +component_ops +dentry_operations +dev_pm_ops +dma_map_ops +driver_info +drm_connector_funcs +drm_encoder_funcs +drm_encoder_helper_funcs +ethtool_ops +extent_io_ops +file_lock_operations +file_operations +hv_ops +ide_dma_ops +ide_port_ops +inode_operations +intel_dvo_dev_ops +irq_domain_ops +item_operations +iwl_cfg +iwl_ops +kgdb_arch +kgdb_io +kset_uevent_ops +lock_manager_operations +machine_desc +microcode_ops +mlxsw_reg_info +mtrr_ops +neigh_ops +net_device_ops +nlmsvc_binding +nvkm_device_chip +of_device_id +pci_raw_ops +phy_ops +pinctrl_ops +pinmux_ops +pipe_buf_operations +platform_hibernation_ops +platform_suspend_ops +proto_ops +regmap_access_table +regulator_ops +rpc_pipe_ops +rtc_class_ops +sd_desc +seq_operations +sirfsoc_padmux +snd_ac97_build_ops +snd_soc_component_driver +soc_pcmcia_socket_ops +stacktrace_ops +sysfs_ops +tty_operations +uart_ops +usb_mon_operations +v4l2_ctrl_ops +v4l2_ioctl_ops +vm_operations_struct +wacom_features +wd_ops diff --git a/src/net/scripts/decode_stacktrace.sh b/src/net/scripts/decode_stacktrace.sh new file mode 100755 index 0000000..9039834 --- /dev/null +++ b/src/net/scripts/decode_stacktrace.sh @@ -0,0 +1,225 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 +# (c) 2014, Sasha Levin <sasha.levin@oracle.com> +#set -x + +if [[ $# < 1 ]]; then + echo "Usage:" + echo " $0 -r <release> | <vmlinux> [base path] [modules path]" + exit 1 +fi + +if [[ $1 == "-r" ]] ; then + vmlinux="" + basepath="auto" + modpath="" + release=$2 + + for fn in {,/usr/lib/debug}/boot/vmlinux-$release{,.debug} /lib/modules/$release{,/build}/vmlinux ; do + if [ -e "$fn" ] ; then + vmlinux=$fn + break + fi + done + + if [[ $vmlinux == "" ]] ; then + echo "ERROR! vmlinux image for release $release is not found" >&2 + exit 2 + fi +else + vmlinux=$1 + basepath=${2-auto} + modpath=$3 + release="" +fi + +declare -A cache +declare -A modcache + +find_module() { + if [[ "$modpath" != "" ]] ; then + for fn in $(find "$modpath" -name "${module//_/[-_]}.ko*") ; do + if readelf -WS "$fn" | grep -qwF .debug_line ; then + echo $fn + return + fi + done + return 1 + fi + + modpath=$(dirname "$vmlinux") + find_module && return + + if [[ $release == "" ]] ; then + release=$(gdb -ex 'print init_uts_ns.name.release' -ex 'quit' -quiet -batch "$vmlinux" | sed -n 's/\$1 = "\(.*\)".*/\1/p') + fi + + for dn in {/usr/lib/debug,}/lib/modules/$release ; do + if [ -e "$dn" ] ; then + modpath="$dn" + find_module && return + fi + done + + modpath="" + return 1 +} + +parse_symbol() { + # The structure of symbol at this point is: + # ([name]+[offset]/[total length]) + # + # For example: + # do_basic_setup+0x9c/0xbf + + if [[ $module == "" ]] ; then + local objfile=$vmlinux + elif [[ "${modcache[$module]+isset}" == "isset" ]]; then + local objfile=${modcache[$module]} + else + local objfile=$(find_module) + if [[ $objfile == "" ]] ; then + echo "WARNING! Modules path isn't set, but is needed to parse this symbol" >&2 + return + fi + modcache[$module]=$objfile + fi + + # Remove the englobing parenthesis + symbol=${symbol#\(} + symbol=${symbol%\)} + + # Strip segment + local segment + if [[ $symbol == *:* ]] ; then + segment=${symbol%%:*}: + symbol=${symbol#*:} + fi + + # Strip the symbol name so that we could look it up + local name=${symbol%+*} + + # Use 'nm vmlinux' to figure out the base address of said symbol. + # It's actually faster to call it every time than to load it + # all into bash. + if [[ "${cache[$module,$name]+isset}" == "isset" ]]; then + local base_addr=${cache[$module,$name]} + else + local base_addr=$(nm "$objfile" | awk '$3 == "'$name'" && ($2 == "t" || $2 == "T") {print $1; exit}') + if [[ $base_addr == "" ]] ; then + # address not found + return + fi + cache[$module,$name]="$base_addr" + fi + # Let's start doing the math to get the exact address into the + # symbol. First, strip out the symbol total length. + local expr=${symbol%/*} + + # Now, replace the symbol name with the base address we found + # before. + expr=${expr/$name/0x$base_addr} + + # Evaluate it to find the actual address + expr=$((expr)) + local address=$(printf "%x\n" "$expr") + + # Pass it to addr2line to get filename and line number + # Could get more than one result + if [[ "${cache[$module,$address]+isset}" == "isset" ]]; then + local code=${cache[$module,$address]} + else + local code=$(${CROSS_COMPILE}addr2line -i -e "$objfile" "$address") + cache[$module,$address]=$code + fi + + # addr2line doesn't return a proper error code if it fails, so + # we detect it using the value it prints so that we could preserve + # the offset/size into the function and bail out + if [[ $code == "??:0" ]]; then + return + fi + + # Strip out the base of the path on each line + code=$(while read -r line; do echo "${line#$basepath/}"; done <<< "$code") + + # In the case of inlines, move everything to same line + code=${code//$'\n'/' '} + + # Replace old address with pretty line numbers + symbol="$segment$name ($code)" +} + +decode_code() { + local scripts=`dirname "${BASH_SOURCE[0]}"` + + echo "$1" | $scripts/decodecode +} + +handle_line() { + local words + + # Tokenize + read -a words <<<"$1" + + # Remove hex numbers. Do it ourselves until it happens in the + # kernel + + # We need to know the index of the last element before we + # remove elements because arrays are sparse + local last=$(( ${#words[@]} - 1 )) + + for i in "${!words[@]}"; do + # Remove the address + if [[ ${words[$i]} =~ \[\<([^]]+)\>\] ]]; then + unset words[$i] + fi + + # Format timestamps with tabs + if [[ ${words[$i]} == \[ && ${words[$i+1]} == *\] ]]; then + unset words[$i] + words[$i+1]=$(printf "[%13s\n" "${words[$i+1]}") + fi + done + + if [[ ${words[$last]} =~ \[([^]]+)\] ]]; then + module=${words[$last]} + module=${module#\[} + module=${module%\]} + symbol=${words[$last-1]} + unset words[$last-1] + else + # The symbol is the last element, process it + symbol=${words[$last]} + module= + fi + + unset words[$last] + parse_symbol # modifies $symbol + + # Add up the line number to the symbol + echo "${words[@]}" "$symbol $module" +} + +if [[ $basepath == "auto" ]] ; then + module="" + symbol="kernel_init+0x0/0x0" + parse_symbol + basepath=${symbol#kernel_init (} + basepath=${basepath%/init/main.c:*)} +fi + +while read line; do + # Let's see if we have an address in the line + if [[ $line =~ \[\<([^]]+)\>\] ]] || + [[ $line =~ [^+\ ]+\+0x[0-9a-f]+/0x[0-9a-f]+ ]]; then + # Translate address to line numbers + handle_line "$line" + # Is it a code line? + elif [[ $line == *Code:* ]]; then + decode_code "$line" + else + # Nothing special in this line, show it as is + echo "$line" + fi +done diff --git a/src/net/scripts/decodecode b/src/net/scripts/decodecode new file mode 100755 index 0000000..31d884e --- /dev/null +++ b/src/net/scripts/decodecode @@ -0,0 +1,147 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# Disassemble the Code: line in Linux oopses +# usage: decodecode < oops.file +# +# options: set env. variable AFLAGS=options to pass options to "as"; +# e.g., to decode an i386 oops on an x86_64 system, use: +# AFLAGS=--32 decodecode < 386.oops +# PC=hex - the PC (program counter) the oops points to + +cleanup() { + rm -f $T $T.s $T.o $T.oo $T.aa $T.dis + exit 1 +} + +die() { + echo "$@" + exit 1 +} + +trap cleanup EXIT + +T=`mktemp` || die "cannot create temp file" +code= +cont= + +while read i ; do + +case "$i" in +*Code:*) + code=$i + cont=yes + ;; +*) + [ -n "$cont" ] && { + xdump="$(echo $i | grep '^[[:xdigit:]<>[:space:]]\+$')" + if [ -n "$xdump" ]; then + code="$code $xdump" + else + cont= + fi + } + ;; +esac + +done + +if [ -z "$code" ]; then + rm $T + exit +fi + +echo $code +code=`echo $code | sed -e 's/.*Code: //'` + +width=`expr index "$code" ' '` +width=$((($width-1)/2)) +case $width in +1) type=byte ;; +2) type=2byte ;; +4) type=4byte ;; +esac + +if [ -z "$ARCH" ]; then + case `uname -m` in + aarch64*) ARCH=arm64 ;; + arm*) ARCH=arm ;; + esac +fi + +# Params: (tmp_file, pc_sub) +disas() { + t=$1 + pc_sub=$2 + + ${CROSS_COMPILE}as $AFLAGS -o $t.o $t.s > /dev/null 2>&1 + + if [ "$ARCH" = "arm" ]; then + if [ $width -eq 2 ]; then + OBJDUMPFLAGS="-M force-thumb" + fi + + ${CROSS_COMPILE}strip $t.o + fi + + if [ "$ARCH" = "arm64" ]; then + if [ $width -eq 4 ]; then + type=inst + fi + + ${CROSS_COMPILE}strip $t.o + fi + + if [ $pc_sub -ne 0 ]; then + if [ $PC ]; then + adj_vma=$(( $PC - $pc_sub )) + OBJDUMPFLAGS="$OBJDUMPFLAGS --adjust-vma=$adj_vma" + fi + fi + + ${CROSS_COMPILE}objdump $OBJDUMPFLAGS -S $t.o | \ + grep -v "/tmp\|Disassembly\|\.text\|^$" > $t.dis 2>&1 +} + +marker=`expr index "$code" "\<"` +if [ $marker -eq 0 ]; then + marker=`expr index "$code" "\("` +fi + + +touch $T.oo +if [ $marker -ne 0 ]; then + # 2 opcode bytes and a single space + pc_sub=$(( $marker / 3 )) + echo All code >> $T.oo + echo ======== >> $T.oo + beforemark=`echo "$code"` + echo -n " .$type 0x" > $T.s + echo $beforemark | sed -e 's/ /,0x/g; s/[<>()]//g' >> $T.s + disas $T $pc_sub + cat $T.dis >> $T.oo + rm -f $T.o $T.s $T.dis + +# and fix code at-and-after marker + code=`echo "$code" | cut -c$((${marker} + 1))-` +fi +echo Code starting with the faulting instruction > $T.aa +echo =========================================== >> $T.aa +code=`echo $code | sed -e 's/ [<(]/ /;s/[>)] / /;s/ /,0x/g; s/[>)]$//'` +echo -n " .$type 0x" > $T.s +echo $code >> $T.s +disas $T 0 +cat $T.dis >> $T.aa + +# (lines of whole $T.oo) - (lines of $T.aa, i.e. "Code starting") + 3, +# i.e. the title + the "===..=" line (sed is counting from 1, 0 address is +# special) +faultlinenum=$(( $(wc -l $T.oo | cut -d" " -f1) - \ + $(wc -l $T.aa | cut -d" " -f1) + 3)) + +faultline=`cat $T.dis | head -1 | cut -d":" -f2-` +faultline=`echo "$faultline" | sed -e 's/\[/\\\[/g; s/\]/\\\]/g'` + +cat $T.oo | sed -e "${faultlinenum}s/^\([^:]*:\)\(.*\)/\1\*\2\t\t<-- trapping instruction/" +echo +cat $T.aa +cleanup diff --git a/src/net/scripts/depmod.sh b/src/net/scripts/depmod.sh new file mode 100755 index 0000000..3643b4f --- /dev/null +++ b/src/net/scripts/depmod.sh @@ -0,0 +1,55 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# +# A depmod wrapper used by the toplevel Makefile + +if test $# -ne 2; then + echo "Usage: $0 /sbin/depmod <kernelrelease>" >&2 + exit 1 +fi +DEPMOD=$1 +KERNELRELEASE=$2 + +if ! test -r System.map ; then + echo "Warning: modules_install: missing 'System.map' file. Skipping depmod." >&2 + exit 0 +fi + +# legacy behavior: "depmod" in /sbin, no /sbin in PATH +PATH="$PATH:/sbin" +if [ -z $(command -v $DEPMOD) ]; then + echo "Warning: 'make modules_install' requires $DEPMOD. Please install it." >&2 + echo "This is probably in the kmod package." >&2 + exit 0 +fi + +# older versions of depmod require the version string to start with three +# numbers, so we cheat with a symlink here +depmod_hack_needed=true +tmp_dir=$(mktemp -d ${TMPDIR:-/tmp}/depmod.XXXXXX) +mkdir -p "$tmp_dir/lib/modules/$KERNELRELEASE" +if "$DEPMOD" -b "$tmp_dir" $KERNELRELEASE 2>/dev/null; then + if test -e "$tmp_dir/lib/modules/$KERNELRELEASE/modules.dep" -o \ + -e "$tmp_dir/lib/modules/$KERNELRELEASE/modules.dep.bin"; then + depmod_hack_needed=false + fi +fi +rm -rf "$tmp_dir" +if $depmod_hack_needed; then + symlink="$INSTALL_MOD_PATH/lib/modules/99.98.$KERNELRELEASE" + ln -s "$KERNELRELEASE" "$symlink" + KERNELRELEASE=99.98.$KERNELRELEASE +fi + +set -- -ae -F System.map +if test -n "$INSTALL_MOD_PATH"; then + set -- "$@" -b "$INSTALL_MOD_PATH" +fi +"$DEPMOD" "$@" "$KERNELRELEASE" +ret=$? + +if $depmod_hack_needed; then + rm -f "$symlink" +fi + +exit $ret diff --git a/src/net/scripts/dev-needs.sh b/src/net/scripts/dev-needs.sh new file mode 100755 index 0000000..454cc30 --- /dev/null +++ b/src/net/scripts/dev-needs.sh @@ -0,0 +1,315 @@ +#! /bin/sh +# SPDX-License-Identifier: GPL-2.0 +# Copyright (c) 2020, Google LLC. All rights reserved. +# Author: Saravana Kannan <saravanak@google.com> + +function help() { + cat << EOF +Usage: $(basename $0) [-c|-d|-m|-f] [filter options] <list of devices> + +This script needs to be run on the target device once it has booted to a +shell. + +The script takes as input a list of one or more device directories under +/sys/devices and then lists the probe dependency chain (suppliers and +parents) of these devices. It does a breadth first search of the dependency +chain, so the last entry in the output is close to the root of the +dependency chain. + +By default it lists the full path to the devices under /sys/devices. + +It also takes an optional modifier flag as the first parameter to change +what information is listed in the output. If the requested information is +not available, the device name is printed. + + -c lists the compatible string of the dependencies + -d lists the driver name of the dependencies that have probed + -m lists the module name of the dependencies that have a module + -f list the firmware node path of the dependencies + -g list the dependencies as edges and nodes for graphviz + -t list the dependencies as edges for tsort + +The filter options provide a way to filter out some dependencies: + --allow-no-driver By default dependencies that don't have a driver + attached are ignored. This is to avoid following + device links to "class" devices that are created + when the consumer probes (as in, not a probe + dependency). If you want to follow these links + anyway, use this flag. + + --exclude-devlinks Don't follow device links when tracking probe + dependencies. + + --exclude-parents Don't follow parent devices when tracking probe + dependencies. + +EOF +} + +function dev_to_detail() { + local i=0 + while [ $i -lt ${#OUT_LIST[@]} ] + do + local C=${OUT_LIST[i]} + local S=${OUT_LIST[i+1]} + local D="'$(detail_chosen $C $S)'" + if [ ! -z "$D" ] + then + # This weirdness is needed to work with toybox when + # using the -t option. + printf '%05u\t%s\n' ${i} "$D" | tr -d \' + fi + i=$((i+2)) + done +} + +function already_seen() { + local i=0 + while [ $i -lt ${#OUT_LIST[@]} ] + do + if [ "$1" = "${OUT_LIST[$i]}" ] + then + # if-statement treats 0 (no-error) as true + return 0 + fi + i=$(($i+2)) + done + + # if-statement treats 1 (error) as false + return 1 +} + +# Return 0 (no-error/true) if parent was added +function add_parent() { + + if [ ${ALLOW_PARENTS} -eq 0 ] + then + return 1 + fi + + local CON=$1 + # $CON could be a symlink path. So, we need to find the real path and + # then go up one level to find the real parent. + local PARENT=$(realpath $CON/..) + + while [ ! -e ${PARENT}/driver ] + do + if [ "$PARENT" = "/sys/devices" ] + then + return 1 + fi + PARENT=$(realpath $PARENT/..) + done + + CONSUMERS+=($PARENT) + OUT_LIST+=(${CON} ${PARENT}) + return 0 +} + +# Return 0 (no-error/true) if one or more suppliers were added +function add_suppliers() { + local CON=$1 + local RET=1 + + if [ ${ALLOW_DEVLINKS} -eq 0 ] + then + return 1 + fi + + SUPPLIER_LINKS=$(ls -1d $CON/supplier:* 2>/dev/null) + for SL in $SUPPLIER_LINKS; + do + SYNC_STATE=$(cat $SL/sync_state_only) + + # sync_state_only links are proxy dependencies. + # They can also have cycles. So, don't follow them. + if [ "$SYNC_STATE" != '0' ] + then + continue + fi + + SUPPLIER=$(realpath $SL/supplier) + + if [ ! -e $SUPPLIER/driver -a ${ALLOW_NO_DRIVER} -eq 0 ] + then + continue + fi + + CONSUMERS+=($SUPPLIER) + OUT_LIST+=(${CON} ${SUPPLIER}) + RET=0 + done + + return $RET +} + +function detail_compat() { + f=$1/of_node/compatible + if [ -e $f ] + then + echo -n $(cat $f) + else + echo -n $1 + fi +} + +function detail_module() { + f=$1/driver/module + if [ -e $f ] + then + echo -n $(basename $(realpath $f)) + else + echo -n $1 + fi +} + +function detail_driver() { + f=$1/driver + if [ -e $f ] + then + echo -n $(basename $(realpath $f)) + else + echo -n $1 + fi +} + +function detail_fwnode() { + f=$1/firmware_node + if [ ! -e $f ] + then + f=$1/of_node + fi + + if [ -e $f ] + then + echo -n $(realpath $f) + else + echo -n $1 + fi +} + +function detail_graphviz() { + if [ "$2" != "ROOT" ] + then + echo -n "\"$(basename $2)\"->\"$(basename $1)\"" + else + echo -n "\"$(basename $1)\"" + fi +} + +function detail_tsort() { + echo -n "\"$2\" \"$1\"" +} + +function detail_device() { echo -n $1; } + +alias detail=detail_device +ALLOW_NO_DRIVER=0 +ALLOW_DEVLINKS=1 +ALLOW_PARENTS=1 + +while [ $# -gt 0 ] +do + ARG=$1 + case $ARG in + --help) + help + exit 0 + ;; + -c) + alias detail=detail_compat + ;; + -m) + alias detail=detail_module + ;; + -d) + alias detail=detail_driver + ;; + -f) + alias detail=detail_fwnode + ;; + -g) + alias detail=detail_graphviz + ;; + -t) + alias detail=detail_tsort + ;; + --allow-no-driver) + ALLOW_NO_DRIVER=1 + ;; + --exclude-devlinks) + ALLOW_DEVLINKS=0 + ;; + --exclude-parents) + ALLOW_PARENTS=0 + ;; + *) + # Stop at the first argument that's not an option. + break + ;; + esac + shift +done + +function detail_chosen() { + detail $1 $2 +} + +if [ $# -eq 0 ] +then + help + exit 1 +fi + +CONSUMERS=($@) +OUT_LIST=() + +# Do a breadth first, non-recursive tracking of suppliers. The parent is also +# considered a "supplier" as a device can't probe without its parent. +i=0 +while [ $i -lt ${#CONSUMERS[@]} ] +do + CONSUMER=$(realpath ${CONSUMERS[$i]}) + i=$(($i+1)) + + if already_seen ${CONSUMER} + then + continue + fi + + # If this is not a device with a driver, we don't care about its + # suppliers. + if [ ! -e ${CONSUMER}/driver -a ${ALLOW_NO_DRIVER} -eq 0 ] + then + continue + fi + + ROOT=1 + + # Add suppliers to CONSUMERS list and output the consumer details. + # + # We don't need to worry about a cycle in the dependency chain causing + # infinite loops. That's because the kernel doesn't allow cycles in + # device links unless it's a sync_state_only device link. And we ignore + # sync_state_only device links inside add_suppliers. + if add_suppliers ${CONSUMER} + then + ROOT=0 + fi + + if add_parent ${CONSUMER} + then + ROOT=0 + fi + + if [ $ROOT -eq 1 ] + then + OUT_LIST+=(${CONSUMER} "ROOT") + fi +done + +# Can NOT combine sort and uniq using sort -suk2 because stable sort in toybox +# isn't really stable. +dev_to_detail | sort -k2 -k1 | uniq -f 1 | sort | cut -f2- + +exit 0 diff --git a/src/net/scripts/diffconfig b/src/net/scripts/diffconfig new file mode 100755 index 0000000..d5da5fa --- /dev/null +++ b/src/net/scripts/diffconfig @@ -0,0 +1,132 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0 +# +# diffconfig - a tool to compare .config files. +# +# originally written in 2006 by Matt Mackall +# (at least, this was in his bloatwatch source code) +# last worked on 2008 by Tim Bird +# + +import sys, os + +def usage(): + print("""Usage: diffconfig [-h] [-m] [<config1> <config2>] + +Diffconfig is a simple utility for comparing two .config files. +Using standard diff to compare .config files often includes extraneous and +distracting information. This utility produces sorted output with only the +changes in configuration values between the two files. + +Added and removed items are shown with a leading plus or minus, respectively. +Changed items show the old and new values on a single line. + +If -m is specified, then output will be in "merge" style, which has the +changed and new values in kernel config option format. + +If no config files are specified, .config and .config.old are used. + +Example usage: + $ diffconfig .config config-with-some-changes +-EXT2_FS_XATTR n + CRAMFS n -> y + EXT2_FS y -> n + LOG_BUF_SHIFT 14 -> 16 + PRINTK_TIME n -> y +""") + sys.exit(0) + +# returns a dictionary of name/value pairs for config items in the file +def readconfig(config_file): + d = {} + for line in config_file: + line = line[:-1] + if line[:7] == "CONFIG_": + name, val = line[7:].split("=", 1) + d[name] = val + if line[-11:] == " is not set": + d[line[9:-11]] = "n" + return d + +def print_config(op, config, value, new_value): + global merge_style + + if merge_style: + if new_value: + if new_value=="n": + print("# CONFIG_%s is not set" % config) + else: + print("CONFIG_%s=%s" % (config, new_value)) + else: + if op=="-": + print("-%s %s" % (config, value)) + elif op=="+": + print("+%s %s" % (config, new_value)) + else: + print(" %s %s -> %s" % (config, value, new_value)) + +def main(): + global merge_style + + # parse command line args + if ("-h" in sys.argv or "--help" in sys.argv): + usage() + + merge_style = 0 + if "-m" in sys.argv: + merge_style = 1 + sys.argv.remove("-m") + + argc = len(sys.argv) + if not (argc==1 or argc == 3): + print("Error: incorrect number of arguments or unrecognized option") + usage() + + if argc == 1: + # if no filenames given, assume .config and .config.old + build_dir="" + if "KBUILD_OUTPUT" in os.environ: + build_dir = os.environ["KBUILD_OUTPUT"]+"/" + configa_filename = build_dir + ".config.old" + configb_filename = build_dir + ".config" + else: + configa_filename = sys.argv[1] + configb_filename = sys.argv[2] + + try: + a = readconfig(open(configa_filename)) + b = readconfig(open(configb_filename)) + except (IOError): + e = sys.exc_info()[1] + print("I/O error[%s]: %s\n" % (e.args[0],e.args[1])) + usage() + + # print items in a but not b (accumulate, sort and print) + old = [] + for config in a: + if config not in b: + old.append(config) + old.sort() + for config in old: + print_config("-", config, a[config], None) + del a[config] + + # print items that changed (accumulate, sort, and print) + changed = [] + for config in a: + if a[config] != b[config]: + changed.append(config) + else: + del b[config] + changed.sort() + for config in changed: + print_config("->", config, a[config], b[config]) + del b[config] + + # now print items in b but not in a + # (items from b that were in a were removed above) + new = sorted(b.keys()) + for config in new: + print_config("+", config, None, b[config]) + +main() diff --git a/src/net/scripts/documentation-file-ref-check b/src/net/scripts/documentation-file-ref-check new file mode 100755 index 0000000..c71832b --- /dev/null +++ b/src/net/scripts/documentation-file-ref-check @@ -0,0 +1,241 @@ +#!/usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0 +# +# Treewide grep for references to files under Documentation, and report +# non-existing files in stderr. + +use warnings; +use strict; +use Getopt::Long qw(:config no_auto_abbrev); + +# NOTE: only add things here when the file was gone, but the text wants +# to mention a past documentation file, for example, to give credits for +# the original work. +my %false_positives = ( + "Documentation/scsi/scsi_mid_low_api.rst" => "Documentation/Configure.help", + "drivers/vhost/vhost.c" => "Documentation/virtual/lguest/lguest.c", +); + +my $scriptname = $0; +$scriptname =~ s,.*/([^/]+/),$1,; + +# Parse arguments +my $help = 0; +my $fix = 0; +my $warn = 0; + +if (! -d ".git") { + printf "Warning: can't check if file exists, as this is not a git tree\n"; + exit 0; +} + +GetOptions( + 'fix' => \$fix, + 'warn' => \$warn, + 'h|help|usage' => \$help, +); + +if ($help != 0) { + print "$scriptname [--help] [--fix]\n"; + exit -1; +} + +# Step 1: find broken references +print "Finding broken references. This may take a while... " if ($fix); + +my %broken_ref; + +my $doc_fix = 0; + +open IN, "git grep ':doc:\`' Documentation/|" + or die "Failed to run git grep"; +while (<IN>) { + next if (!m,^([^:]+):.*\:doc\:\`([^\`]+)\`,); + next if (m,sphinx/,); + + my $file = $1; + my $d = $1; + my $doc_ref = $2; + + my $f = $doc_ref; + + $d =~ s,(.*/).*,$1,; + $f =~ s,.*\<([^\>]+)\>,$1,; + + if ($f =~ m,^/,) { + $f = "$f.rst"; + $f =~ s,^/,Documentation/,; + } else { + $f = "$d$f.rst"; + } + + next if (grep -e, glob("$f")); + + if ($fix && !$doc_fix) { + print STDERR "\nWARNING: Currently, can't fix broken :doc:`` fields\n"; + } + $doc_fix++; + + print STDERR "$file: :doc:`$doc_ref`\n"; +} +close IN; + +open IN, "git grep 'Documentation/'|" + or die "Failed to run git grep"; +while (<IN>) { + next if (!m/^([^:]+):(.*)/); + + my $f = $1; + my $ln = $2; + + # On linux-next, discard the Next/ directory + next if ($f =~ m,^Next/,); + + # Makefiles and scripts contain nasty expressions to parse docs + next if ($f =~ m/Makefile/ || $f =~ m/\.sh$/); + + # Skip this script + next if ($f eq $scriptname); + + # Ignore the dir where documentation will be built + next if ($ln =~ m,\b(\S*)Documentation/output,); + + if ($ln =~ m,\b(\S*)(Documentation/[A-Za-z0-9\_\.\,\~/\*\[\]\?+-]*)(.*),) { + my $prefix = $1; + my $ref = $2; + my $base = $2; + my $extra = $3; + + # some file references are like: + # /usr/src/linux/Documentation/DMA-{API,mapping}.txt + # For now, ignore them + next if ($extra =~ m/^{/); + + # Remove footnotes at the end like: + # Documentation/devicetree/dt-object-internal.txt[1] + $ref =~ s/(txt|rst)\[\d+]$/$1/; + + # Remove ending ']' without any '[' + $ref =~ s/\].*// if (!($ref =~ m/\[/)); + + # Remove puntuation marks at the end + $ref =~ s/[\,\.]+$//; + + my $fulref = "$prefix$ref"; + + $fulref =~ s/^(\<file|ref)://; + $fulref =~ s/^[\'\`]+//; + $fulref =~ s,^\$\(.*\)/,,; + $base =~ s,.*/,,; + + # Remove URL false-positives + next if ($fulref =~ m/^http/); + + # Remove sched-pelt false-positive + next if ($fulref =~ m,^Documentation/scheduler/sched-pelt$,); + + # Discard some build examples from Documentation/target/tcm_mod_builder.rst + next if ($fulref =~ m,mnt/sdb/lio-core-2.6.git/Documentation/target,); + + # Check if exists, evaluating wildcards + next if (grep -e, glob("$ref $fulref")); + + # Accept relative Documentation patches for tools/ + if ($f =~ m/tools/) { + my $path = $f; + $path =~ s,(.*)/.*,$1,; + next if (grep -e, glob("$path/$ref $path/../$ref $path/$fulref")); + } + + # Discard known false-positives + if (defined($false_positives{$f})) { + next if ($false_positives{$f} eq $fulref); + } + + if ($fix) { + if (!($ref =~ m/(scripts|Kconfig|Kbuild)/)) { + $broken_ref{$ref}++; + } + } elsif ($warn) { + print STDERR "Warning: $f references a file that doesn't exist: $fulref\n"; + } else { + print STDERR "$f: $fulref\n"; + } + } +} +close IN; + +exit 0 if (!$fix); + +# Step 2: Seek for file name alternatives +print "Auto-fixing broken references. Please double-check the results\n"; + +foreach my $ref (keys %broken_ref) { + my $new =$ref; + + my $basedir = "."; + # On translations, only seek inside the translations directory + $basedir = $1 if ($ref =~ m,(Documentation/translations/[^/]+),); + + # get just the basename + $new =~ s,.*/,,; + + my $f=""; + + # usual reason for breakage: DT file moved around + if ($ref =~ /devicetree/) { + # usual reason for breakage: DT file renamed to .yaml + if (!$f) { + my $new_ref = $ref; + $new_ref =~ s/\.txt$/.yaml/; + $f=$new_ref if (-f $new_ref); + } + + if (!$f) { + my $search = $new; + $search =~ s,^.*/,,; + $f = qx(find Documentation/devicetree/ -iname "*$search*") if ($search); + if (!$f) { + # Manufacturer name may have changed + $search =~ s/^.*,//; + $f = qx(find Documentation/devicetree/ -iname "*$search*") if ($search); + } + } + } + + # usual reason for breakage: file renamed to .rst + if (!$f) { + $new =~ s/\.txt$/.rst/; + $f=qx(find $basedir -iname $new) if ($new); + } + + # usual reason for breakage: use dash or underline + if (!$f) { + $new =~ s/[-_]/[-_]/g; + $f=qx(find $basedir -iname $new) if ($new); + } + + # Wild guess: seek for the same name on another place + if (!$f) { + $f = qx(find $basedir -iname $new) if ($new); + } + + my @find = split /\s+/, $f; + + if (!$f) { + print STDERR "ERROR: Didn't find a replacement for $ref\n"; + } elsif (scalar(@find) > 1) { + print STDERR "WARNING: Won't auto-replace, as found multiple files close to $ref:\n"; + foreach my $j (@find) { + $j =~ s,^./,,; + print STDERR " $j\n"; + } + } else { + $f = $find[0]; + $f =~ s,^./,,; + print "INFO: Replacing $ref to $f\n"; + foreach my $j (qx(git grep -l $ref)) { + qx(sed "s\@$ref\@$f\@g" -i $j); + } + } +} diff --git a/src/net/scripts/dtc/.gitignore b/src/net/scripts/dtc/.gitignore new file mode 100644 index 0000000..b814e60 --- /dev/null +++ b/src/net/scripts/dtc/.gitignore @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: GPL-2.0-only +dtc diff --git a/src/net/scripts/dtc/Makefile b/src/net/scripts/dtc/Makefile new file mode 100644 index 0000000..f1d2017 --- /dev/null +++ b/src/net/scripts/dtc/Makefile @@ -0,0 +1,33 @@ +# SPDX-License-Identifier: GPL-2.0 +# scripts/dtc makefile + +hostprogs-always-$(CONFIG_DTC) += dtc +hostprogs-always-$(CHECK_DT_BINDING) += dtc + +dtc-objs := dtc.o flattree.o fstree.o data.o livetree.o treesource.o \ + srcpos.o checks.o util.o +dtc-objs += dtc-lexer.lex.o dtc-parser.tab.o + +# Source files need to get at the userspace version of libfdt_env.h to compile +HOST_EXTRACFLAGS += -I $(srctree)/$(src)/libfdt + +ifeq ($(shell pkg-config --exists yaml-0.1 2>/dev/null && echo yes),) +ifneq ($(CHECK_DT_BINDING)$(CHECK_DTBS),) +$(error dtc needs libyaml for DT schema validation support. \ + Install the necessary libyaml development package.) +endif +HOST_EXTRACFLAGS += -DNO_YAML +else +dtc-objs += yamltree.o +# To include <yaml.h> installed in a non-default path +HOSTCFLAGS_yamltree.o := $(shell pkg-config --cflags yaml-0.1) +# To link libyaml installed in a non-default path +HOSTLDLIBS_dtc := $(shell pkg-config --libs yaml-0.1) +endif + +# Generated files need one more search path to include headers in source tree +HOSTCFLAGS_dtc-lexer.lex.o := -I $(srctree)/$(src) +HOSTCFLAGS_dtc-parser.tab.o := -I $(srctree)/$(src) + +# dependencies on generated files need to be listed explicitly +$(obj)/dtc-lexer.lex.o: $(obj)/dtc-parser.tab.h diff --git a/src/net/scripts/dtc/checks.c b/src/net/scripts/dtc/checks.c new file mode 100644 index 0000000..17cb689 --- /dev/null +++ b/src/net/scripts/dtc/checks.c @@ -0,0 +1,1953 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2007. + */ + +#include "dtc.h" +#include "srcpos.h" + +#ifdef TRACE_CHECKS +#define TRACE(c, ...) \ + do { \ + fprintf(stderr, "=== %s: ", (c)->name); \ + fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, "\n"); \ + } while (0) +#else +#define TRACE(c, fmt, ...) do { } while (0) +#endif + +enum checkstatus { + UNCHECKED = 0, + PREREQ, + PASSED, + FAILED, +}; + +struct check; + +typedef void (*check_fn)(struct check *c, struct dt_info *dti, struct node *node); + +struct check { + const char *name; + check_fn fn; + void *data; + bool warn, error; + enum checkstatus status; + bool inprogress; + int num_prereqs; + struct check **prereq; +}; + +#define CHECK_ENTRY(nm_, fn_, d_, w_, e_, ...) \ + static struct check *nm_##_prereqs[] = { __VA_ARGS__ }; \ + static struct check nm_ = { \ + .name = #nm_, \ + .fn = (fn_), \ + .data = (d_), \ + .warn = (w_), \ + .error = (e_), \ + .status = UNCHECKED, \ + .num_prereqs = ARRAY_SIZE(nm_##_prereqs), \ + .prereq = nm_##_prereqs, \ + }; +#define WARNING(nm_, fn_, d_, ...) \ + CHECK_ENTRY(nm_, fn_, d_, true, false, __VA_ARGS__) +#define ERROR(nm_, fn_, d_, ...) \ + CHECK_ENTRY(nm_, fn_, d_, false, true, __VA_ARGS__) +#define CHECK(nm_, fn_, d_, ...) \ + CHECK_ENTRY(nm_, fn_, d_, false, false, __VA_ARGS__) + +static inline void PRINTF(5, 6) check_msg(struct check *c, struct dt_info *dti, + struct node *node, + struct property *prop, + const char *fmt, ...) +{ + va_list ap; + char *str = NULL; + struct srcpos *pos = NULL; + char *file_str; + + if (!(c->warn && (quiet < 1)) && !(c->error && (quiet < 2))) + return; + + if (prop && prop->srcpos) + pos = prop->srcpos; + else if (node && node->srcpos) + pos = node->srcpos; + + if (pos) { + file_str = srcpos_string(pos); + xasprintf(&str, "%s", file_str); + free(file_str); + } else if (streq(dti->outname, "-")) { + xasprintf(&str, "<stdout>"); + } else { + xasprintf(&str, "%s", dti->outname); + } + + xasprintf_append(&str, ": %s (%s): ", + (c->error) ? "ERROR" : "Warning", c->name); + + if (node) { + if (prop) + xasprintf_append(&str, "%s:%s: ", node->fullpath, prop->name); + else + xasprintf_append(&str, "%s: ", node->fullpath); + } + + va_start(ap, fmt); + xavsprintf_append(&str, fmt, ap); + va_end(ap); + + xasprintf_append(&str, "\n"); + + if (!prop && pos) { + pos = node->srcpos; + while (pos->next) { + pos = pos->next; + + file_str = srcpos_string(pos); + xasprintf_append(&str, " also defined at %s\n", file_str); + free(file_str); + } + } + + fputs(str, stderr); +} + +#define FAIL(c, dti, node, ...) \ + do { \ + TRACE((c), "\t\tFAILED at %s:%d", __FILE__, __LINE__); \ + (c)->status = FAILED; \ + check_msg((c), dti, node, NULL, __VA_ARGS__); \ + } while (0) + +#define FAIL_PROP(c, dti, node, prop, ...) \ + do { \ + TRACE((c), "\t\tFAILED at %s:%d", __FILE__, __LINE__); \ + (c)->status = FAILED; \ + check_msg((c), dti, node, prop, __VA_ARGS__); \ + } while (0) + + +static void check_nodes_props(struct check *c, struct dt_info *dti, struct node *node) +{ + struct node *child; + + TRACE(c, "%s", node->fullpath); + if (c->fn) + c->fn(c, dti, node); + + for_each_child(node, child) + check_nodes_props(c, dti, child); +} + +static bool run_check(struct check *c, struct dt_info *dti) +{ + struct node *dt = dti->dt; + bool error = false; + int i; + + assert(!c->inprogress); + + if (c->status != UNCHECKED) + goto out; + + c->inprogress = true; + + for (i = 0; i < c->num_prereqs; i++) { + struct check *prq = c->prereq[i]; + error = error || run_check(prq, dti); + if (prq->status != PASSED) { + c->status = PREREQ; + check_msg(c, dti, NULL, NULL, "Failed prerequisite '%s'", + c->prereq[i]->name); + } + } + + if (c->status != UNCHECKED) + goto out; + + check_nodes_props(c, dti, dt); + + if (c->status == UNCHECKED) + c->status = PASSED; + + TRACE(c, "\tCompleted, status %d", c->status); + +out: + c->inprogress = false; + if ((c->status != PASSED) && (c->error)) + error = true; + return error; +} + +/* + * Utility check functions + */ + +/* A check which always fails, for testing purposes only */ +static inline void check_always_fail(struct check *c, struct dt_info *dti, + struct node *node) +{ + FAIL(c, dti, node, "always_fail check"); +} +CHECK(always_fail, check_always_fail, NULL); + +static void check_is_string(struct check *c, struct dt_info *dti, + struct node *node) +{ + struct property *prop; + char *propname = c->data; + + prop = get_property(node, propname); + if (!prop) + return; /* Not present, assumed ok */ + + if (!data_is_one_string(prop->val)) + FAIL_PROP(c, dti, node, prop, "property is not a string"); +} +#define WARNING_IF_NOT_STRING(nm, propname) \ + WARNING(nm, check_is_string, (propname)) +#define ERROR_IF_NOT_STRING(nm, propname) \ + ERROR(nm, check_is_string, (propname)) + +static void check_is_string_list(struct check *c, struct dt_info *dti, + struct node *node) +{ + int rem, l; + struct property *prop; + char *propname = c->data; + char *str; + + prop = get_property(node, propname); + if (!prop) + return; /* Not present, assumed ok */ + + str = prop->val.val; + rem = prop->val.len; + while (rem > 0) { + l = strnlen(str, rem); + if (l == rem) { + FAIL_PROP(c, dti, node, prop, "property is not a string list"); + break; + } + rem -= l + 1; + str += l + 1; + } +} +#define WARNING_IF_NOT_STRING_LIST(nm, propname) \ + WARNING(nm, check_is_string_list, (propname)) +#define ERROR_IF_NOT_STRING_LIST(nm, propname) \ + ERROR(nm, check_is_string_list, (propname)) + +static void check_is_cell(struct check *c, struct dt_info *dti, + struct node *node) +{ + struct property *prop; + char *propname = c->data; + + prop = get_property(node, propname); + if (!prop) + return; /* Not present, assumed ok */ + + if (prop->val.len != sizeof(cell_t)) + FAIL_PROP(c, dti, node, prop, "property is not a single cell"); +} +#define WARNING_IF_NOT_CELL(nm, propname) \ + WARNING(nm, check_is_cell, (propname)) +#define ERROR_IF_NOT_CELL(nm, propname) \ + ERROR(nm, check_is_cell, (propname)) + +/* + * Structural check functions + */ + +static void check_duplicate_node_names(struct check *c, struct dt_info *dti, + struct node *node) +{ + struct node *child, *child2; + + for_each_child(node, child) + for (child2 = child->next_sibling; + child2; + child2 = child2->next_sibling) + if (streq(child->name, child2->name)) + FAIL(c, dti, child2, "Duplicate node name"); +} +ERROR(duplicate_node_names, check_duplicate_node_names, NULL); + +static void check_duplicate_property_names(struct check *c, struct dt_info *dti, + struct node *node) +{ + struct property *prop, *prop2; + + for_each_property(node, prop) { + for (prop2 = prop->next; prop2; prop2 = prop2->next) { + if (prop2->deleted) + continue; + if (streq(prop->name, prop2->name)) + FAIL_PROP(c, dti, node, prop, "Duplicate property name"); + } + } +} +ERROR(duplicate_property_names, check_duplicate_property_names, NULL); + +#define LOWERCASE "abcdefghijklmnopqrstuvwxyz" +#define UPPERCASE "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +#define DIGITS "0123456789" +#define PROPNODECHARS LOWERCASE UPPERCASE DIGITS ",._+*#?-" +#define PROPNODECHARSSTRICT LOWERCASE UPPERCASE DIGITS ",-" + +static void check_node_name_chars(struct check *c, struct dt_info *dti, + struct node *node) +{ + int n = strspn(node->name, c->data); + + if (n < strlen(node->name)) + FAIL(c, dti, node, "Bad character '%c' in node name", + node->name[n]); +} +ERROR(node_name_chars, check_node_name_chars, PROPNODECHARS "@"); + +static void check_node_name_chars_strict(struct check *c, struct dt_info *dti, + struct node *node) +{ + int n = strspn(node->name, c->data); + + if (n < node->basenamelen) + FAIL(c, dti, node, "Character '%c' not recommended in node name", + node->name[n]); +} +CHECK(node_name_chars_strict, check_node_name_chars_strict, PROPNODECHARSSTRICT); + +static void check_node_name_format(struct check *c, struct dt_info *dti, + struct node *node) +{ + if (strchr(get_unitname(node), '@')) + FAIL(c, dti, node, "multiple '@' characters in node name"); +} +ERROR(node_name_format, check_node_name_format, NULL, &node_name_chars); + +static void check_unit_address_vs_reg(struct check *c, struct dt_info *dti, + struct node *node) +{ + const char *unitname = get_unitname(node); + struct property *prop = get_property(node, "reg"); + + if (get_subnode(node, "__overlay__")) { + /* HACK: Overlay fragments are a special case */ + return; + } + + if (!prop) { + prop = get_property(node, "ranges"); + if (prop && !prop->val.len) + prop = NULL; + } + + if (prop) { + if (!unitname[0]) + FAIL(c, dti, node, "node has a reg or ranges property, but no unit name"); + } else { + if (unitname[0]) + FAIL(c, dti, node, "node has a unit name, but no reg or ranges property"); + } +} +WARNING(unit_address_vs_reg, check_unit_address_vs_reg, NULL); + +static void check_property_name_chars(struct check *c, struct dt_info *dti, + struct node *node) +{ + struct property *prop; + + for_each_property(node, prop) { + int n = strspn(prop->name, c->data); + + if (n < strlen(prop->name)) + FAIL_PROP(c, dti, node, prop, "Bad character '%c' in property name", + prop->name[n]); + } +} +ERROR(property_name_chars, check_property_name_chars, PROPNODECHARS); + +static void check_property_name_chars_strict(struct check *c, + struct dt_info *dti, + struct node *node) +{ + struct property *prop; + + for_each_property(node, prop) { + const char *name = prop->name; + int n = strspn(name, c->data); + + if (n == strlen(prop->name)) + continue; + + /* Certain names are whitelisted */ + if (streq(name, "device_type")) + continue; + + /* + * # is only allowed at the beginning of property names not counting + * the vendor prefix. + */ + if (name[n] == '#' && ((n == 0) || (name[n-1] == ','))) { + name += n + 1; + n = strspn(name, c->data); + } + if (n < strlen(name)) + FAIL_PROP(c, dti, node, prop, "Character '%c' not recommended in property name", + name[n]); + } +} +CHECK(property_name_chars_strict, check_property_name_chars_strict, PROPNODECHARSSTRICT); + +#define DESCLABEL_FMT "%s%s%s%s%s" +#define DESCLABEL_ARGS(node,prop,mark) \ + ((mark) ? "value of " : ""), \ + ((prop) ? "'" : ""), \ + ((prop) ? (prop)->name : ""), \ + ((prop) ? "' in " : ""), (node)->fullpath + +static void check_duplicate_label(struct check *c, struct dt_info *dti, + const char *label, struct node *node, + struct property *prop, struct marker *mark) +{ + struct node *dt = dti->dt; + struct node *othernode = NULL; + struct property *otherprop = NULL; + struct marker *othermark = NULL; + + othernode = get_node_by_label(dt, label); + + if (!othernode) + otherprop = get_property_by_label(dt, label, &othernode); + if (!othernode) + othermark = get_marker_label(dt, label, &othernode, + &otherprop); + + if (!othernode) + return; + + if ((othernode != node) || (otherprop != prop) || (othermark != mark)) + FAIL(c, dti, node, "Duplicate label '%s' on " DESCLABEL_FMT + " and " DESCLABEL_FMT, + label, DESCLABEL_ARGS(node, prop, mark), + DESCLABEL_ARGS(othernode, otherprop, othermark)); +} + +static void check_duplicate_label_node(struct check *c, struct dt_info *dti, + struct node *node) +{ + struct label *l; + struct property *prop; + + for_each_label(node->labels, l) + check_duplicate_label(c, dti, l->label, node, NULL, NULL); + + for_each_property(node, prop) { + struct marker *m = prop->val.markers; + + for_each_label(prop->labels, l) + check_duplicate_label(c, dti, l->label, node, prop, NULL); + + for_each_marker_of_type(m, LABEL) + check_duplicate_label(c, dti, m->ref, node, prop, m); + } +} +ERROR(duplicate_label, check_duplicate_label_node, NULL); + +static cell_t check_phandle_prop(struct check *c, struct dt_info *dti, + struct node *node, const char *propname) +{ + struct node *root = dti->dt; + struct property *prop; + struct marker *m; + cell_t phandle; + + prop = get_property(node, propname); + if (!prop) + return 0; + + if (prop->val.len != sizeof(cell_t)) { + FAIL_PROP(c, dti, node, prop, "bad length (%d) %s property", + prop->val.len, prop->name); + return 0; + } + + m = prop->val.markers; + for_each_marker_of_type(m, REF_PHANDLE) { + assert(m->offset == 0); + if (node != get_node_by_ref(root, m->ref)) + /* "Set this node's phandle equal to some + * other node's phandle". That's nonsensical + * by construction. */ { + FAIL(c, dti, node, "%s is a reference to another node", + prop->name); + } + /* But setting this node's phandle equal to its own + * phandle is allowed - that means allocate a unique + * phandle for this node, even if it's not otherwise + * referenced. The value will be filled in later, so + * we treat it as having no phandle data for now. */ + return 0; + } + + phandle = propval_cell(prop); + + if ((phandle == 0) || (phandle == -1)) { + FAIL_PROP(c, dti, node, prop, "bad value (0x%x) in %s property", + phandle, prop->name); + return 0; + } + + return phandle; +} + +static void check_explicit_phandles(struct check *c, struct dt_info *dti, + struct node *node) +{ + struct node *root = dti->dt; + struct node *other; + cell_t phandle, linux_phandle; + + /* Nothing should have assigned phandles yet */ + assert(!node->phandle); + + phandle = check_phandle_prop(c, dti, node, "phandle"); + + linux_phandle = check_phandle_prop(c, dti, node, "linux,phandle"); + + if (!phandle && !linux_phandle) + /* No valid phandles; nothing further to check */ + return; + + if (linux_phandle && phandle && (phandle != linux_phandle)) + FAIL(c, dti, node, "mismatching 'phandle' and 'linux,phandle'" + " properties"); + + if (linux_phandle && !phandle) + phandle = linux_phandle; + + other = get_node_by_phandle(root, phandle); + if (other && (other != node)) { + FAIL(c, dti, node, "duplicated phandle 0x%x (seen before at %s)", + phandle, other->fullpath); + return; + } + + node->phandle = phandle; +} +ERROR(explicit_phandles, check_explicit_phandles, NULL); + +static void check_name_properties(struct check *c, struct dt_info *dti, + struct node *node) +{ + struct property **pp, *prop = NULL; + + for (pp = &node->proplist; *pp; pp = &((*pp)->next)) + if (streq((*pp)->name, "name")) { + prop = *pp; + break; + } + + if (!prop) + return; /* No name property, that's fine */ + + if ((prop->val.len != node->basenamelen+1) + || (memcmp(prop->val.val, node->name, node->basenamelen) != 0)) { + FAIL(c, dti, node, "\"name\" property is incorrect (\"%s\" instead" + " of base node name)", prop->val.val); + } else { + /* The name property is correct, and therefore redundant. + * Delete it */ + *pp = prop->next; + free(prop->name); + data_free(prop->val); + free(prop); + } +} +ERROR_IF_NOT_STRING(name_is_string, "name"); +ERROR(name_properties, check_name_properties, NULL, &name_is_string); + +/* + * Reference fixup functions + */ + +static void fixup_phandle_references(struct check *c, struct dt_info *dti, + struct node *node) +{ + struct node *dt = dti->dt; + struct property *prop; + + for_each_property(node, prop) { + struct marker *m = prop->val.markers; + struct node *refnode; + cell_t phandle; + + for_each_marker_of_type(m, REF_PHANDLE) { + assert(m->offset + sizeof(cell_t) <= prop->val.len); + + refnode = get_node_by_ref(dt, m->ref); + if (! refnode) { + if (!(dti->dtsflags & DTSF_PLUGIN)) + FAIL(c, dti, node, "Reference to non-existent node or " + "label \"%s\"\n", m->ref); + else /* mark the entry as unresolved */ + *((fdt32_t *)(prop->val.val + m->offset)) = + cpu_to_fdt32(0xffffffff); + continue; + } + + phandle = get_node_phandle(dt, refnode); + *((fdt32_t *)(prop->val.val + m->offset)) = cpu_to_fdt32(phandle); + + reference_node(refnode); + } + } +} +ERROR(phandle_references, fixup_phandle_references, NULL, + &duplicate_node_names, &explicit_phandles); + +static void fixup_path_references(struct check *c, struct dt_info *dti, + struct node *node) +{ + struct node *dt = dti->dt; + struct property *prop; + + for_each_property(node, prop) { + struct marker *m = prop->val.markers; + struct node *refnode; + char *path; + + for_each_marker_of_type(m, REF_PATH) { + assert(m->offset <= prop->val.len); + + refnode = get_node_by_ref(dt, m->ref); + if (!refnode) { + FAIL(c, dti, node, "Reference to non-existent node or label \"%s\"\n", + m->ref); + continue; + } + + path = refnode->fullpath; + prop->val = data_insert_at_marker(prop->val, m, path, + strlen(path) + 1); + + reference_node(refnode); + } + } +} +ERROR(path_references, fixup_path_references, NULL, &duplicate_node_names); + +static void fixup_omit_unused_nodes(struct check *c, struct dt_info *dti, + struct node *node) +{ + if (generate_symbols && node->labels) + return; + if (node->omit_if_unused && !node->is_referenced) + delete_node(node); +} +ERROR(omit_unused_nodes, fixup_omit_unused_nodes, NULL, &phandle_references, &path_references); + +/* + * Semantic checks + */ +WARNING_IF_NOT_CELL(address_cells_is_cell, "#address-cells"); +WARNING_IF_NOT_CELL(size_cells_is_cell, "#size-cells"); +WARNING_IF_NOT_CELL(interrupt_cells_is_cell, "#interrupt-cells"); + +WARNING_IF_NOT_STRING(device_type_is_string, "device_type"); +WARNING_IF_NOT_STRING(model_is_string, "model"); +WARNING_IF_NOT_STRING(status_is_string, "status"); +WARNING_IF_NOT_STRING(label_is_string, "label"); + +WARNING_IF_NOT_STRING_LIST(compatible_is_string_list, "compatible"); + +static void check_names_is_string_list(struct check *c, struct dt_info *dti, + struct node *node) +{ + struct property *prop; + + for_each_property(node, prop) { + const char *s = strrchr(prop->name, '-'); + if (!s || !streq(s, "-names")) + continue; + + c->data = prop->name; + check_is_string_list(c, dti, node); + } +} +WARNING(names_is_string_list, check_names_is_string_list, NULL); + +static void check_alias_paths(struct check *c, struct dt_info *dti, + struct node *node) +{ + struct property *prop; + + if (!streq(node->name, "aliases")) + return; + + for_each_property(node, prop) { + if (streq(prop->name, "phandle") + || streq(prop->name, "linux,phandle")) { + continue; + } + + if (!prop->val.val || !get_node_by_path(dti->dt, prop->val.val)) { + FAIL_PROP(c, dti, node, prop, "aliases property is not a valid node (%s)", + prop->val.val); + continue; + } + if (strspn(prop->name, LOWERCASE DIGITS "-") != strlen(prop->name)) + FAIL(c, dti, node, "aliases property name must include only lowercase and '-'"); + } +} +WARNING(alias_paths, check_alias_paths, NULL); + +static void fixup_addr_size_cells(struct check *c, struct dt_info *dti, + struct node *node) +{ + struct property *prop; + + node->addr_cells = -1; + node->size_cells = -1; + + prop = get_property(node, "#address-cells"); + if (prop) + node->addr_cells = propval_cell(prop); + + prop = get_property(node, "#size-cells"); + if (prop) + node->size_cells = propval_cell(prop); +} +WARNING(addr_size_cells, fixup_addr_size_cells, NULL, + &address_cells_is_cell, &size_cells_is_cell); + +#define node_addr_cells(n) \ + (((n)->addr_cells == -1) ? 2 : (n)->addr_cells) +#define node_size_cells(n) \ + (((n)->size_cells == -1) ? 1 : (n)->size_cells) + +static void check_reg_format(struct check *c, struct dt_info *dti, + struct node *node) +{ + struct property *prop; + int addr_cells, size_cells, entrylen; + + prop = get_property(node, "reg"); + if (!prop) + return; /* No "reg", that's fine */ + + if (!node->parent) { + FAIL(c, dti, node, "Root node has a \"reg\" property"); + return; + } + + if (prop->val.len == 0) + FAIL_PROP(c, dti, node, prop, "property is empty"); + + addr_cells = node_addr_cells(node->parent); + size_cells = node_size_cells(node->parent); + entrylen = (addr_cells + size_cells) * sizeof(cell_t); + + if (!entrylen || (prop->val.len % entrylen) != 0) + FAIL_PROP(c, dti, node, prop, "property has invalid length (%d bytes) " + "(#address-cells == %d, #size-cells == %d)", + prop->val.len, addr_cells, size_cells); +} +WARNING(reg_format, check_reg_format, NULL, &addr_size_cells); + +static void check_ranges_format(struct check *c, struct dt_info *dti, + struct node *node) +{ + struct property *prop; + int c_addr_cells, p_addr_cells, c_size_cells, p_size_cells, entrylen; + const char *ranges = c->data; + + prop = get_property(node, ranges); + if (!prop) + return; + + if (!node->parent) { + FAIL_PROP(c, dti, node, prop, "Root node has a \"%s\" property", + ranges); + return; + } + + p_addr_cells = node_addr_cells(node->parent); + p_size_cells = node_size_cells(node->parent); + c_addr_cells = node_addr_cells(node); + c_size_cells = node_size_cells(node); + entrylen = (p_addr_cells + c_addr_cells + c_size_cells) * sizeof(cell_t); + + if (prop->val.len == 0) { + if (p_addr_cells != c_addr_cells) + FAIL_PROP(c, dti, node, prop, "empty \"%s\" property but its " + "#address-cells (%d) differs from %s (%d)", + ranges, c_addr_cells, node->parent->fullpath, + p_addr_cells); + if (p_size_cells != c_size_cells) + FAIL_PROP(c, dti, node, prop, "empty \"%s\" property but its " + "#size-cells (%d) differs from %s (%d)", + ranges, c_size_cells, node->parent->fullpath, + p_size_cells); + } else if ((prop->val.len % entrylen) != 0) { + FAIL_PROP(c, dti, node, prop, "\"%s\" property has invalid length (%d bytes) " + "(parent #address-cells == %d, child #address-cells == %d, " + "#size-cells == %d)", ranges, prop->val.len, + p_addr_cells, c_addr_cells, c_size_cells); + } +} +WARNING(ranges_format, check_ranges_format, "ranges", &addr_size_cells); +WARNING(dma_ranges_format, check_ranges_format, "dma-ranges", &addr_size_cells); + +static const struct bus_type pci_bus = { + .name = "PCI", +}; + +static void check_pci_bridge(struct check *c, struct dt_info *dti, struct node *node) +{ + struct property *prop; + cell_t *cells; + + prop = get_property(node, "device_type"); + if (!prop || !streq(prop->val.val, "pci")) + return; + + node->bus = &pci_bus; + + if (!strprefixeq(node->name, node->basenamelen, "pci") && + !strprefixeq(node->name, node->basenamelen, "pcie")) + FAIL(c, dti, node, "node name is not \"pci\" or \"pcie\""); + + prop = get_property(node, "ranges"); + if (!prop) + FAIL(c, dti, node, "missing ranges for PCI bridge (or not a bridge)"); + + if (node_addr_cells(node) != 3) + FAIL(c, dti, node, "incorrect #address-cells for PCI bridge"); + if (node_size_cells(node) != 2) + FAIL(c, dti, node, "incorrect #size-cells for PCI bridge"); + + prop = get_property(node, "bus-range"); + if (!prop) + return; + + if (prop->val.len != (sizeof(cell_t) * 2)) { + FAIL_PROP(c, dti, node, prop, "value must be 2 cells"); + return; + } + cells = (cell_t *)prop->val.val; + if (fdt32_to_cpu(cells[0]) > fdt32_to_cpu(cells[1])) + FAIL_PROP(c, dti, node, prop, "1st cell must be less than or equal to 2nd cell"); + if (fdt32_to_cpu(cells[1]) > 0xff) + FAIL_PROP(c, dti, node, prop, "maximum bus number must be less than 256"); +} +WARNING(pci_bridge, check_pci_bridge, NULL, + &device_type_is_string, &addr_size_cells); + +static void check_pci_device_bus_num(struct check *c, struct dt_info *dti, struct node *node) +{ + struct property *prop; + unsigned int bus_num, min_bus, max_bus; + cell_t *cells; + + if (!node->parent || (node->parent->bus != &pci_bus)) + return; + + prop = get_property(node, "reg"); + if (!prop) + return; + + cells = (cell_t *)prop->val.val; + bus_num = (fdt32_to_cpu(cells[0]) & 0x00ff0000) >> 16; + + prop = get_property(node->parent, "bus-range"); + if (!prop) { + min_bus = max_bus = 0; + } else { + cells = (cell_t *)prop->val.val; + min_bus = fdt32_to_cpu(cells[0]); + max_bus = fdt32_to_cpu(cells[0]); + } + if ((bus_num < min_bus) || (bus_num > max_bus)) + FAIL_PROP(c, dti, node, prop, "PCI bus number %d out of range, expected (%d - %d)", + bus_num, min_bus, max_bus); +} +WARNING(pci_device_bus_num, check_pci_device_bus_num, NULL, ®_format, &pci_bridge); + +static void check_pci_device_reg(struct check *c, struct dt_info *dti, struct node *node) +{ + struct property *prop; + const char *unitname = get_unitname(node); + char unit_addr[5]; + unsigned int dev, func, reg; + cell_t *cells; + + if (!node->parent || (node->parent->bus != &pci_bus)) + return; + + prop = get_property(node, "reg"); + if (!prop) + return; + + cells = (cell_t *)prop->val.val; + if (cells[1] || cells[2]) + FAIL_PROP(c, dti, node, prop, "PCI reg config space address cells 2 and 3 must be 0"); + + reg = fdt32_to_cpu(cells[0]); + dev = (reg & 0xf800) >> 11; + func = (reg & 0x700) >> 8; + + if (reg & 0xff000000) + FAIL_PROP(c, dti, node, prop, "PCI reg address is not configuration space"); + if (reg & 0x000000ff) + FAIL_PROP(c, dti, node, prop, "PCI reg config space address register number must be 0"); + + if (func == 0) { + snprintf(unit_addr, sizeof(unit_addr), "%x", dev); + if (streq(unitname, unit_addr)) + return; + } + + snprintf(unit_addr, sizeof(unit_addr), "%x,%x", dev, func); + if (streq(unitname, unit_addr)) + return; + + FAIL(c, dti, node, "PCI unit address format error, expected \"%s\"", + unit_addr); +} +WARNING(pci_device_reg, check_pci_device_reg, NULL, ®_format, &pci_bridge); + +static const struct bus_type simple_bus = { + .name = "simple-bus", +}; + +static bool node_is_compatible(struct node *node, const char *compat) +{ + struct property *prop; + const char *str, *end; + + prop = get_property(node, "compatible"); + if (!prop) + return false; + + for (str = prop->val.val, end = str + prop->val.len; str < end; + str += strnlen(str, end - str) + 1) { + if (streq(str, compat)) + return true; + } + return false; +} + +static void check_simple_bus_bridge(struct check *c, struct dt_info *dti, struct node *node) +{ + if (node_is_compatible(node, "simple-bus")) + node->bus = &simple_bus; +} +WARNING(simple_bus_bridge, check_simple_bus_bridge, NULL, + &addr_size_cells, &compatible_is_string_list); + +static void check_simple_bus_reg(struct check *c, struct dt_info *dti, struct node *node) +{ + struct property *prop; + const char *unitname = get_unitname(node); + char unit_addr[17]; + unsigned int size; + uint64_t reg = 0; + cell_t *cells = NULL; + + if (!node->parent || (node->parent->bus != &simple_bus)) + return; + + prop = get_property(node, "reg"); + if (prop) + cells = (cell_t *)prop->val.val; + else { + prop = get_property(node, "ranges"); + if (prop && prop->val.len) + /* skip of child address */ + cells = ((cell_t *)prop->val.val) + node_addr_cells(node); + } + + if (!cells) { + if (node->parent->parent && !(node->bus == &simple_bus)) + FAIL(c, dti, node, "missing or empty reg/ranges property"); + return; + } + + size = node_addr_cells(node->parent); + while (size--) + reg = (reg << 32) | fdt32_to_cpu(*(cells++)); + + snprintf(unit_addr, sizeof(unit_addr), "%"PRIx64, reg); + if (!streq(unitname, unit_addr)) + FAIL(c, dti, node, "simple-bus unit address format error, expected \"%s\"", + unit_addr); +} +WARNING(simple_bus_reg, check_simple_bus_reg, NULL, ®_format, &simple_bus_bridge); + +static const struct bus_type i2c_bus = { + .name = "i2c-bus", +}; + +static void check_i2c_bus_bridge(struct check *c, struct dt_info *dti, struct node *node) +{ + if (strprefixeq(node->name, node->basenamelen, "i2c-bus") || + strprefixeq(node->name, node->basenamelen, "i2c-arb")) { + node->bus = &i2c_bus; + } else if (strprefixeq(node->name, node->basenamelen, "i2c")) { + struct node *child; + for_each_child(node, child) { + if (strprefixeq(child->name, node->basenamelen, "i2c-bus")) + return; + } + node->bus = &i2c_bus; + } else + return; + + if (!node->children) + return; + + if (node_addr_cells(node) != 1) + FAIL(c, dti, node, "incorrect #address-cells for I2C bus"); + if (node_size_cells(node) != 0) + FAIL(c, dti, node, "incorrect #size-cells for I2C bus"); + +} +WARNING(i2c_bus_bridge, check_i2c_bus_bridge, NULL, &addr_size_cells); + +#define I2C_OWN_SLAVE_ADDRESS (1U << 30) +#define I2C_TEN_BIT_ADDRESS (1U << 31) + +static void check_i2c_bus_reg(struct check *c, struct dt_info *dti, struct node *node) +{ + struct property *prop; + const char *unitname = get_unitname(node); + char unit_addr[17]; + uint32_t reg = 0; + int len; + cell_t *cells = NULL; + + if (!node->parent || (node->parent->bus != &i2c_bus)) + return; + + prop = get_property(node, "reg"); + if (prop) + cells = (cell_t *)prop->val.val; + + if (!cells) { + FAIL(c, dti, node, "missing or empty reg property"); + return; + } + + reg = fdt32_to_cpu(*cells); + /* Ignore I2C_OWN_SLAVE_ADDRESS */ + reg &= ~I2C_OWN_SLAVE_ADDRESS; + snprintf(unit_addr, sizeof(unit_addr), "%x", reg); + if (!streq(unitname, unit_addr)) + FAIL(c, dti, node, "I2C bus unit address format error, expected \"%s\"", + unit_addr); + + for (len = prop->val.len; len > 0; len -= 4) { + reg = fdt32_to_cpu(*(cells++)); + /* Ignore I2C_OWN_SLAVE_ADDRESS */ + reg &= ~I2C_OWN_SLAVE_ADDRESS; + + if ((reg & I2C_TEN_BIT_ADDRESS) && ((reg & ~I2C_TEN_BIT_ADDRESS) > 0x3ff)) + FAIL_PROP(c, dti, node, prop, "I2C address must be less than 10-bits, got \"0x%x\"", + reg); + else if (reg > 0x7f) + FAIL_PROP(c, dti, node, prop, "I2C address must be less than 7-bits, got \"0x%x\". Set I2C_TEN_BIT_ADDRESS for 10 bit addresses or fix the property", + reg); + } +} +WARNING(i2c_bus_reg, check_i2c_bus_reg, NULL, ®_format, &i2c_bus_bridge); + +static const struct bus_type spi_bus = { + .name = "spi-bus", +}; + +static void check_spi_bus_bridge(struct check *c, struct dt_info *dti, struct node *node) +{ + int spi_addr_cells = 1; + + if (strprefixeq(node->name, node->basenamelen, "spi")) { + node->bus = &spi_bus; + } else { + /* Try to detect SPI buses which don't have proper node name */ + struct node *child; + + if (node_addr_cells(node) != 1 || node_size_cells(node) != 0) + return; + + for_each_child(node, child) { + struct property *prop; + for_each_property(child, prop) { + if (strprefixeq(prop->name, 4, "spi-")) { + node->bus = &spi_bus; + break; + } + } + if (node->bus == &spi_bus) + break; + } + + if (node->bus == &spi_bus && get_property(node, "reg")) + FAIL(c, dti, node, "node name for SPI buses should be 'spi'"); + } + if (node->bus != &spi_bus || !node->children) + return; + + if (get_property(node, "spi-slave")) + spi_addr_cells = 0; + if (node_addr_cells(node) != spi_addr_cells) + FAIL(c, dti, node, "incorrect #address-cells for SPI bus"); + if (node_size_cells(node) != 0) + FAIL(c, dti, node, "incorrect #size-cells for SPI bus"); + +} +WARNING(spi_bus_bridge, check_spi_bus_bridge, NULL, &addr_size_cells); + +static void check_spi_bus_reg(struct check *c, struct dt_info *dti, struct node *node) +{ + struct property *prop; + const char *unitname = get_unitname(node); + char unit_addr[9]; + uint32_t reg = 0; + cell_t *cells = NULL; + + if (!node->parent || (node->parent->bus != &spi_bus)) + return; + + if (get_property(node->parent, "spi-slave")) + return; + + prop = get_property(node, "reg"); + if (prop) + cells = (cell_t *)prop->val.val; + + if (!cells) { + FAIL(c, dti, node, "missing or empty reg property"); + return; + } + + reg = fdt32_to_cpu(*cells); + snprintf(unit_addr, sizeof(unit_addr), "%x", reg); + if (!streq(unitname, unit_addr)) + FAIL(c, dti, node, "SPI bus unit address format error, expected \"%s\"", + unit_addr); +} +WARNING(spi_bus_reg, check_spi_bus_reg, NULL, ®_format, &spi_bus_bridge); + +static void check_unit_address_format(struct check *c, struct dt_info *dti, + struct node *node) +{ + const char *unitname = get_unitname(node); + + if (node->parent && node->parent->bus) + return; + + if (!unitname[0]) + return; + + if (!strncmp(unitname, "0x", 2)) { + FAIL(c, dti, node, "unit name should not have leading \"0x\""); + /* skip over 0x for next test */ + unitname += 2; + } + if (unitname[0] == '0' && isxdigit(unitname[1])) + FAIL(c, dti, node, "unit name should not have leading 0s"); +} +WARNING(unit_address_format, check_unit_address_format, NULL, + &node_name_format, &pci_bridge, &simple_bus_bridge); + +/* + * Style checks + */ +static void check_avoid_default_addr_size(struct check *c, struct dt_info *dti, + struct node *node) +{ + struct property *reg, *ranges; + + if (!node->parent) + return; /* Ignore root node */ + + reg = get_property(node, "reg"); + ranges = get_property(node, "ranges"); + + if (!reg && !ranges) + return; + + if (node->parent->addr_cells == -1) + FAIL(c, dti, node, "Relying on default #address-cells value"); + + if (node->parent->size_cells == -1) + FAIL(c, dti, node, "Relying on default #size-cells value"); +} +WARNING(avoid_default_addr_size, check_avoid_default_addr_size, NULL, + &addr_size_cells); + +static void check_avoid_unnecessary_addr_size(struct check *c, struct dt_info *dti, + struct node *node) +{ + struct property *prop; + struct node *child; + bool has_reg = false; + + if (!node->parent || node->addr_cells < 0 || node->size_cells < 0) + return; + + if (get_property(node, "ranges") || !node->children) + return; + + for_each_child(node, child) { + prop = get_property(child, "reg"); + if (prop) + has_reg = true; + } + + if (!has_reg) + FAIL(c, dti, node, "unnecessary #address-cells/#size-cells without \"ranges\" or child \"reg\" property"); +} +WARNING(avoid_unnecessary_addr_size, check_avoid_unnecessary_addr_size, NULL, &avoid_default_addr_size); + +static bool node_is_disabled(struct node *node) +{ + struct property *prop; + + prop = get_property(node, "status"); + if (prop) { + char *str = prop->val.val; + if (streq("disabled", str)) + return true; + } + + return false; +} + +static void check_unique_unit_address_common(struct check *c, + struct dt_info *dti, + struct node *node, + bool disable_check) +{ + struct node *childa; + + if (node->addr_cells < 0 || node->size_cells < 0) + return; + + if (!node->children) + return; + + for_each_child(node, childa) { + struct node *childb; + const char *addr_a = get_unitname(childa); + + if (!strlen(addr_a)) + continue; + + if (disable_check && node_is_disabled(childa)) + continue; + + for_each_child(node, childb) { + const char *addr_b = get_unitname(childb); + if (childa == childb) + break; + + if (disable_check && node_is_disabled(childb)) + continue; + + if (streq(addr_a, addr_b)) + FAIL(c, dti, childb, "duplicate unit-address (also used in node %s)", childa->fullpath); + } + } +} + +static void check_unique_unit_address(struct check *c, struct dt_info *dti, + struct node *node) +{ + check_unique_unit_address_common(c, dti, node, false); +} +WARNING(unique_unit_address, check_unique_unit_address, NULL, &avoid_default_addr_size); + +static void check_unique_unit_address_if_enabled(struct check *c, struct dt_info *dti, + struct node *node) +{ + check_unique_unit_address_common(c, dti, node, true); +} +CHECK_ENTRY(unique_unit_address_if_enabled, check_unique_unit_address_if_enabled, + NULL, false, false, &avoid_default_addr_size); + +static void check_obsolete_chosen_interrupt_controller(struct check *c, + struct dt_info *dti, + struct node *node) +{ + struct node *dt = dti->dt; + struct node *chosen; + struct property *prop; + + if (node != dt) + return; + + + chosen = get_node_by_path(dt, "/chosen"); + if (!chosen) + return; + + prop = get_property(chosen, "interrupt-controller"); + if (prop) + FAIL_PROP(c, dti, node, prop, + "/chosen has obsolete \"interrupt-controller\" property"); +} +WARNING(obsolete_chosen_interrupt_controller, + check_obsolete_chosen_interrupt_controller, NULL); + +static void check_chosen_node_is_root(struct check *c, struct dt_info *dti, + struct node *node) +{ + if (!streq(node->name, "chosen")) + return; + + if (node->parent != dti->dt) + FAIL(c, dti, node, "chosen node must be at root node"); +} +WARNING(chosen_node_is_root, check_chosen_node_is_root, NULL); + +static void check_chosen_node_bootargs(struct check *c, struct dt_info *dti, + struct node *node) +{ + struct property *prop; + + if (!streq(node->name, "chosen")) + return; + + prop = get_property(node, "bootargs"); + if (!prop) + return; + + c->data = prop->name; + check_is_string(c, dti, node); +} +WARNING(chosen_node_bootargs, check_chosen_node_bootargs, NULL); + +static void check_chosen_node_stdout_path(struct check *c, struct dt_info *dti, + struct node *node) +{ + struct property *prop; + + if (!streq(node->name, "chosen")) + return; + + prop = get_property(node, "stdout-path"); + if (!prop) { + prop = get_property(node, "linux,stdout-path"); + if (!prop) + return; + FAIL_PROP(c, dti, node, prop, "Use 'stdout-path' instead"); + } + + c->data = prop->name; + check_is_string(c, dti, node); +} +WARNING(chosen_node_stdout_path, check_chosen_node_stdout_path, NULL); + +struct provider { + const char *prop_name; + const char *cell_name; + bool optional; +}; + +static void check_property_phandle_args(struct check *c, + struct dt_info *dti, + struct node *node, + struct property *prop, + const struct provider *provider) +{ + struct node *root = dti->dt; + int cell, cellsize = 0; + + if (prop->val.len % sizeof(cell_t)) { + FAIL_PROP(c, dti, node, prop, + "property size (%d) is invalid, expected multiple of %zu", + prop->val.len, sizeof(cell_t)); + return; + } + + for (cell = 0; cell < prop->val.len / sizeof(cell_t); cell += cellsize + 1) { + struct node *provider_node; + struct property *cellprop; + int phandle; + + phandle = propval_cell_n(prop, cell); + /* + * Some bindings use a cell value 0 or -1 to skip over optional + * entries when each index position has a specific definition. + */ + if (phandle == 0 || phandle == -1) { + /* Give up if this is an overlay with external references */ + if (dti->dtsflags & DTSF_PLUGIN) + break; + + cellsize = 0; + continue; + } + + /* If we have markers, verify the current cell is a phandle */ + if (prop->val.markers) { + struct marker *m = prop->val.markers; + for_each_marker_of_type(m, REF_PHANDLE) { + if (m->offset == (cell * sizeof(cell_t))) + break; + } + if (!m) + FAIL_PROP(c, dti, node, prop, + "cell %d is not a phandle reference", + cell); + } + + provider_node = get_node_by_phandle(root, phandle); + if (!provider_node) { + FAIL_PROP(c, dti, node, prop, + "Could not get phandle node for (cell %d)", + cell); + break; + } + + cellprop = get_property(provider_node, provider->cell_name); + if (cellprop) { + cellsize = propval_cell(cellprop); + } else if (provider->optional) { + cellsize = 0; + } else { + FAIL(c, dti, node, "Missing property '%s' in node %s or bad phandle (referred from %s[%d])", + provider->cell_name, + provider_node->fullpath, + prop->name, cell); + break; + } + + if (prop->val.len < ((cell + cellsize + 1) * sizeof(cell_t))) { + FAIL_PROP(c, dti, node, prop, + "property size (%d) too small for cell size %d", + prop->val.len, cellsize); + } + } +} + +static void check_provider_cells_property(struct check *c, + struct dt_info *dti, + struct node *node) +{ + struct provider *provider = c->data; + struct property *prop; + + prop = get_property(node, provider->prop_name); + if (!prop) + return; + + check_property_phandle_args(c, dti, node, prop, provider); +} +#define WARNING_PROPERTY_PHANDLE_CELLS(nm, propname, cells_name, ...) \ + static struct provider nm##_provider = { (propname), (cells_name), __VA_ARGS__ }; \ + WARNING(nm##_property, check_provider_cells_property, &nm##_provider, &phandle_references); + +WARNING_PROPERTY_PHANDLE_CELLS(clocks, "clocks", "#clock-cells"); +WARNING_PROPERTY_PHANDLE_CELLS(cooling_device, "cooling-device", "#cooling-cells"); +WARNING_PROPERTY_PHANDLE_CELLS(dmas, "dmas", "#dma-cells"); +WARNING_PROPERTY_PHANDLE_CELLS(hwlocks, "hwlocks", "#hwlock-cells"); +WARNING_PROPERTY_PHANDLE_CELLS(interrupts_extended, "interrupts-extended", "#interrupt-cells"); +WARNING_PROPERTY_PHANDLE_CELLS(io_channels, "io-channels", "#io-channel-cells"); +WARNING_PROPERTY_PHANDLE_CELLS(iommus, "iommus", "#iommu-cells"); +WARNING_PROPERTY_PHANDLE_CELLS(mboxes, "mboxes", "#mbox-cells"); +WARNING_PROPERTY_PHANDLE_CELLS(msi_parent, "msi-parent", "#msi-cells", true); +WARNING_PROPERTY_PHANDLE_CELLS(mux_controls, "mux-controls", "#mux-control-cells"); +WARNING_PROPERTY_PHANDLE_CELLS(phys, "phys", "#phy-cells"); +WARNING_PROPERTY_PHANDLE_CELLS(power_domains, "power-domains", "#power-domain-cells"); +WARNING_PROPERTY_PHANDLE_CELLS(pwms, "pwms", "#pwm-cells"); +WARNING_PROPERTY_PHANDLE_CELLS(resets, "resets", "#reset-cells"); +WARNING_PROPERTY_PHANDLE_CELLS(sound_dai, "sound-dai", "#sound-dai-cells"); +WARNING_PROPERTY_PHANDLE_CELLS(thermal_sensors, "thermal-sensors", "#thermal-sensor-cells"); + +static bool prop_is_gpio(struct property *prop) +{ + char *str; + + /* + * *-gpios and *-gpio can appear in property names, + * so skip over any false matches (only one known ATM) + */ + if (strstr(prop->name, "nr-gpio")) + return false; + + str = strrchr(prop->name, '-'); + if (str) + str++; + else + str = prop->name; + if (!(streq(str, "gpios") || streq(str, "gpio"))) + return false; + + return true; +} + +static void check_gpios_property(struct check *c, + struct dt_info *dti, + struct node *node) +{ + struct property *prop; + + /* Skip GPIO hog nodes which have 'gpios' property */ + if (get_property(node, "gpio-hog")) + return; + + for_each_property(node, prop) { + struct provider provider; + + if (!prop_is_gpio(prop)) + continue; + + provider.prop_name = prop->name; + provider.cell_name = "#gpio-cells"; + provider.optional = false; + check_property_phandle_args(c, dti, node, prop, &provider); + } + +} +WARNING(gpios_property, check_gpios_property, NULL, &phandle_references); + +static void check_deprecated_gpio_property(struct check *c, + struct dt_info *dti, + struct node *node) +{ + struct property *prop; + + for_each_property(node, prop) { + char *str; + + if (!prop_is_gpio(prop)) + continue; + + str = strstr(prop->name, "gpio"); + if (!streq(str, "gpio")) + continue; + + FAIL_PROP(c, dti, node, prop, + "'[*-]gpio' is deprecated, use '[*-]gpios' instead"); + } + +} +CHECK(deprecated_gpio_property, check_deprecated_gpio_property, NULL); + +static bool node_is_interrupt_provider(struct node *node) +{ + struct property *prop; + + prop = get_property(node, "interrupt-controller"); + if (prop) + return true; + + prop = get_property(node, "interrupt-map"); + if (prop) + return true; + + return false; +} + +static void check_interrupt_provider(struct check *c, + struct dt_info *dti, + struct node *node) +{ + struct property *prop; + + if (!node_is_interrupt_provider(node)) + return; + + prop = get_property(node, "#interrupt-cells"); + if (!prop) + FAIL(c, dti, node, + "Missing #interrupt-cells in interrupt provider"); + + prop = get_property(node, "#address-cells"); + if (!prop) + FAIL(c, dti, node, + "Missing #address-cells in interrupt provider"); +} +WARNING(interrupt_provider, check_interrupt_provider, NULL); + +static void check_interrupts_property(struct check *c, + struct dt_info *dti, + struct node *node) +{ + struct node *root = dti->dt; + struct node *irq_node = NULL, *parent = node; + struct property *irq_prop, *prop = NULL; + int irq_cells, phandle; + + irq_prop = get_property(node, "interrupts"); + if (!irq_prop) + return; + + if (irq_prop->val.len % sizeof(cell_t)) + FAIL_PROP(c, dti, node, irq_prop, "size (%d) is invalid, expected multiple of %zu", + irq_prop->val.len, sizeof(cell_t)); + + while (parent && !prop) { + if (parent != node && node_is_interrupt_provider(parent)) { + irq_node = parent; + break; + } + + prop = get_property(parent, "interrupt-parent"); + if (prop) { + phandle = propval_cell(prop); + if ((phandle == 0) || (phandle == -1)) { + /* Give up if this is an overlay with + * external references */ + if (dti->dtsflags & DTSF_PLUGIN) + return; + FAIL_PROP(c, dti, parent, prop, "Invalid phandle"); + continue; + } + + irq_node = get_node_by_phandle(root, phandle); + if (!irq_node) { + FAIL_PROP(c, dti, parent, prop, "Bad phandle"); + return; + } + if (!node_is_interrupt_provider(irq_node)) + FAIL(c, dti, irq_node, + "Missing interrupt-controller or interrupt-map property"); + + break; + } + + parent = parent->parent; + } + + if (!irq_node) { + FAIL(c, dti, node, "Missing interrupt-parent"); + return; + } + + prop = get_property(irq_node, "#interrupt-cells"); + if (!prop) { + /* We warn about that already in another test. */ + return; + } + + irq_cells = propval_cell(prop); + if (irq_prop->val.len % (irq_cells * sizeof(cell_t))) { + FAIL_PROP(c, dti, node, prop, + "size is (%d), expected multiple of %d", + irq_prop->val.len, (int)(irq_cells * sizeof(cell_t))); + } +} +WARNING(interrupts_property, check_interrupts_property, &phandle_references); + +static const struct bus_type graph_port_bus = { + .name = "graph-port", +}; + +static const struct bus_type graph_ports_bus = { + .name = "graph-ports", +}; + +static void check_graph_nodes(struct check *c, struct dt_info *dti, + struct node *node) +{ + struct node *child; + + for_each_child(node, child) { + if (!(strprefixeq(child->name, child->basenamelen, "endpoint") || + get_property(child, "remote-endpoint"))) + continue; + + node->bus = &graph_port_bus; + + /* The parent of 'port' nodes can be either 'ports' or a device */ + if (!node->parent->bus && + (streq(node->parent->name, "ports") || get_property(node, "reg"))) + node->parent->bus = &graph_ports_bus; + + break; + } + +} +WARNING(graph_nodes, check_graph_nodes, NULL); + +static void check_graph_child_address(struct check *c, struct dt_info *dti, + struct node *node) +{ + int cnt = 0; + struct node *child; + + if (node->bus != &graph_ports_bus && node->bus != &graph_port_bus) + return; + + for_each_child(node, child) { + struct property *prop = get_property(child, "reg"); + + /* No error if we have any non-zero unit address */ + if (prop && propval_cell(prop) != 0) + return; + + cnt++; + } + + if (cnt == 1 && node->addr_cells != -1) + FAIL(c, dti, node, "graph node has single child node '%s', #address-cells/#size-cells are not necessary", + node->children->name); +} +WARNING(graph_child_address, check_graph_child_address, NULL, &graph_nodes); + +static void check_graph_reg(struct check *c, struct dt_info *dti, + struct node *node) +{ + char unit_addr[9]; + const char *unitname = get_unitname(node); + struct property *prop; + + prop = get_property(node, "reg"); + if (!prop || !unitname) + return; + + if (!(prop->val.val && prop->val.len == sizeof(cell_t))) { + FAIL(c, dti, node, "graph node malformed 'reg' property"); + return; + } + + snprintf(unit_addr, sizeof(unit_addr), "%x", propval_cell(prop)); + if (!streq(unitname, unit_addr)) + FAIL(c, dti, node, "graph node unit address error, expected \"%s\"", + unit_addr); + + if (node->parent->addr_cells != 1) + FAIL_PROP(c, dti, node, get_property(node, "#address-cells"), + "graph node '#address-cells' is %d, must be 1", + node->parent->addr_cells); + if (node->parent->size_cells != 0) + FAIL_PROP(c, dti, node, get_property(node, "#size-cells"), + "graph node '#size-cells' is %d, must be 0", + node->parent->size_cells); +} + +static void check_graph_port(struct check *c, struct dt_info *dti, + struct node *node) +{ + if (node->bus != &graph_port_bus) + return; + + if (!strprefixeq(node->name, node->basenamelen, "port")) + FAIL(c, dti, node, "graph port node name should be 'port'"); + + check_graph_reg(c, dti, node); +} +WARNING(graph_port, check_graph_port, NULL, &graph_nodes); + +static struct node *get_remote_endpoint(struct check *c, struct dt_info *dti, + struct node *endpoint) +{ + int phandle; + struct node *node; + struct property *prop; + + prop = get_property(endpoint, "remote-endpoint"); + if (!prop) + return NULL; + + phandle = propval_cell(prop); + /* Give up if this is an overlay with external references */ + if (phandle == 0 || phandle == -1) + return NULL; + + node = get_node_by_phandle(dti->dt, phandle); + if (!node) + FAIL_PROP(c, dti, endpoint, prop, "graph phandle is not valid"); + + return node; +} + +static void check_graph_endpoint(struct check *c, struct dt_info *dti, + struct node *node) +{ + struct node *remote_node; + + if (!node->parent || node->parent->bus != &graph_port_bus) + return; + + if (!strprefixeq(node->name, node->basenamelen, "endpoint")) + FAIL(c, dti, node, "graph endpoint node name should be 'endpoint'"); + + check_graph_reg(c, dti, node); + + remote_node = get_remote_endpoint(c, dti, node); + if (!remote_node) + return; + + if (get_remote_endpoint(c, dti, remote_node) != node) + FAIL(c, dti, node, "graph connection to node '%s' is not bidirectional", + remote_node->fullpath); +} +WARNING(graph_endpoint, check_graph_endpoint, NULL, &graph_nodes); + +static struct check *check_table[] = { + &duplicate_node_names, &duplicate_property_names, + &node_name_chars, &node_name_format, &property_name_chars, + &name_is_string, &name_properties, + + &duplicate_label, + + &explicit_phandles, + &phandle_references, &path_references, + &omit_unused_nodes, + + &address_cells_is_cell, &size_cells_is_cell, &interrupt_cells_is_cell, + &device_type_is_string, &model_is_string, &status_is_string, + &label_is_string, + + &compatible_is_string_list, &names_is_string_list, + + &property_name_chars_strict, + &node_name_chars_strict, + + &addr_size_cells, ®_format, &ranges_format, &dma_ranges_format, + + &unit_address_vs_reg, + &unit_address_format, + + &pci_bridge, + &pci_device_reg, + &pci_device_bus_num, + + &simple_bus_bridge, + &simple_bus_reg, + + &i2c_bus_bridge, + &i2c_bus_reg, + + &spi_bus_bridge, + &spi_bus_reg, + + &avoid_default_addr_size, + &avoid_unnecessary_addr_size, + &unique_unit_address, + &unique_unit_address_if_enabled, + &obsolete_chosen_interrupt_controller, + &chosen_node_is_root, &chosen_node_bootargs, &chosen_node_stdout_path, + + &clocks_property, + &cooling_device_property, + &dmas_property, + &hwlocks_property, + &interrupts_extended_property, + &io_channels_property, + &iommus_property, + &mboxes_property, + &msi_parent_property, + &mux_controls_property, + &phys_property, + &power_domains_property, + &pwms_property, + &resets_property, + &sound_dai_property, + &thermal_sensors_property, + + &deprecated_gpio_property, + &gpios_property, + &interrupts_property, + &interrupt_provider, + + &alias_paths, + + &graph_nodes, &graph_child_address, &graph_port, &graph_endpoint, + + &always_fail, +}; + +static void enable_warning_error(struct check *c, bool warn, bool error) +{ + int i; + + /* Raising level, also raise it for prereqs */ + if ((warn && !c->warn) || (error && !c->error)) + for (i = 0; i < c->num_prereqs; i++) + enable_warning_error(c->prereq[i], warn, error); + + c->warn = c->warn || warn; + c->error = c->error || error; +} + +static void disable_warning_error(struct check *c, bool warn, bool error) +{ + int i; + + /* Lowering level, also lower it for things this is the prereq + * for */ + if ((warn && c->warn) || (error && c->error)) { + for (i = 0; i < ARRAY_SIZE(check_table); i++) { + struct check *cc = check_table[i]; + int j; + + for (j = 0; j < cc->num_prereqs; j++) + if (cc->prereq[j] == c) + disable_warning_error(cc, warn, error); + } + } + + c->warn = c->warn && !warn; + c->error = c->error && !error; +} + +void parse_checks_option(bool warn, bool error, const char *arg) +{ + int i; + const char *name = arg; + bool enable = true; + + if ((strncmp(arg, "no-", 3) == 0) + || (strncmp(arg, "no_", 3) == 0)) { + name = arg + 3; + enable = false; + } + + for (i = 0; i < ARRAY_SIZE(check_table); i++) { + struct check *c = check_table[i]; + + if (streq(c->name, name)) { + if (enable) + enable_warning_error(c, warn, error); + else + disable_warning_error(c, warn, error); + return; + } + } + + die("Unrecognized check name \"%s\"\n", name); +} + +void process_checks(bool force, struct dt_info *dti) +{ + int i; + int error = 0; + + for (i = 0; i < ARRAY_SIZE(check_table); i++) { + struct check *c = check_table[i]; + + if (c->warn || c->error) + error = error || run_check(c, dti); + } + + if (error) { + if (!force) { + fprintf(stderr, "ERROR: Input tree has errors, aborting " + "(use -f to force output)\n"); + exit(2); + } else if (quiet < 3) { + fprintf(stderr, "Warning: Input tree has errors, " + "output forced\n"); + } + } +} diff --git a/src/net/scripts/dtc/data.c b/src/net/scripts/dtc/data.c new file mode 100644 index 0000000..0a43b6d --- /dev/null +++ b/src/net/scripts/dtc/data.c @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005. + */ + +#include "dtc.h" + +void data_free(struct data d) +{ + struct marker *m, *nm; + + m = d.markers; + while (m) { + nm = m->next; + free(m->ref); + free(m); + m = nm; + } + + if (d.val) + free(d.val); +} + +struct data data_grow_for(struct data d, int xlen) +{ + struct data nd; + int newsize; + + if (xlen == 0) + return d; + + nd = d; + + newsize = xlen; + + while ((d.len + xlen) > newsize) + newsize *= 2; + + nd.val = xrealloc(d.val, newsize); + + return nd; +} + +struct data data_copy_mem(const char *mem, int len) +{ + struct data d; + + d = data_grow_for(empty_data, len); + + d.len = len; + memcpy(d.val, mem, len); + + return d; +} + +struct data data_copy_escape_string(const char *s, int len) +{ + int i = 0; + struct data d; + char *q; + + d = data_add_marker(empty_data, TYPE_STRING, NULL); + d = data_grow_for(d, len + 1); + + q = d.val; + while (i < len) { + char c = s[i++]; + + if (c == '\\') + c = get_escape_char(s, &i); + + q[d.len++] = c; + } + + q[d.len++] = '\0'; + return d; +} + +struct data data_copy_file(FILE *f, size_t maxlen) +{ + struct data d = empty_data; + + d = data_add_marker(d, TYPE_NONE, NULL); + while (!feof(f) && (d.len < maxlen)) { + size_t chunksize, ret; + + if (maxlen == -1) + chunksize = 4096; + else + chunksize = maxlen - d.len; + + d = data_grow_for(d, chunksize); + ret = fread(d.val + d.len, 1, chunksize, f); + + if (ferror(f)) + die("Error reading file into data: %s", strerror(errno)); + + if (d.len + ret < d.len) + die("Overflow reading file into data\n"); + + d.len += ret; + } + + return d; +} + +struct data data_append_data(struct data d, const void *p, int len) +{ + d = data_grow_for(d, len); + memcpy(d.val + d.len, p, len); + d.len += len; + return d; +} + +struct data data_insert_at_marker(struct data d, struct marker *m, + const void *p, int len) +{ + d = data_grow_for(d, len); + memmove(d.val + m->offset + len, d.val + m->offset, d.len - m->offset); + memcpy(d.val + m->offset, p, len); + d.len += len; + + /* Adjust all markers after the one we're inserting at */ + m = m->next; + for_each_marker(m) + m->offset += len; + return d; +} + +static struct data data_append_markers(struct data d, struct marker *m) +{ + struct marker **mp = &d.markers; + + /* Find the end of the markerlist */ + while (*mp) + mp = &((*mp)->next); + *mp = m; + return d; +} + +struct data data_merge(struct data d1, struct data d2) +{ + struct data d; + struct marker *m2 = d2.markers; + + d = data_append_markers(data_append_data(d1, d2.val, d2.len), m2); + + /* Adjust for the length of d1 */ + for_each_marker(m2) + m2->offset += d1.len; + + d2.markers = NULL; /* So data_free() doesn't clobber them */ + data_free(d2); + + return d; +} + +struct data data_append_integer(struct data d, uint64_t value, int bits) +{ + uint8_t value_8; + fdt16_t value_16; + fdt32_t value_32; + fdt64_t value_64; + + switch (bits) { + case 8: + value_8 = value; + return data_append_data(d, &value_8, 1); + + case 16: + value_16 = cpu_to_fdt16(value); + return data_append_data(d, &value_16, 2); + + case 32: + value_32 = cpu_to_fdt32(value); + return data_append_data(d, &value_32, 4); + + case 64: + value_64 = cpu_to_fdt64(value); + return data_append_data(d, &value_64, 8); + + default: + die("Invalid literal size (%d)\n", bits); + } +} + +struct data data_append_re(struct data d, uint64_t address, uint64_t size) +{ + struct fdt_reserve_entry re; + + re.address = cpu_to_fdt64(address); + re.size = cpu_to_fdt64(size); + + return data_append_data(d, &re, sizeof(re)); +} + +struct data data_append_cell(struct data d, cell_t word) +{ + return data_append_integer(d, word, sizeof(word) * 8); +} + +struct data data_append_addr(struct data d, uint64_t addr) +{ + return data_append_integer(d, addr, sizeof(addr) * 8); +} + +struct data data_append_byte(struct data d, uint8_t byte) +{ + return data_append_data(d, &byte, 1); +} + +struct data data_append_zeroes(struct data d, int len) +{ + d = data_grow_for(d, len); + + memset(d.val + d.len, 0, len); + d.len += len; + return d; +} + +struct data data_append_align(struct data d, int align) +{ + int newlen = ALIGN(d.len, align); + return data_append_zeroes(d, newlen - d.len); +} + +struct data data_add_marker(struct data d, enum markertype type, char *ref) +{ + struct marker *m; + + m = xmalloc(sizeof(*m)); + m->offset = d.len; + m->type = type; + m->ref = ref; + m->next = NULL; + + return data_append_markers(d, m); +} + +bool data_is_one_string(struct data d) +{ + int i; + int len = d.len; + + if (len == 0) + return false; + + for (i = 0; i < len-1; i++) + if (d.val[i] == '\0') + return false; + + if (d.val[len-1] != '\0') + return false; + + return true; +} diff --git a/src/net/scripts/dtc/dt_to_config b/src/net/scripts/dtc/dt_to_config new file mode 100755 index 0000000..299d1c2 --- /dev/null +++ b/src/net/scripts/dtc/dt_to_config @@ -0,0 +1,1212 @@ +#!/usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0-only + +# Copyright 2016 by Frank Rowand +# Copyright 2016 by Gaurav Minocha +# + +use strict 'refs'; +use strict subs; + +use Getopt::Long; + +$VUFX = "160610a"; + +$script_name = $0; +$script_name =~ s|^.*/||; + + +# ----- constants for print_flags() + +# Position in string $pr_flags. Range of 0..($num_pr_flags - 1). +$pr_flag_pos_mcompatible = 0; +$pr_flag_pos_driver = 1; +$pr_flag_pos_mdriver = 2; +$pr_flag_pos_config = 3; +$pr_flag_pos_mconfig = 4; +$pr_flag_pos_node_not_enabled = 5; +$pr_flag_pos_white_list = 6; +$pr_flag_pos_hard_coded = 7; +$pr_flag_pos_config_hard_coded = 8; +$pr_flag_pos_config_none = 9; +$pr_flag_pos_config_m = 10; +$pr_flag_pos_config_y = 11; +$pr_flag_pos_config_test_fail = 12; + +$num_pr_flags = $pr_flag_pos_config_test_fail + 1; + +# flags in @pr_flag_value must be unique values to allow simple regular +# expessions to work for --include_flags and --exclude_flags. +# Convention: use upper case letters for potential issues or problems. + +@pr_flag_value = ('M', 'd', 'D', 'c', 'C', 'E', 'W', 'H', 'x', 'n', 'm', 'y', 'F'); + +@pr_flag_help = ( + "multiple compatibles found for this node", + "driver found for this compatible", + "multiple drivers found for this compatible", + "kernel config found for this driver", + "multiple config options found for this driver", + "node is not enabled", + "compatible is white listed", + "matching driver and/or kernel config is hard coded", + "kernel config hard coded in Makefile", + "one or more kernel config file options is not set", + "one or more kernel config file options is set to 'm'", + "one or more kernel config file options is set to 'y'", + "one of more kernel config file options fails to have correct value" +); + + +# ----- + +%driver_config = (); # driver config array, indexed by driver source file +%driver_count = (); # driver_cnt, indexed by compatible +%compat_driver = (); # compatible driver array, indexed by compatible +%existing_config = (); # existing config symbols present in given config file + # expected values are: "y", "m", a decimal number, a + # hex number, or a string + +# ----- magic compatibles, do not have a driver +# +# Will not search for drivers for these compatibles. + +%compat_white_list = ( + 'none' => '1', + 'pci' => '1', + 'simple-bus' => '1', +); + +# Will not search for drivers for these compatibles. +# +# These compatibles have a very large number of false positives. +# +# 'hardcoded_no_driver' is a magic value. Other code knows this +# magic value. Do not use 'no_driver' here! +# +# Revisit each 'hardcoded_no_driver' to see how the compatible +# is used. Are there drivers that can be provided? + +%driver_hard_code_list = ( + 'cache' => ['hardcoded_no_driver'], + 'eeprom' => ['hardcoded_no_driver'], + 'gpio' => ['hardcoded_no_driver'], + 'gpio-keys' => ['drivers/input/keyboard/gpio_keys.c'], + 'i2c-gpio' => ['drivers/i2c/busses/i2c-gpio.c'], + 'isa' => ['arch/mips/mti-malta/malta-dt.c', + 'arch/x86/kernel/devicetree.c'], + 'led' => ['hardcoded_no_driver'], + 'm25p32' => ['hardcoded_no_driver'], + 'm25p64' => ['hardcoded_no_driver'], + 'm25p80' => ['hardcoded_no_driver'], + 'mtd-ram' => ['drivers/mtd/maps/physmap_of.c'], + 'pwm-backlight' => ['drivers/video/backlight/pwm_bl.c'], + 'spidev' => ['hardcoded_no_driver'], + 'syscon' => ['drivers/mfd/syscon.c'], + 'tlv320aic23' => ['hardcoded_no_driver'], + 'wm8731' => ['hardcoded_no_driver'], +); + +# Use these config options instead of searching makefiles + +%driver_config_hard_code_list = ( + + # this one needed even if %driver_hard_code_list is empty + 'no_driver' => ['no_config'], + 'hardcoded_no_driver' => ['no_config'], + + # drivers/usb/host/ehci-ppc-of.c + # drivers/usb/host/ehci-xilinx-of.c + # are included from: + # drivers/usb/host/ehci-hcd.c + # thus the search of Makefile for the included .c files is incorrect + # ehci-hcd.c wraps the includes with ifdef CONFIG_USB_EHCI_HCD_..._OF + # + # similar model for ohci-hcd.c (but no ohci-xilinx-of.c) + # + # similarly, uhci-hcd.c includes uhci-platform.c + + 'drivers/usb/host/ehci-ppc-of.c' => ['CONFIG_USB_EHCI_HCD', + 'CONFIG_USB_EHCI_HCD_PPC_OF'], + 'drivers/usb/host/ohci-ppc-of.c' => ['CONFIG_USB_OHCI_HCD', + 'CONFIG_USB_OHCI_HCD_PPC_OF'], + + 'drivers/usb/host/ehci-xilinx-of.c' => ['CONFIG_USB_EHCI_HCD', + 'CONFIG_USB_EHCI_HCD_XILINX'], + + 'drivers/usb/host/uhci-platform.c' => ['CONFIG_USB_UHCI_HCD', + 'CONFIG_USB_UHCI_PLATFORM'], + + # scan_makefile will find only one of these config options: + # ifneq ($(CONFIG_SOC_IMX6)$(CONFIG_SOC_LS1021A),) + 'arch/arm/mach-imx/platsmp.c' => ['CONFIG_SOC_IMX6 && CONFIG_SMP', + 'CONFIG_SOC_LS1021A && CONFIG_SMP'], +); + + +# 'virt/kvm/arm/.*' are controlled by makefiles in other directories, +# using relative paths, such as 'KVM := ../../../virt/kvm'. Do not +# add complexity to find_kconfig() to deal with this. There is a long +# term intent to change the kvm related makefiles to the normal kernel +# style. After that is done, this entry can be removed from the +# black_list_driver. + +@black_list_driver = ( + # kvm no longer a problem after commit 503a62862e8f in 4.7-rc1 + # 'virt/kvm/arm/.*', +); + + +sub usage() +{ + print +" +Usage: $script_name [options] device-tree... + + device_tree is: dts_file | dtb_file | proc_device-tree + + +Valid options: + -c FILE Read kernel config options from FILE + --config FILE synonym for 'c' + --config-format config file friendly output format + --exclude-flag FLAG exclude entries with a matching flag + -h Display this message and exit + --help synonym for 'h' + --black-list-driver use driver black list + --white-list-config use config white list + --white-list-driver use driver white list + --include-flag FLAG include only entries with a matching flag + --include-suspect include only entries with an uppercase flag + --short-name do not show the path portion of the node name + --show-lists report of white and black lists + --version Display program version and exit + + + Report driver source files that match the compatibles in the device + tree file and the kernel config options that enable the driver source + files. + + This program must be run in the root directory of a Linux kernel + source tree. + + The default format is a report that is intended to be easily human + scannable. + + An alternate format can be selected by --config-format. This will + create output that can easily be edited to create a fragment that can + be appended to the existing kernel config file. Each entry consists of + multiple lines. The first line reports flags, the node path, compatible + value, driver file matching the compatible, configuration options, and + current values of the configuration options. For each configuration + option, the following lines report the current value and the value that + is required for the driver file to be included in the kernel. + + If a large number of drivers or config options is listed for a node, + and the '$pr_flag_value[$pr_flag_pos_hard_coded]' flag is set consider using --white-list-config and/or + --white-list-driver. If the white list option suppresses the correct + entry please report that as a bug. + + CAUTION: + This program uses heuristics to guess which driver(s) support each + compatible string and which config option(s) enables the driver(s). + Do not believe that the reported information is fully correct. + This program is intended to aid the process of determining the + proper kernel configuration for a device tree, but this is not + a fully automated process -- human involvement may still be + required! + + The driver match heuristic used is to search for source files + containing the compatible string enclosed in quotes. + + This program might not be able to find all drivers matching a + compatible string. + + Some makefiles are overly clever. This program was not made + complex enough to handle them. If no config option is listed + for a driver, look at the makefile for the driver source file. + Even if a config option is listed for a driver, some other + available config options may not be listed. + + FLAG values: +"; + + for ($k = 0; $k < $num_pr_flags; $k++) { + printf " %s %s\n", $pr_flag_value[$k], $pr_flag_help[$k]; + } + + print +" + Upper case letters indicate potential issues or problems. + + The flag: + +"; + + $k = $pr_flag_pos_hard_coded; + printf " %s %s\n", $pr_flag_value[$k], $pr_flag_help[$k]; + + print +" + will be set if the config or driver is in the white lists, even if + --white-list-config and --white-list-driver are not specified. + This is a hint that 1) many of these reported lines are likely to + be incorrect, and 2) using those options will reduce the number of + drivers and/or config options reported. + + --white-list-config and --white-list-driver may not be accurate if this + program is not well maintained. Use them with appropriate skepticism. + Use the --show-lists option to report the values in the list. + + Return value: + 0 if no error + 1 error processing command line + 2 unable to open or read kernel config file + 3 unable to open or process input device tree file(s) + + EXAMPLES: + + dt_to_config arch/arm/boot/dts/my_dts_file.dts + + Basic report. + + dt_to_config \\ + --config \${KBUILD_OUTPUT}/.config \\ + arch/\${ARCH}/boot/dts/my_dts_file.dts + + Full report, with config file issues noted. + + dt_to_config --include-suspect \\ + --config \${KBUILD_OUTPUT}/.config \\ + arch/\${ARCH}/boot/dts/my_dts_file.dts + + Report of node / compatible string / driver tuples that should + be further investigated. A node may have multiple compatible + strings. A compatible string may be matched by multiple drivers. + A driver may have config file issues noted. The compatible string + and/or driver may be in the white lists. + + dt_to_config --include-suspect --config-format \\ + --config ${KBUILD_OUTPUT}/.config \\ + arch/\${ARCH}/boot/dts/my_dts_file.dts + + Report of node / compatible string / driver tuples that should + be further investigated. The report can be edited to uncomment + the config options to select the desired tuple for a given node. + A node may have multiple compatible strings. A compatible string + may be matched by multiple drivers. A driver may have config file + issues noted. The compatible string and/or driver may be in the + white lists. + +"; +} + +sub set_flag() +{ + # pr_flags_ref is a reference to $pr_flags + + my $pr_flags_ref = shift; + my $pos = shift; + + substr $$pr_flags_ref, $pos, 1, $pr_flag_value[$pos]; + + return $pr_flags; +} + +sub print_flags() +{ + # return 1 if anything printed, else 0 + + # some fields of pn_arg_ref might not be used in this function, but + # extract all of them anyway. + my $pn_arg_ref = shift; + + my $compat = $pn_arg_ref->{compat}; + my $compatible_cnt = $pn_arg_ref->{compatible_cnt}; + my $config = $pn_arg_ref->{config}; + my $config_cnt = $pn_arg_ref->{config_cnt}; + my $driver = $pn_arg_ref->{driver}; + my $driver_cnt = $pn_arg_ref->{driver_cnt}; + my $full_node = $pn_arg_ref->{full_node}; + my $node = $pn_arg_ref->{node}; + my $node_enabled = $pn_arg_ref->{node_enabled}; + my $white_list = $pn_arg_ref->{white_list}; + + my $pr_flags = '-' x $num_pr_flags; + + + # ----- set flags in $pr_flags + + if ($compatible_cnt > 1) { + &set_flag(\$pr_flags, $pr_flag_pos_mcompatible); + } + + if ($config_cnt > 1) { + &set_flag(\$pr_flags, $pr_flag_pos_mconfig); + } + + if ($driver_cnt >= 1) { + &set_flag(\$pr_flags, $pr_flag_pos_driver); + } + + if ($driver_cnt > 1) { + &set_flag(\$pr_flags, $pr_flag_pos_mdriver); + } + + # These strings are the same way the linux kernel tests. + # The ePapr lists of values is slightly different. + if (!( + ($node_enabled eq "") || + ($node_enabled eq "ok") || + ($node_enabled eq "okay") + )) { + &set_flag(\$pr_flags, $pr_flag_pos_node_not_enabled); + } + + if ($white_list) { + &set_flag(\$pr_flags, $pr_flag_pos_white_list); + } + + if (exists($driver_hard_code_list{$compat}) || + (exists($driver_config_hard_code_list{$driver}) && + ($driver ne "no_driver"))) { + &set_flag(\$pr_flags, $pr_flag_pos_hard_coded); + } + + my @configs = split(' && ', $config); + for $configs (@configs) { + $not = $configs =~ /^!/; + $configs =~ s/^!//; + + if (($configs ne "no_config") && ($configs ne "no_makefile")) { + &set_flag(\$pr_flags, $pr_flag_pos_config); + } + + if (($config_cnt >= 1) && + ($configs !~ /CONFIG_/) && + (($configs ne "no_config") && ($configs ne "no_makefile"))) { + &set_flag(\$pr_flags, $pr_flag_pos_config_hard_coded); + } + + my $existing_config = $existing_config{$configs}; + if ($existing_config eq "m") { + &set_flag(\$pr_flags, $pr_flag_pos_config_m); + # Possible fail, depends on whether built in or + # module is desired. + &set_flag(\$pr_flags, $pr_flag_pos_config_test_fail); + } elsif ($existing_config eq "y") { + &set_flag(\$pr_flags, $pr_flag_pos_config_y); + if ($not) { + &set_flag(\$pr_flags, $pr_flag_pos_config_test_fail); + } + } elsif (($config_file) && ($configs =~ /CONFIG_/)) { + &set_flag(\$pr_flags, $pr_flag_pos_config_none); + if (!$not) { + &set_flag(\$pr_flags, $pr_flag_pos_config_test_fail); + } + } + } + + # ----- include / exclude filters + + if ($include_flag_pattern && ($pr_flags !~ m/$include_flag_pattern/)) { + return 0; + } + + if ($exclude_flag_pattern && ($pr_flags =~ m/$exclude_flag_pattern/)) { + return 0; + } + + if ($config_format) { + print "# "; + } + print "$pr_flags : "; + + return 1; +} + + +sub print_node() +{ + # return number of lines printed + + # some fields of pn_arg_ref might not be used in this function, but + # extract all of them anyway. + my $pn_arg_ref = shift; + + my $compat = $pn_arg_ref->{compat}; + my $compatible_cnt = $pn_arg_ref->{compatible_cnt}; + my $config = $pn_arg_ref->{config}; + my $config_cnt = $pn_arg_ref->{config_cnt}; + my $driver = $pn_arg_ref->{driver}; + my $driver_cnt = $pn_arg_ref->{driver_cnt}; + my $full_node = $pn_arg_ref->{full_node}; + my $node = $pn_arg_ref->{node}; + my $node_enabled = $pn_arg_ref->{node_enabled}; + my $white_list = $pn_arg_ref->{white_list}; + + my $separator; + + if (! &print_flags($pn_arg_ref)) { + return 0; + } + + + if ($short_name) { + print "$node"; + } else { + print "$full_node"; + } + print " : $compat : $driver : $config : "; + + my @configs = split(' && ', $config); + + if ($config_file) { + for $configs (@configs) { + $configs =~ s/^!//; + my $existing_config = $existing_config{$configs}; + if (!$existing_config) { + # check for /-m/, /-y/, or /-objs/ + if ($configs !~ /CONFIG_/) { + $existing_config = "x"; + }; + }; + if ($existing_config) { + print "$separator", "$existing_config"; + $separator = ", "; + } else { + print "$separator", "n"; + $separator = ", "; + } + } + } else { + print "none"; + } + + print "\n"; + + if ($config_format) { + for $configs (@configs) { + $not = $configs =~ /^!/; + $configs =~ s/^!//; + my $existing_config = $existing_config{$configs}; + + if ($not) { + if ($configs !~ /CONFIG_/) { + print "# $configs\n"; + } elsif ($existing_config eq "m") { + print "# $configs is m\n"; + print "# $configs=n\n"; + } elsif ($existing_config eq "y") { + print "# $configs is set\n"; + print "# $configs=n\n"; + } else { + print "# $configs is not set\n"; + print "# $configs=n\n"; + } + + } else { + if ($configs !~ /CONFIG_/) { + print "# $configs\n"; + } elsif ($existing_config eq "m") { + print "# $configs is m\n"; + print "# $configs=y\n"; + } elsif ($existing_config eq "y") { + print "# $configs is set\n"; + print "# $configs=y\n"; + } else { + print "# $configs is not set\n"; + print "# $configs=y\n"; + } + } + } + } + + return 1; +} + + +sub scan_makefile +{ + my $pn_arg_ref = shift; + my $driver = shift; + + # ----- Find Kconfig symbols that enable driver + + my ($dir, $base) = $driver =~ m{(.*)/(.*).c}; + + my $makefile = $dir . "/Makefile"; + if (! -r $makefile) { + $makefile = $dir . "/Kbuild"; + } + if (! -r $makefile) { + my $config; + + $config = 'no_makefile'; + push @{ $driver_config{$driver} }, $config; + return; + } + + if (!open(MAKEFILE_FILE, "<", "$makefile")) { + return; + } + + my $line; + my @config; + my @if_config; + my @make_var; + + NEXT_LINE: + while ($next_line = <MAKEFILE_FILE>) { + my $config; + my $if_config; + my $ifdef; + my $ifeq; + my $ifndef; + my $ifneq; + my $ifdef_config; + my $ifeq_config; + my $ifndef_config; + my $ifneq_config; + + chomp($next_line); + $line = $line . $next_line; + if ($next_line =~ /\\$/) { + $line =~ s/\\$/ /; + next NEXT_LINE; + } + if ($line =~ /^\s*#/) { + $line = ""; + next NEXT_LINE; + } + + # ----- condition ... else ... endif + + if ($line =~ /^([ ]\s*|)else\b/) { + $if_config = "!" . pop @if_config; + $if_config =~ s/^!!//; + push @if_config, $if_config; + $line =~ s/^([ ]\s*|)else\b//; + } + + ($null, $ifeq_config, $ifeq_config_val ) = $line =~ /^([ ]\s*|)ifeq\b.*\b(CONFIG_[A-Za-z0-9_]*)(.*)/; + ($null, $ifneq_config, $ifneq_config_val) = $line =~ /^([ ]\s*|)ifneq\b.*\b(CONFIG_[A-Za-z0-9_]*)(.*)/; + ($null, $ifdef_config) = $line =~ /^([ ]\s*|)ifdef\b.*\b(CONFIG_[A-Za-z0-9_]*)/; + ($null, $ifndef_config) = $line =~ /^([ ]\s*|)ifndef\b.*\b(CONFIG_[A-Za-z0-9_]*)/; + + ($null, $ifeq) = $line =~ /^([ ]\s*|)ifeq\b\s*(.*)/; + ($null, $ifneq) = $line =~ /^([ ]\s*|)ifneq\b\s*(.*)/; + ($null, $ifdef) = $line =~ /^([ ]\s*|)ifdef\b\s*(.*)/; + ($null, $ifndef) = $line =~ /^([ ]\s*|)ifndef\b\s*(.*)/; + + # Order of tests is important. Prefer "CONFIG_*" regex match over + # less specific regex match. + if ($ifdef_config) { + $if_config = $ifdef_config; + } elsif ($ifeq_config) { + if ($ifeq_config_val =~ /y/) { + $if_config = $ifeq_config; + } else { + $if_config = "!" . $ifeq_config; + } + } elsif ($ifndef_config) { + $if_config = "!" . $ifndef_config; + } elsif ($ifneq_config) { + if ($ifneq_config_val =~ /y/) { + $if_config = "!" . $ifneq_config; + } else { + $if_config = $ifneq_config; + } + } elsif ($ifdef) { + $if_config = $ifdef; + } elsif ($ifeq) { + $if_config = $ifeq; + } elsif ($ifndef) { + $if_config = "!" . $ifndef; + } elsif ($ifneq) { + $if_config = "!" . $ifneq; + } else { + $if_config = ""; + } + $if_config =~ s/^!!//; + + if ($if_config) { + push @if_config, $if_config; + $line = ""; + next NEXT_LINE; + } + + if ($line =~ /^([ ]\s*|)endif\b/) { + pop @if_config; + $line = ""; + next NEXT_LINE; + } + + # ----- simple CONFIG_* = *.[co] or xxx [+:?]*= *.[co] + # Most makefiles select on *.o, but + # arch/powerpc/boot/Makefile selects on *.c + + ($config) = $line =~ /(CONFIG_[A-Za-z0-9_]+).*\b$base.[co]\b/; + + # ----- match a make variable instead of *.[co] + # Recursively expanded variables are not handled. + + if (!$config) { + my $make_var; + ($make_var) = $line =~ /\s*(\S+?)\s*[+:\?]*=.*\b$base.[co]\b/; + if ($make_var) { + if ($make_var =~ /[a-zA-Z0-9]+-[ym]/) { + $config = $make_var; + } elsif ($make_var =~ /[a-zA-Z0-9]+-objs/) { + $config = $make_var; + } else { + push @make_var, $make_var; + } + } + } + + if (!$config) { + for $make_var (@make_var) { + ($config) = $line =~ /(CONFIG_[A-Za-z0-9_]+).*\b$make_var\b/; + last if ($config); + } + } + + if (!$config) { + for $make_var (@make_var) { + ($config) = $line =~ /\s*(\S+?)\s*[+:\?]*=.*\b$make_var\b/; + last if ($config); + } + } + + # ----- next if no config found + + if (!$config) { + $line = ""; + next NEXT_LINE; + } + + for $if_config (@if_config) { + $config = $if_config . " && " . $config; + } + + push @{ $driver_config{$driver} }, $config; + + $line = ""; + } + + close(MAKEFILE_FILE); + +} + + +sub find_kconfig +{ + my $pn_arg_ref = shift; + my $driver = shift; + + my $lines_printed = 0; + my @configs; + + if (!@{ $driver_config{$driver} }) { + &scan_makefile($pn_arg_ref, $driver); + if (!@{ $driver_config{$driver} }) { + push @{ $driver_config{$driver} }, "no_config"; + } + } + + @configs = @{ $driver_config{$driver} }; + + $$pn_arg_ref{config_cnt} = $#configs + 1; + for my $config (@configs) { + $$pn_arg_ref{config} = $config; + $lines_printed += &print_node($pn_arg_ref); + } + + return $lines_printed; +} + + +sub handle_compatible() +{ + my $full_node = shift; + my $node = shift; + my $compatible = shift; + my $node_enabled = shift; + + my $compat; + my $lines_printed = 0; + my %pn_arg = (); + + return if (!$node or !$compatible); + + # Do not process compatible property of root node, + # it is used to match board, not to bind a driver. + return if ($node eq "/"); + + $pn_arg{full_node} = $full_node; + $pn_arg{node} = $node; + $pn_arg{node_enabled} = $node_enabled; + + my @compatibles = split('", "', $compatible); + + $compatibles[0] =~ s/^"//; + $compatibles[$#compatibles] =~ s/"$//; + + $pn_arg{compatible_cnt} = $#compatibles + 1; + + COMPAT: + for $compat (@compatibles) { + + $pn_arg{compat} = $compat; + $pn_arg{driver_cnt} = 0; + $pn_arg{white_list} = 0; + + if (exists($compat_white_list{$compat})) { + $pn_arg{white_list} = 1; + $pn_arg{driver} = "no_driver"; + $pn_arg{config_cnt} = 1; + $pn_arg{config} = "no_config"; + $lines_printed += &print_node(\%pn_arg); + next COMPAT; + } + + # ----- if compat previously seen, use cached info + + if (exists($compat_driver{$compat})) { + for my $driver (@{ $compat_driver{$compat} }) { + $pn_arg{driver} = $driver; + $pn_arg{driver_cnt} = $driver_count{$compat}; + $pn_arg{config_cnt} = $#{ $driver_config{$driver}} + 1; + + for my $config (@{ $driver_config{$driver} }) { + $pn_arg{config} = $config; + $lines_printed += &print_node(\%pn_arg); + } + + if (!@{ $driver_config{$driver} }) { + # no config cached yet + # $driver in %driver_hard_code_list + # but not %driver_config_hard_code_list + $lines_printed += &find_kconfig(\%pn_arg, $driver); + } + } + next COMPAT; + } + + + # ----- Find drivers (source files that contain compatible) + + # this will miss arch/sparc/include/asm/parport.h + # It is better to move the compatible out of the .h + # than to add *.h. to the files list, because *.h generates + # a lot of false negatives. + my $files = '"*.c"'; + my $drivers = `git grep -l '"$compat"' -- $files`; + chomp($drivers); + if ($drivers eq "") { + $pn_arg{driver} = "no_driver"; + $pn_arg{config_cnt} = 1; + $pn_arg{config} = "no_config"; + push @{ $compat_driver{$compat} }, "no_driver"; + $lines_printed += &print_node(\%pn_arg); + next COMPAT; + } + + my @drivers = split("\n", $drivers); + $driver_count{$compat} = $#drivers + 1; + $pn_arg{driver_cnt} = $#drivers + 1; + + DRIVER: + for my $driver (@drivers) { + push @{ $compat_driver{$compat} }, $driver; + $pn_arg{driver} = $driver; + + # ----- if driver previously seen, use cached info + + $pn_arg{config_cnt} = $#{ $driver_config{$driver} } + 1; + for my $config (@{ $driver_config{$driver} }) { + $pn_arg{config} = $config; + $lines_printed += &print_node(\%pn_arg); + } + if (@{ $driver_config{$driver} }) { + next DRIVER; + } + + if ($black_list_driver) { + for $black (@black_list_driver) { + next DRIVER if ($driver =~ /^$black$/); + } + } + + + # ----- Find Kconfig symbols that enable driver + + $lines_printed += &find_kconfig(\%pn_arg, $driver); + + } + } + + # White space (line) between nodes for readability. + # Each node may report several compatibles. + # For each compatible, multiple drivers may be reported. + # For each driver, multiple CONFIG_ options may be reported. + if ($lines_printed) { + print "\n"; + } +} + +sub read_dts() +{ + my $file = shift; + + my $compatible = ""; + my $line; + my $node = ""; + my $node_enabled = ""; + + if (! -r $file) { + print STDERR "file '$file' is not readable or does not exist\n"; + exit 3; + } + + if (!open(DT_FILE, "-|", "$dtx_diff $file")) { + print STDERR "\n"; + print STDERR "shell command failed:\n"; + print STDERR " $dtx_diff $file\n"; + print STDERR "\n"; + exit 3; + } + + FILE: + while ($line = <DT_FILE>) { + chomp($line); + + if ($line =~ /{/) { + + &handle_compatible($full_node, $node, $compatible, + $node_enabled); + + while ($end_node_count-- > 0) { + pop @full_node; + }; + $end_node_count = 0; + $full_node = @full_node[-1]; + + $node = $line; + $node =~ s/^\s*(.*)\s+\{.*/$1/; + $node =~ s/.*: //; + if ($node eq '/' ) { + $full_node = '/'; + } elsif ($full_node ne '/') { + $full_node = $full_node . '/' . $node; + } else { + $full_node = '/' . $node; + } + push @full_node, $full_node; + + $compatible = ""; + $node_enabled = ""; + next FILE; + } + + if ($line =~ /}/) { + $end_node_count++; + } + + if ($line =~ /(\s+|^)status =/) { + $node_enabled = $line; + $node_enabled =~ s/^\t*//; + $node_enabled =~ s/^status = "//; + $node_enabled =~ s/";$//; + next FILE; + } + + if ($line =~ /(\s+|^)compatible =/) { + # Extract all compatible entries for this device + # White space matching here and in handle_compatible() is + # precise, because input format is the output of dtc, + # which is invoked by dtx_diff. + $compatible = $line; + $compatible =~ s/^\t*//; + $compatible =~ s/^compatible = //; + $compatible =~ s/;$//; + } + } + + &handle_compatible($full_node, $node, $compatible, $node_enabled); + + close(DT_FILE); +} + + +sub read_config_file() +{ + if (! -r $config_file) { + print STDERR "file '$config_file' is not readable or does not exist\n"; + exit 2; + } + + if (!open(CONFIG_FILE, "<", "$config_file")) { + print STDERR "open $config_file failed\n"; + exit 2; + } + + my @line; + + LINE: + while ($line = <CONFIG_FILE>) { + chomp($line); + next LINE if ($line =~ /^\s*#/); + next LINE if ($line =~ /^\s*$/); + @line = split /=/, $line; + $existing_config{@line[0]} = @line[1]; + } + + close(CONFIG_FILE); +} + + +sub cmd_line_err() +{ + my $msg = shift; + + print STDERR "\n"; + print STDERR " ERROR processing command line options\n"; + print STDERR " $msg\n" if ($msg ne ""); + print STDERR "\n"; + print STDERR " For help, type '$script_name --help'\n"; + print STDERR "\n"; +} + + +# ----------------------------------------------------------------------------- +# program entry point + +Getopt::Long::Configure("no_ignore_case", "bundling"); + +if (!GetOptions( + "c=s" => \$config_file, + "config=s" => \$config_file, + "config-format" => \$config_format, + "exclude-flag=s" => \@exclude_flag, + "h" => \$help, + "help" => \$help, + "black-list-driver" => \$black_list_driver, + "white-list-config" => \$white_list_config, + "white-list-driver" => \$white_list_driver, + "include-flag=s" => \@include_flag, + "include-suspect" => \$include_suspect, + "short-name" => \$short_name, + "show-lists" => \$show_lists, + "version" => \$version, + )) { + + &cmd_line_err(); + + exit 1; +} + + +my $exit_after_messages = 0; + +if ($version) { + print STDERR "\n$script_name $VUFX\n\n"; + $exit_after_messages = 1; +} + + +if ($help) { + &usage; + $exit_after_messages = 1; +} + + +if ($show_lists) { + + print "\n"; + print "These compatibles are hard coded to have no driver.\n"; + print "\n"; + for my $compat (sort keys %compat_white_list) { + print " $compat\n"; + } + + + print "\n\n"; + print "The driver for these compatibles is hard coded (white list).\n"; + print "\n"; + my $max_compat_len = 0; + for my $compat (sort keys %driver_hard_code_list) { + if (length $compat > $max_compat_len) { + $max_compat_len = length $compat; + } + } + for my $compat (sort keys %driver_hard_code_list) { + if (($driver ne "hardcoded_no_driver") && ($driver ne "no_driver")) { + my $first = 1; + for my $driver (@{ $driver_hard_code_list{$compat} }) { + if ($first) { + print " $compat"; + print " " x ($max_compat_len - length $compat); + $first = 0; + } else { + print " ", " " x $max_compat_len; + } + print " $driver\n"; + } + } + } + + + print "\n\n"; + print "The configuration option for these drivers is hard coded (white list).\n"; + print "\n"; + my $max_driver_len = 0; + for my $driver (sort keys %driver_config_hard_code_list) { + if (length $driver > $max_driver_len) { + $max_driver_len = length $driver; + } + } + for my $driver (sort keys %driver_config_hard_code_list) { + if (($driver ne "hardcoded_no_driver") && ($driver ne "no_driver")) { + my $first = 1; + for my $config (@{ $driver_config_hard_code_list{$driver} }) { + if ($first) { + print " $driver"; + print " " x ($max_driver_len - length $driver); + $first = 0; + } else { + print " ", " " x $max_driver_len; + } + print " $config\n"; + } + } + } + + + print "\n\n"; + print "These drivers are black listed.\n"; + print "\n"; + for my $driver (@black_list_driver) { + print " $driver\n"; + } + + print "\n"; + + $exit_after_messages = 1; +} + + +if ($exit_after_messages) { + exit 0; +} + + +$exclude_flag_pattern = "["; +for my $exclude_flag (@exclude_flag) { + $exclude_flag_pattern = $exclude_flag_pattern . $exclude_flag; +} +$exclude_flag_pattern = $exclude_flag_pattern . "]"; +# clean up if empty +$exclude_flag_pattern =~ s/^\[\]$//; + + +$include_flag_pattern = "["; +for my $include_flag (@include_flag) { + $include_flag_pattern = $include_flag_pattern . $include_flag; +} +$include_flag_pattern = $include_flag_pattern . "]"; +# clean up if empty +$include_flag_pattern =~ s/^\[\]$//; + + +if ($exclude_flag_pattern) { + my $found = 0; + for $pr_flag_value (@pr_flag_value) { + if ($exclude_flag_pattern =~ m/$pr_flag_value/) { + $found = 1; + } + } + if (!$found) { + &cmd_line_err("invalid value for FLAG in --exclude-flag\n"); + exit 1 + } +} + +if ($include_flag_pattern) { + my $found = 0; + for $pr_flag_value (@pr_flag_value) { + if ($include_flag_pattern =~ m/$pr_flag_value/) { + $found = 1; + } + } + if (!$found) { + &cmd_line_err("invalid value for FLAG in --include-flag\n"); + exit 1 + } +} + +if ($include_suspect) { + $include_flag_pattern =~ s/\[//; + $include_flag_pattern =~ s/\]//; + $include_flag_pattern = "[" . $include_flag_pattern . "A-Z]"; +} + +if ($exclude_flag_pattern =~ m/$include_flag_pattern/) { + &cmd_line_err("the same flag appears in both --exclude-flag and --include-flag or --include-suspect\n"); + exit 1 +} + + +# ($#ARGV < 0) is valid for --help, --version +if ($#ARGV < 0) { + &cmd_line_err("device-tree... is required"); + exit 1 +} + + +if ($config_file) { + &read_config_file(); +} + + +# avoid pushing duplicates for this value +$driver = "hardcoded_no_driver"; +for $config ( @{ $driver_config_hard_code_list{$driver} } ) { + push @{ $driver_config{$driver} }, $config; +} + +if ($white_list_driver) { + for my $compat (keys %driver_hard_code_list) { + for my $driver (@{ $driver_hard_code_list{$compat} }) { + push @{ $compat_driver{$compat} }, $driver; + if ($driver ne "hardcoded_no_driver") { + $driver_count{$compat} = scalar @{ $compat_driver{$compat} }; + } + } + } +} + +if ($white_list_config) { + for my $driver (keys %driver_config_hard_code_list) { + if ($driver ne "hardcoded_no_driver") { + for $config ( @{ $driver_config_hard_code_list{$driver} } ) { + push @{ $driver_config{$driver} }, $config; + } + } + } +} + +if (-x "scripts/dtc/dtx_diff") { + $dtx_diff = "scripts/dtc/dtx_diff"; +} else { + + print STDERR "\n"; + print STDERR "$script_name must be run from the root directory of a Linux kernel tree\n"; + print STDERR "\n"; + exit 3; +} + +for $file (@ARGV) { + &read_dts($file); +} diff --git a/src/net/scripts/dtc/dtc-lexer.l b/src/net/scripts/dtc/dtc-lexer.l new file mode 100644 index 0000000..b3b7270 --- /dev/null +++ b/src/net/scripts/dtc/dtc-lexer.l @@ -0,0 +1,297 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005. + */ + +%option noyywrap nounput noinput never-interactive + +%x BYTESTRING +%x PROPNODENAME +%s V1 + +PROPNODECHAR [a-zA-Z0-9,._+*#?@-] +PATHCHAR ({PROPNODECHAR}|[/]) +LABEL [a-zA-Z_][a-zA-Z0-9_]* +STRING \"([^\\"]|\\.)*\" +CHAR_LITERAL '([^']|\\')*' +WS [[:space:]] +COMMENT "/*"([^*]|\*+[^*/])*\*+"/" +LINECOMMENT "//".*\n + +%{ +#include "dtc.h" +#include "srcpos.h" +#include "dtc-parser.tab.h" + +extern bool treesource_error; + +/* CAUTION: this will stop working if we ever use yyless() or yyunput() */ +#define YY_USER_ACTION \ + { \ + srcpos_update(&yylloc, yytext, yyleng); \ + } + +/*#define LEXDEBUG 1*/ + +#ifdef LEXDEBUG +#define DPRINT(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__) +#else +#define DPRINT(fmt, ...) do { } while (0) +#endif + +static int dts_version = 1; + +#define BEGIN_DEFAULT() DPRINT("<V1>\n"); \ + BEGIN(V1); \ + +static void push_input_file(const char *filename); +static bool pop_input_file(void); +static void PRINTF(1, 2) lexical_error(const char *fmt, ...); + +%} + +%% +<*>"/include/"{WS}*{STRING} { + char *name = strchr(yytext, '\"') + 1; + yytext[yyleng-1] = '\0'; + push_input_file(name); + } + +<*>^"#"(line)?[ \t]+[0-9]+[ \t]+{STRING}([ \t]+[0-9]+)? { + char *line, *fnstart, *fnend; + struct data fn; + /* skip text before line # */ + line = yytext; + while (!isdigit((unsigned char)*line)) + line++; + + /* regexp ensures that first and list " + * in the whole yytext are those at + * beginning and end of the filename string */ + fnstart = memchr(yytext, '"', yyleng); + for (fnend = yytext + yyleng - 1; + *fnend != '"'; fnend--) + ; + assert(fnstart && fnend && (fnend > fnstart)); + + fn = data_copy_escape_string(fnstart + 1, + fnend - fnstart - 1); + + /* Don't allow nuls in filenames */ + if (memchr(fn.val, '\0', fn.len - 1)) + lexical_error("nul in line number directive"); + + /* -1 since #line is the number of the next line */ + srcpos_set_line(xstrdup(fn.val), atoi(line) - 1); + data_free(fn); + } + +<*><<EOF>> { + if (!pop_input_file()) { + yyterminate(); + } + } + +<*>{STRING} { + DPRINT("String: %s\n", yytext); + yylval.data = data_copy_escape_string(yytext+1, + yyleng-2); + return DT_STRING; + } + +<*>"/dts-v1/" { + DPRINT("Keyword: /dts-v1/\n"); + dts_version = 1; + BEGIN_DEFAULT(); + return DT_V1; + } + +<*>"/plugin/" { + DPRINT("Keyword: /plugin/\n"); + return DT_PLUGIN; + } + +<*>"/memreserve/" { + DPRINT("Keyword: /memreserve/\n"); + BEGIN_DEFAULT(); + return DT_MEMRESERVE; + } + +<*>"/bits/" { + DPRINT("Keyword: /bits/\n"); + BEGIN_DEFAULT(); + return DT_BITS; + } + +<*>"/delete-property/" { + DPRINT("Keyword: /delete-property/\n"); + DPRINT("<PROPNODENAME>\n"); + BEGIN(PROPNODENAME); + return DT_DEL_PROP; + } + +<*>"/delete-node/" { + DPRINT("Keyword: /delete-node/\n"); + DPRINT("<PROPNODENAME>\n"); + BEGIN(PROPNODENAME); + return DT_DEL_NODE; + } + +<*>"/omit-if-no-ref/" { + DPRINT("Keyword: /omit-if-no-ref/\n"); + DPRINT("<PROPNODENAME>\n"); + BEGIN(PROPNODENAME); + return DT_OMIT_NO_REF; + } + +<*>{LABEL}: { + DPRINT("Label: %s\n", yytext); + yylval.labelref = xstrdup(yytext); + yylval.labelref[yyleng-1] = '\0'; + return DT_LABEL; + } + +<V1>([0-9]+|0[xX][0-9a-fA-F]+)(U|L|UL|LL|ULL)? { + char *e; + DPRINT("Integer Literal: '%s'\n", yytext); + + errno = 0; + yylval.integer = strtoull(yytext, &e, 0); + + if (*e && e[strspn(e, "UL")]) { + lexical_error("Bad integer literal '%s'", + yytext); + } + + if (errno == ERANGE) + lexical_error("Integer literal '%s' out of range", + yytext); + else + /* ERANGE is the only strtoull error triggerable + * by strings matching the pattern */ + assert(errno == 0); + return DT_LITERAL; + } + +<*>{CHAR_LITERAL} { + struct data d; + DPRINT("Character literal: %s\n", yytext); + + d = data_copy_escape_string(yytext+1, yyleng-2); + if (d.len == 1) { + lexical_error("Empty character literal"); + yylval.integer = 0; + } else { + yylval.integer = (unsigned char)d.val[0]; + + if (d.len > 2) + lexical_error("Character literal has %d" + " characters instead of 1", + d.len - 1); + } + + data_free(d); + return DT_CHAR_LITERAL; + } + +<*>\&{LABEL} { /* label reference */ + DPRINT("Ref: %s\n", yytext+1); + yylval.labelref = xstrdup(yytext+1); + return DT_LABEL_REF; + } + +<*>"&{/"{PATHCHAR}*\} { /* new-style path reference */ + yytext[yyleng-1] = '\0'; + DPRINT("Ref: %s\n", yytext+2); + yylval.labelref = xstrdup(yytext+2); + return DT_PATH_REF; + } + +<BYTESTRING>[0-9a-fA-F]{2} { + yylval.byte = strtol(yytext, NULL, 16); + DPRINT("Byte: %02x\n", (int)yylval.byte); + return DT_BYTE; + } + +<BYTESTRING>"]" { + DPRINT("/BYTESTRING\n"); + BEGIN_DEFAULT(); + return ']'; + } + +<PROPNODENAME>\\?{PROPNODECHAR}+ { + DPRINT("PropNodeName: %s\n", yytext); + yylval.propnodename = xstrdup((yytext[0] == '\\') ? + yytext + 1 : yytext); + BEGIN_DEFAULT(); + return DT_PROPNODENAME; + } + +"/incbin/" { + DPRINT("Binary Include\n"); + return DT_INCBIN; + } + +<*>{WS}+ /* eat whitespace */ +<*>{COMMENT}+ /* eat C-style comments */ +<*>{LINECOMMENT}+ /* eat C++-style comments */ + +<*>"<<" { return DT_LSHIFT; }; +<*>">>" { return DT_RSHIFT; }; +<*>"<=" { return DT_LE; }; +<*>">=" { return DT_GE; }; +<*>"==" { return DT_EQ; }; +<*>"!=" { return DT_NE; }; +<*>"&&" { return DT_AND; }; +<*>"||" { return DT_OR; }; + +<*>. { + DPRINT("Char: %c (\\x%02x)\n", yytext[0], + (unsigned)yytext[0]); + if (yytext[0] == '[') { + DPRINT("<BYTESTRING>\n"); + BEGIN(BYTESTRING); + } + if ((yytext[0] == '{') + || (yytext[0] == ';')) { + DPRINT("<PROPNODENAME>\n"); + BEGIN(PROPNODENAME); + } + return yytext[0]; + } + +%% + +static void push_input_file(const char *filename) +{ + assert(filename); + + srcfile_push(filename); + + yyin = current_srcfile->f; + + yypush_buffer_state(yy_create_buffer(yyin, YY_BUF_SIZE)); +} + + +static bool pop_input_file(void) +{ + if (srcfile_pop() == 0) + return false; + + yypop_buffer_state(); + yyin = current_srcfile->f; + + return true; +} + +static void lexical_error(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + srcpos_verror(&yylloc, "Lexical error", fmt, ap); + va_end(ap); + + treesource_error = true; +} diff --git a/src/net/scripts/dtc/dtc-parser.y b/src/net/scripts/dtc/dtc-parser.y new file mode 100644 index 0000000..a0316a3 --- /dev/null +++ b/src/net/scripts/dtc/dtc-parser.y @@ -0,0 +1,576 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005. + */ +%locations + +%{ +#include <stdio.h> +#include <inttypes.h> + +#include "dtc.h" +#include "srcpos.h" + +extern int yylex(void); +extern void yyerror(char const *s); +#define ERROR(loc, ...) \ + do { \ + srcpos_error((loc), "Error", __VA_ARGS__); \ + treesource_error = true; \ + } while (0) + +#define YYERROR_CALL(msg) yyerror(msg) + +extern struct dt_info *parser_output; +extern bool treesource_error; +%} + +%union { + char *propnodename; + char *labelref; + uint8_t byte; + struct data data; + + struct { + struct data data; + int bits; + } array; + + struct property *prop; + struct property *proplist; + struct node *node; + struct node *nodelist; + struct reserve_info *re; + uint64_t integer; + unsigned int flags; +} + +%token DT_V1 +%token DT_PLUGIN +%token DT_MEMRESERVE +%token DT_LSHIFT DT_RSHIFT DT_LE DT_GE DT_EQ DT_NE DT_AND DT_OR +%token DT_BITS +%token DT_DEL_PROP +%token DT_DEL_NODE +%token DT_OMIT_NO_REF +%token <propnodename> DT_PROPNODENAME +%token <integer> DT_LITERAL +%token <integer> DT_CHAR_LITERAL +%token <byte> DT_BYTE +%token <data> DT_STRING +%token <labelref> DT_LABEL +%token <labelref> DT_LABEL_REF +%token <labelref> DT_PATH_REF +%token DT_INCBIN + +%type <data> propdata +%type <data> propdataprefix +%type <flags> header +%type <flags> headers +%type <re> memreserve +%type <re> memreserves +%type <array> arrayprefix +%type <data> bytestring +%type <prop> propdef +%type <proplist> proplist +%type <labelref> dt_ref + +%type <node> devicetree +%type <node> nodedef +%type <node> subnode +%type <nodelist> subnodes + +%type <integer> integer_prim +%type <integer> integer_unary +%type <integer> integer_mul +%type <integer> integer_add +%type <integer> integer_shift +%type <integer> integer_rela +%type <integer> integer_eq +%type <integer> integer_bitand +%type <integer> integer_bitxor +%type <integer> integer_bitor +%type <integer> integer_and +%type <integer> integer_or +%type <integer> integer_trinary +%type <integer> integer_expr + +%% + +sourcefile: + headers memreserves devicetree + { + parser_output = build_dt_info($1, $2, $3, + guess_boot_cpuid($3)); + } + ; + +header: + DT_V1 ';' + { + $$ = DTSF_V1; + } + | DT_V1 ';' DT_PLUGIN ';' + { + $$ = DTSF_V1 | DTSF_PLUGIN; + } + ; + +headers: + header + | header headers + { + if ($2 != $1) + ERROR(&@2, "Header flags don't match earlier ones"); + $$ = $1; + } + ; + +memreserves: + /* empty */ + { + $$ = NULL; + } + | memreserve memreserves + { + $$ = chain_reserve_entry($1, $2); + } + ; + +memreserve: + DT_MEMRESERVE integer_prim integer_prim ';' + { + $$ = build_reserve_entry($2, $3); + } + | DT_LABEL memreserve + { + add_label(&$2->labels, $1); + $$ = $2; + } + ; + +dt_ref: DT_LABEL_REF | DT_PATH_REF; + +devicetree: + '/' nodedef + { + $$ = name_node($2, ""); + } + | devicetree '/' nodedef + { + $$ = merge_nodes($1, $3); + } + | dt_ref nodedef + { + /* + * We rely on the rule being always: + * versioninfo plugindecl memreserves devicetree + * so $-1 is what we want (plugindecl) + */ + if (!($<flags>-1 & DTSF_PLUGIN)) + ERROR(&@2, "Label or path %s not found", $1); + $$ = add_orphan_node( + name_node(build_node(NULL, NULL, NULL), + ""), + $2, $1); + } + | devicetree DT_LABEL dt_ref nodedef + { + struct node *target = get_node_by_ref($1, $3); + + if (target) { + add_label(&target->labels, $2); + merge_nodes(target, $4); + } else + ERROR(&@3, "Label or path %s not found", $3); + $$ = $1; + } + | devicetree DT_PATH_REF nodedef + { + /* + * We rely on the rule being always: + * versioninfo plugindecl memreserves devicetree + * so $-1 is what we want (plugindecl) + */ + if ($<flags>-1 & DTSF_PLUGIN) { + add_orphan_node($1, $3, $2); + } else { + struct node *target = get_node_by_ref($1, $2); + + if (target) + merge_nodes(target, $3); + else + ERROR(&@2, "Label or path %s not found", $2); + } + $$ = $1; + } + | devicetree DT_LABEL_REF nodedef + { + struct node *target = get_node_by_ref($1, $2); + + if (target) { + merge_nodes(target, $3); + } else { + /* + * We rely on the rule being always: + * versioninfo plugindecl memreserves devicetree + * so $-1 is what we want (plugindecl) + */ + if ($<flags>-1 & DTSF_PLUGIN) + add_orphan_node($1, $3, $2); + else + ERROR(&@2, "Label or path %s not found", $2); + } + $$ = $1; + } + | devicetree DT_DEL_NODE dt_ref ';' + { + struct node *target = get_node_by_ref($1, $3); + + if (target) + delete_node(target); + else + ERROR(&@3, "Label or path %s not found", $3); + + + $$ = $1; + } + | devicetree DT_OMIT_NO_REF dt_ref ';' + { + struct node *target = get_node_by_ref($1, $3); + + if (target) + omit_node_if_unused(target); + else + ERROR(&@3, "Label or path %s not found", $3); + + + $$ = $1; + } + ; + +nodedef: + '{' proplist subnodes '}' ';' + { + $$ = build_node($2, $3, &@$); + } + ; + +proplist: + /* empty */ + { + $$ = NULL; + } + | proplist propdef + { + $$ = chain_property($2, $1); + } + ; + +propdef: + DT_PROPNODENAME '=' propdata ';' + { + $$ = build_property($1, $3, &@$); + } + | DT_PROPNODENAME ';' + { + $$ = build_property($1, empty_data, &@$); + } + | DT_DEL_PROP DT_PROPNODENAME ';' + { + $$ = build_property_delete($2); + } + | DT_LABEL propdef + { + add_label(&$2->labels, $1); + $$ = $2; + } + ; + +propdata: + propdataprefix DT_STRING + { + $$ = data_merge($1, $2); + } + | propdataprefix arrayprefix '>' + { + $$ = data_merge($1, $2.data); + } + | propdataprefix '[' bytestring ']' + { + $$ = data_merge($1, $3); + } + | propdataprefix dt_ref + { + $1 = data_add_marker($1, TYPE_STRING, $2); + $$ = data_add_marker($1, REF_PATH, $2); + } + | propdataprefix DT_INCBIN '(' DT_STRING ',' integer_prim ',' integer_prim ')' + { + FILE *f = srcfile_relative_open($4.val, NULL); + struct data d; + + if ($6 != 0) + if (fseek(f, $6, SEEK_SET) != 0) + die("Couldn't seek to offset %llu in \"%s\": %s", + (unsigned long long)$6, $4.val, + strerror(errno)); + + d = data_copy_file(f, $8); + + $$ = data_merge($1, d); + fclose(f); + } + | propdataprefix DT_INCBIN '(' DT_STRING ')' + { + FILE *f = srcfile_relative_open($4.val, NULL); + struct data d = empty_data; + + d = data_copy_file(f, -1); + + $$ = data_merge($1, d); + fclose(f); + } + | propdata DT_LABEL + { + $$ = data_add_marker($1, LABEL, $2); + } + ; + +propdataprefix: + /* empty */ + { + $$ = empty_data; + } + | propdata ',' + { + $$ = $1; + } + | propdataprefix DT_LABEL + { + $$ = data_add_marker($1, LABEL, $2); + } + ; + +arrayprefix: + DT_BITS DT_LITERAL '<' + { + unsigned long long bits; + enum markertype type = TYPE_UINT32; + + bits = $2; + + switch (bits) { + case 8: type = TYPE_UINT8; break; + case 16: type = TYPE_UINT16; break; + case 32: type = TYPE_UINT32; break; + case 64: type = TYPE_UINT64; break; + default: + ERROR(&@2, "Array elements must be" + " 8, 16, 32 or 64-bits"); + bits = 32; + } + + $$.data = data_add_marker(empty_data, type, NULL); + $$.bits = bits; + } + | '<' + { + $$.data = data_add_marker(empty_data, TYPE_UINT32, NULL); + $$.bits = 32; + } + | arrayprefix integer_prim + { + if ($1.bits < 64) { + uint64_t mask = (1ULL << $1.bits) - 1; + /* + * Bits above mask must either be all zero + * (positive within range of mask) or all one + * (negative and sign-extended). The second + * condition is true if when we set all bits + * within the mask to one (i.e. | in the + * mask), all bits are one. + */ + if (($2 > mask) && (($2 | mask) != -1ULL)) + ERROR(&@2, "Value out of range for" + " %d-bit array element", $1.bits); + } + + $$.data = data_append_integer($1.data, $2, $1.bits); + } + | arrayprefix dt_ref + { + uint64_t val = ~0ULL >> (64 - $1.bits); + + if ($1.bits == 32) + $1.data = data_add_marker($1.data, + REF_PHANDLE, + $2); + else + ERROR(&@2, "References are only allowed in " + "arrays with 32-bit elements."); + + $$.data = data_append_integer($1.data, val, $1.bits); + } + | arrayprefix DT_LABEL + { + $$.data = data_add_marker($1.data, LABEL, $2); + } + ; + +integer_prim: + DT_LITERAL + | DT_CHAR_LITERAL + | '(' integer_expr ')' + { + $$ = $2; + } + ; + +integer_expr: + integer_trinary + ; + +integer_trinary: + integer_or + | integer_or '?' integer_expr ':' integer_trinary { $$ = $1 ? $3 : $5; } + ; + +integer_or: + integer_and + | integer_or DT_OR integer_and { $$ = $1 || $3; } + ; + +integer_and: + integer_bitor + | integer_and DT_AND integer_bitor { $$ = $1 && $3; } + ; + +integer_bitor: + integer_bitxor + | integer_bitor '|' integer_bitxor { $$ = $1 | $3; } + ; + +integer_bitxor: + integer_bitand + | integer_bitxor '^' integer_bitand { $$ = $1 ^ $3; } + ; + +integer_bitand: + integer_eq + | integer_bitand '&' integer_eq { $$ = $1 & $3; } + ; + +integer_eq: + integer_rela + | integer_eq DT_EQ integer_rela { $$ = $1 == $3; } + | integer_eq DT_NE integer_rela { $$ = $1 != $3; } + ; + +integer_rela: + integer_shift + | integer_rela '<' integer_shift { $$ = $1 < $3; } + | integer_rela '>' integer_shift { $$ = $1 > $3; } + | integer_rela DT_LE integer_shift { $$ = $1 <= $3; } + | integer_rela DT_GE integer_shift { $$ = $1 >= $3; } + ; + +integer_shift: + integer_shift DT_LSHIFT integer_add { $$ = ($3 < 64) ? ($1 << $3) : 0; } + | integer_shift DT_RSHIFT integer_add { $$ = ($3 < 64) ? ($1 >> $3) : 0; } + | integer_add + ; + +integer_add: + integer_add '+' integer_mul { $$ = $1 + $3; } + | integer_add '-' integer_mul { $$ = $1 - $3; } + | integer_mul + ; + +integer_mul: + integer_mul '*' integer_unary { $$ = $1 * $3; } + | integer_mul '/' integer_unary + { + if ($3 != 0) { + $$ = $1 / $3; + } else { + ERROR(&@$, "Division by zero"); + $$ = 0; + } + } + | integer_mul '%' integer_unary + { + if ($3 != 0) { + $$ = $1 % $3; + } else { + ERROR(&@$, "Division by zero"); + $$ = 0; + } + } + | integer_unary + ; + +integer_unary: + integer_prim + | '-' integer_unary { $$ = -$2; } + | '~' integer_unary { $$ = ~$2; } + | '!' integer_unary { $$ = !$2; } + ; + +bytestring: + /* empty */ + { + $$ = data_add_marker(empty_data, TYPE_UINT8, NULL); + } + | bytestring DT_BYTE + { + $$ = data_append_byte($1, $2); + } + | bytestring DT_LABEL + { + $$ = data_add_marker($1, LABEL, $2); + } + ; + +subnodes: + /* empty */ + { + $$ = NULL; + } + | subnode subnodes + { + $$ = chain_node($1, $2); + } + | subnode propdef + { + ERROR(&@2, "Properties must precede subnodes"); + YYERROR; + } + ; + +subnode: + DT_PROPNODENAME nodedef + { + $$ = name_node($2, $1); + } + | DT_DEL_NODE DT_PROPNODENAME ';' + { + $$ = name_node(build_node_delete(&@$), $2); + } + | DT_OMIT_NO_REF subnode + { + $$ = omit_node_if_unused($2); + } + | DT_LABEL subnode + { + add_label(&$2->labels, $1); + $$ = $2; + } + ; + +%% + +void yyerror(char const *s) +{ + ERROR(&yylloc, "%s", s); +} diff --git a/src/net/scripts/dtc/dtc.c b/src/net/scripts/dtc/dtc.c new file mode 100644 index 0000000..bdb3f59 --- /dev/null +++ b/src/net/scripts/dtc/dtc.c @@ -0,0 +1,369 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005. + */ + +#include <sys/stat.h> + +#include "dtc.h" +#include "srcpos.h" + +/* + * Command line options + */ +int quiet; /* Level of quietness */ +int reservenum; /* Number of memory reservation slots */ +int minsize; /* Minimum blob size */ +int padsize; /* Additional padding to blob */ +int alignsize; /* Additional padding to blob accroding to the alignsize */ +int phandle_format = PHANDLE_EPAPR; /* Use linux,phandle or phandle properties */ +int generate_symbols; /* enable symbols & fixup support */ +int generate_fixups; /* suppress generation of fixups on symbol support */ +int auto_label_aliases; /* auto generate labels -> aliases */ +int annotate; /* Level of annotation: 1 for input source location + >1 for full input source location. */ + +static int is_power_of_2(int x) +{ + return (x > 0) && ((x & (x - 1)) == 0); +} + +static void fill_fullpaths(struct node *tree, const char *prefix) +{ + struct node *child; + const char *unit; + + tree->fullpath = join_path(prefix, tree->name); + + unit = strchr(tree->name, '@'); + if (unit) + tree->basenamelen = unit - tree->name; + else + tree->basenamelen = strlen(tree->name); + + for_each_child(tree, child) + fill_fullpaths(child, tree->fullpath); +} + +/* Usage related data. */ +static const char usage_synopsis[] = "dtc [options] <input file>"; +static const char usage_short_opts[] = "qI:O:o:V:d:R:S:p:a:fb:i:H:sW:E:@AThv"; +static struct option const usage_long_opts[] = { + {"quiet", no_argument, NULL, 'q'}, + {"in-format", a_argument, NULL, 'I'}, + {"out", a_argument, NULL, 'o'}, + {"out-format", a_argument, NULL, 'O'}, + {"out-version", a_argument, NULL, 'V'}, + {"out-dependency", a_argument, NULL, 'd'}, + {"reserve", a_argument, NULL, 'R'}, + {"space", a_argument, NULL, 'S'}, + {"pad", a_argument, NULL, 'p'}, + {"align", a_argument, NULL, 'a'}, + {"boot-cpu", a_argument, NULL, 'b'}, + {"force", no_argument, NULL, 'f'}, + {"include", a_argument, NULL, 'i'}, + {"sort", no_argument, NULL, 's'}, + {"phandle", a_argument, NULL, 'H'}, + {"warning", a_argument, NULL, 'W'}, + {"error", a_argument, NULL, 'E'}, + {"symbols", no_argument, NULL, '@'}, + {"auto-alias", no_argument, NULL, 'A'}, + {"annotate", no_argument, NULL, 'T'}, + {"help", no_argument, NULL, 'h'}, + {"version", no_argument, NULL, 'v'}, + {NULL, no_argument, NULL, 0x0}, +}; +static const char * const usage_opts_help[] = { + "\n\tQuiet: -q suppress warnings, -qq errors, -qqq all", + "\n\tInput formats are:\n" + "\t\tdts - device tree source text\n" + "\t\tdtb - device tree blob\n" + "\t\tfs - /proc/device-tree style directory", + "\n\tOutput file", + "\n\tOutput formats are:\n" + "\t\tdts - device tree source text\n" + "\t\tdtb - device tree blob\n" +#ifndef NO_YAML + "\t\tyaml - device tree encoded as YAML\n" +#endif + "\t\tasm - assembler source", + "\n\tBlob version to produce, defaults to "stringify(DEFAULT_FDT_VERSION)" (for dtb and asm output)", + "\n\tOutput dependency file", + "\n\tMake space for <number> reserve map entries (for dtb and asm output)", + "\n\tMake the blob at least <bytes> long (extra space)", + "\n\tAdd padding to the blob of <bytes> long (extra space)", + "\n\tMake the blob align to the <bytes> (extra space)", + "\n\tSet the physical boot cpu", + "\n\tTry to produce output even if the input tree has errors", + "\n\tAdd a path to search for include files", + "\n\tSort nodes and properties before outputting (useful for comparing trees)", + "\n\tValid phandle formats are:\n" + "\t\tlegacy - \"linux,phandle\" properties only\n" + "\t\tepapr - \"phandle\" properties only\n" + "\t\tboth - Both \"linux,phandle\" and \"phandle\" properties", + "\n\tEnable/disable warnings (prefix with \"no-\")", + "\n\tEnable/disable errors (prefix with \"no-\")", + "\n\tEnable generation of symbols", + "\n\tEnable auto-alias of labels", + "\n\tAnnotate output .dts with input source file and line (-T -T for more details)", + "\n\tPrint this help and exit", + "\n\tPrint version and exit", + NULL, +}; + +static const char *guess_type_by_name(const char *fname, const char *fallback) +{ + const char *s; + + s = strrchr(fname, '.'); + if (s == NULL) + return fallback; + if (!strcasecmp(s, ".dts")) + return "dts"; + if (!strcasecmp(s, ".yaml")) + return "yaml"; + if (!strcasecmp(s, ".dtb")) + return "dtb"; + return fallback; +} + +static const char *guess_input_format(const char *fname, const char *fallback) +{ + struct stat statbuf; + fdt32_t magic; + FILE *f; + + if (stat(fname, &statbuf) != 0) + return fallback; + + if (S_ISDIR(statbuf.st_mode)) + return "fs"; + + if (!S_ISREG(statbuf.st_mode)) + return fallback; + + f = fopen(fname, "r"); + if (f == NULL) + return fallback; + if (fread(&magic, 4, 1, f) != 1) { + fclose(f); + return fallback; + } + fclose(f); + + if (fdt32_to_cpu(magic) == FDT_MAGIC) + return "dtb"; + + return guess_type_by_name(fname, fallback); +} + +int main(int argc, char *argv[]) +{ + struct dt_info *dti; + const char *inform = NULL; + const char *outform = NULL; + const char *outname = "-"; + const char *depname = NULL; + bool force = false, sort = false; + const char *arg; + int opt; + FILE *outf = NULL; + int outversion = DEFAULT_FDT_VERSION; + long long cmdline_boot_cpuid = -1; + + quiet = 0; + reservenum = 0; + minsize = 0; + padsize = 0; + alignsize = 0; + + while ((opt = util_getopt_long()) != EOF) { + switch (opt) { + case 'I': + inform = optarg; + break; + case 'O': + outform = optarg; + break; + case 'o': + outname = optarg; + break; + case 'V': + outversion = strtol(optarg, NULL, 0); + break; + case 'd': + depname = optarg; + break; + case 'R': + reservenum = strtol(optarg, NULL, 0); + break; + case 'S': + minsize = strtol(optarg, NULL, 0); + break; + case 'p': + padsize = strtol(optarg, NULL, 0); + break; + case 'a': + alignsize = strtol(optarg, NULL, 0); + if (!is_power_of_2(alignsize)) + die("Invalid argument \"%d\" to -a option\n", + alignsize); + break; + case 'f': + force = true; + break; + case 'q': + quiet++; + break; + case 'b': + cmdline_boot_cpuid = strtoll(optarg, NULL, 0); + break; + case 'i': + srcfile_add_search_path(optarg); + break; + case 'v': + util_version(); + case 'H': + if (streq(optarg, "legacy")) + phandle_format = PHANDLE_LEGACY; + else if (streq(optarg, "epapr")) + phandle_format = PHANDLE_EPAPR; + else if (streq(optarg, "both")) + phandle_format = PHANDLE_BOTH; + else + die("Invalid argument \"%s\" to -H option\n", + optarg); + break; + + case 's': + sort = true; + break; + + case 'W': + parse_checks_option(true, false, optarg); + break; + + case 'E': + parse_checks_option(false, true, optarg); + break; + + case '@': + generate_symbols = 1; + break; + case 'A': + auto_label_aliases = 1; + break; + case 'T': + annotate++; + break; + + case 'h': + usage(NULL); + default: + usage("unknown option"); + } + } + + if (argc > (optind+1)) + usage("missing files"); + else if (argc < (optind+1)) + arg = "-"; + else + arg = argv[optind]; + + /* minsize and padsize are mutually exclusive */ + if (minsize && padsize) + die("Can't set both -p and -S\n"); + + if (depname) { + depfile = fopen(depname, "w"); + if (!depfile) + die("Couldn't open dependency file %s: %s\n", depname, + strerror(errno)); + fprintf(depfile, "%s:", outname); + } + + if (inform == NULL) + inform = guess_input_format(arg, "dts"); + if (outform == NULL) { + outform = guess_type_by_name(outname, NULL); + if (outform == NULL) { + if (streq(inform, "dts")) + outform = "dtb"; + else + outform = "dts"; + } + } + if (annotate && (!streq(inform, "dts") || !streq(outform, "dts"))) + die("--annotate requires -I dts -O dts\n"); + if (streq(inform, "dts")) + dti = dt_from_source(arg); + else if (streq(inform, "fs")) + dti = dt_from_fs(arg); + else if(streq(inform, "dtb")) + dti = dt_from_blob(arg); + else + die("Unknown input format \"%s\"\n", inform); + + dti->outname = outname; + + if (depfile) { + fputc('\n', depfile); + fclose(depfile); + } + + if (cmdline_boot_cpuid != -1) + dti->boot_cpuid_phys = cmdline_boot_cpuid; + + fill_fullpaths(dti->dt, ""); + + /* on a plugin, generate by default */ + if (dti->dtsflags & DTSF_PLUGIN) { + generate_fixups = 1; + } + + process_checks(force, dti); + + if (auto_label_aliases) + generate_label_tree(dti, "aliases", false); + + if (generate_symbols) + generate_label_tree(dti, "__symbols__", true); + + if (generate_fixups) { + generate_fixups_tree(dti, "__fixups__"); + generate_local_fixups_tree(dti, "__local_fixups__"); + } + + if (sort) + sort_tree(dti); + + if (streq(outname, "-")) { + outf = stdout; + } else { + outf = fopen(outname, "wb"); + if (! outf) + die("Couldn't open output file %s: %s\n", + outname, strerror(errno)); + } + + if (streq(outform, "dts")) { + dt_to_source(outf, dti); +#ifndef NO_YAML + } else if (streq(outform, "yaml")) { + if (!streq(inform, "dts")) + die("YAML output format requires dts input format\n"); + dt_to_yaml(outf, dti); +#endif + } else if (streq(outform, "dtb")) { + dt_to_blob(outf, dti, outversion); + } else if (streq(outform, "asm")) { + dt_to_asm(outf, dti, outversion); + } else if (streq(outform, "null")) { + /* do nothing */ + } else { + die("Unknown output format \"%s\"\n", outform); + } + + exit(0); +} diff --git a/src/net/scripts/dtc/dtc.h b/src/net/scripts/dtc/dtc.h new file mode 100644 index 0000000..a08f415 --- /dev/null +++ b/src/net/scripts/dtc/dtc.h @@ -0,0 +1,332 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#ifndef DTC_H +#define DTC_H + +/* + * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005. + */ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <stdint.h> +#include <stdbool.h> +#include <stdarg.h> +#include <assert.h> +#include <ctype.h> +#include <errno.h> +#include <unistd.h> +#include <inttypes.h> + +#include <libfdt_env.h> +#include <fdt.h> + +#include "util.h" + +#ifdef DEBUG +#define debug(...) printf(__VA_ARGS__) +#else +#define debug(...) +#endif + +#define DEFAULT_FDT_VERSION 17 + +/* + * Command line options + */ +extern int quiet; /* Level of quietness */ +extern int reservenum; /* Number of memory reservation slots */ +extern int minsize; /* Minimum blob size */ +extern int padsize; /* Additional padding to blob */ +extern int alignsize; /* Additional padding to blob accroding to the alignsize */ +extern int phandle_format; /* Use linux,phandle or phandle properties */ +extern int generate_symbols; /* generate symbols for nodes with labels */ +extern int generate_fixups; /* generate fixups */ +extern int auto_label_aliases; /* auto generate labels -> aliases */ +extern int annotate; /* annotate .dts with input source location */ + +#define PHANDLE_LEGACY 0x1 +#define PHANDLE_EPAPR 0x2 +#define PHANDLE_BOTH 0x3 + +typedef uint32_t cell_t; + +static inline uint16_t dtb_ld16(const void *p) +{ + const uint8_t *bp = (const uint8_t *)p; + + return ((uint16_t)bp[0] << 8) + | bp[1]; +} + +static inline uint32_t dtb_ld32(const void *p) +{ + const uint8_t *bp = (const uint8_t *)p; + + return ((uint32_t)bp[0] << 24) + | ((uint32_t)bp[1] << 16) + | ((uint32_t)bp[2] << 8) + | bp[3]; +} + +static inline uint64_t dtb_ld64(const void *p) +{ + const uint8_t *bp = (const uint8_t *)p; + + return ((uint64_t)bp[0] << 56) + | ((uint64_t)bp[1] << 48) + | ((uint64_t)bp[2] << 40) + | ((uint64_t)bp[3] << 32) + | ((uint64_t)bp[4] << 24) + | ((uint64_t)bp[5] << 16) + | ((uint64_t)bp[6] << 8) + | bp[7]; +} + +#define streq(a, b) (strcmp((a), (b)) == 0) +#define strstarts(s, prefix) (strncmp((s), (prefix), strlen(prefix)) == 0) +#define strprefixeq(a, n, b) (strlen(b) == (n) && (memcmp(a, b, n) == 0)) + +#define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) + +/* Data blobs */ +enum markertype { + TYPE_NONE, + REF_PHANDLE, + REF_PATH, + LABEL, + TYPE_UINT8, + TYPE_UINT16, + TYPE_UINT32, + TYPE_UINT64, + TYPE_STRING, +}; +extern const char *markername(enum markertype markertype); + +struct marker { + enum markertype type; + int offset; + char *ref; + struct marker *next; +}; + +struct data { + int len; + char *val; + struct marker *markers; +}; + + +#define empty_data ((struct data){ 0 /* all .members = 0 or NULL */ }) + +#define for_each_marker(m) \ + for (; (m); (m) = (m)->next) +#define for_each_marker_of_type(m, t) \ + for_each_marker(m) \ + if ((m)->type == (t)) + +size_t type_marker_length(struct marker *m); + +void data_free(struct data d); + +struct data data_grow_for(struct data d, int xlen); + +struct data data_copy_mem(const char *mem, int len); +struct data data_copy_escape_string(const char *s, int len); +struct data data_copy_file(FILE *f, size_t len); + +struct data data_append_data(struct data d, const void *p, int len); +struct data data_insert_at_marker(struct data d, struct marker *m, + const void *p, int len); +struct data data_merge(struct data d1, struct data d2); +struct data data_append_cell(struct data d, cell_t word); +struct data data_append_integer(struct data d, uint64_t word, int bits); +struct data data_append_re(struct data d, uint64_t address, uint64_t size); +struct data data_append_addr(struct data d, uint64_t addr); +struct data data_append_byte(struct data d, uint8_t byte); +struct data data_append_zeroes(struct data d, int len); +struct data data_append_align(struct data d, int align); + +struct data data_add_marker(struct data d, enum markertype type, char *ref); + +bool data_is_one_string(struct data d); + +/* DT constraints */ + +#define MAX_PROPNAME_LEN 31 +#define MAX_NODENAME_LEN 31 + +/* Live trees */ +struct label { + bool deleted; + char *label; + struct label *next; +}; + +struct bus_type { + const char *name; +}; + +struct property { + bool deleted; + char *name; + struct data val; + + struct property *next; + + struct label *labels; + struct srcpos *srcpos; +}; + +struct node { + bool deleted; + char *name; + struct property *proplist; + struct node *children; + + struct node *parent; + struct node *next_sibling; + + char *fullpath; + int basenamelen; + + cell_t phandle; + int addr_cells, size_cells; + + struct label *labels; + const struct bus_type *bus; + struct srcpos *srcpos; + + bool omit_if_unused, is_referenced; +}; + +#define for_each_label_withdel(l0, l) \ + for ((l) = (l0); (l); (l) = (l)->next) + +#define for_each_label(l0, l) \ + for_each_label_withdel(l0, l) \ + if (!(l)->deleted) + +#define for_each_property_withdel(n, p) \ + for ((p) = (n)->proplist; (p); (p) = (p)->next) + +#define for_each_property(n, p) \ + for_each_property_withdel(n, p) \ + if (!(p)->deleted) + +#define for_each_child_withdel(n, c) \ + for ((c) = (n)->children; (c); (c) = (c)->next_sibling) + +#define for_each_child(n, c) \ + for_each_child_withdel(n, c) \ + if (!(c)->deleted) + +void add_label(struct label **labels, char *label); +void delete_labels(struct label **labels); + +struct property *build_property(char *name, struct data val, + struct srcpos *srcpos); +struct property *build_property_delete(char *name); +struct property *chain_property(struct property *first, struct property *list); +struct property *reverse_properties(struct property *first); + +struct node *build_node(struct property *proplist, struct node *children, + struct srcpos *srcpos); +struct node *build_node_delete(struct srcpos *srcpos); +struct node *name_node(struct node *node, char *name); +struct node *omit_node_if_unused(struct node *node); +struct node *reference_node(struct node *node); +struct node *chain_node(struct node *first, struct node *list); +struct node *merge_nodes(struct node *old_node, struct node *new_node); +struct node *add_orphan_node(struct node *old_node, struct node *new_node, char *ref); + +void add_property(struct node *node, struct property *prop); +void delete_property_by_name(struct node *node, char *name); +void delete_property(struct property *prop); +void add_child(struct node *parent, struct node *child); +void delete_node_by_name(struct node *parent, char *name); +void delete_node(struct node *node); +void append_to_property(struct node *node, + char *name, const void *data, int len, + enum markertype type); + +const char *get_unitname(struct node *node); +struct property *get_property(struct node *node, const char *propname); +cell_t propval_cell(struct property *prop); +cell_t propval_cell_n(struct property *prop, int n); +struct property *get_property_by_label(struct node *tree, const char *label, + struct node **node); +struct marker *get_marker_label(struct node *tree, const char *label, + struct node **node, struct property **prop); +struct node *get_subnode(struct node *node, const char *nodename); +struct node *get_node_by_path(struct node *tree, const char *path); +struct node *get_node_by_label(struct node *tree, const char *label); +struct node *get_node_by_phandle(struct node *tree, cell_t phandle); +struct node *get_node_by_ref(struct node *tree, const char *ref); +cell_t get_node_phandle(struct node *root, struct node *node); + +uint32_t guess_boot_cpuid(struct node *tree); + +/* Boot info (tree plus memreserve information */ + +struct reserve_info { + uint64_t address, size; + + struct reserve_info *next; + + struct label *labels; +}; + +struct reserve_info *build_reserve_entry(uint64_t start, uint64_t len); +struct reserve_info *chain_reserve_entry(struct reserve_info *first, + struct reserve_info *list); +struct reserve_info *add_reserve_entry(struct reserve_info *list, + struct reserve_info *new); + + +struct dt_info { + unsigned int dtsflags; + struct reserve_info *reservelist; + uint32_t boot_cpuid_phys; + struct node *dt; /* the device tree */ + const char *outname; /* filename being written to, "-" for stdout */ +}; + +/* DTS version flags definitions */ +#define DTSF_V1 0x0001 /* /dts-v1/ */ +#define DTSF_PLUGIN 0x0002 /* /plugin/ */ + +struct dt_info *build_dt_info(unsigned int dtsflags, + struct reserve_info *reservelist, + struct node *tree, uint32_t boot_cpuid_phys); +void sort_tree(struct dt_info *dti); +void generate_label_tree(struct dt_info *dti, char *name, bool allocph); +void generate_fixups_tree(struct dt_info *dti, char *name); +void generate_local_fixups_tree(struct dt_info *dti, char *name); + +/* Checks */ + +void parse_checks_option(bool warn, bool error, const char *arg); +void process_checks(bool force, struct dt_info *dti); + +/* Flattened trees */ + +void dt_to_blob(FILE *f, struct dt_info *dti, int version); +void dt_to_asm(FILE *f, struct dt_info *dti, int version); + +struct dt_info *dt_from_blob(const char *fname); + +/* Tree source */ + +void dt_to_source(FILE *f, struct dt_info *dti); +struct dt_info *dt_from_source(const char *f); + +/* YAML source */ + +void dt_to_yaml(FILE *f, struct dt_info *dti); + +/* FS trees */ + +struct dt_info *dt_from_fs(const char *dirname); + +#endif /* DTC_H */ diff --git a/src/net/scripts/dtc/dtx_diff b/src/net/scripts/dtc/dtx_diff new file mode 100755 index 0000000..f2bbde4 --- /dev/null +++ b/src/net/scripts/dtc/dtx_diff @@ -0,0 +1,361 @@ +#! /bin/bash +# SPDX-License-Identifier: GPL-2.0-only + +# Copyright (C) 2015 Frank Rowand +# + + +usage() { + + # use spaces instead of tabs in the usage message + cat >&2 <<eod + +Usage: + + `basename $0` DTx + decompile DTx + + `basename $0` DTx_1 DTx_2 + diff DTx_1 and DTx_2 + + + --annotate synonym for -T + --color synonym for -c (requires diff with --color support) + -c enable colored output + -f print full dts in diff (--unified=99999) + -h synonym for --help + -help synonym for --help + --help print this message and exit + -s SRCTREE linux kernel source tree is at path SRCTREE + (default is current directory) + -S linux kernel source tree is at root of current git repo + -T annotate output .dts with input source file and line + (-T -T for more details) + -u unsorted, do not sort DTx + + +Each DTx is processed by the dtc compiler to produce a sorted dts source +file. If DTx is a dts source file then it is pre-processed in the same +manner as done for the compile of the dts source file in the Linux kernel +build system ('#include' and '/include/' directives are processed). + +If two DTx are provided, the resulting dts source files are diffed. + +If DTx is a directory, it is treated as a DT subtree, such as + /proc/device-tree. + +If DTx contains the binary blob magic value in the first four bytes, + it is treated as a binary blob (aka .dtb or FDT). + +Otherwise DTx is treated as a dts source file (aka .dts). + + If this script is not run from the root of the linux source tree, + and DTx utilizes '#include' or '/include/' then the path of the + linux source tree can be provided by '-s SRCTREE' or '-S' so that + include paths will be set properly. + + The shell variable \${ARCH} must provide the architecture containing + the dts source file for include paths to be set properly for '#include' + or '/include/' to be processed. + + If DTx_1 and DTx_2 are in different architectures, then this script + may not work since \${ARCH} is part of the include path. The following + workaround can be used: + + `basename $0` ARCH=arch_of_dtx_1 DTx_1 >tmp_dtx_1.dts + `basename $0` ARCH=arch_of_dtx_2 DTx_2 >tmp_dtx_2.dts + `basename $0` tmp_dtx_1.dts tmp_dtx_2.dts + rm tmp_dtx_1.dts tmp_dtx_2.dts + + If DTx_1 and DTx_2 are in different directories, then this script will + add the path of DTx_1 and DTx_2 to the include paths. If DTx_2 includes + a local file that exists in both the path of DTx_1 and DTx_2 then the + file in the path of DTx_1 will incorrectly be included. Possible + workaround: + + `basename $0` DTx_1 >tmp_dtx_1.dts + `basename $0` DTx_2 >tmp_dtx_2.dts + `basename $0` tmp_dtx_1.dts tmp_dtx_2.dts + rm tmp_dtx_1.dts tmp_dtx_2.dts + +eod +} + + +compile_to_dts() { + + dtx="$1" + dtc_include="$2" + + if [ -d "${dtx}" ] ; then + + # ----- input is file tree + + if ( ! ${DTC} -I fs ${dtx} ) ; then + exit 3 + fi + + elif [ -f "${dtx}" ] && [ -r "${dtx}" ] ; then + + magic=`hexdump -n 4 -e '/1 "%02x"' ${dtx}` + if [ "${magic}" = "d00dfeed" ] ; then + + # ----- input is FDT (binary blob) + + if ( ! ${DTC} -I dtb ${dtx} ) ; then + exit 3 + fi + + return + + fi + + # ----- input is DTS (source) + + if ( cpp ${cpp_flags} -x assembler-with-cpp ${dtx} \ + | ${DTC} ${dtc_include} -I dts ) ; then + return + fi + + echo "" >&2 + echo "Possible hints to resolve the above error:" >&2 + echo " (hints might not fix the problem)" >&2 + + hint_given=0 + + if [ "${ARCH}" = "" ] ; then + hint_given=1 + echo "" >&2 + echo " shell variable \$ARCH not set" >&2 + fi + + dtx_arch=`echo "/${dtx}" | sed -e 's|.*/arch/||' -e 's|/.*||'` + + if [ "${dtx_arch}" != "" -a "${dtx_arch}" != "${ARCH}" ] ; then + hint_given=1 + echo "" >&2 + echo " architecture ${dtx_arch} is in file path," >&2 + echo " but does not match shell variable \$ARCH" >&2 + echo " >>\$ARCH<< is: >>${ARCH}<<" >&2 + fi + + if [ ! -d ${srctree}/arch/${ARCH} ] ; then + hint_given=1 + echo "" >&2 + echo " ${srctree}/arch/${ARCH}/ does not exist" >&2 + echo " Is \$ARCH='${ARCH}' correct?" >&2 + echo " Possible fix: use '-s' option" >&2 + + git_root=`git rev-parse --show-toplevel 2>/dev/null` + if [ -d ${git_root}/arch/ ] ; then + echo " Possible fix: use '-S' option" >&2 + fi + fi + + if [ $hint_given = 0 ] ; then + echo "" >&2 + echo " No hints available." >&2 + fi + + echo "" >&2 + + exit 3 + + else + echo "" >&2 + echo "ERROR: ${dtx} does not exist or is not readable" >&2 + echo "" >&2 + exit 2 + fi + +} + + +# ----- start of script + +annotate="" +cmd_diff=0 +diff_flags="-u" +diff_color="" +dtx_file_1="" +dtx_file_2="" +dtc_sort="-s" +help=0 +srctree="" + + +while [ $# -gt 0 ] ; do + + case $1 in + + -c | --color ) + if diff --color /dev/null /dev/null 2>/dev/null ; then + diff_color="--color=always" + fi + shift + ;; + + -f ) + diff_flags="--unified=999999" + shift + ;; + + -h | -help | --help ) + help=1 + shift + ;; + + -s ) + srctree="$2" + shift 2 + ;; + + -S ) + git_root=`git rev-parse --show-toplevel 2>/dev/null` + srctree="${git_root}" + shift + ;; + + -T | --annotate ) + if [ "${annotate}" = "" ] ; then + annotate="-T" + elif [ "${annotate}" = "-T" ] ; then + annotate="-T -T" + fi + shift + ;; + -u ) + dtc_sort="" + shift + ;; + + *) + if [ "${dtx_file_1}" = "" ] ; then + dtx_file_1="$1" + elif [ "${dtx_file_2}" = "" ] ; then + dtx_file_2="$1" + else + echo "" >&2 + echo "ERROR: Unexpected parameter: $1" >&2 + echo "" >&2 + exit 2 + fi + shift + ;; + + esac + +done + +if [ "${srctree}" = "" ] ; then + srctree="." +fi + +if [ "${dtx_file_2}" != "" ]; then + cmd_diff=1 +fi + +if (( ${help} )) ; then + usage + exit 1 +fi + +# this must follow check for ${help} +if [ "${dtx_file_1}" = "" ]; then + echo "" >&2 + echo "ERROR: parameter DTx required" >&2 + echo "" >&2 + exit 2 +fi + + +# ----- prefer dtc from linux kernel, allow fallback to dtc in $PATH + +if [ "${KBUILD_OUTPUT:0:2}" = ".." ] ; then + __KBUILD_OUTPUT="${srctree}/${KBUILD_OUTPUT}" +elif [ "${KBUILD_OUTPUT}" = "" ] ; then + __KBUILD_OUTPUT="." +else + __KBUILD_OUTPUT="${KBUILD_OUTPUT}" +fi + +DTC="${__KBUILD_OUTPUT}/scripts/dtc/dtc" + +if [ ! -x ${DTC} ] ; then + __DTC="dtc" + if grep -q "^CONFIG_DTC=y" ${__KBUILD_OUTPUT}/.config 2>/dev/null; then + make_command=' + make scripts' + else + make_command=' + Enable CONFIG_DTC in the kernel configuration + make scripts' + fi + if ( ! which ${__DTC} >/dev/null ) ; then + + # use spaces instead of tabs in the error message + cat >&2 <<eod + +ERROR: unable to find a 'dtc' program + + Preferred 'dtc' (built from Linux kernel source tree) was not found or + is not executable. + + 'dtc' is: ${DTC} + + If it does not exist, create it from the root of the Linux source tree: +${make_command} + + If not at the root of the Linux kernel source tree -s SRCTREE or -S + may need to be specified to find 'dtc'. + + If 'O=\${dir}' is specified in your Linux builds, this script requires + 'export KBUILD_OUTPUT=\${dir}' or add \${dir}/scripts/dtc to \$PATH + before running. + + If \${KBUILD_OUTPUT} is a relative path, then '-s SRCDIR', -S, or run + this script from the root of the Linux kernel source tree is required. + + Fallback '${__DTC}' was also not in \${PATH} or is not executable. + +eod + exit 2 + fi + DTC=${__DTC} +fi + + +# ----- cpp and dtc flags same as for linux source tree build of .dtb files, +# plus directories of the dtx file(s) + +dtx_path_1_dtc_include="-i `dirname ${dtx_file_1}`" + +dtx_path_2_dtc_include="" +if (( ${cmd_diff} )) ; then + dtx_path_2_dtc_include="-i `dirname ${dtx_file_2}`" +fi + +cpp_flags="\ + -nostdinc \ + -I${srctree}/scripts/dtc/include-prefixes \ + -undef -D__DTS__" + +DTC="\ + ${DTC} \ + -i ${srctree}/scripts/dtc/include-prefixes \ + -O dts -qq -f ${dtc_sort} ${annotate} -o -" + + +# ----- do the diff or decompile + +if (( ${cmd_diff} )) ; then + + diff ${diff_flags} ${diff_color} --label "${dtx_file_1}" --label "${dtx_file_2}" \ + <(compile_to_dts "${dtx_file_1}" "${dtx_path_1_dtc_include}") \ + <(compile_to_dts "${dtx_file_2}" "${dtx_path_2_dtc_include}") + +else + + compile_to_dts "${dtx_file_1}" "${dtx_path_1_dtc_include}" + +fi diff --git a/src/net/scripts/dtc/fdtdump.c b/src/net/scripts/dtc/fdtdump.c new file mode 100644 index 0000000..7d460a5 --- /dev/null +++ b/src/net/scripts/dtc/fdtdump.c @@ -0,0 +1,163 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * fdtdump.c - Contributed by Pantelis Antoniou <pantelis.antoniou AT gmail.com> + */ + +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> + +#include <fdt.h> +#include <libfdt_env.h> + +#include "util.h" + +#define ALIGN(x, a) (((x) + ((a) - 1)) & ~((a) - 1)) +#define PALIGN(p, a) ((void *)(ALIGN((unsigned long)(p), (a)))) +#define GET_CELL(p) (p += 4, *((const uint32_t *)(p-4))) + +static void print_data(const char *data, int len) +{ + int i; + const char *p = data; + + /* no data, don't print */ + if (len == 0) + return; + + if (util_is_printable_string(data, len)) { + printf(" = \"%s\"", (const char *)data); + } else if ((len % 4) == 0) { + printf(" = <"); + for (i = 0; i < len; i += 4) + printf("0x%08x%s", fdt32_to_cpu(GET_CELL(p)), + i < (len - 4) ? " " : ""); + printf(">"); + } else { + printf(" = ["); + for (i = 0; i < len; i++) + printf("%02x%s", *p++, i < len - 1 ? " " : ""); + printf("]"); + } +} + +static void dump_blob(void *blob) +{ + struct fdt_header *bph = blob; + uint32_t off_mem_rsvmap = fdt32_to_cpu(bph->off_mem_rsvmap); + uint32_t off_dt = fdt32_to_cpu(bph->off_dt_struct); + uint32_t off_str = fdt32_to_cpu(bph->off_dt_strings); + struct fdt_reserve_entry *p_rsvmap = + (struct fdt_reserve_entry *)((char *)blob + off_mem_rsvmap); + const char *p_struct = (const char *)blob + off_dt; + const char *p_strings = (const char *)blob + off_str; + uint32_t version = fdt32_to_cpu(bph->version); + uint32_t totalsize = fdt32_to_cpu(bph->totalsize); + uint32_t tag; + const char *p, *s, *t; + int depth, sz, shift; + int i; + uint64_t addr, size; + + depth = 0; + shift = 4; + + printf("/dts-v1/;\n"); + printf("// magic:\t\t0x%x\n", fdt32_to_cpu(bph->magic)); + printf("// totalsize:\t\t0x%x (%d)\n", totalsize, totalsize); + printf("// off_dt_struct:\t0x%x\n", off_dt); + printf("// off_dt_strings:\t0x%x\n", off_str); + printf("// off_mem_rsvmap:\t0x%x\n", off_mem_rsvmap); + printf("// version:\t\t%d\n", version); + printf("// last_comp_version:\t%d\n", + fdt32_to_cpu(bph->last_comp_version)); + if (version >= 2) + printf("// boot_cpuid_phys:\t0x%x\n", + fdt32_to_cpu(bph->boot_cpuid_phys)); + + if (version >= 3) + printf("// size_dt_strings:\t0x%x\n", + fdt32_to_cpu(bph->size_dt_strings)); + if (version >= 17) + printf("// size_dt_struct:\t0x%x\n", + fdt32_to_cpu(bph->size_dt_struct)); + printf("\n"); + + for (i = 0; ; i++) { + addr = fdt64_to_cpu(p_rsvmap[i].address); + size = fdt64_to_cpu(p_rsvmap[i].size); + if (addr == 0 && size == 0) + break; + + printf("/memreserve/ %llx %llx;\n", + (unsigned long long)addr, (unsigned long long)size); + } + + p = p_struct; + while ((tag = fdt32_to_cpu(GET_CELL(p))) != FDT_END) { + + /* printf("tag: 0x%08x (%d)\n", tag, p - p_struct); */ + + if (tag == FDT_BEGIN_NODE) { + s = p; + p = PALIGN(p + strlen(s) + 1, 4); + + if (*s == '\0') + s = "/"; + + printf("%*s%s {\n", depth * shift, "", s); + + depth++; + continue; + } + + if (tag == FDT_END_NODE) { + depth--; + + printf("%*s};\n", depth * shift, ""); + continue; + } + + if (tag == FDT_NOP) { + printf("%*s// [NOP]\n", depth * shift, ""); + continue; + } + + if (tag != FDT_PROP) { + fprintf(stderr, "%*s ** Unknown tag 0x%08x\n", depth * shift, "", tag); + break; + } + sz = fdt32_to_cpu(GET_CELL(p)); + s = p_strings + fdt32_to_cpu(GET_CELL(p)); + if (version < 16 && sz >= 8) + p = PALIGN(p, 8); + t = p; + + p = PALIGN(p + sz, 4); + + printf("%*s%s", depth * shift, "", s); + print_data(t, sz); + printf(";\n"); + } +} + + +int main(int argc, char *argv[]) +{ + char *buf; + + if (argc < 2) { + fprintf(stderr, "supply input filename\n"); + return 5; + } + + buf = utilfdt_read(argv[1]); + if (buf) + dump_blob(buf); + else + return 10; + + return 0; +} diff --git a/src/net/scripts/dtc/fdtget.c b/src/net/scripts/dtc/fdtget.c new file mode 100644 index 0000000..c922f82 --- /dev/null +++ b/src/net/scripts/dtc/fdtget.c @@ -0,0 +1,352 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2011 The Chromium OS Authors. All rights reserved. + * + * Portions from U-Boot cmd_fdt.c (C) Copyright 2007 + * Gerald Van Baren, Custom IDEAS, vanbaren@cideas.com + * Based on code written by: + * Pantelis Antoniou <pantelis.antoniou@gmail.com> and + * Matthew McClintock <msm@freescale.com> + */ + +#include <assert.h> +#include <ctype.h> +#include <getopt.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <libfdt.h> + +#include "util.h" + +enum display_mode { + MODE_SHOW_VALUE, /* show values for node properties */ + MODE_LIST_PROPS, /* list the properties for a node */ + MODE_LIST_SUBNODES, /* list the subnodes of a node */ +}; + +/* Holds information which controls our output and options */ +struct display_info { + int type; /* data type (s/i/u/x or 0 for default) */ + int size; /* data size (1/2/4) */ + enum display_mode mode; /* display mode that we are using */ + const char *default_val; /* default value if node/property not found */ +}; + +static void report_error(const char *where, int err) +{ + fprintf(stderr, "Error at '%s': %s\n", where, fdt_strerror(err)); +} + +/** + * Displays data of a given length according to selected options + * + * If a specific data type is provided in disp, then this is used. Otherwise + * we try to guess the data type / size from the contents. + * + * @param disp Display information / options + * @param data Data to display + * @param len Maximum length of buffer + * @return 0 if ok, -1 if data does not match format + */ +static int show_data(struct display_info *disp, const char *data, int len) +{ + int i, size; + const uint8_t *p = (const uint8_t *)data; + const char *s; + int value; + int is_string; + char fmt[3]; + + /* no data, don't print */ + if (len == 0) + return 0; + + is_string = (disp->type) == 's' || + (!disp->type && util_is_printable_string(data, len)); + if (is_string) { + if (data[len - 1] != '\0') { + fprintf(stderr, "Unterminated string\n"); + return -1; + } + for (s = data; s - data < len; s += strlen(s) + 1) { + if (s != data) + printf(" "); + printf("%s", (const char *)s); + } + return 0; + } + size = disp->size; + if (size == -1) { + size = (len % 4) == 0 ? 4 : 1; + } else if (len % size) { + fprintf(stderr, "Property length must be a multiple of " + "selected data size\n"); + return -1; + } + fmt[0] = '%'; + fmt[1] = disp->type ? disp->type : 'd'; + fmt[2] = '\0'; + for (i = 0; i < len; i += size, p += size) { + if (i) + printf(" "); + value = size == 4 ? fdt32_to_cpu(*(const uint32_t *)p) : + size == 2 ? (*p << 8) | p[1] : *p; + printf(fmt, value); + } + return 0; +} + +/** + * List all properties in a node, one per line. + * + * @param blob FDT blob + * @param node Node to display + * @return 0 if ok, or FDT_ERR... if not. + */ +static int list_properties(const void *blob, int node) +{ + const struct fdt_property *data; + const char *name; + int prop; + + prop = fdt_first_property_offset(blob, node); + do { + /* Stop silently when there are no more properties */ + if (prop < 0) + return prop == -FDT_ERR_NOTFOUND ? 0 : prop; + data = fdt_get_property_by_offset(blob, prop, NULL); + name = fdt_string(blob, fdt32_to_cpu(data->nameoff)); + if (name) + puts(name); + prop = fdt_next_property_offset(blob, prop); + } while (1); +} + +#define MAX_LEVEL 32 /* how deeply nested we will go */ + +/** + * List all subnodes in a node, one per line + * + * @param blob FDT blob + * @param node Node to display + * @return 0 if ok, or FDT_ERR... if not. + */ +static int list_subnodes(const void *blob, int node) +{ + int nextoffset; /* next node offset from libfdt */ + uint32_t tag; /* current tag */ + int level = 0; /* keep track of nesting level */ + const char *pathp; + int depth = 1; /* the assumed depth of this node */ + + while (level >= 0) { + tag = fdt_next_tag(blob, node, &nextoffset); + switch (tag) { + case FDT_BEGIN_NODE: + pathp = fdt_get_name(blob, node, NULL); + if (level <= depth) { + if (pathp == NULL) + pathp = "/* NULL pointer error */"; + if (*pathp == '\0') + pathp = "/"; /* root is nameless */ + if (level == 1) + puts(pathp); + } + level++; + if (level >= MAX_LEVEL) { + printf("Nested too deep, aborting.\n"); + return 1; + } + break; + case FDT_END_NODE: + level--; + if (level == 0) + level = -1; /* exit the loop */ + break; + case FDT_END: + return 1; + case FDT_PROP: + break; + default: + if (level <= depth) + printf("Unknown tag 0x%08X\n", tag); + return 1; + } + node = nextoffset; + } + return 0; +} + +/** + * Show the data for a given node (and perhaps property) according to the + * display option provided. + * + * @param blob FDT blob + * @param disp Display information / options + * @param node Node to display + * @param property Name of property to display, or NULL if none + * @return 0 if ok, -ve on error + */ +static int show_data_for_item(const void *blob, struct display_info *disp, + int node, const char *property) +{ + const void *value = NULL; + int len, err = 0; + + switch (disp->mode) { + case MODE_LIST_PROPS: + err = list_properties(blob, node); + break; + + case MODE_LIST_SUBNODES: + err = list_subnodes(blob, node); + break; + + default: + assert(property); + value = fdt_getprop(blob, node, property, &len); + if (value) { + if (show_data(disp, value, len)) + err = -1; + else + printf("\n"); + } else if (disp->default_val) { + puts(disp->default_val); + } else { + report_error(property, len); + err = -1; + } + break; + } + + return err; +} + +/** + * Run the main fdtget operation, given a filename and valid arguments + * + * @param disp Display information / options + * @param filename Filename of blob file + * @param arg List of arguments to process + * @param arg_count Number of arguments + * @param return 0 if ok, -ve on error + */ +static int do_fdtget(struct display_info *disp, const char *filename, + char **arg, int arg_count, int args_per_step) +{ + char *blob; + const char *prop; + int i, node; + + blob = utilfdt_read(filename); + if (!blob) + return -1; + + for (i = 0; i + args_per_step <= arg_count; i += args_per_step) { + node = fdt_path_offset(blob, arg[i]); + if (node < 0) { + if (disp->default_val) { + puts(disp->default_val); + continue; + } else { + report_error(arg[i], node); + return -1; + } + } + prop = args_per_step == 1 ? NULL : arg[i + 1]; + + if (show_data_for_item(blob, disp, node, prop)) + return -1; + } + return 0; +} + +static const char *usage_msg = + "fdtget - read values from device tree\n" + "\n" + "Each value is printed on a new line.\n\n" + "Usage:\n" + " fdtget <options> <dt file> [<node> <property>]...\n" + " fdtget -p <options> <dt file> [<node> ]...\n" + "Options:\n" + "\t-t <type>\tType of data\n" + "\t-p\t\tList properties for each node\n" + "\t-l\t\tList subnodes for each node\n" + "\t-d\t\tDefault value to display when the property is " + "missing\n" + "\t-h\t\tPrint this help\n\n" + USAGE_TYPE_MSG; + +static void usage(const char *msg) +{ + if (msg) + fprintf(stderr, "Error: %s\n\n", msg); + + fprintf(stderr, "%s", usage_msg); + exit(2); +} + +int main(int argc, char *argv[]) +{ + char *filename = NULL; + struct display_info disp; + int args_per_step = 2; + + /* set defaults */ + memset(&disp, '\0', sizeof(disp)); + disp.size = -1; + disp.mode = MODE_SHOW_VALUE; + for (;;) { + int c = getopt(argc, argv, "d:hlpt:"); + if (c == -1) + break; + + switch (c) { + case 'h': + case '?': + usage(NULL); + + case 't': + if (utilfdt_decode_type(optarg, &disp.type, + &disp.size)) + usage("Invalid type string"); + break; + + case 'p': + disp.mode = MODE_LIST_PROPS; + args_per_step = 1; + break; + + case 'l': + disp.mode = MODE_LIST_SUBNODES; + args_per_step = 1; + break; + + case 'd': + disp.default_val = optarg; + break; + } + } + + if (optind < argc) + filename = argv[optind++]; + if (!filename) + usage("Missing filename"); + + argv += optind; + argc -= optind; + + /* Allow no arguments, and silently succeed */ + if (!argc) + return 0; + + /* Check for node, property arguments */ + if (args_per_step == 2 && (argc % 2)) + usage("Must have an even number of arguments"); + + if (do_fdtget(&disp, filename, argv, argc, args_per_step)) + return 1; + return 0; +} diff --git a/src/net/scripts/dtc/fdtput.c b/src/net/scripts/dtc/fdtput.c new file mode 100644 index 0000000..a363c3c --- /dev/null +++ b/src/net/scripts/dtc/fdtput.c @@ -0,0 +1,348 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2011 The Chromium OS Authors. All rights reserved. + */ + +#include <assert.h> +#include <ctype.h> +#include <getopt.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <libfdt.h> + +#include "util.h" + +/* These are the operations we support */ +enum oper_type { + OPER_WRITE_PROP, /* Write a property in a node */ + OPER_CREATE_NODE, /* Create a new node */ +}; + +struct display_info { + enum oper_type oper; /* operation to perform */ + int type; /* data type (s/i/u/x or 0 for default) */ + int size; /* data size (1/2/4) */ + int verbose; /* verbose output */ + int auto_path; /* automatically create all path components */ +}; + + +/** + * Report an error with a particular node. + * + * @param name Node name to report error on + * @param namelen Length of node name, or -1 to use entire string + * @param err Error number to report (-FDT_ERR_...) + */ +static void report_error(const char *name, int namelen, int err) +{ + if (namelen == -1) + namelen = strlen(name); + fprintf(stderr, "Error at '%1.*s': %s\n", namelen, name, + fdt_strerror(err)); +} + +/** + * Encode a series of arguments in a property value. + * + * @param disp Display information / options + * @param arg List of arguments from command line + * @param arg_count Number of arguments (may be 0) + * @param valuep Returns buffer containing value + * @param *value_len Returns length of value encoded + */ +static int encode_value(struct display_info *disp, char **arg, int arg_count, + char **valuep, int *value_len) +{ + char *value = NULL; /* holding area for value */ + int value_size = 0; /* size of holding area */ + char *ptr; /* pointer to current value position */ + int len; /* length of this cell/string/byte */ + int ival; + int upto; /* the number of bytes we have written to buf */ + char fmt[3]; + + upto = 0; + + if (disp->verbose) + fprintf(stderr, "Decoding value:\n"); + + fmt[0] = '%'; + fmt[1] = disp->type ? disp->type : 'd'; + fmt[2] = '\0'; + for (; arg_count > 0; arg++, arg_count--, upto += len) { + /* assume integer unless told otherwise */ + if (disp->type == 's') + len = strlen(*arg) + 1; + else + len = disp->size == -1 ? 4 : disp->size; + + /* enlarge our value buffer by a suitable margin if needed */ + if (upto + len > value_size) { + value_size = (upto + len) + 500; + value = realloc(value, value_size); + if (!value) { + fprintf(stderr, "Out of mmory: cannot alloc " + "%d bytes\n", value_size); + return -1; + } + } + + ptr = value + upto; + if (disp->type == 's') { + memcpy(ptr, *arg, len); + if (disp->verbose) + fprintf(stderr, "\tstring: '%s'\n", ptr); + } else { + int *iptr = (int *)ptr; + sscanf(*arg, fmt, &ival); + if (len == 4) + *iptr = cpu_to_fdt32(ival); + else + *ptr = (uint8_t)ival; + if (disp->verbose) { + fprintf(stderr, "\t%s: %d\n", + disp->size == 1 ? "byte" : + disp->size == 2 ? "short" : "int", + ival); + } + } + } + *value_len = upto; + *valuep = value; + if (disp->verbose) + fprintf(stderr, "Value size %d\n", upto); + return 0; +} + +static int store_key_value(void *blob, const char *node_name, + const char *property, const char *buf, int len) +{ + int node; + int err; + + node = fdt_path_offset(blob, node_name); + if (node < 0) { + report_error(node_name, -1, node); + return -1; + } + + err = fdt_setprop(blob, node, property, buf, len); + if (err) { + report_error(property, -1, err); + return -1; + } + return 0; +} + +/** + * Create paths as needed for all components of a path + * + * Any components of the path that do not exist are created. Errors are + * reported. + * + * @param blob FDT blob to write into + * @param in_path Path to process + * @return 0 if ok, -1 on error + */ +static int create_paths(void *blob, const char *in_path) +{ + const char *path = in_path; + const char *sep; + int node, offset = 0; + + /* skip leading '/' */ + while (*path == '/') + path++; + + for (sep = path; *sep; path = sep + 1, offset = node) { + /* equivalent to strchrnul(), but it requires _GNU_SOURCE */ + sep = strchr(path, '/'); + if (!sep) + sep = path + strlen(path); + + node = fdt_subnode_offset_namelen(blob, offset, path, + sep - path); + if (node == -FDT_ERR_NOTFOUND) { + node = fdt_add_subnode_namelen(blob, offset, path, + sep - path); + } + if (node < 0) { + report_error(path, sep - path, node); + return -1; + } + } + + return 0; +} + +/** + * Create a new node in the fdt. + * + * This will overwrite the node_name string. Any error is reported. + * + * TODO: Perhaps create fdt_path_offset_namelen() so we don't need to do this. + * + * @param blob FDT blob to write into + * @param node_name Name of node to create + * @return new node offset if found, or -1 on failure + */ +static int create_node(void *blob, const char *node_name) +{ + int node = 0; + char *p; + + p = strrchr(node_name, '/'); + if (!p) { + report_error(node_name, -1, -FDT_ERR_BADPATH); + return -1; + } + *p = '\0'; + + if (p > node_name) { + node = fdt_path_offset(blob, node_name); + if (node < 0) { + report_error(node_name, -1, node); + return -1; + } + } + + node = fdt_add_subnode(blob, node, p + 1); + if (node < 0) { + report_error(p + 1, -1, node); + return -1; + } + + return 0; +} + +static int do_fdtput(struct display_info *disp, const char *filename, + char **arg, int arg_count) +{ + char *value; + char *blob; + int len, ret = 0; + + blob = utilfdt_read(filename); + if (!blob) + return -1; + + switch (disp->oper) { + case OPER_WRITE_PROP: + /* + * Convert the arguments into a single binary value, then + * store them into the property. + */ + assert(arg_count >= 2); + if (disp->auto_path && create_paths(blob, *arg)) + return -1; + if (encode_value(disp, arg + 2, arg_count - 2, &value, &len) || + store_key_value(blob, *arg, arg[1], value, len)) + ret = -1; + break; + case OPER_CREATE_NODE: + for (; ret >= 0 && arg_count--; arg++) { + if (disp->auto_path) + ret = create_paths(blob, *arg); + else + ret = create_node(blob, *arg); + } + break; + } + if (ret >= 0) + ret = utilfdt_write(filename, blob); + + free(blob); + return ret; +} + +static const char *usage_msg = + "fdtput - write a property value to a device tree\n" + "\n" + "The command line arguments are joined together into a single value.\n" + "\n" + "Usage:\n" + " fdtput <options> <dt file> <node> <property> [<value>...]\n" + " fdtput -c <options> <dt file> [<node>...]\n" + "Options:\n" + "\t-c\t\tCreate nodes if they don't already exist\n" + "\t-p\t\tAutomatically create nodes as needed for the node path\n" + "\t-t <type>\tType of data\n" + "\t-v\t\tVerbose: display each value decoded from command line\n" + "\t-h\t\tPrint this help\n\n" + USAGE_TYPE_MSG; + +static void usage(const char *msg) +{ + if (msg) + fprintf(stderr, "Error: %s\n\n", msg); + + fprintf(stderr, "%s", usage_msg); + exit(2); +} + +int main(int argc, char *argv[]) +{ + struct display_info disp; + char *filename = NULL; + + memset(&disp, '\0', sizeof(disp)); + disp.size = -1; + disp.oper = OPER_WRITE_PROP; + for (;;) { + int c = getopt(argc, argv, "chpt:v"); + if (c == -1) + break; + + /* + * TODO: add options to: + * - delete property + * - delete node (optionally recursively) + * - rename node + * - pack fdt before writing + * - set amount of free space when writing + * - expand fdt if value doesn't fit + */ + switch (c) { + case 'c': + disp.oper = OPER_CREATE_NODE; + break; + case 'h': + case '?': + usage(NULL); + case 'p': + disp.auto_path = 1; + break; + case 't': + if (utilfdt_decode_type(optarg, &disp.type, + &disp.size)) + usage("Invalid type string"); + break; + + case 'v': + disp.verbose = 1; + break; + } + } + + if (optind < argc) + filename = argv[optind++]; + if (!filename) + usage("Missing filename"); + + argv += optind; + argc -= optind; + + if (disp.oper == OPER_WRITE_PROP) { + if (argc < 1) + usage("Missing node"); + if (argc < 2) + usage("Missing property"); + } + + if (do_fdtput(&disp, filename, argv, argc)) + return 1; + return 0; +} diff --git a/src/net/scripts/dtc/flattree.c b/src/net/scripts/dtc/flattree.c new file mode 100644 index 0000000..07f10d2 --- /dev/null +++ b/src/net/scripts/dtc/flattree.c @@ -0,0 +1,925 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005. + */ + +#include "dtc.h" +#include "srcpos.h" + +#define FTF_FULLPATH 0x1 +#define FTF_VARALIGN 0x2 +#define FTF_NAMEPROPS 0x4 +#define FTF_BOOTCPUID 0x8 +#define FTF_STRTABSIZE 0x10 +#define FTF_STRUCTSIZE 0x20 +#define FTF_NOPS 0x40 + +static struct version_info { + int version; + int last_comp_version; + int hdr_size; + int flags; +} version_table[] = { + {1, 1, FDT_V1_SIZE, + FTF_FULLPATH|FTF_VARALIGN|FTF_NAMEPROPS}, + {2, 1, FDT_V2_SIZE, + FTF_FULLPATH|FTF_VARALIGN|FTF_NAMEPROPS|FTF_BOOTCPUID}, + {3, 1, FDT_V3_SIZE, + FTF_FULLPATH|FTF_VARALIGN|FTF_NAMEPROPS|FTF_BOOTCPUID|FTF_STRTABSIZE}, + {16, 16, FDT_V3_SIZE, + FTF_BOOTCPUID|FTF_STRTABSIZE|FTF_NOPS}, + {17, 16, FDT_V17_SIZE, + FTF_BOOTCPUID|FTF_STRTABSIZE|FTF_STRUCTSIZE|FTF_NOPS}, +}; + +struct emitter { + void (*cell)(void *, cell_t); + void (*string)(void *, const char *, int); + void (*align)(void *, int); + void (*data)(void *, struct data); + void (*beginnode)(void *, struct label *labels); + void (*endnode)(void *, struct label *labels); + void (*property)(void *, struct label *labels); +}; + +static void bin_emit_cell(void *e, cell_t val) +{ + struct data *dtbuf = e; + + *dtbuf = data_append_cell(*dtbuf, val); +} + +static void bin_emit_string(void *e, const char *str, int len) +{ + struct data *dtbuf = e; + + if (len == 0) + len = strlen(str); + + *dtbuf = data_append_data(*dtbuf, str, len); + *dtbuf = data_append_byte(*dtbuf, '\0'); +} + +static void bin_emit_align(void *e, int a) +{ + struct data *dtbuf = e; + + *dtbuf = data_append_align(*dtbuf, a); +} + +static void bin_emit_data(void *e, struct data d) +{ + struct data *dtbuf = e; + + *dtbuf = data_append_data(*dtbuf, d.val, d.len); +} + +static void bin_emit_beginnode(void *e, struct label *labels) +{ + bin_emit_cell(e, FDT_BEGIN_NODE); +} + +static void bin_emit_endnode(void *e, struct label *labels) +{ + bin_emit_cell(e, FDT_END_NODE); +} + +static void bin_emit_property(void *e, struct label *labels) +{ + bin_emit_cell(e, FDT_PROP); +} + +static struct emitter bin_emitter = { + .cell = bin_emit_cell, + .string = bin_emit_string, + .align = bin_emit_align, + .data = bin_emit_data, + .beginnode = bin_emit_beginnode, + .endnode = bin_emit_endnode, + .property = bin_emit_property, +}; + +static void emit_label(FILE *f, const char *prefix, const char *label) +{ + fprintf(f, "\t.globl\t%s_%s\n", prefix, label); + fprintf(f, "%s_%s:\n", prefix, label); + fprintf(f, "_%s_%s:\n", prefix, label); +} + +static void emit_offset_label(FILE *f, const char *label, int offset) +{ + fprintf(f, "\t.globl\t%s\n", label); + fprintf(f, "%s\t= . + %d\n", label, offset); +} + +#define ASM_EMIT_BELONG(f, fmt, ...) \ + { \ + fprintf((f), "\t.byte\t((" fmt ") >> 24) & 0xff\n", __VA_ARGS__); \ + fprintf((f), "\t.byte\t((" fmt ") >> 16) & 0xff\n", __VA_ARGS__); \ + fprintf((f), "\t.byte\t((" fmt ") >> 8) & 0xff\n", __VA_ARGS__); \ + fprintf((f), "\t.byte\t(" fmt ") & 0xff\n", __VA_ARGS__); \ + } + +static void asm_emit_cell(void *e, cell_t val) +{ + FILE *f = e; + + fprintf(f, "\t.byte 0x%02x; .byte 0x%02x; .byte 0x%02x; .byte 0x%02x\n", + (val >> 24) & 0xff, (val >> 16) & 0xff, + (val >> 8) & 0xff, val & 0xff); +} + +static void asm_emit_string(void *e, const char *str, int len) +{ + FILE *f = e; + + if (len != 0) + fprintf(f, "\t.string\t\"%.*s\"\n", len, str); + else + fprintf(f, "\t.string\t\"%s\"\n", str); +} + +static void asm_emit_align(void *e, int a) +{ + FILE *f = e; + + fprintf(f, "\t.balign\t%d, 0\n", a); +} + +static void asm_emit_data(void *e, struct data d) +{ + FILE *f = e; + int off = 0; + struct marker *m = d.markers; + + for_each_marker_of_type(m, LABEL) + emit_offset_label(f, m->ref, m->offset); + + while ((d.len - off) >= sizeof(uint32_t)) { + asm_emit_cell(e, dtb_ld32(d.val + off)); + off += sizeof(uint32_t); + } + + while ((d.len - off) >= 1) { + fprintf(f, "\t.byte\t0x%hhx\n", d.val[off]); + off += 1; + } + + assert(off == d.len); +} + +static void asm_emit_beginnode(void *e, struct label *labels) +{ + FILE *f = e; + struct label *l; + + for_each_label(labels, l) { + fprintf(f, "\t.globl\t%s\n", l->label); + fprintf(f, "%s:\n", l->label); + } + fprintf(f, "\t/* FDT_BEGIN_NODE */\n"); + asm_emit_cell(e, FDT_BEGIN_NODE); +} + +static void asm_emit_endnode(void *e, struct label *labels) +{ + FILE *f = e; + struct label *l; + + fprintf(f, "\t/* FDT_END_NODE */\n"); + asm_emit_cell(e, FDT_END_NODE); + for_each_label(labels, l) { + fprintf(f, "\t.globl\t%s_end\n", l->label); + fprintf(f, "%s_end:\n", l->label); + } +} + +static void asm_emit_property(void *e, struct label *labels) +{ + FILE *f = e; + struct label *l; + + for_each_label(labels, l) { + fprintf(f, "\t.globl\t%s\n", l->label); + fprintf(f, "%s:\n", l->label); + } + fprintf(f, "\t/* FDT_PROP */\n"); + asm_emit_cell(e, FDT_PROP); +} + +static struct emitter asm_emitter = { + .cell = asm_emit_cell, + .string = asm_emit_string, + .align = asm_emit_align, + .data = asm_emit_data, + .beginnode = asm_emit_beginnode, + .endnode = asm_emit_endnode, + .property = asm_emit_property, +}; + +static int stringtable_insert(struct data *d, const char *str) +{ + int i; + + /* FIXME: do this more efficiently? */ + + for (i = 0; i < d->len; i++) { + if (streq(str, d->val + i)) + return i; + } + + *d = data_append_data(*d, str, strlen(str)+1); + return i; +} + +static void flatten_tree(struct node *tree, struct emitter *emit, + void *etarget, struct data *strbuf, + struct version_info *vi) +{ + struct property *prop; + struct node *child; + bool seen_name_prop = false; + + if (tree->deleted) + return; + + emit->beginnode(etarget, tree->labels); + + if (vi->flags & FTF_FULLPATH) + emit->string(etarget, tree->fullpath, 0); + else + emit->string(etarget, tree->name, 0); + + emit->align(etarget, sizeof(cell_t)); + + for_each_property(tree, prop) { + int nameoff; + + if (streq(prop->name, "name")) + seen_name_prop = true; + + nameoff = stringtable_insert(strbuf, prop->name); + + emit->property(etarget, prop->labels); + emit->cell(etarget, prop->val.len); + emit->cell(etarget, nameoff); + + if ((vi->flags & FTF_VARALIGN) && (prop->val.len >= 8)) + emit->align(etarget, 8); + + emit->data(etarget, prop->val); + emit->align(etarget, sizeof(cell_t)); + } + + if ((vi->flags & FTF_NAMEPROPS) && !seen_name_prop) { + emit->property(etarget, NULL); + emit->cell(etarget, tree->basenamelen+1); + emit->cell(etarget, stringtable_insert(strbuf, "name")); + + if ((vi->flags & FTF_VARALIGN) && ((tree->basenamelen+1) >= 8)) + emit->align(etarget, 8); + + emit->string(etarget, tree->name, tree->basenamelen); + emit->align(etarget, sizeof(cell_t)); + } + + for_each_child(tree, child) { + flatten_tree(child, emit, etarget, strbuf, vi); + } + + emit->endnode(etarget, tree->labels); +} + +static struct data flatten_reserve_list(struct reserve_info *reservelist, + struct version_info *vi) +{ + struct reserve_info *re; + struct data d = empty_data; + int j; + + for (re = reservelist; re; re = re->next) { + d = data_append_re(d, re->address, re->size); + } + /* + * Add additional reserved slots if the user asked for them. + */ + for (j = 0; j < reservenum; j++) { + d = data_append_re(d, 0, 0); + } + + return d; +} + +static void make_fdt_header(struct fdt_header *fdt, + struct version_info *vi, + int reservesize, int dtsize, int strsize, + int boot_cpuid_phys) +{ + int reserve_off; + + reservesize += sizeof(struct fdt_reserve_entry); + + memset(fdt, 0xff, sizeof(*fdt)); + + fdt->magic = cpu_to_fdt32(FDT_MAGIC); + fdt->version = cpu_to_fdt32(vi->version); + fdt->last_comp_version = cpu_to_fdt32(vi->last_comp_version); + + /* Reserve map should be doubleword aligned */ + reserve_off = ALIGN(vi->hdr_size, 8); + + fdt->off_mem_rsvmap = cpu_to_fdt32(reserve_off); + fdt->off_dt_struct = cpu_to_fdt32(reserve_off + reservesize); + fdt->off_dt_strings = cpu_to_fdt32(reserve_off + reservesize + + dtsize); + fdt->totalsize = cpu_to_fdt32(reserve_off + reservesize + dtsize + strsize); + + if (vi->flags & FTF_BOOTCPUID) + fdt->boot_cpuid_phys = cpu_to_fdt32(boot_cpuid_phys); + if (vi->flags & FTF_STRTABSIZE) + fdt->size_dt_strings = cpu_to_fdt32(strsize); + if (vi->flags & FTF_STRUCTSIZE) + fdt->size_dt_struct = cpu_to_fdt32(dtsize); +} + +void dt_to_blob(FILE *f, struct dt_info *dti, int version) +{ + struct version_info *vi = NULL; + int i; + struct data blob = empty_data; + struct data reservebuf = empty_data; + struct data dtbuf = empty_data; + struct data strbuf = empty_data; + struct fdt_header fdt; + int padlen = 0; + + for (i = 0; i < ARRAY_SIZE(version_table); i++) { + if (version_table[i].version == version) + vi = &version_table[i]; + } + if (!vi) + die("Unknown device tree blob version %d\n", version); + + flatten_tree(dti->dt, &bin_emitter, &dtbuf, &strbuf, vi); + bin_emit_cell(&dtbuf, FDT_END); + + reservebuf = flatten_reserve_list(dti->reservelist, vi); + + /* Make header */ + make_fdt_header(&fdt, vi, reservebuf.len, dtbuf.len, strbuf.len, + dti->boot_cpuid_phys); + + /* + * If the user asked for more space than is used, adjust the totalsize. + */ + if (minsize > 0) { + padlen = minsize - fdt32_to_cpu(fdt.totalsize); + if (padlen < 0) { + padlen = 0; + if (quiet < 1) + fprintf(stderr, + "Warning: blob size %"PRIu32" >= minimum size %d\n", + fdt32_to_cpu(fdt.totalsize), minsize); + } + } + + if (padsize > 0) + padlen = padsize; + + if (alignsize > 0) + padlen = ALIGN(fdt32_to_cpu(fdt.totalsize) + padlen, alignsize) + - fdt32_to_cpu(fdt.totalsize); + + if (padlen > 0) { + int tsize = fdt32_to_cpu(fdt.totalsize); + tsize += padlen; + fdt.totalsize = cpu_to_fdt32(tsize); + } + + /* + * Assemble the blob: start with the header, add with alignment + * the reserve buffer, add the reserve map terminating zeroes, + * the device tree itself, and finally the strings. + */ + blob = data_append_data(blob, &fdt, vi->hdr_size); + blob = data_append_align(blob, 8); + blob = data_merge(blob, reservebuf); + blob = data_append_zeroes(blob, sizeof(struct fdt_reserve_entry)); + blob = data_merge(blob, dtbuf); + blob = data_merge(blob, strbuf); + + /* + * If the user asked for more space than is used, pad out the blob. + */ + if (padlen > 0) + blob = data_append_zeroes(blob, padlen); + + if (fwrite(blob.val, blob.len, 1, f) != 1) { + if (ferror(f)) + die("Error writing device tree blob: %s\n", + strerror(errno)); + else + die("Short write on device tree blob\n"); + } + + /* + * data_merge() frees the right-hand element so only the blob + * remains to be freed. + */ + data_free(blob); +} + +static void dump_stringtable_asm(FILE *f, struct data strbuf) +{ + const char *p; + int len; + + p = strbuf.val; + + while (p < (strbuf.val + strbuf.len)) { + len = strlen(p); + fprintf(f, "\t.string \"%s\"\n", p); + p += len+1; + } +} + +void dt_to_asm(FILE *f, struct dt_info *dti, int version) +{ + struct version_info *vi = NULL; + int i; + struct data strbuf = empty_data; + struct reserve_info *re; + const char *symprefix = "dt"; + + for (i = 0; i < ARRAY_SIZE(version_table); i++) { + if (version_table[i].version == version) + vi = &version_table[i]; + } + if (!vi) + die("Unknown device tree blob version %d\n", version); + + fprintf(f, "/* autogenerated by dtc, do not edit */\n\n"); + + emit_label(f, symprefix, "blob_start"); + emit_label(f, symprefix, "header"); + fprintf(f, "\t/* magic */\n"); + asm_emit_cell(f, FDT_MAGIC); + fprintf(f, "\t/* totalsize */\n"); + ASM_EMIT_BELONG(f, "_%s_blob_abs_end - _%s_blob_start", + symprefix, symprefix); + fprintf(f, "\t/* off_dt_struct */\n"); + ASM_EMIT_BELONG(f, "_%s_struct_start - _%s_blob_start", + symprefix, symprefix); + fprintf(f, "\t/* off_dt_strings */\n"); + ASM_EMIT_BELONG(f, "_%s_strings_start - _%s_blob_start", + symprefix, symprefix); + fprintf(f, "\t/* off_mem_rsvmap */\n"); + ASM_EMIT_BELONG(f, "_%s_reserve_map - _%s_blob_start", + symprefix, symprefix); + fprintf(f, "\t/* version */\n"); + asm_emit_cell(f, vi->version); + fprintf(f, "\t/* last_comp_version */\n"); + asm_emit_cell(f, vi->last_comp_version); + + if (vi->flags & FTF_BOOTCPUID) { + fprintf(f, "\t/* boot_cpuid_phys */\n"); + asm_emit_cell(f, dti->boot_cpuid_phys); + } + + if (vi->flags & FTF_STRTABSIZE) { + fprintf(f, "\t/* size_dt_strings */\n"); + ASM_EMIT_BELONG(f, "_%s_strings_end - _%s_strings_start", + symprefix, symprefix); + } + + if (vi->flags & FTF_STRUCTSIZE) { + fprintf(f, "\t/* size_dt_struct */\n"); + ASM_EMIT_BELONG(f, "_%s_struct_end - _%s_struct_start", + symprefix, symprefix); + } + + /* + * Reserve map entries. + * Align the reserve map to a doubleword boundary. + * Each entry is an (address, size) pair of u64 values. + * Always supply a zero-sized temination entry. + */ + asm_emit_align(f, 8); + emit_label(f, symprefix, "reserve_map"); + + fprintf(f, "/* Memory reserve map from source file */\n"); + + /* + * Use .long on high and low halves of u64s to avoid .quad + * as it appears .quad isn't available in some assemblers. + */ + for (re = dti->reservelist; re; re = re->next) { + struct label *l; + + for_each_label(re->labels, l) { + fprintf(f, "\t.globl\t%s\n", l->label); + fprintf(f, "%s:\n", l->label); + } + ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->address >> 32)); + ASM_EMIT_BELONG(f, "0x%08x", + (unsigned int)(re->address & 0xffffffff)); + ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->size >> 32)); + ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->size & 0xffffffff)); + } + for (i = 0; i < reservenum; i++) { + fprintf(f, "\t.long\t0, 0\n\t.long\t0, 0\n"); + } + + fprintf(f, "\t.long\t0, 0\n\t.long\t0, 0\n"); + + emit_label(f, symprefix, "struct_start"); + flatten_tree(dti->dt, &asm_emitter, f, &strbuf, vi); + + fprintf(f, "\t/* FDT_END */\n"); + asm_emit_cell(f, FDT_END); + emit_label(f, symprefix, "struct_end"); + + emit_label(f, symprefix, "strings_start"); + dump_stringtable_asm(f, strbuf); + emit_label(f, symprefix, "strings_end"); + + emit_label(f, symprefix, "blob_end"); + + /* + * If the user asked for more space than is used, pad it out. + */ + if (minsize > 0) { + fprintf(f, "\t.space\t%d - (_%s_blob_end - _%s_blob_start), 0\n", + minsize, symprefix, symprefix); + } + if (padsize > 0) { + fprintf(f, "\t.space\t%d, 0\n", padsize); + } + if (alignsize > 0) + asm_emit_align(f, alignsize); + emit_label(f, symprefix, "blob_abs_end"); + + data_free(strbuf); +} + +struct inbuf { + char *base, *limit, *ptr; +}; + +static void inbuf_init(struct inbuf *inb, void *base, void *limit) +{ + inb->base = base; + inb->limit = limit; + inb->ptr = inb->base; +} + +static void flat_read_chunk(struct inbuf *inb, void *p, int len) +{ + if ((inb->ptr + len) > inb->limit) + die("Premature end of data parsing flat device tree\n"); + + memcpy(p, inb->ptr, len); + + inb->ptr += len; +} + +static uint32_t flat_read_word(struct inbuf *inb) +{ + fdt32_t val; + + assert(((inb->ptr - inb->base) % sizeof(val)) == 0); + + flat_read_chunk(inb, &val, sizeof(val)); + + return fdt32_to_cpu(val); +} + +static void flat_realign(struct inbuf *inb, int align) +{ + int off = inb->ptr - inb->base; + + inb->ptr = inb->base + ALIGN(off, align); + if (inb->ptr > inb->limit) + die("Premature end of data parsing flat device tree\n"); +} + +static char *flat_read_string(struct inbuf *inb) +{ + int len = 0; + const char *p = inb->ptr; + char *str; + + do { + if (p >= inb->limit) + die("Premature end of data parsing flat device tree\n"); + len++; + } while ((*p++) != '\0'); + + str = xstrdup(inb->ptr); + + inb->ptr += len; + + flat_realign(inb, sizeof(uint32_t)); + + return str; +} + +static struct data flat_read_data(struct inbuf *inb, int len) +{ + struct data d = empty_data; + + if (len == 0) + return empty_data; + + d = data_grow_for(d, len); + d.len = len; + + flat_read_chunk(inb, d.val, len); + + flat_realign(inb, sizeof(uint32_t)); + + return d; +} + +static char *flat_read_stringtable(struct inbuf *inb, int offset) +{ + const char *p; + + p = inb->base + offset; + while (1) { + if (p >= inb->limit || p < inb->base) + die("String offset %d overruns string table\n", + offset); + + if (*p == '\0') + break; + + p++; + } + + return xstrdup(inb->base + offset); +} + +static struct property *flat_read_property(struct inbuf *dtbuf, + struct inbuf *strbuf, int flags) +{ + uint32_t proplen, stroff; + char *name; + struct data val; + + proplen = flat_read_word(dtbuf); + stroff = flat_read_word(dtbuf); + + name = flat_read_stringtable(strbuf, stroff); + + if ((flags & FTF_VARALIGN) && (proplen >= 8)) + flat_realign(dtbuf, 8); + + val = flat_read_data(dtbuf, proplen); + + return build_property(name, val, NULL); +} + + +static struct reserve_info *flat_read_mem_reserve(struct inbuf *inb) +{ + struct reserve_info *reservelist = NULL; + struct reserve_info *new; + struct fdt_reserve_entry re; + + /* + * Each entry is a pair of u64 (addr, size) values for 4 cell_t's. + * List terminates at an entry with size equal to zero. + * + * First pass, count entries. + */ + while (1) { + uint64_t address, size; + + flat_read_chunk(inb, &re, sizeof(re)); + address = fdt64_to_cpu(re.address); + size = fdt64_to_cpu(re.size); + if (size == 0) + break; + + new = build_reserve_entry(address, size); + reservelist = add_reserve_entry(reservelist, new); + } + + return reservelist; +} + + +static char *nodename_from_path(const char *ppath, const char *cpath) +{ + int plen; + + plen = strlen(ppath); + + if (!strstarts(cpath, ppath)) + die("Path \"%s\" is not valid as a child of \"%s\"\n", + cpath, ppath); + + /* root node is a special case */ + if (!streq(ppath, "/")) + plen++; + + return xstrdup(cpath + plen); +} + +static struct node *unflatten_tree(struct inbuf *dtbuf, + struct inbuf *strbuf, + const char *parent_flatname, int flags) +{ + struct node *node; + char *flatname; + uint32_t val; + + node = build_node(NULL, NULL, NULL); + + flatname = flat_read_string(dtbuf); + + if (flags & FTF_FULLPATH) + node->name = nodename_from_path(parent_flatname, flatname); + else + node->name = flatname; + + do { + struct property *prop; + struct node *child; + + val = flat_read_word(dtbuf); + switch (val) { + case FDT_PROP: + if (node->children) + fprintf(stderr, "Warning: Flat tree input has " + "subnodes preceding a property.\n"); + prop = flat_read_property(dtbuf, strbuf, flags); + add_property(node, prop); + break; + + case FDT_BEGIN_NODE: + child = unflatten_tree(dtbuf,strbuf, flatname, flags); + add_child(node, child); + break; + + case FDT_END_NODE: + break; + + case FDT_END: + die("Premature FDT_END in device tree blob\n"); + break; + + case FDT_NOP: + if (!(flags & FTF_NOPS)) + fprintf(stderr, "Warning: NOP tag found in flat tree" + " version <16\n"); + + /* Ignore */ + break; + + default: + die("Invalid opcode word %08x in device tree blob\n", + val); + } + } while (val != FDT_END_NODE); + + if (node->name != flatname) { + free(flatname); + } + + return node; +} + + +struct dt_info *dt_from_blob(const char *fname) +{ + FILE *f; + fdt32_t magic_buf, totalsize_buf; + uint32_t magic, totalsize, version, size_dt, boot_cpuid_phys; + uint32_t off_dt, off_str, off_mem_rsvmap; + int rc; + char *blob; + struct fdt_header *fdt; + char *p; + struct inbuf dtbuf, strbuf; + struct inbuf memresvbuf; + int sizeleft; + struct reserve_info *reservelist; + struct node *tree; + uint32_t val; + int flags = 0; + + f = srcfile_relative_open(fname, NULL); + + rc = fread(&magic_buf, sizeof(magic_buf), 1, f); + if (ferror(f)) + die("Error reading DT blob magic number: %s\n", + strerror(errno)); + if (rc < 1) { + if (feof(f)) + die("EOF reading DT blob magic number\n"); + else + die("Mysterious short read reading magic number\n"); + } + + magic = fdt32_to_cpu(magic_buf); + if (magic != FDT_MAGIC) + die("Blob has incorrect magic number\n"); + + rc = fread(&totalsize_buf, sizeof(totalsize_buf), 1, f); + if (ferror(f)) + die("Error reading DT blob size: %s\n", strerror(errno)); + if (rc < 1) { + if (feof(f)) + die("EOF reading DT blob size\n"); + else + die("Mysterious short read reading blob size\n"); + } + + totalsize = fdt32_to_cpu(totalsize_buf); + if (totalsize < FDT_V1_SIZE) + die("DT blob size (%d) is too small\n", totalsize); + + blob = xmalloc(totalsize); + + fdt = (struct fdt_header *)blob; + fdt->magic = cpu_to_fdt32(magic); + fdt->totalsize = cpu_to_fdt32(totalsize); + + sizeleft = totalsize - sizeof(magic) - sizeof(totalsize); + p = blob + sizeof(magic) + sizeof(totalsize); + + while (sizeleft) { + if (feof(f)) + die("EOF before reading %d bytes of DT blob\n", + totalsize); + + rc = fread(p, 1, sizeleft, f); + if (ferror(f)) + die("Error reading DT blob: %s\n", + strerror(errno)); + + sizeleft -= rc; + p += rc; + } + + off_dt = fdt32_to_cpu(fdt->off_dt_struct); + off_str = fdt32_to_cpu(fdt->off_dt_strings); + off_mem_rsvmap = fdt32_to_cpu(fdt->off_mem_rsvmap); + version = fdt32_to_cpu(fdt->version); + boot_cpuid_phys = fdt32_to_cpu(fdt->boot_cpuid_phys); + + if (off_mem_rsvmap >= totalsize) + die("Mem Reserve structure offset exceeds total size\n"); + + if (off_dt >= totalsize) + die("DT structure offset exceeds total size\n"); + + if (off_str > totalsize) + die("String table offset exceeds total size\n"); + + if (version >= 3) { + uint32_t size_str = fdt32_to_cpu(fdt->size_dt_strings); + if ((off_str+size_str < off_str) || (off_str+size_str > totalsize)) + die("String table extends past total size\n"); + inbuf_init(&strbuf, blob + off_str, blob + off_str + size_str); + } else { + inbuf_init(&strbuf, blob + off_str, blob + totalsize); + } + + if (version >= 17) { + size_dt = fdt32_to_cpu(fdt->size_dt_struct); + if ((off_dt+size_dt < off_dt) || (off_dt+size_dt > totalsize)) + die("Structure block extends past total size\n"); + } + + if (version < 16) { + flags |= FTF_FULLPATH | FTF_NAMEPROPS | FTF_VARALIGN; + } else { + flags |= FTF_NOPS; + } + + inbuf_init(&memresvbuf, + blob + off_mem_rsvmap, blob + totalsize); + inbuf_init(&dtbuf, blob + off_dt, blob + totalsize); + + reservelist = flat_read_mem_reserve(&memresvbuf); + + val = flat_read_word(&dtbuf); + + if (val != FDT_BEGIN_NODE) + die("Device tree blob doesn't begin with FDT_BEGIN_NODE (begins with 0x%08x)\n", val); + + tree = unflatten_tree(&dtbuf, &strbuf, "", flags); + + val = flat_read_word(&dtbuf); + if (val != FDT_END) + die("Device tree blob doesn't end with FDT_END\n"); + + free(blob); + + fclose(f); + + return build_dt_info(DTSF_V1, reservelist, tree, boot_cpuid_phys); +} diff --git a/src/net/scripts/dtc/fstree.c b/src/net/scripts/dtc/fstree.c new file mode 100644 index 0000000..5e59594 --- /dev/null +++ b/src/net/scripts/dtc/fstree.c @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005. + */ + +#include "dtc.h" + +#include <dirent.h> +#include <sys/stat.h> + +static struct node *read_fstree(const char *dirname) +{ + DIR *d; + struct dirent *de; + struct stat st; + struct node *tree; + + d = opendir(dirname); + if (!d) + die("Couldn't opendir() \"%s\": %s\n", dirname, strerror(errno)); + + tree = build_node(NULL, NULL, NULL); + + while ((de = readdir(d)) != NULL) { + char *tmpname; + + if (streq(de->d_name, ".") + || streq(de->d_name, "..")) + continue; + + tmpname = join_path(dirname, de->d_name); + + if (stat(tmpname, &st) < 0) + die("stat(%s): %s\n", tmpname, strerror(errno)); + + if (S_ISREG(st.st_mode)) { + struct property *prop; + FILE *pfile; + + pfile = fopen(tmpname, "rb"); + if (! pfile) { + fprintf(stderr, + "WARNING: Cannot open %s: %s\n", + tmpname, strerror(errno)); + } else { + prop = build_property(xstrdup(de->d_name), + data_copy_file(pfile, + st.st_size), + NULL); + add_property(tree, prop); + fclose(pfile); + } + } else if (S_ISDIR(st.st_mode)) { + struct node *newchild; + + newchild = read_fstree(tmpname); + newchild = name_node(newchild, xstrdup(de->d_name)); + add_child(tree, newchild); + } + + free(tmpname); + } + + closedir(d); + return tree; +} + +struct dt_info *dt_from_fs(const char *dirname) +{ + struct node *tree; + + tree = read_fstree(dirname); + tree = name_node(tree, ""); + + return build_dt_info(DTSF_V1, NULL, tree, guess_boot_cpuid(tree)); +} diff --git a/src/net/scripts/dtc/libfdt/fdt.c b/src/net/scripts/dtc/libfdt/fdt.c new file mode 100644 index 0000000..6cf2fa0 --- /dev/null +++ b/src/net/scripts/dtc/libfdt/fdt.c @@ -0,0 +1,327 @@ +// SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + */ +#include "libfdt_env.h" + +#include <fdt.h> +#include <libfdt.h> + +#include "libfdt_internal.h" + +/* + * Minimal sanity check for a read-only tree. fdt_ro_probe_() checks + * that the given buffer contains what appears to be a flattened + * device tree with sane information in its header. + */ +int32_t fdt_ro_probe_(const void *fdt) +{ + uint32_t totalsize = fdt_totalsize(fdt); + + if (can_assume(VALID_DTB)) + return totalsize; + + if (fdt_magic(fdt) == FDT_MAGIC) { + /* Complete tree */ + if (!can_assume(LATEST)) { + if (fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION) + return -FDT_ERR_BADVERSION; + if (fdt_last_comp_version(fdt) > + FDT_LAST_SUPPORTED_VERSION) + return -FDT_ERR_BADVERSION; + } + } else if (fdt_magic(fdt) == FDT_SW_MAGIC) { + /* Unfinished sequential-write blob */ + if (!can_assume(VALID_INPUT) && fdt_size_dt_struct(fdt) == 0) + return -FDT_ERR_BADSTATE; + } else { + return -FDT_ERR_BADMAGIC; + } + + if (totalsize < INT32_MAX) + return totalsize; + else + return -FDT_ERR_TRUNCATED; +} + +static int check_off_(uint32_t hdrsize, uint32_t totalsize, uint32_t off) +{ + return (off >= hdrsize) && (off <= totalsize); +} + +static int check_block_(uint32_t hdrsize, uint32_t totalsize, + uint32_t base, uint32_t size) +{ + if (!check_off_(hdrsize, totalsize, base)) + return 0; /* block start out of bounds */ + if ((base + size) < base) + return 0; /* overflow */ + if (!check_off_(hdrsize, totalsize, base + size)) + return 0; /* block end out of bounds */ + return 1; +} + +size_t fdt_header_size_(uint32_t version) +{ + if (version <= 1) + return FDT_V1_SIZE; + else if (version <= 2) + return FDT_V2_SIZE; + else if (version <= 3) + return FDT_V3_SIZE; + else if (version <= 16) + return FDT_V16_SIZE; + else + return FDT_V17_SIZE; +} + +size_t fdt_header_size(const void *fdt) +{ + return can_assume(LATEST) ? FDT_V17_SIZE : + fdt_header_size_(fdt_version(fdt)); +} + +int fdt_check_header(const void *fdt) +{ + size_t hdrsize; + + if (fdt_magic(fdt) != FDT_MAGIC) + return -FDT_ERR_BADMAGIC; + if (!can_assume(LATEST)) { + if ((fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION) + || (fdt_last_comp_version(fdt) > + FDT_LAST_SUPPORTED_VERSION)) + return -FDT_ERR_BADVERSION; + if (fdt_version(fdt) < fdt_last_comp_version(fdt)) + return -FDT_ERR_BADVERSION; + } + hdrsize = fdt_header_size(fdt); + if (!can_assume(VALID_DTB)) { + + if ((fdt_totalsize(fdt) < hdrsize) + || (fdt_totalsize(fdt) > INT_MAX)) + return -FDT_ERR_TRUNCATED; + + /* Bounds check memrsv block */ + if (!check_off_(hdrsize, fdt_totalsize(fdt), + fdt_off_mem_rsvmap(fdt))) + return -FDT_ERR_TRUNCATED; + } + + if (!can_assume(VALID_DTB)) { + /* Bounds check structure block */ + if (!can_assume(LATEST) && fdt_version(fdt) < 17) { + if (!check_off_(hdrsize, fdt_totalsize(fdt), + fdt_off_dt_struct(fdt))) + return -FDT_ERR_TRUNCATED; + } else { + if (!check_block_(hdrsize, fdt_totalsize(fdt), + fdt_off_dt_struct(fdt), + fdt_size_dt_struct(fdt))) + return -FDT_ERR_TRUNCATED; + } + + /* Bounds check strings block */ + if (!check_block_(hdrsize, fdt_totalsize(fdt), + fdt_off_dt_strings(fdt), + fdt_size_dt_strings(fdt))) + return -FDT_ERR_TRUNCATED; + } + + return 0; +} + +const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int len) +{ + unsigned int uoffset = offset; + unsigned int absoffset = offset + fdt_off_dt_struct(fdt); + + if (offset < 0) + return NULL; + + if (!can_assume(VALID_INPUT)) + if ((absoffset < uoffset) + || ((absoffset + len) < absoffset) + || (absoffset + len) > fdt_totalsize(fdt)) + return NULL; + + if (can_assume(LATEST) || fdt_version(fdt) >= 0x11) + if (((uoffset + len) < uoffset) + || ((offset + len) > fdt_size_dt_struct(fdt))) + return NULL; + + return fdt_offset_ptr_(fdt, offset); +} + +uint32_t fdt_next_tag(const void *fdt, int startoffset, int *nextoffset) +{ + const fdt32_t *tagp, *lenp; + uint32_t tag; + int offset = startoffset; + const char *p; + + *nextoffset = -FDT_ERR_TRUNCATED; + tagp = fdt_offset_ptr(fdt, offset, FDT_TAGSIZE); + if (!can_assume(VALID_DTB) && !tagp) + return FDT_END; /* premature end */ + tag = fdt32_to_cpu(*tagp); + offset += FDT_TAGSIZE; + + *nextoffset = -FDT_ERR_BADSTRUCTURE; + switch (tag) { + case FDT_BEGIN_NODE: + /* skip name */ + do { + p = fdt_offset_ptr(fdt, offset++, 1); + } while (p && (*p != '\0')); + if (!can_assume(VALID_DTB) && !p) + return FDT_END; /* premature end */ + break; + + case FDT_PROP: + lenp = fdt_offset_ptr(fdt, offset, sizeof(*lenp)); + if (!can_assume(VALID_DTB) && !lenp) + return FDT_END; /* premature end */ + /* skip-name offset, length and value */ + offset += sizeof(struct fdt_property) - FDT_TAGSIZE + + fdt32_to_cpu(*lenp); + if (!can_assume(LATEST) && + fdt_version(fdt) < 0x10 && fdt32_to_cpu(*lenp) >= 8 && + ((offset - fdt32_to_cpu(*lenp)) % 8) != 0) + offset += 4; + break; + + case FDT_END: + case FDT_END_NODE: + case FDT_NOP: + break; + + default: + return FDT_END; + } + + if (!fdt_offset_ptr(fdt, startoffset, offset - startoffset)) + return FDT_END; /* premature end */ + + *nextoffset = FDT_TAGALIGN(offset); + return tag; +} + +int fdt_check_node_offset_(const void *fdt, int offset) +{ + if (!can_assume(VALID_INPUT) + && ((offset < 0) || (offset % FDT_TAGSIZE))) + return -FDT_ERR_BADOFFSET; + + if (fdt_next_tag(fdt, offset, &offset) != FDT_BEGIN_NODE) + return -FDT_ERR_BADOFFSET; + + return offset; +} + +int fdt_check_prop_offset_(const void *fdt, int offset) +{ + if (!can_assume(VALID_INPUT) + && ((offset < 0) || (offset % FDT_TAGSIZE))) + return -FDT_ERR_BADOFFSET; + + if (fdt_next_tag(fdt, offset, &offset) != FDT_PROP) + return -FDT_ERR_BADOFFSET; + + return offset; +} + +int fdt_next_node(const void *fdt, int offset, int *depth) +{ + int nextoffset = 0; + uint32_t tag; + + if (offset >= 0) + if ((nextoffset = fdt_check_node_offset_(fdt, offset)) < 0) + return nextoffset; + + do { + offset = nextoffset; + tag = fdt_next_tag(fdt, offset, &nextoffset); + + switch (tag) { + case FDT_PROP: + case FDT_NOP: + break; + + case FDT_BEGIN_NODE: + if (depth) + (*depth)++; + break; + + case FDT_END_NODE: + if (depth && ((--(*depth)) < 0)) + return nextoffset; + break; + + case FDT_END: + if ((nextoffset >= 0) + || ((nextoffset == -FDT_ERR_TRUNCATED) && !depth)) + return -FDT_ERR_NOTFOUND; + else + return nextoffset; + } + } while (tag != FDT_BEGIN_NODE); + + return offset; +} + +int fdt_first_subnode(const void *fdt, int offset) +{ + int depth = 0; + + offset = fdt_next_node(fdt, offset, &depth); + if (offset < 0 || depth != 1) + return -FDT_ERR_NOTFOUND; + + return offset; +} + +int fdt_next_subnode(const void *fdt, int offset) +{ + int depth = 1; + + /* + * With respect to the parent, the depth of the next subnode will be + * the same as the last. + */ + do { + offset = fdt_next_node(fdt, offset, &depth); + if (offset < 0 || depth < 1) + return -FDT_ERR_NOTFOUND; + } while (depth > 1); + + return offset; +} + +const char *fdt_find_string_(const char *strtab, int tabsize, const char *s) +{ + int len = strlen(s) + 1; + const char *last = strtab + tabsize - len; + const char *p; + + for (p = strtab; p <= last; p++) + if (memcmp(p, s, len) == 0) + return p; + return NULL; +} + +int fdt_move(const void *fdt, void *buf, int bufsize) +{ + if (!can_assume(VALID_INPUT) && bufsize < 0) + return -FDT_ERR_NOSPACE; + + FDT_RO_PROBE(fdt); + + if (fdt_totalsize(fdt) > (unsigned int)bufsize) + return -FDT_ERR_NOSPACE; + + memmove(buf, fdt, fdt_totalsize(fdt)); + return 0; +} diff --git a/src/net/scripts/dtc/libfdt/fdt.h b/src/net/scripts/dtc/libfdt/fdt.h new file mode 100644 index 0000000..f2e6880 --- /dev/null +++ b/src/net/scripts/dtc/libfdt/fdt.h @@ -0,0 +1,66 @@ +/* SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) */ +#ifndef FDT_H +#define FDT_H +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + * Copyright 2012 Kim Phillips, Freescale Semiconductor. + */ + +#ifndef __ASSEMBLY__ + +struct fdt_header { + fdt32_t magic; /* magic word FDT_MAGIC */ + fdt32_t totalsize; /* total size of DT block */ + fdt32_t off_dt_struct; /* offset to structure */ + fdt32_t off_dt_strings; /* offset to strings */ + fdt32_t off_mem_rsvmap; /* offset to memory reserve map */ + fdt32_t version; /* format version */ + fdt32_t last_comp_version; /* last compatible version */ + + /* version 2 fields below */ + fdt32_t boot_cpuid_phys; /* Which physical CPU id we're + booting on */ + /* version 3 fields below */ + fdt32_t size_dt_strings; /* size of the strings block */ + + /* version 17 fields below */ + fdt32_t size_dt_struct; /* size of the structure block */ +}; + +struct fdt_reserve_entry { + fdt64_t address; + fdt64_t size; +}; + +struct fdt_node_header { + fdt32_t tag; + char name[0]; +}; + +struct fdt_property { + fdt32_t tag; + fdt32_t len; + fdt32_t nameoff; + char data[0]; +}; + +#endif /* !__ASSEMBLY */ + +#define FDT_MAGIC 0xd00dfeed /* 4: version, 4: total size */ +#define FDT_TAGSIZE sizeof(fdt32_t) + +#define FDT_BEGIN_NODE 0x1 /* Start node: full name */ +#define FDT_END_NODE 0x2 /* End node */ +#define FDT_PROP 0x3 /* Property: name off, + size, content */ +#define FDT_NOP 0x4 /* nop */ +#define FDT_END 0x9 + +#define FDT_V1_SIZE (7*sizeof(fdt32_t)) +#define FDT_V2_SIZE (FDT_V1_SIZE + sizeof(fdt32_t)) +#define FDT_V3_SIZE (FDT_V2_SIZE + sizeof(fdt32_t)) +#define FDT_V16_SIZE FDT_V3_SIZE +#define FDT_V17_SIZE (FDT_V16_SIZE + sizeof(fdt32_t)) + +#endif /* FDT_H */ diff --git a/src/net/scripts/dtc/libfdt/fdt_addresses.c b/src/net/scripts/dtc/libfdt/fdt_addresses.c new file mode 100644 index 0000000..9a82cd0 --- /dev/null +++ b/src/net/scripts/dtc/libfdt/fdt_addresses.c @@ -0,0 +1,101 @@ +// SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2014 David Gibson <david@gibson.dropbear.id.au> + * Copyright (C) 2018 embedded brains GmbH + */ +#include "libfdt_env.h" + +#include <fdt.h> +#include <libfdt.h> + +#include "libfdt_internal.h" + +static int fdt_cells(const void *fdt, int nodeoffset, const char *name) +{ + const fdt32_t *c; + uint32_t val; + int len; + + c = fdt_getprop(fdt, nodeoffset, name, &len); + if (!c) + return len; + + if (len != sizeof(*c)) + return -FDT_ERR_BADNCELLS; + + val = fdt32_to_cpu(*c); + if (val > FDT_MAX_NCELLS) + return -FDT_ERR_BADNCELLS; + + return (int)val; +} + +int fdt_address_cells(const void *fdt, int nodeoffset) +{ + int val; + + val = fdt_cells(fdt, nodeoffset, "#address-cells"); + if (val == 0) + return -FDT_ERR_BADNCELLS; + if (val == -FDT_ERR_NOTFOUND) + return 2; + return val; +} + +int fdt_size_cells(const void *fdt, int nodeoffset) +{ + int val; + + val = fdt_cells(fdt, nodeoffset, "#size-cells"); + if (val == -FDT_ERR_NOTFOUND) + return 1; + return val; +} + +/* This function assumes that [address|size]_cells is 1 or 2 */ +int fdt_appendprop_addrrange(void *fdt, int parent, int nodeoffset, + const char *name, uint64_t addr, uint64_t size) +{ + int addr_cells, size_cells, ret; + uint8_t data[sizeof(fdt64_t) * 2], *prop; + + ret = fdt_address_cells(fdt, parent); + if (ret < 0) + return ret; + addr_cells = ret; + + ret = fdt_size_cells(fdt, parent); + if (ret < 0) + return ret; + size_cells = ret; + + /* check validity of address */ + prop = data; + if (addr_cells == 1) { + if ((addr > UINT32_MAX) || ((UINT32_MAX + 1 - addr) < size)) + return -FDT_ERR_BADVALUE; + + fdt32_st(prop, (uint32_t)addr); + } else if (addr_cells == 2) { + fdt64_st(prop, addr); + } else { + return -FDT_ERR_BADNCELLS; + } + + /* check validity of size */ + prop += addr_cells * sizeof(fdt32_t); + if (size_cells == 1) { + if (size > UINT32_MAX) + return -FDT_ERR_BADVALUE; + + fdt32_st(prop, (uint32_t)size); + } else if (size_cells == 2) { + fdt64_st(prop, size); + } else { + return -FDT_ERR_BADNCELLS; + } + + return fdt_appendprop(fdt, nodeoffset, name, data, + (addr_cells + size_cells) * sizeof(fdt32_t)); +} diff --git a/src/net/scripts/dtc/libfdt/fdt_empty_tree.c b/src/net/scripts/dtc/libfdt/fdt_empty_tree.c new file mode 100644 index 0000000..49d54d4 --- /dev/null +++ b/src/net/scripts/dtc/libfdt/fdt_empty_tree.c @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2012 David Gibson, IBM Corporation. + */ +#include "libfdt_env.h" + +#include <fdt.h> +#include <libfdt.h> + +#include "libfdt_internal.h" + +int fdt_create_empty_tree(void *buf, int bufsize) +{ + int err; + + err = fdt_create(buf, bufsize); + if (err) + return err; + + err = fdt_finish_reservemap(buf); + if (err) + return err; + + err = fdt_begin_node(buf, ""); + if (err) + return err; + + err = fdt_end_node(buf); + if (err) + return err; + + err = fdt_finish(buf); + if (err) + return err; + + return fdt_open_into(buf, buf, bufsize); +} diff --git a/src/net/scripts/dtc/libfdt/fdt_overlay.c b/src/net/scripts/dtc/libfdt/fdt_overlay.c new file mode 100644 index 0000000..d217e79 --- /dev/null +++ b/src/net/scripts/dtc/libfdt/fdt_overlay.c @@ -0,0 +1,882 @@ +// SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2016 Free Electrons + * Copyright (C) 2016 NextThing Co. + */ +#include "libfdt_env.h" + +#include <fdt.h> +#include <libfdt.h> + +#include "libfdt_internal.h" + +/** + * overlay_get_target_phandle - retrieves the target phandle of a fragment + * @fdto: pointer to the device tree overlay blob + * @fragment: node offset of the fragment in the overlay + * + * overlay_get_target_phandle() retrieves the target phandle of an + * overlay fragment when that fragment uses a phandle (target + * property) instead of a path (target-path property). + * + * returns: + * the phandle pointed by the target property + * 0, if the phandle was not found + * -1, if the phandle was malformed + */ +static uint32_t overlay_get_target_phandle(const void *fdto, int fragment) +{ + const fdt32_t *val; + int len; + + val = fdt_getprop(fdto, fragment, "target", &len); + if (!val) + return 0; + + if ((len != sizeof(*val)) || (fdt32_to_cpu(*val) == (uint32_t)-1)) + return (uint32_t)-1; + + return fdt32_to_cpu(*val); +} + +/** + * overlay_get_target - retrieves the offset of a fragment's target + * @fdt: Base device tree blob + * @fdto: Device tree overlay blob + * @fragment: node offset of the fragment in the overlay + * @pathp: pointer which receives the path of the target (or NULL) + * + * overlay_get_target() retrieves the target offset in the base + * device tree of a fragment, no matter how the actual targeting is + * done (through a phandle or a path) + * + * returns: + * the targeted node offset in the base device tree + * Negative error code on error + */ +static int overlay_get_target(const void *fdt, const void *fdto, + int fragment, char const **pathp) +{ + uint32_t phandle; + const char *path = NULL; + int path_len = 0, ret; + + /* Try first to do a phandle based lookup */ + phandle = overlay_get_target_phandle(fdto, fragment); + if (phandle == (uint32_t)-1) + return -FDT_ERR_BADPHANDLE; + + /* no phandle, try path */ + if (!phandle) { + /* And then a path based lookup */ + path = fdt_getprop(fdto, fragment, "target-path", &path_len); + if (path) + ret = fdt_path_offset(fdt, path); + else + ret = path_len; + } else + ret = fdt_node_offset_by_phandle(fdt, phandle); + + /* + * If we haven't found either a target or a + * target-path property in a node that contains a + * __overlay__ subnode (we wouldn't be called + * otherwise), consider it a improperly written + * overlay + */ + if (ret < 0 && path_len == -FDT_ERR_NOTFOUND) + ret = -FDT_ERR_BADOVERLAY; + + /* return on error */ + if (ret < 0) + return ret; + + /* return pointer to path (if available) */ + if (pathp) + *pathp = path ? path : NULL; + + return ret; +} + +/** + * overlay_phandle_add_offset - Increases a phandle by an offset + * @fdt: Base device tree blob + * @node: Device tree overlay blob + * @name: Name of the property to modify (phandle or linux,phandle) + * @delta: offset to apply + * + * overlay_phandle_add_offset() increments a node phandle by a given + * offset. + * + * returns: + * 0 on success. + * Negative error code on error + */ +static int overlay_phandle_add_offset(void *fdt, int node, + const char *name, uint32_t delta) +{ + const fdt32_t *val; + uint32_t adj_val; + int len; + + val = fdt_getprop(fdt, node, name, &len); + if (!val) + return len; + + if (len != sizeof(*val)) + return -FDT_ERR_BADPHANDLE; + + adj_val = fdt32_to_cpu(*val); + if ((adj_val + delta) < adj_val) + return -FDT_ERR_NOPHANDLES; + + adj_val += delta; + if (adj_val == (uint32_t)-1) + return -FDT_ERR_NOPHANDLES; + + return fdt_setprop_inplace_u32(fdt, node, name, adj_val); +} + +/** + * overlay_adjust_node_phandles - Offsets the phandles of a node + * @fdto: Device tree overlay blob + * @node: Offset of the node we want to adjust + * @delta: Offset to shift the phandles of + * + * overlay_adjust_node_phandles() adds a constant to all the phandles + * of a given node. This is mainly use as part of the overlay + * application process, when we want to update all the overlay + * phandles to not conflict with the overlays of the base device tree. + * + * returns: + * 0 on success + * Negative error code on failure + */ +static int overlay_adjust_node_phandles(void *fdto, int node, + uint32_t delta) +{ + int child; + int ret; + + ret = overlay_phandle_add_offset(fdto, node, "phandle", delta); + if (ret && ret != -FDT_ERR_NOTFOUND) + return ret; + + ret = overlay_phandle_add_offset(fdto, node, "linux,phandle", delta); + if (ret && ret != -FDT_ERR_NOTFOUND) + return ret; + + fdt_for_each_subnode(child, fdto, node) { + ret = overlay_adjust_node_phandles(fdto, child, delta); + if (ret) + return ret; + } + + return 0; +} + +/** + * overlay_adjust_local_phandles - Adjust the phandles of a whole overlay + * @fdto: Device tree overlay blob + * @delta: Offset to shift the phandles of + * + * overlay_adjust_local_phandles() adds a constant to all the + * phandles of an overlay. This is mainly use as part of the overlay + * application process, when we want to update all the overlay + * phandles to not conflict with the overlays of the base device tree. + * + * returns: + * 0 on success + * Negative error code on failure + */ +static int overlay_adjust_local_phandles(void *fdto, uint32_t delta) +{ + /* + * Start adjusting the phandles from the overlay root + */ + return overlay_adjust_node_phandles(fdto, 0, delta); +} + +/** + * overlay_update_local_node_references - Adjust the overlay references + * @fdto: Device tree overlay blob + * @tree_node: Node offset of the node to operate on + * @fixup_node: Node offset of the matching local fixups node + * @delta: Offset to shift the phandles of + * + * overlay_update_local_nodes_references() update the phandles + * pointing to a node within the device tree overlay by adding a + * constant delta. + * + * This is mainly used as part of a device tree application process, + * where you want the device tree overlays phandles to not conflict + * with the ones from the base device tree before merging them. + * + * returns: + * 0 on success + * Negative error code on failure + */ +static int overlay_update_local_node_references(void *fdto, + int tree_node, + int fixup_node, + uint32_t delta) +{ + int fixup_prop; + int fixup_child; + int ret; + + fdt_for_each_property_offset(fixup_prop, fdto, fixup_node) { + const fdt32_t *fixup_val; + const char *tree_val; + const char *name; + int fixup_len; + int tree_len; + int i; + + fixup_val = fdt_getprop_by_offset(fdto, fixup_prop, + &name, &fixup_len); + if (!fixup_val) + return fixup_len; + + if (fixup_len % sizeof(uint32_t)) + return -FDT_ERR_BADOVERLAY; + fixup_len /= sizeof(uint32_t); + + tree_val = fdt_getprop(fdto, tree_node, name, &tree_len); + if (!tree_val) { + if (tree_len == -FDT_ERR_NOTFOUND) + return -FDT_ERR_BADOVERLAY; + + return tree_len; + } + + for (i = 0; i < fixup_len; i++) { + fdt32_t adj_val; + uint32_t poffset; + + poffset = fdt32_to_cpu(fixup_val[i]); + + /* + * phandles to fixup can be unaligned. + * + * Use a memcpy for the architectures that do + * not support unaligned accesses. + */ + memcpy(&adj_val, tree_val + poffset, sizeof(adj_val)); + + adj_val = cpu_to_fdt32(fdt32_to_cpu(adj_val) + delta); + + ret = fdt_setprop_inplace_namelen_partial(fdto, + tree_node, + name, + strlen(name), + poffset, + &adj_val, + sizeof(adj_val)); + if (ret == -FDT_ERR_NOSPACE) + return -FDT_ERR_BADOVERLAY; + + if (ret) + return ret; + } + } + + fdt_for_each_subnode(fixup_child, fdto, fixup_node) { + const char *fixup_child_name = fdt_get_name(fdto, fixup_child, + NULL); + int tree_child; + + tree_child = fdt_subnode_offset(fdto, tree_node, + fixup_child_name); + if (tree_child == -FDT_ERR_NOTFOUND) + return -FDT_ERR_BADOVERLAY; + if (tree_child < 0) + return tree_child; + + ret = overlay_update_local_node_references(fdto, + tree_child, + fixup_child, + delta); + if (ret) + return ret; + } + + return 0; +} + +/** + * overlay_update_local_references - Adjust the overlay references + * @fdto: Device tree overlay blob + * @delta: Offset to shift the phandles of + * + * overlay_update_local_references() update all the phandles pointing + * to a node within the device tree overlay by adding a constant + * delta to not conflict with the base overlay. + * + * This is mainly used as part of a device tree application process, + * where you want the device tree overlays phandles to not conflict + * with the ones from the base device tree before merging them. + * + * returns: + * 0 on success + * Negative error code on failure + */ +static int overlay_update_local_references(void *fdto, uint32_t delta) +{ + int fixups; + + fixups = fdt_path_offset(fdto, "/__local_fixups__"); + if (fixups < 0) { + /* There's no local phandles to adjust, bail out */ + if (fixups == -FDT_ERR_NOTFOUND) + return 0; + + return fixups; + } + + /* + * Update our local references from the root of the tree + */ + return overlay_update_local_node_references(fdto, 0, fixups, + delta); +} + +/** + * overlay_fixup_one_phandle - Set an overlay phandle to the base one + * @fdt: Base Device Tree blob + * @fdto: Device tree overlay blob + * @symbols_off: Node offset of the symbols node in the base device tree + * @path: Path to a node holding a phandle in the overlay + * @path_len: number of path characters to consider + * @name: Name of the property holding the phandle reference in the overlay + * @name_len: number of name characters to consider + * @poffset: Offset within the overlay property where the phandle is stored + * @label: Label of the node referenced by the phandle + * + * overlay_fixup_one_phandle() resolves an overlay phandle pointing to + * a node in the base device tree. + * + * This is part of the device tree overlay application process, when + * you want all the phandles in the overlay to point to the actual + * base dt nodes. + * + * returns: + * 0 on success + * Negative error code on failure + */ +static int overlay_fixup_one_phandle(void *fdt, void *fdto, + int symbols_off, + const char *path, uint32_t path_len, + const char *name, uint32_t name_len, + int poffset, const char *label) +{ + const char *symbol_path; + uint32_t phandle; + fdt32_t phandle_prop; + int symbol_off, fixup_off; + int prop_len; + + if (symbols_off < 0) + return symbols_off; + + symbol_path = fdt_getprop(fdt, symbols_off, label, + &prop_len); + if (!symbol_path) + return prop_len; + + symbol_off = fdt_path_offset(fdt, symbol_path); + if (symbol_off < 0) + return symbol_off; + + phandle = fdt_get_phandle(fdt, symbol_off); + if (!phandle) + return -FDT_ERR_NOTFOUND; + + fixup_off = fdt_path_offset_namelen(fdto, path, path_len); + if (fixup_off == -FDT_ERR_NOTFOUND) + return -FDT_ERR_BADOVERLAY; + if (fixup_off < 0) + return fixup_off; + + phandle_prop = cpu_to_fdt32(phandle); + return fdt_setprop_inplace_namelen_partial(fdto, fixup_off, + name, name_len, poffset, + &phandle_prop, + sizeof(phandle_prop)); +}; + +/** + * overlay_fixup_phandle - Set an overlay phandle to the base one + * @fdt: Base Device Tree blob + * @fdto: Device tree overlay blob + * @symbols_off: Node offset of the symbols node in the base device tree + * @property: Property offset in the overlay holding the list of fixups + * + * overlay_fixup_phandle() resolves all the overlay phandles pointed + * to in a __fixups__ property, and updates them to match the phandles + * in use in the base device tree. + * + * This is part of the device tree overlay application process, when + * you want all the phandles in the overlay to point to the actual + * base dt nodes. + * + * returns: + * 0 on success + * Negative error code on failure + */ +static int overlay_fixup_phandle(void *fdt, void *fdto, int symbols_off, + int property) +{ + const char *value; + const char *label; + int len; + + value = fdt_getprop_by_offset(fdto, property, + &label, &len); + if (!value) { + if (len == -FDT_ERR_NOTFOUND) + return -FDT_ERR_INTERNAL; + + return len; + } + + do { + const char *path, *name, *fixup_end; + const char *fixup_str = value; + uint32_t path_len, name_len; + uint32_t fixup_len; + char *sep, *endptr; + int poffset, ret; + + fixup_end = memchr(value, '\0', len); + if (!fixup_end) + return -FDT_ERR_BADOVERLAY; + fixup_len = fixup_end - fixup_str; + + len -= fixup_len + 1; + value += fixup_len + 1; + + path = fixup_str; + sep = memchr(fixup_str, ':', fixup_len); + if (!sep || *sep != ':') + return -FDT_ERR_BADOVERLAY; + + path_len = sep - path; + if (path_len == (fixup_len - 1)) + return -FDT_ERR_BADOVERLAY; + + fixup_len -= path_len + 1; + name = sep + 1; + sep = memchr(name, ':', fixup_len); + if (!sep || *sep != ':') + return -FDT_ERR_BADOVERLAY; + + name_len = sep - name; + if (!name_len) + return -FDT_ERR_BADOVERLAY; + + poffset = strtoul(sep + 1, &endptr, 10); + if ((*endptr != '\0') || (endptr <= (sep + 1))) + return -FDT_ERR_BADOVERLAY; + + ret = overlay_fixup_one_phandle(fdt, fdto, symbols_off, + path, path_len, name, name_len, + poffset, label); + if (ret) + return ret; + } while (len > 0); + + return 0; +} + +/** + * overlay_fixup_phandles - Resolve the overlay phandles to the base + * device tree + * @fdt: Base Device Tree blob + * @fdto: Device tree overlay blob + * + * overlay_fixup_phandles() resolves all the overlay phandles pointing + * to nodes in the base device tree. + * + * This is one of the steps of the device tree overlay application + * process, when you want all the phandles in the overlay to point to + * the actual base dt nodes. + * + * returns: + * 0 on success + * Negative error code on failure + */ +static int overlay_fixup_phandles(void *fdt, void *fdto) +{ + int fixups_off, symbols_off; + int property; + + /* We can have overlays without any fixups */ + fixups_off = fdt_path_offset(fdto, "/__fixups__"); + if (fixups_off == -FDT_ERR_NOTFOUND) + return 0; /* nothing to do */ + if (fixups_off < 0) + return fixups_off; + + /* And base DTs without symbols */ + symbols_off = fdt_path_offset(fdt, "/__symbols__"); + if ((symbols_off < 0 && (symbols_off != -FDT_ERR_NOTFOUND))) + return symbols_off; + + fdt_for_each_property_offset(property, fdto, fixups_off) { + int ret; + + ret = overlay_fixup_phandle(fdt, fdto, symbols_off, property); + if (ret) + return ret; + } + + return 0; +} + +/** + * overlay_apply_node - Merges a node into the base device tree + * @fdt: Base Device Tree blob + * @target: Node offset in the base device tree to apply the fragment to + * @fdto: Device tree overlay blob + * @node: Node offset in the overlay holding the changes to merge + * + * overlay_apply_node() merges a node into a target base device tree + * node pointed. + * + * This is part of the final step in the device tree overlay + * application process, when all the phandles have been adjusted and + * resolved and you just have to merge overlay into the base device + * tree. + * + * returns: + * 0 on success + * Negative error code on failure + */ +static int overlay_apply_node(void *fdt, int target, + void *fdto, int node) +{ + int property; + int subnode; + + fdt_for_each_property_offset(property, fdto, node) { + const char *name; + const void *prop; + int prop_len; + int ret; + + prop = fdt_getprop_by_offset(fdto, property, &name, + &prop_len); + if (prop_len == -FDT_ERR_NOTFOUND) + return -FDT_ERR_INTERNAL; + if (prop_len < 0) + return prop_len; + + ret = fdt_setprop(fdt, target, name, prop, prop_len); + if (ret) + return ret; + } + + fdt_for_each_subnode(subnode, fdto, node) { + const char *name = fdt_get_name(fdto, subnode, NULL); + int nnode; + int ret; + + nnode = fdt_add_subnode(fdt, target, name); + if (nnode == -FDT_ERR_EXISTS) { + nnode = fdt_subnode_offset(fdt, target, name); + if (nnode == -FDT_ERR_NOTFOUND) + return -FDT_ERR_INTERNAL; + } + + if (nnode < 0) + return nnode; + + ret = overlay_apply_node(fdt, nnode, fdto, subnode); + if (ret) + return ret; + } + + return 0; +} + +/** + * overlay_merge - Merge an overlay into its base device tree + * @fdt: Base Device Tree blob + * @fdto: Device tree overlay blob + * + * overlay_merge() merges an overlay into its base device tree. + * + * This is the next to last step in the device tree overlay application + * process, when all the phandles have been adjusted and resolved and + * you just have to merge overlay into the base device tree. + * + * returns: + * 0 on success + * Negative error code on failure + */ +static int overlay_merge(void *fdt, void *fdto) +{ + int fragment; + + fdt_for_each_subnode(fragment, fdto, 0) { + int overlay; + int target; + int ret; + + /* + * Each fragments will have an __overlay__ node. If + * they don't, it's not supposed to be merged + */ + overlay = fdt_subnode_offset(fdto, fragment, "__overlay__"); + if (overlay == -FDT_ERR_NOTFOUND) + continue; + + if (overlay < 0) + return overlay; + + target = overlay_get_target(fdt, fdto, fragment, NULL); + if (target < 0) + return target; + + ret = overlay_apply_node(fdt, target, fdto, overlay); + if (ret) + return ret; + } + + return 0; +} + +static int get_path_len(const void *fdt, int nodeoffset) +{ + int len = 0, namelen; + const char *name; + + FDT_RO_PROBE(fdt); + + for (;;) { + name = fdt_get_name(fdt, nodeoffset, &namelen); + if (!name) + return namelen; + + /* root? we're done */ + if (namelen == 0) + break; + + nodeoffset = fdt_parent_offset(fdt, nodeoffset); + if (nodeoffset < 0) + return nodeoffset; + len += namelen + 1; + } + + /* in case of root pretend it's "/" */ + if (len == 0) + len++; + return len; +} + +/** + * overlay_symbol_update - Update the symbols of base tree after a merge + * @fdt: Base Device Tree blob + * @fdto: Device tree overlay blob + * + * overlay_symbol_update() updates the symbols of the base tree with the + * symbols of the applied overlay + * + * This is the last step in the device tree overlay application + * process, allowing the reference of overlay symbols by subsequent + * overlay operations. + * + * returns: + * 0 on success + * Negative error code on failure + */ +static int overlay_symbol_update(void *fdt, void *fdto) +{ + int root_sym, ov_sym, prop, path_len, fragment, target; + int len, frag_name_len, ret, rel_path_len; + const char *s, *e; + const char *path; + const char *name; + const char *frag_name; + const char *rel_path; + const char *target_path; + char *buf; + void *p; + + ov_sym = fdt_subnode_offset(fdto, 0, "__symbols__"); + + /* if no overlay symbols exist no problem */ + if (ov_sym < 0) + return 0; + + root_sym = fdt_subnode_offset(fdt, 0, "__symbols__"); + + /* it no root symbols exist we should create them */ + if (root_sym == -FDT_ERR_NOTFOUND) + root_sym = fdt_add_subnode(fdt, 0, "__symbols__"); + + /* any error is fatal now */ + if (root_sym < 0) + return root_sym; + + /* iterate over each overlay symbol */ + fdt_for_each_property_offset(prop, fdto, ov_sym) { + path = fdt_getprop_by_offset(fdto, prop, &name, &path_len); + if (!path) + return path_len; + + /* verify it's a string property (terminated by a single \0) */ + if (path_len < 1 || memchr(path, '\0', path_len) != &path[path_len - 1]) + return -FDT_ERR_BADVALUE; + + /* keep end marker to avoid strlen() */ + e = path + path_len; + + if (*path != '/') + return -FDT_ERR_BADVALUE; + + /* get fragment name first */ + s = strchr(path + 1, '/'); + if (!s) { + /* Symbol refers to something that won't end + * up in the target tree */ + continue; + } + + frag_name = path + 1; + frag_name_len = s - path - 1; + + /* verify format; safe since "s" lies in \0 terminated prop */ + len = sizeof("/__overlay__/") - 1; + if ((e - s) > len && (memcmp(s, "/__overlay__/", len) == 0)) { + /* /<fragment-name>/__overlay__/<relative-subnode-path> */ + rel_path = s + len; + rel_path_len = e - rel_path - 1; + } else if ((e - s) == len + && (memcmp(s, "/__overlay__", len - 1) == 0)) { + /* /<fragment-name>/__overlay__ */ + rel_path = ""; + rel_path_len = 0; + } else { + /* Symbol refers to something that won't end + * up in the target tree */ + continue; + } + + /* find the fragment index in which the symbol lies */ + ret = fdt_subnode_offset_namelen(fdto, 0, frag_name, + frag_name_len); + /* not found? */ + if (ret < 0) + return -FDT_ERR_BADOVERLAY; + fragment = ret; + + /* an __overlay__ subnode must exist */ + ret = fdt_subnode_offset(fdto, fragment, "__overlay__"); + if (ret < 0) + return -FDT_ERR_BADOVERLAY; + + /* get the target of the fragment */ + ret = overlay_get_target(fdt, fdto, fragment, &target_path); + if (ret < 0) + return ret; + target = ret; + + /* if we have a target path use */ + if (!target_path) { + ret = get_path_len(fdt, target); + if (ret < 0) + return ret; + len = ret; + } else { + len = strlen(target_path); + } + + ret = fdt_setprop_placeholder(fdt, root_sym, name, + len + (len > 1) + rel_path_len + 1, &p); + if (ret < 0) + return ret; + + if (!target_path) { + /* again in case setprop_placeholder changed it */ + ret = overlay_get_target(fdt, fdto, fragment, &target_path); + if (ret < 0) + return ret; + target = ret; + } + + buf = p; + if (len > 1) { /* target is not root */ + if (!target_path) { + ret = fdt_get_path(fdt, target, buf, len + 1); + if (ret < 0) + return ret; + } else + memcpy(buf, target_path, len + 1); + + } else + len--; + + buf[len] = '/'; + memcpy(buf + len + 1, rel_path, rel_path_len); + buf[len + 1 + rel_path_len] = '\0'; + } + + return 0; +} + +int fdt_overlay_apply(void *fdt, void *fdto) +{ + uint32_t delta; + int ret; + + FDT_RO_PROBE(fdt); + FDT_RO_PROBE(fdto); + + ret = fdt_find_max_phandle(fdt, &delta); + if (ret) + goto err; + + ret = overlay_adjust_local_phandles(fdto, delta); + if (ret) + goto err; + + ret = overlay_update_local_references(fdto, delta); + if (ret) + goto err; + + ret = overlay_fixup_phandles(fdt, fdto); + if (ret) + goto err; + + ret = overlay_merge(fdt, fdto); + if (ret) + goto err; + + ret = overlay_symbol_update(fdt, fdto); + if (ret) + goto err; + + /* + * The overlay has been damaged, erase its magic. + */ + fdt_set_magic(fdto, ~0); + + return 0; + +err: + /* + * The overlay might have been damaged, erase its magic. + */ + fdt_set_magic(fdto, ~0); + + /* + * The base device tree might have been damaged, erase its + * magic. + */ + fdt_set_magic(fdt, ~0); + + return ret; +} diff --git a/src/net/scripts/dtc/libfdt/fdt_ro.c b/src/net/scripts/dtc/libfdt/fdt_ro.c new file mode 100644 index 0000000..91cc6fe --- /dev/null +++ b/src/net/scripts/dtc/libfdt/fdt_ro.c @@ -0,0 +1,859 @@ +// SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + */ +#include "libfdt_env.h" + +#include <fdt.h> +#include <libfdt.h> + +#include "libfdt_internal.h" + +static int fdt_nodename_eq_(const void *fdt, int offset, + const char *s, int len) +{ + int olen; + const char *p = fdt_get_name(fdt, offset, &olen); + + if (!p || olen < len) + /* short match */ + return 0; + + if (memcmp(p, s, len) != 0) + return 0; + + if (p[len] == '\0') + return 1; + else if (!memchr(s, '@', len) && (p[len] == '@')) + return 1; + else + return 0; +} + +const char *fdt_get_string(const void *fdt, int stroffset, int *lenp) +{ + int32_t totalsize; + uint32_t absoffset; + size_t len; + int err; + const char *s, *n; + + if (can_assume(VALID_INPUT)) { + s = (const char *)fdt + fdt_off_dt_strings(fdt) + stroffset; + + if (lenp) + *lenp = strlen(s); + return s; + } + totalsize = fdt_ro_probe_(fdt); + err = totalsize; + if (totalsize < 0) + goto fail; + + err = -FDT_ERR_BADOFFSET; + absoffset = stroffset + fdt_off_dt_strings(fdt); + if (absoffset >= (unsigned)totalsize) + goto fail; + len = totalsize - absoffset; + + if (fdt_magic(fdt) == FDT_MAGIC) { + if (stroffset < 0) + goto fail; + if (can_assume(LATEST) || fdt_version(fdt) >= 17) { + if ((unsigned)stroffset >= fdt_size_dt_strings(fdt)) + goto fail; + if ((fdt_size_dt_strings(fdt) - stroffset) < len) + len = fdt_size_dt_strings(fdt) - stroffset; + } + } else if (fdt_magic(fdt) == FDT_SW_MAGIC) { + unsigned int sw_stroffset = -stroffset; + + if ((stroffset >= 0) || + (sw_stroffset > fdt_size_dt_strings(fdt))) + goto fail; + if (sw_stroffset < len) + len = sw_stroffset; + } else { + err = -FDT_ERR_INTERNAL; + goto fail; + } + + s = (const char *)fdt + absoffset; + n = memchr(s, '\0', len); + if (!n) { + /* missing terminating NULL */ + err = -FDT_ERR_TRUNCATED; + goto fail; + } + + if (lenp) + *lenp = n - s; + return s; + +fail: + if (lenp) + *lenp = err; + return NULL; +} + +const char *fdt_string(const void *fdt, int stroffset) +{ + return fdt_get_string(fdt, stroffset, NULL); +} + +static int fdt_string_eq_(const void *fdt, int stroffset, + const char *s, int len) +{ + int slen; + const char *p = fdt_get_string(fdt, stroffset, &slen); + + return p && (slen == len) && (memcmp(p, s, len) == 0); +} + +int fdt_find_max_phandle(const void *fdt, uint32_t *phandle) +{ + uint32_t max = 0; + int offset = -1; + + while (true) { + uint32_t value; + + offset = fdt_next_node(fdt, offset, NULL); + if (offset < 0) { + if (offset == -FDT_ERR_NOTFOUND) + break; + + return offset; + } + + value = fdt_get_phandle(fdt, offset); + + if (value > max) + max = value; + } + + if (phandle) + *phandle = max; + + return 0; +} + +int fdt_generate_phandle(const void *fdt, uint32_t *phandle) +{ + uint32_t max; + int err; + + err = fdt_find_max_phandle(fdt, &max); + if (err < 0) + return err; + + if (max == FDT_MAX_PHANDLE) + return -FDT_ERR_NOPHANDLES; + + if (phandle) + *phandle = max + 1; + + return 0; +} + +static const struct fdt_reserve_entry *fdt_mem_rsv(const void *fdt, int n) +{ + unsigned int offset = n * sizeof(struct fdt_reserve_entry); + unsigned int absoffset = fdt_off_mem_rsvmap(fdt) + offset; + + if (!can_assume(VALID_INPUT)) { + if (absoffset < fdt_off_mem_rsvmap(fdt)) + return NULL; + if (absoffset > fdt_totalsize(fdt) - + sizeof(struct fdt_reserve_entry)) + return NULL; + } + return fdt_mem_rsv_(fdt, n); +} + +int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size) +{ + const struct fdt_reserve_entry *re; + + FDT_RO_PROBE(fdt); + re = fdt_mem_rsv(fdt, n); + if (!can_assume(VALID_INPUT) && !re) + return -FDT_ERR_BADOFFSET; + + *address = fdt64_ld(&re->address); + *size = fdt64_ld(&re->size); + return 0; +} + +int fdt_num_mem_rsv(const void *fdt) +{ + int i; + const struct fdt_reserve_entry *re; + + for (i = 0; (re = fdt_mem_rsv(fdt, i)) != NULL; i++) { + if (fdt64_ld(&re->size) == 0) + return i; + } + return -FDT_ERR_TRUNCATED; +} + +static int nextprop_(const void *fdt, int offset) +{ + uint32_t tag; + int nextoffset; + + do { + tag = fdt_next_tag(fdt, offset, &nextoffset); + + switch (tag) { + case FDT_END: + if (nextoffset >= 0) + return -FDT_ERR_BADSTRUCTURE; + else + return nextoffset; + + case FDT_PROP: + return offset; + } + offset = nextoffset; + } while (tag == FDT_NOP); + + return -FDT_ERR_NOTFOUND; +} + +int fdt_subnode_offset_namelen(const void *fdt, int offset, + const char *name, int namelen) +{ + int depth; + + FDT_RO_PROBE(fdt); + + for (depth = 0; + (offset >= 0) && (depth >= 0); + offset = fdt_next_node(fdt, offset, &depth)) + if ((depth == 1) + && fdt_nodename_eq_(fdt, offset, name, namelen)) + return offset; + + if (depth < 0) + return -FDT_ERR_NOTFOUND; + return offset; /* error */ +} + +int fdt_subnode_offset(const void *fdt, int parentoffset, + const char *name) +{ + return fdt_subnode_offset_namelen(fdt, parentoffset, name, strlen(name)); +} + +int fdt_path_offset_namelen(const void *fdt, const char *path, int namelen) +{ + const char *end = path + namelen; + const char *p = path; + int offset = 0; + + FDT_RO_PROBE(fdt); + + /* see if we have an alias */ + if (*path != '/') { + const char *q = memchr(path, '/', end - p); + + if (!q) + q = end; + + p = fdt_get_alias_namelen(fdt, p, q - p); + if (!p) + return -FDT_ERR_BADPATH; + offset = fdt_path_offset(fdt, p); + + p = q; + } + + while (p < end) { + const char *q; + + while (*p == '/') { + p++; + if (p == end) + return offset; + } + q = memchr(p, '/', end - p); + if (! q) + q = end; + + offset = fdt_subnode_offset_namelen(fdt, offset, p, q-p); + if (offset < 0) + return offset; + + p = q; + } + + return offset; +} + +int fdt_path_offset(const void *fdt, const char *path) +{ + return fdt_path_offset_namelen(fdt, path, strlen(path)); +} + +const char *fdt_get_name(const void *fdt, int nodeoffset, int *len) +{ + const struct fdt_node_header *nh = fdt_offset_ptr_(fdt, nodeoffset); + const char *nameptr; + int err; + + if (((err = fdt_ro_probe_(fdt)) < 0) + || ((err = fdt_check_node_offset_(fdt, nodeoffset)) < 0)) + goto fail; + + nameptr = nh->name; + + if (!can_assume(LATEST) && fdt_version(fdt) < 0x10) { + /* + * For old FDT versions, match the naming conventions of V16: + * give only the leaf name (after all /). The actual tree + * contents are loosely checked. + */ + const char *leaf; + leaf = strrchr(nameptr, '/'); + if (leaf == NULL) { + err = -FDT_ERR_BADSTRUCTURE; + goto fail; + } + nameptr = leaf+1; + } + + if (len) + *len = strlen(nameptr); + + return nameptr; + + fail: + if (len) + *len = err; + return NULL; +} + +int fdt_first_property_offset(const void *fdt, int nodeoffset) +{ + int offset; + + if ((offset = fdt_check_node_offset_(fdt, nodeoffset)) < 0) + return offset; + + return nextprop_(fdt, offset); +} + +int fdt_next_property_offset(const void *fdt, int offset) +{ + if ((offset = fdt_check_prop_offset_(fdt, offset)) < 0) + return offset; + + return nextprop_(fdt, offset); +} + +static const struct fdt_property *fdt_get_property_by_offset_(const void *fdt, + int offset, + int *lenp) +{ + int err; + const struct fdt_property *prop; + + if (!can_assume(VALID_INPUT) && + (err = fdt_check_prop_offset_(fdt, offset)) < 0) { + if (lenp) + *lenp = err; + return NULL; + } + + prop = fdt_offset_ptr_(fdt, offset); + + if (lenp) + *lenp = fdt32_ld(&prop->len); + + return prop; +} + +const struct fdt_property *fdt_get_property_by_offset(const void *fdt, + int offset, + int *lenp) +{ + /* Prior to version 16, properties may need realignment + * and this API does not work. fdt_getprop_*() will, however. */ + + if (!can_assume(LATEST) && fdt_version(fdt) < 0x10) { + if (lenp) + *lenp = -FDT_ERR_BADVERSION; + return NULL; + } + + return fdt_get_property_by_offset_(fdt, offset, lenp); +} + +static const struct fdt_property *fdt_get_property_namelen_(const void *fdt, + int offset, + const char *name, + int namelen, + int *lenp, + int *poffset) +{ + for (offset = fdt_first_property_offset(fdt, offset); + (offset >= 0); + (offset = fdt_next_property_offset(fdt, offset))) { + const struct fdt_property *prop; + + prop = fdt_get_property_by_offset_(fdt, offset, lenp); + if (!can_assume(LIBFDT_FLAWLESS) && !prop) { + offset = -FDT_ERR_INTERNAL; + break; + } + if (fdt_string_eq_(fdt, fdt32_ld(&prop->nameoff), + name, namelen)) { + if (poffset) + *poffset = offset; + return prop; + } + } + + if (lenp) + *lenp = offset; + return NULL; +} + + +const struct fdt_property *fdt_get_property_namelen(const void *fdt, + int offset, + const char *name, + int namelen, int *lenp) +{ + /* Prior to version 16, properties may need realignment + * and this API does not work. fdt_getprop_*() will, however. */ + if (!can_assume(LATEST) && fdt_version(fdt) < 0x10) { + if (lenp) + *lenp = -FDT_ERR_BADVERSION; + return NULL; + } + + return fdt_get_property_namelen_(fdt, offset, name, namelen, lenp, + NULL); +} + + +const struct fdt_property *fdt_get_property(const void *fdt, + int nodeoffset, + const char *name, int *lenp) +{ + return fdt_get_property_namelen(fdt, nodeoffset, name, + strlen(name), lenp); +} + +const void *fdt_getprop_namelen(const void *fdt, int nodeoffset, + const char *name, int namelen, int *lenp) +{ + int poffset; + const struct fdt_property *prop; + + prop = fdt_get_property_namelen_(fdt, nodeoffset, name, namelen, lenp, + &poffset); + if (!prop) + return NULL; + + /* Handle realignment */ + if (!can_assume(LATEST) && fdt_version(fdt) < 0x10 && + (poffset + sizeof(*prop)) % 8 && fdt32_ld(&prop->len) >= 8) + return prop->data + 4; + return prop->data; +} + +const void *fdt_getprop_by_offset(const void *fdt, int offset, + const char **namep, int *lenp) +{ + const struct fdt_property *prop; + + prop = fdt_get_property_by_offset_(fdt, offset, lenp); + if (!prop) + return NULL; + if (namep) { + const char *name; + int namelen; + + if (!can_assume(VALID_INPUT)) { + name = fdt_get_string(fdt, fdt32_ld(&prop->nameoff), + &namelen); + if (!name) { + if (lenp) + *lenp = namelen; + return NULL; + } + *namep = name; + } else { + *namep = fdt_string(fdt, fdt32_ld(&prop->nameoff)); + } + } + + /* Handle realignment */ + if (!can_assume(LATEST) && fdt_version(fdt) < 0x10 && + (offset + sizeof(*prop)) % 8 && fdt32_ld(&prop->len) >= 8) + return prop->data + 4; + return prop->data; +} + +const void *fdt_getprop(const void *fdt, int nodeoffset, + const char *name, int *lenp) +{ + return fdt_getprop_namelen(fdt, nodeoffset, name, strlen(name), lenp); +} + +uint32_t fdt_get_phandle(const void *fdt, int nodeoffset) +{ + const fdt32_t *php; + int len; + + /* FIXME: This is a bit sub-optimal, since we potentially scan + * over all the properties twice. */ + php = fdt_getprop(fdt, nodeoffset, "phandle", &len); + if (!php || (len != sizeof(*php))) { + php = fdt_getprop(fdt, nodeoffset, "linux,phandle", &len); + if (!php || (len != sizeof(*php))) + return 0; + } + + return fdt32_ld(php); +} + +const char *fdt_get_alias_namelen(const void *fdt, + const char *name, int namelen) +{ + int aliasoffset; + + aliasoffset = fdt_path_offset(fdt, "/aliases"); + if (aliasoffset < 0) + return NULL; + + return fdt_getprop_namelen(fdt, aliasoffset, name, namelen, NULL); +} + +const char *fdt_get_alias(const void *fdt, const char *name) +{ + return fdt_get_alias_namelen(fdt, name, strlen(name)); +} + +int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen) +{ + int pdepth = 0, p = 0; + int offset, depth, namelen; + const char *name; + + FDT_RO_PROBE(fdt); + + if (buflen < 2) + return -FDT_ERR_NOSPACE; + + for (offset = 0, depth = 0; + (offset >= 0) && (offset <= nodeoffset); + offset = fdt_next_node(fdt, offset, &depth)) { + while (pdepth > depth) { + do { + p--; + } while (buf[p-1] != '/'); + pdepth--; + } + + if (pdepth >= depth) { + name = fdt_get_name(fdt, offset, &namelen); + if (!name) + return namelen; + if ((p + namelen + 1) <= buflen) { + memcpy(buf + p, name, namelen); + p += namelen; + buf[p++] = '/'; + pdepth++; + } + } + + if (offset == nodeoffset) { + if (pdepth < (depth + 1)) + return -FDT_ERR_NOSPACE; + + if (p > 1) /* special case so that root path is "/", not "" */ + p--; + buf[p] = '\0'; + return 0; + } + } + + if ((offset == -FDT_ERR_NOTFOUND) || (offset >= 0)) + return -FDT_ERR_BADOFFSET; + else if (offset == -FDT_ERR_BADOFFSET) + return -FDT_ERR_BADSTRUCTURE; + + return offset; /* error from fdt_next_node() */ +} + +int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset, + int supernodedepth, int *nodedepth) +{ + int offset, depth; + int supernodeoffset = -FDT_ERR_INTERNAL; + + FDT_RO_PROBE(fdt); + + if (supernodedepth < 0) + return -FDT_ERR_NOTFOUND; + + for (offset = 0, depth = 0; + (offset >= 0) && (offset <= nodeoffset); + offset = fdt_next_node(fdt, offset, &depth)) { + if (depth == supernodedepth) + supernodeoffset = offset; + + if (offset == nodeoffset) { + if (nodedepth) + *nodedepth = depth; + + if (supernodedepth > depth) + return -FDT_ERR_NOTFOUND; + else + return supernodeoffset; + } + } + + if (!can_assume(VALID_INPUT)) { + if ((offset == -FDT_ERR_NOTFOUND) || (offset >= 0)) + return -FDT_ERR_BADOFFSET; + else if (offset == -FDT_ERR_BADOFFSET) + return -FDT_ERR_BADSTRUCTURE; + } + + return offset; /* error from fdt_next_node() */ +} + +int fdt_node_depth(const void *fdt, int nodeoffset) +{ + int nodedepth; + int err; + + err = fdt_supernode_atdepth_offset(fdt, nodeoffset, 0, &nodedepth); + if (err) + return (can_assume(LIBFDT_FLAWLESS) || err < 0) ? err : + -FDT_ERR_INTERNAL; + return nodedepth; +} + +int fdt_parent_offset(const void *fdt, int nodeoffset) +{ + int nodedepth = fdt_node_depth(fdt, nodeoffset); + + if (nodedepth < 0) + return nodedepth; + return fdt_supernode_atdepth_offset(fdt, nodeoffset, + nodedepth - 1, NULL); +} + +int fdt_node_offset_by_prop_value(const void *fdt, int startoffset, + const char *propname, + const void *propval, int proplen) +{ + int offset; + const void *val; + int len; + + FDT_RO_PROBE(fdt); + + /* FIXME: The algorithm here is pretty horrible: we scan each + * property of a node in fdt_getprop(), then if that didn't + * find what we want, we scan over them again making our way + * to the next node. Still it's the easiest to implement + * approach; performance can come later. */ + for (offset = fdt_next_node(fdt, startoffset, NULL); + offset >= 0; + offset = fdt_next_node(fdt, offset, NULL)) { + val = fdt_getprop(fdt, offset, propname, &len); + if (val && (len == proplen) + && (memcmp(val, propval, len) == 0)) + return offset; + } + + return offset; /* error from fdt_next_node() */ +} + +int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle) +{ + int offset; + + if ((phandle == 0) || (phandle == ~0U)) + return -FDT_ERR_BADPHANDLE; + + FDT_RO_PROBE(fdt); + + /* FIXME: The algorithm here is pretty horrible: we + * potentially scan each property of a node in + * fdt_get_phandle(), then if that didn't find what + * we want, we scan over them again making our way to the next + * node. Still it's the easiest to implement approach; + * performance can come later. */ + for (offset = fdt_next_node(fdt, -1, NULL); + offset >= 0; + offset = fdt_next_node(fdt, offset, NULL)) { + if (fdt_get_phandle(fdt, offset) == phandle) + return offset; + } + + return offset; /* error from fdt_next_node() */ +} + +int fdt_stringlist_contains(const char *strlist, int listlen, const char *str) +{ + int len = strlen(str); + const char *p; + + while (listlen >= len) { + if (memcmp(str, strlist, len+1) == 0) + return 1; + p = memchr(strlist, '\0', listlen); + if (!p) + return 0; /* malformed strlist.. */ + listlen -= (p-strlist) + 1; + strlist = p + 1; + } + return 0; +} + +int fdt_stringlist_count(const void *fdt, int nodeoffset, const char *property) +{ + const char *list, *end; + int length, count = 0; + + list = fdt_getprop(fdt, nodeoffset, property, &length); + if (!list) + return length; + + end = list + length; + + while (list < end) { + length = strnlen(list, end - list) + 1; + + /* Abort if the last string isn't properly NUL-terminated. */ + if (list + length > end) + return -FDT_ERR_BADVALUE; + + list += length; + count++; + } + + return count; +} + +int fdt_stringlist_search(const void *fdt, int nodeoffset, const char *property, + const char *string) +{ + int length, len, idx = 0; + const char *list, *end; + + list = fdt_getprop(fdt, nodeoffset, property, &length); + if (!list) + return length; + + len = strlen(string) + 1; + end = list + length; + + while (list < end) { + length = strnlen(list, end - list) + 1; + + /* Abort if the last string isn't properly NUL-terminated. */ + if (list + length > end) + return -FDT_ERR_BADVALUE; + + if (length == len && memcmp(list, string, length) == 0) + return idx; + + list += length; + idx++; + } + + return -FDT_ERR_NOTFOUND; +} + +const char *fdt_stringlist_get(const void *fdt, int nodeoffset, + const char *property, int idx, + int *lenp) +{ + const char *list, *end; + int length; + + list = fdt_getprop(fdt, nodeoffset, property, &length); + if (!list) { + if (lenp) + *lenp = length; + + return NULL; + } + + end = list + length; + + while (list < end) { + length = strnlen(list, end - list) + 1; + + /* Abort if the last string isn't properly NUL-terminated. */ + if (list + length > end) { + if (lenp) + *lenp = -FDT_ERR_BADVALUE; + + return NULL; + } + + if (idx == 0) { + if (lenp) + *lenp = length - 1; + + return list; + } + + list += length; + idx--; + } + + if (lenp) + *lenp = -FDT_ERR_NOTFOUND; + + return NULL; +} + +int fdt_node_check_compatible(const void *fdt, int nodeoffset, + const char *compatible) +{ + const void *prop; + int len; + + prop = fdt_getprop(fdt, nodeoffset, "compatible", &len); + if (!prop) + return len; + + return !fdt_stringlist_contains(prop, len, compatible); +} + +int fdt_node_offset_by_compatible(const void *fdt, int startoffset, + const char *compatible) +{ + int offset, err; + + FDT_RO_PROBE(fdt); + + /* FIXME: The algorithm here is pretty horrible: we scan each + * property of a node in fdt_node_check_compatible(), then if + * that didn't find what we want, we scan over them again + * making our way to the next node. Still it's the easiest to + * implement approach; performance can come later. */ + for (offset = fdt_next_node(fdt, startoffset, NULL); + offset >= 0; + offset = fdt_next_node(fdt, offset, NULL)) { + err = fdt_node_check_compatible(fdt, offset, compatible); + if ((err < 0) && (err != -FDT_ERR_NOTFOUND)) + return err; + else if (err == 0) + return offset; + } + + return offset; /* error from fdt_next_node() */ +} diff --git a/src/net/scripts/dtc/libfdt/fdt_rw.c b/src/net/scripts/dtc/libfdt/fdt_rw.c new file mode 100644 index 0000000..68887b9 --- /dev/null +++ b/src/net/scripts/dtc/libfdt/fdt_rw.c @@ -0,0 +1,492 @@ +// SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + */ +#include "libfdt_env.h" + +#include <fdt.h> +#include <libfdt.h> + +#include "libfdt_internal.h" + +static int fdt_blocks_misordered_(const void *fdt, + int mem_rsv_size, int struct_size) +{ + return (fdt_off_mem_rsvmap(fdt) < FDT_ALIGN(sizeof(struct fdt_header), 8)) + || (fdt_off_dt_struct(fdt) < + (fdt_off_mem_rsvmap(fdt) + mem_rsv_size)) + || (fdt_off_dt_strings(fdt) < + (fdt_off_dt_struct(fdt) + struct_size)) + || (fdt_totalsize(fdt) < + (fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt))); +} + +static int fdt_rw_probe_(void *fdt) +{ + if (can_assume(VALID_DTB)) + return 0; + FDT_RO_PROBE(fdt); + + if (!can_assume(LATEST) && fdt_version(fdt) < 17) + return -FDT_ERR_BADVERSION; + if (fdt_blocks_misordered_(fdt, sizeof(struct fdt_reserve_entry), + fdt_size_dt_struct(fdt))) + return -FDT_ERR_BADLAYOUT; + if (!can_assume(LATEST) && fdt_version(fdt) > 17) + fdt_set_version(fdt, 17); + + return 0; +} + +#define FDT_RW_PROBE(fdt) \ + { \ + int err_; \ + if ((err_ = fdt_rw_probe_(fdt)) != 0) \ + return err_; \ + } + +static inline unsigned int fdt_data_size_(void *fdt) +{ + return fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt); +} + +static int fdt_splice_(void *fdt, void *splicepoint, int oldlen, int newlen) +{ + char *p = splicepoint; + unsigned int dsize = fdt_data_size_(fdt); + size_t soff = p - (char *)fdt; + + if ((oldlen < 0) || (soff + oldlen < soff) || (soff + oldlen > dsize)) + return -FDT_ERR_BADOFFSET; + if ((p < (char *)fdt) || (dsize + newlen < (unsigned)oldlen)) + return -FDT_ERR_BADOFFSET; + if (dsize - oldlen + newlen > fdt_totalsize(fdt)) + return -FDT_ERR_NOSPACE; + memmove(p + newlen, p + oldlen, ((char *)fdt + dsize) - (p + oldlen)); + return 0; +} + +static int fdt_splice_mem_rsv_(void *fdt, struct fdt_reserve_entry *p, + int oldn, int newn) +{ + int delta = (newn - oldn) * sizeof(*p); + int err; + err = fdt_splice_(fdt, p, oldn * sizeof(*p), newn * sizeof(*p)); + if (err) + return err; + fdt_set_off_dt_struct(fdt, fdt_off_dt_struct(fdt) + delta); + fdt_set_off_dt_strings(fdt, fdt_off_dt_strings(fdt) + delta); + return 0; +} + +static int fdt_splice_struct_(void *fdt, void *p, + int oldlen, int newlen) +{ + int delta = newlen - oldlen; + int err; + + if ((err = fdt_splice_(fdt, p, oldlen, newlen))) + return err; + + fdt_set_size_dt_struct(fdt, fdt_size_dt_struct(fdt) + delta); + fdt_set_off_dt_strings(fdt, fdt_off_dt_strings(fdt) + delta); + return 0; +} + +/* Must only be used to roll back in case of error */ +static void fdt_del_last_string_(void *fdt, const char *s) +{ + int newlen = strlen(s) + 1; + + fdt_set_size_dt_strings(fdt, fdt_size_dt_strings(fdt) - newlen); +} + +static int fdt_splice_string_(void *fdt, int newlen) +{ + void *p = (char *)fdt + + fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt); + int err; + + if ((err = fdt_splice_(fdt, p, 0, newlen))) + return err; + + fdt_set_size_dt_strings(fdt, fdt_size_dt_strings(fdt) + newlen); + return 0; +} + +/** + * fdt_find_add_string_() - Find or allocate a string + * + * @fdt: pointer to the device tree to check/adjust + * @s: string to find/add + * @allocated: Set to 0 if the string was found, 1 if not found and so + * allocated. Ignored if can_assume(NO_ROLLBACK) + * @return offset of string in the string table (whether found or added) + */ +static int fdt_find_add_string_(void *fdt, const char *s, int *allocated) +{ + char *strtab = (char *)fdt + fdt_off_dt_strings(fdt); + const char *p; + char *new; + int len = strlen(s) + 1; + int err; + + if (!can_assume(NO_ROLLBACK)) + *allocated = 0; + + p = fdt_find_string_(strtab, fdt_size_dt_strings(fdt), s); + if (p) + /* found it */ + return (p - strtab); + + new = strtab + fdt_size_dt_strings(fdt); + err = fdt_splice_string_(fdt, len); + if (err) + return err; + + if (!can_assume(NO_ROLLBACK)) + *allocated = 1; + + memcpy(new, s, len); + return (new - strtab); +} + +int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size) +{ + struct fdt_reserve_entry *re; + int err; + + FDT_RW_PROBE(fdt); + + re = fdt_mem_rsv_w_(fdt, fdt_num_mem_rsv(fdt)); + err = fdt_splice_mem_rsv_(fdt, re, 0, 1); + if (err) + return err; + + re->address = cpu_to_fdt64(address); + re->size = cpu_to_fdt64(size); + return 0; +} + +int fdt_del_mem_rsv(void *fdt, int n) +{ + struct fdt_reserve_entry *re = fdt_mem_rsv_w_(fdt, n); + + FDT_RW_PROBE(fdt); + + if (n >= fdt_num_mem_rsv(fdt)) + return -FDT_ERR_NOTFOUND; + + return fdt_splice_mem_rsv_(fdt, re, 1, 0); +} + +static int fdt_resize_property_(void *fdt, int nodeoffset, const char *name, + int len, struct fdt_property **prop) +{ + int oldlen; + int err; + + *prop = fdt_get_property_w(fdt, nodeoffset, name, &oldlen); + if (!*prop) + return oldlen; + + if ((err = fdt_splice_struct_(fdt, (*prop)->data, FDT_TAGALIGN(oldlen), + FDT_TAGALIGN(len)))) + return err; + + (*prop)->len = cpu_to_fdt32(len); + return 0; +} + +static int fdt_add_property_(void *fdt, int nodeoffset, const char *name, + int len, struct fdt_property **prop) +{ + int proplen; + int nextoffset; + int namestroff; + int err; + int allocated; + + if ((nextoffset = fdt_check_node_offset_(fdt, nodeoffset)) < 0) + return nextoffset; + + namestroff = fdt_find_add_string_(fdt, name, &allocated); + if (namestroff < 0) + return namestroff; + + *prop = fdt_offset_ptr_w_(fdt, nextoffset); + proplen = sizeof(**prop) + FDT_TAGALIGN(len); + + err = fdt_splice_struct_(fdt, *prop, 0, proplen); + if (err) { + /* Delete the string if we failed to add it */ + if (!can_assume(NO_ROLLBACK) && allocated) + fdt_del_last_string_(fdt, name); + return err; + } + + (*prop)->tag = cpu_to_fdt32(FDT_PROP); + (*prop)->nameoff = cpu_to_fdt32(namestroff); + (*prop)->len = cpu_to_fdt32(len); + return 0; +} + +int fdt_set_name(void *fdt, int nodeoffset, const char *name) +{ + char *namep; + int oldlen, newlen; + int err; + + FDT_RW_PROBE(fdt); + + namep = (char *)(uintptr_t)fdt_get_name(fdt, nodeoffset, &oldlen); + if (!namep) + return oldlen; + + newlen = strlen(name); + + err = fdt_splice_struct_(fdt, namep, FDT_TAGALIGN(oldlen+1), + FDT_TAGALIGN(newlen+1)); + if (err) + return err; + + memcpy(namep, name, newlen+1); + return 0; +} + +int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name, + int len, void **prop_data) +{ + struct fdt_property *prop; + int err; + + FDT_RW_PROBE(fdt); + + err = fdt_resize_property_(fdt, nodeoffset, name, len, &prop); + if (err == -FDT_ERR_NOTFOUND) + err = fdt_add_property_(fdt, nodeoffset, name, len, &prop); + if (err) + return err; + + *prop_data = prop->data; + return 0; +} + +int fdt_setprop(void *fdt, int nodeoffset, const char *name, + const void *val, int len) +{ + void *prop_data; + int err; + + err = fdt_setprop_placeholder(fdt, nodeoffset, name, len, &prop_data); + if (err) + return err; + + if (len) + memcpy(prop_data, val, len); + return 0; +} + +int fdt_appendprop(void *fdt, int nodeoffset, const char *name, + const void *val, int len) +{ + struct fdt_property *prop; + int err, oldlen, newlen; + + FDT_RW_PROBE(fdt); + + prop = fdt_get_property_w(fdt, nodeoffset, name, &oldlen); + if (prop) { + newlen = len + oldlen; + err = fdt_splice_struct_(fdt, prop->data, + FDT_TAGALIGN(oldlen), + FDT_TAGALIGN(newlen)); + if (err) + return err; + prop->len = cpu_to_fdt32(newlen); + memcpy(prop->data + oldlen, val, len); + } else { + err = fdt_add_property_(fdt, nodeoffset, name, len, &prop); + if (err) + return err; + memcpy(prop->data, val, len); + } + return 0; +} + +int fdt_delprop(void *fdt, int nodeoffset, const char *name) +{ + struct fdt_property *prop; + int len, proplen; + + FDT_RW_PROBE(fdt); + + prop = fdt_get_property_w(fdt, nodeoffset, name, &len); + if (!prop) + return len; + + proplen = sizeof(*prop) + FDT_TAGALIGN(len); + return fdt_splice_struct_(fdt, prop, proplen, 0); +} + +int fdt_add_subnode_namelen(void *fdt, int parentoffset, + const char *name, int namelen) +{ + struct fdt_node_header *nh; + int offset, nextoffset; + int nodelen; + int err; + uint32_t tag; + fdt32_t *endtag; + + FDT_RW_PROBE(fdt); + + offset = fdt_subnode_offset_namelen(fdt, parentoffset, name, namelen); + if (offset >= 0) + return -FDT_ERR_EXISTS; + else if (offset != -FDT_ERR_NOTFOUND) + return offset; + + /* Try to place the new node after the parent's properties */ + fdt_next_tag(fdt, parentoffset, &nextoffset); /* skip the BEGIN_NODE */ + do { + offset = nextoffset; + tag = fdt_next_tag(fdt, offset, &nextoffset); + } while ((tag == FDT_PROP) || (tag == FDT_NOP)); + + nh = fdt_offset_ptr_w_(fdt, offset); + nodelen = sizeof(*nh) + FDT_TAGALIGN(namelen+1) + FDT_TAGSIZE; + + err = fdt_splice_struct_(fdt, nh, 0, nodelen); + if (err) + return err; + + nh->tag = cpu_to_fdt32(FDT_BEGIN_NODE); + memset(nh->name, 0, FDT_TAGALIGN(namelen+1)); + memcpy(nh->name, name, namelen); + endtag = (fdt32_t *)((char *)nh + nodelen - FDT_TAGSIZE); + *endtag = cpu_to_fdt32(FDT_END_NODE); + + return offset; +} + +int fdt_add_subnode(void *fdt, int parentoffset, const char *name) +{ + return fdt_add_subnode_namelen(fdt, parentoffset, name, strlen(name)); +} + +int fdt_del_node(void *fdt, int nodeoffset) +{ + int endoffset; + + FDT_RW_PROBE(fdt); + + endoffset = fdt_node_end_offset_(fdt, nodeoffset); + if (endoffset < 0) + return endoffset; + + return fdt_splice_struct_(fdt, fdt_offset_ptr_w_(fdt, nodeoffset), + endoffset - nodeoffset, 0); +} + +static void fdt_packblocks_(const char *old, char *new, + int mem_rsv_size, int struct_size) +{ + int mem_rsv_off, struct_off, strings_off; + + mem_rsv_off = FDT_ALIGN(sizeof(struct fdt_header), 8); + struct_off = mem_rsv_off + mem_rsv_size; + strings_off = struct_off + struct_size; + + memmove(new + mem_rsv_off, old + fdt_off_mem_rsvmap(old), mem_rsv_size); + fdt_set_off_mem_rsvmap(new, mem_rsv_off); + + memmove(new + struct_off, old + fdt_off_dt_struct(old), struct_size); + fdt_set_off_dt_struct(new, struct_off); + fdt_set_size_dt_struct(new, struct_size); + + memmove(new + strings_off, old + fdt_off_dt_strings(old), + fdt_size_dt_strings(old)); + fdt_set_off_dt_strings(new, strings_off); + fdt_set_size_dt_strings(new, fdt_size_dt_strings(old)); +} + +int fdt_open_into(const void *fdt, void *buf, int bufsize) +{ + int err; + int mem_rsv_size, struct_size; + int newsize; + const char *fdtstart = fdt; + const char *fdtend = fdtstart + fdt_totalsize(fdt); + char *tmp; + + FDT_RO_PROBE(fdt); + + mem_rsv_size = (fdt_num_mem_rsv(fdt)+1) + * sizeof(struct fdt_reserve_entry); + + if (can_assume(LATEST) || fdt_version(fdt) >= 17) { + struct_size = fdt_size_dt_struct(fdt); + } else { + struct_size = 0; + while (fdt_next_tag(fdt, struct_size, &struct_size) != FDT_END) + ; + if (struct_size < 0) + return struct_size; + } + + if (can_assume(LIBFDT_ORDER) || + !fdt_blocks_misordered_(fdt, mem_rsv_size, struct_size)) { + /* no further work necessary */ + err = fdt_move(fdt, buf, bufsize); + if (err) + return err; + fdt_set_version(buf, 17); + fdt_set_size_dt_struct(buf, struct_size); + fdt_set_totalsize(buf, bufsize); + return 0; + } + + /* Need to reorder */ + newsize = FDT_ALIGN(sizeof(struct fdt_header), 8) + mem_rsv_size + + struct_size + fdt_size_dt_strings(fdt); + + if (bufsize < newsize) + return -FDT_ERR_NOSPACE; + + /* First attempt to build converted tree at beginning of buffer */ + tmp = buf; + /* But if that overlaps with the old tree... */ + if (((tmp + newsize) > fdtstart) && (tmp < fdtend)) { + /* Try right after the old tree instead */ + tmp = (char *)(uintptr_t)fdtend; + if ((tmp + newsize) > ((char *)buf + bufsize)) + return -FDT_ERR_NOSPACE; + } + + fdt_packblocks_(fdt, tmp, mem_rsv_size, struct_size); + memmove(buf, tmp, newsize); + + fdt_set_magic(buf, FDT_MAGIC); + fdt_set_totalsize(buf, bufsize); + fdt_set_version(buf, 17); + fdt_set_last_comp_version(buf, 16); + fdt_set_boot_cpuid_phys(buf, fdt_boot_cpuid_phys(fdt)); + + return 0; +} + +int fdt_pack(void *fdt) +{ + int mem_rsv_size; + + FDT_RW_PROBE(fdt); + + mem_rsv_size = (fdt_num_mem_rsv(fdt)+1) + * sizeof(struct fdt_reserve_entry); + fdt_packblocks_(fdt, fdt, mem_rsv_size, fdt_size_dt_struct(fdt)); + fdt_set_totalsize(fdt, fdt_data_size_(fdt)); + + return 0; +} diff --git a/src/net/scripts/dtc/libfdt/fdt_strerror.c b/src/net/scripts/dtc/libfdt/fdt_strerror.c new file mode 100644 index 0000000..b435693 --- /dev/null +++ b/src/net/scripts/dtc/libfdt/fdt_strerror.c @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "libfdt_env.h" + +#include <fdt.h> +#include <libfdt.h> + +#include "libfdt_internal.h" + +struct fdt_errtabent { + const char *str; +}; + +#define FDT_ERRTABENT(val) \ + [(val)] = { .str = #val, } + +static struct fdt_errtabent fdt_errtable[] = { + FDT_ERRTABENT(FDT_ERR_NOTFOUND), + FDT_ERRTABENT(FDT_ERR_EXISTS), + FDT_ERRTABENT(FDT_ERR_NOSPACE), + + FDT_ERRTABENT(FDT_ERR_BADOFFSET), + FDT_ERRTABENT(FDT_ERR_BADPATH), + FDT_ERRTABENT(FDT_ERR_BADPHANDLE), + FDT_ERRTABENT(FDT_ERR_BADSTATE), + + FDT_ERRTABENT(FDT_ERR_TRUNCATED), + FDT_ERRTABENT(FDT_ERR_BADMAGIC), + FDT_ERRTABENT(FDT_ERR_BADVERSION), + FDT_ERRTABENT(FDT_ERR_BADSTRUCTURE), + FDT_ERRTABENT(FDT_ERR_BADLAYOUT), + FDT_ERRTABENT(FDT_ERR_INTERNAL), + FDT_ERRTABENT(FDT_ERR_BADNCELLS), + FDT_ERRTABENT(FDT_ERR_BADVALUE), + FDT_ERRTABENT(FDT_ERR_BADOVERLAY), + FDT_ERRTABENT(FDT_ERR_NOPHANDLES), + FDT_ERRTABENT(FDT_ERR_BADFLAGS), +}; +#define FDT_ERRTABSIZE ((int)(sizeof(fdt_errtable) / sizeof(fdt_errtable[0]))) + +const char *fdt_strerror(int errval) +{ + if (errval > 0) + return "<valid offset/length>"; + else if (errval == 0) + return "<no error>"; + else if (-errval < FDT_ERRTABSIZE) { + const char *s = fdt_errtable[-errval].str; + + if (s) + return s; + } + + return "<unknown error>"; +} diff --git a/src/net/scripts/dtc/libfdt/fdt_sw.c b/src/net/scripts/dtc/libfdt/fdt_sw.c new file mode 100644 index 0000000..68b543c --- /dev/null +++ b/src/net/scripts/dtc/libfdt/fdt_sw.c @@ -0,0 +1,384 @@ +// SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + */ +#include "libfdt_env.h" + +#include <fdt.h> +#include <libfdt.h> + +#include "libfdt_internal.h" + +static int fdt_sw_probe_(void *fdt) +{ + if (!can_assume(VALID_INPUT)) { + if (fdt_magic(fdt) == FDT_MAGIC) + return -FDT_ERR_BADSTATE; + else if (fdt_magic(fdt) != FDT_SW_MAGIC) + return -FDT_ERR_BADMAGIC; + } + + return 0; +} + +#define FDT_SW_PROBE(fdt) \ + { \ + int err; \ + if ((err = fdt_sw_probe_(fdt)) != 0) \ + return err; \ + } + +/* 'memrsv' state: Initial state after fdt_create() + * + * Allowed functions: + * fdt_add_reservemap_entry() + * fdt_finish_reservemap() [moves to 'struct' state] + */ +static int fdt_sw_probe_memrsv_(void *fdt) +{ + int err = fdt_sw_probe_(fdt); + if (err) + return err; + + if (!can_assume(VALID_INPUT) && fdt_off_dt_strings(fdt) != 0) + return -FDT_ERR_BADSTATE; + return 0; +} + +#define FDT_SW_PROBE_MEMRSV(fdt) \ + { \ + int err; \ + if ((err = fdt_sw_probe_memrsv_(fdt)) != 0) \ + return err; \ + } + +/* 'struct' state: Enter this state after fdt_finish_reservemap() + * + * Allowed functions: + * fdt_begin_node() + * fdt_end_node() + * fdt_property*() + * fdt_finish() [moves to 'complete' state] + */ +static int fdt_sw_probe_struct_(void *fdt) +{ + int err = fdt_sw_probe_(fdt); + if (err) + return err; + + if (!can_assume(VALID_INPUT) && + fdt_off_dt_strings(fdt) != fdt_totalsize(fdt)) + return -FDT_ERR_BADSTATE; + return 0; +} + +#define FDT_SW_PROBE_STRUCT(fdt) \ + { \ + int err; \ + if ((err = fdt_sw_probe_struct_(fdt)) != 0) \ + return err; \ + } + +static inline uint32_t sw_flags(void *fdt) +{ + /* assert: (fdt_magic(fdt) == FDT_SW_MAGIC) */ + return fdt_last_comp_version(fdt); +} + +/* 'complete' state: Enter this state after fdt_finish() + * + * Allowed functions: none + */ + +static void *fdt_grab_space_(void *fdt, size_t len) +{ + unsigned int offset = fdt_size_dt_struct(fdt); + unsigned int spaceleft; + + spaceleft = fdt_totalsize(fdt) - fdt_off_dt_struct(fdt) + - fdt_size_dt_strings(fdt); + + if ((offset + len < offset) || (offset + len > spaceleft)) + return NULL; + + fdt_set_size_dt_struct(fdt, offset + len); + return fdt_offset_ptr_w_(fdt, offset); +} + +int fdt_create_with_flags(void *buf, int bufsize, uint32_t flags) +{ + const int hdrsize = FDT_ALIGN(sizeof(struct fdt_header), + sizeof(struct fdt_reserve_entry)); + void *fdt = buf; + + if (bufsize < hdrsize) + return -FDT_ERR_NOSPACE; + + if (flags & ~FDT_CREATE_FLAGS_ALL) + return -FDT_ERR_BADFLAGS; + + memset(buf, 0, bufsize); + + /* + * magic and last_comp_version keep intermediate state during the fdt + * creation process, which is replaced with the proper FDT format by + * fdt_finish(). + * + * flags should be accessed with sw_flags(). + */ + fdt_set_magic(fdt, FDT_SW_MAGIC); + fdt_set_version(fdt, FDT_LAST_SUPPORTED_VERSION); + fdt_set_last_comp_version(fdt, flags); + + fdt_set_totalsize(fdt, bufsize); + + fdt_set_off_mem_rsvmap(fdt, hdrsize); + fdt_set_off_dt_struct(fdt, fdt_off_mem_rsvmap(fdt)); + fdt_set_off_dt_strings(fdt, 0); + + return 0; +} + +int fdt_create(void *buf, int bufsize) +{ + return fdt_create_with_flags(buf, bufsize, 0); +} + +int fdt_resize(void *fdt, void *buf, int bufsize) +{ + size_t headsize, tailsize; + char *oldtail, *newtail; + + FDT_SW_PROBE(fdt); + + if (bufsize < 0) + return -FDT_ERR_NOSPACE; + + headsize = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt); + tailsize = fdt_size_dt_strings(fdt); + + if (!can_assume(VALID_DTB) && + headsize + tailsize > fdt_totalsize(fdt)) + return -FDT_ERR_INTERNAL; + + if ((headsize + tailsize) > (unsigned)bufsize) + return -FDT_ERR_NOSPACE; + + oldtail = (char *)fdt + fdt_totalsize(fdt) - tailsize; + newtail = (char *)buf + bufsize - tailsize; + + /* Two cases to avoid clobbering data if the old and new + * buffers partially overlap */ + if (buf <= fdt) { + memmove(buf, fdt, headsize); + memmove(newtail, oldtail, tailsize); + } else { + memmove(newtail, oldtail, tailsize); + memmove(buf, fdt, headsize); + } + + fdt_set_totalsize(buf, bufsize); + if (fdt_off_dt_strings(buf)) + fdt_set_off_dt_strings(buf, bufsize); + + return 0; +} + +int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size) +{ + struct fdt_reserve_entry *re; + int offset; + + FDT_SW_PROBE_MEMRSV(fdt); + + offset = fdt_off_dt_struct(fdt); + if ((offset + sizeof(*re)) > fdt_totalsize(fdt)) + return -FDT_ERR_NOSPACE; + + re = (struct fdt_reserve_entry *)((char *)fdt + offset); + re->address = cpu_to_fdt64(addr); + re->size = cpu_to_fdt64(size); + + fdt_set_off_dt_struct(fdt, offset + sizeof(*re)); + + return 0; +} + +int fdt_finish_reservemap(void *fdt) +{ + int err = fdt_add_reservemap_entry(fdt, 0, 0); + + if (err) + return err; + + fdt_set_off_dt_strings(fdt, fdt_totalsize(fdt)); + return 0; +} + +int fdt_begin_node(void *fdt, const char *name) +{ + struct fdt_node_header *nh; + int namelen; + + FDT_SW_PROBE_STRUCT(fdt); + + namelen = strlen(name) + 1; + nh = fdt_grab_space_(fdt, sizeof(*nh) + FDT_TAGALIGN(namelen)); + if (! nh) + return -FDT_ERR_NOSPACE; + + nh->tag = cpu_to_fdt32(FDT_BEGIN_NODE); + memcpy(nh->name, name, namelen); + return 0; +} + +int fdt_end_node(void *fdt) +{ + fdt32_t *en; + + FDT_SW_PROBE_STRUCT(fdt); + + en = fdt_grab_space_(fdt, FDT_TAGSIZE); + if (! en) + return -FDT_ERR_NOSPACE; + + *en = cpu_to_fdt32(FDT_END_NODE); + return 0; +} + +static int fdt_add_string_(void *fdt, const char *s) +{ + char *strtab = (char *)fdt + fdt_totalsize(fdt); + unsigned int strtabsize = fdt_size_dt_strings(fdt); + unsigned int len = strlen(s) + 1; + unsigned int struct_top, offset; + + offset = strtabsize + len; + struct_top = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt); + if (fdt_totalsize(fdt) - offset < struct_top) + return 0; /* no more room :( */ + + memcpy(strtab - offset, s, len); + fdt_set_size_dt_strings(fdt, strtabsize + len); + return -offset; +} + +/* Must only be used to roll back in case of error */ +static void fdt_del_last_string_(void *fdt, const char *s) +{ + int strtabsize = fdt_size_dt_strings(fdt); + int len = strlen(s) + 1; + + fdt_set_size_dt_strings(fdt, strtabsize - len); +} + +static int fdt_find_add_string_(void *fdt, const char *s, int *allocated) +{ + char *strtab = (char *)fdt + fdt_totalsize(fdt); + int strtabsize = fdt_size_dt_strings(fdt); + const char *p; + + *allocated = 0; + + p = fdt_find_string_(strtab - strtabsize, strtabsize, s); + if (p) + return p - strtab; + + *allocated = 1; + + return fdt_add_string_(fdt, s); +} + +int fdt_property_placeholder(void *fdt, const char *name, int len, void **valp) +{ + struct fdt_property *prop; + int nameoff; + int allocated; + + FDT_SW_PROBE_STRUCT(fdt); + + /* String de-duplication can be slow, _NO_NAME_DEDUP skips it */ + if (sw_flags(fdt) & FDT_CREATE_FLAG_NO_NAME_DEDUP) { + allocated = 1; + nameoff = fdt_add_string_(fdt, name); + } else { + nameoff = fdt_find_add_string_(fdt, name, &allocated); + } + if (nameoff == 0) + return -FDT_ERR_NOSPACE; + + prop = fdt_grab_space_(fdt, sizeof(*prop) + FDT_TAGALIGN(len)); + if (! prop) { + if (allocated) + fdt_del_last_string_(fdt, name); + return -FDT_ERR_NOSPACE; + } + + prop->tag = cpu_to_fdt32(FDT_PROP); + prop->nameoff = cpu_to_fdt32(nameoff); + prop->len = cpu_to_fdt32(len); + *valp = prop->data; + return 0; +} + +int fdt_property(void *fdt, const char *name, const void *val, int len) +{ + void *ptr; + int ret; + + ret = fdt_property_placeholder(fdt, name, len, &ptr); + if (ret) + return ret; + memcpy(ptr, val, len); + return 0; +} + +int fdt_finish(void *fdt) +{ + char *p = (char *)fdt; + fdt32_t *end; + int oldstroffset, newstroffset; + uint32_t tag; + int offset, nextoffset; + + FDT_SW_PROBE_STRUCT(fdt); + + /* Add terminator */ + end = fdt_grab_space_(fdt, sizeof(*end)); + if (! end) + return -FDT_ERR_NOSPACE; + *end = cpu_to_fdt32(FDT_END); + + /* Relocate the string table */ + oldstroffset = fdt_totalsize(fdt) - fdt_size_dt_strings(fdt); + newstroffset = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt); + memmove(p + newstroffset, p + oldstroffset, fdt_size_dt_strings(fdt)); + fdt_set_off_dt_strings(fdt, newstroffset); + + /* Walk the structure, correcting string offsets */ + offset = 0; + while ((tag = fdt_next_tag(fdt, offset, &nextoffset)) != FDT_END) { + if (tag == FDT_PROP) { + struct fdt_property *prop = + fdt_offset_ptr_w_(fdt, offset); + int nameoff; + + nameoff = fdt32_to_cpu(prop->nameoff); + nameoff += fdt_size_dt_strings(fdt); + prop->nameoff = cpu_to_fdt32(nameoff); + } + offset = nextoffset; + } + if (nextoffset < 0) + return nextoffset; + + /* Finally, adjust the header */ + fdt_set_totalsize(fdt, newstroffset + fdt_size_dt_strings(fdt)); + + /* And fix up fields that were keeping intermediate state. */ + fdt_set_last_comp_version(fdt, FDT_FIRST_SUPPORTED_VERSION); + fdt_set_magic(fdt, FDT_MAGIC); + + return 0; +} diff --git a/src/net/scripts/dtc/libfdt/fdt_wip.c b/src/net/scripts/dtc/libfdt/fdt_wip.c new file mode 100644 index 0000000..c2d7566 --- /dev/null +++ b/src/net/scripts/dtc/libfdt/fdt_wip.c @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + */ +#include "libfdt_env.h" + +#include <fdt.h> +#include <libfdt.h> + +#include "libfdt_internal.h" + +int fdt_setprop_inplace_namelen_partial(void *fdt, int nodeoffset, + const char *name, int namelen, + uint32_t idx, const void *val, + int len) +{ + void *propval; + int proplen; + + propval = fdt_getprop_namelen_w(fdt, nodeoffset, name, namelen, + &proplen); + if (!propval) + return proplen; + + if ((unsigned)proplen < (len + idx)) + return -FDT_ERR_NOSPACE; + + memcpy((char *)propval + idx, val, len); + return 0; +} + +int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name, + const void *val, int len) +{ + const void *propval; + int proplen; + + propval = fdt_getprop(fdt, nodeoffset, name, &proplen); + if (!propval) + return proplen; + + if (proplen != len) + return -FDT_ERR_NOSPACE; + + return fdt_setprop_inplace_namelen_partial(fdt, nodeoffset, name, + strlen(name), 0, + val, len); +} + +static void fdt_nop_region_(void *start, int len) +{ + fdt32_t *p; + + for (p = start; (char *)p < ((char *)start + len); p++) + *p = cpu_to_fdt32(FDT_NOP); +} + +int fdt_nop_property(void *fdt, int nodeoffset, const char *name) +{ + struct fdt_property *prop; + int len; + + prop = fdt_get_property_w(fdt, nodeoffset, name, &len); + if (!prop) + return len; + + fdt_nop_region_(prop, len + sizeof(*prop)); + + return 0; +} + +int fdt_node_end_offset_(void *fdt, int offset) +{ + int depth = 0; + + while ((offset >= 0) && (depth >= 0)) + offset = fdt_next_node(fdt, offset, &depth); + + return offset; +} + +int fdt_nop_node(void *fdt, int nodeoffset) +{ + int endoffset; + + endoffset = fdt_node_end_offset_(fdt, nodeoffset); + if (endoffset < 0) + return endoffset; + + fdt_nop_region_(fdt_offset_ptr_w(fdt, nodeoffset, 0), + endoffset - nodeoffset); + return 0; +} diff --git a/src/net/scripts/dtc/libfdt/libfdt.h b/src/net/scripts/dtc/libfdt/libfdt.h new file mode 100644 index 0000000..fe49b5d --- /dev/null +++ b/src/net/scripts/dtc/libfdt/libfdt.h @@ -0,0 +1,2080 @@ +/* SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) */ +#ifndef LIBFDT_H +#define LIBFDT_H +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + */ + +#include "libfdt_env.h" +#include "fdt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define FDT_FIRST_SUPPORTED_VERSION 0x02 +#define FDT_LAST_SUPPORTED_VERSION 0x11 + +/* Error codes: informative error codes */ +#define FDT_ERR_NOTFOUND 1 + /* FDT_ERR_NOTFOUND: The requested node or property does not exist */ +#define FDT_ERR_EXISTS 2 + /* FDT_ERR_EXISTS: Attempted to create a node or property which + * already exists */ +#define FDT_ERR_NOSPACE 3 + /* FDT_ERR_NOSPACE: Operation needed to expand the device + * tree, but its buffer did not have sufficient space to + * contain the expanded tree. Use fdt_open_into() to move the + * device tree to a buffer with more space. */ + +/* Error codes: codes for bad parameters */ +#define FDT_ERR_BADOFFSET 4 + /* FDT_ERR_BADOFFSET: Function was passed a structure block + * offset which is out-of-bounds, or which points to an + * unsuitable part of the structure for the operation. */ +#define FDT_ERR_BADPATH 5 + /* FDT_ERR_BADPATH: Function was passed a badly formatted path + * (e.g. missing a leading / for a function which requires an + * absolute path) */ +#define FDT_ERR_BADPHANDLE 6 + /* FDT_ERR_BADPHANDLE: Function was passed an invalid phandle. + * This can be caused either by an invalid phandle property + * length, or the phandle value was either 0 or -1, which are + * not permitted. */ +#define FDT_ERR_BADSTATE 7 + /* FDT_ERR_BADSTATE: Function was passed an incomplete device + * tree created by the sequential-write functions, which is + * not sufficiently complete for the requested operation. */ + +/* Error codes: codes for bad device tree blobs */ +#define FDT_ERR_TRUNCATED 8 + /* FDT_ERR_TRUNCATED: FDT or a sub-block is improperly + * terminated (overflows, goes outside allowed bounds, or + * isn't properly terminated). */ +#define FDT_ERR_BADMAGIC 9 + /* FDT_ERR_BADMAGIC: Given "device tree" appears not to be a + * device tree at all - it is missing the flattened device + * tree magic number. */ +#define FDT_ERR_BADVERSION 10 + /* FDT_ERR_BADVERSION: Given device tree has a version which + * can't be handled by the requested operation. For + * read-write functions, this may mean that fdt_open_into() is + * required to convert the tree to the expected version. */ +#define FDT_ERR_BADSTRUCTURE 11 + /* FDT_ERR_BADSTRUCTURE: Given device tree has a corrupt + * structure block or other serious error (e.g. misnested + * nodes, or subnodes preceding properties). */ +#define FDT_ERR_BADLAYOUT 12 + /* FDT_ERR_BADLAYOUT: For read-write functions, the given + * device tree has it's sub-blocks in an order that the + * function can't handle (memory reserve map, then structure, + * then strings). Use fdt_open_into() to reorganize the tree + * into a form suitable for the read-write operations. */ + +/* "Can't happen" error indicating a bug in libfdt */ +#define FDT_ERR_INTERNAL 13 + /* FDT_ERR_INTERNAL: libfdt has failed an internal assertion. + * Should never be returned, if it is, it indicates a bug in + * libfdt itself. */ + +/* Errors in device tree content */ +#define FDT_ERR_BADNCELLS 14 + /* FDT_ERR_BADNCELLS: Device tree has a #address-cells, #size-cells + * or similar property with a bad format or value */ + +#define FDT_ERR_BADVALUE 15 + /* FDT_ERR_BADVALUE: Device tree has a property with an unexpected + * value. For example: a property expected to contain a string list + * is not NUL-terminated within the length of its value. */ + +#define FDT_ERR_BADOVERLAY 16 + /* FDT_ERR_BADOVERLAY: The device tree overlay, while + * correctly structured, cannot be applied due to some + * unexpected or missing value, property or node. */ + +#define FDT_ERR_NOPHANDLES 17 + /* FDT_ERR_NOPHANDLES: The device tree doesn't have any + * phandle available anymore without causing an overflow */ + +#define FDT_ERR_BADFLAGS 18 + /* FDT_ERR_BADFLAGS: The function was passed a flags field that + * contains invalid flags or an invalid combination of flags. */ + +#define FDT_ERR_MAX 18 + +/* constants */ +#define FDT_MAX_PHANDLE 0xfffffffe + /* Valid values for phandles range from 1 to 2^32-2. */ + +/**********************************************************************/ +/* Low-level functions (you probably don't need these) */ +/**********************************************************************/ + +#ifndef SWIG /* This function is not useful in Python */ +const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int checklen); +#endif +static inline void *fdt_offset_ptr_w(void *fdt, int offset, int checklen) +{ + return (void *)(uintptr_t)fdt_offset_ptr(fdt, offset, checklen); +} + +uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset); + +/* + * Alignment helpers: + * These helpers access words from a device tree blob. They're + * built to work even with unaligned pointers on platforms (ike + * ARM) that don't like unaligned loads and stores + */ + +static inline uint32_t fdt32_ld(const fdt32_t *p) +{ + const uint8_t *bp = (const uint8_t *)p; + + return ((uint32_t)bp[0] << 24) + | ((uint32_t)bp[1] << 16) + | ((uint32_t)bp[2] << 8) + | bp[3]; +} + +static inline void fdt32_st(void *property, uint32_t value) +{ + uint8_t *bp = (uint8_t *)property; + + bp[0] = value >> 24; + bp[1] = (value >> 16) & 0xff; + bp[2] = (value >> 8) & 0xff; + bp[3] = value & 0xff; +} + +static inline uint64_t fdt64_ld(const fdt64_t *p) +{ + const uint8_t *bp = (const uint8_t *)p; + + return ((uint64_t)bp[0] << 56) + | ((uint64_t)bp[1] << 48) + | ((uint64_t)bp[2] << 40) + | ((uint64_t)bp[3] << 32) + | ((uint64_t)bp[4] << 24) + | ((uint64_t)bp[5] << 16) + | ((uint64_t)bp[6] << 8) + | bp[7]; +} + +static inline void fdt64_st(void *property, uint64_t value) +{ + uint8_t *bp = (uint8_t *)property; + + bp[0] = value >> 56; + bp[1] = (value >> 48) & 0xff; + bp[2] = (value >> 40) & 0xff; + bp[3] = (value >> 32) & 0xff; + bp[4] = (value >> 24) & 0xff; + bp[5] = (value >> 16) & 0xff; + bp[6] = (value >> 8) & 0xff; + bp[7] = value & 0xff; +} + +/**********************************************************************/ +/* Traversal functions */ +/**********************************************************************/ + +int fdt_next_node(const void *fdt, int offset, int *depth); + +/** + * fdt_first_subnode() - get offset of first direct subnode + * + * @fdt: FDT blob + * @offset: Offset of node to check + * @return offset of first subnode, or -FDT_ERR_NOTFOUND if there is none + */ +int fdt_first_subnode(const void *fdt, int offset); + +/** + * fdt_next_subnode() - get offset of next direct subnode + * + * After first calling fdt_first_subnode(), call this function repeatedly to + * get direct subnodes of a parent node. + * + * @fdt: FDT blob + * @offset: Offset of previous subnode + * @return offset of next subnode, or -FDT_ERR_NOTFOUND if there are no more + * subnodes + */ +int fdt_next_subnode(const void *fdt, int offset); + +/** + * fdt_for_each_subnode - iterate over all subnodes of a parent + * + * @node: child node (int, lvalue) + * @fdt: FDT blob (const void *) + * @parent: parent node (int) + * + * This is actually a wrapper around a for loop and would be used like so: + * + * fdt_for_each_subnode(node, fdt, parent) { + * Use node + * ... + * } + * + * if ((node < 0) && (node != -FDT_ERR_NOTFOUND)) { + * Error handling + * } + * + * Note that this is implemented as a macro and @node is used as + * iterator in the loop. The parent variable be constant or even a + * literal. + * + */ +#define fdt_for_each_subnode(node, fdt, parent) \ + for (node = fdt_first_subnode(fdt, parent); \ + node >= 0; \ + node = fdt_next_subnode(fdt, node)) + +/**********************************************************************/ +/* General functions */ +/**********************************************************************/ +#define fdt_get_header(fdt, field) \ + (fdt32_ld(&((const struct fdt_header *)(fdt))->field)) +#define fdt_magic(fdt) (fdt_get_header(fdt, magic)) +#define fdt_totalsize(fdt) (fdt_get_header(fdt, totalsize)) +#define fdt_off_dt_struct(fdt) (fdt_get_header(fdt, off_dt_struct)) +#define fdt_off_dt_strings(fdt) (fdt_get_header(fdt, off_dt_strings)) +#define fdt_off_mem_rsvmap(fdt) (fdt_get_header(fdt, off_mem_rsvmap)) +#define fdt_version(fdt) (fdt_get_header(fdt, version)) +#define fdt_last_comp_version(fdt) (fdt_get_header(fdt, last_comp_version)) +#define fdt_boot_cpuid_phys(fdt) (fdt_get_header(fdt, boot_cpuid_phys)) +#define fdt_size_dt_strings(fdt) (fdt_get_header(fdt, size_dt_strings)) +#define fdt_size_dt_struct(fdt) (fdt_get_header(fdt, size_dt_struct)) + +#define fdt_set_hdr_(name) \ + static inline void fdt_set_##name(void *fdt, uint32_t val) \ + { \ + struct fdt_header *fdth = (struct fdt_header *)fdt; \ + fdth->name = cpu_to_fdt32(val); \ + } +fdt_set_hdr_(magic); +fdt_set_hdr_(totalsize); +fdt_set_hdr_(off_dt_struct); +fdt_set_hdr_(off_dt_strings); +fdt_set_hdr_(off_mem_rsvmap); +fdt_set_hdr_(version); +fdt_set_hdr_(last_comp_version); +fdt_set_hdr_(boot_cpuid_phys); +fdt_set_hdr_(size_dt_strings); +fdt_set_hdr_(size_dt_struct); +#undef fdt_set_hdr_ + +/** + * fdt_header_size - return the size of the tree's header + * @fdt: pointer to a flattened device tree + */ +size_t fdt_header_size(const void *fdt); + +/** + * fdt_header_size_ - internal function which takes a version number + */ +size_t fdt_header_size_(uint32_t version); + +/** + * fdt_check_header - sanity check a device tree header + + * @fdt: pointer to data which might be a flattened device tree + * + * fdt_check_header() checks that the given buffer contains what + * appears to be a flattened device tree, and that the header contains + * valid information (to the extent that can be determined from the + * header alone). + * + * returns: + * 0, if the buffer appears to contain a valid device tree + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_TRUNCATED, standard meanings, as above + */ +int fdt_check_header(const void *fdt); + +/** + * fdt_move - move a device tree around in memory + * @fdt: pointer to the device tree to move + * @buf: pointer to memory where the device is to be moved + * @bufsize: size of the memory space at buf + * + * fdt_move() relocates, if possible, the device tree blob located at + * fdt to the buffer at buf of size bufsize. The buffer may overlap + * with the existing device tree blob at fdt. Therefore, + * fdt_move(fdt, fdt, fdt_totalsize(fdt)) + * should always succeed. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, bufsize is insufficient to contain the device tree + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, standard meanings + */ +int fdt_move(const void *fdt, void *buf, int bufsize); + +/**********************************************************************/ +/* Read-only functions */ +/**********************************************************************/ + +int fdt_check_full(const void *fdt, size_t bufsize); + +/** + * fdt_get_string - retrieve a string from the strings block of a device tree + * @fdt: pointer to the device tree blob + * @stroffset: offset of the string within the strings block (native endian) + * @lenp: optional pointer to return the string's length + * + * fdt_get_string() retrieves a pointer to a single string from the + * strings block of the device tree blob at fdt, and optionally also + * returns the string's length in *lenp. + * + * returns: + * a pointer to the string, on success + * NULL, if stroffset is out of bounds, or doesn't point to a valid string + */ +const char *fdt_get_string(const void *fdt, int stroffset, int *lenp); + +/** + * fdt_string - retrieve a string from the strings block of a device tree + * @fdt: pointer to the device tree blob + * @stroffset: offset of the string within the strings block (native endian) + * + * fdt_string() retrieves a pointer to a single string from the + * strings block of the device tree blob at fdt. + * + * returns: + * a pointer to the string, on success + * NULL, if stroffset is out of bounds, or doesn't point to a valid string + */ +const char *fdt_string(const void *fdt, int stroffset); + +/** + * fdt_find_max_phandle - find and return the highest phandle in a tree + * @fdt: pointer to the device tree blob + * @phandle: return location for the highest phandle value found in the tree + * + * fdt_find_max_phandle() finds the highest phandle value in the given device + * tree. The value returned in @phandle is only valid if the function returns + * success. + * + * returns: + * 0 on success or a negative error code on failure + */ +int fdt_find_max_phandle(const void *fdt, uint32_t *phandle); + +/** + * fdt_get_max_phandle - retrieves the highest phandle in a tree + * @fdt: pointer to the device tree blob + * + * fdt_get_max_phandle retrieves the highest phandle in the given + * device tree. This will ignore badly formatted phandles, or phandles + * with a value of 0 or -1. + * + * This function is deprecated in favour of fdt_find_max_phandle(). + * + * returns: + * the highest phandle on success + * 0, if no phandle was found in the device tree + * -1, if an error occurred + */ +static inline uint32_t fdt_get_max_phandle(const void *fdt) +{ + uint32_t phandle; + int err; + + err = fdt_find_max_phandle(fdt, &phandle); + if (err < 0) + return (uint32_t)-1; + + return phandle; +} + +/** + * fdt_generate_phandle - return a new, unused phandle for a device tree blob + * @fdt: pointer to the device tree blob + * @phandle: return location for the new phandle + * + * Walks the device tree blob and looks for the highest phandle value. On + * success, the new, unused phandle value (one higher than the previously + * highest phandle value in the device tree blob) will be returned in the + * @phandle parameter. + * + * Returns: + * 0 on success or a negative error-code on failure + */ +int fdt_generate_phandle(const void *fdt, uint32_t *phandle); + +/** + * fdt_num_mem_rsv - retrieve the number of memory reserve map entries + * @fdt: pointer to the device tree blob + * + * Returns the number of entries in the device tree blob's memory + * reservation map. This does not include the terminating 0,0 entry + * or any other (0,0) entries reserved for expansion. + * + * returns: + * the number of entries + */ +int fdt_num_mem_rsv(const void *fdt); + +/** + * fdt_get_mem_rsv - retrieve one memory reserve map entry + * @fdt: pointer to the device tree blob + * @address, @size: pointers to 64-bit variables + * + * On success, *address and *size will contain the address and size of + * the n-th reserve map entry from the device tree blob, in + * native-endian format. + * + * returns: + * 0, on success + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, standard meanings + */ +int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size); + +/** + * fdt_subnode_offset_namelen - find a subnode based on substring + * @fdt: pointer to the device tree blob + * @parentoffset: structure block offset of a node + * @name: name of the subnode to locate + * @namelen: number of characters of name to consider + * + * Identical to fdt_subnode_offset(), but only examine the first + * namelen characters of name for matching the subnode name. This is + * useful for finding subnodes based on a portion of a larger string, + * such as a full path. + */ +#ifndef SWIG /* Not available in Python */ +int fdt_subnode_offset_namelen(const void *fdt, int parentoffset, + const char *name, int namelen); +#endif +/** + * fdt_subnode_offset - find a subnode of a given node + * @fdt: pointer to the device tree blob + * @parentoffset: structure block offset of a node + * @name: name of the subnode to locate + * + * fdt_subnode_offset() finds a subnode of the node at structure block + * offset parentoffset with the given name. name may include a unit + * address, in which case fdt_subnode_offset() will find the subnode + * with that unit address, or the unit address may be omitted, in + * which case fdt_subnode_offset() will find an arbitrary subnode + * whose name excluding unit address matches the given name. + * + * returns: + * structure block offset of the requested subnode (>=0), on success + * -FDT_ERR_NOTFOUND, if the requested subnode does not exist + * -FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE + * tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings. + */ +int fdt_subnode_offset(const void *fdt, int parentoffset, const char *name); + +/** + * fdt_path_offset_namelen - find a tree node by its full path + * @fdt: pointer to the device tree blob + * @path: full path of the node to locate + * @namelen: number of characters of path to consider + * + * Identical to fdt_path_offset(), but only consider the first namelen + * characters of path as the path name. + */ +#ifndef SWIG /* Not available in Python */ +int fdt_path_offset_namelen(const void *fdt, const char *path, int namelen); +#endif + +/** + * fdt_path_offset - find a tree node by its full path + * @fdt: pointer to the device tree blob + * @path: full path of the node to locate + * + * fdt_path_offset() finds a node of a given path in the device tree. + * Each path component may omit the unit address portion, but the + * results of this are undefined if any such path component is + * ambiguous (that is if there are multiple nodes at the relevant + * level matching the given component, differentiated only by unit + * address). + * + * returns: + * structure block offset of the node with the requested path (>=0), on + * success + * -FDT_ERR_BADPATH, given path does not begin with '/' or is invalid + * -FDT_ERR_NOTFOUND, if the requested node does not exist + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings. + */ +int fdt_path_offset(const void *fdt, const char *path); + +/** + * fdt_get_name - retrieve the name of a given node + * @fdt: pointer to the device tree blob + * @nodeoffset: structure block offset of the starting node + * @lenp: pointer to an integer variable (will be overwritten) or NULL + * + * fdt_get_name() retrieves the name (including unit address) of the + * device tree node at structure block offset nodeoffset. If lenp is + * non-NULL, the length of this name is also returned, in the integer + * pointed to by lenp. + * + * returns: + * pointer to the node's name, on success + * If lenp is non-NULL, *lenp contains the length of that name + * (>=0) + * NULL, on error + * if lenp is non-NULL *lenp contains an error code (<0): + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE + * tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, standard meanings + */ +const char *fdt_get_name(const void *fdt, int nodeoffset, int *lenp); + +/** + * fdt_first_property_offset - find the offset of a node's first property + * @fdt: pointer to the device tree blob + * @nodeoffset: structure block offset of a node + * + * fdt_first_property_offset() finds the first property of the node at + * the given structure block offset. + * + * returns: + * structure block offset of the property (>=0), on success + * -FDT_ERR_NOTFOUND, if the requested node has no properties + * -FDT_ERR_BADOFFSET, if nodeoffset did not point to an FDT_BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings. + */ +int fdt_first_property_offset(const void *fdt, int nodeoffset); + +/** + * fdt_next_property_offset - step through a node's properties + * @fdt: pointer to the device tree blob + * @offset: structure block offset of a property + * + * fdt_next_property_offset() finds the property immediately after the + * one at the given structure block offset. This will be a property + * of the same node as the given property. + * + * returns: + * structure block offset of the next property (>=0), on success + * -FDT_ERR_NOTFOUND, if the given property is the last in its node + * -FDT_ERR_BADOFFSET, if nodeoffset did not point to an FDT_PROP tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings. + */ +int fdt_next_property_offset(const void *fdt, int offset); + +/** + * fdt_for_each_property_offset - iterate over all properties of a node + * + * @property_offset: property offset (int, lvalue) + * @fdt: FDT blob (const void *) + * @node: node offset (int) + * + * This is actually a wrapper around a for loop and would be used like so: + * + * fdt_for_each_property_offset(property, fdt, node) { + * Use property + * ... + * } + * + * if ((property < 0) && (property != -FDT_ERR_NOTFOUND)) { + * Error handling + * } + * + * Note that this is implemented as a macro and property is used as + * iterator in the loop. The node variable can be constant or even a + * literal. + */ +#define fdt_for_each_property_offset(property, fdt, node) \ + for (property = fdt_first_property_offset(fdt, node); \ + property >= 0; \ + property = fdt_next_property_offset(fdt, property)) + +/** + * fdt_get_property_by_offset - retrieve the property at a given offset + * @fdt: pointer to the device tree blob + * @offset: offset of the property to retrieve + * @lenp: pointer to an integer variable (will be overwritten) or NULL + * + * fdt_get_property_by_offset() retrieves a pointer to the + * fdt_property structure within the device tree blob at the given + * offset. If lenp is non-NULL, the length of the property value is + * also returned, in the integer pointed to by lenp. + * + * Note that this code only works on device tree versions >= 16. fdt_getprop() + * works on all versions. + * + * returns: + * pointer to the structure representing the property + * if lenp is non-NULL, *lenp contains the length of the property + * value (>=0) + * NULL, on error + * if lenp is non-NULL, *lenp contains an error code (<0): + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_PROP tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +const struct fdt_property *fdt_get_property_by_offset(const void *fdt, + int offset, + int *lenp); + +/** + * fdt_get_property_namelen - find a property based on substring + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to find + * @name: name of the property to find + * @namelen: number of characters of name to consider + * @lenp: pointer to an integer variable (will be overwritten) or NULL + * + * Identical to fdt_get_property(), but only examine the first namelen + * characters of name for matching the property name. + */ +#ifndef SWIG /* Not available in Python */ +const struct fdt_property *fdt_get_property_namelen(const void *fdt, + int nodeoffset, + const char *name, + int namelen, int *lenp); +#endif + +/** + * fdt_get_property - find a given property in a given node + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to find + * @name: name of the property to find + * @lenp: pointer to an integer variable (will be overwritten) or NULL + * + * fdt_get_property() retrieves a pointer to the fdt_property + * structure within the device tree blob corresponding to the property + * named 'name' of the node at offset nodeoffset. If lenp is + * non-NULL, the length of the property value is also returned, in the + * integer pointed to by lenp. + * + * returns: + * pointer to the structure representing the property + * if lenp is non-NULL, *lenp contains the length of the property + * value (>=0) + * NULL, on error + * if lenp is non-NULL, *lenp contains an error code (<0): + * -FDT_ERR_NOTFOUND, node does not have named property + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE + * tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +const struct fdt_property *fdt_get_property(const void *fdt, int nodeoffset, + const char *name, int *lenp); +static inline struct fdt_property *fdt_get_property_w(void *fdt, int nodeoffset, + const char *name, + int *lenp) +{ + return (struct fdt_property *)(uintptr_t) + fdt_get_property(fdt, nodeoffset, name, lenp); +} + +/** + * fdt_getprop_by_offset - retrieve the value of a property at a given offset + * @fdt: pointer to the device tree blob + * @offset: offset of the property to read + * @namep: pointer to a string variable (will be overwritten) or NULL + * @lenp: pointer to an integer variable (will be overwritten) or NULL + * + * fdt_getprop_by_offset() retrieves a pointer to the value of the + * property at structure block offset 'offset' (this will be a pointer + * to within the device blob itself, not a copy of the value). If + * lenp is non-NULL, the length of the property value is also + * returned, in the integer pointed to by lenp. If namep is non-NULL, + * the property's namne will also be returned in the char * pointed to + * by namep (this will be a pointer to within the device tree's string + * block, not a new copy of the name). + * + * returns: + * pointer to the property's value + * if lenp is non-NULL, *lenp contains the length of the property + * value (>=0) + * if namep is non-NULL *namep contiains a pointer to the property + * name. + * NULL, on error + * if lenp is non-NULL, *lenp contains an error code (<0): + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_PROP tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +#ifndef SWIG /* This function is not useful in Python */ +const void *fdt_getprop_by_offset(const void *fdt, int offset, + const char **namep, int *lenp); +#endif + +/** + * fdt_getprop_namelen - get property value based on substring + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to find + * @name: name of the property to find + * @namelen: number of characters of name to consider + * @lenp: pointer to an integer variable (will be overwritten) or NULL + * + * Identical to fdt_getprop(), but only examine the first namelen + * characters of name for matching the property name. + */ +#ifndef SWIG /* Not available in Python */ +const void *fdt_getprop_namelen(const void *fdt, int nodeoffset, + const char *name, int namelen, int *lenp); +static inline void *fdt_getprop_namelen_w(void *fdt, int nodeoffset, + const char *name, int namelen, + int *lenp) +{ + return (void *)(uintptr_t)fdt_getprop_namelen(fdt, nodeoffset, name, + namelen, lenp); +} +#endif + +/** + * fdt_getprop - retrieve the value of a given property + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to find + * @name: name of the property to find + * @lenp: pointer to an integer variable (will be overwritten) or NULL + * + * fdt_getprop() retrieves a pointer to the value of the property + * named 'name' of the node at offset nodeoffset (this will be a + * pointer to within the device blob itself, not a copy of the value). + * If lenp is non-NULL, the length of the property value is also + * returned, in the integer pointed to by lenp. + * + * returns: + * pointer to the property's value + * if lenp is non-NULL, *lenp contains the length of the property + * value (>=0) + * NULL, on error + * if lenp is non-NULL, *lenp contains an error code (<0): + * -FDT_ERR_NOTFOUND, node does not have named property + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE + * tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +const void *fdt_getprop(const void *fdt, int nodeoffset, + const char *name, int *lenp); +static inline void *fdt_getprop_w(void *fdt, int nodeoffset, + const char *name, int *lenp) +{ + return (void *)(uintptr_t)fdt_getprop(fdt, nodeoffset, name, lenp); +} + +/** + * fdt_get_phandle - retrieve the phandle of a given node + * @fdt: pointer to the device tree blob + * @nodeoffset: structure block offset of the node + * + * fdt_get_phandle() retrieves the phandle of the device tree node at + * structure block offset nodeoffset. + * + * returns: + * the phandle of the node at nodeoffset, on success (!= 0, != -1) + * 0, if the node has no phandle, or another error occurs + */ +uint32_t fdt_get_phandle(const void *fdt, int nodeoffset); + +/** + * fdt_get_alias_namelen - get alias based on substring + * @fdt: pointer to the device tree blob + * @name: name of the alias th look up + * @namelen: number of characters of name to consider + * + * Identical to fdt_get_alias(), but only examine the first namelen + * characters of name for matching the alias name. + */ +#ifndef SWIG /* Not available in Python */ +const char *fdt_get_alias_namelen(const void *fdt, + const char *name, int namelen); +#endif + +/** + * fdt_get_alias - retrieve the path referenced by a given alias + * @fdt: pointer to the device tree blob + * @name: name of the alias th look up + * + * fdt_get_alias() retrieves the value of a given alias. That is, the + * value of the property named 'name' in the node /aliases. + * + * returns: + * a pointer to the expansion of the alias named 'name', if it exists + * NULL, if the given alias or the /aliases node does not exist + */ +const char *fdt_get_alias(const void *fdt, const char *name); + +/** + * fdt_get_path - determine the full path of a node + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose path to find + * @buf: character buffer to contain the returned path (will be overwritten) + * @buflen: size of the character buffer at buf + * + * fdt_get_path() computes the full path of the node at offset + * nodeoffset, and records that path in the buffer at buf. + * + * NOTE: This function is expensive, as it must scan the device tree + * structure from the start to nodeoffset. + * + * returns: + * 0, on success + * buf contains the absolute path of the node at + * nodeoffset, as a NUL-terminated string. + * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag + * -FDT_ERR_NOSPACE, the path of the given node is longer than (bufsize-1) + * characters and will not fit in the given buffer. + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, standard meanings + */ +int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen); + +/** + * fdt_supernode_atdepth_offset - find a specific ancestor of a node + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose parent to find + * @supernodedepth: depth of the ancestor to find + * @nodedepth: pointer to an integer variable (will be overwritten) or NULL + * + * fdt_supernode_atdepth_offset() finds an ancestor of the given node + * at a specific depth from the root (where the root itself has depth + * 0, its immediate subnodes depth 1 and so forth). So + * fdt_supernode_atdepth_offset(fdt, nodeoffset, 0, NULL); + * will always return 0, the offset of the root node. If the node at + * nodeoffset has depth D, then: + * fdt_supernode_atdepth_offset(fdt, nodeoffset, D, NULL); + * will return nodeoffset itself. + * + * NOTE: This function is expensive, as it must scan the device tree + * structure from the start to nodeoffset. + * + * returns: + * structure block offset of the node at node offset's ancestor + * of depth supernodedepth (>=0), on success + * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag + * -FDT_ERR_NOTFOUND, supernodedepth was greater than the depth of + * nodeoffset + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, standard meanings + */ +int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset, + int supernodedepth, int *nodedepth); + +/** + * fdt_node_depth - find the depth of a given node + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose parent to find + * + * fdt_node_depth() finds the depth of a given node. The root node + * has depth 0, its immediate subnodes depth 1 and so forth. + * + * NOTE: This function is expensive, as it must scan the device tree + * structure from the start to nodeoffset. + * + * returns: + * depth of the node at nodeoffset (>=0), on success + * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, standard meanings + */ +int fdt_node_depth(const void *fdt, int nodeoffset); + +/** + * fdt_parent_offset - find the parent of a given node + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose parent to find + * + * fdt_parent_offset() locates the parent node of a given node (that + * is, it finds the offset of the node which contains the node at + * nodeoffset as a subnode). + * + * NOTE: This function is expensive, as it must scan the device tree + * structure from the start to nodeoffset, *twice*. + * + * returns: + * structure block offset of the parent of the node at nodeoffset + * (>=0), on success + * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, standard meanings + */ +int fdt_parent_offset(const void *fdt, int nodeoffset); + +/** + * fdt_node_offset_by_prop_value - find nodes with a given property value + * @fdt: pointer to the device tree blob + * @startoffset: only find nodes after this offset + * @propname: property name to check + * @propval: property value to search for + * @proplen: length of the value in propval + * + * fdt_node_offset_by_prop_value() returns the offset of the first + * node after startoffset, which has a property named propname whose + * value is of length proplen and has value equal to propval; or if + * startoffset is -1, the very first such node in the tree. + * + * To iterate through all nodes matching the criterion, the following + * idiom can be used: + * offset = fdt_node_offset_by_prop_value(fdt, -1, propname, + * propval, proplen); + * while (offset != -FDT_ERR_NOTFOUND) { + * // other code here + * offset = fdt_node_offset_by_prop_value(fdt, offset, propname, + * propval, proplen); + * } + * + * Note the -1 in the first call to the function, if 0 is used here + * instead, the function will never locate the root node, even if it + * matches the criterion. + * + * returns: + * structure block offset of the located node (>= 0, >startoffset), + * on success + * -FDT_ERR_NOTFOUND, no node matching the criterion exists in the + * tree after startoffset + * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, standard meanings + */ +int fdt_node_offset_by_prop_value(const void *fdt, int startoffset, + const char *propname, + const void *propval, int proplen); + +/** + * fdt_node_offset_by_phandle - find the node with a given phandle + * @fdt: pointer to the device tree blob + * @phandle: phandle value + * + * fdt_node_offset_by_phandle() returns the offset of the node + * which has the given phandle value. If there is more than one node + * in the tree with the given phandle (an invalid tree), results are + * undefined. + * + * returns: + * structure block offset of the located node (>= 0), on success + * -FDT_ERR_NOTFOUND, no node with that phandle exists + * -FDT_ERR_BADPHANDLE, given phandle value was invalid (0 or -1) + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, standard meanings + */ +int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle); + +/** + * fdt_node_check_compatible: check a node's compatible property + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of a tree node + * @compatible: string to match against + * + * + * fdt_node_check_compatible() returns 0 if the given node contains a + * 'compatible' property with the given string as one of its elements, + * it returns non-zero otherwise, or on error. + * + * returns: + * 0, if the node has a 'compatible' property listing the given string + * 1, if the node has a 'compatible' property, but it does not list + * the given string + * -FDT_ERR_NOTFOUND, if the given node has no 'compatible' property + * -FDT_ERR_BADOFFSET, if nodeoffset does not refer to a BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, standard meanings + */ +int fdt_node_check_compatible(const void *fdt, int nodeoffset, + const char *compatible); + +/** + * fdt_node_offset_by_compatible - find nodes with a given 'compatible' value + * @fdt: pointer to the device tree blob + * @startoffset: only find nodes after this offset + * @compatible: 'compatible' string to match against + * + * fdt_node_offset_by_compatible() returns the offset of the first + * node after startoffset, which has a 'compatible' property which + * lists the given compatible string; or if startoffset is -1, the + * very first such node in the tree. + * + * To iterate through all nodes matching the criterion, the following + * idiom can be used: + * offset = fdt_node_offset_by_compatible(fdt, -1, compatible); + * while (offset != -FDT_ERR_NOTFOUND) { + * // other code here + * offset = fdt_node_offset_by_compatible(fdt, offset, compatible); + * } + * + * Note the -1 in the first call to the function, if 0 is used here + * instead, the function will never locate the root node, even if it + * matches the criterion. + * + * returns: + * structure block offset of the located node (>= 0, >startoffset), + * on success + * -FDT_ERR_NOTFOUND, no node matching the criterion exists in the + * tree after startoffset + * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, standard meanings + */ +int fdt_node_offset_by_compatible(const void *fdt, int startoffset, + const char *compatible); + +/** + * fdt_stringlist_contains - check a string list property for a string + * @strlist: Property containing a list of strings to check + * @listlen: Length of property + * @str: String to search for + * + * This is a utility function provided for convenience. The list contains + * one or more strings, each terminated by \0, as is found in a device tree + * "compatible" property. + * + * @return: 1 if the string is found in the list, 0 not found, or invalid list + */ +int fdt_stringlist_contains(const char *strlist, int listlen, const char *str); + +/** + * fdt_stringlist_count - count the number of strings in a string list + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of a tree node + * @property: name of the property containing the string list + * @return: + * the number of strings in the given property + * -FDT_ERR_BADVALUE if the property value is not NUL-terminated + * -FDT_ERR_NOTFOUND if the property does not exist + */ +int fdt_stringlist_count(const void *fdt, int nodeoffset, const char *property); + +/** + * fdt_stringlist_search - find a string in a string list and return its index + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of a tree node + * @property: name of the property containing the string list + * @string: string to look up in the string list + * + * Note that it is possible for this function to succeed on property values + * that are not NUL-terminated. That's because the function will stop after + * finding the first occurrence of @string. This can for example happen with + * small-valued cell properties, such as #address-cells, when searching for + * the empty string. + * + * @return: + * the index of the string in the list of strings + * -FDT_ERR_BADVALUE if the property value is not NUL-terminated + * -FDT_ERR_NOTFOUND if the property does not exist or does not contain + * the given string + */ +int fdt_stringlist_search(const void *fdt, int nodeoffset, const char *property, + const char *string); + +/** + * fdt_stringlist_get() - obtain the string at a given index in a string list + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of a tree node + * @property: name of the property containing the string list + * @index: index of the string to return + * @lenp: return location for the string length or an error code on failure + * + * Note that this will successfully extract strings from properties with + * non-NUL-terminated values. For example on small-valued cell properties + * this function will return the empty string. + * + * If non-NULL, the length of the string (on success) or a negative error-code + * (on failure) will be stored in the integer pointer to by lenp. + * + * @return: + * A pointer to the string at the given index in the string list or NULL on + * failure. On success the length of the string will be stored in the memory + * location pointed to by the lenp parameter, if non-NULL. On failure one of + * the following negative error codes will be returned in the lenp parameter + * (if non-NULL): + * -FDT_ERR_BADVALUE if the property value is not NUL-terminated + * -FDT_ERR_NOTFOUND if the property does not exist + */ +const char *fdt_stringlist_get(const void *fdt, int nodeoffset, + const char *property, int index, + int *lenp); + +/**********************************************************************/ +/* Read-only functions (addressing related) */ +/**********************************************************************/ + +/** + * FDT_MAX_NCELLS - maximum value for #address-cells and #size-cells + * + * This is the maximum value for #address-cells, #size-cells and + * similar properties that will be processed by libfdt. IEE1275 + * requires that OF implementations handle values up to 4. + * Implementations may support larger values, but in practice higher + * values aren't used. + */ +#define FDT_MAX_NCELLS 4 + +/** + * fdt_address_cells - retrieve address size for a bus represented in the tree + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node to find the address size for + * + * When the node has a valid #address-cells property, returns its value. + * + * returns: + * 0 <= n < FDT_MAX_NCELLS, on success + * 2, if the node has no #address-cells property + * -FDT_ERR_BADNCELLS, if the node has a badly formatted or invalid + * #address-cells property + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_address_cells(const void *fdt, int nodeoffset); + +/** + * fdt_size_cells - retrieve address range size for a bus represented in the + * tree + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node to find the address range size for + * + * When the node has a valid #size-cells property, returns its value. + * + * returns: + * 0 <= n < FDT_MAX_NCELLS, on success + * 1, if the node has no #size-cells property + * -FDT_ERR_BADNCELLS, if the node has a badly formatted or invalid + * #size-cells property + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_size_cells(const void *fdt, int nodeoffset); + + +/**********************************************************************/ +/* Write-in-place functions */ +/**********************************************************************/ + +/** + * fdt_setprop_inplace_namelen_partial - change a property's value, + * but not its size + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * @namelen: number of characters of name to consider + * @idx: index of the property to change in the array + * @val: pointer to data to replace the property value with + * @len: length of the property value + * + * Identical to fdt_setprop_inplace(), but modifies the given property + * starting from the given index, and using only the first characters + * of the name. It is useful when you want to manipulate only one value of + * an array and you have a string that doesn't end with \0. + */ +#ifndef SWIG /* Not available in Python */ +int fdt_setprop_inplace_namelen_partial(void *fdt, int nodeoffset, + const char *name, int namelen, + uint32_t idx, const void *val, + int len); +#endif + +/** + * fdt_setprop_inplace - change a property's value, but not its size + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * @val: pointer to data to replace the property value with + * @len: length of the property value + * + * fdt_setprop_inplace() replaces the value of a given property with + * the data in val, of length len. This function cannot change the + * size of a property, and so will only work if len is equal to the + * current length of the property. + * + * This function will alter only the bytes in the blob which contain + * the given property value, and will not alter or move any other part + * of the tree. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, if len is not equal to the property's current length + * -FDT_ERR_NOTFOUND, node does not have the named property + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +#ifndef SWIG /* Not available in Python */ +int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name, + const void *val, int len); +#endif + +/** + * fdt_setprop_inplace_u32 - change the value of a 32-bit integer property + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * @val: 32-bit integer value to replace the property with + * + * fdt_setprop_inplace_u32() replaces the value of a given property + * with the 32-bit integer value in val, converting val to big-endian + * if necessary. This function cannot change the size of a property, + * and so will only work if the property already exists and has length + * 4. + * + * This function will alter only the bytes in the blob which contain + * the given property value, and will not alter or move any other part + * of the tree. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, if the property's length is not equal to 4 + * -FDT_ERR_NOTFOUND, node does not have the named property + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +static inline int fdt_setprop_inplace_u32(void *fdt, int nodeoffset, + const char *name, uint32_t val) +{ + fdt32_t tmp = cpu_to_fdt32(val); + return fdt_setprop_inplace(fdt, nodeoffset, name, &tmp, sizeof(tmp)); +} + +/** + * fdt_setprop_inplace_u64 - change the value of a 64-bit integer property + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * @val: 64-bit integer value to replace the property with + * + * fdt_setprop_inplace_u64() replaces the value of a given property + * with the 64-bit integer value in val, converting val to big-endian + * if necessary. This function cannot change the size of a property, + * and so will only work if the property already exists and has length + * 8. + * + * This function will alter only the bytes in the blob which contain + * the given property value, and will not alter or move any other part + * of the tree. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, if the property's length is not equal to 8 + * -FDT_ERR_NOTFOUND, node does not have the named property + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +static inline int fdt_setprop_inplace_u64(void *fdt, int nodeoffset, + const char *name, uint64_t val) +{ + fdt64_t tmp = cpu_to_fdt64(val); + return fdt_setprop_inplace(fdt, nodeoffset, name, &tmp, sizeof(tmp)); +} + +/** + * fdt_setprop_inplace_cell - change the value of a single-cell property + * + * This is an alternative name for fdt_setprop_inplace_u32() + */ +static inline int fdt_setprop_inplace_cell(void *fdt, int nodeoffset, + const char *name, uint32_t val) +{ + return fdt_setprop_inplace_u32(fdt, nodeoffset, name, val); +} + +/** + * fdt_nop_property - replace a property with nop tags + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to nop + * @name: name of the property to nop + * + * fdt_nop_property() will replace a given property's representation + * in the blob with FDT_NOP tags, effectively removing it from the + * tree. + * + * This function will alter only the bytes in the blob which contain + * the property, and will not alter or move any other part of the + * tree. + * + * returns: + * 0, on success + * -FDT_ERR_NOTFOUND, node does not have the named property + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_nop_property(void *fdt, int nodeoffset, const char *name); + +/** + * fdt_nop_node - replace a node (subtree) with nop tags + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node to nop + * + * fdt_nop_node() will replace a given node's representation in the + * blob, including all its subnodes, if any, with FDT_NOP tags, + * effectively removing it from the tree. + * + * This function will alter only the bytes in the blob which contain + * the node and its properties and subnodes, and will not alter or + * move any other part of the tree. + * + * returns: + * 0, on success + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_nop_node(void *fdt, int nodeoffset); + +/**********************************************************************/ +/* Sequential write functions */ +/**********************************************************************/ + +/* fdt_create_with_flags flags */ +#define FDT_CREATE_FLAG_NO_NAME_DEDUP 0x1 + /* FDT_CREATE_FLAG_NO_NAME_DEDUP: Do not try to de-duplicate property + * names in the fdt. This can result in faster creation times, but + * a larger fdt. */ + +#define FDT_CREATE_FLAGS_ALL (FDT_CREATE_FLAG_NO_NAME_DEDUP) + +/** + * fdt_create_with_flags - begin creation of a new fdt + * @fdt: pointer to memory allocated where fdt will be created + * @bufsize: size of the memory space at fdt + * @flags: a valid combination of FDT_CREATE_FLAG_ flags, or 0. + * + * fdt_create_with_flags() begins the process of creating a new fdt with + * the sequential write interface. + * + * fdt creation process must end with fdt_finished() to produce a valid fdt. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, bufsize is insufficient for a minimal fdt + * -FDT_ERR_BADFLAGS, flags is not valid + */ +int fdt_create_with_flags(void *buf, int bufsize, uint32_t flags); + +/** + * fdt_create - begin creation of a new fdt + * @fdt: pointer to memory allocated where fdt will be created + * @bufsize: size of the memory space at fdt + * + * fdt_create() is equivalent to fdt_create_with_flags() with flags=0. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, bufsize is insufficient for a minimal fdt + */ +int fdt_create(void *buf, int bufsize); + +int fdt_resize(void *fdt, void *buf, int bufsize); +int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size); +int fdt_finish_reservemap(void *fdt); +int fdt_begin_node(void *fdt, const char *name); +int fdt_property(void *fdt, const char *name, const void *val, int len); +static inline int fdt_property_u32(void *fdt, const char *name, uint32_t val) +{ + fdt32_t tmp = cpu_to_fdt32(val); + return fdt_property(fdt, name, &tmp, sizeof(tmp)); +} +static inline int fdt_property_u64(void *fdt, const char *name, uint64_t val) +{ + fdt64_t tmp = cpu_to_fdt64(val); + return fdt_property(fdt, name, &tmp, sizeof(tmp)); +} + +#ifndef SWIG /* Not available in Python */ +static inline int fdt_property_cell(void *fdt, const char *name, uint32_t val) +{ + return fdt_property_u32(fdt, name, val); +} +#endif + +/** + * fdt_property_placeholder - add a new property and return a ptr to its value + * + * @fdt: pointer to the device tree blob + * @name: name of property to add + * @len: length of property value in bytes + * @valp: returns a pointer to where where the value should be placed + * + * returns: + * 0, on success + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_NOSPACE, standard meanings + */ +int fdt_property_placeholder(void *fdt, const char *name, int len, void **valp); + +#define fdt_property_string(fdt, name, str) \ + fdt_property(fdt, name, str, strlen(str)+1) +int fdt_end_node(void *fdt); +int fdt_finish(void *fdt); + +/**********************************************************************/ +/* Read-write functions */ +/**********************************************************************/ + +int fdt_create_empty_tree(void *buf, int bufsize); +int fdt_open_into(const void *fdt, void *buf, int bufsize); +int fdt_pack(void *fdt); + +/** + * fdt_add_mem_rsv - add one memory reserve map entry + * @fdt: pointer to the device tree blob + * @address, @size: 64-bit values (native endian) + * + * Adds a reserve map entry to the given blob reserving a region at + * address address of length size. + * + * This function will insert data into the reserve map and will + * therefore change the indexes of some entries in the table. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to + * contain the new reservation entry + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size); + +/** + * fdt_del_mem_rsv - remove a memory reserve map entry + * @fdt: pointer to the device tree blob + * @n: entry to remove + * + * fdt_del_mem_rsv() removes the n-th memory reserve map entry from + * the blob. + * + * This function will delete data from the reservation table and will + * therefore change the indexes of some entries in the table. + * + * returns: + * 0, on success + * -FDT_ERR_NOTFOUND, there is no entry of the given index (i.e. there + * are less than n+1 reserve map entries) + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_del_mem_rsv(void *fdt, int n); + +/** + * fdt_set_name - change the name of a given node + * @fdt: pointer to the device tree blob + * @nodeoffset: structure block offset of a node + * @name: name to give the node + * + * fdt_set_name() replaces the name (including unit address, if any) + * of the given node with the given string. NOTE: this function can't + * efficiently check if the new name is unique amongst the given + * node's siblings; results are undefined if this function is invoked + * with a name equal to one of the given node's siblings. + * + * This function may insert or delete data from the blob, and will + * therefore change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob + * to contain the new name + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, standard meanings + */ +int fdt_set_name(void *fdt, int nodeoffset, const char *name); + +/** + * fdt_setprop - create or change a property + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * @val: pointer to data to set the property value to + * @len: length of the property value + * + * fdt_setprop() sets the value of the named property in the given + * node to the given value and length, creating the property if it + * does not already exist. + * + * This function may insert or delete data from the blob, and will + * therefore change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to + * contain the new property value + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_setprop(void *fdt, int nodeoffset, const char *name, + const void *val, int len); + +/** + * fdt_setprop_placeholder - allocate space for a property + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * @len: length of the property value + * @prop_data: return pointer to property data + * + * fdt_setprop_placeholer() allocates the named property in the given node. + * If the property exists it is resized. In either case a pointer to the + * property data is returned. + * + * This function may insert or delete data from the blob, and will + * therefore change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to + * contain the new property value + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name, + int len, void **prop_data); + +/** + * fdt_setprop_u32 - set a property to a 32-bit integer + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * @val: 32-bit integer value for the property (native endian) + * + * fdt_setprop_u32() sets the value of the named property in the given + * node to the given 32-bit integer value (converting to big-endian if + * necessary), or creates a new property with that value if it does + * not already exist. + * + * This function may insert or delete data from the blob, and will + * therefore change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to + * contain the new property value + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_TRUNCATED, standard meanings + */ +static inline int fdt_setprop_u32(void *fdt, int nodeoffset, const char *name, + uint32_t val) +{ + fdt32_t tmp = cpu_to_fdt32(val); + return fdt_setprop(fdt, nodeoffset, name, &tmp, sizeof(tmp)); +} + +/** + * fdt_setprop_u64 - set a property to a 64-bit integer + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * @val: 64-bit integer value for the property (native endian) + * + * fdt_setprop_u64() sets the value of the named property in the given + * node to the given 64-bit integer value (converting to big-endian if + * necessary), or creates a new property with that value if it does + * not already exist. + * + * This function may insert or delete data from the blob, and will + * therefore change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to + * contain the new property value + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_TRUNCATED, standard meanings + */ +static inline int fdt_setprop_u64(void *fdt, int nodeoffset, const char *name, + uint64_t val) +{ + fdt64_t tmp = cpu_to_fdt64(val); + return fdt_setprop(fdt, nodeoffset, name, &tmp, sizeof(tmp)); +} + +/** + * fdt_setprop_cell - set a property to a single cell value + * + * This is an alternative name for fdt_setprop_u32() + */ +static inline int fdt_setprop_cell(void *fdt, int nodeoffset, const char *name, + uint32_t val) +{ + return fdt_setprop_u32(fdt, nodeoffset, name, val); +} + +/** + * fdt_setprop_string - set a property to a string value + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * @str: string value for the property + * + * fdt_setprop_string() sets the value of the named property in the + * given node to the given string value (using the length of the + * string to determine the new length of the property), or creates a + * new property with that value if it does not already exist. + * + * This function may insert or delete data from the blob, and will + * therefore change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to + * contain the new property value + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_TRUNCATED, standard meanings + */ +#define fdt_setprop_string(fdt, nodeoffset, name, str) \ + fdt_setprop((fdt), (nodeoffset), (name), (str), strlen(str)+1) + + +/** + * fdt_setprop_empty - set a property to an empty value + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * + * fdt_setprop_empty() sets the value of the named property in the + * given node to an empty (zero length) value, or creates a new empty + * property if it does not already exist. + * + * This function may insert or delete data from the blob, and will + * therefore change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to + * contain the new property value + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_TRUNCATED, standard meanings + */ +#define fdt_setprop_empty(fdt, nodeoffset, name) \ + fdt_setprop((fdt), (nodeoffset), (name), NULL, 0) + +/** + * fdt_appendprop - append to or create a property + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to append to + * @val: pointer to data to append to the property value + * @len: length of the data to append to the property value + * + * fdt_appendprop() appends the value to the named property in the + * given node, creating the property if it does not already exist. + * + * This function may insert data into the blob, and will therefore + * change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to + * contain the new property value + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_appendprop(void *fdt, int nodeoffset, const char *name, + const void *val, int len); + +/** + * fdt_appendprop_u32 - append a 32-bit integer value to a property + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * @val: 32-bit integer value to append to the property (native endian) + * + * fdt_appendprop_u32() appends the given 32-bit integer value + * (converting to big-endian if necessary) to the value of the named + * property in the given node, or creates a new property with that + * value if it does not already exist. + * + * This function may insert data into the blob, and will therefore + * change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to + * contain the new property value + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_TRUNCATED, standard meanings + */ +static inline int fdt_appendprop_u32(void *fdt, int nodeoffset, + const char *name, uint32_t val) +{ + fdt32_t tmp = cpu_to_fdt32(val); + return fdt_appendprop(fdt, nodeoffset, name, &tmp, sizeof(tmp)); +} + +/** + * fdt_appendprop_u64 - append a 64-bit integer value to a property + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * @val: 64-bit integer value to append to the property (native endian) + * + * fdt_appendprop_u64() appends the given 64-bit integer value + * (converting to big-endian if necessary) to the value of the named + * property in the given node, or creates a new property with that + * value if it does not already exist. + * + * This function may insert data into the blob, and will therefore + * change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to + * contain the new property value + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_TRUNCATED, standard meanings + */ +static inline int fdt_appendprop_u64(void *fdt, int nodeoffset, + const char *name, uint64_t val) +{ + fdt64_t tmp = cpu_to_fdt64(val); + return fdt_appendprop(fdt, nodeoffset, name, &tmp, sizeof(tmp)); +} + +/** + * fdt_appendprop_cell - append a single cell value to a property + * + * This is an alternative name for fdt_appendprop_u32() + */ +static inline int fdt_appendprop_cell(void *fdt, int nodeoffset, + const char *name, uint32_t val) +{ + return fdt_appendprop_u32(fdt, nodeoffset, name, val); +} + +/** + * fdt_appendprop_string - append a string to a property + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * @str: string value to append to the property + * + * fdt_appendprop_string() appends the given string to the value of + * the named property in the given node, or creates a new property + * with that value if it does not already exist. + * + * This function may insert data into the blob, and will therefore + * change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to + * contain the new property value + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_TRUNCATED, standard meanings + */ +#define fdt_appendprop_string(fdt, nodeoffset, name, str) \ + fdt_appendprop((fdt), (nodeoffset), (name), (str), strlen(str)+1) + +/** + * fdt_appendprop_addrrange - append a address range property + * @fdt: pointer to the device tree blob + * @parent: offset of the parent node + * @nodeoffset: offset of the node to add a property at + * @name: name of property + * @addr: start address of a given range + * @size: size of a given range + * + * fdt_appendprop_addrrange() appends an address range value (start + * address and size) to the value of the named property in the given + * node, or creates a new property with that value if it does not + * already exist. + * If "name" is not specified, a default "reg" is used. + * Cell sizes are determined by parent's #address-cells and #size-cells. + * + * This function may insert data into the blob, and will therefore + * change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADNCELLS, if the node has a badly formatted or invalid + * #address-cells property + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADVALUE, addr or size doesn't fit to respective cells size + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to + * contain a new property + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_appendprop_addrrange(void *fdt, int parent, int nodeoffset, + const char *name, uint64_t addr, uint64_t size); + +/** + * fdt_delprop - delete a property + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to nop + * @name: name of the property to nop + * + * fdt_del_property() will delete the given property. + * + * This function will delete data from the blob, and will therefore + * change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_NOTFOUND, node does not have the named property + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_delprop(void *fdt, int nodeoffset, const char *name); + +/** + * fdt_add_subnode_namelen - creates a new node based on substring + * @fdt: pointer to the device tree blob + * @parentoffset: structure block offset of a node + * @name: name of the subnode to locate + * @namelen: number of characters of name to consider + * + * Identical to fdt_add_subnode(), but use only the first namelen + * characters of name as the name of the new node. This is useful for + * creating subnodes based on a portion of a larger string, such as a + * full path. + */ +#ifndef SWIG /* Not available in Python */ +int fdt_add_subnode_namelen(void *fdt, int parentoffset, + const char *name, int namelen); +#endif + +/** + * fdt_add_subnode - creates a new node + * @fdt: pointer to the device tree blob + * @parentoffset: structure block offset of a node + * @name: name of the subnode to locate + * + * fdt_add_subnode() creates a new node as a subnode of the node at + * structure block offset parentoffset, with the given name (which + * should include the unit address, if any). + * + * This function will insert data into the blob, and will therefore + * change the offsets of some existing nodes. + + * returns: + * structure block offset of the created nodeequested subnode (>=0), on + * success + * -FDT_ERR_NOTFOUND, if the requested subnode does not exist + * -FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE + * tag + * -FDT_ERR_EXISTS, if the node at parentoffset already has a subnode of + * the given name + * -FDT_ERR_NOSPACE, if there is insufficient free space in the + * blob to contain the new node + * -FDT_ERR_NOSPACE + * -FDT_ERR_BADLAYOUT + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings. + */ +int fdt_add_subnode(void *fdt, int parentoffset, const char *name); + +/** + * fdt_del_node - delete a node (subtree) + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node to nop + * + * fdt_del_node() will remove the given node, including all its + * subnodes if any, from the blob. + * + * This function will delete data from the blob, and will therefore + * change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_del_node(void *fdt, int nodeoffset); + +/** + * fdt_overlay_apply - Applies a DT overlay on a base DT + * @fdt: pointer to the base device tree blob + * @fdto: pointer to the device tree overlay blob + * + * fdt_overlay_apply() will apply the given device tree overlay on the + * given base device tree. + * + * Expect the base device tree to be modified, even if the function + * returns an error. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there's not enough space in the base device tree + * -FDT_ERR_NOTFOUND, the overlay points to some inexistant nodes or + * properties in the base DT + * -FDT_ERR_BADPHANDLE, + * -FDT_ERR_BADOVERLAY, + * -FDT_ERR_NOPHANDLES, + * -FDT_ERR_INTERNAL, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADOFFSET, + * -FDT_ERR_BADPATH, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_overlay_apply(void *fdt, void *fdto); + +/**********************************************************************/ +/* Debugging / informational functions */ +/**********************************************************************/ + +const char *fdt_strerror(int errval); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBFDT_H */ diff --git a/src/net/scripts/dtc/libfdt/libfdt_env.h b/src/net/scripts/dtc/libfdt/libfdt_env.h new file mode 100644 index 0000000..73b6d40 --- /dev/null +++ b/src/net/scripts/dtc/libfdt/libfdt_env.h @@ -0,0 +1,96 @@ +/* SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) */ +#ifndef LIBFDT_ENV_H +#define LIBFDT_ENV_H +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + * Copyright 2012 Kim Phillips, Freescale Semiconductor. + */ + +#include <stdbool.h> +#include <stddef.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include <limits.h> + +#ifdef __CHECKER__ +#define FDT_FORCE __attribute__((force)) +#define FDT_BITWISE __attribute__((bitwise)) +#else +#define FDT_FORCE +#define FDT_BITWISE +#endif + +typedef uint16_t FDT_BITWISE fdt16_t; +typedef uint32_t FDT_BITWISE fdt32_t; +typedef uint64_t FDT_BITWISE fdt64_t; + +#define EXTRACT_BYTE(x, n) ((unsigned long long)((uint8_t *)&x)[n]) +#define CPU_TO_FDT16(x) ((EXTRACT_BYTE(x, 0) << 8) | EXTRACT_BYTE(x, 1)) +#define CPU_TO_FDT32(x) ((EXTRACT_BYTE(x, 0) << 24) | (EXTRACT_BYTE(x, 1) << 16) | \ + (EXTRACT_BYTE(x, 2) << 8) | EXTRACT_BYTE(x, 3)) +#define CPU_TO_FDT64(x) ((EXTRACT_BYTE(x, 0) << 56) | (EXTRACT_BYTE(x, 1) << 48) | \ + (EXTRACT_BYTE(x, 2) << 40) | (EXTRACT_BYTE(x, 3) << 32) | \ + (EXTRACT_BYTE(x, 4) << 24) | (EXTRACT_BYTE(x, 5) << 16) | \ + (EXTRACT_BYTE(x, 6) << 8) | EXTRACT_BYTE(x, 7)) + +static inline uint16_t fdt16_to_cpu(fdt16_t x) +{ + return (FDT_FORCE uint16_t)CPU_TO_FDT16(x); +} +static inline fdt16_t cpu_to_fdt16(uint16_t x) +{ + return (FDT_FORCE fdt16_t)CPU_TO_FDT16(x); +} + +static inline uint32_t fdt32_to_cpu(fdt32_t x) +{ + return (FDT_FORCE uint32_t)CPU_TO_FDT32(x); +} +static inline fdt32_t cpu_to_fdt32(uint32_t x) +{ + return (FDT_FORCE fdt32_t)CPU_TO_FDT32(x); +} + +static inline uint64_t fdt64_to_cpu(fdt64_t x) +{ + return (FDT_FORCE uint64_t)CPU_TO_FDT64(x); +} +static inline fdt64_t cpu_to_fdt64(uint64_t x) +{ + return (FDT_FORCE fdt64_t)CPU_TO_FDT64(x); +} +#undef CPU_TO_FDT64 +#undef CPU_TO_FDT32 +#undef CPU_TO_FDT16 +#undef EXTRACT_BYTE + +#ifdef __APPLE__ +#include <AvailabilityMacros.h> + +/* strnlen() is not available on Mac OS < 10.7 */ +# if !defined(MAC_OS_X_VERSION_10_7) || (MAC_OS_X_VERSION_MAX_ALLOWED < \ + MAC_OS_X_VERSION_10_7) + +#define strnlen fdt_strnlen + +/* + * fdt_strnlen: returns the length of a string or max_count - which ever is + * smallest. + * Input 1 string: the string whose size is to be determined + * Input 2 max_count: the maximum value returned by this function + * Output: length of the string or max_count (the smallest of the two) + */ +static inline size_t fdt_strnlen(const char *string, size_t max_count) +{ + const char *p = memchr(string, 0, max_count); + return p ? p - string : max_count; +} + +#endif /* !defined(MAC_OS_X_VERSION_10_7) || (MAC_OS_X_VERSION_MAX_ALLOWED < + MAC_OS_X_VERSION_10_7) */ + +#endif /* __APPLE__ */ + +#endif /* LIBFDT_ENV_H */ diff --git a/src/net/scripts/dtc/libfdt/libfdt_internal.h b/src/net/scripts/dtc/libfdt/libfdt_internal.h new file mode 100644 index 0000000..d4e0bd4 --- /dev/null +++ b/src/net/scripts/dtc/libfdt/libfdt_internal.h @@ -0,0 +1,173 @@ +/* SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) */ +#ifndef LIBFDT_INTERNAL_H +#define LIBFDT_INTERNAL_H +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + */ +#include <fdt.h> + +#define FDT_ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) +#define FDT_TAGALIGN(x) (FDT_ALIGN((x), FDT_TAGSIZE)) + +int32_t fdt_ro_probe_(const void *fdt); +#define FDT_RO_PROBE(fdt) \ + { \ + int32_t totalsize_; \ + if ((totalsize_ = fdt_ro_probe_(fdt)) < 0) \ + return totalsize_; \ + } + +int fdt_check_node_offset_(const void *fdt, int offset); +int fdt_check_prop_offset_(const void *fdt, int offset); +const char *fdt_find_string_(const char *strtab, int tabsize, const char *s); +int fdt_node_end_offset_(void *fdt, int nodeoffset); + +static inline const void *fdt_offset_ptr_(const void *fdt, int offset) +{ + return (const char *)fdt + fdt_off_dt_struct(fdt) + offset; +} + +static inline void *fdt_offset_ptr_w_(void *fdt, int offset) +{ + return (void *)(uintptr_t)fdt_offset_ptr_(fdt, offset); +} + +static inline const struct fdt_reserve_entry *fdt_mem_rsv_(const void *fdt, int n) +{ + const struct fdt_reserve_entry *rsv_table = + (const struct fdt_reserve_entry *) + ((const char *)fdt + fdt_off_mem_rsvmap(fdt)); + + return rsv_table + n; +} +static inline struct fdt_reserve_entry *fdt_mem_rsv_w_(void *fdt, int n) +{ + return (void *)(uintptr_t)fdt_mem_rsv_(fdt, n); +} + +#define FDT_SW_MAGIC (~FDT_MAGIC) + +/**********************************************************************/ +/* Checking controls */ +/**********************************************************************/ + +#ifndef FDT_ASSUME_MASK +#define FDT_ASSUME_MASK 0 +#endif + +/* + * Defines assumptions which can be enabled. Each of these can be enabled + * individually. For maximum safety, don't enable any assumptions! + * + * For minimal code size and no safety, use ASSUME_PERFECT at your own risk. + * You should have another method of validating the device tree, such as a + * signature or hash check before using libfdt. + * + * For situations where security is not a concern it may be safe to enable + * ASSUME_SANE. + */ +enum { + /* + * This does essentially no checks. Only the latest device-tree + * version is correctly handled. Inconsistencies or errors in the device + * tree may cause undefined behaviour or crashes. Invalid parameters + * passed to libfdt may do the same. + * + * If an error occurs when modifying the tree it may leave the tree in + * an intermediate (but valid) state. As an example, adding a property + * where there is insufficient space may result in the property name + * being added to the string table even though the property itself is + * not added to the struct section. + * + * Only use this if you have a fully validated device tree with + * the latest supported version and wish to minimise code size. + */ + ASSUME_PERFECT = 0xff, + + /* + * This assumes that the device tree is sane. i.e. header metadata + * and basic hierarchy are correct. + * + * With this assumption enabled, normal device trees produced by libfdt + * and the compiler should be handled safely. Malicious device trees and + * complete garbage may cause libfdt to behave badly or crash. Truncated + * device trees (e.g. those only partially loaded) can also cause + * problems. + * + * Note: Only checks that relate exclusively to the device tree itself + * (not the parameters passed to libfdt) are disabled by this + * assumption. This includes checking headers, tags and the like. + */ + ASSUME_VALID_DTB = 1 << 0, + + /* + * This builds on ASSUME_VALID_DTB and further assumes that libfdt + * functions are called with valid parameters, i.e. not trigger + * FDT_ERR_BADOFFSET or offsets that are out of bounds. It disables any + * extensive checking of parameters and the device tree, making various + * assumptions about correctness. + * + * It doesn't make sense to enable this assumption unless + * ASSUME_VALID_DTB is also enabled. + */ + ASSUME_VALID_INPUT = 1 << 1, + + /* + * This disables checks for device-tree version and removes all code + * which handles older versions. + * + * Only enable this if you know you have a device tree with the latest + * version. + */ + ASSUME_LATEST = 1 << 2, + + /* + * This assumes that it is OK for a failed addition to the device tree, + * due to lack of space or some other problem, to skip any rollback + * steps (such as dropping the property name from the string table). + * This is safe to enable in most circumstances, even though it may + * leave the tree in a sub-optimal state. + */ + ASSUME_NO_ROLLBACK = 1 << 3, + + /* + * This assumes that the device tree components appear in a 'convenient' + * order, i.e. the memory reservation block first, then the structure + * block and finally the string block. + * + * This order is not specified by the device-tree specification, + * but is expected by libfdt. The device-tree compiler always created + * device trees with this order. + * + * This assumption disables a check in fdt_open_into() and removes the + * ability to fix the problem there. This is safe if you know that the + * device tree is correctly ordered. See fdt_blocks_misordered_(). + */ + ASSUME_LIBFDT_ORDER = 1 << 4, + + /* + * This assumes that libfdt itself does not have any internal bugs. It + * drops certain checks that should never be needed unless libfdt has an + * undiscovered bug. + * + * This can generally be considered safe to enable. + */ + ASSUME_LIBFDT_FLAWLESS = 1 << 5, +}; + +/** + * can_assume_() - check if a particular assumption is enabled + * + * @mask: Mask to check (ASSUME_...) + * @return true if that assumption is enabled, else false + */ +static inline bool can_assume_(int mask) +{ + return FDT_ASSUME_MASK & mask; +} + +/** helper macros for checking assumptions */ +#define can_assume(_assume) can_assume_(ASSUME_ ## _assume) + +#endif /* LIBFDT_INTERNAL_H */ diff --git a/src/net/scripts/dtc/livetree.c b/src/net/scripts/dtc/livetree.c new file mode 100644 index 0000000..032df58 --- /dev/null +++ b/src/net/scripts/dtc/livetree.c @@ -0,0 +1,1032 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005. + */ + +#include "dtc.h" +#include "srcpos.h" + +/* + * Tree building functions + */ + +void add_label(struct label **labels, char *label) +{ + struct label *new; + + /* Make sure the label isn't already there */ + for_each_label_withdel(*labels, new) + if (streq(new->label, label)) { + new->deleted = 0; + return; + } + + new = xmalloc(sizeof(*new)); + memset(new, 0, sizeof(*new)); + new->label = label; + new->next = *labels; + *labels = new; +} + +void delete_labels(struct label **labels) +{ + struct label *label; + + for_each_label(*labels, label) + label->deleted = 1; +} + +struct property *build_property(char *name, struct data val, + struct srcpos *srcpos) +{ + struct property *new = xmalloc(sizeof(*new)); + + memset(new, 0, sizeof(*new)); + + new->name = name; + new->val = val; + new->srcpos = srcpos_copy(srcpos); + + return new; +} + +struct property *build_property_delete(char *name) +{ + struct property *new = xmalloc(sizeof(*new)); + + memset(new, 0, sizeof(*new)); + + new->name = name; + new->deleted = 1; + + return new; +} + +struct property *chain_property(struct property *first, struct property *list) +{ + assert(first->next == NULL); + + first->next = list; + return first; +} + +struct property *reverse_properties(struct property *first) +{ + struct property *p = first; + struct property *head = NULL; + struct property *next; + + while (p) { + next = p->next; + p->next = head; + head = p; + p = next; + } + return head; +} + +struct node *build_node(struct property *proplist, struct node *children, + struct srcpos *srcpos) +{ + struct node *new = xmalloc(sizeof(*new)); + struct node *child; + + memset(new, 0, sizeof(*new)); + + new->proplist = reverse_properties(proplist); + new->children = children; + new->srcpos = srcpos_copy(srcpos); + + for_each_child(new, child) { + child->parent = new; + } + + return new; +} + +struct node *build_node_delete(struct srcpos *srcpos) +{ + struct node *new = xmalloc(sizeof(*new)); + + memset(new, 0, sizeof(*new)); + + new->deleted = 1; + new->srcpos = srcpos_copy(srcpos); + + return new; +} + +struct node *name_node(struct node *node, char *name) +{ + assert(node->name == NULL); + + node->name = name; + + return node; +} + +struct node *omit_node_if_unused(struct node *node) +{ + node->omit_if_unused = 1; + + return node; +} + +struct node *reference_node(struct node *node) +{ + node->is_referenced = 1; + + return node; +} + +struct node *merge_nodes(struct node *old_node, struct node *new_node) +{ + struct property *new_prop, *old_prop; + struct node *new_child, *old_child; + struct label *l; + + old_node->deleted = 0; + + /* Add new node labels to old node */ + for_each_label_withdel(new_node->labels, l) + add_label(&old_node->labels, l->label); + + /* Move properties from the new node to the old node. If there + * is a collision, replace the old value with the new */ + while (new_node->proplist) { + /* Pop the property off the list */ + new_prop = new_node->proplist; + new_node->proplist = new_prop->next; + new_prop->next = NULL; + + if (new_prop->deleted) { + delete_property_by_name(old_node, new_prop->name); + free(new_prop); + continue; + } + + /* Look for a collision, set new value if there is */ + for_each_property_withdel(old_node, old_prop) { + if (streq(old_prop->name, new_prop->name)) { + /* Add new labels to old property */ + for_each_label_withdel(new_prop->labels, l) + add_label(&old_prop->labels, l->label); + + old_prop->val = new_prop->val; + old_prop->deleted = 0; + free(old_prop->srcpos); + old_prop->srcpos = new_prop->srcpos; + free(new_prop); + new_prop = NULL; + break; + } + } + + /* if no collision occurred, add property to the old node. */ + if (new_prop) + add_property(old_node, new_prop); + } + + /* Move the override child nodes into the primary node. If + * there is a collision, then merge the nodes. */ + while (new_node->children) { + /* Pop the child node off the list */ + new_child = new_node->children; + new_node->children = new_child->next_sibling; + new_child->parent = NULL; + new_child->next_sibling = NULL; + + if (new_child->deleted) { + delete_node_by_name(old_node, new_child->name); + free(new_child); + continue; + } + + /* Search for a collision. Merge if there is */ + for_each_child_withdel(old_node, old_child) { + if (streq(old_child->name, new_child->name)) { + merge_nodes(old_child, new_child); + new_child = NULL; + break; + } + } + + /* if no collision occurred, add child to the old node. */ + if (new_child) + add_child(old_node, new_child); + } + + old_node->srcpos = srcpos_extend(old_node->srcpos, new_node->srcpos); + + /* The new node contents are now merged into the old node. Free + * the new node. */ + free(new_node); + + return old_node; +} + +struct node * add_orphan_node(struct node *dt, struct node *new_node, char *ref) +{ + static unsigned int next_orphan_fragment = 0; + struct node *node; + struct property *p; + struct data d = empty_data; + char *name; + + if (ref[0] == '/') { + d = data_add_marker(d, TYPE_STRING, ref); + d = data_append_data(d, ref, strlen(ref) + 1); + + p = build_property("target-path", d, NULL); + } else { + d = data_add_marker(d, REF_PHANDLE, ref); + d = data_append_integer(d, 0xffffffff, 32); + + p = build_property("target", d, NULL); + } + + xasprintf(&name, "fragment@%u", + next_orphan_fragment++); + name_node(new_node, "__overlay__"); + node = build_node(p, new_node, NULL); + name_node(node, name); + + add_child(dt, node); + return dt; +} + +struct node *chain_node(struct node *first, struct node *list) +{ + assert(first->next_sibling == NULL); + + first->next_sibling = list; + return first; +} + +void add_property(struct node *node, struct property *prop) +{ + struct property **p; + + prop->next = NULL; + + p = &node->proplist; + while (*p) + p = &((*p)->next); + + *p = prop; +} + +void delete_property_by_name(struct node *node, char *name) +{ + struct property *prop = node->proplist; + + while (prop) { + if (streq(prop->name, name)) { + delete_property(prop); + return; + } + prop = prop->next; + } +} + +void delete_property(struct property *prop) +{ + prop->deleted = 1; + delete_labels(&prop->labels); +} + +void add_child(struct node *parent, struct node *child) +{ + struct node **p; + + child->next_sibling = NULL; + child->parent = parent; + + p = &parent->children; + while (*p) + p = &((*p)->next_sibling); + + *p = child; +} + +void delete_node_by_name(struct node *parent, char *name) +{ + struct node *node = parent->children; + + while (node) { + if (streq(node->name, name)) { + delete_node(node); + return; + } + node = node->next_sibling; + } +} + +void delete_node(struct node *node) +{ + struct property *prop; + struct node *child; + + node->deleted = 1; + for_each_child(node, child) + delete_node(child); + for_each_property(node, prop) + delete_property(prop); + delete_labels(&node->labels); +} + +void append_to_property(struct node *node, + char *name, const void *data, int len, + enum markertype type) +{ + struct data d; + struct property *p; + + p = get_property(node, name); + if (p) { + d = data_add_marker(p->val, type, name); + d = data_append_data(d, data, len); + p->val = d; + } else { + d = data_add_marker(empty_data, type, name); + d = data_append_data(d, data, len); + p = build_property(name, d, NULL); + add_property(node, p); + } +} + +struct reserve_info *build_reserve_entry(uint64_t address, uint64_t size) +{ + struct reserve_info *new = xmalloc(sizeof(*new)); + + memset(new, 0, sizeof(*new)); + + new->address = address; + new->size = size; + + return new; +} + +struct reserve_info *chain_reserve_entry(struct reserve_info *first, + struct reserve_info *list) +{ + assert(first->next == NULL); + + first->next = list; + return first; +} + +struct reserve_info *add_reserve_entry(struct reserve_info *list, + struct reserve_info *new) +{ + struct reserve_info *last; + + new->next = NULL; + + if (! list) + return new; + + for (last = list; last->next; last = last->next) + ; + + last->next = new; + + return list; +} + +struct dt_info *build_dt_info(unsigned int dtsflags, + struct reserve_info *reservelist, + struct node *tree, uint32_t boot_cpuid_phys) +{ + struct dt_info *dti; + + dti = xmalloc(sizeof(*dti)); + dti->dtsflags = dtsflags; + dti->reservelist = reservelist; + dti->dt = tree; + dti->boot_cpuid_phys = boot_cpuid_phys; + + return dti; +} + +/* + * Tree accessor functions + */ + +const char *get_unitname(struct node *node) +{ + if (node->name[node->basenamelen] == '\0') + return ""; + else + return node->name + node->basenamelen + 1; +} + +struct property *get_property(struct node *node, const char *propname) +{ + struct property *prop; + + for_each_property(node, prop) + if (streq(prop->name, propname)) + return prop; + + return NULL; +} + +cell_t propval_cell(struct property *prop) +{ + assert(prop->val.len == sizeof(cell_t)); + return fdt32_to_cpu(*((fdt32_t *)prop->val.val)); +} + +cell_t propval_cell_n(struct property *prop, int n) +{ + assert(prop->val.len / sizeof(cell_t) >= n); + return fdt32_to_cpu(*((fdt32_t *)prop->val.val + n)); +} + +struct property *get_property_by_label(struct node *tree, const char *label, + struct node **node) +{ + struct property *prop; + struct node *c; + + *node = tree; + + for_each_property(tree, prop) { + struct label *l; + + for_each_label(prop->labels, l) + if (streq(l->label, label)) + return prop; + } + + for_each_child(tree, c) { + prop = get_property_by_label(c, label, node); + if (prop) + return prop; + } + + *node = NULL; + return NULL; +} + +struct marker *get_marker_label(struct node *tree, const char *label, + struct node **node, struct property **prop) +{ + struct marker *m; + struct property *p; + struct node *c; + + *node = tree; + + for_each_property(tree, p) { + *prop = p; + m = p->val.markers; + for_each_marker_of_type(m, LABEL) + if (streq(m->ref, label)) + return m; + } + + for_each_child(tree, c) { + m = get_marker_label(c, label, node, prop); + if (m) + return m; + } + + *prop = NULL; + *node = NULL; + return NULL; +} + +struct node *get_subnode(struct node *node, const char *nodename) +{ + struct node *child; + + for_each_child(node, child) + if (streq(child->name, nodename)) + return child; + + return NULL; +} + +struct node *get_node_by_path(struct node *tree, const char *path) +{ + const char *p; + struct node *child; + + if (!path || ! (*path)) { + if (tree->deleted) + return NULL; + return tree; + } + + while (path[0] == '/') + path++; + + p = strchr(path, '/'); + + for_each_child(tree, child) { + if (p && strprefixeq(path, p - path, child->name)) + return get_node_by_path(child, p+1); + else if (!p && streq(path, child->name)) + return child; + } + + return NULL; +} + +struct node *get_node_by_label(struct node *tree, const char *label) +{ + struct node *child, *node; + struct label *l; + + assert(label && (strlen(label) > 0)); + + for_each_label(tree->labels, l) + if (streq(l->label, label)) + return tree; + + for_each_child(tree, child) { + node = get_node_by_label(child, label); + if (node) + return node; + } + + return NULL; +} + +struct node *get_node_by_phandle(struct node *tree, cell_t phandle) +{ + struct node *child, *node; + + if ((phandle == 0) || (phandle == -1)) { + assert(generate_fixups); + return NULL; + } + + if (tree->phandle == phandle) { + if (tree->deleted) + return NULL; + return tree; + } + + for_each_child(tree, child) { + node = get_node_by_phandle(child, phandle); + if (node) + return node; + } + + return NULL; +} + +struct node *get_node_by_ref(struct node *tree, const char *ref) +{ + if (streq(ref, "/")) + return tree; + else if (ref[0] == '/') + return get_node_by_path(tree, ref); + else + return get_node_by_label(tree, ref); +} + +cell_t get_node_phandle(struct node *root, struct node *node) +{ + static cell_t phandle = 1; /* FIXME: ick, static local */ + struct data d = empty_data; + + if ((node->phandle != 0) && (node->phandle != -1)) + return node->phandle; + + while (get_node_by_phandle(root, phandle)) + phandle++; + + node->phandle = phandle; + + d = data_add_marker(d, TYPE_UINT32, NULL); + d = data_append_cell(d, phandle); + + if (!get_property(node, "linux,phandle") + && (phandle_format & PHANDLE_LEGACY)) + add_property(node, build_property("linux,phandle", d, NULL)); + + if (!get_property(node, "phandle") + && (phandle_format & PHANDLE_EPAPR)) + add_property(node, build_property("phandle", d, NULL)); + + /* If the node *does* have a phandle property, we must + * be dealing with a self-referencing phandle, which will be + * fixed up momentarily in the caller */ + + return node->phandle; +} + +uint32_t guess_boot_cpuid(struct node *tree) +{ + struct node *cpus, *bootcpu; + struct property *reg; + + cpus = get_node_by_path(tree, "/cpus"); + if (!cpus) + return 0; + + + bootcpu = cpus->children; + if (!bootcpu) + return 0; + + reg = get_property(bootcpu, "reg"); + if (!reg || (reg->val.len != sizeof(uint32_t))) + return 0; + + /* FIXME: Sanity check node? */ + + return propval_cell(reg); +} + +static int cmp_reserve_info(const void *ax, const void *bx) +{ + const struct reserve_info *a, *b; + + a = *((const struct reserve_info * const *)ax); + b = *((const struct reserve_info * const *)bx); + + if (a->address < b->address) + return -1; + else if (a->address > b->address) + return 1; + else if (a->size < b->size) + return -1; + else if (a->size > b->size) + return 1; + else + return 0; +} + +static void sort_reserve_entries(struct dt_info *dti) +{ + struct reserve_info *ri, **tbl; + int n = 0, i = 0; + + for (ri = dti->reservelist; + ri; + ri = ri->next) + n++; + + if (n == 0) + return; + + tbl = xmalloc(n * sizeof(*tbl)); + + for (ri = dti->reservelist; + ri; + ri = ri->next) + tbl[i++] = ri; + + qsort(tbl, n, sizeof(*tbl), cmp_reserve_info); + + dti->reservelist = tbl[0]; + for (i = 0; i < (n-1); i++) + tbl[i]->next = tbl[i+1]; + tbl[n-1]->next = NULL; + + free(tbl); +} + +static int cmp_prop(const void *ax, const void *bx) +{ + const struct property *a, *b; + + a = *((const struct property * const *)ax); + b = *((const struct property * const *)bx); + + return strcmp(a->name, b->name); +} + +static void sort_properties(struct node *node) +{ + int n = 0, i = 0; + struct property *prop, **tbl; + + for_each_property_withdel(node, prop) + n++; + + if (n == 0) + return; + + tbl = xmalloc(n * sizeof(*tbl)); + + for_each_property_withdel(node, prop) + tbl[i++] = prop; + + qsort(tbl, n, sizeof(*tbl), cmp_prop); + + node->proplist = tbl[0]; + for (i = 0; i < (n-1); i++) + tbl[i]->next = tbl[i+1]; + tbl[n-1]->next = NULL; + + free(tbl); +} + +static int cmp_subnode(const void *ax, const void *bx) +{ + const struct node *a, *b; + + a = *((const struct node * const *)ax); + b = *((const struct node * const *)bx); + + return strcmp(a->name, b->name); +} + +static void sort_subnodes(struct node *node) +{ + int n = 0, i = 0; + struct node *subnode, **tbl; + + for_each_child_withdel(node, subnode) + n++; + + if (n == 0) + return; + + tbl = xmalloc(n * sizeof(*tbl)); + + for_each_child_withdel(node, subnode) + tbl[i++] = subnode; + + qsort(tbl, n, sizeof(*tbl), cmp_subnode); + + node->children = tbl[0]; + for (i = 0; i < (n-1); i++) + tbl[i]->next_sibling = tbl[i+1]; + tbl[n-1]->next_sibling = NULL; + + free(tbl); +} + +static void sort_node(struct node *node) +{ + struct node *c; + + sort_properties(node); + sort_subnodes(node); + for_each_child_withdel(node, c) + sort_node(c); +} + +void sort_tree(struct dt_info *dti) +{ + sort_reserve_entries(dti); + sort_node(dti->dt); +} + +/* utility helper to avoid code duplication */ +static struct node *build_and_name_child_node(struct node *parent, char *name) +{ + struct node *node; + + node = build_node(NULL, NULL, NULL); + name_node(node, xstrdup(name)); + add_child(parent, node); + + return node; +} + +static struct node *build_root_node(struct node *dt, char *name) +{ + struct node *an; + + an = get_subnode(dt, name); + if (!an) + an = build_and_name_child_node(dt, name); + + if (!an) + die("Could not build root node /%s\n", name); + + return an; +} + +static bool any_label_tree(struct dt_info *dti, struct node *node) +{ + struct node *c; + + if (node->labels) + return true; + + for_each_child(node, c) + if (any_label_tree(dti, c)) + return true; + + return false; +} + +static void generate_label_tree_internal(struct dt_info *dti, + struct node *an, struct node *node, + bool allocph) +{ + struct node *dt = dti->dt; + struct node *c; + struct property *p; + struct label *l; + + /* if there are labels */ + if (node->labels) { + + /* now add the label in the node */ + for_each_label(node->labels, l) { + + /* check whether the label already exists */ + p = get_property(an, l->label); + if (p) { + fprintf(stderr, "WARNING: label %s already" + " exists in /%s", l->label, + an->name); + continue; + } + + /* insert it */ + p = build_property(l->label, + data_copy_escape_string(node->fullpath, + strlen(node->fullpath)), + NULL); + add_property(an, p); + } + + /* force allocation of a phandle for this node */ + if (allocph) + (void)get_node_phandle(dt, node); + } + + for_each_child(node, c) + generate_label_tree_internal(dti, an, c, allocph); +} + +static bool any_fixup_tree(struct dt_info *dti, struct node *node) +{ + struct node *c; + struct property *prop; + struct marker *m; + + for_each_property(node, prop) { + m = prop->val.markers; + for_each_marker_of_type(m, REF_PHANDLE) { + if (!get_node_by_ref(dti->dt, m->ref)) + return true; + } + } + + for_each_child(node, c) { + if (any_fixup_tree(dti, c)) + return true; + } + + return false; +} + +static void add_fixup_entry(struct dt_info *dti, struct node *fn, + struct node *node, struct property *prop, + struct marker *m) +{ + char *entry; + + /* m->ref can only be a REF_PHANDLE, but check anyway */ + assert(m->type == REF_PHANDLE); + + /* there shouldn't be any ':' in the arguments */ + if (strchr(node->fullpath, ':') || strchr(prop->name, ':')) + die("arguments should not contain ':'\n"); + + xasprintf(&entry, "%s:%s:%u", + node->fullpath, prop->name, m->offset); + append_to_property(fn, m->ref, entry, strlen(entry) + 1, TYPE_STRING); + + free(entry); +} + +static void generate_fixups_tree_internal(struct dt_info *dti, + struct node *fn, + struct node *node) +{ + struct node *dt = dti->dt; + struct node *c; + struct property *prop; + struct marker *m; + struct node *refnode; + + for_each_property(node, prop) { + m = prop->val.markers; + for_each_marker_of_type(m, REF_PHANDLE) { + refnode = get_node_by_ref(dt, m->ref); + if (!refnode) + add_fixup_entry(dti, fn, node, prop, m); + } + } + + for_each_child(node, c) + generate_fixups_tree_internal(dti, fn, c); +} + +static bool any_local_fixup_tree(struct dt_info *dti, struct node *node) +{ + struct node *c; + struct property *prop; + struct marker *m; + + for_each_property(node, prop) { + m = prop->val.markers; + for_each_marker_of_type(m, REF_PHANDLE) { + if (get_node_by_ref(dti->dt, m->ref)) + return true; + } + } + + for_each_child(node, c) { + if (any_local_fixup_tree(dti, c)) + return true; + } + + return false; +} + +static void add_local_fixup_entry(struct dt_info *dti, + struct node *lfn, struct node *node, + struct property *prop, struct marker *m, + struct node *refnode) +{ + struct node *wn, *nwn; /* local fixup node, walk node, new */ + fdt32_t value_32; + char **compp; + int i, depth; + + /* walk back retrieving depth */ + depth = 0; + for (wn = node; wn; wn = wn->parent) + depth++; + + /* allocate name array */ + compp = xmalloc(sizeof(*compp) * depth); + + /* store names in the array */ + for (wn = node, i = depth - 1; wn; wn = wn->parent, i--) + compp[i] = wn->name; + + /* walk the path components creating nodes if they don't exist */ + for (wn = lfn, i = 1; i < depth; i++, wn = nwn) { + /* if no node exists, create it */ + nwn = get_subnode(wn, compp[i]); + if (!nwn) + nwn = build_and_name_child_node(wn, compp[i]); + } + + free(compp); + + value_32 = cpu_to_fdt32(m->offset); + append_to_property(wn, prop->name, &value_32, sizeof(value_32), TYPE_UINT32); +} + +static void generate_local_fixups_tree_internal(struct dt_info *dti, + struct node *lfn, + struct node *node) +{ + struct node *dt = dti->dt; + struct node *c; + struct property *prop; + struct marker *m; + struct node *refnode; + + for_each_property(node, prop) { + m = prop->val.markers; + for_each_marker_of_type(m, REF_PHANDLE) { + refnode = get_node_by_ref(dt, m->ref); + if (refnode) + add_local_fixup_entry(dti, lfn, node, prop, m, refnode); + } + } + + for_each_child(node, c) + generate_local_fixups_tree_internal(dti, lfn, c); +} + +void generate_label_tree(struct dt_info *dti, char *name, bool allocph) +{ + if (!any_label_tree(dti, dti->dt)) + return; + generate_label_tree_internal(dti, build_root_node(dti->dt, name), + dti->dt, allocph); +} + +void generate_fixups_tree(struct dt_info *dti, char *name) +{ + if (!any_fixup_tree(dti, dti->dt)) + return; + generate_fixups_tree_internal(dti, build_root_node(dti->dt, name), + dti->dt); +} + +void generate_local_fixups_tree(struct dt_info *dti, char *name) +{ + if (!any_local_fixup_tree(dti, dti->dt)) + return; + generate_local_fixups_tree_internal(dti, build_root_node(dti->dt, name), + dti->dt); +} diff --git a/src/net/scripts/dtc/srcpos.c b/src/net/scripts/dtc/srcpos.c new file mode 100644 index 0000000..f5205fb --- /dev/null +++ b/src/net/scripts/dtc/srcpos.c @@ -0,0 +1,406 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright 2007 Jon Loeliger, Freescale Semiconductor, Inc. + */ + +#define _GNU_SOURCE + +#include <stdio.h> + +#include "dtc.h" +#include "srcpos.h" + +/* A node in our list of directories to search for source/include files */ +struct search_path { + struct search_path *next; /* next node in list, NULL for end */ + const char *dirname; /* name of directory to search */ +}; + +/* This is the list of directories that we search for source files */ +static struct search_path *search_path_head, **search_path_tail; + +/* Detect infinite include recursion. */ +#define MAX_SRCFILE_DEPTH (100) +static int srcfile_depth; /* = 0 */ + +static char *get_dirname(const char *path) +{ + const char *slash = strrchr(path, '/'); + + if (slash) { + int len = slash - path; + char *dir = xmalloc(len + 1); + + memcpy(dir, path, len); + dir[len] = '\0'; + return dir; + } + return NULL; +} + +FILE *depfile; /* = NULL */ +struct srcfile_state *current_srcfile; /* = NULL */ +static char *initial_path; /* = NULL */ +static int initial_pathlen; /* = 0 */ +static bool initial_cpp = true; + +static void set_initial_path(char *fname) +{ + int i, len = strlen(fname); + + xasprintf(&initial_path, "%s", fname); + initial_pathlen = 0; + for (i = 0; i != len; i++) + if (initial_path[i] == '/') + initial_pathlen++; +} + +static char *shorten_to_initial_path(char *fname) +{ + char *p1, *p2, *prevslash1 = NULL; + int slashes = 0; + + for (p1 = fname, p2 = initial_path; *p1 && *p2; p1++, p2++) { + if (*p1 != *p2) + break; + if (*p1 == '/') { + prevslash1 = p1; + slashes++; + } + } + p1 = prevslash1 + 1; + if (prevslash1) { + int diff = initial_pathlen - slashes, i, j; + int restlen = strlen(fname) - (p1 - fname); + char *res; + + res = xmalloc((3 * diff) + restlen + 1); + for (i = 0, j = 0; i != diff; i++) { + res[j++] = '.'; + res[j++] = '.'; + res[j++] = '/'; + } + strcpy(res + j, p1); + return res; + } + return NULL; +} + +/** + * Try to open a file in a given directory. + * + * If the filename is an absolute path, then dirname is ignored. If it is a + * relative path, then we look in that directory for the file. + * + * @param dirname Directory to look in, or NULL for none + * @param fname Filename to look for + * @param fp Set to NULL if file did not open + * @return allocated filename on success (caller must free), NULL on failure + */ +static char *try_open(const char *dirname, const char *fname, FILE **fp) +{ + char *fullname; + + if (!dirname || fname[0] == '/') + fullname = xstrdup(fname); + else + fullname = join_path(dirname, fname); + + *fp = fopen(fullname, "rb"); + if (!*fp) { + free(fullname); + fullname = NULL; + } + + return fullname; +} + +/** + * Open a file for read access + * + * If it is a relative filename, we search the full search path for it. + * + * @param fname Filename to open + * @param fp Returns pointer to opened FILE, or NULL on failure + * @return pointer to allocated filename, which caller must free + */ +static char *fopen_any_on_path(const char *fname, FILE **fp) +{ + const char *cur_dir = NULL; + struct search_path *node; + char *fullname; + + /* Try current directory first */ + assert(fp); + if (current_srcfile) + cur_dir = current_srcfile->dir; + fullname = try_open(cur_dir, fname, fp); + + /* Failing that, try each search path in turn */ + for (node = search_path_head; !*fp && node; node = node->next) + fullname = try_open(node->dirname, fname, fp); + + return fullname; +} + +FILE *srcfile_relative_open(const char *fname, char **fullnamep) +{ + FILE *f; + char *fullname; + + if (streq(fname, "-")) { + f = stdin; + fullname = xstrdup("<stdin>"); + } else { + fullname = fopen_any_on_path(fname, &f); + if (!f) + die("Couldn't open \"%s\": %s\n", fname, + strerror(errno)); + } + + if (depfile) + fprintf(depfile, " %s", fullname); + + if (fullnamep) + *fullnamep = fullname; + else + free(fullname); + + return f; +} + +void srcfile_push(const char *fname) +{ + struct srcfile_state *srcfile; + + if (srcfile_depth++ >= MAX_SRCFILE_DEPTH) + die("Includes nested too deeply"); + + srcfile = xmalloc(sizeof(*srcfile)); + + srcfile->f = srcfile_relative_open(fname, &srcfile->name); + srcfile->dir = get_dirname(srcfile->name); + srcfile->prev = current_srcfile; + + srcfile->lineno = 1; + srcfile->colno = 1; + + current_srcfile = srcfile; + + if (srcfile_depth == 1) + set_initial_path(srcfile->name); +} + +bool srcfile_pop(void) +{ + struct srcfile_state *srcfile = current_srcfile; + + assert(srcfile); + + current_srcfile = srcfile->prev; + + if (fclose(srcfile->f)) + die("Error closing \"%s\": %s\n", srcfile->name, + strerror(errno)); + + /* FIXME: We allow the srcfile_state structure to leak, + * because it could still be referenced from a location + * variable being carried through the parser somewhere. To + * fix this we could either allocate all the files from a + * table, or use a pool allocator. */ + + return current_srcfile ? true : false; +} + +void srcfile_add_search_path(const char *dirname) +{ + struct search_path *node; + + /* Create the node */ + node = xmalloc(sizeof(*node)); + node->next = NULL; + node->dirname = xstrdup(dirname); + + /* Add to the end of our list */ + if (search_path_tail) + *search_path_tail = node; + else + search_path_head = node; + search_path_tail = &node->next; +} + +void srcpos_update(struct srcpos *pos, const char *text, int len) +{ + int i; + + pos->file = current_srcfile; + + pos->first_line = current_srcfile->lineno; + pos->first_column = current_srcfile->colno; + + for (i = 0; i < len; i++) + if (text[i] == '\n') { + current_srcfile->lineno++; + current_srcfile->colno = 1; + } else { + current_srcfile->colno++; + } + + pos->last_line = current_srcfile->lineno; + pos->last_column = current_srcfile->colno; +} + +struct srcpos * +srcpos_copy(struct srcpos *pos) +{ + struct srcpos *pos_new; + struct srcfile_state *srcfile_state; + + if (!pos) + return NULL; + + pos_new = xmalloc(sizeof(struct srcpos)); + assert(pos->next == NULL); + memcpy(pos_new, pos, sizeof(struct srcpos)); + + /* allocate without free */ + srcfile_state = xmalloc(sizeof(struct srcfile_state)); + memcpy(srcfile_state, pos->file, sizeof(struct srcfile_state)); + pos_new->file = srcfile_state; + + return pos_new; +} + +struct srcpos *srcpos_extend(struct srcpos *pos, struct srcpos *newtail) +{ + struct srcpos *p; + + if (!pos) + return newtail; + + for (p = pos; p->next != NULL; p = p->next); + p->next = newtail; + return pos; +} + +char * +srcpos_string(struct srcpos *pos) +{ + const char *fname = "<no-file>"; + char *pos_str; + + if (pos->file && pos->file->name) + fname = pos->file->name; + + + if (pos->first_line != pos->last_line) + xasprintf(&pos_str, "%s:%d.%d-%d.%d", fname, + pos->first_line, pos->first_column, + pos->last_line, pos->last_column); + else if (pos->first_column != pos->last_column) + xasprintf(&pos_str, "%s:%d.%d-%d", fname, + pos->first_line, pos->first_column, + pos->last_column); + else + xasprintf(&pos_str, "%s:%d.%d", fname, + pos->first_line, pos->first_column); + + return pos_str; +} + +static char * +srcpos_string_comment(struct srcpos *pos, bool first_line, int level) +{ + char *pos_str, *fname, *first, *rest; + bool fresh_fname = false; + + if (!pos) { + if (level > 1) { + xasprintf(&pos_str, "<no-file>:<no-line>"); + return pos_str; + } else { + return NULL; + } + } + + if (!pos->file) + fname = "<no-file>"; + else if (!pos->file->name) + fname = "<no-filename>"; + else if (level > 1) + fname = pos->file->name; + else { + fname = shorten_to_initial_path(pos->file->name); + if (fname) + fresh_fname = true; + else + fname = pos->file->name; + } + + if (level > 1) + xasprintf(&first, "%s:%d:%d-%d:%d", fname, + pos->first_line, pos->first_column, + pos->last_line, pos->last_column); + else + xasprintf(&first, "%s:%d", fname, + first_line ? pos->first_line : pos->last_line); + + if (fresh_fname) + free(fname); + + if (pos->next != NULL) { + rest = srcpos_string_comment(pos->next, first_line, level); + xasprintf(&pos_str, "%s, %s", first, rest); + free(first); + free(rest); + } else { + pos_str = first; + } + + return pos_str; +} + +char *srcpos_string_first(struct srcpos *pos, int level) +{ + return srcpos_string_comment(pos, true, level); +} + +char *srcpos_string_last(struct srcpos *pos, int level) +{ + return srcpos_string_comment(pos, false, level); +} + +void srcpos_verror(struct srcpos *pos, const char *prefix, + const char *fmt, va_list va) +{ + char *srcstr; + + srcstr = srcpos_string(pos); + + fprintf(stderr, "%s: %s ", prefix, srcstr); + vfprintf(stderr, fmt, va); + fprintf(stderr, "\n"); + + free(srcstr); +} + +void srcpos_error(struct srcpos *pos, const char *prefix, + const char *fmt, ...) +{ + va_list va; + + va_start(va, fmt); + srcpos_verror(pos, prefix, fmt, va); + va_end(va); +} + +void srcpos_set_line(char *f, int l) +{ + current_srcfile->name = f; + current_srcfile->lineno = l; + + if (initial_cpp) { + initial_cpp = false; + set_initial_path(f); + } +} diff --git a/src/net/scripts/dtc/srcpos.h b/src/net/scripts/dtc/srcpos.h new file mode 100644 index 0000000..4318d7a --- /dev/null +++ b/src/net/scripts/dtc/srcpos.h @@ -0,0 +1,103 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright 2007 Jon Loeliger, Freescale Semiconductor, Inc. + */ + +#ifndef SRCPOS_H +#define SRCPOS_H + +#include <stdio.h> +#include <stdbool.h> +#include "util.h" + +struct srcfile_state { + FILE *f; + char *name; + char *dir; + int lineno, colno; + struct srcfile_state *prev; +}; + +extern FILE *depfile; /* = NULL */ +extern struct srcfile_state *current_srcfile; /* = NULL */ + +/** + * Open a source file. + * + * If the source file is a relative pathname, then it is searched for in the + * current directory (the directory of the last source file read) and after + * that in the search path. + * + * We work through the search path in order from the first path specified to + * the last. + * + * If the file is not found, then this function does not return, but calls + * die(). + * + * @param fname Filename to search + * @param fullnamep If non-NULL, it is set to the allocated filename of the + * file that was opened. The caller is then responsible + * for freeing the pointer. + * @return pointer to opened FILE + */ +FILE *srcfile_relative_open(const char *fname, char **fullnamep); + +void srcfile_push(const char *fname); +bool srcfile_pop(void); + +/** + * Add a new directory to the search path for input files + * + * The new path is added at the end of the list. + * + * @param dirname Directory to add + */ +void srcfile_add_search_path(const char *dirname); + +struct srcpos { + int first_line; + int first_column; + int last_line; + int last_column; + struct srcfile_state *file; + struct srcpos *next; +}; + +#define YYLTYPE struct srcpos + +#define YYLLOC_DEFAULT(Current, Rhs, N) \ + do { \ + if (N) { \ + (Current).first_line = YYRHSLOC(Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC(Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC(Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + (Current).file = YYRHSLOC(Rhs, N).file; \ + } else { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC(Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC(Rhs, 0).last_column; \ + (Current).file = YYRHSLOC (Rhs, 0).file; \ + } \ + (Current).next = NULL; \ + } while (0) + + +extern void srcpos_update(struct srcpos *pos, const char *text, int len); +extern struct srcpos *srcpos_copy(struct srcpos *pos); +extern struct srcpos *srcpos_extend(struct srcpos *new_srcpos, + struct srcpos *old_srcpos); +extern char *srcpos_string(struct srcpos *pos); +extern char *srcpos_string_first(struct srcpos *pos, int level); +extern char *srcpos_string_last(struct srcpos *pos, int level); + + +extern void PRINTF(3, 0) srcpos_verror(struct srcpos *pos, const char *prefix, + const char *fmt, va_list va); +extern void PRINTF(3, 4) srcpos_error(struct srcpos *pos, const char *prefix, + const char *fmt, ...); + +extern void srcpos_set_line(char *f, int l); + +#endif /* SRCPOS_H */ diff --git a/src/net/scripts/dtc/treesource.c b/src/net/scripts/dtc/treesource.c new file mode 100644 index 0000000..061ba8c --- /dev/null +++ b/src/net/scripts/dtc/treesource.c @@ -0,0 +1,345 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005. + */ + +#include "dtc.h" +#include "srcpos.h" + +extern FILE *yyin; +extern int yyparse(void); +extern YYLTYPE yylloc; + +struct dt_info *parser_output; +bool treesource_error; + +struct dt_info *dt_from_source(const char *fname) +{ + parser_output = NULL; + treesource_error = false; + + srcfile_push(fname); + yyin = current_srcfile->f; + yylloc.file = current_srcfile; + + if (yyparse() != 0) + die("Unable to parse input tree\n"); + + if (treesource_error) + die("Syntax error parsing input tree\n"); + + return parser_output; +} + +static void write_prefix(FILE *f, int level) +{ + int i; + + for (i = 0; i < level; i++) + fputc('\t', f); +} + +static bool isstring(char c) +{ + return (isprint((unsigned char)c) + || (c == '\0') + || strchr("\a\b\t\n\v\f\r", c)); +} + +static void write_propval_string(FILE *f, const char *s, size_t len) +{ + const char *end = s + len - 1; + + if (!len) + return; + + assert(*end == '\0'); + + fprintf(f, "\""); + while (s < end) { + char c = *s++; + switch (c) { + case '\a': + fprintf(f, "\\a"); + break; + case '\b': + fprintf(f, "\\b"); + break; + case '\t': + fprintf(f, "\\t"); + break; + case '\n': + fprintf(f, "\\n"); + break; + case '\v': + fprintf(f, "\\v"); + break; + case '\f': + fprintf(f, "\\f"); + break; + case '\r': + fprintf(f, "\\r"); + break; + case '\\': + fprintf(f, "\\\\"); + break; + case '\"': + fprintf(f, "\\\""); + break; + case '\0': + fprintf(f, "\\0"); + break; + default: + if (isprint((unsigned char)c)) + fprintf(f, "%c", c); + else + fprintf(f, "\\x%02"PRIx8, c); + } + } + fprintf(f, "\""); +} + +static void write_propval_int(FILE *f, const char *p, size_t len, size_t width) +{ + const char *end = p + len; + assert(len % width == 0); + + for (; p < end; p += width) { + switch (width) { + case 1: + fprintf(f, "%02"PRIx8, *(const uint8_t*)p); + break; + case 2: + fprintf(f, "0x%02"PRIx16, dtb_ld16(p)); + break; + case 4: + fprintf(f, "0x%02"PRIx32, dtb_ld32(p)); + break; + case 8: + fprintf(f, "0x%02"PRIx64, dtb_ld64(p)); + break; + } + if (p + width < end) + fputc(' ', f); + } +} + +static bool has_data_type_information(struct marker *m) +{ + return m->type >= TYPE_UINT8; +} + +static struct marker *next_type_marker(struct marker *m) +{ + while (m && !has_data_type_information(m)) + m = m->next; + return m; +} + +size_t type_marker_length(struct marker *m) +{ + struct marker *next = next_type_marker(m->next); + + if (next) + return next->offset - m->offset; + return 0; +} + +static const char *delim_start[] = { + [TYPE_UINT8] = "[", + [TYPE_UINT16] = "/bits/ 16 <", + [TYPE_UINT32] = "<", + [TYPE_UINT64] = "/bits/ 64 <", + [TYPE_STRING] = "", +}; +static const char *delim_end[] = { + [TYPE_UINT8] = "]", + [TYPE_UINT16] = ">", + [TYPE_UINT32] = ">", + [TYPE_UINT64] = ">", + [TYPE_STRING] = "", +}; + +static enum markertype guess_value_type(struct property *prop) +{ + int len = prop->val.len; + const char *p = prop->val.val; + struct marker *m = prop->val.markers; + int nnotstring = 0, nnul = 0; + int nnotstringlbl = 0, nnotcelllbl = 0; + int i; + + for (i = 0; i < len; i++) { + if (! isstring(p[i])) + nnotstring++; + if (p[i] == '\0') + nnul++; + } + + for_each_marker_of_type(m, LABEL) { + if ((m->offset > 0) && (prop->val.val[m->offset - 1] != '\0')) + nnotstringlbl++; + if ((m->offset % sizeof(cell_t)) != 0) + nnotcelllbl++; + } + + if ((p[len-1] == '\0') && (nnotstring == 0) && (nnul <= (len-nnul)) + && (nnotstringlbl == 0)) { + return TYPE_STRING; + } else if (((len % sizeof(cell_t)) == 0) && (nnotcelllbl == 0)) { + return TYPE_UINT32; + } + + return TYPE_UINT8; +} + +static void write_propval(FILE *f, struct property *prop) +{ + size_t len = prop->val.len; + struct marker *m = prop->val.markers; + struct marker dummy_marker; + enum markertype emit_type = TYPE_NONE; + char *srcstr; + + if (len == 0) { + fprintf(f, ";"); + if (annotate) { + srcstr = srcpos_string_first(prop->srcpos, annotate); + if (srcstr) { + fprintf(f, " /* %s */", srcstr); + free(srcstr); + } + } + fprintf(f, "\n"); + return; + } + + fprintf(f, " ="); + + if (!next_type_marker(m)) { + /* data type information missing, need to guess */ + dummy_marker.type = guess_value_type(prop); + dummy_marker.next = prop->val.markers; + dummy_marker.offset = 0; + dummy_marker.ref = NULL; + m = &dummy_marker; + } + + for_each_marker(m) { + size_t chunk_len = (m->next ? m->next->offset : len) - m->offset; + size_t data_len = type_marker_length(m) ? : len - m->offset; + const char *p = &prop->val.val[m->offset]; + + if (has_data_type_information(m)) { + emit_type = m->type; + fprintf(f, " %s", delim_start[emit_type]); + } else if (m->type == LABEL) + fprintf(f, " %s:", m->ref); + else if (m->offset) + fputc(' ', f); + + if (emit_type == TYPE_NONE) { + assert(chunk_len == 0); + continue; + } + + switch(emit_type) { + case TYPE_UINT16: + write_propval_int(f, p, chunk_len, 2); + break; + case TYPE_UINT32: + write_propval_int(f, p, chunk_len, 4); + break; + case TYPE_UINT64: + write_propval_int(f, p, chunk_len, 8); + break; + case TYPE_STRING: + write_propval_string(f, p, chunk_len); + break; + default: + write_propval_int(f, p, chunk_len, 1); + } + + if (chunk_len == data_len) { + size_t pos = m->offset + chunk_len; + fprintf(f, pos == len ? "%s" : "%s,", + delim_end[emit_type] ? : ""); + emit_type = TYPE_NONE; + } + } + fprintf(f, ";"); + if (annotate) { + srcstr = srcpos_string_first(prop->srcpos, annotate); + if (srcstr) { + fprintf(f, " /* %s */", srcstr); + free(srcstr); + } + } + fprintf(f, "\n"); +} + +static void write_tree_source_node(FILE *f, struct node *tree, int level) +{ + struct property *prop; + struct node *child; + struct label *l; + char *srcstr; + + write_prefix(f, level); + for_each_label(tree->labels, l) + fprintf(f, "%s: ", l->label); + if (tree->name && (*tree->name)) + fprintf(f, "%s {", tree->name); + else + fprintf(f, "/ {"); + + if (annotate) { + srcstr = srcpos_string_first(tree->srcpos, annotate); + if (srcstr) { + fprintf(f, " /* %s */", srcstr); + free(srcstr); + } + } + fprintf(f, "\n"); + + for_each_property(tree, prop) { + write_prefix(f, level+1); + for_each_label(prop->labels, l) + fprintf(f, "%s: ", l->label); + fprintf(f, "%s", prop->name); + write_propval(f, prop); + } + for_each_child(tree, child) { + fprintf(f, "\n"); + write_tree_source_node(f, child, level+1); + } + write_prefix(f, level); + fprintf(f, "};"); + if (annotate) { + srcstr = srcpos_string_last(tree->srcpos, annotate); + if (srcstr) { + fprintf(f, " /* %s */", srcstr); + free(srcstr); + } + } + fprintf(f, "\n"); +} + +void dt_to_source(FILE *f, struct dt_info *dti) +{ + struct reserve_info *re; + + fprintf(f, "/dts-v1/;\n\n"); + + for (re = dti->reservelist; re; re = re->next) { + struct label *l; + + for_each_label(re->labels, l) + fprintf(f, "%s: ", l->label); + fprintf(f, "/memreserve/\t0x%016llx 0x%016llx;\n", + (unsigned long long)re->address, + (unsigned long long)re->size); + } + + write_tree_source_node(f, dti->dt, 0); +} diff --git a/src/net/scripts/dtc/update-dtc-source.sh b/src/net/scripts/dtc/update-dtc-source.sh new file mode 100755 index 0000000..bc704e2 --- /dev/null +++ b/src/net/scripts/dtc/update-dtc-source.sh @@ -0,0 +1,79 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# Simple script to update the version of DTC carried by the Linux kernel +# +# This script assumes that the dtc and the linux git trees are in the +# same directory. After building dtc in the dtc directory, it copies the +# source files and generated source file(s) into the scripts/dtc directory +# in the kernel and creates a git commit updating them to the new +# version. +# +# Usage: from the top level Linux source tree, run: +# $ ./scripts/dtc/update-dtc-source.sh +# +# The script will change into the dtc tree, build and test dtc, copy the +# relevant files into the kernel tree and create a git commit. The commit +# message will need to be modified to reflect the version of DTC being +# imported +# +# TODO: +# This script is pretty basic, but it is seldom used so a few manual tasks +# aren't a big deal. If anyone is interested in making it more robust, the +# the following would be nice: +# * Actually fail to complete if any testcase fails. +# - The dtc "make check" target needs to return a failure +# * Extract the version number from the dtc repo for the commit message +# * Build dtc in the kernel tree +# * run 'make check" on dtc built from the kernel tree + +set -ev + +DTC_UPSTREAM_PATH=`pwd`/../dtc +DTC_LINUX_PATH=`pwd`/scripts/dtc + +DTC_SOURCE="checks.c data.c dtc.c dtc.h flattree.c fstree.c livetree.c srcpos.c \ + srcpos.h treesource.c util.c util.h version_gen.h yamltree.c \ + dtc-lexer.l dtc-parser.y" +LIBFDT_SOURCE="fdt.c fdt.h fdt_addresses.c fdt_empty_tree.c \ + fdt_overlay.c fdt_ro.c fdt_rw.c fdt_strerror.c fdt_sw.c \ + fdt_wip.c libfdt.h libfdt_env.h libfdt_internal.h" + +get_last_dtc_version() { + git log --oneline scripts/dtc/ | grep 'upstream' | head -1 | sed -e 's/^.* \(.*\)/\1/' +} + +last_dtc_ver=$(get_last_dtc_version) + +# Build DTC +cd $DTC_UPSTREAM_PATH +make clean +make check +dtc_version=$(git describe HEAD) +dtc_log=$(git log --oneline ${last_dtc_ver}..) + + +# Copy the files into the Linux tree +cd $DTC_LINUX_PATH +for f in $DTC_SOURCE; do + cp ${DTC_UPSTREAM_PATH}/${f} ${f} + git add ${f} +done +for f in $LIBFDT_SOURCE; do + cp ${DTC_UPSTREAM_PATH}/libfdt/${f} libfdt/${f} + git add libfdt/${f} +done + +sed -i -- 's/#include <libfdt_env.h>/#include "libfdt_env.h"/g' ./libfdt/libfdt.h +sed -i -- 's/#include <fdt.h>/#include "fdt.h"/g' ./libfdt/libfdt.h +git add ./libfdt/libfdt.h + +commit_msg=$(cat << EOF +scripts/dtc: Update to upstream version ${dtc_version} + +This adds the following commits from upstream: + +${dtc_log} +EOF +) + +git commit -e -v -s -m "${commit_msg}" diff --git a/src/net/scripts/dtc/util.c b/src/net/scripts/dtc/util.c new file mode 100644 index 0000000..40274fb --- /dev/null +++ b/src/net/scripts/dtc/util.c @@ -0,0 +1,468 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright 2011 The Chromium Authors, All Rights Reserved. + * Copyright 2008 Jon Loeliger, Freescale Semiconductor, Inc. + * + * util_is_printable_string contributed by + * Pantelis Antoniou <pantelis.antoniou AT gmail.com> + */ + +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> +#include <assert.h> +#include <inttypes.h> + +#include <errno.h> +#include <fcntl.h> +#include <unistd.h> + +#include "libfdt.h" +#include "util.h" +#include "version_gen.h" + +char *xstrdup(const char *s) +{ + int len = strlen(s) + 1; + char *d = xmalloc(len); + + memcpy(d, s, len); + + return d; +} + +int xavsprintf_append(char **strp, const char *fmt, va_list ap) +{ + int n, size = 0; /* start with 128 bytes */ + char *p; + va_list ap_copy; + + p = *strp; + if (p) + size = strlen(p); + + va_copy(ap_copy, ap); + n = vsnprintf(NULL, 0, fmt, ap_copy) + 1; + va_end(ap_copy); + + p = xrealloc(p, size + n); + + n = vsnprintf(p + size, n, fmt, ap); + + *strp = p; + return strlen(p); +} + +int xasprintf_append(char **strp, const char *fmt, ...) +{ + int n; + va_list ap; + + va_start(ap, fmt); + n = xavsprintf_append(strp, fmt, ap); + va_end(ap); + + return n; +} + +int xasprintf(char **strp, const char *fmt, ...) +{ + int n; + va_list ap; + + *strp = NULL; + + va_start(ap, fmt); + n = xavsprintf_append(strp, fmt, ap); + va_end(ap); + + return n; +} + +char *join_path(const char *path, const char *name) +{ + int lenp = strlen(path); + int lenn = strlen(name); + int len; + int needslash = 1; + char *str; + + len = lenp + lenn + 2; + if ((lenp > 0) && (path[lenp-1] == '/')) { + needslash = 0; + len--; + } + + str = xmalloc(len); + memcpy(str, path, lenp); + if (needslash) { + str[lenp] = '/'; + lenp++; + } + memcpy(str+lenp, name, lenn+1); + return str; +} + +bool util_is_printable_string(const void *data, int len) +{ + const char *s = data; + const char *ss, *se; + + /* zero length is not */ + if (len == 0) + return 0; + + /* must terminate with zero */ + if (s[len - 1] != '\0') + return 0; + + se = s + len; + + while (s < se) { + ss = s; + while (s < se && *s && isprint((unsigned char)*s)) + s++; + + /* not zero, or not done yet */ + if (*s != '\0' || s == ss) + return 0; + + s++; + } + + return 1; +} + +/* + * Parse a octal encoded character starting at index i in string s. The + * resulting character will be returned and the index i will be updated to + * point at the character directly after the end of the encoding, this may be + * the '\0' terminator of the string. + */ +static char get_oct_char(const char *s, int *i) +{ + char x[4]; + char *endx; + long val; + + x[3] = '\0'; + strncpy(x, s + *i, 3); + + val = strtol(x, &endx, 8); + + assert(endx > x); + + (*i) += endx - x; + return val; +} + +/* + * Parse a hexadecimal encoded character starting at index i in string s. The + * resulting character will be returned and the index i will be updated to + * point at the character directly after the end of the encoding, this may be + * the '\0' terminator of the string. + */ +static char get_hex_char(const char *s, int *i) +{ + char x[3]; + char *endx; + long val; + + x[2] = '\0'; + strncpy(x, s + *i, 2); + + val = strtol(x, &endx, 16); + if (!(endx > x)) + die("\\x used with no following hex digits\n"); + + (*i) += endx - x; + return val; +} + +char get_escape_char(const char *s, int *i) +{ + char c = s[*i]; + int j = *i + 1; + char val; + + switch (c) { + case 'a': + val = '\a'; + break; + case 'b': + val = '\b'; + break; + case 't': + val = '\t'; + break; + case 'n': + val = '\n'; + break; + case 'v': + val = '\v'; + break; + case 'f': + val = '\f'; + break; + case 'r': + val = '\r'; + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + j--; /* need to re-read the first digit as + * part of the octal value */ + val = get_oct_char(s, &j); + break; + case 'x': + val = get_hex_char(s, &j); + break; + default: + val = c; + } + + (*i) = j; + return val; +} + +int utilfdt_read_err(const char *filename, char **buffp, size_t *len) +{ + int fd = 0; /* assume stdin */ + char *buf = NULL; + size_t bufsize = 1024, offset = 0; + int ret = 0; + + *buffp = NULL; + if (strcmp(filename, "-") != 0) { + fd = open(filename, O_RDONLY); + if (fd < 0) + return errno; + } + + /* Loop until we have read everything */ + buf = xmalloc(bufsize); + do { + /* Expand the buffer to hold the next chunk */ + if (offset == bufsize) { + bufsize *= 2; + buf = xrealloc(buf, bufsize); + } + + ret = read(fd, &buf[offset], bufsize - offset); + if (ret < 0) { + ret = errno; + break; + } + offset += ret; + } while (ret != 0); + + /* Clean up, including closing stdin; return errno on error */ + close(fd); + if (ret) + free(buf); + else + *buffp = buf; + if (len) + *len = bufsize; + return ret; +} + +char *utilfdt_read(const char *filename, size_t *len) +{ + char *buff; + int ret = utilfdt_read_err(filename, &buff, len); + + if (ret) { + fprintf(stderr, "Couldn't open blob from '%s': %s\n", filename, + strerror(ret)); + return NULL; + } + /* Successful read */ + return buff; +} + +int utilfdt_write_err(const char *filename, const void *blob) +{ + int fd = 1; /* assume stdout */ + int totalsize; + int offset; + int ret = 0; + const char *ptr = blob; + + if (strcmp(filename, "-") != 0) { + fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666); + if (fd < 0) + return errno; + } + + totalsize = fdt_totalsize(blob); + offset = 0; + + while (offset < totalsize) { + ret = write(fd, ptr + offset, totalsize - offset); + if (ret < 0) { + ret = -errno; + break; + } + offset += ret; + } + /* Close the file/stdin; return errno on error */ + if (fd != 1) + close(fd); + return ret < 0 ? -ret : 0; +} + + +int utilfdt_write(const char *filename, const void *blob) +{ + int ret = utilfdt_write_err(filename, blob); + + if (ret) { + fprintf(stderr, "Couldn't write blob to '%s': %s\n", filename, + strerror(ret)); + } + return ret ? -1 : 0; +} + +int utilfdt_decode_type(const char *fmt, int *type, int *size) +{ + int qualifier = 0; + + if (!*fmt) + return -1; + + /* get the conversion qualifier */ + *size = -1; + if (strchr("hlLb", *fmt)) { + qualifier = *fmt++; + if (qualifier == *fmt) { + switch (*fmt++) { +/* TODO: case 'l': qualifier = 'L'; break;*/ + case 'h': + qualifier = 'b'; + break; + } + } + } + + /* we should now have a type */ + if ((*fmt == '\0') || !strchr("iuxs", *fmt)) + return -1; + + /* convert qualifier (bhL) to byte size */ + if (*fmt != 's') + *size = qualifier == 'b' ? 1 : + qualifier == 'h' ? 2 : + qualifier == 'l' ? 4 : -1; + *type = *fmt++; + + /* that should be it! */ + if (*fmt) + return -1; + return 0; +} + +void utilfdt_print_data(const char *data, int len) +{ + int i; + const char *s; + + /* no data, don't print */ + if (len == 0) + return; + + if (util_is_printable_string(data, len)) { + printf(" = "); + + s = data; + do { + printf("\"%s\"", s); + s += strlen(s) + 1; + if (s < data + len) + printf(", "); + } while (s < data + len); + + } else if ((len % 4) == 0) { + const fdt32_t *cell = (const fdt32_t *)data; + + printf(" = <"); + for (i = 0, len /= 4; i < len; i++) + printf("0x%08" PRIx32 "%s", fdt32_to_cpu(cell[i]), + i < (len - 1) ? " " : ""); + printf(">"); + } else { + const unsigned char *p = (const unsigned char *)data; + printf(" = ["); + for (i = 0; i < len; i++) + printf("%02x%s", *p++, i < len - 1 ? " " : ""); + printf("]"); + } +} + +void NORETURN util_version(void) +{ + printf("Version: %s\n", DTC_VERSION); + exit(0); +} + +void NORETURN util_usage(const char *errmsg, const char *synopsis, + const char *short_opts, + struct option const long_opts[], + const char * const opts_help[]) +{ + FILE *fp = errmsg ? stderr : stdout; + const char a_arg[] = "<arg>"; + size_t a_arg_len = strlen(a_arg) + 1; + size_t i; + int optlen; + + fprintf(fp, + "Usage: %s\n" + "\n" + "Options: -[%s]\n", synopsis, short_opts); + + /* prescan the --long opt length to auto-align */ + optlen = 0; + for (i = 0; long_opts[i].name; ++i) { + /* +1 is for space between --opt and help text */ + int l = strlen(long_opts[i].name) + 1; + if (long_opts[i].has_arg == a_argument) + l += a_arg_len; + if (optlen < l) + optlen = l; + } + + for (i = 0; long_opts[i].name; ++i) { + /* helps when adding new applets or options */ + assert(opts_help[i] != NULL); + + /* first output the short flag if it has one */ + if (long_opts[i].val > '~') + fprintf(fp, " "); + else + fprintf(fp, " -%c, ", long_opts[i].val); + + /* then the long flag */ + if (long_opts[i].has_arg == no_argument) + fprintf(fp, "--%-*s", optlen, long_opts[i].name); + else + fprintf(fp, "--%s %s%*s", long_opts[i].name, a_arg, + (int)(optlen - strlen(long_opts[i].name) - a_arg_len), ""); + + /* finally the help text */ + fprintf(fp, "%s\n", opts_help[i]); + } + + if (errmsg) { + fprintf(fp, "\nError: %s\n", errmsg); + exit(EXIT_FAILURE); + } else + exit(EXIT_SUCCESS); +} diff --git a/src/net/scripts/dtc/util.h b/src/net/scripts/dtc/util.h new file mode 100644 index 0000000..a771b46 --- /dev/null +++ b/src/net/scripts/dtc/util.h @@ -0,0 +1,247 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#ifndef UTIL_H +#define UTIL_H + +#include <stdlib.h> +#include <stdarg.h> +#include <stdbool.h> +#include <getopt.h> + +/* + * Copyright 2011 The Chromium Authors, All Rights Reserved. + * Copyright 2008 Jon Loeliger, Freescale Semiconductor, Inc. + */ + +#ifdef __GNUC__ +#ifdef __clang__ +#define PRINTF(i, j) __attribute__((format (printf, i, j))) +#else +#define PRINTF(i, j) __attribute__((format (gnu_printf, i, j))) +#endif +#define NORETURN __attribute__((noreturn)) +#else +#define PRINTF(i, j) +#define NORETURN +#endif + +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) + +#define stringify(s) stringify_(s) +#define stringify_(s) #s + +static inline void NORETURN PRINTF(1, 2) die(const char *str, ...) +{ + va_list ap; + + va_start(ap, str); + fprintf(stderr, "FATAL ERROR: "); + vfprintf(stderr, str, ap); + va_end(ap); + exit(1); +} + +static inline void *xmalloc(size_t len) +{ + void *new = malloc(len); + + if (!new) + die("malloc() failed\n"); + + return new; +} + +static inline void *xrealloc(void *p, size_t len) +{ + void *new = realloc(p, len); + + if (!new) + die("realloc() failed (len=%zd)\n", len); + + return new; +} + +extern char *xstrdup(const char *s); + +extern int PRINTF(2, 3) xasprintf(char **strp, const char *fmt, ...); +extern int PRINTF(2, 3) xasprintf_append(char **strp, const char *fmt, ...); +extern int xavsprintf_append(char **strp, const char *fmt, va_list ap); +extern char *join_path(const char *path, const char *name); + +/** + * Check a property of a given length to see if it is all printable and + * has a valid terminator. The property can contain either a single string, + * or multiple strings each of non-zero length. + * + * @param data The string to check + * @param len The string length including terminator + * @return 1 if a valid printable string, 0 if not + */ +bool util_is_printable_string(const void *data, int len); + +/* + * Parse an escaped character starting at index i in string s. The resulting + * character will be returned and the index i will be updated to point at the + * character directly after the end of the encoding, this may be the '\0' + * terminator of the string. + */ +char get_escape_char(const char *s, int *i); + +/** + * Read a device tree file into a buffer. This will report any errors on + * stderr. + * + * @param filename The filename to read, or - for stdin + * @param len If non-NULL, the amount of data we managed to read + * @return Pointer to allocated buffer containing fdt, or NULL on error + */ +char *utilfdt_read(const char *filename, size_t *len); + +/** + * Read a device tree file into a buffer. Does not report errors, but only + * returns them. The value returned can be passed to strerror() to obtain + * an error message for the user. + * + * @param filename The filename to read, or - for stdin + * @param buffp Returns pointer to buffer containing fdt + * @param len If non-NULL, the amount of data we managed to read + * @return 0 if ok, else an errno value representing the error + */ +int utilfdt_read_err(const char *filename, char **buffp, size_t *len); + +/** + * Write a device tree buffer to a file. This will report any errors on + * stderr. + * + * @param filename The filename to write, or - for stdout + * @param blob Pointer to buffer containing fdt + * @return 0 if ok, -1 on error + */ +int utilfdt_write(const char *filename, const void *blob); + +/** + * Write a device tree buffer to a file. Does not report errors, but only + * returns them. The value returned can be passed to strerror() to obtain + * an error message for the user. + * + * @param filename The filename to write, or - for stdout + * @param blob Pointer to buffer containing fdt + * @return 0 if ok, else an errno value representing the error + */ +int utilfdt_write_err(const char *filename, const void *blob); + +/** + * Decode a data type string. The purpose of this string + * + * The string consists of an optional character followed by the type: + * Modifier characters: + * hh or b 1 byte + * h 2 byte + * l 4 byte, default + * + * Type character: + * s string + * i signed integer + * u unsigned integer + * x hex + * + * TODO: Implement ll modifier (8 bytes) + * TODO: Implement o type (octal) + * + * @param fmt Format string to process + * @param type Returns type found(s/d/u/x), or 0 if none + * @param size Returns size found(1,2,4,8) or 4 if none + * @return 0 if ok, -1 on error (no type given, or other invalid format) + */ +int utilfdt_decode_type(const char *fmt, int *type, int *size); + +/* + * This is a usage message fragment for the -t option. It is the format + * supported by utilfdt_decode_type. + */ + +#define USAGE_TYPE_MSG \ + "<type>\ts=string, i=int, u=unsigned, x=hex\n" \ + "\tOptional modifier prefix:\n" \ + "\t\thh or b=byte, h=2 byte, l=4 byte (default)"; + +/** + * Print property data in a readable format to stdout + * + * Properties that look like strings will be printed as strings. Otherwise + * the data will be displayed either as cells (if len is a multiple of 4 + * bytes) or bytes. + * + * If len is 0 then this function does nothing. + * + * @param data Pointers to property data + * @param len Length of property data + */ +void utilfdt_print_data(const char *data, int len); + +/** + * Show source version and exit + */ +void NORETURN util_version(void); + +/** + * Show usage and exit + * + * This helps standardize the output of various utils. You most likely want + * to use the usage() helper below rather than call this. + * + * @param errmsg If non-NULL, an error message to display + * @param synopsis The initial example usage text (and possible examples) + * @param short_opts The string of short options + * @param long_opts The structure of long options + * @param opts_help An array of help strings (should align with long_opts) + */ +void NORETURN util_usage(const char *errmsg, const char *synopsis, + const char *short_opts, + struct option const long_opts[], + const char * const opts_help[]); + +/** + * Show usage and exit + * + * If you name all your usage variables with usage_xxx, then you can call this + * help macro rather than expanding all arguments yourself. + * + * @param errmsg If non-NULL, an error message to display + */ +#define usage(errmsg) \ + util_usage(errmsg, usage_synopsis, usage_short_opts, \ + usage_long_opts, usage_opts_help) + +/** + * Call getopt_long() with standard options + * + * Since all util code runs getopt in the same way, provide a helper. + */ +#define util_getopt_long() getopt_long(argc, argv, usage_short_opts, \ + usage_long_opts, NULL) + +/* Helper for aligning long_opts array */ +#define a_argument required_argument + +/* Helper for usage_short_opts string constant */ +#define USAGE_COMMON_SHORT_OPTS "hV" + +/* Helper for usage_long_opts option array */ +#define USAGE_COMMON_LONG_OPTS \ + {"help", no_argument, NULL, 'h'}, \ + {"version", no_argument, NULL, 'V'}, \ + {NULL, no_argument, NULL, 0x0} + +/* Helper for usage_opts_help array */ +#define USAGE_COMMON_OPTS_HELP \ + "Print this help and exit", \ + "Print version and exit", \ + NULL + +/* Helper for getopt case statements */ +#define case_USAGE_COMMON_FLAGS \ + case 'h': usage(NULL); \ + case 'V': util_version(); \ + case '?': usage("unknown option"); + +#endif /* UTIL_H */ diff --git a/src/net/scripts/dtc/version_gen.h b/src/net/scripts/dtc/version_gen.h new file mode 100644 index 0000000..054cdd0 --- /dev/null +++ b/src/net/scripts/dtc/version_gen.h @@ -0,0 +1 @@ +#define DTC_VERSION "DTC 1.6.0-gcbca977e" diff --git a/src/net/scripts/dtc/yamltree.c b/src/net/scripts/dtc/yamltree.c new file mode 100644 index 0000000..4e93c12 --- /dev/null +++ b/src/net/scripts/dtc/yamltree.c @@ -0,0 +1,233 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * (C) Copyright Linaro, Ltd. 2018 + * (C) Copyright Arm Holdings. 2017 + * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005. + */ + +#include <stdlib.h> +#include <yaml.h> +#include "dtc.h" +#include "srcpos.h" + +char *yaml_error_name[] = { + [YAML_NO_ERROR] = "no error", + [YAML_MEMORY_ERROR] = "memory error", + [YAML_READER_ERROR] = "reader error", + [YAML_SCANNER_ERROR] = "scanner error", + [YAML_PARSER_ERROR] = "parser error", + [YAML_COMPOSER_ERROR] = "composer error", + [YAML_WRITER_ERROR] = "writer error", + [YAML_EMITTER_ERROR] = "emitter error", +}; + +#define yaml_emitter_emit_or_die(emitter, event) ( \ +{ \ + if (!yaml_emitter_emit(emitter, event)) \ + die("yaml '%s': %s in %s, line %i\n", \ + yaml_error_name[(emitter)->error], \ + (emitter)->problem, __func__, __LINE__); \ +}) + +static void yaml_propval_int(yaml_emitter_t *emitter, struct marker *markers, char *data, int len, int width) +{ + yaml_event_t event; + void *tag; + int off, start_offset = markers->offset; + + switch(width) { + case 1: tag = "!u8"; break; + case 2: tag = "!u16"; break; + case 4: tag = "!u32"; break; + case 8: tag = "!u64"; break; + default: + die("Invalid width %i", width); + } + assert(len % width == 0); + + yaml_sequence_start_event_initialize(&event, NULL, + (yaml_char_t *)tag, width == 4, YAML_FLOW_SEQUENCE_STYLE); + yaml_emitter_emit_or_die(emitter, &event); + + for (off = 0; off < len; off += width) { + char buf[32]; + struct marker *m; + bool is_phandle = false; + + switch(width) { + case 1: + sprintf(buf, "0x%"PRIx8, *(uint8_t*)(data + off)); + break; + case 2: + sprintf(buf, "0x%"PRIx16, dtb_ld16(data + off)); + break; + case 4: + sprintf(buf, "0x%"PRIx32, dtb_ld32(data + off)); + m = markers; + is_phandle = false; + for_each_marker_of_type(m, REF_PHANDLE) { + if (m->offset == (start_offset + off)) { + is_phandle = true; + break; + } + } + break; + case 8: + sprintf(buf, "0x%"PRIx64, dtb_ld64(data + off)); + break; + } + + if (is_phandle) + yaml_scalar_event_initialize(&event, NULL, + (yaml_char_t*)"!phandle", (yaml_char_t *)buf, + strlen(buf), 0, 0, YAML_PLAIN_SCALAR_STYLE); + else + yaml_scalar_event_initialize(&event, NULL, + (yaml_char_t*)YAML_INT_TAG, (yaml_char_t *)buf, + strlen(buf), 1, 1, YAML_PLAIN_SCALAR_STYLE); + yaml_emitter_emit_or_die(emitter, &event); + } + + yaml_sequence_end_event_initialize(&event); + yaml_emitter_emit_or_die(emitter, &event); +} + +static void yaml_propval_string(yaml_emitter_t *emitter, char *str, int len) +{ + yaml_event_t event; + int i; + + assert(str[len-1] == '\0'); + + /* Make sure the entire string is in the lower 7-bit ascii range */ + for (i = 0; i < len; i++) + assert(isascii(str[i])); + + yaml_scalar_event_initialize(&event, NULL, + (yaml_char_t *)YAML_STR_TAG, (yaml_char_t*)str, + len-1, 0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE); + yaml_emitter_emit_or_die(emitter, &event); +} + +static void yaml_propval(yaml_emitter_t *emitter, struct property *prop) +{ + yaml_event_t event; + int len = prop->val.len; + struct marker *m = prop->val.markers; + + /* Emit the property name */ + yaml_scalar_event_initialize(&event, NULL, + (yaml_char_t *)YAML_STR_TAG, (yaml_char_t*)prop->name, + strlen(prop->name), 1, 1, YAML_PLAIN_SCALAR_STYLE); + yaml_emitter_emit_or_die(emitter, &event); + + /* Boolean properties are easiest to deal with. Length is zero, so just emit 'true' */ + if (len == 0) { + yaml_scalar_event_initialize(&event, NULL, + (yaml_char_t *)YAML_BOOL_TAG, + (yaml_char_t*)"true", + strlen("true"), 1, 0, YAML_PLAIN_SCALAR_STYLE); + yaml_emitter_emit_or_die(emitter, &event); + return; + } + + if (!m) + die("No markers present in property '%s' value\n", prop->name); + + yaml_sequence_start_event_initialize(&event, NULL, + (yaml_char_t *)YAML_SEQ_TAG, 1, YAML_FLOW_SEQUENCE_STYLE); + yaml_emitter_emit_or_die(emitter, &event); + + for_each_marker(m) { + int chunk_len; + char *data = &prop->val.val[m->offset]; + + if (m->type < TYPE_UINT8) + continue; + + chunk_len = type_marker_length(m) ? : len; + assert(chunk_len > 0); + len -= chunk_len; + + switch(m->type) { + case TYPE_UINT16: + yaml_propval_int(emitter, m, data, chunk_len, 2); + break; + case TYPE_UINT32: + yaml_propval_int(emitter, m, data, chunk_len, 4); + break; + case TYPE_UINT64: + yaml_propval_int(emitter, m, data, chunk_len, 8); + break; + case TYPE_STRING: + yaml_propval_string(emitter, data, chunk_len); + break; + default: + yaml_propval_int(emitter, m, data, chunk_len, 1); + break; + } + } + + yaml_sequence_end_event_initialize(&event); + yaml_emitter_emit_or_die(emitter, &event); +} + + +static void yaml_tree(struct node *tree, yaml_emitter_t *emitter) +{ + struct property *prop; + struct node *child; + yaml_event_t event; + + if (tree->deleted) + return; + + yaml_mapping_start_event_initialize(&event, NULL, + (yaml_char_t *)YAML_MAP_TAG, 1, YAML_ANY_MAPPING_STYLE); + yaml_emitter_emit_or_die(emitter, &event); + + for_each_property(tree, prop) + yaml_propval(emitter, prop); + + /* Loop over all the children, emitting them into the map */ + for_each_child(tree, child) { + yaml_scalar_event_initialize(&event, NULL, + (yaml_char_t *)YAML_STR_TAG, (yaml_char_t*)child->name, + strlen(child->name), 1, 0, YAML_PLAIN_SCALAR_STYLE); + yaml_emitter_emit_or_die(emitter, &event); + yaml_tree(child, emitter); + } + + yaml_mapping_end_event_initialize(&event); + yaml_emitter_emit_or_die(emitter, &event); +} + +void dt_to_yaml(FILE *f, struct dt_info *dti) +{ + yaml_emitter_t emitter; + yaml_event_t event; + + yaml_emitter_initialize(&emitter); + yaml_emitter_set_output_file(&emitter, f); + yaml_stream_start_event_initialize(&event, YAML_UTF8_ENCODING); + yaml_emitter_emit_or_die(&emitter, &event); + + yaml_document_start_event_initialize(&event, NULL, NULL, NULL, 0); + yaml_emitter_emit_or_die(&emitter, &event); + + yaml_sequence_start_event_initialize(&event, NULL, (yaml_char_t *)YAML_SEQ_TAG, 1, YAML_ANY_SEQUENCE_STYLE); + yaml_emitter_emit_or_die(&emitter, &event); + + yaml_tree(dti->dt, &emitter); + + yaml_sequence_end_event_initialize(&event); + yaml_emitter_emit_or_die(&emitter, &event); + + yaml_document_end_event_initialize(&event, 0); + yaml_emitter_emit_or_die(&emitter, &event); + + yaml_stream_end_event_initialize(&event); + yaml_emitter_emit_or_die(&emitter, &event); + + yaml_emitter_delete(&emitter); +} diff --git a/src/net/scripts/dummy-tools/gcc b/src/net/scripts/dummy-tools/gcc new file mode 100755 index 0000000..0d0589c --- /dev/null +++ b/src/net/scripts/dummy-tools/gcc @@ -0,0 +1,92 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0-only +# +# Staring v4.18, Kconfig evaluates compiler capabilities, and hides CONFIG +# options your compiler does not support. This works well if you configure and +# build the kernel on the same host machine. +# +# It is inconvenient if you prepare the .config that is carried to a different +# build environment (typically this happens when you package the kernel for +# distros) because using a different compiler potentially produces different +# CONFIG options than the real build environment. So, you probably want to make +# as many options visible as possible. In other words, you need to create a +# super-set of CONFIG options that cover any build environment. If some of the +# CONFIG options turned out to be unsupported on the build machine, they are +# automatically disabled by the nature of Kconfig. +# +# However, it is not feasible to get a full-featured compiler for every arch. +# Hence these dummy toolchains to make all compiler tests pass. +# +# Usage: +# +# From the top directory of the source tree, run +# +# $ make CROSS_COMPILE=scripts/dummy-tools/ oldconfig +# +# Most of compiler features are tested by cc-option, which simply checks the +# exit code of $(CC). This script does nothing and just exits with 0 in most +# cases. So, $(cc-option, ...) is evaluated as 'y'. +# +# This scripts caters to more checks; handle --version and pre-process __GNUC__ +# etc. to pretend to be GCC, and also do right things to satisfy some scripts. + +# Check if the first parameter appears in the rest. Succeeds if found. +# This helper is useful if a particular option was passed to this script. +# Typically used like this: +# arg_contain <word-you-are-searching-for> "$@" +arg_contain () +{ + search="$1" + shift + + while [ $# -gt 0 ] + do + if [ "$search" = "$1" ]; then + return 0 + fi + shift + done + + return 1 +} + +# To set CONFIG_CC_IS_GCC=y +if arg_contain --version "$@"; then + echo "gcc (scripts/dummy-tools/gcc)" + exit 0 +fi + +if arg_contain -E "$@"; then + # For scripts/gcc-version.sh; This emulates GCC 20.0.0 + if arg_contain - "$@"; then + sed 's/^__GNUC__$/20/; s/^__GNUC_MINOR__$/0/; s/^__GNUC_PATCHLEVEL__$/0/' + exit 0 + else + echo "no input files" >&2 + exit 1 + fi +fi + +if arg_contain -S "$@"; then + # For scripts/gcc-x86-*-has-stack-protector.sh + if arg_contain -fstack-protector "$@"; then + echo "%gs" + exit 0 + fi +fi + +# To set GCC_PLUGINS +if arg_contain -print-file-name=plugin "$@"; then + plugin_dir=$(mktemp -d) + + mkdir -p $plugin_dir/include + touch $plugin_dir/include/plugin-version.h + + echo $plugin_dir + exit 0 +fi + +# inverted return value +if arg_contain -D__SIZEOF_INT128__=0 "$@"; then + exit 1 +fi diff --git a/src/net/scripts/dummy-tools/ld b/src/net/scripts/dummy-tools/ld new file mode 100755 index 0000000..f682330 --- /dev/null +++ b/src/net/scripts/dummy-tools/ld @@ -0,0 +1,30 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0-only + +# Dummy script that always succeeds. + +# Check if the first parameter appears in the rest. Succeeds if found. +# This helper is useful if a particular option was passed to this script. +# Typically used like this: +# arg_contain <word-you-are-searching-for> "$@" +arg_contain () +{ + search="$1" + shift + + while [ $# -gt 0 ] + do + if [ "$search" = "$1" ]; then + return 0 + fi + shift + done + + return 1 +} + +if arg_contain --version "$@" || arg_contain -v "$@"; then + progname=$(basename $0) + echo "GNU $progname (scripts/dummy-tools/$progname) 2.50" + exit 0 +fi diff --git a/src/net/scripts/dummy-tools/nm b/src/net/scripts/dummy-tools/nm new file mode 120000 index 0000000..c0648b3 --- /dev/null +++ b/src/net/scripts/dummy-tools/nm @@ -0,0 +1 @@ +ld \ No newline at end of file diff --git a/src/net/scripts/dummy-tools/objcopy b/src/net/scripts/dummy-tools/objcopy new file mode 120000 index 0000000..c0648b3 --- /dev/null +++ b/src/net/scripts/dummy-tools/objcopy @@ -0,0 +1 @@ +ld \ No newline at end of file diff --git a/src/net/scripts/export_report.pl b/src/net/scripts/export_report.pl new file mode 100755 index 0000000..feb3d55 --- /dev/null +++ b/src/net/scripts/export_report.pl @@ -0,0 +1,186 @@ +#!/usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0-only +# +# (C) Copyright IBM Corporation 2006. +# Author : Ram Pai (linuxram@us.ibm.com) +# +# Usage: export_report.pl -k Module.symvers [-o report_file ] -f *.mod.c +# + +use warnings; +use Getopt::Std; +use strict; + +sub numerically { + my $no1 = (split /\s+/, $a)[1]; + my $no2 = (split /\s+/, $b)[1]; + return $no1 <=> $no2; +} + +sub alphabetically { + my ($module1, $value1) = @{$a}; + my ($module2, $value2) = @{$b}; + return $value1 <=> $value2 || $module2 cmp $module1; +} + +sub print_depends_on { + my ($href) = @_; + print "\n"; + for my $mod (sort keys %$href) { + my $list = $href->{$mod}; + print "\t$mod:\n"; + foreach my $sym (sort numerically @{$list}) { + my ($symbol, $no) = split /\s+/, $sym; + printf("\t\t%-25s\n", $symbol); + } + print "\n"; + } + print "\n"; + print "~"x80 , "\n"; +} + +sub usage { + print "Usage: @_ -h -k Module.symvers [ -o outputfile ] \n", + "\t-f: treat all the non-option argument as .mod.c files. ", + "Recommend using this as the last option\n", + "\t-h: print detailed help\n", + "\t-k: the path to Module.symvers file. By default uses ", + "the file from the current directory\n", + "\t-o outputfile: output the report to outputfile\n"; + exit 0; +} + +sub collectcfiles { + my @file; + open my $fh, '< modules.order' or die "cannot open modules.order: $!\n"; + while (<$fh>) { + s/\.ko$/.mod.c/; + push (@file, $_) + } + close($fh); + chomp @file; + return @file; +} + +my (%SYMBOL, %MODULE, %opt, @allcfiles); + +if (not getopts('hk:o:f',\%opt) or defined $opt{'h'}) { + usage($0); +} + +if (defined $opt{'f'}) { + @allcfiles = @ARGV; +} else { + @allcfiles = collectcfiles(); +} + +if (not defined $opt{'k'}) { + $opt{'k'} = "Module.symvers"; +} + +open (my $module_symvers, '<', $opt{'k'}) + or die "Sorry, cannot open $opt{'k'}: $!\n"; + +if (defined $opt{'o'}) { + open (my $out, '>', $opt{'o'}) + or die "Sorry, cannot open $opt{'o'} $!\n"; + + select $out; +} + +# +# collect all the symbols and their attributes from the +# Module.symvers file +# +while ( <$module_symvers> ) { + chomp; + my (undef, $symbol, $module, $gpl, $namespace) = split('\t'); + $SYMBOL { $symbol } = [ $module , "0" , $symbol, $gpl]; +} +close($module_symvers); + +# +# collect the usage count of each symbol. +# +my $modversion_warnings = 0; + +foreach my $thismod (@allcfiles) { + my $module; + + unless (open ($module, '<', $thismod)) { + warn "Sorry, cannot open $thismod: $!\n"; + next; + } + + my $state=0; + while ( <$module> ) { + chomp; + if ($state == 0) { + $state = 1 if ($_ =~ /static const struct modversion_info/); + next; + } + if ($state == 1) { + $state = 2 if ($_ =~ /__attribute__\(\(section\("__versions"\)\)\)/); + next; + } + if ($state == 2) { + if ( $_ !~ /0x[0-9a-f]+,/ ) { + next; + } + my $sym = (split /([,"])/,)[4]; + my ($module, $value, $symbol, $gpl) = @{$SYMBOL{$sym}}; + $SYMBOL{ $sym } = [ $module, $value+1, $symbol, $gpl]; + push(@{$MODULE{$thismod}} , $sym); + } + } + if ($state != 2) { + warn "WARNING:$thismod is not built with CONFIG_MODVERSIONS enabled\n"; + $modversion_warnings++; + } + close($module); +} + +print "\tThis file reports the exported symbols usage patterns by in-tree\n", + "\t\t\t\tmodules\n"; +printf("%s\n\n\n","x"x80); +printf("\t\t\t\tINDEX\n\n\n"); +printf("SECTION 1: Usage counts of all exported symbols\n"); +printf("SECTION 2: List of modules and the exported symbols they use\n"); +printf("%s\n\n\n","x"x80); +printf("SECTION 1:\tThe exported symbols and their usage count\n\n"); +printf("%-25s\t%-25s\t%-5s\t%-25s\n", "Symbol", "Module", "Usage count", + "export type"); + +# +# print the list of unused exported symbols +# +foreach my $list (sort alphabetically values(%SYMBOL)) { + my ($module, $value, $symbol, $gpl) = @{$list}; + printf("%-25s\t%-25s\t%-10s\t", $symbol, $module, $value); + if (defined $gpl) { + printf("%-25s\n",$gpl); + } else { + printf("\n"); + } +} +printf("%s\n\n\n","x"x80); + +printf("SECTION 2:\n\tThis section reports export-symbol-usage of in-kernel +modules. Each module lists the modules, and the symbols from that module that +it uses. Each listed symbol reports the number of modules using it\n"); + +print "\nNOTE: Got $modversion_warnings CONFIG_MODVERSIONS warnings\n\n" + if $modversion_warnings; + +print "~"x80 , "\n"; +for my $thismod (sort keys %MODULE) { + my $list = $MODULE{$thismod}; + my %depends; + $thismod =~ s/\.mod\.c/.ko/; + print "\t\t\t$thismod\n"; + foreach my $symbol (@{$list}) { + my ($module, $value, undef, $gpl) = @{$SYMBOL{$symbol}}; + push (@{$depends{"$module"}}, "$symbol $value"); + } + print_depends_on(\%depends); +} diff --git a/src/net/scripts/extract-cert.c b/src/net/scripts/extract-cert.c new file mode 100644 index 0000000..3bc48c7 --- /dev/null +++ b/src/net/scripts/extract-cert.c @@ -0,0 +1,162 @@ +/* Extract X.509 certificate in DER form from PKCS#11 or PEM. + * + * Copyright © 2014-2015 Red Hat, Inc. All Rights Reserved. + * Copyright © 2015 Intel Corporation. + * + * Authors: David Howells <dhowells@redhat.com> + * David Woodhouse <dwmw2@infradead.org> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the licence, or (at your option) any later version. + */ +#define _GNU_SOURCE +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <stdbool.h> +#include <string.h> +#include <err.h> +#include <openssl/bio.h> +#include <openssl/pem.h> +#include <openssl/err.h> +#include <openssl/engine.h> + +#define PKEY_ID_PKCS7 2 + +static __attribute__((noreturn)) +void format(void) +{ + fprintf(stderr, + "Usage: scripts/extract-cert <source> <dest>\n"); + exit(2); +} + +static void display_openssl_errors(int l) +{ + const char *file; + char buf[120]; + int e, line; + + if (ERR_peek_error() == 0) + return; + fprintf(stderr, "At main.c:%d:\n", l); + + while ((e = ERR_get_error_line(&file, &line))) { + ERR_error_string(e, buf); + fprintf(stderr, "- SSL %s: %s:%d\n", buf, file, line); + } +} + +static void drain_openssl_errors(void) +{ + const char *file; + int line; + + if (ERR_peek_error() == 0) + return; + while (ERR_get_error_line(&file, &line)) {} +} + +#define ERR(cond, fmt, ...) \ + do { \ + bool __cond = (cond); \ + display_openssl_errors(__LINE__); \ + if (__cond) { \ + err(1, fmt, ## __VA_ARGS__); \ + } \ + } while(0) + +static const char *key_pass; +static BIO *wb; +static char *cert_dst; +static int kbuild_verbose; + +static void write_cert(X509 *x509) +{ + char buf[200]; + + if (!wb) { + wb = BIO_new_file(cert_dst, "wb"); + ERR(!wb, "%s", cert_dst); + } + X509_NAME_oneline(X509_get_subject_name(x509), buf, sizeof(buf)); + ERR(!i2d_X509_bio(wb, x509), "%s", cert_dst); + if (kbuild_verbose) + fprintf(stderr, "Extracted cert: %s\n", buf); +} + +int main(int argc, char **argv) +{ + char *cert_src; + + OpenSSL_add_all_algorithms(); + ERR_load_crypto_strings(); + ERR_clear_error(); + + kbuild_verbose = atoi(getenv("KBUILD_VERBOSE")?:"0"); + + key_pass = getenv("KBUILD_SIGN_PIN"); + + if (argc != 3) + format(); + + cert_src = argv[1]; + cert_dst = argv[2]; + + if (!cert_src[0]) { + /* Invoked with no input; create empty file */ + FILE *f = fopen(cert_dst, "wb"); + ERR(!f, "%s", cert_dst); + fclose(f); + exit(0); + } else if (!strncmp(cert_src, "pkcs11:", 7)) { + ENGINE *e; + struct { + const char *cert_id; + X509 *cert; + } parms; + + parms.cert_id = cert_src; + parms.cert = NULL; + + ENGINE_load_builtin_engines(); + drain_openssl_errors(); + e = ENGINE_by_id("pkcs11"); + ERR(!e, "Load PKCS#11 ENGINE"); + if (ENGINE_init(e)) + drain_openssl_errors(); + else + ERR(1, "ENGINE_init"); + if (key_pass) + ERR(!ENGINE_ctrl_cmd_string(e, "PIN", key_pass, 0), "Set PKCS#11 PIN"); + ENGINE_ctrl_cmd(e, "LOAD_CERT_CTRL", 0, &parms, NULL, 1); + ERR(!parms.cert, "Get X.509 from PKCS#11"); + write_cert(parms.cert); + } else { + BIO *b; + X509 *x509; + + b = BIO_new_file(cert_src, "rb"); + ERR(!b, "%s", cert_src); + + while (1) { + x509 = PEM_read_bio_X509(b, NULL, NULL, NULL); + if (wb && !x509) { + unsigned long err = ERR_peek_last_error(); + if (ERR_GET_LIB(err) == ERR_LIB_PEM && + ERR_GET_REASON(err) == PEM_R_NO_START_LINE) { + ERR_clear_error(); + break; + } + } + ERR(!x509, "%s", cert_src); + write_cert(x509); + } + } + + BIO_free(wb); + + return 0; +} diff --git a/src/net/scripts/extract-ikconfig b/src/net/scripts/extract-ikconfig new file mode 100755 index 0000000..3b42f25 --- /dev/null +++ b/src/net/scripts/extract-ikconfig @@ -0,0 +1,68 @@ +#!/bin/sh +# ---------------------------------------------------------------------- +# extract-ikconfig - Extract the .config file from a kernel image +# +# This will only work when the kernel was compiled with CONFIG_IKCONFIG. +# +# The obscure use of the "tr" filter is to work around older versions of +# "grep" that report the byte offset of the line instead of the pattern. +# +# (c) 2009,2010 Dick Streefland <dick@streefland.net> +# Licensed under the terms of the GNU General Public License. +# ---------------------------------------------------------------------- + +cf1='IKCFG_ST\037\213\010' +cf2='0123456789' + +dump_config() +{ + if pos=`tr "$cf1\n$cf2" "\n$cf2=" < "$1" | grep -abo "^$cf2"` + then + pos=${pos%%:*} + tail -c+$(($pos+8)) "$1" | zcat > $tmp1 2> /dev/null + if [ $? != 1 ] + then # exit status must be 0 or 2 (trailing garbage warning) + cat $tmp1 + exit 0 + fi + fi +} + +try_decompress() +{ + for pos in `tr "$1\n$2" "\n$2=" < "$img" | grep -abo "^$2"` + do + pos=${pos%%:*} + tail -c+$pos "$img" | $3 > $tmp2 2> /dev/null + dump_config $tmp2 + done +} + +# Check invocation: +me=${0##*/} +img=$1 +if [ $# -ne 1 -o ! -s "$img" ] +then + echo "Usage: $me <kernel-image>" >&2 + exit 2 +fi + +# Prepare temp files: +tmp1=/tmp/ikconfig$$.1 +tmp2=/tmp/ikconfig$$.2 +trap "rm -f $tmp1 $tmp2" 0 + +# Initial attempt for uncompressed images or objects: +dump_config "$img" + +# That didn't work, so retry after decompression. +try_decompress '\037\213\010' xy gunzip +try_decompress '\3757zXZ\000' abcde unxz +try_decompress 'BZh' xy bunzip2 +try_decompress '\135\0\0\0' xxx unlzma +try_decompress '\211\114\132' xy 'lzop -d' +try_decompress '\002\041\114\030' xyy 'lz4 -d -l' + +# Bail out: +echo "$me: Cannot find kernel config." >&2 +exit 1 diff --git a/src/net/scripts/extract-module-sig.pl b/src/net/scripts/extract-module-sig.pl new file mode 100755 index 0000000..36a2f59 --- /dev/null +++ b/src/net/scripts/extract-module-sig.pl @@ -0,0 +1,138 @@ +#!/usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0 +# +# extract-mod-sig <part> <module-file> +# +# Reads the module file and writes out some or all of the signature +# section to stdout. Part is the bit to be written and is one of: +# +# -0: The unsigned module, no signature data at all +# -a: All of the signature data, including magic number +# -d: Just the descriptor values as a sequence of numbers +# -n: Just the signer's name +# -k: Just the key ID +# -s: Just the crypto signature or PKCS#7 message +# +use warnings; +use strict; + +die "Format: $0 -[0adnks] module-file >out\n" + if ($#ARGV != 1); + +my $part = $ARGV[0]; +my $modfile = $ARGV[1]; + +my $magic_number = "~Module signature appended~\n"; + +# +# Read the module contents +# +open FD, "<$modfile" || die $modfile; +binmode(FD); +my @st = stat(FD); +die "$modfile" unless (@st); +my $buf = ""; +my $len = sysread(FD, $buf, $st[7]); +die "$modfile" unless (defined($len)); +die "Short read on $modfile\n" unless ($len == $st[7]); +close(FD) || die $modfile; + +print STDERR "Read ", $len, " bytes from module file\n"; + +die "The file is too short to have a sig magic number and descriptor\n" + if ($len < 12 + length($magic_number)); + +# +# Check for the magic number and extract the information block +# +my $p = $len - length($magic_number); +my $raw_magic = substr($buf, $p); + +die "Magic number not found at $len\n" + if ($raw_magic ne $magic_number); +print STDERR "Found magic number at $len\n"; + +$p -= 12; +my $raw_info = substr($buf, $p, 12); + +my @info = unpack("CCCCCxxxN", $raw_info); +my ($algo, $hash, $id_type, $name_len, $kid_len, $sig_len) = @info; + +if ($id_type == 0) { + print STDERR "Found PGP key identifier\n"; +} elsif ($id_type == 1) { + print STDERR "Found X.509 cert identifier\n"; +} elsif ($id_type == 2) { + print STDERR "Found PKCS#7/CMS encapsulation\n"; +} else { + print STDERR "Found unsupported identifier type $id_type\n"; +} + +# +# Extract the three pieces of info data +# +die "Insufficient name+kid+sig data in file\n" + unless ($p >= $name_len + $kid_len + $sig_len); + +$p -= $sig_len; +my $raw_sig = substr($buf, $p, $sig_len); +$p -= $kid_len; +my $raw_kid = substr($buf, $p, $kid_len); +$p -= $name_len; +my $raw_name = substr($buf, $p, $name_len); + +my $module_len = $p; + +if ($sig_len > 0) { + print STDERR "Found $sig_len bytes of signature ["; + my $n = $sig_len > 16 ? 16 : $sig_len; + foreach my $i (unpack("C" x $n, substr($raw_sig, 0, $n))) { + printf STDERR "%02x", $i; + } + print STDERR "]\n"; +} + +if ($kid_len > 0) { + print STDERR "Found $kid_len bytes of key identifier ["; + my $n = $kid_len > 16 ? 16 : $kid_len; + foreach my $i (unpack("C" x $n, substr($raw_kid, 0, $n))) { + printf STDERR "%02x", $i; + } + print STDERR "]\n"; +} + +if ($name_len > 0) { + print STDERR "Found $name_len bytes of signer's name [$raw_name]\n"; +} + +# +# Produce the requested output +# +if ($part eq "-0") { + # The unsigned module, no signature data at all + binmode(STDOUT); + print substr($buf, 0, $module_len); +} elsif ($part eq "-a") { + # All of the signature data, including magic number + binmode(STDOUT); + print substr($buf, $module_len); +} elsif ($part eq "-d") { + # Just the descriptor values as a sequence of numbers + print join(" ", @info), "\n"; +} elsif ($part eq "-n") { + # Just the signer's name + print STDERR "No signer's name for PKCS#7 message type sig\n" + if ($id_type == 2); + binmode(STDOUT); + print $raw_name; +} elsif ($part eq "-k") { + # Just the key identifier + print STDERR "No key ID for PKCS#7 message type sig\n" + if ($id_type == 2); + binmode(STDOUT); + print $raw_kid; +} elsif ($part eq "-s") { + # Just the crypto signature or PKCS#7 message + binmode(STDOUT); + print $raw_sig; +} diff --git a/src/net/scripts/extract-sys-certs.pl b/src/net/scripts/extract-sys-certs.pl new file mode 100755 index 0000000..fa8ab15 --- /dev/null +++ b/src/net/scripts/extract-sys-certs.pl @@ -0,0 +1,159 @@ +#!/usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0 +# +use warnings; +use strict; +use Math::BigInt; +use Fcntl "SEEK_SET"; + +die "Format: $0 [-s <systemmap-file>] <vmlinux-file> <keyring-file>\n" + if ($#ARGV != 1 && $#ARGV != 3 || + $#ARGV == 3 && $ARGV[0] ne "-s"); + +my $sysmap = ""; +if ($#ARGV == 3) { + shift; + $sysmap = $ARGV[0]; + shift; +} + +my $vmlinux = $ARGV[0]; +my $keyring = $ARGV[1]; + +# +# Parse the vmlinux section table +# +open FD, "objdump -h $vmlinux |" || die $vmlinux; +my @lines = <FD>; +close(FD) || die $vmlinux; + +my @sections = (); + +foreach my $line (@lines) { + chomp($line); + if ($line =~ /\s*([0-9]+)\s+(\S+)\s+([0-9a-f]+)\s+([0-9a-f]+)\s+([0-9a-f]+)\s+([0-9a-f]+)\s+2[*][*]([0-9]+)/ + ) { + my $seg = $1; + my $name = $2; + my $len = Math::BigInt->new("0x" . $3); + my $vma = Math::BigInt->new("0x" . $4); + my $lma = Math::BigInt->new("0x" . $5); + my $foff = Math::BigInt->new("0x" . $6); + my $align = 2 ** $7; + + push @sections, { name => $name, + vma => $vma, + len => $len, + foff => $foff }; + } +} + +print "Have $#sections sections\n"; + +# +# Try and parse the vmlinux symbol table. If the vmlinux file has been created +# from a vmlinuz file with extract-vmlinux then the symbol table will be empty. +# +open FD, "nm $vmlinux 2>/dev/null |" || die $vmlinux; +@lines = <FD>; +close(FD) || die $vmlinux; + +my %symbols = (); +my $nr_symbols = 0; + +sub parse_symbols(@) { + foreach my $line (@_) { + chomp($line); + if ($line =~ /([0-9a-f]+)\s([a-zA-Z])\s(\S+)/ + ) { + my $addr = "0x" . $1; + my $type = $2; + my $name = $3; + + $symbols{$name} = $addr; + $nr_symbols++; + } + } +} +parse_symbols(@lines); + +if ($nr_symbols == 0 && $sysmap ne "") { + print "No symbols in vmlinux, trying $sysmap\n"; + + open FD, "<$sysmap" || die $sysmap; + @lines = <FD>; + close(FD) || die $sysmap; + parse_symbols(@lines); +} + +die "No symbols available\n" + if ($nr_symbols == 0); + +print "Have $nr_symbols symbols\n"; + +die "Can't find system certificate list" + unless (exists($symbols{"__cert_list_start"}) && + exists($symbols{"system_certificate_list_size"})); + +my $start = Math::BigInt->new($symbols{"__cert_list_start"}); +my $end; +my $size; +my $size_sym = Math::BigInt->new($symbols{"system_certificate_list_size"}); + +open FD, "<$vmlinux" || die $vmlinux; +binmode(FD); + +my $s = undef; +foreach my $sec (@sections) { + my $s_name = $sec->{name}; + my $s_vma = $sec->{vma}; + my $s_len = $sec->{len}; + my $s_foff = $sec->{foff}; + my $s_vend = $s_vma + $s_len; + + next unless ($start >= $s_vma); + next if ($start >= $s_vend); + + die "Certificate list size was not found on the same section\n" + if ($size_sym < $s_vma || $size_sym > $s_vend); + + die "Cert object in multiple sections: ", $s_name, " and ", $s->{name}, "\n" + if ($s); + + my $size_off = $size_sym -$s_vma + $s_foff; + my $packed; + die $vmlinux if (!defined(sysseek(FD, $size_off, SEEK_SET))); + sysread(FD, $packed, 8); + $size = unpack 'L!', $packed; + $end = $start + $size; + + printf "Have %u bytes of certs at VMA 0x%x\n", $size, $start; + + die "Cert object partially overflows section $s_name\n" + if ($end > $s_vend); + + $s = $sec; +} + +die "Cert object not inside a section\n" + unless ($s); + +print "Certificate list in section ", $s->{name}, "\n"; + +my $foff = $start - $s->{vma} + $s->{foff}; + +printf "Certificate list at file offset 0x%x\n", $foff; + +die $vmlinux if (!defined(sysseek(FD, $foff, SEEK_SET))); +my $buf = ""; +my $len = sysread(FD, $buf, $size); +die "$vmlinux" if (!defined($len)); +die "Short read on $vmlinux\n" if ($len != $size); +close(FD) || die $vmlinux; + +open FD, ">$keyring" || die $keyring; +binmode(FD); +$len = syswrite(FD, $buf, $size); +die "$keyring" if (!defined($len)); +die "Short write on $keyring\n" if ($len != $size); +close(FD) || die $keyring; diff --git a/src/net/scripts/extract-vmlinux b/src/net/scripts/extract-vmlinux new file mode 100755 index 0000000..8995cd3 --- /dev/null +++ b/src/net/scripts/extract-vmlinux @@ -0,0 +1,64 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0-only +# ---------------------------------------------------------------------- +# extract-vmlinux - Extract uncompressed vmlinux from a kernel image +# +# Inspired from extract-ikconfig +# (c) 2009,2010 Dick Streefland <dick@streefland.net> +# +# (c) 2011 Corentin Chary <corentin.chary@gmail.com> +# +# ---------------------------------------------------------------------- + +check_vmlinux() +{ + # Use readelf to check if it's a valid ELF + # TODO: find a better to way to check that it's really vmlinux + # and not just an elf + readelf -h $1 > /dev/null 2>&1 || return 1 + + cat $1 + exit 0 +} + +try_decompress() +{ + # The obscure use of the "tr" filter is to work around older versions of + # "grep" that report the byte offset of the line instead of the pattern. + + # Try to find the header ($1) and decompress from here + for pos in `tr "$1\n$2" "\n$2=" < "$img" | grep -abo "^$2"` + do + pos=${pos%%:*} + tail -c+$pos "$img" | $3 > $tmp 2> /dev/null + check_vmlinux $tmp + done +} + +# Check invocation: +me=${0##*/} +img=$1 +if [ $# -ne 1 -o ! -s "$img" ] +then + echo "Usage: $me <kernel-image>" >&2 + exit 2 +fi + +# Prepare temp files: +tmp=$(mktemp /tmp/vmlinux-XXX) +trap "rm -f $tmp" 0 + +# That didn't work, so retry after decompression. +try_decompress '\037\213\010' xy gunzip +try_decompress '\3757zXZ\000' abcde unxz +try_decompress 'BZh' xy bunzip2 +try_decompress '\135\0\0\0' xxx unlzma +try_decompress '\211\114\132' xy 'lzop -d' +try_decompress '\002!L\030' xxx 'lz4 -d' +try_decompress '(\265/\375' xxx unzstd + +# Finally check for uncompressed images or objects: +check_vmlinux $img + +# Bail out: +echo "$me: Cannot find vmlinux." >&2 diff --git a/src/net/scripts/extract_xc3028.pl b/src/net/scripts/extract_xc3028.pl new file mode 100755 index 0000000..e1c9af2 --- /dev/null +++ b/src/net/scripts/extract_xc3028.pl @@ -0,0 +1,1717 @@ +#!/usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0-only + +# Copyright (c) Mauro Carvalho Chehab <mchehab@kernel.org> +# +# In order to use, you need to: +# 1) Download the windows driver with something like: +# Version 2.4 +# wget http://www.twinhan.com/files/AW/BDA T/20080303_V1.0.6.7.zip +# or wget http://www.stefanringel.de/pub/20080303_V1.0.6.7.zip +# Version 2.7 +# wget http://www.steventoth.net/linux/xc5000/HVR-12x0-14x0-17x0_1_25_25271_WHQL.zip +# 2) Extract the files from the zip into the current dir: +# unzip -j 20080303_V1.0.6.7.zip 20080303_v1.0.6.7/UDXTTM6000.sys +# unzip -j HVR-12x0-14x0-17x0_1_25_25271_WHQL.zip Driver85/hcw85bda.sys +# 3) run the script: +# ./extract_xc3028.pl +# 4) copy the generated files: +# cp xc3028-v24.fw /lib/firmware +# cp xc3028-v27.fw /lib/firmware + +#use strict; +use IO::Handle; + +my $debug=0; + +sub verify ($$) +{ + my ($filename, $hash) = @_; + my ($testhash); + + if (system("which md5sum > /dev/null 2>&1")) { + die "This firmware requires the md5sum command - see http://www.gnu.org/software/coreutils/\n"; + } + + open(CMD, "md5sum ".$filename."|"); + $testhash = <CMD>; + $testhash =~ /([a-zA-Z0-9]*)/; + $testhash = $1; + close CMD; + die "Hash of extracted file does not match (found $testhash, expected $hash!\n" if ($testhash ne $hash); +} + +sub get_hunk ($$) +{ + my ($offset, $length) = @_; + my ($chunklength, $buf, $rcount, $out); + + sysseek(INFILE, $offset, SEEK_SET); + while ($length > 0) { + # Calc chunk size + $chunklength = 2048; + $chunklength = $length if ($chunklength > $length); + + $rcount = sysread(INFILE, $buf, $chunklength); + die "Ran out of data\n" if ($rcount != $chunklength); + $out .= $buf; + $length -= $rcount; + } + return $out; +} + +sub write_le16($) +{ + my $val = shift; + my $msb = ($val >> 8) &0xff; + my $lsb = $val & 0xff; + + syswrite(OUTFILE, chr($lsb).chr($msb)); +} + +sub write_le32($) +{ + my $val = shift; + my $l3 = ($val >> 24) & 0xff; + my $l2 = ($val >> 16) & 0xff; + my $l1 = ($val >> 8) & 0xff; + my $l0 = $val & 0xff; + + syswrite(OUTFILE, chr($l0).chr($l1).chr($l2).chr($l3)); +} + +sub write_le64($$) +{ + my $msb_val = shift; + my $lsb_val = shift; + my $l7 = ($msb_val >> 24) & 0xff; + my $l6 = ($msb_val >> 16) & 0xff; + my $l5 = ($msb_val >> 8) & 0xff; + my $l4 = $msb_val & 0xff; + + my $l3 = ($lsb_val >> 24) & 0xff; + my $l2 = ($lsb_val >> 16) & 0xff; + my $l1 = ($lsb_val >> 8) & 0xff; + my $l0 = $lsb_val & 0xff; + + syswrite(OUTFILE, + chr($l0).chr($l1).chr($l2).chr($l3). + chr($l4).chr($l5).chr($l6).chr($l7)); +} + +sub write_hunk($$) +{ + my ($offset, $length) = @_; + my $out = get_hunk($offset, $length); + + printf "(len %d) ",$length if ($debug); + + for (my $i=0;$i<$length;$i++) { + printf "%02x ",ord(substr($out,$i,1)) if ($debug); + } + printf "\n" if ($debug); + + syswrite(OUTFILE, $out); +} + +sub write_hunk_fix_endian($$) +{ + my ($offset, $length) = @_; + my $out = get_hunk($offset, $length); + + printf "(len_fix %d) ",$length if ($debug); + + for (my $i=0;$i<$length;$i++) { + printf "%02x ",ord(substr($out,$i,1)) if ($debug); + } + printf "\n" if ($debug); + + my $i=0; + while ($i<$length) { + my $size = ord(substr($out,$i,1))*256+ord(substr($out,$i+1,1)); + syswrite(OUTFILE, substr($out,$i+1,1)); + syswrite(OUTFILE, substr($out,$i,1)); + $i+=2; + if ($size>0 && $size <0x8000) { + for (my $j=0;$j<$size;$j++) { + syswrite(OUTFILE, substr($out,$j+$i,1)); + } + $i+=$size; + } + } +} + +sub main_firmware_24($$$$) +{ + my $out; + my $j=0; + my $outfile = shift; + my $name = shift; + my $version = shift; + my $nr_desc = shift; + + for ($j = length($name); $j <32; $j++) { + $name = $name.chr(0); + } + + open OUTFILE, ">$outfile"; + syswrite(OUTFILE, $name); + write_le16($version); + write_le16($nr_desc); + + # + # Firmware 0, type: BASE FW F8MHZ (0x00000003), id: (0000000000000000), size: 6635 + # + + write_le32(0x00000003); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(6635); # Size + write_hunk_fix_endian(257752, 6635); + + # + # Firmware 1, type: BASE FW F8MHZ MTS (0x00000007), id: (0000000000000000), size: 6635 + # + + write_le32(0x00000007); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(6635); # Size + write_hunk_fix_endian(264392, 6635); + + # + # Firmware 2, type: BASE FW FM (0x00000401), id: (0000000000000000), size: 6525 + # + + write_le32(0x00000401); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(6525); # Size + write_hunk_fix_endian(271040, 6525); + + # + # Firmware 3, type: BASE FW FM INPUT1 (0x00000c01), id: (0000000000000000), size: 6539 + # + + write_le32(0x00000c01); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(6539); # Size + write_hunk_fix_endian(277568, 6539); + + # + # Firmware 4, type: BASE FW (0x00000001), id: (0000000000000000), size: 6633 + # + + write_le32(0x00000001); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(6633); # Size + write_hunk_fix_endian(284120, 6633); + + # + # Firmware 5, type: BASE FW MTS (0x00000005), id: (0000000000000000), size: 6617 + # + + write_le32(0x00000005); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(6617); # Size + write_hunk_fix_endian(290760, 6617); + + # + # Firmware 6, type: STD FW (0x00000000), id: PAL/BG A2/A (0000000100000007), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x00000001, 0x00000007); # ID + write_le32(161); # Size + write_hunk_fix_endian(297384, 161); + + # + # Firmware 7, type: STD FW MTS (0x00000004), id: PAL/BG A2/A (0000000100000007), size: 169 + # + + write_le32(0x00000004); # Type + write_le64(0x00000001, 0x00000007); # ID + write_le32(169); # Size + write_hunk_fix_endian(297552, 169); + + # + # Firmware 8, type: STD FW (0x00000000), id: PAL/BG A2/B (0000000200000007), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x00000002, 0x00000007); # ID + write_le32(161); # Size + write_hunk_fix_endian(297728, 161); + + # + # Firmware 9, type: STD FW MTS (0x00000004), id: PAL/BG A2/B (0000000200000007), size: 169 + # + + write_le32(0x00000004); # Type + write_le64(0x00000002, 0x00000007); # ID + write_le32(169); # Size + write_hunk_fix_endian(297896, 169); + + # + # Firmware 10, type: STD FW (0x00000000), id: PAL/BG NICAM/A (0000000400000007), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x00000004, 0x00000007); # ID + write_le32(161); # Size + write_hunk_fix_endian(298072, 161); + + # + # Firmware 11, type: STD FW MTS (0x00000004), id: PAL/BG NICAM/A (0000000400000007), size: 169 + # + + write_le32(0x00000004); # Type + write_le64(0x00000004, 0x00000007); # ID + write_le32(169); # Size + write_hunk_fix_endian(298240, 169); + + # + # Firmware 12, type: STD FW (0x00000000), id: PAL/BG NICAM/B (0000000800000007), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x00000008, 0x00000007); # ID + write_le32(161); # Size + write_hunk_fix_endian(298416, 161); + + # + # Firmware 13, type: STD FW MTS (0x00000004), id: PAL/BG NICAM/B (0000000800000007), size: 169 + # + + write_le32(0x00000004); # Type + write_le64(0x00000008, 0x00000007); # ID + write_le32(169); # Size + write_hunk_fix_endian(298584, 169); + + # + # Firmware 14, type: STD FW (0x00000000), id: PAL/DK A2 (00000003000000e0), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x00000003, 0x000000e0); # ID + write_le32(161); # Size + write_hunk_fix_endian(298760, 161); + + # + # Firmware 15, type: STD FW MTS (0x00000004), id: PAL/DK A2 (00000003000000e0), size: 169 + # + + write_le32(0x00000004); # Type + write_le64(0x00000003, 0x000000e0); # ID + write_le32(169); # Size + write_hunk_fix_endian(298928, 169); + + # + # Firmware 16, type: STD FW (0x00000000), id: PAL/DK NICAM (0000000c000000e0), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x0000000c, 0x000000e0); # ID + write_le32(161); # Size + write_hunk_fix_endian(299104, 161); + + # + # Firmware 17, type: STD FW MTS (0x00000004), id: PAL/DK NICAM (0000000c000000e0), size: 169 + # + + write_le32(0x00000004); # Type + write_le64(0x0000000c, 0x000000e0); # ID + write_le32(169); # Size + write_hunk_fix_endian(299272, 169); + + # + # Firmware 18, type: STD FW (0x00000000), id: SECAM/K1 (0000000000200000), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x00000000, 0x00200000); # ID + write_le32(161); # Size + write_hunk_fix_endian(299448, 161); + + # + # Firmware 19, type: STD FW MTS (0x00000004), id: SECAM/K1 (0000000000200000), size: 169 + # + + write_le32(0x00000004); # Type + write_le64(0x00000000, 0x00200000); # ID + write_le32(169); # Size + write_hunk_fix_endian(299616, 169); + + # + # Firmware 20, type: STD FW (0x00000000), id: SECAM/K3 (0000000004000000), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x00000000, 0x04000000); # ID + write_le32(161); # Size + write_hunk_fix_endian(299792, 161); + + # + # Firmware 21, type: STD FW MTS (0x00000004), id: SECAM/K3 (0000000004000000), size: 169 + # + + write_le32(0x00000004); # Type + write_le64(0x00000000, 0x04000000); # ID + write_le32(169); # Size + write_hunk_fix_endian(299960, 169); + + # + # Firmware 22, type: STD FW D2633 DTV6 ATSC (0x00010030), id: (0000000000000000), size: 149 + # + + write_le32(0x00010030); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(149); # Size + write_hunk_fix_endian(300136, 149); + + # + # Firmware 23, type: STD FW D2620 DTV6 QAM (0x00000068), id: (0000000000000000), size: 149 + # + + write_le32(0x00000068); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(149); # Size + write_hunk_fix_endian(300296, 149); + + # + # Firmware 24, type: STD FW D2633 DTV6 QAM (0x00000070), id: (0000000000000000), size: 149 + # + + write_le32(0x00000070); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(149); # Size + write_hunk_fix_endian(300448, 149); + + # + # Firmware 25, type: STD FW D2620 DTV7 (0x00000088), id: (0000000000000000), size: 149 + # + + write_le32(0x00000088); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(149); # Size + write_hunk_fix_endian(300608, 149); + + # + # Firmware 26, type: STD FW D2633 DTV7 (0x00000090), id: (0000000000000000), size: 149 + # + + write_le32(0x00000090); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(149); # Size + write_hunk_fix_endian(300760, 149); + + # + # Firmware 27, type: STD FW D2620 DTV78 (0x00000108), id: (0000000000000000), size: 149 + # + + write_le32(0x00000108); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(149); # Size + write_hunk_fix_endian(300920, 149); + + # + # Firmware 28, type: STD FW D2633 DTV78 (0x00000110), id: (0000000000000000), size: 149 + # + + write_le32(0x00000110); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(149); # Size + write_hunk_fix_endian(301072, 149); + + # + # Firmware 29, type: STD FW D2620 DTV8 (0x00000208), id: (0000000000000000), size: 149 + # + + write_le32(0x00000208); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(149); # Size + write_hunk_fix_endian(301232, 149); + + # + # Firmware 30, type: STD FW D2633 DTV8 (0x00000210), id: (0000000000000000), size: 149 + # + + write_le32(0x00000210); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(149); # Size + write_hunk_fix_endian(301384, 149); + + # + # Firmware 31, type: STD FW FM (0x00000400), id: (0000000000000000), size: 135 + # + + write_le32(0x00000400); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(135); # Size + write_hunk_fix_endian(301554, 135); + + # + # Firmware 32, type: STD FW (0x00000000), id: PAL/I (0000000000000010), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x00000000, 0x00000010); # ID + write_le32(161); # Size + write_hunk_fix_endian(301688, 161); + + # + # Firmware 33, type: STD FW MTS (0x00000004), id: PAL/I (0000000000000010), size: 169 + # + + write_le32(0x00000004); # Type + write_le64(0x00000000, 0x00000010); # ID + write_le32(169); # Size + write_hunk_fix_endian(301856, 169); + + # + # Firmware 34, type: STD FW (0x00000000), id: SECAM/L AM (0000001000400000), size: 169 + # + + # + # Firmware 35, type: STD FW (0x00000000), id: SECAM/L NICAM (0000000c00400000), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x0000000c, 0x00400000); # ID + write_le32(161); # Size + write_hunk_fix_endian(302032, 161); + + # + # Firmware 36, type: STD FW (0x00000000), id: SECAM/Lc (0000000000800000), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x00000000, 0x00800000); # ID + write_le32(161); # Size + write_hunk_fix_endian(302200, 161); + + # + # Firmware 37, type: STD FW (0x00000000), id: NTSC/M Kr (0000000000008000), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x00000000, 0x00008000); # ID + write_le32(161); # Size + write_hunk_fix_endian(302368, 161); + + # + # Firmware 38, type: STD FW LCD (0x00001000), id: NTSC/M Kr (0000000000008000), size: 161 + # + + write_le32(0x00001000); # Type + write_le64(0x00000000, 0x00008000); # ID + write_le32(161); # Size + write_hunk_fix_endian(302536, 161); + + # + # Firmware 39, type: STD FW LCD NOGD (0x00003000), id: NTSC/M Kr (0000000000008000), size: 161 + # + + write_le32(0x00003000); # Type + write_le64(0x00000000, 0x00008000); # ID + write_le32(161); # Size + write_hunk_fix_endian(302704, 161); + + # + # Firmware 40, type: STD FW MTS (0x00000004), id: NTSC/M Kr (0000000000008000), size: 169 + # + + write_le32(0x00000004); # Type + write_le64(0x00000000, 0x00008000); # ID + write_le32(169); # Size + write_hunk_fix_endian(302872, 169); + + # + # Firmware 41, type: STD FW (0x00000000), id: NTSC PAL/M PAL/N (000000000000b700), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x00000000, 0x0000b700); # ID + write_le32(161); # Size + write_hunk_fix_endian(303048, 161); + + # + # Firmware 42, type: STD FW LCD (0x00001000), id: NTSC PAL/M PAL/N (000000000000b700), size: 161 + # + + write_le32(0x00001000); # Type + write_le64(0x00000000, 0x0000b700); # ID + write_le32(161); # Size + write_hunk_fix_endian(303216, 161); + + # + # Firmware 43, type: STD FW LCD NOGD (0x00003000), id: NTSC PAL/M PAL/N (000000000000b700), size: 161 + # + + write_le32(0x00003000); # Type + write_le64(0x00000000, 0x0000b700); # ID + write_le32(161); # Size + write_hunk_fix_endian(303384, 161); + + # + # Firmware 44, type: STD FW (0x00000000), id: NTSC/M Jp (0000000000002000), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x00000000, 0x00002000); # ID + write_le32(161); # Size + write_hunk_fix_endian(303552, 161); + + # + # Firmware 45, type: STD FW MTS (0x00000004), id: NTSC PAL/M PAL/N (000000000000b700), size: 169 + # + + write_le32(0x00000004); # Type + write_le64(0x00000000, 0x0000b700); # ID + write_le32(169); # Size + write_hunk_fix_endian(303720, 169); + + # + # Firmware 46, type: STD FW MTS LCD (0x00001004), id: NTSC PAL/M PAL/N (000000000000b700), size: 169 + # + + write_le32(0x00001004); # Type + write_le64(0x00000000, 0x0000b700); # ID + write_le32(169); # Size + write_hunk_fix_endian(303896, 169); + + # + # Firmware 47, type: STD FW MTS LCD NOGD (0x00003004), id: NTSC PAL/M PAL/N (000000000000b700), size: 169 + # + + write_le32(0x00003004); # Type + write_le64(0x00000000, 0x0000b700); # ID + write_le32(169); # Size + write_hunk_fix_endian(304072, 169); + + # + # Firmware 48, type: SCODE FW HAS IF (0x60000000), IF = 3.28 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(3280); # IF + write_le32(192); # Size + write_hunk(309048, 192); + + # + # Firmware 49, type: SCODE FW HAS IF (0x60000000), IF = 3.30 MHz id: (0000000000000000), size: 192 + # + +# write_le32(0x60000000); # Type +# write_le64(0x00000000, 0x00000000); # ID +# write_le16(3300); # IF +# write_le32(192); # Size +# write_hunk(304440, 192); + + # + # Firmware 50, type: SCODE FW HAS IF (0x60000000), IF = 3.44 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(3440); # IF + write_le32(192); # Size + write_hunk(309432, 192); + + # + # Firmware 51, type: SCODE FW HAS IF (0x60000000), IF = 3.46 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(3460); # IF + write_le32(192); # Size + write_hunk(309624, 192); + + # + # Firmware 52, type: SCODE FW DTV6 ATSC OREN36 HAS IF (0x60210020), IF = 3.80 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60210020); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(3800); # IF + write_le32(192); # Size + write_hunk(306936, 192); + + # + # Firmware 53, type: SCODE FW HAS IF (0x60000000), IF = 4.00 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(4000); # IF + write_le32(192); # Size + write_hunk(309240, 192); + + # + # Firmware 54, type: SCODE FW DTV6 ATSC TOYOTA388 HAS IF (0x60410020), IF = 4.08 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60410020); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(4080); # IF + write_le32(192); # Size + write_hunk(307128, 192); + + # + # Firmware 55, type: SCODE FW HAS IF (0x60000000), IF = 4.20 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(4200); # IF + write_le32(192); # Size + write_hunk(308856, 192); + + # + # Firmware 56, type: SCODE FW MONO HAS IF (0x60008000), IF = 4.32 MHz id: NTSC/M Kr (0000000000008000), size: 192 + # + + write_le32(0x60008000); # Type + write_le64(0x00000000, 0x00008000); # ID + write_le16(4320); # IF + write_le32(192); # Size + write_hunk(305208, 192); + + # + # Firmware 57, type: SCODE FW HAS IF (0x60000000), IF = 4.45 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(4450); # IF + write_le32(192); # Size + write_hunk(309816, 192); + + # + # Firmware 58, type: SCODE FW MTS LCD NOGD MONO IF HAS IF (0x6002b004), IF = 4.50 MHz id: NTSC PAL/M PAL/N (000000000000b700), size: 192 + # + + write_le32(0x6002b004); # Type + write_le64(0x00000000, 0x0000b700); # ID + write_le16(4500); # IF + write_le32(192); # Size + write_hunk(304824, 192); + + # + # Firmware 59, type: SCODE FW LCD NOGD IF HAS IF (0x60023000), IF = 4.60 MHz id: NTSC/M Kr (0000000000008000), size: 192 + # + + write_le32(0x60023000); # Type + write_le64(0x00000000, 0x00008000); # ID + write_le16(4600); # IF + write_le32(192); # Size + write_hunk(305016, 192); + + # + # Firmware 60, type: SCODE FW DTV6 QAM DTV7 DTV78 DTV8 ZARLINK456 HAS IF (0x620003e0), IF = 4.76 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x620003e0); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(4760); # IF + write_le32(192); # Size + write_hunk(304440, 192); + + # + # Firmware 61, type: SCODE FW HAS IF (0x60000000), IF = 4.94 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(4940); # IF + write_le32(192); # Size + write_hunk(308664, 192); + + # + # Firmware 62, type: SCODE FW HAS IF (0x60000000), IF = 5.26 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(5260); # IF + write_le32(192); # Size + write_hunk(307704, 192); + + # + # Firmware 63, type: SCODE FW MONO HAS IF (0x60008000), IF = 5.32 MHz id: PAL/BG A2 NICAM (0000000f00000007), size: 192 + # + + write_le32(0x60008000); # Type + write_le64(0x0000000f, 0x00000007); # ID + write_le16(5320); # IF + write_le32(192); # Size + write_hunk(307896, 192); + + # + # Firmware 64, type: SCODE FW DTV7 DTV78 DTV8 DIBCOM52 CHINA HAS IF (0x65000380), IF = 5.40 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x65000380); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(5400); # IF + write_le32(192); # Size + write_hunk(304248, 192); + + # + # Firmware 65, type: SCODE FW DTV6 ATSC OREN538 HAS IF (0x60110020), IF = 5.58 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60110020); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(5580); # IF + write_le32(192); # Size + write_hunk(306744, 192); + + # + # Firmware 66, type: SCODE FW HAS IF (0x60000000), IF = 5.64 MHz id: PAL/BG A2 (0000000300000007), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000003, 0x00000007); # ID + write_le16(5640); # IF + write_le32(192); # Size + write_hunk(305592, 192); + + # + # Firmware 67, type: SCODE FW HAS IF (0x60000000), IF = 5.74 MHz id: PAL/BG NICAM (0000000c00000007), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x0000000c, 0x00000007); # ID + write_le16(5740); # IF + write_le32(192); # Size + write_hunk(305784, 192); + + # + # Firmware 68, type: SCODE FW HAS IF (0x60000000), IF = 5.90 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(5900); # IF + write_le32(192); # Size + write_hunk(307512, 192); + + # + # Firmware 69, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.00 MHz id: PAL/DK PAL/I SECAM/K3 SECAM/L SECAM/Lc NICAM (0000000c04c000f0), size: 192 + # + + write_le32(0x60008000); # Type + write_le64(0x0000000c, 0x04c000f0); # ID + write_le16(6000); # IF + write_le32(192); # Size + write_hunk(305576, 192); + + # + # Firmware 70, type: SCODE FW DTV6 QAM ATSC LG60 F6MHZ HAS IF (0x68050060), IF = 6.20 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x68050060); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(6200); # IF + write_le32(192); # Size + write_hunk(306552, 192); + + # + # Firmware 71, type: SCODE FW HAS IF (0x60000000), IF = 6.24 MHz id: PAL/I (0000000000000010), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000000, 0x00000010); # ID + write_le16(6240); # IF + write_le32(192); # Size + write_hunk(305400, 192); + + # + # Firmware 72, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.32 MHz id: SECAM/K1 (0000000000200000), size: 192 + # + + write_le32(0x60008000); # Type + write_le64(0x00000000, 0x00200000); # ID + write_le16(6320); # IF + write_le32(192); # Size + write_hunk(308472, 192); + + # + # Firmware 73, type: SCODE FW HAS IF (0x60000000), IF = 6.34 MHz id: SECAM/K1 (0000000000200000), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000000, 0x00200000); # ID + write_le16(6340); # IF + write_le32(192); # Size + write_hunk(306360, 192); + + # + # Firmware 74, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.50 MHz id: PAL/DK SECAM/K3 SECAM/L NICAM (0000000c044000e0), size: 192 + # + + write_le32(0x60008000); # Type + write_le64(0x0000000c, 0x044000e0); # ID + write_le16(6500); # IF + write_le32(192); # Size + write_hunk(308280, 192); + + # + # Firmware 75, type: SCODE FW DTV6 ATSC ATI638 HAS IF (0x60090020), IF = 6.58 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60090020); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(6580); # IF + write_le32(192); # Size + write_hunk(304632, 192); + + # + # Firmware 76, type: SCODE FW HAS IF (0x60000000), IF = 6.60 MHz id: PAL/DK A2 (00000003000000e0), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000003, 0x000000e0); # ID + write_le16(6600); # IF + write_le32(192); # Size + write_hunk(306168, 192); + + # + # Firmware 77, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.68 MHz id: PAL/DK A2 (00000003000000e0), size: 192 + # + + write_le32(0x60008000); # Type + write_le64(0x00000003, 0x000000e0); # ID + write_le16(6680); # IF + write_le32(192); # Size + write_hunk(308088, 192); + + # + # Firmware 78, type: SCODE FW DTV6 ATSC TOYOTA794 HAS IF (0x60810020), IF = 8.14 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60810020); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(8140); # IF + write_le32(192); # Size + write_hunk(307320, 192); + + # + # Firmware 79, type: SCODE FW HAS IF (0x60000000), IF = 8.20 MHz id: (0000000000000000), size: 192 + # + +# write_le32(0x60000000); # Type +# write_le64(0x00000000, 0x00000000); # ID +# write_le16(8200); # IF +# write_le32(192); # Size +# write_hunk(308088, 192); +} + +sub main_firmware_27($$$$) +{ + my $out; + my $j=0; + my $outfile = shift; + my $name = shift; + my $version = shift; + my $nr_desc = shift; + + for ($j = length($name); $j <32; $j++) { + $name = $name.chr(0); + } + + open OUTFILE, ">$outfile"; + syswrite(OUTFILE, $name); + write_le16($version); + write_le16($nr_desc); + + # + # Firmware 0, type: BASE FW F8MHZ (0x00000003), id: (0000000000000000), size: 8718 + # + + write_le32(0x00000003); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(8718); # Size + write_hunk_fix_endian(813432, 8718); + + # + # Firmware 1, type: BASE FW F8MHZ MTS (0x00000007), id: (0000000000000000), size: 8712 + # + + write_le32(0x00000007); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(8712); # Size + write_hunk_fix_endian(822152, 8712); + + # + # Firmware 2, type: BASE FW FM (0x00000401), id: (0000000000000000), size: 8562 + # + + write_le32(0x00000401); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(8562); # Size + write_hunk_fix_endian(830872, 8562); + + # + # Firmware 3, type: BASE FW FM INPUT1 (0x00000c01), id: (0000000000000000), size: 8576 + # + + write_le32(0x00000c01); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(8576); # Size + write_hunk_fix_endian(839440, 8576); + + # + # Firmware 4, type: BASE FW (0x00000001), id: (0000000000000000), size: 8706 + # + + write_le32(0x00000001); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(8706); # Size + write_hunk_fix_endian(848024, 8706); + + # + # Firmware 5, type: BASE FW MTS (0x00000005), id: (0000000000000000), size: 8682 + # + + write_le32(0x00000005); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(8682); # Size + write_hunk_fix_endian(856736, 8682); + + # + # Firmware 6, type: STD FW (0x00000000), id: PAL/BG A2/A (0000000100000007), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x00000001, 0x00000007); # ID + write_le32(161); # Size + write_hunk_fix_endian(865424, 161); + + # + # Firmware 7, type: STD FW MTS (0x00000004), id: PAL/BG A2/A (0000000100000007), size: 169 + # + + write_le32(0x00000004); # Type + write_le64(0x00000001, 0x00000007); # ID + write_le32(169); # Size + write_hunk_fix_endian(865592, 169); + + # + # Firmware 8, type: STD FW (0x00000000), id: PAL/BG A2/B (0000000200000007), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x00000002, 0x00000007); # ID + write_le32(161); # Size + write_hunk_fix_endian(865424, 161); + + # + # Firmware 9, type: STD FW MTS (0x00000004), id: PAL/BG A2/B (0000000200000007), size: 169 + # + + write_le32(0x00000004); # Type + write_le64(0x00000002, 0x00000007); # ID + write_le32(169); # Size + write_hunk_fix_endian(865592, 169); + + # + # Firmware 10, type: STD FW (0x00000000), id: PAL/BG NICAM/A (0000000400000007), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x00000004, 0x00000007); # ID + write_le32(161); # Size + write_hunk_fix_endian(866112, 161); + + # + # Firmware 11, type: STD FW MTS (0x00000004), id: PAL/BG NICAM/A (0000000400000007), size: 169 + # + + write_le32(0x00000004); # Type + write_le64(0x00000004, 0x00000007); # ID + write_le32(169); # Size + write_hunk_fix_endian(866280, 169); + + # + # Firmware 12, type: STD FW (0x00000000), id: PAL/BG NICAM/B (0000000800000007), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x00000008, 0x00000007); # ID + write_le32(161); # Size + write_hunk_fix_endian(866112, 161); + + # + # Firmware 13, type: STD FW MTS (0x00000004), id: PAL/BG NICAM/B (0000000800000007), size: 169 + # + + write_le32(0x00000004); # Type + write_le64(0x00000008, 0x00000007); # ID + write_le32(169); # Size + write_hunk_fix_endian(866280, 169); + + # + # Firmware 14, type: STD FW (0x00000000), id: PAL/DK A2 (00000003000000e0), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x00000003, 0x000000e0); # ID + write_le32(161); # Size + write_hunk_fix_endian(866800, 161); + + # + # Firmware 15, type: STD FW MTS (0x00000004), id: PAL/DK A2 (00000003000000e0), size: 169 + # + + write_le32(0x00000004); # Type + write_le64(0x00000003, 0x000000e0); # ID + write_le32(169); # Size + write_hunk_fix_endian(866968, 169); + + # + # Firmware 16, type: STD FW (0x00000000), id: PAL/DK NICAM (0000000c000000e0), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x0000000c, 0x000000e0); # ID + write_le32(161); # Size + write_hunk_fix_endian(867144, 161); + + # + # Firmware 17, type: STD FW MTS (0x00000004), id: PAL/DK NICAM (0000000c000000e0), size: 169 + # + + write_le32(0x00000004); # Type + write_le64(0x0000000c, 0x000000e0); # ID + write_le32(169); # Size + write_hunk_fix_endian(867312, 169); + + # + # Firmware 18, type: STD FW (0x00000000), id: SECAM/K1 (0000000000200000), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x00000000, 0x00200000); # ID + write_le32(161); # Size + write_hunk_fix_endian(867488, 161); + + # + # Firmware 19, type: STD FW MTS (0x00000004), id: SECAM/K1 (0000000000200000), size: 169 + # + + write_le32(0x00000004); # Type + write_le64(0x00000000, 0x00200000); # ID + write_le32(169); # Size + write_hunk_fix_endian(867656, 169); + + # + # Firmware 20, type: STD FW (0x00000000), id: SECAM/K3 (0000000004000000), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x00000000, 0x04000000); # ID + write_le32(161); # Size + write_hunk_fix_endian(867832, 161); + + # + # Firmware 21, type: STD FW MTS (0x00000004), id: SECAM/K3 (0000000004000000), size: 169 + # + + write_le32(0x00000004); # Type + write_le64(0x00000000, 0x04000000); # ID + write_le32(169); # Size + write_hunk_fix_endian(868000, 169); + + # + # Firmware 22, type: STD FW D2633 DTV6 ATSC (0x00010030), id: (0000000000000000), size: 149 + # + + write_le32(0x00010030); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(149); # Size + write_hunk_fix_endian(868176, 149); + + # + # Firmware 23, type: STD FW D2620 DTV6 QAM (0x00000068), id: (0000000000000000), size: 149 + # + + write_le32(0x00000068); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(149); # Size + write_hunk_fix_endian(868336, 149); + + # + # Firmware 24, type: STD FW D2633 DTV6 QAM (0x00000070), id: (0000000000000000), size: 149 + # + + write_le32(0x00000070); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(149); # Size + write_hunk_fix_endian(868488, 149); + + # + # Firmware 25, type: STD FW D2620 DTV7 (0x00000088), id: (0000000000000000), size: 149 + # + + write_le32(0x00000088); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(149); # Size + write_hunk_fix_endian(868648, 149); + + # + # Firmware 26, type: STD FW D2633 DTV7 (0x00000090), id: (0000000000000000), size: 149 + # + + write_le32(0x00000090); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(149); # Size + write_hunk_fix_endian(868800, 149); + + # + # Firmware 27, type: STD FW D2620 DTV78 (0x00000108), id: (0000000000000000), size: 149 + # + + write_le32(0x00000108); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(149); # Size + write_hunk_fix_endian(868960, 149); + + # + # Firmware 28, type: STD FW D2633 DTV78 (0x00000110), id: (0000000000000000), size: 149 + # + + write_le32(0x00000110); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(149); # Size + write_hunk_fix_endian(869112, 149); + + # + # Firmware 29, type: STD FW D2620 DTV8 (0x00000208), id: (0000000000000000), size: 149 + # + + write_le32(0x00000208); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(149); # Size + write_hunk_fix_endian(868648, 149); + + # + # Firmware 30, type: STD FW D2633 DTV8 (0x00000210), id: (0000000000000000), size: 149 + # + + write_le32(0x00000210); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(149); # Size + write_hunk_fix_endian(868800, 149); + + # + # Firmware 31, type: STD FW FM (0x00000400), id: (0000000000000000), size: 135 + # + + write_le32(0x00000400); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le32(135); # Size + write_hunk_fix_endian(869584, 135); + + # + # Firmware 32, type: STD FW (0x00000000), id: PAL/I (0000000000000010), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x00000000, 0x00000010); # ID + write_le32(161); # Size + write_hunk_fix_endian(869728, 161); + + # + # Firmware 33, type: STD FW MTS (0x00000004), id: PAL/I (0000000000000010), size: 169 + # + + write_le32(0x00000004); # Type + write_le64(0x00000000, 0x00000010); # ID + write_le32(169); # Size + write_hunk_fix_endian(869896, 169); + + # + # Firmware 34, type: STD FW (0x00000000), id: SECAM/L AM (0000001000400000), size: 169 + # + + write_le32(0x00000000); # Type + write_le64(0x00000010, 0x00400000); # ID + write_le32(169); # Size + write_hunk_fix_endian(870072, 169); + + # + # Firmware 35, type: STD FW (0x00000000), id: SECAM/L NICAM (0000000c00400000), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x0000000c, 0x00400000); # ID + write_le32(161); # Size + write_hunk_fix_endian(870248, 161); + + # + # Firmware 36, type: STD FW (0x00000000), id: SECAM/Lc (0000000000800000), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x00000000, 0x00800000); # ID + write_le32(161); # Size + write_hunk_fix_endian(870416, 161); + + # + # Firmware 37, type: STD FW (0x00000000), id: NTSC/M Kr (0000000000008000), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x00000000, 0x00008000); # ID + write_le32(161); # Size + write_hunk_fix_endian(870584, 161); + + # + # Firmware 38, type: STD FW LCD (0x00001000), id: NTSC/M Kr (0000000000008000), size: 161 + # + + write_le32(0x00001000); # Type + write_le64(0x00000000, 0x00008000); # ID + write_le32(161); # Size + write_hunk_fix_endian(870752, 161); + + # + # Firmware 39, type: STD FW LCD NOGD (0x00003000), id: NTSC/M Kr (0000000000008000), size: 161 + # + + write_le32(0x00003000); # Type + write_le64(0x00000000, 0x00008000); # ID + write_le32(161); # Size + write_hunk_fix_endian(870920, 161); + + # + # Firmware 40, type: STD FW MTS (0x00000004), id: NTSC/M Kr (0000000000008000), size: 169 + # + + write_le32(0x00000004); # Type + write_le64(0x00000000, 0x00008000); # ID + write_le32(169); # Size + write_hunk_fix_endian(871088, 169); + + # + # Firmware 41, type: STD FW (0x00000000), id: NTSC PAL/M PAL/N (000000000000b700), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x00000000, 0x0000b700); # ID + write_le32(161); # Size + write_hunk_fix_endian(871264, 161); + + # + # Firmware 42, type: STD FW LCD (0x00001000), id: NTSC PAL/M PAL/N (000000000000b700), size: 161 + # + + write_le32(0x00001000); # Type + write_le64(0x00000000, 0x0000b700); # ID + write_le32(161); # Size + write_hunk_fix_endian(871432, 161); + + # + # Firmware 43, type: STD FW LCD NOGD (0x00003000), id: NTSC PAL/M PAL/N (000000000000b700), size: 161 + # + + write_le32(0x00003000); # Type + write_le64(0x00000000, 0x0000b700); # ID + write_le32(161); # Size + write_hunk_fix_endian(871600, 161); + + # + # Firmware 44, type: STD FW (0x00000000), id: NTSC/M Jp (0000000000002000), size: 161 + # + + write_le32(0x00000000); # Type + write_le64(0x00000000, 0x00002000); # ID + write_le32(161); # Size + write_hunk_fix_endian(871264, 161); + + # + # Firmware 45, type: STD FW MTS (0x00000004), id: NTSC PAL/M PAL/N (000000000000b700), size: 169 + # + + write_le32(0x00000004); # Type + write_le64(0x00000000, 0x0000b700); # ID + write_le32(169); # Size + write_hunk_fix_endian(871936, 169); + + # + # Firmware 46, type: STD FW MTS LCD (0x00001004), id: NTSC PAL/M PAL/N (000000000000b700), size: 169 + # + + write_le32(0x00001004); # Type + write_le64(0x00000000, 0x0000b700); # ID + write_le32(169); # Size + write_hunk_fix_endian(872112, 169); + + # + # Firmware 47, type: STD FW MTS LCD NOGD (0x00003004), id: NTSC PAL/M PAL/N (000000000000b700), size: 169 + # + + write_le32(0x00003004); # Type + write_le64(0x00000000, 0x0000b700); # ID + write_le32(169); # Size + write_hunk_fix_endian(872288, 169); + + # + # Firmware 48, type: SCODE FW HAS IF (0x60000000), IF = 3.28 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(3280); # IF + write_le32(192); # Size + write_hunk(811896, 192); + + # + # Firmware 49, type: SCODE FW HAS IF (0x60000000), IF = 3.30 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(3300); # IF + write_le32(192); # Size + write_hunk(813048, 192); + + # + # Firmware 50, type: SCODE FW HAS IF (0x60000000), IF = 3.44 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(3440); # IF + write_le32(192); # Size + write_hunk(812280, 192); + + # + # Firmware 51, type: SCODE FW HAS IF (0x60000000), IF = 3.46 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(3460); # IF + write_le32(192); # Size + write_hunk(812472, 192); + + # + # Firmware 52, type: SCODE FW DTV6 ATSC OREN36 HAS IF (0x60210020), IF = 3.80 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60210020); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(3800); # IF + write_le32(192); # Size + write_hunk(809784, 192); + + # + # Firmware 53, type: SCODE FW HAS IF (0x60000000), IF = 4.00 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(4000); # IF + write_le32(192); # Size + write_hunk(812088, 192); + + # + # Firmware 54, type: SCODE FW DTV6 ATSC TOYOTA388 HAS IF (0x60410020), IF = 4.08 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60410020); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(4080); # IF + write_le32(192); # Size + write_hunk(809976, 192); + + # + # Firmware 55, type: SCODE FW HAS IF (0x60000000), IF = 4.20 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(4200); # IF + write_le32(192); # Size + write_hunk(811704, 192); + + # + # Firmware 56, type: SCODE FW MONO HAS IF (0x60008000), IF = 4.32 MHz id: NTSC/M Kr (0000000000008000), size: 192 + # + + write_le32(0x60008000); # Type + write_le64(0x00000000, 0x00008000); # ID + write_le16(4320); # IF + write_le32(192); # Size + write_hunk(808056, 192); + + # + # Firmware 57, type: SCODE FW HAS IF (0x60000000), IF = 4.45 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(4450); # IF + write_le32(192); # Size + write_hunk(812664, 192); + + # + # Firmware 58, type: SCODE FW MTS LCD NOGD MONO IF HAS IF (0x6002b004), IF = 4.50 MHz id: NTSC PAL/M PAL/N (000000000000b700), size: 192 + # + + write_le32(0x6002b004); # Type + write_le64(0x00000000, 0x0000b700); # ID + write_le16(4500); # IF + write_le32(192); # Size + write_hunk(807672, 192); + + # + # Firmware 59, type: SCODE FW LCD NOGD IF HAS IF (0x60023000), IF = 4.60 MHz id: NTSC/M Kr (0000000000008000), size: 192 + # + + write_le32(0x60023000); # Type + write_le64(0x00000000, 0x00008000); # ID + write_le16(4600); # IF + write_le32(192); # Size + write_hunk(807864, 192); + + # + # Firmware 60, type: SCODE FW DTV6 QAM DTV7 DTV78 DTV8 ZARLINK456 HAS IF (0x620003e0), IF = 4.76 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x620003e0); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(4760); # IF + write_le32(192); # Size + write_hunk(807288, 192); + + # + # Firmware 61, type: SCODE FW HAS IF (0x60000000), IF = 4.94 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(4940); # IF + write_le32(192); # Size + write_hunk(811512, 192); + + # + # Firmware 62, type: SCODE FW HAS IF (0x60000000), IF = 5.26 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(5260); # IF + write_le32(192); # Size + write_hunk(810552, 192); + + # + # Firmware 63, type: SCODE FW MONO HAS IF (0x60008000), IF = 5.32 MHz id: PAL/BG A2 NICAM (0000000f00000007), size: 192 + # + + write_le32(0x60008000); # Type + write_le64(0x0000000f, 0x00000007); # ID + write_le16(5320); # IF + write_le32(192); # Size + write_hunk(810744, 192); + + # + # Firmware 64, type: SCODE FW DTV7 DTV78 DTV8 DIBCOM52 CHINA HAS IF (0x65000380), IF = 5.40 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x65000380); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(5400); # IF + write_le32(192); # Size + write_hunk(807096, 192); + + # + # Firmware 65, type: SCODE FW DTV6 ATSC OREN538 HAS IF (0x60110020), IF = 5.58 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60110020); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(5580); # IF + write_le32(192); # Size + write_hunk(809592, 192); + + # + # Firmware 66, type: SCODE FW HAS IF (0x60000000), IF = 5.64 MHz id: PAL/BG A2 (0000000300000007), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000003, 0x00000007); # ID + write_le16(5640); # IF + write_le32(192); # Size + write_hunk(808440, 192); + + # + # Firmware 67, type: SCODE FW HAS IF (0x60000000), IF = 5.74 MHz id: PAL/BG NICAM (0000000c00000007), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x0000000c, 0x00000007); # ID + write_le16(5740); # IF + write_le32(192); # Size + write_hunk(808632, 192); + + # + # Firmware 68, type: SCODE FW HAS IF (0x60000000), IF = 5.90 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(5900); # IF + write_le32(192); # Size + write_hunk(810360, 192); + + # + # Firmware 69, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.00 MHz id: PAL/DK PAL/I SECAM/K3 SECAM/L SECAM/Lc NICAM (0000000c04c000f0), size: 192 + # + + write_le32(0x60008000); # Type + write_le64(0x0000000c, 0x04c000f0); # ID + write_le16(6000); # IF + write_le32(192); # Size + write_hunk(808824, 192); + + # + # Firmware 70, type: SCODE FW DTV6 QAM ATSC LG60 F6MHZ HAS IF (0x68050060), IF = 6.20 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x68050060); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(6200); # IF + write_le32(192); # Size + write_hunk(809400, 192); + + # + # Firmware 71, type: SCODE FW HAS IF (0x60000000), IF = 6.24 MHz id: PAL/I (0000000000000010), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000000, 0x00000010); # ID + write_le16(6240); # IF + write_le32(192); # Size + write_hunk(808248, 192); + + # + # Firmware 72, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.32 MHz id: SECAM/K1 (0000000000200000), size: 192 + # + + write_le32(0x60008000); # Type + write_le64(0x00000000, 0x00200000); # ID + write_le16(6320); # IF + write_le32(192); # Size + write_hunk(811320, 192); + + # + # Firmware 73, type: SCODE FW HAS IF (0x60000000), IF = 6.34 MHz id: SECAM/K1 (0000000000200000), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000000, 0x00200000); # ID + write_le16(6340); # IF + write_le32(192); # Size + write_hunk(809208, 192); + + # + # Firmware 74, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.50 MHz id: PAL/DK SECAM/K3 SECAM/L NICAM (0000000c044000e0), size: 192 + # + + write_le32(0x60008000); # Type + write_le64(0x0000000c, 0x044000e0); # ID + write_le16(6500); # IF + write_le32(192); # Size + write_hunk(811128, 192); + + # + # Firmware 75, type: SCODE FW DTV6 ATSC ATI638 HAS IF (0x60090020), IF = 6.58 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60090020); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(6580); # IF + write_le32(192); # Size + write_hunk(807480, 192); + + # + # Firmware 76, type: SCODE FW HAS IF (0x60000000), IF = 6.60 MHz id: PAL/DK A2 (00000003000000e0), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000003, 0x000000e0); # ID + write_le16(6600); # IF + write_le32(192); # Size + write_hunk(809016, 192); + + # + # Firmware 77, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.68 MHz id: PAL/DK A2 (00000003000000e0), size: 192 + # + + write_le32(0x60008000); # Type + write_le64(0x00000003, 0x000000e0); # ID + write_le16(6680); # IF + write_le32(192); # Size + write_hunk(810936, 192); + + # + # Firmware 78, type: SCODE FW DTV6 ATSC TOYOTA794 HAS IF (0x60810020), IF = 8.14 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60810020); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(8140); # IF + write_le32(192); # Size + write_hunk(810168, 192); + + # + # Firmware 79, type: SCODE FW HAS IF (0x60000000), IF = 8.20 MHz id: (0000000000000000), size: 192 + # + + write_le32(0x60000000); # Type + write_le64(0x00000000, 0x00000000); # ID + write_le16(8200); # IF + write_le32(192); # Size + write_hunk(812856, 192); +} + + +sub extract_firmware { + my $sourcefile_24 = "UDXTTM6000.sys"; + my $hash_24 = "cb9deb5508a5e150af2880f5b0066d78"; + my $outfile_24 = "xc3028-v24.fw"; + my $name_24 = "xc2028 firmware"; + my $version_24 = 516; + my $nr_desc_24 = 77; + my $out; + + my $sourcefile_27 = "hcw85bda.sys"; + my $hash_27 = "0e44dbf63bb0169d57446aec21881ff2"; + my $outfile_27 = "xc3028-v27.fw"; + my $name_27 = "xc2028 firmware"; + my $version_27 = 519; + my $nr_desc_27 = 80; + my $out; + + if (-e $sourcefile_24) { + verify($sourcefile_24, $hash_24); + + open INFILE, "<$sourcefile_24"; + main_firmware_24($outfile_24, $name_24, $version_24, $nr_desc_24); + close INFILE; + } + + if (-e $sourcefile_27) { + verify($sourcefile_27, $hash_27); + + open INFILE, "<$sourcefile_27"; + main_firmware_27($outfile_27, $name_27, $version_27, $nr_desc_27); + close INFILE; + } +} + +extract_firmware; +printf "Firmwares generated.\n"; diff --git a/src/net/scripts/faddr2line b/src/net/scripts/faddr2line new file mode 100755 index 0000000..94ed98d --- /dev/null +++ b/src/net/scripts/faddr2line @@ -0,0 +1,289 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 +# +# Translate stack dump function offsets. +# +# addr2line doesn't work with KASLR addresses. This works similarly to +# addr2line, but instead takes the 'func+0x123' format as input: +# +# $ ./scripts/faddr2line ~/k/vmlinux meminfo_proc_show+0x5/0x568 +# meminfo_proc_show+0x5/0x568: +# meminfo_proc_show at fs/proc/meminfo.c:27 +# +# If the address is part of an inlined function, the full inline call chain is +# printed: +# +# $ ./scripts/faddr2line ~/k/vmlinux native_write_msr+0x6/0x27 +# native_write_msr+0x6/0x27: +# arch_static_branch at arch/x86/include/asm/msr.h:121 +# (inlined by) static_key_false at include/linux/jump_label.h:125 +# (inlined by) native_write_msr at arch/x86/include/asm/msr.h:125 +# +# The function size after the '/' in the input is optional, but recommended. +# It's used to help disambiguate any duplicate symbol names, which can occur +# rarely. If the size is omitted for a duplicate symbol then it's possible for +# multiple code sites to be printed: +# +# $ ./scripts/faddr2line ~/k/vmlinux raw_ioctl+0x5 +# raw_ioctl+0x5/0x20: +# raw_ioctl at drivers/char/raw.c:122 +# +# raw_ioctl+0x5/0xb1: +# raw_ioctl at net/ipv4/raw.c:876 +# +# Multiple addresses can be specified on a single command line: +# +# $ ./scripts/faddr2line ~/k/vmlinux type_show+0x10/45 free_reserved_area+0x90 +# type_show+0x10/0x2d: +# type_show at drivers/video/backlight/backlight.c:213 +# +# free_reserved_area+0x90/0x123: +# free_reserved_area at mm/page_alloc.c:6429 (discriminator 2) + + +set -o errexit +set -o nounset + +usage() { + echo "usage: faddr2line [--list] <object file> <func+offset> <func+offset>..." >&2 + exit 1 +} + +warn() { + echo "$1" >&2 +} + +die() { + echo "ERROR: $1" >&2 + exit 1 +} + +READELF="${CROSS_COMPILE:-}readelf" +ADDR2LINE="${CROSS_COMPILE:-}addr2line" +AWK="awk" + +command -v ${AWK} >/dev/null 2>&1 || die "${AWK} isn't installed" +command -v ${READELF} >/dev/null 2>&1 || die "${READELF} isn't installed" +command -v ${ADDR2LINE} >/dev/null 2>&1 || die "${ADDR2LINE} isn't installed" + +# Try to figure out the source directory prefix so we can remove it from the +# addr2line output. HACK ALERT: This assumes that start_kernel() is in +# init/main.c! This only works for vmlinux. Otherwise it falls back to +# printing the absolute path. +find_dir_prefix() { + local objfile=$1 + + local start_kernel_addr=$(${READELF} --symbols --wide $objfile | ${AWK} '$8 == "start_kernel" {printf "0x%s", $2}') + [[ -z $start_kernel_addr ]] && return + + local file_line=$(${ADDR2LINE} -e $objfile $start_kernel_addr) + [[ -z $file_line ]] && return + + local prefix=${file_line%init/main.c:*} + if [[ -z $prefix ]] || [[ $prefix = $file_line ]]; then + return + fi + + DIR_PREFIX=$prefix + return 0 +} + +__faddr2line() { + local objfile=$1 + local func_addr=$2 + local dir_prefix=$3 + local print_warnings=$4 + + local sym_name=${func_addr%+*} + local func_offset=${func_addr#*+} + func_offset=${func_offset%/*} + local user_size= + local file_type + local is_vmlinux=0 + [[ $func_addr =~ "/" ]] && user_size=${func_addr#*/} + + if [[ -z $sym_name ]] || [[ -z $func_offset ]] || [[ $sym_name = $func_addr ]]; then + warn "bad func+offset $func_addr" + DONE=1 + return + fi + + # vmlinux uses absolute addresses in the section table rather than + # section offsets. + local file_type=$(${READELF} --file-header $objfile | + ${AWK} '$1 == "Type:" { print $2; exit }') + [[ $file_type = "EXEC" ]] && is_vmlinux=1 + + # Go through each of the object's symbols which match the func name. + # In rare cases there might be duplicates, in which case we print all + # matches. + while read line; do + local fields=($line) + local sym_addr=0x${fields[1]} + local sym_elf_size=${fields[2]} + local sym_sec=${fields[6]} + local sec_size + local sec_name + + # Get the section size: + sec_size=$(${READELF} --section-headers --wide $objfile | + sed 's/\[ /\[/' | + ${AWK} -v sec=$sym_sec '$1 == "[" sec "]" { print "0x" $6; exit }') + + if [[ -z $sec_size ]]; then + warn "bad section size: section: $sym_sec" + DONE=1 + return + fi + + # Get the section name: + sec_name=$(${READELF} --section-headers --wide $objfile | + sed 's/\[ /\[/' | + ${AWK} -v sec=$sym_sec '$1 == "[" sec "]" { print $2; exit }') + + if [[ -z $sec_name ]]; then + warn "bad section name: section: $sym_sec" + DONE=1 + return + fi + + # Calculate the symbol size. + # + # Unfortunately we can't use the ELF size, because kallsyms + # also includes the padding bytes in its size calculation. For + # kallsyms, the size calculation is the distance between the + # symbol and the next symbol in a sorted list. + local sym_size + local cur_sym_addr + local found=0 + while read line; do + local fields=($line) + cur_sym_addr=0x${fields[1]} + local cur_sym_elf_size=${fields[2]} + local cur_sym_name=${fields[7]:-} + + if [[ $cur_sym_addr = $sym_addr ]] && + [[ $cur_sym_elf_size = $sym_elf_size ]] && + [[ $cur_sym_name = $sym_name ]]; then + found=1 + continue + fi + + if [[ $found = 1 ]]; then + sym_size=$(($cur_sym_addr - $sym_addr)) + [[ $sym_size -lt $sym_elf_size ]] && continue; + found=2 + break + fi + done < <(${READELF} --symbols --wide $objfile | ${AWK} -v sec=$sym_sec '$7 == sec' | sort --key=2) + + if [[ $found = 0 ]]; then + warn "can't find symbol: sym_name: $sym_name sym_sec: $sym_sec sym_addr: $sym_addr sym_elf_size: $sym_elf_size" + DONE=1 + return + fi + + # If nothing was found after the symbol, assume it's the last + # symbol in the section. + [[ $found = 1 ]] && sym_size=$(($sec_size - $sym_addr)) + + if [[ -z $sym_size ]] || [[ $sym_size -le 0 ]]; then + warn "bad symbol size: sym_addr: $sym_addr cur_sym_addr: $cur_sym_addr" + DONE=1 + return + fi + + sym_size=0x$(printf %x $sym_size) + + # Calculate the address from user-supplied offset: + local addr=$(($sym_addr + $func_offset)) + if [[ -z $addr ]] || [[ $addr = 0 ]]; then + warn "bad address: $sym_addr + $func_offset" + DONE=1 + return + fi + addr=0x$(printf %x $addr) + + # If the user provided a size, make sure it matches the symbol's size: + if [[ -n $user_size ]] && [[ $user_size -ne $sym_size ]]; then + [[ $print_warnings = 1 ]] && + echo "skipping $sym_name address at $addr due to size mismatch ($user_size != $sym_size)" + continue; + fi + + # Make sure the provided offset is within the symbol's range: + if [[ $func_offset -gt $sym_size ]]; then + [[ $print_warnings = 1 ]] && + echo "skipping $sym_name address at $addr due to size mismatch ($func_offset > $sym_size)" + continue + fi + + # In case of duplicates or multiple addresses specified on the + # cmdline, separate multiple entries with a blank line: + [[ $FIRST = 0 ]] && echo + FIRST=0 + + echo "$sym_name+$func_offset/$sym_size:" + + # Pass section address to addr2line and strip absolute paths + # from the output: + local args="--functions --pretty-print --inlines --exe=$objfile" + [[ $is_vmlinux = 0 ]] && args="$args --section=$sec_name" + local output=$(${ADDR2LINE} $args $addr | sed "s; $dir_prefix\(\./\)*; ;") + [[ -z $output ]] && continue + + # Default output (non --list): + if [[ $LIST = 0 ]]; then + echo "$output" | while read -r line + do + echo $line + done + DONE=1; + continue + fi + + # For --list, show each line with its corresponding source code: + echo "$output" | while read -r line + do + echo + echo $line + n=$(echo $line | sed 's/.*:\([0-9]\+\).*/\1/g') + n1=$[$n-5] + n2=$[$n+5] + f=$(echo $line | sed 's/.*at \(.\+\):.*/\1/g') + ${AWK} 'NR>=strtonum("'$n1'") && NR<=strtonum("'$n2'") { if (NR=='$n') printf(">%d<", NR); else printf(" %d ", NR); printf("\t%s\n", $0)}' $f + done + + DONE=1 + + done < <(${READELF} --symbols --wide $objfile | ${AWK} -v fn=$sym_name '$4 == "FUNC" && $8 == fn') +} + +[[ $# -lt 2 ]] && usage + +objfile=$1 + +LIST=0 +[[ "$objfile" == "--list" ]] && LIST=1 && shift && objfile=$1 + +[[ ! -f $objfile ]] && die "can't find objfile $objfile" +shift + +DIR_PREFIX=supercalifragilisticexpialidocious +find_dir_prefix $objfile + +FIRST=1 +while [[ $# -gt 0 ]]; do + func_addr=$1 + shift + + # print any matches found + DONE=0 + __faddr2line $objfile $func_addr $DIR_PREFIX 0 + + # if no match was found, print warnings + if [[ $DONE = 0 ]]; then + __faddr2line $objfile $func_addr $DIR_PREFIX 1 + warn "no match for $func_addr" + fi +done diff --git a/src/net/scripts/file-size.sh b/src/net/scripts/file-size.sh new file mode 100755 index 0000000..7eb7423 --- /dev/null +++ b/src/net/scripts/file-size.sh @@ -0,0 +1,4 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +set -- $(ls -dn "$1") +printf '%s\n' "$5" diff --git a/src/net/scripts/find-unused-docs.sh b/src/net/scripts/find-unused-docs.sh new file mode 100755 index 0000000..ee6a50e --- /dev/null +++ b/src/net/scripts/find-unused-docs.sh @@ -0,0 +1,62 @@ +#!/bin/bash +# (c) 2017, Jonathan Corbet <corbet@lwn.net> +# sayli karnik <karniksayli1995@gmail.com> +# +# This script detects files with kernel-doc comments for exported functions +# that are not included in documentation. +# +# usage: Run 'scripts/find-unused-docs.sh directory' from top level of kernel +# tree. +# +# example: $scripts/find-unused-docs.sh drivers/scsi +# +# Licensed under the terms of the GNU GPL License + +if ! [ -d "Documentation" ]; then + echo "Run from top level of kernel tree" + exit 1 +fi + +if [ "$#" -ne 1 ]; then + echo "Usage: scripts/find-unused-docs.sh directory" + exit 1 +fi + +if ! [ -d "$1" ]; then + echo "Directory $1 doesn't exist" + exit 1 +fi + +cd "$( dirname "${BASH_SOURCE[0]}" )" +cd .. + +cd Documentation/ + +echo "The following files contain kerneldoc comments for exported functions \ +that are not used in the formatted documentation" + +# FILES INCLUDED + +files_included=($(grep -rHR ".. kernel-doc" --include \*.rst | cut -d " " -f 3)) + +declare -A FILES_INCLUDED + +for each in "${files_included[@]}"; do + FILES_INCLUDED[$each]="$each" + done + +cd .. + +# FILES NOT INCLUDED + +for file in `find $1 -name '*.c'`; do + + if [[ ${FILES_INCLUDED[$file]+_} ]]; then + continue; + fi + str=$(scripts/kernel-doc -export "$file" 2>/dev/null) + if [[ -n "$str" ]]; then + echo "$file" + fi + done + diff --git a/src/net/scripts/gcc-goto.sh b/src/net/scripts/gcc-goto.sh new file mode 100755 index 0000000..8b980fb --- /dev/null +++ b/src/net/scripts/gcc-goto.sh @@ -0,0 +1,22 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# Test for gcc 'asm goto' support +# Copyright (C) 2010, Jason Baron <jbaron@redhat.com> + +cat << "END" | $@ -x c - -fno-PIE -c -o /dev/null +int main(void) +{ +#if defined(__arm__) || defined(__aarch64__) + /* + * Not related to asm goto, but used by jump label + * and broken on some ARM GCC versions (see GCC Bug 48637). + */ + static struct { int dummy; int state; } tp; + asm (".long %c0" :: "i" (&tp.state)); +#endif + +entry: + asm goto ("" :::: entry); + return 0; +} +END diff --git a/src/net/scripts/gcc-ld b/src/net/scripts/gcc-ld new file mode 100755 index 0000000..997b818 --- /dev/null +++ b/src/net/scripts/gcc-ld @@ -0,0 +1,30 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# run gcc with ld options +# used as a wrapper to execute link time optimizations +# yes virginia, this is not pretty + +ARGS="-nostdlib" + +while [ "$1" != "" ] ; do + case "$1" in + -save-temps|-m32|-m64) N="$1" ;; + -r) N="$1" ;; + -[Wg]*) N="$1" ;; + -[olv]|-[Ofd]*|-nostdlib) N="$1" ;; + --end-group|--start-group) + N="-Wl,$1" ;; + -[RTFGhIezcbyYu]*|\ +--script|--defsym|-init|-Map|--oformat|-rpath|\ +-rpath-link|--sort-section|--section-start|-Tbss|-Tdata|-Ttext|\ +--version-script|--dynamic-list|--version-exports-symbol|--wrap|-m) + A="$1" ; shift ; N="-Wl,$A,$1" ;; + -[m]*) N="$1" ;; + -*) N="-Wl,$1" ;; + *) N="$1" ;; + esac + ARGS="$ARGS $N" + shift +done + +exec $CC $ARGS diff --git a/src/net/scripts/gcc-plugins/.gitignore b/src/net/scripts/gcc-plugins/.gitignore new file mode 100644 index 0000000..b04e0f0 --- /dev/null +++ b/src/net/scripts/gcc-plugins/.gitignore @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: GPL-2.0-only +randomize_layout_seed.h diff --git a/src/net/scripts/gcc-plugins/Kconfig b/src/net/scripts/gcc-plugins/Kconfig new file mode 100644 index 0000000..ab9eb4c --- /dev/null +++ b/src/net/scripts/gcc-plugins/Kconfig @@ -0,0 +1,107 @@ +# SPDX-License-Identifier: GPL-2.0-only +config HAVE_GCC_PLUGINS + bool + help + An arch should select this symbol if it supports building with + GCC plugins. + +menuconfig GCC_PLUGINS + bool "GCC plugins" + depends on HAVE_GCC_PLUGINS + depends on CC_IS_GCC + depends on $(success,test -e $(shell,$(CC) -print-file-name=plugin)/include/plugin-version.h) + default y + help + GCC plugins are loadable modules that provide extra features to the + compiler. They are useful for runtime instrumentation and static analysis. + + See Documentation/kbuild/gcc-plugins.rst for details. + +if GCC_PLUGINS + +config GCC_PLUGIN_CYC_COMPLEXITY + bool "Compute the cyclomatic complexity of a function" if EXPERT + depends on !COMPILE_TEST # too noisy + help + The complexity M of a function's control flow graph is defined as: + M = E - N + 2P + where + + E = the number of edges + N = the number of nodes + P = the number of connected components (exit nodes). + + Enabling this plugin reports the complexity to stderr during the + build. It mainly serves as a simple example of how to create a + gcc plugin for the kernel. + +config GCC_PLUGIN_SANCOV + bool + help + This plugin inserts a __sanitizer_cov_trace_pc() call at the start of + basic blocks. It supports all gcc versions with plugin support (from + gcc-4.5 on). It is based on the commit "Add fuzzing coverage support" + by Dmitry Vyukov <dvyukov@google.com>. + +config GCC_PLUGIN_LATENT_ENTROPY + bool "Generate some entropy during boot and runtime" + help + By saying Y here the kernel will instrument some kernel code to + extract some entropy from both original and artificially created + program state. This will help especially embedded systems where + there is little 'natural' source of entropy normally. The cost + is some slowdown of the boot process (about 0.5%) and fork and + irq processing. + + Note that entropy extracted this way is not cryptographically + secure! + + This plugin was ported from grsecurity/PaX. More information at: + * https://grsecurity.net/ + * https://pax.grsecurity.net/ + +config GCC_PLUGIN_RANDSTRUCT + bool "Randomize layout of sensitive kernel structures" + select MODVERSIONS if MODULES + help + If you say Y here, the layouts of structures that are entirely + function pointers (and have not been manually annotated with + __no_randomize_layout), or structures that have been explicitly + marked with __randomize_layout, will be randomized at compile-time. + This can introduce the requirement of an additional information + exposure vulnerability for exploits targeting these structure + types. + + Enabling this feature will introduce some performance impact, + slightly increase memory usage, and prevent the use of forensic + tools like Volatility against the system (unless the kernel + source tree isn't cleaned after kernel installation). + + The seed used for compilation is located at + scripts/gcc-plugins/randomize_layout_seed.h. It remains after + a make clean to allow for external modules to be compiled with + the existing seed and will be removed by a make mrproper or + make distclean. + + Note that the implementation requires gcc 4.7 or newer. + + This plugin was ported from grsecurity/PaX. More information at: + * https://grsecurity.net/ + * https://pax.grsecurity.net/ + +config GCC_PLUGIN_RANDSTRUCT_PERFORMANCE + bool "Use cacheline-aware structure randomization" + depends on GCC_PLUGIN_RANDSTRUCT + depends on !COMPILE_TEST # do not reduce test coverage + help + If you say Y here, the RANDSTRUCT randomization will make a + best effort at restricting randomization to cacheline-sized + groups of elements. It will further not randomize bitfields + in structures. This reduces the performance hit of RANDSTRUCT + at the cost of weakened randomization. + +config GCC_PLUGIN_ARM_SSP_PER_TASK + bool + depends on GCC_PLUGINS && ARM + +endif diff --git a/src/net/scripts/gcc-plugins/Makefile b/src/net/scripts/gcc-plugins/Makefile new file mode 100644 index 0000000..b5487cc --- /dev/null +++ b/src/net/scripts/gcc-plugins/Makefile @@ -0,0 +1,61 @@ +# SPDX-License-Identifier: GPL-2.0 + +$(obj)/randomize_layout_plugin.so: $(objtree)/$(obj)/randomize_layout_seed.h +quiet_cmd_create_randomize_layout_seed = GENSEED $@ +cmd_create_randomize_layout_seed = \ + $(CONFIG_SHELL) $(srctree)/$(src)/gen-random-seed.sh $@ $(objtree)/include/generated/randomize_layout_hash.h +$(objtree)/$(obj)/randomize_layout_seed.h: FORCE + $(call if_changed,create_randomize_layout_seed) +targets += randomize_layout_seed.h randomize_layout_hash.h + +# Build rules for plugins +# +# No extra code is needed for single-file plugins. +# For multi-file plugins, use *-objs syntax to list the objects. +# +# If the plugin foo.so is compiled from foo.c and foo2.c, you can do: +# +# foo-objs := foo.o foo2.o + +always-y += $(GCC_PLUGIN) + +GCC_PLUGINS_DIR = $(shell $(CC) -print-file-name=plugin) + +plugin_cxxflags = -Wp,-MMD,$(depfile) $(KBUILD_HOSTCXXFLAGS) -fPIC \ + -I $(GCC_PLUGINS_DIR)/include -I $(obj) -std=gnu++11 \ + -fno-rtti -fno-exceptions -fasynchronous-unwind-tables \ + -ggdb -Wno-narrowing -Wno-unused-variable \ + -Wno-format-diag + +plugin_ldflags = -shared + +plugin-single := $(foreach m, $(GCC_PLUGIN), $(if $($(m:%.so=%-objs)),,$(m))) +plugin-multi := $(filter-out $(plugin-single), $(GCC_PLUGIN)) +plugin-objs := $(sort $(foreach m, $(plugin-multi), $($(m:%.so=%-objs)))) + +targets += $(plugin-single) $(plugin-multi) $(plugin-objs) +clean-files += *.so + +plugin-single := $(addprefix $(obj)/, $(plugin-single)) +plugin-multi := $(addprefix $(obj)/, $(plugin-multi)) +plugin-objs := $(addprefix $(obj)/, $(plugin-objs)) + +quiet_cmd_plugin_cxx_so_c = HOSTCXX $@ + cmd_plugin_cxx_so_c = $(HOSTCXX) $(plugin_cxxflags) $(plugin_ldflags) -o $@ $< + +$(plugin-single): $(obj)/%.so: $(src)/%.c FORCE + $(call if_changed_dep,plugin_cxx_so_c) + +quiet_cmd_plugin_ld_so_o = HOSTLD $@ + cmd_plugin_ld_so_o = $(HOSTCXX) $(plugin_ldflags) -o $@ \ + $(addprefix $(obj)/, $($(target-stem)-objs)) + +$(plugin-multi): FORCE + $(call if_changed,plugin_ld_so_o) +$(foreach m, $(notdir $(plugin-multi)), $(eval $(obj)/$m: $(addprefix $(obj)/, $($(m:%.so=%-objs))))) + +quiet_cmd_plugin_cxx_o_c = HOSTCXX $@ + cmd_plugin_cxx_o_c = $(HOSTCXX) $(plugin_cxxflags) -c -o $@ $< + +$(plugin-objs): $(obj)/%.o: $(src)/%.c FORCE + $(call if_changed_dep,plugin_cxx_o_c) diff --git a/src/net/scripts/gcc-plugins/arm_ssp_per_task_plugin.c b/src/net/scripts/gcc-plugins/arm_ssp_per_task_plugin.c new file mode 100644 index 0000000..8c1af9b --- /dev/null +++ b/src/net/scripts/gcc-plugins/arm_ssp_per_task_plugin.c @@ -0,0 +1,122 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include "gcc-common.h" + +__visible int plugin_is_GPL_compatible; + +static unsigned int sp_mask, canary_offset; + +static unsigned int arm_pertask_ssp_rtl_execute(void) +{ + rtx_insn *insn; + + for (insn = get_insns(); insn; insn = NEXT_INSN(insn)) { + const char *sym; + rtx body; + rtx mask, masked_sp; + + /* + * Find a SET insn involving a SYMBOL_REF to __stack_chk_guard + */ + if (!INSN_P(insn)) + continue; + body = PATTERN(insn); + if (GET_CODE(body) != SET || + GET_CODE(SET_SRC(body)) != SYMBOL_REF) + continue; + sym = XSTR(SET_SRC(body), 0); + if (strcmp(sym, "__stack_chk_guard")) + continue; + + /* + * Replace the source of the SET insn with an expression that + * produces the address of the copy of the stack canary value + * stored in struct thread_info + */ + mask = GEN_INT(sext_hwi(sp_mask, GET_MODE_PRECISION(Pmode))); + masked_sp = gen_reg_rtx(Pmode); + + emit_insn_before(gen_rtx_set(masked_sp, + gen_rtx_AND(Pmode, + stack_pointer_rtx, + mask)), + insn); + + SET_SRC(body) = gen_rtx_PLUS(Pmode, masked_sp, + GEN_INT(canary_offset)); + } + return 0; +} + +#define PASS_NAME arm_pertask_ssp_rtl + +#define NO_GATE +#include "gcc-generate-rtl-pass.h" + +#if BUILDING_GCC_VERSION >= 9000 +static bool no(void) +{ + return false; +} + +static void arm_pertask_ssp_start_unit(void *gcc_data, void *user_data) +{ + targetm.have_stack_protect_combined_set = no; + targetm.have_stack_protect_combined_test = no; +} +#endif + +__visible int plugin_init(struct plugin_name_args *plugin_info, + struct plugin_gcc_version *version) +{ + const char * const plugin_name = plugin_info->base_name; + const int argc = plugin_info->argc; + const struct plugin_argument *argv = plugin_info->argv; + int tso = 0; + int i; + + if (!plugin_default_version_check(version, &gcc_version)) { + error(G_("incompatible gcc/plugin versions")); + return 1; + } + + for (i = 0; i < argc; ++i) { + if (!strcmp(argv[i].key, "disable")) + return 0; + + /* all remaining options require a value */ + if (!argv[i].value) { + error(G_("no value supplied for option '-fplugin-arg-%s-%s'"), + plugin_name, argv[i].key); + return 1; + } + + if (!strcmp(argv[i].key, "tso")) { + tso = atoi(argv[i].value); + continue; + } + + if (!strcmp(argv[i].key, "offset")) { + canary_offset = atoi(argv[i].value); + continue; + } + error(G_("unknown option '-fplugin-arg-%s-%s'"), + plugin_name, argv[i].key); + return 1; + } + + /* create the mask that produces the base of the stack */ + sp_mask = ~((1U << (12 + tso)) - 1); + + PASS_INFO(arm_pertask_ssp_rtl, "expand", 1, PASS_POS_INSERT_AFTER); + + register_callback(plugin_info->base_name, PLUGIN_PASS_MANAGER_SETUP, + NULL, &arm_pertask_ssp_rtl_pass_info); + +#if BUILDING_GCC_VERSION >= 9000 + register_callback(plugin_info->base_name, PLUGIN_START_UNIT, + arm_pertask_ssp_start_unit, NULL); +#endif + + return 0; +} diff --git a/src/net/scripts/gcc-plugins/cyc_complexity_plugin.c b/src/net/scripts/gcc-plugins/cyc_complexity_plugin.c new file mode 100644 index 0000000..73124c2 --- /dev/null +++ b/src/net/scripts/gcc-plugins/cyc_complexity_plugin.c @@ -0,0 +1,69 @@ +/* + * Copyright 2011-2016 by Emese Revfy <re.emese@gmail.com> + * Licensed under the GPL v2, or (at your option) v3 + * + * Homepage: + * https://github.com/ephox-gcc-plugins/cyclomatic_complexity + * + * https://en.wikipedia.org/wiki/Cyclomatic_complexity + * The complexity M is then defined as: + * M = E - N + 2P + * where + * + * E = the number of edges of the graph + * N = the number of nodes of the graph + * P = the number of connected components (exit nodes). + * + * Usage (4.5 - 5): + * $ make clean; make run + */ + +#include "gcc-common.h" + +__visible int plugin_is_GPL_compatible; + +static struct plugin_info cyc_complexity_plugin_info = { + .version = "20160225", + .help = "Cyclomatic Complexity\n", +}; + +static unsigned int cyc_complexity_execute(void) +{ + int complexity; + expanded_location xloc; + + /* M = E - N + 2P */ + complexity = n_edges_for_fn(cfun) - n_basic_blocks_for_fn(cfun) + 2; + + xloc = expand_location(DECL_SOURCE_LOCATION(current_function_decl)); + fprintf(stderr, "Cyclomatic Complexity %d %s:%s\n", complexity, + xloc.file, DECL_NAME_POINTER(current_function_decl)); + + return 0; +} + +#define PASS_NAME cyc_complexity + +#define NO_GATE +#define TODO_FLAGS_FINISH TODO_dump_func + +#include "gcc-generate-gimple-pass.h" + +__visible int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version) +{ + const char * const plugin_name = plugin_info->base_name; + + PASS_INFO(cyc_complexity, "ssa", 1, PASS_POS_INSERT_AFTER); + + if (!plugin_default_version_check(version, &gcc_version)) { + error(G_("incompatible gcc/plugin versions")); + return 1; + } + + register_callback(plugin_name, PLUGIN_INFO, NULL, + &cyc_complexity_plugin_info); + register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, + &cyc_complexity_pass_info); + + return 0; +} diff --git a/src/net/scripts/gcc-plugins/gcc-common.h b/src/net/scripts/gcc-plugins/gcc-common.h new file mode 100644 index 0000000..9ad76b7 --- /dev/null +++ b/src/net/scripts/gcc-plugins/gcc-common.h @@ -0,0 +1,980 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef GCC_COMMON_H_INCLUDED +#define GCC_COMMON_H_INCLUDED + +#include "bversion.h" +#if BUILDING_GCC_VERSION >= 6000 +#include "gcc-plugin.h" +#else +#include "plugin.h" +#endif +#include "plugin-version.h" +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "tm.h" +#include "line-map.h" +#include "input.h" +#include "tree.h" + +#include "tree-inline.h" +#include "version.h" +#include "rtl.h" +#include "tm_p.h" +#include "flags.h" +#include "hard-reg-set.h" +#include "output.h" +#include "except.h" +#include "function.h" +#include "toplev.h" +#if BUILDING_GCC_VERSION >= 5000 +#include "expr.h" +#endif +#include "basic-block.h" +#include "intl.h" +#include "ggc.h" +#include "timevar.h" + +#if BUILDING_GCC_VERSION < 10000 +#include "params.h" +#endif + +#if BUILDING_GCC_VERSION <= 4009 +#include "pointer-set.h" +#else +#include "hash-map.h" +#endif + +#if BUILDING_GCC_VERSION >= 7000 +#include "memmodel.h" +#endif +#include "emit-rtl.h" +#include "debug.h" +#include "target.h" +#include "langhooks.h" +#include "cfgloop.h" +#include "cgraph.h" +#include "opts.h" + +#if BUILDING_GCC_VERSION == 4005 +#include <sys/mman.h> +#endif + +#if BUILDING_GCC_VERSION >= 4007 +#include "tree-pretty-print.h" +#include "gimple-pretty-print.h" +#endif + +#if BUILDING_GCC_VERSION >= 4006 +/* + * The c-family headers were moved into a subdirectory in GCC version + * 4.7, but most plugin-building users of GCC 4.6 are using the Debian + * or Ubuntu package, which has an out-of-tree patch to move this to the + * same location as found in 4.7 and later: + * https://sources.debian.net/src/gcc-4.6/4.6.3-14/debian/patches/pr45078.diff/ + */ +#include "c-family/c-common.h" +#else +#include "c-common.h" +#endif + +#if BUILDING_GCC_VERSION <= 4008 +#include "tree-flow.h" +#else +#include "tree-cfgcleanup.h" +#include "tree-ssa-operands.h" +#include "tree-into-ssa.h" +#endif + +#if BUILDING_GCC_VERSION >= 4008 +#include "is-a.h" +#endif + +#include "diagnostic.h" +#include "tree-dump.h" +#include "tree-pass.h" +#if BUILDING_GCC_VERSION >= 4009 +#include "pass_manager.h" +#endif +#include "predict.h" +#include "ipa-utils.h" + +#if BUILDING_GCC_VERSION >= 8000 +#include "stringpool.h" +#endif + +#if BUILDING_GCC_VERSION >= 4009 +#include "attribs.h" +#include "varasm.h" +#include "stor-layout.h" +#include "internal-fn.h" +#include "gimple-expr.h" +#include "gimple-fold.h" +#include "context.h" +#include "tree-ssa-alias.h" +#include "tree-ssa.h" +#include "stringpool.h" +#if BUILDING_GCC_VERSION >= 7000 +#include "tree-vrp.h" +#endif +#include "tree-ssanames.h" +#include "print-tree.h" +#include "tree-eh.h" +#include "stmt.h" +#include "gimplify.h" +#endif + +#include "gimple.h" + +#if BUILDING_GCC_VERSION >= 4009 +#include "tree-ssa-operands.h" +#include "tree-phinodes.h" +#include "tree-cfg.h" +#include "gimple-iterator.h" +#include "gimple-ssa.h" +#include "ssa-iterators.h" +#endif + +#if BUILDING_GCC_VERSION >= 5000 +#include "builtins.h" +#endif + +/* missing from basic_block.h... */ +void debug_dominance_info(enum cdi_direction dir); +void debug_dominance_tree(enum cdi_direction dir, basic_block root); + +#if BUILDING_GCC_VERSION == 4006 +void debug_gimple_stmt(gimple); +void debug_gimple_seq(gimple_seq); +void print_gimple_seq(FILE *, gimple_seq, int, int); +void print_gimple_stmt(FILE *, gimple, int, int); +void print_gimple_expr(FILE *, gimple, int, int); +void dump_gimple_stmt(pretty_printer *, gimple, int, int); +#endif + +#ifndef __unused +#define __unused __attribute__((__unused__)) +#endif +#ifndef __visible +#define __visible __attribute__((visibility("default"))) +#endif + +#define DECL_NAME_POINTER(node) IDENTIFIER_POINTER(DECL_NAME(node)) +#define DECL_NAME_LENGTH(node) IDENTIFIER_LENGTH(DECL_NAME(node)) +#define TYPE_NAME_POINTER(node) IDENTIFIER_POINTER(TYPE_NAME(node)) +#define TYPE_NAME_LENGTH(node) IDENTIFIER_LENGTH(TYPE_NAME(node)) + +/* should come from c-tree.h if only it were installed for gcc 4.5... */ +#define C_TYPE_FIELDS_READONLY(TYPE) TREE_LANG_FLAG_1(TYPE) + +static inline tree build_const_char_string(int len, const char *str) +{ + tree cstr, elem, index, type; + + cstr = build_string(len, str); + elem = build_type_variant(char_type_node, 1, 0); + index = build_index_type(size_int(len - 1)); + type = build_array_type(elem, index); + TREE_TYPE(cstr) = type; + TREE_CONSTANT(cstr) = 1; + TREE_READONLY(cstr) = 1; + TREE_STATIC(cstr) = 1; + return cstr; +} + +#define PASS_INFO(NAME, REF, ID, POS) \ +struct register_pass_info NAME##_pass_info = { \ + .pass = make_##NAME##_pass(), \ + .reference_pass_name = REF, \ + .ref_pass_instance_number = ID, \ + .pos_op = POS, \ +} + +#if BUILDING_GCC_VERSION == 4005 +#define FOR_EACH_LOCAL_DECL(FUN, I, D) \ + for (tree vars = (FUN)->local_decls, (I) = 0; \ + vars && ((D) = TREE_VALUE(vars)); \ + vars = TREE_CHAIN(vars), (I)++) +#define DECL_CHAIN(NODE) (TREE_CHAIN(DECL_MINIMAL_CHECK(NODE))) +#define FOR_EACH_VEC_ELT(T, V, I, P) \ + for (I = 0; VEC_iterate(T, (V), (I), (P)); ++(I)) +#define TODO_rebuild_cgraph_edges 0 +#define SCOPE_FILE_SCOPE_P(EXP) (!(EXP)) + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +typedef struct varpool_node *varpool_node_ptr; + +static inline bool gimple_call_builtin_p(gimple stmt, enum built_in_function code) +{ + tree fndecl; + + if (!is_gimple_call(stmt)) + return false; + fndecl = gimple_call_fndecl(stmt); + if (!fndecl || DECL_BUILT_IN_CLASS(fndecl) != BUILT_IN_NORMAL) + return false; + return DECL_FUNCTION_CODE(fndecl) == code; +} + +static inline bool is_simple_builtin(tree decl) +{ + if (decl && DECL_BUILT_IN_CLASS(decl) != BUILT_IN_NORMAL) + return false; + + switch (DECL_FUNCTION_CODE(decl)) { + /* Builtins that expand to constants. */ + case BUILT_IN_CONSTANT_P: + case BUILT_IN_EXPECT: + case BUILT_IN_OBJECT_SIZE: + case BUILT_IN_UNREACHABLE: + /* Simple register moves or loads from stack. */ + case BUILT_IN_RETURN_ADDRESS: + case BUILT_IN_EXTRACT_RETURN_ADDR: + case BUILT_IN_FROB_RETURN_ADDR: + case BUILT_IN_RETURN: + case BUILT_IN_AGGREGATE_INCOMING_ADDRESS: + case BUILT_IN_FRAME_ADDRESS: + case BUILT_IN_VA_END: + case BUILT_IN_STACK_SAVE: + case BUILT_IN_STACK_RESTORE: + /* Exception state returns or moves registers around. */ + case BUILT_IN_EH_FILTER: + case BUILT_IN_EH_POINTER: + case BUILT_IN_EH_COPY_VALUES: + return true; + + default: + return false; + } +} + +static inline void add_local_decl(struct function *fun, tree d) +{ + gcc_assert(TREE_CODE(d) == VAR_DECL); + fun->local_decls = tree_cons(NULL_TREE, d, fun->local_decls); +} +#endif + +#if BUILDING_GCC_VERSION <= 4006 +#define ANY_RETURN_P(rtx) (GET_CODE(rtx) == RETURN) +#define C_DECL_REGISTER(EXP) DECL_LANG_FLAG_4(EXP) +#define EDGE_PRESERVE 0ULL +#define HOST_WIDE_INT_PRINT_HEX_PURE "%" HOST_WIDE_INT_PRINT "x" +#define flag_fat_lto_objects true + +#define get_random_seed(noinit) ({ \ + unsigned HOST_WIDE_INT seed; \ + sscanf(get_random_seed(noinit), "%" HOST_WIDE_INT_PRINT "x", &seed); \ + seed * seed; }) + +#define int_const_binop(code, arg1, arg2) \ + int_const_binop((code), (arg1), (arg2), 0) + +static inline bool gimple_clobber_p(gimple s __unused) +{ + return false; +} + +static inline bool gimple_asm_clobbers_memory_p(const_gimple stmt) +{ + unsigned i; + + for (i = 0; i < gimple_asm_nclobbers(stmt); i++) { + tree op = gimple_asm_clobber_op(stmt, i); + + if (!strcmp(TREE_STRING_POINTER(TREE_VALUE(op)), "memory")) + return true; + } + + return false; +} + +static inline tree builtin_decl_implicit(enum built_in_function fncode) +{ + return implicit_built_in_decls[fncode]; +} + +static inline int ipa_reverse_postorder(struct cgraph_node **order) +{ + return cgraph_postorder(order); +} + +static inline struct cgraph_node *cgraph_create_node(tree decl) +{ + return cgraph_node(decl); +} + +static inline struct cgraph_node *cgraph_get_create_node(tree decl) +{ + struct cgraph_node *node = cgraph_get_node(decl); + + return node ? node : cgraph_node(decl); +} + +static inline bool cgraph_function_with_gimple_body_p(struct cgraph_node *node) +{ + return node->analyzed && !node->thunk.thunk_p && !node->alias; +} + +static inline struct cgraph_node *cgraph_first_function_with_gimple_body(void) +{ + struct cgraph_node *node; + + for (node = cgraph_nodes; node; node = node->next) + if (cgraph_function_with_gimple_body_p(node)) + return node; + return NULL; +} + +static inline struct cgraph_node *cgraph_next_function_with_gimple_body(struct cgraph_node *node) +{ + for (node = node->next; node; node = node->next) + if (cgraph_function_with_gimple_body_p(node)) + return node; + return NULL; +} + +static inline bool cgraph_for_node_and_aliases(cgraph_node_ptr node, bool (*callback)(cgraph_node_ptr, void *), void *data, bool include_overwritable) +{ + cgraph_node_ptr alias; + + if (callback(node, data)) + return true; + + for (alias = node->same_body; alias; alias = alias->next) { + if (include_overwritable || cgraph_function_body_availability(alias) > AVAIL_OVERWRITABLE) + if (cgraph_for_node_and_aliases(alias, callback, data, include_overwritable)) + return true; + } + + return false; +} + +#define FOR_EACH_FUNCTION_WITH_GIMPLE_BODY(node) \ + for ((node) = cgraph_first_function_with_gimple_body(); (node); \ + (node) = cgraph_next_function_with_gimple_body(node)) + +static inline void varpool_add_new_variable(tree decl) +{ + varpool_finalize_decl(decl); +} +#endif + +#if BUILDING_GCC_VERSION <= 4007 +#define FOR_EACH_FUNCTION(node) \ + for (node = cgraph_nodes; node; node = node->next) +#define FOR_EACH_VARIABLE(node) \ + for (node = varpool_nodes; node; node = node->next) +#define PROP_loops 0 +#define NODE_SYMBOL(node) (node) +#define NODE_DECL(node) (node)->decl +#define INSN_LOCATION(INSN) RTL_LOCATION(INSN) +#define vNULL NULL + +static inline int bb_loop_depth(const_basic_block bb) +{ + return bb->loop_father ? loop_depth(bb->loop_father) : 0; +} + +static inline bool gimple_store_p(gimple gs) +{ + tree lhs = gimple_get_lhs(gs); + + return lhs && !is_gimple_reg(lhs); +} + +static inline void gimple_init_singleton(gimple g __unused) +{ +} +#endif + +#if BUILDING_GCC_VERSION == 4007 || BUILDING_GCC_VERSION == 4008 +static inline struct cgraph_node *cgraph_alias_target(struct cgraph_node *n) +{ + return cgraph_alias_aliased_node(n); +} +#endif + +#if BUILDING_GCC_VERSION <= 4008 +#define ENTRY_BLOCK_PTR_FOR_FN(FN) ENTRY_BLOCK_PTR_FOR_FUNCTION(FN) +#define EXIT_BLOCK_PTR_FOR_FN(FN) EXIT_BLOCK_PTR_FOR_FUNCTION(FN) +#define basic_block_info_for_fn(FN) ((FN)->cfg->x_basic_block_info) +#define n_basic_blocks_for_fn(FN) ((FN)->cfg->x_n_basic_blocks) +#define n_edges_for_fn(FN) ((FN)->cfg->x_n_edges) +#define last_basic_block_for_fn(FN) ((FN)->cfg->x_last_basic_block) +#define label_to_block_map_for_fn(FN) ((FN)->cfg->x_label_to_block_map) +#define profile_status_for_fn(FN) ((FN)->cfg->x_profile_status) +#define BASIC_BLOCK_FOR_FN(FN, N) BASIC_BLOCK_FOR_FUNCTION((FN), (N)) +#define NODE_IMPLICIT_ALIAS(node) (node)->same_body_alias +#define VAR_P(NODE) (TREE_CODE(NODE) == VAR_DECL) + +static inline bool tree_fits_shwi_p(const_tree t) +{ + if (t == NULL_TREE || TREE_CODE(t) != INTEGER_CST) + return false; + + if (TREE_INT_CST_HIGH(t) == 0 && (HOST_WIDE_INT)TREE_INT_CST_LOW(t) >= 0) + return true; + + if (TREE_INT_CST_HIGH(t) == -1 && (HOST_WIDE_INT)TREE_INT_CST_LOW(t) < 0 && !TYPE_UNSIGNED(TREE_TYPE(t))) + return true; + + return false; +} + +static inline bool tree_fits_uhwi_p(const_tree t) +{ + if (t == NULL_TREE || TREE_CODE(t) != INTEGER_CST) + return false; + + return TREE_INT_CST_HIGH(t) == 0; +} + +static inline HOST_WIDE_INT tree_to_shwi(const_tree t) +{ + gcc_assert(tree_fits_shwi_p(t)); + return TREE_INT_CST_LOW(t); +} + +static inline unsigned HOST_WIDE_INT tree_to_uhwi(const_tree t) +{ + gcc_assert(tree_fits_uhwi_p(t)); + return TREE_INT_CST_LOW(t); +} + +static inline const char *get_tree_code_name(enum tree_code code) +{ + gcc_assert(code < MAX_TREE_CODES); + return tree_code_name[code]; +} + +#define ipa_remove_stmt_references(cnode, stmt) + +typedef union gimple_statement_d gasm; +typedef union gimple_statement_d gassign; +typedef union gimple_statement_d gcall; +typedef union gimple_statement_d gcond; +typedef union gimple_statement_d gdebug; +typedef union gimple_statement_d ggoto; +typedef union gimple_statement_d gphi; +typedef union gimple_statement_d greturn; + +static inline gasm *as_a_gasm(gimple stmt) +{ + return stmt; +} + +static inline const gasm *as_a_const_gasm(const_gimple stmt) +{ + return stmt; +} + +static inline gassign *as_a_gassign(gimple stmt) +{ + return stmt; +} + +static inline const gassign *as_a_const_gassign(const_gimple stmt) +{ + return stmt; +} + +static inline gcall *as_a_gcall(gimple stmt) +{ + return stmt; +} + +static inline const gcall *as_a_const_gcall(const_gimple stmt) +{ + return stmt; +} + +static inline gcond *as_a_gcond(gimple stmt) +{ + return stmt; +} + +static inline const gcond *as_a_const_gcond(const_gimple stmt) +{ + return stmt; +} + +static inline gdebug *as_a_gdebug(gimple stmt) +{ + return stmt; +} + +static inline const gdebug *as_a_const_gdebug(const_gimple stmt) +{ + return stmt; +} + +static inline ggoto *as_a_ggoto(gimple stmt) +{ + return stmt; +} + +static inline const ggoto *as_a_const_ggoto(const_gimple stmt) +{ + return stmt; +} + +static inline gphi *as_a_gphi(gimple stmt) +{ + return stmt; +} + +static inline const gphi *as_a_const_gphi(const_gimple stmt) +{ + return stmt; +} + +static inline greturn *as_a_greturn(gimple stmt) +{ + return stmt; +} + +static inline const greturn *as_a_const_greturn(const_gimple stmt) +{ + return stmt; +} +#endif + +#if BUILDING_GCC_VERSION == 4008 +#define NODE_SYMBOL(node) (&(node)->symbol) +#define NODE_DECL(node) (node)->symbol.decl +#endif + +#if BUILDING_GCC_VERSION >= 4008 +#define add_referenced_var(var) +#define mark_sym_for_renaming(var) +#define varpool_mark_needed_node(node) +#define create_var_ann(var) +#define TODO_dump_func 0 +#define TODO_dump_cgraph 0 +#endif + +#if BUILDING_GCC_VERSION <= 4009 +#define TODO_verify_il 0 +#define AVAIL_INTERPOSABLE AVAIL_OVERWRITABLE + +#define section_name_prefix LTO_SECTION_NAME_PREFIX +#define fatal_error(loc, gmsgid, ...) fatal_error((gmsgid), __VA_ARGS__) + +rtx emit_move_insn(rtx x, rtx y); + +typedef struct rtx_def rtx_insn; + +static inline const char *get_decl_section_name(const_tree decl) +{ + if (DECL_SECTION_NAME(decl) == NULL_TREE) + return NULL; + + return TREE_STRING_POINTER(DECL_SECTION_NAME(decl)); +} + +static inline void set_decl_section_name(tree node, const char *value) +{ + if (value) + DECL_SECTION_NAME(node) = build_string(strlen(value) + 1, value); + else + DECL_SECTION_NAME(node) = NULL; +} +#endif + +#if BUILDING_GCC_VERSION == 4009 +typedef struct gimple_statement_asm gasm; +typedef struct gimple_statement_base gassign; +typedef struct gimple_statement_call gcall; +typedef struct gimple_statement_base gcond; +typedef struct gimple_statement_base gdebug; +typedef struct gimple_statement_base ggoto; +typedef struct gimple_statement_phi gphi; +typedef struct gimple_statement_base greturn; + +static inline gasm *as_a_gasm(gimple stmt) +{ + return as_a<gasm>(stmt); +} + +static inline const gasm *as_a_const_gasm(const_gimple stmt) +{ + return as_a<const gasm>(stmt); +} + +static inline gassign *as_a_gassign(gimple stmt) +{ + return stmt; +} + +static inline const gassign *as_a_const_gassign(const_gimple stmt) +{ + return stmt; +} + +static inline gcall *as_a_gcall(gimple stmt) +{ + return as_a<gcall>(stmt); +} + +static inline const gcall *as_a_const_gcall(const_gimple stmt) +{ + return as_a<const gcall>(stmt); +} + +static inline gcond *as_a_gcond(gimple stmt) +{ + return stmt; +} + +static inline const gcond *as_a_const_gcond(const_gimple stmt) +{ + return stmt; +} + +static inline gdebug *as_a_gdebug(gimple stmt) +{ + return stmt; +} + +static inline const gdebug *as_a_const_gdebug(const_gimple stmt) +{ + return stmt; +} + +static inline ggoto *as_a_ggoto(gimple stmt) +{ + return stmt; +} + +static inline const ggoto *as_a_const_ggoto(const_gimple stmt) +{ + return stmt; +} + +static inline gphi *as_a_gphi(gimple stmt) +{ + return as_a<gphi>(stmt); +} + +static inline const gphi *as_a_const_gphi(const_gimple stmt) +{ + return as_a<const gphi>(stmt); +} + +static inline greturn *as_a_greturn(gimple stmt) +{ + return stmt; +} + +static inline const greturn *as_a_const_greturn(const_gimple stmt) +{ + return stmt; +} +#endif + +#if BUILDING_GCC_VERSION >= 4009 +#define TODO_ggc_collect 0 +#define NODE_SYMBOL(node) (node) +#define NODE_DECL(node) (node)->decl +#define cgraph_node_name(node) (node)->name() +#define NODE_IMPLICIT_ALIAS(node) (node)->cpp_implicit_alias + +static inline opt_pass *get_pass_for_id(int id) +{ + return g->get_passes()->get_pass_for_id(id); +} +#endif + +#if BUILDING_GCC_VERSION >= 5000 && BUILDING_GCC_VERSION < 6000 +/* gimple related */ +template <> +template <> +inline bool is_a_helper<const gassign *>::test(const_gimple gs) +{ + return gs->code == GIMPLE_ASSIGN; +} +#endif + +#if BUILDING_GCC_VERSION >= 5000 +#define TODO_verify_ssa TODO_verify_il +#define TODO_verify_flow TODO_verify_il +#define TODO_verify_stmts TODO_verify_il +#define TODO_verify_rtl_sharing TODO_verify_il + +#define INSN_DELETED_P(insn) (insn)->deleted() + +static inline const char *get_decl_section_name(const_tree decl) +{ + return DECL_SECTION_NAME(decl); +} + +/* symtab/cgraph related */ +#define debug_cgraph_node(node) (node)->debug() +#define cgraph_get_node(decl) cgraph_node::get(decl) +#define cgraph_get_create_node(decl) cgraph_node::get_create(decl) +#define cgraph_create_node(decl) cgraph_node::create(decl) +#define cgraph_n_nodes symtab->cgraph_count +#define cgraph_max_uid symtab->cgraph_max_uid +#define varpool_get_node(decl) varpool_node::get(decl) +#define dump_varpool_node(file, node) (node)->dump(file) + +#if BUILDING_GCC_VERSION >= 8000 +#define cgraph_create_edge(caller, callee, call_stmt, count, freq) \ + (caller)->create_edge((callee), (call_stmt), (count)) + +#define cgraph_create_edge_including_clones(caller, callee, \ + old_call_stmt, call_stmt, count, freq, reason) \ + (caller)->create_edge_including_clones((callee), \ + (old_call_stmt), (call_stmt), (count), (reason)) +#else +#define cgraph_create_edge(caller, callee, call_stmt, count, freq) \ + (caller)->create_edge((callee), (call_stmt), (count), (freq)) + +#define cgraph_create_edge_including_clones(caller, callee, \ + old_call_stmt, call_stmt, count, freq, reason) \ + (caller)->create_edge_including_clones((callee), \ + (old_call_stmt), (call_stmt), (count), (freq), (reason)) +#endif + +typedef struct cgraph_node *cgraph_node_ptr; +typedef struct cgraph_edge *cgraph_edge_p; +typedef struct varpool_node *varpool_node_ptr; + +static inline void change_decl_assembler_name(tree decl, tree name) +{ + symtab->change_decl_assembler_name(decl, name); +} + +static inline void varpool_finalize_decl(tree decl) +{ + varpool_node::finalize_decl(decl); +} + +static inline void varpool_add_new_variable(tree decl) +{ + varpool_node::add(decl); +} + +static inline unsigned int rebuild_cgraph_edges(void) +{ + return cgraph_edge::rebuild_edges(); +} + +static inline cgraph_node_ptr cgraph_function_node(cgraph_node_ptr node, enum availability *availability) +{ + return node->function_symbol(availability); +} + +static inline cgraph_node_ptr cgraph_function_or_thunk_node(cgraph_node_ptr node, enum availability *availability = NULL) +{ + return node->ultimate_alias_target(availability); +} + +static inline bool cgraph_only_called_directly_p(cgraph_node_ptr node) +{ + return node->only_called_directly_p(); +} + +static inline enum availability cgraph_function_body_availability(cgraph_node_ptr node) +{ + return node->get_availability(); +} + +static inline cgraph_node_ptr cgraph_alias_target(cgraph_node_ptr node) +{ + return node->get_alias_target(); +} + +static inline bool cgraph_for_node_and_aliases(cgraph_node_ptr node, bool (*callback)(cgraph_node_ptr, void *), void *data, bool include_overwritable) +{ + return node->call_for_symbol_thunks_and_aliases(callback, data, include_overwritable); +} + +static inline struct cgraph_node_hook_list *cgraph_add_function_insertion_hook(cgraph_node_hook hook, void *data) +{ + return symtab->add_cgraph_insertion_hook(hook, data); +} + +static inline void cgraph_remove_function_insertion_hook(struct cgraph_node_hook_list *entry) +{ + symtab->remove_cgraph_insertion_hook(entry); +} + +static inline struct cgraph_node_hook_list *cgraph_add_node_removal_hook(cgraph_node_hook hook, void *data) +{ + return symtab->add_cgraph_removal_hook(hook, data); +} + +static inline void cgraph_remove_node_removal_hook(struct cgraph_node_hook_list *entry) +{ + symtab->remove_cgraph_removal_hook(entry); +} + +static inline struct cgraph_2node_hook_list *cgraph_add_node_duplication_hook(cgraph_2node_hook hook, void *data) +{ + return symtab->add_cgraph_duplication_hook(hook, data); +} + +static inline void cgraph_remove_node_duplication_hook(struct cgraph_2node_hook_list *entry) +{ + symtab->remove_cgraph_duplication_hook(entry); +} + +static inline void cgraph_call_node_duplication_hooks(cgraph_node_ptr node, cgraph_node_ptr node2) +{ + symtab->call_cgraph_duplication_hooks(node, node2); +} + +static inline void cgraph_call_edge_duplication_hooks(cgraph_edge *cs1, cgraph_edge *cs2) +{ + symtab->call_edge_duplication_hooks(cs1, cs2); +} + +#if BUILDING_GCC_VERSION >= 6000 +typedef gimple *gimple_ptr; +typedef const gimple *const_gimple_ptr; +#define gimple gimple_ptr +#define const_gimple const_gimple_ptr +#undef CONST_CAST_GIMPLE +#define CONST_CAST_GIMPLE(X) CONST_CAST(gimple, (X)) +#endif + +/* gimple related */ +static inline gimple gimple_build_assign_with_ops(enum tree_code subcode, tree lhs, tree op1, tree op2 MEM_STAT_DECL) +{ + return gimple_build_assign(lhs, subcode, op1, op2 PASS_MEM_STAT); +} + +#if BUILDING_GCC_VERSION < 10000 +template <> +template <> +inline bool is_a_helper<const ggoto *>::test(const_gimple gs) +{ + return gs->code == GIMPLE_GOTO; +} + +template <> +template <> +inline bool is_a_helper<const greturn *>::test(const_gimple gs) +{ + return gs->code == GIMPLE_RETURN; +} +#endif + +static inline gasm *as_a_gasm(gimple stmt) +{ + return as_a<gasm *>(stmt); +} + +static inline const gasm *as_a_const_gasm(const_gimple stmt) +{ + return as_a<const gasm *>(stmt); +} + +static inline gassign *as_a_gassign(gimple stmt) +{ + return as_a<gassign *>(stmt); +} + +static inline const gassign *as_a_const_gassign(const_gimple stmt) +{ + return as_a<const gassign *>(stmt); +} + +static inline gcall *as_a_gcall(gimple stmt) +{ + return as_a<gcall *>(stmt); +} + +static inline const gcall *as_a_const_gcall(const_gimple stmt) +{ + return as_a<const gcall *>(stmt); +} + +static inline ggoto *as_a_ggoto(gimple stmt) +{ + return as_a<ggoto *>(stmt); +} + +static inline const ggoto *as_a_const_ggoto(const_gimple stmt) +{ + return as_a<const ggoto *>(stmt); +} + +static inline gphi *as_a_gphi(gimple stmt) +{ + return as_a<gphi *>(stmt); +} + +static inline const gphi *as_a_const_gphi(const_gimple stmt) +{ + return as_a<const gphi *>(stmt); +} + +static inline greturn *as_a_greturn(gimple stmt) +{ + return as_a<greturn *>(stmt); +} + +static inline const greturn *as_a_const_greturn(const_gimple stmt) +{ + return as_a<const greturn *>(stmt); +} + +/* IPA/LTO related */ +#define ipa_ref_list_referring_iterate(L, I, P) \ + (L)->referring.iterate((I), &(P)) +#define ipa_ref_list_reference_iterate(L, I, P) \ + (L)->reference.iterate((I), &(P)) + +static inline cgraph_node_ptr ipa_ref_referring_node(struct ipa_ref *ref) +{ + return dyn_cast<cgraph_node_ptr>(ref->referring); +} + +static inline void ipa_remove_stmt_references(symtab_node *referring_node, gimple stmt) +{ + referring_node->remove_stmt_references(stmt); +} +#endif + +#if BUILDING_GCC_VERSION < 6000 +#define get_inner_reference(exp, pbitsize, pbitpos, poffset, pmode, punsignedp, preversep, pvolatilep, keep_aligning) \ + get_inner_reference(exp, pbitsize, pbitpos, poffset, pmode, punsignedp, pvolatilep, keep_aligning) +#define gen_rtx_set(ARG0, ARG1) gen_rtx_SET(VOIDmode, (ARG0), (ARG1)) +#endif + +#if BUILDING_GCC_VERSION >= 6000 +#define gen_rtx_set(ARG0, ARG1) gen_rtx_SET((ARG0), (ARG1)) +#endif + +#ifdef __cplusplus +static inline void debug_tree(const_tree t) +{ + debug_tree(CONST_CAST_TREE(t)); +} + +static inline void debug_gimple_stmt(const_gimple s) +{ + debug_gimple_stmt(CONST_CAST_GIMPLE(s)); +} +#else +#define debug_tree(t) debug_tree(CONST_CAST_TREE(t)) +#define debug_gimple_stmt(s) debug_gimple_stmt(CONST_CAST_GIMPLE(s)) +#endif + +#if BUILDING_GCC_VERSION >= 7000 +#define get_inner_reference(exp, pbitsize, pbitpos, poffset, pmode, punsignedp, preversep, pvolatilep, keep_aligning) \ + get_inner_reference(exp, pbitsize, pbitpos, poffset, pmode, punsignedp, preversep, pvolatilep) +#endif + +#if BUILDING_GCC_VERSION < 7000 +#define SET_DECL_ALIGN(decl, align) DECL_ALIGN(decl) = (align) +#define SET_DECL_MODE(decl, mode) DECL_MODE(decl) = (mode) +#endif + +#endif diff --git a/src/net/scripts/gcc-plugins/gcc-generate-gimple-pass.h b/src/net/scripts/gcc-plugins/gcc-generate-gimple-pass.h new file mode 100644 index 0000000..f20797e --- /dev/null +++ b/src/net/scripts/gcc-plugins/gcc-generate-gimple-pass.h @@ -0,0 +1,176 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Generator for GIMPLE pass related boilerplate code/data + * + * Supports gcc 4.5-6 + * + * Usage: + * + * 1. before inclusion define PASS_NAME + * 2. before inclusion define NO_* for unimplemented callbacks + * NO_GATE + * NO_EXECUTE + * 3. before inclusion define PROPERTIES_* and TODO_FLAGS_* to override + * the default 0 values + * 4. for convenience, all the above will be undefined after inclusion! + * 5. the only exported name is make_PASS_NAME_pass() to register with gcc + */ + +#ifndef PASS_NAME +#error at least PASS_NAME must be defined +#else +#define __GCC_PLUGIN_STRINGIFY(n) #n +#define _GCC_PLUGIN_STRINGIFY(n) __GCC_PLUGIN_STRINGIFY(n) +#define _GCC_PLUGIN_CONCAT2(x, y) x ## y +#define _GCC_PLUGIN_CONCAT3(x, y, z) x ## y ## z + +#define __PASS_NAME_PASS_DATA(n) _GCC_PLUGIN_CONCAT2(n, _pass_data) +#define _PASS_NAME_PASS_DATA __PASS_NAME_PASS_DATA(PASS_NAME) + +#define __PASS_NAME_PASS(n) _GCC_PLUGIN_CONCAT2(n, _pass) +#define _PASS_NAME_PASS __PASS_NAME_PASS(PASS_NAME) + +#define _PASS_NAME_NAME _GCC_PLUGIN_STRINGIFY(PASS_NAME) + +#define __MAKE_PASS_NAME_PASS(n) _GCC_PLUGIN_CONCAT3(make_, n, _pass) +#define _MAKE_PASS_NAME_PASS __MAKE_PASS_NAME_PASS(PASS_NAME) + +#ifdef NO_GATE +#define _GATE NULL +#define _HAS_GATE false +#else +#define __GATE(n) _GCC_PLUGIN_CONCAT2(n, _gate) +#define _GATE __GATE(PASS_NAME) +#define _HAS_GATE true +#endif + +#ifdef NO_EXECUTE +#define _EXECUTE NULL +#define _HAS_EXECUTE false +#else +#define __EXECUTE(n) _GCC_PLUGIN_CONCAT2(n, _execute) +#define _EXECUTE __EXECUTE(PASS_NAME) +#define _HAS_EXECUTE true +#endif + +#ifndef PROPERTIES_REQUIRED +#define PROPERTIES_REQUIRED 0 +#endif + +#ifndef PROPERTIES_PROVIDED +#define PROPERTIES_PROVIDED 0 +#endif + +#ifndef PROPERTIES_DESTROYED +#define PROPERTIES_DESTROYED 0 +#endif + +#ifndef TODO_FLAGS_START +#define TODO_FLAGS_START 0 +#endif + +#ifndef TODO_FLAGS_FINISH +#define TODO_FLAGS_FINISH 0 +#endif + +#if BUILDING_GCC_VERSION >= 4009 +namespace { +static const pass_data _PASS_NAME_PASS_DATA = { +#else +static struct gimple_opt_pass _PASS_NAME_PASS = { + .pass = { +#endif + .type = GIMPLE_PASS, + .name = _PASS_NAME_NAME, +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif +#if BUILDING_GCC_VERSION >= 5000 +#elif BUILDING_GCC_VERSION == 4009 + .has_gate = _HAS_GATE, + .has_execute = _HAS_EXECUTE, +#else + .gate = _GATE, + .execute = _EXECUTE, + .sub = NULL, + .next = NULL, + .static_pass_number = 0, +#endif + .tv_id = TV_NONE, + .properties_required = PROPERTIES_REQUIRED, + .properties_provided = PROPERTIES_PROVIDED, + .properties_destroyed = PROPERTIES_DESTROYED, + .todo_flags_start = TODO_FLAGS_START, + .todo_flags_finish = TODO_FLAGS_FINISH, +#if BUILDING_GCC_VERSION < 4009 + } +#endif +}; + +#if BUILDING_GCC_VERSION >= 4009 +class _PASS_NAME_PASS : public gimple_opt_pass { +public: + _PASS_NAME_PASS() : gimple_opt_pass(_PASS_NAME_PASS_DATA, g) {} + +#ifndef NO_GATE +#if BUILDING_GCC_VERSION >= 5000 + virtual bool gate(function *) { return _GATE(); } +#else + virtual bool gate(void) { return _GATE(); } +#endif +#endif + + virtual opt_pass * clone () { return new _PASS_NAME_PASS(); } + +#ifndef NO_EXECUTE +#if BUILDING_GCC_VERSION >= 5000 + virtual unsigned int execute(function *) { return _EXECUTE(); } +#else + virtual unsigned int execute(void) { return _EXECUTE(); } +#endif +#endif +}; +} + +opt_pass *_MAKE_PASS_NAME_PASS(void) +{ + return new _PASS_NAME_PASS(); +} +#else +struct opt_pass *_MAKE_PASS_NAME_PASS(void) +{ + return &_PASS_NAME_PASS.pass; +} +#endif + +/* clean up user provided defines */ +#undef PASS_NAME +#undef NO_GATE +#undef NO_EXECUTE + +#undef PROPERTIES_DESTROYED +#undef PROPERTIES_PROVIDED +#undef PROPERTIES_REQUIRED +#undef TODO_FLAGS_FINISH +#undef TODO_FLAGS_START + +/* clean up generated defines */ +#undef _EXECUTE +#undef __EXECUTE +#undef _GATE +#undef __GATE +#undef _GCC_PLUGIN_CONCAT2 +#undef _GCC_PLUGIN_CONCAT3 +#undef _GCC_PLUGIN_STRINGIFY +#undef __GCC_PLUGIN_STRINGIFY +#undef _HAS_EXECUTE +#undef _HAS_GATE +#undef _MAKE_PASS_NAME_PASS +#undef __MAKE_PASS_NAME_PASS +#undef _PASS_NAME_NAME +#undef _PASS_NAME_PASS +#undef __PASS_NAME_PASS +#undef _PASS_NAME_PASS_DATA +#undef __PASS_NAME_PASS_DATA + +#endif /* PASS_NAME */ diff --git a/src/net/scripts/gcc-plugins/gcc-generate-ipa-pass.h b/src/net/scripts/gcc-plugins/gcc-generate-ipa-pass.h new file mode 100644 index 0000000..92bb4f3 --- /dev/null +++ b/src/net/scripts/gcc-plugins/gcc-generate-ipa-pass.h @@ -0,0 +1,290 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Generator for IPA pass related boilerplate code/data + * + * Supports gcc 4.5-6 + * + * Usage: + * + * 1. before inclusion define PASS_NAME + * 2. before inclusion define NO_* for unimplemented callbacks + * NO_GENERATE_SUMMARY + * NO_READ_SUMMARY + * NO_WRITE_SUMMARY + * NO_READ_OPTIMIZATION_SUMMARY + * NO_WRITE_OPTIMIZATION_SUMMARY + * NO_STMT_FIXUP + * NO_FUNCTION_TRANSFORM + * NO_VARIABLE_TRANSFORM + * NO_GATE + * NO_EXECUTE + * 3. before inclusion define PROPERTIES_* and *TODO_FLAGS_* to override + * the default 0 values + * 4. for convenience, all the above will be undefined after inclusion! + * 5. the only exported name is make_PASS_NAME_pass() to register with gcc + */ + +#ifndef PASS_NAME +#error at least PASS_NAME must be defined +#else +#define __GCC_PLUGIN_STRINGIFY(n) #n +#define _GCC_PLUGIN_STRINGIFY(n) __GCC_PLUGIN_STRINGIFY(n) +#define _GCC_PLUGIN_CONCAT2(x, y) x ## y +#define _GCC_PLUGIN_CONCAT3(x, y, z) x ## y ## z + +#define __PASS_NAME_PASS_DATA(n) _GCC_PLUGIN_CONCAT2(n, _pass_data) +#define _PASS_NAME_PASS_DATA __PASS_NAME_PASS_DATA(PASS_NAME) + +#define __PASS_NAME_PASS(n) _GCC_PLUGIN_CONCAT2(n, _pass) +#define _PASS_NAME_PASS __PASS_NAME_PASS(PASS_NAME) + +#define _PASS_NAME_NAME _GCC_PLUGIN_STRINGIFY(PASS_NAME) + +#define __MAKE_PASS_NAME_PASS(n) _GCC_PLUGIN_CONCAT3(make_, n, _pass) +#define _MAKE_PASS_NAME_PASS __MAKE_PASS_NAME_PASS(PASS_NAME) + +#ifdef NO_GENERATE_SUMMARY +#define _GENERATE_SUMMARY NULL +#else +#define __GENERATE_SUMMARY(n) _GCC_PLUGIN_CONCAT2(n, _generate_summary) +#define _GENERATE_SUMMARY __GENERATE_SUMMARY(PASS_NAME) +#endif + +#ifdef NO_READ_SUMMARY +#define _READ_SUMMARY NULL +#else +#define __READ_SUMMARY(n) _GCC_PLUGIN_CONCAT2(n, _read_summary) +#define _READ_SUMMARY __READ_SUMMARY(PASS_NAME) +#endif + +#ifdef NO_WRITE_SUMMARY +#define _WRITE_SUMMARY NULL +#else +#define __WRITE_SUMMARY(n) _GCC_PLUGIN_CONCAT2(n, _write_summary) +#define _WRITE_SUMMARY __WRITE_SUMMARY(PASS_NAME) +#endif + +#ifdef NO_READ_OPTIMIZATION_SUMMARY +#define _READ_OPTIMIZATION_SUMMARY NULL +#else +#define __READ_OPTIMIZATION_SUMMARY(n) _GCC_PLUGIN_CONCAT2(n, _read_optimization_summary) +#define _READ_OPTIMIZATION_SUMMARY __READ_OPTIMIZATION_SUMMARY(PASS_NAME) +#endif + +#ifdef NO_WRITE_OPTIMIZATION_SUMMARY +#define _WRITE_OPTIMIZATION_SUMMARY NULL +#else +#define __WRITE_OPTIMIZATION_SUMMARY(n) _GCC_PLUGIN_CONCAT2(n, _write_optimization_summary) +#define _WRITE_OPTIMIZATION_SUMMARY __WRITE_OPTIMIZATION_SUMMARY(PASS_NAME) +#endif + +#ifdef NO_STMT_FIXUP +#define _STMT_FIXUP NULL +#else +#define __STMT_FIXUP(n) _GCC_PLUGIN_CONCAT2(n, _stmt_fixup) +#define _STMT_FIXUP __STMT_FIXUP(PASS_NAME) +#endif + +#ifdef NO_FUNCTION_TRANSFORM +#define _FUNCTION_TRANSFORM NULL +#else +#define __FUNCTION_TRANSFORM(n) _GCC_PLUGIN_CONCAT2(n, _function_transform) +#define _FUNCTION_TRANSFORM __FUNCTION_TRANSFORM(PASS_NAME) +#endif + +#ifdef NO_VARIABLE_TRANSFORM +#define _VARIABLE_TRANSFORM NULL +#else +#define __VARIABLE_TRANSFORM(n) _GCC_PLUGIN_CONCAT2(n, _variable_transform) +#define _VARIABLE_TRANSFORM __VARIABLE_TRANSFORM(PASS_NAME) +#endif + +#ifdef NO_GATE +#define _GATE NULL +#define _HAS_GATE false +#else +#define __GATE(n) _GCC_PLUGIN_CONCAT2(n, _gate) +#define _GATE __GATE(PASS_NAME) +#define _HAS_GATE true +#endif + +#ifdef NO_EXECUTE +#define _EXECUTE NULL +#define _HAS_EXECUTE false +#else +#define __EXECUTE(n) _GCC_PLUGIN_CONCAT2(n, _execute) +#define _EXECUTE __EXECUTE(PASS_NAME) +#define _HAS_EXECUTE true +#endif + +#ifndef PROPERTIES_REQUIRED +#define PROPERTIES_REQUIRED 0 +#endif + +#ifndef PROPERTIES_PROVIDED +#define PROPERTIES_PROVIDED 0 +#endif + +#ifndef PROPERTIES_DESTROYED +#define PROPERTIES_DESTROYED 0 +#endif + +#ifndef TODO_FLAGS_START +#define TODO_FLAGS_START 0 +#endif + +#ifndef TODO_FLAGS_FINISH +#define TODO_FLAGS_FINISH 0 +#endif + +#ifndef FUNCTION_TRANSFORM_TODO_FLAGS_START +#define FUNCTION_TRANSFORM_TODO_FLAGS_START 0 +#endif + +#if BUILDING_GCC_VERSION >= 4009 +namespace { +static const pass_data _PASS_NAME_PASS_DATA = { +#else +static struct ipa_opt_pass_d _PASS_NAME_PASS = { + .pass = { +#endif + .type = IPA_PASS, + .name = _PASS_NAME_NAME, +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif +#if BUILDING_GCC_VERSION >= 5000 +#elif BUILDING_GCC_VERSION == 4009 + .has_gate = _HAS_GATE, + .has_execute = _HAS_EXECUTE, +#else + .gate = _GATE, + .execute = _EXECUTE, + .sub = NULL, + .next = NULL, + .static_pass_number = 0, +#endif + .tv_id = TV_NONE, + .properties_required = PROPERTIES_REQUIRED, + .properties_provided = PROPERTIES_PROVIDED, + .properties_destroyed = PROPERTIES_DESTROYED, + .todo_flags_start = TODO_FLAGS_START, + .todo_flags_finish = TODO_FLAGS_FINISH, +#if BUILDING_GCC_VERSION < 4009 + }, + .generate_summary = _GENERATE_SUMMARY, + .write_summary = _WRITE_SUMMARY, + .read_summary = _READ_SUMMARY, +#if BUILDING_GCC_VERSION >= 4006 + .write_optimization_summary = _WRITE_OPTIMIZATION_SUMMARY, + .read_optimization_summary = _READ_OPTIMIZATION_SUMMARY, +#endif + .stmt_fixup = _STMT_FIXUP, + .function_transform_todo_flags_start = FUNCTION_TRANSFORM_TODO_FLAGS_START, + .function_transform = _FUNCTION_TRANSFORM, + .variable_transform = _VARIABLE_TRANSFORM, +#endif +}; + +#if BUILDING_GCC_VERSION >= 4009 +class _PASS_NAME_PASS : public ipa_opt_pass_d { +public: + _PASS_NAME_PASS() : ipa_opt_pass_d(_PASS_NAME_PASS_DATA, + g, + _GENERATE_SUMMARY, + _WRITE_SUMMARY, + _READ_SUMMARY, + _WRITE_OPTIMIZATION_SUMMARY, + _READ_OPTIMIZATION_SUMMARY, + _STMT_FIXUP, + FUNCTION_TRANSFORM_TODO_FLAGS_START, + _FUNCTION_TRANSFORM, + _VARIABLE_TRANSFORM) {} + +#ifndef NO_GATE +#if BUILDING_GCC_VERSION >= 5000 + virtual bool gate(function *) { return _GATE(); } +#else + virtual bool gate(void) { return _GATE(); } +#endif +#endif + + virtual opt_pass *clone() { return new _PASS_NAME_PASS(); } + +#ifndef NO_EXECUTE +#if BUILDING_GCC_VERSION >= 5000 + virtual unsigned int execute(function *) { return _EXECUTE(); } +#else + virtual unsigned int execute(void) { return _EXECUTE(); } +#endif +#endif +}; +} + +opt_pass *_MAKE_PASS_NAME_PASS(void) +{ + return new _PASS_NAME_PASS(); +} +#else +struct opt_pass *_MAKE_PASS_NAME_PASS(void) +{ + return &_PASS_NAME_PASS.pass; +} +#endif + +/* clean up user provided defines */ +#undef PASS_NAME +#undef NO_GENERATE_SUMMARY +#undef NO_WRITE_SUMMARY +#undef NO_READ_SUMMARY +#undef NO_WRITE_OPTIMIZATION_SUMMARY +#undef NO_READ_OPTIMIZATION_SUMMARY +#undef NO_STMT_FIXUP +#undef NO_FUNCTION_TRANSFORM +#undef NO_VARIABLE_TRANSFORM +#undef NO_GATE +#undef NO_EXECUTE + +#undef FUNCTION_TRANSFORM_TODO_FLAGS_START +#undef PROPERTIES_DESTROYED +#undef PROPERTIES_PROVIDED +#undef PROPERTIES_REQUIRED +#undef TODO_FLAGS_FINISH +#undef TODO_FLAGS_START + +/* clean up generated defines */ +#undef _EXECUTE +#undef __EXECUTE +#undef _FUNCTION_TRANSFORM +#undef __FUNCTION_TRANSFORM +#undef _GATE +#undef __GATE +#undef _GCC_PLUGIN_CONCAT2 +#undef _GCC_PLUGIN_CONCAT3 +#undef _GCC_PLUGIN_STRINGIFY +#undef __GCC_PLUGIN_STRINGIFY +#undef _GENERATE_SUMMARY +#undef __GENERATE_SUMMARY +#undef _HAS_EXECUTE +#undef _HAS_GATE +#undef _MAKE_PASS_NAME_PASS +#undef __MAKE_PASS_NAME_PASS +#undef _PASS_NAME_NAME +#undef _PASS_NAME_PASS +#undef __PASS_NAME_PASS +#undef _PASS_NAME_PASS_DATA +#undef __PASS_NAME_PASS_DATA +#undef _READ_OPTIMIZATION_SUMMARY +#undef __READ_OPTIMIZATION_SUMMARY +#undef _READ_SUMMARY +#undef __READ_SUMMARY +#undef _STMT_FIXUP +#undef __STMT_FIXUP +#undef _VARIABLE_TRANSFORM +#undef __VARIABLE_TRANSFORM +#undef _WRITE_OPTIMIZATION_SUMMARY +#undef __WRITE_OPTIMIZATION_SUMMARY +#undef _WRITE_SUMMARY +#undef __WRITE_SUMMARY + +#endif /* PASS_NAME */ diff --git a/src/net/scripts/gcc-plugins/gcc-generate-rtl-pass.h b/src/net/scripts/gcc-plugins/gcc-generate-rtl-pass.h new file mode 100644 index 0000000..d69cd80 --- /dev/null +++ b/src/net/scripts/gcc-plugins/gcc-generate-rtl-pass.h @@ -0,0 +1,176 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Generator for RTL pass related boilerplate code/data + * + * Supports gcc 4.5-6 + * + * Usage: + * + * 1. before inclusion define PASS_NAME + * 2. before inclusion define NO_* for unimplemented callbacks + * NO_GATE + * NO_EXECUTE + * 3. before inclusion define PROPERTIES_* and TODO_FLAGS_* to override + * the default 0 values + * 4. for convenience, all the above will be undefined after inclusion! + * 5. the only exported name is make_PASS_NAME_pass() to register with gcc + */ + +#ifndef PASS_NAME +#error at least PASS_NAME must be defined +#else +#define __GCC_PLUGIN_STRINGIFY(n) #n +#define _GCC_PLUGIN_STRINGIFY(n) __GCC_PLUGIN_STRINGIFY(n) +#define _GCC_PLUGIN_CONCAT2(x, y) x ## y +#define _GCC_PLUGIN_CONCAT3(x, y, z) x ## y ## z + +#define __PASS_NAME_PASS_DATA(n) _GCC_PLUGIN_CONCAT2(n, _pass_data) +#define _PASS_NAME_PASS_DATA __PASS_NAME_PASS_DATA(PASS_NAME) + +#define __PASS_NAME_PASS(n) _GCC_PLUGIN_CONCAT2(n, _pass) +#define _PASS_NAME_PASS __PASS_NAME_PASS(PASS_NAME) + +#define _PASS_NAME_NAME _GCC_PLUGIN_STRINGIFY(PASS_NAME) + +#define __MAKE_PASS_NAME_PASS(n) _GCC_PLUGIN_CONCAT3(make_, n, _pass) +#define _MAKE_PASS_NAME_PASS __MAKE_PASS_NAME_PASS(PASS_NAME) + +#ifdef NO_GATE +#define _GATE NULL +#define _HAS_GATE false +#else +#define __GATE(n) _GCC_PLUGIN_CONCAT2(n, _gate) +#define _GATE __GATE(PASS_NAME) +#define _HAS_GATE true +#endif + +#ifdef NO_EXECUTE +#define _EXECUTE NULL +#define _HAS_EXECUTE false +#else +#define __EXECUTE(n) _GCC_PLUGIN_CONCAT2(n, _execute) +#define _EXECUTE __EXECUTE(PASS_NAME) +#define _HAS_EXECUTE true +#endif + +#ifndef PROPERTIES_REQUIRED +#define PROPERTIES_REQUIRED 0 +#endif + +#ifndef PROPERTIES_PROVIDED +#define PROPERTIES_PROVIDED 0 +#endif + +#ifndef PROPERTIES_DESTROYED +#define PROPERTIES_DESTROYED 0 +#endif + +#ifndef TODO_FLAGS_START +#define TODO_FLAGS_START 0 +#endif + +#ifndef TODO_FLAGS_FINISH +#define TODO_FLAGS_FINISH 0 +#endif + +#if BUILDING_GCC_VERSION >= 4009 +namespace { +static const pass_data _PASS_NAME_PASS_DATA = { +#else +static struct rtl_opt_pass _PASS_NAME_PASS = { + .pass = { +#endif + .type = RTL_PASS, + .name = _PASS_NAME_NAME, +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif +#if BUILDING_GCC_VERSION >= 5000 +#elif BUILDING_GCC_VERSION == 4009 + .has_gate = _HAS_GATE, + .has_execute = _HAS_EXECUTE, +#else + .gate = _GATE, + .execute = _EXECUTE, + .sub = NULL, + .next = NULL, + .static_pass_number = 0, +#endif + .tv_id = TV_NONE, + .properties_required = PROPERTIES_REQUIRED, + .properties_provided = PROPERTIES_PROVIDED, + .properties_destroyed = PROPERTIES_DESTROYED, + .todo_flags_start = TODO_FLAGS_START, + .todo_flags_finish = TODO_FLAGS_FINISH, +#if BUILDING_GCC_VERSION < 4009 + } +#endif +}; + +#if BUILDING_GCC_VERSION >= 4009 +class _PASS_NAME_PASS : public rtl_opt_pass { +public: + _PASS_NAME_PASS() : rtl_opt_pass(_PASS_NAME_PASS_DATA, g) {} + +#ifndef NO_GATE +#if BUILDING_GCC_VERSION >= 5000 + virtual bool gate(function *) { return _GATE(); } +#else + virtual bool gate(void) { return _GATE(); } +#endif +#endif + + virtual opt_pass *clone() { return new _PASS_NAME_PASS(); } + +#ifndef NO_EXECUTE +#if BUILDING_GCC_VERSION >= 5000 + virtual unsigned int execute(function *) { return _EXECUTE(); } +#else + virtual unsigned int execute(void) { return _EXECUTE(); } +#endif +#endif +}; +} + +opt_pass *_MAKE_PASS_NAME_PASS(void) +{ + return new _PASS_NAME_PASS(); +} +#else +struct opt_pass *_MAKE_PASS_NAME_PASS(void) +{ + return &_PASS_NAME_PASS.pass; +} +#endif + +/* clean up user provided defines */ +#undef PASS_NAME +#undef NO_GATE +#undef NO_EXECUTE + +#undef PROPERTIES_DESTROYED +#undef PROPERTIES_PROVIDED +#undef PROPERTIES_REQUIRED +#undef TODO_FLAGS_FINISH +#undef TODO_FLAGS_START + +/* clean up generated defines */ +#undef _EXECUTE +#undef __EXECUTE +#undef _GATE +#undef __GATE +#undef _GCC_PLUGIN_CONCAT2 +#undef _GCC_PLUGIN_CONCAT3 +#undef _GCC_PLUGIN_STRINGIFY +#undef __GCC_PLUGIN_STRINGIFY +#undef _HAS_EXECUTE +#undef _HAS_GATE +#undef _MAKE_PASS_NAME_PASS +#undef __MAKE_PASS_NAME_PASS +#undef _PASS_NAME_NAME +#undef _PASS_NAME_PASS +#undef __PASS_NAME_PASS +#undef _PASS_NAME_PASS_DATA +#undef __PASS_NAME_PASS_DATA + +#endif /* PASS_NAME */ diff --git a/src/net/scripts/gcc-plugins/gcc-generate-simple_ipa-pass.h b/src/net/scripts/gcc-plugins/gcc-generate-simple_ipa-pass.h new file mode 100644 index 0000000..06800bc --- /dev/null +++ b/src/net/scripts/gcc-plugins/gcc-generate-simple_ipa-pass.h @@ -0,0 +1,176 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Generator for SIMPLE_IPA pass related boilerplate code/data + * + * Supports gcc 4.5-6 + * + * Usage: + * + * 1. before inclusion define PASS_NAME + * 2. before inclusion define NO_* for unimplemented callbacks + * NO_GATE + * NO_EXECUTE + * 3. before inclusion define PROPERTIES_* and TODO_FLAGS_* to override + * the default 0 values + * 4. for convenience, all the above will be undefined after inclusion! + * 5. the only exported name is make_PASS_NAME_pass() to register with gcc + */ + +#ifndef PASS_NAME +#error at least PASS_NAME must be defined +#else +#define __GCC_PLUGIN_STRINGIFY(n) #n +#define _GCC_PLUGIN_STRINGIFY(n) __GCC_PLUGIN_STRINGIFY(n) +#define _GCC_PLUGIN_CONCAT2(x, y) x ## y +#define _GCC_PLUGIN_CONCAT3(x, y, z) x ## y ## z + +#define __PASS_NAME_PASS_DATA(n) _GCC_PLUGIN_CONCAT2(n, _pass_data) +#define _PASS_NAME_PASS_DATA __PASS_NAME_PASS_DATA(PASS_NAME) + +#define __PASS_NAME_PASS(n) _GCC_PLUGIN_CONCAT2(n, _pass) +#define _PASS_NAME_PASS __PASS_NAME_PASS(PASS_NAME) + +#define _PASS_NAME_NAME _GCC_PLUGIN_STRINGIFY(PASS_NAME) + +#define __MAKE_PASS_NAME_PASS(n) _GCC_PLUGIN_CONCAT3(make_, n, _pass) +#define _MAKE_PASS_NAME_PASS __MAKE_PASS_NAME_PASS(PASS_NAME) + +#ifdef NO_GATE +#define _GATE NULL +#define _HAS_GATE false +#else +#define __GATE(n) _GCC_PLUGIN_CONCAT2(n, _gate) +#define _GATE __GATE(PASS_NAME) +#define _HAS_GATE true +#endif + +#ifdef NO_EXECUTE +#define _EXECUTE NULL +#define _HAS_EXECUTE false +#else +#define __EXECUTE(n) _GCC_PLUGIN_CONCAT2(n, _execute) +#define _EXECUTE __EXECUTE(PASS_NAME) +#define _HAS_EXECUTE true +#endif + +#ifndef PROPERTIES_REQUIRED +#define PROPERTIES_REQUIRED 0 +#endif + +#ifndef PROPERTIES_PROVIDED +#define PROPERTIES_PROVIDED 0 +#endif + +#ifndef PROPERTIES_DESTROYED +#define PROPERTIES_DESTROYED 0 +#endif + +#ifndef TODO_FLAGS_START +#define TODO_FLAGS_START 0 +#endif + +#ifndef TODO_FLAGS_FINISH +#define TODO_FLAGS_FINISH 0 +#endif + +#if BUILDING_GCC_VERSION >= 4009 +namespace { +static const pass_data _PASS_NAME_PASS_DATA = { +#else +static struct simple_ipa_opt_pass _PASS_NAME_PASS = { + .pass = { +#endif + .type = SIMPLE_IPA_PASS, + .name = _PASS_NAME_NAME, +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif +#if BUILDING_GCC_VERSION >= 5000 +#elif BUILDING_GCC_VERSION == 4009 + .has_gate = _HAS_GATE, + .has_execute = _HAS_EXECUTE, +#else + .gate = _GATE, + .execute = _EXECUTE, + .sub = NULL, + .next = NULL, + .static_pass_number = 0, +#endif + .tv_id = TV_NONE, + .properties_required = PROPERTIES_REQUIRED, + .properties_provided = PROPERTIES_PROVIDED, + .properties_destroyed = PROPERTIES_DESTROYED, + .todo_flags_start = TODO_FLAGS_START, + .todo_flags_finish = TODO_FLAGS_FINISH, +#if BUILDING_GCC_VERSION < 4009 + } +#endif +}; + +#if BUILDING_GCC_VERSION >= 4009 +class _PASS_NAME_PASS : public simple_ipa_opt_pass { +public: + _PASS_NAME_PASS() : simple_ipa_opt_pass(_PASS_NAME_PASS_DATA, g) {} + +#ifndef NO_GATE +#if BUILDING_GCC_VERSION >= 5000 + virtual bool gate(function *) { return _GATE(); } +#else + virtual bool gate(void) { return _GATE(); } +#endif +#endif + + virtual opt_pass *clone() { return new _PASS_NAME_PASS(); } + +#ifndef NO_EXECUTE +#if BUILDING_GCC_VERSION >= 5000 + virtual unsigned int execute(function *) { return _EXECUTE(); } +#else + virtual unsigned int execute(void) { return _EXECUTE(); } +#endif +#endif +}; +} + +opt_pass *_MAKE_PASS_NAME_PASS(void) +{ + return new _PASS_NAME_PASS(); +} +#else +struct opt_pass *_MAKE_PASS_NAME_PASS(void) +{ + return &_PASS_NAME_PASS.pass; +} +#endif + +/* clean up user provided defines */ +#undef PASS_NAME +#undef NO_GATE +#undef NO_EXECUTE + +#undef PROPERTIES_DESTROYED +#undef PROPERTIES_PROVIDED +#undef PROPERTIES_REQUIRED +#undef TODO_FLAGS_FINISH +#undef TODO_FLAGS_START + +/* clean up generated defines */ +#undef _EXECUTE +#undef __EXECUTE +#undef _GATE +#undef __GATE +#undef _GCC_PLUGIN_CONCAT2 +#undef _GCC_PLUGIN_CONCAT3 +#undef _GCC_PLUGIN_STRINGIFY +#undef __GCC_PLUGIN_STRINGIFY +#undef _HAS_EXECUTE +#undef _HAS_GATE +#undef _MAKE_PASS_NAME_PASS +#undef __MAKE_PASS_NAME_PASS +#undef _PASS_NAME_NAME +#undef _PASS_NAME_PASS +#undef __PASS_NAME_PASS +#undef _PASS_NAME_PASS_DATA +#undef __PASS_NAME_PASS_DATA + +#endif /* PASS_NAME */ diff --git a/src/net/scripts/gcc-plugins/gen-random-seed.sh b/src/net/scripts/gcc-plugins/gen-random-seed.sh new file mode 100644 index 0000000..68af5cc --- /dev/null +++ b/src/net/scripts/gcc-plugins/gen-random-seed.sh @@ -0,0 +1,9 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 + +if [ ! -f "$1" ]; then + SEED=`od -A n -t x8 -N 32 /dev/urandom | tr -d ' \n'` + echo "const char *randstruct_seed = \"$SEED\";" > "$1" + HASH=`echo -n "$SEED" | sha256sum | cut -d" " -f1 | tr -d ' \n'` + echo "#define RANDSTRUCT_HASHED_SEED \"$HASH\"" > "$2" +fi diff --git a/src/net/scripts/gcc-plugins/latent_entropy_plugin.c b/src/net/scripts/gcc-plugins/latent_entropy_plugin.c new file mode 100644 index 0000000..c84bef1 --- /dev/null +++ b/src/net/scripts/gcc-plugins/latent_entropy_plugin.c @@ -0,0 +1,638 @@ +/* + * Copyright 2012-2016 by the PaX Team <pageexec@freemail.hu> + * Copyright 2016 by Emese Revfy <re.emese@gmail.com> + * Licensed under the GPL v2 + * + * Note: the choice of the license means that the compilation process is + * NOT 'eligible' as defined by gcc's library exception to the GPL v3, + * but for the kernel it doesn't matter since it doesn't link against + * any of the gcc libraries + * + * This gcc plugin helps generate a little bit of entropy from program state, + * used throughout the uptime of the kernel. Here is an instrumentation example: + * + * before: + * void __latent_entropy test(int argc, char *argv[]) + * { + * if (argc <= 1) + * printf("%s: no command arguments :(\n", *argv); + * else + * printf("%s: %d command arguments!\n", *argv, args - 1); + * } + * + * after: + * void __latent_entropy test(int argc, char *argv[]) + * { + * // latent_entropy_execute() 1. + * unsigned long local_entropy; + * // init_local_entropy() 1. + * void *local_entropy_frameaddr; + * // init_local_entropy() 3. + * unsigned long tmp_latent_entropy; + * + * // init_local_entropy() 2. + * local_entropy_frameaddr = __builtin_frame_address(0); + * local_entropy = (unsigned long) local_entropy_frameaddr; + * + * // init_local_entropy() 4. + * tmp_latent_entropy = latent_entropy; + * // init_local_entropy() 5. + * local_entropy ^= tmp_latent_entropy; + * + * // latent_entropy_execute() 3. + * if (argc <= 1) { + * // perturb_local_entropy() + * local_entropy += 4623067384293424948; + * printf("%s: no command arguments :(\n", *argv); + * // perturb_local_entropy() + * } else { + * local_entropy ^= 3896280633962944730; + * printf("%s: %d command arguments!\n", *argv, args - 1); + * } + * + * // latent_entropy_execute() 4. + * tmp_latent_entropy = rol(tmp_latent_entropy, local_entropy); + * latent_entropy = tmp_latent_entropy; + * } + * + * TODO: + * - add ipa pass to identify not explicitly marked candidate functions + * - mix in more program state (function arguments/return values, + * loop variables, etc) + * - more instrumentation control via attribute parameters + * + * BUGS: + * - none known + * + * Options: + * -fplugin-arg-latent_entropy_plugin-disable + * + * Attribute: __attribute__((latent_entropy)) + * The latent_entropy gcc attribute can be only on functions and variables. + * If it is on a function then the plugin will instrument it. If the attribute + * is on a variable then the plugin will initialize it with a random value. + * The variable must be an integer, an integer array type or a structure + * with integer fields. + */ + +#include "gcc-common.h" + +__visible int plugin_is_GPL_compatible; + +static GTY(()) tree latent_entropy_decl; + +static struct plugin_info latent_entropy_plugin_info = { + .version = "201606141920vanilla", + .help = "disable\tturn off latent entropy instrumentation\n", +}; + +static unsigned HOST_WIDE_INT deterministic_seed; +static unsigned HOST_WIDE_INT rnd_buf[32]; +static size_t rnd_idx = ARRAY_SIZE(rnd_buf); +static int urandom_fd = -1; + +static unsigned HOST_WIDE_INT get_random_const(void) +{ + if (deterministic_seed) { + unsigned HOST_WIDE_INT w = deterministic_seed; + w ^= w << 13; + w ^= w >> 7; + w ^= w << 17; + deterministic_seed = w; + return deterministic_seed; + } + + if (urandom_fd < 0) { + urandom_fd = open("/dev/urandom", O_RDONLY); + gcc_assert(urandom_fd >= 0); + } + if (rnd_idx >= ARRAY_SIZE(rnd_buf)) { + gcc_assert(read(urandom_fd, rnd_buf, sizeof(rnd_buf)) == sizeof(rnd_buf)); + rnd_idx = 0; + } + return rnd_buf[rnd_idx++]; +} + +static tree tree_get_random_const(tree type) +{ + unsigned long long mask; + + mask = 1ULL << (TREE_INT_CST_LOW(TYPE_SIZE(type)) - 1); + mask = 2 * (mask - 1) + 1; + + if (TYPE_UNSIGNED(type)) + return build_int_cstu(type, mask & get_random_const()); + return build_int_cst(type, mask & get_random_const()); +} + +static tree handle_latent_entropy_attribute(tree *node, tree name, + tree args __unused, + int flags __unused, + bool *no_add_attrs) +{ + tree type; +#if BUILDING_GCC_VERSION <= 4007 + VEC(constructor_elt, gc) *vals; +#else + vec<constructor_elt, va_gc> *vals; +#endif + + switch (TREE_CODE(*node)) { + default: + *no_add_attrs = true; + error("%qE attribute only applies to functions and variables", + name); + break; + + case VAR_DECL: + if (DECL_INITIAL(*node)) { + *no_add_attrs = true; + error("variable %qD with %qE attribute must not be initialized", + *node, name); + break; + } + + if (!TREE_STATIC(*node)) { + *no_add_attrs = true; + error("variable %qD with %qE attribute must not be local", + *node, name); + break; + } + + type = TREE_TYPE(*node); + switch (TREE_CODE(type)) { + default: + *no_add_attrs = true; + error("variable %qD with %qE attribute must be an integer or a fixed length integer array type or a fixed sized structure with integer fields", + *node, name); + break; + + case RECORD_TYPE: { + tree fld, lst = TYPE_FIELDS(type); + unsigned int nelt = 0; + + for (fld = lst; fld; nelt++, fld = TREE_CHAIN(fld)) { + tree fieldtype; + + fieldtype = TREE_TYPE(fld); + if (TREE_CODE(fieldtype) == INTEGER_TYPE) + continue; + + *no_add_attrs = true; + error("structure variable %qD with %qE attribute has a non-integer field %qE", + *node, name, fld); + break; + } + + if (fld) + break; + +#if BUILDING_GCC_VERSION <= 4007 + vals = VEC_alloc(constructor_elt, gc, nelt); +#else + vec_alloc(vals, nelt); +#endif + + for (fld = lst; fld; fld = TREE_CHAIN(fld)) { + tree random_const, fld_t = TREE_TYPE(fld); + + random_const = tree_get_random_const(fld_t); + CONSTRUCTOR_APPEND_ELT(vals, fld, random_const); + } + + /* Initialize the fields with random constants */ + DECL_INITIAL(*node) = build_constructor(type, vals); + break; + } + + /* Initialize the variable with a random constant */ + case INTEGER_TYPE: + DECL_INITIAL(*node) = tree_get_random_const(type); + break; + + case ARRAY_TYPE: { + tree elt_type, array_size, elt_size; + unsigned int i, nelt; + HOST_WIDE_INT array_size_int, elt_size_int; + + elt_type = TREE_TYPE(type); + elt_size = TYPE_SIZE_UNIT(TREE_TYPE(type)); + array_size = TYPE_SIZE_UNIT(type); + + if (TREE_CODE(elt_type) != INTEGER_TYPE || !array_size + || TREE_CODE(array_size) != INTEGER_CST) { + *no_add_attrs = true; + error("array variable %qD with %qE attribute must be a fixed length integer array type", + *node, name); + break; + } + + array_size_int = TREE_INT_CST_LOW(array_size); + elt_size_int = TREE_INT_CST_LOW(elt_size); + nelt = array_size_int / elt_size_int; + +#if BUILDING_GCC_VERSION <= 4007 + vals = VEC_alloc(constructor_elt, gc, nelt); +#else + vec_alloc(vals, nelt); +#endif + + for (i = 0; i < nelt; i++) { + tree cst = size_int(i); + tree rand_cst = tree_get_random_const(elt_type); + + CONSTRUCTOR_APPEND_ELT(vals, cst, rand_cst); + } + + /* + * Initialize the elements of the array with random + * constants + */ + DECL_INITIAL(*node) = build_constructor(type, vals); + break; + } + } + break; + + case FUNCTION_DECL: + break; + } + + return NULL_TREE; +} + +static struct attribute_spec latent_entropy_attr = { }; + +static void register_attributes(void *event_data __unused, void *data __unused) +{ + latent_entropy_attr.name = "latent_entropy"; + latent_entropy_attr.decl_required = true; + latent_entropy_attr.handler = handle_latent_entropy_attribute; + + register_attribute(&latent_entropy_attr); +} + +static bool latent_entropy_gate(void) +{ + tree list; + + /* don't bother with noreturn functions for now */ + if (TREE_THIS_VOLATILE(current_function_decl)) + return false; + + /* gcc-4.5 doesn't discover some trivial noreturn functions */ + if (EDGE_COUNT(EXIT_BLOCK_PTR_FOR_FN(cfun)->preds) == 0) + return false; + + list = DECL_ATTRIBUTES(current_function_decl); + return lookup_attribute("latent_entropy", list) != NULL_TREE; +} + +static tree create_var(tree type, const char *name) +{ + tree var; + + var = create_tmp_var(type, name); + add_referenced_var(var); + mark_sym_for_renaming(var); + return var; +} + +/* + * Set up the next operation and its constant operand to use in the latent + * entropy PRNG. When RHS is specified, the request is for perturbing the + * local latent entropy variable, otherwise it is for perturbing the global + * latent entropy variable where the two operands are already given by the + * local and global latent entropy variables themselves. + * + * The operation is one of add/xor/rol when instrumenting the local entropy + * variable and one of add/xor when perturbing the global entropy variable. + * Rotation is not used for the latter case because it would transmit less + * entropy to the global variable than the other two operations. + */ +static enum tree_code get_op(tree *rhs) +{ + static enum tree_code op; + unsigned HOST_WIDE_INT random_const; + + random_const = get_random_const(); + + switch (op) { + case BIT_XOR_EXPR: + op = PLUS_EXPR; + break; + + case PLUS_EXPR: + if (rhs) { + op = LROTATE_EXPR; + /* + * This code limits the value of random_const to + * the size of a long for the rotation + */ + random_const %= TYPE_PRECISION(long_unsigned_type_node); + break; + } + + case LROTATE_EXPR: + default: + op = BIT_XOR_EXPR; + break; + } + if (rhs) + *rhs = build_int_cstu(long_unsigned_type_node, random_const); + return op; +} + +static gimple create_assign(enum tree_code code, tree lhs, tree op1, + tree op2) +{ + return gimple_build_assign_with_ops(code, lhs, op1, op2); +} + +static void perturb_local_entropy(basic_block bb, tree local_entropy) +{ + gimple_stmt_iterator gsi; + gimple assign; + tree rhs; + enum tree_code op; + + op = get_op(&rhs); + assign = create_assign(op, local_entropy, local_entropy, rhs); + gsi = gsi_after_labels(bb); + gsi_insert_before(&gsi, assign, GSI_NEW_STMT); + update_stmt(assign); +} + +static void __perturb_latent_entropy(gimple_stmt_iterator *gsi, + tree local_entropy) +{ + gimple assign; + tree temp; + enum tree_code op; + + /* 1. create temporary copy of latent_entropy */ + temp = create_var(long_unsigned_type_node, "temp_latent_entropy"); + + /* 2. read... */ + add_referenced_var(latent_entropy_decl); + mark_sym_for_renaming(latent_entropy_decl); + assign = gimple_build_assign(temp, latent_entropy_decl); + gsi_insert_before(gsi, assign, GSI_NEW_STMT); + update_stmt(assign); + + /* 3. ...modify... */ + op = get_op(NULL); + assign = create_assign(op, temp, temp, local_entropy); + gsi_insert_after(gsi, assign, GSI_NEW_STMT); + update_stmt(assign); + + /* 4. ...write latent_entropy */ + assign = gimple_build_assign(latent_entropy_decl, temp); + gsi_insert_after(gsi, assign, GSI_NEW_STMT); + update_stmt(assign); +} + +static bool handle_tail_calls(basic_block bb, tree local_entropy) +{ + gimple_stmt_iterator gsi; + + for (gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi)) { + gcall *call; + gimple stmt = gsi_stmt(gsi); + + if (!is_gimple_call(stmt)) + continue; + + call = as_a_gcall(stmt); + if (!gimple_call_tail_p(call)) + continue; + + __perturb_latent_entropy(&gsi, local_entropy); + return true; + } + + return false; +} + +static void perturb_latent_entropy(tree local_entropy) +{ + edge_iterator ei; + edge e, last_bb_e; + basic_block last_bb; + + gcc_assert(single_pred_p(EXIT_BLOCK_PTR_FOR_FN(cfun))); + last_bb_e = single_pred_edge(EXIT_BLOCK_PTR_FOR_FN(cfun)); + + FOR_EACH_EDGE(e, ei, last_bb_e->src->preds) { + if (ENTRY_BLOCK_PTR_FOR_FN(cfun) == e->src) + continue; + if (EXIT_BLOCK_PTR_FOR_FN(cfun) == e->src) + continue; + + handle_tail_calls(e->src, local_entropy); + } + + last_bb = single_pred(EXIT_BLOCK_PTR_FOR_FN(cfun)); + if (!handle_tail_calls(last_bb, local_entropy)) { + gimple_stmt_iterator gsi = gsi_last_bb(last_bb); + + __perturb_latent_entropy(&gsi, local_entropy); + } +} + +static void init_local_entropy(basic_block bb, tree local_entropy) +{ + gimple assign, call; + tree frame_addr, rand_const, tmp, fndecl, udi_frame_addr; + enum tree_code op; + unsigned HOST_WIDE_INT rand_cst; + gimple_stmt_iterator gsi = gsi_after_labels(bb); + + /* 1. create local_entropy_frameaddr */ + frame_addr = create_var(ptr_type_node, "local_entropy_frameaddr"); + + /* 2. local_entropy_frameaddr = __builtin_frame_address() */ + fndecl = builtin_decl_implicit(BUILT_IN_FRAME_ADDRESS); + call = gimple_build_call(fndecl, 1, integer_zero_node); + gimple_call_set_lhs(call, frame_addr); + gsi_insert_before(&gsi, call, GSI_NEW_STMT); + update_stmt(call); + + udi_frame_addr = fold_convert(long_unsigned_type_node, frame_addr); + assign = gimple_build_assign(local_entropy, udi_frame_addr); + gsi_insert_after(&gsi, assign, GSI_NEW_STMT); + update_stmt(assign); + + /* 3. create temporary copy of latent_entropy */ + tmp = create_var(long_unsigned_type_node, "temp_latent_entropy"); + + /* 4. read the global entropy variable into local entropy */ + add_referenced_var(latent_entropy_decl); + mark_sym_for_renaming(latent_entropy_decl); + assign = gimple_build_assign(tmp, latent_entropy_decl); + gsi_insert_after(&gsi, assign, GSI_NEW_STMT); + update_stmt(assign); + + /* 5. mix local_entropy_frameaddr into local entropy */ + assign = create_assign(BIT_XOR_EXPR, local_entropy, local_entropy, tmp); + gsi_insert_after(&gsi, assign, GSI_NEW_STMT); + update_stmt(assign); + + rand_cst = get_random_const(); + rand_const = build_int_cstu(long_unsigned_type_node, rand_cst); + op = get_op(NULL); + assign = create_assign(op, local_entropy, local_entropy, rand_const); + gsi_insert_after(&gsi, assign, GSI_NEW_STMT); + update_stmt(assign); +} + +static bool create_latent_entropy_decl(void) +{ + varpool_node_ptr node; + + if (latent_entropy_decl != NULL_TREE) + return true; + + FOR_EACH_VARIABLE(node) { + tree name, var = NODE_DECL(node); + + if (DECL_NAME_LENGTH(var) < sizeof("latent_entropy") - 1) + continue; + + name = DECL_NAME(var); + if (strcmp(IDENTIFIER_POINTER(name), "latent_entropy")) + continue; + + latent_entropy_decl = var; + break; + } + + return latent_entropy_decl != NULL_TREE; +} + +static unsigned int latent_entropy_execute(void) +{ + basic_block bb; + tree local_entropy; + + if (!create_latent_entropy_decl()) + return 0; + + /* prepare for step 2 below */ + gcc_assert(single_succ_p(ENTRY_BLOCK_PTR_FOR_FN(cfun))); + bb = single_succ(ENTRY_BLOCK_PTR_FOR_FN(cfun)); + if (!single_pred_p(bb)) { + split_edge(single_succ_edge(ENTRY_BLOCK_PTR_FOR_FN(cfun))); + gcc_assert(single_succ_p(ENTRY_BLOCK_PTR_FOR_FN(cfun))); + bb = single_succ(ENTRY_BLOCK_PTR_FOR_FN(cfun)); + } + + /* 1. create the local entropy variable */ + local_entropy = create_var(long_unsigned_type_node, "local_entropy"); + + /* 2. initialize the local entropy variable */ + init_local_entropy(bb, local_entropy); + + bb = bb->next_bb; + + /* + * 3. instrument each BB with an operation on the + * local entropy variable + */ + while (bb != EXIT_BLOCK_PTR_FOR_FN(cfun)) { + perturb_local_entropy(bb, local_entropy); + bb = bb->next_bb; + }; + + /* 4. mix local entropy into the global entropy variable */ + perturb_latent_entropy(local_entropy); + return 0; +} + +static void latent_entropy_start_unit(void *gcc_data __unused, + void *user_data __unused) +{ + tree type, id; + int quals; + + if (in_lto_p) + return; + + /* extern volatile unsigned long latent_entropy */ + quals = TYPE_QUALS(long_unsigned_type_node) | TYPE_QUAL_VOLATILE; + type = build_qualified_type(long_unsigned_type_node, quals); + id = get_identifier("latent_entropy"); + latent_entropy_decl = build_decl(UNKNOWN_LOCATION, VAR_DECL, id, type); + + TREE_STATIC(latent_entropy_decl) = 1; + TREE_PUBLIC(latent_entropy_decl) = 1; + TREE_USED(latent_entropy_decl) = 1; + DECL_PRESERVE_P(latent_entropy_decl) = 1; + TREE_THIS_VOLATILE(latent_entropy_decl) = 1; + DECL_EXTERNAL(latent_entropy_decl) = 1; + DECL_ARTIFICIAL(latent_entropy_decl) = 1; + lang_hooks.decls.pushdecl(latent_entropy_decl); +} + +#define PASS_NAME latent_entropy +#define PROPERTIES_REQUIRED PROP_gimple_leh | PROP_cfg +#define TODO_FLAGS_FINISH TODO_verify_ssa | TODO_verify_stmts | TODO_dump_func \ + | TODO_update_ssa +#include "gcc-generate-gimple-pass.h" + +__visible int plugin_init(struct plugin_name_args *plugin_info, + struct plugin_gcc_version *version) +{ + bool enabled = true; + const char * const plugin_name = plugin_info->base_name; + const int argc = plugin_info->argc; + const struct plugin_argument * const argv = plugin_info->argv; + int i; + + /* + * Call get_random_seed() with noinit=true, so that this returns + * 0 in the case where no seed has been passed via -frandom-seed. + */ + deterministic_seed = get_random_seed(true); + + static const struct ggc_root_tab gt_ggc_r_gt_latent_entropy[] = { + { + .base = &latent_entropy_decl, + .nelt = 1, + .stride = sizeof(latent_entropy_decl), + .cb = >_ggc_mx_tree_node, + .pchw = >_pch_nx_tree_node + }, + LAST_GGC_ROOT_TAB + }; + + PASS_INFO(latent_entropy, "optimized", 1, PASS_POS_INSERT_BEFORE); + + if (!plugin_default_version_check(version, &gcc_version)) { + error(G_("incompatible gcc/plugin versions")); + return 1; + } + + for (i = 0; i < argc; ++i) { + if (!(strcmp(argv[i].key, "disable"))) { + enabled = false; + continue; + } + error(G_("unknown option '-fplugin-arg-%s-%s'"), plugin_name, argv[i].key); + } + + register_callback(plugin_name, PLUGIN_INFO, NULL, + &latent_entropy_plugin_info); + if (enabled) { + register_callback(plugin_name, PLUGIN_START_UNIT, + &latent_entropy_start_unit, NULL); + register_callback(plugin_name, PLUGIN_REGISTER_GGC_ROOTS, + NULL, (void *)>_ggc_r_gt_latent_entropy); + register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, + &latent_entropy_pass_info); + } + register_callback(plugin_name, PLUGIN_ATTRIBUTES, register_attributes, + NULL); + + return 0; +} diff --git a/src/net/scripts/gcc-plugins/randomize_layout_plugin.c b/src/net/scripts/gcc-plugins/randomize_layout_plugin.c new file mode 100644 index 0000000..bd29e4e --- /dev/null +++ b/src/net/scripts/gcc-plugins/randomize_layout_plugin.c @@ -0,0 +1,992 @@ +/* + * Copyright 2014-2016 by Open Source Security, Inc., Brad Spengler <spender@grsecurity.net> + * and PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2 + * + * Note: the choice of the license means that the compilation process is + * NOT 'eligible' as defined by gcc's library exception to the GPL v3, + * but for the kernel it doesn't matter since it doesn't link against + * any of the gcc libraries + * + * Usage: + * $ # for 4.5/4.6/C based 4.7 + * $ gcc -I`gcc -print-file-name=plugin`/include -I`gcc -print-file-name=plugin`/include/c-family -fPIC -shared -O2 -o randomize_layout_plugin.so randomize_layout_plugin.c + * $ # for C++ based 4.7/4.8+ + * $ g++ -I`g++ -print-file-name=plugin`/include -I`g++ -print-file-name=plugin`/include/c-family -fPIC -shared -O2 -o randomize_layout_plugin.so randomize_layout_plugin.c + * $ gcc -fplugin=./randomize_layout_plugin.so test.c -O2 + */ + +#include "gcc-common.h" +#include "randomize_layout_seed.h" + +#if BUILDING_GCC_MAJOR < 4 || (BUILDING_GCC_MAJOR == 4 && BUILDING_GCC_MINOR < 7) +#error "The RANDSTRUCT plugin requires GCC 4.7 or newer." +#endif + +#define ORIG_TYPE_NAME(node) \ + (TYPE_NAME(TYPE_MAIN_VARIANT(node)) != NULL_TREE ? ((const unsigned char *)IDENTIFIER_POINTER(TYPE_NAME(TYPE_MAIN_VARIANT(node)))) : (const unsigned char *)"anonymous") + +#define INFORM(loc, msg, ...) inform(loc, "randstruct: " msg, ##__VA_ARGS__) +#define MISMATCH(loc, how, ...) INFORM(loc, "casting between randomized structure pointer types (" how "): %qT and %qT\n", __VA_ARGS__) + +__visible int plugin_is_GPL_compatible; + +static int performance_mode; + +static struct plugin_info randomize_layout_plugin_info = { + .version = "201402201816vanilla", + .help = "disable\t\t\tdo not activate plugin\n" + "performance-mode\tenable cacheline-aware layout randomization\n" +}; + +struct whitelist_entry { + const char *pathname; + const char *lhs; + const char *rhs; +}; + +static const struct whitelist_entry whitelist[] = { + /* NIU overloads mapping with page struct */ + { "drivers/net/ethernet/sun/niu.c", "page", "address_space" }, + /* unix_skb_parms via UNIXCB() buffer */ + { "net/unix/af_unix.c", "unix_skb_parms", "char" }, + /* big_key payload.data struct splashing */ + { "security/keys/big_key.c", "path", "void *" }, + /* walk struct security_hook_heads as an array of struct hlist_head */ + { "security/security.c", "hlist_head", "security_hook_heads" }, + { } +}; + +/* from old Linux dcache.h */ +static inline unsigned long +partial_name_hash(unsigned long c, unsigned long prevhash) +{ + return (prevhash + (c << 4) + (c >> 4)) * 11; +} +static inline unsigned int +name_hash(const unsigned char *name) +{ + unsigned long hash = 0; + unsigned int len = strlen((const char *)name); + while (len--) + hash = partial_name_hash(*name++, hash); + return (unsigned int)hash; +} + +static tree handle_randomize_layout_attr(tree *node, tree name, tree args, int flags, bool *no_add_attrs) +{ + tree type; + + *no_add_attrs = true; + if (TREE_CODE(*node) == FUNCTION_DECL) { + error("%qE attribute does not apply to functions (%qF)", name, *node); + return NULL_TREE; + } + + if (TREE_CODE(*node) == PARM_DECL) { + error("%qE attribute does not apply to function parameters (%qD)", name, *node); + return NULL_TREE; + } + + if (TREE_CODE(*node) == VAR_DECL) { + error("%qE attribute does not apply to variables (%qD)", name, *node); + return NULL_TREE; + } + + if (TYPE_P(*node)) { + type = *node; + } else { + gcc_assert(TREE_CODE(*node) == TYPE_DECL); + type = TREE_TYPE(*node); + } + + if (TREE_CODE(type) != RECORD_TYPE) { + error("%qE attribute used on %qT applies to struct types only", name, type); + return NULL_TREE; + } + + if (lookup_attribute(IDENTIFIER_POINTER(name), TYPE_ATTRIBUTES(type))) { + error("%qE attribute is already applied to the type %qT", name, type); + return NULL_TREE; + } + + *no_add_attrs = false; + + return NULL_TREE; +} + +/* set on complete types that we don't need to inspect further at all */ +static tree handle_randomize_considered_attr(tree *node, tree name, tree args, int flags, bool *no_add_attrs) +{ + *no_add_attrs = false; + return NULL_TREE; +} + +/* + * set on types that we've performed a shuffle on, to prevent re-shuffling + * this does not preclude us from inspecting its fields for potential shuffles + */ +static tree handle_randomize_performed_attr(tree *node, tree name, tree args, int flags, bool *no_add_attrs) +{ + *no_add_attrs = false; + return NULL_TREE; +} + +/* + * 64bit variant of Bob Jenkins' public domain PRNG + * 256 bits of internal state + */ + +typedef unsigned long long u64; + +typedef struct ranctx { u64 a; u64 b; u64 c; u64 d; } ranctx; + +#define rot(x,k) (((x)<<(k))|((x)>>(64-(k)))) +static u64 ranval(ranctx *x) { + u64 e = x->a - rot(x->b, 7); + x->a = x->b ^ rot(x->c, 13); + x->b = x->c + rot(x->d, 37); + x->c = x->d + e; + x->d = e + x->a; + return x->d; +} + +static void raninit(ranctx *x, u64 *seed) { + int i; + + x->a = seed[0]; + x->b = seed[1]; + x->c = seed[2]; + x->d = seed[3]; + + for (i=0; i < 30; ++i) + (void)ranval(x); +} + +static u64 shuffle_seed[4]; + +struct partition_group { + tree tree_start; + unsigned long start; + unsigned long length; +}; + +static void partition_struct(tree *fields, unsigned long length, struct partition_group *size_groups, unsigned long *num_groups) +{ + unsigned long i; + unsigned long accum_size = 0; + unsigned long accum_length = 0; + unsigned long group_idx = 0; + + gcc_assert(length < INT_MAX); + + memset(size_groups, 0, sizeof(struct partition_group) * length); + + for (i = 0; i < length; i++) { + if (size_groups[group_idx].tree_start == NULL_TREE) { + size_groups[group_idx].tree_start = fields[i]; + size_groups[group_idx].start = i; + accum_length = 0; + accum_size = 0; + } + accum_size += (unsigned long)int_size_in_bytes(TREE_TYPE(fields[i])); + accum_length++; + if (accum_size >= 64) { + size_groups[group_idx].length = accum_length; + accum_length = 0; + group_idx++; + } + } + + if (size_groups[group_idx].tree_start != NULL_TREE && + !size_groups[group_idx].length) { + size_groups[group_idx].length = accum_length; + group_idx++; + } + + *num_groups = group_idx; +} + +static void performance_shuffle(tree *newtree, unsigned long length, ranctx *prng_state) +{ + unsigned long i, x; + struct partition_group size_group[length]; + unsigned long num_groups = 0; + unsigned long randnum; + + partition_struct(newtree, length, (struct partition_group *)&size_group, &num_groups); + for (i = num_groups - 1; i > 0; i--) { + struct partition_group tmp; + randnum = ranval(prng_state) % (i + 1); + tmp = size_group[i]; + size_group[i] = size_group[randnum]; + size_group[randnum] = tmp; + } + + for (x = 0; x < num_groups; x++) { + for (i = size_group[x].start + size_group[x].length - 1; i > size_group[x].start; i--) { + tree tmp; + if (DECL_BIT_FIELD_TYPE(newtree[i])) + continue; + randnum = ranval(prng_state) % (i + 1); + // we could handle this case differently if desired + if (DECL_BIT_FIELD_TYPE(newtree[randnum])) + continue; + tmp = newtree[i]; + newtree[i] = newtree[randnum]; + newtree[randnum] = tmp; + } + } +} + +static void full_shuffle(tree *newtree, unsigned long length, ranctx *prng_state) +{ + unsigned long i, randnum; + + for (i = length - 1; i > 0; i--) { + tree tmp; + randnum = ranval(prng_state) % (i + 1); + tmp = newtree[i]; + newtree[i] = newtree[randnum]; + newtree[randnum] = tmp; + } +} + +/* modern in-place Fisher-Yates shuffle */ +static void shuffle(const_tree type, tree *newtree, unsigned long length) +{ + unsigned long i; + u64 seed[4]; + ranctx prng_state; + const unsigned char *structname; + + if (length == 0) + return; + + gcc_assert(TREE_CODE(type) == RECORD_TYPE); + + structname = ORIG_TYPE_NAME(type); + +#ifdef __DEBUG_PLUGIN + fprintf(stderr, "Shuffling struct %s %p\n", (const char *)structname, type); +#ifdef __DEBUG_VERBOSE + debug_tree((tree)type); +#endif +#endif + + for (i = 0; i < 4; i++) { + seed[i] = shuffle_seed[i]; + seed[i] ^= name_hash(structname); + } + + raninit(&prng_state, (u64 *)&seed); + + if (performance_mode) + performance_shuffle(newtree, length, &prng_state); + else + full_shuffle(newtree, length, &prng_state); +} + +static bool is_flexible_array(const_tree field) +{ + const_tree fieldtype; + const_tree typesize; + const_tree elemtype; + const_tree elemsize; + + fieldtype = TREE_TYPE(field); + typesize = TYPE_SIZE(fieldtype); + + if (TREE_CODE(fieldtype) != ARRAY_TYPE) + return false; + + elemtype = TREE_TYPE(fieldtype); + elemsize = TYPE_SIZE(elemtype); + + /* size of type is represented in bits */ + + if (typesize == NULL_TREE && TYPE_DOMAIN(fieldtype) != NULL_TREE && + TYPE_MAX_VALUE(TYPE_DOMAIN(fieldtype)) == NULL_TREE) + return true; + + if (typesize != NULL_TREE && + (TREE_CONSTANT(typesize) && (!tree_to_uhwi(typesize) || + tree_to_uhwi(typesize) == tree_to_uhwi(elemsize)))) + return true; + + return false; +} + +static int relayout_struct(tree type) +{ + unsigned long num_fields = (unsigned long)list_length(TYPE_FIELDS(type)); + unsigned long shuffle_length = num_fields; + tree field; + tree newtree[num_fields]; + unsigned long i; + tree list; + tree variant; + tree main_variant; + expanded_location xloc; + bool has_flexarray = false; + + if (TYPE_FIELDS(type) == NULL_TREE) + return 0; + + if (num_fields < 2) + return 0; + + gcc_assert(TREE_CODE(type) == RECORD_TYPE); + + gcc_assert(num_fields < INT_MAX); + + if (lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(type)) || + lookup_attribute("no_randomize_layout", TYPE_ATTRIBUTES(TYPE_MAIN_VARIANT(type)))) + return 0; + + /* Workaround for 3rd-party VirtualBox source that we can't modify ourselves */ + if (!strcmp((const char *)ORIG_TYPE_NAME(type), "INTNETTRUNKFACTORY") || + !strcmp((const char *)ORIG_TYPE_NAME(type), "RAWPCIFACTORY")) + return 0; + + /* throw out any structs in uapi */ + xloc = expand_location(DECL_SOURCE_LOCATION(TYPE_FIELDS(type))); + + if (strstr(xloc.file, "/uapi/")) + error(G_("attempted to randomize userland API struct %s"), ORIG_TYPE_NAME(type)); + + for (field = TYPE_FIELDS(type), i = 0; field; field = TREE_CHAIN(field), i++) { + gcc_assert(TREE_CODE(field) == FIELD_DECL); + newtree[i] = field; + } + + /* + * enforce that we don't randomize the layout of the last + * element of a struct if it's a 0 or 1-length array + * or a proper flexible array + */ + if (is_flexible_array(newtree[num_fields - 1])) { + has_flexarray = true; + shuffle_length--; + } + + shuffle(type, (tree *)newtree, shuffle_length); + + /* + * set up a bogus anonymous struct field designed to error out on unnamed struct initializers + * as gcc provides no other way to detect such code + */ + list = make_node(FIELD_DECL); + TREE_CHAIN(list) = newtree[0]; + TREE_TYPE(list) = void_type_node; + DECL_SIZE(list) = bitsize_zero_node; + DECL_NONADDRESSABLE_P(list) = 1; + DECL_FIELD_BIT_OFFSET(list) = bitsize_zero_node; + DECL_SIZE_UNIT(list) = size_zero_node; + DECL_FIELD_OFFSET(list) = size_zero_node; + DECL_CONTEXT(list) = type; + // to satisfy the constify plugin + TREE_READONLY(list) = 1; + + for (i = 0; i < num_fields - 1; i++) + TREE_CHAIN(newtree[i]) = newtree[i+1]; + TREE_CHAIN(newtree[num_fields - 1]) = NULL_TREE; + + main_variant = TYPE_MAIN_VARIANT(type); + for (variant = main_variant; variant; variant = TYPE_NEXT_VARIANT(variant)) { + TYPE_FIELDS(variant) = list; + TYPE_ATTRIBUTES(variant) = copy_list(TYPE_ATTRIBUTES(variant)); + TYPE_ATTRIBUTES(variant) = tree_cons(get_identifier("randomize_performed"), NULL_TREE, TYPE_ATTRIBUTES(variant)); + TYPE_ATTRIBUTES(variant) = tree_cons(get_identifier("designated_init"), NULL_TREE, TYPE_ATTRIBUTES(variant)); + if (has_flexarray) + TYPE_ATTRIBUTES(type) = tree_cons(get_identifier("has_flexarray"), NULL_TREE, TYPE_ATTRIBUTES(type)); + } + + /* + * force a re-layout of the main variant + * the TYPE_SIZE for all variants will be recomputed + * by finalize_type_size() + */ + TYPE_SIZE(main_variant) = NULL_TREE; + layout_type(main_variant); + gcc_assert(TYPE_SIZE(main_variant) != NULL_TREE); + + return 1; +} + +/* from constify plugin */ +static const_tree get_field_type(const_tree field) +{ + return strip_array_types(TREE_TYPE(field)); +} + +/* from constify plugin */ +static bool is_fptr(const_tree fieldtype) +{ + if (TREE_CODE(fieldtype) != POINTER_TYPE) + return false; + + return TREE_CODE(TREE_TYPE(fieldtype)) == FUNCTION_TYPE; +} + +/* derived from constify plugin */ +static int is_pure_ops_struct(const_tree node) +{ + const_tree field; + + gcc_assert(TREE_CODE(node) == RECORD_TYPE || TREE_CODE(node) == UNION_TYPE); + + for (field = TYPE_FIELDS(node); field; field = TREE_CHAIN(field)) { + const_tree fieldtype = get_field_type(field); + enum tree_code code = TREE_CODE(fieldtype); + + if (node == fieldtype) + continue; + + if (code == RECORD_TYPE || code == UNION_TYPE) { + if (!is_pure_ops_struct(fieldtype)) + return 0; + continue; + } + + if (!is_fptr(fieldtype)) + return 0; + } + + return 1; +} + +static void randomize_type(tree type) +{ + tree variant; + + gcc_assert(TREE_CODE(type) == RECORD_TYPE); + + if (lookup_attribute("randomize_considered", TYPE_ATTRIBUTES(type))) + return; + + if (lookup_attribute("randomize_layout", TYPE_ATTRIBUTES(TYPE_MAIN_VARIANT(type))) || is_pure_ops_struct(type)) + relayout_struct(type); + + for (variant = TYPE_MAIN_VARIANT(type); variant; variant = TYPE_NEXT_VARIANT(variant)) { + TYPE_ATTRIBUTES(type) = copy_list(TYPE_ATTRIBUTES(type)); + TYPE_ATTRIBUTES(type) = tree_cons(get_identifier("randomize_considered"), NULL_TREE, TYPE_ATTRIBUTES(type)); + } +#ifdef __DEBUG_PLUGIN + fprintf(stderr, "Marking randomize_considered on struct %s\n", ORIG_TYPE_NAME(type)); +#ifdef __DEBUG_VERBOSE + debug_tree(type); +#endif +#endif +} + +static void update_decl_size(tree decl) +{ + tree lastval, lastidx, field, init, type, flexsize; + unsigned HOST_WIDE_INT len; + + type = TREE_TYPE(decl); + + if (!lookup_attribute("has_flexarray", TYPE_ATTRIBUTES(type))) + return; + + init = DECL_INITIAL(decl); + if (init == NULL_TREE || init == error_mark_node) + return; + + if (TREE_CODE(init) != CONSTRUCTOR) + return; + + len = CONSTRUCTOR_NELTS(init); + if (!len) + return; + + lastval = CONSTRUCTOR_ELT(init, CONSTRUCTOR_NELTS(init) - 1)->value; + lastidx = CONSTRUCTOR_ELT(init, CONSTRUCTOR_NELTS(init) - 1)->index; + + for (field = TYPE_FIELDS(TREE_TYPE(decl)); TREE_CHAIN(field); field = TREE_CHAIN(field)) + ; + + if (lastidx != field) + return; + + if (TREE_CODE(lastval) != STRING_CST) { + error("Only string constants are supported as initializers " + "for randomized structures with flexible arrays"); + return; + } + + flexsize = bitsize_int(TREE_STRING_LENGTH(lastval) * + tree_to_uhwi(TYPE_SIZE(TREE_TYPE(TREE_TYPE(lastval))))); + + DECL_SIZE(decl) = size_binop(PLUS_EXPR, TYPE_SIZE(type), flexsize); + + return; +} + + +static void randomize_layout_finish_decl(void *event_data, void *data) +{ + tree decl = (tree)event_data; + tree type; + + if (decl == NULL_TREE || decl == error_mark_node) + return; + + type = TREE_TYPE(decl); + + if (TREE_CODE(decl) != VAR_DECL) + return; + + if (TREE_CODE(type) != RECORD_TYPE && TREE_CODE(type) != UNION_TYPE) + return; + + if (!lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(type))) + return; + + DECL_SIZE(decl) = 0; + DECL_SIZE_UNIT(decl) = 0; + SET_DECL_ALIGN(decl, 0); + SET_DECL_MODE (decl, VOIDmode); + SET_DECL_RTL(decl, 0); + update_decl_size(decl); + layout_decl(decl, 0); +} + +static void finish_type(void *event_data, void *data) +{ + tree type = (tree)event_data; + + if (type == NULL_TREE || type == error_mark_node) + return; + + if (TREE_CODE(type) != RECORD_TYPE) + return; + + if (TYPE_FIELDS(type) == NULL_TREE) + return; + + if (lookup_attribute("randomize_considered", TYPE_ATTRIBUTES(type))) + return; + +#ifdef __DEBUG_PLUGIN + fprintf(stderr, "Calling randomize_type on %s\n", ORIG_TYPE_NAME(type)); +#endif +#ifdef __DEBUG_VERBOSE + debug_tree(type); +#endif + randomize_type(type); + + return; +} + +static struct attribute_spec randomize_layout_attr = { }; +static struct attribute_spec no_randomize_layout_attr = { }; +static struct attribute_spec randomize_considered_attr = { }; +static struct attribute_spec randomize_performed_attr = { }; + +static void register_attributes(void *event_data, void *data) +{ + randomize_layout_attr.name = "randomize_layout"; + randomize_layout_attr.type_required = true; + randomize_layout_attr.handler = handle_randomize_layout_attr; +#if BUILDING_GCC_VERSION >= 4007 + randomize_layout_attr.affects_type_identity = true; +#endif + + no_randomize_layout_attr.name = "no_randomize_layout"; + no_randomize_layout_attr.type_required = true; + no_randomize_layout_attr.handler = handle_randomize_layout_attr; +#if BUILDING_GCC_VERSION >= 4007 + no_randomize_layout_attr.affects_type_identity = true; +#endif + + randomize_considered_attr.name = "randomize_considered"; + randomize_considered_attr.type_required = true; + randomize_considered_attr.handler = handle_randomize_considered_attr; + + randomize_performed_attr.name = "randomize_performed"; + randomize_performed_attr.type_required = true; + randomize_performed_attr.handler = handle_randomize_performed_attr; + + register_attribute(&randomize_layout_attr); + register_attribute(&no_randomize_layout_attr); + register_attribute(&randomize_considered_attr); + register_attribute(&randomize_performed_attr); +} + +static void check_bad_casts_in_constructor(tree var, tree init) +{ + unsigned HOST_WIDE_INT idx; + tree field, val; + tree field_type, val_type; + + FOR_EACH_CONSTRUCTOR_ELT(CONSTRUCTOR_ELTS(init), idx, field, val) { + if (TREE_CODE(val) == CONSTRUCTOR) { + check_bad_casts_in_constructor(var, val); + continue; + } + + /* pipacs' plugin creates franken-arrays that differ from those produced by + normal code which all have valid 'field' trees. work around this */ + if (field == NULL_TREE) + continue; + field_type = TREE_TYPE(field); + val_type = TREE_TYPE(val); + + if (TREE_CODE(field_type) != POINTER_TYPE || TREE_CODE(val_type) != POINTER_TYPE) + continue; + + if (field_type == val_type) + continue; + + field_type = TYPE_MAIN_VARIANT(strip_array_types(TYPE_MAIN_VARIANT(TREE_TYPE(field_type)))); + val_type = TYPE_MAIN_VARIANT(strip_array_types(TYPE_MAIN_VARIANT(TREE_TYPE(val_type)))); + + if (field_type == void_type_node) + continue; + if (field_type == val_type) + continue; + if (TREE_CODE(val_type) != RECORD_TYPE) + continue; + + if (!lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(val_type))) + continue; + MISMATCH(DECL_SOURCE_LOCATION(var), "constructor\n", TYPE_MAIN_VARIANT(field_type), TYPE_MAIN_VARIANT(val_type)); + } +} + +/* derived from the constify plugin */ +static void check_global_variables(void *event_data, void *data) +{ + struct varpool_node *node; + tree init; + + FOR_EACH_VARIABLE(node) { + tree var = NODE_DECL(node); + init = DECL_INITIAL(var); + if (init == NULL_TREE) + continue; + + if (TREE_CODE(init) != CONSTRUCTOR) + continue; + + check_bad_casts_in_constructor(var, init); + } +} + +static bool dominated_by_is_err(const_tree rhs, basic_block bb) +{ + basic_block dom; + gimple dom_stmt; + gimple call_stmt; + const_tree dom_lhs; + const_tree poss_is_err_cond; + const_tree poss_is_err_func; + const_tree is_err_arg; + + dom = get_immediate_dominator(CDI_DOMINATORS, bb); + if (!dom) + return false; + + dom_stmt = last_stmt(dom); + if (!dom_stmt) + return false; + + if (gimple_code(dom_stmt) != GIMPLE_COND) + return false; + + if (gimple_cond_code(dom_stmt) != NE_EXPR) + return false; + + if (!integer_zerop(gimple_cond_rhs(dom_stmt))) + return false; + + poss_is_err_cond = gimple_cond_lhs(dom_stmt); + + if (TREE_CODE(poss_is_err_cond) != SSA_NAME) + return false; + + call_stmt = SSA_NAME_DEF_STMT(poss_is_err_cond); + + if (gimple_code(call_stmt) != GIMPLE_CALL) + return false; + + dom_lhs = gimple_get_lhs(call_stmt); + poss_is_err_func = gimple_call_fndecl(call_stmt); + if (!poss_is_err_func) + return false; + if (dom_lhs != poss_is_err_cond) + return false; + if (strcmp(DECL_NAME_POINTER(poss_is_err_func), "IS_ERR")) + return false; + + is_err_arg = gimple_call_arg(call_stmt, 0); + if (!is_err_arg) + return false; + + if (is_err_arg != rhs) + return false; + + return true; +} + +static void handle_local_var_initializers(void) +{ + tree var; + unsigned int i; + + FOR_EACH_LOCAL_DECL(cfun, i, var) { + tree init = DECL_INITIAL(var); + if (!init) + continue; + if (TREE_CODE(init) != CONSTRUCTOR) + continue; + check_bad_casts_in_constructor(var, init); + } +} + +static bool type_name_eq(gimple stmt, const_tree type_tree, const char *wanted_name) +{ + const char *type_name; + + if (type_tree == NULL_TREE) + return false; + + switch (TREE_CODE(type_tree)) { + case RECORD_TYPE: + type_name = TYPE_NAME_POINTER(type_tree); + break; + case INTEGER_TYPE: + if (TYPE_PRECISION(type_tree) == CHAR_TYPE_SIZE) + type_name = "char"; + else { + INFORM(gimple_location(stmt), "found non-char INTEGER_TYPE cast comparison: %qT\n", type_tree); + debug_tree(type_tree); + return false; + } + break; + case POINTER_TYPE: + if (TREE_CODE(TREE_TYPE(type_tree)) == VOID_TYPE) { + type_name = "void *"; + break; + } else { + INFORM(gimple_location(stmt), "found non-void POINTER_TYPE cast comparison %qT\n", type_tree); + debug_tree(type_tree); + return false; + } + default: + INFORM(gimple_location(stmt), "unhandled cast comparison: %qT\n", type_tree); + debug_tree(type_tree); + return false; + } + + return strcmp(type_name, wanted_name) == 0; +} + +static bool whitelisted_cast(gimple stmt, const_tree lhs_tree, const_tree rhs_tree) +{ + const struct whitelist_entry *entry; + expanded_location xloc = expand_location(gimple_location(stmt)); + + for (entry = whitelist; entry->pathname; entry++) { + if (!strstr(xloc.file, entry->pathname)) + continue; + + if (type_name_eq(stmt, lhs_tree, entry->lhs) && type_name_eq(stmt, rhs_tree, entry->rhs)) + return true; + } + + return false; +} + +/* + * iterate over all statements to find "bad" casts: + * those where the address of the start of a structure is cast + * to a pointer of a structure of a different type, or a + * structure pointer type is cast to a different structure pointer type + */ +static unsigned int find_bad_casts_execute(void) +{ + basic_block bb; + + handle_local_var_initializers(); + + FOR_EACH_BB_FN(bb, cfun) { + gimple_stmt_iterator gsi; + + for (gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi)) { + gimple stmt; + const_tree lhs; + const_tree lhs_type; + const_tree rhs1; + const_tree rhs_type; + const_tree ptr_lhs_type; + const_tree ptr_rhs_type; + const_tree op0; + const_tree op0_type; + enum tree_code rhs_code; + + stmt = gsi_stmt(gsi); + +#ifdef __DEBUG_PLUGIN +#ifdef __DEBUG_VERBOSE + debug_gimple_stmt(stmt); + debug_tree(gimple_get_lhs(stmt)); +#endif +#endif + + if (gimple_code(stmt) != GIMPLE_ASSIGN) + continue; + +#ifdef __DEBUG_PLUGIN +#ifdef __DEBUG_VERBOSE + debug_tree(gimple_assign_rhs1(stmt)); +#endif +#endif + + + rhs_code = gimple_assign_rhs_code(stmt); + + if (rhs_code != ADDR_EXPR && rhs_code != SSA_NAME) + continue; + + lhs = gimple_get_lhs(stmt); + lhs_type = TREE_TYPE(lhs); + rhs1 = gimple_assign_rhs1(stmt); + rhs_type = TREE_TYPE(rhs1); + + if (TREE_CODE(rhs_type) != POINTER_TYPE || + TREE_CODE(lhs_type) != POINTER_TYPE) + continue; + + ptr_lhs_type = TYPE_MAIN_VARIANT(strip_array_types(TYPE_MAIN_VARIANT(TREE_TYPE(lhs_type)))); + ptr_rhs_type = TYPE_MAIN_VARIANT(strip_array_types(TYPE_MAIN_VARIANT(TREE_TYPE(rhs_type)))); + + if (ptr_rhs_type == void_type_node) + continue; + + if (ptr_lhs_type == void_type_node) + continue; + + if (dominated_by_is_err(rhs1, bb)) + continue; + + if (TREE_CODE(ptr_rhs_type) != RECORD_TYPE) { +#ifndef __DEBUG_PLUGIN + if (lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(ptr_lhs_type))) +#endif + { + if (!whitelisted_cast(stmt, ptr_lhs_type, ptr_rhs_type)) + MISMATCH(gimple_location(stmt), "rhs", ptr_lhs_type, ptr_rhs_type); + } + continue; + } + + if (rhs_code == SSA_NAME && ptr_lhs_type == ptr_rhs_type) + continue; + + if (rhs_code == ADDR_EXPR) { + op0 = TREE_OPERAND(rhs1, 0); + + if (op0 == NULL_TREE) + continue; + + if (TREE_CODE(op0) != VAR_DECL) + continue; + + op0_type = TYPE_MAIN_VARIANT(strip_array_types(TYPE_MAIN_VARIANT(TREE_TYPE(op0)))); + if (op0_type == ptr_lhs_type) + continue; + +#ifndef __DEBUG_PLUGIN + if (lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(op0_type))) +#endif + { + if (!whitelisted_cast(stmt, ptr_lhs_type, op0_type)) + MISMATCH(gimple_location(stmt), "op0", ptr_lhs_type, op0_type); + } + } else { + const_tree ssa_name_var = SSA_NAME_VAR(rhs1); + /* skip bogus type casts introduced by container_of */ + if (ssa_name_var != NULL_TREE && DECL_NAME(ssa_name_var) && + !strcmp((const char *)DECL_NAME_POINTER(ssa_name_var), "__mptr")) + continue; +#ifndef __DEBUG_PLUGIN + if (lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(ptr_rhs_type))) +#endif + { + if (!whitelisted_cast(stmt, ptr_lhs_type, ptr_rhs_type)) + MISMATCH(gimple_location(stmt), "ssa", ptr_lhs_type, ptr_rhs_type); + } + } + + } + } + return 0; +} + +#define PASS_NAME find_bad_casts +#define NO_GATE +#define TODO_FLAGS_FINISH TODO_dump_func +#include "gcc-generate-gimple-pass.h" + +__visible int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version) +{ + int i; + const char * const plugin_name = plugin_info->base_name; + const int argc = plugin_info->argc; + const struct plugin_argument * const argv = plugin_info->argv; + bool enable = true; + int obtained_seed = 0; + struct register_pass_info find_bad_casts_pass_info; + + find_bad_casts_pass_info.pass = make_find_bad_casts_pass(); + find_bad_casts_pass_info.reference_pass_name = "ssa"; + find_bad_casts_pass_info.ref_pass_instance_number = 1; + find_bad_casts_pass_info.pos_op = PASS_POS_INSERT_AFTER; + + if (!plugin_default_version_check(version, &gcc_version)) { + error(G_("incompatible gcc/plugin versions")); + return 1; + } + + if (strncmp(lang_hooks.name, "GNU C", 5) && !strncmp(lang_hooks.name, "GNU C+", 6)) { + inform(UNKNOWN_LOCATION, G_("%s supports C only, not %s"), plugin_name, lang_hooks.name); + enable = false; + } + + for (i = 0; i < argc; ++i) { + if (!strcmp(argv[i].key, "disable")) { + enable = false; + continue; + } + if (!strcmp(argv[i].key, "performance-mode")) { + performance_mode = 1; + continue; + } + error(G_("unknown option '-fplugin-arg-%s-%s'"), plugin_name, argv[i].key); + } + + if (strlen(randstruct_seed) != 64) { + error(G_("invalid seed value supplied for %s plugin"), plugin_name); + return 1; + } + obtained_seed = sscanf(randstruct_seed, "%016llx%016llx%016llx%016llx", + &shuffle_seed[0], &shuffle_seed[1], &shuffle_seed[2], &shuffle_seed[3]); + if (obtained_seed != 4) { + error(G_("Invalid seed supplied for %s plugin"), plugin_name); + return 1; + } + + register_callback(plugin_name, PLUGIN_INFO, NULL, &randomize_layout_plugin_info); + if (enable) { + register_callback(plugin_name, PLUGIN_ALL_IPA_PASSES_START, check_global_variables, NULL); + register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &find_bad_casts_pass_info); + register_callback(plugin_name, PLUGIN_FINISH_TYPE, finish_type, NULL); + register_callback(plugin_name, PLUGIN_FINISH_DECL, randomize_layout_finish_decl, NULL); + } + register_callback(plugin_name, PLUGIN_ATTRIBUTES, register_attributes, NULL); + + return 0; +} diff --git a/src/net/scripts/gcc-plugins/sancov_plugin.c b/src/net/scripts/gcc-plugins/sancov_plugin.c new file mode 100644 index 0000000..caff4a6 --- /dev/null +++ b/src/net/scripts/gcc-plugins/sancov_plugin.c @@ -0,0 +1,140 @@ +/* + * Copyright 2011-2016 by Emese Revfy <re.emese@gmail.com> + * Licensed under the GPL v2, or (at your option) v3 + * + * Homepage: + * https://github.com/ephox-gcc-plugins/sancov + * + * This plugin inserts a __sanitizer_cov_trace_pc() call at the start of basic blocks. + * It supports all gcc versions with plugin support (from gcc-4.5 on). + * It is based on the commit "Add fuzzing coverage support" by Dmitry Vyukov <dvyukov@google.com>. + * + * You can read about it more here: + * https://gcc.gnu.org/viewcvs/gcc?limit_changes=0&view=revision&revision=231296 + * https://lwn.net/Articles/674854/ + * https://github.com/google/syzkaller + * https://lwn.net/Articles/677764/ + * + * Usage: + * make run + */ + +#include "gcc-common.h" + +__visible int plugin_is_GPL_compatible; + +tree sancov_fndecl; + +static struct plugin_info sancov_plugin_info = { + .version = "20160402", + .help = "sancov plugin\n", +}; + +static unsigned int sancov_execute(void) +{ + basic_block bb; + + /* Remove this line when this plugin and kcov will be in the kernel. + if (!strcmp(DECL_NAME_POINTER(current_function_decl), DECL_NAME_POINTER(sancov_fndecl))) + return 0; + */ + + FOR_EACH_BB_FN(bb, cfun) { + const_gimple stmt; + gcall *gcall; + gimple_stmt_iterator gsi = gsi_after_labels(bb); + + if (gsi_end_p(gsi)) + continue; + + stmt = gsi_stmt(gsi); + gcall = as_a_gcall(gimple_build_call(sancov_fndecl, 0)); + gimple_set_location(gcall, gimple_location(stmt)); + gsi_insert_before(&gsi, gcall, GSI_SAME_STMT); + } + return 0; +} + +#define PASS_NAME sancov + +#define NO_GATE +#define TODO_FLAGS_FINISH TODO_dump_func | TODO_verify_stmts | TODO_update_ssa_no_phi | TODO_verify_flow + +#include "gcc-generate-gimple-pass.h" + +static void sancov_start_unit(void __unused *gcc_data, void __unused *user_data) +{ + tree leaf_attr, nothrow_attr; + tree BT_FN_VOID = build_function_type_list(void_type_node, NULL_TREE); + + sancov_fndecl = build_fn_decl("__sanitizer_cov_trace_pc", BT_FN_VOID); + + DECL_ASSEMBLER_NAME(sancov_fndecl); + TREE_PUBLIC(sancov_fndecl) = 1; + DECL_EXTERNAL(sancov_fndecl) = 1; + DECL_ARTIFICIAL(sancov_fndecl) = 1; + DECL_PRESERVE_P(sancov_fndecl) = 1; + DECL_UNINLINABLE(sancov_fndecl) = 1; + TREE_USED(sancov_fndecl) = 1; + + nothrow_attr = tree_cons(get_identifier("nothrow"), NULL, NULL); + decl_attributes(&sancov_fndecl, nothrow_attr, 0); + gcc_assert(TREE_NOTHROW(sancov_fndecl)); +#if BUILDING_GCC_VERSION > 4005 + leaf_attr = tree_cons(get_identifier("leaf"), NULL, NULL); + decl_attributes(&sancov_fndecl, leaf_attr, 0); +#endif +} + +__visible int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version) +{ + int i; + const char * const plugin_name = plugin_info->base_name; + const int argc = plugin_info->argc; + const struct plugin_argument * const argv = plugin_info->argv; + bool enable = true; + + static const struct ggc_root_tab gt_ggc_r_gt_sancov[] = { + { + .base = &sancov_fndecl, + .nelt = 1, + .stride = sizeof(sancov_fndecl), + .cb = >_ggc_mx_tree_node, + .pchw = >_pch_nx_tree_node + }, + LAST_GGC_ROOT_TAB + }; + + /* BBs can be split afterwards?? */ +#if BUILDING_GCC_VERSION >= 4009 + PASS_INFO(sancov, "asan", 0, PASS_POS_INSERT_BEFORE); +#else + PASS_INFO(sancov, "nrv", 1, PASS_POS_INSERT_BEFORE); +#endif + + if (!plugin_default_version_check(version, &gcc_version)) { + error(G_("incompatible gcc/plugin versions")); + return 1; + } + + for (i = 0; i < argc; ++i) { + if (!strcmp(argv[i].key, "no-sancov")) { + enable = false; + continue; + } + error(G_("unknown option '-fplugin-arg-%s-%s'"), plugin_name, argv[i].key); + } + + register_callback(plugin_name, PLUGIN_INFO, NULL, &sancov_plugin_info); + + if (!enable) + return 0; + +#if BUILDING_GCC_VERSION < 6000 + register_callback(plugin_name, PLUGIN_START_UNIT, &sancov_start_unit, NULL); + register_callback(plugin_name, PLUGIN_REGISTER_GGC_ROOTS, NULL, (void *)>_ggc_r_gt_sancov); + register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &sancov_pass_info); +#endif + + return 0; +} diff --git a/src/net/scripts/gcc-plugins/stackleak_plugin.c b/src/net/scripts/gcc-plugins/stackleak_plugin.c new file mode 100644 index 0000000..dacd697 --- /dev/null +++ b/src/net/scripts/gcc-plugins/stackleak_plugin.c @@ -0,0 +1,631 @@ +/* + * Copyright 2011-2017 by the PaX Team <pageexec@freemail.hu> + * Modified by Alexander Popov <alex.popov@linux.com> + * Licensed under the GPL v2 + * + * Note: the choice of the license means that the compilation process is + * NOT 'eligible' as defined by gcc's library exception to the GPL v3, + * but for the kernel it doesn't matter since it doesn't link against + * any of the gcc libraries + * + * This gcc plugin is needed for tracking the lowest border of the kernel stack. + * It instruments the kernel code inserting stackleak_track_stack() calls: + * - after alloca(); + * - for the functions with a stack frame size greater than or equal + * to the "track-min-size" plugin parameter. + * + * This plugin is ported from grsecurity/PaX. For more information see: + * https://grsecurity.net/ + * https://pax.grsecurity.net/ + * + * Debugging: + * - use fprintf() to stderr, debug_generic_expr(), debug_gimple_stmt(), + * print_rtl_single() and debug_rtx(); + * - add "-fdump-tree-all -fdump-rtl-all" to the plugin CFLAGS in + * Makefile.gcc-plugins to see the verbose dumps of the gcc passes; + * - use gcc -E to understand the preprocessing shenanigans; + * - use gcc with enabled CFG/GIMPLE/SSA verification (--enable-checking). + */ + +#include "gcc-common.h" + +__visible int plugin_is_GPL_compatible; + +static int track_frame_size = -1; +static bool build_for_x86 = false; +static const char track_function[] = "stackleak_track_stack"; +static bool disable = false; +static bool verbose = false; + +/* + * Mark these global variables (roots) for gcc garbage collector since + * they point to the garbage-collected memory. + */ +static GTY(()) tree track_function_decl; + +static struct plugin_info stackleak_plugin_info = { + .version = "201707101337", + .help = "track-min-size=nn\ttrack stack for functions with a stack frame size >= nn bytes\n" + "arch=target_arch\tspecify target build arch\n" + "disable\t\tdo not activate the plugin\n" + "verbose\t\tprint info about the instrumentation\n" +}; + +static void add_stack_tracking_gcall(gimple_stmt_iterator *gsi, bool after) +{ + gimple stmt; + gcall *gimple_call; + cgraph_node_ptr node; + basic_block bb; + + /* Insert calling stackleak_track_stack() */ + stmt = gimple_build_call(track_function_decl, 0); + gimple_call = as_a_gcall(stmt); + if (after) + gsi_insert_after(gsi, gimple_call, GSI_CONTINUE_LINKING); + else + gsi_insert_before(gsi, gimple_call, GSI_SAME_STMT); + + /* Update the cgraph */ + bb = gimple_bb(gimple_call); + node = cgraph_get_create_node(track_function_decl); + gcc_assert(node); + cgraph_create_edge(cgraph_get_node(current_function_decl), node, + gimple_call, bb->count, + compute_call_stmt_bb_frequency(current_function_decl, bb)); +} + +static bool is_alloca(gimple stmt) +{ + if (gimple_call_builtin_p(stmt, BUILT_IN_ALLOCA)) + return true; + +#if BUILDING_GCC_VERSION >= 4007 + if (gimple_call_builtin_p(stmt, BUILT_IN_ALLOCA_WITH_ALIGN)) + return true; +#endif + + return false; +} + +static tree get_current_stack_pointer_decl(void) +{ + varpool_node_ptr node; + + FOR_EACH_VARIABLE(node) { + tree var = NODE_DECL(node); + tree name = DECL_NAME(var); + + if (DECL_NAME_LENGTH(var) != sizeof("current_stack_pointer") - 1) + continue; + + if (strcmp(IDENTIFIER_POINTER(name), "current_stack_pointer")) + continue; + + return var; + } + + if (verbose) { + fprintf(stderr, "stackleak: missing current_stack_pointer in %s()\n", + DECL_NAME_POINTER(current_function_decl)); + } + return NULL_TREE; +} + +static void add_stack_tracking_gasm(gimple_stmt_iterator *gsi, bool after) +{ + gasm *asm_call = NULL; + tree sp_decl, input; + vec<tree, va_gc> *inputs = NULL; + + /* 'no_caller_saved_registers' is currently supported only for x86 */ + gcc_assert(build_for_x86); + + /* + * Insert calling stackleak_track_stack() in asm: + * asm volatile("call stackleak_track_stack" + * :: "r" (current_stack_pointer)) + * Use ASM_CALL_CONSTRAINT trick from arch/x86/include/asm/asm.h. + * This constraint is taken into account during gcc shrink-wrapping + * optimization. It is needed to be sure that stackleak_track_stack() + * call is inserted after the prologue of the containing function, + * when the stack frame is prepared. + */ + sp_decl = get_current_stack_pointer_decl(); + if (sp_decl == NULL_TREE) { + add_stack_tracking_gcall(gsi, after); + return; + } + input = build_tree_list(NULL_TREE, build_const_char_string(2, "r")); + input = chainon(NULL_TREE, build_tree_list(input, sp_decl)); + vec_safe_push(inputs, input); + asm_call = gimple_build_asm_vec("call stackleak_track_stack", + inputs, NULL, NULL, NULL); + gimple_asm_set_volatile(asm_call, true); + if (after) + gsi_insert_after(gsi, asm_call, GSI_CONTINUE_LINKING); + else + gsi_insert_before(gsi, asm_call, GSI_SAME_STMT); + update_stmt(asm_call); +} + +static void add_stack_tracking(gimple_stmt_iterator *gsi, bool after) +{ + /* + * The 'no_caller_saved_registers' attribute is used for + * stackleak_track_stack(). If the compiler supports this attribute for + * the target arch, we can add calling stackleak_track_stack() in asm. + * That improves performance: we avoid useless operations with the + * caller-saved registers in the functions from which we will remove + * stackleak_track_stack() call during the stackleak_cleanup pass. + */ + if (lookup_attribute_spec(get_identifier("no_caller_saved_registers"))) + add_stack_tracking_gasm(gsi, after); + else + add_stack_tracking_gcall(gsi, after); +} + +/* + * Work with the GIMPLE representation of the code. Insert the + * stackleak_track_stack() call after alloca() and into the beginning + * of the function if it is not instrumented. + */ +static unsigned int stackleak_instrument_execute(void) +{ + basic_block bb, entry_bb; + bool prologue_instrumented = false, is_leaf = true; + gimple_stmt_iterator gsi = { 0 }; + + /* + * ENTRY_BLOCK_PTR is a basic block which represents possible entry + * point of a function. This block does not contain any code and + * has a CFG edge to its successor. + */ + gcc_assert(single_succ_p(ENTRY_BLOCK_PTR_FOR_FN(cfun))); + entry_bb = single_succ(ENTRY_BLOCK_PTR_FOR_FN(cfun)); + + /* + * Loop through the GIMPLE statements in each of cfun basic blocks. + * cfun is a global variable which represents the function that is + * currently processed. + */ + FOR_EACH_BB_FN(bb, cfun) { + for (gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi)) { + gimple stmt; + + stmt = gsi_stmt(gsi); + + /* Leaf function is a function which makes no calls */ + if (is_gimple_call(stmt)) + is_leaf = false; + + if (!is_alloca(stmt)) + continue; + + if (verbose) { + fprintf(stderr, "stackleak: be careful, alloca() in %s()\n", + DECL_NAME_POINTER(current_function_decl)); + } + + /* Insert stackleak_track_stack() call after alloca() */ + add_stack_tracking(&gsi, true); + if (bb == entry_bb) + prologue_instrumented = true; + } + } + + if (prologue_instrumented) + return 0; + + /* + * Special cases to skip the instrumentation. + * + * Taking the address of static inline functions materializes them, + * but we mustn't instrument some of them as the resulting stack + * alignment required by the function call ABI will break other + * assumptions regarding the expected (but not otherwise enforced) + * register clobbering ABI. + * + * Case in point: native_save_fl on amd64 when optimized for size + * clobbers rdx if it were instrumented here. + * + * TODO: any more special cases? + */ + if (is_leaf && + !TREE_PUBLIC(current_function_decl) && + DECL_DECLARED_INLINE_P(current_function_decl)) { + return 0; + } + + if (is_leaf && + !strncmp(IDENTIFIER_POINTER(DECL_NAME(current_function_decl)), + "_paravirt_", 10)) { + return 0; + } + + /* Insert stackleak_track_stack() call at the function beginning */ + bb = entry_bb; + if (!single_pred_p(bb)) { + /* gcc_assert(bb_loop_depth(bb) || + (bb->flags & BB_IRREDUCIBLE_LOOP)); */ + split_edge(single_succ_edge(ENTRY_BLOCK_PTR_FOR_FN(cfun))); + gcc_assert(single_succ_p(ENTRY_BLOCK_PTR_FOR_FN(cfun))); + bb = single_succ(ENTRY_BLOCK_PTR_FOR_FN(cfun)); + } + gsi = gsi_after_labels(bb); + add_stack_tracking(&gsi, false); + + return 0; +} + +static bool large_stack_frame(void) +{ +#if BUILDING_GCC_VERSION >= 8000 + return maybe_ge(get_frame_size(), track_frame_size); +#else + return (get_frame_size() >= track_frame_size); +#endif +} + +static void remove_stack_tracking_gcall(void) +{ + rtx_insn *insn, *next; + + /* + * Find stackleak_track_stack() calls. Loop through the chain of insns, + * which is an RTL representation of the code for a function. + * + * The example of a matching insn: + * (call_insn 8 4 10 2 (call (mem (symbol_ref ("stackleak_track_stack") + * [flags 0x41] <function_decl 0x7f7cd3302a80 stackleak_track_stack>) + * [0 stackleak_track_stack S1 A8]) (0)) 675 {*call} (expr_list + * (symbol_ref ("stackleak_track_stack") [flags 0x41] <function_decl + * 0x7f7cd3302a80 stackleak_track_stack>) (expr_list (0) (nil))) (nil)) + */ + for (insn = get_insns(); insn; insn = next) { + rtx body; + + next = NEXT_INSN(insn); + + /* Check the expression code of the insn */ + if (!CALL_P(insn)) + continue; + + /* + * Check the expression code of the insn body, which is an RTL + * Expression (RTX) describing the side effect performed by + * that insn. + */ + body = PATTERN(insn); + + if (GET_CODE(body) == PARALLEL) + body = XVECEXP(body, 0, 0); + + if (GET_CODE(body) != CALL) + continue; + + /* + * Check the first operand of the call expression. It should + * be a mem RTX describing the needed subroutine with a + * symbol_ref RTX. + */ + body = XEXP(body, 0); + if (GET_CODE(body) != MEM) + continue; + + body = XEXP(body, 0); + if (GET_CODE(body) != SYMBOL_REF) + continue; + + if (SYMBOL_REF_DECL(body) != track_function_decl) + continue; + + /* Delete the stackleak_track_stack() call */ + delete_insn_and_edges(insn); +#if BUILDING_GCC_VERSION >= 4007 && BUILDING_GCC_VERSION < 8000 + if (GET_CODE(next) == NOTE && + NOTE_KIND(next) == NOTE_INSN_CALL_ARG_LOCATION) { + insn = next; + next = NEXT_INSN(insn); + delete_insn_and_edges(insn); + } +#endif + } +} + +static bool remove_stack_tracking_gasm(void) +{ + bool removed = false; + rtx_insn *insn, *next; + + /* 'no_caller_saved_registers' is currently supported only for x86 */ + gcc_assert(build_for_x86); + + /* + * Find stackleak_track_stack() asm calls. Loop through the chain of + * insns, which is an RTL representation of the code for a function. + * + * The example of a matching insn: + * (insn 11 5 12 2 (parallel [ (asm_operands/v + * ("call stackleak_track_stack") ("") 0 + * [ (reg/v:DI 7 sp [ current_stack_pointer ]) ] + * [ (asm_input:DI ("r")) ] []) + * (clobber (reg:CC 17 flags)) ]) -1 (nil)) + */ + for (insn = get_insns(); insn; insn = next) { + rtx body; + + next = NEXT_INSN(insn); + + /* Check the expression code of the insn */ + if (!NONJUMP_INSN_P(insn)) + continue; + + /* + * Check the expression code of the insn body, which is an RTL + * Expression (RTX) describing the side effect performed by + * that insn. + */ + body = PATTERN(insn); + + if (GET_CODE(body) != PARALLEL) + continue; + + body = XVECEXP(body, 0, 0); + + if (GET_CODE(body) != ASM_OPERANDS) + continue; + + if (strcmp(ASM_OPERANDS_TEMPLATE(body), + "call stackleak_track_stack")) { + continue; + } + + delete_insn_and_edges(insn); + gcc_assert(!removed); + removed = true; + } + + return removed; +} + +/* + * Work with the RTL representation of the code. + * Remove the unneeded stackleak_track_stack() calls from the functions + * which don't call alloca() and don't have a large enough stack frame size. + */ +static unsigned int stackleak_cleanup_execute(void) +{ + const char *fn = DECL_NAME_POINTER(current_function_decl); + bool removed = false; + + /* + * Leave stack tracking in functions that call alloca(). + * Additional case: + * gcc before version 7 called allocate_dynamic_stack_space() from + * expand_stack_vars() for runtime alignment of constant-sized stack + * variables. That caused cfun->calls_alloca to be set for functions + * that in fact don't use alloca(). + * For more info see gcc commit 7072df0aae0c59ae437e. + * Let's leave such functions instrumented as well. + */ + if (cfun->calls_alloca) { + if (verbose) + fprintf(stderr, "stackleak: instrument %s(): calls_alloca\n", fn); + return 0; + } + + /* Leave stack tracking in functions with large stack frame */ + if (large_stack_frame()) { + if (verbose) + fprintf(stderr, "stackleak: instrument %s()\n", fn); + return 0; + } + + if (lookup_attribute_spec(get_identifier("no_caller_saved_registers"))) + removed = remove_stack_tracking_gasm(); + + if (!removed) + remove_stack_tracking_gcall(); + + return 0; +} + +/* + * STRING_CST may or may not be NUL terminated: + * https://gcc.gnu.org/onlinedocs/gccint/Constant-expressions.html + */ +static inline bool string_equal(tree node, const char *string, int length) +{ + if (TREE_STRING_LENGTH(node) < length) + return false; + if (TREE_STRING_LENGTH(node) > length + 1) + return false; + if (TREE_STRING_LENGTH(node) == length + 1 && + TREE_STRING_POINTER(node)[length] != '\0') + return false; + return !memcmp(TREE_STRING_POINTER(node), string, length); +} +#define STRING_EQUAL(node, str) string_equal(node, str, strlen(str)) + +static bool stackleak_gate(void) +{ + tree section; + + section = lookup_attribute("section", + DECL_ATTRIBUTES(current_function_decl)); + if (section && TREE_VALUE(section)) { + section = TREE_VALUE(TREE_VALUE(section)); + + if (STRING_EQUAL(section, ".init.text")) + return false; + if (STRING_EQUAL(section, ".devinit.text")) + return false; + if (STRING_EQUAL(section, ".cpuinit.text")) + return false; + if (STRING_EQUAL(section, ".meminit.text")) + return false; + } + + return track_frame_size >= 0; +} + +/* Build the function declaration for stackleak_track_stack() */ +static void stackleak_start_unit(void *gcc_data __unused, + void *user_data __unused) +{ + tree fntype; + + /* void stackleak_track_stack(void) */ + fntype = build_function_type_list(void_type_node, NULL_TREE); + track_function_decl = build_fn_decl(track_function, fntype); + DECL_ASSEMBLER_NAME(track_function_decl); /* for LTO */ + TREE_PUBLIC(track_function_decl) = 1; + TREE_USED(track_function_decl) = 1; + DECL_EXTERNAL(track_function_decl) = 1; + DECL_ARTIFICIAL(track_function_decl) = 1; + DECL_PRESERVE_P(track_function_decl) = 1; +} + +/* + * Pass gate function is a predicate function that gets executed before the + * corresponding pass. If the return value is 'true' the pass gets executed, + * otherwise, it is skipped. + */ +static bool stackleak_instrument_gate(void) +{ + return stackleak_gate(); +} + +#define PASS_NAME stackleak_instrument +#define PROPERTIES_REQUIRED PROP_gimple_leh | PROP_cfg +#define TODO_FLAGS_START TODO_verify_ssa | TODO_verify_flow | TODO_verify_stmts +#define TODO_FLAGS_FINISH TODO_verify_ssa | TODO_verify_stmts | TODO_dump_func \ + | TODO_update_ssa | TODO_rebuild_cgraph_edges +#include "gcc-generate-gimple-pass.h" + +static bool stackleak_cleanup_gate(void) +{ + return stackleak_gate(); +} + +#define PASS_NAME stackleak_cleanup +#define TODO_FLAGS_FINISH TODO_dump_func +#include "gcc-generate-rtl-pass.h" + +/* + * Every gcc plugin exports a plugin_init() function that is called right + * after the plugin is loaded. This function is responsible for registering + * the plugin callbacks and doing other required initialization. + */ +__visible int plugin_init(struct plugin_name_args *plugin_info, + struct plugin_gcc_version *version) +{ + const char * const plugin_name = plugin_info->base_name; + const int argc = plugin_info->argc; + const struct plugin_argument * const argv = plugin_info->argv; + int i = 0; + + /* Extra GGC root tables describing our GTY-ed data */ + static const struct ggc_root_tab gt_ggc_r_gt_stackleak[] = { + { + .base = &track_function_decl, + .nelt = 1, + .stride = sizeof(track_function_decl), + .cb = >_ggc_mx_tree_node, + .pchw = >_pch_nx_tree_node + }, + LAST_GGC_ROOT_TAB + }; + + /* + * The stackleak_instrument pass should be executed before the + * "optimized" pass, which is the control flow graph cleanup that is + * performed just before expanding gcc trees to the RTL. In former + * versions of the plugin this new pass was inserted before the + * "tree_profile" pass, which is currently called "profile". + */ + PASS_INFO(stackleak_instrument, "optimized", 1, + PASS_POS_INSERT_BEFORE); + + /* + * The stackleak_cleanup pass should be executed before the "*free_cfg" + * pass. It's the moment when the stack frame size is already final, + * function prologues and epilogues are generated, and the + * machine-dependent code transformations are not done. + */ + PASS_INFO(stackleak_cleanup, "*free_cfg", 1, PASS_POS_INSERT_BEFORE); + + if (!plugin_default_version_check(version, &gcc_version)) { + error(G_("incompatible gcc/plugin versions")); + return 1; + } + + /* Parse the plugin arguments */ + for (i = 0; i < argc; i++) { + if (!strcmp(argv[i].key, "track-min-size")) { + if (!argv[i].value) { + error(G_("no value supplied for option '-fplugin-arg-%s-%s'"), + plugin_name, argv[i].key); + return 1; + } + + track_frame_size = atoi(argv[i].value); + if (track_frame_size < 0) { + error(G_("invalid option argument '-fplugin-arg-%s-%s=%s'"), + plugin_name, argv[i].key, argv[i].value); + return 1; + } + } else if (!strcmp(argv[i].key, "arch")) { + if (!argv[i].value) { + error(G_("no value supplied for option '-fplugin-arg-%s-%s'"), + plugin_name, argv[i].key); + return 1; + } + + if (!strcmp(argv[i].value, "x86")) + build_for_x86 = true; + } else if (!strcmp(argv[i].key, "disable")) { + disable = true; + } else if (!strcmp(argv[i].key, "verbose")) { + verbose = true; + } else { + error(G_("unknown option '-fplugin-arg-%s-%s'"), + plugin_name, argv[i].key); + return 1; + } + } + + if (disable) { + if (verbose) + fprintf(stderr, "stackleak: disabled for this translation unit\n"); + return 0; + } + + /* Give the information about the plugin */ + register_callback(plugin_name, PLUGIN_INFO, NULL, + &stackleak_plugin_info); + + /* Register to be called before processing a translation unit */ + register_callback(plugin_name, PLUGIN_START_UNIT, + &stackleak_start_unit, NULL); + + /* Register an extra GCC garbage collector (GGC) root table */ + register_callback(plugin_name, PLUGIN_REGISTER_GGC_ROOTS, NULL, + (void *)>_ggc_r_gt_stackleak); + + /* + * Hook into the Pass Manager to register new gcc passes. + * + * The stack frame size info is available only at the last RTL pass, + * when it's too late to insert complex code like a function call. + * So we register two gcc passes to instrument every function at first + * and remove the unneeded instrumentation later. + */ + register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, + &stackleak_instrument_pass_info); + register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, + &stackleak_cleanup_pass_info); + + return 0; +} diff --git a/src/net/scripts/gcc-plugins/structleak_plugin.c b/src/net/scripts/gcc-plugins/structleak_plugin.c new file mode 100644 index 0000000..b9ef2e1 --- /dev/null +++ b/src/net/scripts/gcc-plugins/structleak_plugin.c @@ -0,0 +1,264 @@ +/* + * Copyright 2013-2017 by PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2 + * + * Note: the choice of the license means that the compilation process is + * NOT 'eligible' as defined by gcc's library exception to the GPL v3, + * but for the kernel it doesn't matter since it doesn't link against + * any of the gcc libraries + * + * gcc plugin to forcibly initialize certain local variables that could + * otherwise leak kernel stack to userland if they aren't properly initialized + * by later code + * + * Homepage: https://pax.grsecurity.net/ + * + * Options: + * -fplugin-arg-structleak_plugin-disable + * -fplugin-arg-structleak_plugin-verbose + * -fplugin-arg-structleak_plugin-byref + * -fplugin-arg-structleak_plugin-byref-all + * + * Usage: + * $ # for 4.5/4.6/C based 4.7 + * $ gcc -I`gcc -print-file-name=plugin`/include -I`gcc -print-file-name=plugin`/include/c-family -fPIC -shared -O2 -o structleak_plugin.so structleak_plugin.c + * $ # for C++ based 4.7/4.8+ + * $ g++ -I`g++ -print-file-name=plugin`/include -I`g++ -print-file-name=plugin`/include/c-family -fPIC -shared -O2 -o structleak_plugin.so structleak_plugin.c + * $ gcc -fplugin=./structleak_plugin.so test.c -O2 + * + * TODO: eliminate redundant initializers + */ + +#include "gcc-common.h" + +/* unused C type flag in all versions 4.5-6 */ +#define TYPE_USERSPACE(TYPE) TYPE_LANG_FLAG_5(TYPE) + +__visible int plugin_is_GPL_compatible; + +static struct plugin_info structleak_plugin_info = { + .version = "20190125vanilla", + .help = "disable\tdo not activate plugin\n" + "byref\tinit structs passed by reference\n" + "byref-all\tinit anything passed by reference\n" + "verbose\tprint all initialized variables\n", +}; + +#define BYREF_STRUCT 1 +#define BYREF_ALL 2 + +static bool verbose; +static int byref; + +static tree handle_user_attribute(tree *node, tree name, tree args, int flags, bool *no_add_attrs) +{ + *no_add_attrs = true; + + /* check for types? for now accept everything linux has to offer */ + if (TREE_CODE(*node) != FIELD_DECL) + return NULL_TREE; + + *no_add_attrs = false; + return NULL_TREE; +} + +static struct attribute_spec user_attr = { }; + +static void register_attributes(void *event_data, void *data) +{ + user_attr.name = "user"; + user_attr.handler = handle_user_attribute; +#if BUILDING_GCC_VERSION >= 4007 + user_attr.affects_type_identity = true; +#endif + + register_attribute(&user_attr); +} + +static tree get_field_type(tree field) +{ + return strip_array_types(TREE_TYPE(field)); +} + +static bool is_userspace_type(tree type) +{ + tree field; + + for (field = TYPE_FIELDS(type); field; field = TREE_CHAIN(field)) { + tree fieldtype = get_field_type(field); + enum tree_code code = TREE_CODE(fieldtype); + + if (code == RECORD_TYPE || code == UNION_TYPE) + if (is_userspace_type(fieldtype)) + return true; + + if (lookup_attribute("user", DECL_ATTRIBUTES(field))) + return true; + } + return false; +} + +static void finish_type(void *event_data, void *data) +{ + tree type = (tree)event_data; + + if (type == NULL_TREE || type == error_mark_node) + return; + +#if BUILDING_GCC_VERSION >= 5000 + if (TREE_CODE(type) == ENUMERAL_TYPE) + return; +#endif + + if (TYPE_USERSPACE(type)) + return; + + if (is_userspace_type(type)) + TYPE_USERSPACE(type) = 1; +} + +static void initialize(tree var) +{ + basic_block bb; + gimple_stmt_iterator gsi; + tree initializer; + gimple init_stmt; + tree type; + + /* this is the original entry bb before the forced split */ + bb = single_succ(ENTRY_BLOCK_PTR_FOR_FN(cfun)); + + /* first check if variable is already initialized, warn otherwise */ + for (gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi)) { + gimple stmt = gsi_stmt(gsi); + tree rhs1; + + /* we're looking for an assignment of a single rhs... */ + if (!gimple_assign_single_p(stmt)) + continue; + rhs1 = gimple_assign_rhs1(stmt); +#if BUILDING_GCC_VERSION >= 4007 + /* ... of a non-clobbering expression... */ + if (TREE_CLOBBER_P(rhs1)) + continue; +#endif + /* ... to our variable... */ + if (gimple_get_lhs(stmt) != var) + continue; + /* if it's an initializer then we're good */ + if (TREE_CODE(rhs1) == CONSTRUCTOR) + return; + } + + /* these aren't the 0days you're looking for */ + if (verbose) + inform(DECL_SOURCE_LOCATION(var), + "%s variable will be forcibly initialized", + (byref && TREE_ADDRESSABLE(var)) ? "byref" + : "userspace"); + + /* build the initializer expression */ + type = TREE_TYPE(var); + if (AGGREGATE_TYPE_P(type)) + initializer = build_constructor(type, NULL); + else + initializer = fold_convert(type, integer_zero_node); + + /* build the initializer stmt */ + init_stmt = gimple_build_assign(var, initializer); + gsi = gsi_after_labels(single_succ(ENTRY_BLOCK_PTR_FOR_FN(cfun))); + gsi_insert_before(&gsi, init_stmt, GSI_NEW_STMT); + update_stmt(init_stmt); +} + +static unsigned int structleak_execute(void) +{ + basic_block bb; + unsigned int ret = 0; + tree var; + unsigned int i; + + /* split the first bb where we can put the forced initializers */ + gcc_assert(single_succ_p(ENTRY_BLOCK_PTR_FOR_FN(cfun))); + bb = single_succ(ENTRY_BLOCK_PTR_FOR_FN(cfun)); + if (!single_pred_p(bb)) { + split_edge(single_succ_edge(ENTRY_BLOCK_PTR_FOR_FN(cfun))); + gcc_assert(single_succ_p(ENTRY_BLOCK_PTR_FOR_FN(cfun))); + } + + /* enumerate all local variables and forcibly initialize our targets */ + FOR_EACH_LOCAL_DECL(cfun, i, var) { + tree type = TREE_TYPE(var); + + gcc_assert(DECL_P(var)); + if (!auto_var_in_fn_p(var, current_function_decl)) + continue; + + /* only care about structure types unless byref-all */ + if (byref != BYREF_ALL && TREE_CODE(type) != RECORD_TYPE && TREE_CODE(type) != UNION_TYPE) + continue; + + /* if the type is of interest, examine the variable */ + if (TYPE_USERSPACE(type) || + (byref && TREE_ADDRESSABLE(var))) + initialize(var); + } + + return ret; +} + +#define PASS_NAME structleak +#define NO_GATE +#define PROPERTIES_REQUIRED PROP_cfg +#define TODO_FLAGS_FINISH TODO_verify_il | TODO_verify_ssa | TODO_verify_stmts | TODO_dump_func | TODO_remove_unused_locals | TODO_update_ssa | TODO_ggc_collect | TODO_verify_flow +#include "gcc-generate-gimple-pass.h" + +__visible int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version) +{ + int i; + const char * const plugin_name = plugin_info->base_name; + const int argc = plugin_info->argc; + const struct plugin_argument * const argv = plugin_info->argv; + bool enable = true; + + PASS_INFO(structleak, "early_optimizations", 1, PASS_POS_INSERT_BEFORE); + + if (!plugin_default_version_check(version, &gcc_version)) { + error(G_("incompatible gcc/plugin versions")); + return 1; + } + + if (strncmp(lang_hooks.name, "GNU C", 5) && !strncmp(lang_hooks.name, "GNU C+", 6)) { + inform(UNKNOWN_LOCATION, G_("%s supports C only, not %s"), plugin_name, lang_hooks.name); + enable = false; + } + + for (i = 0; i < argc; ++i) { + if (!strcmp(argv[i].key, "disable")) { + enable = false; + continue; + } + if (!strcmp(argv[i].key, "verbose")) { + verbose = true; + continue; + } + if (!strcmp(argv[i].key, "byref")) { + byref = BYREF_STRUCT; + continue; + } + if (!strcmp(argv[i].key, "byref-all")) { + byref = BYREF_ALL; + continue; + } + error(G_("unknown option '-fplugin-arg-%s-%s'"), plugin_name, argv[i].key); + } + + register_callback(plugin_name, PLUGIN_INFO, NULL, &structleak_plugin_info); + if (enable) { + register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &structleak_pass_info); + register_callback(plugin_name, PLUGIN_FINISH_TYPE, finish_type, NULL); + } + register_callback(plugin_name, PLUGIN_ATTRIBUTES, register_attributes, NULL); + + return 0; +} diff --git a/src/net/scripts/gcc-version.sh b/src/net/scripts/gcc-version.sh new file mode 100755 index 0000000..ae35343 --- /dev/null +++ b/src/net/scripts/gcc-version.sh @@ -0,0 +1,20 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# +# gcc-version gcc-command +# +# Print the gcc version of `gcc-command' in a 5 or 6-digit form +# such as `29503' for gcc-2.95.3, `30301' for gcc-3.3.1, etc. + +compiler="$*" + +if [ ${#compiler} -eq 0 ]; then + echo "Error: No compiler specified." >&2 + printf "Usage:\n\t$0 <gcc-command>\n" >&2 + exit 1 +fi + +MAJOR=$(echo __GNUC__ | $compiler -E -x c - | tail -n 1) +MINOR=$(echo __GNUC_MINOR__ | $compiler -E -x c - | tail -n 1) +PATCHLEVEL=$(echo __GNUC_PATCHLEVEL__ | $compiler -E -x c - | tail -n 1) +printf "%d%02d%02d\\n" $MAJOR $MINOR $PATCHLEVEL diff --git a/src/net/scripts/gcc-x86_32-has-stack-protector.sh b/src/net/scripts/gcc-x86_32-has-stack-protector.sh new file mode 100755 index 0000000..f5c1194 --- /dev/null +++ b/src/net/scripts/gcc-x86_32-has-stack-protector.sh @@ -0,0 +1,4 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 + +echo "int foo(void) { char X[200]; return 3; }" | $* -S -x c -c -m32 -O0 -fstack-protector - -o - 2> /dev/null | grep -q "%gs" diff --git a/src/net/scripts/gcc-x86_64-has-stack-protector.sh b/src/net/scripts/gcc-x86_64-has-stack-protector.sh new file mode 100755 index 0000000..75e4e22 --- /dev/null +++ b/src/net/scripts/gcc-x86_64-has-stack-protector.sh @@ -0,0 +1,4 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 + +echo "int foo(void) { char X[200]; return 3; }" | $* -S -x c -c -m64 -O0 -mcmodel=kernel -fno-PIE -fstack-protector - -o - 2> /dev/null | grep -q "%gs" diff --git a/src/net/scripts/gdb/Makefile b/src/net/scripts/gdb/Makefile new file mode 100644 index 0000000..3fca193 --- /dev/null +++ b/src/net/scripts/gdb/Makefile @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: GPL-2.0-only +subdir-y := linux diff --git a/src/net/scripts/gdb/linux/.gitignore b/src/net/scripts/gdb/linux/.gitignore new file mode 100644 index 0000000..43234cb --- /dev/null +++ b/src/net/scripts/gdb/linux/.gitignore @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0-only +*.pyc +*.pyo +constants.py diff --git a/src/net/scripts/gdb/linux/Makefile b/src/net/scripts/gdb/linux/Makefile new file mode 100644 index 0000000..1247550 --- /dev/null +++ b/src/net/scripts/gdb/linux/Makefile @@ -0,0 +1,25 @@ +# SPDX-License-Identifier: GPL-2.0 + +ifdef building_out_of_srctree + +symlinks := $(patsubst $(srctree)/$(src)/%,%,$(wildcard $(srctree)/$(src)/*.py)) + +quiet_cmd_symlink = SYMLINK $@ + cmd_symlink = ln -fsn $(patsubst $(obj)/%,$(abspath $(srctree))/$(src)/%,$@) $@ + +extra-y += $(symlinks) +$(addprefix $(obj)/, $(symlinks)): FORCE + $(call if_changed,symlink) + +endif + +quiet_cmd_gen_constants_py = GEN $@ + cmd_gen_constants_py = \ + $(CPP) -E -x c -P $(c_flags) $< > $@ ;\ + sed -i '1,/<!-- end-c-headers -->/d;' $@ + +extra-y += constants.py +$(obj)/constants.py: $(src)/constants.py.in FORCE + $(call if_changed_dep,gen_constants_py) + +clean-files := *.pyc *.pyo diff --git a/src/net/scripts/gdb/linux/__init__.py b/src/net/scripts/gdb/linux/__init__.py new file mode 100644 index 0000000..4680fb1 --- /dev/null +++ b/src/net/scripts/gdb/linux/__init__.py @@ -0,0 +1 @@ +# nothing to do for the initialization of this package diff --git a/src/net/scripts/gdb/linux/clk.py b/src/net/scripts/gdb/linux/clk.py new file mode 100644 index 0000000..061aecf --- /dev/null +++ b/src/net/scripts/gdb/linux/clk.py @@ -0,0 +1,76 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# Copyright (c) NXP 2019 + +import gdb +import sys + +from linux import utils, lists, constants + +clk_core_type = utils.CachedType("struct clk_core") + + +def clk_core_for_each_child(hlist_head): + return lists.hlist_for_each_entry(hlist_head, + clk_core_type.get_type().pointer(), "child_node") + + +class LxClkSummary(gdb.Command): + """Print clk tree summary + +Output is a subset of /sys/kernel/debug/clk/clk_summary + +No calls are made during printing, instead a (c) if printed after values which +are cached and potentially out of date""" + + def __init__(self): + super(LxClkSummary, self).__init__("lx-clk-summary", gdb.COMMAND_DATA) + + def show_subtree(self, clk, level): + gdb.write("%*s%-*s %7d %8d %8d %11lu%s\n" % ( + level * 3 + 1, "", + 30 - level * 3, + clk['name'].string(), + clk['enable_count'], + clk['prepare_count'], + clk['protect_count'], + clk['rate'], + '(c)' if clk['flags'] & constants.LX_CLK_GET_RATE_NOCACHE else ' ')) + + for child in clk_core_for_each_child(clk['children']): + self.show_subtree(child, level + 1) + + def invoke(self, arg, from_tty): + gdb.write(" enable prepare protect \n") + gdb.write(" clock count count count rate \n") + gdb.write("------------------------------------------------------------------------\n") + for clk in clk_core_for_each_child(gdb.parse_and_eval("clk_root_list")): + self.show_subtree(clk, 0) + for clk in clk_core_for_each_child(gdb.parse_and_eval("clk_orphan_list")): + self.show_subtree(clk, 0) + + +LxClkSummary() + + +class LxClkCoreLookup(gdb.Function): + """Find struct clk_core by name""" + + def __init__(self): + super(LxClkCoreLookup, self).__init__("lx_clk_core_lookup") + + def lookup_hlist(self, hlist_head, name): + for child in clk_core_for_each_child(hlist_head): + if child['name'].string() == name: + return child + result = self.lookup_hlist(child['children'], name) + if result: + return result + + def invoke(self, name): + name = name.string() + return (self.lookup_hlist(gdb.parse_and_eval("clk_root_list"), name) or + self.lookup_hlist(gdb.parse_and_eval("clk_orphan_list"), name)) + + +LxClkCoreLookup() diff --git a/src/net/scripts/gdb/linux/config.py b/src/net/scripts/gdb/linux/config.py new file mode 100644 index 0000000..8843ab3 --- /dev/null +++ b/src/net/scripts/gdb/linux/config.py @@ -0,0 +1,44 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# Copyright 2019 Google LLC. + +import gdb +import zlib + +from linux import utils + + +class LxConfigDump(gdb.Command): + """Output kernel config to the filename specified as the command + argument. Equivalent to 'zcat /proc/config.gz > config.txt' on + a running target""" + + def __init__(self): + super(LxConfigDump, self).__init__("lx-configdump", gdb.COMMAND_DATA, + gdb.COMPLETE_FILENAME) + + def invoke(self, arg, from_tty): + if len(arg) == 0: + filename = "config.txt" + else: + filename = arg + + try: + py_config_ptr = gdb.parse_and_eval("&kernel_config_data") + py_config_ptr_end = gdb.parse_and_eval("&kernel_config_data_end") + py_config_size = py_config_ptr_end - py_config_ptr + except gdb.error as e: + raise gdb.GdbError("Can't find config, enable CONFIG_IKCONFIG?") + + inf = gdb.inferiors()[0] + zconfig_buf = utils.read_memoryview(inf, py_config_ptr, + py_config_size).tobytes() + + config_buf = zlib.decompress(zconfig_buf, 16) + with open(filename, 'wb') as f: + f.write(config_buf) + + gdb.write("Dumped config to " + filename + "\n") + + +LxConfigDump() diff --git a/src/net/scripts/gdb/linux/constants.py.in b/src/net/scripts/gdb/linux/constants.py.in new file mode 100644 index 0000000..2efbec6 --- /dev/null +++ b/src/net/scripts/gdb/linux/constants.py.in @@ -0,0 +1,77 @@ +/* + * gdb helper commands and functions for Linux kernel debugging + * + * Kernel constants derived from include files. + * + * Copyright (c) 2016 Linaro Ltd + * + * Authors: + * Kieran Bingham <kieran.bingham@linaro.org> + * + * This work is licensed under the terms of the GNU GPL version 2. + * + */ + +#include <linux/clk-provider.h> +#include <linux/fs.h> +#include <linux/hrtimer.h> +#include <linux/mount.h> +#include <linux/of_fdt.h> +#include <linux/threads.h> + +/* We need to stringify expanded macros so that they can be parsed */ + +#define STRING(x) #x +#define XSTRING(x) STRING(x) + +#define LX_VALUE(x) LX_##x = x +#define LX_GDBPARSED(x) LX_##x = gdb.parse_and_eval(XSTRING(x)) + +/* + * IS_ENABLED generates (a || b) which is not compatible with python + * We can only switch on configuration items we know are available + * Therefore - IS_BUILTIN() is more appropriate + */ +#define LX_CONFIG(x) LX_##x = IS_BUILTIN(x) + +/* The build system will take care of deleting everything above this marker */ +<!-- end-c-headers --> + +import gdb + +/* linux/clk-provider.h */ +if IS_BUILTIN(CONFIG_COMMON_CLK): + LX_GDBPARSED(CLK_GET_RATE_NOCACHE) + +/* linux/fs.h */ +LX_VALUE(SB_RDONLY) +LX_VALUE(SB_SYNCHRONOUS) +LX_VALUE(SB_MANDLOCK) +LX_VALUE(SB_DIRSYNC) +LX_VALUE(SB_NOATIME) +LX_VALUE(SB_NODIRATIME) + +/* linux/htimer.h */ +LX_GDBPARSED(hrtimer_resolution) + +/* linux/mount.h */ +LX_VALUE(MNT_NOSUID) +LX_VALUE(MNT_NODEV) +LX_VALUE(MNT_NOEXEC) +LX_VALUE(MNT_NOATIME) +LX_VALUE(MNT_NODIRATIME) +LX_VALUE(MNT_RELATIME) + +/* linux/threads.h */ +LX_VALUE(NR_CPUS) + +/* linux/of_fdt.h> */ +LX_VALUE(OF_DT_HEADER) + +/* Kernel Configs */ +LX_CONFIG(CONFIG_GENERIC_CLOCKEVENTS) +LX_CONFIG(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) +LX_CONFIG(CONFIG_HIGH_RES_TIMERS) +LX_CONFIG(CONFIG_NR_CPUS) +LX_CONFIG(CONFIG_OF) +LX_CONFIG(CONFIG_TICK_ONESHOT) diff --git a/src/net/scripts/gdb/linux/cpus.py b/src/net/scripts/gdb/linux/cpus.py new file mode 100644 index 0000000..008e62f --- /dev/null +++ b/src/net/scripts/gdb/linux/cpus.py @@ -0,0 +1,174 @@ +# +# gdb helper commands and functions for Linux kernel debugging +# +# per-cpu tools +# +# Copyright (c) Siemens AG, 2011-2013 +# +# Authors: +# Jan Kiszka <jan.kiszka@siemens.com> +# +# This work is licensed under the terms of the GNU GPL version 2. +# + +import gdb + +from linux import tasks, utils + + +MAX_CPUS = 4096 + + +def get_current_cpu(): + if utils.get_gdbserver_type() == utils.GDBSERVER_QEMU: + return gdb.selected_thread().num - 1 + elif utils.get_gdbserver_type() == utils.GDBSERVER_KGDB: + tid = gdb.selected_thread().ptid[2] + if tid > (0x100000000 - MAX_CPUS - 2): + return 0x100000000 - tid - 2 + else: + return tasks.get_thread_info(tasks.get_task_by_pid(tid))['cpu'] + else: + raise gdb.GdbError("Sorry, obtaining the current CPU is not yet " + "supported with this gdb server.") + + +def per_cpu(var_ptr, cpu): + if cpu == -1: + cpu = get_current_cpu() + if utils.is_target_arch("sparc:v9"): + offset = gdb.parse_and_eval( + "trap_block[{0}].__per_cpu_base".format(str(cpu))) + else: + try: + offset = gdb.parse_and_eval( + "__per_cpu_offset[{0}]".format(str(cpu))) + except gdb.error: + # !CONFIG_SMP case + offset = 0 + pointer = var_ptr.cast(utils.get_long_type()) + offset + return pointer.cast(var_ptr.type).dereference() + + +cpu_mask = {} + + +def cpu_mask_invalidate(event): + global cpu_mask + cpu_mask = {} + gdb.events.stop.disconnect(cpu_mask_invalidate) + if hasattr(gdb.events, 'new_objfile'): + gdb.events.new_objfile.disconnect(cpu_mask_invalidate) + + +def cpu_list(mask_name): + global cpu_mask + mask = None + if mask_name in cpu_mask: + mask = cpu_mask[mask_name] + if mask is None: + mask = gdb.parse_and_eval(mask_name + ".bits") + if hasattr(gdb, 'events'): + cpu_mask[mask_name] = mask + gdb.events.stop.connect(cpu_mask_invalidate) + if hasattr(gdb.events, 'new_objfile'): + gdb.events.new_objfile.connect(cpu_mask_invalidate) + bits_per_entry = mask[0].type.sizeof * 8 + num_entries = mask.type.sizeof * 8 / bits_per_entry + entry = -1 + bits = 0 + + while True: + while bits == 0: + entry += 1 + if entry == num_entries: + return + bits = mask[entry] + if bits != 0: + bit = 0 + break + + while bits & 1 == 0: + bits >>= 1 + bit += 1 + + cpu = entry * bits_per_entry + bit + + bits >>= 1 + bit += 1 + + yield int(cpu) + + +def each_online_cpu(): + for cpu in cpu_list("__cpu_online_mask"): + yield cpu + + +def each_present_cpu(): + for cpu in cpu_list("__cpu_present_mask"): + yield cpu + + +def each_possible_cpu(): + for cpu in cpu_list("__cpu_possible_mask"): + yield cpu + + +def each_active_cpu(): + for cpu in cpu_list("__cpu_active_mask"): + yield cpu + + +class LxCpus(gdb.Command): + """List CPU status arrays + +Displays the known state of each CPU based on the kernel masks +and can help identify the state of hotplugged CPUs""" + + def __init__(self): + super(LxCpus, self).__init__("lx-cpus", gdb.COMMAND_DATA) + + def invoke(self, arg, from_tty): + gdb.write("Possible CPUs : {}\n".format(list(each_possible_cpu()))) + gdb.write("Present CPUs : {}\n".format(list(each_present_cpu()))) + gdb.write("Online CPUs : {}\n".format(list(each_online_cpu()))) + gdb.write("Active CPUs : {}\n".format(list(each_active_cpu()))) + + +LxCpus() + + +class PerCpu(gdb.Function): + """Return per-cpu variable. + +$lx_per_cpu("VAR"[, CPU]): Return the per-cpu variable called VAR for the +given CPU number. If CPU is omitted, the CPU of the current context is used. +Note that VAR has to be quoted as string.""" + + def __init__(self): + super(PerCpu, self).__init__("lx_per_cpu") + + def invoke(self, var_name, cpu=-1): + var_ptr = gdb.parse_and_eval("&" + var_name.string()) + return per_cpu(var_ptr, cpu) + + +PerCpu() + + +class LxCurrentFunc(gdb.Function): + """Return current task. + +$lx_current([CPU]): Return the per-cpu task variable for the given CPU +number. If CPU is omitted, the CPU of the current context is used.""" + + def __init__(self): + super(LxCurrentFunc, self).__init__("lx_current") + + def invoke(self, cpu=-1): + var_ptr = gdb.parse_and_eval("¤t_task") + return per_cpu(var_ptr, cpu).dereference() + + +LxCurrentFunc() diff --git a/src/net/scripts/gdb/linux/device.py b/src/net/scripts/gdb/linux/device.py new file mode 100644 index 0000000..16376c5 --- /dev/null +++ b/src/net/scripts/gdb/linux/device.py @@ -0,0 +1,182 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# Copyright (c) NXP 2019 + +import gdb + +from linux.utils import CachedType +from linux.utils import container_of +from linux.lists import list_for_each_entry + + +device_private_type = CachedType('struct device_private') +device_type = CachedType('struct device') + +subsys_private_type = CachedType('struct subsys_private') +kobject_type = CachedType('struct kobject') +kset_type = CachedType('struct kset') + +bus_type = CachedType('struct bus_type') +class_type = CachedType('struct class') + + +def dev_name(dev): + dev_init_name = dev['init_name'] + if dev_init_name: + return dev_init_name.string() + return dev['kobj']['name'].string() + + +def kset_for_each_object(kset): + return list_for_each_entry(kset['list'], + kobject_type.get_type().pointer(), "entry") + + +def for_each_bus(): + for kobj in kset_for_each_object(gdb.parse_and_eval('bus_kset')): + subsys = container_of(kobj, kset_type.get_type().pointer(), 'kobj') + subsys_priv = container_of(subsys, subsys_private_type.get_type().pointer(), 'subsys') + yield subsys_priv['bus'] + + +def for_each_class(): + for kobj in kset_for_each_object(gdb.parse_and_eval('class_kset')): + subsys = container_of(kobj, kset_type.get_type().pointer(), 'kobj') + subsys_priv = container_of(subsys, subsys_private_type.get_type().pointer(), 'subsys') + yield subsys_priv['class'] + + +def get_bus_by_name(name): + for item in for_each_bus(): + if item['name'].string() == name: + return item + raise gdb.GdbError("Can't find bus type {!r}".format(name)) + + +def get_class_by_name(name): + for item in for_each_class(): + if item['name'].string() == name: + return item + raise gdb.GdbError("Can't find device class {!r}".format(name)) + + +klist_type = CachedType('struct klist') +klist_node_type = CachedType('struct klist_node') + + +def klist_for_each(klist): + return list_for_each_entry(klist['k_list'], + klist_node_type.get_type().pointer(), 'n_node') + + +def bus_for_each_device(bus): + for kn in klist_for_each(bus['p']['klist_devices']): + dp = container_of(kn, device_private_type.get_type().pointer(), 'knode_bus') + yield dp['device'] + + +def class_for_each_device(cls): + for kn in klist_for_each(cls['p']['klist_devices']): + dp = container_of(kn, device_private_type.get_type().pointer(), 'knode_class') + yield dp['device'] + + +def device_for_each_child(dev): + for kn in klist_for_each(dev['p']['klist_children']): + dp = container_of(kn, device_private_type.get_type().pointer(), 'knode_parent') + yield dp['device'] + + +def _show_device(dev, level=0, recursive=False): + gdb.write('{}dev {}:\t{}\n'.format('\t' * level, dev_name(dev), dev)) + if recursive: + for child in device_for_each_child(dev): + _show_device(child, level + 1, recursive) + + +class LxDeviceListBus(gdb.Command): + '''Print devices on a bus (or all buses if not specified)''' + + def __init__(self): + super(LxDeviceListBus, self).__init__('lx-device-list-bus', gdb.COMMAND_DATA) + + def invoke(self, arg, from_tty): + if not arg: + for bus in for_each_bus(): + gdb.write('bus {}:\t{}\n'.format(bus['name'].string(), bus)) + for dev in bus_for_each_device(bus): + _show_device(dev, level=1) + else: + bus = get_bus_by_name(arg) + if not bus: + raise gdb.GdbError("Can't find bus {!r}".format(arg)) + for dev in bus_for_each_device(bus): + _show_device(dev) + + +class LxDeviceListClass(gdb.Command): + '''Print devices in a class (or all classes if not specified)''' + + def __init__(self): + super(LxDeviceListClass, self).__init__('lx-device-list-class', gdb.COMMAND_DATA) + + def invoke(self, arg, from_tty): + if not arg: + for cls in for_each_class(): + gdb.write("class {}:\t{}\n".format(cls['name'].string(), cls)) + for dev in class_for_each_device(cls): + _show_device(dev, level=1) + else: + cls = get_class_by_name(arg) + for dev in class_for_each_device(cls): + _show_device(dev) + + +class LxDeviceListTree(gdb.Command): + '''Print a device and its children recursively''' + + def __init__(self): + super(LxDeviceListTree, self).__init__('lx-device-list-tree', gdb.COMMAND_DATA) + + def invoke(self, arg, from_tty): + if not arg: + raise gdb.GdbError('Please provide pointer to struct device') + dev = gdb.parse_and_eval(arg) + if dev.type != device_type.get_type().pointer(): + raise gdb.GdbError('Please provide pointer to struct device') + _show_device(dev, level=0, recursive=True) + + +class LxDeviceFindByBusName(gdb.Function): + '''Find struct device by bus and name (both strings)''' + + def __init__(self): + super(LxDeviceFindByBusName, self).__init__('lx_device_find_by_bus_name') + + def invoke(self, bus, name): + name = name.string() + bus = get_bus_by_name(bus.string()) + for dev in bus_for_each_device(bus): + if dev_name(dev) == name: + return dev + + +class LxDeviceFindByClassName(gdb.Function): + '''Find struct device by class and name (both strings)''' + + def __init__(self): + super(LxDeviceFindByClassName, self).__init__('lx_device_find_by_class_name') + + def invoke(self, cls, name): + name = name.string() + cls = get_class_by_name(cls.string()) + for dev in class_for_each_device(cls): + if dev_name(dev) == name: + return dev + + +LxDeviceListBus() +LxDeviceListClass() +LxDeviceListTree() +LxDeviceFindByBusName() +LxDeviceFindByClassName() diff --git a/src/net/scripts/gdb/linux/dmesg.py b/src/net/scripts/gdb/linux/dmesg.py new file mode 100644 index 0000000..a92c55b --- /dev/null +++ b/src/net/scripts/gdb/linux/dmesg.py @@ -0,0 +1,154 @@ +# +# gdb helper commands and functions for Linux kernel debugging +# +# kernel log buffer dump +# +# Copyright (c) Siemens AG, 2011, 2012 +# +# Authors: +# Jan Kiszka <jan.kiszka@siemens.com> +# +# This work is licensed under the terms of the GNU GPL version 2. +# + +import gdb +import sys + +from linux import utils + +printk_info_type = utils.CachedType("struct printk_info") +prb_data_blk_lpos_type = utils.CachedType("struct prb_data_blk_lpos") +prb_desc_type = utils.CachedType("struct prb_desc") +prb_desc_ring_type = utils.CachedType("struct prb_desc_ring") +prb_data_ring_type = utils.CachedType("struct prb_data_ring") +printk_ringbuffer_type = utils.CachedType("struct printk_ringbuffer") +atomic_long_type = utils.CachedType("atomic_long_t") + +class LxDmesg(gdb.Command): + """Print Linux kernel log buffer.""" + + def __init__(self): + super(LxDmesg, self).__init__("lx-dmesg", gdb.COMMAND_DATA) + + def invoke(self, arg, from_tty): + inf = gdb.inferiors()[0] + + # read in prb structure + prb_addr = int(str(gdb.parse_and_eval("(void *)'printk.c'::prb")).split()[0], 16) + sz = printk_ringbuffer_type.get_type().sizeof + prb = utils.read_memoryview(inf, prb_addr, sz).tobytes() + + # read in descriptor ring structure + off = printk_ringbuffer_type.get_type()['desc_ring'].bitpos // 8 + addr = prb_addr + off + sz = prb_desc_ring_type.get_type().sizeof + desc_ring = utils.read_memoryview(inf, addr, sz).tobytes() + + # read in descriptor array + off = prb_desc_ring_type.get_type()['count_bits'].bitpos // 8 + desc_ring_count = 1 << utils.read_u32(desc_ring, off) + desc_sz = prb_desc_type.get_type().sizeof + off = prb_desc_ring_type.get_type()['descs'].bitpos // 8 + addr = utils.read_ulong(desc_ring, off) + descs = utils.read_memoryview(inf, addr, desc_sz * desc_ring_count).tobytes() + + # read in info array + info_sz = printk_info_type.get_type().sizeof + off = prb_desc_ring_type.get_type()['infos'].bitpos // 8 + addr = utils.read_ulong(desc_ring, off) + infos = utils.read_memoryview(inf, addr, info_sz * desc_ring_count).tobytes() + + # read in text data ring structure + off = printk_ringbuffer_type.get_type()['text_data_ring'].bitpos // 8 + addr = prb_addr + off + sz = prb_data_ring_type.get_type().sizeof + text_data_ring = utils.read_memoryview(inf, addr, sz).tobytes() + + # read in text data + off = prb_data_ring_type.get_type()['size_bits'].bitpos // 8 + text_data_sz = 1 << utils.read_u32(text_data_ring, off) + off = prb_data_ring_type.get_type()['data'].bitpos // 8 + addr = utils.read_ulong(text_data_ring, off) + text_data = utils.read_memoryview(inf, addr, text_data_sz).tobytes() + + counter_off = atomic_long_type.get_type()['counter'].bitpos // 8 + + sv_off = prb_desc_type.get_type()['state_var'].bitpos // 8 + + off = prb_desc_type.get_type()['text_blk_lpos'].bitpos // 8 + begin_off = off + (prb_data_blk_lpos_type.get_type()['begin'].bitpos // 8) + next_off = off + (prb_data_blk_lpos_type.get_type()['next'].bitpos // 8) + + ts_off = printk_info_type.get_type()['ts_nsec'].bitpos // 8 + len_off = printk_info_type.get_type()['text_len'].bitpos // 8 + + # definitions from kernel/printk/printk_ringbuffer.h + desc_committed = 1 + desc_finalized = 2 + desc_sv_bits = utils.get_long_type().sizeof * 8 + desc_flags_shift = desc_sv_bits - 2 + desc_flags_mask = 3 << desc_flags_shift + desc_id_mask = ~desc_flags_mask + + # read in tail and head descriptor ids + off = prb_desc_ring_type.get_type()['tail_id'].bitpos // 8 + tail_id = utils.read_u64(desc_ring, off + counter_off) + off = prb_desc_ring_type.get_type()['head_id'].bitpos // 8 + head_id = utils.read_u64(desc_ring, off + counter_off) + + did = tail_id + while True: + ind = did % desc_ring_count + desc_off = desc_sz * ind + info_off = info_sz * ind + + # skip non-committed record + state = 3 & (utils.read_u64(descs, desc_off + sv_off + + counter_off) >> desc_flags_shift) + if state != desc_committed and state != desc_finalized: + if did == head_id: + break + did = (did + 1) & desc_id_mask + continue + + begin = utils.read_ulong(descs, desc_off + begin_off) % text_data_sz + end = utils.read_ulong(descs, desc_off + next_off) % text_data_sz + + # handle data-less record + if begin & 1 == 1: + text = "" + else: + # handle wrapping data block + if begin > end: + begin = 0 + + # skip over descriptor id + text_start = begin + utils.get_long_type().sizeof + + text_len = utils.read_u16(infos, info_off + len_off) + + # handle truncated message + if end - text_start < text_len: + text_len = end - text_start + + text = text_data[text_start:text_start + text_len].decode( + encoding='utf8', errors='replace') + + time_stamp = utils.read_u64(infos, info_off + ts_off) + + for line in text.splitlines(): + msg = u"[{time:12.6f}] {line}\n".format( + time=time_stamp / 1000000000.0, + line=line) + # With python2 gdb.write will attempt to convert unicode to + # ascii and might fail so pass an utf8-encoded str instead. + if sys.hexversion < 0x03000000: + msg = msg.encode(encoding='utf8', errors='replace') + gdb.write(msg) + + if did == head_id: + break + did = (did + 1) & desc_id_mask + + +LxDmesg() diff --git a/src/net/scripts/gdb/linux/genpd.py b/src/net/scripts/gdb/linux/genpd.py new file mode 100644 index 0000000..39cd1ab --- /dev/null +++ b/src/net/scripts/gdb/linux/genpd.py @@ -0,0 +1,83 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# Copyright (c) NXP 2019 + +import gdb +import sys + +from linux.utils import CachedType +from linux.lists import list_for_each_entry + +generic_pm_domain_type = CachedType('struct generic_pm_domain') +pm_domain_data_type = CachedType('struct pm_domain_data') +device_link_type = CachedType('struct device_link') + + +def kobject_get_path(kobj): + path = kobj['name'].string() + parent = kobj['parent'] + if parent: + path = kobject_get_path(parent) + '/' + path + return path + + +def rtpm_status_str(dev): + if dev['power']['runtime_error']: + return 'error' + if dev['power']['disable_depth']: + return 'unsupported' + _RPM_STATUS_LOOKUP = [ + "active", + "resuming", + "suspended", + "suspending" + ] + return _RPM_STATUS_LOOKUP[dev['power']['runtime_status']] + + +class LxGenPDSummary(gdb.Command): + '''Print genpd summary + +Output is similar to /sys/kernel/debug/pm_genpd/pm_genpd_summary''' + + def __init__(self): + super(LxGenPDSummary, self).__init__('lx-genpd-summary', gdb.COMMAND_DATA) + + def summary_one(self, genpd): + if genpd['status'] == 0: + status_string = 'on' + else: + status_string = 'off-{}'.format(genpd['state_idx']) + + child_names = [] + for link in list_for_each_entry( + genpd['parent_links'], + device_link_type.get_type().pointer(), + 'parent_node'): + child_names.append(link['child']['name']) + + gdb.write('%-30s %-15s %s\n' % ( + genpd['name'].string(), + status_string, + ', '.join(child_names))) + + # Print devices in domain + for pm_data in list_for_each_entry(genpd['dev_list'], + pm_domain_data_type.get_type().pointer(), + 'list_node'): + dev = pm_data['dev'] + kobj_path = kobject_get_path(dev['kobj']) + gdb.write(' %-50s %s\n' % (kobj_path, rtpm_status_str(dev))) + + def invoke(self, arg, from_tty): + gdb.write('domain status children\n'); + gdb.write(' /device runtime status\n'); + gdb.write('----------------------------------------------------------------------\n'); + for genpd in list_for_each_entry( + gdb.parse_and_eval('&gpd_list'), + generic_pm_domain_type.get_type().pointer(), + 'gpd_list_node'): + self.summary_one(genpd) + + +LxGenPDSummary() diff --git a/src/net/scripts/gdb/linux/lists.py b/src/net/scripts/gdb/linux/lists.py new file mode 100644 index 0000000..c487ddf --- /dev/null +++ b/src/net/scripts/gdb/linux/lists.py @@ -0,0 +1,131 @@ +# +# gdb helper commands and functions for Linux kernel debugging +# +# list tools +# +# Copyright (c) Thiebaud Weksteen, 2015 +# +# Authors: +# Thiebaud Weksteen <thiebaud@weksteen.fr> +# +# This work is licensed under the terms of the GNU GPL version 2. +# + +import gdb + +from linux import utils + +list_head = utils.CachedType("struct list_head") +hlist_head = utils.CachedType("struct hlist_head") +hlist_node = utils.CachedType("struct hlist_node") + + +def list_for_each(head): + if head.type == list_head.get_type().pointer(): + head = head.dereference() + elif head.type != list_head.get_type(): + raise TypeError("Must be struct list_head not {}" + .format(head.type)) + + node = head['next'].dereference() + while node.address != head.address: + yield node.address + node = node['next'].dereference() + + +def list_for_each_entry(head, gdbtype, member): + for node in list_for_each(head): + yield utils.container_of(node, gdbtype, member) + + +def hlist_for_each(head): + if head.type == hlist_head.get_type().pointer(): + head = head.dereference() + elif head.type != hlist_head.get_type(): + raise TypeError("Must be struct hlist_head not {}" + .format(head.type)) + + node = head['first'].dereference() + while node.address: + yield node.address + node = node['next'].dereference() + + +def hlist_for_each_entry(head, gdbtype, member): + for node in hlist_for_each(head): + yield utils.container_of(node, gdbtype, member) + + +def list_check(head): + nb = 0 + if (head.type == list_head.get_type().pointer()): + head = head.dereference() + elif (head.type != list_head.get_type()): + raise gdb.GdbError('argument must be of type (struct list_head [*])') + c = head + try: + gdb.write("Starting with: {}\n".format(c)) + except gdb.MemoryError: + gdb.write('head is not accessible\n') + return + while True: + p = c['prev'].dereference() + n = c['next'].dereference() + try: + if p['next'] != c.address: + gdb.write('prev.next != current: ' + 'current@{current_addr}={current} ' + 'prev@{p_addr}={p}\n'.format( + current_addr=c.address, + current=c, + p_addr=p.address, + p=p, + )) + return + except gdb.MemoryError: + gdb.write('prev is not accessible: ' + 'current@{current_addr}={current}\n'.format( + current_addr=c.address, + current=c + )) + return + try: + if n['prev'] != c.address: + gdb.write('next.prev != current: ' + 'current@{current_addr}={current} ' + 'next@{n_addr}={n}\n'.format( + current_addr=c.address, + current=c, + n_addr=n.address, + n=n, + )) + return + except gdb.MemoryError: + gdb.write('next is not accessible: ' + 'current@{current_addr}={current}\n'.format( + current_addr=c.address, + current=c + )) + return + c = n + nb += 1 + if c == head: + gdb.write("list is consistent: {} node(s)\n".format(nb)) + return + + +class LxListChk(gdb.Command): + """Verify a list consistency""" + + def __init__(self): + super(LxListChk, self).__init__("lx-list-check", gdb.COMMAND_DATA, + gdb.COMPLETE_EXPRESSION) + + def invoke(self, arg, from_tty): + argv = gdb.string_to_argv(arg) + if len(argv) != 1: + raise gdb.GdbError("lx-list-check takes one argument") + list_check(gdb.parse_and_eval(argv[0])) + + +LxListChk() diff --git a/src/net/scripts/gdb/linux/modules.py b/src/net/scripts/gdb/linux/modules.py new file mode 100644 index 0000000..441b232 --- /dev/null +++ b/src/net/scripts/gdb/linux/modules.py @@ -0,0 +1,95 @@ +# +# gdb helper commands and functions for Linux kernel debugging +# +# module tools +# +# Copyright (c) Siemens AG, 2013 +# +# Authors: +# Jan Kiszka <jan.kiszka@siemens.com> +# +# This work is licensed under the terms of the GNU GPL version 2. +# + +import gdb + +from linux import cpus, utils, lists + + +module_type = utils.CachedType("struct module") + + +def module_list(): + global module_type + modules = utils.gdb_eval_or_none("modules") + if modules is None: + return + + module_ptr_type = module_type.get_type().pointer() + + for module in lists.list_for_each_entry(modules, module_ptr_type, "list"): + yield module + + +def find_module_by_name(name): + for module in module_list(): + if module['name'].string() == name: + return module + return None + + +class LxModule(gdb.Function): + """Find module by name and return the module variable. + +$lx_module("MODULE"): Given the name MODULE, iterate over all loaded modules +of the target and return that module variable which MODULE matches.""" + + def __init__(self): + super(LxModule, self).__init__("lx_module") + + def invoke(self, mod_name): + mod_name = mod_name.string() + module = find_module_by_name(mod_name) + if module: + return module.dereference() + else: + raise gdb.GdbError("Unable to find MODULE " + mod_name) + + +LxModule() + + +class LxLsmod(gdb.Command): + """List currently loaded modules.""" + + _module_use_type = utils.CachedType("struct module_use") + + def __init__(self): + super(LxLsmod, self).__init__("lx-lsmod", gdb.COMMAND_DATA) + + def invoke(self, arg, from_tty): + gdb.write( + "Address{0} Module Size Used by\n".format( + " " if utils.get_long_type().sizeof == 8 else "")) + + for module in module_list(): + layout = module['core_layout'] + gdb.write("{address} {name:<19} {size:>8} {ref}".format( + address=str(layout['base']).split()[0], + name=module['name'].string(), + size=str(layout['size']), + ref=str(module['refcnt']['counter'] - 1))) + + t = self._module_use_type.get_type().pointer() + first = True + sources = module['source_list'] + for use in lists.list_for_each_entry(sources, t, "source_list"): + gdb.write("{separator}{name}".format( + separator=" " if first else ",", + name=use['source']['name'].string())) + first = False + + gdb.write("\n") + + +LxLsmod() diff --git a/src/net/scripts/gdb/linux/proc.py b/src/net/scripts/gdb/linux/proc.py new file mode 100644 index 0000000..09cd871 --- /dev/null +++ b/src/net/scripts/gdb/linux/proc.py @@ -0,0 +1,275 @@ +# +# gdb helper commands and functions for Linux kernel debugging +# +# Kernel proc information reader +# +# Copyright (c) 2016 Linaro Ltd +# +# Authors: +# Kieran Bingham <kieran.bingham@linaro.org> +# +# This work is licensed under the terms of the GNU GPL version 2. +# + +import gdb +from linux import constants +from linux import utils +from linux import tasks +from linux import lists +from struct import * + + +class LxCmdLine(gdb.Command): + """ Report the Linux Commandline used in the current kernel. + Equivalent to cat /proc/cmdline on a running target""" + + def __init__(self): + super(LxCmdLine, self).__init__("lx-cmdline", gdb.COMMAND_DATA) + + def invoke(self, arg, from_tty): + gdb.write(gdb.parse_and_eval("saved_command_line").string() + "\n") + + +LxCmdLine() + + +class LxVersion(gdb.Command): + """ Report the Linux Version of the current kernel. + Equivalent to cat /proc/version on a running target""" + + def __init__(self): + super(LxVersion, self).__init__("lx-version", gdb.COMMAND_DATA) + + def invoke(self, arg, from_tty): + # linux_banner should contain a newline + gdb.write(gdb.parse_and_eval("(char *)linux_banner").string()) + + +LxVersion() + + +# Resource Structure Printers +# /proc/iomem +# /proc/ioports + +def get_resources(resource, depth): + while resource: + yield resource, depth + + child = resource['child'] + if child: + for res, deep in get_resources(child, depth + 1): + yield res, deep + + resource = resource['sibling'] + + +def show_lx_resources(resource_str): + resource = gdb.parse_and_eval(resource_str) + width = 4 if resource['end'] < 0x10000 else 8 + # Iterate straight to the first child + for res, depth in get_resources(resource['child'], 0): + start = int(res['start']) + end = int(res['end']) + gdb.write(" " * depth * 2 + + "{0:0{1}x}-".format(start, width) + + "{0:0{1}x} : ".format(end, width) + + res['name'].string() + "\n") + + +class LxIOMem(gdb.Command): + """Identify the IO memory resource locations defined by the kernel + +Equivalent to cat /proc/iomem on a running target""" + + def __init__(self): + super(LxIOMem, self).__init__("lx-iomem", gdb.COMMAND_DATA) + + def invoke(self, arg, from_tty): + return show_lx_resources("iomem_resource") + + +LxIOMem() + + +class LxIOPorts(gdb.Command): + """Identify the IO port resource locations defined by the kernel + +Equivalent to cat /proc/ioports on a running target""" + + def __init__(self): + super(LxIOPorts, self).__init__("lx-ioports", gdb.COMMAND_DATA) + + def invoke(self, arg, from_tty): + return show_lx_resources("ioport_resource") + + +LxIOPorts() + + +# Mount namespace viewer +# /proc/mounts + +def info_opts(lst, opt): + opts = "" + for key, string in lst.items(): + if opt & key: + opts += string + return opts + + +FS_INFO = {constants.LX_SB_SYNCHRONOUS: ",sync", + constants.LX_SB_MANDLOCK: ",mand", + constants.LX_SB_DIRSYNC: ",dirsync", + constants.LX_SB_NOATIME: ",noatime", + constants.LX_SB_NODIRATIME: ",nodiratime"} + +MNT_INFO = {constants.LX_MNT_NOSUID: ",nosuid", + constants.LX_MNT_NODEV: ",nodev", + constants.LX_MNT_NOEXEC: ",noexec", + constants.LX_MNT_NOATIME: ",noatime", + constants.LX_MNT_NODIRATIME: ",nodiratime", + constants.LX_MNT_RELATIME: ",relatime"} + +mount_type = utils.CachedType("struct mount") +mount_ptr_type = mount_type.get_type().pointer() + + +class LxMounts(gdb.Command): + """Report the VFS mounts of the current process namespace. + +Equivalent to cat /proc/mounts on a running target +An integer value can be supplied to display the mount +values of that process namespace""" + + def __init__(self): + super(LxMounts, self).__init__("lx-mounts", gdb.COMMAND_DATA) + + # Equivalent to proc_namespace.c:show_vfsmnt + # However, that has the ability to call into s_op functions + # whereas we cannot and must make do with the information we can obtain. + def invoke(self, arg, from_tty): + argv = gdb.string_to_argv(arg) + if len(argv) >= 1: + try: + pid = int(argv[0]) + except gdb.error: + raise gdb.GdbError("Provide a PID as integer value") + else: + pid = 1 + + task = tasks.get_task_by_pid(pid) + if not task: + raise gdb.GdbError("Couldn't find a process with PID {}" + .format(pid)) + + namespace = task['nsproxy']['mnt_ns'] + if not namespace: + raise gdb.GdbError("No namespace for current process") + + gdb.write("{:^18} {:^15} {:>9} {} {} options\n".format( + "mount", "super_block", "devname", "pathname", "fstype")) + + for vfs in lists.list_for_each_entry(namespace['list'], + mount_ptr_type, "mnt_list"): + devname = vfs['mnt_devname'].string() + devname = devname if devname else "none" + + pathname = "" + parent = vfs + while True: + mntpoint = parent['mnt_mountpoint'] + pathname = utils.dentry_name(mntpoint) + pathname + if (parent == parent['mnt_parent']): + break + parent = parent['mnt_parent'] + + if (pathname == ""): + pathname = "/" + + superblock = vfs['mnt']['mnt_sb'] + fstype = superblock['s_type']['name'].string() + s_flags = int(superblock['s_flags']) + m_flags = int(vfs['mnt']['mnt_flags']) + rd = "ro" if (s_flags & constants.LX_SB_RDONLY) else "rw" + + gdb.write("{} {} {} {} {} {}{}{} 0 0\n".format( + vfs.format_string(), superblock.format_string(), devname, + pathname, fstype, rd, info_opts(FS_INFO, s_flags), + info_opts(MNT_INFO, m_flags))) + + +LxMounts() + + +class LxFdtDump(gdb.Command): + """Output Flattened Device Tree header and dump FDT blob to the filename + specified as the command argument. Equivalent to + 'cat /proc/fdt > fdtdump.dtb' on a running target""" + + def __init__(self): + super(LxFdtDump, self).__init__("lx-fdtdump", gdb.COMMAND_DATA, + gdb.COMPLETE_FILENAME) + + def fdthdr_to_cpu(self, fdt_header): + + fdt_header_be = ">IIIIIII" + fdt_header_le = "<IIIIIII" + + if utils.get_target_endianness() == 1: + output_fmt = fdt_header_le + else: + output_fmt = fdt_header_be + + return unpack(output_fmt, pack(fdt_header_be, + fdt_header['magic'], + fdt_header['totalsize'], + fdt_header['off_dt_struct'], + fdt_header['off_dt_strings'], + fdt_header['off_mem_rsvmap'], + fdt_header['version'], + fdt_header['last_comp_version'])) + + def invoke(self, arg, from_tty): + + if not constants.LX_CONFIG_OF: + raise gdb.GdbError("Kernel not compiled with CONFIG_OF\n") + + if len(arg) == 0: + filename = "fdtdump.dtb" + else: + filename = arg + + py_fdt_header_ptr = gdb.parse_and_eval( + "(const struct fdt_header *) initial_boot_params") + py_fdt_header = py_fdt_header_ptr.dereference() + + fdt_header = self.fdthdr_to_cpu(py_fdt_header) + + if fdt_header[0] != constants.LX_OF_DT_HEADER: + raise gdb.GdbError("No flattened device tree magic found\n") + + gdb.write("fdt_magic: 0x{:02X}\n".format(fdt_header[0])) + gdb.write("fdt_totalsize: 0x{:02X}\n".format(fdt_header[1])) + gdb.write("off_dt_struct: 0x{:02X}\n".format(fdt_header[2])) + gdb.write("off_dt_strings: 0x{:02X}\n".format(fdt_header[3])) + gdb.write("off_mem_rsvmap: 0x{:02X}\n".format(fdt_header[4])) + gdb.write("version: {}\n".format(fdt_header[5])) + gdb.write("last_comp_version: {}\n".format(fdt_header[6])) + + inf = gdb.inferiors()[0] + fdt_buf = utils.read_memoryview(inf, py_fdt_header_ptr, + fdt_header[1]).tobytes() + + try: + f = open(filename, 'wb') + except gdb.error: + raise gdb.GdbError("Could not open file to dump fdt") + + f.write(fdt_buf) + f.close() + + gdb.write("Dumped fdt blob to " + filename + "\n") + + +LxFdtDump() diff --git a/src/net/scripts/gdb/linux/rbtree.py b/src/net/scripts/gdb/linux/rbtree.py new file mode 100644 index 0000000..fe46285 --- /dev/null +++ b/src/net/scripts/gdb/linux/rbtree.py @@ -0,0 +1,177 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# Copyright 2019 Google LLC. + +import gdb + +from linux import utils + +rb_root_type = utils.CachedType("struct rb_root") +rb_node_type = utils.CachedType("struct rb_node") + + +def rb_first(root): + if root.type == rb_root_type.get_type(): + node = root.address.cast(rb_root_type.get_type().pointer()) + elif root.type != rb_root_type.get_type().pointer(): + raise gdb.GdbError("Must be struct rb_root not {}".format(root.type)) + + node = root['rb_node'] + if node == 0: + return None + + while node['rb_left']: + node = node['rb_left'] + + return node + + +def rb_last(root): + if root.type == rb_root_type.get_type(): + node = root.address.cast(rb_root_type.get_type().pointer()) + elif root.type != rb_root_type.get_type().pointer(): + raise gdb.GdbError("Must be struct rb_root not {}".format(root.type)) + + node = root['rb_node'] + if node == 0: + return None + + while node['rb_right']: + node = node['rb_right'] + + return node + + +def rb_parent(node): + parent = gdb.Value(node['__rb_parent_color'] & ~3) + return parent.cast(rb_node_type.get_type().pointer()) + + +def rb_empty_node(node): + return node['__rb_parent_color'] == node.address + + +def rb_next(node): + if node.type == rb_node_type.get_type(): + node = node.address.cast(rb_node_type.get_type().pointer()) + elif node.type != rb_node_type.get_type().pointer(): + raise gdb.GdbError("Must be struct rb_node not {}".format(node.type)) + + if rb_empty_node(node): + return None + + if node['rb_right']: + node = node['rb_right'] + while node['rb_left']: + node = node['rb_left'] + return node + + parent = rb_parent(node) + while parent and node == parent['rb_right']: + node = parent + parent = rb_parent(node) + + return parent + + +def rb_prev(node): + if node.type == rb_node_type.get_type(): + node = node.address.cast(rb_node_type.get_type().pointer()) + elif node.type != rb_node_type.get_type().pointer(): + raise gdb.GdbError("Must be struct rb_node not {}".format(node.type)) + + if rb_empty_node(node): + return None + + if node['rb_left']: + node = node['rb_left'] + while node['rb_right']: + node = node['rb_right'] + return node.dereference() + + parent = rb_parent(node) + while parent and node == parent['rb_left'].dereference(): + node = parent + parent = rb_parent(node) + + return parent + + +class LxRbFirst(gdb.Function): + """Lookup and return a node from an RBTree + +$lx_rb_first(root): Return the node at the given index. +If index is omitted, the root node is dereferenced and returned.""" + + def __init__(self): + super(LxRbFirst, self).__init__("lx_rb_first") + + def invoke(self, root): + result = rb_first(root) + if result is None: + raise gdb.GdbError("No entry in tree") + + return result + + +LxRbFirst() + + +class LxRbLast(gdb.Function): + """Lookup and return a node from an RBTree. + +$lx_rb_last(root): Return the node at the given index. +If index is omitted, the root node is dereferenced and returned.""" + + def __init__(self): + super(LxRbLast, self).__init__("lx_rb_last") + + def invoke(self, root): + result = rb_last(root) + if result is None: + raise gdb.GdbError("No entry in tree") + + return result + + +LxRbLast() + + +class LxRbNext(gdb.Function): + """Lookup and return a node from an RBTree. + +$lx_rb_next(node): Return the node at the given index. +If index is omitted, the root node is dereferenced and returned.""" + + def __init__(self): + super(LxRbNext, self).__init__("lx_rb_next") + + def invoke(self, node): + result = rb_next(node) + if result is None: + raise gdb.GdbError("No entry in tree") + + return result + + +LxRbNext() + + +class LxRbPrev(gdb.Function): + """Lookup and return a node from an RBTree. + +$lx_rb_prev(node): Return the node at the given index. +If index is omitted, the root node is dereferenced and returned.""" + + def __init__(self): + super(LxRbPrev, self).__init__("lx_rb_prev") + + def invoke(self, node): + result = rb_prev(node) + if result is None: + raise gdb.GdbError("No entry in tree") + + return result + + +LxRbPrev() diff --git a/src/net/scripts/gdb/linux/symbols.py b/src/net/scripts/gdb/linux/symbols.py new file mode 100644 index 0000000..1be9763 --- /dev/null +++ b/src/net/scripts/gdb/linux/symbols.py @@ -0,0 +1,187 @@ +# +# gdb helper commands and functions for Linux kernel debugging +# +# load kernel and module symbols +# +# Copyright (c) Siemens AG, 2011-2013 +# +# Authors: +# Jan Kiszka <jan.kiszka@siemens.com> +# +# This work is licensed under the terms of the GNU GPL version 2. +# + +import gdb +import os +import re + +from linux import modules, utils + + +if hasattr(gdb, 'Breakpoint'): + class LoadModuleBreakpoint(gdb.Breakpoint): + def __init__(self, spec, gdb_command): + super(LoadModuleBreakpoint, self).__init__(spec, internal=True) + self.silent = True + self.gdb_command = gdb_command + + def stop(self): + module = gdb.parse_and_eval("mod") + module_name = module['name'].string() + cmd = self.gdb_command + + # enforce update if object file is not found + cmd.module_files_updated = False + + # Disable pagination while reporting symbol (re-)loading. + # The console input is blocked in this context so that we would + # get stuck waiting for the user to acknowledge paged output. + show_pagination = gdb.execute("show pagination", to_string=True) + pagination = show_pagination.endswith("on.\n") + gdb.execute("set pagination off") + + if module_name in cmd.loaded_modules: + gdb.write("refreshing all symbols to reload module " + "'{0}'\n".format(module_name)) + cmd.load_all_symbols() + else: + cmd.load_module_symbols(module) + + # restore pagination state + gdb.execute("set pagination %s" % ("on" if pagination else "off")) + + return False + + +class LxSymbols(gdb.Command): + """(Re-)load symbols of Linux kernel and currently loaded modules. + +The kernel (vmlinux) is taken from the current working directly. Modules (.ko) +are scanned recursively, starting in the same directory. Optionally, the module +search path can be extended by a space separated list of paths passed to the +lx-symbols command.""" + + module_paths = [] + module_files = [] + module_files_updated = False + loaded_modules = [] + breakpoint = None + + def __init__(self): + super(LxSymbols, self).__init__("lx-symbols", gdb.COMMAND_FILES, + gdb.COMPLETE_FILENAME) + + def _update_module_files(self): + self.module_files = [] + for path in self.module_paths: + gdb.write("scanning for modules in {0}\n".format(path)) + for root, dirs, files in os.walk(path): + for name in files: + if name.endswith(".ko") or name.endswith(".ko.debug"): + self.module_files.append(root + "/" + name) + self.module_files_updated = True + + def _get_module_file(self, module_name): + module_pattern = ".*/{0}\.ko(?:.debug)?$".format( + module_name.replace("_", r"[_\-]")) + for name in self.module_files: + if re.match(module_pattern, name) and os.path.exists(name): + return name + return None + + def _section_arguments(self, module): + try: + sect_attrs = module['sect_attrs'].dereference() + except gdb.error: + return "" + attrs = sect_attrs['attrs'] + section_name_to_address = { + attrs[n]['battr']['attr']['name'].string(): attrs[n]['address'] + for n in range(int(sect_attrs['nsections']))} + args = [] + for section_name in [".data", ".data..read_mostly", ".rodata", ".bss", + ".text", ".text.hot", ".text.unlikely"]: + address = section_name_to_address.get(section_name) + if address: + args.append(" -s {name} {addr}".format( + name=section_name, addr=str(address))) + return "".join(args) + + def load_module_symbols(self, module): + module_name = module['name'].string() + module_addr = str(module['core_layout']['base']).split()[0] + + module_file = self._get_module_file(module_name) + if not module_file and not self.module_files_updated: + self._update_module_files() + module_file = self._get_module_file(module_name) + + if module_file: + if utils.is_target_arch('s390'): + # Module text is preceded by PLT stubs on s390. + module_arch = module['arch'] + plt_offset = int(module_arch['plt_offset']) + plt_size = int(module_arch['plt_size']) + module_addr = hex(int(module_addr, 0) + plt_offset + plt_size) + gdb.write("loading @{addr}: {filename}\n".format( + addr=module_addr, filename=module_file)) + cmdline = "add-symbol-file {filename} {addr}{sections}".format( + filename=module_file, + addr=module_addr, + sections=self._section_arguments(module)) + gdb.execute(cmdline, to_string=True) + if module_name not in self.loaded_modules: + self.loaded_modules.append(module_name) + else: + gdb.write("no module object found for '{0}'\n".format(module_name)) + + def load_all_symbols(self): + gdb.write("loading vmlinux\n") + + # Dropping symbols will disable all breakpoints. So save their states + # and restore them afterward. + saved_states = [] + if hasattr(gdb, 'breakpoints') and not gdb.breakpoints() is None: + for bp in gdb.breakpoints(): + saved_states.append({'breakpoint': bp, 'enabled': bp.enabled}) + + # drop all current symbols and reload vmlinux + orig_vmlinux = 'vmlinux' + for obj in gdb.objfiles(): + if obj.filename.endswith('vmlinux'): + orig_vmlinux = obj.filename + gdb.execute("symbol-file", to_string=True) + gdb.execute("symbol-file {0}".format(orig_vmlinux)) + + self.loaded_modules = [] + module_list = modules.module_list() + if not module_list: + gdb.write("no modules found\n") + else: + [self.load_module_symbols(module) for module in module_list] + + for saved_state in saved_states: + saved_state['breakpoint'].enabled = saved_state['enabled'] + + def invoke(self, arg, from_tty): + self.module_paths = [os.path.expanduser(p) for p in arg.split()] + self.module_paths.append(os.getcwd()) + + # enforce update + self.module_files = [] + self.module_files_updated = False + + self.load_all_symbols() + + if hasattr(gdb, 'Breakpoint'): + if self.breakpoint is not None: + self.breakpoint.delete() + self.breakpoint = None + self.breakpoint = LoadModuleBreakpoint( + "kernel/module.c:do_init_module", self) + else: + gdb.write("Note: symbol update on module loading not supported " + "with this gdb version\n") + + +LxSymbols() diff --git a/src/net/scripts/gdb/linux/tasks.py b/src/net/scripts/gdb/linux/tasks.py new file mode 100644 index 0000000..17ec19e --- /dev/null +++ b/src/net/scripts/gdb/linux/tasks.py @@ -0,0 +1,140 @@ +# +# gdb helper commands and functions for Linux kernel debugging +# +# task & thread tools +# +# Copyright (c) Siemens AG, 2011-2013 +# +# Authors: +# Jan Kiszka <jan.kiszka@siemens.com> +# +# This work is licensed under the terms of the GNU GPL version 2. +# + +import gdb + +from linux import utils + + +task_type = utils.CachedType("struct task_struct") + + +def task_lists(): + task_ptr_type = task_type.get_type().pointer() + init_task = gdb.parse_and_eval("init_task").address + t = g = init_task + + while True: + while True: + yield t + + t = utils.container_of(t['thread_group']['next'], + task_ptr_type, "thread_group") + if t == g: + break + + t = g = utils.container_of(g['tasks']['next'], + task_ptr_type, "tasks") + if t == init_task: + return + + +def get_task_by_pid(pid): + for task in task_lists(): + if int(task['pid']) == pid: + return task + return None + + +class LxTaskByPidFunc(gdb.Function): + """Find Linux task by PID and return the task_struct variable. + +$lx_task_by_pid(PID): Given PID, iterate over all tasks of the target and +return that task_struct variable which PID matches.""" + + def __init__(self): + super(LxTaskByPidFunc, self).__init__("lx_task_by_pid") + + def invoke(self, pid): + task = get_task_by_pid(pid) + if task: + return task.dereference() + else: + raise gdb.GdbError("No task of PID " + str(pid)) + + +LxTaskByPidFunc() + + +class LxPs(gdb.Command): + """Dump Linux tasks.""" + + def __init__(self): + super(LxPs, self).__init__("lx-ps", gdb.COMMAND_DATA) + + def invoke(self, arg, from_tty): + gdb.write("{:>10} {:>12} {:>7}\n".format("TASK", "PID", "COMM")) + for task in task_lists(): + gdb.write("{} {:^5} {}\n".format( + task.format_string().split()[0], + task["pid"].format_string(), + task["comm"].string())) + + +LxPs() + + +thread_info_type = utils.CachedType("struct thread_info") + +ia64_task_size = None + + +def get_thread_info(task): + thread_info_ptr_type = thread_info_type.get_type().pointer() + if utils.is_target_arch("ia64"): + global ia64_task_size + if ia64_task_size is None: + ia64_task_size = gdb.parse_and_eval("sizeof(struct task_struct)") + thread_info_addr = task.address + ia64_task_size + thread_info = thread_info_addr.cast(thread_info_ptr_type) + else: + if task.type.fields()[0].type == thread_info_type.get_type(): + return task['thread_info'] + thread_info = task['stack'].cast(thread_info_ptr_type) + return thread_info.dereference() + + +class LxThreadInfoFunc (gdb.Function): + """Calculate Linux thread_info from task variable. + +$lx_thread_info(TASK): Given TASK, return the corresponding thread_info +variable.""" + + def __init__(self): + super(LxThreadInfoFunc, self).__init__("lx_thread_info") + + def invoke(self, task): + return get_thread_info(task) + + +LxThreadInfoFunc() + + +class LxThreadInfoByPidFunc (gdb.Function): + """Calculate Linux thread_info from task variable found by pid + +$lx_thread_info_by_pid(PID): Given PID, return the corresponding thread_info +variable.""" + + def __init__(self): + super(LxThreadInfoByPidFunc, self).__init__("lx_thread_info_by_pid") + + def invoke(self, pid): + task = get_task_by_pid(pid) + if task: + return get_thread_info(task.dereference()) + else: + raise gdb.GdbError("No task of PID " + str(pid)) + + +LxThreadInfoByPidFunc() diff --git a/src/net/scripts/gdb/linux/timerlist.py b/src/net/scripts/gdb/linux/timerlist.py new file mode 100644 index 0000000..071d0dd --- /dev/null +++ b/src/net/scripts/gdb/linux/timerlist.py @@ -0,0 +1,219 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# Copyright 2019 Google LLC. + +import binascii +import gdb + +from linux import constants +from linux import cpus +from linux import rbtree +from linux import utils + +timerqueue_node_type = utils.CachedType("struct timerqueue_node").get_type() +hrtimer_type = utils.CachedType("struct hrtimer").get_type() + + +def ktime_get(): + """Returns the current time, but not very accurately + + We can't read the hardware timer itself to add any nanoseconds + that need to be added since we last stored the time in the + timekeeper. But this is probably good enough for debug purposes.""" + tk_core = gdb.parse_and_eval("&tk_core") + + return tk_core['timekeeper']['tkr_mono']['base'] + + +def print_timer(rb_node, idx): + timerqueue = utils.container_of(rb_node, timerqueue_node_type.pointer(), + "node") + timer = utils.container_of(timerqueue, hrtimer_type.pointer(), "node") + + function = str(timer['function']).split(" ")[1].strip("<>") + softexpires = timer['_softexpires'] + expires = timer['node']['expires'] + now = ktime_get() + + text = " #{}: <{}>, {}, ".format(idx, timer, function) + text += "S:{:02x}\n".format(int(timer['state'])) + text += " # expires at {}-{} nsecs [in {} to {} nsecs]\n".format( + softexpires, expires, softexpires - now, expires - now) + return text + + +def print_active_timers(base): + curr = base['active']['next']['node'] + curr = curr.address.cast(rbtree.rb_node_type.get_type().pointer()) + idx = 0 + while curr: + yield print_timer(curr, idx) + curr = rbtree.rb_next(curr) + idx += 1 + + +def print_base(base): + text = " .base: {}\n".format(base.address) + text += " .index: {}\n".format(base['index']) + + text += " .resolution: {} nsecs\n".format(constants.LX_hrtimer_resolution) + + text += " .get_time: {}\n".format(base['get_time']) + if constants.LX_CONFIG_HIGH_RES_TIMERS: + text += " .offset: {} nsecs\n".format(base['offset']) + text += "active timers:\n" + text += "".join([x for x in print_active_timers(base)]) + return text + + +def print_cpu(hrtimer_bases, cpu, max_clock_bases): + cpu_base = cpus.per_cpu(hrtimer_bases, cpu) + jiffies = gdb.parse_and_eval("jiffies_64") + tick_sched_ptr = gdb.parse_and_eval("&tick_cpu_sched") + ts = cpus.per_cpu(tick_sched_ptr, cpu) + + text = "cpu: {}\n".format(cpu) + for i in xrange(max_clock_bases): + text += " clock {}:\n".format(i) + text += print_base(cpu_base['clock_base'][i]) + + if constants.LX_CONFIG_HIGH_RES_TIMERS: + fmts = [(" .{} : {} nsecs", 'expires_next'), + (" .{} : {}", 'hres_active'), + (" .{} : {}", 'nr_events'), + (" .{} : {}", 'nr_retries'), + (" .{} : {}", 'nr_hangs'), + (" .{} : {}", 'max_hang_time')] + text += "\n".join([s.format(f, cpu_base[f]) for s, f in fmts]) + text += "\n" + + if constants.LX_CONFIG_TICK_ONESHOT: + fmts = [(" .{} : {}", 'nohz_mode'), + (" .{} : {} nsecs", 'last_tick'), + (" .{} : {}", 'tick_stopped'), + (" .{} : {}", 'idle_jiffies'), + (" .{} : {}", 'idle_calls'), + (" .{} : {}", 'idle_sleeps'), + (" .{} : {} nsecs", 'idle_entrytime'), + (" .{} : {} nsecs", 'idle_waketime'), + (" .{} : {} nsecs", 'idle_exittime'), + (" .{} : {} nsecs", 'idle_sleeptime'), + (" .{}: {} nsecs", 'iowait_sleeptime'), + (" .{} : {}", 'last_jiffies'), + (" .{} : {}", 'next_timer'), + (" .{} : {} nsecs", 'idle_expires')] + text += "\n".join([s.format(f, ts[f]) for s, f in fmts]) + text += "\njiffies: {}\n".format(jiffies) + + text += "\n" + + return text + + +def print_tickdevice(td, cpu): + dev = td['evtdev'] + text = "Tick Device: mode: {}\n".format(td['mode']) + if cpu < 0: + text += "Broadcast device\n" + else: + text += "Per CPU device: {}\n".format(cpu) + + text += "Clock Event Device: " + if dev == 0: + text += "<NULL>\n" + return text + + text += "{}\n".format(dev['name']) + text += " max_delta_ns: {}\n".format(dev['max_delta_ns']) + text += " min_delta_ns: {}\n".format(dev['min_delta_ns']) + text += " mult: {}\n".format(dev['mult']) + text += " shift: {}\n".format(dev['shift']) + text += " mode: {}\n".format(dev['state_use_accessors']) + text += " next_event: {} nsecs\n".format(dev['next_event']) + + text += " set_next_event: {}\n".format(dev['set_next_event']) + + members = [('set_state_shutdown', " shutdown: {}\n"), + ('set_state_periodic', " periodic: {}\n"), + ('set_state_oneshot', " oneshot: {}\n"), + ('set_state_oneshot_stopped', " oneshot stopped: {}\n"), + ('tick_resume', " resume: {}\n")] + for member, fmt in members: + if dev[member]: + text += fmt.format(dev[member]) + + text += " event_handler: {}\n".format(dev['event_handler']) + text += " retries: {}\n".format(dev['retries']) + + return text + + +def pr_cpumask(mask): + nr_cpu_ids = 1 + if constants.LX_NR_CPUS > 1: + nr_cpu_ids = gdb.parse_and_eval("nr_cpu_ids") + + inf = gdb.inferiors()[0] + bits = mask['bits'] + num_bytes = (nr_cpu_ids + 7) / 8 + buf = utils.read_memoryview(inf, bits, num_bytes).tobytes() + buf = binascii.b2a_hex(buf) + + chunks = [] + i = num_bytes + while i > 0: + i -= 1 + start = i * 2 + end = start + 2 + chunks.append(buf[start:end]) + if i != 0 and i % 4 == 0: + chunks.append(',') + + extra = nr_cpu_ids % 8 + if 0 < extra <= 4: + chunks[0] = chunks[0][0] # Cut off the first 0 + + return "".join(chunks) + + +class LxTimerList(gdb.Command): + """Print /proc/timer_list""" + + def __init__(self): + super(LxTimerList, self).__init__("lx-timerlist", gdb.COMMAND_DATA) + + def invoke(self, arg, from_tty): + hrtimer_bases = gdb.parse_and_eval("&hrtimer_bases") + max_clock_bases = gdb.parse_and_eval("HRTIMER_MAX_CLOCK_BASES") + + text = "Timer List Version: gdb scripts\n" + text += "HRTIMER_MAX_CLOCK_BASES: {}\n".format(max_clock_bases) + text += "now at {} nsecs\n".format(ktime_get()) + + for cpu in cpus.each_online_cpu(): + text += print_cpu(hrtimer_bases, cpu, max_clock_bases) + + if constants.LX_CONFIG_GENERIC_CLOCKEVENTS: + if constants.LX_CONFIG_GENERIC_CLOCKEVENTS_BROADCAST: + bc_dev = gdb.parse_and_eval("&tick_broadcast_device") + text += print_tickdevice(bc_dev, -1) + text += "\n" + mask = gdb.parse_and_eval("tick_broadcast_mask") + mask = pr_cpumask(mask) + text += "tick_broadcast_mask: {}\n".format(mask) + if constants.LX_CONFIG_TICK_ONESHOT: + mask = gdb.parse_and_eval("tick_broadcast_oneshot_mask") + mask = pr_cpumask(mask) + text += "tick_broadcast_oneshot_mask: {}\n".format(mask) + text += "\n" + + tick_cpu_devices = gdb.parse_and_eval("&tick_cpu_device") + for cpu in cpus.each_online_cpu(): + tick_dev = cpus.per_cpu(tick_cpu_devices, cpu) + text += print_tickdevice(tick_dev, cpu) + text += "\n" + + gdb.write(text) + + +LxTimerList() diff --git a/src/net/scripts/gdb/linux/utils.py b/src/net/scripts/gdb/linux/utils.py new file mode 100644 index 0000000..ff7c179 --- /dev/null +++ b/src/net/scripts/gdb/linux/utils.py @@ -0,0 +1,193 @@ +# +# gdb helper commands and functions for Linux kernel debugging +# +# common utilities +# +# Copyright (c) Siemens AG, 2011-2013 +# +# Authors: +# Jan Kiszka <jan.kiszka@siemens.com> +# +# This work is licensed under the terms of the GNU GPL version 2. +# + +import gdb + + +class CachedType: + def __init__(self, name): + self._type = None + self._name = name + + def _new_objfile_handler(self, event): + self._type = None + gdb.events.new_objfile.disconnect(self._new_objfile_handler) + + def get_type(self): + if self._type is None: + self._type = gdb.lookup_type(self._name) + if self._type is None: + raise gdb.GdbError( + "cannot resolve type '{0}'".format(self._name)) + if hasattr(gdb, 'events') and hasattr(gdb.events, 'new_objfile'): + gdb.events.new_objfile.connect(self._new_objfile_handler) + return self._type + + +long_type = CachedType("long") + + +def get_long_type(): + global long_type + return long_type.get_type() + + +def offset_of(typeobj, field): + element = gdb.Value(0).cast(typeobj) + return int(str(element[field].address).split()[0], 16) + + +def container_of(ptr, typeobj, member): + return (ptr.cast(get_long_type()) - + offset_of(typeobj, member)).cast(typeobj) + + +class ContainerOf(gdb.Function): + """Return pointer to containing data structure. + +$container_of(PTR, "TYPE", "ELEMENT"): Given PTR, return a pointer to the +data structure of the type TYPE in which PTR is the address of ELEMENT. +Note that TYPE and ELEMENT have to be quoted as strings.""" + + def __init__(self): + super(ContainerOf, self).__init__("container_of") + + def invoke(self, ptr, typename, elementname): + return container_of(ptr, gdb.lookup_type(typename.string()).pointer(), + elementname.string()) + + +ContainerOf() + + +BIG_ENDIAN = 0 +LITTLE_ENDIAN = 1 +target_endianness = None + + +def get_target_endianness(): + global target_endianness + if target_endianness is None: + endian = gdb.execute("show endian", to_string=True) + if "little endian" in endian: + target_endianness = LITTLE_ENDIAN + elif "big endian" in endian: + target_endianness = BIG_ENDIAN + else: + raise gdb.GdbError("unknown endianness '{0}'".format(str(endian))) + return target_endianness + + +def read_memoryview(inf, start, length): + return memoryview(inf.read_memory(start, length)) + + +def read_u16(buffer, offset): + buffer_val = buffer[offset:offset + 2] + value = [0, 0] + + if type(buffer_val[0]) is str: + value[0] = ord(buffer_val[0]) + value[1] = ord(buffer_val[1]) + else: + value[0] = buffer_val[0] + value[1] = buffer_val[1] + + if get_target_endianness() == LITTLE_ENDIAN: + return value[0] + (value[1] << 8) + else: + return value[1] + (value[0] << 8) + + +def read_u32(buffer, offset): + if get_target_endianness() == LITTLE_ENDIAN: + return read_u16(buffer, offset) + (read_u16(buffer, offset + 2) << 16) + else: + return read_u16(buffer, offset + 2) + (read_u16(buffer, offset) << 16) + + +def read_u64(buffer, offset): + if get_target_endianness() == LITTLE_ENDIAN: + return read_u32(buffer, offset) + (read_u32(buffer, offset + 4) << 32) + else: + return read_u32(buffer, offset + 4) + (read_u32(buffer, offset) << 32) + + +def read_ulong(buffer, offset): + if get_long_type().sizeof == 8: + return read_u64(buffer, offset) + else: + return read_u32(buffer, offset) + + +target_arch = None + + +def is_target_arch(arch): + if hasattr(gdb.Frame, 'architecture'): + return arch in gdb.newest_frame().architecture().name() + else: + global target_arch + if target_arch is None: + target_arch = gdb.execute("show architecture", to_string=True) + return arch in target_arch + + +GDBSERVER_QEMU = 0 +GDBSERVER_KGDB = 1 +gdbserver_type = None + + +def get_gdbserver_type(): + def exit_handler(event): + global gdbserver_type + gdbserver_type = None + gdb.events.exited.disconnect(exit_handler) + + def probe_qemu(): + try: + return gdb.execute("monitor info version", to_string=True) != "" + except gdb.error: + return False + + def probe_kgdb(): + try: + thread_info = gdb.execute("info thread 2", to_string=True) + return "shadowCPU0" in thread_info + except gdb.error: + return False + + global gdbserver_type + if gdbserver_type is None: + if probe_qemu(): + gdbserver_type = GDBSERVER_QEMU + elif probe_kgdb(): + gdbserver_type = GDBSERVER_KGDB + if gdbserver_type is not None and hasattr(gdb, 'events'): + gdb.events.exited.connect(exit_handler) + return gdbserver_type + + +def gdb_eval_or_none(expresssion): + try: + return gdb.parse_and_eval(expresssion) + except gdb.error: + return None + + +def dentry_name(d): + parent = d['d_parent'] + if parent == d or parent == 0: + return "" + p = dentry_name(d['d_parent']) + "/" + return p + d['d_iname'].string() diff --git a/src/net/scripts/gdb/vmlinux-gdb.py b/src/net/scripts/gdb/vmlinux-gdb.py new file mode 100644 index 0000000..4136dc2 --- /dev/null +++ b/src/net/scripts/gdb/vmlinux-gdb.py @@ -0,0 +1,39 @@ +# +# gdb helper commands and functions for Linux kernel debugging +# +# loader module +# +# Copyright (c) Siemens AG, 2012, 2013 +# +# Authors: +# Jan Kiszka <jan.kiszka@siemens.com> +# +# This work is licensed under the terms of the GNU GPL version 2. +# + +import os + +sys.path.insert(0, os.path.dirname(__file__) + "/scripts/gdb") + +try: + gdb.parse_and_eval("0") + gdb.execute("", to_string=True) +except: + gdb.write("NOTE: gdb 7.2 or later required for Linux helper scripts to " + "work.\n") +else: + import linux.utils + import linux.symbols + import linux.modules + import linux.dmesg + import linux.tasks + import linux.config + import linux.cpus + import linux.lists + import linux.rbtree + import linux.proc + import linux.constants + import linux.timerlist + import linux.clk + import linux.genpd + import linux.device diff --git a/src/net/scripts/gen_autoksyms.sh b/src/net/scripts/gen_autoksyms.sh new file mode 100755 index 0000000..d54dfba --- /dev/null +++ b/src/net/scripts/gen_autoksyms.sh @@ -0,0 +1,55 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0-only + +# Create an autoksyms.h header file from the list of all module's needed symbols +# as recorded on the second line of *.mod files and the user-provided symbol +# whitelist. + +set -e + +output_file="$1" + +# Use "make V=1" to debug this script. +case "$KBUILD_VERBOSE" in +*1*) + set -x + ;; +esac + +# We need access to CONFIG_ symbols +. include/config/auto.conf + +ksym_wl=/dev/null +if [ -n "$CONFIG_UNUSED_KSYMS_WHITELIST" ]; then + # Use 'eval' to expand the whitelist path and check if it is relative + eval ksym_wl="$CONFIG_UNUSED_KSYMS_WHITELIST" + [ "${ksym_wl}" != "${ksym_wl#/}" ] || ksym_wl="$abs_srctree/$ksym_wl" + if [ ! -f "$ksym_wl" ] || [ ! -r "$ksym_wl" ]; then + echo "ERROR: '$ksym_wl' whitelist file not found" >&2 + exit 1 + fi +fi + +# Generate a new ksym list file with symbols needed by the current +# set of modules. +cat > "$output_file" << EOT +/* + * Automatically generated file; DO NOT EDIT. + */ + +EOT + +[ -f modules.order ] && modlist=modules.order || modlist=/dev/null +sed 's/ko$/mod/' $modlist | +xargs -n1 sed -n -e '2{s/ /\n/g;/^$/!p;}' -- | +cat - "$ksym_wl" | +# Remove the dot prefix for ppc64; symbol names with a dot (.) hold entry +# point addresses. +sed -e 's/^\.//' | +sort -u | +sed -e 's/\(.*\)/#define __KSYM_\1 1/' >> "$output_file" + +# Special case for modversions (see modpost.c) +if [ -n "$CONFIG_MODVERSIONS" ]; then + echo "#define __KSYM_module_layout 1" >> "$output_file" +fi diff --git a/src/net/scripts/gen_ksymdeps.sh b/src/net/scripts/gen_ksymdeps.sh new file mode 100755 index 0000000..725e8c9 --- /dev/null +++ b/src/net/scripts/gen_ksymdeps.sh @@ -0,0 +1,31 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 + +set -e + +# List of exported symbols +# +# If the object has no symbol, $NM warns 'no symbols'. +# Suppress the stderr. +# TODO: +# Use -q instead of 2>/dev/null when we upgrade the minimum version of +# binutils to 2.37, llvm to 13.0.0. +ksyms=$($NM $1 2>/dev/null | sed -n 's/.*__ksym_marker_\(.*\)/\1/p' | tr A-Z a-z) + +if [ -z "$ksyms" ]; then + exit 0 +fi + +echo +echo "ksymdeps_$1 := \\" + +for s in $ksyms +do + echo $s | sed -e 's:^_*: $(wildcard include/ksym/:' \ + -e 's:__*:/:g' -e 's/$/.h) \\/' +done + +echo +echo "$1: \$(ksymdeps_$1)" +echo +echo "\$(ksymdeps_$1):" diff --git a/src/net/scripts/genksyms/.gitignore b/src/net/scripts/genksyms/.gitignore new file mode 100644 index 0000000..999af71 --- /dev/null +++ b/src/net/scripts/genksyms/.gitignore @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: GPL-2.0-only +genksyms diff --git a/src/net/scripts/genksyms/Makefile b/src/net/scripts/genksyms/Makefile new file mode 100644 index 0000000..ce4f999 --- /dev/null +++ b/src/net/scripts/genksyms/Makefile @@ -0,0 +1,30 @@ +# SPDX-License-Identifier: GPL-2.0 + +hostprogs-always-y += genksyms + +genksyms-objs := genksyms.o parse.tab.o lex.lex.o + +# FIXME: fix the ambiguous grammar in parse.y and delete this hack +# +# Suppress shift/reduce, reduce/reduce conflicts warnings +# unless W=1 is specified. +# +# Just in case, run "$(YACC) --version" without suppressing stderr +# so that 'bison: not found' will be displayed if it is missing. +ifeq ($(findstring 1,$(KBUILD_EXTRA_WARN)),) + +quiet_cmd_bison_no_warn = $(quiet_cmd_bison) + cmd_bison_no_warn = $(YACC) --version >/dev/null; \ + $(cmd_bison) 2>/dev/null + +$(obj)/pars%.tab.c $(obj)/pars%.tab.h: $(src)/pars%.y FORCE + $(call if_changed,bison_no_warn) + +endif + +# -I needed for generated C source (shipped source) +HOSTCFLAGS_parse.tab.o := -I $(srctree)/$(src) +HOSTCFLAGS_lex.lex.o := -I $(srctree)/$(src) + +# dependencies on generated files need to be listed explicitly +$(obj)/lex.lex.o: $(obj)/parse.tab.h diff --git a/src/net/scripts/genksyms/genksyms.c b/src/net/scripts/genksyms/genksyms.c new file mode 100644 index 0000000..23eff23 --- /dev/null +++ b/src/net/scripts/genksyms/genksyms.c @@ -0,0 +1,873 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* Generate kernel symbol version hashes. + Copyright 1996, 1997 Linux International. + + New implementation contributed by Richard Henderson <rth@tamu.edu> + Based on original work by Bjorn Ekwall <bj0rn@blox.se> + + This file was part of the Linux modutils 2.4.22: moved back into the + kernel sources by Rusty Russell/Kai Germaschewski. + + */ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <unistd.h> +#include <assert.h> +#include <stdarg.h> +#ifdef __GNU_LIBRARY__ +#include <getopt.h> +#endif /* __GNU_LIBRARY__ */ + +#include "genksyms.h" +/*----------------------------------------------------------------------*/ + +#define HASH_BUCKETS 4096 + +static struct symbol *symtab[HASH_BUCKETS]; +static FILE *debugfile; + +int cur_line = 1; +char *cur_filename, *source_file; +int in_source_file; + +static int flag_debug, flag_dump_defs, flag_reference, flag_dump_types, + flag_preserve, flag_warnings, flag_rel_crcs; + +static int errors; +static int nsyms; + +static struct symbol *expansion_trail; +static struct symbol *visited_symbols; + +static const struct { + int n; + const char *name; +} symbol_types[] = { + [SYM_NORMAL] = { 0, NULL}, + [SYM_TYPEDEF] = {'t', "typedef"}, + [SYM_ENUM] = {'e', "enum"}, + [SYM_STRUCT] = {'s', "struct"}, + [SYM_UNION] = {'u', "union"}, + [SYM_ENUM_CONST] = {'E', "enum constant"}, +}; + +static int equal_list(struct string_list *a, struct string_list *b); +static void print_list(FILE * f, struct string_list *list); +static struct string_list *concat_list(struct string_list *start, ...); +static struct string_list *mk_node(const char *string); +static void print_location(void); +static void print_type_name(enum symbol_type type, const char *name); + +/*----------------------------------------------------------------------*/ + +static const unsigned int crctab32[] = { + 0x00000000U, 0x77073096U, 0xee0e612cU, 0x990951baU, 0x076dc419U, + 0x706af48fU, 0xe963a535U, 0x9e6495a3U, 0x0edb8832U, 0x79dcb8a4U, + 0xe0d5e91eU, 0x97d2d988U, 0x09b64c2bU, 0x7eb17cbdU, 0xe7b82d07U, + 0x90bf1d91U, 0x1db71064U, 0x6ab020f2U, 0xf3b97148U, 0x84be41deU, + 0x1adad47dU, 0x6ddde4ebU, 0xf4d4b551U, 0x83d385c7U, 0x136c9856U, + 0x646ba8c0U, 0xfd62f97aU, 0x8a65c9ecU, 0x14015c4fU, 0x63066cd9U, + 0xfa0f3d63U, 0x8d080df5U, 0x3b6e20c8U, 0x4c69105eU, 0xd56041e4U, + 0xa2677172U, 0x3c03e4d1U, 0x4b04d447U, 0xd20d85fdU, 0xa50ab56bU, + 0x35b5a8faU, 0x42b2986cU, 0xdbbbc9d6U, 0xacbcf940U, 0x32d86ce3U, + 0x45df5c75U, 0xdcd60dcfU, 0xabd13d59U, 0x26d930acU, 0x51de003aU, + 0xc8d75180U, 0xbfd06116U, 0x21b4f4b5U, 0x56b3c423U, 0xcfba9599U, + 0xb8bda50fU, 0x2802b89eU, 0x5f058808U, 0xc60cd9b2U, 0xb10be924U, + 0x2f6f7c87U, 0x58684c11U, 0xc1611dabU, 0xb6662d3dU, 0x76dc4190U, + 0x01db7106U, 0x98d220bcU, 0xefd5102aU, 0x71b18589U, 0x06b6b51fU, + 0x9fbfe4a5U, 0xe8b8d433U, 0x7807c9a2U, 0x0f00f934U, 0x9609a88eU, + 0xe10e9818U, 0x7f6a0dbbU, 0x086d3d2dU, 0x91646c97U, 0xe6635c01U, + 0x6b6b51f4U, 0x1c6c6162U, 0x856530d8U, 0xf262004eU, 0x6c0695edU, + 0x1b01a57bU, 0x8208f4c1U, 0xf50fc457U, 0x65b0d9c6U, 0x12b7e950U, + 0x8bbeb8eaU, 0xfcb9887cU, 0x62dd1ddfU, 0x15da2d49U, 0x8cd37cf3U, + 0xfbd44c65U, 0x4db26158U, 0x3ab551ceU, 0xa3bc0074U, 0xd4bb30e2U, + 0x4adfa541U, 0x3dd895d7U, 0xa4d1c46dU, 0xd3d6f4fbU, 0x4369e96aU, + 0x346ed9fcU, 0xad678846U, 0xda60b8d0U, 0x44042d73U, 0x33031de5U, + 0xaa0a4c5fU, 0xdd0d7cc9U, 0x5005713cU, 0x270241aaU, 0xbe0b1010U, + 0xc90c2086U, 0x5768b525U, 0x206f85b3U, 0xb966d409U, 0xce61e49fU, + 0x5edef90eU, 0x29d9c998U, 0xb0d09822U, 0xc7d7a8b4U, 0x59b33d17U, + 0x2eb40d81U, 0xb7bd5c3bU, 0xc0ba6cadU, 0xedb88320U, 0x9abfb3b6U, + 0x03b6e20cU, 0x74b1d29aU, 0xead54739U, 0x9dd277afU, 0x04db2615U, + 0x73dc1683U, 0xe3630b12U, 0x94643b84U, 0x0d6d6a3eU, 0x7a6a5aa8U, + 0xe40ecf0bU, 0x9309ff9dU, 0x0a00ae27U, 0x7d079eb1U, 0xf00f9344U, + 0x8708a3d2U, 0x1e01f268U, 0x6906c2feU, 0xf762575dU, 0x806567cbU, + 0x196c3671U, 0x6e6b06e7U, 0xfed41b76U, 0x89d32be0U, 0x10da7a5aU, + 0x67dd4accU, 0xf9b9df6fU, 0x8ebeeff9U, 0x17b7be43U, 0x60b08ed5U, + 0xd6d6a3e8U, 0xa1d1937eU, 0x38d8c2c4U, 0x4fdff252U, 0xd1bb67f1U, + 0xa6bc5767U, 0x3fb506ddU, 0x48b2364bU, 0xd80d2bdaU, 0xaf0a1b4cU, + 0x36034af6U, 0x41047a60U, 0xdf60efc3U, 0xa867df55U, 0x316e8eefU, + 0x4669be79U, 0xcb61b38cU, 0xbc66831aU, 0x256fd2a0U, 0x5268e236U, + 0xcc0c7795U, 0xbb0b4703U, 0x220216b9U, 0x5505262fU, 0xc5ba3bbeU, + 0xb2bd0b28U, 0x2bb45a92U, 0x5cb36a04U, 0xc2d7ffa7U, 0xb5d0cf31U, + 0x2cd99e8bU, 0x5bdeae1dU, 0x9b64c2b0U, 0xec63f226U, 0x756aa39cU, + 0x026d930aU, 0x9c0906a9U, 0xeb0e363fU, 0x72076785U, 0x05005713U, + 0x95bf4a82U, 0xe2b87a14U, 0x7bb12baeU, 0x0cb61b38U, 0x92d28e9bU, + 0xe5d5be0dU, 0x7cdcefb7U, 0x0bdbdf21U, 0x86d3d2d4U, 0xf1d4e242U, + 0x68ddb3f8U, 0x1fda836eU, 0x81be16cdU, 0xf6b9265bU, 0x6fb077e1U, + 0x18b74777U, 0x88085ae6U, 0xff0f6a70U, 0x66063bcaU, 0x11010b5cU, + 0x8f659effU, 0xf862ae69U, 0x616bffd3U, 0x166ccf45U, 0xa00ae278U, + 0xd70dd2eeU, 0x4e048354U, 0x3903b3c2U, 0xa7672661U, 0xd06016f7U, + 0x4969474dU, 0x3e6e77dbU, 0xaed16a4aU, 0xd9d65adcU, 0x40df0b66U, + 0x37d83bf0U, 0xa9bcae53U, 0xdebb9ec5U, 0x47b2cf7fU, 0x30b5ffe9U, + 0xbdbdf21cU, 0xcabac28aU, 0x53b39330U, 0x24b4a3a6U, 0xbad03605U, + 0xcdd70693U, 0x54de5729U, 0x23d967bfU, 0xb3667a2eU, 0xc4614ab8U, + 0x5d681b02U, 0x2a6f2b94U, 0xb40bbe37U, 0xc30c8ea1U, 0x5a05df1bU, + 0x2d02ef8dU +}; + +static unsigned long partial_crc32_one(unsigned char c, unsigned long crc) +{ + return crctab32[(crc ^ c) & 0xff] ^ (crc >> 8); +} + +static unsigned long partial_crc32(const char *s, unsigned long crc) +{ + while (*s) + crc = partial_crc32_one(*s++, crc); + return crc; +} + +static unsigned long crc32(const char *s) +{ + return partial_crc32(s, 0xffffffff) ^ 0xffffffff; +} + +/*----------------------------------------------------------------------*/ + +static enum symbol_type map_to_ns(enum symbol_type t) +{ + switch (t) { + case SYM_ENUM_CONST: + case SYM_NORMAL: + case SYM_TYPEDEF: + return SYM_NORMAL; + case SYM_ENUM: + case SYM_STRUCT: + case SYM_UNION: + return SYM_STRUCT; + } + return t; +} + +struct symbol *find_symbol(const char *name, enum symbol_type ns, int exact) +{ + unsigned long h = crc32(name) % HASH_BUCKETS; + struct symbol *sym; + + for (sym = symtab[h]; sym; sym = sym->hash_next) + if (map_to_ns(sym->type) == map_to_ns(ns) && + strcmp(name, sym->name) == 0 && + sym->is_declared) + break; + + if (exact && sym && sym->type != ns) + return NULL; + return sym; +} + +static int is_unknown_symbol(struct symbol *sym) +{ + struct string_list *defn; + + return ((sym->type == SYM_STRUCT || + sym->type == SYM_UNION || + sym->type == SYM_ENUM) && + (defn = sym->defn) && defn->tag == SYM_NORMAL && + strcmp(defn->string, "}") == 0 && + (defn = defn->next) && defn->tag == SYM_NORMAL && + strcmp(defn->string, "UNKNOWN") == 0 && + (defn = defn->next) && defn->tag == SYM_NORMAL && + strcmp(defn->string, "{") == 0); +} + +static struct symbol *__add_symbol(const char *name, enum symbol_type type, + struct string_list *defn, int is_extern, + int is_reference) +{ + unsigned long h; + struct symbol *sym; + enum symbol_status status = STATUS_UNCHANGED; + /* The parser adds symbols in the order their declaration completes, + * so it is safe to store the value of the previous enum constant in + * a static variable. + */ + static int enum_counter; + static struct string_list *last_enum_expr; + + if (type == SYM_ENUM_CONST) { + if (defn) { + free_list(last_enum_expr, NULL); + last_enum_expr = copy_list_range(defn, NULL); + enum_counter = 1; + } else { + struct string_list *expr; + char buf[20]; + + snprintf(buf, sizeof(buf), "%d", enum_counter++); + if (last_enum_expr) { + expr = copy_list_range(last_enum_expr, NULL); + defn = concat_list(mk_node("("), + expr, + mk_node(")"), + mk_node("+"), + mk_node(buf), NULL); + } else { + defn = mk_node(buf); + } + } + } else if (type == SYM_ENUM) { + free_list(last_enum_expr, NULL); + last_enum_expr = NULL; + enum_counter = 0; + if (!name) + /* Anonymous enum definition, nothing more to do */ + return NULL; + } + + h = crc32(name) % HASH_BUCKETS; + for (sym = symtab[h]; sym; sym = sym->hash_next) { + if (map_to_ns(sym->type) == map_to_ns(type) && + strcmp(name, sym->name) == 0) { + if (is_reference) + /* fall through */ ; + else if (sym->type == type && + equal_list(sym->defn, defn)) { + if (!sym->is_declared && sym->is_override) { + print_location(); + print_type_name(type, name); + fprintf(stderr, " modversion is " + "unchanged\n"); + } + sym->is_declared = 1; + return sym; + } else if (!sym->is_declared) { + if (sym->is_override && flag_preserve) { + print_location(); + fprintf(stderr, "ignoring "); + print_type_name(type, name); + fprintf(stderr, " modversion change\n"); + sym->is_declared = 1; + return sym; + } else { + status = is_unknown_symbol(sym) ? + STATUS_DEFINED : STATUS_MODIFIED; + } + } else { + error_with_pos("redefinition of %s", name); + return sym; + } + break; + } + } + + if (sym) { + struct symbol **psym; + + for (psym = &symtab[h]; *psym; psym = &(*psym)->hash_next) { + if (*psym == sym) { + *psym = sym->hash_next; + break; + } + } + --nsyms; + } + + sym = xmalloc(sizeof(*sym)); + sym->name = name; + sym->type = type; + sym->defn = defn; + sym->expansion_trail = NULL; + sym->visited = NULL; + sym->is_extern = is_extern; + + sym->hash_next = symtab[h]; + symtab[h] = sym; + + sym->is_declared = !is_reference; + sym->status = status; + sym->is_override = 0; + + if (flag_debug) { + if (symbol_types[type].name) + fprintf(debugfile, "Defn for %s %s == <", + symbol_types[type].name, name); + else + fprintf(debugfile, "Defn for type%d %s == <", + type, name); + if (is_extern) + fputs("extern ", debugfile); + print_list(debugfile, defn); + fputs(">\n", debugfile); + } + + ++nsyms; + return sym; +} + +struct symbol *add_symbol(const char *name, enum symbol_type type, + struct string_list *defn, int is_extern) +{ + return __add_symbol(name, type, defn, is_extern, 0); +} + +static struct symbol *add_reference_symbol(const char *name, enum symbol_type type, + struct string_list *defn, int is_extern) +{ + return __add_symbol(name, type, defn, is_extern, 1); +} + +/*----------------------------------------------------------------------*/ + +void free_node(struct string_list *node) +{ + free(node->string); + free(node); +} + +void free_list(struct string_list *s, struct string_list *e) +{ + while (s != e) { + struct string_list *next = s->next; + free_node(s); + s = next; + } +} + +static struct string_list *mk_node(const char *string) +{ + struct string_list *newnode; + + newnode = xmalloc(sizeof(*newnode)); + newnode->string = xstrdup(string); + newnode->tag = SYM_NORMAL; + newnode->next = NULL; + + return newnode; +} + +static struct string_list *concat_list(struct string_list *start, ...) +{ + va_list ap; + struct string_list *n, *n2; + + if (!start) + return NULL; + for (va_start(ap, start); (n = va_arg(ap, struct string_list *));) { + for (n2 = n; n2->next; n2 = n2->next) + ; + n2->next = start; + start = n; + } + va_end(ap); + return start; +} + +struct string_list *copy_node(struct string_list *node) +{ + struct string_list *newnode; + + newnode = xmalloc(sizeof(*newnode)); + newnode->string = xstrdup(node->string); + newnode->tag = node->tag; + + return newnode; +} + +struct string_list *copy_list_range(struct string_list *start, + struct string_list *end) +{ + struct string_list *res, *n; + + if (start == end) + return NULL; + n = res = copy_node(start); + for (start = start->next; start != end; start = start->next) { + n->next = copy_node(start); + n = n->next; + } + n->next = NULL; + return res; +} + +static int equal_list(struct string_list *a, struct string_list *b) +{ + while (a && b) { + if (a->tag != b->tag || strcmp(a->string, b->string)) + return 0; + a = a->next; + b = b->next; + } + + return !a && !b; +} + +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) + +static struct string_list *read_node(FILE *f) +{ + char buffer[256]; + struct string_list node = { + .string = buffer, + .tag = SYM_NORMAL }; + int c, in_string = 0; + + while ((c = fgetc(f)) != EOF) { + if (!in_string && c == ' ') { + if (node.string == buffer) + continue; + break; + } else if (c == '"') { + in_string = !in_string; + } else if (c == '\n') { + if (node.string == buffer) + return NULL; + ungetc(c, f); + break; + } + if (node.string >= buffer + sizeof(buffer) - 1) { + fprintf(stderr, "Token too long\n"); + exit(1); + } + *node.string++ = c; + } + if (node.string == buffer) + return NULL; + *node.string = 0; + node.string = buffer; + + if (node.string[1] == '#') { + size_t n; + + for (n = 0; n < ARRAY_SIZE(symbol_types); n++) { + if (node.string[0] == symbol_types[n].n) { + node.tag = n; + node.string += 2; + return copy_node(&node); + } + } + fprintf(stderr, "Unknown type %c\n", node.string[0]); + exit(1); + } + return copy_node(&node); +} + +static void read_reference(FILE *f) +{ + while (!feof(f)) { + struct string_list *defn = NULL; + struct string_list *sym, *def; + int is_extern = 0, is_override = 0; + struct symbol *subsym; + + sym = read_node(f); + if (sym && sym->tag == SYM_NORMAL && + !strcmp(sym->string, "override")) { + is_override = 1; + free_node(sym); + sym = read_node(f); + } + if (!sym) + continue; + def = read_node(f); + if (def && def->tag == SYM_NORMAL && + !strcmp(def->string, "extern")) { + is_extern = 1; + free_node(def); + def = read_node(f); + } + while (def) { + def->next = defn; + defn = def; + def = read_node(f); + } + subsym = add_reference_symbol(xstrdup(sym->string), sym->tag, + defn, is_extern); + subsym->is_override = is_override; + free_node(sym); + } +} + +static void print_node(FILE * f, struct string_list *list) +{ + if (symbol_types[list->tag].n) { + putc(symbol_types[list->tag].n, f); + putc('#', f); + } + fputs(list->string, f); +} + +static void print_list(FILE * f, struct string_list *list) +{ + struct string_list **e, **b; + struct string_list *tmp, **tmp2; + int elem = 1; + + if (list == NULL) { + fputs("(nil)", f); + return; + } + + tmp = list; + while ((tmp = tmp->next) != NULL) + elem++; + + b = alloca(elem * sizeof(*e)); + e = b + elem; + tmp2 = e - 1; + + (*tmp2--) = list; + while ((list = list->next) != NULL) + *(tmp2--) = list; + + while (b != e) { + print_node(f, *b++); + putc(' ', f); + } +} + +static unsigned long expand_and_crc_sym(struct symbol *sym, unsigned long crc) +{ + struct string_list *list = sym->defn; + struct string_list **e, **b; + struct string_list *tmp, **tmp2; + int elem = 1; + + if (!list) + return crc; + + tmp = list; + while ((tmp = tmp->next) != NULL) + elem++; + + b = alloca(elem * sizeof(*e)); + e = b + elem; + tmp2 = e - 1; + + *(tmp2--) = list; + while ((list = list->next) != NULL) + *(tmp2--) = list; + + while (b != e) { + struct string_list *cur; + struct symbol *subsym; + + cur = *(b++); + switch (cur->tag) { + case SYM_NORMAL: + if (flag_dump_defs) + fprintf(debugfile, "%s ", cur->string); + crc = partial_crc32(cur->string, crc); + crc = partial_crc32_one(' ', crc); + break; + + case SYM_ENUM_CONST: + case SYM_TYPEDEF: + subsym = find_symbol(cur->string, cur->tag, 0); + /* FIXME: Bad reference files can segfault here. */ + if (subsym->expansion_trail) { + if (flag_dump_defs) + fprintf(debugfile, "%s ", cur->string); + crc = partial_crc32(cur->string, crc); + crc = partial_crc32_one(' ', crc); + } else { + subsym->expansion_trail = expansion_trail; + expansion_trail = subsym; + crc = expand_and_crc_sym(subsym, crc); + } + break; + + case SYM_STRUCT: + case SYM_UNION: + case SYM_ENUM: + subsym = find_symbol(cur->string, cur->tag, 0); + if (!subsym) { + struct string_list *n; + + error_with_pos("expand undefined %s %s", + symbol_types[cur->tag].name, + cur->string); + n = concat_list(mk_node + (symbol_types[cur->tag].name), + mk_node(cur->string), + mk_node("{"), + mk_node("UNKNOWN"), + mk_node("}"), NULL); + subsym = + add_symbol(cur->string, cur->tag, n, 0); + } + if (subsym->expansion_trail) { + if (flag_dump_defs) { + fprintf(debugfile, "%s %s ", + symbol_types[cur->tag].name, + cur->string); + } + + crc = partial_crc32(symbol_types[cur->tag].name, + crc); + crc = partial_crc32_one(' ', crc); + crc = partial_crc32(cur->string, crc); + crc = partial_crc32_one(' ', crc); + } else { + subsym->expansion_trail = expansion_trail; + expansion_trail = subsym; + crc = expand_and_crc_sym(subsym, crc); + } + break; + } + } + + { + static struct symbol **end = &visited_symbols; + + if (!sym->visited) { + *end = sym; + end = &sym->visited; + sym->visited = (struct symbol *)-1L; + } + } + + return crc; +} + +void export_symbol(const char *name) +{ + struct symbol *sym; + + sym = find_symbol(name, SYM_NORMAL, 0); + if (!sym) + error_with_pos("export undefined symbol %s", name); + else { + unsigned long crc; + int has_changed = 0; + + if (flag_dump_defs) + fprintf(debugfile, "Export %s == <", name); + + expansion_trail = (struct symbol *)-1L; + + sym->expansion_trail = expansion_trail; + expansion_trail = sym; + crc = expand_and_crc_sym(sym, 0xffffffff) ^ 0xffffffff; + + sym = expansion_trail; + while (sym != (struct symbol *)-1L) { + struct symbol *n = sym->expansion_trail; + + if (sym->status != STATUS_UNCHANGED) { + if (!has_changed) { + print_location(); + fprintf(stderr, "%s: %s: modversion " + "changed because of changes " + "in ", flag_preserve ? "error" : + "warning", name); + } else + fprintf(stderr, ", "); + print_type_name(sym->type, sym->name); + if (sym->status == STATUS_DEFINED) + fprintf(stderr, " (became defined)"); + has_changed = 1; + if (flag_preserve) + errors++; + } + sym->expansion_trail = 0; + sym = n; + } + if (has_changed) + fprintf(stderr, "\n"); + + if (flag_dump_defs) + fputs(">\n", debugfile); + + /* Used as a linker script. */ + printf(!flag_rel_crcs ? "__crc_%s = 0x%08lx;\n" : + "SECTIONS { .rodata : ALIGN(4) { " + "__crc_%s = .; LONG(0x%08lx); } }\n", + name, crc); + } +} + +/*----------------------------------------------------------------------*/ + +static void print_location(void) +{ + fprintf(stderr, "%s:%d: ", cur_filename ? : "<stdin>", cur_line); +} + +static void print_type_name(enum symbol_type type, const char *name) +{ + if (symbol_types[type].name) + fprintf(stderr, "%s %s", symbol_types[type].name, name); + else + fprintf(stderr, "%s", name); +} + +void error_with_pos(const char *fmt, ...) +{ + va_list args; + + if (flag_warnings) { + print_location(); + + va_start(args, fmt); + vfprintf(stderr, fmt, args); + va_end(args); + putc('\n', stderr); + + errors++; + } +} + +static void genksyms_usage(void) +{ + fputs("Usage:\n" "genksyms [-adDTwqhVR] > /path/to/.tmp_obj.ver\n" "\n" +#ifdef __GNU_LIBRARY__ + " -s, --symbol-prefix Select symbol prefix\n" + " -d, --debug Increment the debug level (repeatable)\n" + " -D, --dump Dump expanded symbol defs (for debugging only)\n" + " -r, --reference file Read reference symbols from a file\n" + " -T, --dump-types file Dump expanded types into file\n" + " -p, --preserve Preserve reference modversions or fail\n" + " -w, --warnings Enable warnings\n" + " -q, --quiet Disable warnings (default)\n" + " -h, --help Print this message\n" + " -V, --version Print the release version\n" + " -R, --relative-crc Emit section relative symbol CRCs\n" +#else /* __GNU_LIBRARY__ */ + " -s Select symbol prefix\n" + " -d Increment the debug level (repeatable)\n" + " -D Dump expanded symbol defs (for debugging only)\n" + " -r file Read reference symbols from a file\n" + " -T file Dump expanded types into file\n" + " -p Preserve reference modversions or fail\n" + " -w Enable warnings\n" + " -q Disable warnings (default)\n" + " -h Print this message\n" + " -V Print the release version\n" + " -R Emit section relative symbol CRCs\n" +#endif /* __GNU_LIBRARY__ */ + , stderr); +} + +int main(int argc, char **argv) +{ + FILE *dumpfile = NULL, *ref_file = NULL; + int o; + +#ifdef __GNU_LIBRARY__ + struct option long_opts[] = { + {"debug", 0, 0, 'd'}, + {"warnings", 0, 0, 'w'}, + {"quiet", 0, 0, 'q'}, + {"dump", 0, 0, 'D'}, + {"reference", 1, 0, 'r'}, + {"dump-types", 1, 0, 'T'}, + {"preserve", 0, 0, 'p'}, + {"version", 0, 0, 'V'}, + {"help", 0, 0, 'h'}, + {"relative-crc", 0, 0, 'R'}, + {0, 0, 0, 0} + }; + + while ((o = getopt_long(argc, argv, "s:dwqVDr:T:phR", + &long_opts[0], NULL)) != EOF) +#else /* __GNU_LIBRARY__ */ + while ((o = getopt(argc, argv, "s:dwqVDr:T:phR")) != EOF) +#endif /* __GNU_LIBRARY__ */ + switch (o) { + case 'd': + flag_debug++; + break; + case 'w': + flag_warnings = 1; + break; + case 'q': + flag_warnings = 0; + break; + case 'V': + fputs("genksyms version 2.5.60\n", stderr); + break; + case 'D': + flag_dump_defs = 1; + break; + case 'r': + flag_reference = 1; + ref_file = fopen(optarg, "r"); + if (!ref_file) { + perror(optarg); + return 1; + } + break; + case 'T': + flag_dump_types = 1; + dumpfile = fopen(optarg, "w"); + if (!dumpfile) { + perror(optarg); + return 1; + } + break; + case 'p': + flag_preserve = 1; + break; + case 'h': + genksyms_usage(); + return 0; + case 'R': + flag_rel_crcs = 1; + break; + default: + genksyms_usage(); + return 1; + } + { + extern int yydebug; + extern int yy_flex_debug; + + yydebug = (flag_debug > 1); + yy_flex_debug = (flag_debug > 2); + + debugfile = stderr; + /* setlinebuf(debugfile); */ + } + + if (flag_reference) { + read_reference(ref_file); + fclose(ref_file); + } + + yyparse(); + + if (flag_dump_types && visited_symbols) { + while (visited_symbols != (struct symbol *)-1L) { + struct symbol *sym = visited_symbols; + + if (sym->is_override) + fputs("override ", dumpfile); + if (symbol_types[sym->type].n) { + putc(symbol_types[sym->type].n, dumpfile); + putc('#', dumpfile); + } + fputs(sym->name, dumpfile); + putc(' ', dumpfile); + if (sym->is_extern) + fputs("extern ", dumpfile); + print_list(dumpfile, sym->defn); + putc('\n', dumpfile); + + visited_symbols = sym->visited; + sym->visited = NULL; + } + } + + if (flag_debug) { + fprintf(debugfile, "Hash table occupancy %d/%d = %g\n", + nsyms, HASH_BUCKETS, + (double)nsyms / (double)HASH_BUCKETS); + } + + if (dumpfile) + fclose(dumpfile); + + return errors != 0; +} diff --git a/src/net/scripts/genksyms/genksyms.h b/src/net/scripts/genksyms/genksyms.h new file mode 100644 index 0000000..2bcdb9b --- /dev/null +++ b/src/net/scripts/genksyms/genksyms.h @@ -0,0 +1,83 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* Generate kernel symbol version hashes. + Copyright 1996, 1997 Linux International. + + New implementation contributed by Richard Henderson <rth@tamu.edu> + Based on original work by Bjorn Ekwall <bj0rn@blox.se> + + This file is part of the Linux modutils. + + */ + +#ifndef MODUTILS_GENKSYMS_H +#define MODUTILS_GENKSYMS_H 1 + +#include <stdio.h> + +enum symbol_type { + SYM_NORMAL, SYM_TYPEDEF, SYM_ENUM, SYM_STRUCT, SYM_UNION, + SYM_ENUM_CONST +}; + +enum symbol_status { + STATUS_UNCHANGED, STATUS_DEFINED, STATUS_MODIFIED +}; + +struct string_list { + struct string_list *next; + enum symbol_type tag; + int in_source_file; + char *string; +}; + +struct symbol { + struct symbol *hash_next; + const char *name; + enum symbol_type type; + struct string_list *defn; + struct symbol *expansion_trail; + struct symbol *visited; + int is_extern; + int is_declared; + enum symbol_status status; + int is_override; +}; + +typedef struct string_list **yystype; +#define YYSTYPE yystype + +extern int cur_line; +extern char *cur_filename, *source_file; +extern int in_source_file; + +struct symbol *find_symbol(const char *name, enum symbol_type ns, int exact); +struct symbol *add_symbol(const char *name, enum symbol_type type, + struct string_list *defn, int is_extern); +void export_symbol(const char *); + +void free_node(struct string_list *list); +void free_list(struct string_list *s, struct string_list *e); +struct string_list *copy_node(struct string_list *); +struct string_list *copy_list_range(struct string_list *start, + struct string_list *end); + +int yylex(void); +int yyparse(void); + +void error_with_pos(const char *, ...) __attribute__ ((format(printf, 1, 2))); + +/*----------------------------------------------------------------------*/ +#define xmalloc(size) ({ void *__ptr = malloc(size); \ + if(!__ptr && size != 0) { \ + fprintf(stderr, "out of memory\n"); \ + exit(1); \ + } \ + __ptr; }) +#define xstrdup(str) ({ char *__str = strdup(str); \ + if (!__str) { \ + fprintf(stderr, "out of memory\n"); \ + exit(1); \ + } \ + __str; }) + +#endif /* genksyms.h */ diff --git a/src/net/scripts/genksyms/keywords.c b/src/net/scripts/genksyms/keywords.c new file mode 100644 index 0000000..057c6ca --- /dev/null +++ b/src/net/scripts/genksyms/keywords.c @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: GPL-2.0-only +static struct resword { + const char *name; + int token; +} keywords[] = { + { "__GENKSYMS_EXPORT_SYMBOL", EXPORT_SYMBOL_KEYW }, + { "__asm", ASM_KEYW }, + { "__asm__", ASM_KEYW }, + { "__attribute", ATTRIBUTE_KEYW }, + { "__attribute__", ATTRIBUTE_KEYW }, + { "__const", CONST_KEYW }, + { "__const__", CONST_KEYW }, + { "__extension__", EXTENSION_KEYW }, + { "__inline", INLINE_KEYW }, + { "__inline__", INLINE_KEYW }, + { "__signed", SIGNED_KEYW }, + { "__signed__", SIGNED_KEYW }, + { "__typeof", TYPEOF_KEYW }, + { "__typeof__", TYPEOF_KEYW }, + { "__volatile", VOLATILE_KEYW }, + { "__volatile__", VOLATILE_KEYW }, + { "__builtin_va_list", VA_LIST_KEYW }, + + { "__int128", BUILTIN_INT_KEYW }, + { "__int128_t", BUILTIN_INT_KEYW }, + { "__uint128_t", BUILTIN_INT_KEYW }, + + // According to rth, c99 defines "_Bool", "__restrict", "__restrict__", "restrict". KAO + { "_Bool", BOOL_KEYW }, + { "__restrict", RESTRICT_KEYW }, + { "__restrict__", RESTRICT_KEYW }, + { "restrict", RESTRICT_KEYW }, + { "asm", ASM_KEYW }, + + // attribute commented out in modutils 2.4.2. People are using 'attribute' as a + // field name which breaks the genksyms parser. It is not a gcc keyword anyway. + // KAO. }, + // { "attribute", ATTRIBUTE_KEYW }, + + { "auto", AUTO_KEYW }, + { "char", CHAR_KEYW }, + { "const", CONST_KEYW }, + { "double", DOUBLE_KEYW }, + { "enum", ENUM_KEYW }, + { "extern", EXTERN_KEYW }, + { "float", FLOAT_KEYW }, + { "inline", INLINE_KEYW }, + { "int", INT_KEYW }, + { "long", LONG_KEYW }, + { "register", REGISTER_KEYW }, + { "short", SHORT_KEYW }, + { "signed", SIGNED_KEYW }, + { "static", STATIC_KEYW }, + { "struct", STRUCT_KEYW }, + { "typedef", TYPEDEF_KEYW }, + { "typeof", TYPEOF_KEYW }, + { "union", UNION_KEYW }, + { "unsigned", UNSIGNED_KEYW }, + { "void", VOID_KEYW }, + { "volatile", VOLATILE_KEYW }, +}; + +#define NR_KEYWORDS (sizeof(keywords)/sizeof(struct resword)) + +static int is_reserved_word(register const char *str, register unsigned int len) +{ + int i; + for (i = 0; i < NR_KEYWORDS; i++) { + struct resword *r = keywords + i; + int l = strlen(r->name); + if (len == l && !memcmp(str, r->name, len)) + return r->token; + } + return -1; +} diff --git a/src/net/scripts/genksyms/lex.l b/src/net/scripts/genksyms/lex.l new file mode 100644 index 0000000..e265c5d --- /dev/null +++ b/src/net/scripts/genksyms/lex.l @@ -0,0 +1,469 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Lexical analysis for genksyms. + * Copyright 1996, 1997 Linux International. + * + * New implementation contributed by Richard Henderson <rth@tamu.edu> + * Based on original work by Bjorn Ekwall <bj0rn@blox.se> + * + * Taken from Linux modutils 2.4.22. + */ + +%{ + +#include <limits.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> + +#include "genksyms.h" +#include "parse.tab.h" + +/* We've got a two-level lexer here. We let flex do basic tokenization + and then we categorize those basic tokens in the second stage. */ +#define YY_DECL static int yylex1(void) + +%} + +IDENT [A-Za-z_\$][A-Za-z0-9_\$]* + +O_INT 0[0-7]* +D_INT [1-9][0-9]* +X_INT 0[Xx][0-9A-Fa-f]+ +I_SUF [Uu]|[Ll]|[Uu][Ll]|[Ll][Uu] +INT ({O_INT}|{D_INT}|{X_INT}){I_SUF}? + +FRAC ([0-9]*\.[0-9]+)|([0-9]+\.) +EXP [Ee][+-]?[0-9]+ +F_SUF [FfLl] +REAL ({FRAC}{EXP}?{F_SUF}?)|([0-9]+{EXP}{F_SUF}?) + +STRING L?\"([^\\\"]*\\.)*[^\\\"]*\" +CHAR L?\'([^\\\']*\\.)*[^\\\']*\' + +MC_TOKEN ([~%^&*+=|<>/-]=)|(&&)|("||")|(->)|(<<)|(>>) + +/* We don't do multiple input files. */ +%option noyywrap + +%option noinput + +%% + + + /* Keep track of our location in the original source files. */ +^#[ \t]+{INT}[ \t]+\"[^\"\n]+\".*\n return FILENAME; +^#.*\n cur_line++; +\n cur_line++; + + /* Ignore all other whitespace. */ +[ \t\f\v\r]+ ; + + +{STRING} return STRING; +{CHAR} return CHAR; +{IDENT} return IDENT; + + /* The Pedant requires that the other C multi-character tokens be + recognized as tokens. We don't actually use them since we don't + parse expressions, but we do want whitespace to be arranged + around them properly. */ +{MC_TOKEN} return OTHER; +{INT} return INT; +{REAL} return REAL; + +"..." return DOTS; + + /* All other tokens are single characters. */ +. return yytext[0]; + + +%% + +/* Bring in the keyword recognizer. */ + +#include "keywords.c" + + +/* Macros to append to our phrase collection list. */ + +/* + * We mark any token, that that equals to a known enumerator, as + * SYM_ENUM_CONST. The parser will change this for struct and union tags later, + * the only problem is struct and union members: + * enum e { a, b }; struct s { int a, b; } + * but in this case, the only effect will be, that the ABI checksums become + * more volatile, which is acceptable. Also, such collisions are quite rare, + * so far it was only observed in include/linux/telephony.h. + */ +#define _APP(T,L) do { \ + cur_node = next_node; \ + next_node = xmalloc(sizeof(*next_node)); \ + next_node->next = cur_node; \ + cur_node->string = memcpy(xmalloc(L+1), T, L+1); \ + cur_node->tag = \ + find_symbol(cur_node->string, SYM_ENUM_CONST, 1)?\ + SYM_ENUM_CONST : SYM_NORMAL ; \ + cur_node->in_source_file = in_source_file; \ + } while (0) + +#define APP _APP(yytext, yyleng) + + +/* The second stage lexer. Here we incorporate knowledge of the state + of the parser to tailor the tokens that are returned. */ + +int +yylex(void) +{ + static enum { + ST_NOTSTARTED, ST_NORMAL, ST_ATTRIBUTE, ST_ASM, ST_TYPEOF, ST_TYPEOF_1, + ST_BRACKET, ST_BRACE, ST_EXPRESSION, + ST_TABLE_1, ST_TABLE_2, ST_TABLE_3, ST_TABLE_4, + ST_TABLE_5, ST_TABLE_6 + } lexstate = ST_NOTSTARTED; + + static int suppress_type_lookup, dont_want_brace_phrase; + static struct string_list *next_node; + + int token, count = 0; + struct string_list *cur_node; + + if (lexstate == ST_NOTSTARTED) + { + next_node = xmalloc(sizeof(*next_node)); + next_node->next = NULL; + lexstate = ST_NORMAL; + } + +repeat: + token = yylex1(); + + if (token == 0) + return 0; + else if (token == FILENAME) + { + char *file, *e; + + /* Save the filename and line number for later error messages. */ + + if (cur_filename) + free(cur_filename); + + file = strchr(yytext, '\"')+1; + e = strchr(file, '\"'); + *e = '\0'; + cur_filename = memcpy(xmalloc(e-file+1), file, e-file+1); + cur_line = atoi(yytext+2); + + if (!source_file) { + source_file = xstrdup(cur_filename); + in_source_file = 1; + } else { + in_source_file = (strcmp(cur_filename, source_file) == 0); + } + + goto repeat; + } + + switch (lexstate) + { + case ST_NORMAL: + switch (token) + { + case IDENT: + APP; + { + int r = is_reserved_word(yytext, yyleng); + if (r >= 0) + { + switch (token = r) + { + case ATTRIBUTE_KEYW: + lexstate = ST_ATTRIBUTE; + count = 0; + goto repeat; + case ASM_KEYW: + lexstate = ST_ASM; + count = 0; + goto repeat; + case TYPEOF_KEYW: + lexstate = ST_TYPEOF; + count = 0; + goto repeat; + + case STRUCT_KEYW: + case UNION_KEYW: + case ENUM_KEYW: + dont_want_brace_phrase = 3; + suppress_type_lookup = 2; + goto fini; + + case EXPORT_SYMBOL_KEYW: + goto fini; + } + } + if (!suppress_type_lookup) + { + if (find_symbol(yytext, SYM_TYPEDEF, 1)) + token = TYPE; + } + } + break; + + case '[': + APP; + lexstate = ST_BRACKET; + count = 1; + goto repeat; + + case '{': + APP; + if (dont_want_brace_phrase) + break; + lexstate = ST_BRACE; + count = 1; + goto repeat; + + case '=': case ':': + APP; + lexstate = ST_EXPRESSION; + break; + + case DOTS: + default: + APP; + break; + } + break; + + case ST_ATTRIBUTE: + APP; + switch (token) + { + case '(': + ++count; + goto repeat; + case ')': + if (--count == 0) + { + lexstate = ST_NORMAL; + token = ATTRIBUTE_PHRASE; + break; + } + goto repeat; + default: + goto repeat; + } + break; + + case ST_ASM: + APP; + switch (token) + { + case '(': + ++count; + goto repeat; + case ')': + if (--count == 0) + { + lexstate = ST_NORMAL; + token = ASM_PHRASE; + break; + } + goto repeat; + default: + goto repeat; + } + break; + + case ST_TYPEOF_1: + if (token == IDENT) + { + if (is_reserved_word(yytext, yyleng) >= 0 + || find_symbol(yytext, SYM_TYPEDEF, 1)) + { + yyless(0); + unput('('); + lexstate = ST_NORMAL; + token = TYPEOF_KEYW; + break; + } + _APP("(", 1); + } + lexstate = ST_TYPEOF; + /* FALLTHRU */ + + case ST_TYPEOF: + switch (token) + { + case '(': + if ( ++count == 1 ) + lexstate = ST_TYPEOF_1; + else + APP; + goto repeat; + case ')': + APP; + if (--count == 0) + { + lexstate = ST_NORMAL; + token = TYPEOF_PHRASE; + break; + } + goto repeat; + default: + APP; + goto repeat; + } + break; + + case ST_BRACKET: + APP; + switch (token) + { + case '[': + ++count; + goto repeat; + case ']': + if (--count == 0) + { + lexstate = ST_NORMAL; + token = BRACKET_PHRASE; + break; + } + goto repeat; + default: + goto repeat; + } + break; + + case ST_BRACE: + APP; + switch (token) + { + case '{': + ++count; + goto repeat; + case '}': + if (--count == 0) + { + lexstate = ST_NORMAL; + token = BRACE_PHRASE; + break; + } + goto repeat; + default: + goto repeat; + } + break; + + case ST_EXPRESSION: + switch (token) + { + case '(': case '[': case '{': + ++count; + APP; + goto repeat; + case '}': + /* is this the last line of an enum declaration? */ + if (count == 0) + { + /* Put back the token we just read so's we can find it again + after registering the expression. */ + unput(token); + + lexstate = ST_NORMAL; + token = EXPRESSION_PHRASE; + break; + } + /* FALLTHRU */ + case ')': case ']': + --count; + APP; + goto repeat; + case ',': case ';': + if (count == 0) + { + /* Put back the token we just read so's we can find it again + after registering the expression. */ + unput(token); + + lexstate = ST_NORMAL; + token = EXPRESSION_PHRASE; + break; + } + APP; + goto repeat; + default: + APP; + goto repeat; + } + break; + + case ST_TABLE_1: + goto repeat; + + case ST_TABLE_2: + if (token == IDENT && yyleng == 1 && yytext[0] == 'X') + { + token = EXPORT_SYMBOL_KEYW; + lexstate = ST_TABLE_5; + APP; + break; + } + lexstate = ST_TABLE_6; + /* FALLTHRU */ + + case ST_TABLE_6: + switch (token) + { + case '{': case '[': case '(': + ++count; + break; + case '}': case ']': case ')': + --count; + break; + case ',': + if (count == 0) + lexstate = ST_TABLE_2; + break; + }; + goto repeat; + + case ST_TABLE_3: + goto repeat; + + case ST_TABLE_4: + if (token == ';') + lexstate = ST_NORMAL; + goto repeat; + + case ST_TABLE_5: + switch (token) + { + case ',': + token = ';'; + lexstate = ST_TABLE_2; + APP; + break; + default: + APP; + break; + } + break; + + default: + exit(1); + } +fini: + + if (suppress_type_lookup > 0) + --suppress_type_lookup; + if (dont_want_brace_phrase > 0) + --dont_want_brace_phrase; + + yylval = &next_node->next; + + return token; +} diff --git a/src/net/scripts/genksyms/parse.y b/src/net/scripts/genksyms/parse.y new file mode 100644 index 0000000..e22b422 --- /dev/null +++ b/src/net/scripts/genksyms/parse.y @@ -0,0 +1,503 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * C global declaration parser for genksyms. + * Copyright 1996, 1997 Linux International. + * + * New implementation contributed by Richard Henderson <rth@tamu.edu> + * Based on original work by Bjorn Ekwall <bj0rn@blox.se> + * + * This file is part of the Linux modutils. + */ + +%{ + +#include <assert.h> +#include <stdlib.h> +#include <string.h> +#include "genksyms.h" + +static int is_typedef; +static int is_extern; +static char *current_name; +static struct string_list *decl_spec; + +static void yyerror(const char *); + +static inline void +remove_node(struct string_list **p) +{ + struct string_list *node = *p; + *p = node->next; + free_node(node); +} + +static inline void +remove_list(struct string_list **pb, struct string_list **pe) +{ + struct string_list *b = *pb, *e = *pe; + *pb = e; + free_list(b, e); +} + +/* Record definition of a struct/union/enum */ +static void record_compound(struct string_list **keyw, + struct string_list **ident, + struct string_list **body, + enum symbol_type type) +{ + struct string_list *b = *body, *i = *ident, *r; + + if (i->in_source_file) { + remove_node(keyw); + (*ident)->tag = type; + remove_list(body, ident); + return; + } + r = copy_node(i); r->tag = type; + r->next = (*keyw)->next; *body = r; (*keyw)->next = NULL; + add_symbol(i->string, type, b, is_extern); +} + +%} + +%token ASM_KEYW +%token ATTRIBUTE_KEYW +%token AUTO_KEYW +%token BOOL_KEYW +%token BUILTIN_INT_KEYW +%token CHAR_KEYW +%token CONST_KEYW +%token DOUBLE_KEYW +%token ENUM_KEYW +%token EXTERN_KEYW +%token EXTENSION_KEYW +%token FLOAT_KEYW +%token INLINE_KEYW +%token INT_KEYW +%token LONG_KEYW +%token REGISTER_KEYW +%token RESTRICT_KEYW +%token SHORT_KEYW +%token SIGNED_KEYW +%token STATIC_KEYW +%token STRUCT_KEYW +%token TYPEDEF_KEYW +%token UNION_KEYW +%token UNSIGNED_KEYW +%token VOID_KEYW +%token VOLATILE_KEYW +%token TYPEOF_KEYW +%token VA_LIST_KEYW + +%token EXPORT_SYMBOL_KEYW + +%token ASM_PHRASE +%token ATTRIBUTE_PHRASE +%token TYPEOF_PHRASE +%token BRACE_PHRASE +%token BRACKET_PHRASE +%token EXPRESSION_PHRASE + +%token CHAR +%token DOTS +%token IDENT +%token INT +%token REAL +%token STRING +%token TYPE +%token OTHER +%token FILENAME + +%% + +declaration_seq: + declaration + | declaration_seq declaration + ; + +declaration: + { is_typedef = 0; is_extern = 0; current_name = NULL; decl_spec = NULL; } + declaration1 + { free_list(*$2, NULL); *$2 = NULL; } + ; + +declaration1: + EXTENSION_KEYW TYPEDEF_KEYW { is_typedef = 1; } simple_declaration + { $$ = $4; } + | TYPEDEF_KEYW { is_typedef = 1; } simple_declaration + { $$ = $3; } + | simple_declaration + | function_definition + | asm_definition + | export_definition + | error ';' { $$ = $2; } + | error '}' { $$ = $2; } + ; + +simple_declaration: + decl_specifier_seq_opt init_declarator_list_opt ';' + { if (current_name) { + struct string_list *decl = (*$3)->next; + (*$3)->next = NULL; + add_symbol(current_name, + is_typedef ? SYM_TYPEDEF : SYM_NORMAL, + decl, is_extern); + current_name = NULL; + } + $$ = $3; + } + ; + +init_declarator_list_opt: + /* empty */ { $$ = NULL; } + | init_declarator_list + ; + +init_declarator_list: + init_declarator + { struct string_list *decl = *$1; + *$1 = NULL; + add_symbol(current_name, + is_typedef ? SYM_TYPEDEF : SYM_NORMAL, decl, is_extern); + current_name = NULL; + $$ = $1; + } + | init_declarator_list ',' init_declarator + { struct string_list *decl = *$3; + *$3 = NULL; + free_list(*$2, NULL); + *$2 = decl_spec; + add_symbol(current_name, + is_typedef ? SYM_TYPEDEF : SYM_NORMAL, decl, is_extern); + current_name = NULL; + $$ = $3; + } + ; + +init_declarator: + declarator asm_phrase_opt attribute_opt initializer_opt + { $$ = $4 ? $4 : $3 ? $3 : $2 ? $2 : $1; } + ; + +/* Hang on to the specifiers so that we can reuse them. */ +decl_specifier_seq_opt: + /* empty */ { decl_spec = NULL; } + | decl_specifier_seq + ; + +decl_specifier_seq: + decl_specifier { decl_spec = *$1; } + | decl_specifier_seq decl_specifier { decl_spec = *$2; } + ; + +decl_specifier: + storage_class_specifier + { /* Version 2 checksumming ignores storage class, as that + is really irrelevant to the linkage. */ + remove_node($1); + $$ = $1; + } + | type_specifier + ; + +storage_class_specifier: + AUTO_KEYW + | REGISTER_KEYW + | STATIC_KEYW + | EXTERN_KEYW { is_extern = 1; $$ = $1; } + | INLINE_KEYW { is_extern = 0; $$ = $1; } + ; + +type_specifier: + simple_type_specifier + | cvar_qualifier + | TYPEOF_KEYW '(' parameter_declaration ')' + | TYPEOF_PHRASE + + /* References to s/u/e's defined elsewhere. Rearrange things + so that it is easier to expand the definition fully later. */ + | STRUCT_KEYW IDENT + { remove_node($1); (*$2)->tag = SYM_STRUCT; $$ = $2; } + | UNION_KEYW IDENT + { remove_node($1); (*$2)->tag = SYM_UNION; $$ = $2; } + | ENUM_KEYW IDENT + { remove_node($1); (*$2)->tag = SYM_ENUM; $$ = $2; } + + /* Full definitions of an s/u/e. Record it. */ + | STRUCT_KEYW IDENT class_body + { record_compound($1, $2, $3, SYM_STRUCT); $$ = $3; } + | UNION_KEYW IDENT class_body + { record_compound($1, $2, $3, SYM_UNION); $$ = $3; } + | ENUM_KEYW IDENT enum_body + { record_compound($1, $2, $3, SYM_ENUM); $$ = $3; } + /* + * Anonymous enum definition. Tell add_symbol() to restart its counter. + */ + | ENUM_KEYW enum_body + { add_symbol(NULL, SYM_ENUM, NULL, 0); $$ = $2; } + /* Anonymous s/u definitions. Nothing needs doing. */ + | STRUCT_KEYW class_body { $$ = $2; } + | UNION_KEYW class_body { $$ = $2; } + ; + +simple_type_specifier: + CHAR_KEYW + | SHORT_KEYW + | INT_KEYW + | LONG_KEYW + | SIGNED_KEYW + | UNSIGNED_KEYW + | FLOAT_KEYW + | DOUBLE_KEYW + | VOID_KEYW + | BOOL_KEYW + | VA_LIST_KEYW + | BUILTIN_INT_KEYW + | TYPE { (*$1)->tag = SYM_TYPEDEF; $$ = $1; } + ; + +ptr_operator: + '*' cvar_qualifier_seq_opt + { $$ = $2 ? $2 : $1; } + ; + +cvar_qualifier_seq_opt: + /* empty */ { $$ = NULL; } + | cvar_qualifier_seq + ; + +cvar_qualifier_seq: + cvar_qualifier + | cvar_qualifier_seq cvar_qualifier { $$ = $2; } + ; + +cvar_qualifier: + CONST_KEYW | VOLATILE_KEYW | ATTRIBUTE_PHRASE + | RESTRICT_KEYW + { /* restrict has no effect in prototypes so ignore it */ + remove_node($1); + $$ = $1; + } + ; + +declarator: + ptr_operator declarator { $$ = $2; } + | direct_declarator + ; + +direct_declarator: + IDENT + { if (current_name != NULL) { + error_with_pos("unexpected second declaration name"); + YYERROR; + } else { + current_name = (*$1)->string; + $$ = $1; + } + } + | TYPE + { if (current_name != NULL) { + error_with_pos("unexpected second declaration name"); + YYERROR; + } else { + current_name = (*$1)->string; + $$ = $1; + } + } + | direct_declarator '(' parameter_declaration_clause ')' + { $$ = $4; } + | direct_declarator '(' error ')' + { $$ = $4; } + | direct_declarator BRACKET_PHRASE + { $$ = $2; } + | '(' declarator ')' + { $$ = $3; } + ; + +/* Nested declarators differ from regular declarators in that they do + not record the symbols they find in the global symbol table. */ +nested_declarator: + ptr_operator nested_declarator { $$ = $2; } + | direct_nested_declarator + ; + +direct_nested_declarator: + IDENT + | TYPE + | direct_nested_declarator '(' parameter_declaration_clause ')' + { $$ = $4; } + | direct_nested_declarator '(' error ')' + { $$ = $4; } + | direct_nested_declarator BRACKET_PHRASE + { $$ = $2; } + | '(' nested_declarator ')' + { $$ = $3; } + | '(' error ')' + { $$ = $3; } + ; + +parameter_declaration_clause: + parameter_declaration_list_opt DOTS { $$ = $2; } + | parameter_declaration_list_opt + | parameter_declaration_list ',' DOTS { $$ = $3; } + ; + +parameter_declaration_list_opt: + /* empty */ { $$ = NULL; } + | parameter_declaration_list + ; + +parameter_declaration_list: + parameter_declaration + | parameter_declaration_list ',' parameter_declaration + { $$ = $3; } + ; + +parameter_declaration: + decl_specifier_seq m_abstract_declarator + { $$ = $2 ? $2 : $1; } + ; + +m_abstract_declarator: + ptr_operator m_abstract_declarator + { $$ = $2 ? $2 : $1; } + | direct_m_abstract_declarator + ; + +direct_m_abstract_declarator: + /* empty */ { $$ = NULL; } + | IDENT + { /* For version 2 checksums, we don't want to remember + private parameter names. */ + remove_node($1); + $$ = $1; + } + /* This wasn't really a typedef name but an identifier that + shadows one. */ + | TYPE + { remove_node($1); + $$ = $1; + } + | direct_m_abstract_declarator '(' parameter_declaration_clause ')' + { $$ = $4; } + | direct_m_abstract_declarator '(' error ')' + { $$ = $4; } + | direct_m_abstract_declarator BRACKET_PHRASE + { $$ = $2; } + | '(' m_abstract_declarator ')' + { $$ = $3; } + | '(' error ')' + { $$ = $3; } + ; + +function_definition: + decl_specifier_seq_opt declarator BRACE_PHRASE + { struct string_list *decl = *$2; + *$2 = NULL; + add_symbol(current_name, SYM_NORMAL, decl, is_extern); + $$ = $3; + } + ; + +initializer_opt: + /* empty */ { $$ = NULL; } + | initializer + ; + +/* We never care about the contents of an initializer. */ +initializer: + '=' EXPRESSION_PHRASE + { remove_list($2, &(*$1)->next); $$ = $2; } + ; + +class_body: + '{' member_specification_opt '}' { $$ = $3; } + | '{' error '}' { $$ = $3; } + ; + +member_specification_opt: + /* empty */ { $$ = NULL; } + | member_specification + ; + +member_specification: + member_declaration + | member_specification member_declaration { $$ = $2; } + ; + +member_declaration: + decl_specifier_seq_opt member_declarator_list_opt ';' + { $$ = $3; } + | error ';' + { $$ = $2; } + ; + +member_declarator_list_opt: + /* empty */ { $$ = NULL; } + | member_declarator_list + ; + +member_declarator_list: + member_declarator + | member_declarator_list ',' member_declarator { $$ = $3; } + ; + +member_declarator: + nested_declarator attribute_opt { $$ = $2 ? $2 : $1; } + | IDENT member_bitfield_declarator { $$ = $2; } + | member_bitfield_declarator + ; + +member_bitfield_declarator: + ':' EXPRESSION_PHRASE { $$ = $2; } + ; + +attribute_opt: + /* empty */ { $$ = NULL; } + | attribute_opt ATTRIBUTE_PHRASE + ; + +enum_body: + '{' enumerator_list '}' { $$ = $3; } + | '{' enumerator_list ',' '}' { $$ = $4; } + ; + +enumerator_list: + enumerator + | enumerator_list ',' enumerator + +enumerator: + IDENT + { + const char *name = strdup((*$1)->string); + add_symbol(name, SYM_ENUM_CONST, NULL, 0); + } + | IDENT '=' EXPRESSION_PHRASE + { + const char *name = strdup((*$1)->string); + struct string_list *expr = copy_list_range(*$3, *$2); + add_symbol(name, SYM_ENUM_CONST, expr, 0); + } + +asm_definition: + ASM_PHRASE ';' { $$ = $2; } + ; + +asm_phrase_opt: + /* empty */ { $$ = NULL; } + | ASM_PHRASE + ; + +export_definition: + EXPORT_SYMBOL_KEYW '(' IDENT ')' ';' + { export_symbol((*$3)->string); $$ = $5; } + ; + + +%% + +static void +yyerror(const char *e) +{ + error_with_pos("%s", e); +} diff --git a/src/net/scripts/get_abi.pl b/src/net/scripts/get_abi.pl new file mode 100755 index 0000000..92d9aa6 --- /dev/null +++ b/src/net/scripts/get_abi.pl @@ -0,0 +1,628 @@ +#!/usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0 + +use strict; +use warnings; +use utf8; +use Pod::Usage; +use Getopt::Long; +use File::Find; +use Fcntl ':mode'; + +my $help = 0; +my $man = 0; +my $debug = 0; +my $enable_lineno = 0; +my $prefix="Documentation/ABI"; + +# +# If true, assumes that the description is formatted with ReST +# +my $description_is_rst = 1; + +GetOptions( + "debug|d+" => \$debug, + "enable-lineno" => \$enable_lineno, + "rst-source!" => \$description_is_rst, + "dir=s" => \$prefix, + 'help|?' => \$help, + man => \$man +) or pod2usage(2); + +pod2usage(1) if $help; +pod2usage(-exitstatus => 0, -verbose => 2) if $man; + +pod2usage(2) if (scalar @ARGV < 1 || @ARGV > 2); + +my ($cmd, $arg) = @ARGV; + +pod2usage(2) if ($cmd ne "search" && $cmd ne "rest" && $cmd ne "validate"); +pod2usage(2) if ($cmd eq "search" && !$arg); + +require Data::Dumper if ($debug); + +my %data; +my %symbols; + +# +# Displays an error message, printing file name and line +# +sub parse_error($$$$) { + my ($file, $ln, $msg, $data) = @_; + + $data =~ s/\s+$/\n/; + + print STDERR "Warning: file $file#$ln:\n\t$msg"; + + if ($data ne "") { + print STDERR ". Line\n\t\t$data"; + } else { + print STDERR "\n"; + } +} + +# +# Parse an ABI file, storing its contents at %data +# +sub parse_abi { + my $file = $File::Find::name; + + my $mode = (stat($file))[2]; + return if ($mode & S_IFDIR); + return if ($file =~ m,/README,); + + my $name = $file; + $name =~ s,.*/,,; + + my $fn = $file; + $fn =~ s,Documentation/ABI/,,; + + my $nametag = "File $fn"; + $data{$nametag}->{what} = "File $name"; + $data{$nametag}->{type} = "File"; + $data{$nametag}->{file} = $name; + $data{$nametag}->{filepath} = $file; + $data{$nametag}->{is_file} = 1; + $data{$nametag}->{line_no} = 1; + + my $type = $file; + $type =~ s,.*/(.*)/.*,$1,; + + my $what; + my $new_what; + my $tag = ""; + my $ln; + my $xrefs; + my $space; + my @labels; + my $label = ""; + + print STDERR "Opening $file\n" if ($debug > 1); + open IN, $file; + while(<IN>) { + $ln++; + if (m/^(\S+)(:\s*)(.*)/i) { + my $new_tag = lc($1); + my $sep = $2; + my $content = $3; + + if (!($new_tag =~ m/(what|where|date|kernelversion|contact|description|users)/)) { + if ($tag eq "description") { + # New "tag" is actually part of + # description. Don't consider it a tag + $new_tag = ""; + } elsif ($tag ne "") { + parse_error($file, $ln, "tag '$tag' is invalid", $_); + } + } + + # Invalid, but it is a common mistake + if ($new_tag eq "where") { + parse_error($file, $ln, "tag 'Where' is invalid. Should be 'What:' instead", ""); + $new_tag = "what"; + } + + if ($new_tag =~ m/what/) { + $space = ""; + $content =~ s/[,.;]$//; + + push @{$symbols{$content}->{file}}, " $file:" . ($ln - 1); + + if ($tag =~ m/what/) { + $what .= ", " . $content; + } else { + if ($what) { + parse_error($file, $ln, "What '$what' doesn't have a description", "") if (!$data{$what}->{description}); + + foreach my $w(split /, /, $what) { + $symbols{$w}->{xref} = $what; + }; + } + + $what = $content; + $label = $content; + $new_what = 1; + } + push @labels, [($content, $label)]; + $tag = $new_tag; + + push @{$data{$nametag}->{symbols}}, $content if ($data{$nametag}->{what}); + next; + } + + if ($tag ne "" && $new_tag) { + $tag = $new_tag; + + if ($new_what) { + @{$data{$what}->{label_list}} = @labels if ($data{$nametag}->{what}); + @labels = (); + $label = ""; + $new_what = 0; + + $data{$what}->{type} = $type; + if (!defined($data{$what}->{file})) { + $data{$what}->{file} = $name; + $data{$what}->{filepath} = $file; + } else { + if ($name ne $data{$what}->{file}) { + $data{$what}->{file} .= " " . $name; + $data{$what}->{filepath} .= " " . $file; + } + } + print STDERR "\twhat: $what\n" if ($debug > 1); + $data{$what}->{line_no} = $ln; + } else { + $data{$what}->{line_no} = $ln if (!defined($data{$what}->{line_no})); + } + + if (!$what) { + parse_error($file, $ln, "'What:' should come first:", $_); + next; + } + if ($new_tag eq "description") { + $sep =~ s,:, ,; + $content = ' ' x length($new_tag) . $sep . $content; + while ($content =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e) {} + if ($content =~ m/^(\s*)(\S.*)$/) { + # Preserve initial spaces for the first line + $space = $1; + $content = "$2\n"; + $data{$what}->{$tag} .= $content; + } else { + undef($space); + } + + } else { + $data{$what}->{$tag} = $content; + } + next; + } + } + + # Store any contents before tags at the database + if (!$tag && $data{$nametag}->{what}) { + $data{$nametag}->{description} .= $_; + next; + } + + if ($tag eq "description") { + my $content = $_; + while ($content =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e) {} + if (m/^\s*\n/) { + $data{$what}->{$tag} .= "\n"; + next; + } + + if (!defined($space)) { + # Preserve initial spaces for the first line + if ($content =~ m/^(\s*)(\S.*)$/) { + $space = $1; + $content = "$2\n"; + } + } else { + $space = "" if (!($content =~ s/^($space)//)); + } + $data{$what}->{$tag} .= $content; + + next; + } + if (m/^\s*(.*)/) { + $data{$what}->{$tag} .= "\n$1"; + $data{$what}->{$tag} =~ s/\n+$//; + next; + } + + # Everything else is error + parse_error($file, $ln, "Unexpected content", $_); + } + $data{$nametag}->{description} =~ s/^\n+// if ($data{$nametag}->{description}); + if ($what) { + parse_error($file, $ln, "What '$what' doesn't have a description", "") if (!$data{$what}->{description}); + + foreach my $w(split /, /,$what) { + $symbols{$w}->{xref} = $what; + }; + } + close IN; +} + +sub create_labels { + my %labels; + + foreach my $what (keys %data) { + next if ($data{$what}->{file} eq "File"); + + foreach my $p (@{$data{$what}->{label_list}}) { + my ($content, $label) = @{$p}; + $label = "abi_" . $label . " "; + $label =~ tr/A-Z/a-z/; + + # Convert special chars to "_" + $label =~s/([\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\xff])/_/g; + $label =~ s,_+,_,g; + $label =~ s,_$,,; + + # Avoid duplicated labels + while (defined($labels{$label})) { + my @chars = ("A".."Z", "a".."z"); + $label .= $chars[rand @chars]; + } + $labels{$label} = 1; + + $data{$what}->{label} = $label; + + # only one label is enough + last; + } + } +} + +# +# Outputs the book on ReST format +# + +# \b doesn't work well with paths. So, we need to define something else +my $bondary = qr { (?<![\w\/\`\{])(?=[\w\/\`\{])|(?<=[\w\/\`\{])(?![\w\/\`\{]) }x; + +sub output_rest { + create_labels(); + + my $part = ""; + + foreach my $what (sort { + ($data{$a}->{type} eq "File") cmp ($data{$b}->{type} eq "File") || + $a cmp $b + } keys %data) { + my $type = $data{$what}->{type}; + + my @file = split / /, $data{$what}->{file}; + my @filepath = split / /, $data{$what}->{filepath}; + + if ($enable_lineno) { + printf "#define LINENO %s%s#%s\n\n", + $prefix, $file[0], + $data{$what}->{line_no}; + } + + my $w = $what; + $w =~ s/([\(\)\_\-\*\=\^\~\\])/\\$1/g; + + if ($type ne "File") { + my $cur_part = $what; + if ($what =~ '/') { + if ($what =~ m#^(\/?(?:[\w\-]+\/?){1,2})#) { + $cur_part = "Symbols under $1"; + $cur_part =~ s,/$,,; + } + } + + if ($cur_part ne "" && $part ne $cur_part) { + $part = $cur_part; + my $bar = $part; + $bar =~ s/./-/g; + print "$part\n$bar\n\n"; + } + + printf ".. _%s:\n\n", $data{$what}->{label}; + + my @names = split /, /,$w; + my $len = 0; + + foreach my $name (@names) { + $name = "**$name**"; + $len = length($name) if (length($name) > $len); + } + + print "+-" . "-" x $len . "-+\n"; + foreach my $name (@names) { + printf "| %s", $name . " " x ($len - length($name)) . " |\n"; + print "+-" . "-" x $len . "-+\n"; + } + + print "\n"; + } + + for (my $i = 0; $i < scalar(@filepath); $i++) { + my $path = $filepath[$i]; + my $f = $file[$i]; + + $path =~ s,.*/(.*/.*),$1,;; + $path =~ s,[/\-],_,g;; + my $fileref = "abi_file_".$path; + + if ($type eq "File") { + print ".. _$fileref:\n\n"; + } else { + print "Defined on file :ref:`$f <$fileref>`\n\n"; + } + } + + if ($type eq "File") { + my $bar = $w; + $bar =~ s/./-/g; + print "$w\n$bar\n\n"; + } + + my $desc = ""; + $desc = $data{$what}->{description} if (defined($data{$what}->{description})); + $desc =~ s/\s+$/\n/; + + if (!($desc =~ /^\s*$/)) { + if ($description_is_rst) { + # Remove title markups from the description + # Having titles inside ABI files will only work if extra + # care would be taken in order to strictly follow the same + # level order for each markup. + $desc =~ s/\n[\-\*\=\^\~]+\n/\n\n/g; + + # Enrich text by creating cross-references + + $desc =~ s,Documentation/(?!devicetree)(\S+)\.rst,:doc:`/$1`,g; + + my @matches = $desc =~ m,Documentation/ABI/([\w\/\-]+),; + foreach my $f (@matches) { + my $xref = $f; + my $path = $f; + $path =~ s,.*/(.*/.*),$1,;; + $path =~ s,[/\-],_,g;; + $xref .= " <abi_file_" . $path . ">"; + $desc =~ s,\bDocumentation/ABI/$f\b,:ref:`$xref`,g; + } + + @matches = $desc =~ m,$bondary(/sys/[^\s\.\,\;\:\*\s\`\'\(\)]+)$bondary,; + + foreach my $s (@matches) { + if (defined($data{$s}) && defined($data{$s}->{label})) { + my $xref = $s; + + $xref =~ s/([\x00-\x1f\x21-\x2f\x3a-\x40\x7b-\xff])/\\$1/g; + $xref = ":ref:`$xref <" . $data{$s}->{label} . ">`"; + + $desc =~ s,$bondary$s$bondary,$xref,g; + } + } + + print "$desc\n\n"; + } else { + $desc =~ s/^\s+//; + + # Remove title markups from the description, as they won't work + $desc =~ s/\n[\-\*\=\^\~]+\n/\n\n/g; + + if ($desc =~ m/\:\n/ || $desc =~ m/\n[\t ]+/ || $desc =~ m/[\x00-\x08\x0b-\x1f\x7b-\xff]/) { + # put everything inside a code block + $desc =~ s/\n/\n /g; + + print "::\n\n"; + print " $desc\n\n"; + } else { + # Escape any special chars from description + $desc =~s/([\x00-\x08\x0b-\x1f\x21-\x2a\x2d\x2f\x3c-\x40\x5c\x5e-\x60\x7b-\xff])/\\$1/g; + print "$desc\n\n"; + } + } + } else { + print "DESCRIPTION MISSING for $what\n\n" if (!$data{$what}->{is_file}); + } + + if ($data{$what}->{symbols}) { + printf "Has the following ABI:\n\n"; + + foreach my $content(@{$data{$what}->{symbols}}) { + my $label = $data{$symbols{$content}->{xref}}->{label}; + + # Escape special chars from content + $content =~s/([\x00-\x1f\x21-\x2f\x3a-\x40\x7b-\xff])/\\$1/g; + + print "- :ref:`$content <$label>`\n\n"; + } + } + + if (defined($data{$what}->{users})) { + my $users = $data{$what}->{users}; + + $users =~ s/\n/\n\t/g; + printf "Users:\n\t%s\n\n", $users if ($users ne ""); + } + + } +} + +# +# Searches for ABI symbols +# +sub search_symbols { + foreach my $what (sort keys %data) { + next if (!($what =~ m/($arg)/)); + + my $type = $data{$what}->{type}; + next if ($type eq "File"); + + my $file = $data{$what}->{filepath}; + + my $bar = $what; + $bar =~ s/./-/g; + + print "\n$what\n$bar\n\n"; + + my $kernelversion = $data{$what}->{kernelversion} if (defined($data{$what}->{kernelversion})); + my $contact = $data{$what}->{contact} if (defined($data{$what}->{contact})); + my $users = $data{$what}->{users} if (defined($data{$what}->{users})); + my $date = $data{$what}->{date} if (defined($data{$what}->{date})); + my $desc = $data{$what}->{description} if (defined($data{$what}->{description})); + + $kernelversion =~ s/^\s+// if ($kernelversion); + $contact =~ s/^\s+// if ($contact); + if ($users) { + $users =~ s/^\s+//; + $users =~ s/\n//g; + } + $date =~ s/^\s+// if ($date); + $desc =~ s/^\s+// if ($desc); + + printf "Kernel version:\t\t%s\n", $kernelversion if ($kernelversion); + printf "Date:\t\t\t%s\n", $date if ($date); + printf "Contact:\t\t%s\n", $contact if ($contact); + printf "Users:\t\t\t%s\n", $users if ($users); + print "Defined on file(s):\t$file\n\n"; + print "Description:\n\n$desc"; + } +} + +# Ensure that the prefix will always end with a slash +# While this is not needed for find, it makes the patch nicer +# with --enable-lineno +$prefix =~ s,/?$,/,; + +# +# Parses all ABI files located at $prefix dir +# +find({wanted =>\&parse_abi, no_chdir => 1}, $prefix); + +print STDERR Data::Dumper->Dump([\%data], [qw(*data)]) if ($debug); + +# +# Handles the command +# +if ($cmd eq "search") { + search_symbols; +} else { + if ($cmd eq "rest") { + output_rest; + } + + # Warn about duplicated ABI entries + foreach my $what(sort keys %symbols) { + my @files = @{$symbols{$what}->{file}}; + + next if (scalar(@files) == 1); + + printf STDERR "Warning: $what is defined %d times: @files\n", + scalar(@files); + } +} + +__END__ + +=head1 NAME + +abi_book.pl - parse the Linux ABI files and produce a ReST book. + +=head1 SYNOPSIS + +B<abi_book.pl> [--debug] [--enable-lineno] [--man] [--help] + [--(no-)rst-source] [--dir=<dir>] <COMAND> [<ARGUMENT>] + +Where <COMMAND> can be: + +=over 8 + +B<search> [SEARCH_REGEX] - search for [SEARCH_REGEX] inside ABI + +B<rest> - output the ABI in ReST markup language + +B<validate> - validate the ABI contents + +=back + +=head1 OPTIONS + +=over 8 + +=item B<--dir> + +Changes the location of the ABI search. By default, it uses +the Documentation/ABI directory. + +=item B<--rst-source> and B<--no-rst-source> + +The input file may be using ReST syntax or not. Those two options allow +selecting between a rst-compliant source ABI (--rst-source), or a +plain text that may be violating ReST spec, so it requres some escaping +logic (--no-rst-source). + +=item B<--enable-lineno> + +Enable output of #define LINENO lines. + +=item B<--debug> + +Put the script in verbose mode, useful for debugging. Can be called multiple +times, to increase verbosity. + +=item B<--help> + +Prints a brief help message and exits. + +=item B<--man> + +Prints the manual page and exits. + +=back + +=head1 DESCRIPTION + +Parse the Linux ABI files from ABI DIR (usually located at Documentation/ABI), +allowing to search for ABI symbols or to produce a ReST book containing +the Linux ABI documentation. + +=head1 EXAMPLES + +Search for all stable symbols with the word "usb": + +=over 8 + +$ scripts/get_abi.pl search usb --dir Documentation/ABI/stable + +=back + +Search for all symbols that match the regex expression "usb.*cap": + +=over 8 + +$ scripts/get_abi.pl search usb.*cap + +=back + +Output all obsoleted symbols in ReST format + +=over 8 + +$ scripts/get_abi.pl rest --dir Documentation/ABI/obsolete + +=back + +=head1 BUGS + +Report bugs to Mauro Carvalho Chehab <mchehab+samsung@kernel.org> + +=head1 COPYRIGHT + +Copyright (c) 2016-2019 by Mauro Carvalho Chehab <mchehab+samsung@kernel.org>. + +License GPLv2: GNU GPL version 2 <http://gnu.org/licenses/gpl.html>. + +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. + +=cut diff --git a/src/net/scripts/get_dvb_firmware b/src/net/scripts/get_dvb_firmware new file mode 100755 index 0000000..1a90802 --- /dev/null +++ b/src/net/scripts/get_dvb_firmware @@ -0,0 +1,929 @@ +#!/usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0-or-later +# DVB firmware extractor +# +# (c) 2004 Andrew de Quincey +# + +use File::Temp qw/ tempdir /; +use IO::Handle; + +@components = ( "sp8870", "sp887x", "tda10045", "tda10046", + "tda10046lifeview", "av7110", "dec2000t", "dec2540t", + "dec3000s", "vp7041", "vp7049", "dibusb", "nxt2002", "nxt2004", + "or51211", "or51132_qam", "or51132_vsb", "bluebird", + "opera1", "cx231xx", "cx18", "cx23885", "pvrusb2", "mpc718", + "af9015", "ngene", "az6027", "lme2510_lg", "lme2510c_s7395", + "lme2510c_s7395_old", "drxk", "drxk_terratec_h5", + "drxk_hauppauge_hvr930c", "tda10071", "it9135", "drxk_pctv", + "drxk_terratec_htc_stick", "sms1xxx_hcw", "si2165"); + +# Check args +syntax() if (scalar(@ARGV) != 1); +$cid = $ARGV[0]; + +# Do it! +for ($i=0; $i < scalar(@components); $i++) { + if ($cid eq $components[$i]) { + $outfile = eval($cid); + die $@ if $@; + print STDERR <<EOF; +Firmware(s) $outfile extracted successfully. +Now copy it(them) to either /usr/lib/hotplug/firmware or /lib/firmware +(depending on configuration of firmware hotplug). +EOF + exit(0); + } +} + +# If we get here, it wasn't found +print STDERR "Unknown component \"$cid\"\n"; +syntax(); + + + + +# --------------------------------------------------------------- +# Firmware-specific extraction subroutines + +sub sp8870 { + my $sourcefile = "tt_Premium_217g.zip"; + my $url = "http://www.softwarepatch.pl/9999ccd06a4813cb827dbb0005071c71/$sourcefile"; + my $hash = "53970ec17a538945a6d8cb608a7b3899"; + my $outfile = "dvb-fe-sp8870.fw"; + my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1); + + checkstandard(); + + wgetfile($sourcefile, $url); + unzip($sourcefile, $tmpdir); + verify("$tmpdir/software/OEM/HE/App/boot/SC_MAIN.MC", $hash); + copy("$tmpdir/software/OEM/HE/App/boot/SC_MAIN.MC", $outfile); + + $outfile; +} + +sub sp887x { + my $sourcefile = "Dvbt1.3.57.6.zip"; + my $url = "http://www.avermedia.com/software/$sourcefile"; + my $cabfile = "DVBT Net Ver1.3.57.6/disk1/data1.cab"; + my $hash = "237938d53a7f834c05c42b894ca68ac3"; + my $outfile = "dvb-fe-sp887x.fw"; + my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1); + + checkstandard(); + checkunshield(); + + wgetfile($sourcefile, $url); + unzip($sourcefile, $tmpdir); + unshield("$tmpdir/$cabfile", $tmpdir); + verify("$tmpdir/ZEnglish/sc_main.mc", $hash); + copy("$tmpdir/ZEnglish/sc_main.mc", $outfile); + + $outfile; +} + +sub tda10045 { + my $sourcefile = "tt_budget_217g.zip"; + my $url = "http://www.technotrend.de/new/217g/$sourcefile"; + my $hash = "2105fd5bf37842fbcdfa4bfd58f3594a"; + my $outfile = "dvb-fe-tda10045.fw"; + my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1); + + checkstandard(); + + wgetfile($sourcefile, $url); + unzip($sourcefile, $tmpdir); + extract("$tmpdir/software/OEM/PCI/App/ttlcdacc.dll", 0x37ef9, 30555, "$tmpdir/fwtmp"); + verify("$tmpdir/fwtmp", $hash); + copy("$tmpdir/fwtmp", $outfile); + + $outfile; +} + +sub tda10046 { + my $sourcefile = "TT_PCI_2.19h_28_11_2006.zip"; + my $url = "http://technotrend.com.ua/download/software/219/$sourcefile"; + my $hash = "6a7e1e2f2644b162ff0502367553c72d"; + my $outfile = "dvb-fe-tda10046.fw"; + my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1); + + checkstandard(); + + wgetfile($sourcefile, $url); + unzip($sourcefile, $tmpdir); + extract("$tmpdir/TT_PCI_2.19h_28_11_2006/software/OEM/PCI/App/ttlcdacc.dll", 0x65389, 24478, "$tmpdir/fwtmp"); + verify("$tmpdir/fwtmp", $hash); + copy("$tmpdir/fwtmp", $outfile); + + $outfile; +} + +sub tda10046lifeview { + my $sourcefile = "7%5Cdrv_2.11.02.zip"; + my $url = "http://www.lifeview.hk/dbimages/document/$sourcefile"; + my $hash = "1ea24dee4eea8fe971686981f34fd2e0"; + my $outfile = "dvb-fe-tda10046.fw"; + my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1); + + checkstandard(); + + wgetfile($sourcefile, $url); + unzip($sourcefile, $tmpdir); + extract("$tmpdir/LVHybrid.sys", 0x8b088, 24602, "$tmpdir/fwtmp"); + verify("$tmpdir/fwtmp", $hash); + copy("$tmpdir/fwtmp", $outfile); + + $outfile; +} + +sub av7110 { + my $sourcefile = "dvb-ttpci-01.fw-261d"; + my $url = "https://linuxtv.org/downloads/firmware/$sourcefile"; + my $hash = "603431b6259715a8e88f376a53b64e2f"; + my $outfile = "dvb-ttpci-01.fw"; + + checkstandard(); + + wgetfile($sourcefile, $url); + verify($sourcefile, $hash); + copy($sourcefile, $outfile); + + $outfile; +} + +sub dec2000t { + my $sourcefile = "dec217g.exe"; + my $url = "http://hauppauge.lightpath.net/de/$sourcefile"; + my $hash = "bd86f458cee4a8f0a8ce2d20c66215a9"; + my $outfile = "dvb-ttusb-dec-2000t.fw"; + my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1); + + checkstandard(); + + wgetfile($sourcefile, $url); + unzip($sourcefile, $tmpdir); + verify("$tmpdir/software/OEM/STB/App/Boot/STB_PC_T.bin", $hash); + copy("$tmpdir/software/OEM/STB/App/Boot/STB_PC_T.bin", $outfile); + + $outfile; +} + +sub dec2540t { + my $sourcefile = "dec217g.exe"; + my $url = "http://hauppauge.lightpath.net/de/$sourcefile"; + my $hash = "53e58f4f5b5c2930beee74a7681fed92"; + my $outfile = "dvb-ttusb-dec-2540t.fw"; + my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1); + + checkstandard(); + + wgetfile($sourcefile, $url); + unzip($sourcefile, $tmpdir); + verify("$tmpdir/software/OEM/STB/App/Boot/STB_PC_X.bin", $hash); + copy("$tmpdir/software/OEM/STB/App/Boot/STB_PC_X.bin", $outfile); + + $outfile; +} + +sub dec3000s { + my $sourcefile = "dec217g.exe"; + my $url = "http://hauppauge.lightpath.net/de/$sourcefile"; + my $hash = "b013ececea83f4d6d8d2a29ac7c1b448"; + my $outfile = "dvb-ttusb-dec-3000s.fw"; + my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1); + + checkstandard(); + + wgetfile($sourcefile, $url); + unzip($sourcefile, $tmpdir); + verify("$tmpdir/software/OEM/STB/App/Boot/STB_PC_S.bin", $hash); + copy("$tmpdir/software/OEM/STB/App/Boot/STB_PC_S.bin", $outfile); + + $outfile; +} +sub opera1{ + my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 0); + + checkstandard(); + my $fwfile1="dvb-usb-opera1-fpga-01.fw"; + my $fwfile2="dvb-usb-opera-01.fw"; + extract("2830SCap2.sys", 0x62e8, 55024, "$tmpdir/opera1-fpga.fw"); + extract("2830SLoad2.sys",0x3178,0x3685-0x3178,"$tmpdir/fw1part1"); + extract("2830SLoad2.sys",0x0980,0x3150-0x0980,"$tmpdir/fw1part2"); + delzero("$tmpdir/fw1part1","$tmpdir/fw1part1-1"); + delzero("$tmpdir/fw1part2","$tmpdir/fw1part2-1"); + verify("$tmpdir/fw1part1-1","5e0909858fdf0b5b09ad48b9fe622e70"); + verify("$tmpdir/fw1part2-1","d6e146f321427e931df2c6fcadac37a1"); + verify("$tmpdir/opera1-fpga.fw","0f8133f5e9051f5f3c1928f7e5a1b07d"); + + my $RES1="\x01\x92\x7f\x00\x01\x00"; + my $RES0="\x01\x92\x7f\x00\x00\x00"; + my $DAT1="\x01\x00\xe6\x00\x01\x00"; + my $DAT0="\x01\x00\xe6\x00\x00\x00"; + open FW,">$tmpdir/opera.fw"; + print FW "$RES1"; + print FW "$DAT1"; + print FW "$RES1"; + print FW "$DAT1"; + appendfile(FW,"$tmpdir/fw1part1-1"); + print FW "$RES0"; + print FW "$DAT0"; + print FW "$RES1"; + print FW "$DAT1"; + appendfile(FW,"$tmpdir/fw1part2-1"); + print FW "$RES1"; + print FW "$DAT1"; + print FW "$RES0"; + print FW "$DAT0"; + copy ("$tmpdir/opera1-fpga.fw",$fwfile1); + copy ("$tmpdir/opera.fw",$fwfile2); + + $fwfile1.",".$fwfile2; +} + +sub vp7041 { + my $sourcefile = "2.422.zip"; + my $url = "http://www.twinhan.com/files/driver/USB-Ter/$sourcefile"; + my $hash = "e88c9372d1f66609a3e7b072c53fbcfe"; + my $outfile = "dvb-vp7041-2.422.fw"; + my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1); + + checkstandard(); + + wgetfile($sourcefile, $url); + unzip($sourcefile, $tmpdir); + extract("$tmpdir/VisionDTV/Drivers/Win2K&XP/UDTTload.sys", 12503, 3036, "$tmpdir/fwtmp1"); + extract("$tmpdir/VisionDTV/Drivers/Win2K&XP/UDTTload.sys", 2207, 10274, "$tmpdir/fwtmp2"); + + my $CMD = "\000\001\000\222\177\000"; + my $PAD = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"; + my ($FW); + open $FW, ">$tmpdir/fwtmp3"; + print $FW "$CMD\001$PAD"; + print $FW "$CMD\001$PAD"; + appendfile($FW, "$tmpdir/fwtmp1"); + print $FW "$CMD\000$PAD"; + print $FW "$CMD\001$PAD"; + appendfile($FW, "$tmpdir/fwtmp2"); + print $FW "$CMD\001$PAD"; + print $FW "$CMD\000$PAD"; + close($FW); + + verify("$tmpdir/fwtmp3", $hash); + copy("$tmpdir/fwtmp3", $outfile); + + $outfile; +} + +sub vp7049 { + my $fwfile = "dvb-usb-vp7049-0.95.fw"; + my $url = "http://ao2.it/sites/default/files/blog/2012/11/06/linux-support-digicom-digitune-s-vp7049-udtt7049/$fwfile"; + my $hash = "5609fd295168aea88b25ff43a6f79c36"; + + checkstandard(); + + wgetfile($fwfile, $url); + verify($fwfile, $hash); + + $fwfile; +} + +sub dibusb { + my $url = "https://linuxtv.org/downloads/firmware/dvb-usb-dibusb-5.0.0.11.fw"; + my $outfile = "dvb-dibusb-5.0.0.11.fw"; + my $hash = "fa490295a527360ca16dcdf3224ca243"; + + checkstandard(); + + wgetfile($outfile, $url); + verify($outfile,$hash); + + $outfile; +} + +sub nxt2002 { + my $sourcefile = "Technisat_DVB-PC_4_4_COMPACT.zip"; + my $url = "http://www.bbti.us/download/windows/$sourcefile"; + my $hash = "476befae8c7c1bb9648954060b1eec1f"; + my $outfile = "dvb-fe-nxt2002.fw"; + my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1); + + checkstandard(); + + wgetfile($sourcefile, $url); + unzip($sourcefile, $tmpdir); + verify("$tmpdir/SkyNET.sys", $hash); + extract("$tmpdir/SkyNET.sys", 331624, 5908, $outfile); + + $outfile; +} + +sub nxt2004 { + my $sourcefile = "AVerTVHD_MCE_A180_Drv_v1.2.2.16.zip"; + my $url = "http://www.avermedia-usa.com/support/Drivers/$sourcefile"; + my $hash = "111cb885b1e009188346d72acfed024c"; + my $outfile = "dvb-fe-nxt2004.fw"; + my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1); + + checkstandard(); + + wgetfile($sourcefile, $url); + unzip($sourcefile, $tmpdir); + verify("$tmpdir/3xHybrid.sys", $hash); + extract("$tmpdir/3xHybrid.sys", 465304, 9584, $outfile); + + $outfile; +} + +sub or51211 { + my $fwfile = "dvb-fe-or51211.fw"; + my $url = "https://linuxtv.org/downloads/firmware/$fwfile"; + my $hash = "d830949c771a289505bf9eafc225d491"; + + checkstandard(); + + wgetfile($fwfile, $url); + verify($fwfile, $hash); + + $fwfile; +} + +sub cx231xx { + my $fwfile = "v4l-cx231xx-avcore-01.fw"; + my $url = "https://linuxtv.org/downloads/firmware/$fwfile"; + my $hash = "7d3bb956dc9df0eafded2b56ba57cc42"; + + checkstandard(); + + wgetfile($fwfile, $url); + verify($fwfile, $hash); + + $fwfile; +} + +sub cx18 { + my $url = "https://linuxtv.org/downloads/firmware/"; + + my %files = ( + 'v4l-cx23418-apu.fw' => '588f081b562f5c653a3db1ad8f65939a', + 'v4l-cx23418-cpu.fw' => 'b6c7ed64bc44b1a6e0840adaeac39d79', + 'v4l-cx23418-dig.fw' => '95bc688d3e7599fd5800161e9971cc55', + ); + + checkstandard(); + + my $allfiles; + foreach my $fwfile (keys %files) { + wgetfile($fwfile, "$url/$fwfile"); + verify($fwfile, $files{$fwfile}); + $allfiles .= " $fwfile"; + } + + $allfiles =~ s/^\s//; + + $allfiles; +} + +sub mpc718 { + my $archive = 'Yuan MPC718 TV Tuner Card 2.13.10.1016.zip'; + my $url = "ftp://ftp.work.acer-euro.com/desktop/aspire_idea510/vista/Drivers/$archive"; + my $fwfile = "dvb-cx18-mpc718-mt352.fw"; + my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1); + + checkstandard(); + wgetfile($archive, $url); + unzip($archive, $tmpdir); + + my $sourcefile = "$tmpdir/Yuan MPC718 TV Tuner Card 2.13.10.1016/mpc718_32bit/yuanrap.sys"; + my $found = 0; + + open IN, '<', $sourcefile or die "Couldn't open $sourcefile to extract $fwfile data\n"; + binmode IN; + open OUT, '>', $fwfile; + binmode OUT; + { + # Block scope because we change the line terminator variable $/ + my $prevlen = 0; + my $currlen; + + # Buried in the data segment are 3 runs of almost identical + # register-value pairs that end in 0x5d 0x01 which is a "TUNER GO" + # command for the MT352. + # Pull out the middle run (because it's easy) of register-value + # pairs to make the "firmware" file. + + local $/ = "\x5d\x01"; # MT352 "TUNER GO" + + while (<IN>) { + $currlen = length($_); + if ($prevlen == $currlen && $currlen <= 64) { + chop; chop; # Get rid of "TUNER GO" + s/^\0\0//; # get rid of leading 00 00 if it's there + printf OUT "$_"; + $found = 1; + last; + } + $prevlen = $currlen; + } + } + close OUT; + close IN; + if (!$found) { + unlink $fwfile; + die "Couldn't find valid register-value sequence in $sourcefile for $fwfile\n"; + } + $fwfile; +} + +sub cx23885 { + my $url = "https://linuxtv.org/downloads/firmware/"; + + my %files = ( + 'v4l-cx23885-avcore-01.fw' => 'a9f8f5d901a7fb42f552e1ee6384f3bb', + 'v4l-cx23885-enc.fw' => 'a9f8f5d901a7fb42f552e1ee6384f3bb', + ); + + checkstandard(); + + my $allfiles; + foreach my $fwfile (keys %files) { + wgetfile($fwfile, "$url/$fwfile"); + verify($fwfile, $files{$fwfile}); + $allfiles .= " $fwfile"; + } + + $allfiles =~ s/^\s//; + + $allfiles; +} + +sub pvrusb2 { + my $url = "https://linuxtv.org/downloads/firmware/"; + + my %files = ( + 'v4l-cx25840.fw' => 'dadb79e9904fc8af96e8111d9cb59320', + ); + + checkstandard(); + + my $allfiles; + foreach my $fwfile (keys %files) { + wgetfile($fwfile, "$url/$fwfile"); + verify($fwfile, $files{$fwfile}); + $allfiles .= " $fwfile"; + } + + $allfiles =~ s/^\s//; + + $allfiles; +} + +sub or51132_qam { + my $fwfile = "dvb-fe-or51132-qam.fw"; + my $url = "https://linuxtv.org/downloads/firmware/$fwfile"; + my $hash = "7702e8938612de46ccadfe9b413cb3b5"; + + checkstandard(); + + wgetfile($fwfile, $url); + verify($fwfile, $hash); + + $fwfile; +} + +sub or51132_vsb { + my $fwfile = "dvb-fe-or51132-vsb.fw"; + my $url = "https://linuxtv.org/downloads/firmware/$fwfile"; + my $hash = "c16208e02f36fc439a557ad4c613364a"; + + checkstandard(); + + wgetfile($fwfile, $url); + verify($fwfile, $hash); + + $fwfile; +} + +sub bluebird { + my $url = "https://linuxtv.org/download/dvb/firmware/dvb-usb-bluebird-01.fw"; + my $outfile = "dvb-usb-bluebird-01.fw"; + my $hash = "658397cb9eba9101af9031302671f49d"; + + checkstandard(); + + wgetfile($outfile, $url); + verify($outfile,$hash); + + $outfile; +} + +sub af9015 { + my $sourcefile = "download.ashx?file=57"; + my $url = "http://www.ite.com.tw/EN/Services/$sourcefile"; + my $hash = "e3f08935158038d385ad382442f4bb2d"; + my $outfile = "dvb-usb-af9015.fw"; + my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1); + my $fwoffset = 0x25690; + my $fwlength = 18725; + my ($chunklength, $buf, $rcount); + + checkstandard(); + + wgetfile($sourcefile, $url); + unzip($sourcefile, $tmpdir); + verify("$tmpdir/Driver/Files/AF15BDA.sys", $hash); + + open INFILE, '<', "$tmpdir/Driver/Files/AF15BDA.sys"; + open OUTFILE, '>', $outfile; + + sysseek(INFILE, $fwoffset, SEEK_SET); + while($fwlength > 0) { + $chunklength = 55; + $chunklength = $fwlength if ($chunklength > $fwlength); + $rcount = sysread(INFILE, $buf, $chunklength); + die "Ran out of data\n" if ($rcount != $chunklength); + syswrite(OUTFILE, $buf); + sysread(INFILE, $buf, 8); + $fwlength -= $rcount + 8; + } + + close OUTFILE; + close INFILE; +} + +sub ngene { + my $url = "http://www.digitaldevices.de/download/"; + my $file1 = "ngene_15.fw"; + my $hash1 = "d798d5a757121174f0dbc5f2833c0c85"; + my $file2 = "ngene_17.fw"; + my $hash2 = "26b687136e127b8ac24b81e0eeafc20b"; + my $url2 = "http://l4m-daten.de/downloads/firmware/dvb-s2/linux/all/"; + my $file3 = "ngene_18.fw"; + my $hash3 = "ebce3ea769a53e3e0b0197c3b3f127e3"; + + checkstandard(); + + wgetfile($file1, $url . $file1); + verify($file1, $hash1); + + wgetfile($file2, $url . $file2); + verify($file2, $hash2); + + wgetfile($file3, $url2 . $file3); + verify($file3, $hash3); + + "$file1, $file2, $file3"; +} + +sub az6027{ + my $firmware = "dvb-usb-az6027-03.fw"; + my $url = "http://linux.terratec.de/files/TERRATEC_S7/$firmware"; + + wgetfile($firmware, $url); + + $firmware; +} + +sub lme2510_lg { + my $sourcefile = "LMEBDA_DVBS.sys"; + my $hash = "fc6017ad01e79890a97ec53bea157ed2"; + my $outfile = "dvb-usb-lme2510-lg.fw"; + my $hasho = "caa065d5fdbd2c09ad57b399bbf55cad"; + + checkstandard(); + + verify($sourcefile, $hash); + extract($sourcefile, 4168, 3841, $outfile); + verify($outfile, $hasho); + $outfile; +} + +sub lme2510c_s7395 { + my $sourcefile = "US2A0D.sys"; + my $hash = "b0155a8083fb822a3bd47bc360e74601"; + my $outfile = "dvb-usb-lme2510c-s7395.fw"; + my $hasho = "3a3cf1aeebd17b6ddc04cebe131e94cf"; + + checkstandard(); + + verify($sourcefile, $hash); + extract($sourcefile, 37248, 3720, $outfile); + verify($outfile, $hasho); + $outfile; +} + +sub lme2510c_s7395_old { + my $sourcefile = "LMEBDA_DVBS7395C.sys"; + my $hash = "7572ae0eb9cdf91baabd7c0ba9e09b31"; + my $outfile = "dvb-usb-lme2510c-s7395.fw"; + my $hasho = "90430c5b435eb5c6f88fd44a9d950674"; + + checkstandard(); + + verify($sourcefile, $hash); + extract($sourcefile, 4208, 3881, $outfile); + verify($outfile, $hasho); + $outfile; +} + +sub drxk { + my $url = "http://l4m-daten.de/files/"; + my $zipfile = "DDTuner.zip"; + my $hash = "f5a37b9a20a3534997997c0b1382a3e5"; + my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1); + my $drvfile = "DDTuner.sys"; + my $fwfile = "drxk_a3.mc"; + + checkstandard(); + + wgetfile($zipfile, $url . $zipfile); + verify($zipfile, $hash); + unzip($zipfile, $tmpdir); + extract("$tmpdir/$drvfile", 0x14dd8, 15634, "$fwfile"); + + "$fwfile" +} + +sub drxk_hauppauge_hvr930c { + my $url = "http://www.wintvcd.co.uk/drivers/"; + my $zipfile = "HVR-9x0_5_10_325_28153_SIGNED.zip"; + my $hash = "83ab82e7e9480ec8bf1ae0155ca63c88"; + my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1); + my $drvfile = "HVR-900/emOEM.sys"; + my $fwfile = "dvb-usb-hauppauge-hvr930c-drxk.fw"; + + checkstandard(); + + wgetfile($zipfile, $url . $zipfile); + verify($zipfile, $hash); + unzip($zipfile, $tmpdir); + extract("$tmpdir/$drvfile", 0x117b0, 42692, "$fwfile"); + + "$fwfile" +} + +sub drxk_terratec_h5 { + my $url = "https://linuxtv.org/downloads/firmware/"; + my $hash = "19000dada8e2741162ccc50cc91fa7f1"; + my $fwfile = "dvb-usb-terratec-h5-drxk.fw"; + + checkstandard(); + + wgetfile($fwfile, $url . $fwfile); + verify($fwfile, $hash); + + "$fwfile" +} + +sub drxk_terratec_htc_stick { + my $url = "http://ftp.terratec.de/Receiver/Cinergy_HTC_Stick/Updates/History/"; + my $zipfile = "Cinergy_HTC_Stick_Drv_5.09.1202.00_XP_Vista_7.exe"; + my $hash = "6722a2442a05423b781721fbc069ed5e"; + my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 0); + my $drvfile = "Cinergy HTC Stick/BDA Driver 5.09.1202.00/Windows 32 Bit/emOEM.sys"; + my $fwfile = "dvb-usb-terratec-htc-stick-drxk.fw"; + + checkstandard(); + + wgetfile($zipfile, $url . $zipfile); + verify($zipfile, $hash); + unzip($zipfile, $tmpdir); + extract("$tmpdir/$drvfile", 0x4e5c0, 42692, "$fwfile"); + + "$fwfile" +} + +sub it9135 { + my $url = "http://www.ite.com.tw/uploads/firmware/v3.25.0.0/"; + my $file1 = "dvb-usb-it9135-01.zip"; + my $fwfile1 = "dvb-usb-it9135-01.fw"; + my $hash1 = "02fcf11174eda84745dae7e61c5ff9ba"; + my $file2 = "dvb-usb-it9135-02.zip"; + my $fwfile2 = "dvb-usb-it9135-02.fw"; + my $hash2 = "d5e1437dc24358578e07999475d4cac9"; + + checkstandard(); + + wgetfile($file1, $url . $file1); + unzip($file1, ""); + verify("$fwfile1", $hash1); + + wgetfile($file2, $url . $file2); + unzip($file2, ""); + verify("$fwfile2", $hash2); + + "$file1 $file2" +} + +sub tda10071 { + my $sourcefile = "PCTV_460e_reference.zip"; + my $url = "ftp://ftp.pctvsystems.com/TV/driver/PCTV%2070e%2080e%20100e%20320e%20330e%20800e/"; + my $hash = "4403de903bf2593464c8d74bbc200a57"; + my $fwfile = "dvb-fe-tda10071.fw"; + my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1); + + checkstandard(); + + wgetfile($sourcefile, $url . $sourcefile); + verify($sourcefile, $hash); + unzip($sourcefile, $tmpdir); + extract("$tmpdir/PCTV\ 70e\ 80e\ 100e\ 320e\ 330e\ 800e/32\ bit/emOEM.sys", 0x67d38, 40504, $fwfile); + + "$fwfile"; +} + +sub drxk_pctv { + my $sourcefile = "PCTV_460e_reference.zip"; + my $url = "ftp://ftp.pctvsystems.com/TV/driver/PCTV%2070e%2080e%20100e%20320e%20330e%20800e/"; + my $hash = "4403de903bf2593464c8d74bbc200a57"; + my $fwfile = "dvb-demod-drxk-pctv.fw"; + my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1); + + checkstandard(); + + wgetfile($sourcefile, $url . $sourcefile); + verify($sourcefile, $hash); + unzip($sourcefile, $tmpdir); + extract("$tmpdir/PCTV\ 70e\ 80e\ 100e\ 320e\ 330e\ 800e/32\ bit/emOEM.sys", 0x72b80, 42692, $fwfile); + + "$fwfile"; +} + +sub sms1xxx_hcw { + my $url = "http://steventoth.net/linux/sms1xxx/"; + my %files = ( + 'sms1xxx-hcw-55xxx-dvbt-01.fw' => "afb6f9fb9a71d64392e8564ef9577e5a", + 'sms1xxx-hcw-55xxx-dvbt-02.fw' => "b44807098ba26e52cbedeadc052ba58f", + 'sms1xxx-hcw-55xxx-isdbt-02.fw' => "dae934eeea85225acbd63ce6cfe1c9e4", + ); + + checkstandard(); + + my $allfiles; + foreach my $fwfile (keys %files) { + wgetfile($fwfile, "$url/$fwfile"); + verify($fwfile, $files{$fwfile}); + $allfiles .= " $fwfile"; + } + + $allfiles =~ s/^\s//; + + $allfiles; +} + +sub si2165 { + my $sourcefile = "model_111xxx_122xxx_driver_6_0_119_31191_WHQL.zip"; + my $url = "http://www.hauppauge.de/files/drivers/"; + my $hash = "76633e7c76b0edee47c3ba18ded99336"; + my $fwfile = "dvb-demod-si2165.fw"; + my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1); + + checkstandard(); + + wgetfile($sourcefile, $url . $sourcefile); + verify($sourcefile, $hash); + unzip($sourcefile, $tmpdir); + extract("$tmpdir/Driver10/Hcw10bda.sys", 0x80788, 0x81E08-0x80788, "$tmpdir/fw1"); + + delzero("$tmpdir/fw1","$tmpdir/fw1-1"); + #verify("$tmpdir/fw1","5e0909858fdf0b5b09ad48b9fe622e70"); + + my $CRC="\x0A\xCC"; + my $BLOCKS_MAIN="\x27"; + open FW,">$fwfile"; + print FW "\x01\x00"; # just a version id for the driver itself + print FW "\x9A"; # fw version + print FW "\x00"; # padding + print FW "$BLOCKS_MAIN"; # number of blocks of main part + print FW "\x00"; # padding + print FW "$CRC"; # 16bit crc value of main part + appendfile(FW,"$tmpdir/fw1"); + + "$fwfile"; +} + +# --------------------------------------------------------------- +# Utilities + +sub checkstandard { + if (system("which unzip > /dev/null 2>&1")) { + die "This firmware requires the unzip command - see ftp://ftp.info-zip.org/pub/infozip/UnZip.html\n"; + } + if (system("which md5sum > /dev/null 2>&1")) { + die "This firmware requires the md5sum command - see http://www.gnu.org/software/coreutils/\n"; + } + if (system("which wget > /dev/null 2>&1")) { + die "This firmware requires the wget command - see http://wget.sunsite.dk/\n"; + } +} + +sub checkunshield { + if (system("which unshield > /dev/null 2>&1")) { + die "This firmware requires the unshield command - see http://sourceforge.net/projects/synce/\n"; + } +} + +sub wgetfile { + my ($sourcefile, $url) = @_; + + if (! -f $sourcefile) { + system("wget -O \"$sourcefile\" \"$url\"") and die "wget failed - unable to download firmware"; + } +} + +sub unzip { + my ($sourcefile, $todir) = @_; + + $status = system("unzip -q -o -d \"$todir\" \"$sourcefile\" 2>/dev/null" ); + if ((($status >> 8) > 2) || (($status & 0xff) != 0)) { + die ("unzip failed - unable to extract firmware"); + } +} + +sub unshield { + my ($sourcefile, $todir) = @_; + + system("unshield x -d \"$todir\" \"$sourcefile\" > /dev/null" ) and die ("unshield failed - unable to extract firmware"); +} + +sub verify { + my ($filename, $hash) = @_; + my ($testhash); + + open(CMD, "md5sum \"$filename\"|"); + $testhash = <CMD>; + $testhash =~ /([a-zA-Z0-9]*)/; + $testhash = $1; + close CMD; + die "Hash of extracted file does not match!\n" if ($testhash ne $hash); +} + +sub copy { + my ($from, $to) = @_; + + system("cp -f \"$from\" \"$to\"") and die ("cp failed"); +} + +sub extract { + my ($infile, $offset, $length, $outfile) = @_; + my ($chunklength, $buf, $rcount); + + open INFILE, "<$infile"; + open OUTFILE, ">$outfile"; + sysseek(INFILE, $offset, SEEK_SET); + while($length > 0) { + # Calc chunk size + $chunklength = 2048; + $chunklength = $length if ($chunklength > $length); + + $rcount = sysread(INFILE, $buf, $chunklength); + die "Ran out of data\n" if ($rcount != $chunklength); + syswrite(OUTFILE, $buf); + $length -= $rcount; + } + close INFILE; + close OUTFILE; +} + +sub appendfile { + my ($FH, $infile) = @_; + my ($buf); + + open INFILE, "<$infile"; + while(1) { + $rcount = sysread(INFILE, $buf, 2048); + last if ($rcount == 0); + print $FH $buf; + } + close(INFILE); +} + +sub delzero{ + my ($infile,$outfile) =@_; + + open INFILE,"<$infile"; + open OUTFILE,">$outfile"; + while (1){ + $rcount=sysread(INFILE,$buf,22); + $len=ord(substr($buf,0,1)); + print OUTFILE substr($buf,0,1); + print OUTFILE substr($buf,2,$len+3); + last if ($rcount<1); + printf OUTFILE "%c",0; +#print $len." ".length($buf)."\n"; + + } + close(INFILE); + close(OUTFILE); +} + +sub syntax() { + print STDERR "syntax: get_dvb_firmware <component>\n"; + print STDERR "Supported components:\n"; + @components = sort @components; + for($i=0; $i < scalar(@components); $i++) { + print STDERR "\t" . $components[$i] . "\n"; + } + exit(1); +} diff --git a/src/net/scripts/get_maintainer.pl b/src/net/scripts/get_maintainer.pl new file mode 100755 index 0000000..2075db0 --- /dev/null +++ b/src/net/scripts/get_maintainer.pl @@ -0,0 +1,2618 @@ +#!/usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0 +# +# (c) 2007, Joe Perches <joe@perches.com> +# created from checkpatch.pl +# +# Print selected MAINTAINERS information for +# the files modified in a patch or for a file +# +# usage: perl scripts/get_maintainer.pl [OPTIONS] <patch> +# perl scripts/get_maintainer.pl [OPTIONS] -f <file> + +use warnings; +use strict; + +my $P = $0; +my $V = '0.26'; + +use Getopt::Long qw(:config no_auto_abbrev); +use Cwd; +use File::Find; +use File::Spec::Functions; + +my $cur_path = fastgetcwd() . '/'; +my $lk_path = "./"; +my $email = 1; +my $email_usename = 1; +my $email_maintainer = 1; +my $email_reviewer = 1; +my $email_fixes = 1; +my $email_list = 1; +my $email_moderated_list = 1; +my $email_subscriber_list = 0; +my $email_git_penguin_chiefs = 0; +my $email_git = 0; +my $email_git_all_signature_types = 0; +my $email_git_blame = 0; +my $email_git_blame_signatures = 1; +my $email_git_fallback = 1; +my $email_git_min_signatures = 1; +my $email_git_max_maintainers = 5; +my $email_git_min_percent = 5; +my $email_git_since = "1-year-ago"; +my $email_hg_since = "-365"; +my $interactive = 0; +my $email_remove_duplicates = 1; +my $email_use_mailmap = 1; +my $output_multiline = 1; +my $output_separator = ", "; +my $output_roles = 0; +my $output_rolestats = 1; +my $output_section_maxlen = 50; +my $scm = 0; +my $tree = 1; +my $web = 0; +my $subsystem = 0; +my $status = 0; +my $letters = ""; +my $keywords = 1; +my $sections = 0; +my $email_file_emails = 0; +my $from_filename = 0; +my $pattern_depth = 0; +my $self_test = undef; +my $version = 0; +my $help = 0; +my $find_maintainer_files = 0; +my $maintainer_path; +my $vcs_used = 0; + +my $exit = 0; + +my @files = (); +my @fixes = (); # If a patch description includes Fixes: lines +my @range = (); +my @keyword_tvi = (); +my @file_emails = (); + +my %commit_author_hash; +my %commit_signer_hash; + +my @penguin_chief = (); +push(@penguin_chief, "Linus Torvalds:torvalds\@linux-foundation.org"); +#Andrew wants in on most everything - 2009/01/14 +#push(@penguin_chief, "Andrew Morton:akpm\@linux-foundation.org"); + +my @penguin_chief_names = (); +foreach my $chief (@penguin_chief) { + if ($chief =~ m/^(.*):(.*)/) { + my $chief_name = $1; + my $chief_addr = $2; + push(@penguin_chief_names, $chief_name); + } +} +my $penguin_chiefs = "\(" . join("|", @penguin_chief_names) . "\)"; + +# Signature types of people who are either +# a) responsible for the code in question, or +# b) familiar enough with it to give relevant feedback +my @signature_tags = (); +push(@signature_tags, "Signed-off-by:"); +push(@signature_tags, "Reviewed-by:"); +push(@signature_tags, "Acked-by:"); + +my $signature_pattern = "\(" . join("|", @signature_tags) . "\)"; + +# rfc822 email address - preloaded methods go here. +my $rfc822_lwsp = "(?:(?:\\r\\n)?[ \\t])"; +my $rfc822_char = '[\\000-\\377]'; + +# VCS command support: class-like functions and strings + +my %VCS_cmds; + +my %VCS_cmds_git = ( + "execute_cmd" => \&git_execute_cmd, + "available" => '(which("git") ne "") && (-e ".git")', + "find_signers_cmd" => + "git log --no-color --follow --since=\$email_git_since " . + '--numstat --no-merges ' . + '--format="GitCommit: %H%n' . + 'GitAuthor: %an <%ae>%n' . + 'GitDate: %aD%n' . + 'GitSubject: %s%n' . + '%b%n"' . + " -- \$file", + "find_commit_signers_cmd" => + "git log --no-color " . + '--numstat ' . + '--format="GitCommit: %H%n' . + 'GitAuthor: %an <%ae>%n' . + 'GitDate: %aD%n' . + 'GitSubject: %s%n' . + '%b%n"' . + " -1 \$commit", + "find_commit_author_cmd" => + "git log --no-color " . + '--numstat ' . + '--format="GitCommit: %H%n' . + 'GitAuthor: %an <%ae>%n' . + 'GitDate: %aD%n' . + 'GitSubject: %s%n"' . + " -1 \$commit", + "blame_range_cmd" => "git blame -l -L \$diff_start,+\$diff_length \$file", + "blame_file_cmd" => "git blame -l \$file", + "commit_pattern" => "^GitCommit: ([0-9a-f]{40,40})", + "blame_commit_pattern" => "^([0-9a-f]+) ", + "author_pattern" => "^GitAuthor: (.*)", + "subject_pattern" => "^GitSubject: (.*)", + "stat_pattern" => "^(\\d+)\\t(\\d+)\\t\$file\$", + "file_exists_cmd" => "git ls-files \$file", + "list_files_cmd" => "git ls-files \$file", +); + +my %VCS_cmds_hg = ( + "execute_cmd" => \&hg_execute_cmd, + "available" => '(which("hg") ne "") && (-d ".hg")', + "find_signers_cmd" => + "hg log --date=\$email_hg_since " . + "--template='HgCommit: {node}\\n" . + "HgAuthor: {author}\\n" . + "HgSubject: {desc}\\n'" . + " -- \$file", + "find_commit_signers_cmd" => + "hg log " . + "--template='HgSubject: {desc}\\n'" . + " -r \$commit", + "find_commit_author_cmd" => + "hg log " . + "--template='HgCommit: {node}\\n" . + "HgAuthor: {author}\\n" . + "HgSubject: {desc|firstline}\\n'" . + " -r \$commit", + "blame_range_cmd" => "", # not supported + "blame_file_cmd" => "hg blame -n \$file", + "commit_pattern" => "^HgCommit: ([0-9a-f]{40,40})", + "blame_commit_pattern" => "^([ 0-9a-f]+):", + "author_pattern" => "^HgAuthor: (.*)", + "subject_pattern" => "^HgSubject: (.*)", + "stat_pattern" => "^(\\d+)\t(\\d+)\t\$file\$", + "file_exists_cmd" => "hg files \$file", + "list_files_cmd" => "hg manifest -R \$file", +); + +my $conf = which_conf(".get_maintainer.conf"); +if (-f $conf) { + my @conf_args; + open(my $conffile, '<', "$conf") + or warn "$P: Can't find a readable .get_maintainer.conf file $!\n"; + + while (<$conffile>) { + my $line = $_; + + $line =~ s/\s*\n?$//g; + $line =~ s/^\s*//g; + $line =~ s/\s+/ /g; + + next if ($line =~ m/^\s*#/); + next if ($line =~ m/^\s*$/); + + my @words = split(" ", $line); + foreach my $word (@words) { + last if ($word =~ m/^#/); + push (@conf_args, $word); + } + } + close($conffile); + unshift(@ARGV, @conf_args) if @conf_args; +} + +my @ignore_emails = (); +my $ignore_file = which_conf(".get_maintainer.ignore"); +if (-f $ignore_file) { + open(my $ignore, '<', "$ignore_file") + or warn "$P: Can't find a readable .get_maintainer.ignore file $!\n"; + while (<$ignore>) { + my $line = $_; + + $line =~ s/\s*\n?$//; + $line =~ s/^\s*//; + $line =~ s/\s+$//; + $line =~ s/#.*$//; + + next if ($line =~ m/^\s*$/); + if (rfc822_valid($line)) { + push(@ignore_emails, $line); + } + } + close($ignore); +} + +if ($#ARGV > 0) { + foreach (@ARGV) { + if ($_ =~ /^-{1,2}self-test(?:=|$)/) { + die "$P: using --self-test does not allow any other option or argument\n"; + } + } +} + +if (!GetOptions( + 'email!' => \$email, + 'git!' => \$email_git, + 'git-all-signature-types!' => \$email_git_all_signature_types, + 'git-blame!' => \$email_git_blame, + 'git-blame-signatures!' => \$email_git_blame_signatures, + 'git-fallback!' => \$email_git_fallback, + 'git-chief-penguins!' => \$email_git_penguin_chiefs, + 'git-min-signatures=i' => \$email_git_min_signatures, + 'git-max-maintainers=i' => \$email_git_max_maintainers, + 'git-min-percent=i' => \$email_git_min_percent, + 'git-since=s' => \$email_git_since, + 'hg-since=s' => \$email_hg_since, + 'i|interactive!' => \$interactive, + 'remove-duplicates!' => \$email_remove_duplicates, + 'mailmap!' => \$email_use_mailmap, + 'm!' => \$email_maintainer, + 'r!' => \$email_reviewer, + 'n!' => \$email_usename, + 'l!' => \$email_list, + 'fixes!' => \$email_fixes, + 'moderated!' => \$email_moderated_list, + 's!' => \$email_subscriber_list, + 'multiline!' => \$output_multiline, + 'roles!' => \$output_roles, + 'rolestats!' => \$output_rolestats, + 'separator=s' => \$output_separator, + 'subsystem!' => \$subsystem, + 'status!' => \$status, + 'scm!' => \$scm, + 'tree!' => \$tree, + 'web!' => \$web, + 'letters=s' => \$letters, + 'pattern-depth=i' => \$pattern_depth, + 'k|keywords!' => \$keywords, + 'sections!' => \$sections, + 'fe|file-emails!' => \$email_file_emails, + 'f|file' => \$from_filename, + 'find-maintainer-files' => \$find_maintainer_files, + 'mpath|maintainer-path=s' => \$maintainer_path, + 'self-test:s' => \$self_test, + 'v|version' => \$version, + 'h|help|usage' => \$help, + )) { + die "$P: invalid argument - use --help if necessary\n"; +} + +if ($help != 0) { + usage(); + exit 0; +} + +if ($version != 0) { + print("${P} ${V}\n"); + exit 0; +} + +if (defined $self_test) { + read_all_maintainer_files(); + self_test(); + exit 0; +} + +if (-t STDIN && !@ARGV) { + # We're talking to a terminal, but have no command line arguments. + die "$P: missing patchfile or -f file - use --help if necessary\n"; +} + +$output_multiline = 0 if ($output_separator ne ", "); +$output_rolestats = 1 if ($interactive); +$output_roles = 1 if ($output_rolestats); + +if ($sections || $letters ne "") { + $sections = 1; + $email = 0; + $email_list = 0; + $scm = 0; + $status = 0; + $subsystem = 0; + $web = 0; + $keywords = 0; + $interactive = 0; +} else { + my $selections = $email + $scm + $status + $subsystem + $web; + if ($selections == 0) { + die "$P: Missing required option: email, scm, status, subsystem or web\n"; + } +} + +if ($email && + ($email_maintainer + $email_reviewer + + $email_list + $email_subscriber_list + + $email_git + $email_git_penguin_chiefs + $email_git_blame) == 0) { + die "$P: Please select at least 1 email option\n"; +} + +if ($tree && !top_of_kernel_tree($lk_path)) { + die "$P: The current directory does not appear to be " + . "a linux kernel source tree.\n"; +} + +## Read MAINTAINERS for type/value pairs + +my @typevalue = (); +my %keyword_hash; +my @mfiles = (); +my @self_test_info = (); + +sub read_maintainer_file { + my ($file) = @_; + + open (my $maint, '<', "$file") + or die "$P: Can't open MAINTAINERS file '$file': $!\n"; + my $i = 1; + while (<$maint>) { + my $line = $_; + chomp $line; + + if ($line =~ m/^([A-Z]):\s*(.*)/) { + my $type = $1; + my $value = $2; + + ##Filename pattern matching + if ($type eq "F" || $type eq "X") { + $value =~ s@\.@\\\.@g; ##Convert . to \. + $value =~ s/\*/\.\*/g; ##Convert * to .* + $value =~ s/\?/\./g; ##Convert ? to . + ##if pattern is a directory and it lacks a trailing slash, add one + if ((-d $value)) { + $value =~ s@([^/])$@$1/@; + } + } elsif ($type eq "K") { + $keyword_hash{@typevalue} = $value; + } + push(@typevalue, "$type:$value"); + } elsif (!(/^\s*$/ || /^\s*\#/)) { + push(@typevalue, $line); + } + if (defined $self_test) { + push(@self_test_info, {file=>$file, linenr=>$i, line=>$line}); + } + $i++; + } + close($maint); +} + +sub find_is_maintainer_file { + my ($file) = $_; + return if ($file !~ m@/MAINTAINERS$@); + $file = $File::Find::name; + return if (! -f $file); + push(@mfiles, $file); +} + +sub find_ignore_git { + return grep { $_ !~ /^\.git$/; } @_; +} + +read_all_maintainer_files(); + +sub read_all_maintainer_files { + my $path = "${lk_path}MAINTAINERS"; + if (defined $maintainer_path) { + $path = $maintainer_path; + # Perl Cookbook tilde expansion if necessary + $path =~ s@^~([^/]*)@ $1 ? (getpwnam($1))[7] : ( $ENV{HOME} || $ENV{LOGDIR} || (getpwuid($<))[7])@ex; + } + + if (-d $path) { + $path .= '/' if ($path !~ m@/$@); + if ($find_maintainer_files) { + find( { wanted => \&find_is_maintainer_file, + preprocess => \&find_ignore_git, + no_chdir => 1, + }, "$path"); + } else { + opendir(DIR, "$path") or die $!; + my @files = readdir(DIR); + closedir(DIR); + foreach my $file (@files) { + push(@mfiles, "$path$file") if ($file !~ /^\./); + } + } + } elsif (-f "$path") { + push(@mfiles, "$path"); + } else { + die "$P: MAINTAINER file not found '$path'\n"; + } + die "$P: No MAINTAINER files found in '$path'\n" if (scalar(@mfiles) == 0); + foreach my $file (@mfiles) { + read_maintainer_file("$file"); + } +} + +sub maintainers_in_file { + my ($file) = @_; + + return if ($file =~ m@\bMAINTAINERS$@); + + if (-f $file && ($email_file_emails || $file =~ /\.yaml$/)) { + open(my $f, '<', $file) + or die "$P: Can't open $file: $!\n"; + my $text = do { local($/) ; <$f> }; + close($f); + + my @poss_addr = $text =~ m$[A-Za-zÀ-ÿ\"\' \,\.\+-]*\s*[\,]*\s*[\(\<\{]{0,1}[A-Za-z0-9_\.\+-]+\@[A-Za-z0-9\.-]+\.[A-Za-z0-9]+[\)\>\}]{0,1}$g; + push(@file_emails, clean_file_emails(@poss_addr)); + } +} + +# +# Read mail address map +# + +my $mailmap; + +read_mailmap(); + +sub read_mailmap { + $mailmap = { + names => {}, + addresses => {} + }; + + return if (!$email_use_mailmap || !(-f "${lk_path}.mailmap")); + + open(my $mailmap_file, '<', "${lk_path}.mailmap") + or warn "$P: Can't open .mailmap: $!\n"; + + while (<$mailmap_file>) { + s/#.*$//; #strip comments + s/^\s+|\s+$//g; #trim + + next if (/^\s*$/); #skip empty lines + #entries have one of the following formats: + # name1 <mail1> + # <mail1> <mail2> + # name1 <mail1> <mail2> + # name1 <mail1> name2 <mail2> + # (see man git-shortlog) + + if (/^([^<]+)<([^>]+)>$/) { + my $real_name = $1; + my $address = $2; + + $real_name =~ s/\s+$//; + ($real_name, $address) = parse_email("$real_name <$address>"); + $mailmap->{names}->{$address} = $real_name; + + } elsif (/^<([^>]+)>\s*<([^>]+)>$/) { + my $real_address = $1; + my $wrong_address = $2; + + $mailmap->{addresses}->{$wrong_address} = $real_address; + + } elsif (/^(.+)<([^>]+)>\s*<([^>]+)>$/) { + my $real_name = $1; + my $real_address = $2; + my $wrong_address = $3; + + $real_name =~ s/\s+$//; + ($real_name, $real_address) = + parse_email("$real_name <$real_address>"); + $mailmap->{names}->{$wrong_address} = $real_name; + $mailmap->{addresses}->{$wrong_address} = $real_address; + + } elsif (/^(.+)<([^>]+)>\s*(.+)\s*<([^>]+)>$/) { + my $real_name = $1; + my $real_address = $2; + my $wrong_name = $3; + my $wrong_address = $4; + + $real_name =~ s/\s+$//; + ($real_name, $real_address) = + parse_email("$real_name <$real_address>"); + + $wrong_name =~ s/\s+$//; + ($wrong_name, $wrong_address) = + parse_email("$wrong_name <$wrong_address>"); + + my $wrong_email = format_email($wrong_name, $wrong_address, 1); + $mailmap->{names}->{$wrong_email} = $real_name; + $mailmap->{addresses}->{$wrong_email} = $real_address; + } + } + close($mailmap_file); +} + +## use the filenames on the command line or find the filenames in the patchfiles + +if (!@ARGV) { + push(@ARGV, "&STDIN"); +} + +foreach my $file (@ARGV) { + if ($file ne "&STDIN") { + $file = canonpath($file); + ##if $file is a directory and it lacks a trailing slash, add one + if ((-d $file)) { + $file =~ s@([^/])$@$1/@; + } elsif (!(-f $file)) { + die "$P: file '${file}' not found\n"; + } + } + if ($from_filename && (vcs_exists() && !vcs_file_exists($file))) { + warn "$P: file '$file' not found in version control $!\n"; + } + if ($from_filename || ($file ne "&STDIN" && vcs_file_exists($file))) { + $file =~ s/^\Q${cur_path}\E//; #strip any absolute path + $file =~ s/^\Q${lk_path}\E//; #or the path to the lk tree + push(@files, $file); + if ($file ne "MAINTAINERS" && -f $file && $keywords) { + open(my $f, '<', $file) + or die "$P: Can't open $file: $!\n"; + my $text = do { local($/) ; <$f> }; + close($f); + if ($keywords) { + foreach my $line (keys %keyword_hash) { + if ($text =~ m/$keyword_hash{$line}/x) { + push(@keyword_tvi, $line); + } + } + } + } + } else { + my $file_cnt = @files; + my $lastfile; + + open(my $patch, "< $file") + or die "$P: Can't open $file: $!\n"; + + # We can check arbitrary information before the patch + # like the commit message, mail headers, etc... + # This allows us to match arbitrary keywords against any part + # of a git format-patch generated file (subject tags, etc...) + + my $patch_prefix = ""; #Parsing the intro + + while (<$patch>) { + my $patch_line = $_; + if (m/^ mode change [0-7]+ => [0-7]+ (\S+)\s*$/) { + my $filename = $1; + push(@files, $filename); + } elsif (m/^rename (?:from|to) (\S+)\s*$/) { + my $filename = $1; + push(@files, $filename); + } elsif (m/^diff --git a\/(\S+) b\/(\S+)\s*$/) { + my $filename1 = $1; + my $filename2 = $2; + push(@files, $filename1); + push(@files, $filename2); + } elsif (m/^Fixes:\s+([0-9a-fA-F]{6,40})/) { + push(@fixes, $1) if ($email_fixes); + } elsif (m/^\+\+\+\s+(\S+)/ or m/^---\s+(\S+)/) { + my $filename = $1; + $filename =~ s@^[^/]*/@@; + $filename =~ s@\n@@; + $lastfile = $filename; + push(@files, $filename); + $patch_prefix = "^[+-].*"; #Now parsing the actual patch + } elsif (m/^\@\@ -(\d+),(\d+)/) { + if ($email_git_blame) { + push(@range, "$lastfile:$1:$2"); + } + } elsif ($keywords) { + foreach my $line (keys %keyword_hash) { + if ($patch_line =~ m/${patch_prefix}$keyword_hash{$line}/x) { + push(@keyword_tvi, $line); + } + } + } + } + close($patch); + + if ($file_cnt == @files) { + warn "$P: file '${file}' doesn't appear to be a patch. " + . "Add -f to options?\n"; + } + @files = sort_and_uniq(@files); + } +} + +@file_emails = uniq(@file_emails); +@fixes = uniq(@fixes); + +my %email_hash_name; +my %email_hash_address; +my @email_to = (); +my %hash_list_to; +my @list_to = (); +my @scm = (); +my @web = (); +my @subsystem = (); +my @status = (); +my %deduplicate_name_hash = (); +my %deduplicate_address_hash = (); + +my @maintainers = get_maintainers(); +if (@maintainers) { + @maintainers = merge_email(@maintainers); + output(@maintainers); +} + +if ($scm) { + @scm = uniq(@scm); + output(@scm); +} + +if ($status) { + @status = uniq(@status); + output(@status); +} + +if ($subsystem) { + @subsystem = uniq(@subsystem); + output(@subsystem); +} + +if ($web) { + @web = uniq(@web); + output(@web); +} + +exit($exit); + +sub self_test { + my @lsfiles = (); + my @good_links = (); + my @bad_links = (); + my @section_headers = (); + my $index = 0; + + @lsfiles = vcs_list_files($lk_path); + + for my $x (@self_test_info) { + $index++; + + ## Section header duplication and missing section content + if (($self_test eq "" || $self_test =~ /\bsections\b/) && + $x->{line} =~ /^\S[^:]/ && + defined $self_test_info[$index] && + $self_test_info[$index]->{line} =~ /^([A-Z]):\s*\S/) { + my $has_S = 0; + my $has_F = 0; + my $has_ML = 0; + my $status = ""; + if (grep(m@^\Q$x->{line}\E@, @section_headers)) { + print("$x->{file}:$x->{linenr}: warning: duplicate section header\t$x->{line}\n"); + } else { + push(@section_headers, $x->{line}); + } + my $nextline = $index; + while (defined $self_test_info[$nextline] && + $self_test_info[$nextline]->{line} =~ /^([A-Z]):\s*(\S.*)/) { + my $type = $1; + my $value = $2; + if ($type eq "S") { + $has_S = 1; + $status = $value; + } elsif ($type eq "F" || $type eq "N") { + $has_F = 1; + } elsif ($type eq "M" || $type eq "R" || $type eq "L") { + $has_ML = 1; + } + $nextline++; + } + if (!$has_ML && $status !~ /orphan|obsolete/i) { + print("$x->{file}:$x->{linenr}: warning: section without email address\t$x->{line}\n"); + } + if (!$has_S) { + print("$x->{file}:$x->{linenr}: warning: section without status \t$x->{line}\n"); + } + if (!$has_F) { + print("$x->{file}:$x->{linenr}: warning: section without file pattern\t$x->{line}\n"); + } + } + + next if ($x->{line} !~ /^([A-Z]):\s*(.*)/); + + my $type = $1; + my $value = $2; + + ## Filename pattern matching + if (($type eq "F" || $type eq "X") && + ($self_test eq "" || $self_test =~ /\bpatterns\b/)) { + $value =~ s@\.@\\\.@g; ##Convert . to \. + $value =~ s/\*/\.\*/g; ##Convert * to .* + $value =~ s/\?/\./g; ##Convert ? to . + ##if pattern is a directory and it lacks a trailing slash, add one + if ((-d $value)) { + $value =~ s@([^/])$@$1/@; + } + if (!grep(m@^$value@, @lsfiles)) { + print("$x->{file}:$x->{linenr}: warning: no file matches\t$x->{line}\n"); + } + + ## Link reachability + } elsif (($type eq "W" || $type eq "Q" || $type eq "B") && + $value =~ /^https?:/ && + ($self_test eq "" || $self_test =~ /\blinks\b/)) { + next if (grep(m@^\Q$value\E$@, @good_links)); + my $isbad = 0; + if (grep(m@^\Q$value\E$@, @bad_links)) { + $isbad = 1; + } else { + my $output = `wget --spider -q --no-check-certificate --timeout 10 --tries 1 $value`; + if ($? == 0) { + push(@good_links, $value); + } else { + push(@bad_links, $value); + $isbad = 1; + } + } + if ($isbad) { + print("$x->{file}:$x->{linenr}: warning: possible bad link\t$x->{line}\n"); + } + + ## SCM reachability + } elsif ($type eq "T" && + ($self_test eq "" || $self_test =~ /\bscm\b/)) { + next if (grep(m@^\Q$value\E$@, @good_links)); + my $isbad = 0; + if (grep(m@^\Q$value\E$@, @bad_links)) { + $isbad = 1; + } elsif ($value !~ /^(?:git|quilt|hg)\s+\S/) { + print("$x->{file}:$x->{linenr}: warning: malformed entry\t$x->{line}\n"); + } elsif ($value =~ /^git\s+(\S+)(\s+([^\(]+\S+))?/) { + my $url = $1; + my $branch = ""; + $branch = $3 if $3; + my $output = `git ls-remote --exit-code -h "$url" $branch > /dev/null 2>&1`; + if ($? == 0) { + push(@good_links, $value); + } else { + push(@bad_links, $value); + $isbad = 1; + } + } elsif ($value =~ /^(?:quilt|hg)\s+(https?:\S+)/) { + my $url = $1; + my $output = `wget --spider -q --no-check-certificate --timeout 10 --tries 1 $url`; + if ($? == 0) { + push(@good_links, $value); + } else { + push(@bad_links, $value); + $isbad = 1; + } + } + if ($isbad) { + print("$x->{file}:$x->{linenr}: warning: possible bad link\t$x->{line}\n"); + } + } + } +} + +sub ignore_email_address { + my ($address) = @_; + + foreach my $ignore (@ignore_emails) { + return 1 if ($ignore eq $address); + } + + return 0; +} + +sub range_is_maintained { + my ($start, $end) = @_; + + for (my $i = $start; $i < $end; $i++) { + my $line = $typevalue[$i]; + if ($line =~ m/^([A-Z]):\s*(.*)/) { + my $type = $1; + my $value = $2; + if ($type eq 'S') { + if ($value =~ /(maintain|support)/i) { + return 1; + } + } + } + } + return 0; +} + +sub range_has_maintainer { + my ($start, $end) = @_; + + for (my $i = $start; $i < $end; $i++) { + my $line = $typevalue[$i]; + if ($line =~ m/^([A-Z]):\s*(.*)/) { + my $type = $1; + my $value = $2; + if ($type eq 'M') { + return 1; + } + } + } + return 0; +} + +sub get_maintainers { + %email_hash_name = (); + %email_hash_address = (); + %commit_author_hash = (); + %commit_signer_hash = (); + @email_to = (); + %hash_list_to = (); + @list_to = (); + @scm = (); + @web = (); + @subsystem = (); + @status = (); + %deduplicate_name_hash = (); + %deduplicate_address_hash = (); + if ($email_git_all_signature_types) { + $signature_pattern = "(.+?)[Bb][Yy]:"; + } else { + $signature_pattern = "\(" . join("|", @signature_tags) . "\)"; + } + + # Find responsible parties + + my %exact_pattern_match_hash = (); + + foreach my $file (@files) { + + my %hash; + my $tvi = find_first_section(); + while ($tvi < @typevalue) { + my $start = find_starting_index($tvi); + my $end = find_ending_index($tvi); + my $exclude = 0; + my $i; + + #Do not match excluded file patterns + + for ($i = $start; $i < $end; $i++) { + my $line = $typevalue[$i]; + if ($line =~ m/^([A-Z]):\s*(.*)/) { + my $type = $1; + my $value = $2; + if ($type eq 'X') { + if (file_match_pattern($file, $value)) { + $exclude = 1; + last; + } + } + } + } + + if (!$exclude) { + for ($i = $start; $i < $end; $i++) { + my $line = $typevalue[$i]; + if ($line =~ m/^([A-Z]):\s*(.*)/) { + my $type = $1; + my $value = $2; + if ($type eq 'F') { + if (file_match_pattern($file, $value)) { + my $value_pd = ($value =~ tr@/@@); + my $file_pd = ($file =~ tr@/@@); + $value_pd++ if (substr($value,-1,1) ne "/"); + $value_pd = -1 if ($value =~ /^\.\*/); + if ($value_pd >= $file_pd && + range_is_maintained($start, $end) && + range_has_maintainer($start, $end)) { + $exact_pattern_match_hash{$file} = 1; + } + if ($pattern_depth == 0 || + (($file_pd - $value_pd) < $pattern_depth)) { + $hash{$tvi} = $value_pd; + } + } + } elsif ($type eq 'N') { + if ($file =~ m/$value/x) { + $hash{$tvi} = 0; + } + } + } + } + } + $tvi = $end + 1; + } + + foreach my $line (sort {$hash{$b} <=> $hash{$a}} keys %hash) { + add_categories($line); + if ($sections) { + my $i; + my $start = find_starting_index($line); + my $end = find_ending_index($line); + for ($i = $start; $i < $end; $i++) { + my $line = $typevalue[$i]; + if ($line =~ /^[FX]:/) { ##Restore file patterns + $line =~ s/([^\\])\.([^\*])/$1\?$2/g; + $line =~ s/([^\\])\.$/$1\?/g; ##Convert . back to ? + $line =~ s/\\\./\./g; ##Convert \. to . + $line =~ s/\.\*/\*/g; ##Convert .* to * + } + my $count = $line =~ s/^([A-Z]):/$1:\t/g; + if ($letters eq "" || (!$count || $letters =~ /$1/i)) { + print("$line\n"); + } + } + print("\n"); + } + } + + maintainers_in_file($file); + } + + if ($keywords) { + @keyword_tvi = sort_and_uniq(@keyword_tvi); + foreach my $line (@keyword_tvi) { + add_categories($line); + } + } + + foreach my $email (@email_to, @list_to) { + $email->[0] = deduplicate_email($email->[0]); + } + + foreach my $file (@files) { + if ($email && + ($email_git || + ($email_git_fallback && + $file !~ /MAINTAINERS$/ && + !$exact_pattern_match_hash{$file}))) { + vcs_file_signoffs($file); + } + if ($email && $email_git_blame) { + vcs_file_blame($file); + } + } + + if ($email) { + foreach my $chief (@penguin_chief) { + if ($chief =~ m/^(.*):(.*)/) { + my $email_address; + + $email_address = format_email($1, $2, $email_usename); + if ($email_git_penguin_chiefs) { + push(@email_to, [$email_address, 'chief penguin']); + } else { + @email_to = grep($_->[0] !~ /${email_address}/, @email_to); + } + } + } + + foreach my $email (@file_emails) { + my ($name, $address) = parse_email($email); + + my $tmp_email = format_email($name, $address, $email_usename); + push_email_address($tmp_email, ''); + add_role($tmp_email, 'in file'); + } + } + + foreach my $fix (@fixes) { + vcs_add_commit_signers($fix, "blamed_fixes"); + } + + my @to = (); + if ($email || $email_list) { + if ($email) { + @to = (@to, @email_to); + } + if ($email_list) { + @to = (@to, @list_to); + } + } + + if ($interactive) { + @to = interactive_get_maintainers(\@to); + } + + return @to; +} + +sub file_match_pattern { + my ($file, $pattern) = @_; + if (substr($pattern, -1) eq "/") { + if ($file =~ m@^$pattern@) { + return 1; + } + } else { + if ($file =~ m@^$pattern@) { + my $s1 = ($file =~ tr@/@@); + my $s2 = ($pattern =~ tr@/@@); + if ($s1 == $s2) { + return 1; + } + } + } + return 0; +} + +sub usage { + print <<EOT; +usage: $P [options] patchfile + $P [options] -f file|directory +version: $V + +MAINTAINER field selection options: + --email => print email address(es) if any + --git => include recent git \*-by: signers + --git-all-signature-types => include signers regardless of signature type + or use only ${signature_pattern} signers (default: $email_git_all_signature_types) + --git-fallback => use git when no exact MAINTAINERS pattern (default: $email_git_fallback) + --git-chief-penguins => include ${penguin_chiefs} + --git-min-signatures => number of signatures required (default: $email_git_min_signatures) + --git-max-maintainers => maximum maintainers to add (default: $email_git_max_maintainers) + --git-min-percent => minimum percentage of commits required (default: $email_git_min_percent) + --git-blame => use git blame to find modified commits for patch or file + --git-blame-signatures => when used with --git-blame, also include all commit signers + --git-since => git history to use (default: $email_git_since) + --hg-since => hg history to use (default: $email_hg_since) + --interactive => display a menu (mostly useful if used with the --git option) + --m => include maintainer(s) if any + --r => include reviewer(s) if any + --n => include name 'Full Name <addr\@domain.tld>' + --l => include list(s) if any + --moderated => include moderated lists(s) if any (default: true) + --s => include subscriber only list(s) if any (default: false) + --remove-duplicates => minimize duplicate email names/addresses + --roles => show roles (status:subsystem, git-signer, list, etc...) + --rolestats => show roles and statistics (commits/total_commits, %) + --file-emails => add email addresses found in -f file (default: 0 (off)) + --fixes => for patches, add signatures of commits with 'Fixes: <commit>' (default: 1 (on)) + --scm => print SCM tree(s) if any + --status => print status if any + --subsystem => print subsystem name if any + --web => print website(s) if any + +Output type options: + --separator [, ] => separator for multiple entries on 1 line + using --separator also sets --nomultiline if --separator is not [, ] + --multiline => print 1 entry per line + +Other options: + --pattern-depth => Number of pattern directory traversals (default: 0 (all)) + --keywords => scan patch for keywords (default: $keywords) + --sections => print all of the subsystem sections with pattern matches + --letters => print all matching 'letter' types from all matching sections + --mailmap => use .mailmap file (default: $email_use_mailmap) + --no-tree => run without a kernel tree + --self-test => show potential issues with MAINTAINERS file content + --version => show version + --help => show this help information + +Default options: + [--email --tree --nogit --git-fallback --m --r --n --l --multiline + --pattern-depth=0 --remove-duplicates --rolestats] + +Notes: + Using "-f directory" may give unexpected results: + Used with "--git", git signators for _all_ files in and below + directory are examined as git recurses directories. + Any specified X: (exclude) pattern matches are _not_ ignored. + Used with "--nogit", directory is used as a pattern match, + no individual file within the directory or subdirectory + is matched. + Used with "--git-blame", does not iterate all files in directory + Using "--git-blame" is slow and may add old committers and authors + that are no longer active maintainers to the output. + Using "--roles" or "--rolestats" with git send-email --cc-cmd or any + other automated tools that expect only ["name"] <email address> + may not work because of additional output after <email address>. + Using "--rolestats" and "--git-blame" shows the #/total=% commits, + not the percentage of the entire file authored. # of commits is + not a good measure of amount of code authored. 1 major commit may + contain a thousand lines, 5 trivial commits may modify a single line. + If git is not installed, but mercurial (hg) is installed and an .hg + repository exists, the following options apply to mercurial: + --git, + --git-min-signatures, --git-max-maintainers, --git-min-percent, and + --git-blame + Use --hg-since not --git-since to control date selection + File ".get_maintainer.conf", if it exists in the linux kernel source root + directory, can change whatever get_maintainer defaults are desired. + Entries in this file can be any command line argument. + This file is prepended to any additional command line arguments. + Multiple lines and # comments are allowed. + Most options have both positive and negative forms. + The negative forms for --<foo> are --no<foo> and --no-<foo>. + +EOT +} + +sub top_of_kernel_tree { + my ($lk_path) = @_; + + if ($lk_path ne "" && substr($lk_path,length($lk_path)-1,1) ne "/") { + $lk_path .= "/"; + } + if ( (-f "${lk_path}COPYING") + && (-f "${lk_path}CREDITS") + && (-f "${lk_path}Kbuild") + && (-e "${lk_path}MAINTAINERS") + && (-f "${lk_path}Makefile") + && (-f "${lk_path}README") + && (-d "${lk_path}Documentation") + && (-d "${lk_path}arch") + && (-d "${lk_path}include") + && (-d "${lk_path}drivers") + && (-d "${lk_path}fs") + && (-d "${lk_path}init") + && (-d "${lk_path}ipc") + && (-d "${lk_path}kernel") + && (-d "${lk_path}lib") + && (-d "${lk_path}scripts")) { + return 1; + } + return 0; +} + +sub parse_email { + my ($formatted_email) = @_; + + my $name = ""; + my $address = ""; + + if ($formatted_email =~ /^([^<]+)<(.+\@.*)>.*$/) { + $name = $1; + $address = $2; + } elsif ($formatted_email =~ /^\s*<(.+\@\S*)>.*$/) { + $address = $1; + } elsif ($formatted_email =~ /^(.+\@\S*).*$/) { + $address = $1; + } + + $name =~ s/^\s+|\s+$//g; + $name =~ s/^\"|\"$//g; + $address =~ s/^\s+|\s+$//g; + + if ($name =~ /[^\w \-]/i) { ##has "must quote" chars + $name =~ s/(?<!\\)"/\\"/g; ##escape quotes + $name = "\"$name\""; + } + + return ($name, $address); +} + +sub format_email { + my ($name, $address, $usename) = @_; + + my $formatted_email; + + $name =~ s/^\s+|\s+$//g; + $name =~ s/^\"|\"$//g; + $address =~ s/^\s+|\s+$//g; + + if ($name =~ /[^\w \-]/i) { ##has "must quote" chars + $name =~ s/(?<!\\)"/\\"/g; ##escape quotes + $name = "\"$name\""; + } + + if ($usename) { + if ("$name" eq "") { + $formatted_email = "$address"; + } else { + $formatted_email = "$name <$address>"; + } + } else { + $formatted_email = $address; + } + + return $formatted_email; +} + +sub find_first_section { + my $index = 0; + + while ($index < @typevalue) { + my $tv = $typevalue[$index]; + if (($tv =~ m/^([A-Z]):\s*(.*)/)) { + last; + } + $index++; + } + + return $index; +} + +sub find_starting_index { + my ($index) = @_; + + while ($index > 0) { + my $tv = $typevalue[$index]; + if (!($tv =~ m/^([A-Z]):\s*(.*)/)) { + last; + } + $index--; + } + + return $index; +} + +sub find_ending_index { + my ($index) = @_; + + while ($index < @typevalue) { + my $tv = $typevalue[$index]; + if (!($tv =~ m/^([A-Z]):\s*(.*)/)) { + last; + } + $index++; + } + + return $index; +} + +sub get_subsystem_name { + my ($index) = @_; + + my $start = find_starting_index($index); + + my $subsystem = $typevalue[$start]; + if ($output_section_maxlen && length($subsystem) > $output_section_maxlen) { + $subsystem = substr($subsystem, 0, $output_section_maxlen - 3); + $subsystem =~ s/\s*$//; + $subsystem = $subsystem . "..."; + } + return $subsystem; +} + +sub get_maintainer_role { + my ($index) = @_; + + my $i; + my $start = find_starting_index($index); + my $end = find_ending_index($index); + + my $role = "unknown"; + my $subsystem = get_subsystem_name($index); + + for ($i = $start + 1; $i < $end; $i++) { + my $tv = $typevalue[$i]; + if ($tv =~ m/^([A-Z]):\s*(.*)/) { + my $ptype = $1; + my $pvalue = $2; + if ($ptype eq "S") { + $role = $pvalue; + } + } + } + + $role = lc($role); + if ($role eq "supported") { + $role = "supporter"; + } elsif ($role eq "maintained") { + $role = "maintainer"; + } elsif ($role eq "odd fixes") { + $role = "odd fixer"; + } elsif ($role eq "orphan") { + $role = "orphan minder"; + } elsif ($role eq "obsolete") { + $role = "obsolete minder"; + } elsif ($role eq "buried alive in reporters") { + $role = "chief penguin"; + } + + return $role . ":" . $subsystem; +} + +sub get_list_role { + my ($index) = @_; + + my $subsystem = get_subsystem_name($index); + + if ($subsystem eq "THE REST") { + $subsystem = ""; + } + + return $subsystem; +} + +sub add_categories { + my ($index) = @_; + + my $i; + my $start = find_starting_index($index); + my $end = find_ending_index($index); + + push(@subsystem, $typevalue[$start]); + + for ($i = $start + 1; $i < $end; $i++) { + my $tv = $typevalue[$i]; + if ($tv =~ m/^([A-Z]):\s*(.*)/) { + my $ptype = $1; + my $pvalue = $2; + if ($ptype eq "L") { + my $list_address = $pvalue; + my $list_additional = ""; + my $list_role = get_list_role($i); + + if ($list_role ne "") { + $list_role = ":" . $list_role; + } + if ($list_address =~ m/([^\s]+)\s+(.*)$/) { + $list_address = $1; + $list_additional = $2; + } + if ($list_additional =~ m/subscribers-only/) { + if ($email_subscriber_list) { + if (!$hash_list_to{lc($list_address)}) { + $hash_list_to{lc($list_address)} = 1; + push(@list_to, [$list_address, + "subscriber list${list_role}"]); + } + } + } else { + if ($email_list) { + if (!$hash_list_to{lc($list_address)}) { + if ($list_additional =~ m/moderated/) { + if ($email_moderated_list) { + $hash_list_to{lc($list_address)} = 1; + push(@list_to, [$list_address, + "moderated list${list_role}"]); + } + } else { + $hash_list_to{lc($list_address)} = 1; + push(@list_to, [$list_address, + "open list${list_role}"]); + } + } + } + } + } elsif ($ptype eq "M") { + if ($email_maintainer) { + my $role = get_maintainer_role($i); + push_email_addresses($pvalue, $role); + } + } elsif ($ptype eq "R") { + if ($email_reviewer) { + my $subsystem = get_subsystem_name($i); + push_email_addresses($pvalue, "reviewer:$subsystem"); + } + } elsif ($ptype eq "T") { + push(@scm, $pvalue); + } elsif ($ptype eq "W") { + push(@web, $pvalue); + } elsif ($ptype eq "S") { + push(@status, $pvalue); + } + } + } +} + +sub email_inuse { + my ($name, $address) = @_; + + return 1 if (($name eq "") && ($address eq "")); + return 1 if (($name ne "") && exists($email_hash_name{lc($name)})); + return 1 if (($address ne "") && exists($email_hash_address{lc($address)})); + + return 0; +} + +sub push_email_address { + my ($line, $role) = @_; + + my ($name, $address) = parse_email($line); + + if ($address eq "") { + return 0; + } + + if (!$email_remove_duplicates) { + push(@email_to, [format_email($name, $address, $email_usename), $role]); + } elsif (!email_inuse($name, $address)) { + push(@email_to, [format_email($name, $address, $email_usename), $role]); + $email_hash_name{lc($name)}++ if ($name ne ""); + $email_hash_address{lc($address)}++; + } + + return 1; +} + +sub push_email_addresses { + my ($address, $role) = @_; + + my @address_list = (); + + if (rfc822_valid($address)) { + push_email_address($address, $role); + } elsif (@address_list = rfc822_validlist($address)) { + my $array_count = shift(@address_list); + while (my $entry = shift(@address_list)) { + push_email_address($entry, $role); + } + } else { + if (!push_email_address($address, $role)) { + warn("Invalid MAINTAINERS address: '" . $address . "'\n"); + } + } +} + +sub add_role { + my ($line, $role) = @_; + + my ($name, $address) = parse_email($line); + my $email = format_email($name, $address, $email_usename); + + foreach my $entry (@email_to) { + if ($email_remove_duplicates) { + my ($entry_name, $entry_address) = parse_email($entry->[0]); + if (($name eq $entry_name || $address eq $entry_address) + && ($role eq "" || !($entry->[1] =~ m/$role/)) + ) { + if ($entry->[1] eq "") { + $entry->[1] = "$role"; + } else { + $entry->[1] = "$entry->[1],$role"; + } + } + } else { + if ($email eq $entry->[0] + && ($role eq "" || !($entry->[1] =~ m/$role/)) + ) { + if ($entry->[1] eq "") { + $entry->[1] = "$role"; + } else { + $entry->[1] = "$entry->[1],$role"; + } + } + } + } +} + +sub which { + my ($bin) = @_; + + foreach my $path (split(/:/, $ENV{PATH})) { + if (-e "$path/$bin") { + return "$path/$bin"; + } + } + + return ""; +} + +sub which_conf { + my ($conf) = @_; + + foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) { + if (-e "$path/$conf") { + return "$path/$conf"; + } + } + + return ""; +} + +sub mailmap_email { + my ($line) = @_; + + my ($name, $address) = parse_email($line); + my $email = format_email($name, $address, 1); + my $real_name = $name; + my $real_address = $address; + + if (exists $mailmap->{names}->{$email} || + exists $mailmap->{addresses}->{$email}) { + if (exists $mailmap->{names}->{$email}) { + $real_name = $mailmap->{names}->{$email}; + } + if (exists $mailmap->{addresses}->{$email}) { + $real_address = $mailmap->{addresses}->{$email}; + } + } else { + if (exists $mailmap->{names}->{$address}) { + $real_name = $mailmap->{names}->{$address}; + } + if (exists $mailmap->{addresses}->{$address}) { + $real_address = $mailmap->{addresses}->{$address}; + } + } + return format_email($real_name, $real_address, 1); +} + +sub mailmap { + my (@addresses) = @_; + + my @mapped_emails = (); + foreach my $line (@addresses) { + push(@mapped_emails, mailmap_email($line)); + } + merge_by_realname(@mapped_emails) if ($email_use_mailmap); + return @mapped_emails; +} + +sub merge_by_realname { + my %address_map; + my (@emails) = @_; + + foreach my $email (@emails) { + my ($name, $address) = parse_email($email); + if (exists $address_map{$name}) { + $address = $address_map{$name}; + $email = format_email($name, $address, 1); + } else { + $address_map{$name} = $address; + } + } +} + +sub git_execute_cmd { + my ($cmd) = @_; + my @lines = (); + + my $output = `$cmd`; + $output =~ s/^\s*//gm; + @lines = split("\n", $output); + + return @lines; +} + +sub hg_execute_cmd { + my ($cmd) = @_; + my @lines = (); + + my $output = `$cmd`; + @lines = split("\n", $output); + + return @lines; +} + +sub extract_formatted_signatures { + my (@signature_lines) = @_; + + my @type = @signature_lines; + + s/\s*(.*):.*/$1/ for (@type); + + # cut -f2- -d":" + s/\s*.*:\s*(.+)\s*/$1/ for (@signature_lines); + +## Reformat email addresses (with names) to avoid badly written signatures + + foreach my $signer (@signature_lines) { + $signer = deduplicate_email($signer); + } + + return (\@type, \@signature_lines); +} + +sub vcs_find_signers { + my ($cmd, $file) = @_; + my $commits; + my @lines = (); + my @signatures = (); + my @authors = (); + my @stats = (); + + @lines = &{$VCS_cmds{"execute_cmd"}}($cmd); + + my $pattern = $VCS_cmds{"commit_pattern"}; + my $author_pattern = $VCS_cmds{"author_pattern"}; + my $stat_pattern = $VCS_cmds{"stat_pattern"}; + + $stat_pattern =~ s/(\$\w+)/$1/eeg; #interpolate $stat_pattern + + $commits = grep(/$pattern/, @lines); # of commits + + @authors = grep(/$author_pattern/, @lines); + @signatures = grep(/^[ \t]*${signature_pattern}.*\@.*$/, @lines); + @stats = grep(/$stat_pattern/, @lines); + +# print("stats: <@stats>\n"); + + return (0, \@signatures, \@authors, \@stats) if !@signatures; + + save_commits_by_author(@lines) if ($interactive); + save_commits_by_signer(@lines) if ($interactive); + + if (!$email_git_penguin_chiefs) { + @signatures = grep(!/${penguin_chiefs}/i, @signatures); + } + + my ($author_ref, $authors_ref) = extract_formatted_signatures(@authors); + my ($types_ref, $signers_ref) = extract_formatted_signatures(@signatures); + + return ($commits, $signers_ref, $authors_ref, \@stats); +} + +sub vcs_find_author { + my ($cmd) = @_; + my @lines = (); + + @lines = &{$VCS_cmds{"execute_cmd"}}($cmd); + + if (!$email_git_penguin_chiefs) { + @lines = grep(!/${penguin_chiefs}/i, @lines); + } + + return @lines if !@lines; + + my @authors = (); + foreach my $line (@lines) { + if ($line =~ m/$VCS_cmds{"author_pattern"}/) { + my $author = $1; + my ($name, $address) = parse_email($author); + $author = format_email($name, $address, 1); + push(@authors, $author); + } + } + + save_commits_by_author(@lines) if ($interactive); + save_commits_by_signer(@lines) if ($interactive); + + return @authors; +} + +sub vcs_save_commits { + my ($cmd) = @_; + my @lines = (); + my @commits = (); + + @lines = &{$VCS_cmds{"execute_cmd"}}($cmd); + + foreach my $line (@lines) { + if ($line =~ m/$VCS_cmds{"blame_commit_pattern"}/) { + push(@commits, $1); + } + } + + return @commits; +} + +sub vcs_blame { + my ($file) = @_; + my $cmd; + my @commits = (); + + return @commits if (!(-f $file)); + + if (@range && $VCS_cmds{"blame_range_cmd"} eq "") { + my @all_commits = (); + + $cmd = $VCS_cmds{"blame_file_cmd"}; + $cmd =~ s/(\$\w+)/$1/eeg; #interpolate $cmd + @all_commits = vcs_save_commits($cmd); + + foreach my $file_range_diff (@range) { + next if (!($file_range_diff =~ m/(.+):(.+):(.+)/)); + my $diff_file = $1; + my $diff_start = $2; + my $diff_length = $3; + next if ("$file" ne "$diff_file"); + for (my $i = $diff_start; $i < $diff_start + $diff_length; $i++) { + push(@commits, $all_commits[$i]); + } + } + } elsif (@range) { + foreach my $file_range_diff (@range) { + next if (!($file_range_diff =~ m/(.+):(.+):(.+)/)); + my $diff_file = $1; + my $diff_start = $2; + my $diff_length = $3; + next if ("$file" ne "$diff_file"); + $cmd = $VCS_cmds{"blame_range_cmd"}; + $cmd =~ s/(\$\w+)/$1/eeg; #interpolate $cmd + push(@commits, vcs_save_commits($cmd)); + } + } else { + $cmd = $VCS_cmds{"blame_file_cmd"}; + $cmd =~ s/(\$\w+)/$1/eeg; #interpolate $cmd + @commits = vcs_save_commits($cmd); + } + + foreach my $commit (@commits) { + $commit =~ s/^\^//g; + } + + return @commits; +} + +my $printed_novcs = 0; +sub vcs_exists { + %VCS_cmds = %VCS_cmds_git; + return 1 if eval $VCS_cmds{"available"}; + %VCS_cmds = %VCS_cmds_hg; + return 2 if eval $VCS_cmds{"available"}; + %VCS_cmds = (); + if (!$printed_novcs) { + warn("$P: No supported VCS found. Add --nogit to options?\n"); + warn("Using a git repository produces better results.\n"); + warn("Try Linus Torvalds' latest git repository using:\n"); + warn("git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git\n"); + $printed_novcs = 1; + } + return 0; +} + +sub vcs_is_git { + vcs_exists(); + return $vcs_used == 1; +} + +sub vcs_is_hg { + return $vcs_used == 2; +} + +sub vcs_add_commit_signers { + return if (!vcs_exists()); + + my ($commit, $desc) = @_; + my $commit_count = 0; + my $commit_authors_ref; + my $commit_signers_ref; + my $stats_ref; + my @commit_authors = (); + my @commit_signers = (); + my $cmd; + + $cmd = $VCS_cmds{"find_commit_signers_cmd"}; + $cmd =~ s/(\$\w+)/$1/eeg; #substitute variables in $cmd + + ($commit_count, $commit_signers_ref, $commit_authors_ref, $stats_ref) = vcs_find_signers($cmd, ""); + @commit_authors = @{$commit_authors_ref} if defined $commit_authors_ref; + @commit_signers = @{$commit_signers_ref} if defined $commit_signers_ref; + + foreach my $signer (@commit_signers) { + $signer = deduplicate_email($signer); + } + + vcs_assign($desc, 1, @commit_signers); +} + +sub interactive_get_maintainers { + my ($list_ref) = @_; + my @list = @$list_ref; + + vcs_exists(); + + my %selected; + my %authored; + my %signed; + my $count = 0; + my $maintained = 0; + foreach my $entry (@list) { + $maintained = 1 if ($entry->[1] =~ /^(maintainer|supporter)/i); + $selected{$count} = 1; + $authored{$count} = 0; + $signed{$count} = 0; + $count++; + } + + #menu loop + my $done = 0; + my $print_options = 0; + my $redraw = 1; + while (!$done) { + $count = 0; + if ($redraw) { + printf STDERR "\n%1s %2s %-65s", + "*", "#", "email/list and role:stats"; + if ($email_git || + ($email_git_fallback && !$maintained) || + $email_git_blame) { + print STDERR "auth sign"; + } + print STDERR "\n"; + foreach my $entry (@list) { + my $email = $entry->[0]; + my $role = $entry->[1]; + my $sel = ""; + $sel = "*" if ($selected{$count}); + my $commit_author = $commit_author_hash{$email}; + my $commit_signer = $commit_signer_hash{$email}; + my $authored = 0; + my $signed = 0; + $authored++ for (@{$commit_author}); + $signed++ for (@{$commit_signer}); + printf STDERR "%1s %2d %-65s", $sel, $count + 1, $email; + printf STDERR "%4d %4d", $authored, $signed + if ($authored > 0 || $signed > 0); + printf STDERR "\n %s\n", $role; + if ($authored{$count}) { + my $commit_author = $commit_author_hash{$email}; + foreach my $ref (@{$commit_author}) { + print STDERR " Author: @{$ref}[1]\n"; + } + } + if ($signed{$count}) { + my $commit_signer = $commit_signer_hash{$email}; + foreach my $ref (@{$commit_signer}) { + print STDERR " @{$ref}[2]: @{$ref}[1]\n"; + } + } + + $count++; + } + } + my $date_ref = \$email_git_since; + $date_ref = \$email_hg_since if (vcs_is_hg()); + if ($print_options) { + $print_options = 0; + if (vcs_exists()) { + print STDERR <<EOT + +Version Control options: +g use git history [$email_git] +gf use git-fallback [$email_git_fallback] +b use git blame [$email_git_blame] +bs use blame signatures [$email_git_blame_signatures] +c# minimum commits [$email_git_min_signatures] +%# min percent [$email_git_min_percent] +d# history to use [$$date_ref] +x# max maintainers [$email_git_max_maintainers] +t all signature types [$email_git_all_signature_types] +m use .mailmap [$email_use_mailmap] +EOT + } + print STDERR <<EOT + +Additional options: +0 toggle all +tm toggle maintainers +tg toggle git entries +tl toggle open list entries +ts toggle subscriber list entries +f emails in file [$email_file_emails] +k keywords in file [$keywords] +r remove duplicates [$email_remove_duplicates] +p# pattern match depth [$pattern_depth] +EOT + } + print STDERR +"\n#(toggle), A#(author), S#(signed) *(all), ^(none), O(options), Y(approve): "; + + my $input = <STDIN>; + chomp($input); + + $redraw = 1; + my $rerun = 0; + my @wish = split(/[, ]+/, $input); + foreach my $nr (@wish) { + $nr = lc($nr); + my $sel = substr($nr, 0, 1); + my $str = substr($nr, 1); + my $val = 0; + $val = $1 if $str =~ /^(\d+)$/; + + if ($sel eq "y") { + $interactive = 0; + $done = 1; + $output_rolestats = 0; + $output_roles = 0; + last; + } elsif ($nr =~ /^\d+$/ && $nr > 0 && $nr <= $count) { + $selected{$nr - 1} = !$selected{$nr - 1}; + } elsif ($sel eq "*" || $sel eq '^') { + my $toggle = 0; + $toggle = 1 if ($sel eq '*'); + for (my $i = 0; $i < $count; $i++) { + $selected{$i} = $toggle; + } + } elsif ($sel eq "0") { + for (my $i = 0; $i < $count; $i++) { + $selected{$i} = !$selected{$i}; + } + } elsif ($sel eq "t") { + if (lc($str) eq "m") { + for (my $i = 0; $i < $count; $i++) { + $selected{$i} = !$selected{$i} + if ($list[$i]->[1] =~ /^(maintainer|supporter)/i); + } + } elsif (lc($str) eq "g") { + for (my $i = 0; $i < $count; $i++) { + $selected{$i} = !$selected{$i} + if ($list[$i]->[1] =~ /^(author|commit|signer)/i); + } + } elsif (lc($str) eq "l") { + for (my $i = 0; $i < $count; $i++) { + $selected{$i} = !$selected{$i} + if ($list[$i]->[1] =~ /^(open list)/i); + } + } elsif (lc($str) eq "s") { + for (my $i = 0; $i < $count; $i++) { + $selected{$i} = !$selected{$i} + if ($list[$i]->[1] =~ /^(subscriber list)/i); + } + } + } elsif ($sel eq "a") { + if ($val > 0 && $val <= $count) { + $authored{$val - 1} = !$authored{$val - 1}; + } elsif ($str eq '*' || $str eq '^') { + my $toggle = 0; + $toggle = 1 if ($str eq '*'); + for (my $i = 0; $i < $count; $i++) { + $authored{$i} = $toggle; + } + } + } elsif ($sel eq "s") { + if ($val > 0 && $val <= $count) { + $signed{$val - 1} = !$signed{$val - 1}; + } elsif ($str eq '*' || $str eq '^') { + my $toggle = 0; + $toggle = 1 if ($str eq '*'); + for (my $i = 0; $i < $count; $i++) { + $signed{$i} = $toggle; + } + } + } elsif ($sel eq "o") { + $print_options = 1; + $redraw = 1; + } elsif ($sel eq "g") { + if ($str eq "f") { + bool_invert(\$email_git_fallback); + } else { + bool_invert(\$email_git); + } + $rerun = 1; + } elsif ($sel eq "b") { + if ($str eq "s") { + bool_invert(\$email_git_blame_signatures); + } else { + bool_invert(\$email_git_blame); + } + $rerun = 1; + } elsif ($sel eq "c") { + if ($val > 0) { + $email_git_min_signatures = $val; + $rerun = 1; + } + } elsif ($sel eq "x") { + if ($val > 0) { + $email_git_max_maintainers = $val; + $rerun = 1; + } + } elsif ($sel eq "%") { + if ($str ne "" && $val >= 0) { + $email_git_min_percent = $val; + $rerun = 1; + } + } elsif ($sel eq "d") { + if (vcs_is_git()) { + $email_git_since = $str; + } elsif (vcs_is_hg()) { + $email_hg_since = $str; + } + $rerun = 1; + } elsif ($sel eq "t") { + bool_invert(\$email_git_all_signature_types); + $rerun = 1; + } elsif ($sel eq "f") { + bool_invert(\$email_file_emails); + $rerun = 1; + } elsif ($sel eq "r") { + bool_invert(\$email_remove_duplicates); + $rerun = 1; + } elsif ($sel eq "m") { + bool_invert(\$email_use_mailmap); + read_mailmap(); + $rerun = 1; + } elsif ($sel eq "k") { + bool_invert(\$keywords); + $rerun = 1; + } elsif ($sel eq "p") { + if ($str ne "" && $val >= 0) { + $pattern_depth = $val; + $rerun = 1; + } + } elsif ($sel eq "h" || $sel eq "?") { + print STDERR <<EOT + +Interactive mode allows you to select the various maintainers, submitters, +commit signers and mailing lists that could be CC'd on a patch. + +Any *'d entry is selected. + +If you have git or hg installed, you can choose to summarize the commit +history of files in the patch. Also, each line of the current file can +be matched to its commit author and that commits signers with blame. + +Various knobs exist to control the length of time for active commit +tracking, the maximum number of commit authors and signers to add, +and such. + +Enter selections at the prompt until you are satisfied that the selected +maintainers are appropriate. You may enter multiple selections separated +by either commas or spaces. + +EOT + } else { + print STDERR "invalid option: '$nr'\n"; + $redraw = 0; + } + } + if ($rerun) { + print STDERR "git-blame can be very slow, please have patience..." + if ($email_git_blame); + goto &get_maintainers; + } + } + + #drop not selected entries + $count = 0; + my @new_emailto = (); + foreach my $entry (@list) { + if ($selected{$count}) { + push(@new_emailto, $list[$count]); + } + $count++; + } + return @new_emailto; +} + +sub bool_invert { + my ($bool_ref) = @_; + + if ($$bool_ref) { + $$bool_ref = 0; + } else { + $$bool_ref = 1; + } +} + +sub deduplicate_email { + my ($email) = @_; + + my $matched = 0; + my ($name, $address) = parse_email($email); + $email = format_email($name, $address, 1); + $email = mailmap_email($email); + + return $email if (!$email_remove_duplicates); + + ($name, $address) = parse_email($email); + + if ($name ne "" && $deduplicate_name_hash{lc($name)}) { + $name = $deduplicate_name_hash{lc($name)}->[0]; + $address = $deduplicate_name_hash{lc($name)}->[1]; + $matched = 1; + } elsif ($deduplicate_address_hash{lc($address)}) { + $name = $deduplicate_address_hash{lc($address)}->[0]; + $address = $deduplicate_address_hash{lc($address)}->[1]; + $matched = 1; + } + if (!$matched) { + $deduplicate_name_hash{lc($name)} = [ $name, $address ]; + $deduplicate_address_hash{lc($address)} = [ $name, $address ]; + } + $email = format_email($name, $address, 1); + $email = mailmap_email($email); + return $email; +} + +sub save_commits_by_author { + my (@lines) = @_; + + my @authors = (); + my @commits = (); + my @subjects = (); + + foreach my $line (@lines) { + if ($line =~ m/$VCS_cmds{"author_pattern"}/) { + my $author = $1; + $author = deduplicate_email($author); + push(@authors, $author); + } + push(@commits, $1) if ($line =~ m/$VCS_cmds{"commit_pattern"}/); + push(@subjects, $1) if ($line =~ m/$VCS_cmds{"subject_pattern"}/); + } + + for (my $i = 0; $i < @authors; $i++) { + my $exists = 0; + foreach my $ref(@{$commit_author_hash{$authors[$i]}}) { + if (@{$ref}[0] eq $commits[$i] && + @{$ref}[1] eq $subjects[$i]) { + $exists = 1; + last; + } + } + if (!$exists) { + push(@{$commit_author_hash{$authors[$i]}}, + [ ($commits[$i], $subjects[$i]) ]); + } + } +} + +sub save_commits_by_signer { + my (@lines) = @_; + + my $commit = ""; + my $subject = ""; + + foreach my $line (@lines) { + $commit = $1 if ($line =~ m/$VCS_cmds{"commit_pattern"}/); + $subject = $1 if ($line =~ m/$VCS_cmds{"subject_pattern"}/); + if ($line =~ /^[ \t]*${signature_pattern}.*\@.*$/) { + my @signatures = ($line); + my ($types_ref, $signers_ref) = extract_formatted_signatures(@signatures); + my @types = @$types_ref; + my @signers = @$signers_ref; + + my $type = $types[0]; + my $signer = $signers[0]; + + $signer = deduplicate_email($signer); + + my $exists = 0; + foreach my $ref(@{$commit_signer_hash{$signer}}) { + if (@{$ref}[0] eq $commit && + @{$ref}[1] eq $subject && + @{$ref}[2] eq $type) { + $exists = 1; + last; + } + } + if (!$exists) { + push(@{$commit_signer_hash{$signer}}, + [ ($commit, $subject, $type) ]); + } + } + } +} + +sub vcs_assign { + my ($role, $divisor, @lines) = @_; + + my %hash; + my $count = 0; + + return if (@lines <= 0); + + if ($divisor <= 0) { + warn("Bad divisor in " . (caller(0))[3] . ": $divisor\n"); + $divisor = 1; + } + + @lines = mailmap(@lines); + + return if (@lines <= 0); + + @lines = sort(@lines); + + # uniq -c + $hash{$_}++ for @lines; + + # sort -rn + foreach my $line (sort {$hash{$b} <=> $hash{$a}} keys %hash) { + my $sign_offs = $hash{$line}; + my $percent = $sign_offs * 100 / $divisor; + + $percent = 100 if ($percent > 100); + next if (ignore_email_address($line)); + $count++; + last if ($sign_offs < $email_git_min_signatures || + $count > $email_git_max_maintainers || + $percent < $email_git_min_percent); + push_email_address($line, ''); + if ($output_rolestats) { + my $fmt_percent = sprintf("%.0f", $percent); + add_role($line, "$role:$sign_offs/$divisor=$fmt_percent%"); + } else { + add_role($line, $role); + } + } +} + +sub vcs_file_signoffs { + my ($file) = @_; + + my $authors_ref; + my $signers_ref; + my $stats_ref; + my @authors = (); + my @signers = (); + my @stats = (); + my $commits; + + $vcs_used = vcs_exists(); + return if (!$vcs_used); + + my $cmd = $VCS_cmds{"find_signers_cmd"}; + $cmd =~ s/(\$\w+)/$1/eeg; # interpolate $cmd + + ($commits, $signers_ref, $authors_ref, $stats_ref) = vcs_find_signers($cmd, $file); + + @signers = @{$signers_ref} if defined $signers_ref; + @authors = @{$authors_ref} if defined $authors_ref; + @stats = @{$stats_ref} if defined $stats_ref; + +# print("commits: <$commits>\nsigners:<@signers>\nauthors: <@authors>\nstats: <@stats>\n"); + + foreach my $signer (@signers) { + $signer = deduplicate_email($signer); + } + + vcs_assign("commit_signer", $commits, @signers); + vcs_assign("authored", $commits, @authors); + if ($#authors == $#stats) { + my $stat_pattern = $VCS_cmds{"stat_pattern"}; + $stat_pattern =~ s/(\$\w+)/$1/eeg; #interpolate $stat_pattern + + my $added = 0; + my $deleted = 0; + for (my $i = 0; $i <= $#stats; $i++) { + if ($stats[$i] =~ /$stat_pattern/) { + $added += $1; + $deleted += $2; + } + } + my @tmp_authors = uniq(@authors); + foreach my $author (@tmp_authors) { + $author = deduplicate_email($author); + } + @tmp_authors = uniq(@tmp_authors); + my @list_added = (); + my @list_deleted = (); + foreach my $author (@tmp_authors) { + my $auth_added = 0; + my $auth_deleted = 0; + for (my $i = 0; $i <= $#stats; $i++) { + if ($author eq deduplicate_email($authors[$i]) && + $stats[$i] =~ /$stat_pattern/) { + $auth_added += $1; + $auth_deleted += $2; + } + } + for (my $i = 0; $i < $auth_added; $i++) { + push(@list_added, $author); + } + for (my $i = 0; $i < $auth_deleted; $i++) { + push(@list_deleted, $author); + } + } + vcs_assign("added_lines", $added, @list_added); + vcs_assign("removed_lines", $deleted, @list_deleted); + } +} + +sub vcs_file_blame { + my ($file) = @_; + + my @signers = (); + my @all_commits = (); + my @commits = (); + my $total_commits; + my $total_lines; + + $vcs_used = vcs_exists(); + return if (!$vcs_used); + + @all_commits = vcs_blame($file); + @commits = uniq(@all_commits); + $total_commits = @commits; + $total_lines = @all_commits; + + if ($email_git_blame_signatures) { + if (vcs_is_hg()) { + my $commit_count; + my $commit_authors_ref; + my $commit_signers_ref; + my $stats_ref; + my @commit_authors = (); + my @commit_signers = (); + my $commit = join(" -r ", @commits); + my $cmd; + + $cmd = $VCS_cmds{"find_commit_signers_cmd"}; + $cmd =~ s/(\$\w+)/$1/eeg; #substitute variables in $cmd + + ($commit_count, $commit_signers_ref, $commit_authors_ref, $stats_ref) = vcs_find_signers($cmd, $file); + @commit_authors = @{$commit_authors_ref} if defined $commit_authors_ref; + @commit_signers = @{$commit_signers_ref} if defined $commit_signers_ref; + + push(@signers, @commit_signers); + } else { + foreach my $commit (@commits) { + my $commit_count; + my $commit_authors_ref; + my $commit_signers_ref; + my $stats_ref; + my @commit_authors = (); + my @commit_signers = (); + my $cmd; + + $cmd = $VCS_cmds{"find_commit_signers_cmd"}; + $cmd =~ s/(\$\w+)/$1/eeg; #substitute variables in $cmd + + ($commit_count, $commit_signers_ref, $commit_authors_ref, $stats_ref) = vcs_find_signers($cmd, $file); + @commit_authors = @{$commit_authors_ref} if defined $commit_authors_ref; + @commit_signers = @{$commit_signers_ref} if defined $commit_signers_ref; + + push(@signers, @commit_signers); + } + } + } + + if ($from_filename) { + if ($output_rolestats) { + my @blame_signers; + if (vcs_is_hg()) {{ # Double brace for last exit + my $commit_count; + my @commit_signers = (); + @commits = uniq(@commits); + @commits = sort(@commits); + my $commit = join(" -r ", @commits); + my $cmd; + + $cmd = $VCS_cmds{"find_commit_author_cmd"}; + $cmd =~ s/(\$\w+)/$1/eeg; #substitute variables in $cmd + + my @lines = (); + + @lines = &{$VCS_cmds{"execute_cmd"}}($cmd); + + if (!$email_git_penguin_chiefs) { + @lines = grep(!/${penguin_chiefs}/i, @lines); + } + + last if !@lines; + + my @authors = (); + foreach my $line (@lines) { + if ($line =~ m/$VCS_cmds{"author_pattern"}/) { + my $author = $1; + $author = deduplicate_email($author); + push(@authors, $author); + } + } + + save_commits_by_author(@lines) if ($interactive); + save_commits_by_signer(@lines) if ($interactive); + + push(@signers, @authors); + }} + else { + foreach my $commit (@commits) { + my $i; + my $cmd = $VCS_cmds{"find_commit_author_cmd"}; + $cmd =~ s/(\$\w+)/$1/eeg; #interpolate $cmd + my @author = vcs_find_author($cmd); + next if !@author; + + my $formatted_author = deduplicate_email($author[0]); + + my $count = grep(/$commit/, @all_commits); + for ($i = 0; $i < $count ; $i++) { + push(@blame_signers, $formatted_author); + } + } + } + if (@blame_signers) { + vcs_assign("authored lines", $total_lines, @blame_signers); + } + } + foreach my $signer (@signers) { + $signer = deduplicate_email($signer); + } + vcs_assign("commits", $total_commits, @signers); + } else { + foreach my $signer (@signers) { + $signer = deduplicate_email($signer); + } + vcs_assign("modified commits", $total_commits, @signers); + } +} + +sub vcs_file_exists { + my ($file) = @_; + + my $exists; + + my $vcs_used = vcs_exists(); + return 0 if (!$vcs_used); + + my $cmd = $VCS_cmds{"file_exists_cmd"}; + $cmd =~ s/(\$\w+)/$1/eeg; # interpolate $cmd + $cmd .= " 2>&1"; + $exists = &{$VCS_cmds{"execute_cmd"}}($cmd); + + return 0 if ($? != 0); + + return $exists; +} + +sub vcs_list_files { + my ($file) = @_; + + my @lsfiles = (); + + my $vcs_used = vcs_exists(); + return 0 if (!$vcs_used); + + my $cmd = $VCS_cmds{"list_files_cmd"}; + $cmd =~ s/(\$\w+)/$1/eeg; # interpolate $cmd + @lsfiles = &{$VCS_cmds{"execute_cmd"}}($cmd); + + return () if ($? != 0); + + return @lsfiles; +} + +sub uniq { + my (@parms) = @_; + + my %saw; + @parms = grep(!$saw{$_}++, @parms); + return @parms; +} + +sub sort_and_uniq { + my (@parms) = @_; + + my %saw; + @parms = sort @parms; + @parms = grep(!$saw{$_}++, @parms); + return @parms; +} + +sub clean_file_emails { + my (@file_emails) = @_; + my @fmt_emails = (); + + foreach my $email (@file_emails) { + $email =~ s/[\(\<\{]{0,1}([A-Za-z0-9_\.\+-]+\@[A-Za-z0-9\.-]+)[\)\>\}]{0,1}/\<$1\>/g; + my ($name, $address) = parse_email($email); + if ($name eq '"[,\.]"') { + $name = ""; + } + + my @nw = split(/[^A-Za-zÀ-ÿ\'\,\.\+-]/, $name); + if (@nw > 2) { + my $first = $nw[@nw - 3]; + my $middle = $nw[@nw - 2]; + my $last = $nw[@nw - 1]; + + if (((length($first) == 1 && $first =~ m/[A-Za-z]/) || + (length($first) == 2 && substr($first, -1) eq ".")) || + (length($middle) == 1 || + (length($middle) == 2 && substr($middle, -1) eq "."))) { + $name = "$first $middle $last"; + } else { + $name = "$middle $last"; + } + } + + if (substr($name, -1) =~ /[,\.]/) { + $name = substr($name, 0, length($name) - 1); + } elsif (substr($name, -2) =~ /[,\.]"/) { + $name = substr($name, 0, length($name) - 2) . '"'; + } + + if (substr($name, 0, 1) =~ /[,\.]/) { + $name = substr($name, 1, length($name) - 1); + } elsif (substr($name, 0, 2) =~ /"[,\.]/) { + $name = '"' . substr($name, 2, length($name) - 2); + } + + my $fmt_email = format_email($name, $address, $email_usename); + push(@fmt_emails, $fmt_email); + } + return @fmt_emails; +} + +sub merge_email { + my @lines; + my %saw; + + for (@_) { + my ($address, $role) = @$_; + if (!$saw{$address}) { + if ($output_roles) { + push(@lines, "$address ($role)"); + } else { + push(@lines, $address); + } + $saw{$address} = 1; + } + } + + return @lines; +} + +sub output { + my (@parms) = @_; + + if ($output_multiline) { + foreach my $line (@parms) { + print("${line}\n"); + } + } else { + print(join($output_separator, @parms)); + print("\n"); + } +} + +my $rfc822re; + +sub make_rfc822re { +# Basic lexical tokens are specials, domain_literal, quoted_string, atom, and +# comment. We must allow for rfc822_lwsp (or comments) after each of these. +# This regexp will only work on addresses which have had comments stripped +# and replaced with rfc822_lwsp. + + my $specials = '()<>@,;:\\\\".\\[\\]'; + my $controls = '\\000-\\037\\177'; + + my $dtext = "[^\\[\\]\\r\\\\]"; + my $domain_literal = "\\[(?:$dtext|\\\\.)*\\]$rfc822_lwsp*"; + + my $quoted_string = "\"(?:[^\\\"\\r\\\\]|\\\\.|$rfc822_lwsp)*\"$rfc822_lwsp*"; + +# Use zero-width assertion to spot the limit of an atom. A simple +# $rfc822_lwsp* causes the regexp engine to hang occasionally. + my $atom = "[^$specials $controls]+(?:$rfc822_lwsp+|\\Z|(?=[\\[\"$specials]))"; + my $word = "(?:$atom|$quoted_string)"; + my $localpart = "$word(?:\\.$rfc822_lwsp*$word)*"; + + my $sub_domain = "(?:$atom|$domain_literal)"; + my $domain = "$sub_domain(?:\\.$rfc822_lwsp*$sub_domain)*"; + + my $addr_spec = "$localpart\@$rfc822_lwsp*$domain"; + + my $phrase = "$word*"; + my $route = "(?:\@$domain(?:,\@$rfc822_lwsp*$domain)*:$rfc822_lwsp*)"; + my $route_addr = "\\<$rfc822_lwsp*$route?$addr_spec\\>$rfc822_lwsp*"; + my $mailbox = "(?:$addr_spec|$phrase$route_addr)"; + + my $group = "$phrase:$rfc822_lwsp*(?:$mailbox(?:,\\s*$mailbox)*)?;\\s*"; + my $address = "(?:$mailbox|$group)"; + + return "$rfc822_lwsp*$address"; +} + +sub rfc822_strip_comments { + my $s = shift; +# Recursively remove comments, and replace with a single space. The simpler +# regexps in the Email Addressing FAQ are imperfect - they will miss escaped +# chars in atoms, for example. + + while ($s =~ s/^((?:[^"\\]|\\.)* + (?:"(?:[^"\\]|\\.)*"(?:[^"\\]|\\.)*)*) + \((?:[^()\\]|\\.)*\)/$1 /osx) {} + return $s; +} + +# valid: returns true if the parameter is an RFC822 valid address +# +sub rfc822_valid { + my $s = rfc822_strip_comments(shift); + + if (!$rfc822re) { + $rfc822re = make_rfc822re(); + } + + return $s =~ m/^$rfc822re$/so && $s =~ m/^$rfc822_char*$/; +} + +# validlist: In scalar context, returns true if the parameter is an RFC822 +# valid list of addresses. +# +# In list context, returns an empty list on failure (an invalid +# address was found); otherwise a list whose first element is the +# number of addresses found and whose remaining elements are the +# addresses. This is needed to disambiguate failure (invalid) +# from success with no addresses found, because an empty string is +# a valid list. + +sub rfc822_validlist { + my $s = rfc822_strip_comments(shift); + + if (!$rfc822re) { + $rfc822re = make_rfc822re(); + } + # * null list items are valid according to the RFC + # * the '1' business is to aid in distinguishing failure from no results + + my @r; + if ($s =~ m/^(?:$rfc822re)?(?:,(?:$rfc822re)?)*$/so && + $s =~ m/^$rfc822_char*$/) { + while ($s =~ m/(?:^|,$rfc822_lwsp*)($rfc822re)/gos) { + push(@r, $1); + } + return wantarray ? (scalar(@r), @r) : 1; + } + return wantarray ? () : 0; +} diff --git a/src/net/scripts/gfp-translate b/src/net/scripts/gfp-translate new file mode 100755 index 0000000..b2ce416 --- /dev/null +++ b/src/net/scripts/gfp-translate @@ -0,0 +1,86 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0-only +# Translate the bits making up a GFP mask +# (c) 2009, Mel Gorman <mel@csn.ul.ie> +SOURCE= +GFPMASK=none + +# Helper function to report failures and exit +die() { + echo ERROR: $@ + if [ "$TMPFILE" != "" ]; then + rm -f $TMPFILE + fi + exit -1 +} + +usage() { + echo "usage: gfp-translate [-h] [ --source DIRECTORY ] gfpmask" + exit 0 +} + +# Parse command-line arguments +while [ $# -gt 0 ]; do + case $1 in + --source) + SOURCE=$2 + shift 2 + ;; + -h) + usage + ;; + --help) + usage + ;; + *) + GFPMASK=$1 + shift + ;; + esac +done + +# Guess the kernel source directory if it's not set. Preference is in order of +# o current directory +# o /usr/src/linux +if [ "$SOURCE" = "" ]; then + if [ -r "/usr/src/linux/Makefile" ]; then + SOURCE=/usr/src/linux + fi + if [ -r "`pwd`/Makefile" ]; then + SOURCE=`pwd` + fi +fi + +# Confirm that a source directory exists +if [ ! -r "$SOURCE/Makefile" ]; then + die "Could not locate kernel source directory or it is invalid" +fi + +# Confirm that a GFP mask has been specified +if [ "$GFPMASK" = "none" ]; then + usage +fi + +# Extract GFP flags from the kernel source +TMPFILE=`mktemp -t gfptranslate-XXXXXX` || exit 1 +grep -q ___GFP $SOURCE/include/linux/gfp.h +if [ $? -eq 0 ]; then + grep "^#define ___GFP" $SOURCE/include/linux/gfp.h | sed -e 's/u$//' | grep -v GFP_BITS > $TMPFILE +else + grep "^#define __GFP" $SOURCE/include/linux/gfp.h | sed -e 's/(__force gfp_t)//' | sed -e 's/u)/)/' | grep -v GFP_BITS | sed -e 's/)\//) \//' > $TMPFILE +fi + +# Parse the flags +IFS=" +" +echo Source: $SOURCE +echo Parsing: $GFPMASK +for LINE in `cat $TMPFILE`; do + MASK=`echo $LINE | awk '{print $3}'` + if [ $(($GFPMASK&$MASK)) -ne 0 ]; then + echo $LINE + fi +done + +rm -f $TMPFILE +exit 0 diff --git a/src/net/scripts/headerdep.pl b/src/net/scripts/headerdep.pl new file mode 100755 index 0000000..ebfcbef --- /dev/null +++ b/src/net/scripts/headerdep.pl @@ -0,0 +1,193 @@ +#! /usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0 +# +# Detect cycles in the header file dependency graph +# Vegard Nossum <vegardno@ifi.uio.no> +# + +use strict; +use warnings; + +use Getopt::Long; + +my $opt_all; +my @opt_include; +my $opt_graph; + +&Getopt::Long::Configure(qw(bundling pass_through)); +&GetOptions( + help => \&help, + version => \&version, + + all => \$opt_all, + "I=s" => \@opt_include, + graph => \$opt_graph, +); + +push @opt_include, 'include'; +my %deps = (); +my %linenos = (); + +my @headers = grep { strip($_) } @ARGV; + +parse_all(@headers); + +if($opt_graph) { + graph(); +} else { + detect_cycles(@headers); +} + + +sub help { + print "Usage: $0 [options] file...\n"; + print "\n"; + print "Options:\n"; + print " --all\n"; + print " --graph\n"; + print "\n"; + print " -I includedir\n"; + print "\n"; + print "To make nice graphs, try:\n"; + print " $0 --graph include/linux/kernel.h | dot -Tpng -o graph.png\n"; + exit; +} + +sub version { + print "headerdep version 2\n"; + exit; +} + +# Get a file name that is relative to our include paths +sub strip { + my $filename = shift; + + for my $i (@opt_include) { + my $stripped = $filename; + $stripped =~ s/^$i\///; + + return $stripped if $stripped ne $filename; + } + + return $filename; +} + +# Search for the file name in the list of include paths +sub search { + my $filename = shift; + return $filename if -f $filename; + + for my $i (@opt_include) { + my $path = "$i/$filename"; + return $path if -f $path; + } + return; +} + +sub parse_all { + # Parse all the headers. + my @queue = @_; + while(@queue) { + my $header = pop @queue; + next if exists $deps{$header}; + + $deps{$header} = [] unless exists $deps{$header}; + + my $path = search($header); + next unless $path; + + open(my $file, '<', $path) or die($!); + chomp(my @lines = <$file>); + close($file); + + for my $i (0 .. $#lines) { + my $line = $lines[$i]; + if(my($dep) = ($line =~ m/^#\s*include\s*<(.*?)>/)) { + push @queue, $dep; + push @{$deps{$header}}, [$i + 1, $dep]; + } + } + } +} + +sub print_cycle { + # $cycle[n] includes $cycle[n + 1]; + # $cycle[-1] will be the culprit + my $cycle = shift; + + # Adjust the line numbers + for my $i (0 .. $#$cycle - 1) { + $cycle->[$i]->[0] = $cycle->[$i + 1]->[0]; + } + $cycle->[-1]->[0] = 0; + + my $first = shift @$cycle; + my $last = pop @$cycle; + + my $msg = "In file included"; + printf "%s from %s,\n", $msg, $last->[1] if defined $last; + + for my $header (reverse @$cycle) { + printf "%s from %s:%d%s\n", + " " x length $msg, + $header->[1], $header->[0], + $header->[1] eq $last->[1] ? ' <-- here' : ''; + } + + printf "%s:%d: warning: recursive header inclusion\n", + $first->[1], $first->[0]; +} + +# Find and print the smallest cycle starting in the specified node. +sub detect_cycles { + my @queue = map { [[0, $_]] } @_; + while(@queue) { + my $top = pop @queue; + my $name = $top->[-1]->[1]; + + for my $dep (@{$deps{$name}}) { + my $chain = [@$top, [$dep->[0], $dep->[1]]]; + + # If the dep already exists in the chain, we have a + # cycle... + if(grep { $_->[1] eq $dep->[1] } @$top) { + print_cycle($chain); + next if $opt_all; + return; + } + + push @queue, $chain; + } + } +} + +sub mangle { + $_ = shift; + s/\//__/g; + s/\./_/g; + s/-/_/g; + $_; +} + +# Output dependency graph in GraphViz language. +sub graph { + print "digraph {\n"; + + print "\t/* vertices */\n"; + for my $header (keys %deps) { + printf "\t%s [label=\"%s\"];\n", + mangle($header), $header; + } + + print "\n"; + + print "\t/* edges */\n"; + for my $header (keys %deps) { + for my $dep (@{$deps{$header}}) { + printf "\t%s -> %s;\n", + mangle($header), mangle($dep->[1]); + } + } + + print "}\n"; +} diff --git a/src/net/scripts/headers_check.pl b/src/net/scripts/headers_check.pl new file mode 100755 index 0000000..b6aec5e --- /dev/null +++ b/src/net/scripts/headers_check.pl @@ -0,0 +1,171 @@ +#!/usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0 +# +# headers_check.pl execute a number of trivial consistency checks +# +# Usage: headers_check.pl dir arch [files...] +# dir: dir to look for included files +# arch: architecture +# files: list of files to check +# +# The script reads the supplied files line by line and: +# +# 1) for each include statement it checks if the +# included file actually exists. +# Only include files located in asm* and linux* are checked. +# The rest are assumed to be system include files. +# +# 2) It is checked that prototypes does not use "extern" +# +# 3) Check for leaked CONFIG_ symbols + +use warnings; +use strict; +use File::Basename; + +my ($dir, $arch, @files) = @ARGV; + +my $ret = 0; +my $line; +my $lineno = 0; +my $filename; + +foreach my $file (@files) { + $filename = $file; + + open(my $fh, '<', $filename) + or die "$filename: $!\n"; + $lineno = 0; + while ($line = <$fh>) { + $lineno++; + &check_include(); + &check_asm_types(); + &check_sizetypes(); + &check_declarations(); + # Dropped for now. Too much noise &check_config(); + } + close $fh; +} +exit $ret; + +sub check_include +{ + if ($line =~ m/^\s*#\s*include\s+<((asm|linux).*)>/) { + my $inc = $1; + my $found; + $found = stat($dir . "/" . $inc); + if (!$found) { + $inc =~ s#asm/#asm-$arch/#; + $found = stat($dir . "/" . $inc); + } + if (!$found) { + printf STDERR "$filename:$lineno: included file '$inc' is not exported\n"; + $ret = 1; + } + } +} + +sub check_declarations +{ + # soundcard.h is what it is + if ($line =~ m/^void seqbuf_dump\(void\);/) { + return; + } + # drm headers are being C++ friendly + if ($line =~ m/^extern "C"/) { + return; + } + if ($line =~ m/^(\s*extern|unsigned|char|short|int|long|void)\b/) { + printf STDERR "$filename:$lineno: " . + "userspace cannot reference function or " . + "variable defined in the kernel\n"; + } +} + +sub check_config +{ + if ($line =~ m/[^a-zA-Z0-9_]+CONFIG_([a-zA-Z0-9_]+)[^a-zA-Z0-9_]/) { + printf STDERR "$filename:$lineno: leaks CONFIG_$1 to userspace where it is not valid\n"; + } +} + +my $linux_asm_types; +sub check_asm_types +{ + if ($filename =~ /types.h|int-l64.h|int-ll64.h/o) { + return; + } + if ($lineno == 1) { + $linux_asm_types = 0; + } elsif ($linux_asm_types >= 1) { + return; + } + if ($line =~ m/^\s*#\s*include\s+<asm\/types.h>/) { + $linux_asm_types = 1; + printf STDERR "$filename:$lineno: " . + "include of <linux/types.h> is preferred over <asm/types.h>\n" + # Warn until headers are all fixed + #$ret = 1; + } +} + +my $linux_types; +my %import_stack = (); +sub check_include_typesh +{ + my $path = $_[0]; + my $import_path; + + my $fh; + my @file_paths = ($path, $dir . "/" . $path, dirname($filename) . "/" . $path); + for my $possible ( @file_paths ) { + if (not $import_stack{$possible} and open($fh, '<', $possible)) { + $import_path = $possible; + $import_stack{$import_path} = 1; + last; + } + } + if (eof $fh) { + return; + } + + my $line; + while ($line = <$fh>) { + if ($line =~ m/^\s*#\s*include\s+<linux\/types.h>/) { + $linux_types = 1; + last; + } + if (my $included = ($line =~ /^\s*#\s*include\s+[<"](\S+)[>"]/)[0]) { + check_include_typesh($included); + } + } + close $fh; + delete $import_stack{$import_path}; +} + +sub check_sizetypes +{ + if ($filename =~ /types.h|int-l64.h|int-ll64.h/o) { + return; + } + if ($lineno == 1) { + $linux_types = 0; + } elsif ($linux_types >= 1) { + return; + } + if ($line =~ m/^\s*#\s*include\s+<linux\/types.h>/) { + $linux_types = 1; + return; + } + if (my $included = ($line =~ /^\s*#\s*include\s+[<"](\S+)[>"]/)[0]) { + check_include_typesh($included); + } + if ($line =~ m/__[us](8|16|32|64)\b/) { + printf STDERR "$filename:$lineno: " . + "found __[us]{8,16,32,64} type " . + "without #include <linux/types.h>\n"; + $linux_types = 2; + # Warn until headers are all fixed + #$ret = 1; + } +} diff --git a/src/net/scripts/headers_install.sh b/src/net/scripts/headers_install.sh new file mode 100755 index 0000000..dd554bd --- /dev/null +++ b/src/net/scripts/headers_install.sh @@ -0,0 +1,113 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 + +if [ $# -ne 2 ] +then + echo "Usage: headers_install.sh INFILE OUTFILE" + echo + echo "Prepares kernel header files for use by user space, by removing" + echo "all compiler.h definitions and #includes, removing any" + echo "#ifdef __KERNEL__ sections, and putting __underscores__ around" + echo "asm/inline/volatile keywords." + echo + echo "INFILE: header file to operate on" + echo "OUTFILE: output file which the processed header is written to" + + exit 1 +fi + +# Grab arguments +INFILE=$1 +OUTFILE=$2 +TMPFILE=$OUTFILE.tmp + +trap 'rm -f $OUTFILE $TMPFILE' EXIT + +# SPDX-License-Identifier with GPL variants must have "WITH Linux-syscall-note" +if [ -n "$(sed -n -e "/SPDX-License-Identifier:.*GPL-/{/WITH Linux-syscall-note/!p}" $INFILE)" ]; then + echo "error: $INFILE: missing \"WITH Linux-syscall-note\" for SPDX-License-Identifier" >&2 + exit 1 +fi + +sed -E -e ' + s/([[:space:](])(__user|__force|__iomem)[[:space:]]/\1/g + s/__attribute_const__([[:space:]]|$)/\1/g + s@^#include <linux/compiler(|_types).h>@@ + s/(^|[^a-zA-Z0-9])__packed([^a-zA-Z0-9_]|$)/\1__attribute__((packed))\2/g + s/(^|[[:space:](])(inline|asm|volatile)([[:space:](]|$)/\1__\2__\3/g + s@#(ifndef|define|endif[[:space:]]*/[*])[[:space:]]*_UAPI@#\1 @ +' $INFILE > $TMPFILE || exit 1 + +scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__ $TMPFILE > $OUTFILE +[ $? -gt 1 ] && exit 1 + +# Remove /* ... */ style comments, and find CONFIG_ references in code +configs=$(sed -e ' +:comment + s:/\*[^*][^*]*:/*: + s:/\*\*\**\([^/]\):/*\1: + t comment + s:/\*\*/: : + t comment + /\/\*/! b check + N + b comment +:print + P + D +:check + s:^\(CONFIG_[[:alnum:]_]*\):\1\n: + t print + s:^[[:alnum:]_][[:alnum:]_]*:: + s:^[^[:alnum:]_][^[:alnum:]_]*:: + t check + d +' $OUTFILE) + +# The entries in the following list do not result in an error. +# Please do not add a new entry. This list is only for existing ones. +# The list will be reduced gradually, and deleted eventually. (hopefully) +# +# The format is <file-name>:<CONFIG-option> in each line. +config_leak_ignores=" +arch/alpha/include/uapi/asm/setup.h:CONFIG_ALPHA_LEGACY_START_ADDRESS +arch/arc/include/uapi/asm/page.h:CONFIG_ARC_PAGE_SIZE_16K +arch/arc/include/uapi/asm/page.h:CONFIG_ARC_PAGE_SIZE_4K +arch/arc/include/uapi/asm/swab.h:CONFIG_ARC_HAS_SWAPE +arch/arm/include/uapi/asm/ptrace.h:CONFIG_CPU_ENDIAN_BE8 +arch/hexagon/include/uapi/asm/ptrace.h:CONFIG_HEXAGON_ARCH_VERSION +arch/hexagon/include/uapi/asm/user.h:CONFIG_HEXAGON_ARCH_VERSION +arch/ia64/include/uapi/asm/cmpxchg.h:CONFIG_IA64_DEBUG_CMPXCHG +arch/m68k/include/uapi/asm/ptrace.h:CONFIG_COLDFIRE +arch/nios2/include/uapi/asm/swab.h:CONFIG_NIOS2_CI_SWAB_NO +arch/nios2/include/uapi/asm/swab.h:CONFIG_NIOS2_CI_SWAB_SUPPORT +arch/x86/include/uapi/asm/auxvec.h:CONFIG_IA32_EMULATION +arch/x86/include/uapi/asm/auxvec.h:CONFIG_X86_64 +arch/x86/include/uapi/asm/mman.h:CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS +include/uapi/asm-generic/fcntl.h:CONFIG_64BIT +include/uapi/linux/atmdev.h:CONFIG_COMPAT +include/uapi/linux/eventpoll.h:CONFIG_PM_SLEEP +include/uapi/linux/hw_breakpoint.h:CONFIG_HAVE_MIXED_BREAKPOINTS_REGS +include/uapi/linux/pktcdvd.h:CONFIG_CDROM_PKTCDVD_WCACHE +" + +for c in $configs +do + leak_error=1 + + for ignore in $config_leak_ignores + do + if echo "$INFILE:$c" | grep -q "$ignore$"; then + leak_error= + break + fi + done + + if [ "$leak_error" = 1 ]; then + echo "error: $INFILE: leak $c to user-space" >&2 + exit 1 + fi +done + +rm -f $TMPFILE +trap - EXIT diff --git a/src/net/scripts/insert-sys-cert.c b/src/net/scripts/insert-sys-cert.c new file mode 100644 index 0000000..8902836 --- /dev/null +++ b/src/net/scripts/insert-sys-cert.c @@ -0,0 +1,410 @@ +/* Write the contents of the <certfile> into kernel symbol system_extra_cert + * + * Copyright (C) IBM Corporation, 2015 + * + * Author: Mehmet Kayaalp <mkayaalp@linux.vnet.ibm.com> + * + * This software may be used and distributed according to the terms + * of the GNU General Public License, incorporated herein by reference. + * + * Usage: insert-sys-cert [-s <System.map> -b <vmlinux> -c <certfile> + */ + +#define _GNU_SOURCE +#include <stdio.h> +#include <ctype.h> +#include <string.h> +#include <limits.h> +#include <stdbool.h> +#include <errno.h> +#include <stdlib.h> +#include <stdarg.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/mman.h> +#include <fcntl.h> +#include <unistd.h> +#include <elf.h> + +#define CERT_SYM "system_extra_cert" +#define USED_SYM "system_extra_cert_used" +#define LSIZE_SYM "system_certificate_list_size" + +#define info(format, args...) fprintf(stderr, "INFO: " format, ## args) +#define warn(format, args...) fprintf(stdout, "WARNING: " format, ## args) +#define err(format, args...) fprintf(stderr, "ERROR: " format, ## args) + +#if UINTPTR_MAX == 0xffffffff +#define CURRENT_ELFCLASS ELFCLASS32 +#define Elf_Ehdr Elf32_Ehdr +#define Elf_Shdr Elf32_Shdr +#define Elf_Sym Elf32_Sym +#else +#define CURRENT_ELFCLASS ELFCLASS64 +#define Elf_Ehdr Elf64_Ehdr +#define Elf_Shdr Elf64_Shdr +#define Elf_Sym Elf64_Sym +#endif + +static unsigned char endianness(void) +{ + uint16_t two_byte = 0x00FF; + uint8_t low_address = *((uint8_t *)&two_byte); + + if (low_address == 0) + return ELFDATA2MSB; + else + return ELFDATA2LSB; +} + +struct sym { + char *name; + unsigned long address; + unsigned long offset; + void *content; + int size; +}; + +static unsigned long get_offset_from_address(Elf_Ehdr *hdr, unsigned long addr) +{ + Elf_Shdr *x; + unsigned int i, num_sections; + + x = (void *)hdr + hdr->e_shoff; + if (hdr->e_shnum == SHN_UNDEF) + num_sections = x[0].sh_size; + else + num_sections = hdr->e_shnum; + + for (i = 1; i < num_sections; i++) { + unsigned long start = x[i].sh_addr; + unsigned long end = start + x[i].sh_size; + unsigned long offset = x[i].sh_offset; + + if (addr >= start && addr <= end) + return addr - start + offset; + } + return 0; +} + + +#define LINE_SIZE 100 + +static void get_symbol_from_map(Elf_Ehdr *hdr, FILE *f, char *name, + struct sym *s) +{ + char l[LINE_SIZE]; + char *w, *p, *n; + + s->size = 0; + s->address = 0; + s->offset = 0; + if (fseek(f, 0, SEEK_SET) != 0) { + perror("File seek failed"); + exit(EXIT_FAILURE); + } + while (fgets(l, LINE_SIZE, f)) { + p = strchr(l, '\n'); + if (!p) { + err("Missing line ending.\n"); + return; + } + n = strstr(l, name); + if (n) + break; + } + if (!n) { + err("Unable to find symbol: %s\n", name); + return; + } + w = strchr(l, ' '); + if (!w) + return; + + *w = '\0'; + s->address = strtoul(l, NULL, 16); + if (s->address == 0) + return; + s->offset = get_offset_from_address(hdr, s->address); + s->name = name; + s->content = (void *)hdr + s->offset; +} + +static Elf_Sym *find_elf_symbol(Elf_Ehdr *hdr, Elf_Shdr *symtab, char *name) +{ + Elf_Sym *sym, *symtab_start; + char *strtab, *symname; + unsigned int link; + Elf_Shdr *x; + int i, n; + + x = (void *)hdr + hdr->e_shoff; + link = symtab->sh_link; + symtab_start = (void *)hdr + symtab->sh_offset; + n = symtab->sh_size / symtab->sh_entsize; + strtab = (void *)hdr + x[link].sh_offset; + + for (i = 0; i < n; i++) { + sym = &symtab_start[i]; + symname = strtab + sym->st_name; + if (strcmp(symname, name) == 0) + return sym; + } + err("Unable to find symbol: %s\n", name); + return NULL; +} + +static void get_symbol_from_table(Elf_Ehdr *hdr, Elf_Shdr *symtab, + char *name, struct sym *s) +{ + Elf_Shdr *sec; + int secndx; + Elf_Sym *elf_sym; + Elf_Shdr *x; + + x = (void *)hdr + hdr->e_shoff; + s->size = 0; + s->address = 0; + s->offset = 0; + elf_sym = find_elf_symbol(hdr, symtab, name); + if (!elf_sym) + return; + secndx = elf_sym->st_shndx; + if (!secndx) + return; + sec = &x[secndx]; + s->size = elf_sym->st_size; + s->address = elf_sym->st_value; + s->offset = s->address - sec->sh_addr + + sec->sh_offset; + s->name = name; + s->content = (void *)hdr + s->offset; +} + +static Elf_Shdr *get_symbol_table(Elf_Ehdr *hdr) +{ + Elf_Shdr *x; + unsigned int i, num_sections; + + x = (void *)hdr + hdr->e_shoff; + if (hdr->e_shnum == SHN_UNDEF) + num_sections = x[0].sh_size; + else + num_sections = hdr->e_shnum; + + for (i = 1; i < num_sections; i++) + if (x[i].sh_type == SHT_SYMTAB) + return &x[i]; + return NULL; +} + +static void *map_file(char *file_name, int *size) +{ + struct stat st; + void *map; + int fd; + + fd = open(file_name, O_RDWR); + if (fd < 0) { + perror(file_name); + return NULL; + } + if (fstat(fd, &st)) { + perror("Could not determine file size"); + close(fd); + return NULL; + } + *size = st.st_size; + map = mmap(NULL, *size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); + if (map == MAP_FAILED) { + perror("Mapping to memory failed"); + close(fd); + return NULL; + } + close(fd); + return map; +} + +static char *read_file(char *file_name, int *size) +{ + struct stat st; + char *buf; + int fd; + + fd = open(file_name, O_RDONLY); + if (fd < 0) { + perror(file_name); + return NULL; + } + if (fstat(fd, &st)) { + perror("Could not determine file size"); + close(fd); + return NULL; + } + *size = st.st_size; + buf = malloc(*size); + if (!buf) { + perror("Allocating memory failed"); + close(fd); + return NULL; + } + if (read(fd, buf, *size) != *size) { + perror("File read failed"); + close(fd); + return NULL; + } + close(fd); + return buf; +} + +static void print_sym(Elf_Ehdr *hdr, struct sym *s) +{ + info("sym: %s\n", s->name); + info("addr: 0x%lx\n", s->address); + info("size: %d\n", s->size); + info("offset: 0x%lx\n", (unsigned long)s->offset); +} + +static void print_usage(char *e) +{ + printf("Usage %s [-s <System.map>] -b <vmlinux> -c <certfile>\n", e); +} + +int main(int argc, char **argv) +{ + char *system_map_file = NULL; + char *vmlinux_file = NULL; + char *cert_file = NULL; + int vmlinux_size; + int cert_size; + Elf_Ehdr *hdr; + char *cert; + FILE *system_map; + unsigned long *lsize; + int *used; + int opt; + Elf_Shdr *symtab = NULL; + struct sym cert_sym, lsize_sym, used_sym; + + while ((opt = getopt(argc, argv, "b:c:s:")) != -1) { + switch (opt) { + case 's': + system_map_file = optarg; + break; + case 'b': + vmlinux_file = optarg; + break; + case 'c': + cert_file = optarg; + break; + default: + break; + } + } + + if (!vmlinux_file || !cert_file) { + print_usage(argv[0]); + exit(EXIT_FAILURE); + } + + cert = read_file(cert_file, &cert_size); + if (!cert) + exit(EXIT_FAILURE); + + hdr = map_file(vmlinux_file, &vmlinux_size); + if (!hdr) + exit(EXIT_FAILURE); + + if (vmlinux_size < sizeof(*hdr)) { + err("Invalid ELF file.\n"); + exit(EXIT_FAILURE); + } + + if ((hdr->e_ident[EI_MAG0] != ELFMAG0) || + (hdr->e_ident[EI_MAG1] != ELFMAG1) || + (hdr->e_ident[EI_MAG2] != ELFMAG2) || + (hdr->e_ident[EI_MAG3] != ELFMAG3)) { + err("Invalid ELF magic.\n"); + exit(EXIT_FAILURE); + } + + if (hdr->e_ident[EI_CLASS] != CURRENT_ELFCLASS) { + err("ELF class mismatch.\n"); + exit(EXIT_FAILURE); + } + + if (hdr->e_ident[EI_DATA] != endianness()) { + err("ELF endian mismatch.\n"); + exit(EXIT_FAILURE); + } + + if (hdr->e_shoff > vmlinux_size) { + err("Could not find section header.\n"); + exit(EXIT_FAILURE); + } + + symtab = get_symbol_table(hdr); + if (!symtab) { + warn("Could not find the symbol table.\n"); + if (!system_map_file) { + err("Please provide a System.map file.\n"); + print_usage(argv[0]); + exit(EXIT_FAILURE); + } + + system_map = fopen(system_map_file, "r"); + if (!system_map) { + perror(system_map_file); + exit(EXIT_FAILURE); + } + get_symbol_from_map(hdr, system_map, CERT_SYM, &cert_sym); + get_symbol_from_map(hdr, system_map, USED_SYM, &used_sym); + get_symbol_from_map(hdr, system_map, LSIZE_SYM, &lsize_sym); + cert_sym.size = used_sym.address - cert_sym.address; + } else { + info("Symbol table found.\n"); + if (system_map_file) + warn("System.map is ignored.\n"); + get_symbol_from_table(hdr, symtab, CERT_SYM, &cert_sym); + get_symbol_from_table(hdr, symtab, USED_SYM, &used_sym); + get_symbol_from_table(hdr, symtab, LSIZE_SYM, &lsize_sym); + } + + if (!cert_sym.offset || !lsize_sym.offset || !used_sym.offset) + exit(EXIT_FAILURE); + + print_sym(hdr, &cert_sym); + print_sym(hdr, &used_sym); + print_sym(hdr, &lsize_sym); + + lsize = (unsigned long *)lsize_sym.content; + used = (int *)used_sym.content; + + if (cert_sym.size < cert_size) { + err("Certificate is larger than the reserved area!\n"); + exit(EXIT_FAILURE); + } + + /* If the existing cert is the same, don't overwrite */ + if (cert_size == *used && + strncmp(cert_sym.content, cert, cert_size) == 0) { + warn("Certificate was already inserted.\n"); + exit(EXIT_SUCCESS); + } + + if (*used > 0) + warn("Replacing previously inserted certificate.\n"); + + memcpy(cert_sym.content, cert, cert_size); + if (cert_size < cert_sym.size) + memset(cert_sym.content + cert_size, + 0, cert_sym.size - cert_size); + + *lsize = *lsize + cert_size - *used; + *used = cert_size; + info("Inserted the contents of %s into %lx.\n", cert_file, + cert_sym.address); + info("Used %d bytes out of %d bytes reserved.\n", *used, + cert_sym.size); + exit(EXIT_SUCCESS); +} diff --git a/src/net/scripts/jobserver-exec b/src/net/scripts/jobserver-exec new file mode 100755 index 0000000..0fdb31a --- /dev/null +++ b/src/net/scripts/jobserver-exec @@ -0,0 +1,66 @@ +#!/usr/bin/env python +# SPDX-License-Identifier: GPL-2.0+ +# +# This determines how many parallel tasks "make" is expecting, as it is +# not exposed via an special variables, reserves them all, runs a subprocess +# with PARALLELISM environment variable set, and releases the jobs back again. +# +# https://www.gnu.org/software/make/manual/html_node/POSIX-Jobserver.html#POSIX-Jobserver +from __future__ import print_function +import os, sys, errno +import subprocess + +# Extract and prepare jobserver file descriptors from envirnoment. +claim = 0 +jobs = b"" +try: + # Fetch the make environment options. + flags = os.environ['MAKEFLAGS'] + + # Look for "--jobserver=R,W" + # Note that GNU Make has used --jobserver-fds and --jobserver-auth + # so this handles all of them. + opts = [x for x in flags.split(" ") if x.startswith("--jobserver")] + + # Parse out R,W file descriptor numbers and set them nonblocking. + fds = opts[0].split("=", 1)[1] + reader, writer = [int(x) for x in fds.split(",", 1)] + # Open a private copy of reader to avoid setting nonblocking + # on an unexpecting process with the same reader fd. + reader = os.open("/proc/self/fd/%d" % (reader), + os.O_RDONLY | os.O_NONBLOCK) + + # Read out as many jobserver slots as possible. + while True: + try: + slot = os.read(reader, 8) + jobs += slot + except (OSError, IOError) as e: + if e.errno == errno.EWOULDBLOCK: + # Stop at the end of the jobserver queue. + break + # If something went wrong, give back the jobs. + if len(jobs): + os.write(writer, jobs) + raise e + # Add a bump for our caller's reserveration, since we're just going + # to sit here blocked on our child. + claim = len(jobs) + 1 +except (KeyError, IndexError, ValueError, OSError, IOError) as e: + # Any missing environment strings or bad fds should result in just + # not being parallel. + pass + +# We can only claim parallelism if there was a jobserver (i.e. a top-level +# "-jN" argument) and there were no other failures. Otherwise leave out the +# environment variable and let the child figure out what is best. +if claim > 0: + os.environ['PARALLELISM'] = '%d' % (claim) + +rc = subprocess.call(sys.argv[1:]) + +# Return all the reserved slots. +if len(jobs): + os.write(writer, jobs) + +sys.exit(rc) diff --git a/src/net/scripts/kallsyms.c b/src/net/scripts/kallsyms.c new file mode 100644 index 0000000..fa1cb7d --- /dev/null +++ b/src/net/scripts/kallsyms.c @@ -0,0 +1,832 @@ +/* Generate assembler source containing symbol information + * + * Copyright 2002 by Kai Germaschewski + * + * This software may be used and distributed according to the terms + * of the GNU General Public License, incorporated herein by reference. + * + * Usage: nm -n vmlinux | scripts/kallsyms [--all-symbols] > symbols.S + * + * Table compression uses all the unused char codes on the symbols and + * maps these to the most used substrings (tokens). For instance, it might + * map char code 0xF7 to represent "write_" and then in every symbol where + * "write_" appears it can be replaced by 0xF7, saving 5 bytes. + * The used codes themselves are also placed in the table so that the + * decompresion can work without "special cases". + * Applied to kernel symbols, this usually produces a compression ratio + * of about 50%. + * + */ + +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <limits.h> + +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0])) + +#define _stringify_1(x) #x +#define _stringify(x) _stringify_1(x) + +#define KSYM_NAME_LEN 512 + +/* + * A substantially bigger size than the current maximum. + * + * It cannot be defined as an expression because it gets stringified + * for the fscanf() format string. Therefore, a _Static_assert() is + * used instead to maintain the relationship with KSYM_NAME_LEN. + */ +#define KSYM_NAME_LEN_BUFFER 2048 +_Static_assert( + KSYM_NAME_LEN_BUFFER == KSYM_NAME_LEN * 4, + "Please keep KSYM_NAME_LEN_BUFFER in sync with KSYM_NAME_LEN" +); + +struct sym_entry { + unsigned long long addr; + unsigned int len; + unsigned int start_pos; + unsigned int percpu_absolute; + unsigned char sym[]; +}; + +struct addr_range { + const char *start_sym, *end_sym; + unsigned long long start, end; +}; + +static unsigned long long _text; +static unsigned long long relative_base; +static struct addr_range text_ranges[] = { + { "_stext", "_etext" }, + { "_sinittext", "_einittext" }, +}; +#define text_range_text (&text_ranges[0]) +#define text_range_inittext (&text_ranges[1]) + +static struct addr_range percpu_range = { + "__per_cpu_start", "__per_cpu_end", -1ULL, 0 +}; + +static struct sym_entry **table; +static unsigned int table_size, table_cnt; +static int all_symbols; +static int absolute_percpu; +static int base_relative; + +static int token_profit[0x10000]; + +/* the table that holds the result of the compression */ +static unsigned char best_table[256][2]; +static unsigned char best_table_len[256]; + + +static void usage(void) +{ + fprintf(stderr, "Usage: kallsyms [--all-symbols] " + "[--base-relative] < in.map > out.S\n"); + exit(1); +} + +static char *sym_name(const struct sym_entry *s) +{ + return (char *)s->sym + 1; +} + +static bool is_ignored_symbol(const char *name, char type) +{ + /* Symbol names that exactly match to the following are ignored.*/ + static const char * const ignored_symbols[] = { + /* + * Symbols which vary between passes. Passes 1 and 2 must have + * identical symbol lists. The kallsyms_* symbols below are + * only added after pass 1, they would be included in pass 2 + * when --all-symbols is specified so exclude them to get a + * stable symbol list. + */ + "kallsyms_addresses", + "kallsyms_offsets", + "kallsyms_relative_base", + "kallsyms_num_syms", + "kallsyms_names", + "kallsyms_markers", + "kallsyms_token_table", + "kallsyms_token_index", + /* Exclude linker generated symbols which vary between passes */ + "_SDA_BASE_", /* ppc */ + "_SDA2_BASE_", /* ppc */ + NULL + }; + + /* Symbol names that begin with the following are ignored.*/ + static const char * const ignored_prefixes[] = { + "$", /* local symbols for ARM, MIPS, etc. */ + ".LASANPC", /* s390 kasan local symbols */ + "__crc_", /* modversions */ + "__efistub_", /* arm64 EFI stub namespace */ + "__kvm_nvhe_", /* arm64 non-VHE KVM namespace */ + "__AArch64ADRPThunk_", /* arm64 lld */ + "__ARMV5PILongThunk_", /* arm lld */ + "__ARMV7PILongThunk_", + "__ThumbV7PILongThunk_", + "__LA25Thunk_", /* mips lld */ + "__microLA25Thunk_", + NULL + }; + + /* Symbol names that end with the following are ignored.*/ + static const char * const ignored_suffixes[] = { + "_from_arm", /* arm */ + "_from_thumb", /* arm */ + "_veneer", /* arm */ + NULL + }; + + /* Symbol names that contain the following are ignored.*/ + static const char * const ignored_matches[] = { + ".long_branch.", /* ppc stub */ + ".plt_branch.", /* ppc stub */ + NULL + }; + + const char * const *p; + + for (p = ignored_symbols; *p; p++) + if (!strcmp(name, *p)) + return true; + + for (p = ignored_prefixes; *p; p++) + if (!strncmp(name, *p, strlen(*p))) + return true; + + for (p = ignored_suffixes; *p; p++) { + int l = strlen(name) - strlen(*p); + + if (l >= 0 && !strcmp(name + l, *p)) + return true; + } + + for (p = ignored_matches; *p; p++) { + if (strstr(name, *p)) + return true; + } + + if (type == 'U' || type == 'u') + return true; + /* exclude debugging symbols */ + if (type == 'N' || type == 'n') + return true; + + if (toupper(type) == 'A') { + /* Keep these useful absolute symbols */ + if (strcmp(name, "__kernel_syscall_via_break") && + strcmp(name, "__kernel_syscall_via_epc") && + strcmp(name, "__kernel_sigtramp") && + strcmp(name, "__gp")) + return true; + } + + return false; +} + +static void check_symbol_range(const char *sym, unsigned long long addr, + struct addr_range *ranges, int entries) +{ + size_t i; + struct addr_range *ar; + + for (i = 0; i < entries; ++i) { + ar = &ranges[i]; + + if (strcmp(sym, ar->start_sym) == 0) { + ar->start = addr; + return; + } else if (strcmp(sym, ar->end_sym) == 0) { + ar->end = addr; + return; + } + } +} + +static struct sym_entry *read_symbol(FILE *in) +{ + char name[KSYM_NAME_LEN_BUFFER+1], type; + unsigned long long addr; + unsigned int len; + struct sym_entry *sym; + int rc; + + rc = fscanf(in, "%llx %c %" _stringify(KSYM_NAME_LEN_BUFFER) "s\n", &addr, &type, name); + if (rc != 3) { + if (rc != EOF && fgets(name, ARRAY_SIZE(name), in) == NULL) + fprintf(stderr, "Read error or end of file.\n"); + return NULL; + } + if (strlen(name) >= KSYM_NAME_LEN) { + fprintf(stderr, "Symbol %s too long for kallsyms (%zu >= %d).\n" + "Please increase KSYM_NAME_LEN both in kernel and kallsyms.c\n", + name, strlen(name), KSYM_NAME_LEN); + return NULL; + } + + if (strcmp(name, "_text") == 0) + _text = addr; + + /* Ignore most absolute/undefined (?) symbols. */ + if (is_ignored_symbol(name, type)) + return NULL; + + check_symbol_range(name, addr, text_ranges, ARRAY_SIZE(text_ranges)); + check_symbol_range(name, addr, &percpu_range, 1); + + /* include the type field in the symbol name, so that it gets + * compressed together */ + + len = strlen(name) + 1; + + sym = malloc(sizeof(*sym) + len + 1); + if (!sym) { + fprintf(stderr, "kallsyms failure: " + "unable to allocate required amount of memory\n"); + exit(EXIT_FAILURE); + } + sym->addr = addr; + sym->len = len; + sym->sym[0] = type; + strcpy(sym_name(sym), name); + sym->percpu_absolute = 0; + + return sym; +} + +static int symbol_in_range(const struct sym_entry *s, + const struct addr_range *ranges, int entries) +{ + size_t i; + const struct addr_range *ar; + + for (i = 0; i < entries; ++i) { + ar = &ranges[i]; + + if (s->addr >= ar->start && s->addr <= ar->end) + return 1; + } + + return 0; +} + +static int symbol_valid(const struct sym_entry *s) +{ + const char *name = sym_name(s); + + /* if --all-symbols is not specified, then symbols outside the text + * and inittext sections are discarded */ + if (!all_symbols) { + if (symbol_in_range(s, text_ranges, + ARRAY_SIZE(text_ranges)) == 0) + return 0; + /* Corner case. Discard any symbols with the same value as + * _etext _einittext; they can move between pass 1 and 2 when + * the kallsyms data are added. If these symbols move then + * they may get dropped in pass 2, which breaks the kallsyms + * rules. + */ + if ((s->addr == text_range_text->end && + strcmp(name, text_range_text->end_sym)) || + (s->addr == text_range_inittext->end && + strcmp(name, text_range_inittext->end_sym))) + return 0; + } + + return 1; +} + +/* remove all the invalid symbols from the table */ +static void shrink_table(void) +{ + unsigned int i, pos; + + pos = 0; + for (i = 0; i < table_cnt; i++) { + if (symbol_valid(table[i])) { + if (pos != i) + table[pos] = table[i]; + pos++; + } else { + free(table[i]); + } + } + table_cnt = pos; + + /* When valid symbol is not registered, exit to error */ + if (!table_cnt) { + fprintf(stderr, "No valid symbol.\n"); + exit(1); + } +} + +static void read_map(FILE *in) +{ + struct sym_entry *sym; + + while (!feof(in)) { + sym = read_symbol(in); + if (!sym) + continue; + + sym->start_pos = table_cnt; + + if (table_cnt >= table_size) { + table_size += 10000; + table = realloc(table, sizeof(*table) * table_size); + if (!table) { + fprintf(stderr, "out of memory\n"); + exit (1); + } + } + + table[table_cnt++] = sym; + } +} + +static void output_label(const char *label) +{ + printf(".globl %s\n", label); + printf("\tALGN\n"); + printf("%s:\n", label); +} + +/* Provide proper symbols relocatability by their '_text' relativeness. */ +static void output_address(unsigned long long addr) +{ + if (_text <= addr) + printf("\tPTR\t_text + %#llx\n", addr - _text); + else + printf("\tPTR\t_text - %#llx\n", _text - addr); +} + +/* uncompress a compressed symbol. When this function is called, the best table + * might still be compressed itself, so the function needs to be recursive */ +static int expand_symbol(const unsigned char *data, int len, char *result) +{ + int c, rlen, total=0; + + while (len) { + c = *data; + /* if the table holds a single char that is the same as the one + * we are looking for, then end the search */ + if (best_table[c][0]==c && best_table_len[c]==1) { + *result++ = c; + total++; + } else { + /* if not, recurse and expand */ + rlen = expand_symbol(best_table[c], best_table_len[c], result); + total += rlen; + result += rlen; + } + data++; + len--; + } + *result=0; + + return total; +} + +static int symbol_absolute(const struct sym_entry *s) +{ + return s->percpu_absolute; +} + +static void write_src(void) +{ + unsigned int i, k, off; + unsigned int best_idx[256]; + unsigned int *markers; + char buf[KSYM_NAME_LEN]; + + printf("#include <asm/bitsperlong.h>\n"); + printf("#if BITS_PER_LONG == 64\n"); + printf("#define PTR .quad\n"); + printf("#define ALGN .balign 8\n"); + printf("#else\n"); + printf("#define PTR .long\n"); + printf("#define ALGN .balign 4\n"); + printf("#endif\n"); + + printf("\t.section .rodata, \"a\"\n"); + + if (!base_relative) + output_label("kallsyms_addresses"); + else + output_label("kallsyms_offsets"); + + for (i = 0; i < table_cnt; i++) { + if (base_relative) { + /* + * Use the offset relative to the lowest value + * encountered of all relative symbols, and emit + * non-relocatable fixed offsets that will be fixed + * up at runtime. + */ + + long long offset; + int overflow; + + if (!absolute_percpu) { + offset = table[i]->addr - relative_base; + overflow = (offset < 0 || offset > UINT_MAX); + } else if (symbol_absolute(table[i])) { + offset = table[i]->addr; + overflow = (offset < 0 || offset > INT_MAX); + } else { + offset = relative_base - table[i]->addr - 1; + overflow = (offset < INT_MIN || offset >= 0); + } + if (overflow) { + fprintf(stderr, "kallsyms failure: " + "%s symbol value %#llx out of range in relative mode\n", + symbol_absolute(table[i]) ? "absolute" : "relative", + table[i]->addr); + exit(EXIT_FAILURE); + } + printf("\t.long\t%#x\n", (int)offset); + } else if (!symbol_absolute(table[i])) { + output_address(table[i]->addr); + } else { + printf("\tPTR\t%#llx\n", table[i]->addr); + } + } + printf("\n"); + + if (base_relative) { + output_label("kallsyms_relative_base"); + output_address(relative_base); + printf("\n"); + } + + output_label("kallsyms_num_syms"); + printf("\t.long\t%u\n", table_cnt); + printf("\n"); + + /* table of offset markers, that give the offset in the compressed stream + * every 256 symbols */ + markers = malloc(sizeof(unsigned int) * ((table_cnt + 255) / 256)); + if (!markers) { + fprintf(stderr, "kallsyms failure: " + "unable to allocate required memory\n"); + exit(EXIT_FAILURE); + } + + output_label("kallsyms_names"); + off = 0; + for (i = 0; i < table_cnt; i++) { + if ((i & 0xFF) == 0) + markers[i >> 8] = off; + + /* There cannot be any symbol of length zero. */ + if (table[i]->len == 0) { + fprintf(stderr, "kallsyms failure: " + "unexpected zero symbol length\n"); + exit(EXIT_FAILURE); + } + + /* Only lengths that fit in up-to-two-byte ULEB128 are supported. */ + if (table[i]->len > 0x3FFF) { + fprintf(stderr, "kallsyms failure: " + "unexpected huge symbol length\n"); + exit(EXIT_FAILURE); + } + + /* Encode length with ULEB128. */ + if (table[i]->len <= 0x7F) { + /* Most symbols use a single byte for the length. */ + printf("\t.byte 0x%02x", table[i]->len); + off += table[i]->len + 1; + } else { + /* "Big" symbols use two bytes. */ + printf("\t.byte 0x%02x, 0x%02x", + (table[i]->len & 0x7F) | 0x80, + (table[i]->len >> 7) & 0x7F); + off += table[i]->len + 2; + } + for (k = 0; k < table[i]->len; k++) + printf(", 0x%02x", table[i]->sym[k]); + printf("\n"); + } + printf("\n"); + + output_label("kallsyms_markers"); + for (i = 0; i < ((table_cnt + 255) >> 8); i++) + printf("\t.long\t%u\n", markers[i]); + printf("\n"); + + free(markers); + + output_label("kallsyms_token_table"); + off = 0; + for (i = 0; i < 256; i++) { + best_idx[i] = off; + expand_symbol(best_table[i], best_table_len[i], buf); + printf("\t.asciz\t\"%s\"\n", buf); + off += strlen(buf) + 1; + } + printf("\n"); + + output_label("kallsyms_token_index"); + for (i = 0; i < 256; i++) + printf("\t.short\t%d\n", best_idx[i]); + printf("\n"); +} + + +/* table lookup compression functions */ + +/* count all the possible tokens in a symbol */ +static void learn_symbol(const unsigned char *symbol, int len) +{ + int i; + + for (i = 0; i < len - 1; i++) + token_profit[ symbol[i] + (symbol[i + 1] << 8) ]++; +} + +/* decrease the count for all the possible tokens in a symbol */ +static void forget_symbol(const unsigned char *symbol, int len) +{ + int i; + + for (i = 0; i < len - 1; i++) + token_profit[ symbol[i] + (symbol[i + 1] << 8) ]--; +} + +/* do the initial token count */ +static void build_initial_tok_table(void) +{ + unsigned int i; + + for (i = 0; i < table_cnt; i++) + learn_symbol(table[i]->sym, table[i]->len); +} + +static unsigned char *find_token(unsigned char *str, int len, + const unsigned char *token) +{ + int i; + + for (i = 0; i < len - 1; i++) { + if (str[i] == token[0] && str[i+1] == token[1]) + return &str[i]; + } + return NULL; +} + +/* replace a given token in all the valid symbols. Use the sampled symbols + * to update the counts */ +static void compress_symbols(const unsigned char *str, int idx) +{ + unsigned int i, len, size; + unsigned char *p1, *p2; + + for (i = 0; i < table_cnt; i++) { + + len = table[i]->len; + p1 = table[i]->sym; + + /* find the token on the symbol */ + p2 = find_token(p1, len, str); + if (!p2) continue; + + /* decrease the counts for this symbol's tokens */ + forget_symbol(table[i]->sym, len); + + size = len; + + do { + *p2 = idx; + p2++; + size -= (p2 - p1); + memmove(p2, p2 + 1, size); + p1 = p2; + len--; + + if (size < 2) break; + + /* find the token on the symbol */ + p2 = find_token(p1, size, str); + + } while (p2); + + table[i]->len = len; + + /* increase the counts for this symbol's new tokens */ + learn_symbol(table[i]->sym, len); + } +} + +/* search the token with the maximum profit */ +static int find_best_token(void) +{ + int i, best, bestprofit; + + bestprofit=-10000; + best = 0; + + for (i = 0; i < 0x10000; i++) { + if (token_profit[i] > bestprofit) { + best = i; + bestprofit = token_profit[i]; + } + } + return best; +} + +/* this is the core of the algorithm: calculate the "best" table */ +static void optimize_result(void) +{ + int i, best; + + /* using the '\0' symbol last allows compress_symbols to use standard + * fast string functions */ + for (i = 255; i >= 0; i--) { + + /* if this table slot is empty (it is not used by an actual + * original char code */ + if (!best_table_len[i]) { + + /* find the token with the best profit value */ + best = find_best_token(); + if (token_profit[best] == 0) + break; + + /* place it in the "best" table */ + best_table_len[i] = 2; + best_table[i][0] = best & 0xFF; + best_table[i][1] = (best >> 8) & 0xFF; + + /* replace this token in all the valid symbols */ + compress_symbols(best_table[i], i); + } + } +} + +/* start by placing the symbols that are actually used on the table */ +static void insert_real_symbols_in_table(void) +{ + unsigned int i, j, c; + + for (i = 0; i < table_cnt; i++) { + for (j = 0; j < table[i]->len; j++) { + c = table[i]->sym[j]; + best_table[c][0]=c; + best_table_len[c]=1; + } + } +} + +static void optimize_token_table(void) +{ + build_initial_tok_table(); + + insert_real_symbols_in_table(); + + optimize_result(); +} + +/* guess for "linker script provide" symbol */ +static int may_be_linker_script_provide_symbol(const struct sym_entry *se) +{ + const char *symbol = sym_name(se); + int len = se->len - 1; + + if (len < 8) + return 0; + + if (symbol[0] != '_' || symbol[1] != '_') + return 0; + + /* __start_XXXXX */ + if (!memcmp(symbol + 2, "start_", 6)) + return 1; + + /* __stop_XXXXX */ + if (!memcmp(symbol + 2, "stop_", 5)) + return 1; + + /* __end_XXXXX */ + if (!memcmp(symbol + 2, "end_", 4)) + return 1; + + /* __XXXXX_start */ + if (!memcmp(symbol + len - 6, "_start", 6)) + return 1; + + /* __XXXXX_end */ + if (!memcmp(symbol + len - 4, "_end", 4)) + return 1; + + return 0; +} + +static int compare_symbols(const void *a, const void *b) +{ + const struct sym_entry *sa = *(const struct sym_entry **)a; + const struct sym_entry *sb = *(const struct sym_entry **)b; + int wa, wb; + + /* sort by address first */ + if (sa->addr > sb->addr) + return 1; + if (sa->addr < sb->addr) + return -1; + + /* sort by "weakness" type */ + wa = (sa->sym[0] == 'w') || (sa->sym[0] == 'W'); + wb = (sb->sym[0] == 'w') || (sb->sym[0] == 'W'); + if (wa != wb) + return wa - wb; + + /* sort by "linker script provide" type */ + wa = may_be_linker_script_provide_symbol(sa); + wb = may_be_linker_script_provide_symbol(sb); + if (wa != wb) + return wa - wb; + + /* sort by the number of prefix underscores */ + wa = strspn(sym_name(sa), "_"); + wb = strspn(sym_name(sb), "_"); + if (wa != wb) + return wa - wb; + + /* sort by initial order, so that other symbols are left undisturbed */ + return sa->start_pos - sb->start_pos; +} + +static void sort_symbols(void) +{ + qsort(table, table_cnt, sizeof(table[0]), compare_symbols); +} + +static void make_percpus_absolute(void) +{ + unsigned int i; + + for (i = 0; i < table_cnt; i++) + if (symbol_in_range(table[i], &percpu_range, 1)) { + /* + * Keep the 'A' override for percpu symbols to + * ensure consistent behavior compared to older + * versions of this tool. + */ + table[i]->sym[0] = 'A'; + table[i]->percpu_absolute = 1; + } +} + +/* find the minimum non-absolute symbol address */ +static void record_relative_base(void) +{ + unsigned int i; + + for (i = 0; i < table_cnt; i++) + if (!symbol_absolute(table[i])) { + /* + * The table is sorted by address. + * Take the first non-absolute symbol value. + */ + relative_base = table[i]->addr; + return; + } +} + +int main(int argc, char **argv) +{ + if (argc >= 2) { + int i; + for (i = 1; i < argc; i++) { + if(strcmp(argv[i], "--all-symbols") == 0) + all_symbols = 1; + else if (strcmp(argv[i], "--absolute-percpu") == 0) + absolute_percpu = 1; + else if (strcmp(argv[i], "--base-relative") == 0) + base_relative = 1; + else + usage(); + } + } else if (argc != 1) + usage(); + + read_map(stdin); + shrink_table(); + if (absolute_percpu) + make_percpus_absolute(); + sort_symbols(); + if (base_relative) + record_relative_base(); + optimize_token_table(); + write_src(); + + return 0; +} diff --git a/src/net/scripts/kconfig/.gitignore b/src/net/scripts/kconfig/.gitignore new file mode 100644 index 0000000..c3d537c --- /dev/null +++ b/src/net/scripts/kconfig/.gitignore @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: GPL-2.0-only +/qconf-moc.cc +*conf-cfg + +# +# configuration programs +# +conf +mconf +nconf +qconf +gconf diff --git a/src/net/scripts/kconfig/Makefile b/src/net/scripts/kconfig/Makefile new file mode 100644 index 0000000..e46df0a --- /dev/null +++ b/src/net/scripts/kconfig/Makefile @@ -0,0 +1,216 @@ +# SPDX-License-Identifier: GPL-2.0 +# =========================================================================== +# Kernel configuration targets +# These targets are used from top-level makefile + +PHONY += xconfig gconfig menuconfig config localmodconfig localyesconfig \ + build_menuconfig build_nconfig build_gconfig build_xconfig + +ifdef KBUILD_KCONFIG +Kconfig := $(KBUILD_KCONFIG) +else +Kconfig := Kconfig +endif + +ifeq ($(quiet),silent_) +silent := -s +endif + +# We need this, in case the user has it in its environment +unexport CONFIG_ + +xconfig: $(obj)/qconf + $(Q)$< $(silent) $(Kconfig) + +gconfig: $(obj)/gconf + $(Q)$< $(silent) $(Kconfig) + +menuconfig: $(obj)/mconf + $(Q)$< $(silent) $(Kconfig) + +config: $(obj)/conf + $(Q)$< $(silent) --oldaskconfig $(Kconfig) + +nconfig: $(obj)/nconf + $(Q)$< $(silent) $(Kconfig) + +build_menuconfig: $(obj)/mconf + +build_nconfig: $(obj)/nconf + +build_gconfig: $(obj)/gconf + +build_xconfig: $(obj)/qconf + +localyesconfig localmodconfig: $(obj)/conf + $(Q)$(PERL) $(srctree)/$(src)/streamline_config.pl --$@ $(srctree) $(Kconfig) > .tmp.config + $(Q)if [ -f .config ]; then \ + cmp -s .tmp.config .config || \ + (mv -f .config .config.old.1; \ + mv -f .tmp.config .config; \ + $< $(silent) --oldconfig $(Kconfig); \ + mv -f .config.old.1 .config.old) \ + else \ + mv -f .tmp.config .config; \ + $< $(silent) --oldconfig $(Kconfig); \ + fi + $(Q)rm -f .tmp.config + +# These targets map 1:1 to the commandline options of 'conf' +# +# Note: +# syncconfig has become an internal implementation detail and is now +# deprecated for external use +simple-targets := oldconfig allnoconfig allyesconfig allmodconfig \ + alldefconfig randconfig listnewconfig olddefconfig syncconfig \ + helpnewconfig yes2modconfig mod2yesconfig + +PHONY += $(simple-targets) + +$(simple-targets): $(obj)/conf + $(Q)$< $(silent) --$@ $(Kconfig) + +PHONY += savedefconfig defconfig + +savedefconfig: $(obj)/conf + $(Q)$< $(silent) --$@=defconfig $(Kconfig) + +defconfig: $(obj)/conf +ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG)),) + @$(kecho) "*** Default configuration is based on '$(KBUILD_DEFCONFIG)'" + $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig) +else + @$(kecho) "*** Default configuration is based on target '$(KBUILD_DEFCONFIG)'" + $(Q)$(MAKE) -f $(srctree)/Makefile $(KBUILD_DEFCONFIG) +endif + +%_defconfig: $(obj)/conf + $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig) + +configfiles=$(wildcard $(srctree)/kernel/configs/$@ $(srctree)/arch/$(SRCARCH)/configs/$@) + +%.config: $(obj)/conf + $(if $(call configfiles),, $(error No configuration exists for this target on this architecture)) + $(Q)$(CONFIG_SHELL) $(srctree)/scripts/kconfig/merge_config.sh -m .config $(configfiles) + $(Q)$(MAKE) -f $(srctree)/Makefile olddefconfig + +PHONY += kvmconfig +kvmconfig: kvm_guest.config + @echo >&2 "WARNING: 'make $@' will be removed after Linux 5.10" + @echo >&2 " Please use 'make $<' instead." + +PHONY += xenconfig +xenconfig: xen.config + @echo >&2 "WARNING: 'make $@' will be removed after Linux 5.10" + @echo >&2 " Please use 'make $<' instead." + +PHONY += tinyconfig +tinyconfig: + $(Q)$(MAKE) -f $(srctree)/Makefile allnoconfig tiny.config + +# CHECK: -o cache_dir=<path> working? +PHONY += testconfig +testconfig: $(obj)/conf + $(Q)$(PYTHON3) -B -m pytest $(srctree)/$(src)/tests \ + -o cache_dir=$(abspath $(obj)/tests/.cache) \ + $(if $(findstring 1,$(KBUILD_VERBOSE)),--capture=no) +clean-files += tests/.cache + +# Help text used by make help +help: + @echo ' config - Update current config utilising a line-oriented program' + @echo ' nconfig - Update current config utilising a ncurses menu based program' + @echo ' menuconfig - Update current config utilising a menu based program' + @echo ' xconfig - Update current config utilising a Qt based front-end' + @echo ' gconfig - Update current config utilising a GTK+ based front-end' + @echo ' oldconfig - Update current config utilising a provided .config as base' + @echo ' localmodconfig - Update current config disabling modules not loaded' + @echo ' except those preserved by LMC_KEEP environment variable' + @echo ' localyesconfig - Update current config converting local mods to core' + @echo ' except those preserved by LMC_KEEP environment variable' + @echo ' defconfig - New config with default from ARCH supplied defconfig' + @echo ' savedefconfig - Save current config as ./defconfig (minimal config)' + @echo ' allnoconfig - New config where all options are answered with no' + @echo ' allyesconfig - New config where all options are accepted with yes' + @echo ' allmodconfig - New config selecting modules when possible' + @echo ' alldefconfig - New config with all symbols set to default' + @echo ' randconfig - New config with random answer to all options' + @echo ' yes2modconfig - Change answers from yes to mod if possible' + @echo ' mod2yesconfig - Change answers from mod to yes if possible' + @echo ' listnewconfig - List new options' + @echo ' helpnewconfig - List new options and help text' + @echo ' olddefconfig - Same as oldconfig but sets new symbols to their' + @echo ' default value without prompting' + @echo ' tinyconfig - Configure the tiniest possible kernel' + @echo ' testconfig - Run Kconfig unit tests (requires python3 and pytest)' + +# =========================================================================== +# object files used by all kconfig flavours +common-objs := confdata.o expr.o lexer.lex.o parser.tab.o preprocess.o \ + symbol.o util.o + +$(obj)/lexer.lex.o: $(obj)/parser.tab.h +HOSTCFLAGS_lexer.lex.o := -I $(srctree)/$(src) +HOSTCFLAGS_parser.tab.o := -I $(srctree)/$(src) + +# conf: Used for defconfig, oldconfig and related targets +hostprogs += conf +conf-objs := conf.o $(common-objs) + +# nconf: Used for the nconfig target based on ncurses +hostprogs += nconf +nconf-objs := nconf.o nconf.gui.o $(common-objs) + +HOSTLDLIBS_nconf = $(shell . $(obj)/nconf-cfg && echo $$libs) +HOSTCFLAGS_nconf.o = $(shell . $(obj)/nconf-cfg && echo $$cflags) +HOSTCFLAGS_nconf.gui.o = $(shell . $(obj)/nconf-cfg && echo $$cflags) + +$(obj)/nconf.o $(obj)/nconf.gui.o: $(obj)/nconf-cfg + +# mconf: Used for the menuconfig target based on lxdialog +hostprogs += mconf +lxdialog := $(addprefix lxdialog/, \ + checklist.o inputbox.o menubox.o textbox.o util.o yesno.o) +mconf-objs := mconf.o $(lxdialog) $(common-objs) + +HOSTLDLIBS_mconf = $(shell . $(obj)/mconf-cfg && echo $$libs) +$(foreach f, mconf.o $(lxdialog), \ + $(eval HOSTCFLAGS_$f = $$(shell . $(obj)/mconf-cfg && echo $$$$cflags))) + +$(addprefix $(obj)/, mconf.o $(lxdialog)): $(obj)/mconf-cfg + +# qconf: Used for the xconfig target based on Qt +hostprogs += qconf +qconf-cxxobjs := qconf.o qconf-moc.o +qconf-objs := images.o $(common-objs) + +HOSTLDLIBS_qconf = $(shell . $(obj)/qconf-cfg && echo $$libs) +HOSTCXXFLAGS_qconf.o = $(shell . $(obj)/qconf-cfg && echo $$cflags) +HOSTCXXFLAGS_qconf-moc.o = $(shell . $(obj)/qconf-cfg && echo $$cflags) + +$(obj)/qconf.o: $(obj)/qconf-cfg + +quiet_cmd_moc = MOC $@ + cmd_moc = $(shell . $(obj)/qconf-cfg && echo $$moc) $< -o $@ + +$(obj)/qconf-moc.cc: $(src)/qconf.h $(obj)/qconf-cfg FORCE + $(call if_changed,moc) + +targets += qconf-moc.cc + +# gconf: Used for the gconfig target based on GTK+ +hostprogs += gconf +gconf-objs := gconf.o images.o $(common-objs) + +HOSTLDLIBS_gconf = $(shell . $(obj)/gconf-cfg && echo $$libs) +HOSTCFLAGS_gconf.o = $(shell . $(obj)/gconf-cfg && echo $$cflags) + +$(obj)/gconf.o: $(obj)/gconf-cfg + +# check if necessary packages are available, and configure build flags +filechk_conf_cfg = $(CONFIG_SHELL) $< + +$(obj)/%conf-cfg: $(src)/%conf-cfg.sh FORCE + $(call filechk,conf_cfg) + +clean-files += *conf-cfg diff --git a/src/net/scripts/kconfig/conf.c b/src/net/scripts/kconfig/conf.c new file mode 100644 index 0000000..f6e548b --- /dev/null +++ b/src/net/scripts/kconfig/conf.c @@ -0,0 +1,727 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + */ + +#include <ctype.h> +#include <limits.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> +#include <unistd.h> +#include <getopt.h> +#include <sys/stat.h> +#include <sys/time.h> +#include <errno.h> + +#include "lkc.h" + +static void conf(struct menu *menu); +static void check_conf(struct menu *menu); + +enum input_mode { + oldaskconfig, + syncconfig, + oldconfig, + allnoconfig, + allyesconfig, + allmodconfig, + alldefconfig, + randconfig, + defconfig, + savedefconfig, + listnewconfig, + helpnewconfig, + olddefconfig, + yes2modconfig, + mod2yesconfig, +}; +static enum input_mode input_mode = oldaskconfig; + +static int indent = 1; +static int tty_stdio; +static int sync_kconfig; +static int conf_cnt; +static char line[PATH_MAX]; +static struct menu *rootEntry; + +static void print_help(struct menu *menu) +{ + struct gstr help = str_new(); + + menu_get_ext_help(menu, &help); + + printf("\n%s\n", str_get(&help)); + str_free(&help); +} + +static void strip(char *str) +{ + char *p = str; + int l; + + while ((isspace(*p))) + p++; + l = strlen(p); + if (p != str) + memmove(str, p, l + 1); + if (!l) + return; + p = str + l - 1; + while ((isspace(*p))) + *p-- = 0; +} + +/* Helper function to facilitate fgets() by Jean Sacren. */ +static void xfgets(char *str, int size, FILE *in) +{ + if (!fgets(str, size, in)) + fprintf(stderr, "\nError in reading or end of file.\n"); + + if (!tty_stdio) + printf("%s", str); +} + +static int conf_askvalue(struct symbol *sym, const char *def) +{ + enum symbol_type type = sym_get_type(sym); + + if (!sym_has_value(sym)) + printf("(NEW) "); + + line[0] = '\n'; + line[1] = 0; + + if (!sym_is_changeable(sym)) { + printf("%s\n", def); + line[0] = '\n'; + line[1] = 0; + return 0; + } + + switch (input_mode) { + case oldconfig: + case syncconfig: + if (sym_has_value(sym)) { + printf("%s\n", def); + return 0; + } + /* fall through */ + case oldaskconfig: + fflush(stdout); + xfgets(line, sizeof(line), stdin); + return 1; + default: + break; + } + + switch (type) { + case S_INT: + case S_HEX: + case S_STRING: + printf("%s\n", def); + return 1; + default: + ; + } + printf("%s", line); + return 1; +} + +static int conf_string(struct menu *menu) +{ + struct symbol *sym = menu->sym; + const char *def; + + while (1) { + printf("%*s%s ", indent - 1, "", menu->prompt->text); + printf("(%s) ", sym->name); + def = sym_get_string_value(sym); + if (sym_get_string_value(sym)) + printf("[%s] ", def); + if (!conf_askvalue(sym, def)) + return 0; + switch (line[0]) { + case '\n': + break; + case '?': + /* print help */ + if (line[1] == '\n') { + print_help(menu); + def = NULL; + break; + } + /* fall through */ + default: + line[strlen(line)-1] = 0; + def = line; + } + if (def && sym_set_string_value(sym, def)) + return 0; + } +} + +static int conf_sym(struct menu *menu) +{ + struct symbol *sym = menu->sym; + tristate oldval, newval; + + while (1) { + printf("%*s%s ", indent - 1, "", menu->prompt->text); + if (sym->name) + printf("(%s) ", sym->name); + putchar('['); + oldval = sym_get_tristate_value(sym); + switch (oldval) { + case no: + putchar('N'); + break; + case mod: + putchar('M'); + break; + case yes: + putchar('Y'); + break; + } + if (oldval != no && sym_tristate_within_range(sym, no)) + printf("/n"); + if (oldval != mod && sym_tristate_within_range(sym, mod)) + printf("/m"); + if (oldval != yes && sym_tristate_within_range(sym, yes)) + printf("/y"); + printf("/?] "); + if (!conf_askvalue(sym, sym_get_string_value(sym))) + return 0; + strip(line); + + switch (line[0]) { + case 'n': + case 'N': + newval = no; + if (!line[1] || !strcmp(&line[1], "o")) + break; + continue; + case 'm': + case 'M': + newval = mod; + if (!line[1]) + break; + continue; + case 'y': + case 'Y': + newval = yes; + if (!line[1] || !strcmp(&line[1], "es")) + break; + continue; + case 0: + newval = oldval; + break; + case '?': + goto help; + default: + continue; + } + if (sym_set_tristate_value(sym, newval)) + return 0; +help: + print_help(menu); + } +} + +static int conf_choice(struct menu *menu) +{ + struct symbol *sym, *def_sym; + struct menu *child; + bool is_new; + + sym = menu->sym; + is_new = !sym_has_value(sym); + if (sym_is_changeable(sym)) { + conf_sym(menu); + sym_calc_value(sym); + switch (sym_get_tristate_value(sym)) { + case no: + return 1; + case mod: + return 0; + case yes: + break; + } + } else { + switch (sym_get_tristate_value(sym)) { + case no: + return 1; + case mod: + printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu)); + return 0; + case yes: + break; + } + } + + while (1) { + int cnt, def; + + printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu)); + def_sym = sym_get_choice_value(sym); + cnt = def = 0; + line[0] = 0; + for (child = menu->list; child; child = child->next) { + if (!menu_is_visible(child)) + continue; + if (!child->sym) { + printf("%*c %s\n", indent, '*', menu_get_prompt(child)); + continue; + } + cnt++; + if (child->sym == def_sym) { + def = cnt; + printf("%*c", indent, '>'); + } else + printf("%*c", indent, ' '); + printf(" %d. %s", cnt, menu_get_prompt(child)); + if (child->sym->name) + printf(" (%s)", child->sym->name); + if (!sym_has_value(child->sym)) + printf(" (NEW)"); + printf("\n"); + } + printf("%*schoice", indent - 1, ""); + if (cnt == 1) { + printf("[1]: 1\n"); + goto conf_childs; + } + printf("[1-%d?]: ", cnt); + switch (input_mode) { + case oldconfig: + case syncconfig: + if (!is_new) { + cnt = def; + printf("%d\n", cnt); + break; + } + /* fall through */ + case oldaskconfig: + fflush(stdout); + xfgets(line, sizeof(line), stdin); + strip(line); + if (line[0] == '?') { + print_help(menu); + continue; + } + if (!line[0]) + cnt = def; + else if (isdigit(line[0])) + cnt = atoi(line); + else + continue; + break; + default: + break; + } + + conf_childs: + for (child = menu->list; child; child = child->next) { + if (!child->sym || !menu_is_visible(child)) + continue; + if (!--cnt) + break; + } + if (!child) + continue; + if (line[0] && line[strlen(line) - 1] == '?') { + print_help(child); + continue; + } + sym_set_choice_value(sym, child->sym); + for (child = child->list; child; child = child->next) { + indent += 2; + conf(child); + indent -= 2; + } + return 1; + } +} + +static void conf(struct menu *menu) +{ + struct symbol *sym; + struct property *prop; + struct menu *child; + + if (!menu_is_visible(menu)) + return; + + sym = menu->sym; + prop = menu->prompt; + if (prop) { + const char *prompt; + + switch (prop->type) { + case P_MENU: + /* + * Except in oldaskconfig mode, we show only menus that + * contain new symbols. + */ + if (input_mode != oldaskconfig && rootEntry != menu) { + check_conf(menu); + return; + } + /* fall through */ + case P_COMMENT: + prompt = menu_get_prompt(menu); + if (prompt) + printf("%*c\n%*c %s\n%*c\n", + indent, '*', + indent, '*', prompt, + indent, '*'); + default: + ; + } + } + + if (!sym) + goto conf_childs; + + if (sym_is_choice(sym)) { + conf_choice(menu); + if (sym->curr.tri != mod) + return; + goto conf_childs; + } + + switch (sym->type) { + case S_INT: + case S_HEX: + case S_STRING: + conf_string(menu); + break; + default: + conf_sym(menu); + break; + } + +conf_childs: + if (sym) + indent += 2; + for (child = menu->list; child; child = child->next) + conf(child); + if (sym) + indent -= 2; +} + +static void check_conf(struct menu *menu) +{ + struct symbol *sym; + struct menu *child; + + if (!menu_is_visible(menu)) + return; + + sym = menu->sym; + if (sym && !sym_has_value(sym)) { + if (sym_is_changeable(sym) || + (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) { + if (input_mode == listnewconfig) { + if (sym->name) { + const char *str; + + if (sym->type == S_STRING) { + str = sym_get_string_value(sym); + str = sym_escape_string_value(str); + printf("%s%s=%s\n", CONFIG_, sym->name, str); + free((void *)str); + } else { + str = sym_get_string_value(sym); + printf("%s%s=%s\n", CONFIG_, sym->name, str); + } + } + } else if (input_mode == helpnewconfig) { + printf("-----\n"); + print_help(menu); + printf("-----\n"); + + } else { + if (!conf_cnt++) + printf("*\n* Restart config...\n*\n"); + rootEntry = menu_get_parent_menu(menu); + conf(rootEntry); + } + } + } + + for (child = menu->list; child; child = child->next) + check_conf(child); +} + +static struct option long_opts[] = { + {"oldaskconfig", no_argument, NULL, oldaskconfig}, + {"oldconfig", no_argument, NULL, oldconfig}, + {"syncconfig", no_argument, NULL, syncconfig}, + {"defconfig", required_argument, NULL, defconfig}, + {"savedefconfig", required_argument, NULL, savedefconfig}, + {"allnoconfig", no_argument, NULL, allnoconfig}, + {"allyesconfig", no_argument, NULL, allyesconfig}, + {"allmodconfig", no_argument, NULL, allmodconfig}, + {"alldefconfig", no_argument, NULL, alldefconfig}, + {"randconfig", no_argument, NULL, randconfig}, + {"listnewconfig", no_argument, NULL, listnewconfig}, + {"helpnewconfig", no_argument, NULL, helpnewconfig}, + {"olddefconfig", no_argument, NULL, olddefconfig}, + {"yes2modconfig", no_argument, NULL, yes2modconfig}, + {"mod2yesconfig", no_argument, NULL, mod2yesconfig}, + {NULL, 0, NULL, 0} +}; + +static void conf_usage(const char *progname) +{ + + printf("Usage: %s [-s] [option] <kconfig-file>\n", progname); + printf("[option] is _one_ of the following:\n"); + printf(" --listnewconfig List new options\n"); + printf(" --helpnewconfig List new options and help text\n"); + printf(" --oldaskconfig Start a new configuration using a line-oriented program\n"); + printf(" --oldconfig Update a configuration using a provided .config as base\n"); + printf(" --syncconfig Similar to oldconfig but generates configuration in\n" + " include/{generated/,config/}\n"); + printf(" --olddefconfig Same as oldconfig but sets new symbols to their default value\n"); + printf(" --defconfig <file> New config with default defined in <file>\n"); + printf(" --savedefconfig <file> Save the minimal current configuration to <file>\n"); + printf(" --allnoconfig New config where all options are answered with no\n"); + printf(" --allyesconfig New config where all options are answered with yes\n"); + printf(" --allmodconfig New config where all options are answered with mod\n"); + printf(" --alldefconfig New config with all symbols set to default\n"); + printf(" --randconfig New config with random answer to all options\n"); + printf(" --yes2modconfig Change answers from yes to mod if possible\n"); + printf(" --mod2yesconfig Change answers from mod to yes if possible\n"); +} + +int main(int ac, char **av) +{ + const char *progname = av[0]; + int opt; + const char *name, *defconfig_file = NULL /* gcc uninit */; + int no_conf_write = 0; + + tty_stdio = isatty(0) && isatty(1); + + while ((opt = getopt_long(ac, av, "s", long_opts, NULL)) != -1) { + if (opt == 's') { + conf_set_message_callback(NULL); + continue; + } + input_mode = (enum input_mode)opt; + switch (opt) { + case syncconfig: + /* + * syncconfig is invoked during the build stage. + * Suppress distracting "configuration written to ..." + */ + conf_set_message_callback(NULL); + sync_kconfig = 1; + break; + case defconfig: + case savedefconfig: + defconfig_file = optarg; + break; + case randconfig: + { + struct timeval now; + unsigned int seed; + char *seed_env; + + /* + * Use microseconds derived seed, + * compensate for systems where it may be zero + */ + gettimeofday(&now, NULL); + seed = (unsigned int)((now.tv_sec + 1) * (now.tv_usec + 1)); + + seed_env = getenv("KCONFIG_SEED"); + if( seed_env && *seed_env ) { + char *endp; + int tmp = (int)strtol(seed_env, &endp, 0); + if (*endp == '\0') { + seed = tmp; + } + } + fprintf( stderr, "KCONFIG_SEED=0x%X\n", seed ); + srand(seed); + break; + } + case oldaskconfig: + case oldconfig: + case allnoconfig: + case allyesconfig: + case allmodconfig: + case alldefconfig: + case listnewconfig: + case helpnewconfig: + case olddefconfig: + case yes2modconfig: + case mod2yesconfig: + break; + case '?': + conf_usage(progname); + exit(1); + break; + } + } + if (ac == optind) { + fprintf(stderr, "%s: Kconfig file missing\n", av[0]); + conf_usage(progname); + exit(1); + } + name = av[optind]; + conf_parse(name); + //zconfdump(stdout); + + switch (input_mode) { + case defconfig: + if (conf_read(defconfig_file)) { + fprintf(stderr, + "***\n" + "*** Can't find default configuration \"%s\"!\n" + "***\n", + defconfig_file); + exit(1); + } + break; + case savedefconfig: + case syncconfig: + case oldaskconfig: + case oldconfig: + case listnewconfig: + case helpnewconfig: + case olddefconfig: + case yes2modconfig: + case mod2yesconfig: + conf_read(NULL); + break; + case allnoconfig: + case allyesconfig: + case allmodconfig: + case alldefconfig: + case randconfig: + name = getenv("KCONFIG_ALLCONFIG"); + if (!name) + break; + if ((strcmp(name, "") != 0) && (strcmp(name, "1") != 0)) { + if (conf_read_simple(name, S_DEF_USER)) { + fprintf(stderr, + "*** Can't read seed configuration \"%s\"!\n", + name); + exit(1); + } + break; + } + switch (input_mode) { + case allnoconfig: name = "allno.config"; break; + case allyesconfig: name = "allyes.config"; break; + case allmodconfig: name = "allmod.config"; break; + case alldefconfig: name = "alldef.config"; break; + case randconfig: name = "allrandom.config"; break; + default: break; + } + if (conf_read_simple(name, S_DEF_USER) && + conf_read_simple("all.config", S_DEF_USER)) { + fprintf(stderr, + "*** KCONFIG_ALLCONFIG set, but no \"%s\" or \"all.config\" file found\n", + name); + exit(1); + } + break; + default: + break; + } + + if (sync_kconfig) { + name = getenv("KCONFIG_NOSILENTUPDATE"); + if (name && *name) { + if (conf_get_changed()) { + fprintf(stderr, + "\n*** The configuration requires explicit update.\n\n"); + return 1; + } + no_conf_write = 1; + } + } + + switch (input_mode) { + case allnoconfig: + conf_set_all_new_symbols(def_no); + break; + case allyesconfig: + conf_set_all_new_symbols(def_yes); + break; + case allmodconfig: + conf_set_all_new_symbols(def_mod); + break; + case alldefconfig: + conf_set_all_new_symbols(def_default); + break; + case randconfig: + /* Really nothing to do in this loop */ + while (conf_set_all_new_symbols(def_random)) ; + break; + case defconfig: + conf_set_all_new_symbols(def_default); + break; + case savedefconfig: + break; + case yes2modconfig: + conf_rewrite_mod_or_yes(def_y2m); + break; + case mod2yesconfig: + conf_rewrite_mod_or_yes(def_m2y); + break; + case oldaskconfig: + rootEntry = &rootmenu; + conf(&rootmenu); + input_mode = oldconfig; + /* fall through */ + case oldconfig: + case listnewconfig: + case helpnewconfig: + case syncconfig: + /* Update until a loop caused no more changes */ + do { + conf_cnt = 0; + check_conf(&rootmenu); + } while (conf_cnt); + break; + case olddefconfig: + default: + break; + } + + if (input_mode == savedefconfig) { + if (conf_write_defconfig(defconfig_file)) { + fprintf(stderr, "n*** Error while saving defconfig to: %s\n\n", + defconfig_file); + return 1; + } + } else if (input_mode != listnewconfig && input_mode != helpnewconfig) { + if (!no_conf_write && conf_write(NULL)) { + fprintf(stderr, "\n*** Error during writing of the configuration.\n\n"); + exit(1); + } + + /* + * Create auto.conf if it does not exist. + * This prevents GNU Make 4.1 or older from emitting + * "include/config/auto.conf: No such file or directory" + * in the top-level Makefile + * + * syncconfig always creates or updates auto.conf because it is + * used during the build. + */ + if (conf_write_autoconf(sync_kconfig) && sync_kconfig) { + fprintf(stderr, + "\n*** Error during sync of the configuration.\n\n"); + return 1; + } + } + return 0; +} diff --git a/src/net/scripts/kconfig/confdata.c b/src/net/scripts/kconfig/confdata.c new file mode 100644 index 0000000..867b06c --- /dev/null +++ b/src/net/scripts/kconfig/confdata.c @@ -0,0 +1,1343 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + */ + +#include <sys/mman.h> +#include <sys/stat.h> +#include <ctype.h> +#include <errno.h> +#include <fcntl.h> +#include <limits.h> +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> +#include <unistd.h> + +#include "lkc.h" + +/* return true if 'path' exists, false otherwise */ +static bool is_present(const char *path) +{ + struct stat st; + + return !stat(path, &st); +} + +/* return true if 'path' exists and it is a directory, false otherwise */ +static bool is_dir(const char *path) +{ + struct stat st; + + if (stat(path, &st)) + return 0; + + return S_ISDIR(st.st_mode); +} + +/* return true if the given two files are the same, false otherwise */ +static bool is_same(const char *file1, const char *file2) +{ + int fd1, fd2; + struct stat st1, st2; + void *map1, *map2; + bool ret = false; + + fd1 = open(file1, O_RDONLY); + if (fd1 < 0) + return ret; + + fd2 = open(file2, O_RDONLY); + if (fd2 < 0) + goto close1; + + ret = fstat(fd1, &st1); + if (ret) + goto close2; + ret = fstat(fd2, &st2); + if (ret) + goto close2; + + if (st1.st_size != st2.st_size) + goto close2; + + map1 = mmap(NULL, st1.st_size, PROT_READ, MAP_PRIVATE, fd1, 0); + if (map1 == MAP_FAILED) + goto close2; + + map2 = mmap(NULL, st2.st_size, PROT_READ, MAP_PRIVATE, fd2, 0); + if (map2 == MAP_FAILED) + goto close2; + + if (bcmp(map1, map2, st1.st_size)) + goto close2; + + ret = true; +close2: + close(fd2); +close1: + close(fd1); + + return ret; +} + +/* + * Create the parent directory of the given path. + * + * For example, if 'include/config/auto.conf' is given, create 'include/config'. + */ +static int make_parent_dir(const char *path) +{ + char tmp[PATH_MAX + 1]; + char *p; + + strncpy(tmp, path, sizeof(tmp)); + tmp[sizeof(tmp) - 1] = 0; + + /* Remove the base name. Just return if nothing is left */ + p = strrchr(tmp, '/'); + if (!p) + return 0; + *(p + 1) = 0; + + /* Just in case it is an absolute path */ + p = tmp; + while (*p == '/') + p++; + + while ((p = strchr(p, '/'))) { + *p = 0; + + /* skip if the directory exists */ + if (!is_dir(tmp) && mkdir(tmp, 0755)) + return -1; + + *p = '/'; + while (*p == '/') + p++; + } + + return 0; +} + +static char depfile_path[PATH_MAX]; +static size_t depfile_prefix_len; + +/* touch depfile for symbol 'name' */ +static int conf_touch_dep(const char *name) +{ + int fd, ret; + const char *s; + char *d, c; + + /* check overflow: prefix + name + ".h" + '\0' must fit in buffer. */ + if (depfile_prefix_len + strlen(name) + 3 > sizeof(depfile_path)) + return -1; + + d = depfile_path + depfile_prefix_len; + s = name; + + while ((c = *s++)) + *d++ = (c == '_') ? '/' : tolower(c); + strcpy(d, ".h"); + + /* Assume directory path already exists. */ + fd = open(depfile_path, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd == -1) { + if (errno != ENOENT) + return -1; + + ret = make_parent_dir(depfile_path); + if (ret) + return ret; + + /* Try it again. */ + fd = open(depfile_path, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd == -1) + return -1; + } + close(fd); + + return 0; +} + +struct conf_printer { + void (*print_symbol)(FILE *, struct symbol *, const char *, void *); + void (*print_comment)(FILE *, const char *, void *); +}; + +static void conf_warning(const char *fmt, ...) + __attribute__ ((format (printf, 1, 2))); + +static void conf_message(const char *fmt, ...) + __attribute__ ((format (printf, 1, 2))); + +static const char *conf_filename; +static int conf_lineno, conf_warnings; + +static void conf_warning(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + fprintf(stderr, "%s:%d:warning: ", conf_filename, conf_lineno); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); + conf_warnings++; +} + +static void conf_default_message_callback(const char *s) +{ + printf("#\n# "); + printf("%s", s); + printf("\n#\n"); +} + +static void (*conf_message_callback)(const char *s) = + conf_default_message_callback; +void conf_set_message_callback(void (*fn)(const char *s)) +{ + conf_message_callback = fn; +} + +static void conf_message(const char *fmt, ...) +{ + va_list ap; + char buf[4096]; + + if (!conf_message_callback) + return; + + va_start(ap, fmt); + + vsnprintf(buf, sizeof(buf), fmt, ap); + conf_message_callback(buf); + va_end(ap); +} + +const char *conf_get_configname(void) +{ + char *name = getenv("KCONFIG_CONFIG"); + + return name ? name : ".config"; +} + +static const char *conf_get_autoconfig_name(void) +{ + char *name = getenv("KCONFIG_AUTOCONFIG"); + + return name ? name : "include/config/auto.conf"; +} + +static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p) +{ + char *p2; + + switch (sym->type) { + case S_TRISTATE: + if (p[0] == 'm') { + sym->def[def].tri = mod; + sym->flags |= def_flags; + break; + } + /* fall through */ + case S_BOOLEAN: + if (p[0] == 'y') { + sym->def[def].tri = yes; + sym->flags |= def_flags; + break; + } + if (p[0] == 'n') { + sym->def[def].tri = no; + sym->flags |= def_flags; + break; + } + if (def != S_DEF_AUTO) + conf_warning("symbol value '%s' invalid for %s", + p, sym->name); + return 1; + case S_STRING: + if (*p++ != '"') + break; + for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) { + if (*p2 == '"') { + *p2 = 0; + break; + } + memmove(p2, p2 + 1, strlen(p2)); + } + if (!p2) { + if (def != S_DEF_AUTO) + conf_warning("invalid string found"); + return 1; + } + /* fall through */ + case S_INT: + case S_HEX: + if (sym_string_valid(sym, p)) { + sym->def[def].val = xstrdup(p); + sym->flags |= def_flags; + } else { + if (def != S_DEF_AUTO) + conf_warning("symbol value '%s' invalid for %s", + p, sym->name); + return 1; + } + break; + default: + ; + } + return 0; +} + +#define LINE_GROWTH 16 +static int add_byte(int c, char **lineptr, size_t slen, size_t *n) +{ + char *nline; + size_t new_size = slen + 1; + if (new_size > *n) { + new_size += LINE_GROWTH - 1; + new_size *= 2; + nline = xrealloc(*lineptr, new_size); + if (!nline) + return -1; + + *lineptr = nline; + *n = new_size; + } + + (*lineptr)[slen] = c; + + return 0; +} + +static ssize_t compat_getline(char **lineptr, size_t *n, FILE *stream) +{ + char *line = *lineptr; + size_t slen = 0; + + for (;;) { + int c = getc(stream); + + switch (c) { + case '\n': + if (add_byte(c, &line, slen, n) < 0) + goto e_out; + slen++; + /* fall through */ + case EOF: + if (add_byte('\0', &line, slen, n) < 0) + goto e_out; + *lineptr = line; + if (slen == 0) + return -1; + return slen; + default: + if (add_byte(c, &line, slen, n) < 0) + goto e_out; + slen++; + } + } + +e_out: + line[slen-1] = '\0'; + *lineptr = line; + return -1; +} + +int conf_read_simple(const char *name, int def) +{ + FILE *in = NULL; + char *line = NULL; + size_t line_asize = 0; + char *p, *p2; + struct symbol *sym; + int i, def_flags; + + if (name) { + in = zconf_fopen(name); + } else { + struct property *prop; + + name = conf_get_configname(); + in = zconf_fopen(name); + if (in) + goto load; + sym_add_change_count(1); + if (!sym_defconfig_list) + return 1; + + for_all_defaults(sym_defconfig_list, prop) { + if (expr_calc_value(prop->visible.expr) == no || + prop->expr->type != E_SYMBOL) + continue; + sym_calc_value(prop->expr->left.sym); + name = sym_get_string_value(prop->expr->left.sym); + in = zconf_fopen(name); + if (in) { + conf_message("using defaults found in %s", + name); + goto load; + } + } + } + if (!in) + return 1; + +load: + conf_filename = name; + conf_lineno = 0; + conf_warnings = 0; + + def_flags = SYMBOL_DEF << def; + for_all_symbols(i, sym) { + sym->flags |= SYMBOL_CHANGED; + sym->flags &= ~(def_flags|SYMBOL_VALID); + if (sym_is_choice(sym)) + sym->flags |= def_flags; + switch (sym->type) { + case S_INT: + case S_HEX: + case S_STRING: + if (sym->def[def].val) + free(sym->def[def].val); + /* fall through */ + default: + sym->def[def].val = NULL; + sym->def[def].tri = no; + } + } + + while (compat_getline(&line, &line_asize, in) != -1) { + conf_lineno++; + sym = NULL; + if (line[0] == '#') { + if (memcmp(line + 2, CONFIG_, strlen(CONFIG_))) + continue; + p = strchr(line + 2 + strlen(CONFIG_), ' '); + if (!p) + continue; + *p++ = 0; + if (strncmp(p, "is not set", 10)) + continue; + if (def == S_DEF_USER) { + sym = sym_find(line + 2 + strlen(CONFIG_)); + if (!sym) { + sym_add_change_count(1); + continue; + } + } else { + sym = sym_lookup(line + 2 + strlen(CONFIG_), 0); + if (sym->type == S_UNKNOWN) + sym->type = S_BOOLEAN; + } + if (sym->flags & def_flags) { + conf_warning("override: reassigning to symbol %s", sym->name); + } + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + sym->def[def].tri = no; + sym->flags |= def_flags; + break; + default: + ; + } + } else if (memcmp(line, CONFIG_, strlen(CONFIG_)) == 0) { + p = strchr(line + strlen(CONFIG_), '='); + if (!p) + continue; + *p++ = 0; + p2 = strchr(p, '\n'); + if (p2) { + *p2-- = 0; + if (*p2 == '\r') + *p2 = 0; + } + + sym = sym_find(line + strlen(CONFIG_)); + if (!sym) { + if (def == S_DEF_AUTO) + /* + * Reading from include/config/auto.conf + * If CONFIG_FOO previously existed in + * auto.conf but it is missing now, + * include/config/foo.h must be touched. + */ + conf_touch_dep(line + strlen(CONFIG_)); + else + sym_add_change_count(1); + continue; + } + + if (sym->flags & def_flags) { + conf_warning("override: reassigning to symbol %s", sym->name); + } + if (conf_set_sym_val(sym, def, def_flags, p)) + continue; + } else { + if (line[0] != '\r' && line[0] != '\n') + conf_warning("unexpected data: %.*s", + (int)strcspn(line, "\r\n"), line); + + continue; + } + + if (sym && sym_is_choice_value(sym)) { + struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym)); + switch (sym->def[def].tri) { + case no: + break; + case mod: + if (cs->def[def].tri == yes) { + conf_warning("%s creates inconsistent choice state", sym->name); + cs->flags &= ~def_flags; + } + break; + case yes: + if (cs->def[def].tri != no) + conf_warning("override: %s changes choice state", sym->name); + cs->def[def].val = sym; + break; + } + cs->def[def].tri = EXPR_OR(cs->def[def].tri, sym->def[def].tri); + } + } + free(line); + fclose(in); + return 0; +} + +int conf_read(const char *name) +{ + struct symbol *sym; + int conf_unsaved = 0; + int i; + + sym_set_change_count(0); + + if (conf_read_simple(name, S_DEF_USER)) { + sym_calc_value(modules_sym); + return 1; + } + + sym_calc_value(modules_sym); + + for_all_symbols(i, sym) { + sym_calc_value(sym); + if (sym_is_choice(sym) || (sym->flags & SYMBOL_NO_WRITE)) + continue; + if (sym_has_value(sym) && (sym->flags & SYMBOL_WRITE)) { + /* check that calculated value agrees with saved value */ + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + if (sym->def[S_DEF_USER].tri == sym_get_tristate_value(sym)) + continue; + break; + default: + if (!strcmp(sym->curr.val, sym->def[S_DEF_USER].val)) + continue; + break; + } + } else if (!sym_has_value(sym) && !(sym->flags & SYMBOL_WRITE)) + /* no previous value and not saved */ + continue; + conf_unsaved++; + /* maybe print value in verbose mode... */ + } + + for_all_symbols(i, sym) { + if (sym_has_value(sym) && !sym_is_choice_value(sym)) { + /* Reset values of generates values, so they'll appear + * as new, if they should become visible, but that + * doesn't quite work if the Kconfig and the saved + * configuration disagree. + */ + if (sym->visible == no && !conf_unsaved) + sym->flags &= ~SYMBOL_DEF_USER; + switch (sym->type) { + case S_STRING: + case S_INT: + case S_HEX: + /* Reset a string value if it's out of range */ + if (sym_string_within_range(sym, sym->def[S_DEF_USER].val)) + break; + sym->flags &= ~(SYMBOL_VALID|SYMBOL_DEF_USER); + conf_unsaved++; + break; + default: + break; + } + } + } + + sym_add_change_count(conf_warnings || conf_unsaved); + + return 0; +} + +/* + * Kconfig configuration printer + * + * This printer is used when generating the resulting configuration after + * kconfig invocation and `defconfig' files. Unset symbol might be omitted by + * passing a non-NULL argument to the printer. + * + */ +static void +kconfig_print_symbol(FILE *fp, struct symbol *sym, const char *value, void *arg) +{ + + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + if (*value == 'n') { + bool skip_unset = (arg != NULL); + + if (!skip_unset) + fprintf(fp, "# %s%s is not set\n", + CONFIG_, sym->name); + return; + } + break; + default: + break; + } + + fprintf(fp, "%s%s=%s\n", CONFIG_, sym->name, value); +} + +static void +kconfig_print_comment(FILE *fp, const char *value, void *arg) +{ + const char *p = value; + size_t l; + + for (;;) { + l = strcspn(p, "\n"); + fprintf(fp, "#"); + if (l) { + fprintf(fp, " "); + xfwrite(p, l, 1, fp); + p += l; + } + fprintf(fp, "\n"); + if (*p++ == '\0') + break; + } +} + +static struct conf_printer kconfig_printer_cb = +{ + .print_symbol = kconfig_print_symbol, + .print_comment = kconfig_print_comment, +}; + +/* + * Header printer + * + * This printer is used when generating the `include/generated/autoconf.h' file. + */ +static void +header_print_symbol(FILE *fp, struct symbol *sym, const char *value, void *arg) +{ + + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: { + const char *suffix = ""; + + switch (*value) { + case 'n': + break; + case 'm': + suffix = "_MODULE"; + /* fall through */ + default: + fprintf(fp, "#define %s%s%s 1\n", + CONFIG_, sym->name, suffix); + } + break; + } + case S_HEX: { + const char *prefix = ""; + + if (value[0] != '0' || (value[1] != 'x' && value[1] != 'X')) + prefix = "0x"; + fprintf(fp, "#define %s%s %s%s\n", + CONFIG_, sym->name, prefix, value); + break; + } + case S_STRING: + case S_INT: + fprintf(fp, "#define %s%s %s\n", + CONFIG_, sym->name, value); + break; + default: + break; + } + +} + +static void +header_print_comment(FILE *fp, const char *value, void *arg) +{ + const char *p = value; + size_t l; + + fprintf(fp, "/*\n"); + for (;;) { + l = strcspn(p, "\n"); + fprintf(fp, " *"); + if (l) { + fprintf(fp, " "); + xfwrite(p, l, 1, fp); + p += l; + } + fprintf(fp, "\n"); + if (*p++ == '\0') + break; + } + fprintf(fp, " */\n"); +} + +static struct conf_printer header_printer_cb = +{ + .print_symbol = header_print_symbol, + .print_comment = header_print_comment, +}; + +static void conf_write_symbol(FILE *fp, struct symbol *sym, + struct conf_printer *printer, void *printer_arg) +{ + const char *str; + + switch (sym->type) { + case S_UNKNOWN: + break; + case S_STRING: + str = sym_get_string_value(sym); + str = sym_escape_string_value(str); + printer->print_symbol(fp, sym, str, printer_arg); + free((void *)str); + break; + default: + str = sym_get_string_value(sym); + printer->print_symbol(fp, sym, str, printer_arg); + } +} + +static void +conf_write_heading(FILE *fp, struct conf_printer *printer, void *printer_arg) +{ + char buf[256]; + + snprintf(buf, sizeof(buf), + "\n" + "Automatically generated file; DO NOT EDIT.\n" + "%s\n", + rootmenu.prompt->text); + + printer->print_comment(fp, buf, printer_arg); +} + +/* + * Write out a minimal config. + * All values that has default values are skipped as this is redundant. + */ +int conf_write_defconfig(const char *filename) +{ + struct symbol *sym; + struct menu *menu; + FILE *out; + + out = fopen(filename, "w"); + if (!out) + return 1; + + sym_clear_all_valid(); + + /* Traverse all menus to find all relevant symbols */ + menu = rootmenu.list; + + while (menu != NULL) + { + sym = menu->sym; + if (sym == NULL) { + if (!menu_is_visible(menu)) + goto next_menu; + } else if (!sym_is_choice(sym)) { + sym_calc_value(sym); + if (!(sym->flags & SYMBOL_WRITE)) + goto next_menu; + sym->flags &= ~SYMBOL_WRITE; + /* If we cannot change the symbol - skip */ + if (!sym_is_changeable(sym)) + goto next_menu; + /* If symbol equals to default value - skip */ + if (strcmp(sym_get_string_value(sym), sym_get_string_default(sym)) == 0) + goto next_menu; + + /* + * If symbol is a choice value and equals to the + * default for a choice - skip. + * But only if value is bool and equal to "y" and + * choice is not "optional". + * (If choice is "optional" then all values can be "n") + */ + if (sym_is_choice_value(sym)) { + struct symbol *cs; + struct symbol *ds; + + cs = prop_get_symbol(sym_get_choice_prop(sym)); + ds = sym_choice_default(cs); + if (!sym_is_optional(cs) && sym == ds) { + if ((sym->type == S_BOOLEAN) && + sym_get_tristate_value(sym) == yes) + goto next_menu; + } + } + conf_write_symbol(out, sym, &kconfig_printer_cb, NULL); + } +next_menu: + if (menu->list != NULL) { + menu = menu->list; + } + else if (menu->next != NULL) { + menu = menu->next; + } else { + while ((menu = menu->parent)) { + if (menu->next != NULL) { + menu = menu->next; + break; + } + } + } + } + fclose(out); + return 0; +} + +int conf_write(const char *name) +{ + FILE *out; + struct symbol *sym; + struct menu *menu; + const char *str; + char tmpname[PATH_MAX + 1], oldname[PATH_MAX + 1]; + char *env; + int i; + bool need_newline = false; + + if (!name) + name = conf_get_configname(); + + if (!*name) { + fprintf(stderr, "config name is empty\n"); + return -1; + } + + if (is_dir(name)) { + fprintf(stderr, "%s: Is a directory\n", name); + return -1; + } + + if (make_parent_dir(name)) + return -1; + + env = getenv("KCONFIG_OVERWRITECONFIG"); + if (env && *env) { + *tmpname = 0; + out = fopen(name, "w"); + } else { + snprintf(tmpname, sizeof(tmpname), "%s.%d.tmp", + name, (int)getpid()); + out = fopen(tmpname, "w"); + } + if (!out) + return 1; + + conf_write_heading(out, &kconfig_printer_cb, NULL); + + if (!conf_get_changed()) + sym_clear_all_valid(); + + menu = rootmenu.list; + while (menu) { + sym = menu->sym; + if (!sym) { + if (!menu_is_visible(menu)) + goto next; + str = menu_get_prompt(menu); + fprintf(out, "\n" + "#\n" + "# %s\n" + "#\n", str); + need_newline = false; + } else if (!(sym->flags & SYMBOL_CHOICE) && + !(sym->flags & SYMBOL_WRITTEN)) { + sym_calc_value(sym); + if (!(sym->flags & SYMBOL_WRITE)) + goto next; + if (need_newline) { + fprintf(out, "\n"); + need_newline = false; + } + sym->flags |= SYMBOL_WRITTEN; + conf_write_symbol(out, sym, &kconfig_printer_cb, NULL); + } + +next: + if (menu->list) { + menu = menu->list; + continue; + } + if (menu->next) + menu = menu->next; + else while ((menu = menu->parent)) { + if (!menu->sym && menu_is_visible(menu) && + menu != &rootmenu) { + str = menu_get_prompt(menu); + fprintf(out, "# end of %s\n", str); + need_newline = true; + } + if (menu->next) { + menu = menu->next; + break; + } + } + } + fclose(out); + + for_all_symbols(i, sym) + sym->flags &= ~SYMBOL_WRITTEN; + + if (*tmpname) { + if (is_same(name, tmpname)) { + conf_message("No change to %s", name); + unlink(tmpname); + sym_set_change_count(0); + return 0; + } + + snprintf(oldname, sizeof(oldname), "%s.old", name); + rename(name, oldname); + if (rename(tmpname, name)) + return 1; + } + + conf_message("configuration written to %s", name); + + sym_set_change_count(0); + + return 0; +} + +/* write a dependency file as used by kbuild to track dependencies */ +static int conf_write_dep(const char *name) +{ + struct file *file; + FILE *out; + + out = fopen("..config.tmp", "w"); + if (!out) + return 1; + fprintf(out, "deps_config := \\\n"); + for (file = file_list; file; file = file->next) { + if (file->next) + fprintf(out, "\t%s \\\n", file->name); + else + fprintf(out, "\t%s\n", file->name); + } + fprintf(out, "\n%s: \\\n" + "\t$(deps_config)\n\n", conf_get_autoconfig_name()); + + env_write_dep(out, conf_get_autoconfig_name()); + + fprintf(out, "\n$(deps_config): ;\n"); + fclose(out); + + if (make_parent_dir(name)) + return 1; + rename("..config.tmp", name); + return 0; +} + +static int conf_touch_deps(void) +{ + const char *name, *tmp; + struct symbol *sym; + int res, i; + + name = conf_get_autoconfig_name(); + tmp = strrchr(name, '/'); + depfile_prefix_len = tmp ? tmp - name + 1 : 0; + if (depfile_prefix_len + 1 > sizeof(depfile_path)) + return -1; + + strncpy(depfile_path, name, depfile_prefix_len); + depfile_path[depfile_prefix_len] = 0; + + conf_read_simple(name, S_DEF_AUTO); + sym_calc_value(modules_sym); + + for_all_symbols(i, sym) { + sym_calc_value(sym); + if ((sym->flags & SYMBOL_NO_WRITE) || !sym->name) + continue; + if (sym->flags & SYMBOL_WRITE) { + if (sym->flags & SYMBOL_DEF_AUTO) { + /* + * symbol has old and new value, + * so compare them... + */ + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + if (sym_get_tristate_value(sym) == + sym->def[S_DEF_AUTO].tri) + continue; + break; + case S_STRING: + case S_HEX: + case S_INT: + if (!strcmp(sym_get_string_value(sym), + sym->def[S_DEF_AUTO].val)) + continue; + break; + default: + break; + } + } else { + /* + * If there is no old value, only 'no' (unset) + * is allowed as new value. + */ + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + if (sym_get_tristate_value(sym) == no) + continue; + break; + default: + break; + } + } + } else if (!(sym->flags & SYMBOL_DEF_AUTO)) + /* There is neither an old nor a new value. */ + continue; + /* else + * There is an old value, but no new value ('no' (unset) + * isn't saved in auto.conf, so the old value is always + * different from 'no'). + */ + + res = conf_touch_dep(sym->name); + if (res) + return res; + } + + return 0; +} + +int conf_write_autoconf(int overwrite) +{ + struct symbol *sym; + const char *name; + const char *autoconf_name = conf_get_autoconfig_name(); + FILE *out, *out_h; + int i; + + if (!overwrite && is_present(autoconf_name)) + return 0; + + conf_write_dep("include/config/auto.conf.cmd"); + + if (conf_touch_deps()) + return 1; + + out = fopen(".tmpconfig", "w"); + if (!out) + return 1; + + out_h = fopen(".tmpconfig.h", "w"); + if (!out_h) { + fclose(out); + return 1; + } + + conf_write_heading(out, &kconfig_printer_cb, NULL); + conf_write_heading(out_h, &header_printer_cb, NULL); + + for_all_symbols(i, sym) { + sym_calc_value(sym); + if (!(sym->flags & SYMBOL_WRITE) || !sym->name) + continue; + + /* write symbols to auto.conf and autoconf.h */ + conf_write_symbol(out, sym, &kconfig_printer_cb, (void *)1); + conf_write_symbol(out_h, sym, &header_printer_cb, NULL); + } + fclose(out); + fclose(out_h); + + name = getenv("KCONFIG_AUTOHEADER"); + if (!name) + name = "include/generated/autoconf.h"; + if (make_parent_dir(name)) + return 1; + if (rename(".tmpconfig.h", name)) + return 1; + + if (make_parent_dir(autoconf_name)) + return 1; + /* + * This must be the last step, kbuild has a dependency on auto.conf + * and this marks the successful completion of the previous steps. + */ + if (rename(".tmpconfig", autoconf_name)) + return 1; + + return 0; +} + +static int sym_change_count; +static void (*conf_changed_callback)(void); + +void sym_set_change_count(int count) +{ + int _sym_change_count = sym_change_count; + sym_change_count = count; + if (conf_changed_callback && + (bool)_sym_change_count != (bool)count) + conf_changed_callback(); +} + +void sym_add_change_count(int count) +{ + sym_set_change_count(count + sym_change_count); +} + +bool conf_get_changed(void) +{ + return sym_change_count; +} + +void conf_set_changed_callback(void (*fn)(void)) +{ + conf_changed_callback = fn; +} + +static bool randomize_choice_values(struct symbol *csym) +{ + struct property *prop; + struct symbol *sym; + struct expr *e; + int cnt, def; + + /* + * If choice is mod then we may have more items selected + * and if no then no-one. + * In both cases stop. + */ + if (csym->curr.tri != yes) + return false; + + prop = sym_get_choice_prop(csym); + + /* count entries in choice block */ + cnt = 0; + expr_list_for_each_sym(prop->expr, e, sym) + cnt++; + + /* + * find a random value and set it to yes, + * set the rest to no so we have only one set + */ + def = (rand() % cnt); + + cnt = 0; + expr_list_for_each_sym(prop->expr, e, sym) { + if (def == cnt++) { + sym->def[S_DEF_USER].tri = yes; + csym->def[S_DEF_USER].val = sym; + } + else { + sym->def[S_DEF_USER].tri = no; + } + sym->flags |= SYMBOL_DEF_USER; + /* clear VALID to get value calculated */ + sym->flags &= ~SYMBOL_VALID; + } + csym->flags |= SYMBOL_DEF_USER; + /* clear VALID to get value calculated */ + csym->flags &= ~(SYMBOL_VALID); + + return true; +} + +void set_all_choice_values(struct symbol *csym) +{ + struct property *prop; + struct symbol *sym; + struct expr *e; + + prop = sym_get_choice_prop(csym); + + /* + * Set all non-assinged choice values to no + */ + expr_list_for_each_sym(prop->expr, e, sym) { + if (!sym_has_value(sym)) + sym->def[S_DEF_USER].tri = no; + } + csym->flags |= SYMBOL_DEF_USER; + /* clear VALID to get value calculated */ + csym->flags &= ~(SYMBOL_VALID | SYMBOL_NEED_SET_CHOICE_VALUES); +} + +bool conf_set_all_new_symbols(enum conf_def_mode mode) +{ + struct symbol *sym, *csym; + int i, cnt, pby, pty, ptm; /* pby: probability of bool = y + * pty: probability of tristate = y + * ptm: probability of tristate = m + */ + + pby = 50; pty = ptm = 33; /* can't go as the default in switch-case + * below, otherwise gcc whines about + * -Wmaybe-uninitialized */ + if (mode == def_random) { + int n, p[3]; + char *env = getenv("KCONFIG_PROBABILITY"); + n = 0; + while( env && *env ) { + char *endp; + int tmp = strtol( env, &endp, 10 ); + if( tmp >= 0 && tmp <= 100 ) { + p[n++] = tmp; + } else { + errno = ERANGE; + perror( "KCONFIG_PROBABILITY" ); + exit( 1 ); + } + env = (*endp == ':') ? endp+1 : endp; + if( n >=3 ) { + break; + } + } + switch( n ) { + case 1: + pby = p[0]; ptm = pby/2; pty = pby-ptm; + break; + case 2: + pty = p[0]; ptm = p[1]; pby = pty + ptm; + break; + case 3: + pby = p[0]; pty = p[1]; ptm = p[2]; + break; + } + + if( pty+ptm > 100 ) { + errno = ERANGE; + perror( "KCONFIG_PROBABILITY" ); + exit( 1 ); + } + } + bool has_changed = false; + + for_all_symbols(i, sym) { + if (sym_has_value(sym) || (sym->flags & SYMBOL_VALID)) + continue; + switch (sym_get_type(sym)) { + case S_BOOLEAN: + case S_TRISTATE: + has_changed = true; + switch (mode) { + case def_yes: + sym->def[S_DEF_USER].tri = yes; + break; + case def_mod: + sym->def[S_DEF_USER].tri = mod; + break; + case def_no: + if (sym->flags & SYMBOL_ALLNOCONFIG_Y) + sym->def[S_DEF_USER].tri = yes; + else + sym->def[S_DEF_USER].tri = no; + break; + case def_random: + sym->def[S_DEF_USER].tri = no; + cnt = rand() % 100; + if (sym->type == S_TRISTATE) { + if (cnt < pty) + sym->def[S_DEF_USER].tri = yes; + else if (cnt < (pty+ptm)) + sym->def[S_DEF_USER].tri = mod; + } else if (cnt < pby) + sym->def[S_DEF_USER].tri = yes; + break; + default: + continue; + } + if (!(sym_is_choice(sym) && mode == def_random)) + sym->flags |= SYMBOL_DEF_USER; + break; + default: + break; + } + + } + + sym_clear_all_valid(); + + /* + * We have different type of choice blocks. + * If curr.tri equals to mod then we can select several + * choice symbols in one block. + * In this case we do nothing. + * If curr.tri equals yes then only one symbol can be + * selected in a choice block and we set it to yes, + * and the rest to no. + */ + if (mode != def_random) { + for_all_symbols(i, csym) { + if ((sym_is_choice(csym) && !sym_has_value(csym)) || + sym_is_choice_value(csym)) + csym->flags |= SYMBOL_NEED_SET_CHOICE_VALUES; + } + } + + for_all_symbols(i, csym) { + if (sym_has_value(csym) || !sym_is_choice(csym)) + continue; + + sym_calc_value(csym); + if (mode == def_random) + has_changed |= randomize_choice_values(csym); + else { + set_all_choice_values(csym); + has_changed = true; + } + } + + return has_changed; +} + +void conf_rewrite_mod_or_yes(enum conf_def_mode mode) +{ + struct symbol *sym; + int i; + tristate old_val = (mode == def_y2m) ? yes : mod; + tristate new_val = (mode == def_y2m) ? mod : yes; + + for_all_symbols(i, sym) { + if (sym_get_type(sym) == S_TRISTATE && + sym->def[S_DEF_USER].tri == old_val) + sym->def[S_DEF_USER].tri = new_val; + } + sym_clear_all_valid(); +} diff --git a/src/net/scripts/kconfig/expr.c b/src/net/scripts/kconfig/expr.c new file mode 100644 index 0000000..81ebf81 --- /dev/null +++ b/src/net/scripts/kconfig/expr.c @@ -0,0 +1,1303 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + */ + +#include <ctype.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "lkc.h" + +#define DEBUG_EXPR 0 + +static struct expr *expr_eliminate_yn(struct expr *e); + +struct expr *expr_alloc_symbol(struct symbol *sym) +{ + struct expr *e = xcalloc(1, sizeof(*e)); + e->type = E_SYMBOL; + e->left.sym = sym; + return e; +} + +struct expr *expr_alloc_one(enum expr_type type, struct expr *ce) +{ + struct expr *e = xcalloc(1, sizeof(*e)); + e->type = type; + e->left.expr = ce; + return e; +} + +struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2) +{ + struct expr *e = xcalloc(1, sizeof(*e)); + e->type = type; + e->left.expr = e1; + e->right.expr = e2; + return e; +} + +struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2) +{ + struct expr *e = xcalloc(1, sizeof(*e)); + e->type = type; + e->left.sym = s1; + e->right.sym = s2; + return e; +} + +struct expr *expr_alloc_and(struct expr *e1, struct expr *e2) +{ + if (!e1) + return e2; + return e2 ? expr_alloc_two(E_AND, e1, e2) : e1; +} + +struct expr *expr_alloc_or(struct expr *e1, struct expr *e2) +{ + if (!e1) + return e2; + return e2 ? expr_alloc_two(E_OR, e1, e2) : e1; +} + +struct expr *expr_copy(const struct expr *org) +{ + struct expr *e; + + if (!org) + return NULL; + + e = xmalloc(sizeof(*org)); + memcpy(e, org, sizeof(*org)); + switch (org->type) { + case E_SYMBOL: + e->left = org->left; + break; + case E_NOT: + e->left.expr = expr_copy(org->left.expr); + break; + case E_EQUAL: + case E_GEQ: + case E_GTH: + case E_LEQ: + case E_LTH: + case E_UNEQUAL: + e->left.sym = org->left.sym; + e->right.sym = org->right.sym; + break; + case E_AND: + case E_OR: + case E_LIST: + e->left.expr = expr_copy(org->left.expr); + e->right.expr = expr_copy(org->right.expr); + break; + default: + fprintf(stderr, "can't copy type %d\n", e->type); + free(e); + e = NULL; + break; + } + + return e; +} + +void expr_free(struct expr *e) +{ + if (!e) + return; + + switch (e->type) { + case E_SYMBOL: + break; + case E_NOT: + expr_free(e->left.expr); + break; + case E_EQUAL: + case E_GEQ: + case E_GTH: + case E_LEQ: + case E_LTH: + case E_UNEQUAL: + break; + case E_OR: + case E_AND: + expr_free(e->left.expr); + expr_free(e->right.expr); + break; + default: + fprintf(stderr, "how to free type %d?\n", e->type); + break; + } + free(e); +} + +static int trans_count; + +#define e1 (*ep1) +#define e2 (*ep2) + +/* + * expr_eliminate_eq() helper. + * + * Walks the two expression trees given in 'ep1' and 'ep2'. Any node that does + * not have type 'type' (E_OR/E_AND) is considered a leaf, and is compared + * against all other leaves. Two equal leaves are both replaced with either 'y' + * or 'n' as appropriate for 'type', to be eliminated later. + */ +static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct expr **ep2) +{ + /* Recurse down to leaves */ + + if (e1->type == type) { + __expr_eliminate_eq(type, &e1->left.expr, &e2); + __expr_eliminate_eq(type, &e1->right.expr, &e2); + return; + } + if (e2->type == type) { + __expr_eliminate_eq(type, &e1, &e2->left.expr); + __expr_eliminate_eq(type, &e1, &e2->right.expr); + return; + } + + /* e1 and e2 are leaves. Compare them. */ + + if (e1->type == E_SYMBOL && e2->type == E_SYMBOL && + e1->left.sym == e2->left.sym && + (e1->left.sym == &symbol_yes || e1->left.sym == &symbol_no)) + return; + if (!expr_eq(e1, e2)) + return; + + /* e1 and e2 are equal leaves. Prepare them for elimination. */ + + trans_count++; + expr_free(e1); expr_free(e2); + switch (type) { + case E_OR: + e1 = expr_alloc_symbol(&symbol_no); + e2 = expr_alloc_symbol(&symbol_no); + break; + case E_AND: + e1 = expr_alloc_symbol(&symbol_yes); + e2 = expr_alloc_symbol(&symbol_yes); + break; + default: + ; + } +} + +/* + * Rewrites the expressions 'ep1' and 'ep2' to remove operands common to both. + * Example reductions: + * + * ep1: A && B -> ep1: y + * ep2: A && B && C -> ep2: C + * + * ep1: A || B -> ep1: n + * ep2: A || B || C -> ep2: C + * + * ep1: A && (B && FOO) -> ep1: FOO + * ep2: (BAR && B) && A -> ep2: BAR + * + * ep1: A && (B || C) -> ep1: y + * ep2: (C || B) && A -> ep2: y + * + * Comparisons are done between all operands at the same "level" of && or ||. + * For example, in the expression 'e1 && (e2 || e3) && (e4 || e5)', the + * following operands will be compared: + * + * - 'e1', 'e2 || e3', and 'e4 || e5', against each other + * - e2 against e3 + * - e4 against e5 + * + * Parentheses are irrelevant within a single level. 'e1 && (e2 && e3)' and + * '(e1 && e2) && e3' are both a single level. + * + * See __expr_eliminate_eq() as well. + */ +void expr_eliminate_eq(struct expr **ep1, struct expr **ep2) +{ + if (!e1 || !e2) + return; + switch (e1->type) { + case E_OR: + case E_AND: + __expr_eliminate_eq(e1->type, ep1, ep2); + default: + ; + } + if (e1->type != e2->type) switch (e2->type) { + case E_OR: + case E_AND: + __expr_eliminate_eq(e2->type, ep1, ep2); + default: + ; + } + e1 = expr_eliminate_yn(e1); + e2 = expr_eliminate_yn(e2); +} + +#undef e1 +#undef e2 + +/* + * Returns true if 'e1' and 'e2' are equal, after minor simplification. Two + * &&/|| expressions are considered equal if every operand in one expression + * equals some operand in the other (operands do not need to appear in the same + * order), recursively. + */ +int expr_eq(struct expr *e1, struct expr *e2) +{ + int res, old_count; + + /* + * A NULL expr is taken to be yes, but there's also a different way to + * represent yes. expr_is_yes() checks for either representation. + */ + if (!e1 || !e2) + return expr_is_yes(e1) && expr_is_yes(e2); + + if (e1->type != e2->type) + return 0; + switch (e1->type) { + case E_EQUAL: + case E_GEQ: + case E_GTH: + case E_LEQ: + case E_LTH: + case E_UNEQUAL: + return e1->left.sym == e2->left.sym && e1->right.sym == e2->right.sym; + case E_SYMBOL: + return e1->left.sym == e2->left.sym; + case E_NOT: + return expr_eq(e1->left.expr, e2->left.expr); + case E_AND: + case E_OR: + e1 = expr_copy(e1); + e2 = expr_copy(e2); + old_count = trans_count; + expr_eliminate_eq(&e1, &e2); + res = (e1->type == E_SYMBOL && e2->type == E_SYMBOL && + e1->left.sym == e2->left.sym); + expr_free(e1); + expr_free(e2); + trans_count = old_count; + return res; + case E_LIST: + case E_RANGE: + case E_NONE: + /* panic */; + } + + if (DEBUG_EXPR) { + expr_fprint(e1, stdout); + printf(" = "); + expr_fprint(e2, stdout); + printf(" ?\n"); + } + + return 0; +} + +/* + * Recursively performs the following simplifications in-place (as well as the + * corresponding simplifications with swapped operands): + * + * expr && n -> n + * expr && y -> expr + * expr || n -> expr + * expr || y -> y + * + * Returns the optimized expression. + */ +static struct expr *expr_eliminate_yn(struct expr *e) +{ + struct expr *tmp; + + if (e) switch (e->type) { + case E_AND: + e->left.expr = expr_eliminate_yn(e->left.expr); + e->right.expr = expr_eliminate_yn(e->right.expr); + if (e->left.expr->type == E_SYMBOL) { + if (e->left.expr->left.sym == &symbol_no) { + expr_free(e->left.expr); + expr_free(e->right.expr); + e->type = E_SYMBOL; + e->left.sym = &symbol_no; + e->right.expr = NULL; + return e; + } else if (e->left.expr->left.sym == &symbol_yes) { + free(e->left.expr); + tmp = e->right.expr; + *e = *(e->right.expr); + free(tmp); + return e; + } + } + if (e->right.expr->type == E_SYMBOL) { + if (e->right.expr->left.sym == &symbol_no) { + expr_free(e->left.expr); + expr_free(e->right.expr); + e->type = E_SYMBOL; + e->left.sym = &symbol_no; + e->right.expr = NULL; + return e; + } else if (e->right.expr->left.sym == &symbol_yes) { + free(e->right.expr); + tmp = e->left.expr; + *e = *(e->left.expr); + free(tmp); + return e; + } + } + break; + case E_OR: + e->left.expr = expr_eliminate_yn(e->left.expr); + e->right.expr = expr_eliminate_yn(e->right.expr); + if (e->left.expr->type == E_SYMBOL) { + if (e->left.expr->left.sym == &symbol_no) { + free(e->left.expr); + tmp = e->right.expr; + *e = *(e->right.expr); + free(tmp); + return e; + } else if (e->left.expr->left.sym == &symbol_yes) { + expr_free(e->left.expr); + expr_free(e->right.expr); + e->type = E_SYMBOL; + e->left.sym = &symbol_yes; + e->right.expr = NULL; + return e; + } + } + if (e->right.expr->type == E_SYMBOL) { + if (e->right.expr->left.sym == &symbol_no) { + free(e->right.expr); + tmp = e->left.expr; + *e = *(e->left.expr); + free(tmp); + return e; + } else if (e->right.expr->left.sym == &symbol_yes) { + expr_free(e->left.expr); + expr_free(e->right.expr); + e->type = E_SYMBOL; + e->left.sym = &symbol_yes; + e->right.expr = NULL; + return e; + } + } + break; + default: + ; + } + return e; +} + +/* + * bool FOO!=n => FOO + */ +struct expr *expr_trans_bool(struct expr *e) +{ + if (!e) + return NULL; + switch (e->type) { + case E_AND: + case E_OR: + case E_NOT: + e->left.expr = expr_trans_bool(e->left.expr); + e->right.expr = expr_trans_bool(e->right.expr); + break; + case E_UNEQUAL: + // FOO!=n -> FOO + if (e->left.sym->type == S_TRISTATE) { + if (e->right.sym == &symbol_no) { + e->type = E_SYMBOL; + e->right.sym = NULL; + } + } + break; + default: + ; + } + return e; +} + +/* + * e1 || e2 -> ? + */ +static struct expr *expr_join_or(struct expr *e1, struct expr *e2) +{ + struct expr *tmp; + struct symbol *sym1, *sym2; + + if (expr_eq(e1, e2)) + return expr_copy(e1); + if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT) + return NULL; + if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT) + return NULL; + if (e1->type == E_NOT) { + tmp = e1->left.expr; + if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL) + return NULL; + sym1 = tmp->left.sym; + } else + sym1 = e1->left.sym; + if (e2->type == E_NOT) { + if (e2->left.expr->type != E_SYMBOL) + return NULL; + sym2 = e2->left.expr->left.sym; + } else + sym2 = e2->left.sym; + if (sym1 != sym2) + return NULL; + if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE) + return NULL; + if (sym1->type == S_TRISTATE) { + if (e1->type == E_EQUAL && e2->type == E_EQUAL && + ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) || + (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes))) { + // (a='y') || (a='m') -> (a!='n') + return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_no); + } + if (e1->type == E_EQUAL && e2->type == E_EQUAL && + ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) || + (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes))) { + // (a='y') || (a='n') -> (a!='m') + return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_mod); + } + if (e1->type == E_EQUAL && e2->type == E_EQUAL && + ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) || + (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod))) { + // (a='m') || (a='n') -> (a!='y') + return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_yes); + } + } + if (sym1->type == S_BOOLEAN && sym1 == sym2) { + if ((e1->type == E_NOT && e1->left.expr->type == E_SYMBOL && e2->type == E_SYMBOL) || + (e2->type == E_NOT && e2->left.expr->type == E_SYMBOL && e1->type == E_SYMBOL)) + return expr_alloc_symbol(&symbol_yes); + } + + if (DEBUG_EXPR) { + printf("optimize ("); + expr_fprint(e1, stdout); + printf(") || ("); + expr_fprint(e2, stdout); + printf(")?\n"); + } + return NULL; +} + +static struct expr *expr_join_and(struct expr *e1, struct expr *e2) +{ + struct expr *tmp; + struct symbol *sym1, *sym2; + + if (expr_eq(e1, e2)) + return expr_copy(e1); + if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT) + return NULL; + if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT) + return NULL; + if (e1->type == E_NOT) { + tmp = e1->left.expr; + if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL) + return NULL; + sym1 = tmp->left.sym; + } else + sym1 = e1->left.sym; + if (e2->type == E_NOT) { + if (e2->left.expr->type != E_SYMBOL) + return NULL; + sym2 = e2->left.expr->left.sym; + } else + sym2 = e2->left.sym; + if (sym1 != sym2) + return NULL; + if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE) + return NULL; + + if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_yes) || + (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_yes)) + // (a) && (a='y') -> (a='y') + return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes); + + if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_no) || + (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_no)) + // (a) && (a!='n') -> (a) + return expr_alloc_symbol(sym1); + + if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_mod) || + (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_mod)) + // (a) && (a!='m') -> (a='y') + return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes); + + if (sym1->type == S_TRISTATE) { + if (e1->type == E_EQUAL && e2->type == E_UNEQUAL) { + // (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b' + sym2 = e1->right.sym; + if ((e2->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST)) + return sym2 != e2->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2) + : expr_alloc_symbol(&symbol_no); + } + if (e1->type == E_UNEQUAL && e2->type == E_EQUAL) { + // (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b' + sym2 = e2->right.sym; + if ((e1->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST)) + return sym2 != e1->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2) + : expr_alloc_symbol(&symbol_no); + } + if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL && + ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) || + (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes))) + // (a!='y') && (a!='n') -> (a='m') + return expr_alloc_comp(E_EQUAL, sym1, &symbol_mod); + + if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL && + ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) || + (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes))) + // (a!='y') && (a!='m') -> (a='n') + return expr_alloc_comp(E_EQUAL, sym1, &symbol_no); + + if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL && + ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) || + (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod))) + // (a!='m') && (a!='n') -> (a='m') + return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes); + + if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_mod) || + (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_mod) || + (e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_yes) || + (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_yes)) + return NULL; + } + + if (DEBUG_EXPR) { + printf("optimize ("); + expr_fprint(e1, stdout); + printf(") && ("); + expr_fprint(e2, stdout); + printf(")?\n"); + } + return NULL; +} + +/* + * expr_eliminate_dups() helper. + * + * Walks the two expression trees given in 'ep1' and 'ep2'. Any node that does + * not have type 'type' (E_OR/E_AND) is considered a leaf, and is compared + * against all other leaves to look for simplifications. + */ +static void expr_eliminate_dups1(enum expr_type type, struct expr **ep1, struct expr **ep2) +{ +#define e1 (*ep1) +#define e2 (*ep2) + struct expr *tmp; + + /* Recurse down to leaves */ + + if (e1->type == type) { + expr_eliminate_dups1(type, &e1->left.expr, &e2); + expr_eliminate_dups1(type, &e1->right.expr, &e2); + return; + } + if (e2->type == type) { + expr_eliminate_dups1(type, &e1, &e2->left.expr); + expr_eliminate_dups1(type, &e1, &e2->right.expr); + return; + } + + /* e1 and e2 are leaves. Compare and process them. */ + + if (e1 == e2) + return; + + switch (e1->type) { + case E_OR: case E_AND: + expr_eliminate_dups1(e1->type, &e1, &e1); + default: + ; + } + + switch (type) { + case E_OR: + tmp = expr_join_or(e1, e2); + if (tmp) { + expr_free(e1); expr_free(e2); + e1 = expr_alloc_symbol(&symbol_no); + e2 = tmp; + trans_count++; + } + break; + case E_AND: + tmp = expr_join_and(e1, e2); + if (tmp) { + expr_free(e1); expr_free(e2); + e1 = expr_alloc_symbol(&symbol_yes); + e2 = tmp; + trans_count++; + } + break; + default: + ; + } +#undef e1 +#undef e2 +} + +/* + * Rewrites 'e' in-place to remove ("join") duplicate and other redundant + * operands. + * + * Example simplifications: + * + * A || B || A -> A || B + * A && B && A=y -> A=y && B + * + * Returns the deduplicated expression. + */ +struct expr *expr_eliminate_dups(struct expr *e) +{ + int oldcount; + if (!e) + return e; + + oldcount = trans_count; + while (1) { + trans_count = 0; + switch (e->type) { + case E_OR: case E_AND: + expr_eliminate_dups1(e->type, &e, &e); + default: + ; + } + if (!trans_count) + /* No simplifications done in this pass. We're done */ + break; + e = expr_eliminate_yn(e); + } + trans_count = oldcount; + return e; +} + +/* + * Performs various simplifications involving logical operators and + * comparisons. + * + * Allocates and returns a new expression. + */ +struct expr *expr_transform(struct expr *e) +{ + struct expr *tmp; + + if (!e) + return NULL; + switch (e->type) { + case E_EQUAL: + case E_GEQ: + case E_GTH: + case E_LEQ: + case E_LTH: + case E_UNEQUAL: + case E_SYMBOL: + case E_LIST: + break; + default: + e->left.expr = expr_transform(e->left.expr); + e->right.expr = expr_transform(e->right.expr); + } + + switch (e->type) { + case E_EQUAL: + if (e->left.sym->type != S_BOOLEAN) + break; + if (e->right.sym == &symbol_no) { + e->type = E_NOT; + e->left.expr = expr_alloc_symbol(e->left.sym); + e->right.sym = NULL; + break; + } + if (e->right.sym == &symbol_mod) { + printf("boolean symbol %s tested for 'm'? test forced to 'n'\n", e->left.sym->name); + e->type = E_SYMBOL; + e->left.sym = &symbol_no; + e->right.sym = NULL; + break; + } + if (e->right.sym == &symbol_yes) { + e->type = E_SYMBOL; + e->right.sym = NULL; + break; + } + break; + case E_UNEQUAL: + if (e->left.sym->type != S_BOOLEAN) + break; + if (e->right.sym == &symbol_no) { + e->type = E_SYMBOL; + e->right.sym = NULL; + break; + } + if (e->right.sym == &symbol_mod) { + printf("boolean symbol %s tested for 'm'? test forced to 'y'\n", e->left.sym->name); + e->type = E_SYMBOL; + e->left.sym = &symbol_yes; + e->right.sym = NULL; + break; + } + if (e->right.sym == &symbol_yes) { + e->type = E_NOT; + e->left.expr = expr_alloc_symbol(e->left.sym); + e->right.sym = NULL; + break; + } + break; + case E_NOT: + switch (e->left.expr->type) { + case E_NOT: + // !!a -> a + tmp = e->left.expr->left.expr; + free(e->left.expr); + free(e); + e = tmp; + e = expr_transform(e); + break; + case E_EQUAL: + case E_UNEQUAL: + // !a='x' -> a!='x' + tmp = e->left.expr; + free(e); + e = tmp; + e->type = e->type == E_EQUAL ? E_UNEQUAL : E_EQUAL; + break; + case E_LEQ: + case E_GEQ: + // !a<='x' -> a>'x' + tmp = e->left.expr; + free(e); + e = tmp; + e->type = e->type == E_LEQ ? E_GTH : E_LTH; + break; + case E_LTH: + case E_GTH: + // !a<'x' -> a>='x' + tmp = e->left.expr; + free(e); + e = tmp; + e->type = e->type == E_LTH ? E_GEQ : E_LEQ; + break; + case E_OR: + // !(a || b) -> !a && !b + tmp = e->left.expr; + e->type = E_AND; + e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr); + tmp->type = E_NOT; + tmp->right.expr = NULL; + e = expr_transform(e); + break; + case E_AND: + // !(a && b) -> !a || !b + tmp = e->left.expr; + e->type = E_OR; + e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr); + tmp->type = E_NOT; + tmp->right.expr = NULL; + e = expr_transform(e); + break; + case E_SYMBOL: + if (e->left.expr->left.sym == &symbol_yes) { + // !'y' -> 'n' + tmp = e->left.expr; + free(e); + e = tmp; + e->type = E_SYMBOL; + e->left.sym = &symbol_no; + break; + } + if (e->left.expr->left.sym == &symbol_mod) { + // !'m' -> 'm' + tmp = e->left.expr; + free(e); + e = tmp; + e->type = E_SYMBOL; + e->left.sym = &symbol_mod; + break; + } + if (e->left.expr->left.sym == &symbol_no) { + // !'n' -> 'y' + tmp = e->left.expr; + free(e); + e = tmp; + e->type = E_SYMBOL; + e->left.sym = &symbol_yes; + break; + } + break; + default: + ; + } + break; + default: + ; + } + return e; +} + +int expr_contains_symbol(struct expr *dep, struct symbol *sym) +{ + if (!dep) + return 0; + + switch (dep->type) { + case E_AND: + case E_OR: + return expr_contains_symbol(dep->left.expr, sym) || + expr_contains_symbol(dep->right.expr, sym); + case E_SYMBOL: + return dep->left.sym == sym; + case E_EQUAL: + case E_GEQ: + case E_GTH: + case E_LEQ: + case E_LTH: + case E_UNEQUAL: + return dep->left.sym == sym || + dep->right.sym == sym; + case E_NOT: + return expr_contains_symbol(dep->left.expr, sym); + default: + ; + } + return 0; +} + +bool expr_depends_symbol(struct expr *dep, struct symbol *sym) +{ + if (!dep) + return false; + + switch (dep->type) { + case E_AND: + return expr_depends_symbol(dep->left.expr, sym) || + expr_depends_symbol(dep->right.expr, sym); + case E_SYMBOL: + return dep->left.sym == sym; + case E_EQUAL: + if (dep->left.sym == sym) { + if (dep->right.sym == &symbol_yes || dep->right.sym == &symbol_mod) + return true; + } + break; + case E_UNEQUAL: + if (dep->left.sym == sym) { + if (dep->right.sym == &symbol_no) + return true; + } + break; + default: + ; + } + return false; +} + +/* + * Inserts explicit comparisons of type 'type' to symbol 'sym' into the + * expression 'e'. + * + * Examples transformations for type == E_UNEQUAL, sym == &symbol_no: + * + * A -> A!=n + * !A -> A=n + * A && B -> !(A=n || B=n) + * A || B -> !(A=n && B=n) + * A && (B || C) -> !(A=n || (B=n && C=n)) + * + * Allocates and returns a new expression. + */ +struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym) +{ + struct expr *e1, *e2; + + if (!e) { + e = expr_alloc_symbol(sym); + if (type == E_UNEQUAL) + e = expr_alloc_one(E_NOT, e); + return e; + } + switch (e->type) { + case E_AND: + e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym); + e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym); + if (sym == &symbol_yes) + e = expr_alloc_two(E_AND, e1, e2); + if (sym == &symbol_no) + e = expr_alloc_two(E_OR, e1, e2); + if (type == E_UNEQUAL) + e = expr_alloc_one(E_NOT, e); + return e; + case E_OR: + e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym); + e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym); + if (sym == &symbol_yes) + e = expr_alloc_two(E_OR, e1, e2); + if (sym == &symbol_no) + e = expr_alloc_two(E_AND, e1, e2); + if (type == E_UNEQUAL) + e = expr_alloc_one(E_NOT, e); + return e; + case E_NOT: + return expr_trans_compare(e->left.expr, type == E_EQUAL ? E_UNEQUAL : E_EQUAL, sym); + case E_UNEQUAL: + case E_LTH: + case E_LEQ: + case E_GTH: + case E_GEQ: + case E_EQUAL: + if (type == E_EQUAL) { + if (sym == &symbol_yes) + return expr_copy(e); + if (sym == &symbol_mod) + return expr_alloc_symbol(&symbol_no); + if (sym == &symbol_no) + return expr_alloc_one(E_NOT, expr_copy(e)); + } else { + if (sym == &symbol_yes) + return expr_alloc_one(E_NOT, expr_copy(e)); + if (sym == &symbol_mod) + return expr_alloc_symbol(&symbol_yes); + if (sym == &symbol_no) + return expr_copy(e); + } + break; + case E_SYMBOL: + return expr_alloc_comp(type, e->left.sym, sym); + case E_LIST: + case E_RANGE: + case E_NONE: + /* panic */; + } + return NULL; +} + +enum string_value_kind { + k_string, + k_signed, + k_unsigned, +}; + +union string_value { + unsigned long long u; + signed long long s; +}; + +static enum string_value_kind expr_parse_string(const char *str, + enum symbol_type type, + union string_value *val) +{ + char *tail; + enum string_value_kind kind; + + errno = 0; + switch (type) { + case S_BOOLEAN: + case S_TRISTATE: + val->s = !strcmp(str, "n") ? 0 : + !strcmp(str, "m") ? 1 : + !strcmp(str, "y") ? 2 : -1; + return k_signed; + case S_INT: + val->s = strtoll(str, &tail, 10); + kind = k_signed; + break; + case S_HEX: + val->u = strtoull(str, &tail, 16); + kind = k_unsigned; + break; + default: + val->s = strtoll(str, &tail, 0); + kind = k_signed; + break; + } + return !errno && !*tail && tail > str && isxdigit(tail[-1]) + ? kind : k_string; +} + +tristate expr_calc_value(struct expr *e) +{ + tristate val1, val2; + const char *str1, *str2; + enum string_value_kind k1 = k_string, k2 = k_string; + union string_value lval = {}, rval = {}; + int res; + + if (!e) + return yes; + + switch (e->type) { + case E_SYMBOL: + sym_calc_value(e->left.sym); + return e->left.sym->curr.tri; + case E_AND: + val1 = expr_calc_value(e->left.expr); + val2 = expr_calc_value(e->right.expr); + return EXPR_AND(val1, val2); + case E_OR: + val1 = expr_calc_value(e->left.expr); + val2 = expr_calc_value(e->right.expr); + return EXPR_OR(val1, val2); + case E_NOT: + val1 = expr_calc_value(e->left.expr); + return EXPR_NOT(val1); + case E_EQUAL: + case E_GEQ: + case E_GTH: + case E_LEQ: + case E_LTH: + case E_UNEQUAL: + break; + default: + printf("expr_calc_value: %d?\n", e->type); + return no; + } + + sym_calc_value(e->left.sym); + sym_calc_value(e->right.sym); + str1 = sym_get_string_value(e->left.sym); + str2 = sym_get_string_value(e->right.sym); + + if (e->left.sym->type != S_STRING || e->right.sym->type != S_STRING) { + k1 = expr_parse_string(str1, e->left.sym->type, &lval); + k2 = expr_parse_string(str2, e->right.sym->type, &rval); + } + + if (k1 == k_string || k2 == k_string) + res = strcmp(str1, str2); + else if (k1 == k_unsigned || k2 == k_unsigned) + res = (lval.u > rval.u) - (lval.u < rval.u); + else /* if (k1 == k_signed && k2 == k_signed) */ + res = (lval.s > rval.s) - (lval.s < rval.s); + + switch(e->type) { + case E_EQUAL: + return res ? no : yes; + case E_GEQ: + return res >= 0 ? yes : no; + case E_GTH: + return res > 0 ? yes : no; + case E_LEQ: + return res <= 0 ? yes : no; + case E_LTH: + return res < 0 ? yes : no; + case E_UNEQUAL: + return res ? yes : no; + default: + printf("expr_calc_value: relation %d?\n", e->type); + return no; + } +} + +static int expr_compare_type(enum expr_type t1, enum expr_type t2) +{ + if (t1 == t2) + return 0; + switch (t1) { + case E_LEQ: + case E_LTH: + case E_GEQ: + case E_GTH: + if (t2 == E_EQUAL || t2 == E_UNEQUAL) + return 1; + case E_EQUAL: + case E_UNEQUAL: + if (t2 == E_NOT) + return 1; + case E_NOT: + if (t2 == E_AND) + return 1; + case E_AND: + if (t2 == E_OR) + return 1; + case E_OR: + if (t2 == E_LIST) + return 1; + case E_LIST: + if (t2 == 0) + return 1; + default: + return -1; + } + printf("[%dgt%d?]", t1, t2); + return 0; +} + +void expr_print(struct expr *e, + void (*fn)(void *, struct symbol *, const char *), + void *data, int prevtoken) +{ + if (!e) { + fn(data, NULL, "y"); + return; + } + + if (expr_compare_type(prevtoken, e->type) > 0) + fn(data, NULL, "("); + switch (e->type) { + case E_SYMBOL: + if (e->left.sym->name) + fn(data, e->left.sym, e->left.sym->name); + else + fn(data, NULL, "<choice>"); + break; + case E_NOT: + fn(data, NULL, "!"); + expr_print(e->left.expr, fn, data, E_NOT); + break; + case E_EQUAL: + if (e->left.sym->name) + fn(data, e->left.sym, e->left.sym->name); + else + fn(data, NULL, "<choice>"); + fn(data, NULL, "="); + fn(data, e->right.sym, e->right.sym->name); + break; + case E_LEQ: + case E_LTH: + if (e->left.sym->name) + fn(data, e->left.sym, e->left.sym->name); + else + fn(data, NULL, "<choice>"); + fn(data, NULL, e->type == E_LEQ ? "<=" : "<"); + fn(data, e->right.sym, e->right.sym->name); + break; + case E_GEQ: + case E_GTH: + if (e->left.sym->name) + fn(data, e->left.sym, e->left.sym->name); + else + fn(data, NULL, "<choice>"); + fn(data, NULL, e->type == E_GEQ ? ">=" : ">"); + fn(data, e->right.sym, e->right.sym->name); + break; + case E_UNEQUAL: + if (e->left.sym->name) + fn(data, e->left.sym, e->left.sym->name); + else + fn(data, NULL, "<choice>"); + fn(data, NULL, "!="); + fn(data, e->right.sym, e->right.sym->name); + break; + case E_OR: + expr_print(e->left.expr, fn, data, E_OR); + fn(data, NULL, " || "); + expr_print(e->right.expr, fn, data, E_OR); + break; + case E_AND: + expr_print(e->left.expr, fn, data, E_AND); + fn(data, NULL, " && "); + expr_print(e->right.expr, fn, data, E_AND); + break; + case E_LIST: + fn(data, e->right.sym, e->right.sym->name); + if (e->left.expr) { + fn(data, NULL, " ^ "); + expr_print(e->left.expr, fn, data, E_LIST); + } + break; + case E_RANGE: + fn(data, NULL, "["); + fn(data, e->left.sym, e->left.sym->name); + fn(data, NULL, " "); + fn(data, e->right.sym, e->right.sym->name); + fn(data, NULL, "]"); + break; + default: + { + char buf[32]; + sprintf(buf, "<unknown type %d>", e->type); + fn(data, NULL, buf); + break; + } + } + if (expr_compare_type(prevtoken, e->type) > 0) + fn(data, NULL, ")"); +} + +static void expr_print_file_helper(void *data, struct symbol *sym, const char *str) +{ + xfwrite(str, strlen(str), 1, data); +} + +void expr_fprint(struct expr *e, FILE *out) +{ + expr_print(e, expr_print_file_helper, out, E_NONE); +} + +static void expr_print_gstr_helper(void *data, struct symbol *sym, const char *str) +{ + struct gstr *gs = (struct gstr*)data; + const char *sym_str = NULL; + + if (sym) + sym_str = sym_get_string_value(sym); + + if (gs->max_width) { + unsigned extra_length = strlen(str); + const char *last_cr = strrchr(gs->s, '\n'); + unsigned last_line_length; + + if (sym_str) + extra_length += 4 + strlen(sym_str); + + if (!last_cr) + last_cr = gs->s; + + last_line_length = strlen(gs->s) - (last_cr - gs->s); + + if ((last_line_length + extra_length) > gs->max_width) + str_append(gs, "\\\n"); + } + + str_append(gs, str); + if (sym && sym->type != S_UNKNOWN) + str_printf(gs, " [=%s]", sym_str); +} + +void expr_gstr_print(struct expr *e, struct gstr *gs) +{ + expr_print(e, expr_print_gstr_helper, gs, E_NONE); +} + +/* + * Transform the top level "||" tokens into newlines and prepend each + * line with a minus. This makes expressions much easier to read. + * Suitable for reverse dependency expressions. + */ +static void expr_print_revdep(struct expr *e, + void (*fn)(void *, struct symbol *, const char *), + void *data, tristate pr_type, const char **title) +{ + if (e->type == E_OR) { + expr_print_revdep(e->left.expr, fn, data, pr_type, title); + expr_print_revdep(e->right.expr, fn, data, pr_type, title); + } else if (expr_calc_value(e) == pr_type) { + if (*title) { + fn(data, NULL, *title); + *title = NULL; + } + + fn(data, NULL, " - "); + expr_print(e, fn, data, E_NONE); + fn(data, NULL, "\n"); + } +} + +void expr_gstr_print_revdep(struct expr *e, struct gstr *gs, + tristate pr_type, const char *title) +{ + expr_print_revdep(e, expr_print_gstr_helper, gs, pr_type, &title); +} diff --git a/src/net/scripts/kconfig/expr.h b/src/net/scripts/kconfig/expr.h new file mode 100644 index 0000000..5c34436 --- /dev/null +++ b/src/net/scripts/kconfig/expr.h @@ -0,0 +1,332 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + */ + +#ifndef EXPR_H +#define EXPR_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <assert.h> +#include <stdio.h> +#include "list.h" +#ifndef __cplusplus +#include <stdbool.h> +#endif + +struct file { + struct file *next; + struct file *parent; + const char *name; + int lineno; +}; + +typedef enum tristate { + no, mod, yes +} tristate; + +enum expr_type { + E_NONE, E_OR, E_AND, E_NOT, + E_EQUAL, E_UNEQUAL, E_LTH, E_LEQ, E_GTH, E_GEQ, + E_LIST, E_SYMBOL, E_RANGE +}; + +union expr_data { + struct expr *expr; + struct symbol *sym; +}; + +struct expr { + enum expr_type type; + union expr_data left, right; +}; + +#define EXPR_OR(dep1, dep2) (((dep1)>(dep2))?(dep1):(dep2)) +#define EXPR_AND(dep1, dep2) (((dep1)<(dep2))?(dep1):(dep2)) +#define EXPR_NOT(dep) (2-(dep)) + +#define expr_list_for_each_sym(l, e, s) \ + for (e = (l); e && (s = e->right.sym); e = e->left.expr) + +struct expr_value { + struct expr *expr; + tristate tri; +}; + +struct symbol_value { + void *val; + tristate tri; +}; + +enum symbol_type { + S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING +}; + +/* enum values are used as index to symbol.def[] */ +enum { + S_DEF_USER, /* main user value */ + S_DEF_AUTO, /* values read from auto.conf */ + S_DEF_DEF3, /* Reserved for UI usage */ + S_DEF_DEF4, /* Reserved for UI usage */ + S_DEF_COUNT +}; + +/* + * Represents a configuration symbol. + * + * Choices are represented as a special kind of symbol and have the + * SYMBOL_CHOICE bit set in 'flags'. + */ +struct symbol { + /* The next symbol in the same bucket in the symbol hash table */ + struct symbol *next; + + /* The name of the symbol, e.g. "FOO" for 'config FOO' */ + char *name; + + /* S_BOOLEAN, S_TRISTATE, ... */ + enum symbol_type type; + + /* + * The calculated value of the symbol. The SYMBOL_VALID bit is set in + * 'flags' when this is up to date. Note that this value might differ + * from the user value set in e.g. a .config file, due to visibility. + */ + struct symbol_value curr; + + /* + * Values for the symbol provided from outside. def[S_DEF_USER] holds + * the .config value. + */ + struct symbol_value def[S_DEF_COUNT]; + + /* + * An upper bound on the tristate value the user can set for the symbol + * if it is a boolean or tristate. Calculated from prompt dependencies, + * which also inherit dependencies from enclosing menus, choices, and + * ifs. If 'n', the user value will be ignored. + * + * Symbols lacking prompts always have visibility 'n'. + */ + tristate visible; + + /* SYMBOL_* flags */ + int flags; + + /* List of properties. See prop_type. */ + struct property *prop; + + /* Dependencies from enclosing menus, choices, and ifs */ + struct expr_value dir_dep; + + /* Reverse dependencies through being selected by other symbols */ + struct expr_value rev_dep; + + /* + * "Weak" reverse dependencies through being implied by other symbols + */ + struct expr_value implied; +}; + +#define for_all_symbols(i, sym) for (i = 0; i < SYMBOL_HASHSIZE; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) + +#define SYMBOL_CONST 0x0001 /* symbol is const */ +#define SYMBOL_CHECK 0x0008 /* used during dependency checking */ +#define SYMBOL_CHOICE 0x0010 /* start of a choice block (null name) */ +#define SYMBOL_CHOICEVAL 0x0020 /* used as a value in a choice block */ +#define SYMBOL_VALID 0x0080 /* set when symbol.curr is calculated */ +#define SYMBOL_OPTIONAL 0x0100 /* choice is optional - values can be 'n' */ +#define SYMBOL_WRITE 0x0200 /* write symbol to file (KCONFIG_CONFIG) */ +#define SYMBOL_CHANGED 0x0400 /* ? */ +#define SYMBOL_WRITTEN 0x0800 /* track info to avoid double-write to .config */ +#define SYMBOL_NO_WRITE 0x1000 /* Symbol for internal use only; it will not be written */ +#define SYMBOL_CHECKED 0x2000 /* used during dependency checking */ +#define SYMBOL_WARNED 0x8000 /* warning has been issued */ + +/* Set when symbol.def[] is used */ +#define SYMBOL_DEF 0x10000 /* First bit of SYMBOL_DEF */ +#define SYMBOL_DEF_USER 0x10000 /* symbol.def[S_DEF_USER] is valid */ +#define SYMBOL_DEF_AUTO 0x20000 /* symbol.def[S_DEF_AUTO] is valid */ +#define SYMBOL_DEF3 0x40000 /* symbol.def[S_DEF_3] is valid */ +#define SYMBOL_DEF4 0x80000 /* symbol.def[S_DEF_4] is valid */ + +/* choice values need to be set before calculating this symbol value */ +#define SYMBOL_NEED_SET_CHOICE_VALUES 0x100000 + +/* Set symbol to y if allnoconfig; used for symbols that hide others */ +#define SYMBOL_ALLNOCONFIG_Y 0x200000 + +#define SYMBOL_MAXLENGTH 256 +#define SYMBOL_HASHSIZE 9973 + +/* A property represent the config options that can be associated + * with a config "symbol". + * Sample: + * config FOO + * default y + * prompt "foo prompt" + * select BAR + * config BAZ + * int "BAZ Value" + * range 1..255 + * + * Please, also check parser.y:print_symbol() when modifying the + * list of property types! + */ +enum prop_type { + P_UNKNOWN, + P_PROMPT, /* prompt "foo prompt" or "BAZ Value" */ + P_COMMENT, /* text associated with a comment */ + P_MENU, /* prompt associated with a menu or menuconfig symbol */ + P_DEFAULT, /* default y */ + P_CHOICE, /* choice value */ + P_SELECT, /* select BAR */ + P_IMPLY, /* imply BAR */ + P_RANGE, /* range 7..100 (for a symbol) */ + P_SYMBOL, /* where a symbol is defined */ +}; + +struct property { + struct property *next; /* next property - null if last */ + enum prop_type type; /* type of property */ + const char *text; /* the prompt value - P_PROMPT, P_MENU, P_COMMENT */ + struct expr_value visible; + struct expr *expr; /* the optional conditional part of the property */ + struct menu *menu; /* the menu the property are associated with + * valid for: P_SELECT, P_RANGE, P_CHOICE, + * P_PROMPT, P_DEFAULT, P_MENU, P_COMMENT */ + struct file *file; /* what file was this property defined */ + int lineno; /* what lineno was this property defined */ +}; + +#define for_all_properties(sym, st, tok) \ + for (st = sym->prop; st; st = st->next) \ + if (st->type == (tok)) +#define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT) +#define for_all_choices(sym, st) for_all_properties(sym, st, P_CHOICE) +#define for_all_prompts(sym, st) \ + for (st = sym->prop; st; st = st->next) \ + if (st->text) + +/* + * Represents a node in the menu tree, as seen in e.g. menuconfig (though used + * for all front ends). Each symbol, menu, etc. defined in the Kconfig files + * gets a node. A symbol defined in multiple locations gets one node at each + * location. + */ +struct menu { + /* The next menu node at the same level */ + struct menu *next; + + /* The parent menu node, corresponding to e.g. a menu or choice */ + struct menu *parent; + + /* The first child menu node, for e.g. menus and choices */ + struct menu *list; + + /* + * The symbol associated with the menu node. Choices are implemented as + * a special kind of symbol. NULL for menus, comments, and ifs. + */ + struct symbol *sym; + + /* + * The prompt associated with the node. This holds the prompt for a + * symbol as well as the text for a menu or comment, along with the + * type (P_PROMPT, P_MENU, etc.) + */ + struct property *prompt; + + /* + * 'visible if' dependencies. If more than one is given, they will be + * ANDed together. + */ + struct expr *visibility; + + /* + * Ordinary dependencies from e.g. 'depends on' and 'if', ANDed + * together + */ + struct expr *dep; + + /* MENU_* flags */ + unsigned int flags; + + /* Any help text associated with the node */ + char *help; + + /* The location where the menu node appears in the Kconfig files */ + struct file *file; + int lineno; + + /* For use by front ends that need to store auxiliary data */ + void *data; +}; + +/* + * Set on a menu node when the corresponding symbol changes state in some way. + * Can be checked by front ends. + */ +#define MENU_CHANGED 0x0001 + +#define MENU_ROOT 0x0002 + +struct jump_key { + struct list_head entries; + size_t offset; + struct menu *target; + int index; +}; + +#define JUMP_NB 9 + +extern struct file *file_list; +extern struct file *current_file; +struct file *lookup_file(const char *name); + +extern struct symbol symbol_yes, symbol_no, symbol_mod; +extern struct symbol *modules_sym; +extern struct symbol *sym_defconfig_list; +extern int cdebug; +struct expr *expr_alloc_symbol(struct symbol *sym); +struct expr *expr_alloc_one(enum expr_type type, struct expr *ce); +struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2); +struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2); +struct expr *expr_alloc_and(struct expr *e1, struct expr *e2); +struct expr *expr_alloc_or(struct expr *e1, struct expr *e2); +struct expr *expr_copy(const struct expr *org); +void expr_free(struct expr *e); +void expr_eliminate_eq(struct expr **ep1, struct expr **ep2); +int expr_eq(struct expr *e1, struct expr *e2); +tristate expr_calc_value(struct expr *e); +struct expr *expr_trans_bool(struct expr *e); +struct expr *expr_eliminate_dups(struct expr *e); +struct expr *expr_transform(struct expr *e); +int expr_contains_symbol(struct expr *dep, struct symbol *sym); +bool expr_depends_symbol(struct expr *dep, struct symbol *sym); +struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym); + +void expr_fprint(struct expr *e, FILE *out); +struct gstr; /* forward */ +void expr_gstr_print(struct expr *e, struct gstr *gs); +void expr_gstr_print_revdep(struct expr *e, struct gstr *gs, + tristate pr_type, const char *title); + +static inline int expr_is_yes(struct expr *e) +{ + return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes); +} + +static inline int expr_is_no(struct expr *e) +{ + return e && (e->type == E_SYMBOL && e->left.sym == &symbol_no); +} + +#ifdef __cplusplus +} +#endif + +#endif /* EXPR_H */ diff --git a/src/net/scripts/kconfig/gconf-cfg.sh b/src/net/scripts/kconfig/gconf-cfg.sh new file mode 100755 index 0000000..480ecd8 --- /dev/null +++ b/src/net/scripts/kconfig/gconf-cfg.sh @@ -0,0 +1,30 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 + +PKG="gtk+-2.0 gmodule-2.0 libglade-2.0" + +if [ -z "$(command -v pkg-config)" ]; then + echo >&2 "*" + echo >&2 "* 'make gconfig' requires 'pkg-config'. Please install it." + echo >&2 "*" + exit 1 +fi + +if ! pkg-config --exists $PKG; then + echo >&2 "*" + echo >&2 "* Unable to find the GTK+ installation. Please make sure that" + echo >&2 "* the GTK+ 2.0 development package is correctly installed." + echo >&2 "* You need $PKG" + echo >&2 "*" + exit 1 +fi + +if ! pkg-config --atleast-version=2.0.0 gtk+-2.0; then + echo >&2 "*" + echo >&2 "* GTK+ is present but version >= 2.0.0 is required." + echo >&2 "*" + exit 1 +fi + +echo cflags=\"$(pkg-config --cflags $PKG)\" +echo libs=\"$(pkg-config --libs $PKG)\" diff --git a/src/net/scripts/kconfig/gconf.c b/src/net/scripts/kconfig/gconf.c new file mode 100644 index 0000000..5527482 --- /dev/null +++ b/src/net/scripts/kconfig/gconf.c @@ -0,0 +1,1517 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2002-2003 Romain Lievin <roms@tilp.info> + */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <stdlib.h> +#include "lkc.h" +#include "images.h" + +#include <glade/glade.h> +#include <gtk/gtk.h> +#include <glib.h> +#include <gdk/gdkkeysyms.h> + +#include <stdio.h> +#include <string.h> +#include <strings.h> +#include <unistd.h> +#include <time.h> + +//#define DEBUG + +enum { + SINGLE_VIEW, SPLIT_VIEW, FULL_VIEW +}; + +enum { + OPT_NORMAL, OPT_ALL, OPT_PROMPT +}; + +static gint view_mode = FULL_VIEW; +static gboolean show_name = TRUE; +static gboolean show_range = TRUE; +static gboolean show_value = TRUE; +static gboolean resizeable = FALSE; +static int opt_mode = OPT_NORMAL; + +GtkWidget *main_wnd = NULL; +GtkWidget *tree1_w = NULL; // left frame +GtkWidget *tree2_w = NULL; // right frame +GtkWidget *text_w = NULL; +GtkWidget *hpaned = NULL; +GtkWidget *vpaned = NULL; +GtkWidget *back_btn = NULL; +GtkWidget *save_btn = NULL; +GtkWidget *save_menu_item = NULL; + +GtkTextTag *tag1, *tag2; +GdkColor color; + +GtkTreeStore *tree1, *tree2, *tree; +GtkTreeModel *model1, *model2; +static GtkTreeIter *parents[256]; +static gint indent; + +static struct menu *current; // current node for SINGLE view +static struct menu *browsed; // browsed node for SPLIT view + +enum { + COL_OPTION, COL_NAME, COL_NO, COL_MOD, COL_YES, COL_VALUE, + COL_MENU, COL_COLOR, COL_EDIT, COL_PIXBUF, + COL_PIXVIS, COL_BTNVIS, COL_BTNACT, COL_BTNINC, COL_BTNRAD, + COL_NUMBER +}; + +static void display_list(void); +static void display_tree(struct menu *menu); +static void display_tree_part(void); +static void update_tree(struct menu *src, GtkTreeIter * dst); +static void set_node(GtkTreeIter * node, struct menu *menu, gchar ** row); +static gchar **fill_row(struct menu *menu); +static void conf_changed(void); + +/* Helping/Debugging Functions */ +#ifdef DEBUG +static const char *dbg_sym_flags(int val) +{ + static char buf[256]; + + bzero(buf, 256); + + if (val & SYMBOL_CONST) + strcat(buf, "const/"); + if (val & SYMBOL_CHECK) + strcat(buf, "check/"); + if (val & SYMBOL_CHOICE) + strcat(buf, "choice/"); + if (val & SYMBOL_CHOICEVAL) + strcat(buf, "choiceval/"); + if (val & SYMBOL_VALID) + strcat(buf, "valid/"); + if (val & SYMBOL_OPTIONAL) + strcat(buf, "optional/"); + if (val & SYMBOL_WRITE) + strcat(buf, "write/"); + if (val & SYMBOL_CHANGED) + strcat(buf, "changed/"); + if (val & SYMBOL_NO_WRITE) + strcat(buf, "no_write/"); + + buf[strlen(buf) - 1] = '\0'; + + return buf; +} +#endif + +static void replace_button_icon(GladeXML *xml, GdkDrawable *window, + GtkStyle *style, gchar *btn_name, gchar **xpm) +{ + GdkPixmap *pixmap; + GdkBitmap *mask; + GtkToolButton *button; + GtkWidget *image; + + pixmap = gdk_pixmap_create_from_xpm_d(window, &mask, + &style->bg[GTK_STATE_NORMAL], + xpm); + + button = GTK_TOOL_BUTTON(glade_xml_get_widget(xml, btn_name)); + image = gtk_image_new_from_pixmap(pixmap, mask); + gtk_widget_show(image); + gtk_tool_button_set_icon_widget(button, image); +} + +/* Main Window Initialization */ +static void init_main_window(const gchar *glade_file) +{ + GladeXML *xml; + GtkWidget *widget; + GtkTextBuffer *txtbuf; + GtkStyle *style; + + xml = glade_xml_new(glade_file, "window1", NULL); + if (!xml) + g_error("GUI loading failed !\n"); + glade_xml_signal_autoconnect(xml); + + main_wnd = glade_xml_get_widget(xml, "window1"); + hpaned = glade_xml_get_widget(xml, "hpaned1"); + vpaned = glade_xml_get_widget(xml, "vpaned1"); + tree1_w = glade_xml_get_widget(xml, "treeview1"); + tree2_w = glade_xml_get_widget(xml, "treeview2"); + text_w = glade_xml_get_widget(xml, "textview3"); + + back_btn = glade_xml_get_widget(xml, "button1"); + gtk_widget_set_sensitive(back_btn, FALSE); + + widget = glade_xml_get_widget(xml, "show_name1"); + gtk_check_menu_item_set_active((GtkCheckMenuItem *) widget, + show_name); + + widget = glade_xml_get_widget(xml, "show_range1"); + gtk_check_menu_item_set_active((GtkCheckMenuItem *) widget, + show_range); + + widget = glade_xml_get_widget(xml, "show_data1"); + gtk_check_menu_item_set_active((GtkCheckMenuItem *) widget, + show_value); + + save_btn = glade_xml_get_widget(xml, "button3"); + save_menu_item = glade_xml_get_widget(xml, "save1"); + conf_set_changed_callback(conf_changed); + + style = gtk_widget_get_style(main_wnd); + widget = glade_xml_get_widget(xml, "toolbar1"); + + replace_button_icon(xml, main_wnd->window, style, + "button4", (gchar **) xpm_single_view); + replace_button_icon(xml, main_wnd->window, style, + "button5", (gchar **) xpm_split_view); + replace_button_icon(xml, main_wnd->window, style, + "button6", (gchar **) xpm_tree_view); + + txtbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w)); + tag1 = gtk_text_buffer_create_tag(txtbuf, "mytag1", + "foreground", "red", + "weight", PANGO_WEIGHT_BOLD, + NULL); + tag2 = gtk_text_buffer_create_tag(txtbuf, "mytag2", + /*"style", PANGO_STYLE_OBLIQUE, */ + NULL); + + gtk_window_set_title(GTK_WINDOW(main_wnd), rootmenu.prompt->text); + + gtk_widget_show(main_wnd); +} + +static void init_tree_model(void) +{ + gint i; + + tree = tree2 = gtk_tree_store_new(COL_NUMBER, + G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_POINTER, GDK_TYPE_COLOR, + G_TYPE_BOOLEAN, GDK_TYPE_PIXBUF, + G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, + G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, + G_TYPE_BOOLEAN); + model2 = GTK_TREE_MODEL(tree2); + + for (parents[0] = NULL, i = 1; i < 256; i++) + parents[i] = (GtkTreeIter *) g_malloc(sizeof(GtkTreeIter)); + + tree1 = gtk_tree_store_new(COL_NUMBER, + G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_POINTER, GDK_TYPE_COLOR, + G_TYPE_BOOLEAN, GDK_TYPE_PIXBUF, + G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, + G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, + G_TYPE_BOOLEAN); + model1 = GTK_TREE_MODEL(tree1); +} + +static void init_left_tree(void) +{ + GtkTreeView *view = GTK_TREE_VIEW(tree1_w); + GtkCellRenderer *renderer; + GtkTreeSelection *sel; + GtkTreeViewColumn *column; + + gtk_tree_view_set_model(view, model1); + gtk_tree_view_set_headers_visible(view, TRUE); + gtk_tree_view_set_rules_hint(view, TRUE); + + column = gtk_tree_view_column_new(); + gtk_tree_view_append_column(view, column); + gtk_tree_view_column_set_title(column, "Options"); + + renderer = gtk_cell_renderer_toggle_new(); + gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column), + renderer, FALSE); + gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column), + renderer, + "active", COL_BTNACT, + "inconsistent", COL_BTNINC, + "visible", COL_BTNVIS, + "radio", COL_BTNRAD, NULL); + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column), + renderer, FALSE); + gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column), + renderer, + "text", COL_OPTION, + "foreground-gdk", + COL_COLOR, NULL); + + sel = gtk_tree_view_get_selection(view); + gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE); + gtk_widget_realize(tree1_w); +} + +static void renderer_edited(GtkCellRendererText * cell, + const gchar * path_string, + const gchar * new_text, gpointer user_data); + +static void init_right_tree(void) +{ + GtkTreeView *view = GTK_TREE_VIEW(tree2_w); + GtkCellRenderer *renderer; + GtkTreeSelection *sel; + GtkTreeViewColumn *column; + gint i; + + gtk_tree_view_set_model(view, model2); + gtk_tree_view_set_headers_visible(view, TRUE); + gtk_tree_view_set_rules_hint(view, TRUE); + + column = gtk_tree_view_column_new(); + gtk_tree_view_append_column(view, column); + gtk_tree_view_column_set_title(column, "Options"); + + renderer = gtk_cell_renderer_pixbuf_new(); + gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column), + renderer, FALSE); + gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column), + renderer, + "pixbuf", COL_PIXBUF, + "visible", COL_PIXVIS, NULL); + renderer = gtk_cell_renderer_toggle_new(); + gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column), + renderer, FALSE); + gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column), + renderer, + "active", COL_BTNACT, + "inconsistent", COL_BTNINC, + "visible", COL_BTNVIS, + "radio", COL_BTNRAD, NULL); + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column), + renderer, FALSE); + gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column), + renderer, + "text", COL_OPTION, + "foreground-gdk", + COL_COLOR, NULL); + + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_insert_column_with_attributes(view, -1, + "Name", renderer, + "text", COL_NAME, + "foreground-gdk", + COL_COLOR, NULL); + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_insert_column_with_attributes(view, -1, + "N", renderer, + "text", COL_NO, + "foreground-gdk", + COL_COLOR, NULL); + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_insert_column_with_attributes(view, -1, + "M", renderer, + "text", COL_MOD, + "foreground-gdk", + COL_COLOR, NULL); + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_insert_column_with_attributes(view, -1, + "Y", renderer, + "text", COL_YES, + "foreground-gdk", + COL_COLOR, NULL); + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_insert_column_with_attributes(view, -1, + "Value", renderer, + "text", COL_VALUE, + "editable", + COL_EDIT, + "foreground-gdk", + COL_COLOR, NULL); + g_signal_connect(G_OBJECT(renderer), "edited", + G_CALLBACK(renderer_edited), NULL); + + column = gtk_tree_view_get_column(view, COL_NAME); + gtk_tree_view_column_set_visible(column, show_name); + column = gtk_tree_view_get_column(view, COL_NO); + gtk_tree_view_column_set_visible(column, show_range); + column = gtk_tree_view_get_column(view, COL_MOD); + gtk_tree_view_column_set_visible(column, show_range); + column = gtk_tree_view_get_column(view, COL_YES); + gtk_tree_view_column_set_visible(column, show_range); + column = gtk_tree_view_get_column(view, COL_VALUE); + gtk_tree_view_column_set_visible(column, show_value); + + if (resizeable) { + for (i = 0; i < COL_VALUE; i++) { + column = gtk_tree_view_get_column(view, i); + gtk_tree_view_column_set_resizable(column, TRUE); + } + } + + sel = gtk_tree_view_get_selection(view); + gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE); +} + + +/* Utility Functions */ + + +static void text_insert_help(struct menu *menu) +{ + GtkTextBuffer *buffer; + GtkTextIter start, end; + const char *prompt = menu_get_prompt(menu); + struct gstr help = str_new(); + + menu_get_ext_help(menu, &help); + + buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w)); + gtk_text_buffer_get_bounds(buffer, &start, &end); + gtk_text_buffer_delete(buffer, &start, &end); + gtk_text_view_set_left_margin(GTK_TEXT_VIEW(text_w), 15); + + gtk_text_buffer_get_end_iter(buffer, &end); + gtk_text_buffer_insert_with_tags(buffer, &end, prompt, -1, tag1, + NULL); + gtk_text_buffer_insert_at_cursor(buffer, "\n\n", 2); + gtk_text_buffer_get_end_iter(buffer, &end); + gtk_text_buffer_insert_with_tags(buffer, &end, str_get(&help), -1, tag2, + NULL); + str_free(&help); +} + + +static void text_insert_msg(const char *title, const char *message) +{ + GtkTextBuffer *buffer; + GtkTextIter start, end; + const char *msg = message; + + buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w)); + gtk_text_buffer_get_bounds(buffer, &start, &end); + gtk_text_buffer_delete(buffer, &start, &end); + gtk_text_view_set_left_margin(GTK_TEXT_VIEW(text_w), 15); + + gtk_text_buffer_get_end_iter(buffer, &end); + gtk_text_buffer_insert_with_tags(buffer, &end, title, -1, tag1, + NULL); + gtk_text_buffer_insert_at_cursor(buffer, "\n\n", 2); + gtk_text_buffer_get_end_iter(buffer, &end); + gtk_text_buffer_insert_with_tags(buffer, &end, msg, -1, tag2, + NULL); +} + + +/* Main Windows Callbacks */ + +void on_save_activate(GtkMenuItem * menuitem, gpointer user_data); +gboolean on_window1_delete_event(GtkWidget * widget, GdkEvent * event, + gpointer user_data) +{ + GtkWidget *dialog, *label; + gint result; + + if (!conf_get_changed()) + return FALSE; + + dialog = gtk_dialog_new_with_buttons("Warning !", + GTK_WINDOW(main_wnd), + (GtkDialogFlags) + (GTK_DIALOG_MODAL | + GTK_DIALOG_DESTROY_WITH_PARENT), + GTK_STOCK_OK, + GTK_RESPONSE_YES, + GTK_STOCK_NO, + GTK_RESPONSE_NO, + GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL, NULL); + gtk_dialog_set_default_response(GTK_DIALOG(dialog), + GTK_RESPONSE_CANCEL); + + label = gtk_label_new("\nSave configuration ?\n"); + gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label); + gtk_widget_show(label); + + result = gtk_dialog_run(GTK_DIALOG(dialog)); + switch (result) { + case GTK_RESPONSE_YES: + on_save_activate(NULL, NULL); + return FALSE; + case GTK_RESPONSE_NO: + return FALSE; + case GTK_RESPONSE_CANCEL: + case GTK_RESPONSE_DELETE_EVENT: + default: + gtk_widget_destroy(dialog); + return TRUE; + } + + return FALSE; +} + + +void on_window1_destroy(GtkObject * object, gpointer user_data) +{ + gtk_main_quit(); +} + + +void +on_window1_size_request(GtkWidget * widget, + GtkRequisition * requisition, gpointer user_data) +{ + static gint old_h; + gint w, h; + + if (widget->window == NULL) + gtk_window_get_default_size(GTK_WINDOW(main_wnd), &w, &h); + else + gdk_window_get_size(widget->window, &w, &h); + + if (h == old_h) + return; + old_h = h; + + gtk_paned_set_position(GTK_PANED(vpaned), 2 * h / 3); +} + + +/* Menu & Toolbar Callbacks */ + + +static void +load_filename(GtkFileSelection * file_selector, gpointer user_data) +{ + const gchar *fn; + + fn = gtk_file_selection_get_filename(GTK_FILE_SELECTION + (user_data)); + + if (conf_read(fn)) + text_insert_msg("Error", "Unable to load configuration !"); + else + display_tree(&rootmenu); +} + +void on_load1_activate(GtkMenuItem * menuitem, gpointer user_data) +{ + GtkWidget *fs; + + fs = gtk_file_selection_new("Load file..."); + g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(fs)->ok_button), + "clicked", + G_CALLBACK(load_filename), (gpointer) fs); + g_signal_connect_swapped(GTK_OBJECT + (GTK_FILE_SELECTION(fs)->ok_button), + "clicked", G_CALLBACK(gtk_widget_destroy), + (gpointer) fs); + g_signal_connect_swapped(GTK_OBJECT + (GTK_FILE_SELECTION(fs)->cancel_button), + "clicked", G_CALLBACK(gtk_widget_destroy), + (gpointer) fs); + gtk_widget_show(fs); +} + + +void on_save_activate(GtkMenuItem * menuitem, gpointer user_data) +{ + if (conf_write(NULL)) + text_insert_msg("Error", "Unable to save configuration !"); + conf_write_autoconf(0); +} + + +static void +store_filename(GtkFileSelection * file_selector, gpointer user_data) +{ + const gchar *fn; + + fn = gtk_file_selection_get_filename(GTK_FILE_SELECTION + (user_data)); + + if (conf_write(fn)) + text_insert_msg("Error", "Unable to save configuration !"); + + gtk_widget_destroy(GTK_WIDGET(user_data)); +} + +void on_save_as1_activate(GtkMenuItem * menuitem, gpointer user_data) +{ + GtkWidget *fs; + + fs = gtk_file_selection_new("Save file as..."); + g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(fs)->ok_button), + "clicked", + G_CALLBACK(store_filename), (gpointer) fs); + g_signal_connect_swapped(GTK_OBJECT + (GTK_FILE_SELECTION(fs)->ok_button), + "clicked", G_CALLBACK(gtk_widget_destroy), + (gpointer) fs); + g_signal_connect_swapped(GTK_OBJECT + (GTK_FILE_SELECTION(fs)->cancel_button), + "clicked", G_CALLBACK(gtk_widget_destroy), + (gpointer) fs); + gtk_widget_show(fs); +} + + +void on_quit1_activate(GtkMenuItem * menuitem, gpointer user_data) +{ + if (!on_window1_delete_event(NULL, NULL, NULL)) + gtk_widget_destroy(GTK_WIDGET(main_wnd)); +} + + +void on_show_name1_activate(GtkMenuItem * menuitem, gpointer user_data) +{ + GtkTreeViewColumn *col; + + show_name = GTK_CHECK_MENU_ITEM(menuitem)->active; + col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_NAME); + if (col) + gtk_tree_view_column_set_visible(col, show_name); +} + + +void on_show_range1_activate(GtkMenuItem * menuitem, gpointer user_data) +{ + GtkTreeViewColumn *col; + + show_range = GTK_CHECK_MENU_ITEM(menuitem)->active; + col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_NO); + if (col) + gtk_tree_view_column_set_visible(col, show_range); + col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_MOD); + if (col) + gtk_tree_view_column_set_visible(col, show_range); + col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_YES); + if (col) + gtk_tree_view_column_set_visible(col, show_range); + +} + + +void on_show_data1_activate(GtkMenuItem * menuitem, gpointer user_data) +{ + GtkTreeViewColumn *col; + + show_value = GTK_CHECK_MENU_ITEM(menuitem)->active; + col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_VALUE); + if (col) + gtk_tree_view_column_set_visible(col, show_value); +} + + +void +on_set_option_mode1_activate(GtkMenuItem *menuitem, gpointer user_data) +{ + opt_mode = OPT_NORMAL; + gtk_tree_store_clear(tree2); + display_tree(&rootmenu); /* instead of update_tree to speed-up */ +} + + +void +on_set_option_mode2_activate(GtkMenuItem *menuitem, gpointer user_data) +{ + opt_mode = OPT_ALL; + gtk_tree_store_clear(tree2); + display_tree(&rootmenu); /* instead of update_tree to speed-up */ +} + + +void +on_set_option_mode3_activate(GtkMenuItem *menuitem, gpointer user_data) +{ + opt_mode = OPT_PROMPT; + gtk_tree_store_clear(tree2); + display_tree(&rootmenu); /* instead of update_tree to speed-up */ +} + + +void on_introduction1_activate(GtkMenuItem * menuitem, gpointer user_data) +{ + GtkWidget *dialog; + const gchar *intro_text = + "Welcome to gkc, the GTK+ graphical configuration tool\n" + "For each option, a blank box indicates the feature is disabled, a\n" + "check indicates it is enabled, and a dot indicates that it is to\n" + "be compiled as a module. Clicking on the box will cycle through the three states.\n" + "\n" + "If you do not see an option (e.g., a device driver) that you\n" + "believe should be present, try turning on Show All Options\n" + "under the Options menu.\n" + "Although there is no cross reference yet to help you figure out\n" + "what other options must be enabled to support the option you\n" + "are interested in, you can still view the help of a grayed-out\n" + "option.\n" + "\n" + "Toggling Show Debug Info under the Options menu will show \n" + "the dependencies, which you can then match by examining other options."; + + dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_INFO, + GTK_BUTTONS_CLOSE, "%s", intro_text); + g_signal_connect_swapped(GTK_OBJECT(dialog), "response", + G_CALLBACK(gtk_widget_destroy), + GTK_OBJECT(dialog)); + gtk_widget_show_all(dialog); +} + + +void on_about1_activate(GtkMenuItem * menuitem, gpointer user_data) +{ + GtkWidget *dialog; + const gchar *about_text = + "gkc is copyright (c) 2002 Romain Lievin <roms@lpg.ticalc.org>.\n" + "Based on the source code from Roman Zippel.\n"; + + dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_INFO, + GTK_BUTTONS_CLOSE, "%s", about_text); + g_signal_connect_swapped(GTK_OBJECT(dialog), "response", + G_CALLBACK(gtk_widget_destroy), + GTK_OBJECT(dialog)); + gtk_widget_show_all(dialog); +} + + +void on_license1_activate(GtkMenuItem * menuitem, gpointer user_data) +{ + GtkWidget *dialog; + const gchar *license_text = + "gkc is released under the terms of the GNU GPL v2.\n" + "For more information, please see the source code or\n" + "visit http://www.fsf.org/licenses/licenses.html\n"; + + dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_INFO, + GTK_BUTTONS_CLOSE, "%s", license_text); + g_signal_connect_swapped(GTK_OBJECT(dialog), "response", + G_CALLBACK(gtk_widget_destroy), + GTK_OBJECT(dialog)); + gtk_widget_show_all(dialog); +} + + +void on_back_clicked(GtkButton * button, gpointer user_data) +{ + enum prop_type ptype; + + current = current->parent; + ptype = current->prompt ? current->prompt->type : P_UNKNOWN; + if (ptype != P_MENU) + current = current->parent; + display_tree_part(); + + if (current == &rootmenu) + gtk_widget_set_sensitive(back_btn, FALSE); +} + + +void on_load_clicked(GtkButton * button, gpointer user_data) +{ + on_load1_activate(NULL, user_data); +} + + +void on_single_clicked(GtkButton * button, gpointer user_data) +{ + view_mode = SINGLE_VIEW; + gtk_widget_hide(tree1_w); + current = &rootmenu; + display_tree_part(); +} + + +void on_split_clicked(GtkButton * button, gpointer user_data) +{ + gint w, h; + view_mode = SPLIT_VIEW; + gtk_widget_show(tree1_w); + gtk_window_get_default_size(GTK_WINDOW(main_wnd), &w, &h); + gtk_paned_set_position(GTK_PANED(hpaned), w / 2); + if (tree2) + gtk_tree_store_clear(tree2); + display_list(); + + /* Disable back btn, like in full mode. */ + gtk_widget_set_sensitive(back_btn, FALSE); +} + + +void on_full_clicked(GtkButton * button, gpointer user_data) +{ + view_mode = FULL_VIEW; + gtk_widget_hide(tree1_w); + if (tree2) + gtk_tree_store_clear(tree2); + display_tree(&rootmenu); + gtk_widget_set_sensitive(back_btn, FALSE); +} + + +void on_collapse_clicked(GtkButton * button, gpointer user_data) +{ + gtk_tree_view_collapse_all(GTK_TREE_VIEW(tree2_w)); +} + + +void on_expand_clicked(GtkButton * button, gpointer user_data) +{ + gtk_tree_view_expand_all(GTK_TREE_VIEW(tree2_w)); +} + + +/* CTree Callbacks */ + +/* Change hex/int/string value in the cell */ +static void renderer_edited(GtkCellRendererText * cell, + const gchar * path_string, + const gchar * new_text, gpointer user_data) +{ + GtkTreePath *path = gtk_tree_path_new_from_string(path_string); + GtkTreeIter iter; + const char *old_def, *new_def; + struct menu *menu; + struct symbol *sym; + + if (!gtk_tree_model_get_iter(model2, &iter, path)) + return; + + gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1); + sym = menu->sym; + + gtk_tree_model_get(model2, &iter, COL_VALUE, &old_def, -1); + new_def = new_text; + + sym_set_string_value(sym, new_def); + + update_tree(&rootmenu, NULL); + + gtk_tree_path_free(path); +} + +/* Change the value of a symbol and update the tree */ +static void change_sym_value(struct menu *menu, gint col) +{ + struct symbol *sym = menu->sym; + tristate newval; + + if (!sym) + return; + + if (col == COL_NO) + newval = no; + else if (col == COL_MOD) + newval = mod; + else if (col == COL_YES) + newval = yes; + else + return; + + switch (sym_get_type(sym)) { + case S_BOOLEAN: + case S_TRISTATE: + if (!sym_tristate_within_range(sym, newval)) + newval = yes; + sym_set_tristate_value(sym, newval); + if (view_mode == FULL_VIEW) + update_tree(&rootmenu, NULL); + else if (view_mode == SPLIT_VIEW) { + update_tree(browsed, NULL); + display_list(); + } + else if (view_mode == SINGLE_VIEW) + display_tree_part(); //fixme: keep exp/coll + break; + case S_INT: + case S_HEX: + case S_STRING: + default: + break; + } +} + +static void toggle_sym_value(struct menu *menu) +{ + if (!menu->sym) + return; + + sym_toggle_tristate_value(menu->sym); + if (view_mode == FULL_VIEW) + update_tree(&rootmenu, NULL); + else if (view_mode == SPLIT_VIEW) { + update_tree(browsed, NULL); + display_list(); + } + else if (view_mode == SINGLE_VIEW) + display_tree_part(); //fixme: keep exp/coll +} + +static gint column2index(GtkTreeViewColumn * column) +{ + gint i; + + for (i = 0; i < COL_NUMBER; i++) { + GtkTreeViewColumn *col; + + col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), i); + if (col == column) + return i; + } + + return -1; +} + + +/* User click: update choice (full) or goes down (single) */ +gboolean +on_treeview2_button_press_event(GtkWidget * widget, + GdkEventButton * event, gpointer user_data) +{ + GtkTreeView *view = GTK_TREE_VIEW(widget); + GtkTreePath *path; + GtkTreeViewColumn *column; + GtkTreeIter iter; + struct menu *menu; + gint col; + +#if GTK_CHECK_VERSION(2,1,4) // bug in ctree with earlier version of GTK + gint tx = (gint) event->x; + gint ty = (gint) event->y; + gint cx, cy; + + gtk_tree_view_get_path_at_pos(view, tx, ty, &path, &column, &cx, + &cy); +#else + gtk_tree_view_get_cursor(view, &path, &column); +#endif + if (path == NULL) + return FALSE; + + if (!gtk_tree_model_get_iter(model2, &iter, path)) + return FALSE; + gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1); + + col = column2index(column); + if (event->type == GDK_2BUTTON_PRESS) { + enum prop_type ptype; + ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; + + if (ptype == P_MENU && view_mode != FULL_VIEW && col == COL_OPTION) { + // goes down into menu + current = menu; + display_tree_part(); + gtk_widget_set_sensitive(back_btn, TRUE); + } else if (col == COL_OPTION) { + toggle_sym_value(menu); + gtk_tree_view_expand_row(view, path, TRUE); + } + } else { + if (col == COL_VALUE) { + toggle_sym_value(menu); + gtk_tree_view_expand_row(view, path, TRUE); + } else if (col == COL_NO || col == COL_MOD + || col == COL_YES) { + change_sym_value(menu, col); + gtk_tree_view_expand_row(view, path, TRUE); + } + } + + return FALSE; +} + +/* Key pressed: update choice */ +gboolean +on_treeview2_key_press_event(GtkWidget * widget, + GdkEventKey * event, gpointer user_data) +{ + GtkTreeView *view = GTK_TREE_VIEW(widget); + GtkTreePath *path; + GtkTreeViewColumn *column; + GtkTreeIter iter; + struct menu *menu; + gint col; + + gtk_tree_view_get_cursor(view, &path, &column); + if (path == NULL) + return FALSE; + + if (event->keyval == GDK_space) { + if (gtk_tree_view_row_expanded(view, path)) + gtk_tree_view_collapse_row(view, path); + else + gtk_tree_view_expand_row(view, path, FALSE); + return TRUE; + } + if (event->keyval == GDK_KP_Enter) { + } + if (widget == tree1_w) + return FALSE; + + gtk_tree_model_get_iter(model2, &iter, path); + gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1); + + if (!strcasecmp(event->string, "n")) + col = COL_NO; + else if (!strcasecmp(event->string, "m")) + col = COL_MOD; + else if (!strcasecmp(event->string, "y")) + col = COL_YES; + else + col = -1; + change_sym_value(menu, col); + + return FALSE; +} + + +/* Row selection changed: update help */ +void +on_treeview2_cursor_changed(GtkTreeView * treeview, gpointer user_data) +{ + GtkTreeSelection *selection; + GtkTreeIter iter; + struct menu *menu; + + selection = gtk_tree_view_get_selection(treeview); + if (gtk_tree_selection_get_selected(selection, &model2, &iter)) { + gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1); + text_insert_help(menu); + } +} + + +/* User click: display sub-tree in the right frame. */ +gboolean +on_treeview1_button_press_event(GtkWidget * widget, + GdkEventButton * event, gpointer user_data) +{ + GtkTreeView *view = GTK_TREE_VIEW(widget); + GtkTreePath *path; + GtkTreeViewColumn *column; + GtkTreeIter iter; + struct menu *menu; + + gint tx = (gint) event->x; + gint ty = (gint) event->y; + gint cx, cy; + + gtk_tree_view_get_path_at_pos(view, tx, ty, &path, &column, &cx, + &cy); + if (path == NULL) + return FALSE; + + gtk_tree_model_get_iter(model1, &iter, path); + gtk_tree_model_get(model1, &iter, COL_MENU, &menu, -1); + + if (event->type == GDK_2BUTTON_PRESS) { + toggle_sym_value(menu); + current = menu; + display_tree_part(); + } else { + browsed = menu; + display_tree_part(); + } + + gtk_widget_realize(tree2_w); + gtk_tree_view_set_cursor(view, path, NULL, FALSE); + gtk_widget_grab_focus(tree2_w); + + return FALSE; +} + + +/* Fill a row of strings */ +static gchar **fill_row(struct menu *menu) +{ + static gchar *row[COL_NUMBER]; + struct symbol *sym = menu->sym; + const char *def; + int stype; + tristate val; + enum prop_type ptype; + int i; + + for (i = COL_OPTION; i <= COL_COLOR; i++) + g_free(row[i]); + bzero(row, sizeof(row)); + + row[COL_OPTION] = + g_strdup_printf("%s %s", menu_get_prompt(menu), + sym && !sym_has_value(sym) ? "(NEW)" : ""); + + if (opt_mode == OPT_ALL && !menu_is_visible(menu)) + row[COL_COLOR] = g_strdup("DarkGray"); + else if (opt_mode == OPT_PROMPT && + menu_has_prompt(menu) && !menu_is_visible(menu)) + row[COL_COLOR] = g_strdup("DarkGray"); + else + row[COL_COLOR] = g_strdup("Black"); + + ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; + switch (ptype) { + case P_MENU: + row[COL_PIXBUF] = (gchar *) xpm_menu; + if (view_mode == SINGLE_VIEW) + row[COL_PIXVIS] = GINT_TO_POINTER(TRUE); + row[COL_BTNVIS] = GINT_TO_POINTER(FALSE); + break; + case P_COMMENT: + row[COL_PIXBUF] = (gchar *) xpm_void; + row[COL_PIXVIS] = GINT_TO_POINTER(FALSE); + row[COL_BTNVIS] = GINT_TO_POINTER(FALSE); + break; + default: + row[COL_PIXBUF] = (gchar *) xpm_void; + row[COL_PIXVIS] = GINT_TO_POINTER(FALSE); + row[COL_BTNVIS] = GINT_TO_POINTER(TRUE); + break; + } + + if (!sym) + return row; + row[COL_NAME] = g_strdup(sym->name); + + sym_calc_value(sym); + sym->flags &= ~SYMBOL_CHANGED; + + if (sym_is_choice(sym)) { // parse childs for getting final value + struct menu *child; + struct symbol *def_sym = sym_get_choice_value(sym); + struct menu *def_menu = NULL; + + row[COL_BTNVIS] = GINT_TO_POINTER(FALSE); + + for (child = menu->list; child; child = child->next) { + if (menu_is_visible(child) + && child->sym == def_sym) + def_menu = child; + } + + if (def_menu) + row[COL_VALUE] = + g_strdup(menu_get_prompt(def_menu)); + } + if (sym->flags & SYMBOL_CHOICEVAL) + row[COL_BTNRAD] = GINT_TO_POINTER(TRUE); + + stype = sym_get_type(sym); + switch (stype) { + case S_BOOLEAN: + if (GPOINTER_TO_INT(row[COL_PIXVIS]) == FALSE) + row[COL_BTNVIS] = GINT_TO_POINTER(TRUE); + if (sym_is_choice(sym)) + break; + /* fall through */ + case S_TRISTATE: + val = sym_get_tristate_value(sym); + switch (val) { + case no: + row[COL_NO] = g_strdup("N"); + row[COL_VALUE] = g_strdup("N"); + row[COL_BTNACT] = GINT_TO_POINTER(FALSE); + row[COL_BTNINC] = GINT_TO_POINTER(FALSE); + break; + case mod: + row[COL_MOD] = g_strdup("M"); + row[COL_VALUE] = g_strdup("M"); + row[COL_BTNINC] = GINT_TO_POINTER(TRUE); + break; + case yes: + row[COL_YES] = g_strdup("Y"); + row[COL_VALUE] = g_strdup("Y"); + row[COL_BTNACT] = GINT_TO_POINTER(TRUE); + row[COL_BTNINC] = GINT_TO_POINTER(FALSE); + break; + } + + if (val != no && sym_tristate_within_range(sym, no)) + row[COL_NO] = g_strdup("_"); + if (val != mod && sym_tristate_within_range(sym, mod)) + row[COL_MOD] = g_strdup("_"); + if (val != yes && sym_tristate_within_range(sym, yes)) + row[COL_YES] = g_strdup("_"); + break; + case S_INT: + case S_HEX: + case S_STRING: + def = sym_get_string_value(sym); + row[COL_VALUE] = g_strdup(def); + row[COL_EDIT] = GINT_TO_POINTER(TRUE); + row[COL_BTNVIS] = GINT_TO_POINTER(FALSE); + break; + } + + return row; +} + + +/* Set the node content with a row of strings */ +static void set_node(GtkTreeIter * node, struct menu *menu, gchar ** row) +{ + GdkColor color; + gboolean success; + GdkPixbuf *pix; + + pix = gdk_pixbuf_new_from_xpm_data((const char **) + row[COL_PIXBUF]); + + gdk_color_parse(row[COL_COLOR], &color); + gdk_colormap_alloc_colors(gdk_colormap_get_system(), &color, 1, + FALSE, FALSE, &success); + + gtk_tree_store_set(tree, node, + COL_OPTION, row[COL_OPTION], + COL_NAME, row[COL_NAME], + COL_NO, row[COL_NO], + COL_MOD, row[COL_MOD], + COL_YES, row[COL_YES], + COL_VALUE, row[COL_VALUE], + COL_MENU, (gpointer) menu, + COL_COLOR, &color, + COL_EDIT, GPOINTER_TO_INT(row[COL_EDIT]), + COL_PIXBUF, pix, + COL_PIXVIS, GPOINTER_TO_INT(row[COL_PIXVIS]), + COL_BTNVIS, GPOINTER_TO_INT(row[COL_BTNVIS]), + COL_BTNACT, GPOINTER_TO_INT(row[COL_BTNACT]), + COL_BTNINC, GPOINTER_TO_INT(row[COL_BTNINC]), + COL_BTNRAD, GPOINTER_TO_INT(row[COL_BTNRAD]), + -1); + + g_object_unref(pix); +} + + +/* Add a node to the tree */ +static void place_node(struct menu *menu, char **row) +{ + GtkTreeIter *parent = parents[indent - 1]; + GtkTreeIter *node = parents[indent]; + + gtk_tree_store_append(tree, node, parent); + set_node(node, menu, row); +} + + +/* Find a node in the GTK+ tree */ +static GtkTreeIter found; + +/* + * Find a menu in the GtkTree starting at parent. + */ +static GtkTreeIter *gtktree_iter_find_node(GtkTreeIter *parent, + struct menu *tofind) +{ + GtkTreeIter iter; + GtkTreeIter *child = &iter; + gboolean valid; + GtkTreeIter *ret; + + valid = gtk_tree_model_iter_children(model2, child, parent); + while (valid) { + struct menu *menu; + + gtk_tree_model_get(model2, child, 6, &menu, -1); + + if (menu == tofind) { + memcpy(&found, child, sizeof(GtkTreeIter)); + return &found; + } + + ret = gtktree_iter_find_node(child, tofind); + if (ret) + return ret; + + valid = gtk_tree_model_iter_next(model2, child); + } + + return NULL; +} + + +/* + * Update the tree by adding/removing entries + * Does not change other nodes + */ +static void update_tree(struct menu *src, GtkTreeIter * dst) +{ + struct menu *child1; + GtkTreeIter iter, tmp; + GtkTreeIter *child2 = &iter; + gboolean valid; + GtkTreeIter *sibling; + struct symbol *sym; + struct menu *menu1, *menu2; + + if (src == &rootmenu) + indent = 1; + + valid = gtk_tree_model_iter_children(model2, child2, dst); + for (child1 = src->list; child1; child1 = child1->next) { + + sym = child1->sym; + + reparse: + menu1 = child1; + if (valid) + gtk_tree_model_get(model2, child2, COL_MENU, + &menu2, -1); + else + menu2 = NULL; // force adding of a first child + +#ifdef DEBUG + printf("%*c%s | %s\n", indent, ' ', + menu1 ? menu_get_prompt(menu1) : "nil", + menu2 ? menu_get_prompt(menu2) : "nil"); +#endif + + if ((opt_mode == OPT_NORMAL && !menu_is_visible(child1)) || + (opt_mode == OPT_PROMPT && !menu_has_prompt(child1)) || + (opt_mode == OPT_ALL && !menu_get_prompt(child1))) { + + /* remove node */ + if (gtktree_iter_find_node(dst, menu1) != NULL) { + memcpy(&tmp, child2, sizeof(GtkTreeIter)); + valid = gtk_tree_model_iter_next(model2, + child2); + gtk_tree_store_remove(tree2, &tmp); + if (!valid) + return; /* next parent */ + else + goto reparse; /* next child */ + } else + continue; + } + + if (menu1 != menu2) { + if (gtktree_iter_find_node(dst, menu1) == NULL) { // add node + if (!valid && !menu2) + sibling = NULL; + else + sibling = child2; + gtk_tree_store_insert_before(tree2, + child2, + dst, sibling); + set_node(child2, menu1, fill_row(menu1)); + if (menu2 == NULL) + valid = TRUE; + } else { // remove node + memcpy(&tmp, child2, sizeof(GtkTreeIter)); + valid = gtk_tree_model_iter_next(model2, + child2); + gtk_tree_store_remove(tree2, &tmp); + if (!valid) + return; // next parent + else + goto reparse; // next child + } + } else if (sym && (sym->flags & SYMBOL_CHANGED)) { + set_node(child2, menu1, fill_row(menu1)); + } + + indent++; + update_tree(child1, child2); + indent--; + + valid = gtk_tree_model_iter_next(model2, child2); + } +} + + +/* Display the whole tree (single/split/full view) */ +static void display_tree(struct menu *menu) +{ + struct symbol *sym; + struct property *prop; + struct menu *child; + enum prop_type ptype; + + if (menu == &rootmenu) { + indent = 1; + current = &rootmenu; + } + + for (child = menu->list; child; child = child->next) { + prop = child->prompt; + sym = child->sym; + ptype = prop ? prop->type : P_UNKNOWN; + + if (sym) + sym->flags &= ~SYMBOL_CHANGED; + + if ((view_mode == SPLIT_VIEW) + && !(child->flags & MENU_ROOT) && (tree == tree1)) + continue; + + if ((view_mode == SPLIT_VIEW) && (child->flags & MENU_ROOT) + && (tree == tree2)) + continue; + + if ((opt_mode == OPT_NORMAL && menu_is_visible(child)) || + (opt_mode == OPT_PROMPT && menu_has_prompt(child)) || + (opt_mode == OPT_ALL && menu_get_prompt(child))) + place_node(child, fill_row(child)); +#ifdef DEBUG + printf("%*c%s: ", indent, ' ', menu_get_prompt(child)); + printf("%s", child->flags & MENU_ROOT ? "rootmenu | " : ""); + printf("%s", prop_get_type_name(ptype)); + printf(" | "); + if (sym) { + printf("%s", sym_type_name(sym->type)); + printf(" | "); + printf("%s", dbg_sym_flags(sym->flags)); + printf("\n"); + } else + printf("\n"); +#endif + if ((view_mode != FULL_VIEW) && (ptype == P_MENU) + && (tree == tree2)) + continue; +/* + if (((menu != &rootmenu) && !(menu->flags & MENU_ROOT)) + || (view_mode == FULL_VIEW) + || (view_mode == SPLIT_VIEW))*/ + + /* Change paned position if the view is not in 'split mode' */ + if (view_mode == SINGLE_VIEW || view_mode == FULL_VIEW) { + gtk_paned_set_position(GTK_PANED(hpaned), 0); + } + + if (((view_mode == SINGLE_VIEW) && (menu->flags & MENU_ROOT)) + || (view_mode == FULL_VIEW) + || (view_mode == SPLIT_VIEW)) { + indent++; + display_tree(child); + indent--; + } + } +} + +/* Display a part of the tree starting at current node (single/split view) */ +static void display_tree_part(void) +{ + if (tree2) + gtk_tree_store_clear(tree2); + if (view_mode == SINGLE_VIEW) + display_tree(current); + else if (view_mode == SPLIT_VIEW) + display_tree(browsed); + gtk_tree_view_expand_all(GTK_TREE_VIEW(tree2_w)); +} + +/* Display the list in the left frame (split view) */ +static void display_list(void) +{ + if (tree1) + gtk_tree_store_clear(tree1); + + tree = tree1; + display_tree(&rootmenu); + gtk_tree_view_expand_all(GTK_TREE_VIEW(tree1_w)); + tree = tree2; +} + +static void fixup_rootmenu(struct menu *menu) +{ + struct menu *child; + static int menu_cnt = 0; + + menu->flags |= MENU_ROOT; + for (child = menu->list; child; child = child->next) { + if (child->prompt && child->prompt->type == P_MENU) { + menu_cnt++; + fixup_rootmenu(child); + menu_cnt--; + } else if (!menu_cnt) + fixup_rootmenu(child); + } +} + + +/* Main */ +int main(int ac, char *av[]) +{ + const char *name; + char *env; + gchar *glade_file; + + /* GTK stuffs */ + gtk_set_locale(); + gtk_init(&ac, &av); + glade_init(); + + //add_pixmap_directory (PACKAGE_DATA_DIR "/" PACKAGE "/pixmaps"); + //add_pixmap_directory (PACKAGE_SOURCE_DIR "/pixmaps"); + + /* Determine GUI path */ + env = getenv(SRCTREE); + if (env) + glade_file = g_strconcat(env, "/scripts/kconfig/gconf.glade", NULL); + else if (av[0][0] == '/') + glade_file = g_strconcat(av[0], ".glade", NULL); + else + glade_file = g_strconcat(g_get_current_dir(), "/", av[0], ".glade", NULL); + + /* Conf stuffs */ + if (ac > 1 && av[1][0] == '-') { + switch (av[1][1]) { + case 'a': + //showAll = 1; + break; + case 's': + conf_set_message_callback(NULL); + break; + case 'h': + case '?': + printf("%s [-s] <config>\n", av[0]); + exit(0); + } + name = av[2]; + } else + name = av[1]; + + conf_parse(name); + fixup_rootmenu(&rootmenu); + conf_read(NULL); + + /* Load the interface and connect signals */ + init_main_window(glade_file); + init_tree_model(); + init_left_tree(); + init_right_tree(); + + switch (view_mode) { + case SINGLE_VIEW: + display_tree_part(); + break; + case SPLIT_VIEW: + display_list(); + break; + case FULL_VIEW: + display_tree(&rootmenu); + break; + } + + gtk_main(); + + return 0; +} + +static void conf_changed(void) +{ + bool changed = conf_get_changed(); + gtk_widget_set_sensitive(save_btn, changed); + gtk_widget_set_sensitive(save_menu_item, changed); +} diff --git a/src/net/scripts/kconfig/gconf.glade b/src/net/scripts/kconfig/gconf.glade new file mode 100644 index 0000000..aa483cb --- /dev/null +++ b/src/net/scripts/kconfig/gconf.glade @@ -0,0 +1,661 @@ +<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> + +<glade-interface> + +<widget class="GtkWindow" id="window1"> + <property name="visible">True</property> + <property name="title" translatable="yes">Gtk Kernel Configurator</property> + <property name="type">GTK_WINDOW_TOPLEVEL</property> + <property name="window_position">GTK_WIN_POS_NONE</property> + <property name="modal">False</property> + <property name="default_width">640</property> + <property name="default_height">480</property> + <property name="resizable">True</property> + <property name="destroy_with_parent">False</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> + <signal name="destroy" handler="on_window1_destroy" object="window1"/> + <signal name="size_request" handler="on_window1_size_request" object="vpaned1" last_modification_time="Fri, 11 Jan 2002 16:17:11 GMT"/> + <signal name="delete_event" handler="on_window1_delete_event" object="window1" last_modification_time="Sun, 09 Mar 2003 19:42:46 GMT"/> + + <child> + <widget class="GtkVBox" id="vbox1"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkMenuBar" id="menubar1"> + <property name="visible">True</property> + + <child> + <widget class="GtkMenuItem" id="file1"> + <property name="visible">True</property> + <property name="label" translatable="yes">_File</property> + <property name="use_underline">True</property> + + <child> + <widget class="GtkMenu" id="file1_menu"> + + <child> + <widget class="GtkImageMenuItem" id="load1"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Load a config file</property> + <property name="label" translatable="yes">_Load</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_load1_activate"/> + <accelerator key="L" modifiers="GDK_CONTROL_MASK" signal="activate"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image39"> + <property name="visible">True</property> + <property name="stock">gtk-open</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkImageMenuItem" id="save1"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Save the config in .config</property> + <property name="label" translatable="yes">_Save</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_save_activate"/> + <accelerator key="S" modifiers="GDK_CONTROL_MASK" signal="activate"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image40"> + <property name="visible">True</property> + <property name="stock">gtk-save</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkImageMenuItem" id="save_as1"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Save the config in a file</property> + <property name="label" translatable="yes">Save _as</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_save_as1_activate"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image41"> + <property name="visible">True</property> + <property name="stock">gtk-save-as</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkSeparatorMenuItem" id="separator1"> + <property name="visible">True</property> + </widget> + </child> + + <child> + <widget class="GtkImageMenuItem" id="quit1"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Quit</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_quit1_activate"/> + <accelerator key="Q" modifiers="GDK_CONTROL_MASK" signal="activate"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image42"> + <property name="visible">True</property> + <property name="stock">gtk-quit</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="options1"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Options</property> + <property name="use_underline">True</property> + + <child> + <widget class="GtkMenu" id="options1_menu"> + + <child> + <widget class="GtkCheckMenuItem" id="show_name1"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Show name</property> + <property name="label" translatable="yes">Show _name</property> + <property name="use_underline">True</property> + <property name="active">False</property> + <signal name="activate" handler="on_show_name1_activate"/> + </widget> + </child> + + <child> + <widget class="GtkCheckMenuItem" id="show_range1"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Show range (Y/M/N)</property> + <property name="label" translatable="yes">Show _range</property> + <property name="use_underline">True</property> + <property name="active">False</property> + <signal name="activate" handler="on_show_range1_activate"/> + </widget> + </child> + + <child> + <widget class="GtkCheckMenuItem" id="show_data1"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Show value of the option</property> + <property name="label" translatable="yes">Show _data</property> + <property name="use_underline">True</property> + <property name="active">False</property> + <signal name="activate" handler="on_show_data1_activate"/> + </widget> + </child> + + <child> + <widget class="GtkSeparatorMenuItem" id="separator2"> + <property name="visible">True</property> + </widget> + </child> + + <child> + <widget class="GtkRadioMenuItem" id="set_option_mode1"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Show normal options</property> + <property name="label" translatable="yes">Show normal options</property> + <property name="use_underline">True</property> + <property name="active">True</property> + <signal name="activate" handler="on_set_option_mode1_activate"/> + </widget> + </child> + + <child> + <widget class="GtkRadioMenuItem" id="set_option_mode2"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Show all options</property> + <property name="label" translatable="yes">Show all _options</property> + <property name="use_underline">True</property> + <property name="active">False</property> + <property name="group">set_option_mode1</property> + <signal name="activate" handler="on_set_option_mode2_activate"/> + </widget> + </child> + + <child> + <widget class="GtkRadioMenuItem" id="set_option_mode3"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Show all options with prompts</property> + <property name="label" translatable="yes">Show all prompt options</property> + <property name="use_underline">True</property> + <property name="active">False</property> + <property name="group">set_option_mode1</property> + <signal name="activate" handler="on_set_option_mode3_activate"/> + </widget> + </child> + + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="help1"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Help</property> + <property name="use_underline">True</property> + + <child> + <widget class="GtkMenu" id="help1_menu"> + + <child> + <widget class="GtkImageMenuItem" id="introduction1"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Introduction</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_introduction1_activate" last_modification_time="Fri, 15 Nov 2002 20:26:30 GMT"/> + <accelerator key="I" modifiers="GDK_CONTROL_MASK" signal="activate"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image43"> + <property name="visible">True</property> + <property name="stock">gtk-dialog-question</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkImageMenuItem" id="about1"> + <property name="visible">True</property> + <property name="label" translatable="yes">_About</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_about1_activate" last_modification_time="Fri, 15 Nov 2002 20:26:30 GMT"/> + <accelerator key="A" modifiers="GDK_CONTROL_MASK" signal="activate"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image44"> + <property name="visible">True</property> + <property name="stock">gtk-properties</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkImageMenuItem" id="license1"> + <property name="visible">True</property> + <property name="label" translatable="yes">_License</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_license1_activate" last_modification_time="Fri, 15 Nov 2002 20:26:30 GMT"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image45"> + <property name="visible">True</property> + <property name="stock">gtk-justify-fill</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + </widget> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkHandleBox" id="handlebox1"> + <property name="visible">True</property> + <property name="shadow_type">GTK_SHADOW_OUT</property> + <property name="handle_position">GTK_POS_LEFT</property> + <property name="snap_edge">GTK_POS_TOP</property> + + <child> + <widget class="GtkToolbar" id="toolbar1"> + <property name="visible">True</property> + <property name="orientation">GTK_ORIENTATION_HORIZONTAL</property> + <property name="toolbar_style">GTK_TOOLBAR_BOTH</property> + <property name="tooltips">True</property> + <property name="show_arrow">True</property> + + <child> + <widget class="GtkToolButton" id="button1"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Goes up of one level (single view)</property> + <property name="label" translatable="yes">Back</property> + <property name="use_underline">True</property> + <property name="stock_id">gtk-undo</property> + <property name="visible_horizontal">True</property> + <property name="visible_vertical">True</property> + <property name="is_important">False</property> + <signal name="clicked" handler="on_back_clicked"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + + <child> + <widget class="GtkToolItem" id="toolitem1"> + <property name="visible">True</property> + <property name="visible_horizontal">True</property> + <property name="visible_vertical">True</property> + <property name="is_important">False</property> + + <child> + <widget class="GtkVSeparator" id="vseparator1"> + <property name="visible">True</property> + </widget> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + + <child> + <widget class="GtkToolButton" id="button2"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Load a config file</property> + <property name="label" translatable="yes">Load</property> + <property name="use_underline">True</property> + <property name="stock_id">gtk-open</property> + <property name="visible_horizontal">True</property> + <property name="visible_vertical">True</property> + <property name="is_important">False</property> + <signal name="clicked" handler="on_load_clicked"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + + <child> + <widget class="GtkToolButton" id="button3"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Save a config file</property> + <property name="label" translatable="yes">Save</property> + <property name="use_underline">True</property> + <property name="stock_id">gtk-save</property> + <property name="visible_horizontal">True</property> + <property name="visible_vertical">True</property> + <property name="is_important">False</property> + <signal name="clicked" handler="on_save_activate"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + + <child> + <widget class="GtkToolItem" id="toolitem2"> + <property name="visible">True</property> + <property name="visible_horizontal">True</property> + <property name="visible_vertical">True</property> + <property name="is_important">False</property> + + <child> + <widget class="GtkVSeparator" id="vseparator2"> + <property name="visible">True</property> + </widget> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + + <child> + <widget class="GtkToolButton" id="button4"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Single view</property> + <property name="label" translatable="yes">Single</property> + <property name="use_underline">True</property> + <property name="stock_id">gtk-missing-image</property> + <property name="visible_horizontal">True</property> + <property name="visible_vertical">True</property> + <property name="is_important">False</property> + <signal name="clicked" handler="on_single_clicked" last_modification_time="Sun, 12 Jan 2003 14:28:39 GMT"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + + <child> + <widget class="GtkToolButton" id="button5"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Split view</property> + <property name="label" translatable="yes">Split</property> + <property name="use_underline">True</property> + <property name="stock_id">gtk-missing-image</property> + <property name="visible_horizontal">True</property> + <property name="visible_vertical">True</property> + <property name="is_important">False</property> + <signal name="clicked" handler="on_split_clicked" last_modification_time="Sun, 12 Jan 2003 14:28:45 GMT"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + + <child> + <widget class="GtkToolButton" id="button6"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Full view</property> + <property name="label" translatable="yes">Full</property> + <property name="use_underline">True</property> + <property name="stock_id">gtk-missing-image</property> + <property name="visible_horizontal">True</property> + <property name="visible_vertical">True</property> + <property name="is_important">False</property> + <signal name="clicked" handler="on_full_clicked" last_modification_time="Sun, 12 Jan 2003 14:28:50 GMT"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + + <child> + <widget class="GtkToolItem" id="toolitem3"> + <property name="visible">True</property> + <property name="visible_horizontal">True</property> + <property name="visible_vertical">True</property> + <property name="is_important">False</property> + + <child> + <widget class="GtkVSeparator" id="vseparator3"> + <property name="visible">True</property> + </widget> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + + <child> + <widget class="GtkToolButton" id="button7"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Collapse the whole tree in the right frame</property> + <property name="label" translatable="yes">Collapse</property> + <property name="use_underline">True</property> + <property name="stock_id">gtk-remove</property> + <property name="visible_horizontal">True</property> + <property name="visible_vertical">True</property> + <property name="is_important">False</property> + <signal name="clicked" handler="on_collapse_clicked"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + + <child> + <widget class="GtkToolButton" id="button8"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Expand the whole tree in the right frame</property> + <property name="label" translatable="yes">Expand</property> + <property name="use_underline">True</property> + <property name="stock_id">gtk-add</property> + <property name="visible_horizontal">True</property> + <property name="visible_vertical">True</property> + <property name="is_important">False</property> + <signal name="clicked" handler="on_expand_clicked"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkHPaned" id="hpaned1"> + <property name="width_request">1</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="position">0</property> + + <child> + <widget class="GtkScrolledWindow" id="scrolledwindow1"> + <property name="visible">True</property> + <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property> + <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> + <property name="shadow_type">GTK_SHADOW_IN</property> + <property name="window_placement">GTK_CORNER_TOP_LEFT</property> + + <child> + <widget class="GtkTreeView" id="treeview1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="headers_visible">True</property> + <property name="rules_hint">False</property> + <property name="reorderable">False</property> + <property name="enable_search">False</property> + <signal name="cursor_changed" handler="on_treeview2_cursor_changed" last_modification_time="Sun, 12 Jan 2003 15:58:22 GMT"/> + <signal name="button_press_event" handler="on_treeview1_button_press_event" last_modification_time="Sun, 12 Jan 2003 16:03:52 GMT"/> + <signal name="key_press_event" handler="on_treeview2_key_press_event" last_modification_time="Sun, 12 Jan 2003 16:11:44 GMT"/> + </widget> + </child> + </widget> + <packing> + <property name="shrink">True</property> + <property name="resize">False</property> + </packing> + </child> + + <child> + <widget class="GtkVPaned" id="vpaned1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="position">0</property> + + <child> + <widget class="GtkScrolledWindow" id="scrolledwindow2"> + <property name="visible">True</property> + <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property> + <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> + <property name="shadow_type">GTK_SHADOW_IN</property> + <property name="window_placement">GTK_CORNER_TOP_LEFT</property> + + <child> + <widget class="GtkTreeView" id="treeview2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="has_focus">True</property> + <property name="headers_visible">True</property> + <property name="rules_hint">False</property> + <property name="reorderable">False</property> + <property name="enable_search">False</property> + <signal name="cursor_changed" handler="on_treeview2_cursor_changed" last_modification_time="Sun, 12 Jan 2003 15:57:55 GMT"/> + <signal name="button_press_event" handler="on_treeview2_button_press_event" last_modification_time="Sun, 12 Jan 2003 15:57:58 GMT"/> + <signal name="key_press_event" handler="on_treeview2_key_press_event" last_modification_time="Sun, 12 Jan 2003 15:58:01 GMT"/> + </widget> + </child> + </widget> + <packing> + <property name="shrink">True</property> + <property name="resize">False</property> + </packing> + </child> + + <child> + <widget class="GtkScrolledWindow" id="scrolledwindow3"> + <property name="visible">True</property> + <property name="hscrollbar_policy">GTK_POLICY_NEVER</property> + <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> + <property name="shadow_type">GTK_SHADOW_IN</property> + <property name="window_placement">GTK_CORNER_TOP_LEFT</property> + + <child> + <widget class="GtkTextView" id="textview3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">False</property> + <property name="overwrite">False</property> + <property name="accepts_tab">True</property> + <property name="justification">GTK_JUSTIFY_LEFT</property> + <property name="wrap_mode">GTK_WRAP_WORD</property> + <property name="cursor_visible">True</property> + <property name="pixels_above_lines">0</property> + <property name="pixels_below_lines">0</property> + <property name="pixels_inside_wrap">0</property> + <property name="left_margin">0</property> + <property name="right_margin">0</property> + <property name="indent">0</property> + <property name="text" translatable="yes">Sorry, no help available for this option yet.</property> + </widget> + </child> + </widget> + <packing> + <property name="shrink">True</property> + <property name="resize">True</property> + </packing> + </child> + </widget> + <packing> + <property name="shrink">True</property> + <property name="resize">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> +</widget> + +</glade-interface> diff --git a/src/net/scripts/kconfig/images.c b/src/net/scripts/kconfig/images.c new file mode 100644 index 0000000..2f9afff --- /dev/null +++ b/src/net/scripts/kconfig/images.c @@ -0,0 +1,328 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + */ + +#include "images.h" + +const char * const xpm_load[] = { +"22 22 5 1", +". c None", +"# c #000000", +"c c #838100", +"a c #ffff00", +"b c #ffffff", +"......................", +"......................", +"......................", +"............####....#.", +"...........#....##.##.", +"..................###.", +".................####.", +".####...........#####.", +"#abab##########.......", +"#babababababab#.......", +"#ababababababa#.......", +"#babababababab#.......", +"#ababab###############", +"#babab##cccccccccccc##", +"#abab##cccccccccccc##.", +"#bab##cccccccccccc##..", +"#ab##cccccccccccc##...", +"#b##cccccccccccc##....", +"###cccccccccccc##.....", +"##cccccccccccc##......", +"###############.......", +"......................"}; + +const char * const xpm_save[] = { +"22 22 5 1", +". c None", +"# c #000000", +"a c #838100", +"b c #c5c2c5", +"c c #cdb6d5", +"......................", +".####################.", +".#aa#bbbbbbbbbbbb#bb#.", +".#aa#bbbbbbbbbbbb#bb#.", +".#aa#bbbbbbbbbcbb####.", +".#aa#bbbccbbbbbbb#aa#.", +".#aa#bbbccbbbbbbb#aa#.", +".#aa#bbbbbbbbbbbb#aa#.", +".#aa#bbbbbbbbbbbb#aa#.", +".#aa#bbbbbbbbbbbb#aa#.", +".#aa#bbbbbbbbbbbb#aa#.", +".#aaa############aaa#.", +".#aaaaaaaaaaaaaaaaaa#.", +".#aaaaaaaaaaaaaaaaaa#.", +".#aaa#############aa#.", +".#aaa#########bbb#aa#.", +".#aaa#########bbb#aa#.", +".#aaa#########bbb#aa#.", +".#aaa#########bbb#aa#.", +".#aaa#########bbb#aa#.", +"..##################..", +"......................"}; + +const char * const xpm_back[] = { +"22 22 3 1", +". c None", +"# c #000083", +"a c #838183", +"......................", +"......................", +"......................", +"......................", +"......................", +"...........######a....", +"..#......##########...", +"..##...####......##a..", +"..###.###.........##..", +"..######..........##..", +"..#####...........##..", +"..######..........##..", +"..#######.........##..", +"..########.......##a..", +"...............a###...", +"...............###....", +"......................", +"......................", +"......................", +"......................", +"......................", +"......................"}; + +const char * const xpm_tree_view[] = { +"22 22 2 1", +". c None", +"# c #000000", +"......................", +"......................", +"......#...............", +"......#...............", +"......#...............", +"......#...............", +"......#...............", +"......########........", +"......#...............", +"......#...............", +"......#...............", +"......#...............", +"......#...............", +"......########........", +"......#...............", +"......#...............", +"......#...............", +"......#...............", +"......#...............", +"......########........", +"......................", +"......................"}; + +const char * const xpm_single_view[] = { +"22 22 2 1", +". c None", +"# c #000000", +"......................", +"......................", +"..........#...........", +"..........#...........", +"..........#...........", +"..........#...........", +"..........#...........", +"..........#...........", +"..........#...........", +"..........#...........", +"..........#...........", +"..........#...........", +"..........#...........", +"..........#...........", +"..........#...........", +"..........#...........", +"..........#...........", +"..........#...........", +"..........#...........", +"..........#...........", +"......................", +"......................"}; + +const char * const xpm_split_view[] = { +"22 22 2 1", +". c None", +"# c #000000", +"......................", +"......................", +"......#......#........", +"......#......#........", +"......#......#........", +"......#......#........", +"......#......#........", +"......#......#........", +"......#......#........", +"......#......#........", +"......#......#........", +"......#......#........", +"......#......#........", +"......#......#........", +"......#......#........", +"......#......#........", +"......#......#........", +"......#......#........", +"......#......#........", +"......#......#........", +"......................", +"......................"}; + +const char * const xpm_symbol_no[] = { +"12 12 2 1", +" c white", +". c black", +" ", +" .......... ", +" . . ", +" . . ", +" . . ", +" . . ", +" . . ", +" . . ", +" . . ", +" . . ", +" .......... ", +" "}; + +const char * const xpm_symbol_mod[] = { +"12 12 2 1", +" c white", +". c black", +" ", +" .......... ", +" . . ", +" . . ", +" . .. . ", +" . .... . ", +" . .... . ", +" . .. . ", +" . . ", +" . . ", +" .......... ", +" "}; + +const char * const xpm_symbol_yes[] = { +"12 12 2 1", +" c white", +". c black", +" ", +" .......... ", +" . . ", +" . . ", +" . . . ", +" . .. . ", +" . . .. . ", +" . .... . ", +" . .. . ", +" . . ", +" .......... ", +" "}; + +const char * const xpm_choice_no[] = { +"12 12 2 1", +" c white", +". c black", +" ", +" .... ", +" .. .. ", +" . . ", +" . . ", +" . . ", +" . . ", +" . . ", +" . . ", +" .. .. ", +" .... ", +" "}; + +const char * const xpm_choice_yes[] = { +"12 12 2 1", +" c white", +". c black", +" ", +" .... ", +" .. .. ", +" . . ", +" . .. . ", +" . .... . ", +" . .... . ", +" . .. . ", +" . . ", +" .. .. ", +" .... ", +" "}; + +const char * const xpm_menu[] = { +"12 12 2 1", +" c white", +". c black", +" ", +" .......... ", +" . . ", +" . .. . ", +" . .... . ", +" . ...... . ", +" . ...... . ", +" . .... . ", +" . .. . ", +" . . ", +" .......... ", +" "}; + +const char * const xpm_menu_inv[] = { +"12 12 2 1", +" c white", +". c black", +" ", +" .......... ", +" .......... ", +" .. ...... ", +" .. .... ", +" .. .. ", +" .. .. ", +" .. .... ", +" .. ...... ", +" .......... ", +" .......... ", +" "}; + +const char * const xpm_menuback[] = { +"12 12 2 1", +" c white", +". c black", +" ", +" .......... ", +" . . ", +" . .. . ", +" . .... . ", +" . ...... . ", +" . ...... . ", +" . .... . ", +" . .. . ", +" . . ", +" .......... ", +" "}; + +const char * const xpm_void[] = { +"12 12 2 1", +" c white", +". c black", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; diff --git a/src/net/scripts/kconfig/images.h b/src/net/scripts/kconfig/images.h new file mode 100644 index 0000000..7212dec --- /dev/null +++ b/src/net/scripts/kconfig/images.h @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + */ + +#ifndef IMAGES_H +#define IMAGES_H + +#ifdef __cplusplus +extern "C" { +#endif + +extern const char * const xpm_load[]; +extern const char * const xpm_save[]; +extern const char * const xpm_back[]; +extern const char * const xpm_tree_view[]; +extern const char * const xpm_single_view[]; +extern const char * const xpm_split_view[]; +extern const char * const xpm_symbol_no[]; +extern const char * const xpm_symbol_mod[]; +extern const char * const xpm_symbol_yes[]; +extern const char * const xpm_choice_no[]; +extern const char * const xpm_choice_yes[]; +extern const char * const xpm_menu[]; +extern const char * const xpm_menu_inv[]; +extern const char * const xpm_menuback[]; +extern const char * const xpm_void[]; + +#ifdef __cplusplus +} +#endif + +#endif /* IMAGES_H */ diff --git a/src/net/scripts/kconfig/lexer.l b/src/net/scripts/kconfig/lexer.l new file mode 100644 index 0000000..240109f --- /dev/null +++ b/src/net/scripts/kconfig/lexer.l @@ -0,0 +1,471 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + */ +%option nostdinit noyywrap never-interactive full ecs +%option 8bit nodefault yylineno +%x ASSIGN_VAL HELP STRING +%{ + +#include <assert.h> +#include <limits.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include "lkc.h" +#include "parser.tab.h" + +#define YY_DECL static int yylex1(void) + +#define START_STRSIZE 16 + +static struct { + struct file *file; + int lineno; +} current_pos; + +static int prev_prev_token = T_EOL; +static int prev_token = T_EOL; +static char *text; +static int text_size, text_asize; + +struct buffer { + struct buffer *parent; + YY_BUFFER_STATE state; +}; + +static struct buffer *current_buf; + +static int last_ts, first_ts; + +static char *expand_token(const char *in, size_t n); +static void append_expanded_string(const char *in); +static void zconf_endhelp(void); +static void zconf_endfile(void); + +static void new_string(void) +{ + text = xmalloc(START_STRSIZE); + text_asize = START_STRSIZE; + text_size = 0; + *text = 0; +} + +static void append_string(const char *str, int size) +{ + int new_size = text_size + size + 1; + if (new_size > text_asize) { + new_size += START_STRSIZE - 1; + new_size &= -START_STRSIZE; + text = xrealloc(text, new_size); + text_asize = new_size; + } + memcpy(text + text_size, str, size); + text_size += size; + text[text_size] = 0; +} + +static void alloc_string(const char *str, int size) +{ + text = xmalloc(size + 1); + memcpy(text, str, size); + text[size] = 0; +} + +static void warn_ignored_character(char chr) +{ + fprintf(stderr, + "%s:%d:warning: ignoring unsupported character '%c'\n", + current_file->name, yylineno, chr); +} +%} + +n [A-Za-z0-9_-] + +%% + int str = 0; + int ts, i; + +#.* /* ignore comment */ +[ \t]* /* whitespaces */ +\\\n /* escaped new line */ +\n return T_EOL; +"allnoconfig_y" return T_ALLNOCONFIG_Y; +"bool" return T_BOOL; +"choice" return T_CHOICE; +"comment" return T_COMMENT; +"config" return T_CONFIG; +"def_bool" return T_DEF_BOOL; +"def_tristate" return T_DEF_TRISTATE; +"default" return T_DEFAULT; +"defconfig_list" return T_DEFCONFIG_LIST; +"depends" return T_DEPENDS; +"endchoice" return T_ENDCHOICE; +"endif" return T_ENDIF; +"endmenu" return T_ENDMENU; +"help" return T_HELP; +"hex" return T_HEX; +"if" return T_IF; +"imply" return T_IMPLY; +"int" return T_INT; +"mainmenu" return T_MAINMENU; +"menu" return T_MENU; +"menuconfig" return T_MENUCONFIG; +"modules" return T_MODULES; +"on" return T_ON; +"option" return T_OPTION; +"optional" return T_OPTIONAL; +"prompt" return T_PROMPT; +"range" return T_RANGE; +"select" return T_SELECT; +"source" return T_SOURCE; +"string" return T_STRING; +"tristate" return T_TRISTATE; +"visible" return T_VISIBLE; +"||" return T_OR; +"&&" return T_AND; +"=" return T_EQUAL; +"!=" return T_UNEQUAL; +"<" return T_LESS; +"<=" return T_LESS_EQUAL; +">" return T_GREATER; +">=" return T_GREATER_EQUAL; +"!" return T_NOT; +"(" return T_OPEN_PAREN; +")" return T_CLOSE_PAREN; +":=" return T_COLON_EQUAL; +"+=" return T_PLUS_EQUAL; +\"|\' { + str = yytext[0]; + new_string(); + BEGIN(STRING); + } +{n}+ { + alloc_string(yytext, yyleng); + yylval.string = text; + return T_WORD; + } +({n}|$)+ { + /* this token includes at least one '$' */ + yylval.string = expand_token(yytext, yyleng); + if (strlen(yylval.string)) + return T_WORD; + free(yylval.string); + } +. warn_ignored_character(*yytext); + +<ASSIGN_VAL>{ + [^[:blank:]\n]+.* { + alloc_string(yytext, yyleng); + yylval.string = text; + return T_ASSIGN_VAL; + } + \n { BEGIN(INITIAL); return T_EOL; } + . +} + +<STRING>{ + "$".* append_expanded_string(yytext); + [^$'"\\\n]+ { + append_string(yytext, yyleng); + } + \\.? { + append_string(yytext + 1, yyleng - 1); + } + \'|\" { + if (str == yytext[0]) { + BEGIN(INITIAL); + yylval.string = text; + return T_WORD_QUOTE; + } else + append_string(yytext, 1); + } + \n { + fprintf(stderr, + "%s:%d:warning: multi-line strings not supported\n", + zconf_curname(), zconf_lineno()); + unput('\n'); + BEGIN(INITIAL); + yylval.string = text; + return T_WORD_QUOTE; + } + <<EOF>> { + BEGIN(INITIAL); + yylval.string = text; + return T_WORD_QUOTE; + } +} + +<HELP>{ + [ \t]+ { + ts = 0; + for (i = 0; i < yyleng; i++) { + if (yytext[i] == '\t') + ts = (ts & ~7) + 8; + else + ts++; + } + last_ts = ts; + if (first_ts) { + if (ts < first_ts) { + zconf_endhelp(); + return T_HELPTEXT; + } + ts -= first_ts; + while (ts > 8) { + append_string(" ", 8); + ts -= 8; + } + append_string(" ", ts); + } + } + [ \t]*\n/[^ \t\n] { + zconf_endhelp(); + return T_HELPTEXT; + } + [ \t]*\n { + append_string("\n", 1); + } + [^ \t\n].* { + while (yyleng) { + if ((yytext[yyleng-1] != ' ') && (yytext[yyleng-1] != '\t')) + break; + yyleng--; + } + append_string(yytext, yyleng); + if (!first_ts) + first_ts = last_ts; + } + <<EOF>> { + zconf_endhelp(); + return T_HELPTEXT; + } +} + +<<EOF>> { + BEGIN(INITIAL); + + if (prev_token != T_EOL && prev_token != T_HELPTEXT) + fprintf(stderr, "%s:%d:warning: no new line at end of file\n", + current_file->name, yylineno); + + if (current_file) { + zconf_endfile(); + return T_EOL; + } + fclose(yyin); + yyterminate(); +} + +%% + +/* second stage lexer */ +int yylex(void) +{ + int token; + +repeat: + token = yylex1(); + + if (prev_token == T_EOL || prev_token == T_HELPTEXT) { + if (token == T_EOL) { + /* Do not pass unneeded T_EOL to the parser. */ + goto repeat; + } else { + /* + * For the parser, update file/lineno at the first token + * of each statement. Generally, \n is a statement + * terminator in Kconfig, but it is not always true + * because \n could be escaped by a backslash. + */ + current_pos.file = current_file; + current_pos.lineno = yylineno; + } + } + + if (prev_prev_token == T_EOL && prev_token == T_WORD && + (token == T_EQUAL || token == T_COLON_EQUAL || token == T_PLUS_EQUAL)) + BEGIN(ASSIGN_VAL); + + prev_prev_token = prev_token; + prev_token = token; + + return token; +} + +static char *expand_token(const char *in, size_t n) +{ + char *out; + int c; + char c2; + const char *rest, *end; + + new_string(); + append_string(in, n); + + /* get the whole line because we do not know the end of token. */ + while ((c = input()) != EOF) { + if (c == '\n') { + unput(c); + break; + } + c2 = c; + append_string(&c2, 1); + } + + rest = text; + out = expand_one_token(&rest); + + /* push back unused characters to the input stream */ + end = rest + strlen(rest); + while (end > rest) + unput(*--end); + + free(text); + + return out; +} + +static void append_expanded_string(const char *str) +{ + const char *end; + char *res; + + str++; + + res = expand_dollar(&str); + + /* push back unused characters to the input stream */ + end = str + strlen(str); + while (end > str) + unput(*--end); + + append_string(res, strlen(res)); + + free(res); +} + +void zconf_starthelp(void) +{ + new_string(); + last_ts = first_ts = 0; + BEGIN(HELP); +} + +static void zconf_endhelp(void) +{ + yylval.string = text; + BEGIN(INITIAL); +} + + +/* + * Try to open specified file with following names: + * ./name + * $(srctree)/name + * The latter is used when srctree is separate from objtree + * when compiling the kernel. + * Return NULL if file is not found. + */ +FILE *zconf_fopen(const char *name) +{ + char *env, fullname[PATH_MAX+1]; + FILE *f; + + f = fopen(name, "r"); + if (!f && name != NULL && name[0] != '/') { + env = getenv(SRCTREE); + if (env) { + snprintf(fullname, sizeof(fullname), + "%s/%s", env, name); + f = fopen(fullname, "r"); + } + } + return f; +} + +void zconf_initscan(const char *name) +{ + yyin = zconf_fopen(name); + if (!yyin) { + fprintf(stderr, "can't find file %s\n", name); + exit(1); + } + + current_buf = xmalloc(sizeof(*current_buf)); + memset(current_buf, 0, sizeof(*current_buf)); + + current_file = file_lookup(name); + yylineno = 1; +} + +void zconf_nextfile(const char *name) +{ + struct file *iter; + struct file *file = file_lookup(name); + struct buffer *buf = xmalloc(sizeof(*buf)); + memset(buf, 0, sizeof(*buf)); + + current_buf->state = YY_CURRENT_BUFFER; + yyin = zconf_fopen(file->name); + if (!yyin) { + fprintf(stderr, "%s:%d: can't open file \"%s\"\n", + zconf_curname(), zconf_lineno(), file->name); + exit(1); + } + yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE)); + buf->parent = current_buf; + current_buf = buf; + + current_file->lineno = yylineno; + file->parent = current_file; + + for (iter = current_file; iter; iter = iter->parent) { + if (!strcmp(iter->name, file->name)) { + fprintf(stderr, + "Recursive inclusion detected.\n" + "Inclusion path:\n" + " current file : %s\n", file->name); + iter = file; + do { + iter = iter->parent; + fprintf(stderr, " included from: %s:%d\n", + iter->name, iter->lineno - 1); + } while (strcmp(iter->name, file->name)); + exit(1); + } + } + + yylineno = 1; + current_file = file; +} + +static void zconf_endfile(void) +{ + struct buffer *parent; + + current_file = current_file->parent; + if (current_file) + yylineno = current_file->lineno; + + parent = current_buf->parent; + if (parent) { + fclose(yyin); + yy_delete_buffer(YY_CURRENT_BUFFER); + yy_switch_to_buffer(parent->state); + } + free(current_buf); + current_buf = parent; +} + +int zconf_lineno(void) +{ + return current_pos.lineno; +} + +const char *zconf_curname(void) +{ + return current_pos.file ? current_pos.file->name : "<none>"; +} diff --git a/src/net/scripts/kconfig/list.h b/src/net/scripts/kconfig/list.h new file mode 100644 index 0000000..45cb237 --- /dev/null +++ b/src/net/scripts/kconfig/list.h @@ -0,0 +1,132 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef LIST_H +#define LIST_H + +/* + * Copied from include/linux/... + */ + +#undef offsetof +#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) + +/** + * container_of - cast a member of a structure out to the containing structure + * @ptr: the pointer to the member. + * @type: the type of the container struct this is embedded in. + * @member: the name of the member within the struct. + * + */ +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + + +struct list_head { + struct list_head *next, *prev; +}; + + +#define LIST_HEAD_INIT(name) { &(name), &(name) } + +#define LIST_HEAD(name) \ + struct list_head name = LIST_HEAD_INIT(name) + +/** + * list_entry - get the struct for this entry + * @ptr: the &struct list_head pointer. + * @type: the type of the struct this is embedded in. + * @member: the name of the list_head within the struct. + */ +#define list_entry(ptr, type, member) \ + container_of(ptr, type, member) + +/** + * list_for_each_entry - iterate over list of given type + * @pos: the type * to use as a loop cursor. + * @head: the head for your list. + * @member: the name of the list_head within the struct. + */ +#define list_for_each_entry(pos, head, member) \ + for (pos = list_entry((head)->next, typeof(*pos), member); \ + &pos->member != (head); \ + pos = list_entry(pos->member.next, typeof(*pos), member)) + +/** + * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry + * @pos: the type * to use as a loop cursor. + * @n: another type * to use as temporary storage + * @head: the head for your list. + * @member: the name of the list_head within the struct. + */ +#define list_for_each_entry_safe(pos, n, head, member) \ + for (pos = list_entry((head)->next, typeof(*pos), member), \ + n = list_entry(pos->member.next, typeof(*pos), member); \ + &pos->member != (head); \ + pos = n, n = list_entry(n->member.next, typeof(*n), member)) + +/** + * list_empty - tests whether a list is empty + * @head: the list to test. + */ +static inline int list_empty(const struct list_head *head) +{ + return head->next == head; +} + +/* + * Insert a new entry between two known consecutive entries. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static inline void __list_add(struct list_head *_new, + struct list_head *prev, + struct list_head *next) +{ + next->prev = _new; + _new->next = next; + _new->prev = prev; + prev->next = _new; +} + +/** + * list_add_tail - add a new entry + * @new: new entry to be added + * @head: list head to add it before + * + * Insert a new entry before the specified head. + * This is useful for implementing queues. + */ +static inline void list_add_tail(struct list_head *_new, struct list_head *head) +{ + __list_add(_new, head->prev, head); +} + +/* + * Delete a list entry by making the prev/next entries + * point to each other. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static inline void __list_del(struct list_head *prev, struct list_head *next) +{ + next->prev = prev; + prev->next = next; +} + +#define LIST_POISON1 ((void *) 0x00100100) +#define LIST_POISON2 ((void *) 0x00200200) +/** + * list_del - deletes entry from list. + * @entry: the element to delete from the list. + * Note: list_empty() on entry does not return true after this, the entry is + * in an undefined state. + */ +static inline void list_del(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); + entry->next = (struct list_head*)LIST_POISON1; + entry->prev = (struct list_head*)LIST_POISON2; +} +#endif diff --git a/src/net/scripts/kconfig/lkc.h b/src/net/scripts/kconfig/lkc.h new file mode 100644 index 0000000..8454649 --- /dev/null +++ b/src/net/scripts/kconfig/lkc.h @@ -0,0 +1,173 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + */ + +#ifndef LKC_H +#define LKC_H + +#include "expr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#include "lkc_proto.h" + +#define SRCTREE "srctree" + +#ifndef PACKAGE +#define PACKAGE "linux" +#endif + +#ifndef CONFIG_ +#define CONFIG_ "CONFIG_" +#endif +static inline const char *CONFIG_prefix(void) +{ + return getenv( "CONFIG_" ) ?: CONFIG_; +} +#undef CONFIG_ +#define CONFIG_ CONFIG_prefix() + +enum conf_def_mode { + def_default, + def_yes, + def_mod, + def_y2m, + def_m2y, + def_no, + def_random +}; + +extern int yylineno; +void zconfdump(FILE *out); +void zconf_starthelp(void); +FILE *zconf_fopen(const char *name); +void zconf_initscan(const char *name); +void zconf_nextfile(const char *name); +int zconf_lineno(void); +const char *zconf_curname(void); + +/* confdata.c */ +const char *conf_get_configname(void); +void sym_set_change_count(int count); +void sym_add_change_count(int count); +bool conf_set_all_new_symbols(enum conf_def_mode mode); +void conf_rewrite_mod_or_yes(enum conf_def_mode mode); +void set_all_choice_values(struct symbol *csym); + +/* confdata.c and expr.c */ +static inline void xfwrite(const void *str, size_t len, size_t count, FILE *out) +{ + assert(len != 0); + + if (fwrite(str, len, count, out) != count) + fprintf(stderr, "Error in writing or end of file.\n"); +} + +/* util.c */ +struct file *file_lookup(const char *name); +void *xmalloc(size_t size); +void *xcalloc(size_t nmemb, size_t size); +void *xrealloc(void *p, size_t size); +char *xstrdup(const char *s); +char *xstrndup(const char *s, size_t n); + +/* lexer.l */ +int yylex(void); + +struct gstr { + size_t len; + char *s; + /* + * when max_width is not zero long lines in string s (if any) get + * wrapped not to exceed the max_width value + */ + int max_width; +}; +struct gstr str_new(void); +void str_free(struct gstr *gs); +void str_append(struct gstr *gs, const char *s); +void str_printf(struct gstr *gs, const char *fmt, ...); +const char *str_get(struct gstr *gs); + +/* menu.c */ +void _menu_init(void); +void menu_warn(struct menu *menu, const char *fmt, ...); +struct menu *menu_add_menu(void); +void menu_end_menu(void); +void menu_add_entry(struct symbol *sym); +void menu_add_dep(struct expr *dep); +void menu_add_visibility(struct expr *dep); +struct property *menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep); +void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep); +void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep); +void menu_add_option_modules(void); +void menu_add_option_defconfig_list(void); +void menu_add_option_allnoconfig_y(void); +void menu_finalize(struct menu *parent); +void menu_set_type(int type); + +extern struct menu rootmenu; + +bool menu_is_empty(struct menu *menu); +bool menu_is_visible(struct menu *menu); +bool menu_has_prompt(struct menu *menu); +const char *menu_get_prompt(struct menu *menu); +struct menu *menu_get_root_menu(struct menu *menu); +struct menu *menu_get_parent_menu(struct menu *menu); +bool menu_has_help(struct menu *menu); +const char *menu_get_help(struct menu *menu); +struct gstr get_relations_str(struct symbol **sym_arr, struct list_head *head); +void menu_get_ext_help(struct menu *menu, struct gstr *help); + +/* symbol.c */ +void sym_clear_all_valid(void); +struct symbol *sym_choice_default(struct symbol *sym); +struct property *sym_get_range_prop(struct symbol *sym); +const char *sym_get_string_default(struct symbol *sym); +struct symbol *sym_check_deps(struct symbol *sym); +struct symbol *prop_get_symbol(struct property *prop); + +static inline tristate sym_get_tristate_value(struct symbol *sym) +{ + return sym->curr.tri; +} + + +static inline struct symbol *sym_get_choice_value(struct symbol *sym) +{ + return (struct symbol *)sym->curr.val; +} + +static inline bool sym_set_choice_value(struct symbol *ch, struct symbol *chval) +{ + return sym_set_tristate_value(chval, yes); +} + +static inline bool sym_is_choice(struct symbol *sym) +{ + return sym->flags & SYMBOL_CHOICE ? true : false; +} + +static inline bool sym_is_choice_value(struct symbol *sym) +{ + return sym->flags & SYMBOL_CHOICEVAL ? true : false; +} + +static inline bool sym_is_optional(struct symbol *sym) +{ + return sym->flags & SYMBOL_OPTIONAL ? true : false; +} + +static inline bool sym_has_value(struct symbol *sym) +{ + return sym->flags & SYMBOL_DEF_USER ? true : false; +} + +#ifdef __cplusplus +} +#endif + +#endif /* LKC_H */ diff --git a/src/net/scripts/kconfig/lkc_proto.h b/src/net/scripts/kconfig/lkc_proto.h new file mode 100644 index 0000000..9e81be3 --- /dev/null +++ b/src/net/scripts/kconfig/lkc_proto.h @@ -0,0 +1,51 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#include <stdarg.h> + +/* confdata.c */ +void conf_parse(const char *name); +int conf_read(const char *name); +int conf_read_simple(const char *name, int); +int conf_write_defconfig(const char *name); +int conf_write(const char *name); +int conf_write_autoconf(int overwrite); +bool conf_get_changed(void); +void conf_set_changed_callback(void (*fn)(void)); +void conf_set_message_callback(void (*fn)(const char *s)); + +/* symbol.c */ +extern struct symbol * symbol_hash[SYMBOL_HASHSIZE]; + +struct symbol * sym_lookup(const char *name, int flags); +struct symbol * sym_find(const char *name); +const char * sym_escape_string_value(const char *in); +struct symbol ** sym_re_search(const char *pattern); +const char * sym_type_name(enum symbol_type type); +void sym_calc_value(struct symbol *sym); +enum symbol_type sym_get_type(struct symbol *sym); +bool sym_tristate_within_range(struct symbol *sym,tristate tri); +bool sym_set_tristate_value(struct symbol *sym,tristate tri); +tristate sym_toggle_tristate_value(struct symbol *sym); +bool sym_string_valid(struct symbol *sym, const char *newval); +bool sym_string_within_range(struct symbol *sym, const char *str); +bool sym_set_string_value(struct symbol *sym, const char *newval); +bool sym_is_changeable(struct symbol *sym); +struct property * sym_get_choice_prop(struct symbol *sym); +const char * sym_get_string_value(struct symbol *sym); + +const char * prop_get_type_name(enum prop_type type); + +/* preprocess.c */ +enum variable_flavor { + VAR_SIMPLE, + VAR_RECURSIVE, + VAR_APPEND, +}; +void env_write_dep(FILE *f, const char *auto_conf_name); +void variable_add(const char *name, const char *value, + enum variable_flavor flavor); +void variable_all_del(void); +char *expand_dollar(const char **str); +char *expand_one_token(const char **str); + +/* expr.c */ +void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken); diff --git a/src/net/scripts/kconfig/lxdialog/BIG.FAT.WARNING b/src/net/scripts/kconfig/lxdialog/BIG.FAT.WARNING new file mode 100644 index 0000000..7cb5a7e --- /dev/null +++ b/src/net/scripts/kconfig/lxdialog/BIG.FAT.WARNING @@ -0,0 +1,4 @@ +This is NOT the official version of dialog. This version has been +significantly modified from the original. It is for use by the Linux +kernel configuration script. Please do not bother Savio Lam with +questions about this program. diff --git a/src/net/scripts/kconfig/lxdialog/checklist.c b/src/net/scripts/kconfig/lxdialog/checklist.c new file mode 100644 index 0000000..fd161cf --- /dev/null +++ b/src/net/scripts/kconfig/lxdialog/checklist.c @@ -0,0 +1,319 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * checklist.c -- implements the checklist box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * Stuart Herbert - S.Herbert@sheffield.ac.uk: radiolist extension + * Alessandro Rubini - rubini@ipvvis.unipv.it: merged the two + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) + */ + +#include "dialog.h" + +static int list_width, check_x, item_x; + +/* + * Print list item + */ +static void print_item(WINDOW * win, int choice, int selected) +{ + int i; + char *list_item = malloc(list_width + 1); + + strncpy(list_item, item_str(), list_width - item_x); + list_item[list_width - item_x] = '\0'; + + /* Clear 'residue' of last item */ + wattrset(win, dlg.menubox.atr); + wmove(win, choice, 0); + for (i = 0; i < list_width; i++) + waddch(win, ' '); + + wmove(win, choice, check_x); + wattrset(win, selected ? dlg.check_selected.atr + : dlg.check.atr); + if (!item_is_tag(':')) + wprintw(win, "(%c)", item_is_tag('X') ? 'X' : ' '); + + wattrset(win, selected ? dlg.tag_selected.atr : dlg.tag.atr); + mvwaddch(win, choice, item_x, list_item[0]); + wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr); + waddstr(win, list_item + 1); + if (selected) { + wmove(win, choice, check_x + 1); + wrefresh(win); + } + free(list_item); +} + +/* + * Print the scroll indicators. + */ +static void print_arrows(WINDOW * win, int choice, int item_no, int scroll, + int y, int x, int height) +{ + wmove(win, y, x); + + if (scroll > 0) { + wattrset(win, dlg.uarrow.atr); + waddch(win, ACS_UARROW); + waddstr(win, "(-)"); + } else { + wattrset(win, dlg.menubox.atr); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + } + + y = y + height + 1; + wmove(win, y, x); + + if ((height < item_no) && (scroll + choice < item_no - 1)) { + wattrset(win, dlg.darrow.atr); + waddch(win, ACS_DARROW); + waddstr(win, "(+)"); + } else { + wattrset(win, dlg.menubox_border.atr); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + } +} + +/* + * Display the termination buttons + */ +static void print_buttons(WINDOW * dialog, int height, int width, int selected) +{ + int x = width / 2 - 11; + int y = height - 2; + + print_button(dialog, "Select", y, x, selected == 0); + print_button(dialog, " Help ", y, x + 14, selected == 1); + + wmove(dialog, y, x + 1 + 14 * selected); + wrefresh(dialog); +} + +/* + * Display a dialog box with a list of options that can be turned on or off + * in the style of radiolist (only one option turned on at a time). + */ +int dialog_checklist(const char *title, const char *prompt, int height, + int width, int list_height) +{ + int i, x, y, box_x, box_y; + int key = 0, button = 0, choice = 0, scroll = 0, max_choice; + WINDOW *dialog, *list; + + /* which item to highlight */ + item_foreach() { + if (item_is_tag('X')) + choice = item_n(); + if (item_is_selected()) { + choice = item_n(); + break; + } + } + +do_resize: + if (getmaxy(stdscr) < (height + CHECKLIST_HEIGTH_MIN)) + return -ERRDISPLAYTOOSMALL; + if (getmaxx(stdscr) < (width + CHECKLIST_WIDTH_MIN)) + return -ERRDISPLAYTOOSMALL; + + max_choice = MIN(list_height, item_count()); + + /* center dialog box on screen */ + x = (getmaxx(stdscr) - width) / 2; + y = (getmaxy(stdscr) - height) / 2; + + draw_shadow(stdscr, y, x, height, width); + + dialog = newwin(height, width, y, x); + keypad(dialog, TRUE); + + draw_box(dialog, 0, 0, height, width, + dlg.dialog.atr, dlg.border.atr); + wattrset(dialog, dlg.border.atr); + mvwaddch(dialog, height - 3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dlg.dialog.atr); + waddch(dialog, ACS_RTEE); + + print_title(dialog, title, width); + + wattrset(dialog, dlg.dialog.atr); + print_autowrap(dialog, prompt, width - 2, 1, 3); + + list_width = width - 6; + box_y = height - list_height - 5; + box_x = (width - list_width) / 2 - 1; + + /* create new window for the list */ + list = subwin(dialog, list_height, list_width, y + box_y + 1, + x + box_x + 1); + + keypad(list, TRUE); + + /* draw a box around the list items */ + draw_box(dialog, box_y, box_x, list_height + 2, list_width + 2, + dlg.menubox_border.atr, dlg.menubox.atr); + + /* Find length of longest item in order to center checklist */ + check_x = 0; + item_foreach() + check_x = MAX(check_x, strlen(item_str()) + 4); + check_x = MIN(check_x, list_width); + + check_x = (list_width - check_x) / 2; + item_x = check_x + 4; + + if (choice >= list_height) { + scroll = choice - list_height + 1; + choice -= scroll; + } + + /* Print the list */ + for (i = 0; i < max_choice; i++) { + item_set(scroll + i); + print_item(list, i, i == choice); + } + + print_arrows(dialog, choice, item_count(), scroll, + box_y, box_x + check_x + 5, list_height); + + print_buttons(dialog, height, width, 0); + + wnoutrefresh(dialog); + wnoutrefresh(list); + doupdate(); + + while (key != KEY_ESC) { + key = wgetch(dialog); + + for (i = 0; i < max_choice; i++) { + item_set(i + scroll); + if (toupper(key) == toupper(item_str()[0])) + break; + } + + if (i < max_choice || key == KEY_UP || key == KEY_DOWN || + key == '+' || key == '-') { + if (key == KEY_UP || key == '-') { + if (!choice) { + if (!scroll) + continue; + /* Scroll list down */ + if (list_height > 1) { + /* De-highlight current first item */ + item_set(scroll); + print_item(list, 0, FALSE); + scrollok(list, TRUE); + wscrl(list, -1); + scrollok(list, FALSE); + } + scroll--; + item_set(scroll); + print_item(list, 0, TRUE); + print_arrows(dialog, choice, item_count(), + scroll, box_y, box_x + check_x + 5, list_height); + + wnoutrefresh(dialog); + wrefresh(list); + + continue; /* wait for another key press */ + } else + i = choice - 1; + } else if (key == KEY_DOWN || key == '+') { + if (choice == max_choice - 1) { + if (scroll + choice >= item_count() - 1) + continue; + /* Scroll list up */ + if (list_height > 1) { + /* De-highlight current last item before scrolling up */ + item_set(scroll + max_choice - 1); + print_item(list, + max_choice - 1, + FALSE); + scrollok(list, TRUE); + wscrl(list, 1); + scrollok(list, FALSE); + } + scroll++; + item_set(scroll + max_choice - 1); + print_item(list, max_choice - 1, TRUE); + + print_arrows(dialog, choice, item_count(), + scroll, box_y, box_x + check_x + 5, list_height); + + wnoutrefresh(dialog); + wrefresh(list); + + continue; /* wait for another key press */ + } else + i = choice + 1; + } + if (i != choice) { + /* De-highlight current item */ + item_set(scroll + choice); + print_item(list, choice, FALSE); + /* Highlight new item */ + choice = i; + item_set(scroll + choice); + print_item(list, choice, TRUE); + wnoutrefresh(dialog); + wrefresh(list); + } + continue; /* wait for another key press */ + } + switch (key) { + case 'H': + case 'h': + case '?': + button = 1; + /* fall-through */ + case 'S': + case 's': + case ' ': + case '\n': + item_foreach() + item_set_selected(0); + item_set(scroll + choice); + item_set_selected(1); + delwin(list); + delwin(dialog); + return button; + case TAB: + case KEY_LEFT: + case KEY_RIGHT: + button = ((key == KEY_LEFT ? --button : ++button) < 0) + ? 1 : (button > 1 ? 0 : button); + + print_buttons(dialog, height, width, button); + wrefresh(dialog); + break; + case 'X': + case 'x': + key = KEY_ESC; + break; + case KEY_ESC: + key = on_key_esc(dialog); + break; + case KEY_RESIZE: + delwin(list); + delwin(dialog); + on_key_resize(); + goto do_resize; + } + + /* Now, update everything... */ + doupdate(); + } + delwin(list); + delwin(dialog); + return key; /* ESC pressed */ +} diff --git a/src/net/scripts/kconfig/lxdialog/dialog.h b/src/net/scripts/kconfig/lxdialog/dialog.h new file mode 100644 index 0000000..68b565e --- /dev/null +++ b/src/net/scripts/kconfig/lxdialog/dialog.h @@ -0,0 +1,238 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * dialog.h -- common declarations for all dialog modules + * + * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + */ + +#include <sys/types.h> +#include <fcntl.h> +#include <unistd.h> +#include <ctype.h> +#include <stdlib.h> +#include <string.h> +#include <stdbool.h> + +#ifdef __sun__ +#define CURS_MACROS +#endif +#include <ncurses.h> + +/* + * Colors in ncurses 1.9.9e do not work properly since foreground and + * background colors are OR'd rather than separately masked. This version + * of dialog was hacked to work with ncurses 1.9.9e, making it incompatible + * with standard curses. The simplest fix (to make this work with standard + * curses) uses the wbkgdset() function, not used in the original hack. + * Turn it off if we're building with 1.9.9e, since it just confuses things. + */ +#if defined(NCURSES_VERSION) && defined(_NEED_WRAP) && !defined(GCC_PRINTFLIKE) +#define OLD_NCURSES 1 +#undef wbkgdset +#define wbkgdset(w,p) /*nothing */ +#else +#define OLD_NCURSES 0 +#endif + +#define TR(params) _tracef params + +#define KEY_ESC 27 +#define TAB 9 +#define MAX_LEN 2048 +#define BUF_SIZE (10*1024) +#define MIN(x,y) (x < y ? x : y) +#define MAX(x,y) (x > y ? x : y) + +#ifndef ACS_ULCORNER +#define ACS_ULCORNER '+' +#endif +#ifndef ACS_LLCORNER +#define ACS_LLCORNER '+' +#endif +#ifndef ACS_URCORNER +#define ACS_URCORNER '+' +#endif +#ifndef ACS_LRCORNER +#define ACS_LRCORNER '+' +#endif +#ifndef ACS_HLINE +#define ACS_HLINE '-' +#endif +#ifndef ACS_VLINE +#define ACS_VLINE '|' +#endif +#ifndef ACS_LTEE +#define ACS_LTEE '+' +#endif +#ifndef ACS_RTEE +#define ACS_RTEE '+' +#endif +#ifndef ACS_UARROW +#define ACS_UARROW '^' +#endif +#ifndef ACS_DARROW +#define ACS_DARROW 'v' +#endif + +/* error return codes */ +#define ERRDISPLAYTOOSMALL (KEY_MAX + 1) + +/* + * Color definitions + */ +struct dialog_color { + chtype atr; /* Color attribute */ + int fg; /* foreground */ + int bg; /* background */ + int hl; /* highlight this item */ +}; + +struct subtitle_list { + struct subtitle_list *next; + const char *text; +}; + +struct dialog_info { + const char *backtitle; + struct subtitle_list *subtitles; + struct dialog_color screen; + struct dialog_color shadow; + struct dialog_color dialog; + struct dialog_color title; + struct dialog_color border; + struct dialog_color button_active; + struct dialog_color button_inactive; + struct dialog_color button_key_active; + struct dialog_color button_key_inactive; + struct dialog_color button_label_active; + struct dialog_color button_label_inactive; + struct dialog_color inputbox; + struct dialog_color inputbox_border; + struct dialog_color searchbox; + struct dialog_color searchbox_title; + struct dialog_color searchbox_border; + struct dialog_color position_indicator; + struct dialog_color menubox; + struct dialog_color menubox_border; + struct dialog_color item; + struct dialog_color item_selected; + struct dialog_color tag; + struct dialog_color tag_selected; + struct dialog_color tag_key; + struct dialog_color tag_key_selected; + struct dialog_color check; + struct dialog_color check_selected; + struct dialog_color uarrow; + struct dialog_color darrow; +}; + +/* + * Global variables + */ +extern struct dialog_info dlg; +extern char dialog_input_result[]; +extern int saved_x, saved_y; /* Needed in signal handler in mconf.c */ + +/* + * Function prototypes + */ + +/* item list as used by checklist and menubox */ +void item_reset(void); +void item_make(const char *fmt, ...); +void item_add_str(const char *fmt, ...); +void item_set_tag(char tag); +void item_set_data(void *p); +void item_set_selected(int val); +int item_activate_selected(void); +void *item_data(void); +char item_tag(void); + +/* item list manipulation for lxdialog use */ +#define MAXITEMSTR 200 +struct dialog_item { + char str[MAXITEMSTR]; /* prompt displayed */ + char tag; + void *data; /* pointer to menu item - used by menubox+checklist */ + int selected; /* Set to 1 by dialog_*() function if selected. */ +}; + +/* list of lialog_items */ +struct dialog_list { + struct dialog_item node; + struct dialog_list *next; +}; + +extern struct dialog_list *item_cur; +extern struct dialog_list item_nil; +extern struct dialog_list *item_head; + +int item_count(void); +void item_set(int n); +int item_n(void); +const char *item_str(void); +int item_is_selected(void); +int item_is_tag(char tag); +#define item_foreach() \ + for (item_cur = item_head ? item_head: item_cur; \ + item_cur && (item_cur != &item_nil); item_cur = item_cur->next) + +/* generic key handlers */ +int on_key_esc(WINDOW *win); +int on_key_resize(void); + +/* minimum (re)size values */ +#define CHECKLIST_HEIGTH_MIN 6 /* For dialog_checklist() */ +#define CHECKLIST_WIDTH_MIN 6 +#define INPUTBOX_HEIGTH_MIN 2 /* For dialog_inputbox() */ +#define INPUTBOX_WIDTH_MIN 2 +#define MENUBOX_HEIGTH_MIN 15 /* For dialog_menu() */ +#define MENUBOX_WIDTH_MIN 65 +#define TEXTBOX_HEIGTH_MIN 8 /* For dialog_textbox() */ +#define TEXTBOX_WIDTH_MIN 8 +#define YESNO_HEIGTH_MIN 4 /* For dialog_yesno() */ +#define YESNO_WIDTH_MIN 4 +#define WINDOW_HEIGTH_MIN 19 /* For init_dialog() */ +#define WINDOW_WIDTH_MIN 80 + +int init_dialog(const char *backtitle); +void set_dialog_backtitle(const char *backtitle); +void set_dialog_subtitles(struct subtitle_list *subtitles); +void end_dialog(int x, int y); +void attr_clear(WINDOW * win, int height, int width, chtype attr); +void dialog_clear(void); +void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x); +void print_button(WINDOW * win, const char *label, int y, int x, int selected); +void print_title(WINDOW *dialog, const char *title, int width); +void draw_box(WINDOW * win, int y, int x, int height, int width, chtype box, + chtype border); +void draw_shadow(WINDOW * win, int y, int x, int height, int width); + +int first_alpha(const char *string, const char *exempt); +int dialog_yesno(const char *title, const char *prompt, int height, int width); +int dialog_msgbox(const char *title, const char *prompt, int height, + int width, int pause); + + +typedef void (*update_text_fn)(char *buf, size_t start, size_t end, void + *_data); +int dialog_textbox(const char *title, char *tbuf, int initial_height, + int initial_width, int *keys, int *_vscroll, int *_hscroll, + update_text_fn update_text, void *data); +int dialog_menu(const char *title, const char *prompt, + const void *selected, int *s_scroll); +int dialog_checklist(const char *title, const char *prompt, int height, + int width, int list_height); +int dialog_inputbox(const char *title, const char *prompt, int height, + int width, const char *init); + +/* + * This is the base for fictitious keys, which activate + * the buttons. + * + * Mouse-generated keys are the following: + * -- the first 32 are used as numbers, in addition to '0'-'9' + * -- the lowercase are used to signal mouse-enter events (M_EVENT + 'o') + * -- uppercase chars are used to invoke the button (M_EVENT + 'O') + */ +#define M_EVENT (KEY_MAX+1) diff --git a/src/net/scripts/kconfig/lxdialog/inputbox.c b/src/net/scripts/kconfig/lxdialog/inputbox.c new file mode 100644 index 0000000..1dcfb28 --- /dev/null +++ b/src/net/scripts/kconfig/lxdialog/inputbox.c @@ -0,0 +1,289 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * inputbox.c -- implements the input box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) + */ + +#include "dialog.h" + +char dialog_input_result[MAX_LEN + 1]; + +/* + * Print the termination buttons + */ +static void print_buttons(WINDOW * dialog, int height, int width, int selected) +{ + int x = width / 2 - 11; + int y = height - 2; + + print_button(dialog, " Ok ", y, x, selected == 0); + print_button(dialog, " Help ", y, x + 14, selected == 1); + + wmove(dialog, y, x + 1 + 14 * selected); + wrefresh(dialog); +} + +/* + * Display a dialog box for inputing a string + */ +int dialog_inputbox(const char *title, const char *prompt, int height, int width, + const char *init) +{ + int i, x, y, box_y, box_x, box_width; + int input_x = 0, key = 0, button = -1; + int show_x, len, pos; + char *instr = dialog_input_result; + WINDOW *dialog; + + if (!init) + instr[0] = '\0'; + else + strcpy(instr, init); + +do_resize: + if (getmaxy(stdscr) <= (height - INPUTBOX_HEIGTH_MIN)) + return -ERRDISPLAYTOOSMALL; + if (getmaxx(stdscr) <= (width - INPUTBOX_WIDTH_MIN)) + return -ERRDISPLAYTOOSMALL; + + /* center dialog box on screen */ + x = (getmaxx(stdscr) - width) / 2; + y = (getmaxy(stdscr) - height) / 2; + + draw_shadow(stdscr, y, x, height, width); + + dialog = newwin(height, width, y, x); + keypad(dialog, TRUE); + + draw_box(dialog, 0, 0, height, width, + dlg.dialog.atr, dlg.border.atr); + wattrset(dialog, dlg.border.atr); + mvwaddch(dialog, height - 3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dlg.dialog.atr); + waddch(dialog, ACS_RTEE); + + print_title(dialog, title, width); + + wattrset(dialog, dlg.dialog.atr); + print_autowrap(dialog, prompt, width - 2, 1, 3); + + /* Draw the input field box */ + box_width = width - 6; + getyx(dialog, y, x); + box_y = y + 2; + box_x = (width - box_width) / 2; + draw_box(dialog, y + 1, box_x - 1, 3, box_width + 2, + dlg.dialog.atr, dlg.border.atr); + + print_buttons(dialog, height, width, 0); + + /* Set up the initial value */ + wmove(dialog, box_y, box_x); + wattrset(dialog, dlg.inputbox.atr); + + len = strlen(instr); + pos = len; + + if (len >= box_width) { + show_x = len - box_width + 1; + input_x = box_width - 1; + for (i = 0; i < box_width - 1; i++) + waddch(dialog, instr[show_x + i]); + } else { + show_x = 0; + input_x = len; + waddstr(dialog, instr); + } + + wmove(dialog, box_y, box_x + input_x); + + wrefresh(dialog); + + while (key != KEY_ESC) { + key = wgetch(dialog); + + if (button == -1) { /* Input box selected */ + switch (key) { + case TAB: + case KEY_UP: + case KEY_DOWN: + break; + case KEY_BACKSPACE: + case 8: /* ^H */ + case 127: /* ^? */ + if (pos) { + wattrset(dialog, dlg.inputbox.atr); + if (input_x == 0) { + show_x--; + } else + input_x--; + + if (pos < len) { + for (i = pos - 1; i < len; i++) { + instr[i] = instr[i+1]; + } + } + + pos--; + len--; + instr[len] = '\0'; + wmove(dialog, box_y, box_x); + for (i = 0; i < box_width; i++) { + if (!instr[show_x + i]) { + waddch(dialog, ' '); + break; + } + waddch(dialog, instr[show_x + i]); + } + wmove(dialog, box_y, input_x + box_x); + wrefresh(dialog); + } + continue; + case KEY_LEFT: + if (pos > 0) { + if (input_x > 0) { + wmove(dialog, box_y, --input_x + box_x); + } else if (input_x == 0) { + show_x--; + wmove(dialog, box_y, box_x); + for (i = 0; i < box_width; i++) { + if (!instr[show_x + i]) { + waddch(dialog, ' '); + break; + } + waddch(dialog, instr[show_x + i]); + } + wmove(dialog, box_y, box_x); + } + pos--; + } + continue; + case KEY_RIGHT: + if (pos < len) { + if (input_x < box_width - 1) { + wmove(dialog, box_y, ++input_x + box_x); + } else if (input_x == box_width - 1) { + show_x++; + wmove(dialog, box_y, box_x); + for (i = 0; i < box_width; i++) { + if (!instr[show_x + i]) { + waddch(dialog, ' '); + break; + } + waddch(dialog, instr[show_x + i]); + } + wmove(dialog, box_y, input_x + box_x); + } + pos++; + } + continue; + default: + if (key < 0x100 && isprint(key)) { + if (len < MAX_LEN) { + wattrset(dialog, dlg.inputbox.atr); + if (pos < len) { + for (i = len; i > pos; i--) + instr[i] = instr[i-1]; + instr[pos] = key; + } else { + instr[len] = key; + } + pos++; + len++; + instr[len] = '\0'; + + if (input_x == box_width - 1) { + show_x++; + } else { + input_x++; + } + + wmove(dialog, box_y, box_x); + for (i = 0; i < box_width; i++) { + if (!instr[show_x + i]) { + waddch(dialog, ' '); + break; + } + waddch(dialog, instr[show_x + i]); + } + wmove(dialog, box_y, input_x + box_x); + wrefresh(dialog); + } else + flash(); /* Alarm user about overflow */ + continue; + } + } + } + switch (key) { + case 'O': + case 'o': + delwin(dialog); + return 0; + case 'H': + case 'h': + delwin(dialog); + return 1; + case KEY_UP: + case KEY_LEFT: + switch (button) { + case -1: + button = 1; /* Indicates "Help" button is selected */ + print_buttons(dialog, height, width, 1); + break; + case 0: + button = -1; /* Indicates input box is selected */ + print_buttons(dialog, height, width, 0); + wmove(dialog, box_y, box_x + input_x); + wrefresh(dialog); + break; + case 1: + button = 0; /* Indicates "OK" button is selected */ + print_buttons(dialog, height, width, 0); + break; + } + break; + case TAB: + case KEY_DOWN: + case KEY_RIGHT: + switch (button) { + case -1: + button = 0; /* Indicates "OK" button is selected */ + print_buttons(dialog, height, width, 0); + break; + case 0: + button = 1; /* Indicates "Help" button is selected */ + print_buttons(dialog, height, width, 1); + break; + case 1: + button = -1; /* Indicates input box is selected */ + print_buttons(dialog, height, width, 0); + wmove(dialog, box_y, box_x + input_x); + wrefresh(dialog); + break; + } + break; + case ' ': + case '\n': + delwin(dialog); + return (button == -1 ? 0 : button); + case 'X': + case 'x': + key = KEY_ESC; + break; + case KEY_ESC: + key = on_key_esc(dialog); + break; + case KEY_RESIZE: + delwin(dialog); + on_key_resize(); + goto do_resize; + } + } + + delwin(dialog); + return KEY_ESC; /* ESC pressed */ +} diff --git a/src/net/scripts/kconfig/lxdialog/menubox.c b/src/net/scripts/kconfig/lxdialog/menubox.c new file mode 100644 index 0000000..58c2f8a --- /dev/null +++ b/src/net/scripts/kconfig/lxdialog/menubox.c @@ -0,0 +1,424 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * menubox.c -- implements the menu box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw@cfw.com) + */ + +/* + * Changes by Clifford Wolf (god@clifford.at) + * + * [ 1998-06-13 ] + * + * *) A bugfix for the Page-Down problem + * + * *) Formerly when I used Page Down and Page Up, the cursor would be set + * to the first position in the menu box. Now lxdialog is a bit + * smarter and works more like other menu systems (just have a look at + * it). + * + * *) Formerly if I selected something my scrolling would be broken because + * lxdialog is re-invoked by the Menuconfig shell script, can't + * remember the last scrolling position, and just sets it so that the + * cursor is at the bottom of the box. Now it writes the temporary file + * lxdialog.scrltmp which contains this information. The file is + * deleted by lxdialog if the user leaves a submenu or enters a new + * one, but it would be nice if Menuconfig could make another "rm -f" + * just to be sure. Just try it out - you will recognise a difference! + * + * [ 1998-06-14 ] + * + * *) Now lxdialog is crash-safe against broken "lxdialog.scrltmp" files + * and menus change their size on the fly. + * + * *) If for some reason the last scrolling position is not saved by + * lxdialog, it sets the scrolling so that the selected item is in the + * middle of the menu box, not at the bottom. + * + * 02 January 1999, Michael Elizabeth Chastain (mec@shout.net) + * Reset 'scroll' to 0 if the value from lxdialog.scrltmp is bogus. + * This fixes a bug in Menuconfig where using ' ' to descend into menus + * would leave mis-synchronized lxdialog.scrltmp files lying around, + * fscanf would read in 'scroll', and eventually that value would get used. + */ + +#include "dialog.h" + +static int menu_width, item_x; + +/* + * Print menu item + */ +static void do_print_item(WINDOW * win, const char *item, int line_y, + int selected, int hotkey) +{ + int j; + char *menu_item = malloc(menu_width + 1); + + strncpy(menu_item, item, menu_width - item_x); + menu_item[menu_width - item_x] = '\0'; + j = first_alpha(menu_item, "YyNnMmHh"); + + /* Clear 'residue' of last item */ + wattrset(win, dlg.menubox.atr); + wmove(win, line_y, 0); +#if OLD_NCURSES + { + int i; + for (i = 0; i < menu_width; i++) + waddch(win, ' '); + } +#else + wclrtoeol(win); +#endif + wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr); + mvwaddstr(win, line_y, item_x, menu_item); + if (hotkey) { + wattrset(win, selected ? dlg.tag_key_selected.atr + : dlg.tag_key.atr); + mvwaddch(win, line_y, item_x + j, menu_item[j]); + } + if (selected) { + wmove(win, line_y, item_x + 1); + } + free(menu_item); + wrefresh(win); +} + +#define print_item(index, choice, selected) \ +do { \ + item_set(index); \ + do_print_item(menu, item_str(), choice, selected, !item_is_tag(':')); \ +} while (0) + +/* + * Print the scroll indicators. + */ +static void print_arrows(WINDOW * win, int item_no, int scroll, int y, int x, + int height) +{ + int cur_y, cur_x; + + getyx(win, cur_y, cur_x); + + wmove(win, y, x); + + if (scroll > 0) { + wattrset(win, dlg.uarrow.atr); + waddch(win, ACS_UARROW); + waddstr(win, "(-)"); + } else { + wattrset(win, dlg.menubox.atr); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + } + + y = y + height + 1; + wmove(win, y, x); + wrefresh(win); + + if ((height < item_no) && (scroll + height < item_no)) { + wattrset(win, dlg.darrow.atr); + waddch(win, ACS_DARROW); + waddstr(win, "(+)"); + } else { + wattrset(win, dlg.menubox_border.atr); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + } + + wmove(win, cur_y, cur_x); + wrefresh(win); +} + +/* + * Display the termination buttons. + */ +static void print_buttons(WINDOW * win, int height, int width, int selected) +{ + int x = width / 2 - 28; + int y = height - 2; + + print_button(win, "Select", y, x, selected == 0); + print_button(win, " Exit ", y, x + 12, selected == 1); + print_button(win, " Help ", y, x + 24, selected == 2); + print_button(win, " Save ", y, x + 36, selected == 3); + print_button(win, " Load ", y, x + 48, selected == 4); + + wmove(win, y, x + 1 + 12 * selected); + wrefresh(win); +} + +/* scroll up n lines (n may be negative) */ +static void do_scroll(WINDOW *win, int *scroll, int n) +{ + /* Scroll menu up */ + scrollok(win, TRUE); + wscrl(win, n); + scrollok(win, FALSE); + *scroll = *scroll + n; + wrefresh(win); +} + +/* + * Display a menu for choosing among a number of options + */ +int dialog_menu(const char *title, const char *prompt, + const void *selected, int *s_scroll) +{ + int i, j, x, y, box_x, box_y; + int height, width, menu_height; + int key = 0, button = 0, scroll = 0, choice = 0; + int first_item = 0, max_choice; + WINDOW *dialog, *menu; + +do_resize: + height = getmaxy(stdscr); + width = getmaxx(stdscr); + if (height < MENUBOX_HEIGTH_MIN || width < MENUBOX_WIDTH_MIN) + return -ERRDISPLAYTOOSMALL; + + height -= 4; + width -= 5; + menu_height = height - 10; + + max_choice = MIN(menu_height, item_count()); + + /* center dialog box on screen */ + x = (getmaxx(stdscr) - width) / 2; + y = (getmaxy(stdscr) - height) / 2; + + draw_shadow(stdscr, y, x, height, width); + + dialog = newwin(height, width, y, x); + keypad(dialog, TRUE); + + draw_box(dialog, 0, 0, height, width, + dlg.dialog.atr, dlg.border.atr); + wattrset(dialog, dlg.border.atr); + mvwaddch(dialog, height - 3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dlg.dialog.atr); + wbkgdset(dialog, dlg.dialog.atr & A_COLOR); + waddch(dialog, ACS_RTEE); + + print_title(dialog, title, width); + + wattrset(dialog, dlg.dialog.atr); + print_autowrap(dialog, prompt, width - 2, 1, 3); + + menu_width = width - 6; + box_y = height - menu_height - 5; + box_x = (width - menu_width) / 2 - 1; + + /* create new window for the menu */ + menu = subwin(dialog, menu_height, menu_width, + y + box_y + 1, x + box_x + 1); + keypad(menu, TRUE); + + /* draw a box around the menu items */ + draw_box(dialog, box_y, box_x, menu_height + 2, menu_width + 2, + dlg.menubox_border.atr, dlg.menubox.atr); + + if (menu_width >= 80) + item_x = (menu_width - 70) / 2; + else + item_x = 4; + + /* Set choice to default item */ + item_foreach() + if (selected && (selected == item_data())) + choice = item_n(); + /* get the saved scroll info */ + scroll = *s_scroll; + if ((scroll <= choice) && (scroll + max_choice > choice) && + (scroll >= 0) && (scroll + max_choice <= item_count())) { + first_item = scroll; + choice = choice - scroll; + } else { + scroll = 0; + } + if ((choice >= max_choice)) { + if (choice >= item_count() - max_choice / 2) + scroll = first_item = item_count() - max_choice; + else + scroll = first_item = choice - max_choice / 2; + choice = choice - scroll; + } + + /* Print the menu */ + for (i = 0; i < max_choice; i++) { + print_item(first_item + i, i, i == choice); + } + + wnoutrefresh(menu); + + print_arrows(dialog, item_count(), scroll, + box_y, box_x + item_x + 1, menu_height); + + print_buttons(dialog, height, width, 0); + wmove(menu, choice, item_x + 1); + wrefresh(menu); + + while (key != KEY_ESC) { + key = wgetch(menu); + + if (key < 256 && isalpha(key)) + key = tolower(key); + + if (strchr("ynmh", key)) + i = max_choice; + else { + for (i = choice + 1; i < max_choice; i++) { + item_set(scroll + i); + j = first_alpha(item_str(), "YyNnMmHh"); + if (key == tolower(item_str()[j])) + break; + } + if (i == max_choice) + for (i = 0; i < max_choice; i++) { + item_set(scroll + i); + j = first_alpha(item_str(), "YyNnMmHh"); + if (key == tolower(item_str()[j])) + break; + } + } + + if (item_count() != 0 && + (i < max_choice || + key == KEY_UP || key == KEY_DOWN || + key == '-' || key == '+' || + key == KEY_PPAGE || key == KEY_NPAGE)) { + /* Remove highligt of current item */ + print_item(scroll + choice, choice, FALSE); + + if (key == KEY_UP || key == '-') { + if (choice < 2 && scroll) { + /* Scroll menu down */ + do_scroll(menu, &scroll, -1); + + print_item(scroll, 0, FALSE); + } else + choice = MAX(choice - 1, 0); + + } else if (key == KEY_DOWN || key == '+') { + print_item(scroll+choice, choice, FALSE); + + if ((choice > max_choice - 3) && + (scroll + max_choice < item_count())) { + /* Scroll menu up */ + do_scroll(menu, &scroll, 1); + + print_item(scroll+max_choice - 1, + max_choice - 1, FALSE); + } else + choice = MIN(choice + 1, max_choice - 1); + + } else if (key == KEY_PPAGE) { + scrollok(menu, TRUE); + for (i = 0; (i < max_choice); i++) { + if (scroll > 0) { + do_scroll(menu, &scroll, -1); + print_item(scroll, 0, FALSE); + } else { + if (choice > 0) + choice--; + } + } + + } else if (key == KEY_NPAGE) { + for (i = 0; (i < max_choice); i++) { + if (scroll + max_choice < item_count()) { + do_scroll(menu, &scroll, 1); + print_item(scroll+max_choice-1, + max_choice - 1, FALSE); + } else { + if (choice + 1 < max_choice) + choice++; + } + } + } else + choice = i; + + print_item(scroll + choice, choice, TRUE); + + print_arrows(dialog, item_count(), scroll, + box_y, box_x + item_x + 1, menu_height); + + wnoutrefresh(dialog); + wrefresh(menu); + + continue; /* wait for another key press */ + } + + switch (key) { + case KEY_LEFT: + case TAB: + case KEY_RIGHT: + button = ((key == KEY_LEFT ? --button : ++button) < 0) + ? 4 : (button > 4 ? 0 : button); + + print_buttons(dialog, height, width, button); + wrefresh(menu); + break; + case ' ': + case 's': + case 'y': + case 'n': + case 'm': + case '/': + case 'h': + case '?': + case 'z': + case '\n': + /* save scroll info */ + *s_scroll = scroll; + delwin(menu); + delwin(dialog); + item_set(scroll + choice); + item_set_selected(1); + switch (key) { + case 'h': + case '?': + return 2; + case 's': + case 'y': + return 5; + case 'n': + return 6; + case 'm': + return 7; + case ' ': + return 8; + case '/': + return 9; + case 'z': + return 10; + case '\n': + return button; + } + return 0; + case 'e': + case 'x': + key = KEY_ESC; + break; + case KEY_ESC: + key = on_key_esc(menu); + break; + case KEY_RESIZE: + on_key_resize(); + delwin(menu); + delwin(dialog); + goto do_resize; + } + } + delwin(menu); + delwin(dialog); + return key; /* ESC pressed */ +} diff --git a/src/net/scripts/kconfig/lxdialog/textbox.c b/src/net/scripts/kconfig/lxdialog/textbox.c new file mode 100644 index 0000000..4e339b1 --- /dev/null +++ b/src/net/scripts/kconfig/lxdialog/textbox.c @@ -0,0 +1,395 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * textbox.c -- implements the text box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) + */ + +#include "dialog.h" + +static void back_lines(int n); +static void print_page(WINDOW *win, int height, int width, update_text_fn + update_text, void *data); +static void print_line(WINDOW *win, int row, int width); +static char *get_line(void); +static void print_position(WINDOW * win); + +static int hscroll; +static int begin_reached, end_reached, page_length; +static char *buf; +static char *page; + +/* + * refresh window content + */ +static void refresh_text_box(WINDOW *dialog, WINDOW *box, int boxh, int boxw, + int cur_y, int cur_x, update_text_fn update_text, + void *data) +{ + print_page(box, boxh, boxw, update_text, data); + print_position(dialog); + wmove(dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh(dialog); +} + + +/* + * Display text from a file in a dialog box. + * + * keys is a null-terminated array + * update_text() may not add or remove any '\n' or '\0' in tbuf + */ +int dialog_textbox(const char *title, char *tbuf, int initial_height, + int initial_width, int *keys, int *_vscroll, int *_hscroll, + update_text_fn update_text, void *data) +{ + int i, x, y, cur_x, cur_y, key = 0; + int height, width, boxh, boxw; + WINDOW *dialog, *box; + bool done = false; + + begin_reached = 1; + end_reached = 0; + page_length = 0; + hscroll = 0; + buf = tbuf; + page = buf; /* page is pointer to start of page to be displayed */ + + if (_vscroll && *_vscroll) { + begin_reached = 0; + + for (i = 0; i < *_vscroll; i++) + get_line(); + } + if (_hscroll) + hscroll = *_hscroll; + +do_resize: + getmaxyx(stdscr, height, width); + if (height < TEXTBOX_HEIGTH_MIN || width < TEXTBOX_WIDTH_MIN) + return -ERRDISPLAYTOOSMALL; + if (initial_height != 0) + height = initial_height; + else + if (height > 4) + height -= 4; + else + height = 0; + if (initial_width != 0) + width = initial_width; + else + if (width > 5) + width -= 5; + else + width = 0; + + /* center dialog box on screen */ + x = (getmaxx(stdscr) - width) / 2; + y = (getmaxy(stdscr) - height) / 2; + + draw_shadow(stdscr, y, x, height, width); + + dialog = newwin(height, width, y, x); + keypad(dialog, TRUE); + + /* Create window for box region, used for scrolling text */ + boxh = height - 4; + boxw = width - 2; + box = subwin(dialog, boxh, boxw, y + 1, x + 1); + wattrset(box, dlg.dialog.atr); + wbkgdset(box, dlg.dialog.atr & A_COLOR); + + keypad(box, TRUE); + + /* register the new window, along with its borders */ + draw_box(dialog, 0, 0, height, width, + dlg.dialog.atr, dlg.border.atr); + + wattrset(dialog, dlg.border.atr); + mvwaddch(dialog, height - 3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dlg.dialog.atr); + wbkgdset(dialog, dlg.dialog.atr & A_COLOR); + waddch(dialog, ACS_RTEE); + + print_title(dialog, title, width); + + print_button(dialog, " Exit ", height - 2, width / 2 - 4, TRUE); + wnoutrefresh(dialog); + getyx(dialog, cur_y, cur_x); /* Save cursor position */ + + /* Print first page of text */ + attr_clear(box, boxh, boxw, dlg.dialog.atr); + refresh_text_box(dialog, box, boxh, boxw, cur_y, cur_x, update_text, + data); + + while (!done) { + key = wgetch(dialog); + switch (key) { + case 'E': /* Exit */ + case 'e': + case 'X': + case 'x': + case 'q': + case '\n': + done = true; + break; + case 'g': /* First page */ + case KEY_HOME: + if (!begin_reached) { + begin_reached = 1; + page = buf; + refresh_text_box(dialog, box, boxh, boxw, + cur_y, cur_x, update_text, + data); + } + break; + case 'G': /* Last page */ + case KEY_END: + + end_reached = 1; + /* point to last char in buf */ + page = buf + strlen(buf); + back_lines(boxh); + refresh_text_box(dialog, box, boxh, boxw, cur_y, + cur_x, update_text, data); + break; + case 'K': /* Previous line */ + case 'k': + case KEY_UP: + if (begin_reached) + break; + + back_lines(page_length + 1); + refresh_text_box(dialog, box, boxh, boxw, cur_y, + cur_x, update_text, data); + break; + case 'B': /* Previous page */ + case 'b': + case 'u': + case KEY_PPAGE: + if (begin_reached) + break; + back_lines(page_length + boxh); + refresh_text_box(dialog, box, boxh, boxw, cur_y, + cur_x, update_text, data); + break; + case 'J': /* Next line */ + case 'j': + case KEY_DOWN: + if (end_reached) + break; + + back_lines(page_length - 1); + refresh_text_box(dialog, box, boxh, boxw, cur_y, + cur_x, update_text, data); + break; + case KEY_NPAGE: /* Next page */ + case ' ': + case 'd': + if (end_reached) + break; + + begin_reached = 0; + refresh_text_box(dialog, box, boxh, boxw, cur_y, + cur_x, update_text, data); + break; + case '0': /* Beginning of line */ + case 'H': /* Scroll left */ + case 'h': + case KEY_LEFT: + if (hscroll <= 0) + break; + + if (key == '0') + hscroll = 0; + else + hscroll--; + /* Reprint current page to scroll horizontally */ + back_lines(page_length); + refresh_text_box(dialog, box, boxh, boxw, cur_y, + cur_x, update_text, data); + break; + case 'L': /* Scroll right */ + case 'l': + case KEY_RIGHT: + if (hscroll >= MAX_LEN) + break; + hscroll++; + /* Reprint current page to scroll horizontally */ + back_lines(page_length); + refresh_text_box(dialog, box, boxh, boxw, cur_y, + cur_x, update_text, data); + break; + case KEY_ESC: + if (on_key_esc(dialog) == KEY_ESC) + done = true; + break; + case KEY_RESIZE: + back_lines(height); + delwin(box); + delwin(dialog); + on_key_resize(); + goto do_resize; + default: + for (i = 0; keys[i]; i++) { + if (key == keys[i]) { + done = true; + break; + } + } + } + } + delwin(box); + delwin(dialog); + if (_vscroll) { + const char *s; + + s = buf; + *_vscroll = 0; + back_lines(page_length); + while (s < page && (s = strchr(s, '\n'))) { + (*_vscroll)++; + s++; + } + } + if (_hscroll) + *_hscroll = hscroll; + return key; +} + +/* + * Go back 'n' lines in text. Called by dialog_textbox(). + * 'page' will be updated to point to the desired line in 'buf'. + */ +static void back_lines(int n) +{ + int i; + + begin_reached = 0; + /* Go back 'n' lines */ + for (i = 0; i < n; i++) { + if (*page == '\0') { + if (end_reached) { + end_reached = 0; + continue; + } + } + if (page == buf) { + begin_reached = 1; + return; + } + page--; + do { + if (page == buf) { + begin_reached = 1; + return; + } + page--; + } while (*page != '\n'); + page++; + } +} + +/* + * Print a new page of text. + */ +static void print_page(WINDOW *win, int height, int width, update_text_fn + update_text, void *data) +{ + int i, passed_end = 0; + + if (update_text) { + char *end; + + for (i = 0; i < height; i++) + get_line(); + end = page; + back_lines(height); + update_text(buf, page - buf, end - buf, data); + } + + page_length = 0; + for (i = 0; i < height; i++) { + print_line(win, i, width); + if (!passed_end) + page_length++; + if (end_reached && !passed_end) + passed_end = 1; + } + wnoutrefresh(win); +} + +/* + * Print a new line of text. + */ +static void print_line(WINDOW * win, int row, int width) +{ + char *line; + + line = get_line(); + line += MIN(strlen(line), hscroll); /* Scroll horizontally */ + wmove(win, row, 0); /* move cursor to correct line */ + waddch(win, ' '); + waddnstr(win, line, MIN(strlen(line), width - 2)); + + /* Clear 'residue' of previous line */ +#if OLD_NCURSES + { + int x = getcurx(win); + int i; + for (i = 0; i < width - x; i++) + waddch(win, ' '); + } +#else + wclrtoeol(win); +#endif +} + +/* + * Return current line of text. Called by dialog_textbox() and print_line(). + * 'page' should point to start of current line before calling, and will be + * updated to point to start of next line. + */ +static char *get_line(void) +{ + int i = 0; + static char line[MAX_LEN + 1]; + + end_reached = 0; + while (*page != '\n') { + if (*page == '\0') { + end_reached = 1; + break; + } else if (i < MAX_LEN) + line[i++] = *(page++); + else { + /* Truncate lines longer than MAX_LEN characters */ + if (i == MAX_LEN) + line[i++] = '\0'; + page++; + } + } + if (i <= MAX_LEN) + line[i] = '\0'; + if (!end_reached) + page++; /* move past '\n' */ + + return line; +} + +/* + * Print current position + */ +static void print_position(WINDOW * win) +{ + int percent; + + wattrset(win, dlg.position_indicator.atr); + wbkgdset(win, dlg.position_indicator.atr & A_COLOR); + percent = (page - buf) * 100 / strlen(buf); + wmove(win, getmaxy(win) - 3, getmaxx(win) - 9); + wprintw(win, "(%3d%%)", percent); +} diff --git a/src/net/scripts/kconfig/lxdialog/util.c b/src/net/scripts/kconfig/lxdialog/util.c new file mode 100644 index 0000000..1b490d4 --- /dev/null +++ b/src/net/scripts/kconfig/lxdialog/util.c @@ -0,0 +1,700 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * util.c + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) + */ + +#include <stdarg.h> + +#include "dialog.h" + +/* Needed in signal handler in mconf.c */ +int saved_x, saved_y; + +struct dialog_info dlg; + +static void set_mono_theme(void) +{ + dlg.screen.atr = A_NORMAL; + dlg.shadow.atr = A_NORMAL; + dlg.dialog.atr = A_NORMAL; + dlg.title.atr = A_BOLD; + dlg.border.atr = A_NORMAL; + dlg.button_active.atr = A_REVERSE; + dlg.button_inactive.atr = A_DIM; + dlg.button_key_active.atr = A_REVERSE; + dlg.button_key_inactive.atr = A_BOLD; + dlg.button_label_active.atr = A_REVERSE; + dlg.button_label_inactive.atr = A_NORMAL; + dlg.inputbox.atr = A_NORMAL; + dlg.inputbox_border.atr = A_NORMAL; + dlg.searchbox.atr = A_NORMAL; + dlg.searchbox_title.atr = A_BOLD; + dlg.searchbox_border.atr = A_NORMAL; + dlg.position_indicator.atr = A_BOLD; + dlg.menubox.atr = A_NORMAL; + dlg.menubox_border.atr = A_NORMAL; + dlg.item.atr = A_NORMAL; + dlg.item_selected.atr = A_REVERSE; + dlg.tag.atr = A_BOLD; + dlg.tag_selected.atr = A_REVERSE; + dlg.tag_key.atr = A_BOLD; + dlg.tag_key_selected.atr = A_REVERSE; + dlg.check.atr = A_BOLD; + dlg.check_selected.atr = A_REVERSE; + dlg.uarrow.atr = A_BOLD; + dlg.darrow.atr = A_BOLD; +} + +#define DLG_COLOR(dialog, f, b, h) \ +do { \ + dlg.dialog.fg = (f); \ + dlg.dialog.bg = (b); \ + dlg.dialog.hl = (h); \ +} while (0) + +static void set_classic_theme(void) +{ + DLG_COLOR(screen, COLOR_CYAN, COLOR_BLUE, true); + DLG_COLOR(shadow, COLOR_BLACK, COLOR_BLACK, true); + DLG_COLOR(dialog, COLOR_BLACK, COLOR_WHITE, false); + DLG_COLOR(title, COLOR_YELLOW, COLOR_WHITE, true); + DLG_COLOR(border, COLOR_WHITE, COLOR_WHITE, true); + DLG_COLOR(button_active, COLOR_WHITE, COLOR_BLUE, true); + DLG_COLOR(button_inactive, COLOR_BLACK, COLOR_WHITE, false); + DLG_COLOR(button_key_active, COLOR_WHITE, COLOR_BLUE, true); + DLG_COLOR(button_key_inactive, COLOR_RED, COLOR_WHITE, false); + DLG_COLOR(button_label_active, COLOR_YELLOW, COLOR_BLUE, true); + DLG_COLOR(button_label_inactive, COLOR_BLACK, COLOR_WHITE, true); + DLG_COLOR(inputbox, COLOR_BLACK, COLOR_WHITE, false); + DLG_COLOR(inputbox_border, COLOR_BLACK, COLOR_WHITE, false); + DLG_COLOR(searchbox, COLOR_BLACK, COLOR_WHITE, false); + DLG_COLOR(searchbox_title, COLOR_YELLOW, COLOR_WHITE, true); + DLG_COLOR(searchbox_border, COLOR_WHITE, COLOR_WHITE, true); + DLG_COLOR(position_indicator, COLOR_YELLOW, COLOR_WHITE, true); + DLG_COLOR(menubox, COLOR_BLACK, COLOR_WHITE, false); + DLG_COLOR(menubox_border, COLOR_WHITE, COLOR_WHITE, true); + DLG_COLOR(item, COLOR_BLACK, COLOR_WHITE, false); + DLG_COLOR(item_selected, COLOR_WHITE, COLOR_BLUE, true); + DLG_COLOR(tag, COLOR_YELLOW, COLOR_WHITE, true); + DLG_COLOR(tag_selected, COLOR_YELLOW, COLOR_BLUE, true); + DLG_COLOR(tag_key, COLOR_YELLOW, COLOR_WHITE, true); + DLG_COLOR(tag_key_selected, COLOR_YELLOW, COLOR_BLUE, true); + DLG_COLOR(check, COLOR_BLACK, COLOR_WHITE, false); + DLG_COLOR(check_selected, COLOR_WHITE, COLOR_BLUE, true); + DLG_COLOR(uarrow, COLOR_GREEN, COLOR_WHITE, true); + DLG_COLOR(darrow, COLOR_GREEN, COLOR_WHITE, true); +} + +static void set_blackbg_theme(void) +{ + DLG_COLOR(screen, COLOR_RED, COLOR_BLACK, true); + DLG_COLOR(shadow, COLOR_BLACK, COLOR_BLACK, false); + DLG_COLOR(dialog, COLOR_WHITE, COLOR_BLACK, false); + DLG_COLOR(title, COLOR_RED, COLOR_BLACK, false); + DLG_COLOR(border, COLOR_BLACK, COLOR_BLACK, true); + + DLG_COLOR(button_active, COLOR_YELLOW, COLOR_RED, false); + DLG_COLOR(button_inactive, COLOR_YELLOW, COLOR_BLACK, false); + DLG_COLOR(button_key_active, COLOR_YELLOW, COLOR_RED, true); + DLG_COLOR(button_key_inactive, COLOR_RED, COLOR_BLACK, false); + DLG_COLOR(button_label_active, COLOR_WHITE, COLOR_RED, false); + DLG_COLOR(button_label_inactive, COLOR_BLACK, COLOR_BLACK, true); + + DLG_COLOR(inputbox, COLOR_YELLOW, COLOR_BLACK, false); + DLG_COLOR(inputbox_border, COLOR_YELLOW, COLOR_BLACK, false); + + DLG_COLOR(searchbox, COLOR_YELLOW, COLOR_BLACK, false); + DLG_COLOR(searchbox_title, COLOR_YELLOW, COLOR_BLACK, true); + DLG_COLOR(searchbox_border, COLOR_BLACK, COLOR_BLACK, true); + + DLG_COLOR(position_indicator, COLOR_RED, COLOR_BLACK, false); + + DLG_COLOR(menubox, COLOR_YELLOW, COLOR_BLACK, false); + DLG_COLOR(menubox_border, COLOR_BLACK, COLOR_BLACK, true); + + DLG_COLOR(item, COLOR_WHITE, COLOR_BLACK, false); + DLG_COLOR(item_selected, COLOR_WHITE, COLOR_RED, false); + + DLG_COLOR(tag, COLOR_RED, COLOR_BLACK, false); + DLG_COLOR(tag_selected, COLOR_YELLOW, COLOR_RED, true); + DLG_COLOR(tag_key, COLOR_RED, COLOR_BLACK, false); + DLG_COLOR(tag_key_selected, COLOR_YELLOW, COLOR_RED, true); + + DLG_COLOR(check, COLOR_YELLOW, COLOR_BLACK, false); + DLG_COLOR(check_selected, COLOR_YELLOW, COLOR_RED, true); + + DLG_COLOR(uarrow, COLOR_RED, COLOR_BLACK, false); + DLG_COLOR(darrow, COLOR_RED, COLOR_BLACK, false); +} + +static void set_bluetitle_theme(void) +{ + set_classic_theme(); + DLG_COLOR(title, COLOR_BLUE, COLOR_WHITE, true); + DLG_COLOR(button_key_active, COLOR_YELLOW, COLOR_BLUE, true); + DLG_COLOR(button_label_active, COLOR_WHITE, COLOR_BLUE, true); + DLG_COLOR(searchbox_title, COLOR_BLUE, COLOR_WHITE, true); + DLG_COLOR(position_indicator, COLOR_BLUE, COLOR_WHITE, true); + DLG_COLOR(tag, COLOR_BLUE, COLOR_WHITE, true); + DLG_COLOR(tag_key, COLOR_BLUE, COLOR_WHITE, true); + +} + +/* + * Select color theme + */ +static int set_theme(const char *theme) +{ + int use_color = 1; + if (!theme) + set_bluetitle_theme(); + else if (strcmp(theme, "classic") == 0) + set_classic_theme(); + else if (strcmp(theme, "bluetitle") == 0) + set_bluetitle_theme(); + else if (strcmp(theme, "blackbg") == 0) + set_blackbg_theme(); + else if (strcmp(theme, "mono") == 0) + use_color = 0; + + return use_color; +} + +static void init_one_color(struct dialog_color *color) +{ + static int pair = 0; + + pair++; + init_pair(pair, color->fg, color->bg); + if (color->hl) + color->atr = A_BOLD | COLOR_PAIR(pair); + else + color->atr = COLOR_PAIR(pair); +} + +static void init_dialog_colors(void) +{ + init_one_color(&dlg.screen); + init_one_color(&dlg.shadow); + init_one_color(&dlg.dialog); + init_one_color(&dlg.title); + init_one_color(&dlg.border); + init_one_color(&dlg.button_active); + init_one_color(&dlg.button_inactive); + init_one_color(&dlg.button_key_active); + init_one_color(&dlg.button_key_inactive); + init_one_color(&dlg.button_label_active); + init_one_color(&dlg.button_label_inactive); + init_one_color(&dlg.inputbox); + init_one_color(&dlg.inputbox_border); + init_one_color(&dlg.searchbox); + init_one_color(&dlg.searchbox_title); + init_one_color(&dlg.searchbox_border); + init_one_color(&dlg.position_indicator); + init_one_color(&dlg.menubox); + init_one_color(&dlg.menubox_border); + init_one_color(&dlg.item); + init_one_color(&dlg.item_selected); + init_one_color(&dlg.tag); + init_one_color(&dlg.tag_selected); + init_one_color(&dlg.tag_key); + init_one_color(&dlg.tag_key_selected); + init_one_color(&dlg.check); + init_one_color(&dlg.check_selected); + init_one_color(&dlg.uarrow); + init_one_color(&dlg.darrow); +} + +/* + * Setup for color display + */ +static void color_setup(const char *theme) +{ + int use_color; + + use_color = set_theme(theme); + if (use_color && has_colors()) { + start_color(); + init_dialog_colors(); + } else + set_mono_theme(); +} + +/* + * Set window to attribute 'attr' + */ +void attr_clear(WINDOW * win, int height, int width, chtype attr) +{ + int i, j; + + wattrset(win, attr); + for (i = 0; i < height; i++) { + wmove(win, i, 0); + for (j = 0; j < width; j++) + waddch(win, ' '); + } + touchwin(win); +} + +void dialog_clear(void) +{ + int lines, columns; + + lines = getmaxy(stdscr); + columns = getmaxx(stdscr); + + attr_clear(stdscr, lines, columns, dlg.screen.atr); + /* Display background title if it exists ... - SLH */ + if (dlg.backtitle != NULL) { + int i, len = 0, skip = 0; + struct subtitle_list *pos; + + wattrset(stdscr, dlg.screen.atr); + mvwaddstr(stdscr, 0, 1, (char *)dlg.backtitle); + + for (pos = dlg.subtitles; pos != NULL; pos = pos->next) { + /* 3 is for the arrow and spaces */ + len += strlen(pos->text) + 3; + } + + wmove(stdscr, 1, 1); + if (len > columns - 2) { + const char *ellipsis = "[...] "; + waddstr(stdscr, ellipsis); + skip = len - (columns - 2 - strlen(ellipsis)); + } + + for (pos = dlg.subtitles; pos != NULL; pos = pos->next) { + if (skip == 0) + waddch(stdscr, ACS_RARROW); + else + skip--; + + if (skip == 0) + waddch(stdscr, ' '); + else + skip--; + + if (skip < strlen(pos->text)) { + waddstr(stdscr, pos->text + skip); + skip = 0; + } else + skip -= strlen(pos->text); + + if (skip == 0) + waddch(stdscr, ' '); + else + skip--; + } + + for (i = len + 1; i < columns - 1; i++) + waddch(stdscr, ACS_HLINE); + } + wnoutrefresh(stdscr); +} + +/* + * Do some initialization for dialog + */ +int init_dialog(const char *backtitle) +{ + int height, width; + + initscr(); /* Init curses */ + + /* Get current cursor position for signal handler in mconf.c */ + getyx(stdscr, saved_y, saved_x); + + getmaxyx(stdscr, height, width); + if (height < WINDOW_HEIGTH_MIN || width < WINDOW_WIDTH_MIN) { + endwin(); + return -ERRDISPLAYTOOSMALL; + } + + dlg.backtitle = backtitle; + color_setup(getenv("MENUCONFIG_COLOR")); + + keypad(stdscr, TRUE); + cbreak(); + noecho(); + dialog_clear(); + + return 0; +} + +void set_dialog_backtitle(const char *backtitle) +{ + dlg.backtitle = backtitle; +} + +void set_dialog_subtitles(struct subtitle_list *subtitles) +{ + dlg.subtitles = subtitles; +} + +/* + * End using dialog functions. + */ +void end_dialog(int x, int y) +{ + /* move cursor back to original position */ + move(y, x); + refresh(); + endwin(); +} + +/* Print the title of the dialog. Center the title and truncate + * tile if wider than dialog (- 2 chars). + **/ +void print_title(WINDOW *dialog, const char *title, int width) +{ + if (title) { + int tlen = MIN(width - 2, strlen(title)); + wattrset(dialog, dlg.title.atr); + mvwaddch(dialog, 0, (width - tlen) / 2 - 1, ' '); + mvwaddnstr(dialog, 0, (width - tlen)/2, title, tlen); + waddch(dialog, ' '); + } +} + +/* + * Print a string of text in a window, automatically wrap around to the + * next line if the string is too long to fit on one line. Newline + * characters '\n' are propperly processed. We start on a new line + * if there is no room for at least 4 nonblanks following a double-space. + */ +void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x) +{ + int newl, cur_x, cur_y; + int prompt_len, room, wlen; + char tempstr[MAX_LEN + 1], *word, *sp, *sp2, *newline_separator = 0; + + strcpy(tempstr, prompt); + + prompt_len = strlen(tempstr); + + if (prompt_len <= width - x * 2) { /* If prompt is short */ + wmove(win, y, (width - prompt_len) / 2); + waddstr(win, tempstr); + } else { + cur_x = x; + cur_y = y; + newl = 1; + word = tempstr; + while (word && *word) { + sp = strpbrk(word, "\n "); + if (sp && *sp == '\n') + newline_separator = sp; + + if (sp) + *sp++ = 0; + + /* Wrap to next line if either the word does not fit, + or it is the first word of a new sentence, and it is + short, and the next word does not fit. */ + room = width - cur_x; + wlen = strlen(word); + if (wlen > room || + (newl && wlen < 4 && sp + && wlen + 1 + strlen(sp) > room + && (!(sp2 = strpbrk(sp, "\n ")) + || wlen + 1 + (sp2 - sp) > room))) { + cur_y++; + cur_x = x; + } + wmove(win, cur_y, cur_x); + waddstr(win, word); + getyx(win, cur_y, cur_x); + + /* Move to the next line if the word separator was a newline */ + if (newline_separator) { + cur_y++; + cur_x = x; + newline_separator = 0; + } else + cur_x++; + + if (sp && *sp == ' ') { + cur_x++; /* double space */ + while (*++sp == ' ') ; + newl = 1; + } else + newl = 0; + word = sp; + } + } +} + +/* + * Print a button + */ +void print_button(WINDOW * win, const char *label, int y, int x, int selected) +{ + int i, temp; + + wmove(win, y, x); + wattrset(win, selected ? dlg.button_active.atr + : dlg.button_inactive.atr); + waddstr(win, "<"); + temp = strspn(label, " "); + label += temp; + wattrset(win, selected ? dlg.button_label_active.atr + : dlg.button_label_inactive.atr); + for (i = 0; i < temp; i++) + waddch(win, ' '); + wattrset(win, selected ? dlg.button_key_active.atr + : dlg.button_key_inactive.atr); + waddch(win, label[0]); + wattrset(win, selected ? dlg.button_label_active.atr + : dlg.button_label_inactive.atr); + waddstr(win, (char *)label + 1); + wattrset(win, selected ? dlg.button_active.atr + : dlg.button_inactive.atr); + waddstr(win, ">"); + wmove(win, y, x + temp + 1); +} + +/* + * Draw a rectangular box with line drawing characters + */ +void +draw_box(WINDOW * win, int y, int x, int height, int width, + chtype box, chtype border) +{ + int i, j; + + wattrset(win, 0); + for (i = 0; i < height; i++) { + wmove(win, y + i, x); + for (j = 0; j < width; j++) + if (!i && !j) + waddch(win, border | ACS_ULCORNER); + else if (i == height - 1 && !j) + waddch(win, border | ACS_LLCORNER); + else if (!i && j == width - 1) + waddch(win, box | ACS_URCORNER); + else if (i == height - 1 && j == width - 1) + waddch(win, box | ACS_LRCORNER); + else if (!i) + waddch(win, border | ACS_HLINE); + else if (i == height - 1) + waddch(win, box | ACS_HLINE); + else if (!j) + waddch(win, border | ACS_VLINE); + else if (j == width - 1) + waddch(win, box | ACS_VLINE); + else + waddch(win, box | ' '); + } +} + +/* + * Draw shadows along the right and bottom edge to give a more 3D look + * to the boxes + */ +void draw_shadow(WINDOW * win, int y, int x, int height, int width) +{ + int i; + + if (has_colors()) { /* Whether terminal supports color? */ + wattrset(win, dlg.shadow.atr); + wmove(win, y + height, x + 2); + for (i = 0; i < width; i++) + waddch(win, winch(win) & A_CHARTEXT); + for (i = y + 1; i < y + height + 1; i++) { + wmove(win, i, x + width); + waddch(win, winch(win) & A_CHARTEXT); + waddch(win, winch(win) & A_CHARTEXT); + } + wnoutrefresh(win); + } +} + +/* + * Return the position of the first alphabetic character in a string. + */ +int first_alpha(const char *string, const char *exempt) +{ + int i, in_paren = 0, c; + + for (i = 0; i < strlen(string); i++) { + c = tolower(string[i]); + + if (strchr("<[(", c)) + ++in_paren; + if (strchr(">])", c) && in_paren > 0) + --in_paren; + + if ((!in_paren) && isalpha(c) && strchr(exempt, c) == 0) + return i; + } + + return 0; +} + +/* + * ncurses uses ESC to detect escaped char sequences. This resutl in + * a small timeout before ESC is actually delivered to the application. + * lxdialog suggest <ESC> <ESC> which is correctly translated to two + * times esc. But then we need to ignore the second esc to avoid stepping + * out one menu too much. Filter away all escaped key sequences since + * keypad(FALSE) turn off ncurses support for escape sequences - and thats + * needed to make notimeout() do as expected. + */ +int on_key_esc(WINDOW *win) +{ + int key; + int key2; + int key3; + + nodelay(win, TRUE); + keypad(win, FALSE); + key = wgetch(win); + key2 = wgetch(win); + do { + key3 = wgetch(win); + } while (key3 != ERR); + nodelay(win, FALSE); + keypad(win, TRUE); + if (key == KEY_ESC && key2 == ERR) + return KEY_ESC; + else if (key != ERR && key != KEY_ESC && key2 == ERR) + ungetch(key); + + return -1; +} + +/* redraw screen in new size */ +int on_key_resize(void) +{ + dialog_clear(); + return KEY_RESIZE; +} + +struct dialog_list *item_cur; +struct dialog_list item_nil; +struct dialog_list *item_head; + +void item_reset(void) +{ + struct dialog_list *p, *next; + + for (p = item_head; p; p = next) { + next = p->next; + free(p); + } + item_head = NULL; + item_cur = &item_nil; +} + +void item_make(const char *fmt, ...) +{ + va_list ap; + struct dialog_list *p = malloc(sizeof(*p)); + + if (item_head) + item_cur->next = p; + else + item_head = p; + item_cur = p; + memset(p, 0, sizeof(*p)); + + va_start(ap, fmt); + vsnprintf(item_cur->node.str, sizeof(item_cur->node.str), fmt, ap); + va_end(ap); +} + +void item_add_str(const char *fmt, ...) +{ + va_list ap; + size_t avail; + + avail = sizeof(item_cur->node.str) - strlen(item_cur->node.str); + + va_start(ap, fmt); + vsnprintf(item_cur->node.str + strlen(item_cur->node.str), + avail, fmt, ap); + item_cur->node.str[sizeof(item_cur->node.str) - 1] = '\0'; + va_end(ap); +} + +void item_set_tag(char tag) +{ + item_cur->node.tag = tag; +} +void item_set_data(void *ptr) +{ + item_cur->node.data = ptr; +} + +void item_set_selected(int val) +{ + item_cur->node.selected = val; +} + +int item_activate_selected(void) +{ + item_foreach() + if (item_is_selected()) + return 1; + return 0; +} + +void *item_data(void) +{ + return item_cur->node.data; +} + +char item_tag(void) +{ + return item_cur->node.tag; +} + +int item_count(void) +{ + int n = 0; + struct dialog_list *p; + + for (p = item_head; p; p = p->next) + n++; + return n; +} + +void item_set(int n) +{ + int i = 0; + item_foreach() + if (i++ == n) + return; +} + +int item_n(void) +{ + int n = 0; + struct dialog_list *p; + + for (p = item_head; p; p = p->next) { + if (p == item_cur) + return n; + n++; + } + return 0; +} + +const char *item_str(void) +{ + return item_cur->node.str; +} + +int item_is_selected(void) +{ + return (item_cur->node.selected != 0); +} + +int item_is_tag(char tag) +{ + return (item_cur->node.tag == tag); +} diff --git a/src/net/scripts/kconfig/lxdialog/yesno.c b/src/net/scripts/kconfig/lxdialog/yesno.c new file mode 100644 index 0000000..bcaac9b --- /dev/null +++ b/src/net/scripts/kconfig/lxdialog/yesno.c @@ -0,0 +1,101 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * yesno.c -- implements the yes/no box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) + */ + +#include "dialog.h" + +/* + * Display termination buttons + */ +static void print_buttons(WINDOW * dialog, int height, int width, int selected) +{ + int x = width / 2 - 10; + int y = height - 2; + + print_button(dialog, " Yes ", y, x, selected == 0); + print_button(dialog, " No ", y, x + 13, selected == 1); + + wmove(dialog, y, x + 1 + 13 * selected); + wrefresh(dialog); +} + +/* + * Display a dialog box with two buttons - Yes and No + */ +int dialog_yesno(const char *title, const char *prompt, int height, int width) +{ + int i, x, y, key = 0, button = 0; + WINDOW *dialog; + +do_resize: + if (getmaxy(stdscr) < (height + YESNO_HEIGTH_MIN)) + return -ERRDISPLAYTOOSMALL; + if (getmaxx(stdscr) < (width + YESNO_WIDTH_MIN)) + return -ERRDISPLAYTOOSMALL; + + /* center dialog box on screen */ + x = (getmaxx(stdscr) - width) / 2; + y = (getmaxy(stdscr) - height) / 2; + + draw_shadow(stdscr, y, x, height, width); + + dialog = newwin(height, width, y, x); + keypad(dialog, TRUE); + + draw_box(dialog, 0, 0, height, width, + dlg.dialog.atr, dlg.border.atr); + wattrset(dialog, dlg.border.atr); + mvwaddch(dialog, height - 3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dlg.dialog.atr); + waddch(dialog, ACS_RTEE); + + print_title(dialog, title, width); + + wattrset(dialog, dlg.dialog.atr); + print_autowrap(dialog, prompt, width - 2, 1, 3); + + print_buttons(dialog, height, width, 0); + + while (key != KEY_ESC) { + key = wgetch(dialog); + switch (key) { + case 'Y': + case 'y': + delwin(dialog); + return 0; + case 'N': + case 'n': + delwin(dialog); + return 1; + + case TAB: + case KEY_LEFT: + case KEY_RIGHT: + button = ((key == KEY_LEFT ? --button : ++button) < 0) ? 1 : (button > 1 ? 0 : button); + + print_buttons(dialog, height, width, button); + wrefresh(dialog); + break; + case ' ': + case '\n': + delwin(dialog); + return button; + case KEY_ESC: + key = on_key_esc(dialog); + break; + case KEY_RESIZE: + delwin(dialog); + on_key_resize(); + goto do_resize; + } + } + + delwin(dialog); + return key; /* ESC pressed */ +} diff --git a/src/net/scripts/kconfig/mconf-cfg.sh b/src/net/scripts/kconfig/mconf-cfg.sh new file mode 100755 index 0000000..aa68ec9 --- /dev/null +++ b/src/net/scripts/kconfig/mconf-cfg.sh @@ -0,0 +1,50 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 + +PKG="ncursesw" +PKG2="ncurses" + +if [ -n "$(command -v pkg-config)" ]; then + if pkg-config --exists $PKG; then + echo cflags=\"$(pkg-config --cflags $PKG)\" + echo libs=\"$(pkg-config --libs $PKG)\" + exit 0 + fi + + if pkg-config --exists $PKG2; then + echo cflags=\"$(pkg-config --cflags $PKG2)\" + echo libs=\"$(pkg-config --libs $PKG2)\" + exit 0 + fi +fi + +# Check the default paths in case pkg-config is not installed. +# (Even if it is installed, some distributions such as openSUSE cannot +# find ncurses by pkg-config.) +if [ -f /usr/include/ncursesw/ncurses.h ]; then + echo cflags=\"-D_GNU_SOURCE -I/usr/include/ncursesw\" + echo libs=\"-lncursesw\" + exit 0 +fi + +if [ -f /usr/include/ncurses/ncurses.h ]; then + echo cflags=\"-D_GNU_SOURCE -I/usr/include/ncurses\" + echo libs=\"-lncurses\" + exit 0 +fi + +if [ -f /usr/include/ncurses.h ]; then + echo cflags=\"-D_GNU_SOURCE\" + echo libs=\"-lncurses\" + exit 0 +fi + +echo >&2 "*" +echo >&2 "* Unable to find the ncurses package." +echo >&2 "* Install ncurses (ncurses-devel or libncurses-dev" +echo >&2 "* depending on your distribution)." +echo >&2 "*" +echo >&2 "* You may also need to install pkg-config to find the" +echo >&2 "* ncurses installed in a non-default location." +echo >&2 "*" +exit 1 diff --git a/src/net/scripts/kconfig/mconf.c b/src/net/scripts/kconfig/mconf.c new file mode 100644 index 0000000..4063dbc --- /dev/null +++ b/src/net/scripts/kconfig/mconf.c @@ -0,0 +1,1040 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + * + * Introduced single menu mode (show all sub-menus in one large tree). + * 2002-11-06 Petr Baudis <pasky@ucw.cz> + * + * i18n, 2005, Arnaldo Carvalho de Melo <acme@conectiva.com.br> + */ + +#include <ctype.h> +#include <errno.h> +#include <fcntl.h> +#include <limits.h> +#include <stdarg.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> +#include <signal.h> +#include <unistd.h> + +#include "lkc.h" +#include "lxdialog/dialog.h" + +static const char mconf_readme[] = +"Overview\n" +"--------\n" +"This interface lets you select features and parameters for the build.\n" +"Features can either be built-in, modularized, or ignored. Parameters\n" +"must be entered in as decimal or hexadecimal numbers or text.\n" +"\n" +"Menu items beginning with following braces represent features that\n" +" [ ] can be built in or removed\n" +" < > can be built in, modularized or removed\n" +" { } can be built in or modularized (selected by other feature)\n" +" - - are selected by other feature,\n" +"while *, M or whitespace inside braces means to build in, build as\n" +"a module or to exclude the feature respectively.\n" +"\n" +"To change any of these features, highlight it with the cursor\n" +"keys and press <Y> to build it in, <M> to make it a module or\n" +"<N> to remove it. You may also press the <Space Bar> to cycle\n" +"through the available options (i.e. Y->N->M->Y).\n" +"\n" +"Some additional keyboard hints:\n" +"\n" +"Menus\n" +"----------\n" +"o Use the Up/Down arrow keys (cursor keys) to highlight the item you\n" +" wish to change or the submenu you wish to select and press <Enter>.\n" +" Submenus are designated by \"--->\", empty ones by \"----\".\n" +"\n" +" Shortcut: Press the option's highlighted letter (hotkey).\n" +" Pressing a hotkey more than once will sequence\n" +" through all visible items which use that hotkey.\n" +"\n" +" You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll\n" +" unseen options into view.\n" +"\n" +"o To exit a menu use the cursor keys to highlight the <Exit> button\n" +" and press <ENTER>.\n" +"\n" +" Shortcut: Press <ESC><ESC> or <E> or <X> if there is no hotkey\n" +" using those letters. You may press a single <ESC>, but\n" +" there is a delayed response which you may find annoying.\n" +"\n" +" Also, the <TAB> and cursor keys will cycle between <Select>,\n" +" <Exit>, <Help>, <Save>, and <Load>.\n" +"\n" +"o To get help with an item, use the cursor keys to highlight <Help>\n" +" and press <ENTER>.\n" +"\n" +" Shortcut: Press <H> or <?>.\n" +"\n" +"o To toggle the display of hidden options, press <Z>.\n" +"\n" +"\n" +"Radiolists (Choice lists)\n" +"-----------\n" +"o Use the cursor keys to select the option you wish to set and press\n" +" <S> or the <SPACE BAR>.\n" +"\n" +" Shortcut: Press the first letter of the option you wish to set then\n" +" press <S> or <SPACE BAR>.\n" +"\n" +"o To see available help for the item, use the cursor keys to highlight\n" +" <Help> and Press <ENTER>.\n" +"\n" +" Shortcut: Press <H> or <?>.\n" +"\n" +" Also, the <TAB> and cursor keys will cycle between <Select> and\n" +" <Help>\n" +"\n" +"\n" +"Data Entry\n" +"-----------\n" +"o Enter the requested information and press <ENTER>\n" +" If you are entering hexadecimal values, it is not necessary to\n" +" add the '0x' prefix to the entry.\n" +"\n" +"o For help, use the <TAB> or cursor keys to highlight the help option\n" +" and press <ENTER>. You can try <TAB><H> as well.\n" +"\n" +"\n" +"Text Box (Help Window)\n" +"--------\n" +"o Use the cursor keys to scroll up/down/left/right. The VI editor\n" +" keys h,j,k,l function here as do <u>, <d>, <SPACE BAR> and <B> for\n" +" those who are familiar with less and lynx.\n" +"\n" +"o Press <E>, <X>, <q>, <Enter> or <Esc><Esc> to exit.\n" +"\n" +"\n" +"Alternate Configuration Files\n" +"-----------------------------\n" +"Menuconfig supports the use of alternate configuration files for\n" +"those who, for various reasons, find it necessary to switch\n" +"between different configurations.\n" +"\n" +"The <Save> button will let you save the current configuration to\n" +"a file of your choosing. Use the <Load> button to load a previously\n" +"saved alternate configuration.\n" +"\n" +"Even if you don't use alternate configuration files, but you find\n" +"during a Menuconfig session that you have completely messed up your\n" +"settings, you may use the <Load> button to restore your previously\n" +"saved settings from \".config\" without restarting Menuconfig.\n" +"\n" +"Other information\n" +"-----------------\n" +"If you use Menuconfig in an XTERM window, make sure you have your\n" +"$TERM variable set to point to an xterm definition which supports\n" +"color. Otherwise, Menuconfig will look rather bad. Menuconfig will\n" +"not display correctly in an RXVT window because rxvt displays only one\n" +"intensity of color, bright.\n" +"\n" +"Menuconfig will display larger menus on screens or xterms which are\n" +"set to display more than the standard 25 row by 80 column geometry.\n" +"In order for this to work, the \"stty size\" command must be able to\n" +"display the screen's current row and column geometry. I STRONGLY\n" +"RECOMMEND that you make sure you do NOT have the shell variables\n" +"LINES and COLUMNS exported into your environment. Some distributions\n" +"export those variables via /etc/profile. Some ncurses programs can\n" +"become confused when those variables (LINES & COLUMNS) don't reflect\n" +"the true screen size.\n" +"\n" +"Optional personality available\n" +"------------------------------\n" +"If you prefer to have all of the options listed in a single menu,\n" +"rather than the default multimenu hierarchy, run the menuconfig with\n" +"MENUCONFIG_MODE environment variable set to single_menu. Example:\n" +"\n" +"make MENUCONFIG_MODE=single_menu menuconfig\n" +"\n" +"<Enter> will then unroll the appropriate category, or enfold it if it\n" +"is already unrolled.\n" +"\n" +"Note that this mode can eventually be a little more CPU expensive\n" +"(especially with a larger number of unrolled categories) than the\n" +"default mode.\n" +"\n" +"Different color themes available\n" +"--------------------------------\n" +"It is possible to select different color themes using the variable\n" +"MENUCONFIG_COLOR. To select a theme use:\n" +"\n" +"make MENUCONFIG_COLOR=<theme> menuconfig\n" +"\n" +"Available themes are\n" +" mono => selects colors suitable for monochrome displays\n" +" blackbg => selects a color scheme with black background\n" +" classic => theme with blue background. The classic look\n" +" bluetitle => an LCD friendly version of classic. (default)\n" +"\n", +menu_instructions[] = + "Arrow keys navigate the menu. " + "<Enter> selects submenus ---> (or empty submenus ----). " + "Highlighted letters are hotkeys. " + "Pressing <Y> includes, <N> excludes, <M> modularizes features. " + "Press <Esc><Esc> to exit, <?> for Help, </> for Search. " + "Legend: [*] built-in [ ] excluded <M> module < > module capable", +radiolist_instructions[] = + "Use the arrow keys to navigate this window or " + "press the hotkey of the item you wish to select " + "followed by the <SPACE BAR>. " + "Press <?> for additional information about this option.", +inputbox_instructions_int[] = + "Please enter a decimal value. " + "Fractions will not be accepted. " + "Use the <TAB> key to move from the input field to the buttons below it.", +inputbox_instructions_hex[] = + "Please enter a hexadecimal value. " + "Use the <TAB> key to move from the input field to the buttons below it.", +inputbox_instructions_string[] = + "Please enter a string value. " + "Use the <TAB> key to move from the input field to the buttons below it.", +setmod_text[] = + "This feature depends on another which has been configured as a module.\n" + "As a result, this feature will be built as a module.", +load_config_text[] = + "Enter the name of the configuration file you wish to load. " + "Accept the name shown to restore the configuration you " + "last retrieved. Leave blank to abort.", +load_config_help[] = + "\n" + "For various reasons, one may wish to keep several different\n" + "configurations available on a single machine.\n" + "\n" + "If you have saved a previous configuration in a file other than the\n" + "default one, entering its name here will allow you to modify that\n" + "configuration.\n" + "\n" + "If you are uncertain, then you have probably never used alternate\n" + "configuration files. You should therefore leave this blank to abort.\n", +save_config_text[] = + "Enter a filename to which this configuration should be saved " + "as an alternate. Leave blank to abort.", +save_config_help[] = + "\n" + "For various reasons, one may wish to keep different configurations\n" + "available on a single machine.\n" + "\n" + "Entering a file name here will allow you to later retrieve, modify\n" + "and use the current configuration as an alternate to whatever\n" + "configuration options you have selected at that time.\n" + "\n" + "If you are uncertain what all this means then you should probably\n" + "leave this blank.\n", +search_help[] = + "\n" + "Search for symbols and display their relations.\n" + "Regular expressions are allowed.\n" + "Example: search for \"^FOO\"\n" + "Result:\n" + "-----------------------------------------------------------------\n" + "Symbol: FOO [=m]\n" + "Type : tristate\n" + "Prompt: Foo bus is used to drive the bar HW\n" + " Location:\n" + " -> Bus options (PCI, PCMCIA, EISA, ISA)\n" + " -> PCI support (PCI [=y])\n" + "(1) -> PCI access mode (<choice> [=y])\n" + " Defined at drivers/pci/Kconfig:47\n" + " Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n" + " Selects: LIBCRC32\n" + " Selected by: BAR [=n]\n" + "-----------------------------------------------------------------\n" + "o The line 'Type:' shows the type of the configuration option for\n" + " this symbol (bool, tristate, string, ...)\n" + "o The line 'Prompt:' shows the text used in the menu structure for\n" + " this symbol\n" + "o The 'Defined at' line tells at what file / line number the symbol\n" + " is defined\n" + "o The 'Depends on:' line tells what symbols need to be defined for\n" + " this symbol to be visible in the menu (selectable)\n" + "o The 'Location:' lines tells where in the menu structure this symbol\n" + " is located\n" + " A location followed by a [=y] indicates that this is a\n" + " selectable menu item - and the current value is displayed inside\n" + " brackets.\n" + " Press the key in the (#) prefix to jump directly to that\n" + " location. You will be returned to the current search results\n" + " after exiting this new menu.\n" + "o The 'Selects:' line tells what symbols will be automatically\n" + " selected if this symbol is selected (y or m)\n" + "o The 'Selected by' line tells what symbol has selected this symbol\n" + "\n" + "Only relevant lines are shown.\n" + "\n\n" + "Search examples:\n" + "Examples: USB => find all symbols containing USB\n" + " ^USB => find all symbols starting with USB\n" + " USB$ => find all symbols ending with USB\n" + "\n"; + +static int indent; +static struct menu *current_menu; +static int child_count; +static int single_menu_mode; +static int show_all_options; +static int save_and_exit; +static int silent; + +static void conf(struct menu *menu, struct menu *active_menu); +static void conf_choice(struct menu *menu); +static void conf_string(struct menu *menu); +static void conf_load(void); +static void conf_save(void); +static int show_textbox_ext(const char *title, char *text, int r, int c, + int *keys, int *vscroll, int *hscroll, + update_text_fn update_text, void *data); +static void show_textbox(const char *title, const char *text, int r, int c); +static void show_helptext(const char *title, const char *text); +static void show_help(struct menu *menu); + +static char filename[PATH_MAX+1]; +static void set_config_filename(const char *config_filename) +{ + static char menu_backtitle[PATH_MAX+128]; + int size; + + size = snprintf(menu_backtitle, sizeof(menu_backtitle), + "%s - %s", config_filename, rootmenu.prompt->text); + if (size >= sizeof(menu_backtitle)) + menu_backtitle[sizeof(menu_backtitle)-1] = '\0'; + set_dialog_backtitle(menu_backtitle); + + size = snprintf(filename, sizeof(filename), "%s", config_filename); + if (size >= sizeof(filename)) + filename[sizeof(filename)-1] = '\0'; +} + +struct subtitle_part { + struct list_head entries; + const char *text; +}; +static LIST_HEAD(trail); + +static struct subtitle_list *subtitles; +static void set_subtitle(void) +{ + struct subtitle_part *sp; + struct subtitle_list *pos, *tmp; + + for (pos = subtitles; pos != NULL; pos = tmp) { + tmp = pos->next; + free(pos); + } + + subtitles = NULL; + list_for_each_entry(sp, &trail, entries) { + if (sp->text) { + if (pos) { + pos->next = xcalloc(1, sizeof(*pos)); + pos = pos->next; + } else { + subtitles = pos = xcalloc(1, sizeof(*pos)); + } + pos->text = sp->text; + } + } + + set_dialog_subtitles(subtitles); +} + +static void reset_subtitle(void) +{ + struct subtitle_list *pos, *tmp; + + for (pos = subtitles; pos != NULL; pos = tmp) { + tmp = pos->next; + free(pos); + } + subtitles = NULL; + set_dialog_subtitles(subtitles); +} + +struct search_data { + struct list_head *head; + struct menu **targets; + int *keys; +}; + +static void update_text(char *buf, size_t start, size_t end, void *_data) +{ + struct search_data *data = _data; + struct jump_key *pos; + int k = 0; + + list_for_each_entry(pos, data->head, entries) { + if (pos->offset >= start && pos->offset < end) { + char header[4]; + + if (k < JUMP_NB) { + int key = '0' + (pos->index % JUMP_NB) + 1; + + sprintf(header, "(%c)", key); + data->keys[k] = key; + data->targets[k] = pos->target; + k++; + } else { + sprintf(header, " "); + } + + memcpy(buf + pos->offset, header, sizeof(header) - 1); + } + } + data->keys[k] = 0; +} + +static void search_conf(void) +{ + struct symbol **sym_arr; + struct gstr res; + struct gstr title; + char *dialog_input; + int dres, vscroll = 0, hscroll = 0; + bool again; + struct gstr sttext; + struct subtitle_part stpart; + + title = str_new(); + str_printf( &title, "Enter (sub)string or regexp to search for " + "(with or without \"%s\")", CONFIG_); + +again: + dialog_clear(); + dres = dialog_inputbox("Search Configuration Parameter", + str_get(&title), + 10, 75, ""); + switch (dres) { + case 0: + break; + case 1: + show_helptext("Search Configuration", search_help); + goto again; + default: + str_free(&title); + return; + } + + /* strip the prefix if necessary */ + dialog_input = dialog_input_result; + if (strncasecmp(dialog_input_result, CONFIG_, strlen(CONFIG_)) == 0) + dialog_input += strlen(CONFIG_); + + sttext = str_new(); + str_printf(&sttext, "Search (%s)", dialog_input_result); + stpart.text = str_get(&sttext); + list_add_tail(&stpart.entries, &trail); + + sym_arr = sym_re_search(dialog_input); + do { + LIST_HEAD(head); + struct menu *targets[JUMP_NB]; + int keys[JUMP_NB + 1], i; + struct search_data data = { + .head = &head, + .targets = targets, + .keys = keys, + }; + struct jump_key *pos, *tmp; + + res = get_relations_str(sym_arr, &head); + set_subtitle(); + dres = show_textbox_ext("Search Results", (char *) + str_get(&res), 0, 0, keys, &vscroll, + &hscroll, &update_text, (void *) + &data); + again = false; + for (i = 0; i < JUMP_NB && keys[i]; i++) + if (dres == keys[i]) { + conf(targets[i]->parent, targets[i]); + again = true; + } + str_free(&res); + list_for_each_entry_safe(pos, tmp, &head, entries) + free(pos); + } while (again); + free(sym_arr); + str_free(&title); + list_del(trail.prev); + str_free(&sttext); +} + +static void build_conf(struct menu *menu) +{ + struct symbol *sym; + struct property *prop; + struct menu *child; + int type, tmp, doint = 2; + tristate val; + char ch; + bool visible; + + /* + * note: menu_is_visible() has side effect that it will + * recalc the value of the symbol. + */ + visible = menu_is_visible(menu); + if (show_all_options && !menu_has_prompt(menu)) + return; + else if (!show_all_options && !visible) + return; + + sym = menu->sym; + prop = menu->prompt; + if (!sym) { + if (prop && menu != current_menu) { + const char *prompt = menu_get_prompt(menu); + switch (prop->type) { + case P_MENU: + child_count++; + if (single_menu_mode) { + item_make("%s%*c%s", + menu->data ? "-->" : "++>", + indent + 1, ' ', prompt); + } else + item_make(" %*c%s %s", + indent + 1, ' ', prompt, + menu_is_empty(menu) ? "----" : "--->"); + item_set_tag('m'); + item_set_data(menu); + if (single_menu_mode && menu->data) + goto conf_childs; + return; + case P_COMMENT: + if (prompt) { + child_count++; + item_make(" %*c*** %s ***", indent + 1, ' ', prompt); + item_set_tag(':'); + item_set_data(menu); + } + break; + default: + if (prompt) { + child_count++; + item_make("---%*c%s", indent + 1, ' ', prompt); + item_set_tag(':'); + item_set_data(menu); + } + } + } else + doint = 0; + goto conf_childs; + } + + type = sym_get_type(sym); + if (sym_is_choice(sym)) { + struct symbol *def_sym = sym_get_choice_value(sym); + struct menu *def_menu = NULL; + + child_count++; + for (child = menu->list; child; child = child->next) { + if (menu_is_visible(child) && child->sym == def_sym) + def_menu = child; + } + + val = sym_get_tristate_value(sym); + if (sym_is_changeable(sym)) { + switch (type) { + case S_BOOLEAN: + item_make("[%c]", val == no ? ' ' : '*'); + break; + case S_TRISTATE: + switch (val) { + case yes: ch = '*'; break; + case mod: ch = 'M'; break; + default: ch = ' '; break; + } + item_make("<%c>", ch); + break; + } + item_set_tag('t'); + item_set_data(menu); + } else { + item_make(" "); + item_set_tag(def_menu ? 't' : ':'); + item_set_data(menu); + } + + item_add_str("%*c%s", indent + 1, ' ', menu_get_prompt(menu)); + if (val == yes) { + if (def_menu) { + item_add_str(" (%s)", menu_get_prompt(def_menu)); + item_add_str(" --->"); + if (def_menu->list) { + indent += 2; + build_conf(def_menu); + indent -= 2; + } + } + return; + } + } else { + if (menu == current_menu) { + item_make("---%*c%s", indent + 1, ' ', menu_get_prompt(menu)); + item_set_tag(':'); + item_set_data(menu); + goto conf_childs; + } + child_count++; + val = sym_get_tristate_value(sym); + if (sym_is_choice_value(sym) && val == yes) { + item_make(" "); + item_set_tag(':'); + item_set_data(menu); + } else { + switch (type) { + case S_BOOLEAN: + if (sym_is_changeable(sym)) + item_make("[%c]", val == no ? ' ' : '*'); + else + item_make("-%c-", val == no ? ' ' : '*'); + item_set_tag('t'); + item_set_data(menu); + break; + case S_TRISTATE: + switch (val) { + case yes: ch = '*'; break; + case mod: ch = 'M'; break; + default: ch = ' '; break; + } + if (sym_is_changeable(sym)) { + if (sym->rev_dep.tri == mod) + item_make("{%c}", ch); + else + item_make("<%c>", ch); + } else + item_make("-%c-", ch); + item_set_tag('t'); + item_set_data(menu); + break; + default: + tmp = 2 + strlen(sym_get_string_value(sym)); /* () = 2 */ + item_make("(%s)", sym_get_string_value(sym)); + tmp = indent - tmp + 4; + if (tmp < 0) + tmp = 0; + item_add_str("%*c%s%s", tmp, ' ', menu_get_prompt(menu), + (sym_has_value(sym) || !sym_is_changeable(sym)) ? + "" : " (NEW)"); + item_set_tag('s'); + item_set_data(menu); + goto conf_childs; + } + } + item_add_str("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu), + (sym_has_value(sym) || !sym_is_changeable(sym)) ? + "" : " (NEW)"); + if (menu->prompt->type == P_MENU) { + item_add_str(" %s", menu_is_empty(menu) ? "----" : "--->"); + return; + } + } + +conf_childs: + indent += doint; + for (child = menu->list; child; child = child->next) + build_conf(child); + indent -= doint; +} + +static void conf(struct menu *menu, struct menu *active_menu) +{ + struct menu *submenu; + const char *prompt = menu_get_prompt(menu); + struct subtitle_part stpart; + struct symbol *sym; + int res; + int s_scroll = 0; + + if (menu != &rootmenu) + stpart.text = menu_get_prompt(menu); + else + stpart.text = NULL; + list_add_tail(&stpart.entries, &trail); + + while (1) { + item_reset(); + current_menu = menu; + build_conf(menu); + if (!child_count) + break; + set_subtitle(); + dialog_clear(); + res = dialog_menu(prompt ? prompt : "Main Menu", + menu_instructions, + active_menu, &s_scroll); + if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL) + break; + if (item_count() != 0) { + if (!item_activate_selected()) + continue; + if (!item_tag()) + continue; + } + submenu = item_data(); + active_menu = item_data(); + if (submenu) + sym = submenu->sym; + else + sym = NULL; + + switch (res) { + case 0: + switch (item_tag()) { + case 'm': + if (single_menu_mode) + submenu->data = (void *) (long) !submenu->data; + else + conf(submenu, NULL); + break; + case 't': + if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes) + conf_choice(submenu); + else if (submenu->prompt->type == P_MENU) + conf(submenu, NULL); + break; + case 's': + conf_string(submenu); + break; + } + break; + case 2: + if (sym) + show_help(submenu); + else { + reset_subtitle(); + show_helptext("README", mconf_readme); + } + break; + case 3: + reset_subtitle(); + conf_save(); + break; + case 4: + reset_subtitle(); + conf_load(); + break; + case 5: + if (item_is_tag('t')) { + if (sym_set_tristate_value(sym, yes)) + break; + if (sym_set_tristate_value(sym, mod)) + show_textbox(NULL, setmod_text, 6, 74); + } + break; + case 6: + if (item_is_tag('t')) + sym_set_tristate_value(sym, no); + break; + case 7: + if (item_is_tag('t')) + sym_set_tristate_value(sym, mod); + break; + case 8: + if (item_is_tag('t')) + sym_toggle_tristate_value(sym); + else if (item_is_tag('m')) + conf(submenu, NULL); + break; + case 9: + search_conf(); + break; + case 10: + show_all_options = !show_all_options; + break; + } + } + + list_del(trail.prev); +} + +static int show_textbox_ext(const char *title, char *text, int r, int c, int + *keys, int *vscroll, int *hscroll, update_text_fn + update_text, void *data) +{ + dialog_clear(); + return dialog_textbox(title, text, r, c, keys, vscroll, hscroll, + update_text, data); +} + +static void show_textbox(const char *title, const char *text, int r, int c) +{ + show_textbox_ext(title, (char *) text, r, c, (int []) {0}, NULL, NULL, + NULL, NULL); +} + +static void show_helptext(const char *title, const char *text) +{ + show_textbox(title, text, 0, 0); +} + +static void conf_message_callback(const char *s) +{ + if (save_and_exit) { + if (!silent) + printf("%s", s); + } else { + show_textbox(NULL, s, 6, 60); + } +} + +static void show_help(struct menu *menu) +{ + struct gstr help = str_new(); + + help.max_width = getmaxx(stdscr) - 10; + menu_get_ext_help(menu, &help); + + show_helptext(menu_get_prompt(menu), str_get(&help)); + str_free(&help); +} + +static void conf_choice(struct menu *menu) +{ + const char *prompt = menu_get_prompt(menu); + struct menu *child; + struct symbol *active; + + active = sym_get_choice_value(menu->sym); + while (1) { + int res; + int selected; + item_reset(); + + current_menu = menu; + for (child = menu->list; child; child = child->next) { + if (!menu_is_visible(child)) + continue; + if (child->sym) + item_make("%s", menu_get_prompt(child)); + else { + item_make("*** %s ***", menu_get_prompt(child)); + item_set_tag(':'); + } + item_set_data(child); + if (child->sym == active) + item_set_selected(1); + if (child->sym == sym_get_choice_value(menu->sym)) + item_set_tag('X'); + } + dialog_clear(); + res = dialog_checklist(prompt ? prompt : "Main Menu", + radiolist_instructions, + MENUBOX_HEIGTH_MIN, + MENUBOX_WIDTH_MIN, + CHECKLIST_HEIGTH_MIN); + selected = item_activate_selected(); + switch (res) { + case 0: + if (selected) { + child = item_data(); + if (!child->sym) + break; + + sym_set_tristate_value(child->sym, yes); + } + return; + case 1: + if (selected) { + child = item_data(); + show_help(child); + active = child->sym; + } else + show_help(menu); + break; + case KEY_ESC: + return; + case -ERRDISPLAYTOOSMALL: + return; + } + } +} + +static void conf_string(struct menu *menu) +{ + const char *prompt = menu_get_prompt(menu); + + while (1) { + int res; + const char *heading; + + switch (sym_get_type(menu->sym)) { + case S_INT: + heading = inputbox_instructions_int; + break; + case S_HEX: + heading = inputbox_instructions_hex; + break; + case S_STRING: + heading = inputbox_instructions_string; + break; + default: + heading = "Internal mconf error!"; + } + dialog_clear(); + res = dialog_inputbox(prompt ? prompt : "Main Menu", + heading, 10, 75, + sym_get_string_value(menu->sym)); + switch (res) { + case 0: + if (sym_set_string_value(menu->sym, dialog_input_result)) + return; + show_textbox(NULL, "You have made an invalid entry.", 5, 43); + break; + case 1: + show_help(menu); + break; + case KEY_ESC: + return; + } + } +} + +static void conf_load(void) +{ + + while (1) { + int res; + dialog_clear(); + res = dialog_inputbox(NULL, load_config_text, + 11, 55, filename); + switch(res) { + case 0: + if (!dialog_input_result[0]) + return; + if (!conf_read(dialog_input_result)) { + set_config_filename(dialog_input_result); + sym_set_change_count(1); + return; + } + show_textbox(NULL, "File does not exist!", 5, 38); + break; + case 1: + show_helptext("Load Alternate Configuration", load_config_help); + break; + case KEY_ESC: + return; + } + } +} + +static void conf_save(void) +{ + while (1) { + int res; + dialog_clear(); + res = dialog_inputbox(NULL, save_config_text, + 11, 55, filename); + switch(res) { + case 0: + if (!dialog_input_result[0]) + return; + if (!conf_write(dialog_input_result)) { + set_config_filename(dialog_input_result); + return; + } + show_textbox(NULL, "Can't create file!", 5, 60); + break; + case 1: + show_helptext("Save Alternate Configuration", save_config_help); + break; + case KEY_ESC: + return; + } + } +} + +static int handle_exit(void) +{ + int res; + + save_and_exit = 1; + reset_subtitle(); + dialog_clear(); + if (conf_get_changed()) + res = dialog_yesno(NULL, + "Do you wish to save your new configuration?\n" + "(Press <ESC><ESC> to continue kernel configuration.)", + 6, 60); + else + res = -1; + + end_dialog(saved_x, saved_y); + + switch (res) { + case 0: + if (conf_write(filename)) { + fprintf(stderr, "\n\n" + "Error while writing of the configuration.\n" + "Your configuration changes were NOT saved." + "\n\n"); + return 1; + } + conf_write_autoconf(0); + /* fall through */ + case -1: + if (!silent) + printf("\n\n" + "*** End of the configuration.\n" + "*** Execute 'make' to start the build or try 'make help'." + "\n\n"); + res = 0; + break; + default: + if (!silent) + fprintf(stderr, "\n\n" + "Your configuration changes were NOT saved." + "\n\n"); + if (res != KEY_ESC) + res = 0; + } + + return res; +} + +static void sig_handler(int signo) +{ + exit(handle_exit()); +} + +int main(int ac, char **av) +{ + char *mode; + int res; + + signal(SIGINT, sig_handler); + + if (ac > 1 && strcmp(av[1], "-s") == 0) { + silent = 1; + /* Silence conf_read() until the real callback is set up */ + conf_set_message_callback(NULL); + av++; + } + conf_parse(av[1]); + conf_read(NULL); + + mode = getenv("MENUCONFIG_MODE"); + if (mode) { + if (!strcasecmp(mode, "single_menu")) + single_menu_mode = 1; + } + + if (init_dialog(NULL)) { + fprintf(stderr, "Your display is too small to run Menuconfig!\n"); + fprintf(stderr, "It must be at least 19 lines by 80 columns.\n"); + return 1; + } + + set_config_filename(conf_get_configname()); + conf_set_message_callback(conf_message_callback); + do { + conf(&rootmenu, NULL); + res = handle_exit(); + } while (res == KEY_ESC); + + return res; +} diff --git a/src/net/scripts/kconfig/menu.c b/src/net/scripts/kconfig/menu.c new file mode 100644 index 0000000..a5fbd6c --- /dev/null +++ b/src/net/scripts/kconfig/menu.c @@ -0,0 +1,899 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + */ + +#include <ctype.h> +#include <stdarg.h> +#include <stdlib.h> +#include <string.h> + +#include "lkc.h" + +static const char nohelp_text[] = "There is no help available for this option."; + +struct menu rootmenu; +static struct menu **last_entry_ptr; + +struct file *file_list; +struct file *current_file; + +void menu_warn(struct menu *menu, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + fprintf(stderr, "%s:%d:warning: ", menu->file->name, menu->lineno); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); +} + +static void prop_warn(struct property *prop, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + fprintf(stderr, "%s:%d:warning: ", prop->file->name, prop->lineno); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); +} + +void _menu_init(void) +{ + current_entry = current_menu = &rootmenu; + last_entry_ptr = &rootmenu.list; +} + +void menu_add_entry(struct symbol *sym) +{ + struct menu *menu; + + menu = xmalloc(sizeof(*menu)); + memset(menu, 0, sizeof(*menu)); + menu->sym = sym; + menu->parent = current_menu; + menu->file = current_file; + menu->lineno = zconf_lineno(); + + *last_entry_ptr = menu; + last_entry_ptr = &menu->next; + current_entry = menu; + if (sym) + menu_add_symbol(P_SYMBOL, sym, NULL); +} + +struct menu *menu_add_menu(void) +{ + last_entry_ptr = ¤t_entry->list; + current_menu = current_entry; + return current_menu; +} + +void menu_end_menu(void) +{ + last_entry_ptr = ¤t_menu->next; + current_menu = current_menu->parent; +} + +/* + * Rewrites 'm' to 'm' && MODULES, so that it evaluates to 'n' when running + * without modules + */ +static struct expr *rewrite_m(struct expr *e) +{ + if (!e) + return e; + + switch (e->type) { + case E_NOT: + e->left.expr = rewrite_m(e->left.expr); + break; + case E_OR: + case E_AND: + e->left.expr = rewrite_m(e->left.expr); + e->right.expr = rewrite_m(e->right.expr); + break; + case E_SYMBOL: + /* change 'm' into 'm' && MODULES */ + if (e->left.sym == &symbol_mod) + return expr_alloc_and(e, expr_alloc_symbol(modules_sym)); + break; + default: + break; + } + return e; +} + +void menu_add_dep(struct expr *dep) +{ + current_entry->dep = expr_alloc_and(current_entry->dep, dep); +} + +void menu_set_type(int type) +{ + struct symbol *sym = current_entry->sym; + + if (sym->type == type) + return; + if (sym->type == S_UNKNOWN) { + sym->type = type; + return; + } + menu_warn(current_entry, + "ignoring type redefinition of '%s' from '%s' to '%s'", + sym->name ? sym->name : "<choice>", + sym_type_name(sym->type), sym_type_name(type)); +} + +static struct property *menu_add_prop(enum prop_type type, struct expr *expr, + struct expr *dep) +{ + struct property *prop; + + prop = xmalloc(sizeof(*prop)); + memset(prop, 0, sizeof(*prop)); + prop->type = type; + prop->file = current_file; + prop->lineno = zconf_lineno(); + prop->menu = current_entry; + prop->expr = expr; + prop->visible.expr = dep; + + /* append property to the prop list of symbol */ + if (current_entry->sym) { + struct property **propp; + + for (propp = ¤t_entry->sym->prop; + *propp; + propp = &(*propp)->next) + ; + *propp = prop; + } + + return prop; +} + +struct property *menu_add_prompt(enum prop_type type, char *prompt, + struct expr *dep) +{ + struct property *prop = menu_add_prop(type, NULL, dep); + + if (isspace(*prompt)) { + prop_warn(prop, "leading whitespace ignored"); + while (isspace(*prompt)) + prompt++; + } + if (current_entry->prompt) + prop_warn(prop, "prompt redefined"); + + /* Apply all upper menus' visibilities to actual prompts. */ + if (type == P_PROMPT) { + struct menu *menu = current_entry; + + while ((menu = menu->parent) != NULL) { + struct expr *dup_expr; + + if (!menu->visibility) + continue; + /* + * Do not add a reference to the menu's visibility + * expression but use a copy of it. Otherwise the + * expression reduction functions will modify + * expressions that have multiple references which + * can cause unwanted side effects. + */ + dup_expr = expr_copy(menu->visibility); + + prop->visible.expr = expr_alloc_and(prop->visible.expr, + dup_expr); + } + } + + current_entry->prompt = prop; + prop->text = prompt; + + return prop; +} + +void menu_add_visibility(struct expr *expr) +{ + current_entry->visibility = expr_alloc_and(current_entry->visibility, + expr); +} + +void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep) +{ + menu_add_prop(type, expr, dep); +} + +void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep) +{ + menu_add_prop(type, expr_alloc_symbol(sym), dep); +} + +void menu_add_option_modules(void) +{ + if (modules_sym) + zconf_error("symbol '%s' redefines option 'modules' already defined by symbol '%s'", + current_entry->sym->name, modules_sym->name); + modules_sym = current_entry->sym; +} + +void menu_add_option_defconfig_list(void) +{ + if (!sym_defconfig_list) + sym_defconfig_list = current_entry->sym; + else if (sym_defconfig_list != current_entry->sym) + zconf_error("trying to redefine defconfig symbol"); + sym_defconfig_list->flags |= SYMBOL_NO_WRITE; +} + +void menu_add_option_allnoconfig_y(void) +{ + current_entry->sym->flags |= SYMBOL_ALLNOCONFIG_Y; +} + +static int menu_validate_number(struct symbol *sym, struct symbol *sym2) +{ + return sym2->type == S_INT || sym2->type == S_HEX || + (sym2->type == S_UNKNOWN && sym_string_valid(sym, sym2->name)); +} + +static void sym_check_prop(struct symbol *sym) +{ + struct property *prop; + struct symbol *sym2; + char *use; + + for (prop = sym->prop; prop; prop = prop->next) { + switch (prop->type) { + case P_DEFAULT: + if ((sym->type == S_STRING || sym->type == S_INT || sym->type == S_HEX) && + prop->expr->type != E_SYMBOL) + prop_warn(prop, + "default for config symbol '%s'" + " must be a single symbol", sym->name); + if (prop->expr->type != E_SYMBOL) + break; + sym2 = prop_get_symbol(prop); + if (sym->type == S_HEX || sym->type == S_INT) { + if (!menu_validate_number(sym, sym2)) + prop_warn(prop, + "'%s': number is invalid", + sym->name); + } + if (sym_is_choice(sym)) { + struct property *choice_prop = + sym_get_choice_prop(sym2); + + if (!choice_prop || + prop_get_symbol(choice_prop) != sym) + prop_warn(prop, + "choice default symbol '%s' is not contained in the choice", + sym2->name); + } + break; + case P_SELECT: + case P_IMPLY: + use = prop->type == P_SELECT ? "select" : "imply"; + sym2 = prop_get_symbol(prop); + if (sym->type != S_BOOLEAN && sym->type != S_TRISTATE) + prop_warn(prop, + "config symbol '%s' uses %s, but is " + "not bool or tristate", sym->name, use); + else if (sym2->type != S_UNKNOWN && + sym2->type != S_BOOLEAN && + sym2->type != S_TRISTATE) + prop_warn(prop, + "'%s' has wrong type. '%s' only " + "accept arguments of bool and " + "tristate type", sym2->name, use); + break; + case P_RANGE: + if (sym->type != S_INT && sym->type != S_HEX) + prop_warn(prop, "range is only allowed " + "for int or hex symbols"); + if (!menu_validate_number(sym, prop->expr->left.sym) || + !menu_validate_number(sym, prop->expr->right.sym)) + prop_warn(prop, "range is invalid"); + break; + default: + ; + } + } +} + +void menu_finalize(struct menu *parent) +{ + struct menu *menu, *last_menu; + struct symbol *sym; + struct property *prop; + struct expr *parentdep, *basedep, *dep, *dep2, **ep; + + sym = parent->sym; + if (parent->list) { + /* + * This menu node has children. We (recursively) process them + * and propagate parent dependencies before moving on. + */ + + if (sym && sym_is_choice(sym)) { + if (sym->type == S_UNKNOWN) { + /* find the first choice value to find out choice type */ + current_entry = parent; + for (menu = parent->list; menu; menu = menu->next) { + if (menu->sym && menu->sym->type != S_UNKNOWN) { + menu_set_type(menu->sym->type); + break; + } + } + } + /* set the type of the remaining choice values */ + for (menu = parent->list; menu; menu = menu->next) { + current_entry = menu; + if (menu->sym && menu->sym->type == S_UNKNOWN) + menu_set_type(sym->type); + } + + /* + * Use the choice itself as the parent dependency of + * the contained items. This turns the mode of the + * choice into an upper bound on the visibility of the + * choice value symbols. + */ + parentdep = expr_alloc_symbol(sym); + } else { + /* Menu node for 'menu', 'if' */ + parentdep = parent->dep; + } + + /* For each child menu node... */ + for (menu = parent->list; menu; menu = menu->next) { + /* + * Propagate parent dependencies to the child menu + * node, also rewriting and simplifying expressions + */ + basedep = rewrite_m(menu->dep); + basedep = expr_transform(basedep); + basedep = expr_alloc_and(expr_copy(parentdep), basedep); + basedep = expr_eliminate_dups(basedep); + menu->dep = basedep; + + if (menu->sym) + /* + * Note: For symbols, all prompts are included + * too in the symbol's own property list + */ + prop = menu->sym->prop; + else + /* + * For non-symbol menu nodes, we just need to + * handle the prompt + */ + prop = menu->prompt; + + /* For each property... */ + for (; prop; prop = prop->next) { + if (prop->menu != menu) + /* + * Two possibilities: + * + * 1. The property lacks dependencies + * and so isn't location-specific, + * e.g. an 'option' + * + * 2. The property belongs to a symbol + * defined in multiple locations and + * is from some other location. It + * will be handled there in that + * case. + * + * Skip the property. + */ + continue; + + /* + * Propagate parent dependencies to the + * property's condition, rewriting and + * simplifying expressions at the same time + */ + dep = rewrite_m(prop->visible.expr); + dep = expr_transform(dep); + dep = expr_alloc_and(expr_copy(basedep), dep); + dep = expr_eliminate_dups(dep); + if (menu->sym && menu->sym->type != S_TRISTATE) + dep = expr_trans_bool(dep); + prop->visible.expr = dep; + + /* + * Handle selects and implies, which modify the + * dependencies of the selected/implied symbol + */ + if (prop->type == P_SELECT) { + struct symbol *es = prop_get_symbol(prop); + es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr, + expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep))); + } else if (prop->type == P_IMPLY) { + struct symbol *es = prop_get_symbol(prop); + es->implied.expr = expr_alloc_or(es->implied.expr, + expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep))); + } + } + } + + if (sym && sym_is_choice(sym)) + expr_free(parentdep); + + /* + * Recursively process children in the same fashion before + * moving on + */ + for (menu = parent->list; menu; menu = menu->next) + menu_finalize(menu); + } else if (sym) { + /* + * Automatic submenu creation. If sym is a symbol and A, B, C, + * ... are consecutive items (symbols, menus, ifs, etc.) that + * all depend on sym, then the following menu structure is + * created: + * + * sym + * +-A + * +-B + * +-C + * ... + * + * This also works recursively, giving the following structure + * if A is a symbol and B depends on A: + * + * sym + * +-A + * | +-B + * +-C + * ... + */ + + basedep = parent->prompt ? parent->prompt->visible.expr : NULL; + basedep = expr_trans_compare(basedep, E_UNEQUAL, &symbol_no); + basedep = expr_eliminate_dups(expr_transform(basedep)); + + /* Examine consecutive elements after sym */ + last_menu = NULL; + for (menu = parent->next; menu; menu = menu->next) { + dep = menu->prompt ? menu->prompt->visible.expr : menu->dep; + if (!expr_contains_symbol(dep, sym)) + /* No dependency, quit */ + break; + if (expr_depends_symbol(dep, sym)) + /* Absolute dependency, put in submenu */ + goto next; + + /* + * Also consider it a dependency on sym if our + * dependencies contain sym and are a "superset" of + * sym's dependencies, e.g. '(sym || Q) && R' when sym + * depends on R. + * + * Note that 'R' might be from an enclosing menu or if, + * making this a more common case than it might seem. + */ + dep = expr_trans_compare(dep, E_UNEQUAL, &symbol_no); + dep = expr_eliminate_dups(expr_transform(dep)); + dep2 = expr_copy(basedep); + expr_eliminate_eq(&dep, &dep2); + expr_free(dep); + if (!expr_is_yes(dep2)) { + /* Not superset, quit */ + expr_free(dep2); + break; + } + /* Superset, put in submenu */ + expr_free(dep2); + next: + menu_finalize(menu); + menu->parent = parent; + last_menu = menu; + } + expr_free(basedep); + if (last_menu) { + parent->list = parent->next; + parent->next = last_menu->next; + last_menu->next = NULL; + } + + sym->dir_dep.expr = expr_alloc_or(sym->dir_dep.expr, parent->dep); + } + for (menu = parent->list; menu; menu = menu->next) { + if (sym && sym_is_choice(sym) && + menu->sym && !sym_is_choice_value(menu->sym)) { + current_entry = menu; + menu->sym->flags |= SYMBOL_CHOICEVAL; + if (!menu->prompt) + menu_warn(menu, "choice value must have a prompt"); + for (prop = menu->sym->prop; prop; prop = prop->next) { + if (prop->type == P_DEFAULT) + prop_warn(prop, "defaults for choice " + "values not supported"); + if (prop->menu == menu) + continue; + if (prop->type == P_PROMPT && + prop->menu->parent->sym != sym) + prop_warn(prop, "choice value used outside its choice group"); + } + /* Non-tristate choice values of tristate choices must + * depend on the choice being set to Y. The choice + * values' dependencies were propagated to their + * properties above, so the change here must be re- + * propagated. + */ + if (sym->type == S_TRISTATE && menu->sym->type != S_TRISTATE) { + basedep = expr_alloc_comp(E_EQUAL, sym, &symbol_yes); + menu->dep = expr_alloc_and(basedep, menu->dep); + for (prop = menu->sym->prop; prop; prop = prop->next) { + if (prop->menu != menu) + continue; + prop->visible.expr = expr_alloc_and(expr_copy(basedep), + prop->visible.expr); + } + } + menu_add_symbol(P_CHOICE, sym, NULL); + prop = sym_get_choice_prop(sym); + for (ep = &prop->expr; *ep; ep = &(*ep)->left.expr) + ; + *ep = expr_alloc_one(E_LIST, NULL); + (*ep)->right.sym = menu->sym; + } + + /* + * This code serves two purposes: + * + * (1) Flattening 'if' blocks, which do not specify a submenu + * and only add dependencies. + * + * (Automatic submenu creation might still create a submenu + * from an 'if' before this code runs.) + * + * (2) "Undoing" any automatic submenus created earlier below + * promptless symbols. + * + * Before: + * + * A + * if ... (or promptless symbol) + * +-B + * +-C + * D + * + * After: + * + * A + * if ... (or promptless symbol) + * B + * C + * D + */ + if (menu->list && (!menu->prompt || !menu->prompt->text)) { + for (last_menu = menu->list; ; last_menu = last_menu->next) { + last_menu->parent = parent; + if (!last_menu->next) + break; + } + last_menu->next = menu->next; + menu->next = menu->list; + menu->list = NULL; + } + } + + if (sym && !(sym->flags & SYMBOL_WARNED)) { + if (sym->type == S_UNKNOWN) + menu_warn(parent, "config symbol defined without type"); + + if (sym_is_choice(sym) && !parent->prompt) + menu_warn(parent, "choice must have a prompt"); + + /* Check properties connected to this symbol */ + sym_check_prop(sym); + sym->flags |= SYMBOL_WARNED; + } + + /* + * For non-optional choices, add a reverse dependency (corresponding to + * a select) of '<visibility> && m'. This prevents the user from + * setting the choice mode to 'n' when the choice is visible. + * + * This would also work for non-choice symbols, but only non-optional + * choices clear SYMBOL_OPTIONAL as of writing. Choices are implemented + * as a type of symbol. + */ + if (sym && !sym_is_optional(sym) && parent->prompt) { + sym->rev_dep.expr = expr_alloc_or(sym->rev_dep.expr, + expr_alloc_and(parent->prompt->visible.expr, + expr_alloc_symbol(&symbol_mod))); + } +} + +bool menu_has_prompt(struct menu *menu) +{ + if (!menu->prompt) + return false; + return true; +} + +/* + * Determine if a menu is empty. + * A menu is considered empty if it contains no or only + * invisible entries. + */ +bool menu_is_empty(struct menu *menu) +{ + struct menu *child; + + for (child = menu->list; child; child = child->next) { + if (menu_is_visible(child)) + return(false); + } + return(true); +} + +bool menu_is_visible(struct menu *menu) +{ + struct menu *child; + struct symbol *sym; + tristate visible; + + if (!menu->prompt) + return false; + + if (menu->visibility) { + if (expr_calc_value(menu->visibility) == no) + return false; + } + + sym = menu->sym; + if (sym) { + sym_calc_value(sym); + visible = menu->prompt->visible.tri; + } else + visible = menu->prompt->visible.tri = expr_calc_value(menu->prompt->visible.expr); + + if (visible != no) + return true; + + if (!sym || sym_get_tristate_value(menu->sym) == no) + return false; + + for (child = menu->list; child; child = child->next) { + if (menu_is_visible(child)) { + if (sym) + sym->flags |= SYMBOL_DEF_USER; + return true; + } + } + + return false; +} + +const char *menu_get_prompt(struct menu *menu) +{ + if (menu->prompt) + return menu->prompt->text; + else if (menu->sym) + return menu->sym->name; + return NULL; +} + +struct menu *menu_get_root_menu(struct menu *menu) +{ + return &rootmenu; +} + +struct menu *menu_get_parent_menu(struct menu *menu) +{ + enum prop_type type; + + for (; menu != &rootmenu; menu = menu->parent) { + type = menu->prompt ? menu->prompt->type : 0; + if (type == P_MENU) + break; + } + return menu; +} + +bool menu_has_help(struct menu *menu) +{ + return menu->help != NULL; +} + +const char *menu_get_help(struct menu *menu) +{ + if (menu->help) + return menu->help; + else + return ""; +} + +static void get_def_str(struct gstr *r, struct menu *menu) +{ + str_printf(r, "Defined at %s:%d\n", + menu->file->name, menu->lineno); +} + +static void get_dep_str(struct gstr *r, struct expr *expr, const char *prefix) +{ + if (!expr_is_yes(expr)) { + str_append(r, prefix); + expr_gstr_print(expr, r); + str_append(r, "\n"); + } +} + +static void get_prompt_str(struct gstr *r, struct property *prop, + struct list_head *head) +{ + int i, j; + struct menu *submenu[8], *menu, *location = NULL; + struct jump_key *jump = NULL; + + str_printf(r, " Prompt: %s\n", prop->text); + + get_dep_str(r, prop->menu->dep, " Depends on: "); + /* + * Most prompts in Linux have visibility that exactly matches their + * dependencies. For these, we print only the dependencies to improve + * readability. However, prompts with inline "if" expressions and + * prompts with a parent that has a "visible if" expression have + * differing dependencies and visibility. In these rare cases, we + * print both. + */ + if (!expr_eq(prop->menu->dep, prop->visible.expr)) + get_dep_str(r, prop->visible.expr, " Visible if: "); + + menu = prop->menu->parent; + for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent) { + bool accessible = menu_is_visible(menu); + + submenu[i++] = menu; + if (location == NULL && accessible) + location = menu; + } + if (head && location) { + jump = xmalloc(sizeof(struct jump_key)); + + if (menu_is_visible(prop->menu)) { + /* + * There is not enough room to put the hint at the + * beginning of the "Prompt" line. Put the hint on the + * last "Location" line even when it would belong on + * the former. + */ + jump->target = prop->menu; + } else + jump->target = location; + + if (list_empty(head)) + jump->index = 0; + else + jump->index = list_entry(head->prev, struct jump_key, + entries)->index + 1; + + list_add_tail(&jump->entries, head); + } + + if (i > 0) { + str_printf(r, " Location:\n"); + for (j = 4; --i >= 0; j += 2) { + menu = submenu[i]; + if (jump && menu == location) + jump->offset = strlen(r->s); + str_printf(r, "%*c-> %s", j, ' ', + menu_get_prompt(menu)); + if (menu->sym) { + str_printf(r, " (%s [=%s])", menu->sym->name ? + menu->sym->name : "<choice>", + sym_get_string_value(menu->sym)); + } + str_append(r, "\n"); + } + } +} + +static void get_symbol_props_str(struct gstr *r, struct symbol *sym, + enum prop_type tok, const char *prefix) +{ + bool hit = false; + struct property *prop; + + for_all_properties(sym, prop, tok) { + if (!hit) { + str_append(r, prefix); + hit = true; + } else + str_printf(r, " && "); + expr_gstr_print(prop->expr, r); + } + if (hit) + str_append(r, "\n"); +} + +/* + * head is optional and may be NULL + */ +static void get_symbol_str(struct gstr *r, struct symbol *sym, + struct list_head *head) +{ + struct property *prop; + + if (sym && sym->name) { + str_printf(r, "Symbol: %s [=%s]\n", sym->name, + sym_get_string_value(sym)); + str_printf(r, "Type : %s\n", sym_type_name(sym->type)); + if (sym->type == S_INT || sym->type == S_HEX) { + prop = sym_get_range_prop(sym); + if (prop) { + str_printf(r, "Range : "); + expr_gstr_print(prop->expr, r); + str_append(r, "\n"); + } + } + } + + /* Print the definitions with prompts before the ones without */ + for_all_properties(sym, prop, P_SYMBOL) { + if (prop->menu->prompt) { + get_def_str(r, prop->menu); + get_prompt_str(r, prop->menu->prompt, head); + } + } + + for_all_properties(sym, prop, P_SYMBOL) { + if (!prop->menu->prompt) { + get_def_str(r, prop->menu); + get_dep_str(r, prop->menu->dep, " Depends on: "); + } + } + + get_symbol_props_str(r, sym, P_SELECT, "Selects: "); + if (sym->rev_dep.expr) { + expr_gstr_print_revdep(sym->rev_dep.expr, r, yes, "Selected by [y]:\n"); + expr_gstr_print_revdep(sym->rev_dep.expr, r, mod, "Selected by [m]:\n"); + expr_gstr_print_revdep(sym->rev_dep.expr, r, no, "Selected by [n]:\n"); + } + + get_symbol_props_str(r, sym, P_IMPLY, "Implies: "); + if (sym->implied.expr) { + expr_gstr_print_revdep(sym->implied.expr, r, yes, "Implied by [y]:\n"); + expr_gstr_print_revdep(sym->implied.expr, r, mod, "Implied by [m]:\n"); + expr_gstr_print_revdep(sym->implied.expr, r, no, "Implied by [n]:\n"); + } + + str_append(r, "\n\n"); +} + +struct gstr get_relations_str(struct symbol **sym_arr, struct list_head *head) +{ + struct symbol *sym; + struct gstr res = str_new(); + int i; + + for (i = 0; sym_arr && (sym = sym_arr[i]); i++) + get_symbol_str(&res, sym, head); + if (!i) + str_append(&res, "No matches found.\n"); + return res; +} + + +void menu_get_ext_help(struct menu *menu, struct gstr *help) +{ + struct symbol *sym = menu->sym; + const char *help_text = nohelp_text; + + if (menu_has_help(menu)) { + if (sym->name) + str_printf(help, "%s%s:\n\n", CONFIG_, sym->name); + help_text = menu_get_help(menu); + } + str_printf(help, "%s\n", help_text); + if (sym) + get_symbol_str(help, sym, NULL); +} diff --git a/src/net/scripts/kconfig/merge_config.sh b/src/net/scripts/kconfig/merge_config.sh new file mode 100755 index 0000000..63c8565 --- /dev/null +++ b/src/net/scripts/kconfig/merge_config.sh @@ -0,0 +1,189 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# +# merge_config.sh - Takes a list of config fragment values, and merges +# them one by one. Provides warnings on overridden values, and specified +# values that did not make it to the resulting .config file (due to missed +# dependencies or config symbol removal). +# +# Portions reused from kconf_check and generate_cfg: +# http://git.yoctoproject.org/cgit/cgit.cgi/yocto-kernel-tools/tree/tools/kconf_check +# http://git.yoctoproject.org/cgit/cgit.cgi/yocto-kernel-tools/tree/tools/generate_cfg +# +# Copyright (c) 2009-2010 Wind River Systems, Inc. +# Copyright 2011 Linaro + +set -e + +clean_up() { + rm -f $TMP_FILE + rm -f $MERGE_FILE +} + +usage() { + echo "Usage: $0 [OPTIONS] [CONFIG [...]]" + echo " -h display this help text" + echo " -m only merge the fragments, do not execute the make command" + echo " -n use allnoconfig instead of alldefconfig" + echo " -r list redundant entries when merging fragments" + echo " -y make builtin have precedence over modules" + echo " -O dir to put generated output files. Consider setting \$KCONFIG_CONFIG instead." + echo + echo "Used prefix: '$CONFIG_PREFIX'. You can redefine it with \$CONFIG_ environment variable." +} + +RUNMAKE=true +ALLTARGET=alldefconfig +WARNREDUN=false +BUILTIN=false +OUTPUT=. +CONFIG_PREFIX=${CONFIG_-CONFIG_} + +while true; do + case $1 in + "-n") + ALLTARGET=allnoconfig + shift + continue + ;; + "-m") + RUNMAKE=false + shift + continue + ;; + "-h") + usage + exit + ;; + "-r") + WARNREDUN=true + shift + continue + ;; + "-y") + BUILTIN=true + shift + continue + ;; + "-O") + if [ -d $2 ];then + OUTPUT=$(echo $2 | sed 's/\/*$//') + else + echo "output directory $2 does not exist" 1>&2 + exit 1 + fi + shift 2 + continue + ;; + *) + break + ;; + esac +done + +if [ "$#" -lt 1 ] ; then + usage + exit +fi + +if [ -z "$KCONFIG_CONFIG" ]; then + if [ "$OUTPUT" != . ]; then + KCONFIG_CONFIG=$(readlink -m -- "$OUTPUT/.config") + else + KCONFIG_CONFIG=.config + fi +fi + +INITFILE=$1 +shift; + +if [ ! -r "$INITFILE" ]; then + echo "The base file '$INITFILE' does not exist. Exit." >&2 + exit 1 +fi + +MERGE_LIST=$* +SED_CONFIG_EXP1="s/^\(${CONFIG_PREFIX}[a-zA-Z0-9_]*\)=.*/\1/p" +SED_CONFIG_EXP2="s/^# \(${CONFIG_PREFIX}[a-zA-Z0-9_]*\) is not set$/\1/p" + +TMP_FILE=$(mktemp ./.tmp.config.XXXXXXXXXX) +MERGE_FILE=$(mktemp ./.merge_tmp.config.XXXXXXXXXX) + +echo "Using $INITFILE as base" + +trap clean_up EXIT + +cat $INITFILE > $TMP_FILE + +# Merge files, printing warnings on overridden values +for ORIG_MERGE_FILE in $MERGE_LIST ; do + echo "Merging $ORIG_MERGE_FILE" + if [ ! -r "$ORIG_MERGE_FILE" ]; then + echo "The merge file '$ORIG_MERGE_FILE' does not exist. Exit." >&2 + exit 1 + fi + cat $ORIG_MERGE_FILE > $MERGE_FILE + CFG_LIST=$(sed -n -e "$SED_CONFIG_EXP1" -e "$SED_CONFIG_EXP2" $MERGE_FILE) + + for CFG in $CFG_LIST ; do + grep -q -w $CFG $TMP_FILE || continue + PREV_VAL=$(grep -w $CFG $TMP_FILE) + NEW_VAL=$(grep -w $CFG $MERGE_FILE) + BUILTIN_FLAG=false + if [ "$BUILTIN" = "true" ] && [ "${NEW_VAL#CONFIG_*=}" = "m" ] && [ "${PREV_VAL#CONFIG_*=}" = "y" ]; then + echo Previous value: $PREV_VAL + echo New value: $NEW_VAL + echo -y passed, will not demote y to m + echo + BUILTIN_FLAG=true + elif [ "x$PREV_VAL" != "x$NEW_VAL" ] ; then + echo Value of $CFG is redefined by fragment $ORIG_MERGE_FILE: + echo Previous value: $PREV_VAL + echo New value: $NEW_VAL + echo + elif [ "$WARNREDUN" = "true" ]; then + echo Value of $CFG is redundant by fragment $ORIG_MERGE_FILE: + fi + if [ "$BUILTIN_FLAG" = "false" ]; then + sed -i "/$CFG[ =]/d" $TMP_FILE + else + sed -i "/$CFG[ =]/d" $MERGE_FILE + fi + done + cat $MERGE_FILE >> $TMP_FILE +done + +if [ "$RUNMAKE" = "false" ]; then + cp -T -- "$TMP_FILE" "$KCONFIG_CONFIG" + echo "#" + echo "# merged configuration written to $KCONFIG_CONFIG (needs make)" + echo "#" + exit +fi + +# If we have an output dir, setup the O= argument, otherwise leave +# it blank, since O=. will create an unnecessary ./source softlink +OUTPUT_ARG="" +if [ "$OUTPUT" != "." ] ; then + OUTPUT_ARG="O=$OUTPUT" +fi + + +# Use the merged file as the starting point for: +# alldefconfig: Fills in any missing symbols with Kconfig default +# allnoconfig: Fills in any missing symbols with # CONFIG_* is not set +make KCONFIG_ALLCONFIG=$TMP_FILE $OUTPUT_ARG $ALLTARGET + + +# Check all specified config values took (might have missed-dependency issues) +for CFG in $(sed -n -e "$SED_CONFIG_EXP1" -e "$SED_CONFIG_EXP2" $TMP_FILE); do + + REQUESTED_VAL=$(grep -w -e "$CFG" $TMP_FILE) + ACTUAL_VAL=$(grep -w -e "$CFG" "$KCONFIG_CONFIG" || true) + if [ "x$REQUESTED_VAL" != "x$ACTUAL_VAL" ] ; then + echo "Value requested for $CFG not in final .config" + echo "Requested value: $REQUESTED_VAL" + echo "Actual value: $ACTUAL_VAL" + echo "" + fi +done diff --git a/src/net/scripts/kconfig/nconf-cfg.sh b/src/net/scripts/kconfig/nconf-cfg.sh new file mode 100755 index 0000000..c212255 --- /dev/null +++ b/src/net/scripts/kconfig/nconf-cfg.sh @@ -0,0 +1,50 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 + +PKG="ncursesw menuw panelw" +PKG2="ncurses menu panel" + +if [ -n "$(command -v pkg-config)" ]; then + if pkg-config --exists $PKG; then + echo cflags=\"$(pkg-config --cflags $PKG)\" + echo libs=\"$(pkg-config --libs $PKG)\" + exit 0 + fi + + if pkg-config --exists $PKG2; then + echo cflags=\"$(pkg-config --cflags $PKG2)\" + echo libs=\"$(pkg-config --libs $PKG2)\" + exit 0 + fi +fi + +# Check the default paths in case pkg-config is not installed. +# (Even if it is installed, some distributions such as openSUSE cannot +# find ncurses by pkg-config.) +if [ -f /usr/include/ncursesw/ncurses.h ]; then + echo cflags=\"-D_GNU_SOURCE -I/usr/include/ncursesw\" + echo libs=\"-lncursesw -lmenuw -lpanelw\" + exit 0 +fi + +if [ -f /usr/include/ncurses/ncurses.h ]; then + echo cflags=\"-D_GNU_SOURCE -I/usr/include/ncurses\" + echo libs=\"-lncurses -lmenu -lpanel\" + exit 0 +fi + +if [ -f /usr/include/ncurses.h ]; then + echo cflags=\"-D_GNU_SOURCE\" + echo libs=\"-lncurses -lmenu -lpanel\" + exit 0 +fi + +echo >&2 "*" +echo >&2 "* Unable to find the ncurses package." +echo >&2 "* Install ncurses (ncurses-devel or libncurses-dev" +echo >&2 "* depending on your distribution)." +echo >&2 "*" +echo >&2 "* You may also need to install pkg-config to find the" +echo >&2 "* ncurses installed in a non-default location." +echo >&2 "*" +exit 1 diff --git a/src/net/scripts/kconfig/nconf.c b/src/net/scripts/kconfig/nconf.c new file mode 100644 index 0000000..af814b3 --- /dev/null +++ b/src/net/scripts/kconfig/nconf.c @@ -0,0 +1,1555 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2008 Nir Tzachar <nir.tzachar@gmail.com> + * + * Derived from menuconfig. + */ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif +#include <string.h> +#include <strings.h> +#include <stdlib.h> + +#include "lkc.h" +#include "nconf.h" +#include <ctype.h> + +static const char nconf_global_help[] = +"Help windows\n" +"------------\n" +"o Global help: Unless in a data entry window, pressing <F1> will give \n" +" you the global help window, which you are just reading.\n" +"\n" +"o A short version of the global help is available by pressing <F3>.\n" +"\n" +"o Local help: To get help related to the current menu entry, use any\n" +" of <?> <h>, or if in a data entry window then press <F1>.\n" +"\n" +"\n" +"Menu entries\n" +"------------\n" +"This interface lets you select features and parameters for the kernel\n" +"build. Kernel features can either be built-in, modularized, or removed.\n" +"Parameters must be entered as text or decimal or hexadecimal numbers.\n" +"\n" +"Menu entries beginning with following braces represent features that\n" +" [ ] can be built in or removed\n" +" < > can be built in, modularized or removed\n" +" { } can be built in or modularized, are selected by another feature\n" +" - - are selected by another feature\n" +" XXX cannot be selected. Symbol Info <F2> tells you why.\n" +"*, M or whitespace inside braces means to build in, build as a module\n" +"or to exclude the feature respectively.\n" +"\n" +"To change any of these features, highlight it with the movement keys\n" +"listed below and press <y> to build it in, <m> to make it a module or\n" +"<n> to remove it. You may press the <Space> key to cycle through the\n" +"available options.\n" +"\n" +"A trailing \"--->\" designates a submenu, a trailing \"----\" an\n" +"empty submenu.\n" +"\n" +"Menu navigation keys\n" +"----------------------------------------------------------------------\n" +"Linewise up <Up>\n" +"Linewise down <Down>\n" +"Pagewise up <Page Up>\n" +"Pagewise down <Page Down>\n" +"First entry <Home>\n" +"Last entry <End>\n" +"Enter a submenu <Right> <Enter>\n" +"Go back to parent menu <Left> <Esc> <F5>\n" +"Close a help window <Enter> <Esc> <F5>\n" +"Close entry window, apply <Enter>\n" +"Close entry window, forget <Esc> <F5>\n" +"Start incremental, case-insensitive search for STRING in menu entries,\n" +" no regex support, STRING is displayed in upper left corner\n" +" </>STRING\n" +" Remove last character <Backspace>\n" +" Jump to next hit <Down>\n" +" Jump to previous hit <Up>\n" +"Exit menu search mode </> <Esc>\n" +"Search for configuration variables with or without leading CONFIG_\n" +" <F8>RegExpr<Enter>\n" +"Verbose search help <F8><F1>\n" +"----------------------------------------------------------------------\n" +"\n" +"Unless in a data entry window, key <1> may be used instead of <F1>,\n" +"<2> instead of <F2>, etc.\n" +"\n" +"\n" +"Radiolist (Choice list)\n" +"-----------------------\n" +"Use the movement keys listed above to select the option you wish to set\n" +"and press <Space>.\n" +"\n" +"\n" +"Data entry\n" +"----------\n" +"Enter the requested information and press <Enter>. Hexadecimal values\n" +"may be entered without the \"0x\" prefix.\n" +"\n" +"\n" +"Text Box (Help Window)\n" +"----------------------\n" +"Use movement keys as listed in table above.\n" +"\n" +"Press any of <Enter> <Esc> <q> <F5> <F9> to exit.\n" +"\n" +"\n" +"Alternate configuration files\n" +"-----------------------------\n" +"nconfig supports switching between different configurations.\n" +"Press <F6> to save your current configuration. Press <F7> and enter\n" +"a file name to load a previously saved configuration.\n" +"\n" +"\n" +"Terminal configuration\n" +"----------------------\n" +"If you use nconfig in a xterm window, make sure your TERM environment\n" +"variable specifies a terminal configuration which supports at least\n" +"16 colors. Otherwise nconfig will look rather bad.\n" +"\n" +"If the \"stty size\" command reports the current terminalsize correctly,\n" +"nconfig will adapt to sizes larger than the traditional 80x25 \"standard\"\n" +"and display longer menus properly.\n" +"\n" +"\n" +"Single menu mode\n" +"----------------\n" +"If you prefer to have all of the menu entries listed in a single menu,\n" +"rather than the default multimenu hierarchy, run nconfig with\n" +"NCONFIG_MODE environment variable set to single_menu. Example:\n" +"\n" +"make NCONFIG_MODE=single_menu nconfig\n" +"\n" +"<Enter> will then unfold the appropriate category, or fold it if it\n" +"is already unfolded. Folded menu entries will be designated by a\n" +"leading \"++>\" and unfolded entries by a leading \"-->\".\n" +"\n" +"Note that this mode can eventually be a little more CPU expensive than\n" +"the default mode, especially with a larger number of unfolded submenus.\n" +"\n", +menu_no_f_instructions[] = +"Legend: [*] built-in [ ] excluded <M> module < > module capable.\n" +"Submenus are designated by a trailing \"--->\", empty ones by \"----\".\n" +"\n" +"Use the following keys to navigate the menus:\n" +"Move up or down with <Up> and <Down>.\n" +"Enter a submenu with <Enter> or <Right>.\n" +"Exit a submenu to its parent menu with <Esc> or <Left>.\n" +"Pressing <y> includes, <n> excludes, <m> modularizes features.\n" +"Pressing <Space> cycles through the available options.\n" +"To search for menu entries press </>.\n" +"<Esc> always leaves the current window.\n" +"\n" +"You do not have function keys support.\n" +"Press <1> instead of <F1>, <2> instead of <F2>, etc.\n" +"For verbose global help use key <1>.\n" +"For help related to the current menu entry press <?> or <h>.\n", +menu_instructions[] = +"Legend: [*] built-in [ ] excluded <M> module < > module capable.\n" +"Submenus are designated by a trailing \"--->\", empty ones by \"----\".\n" +"\n" +"Use the following keys to navigate the menus:\n" +"Move up or down with <Up> or <Down>.\n" +"Enter a submenu with <Enter> or <Right>.\n" +"Exit a submenu to its parent menu with <Esc> or <Left>.\n" +"Pressing <y> includes, <n> excludes, <m> modularizes features.\n" +"Pressing <Space> cycles through the available options.\n" +"To search for menu entries press </>.\n" +"<Esc> always leaves the current window.\n" +"\n" +"Pressing <1> may be used instead of <F1>, <2> instead of <F2>, etc.\n" +"For verbose global help press <F1>.\n" +"For help related to the current menu entry press <?> or <h>.\n", +radiolist_instructions[] = +"Press <Up>, <Down>, <Home> or <End> to navigate a radiolist, select\n" +"with <Space>.\n" +"For help related to the current entry press <?> or <h>.\n" +"For global help press <F1>.\n", +inputbox_instructions_int[] = +"Please enter a decimal value.\n" +"Fractions will not be accepted.\n" +"Press <Enter> to apply, <Esc> to cancel.", +inputbox_instructions_hex[] = +"Please enter a hexadecimal value.\n" +"Press <Enter> to apply, <Esc> to cancel.", +inputbox_instructions_string[] = +"Please enter a string value.\n" +"Press <Enter> to apply, <Esc> to cancel.", +setmod_text[] = +"This feature depends on another feature which has been configured as a\n" +"module. As a result, the current feature will be built as a module too.", +load_config_text[] = +"Enter the name of the configuration file you wish to load.\n" +"Accept the name shown to restore the configuration you last\n" +"retrieved. Leave empty to abort.", +load_config_help[] = +"For various reasons, one may wish to keep several different\n" +"configurations available on a single machine.\n" +"\n" +"If you have saved a previous configuration in a file other than the\n" +"default one, entering its name here will allow you to load and modify\n" +"that configuration.\n" +"\n" +"Leave empty to abort.\n", +save_config_text[] = +"Enter a filename to which this configuration should be saved\n" +"as an alternate. Leave empty to abort.", +save_config_help[] = +"For various reasons, one may wish to keep several different\n" +"configurations available on a single machine.\n" +"\n" +"Entering a file name here will allow you to later retrieve, modify\n" +"and use the current configuration as an alternate to whatever\n" +"configuration options you have selected at that time.\n" +"\n" +"Leave empty to abort.\n", +search_help[] = +"Search for symbols (configuration variable names CONFIG_*) and display\n" +"their relations. Regular expressions are supported.\n" +"Example: Search for \"^FOO\".\n" +"Result:\n" +"-----------------------------------------------------------------\n" +"Symbol: FOO [ = m]\n" +"Prompt: Foo bus is used to drive the bar HW\n" +"Defined at drivers/pci/Kconfig:47\n" +"Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n" +"Location:\n" +" -> Bus options (PCI, PCMCIA, EISA, ISA)\n" +" -> PCI support (PCI [ = y])\n" +" -> PCI access mode (<choice> [ = y])\n" +"Selects: LIBCRC32\n" +"Selected by: BAR\n" +"-----------------------------------------------------------------\n" +"o The line 'Prompt:' shows the text displayed for this symbol in\n" +" the menu hierarchy.\n" +"o The 'Defined at' line tells at what file / line number the symbol is\n" +" defined.\n" +"o The 'Depends on:' line lists symbols that need to be defined for\n" +" this symbol to be visible and selectable in the menu.\n" +"o The 'Location:' lines tell, where in the menu structure this symbol\n" +" is located. A location followed by a [ = y] indicates that this is\n" +" a selectable menu item, and the current value is displayed inside\n" +" brackets.\n" +"o The 'Selects:' line tells, what symbol will be automatically selected\n" +" if this symbol is selected (y or m).\n" +"o The 'Selected by' line tells what symbol has selected this symbol.\n" +"\n" +"Only relevant lines are shown.\n" +"\n\n" +"Search examples:\n" +"USB => find all symbols containing USB\n" +"^USB => find all symbols starting with USB\n" +"USB$ => find all symbols ending with USB\n" +"\n"; + +struct mitem { + char str[256]; + char tag; + void *usrptr; + int is_visible; +}; + +#define MAX_MENU_ITEMS 4096 +static int show_all_items; +static int indent; +static struct menu *current_menu; +static int child_count; +static int single_menu_mode; +/* the window in which all information appears */ +static WINDOW *main_window; +/* the largest size of the menu window */ +static int mwin_max_lines; +static int mwin_max_cols; +/* the window in which we show option buttons */ +static MENU *curses_menu; +static ITEM *curses_menu_items[MAX_MENU_ITEMS]; +static struct mitem k_menu_items[MAX_MENU_ITEMS]; +static int items_num; +static int global_exit; +/* the currently selected button */ +static const char *current_instructions = menu_instructions; + +static char *dialog_input_result; +static int dialog_input_result_len; + +static void conf(struct menu *menu); +static void conf_choice(struct menu *menu); +static void conf_string(struct menu *menu); +static void conf_load(void); +static void conf_save(void); +static void show_help(struct menu *menu); +static int do_exit(void); +static void setup_windows(void); +static void search_conf(void); + +typedef void (*function_key_handler_t)(int *key, struct menu *menu); +static void handle_f1(int *key, struct menu *current_item); +static void handle_f2(int *key, struct menu *current_item); +static void handle_f3(int *key, struct menu *current_item); +static void handle_f4(int *key, struct menu *current_item); +static void handle_f5(int *key, struct menu *current_item); +static void handle_f6(int *key, struct menu *current_item); +static void handle_f7(int *key, struct menu *current_item); +static void handle_f8(int *key, struct menu *current_item); +static void handle_f9(int *key, struct menu *current_item); + +struct function_keys { + const char *key_str; + const char *func; + function_key key; + function_key_handler_t handler; +}; + +static const int function_keys_num = 9; +static struct function_keys function_keys[] = { + { + .key_str = "F1", + .func = "Help", + .key = F_HELP, + .handler = handle_f1, + }, + { + .key_str = "F2", + .func = "SymInfo", + .key = F_SYMBOL, + .handler = handle_f2, + }, + { + .key_str = "F3", + .func = "Help 2", + .key = F_INSTS, + .handler = handle_f3, + }, + { + .key_str = "F4", + .func = "ShowAll", + .key = F_CONF, + .handler = handle_f4, + }, + { + .key_str = "F5", + .func = "Back", + .key = F_BACK, + .handler = handle_f5, + }, + { + .key_str = "F6", + .func = "Save", + .key = F_SAVE, + .handler = handle_f6, + }, + { + .key_str = "F7", + .func = "Load", + .key = F_LOAD, + .handler = handle_f7, + }, + { + .key_str = "F8", + .func = "SymSearch", + .key = F_SEARCH, + .handler = handle_f8, + }, + { + .key_str = "F9", + .func = "Exit", + .key = F_EXIT, + .handler = handle_f9, + }, +}; + +static void print_function_line(void) +{ + int i; + int offset = 1; + const int skip = 1; + int lines = getmaxy(stdscr); + + for (i = 0; i < function_keys_num; i++) { + (void) wattrset(main_window, attributes[FUNCTION_HIGHLIGHT]); + mvwprintw(main_window, lines-3, offset, + "%s", + function_keys[i].key_str); + (void) wattrset(main_window, attributes[FUNCTION_TEXT]); + offset += strlen(function_keys[i].key_str); + mvwprintw(main_window, lines-3, + offset, "%s", + function_keys[i].func); + offset += strlen(function_keys[i].func) + skip; + } + (void) wattrset(main_window, attributes[NORMAL]); +} + +/* help */ +static void handle_f1(int *key, struct menu *current_item) +{ + show_scroll_win(main_window, + "Global help", nconf_global_help); + return; +} + +/* symbole help */ +static void handle_f2(int *key, struct menu *current_item) +{ + show_help(current_item); + return; +} + +/* instructions */ +static void handle_f3(int *key, struct menu *current_item) +{ + show_scroll_win(main_window, + "Short help", + current_instructions); + return; +} + +/* config */ +static void handle_f4(int *key, struct menu *current_item) +{ + int res = btn_dialog(main_window, + "Show all symbols?", + 2, + " <Show All> ", + "<Don't show all>"); + if (res == 0) + show_all_items = 1; + else if (res == 1) + show_all_items = 0; + + return; +} + +/* back */ +static void handle_f5(int *key, struct menu *current_item) +{ + *key = KEY_LEFT; + return; +} + +/* save */ +static void handle_f6(int *key, struct menu *current_item) +{ + conf_save(); + return; +} + +/* load */ +static void handle_f7(int *key, struct menu *current_item) +{ + conf_load(); + return; +} + +/* search */ +static void handle_f8(int *key, struct menu *current_item) +{ + search_conf(); + return; +} + +/* exit */ +static void handle_f9(int *key, struct menu *current_item) +{ + do_exit(); + return; +} + +/* return != 0 to indicate the key was handles */ +static int process_special_keys(int *key, struct menu *menu) +{ + int i; + + if (*key == KEY_RESIZE) { + setup_windows(); + return 1; + } + + for (i = 0; i < function_keys_num; i++) { + if (*key == KEY_F(function_keys[i].key) || + *key == '0' + function_keys[i].key){ + function_keys[i].handler(key, menu); + return 1; + } + } + + return 0; +} + +static void clean_items(void) +{ + int i; + for (i = 0; curses_menu_items[i]; i++) + free_item(curses_menu_items[i]); + bzero(curses_menu_items, sizeof(curses_menu_items)); + bzero(k_menu_items, sizeof(k_menu_items)); + items_num = 0; +} + +typedef enum {MATCH_TINKER_PATTERN_UP, MATCH_TINKER_PATTERN_DOWN, + FIND_NEXT_MATCH_DOWN, FIND_NEXT_MATCH_UP} match_f; + +/* return the index of the matched item, or -1 if no such item exists */ +static int get_mext_match(const char *match_str, match_f flag) +{ + int match_start = item_index(current_item(curses_menu)); + int index; + + if (flag == FIND_NEXT_MATCH_DOWN) + ++match_start; + else if (flag == FIND_NEXT_MATCH_UP) + --match_start; + + match_start = (match_start + items_num) % items_num; + index = match_start; + while (true) { + char *str = k_menu_items[index].str; + if (strcasestr(str, match_str) != NULL) + return index; + if (flag == FIND_NEXT_MATCH_UP || + flag == MATCH_TINKER_PATTERN_UP) + --index; + else + ++index; + index = (index + items_num) % items_num; + if (index == match_start) + return -1; + } +} + +/* Make a new item. */ +static void item_make(struct menu *menu, char tag, const char *fmt, ...) +{ + va_list ap; + + if (items_num > MAX_MENU_ITEMS-1) + return; + + bzero(&k_menu_items[items_num], sizeof(k_menu_items[0])); + k_menu_items[items_num].tag = tag; + k_menu_items[items_num].usrptr = menu; + if (menu != NULL) + k_menu_items[items_num].is_visible = + menu_is_visible(menu); + else + k_menu_items[items_num].is_visible = 1; + + va_start(ap, fmt); + vsnprintf(k_menu_items[items_num].str, + sizeof(k_menu_items[items_num].str), + fmt, ap); + va_end(ap); + + if (!k_menu_items[items_num].is_visible) + memcpy(k_menu_items[items_num].str, "XXX", 3); + + curses_menu_items[items_num] = new_item( + k_menu_items[items_num].str, + k_menu_items[items_num].str); + set_item_userptr(curses_menu_items[items_num], + &k_menu_items[items_num]); + /* + if (!k_menu_items[items_num].is_visible) + item_opts_off(curses_menu_items[items_num], O_SELECTABLE); + */ + + items_num++; + curses_menu_items[items_num] = NULL; +} + +/* very hackish. adds a string to the last item added */ +static void item_add_str(const char *fmt, ...) +{ + va_list ap; + int index = items_num-1; + char new_str[256]; + char tmp_str[256]; + + if (index < 0) + return; + + va_start(ap, fmt); + vsnprintf(new_str, sizeof(new_str), fmt, ap); + va_end(ap); + snprintf(tmp_str, sizeof(tmp_str), "%s%s", + k_menu_items[index].str, new_str); + strncpy(k_menu_items[index].str, + tmp_str, + sizeof(k_menu_items[index].str)); + + free_item(curses_menu_items[index]); + curses_menu_items[index] = new_item( + k_menu_items[index].str, + k_menu_items[index].str); + set_item_userptr(curses_menu_items[index], + &k_menu_items[index]); +} + +/* get the tag of the currently selected item */ +static char item_tag(void) +{ + ITEM *cur; + struct mitem *mcur; + + cur = current_item(curses_menu); + if (cur == NULL) + return 0; + mcur = (struct mitem *) item_userptr(cur); + return mcur->tag; +} + +static int curses_item_index(void) +{ + return item_index(current_item(curses_menu)); +} + +static void *item_data(void) +{ + ITEM *cur; + struct mitem *mcur; + + cur = current_item(curses_menu); + if (!cur) + return NULL; + mcur = (struct mitem *) item_userptr(cur); + return mcur->usrptr; + +} + +static int item_is_tag(char tag) +{ + return item_tag() == tag; +} + +static char filename[PATH_MAX+1]; +static char menu_backtitle[PATH_MAX+128]; +static const char *set_config_filename(const char *config_filename) +{ + int size; + + size = snprintf(menu_backtitle, sizeof(menu_backtitle), + "%s - %s", config_filename, rootmenu.prompt->text); + if (size >= sizeof(menu_backtitle)) + menu_backtitle[sizeof(menu_backtitle)-1] = '\0'; + + size = snprintf(filename, sizeof(filename), "%s", config_filename); + if (size >= sizeof(filename)) + filename[sizeof(filename)-1] = '\0'; + return menu_backtitle; +} + +/* return = 0 means we are successful. + * -1 means go on doing what you were doing + */ +static int do_exit(void) +{ + int res; + if (!conf_get_changed()) { + global_exit = 1; + return 0; + } + res = btn_dialog(main_window, + "Do you wish to save your new configuration?\n" + "<ESC> to cancel and resume nconfig.", + 2, + " <save> ", + "<don't save>"); + if (res == KEY_EXIT) { + global_exit = 0; + return -1; + } + + /* if we got here, the user really wants to exit */ + switch (res) { + case 0: + res = conf_write(filename); + if (res) + btn_dialog( + main_window, + "Error during writing of configuration.\n" + "Your configuration changes were NOT saved.", + 1, + "<OK>"); + conf_write_autoconf(0); + break; + default: + btn_dialog( + main_window, + "Your configuration changes were NOT saved.", + 1, + "<OK>"); + break; + } + global_exit = 1; + return 0; +} + + +static void search_conf(void) +{ + struct symbol **sym_arr; + struct gstr res; + struct gstr title; + char *dialog_input; + int dres; + + title = str_new(); + str_printf( &title, "Enter (sub)string or regexp to search for " + "(with or without \"%s\")", CONFIG_); + +again: + dres = dialog_inputbox(main_window, + "Search Configuration Parameter", + str_get(&title), + "", &dialog_input_result, &dialog_input_result_len); + switch (dres) { + case 0: + break; + case 1: + show_scroll_win(main_window, + "Search Configuration", search_help); + goto again; + default: + str_free(&title); + return; + } + + /* strip the prefix if necessary */ + dialog_input = dialog_input_result; + if (strncasecmp(dialog_input_result, CONFIG_, strlen(CONFIG_)) == 0) + dialog_input += strlen(CONFIG_); + + sym_arr = sym_re_search(dialog_input); + res = get_relations_str(sym_arr, NULL); + free(sym_arr); + show_scroll_win(main_window, + "Search Results", str_get(&res)); + str_free(&res); + str_free(&title); +} + + +static void build_conf(struct menu *menu) +{ + struct symbol *sym; + struct property *prop; + struct menu *child; + int type, tmp, doint = 2; + tristate val; + char ch; + + if (!menu || (!show_all_items && !menu_is_visible(menu))) + return; + + sym = menu->sym; + prop = menu->prompt; + if (!sym) { + if (prop && menu != current_menu) { + const char *prompt = menu_get_prompt(menu); + enum prop_type ptype; + ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; + switch (ptype) { + case P_MENU: + child_count++; + if (single_menu_mode) { + item_make(menu, 'm', + "%s%*c%s", + menu->data ? "-->" : "++>", + indent + 1, ' ', prompt); + } else + item_make(menu, 'm', + " %*c%s %s", + indent + 1, ' ', prompt, + menu_is_empty(menu) ? "----" : "--->"); + + if (single_menu_mode && menu->data) + goto conf_childs; + return; + case P_COMMENT: + if (prompt) { + child_count++; + item_make(menu, ':', + " %*c*** %s ***", + indent + 1, ' ', + prompt); + } + break; + default: + if (prompt) { + child_count++; + item_make(menu, ':', "---%*c%s", + indent + 1, ' ', + prompt); + } + } + } else + doint = 0; + goto conf_childs; + } + + type = sym_get_type(sym); + if (sym_is_choice(sym)) { + struct symbol *def_sym = sym_get_choice_value(sym); + struct menu *def_menu = NULL; + + child_count++; + for (child = menu->list; child; child = child->next) { + if (menu_is_visible(child) && child->sym == def_sym) + def_menu = child; + } + + val = sym_get_tristate_value(sym); + if (sym_is_changeable(sym)) { + switch (type) { + case S_BOOLEAN: + item_make(menu, 't', "[%c]", + val == no ? ' ' : '*'); + break; + case S_TRISTATE: + switch (val) { + case yes: + ch = '*'; + break; + case mod: + ch = 'M'; + break; + default: + ch = ' '; + break; + } + item_make(menu, 't', "<%c>", ch); + break; + } + } else { + item_make(menu, def_menu ? 't' : ':', " "); + } + + item_add_str("%*c%s", indent + 1, + ' ', menu_get_prompt(menu)); + if (val == yes) { + if (def_menu) { + item_add_str(" (%s)", + menu_get_prompt(def_menu)); + item_add_str(" --->"); + if (def_menu->list) { + indent += 2; + build_conf(def_menu); + indent -= 2; + } + } + return; + } + } else { + if (menu == current_menu) { + item_make(menu, ':', + "---%*c%s", indent + 1, + ' ', menu_get_prompt(menu)); + goto conf_childs; + } + child_count++; + val = sym_get_tristate_value(sym); + if (sym_is_choice_value(sym) && val == yes) { + item_make(menu, ':', " "); + } else { + switch (type) { + case S_BOOLEAN: + if (sym_is_changeable(sym)) + item_make(menu, 't', "[%c]", + val == no ? ' ' : '*'); + else + item_make(menu, 't', "-%c-", + val == no ? ' ' : '*'); + break; + case S_TRISTATE: + switch (val) { + case yes: + ch = '*'; + break; + case mod: + ch = 'M'; + break; + default: + ch = ' '; + break; + } + if (sym_is_changeable(sym)) { + if (sym->rev_dep.tri == mod) + item_make(menu, + 't', "{%c}", ch); + else + item_make(menu, + 't', "<%c>", ch); + } else + item_make(menu, 't', "-%c-", ch); + break; + default: + tmp = 2 + strlen(sym_get_string_value(sym)); + item_make(menu, 's', " (%s)", + sym_get_string_value(sym)); + tmp = indent - tmp + 4; + if (tmp < 0) + tmp = 0; + item_add_str("%*c%s%s", tmp, ' ', + menu_get_prompt(menu), + (sym_has_value(sym) || + !sym_is_changeable(sym)) ? "" : + " (NEW)"); + goto conf_childs; + } + } + item_add_str("%*c%s%s", indent + 1, ' ', + menu_get_prompt(menu), + (sym_has_value(sym) || !sym_is_changeable(sym)) ? + "" : " (NEW)"); + if (menu->prompt && menu->prompt->type == P_MENU) { + item_add_str(" %s", menu_is_empty(menu) ? "----" : "--->"); + return; + } + } + +conf_childs: + indent += doint; + for (child = menu->list; child; child = child->next) + build_conf(child); + indent -= doint; +} + +static void reset_menu(void) +{ + unpost_menu(curses_menu); + clean_items(); +} + +/* adjust the menu to show this item. + * prefer not to scroll the menu if possible*/ +static void center_item(int selected_index, int *last_top_row) +{ + int toprow; + + set_top_row(curses_menu, *last_top_row); + toprow = top_row(curses_menu); + if (selected_index < toprow || + selected_index >= toprow+mwin_max_lines) { + toprow = max(selected_index-mwin_max_lines/2, 0); + if (toprow >= item_count(curses_menu)-mwin_max_lines) + toprow = item_count(curses_menu)-mwin_max_lines; + set_top_row(curses_menu, toprow); + } + set_current_item(curses_menu, + curses_menu_items[selected_index]); + *last_top_row = toprow; + post_menu(curses_menu); + refresh_all_windows(main_window); +} + +/* this function assumes reset_menu has been called before */ +static void show_menu(const char *prompt, const char *instructions, + int selected_index, int *last_top_row) +{ + int maxx, maxy; + WINDOW *menu_window; + + current_instructions = instructions; + + clear(); + (void) wattrset(main_window, attributes[NORMAL]); + print_in_middle(stdscr, 1, 0, getmaxx(stdscr), + menu_backtitle, + attributes[MAIN_HEADING]); + + (void) wattrset(main_window, attributes[MAIN_MENU_BOX]); + box(main_window, 0, 0); + (void) wattrset(main_window, attributes[MAIN_MENU_HEADING]); + mvwprintw(main_window, 0, 3, " %s ", prompt); + (void) wattrset(main_window, attributes[NORMAL]); + + set_menu_items(curses_menu, curses_menu_items); + + /* position the menu at the middle of the screen */ + scale_menu(curses_menu, &maxy, &maxx); + maxx = min(maxx, mwin_max_cols-2); + maxy = mwin_max_lines; + menu_window = derwin(main_window, + maxy, + maxx, + 2, + (mwin_max_cols-maxx)/2); + keypad(menu_window, TRUE); + set_menu_win(curses_menu, menu_window); + set_menu_sub(curses_menu, menu_window); + + /* must reassert this after changing items, otherwise returns to a + * default of 16 + */ + set_menu_format(curses_menu, maxy, 1); + center_item(selected_index, last_top_row); + set_menu_format(curses_menu, maxy, 1); + + print_function_line(); + + /* Post the menu */ + post_menu(curses_menu); + refresh_all_windows(main_window); +} + +static void adj_match_dir(match_f *match_direction) +{ + if (*match_direction == FIND_NEXT_MATCH_DOWN) + *match_direction = + MATCH_TINKER_PATTERN_DOWN; + else if (*match_direction == FIND_NEXT_MATCH_UP) + *match_direction = + MATCH_TINKER_PATTERN_UP; + /* else, do no change.. */ +} + +struct match_state +{ + int in_search; + match_f match_direction; + char pattern[256]; +}; + +/* Return 0 means I have handled the key. In such a case, ans should hold the + * item to center, or -1 otherwise. + * Else return -1 . + */ +static int do_match(int key, struct match_state *state, int *ans) +{ + char c = (char) key; + int terminate_search = 0; + *ans = -1; + if (key == '/' || (state->in_search && key == 27)) { + move(0, 0); + refresh(); + clrtoeol(); + state->in_search = 1-state->in_search; + bzero(state->pattern, sizeof(state->pattern)); + state->match_direction = MATCH_TINKER_PATTERN_DOWN; + return 0; + } else if (!state->in_search) + return 1; + + if (isalnum(c) || isgraph(c) || c == ' ') { + state->pattern[strlen(state->pattern)] = c; + state->pattern[strlen(state->pattern)] = '\0'; + adj_match_dir(&state->match_direction); + *ans = get_mext_match(state->pattern, + state->match_direction); + } else if (key == KEY_DOWN) { + state->match_direction = FIND_NEXT_MATCH_DOWN; + *ans = get_mext_match(state->pattern, + state->match_direction); + } else if (key == KEY_UP) { + state->match_direction = FIND_NEXT_MATCH_UP; + *ans = get_mext_match(state->pattern, + state->match_direction); + } else if (key == KEY_BACKSPACE || key == 8 || key == 127) { + state->pattern[strlen(state->pattern)-1] = '\0'; + adj_match_dir(&state->match_direction); + } else + terminate_search = 1; + + if (terminate_search) { + state->in_search = 0; + bzero(state->pattern, sizeof(state->pattern)); + move(0, 0); + refresh(); + clrtoeol(); + return -1; + } + return 0; +} + +static void conf(struct menu *menu) +{ + struct menu *submenu = NULL; + const char *prompt = menu_get_prompt(menu); + struct symbol *sym; + int res; + int current_index = 0; + int last_top_row = 0; + struct match_state match_state = { + .in_search = 0, + .match_direction = MATCH_TINKER_PATTERN_DOWN, + .pattern = "", + }; + + while (!global_exit) { + reset_menu(); + current_menu = menu; + build_conf(menu); + if (!child_count) + break; + + show_menu(prompt ? prompt : "Main Menu", + menu_instructions, + current_index, &last_top_row); + keypad((menu_win(curses_menu)), TRUE); + while (!global_exit) { + if (match_state.in_search) { + mvprintw(0, 0, + "searching: %s", match_state.pattern); + clrtoeol(); + } + refresh_all_windows(main_window); + res = wgetch(menu_win(curses_menu)); + if (!res) + break; + if (do_match(res, &match_state, ¤t_index) == 0) { + if (current_index != -1) + center_item(current_index, + &last_top_row); + continue; + } + if (process_special_keys(&res, + (struct menu *) item_data())) + break; + switch (res) { + case KEY_DOWN: + menu_driver(curses_menu, REQ_DOWN_ITEM); + break; + case KEY_UP: + menu_driver(curses_menu, REQ_UP_ITEM); + break; + case KEY_NPAGE: + menu_driver(curses_menu, REQ_SCR_DPAGE); + break; + case KEY_PPAGE: + menu_driver(curses_menu, REQ_SCR_UPAGE); + break; + case KEY_HOME: + menu_driver(curses_menu, REQ_FIRST_ITEM); + break; + case KEY_END: + menu_driver(curses_menu, REQ_LAST_ITEM); + break; + case 'h': + case '?': + show_help((struct menu *) item_data()); + break; + } + if (res == 10 || res == 27 || + res == 32 || res == 'n' || res == 'y' || + res == KEY_LEFT || res == KEY_RIGHT || + res == 'm') + break; + refresh_all_windows(main_window); + } + + refresh_all_windows(main_window); + /* if ESC or left*/ + if (res == 27 || (menu != &rootmenu && res == KEY_LEFT)) + break; + + /* remember location in the menu */ + last_top_row = top_row(curses_menu); + current_index = curses_item_index(); + + if (!item_tag()) + continue; + + submenu = (struct menu *) item_data(); + if (!submenu || !menu_is_visible(submenu)) + continue; + sym = submenu->sym; + + switch (res) { + case ' ': + if (item_is_tag('t')) + sym_toggle_tristate_value(sym); + else if (item_is_tag('m')) + conf(submenu); + break; + case KEY_RIGHT: + case 10: /* ENTER WAS PRESSED */ + switch (item_tag()) { + case 'm': + if (single_menu_mode) + submenu->data = + (void *) (long) !submenu->data; + else + conf(submenu); + break; + case 't': + if (sym_is_choice(sym) && + sym_get_tristate_value(sym) == yes) + conf_choice(submenu); + else if (submenu->prompt && + submenu->prompt->type == P_MENU) + conf(submenu); + else if (res == 10) + sym_toggle_tristate_value(sym); + break; + case 's': + conf_string(submenu); + break; + } + break; + case 'y': + if (item_is_tag('t')) { + if (sym_set_tristate_value(sym, yes)) + break; + if (sym_set_tristate_value(sym, mod)) + btn_dialog(main_window, setmod_text, 0); + } + break; + case 'n': + if (item_is_tag('t')) + sym_set_tristate_value(sym, no); + break; + case 'm': + if (item_is_tag('t')) + sym_set_tristate_value(sym, mod); + break; + } + } +} + +static void conf_message_callback(const char *s) +{ + btn_dialog(main_window, s, 1, "<OK>"); +} + +static void show_help(struct menu *menu) +{ + struct gstr help; + + if (!menu) + return; + + help = str_new(); + menu_get_ext_help(menu, &help); + show_scroll_win(main_window, menu_get_prompt(menu), str_get(&help)); + str_free(&help); +} + +static void conf_choice(struct menu *menu) +{ + const char *prompt = menu_get_prompt(menu); + struct menu *child = NULL; + struct symbol *active; + int selected_index = 0; + int last_top_row = 0; + int res, i = 0; + struct match_state match_state = { + .in_search = 0, + .match_direction = MATCH_TINKER_PATTERN_DOWN, + .pattern = "", + }; + + active = sym_get_choice_value(menu->sym); + /* this is mostly duplicated from the conf() function. */ + while (!global_exit) { + reset_menu(); + + for (i = 0, child = menu->list; child; child = child->next) { + if (!show_all_items && !menu_is_visible(child)) + continue; + + if (child->sym == sym_get_choice_value(menu->sym)) + item_make(child, ':', "<X> %s", + menu_get_prompt(child)); + else if (child->sym) + item_make(child, ':', " %s", + menu_get_prompt(child)); + else + item_make(child, ':', "*** %s ***", + menu_get_prompt(child)); + + if (child->sym == active){ + last_top_row = top_row(curses_menu); + selected_index = i; + } + i++; + } + show_menu(prompt ? prompt : "Choice Menu", + radiolist_instructions, + selected_index, + &last_top_row); + while (!global_exit) { + if (match_state.in_search) { + mvprintw(0, 0, "searching: %s", + match_state.pattern); + clrtoeol(); + } + refresh_all_windows(main_window); + res = wgetch(menu_win(curses_menu)); + if (!res) + break; + if (do_match(res, &match_state, &selected_index) == 0) { + if (selected_index != -1) + center_item(selected_index, + &last_top_row); + continue; + } + if (process_special_keys( + &res, + (struct menu *) item_data())) + break; + switch (res) { + case KEY_DOWN: + menu_driver(curses_menu, REQ_DOWN_ITEM); + break; + case KEY_UP: + menu_driver(curses_menu, REQ_UP_ITEM); + break; + case KEY_NPAGE: + menu_driver(curses_menu, REQ_SCR_DPAGE); + break; + case KEY_PPAGE: + menu_driver(curses_menu, REQ_SCR_UPAGE); + break; + case KEY_HOME: + menu_driver(curses_menu, REQ_FIRST_ITEM); + break; + case KEY_END: + menu_driver(curses_menu, REQ_LAST_ITEM); + break; + case 'h': + case '?': + show_help((struct menu *) item_data()); + break; + } + if (res == 10 || res == 27 || res == ' ' || + res == KEY_LEFT){ + break; + } + refresh_all_windows(main_window); + } + /* if ESC or left */ + if (res == 27 || res == KEY_LEFT) + break; + + child = item_data(); + if (!child || !menu_is_visible(child) || !child->sym) + continue; + switch (res) { + case ' ': + case 10: + case KEY_RIGHT: + sym_set_tristate_value(child->sym, yes); + return; + case 'h': + case '?': + show_help(child); + active = child->sym; + break; + case KEY_EXIT: + return; + } + } +} + +static void conf_string(struct menu *menu) +{ + const char *prompt = menu_get_prompt(menu); + + while (1) { + int res; + const char *heading; + + switch (sym_get_type(menu->sym)) { + case S_INT: + heading = inputbox_instructions_int; + break; + case S_HEX: + heading = inputbox_instructions_hex; + break; + case S_STRING: + heading = inputbox_instructions_string; + break; + default: + heading = "Internal nconf error!"; + } + res = dialog_inputbox(main_window, + prompt ? prompt : "Main Menu", + heading, + sym_get_string_value(menu->sym), + &dialog_input_result, + &dialog_input_result_len); + switch (res) { + case 0: + if (sym_set_string_value(menu->sym, + dialog_input_result)) + return; + btn_dialog(main_window, + "You have made an invalid entry.", 0); + break; + case 1: + show_help(menu); + break; + case KEY_EXIT: + return; + } + } +} + +static void conf_load(void) +{ + while (1) { + int res; + res = dialog_inputbox(main_window, + NULL, load_config_text, + filename, + &dialog_input_result, + &dialog_input_result_len); + switch (res) { + case 0: + if (!dialog_input_result[0]) + return; + if (!conf_read(dialog_input_result)) { + set_config_filename(dialog_input_result); + sym_set_change_count(1); + return; + } + btn_dialog(main_window, "File does not exist!", 0); + break; + case 1: + show_scroll_win(main_window, + "Load Alternate Configuration", + load_config_help); + break; + case KEY_EXIT: + return; + } + } +} + +static void conf_save(void) +{ + while (1) { + int res; + res = dialog_inputbox(main_window, + NULL, save_config_text, + filename, + &dialog_input_result, + &dialog_input_result_len); + switch (res) { + case 0: + if (!dialog_input_result[0]) + return; + res = conf_write(dialog_input_result); + if (!res) { + set_config_filename(dialog_input_result); + return; + } + btn_dialog(main_window, "Can't create file!", + 1, "<OK>"); + break; + case 1: + show_scroll_win(main_window, + "Save Alternate Configuration", + save_config_help); + break; + case KEY_EXIT: + return; + } + } +} + +static void setup_windows(void) +{ + int lines, columns; + + getmaxyx(stdscr, lines, columns); + + if (main_window != NULL) + delwin(main_window); + + /* set up the menu and menu window */ + main_window = newwin(lines-2, columns-2, 2, 1); + keypad(main_window, TRUE); + mwin_max_lines = lines-7; + mwin_max_cols = columns-6; + + /* panels order is from bottom to top */ + new_panel(main_window); +} + +int main(int ac, char **av) +{ + int lines, columns; + char *mode; + + if (ac > 1 && strcmp(av[1], "-s") == 0) { + /* Silence conf_read() until the real callback is set up */ + conf_set_message_callback(NULL); + av++; + } + conf_parse(av[1]); + conf_read(NULL); + + mode = getenv("NCONFIG_MODE"); + if (mode) { + if (!strcasecmp(mode, "single_menu")) + single_menu_mode = 1; + } + + /* Initialize curses */ + initscr(); + /* set color theme */ + set_colors(); + + cbreak(); + noecho(); + keypad(stdscr, TRUE); + curs_set(0); + + getmaxyx(stdscr, lines, columns); + if (columns < 75 || lines < 20) { + endwin(); + printf("Your terminal should have at " + "least 20 lines and 75 columns\n"); + return 1; + } + + notimeout(stdscr, FALSE); +#if NCURSES_REENTRANT + set_escdelay(1); +#else + ESCDELAY = 1; +#endif + + /* set btns menu */ + curses_menu = new_menu(curses_menu_items); + menu_opts_off(curses_menu, O_SHOWDESC); + menu_opts_on(curses_menu, O_SHOWMATCH); + menu_opts_on(curses_menu, O_ONEVALUE); + menu_opts_on(curses_menu, O_NONCYCLIC); + menu_opts_on(curses_menu, O_IGNORECASE); + set_menu_mark(curses_menu, " "); + set_menu_fore(curses_menu, attributes[MAIN_MENU_FORE]); + set_menu_back(curses_menu, attributes[MAIN_MENU_BACK]); + set_menu_grey(curses_menu, attributes[MAIN_MENU_GREY]); + + set_config_filename(conf_get_configname()); + setup_windows(); + + /* check for KEY_FUNC(1) */ + if (has_key(KEY_F(1)) == FALSE) { + show_scroll_win(main_window, + "Instructions", + menu_no_f_instructions); + } + + conf_set_message_callback(conf_message_callback); + /* do the work */ + while (!global_exit) { + conf(&rootmenu); + if (!global_exit && do_exit() == 0) + break; + } + /* ok, we are done */ + unpost_menu(curses_menu); + free_menu(curses_menu); + delwin(main_window); + clear(); + refresh(); + endwin(); + return 0; +} diff --git a/src/net/scripts/kconfig/nconf.gui.c b/src/net/scripts/kconfig/nconf.gui.c new file mode 100644 index 0000000..77f525a --- /dev/null +++ b/src/net/scripts/kconfig/nconf.gui.c @@ -0,0 +1,664 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2008 Nir Tzachar <nir.tzachar@gmail.com> + * + * Derived from menuconfig. + */ +#include "nconf.h" +#include "lkc.h" + +/* a list of all the different widgets we use */ +attributes_t attributes[ATTR_MAX+1] = {0}; + +/* available colors: + COLOR_BLACK 0 + COLOR_RED 1 + COLOR_GREEN 2 + COLOR_YELLOW 3 + COLOR_BLUE 4 + COLOR_MAGENTA 5 + COLOR_CYAN 6 + COLOR_WHITE 7 + */ +static void set_normal_colors(void) +{ + init_pair(NORMAL, -1, -1); + init_pair(MAIN_HEADING, COLOR_MAGENTA, -1); + + /* FORE is for the selected item */ + init_pair(MAIN_MENU_FORE, -1, -1); + /* BACK for all the rest */ + init_pair(MAIN_MENU_BACK, -1, -1); + init_pair(MAIN_MENU_GREY, -1, -1); + init_pair(MAIN_MENU_HEADING, COLOR_GREEN, -1); + init_pair(MAIN_MENU_BOX, COLOR_YELLOW, -1); + + init_pair(SCROLLWIN_TEXT, -1, -1); + init_pair(SCROLLWIN_HEADING, COLOR_GREEN, -1); + init_pair(SCROLLWIN_BOX, COLOR_YELLOW, -1); + + init_pair(DIALOG_TEXT, -1, -1); + init_pair(DIALOG_BOX, COLOR_YELLOW, -1); + init_pair(DIALOG_MENU_BACK, COLOR_YELLOW, -1); + init_pair(DIALOG_MENU_FORE, COLOR_RED, -1); + + init_pair(INPUT_BOX, COLOR_YELLOW, -1); + init_pair(INPUT_HEADING, COLOR_GREEN, -1); + init_pair(INPUT_TEXT, -1, -1); + init_pair(INPUT_FIELD, -1, -1); + + init_pair(FUNCTION_HIGHLIGHT, -1, -1); + init_pair(FUNCTION_TEXT, COLOR_YELLOW, -1); +} + +/* available attributes: + A_NORMAL Normal display (no highlight) + A_STANDOUT Best highlighting mode of the terminal. + A_UNDERLINE Underlining + A_REVERSE Reverse video + A_BLINK Blinking + A_DIM Half bright + A_BOLD Extra bright or bold + A_PROTECT Protected mode + A_INVIS Invisible or blank mode + A_ALTCHARSET Alternate character set + A_CHARTEXT Bit-mask to extract a character + COLOR_PAIR(n) Color-pair number n + */ +static void normal_color_theme(void) +{ + /* automatically add color... */ +#define mkattr(name, attr) do { \ +attributes[name] = attr | COLOR_PAIR(name); } while (0) + mkattr(NORMAL, NORMAL); + mkattr(MAIN_HEADING, A_BOLD | A_UNDERLINE); + + mkattr(MAIN_MENU_FORE, A_REVERSE); + mkattr(MAIN_MENU_BACK, A_NORMAL); + mkattr(MAIN_MENU_GREY, A_NORMAL); + mkattr(MAIN_MENU_HEADING, A_BOLD); + mkattr(MAIN_MENU_BOX, A_NORMAL); + + mkattr(SCROLLWIN_TEXT, A_NORMAL); + mkattr(SCROLLWIN_HEADING, A_BOLD); + mkattr(SCROLLWIN_BOX, A_BOLD); + + mkattr(DIALOG_TEXT, A_BOLD); + mkattr(DIALOG_BOX, A_BOLD); + mkattr(DIALOG_MENU_FORE, A_STANDOUT); + mkattr(DIALOG_MENU_BACK, A_NORMAL); + + mkattr(INPUT_BOX, A_NORMAL); + mkattr(INPUT_HEADING, A_BOLD); + mkattr(INPUT_TEXT, A_NORMAL); + mkattr(INPUT_FIELD, A_UNDERLINE); + + mkattr(FUNCTION_HIGHLIGHT, A_BOLD); + mkattr(FUNCTION_TEXT, A_REVERSE); +} + +static void no_colors_theme(void) +{ + /* automatically add highlight, no color */ +#define mkattrn(name, attr) { attributes[name] = attr; } + + mkattrn(NORMAL, NORMAL); + mkattrn(MAIN_HEADING, A_BOLD | A_UNDERLINE); + + mkattrn(MAIN_MENU_FORE, A_STANDOUT); + mkattrn(MAIN_MENU_BACK, A_NORMAL); + mkattrn(MAIN_MENU_GREY, A_NORMAL); + mkattrn(MAIN_MENU_HEADING, A_BOLD); + mkattrn(MAIN_MENU_BOX, A_NORMAL); + + mkattrn(SCROLLWIN_TEXT, A_NORMAL); + mkattrn(SCROLLWIN_HEADING, A_BOLD); + mkattrn(SCROLLWIN_BOX, A_BOLD); + + mkattrn(DIALOG_TEXT, A_NORMAL); + mkattrn(DIALOG_BOX, A_BOLD); + mkattrn(DIALOG_MENU_FORE, A_STANDOUT); + mkattrn(DIALOG_MENU_BACK, A_NORMAL); + + mkattrn(INPUT_BOX, A_BOLD); + mkattrn(INPUT_HEADING, A_BOLD); + mkattrn(INPUT_TEXT, A_NORMAL); + mkattrn(INPUT_FIELD, A_UNDERLINE); + + mkattrn(FUNCTION_HIGHLIGHT, A_BOLD); + mkattrn(FUNCTION_TEXT, A_REVERSE); +} + +void set_colors(void) +{ + start_color(); + use_default_colors(); + set_normal_colors(); + if (has_colors()) { + normal_color_theme(); + } else { + /* give defaults */ + no_colors_theme(); + } +} + + +/* this changes the windows attributes !!! */ +void print_in_middle(WINDOW *win, + int starty, + int startx, + int width, + const char *string, + chtype color) +{ int length, x, y; + float temp; + + + if (win == NULL) + win = stdscr; + getyx(win, y, x); + if (startx != 0) + x = startx; + if (starty != 0) + y = starty; + if (width == 0) + width = 80; + + length = strlen(string); + temp = (width - length) / 2; + x = startx + (int)temp; + (void) wattrset(win, color); + mvwprintw(win, y, x, "%s", string); + refresh(); +} + +int get_line_no(const char *text) +{ + int i; + int total = 1; + + if (!text) + return 0; + + for (i = 0; text[i] != '\0'; i++) + if (text[i] == '\n') + total++; + return total; +} + +const char *get_line(const char *text, int line_no) +{ + int i; + int lines = 0; + + if (!text) + return NULL; + + for (i = 0; text[i] != '\0' && lines < line_no; i++) + if (text[i] == '\n') + lines++; + return text+i; +} + +int get_line_length(const char *line) +{ + int res = 0; + while (*line != '\0' && *line != '\n') { + line++; + res++; + } + return res; +} + +/* print all lines to the window. */ +void fill_window(WINDOW *win, const char *text) +{ + int x, y; + int total_lines = get_line_no(text); + int i; + + getmaxyx(win, y, x); + /* do not go over end of line */ + total_lines = min(total_lines, y); + for (i = 0; i < total_lines; i++) { + char tmp[x+10]; + const char *line = get_line(text, i); + int len = get_line_length(line); + strncpy(tmp, line, min(len, x)); + tmp[len] = '\0'; + mvwprintw(win, i, 0, "%s", tmp); + } +} + +/* get the message, and buttons. + * each button must be a char* + * return the selected button + * + * this dialog is used for 2 different things: + * 1) show a text box, no buttons. + * 2) show a dialog, with horizontal buttons + */ +int btn_dialog(WINDOW *main_window, const char *msg, int btn_num, ...) +{ + va_list ap; + char *btn; + int btns_width = 0; + int msg_lines = 0; + int msg_width = 0; + int total_width; + int win_rows = 0; + WINDOW *win; + WINDOW *msg_win; + WINDOW *menu_win; + MENU *menu; + ITEM *btns[btn_num+1]; + int i, x, y; + int res = -1; + + + va_start(ap, btn_num); + for (i = 0; i < btn_num; i++) { + btn = va_arg(ap, char *); + btns[i] = new_item(btn, ""); + btns_width += strlen(btn)+1; + } + va_end(ap); + btns[btn_num] = NULL; + + /* find the widest line of msg: */ + msg_lines = get_line_no(msg); + for (i = 0; i < msg_lines; i++) { + const char *line = get_line(msg, i); + int len = get_line_length(line); + if (msg_width < len) + msg_width = len; + } + + total_width = max(msg_width, btns_width); + /* place dialog in middle of screen */ + y = (getmaxy(stdscr)-(msg_lines+4))/2; + x = (getmaxx(stdscr)-(total_width+4))/2; + + + /* create the windows */ + if (btn_num > 0) + win_rows = msg_lines+4; + else + win_rows = msg_lines+2; + + win = newwin(win_rows, total_width+4, y, x); + keypad(win, TRUE); + menu_win = derwin(win, 1, btns_width, win_rows-2, + 1+(total_width+2-btns_width)/2); + menu = new_menu(btns); + msg_win = derwin(win, win_rows-2, msg_width, 1, + 1+(total_width+2-msg_width)/2); + + set_menu_fore(menu, attributes[DIALOG_MENU_FORE]); + set_menu_back(menu, attributes[DIALOG_MENU_BACK]); + + (void) wattrset(win, attributes[DIALOG_BOX]); + box(win, 0, 0); + + /* print message */ + (void) wattrset(msg_win, attributes[DIALOG_TEXT]); + fill_window(msg_win, msg); + + set_menu_win(menu, win); + set_menu_sub(menu, menu_win); + set_menu_format(menu, 1, btn_num); + menu_opts_off(menu, O_SHOWDESC); + menu_opts_off(menu, O_SHOWMATCH); + menu_opts_on(menu, O_ONEVALUE); + menu_opts_on(menu, O_NONCYCLIC); + set_menu_mark(menu, ""); + post_menu(menu); + + + touchwin(win); + refresh_all_windows(main_window); + while ((res = wgetch(win))) { + switch (res) { + case KEY_LEFT: + menu_driver(menu, REQ_LEFT_ITEM); + break; + case KEY_RIGHT: + menu_driver(menu, REQ_RIGHT_ITEM); + break; + case 10: /* ENTER */ + case 27: /* ESCAPE */ + case ' ': + case KEY_F(F_BACK): + case KEY_F(F_EXIT): + break; + } + touchwin(win); + refresh_all_windows(main_window); + + if (res == 10 || res == ' ') { + res = item_index(current_item(menu)); + break; + } else if (res == 27 || res == KEY_F(F_BACK) || + res == KEY_F(F_EXIT)) { + res = KEY_EXIT; + break; + } + } + + unpost_menu(menu); + free_menu(menu); + for (i = 0; i < btn_num; i++) + free_item(btns[i]); + + delwin(win); + return res; +} + +int dialog_inputbox(WINDOW *main_window, + const char *title, const char *prompt, + const char *init, char **resultp, int *result_len) +{ + int prompt_lines = 0; + int prompt_width = 0; + WINDOW *win; + WINDOW *prompt_win; + WINDOW *form_win; + PANEL *panel; + int i, x, y, lines, columns, win_lines, win_cols; + int res = -1; + int cursor_position = strlen(init); + int cursor_form_win; + char *result = *resultp; + + getmaxyx(stdscr, lines, columns); + + if (strlen(init)+1 > *result_len) { + *result_len = strlen(init)+1; + *resultp = result = xrealloc(result, *result_len); + } + + /* find the widest line of msg: */ + prompt_lines = get_line_no(prompt); + for (i = 0; i < prompt_lines; i++) { + const char *line = get_line(prompt, i); + int len = get_line_length(line); + prompt_width = max(prompt_width, len); + } + + if (title) + prompt_width = max(prompt_width, strlen(title)); + + win_lines = min(prompt_lines+6, lines-2); + win_cols = min(prompt_width+7, columns-2); + prompt_lines = max(win_lines-6, 0); + prompt_width = max(win_cols-7, 0); + + /* place dialog in middle of screen */ + y = (lines-win_lines)/2; + x = (columns-win_cols)/2; + + strncpy(result, init, *result_len); + + /* create the windows */ + win = newwin(win_lines, win_cols, y, x); + prompt_win = derwin(win, prompt_lines+1, prompt_width, 2, 2); + form_win = derwin(win, 1, prompt_width, prompt_lines+3, 2); + keypad(form_win, TRUE); + + (void) wattrset(form_win, attributes[INPUT_FIELD]); + + (void) wattrset(win, attributes[INPUT_BOX]); + box(win, 0, 0); + (void) wattrset(win, attributes[INPUT_HEADING]); + if (title) + mvwprintw(win, 0, 3, "%s", title); + + /* print message */ + (void) wattrset(prompt_win, attributes[INPUT_TEXT]); + fill_window(prompt_win, prompt); + + mvwprintw(form_win, 0, 0, "%*s", prompt_width, " "); + cursor_form_win = min(cursor_position, prompt_width-1); + mvwprintw(form_win, 0, 0, "%s", + result + cursor_position-cursor_form_win); + + /* create panels */ + panel = new_panel(win); + + /* show the cursor */ + curs_set(1); + + touchwin(win); + refresh_all_windows(main_window); + while ((res = wgetch(form_win))) { + int len = strlen(result); + switch (res) { + case 10: /* ENTER */ + case 27: /* ESCAPE */ + case KEY_F(F_HELP): + case KEY_F(F_EXIT): + case KEY_F(F_BACK): + break; + case 8: /* ^H */ + case 127: /* ^? */ + case KEY_BACKSPACE: + if (cursor_position > 0) { + memmove(&result[cursor_position-1], + &result[cursor_position], + len-cursor_position+1); + cursor_position--; + cursor_form_win--; + len--; + } + break; + case KEY_DC: + if (cursor_position >= 0 && cursor_position < len) { + memmove(&result[cursor_position], + &result[cursor_position+1], + len-cursor_position+1); + len--; + } + break; + case KEY_UP: + case KEY_RIGHT: + if (cursor_position < len) { + cursor_position++; + cursor_form_win++; + } + break; + case KEY_DOWN: + case KEY_LEFT: + if (cursor_position > 0) { + cursor_position--; + cursor_form_win--; + } + break; + case KEY_HOME: + cursor_position = 0; + cursor_form_win = 0; + break; + case KEY_END: + cursor_position = len; + cursor_form_win = min(cursor_position, prompt_width-1); + break; + default: + if ((isgraph(res) || isspace(res))) { + /* one for new char, one for '\0' */ + if (len+2 > *result_len) { + *result_len = len+2; + *resultp = result = realloc(result, + *result_len); + } + /* insert the char at the proper position */ + memmove(&result[cursor_position+1], + &result[cursor_position], + len-cursor_position+1); + result[cursor_position] = res; + cursor_position++; + cursor_form_win++; + len++; + } else { + mvprintw(0, 0, "unknown key: %d\n", res); + } + break; + } + if (cursor_form_win < 0) + cursor_form_win = 0; + else if (cursor_form_win > prompt_width-1) + cursor_form_win = prompt_width-1; + + wmove(form_win, 0, 0); + wclrtoeol(form_win); + mvwprintw(form_win, 0, 0, "%*s", prompt_width, " "); + mvwprintw(form_win, 0, 0, "%s", + result + cursor_position-cursor_form_win); + wmove(form_win, 0, cursor_form_win); + touchwin(win); + refresh_all_windows(main_window); + + if (res == 10) { + res = 0; + break; + } else if (res == 27 || res == KEY_F(F_BACK) || + res == KEY_F(F_EXIT)) { + res = KEY_EXIT; + break; + } else if (res == KEY_F(F_HELP)) { + res = 1; + break; + } + } + + /* hide the cursor */ + curs_set(0); + del_panel(panel); + delwin(prompt_win); + delwin(form_win); + delwin(win); + return res; +} + +/* refresh all windows in the correct order */ +void refresh_all_windows(WINDOW *main_window) +{ + update_panels(); + touchwin(main_window); + refresh(); +} + +/* layman's scrollable window... */ +void show_scroll_win(WINDOW *main_window, + const char *title, + const char *text) +{ + int res; + int total_lines = get_line_no(text); + int x, y, lines, columns; + int start_x = 0, start_y = 0; + int text_lines = 0, text_cols = 0; + int total_cols = 0; + int win_cols = 0; + int win_lines = 0; + int i = 0; + WINDOW *win; + WINDOW *pad; + PANEL *panel; + + getmaxyx(stdscr, lines, columns); + + /* find the widest line of msg: */ + total_lines = get_line_no(text); + for (i = 0; i < total_lines; i++) { + const char *line = get_line(text, i); + int len = get_line_length(line); + total_cols = max(total_cols, len+2); + } + + /* create the pad */ + pad = newpad(total_lines+10, total_cols+10); + (void) wattrset(pad, attributes[SCROLLWIN_TEXT]); + fill_window(pad, text); + + win_lines = min(total_lines+4, lines-2); + win_cols = min(total_cols+2, columns-2); + text_lines = max(win_lines-4, 0); + text_cols = max(win_cols-2, 0); + + /* place window in middle of screen */ + y = (lines-win_lines)/2; + x = (columns-win_cols)/2; + + win = newwin(win_lines, win_cols, y, x); + keypad(win, TRUE); + /* show the help in the help window, and show the help panel */ + (void) wattrset(win, attributes[SCROLLWIN_BOX]); + box(win, 0, 0); + (void) wattrset(win, attributes[SCROLLWIN_HEADING]); + mvwprintw(win, 0, 3, " %s ", title); + panel = new_panel(win); + + /* handle scrolling */ + do { + + copywin(pad, win, start_y, start_x, 2, 2, text_lines, + text_cols, 0); + print_in_middle(win, + text_lines+2, + 0, + text_cols, + "<OK>", + attributes[DIALOG_MENU_FORE]); + wrefresh(win); + + res = wgetch(win); + switch (res) { + case KEY_NPAGE: + case ' ': + case 'd': + start_y += text_lines-2; + break; + case KEY_PPAGE: + case 'u': + start_y -= text_lines+2; + break; + case KEY_HOME: + start_y = 0; + break; + case KEY_END: + start_y = total_lines-text_lines; + break; + case KEY_DOWN: + case 'j': + start_y++; + break; + case KEY_UP: + case 'k': + start_y--; + break; + case KEY_LEFT: + case 'h': + start_x--; + break; + case KEY_RIGHT: + case 'l': + start_x++; + break; + } + if (res == 10 || res == 27 || res == 'q' || + res == KEY_F(F_HELP) || res == KEY_F(F_BACK) || + res == KEY_F(F_EXIT)) + break; + if (start_y < 0) + start_y = 0; + if (start_y >= total_lines-text_lines) + start_y = total_lines-text_lines; + if (start_x < 0) + start_x = 0; + if (start_x >= total_cols-text_cols) + start_x = total_cols-text_cols; + } while (res); + + del_panel(panel); + delwin(win); + refresh_all_windows(main_window); +} diff --git a/src/net/scripts/kconfig/nconf.h b/src/net/scripts/kconfig/nconf.h new file mode 100644 index 0000000..fa5245e --- /dev/null +++ b/src/net/scripts/kconfig/nconf.h @@ -0,0 +1,92 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2008 Nir Tzachar <nir.tzachar@gmail.com> + * + * Derived from menuconfig. + */ + +#include <ctype.h> +#include <errno.h> +#include <fcntl.h> +#include <limits.h> +#include <stdarg.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <ncurses.h> +#include <menu.h> +#include <panel.h> +#include <form.h> + +#include <stdio.h> +#include <time.h> +#include <sys/time.h> + +#define max(a, b) ({\ + typeof(a) _a = a;\ + typeof(b) _b = b;\ + _a > _b ? _a : _b; }) + +#define min(a, b) ({\ + typeof(a) _a = a;\ + typeof(b) _b = b;\ + _a < _b ? _a : _b; }) + +typedef enum { + NORMAL = 1, + MAIN_HEADING, + MAIN_MENU_BOX, + MAIN_MENU_FORE, + MAIN_MENU_BACK, + MAIN_MENU_GREY, + MAIN_MENU_HEADING, + SCROLLWIN_TEXT, + SCROLLWIN_HEADING, + SCROLLWIN_BOX, + DIALOG_TEXT, + DIALOG_MENU_FORE, + DIALOG_MENU_BACK, + DIALOG_BOX, + INPUT_BOX, + INPUT_HEADING, + INPUT_TEXT, + INPUT_FIELD, + FUNCTION_TEXT, + FUNCTION_HIGHLIGHT, + ATTR_MAX +} attributes_t; +extern attributes_t attributes[]; + +typedef enum { + F_HELP = 1, + F_SYMBOL = 2, + F_INSTS = 3, + F_CONF = 4, + F_BACK = 5, + F_SAVE = 6, + F_LOAD = 7, + F_SEARCH = 8, + F_EXIT = 9, +} function_key; + +void set_colors(void); + +/* this changes the windows attributes !!! */ +void print_in_middle(WINDOW *win, + int starty, + int startx, + int width, + const char *string, + chtype color); +int get_line_length(const char *line); +int get_line_no(const char *text); +const char *get_line(const char *text, int line_no); +void fill_window(WINDOW *win, const char *text); +int btn_dialog(WINDOW *main_window, const char *msg, int btn_num, ...); +int dialog_inputbox(WINDOW *main_window, + const char *title, const char *prompt, + const char *init, char **resultp, int *result_len); +void refresh_all_windows(WINDOW *main_window); +void show_scroll_win(WINDOW *main_window, + const char *title, + const char *text); diff --git a/src/net/scripts/kconfig/parser.y b/src/net/scripts/kconfig/parser.y new file mode 100644 index 0000000..190f111 --- /dev/null +++ b/src/net/scripts/kconfig/parser.y @@ -0,0 +1,727 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + */ +%{ + +#include <ctype.h> +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdbool.h> + +#include "lkc.h" + +#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt) + +#define PRINTD 0x0001 +#define DEBUG_PARSE 0x0002 + +int cdebug = PRINTD; + +static void yyerror(const char *err); +static void zconfprint(const char *err, ...); +static void zconf_error(const char *err, ...); +static bool zconf_endtoken(const char *tokenname, + const char *expected_tokenname); + +struct symbol *symbol_hash[SYMBOL_HASHSIZE]; + +static struct menu *current_menu, *current_entry; + +%} + +%union +{ + char *string; + struct symbol *symbol; + struct expr *expr; + struct menu *menu; + enum symbol_type type; + enum variable_flavor flavor; +} + +%token <string> T_HELPTEXT +%token <string> T_WORD +%token <string> T_WORD_QUOTE +%token T_ALLNOCONFIG_Y +%token T_BOOL +%token T_CHOICE +%token T_CLOSE_PAREN +%token T_COLON_EQUAL +%token T_COMMENT +%token T_CONFIG +%token T_DEFAULT +%token T_DEFCONFIG_LIST +%token T_DEF_BOOL +%token T_DEF_TRISTATE +%token T_DEPENDS +%token T_ENDCHOICE +%token T_ENDIF +%token T_ENDMENU +%token T_HELP +%token T_HEX +%token T_IF +%token T_IMPLY +%token T_INT +%token T_MAINMENU +%token T_MENU +%token T_MENUCONFIG +%token T_MODULES +%token T_ON +%token T_OPEN_PAREN +%token T_OPTION +%token T_OPTIONAL +%token T_PLUS_EQUAL +%token T_PROMPT +%token T_RANGE +%token T_SELECT +%token T_SOURCE +%token T_STRING +%token T_TRISTATE +%token T_VISIBLE +%token T_EOL +%token <string> T_ASSIGN_VAL + +%left T_OR +%left T_AND +%left T_EQUAL T_UNEQUAL +%left T_LESS T_LESS_EQUAL T_GREATER T_GREATER_EQUAL +%nonassoc T_NOT + +%type <symbol> nonconst_symbol +%type <symbol> symbol +%type <type> type logic_type default +%type <expr> expr +%type <expr> if_expr +%type <string> end +%type <menu> if_entry menu_entry choice_entry +%type <string> word_opt assign_val +%type <flavor> assign_op + +%destructor { + fprintf(stderr, "%s:%d: missing end statement for this entry\n", + $$->file->name, $$->lineno); + if (current_menu == $$) + menu_end_menu(); +} if_entry menu_entry choice_entry + +%% +input: mainmenu_stmt stmt_list | stmt_list; + +/* mainmenu entry */ + +mainmenu_stmt: T_MAINMENU T_WORD_QUOTE T_EOL +{ + menu_add_prompt(P_MENU, $2, NULL); +}; + +stmt_list: + /* empty */ + | stmt_list assignment_stmt + | stmt_list choice_stmt + | stmt_list comment_stmt + | stmt_list config_stmt + | stmt_list if_stmt + | stmt_list menu_stmt + | stmt_list menuconfig_stmt + | stmt_list source_stmt + | stmt_list T_WORD error T_EOL { zconf_error("unknown statement \"%s\"", $2); } + | stmt_list error T_EOL { zconf_error("invalid statement"); } +; + +stmt_list_in_choice: + /* empty */ + | stmt_list_in_choice comment_stmt + | stmt_list_in_choice config_stmt + | stmt_list_in_choice if_stmt_in_choice + | stmt_list_in_choice error T_EOL { zconf_error("invalid statement"); } +; + +/* config/menuconfig entry */ + +config_entry_start: T_CONFIG nonconst_symbol T_EOL +{ + $2->flags |= SYMBOL_OPTIONAL; + menu_add_entry($2); + printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), $2->name); +}; + +config_stmt: config_entry_start config_option_list +{ + printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); +}; + +menuconfig_entry_start: T_MENUCONFIG nonconst_symbol T_EOL +{ + $2->flags |= SYMBOL_OPTIONAL; + menu_add_entry($2); + printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), $2->name); +}; + +menuconfig_stmt: menuconfig_entry_start config_option_list +{ + if (current_entry->prompt) + current_entry->prompt->type = P_MENU; + else + zconfprint("warning: menuconfig statement without prompt"); + printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); +}; + +config_option_list: + /* empty */ + | config_option_list config_option + | config_option_list depends + | config_option_list help +; + +config_option: type prompt_stmt_opt T_EOL +{ + menu_set_type($1); + printd(DEBUG_PARSE, "%s:%d:type(%u)\n", + zconf_curname(), zconf_lineno(), + $1); +}; + +config_option: T_PROMPT T_WORD_QUOTE if_expr T_EOL +{ + menu_add_prompt(P_PROMPT, $2, $3); + printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); +}; + +config_option: default expr if_expr T_EOL +{ + menu_add_expr(P_DEFAULT, $2, $3); + if ($1 != S_UNKNOWN) + menu_set_type($1); + printd(DEBUG_PARSE, "%s:%d:default(%u)\n", + zconf_curname(), zconf_lineno(), + $1); +}; + +config_option: T_SELECT nonconst_symbol if_expr T_EOL +{ + menu_add_symbol(P_SELECT, $2, $3); + printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno()); +}; + +config_option: T_IMPLY nonconst_symbol if_expr T_EOL +{ + menu_add_symbol(P_IMPLY, $2, $3); + printd(DEBUG_PARSE, "%s:%d:imply\n", zconf_curname(), zconf_lineno()); +}; + +config_option: T_RANGE symbol symbol if_expr T_EOL +{ + menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,$2, $3), $4); + printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno()); +}; + +config_option: T_OPTION T_MODULES T_EOL +{ + menu_add_option_modules(); +}; + +config_option: T_OPTION T_DEFCONFIG_LIST T_EOL +{ + menu_add_option_defconfig_list(); +}; + +config_option: T_OPTION T_ALLNOCONFIG_Y T_EOL +{ + menu_add_option_allnoconfig_y(); +}; + +/* choice entry */ + +choice: T_CHOICE word_opt T_EOL +{ + struct symbol *sym = sym_lookup($2, SYMBOL_CHOICE); + sym->flags |= SYMBOL_NO_WRITE; + menu_add_entry(sym); + menu_add_expr(P_CHOICE, NULL, NULL); + free($2); + printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno()); +}; + +choice_entry: choice choice_option_list +{ + $$ = menu_add_menu(); +}; + +choice_end: end +{ + if (zconf_endtoken($1, "choice")) { + menu_end_menu(); + printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno()); + } +}; + +choice_stmt: choice_entry stmt_list_in_choice choice_end +; + +choice_option_list: + /* empty */ + | choice_option_list choice_option + | choice_option_list depends + | choice_option_list help +; + +choice_option: T_PROMPT T_WORD_QUOTE if_expr T_EOL +{ + menu_add_prompt(P_PROMPT, $2, $3); + printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); +}; + +choice_option: logic_type prompt_stmt_opt T_EOL +{ + menu_set_type($1); + printd(DEBUG_PARSE, "%s:%d:type(%u)\n", + zconf_curname(), zconf_lineno(), $1); +}; + +choice_option: T_OPTIONAL T_EOL +{ + current_entry->sym->flags |= SYMBOL_OPTIONAL; + printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno()); +}; + +choice_option: T_DEFAULT nonconst_symbol if_expr T_EOL +{ + menu_add_symbol(P_DEFAULT, $2, $3); + printd(DEBUG_PARSE, "%s:%d:default\n", + zconf_curname(), zconf_lineno()); +}; + +type: + logic_type + | T_INT { $$ = S_INT; } + | T_HEX { $$ = S_HEX; } + | T_STRING { $$ = S_STRING; } + +logic_type: + T_BOOL { $$ = S_BOOLEAN; } + | T_TRISTATE { $$ = S_TRISTATE; } + +default: + T_DEFAULT { $$ = S_UNKNOWN; } + | T_DEF_BOOL { $$ = S_BOOLEAN; } + | T_DEF_TRISTATE { $$ = S_TRISTATE; } + +/* if entry */ + +if_entry: T_IF expr T_EOL +{ + printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno()); + menu_add_entry(NULL); + menu_add_dep($2); + $$ = menu_add_menu(); +}; + +if_end: end +{ + if (zconf_endtoken($1, "if")) { + menu_end_menu(); + printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno()); + } +}; + +if_stmt: if_entry stmt_list if_end +; + +if_stmt_in_choice: if_entry stmt_list_in_choice if_end +; + +/* menu entry */ + +menu: T_MENU T_WORD_QUOTE T_EOL +{ + menu_add_entry(NULL); + menu_add_prompt(P_MENU, $2, NULL); + printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno()); +}; + +menu_entry: menu menu_option_list +{ + $$ = menu_add_menu(); +}; + +menu_end: end +{ + if (zconf_endtoken($1, "menu")) { + menu_end_menu(); + printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno()); + } +}; + +menu_stmt: menu_entry stmt_list menu_end +; + +menu_option_list: + /* empty */ + | menu_option_list visible + | menu_option_list depends +; + +source_stmt: T_SOURCE T_WORD_QUOTE T_EOL +{ + printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2); + zconf_nextfile($2); + free($2); +}; + +/* comment entry */ + +comment: T_COMMENT T_WORD_QUOTE T_EOL +{ + menu_add_entry(NULL); + menu_add_prompt(P_COMMENT, $2, NULL); + printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno()); +}; + +comment_stmt: comment comment_option_list +; + +comment_option_list: + /* empty */ + | comment_option_list depends +; + +/* help option */ + +help_start: T_HELP T_EOL +{ + printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno()); + zconf_starthelp(); +}; + +help: help_start T_HELPTEXT +{ + if (current_entry->help) { + free(current_entry->help); + zconfprint("warning: '%s' defined with more than one help text -- only the last one will be used", + current_entry->sym->name ?: "<choice>"); + } + + /* Is the help text empty or all whitespace? */ + if ($2[strspn($2, " \f\n\r\t\v")] == '\0') + zconfprint("warning: '%s' defined with blank help text", + current_entry->sym->name ?: "<choice>"); + + current_entry->help = $2; +}; + +/* depends option */ + +depends: T_DEPENDS T_ON expr T_EOL +{ + menu_add_dep($3); + printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno()); +}; + +/* visibility option */ +visible: T_VISIBLE if_expr T_EOL +{ + menu_add_visibility($2); +}; + +/* prompt statement */ + +prompt_stmt_opt: + /* empty */ + | T_WORD_QUOTE if_expr +{ + menu_add_prompt(P_PROMPT, $1, $2); +}; + +end: T_ENDMENU T_EOL { $$ = "menu"; } + | T_ENDCHOICE T_EOL { $$ = "choice"; } + | T_ENDIF T_EOL { $$ = "if"; } +; + +if_expr: /* empty */ { $$ = NULL; } + | T_IF expr { $$ = $2; } +; + +expr: symbol { $$ = expr_alloc_symbol($1); } + | symbol T_LESS symbol { $$ = expr_alloc_comp(E_LTH, $1, $3); } + | symbol T_LESS_EQUAL symbol { $$ = expr_alloc_comp(E_LEQ, $1, $3); } + | symbol T_GREATER symbol { $$ = expr_alloc_comp(E_GTH, $1, $3); } + | symbol T_GREATER_EQUAL symbol { $$ = expr_alloc_comp(E_GEQ, $1, $3); } + | symbol T_EQUAL symbol { $$ = expr_alloc_comp(E_EQUAL, $1, $3); } + | symbol T_UNEQUAL symbol { $$ = expr_alloc_comp(E_UNEQUAL, $1, $3); } + | T_OPEN_PAREN expr T_CLOSE_PAREN { $$ = $2; } + | T_NOT expr { $$ = expr_alloc_one(E_NOT, $2); } + | expr T_OR expr { $$ = expr_alloc_two(E_OR, $1, $3); } + | expr T_AND expr { $$ = expr_alloc_two(E_AND, $1, $3); } +; + +/* For symbol definitions, selects, etc., where quotes are not accepted */ +nonconst_symbol: T_WORD { $$ = sym_lookup($1, 0); free($1); }; + +symbol: nonconst_symbol + | T_WORD_QUOTE { $$ = sym_lookup($1, SYMBOL_CONST); free($1); } +; + +word_opt: /* empty */ { $$ = NULL; } + | T_WORD + +/* assignment statement */ + +assignment_stmt: T_WORD assign_op assign_val T_EOL { variable_add($1, $3, $2); free($1); free($3); } + +assign_op: + T_EQUAL { $$ = VAR_RECURSIVE; } + | T_COLON_EQUAL { $$ = VAR_SIMPLE; } + | T_PLUS_EQUAL { $$ = VAR_APPEND; } +; + +assign_val: + /* empty */ { $$ = xstrdup(""); }; + | T_ASSIGN_VAL +; + +%% + +void conf_parse(const char *name) +{ + struct symbol *sym; + int i; + + zconf_initscan(name); + + _menu_init(); + + if (getenv("ZCONF_DEBUG")) + yydebug = 1; + yyparse(); + + /* Variables are expanded in the parse phase. We can free them here. */ + variable_all_del(); + + if (yynerrs) + exit(1); + if (!modules_sym) + modules_sym = sym_find( "n" ); + + if (!menu_has_prompt(&rootmenu)) { + current_entry = &rootmenu; + menu_add_prompt(P_MENU, "Main menu", NULL); + } + + menu_finalize(&rootmenu); + for_all_symbols(i, sym) { + if (sym_check_deps(sym)) + yynerrs++; + } + if (yynerrs) + exit(1); + sym_set_change_count(1); +} + +static bool zconf_endtoken(const char *tokenname, + const char *expected_tokenname) +{ + if (strcmp(tokenname, expected_tokenname)) { + zconf_error("unexpected '%s' within %s block", + tokenname, expected_tokenname); + yynerrs++; + return false; + } + if (current_menu->file != current_file) { + zconf_error("'%s' in different file than '%s'", + tokenname, expected_tokenname); + fprintf(stderr, "%s:%d: location of the '%s'\n", + current_menu->file->name, current_menu->lineno, + expected_tokenname); + yynerrs++; + return false; + } + return true; +} + +static void zconfprint(const char *err, ...) +{ + va_list ap; + + fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno()); + va_start(ap, err); + vfprintf(stderr, err, ap); + va_end(ap); + fprintf(stderr, "\n"); +} + +static void zconf_error(const char *err, ...) +{ + va_list ap; + + yynerrs++; + fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno()); + va_start(ap, err); + vfprintf(stderr, err, ap); + va_end(ap); + fprintf(stderr, "\n"); +} + +static void yyerror(const char *err) +{ + fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err); +} + +static void print_quoted_string(FILE *out, const char *str) +{ + const char *p; + int len; + + putc('"', out); + while ((p = strchr(str, '"'))) { + len = p - str; + if (len) + fprintf(out, "%.*s", len, str); + fputs("\\\"", out); + str = p + 1; + } + fputs(str, out); + putc('"', out); +} + +static void print_symbol(FILE *out, struct menu *menu) +{ + struct symbol *sym = menu->sym; + struct property *prop; + + if (sym_is_choice(sym)) + fprintf(out, "\nchoice\n"); + else + fprintf(out, "\nconfig %s\n", sym->name); + switch (sym->type) { + case S_BOOLEAN: + fputs(" bool\n", out); + break; + case S_TRISTATE: + fputs(" tristate\n", out); + break; + case S_STRING: + fputs(" string\n", out); + break; + case S_INT: + fputs(" integer\n", out); + break; + case S_HEX: + fputs(" hex\n", out); + break; + default: + fputs(" ???\n", out); + break; + } + for (prop = sym->prop; prop; prop = prop->next) { + if (prop->menu != menu) + continue; + switch (prop->type) { + case P_PROMPT: + fputs(" prompt ", out); + print_quoted_string(out, prop->text); + if (!expr_is_yes(prop->visible.expr)) { + fputs(" if ", out); + expr_fprint(prop->visible.expr, out); + } + fputc('\n', out); + break; + case P_DEFAULT: + fputs( " default ", out); + expr_fprint(prop->expr, out); + if (!expr_is_yes(prop->visible.expr)) { + fputs(" if ", out); + expr_fprint(prop->visible.expr, out); + } + fputc('\n', out); + break; + case P_CHOICE: + fputs(" #choice value\n", out); + break; + case P_SELECT: + fputs( " select ", out); + expr_fprint(prop->expr, out); + fputc('\n', out); + break; + case P_IMPLY: + fputs( " imply ", out); + expr_fprint(prop->expr, out); + fputc('\n', out); + break; + case P_RANGE: + fputs( " range ", out); + expr_fprint(prop->expr, out); + fputc('\n', out); + break; + case P_MENU: + fputs( " menu ", out); + print_quoted_string(out, prop->text); + fputc('\n', out); + break; + case P_SYMBOL: + fputs( " symbol ", out); + fprintf(out, "%s\n", prop->menu->sym->name); + break; + default: + fprintf(out, " unknown prop %d!\n", prop->type); + break; + } + } + if (menu->help) { + int len = strlen(menu->help); + while (menu->help[--len] == '\n') + menu->help[len] = 0; + fprintf(out, " help\n%s\n", menu->help); + } +} + +void zconfdump(FILE *out) +{ + struct property *prop; + struct symbol *sym; + struct menu *menu; + + menu = rootmenu.list; + while (menu) { + if ((sym = menu->sym)) + print_symbol(out, menu); + else if ((prop = menu->prompt)) { + switch (prop->type) { + case P_COMMENT: + fputs("\ncomment ", out); + print_quoted_string(out, prop->text); + fputs("\n", out); + break; + case P_MENU: + fputs("\nmenu ", out); + print_quoted_string(out, prop->text); + fputs("\n", out); + break; + default: + ; + } + if (!expr_is_yes(prop->visible.expr)) { + fputs(" depends ", out); + expr_fprint(prop->visible.expr, out); + fputc('\n', out); + } + } + + if (menu->list) + menu = menu->list; + else if (menu->next) + menu = menu->next; + else while ((menu = menu->parent)) { + if (menu->prompt && menu->prompt->type == P_MENU) + fputs("\nendmenu\n", out); + if (menu->next) { + menu = menu->next; + break; + } + } + } +} + +#include "menu.c" diff --git a/src/net/scripts/kconfig/preprocess.c b/src/net/scripts/kconfig/preprocess.c new file mode 100644 index 0000000..748da57 --- /dev/null +++ b/src/net/scripts/kconfig/preprocess.c @@ -0,0 +1,574 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (C) 2018 Masahiro Yamada <yamada.masahiro@socionext.com> + +#include <ctype.h> +#include <stdarg.h> +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "list.h" +#include "lkc.h" + +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) + +static char *expand_string_with_args(const char *in, int argc, char *argv[]); +static char *expand_string(const char *in); + +static void __attribute__((noreturn)) pperror(const char *format, ...) +{ + va_list ap; + + fprintf(stderr, "%s:%d: ", current_file->name, yylineno); + va_start(ap, format); + vfprintf(stderr, format, ap); + va_end(ap); + fprintf(stderr, "\n"); + + exit(1); +} + +/* + * Environment variables + */ +static LIST_HEAD(env_list); + +struct env { + char *name; + char *value; + struct list_head node; +}; + +static void env_add(const char *name, const char *value) +{ + struct env *e; + + e = xmalloc(sizeof(*e)); + e->name = xstrdup(name); + e->value = xstrdup(value); + + list_add_tail(&e->node, &env_list); +} + +static void env_del(struct env *e) +{ + list_del(&e->node); + free(e->name); + free(e->value); + free(e); +} + +/* The returned pointer must be freed when done */ +static char *env_expand(const char *name) +{ + struct env *e; + const char *value; + + if (!*name) + return NULL; + + list_for_each_entry(e, &env_list, node) { + if (!strcmp(name, e->name)) + return xstrdup(e->value); + } + + value = getenv(name); + if (!value) + return NULL; + + /* + * We need to remember all referenced environment variables. + * They will be written out to include/config/auto.conf.cmd + */ + env_add(name, value); + + return xstrdup(value); +} + +void env_write_dep(FILE *f, const char *autoconfig_name) +{ + struct env *e, *tmp; + + list_for_each_entry_safe(e, tmp, &env_list, node) { + fprintf(f, "ifneq \"$(%s)\" \"%s\"\n", e->name, e->value); + fprintf(f, "%s: FORCE\n", autoconfig_name); + fprintf(f, "endif\n"); + env_del(e); + } +} + +/* + * Built-in functions + */ +struct function { + const char *name; + unsigned int min_args; + unsigned int max_args; + char *(*func)(int argc, char *argv[]); +}; + +static char *do_error_if(int argc, char *argv[]) +{ + if (!strcmp(argv[0], "y")) + pperror("%s", argv[1]); + + return xstrdup(""); +} + +static char *do_filename(int argc, char *argv[]) +{ + return xstrdup(current_file->name); +} + +static char *do_info(int argc, char *argv[]) +{ + printf("%s\n", argv[0]); + + return xstrdup(""); +} + +static char *do_lineno(int argc, char *argv[]) +{ + char buf[16]; + + sprintf(buf, "%d", yylineno); + + return xstrdup(buf); +} + +static char *do_shell(int argc, char *argv[]) +{ + FILE *p; + char buf[4096]; + char *cmd; + size_t nread; + int i; + + cmd = argv[0]; + + p = popen(cmd, "r"); + if (!p) { + perror(cmd); + exit(1); + } + + nread = fread(buf, 1, sizeof(buf), p); + if (nread == sizeof(buf)) + nread--; + + /* remove trailing new lines */ + while (nread > 0 && buf[nread - 1] == '\n') + nread--; + + buf[nread] = 0; + + /* replace a new line with a space */ + for (i = 0; i < nread; i++) { + if (buf[i] == '\n') + buf[i] = ' '; + } + + if (pclose(p) == -1) { + perror(cmd); + exit(1); + } + + return xstrdup(buf); +} + +static char *do_warning_if(int argc, char *argv[]) +{ + if (!strcmp(argv[0], "y")) + fprintf(stderr, "%s:%d: %s\n", + current_file->name, yylineno, argv[1]); + + return xstrdup(""); +} + +static const struct function function_table[] = { + /* Name MIN MAX Function */ + { "error-if", 2, 2, do_error_if }, + { "filename", 0, 0, do_filename }, + { "info", 1, 1, do_info }, + { "lineno", 0, 0, do_lineno }, + { "shell", 1, 1, do_shell }, + { "warning-if", 2, 2, do_warning_if }, +}; + +#define FUNCTION_MAX_ARGS 16 + +static char *function_expand(const char *name, int argc, char *argv[]) +{ + const struct function *f; + int i; + + for (i = 0; i < ARRAY_SIZE(function_table); i++) { + f = &function_table[i]; + if (strcmp(f->name, name)) + continue; + + if (argc < f->min_args) + pperror("too few function arguments passed to '%s'", + name); + + if (argc > f->max_args) + pperror("too many function arguments passed to '%s'", + name); + + return f->func(argc, argv); + } + + return NULL; +} + +/* + * Variables (and user-defined functions) + */ +static LIST_HEAD(variable_list); + +struct variable { + char *name; + char *value; + enum variable_flavor flavor; + int exp_count; + struct list_head node; +}; + +static struct variable *variable_lookup(const char *name) +{ + struct variable *v; + + list_for_each_entry(v, &variable_list, node) { + if (!strcmp(name, v->name)) + return v; + } + + return NULL; +} + +static char *variable_expand(const char *name, int argc, char *argv[]) +{ + struct variable *v; + char *res; + + v = variable_lookup(name); + if (!v) + return NULL; + + if (argc == 0 && v->exp_count) + pperror("Recursive variable '%s' references itself (eventually)", + name); + + if (v->exp_count > 1000) + pperror("Too deep recursive expansion"); + + v->exp_count++; + + if (v->flavor == VAR_RECURSIVE) + res = expand_string_with_args(v->value, argc, argv); + else + res = xstrdup(v->value); + + v->exp_count--; + + return res; +} + +void variable_add(const char *name, const char *value, + enum variable_flavor flavor) +{ + struct variable *v; + char *new_value; + bool append = false; + + v = variable_lookup(name); + if (v) { + /* For defined variables, += inherits the existing flavor */ + if (flavor == VAR_APPEND) { + flavor = v->flavor; + append = true; + } else { + free(v->value); + } + } else { + /* For undefined variables, += assumes the recursive flavor */ + if (flavor == VAR_APPEND) + flavor = VAR_RECURSIVE; + + v = xmalloc(sizeof(*v)); + v->name = xstrdup(name); + v->exp_count = 0; + list_add_tail(&v->node, &variable_list); + } + + v->flavor = flavor; + + if (flavor == VAR_SIMPLE) + new_value = expand_string(value); + else + new_value = xstrdup(value); + + if (append) { + v->value = xrealloc(v->value, + strlen(v->value) + strlen(new_value) + 2); + strcat(v->value, " "); + strcat(v->value, new_value); + free(new_value); + } else { + v->value = new_value; + } +} + +static void variable_del(struct variable *v) +{ + list_del(&v->node); + free(v->name); + free(v->value); + free(v); +} + +void variable_all_del(void) +{ + struct variable *v, *tmp; + + list_for_each_entry_safe(v, tmp, &variable_list, node) + variable_del(v); +} + +/* + * Evaluate a clause with arguments. argc/argv are arguments from the upper + * function call. + * + * Returned string must be freed when done + */ +static char *eval_clause(const char *str, size_t len, int argc, char *argv[]) +{ + char *tmp, *name, *res, *endptr, *prev, *p; + int new_argc = 0; + char *new_argv[FUNCTION_MAX_ARGS]; + int nest = 0; + int i; + unsigned long n; + + tmp = xstrndup(str, len); + + /* + * If variable name is '1', '2', etc. It is generally an argument + * from a user-function call (i.e. local-scope variable). If not + * available, then look-up global-scope variables. + */ + n = strtoul(tmp, &endptr, 10); + if (!*endptr && n > 0 && n <= argc) { + res = xstrdup(argv[n - 1]); + goto free_tmp; + } + + prev = p = tmp; + + /* + * Split into tokens + * The function name and arguments are separated by a comma. + * For example, if the function call is like this: + * $(foo,$(x),$(y)) + * + * The input string for this helper should be: + * foo,$(x),$(y) + * + * and split into: + * new_argv[0] = 'foo' + * new_argv[1] = '$(x)' + * new_argv[2] = '$(y)' + */ + while (*p) { + if (nest == 0 && *p == ',') { + *p = 0; + if (new_argc >= FUNCTION_MAX_ARGS) + pperror("too many function arguments"); + new_argv[new_argc++] = prev; + prev = p + 1; + } else if (*p == '(') { + nest++; + } else if (*p == ')') { + nest--; + } + + p++; + } + new_argv[new_argc++] = prev; + + /* + * Shift arguments + * new_argv[0] represents a function name or a variable name. Put it + * into 'name', then shift the rest of the arguments. This simplifies + * 'const' handling. + */ + name = expand_string_with_args(new_argv[0], argc, argv); + new_argc--; + for (i = 0; i < new_argc; i++) + new_argv[i] = expand_string_with_args(new_argv[i + 1], + argc, argv); + + /* Search for variables */ + res = variable_expand(name, new_argc, new_argv); + if (res) + goto free; + + /* Look for built-in functions */ + res = function_expand(name, new_argc, new_argv); + if (res) + goto free; + + /* Last, try environment variable */ + if (new_argc == 0) { + res = env_expand(name); + if (res) + goto free; + } + + res = xstrdup(""); +free: + for (i = 0; i < new_argc; i++) + free(new_argv[i]); + free(name); +free_tmp: + free(tmp); + + return res; +} + +/* + * Expand a string that follows '$' + * + * For example, if the input string is + * ($(FOO)$($(BAR)))$(BAZ) + * this helper evaluates + * $($(FOO)$($(BAR))) + * and returns a new string containing the expansion (note that the string is + * recursively expanded), also advancing 'str' to point to the next character + * after the corresponding closing parenthesis, in this case, *str will be + * $(BAR) + */ +static char *expand_dollar_with_args(const char **str, int argc, char *argv[]) +{ + const char *p = *str; + const char *q; + int nest = 0; + + /* + * In Kconfig, variable/function references always start with "$(". + * Neither single-letter variables as in $A nor curly braces as in ${CC} + * are supported. '$' not followed by '(' loses its special meaning. + */ + if (*p != '(') { + *str = p; + return xstrdup("$"); + } + + p++; + q = p; + while (*q) { + if (*q == '(') { + nest++; + } else if (*q == ')') { + if (nest-- == 0) + break; + } + q++; + } + + if (!*q) + pperror("unterminated reference to '%s': missing ')'", p); + + /* Advance 'str' to after the expanded initial portion of the string */ + *str = q + 1; + + return eval_clause(p, q - p, argc, argv); +} + +char *expand_dollar(const char **str) +{ + return expand_dollar_with_args(str, 0, NULL); +} + +static char *__expand_string(const char **str, bool (*is_end)(char c), + int argc, char *argv[]) +{ + const char *in, *p; + char *expansion, *out; + size_t in_len, out_len; + + out = xmalloc(1); + *out = 0; + out_len = 1; + + p = in = *str; + + while (1) { + if (*p == '$') { + in_len = p - in; + p++; + expansion = expand_dollar_with_args(&p, argc, argv); + out_len += in_len + strlen(expansion); + out = xrealloc(out, out_len); + strncat(out, in, in_len); + strcat(out, expansion); + free(expansion); + in = p; + continue; + } + + if (is_end(*p)) + break; + + p++; + } + + in_len = p - in; + out_len += in_len; + out = xrealloc(out, out_len); + strncat(out, in, in_len); + + /* Advance 'str' to the end character */ + *str = p; + + return out; +} + +static bool is_end_of_str(char c) +{ + return !c; +} + +/* + * Expand variables and functions in the given string. Undefined variables + * expand to an empty string. + * The returned string must be freed when done. + */ +static char *expand_string_with_args(const char *in, int argc, char *argv[]) +{ + return __expand_string(&in, is_end_of_str, argc, argv); +} + +static char *expand_string(const char *in) +{ + return expand_string_with_args(in, 0, NULL); +} + +static bool is_end_of_token(char c) +{ + return !(isalnum(c) || c == '_' || c == '-'); +} + +/* + * Expand variables in a token. The parsing stops when a token separater + * (in most cases, it is a whitespace) is encountered. 'str' is updated to + * point to the next character. + * + * The returned string must be freed when done. + */ +char *expand_one_token(const char **str) +{ + return __expand_string(str, is_end_of_token, 0, NULL); +} diff --git a/src/net/scripts/kconfig/qconf-cfg.sh b/src/net/scripts/kconfig/qconf-cfg.sh new file mode 100755 index 0000000..02ccc0a --- /dev/null +++ b/src/net/scripts/kconfig/qconf-cfg.sh @@ -0,0 +1,32 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 + +PKG="Qt5Core Qt5Gui Qt5Widgets" +PKG2="QtCore QtGui" + +if [ -z "$(command -v pkg-config)" ]; then + echo >&2 "*" + echo >&2 "* 'make xconfig' requires 'pkg-config'. Please install it." + echo >&2 "*" + exit 1 +fi + +if pkg-config --exists $PKG; then + echo cflags=\"-std=c++11 -fPIC $(pkg-config --cflags Qt5Core Qt5Gui Qt5Widgets)\" + echo libs=\"$(pkg-config --libs $PKG)\" + echo moc=\"$(pkg-config --variable=host_bins Qt5Core)/moc\" + exit 0 +fi + +if pkg-config --exists $PKG2; then + echo cflags=\"$(pkg-config --cflags $PKG2)\" + echo libs=\"$(pkg-config --libs $PKG2)\" + echo moc=\"$(pkg-config --variable=moc_location QtCore)\" + exit 0 +fi + +echo >&2 "*" +echo >&2 "* Could not find Qt via pkg-config." +echo >&2 "* Please install either Qt 4.8 or 5.x. and make sure it's in PKG_CONFIG_PATH" +echo >&2 "*" +exit 1 diff --git a/src/net/scripts/kconfig/qconf.cc b/src/net/scripts/kconfig/qconf.cc new file mode 100644 index 0000000..f7eb093 --- /dev/null +++ b/src/net/scripts/kconfig/qconf.cc @@ -0,0 +1,1892 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + * Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com> + */ + +#include <QAction> +#include <QApplication> +#include <QCloseEvent> +#include <QDebug> +#include <QDesktopWidget> +#include <QFileDialog> +#include <QLabel> +#include <QLayout> +#include <QList> +#include <QMenu> +#include <QMenuBar> +#include <QMessageBox> +#include <QToolBar> + +#include <stdlib.h> + +#include "lkc.h" +#include "qconf.h" + +#include "images.h" + + +static QApplication *configApp; +static ConfigSettings *configSettings; + +QAction *ConfigMainWindow::saveAction; + +ConfigSettings::ConfigSettings() + : QSettings("kernel.org", "qconf") +{ +} + +/** + * Reads a list of integer values from the application settings. + */ +QList<int> ConfigSettings::readSizes(const QString& key, bool *ok) +{ + QList<int> result; + + if (contains(key)) + { + QStringList entryList = value(key).toStringList(); + QStringList::Iterator it; + + for (it = entryList.begin(); it != entryList.end(); ++it) + result.push_back((*it).toInt()); + + *ok = true; + } + else + *ok = false; + + return result; +} + +/** + * Writes a list of integer values to the application settings. + */ +bool ConfigSettings::writeSizes(const QString& key, const QList<int>& value) +{ + QStringList stringList; + QList<int>::ConstIterator it; + + for (it = value.begin(); it != value.end(); ++it) + stringList.push_back(QString::number(*it)); + setValue(key, stringList); + + return true; +} + +QIcon ConfigItem::symbolYesIcon; +QIcon ConfigItem::symbolModIcon; +QIcon ConfigItem::symbolNoIcon; +QIcon ConfigItem::choiceYesIcon; +QIcon ConfigItem::choiceNoIcon; +QIcon ConfigItem::menuIcon; +QIcon ConfigItem::menubackIcon; + +/* + * update the displayed of a menu entry + */ +void ConfigItem::updateMenu(void) +{ + ConfigList* list; + struct symbol* sym; + struct property *prop; + QString prompt; + int type; + tristate expr; + + list = listView(); + if (goParent) { + setIcon(promptColIdx, menubackIcon); + prompt = ".."; + goto set_prompt; + } + + sym = menu->sym; + prop = menu->prompt; + prompt = menu_get_prompt(menu); + + if (prop) switch (prop->type) { + case P_MENU: + if (list->mode == singleMode || list->mode == symbolMode) { + /* a menuconfig entry is displayed differently + * depending whether it's at the view root or a child. + */ + if (sym && list->rootEntry == menu) + break; + setIcon(promptColIdx, menuIcon); + } else { + if (sym) + break; + setIcon(promptColIdx, QIcon()); + } + goto set_prompt; + case P_COMMENT: + setIcon(promptColIdx, QIcon()); + goto set_prompt; + default: + ; + } + if (!sym) + goto set_prompt; + + setText(nameColIdx, sym->name); + + type = sym_get_type(sym); + switch (type) { + case S_BOOLEAN: + case S_TRISTATE: + char ch; + + if (!sym_is_changeable(sym) && list->optMode == normalOpt) { + setIcon(promptColIdx, QIcon()); + break; + } + expr = sym_get_tristate_value(sym); + switch (expr) { + case yes: + if (sym_is_choice_value(sym) && type == S_BOOLEAN) + setIcon(promptColIdx, choiceYesIcon); + else + setIcon(promptColIdx, symbolYesIcon); + ch = 'Y'; + break; + case mod: + setIcon(promptColIdx, symbolModIcon); + ch = 'M'; + break; + default: + if (sym_is_choice_value(sym) && type == S_BOOLEAN) + setIcon(promptColIdx, choiceNoIcon); + else + setIcon(promptColIdx, symbolNoIcon); + ch = 'N'; + break; + } + + setText(dataColIdx, QChar(ch)); + break; + case S_INT: + case S_HEX: + case S_STRING: + setText(dataColIdx, sym_get_string_value(sym)); + break; + } + if (!sym_has_value(sym) && visible) + prompt += " (NEW)"; +set_prompt: + setText(promptColIdx, prompt); +} + +void ConfigItem::testUpdateMenu(bool v) +{ + ConfigItem* i; + + visible = v; + if (!menu) + return; + + sym_calc_value(menu->sym); + if (menu->flags & MENU_CHANGED) { + /* the menu entry changed, so update all list items */ + menu->flags &= ~MENU_CHANGED; + for (i = (ConfigItem*)menu->data; i; i = i->nextItem) + i->updateMenu(); + } else if (listView()->updateAll) + updateMenu(); +} + + +/* + * construct a menu entry + */ +void ConfigItem::init(void) +{ + if (menu) { + ConfigList* list = listView(); + nextItem = (ConfigItem*)menu->data; + menu->data = this; + + if (list->mode != fullMode) + setExpanded(true); + sym_calc_value(menu->sym); + + if (menu->sym) { + enum symbol_type type = menu->sym->type; + + // Allow to edit "int", "hex", and "string" in-place in + // the data column. Unfortunately, you cannot specify + // the flags per column. Set ItemIsEditable for all + // columns here, and check the column in createEditor(). + if (type == S_INT || type == S_HEX || type == S_STRING) + setFlags(flags() | Qt::ItemIsEditable); + } + } + updateMenu(); +} + +/* + * destruct a menu entry + */ +ConfigItem::~ConfigItem(void) +{ + if (menu) { + ConfigItem** ip = (ConfigItem**)&menu->data; + for (; *ip; ip = &(*ip)->nextItem) { + if (*ip == this) { + *ip = nextItem; + break; + } + } + } +} + +QWidget *ConfigItemDelegate::createEditor(QWidget *parent, + const QStyleOptionViewItem &option, + const QModelIndex &index) const +{ + ConfigItem *item; + + // Only the data column is editable + if (index.column() != dataColIdx) + return nullptr; + + // You cannot edit invisible menus + item = static_cast<ConfigItem *>(index.internalPointer()); + if (!item || !item->menu || !menu_is_visible(item->menu)) + return nullptr; + + return QStyledItemDelegate::createEditor(parent, option, index); +} + +void ConfigItemDelegate::setModelData(QWidget *editor, + QAbstractItemModel *model, + const QModelIndex &index) const +{ + QLineEdit *lineEdit; + ConfigItem *item; + struct symbol *sym; + bool success; + + lineEdit = qobject_cast<QLineEdit *>(editor); + // If this is not a QLineEdit, use the parent's default. + // (does this happen?) + if (!lineEdit) + goto parent; + + item = static_cast<ConfigItem *>(index.internalPointer()); + if (!item || !item->menu) + goto parent; + + sym = item->menu->sym; + if (!sym) + goto parent; + + success = sym_set_string_value(sym, lineEdit->text().toUtf8().data()); + if (success) { + ConfigList::updateListForAll(); + } else { + QMessageBox::information(editor, "qconf", + "Cannot set the data (maybe due to out of range).\n" + "Setting the old value."); + lineEdit->setText(sym_get_string_value(sym)); + } + +parent: + QStyledItemDelegate::setModelData(editor, model, index); +} + +ConfigList::ConfigList(QWidget *parent, const char *name) + : QTreeWidget(parent), + updateAll(false), + showName(false), mode(singleMode), optMode(normalOpt), + rootEntry(0), headerPopup(0) +{ + setObjectName(name); + setSortingEnabled(false); + setRootIsDecorated(true); + + setVerticalScrollMode(ScrollPerPixel); + setHorizontalScrollMode(ScrollPerPixel); + + setHeaderLabels(QStringList() << "Option" << "Name" << "Value"); + + connect(this, SIGNAL(itemSelectionChanged(void)), + SLOT(updateSelection(void))); + + if (name) { + configSettings->beginGroup(name); + showName = configSettings->value("/showName", false).toBool(); + optMode = (enum optionMode)configSettings->value("/optionMode", 0).toInt(); + configSettings->endGroup(); + connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); + } + + showColumn(promptColIdx); + + setItemDelegate(new ConfigItemDelegate(this)); + + allLists.append(this); + + reinit(); +} + +ConfigList::~ConfigList() +{ + allLists.removeOne(this); +} + +bool ConfigList::menuSkip(struct menu *menu) +{ + if (optMode == normalOpt && menu_is_visible(menu)) + return false; + if (optMode == promptOpt && menu_has_prompt(menu)) + return false; + if (optMode == allOpt) + return false; + return true; +} + +void ConfigList::reinit(void) +{ + hideColumn(nameColIdx); + + if (showName) + showColumn(nameColIdx); + + updateListAll(); +} + +void ConfigList::setOptionMode(QAction *action) +{ + if (action == showNormalAction) + optMode = normalOpt; + else if (action == showAllAction) + optMode = allOpt; + else + optMode = promptOpt; + + updateListAll(); +} + +void ConfigList::saveSettings(void) +{ + if (!objectName().isEmpty()) { + configSettings->beginGroup(objectName()); + configSettings->setValue("/showName", showName); + configSettings->setValue("/optionMode", (int)optMode); + configSettings->endGroup(); + } +} + +ConfigItem* ConfigList::findConfigItem(struct menu *menu) +{ + ConfigItem* item = (ConfigItem*)menu->data; + + for (; item; item = item->nextItem) { + if (this == item->listView()) + break; + } + + return item; +} + +void ConfigList::updateSelection(void) +{ + struct menu *menu; + enum prop_type type; + + if (selectedItems().count() == 0) + return; + + ConfigItem* item = (ConfigItem*)selectedItems().first(); + if (!item) + return; + + menu = item->menu; + emit menuChanged(menu); + if (!menu) + return; + type = menu->prompt ? menu->prompt->type : P_UNKNOWN; + if (mode == menuMode && type == P_MENU) + emit menuSelected(menu); +} + +void ConfigList::updateList() +{ + ConfigItem* last = 0; + ConfigItem *item; + + if (!rootEntry) { + if (mode != listMode) + goto update; + QTreeWidgetItemIterator it(this); + + while (*it) { + item = (ConfigItem*)(*it); + if (!item->menu) + continue; + item->testUpdateMenu(menu_is_visible(item->menu)); + + ++it; + } + return; + } + + if (rootEntry != &rootmenu && (mode == singleMode || + (mode == symbolMode && rootEntry->parent != &rootmenu))) { + item = (ConfigItem *)topLevelItem(0); + if (!item) + item = new ConfigItem(this, 0, true); + last = item; + } + if ((mode == singleMode || (mode == symbolMode && !(rootEntry->flags & MENU_ROOT))) && + rootEntry->sym && rootEntry->prompt) { + item = last ? last->nextSibling() : nullptr; + if (!item) + item = new ConfigItem(this, last, rootEntry, true); + else + item->testUpdateMenu(true); + + updateMenuList(item, rootEntry); + update(); + resizeColumnToContents(0); + return; + } +update: + updateMenuList(rootEntry); + update(); + resizeColumnToContents(0); +} + +void ConfigList::updateListForAll() +{ + QListIterator<ConfigList *> it(allLists); + + while (it.hasNext()) { + ConfigList *list = it.next(); + + list->updateList(); + } +} + +void ConfigList::updateListAllForAll() +{ + QListIterator<ConfigList *> it(allLists); + + while (it.hasNext()) { + ConfigList *list = it.next(); + + list->updateList(); + } +} + +void ConfigList::setValue(ConfigItem* item, tristate val) +{ + struct symbol* sym; + int type; + tristate oldval; + + sym = item->menu ? item->menu->sym : 0; + if (!sym) + return; + + type = sym_get_type(sym); + switch (type) { + case S_BOOLEAN: + case S_TRISTATE: + oldval = sym_get_tristate_value(sym); + + if (!sym_set_tristate_value(sym, val)) + return; + if (oldval == no && item->menu->list) + item->setExpanded(true); + ConfigList::updateListForAll(); + break; + } +} + +void ConfigList::changeValue(ConfigItem* item) +{ + struct symbol* sym; + struct menu* menu; + int type, oldexpr, newexpr; + + menu = item->menu; + if (!menu) + return; + sym = menu->sym; + if (!sym) { + if (item->menu->list) + item->setExpanded(!item->isExpanded()); + return; + } + + type = sym_get_type(sym); + switch (type) { + case S_BOOLEAN: + case S_TRISTATE: + oldexpr = sym_get_tristate_value(sym); + newexpr = sym_toggle_tristate_value(sym); + if (item->menu->list) { + if (oldexpr == newexpr) + item->setExpanded(!item->isExpanded()); + else if (oldexpr == no) + item->setExpanded(true); + } + if (oldexpr != newexpr) + ConfigList::updateListForAll(); + break; + default: + break; + } +} + +void ConfigList::setRootMenu(struct menu *menu) +{ + enum prop_type type; + + if (rootEntry == menu) + return; + type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN; + if (type != P_MENU) + return; + updateMenuList(0); + rootEntry = menu; + updateListAll(); + if (currentItem()) { + setSelected(currentItem(), hasFocus()); + scrollToItem(currentItem()); + } +} + +void ConfigList::setParentMenu(void) +{ + ConfigItem* item; + struct menu *oldroot; + + oldroot = rootEntry; + if (rootEntry == &rootmenu) + return; + setRootMenu(menu_get_parent_menu(rootEntry->parent)); + + QTreeWidgetItemIterator it(this); + while (*it) { + item = (ConfigItem *)(*it); + if (item->menu == oldroot) { + setCurrentItem(item); + scrollToItem(item); + break; + } + + ++it; + } +} + +/* + * update all the children of a menu entry + * removes/adds the entries from the parent widget as necessary + * + * parent: either the menu list widget or a menu entry widget + * menu: entry to be updated + */ +void ConfigList::updateMenuList(ConfigItem *parent, struct menu* menu) +{ + struct menu* child; + ConfigItem* item; + ConfigItem* last; + bool visible; + enum prop_type type; + + if (!menu) { + while (parent->childCount() > 0) + { + delete parent->takeChild(0); + } + + return; + } + + last = parent->firstChild(); + if (last && !last->goParent) + last = 0; + for (child = menu->list; child; child = child->next) { + item = last ? last->nextSibling() : parent->firstChild(); + type = child->prompt ? child->prompt->type : P_UNKNOWN; + + switch (mode) { + case menuMode: + if (!(child->flags & MENU_ROOT)) + goto hide; + break; + case symbolMode: + if (child->flags & MENU_ROOT) + goto hide; + break; + default: + break; + } + + visible = menu_is_visible(child); + if (!menuSkip(child)) { + if (!child->sym && !child->list && !child->prompt) + continue; + if (!item || item->menu != child) + item = new ConfigItem(parent, last, child, visible); + else + item->testUpdateMenu(visible); + + if (mode == fullMode || mode == menuMode || type != P_MENU) + updateMenuList(item, child); + else + updateMenuList(item, 0); + last = item; + continue; + } +hide: + if (item && item->menu == child) { + last = parent->firstChild(); + if (last == item) + last = 0; + else while (last->nextSibling() != item) + last = last->nextSibling(); + delete item; + } + } +} + +void ConfigList::updateMenuList(struct menu *menu) +{ + struct menu* child; + ConfigItem* item; + ConfigItem* last; + bool visible; + enum prop_type type; + + if (!menu) { + while (topLevelItemCount() > 0) + { + delete takeTopLevelItem(0); + } + + return; + } + + last = (ConfigItem *)topLevelItem(0); + if (last && !last->goParent) + last = 0; + for (child = menu->list; child; child = child->next) { + item = last ? last->nextSibling() : (ConfigItem *)topLevelItem(0); + type = child->prompt ? child->prompt->type : P_UNKNOWN; + + switch (mode) { + case menuMode: + if (!(child->flags & MENU_ROOT)) + goto hide; + break; + case symbolMode: + if (child->flags & MENU_ROOT) + goto hide; + break; + default: + break; + } + + visible = menu_is_visible(child); + if (!menuSkip(child)) { + if (!child->sym && !child->list && !child->prompt) + continue; + if (!item || item->menu != child) + item = new ConfigItem(this, last, child, visible); + else + item->testUpdateMenu(visible); + + if (mode == fullMode || mode == menuMode || type != P_MENU) + updateMenuList(item, child); + else + updateMenuList(item, 0); + last = item; + continue; + } +hide: + if (item && item->menu == child) { + last = (ConfigItem *)topLevelItem(0); + if (last == item) + last = 0; + else while (last->nextSibling() != item) + last = last->nextSibling(); + delete item; + } + } +} + +void ConfigList::keyPressEvent(QKeyEvent* ev) +{ + QTreeWidgetItem* i = currentItem(); + ConfigItem* item; + struct menu *menu; + enum prop_type type; + + if (ev->key() == Qt::Key_Escape && mode != fullMode && mode != listMode) { + emit parentSelected(); + ev->accept(); + return; + } + + if (!i) { + Parent::keyPressEvent(ev); + return; + } + item = (ConfigItem*)i; + + switch (ev->key()) { + case Qt::Key_Return: + case Qt::Key_Enter: + if (item->goParent) { + emit parentSelected(); + break; + } + menu = item->menu; + if (!menu) + break; + type = menu->prompt ? menu->prompt->type : P_UNKNOWN; + if (type == P_MENU && rootEntry != menu && + mode != fullMode && mode != menuMode) { + if (mode == menuMode) + emit menuSelected(menu); + else + emit itemSelected(menu); + break; + } + case Qt::Key_Space: + changeValue(item); + break; + case Qt::Key_N: + setValue(item, no); + break; + case Qt::Key_M: + setValue(item, mod); + break; + case Qt::Key_Y: + setValue(item, yes); + break; + default: + Parent::keyPressEvent(ev); + return; + } + ev->accept(); +} + +void ConfigList::mousePressEvent(QMouseEvent* e) +{ + //QPoint p(contentsToViewport(e->pos())); + //printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y()); + Parent::mousePressEvent(e); +} + +void ConfigList::mouseReleaseEvent(QMouseEvent* e) +{ + QPoint p = e->pos(); + ConfigItem* item = (ConfigItem*)itemAt(p); + struct menu *menu; + enum prop_type ptype; + QIcon icon; + int idx, x; + + if (!item) + goto skip; + + menu = item->menu; + x = header()->offset() + p.x(); + idx = header()->logicalIndexAt(x); + switch (idx) { + case promptColIdx: + icon = item->icon(promptColIdx); + if (!icon.isNull()) { + int off = header()->sectionPosition(0) + visualRect(indexAt(p)).x() + 4; // 4 is Hardcoded image offset. There might be a way to do it properly. + if (x >= off && x < off + icon.availableSizes().first().width()) { + if (item->goParent) { + emit parentSelected(); + break; + } else if (!menu) + break; + ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; + if (ptype == P_MENU && rootEntry != menu && + mode != fullMode && mode != menuMode && + mode != listMode) + emit menuSelected(menu); + else + changeValue(item); + } + } + break; + case dataColIdx: + changeValue(item); + break; + } + +skip: + //printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y()); + Parent::mouseReleaseEvent(e); +} + +void ConfigList::mouseMoveEvent(QMouseEvent* e) +{ + //QPoint p(contentsToViewport(e->pos())); + //printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y()); + Parent::mouseMoveEvent(e); +} + +void ConfigList::mouseDoubleClickEvent(QMouseEvent* e) +{ + QPoint p = e->pos(); + ConfigItem* item = (ConfigItem*)itemAt(p); + struct menu *menu; + enum prop_type ptype; + + if (!item) + goto skip; + if (item->goParent) { + emit parentSelected(); + goto skip; + } + menu = item->menu; + if (!menu) + goto skip; + ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; + if (ptype == P_MENU && mode != listMode) { + if (mode == singleMode) + emit itemSelected(menu); + else if (mode == symbolMode) + emit menuSelected(menu); + } else if (menu->sym) + changeValue(item); + +skip: + //printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y()); + Parent::mouseDoubleClickEvent(e); +} + +void ConfigList::focusInEvent(QFocusEvent *e) +{ + struct menu *menu = NULL; + + Parent::focusInEvent(e); + + ConfigItem* item = (ConfigItem *)currentItem(); + if (item) { + setSelected(item, true); + menu = item->menu; + } + emit gotFocus(menu); +} + +void ConfigList::contextMenuEvent(QContextMenuEvent *e) +{ + if (!headerPopup) { + QAction *action; + + headerPopup = new QMenu(this); + action = new QAction("Show Name", this); + action->setCheckable(true); + connect(action, SIGNAL(toggled(bool)), + SLOT(setShowName(bool))); + connect(this, SIGNAL(showNameChanged(bool)), + action, SLOT(setChecked(bool))); + action->setChecked(showName); + headerPopup->addAction(action); + } + + headerPopup->exec(e->globalPos()); + e->accept(); +} + +void ConfigList::setShowName(bool on) +{ + if (showName == on) + return; + + showName = on; + reinit(); + emit showNameChanged(on); +} + +QList<ConfigList *> ConfigList::allLists; +QAction *ConfigList::showNormalAction; +QAction *ConfigList::showAllAction; +QAction *ConfigList::showPromptAction; + +void ConfigList::setAllOpen(bool open) +{ + QTreeWidgetItemIterator it(this); + + while (*it) { + (*it)->setExpanded(open); + + ++it; + } +} + +ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name) + : Parent(parent), sym(0), _menu(0) +{ + setObjectName(name); + setOpenLinks(false); + + if (!objectName().isEmpty()) { + configSettings->beginGroup(objectName()); + setShowDebug(configSettings->value("/showDebug", false).toBool()); + configSettings->endGroup(); + connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); + } + + contextMenu = createStandardContextMenu(); + QAction *action = new QAction("Show Debug Info", contextMenu); + + action->setCheckable(true); + connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool))); + connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setChecked(bool))); + action->setChecked(showDebug()); + contextMenu->addSeparator(); + contextMenu->addAction(action); +} + +void ConfigInfoView::saveSettings(void) +{ + if (!objectName().isEmpty()) { + configSettings->beginGroup(objectName()); + configSettings->setValue("/showDebug", showDebug()); + configSettings->endGroup(); + } +} + +void ConfigInfoView::setShowDebug(bool b) +{ + if (_showDebug != b) { + _showDebug = b; + if (_menu) + menuInfo(); + else if (sym) + symbolInfo(); + emit showDebugChanged(b); + } +} + +void ConfigInfoView::setInfo(struct menu *m) +{ + if (_menu == m) + return; + _menu = m; + sym = NULL; + if (!_menu) + clear(); + else + menuInfo(); +} + +void ConfigInfoView::symbolInfo(void) +{ + QString str; + + str += "<big>Symbol: <b>"; + str += print_filter(sym->name); + str += "</b></big><br><br>value: "; + str += print_filter(sym_get_string_value(sym)); + str += "<br>visibility: "; + str += sym->visible == yes ? "y" : sym->visible == mod ? "m" : "n"; + str += "<br>"; + str += debug_info(sym); + + setText(str); +} + +void ConfigInfoView::menuInfo(void) +{ + struct symbol* sym; + QString info; + QTextStream stream(&info); + + sym = _menu->sym; + if (sym) { + if (_menu->prompt) { + stream << "<big><b>"; + stream << print_filter(_menu->prompt->text); + stream << "</b></big>"; + if (sym->name) { + stream << " ("; + if (showDebug()) + stream << "<a href=\"s" << sym->name << "\">"; + stream << print_filter(sym->name); + if (showDebug()) + stream << "</a>"; + stream << ")"; + } + } else if (sym->name) { + stream << "<big><b>"; + if (showDebug()) + stream << "<a href=\"s" << sym->name << "\">"; + stream << print_filter(sym->name); + if (showDebug()) + stream << "</a>"; + stream << "</b></big>"; + } + stream << "<br><br>"; + + if (showDebug()) + stream << debug_info(sym); + + struct gstr help_gstr = str_new(); + + menu_get_ext_help(_menu, &help_gstr); + stream << print_filter(str_get(&help_gstr)); + str_free(&help_gstr); + } else if (_menu->prompt) { + stream << "<big><b>"; + stream << print_filter(_menu->prompt->text); + stream << "</b></big><br><br>"; + if (showDebug()) { + if (_menu->prompt->visible.expr) { + stream << "  dep: "; + expr_print(_menu->prompt->visible.expr, + expr_print_help, &stream, E_NONE); + stream << "<br><br>"; + } + + stream << "defined at " << _menu->file->name << ":" + << _menu->lineno << "<br><br>"; + } + } + + setText(info); +} + +QString ConfigInfoView::debug_info(struct symbol *sym) +{ + QString debug; + QTextStream stream(&debug); + + stream << "type: "; + stream << print_filter(sym_type_name(sym->type)); + if (sym_is_choice(sym)) + stream << " (choice)"; + debug += "<br>"; + if (sym->rev_dep.expr) { + stream << "reverse dep: "; + expr_print(sym->rev_dep.expr, expr_print_help, &stream, E_NONE); + stream << "<br>"; + } + for (struct property *prop = sym->prop; prop; prop = prop->next) { + switch (prop->type) { + case P_PROMPT: + case P_MENU: + stream << "prompt: <a href=\"m" << sym->name << "\">"; + stream << print_filter(prop->text); + stream << "</a><br>"; + break; + case P_DEFAULT: + case P_SELECT: + case P_RANGE: + case P_COMMENT: + case P_IMPLY: + case P_SYMBOL: + stream << prop_get_type_name(prop->type); + stream << ": "; + expr_print(prop->expr, expr_print_help, + &stream, E_NONE); + stream << "<br>"; + break; + case P_CHOICE: + if (sym_is_choice(sym)) { + stream << "choice: "; + expr_print(prop->expr, expr_print_help, + &stream, E_NONE); + stream << "<br>"; + } + break; + default: + stream << "unknown property: "; + stream << prop_get_type_name(prop->type); + stream << "<br>"; + } + if (prop->visible.expr) { + stream << "    dep: "; + expr_print(prop->visible.expr, expr_print_help, + &stream, E_NONE); + stream << "<br>"; + } + } + stream << "<br>"; + + return debug; +} + +QString ConfigInfoView::print_filter(const QString &str) +{ + QRegExp re("[<>&\"\\n]"); + QString res = str; + for (int i = 0; (i = res.indexOf(re, i)) >= 0;) { + switch (res[i].toLatin1()) { + case '<': + res.replace(i, 1, "<"); + i += 4; + break; + case '>': + res.replace(i, 1, ">"); + i += 4; + break; + case '&': + res.replace(i, 1, "&"); + i += 5; + break; + case '"': + res.replace(i, 1, """); + i += 6; + break; + case '\n': + res.replace(i, 1, "<br>"); + i += 4; + break; + } + } + return res; +} + +void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char *str) +{ + QTextStream *stream = reinterpret_cast<QTextStream *>(data); + + if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) { + *stream << "<a href=\"s" << sym->name << "\">"; + *stream << print_filter(str); + *stream << "</a>"; + } else { + *stream << print_filter(str); + } +} + +void ConfigInfoView::clicked(const QUrl &url) +{ + QByteArray str = url.toEncoded(); + const std::size_t count = str.size(); + char *data = new char[count + 1]; + struct symbol **result; + struct menu *m = NULL; + + if (count < 1) { + delete[] data; + return; + } + + memcpy(data, str.constData(), count); + data[count] = '\0'; + + /* Seek for exact match */ + data[0] = '^'; + strcat(data, "$"); + result = sym_re_search(data); + if (!result) { + delete[] data; + return; + } + + sym = *result; + + /* Seek for the menu which holds the symbol */ + for (struct property *prop = sym->prop; prop; prop = prop->next) { + if (prop->type != P_PROMPT && prop->type != P_MENU) + continue; + m = prop->menu; + break; + } + + if (!m) { + /* Symbol is not visible as a menu */ + symbolInfo(); + emit showDebugChanged(true); + } else { + emit menuSelected(m); + } + + free(result); + delete[] data; +} + +void ConfigInfoView::contextMenuEvent(QContextMenuEvent *event) +{ + contextMenu->popup(event->globalPos()); + event->accept(); +} + +ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow *parent) + : Parent(parent), result(NULL) +{ + setObjectName("search"); + setWindowTitle("Search Config"); + + QVBoxLayout* layout1 = new QVBoxLayout(this); + layout1->setContentsMargins(11, 11, 11, 11); + layout1->setSpacing(6); + + QHBoxLayout* layout2 = new QHBoxLayout(); + layout2->setContentsMargins(0, 0, 0, 0); + layout2->setSpacing(6); + layout2->addWidget(new QLabel("Find:", this)); + editField = new QLineEdit(this); + connect(editField, SIGNAL(returnPressed()), SLOT(search())); + layout2->addWidget(editField); + searchButton = new QPushButton("Search", this); + searchButton->setAutoDefault(false); + connect(searchButton, SIGNAL(clicked()), SLOT(search())); + layout2->addWidget(searchButton); + layout1->addLayout(layout2); + + split = new QSplitter(this); + split->setOrientation(Qt::Vertical); + list = new ConfigList(split, "search"); + list->mode = listMode; + info = new ConfigInfoView(split, "search"); + connect(list, SIGNAL(menuChanged(struct menu *)), + info, SLOT(setInfo(struct menu *))); + connect(list, SIGNAL(menuChanged(struct menu *)), + parent, SLOT(setMenuLink(struct menu *))); + + layout1->addWidget(split); + + QVariant x, y; + int width, height; + bool ok; + + configSettings->beginGroup("search"); + width = configSettings->value("/window width", parent->width() / 2).toInt(); + height = configSettings->value("/window height", parent->height() / 2).toInt(); + resize(width, height); + x = configSettings->value("/window x"); + y = configSettings->value("/window y"); + if (x.isValid() && y.isValid()) + move(x.toInt(), y.toInt()); + QList<int> sizes = configSettings->readSizes("/split", &ok); + if (ok) + split->setSizes(sizes); + configSettings->endGroup(); + connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); +} + +void ConfigSearchWindow::saveSettings(void) +{ + if (!objectName().isEmpty()) { + configSettings->beginGroup(objectName()); + configSettings->setValue("/window x", pos().x()); + configSettings->setValue("/window y", pos().y()); + configSettings->setValue("/window width", size().width()); + configSettings->setValue("/window height", size().height()); + configSettings->writeSizes("/split", split->sizes()); + configSettings->endGroup(); + } +} + +void ConfigSearchWindow::search(void) +{ + struct symbol **p; + struct property *prop; + ConfigItem *lastItem = NULL; + + free(result); + list->clear(); + info->clear(); + + result = sym_re_search(editField->text().toLatin1()); + if (!result) + return; + for (p = result; *p; p++) { + for_all_prompts((*p), prop) + lastItem = new ConfigItem(list, lastItem, prop->menu, + menu_is_visible(prop->menu)); + } +} + +/* + * Construct the complete config widget + */ +ConfigMainWindow::ConfigMainWindow(void) + : searchWindow(0) +{ + bool ok = true; + QVariant x, y; + int width, height; + char title[256]; + + QDesktopWidget *d = configApp->desktop(); + snprintf(title, sizeof(title), "%s%s", + rootmenu.prompt->text, + "" + ); + setWindowTitle(title); + + width = configSettings->value("/window width", d->width() - 64).toInt(); + height = configSettings->value("/window height", d->height() - 64).toInt(); + resize(width, height); + x = configSettings->value("/window x"); + y = configSettings->value("/window y"); + if ((x.isValid())&&(y.isValid())) + move(x.toInt(), y.toInt()); + + // set up icons + ConfigItem::symbolYesIcon = QIcon(QPixmap(xpm_symbol_yes)); + ConfigItem::symbolModIcon = QIcon(QPixmap(xpm_symbol_mod)); + ConfigItem::symbolNoIcon = QIcon(QPixmap(xpm_symbol_no)); + ConfigItem::choiceYesIcon = QIcon(QPixmap(xpm_choice_yes)); + ConfigItem::choiceNoIcon = QIcon(QPixmap(xpm_choice_no)); + ConfigItem::menuIcon = QIcon(QPixmap(xpm_menu)); + ConfigItem::menubackIcon = QIcon(QPixmap(xpm_menuback)); + + QWidget *widget = new QWidget(this); + QVBoxLayout *layout = new QVBoxLayout(widget); + setCentralWidget(widget); + + split1 = new QSplitter(widget); + split1->setOrientation(Qt::Horizontal); + split1->setChildrenCollapsible(false); + + menuList = new ConfigList(widget, "menu"); + + split2 = new QSplitter(widget); + split2->setChildrenCollapsible(false); + split2->setOrientation(Qt::Vertical); + + // create config tree + configList = new ConfigList(widget, "config"); + + helpText = new ConfigInfoView(widget, "help"); + + layout->addWidget(split2); + split2->addWidget(split1); + split1->addWidget(configList); + split1->addWidget(menuList); + split2->addWidget(helpText); + + setTabOrder(configList, helpText); + configList->setFocus(); + + backAction = new QAction(QPixmap(xpm_back), "Back", this); + connect(backAction, SIGNAL(triggered(bool)), SLOT(goBack())); + + QAction *quitAction = new QAction("&Quit", this); + quitAction->setShortcut(Qt::CTRL + Qt::Key_Q); + connect(quitAction, SIGNAL(triggered(bool)), SLOT(close())); + + QAction *loadAction = new QAction(QPixmap(xpm_load), "&Load", this); + loadAction->setShortcut(Qt::CTRL + Qt::Key_L); + connect(loadAction, SIGNAL(triggered(bool)), SLOT(loadConfig())); + + saveAction = new QAction(QPixmap(xpm_save), "&Save", this); + saveAction->setShortcut(Qt::CTRL + Qt::Key_S); + connect(saveAction, SIGNAL(triggered(bool)), SLOT(saveConfig())); + + conf_set_changed_callback(conf_changed); + + // Set saveAction's initial state + conf_changed(); + configname = xstrdup(conf_get_configname()); + + QAction *saveAsAction = new QAction("Save &As...", this); + connect(saveAsAction, SIGNAL(triggered(bool)), SLOT(saveConfigAs())); + QAction *searchAction = new QAction("&Find", this); + searchAction->setShortcut(Qt::CTRL + Qt::Key_F); + connect(searchAction, SIGNAL(triggered(bool)), SLOT(searchConfig())); + singleViewAction = new QAction(QPixmap(xpm_single_view), "Single View", this); + singleViewAction->setCheckable(true); + connect(singleViewAction, SIGNAL(triggered(bool)), SLOT(showSingleView())); + splitViewAction = new QAction(QPixmap(xpm_split_view), "Split View", this); + splitViewAction->setCheckable(true); + connect(splitViewAction, SIGNAL(triggered(bool)), SLOT(showSplitView())); + fullViewAction = new QAction(QPixmap(xpm_tree_view), "Full View", this); + fullViewAction->setCheckable(true); + connect(fullViewAction, SIGNAL(triggered(bool)), SLOT(showFullView())); + + QAction *showNameAction = new QAction("Show Name", this); + showNameAction->setCheckable(true); + connect(showNameAction, SIGNAL(toggled(bool)), configList, SLOT(setShowName(bool))); + showNameAction->setChecked(configList->showName); + + QActionGroup *optGroup = new QActionGroup(this); + optGroup->setExclusive(true); + connect(optGroup, SIGNAL(triggered(QAction*)), configList, + SLOT(setOptionMode(QAction *))); + connect(optGroup, SIGNAL(triggered(QAction *)), menuList, + SLOT(setOptionMode(QAction *))); + + ConfigList::showNormalAction = new QAction("Show Normal Options", optGroup); + ConfigList::showNormalAction->setCheckable(true); + ConfigList::showAllAction = new QAction("Show All Options", optGroup); + ConfigList::showAllAction->setCheckable(true); + ConfigList::showPromptAction = new QAction("Show Prompt Options", optGroup); + ConfigList::showPromptAction->setCheckable(true); + + QAction *showDebugAction = new QAction("Show Debug Info", this); + showDebugAction->setCheckable(true); + connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool))); + showDebugAction->setChecked(helpText->showDebug()); + + QAction *showIntroAction = new QAction("Introduction", this); + connect(showIntroAction, SIGNAL(triggered(bool)), SLOT(showIntro())); + QAction *showAboutAction = new QAction("About", this); + connect(showAboutAction, SIGNAL(triggered(bool)), SLOT(showAbout())); + + // init tool bar + QToolBar *toolBar = addToolBar("Tools"); + toolBar->addAction(backAction); + toolBar->addSeparator(); + toolBar->addAction(loadAction); + toolBar->addAction(saveAction); + toolBar->addSeparator(); + toolBar->addAction(singleViewAction); + toolBar->addAction(splitViewAction); + toolBar->addAction(fullViewAction); + + // create file menu + QMenu *menu = menuBar()->addMenu("&File"); + menu->addAction(loadAction); + menu->addAction(saveAction); + menu->addAction(saveAsAction); + menu->addSeparator(); + menu->addAction(quitAction); + + // create edit menu + menu = menuBar()->addMenu("&Edit"); + menu->addAction(searchAction); + + // create options menu + menu = menuBar()->addMenu("&Option"); + menu->addAction(showNameAction); + menu->addSeparator(); + menu->addActions(optGroup->actions()); + menu->addSeparator(); + menu->addAction(showDebugAction); + + // create help menu + menu = menuBar()->addMenu("&Help"); + menu->addAction(showIntroAction); + menu->addAction(showAboutAction); + + connect (helpText, SIGNAL (anchorClicked (const QUrl &)), + helpText, SLOT (clicked (const QUrl &)) ); + + connect(configList, SIGNAL(menuChanged(struct menu *)), + helpText, SLOT(setInfo(struct menu *))); + connect(configList, SIGNAL(menuSelected(struct menu *)), + SLOT(changeMenu(struct menu *))); + connect(configList, SIGNAL(itemSelected(struct menu *)), + SLOT(changeItens(struct menu *))); + connect(configList, SIGNAL(parentSelected()), + SLOT(goBack())); + connect(menuList, SIGNAL(menuChanged(struct menu *)), + helpText, SLOT(setInfo(struct menu *))); + connect(menuList, SIGNAL(menuSelected(struct menu *)), + SLOT(changeMenu(struct menu *))); + + connect(configList, SIGNAL(gotFocus(struct menu *)), + helpText, SLOT(setInfo(struct menu *))); + connect(menuList, SIGNAL(gotFocus(struct menu *)), + helpText, SLOT(setInfo(struct menu *))); + connect(menuList, SIGNAL(gotFocus(struct menu *)), + SLOT(listFocusChanged(void))); + connect(helpText, SIGNAL(menuSelected(struct menu *)), + SLOT(setMenuLink(struct menu *))); + + QString listMode = configSettings->value("/listMode", "symbol").toString(); + if (listMode == "single") + showSingleView(); + else if (listMode == "full") + showFullView(); + else /*if (listMode == "split")*/ + showSplitView(); + + // UI setup done, restore splitter positions + QList<int> sizes = configSettings->readSizes("/split1", &ok); + if (ok) + split1->setSizes(sizes); + + sizes = configSettings->readSizes("/split2", &ok); + if (ok) + split2->setSizes(sizes); +} + +void ConfigMainWindow::loadConfig(void) +{ + QString str; + QByteArray ba; + const char *name; + + str = QFileDialog::getOpenFileName(this, "", configname); + if (str.isNull()) + return; + + ba = str.toLocal8Bit(); + name = ba.data(); + + if (conf_read(name)) + QMessageBox::information(this, "qconf", "Unable to load configuration!"); + + free(configname); + configname = xstrdup(name); + + ConfigList::updateListAllForAll(); +} + +bool ConfigMainWindow::saveConfig(void) +{ + if (conf_write(configname)) { + QMessageBox::information(this, "qconf", "Unable to save configuration!"); + return false; + } + conf_write_autoconf(0); + + return true; +} + +void ConfigMainWindow::saveConfigAs(void) +{ + QString str; + QByteArray ba; + const char *name; + + str = QFileDialog::getSaveFileName(this, "", configname); + if (str.isNull()) + return; + + ba = str.toLocal8Bit(); + name = ba.data(); + + if (conf_write(name)) { + QMessageBox::information(this, "qconf", "Unable to save configuration!"); + } + conf_write_autoconf(0); + + free(configname); + configname = xstrdup(name); +} + +void ConfigMainWindow::searchConfig(void) +{ + if (!searchWindow) + searchWindow = new ConfigSearchWindow(this); + searchWindow->show(); +} + +void ConfigMainWindow::changeItens(struct menu *menu) +{ + configList->setRootMenu(menu); +} + +void ConfigMainWindow::changeMenu(struct menu *menu) +{ + menuList->setRootMenu(menu); +} + +void ConfigMainWindow::setMenuLink(struct menu *menu) +{ + struct menu *parent; + ConfigList* list = NULL; + ConfigItem* item; + + if (configList->menuSkip(menu)) + return; + + switch (configList->mode) { + case singleMode: + list = configList; + parent = menu_get_parent_menu(menu); + if (!parent) + return; + list->setRootMenu(parent); + break; + case menuMode: + if (menu->flags & MENU_ROOT) { + menuList->setRootMenu(menu); + configList->clearSelection(); + list = configList; + } else { + parent = menu_get_parent_menu(menu->parent); + if (!parent) + return; + + /* Select the config view */ + item = configList->findConfigItem(parent); + if (item) { + configList->setSelected(item, true); + configList->scrollToItem(item); + } + + menuList->setRootMenu(parent); + menuList->clearSelection(); + list = menuList; + } + break; + case fullMode: + list = configList; + break; + default: + break; + } + + if (list) { + item = list->findConfigItem(menu); + if (item) { + list->setSelected(item, true); + list->scrollToItem(item); + list->setFocus(); + helpText->setInfo(menu); + } + } +} + +void ConfigMainWindow::listFocusChanged(void) +{ + if (menuList->mode == menuMode) + configList->clearSelection(); +} + +void ConfigMainWindow::goBack(void) +{ + if (configList->rootEntry == &rootmenu) + return; + + configList->setParentMenu(); +} + +void ConfigMainWindow::showSingleView(void) +{ + singleViewAction->setEnabled(false); + singleViewAction->setChecked(true); + splitViewAction->setEnabled(true); + splitViewAction->setChecked(false); + fullViewAction->setEnabled(true); + fullViewAction->setChecked(false); + + backAction->setEnabled(true); + + menuList->hide(); + menuList->setRootMenu(0); + configList->mode = singleMode; + if (configList->rootEntry == &rootmenu) + configList->updateListAll(); + else + configList->setRootMenu(&rootmenu); + configList->setFocus(); +} + +void ConfigMainWindow::showSplitView(void) +{ + singleViewAction->setEnabled(true); + singleViewAction->setChecked(false); + splitViewAction->setEnabled(false); + splitViewAction->setChecked(true); + fullViewAction->setEnabled(true); + fullViewAction->setChecked(false); + + backAction->setEnabled(false); + + configList->mode = menuMode; + if (configList->rootEntry == &rootmenu) + configList->updateListAll(); + else + configList->setRootMenu(&rootmenu); + configList->setAllOpen(true); + configApp->processEvents(); + menuList->mode = symbolMode; + menuList->setRootMenu(&rootmenu); + menuList->setAllOpen(true); + menuList->show(); + menuList->setFocus(); +} + +void ConfigMainWindow::showFullView(void) +{ + singleViewAction->setEnabled(true); + singleViewAction->setChecked(false); + splitViewAction->setEnabled(true); + splitViewAction->setChecked(false); + fullViewAction->setEnabled(false); + fullViewAction->setChecked(true); + + backAction->setEnabled(false); + + menuList->hide(); + menuList->setRootMenu(0); + configList->mode = fullMode; + if (configList->rootEntry == &rootmenu) + configList->updateListAll(); + else + configList->setRootMenu(&rootmenu); + configList->setFocus(); +} + +/* + * ask for saving configuration before quitting + */ +void ConfigMainWindow::closeEvent(QCloseEvent* e) +{ + if (!conf_get_changed()) { + e->accept(); + return; + } + QMessageBox mb("qconf", "Save configuration?", QMessageBox::Warning, + QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape); + mb.setButtonText(QMessageBox::Yes, "&Save Changes"); + mb.setButtonText(QMessageBox::No, "&Discard Changes"); + mb.setButtonText(QMessageBox::Cancel, "Cancel Exit"); + switch (mb.exec()) { + case QMessageBox::Yes: + if (saveConfig()) + e->accept(); + else + e->ignore(); + break; + case QMessageBox::No: + e->accept(); + break; + case QMessageBox::Cancel: + e->ignore(); + break; + } +} + +void ConfigMainWindow::showIntro(void) +{ + static const QString str = + "Welcome to the qconf graphical configuration tool.\n" + "\n" + "For bool and tristate options, a blank box indicates the " + "feature is disabled, a check indicates it is enabled, and a " + "dot indicates that it is to be compiled as a module. Clicking " + "on the box will cycle through the three states. For int, hex, " + "and string options, double-clicking or pressing F2 on the " + "Value cell will allow you to edit the value.\n" + "\n" + "If you do not see an option (e.g., a device driver) that you " + "believe should be present, try turning on Show All Options " + "under the Options menu. Enabling Show Debug Info will help you" + "figure out what other options must be enabled to support the " + "option you are interested in, and hyperlinks will navigate to " + "them.\n" + "\n" + "Toggling Show Debug Info under the Options menu will show the " + "dependencies, which you can then match by examining other " + "options.\n"; + + QMessageBox::information(this, "qconf", str); +} + +void ConfigMainWindow::showAbout(void) +{ + static const QString str = "qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n" + "Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com>.\n\n" + "Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n"; + + QMessageBox::information(this, "qconf", str); +} + +void ConfigMainWindow::saveSettings(void) +{ + configSettings->setValue("/window x", pos().x()); + configSettings->setValue("/window y", pos().y()); + configSettings->setValue("/window width", size().width()); + configSettings->setValue("/window height", size().height()); + + QString entry; + switch(configList->mode) { + case singleMode : + entry = "single"; + break; + + case symbolMode : + entry = "split"; + break; + + case fullMode : + entry = "full"; + break; + + default: + break; + } + configSettings->setValue("/listMode", entry); + + configSettings->writeSizes("/split1", split1->sizes()); + configSettings->writeSizes("/split2", split2->sizes()); +} + +void ConfigMainWindow::conf_changed(void) +{ + if (saveAction) + saveAction->setEnabled(conf_get_changed()); +} + +void fixup_rootmenu(struct menu *menu) +{ + struct menu *child; + static int menu_cnt = 0; + + menu->flags |= MENU_ROOT; + for (child = menu->list; child; child = child->next) { + if (child->prompt && child->prompt->type == P_MENU) { + menu_cnt++; + fixup_rootmenu(child); + menu_cnt--; + } else if (!menu_cnt) + fixup_rootmenu(child); + } +} + +static const char *progname; + +static void usage(void) +{ + printf("%s [-s] <config>\n", progname); + exit(0); +} + +int main(int ac, char** av) +{ + ConfigMainWindow* v; + const char *name; + + progname = av[0]; + if (ac > 1 && av[1][0] == '-') { + switch (av[1][1]) { + case 's': + conf_set_message_callback(NULL); + break; + case 'h': + case '?': + usage(); + } + name = av[2]; + } else + name = av[1]; + if (!name) + usage(); + + conf_parse(name); + fixup_rootmenu(&rootmenu); + conf_read(NULL); + //zconfdump(stdout); + + configApp = new QApplication(ac, av); + + configSettings = new ConfigSettings(); + configSettings->beginGroup("/kconfig/qconf"); + v = new ConfigMainWindow(); + + //zconfdump(stdout); + configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit())); + configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings())); + v->show(); + configApp->exec(); + + configSettings->endGroup(); + delete configSettings; + delete v; + delete configApp; + + return 0; +} diff --git a/src/net/scripts/kconfig/qconf.h b/src/net/scripts/kconfig/qconf.h new file mode 100644 index 0000000..78b0a1d --- /dev/null +++ b/src/net/scripts/kconfig/qconf.h @@ -0,0 +1,275 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + */ + +#include <QCheckBox> +#include <QDialog> +#include <QHeaderView> +#include <QLineEdit> +#include <QMainWindow> +#include <QPushButton> +#include <QSettings> +#include <QSplitter> +#include <QStyledItemDelegate> +#include <QTextBrowser> +#include <QTreeWidget> + +#include "expr.h" + +class ConfigList; +class ConfigItem; +class ConfigMainWindow; + +class ConfigSettings : public QSettings { +public: + ConfigSettings(); + QList<int> readSizes(const QString& key, bool *ok); + bool writeSizes(const QString& key, const QList<int>& value); +}; + +enum colIdx { + promptColIdx, nameColIdx, dataColIdx +}; +enum listMode { + singleMode, menuMode, symbolMode, fullMode, listMode +}; +enum optionMode { + normalOpt = 0, allOpt, promptOpt +}; + +class ConfigList : public QTreeWidget { + Q_OBJECT + typedef class QTreeWidget Parent; +public: + ConfigList(QWidget *parent, const char *name = 0); + ~ConfigList(); + void reinit(void); + ConfigItem* findConfigItem(struct menu *); + void setSelected(QTreeWidgetItem *item, bool enable) { + for (int i = 0; i < selectedItems().size(); i++) + selectedItems().at(i)->setSelected(false); + + item->setSelected(enable); + } + +protected: + void keyPressEvent(QKeyEvent *e); + void mousePressEvent(QMouseEvent *e); + void mouseReleaseEvent(QMouseEvent *e); + void mouseMoveEvent(QMouseEvent *e); + void mouseDoubleClickEvent(QMouseEvent *e); + void focusInEvent(QFocusEvent *e); + void contextMenuEvent(QContextMenuEvent *e); + +public slots: + void setRootMenu(struct menu *menu); + + void updateList(); + void setValue(ConfigItem* item, tristate val); + void changeValue(ConfigItem* item); + void updateSelection(void); + void saveSettings(void); + void setOptionMode(QAction *action); + void setShowName(bool on); + +signals: + void menuChanged(struct menu *menu); + void menuSelected(struct menu *menu); + void itemSelected(struct menu *menu); + void parentSelected(void); + void gotFocus(struct menu *); + void showNameChanged(bool on); + +public: + void updateListAll(void) + { + updateAll = true; + updateList(); + updateAll = false; + } + void setAllOpen(bool open); + void setParentMenu(void); + + bool menuSkip(struct menu *); + + void updateMenuList(ConfigItem *parent, struct menu*); + void updateMenuList(struct menu *menu); + + bool updateAll; + + bool showName; + enum listMode mode; + enum optionMode optMode; + struct menu *rootEntry; + QPalette disabledColorGroup; + QPalette inactivedColorGroup; + QMenu* headerPopup; + + static QList<ConfigList *> allLists; + static void updateListForAll(); + static void updateListAllForAll(); + + static QAction *showNormalAction, *showAllAction, *showPromptAction; +}; + +class ConfigItem : public QTreeWidgetItem { + typedef class QTreeWidgetItem Parent; +public: + ConfigItem(ConfigList *parent, ConfigItem *after, struct menu *m, bool v) + : Parent(parent, after), nextItem(0), menu(m), visible(v), goParent(false) + { + init(); + } + ConfigItem(ConfigItem *parent, ConfigItem *after, struct menu *m, bool v) + : Parent(parent, after), nextItem(0), menu(m), visible(v), goParent(false) + { + init(); + } + ConfigItem(ConfigList *parent, ConfigItem *after, bool v) + : Parent(parent, after), nextItem(0), menu(0), visible(v), goParent(true) + { + init(); + } + ~ConfigItem(void); + void init(void); + void updateMenu(void); + void testUpdateMenu(bool v); + ConfigList* listView() const + { + return (ConfigList*)Parent::treeWidget(); + } + ConfigItem* firstChild() const + { + return (ConfigItem *)Parent::child(0); + } + ConfigItem* nextSibling() + { + ConfigItem *ret = NULL; + ConfigItem *_parent = (ConfigItem *)parent(); + + if(_parent) { + ret = (ConfigItem *)_parent->child(_parent->indexOfChild(this)+1); + } else { + QTreeWidget *_treeWidget = treeWidget(); + ret = (ConfigItem *)_treeWidget->topLevelItem(_treeWidget->indexOfTopLevelItem(this)+1); + } + + return ret; + } + // TODO: Implement paintCell + + ConfigItem* nextItem; + struct menu *menu; + bool visible; + bool goParent; + + static QIcon symbolYesIcon, symbolModIcon, symbolNoIcon; + static QIcon choiceYesIcon, choiceNoIcon; + static QIcon menuIcon, menubackIcon; +}; + +class ConfigItemDelegate : public QStyledItemDelegate +{ +private: + struct menu *menu; +public: + ConfigItemDelegate(QObject *parent = nullptr) + : QStyledItemDelegate(parent) {} + QWidget *createEditor(QWidget *parent, + const QStyleOptionViewItem &option, + const QModelIndex &index) const override; + void setModelData(QWidget *editor, QAbstractItemModel *model, + const QModelIndex &index) const override; +}; + +class ConfigInfoView : public QTextBrowser { + Q_OBJECT + typedef class QTextBrowser Parent; + QMenu *contextMenu; +public: + ConfigInfoView(QWidget* parent, const char *name = 0); + bool showDebug(void) const { return _showDebug; } + +public slots: + void setInfo(struct menu *menu); + void saveSettings(void); + void setShowDebug(bool); + void clicked (const QUrl &url); + +signals: + void showDebugChanged(bool); + void menuSelected(struct menu *); + +protected: + void symbolInfo(void); + void menuInfo(void); + QString debug_info(struct symbol *sym); + static QString print_filter(const QString &str); + static void expr_print_help(void *data, struct symbol *sym, const char *str); + void contextMenuEvent(QContextMenuEvent *event); + + struct symbol *sym; + struct menu *_menu; + bool _showDebug; +}; + +class ConfigSearchWindow : public QDialog { + Q_OBJECT + typedef class QDialog Parent; +public: + ConfigSearchWindow(ConfigMainWindow *parent); + +public slots: + void saveSettings(void); + void search(void); + +protected: + QLineEdit* editField; + QPushButton* searchButton; + QSplitter* split; + ConfigList *list; + ConfigInfoView* info; + + struct symbol **result; +}; + +class ConfigMainWindow : public QMainWindow { + Q_OBJECT + + char *configname; + static QAction *saveAction; + static void conf_changed(void); +public: + ConfigMainWindow(void); +public slots: + void changeMenu(struct menu *); + void changeItens(struct menu *); + void setMenuLink(struct menu *); + void listFocusChanged(void); + void goBack(void); + void loadConfig(void); + bool saveConfig(void); + void saveConfigAs(void); + void searchConfig(void); + void showSingleView(void); + void showSplitView(void); + void showFullView(void); + void showIntro(void); + void showAbout(void); + void saveSettings(void); + +protected: + void closeEvent(QCloseEvent *e); + + ConfigSearchWindow *searchWindow; + ConfigList *menuList; + ConfigList *configList; + ConfigInfoView *helpText; + QAction *backAction; + QAction *singleViewAction; + QAction *splitViewAction; + QAction *fullViewAction; + QSplitter *split1; + QSplitter *split2; +}; diff --git a/src/net/scripts/kconfig/streamline_config.pl b/src/net/scripts/kconfig/streamline_config.pl new file mode 100755 index 0000000..1c78ba4 --- /dev/null +++ b/src/net/scripts/kconfig/streamline_config.pl @@ -0,0 +1,704 @@ +#!/usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0 +# +# Copyright 2005-2009 - Steven Rostedt +# +# It's simple enough to figure out how this works. +# If not, then you can ask me at stripconfig@goodmis.org +# +# What it does? +# +# If you have installed a Linux kernel from a distribution +# that turns on way too many modules than you need, and +# you only want the modules you use, then this program +# is perfect for you. +# +# It gives you the ability to turn off all the modules that are +# not loaded on your system. +# +# Howto: +# +# 1. Boot up the kernel that you want to stream line the config on. +# 2. Change directory to the directory holding the source of the +# kernel that you just booted. +# 3. Copy the configuraton file to this directory as .config +# 4. Have all your devices that you need modules for connected and +# operational (make sure that their corresponding modules are loaded) +# 5. Run this script redirecting the output to some other file +# like config_strip. +# 6. Back up your old config (if you want too). +# 7. copy the config_strip file to .config +# 8. Run "make oldconfig" +# +# Now your kernel is ready to be built with only the modules that +# are loaded. +# +# Here's what I did with my Debian distribution. +# +# cd /usr/src/linux-2.6.10 +# cp /boot/config-2.6.10-1-686-smp .config +# ~/bin/streamline_config > config_strip +# mv .config config_sav +# mv config_strip .config +# make oldconfig +# +use warnings; +use strict; +use Getopt::Long; + +# set the environment variable LOCALMODCONFIG_DEBUG to get +# debug output. +my $debugprint = 0; +$debugprint = 1 if (defined($ENV{LOCALMODCONFIG_DEBUG})); + +sub dprint { + return if (!$debugprint); + print STDERR @_; +} + +my $uname = `uname -r`; +chomp $uname; + +my @searchconfigs = ( + { + "file" => ".config", + "exec" => "cat", + }, + { + "file" => "/proc/config.gz", + "exec" => "zcat", + }, + { + "file" => "/boot/config-$uname", + "exec" => "cat", + }, + { + "file" => "/boot/vmlinuz-$uname", + "exec" => "scripts/extract-ikconfig", + "test" => "scripts/extract-ikconfig", + }, + { + "file" => "vmlinux", + "exec" => "scripts/extract-ikconfig", + "test" => "scripts/extract-ikconfig", + }, + { + "file" => "/lib/modules/$uname/kernel/kernel/configs.ko", + "exec" => "scripts/extract-ikconfig", + "test" => "scripts/extract-ikconfig", + }, + { + "file" => "kernel/configs.ko", + "exec" => "scripts/extract-ikconfig", + "test" => "scripts/extract-ikconfig", + }, + { + "file" => "kernel/configs.o", + "exec" => "scripts/extract-ikconfig", + "test" => "scripts/extract-ikconfig", + }, +); + +sub read_config { + foreach my $conf (@searchconfigs) { + my $file = $conf->{"file"}; + + next if ( ! -f "$file"); + + if (defined($conf->{"test"})) { + `$conf->{"test"} $conf->{"file"} 2>/dev/null`; + next if ($?); + } + + my $exec = $conf->{"exec"}; + + print STDERR "using config: '$file'\n"; + + open(my $infile, '-|', "$exec $file") || die "Failed to run $exec $file"; + my @x = <$infile>; + close $infile; + return @x; + } + die "No config file found"; +} + +my @config_file = read_config; + +# Parse options +my $localmodconfig = 0; +my $localyesconfig = 0; + +GetOptions("localmodconfig" => \$localmodconfig, + "localyesconfig" => \$localyesconfig); + +# Get the build source and top level Kconfig file (passed in) +my $ksource = ($ARGV[0] ? $ARGV[0] : '.'); +my $kconfig = $ARGV[1]; +my $lsmod_file = $ENV{'LSMOD'}; + +my @makefiles = `find $ksource -name Makefile -or -name Kbuild 2>/dev/null`; +chomp @makefiles; + +my %depends; +my %selects; +my %prompts; +my %objects; +my %config2kfile; +my $var; +my $iflevel = 0; +my @ifdeps; + +# prevent recursion +my %read_kconfigs; + +sub read_kconfig { + my ($kconfig) = @_; + + my $state = "NONE"; + my $config; + + my $cont = 0; + my $line; + + my $source = "$ksource/$kconfig"; + my $last_source = ""; + + # Check for any environment variables used + while ($source =~ /\$\((\w+)\)/ && $last_source ne $source) { + my $env = $1; + $last_source = $source; + $source =~ s/\$\($env\)/$ENV{$env}/; + } + + open(my $kinfile, '<', $source) || die "Can't open $kconfig"; + while (<$kinfile>) { + chomp; + + # Make sure that lines ending with \ continue + if ($cont) { + $_ = $line . " " . $_; + } + + if (s/\\$//) { + $cont = 1; + $line = $_; + next; + } + + $cont = 0; + + # collect any Kconfig sources + if (/^source\s+"?([^"]+)/) { + my $kconfig = $1; + # prevent reading twice. + if (!defined($read_kconfigs{$kconfig})) { + $read_kconfigs{$kconfig} = 1; + read_kconfig($kconfig); + } + next; + } + + # configs found + if (/^\s*(menu)?config\s+(\S+)\s*$/) { + $state = "NEW"; + $config = $2; + $config2kfile{"CONFIG_$config"} = $kconfig; + + # Add depends for 'if' nesting + for (my $i = 0; $i < $iflevel; $i++) { + if ($i) { + $depends{$config} .= " " . $ifdeps[$i]; + } else { + $depends{$config} = $ifdeps[$i]; + } + $state = "DEP"; + } + + # collect the depends for the config + } elsif ($state eq "NEW" && /^\s*depends\s+on\s+(.*)$/) { + $state = "DEP"; + $depends{$config} = $1; + } elsif ($state eq "DEP" && /^\s*depends\s+on\s+(.*)$/) { + $depends{$config} .= " " . $1; + } elsif ($state eq "DEP" && /^\s*def(_(bool|tristate)|ault)\s+(\S.*)$/) { + my $dep = $3; + if ($dep !~ /^\s*(y|m|n)\s*$/) { + $dep =~ s/.*\sif\s+//; + $depends{$config} .= " " . $dep; + dprint "Added default depends $dep to $config\n"; + } + + # Get the configs that select this config + } elsif ($state ne "NONE" && /^\s*select\s+(\S+)/) { + my $conf = $1; + if (defined($selects{$conf})) { + $selects{$conf} .= " " . $config; + } else { + $selects{$conf} = $config; + } + + # configs without prompts must be selected + } elsif ($state ne "NONE" && /^\s*(tristate\s+\S|prompt\b)/) { + # note if the config has a prompt + $prompts{$config} = 1; + + # Check for if statements + } elsif (/^if\s+(.*\S)\s*$/) { + my $deps = $1; + # remove beginning and ending non text + $deps =~ s/^[^a-zA-Z0-9_]*//; + $deps =~ s/[^a-zA-Z0-9_]*$//; + + my @deps = split /[^a-zA-Z0-9_]+/, $deps; + + $ifdeps[$iflevel++] = join ':', @deps; + + } elsif (/^endif/) { + + $iflevel-- if ($iflevel); + + # stop on "help" and keywords that end a menu entry + } elsif (/^\s*(---)?help(---)?\s*$/ || /^(comment|choice|menu)\b/) { + $state = "NONE"; + } + } + close($kinfile); +} + +if ($kconfig) { + read_kconfig($kconfig); +} + +# Makefiles can use variables to define their dependencies +sub convert_vars { + my ($line, %vars) = @_; + + my $process = ""; + + while ($line =~ s/^(.*?)(\$\((.*?)\))//) { + my $start = $1; + my $variable = $2; + my $var = $3; + + if (defined($vars{$var})) { + $process .= $start . $vars{$var}; + } else { + $process .= $start . $variable; + } + } + + $process .= $line; + + return $process; +} + +# Read all Makefiles to map the configs to the objects +foreach my $makefile (@makefiles) { + + my $line = ""; + my %make_vars; + + open(my $infile, '<', $makefile) || die "Can't open $makefile"; + while (<$infile>) { + # if this line ends with a backslash, continue + chomp; + if (/^(.*)\\$/) { + $line .= $1; + next; + } + + $line .= $_; + $_ = $line; + $line = ""; + + my $objs; + + # Convert variables in a line (could define configs) + $_ = convert_vars($_, %make_vars); + + # collect objects after obj-$(CONFIG_FOO_BAR) + if (/obj-\$\((CONFIG_[^\)]*)\)\s*[+:]?=\s*(.*)/) { + $var = $1; + $objs = $2; + + # check if variables are set + } elsif (/^\s*(\S+)\s*[:]?=\s*(.*\S)/) { + $make_vars{$1} = $2; + } + if (defined($objs)) { + foreach my $obj (split /\s+/,$objs) { + $obj =~ s/-/_/g; + if ($obj =~ /(.*)\.o$/) { + # Objects may be enabled by more than one config. + # Store configs in an array. + my @arr; + + if (defined($objects{$1})) { + @arr = @{$objects{$1}}; + } + + $arr[$#arr+1] = $var; + + # The objects have a hash mapping to a reference + # of an array of configs. + $objects{$1} = \@arr; + } + } + } + } + close($infile); +} + +my %modules; +my $linfile; + +if (defined($lsmod_file)) { + if ( ! -f $lsmod_file) { + if ( -f $ENV{'objtree'}."/".$lsmod_file) { + $lsmod_file = $ENV{'objtree'}."/".$lsmod_file; + } else { + die "$lsmod_file not found"; + } + } + + my $otype = ( -x $lsmod_file) ? '-|' : '<'; + open($linfile, $otype, $lsmod_file); + +} else { + + # see what modules are loaded on this system + my $lsmod; + + foreach my $dir ( ("/sbin", "/bin", "/usr/sbin", "/usr/bin") ) { + if ( -x "$dir/lsmod" ) { + $lsmod = "$dir/lsmod"; + last; + } + } + if (!defined($lsmod)) { + # try just the path + $lsmod = "lsmod"; + } + + open($linfile, '-|', $lsmod) || die "Can not call lsmod with $lsmod"; +} + +while (<$linfile>) { + next if (/^Module/); # Skip the first line. + if (/^(\S+)/) { + $modules{$1} = 1; + } +} +close ($linfile); + +# add to the configs hash all configs that are needed to enable +# a loaded module. This is a direct obj-${CONFIG_FOO} += bar.o +# where we know we need bar.o so we add FOO to the list. +my %configs; +foreach my $module (keys(%modules)) { + if (defined($objects{$module})) { + my @arr = @{$objects{$module}}; + foreach my $conf (@arr) { + $configs{$conf} = $module; + dprint "$conf added by direct ($module)\n"; + if ($debugprint) { + my $c=$conf; + $c =~ s/^CONFIG_//; + if (defined($depends{$c})) { + dprint " deps = $depends{$c}\n"; + } else { + dprint " no deps\n"; + } + } + } + } else { + # Most likely, someone has a custom (binary?) module loaded. + print STDERR "$module config not found!!\n"; + } +} + +# Read the current config, and see what is enabled. We want to +# ignore configs that we would not enable anyway. + +my %orig_configs; +my $valid = "A-Za-z_0-9"; + +foreach my $line (@config_file) { + $_ = $line; + + if (/(CONFIG_[$valid]*)=(m|y)/) { + $orig_configs{$1} = $2; + } +} + +my $repeat = 1; + +my $depconfig; + +# +# Note, we do not care about operands (like: &&, ||, !) we want to add any +# config that is in the depend list of another config. This script does +# not enable configs that are not already enabled. If we come across a +# config A that depends on !B, we can still add B to the list of depends +# to keep on. If A was on in the original config, B would not have been +# and B would not be turned on by this script. +# +sub parse_config_depends +{ + my ($p) = @_; + + while ($p =~ /[$valid]/) { + + if ($p =~ /^[^$valid]*([$valid]+)/) { + my $conf = "CONFIG_" . $1; + + $p =~ s/^[^$valid]*[$valid]+//; + + # We only need to process if the depend config is a module + if (!defined($orig_configs{$conf}) || $orig_configs{$conf} eq "y") { + next; + } + + if (!defined($configs{$conf})) { + # We must make sure that this config has its + # dependencies met. + $repeat = 1; # do again + dprint "$conf selected by depend $depconfig\n"; + $configs{$conf} = 1; + } + } else { + die "this should never happen"; + } + } +} + +# Select is treated a bit differently than depends. We call this +# when a config has no prompt and requires another config to be +# selected. We use to just select all configs that selected this +# config, but found that that can balloon into enabling hundreds +# of configs that we do not care about. +# +# The idea is we look at all the configs that select it. If one +# is already in our list of configs to enable, then there's nothing +# else to do. If there isn't, we pick the first config that was +# enabled in the orignal config and use that. +sub parse_config_selects +{ + my ($config, $p) = @_; + + my $next_config; + + while ($p =~ /[$valid]/) { + + if ($p =~ /^[^$valid]*([$valid]+)/) { + my $conf = "CONFIG_" . $1; + + $p =~ s/^[^$valid]*[$valid]+//; + + # Make sure that this config exists in the current .config file + if (!defined($orig_configs{$conf})) { + dprint "$conf not set for $config select\n"; + next; + } + + # Check if something other than a module selects this config + if (defined($orig_configs{$conf}) && $orig_configs{$conf} ne "m") { + dprint "$conf (non module) selects config, we are good\n"; + # we are good with this + return; + } + if (defined($configs{$conf})) { + dprint "$conf selects $config so we are good\n"; + # A set config selects this config, we are good + return; + } + # Set this config to be selected + if (!defined($next_config)) { + $next_config = $conf; + } + } else { + die "this should never happen"; + } + } + + # If no possible config selected this, then something happened. + if (!defined($next_config)) { + print STDERR "WARNING: $config is required, but nothing in the\n"; + print STDERR " current config selects it.\n"; + return; + } + + # If we are here, then we found no config that is set and + # selects this config. Repeat. + $repeat = 1; + # Make this config need to be selected + $configs{$next_config} = 1; + dprint "$next_config selected by select $config\n"; +} + +my %process_selects; + +# loop through all configs, select their dependencies. +sub loop_depend { + $repeat = 1; + + while ($repeat) { + $repeat = 0; + + forloop: + foreach my $config (keys %configs) { + + # If this config is not a module, we do not need to process it + if (defined($orig_configs{$config}) && $orig_configs{$config} ne "m") { + next forloop; + } + + $config =~ s/^CONFIG_//; + $depconfig = $config; + + if (defined($depends{$config})) { + # This config has dependencies. Make sure they are also included + parse_config_depends $depends{$config}; + } + + # If the config has no prompt, then we need to check if a config + # that is enabled selected it. Or if we need to enable one. + if (!defined($prompts{$config}) && defined($selects{$config})) { + $process_selects{$config} = 1; + } + } + } +} + +sub loop_select { + + foreach my $config (keys %process_selects) { + $config =~ s/^CONFIG_//; + + dprint "Process select $config\n"; + + # config has no prompt and must be selected. + parse_config_selects $config, $selects{$config}; + } +} + +while ($repeat) { + # Get the first set of configs and their dependencies. + loop_depend; + + $repeat = 0; + + # Now we need to see if we have to check selects; + loop_select; +} + +my %setconfigs; +my @preserved_kconfigs; +if (defined($ENV{'LMC_KEEP'})) { + @preserved_kconfigs = split(/:/,$ENV{LMC_KEEP}); +} + +sub in_preserved_kconfigs { + my $kconfig = $config2kfile{$_[0]}; + if (!defined($kconfig)) { + return 0; + } + foreach my $excl (@preserved_kconfigs) { + if($kconfig =~ /^$excl/) { + return 1; + } + } + return 0; +} + +# Finally, read the .config file and turn off any module enabled that +# we could not find a reason to keep enabled. +foreach my $line (@config_file) { + $_ = $line; + + if (/CONFIG_IKCONFIG/) { + if (/# CONFIG_IKCONFIG is not set/) { + # enable IKCONFIG at least as a module + print "CONFIG_IKCONFIG=m\n"; + # don't ask about PROC + print "# CONFIG_IKCONFIG_PROC is not set\n"; + } else { + print; + } + next; + } + + if (/CONFIG_MODULE_SIG_KEY="(.+)"/) { + my $orig_cert = $1; + my $default_cert = "certs/signing_key.pem"; + + # Check that the logic in this script still matches the one in Kconfig + if (!defined($depends{"MODULE_SIG_KEY"}) || + $depends{"MODULE_SIG_KEY"} !~ /"\Q$default_cert\E"/) { + print STDERR "WARNING: MODULE_SIG_KEY assertion failure, ", + "update needed to ", __FILE__, " line ", __LINE__, "\n"; + print; + } elsif ($orig_cert ne $default_cert && ! -f $orig_cert) { + print STDERR "Module signature verification enabled but ", + "module signing key \"$orig_cert\" not found. Resetting ", + "signing key to default value.\n"; + print "CONFIG_MODULE_SIG_KEY=\"$default_cert\"\n"; + } else { + print; + } + next; + } + + if (/CONFIG_SYSTEM_TRUSTED_KEYS="(.+)"/) { + my $orig_keys = $1; + + if (! -f $orig_keys) { + print STDERR "System keyring enabled but keys \"$orig_keys\" ", + "not found. Resetting keys to default value.\n"; + print "CONFIG_SYSTEM_TRUSTED_KEYS=\"\"\n"; + } else { + print; + } + next; + } + + if (/^(CONFIG.*)=(m|y)/) { + if (in_preserved_kconfigs($1)) { + dprint "Preserve config $1"; + print; + next; + } + if (defined($configs{$1})) { + if ($localyesconfig) { + $setconfigs{$1} = 'y'; + print "$1=y\n"; + next; + } else { + $setconfigs{$1} = $2; + } + } elsif ($2 eq "m") { + print "# $1 is not set\n"; + next; + } + } + print; +} + +# Integrity check, make sure all modules that we want enabled do +# indeed have their configs set. +loop: +foreach my $module (keys(%modules)) { + if (defined($objects{$module})) { + my @arr = @{$objects{$module}}; + foreach my $conf (@arr) { + if (defined($setconfigs{$conf})) { + next loop; + } + } + print STDERR "module $module did not have configs"; + foreach my $conf (@arr) { + print STDERR " " , $conf; + } + print STDERR "\n"; + } +} diff --git a/src/net/scripts/kconfig/symbol.c b/src/net/scripts/kconfig/symbol.c new file mode 100644 index 0000000..ffa3ec6 --- /dev/null +++ b/src/net/scripts/kconfig/symbol.c @@ -0,0 +1,1314 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + */ + +#include <ctype.h> +#include <stdlib.h> +#include <string.h> +#include <regex.h> +#include <sys/utsname.h> + +#include "lkc.h" + +struct symbol symbol_yes = { + .name = "y", + .curr = { "y", yes }, + .flags = SYMBOL_CONST|SYMBOL_VALID, +}; + +struct symbol symbol_mod = { + .name = "m", + .curr = { "m", mod }, + .flags = SYMBOL_CONST|SYMBOL_VALID, +}; + +struct symbol symbol_no = { + .name = "n", + .curr = { "n", no }, + .flags = SYMBOL_CONST|SYMBOL_VALID, +}; + +static struct symbol symbol_empty = { + .name = "", + .curr = { "", no }, + .flags = SYMBOL_VALID, +}; + +struct symbol *sym_defconfig_list; +struct symbol *modules_sym; +static tristate modules_val; + +enum symbol_type sym_get_type(struct symbol *sym) +{ + enum symbol_type type = sym->type; + + if (type == S_TRISTATE) { + if (sym_is_choice_value(sym) && sym->visible == yes) + type = S_BOOLEAN; + else if (modules_val == no) + type = S_BOOLEAN; + } + return type; +} + +const char *sym_type_name(enum symbol_type type) +{ + switch (type) { + case S_BOOLEAN: + return "bool"; + case S_TRISTATE: + return "tristate"; + case S_INT: + return "integer"; + case S_HEX: + return "hex"; + case S_STRING: + return "string"; + case S_UNKNOWN: + return "unknown"; + } + return "???"; +} + +struct property *sym_get_choice_prop(struct symbol *sym) +{ + struct property *prop; + + for_all_choices(sym, prop) + return prop; + return NULL; +} + +static struct property *sym_get_default_prop(struct symbol *sym) +{ + struct property *prop; + + for_all_defaults(sym, prop) { + prop->visible.tri = expr_calc_value(prop->visible.expr); + if (prop->visible.tri != no) + return prop; + } + return NULL; +} + +struct property *sym_get_range_prop(struct symbol *sym) +{ + struct property *prop; + + for_all_properties(sym, prop, P_RANGE) { + prop->visible.tri = expr_calc_value(prop->visible.expr); + if (prop->visible.tri != no) + return prop; + } + return NULL; +} + +static long long sym_get_range_val(struct symbol *sym, int base) +{ + sym_calc_value(sym); + switch (sym->type) { + case S_INT: + base = 10; + break; + case S_HEX: + base = 16; + break; + default: + break; + } + return strtoll(sym->curr.val, NULL, base); +} + +static void sym_validate_range(struct symbol *sym) +{ + struct property *prop; + int base; + long long val, val2; + char str[64]; + + switch (sym->type) { + case S_INT: + base = 10; + break; + case S_HEX: + base = 16; + break; + default: + return; + } + prop = sym_get_range_prop(sym); + if (!prop) + return; + val = strtoll(sym->curr.val, NULL, base); + val2 = sym_get_range_val(prop->expr->left.sym, base); + if (val >= val2) { + val2 = sym_get_range_val(prop->expr->right.sym, base); + if (val <= val2) + return; + } + if (sym->type == S_INT) + sprintf(str, "%lld", val2); + else + sprintf(str, "0x%llx", val2); + sym->curr.val = xstrdup(str); +} + +static void sym_set_changed(struct symbol *sym) +{ + struct property *prop; + + sym->flags |= SYMBOL_CHANGED; + for (prop = sym->prop; prop; prop = prop->next) { + if (prop->menu) + prop->menu->flags |= MENU_CHANGED; + } +} + +static void sym_set_all_changed(void) +{ + struct symbol *sym; + int i; + + for_all_symbols(i, sym) + sym_set_changed(sym); +} + +static void sym_calc_visibility(struct symbol *sym) +{ + struct property *prop; + struct symbol *choice_sym = NULL; + tristate tri; + + /* any prompt visible? */ + tri = no; + + if (sym_is_choice_value(sym)) + choice_sym = prop_get_symbol(sym_get_choice_prop(sym)); + + for_all_prompts(sym, prop) { + prop->visible.tri = expr_calc_value(prop->visible.expr); + /* + * Tristate choice_values with visibility 'mod' are + * not visible if the corresponding choice's value is + * 'yes'. + */ + if (choice_sym && sym->type == S_TRISTATE && + prop->visible.tri == mod && choice_sym->curr.tri == yes) + prop->visible.tri = no; + + tri = EXPR_OR(tri, prop->visible.tri); + } + if (tri == mod && (sym->type != S_TRISTATE || modules_val == no)) + tri = yes; + if (sym->visible != tri) { + sym->visible = tri; + sym_set_changed(sym); + } + if (sym_is_choice_value(sym)) + return; + /* defaulting to "yes" if no explicit "depends on" are given */ + tri = yes; + if (sym->dir_dep.expr) + tri = expr_calc_value(sym->dir_dep.expr); + if (tri == mod && sym_get_type(sym) == S_BOOLEAN) + tri = yes; + if (sym->dir_dep.tri != tri) { + sym->dir_dep.tri = tri; + sym_set_changed(sym); + } + tri = no; + if (sym->rev_dep.expr) + tri = expr_calc_value(sym->rev_dep.expr); + if (tri == mod && sym_get_type(sym) == S_BOOLEAN) + tri = yes; + if (sym->rev_dep.tri != tri) { + sym->rev_dep.tri = tri; + sym_set_changed(sym); + } + tri = no; + if (sym->implied.expr) + tri = expr_calc_value(sym->implied.expr); + if (tri == mod && sym_get_type(sym) == S_BOOLEAN) + tri = yes; + if (sym->implied.tri != tri) { + sym->implied.tri = tri; + sym_set_changed(sym); + } +} + +/* + * Find the default symbol for a choice. + * First try the default values for the choice symbol + * Next locate the first visible choice value + * Return NULL if none was found + */ +struct symbol *sym_choice_default(struct symbol *sym) +{ + struct symbol *def_sym; + struct property *prop; + struct expr *e; + + /* any of the defaults visible? */ + for_all_defaults(sym, prop) { + prop->visible.tri = expr_calc_value(prop->visible.expr); + if (prop->visible.tri == no) + continue; + def_sym = prop_get_symbol(prop); + if (def_sym->visible != no) + return def_sym; + } + + /* just get the first visible value */ + prop = sym_get_choice_prop(sym); + expr_list_for_each_sym(prop->expr, e, def_sym) + if (def_sym->visible != no) + return def_sym; + + /* failed to locate any defaults */ + return NULL; +} + +static struct symbol *sym_calc_choice(struct symbol *sym) +{ + struct symbol *def_sym; + struct property *prop; + struct expr *e; + int flags; + + /* first calculate all choice values' visibilities */ + flags = sym->flags; + prop = sym_get_choice_prop(sym); + expr_list_for_each_sym(prop->expr, e, def_sym) { + sym_calc_visibility(def_sym); + if (def_sym->visible != no) + flags &= def_sym->flags; + } + + sym->flags &= flags | ~SYMBOL_DEF_USER; + + /* is the user choice visible? */ + def_sym = sym->def[S_DEF_USER].val; + if (def_sym && def_sym->visible != no) + return def_sym; + + def_sym = sym_choice_default(sym); + + if (def_sym == NULL) + /* no choice? reset tristate value */ + sym->curr.tri = no; + + return def_sym; +} + +static void sym_warn_unmet_dep(struct symbol *sym) +{ + struct gstr gs = str_new(); + + str_printf(&gs, + "\nWARNING: unmet direct dependencies detected for %s\n", + sym->name); + str_printf(&gs, + " Depends on [%c]: ", + sym->dir_dep.tri == mod ? 'm' : 'n'); + expr_gstr_print(sym->dir_dep.expr, &gs); + str_printf(&gs, "\n"); + + expr_gstr_print_revdep(sym->rev_dep.expr, &gs, yes, + " Selected by [y]:\n"); + expr_gstr_print_revdep(sym->rev_dep.expr, &gs, mod, + " Selected by [m]:\n"); + + fputs(str_get(&gs), stderr); +} + +void sym_calc_value(struct symbol *sym) +{ + struct symbol_value newval, oldval; + struct property *prop; + struct expr *e; + + if (!sym) + return; + + if (sym->flags & SYMBOL_VALID) + return; + + if (sym_is_choice_value(sym) && + sym->flags & SYMBOL_NEED_SET_CHOICE_VALUES) { + sym->flags &= ~SYMBOL_NEED_SET_CHOICE_VALUES; + prop = sym_get_choice_prop(sym); + sym_calc_value(prop_get_symbol(prop)); + } + + sym->flags |= SYMBOL_VALID; + + oldval = sym->curr; + + switch (sym->type) { + case S_INT: + case S_HEX: + case S_STRING: + newval = symbol_empty.curr; + break; + case S_BOOLEAN: + case S_TRISTATE: + newval = symbol_no.curr; + break; + default: + sym->curr.val = sym->name; + sym->curr.tri = no; + return; + } + sym->flags &= ~SYMBOL_WRITE; + + sym_calc_visibility(sym); + + if (sym->visible != no) + sym->flags |= SYMBOL_WRITE; + + /* set default if recursively called */ + sym->curr = newval; + + switch (sym_get_type(sym)) { + case S_BOOLEAN: + case S_TRISTATE: + if (sym_is_choice_value(sym) && sym->visible == yes) { + prop = sym_get_choice_prop(sym); + newval.tri = (prop_get_symbol(prop)->curr.val == sym) ? yes : no; + } else { + if (sym->visible != no) { + /* if the symbol is visible use the user value + * if available, otherwise try the default value + */ + if (sym_has_value(sym)) { + newval.tri = EXPR_AND(sym->def[S_DEF_USER].tri, + sym->visible); + goto calc_newval; + } + } + if (sym->rev_dep.tri != no) + sym->flags |= SYMBOL_WRITE; + if (!sym_is_choice(sym)) { + prop = sym_get_default_prop(sym); + if (prop) { + newval.tri = EXPR_AND(expr_calc_value(prop->expr), + prop->visible.tri); + if (newval.tri != no) + sym->flags |= SYMBOL_WRITE; + } + if (sym->implied.tri != no) { + sym->flags |= SYMBOL_WRITE; + newval.tri = EXPR_OR(newval.tri, sym->implied.tri); + newval.tri = EXPR_AND(newval.tri, + sym->dir_dep.tri); + } + } + calc_newval: + if (sym->dir_dep.tri < sym->rev_dep.tri) + sym_warn_unmet_dep(sym); + newval.tri = EXPR_OR(newval.tri, sym->rev_dep.tri); + } + if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN) + newval.tri = yes; + break; + case S_STRING: + case S_HEX: + case S_INT: + if (sym->visible != no && sym_has_value(sym)) { + newval.val = sym->def[S_DEF_USER].val; + break; + } + prop = sym_get_default_prop(sym); + if (prop) { + struct symbol *ds = prop_get_symbol(prop); + if (ds) { + sym->flags |= SYMBOL_WRITE; + sym_calc_value(ds); + newval.val = ds->curr.val; + } + } + break; + default: + ; + } + + sym->curr = newval; + if (sym_is_choice(sym) && newval.tri == yes) + sym->curr.val = sym_calc_choice(sym); + sym_validate_range(sym); + + if (memcmp(&oldval, &sym->curr, sizeof(oldval))) { + sym_set_changed(sym); + if (modules_sym == sym) { + sym_set_all_changed(); + modules_val = modules_sym->curr.tri; + } + } + + if (sym_is_choice(sym)) { + struct symbol *choice_sym; + + prop = sym_get_choice_prop(sym); + expr_list_for_each_sym(prop->expr, e, choice_sym) { + if ((sym->flags & SYMBOL_WRITE) && + choice_sym->visible != no) + choice_sym->flags |= SYMBOL_WRITE; + if (sym->flags & SYMBOL_CHANGED) + sym_set_changed(choice_sym); + } + } + + if (sym->flags & SYMBOL_NO_WRITE) + sym->flags &= ~SYMBOL_WRITE; + + if (sym->flags & SYMBOL_NEED_SET_CHOICE_VALUES) + set_all_choice_values(sym); +} + +void sym_clear_all_valid(void) +{ + struct symbol *sym; + int i; + + for_all_symbols(i, sym) + sym->flags &= ~SYMBOL_VALID; + sym_add_change_count(1); + sym_calc_value(modules_sym); +} + +bool sym_tristate_within_range(struct symbol *sym, tristate val) +{ + int type = sym_get_type(sym); + + if (sym->visible == no) + return false; + + if (type != S_BOOLEAN && type != S_TRISTATE) + return false; + + if (type == S_BOOLEAN && val == mod) + return false; + if (sym->visible <= sym->rev_dep.tri) + return false; + if (sym_is_choice_value(sym) && sym->visible == yes) + return val == yes; + return val >= sym->rev_dep.tri && val <= sym->visible; +} + +bool sym_set_tristate_value(struct symbol *sym, tristate val) +{ + tristate oldval = sym_get_tristate_value(sym); + + if (oldval != val && !sym_tristate_within_range(sym, val)) + return false; + + if (!(sym->flags & SYMBOL_DEF_USER)) { + sym->flags |= SYMBOL_DEF_USER; + sym_set_changed(sym); + } + /* + * setting a choice value also resets the new flag of the choice + * symbol and all other choice values. + */ + if (sym_is_choice_value(sym) && val == yes) { + struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym)); + struct property *prop; + struct expr *e; + + cs->def[S_DEF_USER].val = sym; + cs->flags |= SYMBOL_DEF_USER; + prop = sym_get_choice_prop(cs); + for (e = prop->expr; e; e = e->left.expr) { + if (e->right.sym->visible != no) + e->right.sym->flags |= SYMBOL_DEF_USER; + } + } + + sym->def[S_DEF_USER].tri = val; + if (oldval != val) + sym_clear_all_valid(); + + return true; +} + +tristate sym_toggle_tristate_value(struct symbol *sym) +{ + tristate oldval, newval; + + oldval = newval = sym_get_tristate_value(sym); + do { + switch (newval) { + case no: + newval = mod; + break; + case mod: + newval = yes; + break; + case yes: + newval = no; + break; + } + if (sym_set_tristate_value(sym, newval)) + break; + } while (oldval != newval); + return newval; +} + +bool sym_string_valid(struct symbol *sym, const char *str) +{ + signed char ch; + + switch (sym->type) { + case S_STRING: + return true; + case S_INT: + ch = *str++; + if (ch == '-') + ch = *str++; + if (!isdigit(ch)) + return false; + if (ch == '0' && *str != 0) + return false; + while ((ch = *str++)) { + if (!isdigit(ch)) + return false; + } + return true; + case S_HEX: + if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) + str += 2; + ch = *str++; + do { + if (!isxdigit(ch)) + return false; + } while ((ch = *str++)); + return true; + case S_BOOLEAN: + case S_TRISTATE: + switch (str[0]) { + case 'y': case 'Y': + case 'm': case 'M': + case 'n': case 'N': + return true; + } + return false; + default: + return false; + } +} + +bool sym_string_within_range(struct symbol *sym, const char *str) +{ + struct property *prop; + long long val; + + switch (sym->type) { + case S_STRING: + return sym_string_valid(sym, str); + case S_INT: + if (!sym_string_valid(sym, str)) + return false; + prop = sym_get_range_prop(sym); + if (!prop) + return true; + val = strtoll(str, NULL, 10); + return val >= sym_get_range_val(prop->expr->left.sym, 10) && + val <= sym_get_range_val(prop->expr->right.sym, 10); + case S_HEX: + if (!sym_string_valid(sym, str)) + return false; + prop = sym_get_range_prop(sym); + if (!prop) + return true; + val = strtoll(str, NULL, 16); + return val >= sym_get_range_val(prop->expr->left.sym, 16) && + val <= sym_get_range_val(prop->expr->right.sym, 16); + case S_BOOLEAN: + case S_TRISTATE: + switch (str[0]) { + case 'y': case 'Y': + return sym_tristate_within_range(sym, yes); + case 'm': case 'M': + return sym_tristate_within_range(sym, mod); + case 'n': case 'N': + return sym_tristate_within_range(sym, no); + } + return false; + default: + return false; + } +} + +bool sym_set_string_value(struct symbol *sym, const char *newval) +{ + const char *oldval; + char *val; + int size; + + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + switch (newval[0]) { + case 'y': case 'Y': + return sym_set_tristate_value(sym, yes); + case 'm': case 'M': + return sym_set_tristate_value(sym, mod); + case 'n': case 'N': + return sym_set_tristate_value(sym, no); + } + return false; + default: + ; + } + + if (!sym_string_within_range(sym, newval)) + return false; + + if (!(sym->flags & SYMBOL_DEF_USER)) { + sym->flags |= SYMBOL_DEF_USER; + sym_set_changed(sym); + } + + oldval = sym->def[S_DEF_USER].val; + size = strlen(newval) + 1; + if (sym->type == S_HEX && (newval[0] != '0' || (newval[1] != 'x' && newval[1] != 'X'))) { + size += 2; + sym->def[S_DEF_USER].val = val = xmalloc(size); + *val++ = '0'; + *val++ = 'x'; + } else if (!oldval || strcmp(oldval, newval)) + sym->def[S_DEF_USER].val = val = xmalloc(size); + else + return true; + + strcpy(val, newval); + free((void *)oldval); + sym_clear_all_valid(); + + return true; +} + +/* + * Find the default value associated to a symbol. + * For tristate symbol handle the modules=n case + * in which case "m" becomes "y". + * If the symbol does not have any default then fallback + * to the fixed default values. + */ +const char *sym_get_string_default(struct symbol *sym) +{ + struct property *prop; + struct symbol *ds; + const char *str; + tristate val; + + sym_calc_visibility(sym); + sym_calc_value(modules_sym); + val = symbol_no.curr.tri; + str = symbol_empty.curr.val; + + /* If symbol has a default value look it up */ + prop = sym_get_default_prop(sym); + if (prop != NULL) { + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + /* The visibility may limit the value from yes => mod */ + val = EXPR_AND(expr_calc_value(prop->expr), prop->visible.tri); + break; + default: + /* + * The following fails to handle the situation + * where a default value is further limited by + * the valid range. + */ + ds = prop_get_symbol(prop); + if (ds != NULL) { + sym_calc_value(ds); + str = (const char *)ds->curr.val; + } + } + } + + /* Handle select statements */ + val = EXPR_OR(val, sym->rev_dep.tri); + + /* transpose mod to yes if modules are not enabled */ + if (val == mod) + if (!sym_is_choice_value(sym) && modules_sym->curr.tri == no) + val = yes; + + /* transpose mod to yes if type is bool */ + if (sym->type == S_BOOLEAN && val == mod) + val = yes; + + /* adjust the default value if this symbol is implied by another */ + if (val < sym->implied.tri) + val = sym->implied.tri; + + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + switch (val) { + case no: return "n"; + case mod: return "m"; + case yes: return "y"; + } + case S_INT: + case S_HEX: + return str; + case S_STRING: + return str; + case S_UNKNOWN: + break; + } + return ""; +} + +const char *sym_get_string_value(struct symbol *sym) +{ + tristate val; + + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + val = sym_get_tristate_value(sym); + switch (val) { + case no: + return "n"; + case mod: + sym_calc_value(modules_sym); + return (modules_sym->curr.tri == no) ? "n" : "m"; + case yes: + return "y"; + } + break; + default: + ; + } + return (const char *)sym->curr.val; +} + +bool sym_is_changeable(struct symbol *sym) +{ + return sym->visible > sym->rev_dep.tri; +} + +static unsigned strhash(const char *s) +{ + /* fnv32 hash */ + unsigned hash = 2166136261U; + for (; *s; s++) + hash = (hash ^ *s) * 0x01000193; + return hash; +} + +struct symbol *sym_lookup(const char *name, int flags) +{ + struct symbol *symbol; + char *new_name; + int hash; + + if (name) { + if (name[0] && !name[1]) { + switch (name[0]) { + case 'y': return &symbol_yes; + case 'm': return &symbol_mod; + case 'n': return &symbol_no; + } + } + hash = strhash(name) % SYMBOL_HASHSIZE; + + for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) { + if (symbol->name && + !strcmp(symbol->name, name) && + (flags ? symbol->flags & flags + : !(symbol->flags & (SYMBOL_CONST|SYMBOL_CHOICE)))) + return symbol; + } + new_name = xstrdup(name); + } else { + new_name = NULL; + hash = 0; + } + + symbol = xmalloc(sizeof(*symbol)); + memset(symbol, 0, sizeof(*symbol)); + symbol->name = new_name; + symbol->type = S_UNKNOWN; + symbol->flags = flags; + + symbol->next = symbol_hash[hash]; + symbol_hash[hash] = symbol; + + return symbol; +} + +struct symbol *sym_find(const char *name) +{ + struct symbol *symbol = NULL; + int hash = 0; + + if (!name) + return NULL; + + if (name[0] && !name[1]) { + switch (name[0]) { + case 'y': return &symbol_yes; + case 'm': return &symbol_mod; + case 'n': return &symbol_no; + } + } + hash = strhash(name) % SYMBOL_HASHSIZE; + + for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) { + if (symbol->name && + !strcmp(symbol->name, name) && + !(symbol->flags & SYMBOL_CONST)) + break; + } + + return symbol; +} + +const char *sym_escape_string_value(const char *in) +{ + const char *p; + size_t reslen; + char *res; + size_t l; + + reslen = strlen(in) + strlen("\"\"") + 1; + + p = in; + for (;;) { + l = strcspn(p, "\"\\"); + p += l; + + if (p[0] == '\0') + break; + + reslen++; + p++; + } + + res = xmalloc(reslen); + res[0] = '\0'; + + strcat(res, "\""); + + p = in; + for (;;) { + l = strcspn(p, "\"\\"); + strncat(res, p, l); + p += l; + + if (p[0] == '\0') + break; + + strcat(res, "\\"); + strncat(res, p++, 1); + } + + strcat(res, "\""); + return res; +} + +struct sym_match { + struct symbol *sym; + off_t so, eo; +}; + +/* Compare matched symbols as thus: + * - first, symbols that match exactly + * - then, alphabetical sort + */ +static int sym_rel_comp(const void *sym1, const void *sym2) +{ + const struct sym_match *s1 = sym1; + const struct sym_match *s2 = sym2; + int exact1, exact2; + + /* Exact match: + * - if matched length on symbol s1 is the length of that symbol, + * then this symbol should come first; + * - if matched length on symbol s2 is the length of that symbol, + * then this symbol should come first. + * Note: since the search can be a regexp, both symbols may match + * exactly; if this is the case, we can't decide which comes first, + * and we fallback to sorting alphabetically. + */ + exact1 = (s1->eo - s1->so) == strlen(s1->sym->name); + exact2 = (s2->eo - s2->so) == strlen(s2->sym->name); + if (exact1 && !exact2) + return -1; + if (!exact1 && exact2) + return 1; + + /* As a fallback, sort symbols alphabetically */ + return strcmp(s1->sym->name, s2->sym->name); +} + +struct symbol **sym_re_search(const char *pattern) +{ + struct symbol *sym, **sym_arr = NULL; + struct sym_match *sym_match_arr = NULL; + int i, cnt, size; + regex_t re; + regmatch_t match[1]; + + cnt = size = 0; + /* Skip if empty */ + if (strlen(pattern) == 0) + return NULL; + if (regcomp(&re, pattern, REG_EXTENDED|REG_ICASE)) + return NULL; + + for_all_symbols(i, sym) { + if (sym->flags & SYMBOL_CONST || !sym->name) + continue; + if (regexec(&re, sym->name, 1, match, 0)) + continue; + if (cnt >= size) { + void *tmp; + size += 16; + tmp = realloc(sym_match_arr, size * sizeof(struct sym_match)); + if (!tmp) + goto sym_re_search_free; + sym_match_arr = tmp; + } + sym_calc_value(sym); + /* As regexec returned 0, we know we have a match, so + * we can use match[0].rm_[se]o without further checks + */ + sym_match_arr[cnt].so = match[0].rm_so; + sym_match_arr[cnt].eo = match[0].rm_eo; + sym_match_arr[cnt++].sym = sym; + } + if (sym_match_arr) { + qsort(sym_match_arr, cnt, sizeof(struct sym_match), sym_rel_comp); + sym_arr = malloc((cnt+1) * sizeof(struct symbol *)); + if (!sym_arr) + goto sym_re_search_free; + for (i = 0; i < cnt; i++) + sym_arr[i] = sym_match_arr[i].sym; + sym_arr[cnt] = NULL; + } +sym_re_search_free: + /* sym_match_arr can be NULL if no match, but free(NULL) is OK */ + free(sym_match_arr); + regfree(&re); + + return sym_arr; +} + +/* + * When we check for recursive dependencies we use a stack to save + * current state so we can print out relevant info to user. + * The entries are located on the call stack so no need to free memory. + * Note insert() remove() must always match to properly clear the stack. + */ +static struct dep_stack { + struct dep_stack *prev, *next; + struct symbol *sym; + struct property *prop; + struct expr **expr; +} *check_top; + +static void dep_stack_insert(struct dep_stack *stack, struct symbol *sym) +{ + memset(stack, 0, sizeof(*stack)); + if (check_top) + check_top->next = stack; + stack->prev = check_top; + stack->sym = sym; + check_top = stack; +} + +static void dep_stack_remove(void) +{ + check_top = check_top->prev; + if (check_top) + check_top->next = NULL; +} + +/* + * Called when we have detected a recursive dependency. + * check_top point to the top of the stact so we use + * the ->prev pointer to locate the bottom of the stack. + */ +static void sym_check_print_recursive(struct symbol *last_sym) +{ + struct dep_stack *stack; + struct symbol *sym, *next_sym; + struct menu *menu = NULL; + struct property *prop; + struct dep_stack cv_stack; + + if (sym_is_choice_value(last_sym)) { + dep_stack_insert(&cv_stack, last_sym); + last_sym = prop_get_symbol(sym_get_choice_prop(last_sym)); + } + + for (stack = check_top; stack != NULL; stack = stack->prev) + if (stack->sym == last_sym) + break; + if (!stack) { + fprintf(stderr, "unexpected recursive dependency error\n"); + return; + } + + for (; stack; stack = stack->next) { + sym = stack->sym; + next_sym = stack->next ? stack->next->sym : last_sym; + prop = stack->prop; + if (prop == NULL) + prop = stack->sym->prop; + + /* for choice values find the menu entry (used below) */ + if (sym_is_choice(sym) || sym_is_choice_value(sym)) { + for (prop = sym->prop; prop; prop = prop->next) { + menu = prop->menu; + if (prop->menu) + break; + } + } + if (stack->sym == last_sym) + fprintf(stderr, "%s:%d:error: recursive dependency detected!\n", + prop->file->name, prop->lineno); + + if (sym_is_choice(sym)) { + fprintf(stderr, "%s:%d:\tchoice %s contains symbol %s\n", + menu->file->name, menu->lineno, + sym->name ? sym->name : "<choice>", + next_sym->name ? next_sym->name : "<choice>"); + } else if (sym_is_choice_value(sym)) { + fprintf(stderr, "%s:%d:\tsymbol %s is part of choice %s\n", + menu->file->name, menu->lineno, + sym->name ? sym->name : "<choice>", + next_sym->name ? next_sym->name : "<choice>"); + } else if (stack->expr == &sym->dir_dep.expr) { + fprintf(stderr, "%s:%d:\tsymbol %s depends on %s\n", + prop->file->name, prop->lineno, + sym->name ? sym->name : "<choice>", + next_sym->name ? next_sym->name : "<choice>"); + } else if (stack->expr == &sym->rev_dep.expr) { + fprintf(stderr, "%s:%d:\tsymbol %s is selected by %s\n", + prop->file->name, prop->lineno, + sym->name ? sym->name : "<choice>", + next_sym->name ? next_sym->name : "<choice>"); + } else if (stack->expr == &sym->implied.expr) { + fprintf(stderr, "%s:%d:\tsymbol %s is implied by %s\n", + prop->file->name, prop->lineno, + sym->name ? sym->name : "<choice>", + next_sym->name ? next_sym->name : "<choice>"); + } else if (stack->expr) { + fprintf(stderr, "%s:%d:\tsymbol %s %s value contains %s\n", + prop->file->name, prop->lineno, + sym->name ? sym->name : "<choice>", + prop_get_type_name(prop->type), + next_sym->name ? next_sym->name : "<choice>"); + } else { + fprintf(stderr, "%s:%d:\tsymbol %s %s is visible depending on %s\n", + prop->file->name, prop->lineno, + sym->name ? sym->name : "<choice>", + prop_get_type_name(prop->type), + next_sym->name ? next_sym->name : "<choice>"); + } + } + + fprintf(stderr, + "For a resolution refer to Documentation/kbuild/kconfig-language.rst\n" + "subsection \"Kconfig recursive dependency limitations\"\n" + "\n"); + + if (check_top == &cv_stack) + dep_stack_remove(); +} + +static struct symbol *sym_check_expr_deps(struct expr *e) +{ + struct symbol *sym; + + if (!e) + return NULL; + switch (e->type) { + case E_OR: + case E_AND: + sym = sym_check_expr_deps(e->left.expr); + if (sym) + return sym; + return sym_check_expr_deps(e->right.expr); + case E_NOT: + return sym_check_expr_deps(e->left.expr); + case E_EQUAL: + case E_GEQ: + case E_GTH: + case E_LEQ: + case E_LTH: + case E_UNEQUAL: + sym = sym_check_deps(e->left.sym); + if (sym) + return sym; + return sym_check_deps(e->right.sym); + case E_SYMBOL: + return sym_check_deps(e->left.sym); + default: + break; + } + fprintf(stderr, "Oops! How to check %d?\n", e->type); + return NULL; +} + +/* return NULL when dependencies are OK */ +static struct symbol *sym_check_sym_deps(struct symbol *sym) +{ + struct symbol *sym2; + struct property *prop; + struct dep_stack stack; + + dep_stack_insert(&stack, sym); + + stack.expr = &sym->dir_dep.expr; + sym2 = sym_check_expr_deps(sym->dir_dep.expr); + if (sym2) + goto out; + + stack.expr = &sym->rev_dep.expr; + sym2 = sym_check_expr_deps(sym->rev_dep.expr); + if (sym2) + goto out; + + stack.expr = &sym->implied.expr; + sym2 = sym_check_expr_deps(sym->implied.expr); + if (sym2) + goto out; + + stack.expr = NULL; + + for (prop = sym->prop; prop; prop = prop->next) { + if (prop->type == P_CHOICE || prop->type == P_SELECT || + prop->type == P_IMPLY) + continue; + stack.prop = prop; + sym2 = sym_check_expr_deps(prop->visible.expr); + if (sym2) + break; + if (prop->type != P_DEFAULT || sym_is_choice(sym)) + continue; + stack.expr = &prop->expr; + sym2 = sym_check_expr_deps(prop->expr); + if (sym2) + break; + stack.expr = NULL; + } + +out: + dep_stack_remove(); + + return sym2; +} + +static struct symbol *sym_check_choice_deps(struct symbol *choice) +{ + struct symbol *sym, *sym2; + struct property *prop; + struct expr *e; + struct dep_stack stack; + + dep_stack_insert(&stack, choice); + + prop = sym_get_choice_prop(choice); + expr_list_for_each_sym(prop->expr, e, sym) + sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED); + + choice->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED); + sym2 = sym_check_sym_deps(choice); + choice->flags &= ~SYMBOL_CHECK; + if (sym2) + goto out; + + expr_list_for_each_sym(prop->expr, e, sym) { + sym2 = sym_check_sym_deps(sym); + if (sym2) + break; + } +out: + expr_list_for_each_sym(prop->expr, e, sym) + sym->flags &= ~SYMBOL_CHECK; + + if (sym2 && sym_is_choice_value(sym2) && + prop_get_symbol(sym_get_choice_prop(sym2)) == choice) + sym2 = choice; + + dep_stack_remove(); + + return sym2; +} + +struct symbol *sym_check_deps(struct symbol *sym) +{ + struct symbol *sym2; + struct property *prop; + + if (sym->flags & SYMBOL_CHECK) { + sym_check_print_recursive(sym); + return sym; + } + if (sym->flags & SYMBOL_CHECKED) + return NULL; + + if (sym_is_choice_value(sym)) { + struct dep_stack stack; + + /* for choice groups start the check with main choice symbol */ + dep_stack_insert(&stack, sym); + prop = sym_get_choice_prop(sym); + sym2 = sym_check_deps(prop_get_symbol(prop)); + dep_stack_remove(); + } else if (sym_is_choice(sym)) { + sym2 = sym_check_choice_deps(sym); + } else { + sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED); + sym2 = sym_check_sym_deps(sym); + sym->flags &= ~SYMBOL_CHECK; + } + + return sym2; +} + +struct symbol *prop_get_symbol(struct property *prop) +{ + if (prop->expr && (prop->expr->type == E_SYMBOL || + prop->expr->type == E_LIST)) + return prop->expr->left.sym; + return NULL; +} + +const char *prop_get_type_name(enum prop_type type) +{ + switch (type) { + case P_PROMPT: + return "prompt"; + case P_COMMENT: + return "comment"; + case P_MENU: + return "menu"; + case P_DEFAULT: + return "default"; + case P_CHOICE: + return "choice"; + case P_SELECT: + return "select"; + case P_IMPLY: + return "imply"; + case P_RANGE: + return "range"; + case P_SYMBOL: + return "symbol"; + case P_UNKNOWN: + break; + } + return "unknown"; +} diff --git a/src/net/scripts/kconfig/tests/auto_submenu/Kconfig b/src/net/scripts/kconfig/tests/auto_submenu/Kconfig new file mode 100644 index 0000000..b20761e --- /dev/null +++ b/src/net/scripts/kconfig/tests/auto_submenu/Kconfig @@ -0,0 +1,52 @@ +# SPDX-License-Identifier: GPL-2.0 + +config A + bool "A" + default y + +config A0 + bool "A0" + depends on A + default y + help + This depends on A, so should be a submenu of A. + +config A0_0 + bool "A1_0" + depends on A0 + help + Submenus are created recursively. + This should be a submenu of A0. + +config A1 + bool "A1" + depends on A + default y + help + This should line up with A0. + +choice + prompt "choice" + depends on A1 + help + Choice should become a submenu as well. + +config A1_0 + bool "A1_0" + +config A1_1 + bool "A1_1" + +endchoice + +config B + bool "B" + help + This is independent of A. + +config C + bool "C" + depends on A + help + This depends on A, but not a consecutive item, so can/should not + be a submenu. diff --git a/src/net/scripts/kconfig/tests/auto_submenu/__init__.py b/src/net/scripts/kconfig/tests/auto_submenu/__init__.py new file mode 100644 index 0000000..25abd92 --- /dev/null +++ b/src/net/scripts/kconfig/tests/auto_submenu/__init__.py @@ -0,0 +1,13 @@ +# SPDX-License-Identifier: GPL-2.0 +""" +Create submenu for symbols that depend on the preceding one. + +If a symbols has dependency on the preceding symbol, the menu entry +should become the submenu of the preceding one, and displayed with +deeper indentation. +""" + + +def test(conf): + assert conf.oldaskconfig() == 0 + assert conf.stdout_contains('expected_stdout') diff --git a/src/net/scripts/kconfig/tests/auto_submenu/expected_stdout b/src/net/scripts/kconfig/tests/auto_submenu/expected_stdout new file mode 100644 index 0000000..bf5236f --- /dev/null +++ b/src/net/scripts/kconfig/tests/auto_submenu/expected_stdout @@ -0,0 +1,10 @@ +A (A) [Y/n/?] (NEW) + A0 (A0) [Y/n/?] (NEW) + A1_0 (A0_0) [N/y/?] (NEW) + A1 (A1) [Y/n/?] (NEW) + choice + > 1. A1_0 (A1_0) (NEW) + 2. A1_1 (A1_1) (NEW) + choice[1-2?]: +B (B) [N/y/?] (NEW) +C (C) [N/y/?] (NEW) diff --git a/src/net/scripts/kconfig/tests/choice/Kconfig b/src/net/scripts/kconfig/tests/choice/Kconfig new file mode 100644 index 0000000..a412205 --- /dev/null +++ b/src/net/scripts/kconfig/tests/choice/Kconfig @@ -0,0 +1,56 @@ +# SPDX-License-Identifier: GPL-2.0 + +config MODULES + bool "Enable loadable module support" + option modules + default y + +choice + prompt "boolean choice" + default BOOL_CHOICE1 + +config BOOL_CHOICE0 + bool "choice 0" + +config BOOL_CHOICE1 + bool "choice 1" + +endchoice + +choice + prompt "optional boolean choice" + optional + default OPT_BOOL_CHOICE1 + +config OPT_BOOL_CHOICE0 + bool "choice 0" + +config OPT_BOOL_CHOICE1 + bool "choice 1" + +endchoice + +choice + prompt "tristate choice" + default TRI_CHOICE1 + +config TRI_CHOICE0 + tristate "choice 0" + +config TRI_CHOICE1 + tristate "choice 1" + +endchoice + +choice + prompt "optional tristate choice" + optional + default OPT_TRI_CHOICE1 + +config OPT_TRI_CHOICE0 + tristate "choice 0" + +config OPT_TRI_CHOICE1 + tristate "choice 1" + +endchoice diff --git a/src/net/scripts/kconfig/tests/choice/__init__.py b/src/net/scripts/kconfig/tests/choice/__init__.py new file mode 100644 index 0000000..4318fce --- /dev/null +++ b/src/net/scripts/kconfig/tests/choice/__init__.py @@ -0,0 +1,41 @@ +# SPDX-License-Identifier: GPL-2.0 +""" +Basic choice tests. + +The handling of 'choice' is a bit complicated part in Kconfig. + +The behavior of 'y' choice is intuitive. If choice values are tristate, +the choice can be 'm' where each value can be enabled independently. +Also, if a choice is marked as 'optional', the whole choice can be +invisible. +""" + + +def test_oldask0(conf): + assert conf.oldaskconfig() == 0 + assert conf.stdout_contains('oldask0_expected_stdout') + + +def test_oldask1(conf): + assert conf.oldaskconfig('oldask1_config') == 0 + assert conf.stdout_contains('oldask1_expected_stdout') + + +def test_allyes(conf): + assert conf.allyesconfig() == 0 + assert conf.config_contains('allyes_expected_config') + + +def test_allmod(conf): + assert conf.allmodconfig() == 0 + assert conf.config_contains('allmod_expected_config') + + +def test_allno(conf): + assert conf.allnoconfig() == 0 + assert conf.config_contains('allno_expected_config') + + +def test_alldef(conf): + assert conf.alldefconfig() == 0 + assert conf.config_contains('alldef_expected_config') diff --git a/src/net/scripts/kconfig/tests/choice/alldef_expected_config b/src/net/scripts/kconfig/tests/choice/alldef_expected_config new file mode 100644 index 0000000..7a754bf --- /dev/null +++ b/src/net/scripts/kconfig/tests/choice/alldef_expected_config @@ -0,0 +1,5 @@ +CONFIG_MODULES=y +# CONFIG_BOOL_CHOICE0 is not set +CONFIG_BOOL_CHOICE1=y +# CONFIG_TRI_CHOICE0 is not set +# CONFIG_TRI_CHOICE1 is not set diff --git a/src/net/scripts/kconfig/tests/choice/allmod_expected_config b/src/net/scripts/kconfig/tests/choice/allmod_expected_config new file mode 100644 index 0000000..f1f5dcd --- /dev/null +++ b/src/net/scripts/kconfig/tests/choice/allmod_expected_config @@ -0,0 +1,9 @@ +CONFIG_MODULES=y +# CONFIG_BOOL_CHOICE0 is not set +CONFIG_BOOL_CHOICE1=y +# CONFIG_OPT_BOOL_CHOICE0 is not set +CONFIG_OPT_BOOL_CHOICE1=y +CONFIG_TRI_CHOICE0=m +CONFIG_TRI_CHOICE1=m +CONFIG_OPT_TRI_CHOICE0=m +CONFIG_OPT_TRI_CHOICE1=m diff --git a/src/net/scripts/kconfig/tests/choice/allno_expected_config b/src/net/scripts/kconfig/tests/choice/allno_expected_config new file mode 100644 index 0000000..b88ee7a --- /dev/null +++ b/src/net/scripts/kconfig/tests/choice/allno_expected_config @@ -0,0 +1,5 @@ +# CONFIG_MODULES is not set +# CONFIG_BOOL_CHOICE0 is not set +CONFIG_BOOL_CHOICE1=y +# CONFIG_TRI_CHOICE0 is not set +CONFIG_TRI_CHOICE1=y diff --git a/src/net/scripts/kconfig/tests/choice/allyes_expected_config b/src/net/scripts/kconfig/tests/choice/allyes_expected_config new file mode 100644 index 0000000..e5a062a --- /dev/null +++ b/src/net/scripts/kconfig/tests/choice/allyes_expected_config @@ -0,0 +1,9 @@ +CONFIG_MODULES=y +# CONFIG_BOOL_CHOICE0 is not set +CONFIG_BOOL_CHOICE1=y +# CONFIG_OPT_BOOL_CHOICE0 is not set +CONFIG_OPT_BOOL_CHOICE1=y +# CONFIG_TRI_CHOICE0 is not set +CONFIG_TRI_CHOICE1=y +# CONFIG_OPT_TRI_CHOICE0 is not set +CONFIG_OPT_TRI_CHOICE1=y diff --git a/src/net/scripts/kconfig/tests/choice/oldask0_expected_stdout b/src/net/scripts/kconfig/tests/choice/oldask0_expected_stdout new file mode 100644 index 0000000..b251bba --- /dev/null +++ b/src/net/scripts/kconfig/tests/choice/oldask0_expected_stdout @@ -0,0 +1,10 @@ +Enable loadable module support (MODULES) [Y/n/?] (NEW) +boolean choice + 1. choice 0 (BOOL_CHOICE0) (NEW) +> 2. choice 1 (BOOL_CHOICE1) (NEW) +choice[1-2?]: +optional boolean choice [N/y/?] (NEW) +tristate choice [M/y/?] (NEW) + choice 0 (TRI_CHOICE0) [N/m/?] (NEW) + choice 1 (TRI_CHOICE1) [N/m/?] (NEW) +optional tristate choice [N/m/y/?] (NEW) diff --git a/src/net/scripts/kconfig/tests/choice/oldask1_config b/src/net/scripts/kconfig/tests/choice/oldask1_config new file mode 100644 index 0000000..b67bfe3 --- /dev/null +++ b/src/net/scripts/kconfig/tests/choice/oldask1_config @@ -0,0 +1,2 @@ +# CONFIG_MODULES is not set +CONFIG_OPT_BOOL_CHOICE0=y diff --git a/src/net/scripts/kconfig/tests/choice/oldask1_expected_stdout b/src/net/scripts/kconfig/tests/choice/oldask1_expected_stdout new file mode 100644 index 0000000..c2125e9 --- /dev/null +++ b/src/net/scripts/kconfig/tests/choice/oldask1_expected_stdout @@ -0,0 +1,15 @@ +Enable loadable module support (MODULES) [N/y/?] +boolean choice + 1. choice 0 (BOOL_CHOICE0) (NEW) +> 2. choice 1 (BOOL_CHOICE1) (NEW) +choice[1-2?]: +optional boolean choice [Y/n/?] (NEW) +optional boolean choice +> 1. choice 0 (OPT_BOOL_CHOICE0) + 2. choice 1 (OPT_BOOL_CHOICE1) (NEW) +choice[1-2?]: +tristate choice + 1. choice 0 (TRI_CHOICE0) (NEW) +> 2. choice 1 (TRI_CHOICE1) (NEW) +choice[1-2?]: +optional tristate choice [N/y/?] diff --git a/src/net/scripts/kconfig/tests/choice_value_with_m_dep/Kconfig b/src/net/scripts/kconfig/tests/choice_value_with_m_dep/Kconfig new file mode 100644 index 0000000..7106c26 --- /dev/null +++ b/src/net/scripts/kconfig/tests/choice_value_with_m_dep/Kconfig @@ -0,0 +1,21 @@ +# SPDX-License-Identifier: GPL-2.0 + +config MODULES + def_bool y + option modules + +config DEP + tristate + default m + +choice + prompt "Tristate Choice" + +config CHOICE0 + tristate "Choice 0" + +config CHOICE1 + tristate "Choice 1" + depends on DEP + +endchoice diff --git a/src/net/scripts/kconfig/tests/choice_value_with_m_dep/__init__.py b/src/net/scripts/kconfig/tests/choice_value_with_m_dep/__init__.py new file mode 100644 index 0000000..075b4e0 --- /dev/null +++ b/src/net/scripts/kconfig/tests/choice_value_with_m_dep/__init__.py @@ -0,0 +1,16 @@ +# SPDX-License-Identifier: GPL-2.0 +""" +Hide tristate choice values with mod dependency in y choice. + +If tristate choice values depend on symbols set to 'm', they should be +hidden when the choice containing them is changed from 'm' to 'y' +(i.e. exclusive choice). + +Related Linux commit: fa64e5f6a35efd5e77d639125d973077ca506074 +""" + + +def test(conf): + assert conf.oldaskconfig('config', 'y') == 0 + assert conf.config_contains('expected_config') + assert conf.stdout_contains('expected_stdout') diff --git a/src/net/scripts/kconfig/tests/choice_value_with_m_dep/config b/src/net/scripts/kconfig/tests/choice_value_with_m_dep/config new file mode 100644 index 0000000..3a126b7 --- /dev/null +++ b/src/net/scripts/kconfig/tests/choice_value_with_m_dep/config @@ -0,0 +1,2 @@ +CONFIG_CHOICE0=m +CONFIG_CHOICE1=m diff --git a/src/net/scripts/kconfig/tests/choice_value_with_m_dep/expected_config b/src/net/scripts/kconfig/tests/choice_value_with_m_dep/expected_config new file mode 100644 index 0000000..4d07b44 --- /dev/null +++ b/src/net/scripts/kconfig/tests/choice_value_with_m_dep/expected_config @@ -0,0 +1,3 @@ +CONFIG_MODULES=y +CONFIG_DEP=m +CONFIG_CHOICE0=y diff --git a/src/net/scripts/kconfig/tests/choice_value_with_m_dep/expected_stdout b/src/net/scripts/kconfig/tests/choice_value_with_m_dep/expected_stdout new file mode 100644 index 0000000..2b50ab6 --- /dev/null +++ b/src/net/scripts/kconfig/tests/choice_value_with_m_dep/expected_stdout @@ -0,0 +1,4 @@ +Tristate Choice [M/y/?] y +Tristate Choice +> 1. Choice 0 (CHOICE0) +choice[1]: 1 diff --git a/src/net/scripts/kconfig/tests/conftest.py b/src/net/scripts/kconfig/tests/conftest.py new file mode 100644 index 0000000..0345ef6 --- /dev/null +++ b/src/net/scripts/kconfig/tests/conftest.py @@ -0,0 +1,291 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# Copyright (C) 2018 Masahiro Yamada <yamada.masahiro@socionext.com> +# + +""" +Kconfig unit testing framework. + +This provides fixture functions commonly used from test files. +""" + +import os +import pytest +import shutil +import subprocess +import tempfile + +CONF_PATH = os.path.abspath(os.path.join('scripts', 'kconfig', 'conf')) + + +class Conf: + """Kconfig runner and result checker. + + This class provides methods to run text-based interface of Kconfig + (scripts/kconfig/conf) and retrieve the resulted configuration, + stdout, and stderr. It also provides methods to compare those + results with expectations. + """ + + def __init__(self, request): + """Create a new Conf instance. + + request: object to introspect the requesting test module + """ + # the directory of the test being run + self._test_dir = os.path.dirname(str(request.fspath)) + + # runners + def _run_conf(self, mode, dot_config=None, out_file='.config', + interactive=False, in_keys=None, extra_env={}): + """Run text-based Kconfig executable and save the result. + + mode: input mode option (--oldaskconfig, --defconfig=<file> etc.) + dot_config: .config file to use for configuration base + out_file: file name to contain the output config data + interactive: flag to specify the interactive mode + in_keys: key inputs for interactive modes + extra_env: additional environments + returncode: exit status of the Kconfig executable + """ + command = [CONF_PATH, mode, 'Kconfig'] + + # Override 'srctree' environment to make the test as the top directory + extra_env['srctree'] = self._test_dir + + # Run Kconfig in a temporary directory. + # This directory is automatically removed when done. + with tempfile.TemporaryDirectory() as temp_dir: + + # if .config is given, copy it to the working directory + if dot_config: + shutil.copyfile(os.path.join(self._test_dir, dot_config), + os.path.join(temp_dir, '.config')) + + ps = subprocess.Popen(command, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + cwd=temp_dir, + env=dict(os.environ, **extra_env)) + + # If input key sequence is given, feed it to stdin. + if in_keys: + ps.stdin.write(in_keys.encode('utf-8')) + + while ps.poll() is None: + # For interactive modes such as oldaskconfig, oldconfig, + # send 'Enter' key until the program finishes. + if interactive: + ps.stdin.write(b'\n') + + self.retcode = ps.returncode + self.stdout = ps.stdout.read().decode() + self.stderr = ps.stderr.read().decode() + + # Retrieve the resulted config data only when .config is supposed + # to exist. If the command fails, the .config does not exist. + # 'listnewconfig' does not produce .config in the first place. + if self.retcode == 0 and out_file: + with open(os.path.join(temp_dir, out_file)) as f: + self.config = f.read() + else: + self.config = None + + # Logging: + # Pytest captures the following information by default. In failure + # of tests, the captured log will be displayed. This will be useful to + # figure out what has happened. + + print("[command]\n{}\n".format(' '.join(command))) + + print("[retcode]\n{}\n".format(self.retcode)) + + print("[stdout]") + print(self.stdout) + + print("[stderr]") + print(self.stderr) + + if self.config is not None: + print("[output for '{}']".format(out_file)) + print(self.config) + + return self.retcode + + def oldaskconfig(self, dot_config=None, in_keys=None): + """Run oldaskconfig. + + dot_config: .config file to use for configuration base (optional) + in_key: key inputs (optional) + returncode: exit status of the Kconfig executable + """ + return self._run_conf('--oldaskconfig', dot_config=dot_config, + interactive=True, in_keys=in_keys) + + def oldconfig(self, dot_config=None, in_keys=None): + """Run oldconfig. + + dot_config: .config file to use for configuration base (optional) + in_key: key inputs (optional) + returncode: exit status of the Kconfig executable + """ + return self._run_conf('--oldconfig', dot_config=dot_config, + interactive=True, in_keys=in_keys) + + def olddefconfig(self, dot_config=None): + """Run olddefconfig. + + dot_config: .config file to use for configuration base (optional) + returncode: exit status of the Kconfig executable + """ + return self._run_conf('--olddefconfig', dot_config=dot_config) + + def defconfig(self, defconfig): + """Run defconfig. + + defconfig: defconfig file for input + returncode: exit status of the Kconfig executable + """ + defconfig_path = os.path.join(self._test_dir, defconfig) + return self._run_conf('--defconfig={}'.format(defconfig_path)) + + def _allconfig(self, mode, all_config): + if all_config: + all_config_path = os.path.join(self._test_dir, all_config) + extra_env = {'KCONFIG_ALLCONFIG': all_config_path} + else: + extra_env = {} + + return self._run_conf('--{}config'.format(mode), extra_env=extra_env) + + def allyesconfig(self, all_config=None): + """Run allyesconfig. + + all_config: fragment config file for KCONFIG_ALLCONFIG (optional) + returncode: exit status of the Kconfig executable + """ + return self._allconfig('allyes', all_config) + + def allmodconfig(self, all_config=None): + """Run allmodconfig. + + all_config: fragment config file for KCONFIG_ALLCONFIG (optional) + returncode: exit status of the Kconfig executable + """ + return self._allconfig('allmod', all_config) + + def allnoconfig(self, all_config=None): + """Run allnoconfig. + + all_config: fragment config file for KCONFIG_ALLCONFIG (optional) + returncode: exit status of the Kconfig executable + """ + return self._allconfig('allno', all_config) + + def alldefconfig(self, all_config=None): + """Run alldefconfig. + + all_config: fragment config file for KCONFIG_ALLCONFIG (optional) + returncode: exit status of the Kconfig executable + """ + return self._allconfig('alldef', all_config) + + def randconfig(self, all_config=None): + """Run randconfig. + + all_config: fragment config file for KCONFIG_ALLCONFIG (optional) + returncode: exit status of the Kconfig executable + """ + return self._allconfig('rand', all_config) + + def savedefconfig(self, dot_config): + """Run savedefconfig. + + dot_config: .config file for input + returncode: exit status of the Kconfig executable + """ + return self._run_conf('--savedefconfig', out_file='defconfig') + + def listnewconfig(self, dot_config=None): + """Run listnewconfig. + + dot_config: .config file to use for configuration base (optional) + returncode: exit status of the Kconfig executable + """ + return self._run_conf('--listnewconfig', dot_config=dot_config, + out_file=None) + + # checkers + def _read_and_compare(self, compare, expected): + """Compare the result with expectation. + + compare: function to compare the result with expectation + expected: file that contains the expected data + """ + with open(os.path.join(self._test_dir, expected)) as f: + expected_data = f.read() + return compare(self, expected_data) + + def _contains(self, attr, expected): + return self._read_and_compare( + lambda s, e: getattr(s, attr).find(e) >= 0, + expected) + + def _matches(self, attr, expected): + return self._read_and_compare(lambda s, e: getattr(s, attr) == e, + expected) + + def config_contains(self, expected): + """Check if resulted configuration contains expected data. + + expected: file that contains the expected data + returncode: True if result contains the expected data, False otherwise + """ + return self._contains('config', expected) + + def config_matches(self, expected): + """Check if resulted configuration exactly matches expected data. + + expected: file that contains the expected data + returncode: True if result matches the expected data, False otherwise + """ + return self._matches('config', expected) + + def stdout_contains(self, expected): + """Check if resulted stdout contains expected data. + + expected: file that contains the expected data + returncode: True if result contains the expected data, False otherwise + """ + return self._contains('stdout', expected) + + def stdout_matches(self, expected): + """Check if resulted stdout exactly matches expected data. + + expected: file that contains the expected data + returncode: True if result matches the expected data, False otherwise + """ + return self._matches('stdout', expected) + + def stderr_contains(self, expected): + """Check if resulted stderr contains expected data. + + expected: file that contains the expected data + returncode: True if result contains the expected data, False otherwise + """ + return self._contains('stderr', expected) + + def stderr_matches(self, expected): + """Check if resulted stderr exactly matches expected data. + + expected: file that contains the expected data + returncode: True if result matches the expected data, False otherwise + """ + return self._matches('stderr', expected) + + +@pytest.fixture(scope="module") +def conf(request): + """Create a Conf instance and provide it to test functions.""" + return Conf(request) diff --git a/src/net/scripts/kconfig/tests/err_recursive_dep/Kconfig b/src/net/scripts/kconfig/tests/err_recursive_dep/Kconfig new file mode 100644 index 0000000..ebdb3ff --- /dev/null +++ b/src/net/scripts/kconfig/tests/err_recursive_dep/Kconfig @@ -0,0 +1,63 @@ +# SPDX-License-Identifier: GPL-2.0 + +# depends on itself + +config A + bool "A" + depends on A + +# select itself + +config B + bool + select B + +# depends on each other + +config C1 + bool "C1" + depends on C2 + +config C2 + bool "C2" + depends on C1 + +# depends on and select + +config D1 + bool "D1" + depends on D2 + select D2 + +config D2 + bool + +# depends on and imply + +config E1 + bool "E1" + depends on E2 + imply E2 + +config E2 + bool "E2" + +# property + +config F1 + bool "F1" + default F2 + +config F2 + bool "F2" + depends on F1 + +# menu + +menu "menu depending on its content" + depends on G + +config G + bool "G" + +endmenu diff --git a/src/net/scripts/kconfig/tests/err_recursive_dep/__init__.py b/src/net/scripts/kconfig/tests/err_recursive_dep/__init__.py new file mode 100644 index 0000000..5f3821b --- /dev/null +++ b/src/net/scripts/kconfig/tests/err_recursive_dep/__init__.py @@ -0,0 +1,10 @@ +# SPDX-License-Identifier: GPL-2.0 +""" +Detect recursive dependency error. + +Recursive dependency should be treated as an error. +""" + +def test(conf): + assert conf.oldaskconfig() == 1 + assert conf.stderr_contains('expected_stderr') diff --git a/src/net/scripts/kconfig/tests/err_recursive_dep/expected_stderr b/src/net/scripts/kconfig/tests/err_recursive_dep/expected_stderr new file mode 100644 index 0000000..c9f4abf --- /dev/null +++ b/src/net/scripts/kconfig/tests/err_recursive_dep/expected_stderr @@ -0,0 +1,38 @@ +Kconfig:11:error: recursive dependency detected! +Kconfig:11: symbol B is selected by B +For a resolution refer to Documentation/kbuild/kconfig-language.rst +subsection "Kconfig recursive dependency limitations" + +Kconfig:5:error: recursive dependency detected! +Kconfig:5: symbol A depends on A +For a resolution refer to Documentation/kbuild/kconfig-language.rst +subsection "Kconfig recursive dependency limitations" + +Kconfig:17:error: recursive dependency detected! +Kconfig:17: symbol C1 depends on C2 +Kconfig:21: symbol C2 depends on C1 +For a resolution refer to Documentation/kbuild/kconfig-language.rst +subsection "Kconfig recursive dependency limitations" + +Kconfig:32:error: recursive dependency detected! +Kconfig:32: symbol D2 is selected by D1 +Kconfig:27: symbol D1 depends on D2 +For a resolution refer to Documentation/kbuild/kconfig-language.rst +subsection "Kconfig recursive dependency limitations" + +Kconfig:37:error: recursive dependency detected! +Kconfig:37: symbol E1 depends on E2 +Kconfig:42: symbol E2 is implied by E1 +For a resolution refer to Documentation/kbuild/kconfig-language.rst +subsection "Kconfig recursive dependency limitations" + +Kconfig:60:error: recursive dependency detected! +Kconfig:60: symbol G depends on G +For a resolution refer to Documentation/kbuild/kconfig-language.rst +subsection "Kconfig recursive dependency limitations" + +Kconfig:51:error: recursive dependency detected! +Kconfig:51: symbol F2 depends on F1 +Kconfig:49: symbol F1 default value contains F2 +For a resolution refer to Documentation/kbuild/kconfig-language.rst +subsection "Kconfig recursive dependency limitations" diff --git a/src/net/scripts/kconfig/tests/err_recursive_inc/Kconfig b/src/net/scripts/kconfig/tests/err_recursive_inc/Kconfig new file mode 100644 index 0000000..c6f4ade --- /dev/null +++ b/src/net/scripts/kconfig/tests/err_recursive_inc/Kconfig @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: GPL-2.0-only +source "Kconfig.inc1" diff --git a/src/net/scripts/kconfig/tests/err_recursive_inc/Kconfig.inc1 b/src/net/scripts/kconfig/tests/err_recursive_inc/Kconfig.inc1 new file mode 100644 index 0000000..01cbf0d --- /dev/null +++ b/src/net/scripts/kconfig/tests/err_recursive_inc/Kconfig.inc1 @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0-only + + + +source "Kconfig.inc2" diff --git a/src/net/scripts/kconfig/tests/err_recursive_inc/Kconfig.inc2 b/src/net/scripts/kconfig/tests/err_recursive_inc/Kconfig.inc2 new file mode 100644 index 0000000..8235107 --- /dev/null +++ b/src/net/scripts/kconfig/tests/err_recursive_inc/Kconfig.inc2 @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0-only + + +source "Kconfig.inc3" diff --git a/src/net/scripts/kconfig/tests/err_recursive_inc/Kconfig.inc3 b/src/net/scripts/kconfig/tests/err_recursive_inc/Kconfig.inc3 new file mode 100644 index 0000000..c6f4ade --- /dev/null +++ b/src/net/scripts/kconfig/tests/err_recursive_inc/Kconfig.inc3 @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: GPL-2.0-only +source "Kconfig.inc1" diff --git a/src/net/scripts/kconfig/tests/err_recursive_inc/__init__.py b/src/net/scripts/kconfig/tests/err_recursive_inc/__init__.py new file mode 100644 index 0000000..27aa189 --- /dev/null +++ b/src/net/scripts/kconfig/tests/err_recursive_inc/__init__.py @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: GPL-2.0 +""" +Detect recursive inclusion error. + +If recursive inclusion is detected, it should fail with error messages. +""" + + +def test(conf): + assert conf.oldaskconfig() != 0 + assert conf.stderr_contains('expected_stderr') diff --git a/src/net/scripts/kconfig/tests/err_recursive_inc/expected_stderr b/src/net/scripts/kconfig/tests/err_recursive_inc/expected_stderr new file mode 100644 index 0000000..b070a31 --- /dev/null +++ b/src/net/scripts/kconfig/tests/err_recursive_inc/expected_stderr @@ -0,0 +1,6 @@ +Recursive inclusion detected. +Inclusion path: + current file : Kconfig.inc1 + included from: Kconfig.inc3:2 + included from: Kconfig.inc2:4 + included from: Kconfig.inc1:5 diff --git a/src/net/scripts/kconfig/tests/inter_choice/Kconfig b/src/net/scripts/kconfig/tests/inter_choice/Kconfig new file mode 100644 index 0000000..5698a40 --- /dev/null +++ b/src/net/scripts/kconfig/tests/inter_choice/Kconfig @@ -0,0 +1,25 @@ +# SPDX-License-Identifier: GPL-2.0 + +config MODULES + def_bool y + option modules + +choice + prompt "Choice" + +config CHOICE_VAL0 + tristate "Choice 0" + +config CHOIVE_VAL1 + tristate "Choice 1" + +endchoice + +choice + prompt "Another choice" + depends on CHOICE_VAL0 + +config DUMMY + bool "dummy" + +endchoice diff --git a/src/net/scripts/kconfig/tests/inter_choice/__init__.py b/src/net/scripts/kconfig/tests/inter_choice/__init__.py new file mode 100644 index 0000000..ffea6b1 --- /dev/null +++ b/src/net/scripts/kconfig/tests/inter_choice/__init__.py @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: GPL-2.0 +""" +Do not affect user-assigned choice value by another choice. + +Handling of state flags for choices is complecated. In old days, +the defconfig result of a choice could be affected by another choice +if those choices interact by 'depends on', 'select', etc. + +Related Linux commit: fbe98bb9ed3dae23e320c6b113e35f129538d14a +""" + + +def test(conf): + assert conf.defconfig('defconfig') == 0 + assert conf.config_contains('expected_config') diff --git a/src/net/scripts/kconfig/tests/inter_choice/defconfig b/src/net/scripts/kconfig/tests/inter_choice/defconfig new file mode 100644 index 0000000..162c414 --- /dev/null +++ b/src/net/scripts/kconfig/tests/inter_choice/defconfig @@ -0,0 +1 @@ +CONFIG_CHOICE_VAL0=y diff --git a/src/net/scripts/kconfig/tests/inter_choice/expected_config b/src/net/scripts/kconfig/tests/inter_choice/expected_config new file mode 100644 index 0000000..5dceefb --- /dev/null +++ b/src/net/scripts/kconfig/tests/inter_choice/expected_config @@ -0,0 +1,4 @@ +CONFIG_MODULES=y +CONFIG_CHOICE_VAL0=y +# CONFIG_CHOIVE_VAL1 is not set +CONFIG_DUMMY=y diff --git a/src/net/scripts/kconfig/tests/new_choice_with_dep/Kconfig b/src/net/scripts/kconfig/tests/new_choice_with_dep/Kconfig new file mode 100644 index 0000000..127731c --- /dev/null +++ b/src/net/scripts/kconfig/tests/new_choice_with_dep/Kconfig @@ -0,0 +1,39 @@ +# SPDX-License-Identifier: GPL-2.0 + +config A + bool "A" + help + This is a new symbol. + +choice + prompt "Choice ?" + depends on A + help + "depends on A" has been newly added. + +config CHOICE_B + bool "Choice B" + +config CHOICE_C + bool "Choice C" + help + This is a new symbol, so should be asked. + +endchoice + +choice + prompt "Choice2 ?" + +config CHOICE_D + bool "Choice D" + +config CHOICE_E + bool "Choice E" + +config CHOICE_F + bool "Choice F" + depends on A + help + This is a new symbol, so should be asked. + +endchoice diff --git a/src/net/scripts/kconfig/tests/new_choice_with_dep/__init__.py b/src/net/scripts/kconfig/tests/new_choice_with_dep/__init__.py new file mode 100644 index 0000000..fe9d322 --- /dev/null +++ b/src/net/scripts/kconfig/tests/new_choice_with_dep/__init__.py @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: GPL-2.0 +""" +Ask new choice values when they become visible. + +If new choice values are added with new dependency, and they become +visible during user configuration, oldconfig should recognize them +as (NEW), and ask the user for choice. + +Related Linux commit: 5d09598d488f081e3be23f885ed65cbbe2d073b5 +""" + + +def test(conf): + assert conf.oldconfig('config', 'y') == 0 + assert conf.stdout_contains('expected_stdout') diff --git a/src/net/scripts/kconfig/tests/new_choice_with_dep/config b/src/net/scripts/kconfig/tests/new_choice_with_dep/config new file mode 100644 index 0000000..47ef95d --- /dev/null +++ b/src/net/scripts/kconfig/tests/new_choice_with_dep/config @@ -0,0 +1,3 @@ +CONFIG_CHOICE_B=y +# CONFIG_CHOICE_D is not set +CONFIG_CHOICE_E=y diff --git a/src/net/scripts/kconfig/tests/new_choice_with_dep/expected_stdout b/src/net/scripts/kconfig/tests/new_choice_with_dep/expected_stdout new file mode 100644 index 0000000..74dc0bc --- /dev/null +++ b/src/net/scripts/kconfig/tests/new_choice_with_dep/expected_stdout @@ -0,0 +1,10 @@ +A (A) [N/y/?] (NEW) y + Choice ? + > 1. Choice B (CHOICE_B) + 2. Choice C (CHOICE_C) (NEW) + choice[1-2?]: +Choice2 ? + 1. Choice D (CHOICE_D) +> 2. Choice E (CHOICE_E) + 3. Choice F (CHOICE_F) (NEW) +choice[1-3?]: diff --git a/src/net/scripts/kconfig/tests/no_write_if_dep_unmet/Kconfig b/src/net/scripts/kconfig/tests/no_write_if_dep_unmet/Kconfig new file mode 100644 index 0000000..4767aab --- /dev/null +++ b/src/net/scripts/kconfig/tests/no_write_if_dep_unmet/Kconfig @@ -0,0 +1,16 @@ +# SPDX-License-Identifier: GPL-2.0 + +config A + bool "A" + +choice + prompt "Choice ?" + depends on A + +config CHOICE_B + bool "Choice B" + +config CHOICE_C + bool "Choice C" + +endchoice diff --git a/src/net/scripts/kconfig/tests/no_write_if_dep_unmet/__init__.py b/src/net/scripts/kconfig/tests/no_write_if_dep_unmet/__init__.py new file mode 100644 index 0000000..ffd469d --- /dev/null +++ b/src/net/scripts/kconfig/tests/no_write_if_dep_unmet/__init__.py @@ -0,0 +1,20 @@ +# SPDX-License-Identifier: GPL-2.0 +""" +Do not write choice values to .config if the dependency is unmet. + +"# CONFIG_... is not set" should not be written into the .config file +for symbols with unmet dependency. + +This was not working correctly for choice values because choice needs +a bit different symbol computation. + +This checks that no unneeded "# COFIG_... is not set" is contained in +the .config file. + +Related Linux commit: cb67ab2cd2b8abd9650292c986c79901e3073a59 +""" + + +def test(conf): + assert conf.oldaskconfig('config', 'n') == 0 + assert conf.config_matches('expected_config') diff --git a/src/net/scripts/kconfig/tests/no_write_if_dep_unmet/config b/src/net/scripts/kconfig/tests/no_write_if_dep_unmet/config new file mode 100644 index 0000000..abd280e --- /dev/null +++ b/src/net/scripts/kconfig/tests/no_write_if_dep_unmet/config @@ -0,0 +1 @@ +CONFIG_A=y diff --git a/src/net/scripts/kconfig/tests/no_write_if_dep_unmet/expected_config b/src/net/scripts/kconfig/tests/no_write_if_dep_unmet/expected_config new file mode 100644 index 0000000..4732288 --- /dev/null +++ b/src/net/scripts/kconfig/tests/no_write_if_dep_unmet/expected_config @@ -0,0 +1,5 @@ +# +# Automatically generated file; DO NOT EDIT. +# Main menu +# +# CONFIG_A is not set diff --git a/src/net/scripts/kconfig/tests/preprocess/builtin_func/Kconfig b/src/net/scripts/kconfig/tests/preprocess/builtin_func/Kconfig new file mode 100644 index 0000000..baa3288 --- /dev/null +++ b/src/net/scripts/kconfig/tests/preprocess/builtin_func/Kconfig @@ -0,0 +1,27 @@ +# SPDX-License-Identifier: GPL-2.0 + +# 'info' prints the argument to stdout. +$(info,hello world 0) + +# 'warning-if', if the first argument is y, sends the second argument to stderr, +# and the message is prefixed with the current file name and line number. +$(warning-if,y,hello world 1) + +# 'error-if' is similar, but it terminates the parsing immediately. +# The following is just no-op since the first argument is not y. +$(error-if,n,this should not be printed) + +# Shorthand +warning = $(warning-if,y,$(1)) + +# 'shell' executes a command, and returns its stdout. +$(warning,$(shell,echo hello world 3)) + +# Every newline in the output is replaced with a space, +# but any trailing newlines are deleted. +$(warning,$(shell,printf 'hello\nworld\n\n4\n\n\n')) + +# 'filename' is expanded to the currently parsed file name, +# 'lineno' to the line number. +$(warning,filename=$(filename)) +$(warning,lineno=$(lineno)) diff --git a/src/net/scripts/kconfig/tests/preprocess/builtin_func/__init__.py b/src/net/scripts/kconfig/tests/preprocess/builtin_func/__init__.py new file mode 100644 index 0000000..2e53ba0 --- /dev/null +++ b/src/net/scripts/kconfig/tests/preprocess/builtin_func/__init__.py @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: GPL-2.0 +""" +Built-in function tests. +""" + +def test(conf): + assert conf.oldaskconfig() == 0 + assert conf.stdout_contains('expected_stdout') + assert conf.stderr_matches('expected_stderr') diff --git a/src/net/scripts/kconfig/tests/preprocess/builtin_func/expected_stderr b/src/net/scripts/kconfig/tests/preprocess/builtin_func/expected_stderr new file mode 100644 index 0000000..33ea9ca --- /dev/null +++ b/src/net/scripts/kconfig/tests/preprocess/builtin_func/expected_stderr @@ -0,0 +1,5 @@ +Kconfig:8: hello world 1 +Kconfig:18: hello world 3 +Kconfig:22: hello world 4 +Kconfig:26: filename=Kconfig +Kconfig:27: lineno=27 diff --git a/src/net/scripts/kconfig/tests/preprocess/builtin_func/expected_stdout b/src/net/scripts/kconfig/tests/preprocess/builtin_func/expected_stdout new file mode 100644 index 0000000..82de3a7 --- /dev/null +++ b/src/net/scripts/kconfig/tests/preprocess/builtin_func/expected_stdout @@ -0,0 +1 @@ +hello world 0 diff --git a/src/net/scripts/kconfig/tests/preprocess/circular_expansion/Kconfig b/src/net/scripts/kconfig/tests/preprocess/circular_expansion/Kconfig new file mode 100644 index 0000000..6838997 --- /dev/null +++ b/src/net/scripts/kconfig/tests/preprocess/circular_expansion/Kconfig @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0 + +X = $(Y) +Y = $(X) +$(info $(X)) diff --git a/src/net/scripts/kconfig/tests/preprocess/circular_expansion/__init__.py b/src/net/scripts/kconfig/tests/preprocess/circular_expansion/__init__.py new file mode 100644 index 0000000..419bda3 --- /dev/null +++ b/src/net/scripts/kconfig/tests/preprocess/circular_expansion/__init__.py @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: GPL-2.0 +""" +Detect circular variable expansion. + +If a recursively expanded variable references itself (eventually), +it should fail with an error message. +""" + +def test(conf): + assert conf.oldaskconfig() != 0 + assert conf.stderr_matches('expected_stderr') diff --git a/src/net/scripts/kconfig/tests/preprocess/circular_expansion/expected_stderr b/src/net/scripts/kconfig/tests/preprocess/circular_expansion/expected_stderr new file mode 100644 index 0000000..cde68fa --- /dev/null +++ b/src/net/scripts/kconfig/tests/preprocess/circular_expansion/expected_stderr @@ -0,0 +1 @@ +Kconfig:5: Recursive variable 'X' references itself (eventually) diff --git a/src/net/scripts/kconfig/tests/preprocess/escape/Kconfig b/src/net/scripts/kconfig/tests/preprocess/escape/Kconfig new file mode 100644 index 0000000..4e3f444 --- /dev/null +++ b/src/net/scripts/kconfig/tests/preprocess/escape/Kconfig @@ -0,0 +1,44 @@ +# SPDX-License-Identifier: GPL-2.0 + +# Shorthand +warning = $(warning-if,y,$(1)) + +# You can not pass commas directly to a function since they are treated as +# delimiters. You can use the following trick to do so. +comma := , +$(warning,hello$(comma) world) + +# Like Make, single quotes, double quotes, spaces are treated verbatim. +# The following prints the text as-is. +$(warning, ' " '" ' ''' "'") + +# Unlike Make, '$' has special meaning only when it is followed by '('. +# No need to escape '$' itself. +$(warning,$) +$(warning,$$) +$ := 1 +$(warning,$($)) + +# You need a trick to escape '$' followed by '(' +# The following should print "$(X)". It should not be expanded further. +dollar := $ +$(warning,$(dollar)(X)) + +# You need a trick to treat unbalanced parentheses. +# The following should print "(". +left_paren := ( +$(warning,$(left_paren)) + +# A simple expanded should not be expanded multiple times. +# The following should print "$(X)". It should not be expanded further. +Y := $(dollar)(X) +$(warning,$(Y)) + +# The following should print "$(X)" as well. +Y = $(dollar)(X) +$(warning,$(Y)) + +# The following should print "$(". +# It should not be emit "unterminated reference" error. +unterminated := $(dollar)( +$(warning,$(unterminated)) diff --git a/src/net/scripts/kconfig/tests/preprocess/escape/__init__.py b/src/net/scripts/kconfig/tests/preprocess/escape/__init__.py new file mode 100644 index 0000000..7ee8e74 --- /dev/null +++ b/src/net/scripts/kconfig/tests/preprocess/escape/__init__.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: GPL-2.0 +""" +Escape sequence tests. +""" + +def test(conf): + assert conf.oldaskconfig() == 0 + assert conf.stderr_matches('expected_stderr') diff --git a/src/net/scripts/kconfig/tests/preprocess/escape/expected_stderr b/src/net/scripts/kconfig/tests/preprocess/escape/expected_stderr new file mode 100644 index 0000000..1c00957 --- /dev/null +++ b/src/net/scripts/kconfig/tests/preprocess/escape/expected_stderr @@ -0,0 +1,10 @@ +Kconfig:9: hello, world +Kconfig:13: ' " '" ' ''' "'" +Kconfig:17: $ +Kconfig:18: $$ +Kconfig:20: 1 +Kconfig:25: $(X) +Kconfig:30: ( +Kconfig:35: $(X) +Kconfig:39: $(X) +Kconfig:44: $( diff --git a/src/net/scripts/kconfig/tests/preprocess/variable/Kconfig b/src/net/scripts/kconfig/tests/preprocess/variable/Kconfig new file mode 100644 index 0000000..9ce2f95 --- /dev/null +++ b/src/net/scripts/kconfig/tests/preprocess/variable/Kconfig @@ -0,0 +1,53 @@ +# SPDX-License-Identifier: GPL-2.0 + +# Shorthand +warning = $(warning-if,y,$(1)) + +# Simply expanded variable. +X := 1 +SIMPLE := $(X) +X := 2 +$(warning,SIMPLE = $(SIMPLE)) + +# Recursively expanded variable. +X := 1 +RECURSIVE = $(X) +X := 2 +$(warning,RECURSIVE = $(RECURSIVE)) + +# Append something to a simply expanded variable. +Y := 3 +SIMPLE += $(Y) +Y := 4 +$(warning,SIMPLE = $(SIMPLE)) + +# Append something to a recursively expanded variable. +Y := 3 +RECURSIVE += $(Y) +Y := 4 +$(warning,RECURSIVE = $(RECURSIVE)) + +# Use += operator to an undefined variable. +# This works as a recursively expanded variable. +Y := 3 +UNDEFINED_VARIABLE += $(Y) +Y := 4 +$(warning,UNDEFINED_VARIABLE = $(UNDEFINED_VARIABLE)) + +# You can use variable references for the lefthand side of assignment statement. +X := A +Y := B +$(X)$(Y) := 5 +$(warning,AB = $(AB)) + +# User-defined function. +greeting = $(1), my name is $(2). +$(warning,$(greeting,Hello,John)) + +# The number of arguments is not checked for user-defined functions. +# If some arguments are optional, it is useful to pass fewer parameters. +# $(2) will be blank in this case. +$(warning,$(greeting,Hello)) + +# Unreferenced parameters are just ignored. +$(warning,$(greeting,Hello,John,ignored,ignored)) diff --git a/src/net/scripts/kconfig/tests/preprocess/variable/__init__.py b/src/net/scripts/kconfig/tests/preprocess/variable/__init__.py new file mode 100644 index 0000000..e88b170 --- /dev/null +++ b/src/net/scripts/kconfig/tests/preprocess/variable/__init__.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: GPL-2.0 +""" +Variable and user-defined function tests. +""" + +def test(conf): + assert conf.oldaskconfig() == 0 + assert conf.stderr_matches('expected_stderr') diff --git a/src/net/scripts/kconfig/tests/preprocess/variable/expected_stderr b/src/net/scripts/kconfig/tests/preprocess/variable/expected_stderr new file mode 100644 index 0000000..a4841c3 --- /dev/null +++ b/src/net/scripts/kconfig/tests/preprocess/variable/expected_stderr @@ -0,0 +1,9 @@ +Kconfig:10: SIMPLE = 1 +Kconfig:16: RECURSIVE = 2 +Kconfig:22: SIMPLE = 1 3 +Kconfig:28: RECURSIVE = 2 4 +Kconfig:35: UNDEFINED_VARIABLE = 4 +Kconfig:41: AB = 5 +Kconfig:45: Hello, my name is John. +Kconfig:50: Hello, my name is . +Kconfig:53: Hello, my name is John. diff --git a/src/net/scripts/kconfig/tests/pytest.ini b/src/net/scripts/kconfig/tests/pytest.ini new file mode 100644 index 0000000..85d7ce8 --- /dev/null +++ b/src/net/scripts/kconfig/tests/pytest.ini @@ -0,0 +1,7 @@ +[pytest] +addopts = --verbose + +# Pytest requires that test files have unique names, because pytest imports +# them as top-level modules. It is silly to prefix or suffix a test file with +# the directory name that contains it. Use __init__.py for all test files. +python_files = __init__.py diff --git a/src/net/scripts/kconfig/util.c b/src/net/scripts/kconfig/util.c new file mode 100644 index 0000000..2958539 --- /dev/null +++ b/src/net/scripts/kconfig/util.c @@ -0,0 +1,129 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2002-2005 Roman Zippel <zippel@linux-m68k.org> + * Copyright (C) 2002-2005 Sam Ravnborg <sam@ravnborg.org> + */ + +#include <stdarg.h> +#include <stdlib.h> +#include <string.h> +#include "lkc.h" + +/* file already present in list? If not add it */ +struct file *file_lookup(const char *name) +{ + struct file *file; + + for (file = file_list; file; file = file->next) { + if (!strcmp(name, file->name)) { + return file; + } + } + + file = xmalloc(sizeof(*file)); + memset(file, 0, sizeof(*file)); + file->name = xstrdup(name); + file->next = file_list; + file_list = file; + return file; +} + +/* Allocate initial growable string */ +struct gstr str_new(void) +{ + struct gstr gs; + gs.s = xmalloc(sizeof(char) * 64); + gs.len = 64; + gs.max_width = 0; + strcpy(gs.s, "\0"); + return gs; +} + +/* Free storage for growable string */ +void str_free(struct gstr *gs) +{ + if (gs->s) + free(gs->s); + gs->s = NULL; + gs->len = 0; +} + +/* Append to growable string */ +void str_append(struct gstr *gs, const char *s) +{ + size_t l; + if (s) { + l = strlen(gs->s) + strlen(s) + 1; + if (l > gs->len) { + gs->s = xrealloc(gs->s, l); + gs->len = l; + } + strcat(gs->s, s); + } +} + +/* Append printf formatted string to growable string */ +void str_printf(struct gstr *gs, const char *fmt, ...) +{ + va_list ap; + char s[10000]; /* big enough... */ + va_start(ap, fmt); + vsnprintf(s, sizeof(s), fmt, ap); + str_append(gs, s); + va_end(ap); +} + +/* Retrieve value of growable string */ +const char *str_get(struct gstr *gs) +{ + return gs->s; +} + +void *xmalloc(size_t size) +{ + void *p = malloc(size); + if (p) + return p; + fprintf(stderr, "Out of memory.\n"); + exit(1); +} + +void *xcalloc(size_t nmemb, size_t size) +{ + void *p = calloc(nmemb, size); + if (p) + return p; + fprintf(stderr, "Out of memory.\n"); + exit(1); +} + +void *xrealloc(void *p, size_t size) +{ + p = realloc(p, size); + if (p) + return p; + fprintf(stderr, "Out of memory.\n"); + exit(1); +} + +char *xstrdup(const char *s) +{ + char *p; + + p = strdup(s); + if (p) + return p; + fprintf(stderr, "Out of memory.\n"); + exit(1); +} + +char *xstrndup(const char *s, size_t n) +{ + char *p; + + p = strndup(s, n); + if (p) + return p; + fprintf(stderr, "Out of memory.\n"); + exit(1); +} diff --git a/src/net/scripts/kernel-doc b/src/net/scripts/kernel-doc new file mode 100755 index 0000000..6325bec --- /dev/null +++ b/src/net/scripts/kernel-doc @@ -0,0 +1,2439 @@ +#!/usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0 + +use warnings; +use strict; + +## Copyright (c) 1998 Michael Zucchi, All Rights Reserved ## +## Copyright (C) 2000, 1 Tim Waugh <twaugh@redhat.com> ## +## Copyright (C) 2001 Simon Huggins ## +## Copyright (C) 2005-2012 Randy Dunlap ## +## Copyright (C) 2012 Dan Luedtke ## +## ## +## #define enhancements by Armin Kuster <akuster@mvista.com> ## +## Copyright (c) 2000 MontaVista Software, Inc. ## +## ## +## This software falls under the GNU General Public License. ## +## Please read the COPYING file for more information ## + +# 18/01/2001 - Cleanups +# Functions prototyped as foo(void) same as foo() +# Stop eval'ing where we don't need to. +# -- huggie@earth.li + +# 27/06/2001 - Allowed whitespace after initial "/**" and +# allowed comments before function declarations. +# -- Christian Kreibich <ck@whoop.org> + +# Still to do: +# - add perldoc documentation +# - Look more closely at some of the scarier bits :) + +# 26/05/2001 - Support for separate source and object trees. +# Return error code. +# Keith Owens <kaos@ocs.com.au> + +# 23/09/2001 - Added support for typedefs, structs, enums and unions +# Support for Context section; can be terminated using empty line +# Small fixes (like spaces vs. \s in regex) +# -- Tim Jansen <tim@tjansen.de> + +# 25/07/2012 - Added support for HTML5 +# -- Dan Luedtke <mail@danrl.de> + +sub usage { + my $message = <<"EOF"; +Usage: $0 [OPTION ...] FILE ... + +Read C language source or header FILEs, extract embedded documentation comments, +and print formatted documentation to standard output. + +The documentation comments are identified by "/**" opening comment mark. See +Documentation/doc-guide/kernel-doc.rst for the documentation comment syntax. + +Output format selection (mutually exclusive): + -man Output troff manual page format. This is the default. + -rst Output reStructuredText format. + -none Do not output documentation, only warnings. + +Output format selection modifier (affects only ReST output): + + -sphinx-version Use the ReST C domain dialect compatible with an + specific Sphinx Version. + If not specified, kernel-doc will auto-detect using + the sphinx-build version found on PATH. + +Output selection (mutually exclusive): + -export Only output documentation for symbols that have been + exported using EXPORT_SYMBOL() or EXPORT_SYMBOL_GPL() + in any input FILE or -export-file FILE. + -internal Only output documentation for symbols that have NOT been + exported using EXPORT_SYMBOL() or EXPORT_SYMBOL_GPL() + in any input FILE or -export-file FILE. + -function NAME Only output documentation for the given function(s) + or DOC: section title(s). All other functions and DOC: + sections are ignored. May be specified multiple times. + -nosymbol NAME Exclude the specified symbols from the output + documentation. May be specified multiple times. + +Output selection modifiers: + -no-doc-sections Do not output DOC: sections. + -enable-lineno Enable output of #define LINENO lines. Only works with + reStructuredText format. + -export-file FILE Specify an additional FILE in which to look for + EXPORT_SYMBOL() and EXPORT_SYMBOL_GPL(). To be used with + -export or -internal. May be specified multiple times. + +Other parameters: + -v Verbose output, more warnings and other information. + -h Print this help. + -Werror Treat warnings as errors. + +EOF + print $message; + exit 1; +} + +# +# format of comments. +# In the following table, (...)? signifies optional structure. +# (...)* signifies 0 or more structure elements +# /** +# * function_name(:)? (- short description)? +# (* @parameterx: (description of parameter x)?)* +# (* a blank line)? +# * (Description:)? (Description of function)? +# * (section header: (section description)? )* +# (*)?*/ +# +# So .. the trivial example would be: +# +# /** +# * my_function +# */ +# +# If the Description: header tag is omitted, then there must be a blank line +# after the last parameter specification. +# e.g. +# /** +# * my_function - does my stuff +# * @my_arg: its mine damnit +# * +# * Does my stuff explained. +# */ +# +# or, could also use: +# /** +# * my_function - does my stuff +# * @my_arg: its mine damnit +# * Description: Does my stuff explained. +# */ +# etc. +# +# Besides functions you can also write documentation for structs, unions, +# enums and typedefs. Instead of the function name you must write the name +# of the declaration; the struct/union/enum/typedef must always precede +# the name. Nesting of declarations is not supported. +# Use the argument mechanism to document members or constants. +# e.g. +# /** +# * struct my_struct - short description +# * @a: first member +# * @b: second member +# * +# * Longer description +# */ +# struct my_struct { +# int a; +# int b; +# /* private: */ +# int c; +# }; +# +# All descriptions can be multiline, except the short function description. +# +# For really longs structs, you can also describe arguments inside the +# body of the struct. +# eg. +# /** +# * struct my_struct - short description +# * @a: first member +# * @b: second member +# * +# * Longer description +# */ +# struct my_struct { +# int a; +# int b; +# /** +# * @c: This is longer description of C +# * +# * You can use paragraphs to describe arguments +# * using this method. +# */ +# int c; +# }; +# +# This should be use only for struct/enum members. +# +# You can also add additional sections. When documenting kernel functions you +# should document the "Context:" of the function, e.g. whether the functions +# can be called form interrupts. Unlike other sections you can end it with an +# empty line. +# A non-void function should have a "Return:" section describing the return +# value(s). +# Example-sections should contain the string EXAMPLE so that they are marked +# appropriately in DocBook. +# +# Example: +# /** +# * user_function - function that can only be called in user context +# * @a: some argument +# * Context: !in_interrupt() +# * +# * Some description +# * Example: +# * user_function(22); +# */ +# ... +# +# +# All descriptive text is further processed, scanning for the following special +# patterns, which are highlighted appropriately. +# +# 'funcname()' - function +# '$ENVVAR' - environmental variable +# '&struct_name' - name of a structure (up to two words including 'struct') +# '&struct_name.member' - name of a structure member +# '@parameter' - name of a parameter +# '%CONST' - name of a constant. +# '``LITERAL``' - literal string without any spaces on it. + +## init lots of data + +my $errors = 0; +my $warnings = 0; +my $anon_struct_union = 0; + +# match expressions used to find embedded type information +my $type_constant = '\b``([^\`]+)``\b'; +my $type_constant2 = '\%([-_\w]+)'; +my $type_func = '(\w+)\(\)'; +my $type_param = '\@(\w*((\.\w+)|(->\w+))*(\.\.\.)?)'; +my $type_param_ref = '([\!]?)\@(\w*((\.\w+)|(->\w+))*(\.\.\.)?)'; +my $type_fp_param = '\@(\w+)\(\)'; # Special RST handling for func ptr params +my $type_fp_param2 = '\@(\w+->\S+)\(\)'; # Special RST handling for structs with func ptr params +my $type_env = '(\$\w+)'; +my $type_enum = '\&(enum\s*([_\w]+))'; +my $type_struct = '\&(struct\s*([_\w]+))'; +my $type_typedef = '\&(typedef\s*([_\w]+))'; +my $type_union = '\&(union\s*([_\w]+))'; +my $type_member = '\&([_\w]+)(\.|->)([_\w]+)'; +my $type_fallback = '\&([_\w]+)'; +my $type_member_func = $type_member . '\(\)'; + +# Output conversion substitutions. +# One for each output format + +# these are pretty rough +my @highlights_man = ( + [$type_constant, "\$1"], + [$type_constant2, "\$1"], + [$type_func, "\\\\fB\$1\\\\fP"], + [$type_enum, "\\\\fI\$1\\\\fP"], + [$type_struct, "\\\\fI\$1\\\\fP"], + [$type_typedef, "\\\\fI\$1\\\\fP"], + [$type_union, "\\\\fI\$1\\\\fP"], + [$type_param, "\\\\fI\$1\\\\fP"], + [$type_param_ref, "\\\\fI\$1\$2\\\\fP"], + [$type_member, "\\\\fI\$1\$2\$3\\\\fP"], + [$type_fallback, "\\\\fI\$1\\\\fP"] + ); +my $blankline_man = ""; + +# rst-mode +my @highlights_rst = ( + [$type_constant, "``\$1``"], + [$type_constant2, "``\$1``"], + # Note: need to escape () to avoid func matching later + [$type_member_func, "\\:c\\:type\\:`\$1\$2\$3\\\\(\\\\) <\$1>`"], + [$type_member, "\\:c\\:type\\:`\$1\$2\$3 <\$1>`"], + [$type_fp_param, "**\$1\\\\(\\\\)**"], + [$type_fp_param2, "**\$1\\\\(\\\\)**"], + [$type_func, "\$1()"], + [$type_enum, "\\:c\\:type\\:`\$1 <\$2>`"], + [$type_struct, "\\:c\\:type\\:`\$1 <\$2>`"], + [$type_typedef, "\\:c\\:type\\:`\$1 <\$2>`"], + [$type_union, "\\:c\\:type\\:`\$1 <\$2>`"], + # in rst this can refer to any type + [$type_fallback, "\\:c\\:type\\:`\$1`"], + [$type_param_ref, "**\$1\$2**"] + ); +my $blankline_rst = "\n"; + +# read arguments +if ($#ARGV == -1) { + usage(); +} + +my $kernelversion; +my ($sphinx_major, $sphinx_minor, $sphinx_patch); + +my $dohighlight = ""; + +my $verbose = 0; +my $Werror = 0; +my $output_mode = "rst"; +my $output_preformatted = 0; +my $no_doc_sections = 0; +my $enable_lineno = 0; +my @highlights = @highlights_rst; +my $blankline = $blankline_rst; +my $modulename = "Kernel API"; + +use constant { + OUTPUT_ALL => 0, # output all symbols and doc sections + OUTPUT_INCLUDE => 1, # output only specified symbols + OUTPUT_EXPORTED => 2, # output exported symbols + OUTPUT_INTERNAL => 3, # output non-exported symbols +}; +my $output_selection = OUTPUT_ALL; +my $show_not_found = 0; # No longer used + +my @export_file_list; + +my @build_time; +if (defined($ENV{'KBUILD_BUILD_TIMESTAMP'}) && + (my $seconds = `date -d"${ENV{'KBUILD_BUILD_TIMESTAMP'}}" +%s`) ne '') { + @build_time = gmtime($seconds); +} else { + @build_time = localtime; +} + +my $man_date = ('January', 'February', 'March', 'April', 'May', 'June', + 'July', 'August', 'September', 'October', + 'November', 'December')[$build_time[4]] . + " " . ($build_time[5]+1900); + +# Essentially these are globals. +# They probably want to be tidied up, made more localised or something. +# CAVEAT EMPTOR! Some of the others I localised may not want to be, which +# could cause "use of undefined value" or other bugs. +my ($function, %function_table, %parametertypes, $declaration_purpose); +my %nosymbol_table = (); +my $declaration_start_line; +my ($type, $declaration_name, $return_type); +my ($newsection, $newcontents, $prototype, $brcount, %source_map); + +if (defined($ENV{'KBUILD_VERBOSE'})) { + $verbose = "$ENV{'KBUILD_VERBOSE'}"; +} + +if (defined($ENV{'KDOC_WERROR'})) { + $Werror = "$ENV{'KDOC_WERROR'}"; +} + +if (defined($ENV{'KCFLAGS'})) { + my $kcflags = "$ENV{'KCFLAGS'}"; + + if ($kcflags =~ /Werror/) { + $Werror = 1; + } +} + +# Generated docbook code is inserted in a template at a point where +# docbook v3.1 requires a non-zero sequence of RefEntry's; see: +# https://www.oasis-open.org/docbook/documentation/reference/html/refentry.html +# We keep track of number of generated entries and generate a dummy +# if needs be to ensure the expanded template can be postprocessed +# into html. +my $section_counter = 0; + +my $lineprefix=""; + +# Parser states +use constant { + STATE_NORMAL => 0, # normal code + STATE_NAME => 1, # looking for function name + STATE_BODY_MAYBE => 2, # body - or maybe more description + STATE_BODY => 3, # the body of the comment + STATE_BODY_WITH_BLANK_LINE => 4, # the body, which has a blank line + STATE_PROTO => 5, # scanning prototype + STATE_DOCBLOCK => 6, # documentation block + STATE_INLINE => 7, # gathering doc outside main block +}; +my $state; +my $in_doc_sect; +my $leading_space; + +# Inline documentation state +use constant { + STATE_INLINE_NA => 0, # not applicable ($state != STATE_INLINE) + STATE_INLINE_NAME => 1, # looking for member name (@foo:) + STATE_INLINE_TEXT => 2, # looking for member documentation + STATE_INLINE_END => 3, # done + STATE_INLINE_ERROR => 4, # error - Comment without header was found. + # Spit a warning as it's not + # proper kernel-doc and ignore the rest. +}; +my $inline_doc_state; + +#declaration types: can be +# 'function', 'struct', 'union', 'enum', 'typedef' +my $decl_type; + +my $doc_start = '^/\*\*\s*$'; # Allow whitespace at end of comment start. +my $doc_end = '\*/'; +my $doc_com = '\s*\*\s*'; +my $doc_com_body = '\s*\* ?'; +my $doc_decl = $doc_com . '(\w+)'; +# @params and a strictly limited set of supported section names +my $doc_sect = $doc_com . + '\s*(\@[.\w]+|\@\.\.\.|description|context|returns?|notes?|examples?)\s*:(.*)'; +my $doc_content = $doc_com_body . '(.*)'; +my $doc_block = $doc_com . 'DOC:\s*(.*)?'; +my $doc_inline_start = '^\s*/\*\*\s*$'; +my $doc_inline_sect = '\s*\*\s*(@\s*[\w][\w\.]*\s*):(.*)'; +my $doc_inline_end = '^\s*\*/\s*$'; +my $doc_inline_oneline = '^\s*/\*\*\s*(@[\w\s]+):\s*(.*)\s*\*/\s*$'; +my $export_symbol = '^\s*EXPORT_SYMBOL(_GPL)?\s*\(\s*(\w+)\s*\)\s*;'; + +my %parameterdescs; +my %parameterdesc_start_lines; +my @parameterlist; +my %sections; +my @sectionlist; +my %section_start_lines; +my $sectcheck; +my $struct_actual; + +my $contents = ""; +my $new_start_line = 0; + +# the canonical section names. see also $doc_sect above. +my $section_default = "Description"; # default section +my $section_intro = "Introduction"; +my $section = $section_default; +my $section_context = "Context"; +my $section_return = "Return"; + +my $undescribed = "-- undescribed --"; + +reset_state(); + +while ($ARGV[0] =~ m/^--?(.*)/) { + my $cmd = $1; + shift @ARGV; + if ($cmd eq "man") { + $output_mode = "man"; + @highlights = @highlights_man; + $blankline = $blankline_man; + } elsif ($cmd eq "rst") { + $output_mode = "rst"; + @highlights = @highlights_rst; + $blankline = $blankline_rst; + } elsif ($cmd eq "none") { + $output_mode = "none"; + } elsif ($cmd eq "module") { # not needed for XML, inherits from calling document + $modulename = shift @ARGV; + } elsif ($cmd eq "function") { # to only output specific functions + $output_selection = OUTPUT_INCLUDE; + $function = shift @ARGV; + $function_table{$function} = 1; + } elsif ($cmd eq "nosymbol") { # Exclude specific symbols + my $symbol = shift @ARGV; + $nosymbol_table{$symbol} = 1; + } elsif ($cmd eq "export") { # only exported symbols + $output_selection = OUTPUT_EXPORTED; + %function_table = (); + } elsif ($cmd eq "internal") { # only non-exported symbols + $output_selection = OUTPUT_INTERNAL; + %function_table = (); + } elsif ($cmd eq "export-file") { + my $file = shift @ARGV; + push(@export_file_list, $file); + } elsif ($cmd eq "v") { + $verbose = 1; + } elsif ($cmd eq "Werror") { + $Werror = 1; + } elsif (($cmd eq "h") || ($cmd eq "help")) { + usage(); + } elsif ($cmd eq 'no-doc-sections') { + $no_doc_sections = 1; + } elsif ($cmd eq 'enable-lineno') { + $enable_lineno = 1; + } elsif ($cmd eq 'show-not-found') { + $show_not_found = 1; # A no-op but don't fail + } elsif ($cmd eq "sphinx-version") { + my $ver_string = shift @ARGV; + if ($ver_string =~ m/^(\d+)(\.\d+)?(\.\d+)?/) { + $sphinx_major = $1; + if (defined($2)) { + $sphinx_minor = substr($2,1); + } else { + $sphinx_minor = 0; + } + if (defined($3)) { + $sphinx_patch = substr($3,1) + } else { + $sphinx_patch = 0; + } + } else { + die "Sphinx version should either major.minor or major.minor.patch format\n"; + } + } else { + # Unknown argument + usage(); + } +} + +# continue execution near EOF; + +# The C domain dialect changed on Sphinx 3. So, we need to check the +# version in order to produce the right tags. +sub findprog($) +{ + foreach(split(/:/, $ENV{PATH})) { + return "$_/$_[0]" if(-x "$_/$_[0]"); + } +} + +sub get_sphinx_version() +{ + my $ver; + + my $cmd = "sphinx-build"; + if (!findprog($cmd)) { + my $cmd = "sphinx-build3"; + if (!findprog($cmd)) { + $sphinx_major = 1; + $sphinx_minor = 2; + $sphinx_patch = 0; + printf STDERR "Warning: Sphinx version not found. Using default (Sphinx version %d.%d.%d)\n", + $sphinx_major, $sphinx_minor, $sphinx_patch; + return; + } + } + + open IN, "$cmd --version 2>&1 |"; + while (<IN>) { + if (m/^\s*sphinx-build\s+([\d]+)\.([\d\.]+)(\+\/[\da-f]+)?$/) { + $sphinx_major = $1; + $sphinx_minor = $2; + $sphinx_patch = $3; + last; + } + # Sphinx 1.2.x uses a different format + if (m/^\s*Sphinx.*\s+([\d]+)\.([\d\.]+)$/) { + $sphinx_major = $1; + $sphinx_minor = $2; + $sphinx_patch = $3; + last; + } + } + close IN; +} + +# get kernel version from env +sub get_kernel_version() { + my $version = 'unknown kernel version'; + + if (defined($ENV{'KERNELVERSION'})) { + $version = $ENV{'KERNELVERSION'}; + } + return $version; +} + +# +sub print_lineno { + my $lineno = shift; + if ($enable_lineno && defined($lineno)) { + print "#define LINENO " . $lineno . "\n"; + } +} +## +# dumps section contents to arrays/hashes intended for that purpose. +# +sub dump_section { + my $file = shift; + my $name = shift; + my $contents = join "\n", @_; + + if ($name =~ m/$type_param/) { + $name = $1; + $parameterdescs{$name} = $contents; + $sectcheck = $sectcheck . $name . " "; + $parameterdesc_start_lines{$name} = $new_start_line; + $new_start_line = 0; + } elsif ($name eq "@\.\.\.") { + $name = "..."; + $parameterdescs{$name} = $contents; + $sectcheck = $sectcheck . $name . " "; + $parameterdesc_start_lines{$name} = $new_start_line; + $new_start_line = 0; + } else { + if (defined($sections{$name}) && ($sections{$name} ne "")) { + # Only warn on user specified duplicate section names. + if ($name ne $section_default) { + print STDERR "${file}:$.: warning: duplicate section name '$name'\n"; + ++$warnings; + } + $sections{$name} .= $contents; + } else { + $sections{$name} = $contents; + push @sectionlist, $name; + $section_start_lines{$name} = $new_start_line; + $new_start_line = 0; + } + } +} + +## +# dump DOC: section after checking that it should go out +# +sub dump_doc_section { + my $file = shift; + my $name = shift; + my $contents = join "\n", @_; + + if ($no_doc_sections) { + return; + } + + return if (defined($nosymbol_table{$name})); + + if (($output_selection == OUTPUT_ALL) || + (($output_selection == OUTPUT_INCLUDE) && + defined($function_table{$name}))) + { + dump_section($file, $name, $contents); + output_blockhead({'sectionlist' => \@sectionlist, + 'sections' => \%sections, + 'module' => $modulename, + 'content-only' => ($output_selection != OUTPUT_ALL), }); + } +} + +## +# output function +# +# parameterdescs, a hash. +# function => "function name" +# parameterlist => @list of parameters +# parameterdescs => %parameter descriptions +# sectionlist => @list of sections +# sections => %section descriptions +# + +sub output_highlight { + my $contents = join "\n",@_; + my $line; + +# DEBUG +# if (!defined $contents) { +# use Carp; +# confess "output_highlight got called with no args?\n"; +# } + +# print STDERR "contents b4:$contents\n"; + eval $dohighlight; + die $@ if $@; +# print STDERR "contents af:$contents\n"; + + foreach $line (split "\n", $contents) { + if (! $output_preformatted) { + $line =~ s/^\s*//; + } + if ($line eq ""){ + if (! $output_preformatted) { + print $lineprefix, $blankline; + } + } else { + if ($output_mode eq "man" && substr($line, 0, 1) eq ".") { + print "\\&$line"; + } else { + print $lineprefix, $line; + } + } + print "\n"; + } +} + +## +# output function in man +sub output_function_man(%) { + my %args = %{$_[0]}; + my ($parameter, $section); + my $count; + + print ".TH \"$args{'function'}\" 9 \"$args{'function'}\" \"$man_date\" \"Kernel Hacker's Manual\" LINUX\n"; + + print ".SH NAME\n"; + print $args{'function'} . " \\- " . $args{'purpose'} . "\n"; + + print ".SH SYNOPSIS\n"; + if ($args{'functiontype'} ne "") { + print ".B \"" . $args{'functiontype'} . "\" " . $args{'function'} . "\n"; + } else { + print ".B \"" . $args{'function'} . "\n"; + } + $count = 0; + my $parenth = "("; + my $post = ","; + foreach my $parameter (@{$args{'parameterlist'}}) { + if ($count == $#{$args{'parameterlist'}}) { + $post = ");"; + } + $type = $args{'parametertypes'}{$parameter}; + if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) { + # pointer-to-function + print ".BI \"" . $parenth . $1 . "\" " . " \") (" . $2 . ")" . $post . "\"\n"; + } else { + $type =~ s/([^\*])$/$1 /; + print ".BI \"" . $parenth . $type . "\" " . " \"" . $post . "\"\n"; + } + $count++; + $parenth = ""; + } + + print ".SH ARGUMENTS\n"; + foreach $parameter (@{$args{'parameterlist'}}) { + my $parameter_name = $parameter; + $parameter_name =~ s/\[.*//; + + print ".IP \"" . $parameter . "\" 12\n"; + output_highlight($args{'parameterdescs'}{$parameter_name}); + } + foreach $section (@{$args{'sectionlist'}}) { + print ".SH \"", uc $section, "\"\n"; + output_highlight($args{'sections'}{$section}); + } +} + +## +# output enum in man +sub output_enum_man(%) { + my %args = %{$_[0]}; + my ($parameter, $section); + my $count; + + print ".TH \"$args{'module'}\" 9 \"enum $args{'enum'}\" \"$man_date\" \"API Manual\" LINUX\n"; + + print ".SH NAME\n"; + print "enum " . $args{'enum'} . " \\- " . $args{'purpose'} . "\n"; + + print ".SH SYNOPSIS\n"; + print "enum " . $args{'enum'} . " {\n"; + $count = 0; + foreach my $parameter (@{$args{'parameterlist'}}) { + print ".br\n.BI \" $parameter\"\n"; + if ($count == $#{$args{'parameterlist'}}) { + print "\n};\n"; + last; + } + else { + print ", \n.br\n"; + } + $count++; + } + + print ".SH Constants\n"; + foreach $parameter (@{$args{'parameterlist'}}) { + my $parameter_name = $parameter; + $parameter_name =~ s/\[.*//; + + print ".IP \"" . $parameter . "\" 12\n"; + output_highlight($args{'parameterdescs'}{$parameter_name}); + } + foreach $section (@{$args{'sectionlist'}}) { + print ".SH \"$section\"\n"; + output_highlight($args{'sections'}{$section}); + } +} + +## +# output struct in man +sub output_struct_man(%) { + my %args = %{$_[0]}; + my ($parameter, $section); + + print ".TH \"$args{'module'}\" 9 \"" . $args{'type'} . " " . $args{'struct'} . "\" \"$man_date\" \"API Manual\" LINUX\n"; + + print ".SH NAME\n"; + print $args{'type'} . " " . $args{'struct'} . " \\- " . $args{'purpose'} . "\n"; + + my $declaration = $args{'definition'}; + $declaration =~ s/\t/ /g; + $declaration =~ s/\n/"\n.br\n.BI \"/g; + print ".SH SYNOPSIS\n"; + print $args{'type'} . " " . $args{'struct'} . " {\n.br\n"; + print ".BI \"$declaration\n};\n.br\n\n"; + + print ".SH Members\n"; + foreach $parameter (@{$args{'parameterlist'}}) { + ($parameter =~ /^#/) && next; + + my $parameter_name = $parameter; + $parameter_name =~ s/\[.*//; + + ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next; + print ".IP \"" . $parameter . "\" 12\n"; + output_highlight($args{'parameterdescs'}{$parameter_name}); + } + foreach $section (@{$args{'sectionlist'}}) { + print ".SH \"$section\"\n"; + output_highlight($args{'sections'}{$section}); + } +} + +## +# output typedef in man +sub output_typedef_man(%) { + my %args = %{$_[0]}; + my ($parameter, $section); + + print ".TH \"$args{'module'}\" 9 \"$args{'typedef'}\" \"$man_date\" \"API Manual\" LINUX\n"; + + print ".SH NAME\n"; + print "typedef " . $args{'typedef'} . " \\- " . $args{'purpose'} . "\n"; + + foreach $section (@{$args{'sectionlist'}}) { + print ".SH \"$section\"\n"; + output_highlight($args{'sections'}{$section}); + } +} + +sub output_blockhead_man(%) { + my %args = %{$_[0]}; + my ($parameter, $section); + my $count; + + print ".TH \"$args{'module'}\" 9 \"$args{'module'}\" \"$man_date\" \"API Manual\" LINUX\n"; + + foreach $section (@{$args{'sectionlist'}}) { + print ".SH \"$section\"\n"; + output_highlight($args{'sections'}{$section}); + } +} + +## +# output in restructured text +# + +# +# This could use some work; it's used to output the DOC: sections, and +# starts by putting out the name of the doc section itself, but that tends +# to duplicate a header already in the template file. +# +sub output_blockhead_rst(%) { + my %args = %{$_[0]}; + my ($parameter, $section); + + foreach $section (@{$args{'sectionlist'}}) { + next if (defined($nosymbol_table{$section})); + + if ($output_selection != OUTPUT_INCLUDE) { + print "**$section**\n\n"; + } + print_lineno($section_start_lines{$section}); + output_highlight_rst($args{'sections'}{$section}); + print "\n"; + } +} + +# +# Apply the RST highlights to a sub-block of text. +# +sub highlight_block($) { + # The dohighlight kludge requires the text be called $contents + my $contents = shift; + eval $dohighlight; + die $@ if $@; + return $contents; +} + +# +# Regexes used only here. +# +my $sphinx_literal = '^[^.].*::$'; +my $sphinx_cblock = '^\.\.\ +code-block::'; + +sub output_highlight_rst { + my $input = join "\n",@_; + my $output = ""; + my $line; + my $in_literal = 0; + my $litprefix; + my $block = ""; + + foreach $line (split "\n",$input) { + # + # If we're in a literal block, see if we should drop out + # of it. Otherwise pass the line straight through unmunged. + # + if ($in_literal) { + if (! ($line =~ /^\s*$/)) { + # + # If this is the first non-blank line in a literal + # block we need to figure out what the proper indent is. + # + if ($litprefix eq "") { + $line =~ /^(\s*)/; + $litprefix = '^' . $1; + $output .= $line . "\n"; + } elsif (! ($line =~ /$litprefix/)) { + $in_literal = 0; + } else { + $output .= $line . "\n"; + } + } else { + $output .= $line . "\n"; + } + } + # + # Not in a literal block (or just dropped out) + # + if (! $in_literal) { + $block .= $line . "\n"; + if (($line =~ /$sphinx_literal/) || ($line =~ /$sphinx_cblock/)) { + $in_literal = 1; + $litprefix = ""; + $output .= highlight_block($block); + $block = "" + } + } + } + + if ($block) { + $output .= highlight_block($block); + } + foreach $line (split "\n", $output) { + print $lineprefix . $line . "\n"; + } +} + +sub output_function_rst(%) { + my %args = %{$_[0]}; + my ($parameter, $section); + my $oldprefix = $lineprefix; + my $start = ""; + my $is_macro = 0; + + if ($sphinx_major < 3) { + if ($args{'typedef'}) { + print ".. c:type:: ". $args{'function'} . "\n\n"; + print_lineno($declaration_start_line); + print " **Typedef**: "; + $lineprefix = ""; + output_highlight_rst($args{'purpose'}); + $start = "\n\n**Syntax**\n\n ``"; + $is_macro = 1; + } else { + print ".. c:function:: "; + } + } else { + if ($args{'typedef'} || $args{'functiontype'} eq "") { + $is_macro = 1; + print ".. c:macro:: ". $args{'function'} . "\n\n"; + } else { + print ".. c:function:: "; + } + + if ($args{'typedef'}) { + print_lineno($declaration_start_line); + print " **Typedef**: "; + $lineprefix = ""; + output_highlight_rst($args{'purpose'}); + $start = "\n\n**Syntax**\n\n ``"; + } else { + print "``" if ($is_macro); + } + } + if ($args{'functiontype'} ne "") { + $start .= $args{'functiontype'} . " " . $args{'function'} . " ("; + } else { + $start .= $args{'function'} . " ("; + } + print $start; + + my $count = 0; + foreach my $parameter (@{$args{'parameterlist'}}) { + if ($count ne 0) { + print ", "; + } + $count++; + $type = $args{'parametertypes'}{$parameter}; + + if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) { + # pointer-to-function + print $1 . $parameter . ") (" . $2 . ")"; + } else { + print $type; + } + } + if ($is_macro) { + print ")``\n\n"; + } else { + print ")\n\n"; + } + if (!$args{'typedef'}) { + print_lineno($declaration_start_line); + $lineprefix = " "; + output_highlight_rst($args{'purpose'}); + print "\n"; + } + + print "**Parameters**\n\n"; + $lineprefix = " "; + foreach $parameter (@{$args{'parameterlist'}}) { + my $parameter_name = $parameter; + $parameter_name =~ s/\[.*//; + $type = $args{'parametertypes'}{$parameter}; + + if ($type ne "") { + print "``$type``\n"; + } else { + print "``$parameter``\n"; + } + + print_lineno($parameterdesc_start_lines{$parameter_name}); + + if (defined($args{'parameterdescs'}{$parameter_name}) && + $args{'parameterdescs'}{$parameter_name} ne $undescribed) { + output_highlight_rst($args{'parameterdescs'}{$parameter_name}); + } else { + print " *undescribed*\n"; + } + print "\n"; + } + + $lineprefix = $oldprefix; + output_section_rst(@_); +} + +sub output_section_rst(%) { + my %args = %{$_[0]}; + my $section; + my $oldprefix = $lineprefix; + $lineprefix = ""; + + foreach $section (@{$args{'sectionlist'}}) { + print "**$section**\n\n"; + print_lineno($section_start_lines{$section}); + output_highlight_rst($args{'sections'}{$section}); + print "\n"; + } + print "\n"; + $lineprefix = $oldprefix; +} + +sub output_enum_rst(%) { + my %args = %{$_[0]}; + my ($parameter); + my $oldprefix = $lineprefix; + my $count; + + if ($sphinx_major < 3) { + my $name = "enum " . $args{'enum'}; + print "\n\n.. c:type:: " . $name . "\n\n"; + } else { + my $name = $args{'enum'}; + print "\n\n.. c:enum:: " . $name . "\n\n"; + } + print_lineno($declaration_start_line); + $lineprefix = " "; + output_highlight_rst($args{'purpose'}); + print "\n"; + + print "**Constants**\n\n"; + $lineprefix = " "; + foreach $parameter (@{$args{'parameterlist'}}) { + print "``$parameter``\n"; + if ($args{'parameterdescs'}{$parameter} ne $undescribed) { + output_highlight_rst($args{'parameterdescs'}{$parameter}); + } else { + print " *undescribed*\n"; + } + print "\n"; + } + + $lineprefix = $oldprefix; + output_section_rst(@_); +} + +sub output_typedef_rst(%) { + my %args = %{$_[0]}; + my ($parameter); + my $oldprefix = $lineprefix; + my $name; + + if ($sphinx_major < 3) { + $name = "typedef " . $args{'typedef'}; + } else { + $name = $args{'typedef'}; + } + print "\n\n.. c:type:: " . $name . "\n\n"; + print_lineno($declaration_start_line); + $lineprefix = " "; + output_highlight_rst($args{'purpose'}); + print "\n"; + + $lineprefix = $oldprefix; + output_section_rst(@_); +} + +sub output_struct_rst(%) { + my %args = %{$_[0]}; + my ($parameter); + my $oldprefix = $lineprefix; + + if ($sphinx_major < 3) { + my $name = $args{'type'} . " " . $args{'struct'}; + print "\n\n.. c:type:: " . $name . "\n\n"; + } else { + my $name = $args{'struct'}; + if ($args{'type'} eq 'union') { + print "\n\n.. c:union:: " . $name . "\n\n"; + } else { + print "\n\n.. c:struct:: " . $name . "\n\n"; + } + } + print_lineno($declaration_start_line); + $lineprefix = " "; + output_highlight_rst($args{'purpose'}); + print "\n"; + + print "**Definition**\n\n"; + print "::\n\n"; + my $declaration = $args{'definition'}; + $declaration =~ s/\t/ /g; + print " " . $args{'type'} . " " . $args{'struct'} . " {\n$declaration };\n\n"; + + print "**Members**\n\n"; + $lineprefix = " "; + foreach $parameter (@{$args{'parameterlist'}}) { + ($parameter =~ /^#/) && next; + + my $parameter_name = $parameter; + $parameter_name =~ s/\[.*//; + + ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next; + $type = $args{'parametertypes'}{$parameter}; + print_lineno($parameterdesc_start_lines{$parameter_name}); + print "``" . $parameter . "``\n"; + output_highlight_rst($args{'parameterdescs'}{$parameter_name}); + print "\n"; + } + print "\n"; + + $lineprefix = $oldprefix; + output_section_rst(@_); +} + +## none mode output functions + +sub output_function_none(%) { +} + +sub output_enum_none(%) { +} + +sub output_typedef_none(%) { +} + +sub output_struct_none(%) { +} + +sub output_blockhead_none(%) { +} + +## +# generic output function for all types (function, struct/union, typedef, enum); +# calls the generated, variable output_ function name based on +# functype and output_mode +sub output_declaration { + no strict 'refs'; + my $name = shift; + my $functype = shift; + my $func = "output_${functype}_$output_mode"; + + return if (defined($nosymbol_table{$name})); + + if (($output_selection == OUTPUT_ALL) || + (($output_selection == OUTPUT_INCLUDE || + $output_selection == OUTPUT_EXPORTED) && + defined($function_table{$name})) || + ($output_selection == OUTPUT_INTERNAL && + !($functype eq "function" && defined($function_table{$name})))) + { + &$func(@_); + $section_counter++; + } +} + +## +# generic output function - calls the right one based on current output mode. +sub output_blockhead { + no strict 'refs'; + my $func = "output_blockhead_" . $output_mode; + &$func(@_); + $section_counter++; +} + +## +# takes a declaration (struct, union, enum, typedef) and +# invokes the right handler. NOT called for functions. +sub dump_declaration($$) { + no strict 'refs'; + my ($prototype, $file) = @_; + my $func = "dump_" . $decl_type; + &$func(@_); +} + +sub dump_union($$) { + dump_struct(@_); +} + +sub dump_struct($$) { + my $x = shift; + my $file = shift; + + if ($x =~ /(struct|union)\s+(\w+)\s*\{(.*)\}(\s*(__packed|__aligned|____cacheline_aligned_in_smp|____cacheline_aligned|__attribute__\s*\(\([a-z0-9,_\s\(\)]*\)\)))*/) { + my $decl_type = $1; + $declaration_name = $2; + my $members = $3; + + # ignore members marked private: + $members =~ s/\/\*\s*private:.*?\/\*\s*public:.*?\*\///gosi; + $members =~ s/\/\*\s*private:.*//gosi; + # strip comments: + $members =~ s/\/\*.*?\*\///gos; + # strip attributes + $members =~ s/\s*__attribute__\s*\(\([a-z0-9,_\*\s\(\)]*\)\)/ /gi; + $members =~ s/\s*__aligned\s*\([^;]*\)/ /gos; + $members =~ s/\s*__packed\s*/ /gos; + $members =~ s/\s*CRYPTO_MINALIGN_ATTR/ /gos; + $members =~ s/\s*____cacheline_aligned_in_smp/ /gos; + $members =~ s/\s*____cacheline_aligned/ /gos; + + # replace DECLARE_BITMAP + $members =~ s/__ETHTOOL_DECLARE_LINK_MODE_MASK\s*\(([^\)]+)\)/DECLARE_BITMAP($1, __ETHTOOL_LINK_MODE_MASK_NBITS)/gos; + $members =~ s/DECLARE_BITMAP\s*\(([^,)]+),\s*([^,)]+)\)/unsigned long $1\[BITS_TO_LONGS($2)\]/gos; + # replace DECLARE_HASHTABLE + $members =~ s/DECLARE_HASHTABLE\s*\(([^,)]+),\s*([^,)]+)\)/unsigned long $1\[1 << (($2) - 1)\]/gos; + # replace DECLARE_KFIFO + $members =~ s/DECLARE_KFIFO\s*\(([^,)]+),\s*([^,)]+),\s*([^,)]+)\)/$2 \*$1/gos; + # replace DECLARE_KFIFO_PTR + $members =~ s/DECLARE_KFIFO_PTR\s*\(([^,)]+),\s*([^,)]+)\)/$2 \*$1/gos; + + my $declaration = $members; + + # Split nested struct/union elements as newer ones + while ($members =~ m/(struct|union)([^\{\};]+)\{([^\{\}]*)\}([^\{\}\;]*)\;/) { + my $newmember; + my $maintype = $1; + my $ids = $4; + my $content = $3; + foreach my $id(split /,/, $ids) { + $newmember .= "$maintype $id; "; + + $id =~ s/[:\[].*//; + $id =~ s/^\s*\**(\S+)\s*/$1/; + foreach my $arg (split /;/, $content) { + next if ($arg =~ m/^\s*$/); + if ($arg =~ m/^([^\(]+\(\*?\s*)([\w\.]*)(\s*\).*)/) { + # pointer-to-function + my $type = $1; + my $name = $2; + my $extra = $3; + next if (!$name); + if ($id =~ m/^\s*$/) { + # anonymous struct/union + $newmember .= "$type$name$extra; "; + } else { + $newmember .= "$type$id.$name$extra; "; + } + } else { + my $type; + my $names; + $arg =~ s/^\s+//; + $arg =~ s/\s+$//; + # Handle bitmaps + $arg =~ s/:\s*\d+\s*//g; + # Handle arrays + $arg =~ s/\[.*\]//g; + # The type may have multiple words, + # and multiple IDs can be defined, like: + # const struct foo, *bar, foobar + # So, we remove spaces when parsing the + # names, in order to match just names + # and commas for the names + $arg =~ s/\s*,\s*/,/g; + if ($arg =~ m/(.*)\s+([\S+,]+)/) { + $type = $1; + $names = $2; + } else { + $newmember .= "$arg; "; + next; + } + foreach my $name (split /,/, $names) { + $name =~ s/^\s*\**(\S+)\s*/$1/; + next if (($name =~ m/^\s*$/)); + if ($id =~ m/^\s*$/) { + # anonymous struct/union + $newmember .= "$type $name; "; + } else { + $newmember .= "$type $id.$name; "; + } + } + } + } + } + $members =~ s/(struct|union)([^\{\};]+)\{([^\{\}]*)\}([^\{\}\;]*)\;/$newmember/; + } + + # Ignore other nested elements, like enums + $members =~ s/(\{[^\{\}]*\})//g; + + create_parameterlist($members, ';', $file, $declaration_name); + check_sections($file, $declaration_name, $decl_type, $sectcheck, $struct_actual); + + # Adjust declaration for better display + $declaration =~ s/([\{;])/$1\n/g; + $declaration =~ s/\}\s+;/};/g; + # Better handle inlined enums + do {} while ($declaration =~ s/(enum\s+\{[^\}]+),([^\n])/$1,\n$2/); + + my @def_args = split /\n/, $declaration; + my $level = 1; + $declaration = ""; + foreach my $clause (@def_args) { + $clause =~ s/^\s+//; + $clause =~ s/\s+$//; + $clause =~ s/\s+/ /; + next if (!$clause); + $level-- if ($clause =~ m/(\})/ && $level > 1); + if (!($clause =~ m/^\s*#/)) { + $declaration .= "\t" x $level; + } + $declaration .= "\t" . $clause . "\n"; + $level++ if ($clause =~ m/(\{)/ && !($clause =~m/\}/)); + } + output_declaration($declaration_name, + 'struct', + {'struct' => $declaration_name, + 'module' => $modulename, + 'definition' => $declaration, + 'parameterlist' => \@parameterlist, + 'parameterdescs' => \%parameterdescs, + 'parametertypes' => \%parametertypes, + 'sectionlist' => \@sectionlist, + 'sections' => \%sections, + 'purpose' => $declaration_purpose, + 'type' => $decl_type + }); + } + else { + print STDERR "${file}:$.: error: Cannot parse struct or union!\n"; + ++$errors; + } +} + + +sub show_warnings($$) { + my $functype = shift; + my $name = shift; + + return 0 if (defined($nosymbol_table{$name})); + + return 1 if ($output_selection == OUTPUT_ALL); + + if ($output_selection == OUTPUT_EXPORTED) { + if (defined($function_table{$name})) { + return 1; + } else { + return 0; + } + } + if ($output_selection == OUTPUT_INTERNAL) { + if (!($functype eq "function" && defined($function_table{$name}))) { + return 1; + } else { + return 0; + } + } + if ($output_selection == OUTPUT_INCLUDE) { + if (defined($function_table{$name})) { + return 1; + } else { + return 0; + } + } + die("Please add the new output type at show_warnings()"); +} + +sub dump_enum($$) { + my $x = shift; + my $file = shift; + my $members; + + + $x =~ s@/\*.*?\*/@@gos; # strip comments. + # strip #define macros inside enums + $x =~ s@#\s*((define|ifdef)\s+|endif)[^;]*;@@gos; + + if ($x =~ /typedef\s+enum\s*\{(.*)\}\s*(\w*)\s*;/) { + $declaration_name = $2; + $members = $1; + } elsif ($x =~ /enum\s+(\w*)\s*\{(.*)\}/) { + $declaration_name = $1; + $members = $2; + } + + if ($members) { + my %_members; + + $members =~ s/\s+$//; + + foreach my $arg (split ',', $members) { + $arg =~ s/^\s*(\w+).*/$1/; + push @parameterlist, $arg; + if (!$parameterdescs{$arg}) { + $parameterdescs{$arg} = $undescribed; + if (show_warnings("enum", $declaration_name)) { + print STDERR "${file}:$.: warning: Enum value '$arg' not described in enum '$declaration_name'\n"; + } + } + $_members{$arg} = 1; + } + + while (my ($k, $v) = each %parameterdescs) { + if (!exists($_members{$k})) { + if (show_warnings("enum", $declaration_name)) { + print STDERR "${file}:$.: warning: Excess enum value '$k' description in '$declaration_name'\n"; + } + } + } + + output_declaration($declaration_name, + 'enum', + {'enum' => $declaration_name, + 'module' => $modulename, + 'parameterlist' => \@parameterlist, + 'parameterdescs' => \%parameterdescs, + 'sectionlist' => \@sectionlist, + 'sections' => \%sections, + 'purpose' => $declaration_purpose + }); + } else { + print STDERR "${file}:$.: error: Cannot parse enum!\n"; + ++$errors; + } +} + +my $typedef_type = qr { ((?:\s+[\w\*]+\b){1,8})\s* }x; +my $typedef_ident = qr { \*?\s*(\w\S+)\s* }x; +my $typedef_args = qr { \s*\((.*)\); }x; + +my $typedef1 = qr { typedef$typedef_type\($typedef_ident\)$typedef_args }x; +my $typedef2 = qr { typedef$typedef_type$typedef_ident$typedef_args }x; + +sub dump_typedef($$) { + my $x = shift; + my $file = shift; + + $x =~ s@/\*.*?\*/@@gos; # strip comments. + + # Parse function typedef prototypes + if ($x =~ $typedef1 || $x =~ $typedef2) { + $return_type = $1; + $declaration_name = $2; + my $args = $3; + $return_type =~ s/^\s+//; + + create_parameterlist($args, ',', $file, $declaration_name); + + output_declaration($declaration_name, + 'function', + {'function' => $declaration_name, + 'typedef' => 1, + 'module' => $modulename, + 'functiontype' => $return_type, + 'parameterlist' => \@parameterlist, + 'parameterdescs' => \%parameterdescs, + 'parametertypes' => \%parametertypes, + 'sectionlist' => \@sectionlist, + 'sections' => \%sections, + 'purpose' => $declaration_purpose + }); + return; + } + + while (($x =~ /\(*.\)\s*;$/) || ($x =~ /\[*.\]\s*;$/)) { + $x =~ s/\(*.\)\s*;$/;/; + $x =~ s/\[*.\]\s*;$/;/; + } + + if ($x =~ /typedef.*\s+(\w+)\s*;/) { + $declaration_name = $1; + + output_declaration($declaration_name, + 'typedef', + {'typedef' => $declaration_name, + 'module' => $modulename, + 'sectionlist' => \@sectionlist, + 'sections' => \%sections, + 'purpose' => $declaration_purpose + }); + } + else { + print STDERR "${file}:$.: error: Cannot parse typedef!\n"; + ++$errors; + } +} + +sub save_struct_actual($) { + my $actual = shift; + + # strip all spaces from the actual param so that it looks like one string item + $actual =~ s/\s*//g; + $struct_actual = $struct_actual . $actual . " "; +} + +sub create_parameterlist($$$$) { + my $args = shift; + my $splitter = shift; + my $file = shift; + my $declaration_name = shift; + my $type; + my $param; + + # temporarily replace commas inside function pointer definition + while ($args =~ /(\([^\),]+),/) { + $args =~ s/(\([^\),]+),/$1#/g; + } + + foreach my $arg (split($splitter, $args)) { + # strip comments + $arg =~ s/\/\*.*\*\///; + # strip leading/trailing spaces + $arg =~ s/^\s*//; + $arg =~ s/\s*$//; + $arg =~ s/\s+/ /; + + if ($arg =~ /^#/) { + # Treat preprocessor directive as a typeless variable just to fill + # corresponding data structures "correctly". Catch it later in + # output_* subs. + push_parameter($arg, "", "", $file); + } elsif ($arg =~ m/\(.+\)\s*\(/) { + # pointer-to-function + $arg =~ tr/#/,/; + $arg =~ m/[^\(]+\(\*?\s*([\w\.]*)\s*\)/; + $param = $1; + $type = $arg; + $type =~ s/([^\(]+\(\*?)\s*$param/$1/; + save_struct_actual($param); + push_parameter($param, $type, $arg, $file, $declaration_name); + } elsif ($arg) { + $arg =~ s/\s*:\s*/:/g; + $arg =~ s/\s*\[/\[/g; + + my @args = split('\s*,\s*', $arg); + if ($args[0] =~ m/\*/) { + $args[0] =~ s/(\*+)\s*/ $1/; + } + + my @first_arg; + if ($args[0] =~ /^(.*\s+)(.*?\[.*\].*)$/) { + shift @args; + push(@first_arg, split('\s+', $1)); + push(@first_arg, $2); + } else { + @first_arg = split('\s+', shift @args); + } + + unshift(@args, pop @first_arg); + $type = join " ", @first_arg; + + foreach $param (@args) { + if ($param =~ m/^(\*+)\s*(.*)/) { + save_struct_actual($2); + + push_parameter($2, "$type $1", $arg, $file, $declaration_name); + } + elsif ($param =~ m/(.*?):(\d+)/) { + if ($type ne "") { # skip unnamed bit-fields + save_struct_actual($1); + push_parameter($1, "$type:$2", $arg, $file, $declaration_name) + } + } + else { + save_struct_actual($param); + push_parameter($param, $type, $arg, $file, $declaration_name); + } + } + } + } +} + +sub push_parameter($$$$$) { + my $param = shift; + my $type = shift; + my $org_arg = shift; + my $file = shift; + my $declaration_name = shift; + + if (($anon_struct_union == 1) && ($type eq "") && + ($param eq "}")) { + return; # ignore the ending }; from anon. struct/union + } + + $anon_struct_union = 0; + $param =~ s/[\[\)].*//; + + if ($type eq "" && $param =~ /\.\.\.$/) + { + if (!$param =~ /\w\.\.\.$/) { + # handles unnamed variable parameters + $param = "..."; + } + elsif ($param =~ /\w\.\.\.$/) { + # for named variable parameters of the form `x...`, remove the dots + $param =~ s/\.\.\.$//; + } + if (!defined $parameterdescs{$param} || $parameterdescs{$param} eq "") { + $parameterdescs{$param} = "variable arguments"; + } + } + elsif ($type eq "" && ($param eq "" or $param eq "void")) + { + $param="void"; + $parameterdescs{void} = "no arguments"; + } + elsif ($type eq "" && ($param eq "struct" or $param eq "union")) + # handle unnamed (anonymous) union or struct: + { + $type = $param; + $param = "{unnamed_" . $param . "}"; + $parameterdescs{$param} = "anonymous\n"; + $anon_struct_union = 1; + } + + # warn if parameter has no description + # (but ignore ones starting with # as these are not parameters + # but inline preprocessor statements); + # Note: It will also ignore void params and unnamed structs/unions + if (!defined $parameterdescs{$param} && $param !~ /^#/) { + $parameterdescs{$param} = $undescribed; + + if (show_warnings($type, $declaration_name) && $param !~ /\./) { + print STDERR + "${file}:$.: warning: Function parameter or member '$param' not described in '$declaration_name'\n"; + ++$warnings; + } + } + + # strip spaces from $param so that it is one continuous string + # on @parameterlist; + # this fixes a problem where check_sections() cannot find + # a parameter like "addr[6 + 2]" because it actually appears + # as "addr[6", "+", "2]" on the parameter list; + # but it's better to maintain the param string unchanged for output, + # so just weaken the string compare in check_sections() to ignore + # "[blah" in a parameter string; + ###$param =~ s/\s*//g; + push @parameterlist, $param; + $org_arg =~ s/\s\s+/ /g; + $parametertypes{$param} = $org_arg; +} + +sub check_sections($$$$$) { + my ($file, $decl_name, $decl_type, $sectcheck, $prmscheck) = @_; + my @sects = split ' ', $sectcheck; + my @prms = split ' ', $prmscheck; + my $err; + my ($px, $sx); + my $prm_clean; # strip trailing "[array size]" and/or beginning "*" + + foreach $sx (0 .. $#sects) { + $err = 1; + foreach $px (0 .. $#prms) { + $prm_clean = $prms[$px]; + $prm_clean =~ s/\[.*\]//; + $prm_clean =~ s/__attribute__\s*\(\([a-z,_\*\s\(\)]*\)\)//i; + # ignore array size in a parameter string; + # however, the original param string may contain + # spaces, e.g.: addr[6 + 2] + # and this appears in @prms as "addr[6" since the + # parameter list is split at spaces; + # hence just ignore "[..." for the sections check; + $prm_clean =~ s/\[.*//; + + ##$prm_clean =~ s/^\**//; + if ($prm_clean eq $sects[$sx]) { + $err = 0; + last; + } + } + if ($err) { + if ($decl_type eq "function") { + print STDERR "${file}:$.: warning: " . + "Excess function parameter " . + "'$sects[$sx]' " . + "description in '$decl_name'\n"; + ++$warnings; + } + } + } +} + +## +# Checks the section describing the return value of a function. +sub check_return_section { + my $file = shift; + my $declaration_name = shift; + my $return_type = shift; + + # Ignore an empty return type (It's a macro) + # Ignore functions with a "void" return type. (But don't ignore "void *") + if (($return_type eq "") || ($return_type =~ /void\s*\w*\s*$/)) { + return; + } + + if (!defined($sections{$section_return}) || + $sections{$section_return} eq "") { + print STDERR "${file}:$.: warning: " . + "No description found for return value of " . + "'$declaration_name'\n"; + ++$warnings; + } +} + +## +# takes a function prototype and the name of the current file being +# processed and spits out all the details stored in the global +# arrays/hashes. +sub dump_function($$) { + my $prototype = shift; + my $file = shift; + my $noret = 0; + + print_lineno($new_start_line); + + $prototype =~ s/^static +//; + $prototype =~ s/^extern +//; + $prototype =~ s/^asmlinkage +//; + $prototype =~ s/^inline +//; + $prototype =~ s/^__inline__ +//; + $prototype =~ s/^__inline +//; + $prototype =~ s/^__always_inline +//; + $prototype =~ s/^noinline +//; + $prototype =~ s/__init +//; + $prototype =~ s/__init_or_module +//; + $prototype =~ s/__meminit +//; + $prototype =~ s/__must_check +//; + $prototype =~ s/__weak +//; + $prototype =~ s/__sched +//; + $prototype =~ s/__printf\s*\(\s*\d*\s*,\s*\d*\s*\) +//; + my $define = $prototype =~ s/^#\s*define\s+//; #ak added + $prototype =~ s/__attribute__\s*\(\( + (?: + [\w\s]++ # attribute name + (?:\([^)]*+\))? # attribute arguments + \s*+,? # optional comma at the end + )+ + \)\)\s+//x; + + # Yes, this truly is vile. We are looking for: + # 1. Return type (may be nothing if we're looking at a macro) + # 2. Function name + # 3. Function parameters. + # + # All the while we have to watch out for function pointer parameters + # (which IIRC is what the two sections are for), C types (these + # regexps don't even start to express all the possibilities), and + # so on. + # + # If you mess with these regexps, it's a good idea to check that + # the following functions' documentation still comes out right: + # - parport_register_device (function pointer parameters) + # - atomic_set (macro) + # - pci_match_device, __copy_to_user (long return type) + + if ($define && $prototype =~ m/^()([a-zA-Z0-9_~:]+)\s+/) { + # This is an object-like macro, it has no return type and no parameter + # list. + # Function-like macros are not allowed to have spaces between + # declaration_name and opening parenthesis (notice the \s+). + $return_type = $1; + $declaration_name = $2; + $noret = 1; + } elsif ($prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ || + $prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ || + $prototype =~ m/^(\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ || + $prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ || + $prototype =~ m/^(\w+\s+\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ || + $prototype =~ m/^(\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ || + $prototype =~ m/^(\w+\s+\w+\s+\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ || + $prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ || + $prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ || + $prototype =~ m/^(\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ || + $prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ || + $prototype =~ m/^(\w+\s+\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ || + $prototype =~ m/^(\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ || + $prototype =~ m/^(\w+\s+\w+\s+\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ || + $prototype =~ m/^(\w+\s+\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ || + $prototype =~ m/^(\w+\s+\w+\s+\w+\s+\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ || + $prototype =~ m/^(\w+\s+\w+\s*\*+\s*\w+\s*\*+\s*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/) { + $return_type = $1; + $declaration_name = $2; + my $args = $3; + + create_parameterlist($args, ',', $file, $declaration_name); + } else { + print STDERR "${file}:$.: warning: cannot understand function prototype: '$prototype'\n"; + return; + } + + my $prms = join " ", @parameterlist; + check_sections($file, $declaration_name, "function", $sectcheck, $prms); + + # This check emits a lot of warnings at the moment, because many + # functions don't have a 'Return' doc section. So until the number + # of warnings goes sufficiently down, the check is only performed in + # verbose mode. + # TODO: always perform the check. + if ($verbose && !$noret) { + check_return_section($file, $declaration_name, $return_type); + } + + # The function parser can be called with a typedef parameter. + # Handle it. + if ($return_type =~ /typedef/) { + output_declaration($declaration_name, + 'function', + {'function' => $declaration_name, + 'typedef' => 1, + 'module' => $modulename, + 'functiontype' => $return_type, + 'parameterlist' => \@parameterlist, + 'parameterdescs' => \%parameterdescs, + 'parametertypes' => \%parametertypes, + 'sectionlist' => \@sectionlist, + 'sections' => \%sections, + 'purpose' => $declaration_purpose + }); + } else { + output_declaration($declaration_name, + 'function', + {'function' => $declaration_name, + 'module' => $modulename, + 'functiontype' => $return_type, + 'parameterlist' => \@parameterlist, + 'parameterdescs' => \%parameterdescs, + 'parametertypes' => \%parametertypes, + 'sectionlist' => \@sectionlist, + 'sections' => \%sections, + 'purpose' => $declaration_purpose + }); + } +} + +sub reset_state { + $function = ""; + %parameterdescs = (); + %parametertypes = (); + @parameterlist = (); + %sections = (); + @sectionlist = (); + $sectcheck = ""; + $struct_actual = ""; + $prototype = ""; + + $state = STATE_NORMAL; + $inline_doc_state = STATE_INLINE_NA; +} + +sub tracepoint_munge($) { + my $file = shift; + my $tracepointname = 0; + my $tracepointargs = 0; + + if ($prototype =~ m/TRACE_EVENT\((.*?),/) { + $tracepointname = $1; + } + if ($prototype =~ m/DEFINE_SINGLE_EVENT\((.*?),/) { + $tracepointname = $1; + } + if ($prototype =~ m/DEFINE_EVENT\((.*?),(.*?),/) { + $tracepointname = $2; + } + $tracepointname =~ s/^\s+//; #strip leading whitespace + if ($prototype =~ m/TP_PROTO\((.*?)\)/) { + $tracepointargs = $1; + } + if (($tracepointname eq 0) || ($tracepointargs eq 0)) { + print STDERR "${file}:$.: warning: Unrecognized tracepoint format: \n". + "$prototype\n"; + } else { + $prototype = "static inline void trace_$tracepointname($tracepointargs)"; + } +} + +sub syscall_munge() { + my $void = 0; + + $prototype =~ s@[\r\n]+@ @gos; # strip newlines/CR's +## if ($prototype =~ m/SYSCALL_DEFINE0\s*\(\s*(a-zA-Z0-9_)*\s*\)/) { + if ($prototype =~ m/SYSCALL_DEFINE0/) { + $void = 1; +## $prototype = "long sys_$1(void)"; + } + + $prototype =~ s/SYSCALL_DEFINE.*\(/long sys_/; # fix return type & func name + if ($prototype =~ m/long (sys_.*?),/) { + $prototype =~ s/,/\(/; + } elsif ($void) { + $prototype =~ s/\)/\(void\)/; + } + + # now delete all of the odd-number commas in $prototype + # so that arg types & arg names don't have a comma between them + my $count = 0; + my $len = length($prototype); + if ($void) { + $len = 0; # skip the for-loop + } + for (my $ix = 0; $ix < $len; $ix++) { + if (substr($prototype, $ix, 1) eq ',') { + $count++; + if ($count % 2 == 1) { + substr($prototype, $ix, 1) = ' '; + } + } + } +} + +sub process_proto_function($$) { + my $x = shift; + my $file = shift; + + $x =~ s@\/\/.*$@@gos; # strip C99-style comments to end of line + + if ($x =~ m#\s*/\*\s+MACDOC\s*#io || ($x =~ /^#/ && $x !~ /^#\s*define/)) { + # do nothing + } + elsif ($x =~ /([^\{]*)/) { + $prototype .= $1; + } + + if (($x =~ /\{/) || ($x =~ /\#\s*define/) || ($x =~ /;/)) { + $prototype =~ s@/\*.*?\*/@@gos; # strip comments. + $prototype =~ s@[\r\n]+@ @gos; # strip newlines/cr's. + $prototype =~ s@^\s+@@gos; # strip leading spaces + + # Handle prototypes for function pointers like: + # int (*pcs_config)(struct foo) + $prototype =~ s@^(\S+\s+)\(\s*\*(\S+)\)@$1$2@gos; + + if ($prototype =~ /SYSCALL_DEFINE/) { + syscall_munge(); + } + if ($prototype =~ /TRACE_EVENT/ || $prototype =~ /DEFINE_EVENT/ || + $prototype =~ /DEFINE_SINGLE_EVENT/) + { + tracepoint_munge($file); + } + dump_function($prototype, $file); + reset_state(); + } +} + +sub process_proto_type($$) { + my $x = shift; + my $file = shift; + + $x =~ s@[\r\n]+@ @gos; # strip newlines/cr's. + $x =~ s@^\s+@@gos; # strip leading spaces + $x =~ s@\s+$@@gos; # strip trailing spaces + $x =~ s@\/\/.*$@@gos; # strip C99-style comments to end of line + + if ($x =~ /^#/) { + # To distinguish preprocessor directive from regular declaration later. + $x .= ";"; + } + + while (1) { + if ( $x =~ /([^\{\};]*)([\{\};])(.*)/ ) { + if( length $prototype ) { + $prototype .= " " + } + $prototype .= $1 . $2; + ($2 eq '{') && $brcount++; + ($2 eq '}') && $brcount--; + if (($2 eq ';') && ($brcount == 0)) { + dump_declaration($prototype, $file); + reset_state(); + last; + } + $x = $3; + } else { + $prototype .= $x; + last; + } + } +} + + +sub map_filename($) { + my $file; + my ($orig_file) = @_; + + if (defined($ENV{'SRCTREE'})) { + $file = "$ENV{'SRCTREE'}" . "/" . $orig_file; + } else { + $file = $orig_file; + } + + if (defined($source_map{$file})) { + $file = $source_map{$file}; + } + + return $file; +} + +sub process_export_file($) { + my ($orig_file) = @_; + my $file = map_filename($orig_file); + + if (!open(IN,"<$file")) { + print STDERR "Error: Cannot open file $file\n"; + ++$errors; + return; + } + + while (<IN>) { + if (/$export_symbol/) { + next if (defined($nosymbol_table{$2})); + $function_table{$2} = 1; + } + } + + close(IN); +} + +# +# Parsers for the various processing states. +# +# STATE_NORMAL: looking for the /** to begin everything. +# +sub process_normal() { + if (/$doc_start/o) { + $state = STATE_NAME; # next line is always the function name + $in_doc_sect = 0; + $declaration_start_line = $. + 1; + } +} + +# +# STATE_NAME: Looking for the "name - description" line +# +sub process_name($$) { + my $file = shift; + my $identifier; + my $descr; + + if (/$doc_block/o) { + $state = STATE_DOCBLOCK; + $contents = ""; + $new_start_line = $.; + + if ( $1 eq "" ) { + $section = $section_intro; + } else { + $section = $1; + } + } + elsif (/$doc_decl/o) { + $identifier = $1; + if (/\s*([\w\s]+?)(\(\))?\s*-/) { + $identifier = $1; + } + + $state = STATE_BODY; + # if there's no @param blocks need to set up default section + # here + $contents = ""; + $section = $section_default; + $new_start_line = $. + 1; + if (/-(.*)/) { + # strip leading/trailing/multiple spaces + $descr= $1; + $descr =~ s/^\s*//; + $descr =~ s/\s*$//; + $descr =~ s/\s+/ /g; + $declaration_purpose = $descr; + $state = STATE_BODY_MAYBE; + } else { + $declaration_purpose = ""; + } + + if (($declaration_purpose eq "") && $verbose) { + print STDERR "${file}:$.: warning: missing initial short description on line:\n"; + print STDERR $_; + ++$warnings; + } + + if ($identifier =~ m/^struct\b/) { + $decl_type = 'struct'; + } elsif ($identifier =~ m/^union\b/) { + $decl_type = 'union'; + } elsif ($identifier =~ m/^enum\b/) { + $decl_type = 'enum'; + } elsif ($identifier =~ m/^typedef\b/) { + $decl_type = 'typedef'; + } else { + $decl_type = 'function'; + } + + if ($verbose) { + print STDERR "${file}:$.: info: Scanning doc for $identifier\n"; + } + } else { + print STDERR "${file}:$.: warning: Cannot understand $_ on line $.", + " - I thought it was a doc line\n"; + ++$warnings; + $state = STATE_NORMAL; + } +} + + +# +# STATE_BODY and STATE_BODY_MAYBE: the bulk of a kerneldoc comment. +# +sub process_body($$) { + my $file = shift; + + # Until all named variable macro parameters are + # documented using the bare name (`x`) rather than with + # dots (`x...`), strip the dots: + if ($section =~ /\w\.\.\.$/) { + $section =~ s/\.\.\.$//; + + if ($verbose) { + print STDERR "${file}:$.: warning: Variable macro arguments should be documented without dots\n"; + ++$warnings; + } + } + + if ($state == STATE_BODY_WITH_BLANK_LINE && /^\s*\*\s?\S/) { + dump_section($file, $section, $contents); + $section = $section_default; + $new_start_line = $.; + $contents = ""; + } + + if (/$doc_sect/i) { # case insensitive for supported section names + $newsection = $1; + $newcontents = $2; + + # map the supported section names to the canonical names + if ($newsection =~ m/^description$/i) { + $newsection = $section_default; + } elsif ($newsection =~ m/^context$/i) { + $newsection = $section_context; + } elsif ($newsection =~ m/^returns?$/i) { + $newsection = $section_return; + } elsif ($newsection =~ m/^\@return$/) { + # special: @return is a section, not a param description + $newsection = $section_return; + } + + if (($contents ne "") && ($contents ne "\n")) { + if (!$in_doc_sect && $verbose) { + print STDERR "${file}:$.: warning: contents before sections\n"; + ++$warnings; + } + dump_section($file, $section, $contents); + $section = $section_default; + } + + $in_doc_sect = 1; + $state = STATE_BODY; + $contents = $newcontents; + $new_start_line = $.; + while (substr($contents, 0, 1) eq " ") { + $contents = substr($contents, 1); + } + if ($contents ne "") { + $contents .= "\n"; + } + $section = $newsection; + $leading_space = undef; + } elsif (/$doc_end/) { + if (($contents ne "") && ($contents ne "\n")) { + dump_section($file, $section, $contents); + $section = $section_default; + $contents = ""; + } + # look for doc_com + <text> + doc_end: + if ($_ =~ m'\s*\*\s*[a-zA-Z_0-9:\.]+\*/') { + print STDERR "${file}:$.: warning: suspicious ending line: $_"; + ++$warnings; + } + + $prototype = ""; + $state = STATE_PROTO; + $brcount = 0; + $new_start_line = $. + 1; + } elsif (/$doc_content/) { + if ($1 eq "") { + if ($section eq $section_context) { + dump_section($file, $section, $contents); + $section = $section_default; + $contents = ""; + $new_start_line = $.; + $state = STATE_BODY; + } else { + if ($section ne $section_default) { + $state = STATE_BODY_WITH_BLANK_LINE; + } else { + $state = STATE_BODY; + } + $contents .= "\n"; + } + } elsif ($state == STATE_BODY_MAYBE) { + # Continued declaration purpose + chomp($declaration_purpose); + $declaration_purpose .= " " . $1; + $declaration_purpose =~ s/\s+/ /g; + } else { + my $cont = $1; + if ($section =~ m/^@/ || $section eq $section_context) { + if (!defined $leading_space) { + if ($cont =~ m/^(\s+)/) { + $leading_space = $1; + } else { + $leading_space = ""; + } + } + $cont =~ s/^$leading_space//; + } + $contents .= $cont . "\n"; + } + } else { + # i dont know - bad line? ignore. + print STDERR "${file}:$.: warning: bad line: $_"; + ++$warnings; + } +} + + +# +# STATE_PROTO: reading a function/whatever prototype. +# +sub process_proto($$) { + my $file = shift; + + if (/$doc_inline_oneline/) { + $section = $1; + $contents = $2; + if ($contents ne "") { + $contents .= "\n"; + dump_section($file, $section, $contents); + $section = $section_default; + $contents = ""; + } + } elsif (/$doc_inline_start/) { + $state = STATE_INLINE; + $inline_doc_state = STATE_INLINE_NAME; + } elsif ($decl_type eq 'function') { + process_proto_function($_, $file); + } else { + process_proto_type($_, $file); + } +} + +# +# STATE_DOCBLOCK: within a DOC: block. +# +sub process_docblock($$) { + my $file = shift; + + if (/$doc_end/) { + dump_doc_section($file, $section, $contents); + $section = $section_default; + $contents = ""; + $function = ""; + %parameterdescs = (); + %parametertypes = (); + @parameterlist = (); + %sections = (); + @sectionlist = (); + $prototype = ""; + $state = STATE_NORMAL; + } elsif (/$doc_content/) { + if ( $1 eq "" ) { + $contents .= $blankline; + } else { + $contents .= $1 . "\n"; + } + } +} + +# +# STATE_INLINE: docbook comments within a prototype. +# +sub process_inline($$) { + my $file = shift; + + # First line (state 1) needs to be a @parameter + if ($inline_doc_state == STATE_INLINE_NAME && /$doc_inline_sect/o) { + $section = $1; + $contents = $2; + $new_start_line = $.; + if ($contents ne "") { + while (substr($contents, 0, 1) eq " ") { + $contents = substr($contents, 1); + } + $contents .= "\n"; + } + $inline_doc_state = STATE_INLINE_TEXT; + # Documentation block end */ + } elsif (/$doc_inline_end/) { + if (($contents ne "") && ($contents ne "\n")) { + dump_section($file, $section, $contents); + $section = $section_default; + $contents = ""; + } + $state = STATE_PROTO; + $inline_doc_state = STATE_INLINE_NA; + # Regular text + } elsif (/$doc_content/) { + if ($inline_doc_state == STATE_INLINE_TEXT) { + $contents .= $1 . "\n"; + # nuke leading blank lines + if ($contents =~ /^\s*$/) { + $contents = ""; + } + } elsif ($inline_doc_state == STATE_INLINE_NAME) { + $inline_doc_state = STATE_INLINE_ERROR; + print STDERR "${file}:$.: warning: "; + print STDERR "Incorrect use of kernel-doc format: $_"; + ++$warnings; + } + } +} + + +sub process_file($) { + my $file; + my $initial_section_counter = $section_counter; + my ($orig_file) = @_; + + $file = map_filename($orig_file); + + if (!open(IN_FILE,"<$file")) { + print STDERR "Error: Cannot open file $file\n"; + ++$errors; + return; + } + + $. = 1; + + $section_counter = 0; + while (<IN_FILE>) { + while (s/\\\s*$//) { + $_ .= <IN_FILE>; + } + # Replace tabs by spaces + while ($_ =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e) {}; + # Hand this line to the appropriate state handler + if ($state == STATE_NORMAL) { + process_normal(); + } elsif ($state == STATE_NAME) { + process_name($file, $_); + } elsif ($state == STATE_BODY || $state == STATE_BODY_MAYBE || + $state == STATE_BODY_WITH_BLANK_LINE) { + process_body($file, $_); + } elsif ($state == STATE_INLINE) { # scanning for inline parameters + process_inline($file, $_); + } elsif ($state == STATE_PROTO) { + process_proto($file, $_); + } elsif ($state == STATE_DOCBLOCK) { + process_docblock($file, $_); + } + } + + # Make sure we got something interesting. + if ($initial_section_counter == $section_counter && $ + output_mode ne "none") { + if ($output_selection == OUTPUT_INCLUDE) { + print STDERR "${file}:1: warning: '$_' not found\n" + for keys %function_table; + } + else { + print STDERR "${file}:1: warning: no structured comments found\n"; + } + } + close IN_FILE; +} + + +if ($output_mode eq "rst") { + get_sphinx_version() if (!$sphinx_major); +} + +$kernelversion = get_kernel_version(); + +# generate a sequence of code that will splice in highlighting information +# using the s// operator. +for (my $k = 0; $k < @highlights; $k++) { + my $pattern = $highlights[$k][0]; + my $result = $highlights[$k][1]; +# print STDERR "scanning pattern:$pattern, highlight:($result)\n"; + $dohighlight .= "\$contents =~ s:$pattern:$result:gs;\n"; +} + +# Read the file that maps relative names to absolute names for +# separate source and object directories and for shadow trees. +if (open(SOURCE_MAP, "<.tmp_filelist.txt")) { + my ($relname, $absname); + while(<SOURCE_MAP>) { + chop(); + ($relname, $absname) = (split())[0..1]; + $relname =~ s:^/+::; + $source_map{$relname} = $absname; + } + close(SOURCE_MAP); +} + +if ($output_selection == OUTPUT_EXPORTED || + $output_selection == OUTPUT_INTERNAL) { + + push(@export_file_list, @ARGV); + + foreach (@export_file_list) { + chomp; + process_export_file($_); + } +} + +foreach (@ARGV) { + chomp; + process_file($_); +} +if ($verbose && $errors) { + print STDERR "$errors errors\n"; +} +if ($verbose && $warnings) { + print STDERR "$warnings warnings\n"; +} + +if ($Werror && $warnings) { + print STDERR "$warnings warnings as Errors\n"; + exit($warnings); +} else { + exit($output_mode eq "none" ? 0 : $errors) +} diff --git a/src/net/scripts/ksymoops/README b/src/net/scripts/ksymoops/README new file mode 100644 index 0000000..4130439 --- /dev/null +++ b/src/net/scripts/ksymoops/README @@ -0,0 +1,7 @@ +ksymoops has been removed from the kernel. It was always meant to be a +free standing utility, not linked to any particular kernel version. +The latest version can be found in +https://www.kernel.org/pub/linux/utils/kernel/ksymoops together with patches to +other utilities in order to give more accurate Oops debugging. + +Keith Owens <kaos@ocs.com.au> Sat Jun 19 10:30:34 EST 1999 diff --git a/src/net/scripts/ld-version.sh b/src/net/scripts/ld-version.sh new file mode 100755 index 0000000..f2be0ff --- /dev/null +++ b/src/net/scripts/ld-version.sh @@ -0,0 +1,11 @@ +#!/usr/bin/awk -f +# SPDX-License-Identifier: GPL-2.0 +# extract linker version number from stdin and turn into single number + { + gsub(".*\\)", ""); + gsub(".*version ", ""); + gsub("-.*", ""); + split($1,a, "."); + print a[1]*100000000 + a[2]*1000000 + a[3]*10000; + exit + } diff --git a/src/net/scripts/leaking_addresses.pl b/src/net/scripts/leaking_addresses.pl new file mode 100755 index 0000000..8f636a2 --- /dev/null +++ b/src/net/scripts/leaking_addresses.pl @@ -0,0 +1,647 @@ +#!/usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0-only +# +# (c) 2017 Tobin C. Harding <me@tobin.cc> +# +# leaking_addresses.pl: Scan the kernel for potential leaking addresses. +# - Scans dmesg output. +# - Walks directory tree and parses each file (for each directory in @DIRS). +# +# Use --debug to output path before parsing, this is useful to find files that +# cause the script to choke. + +# +# When the system is idle it is likely that most files under /proc/PID will be +# identical for various processes. Scanning _all_ the PIDs under /proc is +# unnecessary and implies that we are thoroughly scanning /proc. This is _not_ +# the case because there may be ways userspace can trigger creation of /proc +# files that leak addresses but were not present during a scan. For these two +# reasons we exclude all PID directories under /proc except '1/' + +use warnings; +use strict; +use POSIX; +use File::Basename; +use File::Spec; +use Cwd 'abs_path'; +use Term::ANSIColor qw(:constants); +use Getopt::Long qw(:config no_auto_abbrev); +use Config; +use bigint qw/hex/; +use feature 'state'; + +my $P = $0; + +# Directories to scan. +my @DIRS = ('/proc', '/sys'); + +# Timer for parsing each file, in seconds. +my $TIMEOUT = 10; + +# Kernel addresses vary by architecture. We can only auto-detect the following +# architectures (using `uname -m`). (flag --32-bit overrides auto-detection.) +my @SUPPORTED_ARCHITECTURES = ('x86_64', 'ppc64', 'x86'); + +# Command line options. +my $help = 0; +my $debug = 0; +my $raw = 0; +my $output_raw = ""; # Write raw results to file. +my $input_raw = ""; # Read raw results from file instead of scanning. +my $suppress_dmesg = 0; # Don't show dmesg in output. +my $squash_by_path = 0; # Summary report grouped by absolute path. +my $squash_by_filename = 0; # Summary report grouped by filename. +my $kernel_config_file = ""; # Kernel configuration file. +my $opt_32bit = 0; # Scan 32-bit kernel. +my $page_offset_32bit = 0; # Page offset for 32-bit kernel. + +# Skip these absolute paths. +my @skip_abs = ( + '/proc/kmsg', + '/proc/device-tree', + '/proc/1/syscall', + '/sys/firmware/devicetree', + '/sys/kernel/debug/tracing/trace_pipe', + '/sys/kernel/security/apparmor/revision'); + +# Skip these under any subdirectory. +my @skip_any = ( + 'pagemap', + 'events', + 'access', + 'registers', + 'snapshot_raw', + 'trace_pipe_raw', + 'ptmx', + 'trace_pipe', + 'fd', + 'usbmon'); + +sub help +{ + my ($exitcode) = @_; + + print << "EOM"; + +Usage: $P [OPTIONS] + +Options: + + -o, --output-raw=<file> Save results for future processing. + -i, --input-raw=<file> Read results from file instead of scanning. + --raw Show raw results (default). + --suppress-dmesg Do not show dmesg results. + --squash-by-path Show one result per unique path. + --squash-by-filename Show one result per unique filename. + --kernel-config-file=<file> Kernel configuration file (e.g /boot/config) + --32-bit Scan 32-bit kernel. + --page-offset-32-bit=o Page offset (for 32-bit kernel 0xABCD1234). + -d, --debug Display debugging output. + -h, --help Display this help and exit. + +Scans the running kernel for potential leaking addresses. + +EOM + exit($exitcode); +} + +GetOptions( + 'd|debug' => \$debug, + 'h|help' => \$help, + 'o|output-raw=s' => \$output_raw, + 'i|input-raw=s' => \$input_raw, + 'suppress-dmesg' => \$suppress_dmesg, + 'squash-by-path' => \$squash_by_path, + 'squash-by-filename' => \$squash_by_filename, + 'raw' => \$raw, + 'kernel-config-file=s' => \$kernel_config_file, + '32-bit' => \$opt_32bit, + 'page-offset-32-bit=o' => \$page_offset_32bit, +) or help(1); + +help(0) if ($help); + +if ($input_raw) { + format_output($input_raw); + exit(0); +} + +if (!$input_raw and ($squash_by_path or $squash_by_filename)) { + printf "\nSummary reporting only available with --input-raw=<file>\n"; + printf "(First run scan with --output-raw=<file>.)\n"; + exit(128); +} + +if (!(is_supported_architecture() or $opt_32bit or $page_offset_32bit)) { + printf "\nScript does not support your architecture, sorry.\n"; + printf "\nCurrently we support: \n\n"; + foreach(@SUPPORTED_ARCHITECTURES) { + printf "\t%s\n", $_; + } + printf("\n"); + + printf("If you are running a 32-bit architecture you may use:\n"); + printf("\n\t--32-bit or --page-offset-32-bit=<page offset>\n\n"); + + my $archname = `uname -m`; + printf("Machine hardware name (`uname -m`): %s\n", $archname); + + exit(129); +} + +if ($output_raw) { + open my $fh, '>', $output_raw or die "$0: $output_raw: $!\n"; + select $fh; +} + +parse_dmesg(); +walk(@DIRS); + +exit 0; + +sub dprint +{ + printf(STDERR @_) if $debug; +} + +sub is_supported_architecture +{ + return (is_x86_64() or is_ppc64() or is_ix86_32()); +} + +sub is_32bit +{ + # Allow --32-bit or --page-offset-32-bit to override + if ($opt_32bit or $page_offset_32bit) { + return 1; + } + + return is_ix86_32(); +} + +sub is_ix86_32 +{ + state $arch = `uname -m`; + + chomp $arch; + if ($arch =~ m/i[3456]86/) { + return 1; + } + return 0; +} + +sub is_arch +{ + my ($desc) = @_; + my $arch = `uname -m`; + + chomp $arch; + if ($arch eq $desc) { + return 1; + } + return 0; +} + +sub is_x86_64 +{ + state $is = is_arch('x86_64'); + return $is; +} + +sub is_ppc64 +{ + state $is = is_arch('ppc64'); + return $is; +} + +# Gets config option value from kernel config file. +# Returns "" on error or if config option not found. +sub get_kernel_config_option +{ + my ($option) = @_; + my $value = ""; + my $tmp_file = ""; + my @config_files; + + # Allow --kernel-config-file to override. + if ($kernel_config_file ne "") { + @config_files = ($kernel_config_file); + } elsif (-R "/proc/config.gz") { + my $tmp_file = "/tmp/tmpkconf"; + + if (system("gunzip < /proc/config.gz > $tmp_file")) { + dprint("system(gunzip < /proc/config.gz) failed\n"); + return ""; + } else { + @config_files = ($tmp_file); + } + } else { + my $file = '/boot/config-' . `uname -r`; + chomp $file; + @config_files = ($file, '/boot/config'); + } + + foreach my $file (@config_files) { + dprint("parsing config file: $file\n"); + $value = option_from_file($option, $file); + if ($value ne "") { + last; + } + } + + if ($tmp_file ne "") { + system("rm -f $tmp_file"); + } + + return $value; +} + +# Parses $file and returns kernel configuration option value. +sub option_from_file +{ + my ($option, $file) = @_; + my $str = ""; + my $val = ""; + + open(my $fh, "<", $file) or return ""; + while (my $line = <$fh> ) { + if ($line =~ /^$option/) { + ($str, $val) = split /=/, $line; + chomp $val; + last; + } + } + + close $fh; + return $val; +} + +sub is_false_positive +{ + my ($match) = @_; + + if (is_32bit()) { + return is_false_positive_32bit($match); + } + + # 64 bit false positives. + + if ($match =~ '\b(0x)?(f|F){16}\b' or + $match =~ '\b(0x)?0{16}\b') { + return 1; + } + + if (is_x86_64() and is_in_vsyscall_memory_region($match)) { + return 1; + } + + return 0; +} + +sub is_false_positive_32bit +{ + my ($match) = @_; + state $page_offset = get_page_offset(); + + if ($match =~ '\b(0x)?(f|F){8}\b') { + return 1; + } + + if (hex($match) < $page_offset) { + return 1; + } + + return 0; +} + +# returns integer value +sub get_page_offset +{ + my $page_offset; + my $default_offset = 0xc0000000; + + # Allow --page-offset-32bit to override. + if ($page_offset_32bit != 0) { + return $page_offset_32bit; + } + + $page_offset = get_kernel_config_option('CONFIG_PAGE_OFFSET'); + if (!$page_offset) { + return $default_offset; + } + return $page_offset; +} + +sub is_in_vsyscall_memory_region +{ + my ($match) = @_; + + my $hex = hex($match); + my $region_min = hex("0xffffffffff600000"); + my $region_max = hex("0xffffffffff601000"); + + return ($hex >= $region_min and $hex <= $region_max); +} + +# True if argument potentially contains a kernel address. +sub may_leak_address +{ + my ($line) = @_; + my $address_re; + + # Signal masks. + if ($line =~ '^SigBlk:' or + $line =~ '^SigIgn:' or + $line =~ '^SigCgt:') { + return 0; + } + + if ($line =~ '\bKEY=[[:xdigit:]]{14} [[:xdigit:]]{16} [[:xdigit:]]{16}\b' or + $line =~ '\b[[:xdigit:]]{14} [[:xdigit:]]{16} [[:xdigit:]]{16}\b') { + return 0; + } + + $address_re = get_address_re(); + while ($line =~ /($address_re)/g) { + if (!is_false_positive($1)) { + return 1; + } + } + + return 0; +} + +sub get_address_re +{ + if (is_ppc64()) { + return '\b(0x)?[89abcdef]00[[:xdigit:]]{13}\b'; + } elsif (is_32bit()) { + return '\b(0x)?[[:xdigit:]]{8}\b'; + } + + return get_x86_64_re(); +} + +sub get_x86_64_re +{ + # We handle page table levels but only if explicitly configured using + # CONFIG_PGTABLE_LEVELS. If config file parsing fails or config option + # is not found we default to using address regular expression suitable + # for 4 page table levels. + state $ptl = get_kernel_config_option('CONFIG_PGTABLE_LEVELS'); + + if ($ptl == 5) { + return '\b(0x)?ff[[:xdigit:]]{14}\b'; + } + return '\b(0x)?ffff[[:xdigit:]]{12}\b'; +} + +sub parse_dmesg +{ + open my $cmd, '-|', 'dmesg'; + while (<$cmd>) { + if (may_leak_address($_)) { + print 'dmesg: ' . $_; + } + } + close $cmd; +} + +# True if we should skip this path. +sub skip +{ + my ($path) = @_; + + foreach (@skip_abs) { + return 1 if (/^$path$/); + } + + my($filename, $dirs, $suffix) = fileparse($path); + foreach (@skip_any) { + return 1 if (/^$filename$/); + } + + return 0; +} + +sub timed_parse_file +{ + my ($file) = @_; + + eval { + local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required. + alarm $TIMEOUT; + parse_file($file); + alarm 0; + }; + + if ($@) { + die unless $@ eq "alarm\n"; # Propagate unexpected errors. + printf STDERR "timed out parsing: %s\n", $file; + } +} + +sub parse_file +{ + my ($file) = @_; + + if (! -R $file) { + return; + } + + if (! -T $file) { + return; + } + + open my $fh, "<", $file or return; + while ( <$fh> ) { + chomp; + if (may_leak_address($_)) { + printf("$file: $_\n"); + } + } + close $fh; +} + +# Checks if the actual path name is leaking a kernel address. +sub check_path_for_leaks +{ + my ($path) = @_; + + if (may_leak_address($path)) { + printf("Path name may contain address: $path\n"); + } +} + +# Recursively walk directory tree. +sub walk +{ + my @dirs = @_; + + while (my $pwd = shift @dirs) { + next if (!opendir(DIR, $pwd)); + my @files = readdir(DIR); + closedir(DIR); + + foreach my $file (@files) { + next if ($file eq '.' or $file eq '..'); + + my $path = "$pwd/$file"; + next if (-l $path); + + # skip /proc/PID except /proc/1 + next if (($path =~ /^\/proc\/[0-9]+$/) && + ($path !~ /^\/proc\/1$/)); + + next if (skip($path)); + + check_path_for_leaks($path); + + if (-d $path) { + push @dirs, $path; + next; + } + + dprint("parsing: $path\n"); + timed_parse_file($path); + } + } +} + +sub format_output +{ + my ($file) = @_; + + # Default is to show raw results. + if ($raw or (!$squash_by_path and !$squash_by_filename)) { + dump_raw_output($file); + return; + } + + my ($total, $dmesg, $paths, $files) = parse_raw_file($file); + + printf "\nTotal number of results from scan (incl dmesg): %d\n", $total; + + if (!$suppress_dmesg) { + print_dmesg($dmesg); + } + + if ($squash_by_filename) { + squash_by($files, 'filename'); + } + + if ($squash_by_path) { + squash_by($paths, 'path'); + } +} + +sub dump_raw_output +{ + my ($file) = @_; + + open (my $fh, '<', $file) or die "$0: $file: $!\n"; + while (<$fh>) { + if ($suppress_dmesg) { + if ("dmesg:" eq substr($_, 0, 6)) { + next; + } + } + print $_; + } + close $fh; +} + +sub parse_raw_file +{ + my ($file) = @_; + + my $total = 0; # Total number of lines parsed. + my @dmesg; # dmesg output. + my %files; # Unique filenames containing leaks. + my %paths; # Unique paths containing leaks. + + open (my $fh, '<', $file) or die "$0: $file: $!\n"; + while (my $line = <$fh>) { + $total++; + + if ("dmesg:" eq substr($line, 0, 6)) { + push @dmesg, $line; + next; + } + + cache_path(\%paths, $line); + cache_filename(\%files, $line); + } + + return $total, \@dmesg, \%paths, \%files; +} + +sub print_dmesg +{ + my ($dmesg) = @_; + + print "\ndmesg output:\n"; + + if (@$dmesg == 0) { + print "<no results>\n"; + return; + } + + foreach(@$dmesg) { + my $index = index($_, ': '); + $index += 2; # skid ': ' + print substr($_, $index); + } +} + +sub squash_by +{ + my ($ref, $desc) = @_; + + print "\nResults squashed by $desc (excl dmesg). "; + print "Displaying [<number of results> <$desc>], <example result>\n"; + + if (keys %$ref == 0) { + print "<no results>\n"; + return; + } + + foreach(keys %$ref) { + my $lines = $ref->{$_}; + my $length = @$lines; + printf "[%d %s] %s", $length, $_, @$lines[0]; + } +} + +sub cache_path +{ + my ($paths, $line) = @_; + + my $index = index($line, ': '); + my $path = substr($line, 0, $index); + + $index += 2; # skip ': ' + add_to_cache($paths, $path, substr($line, $index)); +} + +sub cache_filename +{ + my ($files, $line) = @_; + + my $index = index($line, ': '); + my $path = substr($line, 0, $index); + my $filename = basename($path); + + $index += 2; # skip ': ' + add_to_cache($files, $filename, substr($line, $index)); +} + +sub add_to_cache +{ + my ($cache, $key, $value) = @_; + + if (!$cache->{$key}) { + $cache->{$key} = (); + } + push @{$cache->{$key}}, $value; +} diff --git a/src/net/scripts/link-vmlinux.sh b/src/net/scripts/link-vmlinux.sh new file mode 100755 index 0000000..22b6ca8 --- /dev/null +++ b/src/net/scripts/link-vmlinux.sh @@ -0,0 +1,375 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# +# link vmlinux +# +# vmlinux is linked from the objects selected by $(KBUILD_VMLINUX_OBJS) and +# $(KBUILD_VMLINUX_LIBS). Most are built-in.a files from top-level directories +# in the kernel tree, others are specified in arch/$(ARCH)/Makefile. +# $(KBUILD_VMLINUX_LIBS) are archives which are linked conditionally +# (not within --whole-archive), and do not require symbol indexes added. +# +# vmlinux +# ^ +# | +# +--< $(KBUILD_VMLINUX_OBJS) +# | +--< init/built-in.a drivers/built-in.a mm/built-in.a + more +# | +# +--< $(KBUILD_VMLINUX_LIBS) +# | +--< lib/lib.a + more +# | +# +-< ${kallsymso} (see description in KALLSYMS section) +# +# vmlinux version (uname -v) cannot be updated during normal +# descending-into-subdirs phase since we do not yet know if we need to +# update vmlinux. +# Therefore this step is delayed until just before final link of vmlinux. +# +# System.map is generated to document addresses of all kernel symbols + +# Error out on error +set -e + +LD="$1" +KBUILD_LDFLAGS="$2" +LDFLAGS_vmlinux="$3" + +# Nice output in kbuild format +# Will be supressed by "make -s" +info() +{ + if [ "${quiet}" != "silent_" ]; then + printf " %-7s %s\n" "${1}" "${2}" + fi +} + +# Link of vmlinux.o used for section mismatch analysis +# ${1} output file +modpost_link() +{ + local objects + + objects="--whole-archive \ + ${KBUILD_VMLINUX_OBJS} \ + --no-whole-archive \ + --start-group \ + ${KBUILD_VMLINUX_LIBS} \ + --end-group" + + ${LD} ${KBUILD_LDFLAGS} -r -o ${1} ${objects} +} + +objtool_link() +{ + local objtoolopt; + + if [ -n "${CONFIG_VMLINUX_VALIDATION}" ]; then + objtoolopt="check" + if [ -n "${CONFIG_CPU_UNRET_ENTRY}" ]; then + objtoolopt="${objtoolopt} --unret" + fi + if [ -z "${CONFIG_FRAME_POINTER}" ]; then + objtoolopt="${objtoolopt} --no-fp" + fi + if [ -n "${CONFIG_GCOV_KERNEL}" ]; then + objtoolopt="${objtoolopt} --no-unreachable" + fi + if [ -n "${CONFIG_RETPOLINE}" ]; then + objtoolopt="${objtoolopt} --retpoline" + fi + if [ -n "${CONFIG_X86_SMAP}" ]; then + objtoolopt="${objtoolopt} --uaccess" + fi + if [ -n "${CONFIG_SLS}" ]; then + objtoolopt="${objtoolopt} --sls" + fi + info OBJTOOL ${1} + tools/objtool/objtool ${objtoolopt} ${1} + fi +} + +# Link of vmlinux +# ${1} - output file +# ${2}, ${3}, ... - optional extra .o files +vmlinux_link() +{ + local lds="${objtree}/${KBUILD_LDS}" + local output=${1} + local objects + local strip_debug + + info LD ${output} + + # skip output file argument + shift + + # The kallsyms linking does not need debug symbols included. + if [ "$output" != "${output#.tmp_vmlinux.kallsyms}" ] ; then + strip_debug=-Wl,--strip-debug + fi + + if [ "${SRCARCH}" != "um" ]; then + objects="--whole-archive \ + ${KBUILD_VMLINUX_OBJS} \ + --no-whole-archive \ + --start-group \ + ${KBUILD_VMLINUX_LIBS} \ + --end-group \ + ${@}" + + ${LD} ${KBUILD_LDFLAGS} ${LDFLAGS_vmlinux} \ + ${strip_debug#-Wl,} \ + -o ${output} \ + -T ${lds} ${objects} + else + objects="-Wl,--whole-archive \ + ${KBUILD_VMLINUX_OBJS} \ + -Wl,--no-whole-archive \ + -Wl,--start-group \ + ${KBUILD_VMLINUX_LIBS} \ + -Wl,--end-group \ + ${@}" + + ${CC} ${CFLAGS_vmlinux} \ + ${strip_debug} \ + -o ${output} \ + -Wl,-T,${lds} \ + ${objects} \ + -lutil -lrt -lpthread + rm -f linux + fi +} + +# generate .BTF typeinfo from DWARF debuginfo +# ${1} - vmlinux image +# ${2} - file to dump raw BTF data into +gen_btf() +{ + local pahole_ver + + if ! [ -x "$(command -v ${PAHOLE})" ]; then + echo >&2 "BTF: ${1}: pahole (${PAHOLE}) is not available" + return 1 + fi + + pahole_ver=$(${PAHOLE} --version | sed -E 's/v([0-9]+)\.([0-9]+)/\1\2/') + if [ "${pahole_ver}" -lt "116" ]; then + echo >&2 "BTF: ${1}: pahole version $(${PAHOLE} --version) is too old, need at least v1.16" + return 1 + fi + + vmlinux_link ${1} + + info "BTF" ${2} + LLVM_OBJCOPY="${OBJCOPY}" ${PAHOLE} -J ${PAHOLE_FLAGS} ${1} + + # Create ${2} which contains just .BTF section but no symbols. Add + # SHF_ALLOC because .BTF will be part of the vmlinux image. --strip-all + # deletes all symbols including __start_BTF and __stop_BTF, which will + # be redefined in the linker script. Add 2>/dev/null to suppress GNU + # objcopy warnings: "empty loadable segment detected at ..." + ${OBJCOPY} --only-section=.BTF --set-section-flags .BTF=alloc,readonly \ + --strip-all ${1} ${2} 2>/dev/null + # Change e_type to ET_REL so that it can be used to link final vmlinux. + # Unlike GNU ld, lld does not allow an ET_EXEC input. + printf '\1' | dd of=${2} conv=notrunc bs=1 seek=16 status=none +} + +# Create ${2} .S file with all symbols from the ${1} object file +kallsyms() +{ + local kallsymopt; + + if [ -n "${CONFIG_KALLSYMS_ALL}" ]; then + kallsymopt="${kallsymopt} --all-symbols" + fi + + if [ -n "${CONFIG_KALLSYMS_ABSOLUTE_PERCPU}" ]; then + kallsymopt="${kallsymopt} --absolute-percpu" + fi + + if [ -n "${CONFIG_KALLSYMS_BASE_RELATIVE}" ]; then + kallsymopt="${kallsymopt} --base-relative" + fi + + info KSYMS ${2} + ${NM} -n ${1} | scripts/kallsyms ${kallsymopt} > ${2} +} + +# Perform one step in kallsyms generation, including temporary linking of +# vmlinux. +kallsyms_step() +{ + kallsymso_prev=${kallsymso} + kallsyms_vmlinux=.tmp_vmlinux.kallsyms${1} + kallsymso=${kallsyms_vmlinux}.o + kallsyms_S=${kallsyms_vmlinux}.S + + vmlinux_link ${kallsyms_vmlinux} "${kallsymso_prev}" ${btf_vmlinux_bin_o} + kallsyms ${kallsyms_vmlinux} ${kallsyms_S} + + info AS ${kallsyms_S} + ${CC} ${NOSTDINC_FLAGS} ${LINUXINCLUDE} ${KBUILD_CPPFLAGS} \ + ${KBUILD_AFLAGS} ${KBUILD_AFLAGS_KERNEL} \ + -c -o ${kallsymso} ${kallsyms_S} +} + +# Create map file with all symbols from ${1} +# See mksymap for additional details +mksysmap() +{ + ${CONFIG_SHELL} "${srctree}/scripts/mksysmap" ${1} ${2} +} + +sorttable() +{ + ${objtree}/scripts/sorttable ${1} +} + +# Delete output files in case of error +cleanup() +{ + rm -f .btf.* + rm -f .tmp_System.map + rm -f .tmp_vmlinux* + rm -f System.map + rm -f vmlinux + rm -f vmlinux.o +} + +on_exit() +{ + if [ $? -ne 0 ]; then + cleanup + fi +} +trap on_exit EXIT + +on_signals() +{ + exit 1 +} +trap on_signals HUP INT QUIT TERM + +# Use "make V=1" to debug this script +case "${KBUILD_VERBOSE}" in +*1*) + set -x + ;; +esac + +if [ "$1" = "clean" ]; then + cleanup + exit 0 +fi + +# We need access to CONFIG_ symbols +. include/config/auto.conf + +# Update version +info GEN .version +if [ -r .version ]; then + VERSION=$(expr 0$(cat .version) + 1) + echo $VERSION > .version +else + rm -f .version + echo 1 > .version +fi; + +# final build of init/ +${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init need-builtin=1 + +#link vmlinux.o +info LD vmlinux.o +modpost_link vmlinux.o +objtool_link vmlinux.o + +# modpost vmlinux.o to check for section mismatches +${MAKE} -f "${srctree}/scripts/Makefile.modpost" MODPOST_VMLINUX=1 + +info MODINFO modules.builtin.modinfo +${OBJCOPY} -j .modinfo -O binary vmlinux.o modules.builtin.modinfo +info GEN modules.builtin +# The second line aids cases where multiple modules share the same object. +tr '\0' '\n' < modules.builtin.modinfo | sed -n 's/^[[:alnum:]:_]*\.file=//p' | + tr ' ' '\n' | uniq | sed -e 's:^:kernel/:' -e 's/$/.ko/' > modules.builtin + +btf_vmlinux_bin_o="" +if [ -n "${CONFIG_DEBUG_INFO_BTF}" ]; then + btf_vmlinux_bin_o=.btf.vmlinux.bin.o + if ! gen_btf .tmp_vmlinux.btf $btf_vmlinux_bin_o ; then + echo >&2 "Failed to generate BTF for vmlinux" + echo >&2 "Try to disable CONFIG_DEBUG_INFO_BTF" + exit 1 + fi +fi + +kallsymso="" +kallsymso_prev="" +kallsyms_vmlinux="" +if [ -n "${CONFIG_KALLSYMS}" ]; then + + # kallsyms support + # Generate section listing all symbols and add it into vmlinux + # It's a three step process: + # 1) Link .tmp_vmlinux1 so it has all symbols and sections, + # but __kallsyms is empty. + # Running kallsyms on that gives us .tmp_kallsyms1.o with + # the right size + # 2) Link .tmp_vmlinux2 so it now has a __kallsyms section of + # the right size, but due to the added section, some + # addresses have shifted. + # From here, we generate a correct .tmp_kallsyms2.o + # 3) That link may have expanded the kernel image enough that + # more linker branch stubs / trampolines had to be added, which + # introduces new names, which further expands kallsyms. Do another + # pass if that is the case. In theory it's possible this results + # in even more stubs, but unlikely. + # KALLSYMS_EXTRA_PASS=1 may also used to debug or work around + # other bugs. + # 4) The correct ${kallsymso} is linked into the final vmlinux. + # + # a) Verify that the System.map from vmlinux matches the map from + # ${kallsymso}. + + kallsyms_step 1 + kallsyms_step 2 + + # step 3 + size1=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" ${kallsymso_prev}) + size2=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" ${kallsymso}) + + if [ $size1 -ne $size2 ] || [ -n "${KALLSYMS_EXTRA_PASS}" ]; then + kallsyms_step 3 + fi +fi + +vmlinux_link vmlinux "${kallsymso}" ${btf_vmlinux_bin_o} + +# fill in BTF IDs +if [ -n "${CONFIG_DEBUG_INFO_BTF}" -a -n "${CONFIG_BPF}" ]; then + info BTFIDS vmlinux + ${RESOLVE_BTFIDS} vmlinux +fi + +info SYSMAP System.map +mksysmap vmlinux System.map + +if [ -n "${CONFIG_BUILDTIME_TABLE_SORT}" ]; then + info SORTTAB vmlinux + if ! sorttable vmlinux; then + echo >&2 Failed to sort kernel tables + exit 1 + fi +fi + +# step a (see comment above) +if [ -n "${CONFIG_KALLSYMS}" ]; then + mksysmap ${kallsyms_vmlinux} .tmp_System.map + + if ! cmp -s System.map .tmp_System.map; then + echo >&2 Inconsistent kallsyms data + echo >&2 Try "make KALLSYMS_EXTRA_PASS=1" as a workaround + exit 1 + fi +fi diff --git a/src/net/scripts/lld-version.sh b/src/net/scripts/lld-version.sh new file mode 100755 index 0000000..f1eeee4 --- /dev/null +++ b/src/net/scripts/lld-version.sh @@ -0,0 +1,37 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# +# Usage: $ ./scripts/lld-version.sh ld.lld +# +# Print the linker version of `ld.lld' in a 5 or 6-digit form +# such as `100001' for ld.lld 10.0.1 etc. + +set -e + +# Convert the version string x.y.z to a canonical 5 or 6-digit form. +get_canonical_version() +{ + IFS=. + set -- $1 + + # If the 2nd or 3rd field is missing, fill it with a zero. + echo $((10000 * $1 + 100 * ${2:-0} + ${3:-0})) +} + +# Get the first line of the --version output. +IFS=' +' +set -- $(LC_ALL=C "$@" --version) + +# Split the line on spaces. +IFS=' ' +set -- $1 + +while [ $# -gt 1 -a "$1" != "LLD" ]; do + shift +done +if [ "$1" = LLD ]; then + echo $(get_canonical_version ${2%-*}) +else + echo 0 +fi diff --git a/src/net/scripts/makelst b/src/net/scripts/makelst new file mode 100755 index 0000000..e432af0 --- /dev/null +++ b/src/net/scripts/makelst @@ -0,0 +1,32 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# A script to dump mixed source code & assembly +# with correct relocations from System.map +# Requires the following lines in makefile: +#%.lst: %.c +# $(CC) $(c_flags) -g -c -o $*.o $< && +# $(srctree)/scripts/makelst $*.o System.map $(OBJDUMP) > $@ +# +# Copyright (C) 2000 IBM Corporation +# Author(s): DJ Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com) +# William Stearns <wstearns@pobox.com> +# + +# awk style field access +field() { + shift $1 ; echo $1 +} + +t1=`$3 --syms $1 | grep .text | grep -m1 " F "` +if [ -n "$t1" ]; then + t2=`field 6 $t1` + if [ ! -r $2 ]; then + echo "No System.map" >&2 + else + t3=`grep $t2 $2` + t4=`field 1 $t3` + t5=`field 1 $t1` + t6=`printf "%lu" $((0x$t4 - 0x$t5))` + fi +fi +$3 -r --source --adjust-vma=${t6:-0} $1 diff --git a/src/net/scripts/markup_oops.pl b/src/net/scripts/markup_oops.pl new file mode 100755 index 0000000..e476caf --- /dev/null +++ b/src/net/scripts/markup_oops.pl @@ -0,0 +1,366 @@ +#!/usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0-only + +use File::Basename; +use Math::BigInt; +use Getopt::Long; + +# Copyright 2008, Intel Corporation +# +# This file is part of the Linux kernel +# +# Authors: +# Arjan van de Ven <arjan@linux.intel.com> + + +my $cross_compile = ""; +my $vmlinux_name = ""; +my $modulefile = ""; + +# Get options +Getopt::Long::GetOptions( + 'cross-compile|c=s' => \$cross_compile, + 'module|m=s' => \$modulefile, + 'help|h' => \&usage, +) || usage (); +my $vmlinux_name = $ARGV[0]; +if (!defined($vmlinux_name)) { + my $kerver = `uname -r`; + chomp($kerver); + $vmlinux_name = "/lib/modules/$kerver/build/vmlinux"; + print "No vmlinux specified, assuming $vmlinux_name\n"; +} +my $filename = $vmlinux_name; + +# Parse the oops to find the EIP value + +my $target = "0"; +my $function; +my $module = ""; +my $func_offset = 0; +my $vmaoffset = 0; + +my %regs; + + +sub parse_x86_regs +{ + my ($line) = @_; + if ($line =~ /EAX: ([0-9a-f]+) EBX: ([0-9a-f]+) ECX: ([0-9a-f]+) EDX: ([0-9a-f]+)/) { + $regs{"%eax"} = $1; + $regs{"%ebx"} = $2; + $regs{"%ecx"} = $3; + $regs{"%edx"} = $4; + } + if ($line =~ /ESI: ([0-9a-f]+) EDI: ([0-9a-f]+) EBP: ([0-9a-f]+) ESP: ([0-9a-f]+)/) { + $regs{"%esi"} = $1; + $regs{"%edi"} = $2; + $regs{"%esp"} = $4; + } + if ($line =~ /RAX: ([0-9a-f]+) RBX: ([0-9a-f]+) RCX: ([0-9a-f]+)/) { + $regs{"%eax"} = $1; + $regs{"%ebx"} = $2; + $regs{"%ecx"} = $3; + } + if ($line =~ /RDX: ([0-9a-f]+) RSI: ([0-9a-f]+) RDI: ([0-9a-f]+)/) { + $regs{"%edx"} = $1; + $regs{"%esi"} = $2; + $regs{"%edi"} = $3; + } + if ($line =~ /RBP: ([0-9a-f]+) R08: ([0-9a-f]+) R09: ([0-9a-f]+)/) { + $regs{"%r08"} = $2; + $regs{"%r09"} = $3; + } + if ($line =~ /R10: ([0-9a-f]+) R11: ([0-9a-f]+) R12: ([0-9a-f]+)/) { + $regs{"%r10"} = $1; + $regs{"%r11"} = $2; + $regs{"%r12"} = $3; + } + if ($line =~ /R13: ([0-9a-f]+) R14: ([0-9a-f]+) R15: ([0-9a-f]+)/) { + $regs{"%r13"} = $1; + $regs{"%r14"} = $2; + $regs{"%r15"} = $3; + } +} + +sub reg_name +{ + my ($reg) = @_; + $reg =~ s/r(.)x/e\1x/; + $reg =~ s/r(.)i/e\1i/; + $reg =~ s/r(.)p/e\1p/; + return $reg; +} + +sub process_x86_regs +{ + my ($line, $cntr) = @_; + my $str = ""; + if (length($line) < 40) { + return ""; # not an asm istruction + } + + # find the arguments to the instruction + if ($line =~ /([0-9a-zA-Z\,\%\(\)\-\+]+)$/) { + $lastword = $1; + } else { + return ""; + } + + # we need to find the registers that get clobbered, + # since their value is no longer relevant for previous + # instructions in the stream. + + $clobber = $lastword; + # first, remove all memory operands, they're read only + $clobber =~ s/\([a-z0-9\%\,]+\)//g; + # then, remove everything before the comma, thats the read part + $clobber =~ s/.*\,//g; + + # if this is the instruction that faulted, we haven't actually done + # the write yet... nothing is clobbered. + if ($cntr == 0) { + $clobber = ""; + } + + foreach $reg (keys(%regs)) { + my $clobberprime = reg_name($clobber); + my $lastwordprime = reg_name($lastword); + my $val = $regs{$reg}; + if ($val =~ /^[0]+$/) { + $val = "0"; + } else { + $val =~ s/^0*//; + } + + # first check if we're clobbering this register; if we do + # we print it with a =>, and then delete its value + if ($clobber =~ /$reg/ || $clobberprime =~ /$reg/) { + if (length($val) > 0) { + $str = $str . " $reg => $val "; + } + $regs{$reg} = ""; + $val = ""; + } + # now check if we're reading this register + if ($lastword =~ /$reg/ || $lastwordprime =~ /$reg/) { + if (length($val) > 0) { + $str = $str . " $reg = $val "; + } + } + } + return $str; +} + +# parse the oops +while (<STDIN>) { + my $line = $_; + if ($line =~ /EIP: 0060:\[\<([a-z0-9]+)\>\]/) { + $target = $1; + } + if ($line =~ /RIP: 0010:\[\<([a-z0-9]+)\>\]/) { + $target = $1; + } + if ($line =~ /EIP is at ([a-zA-Z0-9\_]+)\+0x([0-9a-f]+)\/0x[a-f0-9]/) { + $function = $1; + $func_offset = $2; + } + if ($line =~ /RIP: 0010:\[\<[0-9a-f]+\>\] \[\<[0-9a-f]+\>\] ([a-zA-Z0-9\_]+)\+0x([0-9a-f]+)\/0x[a-f0-9]/) { + $function = $1; + $func_offset = $2; + } + + # check if it's a module + if ($line =~ /EIP is at ([a-zA-Z0-9\_]+)\+(0x[0-9a-f]+)\/0x[a-f0-9]+\W\[([a-zA-Z0-9\_\-]+)\]/) { + $module = $3; + } + if ($line =~ /RIP: 0010:\[\<[0-9a-f]+\>\] \[\<[0-9a-f]+\>\] ([a-zA-Z0-9\_]+)\+(0x[0-9a-f]+)\/0x[a-f0-9]+\W\[([a-zA-Z0-9\_\-]+)\]/) { + $module = $3; + } + parse_x86_regs($line); +} + +my $decodestart = Math::BigInt->from_hex("0x$target") - Math::BigInt->from_hex("0x$func_offset"); +my $decodestop = Math::BigInt->from_hex("0x$target") + 8192; +if ($target eq "0") { + print "No oops found!\n"; + usage(); +} + +# if it's a module, we need to find the .ko file and calculate a load offset +if ($module ne "") { + if ($modulefile eq "") { + $modulefile = `modinfo -F filename $module`; + chomp($modulefile); + } + $filename = $modulefile; + if ($filename eq "") { + print "Module .ko file for $module not found. Aborting\n"; + exit; + } + # ok so we found the module, now we need to calculate the vma offset + open(FILE, $cross_compile."objdump -dS $filename |") || die "Cannot start objdump"; + while (<FILE>) { + if ($_ =~ /^([0-9a-f]+) \<$function\>\:/) { + my $fu = $1; + $vmaoffset = Math::BigInt->from_hex("0x$target") - Math::BigInt->from_hex("0x$fu") - Math::BigInt->from_hex("0x$func_offset"); + } + } + close(FILE); +} + +my $counter = 0; +my $state = 0; +my $center = -1; +my @lines; +my @reglines; + +sub InRange { + my ($address, $target) = @_; + my $ad = "0x".$address; + my $ta = "0x".$target; + my $delta = Math::BigInt->from_hex($ad) - Math::BigInt->from_hex($ta); + + if (($delta > -4096) && ($delta < 4096)) { + return 1; + } + return 0; +} + + + +# first, parse the input into the lines array, but to keep size down, +# we only do this for 4Kb around the sweet spot + +open(FILE, $cross_compile."objdump -dS --adjust-vma=$vmaoffset --start-address=$decodestart --stop-address=$decodestop $filename |") || die "Cannot start objdump"; + +while (<FILE>) { + my $line = $_; + chomp($line); + if ($state == 0) { + if ($line =~ /^([a-f0-9]+)\:/) { + if (InRange($1, $target)) { + $state = 1; + } + } + } + if ($state == 1) { + if ($line =~ /^([a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]+)\:/) { + my $val = $1; + if (!InRange($val, $target)) { + last; + } + if ($val eq $target) { + $center = $counter; + } + } + $lines[$counter] = $line; + + $counter = $counter + 1; + } +} + +close(FILE); + +if ($counter == 0) { + print "No matching code found \n"; + exit; +} + +if ($center == -1) { + print "No matching code found \n"; + exit; +} + +my $start; +my $finish; +my $codelines = 0; +my $binarylines = 0; +# now we go up and down in the array to find how much we want to print + +$start = $center; + +while ($start > 1) { + $start = $start - 1; + my $line = $lines[$start]; + if ($line =~ /^([a-f0-9]+)\:/) { + $binarylines = $binarylines + 1; + } else { + $codelines = $codelines + 1; + } + if ($codelines > 10) { + last; + } + if ($binarylines > 20) { + last; + } +} + + +$finish = $center; +$codelines = 0; +$binarylines = 0; +while ($finish < $counter) { + $finish = $finish + 1; + my $line = $lines[$finish]; + if ($line =~ /^([a-f0-9]+)\:/) { + $binarylines = $binarylines + 1; + } else { + $codelines = $codelines + 1; + } + if ($codelines > 10) { + last; + } + if ($binarylines > 20) { + last; + } +} + + +my $i; + + +# start annotating the registers in the asm. +# this goes from the oopsing point back, so that the annotator +# can track (opportunistically) which registers got written and +# whos value no longer is relevant. + +$i = $center; +while ($i >= $start) { + $reglines[$i] = process_x86_regs($lines[$i], $center - $i); + $i = $i - 1; +} + +$i = $start; +while ($i < $finish) { + my $line; + if ($i == $center) { + $line = "*$lines[$i] "; + } else { + $line = " $lines[$i] "; + } + print $line; + if (defined($reglines[$i]) && length($reglines[$i]) > 0) { + my $c = 60 - length($line); + while ($c > 0) { print " "; $c = $c - 1; }; + print "| $reglines[$i]"; + } + if ($i == $center) { + print "<--- faulting instruction"; + } + print "\n"; + $i = $i +1; +} + +sub usage { + print <<EOT; +Usage: + dmesg | perl $0 [OPTION] [VMLINUX] + +OPTION: + -c, --cross-compile CROSS_COMPILE Specify the prefix used for toolchain. + -m, --module MODULE_DIRNAME Specify the module filename. + -h, --help Help. +EOT + exit; +} diff --git a/src/net/scripts/mkcompile_h b/src/net/scripts/mkcompile_h new file mode 100755 index 0000000..a72b154 --- /dev/null +++ b/src/net/scripts/mkcompile_h @@ -0,0 +1,96 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 + +TARGET=$1 +ARCH=$2 +SMP=$3 +PREEMPT=$4 +PREEMPT_RT=$5 +CC_VERSION="$6" +LD=$7 + +vecho() { [ "${quiet}" = "silent_" ] || echo "$@" ; } + +# Do not expand names +set -f + +# Fix the language to get consistent output +LC_ALL=C +export LC_ALL + +if [ -z "$KBUILD_BUILD_VERSION" ]; then + VERSION=$(cat .version 2>/dev/null || echo 1) +else + VERSION=$KBUILD_BUILD_VERSION +fi + +if [ -z "$KBUILD_BUILD_TIMESTAMP" ]; then + TIMESTAMP=`date` +else + TIMESTAMP=$KBUILD_BUILD_TIMESTAMP +fi +if test -z "$KBUILD_BUILD_USER"; then + LINUX_COMPILE_BY=$(whoami | sed 's/\\/\\\\/') +else + LINUX_COMPILE_BY=$KBUILD_BUILD_USER +fi +if test -z "$KBUILD_BUILD_HOST"; then + LINUX_COMPILE_HOST=`uname -n` +else + LINUX_COMPILE_HOST=$KBUILD_BUILD_HOST +fi + +UTS_VERSION="#$VERSION" +CONFIG_FLAGS="" +if [ -n "$SMP" ] ; then CONFIG_FLAGS="SMP"; fi +if [ -n "$PREEMPT" ] ; then CONFIG_FLAGS="$CONFIG_FLAGS PREEMPT"; fi +if [ -n "$PREEMPT_RT" ] ; then CONFIG_FLAGS="$CONFIG_FLAGS PREEMPT_RT"; fi + +# Truncate to maximum length +UTS_LEN=64 +UTS_VERSION="$(echo $UTS_VERSION $CONFIG_FLAGS $TIMESTAMP | cut -b -$UTS_LEN)" + +# Generate a temporary compile.h + +{ echo /\* This file is auto generated, version $VERSION \*/ + if [ -n "$CONFIG_FLAGS" ] ; then echo "/* $CONFIG_FLAGS */"; fi + + echo \#define UTS_MACHINE \"$ARCH\" + + echo \#define UTS_VERSION \"$UTS_VERSION\" + + printf '#define LINUX_COMPILE_BY "%s"\n' "$LINUX_COMPILE_BY" + echo \#define LINUX_COMPILE_HOST \"$LINUX_COMPILE_HOST\" + + LD_VERSION=$($LD -v | head -n1 | sed 's/(compatible with [^)]*)//' \ + | sed 's/[[:space:]]*$//') + printf '#define LINUX_COMPILER "%s"\n' "$CC_VERSION, $LD_VERSION" +} > .tmpcompile + +# Only replace the real compile.h if the new one is different, +# in order to preserve the timestamp and avoid unnecessary +# recompilations. +# We don't consider the file changed if only the date/time changed, +# unless KBUILD_BUILD_TIMESTAMP was explicitly set (e.g. for +# reproducible builds with that value referring to a commit timestamp). +# A kernel config change will increase the generation number, thus +# causing compile.h to be updated (including date/time) due to the +# changed comment in the +# first line. + +if [ -z "$KBUILD_BUILD_TIMESTAMP" ]; then + IGNORE_PATTERN="UTS_VERSION" +else + IGNORE_PATTERN="NOT_A_PATTERN_TO_BE_MATCHED" +fi + +if [ -r $TARGET ] && \ + grep -v $IGNORE_PATTERN $TARGET > .tmpver.1 && \ + grep -v $IGNORE_PATTERN .tmpcompile > .tmpver.2 && \ + cmp -s .tmpver.1 .tmpver.2; then + rm -f .tmpcompile +else + vecho " UPD $TARGET" + mv -f .tmpcompile $TARGET +fi +rm -f .tmpver.1 .tmpver.2 diff --git a/src/net/scripts/mkmakefile b/src/net/scripts/mkmakefile new file mode 100755 index 0000000..1cb1747 --- /dev/null +++ b/src/net/scripts/mkmakefile @@ -0,0 +1,17 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# Generates a small Makefile used in the root of the output +# directory, to allow make to be started from there. +# The Makefile also allow for more convinient build of external modules + +# Usage +# $1 - Kernel src directory + +if [ "${quiet}" != "silent_" ]; then + echo " GEN Makefile" +fi + +cat << EOF > Makefile +# Automatically generated by $0: don't edit +include $1/Makefile +EOF diff --git a/src/net/scripts/mksysmap b/src/net/scripts/mksysmap new file mode 100755 index 0000000..9aa23d1 --- /dev/null +++ b/src/net/scripts/mksysmap @@ -0,0 +1,44 @@ +#!/bin/sh -x +# Based on the vmlinux file create the System.map file +# System.map is used by module-init tools and some debugging +# tools to retrieve the actual addresses of symbols in the kernel. +# +# Usage +# mksysmap vmlinux System.map + + +##### +# Generate System.map (actual filename passed as second argument) + +# $NM produces the following output: +# f0081e80 T alloc_vfsmnt + +# The second row specify the type of the symbol: +# A = Absolute +# B = Uninitialised data (.bss) +# C = Common symbol +# D = Initialised data +# G = Initialised data for small objects +# I = Indirect reference to another symbol +# N = Debugging symbol +# R = Read only +# S = Uninitialised data for small objects +# T = Text code symbol +# U = Undefined symbol +# V = Weak symbol +# W = Weak symbol +# Corresponding small letters are local symbols + +# For System.map filter away: +# a - local absolute symbols +# U - undefined global symbols +# N - debugging symbols +# w - local weak symbols + +# readprofile starts reading symbols when _stext is found, and +# continue until it finds a symbol which is not either of 'T', 't', +# 'W' or 'w'. __crc_ are 'A' and placed in the middle +# so we just ignore them to let readprofile continue to work. +# (At least sparc64 has __crc_ in the middle). + +$NM -n $1 | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)\|\( \.L\)' > $2 diff --git a/src/net/scripts/mkuboot.sh b/src/net/scripts/mkuboot.sh new file mode 100755 index 0000000..4b1fe09 --- /dev/null +++ b/src/net/scripts/mkuboot.sh @@ -0,0 +1,20 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +# +# Build U-Boot image when `mkimage' tool is available. +# + +MKIMAGE=$(type -path "${CROSS_COMPILE}mkimage") + +if [ -z "${MKIMAGE}" ]; then + MKIMAGE=$(type -path mkimage) + if [ -z "${MKIMAGE}" ]; then + # Doesn't exist + echo '"mkimage" command not found - U-Boot images will not be built' >&2 + exit 1; + fi +fi + +# Call "mkimage" to create U-Boot image +${MKIMAGE} "$@" diff --git a/src/net/scripts/mod/.gitignore b/src/net/scripts/mod/.gitignore new file mode 100644 index 0000000..07e4a39 --- /dev/null +++ b/src/net/scripts/mod/.gitignore @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0-only +elfconfig.h +mk_elfconfig +modpost +devicetable-offsets.h diff --git a/src/net/scripts/mod/Makefile b/src/net/scripts/mod/Makefile new file mode 100644 index 0000000..7807168 --- /dev/null +++ b/src/net/scripts/mod/Makefile @@ -0,0 +1,27 @@ +# SPDX-License-Identifier: GPL-2.0 +OBJECT_FILES_NON_STANDARD := y + +hostprogs-always-y += modpost mk_elfconfig +always-y += empty.o + +modpost-objs := modpost.o file2alias.o sumversion.o + +devicetable-offsets-file := devicetable-offsets.h + +$(obj)/$(devicetable-offsets-file): $(obj)/devicetable-offsets.s FORCE + $(call filechk,offsets,__DEVICETABLE_OFFSETS_H__) + +targets += $(devicetable-offsets-file) devicetable-offsets.s + +# dependencies on generated files need to be listed explicitly + +$(obj)/modpost.o $(obj)/file2alias.o $(obj)/sumversion.o: $(obj)/elfconfig.h +$(obj)/file2alias.o: $(obj)/$(devicetable-offsets-file) + +quiet_cmd_elfconfig = MKELF $@ + cmd_elfconfig = $(obj)/mk_elfconfig < $< > $@ + +$(obj)/elfconfig.h: $(obj)/empty.o $(obj)/mk_elfconfig FORCE + $(call if_changed,elfconfig) + +targets += elfconfig.h diff --git a/src/net/scripts/mod/devicetable-offsets.c b/src/net/scripts/mod/devicetable-offsets.c new file mode 100644 index 0000000..e377f52 --- /dev/null +++ b/src/net/scripts/mod/devicetable-offsets.c @@ -0,0 +1,250 @@ +// SPDX-License-Identifier: GPL-2.0 +#include <linux/kbuild.h> +#include <linux/mod_devicetable.h> + +#define DEVID(devid) DEFINE(SIZE_##devid, sizeof(struct devid)) +#define DEVID_FIELD(devid, field) \ + DEFINE(OFF_##devid##_##field, offsetof(struct devid, field)) + +int main(void) +{ + DEVID(usb_device_id); + DEVID_FIELD(usb_device_id, match_flags); + DEVID_FIELD(usb_device_id, idVendor); + DEVID_FIELD(usb_device_id, idProduct); + DEVID_FIELD(usb_device_id, bcdDevice_lo); + DEVID_FIELD(usb_device_id, bcdDevice_hi); + DEVID_FIELD(usb_device_id, bDeviceClass); + DEVID_FIELD(usb_device_id, bDeviceSubClass); + DEVID_FIELD(usb_device_id, bDeviceProtocol); + DEVID_FIELD(usb_device_id, bInterfaceClass); + DEVID_FIELD(usb_device_id, bInterfaceSubClass); + DEVID_FIELD(usb_device_id, bInterfaceProtocol); + DEVID_FIELD(usb_device_id, bInterfaceNumber); + + DEVID(hid_device_id); + DEVID_FIELD(hid_device_id, bus); + DEVID_FIELD(hid_device_id, group); + DEVID_FIELD(hid_device_id, vendor); + DEVID_FIELD(hid_device_id, product); + + DEVID(ieee1394_device_id); + DEVID_FIELD(ieee1394_device_id, match_flags); + DEVID_FIELD(ieee1394_device_id, vendor_id); + DEVID_FIELD(ieee1394_device_id, model_id); + DEVID_FIELD(ieee1394_device_id, specifier_id); + DEVID_FIELD(ieee1394_device_id, version); + + DEVID(pci_device_id); + DEVID_FIELD(pci_device_id, vendor); + DEVID_FIELD(pci_device_id, device); + DEVID_FIELD(pci_device_id, subvendor); + DEVID_FIELD(pci_device_id, subdevice); + DEVID_FIELD(pci_device_id, class); + DEVID_FIELD(pci_device_id, class_mask); + + DEVID(ccw_device_id); + DEVID_FIELD(ccw_device_id, match_flags); + DEVID_FIELD(ccw_device_id, cu_type); + DEVID_FIELD(ccw_device_id, cu_model); + DEVID_FIELD(ccw_device_id, dev_type); + DEVID_FIELD(ccw_device_id, dev_model); + + DEVID(ap_device_id); + DEVID_FIELD(ap_device_id, dev_type); + + DEVID(css_device_id); + DEVID_FIELD(css_device_id, type); + + DEVID(serio_device_id); + DEVID_FIELD(serio_device_id, type); + DEVID_FIELD(serio_device_id, proto); + DEVID_FIELD(serio_device_id, id); + DEVID_FIELD(serio_device_id, extra); + + DEVID(acpi_device_id); + DEVID_FIELD(acpi_device_id, id); + DEVID_FIELD(acpi_device_id, cls); + DEVID_FIELD(acpi_device_id, cls_msk); + + DEVID(pnp_device_id); + DEVID_FIELD(pnp_device_id, id); + + DEVID(pnp_card_device_id); + DEVID_FIELD(pnp_card_device_id, devs); + + DEVID(pcmcia_device_id); + DEVID_FIELD(pcmcia_device_id, match_flags); + DEVID_FIELD(pcmcia_device_id, manf_id); + DEVID_FIELD(pcmcia_device_id, card_id); + DEVID_FIELD(pcmcia_device_id, func_id); + DEVID_FIELD(pcmcia_device_id, function); + DEVID_FIELD(pcmcia_device_id, device_no); + DEVID_FIELD(pcmcia_device_id, prod_id_hash); + + DEVID(of_device_id); + DEVID_FIELD(of_device_id, name); + DEVID_FIELD(of_device_id, type); + DEVID_FIELD(of_device_id, compatible); + + DEVID(vio_device_id); + DEVID_FIELD(vio_device_id, type); + DEVID_FIELD(vio_device_id, compat); + + DEVID(input_device_id); + DEVID_FIELD(input_device_id, flags); + DEVID_FIELD(input_device_id, bustype); + DEVID_FIELD(input_device_id, vendor); + DEVID_FIELD(input_device_id, product); + DEVID_FIELD(input_device_id, version); + DEVID_FIELD(input_device_id, evbit); + DEVID_FIELD(input_device_id, keybit); + DEVID_FIELD(input_device_id, relbit); + DEVID_FIELD(input_device_id, absbit); + DEVID_FIELD(input_device_id, mscbit); + DEVID_FIELD(input_device_id, ledbit); + DEVID_FIELD(input_device_id, sndbit); + DEVID_FIELD(input_device_id, ffbit); + DEVID_FIELD(input_device_id, swbit); + + DEVID(eisa_device_id); + DEVID_FIELD(eisa_device_id, sig); + + DEVID(parisc_device_id); + DEVID_FIELD(parisc_device_id, hw_type); + DEVID_FIELD(parisc_device_id, hversion); + DEVID_FIELD(parisc_device_id, hversion_rev); + DEVID_FIELD(parisc_device_id, sversion); + + DEVID(sdio_device_id); + DEVID_FIELD(sdio_device_id, class); + DEVID_FIELD(sdio_device_id, vendor); + DEVID_FIELD(sdio_device_id, device); + + DEVID(ssb_device_id); + DEVID_FIELD(ssb_device_id, vendor); + DEVID_FIELD(ssb_device_id, coreid); + DEVID_FIELD(ssb_device_id, revision); + + DEVID(bcma_device_id); + DEVID_FIELD(bcma_device_id, manuf); + DEVID_FIELD(bcma_device_id, id); + DEVID_FIELD(bcma_device_id, rev); + DEVID_FIELD(bcma_device_id, class); + + DEVID(virtio_device_id); + DEVID_FIELD(virtio_device_id, device); + DEVID_FIELD(virtio_device_id, vendor); + + DEVID(hv_vmbus_device_id); + DEVID_FIELD(hv_vmbus_device_id, guid); + + DEVID(rpmsg_device_id); + DEVID_FIELD(rpmsg_device_id, name); + + DEVID(i2c_device_id); + DEVID_FIELD(i2c_device_id, name); + + DEVID(i3c_device_id); + DEVID_FIELD(i3c_device_id, match_flags); + DEVID_FIELD(i3c_device_id, dcr); + DEVID_FIELD(i3c_device_id, manuf_id); + DEVID_FIELD(i3c_device_id, part_id); + DEVID_FIELD(i3c_device_id, extra_info); + + DEVID(spi_device_id); + DEVID_FIELD(spi_device_id, name); + + DEVID(dmi_system_id); + DEVID_FIELD(dmi_system_id, matches); + + DEVID(platform_device_id); + DEVID_FIELD(platform_device_id, name); + + DEVID(mdio_device_id); + DEVID_FIELD(mdio_device_id, phy_id); + DEVID_FIELD(mdio_device_id, phy_id_mask); + + DEVID(zorro_device_id); + DEVID_FIELD(zorro_device_id, id); + + DEVID(isapnp_device_id); + DEVID_FIELD(isapnp_device_id, vendor); + DEVID_FIELD(isapnp_device_id, function); + + DEVID(ipack_device_id); + DEVID_FIELD(ipack_device_id, format); + DEVID_FIELD(ipack_device_id, vendor); + DEVID_FIELD(ipack_device_id, device); + + DEVID(amba_id); + DEVID_FIELD(amba_id, id); + DEVID_FIELD(amba_id, mask); + + DEVID(mips_cdmm_device_id); + DEVID_FIELD(mips_cdmm_device_id, type); + + DEVID(x86_cpu_id); + DEVID_FIELD(x86_cpu_id, feature); + DEVID_FIELD(x86_cpu_id, family); + DEVID_FIELD(x86_cpu_id, model); + DEVID_FIELD(x86_cpu_id, vendor); + + DEVID(cpu_feature); + DEVID_FIELD(cpu_feature, feature); + + DEVID(mei_cl_device_id); + DEVID_FIELD(mei_cl_device_id, name); + DEVID_FIELD(mei_cl_device_id, uuid); + DEVID_FIELD(mei_cl_device_id, version); + + DEVID(rio_device_id); + DEVID_FIELD(rio_device_id, did); + DEVID_FIELD(rio_device_id, vid); + DEVID_FIELD(rio_device_id, asm_did); + DEVID_FIELD(rio_device_id, asm_vid); + + DEVID(ulpi_device_id); + DEVID_FIELD(ulpi_device_id, vendor); + DEVID_FIELD(ulpi_device_id, product); + + DEVID(hda_device_id); + DEVID_FIELD(hda_device_id, vendor_id); + DEVID_FIELD(hda_device_id, rev_id); + DEVID_FIELD(hda_device_id, api_version); + + DEVID(sdw_device_id); + DEVID_FIELD(sdw_device_id, mfg_id); + DEVID_FIELD(sdw_device_id, part_id); + DEVID_FIELD(sdw_device_id, sdw_version); + DEVID_FIELD(sdw_device_id, class_id); + + DEVID(fsl_mc_device_id); + DEVID_FIELD(fsl_mc_device_id, vendor); + DEVID_FIELD(fsl_mc_device_id, obj_type); + + DEVID(tb_service_id); + DEVID_FIELD(tb_service_id, match_flags); + DEVID_FIELD(tb_service_id, protocol_key); + DEVID_FIELD(tb_service_id, protocol_id); + DEVID_FIELD(tb_service_id, protocol_version); + DEVID_FIELD(tb_service_id, protocol_revision); + + DEVID(typec_device_id); + DEVID_FIELD(typec_device_id, svid); + DEVID_FIELD(typec_device_id, mode); + + DEVID(tee_client_device_id); + DEVID_FIELD(tee_client_device_id, uuid); + + DEVID(wmi_device_id); + DEVID_FIELD(wmi_device_id, guid_string); + + DEVID(mhi_device_id); + DEVID_FIELD(mhi_device_id, chan); + + DEVID(auxiliary_device_id); + DEVID_FIELD(auxiliary_device_id, name); + + return 0; +} diff --git a/src/net/scripts/mod/empty.c b/src/net/scripts/mod/empty.c new file mode 100644 index 0000000..49839cc --- /dev/null +++ b/src/net/scripts/mod/empty.c @@ -0,0 +1 @@ +/* empty file to figure out endianness / word size */ diff --git a/src/net/scripts/mod/file2alias.c b/src/net/scripts/mod/file2alias.c new file mode 100644 index 0000000..814204a --- /dev/null +++ b/src/net/scripts/mod/file2alias.c @@ -0,0 +1,1530 @@ +/* Simple code to turn various tables in an ELF file into alias definitions. + * This deals with kernel datastructures where they should be + * dealt with: in the kernel source. + * + * Copyright 2002-2003 Rusty Russell, IBM Corporation + * 2003 Kai Germaschewski + * + * + * This software may be used and distributed according to the terms + * of the GNU General Public License, incorporated herein by reference. + */ + +#include "modpost.h" +#include "devicetable-offsets.h" + +/* We use the ELF typedefs for kernel_ulong_t but bite the bullet and + * use either stdint.h or inttypes.h for the rest. */ +#if KERNEL_ELFCLASS == ELFCLASS32 +typedef Elf32_Addr kernel_ulong_t; +#define BITS_PER_LONG 32 +#else +typedef Elf64_Addr kernel_ulong_t; +#define BITS_PER_LONG 64 +#endif +#ifdef __sun__ +#include <inttypes.h> +#else +#include <stdint.h> +#endif + +#include <ctype.h> +#include <stdbool.h> + +typedef uint32_t __u32; +typedef uint16_t __u16; +typedef unsigned char __u8; +typedef struct { + __u8 b[16]; +} guid_t; + +/* backwards compatibility, don't use in new code */ +typedef struct { + __u8 b[16]; +} uuid_le; +typedef struct { + __u8 b[16]; +} uuid_t; +#define UUID_STRING_LEN 36 + +/* Big exception to the "don't include kernel headers into userspace, which + * even potentially has different endianness and word sizes, since + * we handle those differences explicitly below */ +#include "../../include/linux/mod_devicetable.h" + +/* This array collects all instances that use the generic do_table */ +struct devtable { + const char *device_id; /* name of table, __mod_<name>__*_device_table. */ + unsigned long id_size; + int (*do_entry)(const char *filename, void *symval, char *alias); +}; + +/* Size of alias provided to do_entry functions */ +#define ALIAS_SIZE 500 + +/* Define a variable f that holds the value of field f of struct devid + * based at address m. + */ +#define DEF_FIELD(m, devid, f) \ + typeof(((struct devid *)0)->f) f = TO_NATIVE(*(typeof(f) *)((m) + OFF_##devid##_##f)) + +/* Define a variable v that holds the address of field f of struct devid + * based at address m. Due to the way typeof works, for a field of type + * T[N] the variable has type T(*)[N], _not_ T*. + */ +#define DEF_FIELD_ADDR_VAR(m, devid, f, v) \ + typeof(((struct devid *)0)->f) *v = ((m) + OFF_##devid##_##f) + +/* Define a variable f that holds the address of field f of struct devid + * based at address m. Due to the way typeof works, for a field of type + * T[N] the variable has type T(*)[N], _not_ T*. + */ +#define DEF_FIELD_ADDR(m, devid, f) \ + DEF_FIELD_ADDR_VAR(m, devid, f, f) + +#define ADD(str, sep, cond, field) \ +do { \ + strcat(str, sep); \ + if (cond) \ + sprintf(str + strlen(str), \ + sizeof(field) == 1 ? "%02X" : \ + sizeof(field) == 2 ? "%04X" : \ + sizeof(field) == 4 ? "%08X" : "", \ + field); \ + else \ + sprintf(str + strlen(str), "*"); \ +} while(0) + +/* End in a wildcard, for future extension */ +static inline void add_wildcard(char *str) +{ + int len = strlen(str); + + if (str[len - 1] != '*') + strcat(str + len, "*"); +} + +static inline void add_uuid(char *str, uuid_le uuid) +{ + int len = strlen(str); + + sprintf(str + len, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", + uuid.b[3], uuid.b[2], uuid.b[1], uuid.b[0], + uuid.b[5], uuid.b[4], uuid.b[7], uuid.b[6], + uuid.b[8], uuid.b[9], uuid.b[10], uuid.b[11], + uuid.b[12], uuid.b[13], uuid.b[14], uuid.b[15]); +} + +/** + * Check that sizeof(device_id type) are consistent with size of section + * in .o file. If in-consistent then userspace and kernel does not agree + * on actual size which is a bug. + * Also verify that the final entry in the table is all zeros. + * Ignore both checks if build host differ from target host and size differs. + **/ +static void device_id_check(const char *modname, const char *device_id, + unsigned long size, unsigned long id_size, + void *symval) +{ + int i; + + if (size % id_size || size < id_size) { + fatal("%s: sizeof(struct %s_device_id)=%lu is not a modulo " + "of the size of " + "section __mod_%s__<identifier>_device_table=%lu.\n" + "Fix definition of struct %s_device_id " + "in mod_devicetable.h\n", + modname, device_id, id_size, device_id, size, device_id); + } + /* Verify last one is a terminator */ + for (i = 0; i < id_size; i++ ) { + if (*(uint8_t*)(symval+size-id_size+i)) { + fprintf(stderr,"%s: struct %s_device_id is %lu bytes. " + "The last of %lu is:\n", + modname, device_id, id_size, size / id_size); + for (i = 0; i < id_size; i++ ) + fprintf(stderr,"0x%02x ", + *(uint8_t*)(symval+size-id_size+i) ); + fprintf(stderr,"\n"); + fatal("%s: struct %s_device_id is not terminated " + "with a NULL entry!\n", modname, device_id); + } + } +} + +/* USB is special because the bcdDevice can be matched against a numeric range */ +/* Looks like "usb:vNpNdNdcNdscNdpNicNiscNipNinN" */ +static void do_usb_entry(void *symval, + unsigned int bcdDevice_initial, int bcdDevice_initial_digits, + unsigned char range_lo, unsigned char range_hi, + unsigned char max, struct module *mod) +{ + char alias[500]; + DEF_FIELD(symval, usb_device_id, match_flags); + DEF_FIELD(symval, usb_device_id, idVendor); + DEF_FIELD(symval, usb_device_id, idProduct); + DEF_FIELD(symval, usb_device_id, bcdDevice_lo); + DEF_FIELD(symval, usb_device_id, bDeviceClass); + DEF_FIELD(symval, usb_device_id, bDeviceSubClass); + DEF_FIELD(symval, usb_device_id, bDeviceProtocol); + DEF_FIELD(symval, usb_device_id, bInterfaceClass); + DEF_FIELD(symval, usb_device_id, bInterfaceSubClass); + DEF_FIELD(symval, usb_device_id, bInterfaceProtocol); + DEF_FIELD(symval, usb_device_id, bInterfaceNumber); + + strcpy(alias, "usb:"); + ADD(alias, "v", match_flags&USB_DEVICE_ID_MATCH_VENDOR, + idVendor); + ADD(alias, "p", match_flags&USB_DEVICE_ID_MATCH_PRODUCT, + idProduct); + + strcat(alias, "d"); + if (bcdDevice_initial_digits) + sprintf(alias + strlen(alias), "%0*X", + bcdDevice_initial_digits, bcdDevice_initial); + if (range_lo == range_hi) + sprintf(alias + strlen(alias), "%X", range_lo); + else if (range_lo > 0 || range_hi < max) { + if (range_lo > 0x9 || range_hi < 0xA) + sprintf(alias + strlen(alias), + "[%X-%X]", + range_lo, + range_hi); + else { + sprintf(alias + strlen(alias), + range_lo < 0x9 ? "[%X-9" : "[%X", + range_lo); + sprintf(alias + strlen(alias), + range_hi > 0xA ? "A-%X]" : "%X]", + range_hi); + } + } + if (bcdDevice_initial_digits < (sizeof(bcdDevice_lo) * 2 - 1)) + strcat(alias, "*"); + + ADD(alias, "dc", match_flags&USB_DEVICE_ID_MATCH_DEV_CLASS, + bDeviceClass); + ADD(alias, "dsc", match_flags&USB_DEVICE_ID_MATCH_DEV_SUBCLASS, + bDeviceSubClass); + ADD(alias, "dp", match_flags&USB_DEVICE_ID_MATCH_DEV_PROTOCOL, + bDeviceProtocol); + ADD(alias, "ic", match_flags&USB_DEVICE_ID_MATCH_INT_CLASS, + bInterfaceClass); + ADD(alias, "isc", match_flags&USB_DEVICE_ID_MATCH_INT_SUBCLASS, + bInterfaceSubClass); + ADD(alias, "ip", match_flags&USB_DEVICE_ID_MATCH_INT_PROTOCOL, + bInterfaceProtocol); + ADD(alias, "in", match_flags&USB_DEVICE_ID_MATCH_INT_NUMBER, + bInterfaceNumber); + + add_wildcard(alias); + buf_printf(&mod->dev_table_buf, + "MODULE_ALIAS(\"%s\");\n", alias); +} + +/* Handles increment/decrement of BCD formatted integers */ +/* Returns the previous value, so it works like i++ or i-- */ +static unsigned int incbcd(unsigned int *bcd, + int inc, + unsigned char max, + size_t chars) +{ + unsigned int init = *bcd, i, j; + unsigned long long c, dec = 0; + + /* If bcd is not in BCD format, just increment */ + if (max > 0x9) { + *bcd += inc; + return init; + } + + /* Convert BCD to Decimal */ + for (i=0 ; i < chars ; i++) { + c = (*bcd >> (i << 2)) & 0xf; + c = c > 9 ? 9 : c; /* force to bcd just in case */ + for (j=0 ; j < i ; j++) + c = c * 10; + dec += c; + } + + /* Do our increment/decrement */ + dec += inc; + *bcd = 0; + + /* Convert back to BCD */ + for (i=0 ; i < chars ; i++) { + for (c=1,j=0 ; j < i ; j++) + c = c * 10; + c = (dec / c) % 10; + *bcd += c << (i << 2); + } + return init; +} + +static void do_usb_entry_multi(void *symval, struct module *mod) +{ + unsigned int devlo, devhi; + unsigned char chi, clo, max; + int ndigits; + + DEF_FIELD(symval, usb_device_id, match_flags); + DEF_FIELD(symval, usb_device_id, idVendor); + DEF_FIELD(symval, usb_device_id, idProduct); + DEF_FIELD(symval, usb_device_id, bcdDevice_lo); + DEF_FIELD(symval, usb_device_id, bcdDevice_hi); + DEF_FIELD(symval, usb_device_id, bDeviceClass); + DEF_FIELD(symval, usb_device_id, bInterfaceClass); + + devlo = match_flags & USB_DEVICE_ID_MATCH_DEV_LO ? + bcdDevice_lo : 0x0U; + devhi = match_flags & USB_DEVICE_ID_MATCH_DEV_HI ? + bcdDevice_hi : ~0x0U; + + /* Figure out if this entry is in bcd or hex format */ + max = 0x9; /* Default to decimal format */ + for (ndigits = 0 ; ndigits < sizeof(bcdDevice_lo) * 2 ; ndigits++) { + clo = (devlo >> (ndigits << 2)) & 0xf; + chi = ((devhi > 0x9999 ? 0x9999 : devhi) >> (ndigits << 2)) & 0xf; + if (clo > max || chi > max) { + max = 0xf; + break; + } + } + + /* + * Some modules (visor) have empty slots as placeholder for + * run-time specification that results in catch-all alias + */ + if (!(idVendor | idProduct | bDeviceClass | bInterfaceClass)) + return; + + /* Convert numeric bcdDevice range into fnmatch-able pattern(s) */ + for (ndigits = sizeof(bcdDevice_lo) * 2 - 1; devlo <= devhi; ndigits--) { + clo = devlo & 0xf; + chi = devhi & 0xf; + if (chi > max) /* If we are in bcd mode, truncate if necessary */ + chi = max; + devlo >>= 4; + devhi >>= 4; + + if (devlo == devhi || !ndigits) { + do_usb_entry(symval, devlo, ndigits, clo, chi, max, mod); + break; + } + + if (clo > 0x0) + do_usb_entry(symval, + incbcd(&devlo, 1, max, + sizeof(bcdDevice_lo) * 2), + ndigits, clo, max, max, mod); + + if (chi < max) + do_usb_entry(symval, + incbcd(&devhi, -1, max, + sizeof(bcdDevice_lo) * 2), + ndigits, 0x0, chi, max, mod); + } +} + +static void do_usb_table(void *symval, unsigned long size, + struct module *mod) +{ + unsigned int i; + const unsigned long id_size = SIZE_usb_device_id; + + device_id_check(mod->name, "usb", size, id_size, symval); + + /* Leave last one: it's the terminator. */ + size -= id_size; + + for (i = 0; i < size; i += id_size) + do_usb_entry_multi(symval + i, mod); +} + +static void do_of_entry_multi(void *symval, struct module *mod) +{ + char alias[500]; + int len; + char *tmp; + + DEF_FIELD_ADDR(symval, of_device_id, name); + DEF_FIELD_ADDR(symval, of_device_id, type); + DEF_FIELD_ADDR(symval, of_device_id, compatible); + + len = sprintf(alias, "of:N%sT%s", (*name)[0] ? *name : "*", + (*type)[0] ? *type : "*"); + + if ((*compatible)[0]) + sprintf(&alias[len], "%sC%s", (*type)[0] ? "*" : "", + *compatible); + + /* Replace all whitespace with underscores */ + for (tmp = alias; tmp && *tmp; tmp++) + if (isspace(*tmp)) + *tmp = '_'; + + buf_printf(&mod->dev_table_buf, "MODULE_ALIAS(\"%s\");\n", alias); + strcat(alias, "C"); + add_wildcard(alias); + buf_printf(&mod->dev_table_buf, "MODULE_ALIAS(\"%s\");\n", alias); +} + +static void do_of_table(void *symval, unsigned long size, + struct module *mod) +{ + unsigned int i; + const unsigned long id_size = SIZE_of_device_id; + + device_id_check(mod->name, "of", size, id_size, symval); + + /* Leave last one: it's the terminator. */ + size -= id_size; + + for (i = 0; i < size; i += id_size) + do_of_entry_multi(symval + i, mod); +} + +/* Looks like: hid:bNvNpN */ +static int do_hid_entry(const char *filename, + void *symval, char *alias) +{ + DEF_FIELD(symval, hid_device_id, bus); + DEF_FIELD(symval, hid_device_id, group); + DEF_FIELD(symval, hid_device_id, vendor); + DEF_FIELD(symval, hid_device_id, product); + + sprintf(alias, "hid:"); + ADD(alias, "b", bus != HID_BUS_ANY, bus); + ADD(alias, "g", group != HID_GROUP_ANY, group); + ADD(alias, "v", vendor != HID_ANY_ID, vendor); + ADD(alias, "p", product != HID_ANY_ID, product); + + return 1; +} + +/* Looks like: ieee1394:venNmoNspNverN */ +static int do_ieee1394_entry(const char *filename, + void *symval, char *alias) +{ + DEF_FIELD(symval, ieee1394_device_id, match_flags); + DEF_FIELD(symval, ieee1394_device_id, vendor_id); + DEF_FIELD(symval, ieee1394_device_id, model_id); + DEF_FIELD(symval, ieee1394_device_id, specifier_id); + DEF_FIELD(symval, ieee1394_device_id, version); + + strcpy(alias, "ieee1394:"); + ADD(alias, "ven", match_flags & IEEE1394_MATCH_VENDOR_ID, + vendor_id); + ADD(alias, "mo", match_flags & IEEE1394_MATCH_MODEL_ID, + model_id); + ADD(alias, "sp", match_flags & IEEE1394_MATCH_SPECIFIER_ID, + specifier_id); + ADD(alias, "ver", match_flags & IEEE1394_MATCH_VERSION, + version); + + add_wildcard(alias); + return 1; +} + +/* Looks like: pci:vNdNsvNsdNbcNscNiN. */ +static int do_pci_entry(const char *filename, + void *symval, char *alias) +{ + /* Class field can be divided into these three. */ + unsigned char baseclass, subclass, interface, + baseclass_mask, subclass_mask, interface_mask; + + DEF_FIELD(symval, pci_device_id, vendor); + DEF_FIELD(symval, pci_device_id, device); + DEF_FIELD(symval, pci_device_id, subvendor); + DEF_FIELD(symval, pci_device_id, subdevice); + DEF_FIELD(symval, pci_device_id, class); + DEF_FIELD(symval, pci_device_id, class_mask); + + strcpy(alias, "pci:"); + ADD(alias, "v", vendor != PCI_ANY_ID, vendor); + ADD(alias, "d", device != PCI_ANY_ID, device); + ADD(alias, "sv", subvendor != PCI_ANY_ID, subvendor); + ADD(alias, "sd", subdevice != PCI_ANY_ID, subdevice); + + baseclass = (class) >> 16; + baseclass_mask = (class_mask) >> 16; + subclass = (class) >> 8; + subclass_mask = (class_mask) >> 8; + interface = class; + interface_mask = class_mask; + + if ((baseclass_mask != 0 && baseclass_mask != 0xFF) + || (subclass_mask != 0 && subclass_mask != 0xFF) + || (interface_mask != 0 && interface_mask != 0xFF)) { + warn("Can't handle masks in %s:%04X\n", + filename, class_mask); + return 0; + } + + ADD(alias, "bc", baseclass_mask == 0xFF, baseclass); + ADD(alias, "sc", subclass_mask == 0xFF, subclass); + ADD(alias, "i", interface_mask == 0xFF, interface); + add_wildcard(alias); + return 1; +} + +/* looks like: "ccw:tNmNdtNdmN" */ +static int do_ccw_entry(const char *filename, + void *symval, char *alias) +{ + DEF_FIELD(symval, ccw_device_id, match_flags); + DEF_FIELD(symval, ccw_device_id, cu_type); + DEF_FIELD(symval, ccw_device_id, cu_model); + DEF_FIELD(symval, ccw_device_id, dev_type); + DEF_FIELD(symval, ccw_device_id, dev_model); + + strcpy(alias, "ccw:"); + ADD(alias, "t", match_flags&CCW_DEVICE_ID_MATCH_CU_TYPE, + cu_type); + ADD(alias, "m", match_flags&CCW_DEVICE_ID_MATCH_CU_MODEL, + cu_model); + ADD(alias, "dt", match_flags&CCW_DEVICE_ID_MATCH_DEVICE_TYPE, + dev_type); + ADD(alias, "dm", match_flags&CCW_DEVICE_ID_MATCH_DEVICE_MODEL, + dev_model); + add_wildcard(alias); + return 1; +} + +/* looks like: "ap:tN" */ +static int do_ap_entry(const char *filename, + void *symval, char *alias) +{ + DEF_FIELD(symval, ap_device_id, dev_type); + + sprintf(alias, "ap:t%02X*", dev_type); + return 1; +} + +/* looks like: "css:tN" */ +static int do_css_entry(const char *filename, + void *symval, char *alias) +{ + DEF_FIELD(symval, css_device_id, type); + + sprintf(alias, "css:t%01X", type); + return 1; +} + +/* Looks like: "serio:tyNprNidNexN" */ +static int do_serio_entry(const char *filename, + void *symval, char *alias) +{ + DEF_FIELD(symval, serio_device_id, type); + DEF_FIELD(symval, serio_device_id, proto); + DEF_FIELD(symval, serio_device_id, id); + DEF_FIELD(symval, serio_device_id, extra); + + strcpy(alias, "serio:"); + ADD(alias, "ty", type != SERIO_ANY, type); + ADD(alias, "pr", proto != SERIO_ANY, proto); + ADD(alias, "id", id != SERIO_ANY, id); + ADD(alias, "ex", extra != SERIO_ANY, extra); + + add_wildcard(alias); + return 1; +} + +/* looks like: "acpi:ACPI0003" or "acpi:PNP0C0B" or "acpi:LNXVIDEO" or + * "acpi:bbsspp" (bb=base-class, ss=sub-class, pp=prog-if) + * + * NOTE: Each driver should use one of the following : _HID, _CIDs + * or _CLS. Also, bb, ss, and pp can be substituted with ?? + * as don't care byte. + */ +static int do_acpi_entry(const char *filename, + void *symval, char *alias) +{ + DEF_FIELD_ADDR(symval, acpi_device_id, id); + DEF_FIELD_ADDR(symval, acpi_device_id, cls); + DEF_FIELD_ADDR(symval, acpi_device_id, cls_msk); + + if (id && strlen((const char *)*id)) + sprintf(alias, "acpi*:%s:*", *id); + else if (cls) { + int i, byte_shift, cnt = 0; + unsigned int msk; + + sprintf(&alias[cnt], "acpi*:"); + cnt = 6; + for (i = 1; i <= 3; i++) { + byte_shift = 8 * (3-i); + msk = (*cls_msk >> byte_shift) & 0xFF; + if (msk) + sprintf(&alias[cnt], "%02x", + (*cls >> byte_shift) & 0xFF); + else + sprintf(&alias[cnt], "??"); + cnt += 2; + } + sprintf(&alias[cnt], ":*"); + } + return 1; +} + +/* looks like: "pnp:dD" */ +static void do_pnp_device_entry(void *symval, unsigned long size, + struct module *mod) +{ + const unsigned long id_size = SIZE_pnp_device_id; + const unsigned int count = (size / id_size)-1; + unsigned int i; + + device_id_check(mod->name, "pnp", size, id_size, symval); + + for (i = 0; i < count; i++) { + DEF_FIELD_ADDR(symval + i*id_size, pnp_device_id, id); + char acpi_id[sizeof(*id)]; + int j; + + buf_printf(&mod->dev_table_buf, + "MODULE_ALIAS(\"pnp:d%s*\");\n", *id); + + /* fix broken pnp bus lowercasing */ + for (j = 0; j < sizeof(acpi_id); j++) + acpi_id[j] = toupper((*id)[j]); + buf_printf(&mod->dev_table_buf, + "MODULE_ALIAS(\"acpi*:%s:*\");\n", acpi_id); + } +} + +/* looks like: "pnp:dD" for every device of the card */ +static void do_pnp_card_entries(void *symval, unsigned long size, + struct module *mod) +{ + const unsigned long id_size = SIZE_pnp_card_device_id; + const unsigned int count = (size / id_size)-1; + unsigned int i; + + device_id_check(mod->name, "pnp", size, id_size, symval); + + for (i = 0; i < count; i++) { + unsigned int j; + DEF_FIELD_ADDR(symval + i * id_size, pnp_card_device_id, devs); + + for (j = 0; j < PNP_MAX_DEVICES; j++) { + const char *id = (char *)(*devs)[j].id; + int i2, j2; + int dup = 0; + + if (!id[0]) + break; + + /* find duplicate, already added value */ + for (i2 = 0; i2 < i && !dup; i2++) { + DEF_FIELD_ADDR_VAR(symval + i2 * id_size, + pnp_card_device_id, + devs, devs_dup); + + for (j2 = 0; j2 < PNP_MAX_DEVICES; j2++) { + const char *id2 = + (char *)(*devs_dup)[j2].id; + + if (!id2[0]) + break; + + if (!strcmp(id, id2)) { + dup = 1; + break; + } + } + } + + /* add an individual alias for every device entry */ + if (!dup) { + char acpi_id[PNP_ID_LEN]; + int k; + + buf_printf(&mod->dev_table_buf, + "MODULE_ALIAS(\"pnp:d%s*\");\n", id); + + /* fix broken pnp bus lowercasing */ + for (k = 0; k < sizeof(acpi_id); k++) + acpi_id[k] = toupper(id[k]); + buf_printf(&mod->dev_table_buf, + "MODULE_ALIAS(\"acpi*:%s:*\");\n", acpi_id); + } + } + } +} + +/* Looks like: pcmcia:mNcNfNfnNpfnNvaNvbNvcNvdN. */ +static int do_pcmcia_entry(const char *filename, + void *symval, char *alias) +{ + unsigned int i; + DEF_FIELD(symval, pcmcia_device_id, match_flags); + DEF_FIELD(symval, pcmcia_device_id, manf_id); + DEF_FIELD(symval, pcmcia_device_id, card_id); + DEF_FIELD(symval, pcmcia_device_id, func_id); + DEF_FIELD(symval, pcmcia_device_id, function); + DEF_FIELD(symval, pcmcia_device_id, device_no); + DEF_FIELD_ADDR(symval, pcmcia_device_id, prod_id_hash); + + for (i=0; i<4; i++) { + (*prod_id_hash)[i] = TO_NATIVE((*prod_id_hash)[i]); + } + + strcpy(alias, "pcmcia:"); + ADD(alias, "m", match_flags & PCMCIA_DEV_ID_MATCH_MANF_ID, + manf_id); + ADD(alias, "c", match_flags & PCMCIA_DEV_ID_MATCH_CARD_ID, + card_id); + ADD(alias, "f", match_flags & PCMCIA_DEV_ID_MATCH_FUNC_ID, + func_id); + ADD(alias, "fn", match_flags & PCMCIA_DEV_ID_MATCH_FUNCTION, + function); + ADD(alias, "pfn", match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO, + device_no); + ADD(alias, "pa", match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID1, (*prod_id_hash)[0]); + ADD(alias, "pb", match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID2, (*prod_id_hash)[1]); + ADD(alias, "pc", match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID3, (*prod_id_hash)[2]); + ADD(alias, "pd", match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID4, (*prod_id_hash)[3]); + + add_wildcard(alias); + return 1; +} + +static int do_vio_entry(const char *filename, void *symval, + char *alias) +{ + char *tmp; + DEF_FIELD_ADDR(symval, vio_device_id, type); + DEF_FIELD_ADDR(symval, vio_device_id, compat); + + sprintf(alias, "vio:T%sS%s", (*type)[0] ? *type : "*", + (*compat)[0] ? *compat : "*"); + + /* Replace all whitespace with underscores */ + for (tmp = alias; tmp && *tmp; tmp++) + if (isspace (*tmp)) + *tmp = '_'; + + add_wildcard(alias); + return 1; +} + +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) + +static void do_input(char *alias, + kernel_ulong_t *arr, unsigned int min, unsigned int max) +{ + unsigned int i; + + for (i = min / BITS_PER_LONG; i < max / BITS_PER_LONG + 1; i++) + arr[i] = TO_NATIVE(arr[i]); + for (i = min; i < max; i++) + if (arr[i / BITS_PER_LONG] & (1L << (i%BITS_PER_LONG))) + sprintf(alias + strlen(alias), "%X,*", i); +} + +/* input:b0v0p0e0-eXkXrXaXmXlXsXfXwX where X is comma-separated %02X. */ +static int do_input_entry(const char *filename, void *symval, + char *alias) +{ + DEF_FIELD(symval, input_device_id, flags); + DEF_FIELD(symval, input_device_id, bustype); + DEF_FIELD(symval, input_device_id, vendor); + DEF_FIELD(symval, input_device_id, product); + DEF_FIELD(symval, input_device_id, version); + DEF_FIELD_ADDR(symval, input_device_id, evbit); + DEF_FIELD_ADDR(symval, input_device_id, keybit); + DEF_FIELD_ADDR(symval, input_device_id, relbit); + DEF_FIELD_ADDR(symval, input_device_id, absbit); + DEF_FIELD_ADDR(symval, input_device_id, mscbit); + DEF_FIELD_ADDR(symval, input_device_id, ledbit); + DEF_FIELD_ADDR(symval, input_device_id, sndbit); + DEF_FIELD_ADDR(symval, input_device_id, ffbit); + DEF_FIELD_ADDR(symval, input_device_id, swbit); + + sprintf(alias, "input:"); + + ADD(alias, "b", flags & INPUT_DEVICE_ID_MATCH_BUS, bustype); + ADD(alias, "v", flags & INPUT_DEVICE_ID_MATCH_VENDOR, vendor); + ADD(alias, "p", flags & INPUT_DEVICE_ID_MATCH_PRODUCT, product); + ADD(alias, "e", flags & INPUT_DEVICE_ID_MATCH_VERSION, version); + + sprintf(alias + strlen(alias), "-e*"); + if (flags & INPUT_DEVICE_ID_MATCH_EVBIT) + do_input(alias, *evbit, 0, INPUT_DEVICE_ID_EV_MAX); + sprintf(alias + strlen(alias), "k*"); + if (flags & INPUT_DEVICE_ID_MATCH_KEYBIT) + do_input(alias, *keybit, + INPUT_DEVICE_ID_KEY_MIN_INTERESTING, + INPUT_DEVICE_ID_KEY_MAX); + sprintf(alias + strlen(alias), "r*"); + if (flags & INPUT_DEVICE_ID_MATCH_RELBIT) + do_input(alias, *relbit, 0, INPUT_DEVICE_ID_REL_MAX); + sprintf(alias + strlen(alias), "a*"); + if (flags & INPUT_DEVICE_ID_MATCH_ABSBIT) + do_input(alias, *absbit, 0, INPUT_DEVICE_ID_ABS_MAX); + sprintf(alias + strlen(alias), "m*"); + if (flags & INPUT_DEVICE_ID_MATCH_MSCIT) + do_input(alias, *mscbit, 0, INPUT_DEVICE_ID_MSC_MAX); + sprintf(alias + strlen(alias), "l*"); + if (flags & INPUT_DEVICE_ID_MATCH_LEDBIT) + do_input(alias, *ledbit, 0, INPUT_DEVICE_ID_LED_MAX); + sprintf(alias + strlen(alias), "s*"); + if (flags & INPUT_DEVICE_ID_MATCH_SNDBIT) + do_input(alias, *sndbit, 0, INPUT_DEVICE_ID_SND_MAX); + sprintf(alias + strlen(alias), "f*"); + if (flags & INPUT_DEVICE_ID_MATCH_FFBIT) + do_input(alias, *ffbit, 0, INPUT_DEVICE_ID_FF_MAX); + sprintf(alias + strlen(alias), "w*"); + if (flags & INPUT_DEVICE_ID_MATCH_SWBIT) + do_input(alias, *swbit, 0, INPUT_DEVICE_ID_SW_MAX); + return 1; +} + +static int do_eisa_entry(const char *filename, void *symval, + char *alias) +{ + DEF_FIELD_ADDR(symval, eisa_device_id, sig); + if (sig[0]) + sprintf(alias, EISA_DEVICE_MODALIAS_FMT "*", *sig); + else + strcat(alias, "*"); + return 1; +} + +/* Looks like: parisc:tNhvNrevNsvN */ +static int do_parisc_entry(const char *filename, void *symval, + char *alias) +{ + DEF_FIELD(symval, parisc_device_id, hw_type); + DEF_FIELD(symval, parisc_device_id, hversion); + DEF_FIELD(symval, parisc_device_id, hversion_rev); + DEF_FIELD(symval, parisc_device_id, sversion); + + strcpy(alias, "parisc:"); + ADD(alias, "t", hw_type != PA_HWTYPE_ANY_ID, hw_type); + ADD(alias, "hv", hversion != PA_HVERSION_ANY_ID, hversion); + ADD(alias, "rev", hversion_rev != PA_HVERSION_REV_ANY_ID, hversion_rev); + ADD(alias, "sv", sversion != PA_SVERSION_ANY_ID, sversion); + + add_wildcard(alias); + return 1; +} + +/* Looks like: sdio:cNvNdN. */ +static int do_sdio_entry(const char *filename, + void *symval, char *alias) +{ + DEF_FIELD(symval, sdio_device_id, class); + DEF_FIELD(symval, sdio_device_id, vendor); + DEF_FIELD(symval, sdio_device_id, device); + + strcpy(alias, "sdio:"); + ADD(alias, "c", class != (__u8)SDIO_ANY_ID, class); + ADD(alias, "v", vendor != (__u16)SDIO_ANY_ID, vendor); + ADD(alias, "d", device != (__u16)SDIO_ANY_ID, device); + add_wildcard(alias); + return 1; +} + +/* Looks like: ssb:vNidNrevN. */ +static int do_ssb_entry(const char *filename, + void *symval, char *alias) +{ + DEF_FIELD(symval, ssb_device_id, vendor); + DEF_FIELD(symval, ssb_device_id, coreid); + DEF_FIELD(symval, ssb_device_id, revision); + + strcpy(alias, "ssb:"); + ADD(alias, "v", vendor != SSB_ANY_VENDOR, vendor); + ADD(alias, "id", coreid != SSB_ANY_ID, coreid); + ADD(alias, "rev", revision != SSB_ANY_REV, revision); + add_wildcard(alias); + return 1; +} + +/* Looks like: bcma:mNidNrevNclN. */ +static int do_bcma_entry(const char *filename, + void *symval, char *alias) +{ + DEF_FIELD(symval, bcma_device_id, manuf); + DEF_FIELD(symval, bcma_device_id, id); + DEF_FIELD(symval, bcma_device_id, rev); + DEF_FIELD(symval, bcma_device_id, class); + + strcpy(alias, "bcma:"); + ADD(alias, "m", manuf != BCMA_ANY_MANUF, manuf); + ADD(alias, "id", id != BCMA_ANY_ID, id); + ADD(alias, "rev", rev != BCMA_ANY_REV, rev); + ADD(alias, "cl", class != BCMA_ANY_CLASS, class); + add_wildcard(alias); + return 1; +} + +/* Looks like: virtio:dNvN */ +static int do_virtio_entry(const char *filename, void *symval, + char *alias) +{ + DEF_FIELD(symval, virtio_device_id, device); + DEF_FIELD(symval, virtio_device_id, vendor); + + strcpy(alias, "virtio:"); + ADD(alias, "d", device != VIRTIO_DEV_ANY_ID, device); + ADD(alias, "v", vendor != VIRTIO_DEV_ANY_ID, vendor); + + add_wildcard(alias); + return 1; +} + +/* + * Looks like: vmbus:guid + * Each byte of the guid will be represented by two hex characters + * in the name. + */ + +static int do_vmbus_entry(const char *filename, void *symval, + char *alias) +{ + int i; + DEF_FIELD_ADDR(symval, hv_vmbus_device_id, guid); + char guid_name[(sizeof(*guid) + 1) * 2]; + + for (i = 0; i < (sizeof(*guid) * 2); i += 2) + sprintf(&guid_name[i], "%02x", TO_NATIVE((guid->b)[i/2])); + + strcpy(alias, "vmbus:"); + strcat(alias, guid_name); + + return 1; +} + +/* Looks like: rpmsg:S */ +static int do_rpmsg_entry(const char *filename, void *symval, + char *alias) +{ + DEF_FIELD_ADDR(symval, rpmsg_device_id, name); + sprintf(alias, RPMSG_DEVICE_MODALIAS_FMT, *name); + + return 1; +} + +/* Looks like: i2c:S */ +static int do_i2c_entry(const char *filename, void *symval, + char *alias) +{ + DEF_FIELD_ADDR(symval, i2c_device_id, name); + sprintf(alias, I2C_MODULE_PREFIX "%s", *name); + + return 1; +} + +static int do_i3c_entry(const char *filename, void *symval, + char *alias) +{ + DEF_FIELD(symval, i3c_device_id, match_flags); + DEF_FIELD(symval, i3c_device_id, dcr); + DEF_FIELD(symval, i3c_device_id, manuf_id); + DEF_FIELD(symval, i3c_device_id, part_id); + DEF_FIELD(symval, i3c_device_id, extra_info); + + strcpy(alias, "i3c:"); + ADD(alias, "dcr", match_flags & I3C_MATCH_DCR, dcr); + ADD(alias, "manuf", match_flags & I3C_MATCH_MANUF, manuf_id); + ADD(alias, "part", match_flags & I3C_MATCH_PART, part_id); + ADD(alias, "ext", match_flags & I3C_MATCH_EXTRA_INFO, extra_info); + + return 1; +} + +/* Looks like: spi:S */ +static int do_spi_entry(const char *filename, void *symval, + char *alias) +{ + DEF_FIELD_ADDR(symval, spi_device_id, name); + sprintf(alias, SPI_MODULE_PREFIX "%s", *name); + + return 1; +} + +static const struct dmifield { + const char *prefix; + int field; +} dmi_fields[] = { + { "bvn", DMI_BIOS_VENDOR }, + { "bvr", DMI_BIOS_VERSION }, + { "bd", DMI_BIOS_DATE }, + { "br", DMI_BIOS_RELEASE }, + { "efr", DMI_EC_FIRMWARE_RELEASE }, + { "svn", DMI_SYS_VENDOR }, + { "pn", DMI_PRODUCT_NAME }, + { "pvr", DMI_PRODUCT_VERSION }, + { "rvn", DMI_BOARD_VENDOR }, + { "rn", DMI_BOARD_NAME }, + { "rvr", DMI_BOARD_VERSION }, + { "cvn", DMI_CHASSIS_VENDOR }, + { "ct", DMI_CHASSIS_TYPE }, + { "cvr", DMI_CHASSIS_VERSION }, + { NULL, DMI_NONE } +}; + +static void dmi_ascii_filter(char *d, const char *s) +{ + /* Filter out characters we don't want to see in the modalias string */ + for (; *s; s++) + if (*s > ' ' && *s < 127 && *s != ':') + *(d++) = *s; + + *d = 0; +} + + +static int do_dmi_entry(const char *filename, void *symval, + char *alias) +{ + int i, j; + DEF_FIELD_ADDR(symval, dmi_system_id, matches); + sprintf(alias, "dmi*"); + + for (i = 0; i < ARRAY_SIZE(dmi_fields); i++) { + for (j = 0; j < 4; j++) { + if ((*matches)[j].slot && + (*matches)[j].slot == dmi_fields[i].field) { + sprintf(alias + strlen(alias), ":%s*", + dmi_fields[i].prefix); + dmi_ascii_filter(alias + strlen(alias), + (*matches)[j].substr); + strcat(alias, "*"); + } + } + } + + strcat(alias, ":"); + return 1; +} + +static int do_platform_entry(const char *filename, + void *symval, char *alias) +{ + DEF_FIELD_ADDR(symval, platform_device_id, name); + sprintf(alias, PLATFORM_MODULE_PREFIX "%s", *name); + return 1; +} + +static int do_mdio_entry(const char *filename, + void *symval, char *alias) +{ + int i; + DEF_FIELD(symval, mdio_device_id, phy_id); + DEF_FIELD(symval, mdio_device_id, phy_id_mask); + + alias += sprintf(alias, MDIO_MODULE_PREFIX); + + for (i = 0; i < 32; i++) { + if (!((phy_id_mask >> (31-i)) & 1)) + *(alias++) = '?'; + else if ((phy_id >> (31-i)) & 1) + *(alias++) = '1'; + else + *(alias++) = '0'; + } + + /* Terminate the string */ + *alias = 0; + + return 1; +} + +/* Looks like: zorro:iN. */ +static int do_zorro_entry(const char *filename, void *symval, + char *alias) +{ + DEF_FIELD(symval, zorro_device_id, id); + strcpy(alias, "zorro:"); + ADD(alias, "i", id != ZORRO_WILDCARD, id); + return 1; +} + +/* looks like: "pnp:dD" */ +static int do_isapnp_entry(const char *filename, + void *symval, char *alias) +{ + DEF_FIELD(symval, isapnp_device_id, vendor); + DEF_FIELD(symval, isapnp_device_id, function); + sprintf(alias, "pnp:d%c%c%c%x%x%x%x*", + 'A' + ((vendor >> 2) & 0x3f) - 1, + 'A' + (((vendor & 3) << 3) | ((vendor >> 13) & 7)) - 1, + 'A' + ((vendor >> 8) & 0x1f) - 1, + (function >> 4) & 0x0f, function & 0x0f, + (function >> 12) & 0x0f, (function >> 8) & 0x0f); + return 1; +} + +/* Looks like: "ipack:fNvNdN". */ +static int do_ipack_entry(const char *filename, + void *symval, char *alias) +{ + DEF_FIELD(symval, ipack_device_id, format); + DEF_FIELD(symval, ipack_device_id, vendor); + DEF_FIELD(symval, ipack_device_id, device); + strcpy(alias, "ipack:"); + ADD(alias, "f", format != IPACK_ANY_FORMAT, format); + ADD(alias, "v", vendor != IPACK_ANY_ID, vendor); + ADD(alias, "d", device != IPACK_ANY_ID, device); + add_wildcard(alias); + return 1; +} + +/* + * Append a match expression for a single masked hex digit. + * outp points to a pointer to the character at which to append. + * *outp is updated on return to point just after the appended text, + * to facilitate further appending. + */ +static void append_nibble_mask(char **outp, + unsigned int nibble, unsigned int mask) +{ + char *p = *outp; + unsigned int i; + + switch (mask) { + case 0: + *p++ = '?'; + break; + + case 0xf: + p += sprintf(p, "%X", nibble); + break; + + default: + /* + * Dumbly emit a match pattern for all possible matching + * digits. This could be improved in some cases using ranges, + * but it has the advantage of being trivially correct, and is + * often optimal. + */ + *p++ = '['; + for (i = 0; i < 0x10; i++) + if ((i & mask) == nibble) + p += sprintf(p, "%X", i); + *p++ = ']'; + } + + /* Ensure that the string remains NUL-terminated: */ + *p = '\0'; + + /* Advance the caller's end-of-string pointer: */ + *outp = p; +} + +/* + * looks like: "amba:dN" + * + * N is exactly 8 digits, where each is an upper-case hex digit, or + * a ? or [] pattern matching exactly one digit. + */ +static int do_amba_entry(const char *filename, + void *symval, char *alias) +{ + unsigned int digit; + char *p = alias; + DEF_FIELD(symval, amba_id, id); + DEF_FIELD(symval, amba_id, mask); + + if ((id & mask) != id) + fatal("%s: Masked-off bit(s) of AMBA device ID are non-zero: " + "id=0x%08X, mask=0x%08X. Please fix this driver.\n", + filename, id, mask); + + p += sprintf(alias, "amba:d"); + for (digit = 0; digit < 8; digit++) + append_nibble_mask(&p, + (id >> (4 * (7 - digit))) & 0xf, + (mask >> (4 * (7 - digit))) & 0xf); + + return 1; +} + +/* + * looks like: "mipscdmm:tN" + * + * N is exactly 2 digits, where each is an upper-case hex digit, or + * a ? or [] pattern matching exactly one digit. + */ +static int do_mips_cdmm_entry(const char *filename, + void *symval, char *alias) +{ + DEF_FIELD(symval, mips_cdmm_device_id, type); + + sprintf(alias, "mipscdmm:t%02X*", type); + return 1; +} + +/* LOOKS like cpu:type:x86,venVVVVfamFFFFmodMMMM:feature:*,FEAT,* + * All fields are numbers. It would be nicer to use strings for vendor + * and feature, but getting those out of the build system here is too + * complicated. + */ + +static int do_x86cpu_entry(const char *filename, void *symval, + char *alias) +{ + DEF_FIELD(symval, x86_cpu_id, feature); + DEF_FIELD(symval, x86_cpu_id, family); + DEF_FIELD(symval, x86_cpu_id, model); + DEF_FIELD(symval, x86_cpu_id, vendor); + + strcpy(alias, "cpu:type:x86,"); + ADD(alias, "ven", vendor != X86_VENDOR_ANY, vendor); + ADD(alias, "fam", family != X86_FAMILY_ANY, family); + ADD(alias, "mod", model != X86_MODEL_ANY, model); + strcat(alias, ":feature:*"); + if (feature != X86_FEATURE_ANY) + sprintf(alias + strlen(alias), "%04X*", feature); + return 1; +} + +/* LOOKS like cpu:type:*:feature:*FEAT* */ +static int do_cpu_entry(const char *filename, void *symval, char *alias) +{ + DEF_FIELD(symval, cpu_feature, feature); + + sprintf(alias, "cpu:type:*:feature:*%04X*", feature); + return 1; +} + +/* Looks like: mei:S:uuid:N:* */ +static int do_mei_entry(const char *filename, void *symval, + char *alias) +{ + DEF_FIELD_ADDR(symval, mei_cl_device_id, name); + DEF_FIELD_ADDR(symval, mei_cl_device_id, uuid); + DEF_FIELD(symval, mei_cl_device_id, version); + + sprintf(alias, MEI_CL_MODULE_PREFIX); + sprintf(alias + strlen(alias), "%s:", (*name)[0] ? *name : "*"); + add_uuid(alias, *uuid); + ADD(alias, ":", version != MEI_CL_VERSION_ANY, version); + + strcat(alias, ":*"); + + return 1; +} + +/* Looks like: rapidio:vNdNavNadN */ +static int do_rio_entry(const char *filename, + void *symval, char *alias) +{ + DEF_FIELD(symval, rio_device_id, did); + DEF_FIELD(symval, rio_device_id, vid); + DEF_FIELD(symval, rio_device_id, asm_did); + DEF_FIELD(symval, rio_device_id, asm_vid); + + strcpy(alias, "rapidio:"); + ADD(alias, "v", vid != RIO_ANY_ID, vid); + ADD(alias, "d", did != RIO_ANY_ID, did); + ADD(alias, "av", asm_vid != RIO_ANY_ID, asm_vid); + ADD(alias, "ad", asm_did != RIO_ANY_ID, asm_did); + + add_wildcard(alias); + return 1; +} + +/* Looks like: ulpi:vNpN */ +static int do_ulpi_entry(const char *filename, void *symval, + char *alias) +{ + DEF_FIELD(symval, ulpi_device_id, vendor); + DEF_FIELD(symval, ulpi_device_id, product); + + sprintf(alias, "ulpi:v%04xp%04x", vendor, product); + + return 1; +} + +/* Looks like: hdaudio:vNrNaN */ +static int do_hda_entry(const char *filename, void *symval, char *alias) +{ + DEF_FIELD(symval, hda_device_id, vendor_id); + DEF_FIELD(symval, hda_device_id, rev_id); + DEF_FIELD(symval, hda_device_id, api_version); + + strcpy(alias, "hdaudio:"); + ADD(alias, "v", vendor_id != 0, vendor_id); + ADD(alias, "r", rev_id != 0, rev_id); + ADD(alias, "a", api_version != 0, api_version); + + add_wildcard(alias); + return 1; +} + +/* Looks like: sdw:mNpNvNcN */ +static int do_sdw_entry(const char *filename, void *symval, char *alias) +{ + DEF_FIELD(symval, sdw_device_id, mfg_id); + DEF_FIELD(symval, sdw_device_id, part_id); + DEF_FIELD(symval, sdw_device_id, sdw_version); + DEF_FIELD(symval, sdw_device_id, class_id); + + strcpy(alias, "sdw:"); + ADD(alias, "m", mfg_id != 0, mfg_id); + ADD(alias, "p", part_id != 0, part_id); + ADD(alias, "v", sdw_version != 0, sdw_version); + ADD(alias, "c", class_id != 0, class_id); + + add_wildcard(alias); + return 1; +} + +/* Looks like: fsl-mc:vNdN */ +static int do_fsl_mc_entry(const char *filename, void *symval, + char *alias) +{ + DEF_FIELD(symval, fsl_mc_device_id, vendor); + DEF_FIELD_ADDR(symval, fsl_mc_device_id, obj_type); + + sprintf(alias, "fsl-mc:v%08Xd%s", vendor, *obj_type); + return 1; +} + +/* Looks like: tbsvc:kSpNvNrN */ +static int do_tbsvc_entry(const char *filename, void *symval, char *alias) +{ + DEF_FIELD(symval, tb_service_id, match_flags); + DEF_FIELD_ADDR(symval, tb_service_id, protocol_key); + DEF_FIELD(symval, tb_service_id, protocol_id); + DEF_FIELD(symval, tb_service_id, protocol_version); + DEF_FIELD(symval, tb_service_id, protocol_revision); + + strcpy(alias, "tbsvc:"); + if (match_flags & TBSVC_MATCH_PROTOCOL_KEY) + sprintf(alias + strlen(alias), "k%s", *protocol_key); + else + strcat(alias + strlen(alias), "k*"); + ADD(alias, "p", match_flags & TBSVC_MATCH_PROTOCOL_ID, protocol_id); + ADD(alias, "v", match_flags & TBSVC_MATCH_PROTOCOL_VERSION, + protocol_version); + ADD(alias, "r", match_flags & TBSVC_MATCH_PROTOCOL_REVISION, + protocol_revision); + + add_wildcard(alias); + return 1; +} + +/* Looks like: typec:idNmN */ +static int do_typec_entry(const char *filename, void *symval, char *alias) +{ + DEF_FIELD(symval, typec_device_id, svid); + DEF_FIELD(symval, typec_device_id, mode); + + sprintf(alias, "typec:id%04X", svid); + ADD(alias, "m", mode != TYPEC_ANY_MODE, mode); + + return 1; +} + +/* Looks like: tee:uuid */ +static int do_tee_entry(const char *filename, void *symval, char *alias) +{ + DEF_FIELD(symval, tee_client_device_id, uuid); + + sprintf(alias, "tee:%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", + uuid.b[0], uuid.b[1], uuid.b[2], uuid.b[3], uuid.b[4], + uuid.b[5], uuid.b[6], uuid.b[7], uuid.b[8], uuid.b[9], + uuid.b[10], uuid.b[11], uuid.b[12], uuid.b[13], uuid.b[14], + uuid.b[15]); + + add_wildcard(alias); + return 1; +} + +/* Looks like: wmi:guid */ +static int do_wmi_entry(const char *filename, void *symval, char *alias) +{ + int len; + DEF_FIELD_ADDR(symval, wmi_device_id, guid_string); + + if (strlen(*guid_string) != UUID_STRING_LEN) { + warn("Invalid WMI device id 'wmi:%s' in '%s'\n", + *guid_string, filename); + return 0; + } + + len = snprintf(alias, ALIAS_SIZE, WMI_MODULE_PREFIX "%s", *guid_string); + if (len < 0 || len >= ALIAS_SIZE) { + warn("Could not generate all MODULE_ALIAS's in '%s'\n", + filename); + return 0; + } + return 1; +} + +/* Looks like: mhi:S */ +static int do_mhi_entry(const char *filename, void *symval, char *alias) +{ + DEF_FIELD_ADDR(symval, mhi_device_id, chan); + sprintf(alias, MHI_DEVICE_MODALIAS_FMT, *chan); + + return 1; +} + +static int do_auxiliary_entry(const char *filename, void *symval, char *alias) +{ + DEF_FIELD_ADDR(symval, auxiliary_device_id, name); + sprintf(alias, AUXILIARY_MODULE_PREFIX "%s", *name); + + return 1; +} + +/* Does namelen bytes of name exactly match the symbol? */ +static bool sym_is(const char *name, unsigned namelen, const char *symbol) +{ + if (namelen != strlen(symbol)) + return false; + + return memcmp(name, symbol, namelen) == 0; +} + +static void do_table(void *symval, unsigned long size, + unsigned long id_size, + const char *device_id, + int (*do_entry)(const char *filename, void *symval, char *alias), + struct module *mod) +{ + unsigned int i; + char alias[ALIAS_SIZE]; + + device_id_check(mod->name, device_id, size, id_size, symval); + /* Leave last one: it's the terminator. */ + size -= id_size; + + for (i = 0; i < size; i += id_size) { + if (do_entry(mod->name, symval+i, alias)) { + buf_printf(&mod->dev_table_buf, + "MODULE_ALIAS(\"%s\");\n", alias); + } + } +} + +static const struct devtable devtable[] = { + {"hid", SIZE_hid_device_id, do_hid_entry}, + {"ieee1394", SIZE_ieee1394_device_id, do_ieee1394_entry}, + {"pci", SIZE_pci_device_id, do_pci_entry}, + {"ccw", SIZE_ccw_device_id, do_ccw_entry}, + {"ap", SIZE_ap_device_id, do_ap_entry}, + {"css", SIZE_css_device_id, do_css_entry}, + {"serio", SIZE_serio_device_id, do_serio_entry}, + {"acpi", SIZE_acpi_device_id, do_acpi_entry}, + {"pcmcia", SIZE_pcmcia_device_id, do_pcmcia_entry}, + {"vio", SIZE_vio_device_id, do_vio_entry}, + {"input", SIZE_input_device_id, do_input_entry}, + {"eisa", SIZE_eisa_device_id, do_eisa_entry}, + {"parisc", SIZE_parisc_device_id, do_parisc_entry}, + {"sdio", SIZE_sdio_device_id, do_sdio_entry}, + {"ssb", SIZE_ssb_device_id, do_ssb_entry}, + {"bcma", SIZE_bcma_device_id, do_bcma_entry}, + {"virtio", SIZE_virtio_device_id, do_virtio_entry}, + {"vmbus", SIZE_hv_vmbus_device_id, do_vmbus_entry}, + {"rpmsg", SIZE_rpmsg_device_id, do_rpmsg_entry}, + {"i2c", SIZE_i2c_device_id, do_i2c_entry}, + {"i3c", SIZE_i3c_device_id, do_i3c_entry}, + {"spi", SIZE_spi_device_id, do_spi_entry}, + {"dmi", SIZE_dmi_system_id, do_dmi_entry}, + {"platform", SIZE_platform_device_id, do_platform_entry}, + {"mdio", SIZE_mdio_device_id, do_mdio_entry}, + {"zorro", SIZE_zorro_device_id, do_zorro_entry}, + {"isapnp", SIZE_isapnp_device_id, do_isapnp_entry}, + {"ipack", SIZE_ipack_device_id, do_ipack_entry}, + {"amba", SIZE_amba_id, do_amba_entry}, + {"mipscdmm", SIZE_mips_cdmm_device_id, do_mips_cdmm_entry}, + {"x86cpu", SIZE_x86_cpu_id, do_x86cpu_entry}, + {"cpu", SIZE_cpu_feature, do_cpu_entry}, + {"mei", SIZE_mei_cl_device_id, do_mei_entry}, + {"rapidio", SIZE_rio_device_id, do_rio_entry}, + {"ulpi", SIZE_ulpi_device_id, do_ulpi_entry}, + {"hdaudio", SIZE_hda_device_id, do_hda_entry}, + {"sdw", SIZE_sdw_device_id, do_sdw_entry}, + {"fslmc", SIZE_fsl_mc_device_id, do_fsl_mc_entry}, + {"tbsvc", SIZE_tb_service_id, do_tbsvc_entry}, + {"typec", SIZE_typec_device_id, do_typec_entry}, + {"tee", SIZE_tee_client_device_id, do_tee_entry}, + {"wmi", SIZE_wmi_device_id, do_wmi_entry}, + {"mhi", SIZE_mhi_device_id, do_mhi_entry}, + {"auxiliary", SIZE_auxiliary_device_id, do_auxiliary_entry}, +}; + +/* Create MODULE_ALIAS() statements. + * At this time, we cannot write the actual output C source yet, + * so we write into the mod->dev_table_buf buffer. */ +void handle_moddevtable(struct module *mod, struct elf_info *info, + Elf_Sym *sym, const char *symname) +{ + void *symval; + char *zeros = NULL; + const char *name, *identifier; + unsigned int namelen; + + /* We're looking for a section relative symbol */ + if (!sym->st_shndx || get_secindex(info, sym) >= info->num_sections) + return; + + /* We're looking for an object */ + if (ELF_ST_TYPE(sym->st_info) != STT_OBJECT) + return; + + /* All our symbols are of form __mod_<name>__<identifier>_device_table. */ + if (strncmp(symname, "__mod_", strlen("__mod_"))) + return; + name = symname + strlen("__mod_"); + namelen = strlen(name); + if (namelen < strlen("_device_table")) + return; + if (strcmp(name + namelen - strlen("_device_table"), "_device_table")) + return; + identifier = strstr(name, "__"); + if (!identifier) + return; + namelen = identifier - name; + + /* Handle all-NULL symbols allocated into .bss */ + if (info->sechdrs[get_secindex(info, sym)].sh_type & SHT_NOBITS) { + zeros = calloc(1, sym->st_size); + symval = zeros; + } else { + symval = (void *)info->hdr + + info->sechdrs[get_secindex(info, sym)].sh_offset + + sym->st_value; + } + + /* First handle the "special" cases */ + if (sym_is(name, namelen, "usb")) + do_usb_table(symval, sym->st_size, mod); + if (sym_is(name, namelen, "of")) + do_of_table(symval, sym->st_size, mod); + else if (sym_is(name, namelen, "pnp")) + do_pnp_device_entry(symval, sym->st_size, mod); + else if (sym_is(name, namelen, "pnp_card")) + do_pnp_card_entries(symval, sym->st_size, mod); + else { + int i; + + for (i = 0; i < ARRAY_SIZE(devtable); i++) { + const struct devtable *p = &devtable[i]; + + if (sym_is(name, namelen, p->device_id)) { + do_table(symval, sym->st_size, p->id_size, + p->device_id, p->do_entry, mod); + break; + } + } + } + free(zeros); +} + +/* Now add out buffered information to the generated C source */ +void add_moddevtable(struct buffer *buf, struct module *mod) +{ + buf_printf(buf, "\n"); + buf_write(buf, mod->dev_table_buf.p, mod->dev_table_buf.pos); + free(mod->dev_table_buf.p); +} diff --git a/src/net/scripts/mod/mk_elfconfig.c b/src/net/scripts/mod/mk_elfconfig.c new file mode 100644 index 0000000..680eade --- /dev/null +++ b/src/net/scripts/mod/mk_elfconfig.c @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: GPL-2.0 +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <elf.h> + +int +main(int argc, char **argv) +{ + unsigned char ei[EI_NIDENT]; + union { short s; char c[2]; } endian_test; + + if (fread(ei, 1, EI_NIDENT, stdin) != EI_NIDENT) { + fprintf(stderr, "Error: input truncated\n"); + return 1; + } + if (memcmp(ei, ELFMAG, SELFMAG) != 0) { + fprintf(stderr, "Error: not ELF\n"); + return 1; + } + switch (ei[EI_CLASS]) { + case ELFCLASS32: + printf("#define KERNEL_ELFCLASS ELFCLASS32\n"); + break; + case ELFCLASS64: + printf("#define KERNEL_ELFCLASS ELFCLASS64\n"); + break; + default: + exit(1); + } + switch (ei[EI_DATA]) { + case ELFDATA2LSB: + printf("#define KERNEL_ELFDATA ELFDATA2LSB\n"); + break; + case ELFDATA2MSB: + printf("#define KERNEL_ELFDATA ELFDATA2MSB\n"); + break; + default: + exit(1); + } + + if (sizeof(unsigned long) == 4) { + printf("#define HOST_ELFCLASS ELFCLASS32\n"); + } else if (sizeof(unsigned long) == 8) { + printf("#define HOST_ELFCLASS ELFCLASS64\n"); + } + + endian_test.s = 0x0102; + if (memcmp(endian_test.c, "\x01\x02", 2) == 0) + printf("#define HOST_ELFDATA ELFDATA2MSB\n"); + else if (memcmp(endian_test.c, "\x02\x01", 2) == 0) + printf("#define HOST_ELFDATA ELFDATA2LSB\n"); + else + exit(1); + + return 0; +} diff --git a/src/net/scripts/mod/modpost.c b/src/net/scripts/mod/modpost.c new file mode 100644 index 0000000..8545e49 --- /dev/null +++ b/src/net/scripts/mod/modpost.c @@ -0,0 +1,2678 @@ +/* Postprocess module symbol versions + * + * Copyright 2003 Kai Germaschewski + * Copyright 2002-2004 Rusty Russell, IBM Corporation + * Copyright 2006-2008 Sam Ravnborg + * Based in part on module-init-tools/depmod.c,file2alias + * + * This software may be used and distributed according to the terms + * of the GNU General Public License, incorporated herein by reference. + * + * Usage: modpost vmlinux module1.o module2.o ... + */ + +#define _GNU_SOURCE +#include <elf.h> +#include <stdio.h> +#include <ctype.h> +#include <string.h> +#include <limits.h> +#include <stdbool.h> +#include <errno.h> +#include "modpost.h" +#include "../../include/linux/license.h" + +/* Are we using CONFIG_MODVERSIONS? */ +static int modversions = 0; +/* Warn about undefined symbols? (do so if we have vmlinux) */ +static int have_vmlinux = 0; +/* Is CONFIG_MODULE_SRCVERSION_ALL set? */ +static int all_versions = 0; +/* If we are modposting external module set to 1 */ +static int external_module = 0; +/* Only warn about unresolved symbols */ +static int warn_unresolved = 0; +/* How a symbol is exported */ +static int sec_mismatch_count = 0; +static int sec_mismatch_fatal = 0; +/* ignore missing files */ +static int ignore_missing_files; +/* If set to 1, only warn (instead of error) about missing ns imports */ +static int allow_missing_ns_imports; + +enum export { + export_plain, export_unused, export_gpl, + export_unused_gpl, export_gpl_future, export_unknown +}; + +/* In kernel, this size is defined in linux/module.h; + * here we use Elf_Addr instead of long for covering cross-compile + */ + +#define MODULE_NAME_LEN (64 - sizeof(Elf_Addr)) + +void __attribute__((format(printf, 2, 3))) +modpost_log(enum loglevel loglevel, const char *fmt, ...) +{ + va_list arglist; + + switch (loglevel) { + case LOG_WARN: + fprintf(stderr, "WARNING: "); + break; + case LOG_ERROR: + fprintf(stderr, "ERROR: "); + break; + case LOG_FATAL: + fprintf(stderr, "FATAL: "); + break; + default: /* invalid loglevel, ignore */ + break; + } + + fprintf(stderr, "modpost: "); + + va_start(arglist, fmt); + vfprintf(stderr, fmt, arglist); + va_end(arglist); + + if (loglevel == LOG_FATAL) + exit(1); +} + +static inline bool strends(const char *str, const char *postfix) +{ + if (strlen(str) < strlen(postfix)) + return false; + + return strcmp(str + strlen(str) - strlen(postfix), postfix) == 0; +} + +void *do_nofail(void *ptr, const char *expr) +{ + if (!ptr) + fatal("Memory allocation failure: %s.\n", expr); + + return ptr; +} + +char *read_text_file(const char *filename) +{ + struct stat st; + size_t nbytes; + int fd; + char *buf; + + fd = open(filename, O_RDONLY); + if (fd < 0) { + perror(filename); + exit(1); + } + + if (fstat(fd, &st) < 0) { + perror(filename); + exit(1); + } + + buf = NOFAIL(malloc(st.st_size + 1)); + + nbytes = st.st_size; + + while (nbytes) { + ssize_t bytes_read; + + bytes_read = read(fd, buf, nbytes); + if (bytes_read < 0) { + perror(filename); + exit(1); + } + + nbytes -= bytes_read; + } + buf[st.st_size] = '\0'; + + close(fd); + + return buf; +} + +char *get_line(char **stringp) +{ + char *orig = *stringp, *next; + + /* do not return the unwanted extra line at EOF */ + if (!orig || *orig == '\0') + return NULL; + + /* don't use strsep here, it is not available everywhere */ + next = strchr(orig, '\n'); + if (next) + *next++ = '\0'; + + *stringp = next; + + return orig; +} + +/* A list of all modules we processed */ +static struct module *modules; + +static struct module *find_module(const char *modname) +{ + struct module *mod; + + for (mod = modules; mod; mod = mod->next) + if (strcmp(mod->name, modname) == 0) + break; + return mod; +} + +static struct module *new_module(const char *modname) +{ + struct module *mod; + + mod = NOFAIL(malloc(sizeof(*mod) + strlen(modname) + 1)); + memset(mod, 0, sizeof(*mod)); + + /* add to list */ + strcpy(mod->name, modname); + mod->is_vmlinux = (strcmp(modname, "vmlinux") == 0); + mod->gpl_compatible = -1; + mod->next = modules; + modules = mod; + + if (mod->is_vmlinux) + have_vmlinux = 1; + + return mod; +} + +/* A hash of all exported symbols, + * struct symbol is also used for lists of unresolved symbols */ + +#define SYMBOL_HASH_SIZE 1024 + +struct symbol { + struct symbol *next; + struct module *module; + unsigned int crc; + int crc_valid; + char *namespace; + unsigned int weak:1; + unsigned int is_static:1; /* 1 if symbol is not global */ + enum export export; /* Type of export */ + char name[]; +}; + +static struct symbol *symbolhash[SYMBOL_HASH_SIZE]; + +/* This is based on the hash agorithm from gdbm, via tdb */ +static inline unsigned int tdb_hash(const char *name) +{ + unsigned value; /* Used to compute the hash value. */ + unsigned i; /* Used to cycle through random values. */ + + /* Set the initial value from the key size. */ + for (value = 0x238F13AF * strlen(name), i = 0; name[i]; i++) + value = (value + (((unsigned char *)name)[i] << (i*5 % 24))); + + return (1103515243 * value + 12345); +} + +/** + * Allocate a new symbols for use in the hash of exported symbols or + * the list of unresolved symbols per module + **/ +static struct symbol *alloc_symbol(const char *name, unsigned int weak, + struct symbol *next) +{ + struct symbol *s = NOFAIL(malloc(sizeof(*s) + strlen(name) + 1)); + + memset(s, 0, sizeof(*s)); + strcpy(s->name, name); + s->weak = weak; + s->next = next; + s->is_static = 1; + return s; +} + +/* For the hash of exported symbols */ +static struct symbol *new_symbol(const char *name, struct module *module, + enum export export) +{ + unsigned int hash; + + hash = tdb_hash(name) % SYMBOL_HASH_SIZE; + symbolhash[hash] = alloc_symbol(name, 0, symbolhash[hash]); + + return symbolhash[hash]; +} + +static struct symbol *find_symbol(const char *name) +{ + struct symbol *s; + + /* For our purposes, .foo matches foo. PPC64 needs this. */ + if (name[0] == '.') + name++; + + for (s = symbolhash[tdb_hash(name) % SYMBOL_HASH_SIZE]; s; s = s->next) { + if (strcmp(s->name, name) == 0) + return s; + } + return NULL; +} + +static bool contains_namespace(struct namespace_list *list, + const char *namespace) +{ + for (; list; list = list->next) + if (!strcmp(list->namespace, namespace)) + return true; + + return false; +} + +static void add_namespace(struct namespace_list **list, const char *namespace) +{ + struct namespace_list *ns_entry; + + if (!contains_namespace(*list, namespace)) { + ns_entry = NOFAIL(malloc(sizeof(struct namespace_list) + + strlen(namespace) + 1)); + strcpy(ns_entry->namespace, namespace); + ns_entry->next = *list; + *list = ns_entry; + } +} + +static bool module_imports_namespace(struct module *module, + const char *namespace) +{ + return contains_namespace(module->imported_namespaces, namespace); +} + +static const struct { + const char *str; + enum export export; +} export_list[] = { + { .str = "EXPORT_SYMBOL", .export = export_plain }, + { .str = "EXPORT_UNUSED_SYMBOL", .export = export_unused }, + { .str = "EXPORT_SYMBOL_GPL", .export = export_gpl }, + { .str = "EXPORT_UNUSED_SYMBOL_GPL", .export = export_unused_gpl }, + { .str = "EXPORT_SYMBOL_GPL_FUTURE", .export = export_gpl_future }, + { .str = "(unknown)", .export = export_unknown }, +}; + + +static const char *export_str(enum export ex) +{ + return export_list[ex].str; +} + +static enum export export_no(const char *s) +{ + int i; + + if (!s) + return export_unknown; + for (i = 0; export_list[i].export != export_unknown; i++) { + if (strcmp(export_list[i].str, s) == 0) + return export_list[i].export; + } + return export_unknown; +} + +static void *sym_get_data_by_offset(const struct elf_info *info, + unsigned int secindex, unsigned long offset) +{ + Elf_Shdr *sechdr = &info->sechdrs[secindex]; + + if (info->hdr->e_type != ET_REL) + offset -= sechdr->sh_addr; + + return (void *)info->hdr + sechdr->sh_offset + offset; +} + +static void *sym_get_data(const struct elf_info *info, const Elf_Sym *sym) +{ + return sym_get_data_by_offset(info, get_secindex(info, sym), + sym->st_value); +} + +static const char *sech_name(const struct elf_info *info, Elf_Shdr *sechdr) +{ + return sym_get_data_by_offset(info, info->secindex_strings, + sechdr->sh_name); +} + +static const char *sec_name(const struct elf_info *info, int secindex) +{ + return sech_name(info, &info->sechdrs[secindex]); +} + +#define strstarts(str, prefix) (strncmp(str, prefix, strlen(prefix)) == 0) + +static enum export export_from_secname(struct elf_info *elf, unsigned int sec) +{ + const char *secname = sec_name(elf, sec); + + if (strstarts(secname, "___ksymtab+")) + return export_plain; + else if (strstarts(secname, "___ksymtab_unused+")) + return export_unused; + else if (strstarts(secname, "___ksymtab_gpl+")) + return export_gpl; + else if (strstarts(secname, "___ksymtab_unused_gpl+")) + return export_unused_gpl; + else if (strstarts(secname, "___ksymtab_gpl_future+")) + return export_gpl_future; + else + return export_unknown; +} + +static enum export export_from_sec(struct elf_info *elf, unsigned int sec) +{ + if (sec == elf->export_sec) + return export_plain; + else if (sec == elf->export_unused_sec) + return export_unused; + else if (sec == elf->export_gpl_sec) + return export_gpl; + else if (sec == elf->export_unused_gpl_sec) + return export_unused_gpl; + else if (sec == elf->export_gpl_future_sec) + return export_gpl_future; + else + return export_unknown; +} + +static const char *namespace_from_kstrtabns(const struct elf_info *info, + const Elf_Sym *sym) +{ + const char *value = sym_get_data(info, sym); + return value[0] ? value : NULL; +} + +static void sym_update_namespace(const char *symname, const char *namespace) +{ + struct symbol *s = find_symbol(symname); + + /* + * That symbol should have been created earlier and thus this is + * actually an assertion. + */ + if (!s) { + merror("Could not update namespace(%s) for symbol %s\n", + namespace, symname); + return; + } + + free(s->namespace); + s->namespace = + namespace && namespace[0] ? NOFAIL(strdup(namespace)) : NULL; +} + +/** + * Add an exported symbol - it may have already been added without a + * CRC, in this case just update the CRC + **/ +static struct symbol *sym_add_exported(const char *name, struct module *mod, + enum export export) +{ + struct symbol *s = find_symbol(name); + + if (!s) { + s = new_symbol(name, mod, export); + } else if (!external_module || s->module->is_vmlinux || + s->module == mod) { + warn("%s: '%s' exported twice. Previous export was in %s%s\n", + mod->name, name, s->module->name, + s->module->is_vmlinux ? "" : ".ko"); + return s; + } + + s->module = mod; + s->export = export; + return s; +} + +static void sym_set_crc(const char *name, unsigned int crc) +{ + struct symbol *s = find_symbol(name); + + /* + * Ignore stand-alone __crc_*, which might be auto-generated symbols + * such as __*_veneer in ARM ELF. + */ + if (!s) + return; + + s->crc = crc; + s->crc_valid = 1; +} + +static void *grab_file(const char *filename, size_t *size) +{ + struct stat st; + void *map = MAP_FAILED; + int fd; + + fd = open(filename, O_RDONLY); + if (fd < 0) + return NULL; + if (fstat(fd, &st)) + goto failed; + + *size = st.st_size; + map = mmap(NULL, *size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0); + +failed: + close(fd); + if (map == MAP_FAILED) + return NULL; + return map; +} + +static void release_file(void *file, size_t size) +{ + munmap(file, size); +} + +static int parse_elf(struct elf_info *info, const char *filename) +{ + unsigned int i; + Elf_Ehdr *hdr; + Elf_Shdr *sechdrs; + Elf_Sym *sym; + const char *secstrings; + unsigned int symtab_idx = ~0U, symtab_shndx_idx = ~0U; + + hdr = grab_file(filename, &info->size); + if (!hdr) { + if (ignore_missing_files) { + fprintf(stderr, "%s: %s (ignored)\n", filename, + strerror(errno)); + return 0; + } + perror(filename); + exit(1); + } + info->hdr = hdr; + if (info->size < sizeof(*hdr)) { + /* file too small, assume this is an empty .o file */ + return 0; + } + /* Is this a valid ELF file? */ + if ((hdr->e_ident[EI_MAG0] != ELFMAG0) || + (hdr->e_ident[EI_MAG1] != ELFMAG1) || + (hdr->e_ident[EI_MAG2] != ELFMAG2) || + (hdr->e_ident[EI_MAG3] != ELFMAG3)) { + /* Not an ELF file - silently ignore it */ + return 0; + } + /* Fix endianness in ELF header */ + hdr->e_type = TO_NATIVE(hdr->e_type); + hdr->e_machine = TO_NATIVE(hdr->e_machine); + hdr->e_version = TO_NATIVE(hdr->e_version); + hdr->e_entry = TO_NATIVE(hdr->e_entry); + hdr->e_phoff = TO_NATIVE(hdr->e_phoff); + hdr->e_shoff = TO_NATIVE(hdr->e_shoff); + hdr->e_flags = TO_NATIVE(hdr->e_flags); + hdr->e_ehsize = TO_NATIVE(hdr->e_ehsize); + hdr->e_phentsize = TO_NATIVE(hdr->e_phentsize); + hdr->e_phnum = TO_NATIVE(hdr->e_phnum); + hdr->e_shentsize = TO_NATIVE(hdr->e_shentsize); + hdr->e_shnum = TO_NATIVE(hdr->e_shnum); + hdr->e_shstrndx = TO_NATIVE(hdr->e_shstrndx); + sechdrs = (void *)hdr + hdr->e_shoff; + info->sechdrs = sechdrs; + + /* Check if file offset is correct */ + if (hdr->e_shoff > info->size) { + fatal("section header offset=%lu in file '%s' is bigger than filesize=%zu\n", + (unsigned long)hdr->e_shoff, filename, info->size); + return 0; + } + + if (hdr->e_shnum == SHN_UNDEF) { + /* + * There are more than 64k sections, + * read count from .sh_size. + */ + info->num_sections = TO_NATIVE(sechdrs[0].sh_size); + } + else { + info->num_sections = hdr->e_shnum; + } + if (hdr->e_shstrndx == SHN_XINDEX) { + info->secindex_strings = TO_NATIVE(sechdrs[0].sh_link); + } + else { + info->secindex_strings = hdr->e_shstrndx; + } + + /* Fix endianness in section headers */ + for (i = 0; i < info->num_sections; i++) { + sechdrs[i].sh_name = TO_NATIVE(sechdrs[i].sh_name); + sechdrs[i].sh_type = TO_NATIVE(sechdrs[i].sh_type); + sechdrs[i].sh_flags = TO_NATIVE(sechdrs[i].sh_flags); + sechdrs[i].sh_addr = TO_NATIVE(sechdrs[i].sh_addr); + sechdrs[i].sh_offset = TO_NATIVE(sechdrs[i].sh_offset); + sechdrs[i].sh_size = TO_NATIVE(sechdrs[i].sh_size); + sechdrs[i].sh_link = TO_NATIVE(sechdrs[i].sh_link); + sechdrs[i].sh_info = TO_NATIVE(sechdrs[i].sh_info); + sechdrs[i].sh_addralign = TO_NATIVE(sechdrs[i].sh_addralign); + sechdrs[i].sh_entsize = TO_NATIVE(sechdrs[i].sh_entsize); + } + /* Find symbol table. */ + secstrings = (void *)hdr + sechdrs[info->secindex_strings].sh_offset; + for (i = 1; i < info->num_sections; i++) { + const char *secname; + int nobits = sechdrs[i].sh_type == SHT_NOBITS; + + if (!nobits && sechdrs[i].sh_offset > info->size) { + fatal("%s is truncated. sechdrs[i].sh_offset=%lu > " + "sizeof(*hrd)=%zu\n", filename, + (unsigned long)sechdrs[i].sh_offset, + sizeof(*hdr)); + return 0; + } + secname = secstrings + sechdrs[i].sh_name; + if (strcmp(secname, ".modinfo") == 0) { + if (nobits) + fatal("%s has NOBITS .modinfo\n", filename); + info->modinfo = (void *)hdr + sechdrs[i].sh_offset; + info->modinfo_len = sechdrs[i].sh_size; + } else if (strcmp(secname, "__ksymtab") == 0) + info->export_sec = i; + else if (strcmp(secname, "__ksymtab_unused") == 0) + info->export_unused_sec = i; + else if (strcmp(secname, "__ksymtab_gpl") == 0) + info->export_gpl_sec = i; + else if (strcmp(secname, "__ksymtab_unused_gpl") == 0) + info->export_unused_gpl_sec = i; + else if (strcmp(secname, "__ksymtab_gpl_future") == 0) + info->export_gpl_future_sec = i; + + if (sechdrs[i].sh_type == SHT_SYMTAB) { + unsigned int sh_link_idx; + symtab_idx = i; + info->symtab_start = (void *)hdr + + sechdrs[i].sh_offset; + info->symtab_stop = (void *)hdr + + sechdrs[i].sh_offset + sechdrs[i].sh_size; + sh_link_idx = sechdrs[i].sh_link; + info->strtab = (void *)hdr + + sechdrs[sh_link_idx].sh_offset; + } + + /* 32bit section no. table? ("more than 64k sections") */ + if (sechdrs[i].sh_type == SHT_SYMTAB_SHNDX) { + symtab_shndx_idx = i; + info->symtab_shndx_start = (void *)hdr + + sechdrs[i].sh_offset; + info->symtab_shndx_stop = (void *)hdr + + sechdrs[i].sh_offset + sechdrs[i].sh_size; + } + } + if (!info->symtab_start) + fatal("%s has no symtab?\n", filename); + + /* Fix endianness in symbols */ + for (sym = info->symtab_start; sym < info->symtab_stop; sym++) { + sym->st_shndx = TO_NATIVE(sym->st_shndx); + sym->st_name = TO_NATIVE(sym->st_name); + sym->st_value = TO_NATIVE(sym->st_value); + sym->st_size = TO_NATIVE(sym->st_size); + } + + if (symtab_shndx_idx != ~0U) { + Elf32_Word *p; + if (symtab_idx != sechdrs[symtab_shndx_idx].sh_link) + fatal("%s: SYMTAB_SHNDX has bad sh_link: %u!=%u\n", + filename, sechdrs[symtab_shndx_idx].sh_link, + symtab_idx); + /* Fix endianness */ + for (p = info->symtab_shndx_start; p < info->symtab_shndx_stop; + p++) + *p = TO_NATIVE(*p); + } + + return 1; +} + +static void parse_elf_finish(struct elf_info *info) +{ + release_file(info->hdr, info->size); +} + +static int ignore_undef_symbol(struct elf_info *info, const char *symname) +{ + /* ignore __this_module, it will be resolved shortly */ + if (strcmp(symname, "__this_module") == 0) + return 1; + /* ignore global offset table */ + if (strcmp(symname, "_GLOBAL_OFFSET_TABLE_") == 0) + return 1; + if (info->hdr->e_machine == EM_PPC) + /* Special register function linked on all modules during final link of .ko */ + if (strstarts(symname, "_restgpr_") || + strstarts(symname, "_savegpr_") || + strstarts(symname, "_rest32gpr_") || + strstarts(symname, "_save32gpr_") || + strstarts(symname, "_restvr_") || + strstarts(symname, "_savevr_")) + return 1; + if (info->hdr->e_machine == EM_PPC64) + /* Special register function linked on all modules during final link of .ko */ + if (strstarts(symname, "_restgpr0_") || + strstarts(symname, "_savegpr0_") || + strstarts(symname, "_restvr_") || + strstarts(symname, "_savevr_") || + strcmp(symname, ".TOC.") == 0) + return 1; + /* Do not ignore this symbol */ + return 0; +} + +static void handle_modversion(const struct module *mod, + const struct elf_info *info, + const Elf_Sym *sym, const char *symname) +{ + unsigned int crc; + + if (sym->st_shndx == SHN_UNDEF) { + warn("EXPORT symbol \"%s\" [%s%s] version generation failed, symbol will not be versioned.\n", + symname, mod->name, mod->is_vmlinux ? "" : ".ko"); + return; + } + + if (sym->st_shndx == SHN_ABS) { + crc = sym->st_value; + } else { + unsigned int *crcp; + + /* symbol points to the CRC in the ELF object */ + crcp = sym_get_data(info, sym); + crc = TO_NATIVE(*crcp); + } + sym_set_crc(symname, crc); +} + +static void handle_symbol(struct module *mod, struct elf_info *info, + const Elf_Sym *sym, const char *symname) +{ + enum export export; + const char *name; + + if (strstarts(symname, "__ksymtab")) + export = export_from_secname(info, get_secindex(info, sym)); + else + export = export_from_sec(info, get_secindex(info, sym)); + + switch (sym->st_shndx) { + case SHN_COMMON: + if (strstarts(symname, "__gnu_lto_")) { + /* Should warn here, but modpost runs before the linker */ + } else + warn("\"%s\" [%s] is COMMON symbol\n", symname, mod->name); + break; + case SHN_UNDEF: + /* undefined symbol */ + if (ELF_ST_BIND(sym->st_info) != STB_GLOBAL && + ELF_ST_BIND(sym->st_info) != STB_WEAK) + break; + if (ignore_undef_symbol(info, symname)) + break; + if (info->hdr->e_machine == EM_SPARC || + info->hdr->e_machine == EM_SPARCV9) { + /* Ignore register directives. */ + if (ELF_ST_TYPE(sym->st_info) == STT_SPARC_REGISTER) + break; + if (symname[0] == '.') { + char *munged = NOFAIL(strdup(symname)); + munged[0] = '_'; + munged[1] = toupper(munged[1]); + symname = munged; + } + } + + mod->unres = alloc_symbol(symname, + ELF_ST_BIND(sym->st_info) == STB_WEAK, + mod->unres); + break; + default: + /* All exported symbols */ + if (strstarts(symname, "__ksymtab_")) { + name = symname + strlen("__ksymtab_"); + sym_add_exported(name, mod, export); + } + if (strcmp(symname, "init_module") == 0) + mod->has_init = 1; + if (strcmp(symname, "cleanup_module") == 0) + mod->has_cleanup = 1; + break; + } +} + +/** + * Parse tag=value strings from .modinfo section + **/ +static char *next_string(char *string, unsigned long *secsize) +{ + /* Skip non-zero chars */ + while (string[0]) { + string++; + if ((*secsize)-- <= 1) + return NULL; + } + + /* Skip any zero padding. */ + while (!string[0]) { + string++; + if ((*secsize)-- <= 1) + return NULL; + } + return string; +} + +static char *get_next_modinfo(struct elf_info *info, const char *tag, + char *prev) +{ + char *p; + unsigned int taglen = strlen(tag); + char *modinfo = info->modinfo; + unsigned long size = info->modinfo_len; + + if (prev) { + size -= prev - modinfo; + modinfo = next_string(prev, &size); + } + + for (p = modinfo; p; p = next_string(p, &size)) { + if (strncmp(p, tag, taglen) == 0 && p[taglen] == '=') + return p + taglen + 1; + } + return NULL; +} + +static char *get_modinfo(struct elf_info *info, const char *tag) + +{ + return get_next_modinfo(info, tag, NULL); +} + +/** + * Test if string s ends in string sub + * return 0 if match + **/ +static int strrcmp(const char *s, const char *sub) +{ + int slen, sublen; + + if (!s || !sub) + return 1; + + slen = strlen(s); + sublen = strlen(sub); + + if ((slen == 0) || (sublen == 0)) + return 1; + + if (sublen > slen) + return 1; + + return memcmp(s + slen - sublen, sub, sublen); +} + +static const char *sym_name(struct elf_info *elf, Elf_Sym *sym) +{ + if (sym) + return elf->strtab + sym->st_name; + else + return "(unknown)"; +} + +/* The pattern is an array of simple patterns. + * "foo" will match an exact string equal to "foo" + * "*foo" will match a string that ends with "foo" + * "foo*" will match a string that begins with "foo" + * "*foo*" will match a string that contains "foo" + */ +static int match(const char *sym, const char * const pat[]) +{ + const char *p; + while (*pat) { + p = *pat++; + const char *endp = p + strlen(p) - 1; + + /* "*foo*" */ + if (*p == '*' && *endp == '*') { + char *bare = NOFAIL(strndup(p + 1, strlen(p) - 2)); + char *here = strstr(sym, bare); + + free(bare); + if (here != NULL) + return 1; + } + /* "*foo" */ + else if (*p == '*') { + if (strrcmp(sym, p + 1) == 0) + return 1; + } + /* "foo*" */ + else if (*endp == '*') { + if (strncmp(sym, p, strlen(p) - 1) == 0) + return 1; + } + /* no wildcards */ + else { + if (strcmp(p, sym) == 0) + return 1; + } + } + /* no match */ + return 0; +} + +/* sections that we do not want to do full section mismatch check on */ +static const char *const section_white_list[] = +{ + ".comment*", + ".debug*", + ".cranges", /* sh64 */ + ".zdebug*", /* Compressed debug sections. */ + ".GCC.command.line", /* record-gcc-switches */ + ".mdebug*", /* alpha, score, mips etc. */ + ".pdr", /* alpha, score, mips etc. */ + ".stab*", + ".note*", + ".got*", + ".toc*", + ".xt.prop", /* xtensa */ + ".xt.lit", /* xtensa */ + ".arcextmap*", /* arc */ + ".gnu.linkonce.arcext*", /* arc : modules */ + ".cmem*", /* EZchip */ + ".fmt_slot*", /* EZchip */ + ".gnu.lto*", + ".discard.*", + NULL +}; + +/* + * This is used to find sections missing the SHF_ALLOC flag. + * The cause of this is often a section specified in assembler + * without "ax" / "aw". + */ +static void check_section(const char *modname, struct elf_info *elf, + Elf_Shdr *sechdr) +{ + const char *sec = sech_name(elf, sechdr); + + if (sechdr->sh_type == SHT_PROGBITS && + !(sechdr->sh_flags & SHF_ALLOC) && + !match(sec, section_white_list)) { + warn("%s (%s): unexpected non-allocatable section.\n" + "Did you forget to use \"ax\"/\"aw\" in a .S file?\n" + "Note that for example <linux/init.h> contains\n" + "section definitions for use in .S files.\n\n", + modname, sec); + } +} + + + +#define ALL_INIT_DATA_SECTIONS \ + ".init.setup", ".init.rodata", ".meminit.rodata", \ + ".init.data", ".meminit.data" +#define ALL_EXIT_DATA_SECTIONS \ + ".exit.data", ".memexit.data" + +#define ALL_INIT_TEXT_SECTIONS \ + ".init.text", ".meminit.text" +#define ALL_EXIT_TEXT_SECTIONS \ + ".exit.text", ".memexit.text" + +#define ALL_PCI_INIT_SECTIONS \ + ".pci_fixup_early", ".pci_fixup_header", ".pci_fixup_final", \ + ".pci_fixup_enable", ".pci_fixup_resume", \ + ".pci_fixup_resume_early", ".pci_fixup_suspend" + +#define ALL_XXXINIT_SECTIONS MEM_INIT_SECTIONS +#define ALL_XXXEXIT_SECTIONS MEM_EXIT_SECTIONS + +#define ALL_INIT_SECTIONS INIT_SECTIONS, ALL_XXXINIT_SECTIONS +#define ALL_EXIT_SECTIONS EXIT_SECTIONS, ALL_XXXEXIT_SECTIONS + +#define DATA_SECTIONS ".data", ".data.rel" +#define TEXT_SECTIONS ".text", ".text.unlikely", ".sched.text", \ + ".kprobes.text", ".cpuidle.text", ".noinstr.text" +#define OTHER_TEXT_SECTIONS ".ref.text", ".head.text", ".spinlock.text", \ + ".fixup", ".entry.text", ".exception.text", ".text.*", \ + ".coldtext" + +#define INIT_SECTIONS ".init.*" +#define MEM_INIT_SECTIONS ".meminit.*" + +#define EXIT_SECTIONS ".exit.*" +#define MEM_EXIT_SECTIONS ".memexit.*" + +#define ALL_TEXT_SECTIONS ALL_INIT_TEXT_SECTIONS, ALL_EXIT_TEXT_SECTIONS, \ + TEXT_SECTIONS, OTHER_TEXT_SECTIONS + +/* init data sections */ +static const char *const init_data_sections[] = + { ALL_INIT_DATA_SECTIONS, NULL }; + +/* all init sections */ +static const char *const init_sections[] = { ALL_INIT_SECTIONS, NULL }; + +/* All init and exit sections (code + data) */ +static const char *const init_exit_sections[] = + {ALL_INIT_SECTIONS, ALL_EXIT_SECTIONS, NULL }; + +/* all text sections */ +static const char *const text_sections[] = { ALL_TEXT_SECTIONS, NULL }; + +/* data section */ +static const char *const data_sections[] = { DATA_SECTIONS, NULL }; + + +/* symbols in .data that may refer to init/exit sections */ +#define DEFAULT_SYMBOL_WHITE_LIST \ + "*driver", \ + "*_template", /* scsi uses *_template a lot */ \ + "*_timer", /* arm uses ops structures named _timer a lot */ \ + "*_sht", /* scsi also used *_sht to some extent */ \ + "*_ops", \ + "*_probe", \ + "*_probe_one", \ + "*_console" + +static const char *const head_sections[] = { ".head.text*", NULL }; +static const char *const linker_symbols[] = + { "__init_begin", "_sinittext", "_einittext", NULL }; +static const char *const optim_symbols[] = { "*.constprop.*", NULL }; + +enum mismatch { + TEXT_TO_ANY_INIT, + DATA_TO_ANY_INIT, + TEXT_TO_ANY_EXIT, + DATA_TO_ANY_EXIT, + XXXINIT_TO_SOME_INIT, + XXXEXIT_TO_SOME_EXIT, + ANY_INIT_TO_ANY_EXIT, + ANY_EXIT_TO_ANY_INIT, + EXPORT_TO_INIT_EXIT, + EXTABLE_TO_NON_TEXT, +}; + +/** + * Describe how to match sections on different criterias: + * + * @fromsec: Array of sections to be matched. + * + * @bad_tosec: Relocations applied to a section in @fromsec to a section in + * this array is forbidden (black-list). Can be empty. + * + * @good_tosec: Relocations applied to a section in @fromsec must be + * targetting sections in this array (white-list). Can be empty. + * + * @mismatch: Type of mismatch. + * + * @symbol_white_list: Do not match a relocation to a symbol in this list + * even if it is targetting a section in @bad_to_sec. + * + * @handler: Specific handler to call when a match is found. If NULL, + * default_mismatch_handler() will be called. + * + */ +struct sectioncheck { + const char *fromsec[20]; + const char *bad_tosec[20]; + const char *good_tosec[20]; + enum mismatch mismatch; + const char *symbol_white_list[20]; + void (*handler)(const char *modname, struct elf_info *elf, + const struct sectioncheck* const mismatch, + Elf_Rela *r, Elf_Sym *sym, const char *fromsec); + +}; + +static void extable_mismatch_handler(const char *modname, struct elf_info *elf, + const struct sectioncheck* const mismatch, + Elf_Rela *r, Elf_Sym *sym, + const char *fromsec); + +static const struct sectioncheck sectioncheck[] = { +/* Do not reference init/exit code/data from + * normal code and data + */ +{ + .fromsec = { TEXT_SECTIONS, NULL }, + .bad_tosec = { ALL_INIT_SECTIONS, NULL }, + .mismatch = TEXT_TO_ANY_INIT, + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, +}, +{ + .fromsec = { DATA_SECTIONS, NULL }, + .bad_tosec = { ALL_XXXINIT_SECTIONS, NULL }, + .mismatch = DATA_TO_ANY_INIT, + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, +}, +{ + .fromsec = { DATA_SECTIONS, NULL }, + .bad_tosec = { INIT_SECTIONS, NULL }, + .mismatch = DATA_TO_ANY_INIT, + .symbol_white_list = { + "*_template", "*_timer", "*_sht", "*_ops", + "*_probe", "*_probe_one", "*_console", NULL + }, +}, +{ + .fromsec = { TEXT_SECTIONS, NULL }, + .bad_tosec = { ALL_EXIT_SECTIONS, NULL }, + .mismatch = TEXT_TO_ANY_EXIT, + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, +}, +{ + .fromsec = { DATA_SECTIONS, NULL }, + .bad_tosec = { ALL_EXIT_SECTIONS, NULL }, + .mismatch = DATA_TO_ANY_EXIT, + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, +}, +/* Do not reference init code/data from meminit code/data */ +{ + .fromsec = { ALL_XXXINIT_SECTIONS, NULL }, + .bad_tosec = { INIT_SECTIONS, NULL }, + .mismatch = XXXINIT_TO_SOME_INIT, + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, +}, +/* Do not reference exit code/data from memexit code/data */ +{ + .fromsec = { ALL_XXXEXIT_SECTIONS, NULL }, + .bad_tosec = { EXIT_SECTIONS, NULL }, + .mismatch = XXXEXIT_TO_SOME_EXIT, + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, +}, +/* Do not use exit code/data from init code */ +{ + .fromsec = { ALL_INIT_SECTIONS, NULL }, + .bad_tosec = { ALL_EXIT_SECTIONS, NULL }, + .mismatch = ANY_INIT_TO_ANY_EXIT, + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, +}, +/* Do not use init code/data from exit code */ +{ + .fromsec = { ALL_EXIT_SECTIONS, NULL }, + .bad_tosec = { ALL_INIT_SECTIONS, NULL }, + .mismatch = ANY_EXIT_TO_ANY_INIT, + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, +}, +{ + .fromsec = { ALL_PCI_INIT_SECTIONS, NULL }, + .bad_tosec = { INIT_SECTIONS, NULL }, + .mismatch = ANY_INIT_TO_ANY_EXIT, + .symbol_white_list = { NULL }, +}, +/* Do not export init/exit functions or data */ +{ + .fromsec = { "___ksymtab*", NULL }, + .bad_tosec = { INIT_SECTIONS, EXIT_SECTIONS, NULL }, + .mismatch = EXPORT_TO_INIT_EXIT, + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, +}, +{ + .fromsec = { "__ex_table", NULL }, + /* If you're adding any new black-listed sections in here, consider + * adding a special 'printer' for them in scripts/check_extable. + */ + .bad_tosec = { ".altinstr_replacement", NULL }, + .good_tosec = {ALL_TEXT_SECTIONS , NULL}, + .mismatch = EXTABLE_TO_NON_TEXT, + .handler = extable_mismatch_handler, +} +}; + +static const struct sectioncheck *section_mismatch( + const char *fromsec, const char *tosec) +{ + int i; + int elems = sizeof(sectioncheck) / sizeof(struct sectioncheck); + const struct sectioncheck *check = §ioncheck[0]; + + /* + * The target section could be the SHT_NUL section when we're + * handling relocations to un-resolved symbols, trying to match it + * doesn't make much sense and causes build failures on parisc + * architectures. + */ + if (*tosec == '\0') + return NULL; + + for (i = 0; i < elems; i++) { + if (match(fromsec, check->fromsec)) { + if (check->bad_tosec[0] && match(tosec, check->bad_tosec)) + return check; + if (check->good_tosec[0] && !match(tosec, check->good_tosec)) + return check; + } + check++; + } + return NULL; +} + +/** + * Whitelist to allow certain references to pass with no warning. + * + * Pattern 1: + * If a module parameter is declared __initdata and permissions=0 + * then this is legal despite the warning generated. + * We cannot see value of permissions here, so just ignore + * this pattern. + * The pattern is identified by: + * tosec = .init.data + * fromsec = .data* + * atsym =__param* + * + * Pattern 1a: + * module_param_call() ops can refer to __init set function if permissions=0 + * The pattern is identified by: + * tosec = .init.text + * fromsec = .data* + * atsym = __param_ops_* + * + * Pattern 2: + * Many drivers utilise a *driver container with references to + * add, remove, probe functions etc. + * the pattern is identified by: + * tosec = init or exit section + * fromsec = data section + * atsym = *driver, *_template, *_sht, *_ops, *_probe, + * *probe_one, *_console, *_timer + * + * Pattern 3: + * Whitelist all references from .head.text to any init section + * + * Pattern 4: + * Some symbols belong to init section but still it is ok to reference + * these from non-init sections as these symbols don't have any memory + * allocated for them and symbol address and value are same. So even + * if init section is freed, its ok to reference those symbols. + * For ex. symbols marking the init section boundaries. + * This pattern is identified by + * refsymname = __init_begin, _sinittext, _einittext + * + * Pattern 5: + * GCC may optimize static inlines when fed constant arg(s) resulting + * in functions like cpumask_empty() -- generating an associated symbol + * cpumask_empty.constprop.3 that appears in the audit. If the const that + * is passed in comes from __init, like say nmi_ipi_mask, we get a + * meaningless section warning. May need to add isra symbols too... + * This pattern is identified by + * tosec = init section + * fromsec = text section + * refsymname = *.constprop.* + * + * Pattern 6: + * Hide section mismatch warnings for ELF local symbols. The goal + * is to eliminate false positive modpost warnings caused by + * compiler-generated ELF local symbol names such as ".LANCHOR1". + * Autogenerated symbol names bypass modpost's "Pattern 2" + * whitelisting, which relies on pattern-matching against symbol + * names to work. (One situation where gcc can autogenerate ELF + * local symbols is when "-fsection-anchors" is used.) + **/ +static int secref_whitelist(const struct sectioncheck *mismatch, + const char *fromsec, const char *fromsym, + const char *tosec, const char *tosym) +{ + /* Check for pattern 1 */ + if (match(tosec, init_data_sections) && + match(fromsec, data_sections) && + strstarts(fromsym, "__param")) + return 0; + + /* Check for pattern 1a */ + if (strcmp(tosec, ".init.text") == 0 && + match(fromsec, data_sections) && + strstarts(fromsym, "__param_ops_")) + return 0; + + /* Check for pattern 2 */ + if (match(tosec, init_exit_sections) && + match(fromsec, data_sections) && + match(fromsym, mismatch->symbol_white_list)) + return 0; + + /* Check for pattern 3 */ + if (match(fromsec, head_sections) && + match(tosec, init_sections)) + return 0; + + /* Check for pattern 4 */ + if (match(tosym, linker_symbols)) + return 0; + + /* Check for pattern 5 */ + if (match(fromsec, text_sections) && + match(tosec, init_sections) && + match(fromsym, optim_symbols)) + return 0; + + /* Check for pattern 6 */ + if (strstarts(fromsym, ".L")) + return 0; + + return 1; +} + +static inline int is_arm_mapping_symbol(const char *str) +{ + return str[0] == '$' && + (str[1] == 'a' || str[1] == 'd' || str[1] == 't' || str[1] == 'x') + && (str[2] == '\0' || str[2] == '.'); +} + +/* + * If there's no name there, ignore it; likewise, ignore it if it's + * one of the magic symbols emitted used by current ARM tools. + * + * Otherwise if find_symbols_between() returns those symbols, they'll + * fail the whitelist tests and cause lots of false alarms ... fixable + * only by merging __exit and __init sections into __text, bloating + * the kernel (which is especially evil on embedded platforms). + */ +static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym) +{ + const char *name = elf->strtab + sym->st_name; + + if (!name || !strlen(name)) + return 0; + return !is_arm_mapping_symbol(name); +} + +/** + * Find symbol based on relocation record info. + * In some cases the symbol supplied is a valid symbol so + * return refsym. If st_name != 0 we assume this is a valid symbol. + * In other cases the symbol needs to be looked up in the symbol table + * based on section and address. + * **/ +static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr, + Elf_Sym *relsym) +{ + Elf_Sym *sym; + Elf_Sym *near = NULL; + Elf64_Sword distance = 20; + Elf64_Sword d; + unsigned int relsym_secindex; + + if (relsym->st_name != 0) + return relsym; + + relsym_secindex = get_secindex(elf, relsym); + for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) { + if (get_secindex(elf, sym) != relsym_secindex) + continue; + if (ELF_ST_TYPE(sym->st_info) == STT_SECTION) + continue; + if (!is_valid_name(elf, sym)) + continue; + if (sym->st_value == addr) + return sym; + /* Find a symbol nearby - addr are maybe negative */ + d = sym->st_value - addr; + if (d < 0) + d = addr - sym->st_value; + if (d < distance) { + distance = d; + near = sym; + } + } + /* We need a close match */ + if (distance < 20) + return near; + else + return NULL; +} + +/* + * Find symbols before or equal addr and after addr - in the section sec. + * If we find two symbols with equal offset prefer one with a valid name. + * The ELF format may have a better way to detect what type of symbol + * it is, but this works for now. + **/ +static Elf_Sym *find_elf_symbol2(struct elf_info *elf, Elf_Addr addr, + const char *sec) +{ + Elf_Sym *sym; + Elf_Sym *near = NULL; + Elf_Addr distance = ~0; + + for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) { + const char *symsec; + + if (is_shndx_special(sym->st_shndx)) + continue; + symsec = sec_name(elf, get_secindex(elf, sym)); + if (strcmp(symsec, sec) != 0) + continue; + if (!is_valid_name(elf, sym)) + continue; + if (sym->st_value <= addr) { + if ((addr - sym->st_value) < distance) { + distance = addr - sym->st_value; + near = sym; + } else if ((addr - sym->st_value) == distance) { + near = sym; + } + } + } + return near; +} + +/* + * Convert a section name to the function/data attribute + * .init.text => __init + * .memexitconst => __memconst + * etc. + * + * The memory of returned value has been allocated on a heap. The user of this + * method should free it after usage. +*/ +static char *sec2annotation(const char *s) +{ + if (match(s, init_exit_sections)) { + char *p = NOFAIL(malloc(20)); + char *r = p; + + *p++ = '_'; + *p++ = '_'; + if (*s == '.') + s++; + while (*s && *s != '.') + *p++ = *s++; + *p = '\0'; + if (*s == '.') + s++; + if (strstr(s, "rodata") != NULL) + strcat(p, "const "); + else if (strstr(s, "data") != NULL) + strcat(p, "data "); + else + strcat(p, " "); + return r; + } else { + return NOFAIL(strdup("")); + } +} + +static int is_function(Elf_Sym *sym) +{ + if (sym) + return ELF_ST_TYPE(sym->st_info) == STT_FUNC; + else + return -1; +} + +static void print_section_list(const char * const list[20]) +{ + const char *const *s = list; + + while (*s) { + fprintf(stderr, "%s", *s); + s++; + if (*s) + fprintf(stderr, ", "); + } + fprintf(stderr, "\n"); +} + +static inline void get_pretty_name(int is_func, const char** name, const char** name_p) +{ + switch (is_func) { + case 0: *name = "variable"; *name_p = ""; break; + case 1: *name = "function"; *name_p = "()"; break; + default: *name = "(unknown reference)"; *name_p = ""; break; + } +} + +/* + * Print a warning about a section mismatch. + * Try to find symbols near it so user can find it. + * Check whitelist before warning - it may be a false positive. + */ +static void report_sec_mismatch(const char *modname, + const struct sectioncheck *mismatch, + const char *fromsec, + unsigned long long fromaddr, + const char *fromsym, + int from_is_func, + const char *tosec, const char *tosym, + int to_is_func) +{ + const char *from, *from_p; + const char *to, *to_p; + char *prl_from; + char *prl_to; + + sec_mismatch_count++; + + get_pretty_name(from_is_func, &from, &from_p); + get_pretty_name(to_is_func, &to, &to_p); + + warn("%s(%s+0x%llx): Section mismatch in reference from the %s %s%s " + "to the %s %s:%s%s\n", + modname, fromsec, fromaddr, from, fromsym, from_p, to, tosec, + tosym, to_p); + + switch (mismatch->mismatch) { + case TEXT_TO_ANY_INIT: + prl_from = sec2annotation(fromsec); + prl_to = sec2annotation(tosec); + fprintf(stderr, + "The function %s%s() references\n" + "the %s %s%s%s.\n" + "This is often because %s lacks a %s\n" + "annotation or the annotation of %s is wrong.\n", + prl_from, fromsym, + to, prl_to, tosym, to_p, + fromsym, prl_to, tosym); + free(prl_from); + free(prl_to); + break; + case DATA_TO_ANY_INIT: { + prl_to = sec2annotation(tosec); + fprintf(stderr, + "The variable %s references\n" + "the %s %s%s%s\n" + "If the reference is valid then annotate the\n" + "variable with __init* or __refdata (see linux/init.h) " + "or name the variable:\n", + fromsym, to, prl_to, tosym, to_p); + print_section_list(mismatch->symbol_white_list); + free(prl_to); + break; + } + case TEXT_TO_ANY_EXIT: + prl_to = sec2annotation(tosec); + fprintf(stderr, + "The function %s() references a %s in an exit section.\n" + "Often the %s %s%s has valid usage outside the exit section\n" + "and the fix is to remove the %sannotation of %s.\n", + fromsym, to, to, tosym, to_p, prl_to, tosym); + free(prl_to); + break; + case DATA_TO_ANY_EXIT: { + prl_to = sec2annotation(tosec); + fprintf(stderr, + "The variable %s references\n" + "the %s %s%s%s\n" + "If the reference is valid then annotate the\n" + "variable with __exit* (see linux/init.h) or " + "name the variable:\n", + fromsym, to, prl_to, tosym, to_p); + print_section_list(mismatch->symbol_white_list); + free(prl_to); + break; + } + case XXXINIT_TO_SOME_INIT: + case XXXEXIT_TO_SOME_EXIT: + prl_from = sec2annotation(fromsec); + prl_to = sec2annotation(tosec); + fprintf(stderr, + "The %s %s%s%s references\n" + "a %s %s%s%s.\n" + "If %s is only used by %s then\n" + "annotate %s with a matching annotation.\n", + from, prl_from, fromsym, from_p, + to, prl_to, tosym, to_p, + tosym, fromsym, tosym); + free(prl_from); + free(prl_to); + break; + case ANY_INIT_TO_ANY_EXIT: + prl_from = sec2annotation(fromsec); + prl_to = sec2annotation(tosec); + fprintf(stderr, + "The %s %s%s%s references\n" + "a %s %s%s%s.\n" + "This is often seen when error handling " + "in the init function\n" + "uses functionality in the exit path.\n" + "The fix is often to remove the %sannotation of\n" + "%s%s so it may be used outside an exit section.\n", + from, prl_from, fromsym, from_p, + to, prl_to, tosym, to_p, + prl_to, tosym, to_p); + free(prl_from); + free(prl_to); + break; + case ANY_EXIT_TO_ANY_INIT: + prl_from = sec2annotation(fromsec); + prl_to = sec2annotation(tosec); + fprintf(stderr, + "The %s %s%s%s references\n" + "a %s %s%s%s.\n" + "This is often seen when error handling " + "in the exit function\n" + "uses functionality in the init path.\n" + "The fix is often to remove the %sannotation of\n" + "%s%s so it may be used outside an init section.\n", + from, prl_from, fromsym, from_p, + to, prl_to, tosym, to_p, + prl_to, tosym, to_p); + free(prl_from); + free(prl_to); + break; + case EXPORT_TO_INIT_EXIT: + prl_to = sec2annotation(tosec); + fprintf(stderr, + "The symbol %s is exported and annotated %s\n" + "Fix this by removing the %sannotation of %s " + "or drop the export.\n", + tosym, prl_to, prl_to, tosym); + free(prl_to); + break; + case EXTABLE_TO_NON_TEXT: + fatal("There's a special handler for this mismatch type, " + "we should never get here."); + break; + } + fprintf(stderr, "\n"); +} + +static void default_mismatch_handler(const char *modname, struct elf_info *elf, + const struct sectioncheck* const mismatch, + Elf_Rela *r, Elf_Sym *sym, const char *fromsec) +{ + const char *tosec; + Elf_Sym *to; + Elf_Sym *from; + const char *tosym; + const char *fromsym; + + from = find_elf_symbol2(elf, r->r_offset, fromsec); + fromsym = sym_name(elf, from); + + if (strstarts(fromsym, "reference___initcall")) + return; + + tosec = sec_name(elf, get_secindex(elf, sym)); + to = find_elf_symbol(elf, r->r_addend, sym); + tosym = sym_name(elf, to); + + /* check whitelist - we may ignore it */ + if (secref_whitelist(mismatch, + fromsec, fromsym, tosec, tosym)) { + report_sec_mismatch(modname, mismatch, + fromsec, r->r_offset, fromsym, + is_function(from), tosec, tosym, + is_function(to)); + } +} + +static int is_executable_section(struct elf_info* elf, unsigned int section_index) +{ + if (section_index > elf->num_sections) + fatal("section_index is outside elf->num_sections!\n"); + + return ((elf->sechdrs[section_index].sh_flags & SHF_EXECINSTR) == SHF_EXECINSTR); +} + +/* + * We rely on a gross hack in section_rel[a]() calling find_extable_entry_size() + * to know the sizeof(struct exception_table_entry) for the target architecture. + */ +static unsigned int extable_entry_size = 0; +static void find_extable_entry_size(const char* const sec, const Elf_Rela* r) +{ + /* + * If we're currently checking the second relocation within __ex_table, + * that relocation offset tells us the offsetof(struct + * exception_table_entry, fixup) which is equal to sizeof(struct + * exception_table_entry) divided by two. We use that to our advantage + * since there's no portable way to get that size as every architecture + * seems to go with different sized types. Not pretty but better than + * hard-coding the size for every architecture.. + */ + if (!extable_entry_size) + extable_entry_size = r->r_offset * 2; +} + +static inline bool is_extable_fault_address(Elf_Rela *r) +{ + /* + * extable_entry_size is only discovered after we've handled the + * _second_ relocation in __ex_table, so only abort when we're not + * handling the first reloc and extable_entry_size is zero. + */ + if (r->r_offset && extable_entry_size == 0) + fatal("extable_entry size hasn't been discovered!\n"); + + return ((r->r_offset == 0) || + (r->r_offset % extable_entry_size == 0)); +} + +#define is_second_extable_reloc(Start, Cur, Sec) \ + (((Cur) == (Start) + 1) && (strcmp("__ex_table", (Sec)) == 0)) + +static void report_extable_warnings(const char* modname, struct elf_info* elf, + const struct sectioncheck* const mismatch, + Elf_Rela* r, Elf_Sym* sym, + const char* fromsec, const char* tosec) +{ + Elf_Sym* fromsym = find_elf_symbol2(elf, r->r_offset, fromsec); + const char* fromsym_name = sym_name(elf, fromsym); + Elf_Sym* tosym = find_elf_symbol(elf, r->r_addend, sym); + const char* tosym_name = sym_name(elf, tosym); + const char* from_pretty_name; + const char* from_pretty_name_p; + const char* to_pretty_name; + const char* to_pretty_name_p; + + get_pretty_name(is_function(fromsym), + &from_pretty_name, &from_pretty_name_p); + get_pretty_name(is_function(tosym), + &to_pretty_name, &to_pretty_name_p); + + warn("%s(%s+0x%lx): Section mismatch in reference" + " from the %s %s%s to the %s %s:%s%s\n", + modname, fromsec, (long)r->r_offset, from_pretty_name, + fromsym_name, from_pretty_name_p, + to_pretty_name, tosec, tosym_name, to_pretty_name_p); + + if (!match(tosec, mismatch->bad_tosec) && + is_executable_section(elf, get_secindex(elf, sym))) + fprintf(stderr, + "The relocation at %s+0x%lx references\n" + "section \"%s\" which is not in the list of\n" + "authorized sections. If you're adding a new section\n" + "and/or if this reference is valid, add \"%s\" to the\n" + "list of authorized sections to jump to on fault.\n" + "This can be achieved by adding \"%s\" to \n" + "OTHER_TEXT_SECTIONS in scripts/mod/modpost.c.\n", + fromsec, (long)r->r_offset, tosec, tosec, tosec); +} + +static void extable_mismatch_handler(const char* modname, struct elf_info *elf, + const struct sectioncheck* const mismatch, + Elf_Rela* r, Elf_Sym* sym, + const char *fromsec) +{ + const char* tosec = sec_name(elf, get_secindex(elf, sym)); + + sec_mismatch_count++; + + report_extable_warnings(modname, elf, mismatch, r, sym, fromsec, tosec); + + if (match(tosec, mismatch->bad_tosec)) + fatal("The relocation at %s+0x%lx references\n" + "section \"%s\" which is black-listed.\n" + "Something is seriously wrong and should be fixed.\n" + "You might get more information about where this is\n" + "coming from by using scripts/check_extable.sh %s\n", + fromsec, (long)r->r_offset, tosec, modname); + else if (!is_executable_section(elf, get_secindex(elf, sym))) { + if (is_extable_fault_address(r)) + fatal("The relocation at %s+0x%lx references\n" + "section \"%s\" which is not executable, IOW\n" + "it is not possible for the kernel to fault\n" + "at that address. Something is seriously wrong\n" + "and should be fixed.\n", + fromsec, (long)r->r_offset, tosec); + else + fatal("The relocation at %s+0x%lx references\n" + "section \"%s\" which is not executable, IOW\n" + "the kernel will fault if it ever tries to\n" + "jump to it. Something is seriously wrong\n" + "and should be fixed.\n", + fromsec, (long)r->r_offset, tosec); + } +} + +static void check_section_mismatch(const char *modname, struct elf_info *elf, + Elf_Rela *r, Elf_Sym *sym, const char *fromsec) +{ + const char *tosec = sec_name(elf, get_secindex(elf, sym)); + const struct sectioncheck *mismatch = section_mismatch(fromsec, tosec); + + if (mismatch) { + if (mismatch->handler) + mismatch->handler(modname, elf, mismatch, + r, sym, fromsec); + else + default_mismatch_handler(modname, elf, mismatch, + r, sym, fromsec); + } +} + +static unsigned int *reloc_location(struct elf_info *elf, + Elf_Shdr *sechdr, Elf_Rela *r) +{ + return sym_get_data_by_offset(elf, sechdr->sh_info, r->r_offset); +} + +static int addend_386_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r) +{ + unsigned int r_typ = ELF_R_TYPE(r->r_info); + unsigned int *location = reloc_location(elf, sechdr, r); + + switch (r_typ) { + case R_386_32: + r->r_addend = TO_NATIVE(*location); + break; + case R_386_PC32: + r->r_addend = TO_NATIVE(*location) + 4; + /* For CONFIG_RELOCATABLE=y */ + if (elf->hdr->e_type == ET_EXEC) + r->r_addend += r->r_offset; + break; + } + return 0; +} + +#ifndef R_ARM_CALL +#define R_ARM_CALL 28 +#endif +#ifndef R_ARM_JUMP24 +#define R_ARM_JUMP24 29 +#endif + +#ifndef R_ARM_THM_CALL +#define R_ARM_THM_CALL 10 +#endif +#ifndef R_ARM_THM_JUMP24 +#define R_ARM_THM_JUMP24 30 +#endif +#ifndef R_ARM_THM_JUMP19 +#define R_ARM_THM_JUMP19 51 +#endif + +static int addend_arm_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r) +{ + unsigned int r_typ = ELF_R_TYPE(r->r_info); + + switch (r_typ) { + case R_ARM_ABS32: + /* From ARM ABI: (S + A) | T */ + r->r_addend = (int)(long) + (elf->symtab_start + ELF_R_SYM(r->r_info)); + break; + case R_ARM_PC24: + case R_ARM_CALL: + case R_ARM_JUMP24: + case R_ARM_THM_CALL: + case R_ARM_THM_JUMP24: + case R_ARM_THM_JUMP19: + /* From ARM ABI: ((S + A) | T) - P */ + r->r_addend = (int)(long)(elf->hdr + + sechdr->sh_offset + + (r->r_offset - sechdr->sh_addr)); + break; + default: + return 1; + } + return 0; +} + +static int addend_mips_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r) +{ + unsigned int r_typ = ELF_R_TYPE(r->r_info); + unsigned int *location = reloc_location(elf, sechdr, r); + unsigned int inst; + + if (r_typ == R_MIPS_HI16) + return 1; /* skip this */ + inst = TO_NATIVE(*location); + switch (r_typ) { + case R_MIPS_LO16: + r->r_addend = inst & 0xffff; + break; + case R_MIPS_26: + r->r_addend = (inst & 0x03ffffff) << 2; + break; + case R_MIPS_32: + r->r_addend = inst; + break; + } + return 0; +} + +#ifndef EM_LOONGARCH +#define EM_LOONGARCH 258 +#endif + +#ifndef R_LARCH_SUB32 +#define R_LARCH_SUB32 55 +#endif + +static void section_rela(const char *modname, struct elf_info *elf, + Elf_Shdr *sechdr) +{ + Elf_Sym *sym; + Elf_Rela *rela; + Elf_Rela r; + unsigned int r_sym; + const char *fromsec; + + Elf_Rela *start = (void *)elf->hdr + sechdr->sh_offset; + Elf_Rela *stop = (void *)start + sechdr->sh_size; + + fromsec = sech_name(elf, sechdr); + fromsec += strlen(".rela"); + /* if from section (name) is know good then skip it */ + if (match(fromsec, section_white_list)) + return; + + for (rela = start; rela < stop; rela++) { + r.r_offset = TO_NATIVE(rela->r_offset); +#if KERNEL_ELFCLASS == ELFCLASS64 + if (elf->hdr->e_machine == EM_MIPS) { + unsigned int r_typ; + r_sym = ELF64_MIPS_R_SYM(rela->r_info); + r_sym = TO_NATIVE(r_sym); + r_typ = ELF64_MIPS_R_TYPE(rela->r_info); + r.r_info = ELF64_R_INFO(r_sym, r_typ); + } else { + r.r_info = TO_NATIVE(rela->r_info); + r_sym = ELF_R_SYM(r.r_info); + } +#else + r.r_info = TO_NATIVE(rela->r_info); + r_sym = ELF_R_SYM(r.r_info); +#endif + r.r_addend = TO_NATIVE(rela->r_addend); + switch (elf->hdr->e_machine) { + case EM_LOONGARCH: + if (!strcmp("__ex_table", fromsec) && + ELF_R_TYPE(r.r_info) == R_LARCH_SUB32) + continue; + break; + } + sym = elf->symtab_start + r_sym; + /* Skip special sections */ + if (is_shndx_special(sym->st_shndx)) + continue; + if (is_second_extable_reloc(start, rela, fromsec)) + find_extable_entry_size(fromsec, &r); + check_section_mismatch(modname, elf, &r, sym, fromsec); + } +} + +static void section_rel(const char *modname, struct elf_info *elf, + Elf_Shdr *sechdr) +{ + Elf_Sym *sym; + Elf_Rel *rel; + Elf_Rela r; + unsigned int r_sym; + const char *fromsec; + + Elf_Rel *start = (void *)elf->hdr + sechdr->sh_offset; + Elf_Rel *stop = (void *)start + sechdr->sh_size; + + fromsec = sech_name(elf, sechdr); + fromsec += strlen(".rel"); + /* if from section (name) is know good then skip it */ + if (match(fromsec, section_white_list)) + return; + + for (rel = start; rel < stop; rel++) { + r.r_offset = TO_NATIVE(rel->r_offset); +#if KERNEL_ELFCLASS == ELFCLASS64 + if (elf->hdr->e_machine == EM_MIPS) { + unsigned int r_typ; + r_sym = ELF64_MIPS_R_SYM(rel->r_info); + r_sym = TO_NATIVE(r_sym); + r_typ = ELF64_MIPS_R_TYPE(rel->r_info); + r.r_info = ELF64_R_INFO(r_sym, r_typ); + } else { + r.r_info = TO_NATIVE(rel->r_info); + r_sym = ELF_R_SYM(r.r_info); + } +#else + r.r_info = TO_NATIVE(rel->r_info); + r_sym = ELF_R_SYM(r.r_info); +#endif + r.r_addend = 0; + switch (elf->hdr->e_machine) { + case EM_386: + if (addend_386_rel(elf, sechdr, &r)) + continue; + break; + case EM_ARM: + if (addend_arm_rel(elf, sechdr, &r)) + continue; + break; + case EM_MIPS: + if (addend_mips_rel(elf, sechdr, &r)) + continue; + break; + } + sym = elf->symtab_start + r_sym; + /* Skip special sections */ + if (is_shndx_special(sym->st_shndx)) + continue; + if (is_second_extable_reloc(start, rel, fromsec)) + find_extable_entry_size(fromsec, &r); + check_section_mismatch(modname, elf, &r, sym, fromsec); + } +} + +/** + * A module includes a number of sections that are discarded + * either when loaded or when used as built-in. + * For loaded modules all functions marked __init and all data + * marked __initdata will be discarded when the module has been initialized. + * Likewise for modules used built-in the sections marked __exit + * are discarded because __exit marked function are supposed to be called + * only when a module is unloaded which never happens for built-in modules. + * The check_sec_ref() function traverses all relocation records + * to find all references to a section that reference a section that will + * be discarded and warns about it. + **/ +static void check_sec_ref(struct module *mod, const char *modname, + struct elf_info *elf) +{ + int i; + Elf_Shdr *sechdrs = elf->sechdrs; + + /* Walk through all sections */ + for (i = 0; i < elf->num_sections; i++) { + check_section(modname, elf, &elf->sechdrs[i]); + /* We want to process only relocation sections and not .init */ + if (sechdrs[i].sh_type == SHT_RELA) + section_rela(modname, elf, &elf->sechdrs[i]); + else if (sechdrs[i].sh_type == SHT_REL) + section_rel(modname, elf, &elf->sechdrs[i]); + } +} + +static char *remove_dot(char *s) +{ + size_t n = strcspn(s, "."); + + if (n && s[n]) { + size_t m = strspn(s + n + 1, "0123456789"); + if (m && (s[n + m + 1] == '.' || s[n + m + 1] == 0)) + s[n] = 0; + } + return s; +} + +static void read_symbols(const char *modname) +{ + const char *symname; + char *version; + char *license; + char *namespace; + struct module *mod; + struct elf_info info = { }; + Elf_Sym *sym; + + if (!parse_elf(&info, modname)) + return; + + { + char *tmp; + + /* strip trailing .o */ + tmp = NOFAIL(strdup(modname)); + tmp[strlen(tmp) - 2] = '\0'; + mod = new_module(tmp); + free(tmp); + } + + if (!mod->is_vmlinux) { + license = get_modinfo(&info, "license"); + if (!license) + warn("missing MODULE_LICENSE() in %s\n", modname); + while (license) { + if (license_is_gpl_compatible(license)) + mod->gpl_compatible = 1; + else { + mod->gpl_compatible = 0; + break; + } + license = get_next_modinfo(&info, "license", license); + } + + namespace = get_modinfo(&info, "import_ns"); + while (namespace) { + add_namespace(&mod->imported_namespaces, namespace); + namespace = get_next_modinfo(&info, "import_ns", + namespace); + } + } + + for (sym = info.symtab_start; sym < info.symtab_stop; sym++) { + symname = remove_dot(info.strtab + sym->st_name); + + handle_symbol(mod, &info, sym, symname); + handle_moddevtable(mod, &info, sym, symname); + } + + for (sym = info.symtab_start; sym < info.symtab_stop; sym++) { + symname = remove_dot(info.strtab + sym->st_name); + + /* Apply symbol namespaces from __kstrtabns_<symbol> entries. */ + if (strstarts(symname, "__kstrtabns_")) + sym_update_namespace(symname + strlen("__kstrtabns_"), + namespace_from_kstrtabns(&info, + sym)); + + if (strstarts(symname, "__crc_")) + handle_modversion(mod, &info, sym, + symname + strlen("__crc_")); + } + + // check for static EXPORT_SYMBOL_* functions && global vars + for (sym = info.symtab_start; sym < info.symtab_stop; sym++) { + unsigned char bind = ELF_ST_BIND(sym->st_info); + + if (bind == STB_GLOBAL || bind == STB_WEAK) { + struct symbol *s = + find_symbol(remove_dot(info.strtab + + sym->st_name)); + + if (s) + s->is_static = 0; + } + } + + check_sec_ref(mod, modname, &info); + + if (!mod->is_vmlinux) { + version = get_modinfo(&info, "version"); + if (version || all_versions) + get_src_version(modname, mod->srcversion, + sizeof(mod->srcversion) - 1); + } + + parse_elf_finish(&info); + + /* Our trick to get versioning for module struct etc. - it's + * never passed as an argument to an exported function, so + * the automatic versioning doesn't pick it up, but it's really + * important anyhow */ + if (modversions) + mod->unres = alloc_symbol("module_layout", 0, mod->unres); +} + +static void read_symbols_from_files(const char *filename) +{ + FILE *in = stdin; + char fname[PATH_MAX]; + + if (strcmp(filename, "-") != 0) { + in = fopen(filename, "r"); + if (!in) + fatal("Can't open filenames file %s: %m", filename); + } + + while (fgets(fname, PATH_MAX, in) != NULL) { + if (strends(fname, "\n")) + fname[strlen(fname)-1] = '\0'; + read_symbols(fname); + } + + if (in != stdin) + fclose(in); +} + +#define SZ 500 + +/* We first write the generated file into memory using the + * following helper, then compare to the file on disk and + * only update the later if anything changed */ + +void __attribute__((format(printf, 2, 3))) buf_printf(struct buffer *buf, + const char *fmt, ...) +{ + char tmp[SZ]; + int len; + va_list ap; + + va_start(ap, fmt); + len = vsnprintf(tmp, SZ, fmt, ap); + buf_write(buf, tmp, len); + va_end(ap); +} + +void buf_write(struct buffer *buf, const char *s, int len) +{ + if (buf->size - buf->pos < len) { + buf->size += len + SZ; + buf->p = NOFAIL(realloc(buf->p, buf->size)); + } + strncpy(buf->p + buf->pos, s, len); + buf->pos += len; +} + +static void check_for_gpl_usage(enum export exp, const char *m, const char *s) +{ + switch (exp) { + case export_gpl: + fatal("GPL-incompatible module %s.ko uses GPL-only symbol '%s'\n", + m, s); + break; + case export_unused_gpl: + fatal("GPL-incompatible module %s.ko uses GPL-only symbol marked UNUSED '%s'\n", + m, s); + break; + case export_gpl_future: + warn("GPL-incompatible module %s.ko uses future GPL-only symbol '%s'\n", + m, s); + break; + case export_plain: + case export_unused: + case export_unknown: + /* ignore */ + break; + } +} + +static void check_for_unused(enum export exp, const char *m, const char *s) +{ + switch (exp) { + case export_unused: + case export_unused_gpl: + warn("module %s.ko uses symbol '%s' marked UNUSED\n", + m, s); + break; + default: + /* ignore */ + break; + } +} + +static int check_exports(struct module *mod) +{ + struct symbol *s, *exp; + int err = 0; + + for (s = mod->unres; s; s = s->next) { + const char *basename; + exp = find_symbol(s->name); + if (!exp || exp->module == mod) { + if (have_vmlinux && !s->weak) { + modpost_log(warn_unresolved ? LOG_WARN : LOG_ERROR, + "\"%s\" [%s.ko] undefined!\n", + s->name, mod->name); + if (!warn_unresolved) + err = 1; + } + continue; + } + basename = strrchr(mod->name, '/'); + if (basename) + basename++; + else + basename = mod->name; + + if (exp->namespace && + !module_imports_namespace(mod, exp->namespace)) { + modpost_log(allow_missing_ns_imports ? LOG_WARN : LOG_ERROR, + "module %s uses symbol %s from namespace %s, but does not import it.\n", + basename, exp->name, exp->namespace); + if (!allow_missing_ns_imports) + err = 1; + add_namespace(&mod->missing_namespaces, exp->namespace); + } + + if (!mod->gpl_compatible) + check_for_gpl_usage(exp->export, basename, exp->name); + check_for_unused(exp->export, basename, exp->name); + } + + return err; +} + +static int check_modname_len(struct module *mod) +{ + const char *mod_name; + + mod_name = strrchr(mod->name, '/'); + if (mod_name == NULL) + mod_name = mod->name; + else + mod_name++; + if (strlen(mod_name) >= MODULE_NAME_LEN) { + merror("module name is too long [%s.ko]\n", mod->name); + return 1; + } + + return 0; +} + +/** + * Header for the generated file + **/ +static void add_header(struct buffer *b, struct module *mod) +{ + buf_printf(b, "#include <linux/module.h>\n"); + /* + * Include build-salt.h after module.h in order to + * inherit the definitions. + */ + buf_printf(b, "#define INCLUDE_VERMAGIC\n"); + buf_printf(b, "#include <linux/build-salt.h>\n"); + buf_printf(b, "#include <linux/vermagic.h>\n"); + buf_printf(b, "#include <linux/compiler.h>\n"); + buf_printf(b, "\n"); + buf_printf(b, "BUILD_SALT;\n"); + buf_printf(b, "\n"); + buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n"); + buf_printf(b, "MODULE_INFO(name, KBUILD_MODNAME);\n"); + buf_printf(b, "\n"); + buf_printf(b, "__visible struct module __this_module\n"); + buf_printf(b, "__section(\".gnu.linkonce.this_module\") = {\n"); + buf_printf(b, "\t.name = KBUILD_MODNAME,\n"); + if (mod->has_init) + buf_printf(b, "\t.init = init_module,\n"); + if (mod->has_cleanup) + buf_printf(b, "#ifdef CONFIG_MODULE_UNLOAD\n" + "\t.exit = cleanup_module,\n" + "#endif\n"); + buf_printf(b, "\t.arch = MODULE_ARCH_INIT,\n"); + buf_printf(b, "};\n"); +} + +static void add_intree_flag(struct buffer *b, int is_intree) +{ + if (is_intree) + buf_printf(b, "\nMODULE_INFO(intree, \"Y\");\n"); +} + +/* Cannot check for assembler */ +static void add_retpoline(struct buffer *b) +{ + buf_printf(b, "\n#ifdef CONFIG_RETPOLINE\n"); + buf_printf(b, "MODULE_INFO(retpoline, \"Y\");\n"); + buf_printf(b, "#endif\n"); +} + +static void add_staging_flag(struct buffer *b, const char *name) +{ + if (strstarts(name, "drivers/staging")) + buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n"); +} + +/** + * Record CRCs for unresolved symbols + **/ +static int add_versions(struct buffer *b, struct module *mod) +{ + struct symbol *s, *exp; + int err = 0; + + for (s = mod->unres; s; s = s->next) { + exp = find_symbol(s->name); + if (!exp || exp->module == mod) + continue; + s->module = exp->module; + s->crc_valid = exp->crc_valid; + s->crc = exp->crc; + } + + if (!modversions) + return err; + + buf_printf(b, "\n"); + buf_printf(b, "static const struct modversion_info ____versions[]\n"); + buf_printf(b, "__used __section(\"__versions\") = {\n"); + + for (s = mod->unres; s; s = s->next) { + if (!s->module) + continue; + if (!s->crc_valid) { + warn("\"%s\" [%s.ko] has no CRC!\n", + s->name, mod->name); + continue; + } + if (strlen(s->name) >= MODULE_NAME_LEN) { + merror("too long symbol \"%s\" [%s.ko]\n", + s->name, mod->name); + err = 1; + break; + } + buf_printf(b, "\t{ %#8x, \"%s\" },\n", + s->crc, s->name); + } + + buf_printf(b, "};\n"); + + return err; +} + +static void add_depends(struct buffer *b, struct module *mod) +{ + struct symbol *s; + int first = 1; + + /* Clear ->seen flag of modules that own symbols needed by this. */ + for (s = mod->unres; s; s = s->next) + if (s->module) + s->module->seen = s->module->is_vmlinux; + + buf_printf(b, "\n"); + buf_printf(b, "MODULE_INFO(depends, \""); + for (s = mod->unres; s; s = s->next) { + const char *p; + if (!s->module) + continue; + + if (s->module->seen) + continue; + + s->module->seen = 1; + p = strrchr(s->module->name, '/'); + if (p) + p++; + else + p = s->module->name; + buf_printf(b, "%s%s", first ? "" : ",", p); + first = 0; + } + buf_printf(b, "\");\n"); +} + +static void add_srcversion(struct buffer *b, struct module *mod) +{ + if (mod->srcversion[0]) { + buf_printf(b, "\n"); + buf_printf(b, "MODULE_INFO(srcversion, \"%s\");\n", + mod->srcversion); + } +} + +static void write_buf(struct buffer *b, const char *fname) +{ + FILE *file; + + file = fopen(fname, "w"); + if (!file) { + perror(fname); + exit(1); + } + if (fwrite(b->p, 1, b->pos, file) != b->pos) { + perror(fname); + exit(1); + } + if (fclose(file) != 0) { + perror(fname); + exit(1); + } +} + +static void write_if_changed(struct buffer *b, const char *fname) +{ + char *tmp; + FILE *file; + struct stat st; + + file = fopen(fname, "r"); + if (!file) + goto write; + + if (fstat(fileno(file), &st) < 0) + goto close_write; + + if (st.st_size != b->pos) + goto close_write; + + tmp = NOFAIL(malloc(b->pos)); + if (fread(tmp, 1, b->pos, file) != b->pos) + goto free_write; + + if (memcmp(tmp, b->p, b->pos) != 0) + goto free_write; + + free(tmp); + fclose(file); + return; + + free_write: + free(tmp); + close_write: + fclose(file); + write: + write_buf(b, fname); +} + +/* parse Module.symvers file. line format: + * 0x12345678<tab>symbol<tab>module<tab>export<tab>namespace + **/ +static void read_dump(const char *fname) +{ + char *buf, *pos, *line; + + buf = read_text_file(fname); + if (!buf) + /* No symbol versions, silently ignore */ + return; + + pos = buf; + + while ((line = get_line(&pos))) { + char *symname, *namespace, *modname, *d, *export; + unsigned int crc; + struct module *mod; + struct symbol *s; + + if (!(symname = strchr(line, '\t'))) + goto fail; + *symname++ = '\0'; + if (!(modname = strchr(symname, '\t'))) + goto fail; + *modname++ = '\0'; + if (!(export = strchr(modname, '\t'))) + goto fail; + *export++ = '\0'; + if (!(namespace = strchr(export, '\t'))) + goto fail; + *namespace++ = '\0'; + + crc = strtoul(line, &d, 16); + if (*symname == '\0' || *modname == '\0' || *d != '\0') + goto fail; + mod = find_module(modname); + if (!mod) { + mod = new_module(modname); + mod->from_dump = 1; + } + s = sym_add_exported(symname, mod, export_no(export)); + s->is_static = 0; + sym_set_crc(symname, crc); + sym_update_namespace(symname, namespace); + } + free(buf); + return; +fail: + free(buf); + fatal("parse error in symbol dump file\n"); +} + +static void write_dump(const char *fname) +{ + struct buffer buf = { }; + struct symbol *symbol; + const char *namespace; + int n; + + for (n = 0; n < SYMBOL_HASH_SIZE ; n++) { + symbol = symbolhash[n]; + while (symbol) { + if (!symbol->module->from_dump) { + namespace = symbol->namespace; + buf_printf(&buf, "0x%08x\t%s\t%s\t%s\t%s\n", + symbol->crc, symbol->name, + symbol->module->name, + export_str(symbol->export), + namespace ? namespace : ""); + } + symbol = symbol->next; + } + } + write_buf(&buf, fname); + free(buf.p); +} + +static void write_namespace_deps_files(const char *fname) +{ + struct module *mod; + struct namespace_list *ns; + struct buffer ns_deps_buf = {}; + + for (mod = modules; mod; mod = mod->next) { + + if (mod->from_dump || !mod->missing_namespaces) + continue; + + buf_printf(&ns_deps_buf, "%s.ko:", mod->name); + + for (ns = mod->missing_namespaces; ns; ns = ns->next) + buf_printf(&ns_deps_buf, " %s", ns->namespace); + + buf_printf(&ns_deps_buf, "\n"); + } + + write_if_changed(&ns_deps_buf, fname); + free(ns_deps_buf.p); +} + +struct dump_list { + struct dump_list *next; + const char *file; +}; + +int main(int argc, char **argv) +{ + struct module *mod; + struct buffer buf = { }; + char *missing_namespace_deps = NULL; + char *dump_write = NULL, *files_source = NULL; + int opt; + int err; + int n; + struct dump_list *dump_read_start = NULL; + struct dump_list **dump_read_iter = &dump_read_start; + + while ((opt = getopt(argc, argv, "ei:mnT:o:awENd:")) != -1) { + switch (opt) { + case 'e': + external_module = 1; + break; + case 'i': + *dump_read_iter = + NOFAIL(calloc(1, sizeof(**dump_read_iter))); + (*dump_read_iter)->file = optarg; + dump_read_iter = &(*dump_read_iter)->next; + break; + case 'm': + modversions = 1; + break; + case 'n': + ignore_missing_files = 1; + break; + case 'o': + dump_write = optarg; + break; + case 'a': + all_versions = 1; + break; + case 'T': + files_source = optarg; + break; + case 'w': + warn_unresolved = 1; + break; + case 'E': + sec_mismatch_fatal = 1; + break; + case 'N': + allow_missing_ns_imports = 1; + break; + case 'd': + missing_namespace_deps = optarg; + break; + default: + exit(1); + } + } + + while (dump_read_start) { + struct dump_list *tmp; + + read_dump(dump_read_start->file); + tmp = dump_read_start->next; + free(dump_read_start); + dump_read_start = tmp; + } + + while (optind < argc) + read_symbols(argv[optind++]); + + if (files_source) + read_symbols_from_files(files_source); + + /* + * When there's no vmlinux, don't print warnings about + * unresolved symbols (since there'll be too many ;) + */ + if (!have_vmlinux) + warn("Symbol info of vmlinux is missing. Unresolved symbol check will be entirely skipped.\n"); + + err = 0; + + for (mod = modules; mod; mod = mod->next) { + char fname[PATH_MAX]; + + if (mod->is_vmlinux || mod->from_dump) + continue; + + buf.pos = 0; + + err |= check_modname_len(mod); + err |= check_exports(mod); + + add_header(&buf, mod); + add_intree_flag(&buf, !external_module); + add_retpoline(&buf); + add_staging_flag(&buf, mod->name); + err |= add_versions(&buf, mod); + add_depends(&buf, mod); + add_moddevtable(&buf, mod); + add_srcversion(&buf, mod); + + sprintf(fname, "%s.mod.c", mod->name); + write_if_changed(&buf, fname); + } + + if (missing_namespace_deps) + write_namespace_deps_files(missing_namespace_deps); + + if (dump_write) + write_dump(dump_write); + if (sec_mismatch_count && sec_mismatch_fatal) + fatal("Section mismatches detected.\n" + "Set CONFIG_SECTION_MISMATCH_WARN_ONLY=y to allow them.\n"); + for (n = 0; n < SYMBOL_HASH_SIZE; n++) { + struct symbol *s; + + for (s = symbolhash[n]; s; s = s->next) { + if (s->is_static) + warn("\"%s\" [%s] is a static %s\n", + s->name, s->module->name, + export_str(s->export)); + } + } + + free(buf.p); + + return err; +} diff --git a/src/net/scripts/mod/modpost.h b/src/net/scripts/mod/modpost.h new file mode 100644 index 0000000..3aa0527 --- /dev/null +++ b/src/net/scripts/mod/modpost.h @@ -0,0 +1,206 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/mman.h> +#include <fcntl.h> +#include <unistd.h> +#include <elf.h> + +#include "elfconfig.h" + +/* On BSD-alike OSes elf.h defines these according to host's word size */ +#undef ELF_ST_BIND +#undef ELF_ST_TYPE +#undef ELF_R_SYM +#undef ELF_R_TYPE + +#if KERNEL_ELFCLASS == ELFCLASS32 + +#define Elf_Ehdr Elf32_Ehdr +#define Elf_Shdr Elf32_Shdr +#define Elf_Sym Elf32_Sym +#define Elf_Addr Elf32_Addr +#define Elf_Sword Elf64_Sword +#define Elf_Section Elf32_Half +#define ELF_ST_BIND ELF32_ST_BIND +#define ELF_ST_TYPE ELF32_ST_TYPE + +#define Elf_Rel Elf32_Rel +#define Elf_Rela Elf32_Rela +#define ELF_R_SYM ELF32_R_SYM +#define ELF_R_TYPE ELF32_R_TYPE +#else + +#define Elf_Ehdr Elf64_Ehdr +#define Elf_Shdr Elf64_Shdr +#define Elf_Sym Elf64_Sym +#define Elf_Addr Elf64_Addr +#define Elf_Sword Elf64_Sxword +#define Elf_Section Elf64_Half +#define ELF_ST_BIND ELF64_ST_BIND +#define ELF_ST_TYPE ELF64_ST_TYPE + +#define Elf_Rel Elf64_Rel +#define Elf_Rela Elf64_Rela +#define ELF_R_SYM ELF64_R_SYM +#define ELF_R_TYPE ELF64_R_TYPE +#endif + +/* The 64-bit MIPS ELF ABI uses an unusual reloc format. */ +typedef struct +{ + Elf32_Word r_sym; /* Symbol index */ + unsigned char r_ssym; /* Special symbol for 2nd relocation */ + unsigned char r_type3; /* 3rd relocation type */ + unsigned char r_type2; /* 2nd relocation type */ + unsigned char r_type1; /* 1st relocation type */ +} _Elf64_Mips_R_Info; + +typedef union +{ + Elf64_Xword r_info_number; + _Elf64_Mips_R_Info r_info_fields; +} _Elf64_Mips_R_Info_union; + +#define ELF64_MIPS_R_SYM(i) \ + ((__extension__ (_Elf64_Mips_R_Info_union)(i)).r_info_fields.r_sym) + +#define ELF64_MIPS_R_TYPE(i) \ + ((__extension__ (_Elf64_Mips_R_Info_union)(i)).r_info_fields.r_type1) + +#if KERNEL_ELFDATA != HOST_ELFDATA + +static inline void __endian(const void *src, void *dest, unsigned int size) +{ + unsigned int i; + for (i = 0; i < size; i++) + ((unsigned char*)dest)[i] = ((unsigned char*)src)[size - i-1]; +} + +#define TO_NATIVE(x) \ +({ \ + typeof(x) __x; \ + __endian(&(x), &(__x), sizeof(__x)); \ + __x; \ +}) + +#else /* endianness matches */ + +#define TO_NATIVE(x) (x) + +#endif + +#define NOFAIL(ptr) do_nofail((ptr), #ptr) +void *do_nofail(void *ptr, const char *expr); + +struct buffer { + char *p; + int pos; + int size; +}; + +void __attribute__((format(printf, 2, 3))) +buf_printf(struct buffer *buf, const char *fmt, ...); + +void +buf_write(struct buffer *buf, const char *s, int len); + +struct namespace_list { + struct namespace_list *next; + char namespace[]; +}; + +struct module { + struct module *next; + int gpl_compatible; + struct symbol *unres; + int from_dump; /* 1 if module was loaded from *.symvers */ + int is_vmlinux; + int seen; + int has_init; + int has_cleanup; + struct buffer dev_table_buf; + char srcversion[25]; + // Missing namespace dependencies + struct namespace_list *missing_namespaces; + // Actual imported namespaces + struct namespace_list *imported_namespaces; + char name[]; +}; + +struct elf_info { + size_t size; + Elf_Ehdr *hdr; + Elf_Shdr *sechdrs; + Elf_Sym *symtab_start; + Elf_Sym *symtab_stop; + Elf_Section export_sec; + Elf_Section export_unused_sec; + Elf_Section export_gpl_sec; + Elf_Section export_unused_gpl_sec; + Elf_Section export_gpl_future_sec; + char *strtab; + char *modinfo; + unsigned int modinfo_len; + + /* support for 32bit section numbers */ + + unsigned int num_sections; /* max_secindex + 1 */ + unsigned int secindex_strings; + /* if Nth symbol table entry has .st_shndx = SHN_XINDEX, + * take shndx from symtab_shndx_start[N] instead */ + Elf32_Word *symtab_shndx_start; + Elf32_Word *symtab_shndx_stop; +}; + +static inline int is_shndx_special(unsigned int i) +{ + return i != SHN_XINDEX && i >= SHN_LORESERVE && i <= SHN_HIRESERVE; +} + +/* + * Move reserved section indices SHN_LORESERVE..SHN_HIRESERVE out of + * the way to -256..-1, to avoid conflicting with real section + * indices. + */ +#define SPECIAL(i) ((i) - (SHN_HIRESERVE + 1)) + +/* Accessor for sym->st_shndx, hides ugliness of "64k sections" */ +static inline unsigned int get_secindex(const struct elf_info *info, + const Elf_Sym *sym) +{ + if (is_shndx_special(sym->st_shndx)) + return SPECIAL(sym->st_shndx); + if (sym->st_shndx != SHN_XINDEX) + return sym->st_shndx; + return info->symtab_shndx_start[sym - info->symtab_start]; +} + +/* file2alias.c */ +extern unsigned int cross_build; +void handle_moddevtable(struct module *mod, struct elf_info *info, + Elf_Sym *sym, const char *symname); +void add_moddevtable(struct buffer *buf, struct module *mod); + +/* sumversion.c */ +void get_src_version(const char *modname, char sum[], unsigned sumlen); + +/* from modpost.c */ +char *read_text_file(const char *filename); +char *get_line(char **stringp); + +enum loglevel { + LOG_WARN, + LOG_ERROR, + LOG_FATAL +}; + +void modpost_log(enum loglevel loglevel, const char *fmt, ...); + +#define warn(fmt, args...) modpost_log(LOG_WARN, fmt, ##args) +#define merror(fmt, args...) modpost_log(LOG_ERROR, fmt, ##args) +#define fatal(fmt, args...) modpost_log(LOG_FATAL, fmt, ##args) diff --git a/src/net/scripts/mod/sumversion.c b/src/net/scripts/mod/sumversion.c new file mode 100644 index 0000000..d587f40 --- /dev/null +++ b/src/net/scripts/mod/sumversion.c @@ -0,0 +1,420 @@ +#include <netinet/in.h> +#ifdef __sun__ +#include <inttypes.h> +#else +#include <stdint.h> +#endif +#include <ctype.h> +#include <errno.h> +#include <string.h> +#include <limits.h> +#include "modpost.h" + +/* + * Stolen form Cryptographic API. + * + * MD4 Message Digest Algorithm (RFC1320). + * + * Implementation derived from Andrew Tridgell and Steve French's + * CIFS MD4 implementation, and the cryptoapi implementation + * originally based on the public domain implementation written + * by Colin Plumb in 1993. + * + * Copyright (c) Andrew Tridgell 1997-1998. + * Modified by Steve French (sfrench@us.ibm.com) 2002 + * Copyright (c) Cryptoapi developers. + * Copyright (c) 2002 David S. Miller (davem@redhat.com) + * Copyright (c) 2002 James Morris <jmorris@intercode.com.au> + * + * 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. + * + */ +#define MD4_DIGEST_SIZE 16 +#define MD4_HMAC_BLOCK_SIZE 64 +#define MD4_BLOCK_WORDS 16 +#define MD4_HASH_WORDS 4 + +struct md4_ctx { + uint32_t hash[MD4_HASH_WORDS]; + uint32_t block[MD4_BLOCK_WORDS]; + uint64_t byte_count; +}; + +static inline uint32_t lshift(uint32_t x, unsigned int s) +{ + x &= 0xFFFFFFFF; + return ((x << s) & 0xFFFFFFFF) | (x >> (32 - s)); +} + +static inline uint32_t F(uint32_t x, uint32_t y, uint32_t z) +{ + return (x & y) | ((~x) & z); +} + +static inline uint32_t G(uint32_t x, uint32_t y, uint32_t z) +{ + return (x & y) | (x & z) | (y & z); +} + +static inline uint32_t H(uint32_t x, uint32_t y, uint32_t z) +{ + return x ^ y ^ z; +} + +#define ROUND1(a,b,c,d,k,s) (a = lshift(a + F(b,c,d) + k, s)) +#define ROUND2(a,b,c,d,k,s) (a = lshift(a + G(b,c,d) + k + (uint32_t)0x5A827999,s)) +#define ROUND3(a,b,c,d,k,s) (a = lshift(a + H(b,c,d) + k + (uint32_t)0x6ED9EBA1,s)) + +/* XXX: this stuff can be optimized */ +static inline void le32_to_cpu_array(uint32_t *buf, unsigned int words) +{ + while (words--) { + *buf = ntohl(*buf); + buf++; + } +} + +static inline void cpu_to_le32_array(uint32_t *buf, unsigned int words) +{ + while (words--) { + *buf = htonl(*buf); + buf++; + } +} + +static void md4_transform(uint32_t *hash, uint32_t const *in) +{ + uint32_t a, b, c, d; + + a = hash[0]; + b = hash[1]; + c = hash[2]; + d = hash[3]; + + ROUND1(a, b, c, d, in[0], 3); + ROUND1(d, a, b, c, in[1], 7); + ROUND1(c, d, a, b, in[2], 11); + ROUND1(b, c, d, a, in[3], 19); + ROUND1(a, b, c, d, in[4], 3); + ROUND1(d, a, b, c, in[5], 7); + ROUND1(c, d, a, b, in[6], 11); + ROUND1(b, c, d, a, in[7], 19); + ROUND1(a, b, c, d, in[8], 3); + ROUND1(d, a, b, c, in[9], 7); + ROUND1(c, d, a, b, in[10], 11); + ROUND1(b, c, d, a, in[11], 19); + ROUND1(a, b, c, d, in[12], 3); + ROUND1(d, a, b, c, in[13], 7); + ROUND1(c, d, a, b, in[14], 11); + ROUND1(b, c, d, a, in[15], 19); + + ROUND2(a, b, c, d,in[ 0], 3); + ROUND2(d, a, b, c, in[4], 5); + ROUND2(c, d, a, b, in[8], 9); + ROUND2(b, c, d, a, in[12], 13); + ROUND2(a, b, c, d, in[1], 3); + ROUND2(d, a, b, c, in[5], 5); + ROUND2(c, d, a, b, in[9], 9); + ROUND2(b, c, d, a, in[13], 13); + ROUND2(a, b, c, d, in[2], 3); + ROUND2(d, a, b, c, in[6], 5); + ROUND2(c, d, a, b, in[10], 9); + ROUND2(b, c, d, a, in[14], 13); + ROUND2(a, b, c, d, in[3], 3); + ROUND2(d, a, b, c, in[7], 5); + ROUND2(c, d, a, b, in[11], 9); + ROUND2(b, c, d, a, in[15], 13); + + ROUND3(a, b, c, d,in[ 0], 3); + ROUND3(d, a, b, c, in[8], 9); + ROUND3(c, d, a, b, in[4], 11); + ROUND3(b, c, d, a, in[12], 15); + ROUND3(a, b, c, d, in[2], 3); + ROUND3(d, a, b, c, in[10], 9); + ROUND3(c, d, a, b, in[6], 11); + ROUND3(b, c, d, a, in[14], 15); + ROUND3(a, b, c, d, in[1], 3); + ROUND3(d, a, b, c, in[9], 9); + ROUND3(c, d, a, b, in[5], 11); + ROUND3(b, c, d, a, in[13], 15); + ROUND3(a, b, c, d, in[3], 3); + ROUND3(d, a, b, c, in[11], 9); + ROUND3(c, d, a, b, in[7], 11); + ROUND3(b, c, d, a, in[15], 15); + + hash[0] += a; + hash[1] += b; + hash[2] += c; + hash[3] += d; +} + +static inline void md4_transform_helper(struct md4_ctx *ctx) +{ + le32_to_cpu_array(ctx->block, sizeof(ctx->block) / sizeof(uint32_t)); + md4_transform(ctx->hash, ctx->block); +} + +static void md4_init(struct md4_ctx *mctx) +{ + mctx->hash[0] = 0x67452301; + mctx->hash[1] = 0xefcdab89; + mctx->hash[2] = 0x98badcfe; + mctx->hash[3] = 0x10325476; + mctx->byte_count = 0; +} + +static void md4_update(struct md4_ctx *mctx, + const unsigned char *data, unsigned int len) +{ + const uint32_t avail = sizeof(mctx->block) - (mctx->byte_count & 0x3f); + + mctx->byte_count += len; + + if (avail > len) { + memcpy((char *)mctx->block + (sizeof(mctx->block) - avail), + data, len); + return; + } + + memcpy((char *)mctx->block + (sizeof(mctx->block) - avail), + data, avail); + + md4_transform_helper(mctx); + data += avail; + len -= avail; + + while (len >= sizeof(mctx->block)) { + memcpy(mctx->block, data, sizeof(mctx->block)); + md4_transform_helper(mctx); + data += sizeof(mctx->block); + len -= sizeof(mctx->block); + } + + memcpy(mctx->block, data, len); +} + +static void md4_final_ascii(struct md4_ctx *mctx, char *out, unsigned int len) +{ + const unsigned int offset = mctx->byte_count & 0x3f; + char *p = (char *)mctx->block + offset; + int padding = 56 - (offset + 1); + + *p++ = 0x80; + if (padding < 0) { + memset(p, 0x00, padding + sizeof (uint64_t)); + md4_transform_helper(mctx); + p = (char *)mctx->block; + padding = 56; + } + + memset(p, 0, padding); + mctx->block[14] = mctx->byte_count << 3; + mctx->block[15] = mctx->byte_count >> 29; + le32_to_cpu_array(mctx->block, (sizeof(mctx->block) - + sizeof(uint64_t)) / sizeof(uint32_t)); + md4_transform(mctx->hash, mctx->block); + cpu_to_le32_array(mctx->hash, sizeof(mctx->hash) / sizeof(uint32_t)); + + snprintf(out, len, "%08X%08X%08X%08X", + mctx->hash[0], mctx->hash[1], mctx->hash[2], mctx->hash[3]); +} + +static inline void add_char(unsigned char c, struct md4_ctx *md) +{ + md4_update(md, &c, 1); +} + +static int parse_string(const char *file, unsigned long len, + struct md4_ctx *md) +{ + unsigned long i; + + add_char(file[0], md); + for (i = 1; i < len; i++) { + add_char(file[i], md); + if (file[i] == '"' && file[i-1] != '\\') + break; + } + return i; +} + +static int parse_comment(const char *file, unsigned long len) +{ + unsigned long i; + + for (i = 2; i < len; i++) { + if (file[i-1] == '*' && file[i] == '/') + break; + } + return i; +} + +/* FIXME: Handle .s files differently (eg. # starts comments) --RR */ +static int parse_file(const char *fname, struct md4_ctx *md) +{ + char *file; + unsigned long i, len; + + file = read_text_file(fname); + len = strlen(file); + + for (i = 0; i < len; i++) { + /* Collapse and ignore \ and CR. */ + if (file[i] == '\\' && (i+1 < len) && file[i+1] == '\n') { + i++; + continue; + } + + /* Ignore whitespace */ + if (isspace(file[i])) + continue; + + /* Handle strings as whole units */ + if (file[i] == '"') { + i += parse_string(file+i, len - i, md); + continue; + } + + /* Comments: ignore */ + if (file[i] == '/' && file[i+1] == '*') { + i += parse_comment(file+i, len - i); + continue; + } + + add_char(file[i], md); + } + free(file); + return 1; +} +/* Check whether the file is a static library or not */ +static int is_static_library(const char *objfile) +{ + int len = strlen(objfile); + if (objfile[len - 2] == '.' && objfile[len - 1] == 'a') + return 1; + else + return 0; +} + +/* We have dir/file.o. Open dir/.file.o.cmd, look for source_ and deps_ line + * to figure out source files. */ +static int parse_source_files(const char *objfile, struct md4_ctx *md) +{ + char *cmd, *file, *line, *dir, *pos; + const char *base; + int dirlen, ret = 0, check_files = 0; + + cmd = NOFAIL(malloc(strlen(objfile) + sizeof("..cmd"))); + + base = strrchr(objfile, '/'); + if (base) { + base++; + dirlen = base - objfile; + sprintf(cmd, "%.*s.%s.cmd", dirlen, objfile, base); + } else { + dirlen = 0; + sprintf(cmd, ".%s.cmd", objfile); + } + dir = NOFAIL(malloc(dirlen + 1)); + strncpy(dir, objfile, dirlen); + dir[dirlen] = '\0'; + + file = read_text_file(cmd); + + pos = file; + + /* Sum all files in the same dir or subdirs. */ + while ((line = get_line(&pos))) { + char* p = line; + + if (strncmp(line, "source_", sizeof("source_")-1) == 0) { + p = strrchr(line, ' '); + if (!p) { + warn("malformed line: %s\n", line); + goto out_file; + } + p++; + if (!parse_file(p, md)) { + warn("could not open %s: %s\n", + p, strerror(errno)); + goto out_file; + } + continue; + } + if (strncmp(line, "deps_", sizeof("deps_")-1) == 0) { + check_files = 1; + continue; + } + if (!check_files) + continue; + + /* Continue until line does not end with '\' */ + if ( *(p + strlen(p)-1) != '\\') + break; + /* Terminate line at first space, to get rid of final ' \' */ + while (*p) { + if (isspace(*p)) { + *p = '\0'; + break; + } + p++; + } + + /* Check if this file is in same dir as objfile */ + if ((strstr(line, dir)+strlen(dir)-1) == strrchr(line, '/')) { + if (!parse_file(line, md)) { + warn("could not open %s: %s\n", + line, strerror(errno)); + goto out_file; + } + + } + + } + + /* Everyone parsed OK */ + ret = 1; +out_file: + free(file); + free(dir); + free(cmd); + return ret; +} + +/* Calc and record src checksum. */ +void get_src_version(const char *modname, char sum[], unsigned sumlen) +{ + char *buf, *pos, *firstline; + struct md4_ctx md; + char *fname; + char filelist[PATH_MAX + 1]; + + /* objects for a module are listed in the first line of *.mod file. */ + snprintf(filelist, sizeof(filelist), "%.*smod", + (int)strlen(modname) - 1, modname); + + buf = read_text_file(filelist); + + pos = buf; + firstline = get_line(&pos); + if (!firstline) { + warn("bad ending versions file for %s\n", modname); + goto free; + } + + md4_init(&md); + while ((fname = strsep(&firstline, " "))) { + if (!*fname) + continue; + if (!(is_static_library(fname)) && + !parse_source_files(fname, &md)) + goto free; + } + + md4_final_ascii(&md, sum, sumlen); +free: + free(buf); +} diff --git a/src/net/scripts/module.lds.S b/src/net/scripts/module.lds.S new file mode 100644 index 0000000..c5f1219 --- /dev/null +++ b/src/net/scripts/module.lds.S @@ -0,0 +1,55 @@ +/* + * Common module linker script, always used when linking a module. + * Archs are free to supply their own linker scripts. ld will + * combine them automatically. + */ +SECTIONS { + /DISCARD/ : { + *(.discard) + *(.discard.*) + } + + __ksymtab 0 : { *(SORT(___ksymtab+*)) } + __ksymtab_gpl 0 : { *(SORT(___ksymtab_gpl+*)) } + __ksymtab_unused 0 : { *(SORT(___ksymtab_unused+*)) } + __ksymtab_unused_gpl 0 : { *(SORT(___ksymtab_unused_gpl+*)) } + __ksymtab_gpl_future 0 : { *(SORT(___ksymtab_gpl_future+*)) } + __kcrctab 0 : { *(SORT(___kcrctab+*)) } + __kcrctab_gpl 0 : { *(SORT(___kcrctab_gpl+*)) } + __kcrctab_unused 0 : { *(SORT(___kcrctab_unused+*)) } + __kcrctab_unused_gpl 0 : { *(SORT(___kcrctab_unused_gpl+*)) } + __kcrctab_gpl_future 0 : { *(SORT(___kcrctab_gpl_future+*)) } + + .init_array 0 : ALIGN(8) { *(SORT(.init_array.*)) *(.init_array) } + + __jump_table 0 : ALIGN(8) { KEEP(*(__jump_table)) } + + __patchable_function_entries : { *(__patchable_function_entries) } + +#ifdef CONFIG_LTO_CLANG + /* + * With CONFIG_LTO_CLANG, LLD always enables -fdata-sections and + * -ffunction-sections, which increases the size of the final module. + * Merge the split sections in the final binary. + */ + .bss : { + *(.bss .bss.[0-9a-zA-Z_]*) + *(.bss..L*) + } + + .data : { + *(.data .data.[0-9a-zA-Z_]*) + *(.data..L*) + } + + .rodata : { + *(.rodata .rodata.[0-9a-zA-Z_]*) + *(.rodata..L*) + } + + .text : { *(.text .text.[0-9a-zA-Z_]*) } +#endif +} + +/* bring in arch-specific sections */ +#include <asm/module.lds.h> diff --git a/src/net/scripts/modules-check.sh b/src/net/scripts/modules-check.sh new file mode 100755 index 0000000..43de226 --- /dev/null +++ b/src/net/scripts/modules-check.sh @@ -0,0 +1,26 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 + +set -e + +if [ $# != 1 ]; then + echo "Usage: $0 <modules.order>" >& 2 + exit 1 +fi + +exit_code=0 + +# Check uniqueness of module names +check_same_name_modules() +{ + for m in $(sed 's:.*/::' $1 | sort | uniq -d) + do + echo "error: the following would cause module name conflict:" >&2 + sed -n "/\/$m/s:^: :p" modules.order >&2 + exit_code=1 + done +} + +check_same_name_modules "$1" + +exit $exit_code diff --git a/src/net/scripts/nsdeps b/src/net/scripts/nsdeps new file mode 100644 index 0000000..dab4c1a --- /dev/null +++ b/src/net/scripts/nsdeps @@ -0,0 +1,63 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# Linux kernel symbol namespace import generator +# +# This script requires a minimum spatch version. +SPATCH_REQ_VERSION="1.0.4" + +DIR="$(dirname $(readlink -f $0))/.." +SPATCH="`which ${SPATCH:=spatch}`" +if [ ! -x "$SPATCH" ]; then + echo 'spatch is part of the Coccinelle project and is available at http://coccinelle.lip6.fr/' + exit 1 +fi + +SPATCH_REQ_VERSION_NUM=$(echo $SPATCH_REQ_VERSION | ${DIR}/scripts/ld-version.sh) +SPATCH_VERSION=$($SPATCH --version | head -1 | awk '{print $3}') +SPATCH_VERSION_NUM=$(echo $SPATCH_VERSION | ${DIR}/scripts/ld-version.sh) + +if [ "$SPATCH_VERSION_NUM" -lt "$SPATCH_REQ_VERSION_NUM" ] ; then + echo "spatch needs to be version $SPATCH_REQ_VERSION or higher" + exit 1 +fi + +if [ "$KBUILD_EXTMOD" ]; then + src_prefix= +else + src_prefix=$srctree/ +fi + +generate_deps_for_ns() { + $SPATCH --very-quiet --in-place --sp-file \ + $srctree/scripts/coccinelle/misc/add_namespace.cocci -D nsdeps -D ns=$1 $2 +} + +generate_deps() { + local mod=${1%.ko:} + shift + local namespaces="$*" + local mod_source_files="`cat $mod.mod | sed -n 1p \ + | sed -e 's/\.o/\.c/g' \ + | sed "s|[^ ]* *|${src_prefix}&|g"`" + for ns in $namespaces; do + echo "Adding namespace $ns to module $mod.ko." + generate_deps_for_ns $ns "$mod_source_files" + # sort the imports + for source_file in $mod_source_files; do + sed '/MODULE_IMPORT_NS/Q' $source_file > ${source_file}.tmp + offset=$(wc -l ${source_file}.tmp | awk '{print $1;}') + cat $source_file | grep MODULE_IMPORT_NS | LANG=C sort -u >> ${source_file}.tmp + tail -n +$((offset +1)) ${source_file} | grep -v MODULE_IMPORT_NS >> ${source_file}.tmp + if ! diff -q ${source_file} ${source_file}.tmp; then + mv ${source_file}.tmp ${source_file} + else + rm ${source_file}.tmp + fi + done + done +} + +while read line +do + generate_deps $line +done < $MODULES_NSDEPS diff --git a/src/net/scripts/objdiff b/src/net/scripts/objdiff new file mode 100755 index 0000000..72b0b63 --- /dev/null +++ b/src/net/scripts/objdiff @@ -0,0 +1,162 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0-only + +# objdiff - a small script for validating that a commit or series of commits +# didn't change object code. +# +# Copyright 2014, Jason Cooper <jason@lakedaemon.net> +# + +# usage example: +# +# $ git checkout COMMIT_A +# $ <your fancy build command here> +# $ ./scripts/objdiff record path/to/*.o +# +# $ git checkout COMMIT_B +# $ <your fancy build command here> +# $ ./scripts/objdiff record path/to/*.o +# +# $ ./scripts/objdiff diff COMMIT_A COMMIT_B +# $ + +# And to clean up (everything is in .tmp_objdiff/*) +# $ ./scripts/objdiff clean all +# +# Note: 'make mrproper' will also remove .tmp_objdiff + +SRCTREE=$(cd $(git rev-parse --show-toplevel 2>/dev/null); pwd) + +if [ -z "$SRCTREE" ]; then + echo >&2 "ERROR: Not a git repository." + exit 1 +fi + +TMPD=$SRCTREE/.tmp_objdiff + +usage() { + echo >&2 "Usage: $0 <command> <args>" + echo >&2 " record <list of object files or directories>" + echo >&2 " diff <commitA> <commitB>" + echo >&2 " clean all | <commit>" + exit 1 +} + +get_output_dir() { + dir=${1%/*} + + if [ "$dir" = "$1" ]; then + dir=. + fi + + dir=$(cd $dir; pwd) + + echo $TMPD/$CMT${dir#$SRCTREE} +} + +do_objdump() { + dir=$(get_output_dir $1) + base=${1##*/} + stripped=$dir/${base%.o}.stripped + dis=$dir/${base%.o}.dis + + [ ! -d "$dir" ] && mkdir -p $dir + + # remove addresses for a cleaner diff + # http://dummdida.tumblr.com/post/60924060451/binary-diff-between-libc-from-scientificlinux-and + $STRIP -g $1 -R __bug_table -R .note -R .comment -o $stripped + $OBJDUMP -D $stripped | sed -e "s/^[[:space:]]\+[0-9a-f]\+//" -e "s:^$stripped:$1:" > $dis +} + +dorecord() { + [ $# -eq 0 ] && usage + + FILES="$*" + + CMT="`git rev-parse --short HEAD`" + + STRIP="${CROSS_COMPILE}strip" + OBJDUMP="${CROSS_COMPILE}objdump" + + for d in $FILES; do + if [ -d "$d" ]; then + for f in $(find $d -name '*.o') + do + do_objdump $f + done + else + do_objdump $d + fi + done +} + +dodiff() { + [ $# -ne 2 ] && [ $# -ne 0 ] && usage + + if [ $# -eq 0 ]; then + SRC="`git rev-parse --short HEAD^`" + DST="`git rev-parse --short HEAD`" + else + SRC="`git rev-parse --short $1`" + DST="`git rev-parse --short $2`" + fi + + DIFF="`which colordiff`" + + if [ ${#DIFF} -eq 0 ] || [ ! -x "$DIFF" ]; then + DIFF="`which diff`" + fi + + SRCD="$TMPD/$SRC" + DSTD="$TMPD/$DST" + + if [ ! -d "$SRCD" ]; then + echo >&2 "ERROR: $SRCD doesn't exist" + exit 1 + fi + + if [ ! -d "$DSTD" ]; then + echo >&2 "ERROR: $DSTD doesn't exist" + exit 1 + fi + + $DIFF -Nurd $SRCD $DSTD +} + +doclean() { + [ $# -eq 0 ] && usage + [ $# -gt 1 ] && usage + + if [ "x$1" = "xall" ]; then + rm -rf $TMPD/* + else + CMT="`git rev-parse --short $1`" + + if [ -d "$TMPD/$CMT" ]; then + rm -rf $TMPD/$CMT + else + echo >&2 "$CMT not found" + fi + fi +} + +[ $# -eq 0 ] && usage + +case "$1" in + record) + shift + dorecord $* + ;; + diff) + shift + dodiff $* + ;; + clean) + shift + doclean $* + ;; + *) + echo >&2 "Unrecognized command '$1'" + exit 1 + ;; +esac diff --git a/src/net/scripts/package/builddeb b/src/net/scripts/package/builddeb new file mode 100755 index 0000000..cd558ad --- /dev/null +++ b/src/net/scripts/package/builddeb @@ -0,0 +1,240 @@ +#!/bin/sh +# +# builddeb 1.3 +# Copyright 2003 Wichert Akkerman <wichert@wiggy.net> +# +# Simple script to generate a deb package for a Linux kernel. All the +# complexity of what to do with a kernel after it is installed or removed +# is left to other scripts and packages: they can install scripts in the +# /etc/kernel/{pre,post}{inst,rm}.d/ directories (or an alternative location +# specified in KDEB_HOOKDIR) that will be called on package install and +# removal. + +set -e + +is_enabled() { + grep -q "^$1=y" include/config/auto.conf +} + +if_enabled_echo() { + if is_enabled "$1"; then + echo -n "$2" + elif [ $# -ge 3 ]; then + echo -n "$3" + fi +} + +create_package() { + local pname="$1" pdir="$2" + local dpkg_deb_opts + + mkdir -m 755 -p "$pdir/DEBIAN" + mkdir -p "$pdir/usr/share/doc/$pname" + cp debian/copyright "$pdir/usr/share/doc/$pname/" + cp debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian" + gzip -n -9 "$pdir/usr/share/doc/$pname/changelog.Debian" + sh -c "cd '$pdir'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' \ + | xargs -r0 md5sum > DEBIAN/md5sums" + + # Fix ownership and permissions + if [ "$DEB_RULES_REQUIRES_ROOT" = "no" ]; then + dpkg_deb_opts="--root-owner-group" + else + chown -R root:root "$pdir" + fi + chmod -R go-w "$pdir" + # in case we are in a restrictive umask environment like 0077 + chmod -R a+rX "$pdir" + # in case we build in a setuid/setgid directory + chmod -R ug-s "$pdir" + + # Create the package + dpkg-gencontrol -p$pname -P"$pdir" + dpkg-deb $dpkg_deb_opts ${KDEB_COMPRESS:+-Z$KDEB_COMPRESS} --build "$pdir" .. +} + +deploy_kernel_headers () { + pdir=$1 + + rm -rf $pdir + + ( + cd $srctree + find . arch/$SRCARCH -maxdepth 1 -name Makefile\* + find include scripts -type f -o -type l + find arch/$SRCARCH -name Kbuild.platforms -o -name Platform + find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f + ) > debian/hdrsrcfiles + + { + if is_enabled CONFIG_STACK_VALIDATION; then + echo tools/objtool/objtool + fi + + find arch/$SRCARCH/include Module.symvers include scripts -type f + + if is_enabled CONFIG_GCC_PLUGINS; then + find scripts/gcc-plugins -name \*.so + fi + } > debian/hdrobjfiles + + destdir=$pdir/usr/src/linux-headers-$version + mkdir -p $destdir + tar -c -f - -C $srctree -T debian/hdrsrcfiles | tar -xf - -C $destdir + tar -c -f - -T debian/hdrobjfiles | tar -xf - -C $destdir + rm -f debian/hdrsrcfiles debian/hdrobjfiles + + # copy .config manually to be where it's expected to be + cp $KCONFIG_CONFIG $destdir/.config + + mkdir -p $pdir/lib/modules/$version/ + ln -s /usr/src/linux-headers-$version $pdir/lib/modules/$version/build +} + +deploy_libc_headers () { + pdir=$1 + + rm -rf $pdir + + $MAKE -f $srctree/Makefile headers + $MAKE -f $srctree/Makefile headers_install INSTALL_HDR_PATH=$pdir/usr + + # move asm headers to /usr/include/<libc-machine>/asm to match the structure + # used by Debian-based distros (to support multi-arch) + host_arch=$(dpkg-architecture -a$(cat debian/arch) -qDEB_HOST_MULTIARCH) + mkdir $pdir/usr/include/$host_arch + mv $pdir/usr/include/asm $pdir/usr/include/$host_arch/ +} + +version=$KERNELRELEASE +tmpdir=debian/linux-image +dbg_dir=debian/linux-image-dbg +packagename=linux-image-$version +dbg_packagename=$packagename-dbg + +if [ "$ARCH" = "um" ] ; then + packagename=user-mode-linux-$version +fi + +# Not all arches have the same installed path in debian +# XXX: have each arch Makefile export a variable of the canonical image install +# path instead +case $ARCH in +um) + installed_image_path="usr/bin/linux-$version" + ;; +parisc|mips|powerpc) + installed_image_path="boot/vmlinux-$version" + ;; +sw_64) + installed_image_path="boot/vmlinux.bin-$version" + ;; +*) + installed_image_path="boot/vmlinuz-$version" +esac + +BUILD_DEBUG=$(if_enabled_echo CONFIG_DEBUG_INFO Yes) + +# Setup the directory structure +rm -rf "$tmpdir" "$dbg_dir" debian/files +mkdir -m 755 -p "$tmpdir/DEBIAN" +mkdir -p "$tmpdir/lib" "$tmpdir/boot" + +# Install the kernel +if [ "$ARCH" = "um" ] ; then + mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" "$tmpdir/usr/share/doc/$packagename" + cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map" + cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config" + gzip "$tmpdir/usr/share/doc/$packagename/config" +else + cp System.map "$tmpdir/boot/System.map-$version" + cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version" +fi +cp "$($MAKE -s -f $srctree/Makefile image_name)" "$tmpdir/$installed_image_path" + +if is_enabled CONFIG_OF_EARLY_FLATTREE; then + # Only some architectures with OF support have this target + if [ -d "${srctree}/arch/$SRCARCH/boot/dts" ]; then + $MAKE -f $srctree/Makefile INSTALL_DTBS_PATH="$tmpdir/usr/lib/$packagename" dtbs_install + fi +fi + +if is_enabled CONFIG_MODULES; then + INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_install + rm -f "$tmpdir/lib/modules/$version/build" + rm -f "$tmpdir/lib/modules/$version/source" + if [ "$ARCH" = "um" ] ; then + mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/" + rmdir "$tmpdir/lib/modules/$version" + fi + if [ -n "$BUILD_DEBUG" ] ; then + for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do + module=lib/modules/$module + mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module) + # only keep debug symbols in the debug file + $OBJCOPY --only-keep-debug $tmpdir/$module $dbg_dir/usr/lib/debug/$module + # strip original module from debug symbols + $OBJCOPY --strip-debug $tmpdir/$module + # then add a link to those + $OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $tmpdir/$module + done + + # resign stripped modules + if is_enabled CONFIG_MODULE_SIG_ALL; then + INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_sign + fi + fi +fi + +# Install the maintainer scripts +# Note: hook scripts under /etc/kernel are also executed by official Debian +# kernel packages, as well as kernel packages built using make-kpkg. +# make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and +# so do we; recent versions of dracut and initramfs-tools will obey this. +debhookdir=${KDEB_HOOKDIR:-/etc/kernel} +for script in postinst postrm preinst prerm ; do + mkdir -p "$tmpdir$debhookdir/$script.d" + cat <<EOF > "$tmpdir/DEBIAN/$script" +#!/bin/sh + +set -e + +# Pass maintainer script parameters to hook scripts +export DEB_MAINT_PARAMS="\$*" + +# Tell initramfs builder whether it's wanted +export INITRD=$(if_enabled_echo CONFIG_BLK_DEV_INITRD Yes No) + +test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d +exit 0 +EOF + chmod 755 "$tmpdir/DEBIAN/$script" +done + +if [ "$ARCH" != "um" ]; then + if is_enabled CONFIG_MODULES; then + deploy_kernel_headers debian/linux-headers + create_package linux-headers-$version debian/linux-headers + fi + + deploy_libc_headers debian/linux-libc-dev + create_package linux-libc-dev debian/linux-libc-dev +fi + +create_package "$packagename" "$tmpdir" + +if [ -n "$BUILD_DEBUG" ] ; then + # Build debug package + # Different tools want the image in different locations + # perf + mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/ + cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/ + # systemtap + mkdir -p $dbg_dir/usr/lib/debug/boot/ + ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version + # kdump-tools + ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version + create_package "$dbg_packagename" "$dbg_dir" +fi + +exit 0 diff --git a/src/net/scripts/package/buildtar b/src/net/scripts/package/buildtar new file mode 100755 index 0000000..a0e4c7b --- /dev/null +++ b/src/net/scripts/package/buildtar @@ -0,0 +1,159 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 + +# +# buildtar 0.0.5 +# +# (C) 2004-2006 by Jan-Benedict Glaw <jbglaw@lug-owl.de> +# +# This script is used to compile a tarball from the currently +# prepared kernel. Based upon the builddeb script from +# Wichert Akkerman <wichert@wiggy.net>. +# + +set -e + +# +# Some variables and settings used throughout the script +# +tmpdir="${objtree}/tar-install" +tarball="${objtree}/linux-${KERNELRELEASE}-${ARCH}.tar" + + +# +# Figure out how to compress, if requested at all +# +case "${1}" in + dir-pkg|tar-pkg) + opts= + ;; + targz-pkg) + opts="-I ${KGZIP}" + tarball=${tarball}.gz + ;; + tarbz2-pkg) + opts="-I ${KBZIP2}" + tarball=${tarball}.bz2 + ;; + tarxz-pkg) + opts="-I ${XZ}" + tarball=${tarball}.xz + ;; + *) + echo "Unknown tarball target \"${1}\" requested, please add it to ${0}." >&2 + exit 1 + ;; +esac + + +# +# Clean-up and re-create the temporary directory +# +rm -rf -- "${tmpdir}" +mkdir -p -- "${tmpdir}/boot" +dirs=boot + + +# +# Try to install dtbs +# +if grep -q '^CONFIG_OF_EARLY_FLATTREE=y' include/config/auto.conf; then + # Only some architectures with OF support have this target + if [ -d "${srctree}/arch/${SRCARCH}/boot/dts" ]; then + $MAKE ARCH="${ARCH}" -f ${srctree}/Makefile INSTALL_DTBS_PATH="${tmpdir}/boot/dtbs/${KERNELRELEASE}" dtbs_install + fi +fi + + +# +# Try to install modules +# +if grep -q '^CONFIG_MODULES=y' include/config/auto.conf; then + make ARCH="${ARCH}" -f ${srctree}/Makefile INSTALL_MOD_PATH="${tmpdir}" modules_install + dirs="$dirs lib" +fi + + +# +# Install basic kernel files +# +cp -v -- "${objtree}/System.map" "${tmpdir}/boot/System.map-${KERNELRELEASE}" +cp -v -- "${KCONFIG_CONFIG}" "${tmpdir}/boot/config-${KERNELRELEASE}" +cp -v -- "${objtree}/vmlinux" "${tmpdir}/boot/vmlinux-${KERNELRELEASE}" + + +# +# Install arch-specific kernel image(s) +# +case "${ARCH}" in + x86|i386|x86_64) + [ -f "${objtree}/arch/x86/boot/bzImage" ] && cp -v -- "${objtree}/arch/x86/boot/bzImage" "${tmpdir}/boot/vmlinuz-${KERNELRELEASE}" + ;; + alpha) + [ -f "${objtree}/arch/alpha/boot/vmlinux.gz" ] && cp -v -- "${objtree}/arch/alpha/boot/vmlinux.gz" "${tmpdir}/boot/vmlinuz-${KERNELRELEASE}" + ;; + sw_64) + [ -f "${objtree}/arch/sw_64/boot/vmlinux.bin" ] && cp -v -- "${objtree}/arch/sw_64/boot/vmlinux.bin" "${tmpdir}/boot/vmlinux-bin-${KERNELRELEASE}" + ;; + parisc*) + [ -f "${KBUILD_IMAGE}" ] && cp -v -- "${KBUILD_IMAGE}" "${tmpdir}/boot/vmlinux-${KERNELRELEASE}" + [ -f "${objtree}/lifimage" ] && cp -v -- "${objtree}/lifimage" "${tmpdir}/boot/lifimage-${KERNELRELEASE}" + ;; + mips) + if [ -f "${objtree}/arch/mips/boot/compressed/vmlinux.bin" ]; then + cp -v -- "${objtree}/arch/mips/boot/compressed/vmlinux.bin" "${tmpdir}/boot/vmlinuz-${KERNELRELEASE}" + elif [ -f "${objtree}/arch/mips/boot/compressed/vmlinux.ecoff" ]; then + cp -v -- "${objtree}/arch/mips/boot/compressed/vmlinux.ecoff" "${tmpdir}/boot/vmlinuz-${KERNELRELEASE}" + elif [ -f "${objtree}/arch/mips/boot/compressed/vmlinux.srec" ]; then + cp -v -- "${objtree}/arch/mips/boot/compressed/vmlinux.srec" "${tmpdir}/boot/vmlinuz-${KERNELRELEASE}" + elif [ -f "${objtree}/vmlinux.32" ]; then + cp -v -- "${objtree}/vmlinux.32" "${tmpdir}/boot/vmlinux-${KERNELRELEASE}" + elif [ -f "${objtree}/vmlinux.64" ]; then + cp -v -- "${objtree}/vmlinux.64" "${tmpdir}/boot/vmlinux-${KERNELRELEASE}" + elif [ -f "${objtree}/arch/mips/boot/vmlinux.bin" ]; then + cp -v -- "${objtree}/arch/mips/boot/vmlinux.bin" "${tmpdir}/boot/vmlinux-${KERNELRELEASE}" + elif [ -f "${objtree}/arch/mips/boot/vmlinux.ecoff" ]; then + cp -v -- "${objtree}/arch/mips/boot/vmlinux.ecoff" "${tmpdir}/boot/vmlinux-${KERNELRELEASE}" + elif [ -f "${objtree}/arch/mips/boot/vmlinux.srec" ]; then + cp -v -- "${objtree}/arch/mips/boot/vmlinux.srec" "${tmpdir}/boot/vmlinux-${KERNELRELEASE}" + elif [ -f "${objtree}/vmlinux" ]; then + cp -v -- "${objtree}/vmlinux" "${tmpdir}/boot/vmlinux-${KERNELRELEASE}" + fi + ;; + arm64) + for i in Image.bz2 Image.gz Image.lz4 Image.lzma Image.lzo ; do + if [ -f "${objtree}/arch/arm64/boot/${i}" ] ; then + cp -v -- "${objtree}/arch/arm64/boot/${i}" "${tmpdir}/boot/vmlinuz-${KERNELRELEASE}" + break + fi + done + ;; + *) + [ -f "${KBUILD_IMAGE}" ] && cp -v -- "${KBUILD_IMAGE}" "${tmpdir}/boot/vmlinux-kbuild-${KERNELRELEASE}" + echo "" >&2 + echo '** ** ** WARNING ** ** **' >&2 + echo "" >&2 + echo "Your architecture did not define any architecture-dependent files" >&2 + echo "to be placed into the tarball. Please add those to ${0} ..." >&2 + echo "" >&2 + sleep 5 + ;; +esac + +if [ "${1}" = dir-pkg ]; then + echo "Kernel tree successfully created in $tmpdir" + exit 0 +fi + +# +# Create the tarball +# +if tar --owner=root --group=root --help >/dev/null 2>&1; then + opts="$opts --owner=root --group=root" +fi + +tar cf $tarball -C $tmpdir $opts $dirs + +echo "Tarball successfully created in $tarball" + +exit 0 diff --git a/src/net/scripts/package/mkdebian b/src/net/scripts/package/mkdebian new file mode 100755 index 0000000..fdef3f5 --- /dev/null +++ b/src/net/scripts/package/mkdebian @@ -0,0 +1,246 @@ +#!/bin/sh +# +# Copyright 2003 Wichert Akkerman <wichert@wiggy.net> +# +# Simple script to generate a debian/ directory for a Linux kernel. + +set -e + +is_enabled() { + grep -q "^$1=y" include/config/auto.conf +} + +if_enabled_echo() { + if is_enabled "$1"; then + echo -n "$2" + elif [ $# -ge 3 ]; then + echo -n "$3" + fi +} + +set_debarch() { + if [ -n "$KBUILD_DEBARCH" ] ; then + debarch="$KBUILD_DEBARCH" + return + fi + + # Attempt to find the correct Debian architecture + case "$UTS_MACHINE" in + i386|ia64|alpha|m68k|riscv*|sw_64) + debarch="$UTS_MACHINE" ;; + x86_64) + debarch=amd64 ;; + sparc*) + debarch=sparc$(if_enabled_echo CONFIG_64BIT 64) ;; + s390*) + debarch=s390x ;; + ppc*) + if is_enabled CONFIG_64BIT; then + debarch=ppc64$(if_enabled_echo CONFIG_CPU_LITTLE_ENDIAN el) + else + debarch=powerpc$(if_enabled_echo CONFIG_SPE spe) + fi + ;; + parisc*) + debarch=hppa ;; + mips*) + if is_enabled CONFIG_CPU_LITTLE_ENDIAN; then + debarch=mips$(if_enabled_echo CONFIG_64BIT 64)$(if_enabled_echo CONFIG_CPU_MIPSR6 r6)el + elif is_enabled CONFIG_CPU_MIPSR6; then + debarch=mips$(if_enabled_echo CONFIG_64BIT 64)r6 + else + debarch=mips + fi + ;; + aarch64|arm64) + debarch=arm64 ;; + arm*) + if is_enabled CONFIG_AEABI; then + debarch=arm$(if_enabled_echo CONFIG_VFP hf el) + else + debarch=arm + fi + ;; + openrisc) + debarch=or1k ;; + sh) + if is_enabled CONFIG_CPU_SH3; then + debarch=sh3$(if_enabled_echo CONFIG_CPU_BIG_ENDIAN eb) + elif is_enabled CONFIG_CPU_SH4; then + debarch=sh4$(if_enabled_echo CONFIG_CPU_BIG_ENDIAN eb) + fi + ;; + esac + if [ -z "$debarch" ]; then + debarch=$(dpkg-architecture -qDEB_HOST_ARCH) + echo "" >&2 + echo "** ** ** WARNING ** ** **" >&2 + echo "" >&2 + echo "Your architecture doesn't have its equivalent" >&2 + echo "Debian userspace architecture defined!" >&2 + echo "Falling back to the current host architecture ($debarch)." >&2 + echo "Please add support for $UTS_MACHINE to ${0} ..." >&2 + echo "" >&2 + fi +} + +# Some variables and settings used throughout the script +version=$KERNELRELEASE +if [ -n "$KDEB_PKGVERSION" ]; then + packageversion=$KDEB_PKGVERSION + revision=${packageversion##*-} +else + revision=$(cat .version 2>/dev/null||echo 1) + packageversion=$version-$revision +fi +sourcename=$KDEB_SOURCENAME + +if [ "$ARCH" = "um" ] ; then + packagename=user-mode-linux +else + packagename=linux-image +fi + +debarch= +set_debarch + +email=${DEBEMAIL-$EMAIL} + +# use email string directly if it contains <email> +if echo $email | grep -q '<.*>'; then + maintainer=$email +else + # or construct the maintainer string + user=${KBUILD_BUILD_USER-$(id -nu)} + name=${DEBFULLNAME-$user} + if [ -z "$email" ]; then + buildhost=${KBUILD_BUILD_HOST-$(hostname -f 2>/dev/null || hostname)} + email="$user@$buildhost" + fi + maintainer="$name <$email>" +fi + +# Try to determine distribution +if [ -n "$KDEB_CHANGELOG_DIST" ]; then + distribution=$KDEB_CHANGELOG_DIST +# In some cases lsb_release returns the codename as n/a, which breaks dpkg-parsechangelog +elif distribution=$(lsb_release -cs 2>/dev/null) && [ -n "$distribution" ] && [ "$distribution" != "n/a" ]; then + : # nothing to do in this case +else + distribution="unstable" + echo >&2 "Using default distribution of 'unstable' in the changelog" + echo >&2 "Install lsb-release or set \$KDEB_CHANGELOG_DIST explicitly" +fi + +mkdir -p debian/source/ +echo "1.0" > debian/source/format + +echo $debarch > debian/arch +extra_build_depends=", $(if_enabled_echo CONFIG_UNWINDER_ORC libelf-dev:native)" +extra_build_depends="$extra_build_depends, $(if_enabled_echo CONFIG_SYSTEM_TRUSTED_KEYRING libssl-dev:native)" + +# Generate a simple changelog template +cat <<EOF > debian/changelog +$sourcename ($packageversion) $distribution; urgency=low + + * Custom built Linux kernel. + + -- $maintainer $(date -R) +EOF + +# Generate copyright file +cat <<EOF > debian/copyright +This is a packacked upstream version of the Linux kernel. + +The sources may be found at most Linux archive sites, including: +https://www.kernel.org/pub/linux/kernel + +Copyright: 1991 - 2018 Linus Torvalds and others. + +The git repository for mainline kernel development is at: +git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git + + 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; version 2 dated June, 1991. + +On Debian GNU/Linux systems, the complete text of the GNU General Public +License version 2 can be found in \`/usr/share/common-licenses/GPL-2'. +EOF + +# Generate a control file +cat <<EOF > debian/control +Source: $sourcename +Section: kernel +Priority: optional +Maintainer: $maintainer +Rules-Requires-Root: no +Build-Depends: bc, rsync, kmod, cpio, bison, flex | flex:native $extra_build_depends +Homepage: https://www.kernel.org/ + +Package: $packagename-$version +Architecture: $debarch +Description: Linux kernel, version $version + This package contains the Linux kernel, modules and corresponding other + files, version: $version. + +Package: linux-libc-dev +Section: devel +Provides: linux-kernel-headers +Architecture: $debarch +Description: Linux support headers for userspace development + This package provides userspaces headers from the Linux kernel. These headers + are used by the installed headers for GNU glibc and other system libraries. +Multi-Arch: same +EOF + +if is_enabled CONFIG_MODULES; then +cat <<EOF >> debian/control + +Package: linux-headers-$version +Architecture: $debarch +Description: Linux kernel headers for $version on $debarch + This package provides kernel header files for $version on $debarch + . + This is useful for people who need to build external modules +EOF +fi + +if is_enabled CONFIG_DEBUG_INFO; then +cat <<EOF >> debian/control + +Package: linux-image-$version-dbg +Section: debug +Architecture: $debarch +Description: Linux kernel debugging symbols for $version + This package will come in handy if you need to debug the kernel. It provides + all the necessary debug symbols for the kernel and its modules. +EOF +fi + +cat <<EOF > debian/rules +#!$(command -v $MAKE) -f + +srctree ?= . + +build-indep: +build-arch: + \$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} \ + KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile + +build: build-arch + +binary-indep: +binary-arch: build-arch + \$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} \ + KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile intdeb-pkg + +clean: + rm -rf debian/*tmp debian/files + \$(MAKE) clean + +binary: binary-arch +EOF +chmod +x debian/rules + +exit 0 diff --git a/src/net/scripts/package/mkspec b/src/net/scripts/package/mkspec new file mode 100755 index 0000000..7c477ca --- /dev/null +++ b/src/net/scripts/package/mkspec @@ -0,0 +1,147 @@ +#!/bin/sh +# +# Output a simple RPM spec file. +# This version assumes a minimum of RPM 4.0.3. +# +# The only gothic bit here is redefining install_post to avoid +# stripping the symbols from files in the kernel which we want +# +# Patched for non-x86 by Opencon (L) 2002 <opencon@rio.skydome.net> +# + +# how we were called determines which rpms we build and how we build them +if [ "$1" = prebuilt ]; then + S=DEL + MAKE="$MAKE -f $srctree/Makefile" +else + S= +fi + +if grep -q CONFIG_MODULES=y .config; then + M= +else + M=DEL +fi + +if grep -q CONFIG_DRM=y .config; then + PROVIDES=kernel-drm +fi + +PROVIDES="$PROVIDES kernel-$KERNELRELEASE" +__KERNELRELEASE=$(echo $KERNELRELEASE | sed -e "s/-/_/g") +EXCLUDES="$RCS_TAR_IGNORE --exclude=*vmlinux* --exclude=*.mod \ +--exclude=*.o --exclude=*.ko --exclude=*.cmd --exclude=Documentation \ +--exclude=.config.old --exclude=.missing-syscalls.d --exclude=*.s" + +# We can label the here-doc lines for conditional output to the spec file +# +# Labels: +# $S: this line is enabled only when building source package +# $M: this line is enabled only when CONFIG_MODULES is enabled +sed -e '/^DEL/d' -e 's/^\t*//' <<EOF + Name: kernel + Summary: The Linux Kernel + Version: $__KERNELRELEASE + Release: $(cat .version 2>/dev/null || echo 1) + License: GPL + Group: System Environment/Kernel + Vendor: The Linux Community + URL: https://www.kernel.org +$S Source: kernel-$__KERNELRELEASE.tar.gz + Provides: $PROVIDES + %define __spec_install_post /usr/lib/rpm/brp-compress || : + %define debug_package %{nil} + + %description + The Linux Kernel, the operating system core itself + + %package headers + Summary: Header files for the Linux kernel for use by glibc + Group: Development/System + Obsoletes: kernel-headers + Provides: kernel-headers = %{version} + %description headers + Kernel-headers includes the C header files that specify the interface + between the Linux kernel and userspace libraries and programs. The + header files define structures and constants that are needed for + building most standard programs and are also needed for rebuilding the + glibc package. + +$S$M %package devel +$S$M Summary: Development package for building kernel modules to match the $__KERNELRELEASE kernel +$S$M Group: System Environment/Kernel +$S$M AutoReqProv: no +$S$M %description -n kernel-devel +$S$M This package provides kernel headers and makefiles sufficient to build modules +$S$M against the $__KERNELRELEASE kernel package. +$S$M +$S %prep +$S %setup -q +$S +$S %build +$S $MAKE %{?_smp_mflags} KBUILD_BUILD_VERSION=%{release} +$S + %install + mkdir -p %{buildroot}/boot + %ifarch ia64 + mkdir -p %{buildroot}/boot/efi + cp \$($MAKE image_name) %{buildroot}/boot/efi/vmlinuz-$KERNELRELEASE + ln -s efi/vmlinuz-$KERNELRELEASE %{buildroot}/boot/ + %else + cp \$($MAKE image_name) %{buildroot}/boot/vmlinuz-$KERNELRELEASE + %endif +$M $MAKE %{?_smp_mflags} INSTALL_MOD_PATH=%{buildroot} modules_install + $MAKE %{?_smp_mflags} INSTALL_HDR_PATH=%{buildroot}/usr headers_install + cp System.map %{buildroot}/boot/System.map-$KERNELRELEASE + cp .config %{buildroot}/boot/config-$KERNELRELEASE + bzip2 -9 --keep vmlinux + mv vmlinux.bz2 %{buildroot}/boot/vmlinux-$KERNELRELEASE.bz2 +$S$M rm -f %{buildroot}/lib/modules/$KERNELRELEASE/build +$S$M rm -f %{buildroot}/lib/modules/$KERNELRELEASE/source +$S$M mkdir -p %{buildroot}/usr/src/kernels/$KERNELRELEASE +$S$M tar cf - $EXCLUDES . | tar xf - -C %{buildroot}/usr/src/kernels/$KERNELRELEASE +$S$M cd %{buildroot}/lib/modules/$KERNELRELEASE +$S$M ln -sf /usr/src/kernels/$KERNELRELEASE build +$S$M ln -sf /usr/src/kernels/$KERNELRELEASE source + + %clean + rm -rf %{buildroot} + + %post + if [ -x /sbin/installkernel -a -r /boot/vmlinuz-$KERNELRELEASE -a -r /boot/System.map-$KERNELRELEASE ]; then + cp /boot/vmlinuz-$KERNELRELEASE /boot/.vmlinuz-$KERNELRELEASE-rpm + cp /boot/System.map-$KERNELRELEASE /boot/.System.map-$KERNELRELEASE-rpm + rm -f /boot/vmlinuz-$KERNELRELEASE /boot/System.map-$KERNELRELEASE + /sbin/installkernel $KERNELRELEASE /boot/.vmlinuz-$KERNELRELEASE-rpm /boot/.System.map-$KERNELRELEASE-rpm + rm -f /boot/.vmlinuz-$KERNELRELEASE-rpm /boot/.System.map-$KERNELRELEASE-rpm + fi + + %preun + if [ -x /sbin/new-kernel-pkg ]; then + new-kernel-pkg --remove $KERNELRELEASE --rminitrd --initrdfile=/boot/initramfs-$KERNELRELEASE.img + elif [ -x /usr/bin/kernel-install ]; then + kernel-install remove $KERNELRELEASE + fi + + %postun + if [ -x /sbin/update-bootloader ]; then + /sbin/update-bootloader --remove $KERNELRELEASE + fi + + %files + %defattr (-, root, root) +$M /lib/modules/$KERNELRELEASE +$M %exclude /lib/modules/$KERNELRELEASE/build +$M %exclude /lib/modules/$KERNELRELEASE/source + /boot/* + + %files headers + %defattr (-, root, root) + /usr/include +$S$M +$S$M %files devel +$S$M %defattr (-, root, root) +$S$M /usr/src/kernels/$KERNELRELEASE +$S$M /lib/modules/$KERNELRELEASE/build +$S$M /lib/modules/$KERNELRELEASE/source +EOF diff --git a/src/net/scripts/package/snapcraft.template b/src/net/scripts/package/snapcraft.template new file mode 100644 index 0000000..626d278 --- /dev/null +++ b/src/net/scripts/package/snapcraft.template @@ -0,0 +1,14 @@ +name: kernel +version: KERNELRELEASE +summary: Linux kernel +description: The upstream Linux kernel +grade: stable +confinement: strict +type: kernel + +parts: + kernel: + plugin: kernel + source: SRCTREE + source-type: tar + kernel-with-firmware: false diff --git a/src/net/scripts/pahole-flags.sh b/src/net/scripts/pahole-flags.sh new file mode 100755 index 0000000..8c82173 --- /dev/null +++ b/src/net/scripts/pahole-flags.sh @@ -0,0 +1,21 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 + +extra_paholeopt= + +if ! [ -x "$(command -v ${PAHOLE})" ]; then + exit 0 +fi + +pahole_ver=$(${PAHOLE} --version | sed -E 's/v([0-9]+)\.([0-9]+)/\1\2/') + +if [ "${pahole_ver}" -ge "118" ] && [ "${pahole_ver}" -le "121" ]; then + # pahole 1.18 through 1.21 can't handle zero-sized per-CPU vars + extra_paholeopt="${extra_paholeopt} --skip_encoding_btf_vars" +fi + +if [ "${pahole_ver}" -ge "124" ]; then + extra_paholeopt="${extra_paholeopt} --skip_encoding_btf_enum64" +fi + +echo ${extra_paholeopt} diff --git a/src/net/scripts/parse-maintainers.pl b/src/net/scripts/parse-maintainers.pl new file mode 100755 index 0000000..2ca4eb3 --- /dev/null +++ b/src/net/scripts/parse-maintainers.pl @@ -0,0 +1,194 @@ +#!/usr/bin/perl -w +# SPDX-License-Identifier: GPL-2.0 + +use strict; +use Getopt::Long qw(:config no_auto_abbrev); + +my $input_file = "MAINTAINERS"; +my $output_file = "MAINTAINERS.new"; +my $output_section = "SECTION.new"; +my $help = 0; +my $order = 0; +my $P = $0; + +if (!GetOptions( + 'input=s' => \$input_file, + 'output=s' => \$output_file, + 'section=s' => \$output_section, + 'order!' => \$order, + 'h|help|usage' => \$help, + )) { + die "$P: invalid argument - use --help if necessary\n"; +} + +if ($help != 0) { + usage(); + exit 0; +} + +sub usage { + print <<EOT; +usage: $P [options] <pattern matching regexes> + + --input => MAINTAINERS file to read (default: MAINTAINERS) + --output => sorted MAINTAINERS file to write (default: MAINTAINERS.new) + --section => new sorted MAINTAINERS file to write to (default: SECTION.new) + --order => Use the preferred section content output ordering (default: 0) + Preferred ordering of section output is: + M: Person acting as a maintainer + R: Person acting as a patch reviewer + L: Mailing list where patches should be sent + S: Maintenance status + W: URI for general information + Q: URI for patchwork tracking + B: URI for bug tracking/submission + C: URI for chat + P: URI or file for subsystem specific coding styles + T: SCM tree type and location + F: File and directory pattern + X: File and directory exclusion pattern + N: File glob + K: Keyword - patch content regex + +If <pattern match regexes> exist, then the sections that match the +regexes are not written to the output file but are written to the +section file. + +EOT +} + +# sort comparison functions +sub by_category($$) { + my ($a, $b) = @_; + + $a = uc $a; + $b = uc $b; + + # This always sorts last + $a =~ s/THE REST/ZZZZZZ/g; + $b =~ s/THE REST/ZZZZZZ/g; + + return $a cmp $b; +} + +sub by_pattern($$) { + my ($a, $b) = @_; + my $preferred_order = 'MRLSWQBCPTFXNK'; + + my $a1 = uc(substr($a, 0, 1)); + my $b1 = uc(substr($b, 0, 1)); + + my $a_index = index($preferred_order, $a1); + my $b_index = index($preferred_order, $b1); + + $a_index = 1000 if ($a_index == -1); + $b_index = 1000 if ($b_index == -1); + + if (($a1 =~ /^F$/ && $b1 =~ /^F$/) || + ($a1 =~ /^X$/ && $b1 =~ /^X$/)) { + return $a cmp $b; + } + + if ($a_index < $b_index) { + return -1; + } elsif ($a_index == $b_index) { + return 0; + } else { + return 1; + } +} + +sub trim { + my $s = shift; + $s =~ s/\s+$//; + $s =~ s/^\s+//; + return $s; +} + +sub alpha_output { + my ($hashref, $filename) = (@_); + + return if ! scalar(keys %$hashref); + + open(my $file, '>', "$filename") or die "$P: $filename: open failed - $!\n"; + my $separator; + foreach my $key (sort by_category keys %$hashref) { + if ($key eq " ") { + print $file $$hashref{$key}; + } else { + if (! defined $separator) { + $separator = "\n"; + } else { + print $file $separator; + } + print $file $key . "\n"; + if ($order) { + foreach my $pattern (sort by_pattern split('\n', %$hashref{$key})) { + print $file ($pattern . "\n"); + } + } else { + foreach my $pattern (split('\n', %$hashref{$key})) { + print $file ($pattern . "\n"); + } + } + } + } + close($file); +} + +sub file_input { + my ($hashref, $filename) = (@_); + + my $lastline = ""; + my $case = " "; + $$hashref{$case} = ""; + + open(my $file, '<', "$filename") or die "$P: $filename: open failed - $!\n"; + + while (<$file>) { + my $line = $_; + + # Pattern line? + if ($line =~ m/^([A-Z]):\s*(.*)/) { + $line = $1 . ":\t" . trim($2) . "\n"; + if ($lastline eq "") { + $$hashref{$case} = $$hashref{$case} . $line; + next; + } + $case = trim($lastline); + exists $$hashref{$case} and die "Header '$case' already exists"; + $$hashref{$case} = $line; + $lastline = ""; + next; + } + + if ($case eq " ") { + $$hashref{$case} = $$hashref{$case} . $lastline; + $lastline = $line; + next; + } + trim($lastline) eq "" or die ("Odd non-pattern line '$lastline' for '$case'"); + $lastline = $line; + } + $$hashref{$case} = $$hashref{$case} . $lastline; + close($file); +} + +my %hash; +my %new_hash; + +file_input(\%hash, $input_file); + +foreach my $type (@ARGV) { + foreach my $key (keys %hash) { + if ($key =~ /$type/ || $hash{$key} =~ /$type/) { + $new_hash{$key} = $hash{$key}; + delete $hash{$key}; + } + } +} + +alpha_output(\%hash, $output_file); +alpha_output(\%new_hash, $output_section); + +exit(0); diff --git a/src/net/scripts/patch-kernel b/src/net/scripts/patch-kernel new file mode 100755 index 0000000..033d591 --- /dev/null +++ b/src/net/scripts/patch-kernel @@ -0,0 +1,332 @@ +#! /bin/sh +# SPDX-License-Identifier: GPL-2.0 +# Script to apply kernel patches. +# usage: patch-kernel [ sourcedir [ patchdir [ stopversion ] [ -acxx ] ] ] +# The source directory defaults to /usr/src/linux, and the patch +# directory defaults to the current directory. +# e.g. +# scripts/patch-kernel . .. +# Update the kernel tree in the current directory using patches in the +# directory above to the latest Linus kernel +# scripts/patch-kernel . .. -ac +# Get the latest Linux kernel and patch it with the latest ac patch +# scripts/patch-kernel . .. 2.4.9 +# Gets standard kernel 2.4.9 +# scripts/patch-kernel . .. 2.4.9 -ac +# Gets 2.4.9 with latest ac patches +# scripts/patch-kernel . .. 2.4.9 -ac11 +# Gets 2.4.9 with ac patch ac11 +# Note: It uses the patches relative to the Linus kernels, not the +# ac to ac relative patches +# +# It determines the current kernel version from the top-level Makefile. +# It then looks for patches for the next sublevel in the patch directory. +# This is applied using "patch -p1 -s" from within the kernel directory. +# A check is then made for "*.rej" files to see if the patch was +# successful. If it is, then all of the "*.orig" files are removed. +# +# Nick Holloway <Nick.Holloway@alfie.demon.co.uk>, 2nd January 1995. +# +# Added support for handling multiple types of compression. What includes +# gzip, bzip, bzip2, zip, compress, and plaintext. +# +# Adam Sulmicki <adam@cfar.umd.edu>, 1st January 1997. +# +# Added ability to stop at a given version number +# Put the full version number (i.e. 2.3.31) as the last parameter +# Dave Gilbert <linux@treblig.org>, 11th December 1999. + +# Fixed previous patch so that if we are already at the correct version +# not to patch up. +# +# Added -ac option, use -ac or -ac9 (say) to stop at a particular version +# Dave Gilbert <linux@treblig.org>, 29th September 2001. +# +# Add support for (use of) EXTRAVERSION (to support 2.6.8.x, e.g.); +# update usage message; +# fix some whitespace damage; +# be smarter about stopping when current version is larger than requested; +# Randy Dunlap <rdunlap@xenotime.net>, 2004-AUG-18. +# +# Add better support for (non-incremental) 2.6.x.y patches; +# If an ending version number if not specified, the script automatically +# increments the SUBLEVEL (x in 2.6.x.y) until no more patch files are found; +# however, EXTRAVERSION (y in 2.6.x.y) is never automatically incremented +# but must be specified fully. +# +# patch-kernel does not normally support reverse patching, but does so when +# applying EXTRAVERSION (x.y) patches, so that moving from 2.6.11.y to 2.6.11.z +# is easy and handled by the script (reverse 2.6.11.y and apply 2.6.11.z). +# Randy Dunlap <rdunlap@xenotime.net>, 2005-APR-08. + +PNAME=patch-kernel + +# Set directories from arguments, or use defaults. +sourcedir=${1-/usr/src/linux} +patchdir=${2-.} +stopvers=${3-default} + +if [ "$1" = -h -o "$1" = --help -o ! -r "$sourcedir/Makefile" ]; then +cat << USAGE +usage: $PNAME [-h] [ sourcedir [ patchdir [ stopversion ] [ -acxx ] ] ] + source directory defaults to /usr/src/linux, + patch directory defaults to the current directory, + stopversion defaults to <all in patchdir>. +USAGE +exit 1 +fi + +# See if we have any -ac options +for PARM in $* +do + case $PARM in + -ac*) + gotac=$PARM; + + esac; +done + +# --------------------------------------------------------------------------- +# arg1 is filename +noFile () { + echo "cannot find patch file: ${patch}" + exit 1 +} + +# --------------------------------------------------------------------------- +backwards () { + echo "$PNAME does not support reverse patching" + exit 1 +} + +# --------------------------------------------------------------------------- +# Find a file, first parameter is basename of file +# it tries many compression mechanisms and sets variables to say how to get it +findFile () { + filebase=$1; + + if [ -r ${filebase}.gz ]; then + ext=".gz" + name="gzip" + uncomp="gunzip -dc" + elif [ -r ${filebase}.bz ]; then + ext=".bz" + name="bzip" + uncomp="bunzip -dc" + elif [ -r ${filebase}.bz2 ]; then + ext=".bz2" + name="bzip2" + uncomp="bunzip2 -dc" + elif [ -r ${filebase}.xz ]; then + ext=".xz" + name="xz" + uncomp="xz -dc" + elif [ -r ${filebase}.zip ]; then + ext=".zip" + name="zip" + uncomp="unzip -d" + elif [ -r ${filebase}.Z ]; then + ext=".Z" + name="uncompress" + uncomp="uncompress -c" + elif [ -r ${filebase} ]; then + ext="" + name="plaintext" + uncomp="cat" + else + return 1; + fi + + return 0; +} + +# --------------------------------------------------------------------------- +# Apply a patch and check it goes in cleanly +# First param is patch name (e.g. patch-2.4.9-ac5) - without path or extension + +applyPatch () { + echo -n "Applying $1 (${name})... " + if $uncomp ${patchdir}/$1${ext} | patch -p1 -s -N -E -d $sourcedir + then + echo "done." + else + echo "failed. Clean up yourself." + return 1; + fi + if [ "`find $sourcedir/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ] + then + echo "Aborting. Reject files found." + return 1; + fi + # Remove backup files + find $sourcedir/ '(' -name '*.orig' -o -name '.*.orig' ')' -exec rm -f {} \; + + return 0; +} + +# --------------------------------------------------------------------------- +# arg1 is patch filename +reversePatch () { + echo -n "Reversing $1 (${name}) ... " + if $uncomp ${patchdir}/"$1"${ext} | patch -p1 -Rs -N -E -d $sourcedir + then + echo "done." + else + echo "failed. Clean it up." + exit 1 + fi + if [ "`find $sourcedir/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ] + then + echo "Aborting. Reject files found." + return 1 + fi + # Remove backup files + find $sourcedir/ '(' -name '*.orig' -o -name '.*.orig' ')' -exec rm -f {} \; + + return 0 +} + +# set current VERSION, PATCHLEVEL, SUBLEVEL, EXTRAVERSION +# force $TMPFILEs below to be in local directory: a slash character prevents +# the dot command from using the search path. +TMPFILE=`mktemp ./.tmpver.XXXXXX` || { echo "cannot make temp file" ; exit 1; } +grep -E "^(VERSION|PATCHLEVEL|SUBLEVEL|EXTRAVERSION)" $sourcedir/Makefile > $TMPFILE +tr -d [:blank:] < $TMPFILE > $TMPFILE.1 +. $TMPFILE.1 +rm -f $TMPFILE* +if [ -z "$VERSION" -o -z "$PATCHLEVEL" -o -z "$SUBLEVEL" ] +then + echo "unable to determine current kernel version" >&2 + exit 1 +fi + +NAME=`grep ^NAME $sourcedir/Makefile` +NAME=${NAME##*=} + +echo "Current kernel version is $VERSION.$PATCHLEVEL.$SUBLEVEL${EXTRAVERSION} ($NAME)" + +# strip EXTRAVERSION to just a number (drop leading '.' and trailing additions) +EXTRAVER= +if [ x$EXTRAVERSION != "x" ] +then + EXTRAVER=${EXTRAVERSION#.} + EXTRAVER=${EXTRAVER%%[[:punct:]]*} + #echo "$PNAME: changing EXTRAVERSION from $EXTRAVERSION to $EXTRAVER" +fi + +#echo "stopvers=$stopvers" +if [ $stopvers != "default" ]; then + STOPSUBLEVEL=`echo $stopvers | cut -d. -f3` + STOPEXTRA=`echo $stopvers | cut -d. -f4` + STOPFULLVERSION=${stopvers%%.$STOPEXTRA} + #echo "#___STOPSUBLEVEL=/$STOPSUBLEVEL/, STOPEXTRA=/$STOPEXTRA/" +else + STOPSUBLEVEL=9999 + STOPEXTRA=9999 +fi + +# This all assumes a 2.6.x[.y] kernel tree. +# Don't allow backwards/reverse patching. +if [ $STOPSUBLEVEL -lt $SUBLEVEL ]; then + backwards +fi + +if [ x$EXTRAVER != "x" ]; then + CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL.$EXTRAVER" +else + CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL" +fi + +if [ x$EXTRAVER != "x" ]; then + echo "backing up to: $VERSION.$PATCHLEVEL.$SUBLEVEL" + patch="patch-${CURRENTFULLVERSION}" + findFile $patchdir/${patch} || noFile ${patch} + reversePatch ${patch} || exit 1 +fi + +# now current is 2.6.x, with no EXTRA applied, +# so update to target SUBLEVEL (2.6.SUBLEVEL) +# and then to target EXTRAVER (2.6.SUB.EXTRAVER) if requested. +# If not ending sublevel is specified, it is incremented until +# no further sublevels are found. + +if [ $STOPSUBLEVEL -gt $SUBLEVEL ]; then +while : # incrementing SUBLEVEL (s in v.p.s) +do + CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL" + EXTRAVER= + if [ x$STOPFULLVERSION = x$CURRENTFULLVERSION ]; then + echo "Stopping at $CURRENTFULLVERSION base as requested." + break + fi + + SUBLEVEL=$(($SUBLEVEL + 1)) + FULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL" + #echo "#___ trying $FULLVERSION ___" + + if [ $(($SUBLEVEL)) -gt $(($STOPSUBLEVEL)) ]; then + echo "Stopping since sublevel ($SUBLEVEL) is beyond stop-sublevel ($STOPSUBLEVEL)" + exit 1 + fi + + patch=patch-$FULLVERSION + # See if the file exists and find extension + findFile $patchdir/${patch} || noFile ${patch} + + # Apply the patch and check all is OK + applyPatch $patch || break +done +#echo "#___sublevel all done" +fi + +# There is no incremental searching for extraversion... +if [ "$STOPEXTRA" != "" ]; then +while : # just to allow break +do +# apply STOPEXTRA directly (not incrementally) (x in v.p.s.x) + FULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL.$STOPEXTRA" + #echo "#... trying $FULLVERSION ..." + patch=patch-$FULLVERSION + + # See if the file exists and find extension + findFile $patchdir/${patch} || noFile ${patch} + + # Apply the patch and check all is OK + applyPatch $patch || break + #echo "#___extraver all done" + break +done +fi + +if [ x$gotac != x ]; then + # Out great user wants the -ac patches + # They could have done -ac (get latest) or -acxx where xx=version they want + if [ $gotac = "-ac" ]; then + # They want the latest version + HIGHESTPATCH=0 + for PATCHNAMES in $patchdir/patch-${CURRENTFULLVERSION}-ac*\.* + do + ACVALUE=`echo $PATCHNAMES | sed -e 's/^.*patch-[0-9.]*-ac\([0-9]*\).*/\1/'` + # Check it is actually a recognised patch type + findFile $patchdir/patch-${CURRENTFULLVERSION}-ac${ACVALUE} || break + + if [ $ACVALUE -gt $HIGHESTPATCH ]; then + HIGHESTPATCH=$ACVALUE + fi + done + + if [ $HIGHESTPATCH -ne 0 ]; then + findFile $patchdir/patch-${CURRENTFULLVERSION}-ac${HIGHESTPATCH} || break + applyPatch patch-${CURRENTFULLVERSION}-ac${HIGHESTPATCH} + else + echo "No -ac patches found" + fi + else + # They want an exact version + findFile $patchdir/patch-${CURRENTFULLVERSION}${gotac} || { + echo "Sorry, I couldn't find the $gotac patch for $CURRENTFULLVERSION. Hohum." + exit 1 + } + applyPatch patch-${CURRENTFULLVERSION}${gotac} + fi +fi diff --git a/src/net/scripts/profile2linkerlist.pl b/src/net/scripts/profile2linkerlist.pl new file mode 100755 index 0000000..316e719 --- /dev/null +++ b/src/net/scripts/profile2linkerlist.pl @@ -0,0 +1,20 @@ +#!/usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0 + +# +# Takes a (sorted) output of readprofile and turns it into a list suitable for +# linker scripts +# +# usage: +# readprofile | sort -rn | perl profile2linkerlist.pl > functionlist +# +use strict; + +while (<>) { + my $line = $_; + + $_ =~ /\W*[0-9]+\W*([a-zA-Z\_0-9]+)\W*[0-9]+/; + + print "*(.text.$1)\n" + unless ($line =~ /unknown/) || ($line =~ /total/); +} diff --git a/src/net/scripts/prune-kernel b/src/net/scripts/prune-kernel new file mode 100755 index 0000000..e8aa940 --- /dev/null +++ b/src/net/scripts/prune-kernel @@ -0,0 +1,21 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +# because I use CONFIG_LOCALVERSION_AUTO, not the same version again and +# again, /boot and /lib/modules/ eventually fill up. +# Dumb script to purge that stuff: + +for f in "$@" +do + if rpm -qf "/lib/modules/$f" >/dev/null; then + echo "keeping $f (installed from rpm)" + elif [ $(uname -r) = "$f" ]; then + echo "keeping $f (running kernel) " + else + echo "removing $f" + rm -f "/boot/initramfs-$f.img" "/boot/System.map-$f" + rm -f "/boot/vmlinuz-$f" "/boot/config-$f" + rm -rf "/lib/modules/$f" + new-kernel-pkg --remove $f + fi +done diff --git a/src/net/scripts/recordmcount.c b/src/net/scripts/recordmcount.c new file mode 100644 index 0000000..f7cf4fd --- /dev/null +++ b/src/net/scripts/recordmcount.c @@ -0,0 +1,710 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * recordmcount.c: construct a table of the locations of calls to 'mcount' + * so that ftrace can find them quickly. + * Copyright 2009 John F. Reiser <jreiser@BitWagon.com>. All rights reserved. + * + * Restructured to fit Linux format, as well as other updates: + * Copyright 2010 Steven Rostedt <srostedt@redhat.com>, Red Hat Inc. + */ + +/* + * Strategy: alter the .o file in-place. + * + * Append a new STRTAB that has the new section names, followed by a new array + * ElfXX_Shdr[] that has the new section headers, followed by the section + * contents for __mcount_loc and its relocations. The old shstrtab strings, + * and the old ElfXX_Shdr[] array, remain as "garbage" (commonly, a couple + * kilobytes.) Subsequent processing by /bin/ld (or the kernel module loader) + * will ignore the garbage regions, because they are not designated by the + * new .e_shoff nor the new ElfXX_Shdr[]. [In order to remove the garbage, + * then use "ld -r" to create a new file that omits the garbage.] + */ + +#include <sys/types.h> +#include <sys/mman.h> +#include <sys/stat.h> +#include <getopt.h> +#include <elf.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#ifndef EM_AARCH64 +#define EM_AARCH64 183 +#define R_AARCH64_NONE 0 +#define R_AARCH64_ABS64 257 +#endif + +#ifndef EM_SW64 +#define EM_SW64 0x9916 +#define R_SW64_NONE 0 +#define R_SW64_REFQUAD 2 /* Direct 64 bit */ +#endif + +#define R_ARM_PC24 1 +#define R_ARM_THM_CALL 10 +#define R_ARM_CALL 28 + +#define R_AARCH64_CALL26 283 + +static int fd_map; /* File descriptor for file being modified. */ +static int mmap_failed; /* Boolean flag. */ +static char gpfx; /* prefix for global symbol name (sometimes '_') */ +static struct stat sb; /* Remember .st_size, etc. */ +static const char *altmcount; /* alternate mcount symbol name */ +static int warn_on_notrace_sect; /* warn when section has mcount not being recorded */ +static void *file_map; /* pointer of the mapped file */ +static void *file_end; /* pointer to the end of the mapped file */ +static int file_updated; /* flag to state file was changed */ +static void *file_ptr; /* current file pointer location */ + +static void *file_append; /* added to the end of the file */ +static size_t file_append_size; /* how much is added to end of file */ + +/* Per-file resource cleanup when multiple files. */ +static void file_append_cleanup(void) +{ + free(file_append); + file_append = NULL; + file_append_size = 0; + file_updated = 0; +} + +static void mmap_cleanup(void) +{ + if (!mmap_failed) + munmap(file_map, sb.st_size); + else + free(file_map); + file_map = NULL; +} + +/* ulseek, uwrite, ...: Check return value for errors. */ + +static off_t ulseek(off_t const offset, int const whence) +{ + switch (whence) { + case SEEK_SET: + file_ptr = file_map + offset; + break; + case SEEK_CUR: + file_ptr += offset; + break; + case SEEK_END: + file_ptr = file_map + (sb.st_size - offset); + break; + } + if (file_ptr < file_map) { + fprintf(stderr, "lseek: seek before file\n"); + return -1; + } + return file_ptr - file_map; +} + +static ssize_t uwrite(void const *const buf, size_t const count) +{ + size_t cnt = count; + off_t idx = 0; + + file_updated = 1; + + if (file_ptr + count >= file_end) { + off_t aoffset = (file_ptr + count) - file_end; + + if (aoffset > file_append_size) { + file_append = realloc(file_append, aoffset); + file_append_size = aoffset; + } + if (!file_append) { + perror("write"); + file_append_cleanup(); + mmap_cleanup(); + return -1; + } + if (file_ptr < file_end) { + cnt = file_end - file_ptr; + } else { + cnt = 0; + idx = aoffset - count; + } + } + + if (cnt) + memcpy(file_ptr, buf, cnt); + + if (cnt < count) + memcpy(file_append + idx, buf + cnt, count - cnt); + + file_ptr += count; + return count; +} + +static void * umalloc(size_t size) +{ + void *const addr = malloc(size); + if (addr == 0) { + fprintf(stderr, "malloc failed: %zu bytes\n", size); + file_append_cleanup(); + mmap_cleanup(); + return NULL; + } + return addr; +} + +/* + * Get the whole file as a programming convenience in order to avoid + * malloc+lseek+read+free of many pieces. If successful, then mmap + * avoids copying unused pieces; else just read the whole file. + * Open for both read and write; new info will be appended to the file. + * Use MAP_PRIVATE so that a few changes to the in-memory ElfXX_Ehdr + * do not propagate to the file until an explicit overwrite at the last. + * This preserves most aspects of consistency (all except .st_size) + * for simultaneous readers of the file while we are appending to it. + * However, multiple writers still are bad. We choose not to use + * locking because it is expensive and the use case of kernel build + * makes multiple writers unlikely. + */ +static void *mmap_file(char const *fname) +{ + /* Avoid problems if early cleanup() */ + fd_map = -1; + mmap_failed = 1; + file_map = NULL; + file_ptr = NULL; + file_updated = 0; + sb.st_size = 0; + + fd_map = open(fname, O_RDONLY); + if (fd_map < 0) { + perror(fname); + return NULL; + } + if (fstat(fd_map, &sb) < 0) { + perror(fname); + goto out; + } + if (!S_ISREG(sb.st_mode)) { + fprintf(stderr, "not a regular file: %s\n", fname); + goto out; + } + file_map = mmap(0, sb.st_size, PROT_READ|PROT_WRITE, MAP_PRIVATE, + fd_map, 0); + if (file_map == MAP_FAILED) { + mmap_failed = 1; + file_map = umalloc(sb.st_size); + if (!file_map) { + perror(fname); + goto out; + } + if (read(fd_map, file_map, sb.st_size) != sb.st_size) { + perror(fname); + free(file_map); + file_map = NULL; + goto out; + } + } else + mmap_failed = 0; +out: + close(fd_map); + fd_map = -1; + + file_end = file_map + sb.st_size; + + return file_map; +} + + +static unsigned char ideal_nop5_x86_64[5] = { 0x0f, 0x1f, 0x44, 0x00, 0x00 }; +static unsigned char ideal_nop5_x86_32[5] = { 0x3e, 0x8d, 0x74, 0x26, 0x00 }; +static unsigned char *ideal_nop; + +static char rel_type_nop; + +static int (*make_nop)(void *map, size_t const offset); + +static int make_nop_x86(void *map, size_t const offset) +{ + uint32_t *ptr; + unsigned char *op; + + /* Confirm we have 0xe8 0x0 0x0 0x0 0x0 */ + ptr = map + offset; + if (*ptr != 0) + return -1; + + op = map + offset - 1; + if (*op != 0xe8) + return -1; + + /* convert to nop */ + if (ulseek(offset - 1, SEEK_SET) < 0) + return -1; + if (uwrite(ideal_nop, 5) < 0) + return -1; + return 0; +} + +static unsigned char ideal_nop4_arm_le[4] = { 0x00, 0x00, 0xa0, 0xe1 }; /* mov r0, r0 */ +static unsigned char ideal_nop4_arm_be[4] = { 0xe1, 0xa0, 0x00, 0x00 }; /* mov r0, r0 */ +static unsigned char *ideal_nop4_arm; + +static unsigned char bl_mcount_arm_le[4] = { 0xfe, 0xff, 0xff, 0xeb }; /* bl */ +static unsigned char bl_mcount_arm_be[4] = { 0xeb, 0xff, 0xff, 0xfe }; /* bl */ +static unsigned char *bl_mcount_arm; + +static unsigned char push_arm_le[4] = { 0x04, 0xe0, 0x2d, 0xe5 }; /* push {lr} */ +static unsigned char push_arm_be[4] = { 0xe5, 0x2d, 0xe0, 0x04 }; /* push {lr} */ +static unsigned char *push_arm; + +static unsigned char ideal_nop2_thumb_le[2] = { 0x00, 0xbf }; /* nop */ +static unsigned char ideal_nop2_thumb_be[2] = { 0xbf, 0x00 }; /* nop */ +static unsigned char *ideal_nop2_thumb; + +static unsigned char push_bl_mcount_thumb_le[6] = { 0x00, 0xb5, 0xff, 0xf7, 0xfe, 0xff }; /* push {lr}, bl */ +static unsigned char push_bl_mcount_thumb_be[6] = { 0xb5, 0x00, 0xf7, 0xff, 0xff, 0xfe }; /* push {lr}, bl */ +static unsigned char *push_bl_mcount_thumb; + +static int make_nop_arm(void *map, size_t const offset) +{ + char *ptr; + int cnt = 1; + int nop_size; + size_t off = offset; + + ptr = map + offset; + if (memcmp(ptr, bl_mcount_arm, 4) == 0) { + if (memcmp(ptr - 4, push_arm, 4) == 0) { + off -= 4; + cnt = 2; + } + ideal_nop = ideal_nop4_arm; + nop_size = 4; + } else if (memcmp(ptr - 2, push_bl_mcount_thumb, 6) == 0) { + cnt = 3; + nop_size = 2; + off -= 2; + ideal_nop = ideal_nop2_thumb; + } else + return -1; + + /* Convert to nop */ + if (ulseek(off, SEEK_SET) < 0) + return -1; + + do { + if (uwrite(ideal_nop, nop_size) < 0) + return -1; + } while (--cnt > 0); + + return 0; +} + +static unsigned char ideal_nop4_arm64[4] = {0x1f, 0x20, 0x03, 0xd5}; +static int make_nop_arm64(void *map, size_t const offset) +{ + uint32_t *ptr; + + ptr = map + offset; + /* bl <_mcount> is 0x94000000 before relocation */ + if (*ptr != 0x94000000) + return -1; + + /* Convert to nop */ + if (ulseek(offset, SEEK_SET) < 0) + return -1; + if (uwrite(ideal_nop, 4) < 0) + return -1; + return 0; +} + +static unsigned char ideal_nop4_sw64[4] = {0x5f, 0x07, 0xff, 0x43}; + +static int make_nop_sw64(void *map, size_t const offset) +{ + /* Convert to nop */ + ulseek(offset, SEEK_SET); + uwrite(ideal_nop, 4); + return 0; +} + +static int write_file(const char *fname) +{ + char tmp_file[strlen(fname) + 4]; + size_t n; + + if (!file_updated) + return 0; + + sprintf(tmp_file, "%s.rc", fname); + + /* + * After reading the entire file into memory, delete it + * and write it back, to prevent weird side effects of modifying + * an object file in place. + */ + fd_map = open(tmp_file, O_WRONLY | O_TRUNC | O_CREAT, sb.st_mode); + if (fd_map < 0) { + perror(fname); + return -1; + } + n = write(fd_map, file_map, sb.st_size); + if (n != sb.st_size) { + perror("write"); + close(fd_map); + return -1; + } + if (file_append_size) { + n = write(fd_map, file_append, file_append_size); + if (n != file_append_size) { + perror("write"); + close(fd_map); + return -1; + } + } + close(fd_map); + if (rename(tmp_file, fname) < 0) { + perror(fname); + return -1; + } + return 0; +} + +/* w8rev, w8nat, ...: Handle endianness. */ + +static uint64_t w8rev(uint64_t const x) +{ + return ((0xff & (x >> (0 * 8))) << (7 * 8)) + | ((0xff & (x >> (1 * 8))) << (6 * 8)) + | ((0xff & (x >> (2 * 8))) << (5 * 8)) + | ((0xff & (x >> (3 * 8))) << (4 * 8)) + | ((0xff & (x >> (4 * 8))) << (3 * 8)) + | ((0xff & (x >> (5 * 8))) << (2 * 8)) + | ((0xff & (x >> (6 * 8))) << (1 * 8)) + | ((0xff & (x >> (7 * 8))) << (0 * 8)); +} + +static uint32_t w4rev(uint32_t const x) +{ + return ((0xff & (x >> (0 * 8))) << (3 * 8)) + | ((0xff & (x >> (1 * 8))) << (2 * 8)) + | ((0xff & (x >> (2 * 8))) << (1 * 8)) + | ((0xff & (x >> (3 * 8))) << (0 * 8)); +} + +static uint32_t w2rev(uint16_t const x) +{ + return ((0xff & (x >> (0 * 8))) << (1 * 8)) + | ((0xff & (x >> (1 * 8))) << (0 * 8)); +} + +static uint64_t w8nat(uint64_t const x) +{ + return x; +} + +static uint32_t w4nat(uint32_t const x) +{ + return x; +} + +static uint32_t w2nat(uint16_t const x) +{ + return x; +} + +static uint64_t (*w8)(uint64_t); +static uint32_t (*w)(uint32_t); +static uint32_t (*w2)(uint16_t); + +/* Names of the sections that could contain calls to mcount. */ +static int is_mcounted_section_name(char const *const txtname) +{ + return strncmp(".text", txtname, 5) == 0 || + strcmp(".init.text", txtname) == 0 || + strcmp(".ref.text", txtname) == 0 || + strcmp(".sched.text", txtname) == 0 || + strcmp(".spinlock.text", txtname) == 0 || + strcmp(".irqentry.text", txtname) == 0 || + strcmp(".softirqentry.text", txtname) == 0 || + strcmp(".kprobes.text", txtname) == 0 || + strcmp(".cpuidle.text", txtname) == 0; +} + +static char const *already_has_rel_mcount = "success"; /* our work here is done! */ + +/* 32 bit and 64 bit are very similar */ +#include "recordmcount.h" +#define RECORD_MCOUNT_64 +#include "recordmcount.h" + +static int arm_is_fake_mcount(Elf32_Rel const *rp) +{ + switch (ELF32_R_TYPE(w(rp->r_info))) { + case R_ARM_THM_CALL: + case R_ARM_CALL: + case R_ARM_PC24: + return 0; + } + + return 1; +} + +static int arm64_is_fake_mcount(Elf64_Rel const *rp) +{ + return ELF64_R_TYPE(w8(rp->r_info)) != R_AARCH64_CALL26; +} + +#define SW64_FAKEMCOUNT_OFFSET 4 + +static int sw64_is_fake_mcount(Elf64_Rel const *rp) +{ + static Elf64_Addr old_r_offset = ~(Elf64_Addr)0; + Elf64_Addr current_r_offset = _w(rp->r_offset); + int is_fake; + + is_fake = (old_r_offset != ~(Elf64_Addr)0) && + (current_r_offset - old_r_offset == SW64_FAKEMCOUNT_OFFSET); + old_r_offset = current_r_offset; + + return is_fake; +} + +/* 64-bit EM_MIPS has weird ELF64_Rela.r_info. + * http://techpubs.sgi.com/library/manuals/4000/007-4658-001/pdf/007-4658-001.pdf + * We interpret Table 29 Relocation Operation (Elf64_Rel, Elf64_Rela) [p.40] + * to imply the order of the members; the spec does not say so. + * typedef unsigned char Elf64_Byte; + * fails on MIPS64 because their <elf.h> already has it! + */ + +typedef uint8_t myElf64_Byte; /* Type for a 8-bit quantity. */ + +union mips_r_info { + Elf64_Xword r_info; + struct { + Elf64_Word r_sym; /* Symbol index. */ + myElf64_Byte r_ssym; /* Special symbol. */ + myElf64_Byte r_type3; /* Third relocation. */ + myElf64_Byte r_type2; /* Second relocation. */ + myElf64_Byte r_type; /* First relocation. */ + } r_mips; +}; + +static uint64_t MIPS64_r_sym(Elf64_Rel const *rp) +{ + return w(((union mips_r_info){ .r_info = rp->r_info }).r_mips.r_sym); +} + +static void MIPS64_r_info(Elf64_Rel *const rp, unsigned sym, unsigned type) +{ + rp->r_info = ((union mips_r_info){ + .r_mips = { .r_sym = w(sym), .r_type = type } + }).r_info; +} + +static int do_file(char const *const fname) +{ + unsigned int reltype = 0; + Elf32_Ehdr *ehdr; + int rc = -1; + + ehdr = mmap_file(fname); + if (!ehdr) + goto out; + + w = w4nat; + w2 = w2nat; + w8 = w8nat; + switch (ehdr->e_ident[EI_DATA]) { + static unsigned int const endian = 1; + default: + fprintf(stderr, "unrecognized ELF data encoding %d: %s\n", + ehdr->e_ident[EI_DATA], fname); + goto out; + case ELFDATA2LSB: + if (*(unsigned char const *)&endian != 1) { + /* main() is big endian, file.o is little endian. */ + w = w4rev; + w2 = w2rev; + w8 = w8rev; + } + ideal_nop4_arm = ideal_nop4_arm_le; + bl_mcount_arm = bl_mcount_arm_le; + push_arm = push_arm_le; + ideal_nop2_thumb = ideal_nop2_thumb_le; + push_bl_mcount_thumb = push_bl_mcount_thumb_le; + break; + case ELFDATA2MSB: + if (*(unsigned char const *)&endian != 0) { + /* main() is little endian, file.o is big endian. */ + w = w4rev; + w2 = w2rev; + w8 = w8rev; + } + ideal_nop4_arm = ideal_nop4_arm_be; + bl_mcount_arm = bl_mcount_arm_be; + push_arm = push_arm_be; + ideal_nop2_thumb = ideal_nop2_thumb_be; + push_bl_mcount_thumb = push_bl_mcount_thumb_be; + break; + } /* end switch */ + if (memcmp(ELFMAG, ehdr->e_ident, SELFMAG) != 0 || + w2(ehdr->e_type) != ET_REL || + ehdr->e_ident[EI_VERSION] != EV_CURRENT) { + fprintf(stderr, "unrecognized ET_REL file %s\n", fname); + goto out; + } + + gpfx = '_'; + switch (w2(ehdr->e_machine)) { + default: + fprintf(stderr, "unrecognized e_machine %u %s\n", + w2(ehdr->e_machine), fname); + goto out; + case EM_386: + reltype = R_386_32; + rel_type_nop = R_386_NONE; + make_nop = make_nop_x86; + ideal_nop = ideal_nop5_x86_32; + mcount_adjust_32 = -1; + gpfx = 0; + break; + case EM_ARM: + reltype = R_ARM_ABS32; + altmcount = "__gnu_mcount_nc"; + make_nop = make_nop_arm; + rel_type_nop = R_ARM_NONE; + is_fake_mcount32 = arm_is_fake_mcount; + gpfx = 0; + break; + case EM_AARCH64: + reltype = R_AARCH64_ABS64; + make_nop = make_nop_arm64; + rel_type_nop = R_AARCH64_NONE; + ideal_nop = ideal_nop4_arm64; + is_fake_mcount64 = arm64_is_fake_mcount; + break; + case EM_SW64: + reltype = R_SW64_REFQUAD; + make_nop = make_nop_sw64; + rel_type_nop = R_SW64_NONE; + ideal_nop = ideal_nop4_sw64; + mcount_adjust_64 = -12; + is_fake_mcount64 = sw64_is_fake_mcount; + break; + case EM_IA_64: reltype = R_IA64_IMM64; break; + case EM_MIPS: /* reltype: e_class */ break; + case EM_PPC: reltype = R_PPC_ADDR32; break; + case EM_PPC64: reltype = R_PPC64_ADDR64; break; + case EM_S390: /* reltype: e_class */ break; + case EM_SH: reltype = R_SH_DIR32; gpfx = 0; break; + case EM_SPARCV9: reltype = R_SPARC_64; break; + case EM_X86_64: + make_nop = make_nop_x86; + ideal_nop = ideal_nop5_x86_64; + reltype = R_X86_64_64; + rel_type_nop = R_X86_64_NONE; + mcount_adjust_64 = -1; + gpfx = 0; + break; + } /* end switch */ + + switch (ehdr->e_ident[EI_CLASS]) { + default: + fprintf(stderr, "unrecognized ELF class %d %s\n", + ehdr->e_ident[EI_CLASS], fname); + goto out; + case ELFCLASS32: + if (w2(ehdr->e_ehsize) != sizeof(Elf32_Ehdr) + || w2(ehdr->e_shentsize) != sizeof(Elf32_Shdr)) { + fprintf(stderr, + "unrecognized ET_REL file: %s\n", fname); + goto out; + } + if (w2(ehdr->e_machine) == EM_MIPS) { + reltype = R_MIPS_32; + is_fake_mcount32 = MIPS32_is_fake_mcount; + } + if (do32(ehdr, fname, reltype) < 0) + goto out; + break; + case ELFCLASS64: { + Elf64_Ehdr *const ghdr = (Elf64_Ehdr *)ehdr; + if (w2(ghdr->e_ehsize) != sizeof(Elf64_Ehdr) + || w2(ghdr->e_shentsize) != sizeof(Elf64_Shdr)) { + fprintf(stderr, + "unrecognized ET_REL file: %s\n", fname); + goto out; + } + if (w2(ghdr->e_machine) == EM_S390) { + reltype = R_390_64; + mcount_adjust_64 = -14; + } + if (w2(ghdr->e_machine) == EM_MIPS) { + reltype = R_MIPS_64; + Elf64_r_sym = MIPS64_r_sym; + Elf64_r_info = MIPS64_r_info; + is_fake_mcount64 = MIPS64_is_fake_mcount; + } + if (do64(ghdr, fname, reltype) < 0) + goto out; + break; + } + } /* end switch */ + + rc = write_file(fname); +out: + file_append_cleanup(); + mmap_cleanup(); + return rc; +} + +int main(int argc, char *argv[]) +{ + const char ftrace[] = "/ftrace.o"; + int ftrace_size = sizeof(ftrace) - 1; + int n_error = 0; /* gcc-4.3.0 false positive complaint */ + int c; + int i; + + while ((c = getopt(argc, argv, "w")) >= 0) { + switch (c) { + case 'w': + warn_on_notrace_sect = 1; + break; + default: + fprintf(stderr, "usage: recordmcount [-w] file.o...\n"); + return 0; + } + } + + if ((argc - optind) < 1) { + fprintf(stderr, "usage: recordmcount [-w] file.o...\n"); + return 0; + } + + /* Process each file in turn, allowing deep failure. */ + for (i = optind; i < argc; i++) { + char *file = argv[i]; + int len; + + /* + * The file kernel/trace/ftrace.o references the mcount + * function but does not call it. Since ftrace.o should + * not be traced anyway, we just skip it. + */ + len = strlen(file); + if (len >= ftrace_size && + strcmp(file + (len - ftrace_size), ftrace) == 0) + continue; + + if (do_file(file)) { + fprintf(stderr, "%s: failed\n", file); + ++n_error; + } + } + return !!n_error; +} diff --git a/src/net/scripts/recordmcount.h b/src/net/scripts/recordmcount.h new file mode 100644 index 0000000..1e9baa5 --- /dev/null +++ b/src/net/scripts/recordmcount.h @@ -0,0 +1,697 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * recordmcount.h + * + * This code was taken out of recordmcount.c written by + * Copyright 2009 John F. Reiser <jreiser@BitWagon.com>. All rights reserved. + * + * The original code had the same algorithms for both 32bit + * and 64bit ELF files, but the code was duplicated to support + * the difference in structures that were used. This + * file creates a macro of everything that is different between + * the 64 and 32 bit code, such that by including this header + * twice we can create both sets of functions by including this + * header once with RECORD_MCOUNT_64 undefined, and again with + * it defined. + * + * This conversion to macros was done by: + * Copyright 2010 Steven Rostedt <srostedt@redhat.com>, Red Hat Inc. + */ +#undef append_func +#undef is_fake_mcount +#undef fn_is_fake_mcount +#undef MIPS_is_fake_mcount +#undef mcount_adjust +#undef sift_rel_mcount +#undef nop_mcount +#undef find_secsym_ndx +#undef __has_rel_mcount +#undef has_rel_mcount +#undef tot_relsize +#undef get_mcountsym +#undef find_symtab +#undef get_shnum +#undef set_shnum +#undef get_shstrndx +#undef get_symindex +#undef get_sym_str_and_relp +#undef do_func +#undef Elf_Addr +#undef Elf_Ehdr +#undef Elf_Shdr +#undef Elf_Rel +#undef Elf_Rela +#undef Elf_Sym +#undef ELF_R_SYM +#undef Elf_r_sym +#undef ELF_R_INFO +#undef Elf_r_info +#undef ELF_ST_BIND +#undef ELF_ST_TYPE +#undef fn_ELF_R_SYM +#undef fn_ELF_R_INFO +#undef uint_t +#undef _w +#undef _align +#undef _size + +#ifdef RECORD_MCOUNT_64 +# define append_func append64 +# define sift_rel_mcount sift64_rel_mcount +# define nop_mcount nop_mcount_64 +# define find_secsym_ndx find64_secsym_ndx +# define __has_rel_mcount __has64_rel_mcount +# define has_rel_mcount has64_rel_mcount +# define tot_relsize tot64_relsize +# define find_symtab find_symtab64 +# define get_shnum get_shnum64 +# define set_shnum set_shnum64 +# define get_shstrndx get_shstrndx64 +# define get_symindex get_symindex64 +# define get_sym_str_and_relp get_sym_str_and_relp_64 +# define do_func do64 +# define get_mcountsym get_mcountsym_64 +# define is_fake_mcount is_fake_mcount64 +# define fn_is_fake_mcount fn_is_fake_mcount64 +# define MIPS_is_fake_mcount MIPS64_is_fake_mcount +# define mcount_adjust mcount_adjust_64 +# define Elf_Addr Elf64_Addr +# define Elf_Ehdr Elf64_Ehdr +# define Elf_Shdr Elf64_Shdr +# define Elf_Rel Elf64_Rel +# define Elf_Rela Elf64_Rela +# define Elf_Sym Elf64_Sym +# define ELF_R_SYM ELF64_R_SYM +# define Elf_r_sym Elf64_r_sym +# define ELF_R_INFO ELF64_R_INFO +# define Elf_r_info Elf64_r_info +# define ELF_ST_BIND ELF64_ST_BIND +# define ELF_ST_TYPE ELF64_ST_TYPE +# define fn_ELF_R_SYM fn_ELF64_R_SYM +# define fn_ELF_R_INFO fn_ELF64_R_INFO +# define uint_t uint64_t +# define _w w8 +# define _align 7u +# define _size 8 +#else +# define append_func append32 +# define sift_rel_mcount sift32_rel_mcount +# define nop_mcount nop_mcount_32 +# define find_secsym_ndx find32_secsym_ndx +# define __has_rel_mcount __has32_rel_mcount +# define has_rel_mcount has32_rel_mcount +# define tot_relsize tot32_relsize +# define find_symtab find_symtab32 +# define get_shnum get_shnum32 +# define set_shnum set_shnum32 +# define get_shstrndx get_shstrndx32 +# define get_symindex get_symindex32 +# define get_sym_str_and_relp get_sym_str_and_relp_32 +# define do_func do32 +# define get_mcountsym get_mcountsym_32 +# define is_fake_mcount is_fake_mcount32 +# define fn_is_fake_mcount fn_is_fake_mcount32 +# define MIPS_is_fake_mcount MIPS32_is_fake_mcount +# define mcount_adjust mcount_adjust_32 +# define Elf_Addr Elf32_Addr +# define Elf_Ehdr Elf32_Ehdr +# define Elf_Shdr Elf32_Shdr +# define Elf_Rel Elf32_Rel +# define Elf_Rela Elf32_Rela +# define Elf_Sym Elf32_Sym +# define ELF_R_SYM ELF32_R_SYM +# define Elf_r_sym Elf32_r_sym +# define ELF_R_INFO ELF32_R_INFO +# define Elf_r_info Elf32_r_info +# define ELF_ST_BIND ELF32_ST_BIND +# define ELF_ST_TYPE ELF32_ST_TYPE +# define fn_ELF_R_SYM fn_ELF32_R_SYM +# define fn_ELF_R_INFO fn_ELF32_R_INFO +# define uint_t uint32_t +# define _w w +# define _align 3u +# define _size 4 +#endif + +/* Functions and pointers that do_file() may override for specific e_machine. */ +static int fn_is_fake_mcount(Elf_Rel const *rp) +{ + return 0; +} +static int (*is_fake_mcount)(Elf_Rel const *rp) = fn_is_fake_mcount; + +static uint_t fn_ELF_R_SYM(Elf_Rel const *rp) +{ + return ELF_R_SYM(_w(rp->r_info)); +} +static uint_t (*Elf_r_sym)(Elf_Rel const *rp) = fn_ELF_R_SYM; + +static void fn_ELF_R_INFO(Elf_Rel *const rp, unsigned sym, unsigned type) +{ + rp->r_info = _w(ELF_R_INFO(sym, type)); +} +static void (*Elf_r_info)(Elf_Rel *const rp, unsigned sym, unsigned type) = fn_ELF_R_INFO; + +static int mcount_adjust = 0; + +/* + * MIPS mcount long call has 2 _mcount symbols, only the position of the 1st + * _mcount symbol is needed for dynamic function tracer, with it, to disable + * tracing(ftrace_make_nop), the instruction in the position is replaced with + * the "b label" instruction, to enable tracing(ftrace_make_call), replace the + * instruction back. So, here, we set the 2nd one as fake and filter it. + * + * c: 3c030000 lui v1,0x0 <--> b label + * c: R_MIPS_HI16 _mcount + * c: R_MIPS_NONE *ABS* + * c: R_MIPS_NONE *ABS* + * 10: 64630000 daddiu v1,v1,0 + * 10: R_MIPS_LO16 _mcount + * 10: R_MIPS_NONE *ABS* + * 10: R_MIPS_NONE *ABS* + * 14: 03e0082d move at,ra + * 18: 0060f809 jalr v1 + * label: + */ +#define MIPS_FAKEMCOUNT_OFFSET 4 + +static int MIPS_is_fake_mcount(Elf_Rel const *rp) +{ + static Elf_Addr old_r_offset = ~(Elf_Addr)0; + Elf_Addr current_r_offset = _w(rp->r_offset); + int is_fake; + + is_fake = (old_r_offset != ~(Elf_Addr)0) && + (current_r_offset - old_r_offset == MIPS_FAKEMCOUNT_OFFSET); + old_r_offset = current_r_offset; + + return is_fake; +} + +static unsigned int get_symindex(Elf_Sym const *sym, Elf32_Word const *symtab, + Elf32_Word const *symtab_shndx) +{ + unsigned long offset; + unsigned short shndx = w2(sym->st_shndx); + int index; + + if (shndx > SHN_UNDEF && shndx < SHN_LORESERVE) + return shndx; + + if (shndx == SHN_XINDEX) { + offset = (unsigned long)sym - (unsigned long)symtab; + index = offset / sizeof(*sym); + + return w(symtab_shndx[index]); + } + + return 0; +} + +static unsigned int get_shnum(Elf_Ehdr const *ehdr, Elf_Shdr const *shdr0) +{ + if (shdr0 && !ehdr->e_shnum) + return w(shdr0->sh_size); + + return w2(ehdr->e_shnum); +} + +static void set_shnum(Elf_Ehdr *ehdr, Elf_Shdr *shdr0, unsigned int new_shnum) +{ + if (new_shnum >= SHN_LORESERVE) { + ehdr->e_shnum = 0; + shdr0->sh_size = w(new_shnum); + } else + ehdr->e_shnum = w2(new_shnum); +} + +static int get_shstrndx(Elf_Ehdr const *ehdr, Elf_Shdr const *shdr0) +{ + if (ehdr->e_shstrndx != SHN_XINDEX) + return w2(ehdr->e_shstrndx); + + return w(shdr0->sh_link); +} + +static void find_symtab(Elf_Ehdr *const ehdr, Elf_Shdr const *shdr0, + unsigned const nhdr, Elf32_Word **symtab, + Elf32_Word **symtab_shndx) +{ + Elf_Shdr const *relhdr; + unsigned k; + + *symtab = NULL; + *symtab_shndx = NULL; + + for (relhdr = shdr0, k = nhdr; k; --k, ++relhdr) { + if (relhdr->sh_type == SHT_SYMTAB) + *symtab = (void *)ehdr + relhdr->sh_offset; + else if (relhdr->sh_type == SHT_SYMTAB_SHNDX) + *symtab_shndx = (void *)ehdr + relhdr->sh_offset; + + if (*symtab && *symtab_shndx) + break; + } +} + +/* Append the new shstrtab, Elf_Shdr[], __mcount_loc and its relocations. */ +static int append_func(Elf_Ehdr *const ehdr, + Elf_Shdr *const shstr, + uint_t const *const mloc0, + uint_t const *const mlocp, + Elf_Rel const *const mrel0, + Elf_Rel const *const mrelp, + unsigned int const rel_entsize, + unsigned int const symsec_sh_link) +{ + /* Begin constructing output file */ + Elf_Shdr mcsec; + char const *mc_name = (sizeof(Elf_Rela) == rel_entsize) + ? ".rela__mcount_loc" + : ".rel__mcount_loc"; + uint_t const old_shoff = _w(ehdr->e_shoff); + uint_t const old_shstr_sh_size = _w(shstr->sh_size); + uint_t const old_shstr_sh_offset = _w(shstr->sh_offset); + Elf_Shdr *const shdr0 = (Elf_Shdr *)(old_shoff + (void *)ehdr); + unsigned int const old_shnum = get_shnum(ehdr, shdr0); + unsigned int const new_shnum = 2 + old_shnum; /* {.rel,}__mcount_loc */ + uint_t t = 1 + strlen(mc_name) + _w(shstr->sh_size); + uint_t new_e_shoff; + + shstr->sh_size = _w(t); + shstr->sh_offset = _w(sb.st_size); + t += sb.st_size; + t += (_align & -t); /* word-byte align */ + new_e_shoff = t; + + set_shnum(ehdr, shdr0, new_shnum); + + /* body for new shstrtab */ + if (ulseek(sb.st_size, SEEK_SET) < 0) + return -1; + if (uwrite(old_shstr_sh_offset + (void *)ehdr, old_shstr_sh_size) < 0) + return -1; + if (uwrite(mc_name, 1 + strlen(mc_name)) < 0) + return -1; + + /* old(modified) Elf_Shdr table, word-byte aligned */ + if (ulseek(t, SEEK_SET) < 0) + return -1; + t += sizeof(Elf_Shdr) * old_shnum; + if (uwrite(old_shoff + (void *)ehdr, + sizeof(Elf_Shdr) * old_shnum) < 0) + return -1; + + /* new sections __mcount_loc and .rel__mcount_loc */ + t += 2*sizeof(mcsec); + mcsec.sh_name = w((sizeof(Elf_Rela) == rel_entsize) + strlen(".rel") + + old_shstr_sh_size); + mcsec.sh_type = w(SHT_PROGBITS); + mcsec.sh_flags = _w(SHF_ALLOC); + mcsec.sh_addr = 0; + mcsec.sh_offset = _w(t); + mcsec.sh_size = _w((void *)mlocp - (void *)mloc0); + mcsec.sh_link = 0; + mcsec.sh_info = 0; + mcsec.sh_addralign = _w(_size); + mcsec.sh_entsize = _w(_size); + if (uwrite(&mcsec, sizeof(mcsec)) < 0) + return -1; + + mcsec.sh_name = w(old_shstr_sh_size); + mcsec.sh_type = (sizeof(Elf_Rela) == rel_entsize) + ? w(SHT_RELA) + : w(SHT_REL); + mcsec.sh_flags = 0; + mcsec.sh_addr = 0; + mcsec.sh_offset = _w((void *)mlocp - (void *)mloc0 + t); + mcsec.sh_size = _w((void *)mrelp - (void *)mrel0); + mcsec.sh_link = w(symsec_sh_link); + mcsec.sh_info = w(old_shnum); + mcsec.sh_addralign = _w(_size); + mcsec.sh_entsize = _w(rel_entsize); + + if (uwrite(&mcsec, sizeof(mcsec)) < 0) + return -1; + + if (uwrite(mloc0, (void *)mlocp - (void *)mloc0) < 0) + return -1; + if (uwrite(mrel0, (void *)mrelp - (void *)mrel0) < 0) + return -1; + + ehdr->e_shoff = _w(new_e_shoff); + if (ulseek(0, SEEK_SET) < 0) + return -1; + if (uwrite(ehdr, sizeof(*ehdr)) < 0) + return -1; + return 0; +} + +static unsigned get_mcountsym(Elf_Sym const *const sym0, + Elf_Rel const *relp, + char const *const str0) +{ + unsigned mcountsym = 0; + + Elf_Sym const *const symp = + &sym0[Elf_r_sym(relp)]; + char const *symname = &str0[w(symp->st_name)]; + char const *mcount = gpfx == '_' ? "_mcount" : "mcount"; + char const *fentry = "__fentry__"; + + if (symname[0] == '.') + ++symname; /* ppc64 hack */ + if (strcmp(mcount, symname) == 0 || + (altmcount && strcmp(altmcount, symname) == 0) || + (strcmp(fentry, symname) == 0)) + mcountsym = Elf_r_sym(relp); + + return mcountsym; +} + +static void get_sym_str_and_relp(Elf_Shdr const *const relhdr, + Elf_Ehdr const *const ehdr, + Elf_Sym const **sym0, + char const **str0, + Elf_Rel const **relp) +{ + Elf_Shdr *const shdr0 = (Elf_Shdr *)(_w(ehdr->e_shoff) + + (void *)ehdr); + unsigned const symsec_sh_link = w(relhdr->sh_link); + Elf_Shdr const *const symsec = &shdr0[symsec_sh_link]; + Elf_Shdr const *const strsec = &shdr0[w(symsec->sh_link)]; + Elf_Rel const *const rel0 = (Elf_Rel const *)(_w(relhdr->sh_offset) + + (void *)ehdr); + + *sym0 = (Elf_Sym const *)(_w(symsec->sh_offset) + + (void *)ehdr); + + *str0 = (char const *)(_w(strsec->sh_offset) + + (void *)ehdr); + + *relp = rel0; +} + +/* + * Look at the relocations in order to find the calls to mcount. + * Accumulate the section offsets that are found, and their relocation info, + * onto the end of the existing arrays. + */ +static uint_t *sift_rel_mcount(uint_t *mlocp, + unsigned const offbase, + Elf_Rel **const mrelpp, + Elf_Shdr const *const relhdr, + Elf_Ehdr const *const ehdr, + unsigned const recsym, + uint_t const recval, + unsigned const reltype) +{ + uint_t *const mloc0 = mlocp; + Elf_Rel *mrelp = *mrelpp; + Elf_Sym const *sym0; + char const *str0; + Elf_Rel const *relp; + unsigned rel_entsize = _w(relhdr->sh_entsize); + unsigned const nrel = _w(relhdr->sh_size) / rel_entsize; + unsigned mcountsym = 0; + unsigned t; + + get_sym_str_and_relp(relhdr, ehdr, &sym0, &str0, &relp); + + for (t = nrel; t; --t) { + if (!mcountsym) + mcountsym = get_mcountsym(sym0, relp, str0); + + if (mcountsym && mcountsym == Elf_r_sym(relp) && + !is_fake_mcount(relp)) { + uint_t const addend = + _w(_w(relp->r_offset) - recval + mcount_adjust); + mrelp->r_offset = _w(offbase + + ((void *)mlocp - (void *)mloc0)); + Elf_r_info(mrelp, recsym, reltype); + if (rel_entsize == sizeof(Elf_Rela)) { + ((Elf_Rela *)mrelp)->r_addend = addend; + *mlocp++ = 0; + } else + *mlocp++ = addend; + + mrelp = (Elf_Rel *)(rel_entsize + (void *)mrelp); + } + relp = (Elf_Rel const *)(rel_entsize + (void *)relp); + } + *mrelpp = mrelp; + return mlocp; +} + +/* + * Read the relocation table again, but this time its called on sections + * that are not going to be traced. The mcount calls here will be converted + * into nops. + */ +static int nop_mcount(Elf_Shdr const *const relhdr, + Elf_Ehdr const *const ehdr, + const char *const txtname) +{ + Elf_Shdr *const shdr0 = (Elf_Shdr *)(_w(ehdr->e_shoff) + + (void *)ehdr); + Elf_Sym const *sym0; + char const *str0; + Elf_Rel const *relp; + Elf_Shdr const *const shdr = &shdr0[w(relhdr->sh_info)]; + unsigned rel_entsize = _w(relhdr->sh_entsize); + unsigned const nrel = _w(relhdr->sh_size) / rel_entsize; + unsigned mcountsym = 0; + unsigned t; + int once = 0; + + get_sym_str_and_relp(relhdr, ehdr, &sym0, &str0, &relp); + + for (t = nrel; t; --t) { + int ret = -1; + + if (!mcountsym) + mcountsym = get_mcountsym(sym0, relp, str0); + + if (mcountsym == Elf_r_sym(relp) && !is_fake_mcount(relp)) { + if (make_nop) + ret = make_nop((void *)ehdr, _w(shdr->sh_offset) + _w(relp->r_offset)); + if (warn_on_notrace_sect && !once) { + printf("Section %s has mcount callers being ignored\n", + txtname); + once = 1; + /* just warn? */ + if (!make_nop) + return 0; + } + } + + /* + * If we successfully removed the mcount, mark the relocation + * as a nop (don't do anything with it). + */ + if (!ret) { + Elf_Rel rel; + rel = *(Elf_Rel *)relp; + Elf_r_info(&rel, Elf_r_sym(relp), rel_type_nop); + if (ulseek((void *)relp - (void *)ehdr, SEEK_SET) < 0) + return -1; + if (uwrite(&rel, sizeof(rel)) < 0) + return -1; + } + relp = (Elf_Rel const *)(rel_entsize + (void *)relp); + } + return 0; +} + +/* + * Find a symbol in the given section, to be used as the base for relocating + * the table of offsets of calls to mcount. A local or global symbol suffices, + * but avoid a Weak symbol because it may be overridden; the change in value + * would invalidate the relocations of the offsets of the calls to mcount. + * Often the found symbol will be the unnamed local symbol generated by + * GNU 'as' for the start of each section. For example: + * Num: Value Size Type Bind Vis Ndx Name + * 2: 00000000 0 SECTION LOCAL DEFAULT 1 + */ +static int find_secsym_ndx(unsigned const txtndx, + char const *const txtname, + uint_t *const recvalp, + unsigned int *sym_index, + Elf_Shdr const *const symhdr, + Elf32_Word const *symtab, + Elf32_Word const *symtab_shndx, + Elf_Ehdr const *const ehdr) +{ + Elf_Sym const *const sym0 = (Elf_Sym const *)(_w(symhdr->sh_offset) + + (void *)ehdr); + unsigned const nsym = _w(symhdr->sh_size) / _w(symhdr->sh_entsize); + Elf_Sym const *symp; + unsigned t; + + for (symp = sym0, t = nsym; t; --t, ++symp) { + unsigned int const st_bind = ELF_ST_BIND(symp->st_info); + + if (txtndx == get_symindex(symp, symtab, symtab_shndx) + /* avoid STB_WEAK */ + && (STB_LOCAL == st_bind || STB_GLOBAL == st_bind)) { + /* function symbols on ARM have quirks, avoid them */ + if (w2(ehdr->e_machine) == EM_ARM + && ELF_ST_TYPE(symp->st_info) == STT_FUNC) + continue; + + *recvalp = _w(symp->st_value); + *sym_index = symp - sym0; + return 0; + } + } + fprintf(stderr, "Cannot find symbol for section %u: %s.\n", + txtndx, txtname); + return -1; +} + +/* Evade ISO C restriction: no declaration after statement in has_rel_mcount. */ +static char const * __has_rel_mcount(Elf_Shdr const *const relhdr, /* reltype */ + Elf_Shdr const *const shdr0, + char const *const shstrtab, + char const *const fname) +{ + /* .sh_info depends on .sh_type == SHT_REL[,A] */ + Elf_Shdr const *const txthdr = &shdr0[w(relhdr->sh_info)]; + char const *const txtname = &shstrtab[w(txthdr->sh_name)]; + + if (strcmp("__mcount_loc", txtname) == 0) { + fprintf(stderr, "warning: __mcount_loc already exists: %s\n", + fname); + return already_has_rel_mcount; + } + if (w(txthdr->sh_type) != SHT_PROGBITS || + !(_w(txthdr->sh_flags) & SHF_EXECINSTR)) + return NULL; + return txtname; +} + +static char const *has_rel_mcount(Elf_Shdr const *const relhdr, + Elf_Shdr const *const shdr0, + char const *const shstrtab, + char const *const fname) +{ + if (w(relhdr->sh_type) != SHT_REL && w(relhdr->sh_type) != SHT_RELA) + return NULL; + return __has_rel_mcount(relhdr, shdr0, shstrtab, fname); +} + + +static unsigned tot_relsize(Elf_Shdr const *const shdr0, + unsigned nhdr, + const char *const shstrtab, + const char *const fname) +{ + unsigned totrelsz = 0; + Elf_Shdr const *shdrp = shdr0; + char const *txtname; + + for (; nhdr; --nhdr, ++shdrp) { + txtname = has_rel_mcount(shdrp, shdr0, shstrtab, fname); + if (txtname == already_has_rel_mcount) { + totrelsz = 0; + break; + } + if (txtname && is_mcounted_section_name(txtname)) + totrelsz += _w(shdrp->sh_size); + } + return totrelsz; +} + +/* Overall supervision for Elf32 ET_REL file. */ +static int do_func(Elf_Ehdr *const ehdr, char const *const fname, + unsigned const reltype) +{ + Elf_Shdr *const shdr0 = (Elf_Shdr *)(_w(ehdr->e_shoff) + + (void *)ehdr); + unsigned const nhdr = get_shnum(ehdr, shdr0); + Elf_Shdr *const shstr = &shdr0[get_shstrndx(ehdr, shdr0)]; + char const *const shstrtab = (char const *)(_w(shstr->sh_offset) + + (void *)ehdr); + + Elf_Shdr const *relhdr; + unsigned k; + + Elf32_Word *symtab; + Elf32_Word *symtab_shndx; + + /* Upper bound on space: assume all relevant relocs are for mcount. */ + unsigned totrelsz; + + Elf_Rel * mrel0; + Elf_Rel * mrelp; + + uint_t * mloc0; + uint_t * mlocp; + + unsigned rel_entsize = 0; + unsigned symsec_sh_link = 0; + + int result = 0; + + totrelsz = tot_relsize(shdr0, nhdr, shstrtab, fname); + if (totrelsz == 0) + return 0; + mrel0 = umalloc(totrelsz); + mrelp = mrel0; + if (!mrel0) + return -1; + + /* 2*sizeof(address) <= sizeof(Elf_Rel) */ + mloc0 = umalloc(totrelsz>>1); + mlocp = mloc0; + if (!mloc0) { + free(mrel0); + return -1; + } + + find_symtab(ehdr, shdr0, nhdr, &symtab, &symtab_shndx); + + for (relhdr = shdr0, k = nhdr; k; --k, ++relhdr) { + char const *const txtname = has_rel_mcount(relhdr, shdr0, + shstrtab, fname); + if (txtname == already_has_rel_mcount) { + result = 0; + file_updated = 0; + goto out; /* Nothing to be done; don't append! */ + } + if (txtname && is_mcounted_section_name(txtname)) { + unsigned int recsym; + uint_t recval = 0; + + symsec_sh_link = w(relhdr->sh_link); + result = find_secsym_ndx(w(relhdr->sh_info), txtname, + &recval, &recsym, + &shdr0[symsec_sh_link], + symtab, symtab_shndx, + ehdr); + if (result) + goto out; + + rel_entsize = _w(relhdr->sh_entsize); + mlocp = sift_rel_mcount(mlocp, + (void *)mlocp - (void *)mloc0, &mrelp, + relhdr, ehdr, recsym, recval, reltype); + } else if (txtname && (warn_on_notrace_sect || make_nop)) { + /* + * This section is ignored by ftrace, but still + * has mcount calls. Convert them to nops now. + */ + if (nop_mcount(relhdr, ehdr, txtname) < 0) { + result = -1; + goto out; + } + } + } + if (!result && mloc0 != mlocp) + result = append_func(ehdr, shstr, mloc0, mlocp, mrel0, mrelp, + rel_entsize, symsec_sh_link); +out: + free(mrel0); + free(mloc0); + return result; +} diff --git a/src/net/scripts/recordmcount.pl b/src/net/scripts/recordmcount.pl new file mode 100755 index 0000000..dc1d369 --- /dev/null +++ b/src/net/scripts/recordmcount.pl @@ -0,0 +1,647 @@ +#!/usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0-only +# (c) 2008, Steven Rostedt <srostedt@redhat.com> +# +# recordmcount.pl - makes a section called __mcount_loc that holds +# all the offsets to the calls to mcount. +# +# +# What we want to end up with this is that each object file will have a +# section called __mcount_loc that will hold the list of pointers to mcount +# callers. After final linking, the vmlinux will have within .init.data the +# list of all callers to mcount between __start_mcount_loc and __stop_mcount_loc. +# Later on boot up, the kernel will read this list, save the locations and turn +# them into nops. When tracing or profiling is later enabled, these locations +# will then be converted back to pointers to some function. +# +# This is no easy feat. This script is called just after the original +# object is compiled and before it is linked. +# +# When parse this object file using 'objdump', the references to the call +# sites are offsets from the section that the call site is in. Hence, all +# functions in a section that has a call site to mcount, will have the +# offset from the beginning of the section and not the beginning of the +# function. +# +# But where this section will reside finally in vmlinx is undetermined at +# this point. So we can't use this kind of offsets to record the final +# address of this call site. +# +# The trick is to change the call offset referring the start of a section to +# referring a function symbol in this section. During the link step, 'ld' will +# compute the final address according to the information we record. +# +# e.g. +# +# .section ".sched.text", "ax" +# [...] +# func1: +# [...] +# call mcount (offset: 0x10) +# [...] +# ret +# .globl fun2 +# func2: (offset: 0x20) +# [...] +# [...] +# ret +# func3: +# [...] +# call mcount (offset: 0x30) +# [...] +# +# Both relocation offsets for the mcounts in the above example will be +# offset from .sched.text. If we choose global symbol func2 as a reference and +# make another file called tmp.s with the new offsets: +# +# .section __mcount_loc +# .quad func2 - 0x10 +# .quad func2 + 0x10 +# +# We can then compile this tmp.s into tmp.o, and link it back to the original +# object. +# +# In our algorithm, we will choose the first global function we meet in this +# section as the reference. But this gets hard if there is no global functions +# in this section. In such a case we have to select a local one. E.g. func1: +# +# .section ".sched.text", "ax" +# func1: +# [...] +# call mcount (offset: 0x10) +# [...] +# ret +# func2: +# [...] +# call mcount (offset: 0x20) +# [...] +# .section "other.section" +# +# If we make the tmp.s the same as above, when we link together with +# the original object, we will end up with two symbols for func1: +# one local, one global. After final compile, we will end up with +# an undefined reference to func1 or a wrong reference to another global +# func1 in other files. +# +# Since local objects can reference local variables, we need to find +# a way to make tmp.o reference the local objects of the original object +# file after it is linked together. To do this, we convert func1 +# into a global symbol before linking tmp.o. Then after we link tmp.o +# we will only have a single symbol for func1 that is global. +# We can convert func1 back into a local symbol and we are done. +# +# Here are the steps we take: +# +# 1) Record all the local and weak symbols by using 'nm' +# 2) Use objdump to find all the call site offsets and sections for +# mcount. +# 3) Compile the list into its own object. +# 4) Do we have to deal with local functions? If not, go to step 8. +# 5) Make an object that converts these local functions to global symbols +# with objcopy. +# 6) Link together this new object with the list object. +# 7) Convert the local functions back to local symbols and rename +# the result as the original object. +# 8) Link the object with the list object. +# 9) Move the result back to the original object. +# + +use warnings; +use strict; + +my $P = $0; +$P =~ s@.*/@@g; + +my $V = '0.1'; + +if ($#ARGV != 11) { + print "usage: $P arch endian bits objdump objcopy cc ld nm rm mv is_module inputfile\n"; + print "version: $V\n"; + exit(1); +} + +my ($arch, $endian, $bits, $objdump, $objcopy, $cc, + $ld, $nm, $rm, $mv, $is_module, $inputfile) = @ARGV; + +# This file refers to mcount and shouldn't be ftraced, so lets' ignore it +if ($inputfile =~ m,kernel/trace/ftrace\.o$,) { + exit(0); +} + +# Acceptable sections to record. +my %text_sections = ( + ".text" => 1, + ".init.text" => 1, + ".ref.text" => 1, + ".sched.text" => 1, + ".spinlock.text" => 1, + ".irqentry.text" => 1, + ".softirqentry.text" => 1, + ".kprobes.text" => 1, + ".cpuidle.text" => 1, + ".text.unlikely" => 1, +); + +# Acceptable section-prefixes to record. +my %text_section_prefixes = ( + ".text." => 1, +); + +# Note: we are nice to C-programmers here, thus we skip the '||='-idiom. +$objdump = 'objdump' if (!$objdump); +$objcopy = 'objcopy' if (!$objcopy); +$cc = 'gcc' if (!$cc); +$ld = 'ld' if (!$ld); +$nm = 'nm' if (!$nm); +$rm = 'rm' if (!$rm); +$mv = 'mv' if (!$mv); + +#print STDERR "running: $P '$arch' '$objdump' '$objcopy' '$cc' '$ld' " . +# "'$nm' '$rm' '$mv' '$inputfile'\n"; + +my %locals; # List of local (static) functions +my %weak; # List of weak functions +my %convert; # List of local functions used that needs conversion + +my $type; +my $local_regex; # Match a local function (return function) +my $weak_regex; # Match a weak function (return function) +my $section_regex; # Find the start of a section +my $function_regex; # Find the name of a function + # (return offset and func name) +my $mcount_regex; # Find the call site to mcount (return offset) +my $mcount_adjust; # Address adjustment to mcount offset +my $alignment; # The .align value to use for $mcount_section +my $section_type; # Section header plus possible alignment command +my $can_use_local = 0; # If we can use local function references + +# Shut up recordmcount if user has older objcopy +my $quiet_recordmcount = ".tmp_quiet_recordmcount"; +my $print_warning = 1; +$print_warning = 0 if ( -f $quiet_recordmcount); + +## +# check_objcopy - whether objcopy supports --globalize-symbols +# +# --globalize-symbols came out in 2.17, we must test the version +# of objcopy, and if it is less than 2.17, then we can not +# record local functions. +sub check_objcopy +{ + open (IN, "$objcopy --version |") or die "error running $objcopy"; + while (<IN>) { + if (/objcopy.*\s(\d+)\.(\d+)/) { + $can_use_local = 1 if ($1 > 2 || ($1 == 2 && $2 >= 17)); + last; + } + } + close (IN); + + if (!$can_use_local && $print_warning) { + print STDERR "WARNING: could not find objcopy version or version " . + "is less than 2.17.\n" . + "\tLocal function references are disabled.\n"; + open (QUIET, ">$quiet_recordmcount"); + printf QUIET "Disables the warning from recordmcount.pl\n"; + close QUIET; + } +} + +if ($arch =~ /(x86(_64)?)|(i386)/) { + if ($bits == 64) { + $arch = "x86_64"; + } else { + $arch = "i386"; + } +} + +# +# We base the defaults off of i386, the other archs may +# feel free to change them in the below if statements. +# +$local_regex = "^[0-9a-fA-F]+\\s+t\\s+(\\S+)"; +$weak_regex = "^[0-9a-fA-F]+\\s+([wW])\\s+(\\S+)"; +$section_regex = "Disassembly of section\\s+(\\S+):"; +$function_regex = "^([0-9a-fA-F]+)\\s+<([^^]*?)>:"; +$mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s(mcount|__fentry__)\$"; +$section_type = '@progbits'; +$mcount_adjust = 0; +$type = ".long"; + +if ($arch eq "x86_64") { + $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s(mcount|__fentry__)([+-]0x[0-9a-zA-Z]+)?\$"; + $type = ".quad"; + $alignment = 8; + $mcount_adjust = -1; + + # force flags for this arch + $ld .= " -m elf_x86_64"; + $objdump .= " -M x86-64"; + $objcopy .= " -O elf64-x86-64"; + $cc .= " -m64"; + +} elsif ($arch eq "i386") { + $alignment = 4; + $mcount_adjust = -1; + + # force flags for this arch + $ld .= " -m elf_i386"; + $objdump .= " -M i386"; + $objcopy .= " -O elf32-i386"; + $cc .= " -m32"; + +} elsif ($arch eq "s390" && $bits == 64) { + if ($cc =~ /-DCC_USING_HOTPATCH/) { + $mcount_regex = "^\\s*([0-9a-fA-F]+):\\s*c0 04 00 00 00 00\\s*(brcl\\s*0,|jgnop\\s*)[0-9a-f]+ <([^\+]*)>\$"; + $mcount_adjust = 0; + } else { + $mcount_regex = "^\\s*([0-9a-fA-F]+):\\s*R_390_(PC|PLT)32DBL\\s+_mcount\\+0x2\$"; + $mcount_adjust = -14; + } + $alignment = 8; + $type = ".quad"; + $ld .= " -m elf64_s390"; + $cc .= " -m64"; + +} elsif ($arch eq "sh") { + $alignment = 2; + + # force flags for this arch + $ld .= " -m shlelf_linux"; + if ($endian eq "big") { + $objcopy .= " -O elf32-shbig-linux"; + } else { + $objcopy .= " -O elf32-sh-linux"; + } + +} elsif ($arch eq "powerpc") { + my $ldemulation; + + $local_regex = "^[0-9a-fA-F]+\\s+t\\s+(\\.?\\S+)"; + # See comment in the sparc64 section for why we use '\w'. + $function_regex = "^([0-9a-fA-F]+)\\s+<(\\.?\\w*?)>:"; + $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s\\.?_mcount\$"; + + if ($endian eq "big") { + $cc .= " -mbig-endian "; + $ld .= " -EB "; + $ldemulation = "ppc" + } else { + $cc .= " -mlittle-endian "; + $ld .= " -EL "; + $ldemulation = "lppc" + } + if ($bits == 64) { + $type = ".quad"; + $cc .= " -m64 "; + $ld .= " -m elf64".$ldemulation." "; + } else { + $cc .= " -m32 "; + $ld .= " -m elf32".$ldemulation." "; + } + +} elsif ($arch eq "arm") { + $alignment = 2; + $section_type = '%progbits'; + $mcount_regex = "^\\s*([0-9a-fA-F]+):\\s*R_ARM_(CALL|PC24|THM_CALL)" . + "\\s+(__gnu_mcount_nc|mcount)\$"; + +} elsif ($arch eq "arm64") { + $alignment = 3; + $section_type = '%progbits'; + $mcount_regex = "^\\s*([0-9a-fA-F]+):\\s*R_AARCH64_CALL26\\s+_mcount\$"; + $type = ".quad"; +} elsif ($arch eq "ia64") { + $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s_mcount\$"; + $type = "data8"; + + if ($is_module eq "0") { + $cc .= " -mconstant-gp"; + } +} elsif ($arch eq "sparc64") { + # In the objdump output there are giblets like: + # 0000000000000000 <igmp_net_exit-0x18>: + # As there's some data blobs that get emitted into the + # text section before the first instructions and the first + # real symbols. We don't want to match that, so to combat + # this we use '\w' so we'll match just plain symbol names, + # and not those that also include hex offsets inside of the + # '<>' brackets. Actually the generic function_regex setting + # could safely use this too. + $function_regex = "^([0-9a-fA-F]+)\\s+<(\\w*?)>:"; + + # Sparc64 calls '_mcount' instead of plain 'mcount'. + $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s_mcount\$"; + + $alignment = 8; + $type = ".xword"; + $ld .= " -m elf64_sparc"; + $cc .= " -m64"; + $objcopy .= " -O elf64-sparc"; +} elsif ($arch eq "mips") { + # To enable module support, we need to enable the -mlong-calls option + # of gcc for module, after using this option, we can not get the real + # offset of the calling to _mcount, but the offset of the lui + # instruction or the addiu one. herein, we record the address of the + # first one, and then we can replace this instruction by a branch + # instruction to jump over the profiling function to filter the + # indicated functions, or switch back to the lui instruction to trace + # them, which means dynamic tracing. + # + # c: 3c030000 lui v1,0x0 + # c: R_MIPS_HI16 _mcount + # c: R_MIPS_NONE *ABS* + # c: R_MIPS_NONE *ABS* + # 10: 64630000 daddiu v1,v1,0 + # 10: R_MIPS_LO16 _mcount + # 10: R_MIPS_NONE *ABS* + # 10: R_MIPS_NONE *ABS* + # 14: 03e0082d move at,ra + # 18: 0060f809 jalr v1 + # + # for the kernel: + # + # 10: 03e0082d move at,ra + # 14: 0c000000 jal 0 <loongson_halt> + # 14: R_MIPS_26 _mcount + # 14: R_MIPS_NONE *ABS* + # 14: R_MIPS_NONE *ABS* + # 18: 00020021 nop + if ($is_module eq "0") { + $mcount_regex = "^\\s*([0-9a-fA-F]+): R_MIPS_26\\s+_mcount\$"; + } else { + $mcount_regex = "^\\s*([0-9a-fA-F]+): R_MIPS_HI16\\s+_mcount\$"; + } + $objdump .= " -Melf-trad".$endian."mips "; + + if ($endian eq "big") { + $endian = " -EB "; + $ld .= " -melf".$bits."btsmip"; + } else { + $endian = " -EL "; + $ld .= " -melf".$bits."ltsmip"; + } + + $cc .= " -mno-abicalls -fno-pic -mabi=" . $bits . $endian; + $ld .= $endian; + + if ($bits == 64) { + $function_regex = + "^([0-9a-fA-F]+)\\s+<(.|[^\$]L.*?|\$[^L].*?|[^\$][^L].*?)>:"; + $type = ".dword"; + } +} elsif ($arch eq "microblaze") { + # Microblaze calls '_mcount' instead of plain 'mcount'. + $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s_mcount\$"; +} elsif ($arch eq "riscv") { + $function_regex = "^([0-9a-fA-F]+)\\s+<([^.0-9][0-9a-zA-Z_\\.]+)>:"; + $mcount_regex = "^\\s*([0-9a-fA-F]+):\\sR_RISCV_CALL(_PLT)?\\s_?mcount\$"; + $type = ".quad"; + $alignment = 2; +} elsif ($arch eq "nds32") { + $mcount_regex = "^\\s*([0-9a-fA-F]+):\\s*R_NDS32_HI20_RELA\\s+_mcount\$"; + $alignment = 2; +} elsif ($arch eq "csky") { + $mcount_regex = "^\\s*([0-9a-fA-F]+):\\s*R_CKCORE_PCREL_JSR_IMM26BY2\\s+_mcount\$"; + $alignment = 2; +} else { + die "Arch $arch is not supported with CONFIG_FTRACE_MCOUNT_RECORD"; +} + +my $text_found = 0; +my $read_function = 0; +my $opened = 0; +my $mcount_section = "__mcount_loc"; + +my $dirname; +my $filename; +my $prefix; +my $ext; + +if ($inputfile =~ m,^(.*)/([^/]*)$,) { + $dirname = $1; + $filename = $2; +} else { + $dirname = "."; + $filename = $inputfile; +} + +if ($filename =~ m,^(.*)(\.\S),) { + $prefix = $1; + $ext = $2; +} else { + $prefix = $filename; + $ext = ""; +} + +my $mcount_s = $dirname . "/.tmp_mc_" . $prefix . ".s"; +my $mcount_o = $dirname . "/.tmp_mc_" . $prefix . ".o"; + +check_objcopy(); + +# +# Step 1: find all the local (static functions) and weak symbols. +# 't' is local, 'w/W' is weak +# +open (IN, "$nm $inputfile|") || die "error running $nm"; +while (<IN>) { + if (/$local_regex/) { + $locals{$1} = 1; + } elsif (/$weak_regex/) { + $weak{$2} = $1; + } +} +close(IN); + +my @offsets; # Array of offsets of mcount callers +my $ref_func; # reference function to use for offsets +my $offset = 0; # offset of ref_func to section beginning + +## +# update_funcs - print out the current mcount callers +# +# Go through the list of offsets to callers and write them to +# the output file in a format that can be read by an assembler. +# +sub update_funcs +{ + return unless ($ref_func and @offsets); + + # Sanity check on weak function. A weak function may be overwritten by + # another function of the same name, making all these offsets incorrect. + if (defined $weak{$ref_func}) { + die "$inputfile: ERROR: referencing weak function" . + " $ref_func for mcount\n"; + } + + # is this function static? If so, note this fact. + if (defined $locals{$ref_func}) { + + # only use locals if objcopy supports globalize-symbols + if (!$can_use_local) { + return; + } + $convert{$ref_func} = 1; + } + + # Loop through all the mcount caller offsets and print a reference + # to the caller based from the ref_func. + if (!$opened) { + open(FILE, ">$mcount_s") || die "can't create $mcount_s\n"; + $opened = 1; + print FILE "\t.section $mcount_section,\"a\",$section_type\n"; + print FILE "\t.align $alignment\n" if (defined($alignment)); + } + foreach my $cur_offset (@offsets) { + printf FILE "\t%s %s + %d\n", $type, $ref_func, $cur_offset - $offset; + } +} + +# +# Step 2: find the sections and mcount call sites +# +open(IN, "LANG=C $objdump -hdr $inputfile|") || die "error running $objdump"; + +my $text; + + +# read headers first +my $read_headers = 1; + +while (<IN>) { + + if ($read_headers && /$mcount_section/) { + # + # Somehow the make process can execute this script on an + # object twice. If it does, we would duplicate the mcount + # section and it will cause the function tracer self test + # to fail. Check if the mcount section exists, and if it does, + # warn and exit. + # + print STDERR "ERROR: $mcount_section already in $inputfile\n" . + "\tThis may be an indication that your build is corrupted.\n" . + "\tDelete $inputfile and try again. If the same object file\n" . + "\tstill causes an issue, then disable CONFIG_DYNAMIC_FTRACE.\n"; + exit(-1); + } + + # is it a section? + if (/$section_regex/) { + $read_headers = 0; + + # Only record text sections that we know are safe + $read_function = defined($text_sections{$1}); + if (!$read_function) { + foreach my $prefix (keys %text_section_prefixes) { + if (substr($1, 0, length $prefix) eq $prefix) { + $read_function = 1; + last; + } + } + } + # print out any recorded offsets + update_funcs(); + + # reset all markers and arrays + $text_found = 0; + undef($ref_func); + undef(@offsets); + + # section found, now is this a start of a function? + } elsif ($read_function && /$function_regex/) { + $text_found = 1; + $text = $2; + + # if this is either a local function or a weak function + # keep looking for functions that are global that + # we can use safely. + if (!defined($locals{$text}) && !defined($weak{$text})) { + $ref_func = $text; + $read_function = 0; + $offset = hex $1; + } else { + # if we already have a function, and this is weak, skip it + if (!defined($ref_func) && !defined($weak{$text}) && + # PPC64 can have symbols that start with .L and + # gcc considers these special. Don't use them! + $text !~ /^\.L/) { + $ref_func = $text; + $offset = hex $1; + } + } + } + # is this a call site to mcount? If so, record it to print later + if ($text_found && /$mcount_regex/) { + push(@offsets, (hex $1) + $mcount_adjust); + } +} + +# dump out anymore offsets that may have been found +update_funcs(); + +# If we did not find any mcount callers, we are done (do nothing). +if (!$opened) { + exit(0); +} + +close(FILE); + +# +# Step 3: Compile the file that holds the list of call sites to mcount. +# +`$cc -o $mcount_o -c $mcount_s`; + +my @converts = keys %convert; + +# +# Step 4: Do we have sections that started with local functions? +# +if ($#converts >= 0) { + my $globallist = ""; + my $locallist = ""; + + foreach my $con (@converts) { + $globallist .= " --globalize-symbol $con"; + $locallist .= " --localize-symbol $con"; + } + + my $globalobj = $dirname . "/.tmp_gl_" . $filename; + my $globalmix = $dirname . "/.tmp_mx_" . $filename; + + # + # Step 5: set up each local function as a global + # + `$objcopy $globallist $inputfile $globalobj`; + + # + # Step 6: Link the global version to our list. + # + `$ld -r $globalobj $mcount_o -o $globalmix`; + + # + # Step 7: Convert the local functions back into local symbols + # + `$objcopy $locallist $globalmix $inputfile`; + + # Remove the temp files + `$rm $globalobj $globalmix`; + +} else { + + my $mix = $dirname . "/.tmp_mx_" . $filename; + + # + # Step 8: Link the object with our list of call sites object. + # + `$ld -r $inputfile $mcount_o -o $mix`; + + # + # Step 9: Move the result back to the original object. + # + `$mv $mix $inputfile`; +} + +# Clean up the temp files +`$rm $mcount_o $mcount_s`; + +exit(0); diff --git a/src/net/scripts/selinux/Makefile b/src/net/scripts/selinux/Makefile new file mode 100644 index 0000000..59494e1 --- /dev/null +++ b/src/net/scripts/selinux/Makefile @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: GPL-2.0-only +subdir-y := mdp genheaders diff --git a/src/net/scripts/selinux/README b/src/net/scripts/selinux/README new file mode 100644 index 0000000..5ba679c --- /dev/null +++ b/src/net/scripts/selinux/README @@ -0,0 +1,2 @@ +Please see Documentation/admin-guide/LSM/SELinux.rst for information on +installing a dummy SELinux policy. diff --git a/src/net/scripts/selinux/genheaders/.gitignore b/src/net/scripts/selinux/genheaders/.gitignore new file mode 100644 index 0000000..5fcadd3 --- /dev/null +++ b/src/net/scripts/selinux/genheaders/.gitignore @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: GPL-2.0-only +genheaders diff --git a/src/net/scripts/selinux/genheaders/Makefile b/src/net/scripts/selinux/genheaders/Makefile new file mode 100644 index 0000000..1faf7f0 --- /dev/null +++ b/src/net/scripts/selinux/genheaders/Makefile @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0 +hostprogs-always-y += genheaders +HOST_EXTRACFLAGS += \ + -I$(srctree)/include/uapi -I$(srctree)/include \ + -I$(srctree)/security/selinux/include diff --git a/src/net/scripts/selinux/genheaders/genheaders.c b/src/net/scripts/selinux/genheaders/genheaders.c new file mode 100644 index 0000000..f355b3e --- /dev/null +++ b/src/net/scripts/selinux/genheaders/genheaders.c @@ -0,0 +1,142 @@ +// SPDX-License-Identifier: GPL-2.0 + +/* NOTE: we really do want to use the kernel headers here */ +#define __EXPORTED_HEADERS__ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <errno.h> +#include <ctype.h> + +struct security_class_mapping { + const char *name; + const char *perms[sizeof(unsigned) * 8 + 1]; +}; + +#include "classmap.h" +#include "initial_sid_to_string.h" + +const char *progname; + +static void usage(void) +{ + printf("usage: %s flask.h av_permissions.h\n", progname); + exit(1); +} + +static char *stoupperx(const char *s) +{ + char *s2 = strdup(s); + char *p; + + if (!s2) { + fprintf(stderr, "%s: out of memory\n", progname); + exit(3); + } + + for (p = s2; *p; p++) + *p = toupper(*p); + return s2; +} + +int main(int argc, char *argv[]) +{ + int i, j; + int isids_len; + FILE *fout; + + progname = argv[0]; + + if (argc < 3) + usage(); + + fout = fopen(argv[1], "w"); + if (!fout) { + fprintf(stderr, "Could not open %s for writing: %s\n", + argv[1], strerror(errno)); + exit(2); + } + + for (i = 0; secclass_map[i].name; i++) { + struct security_class_mapping *map = &secclass_map[i]; + map->name = stoupperx(map->name); + for (j = 0; map->perms[j]; j++) + map->perms[j] = stoupperx(map->perms[j]); + } + + isids_len = sizeof(initial_sid_to_string) / sizeof (char *); + for (i = 1; i < isids_len; i++) { + const char *s = initial_sid_to_string[i]; + + if (s) + initial_sid_to_string[i] = stoupperx(s); + } + + fprintf(fout, "/* This file is automatically generated. Do not edit. */\n"); + fprintf(fout, "#ifndef _SELINUX_FLASK_H_\n#define _SELINUX_FLASK_H_\n\n"); + + for (i = 0; secclass_map[i].name; i++) { + struct security_class_mapping *map = &secclass_map[i]; + fprintf(fout, "#define SECCLASS_%-39s %2d\n", map->name, i+1); + } + + fprintf(fout, "\n"); + + for (i = 1; i < isids_len; i++) { + const char *s = initial_sid_to_string[i]; + if (s) + fprintf(fout, "#define SECINITSID_%-39s %2d\n", s, i); + } + fprintf(fout, "\n#define SECINITSID_NUM %d\n", i-1); + fprintf(fout, "\nstatic inline bool security_is_socket_class(u16 kern_tclass)\n"); + fprintf(fout, "{\n"); + fprintf(fout, "\tbool sock = false;\n\n"); + fprintf(fout, "\tswitch (kern_tclass) {\n"); + for (i = 0; secclass_map[i].name; i++) { + static char s[] = "SOCKET"; + struct security_class_mapping *map = &secclass_map[i]; + int len = strlen(map->name), l = sizeof(s) - 1; + if (len >= l && memcmp(map->name + len - l, s, l) == 0) + fprintf(fout, "\tcase SECCLASS_%s:\n", map->name); + } + fprintf(fout, "\t\tsock = true;\n"); + fprintf(fout, "\t\tbreak;\n"); + fprintf(fout, "\tdefault:\n"); + fprintf(fout, "\t\tbreak;\n"); + fprintf(fout, "\t}\n\n"); + fprintf(fout, "\treturn sock;\n"); + fprintf(fout, "}\n"); + + fprintf(fout, "\n#endif\n"); + fclose(fout); + + fout = fopen(argv[2], "w"); + if (!fout) { + fprintf(stderr, "Could not open %s for writing: %s\n", + argv[2], strerror(errno)); + exit(4); + } + + fprintf(fout, "/* This file is automatically generated. Do not edit. */\n"); + fprintf(fout, "#ifndef _SELINUX_AV_PERMISSIONS_H_\n#define _SELINUX_AV_PERMISSIONS_H_\n\n"); + + for (i = 0; secclass_map[i].name; i++) { + struct security_class_mapping *map = &secclass_map[i]; + int len = strlen(map->name); + for (j = 0; map->perms[j]; j++) { + if (j >= 32) { + fprintf(stderr, "Too many permissions to fit into an access vector at (%s, %s).\n", + map->name, map->perms[j]); + exit(5); + } + fprintf(fout, "#define %s__%-*s 0x%08xU\n", map->name, + 39-len, map->perms[j], 1U<<j); + } + } + + fprintf(fout, "\n#endif\n"); + fclose(fout); + exit(0); +} diff --git a/src/net/scripts/selinux/install_policy.sh b/src/net/scripts/selinux/install_policy.sh new file mode 100755 index 0000000..2dccf14 --- /dev/null +++ b/src/net/scripts/selinux/install_policy.sh @@ -0,0 +1,85 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +set -e +if [ `id -u` -ne 0 ]; then + echo "$0: must be root to install the selinux policy" + exit 1 +fi + +SF=`which setfiles` +if [ $? -eq 1 ]; then + echo "Could not find setfiles" + echo "Do you have policycoreutils installed?" + exit 1 +fi + +CP=`which checkpolicy` +if [ $? -eq 1 ]; then + echo "Could not find checkpolicy" + echo "Do you have checkpolicy installed?" + exit 1 +fi +VERS=`$CP -V | awk '{print $1}'` + +ENABLED=`which selinuxenabled` +if [ $? -eq 1 ]; then + echo "Could not find selinuxenabled" + echo "Do you have libselinux-utils installed?" + exit 1 +fi + +if selinuxenabled; then + echo "SELinux is already enabled" + echo "This prevents safely relabeling all files." + echo "Boot with selinux=0 on the kernel command-line or" + echo "SELINUX=disabled in /etc/selinux/config." + exit 1 +fi + +cd mdp +./mdp -m policy.conf file_contexts +$CP -U allow -M -o policy.$VERS policy.conf + +mkdir -p /etc/selinux/dummy/policy +mkdir -p /etc/selinux/dummy/contexts/files + +echo "__default__:user_u:s0" > /etc/selinux/dummy/seusers +echo "base_r:base_t:s0" > /etc/selinux/dummy/contexts/failsafe_context +echo "base_r:base_t:s0 base_r:base_t:s0" > /etc/selinux/dummy/default_contexts +cat > /etc/selinux/dummy/contexts/x_contexts <<EOF +client * user_u:base_r:base_t:s0 +property * user_u:object_r:base_t:s0 +extension * user_u:object_r:base_t:s0 +selection * user_u:object_r:base_t:s0 +event * user_u:object_r:base_t:s0 +EOF +touch /etc/selinux/dummy/contexts/virtual_domain_context +touch /etc/selinux/dummy/contexts/virtual_image_context + +cp file_contexts /etc/selinux/dummy/contexts/files +cp dbus_contexts /etc/selinux/dummy/contexts +cp policy.$VERS /etc/selinux/dummy/policy +FC_FILE=/etc/selinux/dummy/contexts/files/file_contexts + +if [ ! -d /etc/selinux ]; then + mkdir -p /etc/selinux +fi +if [ -f /etc/selinux/config ]; then + echo "/etc/selinux/config exists, moving to /etc/selinux/config.bak." + mv /etc/selinux/config /etc/selinux/config.bak +fi +echo "Creating new /etc/selinux/config for dummy policy." +cat > /etc/selinux/config << EOF +SELINUX=permissive +SELINUXTYPE=dummy +EOF + +cd /etc/selinux/dummy/contexts/files +$SF -F file_contexts / + +mounts=`cat /proc/$$/mounts | \ + egrep "ext[234]|jfs|xfs|reiserfs|jffs2|gfs2|btrfs|f2fs|ocfs2" | \ + awk '{ print $2 '}` +$SF -F file_contexts $mounts + +echo "-F" > /.autorelabel diff --git a/src/net/scripts/selinux/mdp/.gitignore b/src/net/scripts/selinux/mdp/.gitignore new file mode 100644 index 0000000..a748228 --- /dev/null +++ b/src/net/scripts/selinux/mdp/.gitignore @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: GPL-2.0-only +mdp diff --git a/src/net/scripts/selinux/mdp/Makefile b/src/net/scripts/selinux/mdp/Makefile new file mode 100644 index 0000000..d61058d --- /dev/null +++ b/src/net/scripts/selinux/mdp/Makefile @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: GPL-2.0 +hostprogs-always-y += mdp +HOST_EXTRACFLAGS += \ + -I$(srctree)/include/uapi -I$(srctree)/include \ + -I$(srctree)/security/selinux/include -I$(objtree)/include + +clean-files := policy.* file_contexts diff --git a/src/net/scripts/selinux/mdp/dbus_contexts b/src/net/scripts/selinux/mdp/dbus_contexts new file mode 100644 index 0000000..116e684 --- /dev/null +++ b/src/net/scripts/selinux/mdp/dbus_contexts @@ -0,0 +1,6 @@ +<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" + "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> +<busconfig> + <selinux> + </selinux> +</busconfig> diff --git a/src/net/scripts/selinux/mdp/mdp.c b/src/net/scripts/selinux/mdp/mdp.c new file mode 100644 index 0000000..105c1c3 --- /dev/null +++ b/src/net/scripts/selinux/mdp/mdp.c @@ -0,0 +1,273 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * + * mdp - make dummy policy + * + * When pointed at a kernel tree, builds a dummy policy for that kernel + * with exactly one type with full rights to itself. + * + * Copyright (C) IBM Corporation, 2006 + * + * Authors: Serge E. Hallyn <serue@us.ibm.com> + */ + + +/* NOTE: we really do want to use the kernel headers here */ +#define __EXPORTED_HEADERS__ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <linux/kconfig.h> + +static void usage(char *name) +{ + printf("usage: %s [-m] policy_file context_file\n", name); + exit(1); +} + +/* Class/perm mapping support */ +struct security_class_mapping { + const char *name; + const char *perms[sizeof(unsigned) * 8 + 1]; +}; + +#include "classmap.h" +#include "initial_sid_to_string.h" +#include "policycap_names.h" + +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) + +int main(int argc, char *argv[]) +{ + int i, j, mls = 0; + int initial_sid_to_string_len; + char **arg, *polout, *ctxout; + + FILE *fout; + + if (argc < 3) + usage(argv[0]); + arg = argv+1; + if (argc==4 && strcmp(argv[1], "-m") == 0) { + mls = 1; + arg++; + } + polout = *arg++; + ctxout = *arg; + + fout = fopen(polout, "w"); + if (!fout) { + printf("Could not open %s for writing\n", polout); + usage(argv[0]); + } + + /* print out the classes */ + for (i = 0; secclass_map[i].name; i++) + fprintf(fout, "class %s\n", secclass_map[i].name); + fprintf(fout, "\n"); + + initial_sid_to_string_len = sizeof(initial_sid_to_string) / sizeof (char *); + /* print out the sids */ + for (i = 1; i < initial_sid_to_string_len; i++) { + const char *name = initial_sid_to_string[i]; + + if (name) + fprintf(fout, "sid %s\n", name); + else + fprintf(fout, "sid unused%d\n", i); + } + fprintf(fout, "\n"); + + /* print out the class permissions */ + for (i = 0; secclass_map[i].name; i++) { + struct security_class_mapping *map = &secclass_map[i]; + fprintf(fout, "class %s\n", map->name); + fprintf(fout, "{\n"); + for (j = 0; map->perms[j]; j++) + fprintf(fout, "\t%s\n", map->perms[j]); + fprintf(fout, "}\n\n"); + } + fprintf(fout, "\n"); + + /* print out mls declarations and constraints */ + if (mls) { + fprintf(fout, "sensitivity s0;\n"); + fprintf(fout, "sensitivity s1;\n"); + fprintf(fout, "dominance { s0 s1 }\n"); + fprintf(fout, "category c0;\n"); + fprintf(fout, "category c1;\n"); + fprintf(fout, "level s0:c0.c1;\n"); + fprintf(fout, "level s1:c0.c1;\n"); +#define SYSTEMLOW "s0" +#define SYSTEMHIGH "s1:c0.c1" + for (i = 0; secclass_map[i].name; i++) { + struct security_class_mapping *map = &secclass_map[i]; + + fprintf(fout, "mlsconstrain %s {\n", map->name); + for (j = 0; map->perms[j]; j++) + fprintf(fout, "\t%s\n", map->perms[j]); + /* + * This requires all subjects and objects to be + * single-level (l2 eq h2), and that the subject + * level dominate the object level (h1 dom h2) + * in order to have any permissions to it. + */ + fprintf(fout, "} (l2 eq h2 and h1 dom h2);\n\n"); + } + } + + /* enable all policy capabilities */ + for (i = 0; i < ARRAY_SIZE(selinux_policycap_names); i++) + fprintf(fout, "policycap %s;\n", selinux_policycap_names[i]); + + /* types, roles, and allows */ + fprintf(fout, "type base_t;\n"); + fprintf(fout, "role base_r;\n"); + fprintf(fout, "role base_r types { base_t };\n"); + for (i = 0; secclass_map[i].name; i++) + fprintf(fout, "allow base_t base_t:%s *;\n", + secclass_map[i].name); + fprintf(fout, "user user_u roles { base_r }"); + if (mls) + fprintf(fout, " level %s range %s - %s", SYSTEMLOW, + SYSTEMLOW, SYSTEMHIGH); + fprintf(fout, ";\n"); + +#define SUBJUSERROLETYPE "user_u:base_r:base_t" +#define OBJUSERROLETYPE "user_u:object_r:base_t" + + /* default sids */ + for (i = 1; i < initial_sid_to_string_len; i++) { + const char *name = initial_sid_to_string[i]; + + if (name) + fprintf(fout, "sid %s ", name); + else + fprintf(fout, "sid unused%d\n", i); + fprintf(fout, SUBJUSERROLETYPE "%s\n", + mls ? ":" SYSTEMLOW : ""); + } + fprintf(fout, "\n"); + +#define FS_USE(behavior, fstype) \ + fprintf(fout, "fs_use_%s %s " OBJUSERROLETYPE "%s;\n", \ + behavior, fstype, mls ? ":" SYSTEMLOW : "") + + /* + * Filesystems whose inode labels can be fetched via getxattr. + */ +#ifdef CONFIG_EXT2_FS_SECURITY + FS_USE("xattr", "ext2"); +#endif +#ifdef CONFIG_EXT4_FS_SECURITY +#ifdef CONFIG_EXT4_USE_FOR_EXT2 + FS_USE("xattr", "ext2"); +#endif + FS_USE("xattr", "ext3"); + FS_USE("xattr", "ext4"); +#endif +#ifdef CONFIG_JFS_SECURITY + FS_USE("xattr", "jfs"); +#endif +#ifdef CONFIG_REISERFS_FS_SECURITY + FS_USE("xattr", "reiserfs"); +#endif +#ifdef CONFIG_JFFS2_FS_SECURITY + FS_USE("xattr", "jffs2"); +#endif +#ifdef CONFIG_XFS_FS + FS_USE("xattr", "xfs"); +#endif +#ifdef CONFIG_GFS2_FS + FS_USE("xattr", "gfs2"); +#endif +#ifdef CONFIG_BTRFS_FS + FS_USE("xattr", "btrfs"); +#endif +#ifdef CONFIG_F2FS_FS_SECURITY + FS_USE("xattr", "f2fs"); +#endif +#ifdef CONFIG_OCFS2_FS + FS_USE("xattr", "ocsfs2"); +#endif +#ifdef CONFIG_OVERLAY_FS + FS_USE("xattr", "overlay"); +#endif +#ifdef CONFIG_SQUASHFS_XATTR + FS_USE("xattr", "squashfs"); +#endif + + /* + * Filesystems whose inodes are labeled from allocating task. + */ + FS_USE("task", "pipefs"); + FS_USE("task", "sockfs"); + + /* + * Filesystems whose inode labels are computed from both + * the allocating task and the superblock label. + */ +#ifdef CONFIG_UNIX98_PTYS + FS_USE("trans", "devpts"); +#endif +#ifdef CONFIG_HUGETLBFS + FS_USE("trans", "hugetlbfs"); +#endif +#ifdef CONFIG_TMPFS + FS_USE("trans", "tmpfs"); +#endif +#ifdef CONFIG_DEVTMPFS + FS_USE("trans", "devtmpfs"); +#endif +#ifdef CONFIG_POSIX_MQUEUE + FS_USE("trans", "mqueue"); +#endif + +#define GENFSCON(fstype, prefix) \ + fprintf(fout, "genfscon %s %s " OBJUSERROLETYPE "%s\n", \ + fstype, prefix, mls ? ":" SYSTEMLOW : "") + + /* + * Filesystems whose inodes are labeled from path prefix match + * relative to the filesystem root. Depending on the filesystem, + * only a single label for all inodes may be supported. Here + * we list the filesystem types for which per-file labeling is + * supported using genfscon; any other filesystem type can also + * be added by only with a single entry for all of its inodes. + */ +#ifdef CONFIG_PROC_FS + GENFSCON("proc", "/"); +#endif +#ifdef CONFIG_SECURITY_SELINUX + GENFSCON("selinuxfs", "/"); +#endif +#ifdef CONFIG_SYSFS + GENFSCON("sysfs", "/"); +#endif +#ifdef CONFIG_DEBUG_FS + GENFSCON("debugfs", "/"); +#endif +#ifdef CONFIG_TRACING + GENFSCON("tracefs", "/"); +#endif +#ifdef CONFIG_PSTORE + GENFSCON("pstore", "/"); +#endif + GENFSCON("cgroup", "/"); + GENFSCON("cgroup2", "/"); + + fclose(fout); + + fout = fopen(ctxout, "w"); + if (!fout) { + printf("Wrote policy, but cannot open %s for writing\n", ctxout); + usage(argv[0]); + } + fprintf(fout, "/ " OBJUSERROLETYPE "%s\n", mls ? ":" SYSTEMLOW : ""); + fprintf(fout, "/.* " OBJUSERROLETYPE "%s\n", mls ? ":" SYSTEMLOW : ""); + fclose(fout); + + return 0; +} diff --git a/src/net/scripts/setlocalversion b/src/net/scripts/setlocalversion new file mode 100755 index 0000000..bb709ed --- /dev/null +++ b/src/net/scripts/setlocalversion @@ -0,0 +1,194 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# +# This scripts adds local version information from the version +# control systems git, mercurial (hg) and subversion (svn). +# +# If something goes wrong, send a mail the kernel build mailinglist +# (see MAINTAINERS) and CC Nico Schottelius +# <nico-linuxsetlocalversion -at- schottelius.org>. +# +# + +usage() { + echo "Usage: $0 [--save-scmversion] [srctree]" >&2 + exit 1 +} + +scm_only=false +srctree=. +if test "$1" = "--save-scmversion"; then + scm_only=true + shift +fi +if test $# -gt 0; then + srctree=$1 + shift +fi +if test $# -gt 0 -o ! -d "$srctree"; then + usage +fi + +scm_version() +{ + local short + short=false + + cd "$srctree" + if test -e .scmversion; then + cat .scmversion + return + fi + if test "$1" = "--short"; then + short=true + fi + + # Check for git and a git repo. + if test -z "$(git rev-parse --show-cdup 2>/dev/null)" && + head=$(git rev-parse --verify HEAD 2>/dev/null); then + + # If we are at a tagged commit (like "v2.6.30-rc6"), we ignore + # it, because this version is defined in the top level Makefile. + if [ -z "$(git describe --exact-match 2>/dev/null)" ]; then + + # If only the short version is requested, don't bother + # running further git commands + if $short; then + echo "+" + return + fi + # If we are past a tagged commit (like + # "v2.6.30-rc5-302-g72357d5"), we pretty print it. + # + # Ensure the abbreviated sha1 has exactly 12 + # hex characters, to make the output + # independent of git version, local + # core.abbrev settings and/or total number of + # objects in the current repository - passing + # --abbrev=12 ensures a minimum of 12, and the + # awk substr() then picks the 'g' and first 12 + # hex chars. + if atag="$(git describe --abbrev=12 2>/dev/null)"; then + echo "$atag" | awk -F- '{printf("-%05d-%s", $(NF-1),substr($(NF),0,13))}' + + # If we don't have a tag at all we print -g{commitish}, + # again using exactly 12 hex chars. + else + head="$(echo $head | cut -c1-12)" + printf '%s%s' -g $head + fi + fi + + # Is this git on svn? + if git config --get svn-remote.svn.url >/dev/null; then + printf -- '-svn%s' "$(git svn find-rev $head)" + fi + + # Check for uncommitted changes. + # First, with git-status, but --no-optional-locks is only + # supported in git >= 2.14, so fall back to git-diff-index if + # it fails. Note that git-diff-index does not refresh the + # index, so it may give misleading results. See + # git-update-index(1), git-diff-index(1), and git-status(1). + if { + git --no-optional-locks status -uno --porcelain 2>/dev/null || + git diff-index --name-only HEAD + } | grep -qvE '^(.. )?scripts/package'; then + printf '%s' -dirty + fi + + # All done with git + return + fi + + # Check for mercurial and a mercurial repo. + if test -d .hg && hgid=$(hg id 2>/dev/null); then + # Do we have an tagged version? If so, latesttagdistance == 1 + if [ "$(hg log -r . --template '{latesttagdistance}')" = "1" ]; then + id=$(hg log -r . --template '{latesttag}') + printf '%s%s' -hg "$id" + else + tag=$(printf '%s' "$hgid" | cut -d' ' -f2) + if [ -z "$tag" -o "$tag" = tip ]; then + id=$(printf '%s' "$hgid" | sed 's/[+ ].*//') + printf '%s%s' -hg "$id" + fi + fi + + # Are there uncommitted changes? + # These are represented by + after the changeset id. + case "$hgid" in + *+|*+\ *) printf '%s' -dirty ;; + esac + + # All done with mercurial + return + fi + + # Check for svn and a svn repo. + if rev=$(LANG= LC_ALL= LC_MESSAGES=C svn info 2>/dev/null | grep '^Last Changed Rev'); then + rev=$(echo $rev | awk '{print $NF}') + printf -- '-svn%s' "$rev" + + # All done with svn + return + fi +} + +collect_files() +{ + local file res= + + for file; do + case "$file" in + *\~*) + continue + ;; + esac + if test -e "$file"; then + res="$res$(cat "$file")" + fi + done + echo "$res" +} + +if $scm_only; then + if test ! -e .scmversion; then + res=$(scm_version) + echo "$res" >.scmversion + fi + exit +fi + +if test -e include/config/auto.conf; then + . include/config/auto.conf +else + echo "Error: kernelrelease not valid - run 'make prepare' to update it" >&2 + exit 1 +fi + +# localversion* files in the build and source directory +res="$(collect_files localversion*)" +if test ! "$srctree" -ef .; then + res="$res$(collect_files "$srctree"/localversion*)" +fi + +# CONFIG_LOCALVERSION and LOCALVERSION (if set) +res="${res}${CONFIG_LOCALVERSION}${LOCALVERSION}" + +# scm version string if not at a tagged commit +if test "$CONFIG_LOCALVERSION_AUTO" = "y"; then + # full scm version string + res="$res$(scm_version)" +else + # append a plus sign if the repository is not in a clean + # annotated or signed tagged state (as git describe only + # looks at signed or annotated tags - git tag -a/-s) and + # LOCALVERSION= is not specified + if test "${LOCALVERSION+set}" != "set"; then + scm=$(scm_version --short) + res="$res${scm:++}" + fi +fi + +echo "$res" diff --git a/src/net/scripts/show_delta b/src/net/scripts/show_delta new file mode 100755 index 0000000..28e67e1 --- /dev/null +++ b/src/net/scripts/show_delta @@ -0,0 +1,128 @@ +#!/usr/bin/env python +# SPDX-License-Identifier: GPL-2.0-only +# +# show_deltas: Read list of printk messages instrumented with +# time data, and format with time deltas. +# +# Also, you can show the times relative to a fixed point. +# +# Copyright 2003 Sony Corporation +# + +import sys +import string + +def usage(): + print ("""usage: show_delta [<options>] <filename> + +This program parses the output from a set of printk message lines which +have time data prefixed because the CONFIG_PRINTK_TIME option is set, or +the kernel command line option "time" is specified. When run with no +options, the time information is converted to show the time delta between +each printk line and the next. When run with the '-b' option, all times +are relative to a single (base) point in time. + +Options: + -h Show this usage help. + -b <base> Specify a base for time references. + <base> can be a number or a string. + If it is a string, the first message line + which matches (at the beginning of the + line) is used as the time reference. + +ex: $ dmesg >timefile + $ show_delta -b NET4 timefile + +will show times relative to the line in the kernel output +starting with "NET4". +""") + sys.exit(1) + +# returns a tuple containing the seconds and text for each message line +# seconds is returned as a float +# raise an exception if no timing data was found +def get_time(line): + if line[0]!="[": + raise ValueError + + # split on closing bracket + (time_str, rest) = string.split(line[1:],']',1) + time = string.atof(time_str) + + #print "time=", time + return (time, rest) + + +# average line looks like: +# [ 0.084282] VFS: Mounted root (romfs filesystem) readonly +# time data is expressed in seconds.useconds, +# convert_line adds a delta for each line +last_time = 0.0 +def convert_line(line, base_time): + global last_time + + try: + (time, rest) = get_time(line) + except: + # if any problem parsing time, don't convert anything + return line + + if base_time: + # show time from base + delta = time - base_time + else: + # just show time from last line + delta = time - last_time + last_time = time + + return ("[%5.6f < %5.6f >]" % (time, delta)) + rest + +def main(): + base_str = "" + filein = "" + for arg in sys.argv[1:]: + if arg=="-b": + base_str = sys.argv[sys.argv.index("-b")+1] + elif arg=="-h": + usage() + else: + filein = arg + + if not filein: + usage() + + try: + lines = open(filein,"r").readlines() + except: + print ("Problem opening file: %s" % filein) + sys.exit(1) + + if base_str: + print ('base= "%s"' % base_str) + # assume a numeric base. If that fails, try searching + # for a matching line. + try: + base_time = float(base_str) + except: + # search for line matching <base> string + found = 0 + for line in lines: + try: + (time, rest) = get_time(line) + except: + continue + if string.find(rest, base_str)==1: + base_time = time + found = 1 + # stop at first match + break + if not found: + print ('Couldn\'t find line matching base pattern "%s"' % base_str) + sys.exit(1) + else: + base_time = 0.0 + + for line in lines: + print (convert_line(line, base_time),) + +main() diff --git a/src/net/scripts/sign-file.c b/src/net/scripts/sign-file.c new file mode 100644 index 0000000..77bc5d2 --- /dev/null +++ b/src/net/scripts/sign-file.c @@ -0,0 +1,423 @@ +/* Sign a module file using the given key. + * + * Copyright © 2014-2016 Red Hat, Inc. All Rights Reserved. + * Copyright © 2015 Intel Corporation. + * Copyright © 2016 Hewlett Packard Enterprise Development LP + * + * Authors: David Howells <dhowells@redhat.com> + * David Woodhouse <dwmw2@infradead.org> + * Juerg Haefliger <juerg.haefliger@hpe.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the licence, or (at your option) any later version. + */ +#define _GNU_SOURCE +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <stdbool.h> +#include <string.h> +#include <getopt.h> +#include <err.h> +#include <arpa/inet.h> +#include <openssl/opensslv.h> +#include <openssl/bio.h> +#include <openssl/evp.h> +#include <openssl/pem.h> +#include <openssl/err.h> +#include <openssl/engine.h> + +/* + * Use CMS if we have openssl-1.0.0 or newer available - otherwise we have to + * assume that it's not available and its header file is missing and that we + * should use PKCS#7 instead. Switching to the older PKCS#7 format restricts + * the options we have on specifying the X.509 certificate we want. + * + * Further, older versions of OpenSSL don't support manually adding signers to + * the PKCS#7 message so have to accept that we get a certificate included in + * the signature message. Nor do such older versions of OpenSSL support + * signing with anything other than SHA1 - so we're stuck with that if such is + * the case. + */ +#if defined(LIBRESSL_VERSION_NUMBER) || \ + OPENSSL_VERSION_NUMBER < 0x10000000L || \ + defined(OPENSSL_NO_CMS) +#define USE_PKCS7 +#endif +#ifndef USE_PKCS7 +#include <openssl/cms.h> +#else +#include <openssl/pkcs7.h> +#endif + +struct module_signature { + uint8_t algo; /* Public-key crypto algorithm [0] */ + uint8_t hash; /* Digest algorithm [0] */ + uint8_t id_type; /* Key identifier type [PKEY_ID_PKCS7] */ + uint8_t signer_len; /* Length of signer's name [0] */ + uint8_t key_id_len; /* Length of key identifier [0] */ + uint8_t __pad[3]; + uint32_t sig_len; /* Length of signature data */ +}; + +#define PKEY_ID_PKCS7 2 + +static char magic_number[] = "~Module signature appended~\n"; + +static __attribute__((noreturn)) +void format(void) +{ + fprintf(stderr, + "Usage: scripts/sign-file [-dp] <hash algo> <key> <x509> <module> [<dest>]\n"); + fprintf(stderr, + " scripts/sign-file -s <raw sig> <hash algo> <x509> <module> [<dest>]\n"); + exit(2); +} + +static void display_openssl_errors(int l) +{ + const char *file; + char buf[120]; + int e, line; + + if (ERR_peek_error() == 0) + return; + fprintf(stderr, "At main.c:%d:\n", l); + + while ((e = ERR_get_error_line(&file, &line))) { + ERR_error_string(e, buf); + fprintf(stderr, "- SSL %s: %s:%d\n", buf, file, line); + } +} + +static void drain_openssl_errors(void) +{ + const char *file; + int line; + + if (ERR_peek_error() == 0) + return; + while (ERR_get_error_line(&file, &line)) {} +} + +#define ERR(cond, fmt, ...) \ + do { \ + bool __cond = (cond); \ + display_openssl_errors(__LINE__); \ + if (__cond) { \ + errx(1, fmt, ## __VA_ARGS__); \ + } \ + } while(0) + +static const char *key_pass; + +static int pem_pw_cb(char *buf, int len, int w, void *v) +{ + int pwlen; + + if (!key_pass) + return -1; + + pwlen = strlen(key_pass); + if (pwlen >= len) + return -1; + + strcpy(buf, key_pass); + + /* If it's wrong, don't keep trying it. */ + key_pass = NULL; + + return pwlen; +} + +static EVP_PKEY *read_private_key(const char *private_key_name) +{ + EVP_PKEY *private_key; + + if (!strncmp(private_key_name, "pkcs11:", 7)) { + ENGINE *e; + + ENGINE_load_builtin_engines(); + drain_openssl_errors(); + e = ENGINE_by_id("pkcs11"); + ERR(!e, "Load PKCS#11 ENGINE"); + if (ENGINE_init(e)) + drain_openssl_errors(); + else + ERR(1, "ENGINE_init"); + if (key_pass) + ERR(!ENGINE_ctrl_cmd_string(e, "PIN", key_pass, 0), + "Set PKCS#11 PIN"); + private_key = ENGINE_load_private_key(e, private_key_name, + NULL, NULL); + ERR(!private_key, "%s", private_key_name); + } else { + BIO *b; + + b = BIO_new_file(private_key_name, "rb"); + ERR(!b, "%s", private_key_name); + private_key = PEM_read_bio_PrivateKey(b, NULL, pem_pw_cb, + NULL); + ERR(!private_key, "%s", private_key_name); + BIO_free(b); + } + + return private_key; +} + +static X509 *read_x509(const char *x509_name) +{ + unsigned char buf[2]; + X509 *x509; + BIO *b; + int n; + + b = BIO_new_file(x509_name, "rb"); + ERR(!b, "%s", x509_name); + + /* Look at the first two bytes of the file to determine the encoding */ + n = BIO_read(b, buf, 2); + if (n != 2) { + if (BIO_should_retry(b)) { + fprintf(stderr, "%s: Read wanted retry\n", x509_name); + exit(1); + } + if (n >= 0) { + fprintf(stderr, "%s: Short read\n", x509_name); + exit(1); + } + ERR(1, "%s", x509_name); + } + + ERR(BIO_reset(b) != 0, "%s", x509_name); + + if (buf[0] == 0x30 && buf[1] >= 0x81 && buf[1] <= 0x84) + /* Assume raw DER encoded X.509 */ + x509 = d2i_X509_bio(b, NULL); + else + /* Assume PEM encoded X.509 */ + x509 = PEM_read_bio_X509(b, NULL, NULL, NULL); + + BIO_free(b); + ERR(!x509, "%s", x509_name); + + return x509; +} + +int main(int argc, char **argv) +{ + struct module_signature sig_info = { .id_type = PKEY_ID_PKCS7 }; + char *hash_algo = NULL; + char *private_key_name = NULL, *raw_sig_name = NULL; + char *x509_name, *module_name, *dest_name; + bool save_sig = false, replace_orig; + bool sign_only = false; + bool raw_sig = false; + unsigned char buf[4096]; + unsigned long module_size, sig_size; + unsigned int use_signed_attrs; + const EVP_MD *digest_algo; + EVP_PKEY *private_key; +#if defined(EVP_PKEY_SM2) && OPENSSL_VERSION_NUMBER < 0x30000000 + EVP_PKEY *pkey; +#endif +#ifndef USE_PKCS7 + CMS_ContentInfo *cms = NULL; + unsigned int use_keyid = 0; +#else + PKCS7 *pkcs7 = NULL; +#endif + X509 *x509; + BIO *bd, *bm; + int opt, n; + OpenSSL_add_all_algorithms(); + ERR_load_crypto_strings(); + ERR_clear_error(); + + key_pass = getenv("KBUILD_SIGN_PIN"); + +#ifndef USE_PKCS7 + use_signed_attrs = CMS_NOATTR; +#else + use_signed_attrs = PKCS7_NOATTR; +#endif + + do { + opt = getopt(argc, argv, "sdpk"); + switch (opt) { + case 's': raw_sig = true; break; + case 'p': save_sig = true; break; + case 'd': sign_only = true; save_sig = true; break; +#ifndef USE_PKCS7 + case 'k': use_keyid = CMS_USE_KEYID; break; +#endif + case -1: break; + default: format(); + } + } while (opt != -1); + + argc -= optind; + argv += optind; + if (argc < 4 || argc > 5) + format(); + + if (raw_sig) { + raw_sig_name = argv[0]; + hash_algo = argv[1]; + } else { + hash_algo = argv[0]; + private_key_name = argv[1]; + } + x509_name = argv[2]; + module_name = argv[3]; + if (argc == 5 && strcmp(argv[3], argv[4]) != 0) { + dest_name = argv[4]; + replace_orig = false; + } else { + ERR(asprintf(&dest_name, "%s.~signed~", module_name) < 0, + "asprintf"); + replace_orig = true; + } + +#ifdef USE_PKCS7 + if (strcmp(hash_algo, "sha1") != 0) { + fprintf(stderr, "sign-file: %s only supports SHA1 signing\n", + OPENSSL_VERSION_TEXT); + exit(3); + } +#endif + + /* Open the module file */ + bm = BIO_new_file(module_name, "rb"); + ERR(!bm, "%s", module_name); + + if (!raw_sig) { + /* Read the private key and the X.509 cert the PKCS#7 message + * will point to. + */ + private_key = read_private_key(private_key_name); + x509 = read_x509(x509_name); + + /* Digest the module data. */ + OpenSSL_add_all_digests(); + display_openssl_errors(__LINE__); + digest_algo = EVP_get_digestbyname(hash_algo); + ERR(!digest_algo, "EVP_get_digestbyname"); + +#if defined(EVP_PKEY_SM2) && OPENSSL_VERSION_NUMBER < 0x30000000 + /* If EC key are used, check whether it is SM2 key */ + if (EVP_PKEY_id(private_key) == EVP_PKEY_EC) { + EC_KEY *ec = EVP_PKEY_get0_EC_KEY(private_key); + int curve = EC_GROUP_get_curve_name(EC_KEY_get0_group(ec)); + + if (curve == NID_sm2) + EVP_PKEY_set_alias_type(private_key, EVP_PKEY_SM2); + } + + pkey = X509_get0_pubkey(x509); + /* If EC key are used, check whether it is SM2 key */ + if (EVP_PKEY_id(pkey) == EVP_PKEY_EC) { + EC_KEY *ec = EVP_PKEY_get0_EC_KEY(pkey); + int curve = EC_GROUP_get_curve_name(EC_KEY_get0_group(ec)); + + if (curve == NID_sm2) + EVP_PKEY_set_alias_type(pkey, EVP_PKEY_SM2); + } +#endif + +#ifndef USE_PKCS7 + /* Load the signature message from the digest buffer. */ + cms = CMS_sign(NULL, NULL, NULL, NULL, + CMS_NOCERTS | CMS_PARTIAL | CMS_BINARY | + CMS_DETACHED | CMS_STREAM); + ERR(!cms, "CMS_sign"); + + ERR(!CMS_add1_signer(cms, x509, private_key, digest_algo, + CMS_NOCERTS | CMS_BINARY | + CMS_NOSMIMECAP | use_keyid | + use_signed_attrs), + "CMS_add1_signer"); + ERR(CMS_final(cms, bm, NULL, CMS_NOCERTS | CMS_BINARY) < 0, + "CMS_final"); + +#else + pkcs7 = PKCS7_sign(x509, private_key, NULL, bm, + PKCS7_NOCERTS | PKCS7_BINARY | + PKCS7_DETACHED | use_signed_attrs); + ERR(!pkcs7, "PKCS7_sign"); +#endif + + if (save_sig) { + char *sig_file_name; + BIO *b; + + ERR(asprintf(&sig_file_name, "%s.p7s", module_name) < 0, + "asprintf"); + b = BIO_new_file(sig_file_name, "wb"); + ERR(!b, "%s", sig_file_name); +#ifndef USE_PKCS7 + ERR(i2d_CMS_bio_stream(b, cms, NULL, 0) < 0, + "%s", sig_file_name); +#else + ERR(i2d_PKCS7_bio(b, pkcs7) < 0, + "%s", sig_file_name); +#endif + BIO_free(b); + } + + if (sign_only) { + BIO_free(bm); + return 0; + } + } + + /* Open the destination file now so that we can shovel the module data + * across as we read it. + */ + bd = BIO_new_file(dest_name, "wb"); + ERR(!bd, "%s", dest_name); + + /* Append the marker and the PKCS#7 message to the destination file */ + ERR(BIO_reset(bm) < 0, "%s", module_name); + while ((n = BIO_read(bm, buf, sizeof(buf))), + n > 0) { + ERR(BIO_write(bd, buf, n) < 0, "%s", dest_name); + } + BIO_free(bm); + ERR(n < 0, "%s", module_name); + module_size = BIO_number_written(bd); + + if (!raw_sig) { +#ifndef USE_PKCS7 + ERR(i2d_CMS_bio_stream(bd, cms, NULL, 0) < 0, "%s", dest_name); +#else + ERR(i2d_PKCS7_bio(bd, pkcs7) < 0, "%s", dest_name); +#endif + } else { + BIO *b; + + /* Read the raw signature file and write the data to the + * destination file + */ + b = BIO_new_file(raw_sig_name, "rb"); + ERR(!b, "%s", raw_sig_name); + while ((n = BIO_read(b, buf, sizeof(buf))), n > 0) + ERR(BIO_write(bd, buf, n) < 0, "%s", dest_name); + BIO_free(b); + } + + sig_size = BIO_number_written(bd) - module_size; + sig_info.sig_len = htonl(sig_size); + ERR(BIO_write(bd, &sig_info, sizeof(sig_info)) < 0, "%s", dest_name); + ERR(BIO_write(bd, magic_number, sizeof(magic_number) - 1) < 0, "%s", dest_name); + + ERR(BIO_free(bd) < 0, "%s", dest_name); + + /* Finally, if we're signing in place, replace the original. */ + if (replace_orig) + ERR(rename(dest_name, module_name) < 0, "%s", dest_name); + + return 0; +} diff --git a/src/net/scripts/sorttable.c b/src/net/scripts/sorttable.c new file mode 100644 index 0000000..8028567 --- /dev/null +++ b/src/net/scripts/sorttable.c @@ -0,0 +1,485 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * sorttable.c: Sort the kernel's table + * + * Added ORC unwind tables sort support and other updates: + * Copyright (C) 1999-2019 Alibaba Group Holding Limited. by: + * Shile Zhang <shile.zhang@linux.alibaba.com> + * + * Copyright 2011 - 2012 Cavium, Inc. + * + * Based on code taken from recortmcount.c which is: + * + * Copyright 2009 John F. Reiser <jreiser@BitWagon.com>. All rights reserved. + * + * Restructured to fit Linux format, as well as other updates: + * Copyright 2010 Steven Rostedt <srostedt@redhat.com>, Red Hat Inc. + */ + +/* + * Strategy: alter the vmlinux file in-place. + */ + +#include <sys/types.h> +#include <sys/mman.h> +#include <sys/stat.h> +#include <getopt.h> +#include <elf.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <errno.h> +#include <pthread.h> + +#include <tools/be_byteshift.h> +#include <tools/le_byteshift.h> + +#ifndef EM_ARCOMPACT +#define EM_ARCOMPACT 93 +#endif + +#ifndef EM_XTENSA +#define EM_XTENSA 94 +#endif + +#ifndef EM_AARCH64 +#define EM_AARCH64 183 +#endif + +#ifndef EM_MICROBLAZE +#define EM_MICROBLAZE 189 +#endif + +#ifndef EM_ARCV2 +#define EM_ARCV2 195 +#endif + +#ifndef EM_LOONGARCH +#define EM_LOONGARCH 258 +#endif + +static uint32_t (*r)(const uint32_t *); +static uint16_t (*r2)(const uint16_t *); +static uint64_t (*r8)(const uint64_t *); +static void (*w)(uint32_t, uint32_t *); +static void (*w2)(uint16_t, uint16_t *); +static void (*w8)(uint64_t, uint64_t *); +typedef void (*table_sort_t)(char *, int); + +/* + * Get the whole file as a programming convenience in order to avoid + * malloc+lseek+read+free of many pieces. If successful, then mmap + * avoids copying unused pieces; else just read the whole file. + * Open for both read and write. + */ +static void *mmap_file(char const *fname, size_t *size) +{ + int fd; + struct stat sb; + void *addr = NULL; + + fd = open(fname, O_RDWR); + if (fd < 0) { + perror(fname); + return NULL; + } + if (fstat(fd, &sb) < 0) { + perror(fname); + goto out; + } + if (!S_ISREG(sb.st_mode)) { + fprintf(stderr, "not a regular file: %s\n", fname); + goto out; + } + + addr = mmap(0, sb.st_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); + if (addr == MAP_FAILED) { + fprintf(stderr, "Could not mmap file: %s\n", fname); + goto out; + } + + *size = sb.st_size; + +out: + close(fd); + return addr; +} + +static uint32_t rbe(const uint32_t *x) +{ + return get_unaligned_be32(x); +} + +static uint16_t r2be(const uint16_t *x) +{ + return get_unaligned_be16(x); +} + +static uint64_t r8be(const uint64_t *x) +{ + return get_unaligned_be64(x); +} + +static uint32_t rle(const uint32_t *x) +{ + return get_unaligned_le32(x); +} + +static uint16_t r2le(const uint16_t *x) +{ + return get_unaligned_le16(x); +} + +static uint64_t r8le(const uint64_t *x) +{ + return get_unaligned_le64(x); +} + +static void wbe(uint32_t val, uint32_t *x) +{ + put_unaligned_be32(val, x); +} + +static void w2be(uint16_t val, uint16_t *x) +{ + put_unaligned_be16(val, x); +} + +static void w8be(uint64_t val, uint64_t *x) +{ + put_unaligned_be64(val, x); +} + +static void wle(uint32_t val, uint32_t *x) +{ + put_unaligned_le32(val, x); +} + +static void w2le(uint16_t val, uint16_t *x) +{ + put_unaligned_le16(val, x); +} + +static void w8le(uint64_t val, uint64_t *x) +{ + put_unaligned_le64(val, x); +} + +/* + * Move reserved section indices SHN_LORESERVE..SHN_HIRESERVE out of + * the way to -256..-1, to avoid conflicting with real section + * indices. + */ +#define SPECIAL(i) ((i) - (SHN_HIRESERVE + 1)) + +static inline int is_shndx_special(unsigned int i) +{ + return i != SHN_XINDEX && i >= SHN_LORESERVE && i <= SHN_HIRESERVE; +} + +/* Accessor for sym->st_shndx, hides ugliness of "64k sections" */ +static inline unsigned int get_secindex(unsigned int shndx, + unsigned int sym_offs, + const Elf32_Word *symtab_shndx_start) +{ + if (is_shndx_special(shndx)) + return SPECIAL(shndx); + if (shndx != SHN_XINDEX) + return shndx; + return r(&symtab_shndx_start[sym_offs]); +} + +/* 32 bit and 64 bit are very similar */ +#include "sorttable.h" +#define SORTTABLE_64 +#include "sorttable.h" + +static int compare_relative_table(const void *a, const void *b) +{ + int32_t av = (int32_t)r(a); + int32_t bv = (int32_t)r(b); + + if (av < bv) + return -1; + if (av > bv) + return 1; + return 0; +} + +static void sort_relative_table(char *extab_image, int image_size) +{ + int i = 0; + + /* + * Do the same thing the runtime sort does, first normalize to + * being relative to the start of the section. + */ + while (i < image_size) { + uint32_t *loc = (uint32_t *)(extab_image + i); + w(r(loc) + i, loc); + i += 4; + } + + qsort(extab_image, image_size / 8, 8, compare_relative_table); + + /* Now denormalize. */ + i = 0; + while (i < image_size) { + uint32_t *loc = (uint32_t *)(extab_image + i); + w(r(loc) - i, loc); + i += 4; + } +} + +static void arm64_sort_relative_table(char *extab_image, int image_size) +{ + int i = 0; + + while (i < image_size) { + uint32_t *loc = (uint32_t *)(extab_image + i); + + w(r(loc) + i, loc); + w(r(loc + 1) + i + 4, loc + 1); + /* Don't touch the fixup type or data */ + + i += sizeof(uint32_t) * 3; + } + + qsort(extab_image, image_size / 12, 12, compare_relative_table); + + i = 0; + while (i < image_size) { + uint32_t *loc = (uint32_t *)(extab_image + i); + + w(r(loc) - i, loc); + w(r(loc + 1) - (i + 4), loc + 1); + /* Don't touch the fixup type or data */ + + i += sizeof(uint32_t) * 3; + } +} + +static void sort_relative_table_with_data(char *extab_image, int image_size) +{ + int i = 0; + + while (i < image_size) { + uint32_t *loc = (uint32_t *)(extab_image + i); + + w(r(loc) + i, loc); + w(r(loc + 1) + i + 4, loc + 1); + /* Don't touch the fixup type or data */ + + i += sizeof(uint32_t) * 3; + } + + qsort(extab_image, image_size / 12, 12, compare_relative_table); + + i = 0; + while (i < image_size) { + uint32_t *loc = (uint32_t *)(extab_image + i); + + w(r(loc) - i, loc); + w(r(loc + 1) - (i + 4), loc + 1); + /* Don't touch the fixup type or data */ + + i += sizeof(uint32_t) * 3; + } +} + +static void x86_sort_relative_table(char *extab_image, int image_size) +{ + int i = 0; + + while (i < image_size) { + uint32_t *loc = (uint32_t *)(extab_image + i); + + w(r(loc) + i, loc); + w(r(loc + 1) + i + 4, loc + 1); + /* Don't touch the fixup type */ + + i += sizeof(uint32_t) * 3; + } + + qsort(extab_image, image_size / 12, 12, compare_relative_table); + + i = 0; + while (i < image_size) { + uint32_t *loc = (uint32_t *)(extab_image + i); + + w(r(loc) - i, loc); + w(r(loc + 1) - (i + 4), loc + 1); + /* Don't touch the fixup type */ + + i += sizeof(uint32_t) * 3; + } +} + +static void s390_sort_relative_table(char *extab_image, int image_size) +{ + int i; + + for (i = 0; i < image_size; i += 16) { + char *loc = extab_image + i; + uint64_t handler; + + w(r((uint32_t *)loc) + i, (uint32_t *)loc); + w(r((uint32_t *)(loc + 4)) + (i + 4), (uint32_t *)(loc + 4)); + /* + * 0 is a special self-relative handler value, which means that + * handler should be ignored. It is safe, because it means that + * handler field points to itself, which should never happen. + * When creating extable-relative values, keep it as 0, since + * this should never occur either: it would mean that handler + * field points to the first extable entry. + */ + handler = r8((uint64_t *)(loc + 8)); + if (handler) + handler += i + 8; + w8(handler, (uint64_t *)(loc + 8)); + } + + qsort(extab_image, image_size / 16, 16, compare_relative_table); + + for (i = 0; i < image_size; i += 16) { + char *loc = extab_image + i; + uint64_t handler; + + w(r((uint32_t *)loc) - i, (uint32_t *)loc); + w(r((uint32_t *)(loc + 4)) - (i + 4), (uint32_t *)(loc + 4)); + handler = r8((uint64_t *)(loc + 8)); + if (handler) + handler -= i + 8; + w8(handler, (uint64_t *)(loc + 8)); + } +} + +static int do_file(char const *const fname, void *addr) +{ + int rc = -1; + Elf32_Ehdr *ehdr = addr; + table_sort_t custom_sort = NULL; + + switch (ehdr->e_ident[EI_DATA]) { + case ELFDATA2LSB: + r = rle; + r2 = r2le; + r8 = r8le; + w = wle; + w2 = w2le; + w8 = w8le; + break; + case ELFDATA2MSB: + r = rbe; + r2 = r2be; + r8 = r8be; + w = wbe; + w2 = w2be; + w8 = w8be; + break; + default: + fprintf(stderr, "unrecognized ELF data encoding %d: %s\n", + ehdr->e_ident[EI_DATA], fname); + return -1; + } + + if (memcmp(ELFMAG, ehdr->e_ident, SELFMAG) != 0 || + (r2(&ehdr->e_type) != ET_EXEC && r2(&ehdr->e_type) != ET_DYN) || + ehdr->e_ident[EI_VERSION] != EV_CURRENT) { + fprintf(stderr, "unrecognized ET_EXEC/ET_DYN file %s\n", fname); + return -1; + } + + switch (r2(&ehdr->e_machine)) { + case EM_386: + case EM_X86_64: + custom_sort = x86_sort_relative_table; + break; + case EM_LOONGARCH: + custom_sort = sort_relative_table_with_data; + break; + case EM_S390: + custom_sort = s390_sort_relative_table; + break; + case EM_AARCH64: + custom_sort = arm64_sort_relative_table; + break; + case EM_PARISC: + case EM_PPC: + case EM_PPC64: + custom_sort = sort_relative_table; + break; + case EM_ARCOMPACT: + case EM_ARCV2: + case EM_ARM: + case EM_MICROBLAZE: + case EM_MIPS: + case EM_XTENSA: + break; + default: + fprintf(stderr, "unrecognized e_machine %d %s\n", + r2(&ehdr->e_machine), fname); + return -1; + } + + switch (ehdr->e_ident[EI_CLASS]) { + case ELFCLASS32: + if (r2(&ehdr->e_ehsize) != sizeof(Elf32_Ehdr) || + r2(&ehdr->e_shentsize) != sizeof(Elf32_Shdr)) { + fprintf(stderr, + "unrecognized ET_EXEC/ET_DYN file: %s\n", fname); + break; + } + rc = do_sort_32(ehdr, fname, custom_sort); + break; + case ELFCLASS64: + { + Elf64_Ehdr *const ghdr = (Elf64_Ehdr *)ehdr; + if (r2(&ghdr->e_ehsize) != sizeof(Elf64_Ehdr) || + r2(&ghdr->e_shentsize) != sizeof(Elf64_Shdr)) { + fprintf(stderr, + "unrecognized ET_EXEC/ET_DYN file: %s\n", + fname); + break; + } + rc = do_sort_64(ghdr, fname, custom_sort); + } + break; + default: + fprintf(stderr, "unrecognized ELF class %d %s\n", + ehdr->e_ident[EI_CLASS], fname); + break; + } + + return rc; +} + +int main(int argc, char *argv[]) +{ + int i, n_error = 0; /* gcc-4.3.0 false positive complaint */ + size_t size = 0; + void *addr = NULL; + + if (argc < 2) { + fprintf(stderr, "usage: sorttable vmlinux...\n"); + return 0; + } + + /* Process each file in turn, allowing deep failure. */ + for (i = 1; i < argc; i++) { + addr = mmap_file(argv[i], &size); + if (!addr) { + ++n_error; + continue; + } + + if (do_file(argv[i], addr)) + ++n_error; + + munmap(addr, size); + } + + return !!n_error; +} diff --git a/src/net/scripts/sorttable.h b/src/net/scripts/sorttable.h new file mode 100644 index 0000000..4ce32e8 --- /dev/null +++ b/src/net/scripts/sorttable.h @@ -0,0 +1,497 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * sorttable.h + * + * Added ORC unwind tables sort support and other updates: + * Copyright (C) 1999-2019 Alibaba Group Holding Limited. by: + * Shile Zhang <shile.zhang@linux.alibaba.com> + * + * Copyright 2011 - 2012 Cavium, Inc. + * + * Some of code was taken out of arch/x86/kernel/unwind_orc.c, written by: + * Copyright (C) 2017 Josh Poimboeuf <jpoimboe@redhat.com> + * + * Some of this code was taken out of recordmcount.h written by: + * + * Copyright 2009 John F. Reiser <jreiser@BitWagon.com>. All rights reserved. + * Copyright 2010 Steven Rostedt <srostedt@redhat.com>, Red Hat Inc. + */ + +#undef extable_ent_size +#undef compare_extable +#undef get_mcount_loc +#undef sort_mcount_loc +#undef elf_mcount_loc +#undef do_sort +#undef Elf_Addr +#undef Elf_Ehdr +#undef Elf_Shdr +#undef Elf_Rel +#undef Elf_Rela +#undef Elf_Sym +#undef ELF_R_SYM +#undef Elf_r_sym +#undef ELF_R_INFO +#undef Elf_r_info +#undef ELF_ST_BIND +#undef ELF_ST_TYPE +#undef fn_ELF_R_SYM +#undef fn_ELF_R_INFO +#undef uint_t +#undef _r +#undef _w + +#ifdef SORTTABLE_64 +# define extable_ent_size 16 +# define compare_extable compare_extable_64 +# define get_mcount_loc get_mcount_loc_64 +# define sort_mcount_loc sort_mcount_loc_64 +# define elf_mcount_loc elf_mcount_loc_64 +# define do_sort do_sort_64 +# define Elf_Addr Elf64_Addr +# define Elf_Ehdr Elf64_Ehdr +# define Elf_Shdr Elf64_Shdr +# define Elf_Rel Elf64_Rel +# define Elf_Rela Elf64_Rela +# define Elf_Sym Elf64_Sym +# define ELF_R_SYM ELF64_R_SYM +# define Elf_r_sym Elf64_r_sym +# define ELF_R_INFO ELF64_R_INFO +# define Elf_r_info Elf64_r_info +# define ELF_ST_BIND ELF64_ST_BIND +# define ELF_ST_TYPE ELF64_ST_TYPE +# define fn_ELF_R_SYM fn_ELF64_R_SYM +# define fn_ELF_R_INFO fn_ELF64_R_INFO +# define uint_t uint64_t +# define _r r8 +# define _w w8 +#else +# define extable_ent_size 8 +# define compare_extable compare_extable_32 +# define get_mcount_loc get_mcount_loc_32 +# define sort_mcount_loc sort_mcount_loc_32 +# define elf_mcount_loc elf_mcount_loc_32 +# define do_sort do_sort_32 +# define Elf_Addr Elf32_Addr +# define Elf_Ehdr Elf32_Ehdr +# define Elf_Shdr Elf32_Shdr +# define Elf_Rel Elf32_Rel +# define Elf_Rela Elf32_Rela +# define Elf_Sym Elf32_Sym +# define ELF_R_SYM ELF32_R_SYM +# define Elf_r_sym Elf32_r_sym +# define ELF_R_INFO ELF32_R_INFO +# define Elf_r_info Elf32_r_info +# define ELF_ST_BIND ELF32_ST_BIND +# define ELF_ST_TYPE ELF32_ST_TYPE +# define fn_ELF_R_SYM fn_ELF32_R_SYM +# define fn_ELF_R_INFO fn_ELF32_R_INFO +# define uint_t uint32_t +# define _r r +# define _w w +#endif + +#if defined(SORTTABLE_64) && defined(UNWINDER_ORC_ENABLED) +/* ORC unwinder only support X86_64 */ +#include <asm/orc_types.h> + +#define ERRSTR_MAXSZ 256 + +char g_err[ERRSTR_MAXSZ]; +int *g_orc_ip_table; +struct orc_entry *g_orc_table; + +pthread_t orc_sort_thread; + +static inline unsigned long orc_ip(const int *ip) +{ + return (unsigned long)ip + *ip; +} + +static int orc_sort_cmp(const void *_a, const void *_b) +{ + struct orc_entry *orc_a; + const int *a = g_orc_ip_table + *(int *)_a; + const int *b = g_orc_ip_table + *(int *)_b; + unsigned long a_val = orc_ip(a); + unsigned long b_val = orc_ip(b); + + if (a_val > b_val) + return 1; + if (a_val < b_val) + return -1; + + /* + * The "weak" section terminator entries need to always be on the left + * to ensure the lookup code skips them in favor of real entries. + * These terminator entries exist to handle any gaps created by + * whitelisted .o files which didn't get objtool generation. + */ + orc_a = g_orc_table + (a - g_orc_ip_table); + return orc_a->sp_reg == ORC_REG_UNDEFINED && !orc_a->end ? -1 : 1; +} + +static void *sort_orctable(void *arg) +{ + int i; + int *idxs = NULL; + int *tmp_orc_ip_table = NULL; + struct orc_entry *tmp_orc_table = NULL; + unsigned int *orc_ip_size = (unsigned int *)arg; + unsigned int num_entries = *orc_ip_size / sizeof(int); + unsigned int orc_size = num_entries * sizeof(struct orc_entry); + + idxs = (int *)malloc(*orc_ip_size); + if (!idxs) { + snprintf(g_err, ERRSTR_MAXSZ, "malloc idxs: %s", + strerror(errno)); + pthread_exit(g_err); + } + + tmp_orc_ip_table = (int *)malloc(*orc_ip_size); + if (!tmp_orc_ip_table) { + snprintf(g_err, ERRSTR_MAXSZ, "malloc tmp_orc_ip_table: %s", + strerror(errno)); + pthread_exit(g_err); + } + + tmp_orc_table = (struct orc_entry *)malloc(orc_size); + if (!tmp_orc_table) { + snprintf(g_err, ERRSTR_MAXSZ, "malloc tmp_orc_table: %s", + strerror(errno)); + pthread_exit(g_err); + } + + /* initialize indices array, convert ip_table to absolute address */ + for (i = 0; i < num_entries; i++) { + idxs[i] = i; + tmp_orc_ip_table[i] = g_orc_ip_table[i] + i * sizeof(int); + } + memcpy(tmp_orc_table, g_orc_table, orc_size); + + qsort(idxs, num_entries, sizeof(int), orc_sort_cmp); + + for (i = 0; i < num_entries; i++) { + if (idxs[i] == i) + continue; + + /* convert back to relative address */ + g_orc_ip_table[i] = tmp_orc_ip_table[idxs[i]] - i * sizeof(int); + g_orc_table[i] = tmp_orc_table[idxs[i]]; + } + + free(idxs); + free(tmp_orc_ip_table); + free(tmp_orc_table); + pthread_exit(NULL); +} +#endif + +static int compare_extable(const void *a, const void *b) +{ + Elf_Addr av = _r(a); + Elf_Addr bv = _r(b); + + if (av < bv) + return -1; + if (av > bv) + return 1; + return 0; +} +#ifdef MCOUNT_SORT_ENABLED +pthread_t mcount_sort_thread; + +struct elf_mcount_loc { + Elf_Ehdr *ehdr; + Elf_Shdr *init_data_sec; + uint_t start_mcount_loc; + uint_t stop_mcount_loc; +}; + +/* Sort the addresses stored between __start_mcount_loc to __stop_mcount_loc in vmlinux */ +static void *sort_mcount_loc(void *arg) +{ + struct elf_mcount_loc *emloc = (struct elf_mcount_loc *)arg; + uint_t offset = emloc->start_mcount_loc - _r(&(emloc->init_data_sec)->sh_addr) + + _r(&(emloc->init_data_sec)->sh_offset); + uint_t count = emloc->stop_mcount_loc - emloc->start_mcount_loc; + unsigned char *start_loc = (void *)emloc->ehdr + offset; + + qsort(start_loc, count/sizeof(uint_t), sizeof(uint_t), compare_extable); + return NULL; +} + +/* Get the address of __start_mcount_loc and __stop_mcount_loc in System.map */ +static void get_mcount_loc(uint_t *_start, uint_t *_stop) +{ + FILE *file_start, *file_stop; + char start_buff[20]; + char stop_buff[20]; + int len = 0; + + file_start = popen(" grep start_mcount System.map | awk '{print $1}' ", "r"); + if (!file_start) { + fprintf(stderr, "get start_mcount_loc error!"); + return; + } + + file_stop = popen(" grep stop_mcount System.map | awk '{print $1}' ", "r"); + if (!file_stop) { + fprintf(stderr, "get stop_mcount_loc error!"); + pclose(file_start); + return; + } + + while (fgets(start_buff, sizeof(start_buff), file_start) != NULL) { + len = strlen(start_buff); + start_buff[len - 1] = '\0'; + } + *_start = strtoul(start_buff, NULL, 16); + + while (fgets(stop_buff, sizeof(stop_buff), file_stop) != NULL) { + len = strlen(stop_buff); + stop_buff[len - 1] = '\0'; + } + *_stop = strtoul(stop_buff, NULL, 16); + + pclose(file_start); + pclose(file_stop); +} +#endif +static int do_sort(Elf_Ehdr *ehdr, + char const *const fname, + table_sort_t custom_sort) +{ + int rc = -1; + Elf_Shdr *s, *shdr = (Elf_Shdr *)((char *)ehdr + _r(&ehdr->e_shoff)); + Elf_Shdr *strtab_sec = NULL; + Elf_Shdr *symtab_sec = NULL; + Elf_Shdr *extab_sec = NULL; + Elf_Sym *sym; + const Elf_Sym *symtab; + Elf32_Word *symtab_shndx = NULL; + Elf_Sym *sort_needed_sym = NULL; + Elf_Shdr *sort_needed_sec; + Elf_Rel *relocs = NULL; + int relocs_size = 0; + uint32_t *sort_needed_loc; + const char *secstrings; + const char *strtab; + char *extab_image; + int extab_index = 0; + int i; + int idx; + unsigned int shnum; + unsigned int shstrndx; +#ifdef MCOUNT_SORT_ENABLED + struct elf_mcount_loc mstruct = {0}; + uint_t _start_mcount_loc = 0; + uint_t _stop_mcount_loc = 0; +#endif +#if defined(SORTTABLE_64) && defined(UNWINDER_ORC_ENABLED) + unsigned int orc_ip_size = 0; + unsigned int orc_size = 0; + unsigned int orc_num_entries = 0; +#endif + + shstrndx = r2(&ehdr->e_shstrndx); + if (shstrndx == SHN_XINDEX) + shstrndx = r(&shdr[0].sh_link); + secstrings = (const char *)ehdr + _r(&shdr[shstrndx].sh_offset); + + shnum = r2(&ehdr->e_shnum); + if (shnum == SHN_UNDEF) + shnum = _r(&shdr[0].sh_size); + + for (i = 0, s = shdr; s < shdr + shnum; i++, s++) { + idx = r(&s->sh_name); + if (!strcmp(secstrings + idx, "__ex_table")) { + extab_sec = s; + extab_index = i; + } + if (!strcmp(secstrings + idx, ".symtab")) + symtab_sec = s; + if (!strcmp(secstrings + idx, ".strtab")) + strtab_sec = s; + + if ((r(&s->sh_type) == SHT_REL || + r(&s->sh_type) == SHT_RELA) && + r(&s->sh_info) == extab_index) { + relocs = (void *)ehdr + _r(&s->sh_offset); + relocs_size = _r(&s->sh_size); + } + if (r(&s->sh_type) == SHT_SYMTAB_SHNDX) + symtab_shndx = (Elf32_Word *)((const char *)ehdr + + _r(&s->sh_offset)); + +#ifdef MCOUNT_SORT_ENABLED + /* locate the .init.data section in vmlinux */ + if (!strcmp(secstrings + idx, ".init.data")) { + get_mcount_loc(&_start_mcount_loc, &_stop_mcount_loc); + mstruct.ehdr = ehdr; + mstruct.init_data_sec = s; + mstruct.start_mcount_loc = _start_mcount_loc; + mstruct.stop_mcount_loc = _stop_mcount_loc; + } +#endif + +#if defined(SORTTABLE_64) && defined(UNWINDER_ORC_ENABLED) + /* locate the ORC unwind tables */ + if (!strcmp(secstrings + idx, ".orc_unwind_ip")) { + orc_ip_size = s->sh_size; + g_orc_ip_table = (int *)((void *)ehdr + + s->sh_offset); + } + if (!strcmp(secstrings + idx, ".orc_unwind")) { + orc_size = s->sh_size; + g_orc_table = (struct orc_entry *)((void *)ehdr + + s->sh_offset); + } +#endif + } /* for loop */ + +#if defined(SORTTABLE_64) && defined(UNWINDER_ORC_ENABLED) + if (!g_orc_ip_table || !g_orc_table) { + fprintf(stderr, + "incomplete ORC unwind tables in file: %s\n", fname); + goto out; + } + + orc_num_entries = orc_ip_size / sizeof(int); + if (orc_ip_size % sizeof(int) != 0 || + orc_size % sizeof(struct orc_entry) != 0 || + orc_num_entries != orc_size / sizeof(struct orc_entry)) { + fprintf(stderr, + "inconsistent ORC unwind table entries in file: %s\n", + fname); + goto out; + } + + /* create thread to sort ORC unwind tables concurrently */ + if (pthread_create(&orc_sort_thread, NULL, + sort_orctable, &orc_ip_size)) { + fprintf(stderr, + "pthread_create orc_sort_thread failed '%s': %s\n", + strerror(errno), fname); + goto out; + } +#endif + +#ifdef MCOUNT_SORT_ENABLED + if (!mstruct.init_data_sec || !_start_mcount_loc || !_stop_mcount_loc) { + fprintf(stderr, + "incomplete mcount's sort in file: %s\n", + fname); + goto out; + } + + /* create thread to sort mcount_loc concurrently */ + if (pthread_create(&mcount_sort_thread, NULL, &sort_mcount_loc, &mstruct)) { + fprintf(stderr, + "pthread_create mcount_sort_thread failed '%s': %s\n", + strerror(errno), fname); + goto out; + } +#endif + if (!extab_sec) { + fprintf(stderr, "no __ex_table in file: %s\n", fname); + goto out; + } + + if (!symtab_sec) { + fprintf(stderr, "no .symtab in file: %s\n", fname); + goto out; + } + + if (!strtab_sec) { + fprintf(stderr, "no .strtab in file: %s\n", fname); + goto out; + } + + extab_image = (void *)ehdr + _r(&extab_sec->sh_offset); + strtab = (const char *)ehdr + _r(&strtab_sec->sh_offset); + symtab = (const Elf_Sym *)((const char *)ehdr + + _r(&symtab_sec->sh_offset)); + + if (custom_sort) { + custom_sort(extab_image, _r(&extab_sec->sh_size)); + } else { + int num_entries = _r(&extab_sec->sh_size) / extable_ent_size; + qsort(extab_image, num_entries, + extable_ent_size, compare_extable); + } + + /* If there were relocations, we no longer need them. */ + if (relocs) + memset(relocs, 0, relocs_size); + + /* find the flag main_extable_sort_needed */ + for (sym = (void *)ehdr + _r(&symtab_sec->sh_offset); + sym < sym + _r(&symtab_sec->sh_size) / sizeof(Elf_Sym); + sym++) { + if (ELF_ST_TYPE(sym->st_info) != STT_OBJECT) + continue; + if (!strcmp(strtab + r(&sym->st_name), + "main_extable_sort_needed")) { + sort_needed_sym = sym; + break; + } + } + + if (!sort_needed_sym) { + fprintf(stderr, + "no main_extable_sort_needed symbol in file: %s\n", + fname); + goto out; + } + + sort_needed_sec = &shdr[get_secindex(r2(&sym->st_shndx), + sort_needed_sym - symtab, + symtab_shndx)]; + sort_needed_loc = (void *)ehdr + + _r(&sort_needed_sec->sh_offset) + + _r(&sort_needed_sym->st_value) - + _r(&sort_needed_sec->sh_addr); + + /* extable has been sorted, clear the flag */ + w(0, sort_needed_loc); + rc = 0; + +out: +#if defined(SORTTABLE_64) && defined(UNWINDER_ORC_ENABLED) + if (orc_sort_thread) { + void *retval = NULL; + /* wait for ORC tables sort done */ + rc = pthread_join(orc_sort_thread, &retval); + if (rc) + fprintf(stderr, + "pthread_join failed '%s': %s\n", + strerror(errno), fname); + else if (retval) { + rc = -1; + fprintf(stderr, + "failed to sort ORC tables '%s': %s\n", + (char *)retval, fname); + } + } +#endif + +#ifdef MCOUNT_SORT_ENABLED + if (mcount_sort_thread) { + void *retval = NULL; + /* wait for mcount sort done */ + rc = pthread_join(mcount_sort_thread, &retval); + if (rc) { + fprintf(stderr, + "pthread_join failed '%s': %s\n", + strerror(errno), fname); + } else if (retval) { + rc = -1; + fprintf(stderr, + "failed to sort mcount '%s': %s\n", + (char *)retval, fname); + } + } +#endif + return rc; +} diff --git a/src/net/scripts/spdxcheck-test.sh b/src/net/scripts/spdxcheck-test.sh new file mode 100644 index 0000000..cfea6a0 --- /dev/null +++ b/src/net/scripts/spdxcheck-test.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +for PYTHON in python2 python3; do + # run check on a text and a binary file + for FILE in Makefile Documentation/logo.gif; do + $PYTHON scripts/spdxcheck.py $FILE + $PYTHON scripts/spdxcheck.py - < $FILE + done + + # run check on complete tree to catch any other issues + $PYTHON scripts/spdxcheck.py > /dev/null +done diff --git a/src/net/scripts/spdxcheck.py b/src/net/scripts/spdxcheck.py new file mode 100755 index 0000000..2288192 --- /dev/null +++ b/src/net/scripts/spdxcheck.py @@ -0,0 +1,296 @@ +#!/usr/bin/env python +# SPDX-License-Identifier: GPL-2.0 +# Copyright Thomas Gleixner <tglx@linutronix.de> + +from argparse import ArgumentParser +from ply import lex, yacc +import locale +import traceback +import sys +import git +import re +import os + +class ParserException(Exception): + def __init__(self, tok, txt): + self.tok = tok + self.txt = txt + +class SPDXException(Exception): + def __init__(self, el, txt): + self.el = el + self.txt = txt + +class SPDXdata(object): + def __init__(self): + self.license_files = 0 + self.exception_files = 0 + self.licenses = [ ] + self.exceptions = { } + +# Read the spdx data from the LICENSES directory +def read_spdxdata(repo): + + # The subdirectories of LICENSES in the kernel source + # Note: exceptions needs to be parsed as last directory. + license_dirs = [ "preferred", "dual", "deprecated", "exceptions" ] + lictree = repo.head.commit.tree['LICENSES'] + + spdx = SPDXdata() + + for d in license_dirs: + for el in lictree[d].traverse(): + if not os.path.isfile(el.path): + continue + + exception = None + for l in open(el.path).readlines(): + if l.startswith('Valid-License-Identifier:'): + lid = l.split(':')[1].strip().upper() + if lid in spdx.licenses: + raise SPDXException(el, 'Duplicate License Identifier: %s' %lid) + else: + spdx.licenses.append(lid) + + elif l.startswith('SPDX-Exception-Identifier:'): + exception = l.split(':')[1].strip().upper() + spdx.exceptions[exception] = [] + + elif l.startswith('SPDX-Licenses:'): + for lic in l.split(':')[1].upper().strip().replace(' ', '').replace('\t', '').split(','): + if not lic in spdx.licenses: + raise SPDXException(None, 'Exception %s missing license %s' %(exception, lic)) + spdx.exceptions[exception].append(lic) + + elif l.startswith("License-Text:"): + if exception: + if not len(spdx.exceptions[exception]): + raise SPDXException(el, 'Exception %s is missing SPDX-Licenses' %exception) + spdx.exception_files += 1 + else: + spdx.license_files += 1 + break + return spdx + +class id_parser(object): + + reserved = [ 'AND', 'OR', 'WITH' ] + tokens = [ 'LPAR', 'RPAR', 'ID', 'EXC' ] + reserved + + precedence = ( ('nonassoc', 'AND', 'OR'), ) + + t_ignore = ' \t' + + def __init__(self, spdx): + self.spdx = spdx + self.lasttok = None + self.lastid = None + self.lexer = lex.lex(module = self, reflags = re.UNICODE) + # Initialize the parser. No debug file and no parser rules stored on disk + # The rules are small enough to be generated on the fly + self.parser = yacc.yacc(module = self, write_tables = False, debug = False) + self.lines_checked = 0 + self.checked = 0 + self.spdx_valid = 0 + self.spdx_errors = 0 + self.curline = 0 + self.deepest = 0 + + # Validate License and Exception IDs + def validate(self, tok): + id = tok.value.upper() + if tok.type == 'ID': + if not id in self.spdx.licenses: + raise ParserException(tok, 'Invalid License ID') + self.lastid = id + elif tok.type == 'EXC': + if id not in self.spdx.exceptions: + raise ParserException(tok, 'Invalid Exception ID') + if self.lastid not in self.spdx.exceptions[id]: + raise ParserException(tok, 'Exception not valid for license %s' %self.lastid) + self.lastid = None + elif tok.type != 'WITH': + self.lastid = None + + # Lexer functions + def t_RPAR(self, tok): + r'\)' + self.lasttok = tok.type + return tok + + def t_LPAR(self, tok): + r'\(' + self.lasttok = tok.type + return tok + + def t_ID(self, tok): + r'[A-Za-z.0-9\-+]+' + + if self.lasttok == 'EXC': + print(tok) + raise ParserException(tok, 'Missing parentheses') + + tok.value = tok.value.strip() + val = tok.value.upper() + + if val in self.reserved: + tok.type = val + elif self.lasttok == 'WITH': + tok.type = 'EXC' + + self.lasttok = tok.type + self.validate(tok) + return tok + + def t_error(self, tok): + raise ParserException(tok, 'Invalid token') + + def p_expr(self, p): + '''expr : ID + | ID WITH EXC + | expr AND expr + | expr OR expr + | LPAR expr RPAR''' + pass + + def p_error(self, p): + if not p: + raise ParserException(None, 'Unfinished license expression') + else: + raise ParserException(p, 'Syntax error') + + def parse(self, expr): + self.lasttok = None + self.lastid = None + self.parser.parse(expr, lexer = self.lexer) + + def parse_lines(self, fd, maxlines, fname): + self.checked += 1 + self.curline = 0 + try: + for line in fd: + line = line.decode(locale.getpreferredencoding(False), errors='ignore') + self.curline += 1 + if self.curline > maxlines: + break + self.lines_checked += 1 + if line.find("SPDX-License-Identifier:") < 0: + continue + expr = line.split(':')[1].strip() + # Remove trailing comment closure + if line.strip().endswith('*/'): + expr = expr.rstrip('*/').strip() + # Remove trailing xml comment closure + if line.strip().endswith('-->'): + expr = expr.rstrip('-->').strip() + # Special case for SH magic boot code files + if line.startswith('LIST \"'): + expr = expr.rstrip('\"').strip() + self.parse(expr) + self.spdx_valid += 1 + # + # Should we check for more SPDX ids in the same file and + # complain if there are any? + # + break + + except ParserException as pe: + if pe.tok: + col = line.find(expr) + pe.tok.lexpos + tok = pe.tok.value + sys.stdout.write('%s: %d:%d %s: %s\n' %(fname, self.curline, col, pe.txt, tok)) + else: + sys.stdout.write('%s: %d:0 %s\n' %(fname, self.curline, pe.txt)) + self.spdx_errors += 1 + +def scan_git_tree(tree): + for el in tree.traverse(): + # Exclude stuff which would make pointless noise + # FIXME: Put this somewhere more sensible + if el.path.startswith("LICENSES"): + continue + if el.path.find("license-rules.rst") >= 0: + continue + if not os.path.isfile(el.path): + continue + with open(el.path, 'rb') as fd: + parser.parse_lines(fd, args.maxlines, el.path) + +def scan_git_subtree(tree, path): + for p in path.strip('/').split('/'): + tree = tree[p] + scan_git_tree(tree) + +if __name__ == '__main__': + + ap = ArgumentParser(description='SPDX expression checker') + ap.add_argument('path', nargs='*', help='Check path or file. If not given full git tree scan. For stdin use "-"') + ap.add_argument('-m', '--maxlines', type=int, default=15, + help='Maximum number of lines to scan in a file. Default 15') + ap.add_argument('-v', '--verbose', action='store_true', help='Verbose statistics output') + args = ap.parse_args() + + # Sanity check path arguments + if '-' in args.path and len(args.path) > 1: + sys.stderr.write('stdin input "-" must be the only path argument\n') + sys.exit(1) + + try: + # Use git to get the valid license expressions + repo = git.Repo(os.getcwd()) + assert not repo.bare + + # Initialize SPDX data + spdx = read_spdxdata(repo) + + # Initilize the parser + parser = id_parser(spdx) + + except SPDXException as se: + if se.el: + sys.stderr.write('%s: %s\n' %(se.el.path, se.txt)) + else: + sys.stderr.write('%s\n' %se.txt) + sys.exit(1) + + except Exception as ex: + sys.stderr.write('FAIL: %s\n' %ex) + sys.stderr.write('%s\n' %traceback.format_exc()) + sys.exit(1) + + try: + if len(args.path) and args.path[0] == '-': + stdin = os.fdopen(sys.stdin.fileno(), 'rb') + parser.parse_lines(stdin, args.maxlines, '-') + else: + if args.path: + for p in args.path: + if os.path.isfile(p): + parser.parse_lines(open(p, 'rb'), args.maxlines, p) + elif os.path.isdir(p): + scan_git_subtree(repo.head.reference.commit.tree, p) + else: + sys.stderr.write('path %s does not exist\n' %p) + sys.exit(1) + else: + # Full git tree scan + scan_git_tree(repo.head.commit.tree) + + if args.verbose: + sys.stderr.write('\n') + sys.stderr.write('License files: %12d\n' %spdx.license_files) + sys.stderr.write('Exception files: %12d\n' %spdx.exception_files) + sys.stderr.write('License IDs %12d\n' %len(spdx.licenses)) + sys.stderr.write('Exception IDs %12d\n' %len(spdx.exceptions)) + sys.stderr.write('\n') + sys.stderr.write('Files checked: %12d\n' %parser.checked) + sys.stderr.write('Lines checked: %12d\n' %parser.lines_checked) + sys.stderr.write('Files with SPDX: %12d\n' %parser.spdx_valid) + sys.stderr.write('Files with errors: %12d\n' %parser.spdx_errors) + + sys.exit(0) + + except Exception as ex: + sys.stderr.write('FAIL: %s\n' %ex) + sys.stderr.write('%s\n' %traceback.format_exc()) + sys.exit(1) diff --git a/src/net/scripts/spelling.txt b/src/net/scripts/spelling.txt new file mode 100644 index 0000000..953f4a2 --- /dev/null +++ b/src/net/scripts/spelling.txt @@ -0,0 +1,1536 @@ +# Originally from Debian's Lintian tool. Various false positives have been +# removed, and various additions have been made as they've been discovered +# in the kernel source. +# +# License: GPLv2 +# +# The format of each line is: +# mistake||correction +# +abandonning||abandoning +abigious||ambiguous +abitrary||arbitrary +abitrate||arbitrate +abnornally||abnormally +abnrormal||abnormal +abord||abort +aboslute||absolute +abov||above +abreviated||abbreviated +absense||absence +absolut||absolute +absoulte||absolute +acccess||access +acceess||access +acceleratoin||acceleration +accelleration||acceleration +accesing||accessing +accesnt||accent +accessable||accessible +accesss||access +accidentaly||accidentally +accidentually||accidentally +acclerated||accelerated +accoding||according +accomodate||accommodate +accomodates||accommodates +accordign||according +accoring||according +accout||account +accquire||acquire +accquired||acquired +accross||across +accumalate||accumulate +accumalator||accumulator +acessable||accessible +acess||access +acessing||accessing +achitecture||architecture +acient||ancient +acitions||actions +acitve||active +acknowldegement||acknowledgment +acknowledgement||acknowledgment +ackowledge||acknowledge +ackowledged||acknowledged +acording||according +activete||activate +actived||activated +actualy||actually +acumulating||accumulating +acumulative||accumulative +acumulator||accumulator +acutally||actually +adapater||adapter +addional||additional +additionaly||additionally +additonal||additional +addres||address +adddress||address +addreses||addresses +addresss||address +addrress||address +aditional||additional +aditionally||additionally +aditionaly||additionally +adminstrative||administrative +adress||address +adresses||addresses +adrresses||addresses +advertisment||advertisement +adviced||advised +afecting||affecting +againt||against +agaist||against +aggreataon||aggregation +aggreation||aggregation +albumns||albums +alegorical||allegorical +algined||aligned +algorith||algorithm +algorithmical||algorithmically +algoritm||algorithm +algoritms||algorithms +algorithmn||algorithm +algorrithm||algorithm +algorritm||algorithm +aligment||alignment +alignement||alignment +allign||align +alligned||aligned +alllocate||allocate +alloated||allocated +allocatote||allocate +allocatrd||allocated +allocte||allocate +allpication||application +alocate||allocate +alogirhtms||algorithms +alogrithm||algorithm +alot||a lot +alow||allow +alows||allows +alreay||already +alredy||already +altough||although +alue||value +ambigious||ambiguous +ambigous||ambiguous +amoung||among +amout||amount +amplifer||amplifier +amplifyer||amplifier +an union||a union +an user||a user +an userspace||a userspace +an one||a one +analysator||analyzer +ang||and +anniversery||anniversary +annoucement||announcement +anomolies||anomalies +anomoly||anomaly +anway||anyway +aplication||application +appearence||appearance +applicaion||application +appliction||application +applictions||applications +applys||applies +appplications||applications +appropiate||appropriate +appropriatly||appropriately +approriate||appropriate +approriately||appropriately +apropriate||appropriate +aquainted||acquainted +aquired||acquired +aquisition||acquisition +arbitary||arbitrary +architechture||architecture +arguement||argument +arguements||arguments +arithmatic||arithmetic +aritmetic||arithmetic +arne't||aren't +arraival||arrival +artifical||artificial +artillary||artillery +asign||assign +asser||assert +assertation||assertion +assertting||asserting +assiged||assigned +assigment||assignment +assigments||assignments +assistent||assistant +assocation||association +associcated||associated +assotiated||associated +asssert||assert +assum||assume +assumtpion||assumption +asuming||assuming +asycronous||asynchronous +asynchnous||asynchronous +asynchromous||asynchronous +asymetric||asymmetric +asymmeric||asymmetric +atomatically||automatically +atomicly||atomically +atempt||attempt +attachement||attachment +attatch||attach +attched||attached +attemp||attempt +attemps||attempts +attemping||attempting +attepmpt||attempt +attnetion||attention +attruibutes||attributes +authentification||authentication +authenicated||authenticated +automaticaly||automatically +automaticly||automatically +automatize||automate +automatized||automated +automatizes||automates +autonymous||autonomous +auxillary||auxiliary +auxilliary||auxiliary +avaiable||available +avaible||available +availabe||available +availabled||available +availablity||availability +availaible||available +availale||available +availavility||availability +availble||available +availiable||available +availible||available +avalable||available +avaliable||available +aysnc||async +backgroud||background +backword||backward +backwords||backwards +bahavior||behavior +bakup||backup +baloon||balloon +baloons||balloons +bandwith||bandwidth +banlance||balance +batery||battery +beacuse||because +becasue||because +becomming||becoming +becuase||because +beeing||being +befor||before +begining||beginning +beter||better +betweeen||between +bianries||binaries +bitmast||bitmask +boardcast||broadcast +borad||board +boundry||boundary +brievely||briefly +brigde||bridge +broadcase||broadcast +broadcat||broadcast +bufer||buffer +bufufer||buffer +cacluated||calculated +caculate||calculate +caculation||calculation +cadidate||candidate +cahces||caches +calender||calendar +calescing||coalescing +calle||called +callibration||calibration +callled||called +callser||caller +calucate||calculate +calulate||calculate +cancelation||cancellation +cancle||cancel +capabilites||capabilities +capabilties||capabilities +capabilty||capability +capabitilies||capabilities +capablity||capability +capatibilities||capabilities +capapbilities||capabilities +caputure||capture +carefuly||carefully +cariage||carriage +catagory||category +cehck||check +challange||challenge +challanges||challenges +chache||cache +chanell||channel +changable||changeable +chanined||chained +channle||channel +channnel||channel +charachter||character +charachters||characters +charactor||character +charater||character +charaters||characters +charcter||character +chcek||check +chck||check +checksumed||checksummed +checksuming||checksumming +childern||children +childs||children +chiled||child +chked||checked +chnage||change +chnages||changes +chnnel||channel +choosen||chosen +chouse||chose +circumvernt||circumvent +claread||cleared +clared||cleared +closeing||closing +clustred||clustered +cnfiguration||configuration +coexistance||coexistence +colescing||coalescing +collapsable||collapsible +colorfull||colorful +comand||command +comit||commit +commerical||commercial +comming||coming +comminucation||communication +commited||committed +commiting||committing +committ||commit +commoditiy||commodity +comsume||consume +comsumer||consumer +comsuming||consuming +compability||compatibility +compaibility||compatibility +comparsion||comparison +compatability||compatibility +compatable||compatible +compatibililty||compatibility +compatibiliy||compatibility +compatibilty||compatibility +compatiblity||compatibility +competion||completion +compilant||compliant +compleatly||completely +completition||completion +completly||completely +complient||compliant +componnents||components +compoment||component +comppatible||compatible +compres||compress +compresion||compression +comression||compression +comunication||communication +conbination||combination +conditionaly||conditionally +conditon||condition +condtion||condition +conected||connected +conector||connector +configration||configuration +configuartion||configuration +configuation||configuration +configued||configured +configuratoin||configuration +configuraton||configuration +configuretion||configuration +configutation||configuration +conider||consider +conjuction||conjunction +connecetd||connected +connectinos||connections +connetor||connector +connnection||connection +connnections||connections +consistancy||consistency +consistant||consistent +containes||contains +containts||contains +contaisn||contains +contant||contact +contence||contents +contiguos||contiguous +continious||continuous +continous||continuous +continously||continuously +continueing||continuing +contraints||constraints +contruct||construct +contol||control +contoller||controller +controled||controlled +controler||controller +controll||control +contruction||construction +contry||country +conuntry||country +convertion||conversion +convertor||converter +convienient||convenient +convinient||convenient +corected||corrected +correponding||corresponding +correponds||corresponds +correspoding||corresponding +cotrol||control +cound||could +couter||counter +coutner||counter +cryptocraphic||cryptographic +cunter||counter +curently||currently +cylic||cyclic +dafault||default +deafult||default +deamon||daemon +debouce||debounce +decendant||descendant +decendants||descendants +decompres||decompress +decsribed||described +decription||description +dectected||detected +defailt||default +deferal||deferral +deffered||deferred +defferred||deferred +definate||definite +definately||definitely +defintion||definition +defintions||definitions +defualt||default +defult||default +deintializing||deinitializing +deintialize||deinitialize +deintialized||deinitialized +deivce||device +delared||declared +delare||declare +delares||declares +delaring||declaring +delemiter||delimiter +delievered||delivered +demodualtor||demodulator +demension||dimension +dependancies||dependencies +dependancy||dependency +dependant||dependent +dependend||dependent +depreacted||deprecated +depreacte||deprecate +desactivate||deactivate +desciptor||descriptor +desciptors||descriptors +descripto||descriptor +descripton||description +descrition||description +descritptor||descriptor +desctiptor||descriptor +desriptor||descriptor +desriptors||descriptors +desination||destination +destionation||destination +destoried||destroyed +destory||destroy +destoryed||destroyed +destorys||destroys +destroied||destroyed +detabase||database +deteced||detected +detectt||detect +develope||develop +developement||development +developped||developed +developpement||development +developper||developer +developpment||development +deveolpment||development +devided||divided +deviece||device +diable||disable +dicline||decline +dictionnary||dictionary +didnt||didn't +diferent||different +differrence||difference +diffrent||different +differenciate||differentiate +diffrentiate||differentiate +difinition||definition +digial||digital +dimention||dimension +dimesions||dimensions +disgest||digest +dispalying||displaying +diplay||display +directon||direction +direcly||directly +direectly||directly +diregard||disregard +disassocation||disassociation +disapear||disappear +disapeared||disappeared +disappared||disappeared +disbale||disable +disbaled||disabled +disble||disable +disbled||disabled +disconnet||disconnect +discontinous||discontinuous +disharge||discharge +disnabled||disabled +dispertion||dispersion +dissapears||disappears +dissconect||disconnect +distiction||distinction +divisable||divisible +divsiors||divisors +docuentation||documentation +documantation||documentation +documentaion||documentation +documment||document +doesnt||doesn't +donwload||download +donwloading||downloading +dorp||drop +dosen||doesn +downlad||download +downlads||downloads +droped||dropped +droput||dropout +druing||during +dynmaic||dynamic +eanable||enable +eanble||enable +easilly||easily +ecspecially||especially +edditable||editable +editting||editing +efective||effective +effectivness||effectiveness +efficently||efficiently +ehther||ether +eigth||eight +elementry||elementary +eletronic||electronic +embeded||embedded +enabledi||enabled +enbale||enable +enble||enable +enchanced||enhanced +encorporating||incorporating +encrupted||encrypted +encrypiton||encryption +encryptio||encryption +endianess||endianness +enhaced||enhanced +enlightnment||enlightenment +enqueing||enqueuing +entires||entries +entites||entities +entrys||entries +enocded||encoded +enought||enough +enterily||entirely +enviroiment||environment +enviroment||environment +environement||environment +environent||environment +eqivalent||equivalent +equiped||equipped +equivelant||equivalent +equivilant||equivalent +eror||error +errorr||error +errror||error +estbalishment||establishment +etsablishment||establishment +etsbalishment||establishment +evalution||evaluation +excecutable||executable +exceded||exceeded +exceds||exceeds +exceeed||exceed +excellant||excellent +execeeded||exceeded +execeeds||exceeds +exeed||exceed +exeuction||execution +existance||existence +existant||existent +exixt||exist +exlcude||exclude +exlcusive||exclusive +exmaple||example +expecially||especially +experies||expires +explicite||explicit +explicitely||explicitly +explict||explicit +explictely||explicitly +explictly||explicitly +expresion||expression +exprimental||experimental +extened||extended +exteneded||extended +extensability||extensibility +extention||extension +extenstion||extension +extracter||extractor +faied||failed +faield||failed +faild||failed +failded||failed +failer||failure +faill||fail +failied||failed +faillure||failure +failue||failure +failuer||failure +failng||failing +faireness||fairness +falied||failed +faliure||failure +fallbck||fallback +familar||familiar +fatser||faster +feauture||feature +feautures||features +fetaure||feature +fetaures||features +fileystem||filesystem +fimrware||firmware +fimware||firmware +firmare||firmware +firmaware||firmware +firware||firmware +firwmare||firmware +finanize||finalize +findn||find +finilizes||finalizes +finsih||finish +flusing||flushing +folloing||following +followign||following +followings||following +follwing||following +fonud||found +forseeable||foreseeable +forse||force +fortan||fortran +forwardig||forwarding +frambuffer||framebuffer +framming||framing +framwork||framework +frequncy||frequency +frequancy||frequency +frome||from +fucntion||function +fuction||function +fuctions||functions +fullill||fulfill +funcation||function +funcion||function +functionallity||functionality +functionaly||functionally +functionnality||functionality +functonality||functionality +funtion||function +funtions||functions +furthur||further +futhermore||furthermore +futrue||future +gatable||gateable +gateing||gating +gauage||gauge +gaurenteed||guaranteed +generiously||generously +genereate||generate +genereted||generated +genric||generic +globel||global +grabing||grabbing +grahical||graphical +grahpical||graphical +granularty||granularity +grapic||graphic +grranted||granted +guage||gauge +guarenteed||guaranteed +guarentee||guarantee +halfs||halves +hander||handler +handfull||handful +hanlde||handle +hanled||handled +happend||happened +harware||hardware +havind||having +heirarchically||hierarchically +helpfull||helpful +hexdecimal||hexadecimal +hybernate||hibernate +hierachy||hierarchy +hierarchie||hierarchy +homogenous||homogeneous +howver||however +hsould||should +hypervior||hypervisor +hypter||hyper +identidier||identifier +iligal||illegal +illigal||illegal +illgal||illegal +iomaped||iomapped +imblance||imbalance +immeadiately||immediately +immedaite||immediate +immedate||immediate +immediatelly||immediately +immediatly||immediately +immidiate||immediate +immutible||immutable +impelentation||implementation +impementated||implemented +implemantation||implementation +implemenation||implementation +implementaiton||implementation +implementated||implemented +implemention||implementation +implementd||implemented +implemetation||implementation +implemntation||implementation +implentation||implementation +implmentation||implementation +implmenting||implementing +incative||inactive +incomming||incoming +incompatabilities||incompatibilities +incompatable||incompatible +incompatble||incompatible +inconsistant||inconsistent +increas||increase +incremeted||incremented +incrment||increment +inculde||include +indendation||indentation +indended||intended +independant||independent +independantly||independently +independed||independent +indiate||indicate +indicat||indicate +inexpect||inexpected +inferface||interface +infomation||information +informatiom||information +informations||information +informtion||information +infromation||information +ingore||ignore +inital||initial +initalized||initialized +initalised||initialized +initalise||initialize +initalize||initialize +initation||initiation +initators||initiators +initialiazation||initialization +initializationg||initialization +initializiation||initialization +initialze||initialize +initialzed||initialized +initialzing||initializing +initilization||initialization +initilize||initialize +initliaze||initialize +initilized||initialized +inofficial||unofficial +inrerface||interface +insititute||institute +instace||instance +instal||install +instanciate||instantiate +instanciated||instantiated +insufficent||insufficient +inteface||interface +integreated||integrated +integrety||integrity +integrey||integrity +intendet||intended +intented||intended +interanl||internal +interchangable||interchangeable +interferring||interfering +interger||integer +intermittant||intermittent +internel||internal +interoprability||interoperability +interuupt||interrupt +interupt||interrupt +interupts||interrupts +interrface||interface +interrrupt||interrupt +interrup||interrupt +interrups||interrupts +interruptted||interrupted +interupted||interrupted +intial||initial +intialisation||initialisation +intialised||initialised +intialise||initialise +intialization||initialization +intialized||initialized +intialize||initialize +intregral||integral +intrerrupt||interrupt +intrrupt||interrupt +intterrupt||interrupt +intuative||intuitive +inavlid||invalid +invaid||invalid +invaild||invalid +invailid||invalid +invald||invalid +invalde||invalid +invalide||invalid +invalidiate||invalidate +invalud||invalid +invididual||individual +invokation||invocation +invokations||invocations +ireelevant||irrelevant +irrelevent||irrelevant +isnt||isn't +isssue||issue +issus||issues +iteraions||iterations +iternations||iterations +itertation||iteration +itslef||itself +jave||java +jeffies||jiffies +jumpimng||jumping +juse||just +jus||just +kown||known +langage||language +langauage||language +langauge||language +langugage||language +lauch||launch +layed||laid +legnth||length +leightweight||lightweight +lengh||length +lenght||length +lenth||length +lesstiff||lesstif +libaries||libraries +libary||library +librairies||libraries +libraris||libraries +licenceing||licencing +limted||limited +logaritmic||logarithmic +loggging||logging +loggin||login +logile||logfile +loobpack||loopback +loosing||losing +losted||lost +maangement||management +machinary||machinery +maibox||mailbox +maintainance||maintenance +maintainence||maintenance +maintan||maintain +makeing||making +mailformed||malformed +malplaced||misplaced +malplace||misplace +managable||manageable +managment||management +mangement||management +manger||manager +manoeuvering||maneuvering +manufaucturing||manufacturing +mappping||mapping +matchs||matches +mathimatical||mathematical +mathimatic||mathematic +mathimatics||mathematics +maximium||maximum +maxium||maximum +mechamism||mechanism +meetign||meeting +memeory||memory +memmber||member +memoery||memory +ment||meant +mergable||mergeable +mesage||message +messags||messages +messgaes||messages +messsage||message +messsages||messages +metdata||metadata +micropone||microphone +microprocesspr||microprocessor +migrateable||migratable +milliseonds||milliseconds +minium||minimum +minimam||minimum +miniumum||minimum +minumum||minimum +misalinged||misaligned +miscelleneous||miscellaneous +misformed||malformed +mispelled||misspelled +mispelt||misspelt +mising||missing +mismactch||mismatch +missign||missing +missmanaged||mismanaged +missmatch||mismatch +misssing||missing +miximum||maximum +mmnemonic||mnemonic +mnay||many +modfiy||modify +modifer||modifier +modulues||modules +momery||memory +memomry||memory +monitring||monitoring +monochorome||monochrome +monochromo||monochrome +monocrome||monochrome +mopdule||module +mroe||more +multipler||multiplier +mulitplied||multiplied +multidimensionnal||multidimensional +multipe||multiple +multple||multiple +mumber||number +muticast||multicast +mutilcast||multicast +mutiple||multiple +mutli||multi +nams||names +navagating||navigating +nead||need +neccecary||necessary +neccesary||necessary +neccessary||necessary +necesary||necessary +neded||needed +negaive||negative +negoitation||negotiation +negotation||negotiation +nerver||never +nescessary||necessary +nessessary||necessary +noticable||noticeable +notication||notification +notications||notifications +notifcations||notifications +notifed||notified +notity||notify +numebr||number +numner||number +obtaion||obtain +obusing||abusing +occassionally||occasionally +occationally||occasionally +occurance||occurrence +occurances||occurrences +occurd||occurred +occured||occurred +occurence||occurrence +occure||occurred +occuring||occurring +offser||offset +offet||offset +offlaod||offload +offloded||offloaded +offseting||offsetting +omited||omitted +omiting||omitting +omitt||omit +ommiting||omitting +ommitted||omitted +onself||oneself +ony||only +operatione||operation +opertaions||operations +optionnal||optional +optmizations||optimizations +orientatied||orientated +orientied||oriented +orignal||original +originial||original +otherise||otherwise +ouput||output +oustanding||outstanding +overaall||overall +overhread||overhead +overlaping||overlapping +overide||override +overrided||overridden +overriden||overridden +overun||overrun +overwritting||overwriting +overwriten||overwritten +pacakge||package +pachage||package +packacge||package +packege||package +packge||package +packtes||packets +pakage||package +paket||packet +pallette||palette +paln||plan +paramameters||parameters +paramaters||parameters +paramater||parameter +parametes||parameters +parametised||parametrised +paramter||parameter +paramters||parameters +parmaters||parameters +particuarly||particularly +particularily||particularly +partion||partition +partions||partitions +partiton||partition +pased||passed +passin||passing +pathes||paths +pattrns||patterns +pecularities||peculiarities +peformance||performance +peforming||performing +peice||piece +pendantic||pedantic +peprocessor||preprocessor +perfoming||performing +perfomring||performing +periperal||peripheral +peripherial||peripheral +permissons||permissions +peroid||period +persistance||persistence +persistant||persistent +phoneticly||phonetically +plalform||platform +platfoem||platform +platfrom||platform +plattform||platform +pleaes||please +ploting||plotting +plugable||pluggable +poinnter||pointer +pointeur||pointer +poiter||pointer +posible||possible +positon||position +possibilites||possibilities +potocol||protocol +powerfull||powerful +pramater||parameter +preamle||preamble +preample||preamble +preapre||prepare +preceeded||preceded +preceeding||preceding +preceed||precede +precendence||precedence +precission||precision +preemptable||preemptible +prefered||preferred +prefferably||preferably +prefitler||prefilter +premption||preemption +prepaired||prepared +preperation||preparation +preprare||prepare +pressre||pressure +primative||primitive +princliple||principle +priorty||priority +privilaged||privileged +privilage||privilege +priviledge||privilege +priviledges||privileges +probaly||probably +procceed||proceed +proccesors||processors +procesed||processed +proces||process +procesing||processing +processessing||processing +processess||processes +processpr||processor +processsed||processed +processsing||processing +procteted||protected +prodecure||procedure +progamming||programming +progams||programs +progess||progress +programers||programmers +programm||program +programms||programs +progresss||progress +prohibitted||prohibited +prohibitting||prohibiting +promiscous||promiscuous +promps||prompts +pronnounced||pronounced +prononciation||pronunciation +pronouce||pronounce +pronunce||pronounce +propery||property +propigate||propagate +propigation||propagation +propogation||propagation +propogate||propagate +prosess||process +protable||portable +protcol||protocol +protecion||protection +protedcted||protected +protocoll||protocol +promixity||proximity +psudo||pseudo +psuedo||pseudo +psychadelic||psychedelic +pwoer||power +queing||queuing +quering||querying +queus||queues +randomally||randomly +raoming||roaming +reasearcher||researcher +reasearchers||researchers +reasearch||research +receieve||receive +recepient||recipient +recevied||received +receving||receiving +recieved||received +recieve||receive +reciever||receiver +recieves||receives +recogniced||recognised +recognizeable||recognizable +recommanded||recommended +recyle||recycle +redircet||redirect +redirectrion||redirection +redundacy||redundancy +reename||rename +refcounf||refcount +refence||reference +refered||referred +referenace||reference +refering||referring +refernces||references +refernnce||reference +refrence||reference +registed||registered +registerd||registered +registeration||registration +registeresd||registered +registerred||registered +registes||registers +registraration||registration +regsiter||register +regster||register +regualar||regular +reguator||regulator +regulamentations||regulations +reigstration||registration +releated||related +relevent||relevant +reloade||reload +remoote||remote +remore||remote +removeable||removable +repectively||respectively +replacable||replaceable +replacments||replacements +replys||replies +reponse||response +representaion||representation +reqeust||request +reqister||register +requestied||requested +requiere||require +requirment||requirement +requred||required +requried||required +requst||request +requsted||requested +reregisteration||reregistration +reseting||resetting +reseved||reserved +reseverd||reserved +resizeable||resizable +resouce||resource +resouces||resources +resoures||resources +responce||response +resrouce||resource +ressizes||resizes +ressource||resource +ressources||resources +restesting||retesting +resumbmitting||resubmitting +retransmited||retransmitted +retreived||retrieved +retreive||retrieve +retreiving||retrieving +retrive||retrieve +retrived||retrieved +retrun||return +retun||return +retuned||returned +reudce||reduce +reuest||request +reuqest||request +reutnred||returned +revsion||revision +rmeoved||removed +rmeove||remove +rmeoves||removes +rountine||routine +routins||routines +rquest||request +runing||running +runned||ran +runnning||running +runtine||runtime +sacrifying||sacrificing +safly||safely +safty||safety +savable||saveable +scaleing||scaling +scaned||scanned +scaning||scanning +scarch||search +schdule||schedule +seach||search +searchs||searches +secquence||sequence +secund||second +segement||segment +semaphone||semaphore +senario||scenario +senarios||scenarios +sentivite||sensitive +separatly||separately +sepcify||specify +seperated||separated +seperately||separately +seperate||separate +seperatly||separately +seperator||separator +sepperate||separate +seqeunce||sequence +seqeuncer||sequencer +seqeuencer||sequencer +sequece||sequence +sequencial||sequential +serivce||service +serveral||several +servive||service +setts||sets +settting||setting +shapshot||snapshot +shotdown||shutdown +shoud||should +shouldnt||shouldn't +shoule||should +shrinked||shrunk +siginificantly||significantly +signabl||signal +significanly||significantly +similary||similarly +similiar||similar +simlar||similar +simliar||similar +simpified||simplified +singaled||signaled +singal||signal +singed||signed +sleeped||slept +sliped||slipped +softwares||software +speach||speech +specfic||specific +specfield||specified +speciefied||specified +specifc||specific +specifed||specified +specificatin||specification +specificaton||specification +specifing||specifying +specifiying||specifying +speficied||specified +speicify||specify +speling||spelling +spinlcok||spinlock +spinock||spinlock +splitted||split +spreaded||spread +spurrious||spurious +sructure||structure +stablilization||stabilization +staically||statically +staion||station +standardss||standards +standartization||standardization +standart||standard +standy||standby +stardard||standard +staticly||statically +statuss||status +stoped||stopped +stoping||stopping +stoppped||stopped +straming||streaming +struc||struct +structres||structures +stuct||struct +strucuture||structure +stucture||structure +sturcture||structure +subdirectoires||subdirectories +suble||subtle +substract||subtract +submited||submitted +submition||submission +suceed||succeed +succesfully||successfully +succesful||successful +successed||succeeded +successfull||successful +successfuly||successfully +sucessfully||successfully +sucessful||successful +sucess||success +superflous||superfluous +superseeded||superseded +suplied||supplied +suported||supported +suport||support +supportet||supported +suppored||supported +supportin||supporting +suppoted||supported +suppported||supported +suppport||support +supress||suppress +surpressed||suppressed +surpresses||suppresses +susbsystem||subsystem +suspeneded||suspended +suspsend||suspend +suspicously||suspiciously +swaping||swapping +switchs||switches +swith||switch +swithable||switchable +swithc||switch +swithced||switched +swithcing||switching +swithed||switched +swithing||switching +swtich||switch +syfs||sysfs +symetric||symmetric +synax||syntax +synchonized||synchronized +synchronuously||synchronously +syncronize||synchronize +syncronized||synchronized +syncronizing||synchronizing +syncronus||synchronous +syste||system +sytem||system +sythesis||synthesis +taht||that +tansmit||transmit +targetted||targeted +targetting||targeting +taskelt||tasklet +teh||the +temorary||temporary +temproarily||temporarily +temperture||temperature +thead||thread +therfore||therefore +thier||their +threds||threads +threee||three +threshhold||threshold +thresold||threshold +throught||through +trackling||tracking +troughput||throughput +thses||these +tiggers||triggers +tiggered||triggered +tipically||typically +timeing||timing +timout||timeout +tmis||this +toogle||toggle +torerable||tolerable +traking||tracking +tramsmitted||transmitted +tramsmit||transmit +tranasction||transaction +tranfer||transfer +transcevier||transceiver +transciever||transceiver +transferd||transferred +transfered||transferred +transfering||transferring +transision||transition +transmittd||transmitted +transormed||transformed +trasfer||transfer +trasmission||transmission +treshold||threshold +triggerd||triggered +trigerred||triggered +trigerring||triggering +trun||turn +tunning||tuning +ture||true +tyep||type +udpate||update +uesd||used +uknown||unknown +usccess||success +uncommited||uncommitted +uncompatible||incompatible +unconditionaly||unconditionally +undeflow||underflow +underun||underrun +unecessary||unnecessary +unexecpted||unexpected +unexepected||unexpected +unexpcted||unexpected +unexpectd||unexpected +unexpeted||unexpected +unexpexted||unexpected +unfortunatelly||unfortunately +unifiy||unify +uniterrupted||uninterrupted +unintialized||uninitialized +unitialized||uninitialized +unkmown||unknown +unknonw||unknown +unknow||unknown +unkown||unknown +unamed||unnamed +uneeded||unneeded +unneded||unneeded +unneccecary||unnecessary +unneccesary||unnecessary +unneccessary||unnecessary +unnecesary||unnecessary +unneedingly||unnecessarily +unnsupported||unsupported +unmached||unmatched +unregester||unregister +unresgister||unregister +unrgesiter||unregister +unsinged||unsigned +unstabel||unstable +unsolicitied||unsolicited +unsuccessfull||unsuccessful +unsuported||unsupported +untill||until +ununsed||unused +unuseful||useless +unvalid||invalid +upate||update +upsupported||unsupported +usefule||useful +usefull||useful +usege||usage +usera||users +usualy||usually +usupported||unsupported +utilites||utilities +utillities||utilities +utilties||utilities +utiltity||utility +utitity||utility +utitlty||utility +vaid||valid +vaild||valid +valide||valid +variantions||variations +varible||variable +varient||variant +vaule||value +verbse||verbose +veify||verify +verisons||versions +verison||version +verson||version +vicefersa||vice-versa +virtal||virtual +virtaul||virtual +virtiual||virtual +visiters||visitors +vitual||virtual +vunerable||vulnerable +wakeus||wakeups +wathdog||watchdog +wating||waiting +wiat||wait +wether||whether +whataver||whatever +whcih||which +whenver||whenever +wheter||whether +whe||when +wierd||weird +wiil||will +wirte||write +withing||within +wnat||want +workarould||workaround +writeing||writing +writting||writing +wtih||with +zombe||zombie +zomebie||zombie diff --git a/src/net/scripts/sphinx-pre-install b/src/net/scripts/sphinx-pre-install new file mode 100755 index 0000000..8fcea76 --- /dev/null +++ b/src/net/scripts/sphinx-pre-install @@ -0,0 +1,925 @@ +#!/usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0-or-later +use strict; + +# Copyright (c) 2017-2020 Mauro Carvalho Chehab <mchehab@kernel.org> +# + +my $prefix = "./"; +$prefix = "$ENV{'srctree'}/" if ($ENV{'srctree'}); + +my $conf = $prefix . "Documentation/conf.py"; +my $requirement_file = $prefix . "Documentation/sphinx/requirements.txt"; +my $virtenv_prefix = "sphinx_"; + +# +# Static vars +# + +my %missing; +my $system_release; +my $need = 0; +my $optional = 0; +my $need_symlink = 0; +my $need_sphinx = 0; +my $need_venv = 0; +my $need_virtualenv = 0; +my $rec_sphinx_upgrade = 0; +my $install = ""; +my $virtenv_dir = ""; +my $python_cmd = ""; +my $min_version; +my $cur_version; +my $rec_version = "1.7.9"; # PDF won't build here +my $min_pdf_version = "2.4.4"; # Min version where pdf builds + +# +# Command line arguments +# + +my $pdf = 1; +my $virtualenv = 1; +my $version_check = 0; + +# +# List of required texlive packages on Fedora and OpenSuse +# + +my %texlive = ( + 'amsfonts.sty' => 'texlive-amsfonts', + 'amsmath.sty' => 'texlive-amsmath', + 'amssymb.sty' => 'texlive-amsfonts', + 'amsthm.sty' => 'texlive-amscls', + 'anyfontsize.sty' => 'texlive-anyfontsize', + 'atbegshi.sty' => 'texlive-oberdiek', + 'bm.sty' => 'texlive-tools', + 'capt-of.sty' => 'texlive-capt-of', + 'cmap.sty' => 'texlive-cmap', + 'ecrm1000.tfm' => 'texlive-ec', + 'eqparbox.sty' => 'texlive-eqparbox', + 'eu1enc.def' => 'texlive-euenc', + 'fancybox.sty' => 'texlive-fancybox', + 'fancyvrb.sty' => 'texlive-fancyvrb', + 'float.sty' => 'texlive-float', + 'fncychap.sty' => 'texlive-fncychap', + 'footnote.sty' => 'texlive-mdwtools', + 'framed.sty' => 'texlive-framed', + 'luatex85.sty' => 'texlive-luatex85', + 'multirow.sty' => 'texlive-multirow', + 'needspace.sty' => 'texlive-needspace', + 'palatino.sty' => 'texlive-psnfss', + 'parskip.sty' => 'texlive-parskip', + 'polyglossia.sty' => 'texlive-polyglossia', + 'tabulary.sty' => 'texlive-tabulary', + 'threeparttable.sty' => 'texlive-threeparttable', + 'titlesec.sty' => 'texlive-titlesec', + 'ucs.sty' => 'texlive-ucs', + 'upquote.sty' => 'texlive-upquote', + 'wrapfig.sty' => 'texlive-wrapfig', + 'ctexhook.sty' => 'texlive-ctex', +); + +# +# Subroutines that checks if a feature exists +# + +sub check_missing(%) +{ + my %map = %{$_[0]}; + + foreach my $prog (sort keys %missing) { + my $is_optional = $missing{$prog}; + + # At least on some LTS distros like CentOS 7, texlive doesn't + # provide all packages we need. When such distros are + # detected, we have to disable PDF output. + # + # So, we need to ignore the packages that distros would + # need for LaTeX to work + if ($is_optional == 2 && !$pdf) { + $optional--; + next; + } + + if ($is_optional) { + print "Warning: better to also install \"$prog\".\n"; + } else { + print "ERROR: please install \"$prog\", otherwise, build won't work.\n"; + } + if (defined($map{$prog})) { + $install .= " " . $map{$prog}; + } else { + $install .= " " . $prog; + } + } + + $install =~ s/^\s//; +} + +sub add_package($$) +{ + my $package = shift; + my $is_optional = shift; + + $missing{$package} = $is_optional; + if ($is_optional) { + $optional++; + } else { + $need++; + } +} + +sub check_missing_file($$$) +{ + my $files = shift; + my $package = shift; + my $is_optional = shift; + + for (@$files) { + return if(-e $_); + } + + add_package($package, $is_optional); +} + +sub findprog($) +{ + foreach(split(/:/, $ENV{PATH})) { + return "$_/$_[0]" if(-x "$_/$_[0]"); + } +} + +sub find_python_no_venv() +{ + my $prog = shift; + + my $cur_dir = qx(pwd); + $cur_dir =~ s/\s+$//; + + foreach my $dir (split(/:/, $ENV{PATH})) { + next if ($dir =~ m,($cur_dir)/sphinx,); + return "$dir/python3" if(-x "$dir/python3"); + } + foreach my $dir (split(/:/, $ENV{PATH})) { + next if ($dir =~ m,($cur_dir)/sphinx,); + return "$dir/python" if(-x "$dir/python"); + } + return "python"; +} + +sub check_program($$) +{ + my $prog = shift; + my $is_optional = shift; + + return $prog if findprog($prog); + + add_package($prog, $is_optional); +} + +sub check_perl_module($$) +{ + my $prog = shift; + my $is_optional = shift; + + my $err = system("perl -M$prog -e 1 2>/dev/null /dev/null"); + return if ($err == 0); + + add_package($prog, $is_optional); +} + +sub check_python_module($$) +{ + my $prog = shift; + my $is_optional = shift; + + return if (!$python_cmd); + + my $err = system("$python_cmd -c 'import $prog' 2>/dev/null /dev/null"); + return if ($err == 0); + + add_package($prog, $is_optional); +} + +sub check_rpm_missing($$) +{ + my @pkgs = @{$_[0]}; + my $is_optional = $_[1]; + + foreach my $prog(@pkgs) { + my $err = system("rpm -q '$prog' 2>/dev/null >/dev/null"); + add_package($prog, $is_optional) if ($err); + } +} + +sub check_pacman_missing($$) +{ + my @pkgs = @{$_[0]}; + my $is_optional = $_[1]; + + foreach my $prog(@pkgs) { + my $err = system("pacman -Q '$prog' 2>/dev/null >/dev/null"); + add_package($prog, $is_optional) if ($err); + } +} + +sub check_missing_tex($) +{ + my $is_optional = shift; + my $kpsewhich = findprog("kpsewhich"); + + foreach my $prog(keys %texlive) { + my $package = $texlive{$prog}; + if (!$kpsewhich) { + add_package($package, $is_optional); + next; + } + my $file = qx($kpsewhich $prog); + add_package($package, $is_optional) if ($file =~ /^\s*$/); + } +} + +sub get_sphinx_fname() +{ + my $fname = "sphinx-build"; + return $fname if findprog($fname); + + $fname = "sphinx-build-3"; + if (findprog($fname)) { + $need_symlink = 1; + return $fname; + } + + return ""; +} + +sub get_sphinx_version($) +{ + my $cmd = shift; + my $ver; + + open IN, "$cmd --version 2>&1 |"; + while (<IN>) { + if (m/^\s*sphinx-build\s+([\d\.]+)(\+\/[\da-f]+)?$/) { + $ver=$1; + last; + } + # Sphinx 1.2.x uses a different format + if (m/^\s*Sphinx.*\s+([\d\.]+)$/) { + $ver=$1; + last; + } + } + close IN; + return $ver; +} + +sub check_sphinx() +{ + my $default_version; + + open IN, $conf or die "Can't open $conf"; + while (<IN>) { + if (m/^\s*needs_sphinx\s*=\s*[\'\"]([\d\.]+)[\'\"]/) { + $min_version=$1; + last; + } + } + close IN; + + die "Can't get needs_sphinx version from $conf" if (!$min_version); + + open IN, $requirement_file or die "Can't open $requirement_file"; + while (<IN>) { + if (m/^\s*Sphinx\s*==\s*([\d\.]+)$/) { + $default_version=$1; + last; + } + } + close IN; + + die "Can't get default sphinx version from $requirement_file" if (!$default_version); + + $virtenv_dir = $virtenv_prefix . $default_version; + + my $sphinx = get_sphinx_fname(); + if ($sphinx eq "") { + $need_sphinx = 1; + return; + } + + $cur_version = get_sphinx_version($sphinx); + die ("$sphinx returned an error") if (!$cur_version); + + die "$sphinx didn't return its version" if (!$cur_version); + + if ($cur_version lt $min_version) { + printf "ERROR: Sphinx version is %s. It should be >= %s (recommended >= %s)\n", + $cur_version, $min_version, $default_version; + $need_sphinx = 1; + return; + } + + if ($cur_version lt $rec_version) { + $rec_sphinx_upgrade = 1; + return; + } + + # On version check mode, just assume Sphinx has all mandatory deps + exit (0) if ($version_check); +} + +# +# Ancillary subroutines +# + +sub catcheck($) +{ + my $res = ""; + $res = qx(cat $_[0]) if (-r $_[0]); + return $res; +} + +sub which($) +{ + my $file = shift; + my @path = split ":", $ENV{PATH}; + + foreach my $dir(@path) { + my $name = $dir.'/'.$file; + return $name if (-x $name ); + } + return undef; +} + +# +# Subroutines that check distro-specific hints +# + +sub give_debian_hints() +{ + my %map = ( + "python-sphinx" => "python3-sphinx", + "sphinx_rtd_theme" => "python3-sphinx-rtd-theme", + "ensurepip" => "python3-venv", + "virtualenv" => "virtualenv", + "dot" => "graphviz", + "convert" => "imagemagick", + "Pod::Usage" => "perl-modules", + "xelatex" => "texlive-xetex", + "rsvg-convert" => "librsvg2-bin", + ); + + if ($pdf) { + check_missing_file(["/usr/share/texlive/texmf-dist/tex/latex/ctex/ctexhook.sty"], + "texlive-lang-chinese", 2); + + check_missing_file(["/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"], + "fonts-dejavu", 2); + + check_missing_file(["/usr/share/fonts/noto-cjk/NotoSansCJK-Regular.ttc", + "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc", + "/usr/share/fonts/opentype/noto/NotoSerifCJK-Regular.ttc"], + "fonts-noto-cjk", 2); + } + + check_program("dvipng", 2) if ($pdf); + check_missing(\%map); + + return if (!$need && !$optional); + printf("You should run:\n\n\tsudo apt-get install $install\n"); +} + +sub give_redhat_hints() +{ + my %map = ( + "python-sphinx" => "python3-sphinx", + "sphinx_rtd_theme" => "python3-sphinx_rtd_theme", + "virtualenv" => "python3-virtualenv", + "dot" => "graphviz", + "convert" => "ImageMagick", + "Pod::Usage" => "perl-Pod-Usage", + "xelatex" => "texlive-xetex-bin", + "rsvg-convert" => "librsvg2-tools", + ); + + my @fedora26_opt_pkgs = ( + "graphviz-gd", # Fedora 26: needed for PDF support + ); + + my @fedora_tex_pkgs = ( + "texlive-collection-fontsrecommended", + "texlive-collection-latex", + "texlive-xecjk", + "dejavu-sans-fonts", + "dejavu-serif-fonts", + "dejavu-sans-mono-fonts", + ); + + # + # Checks valid for RHEL/CentOS version 7.x. + # + my $old = 0; + my $rel; + $rel = $1 if ($system_release =~ /release\s+(\d+)/); + + if (!($system_release =~ /Fedora/)) { + $map{"virtualenv"} = "python-virtualenv"; + + if ($rel && $rel < 8) { + $old = 1; + $pdf = 0; + + printf("Note: texlive packages on RHEL/CENTOS <= 7 are incomplete. Can't support PDF output\n"); + printf("If you want to build PDF, please read:\n"); + printf("\thttps://www.systutorials.com/241660/how-to-install-tex-live-on-centos-7-linux/\n"); + } + } else { + if ($rel && $rel < 26) { + $old = 1; + } + } + if (!$rel) { + printf("Couldn't identify release number\n"); + $old = 1; + $pdf = 0; + } + + if ($pdf) { + check_missing_file(["/usr/share/fonts/google-noto-cjk/NotoSansCJK-Regular.ttc"], + "google-noto-sans-cjk-ttc-fonts", 2); + } + + check_rpm_missing(\@fedora26_opt_pkgs, 2) if ($pdf && !$old); + check_rpm_missing(\@fedora_tex_pkgs, 2) if ($pdf); + check_missing_tex(2) if ($pdf); + check_missing(\%map); + + return if (!$need && !$optional); + + if (!$old) { + # dnf, for Fedora 18+ + printf("You should run:\n\n\tsudo dnf install -y $install\n"); + } else { + # yum, for RHEL (and clones) or Fedora version < 18 + printf("You should run:\n\n\tsudo yum install -y $install\n"); + } +} + +sub give_opensuse_hints() +{ + my %map = ( + "python-sphinx" => "python3-sphinx", + "sphinx_rtd_theme" => "python3-sphinx_rtd_theme", + "virtualenv" => "python3-virtualenv", + "dot" => "graphviz", + "convert" => "ImageMagick", + "Pod::Usage" => "perl-Pod-Usage", + "xelatex" => "texlive-xetex-bin", + ); + + # On Tumbleweed, this package is also named rsvg-convert + $map{"rsvg-convert"} = "rsvg-view" if (!($system_release =~ /Tumbleweed/)); + + my @suse_tex_pkgs = ( + "texlive-babel-english", + "texlive-caption", + "texlive-colortbl", + "texlive-courier", + "texlive-dvips", + "texlive-helvetic", + "texlive-makeindex", + "texlive-metafont", + "texlive-metapost", + "texlive-palatino", + "texlive-preview", + "texlive-times", + "texlive-zapfchan", + "texlive-zapfding", + ); + + $map{"latexmk"} = "texlive-latexmk-bin"; + + # FIXME: add support for installing CJK fonts + # + # I tried hard, but was unable to find a way to install + # "Noto Sans CJK SC" on openSUSE + + check_rpm_missing(\@suse_tex_pkgs, 2) if ($pdf); + check_missing_tex(2) if ($pdf); + check_missing(\%map); + + return if (!$need && !$optional); + printf("You should run:\n\n\tsudo zypper install --no-recommends $install\n"); +} + +sub give_mageia_hints() +{ + my %map = ( + "python-sphinx" => "python3-sphinx", + "sphinx_rtd_theme" => "python3-sphinx_rtd_theme", + "virtualenv" => "python3-virtualenv", + "dot" => "graphviz", + "convert" => "ImageMagick", + "Pod::Usage" => "perl-Pod-Usage", + "xelatex" => "texlive", + "rsvg-convert" => "librsvg2", + ); + + my @tex_pkgs = ( + "texlive-fontsextra", + ); + + $map{"latexmk"} = "texlive-collection-basic"; + + my $packager_cmd; + my $noto_sans; + if ($system_release =~ /OpenMandriva/) { + $packager_cmd = "dnf install"; + $noto_sans = "noto-sans-cjk-fonts"; + @tex_pkgs = ( "texlive-collection-fontsextra" ); + } else { + $packager_cmd = "urpmi"; + $noto_sans = "google-noto-sans-cjk-ttc-fonts"; + } + + + if ($pdf) { + check_missing_file(["/usr/share/fonts/google-noto-cjk/NotoSansCJK-Regular.ttc", + "/usr/share/fonts/TTF/NotoSans-Regular.ttf"], + $noto_sans, 2); + } + + check_rpm_missing(\@tex_pkgs, 2) if ($pdf); + check_missing(\%map); + + return if (!$need && !$optional); + printf("You should run:\n\n\tsudo $packager_cmd $install\n"); +} + +sub give_arch_linux_hints() +{ + my %map = ( + "sphinx_rtd_theme" => "python-sphinx_rtd_theme", + "virtualenv" => "python-virtualenv", + "dot" => "graphviz", + "convert" => "imagemagick", + "xelatex" => "texlive-bin", + "latexmk" => "texlive-core", + "rsvg-convert" => "extra/librsvg", + ); + + my @archlinux_tex_pkgs = ( + "texlive-core", + "texlive-latexextra", + "ttf-dejavu", + ); + check_pacman_missing(\@archlinux_tex_pkgs, 2) if ($pdf); + + if ($pdf) { + check_missing_file(["/usr/share/fonts/noto-cjk/NotoSansCJK-Regular.ttc"], + "noto-fonts-cjk", 2); + } + + check_missing(\%map); + + return if (!$need && !$optional); + printf("You should run:\n\n\tsudo pacman -S $install\n"); +} + +sub give_gentoo_hints() +{ + my %map = ( + "sphinx_rtd_theme" => "dev-python/sphinx_rtd_theme", + "virtualenv" => "dev-python/virtualenv", + "dot" => "media-gfx/graphviz", + "convert" => "media-gfx/imagemagick", + "xelatex" => "dev-texlive/texlive-xetex media-fonts/dejavu", + "rsvg-convert" => "gnome-base/librsvg", + ); + + check_missing_file(["/usr/share/fonts/dejavu/DejaVuSans.ttf"], + "media-fonts/dejavu", 2) if ($pdf); + + if ($pdf) { + check_missing_file(["/usr/share/fonts/noto-cjk/NotoSansCJKsc-Regular.otf", + "/usr/share/fonts/noto-cjk/NotoSerifCJK-Regular.ttc"], + "media-fonts/noto-cjk", 2); + } + + check_missing(\%map); + + return if (!$need && !$optional); + + printf("You should run:\n\n"); + + my $imagemagick = "media-gfx/imagemagick svg png"; + my $cairo = "media-gfx/graphviz cairo pdf"; + my $portage_imagemagick = "/etc/portage/package.use/imagemagick"; + my $portage_cairo = "/etc/portage/package.use/graphviz"; + + if (qx(grep imagemagick $portage_imagemagick 2>/dev/null) eq "") { + printf("\tsudo su -c 'echo \"$imagemagick\" > $portage_imagemagick'\n") + } + if (qx(grep graphviz $portage_cairo 2>/dev/null) eq "") { + printf("\tsudo su -c 'echo \"$cairo\" > $portage_cairo'\n"); + } + + printf("\tsudo emerge --ask $install\n"); + +} + +sub check_distros() +{ + # Distro-specific hints + if ($system_release =~ /Red Hat Enterprise Linux/) { + give_redhat_hints; + return; + } + if ($system_release =~ /CentOS/) { + give_redhat_hints; + return; + } + if ($system_release =~ /Scientific Linux/) { + give_redhat_hints; + return; + } + if ($system_release =~ /Oracle Linux Server/) { + give_redhat_hints; + return; + } + if ($system_release =~ /Fedora/) { + give_redhat_hints; + return; + } + if ($system_release =~ /Ubuntu/) { + give_debian_hints; + return; + } + if ($system_release =~ /Debian/) { + give_debian_hints; + return; + } + if ($system_release =~ /openSUSE/) { + give_opensuse_hints; + return; + } + if ($system_release =~ /Mageia/) { + give_mageia_hints; + return; + } + if ($system_release =~ /OpenMandriva/) { + give_mageia_hints; + return; + } + if ($system_release =~ /Arch Linux/) { + give_arch_linux_hints; + return; + } + if ($system_release =~ /Gentoo/) { + give_gentoo_hints; + return; + } + + # + # Fall-back to generic hint code for other distros + # That's far from ideal, specially for LaTeX dependencies. + # + my %map = ( + "sphinx-build" => "sphinx" + ); + check_missing_tex(2) if ($pdf); + check_missing(\%map); + print "I don't know distro $system_release.\n"; + print "So, I can't provide you a hint with the install procedure.\n"; + print "There are likely missing dependencies.\n"; +} + +# +# Common dependencies +# + +sub deactivate_help() +{ + printf "\nIf you want to exit the virtualenv, you can use:\n"; + printf "\tdeactivate\n"; +} + +sub check_needs() +{ + # Check if Sphinx is already accessible from current environment + check_sphinx(); + + if ($system_release) { + print "Detected OS: $system_release.\n"; + } else { + print "Unknown OS\n"; + } + printf "Sphinx version: %s\n\n", $cur_version if ($cur_version); + + # Check python command line, trying first python3 + $python_cmd = findprog("python3"); + $python_cmd = check_program("python", 0) if (!$python_cmd); + + # Check the type of virtual env, depending on Python version + if ($python_cmd) { + if ($virtualenv) { + my $tmp = qx($python_cmd --version 2>&1); + if ($tmp =~ m/(\d+\.)(\d+\.)/) { + if ($1 >= 3 && $2 >= 3) { + $need_venv = 1; # python 3.3 or upper + } else { + $need_virtualenv = 1; + } + if ($1 < 3) { + # Complain if it finds python2 (or worse) + printf "Warning: python$1 support is deprecated. Use it with caution!\n"; + } + } else { + die "Warning: couldn't identify $python_cmd version!"; + } + } else { + add_package("python-sphinx", 0); + } + } + + # Set virtualenv command line, if python < 3.3 + my $virtualenv_cmd; + if ($need_virtualenv) { + $virtualenv_cmd = findprog("virtualenv-3"); + $virtualenv_cmd = findprog("virtualenv-3.5") if (!$virtualenv_cmd); + if (!$virtualenv_cmd) { + check_program("virtualenv", 0); + $virtualenv_cmd = "virtualenv"; + } + } + + # Check for needed programs/tools + check_perl_module("Pod::Usage", 0); + check_program("make", 0); + check_program("gcc", 0); + check_python_module("sphinx_rtd_theme", 1) if (!$virtualenv); + check_program("dot", 1); + check_program("convert", 1); + + # Extra PDF files - should use 2 for is_optional + check_program("xelatex", 2) if ($pdf); + check_program("rsvg-convert", 2) if ($pdf); + check_program("latexmk", 2) if ($pdf); + + if ($need_sphinx || $rec_sphinx_upgrade) { + check_python_module("ensurepip", 0) if ($need_venv); + } + + # Do distro-specific checks and output distro-install commands + check_distros(); + + if (!$python_cmd) { + if ($need == 1) { + die "Can't build as $need mandatory dependency is missing"; + } elsif ($need) { + die "Can't build as $need mandatory dependencies are missing"; + } + } + + # Check if sphinx-build is called sphinx-build-3 + if ($need_symlink) { + printf "\tsudo ln -sf %s /usr/bin/sphinx-build\n\n", + which("sphinx-build-3"); + } + + # NOTE: if the system has a too old Sphinx version installed, + # it will recommend installing a newer version using virtualenv + + if ($need_sphinx || $rec_sphinx_upgrade) { + my $min_activate = "$ENV{'PWD'}/${virtenv_prefix}${min_version}/bin/activate"; + my @activates = glob "$ENV{'PWD'}/${virtenv_prefix}*/bin/activate"; + + if ($cur_version lt $rec_version) { + print "Warning: It is recommended at least Sphinx version $rec_version.\n"; + print " If you want pdf, you need at least $min_pdf_version.\n"; + } + if ($cur_version lt $min_pdf_version) { + print "Note: It is recommended at least Sphinx version $min_pdf_version if you need PDF support.\n"; + } + @activates = sort {$b cmp $a} @activates; + my ($activate, $ver); + foreach my $f (@activates) { + next if ($f lt $min_activate); + + my $sphinx_cmd = $f; + $sphinx_cmd =~ s/activate/sphinx-build/; + next if (! -f $sphinx_cmd); + + $ver = get_sphinx_version($sphinx_cmd); + if ($need_sphinx && ($ver ge $min_version)) { + $activate = $f; + last; + } elsif ($ver gt $cur_version) { + $activate = $f; + last; + } + } + if ($activate ne "") { + if ($need_sphinx) { + printf "\nNeed to activate Sphinx (version $ver) on virtualenv with:\n"; + printf "\t. $activate\n"; + deactivate_help(); + exit (1); + } else { + printf "\nYou may also use a newer Sphinx (version $ver) with:\n"; + printf "\tdeactivate && . $activate\n"; + } + } else { + my $rec_activate = "$virtenv_dir/bin/activate"; + + print "To upgrade Sphinx, use:\n\n" if ($rec_sphinx_upgrade); + + $python_cmd = find_python_no_venv(); + + if ($need_venv) { + printf "\t$python_cmd -m venv $virtenv_dir\n"; + } else { + printf "\t$virtualenv_cmd $virtenv_dir\n"; + } + printf "\t. $rec_activate\n"; + printf "\tpip install -r $requirement_file\n"; + deactivate_help(); + + $need++ if (!$rec_sphinx_upgrade); + } + } + printf "\n"; + + print "All optional dependencies are met.\n" if (!$optional); + + if ($need == 1) { + die "Can't build as $need mandatory dependency is missing"; + } elsif ($need) { + die "Can't build as $need mandatory dependencies are missing"; + } + + print "Needed package dependencies are met.\n"; +} + +# +# Main +# + +while (@ARGV) { + my $arg = shift(@ARGV); + + if ($arg eq "--no-virtualenv") { + $virtualenv = 0; + } elsif ($arg eq "--no-pdf"){ + $pdf = 0; + } elsif ($arg eq "--version-check"){ + $version_check = 1; + } else { + print "Usage:\n\t$0 <--no-virtualenv> <--no-pdf> <--version-check>\n\n"; + print "Where:\n"; + print "\t--no-virtualenv\t- Recommend installing Sphinx instead of using a virtualenv\n"; + print "\t--version-check\t- if version is compatible, don't check for missing dependencies\n"; + print "\t--no-pdf\t- don't check for dependencies required to build PDF docs\n\n"; + exit -1; + } +} + +# +# Determine the system type. There's no standard unique way that would +# work with all distros with a minimal package install. So, several +# methods are used here. +# +# By default, it will use lsb_release function. If not available, it will +# fail back to reading the known different places where the distro name +# is stored +# + +$system_release = qx(lsb_release -d) if which("lsb_release"); +$system_release =~ s/Description:\s*// if ($system_release); +$system_release = catcheck("/etc/system-release") if !$system_release; +$system_release = catcheck("/etc/redhat-release") if !$system_release; +$system_release = catcheck("/etc/lsb-release") if !$system_release; +$system_release = catcheck("/etc/gentoo-release") if !$system_release; + +# This seems more common than LSB these days +if (!$system_release) { + my %os_var; + if (open IN, "cat /etc/os-release|") { + while (<IN>) { + if (m/^([\w\d\_]+)=\"?([^\"]*)\"?\n/) { + $os_var{$1}=$2; + } + } + $system_release = $os_var{"NAME"}; + if (defined($os_var{"VERSION_ID"})) { + $system_release .= " " . $os_var{"VERSION_ID"} if (defined($os_var{"VERSION_ID"})); + } else { + $system_release .= " " . $os_var{"VERSION"}; + } + } +} +$system_release = catcheck("/etc/issue") if !$system_release; +$system_release =~ s/\s+$//; + +check_needs; diff --git a/src/net/scripts/split-man.pl b/src/net/scripts/split-man.pl new file mode 100755 index 0000000..96bd99d --- /dev/null +++ b/src/net/scripts/split-man.pl @@ -0,0 +1,28 @@ +#!/usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0 +# +# Author: Mauro Carvalho Chehab <mchehab+samsung@kernel.org> +# +# Produce manpages from kernel-doc. +# See Documentation/doc-guide/kernel-doc.rst for instructions + +if ($#ARGV < 0) { + die "where do I put the results?\n"; +} + +mkdir $ARGV[0],0777; +$state = 0; +while (<STDIN>) { + if (/^\.TH \"[^\"]*\" 9 \"([^\"]*)\"/) { + if ($state == 1) { close OUT } + $state = 1; + $fn = "$ARGV[0]/$1.9"; + print STDERR "Creating $fn\n"; + open OUT, ">$fn" or die "can't open $fn: $!\n"; + print OUT $_; + } elsif ($state != 0) { + print OUT $_; + } +} + +close OUT; diff --git a/src/net/scripts/stackdelta b/src/net/scripts/stackdelta new file mode 100755 index 0000000..44d2dfd --- /dev/null +++ b/src/net/scripts/stackdelta @@ -0,0 +1,60 @@ +#!/usr/bin/env perl +# SPDX-License-Identifier: GPL-2.0 + +# Read two files produced by the stackusage script, and show the +# delta between them. +# +# Currently, only shows changes for functions listed in both files. We +# could add an option to show also functions which have vanished or +# appeared (which would often be due to gcc making other inlining +# decisions). +# +# Another possible option would be a minimum absolute value for the +# delta. +# +# A third possibility is for sorting by delta, but that can be +# achieved by piping to sort -k5,5g. + +sub read_stack_usage_file { + my %su; + my $f = shift; + open(my $fh, '<', $f) + or die "cannot open $f: $!"; + while (<$fh>) { + chomp; + my ($file, $func, $size, $type) = split; + # Old versions of gcc (at least 4.7) have an annoying quirk in + # that a (static) function whose name has been changed into + # for example ext4_find_unwritten_pgoff.isra.11 will show up + # in the .su file with a name of just "11". Since such a + # numeric suffix is likely to change across different + # commits/compilers/.configs or whatever else we're trying to + # tweak, we can't really track those functions, so we just + # silently skip them. + # + # Newer gcc (at least 5.0) report the full name, so again, + # since the suffix is likely to change, we strip it. + next if $func =~ m/^[0-9]+$/; + $func =~ s/\..*$//; + # Line numbers are likely to change; strip those. + $file =~ s/:[0-9]+$//; + $su{"${file}\t${func}"} = {size => $size, type => $type}; + } + close($fh); + return \%su; +} + +@ARGV == 2 + or die "usage: $0 <old> <new>"; + +my $old = read_stack_usage_file($ARGV[0]); +my $new = read_stack_usage_file($ARGV[1]); +my @common = sort grep {exists $new->{$_}} keys %$old; +for (@common) { + my $x = $old->{$_}{size}; + my $y = $new->{$_}{size}; + my $delta = $y - $x; + if ($delta) { + printf "%s\t%d\t%d\t%+d\n", $_, $x, $y, $delta; + } +} diff --git a/src/net/scripts/stackusage b/src/net/scripts/stackusage new file mode 100755 index 0000000..56ef1ab --- /dev/null +++ b/src/net/scripts/stackusage @@ -0,0 +1,34 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 + +outfile="" +now=`date +%s` + +while [ $# -gt 0 ] +do + case "$1" in + -o) + outfile="$2" + shift 2;; + -h) + echo "usage: $0 [-o outfile] <make options/args>" + exit 0;; + *) break;; + esac +done + +if [ -z "$outfile" ] +then + outfile=`mktemp --tmpdir stackusage.$$.XXXX` +fi + +KCFLAGS="${KCFLAGS} -fstack-usage" make "$@" + +# Prepend directory name to file names, remove column information, +# make file:line/function/size/type properly tab-separated. +find . -name '*.su' -newermt "@${now}" -print | \ + xargs perl -MFile::Basename -pe \ + '$d = dirname($ARGV); s#([^:]+:[0-9]+):[0-9]+:#$d/$1\t#;' | \ + sort -k3,3nr > "${outfile}" + +echo "$0: output written to ${outfile}" diff --git a/src/net/scripts/subarch.include b/src/net/scripts/subarch.include new file mode 100644 index 0000000..c79e0d0 --- /dev/null +++ b/src/net/scripts/subarch.include @@ -0,0 +1,13 @@ +# SUBARCH tells the usermode build what the underlying arch is. That is set +# first, and if a usermode build is happening, the "ARCH=um" on the command +# line overrides the setting of ARCH below. If a native build is happening, +# then ARCH is assigned, getting whatever value it gets normally, and +# SUBARCH is subsequently ignored. + +SUBARCH := $(shell uname -m | sed -e s/i.86/x86/ -e s/x86_64/x86/ \ + -e s/sun4u/sparc64/ \ + -e s/arm.*/arm/ -e s/sa110/arm/ \ + -e s/s390x/s390/ -e s/parisc64/parisc/ \ + -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \ + -e s/sh[234].*/sh/ -e s/aarch64.*/arm64/ \ + -e s/riscv.*/riscv/ -e s/loongarch.*/loongarch/) diff --git a/src/net/scripts/tags.sh b/src/net/scripts/tags.sh new file mode 100755 index 0000000..fd96734 --- /dev/null +++ b/src/net/scripts/tags.sh @@ -0,0 +1,330 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0-only +# Generate tags or cscope files +# Usage tags.sh <mode> +# +# mode may be any of: tags, TAGS, cscope +# +# Uses the following environment variables: +# SUBARCH, SRCARCH, srctree + +if [ "$KBUILD_VERBOSE" = "1" ]; then + set -x +fi + +# RCS_FIND_IGNORE has escaped ()s -- remove them. +ignore="$(echo "$RCS_FIND_IGNORE" | sed 's|\\||g' )" +# tags and cscope files should also ignore MODVERSION *.mod.c files +ignore="$ignore ( -name *.mod.c ) -prune -o" + +# Use make KBUILD_ABS_SRCTREE=1 {tags|cscope} +# to force full paths for a non-O= build +if [ "${srctree}" = "." -o -z "${srctree}" ]; then + tree= +else + tree=${srctree}/ +fi + +# ignore userspace tools +if [ -n "$COMPILED_SOURCE" ]; then + ignore="$ignore ( -path ./tools ) -prune -o" +else + ignore="$ignore ( -path ${tree}tools ) -prune -o" +fi + +# Detect if ALLSOURCE_ARCHS is set. If not, we assume SRCARCH +if [ "${ALLSOURCE_ARCHS}" = "" ]; then + ALLSOURCE_ARCHS=${SRCARCH} +elif [ "${ALLSOURCE_ARCHS}" = "all" ]; then + ALLSOURCE_ARCHS=$(find ${tree}arch/ -mindepth 1 -maxdepth 1 -type d -printf '%f ') +fi + +# find sources in arch/$1 +find_arch_sources() +{ + for i in $archincludedir; do + prune="$prune -wholename $i -prune -o" + done + find ${tree}arch/$1 $ignore $prune -name "$2" -not -type l -print; +} + +# find sources in arch/$1/include +find_arch_include_sources() +{ + include=$(find ${tree}arch/$1/ -name include -type d -print); + if [ -n "$include" ]; then + archincludedir="$archincludedir $include" + find $include $ignore -name "$2" -not -type l -print; + fi +} + +# find sources in include/ +find_include_sources() +{ + find ${tree}include $ignore -name config -prune -o -name "$1" \ + -not -type l -print; +} + +# find sources in rest of tree +# we could benefit from a list of dirs to search in here +find_other_sources() +{ + find ${tree}* $ignore \ + \( -path ${tree}include -o -path ${tree}arch -o -name '.tmp_*' \) -prune -o \ + -name "$1" -not -type l -print; +} + +find_sources() +{ + find_arch_sources $1 "$2" +} + +all_sources() +{ + find_arch_include_sources ${SRCARCH} '*.[chS]' + if [ ! -z "$archinclude" ]; then + find_arch_include_sources $archinclude '*.[chS]' + fi + find_include_sources '*.[chS]' + for arch in $ALLSOURCE_ARCHS + do + find_sources $arch '*.[chS]' + done + find_other_sources '*.[chS]' +} + +all_compiled_sources() +{ + realpath -es $([ -z "$KBUILD_ABS_SRCTREE" ] && echo --relative-to=.) \ + include/generated/autoconf.h $(find $ignore -name "*.cmd" -exec \ + grep -Poh '(?(?=^source_.* \K).*|(?=^ \K\S).*(?= \\))' {} \+ | + awk '!a[$0]++') | sort -u +} + +all_target_sources() +{ + if [ -n "$COMPILED_SOURCE" ]; then + all_compiled_sources + else + all_sources + fi +} + +all_kconfigs() +{ + find ${tree}arch/ -maxdepth 1 $ignore \ + -name "Kconfig*" -not -type l -print; + for arch in $ALLSOURCE_ARCHS; do + find_sources $arch 'Kconfig*' + done + find_other_sources 'Kconfig*' +} + +docscope() +{ + (echo \-k; echo \-q; all_target_sources) > cscope.files + cscope -b -f cscope.out +} + +dogtags() +{ + all_target_sources | gtags -i -f - +} + +# Basic regular expressions with an optional /kind-spec/ for ctags and +# the following limitations: +# - No regex modifiers +# - Use \{0,1\} instead of \?, because etags expects an unescaped ? +# - \s is not working with etags, use a space or [ \t] +# - \w works, but does not match underscores in etags +# - etags regular expressions have to match at the start of a line; +# a ^[^#] is prepended by setup_regex unless an anchor is already present +regex_asm=( + '/^\(ENTRY\|_GLOBAL\)(\([[:alnum:]_\\]*\)).*/\2/' +) +regex_c=( + '/^SYSCALL_DEFINE[0-9](\([[:alnum:]_]*\).*/sys_\1/' + '/^BPF_CALL_[0-9](\([[:alnum:]_]*\).*/\1/' + '/^COMPAT_SYSCALL_DEFINE[0-9](\([[:alnum:]_]*\).*/compat_sys_\1/' + '/^TRACE_EVENT(\([[:alnum:]_]*\).*/trace_\1/' + '/^TRACE_EVENT(\([[:alnum:]_]*\).*/trace_\1_rcuidle/' + '/^DEFINE_EVENT([^,)]*, *\([[:alnum:]_]*\).*/trace_\1/' + '/^DEFINE_EVENT([^,)]*, *\([[:alnum:]_]*\).*/trace_\1_rcuidle/' + '/^DEFINE_INSN_CACHE_OPS(\([[:alnum:]_]*\).*/get_\1_slot/' + '/^DEFINE_INSN_CACHE_OPS(\([[:alnum:]_]*\).*/free_\1_slot/' + '/^PAGEFLAG(\([[:alnum:]_]*\).*/Page\1/' + '/^PAGEFLAG(\([[:alnum:]_]*\).*/SetPage\1/' + '/^PAGEFLAG(\([[:alnum:]_]*\).*/ClearPage\1/' + '/^TESTSETFLAG(\([[:alnum:]_]*\).*/TestSetPage\1/' + '/^TESTPAGEFLAG(\([[:alnum:]_]*\).*/Page\1/' + '/^SETPAGEFLAG(\([[:alnum:]_]*\).*/SetPage\1/' + '/\<__SETPAGEFLAG(\([[:alnum:]_]*\).*/__SetPage\1/' + '/\<TESTCLEARFLAG(\([[:alnum:]_]*\).*/TestClearPage\1/' + '/\<__TESTCLEARFLAG(\([[:alnum:]_]*\).*/TestClearPage\1/' + '/\<CLEARPAGEFLAG(\([[:alnum:]_]*\).*/ClearPage\1/' + '/\<__CLEARPAGEFLAG(\([[:alnum:]_]*\).*/__ClearPage\1/' + '/^__PAGEFLAG(\([[:alnum:]_]*\).*/__SetPage\1/' + '/^__PAGEFLAG(\([[:alnum:]_]*\).*/__ClearPage\1/' + '/^PAGEFLAG_FALSE(\([[:alnum:]_]*\).*/Page\1/' + '/\<TESTSCFLAG(\([[:alnum:]_]*\).*/TestSetPage\1/' + '/\<TESTSCFLAG(\([[:alnum:]_]*\).*/TestClearPage\1/' + '/\<SETPAGEFLAG_NOOP(\([[:alnum:]_]*\).*/SetPage\1/' + '/\<CLEARPAGEFLAG_NOOP(\([[:alnum:]_]*\).*/ClearPage\1/' + '/\<__CLEARPAGEFLAG_NOOP(\([[:alnum:]_]*\).*/__ClearPage\1/' + '/\<TESTCLEARFLAG_FALSE(\([[:alnum:]_]*\).*/TestClearPage\1/' + '/^PAGE_TYPE_OPS(\([[:alnum:]_]*\).*/Page\1/' + '/^PAGE_TYPE_OPS(\([[:alnum:]_]*\).*/__SetPage\1/' + '/^PAGE_TYPE_OPS(\([[:alnum:]_]*\).*/__ClearPage\1/' + '/^TASK_PFA_TEST([^,]*, *\([[:alnum:]_]*\))/task_\1/' + '/^TASK_PFA_SET([^,]*, *\([[:alnum:]_]*\))/task_set_\1/' + '/^TASK_PFA_CLEAR([^,]*, *\([[:alnum:]_]*\))/task_clear_\1/' + '/^DEF_MMIO_\(IN\|OUT\)_[XD](\([[:alnum:]_]*\),[^)]*)/\2/' + '/^DEBUGGER_BOILERPLATE(\([[:alnum:]_]*\))/\1/' + '/^DEF_PCI_AC_\(\|NO\)RET(\([[:alnum:]_]*\).*/\2/' + '/^PCI_OP_READ(\(\w*\).*[1-4])/pci_bus_read_config_\1/' + '/^PCI_OP_WRITE(\(\w*\).*[1-4])/pci_bus_write_config_\1/' + '/\<DEFINE_\(RT_MUTEX\|MUTEX\|SEMAPHORE\|SPINLOCK\)(\([[:alnum:]_]*\)/\2/v/' + '/\<DEFINE_\(RAW_SPINLOCK\|RWLOCK\|SEQLOCK\)(\([[:alnum:]_]*\)/\2/v/' + '/\<DECLARE_\(RWSEM\|COMPLETION\)(\([[:alnum:]_]\+\)/\2/v/' + '/\<DECLARE_BITMAP(\([[:alnum:]_]*\)/\1/v/' + '/\(^\|\s\)\(\|L\|H\)LIST_HEAD(\([[:alnum:]_]*\)/\3/v/' + '/\(^\|\s\)RADIX_TREE(\([[:alnum:]_]*\)/\2/v/' + '/\<DEFINE_PER_CPU([^,]*, *\([[:alnum:]_]*\)/\1/v/' + '/\<DEFINE_PER_CPU_SHARED_ALIGNED([^,]*, *\([[:alnum:]_]*\)/\1/v/' + '/\<DECLARE_WAIT_QUEUE_HEAD(\([[:alnum:]_]*\)/\1/v/' + '/\<DECLARE_\(TASKLET\|WORK\|DELAYED_WORK\)(\([[:alnum:]_]*\)/\2/v/' + '/\(^\s\)OFFSET(\([[:alnum:]_]*\)/\2/v/' + '/\(^\s\)DEFINE(\([[:alnum:]_]*\)/\2/v/' + '/\<\(DEFINE\|DECLARE\)_HASHTABLE(\([[:alnum:]_]*\)/\2/v/' + '/\<DEFINE_ID\(R\|A\)(\([[:alnum:]_]\+\)/\2/' + '/\<DEFINE_WD_CLASS(\([[:alnum:]_]\+\)/\1/' + '/\<ATOMIC_NOTIFIER_HEAD(\([[:alnum:]_]\+\)/\1/' + '/\<RAW_NOTIFIER_HEAD(\([[:alnum:]_]\+\)/\1/' + '/\<DECLARE_FAULT_ATTR(\([[:alnum:]_]\+\)/\1/' + '/\<BLOCKING_NOTIFIER_HEAD(\([[:alnum:]_]\+\)/\1/' + '/\<DEVICE_ATTR_\(RW\|RO\|WO\)(\([[:alnum:]_]\+\)/dev_attr_\2/' + '/\<DRIVER_ATTR_\(RW\|RO\|WO\)(\([[:alnum:]_]\+\)/driver_attr_\2/' + '/\<\(DEFINE\|DECLARE\)_STATIC_KEY_\(TRUE\|FALSE\)\(\|_RO\)(\([[:alnum:]_]\+\)/\4/' + '/^SEQCOUNT_LOCKTYPE(\([^,]*\),[[:space:]]*\([^,]*\),[^)]*)/seqcount_\2_t/' + '/^SEQCOUNT_LOCKTYPE(\([^,]*\),[[:space:]]*\([^,]*\),[^)]*)/seqcount_\2_init/' +) +regex_kconfig=( + '/^[[:blank:]]*\(menu\|\)config[[:blank:]]\+\([[:alnum:]_]\+\)/\2/' + '/^[[:blank:]]*\(menu\|\)config[[:blank:]]\+\([[:alnum:]_]\+\)/CONFIG_\2/' +) +setup_regex() +{ + local mode=$1 lang tmp=() r + shift + + regex=() + for lang; do + case "$lang" in + asm) tmp=("${regex_asm[@]}") ;; + c) tmp=("${regex_c[@]}") ;; + kconfig) tmp=("${regex_kconfig[@]}") ;; + esac + for r in "${tmp[@]}"; do + if test "$mode" = "exuberant"; then + regex[${#regex[@]}]="--regex-$lang=${r}b" + else + # Remove ctags /kind-spec/ + case "$r" in + /*/*/?/) + r=${r%?/} + esac + # Prepend ^[^#] unless already anchored + case "$r" in + /^*) ;; + *) + r="/^[^#]*${r#/}" + esac + regex[${#regex[@]}]="--regex=$r" + fi + done + done +} + +exuberant() +{ + setup_regex exuberant asm c + all_target_sources | xargs $1 -a \ + -I __initdata,__exitdata,__initconst,__ro_after_init \ + -I __initdata_memblock \ + -I __refdata,__attribute,__maybe_unused,__always_unused \ + -I __acquires,__releases,__deprecated,__always_inline \ + -I __read_mostly,__aligned,____cacheline_aligned \ + -I ____cacheline_aligned_in_smp \ + -I __cacheline_aligned,__cacheline_aligned_in_smp \ + -I ____cacheline_internodealigned_in_smp \ + -I __used,__packed,__packed2__,__must_check,__must_hold \ + -I EXPORT_SYMBOL,EXPORT_SYMBOL_GPL,ACPI_EXPORT_SYMBOL \ + -I DEFINE_TRACE,EXPORT_TRACEPOINT_SYMBOL,EXPORT_TRACEPOINT_SYMBOL_GPL \ + -I static,const \ + --extra=+fq --c-kinds=+px --fields=+iaS --langmap=c:+.h \ + "${regex[@]}" + + setup_regex exuberant kconfig + all_kconfigs | xargs $1 -a \ + --langdef=kconfig --language-force=kconfig "${regex[@]}" + +} + +emacs() +{ + setup_regex emacs asm c + all_target_sources | xargs $1 -a "${regex[@]}" + + setup_regex emacs kconfig + all_kconfigs | xargs $1 -a "${regex[@]}" +} + +xtags() +{ + if $1 --version 2>&1 | grep -iq exuberant; then + exuberant $1 + elif $1 --version 2>&1 | grep -iq emacs; then + emacs $1 + else + all_target_sources | xargs $1 -a + fi +} + +# Support um (which uses SUBARCH) +if [ "${ARCH}" = "um" ]; then + if [ "$SUBARCH" = "i386" ]; then + archinclude=x86 + elif [ "$SUBARCH" = "x86_64" ]; then + archinclude=x86 + else + archinclude=${SUBARCH} + fi +fi + +remove_structs= +case "$1" in + "cscope") + docscope + ;; + + "gtags") + dogtags + ;; + + "tags") + rm -f tags + xtags ctags + remove_structs=y + ;; + + "TAGS") + rm -f TAGS + xtags etags + remove_structs=y + ;; +esac + +# Remove structure forward declarations. +if [ -n "$remove_structs" ]; then + LANG=C sed -i -e '/^\([a-zA-Z_][a-zA-Z0-9_]*\)\t.*\t\/\^struct \1;.*\$\/;"\tx$/d' $1 +fi diff --git a/src/net/scripts/tools-support-relr.sh b/src/net/scripts/tools-support-relr.sh new file mode 100755 index 0000000..cb55878 --- /dev/null +++ b/src/net/scripts/tools-support-relr.sh @@ -0,0 +1,17 @@ +#!/bin/sh -eu +# SPDX-License-Identifier: GPL-2.0 + +tmp_file=$(mktemp) +trap "rm -f $tmp_file.o $tmp_file $tmp_file.bin" EXIT + +cat << "END" | $CC -c -x c - -o $tmp_file.o >/dev/null 2>&1 +void *p = &p; +END +$LD $tmp_file.o -shared -Bsymbolic --pack-dyn-relocs=relr \ + --use-android-relr-tags -o $tmp_file + +# Despite printing an error message, GNU nm still exits with exit code 0 if it +# sees a relr section. So we need to check that nothing is printed to stderr. +test -z "$($NM $tmp_file 2>&1 >/dev/null)" + +$OBJCOPY -O binary $tmp_file $tmp_file.bin diff --git a/src/net/scripts/tracing/draw_functrace.py b/src/net/scripts/tracing/draw_functrace.py new file mode 100755 index 0000000..7011fbe --- /dev/null +++ b/src/net/scripts/tracing/draw_functrace.py @@ -0,0 +1,129 @@ +#!/usr/bin/env python +# SPDX-License-Identifier: GPL-2.0-only + +""" +Copyright 2008 (c) Frederic Weisbecker <fweisbec@gmail.com> + +This script parses a trace provided by the function tracer in +kernel/trace/trace_functions.c +The resulted trace is processed into a tree to produce a more human +view of the call stack by drawing textual but hierarchical tree of +calls. Only the functions's names and the the call time are provided. + +Usage: + Be sure that you have CONFIG_FUNCTION_TRACER + # mount -t debugfs nodev /sys/kernel/debug + # echo function > /sys/kernel/debug/tracing/current_tracer + $ cat /sys/kernel/debug/tracing/trace_pipe > ~/raw_trace_func + Wait some times but not too much, the script is a bit slow. + Break the pipe (Ctrl + Z) + $ scripts/tracing/draw_functrace.py < ~/raw_trace_func > draw_functrace + Then you have your drawn trace in draw_functrace +""" + + +import sys, re + +class CallTree: + """ This class provides a tree representation of the functions + call stack. If a function has no parent in the kernel (interrupt, + syscall, kernel thread...) then it is attached to a virtual parent + called ROOT. + """ + ROOT = None + + def __init__(self, func, time = None, parent = None): + self._func = func + self._time = time + if parent is None: + self._parent = CallTree.ROOT + else: + self._parent = parent + self._children = [] + + def calls(self, func, calltime): + """ If a function calls another one, call this method to insert it + into the tree at the appropriate place. + @return: A reference to the newly created child node. + """ + child = CallTree(func, calltime, self) + self._children.append(child) + return child + + def getParent(self, func): + """ Retrieve the last parent of the current node that + has the name given by func. If this function is not + on a parent, then create it as new child of root + @return: A reference to the parent. + """ + tree = self + while tree != CallTree.ROOT and tree._func != func: + tree = tree._parent + if tree == CallTree.ROOT: + child = CallTree.ROOT.calls(func, None) + return child + return tree + + def __repr__(self): + return self.__toString("", True) + + def __toString(self, branch, lastChild): + if self._time is not None: + s = "%s----%s (%s)\n" % (branch, self._func, self._time) + else: + s = "%s----%s\n" % (branch, self._func) + + i = 0 + if lastChild: + branch = branch[:-1] + " " + while i < len(self._children): + if i != len(self._children) - 1: + s += "%s" % self._children[i].__toString(branch +\ + " |", False) + else: + s += "%s" % self._children[i].__toString(branch +\ + " |", True) + i += 1 + return s + +class BrokenLineException(Exception): + """If the last line is not complete because of the pipe breakage, + we want to stop the processing and ignore this line. + """ + pass + +class CommentLineException(Exception): + """ If the line is a comment (as in the beginning of the trace file), + just ignore it. + """ + pass + + +def parseLine(line): + line = line.strip() + if line.startswith("#"): + raise CommentLineException + m = re.match("[^]]+?\\] +([a-z.]+) +([0-9.]+): (\\w+) <-(\\w+)", line) + if m is None: + raise BrokenLineException + return (m.group(2), m.group(3), m.group(4)) + + +def main(): + CallTree.ROOT = CallTree("Root (Nowhere)", None, None) + tree = CallTree.ROOT + + for line in sys.stdin: + try: + calltime, callee, caller = parseLine(line) + except BrokenLineException: + break + except CommentLineException: + continue + tree = tree.getParent(caller) + tree = tree.calls(callee, calltime) + + print(CallTree.ROOT) + +if __name__ == "__main__": + main() diff --git a/src/net/scripts/tracing/ftrace-bisect.sh b/src/net/scripts/tracing/ftrace-bisect.sh new file mode 100755 index 0000000..9267011 --- /dev/null +++ b/src/net/scripts/tracing/ftrace-bisect.sh @@ -0,0 +1,116 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 +# +# Here's how to use this: +# +# This script is used to help find functions that are being traced by function +# tracer or function graph tracing that causes the machine to reboot, hang, or +# crash. Here's the steps to take. +# +# First, determine if function tracing is working with a single function: +# +# (note, if this is a problem with function_graph tracing, then simply +# replace "function" with "function_graph" in the following steps). +# +# # cd /sys/kernel/debug/tracing +# # echo schedule > set_ftrace_filter +# # echo function > current_tracer +# +# If this works, then we know that something is being traced that shouldn't be. +# +# # echo nop > current_tracer +# +# # cat available_filter_functions > ~/full-file +# # ftrace-bisect ~/full-file ~/test-file ~/non-test-file +# # cat ~/test-file > set_ftrace_filter +# +# *** Note *** this will take several minutes. Setting multiple functions is +# an O(n^2) operation, and we are dealing with thousands of functions. So go +# have coffee, talk with your coworkers, read facebook. And eventually, this +# operation will end. +# +# # echo function > current_tracer +# +# If it crashes, we know that ~/test-file has a bad function. +# +# Reboot back to test kernel. +# +# # cd /sys/kernel/debug/tracing +# # mv ~/test-file ~/full-file +# +# If it didn't crash. +# +# # echo nop > current_tracer +# # mv ~/non-test-file ~/full-file +# +# Get rid of the other test file from previous run (or save them off somewhere). +# # rm -f ~/test-file ~/non-test-file +# +# And start again: +# +# # ftrace-bisect ~/full-file ~/test-file ~/non-test-file +# +# The good thing is, because this cuts the number of functions in ~/test-file +# by half, the cat of it into set_ftrace_filter takes half as long each +# iteration, so don't talk so much at the water cooler the second time. +# +# Eventually, if you did this correctly, you will get down to the problem +# function, and all we need to do is to notrace it. +# +# The way to figure out if the problem function is bad, just do: +# +# # echo <problem-function> > set_ftrace_notrace +# # echo > set_ftrace_filter +# # echo function > current_tracer +# +# And if it doesn't crash, we are done. +# +# If it does crash, do this again (there's more than one problem function) +# but you need to echo the problem function(s) into set_ftrace_notrace before +# enabling function tracing in the above steps. Or if you can compile the +# kernel, annotate the problem functions with "notrace" and start again. +# + + +if [ $# -ne 3 ]; then + echo 'usage: ftrace-bisect full-file test-file non-test-file' + exit +fi + +full=$1 +test=$2 +nontest=$3 + +x=`cat $full | wc -l` +if [ $x -eq 1 ]; then + echo "There's only one function left, must be the bad one" + cat $full + exit 0 +fi + +let x=$x/2 +let y=$x+1 + +if [ ! -f $full ]; then + echo "$full does not exist" + exit 1 +fi + +if [ -f $test ]; then + echo -n "$test exists, delete it? [y/N]" + read a + if [ "$a" != "y" -a "$a" != "Y" ]; then + exit 1 + fi +fi + +if [ -f $nontest ]; then + echo -n "$nontest exists, delete it? [y/N]" + read a + if [ "$a" != "y" -a "$a" != "Y" ]; then + exit 1 + fi +fi + +sed -ne "1,${x}p" $full > $test +sed -ne "$y,\$p" $full > $nontest diff --git a/src/net/scripts/unifdef.c b/src/net/scripts/unifdef.c new file mode 100644 index 0000000..db00e3e --- /dev/null +++ b/src/net/scripts/unifdef.c @@ -0,0 +1,1225 @@ +/* + * Copyright (c) 2002 - 2011 Tony Finch <dot@dotat.at> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +/* + * unifdef - remove ifdef'ed lines + * + * This code was derived from software contributed to Berkeley by Dave Yost. + * It was rewritten to support ANSI C by Tony Finch. The original version + * of unifdef carried the 4-clause BSD copyright licence. None of its code + * remains in this version (though some of the names remain) so it now + * carries a more liberal licence. + * + * Wishlist: + * provide an option which will append the name of the + * appropriate symbol after #else's and #endif's + * provide an option which will check symbols after + * #else's and #endif's to see that they match their + * corresponding #ifdef or #ifndef + * + * These require better buffer handling, which would also make + * it possible to handle all "dodgy" directives correctly. + */ + +#include <sys/types.h> +#include <sys/stat.h> + +#include <ctype.h> +#include <err.h> +#include <errno.h> +#include <stdarg.h> +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +const char copyright[] = + "@(#) $Version: unifdef-2.5 $\n" + "@(#) $Author: Tony Finch (dot@dotat.at) $\n" + "@(#) $URL: http://dotat.at/prog/unifdef $\n" +; + +/* types of input lines: */ +typedef enum { + LT_TRUEI, /* a true #if with ignore flag */ + LT_FALSEI, /* a false #if with ignore flag */ + LT_IF, /* an unknown #if */ + LT_TRUE, /* a true #if */ + LT_FALSE, /* a false #if */ + LT_ELIF, /* an unknown #elif */ + LT_ELTRUE, /* a true #elif */ + LT_ELFALSE, /* a false #elif */ + LT_ELSE, /* #else */ + LT_ENDIF, /* #endif */ + LT_DODGY, /* flag: directive is not on one line */ + LT_DODGY_LAST = LT_DODGY + LT_ENDIF, + LT_PLAIN, /* ordinary line */ + LT_EOF, /* end of file */ + LT_ERROR, /* unevaluable #if */ + LT_COUNT +} Linetype; + +static char const * const linetype_name[] = { + "TRUEI", "FALSEI", "IF", "TRUE", "FALSE", + "ELIF", "ELTRUE", "ELFALSE", "ELSE", "ENDIF", + "DODGY TRUEI", "DODGY FALSEI", + "DODGY IF", "DODGY TRUE", "DODGY FALSE", + "DODGY ELIF", "DODGY ELTRUE", "DODGY ELFALSE", + "DODGY ELSE", "DODGY ENDIF", + "PLAIN", "EOF", "ERROR" +}; + +/* state of #if processing */ +typedef enum { + IS_OUTSIDE, + IS_FALSE_PREFIX, /* false #if followed by false #elifs */ + IS_TRUE_PREFIX, /* first non-false #(el)if is true */ + IS_PASS_MIDDLE, /* first non-false #(el)if is unknown */ + IS_FALSE_MIDDLE, /* a false #elif after a pass state */ + IS_TRUE_MIDDLE, /* a true #elif after a pass state */ + IS_PASS_ELSE, /* an else after a pass state */ + IS_FALSE_ELSE, /* an else after a true state */ + IS_TRUE_ELSE, /* an else after only false states */ + IS_FALSE_TRAILER, /* #elifs after a true are false */ + IS_COUNT +} Ifstate; + +static char const * const ifstate_name[] = { + "OUTSIDE", "FALSE_PREFIX", "TRUE_PREFIX", + "PASS_MIDDLE", "FALSE_MIDDLE", "TRUE_MIDDLE", + "PASS_ELSE", "FALSE_ELSE", "TRUE_ELSE", + "FALSE_TRAILER" +}; + +/* state of comment parser */ +typedef enum { + NO_COMMENT = false, /* outside a comment */ + C_COMMENT, /* in a comment like this one */ + CXX_COMMENT, /* between // and end of line */ + STARTING_COMMENT, /* just after slash-backslash-newline */ + FINISHING_COMMENT, /* star-backslash-newline in a C comment */ + CHAR_LITERAL, /* inside '' */ + STRING_LITERAL /* inside "" */ +} Comment_state; + +static char const * const comment_name[] = { + "NO", "C", "CXX", "STARTING", "FINISHING", "CHAR", "STRING" +}; + +/* state of preprocessor line parser */ +typedef enum { + LS_START, /* only space and comments on this line */ + LS_HASH, /* only space, comments, and a hash */ + LS_DIRTY /* this line can't be a preprocessor line */ +} Line_state; + +static char const * const linestate_name[] = { + "START", "HASH", "DIRTY" +}; + +/* + * Minimum translation limits from ISO/IEC 9899:1999 5.2.4.1 + */ +#define MAXDEPTH 64 /* maximum #if nesting */ +#define MAXLINE 4096 /* maximum length of line */ +#define MAXSYMS 4096 /* maximum number of symbols */ + +/* + * Sometimes when editing a keyword the replacement text is longer, so + * we leave some space at the end of the tline buffer to accommodate this. + */ +#define EDITSLOP 10 + +/* + * For temporary filenames + */ +#define TEMPLATE "unifdef.XXXXXX" + +/* + * Globals. + */ + +static bool compblank; /* -B: compress blank lines */ +static bool lnblank; /* -b: blank deleted lines */ +static bool complement; /* -c: do the complement */ +static bool debugging; /* -d: debugging reports */ +static bool iocccok; /* -e: fewer IOCCC errors */ +static bool strictlogic; /* -K: keep ambiguous #ifs */ +static bool killconsts; /* -k: eval constant #ifs */ +static bool lnnum; /* -n: add #line directives */ +static bool symlist; /* -s: output symbol list */ +static bool symdepth; /* -S: output symbol depth */ +static bool text; /* -t: this is a text file */ + +static const char *symname[MAXSYMS]; /* symbol name */ +static const char *value[MAXSYMS]; /* -Dsym=value */ +static bool ignore[MAXSYMS]; /* -iDsym or -iUsym */ +static int nsyms; /* number of symbols */ + +static FILE *input; /* input file pointer */ +static const char *filename; /* input file name */ +static int linenum; /* current line number */ +static FILE *output; /* output file pointer */ +static const char *ofilename; /* output file name */ +static bool overwriting; /* output overwrites input */ +static char tempname[FILENAME_MAX]; /* used when overwriting */ + +static char tline[MAXLINE+EDITSLOP];/* input buffer plus space */ +static char *keyword; /* used for editing #elif's */ + +static const char *newline; /* input file format */ +static const char newline_unix[] = "\n"; +static const char newline_crlf[] = "\r\n"; + +static Comment_state incomment; /* comment parser state */ +static Line_state linestate; /* #if line parser state */ +static Ifstate ifstate[MAXDEPTH]; /* #if processor state */ +static bool ignoring[MAXDEPTH]; /* ignore comments state */ +static int stifline[MAXDEPTH]; /* start of current #if */ +static int depth; /* current #if nesting */ +static int delcount; /* count of deleted lines */ +static unsigned blankcount; /* count of blank lines */ +static unsigned blankmax; /* maximum recent blankcount */ +static bool constexpr; /* constant #if expression */ +static bool zerosyms = true; /* to format symdepth output */ +static bool firstsym; /* ditto */ + +static int exitstat; /* program exit status */ + +static void addsym(bool, bool, char *); +static void closeout(void); +static void debug(const char *, ...); +static void done(void); +static void error(const char *); +static int findsym(const char *); +static void flushline(bool); +static Linetype parseline(void); +static Linetype ifeval(const char **); +static void ignoreoff(void); +static void ignoreon(void); +static void keywordedit(const char *); +static void nest(void); +static void process(void); +static const char *skipargs(const char *); +static const char *skipcomment(const char *); +static const char *skipsym(const char *); +static void state(Ifstate); +static int strlcmp(const char *, const char *, size_t); +static void unnest(void); +static void usage(void); +static void version(void); + +#define endsym(c) (!isalnum((unsigned char)c) && c != '_') + +/* + * The main program. + */ +int +main(int argc, char *argv[]) +{ + int opt; + + while ((opt = getopt(argc, argv, "i:D:U:I:o:bBcdeKklnsStV")) != -1) + switch (opt) { + case 'i': /* treat stuff controlled by these symbols as text */ + /* + * For strict backwards-compatibility the U or D + * should be immediately after the -i but it doesn't + * matter much if we relax that requirement. + */ + opt = *optarg++; + if (opt == 'D') + addsym(true, true, optarg); + else if (opt == 'U') + addsym(true, false, optarg); + else + usage(); + break; + case 'D': /* define a symbol */ + addsym(false, true, optarg); + break; + case 'U': /* undef a symbol */ + addsym(false, false, optarg); + break; + case 'I': /* no-op for compatibility with cpp */ + break; + case 'b': /* blank deleted lines instead of omitting them */ + case 'l': /* backwards compatibility */ + lnblank = true; + break; + case 'B': /* compress blank lines around removed section */ + compblank = true; + break; + case 'c': /* treat -D as -U and vice versa */ + complement = true; + break; + case 'd': + debugging = true; + break; + case 'e': /* fewer errors from dodgy lines */ + iocccok = true; + break; + case 'K': /* keep ambiguous #ifs */ + strictlogic = true; + break; + case 'k': /* process constant #ifs */ + killconsts = true; + break; + case 'n': /* add #line directive after deleted lines */ + lnnum = true; + break; + case 'o': /* output to a file */ + ofilename = optarg; + break; + case 's': /* only output list of symbols that control #ifs */ + symlist = true; + break; + case 'S': /* list symbols with their nesting depth */ + symlist = symdepth = true; + break; + case 't': /* don't parse C comments */ + text = true; + break; + case 'V': /* print version */ + version(); + default: + usage(); + } + argc -= optind; + argv += optind; + if (compblank && lnblank) + errx(2, "-B and -b are mutually exclusive"); + if (argc > 1) { + errx(2, "can only do one file"); + } else if (argc == 1 && strcmp(*argv, "-") != 0) { + filename = *argv; + input = fopen(filename, "rb"); + if (input == NULL) + err(2, "can't open %s", filename); + } else { + filename = "[stdin]"; + input = stdin; + } + if (ofilename == NULL) { + ofilename = "[stdout]"; + output = stdout; + } else { + struct stat ist, ost; + if (stat(ofilename, &ost) == 0 && + fstat(fileno(input), &ist) == 0) + overwriting = (ist.st_dev == ost.st_dev + && ist.st_ino == ost.st_ino); + if (overwriting) { + const char *dirsep; + int ofd; + + dirsep = strrchr(ofilename, '/'); + if (dirsep != NULL) + snprintf(tempname, sizeof(tempname), + "%.*s/" TEMPLATE, + (int)(dirsep - ofilename), ofilename); + else + snprintf(tempname, sizeof(tempname), + TEMPLATE); + ofd = mkstemp(tempname); + if (ofd != -1) + output = fdopen(ofd, "wb+"); + if (output == NULL) + err(2, "can't create temporary file"); + fchmod(ofd, ist.st_mode & (S_IRWXU|S_IRWXG|S_IRWXO)); + } else { + output = fopen(ofilename, "wb"); + if (output == NULL) + err(2, "can't open %s", ofilename); + } + } + process(); + abort(); /* bug */ +} + +static void +version(void) +{ + const char *c = copyright; + for (;;) { + while (*++c != '$') + if (*c == '\0') + exit(0); + while (*++c != '$') + putc(*c, stderr); + putc('\n', stderr); + } +} + +static void +usage(void) +{ + fprintf(stderr, "usage: unifdef [-bBcdeKknsStV] [-Ipath]" + " [-Dsym[=val]] [-Usym] [-iDsym[=val]] [-iUsym] ... [file]\n"); + exit(2); +} + +/* + * A state transition function alters the global #if processing state + * in a particular way. The table below is indexed by the current + * processing state and the type of the current line. + * + * Nesting is handled by keeping a stack of states; some transition + * functions increase or decrease the depth. They also maintain the + * ignore state on a stack. In some complicated cases they have to + * alter the preprocessor directive, as follows. + * + * When we have processed a group that starts off with a known-false + * #if/#elif sequence (which has therefore been deleted) followed by a + * #elif that we don't understand and therefore must keep, we edit the + * latter into a #if to keep the nesting correct. We use memcpy() to + * overwrite the 4 byte token "elif" with "if " without a '\0' byte. + * + * When we find a true #elif in a group, the following block will + * always be kept and the rest of the sequence after the next #elif or + * #else will be discarded. We edit the #elif into a #else and the + * following directive to #endif since this has the desired behaviour. + * + * "Dodgy" directives are split across multiple lines, the most common + * example being a multi-line comment hanging off the right of the + * directive. We can handle them correctly only if there is no change + * from printing to dropping (or vice versa) caused by that directive. + * If the directive is the first of a group we have a choice between + * failing with an error, or passing it through unchanged instead of + * evaluating it. The latter is not the default to avoid questions from + * users about unifdef unexpectedly leaving behind preprocessor directives. + */ +typedef void state_fn(void); + +/* report an error */ +static void Eelif (void) { error("Inappropriate #elif"); } +static void Eelse (void) { error("Inappropriate #else"); } +static void Eendif(void) { error("Inappropriate #endif"); } +static void Eeof (void) { error("Premature EOF"); } +static void Eioccc(void) { error("Obfuscated preprocessor control line"); } +/* plain line handling */ +static void print (void) { flushline(true); } +static void drop (void) { flushline(false); } +/* output lacks group's start line */ +static void Strue (void) { drop(); ignoreoff(); state(IS_TRUE_PREFIX); } +static void Sfalse(void) { drop(); ignoreoff(); state(IS_FALSE_PREFIX); } +static void Selse (void) { drop(); state(IS_TRUE_ELSE); } +/* print/pass this block */ +static void Pelif (void) { print(); ignoreoff(); state(IS_PASS_MIDDLE); } +static void Pelse (void) { print(); state(IS_PASS_ELSE); } +static void Pendif(void) { print(); unnest(); } +/* discard this block */ +static void Dfalse(void) { drop(); ignoreoff(); state(IS_FALSE_TRAILER); } +static void Delif (void) { drop(); ignoreoff(); state(IS_FALSE_MIDDLE); } +static void Delse (void) { drop(); state(IS_FALSE_ELSE); } +static void Dendif(void) { drop(); unnest(); } +/* first line of group */ +static void Fdrop (void) { nest(); Dfalse(); } +static void Fpass (void) { nest(); Pelif(); } +static void Ftrue (void) { nest(); Strue(); } +static void Ffalse(void) { nest(); Sfalse(); } +/* variable pedantry for obfuscated lines */ +static void Oiffy (void) { if (!iocccok) Eioccc(); Fpass(); ignoreon(); } +static void Oif (void) { if (!iocccok) Eioccc(); Fpass(); } +static void Oelif (void) { if (!iocccok) Eioccc(); Pelif(); } +/* ignore comments in this block */ +static void Idrop (void) { Fdrop(); ignoreon(); } +static void Itrue (void) { Ftrue(); ignoreon(); } +static void Ifalse(void) { Ffalse(); ignoreon(); } +/* modify this line */ +static void Mpass (void) { memcpy(keyword, "if ", 4); Pelif(); } +static void Mtrue (void) { keywordedit("else"); state(IS_TRUE_MIDDLE); } +static void Melif (void) { keywordedit("endif"); state(IS_FALSE_TRAILER); } +static void Melse (void) { keywordedit("endif"); state(IS_FALSE_ELSE); } + +static state_fn * const trans_table[IS_COUNT][LT_COUNT] = { +/* IS_OUTSIDE */ +{ Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Eendif, + Oiffy, Oiffy, Fpass, Oif, Oif, Eelif, Eelif, Eelif, Eelse, Eendif, + print, done, abort }, +/* IS_FALSE_PREFIX */ +{ Idrop, Idrop, Fdrop, Fdrop, Fdrop, Mpass, Strue, Sfalse,Selse, Dendif, + Idrop, Idrop, Fdrop, Fdrop, Fdrop, Mpass, Eioccc,Eioccc,Eioccc,Eioccc, + drop, Eeof, abort }, +/* IS_TRUE_PREFIX */ +{ Itrue, Ifalse,Fpass, Ftrue, Ffalse,Dfalse,Dfalse,Dfalse,Delse, Dendif, + Oiffy, Oiffy, Fpass, Oif, Oif, Eioccc,Eioccc,Eioccc,Eioccc,Eioccc, + print, Eeof, abort }, +/* IS_PASS_MIDDLE */ +{ Itrue, Ifalse,Fpass, Ftrue, Ffalse,Pelif, Mtrue, Delif, Pelse, Pendif, + Oiffy, Oiffy, Fpass, Oif, Oif, Pelif, Oelif, Oelif, Pelse, Pendif, + print, Eeof, abort }, +/* IS_FALSE_MIDDLE */ +{ Idrop, Idrop, Fdrop, Fdrop, Fdrop, Pelif, Mtrue, Delif, Pelse, Pendif, + Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eioccc,Eioccc,Eioccc,Eioccc,Eioccc, + drop, Eeof, abort }, +/* IS_TRUE_MIDDLE */ +{ Itrue, Ifalse,Fpass, Ftrue, Ffalse,Melif, Melif, Melif, Melse, Pendif, + Oiffy, Oiffy, Fpass, Oif, Oif, Eioccc,Eioccc,Eioccc,Eioccc,Pendif, + print, Eeof, abort }, +/* IS_PASS_ELSE */ +{ Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Pendif, + Oiffy, Oiffy, Fpass, Oif, Oif, Eelif, Eelif, Eelif, Eelse, Pendif, + print, Eeof, abort }, +/* IS_FALSE_ELSE */ +{ Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eelif, Eelif, Eelif, Eelse, Dendif, + Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eelif, Eelif, Eelif, Eelse, Eioccc, + drop, Eeof, abort }, +/* IS_TRUE_ELSE */ +{ Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Dendif, + Oiffy, Oiffy, Fpass, Oif, Oif, Eelif, Eelif, Eelif, Eelse, Eioccc, + print, Eeof, abort }, +/* IS_FALSE_TRAILER */ +{ Idrop, Idrop, Fdrop, Fdrop, Fdrop, Dfalse,Dfalse,Dfalse,Delse, Dendif, + Idrop, Idrop, Fdrop, Fdrop, Fdrop, Dfalse,Dfalse,Dfalse,Delse, Eioccc, + drop, Eeof, abort } +/*TRUEI FALSEI IF TRUE FALSE ELIF ELTRUE ELFALSE ELSE ENDIF + TRUEI FALSEI IF TRUE FALSE ELIF ELTRUE ELFALSE ELSE ENDIF (DODGY) + PLAIN EOF ERROR */ +}; + +/* + * State machine utility functions + */ +static void +ignoreoff(void) +{ + if (depth == 0) + abort(); /* bug */ + ignoring[depth] = ignoring[depth-1]; +} +static void +ignoreon(void) +{ + ignoring[depth] = true; +} +static void +keywordedit(const char *replacement) +{ + snprintf(keyword, tline + sizeof(tline) - keyword, + "%s%s", replacement, newline); + print(); +} +static void +nest(void) +{ + if (depth > MAXDEPTH-1) + abort(); /* bug */ + if (depth == MAXDEPTH-1) + error("Too many levels of nesting"); + depth += 1; + stifline[depth] = linenum; +} +static void +unnest(void) +{ + if (depth == 0) + abort(); /* bug */ + depth -= 1; +} +static void +state(Ifstate is) +{ + ifstate[depth] = is; +} + +/* + * Write a line to the output or not, according to command line options. + */ +static void +flushline(bool keep) +{ + if (symlist) + return; + if (keep ^ complement) { + bool blankline = tline[strspn(tline, " \t\r\n")] == '\0'; + if (blankline && compblank && blankcount != blankmax) { + delcount += 1; + blankcount += 1; + } else { + if (lnnum && delcount > 0) + printf("#line %d%s", linenum, newline); + fputs(tline, output); + delcount = 0; + blankmax = blankcount = blankline ? blankcount + 1 : 0; + } + } else { + if (lnblank) + fputs(newline, output); + exitstat = 1; + delcount += 1; + blankcount = 0; + } + if (debugging) + fflush(output); +} + +/* + * The driver for the state machine. + */ +static void +process(void) +{ + /* When compressing blank lines, act as if the file + is preceded by a large number of blank lines. */ + blankmax = blankcount = 1000; + for (;;) { + Linetype lineval = parseline(); + trans_table[ifstate[depth]][lineval](); + debug("process line %d %s -> %s depth %d", + linenum, linetype_name[lineval], + ifstate_name[ifstate[depth]], depth); + } +} + +/* + * Flush the output and handle errors. + */ +static void +closeout(void) +{ + if (symdepth && !zerosyms) + printf("\n"); + if (fclose(output) == EOF) { + warn("couldn't write to %s", ofilename); + if (overwriting) { + unlink(tempname); + errx(2, "%s unchanged", filename); + } else { + exit(2); + } + } +} + +/* + * Clean up and exit. + */ +static void +done(void) +{ + if (incomment) + error("EOF in comment"); + closeout(); + if (overwriting && rename(tempname, ofilename) == -1) { + warn("couldn't rename temporary file"); + unlink(tempname); + errx(2, "%s unchanged", ofilename); + } + exit(exitstat); +} + +/* + * Parse a line and determine its type. We keep the preprocessor line + * parser state between calls in the global variable linestate, with + * help from skipcomment(). + */ +static Linetype +parseline(void) +{ + const char *cp; + int cursym; + int kwlen; + Linetype retval; + Comment_state wascomment; + + linenum++; + if (fgets(tline, MAXLINE, input) == NULL) + return (LT_EOF); + if (newline == NULL) { + if (strrchr(tline, '\n') == strrchr(tline, '\r') + 1) + newline = newline_crlf; + else + newline = newline_unix; + } + retval = LT_PLAIN; + wascomment = incomment; + cp = skipcomment(tline); + if (linestate == LS_START) { + if (*cp == '#') { + linestate = LS_HASH; + firstsym = true; + cp = skipcomment(cp + 1); + } else if (*cp != '\0') + linestate = LS_DIRTY; + } + if (!incomment && linestate == LS_HASH) { + keyword = tline + (cp - tline); + cp = skipsym(cp); + kwlen = cp - keyword; + /* no way can we deal with a continuation inside a keyword */ + if (strncmp(cp, "\\\r\n", 3) == 0 || + strncmp(cp, "\\\n", 2) == 0) + Eioccc(); + if (strlcmp("ifdef", keyword, kwlen) == 0 || + strlcmp("ifndef", keyword, kwlen) == 0) { + cp = skipcomment(cp); + if ((cursym = findsym(cp)) < 0) + retval = LT_IF; + else { + retval = (keyword[2] == 'n') + ? LT_FALSE : LT_TRUE; + if (value[cursym] == NULL) + retval = (retval == LT_TRUE) + ? LT_FALSE : LT_TRUE; + if (ignore[cursym]) + retval = (retval == LT_TRUE) + ? LT_TRUEI : LT_FALSEI; + } + cp = skipsym(cp); + } else if (strlcmp("if", keyword, kwlen) == 0) + retval = ifeval(&cp); + else if (strlcmp("elif", keyword, kwlen) == 0) + retval = ifeval(&cp) - LT_IF + LT_ELIF; + else if (strlcmp("else", keyword, kwlen) == 0) + retval = LT_ELSE; + else if (strlcmp("endif", keyword, kwlen) == 0) + retval = LT_ENDIF; + else { + linestate = LS_DIRTY; + retval = LT_PLAIN; + } + cp = skipcomment(cp); + if (*cp != '\0') { + linestate = LS_DIRTY; + if (retval == LT_TRUE || retval == LT_FALSE || + retval == LT_TRUEI || retval == LT_FALSEI) + retval = LT_IF; + if (retval == LT_ELTRUE || retval == LT_ELFALSE) + retval = LT_ELIF; + } + if (retval != LT_PLAIN && (wascomment || incomment)) { + retval += LT_DODGY; + if (incomment) + linestate = LS_DIRTY; + } + /* skipcomment normally changes the state, except + if the last line of the file lacks a newline, or + if there is too much whitespace in a directive */ + if (linestate == LS_HASH) { + size_t len = cp - tline; + if (fgets(tline + len, MAXLINE - len, input) == NULL) { + /* append the missing newline */ + strcpy(tline + len, newline); + cp += strlen(newline); + linestate = LS_START; + } else { + linestate = LS_DIRTY; + } + } + } + if (linestate == LS_DIRTY) { + while (*cp != '\0') + cp = skipcomment(cp + 1); + } + debug("parser line %d state %s comment %s line", linenum, + comment_name[incomment], linestate_name[linestate]); + return (retval); +} + +/* + * These are the binary operators that are supported by the expression + * evaluator. + */ +static Linetype op_strict(int *p, int v, Linetype at, Linetype bt) { + if(at == LT_IF || bt == LT_IF) return (LT_IF); + return (*p = v, v ? LT_TRUE : LT_FALSE); +} +static Linetype op_lt(int *p, Linetype at, int a, Linetype bt, int b) { + return op_strict(p, a < b, at, bt); +} +static Linetype op_gt(int *p, Linetype at, int a, Linetype bt, int b) { + return op_strict(p, a > b, at, bt); +} +static Linetype op_le(int *p, Linetype at, int a, Linetype bt, int b) { + return op_strict(p, a <= b, at, bt); +} +static Linetype op_ge(int *p, Linetype at, int a, Linetype bt, int b) { + return op_strict(p, a >= b, at, bt); +} +static Linetype op_eq(int *p, Linetype at, int a, Linetype bt, int b) { + return op_strict(p, a == b, at, bt); +} +static Linetype op_ne(int *p, Linetype at, int a, Linetype bt, int b) { + return op_strict(p, a != b, at, bt); +} +static Linetype op_or(int *p, Linetype at, int a, Linetype bt, int b) { + if (!strictlogic && (at == LT_TRUE || bt == LT_TRUE)) + return (*p = 1, LT_TRUE); + return op_strict(p, a || b, at, bt); +} +static Linetype op_and(int *p, Linetype at, int a, Linetype bt, int b) { + if (!strictlogic && (at == LT_FALSE || bt == LT_FALSE)) + return (*p = 0, LT_FALSE); + return op_strict(p, a && b, at, bt); +} + +/* + * An evaluation function takes three arguments, as follows: (1) a pointer to + * an element of the precedence table which lists the operators at the current + * level of precedence; (2) a pointer to an integer which will receive the + * value of the expression; and (3) a pointer to a char* that points to the + * expression to be evaluated and that is updated to the end of the expression + * when evaluation is complete. The function returns LT_FALSE if the value of + * the expression is zero, LT_TRUE if it is non-zero, LT_IF if the expression + * depends on an unknown symbol, or LT_ERROR if there is a parse failure. + */ +struct ops; + +typedef Linetype eval_fn(const struct ops *, int *, const char **); + +static eval_fn eval_table, eval_unary; + +/* + * The precedence table. Expressions involving binary operators are evaluated + * in a table-driven way by eval_table. When it evaluates a subexpression it + * calls the inner function with its first argument pointing to the next + * element of the table. Innermost expressions have special non-table-driven + * handling. + */ +static const struct ops { + eval_fn *inner; + struct op { + const char *str; + Linetype (*fn)(int *, Linetype, int, Linetype, int); + } op[5]; +} eval_ops[] = { + { eval_table, { { "||", op_or } } }, + { eval_table, { { "&&", op_and } } }, + { eval_table, { { "==", op_eq }, + { "!=", op_ne } } }, + { eval_unary, { { "<=", op_le }, + { ">=", op_ge }, + { "<", op_lt }, + { ">", op_gt } } } +}; + +/* + * Function for evaluating the innermost parts of expressions, + * viz. !expr (expr) number defined(symbol) symbol + * We reset the constexpr flag in the last two cases. + */ +static Linetype +eval_unary(const struct ops *ops, int *valp, const char **cpp) +{ + const char *cp; + char *ep; + int sym; + bool defparen; + Linetype lt; + + cp = skipcomment(*cpp); + if (*cp == '!') { + debug("eval%d !", ops - eval_ops); + cp++; + lt = eval_unary(ops, valp, &cp); + if (lt == LT_ERROR) + return (LT_ERROR); + if (lt != LT_IF) { + *valp = !*valp; + lt = *valp ? LT_TRUE : LT_FALSE; + } + } else if (*cp == '(') { + cp++; + debug("eval%d (", ops - eval_ops); + lt = eval_table(eval_ops, valp, &cp); + if (lt == LT_ERROR) + return (LT_ERROR); + cp = skipcomment(cp); + if (*cp++ != ')') + return (LT_ERROR); + } else if (isdigit((unsigned char)*cp)) { + debug("eval%d number", ops - eval_ops); + *valp = strtol(cp, &ep, 0); + if (ep == cp) + return (LT_ERROR); + lt = *valp ? LT_TRUE : LT_FALSE; + cp = skipsym(cp); + } else if (strncmp(cp, "defined", 7) == 0 && endsym(cp[7])) { + cp = skipcomment(cp+7); + debug("eval%d defined", ops - eval_ops); + if (*cp == '(') { + cp = skipcomment(cp+1); + defparen = true; + } else { + defparen = false; + } + sym = findsym(cp); + if (sym < 0) { + lt = LT_IF; + } else { + *valp = (value[sym] != NULL); + lt = *valp ? LT_TRUE : LT_FALSE; + } + cp = skipsym(cp); + cp = skipcomment(cp); + if (defparen && *cp++ != ')') + return (LT_ERROR); + constexpr = false; + } else if (!endsym(*cp)) { + debug("eval%d symbol", ops - eval_ops); + sym = findsym(cp); + cp = skipsym(cp); + if (sym < 0) { + lt = LT_IF; + cp = skipargs(cp); + } else if (value[sym] == NULL) { + *valp = 0; + lt = LT_FALSE; + } else { + *valp = strtol(value[sym], &ep, 0); + if (*ep != '\0' || ep == value[sym]) + return (LT_ERROR); + lt = *valp ? LT_TRUE : LT_FALSE; + cp = skipargs(cp); + } + constexpr = false; + } else { + debug("eval%d bad expr", ops - eval_ops); + return (LT_ERROR); + } + + *cpp = cp; + debug("eval%d = %d", ops - eval_ops, *valp); + return (lt); +} + +/* + * Table-driven evaluation of binary operators. + */ +static Linetype +eval_table(const struct ops *ops, int *valp, const char **cpp) +{ + const struct op *op; + const char *cp; + int val; + Linetype lt, rt; + + debug("eval%d", ops - eval_ops); + cp = *cpp; + lt = ops->inner(ops+1, valp, &cp); + if (lt == LT_ERROR) + return (LT_ERROR); + for (;;) { + cp = skipcomment(cp); + for (op = ops->op; op->str != NULL; op++) + if (strncmp(cp, op->str, strlen(op->str)) == 0) + break; + if (op->str == NULL) + break; + cp += strlen(op->str); + debug("eval%d %s", ops - eval_ops, op->str); + rt = ops->inner(ops+1, &val, &cp); + if (rt == LT_ERROR) + return (LT_ERROR); + lt = op->fn(valp, lt, *valp, rt, val); + } + + *cpp = cp; + debug("eval%d = %d", ops - eval_ops, *valp); + debug("eval%d lt = %s", ops - eval_ops, linetype_name[lt]); + return (lt); +} + +/* + * Evaluate the expression on a #if or #elif line. If we can work out + * the result we return LT_TRUE or LT_FALSE accordingly, otherwise we + * return just a generic LT_IF. + */ +static Linetype +ifeval(const char **cpp) +{ + int ret; + int val = 0; + + debug("eval %s", *cpp); + constexpr = killconsts ? false : true; + ret = eval_table(eval_ops, &val, cpp); + debug("eval = %d", val); + return (constexpr ? LT_IF : ret == LT_ERROR ? LT_IF : ret); +} + +/* + * Skip over comments, strings, and character literals and stop at the + * next character position that is not whitespace. Between calls we keep + * the comment state in the global variable incomment, and we also adjust + * the global variable linestate when we see a newline. + * XXX: doesn't cope with the buffer splitting inside a state transition. + */ +static const char * +skipcomment(const char *cp) +{ + if (text || ignoring[depth]) { + for (; isspace((unsigned char)*cp); cp++) + if (*cp == '\n') + linestate = LS_START; + return (cp); + } + while (*cp != '\0') + /* don't reset to LS_START after a line continuation */ + if (strncmp(cp, "\\\r\n", 3) == 0) + cp += 3; + else if (strncmp(cp, "\\\n", 2) == 0) + cp += 2; + else switch (incomment) { + case NO_COMMENT: + if (strncmp(cp, "/\\\r\n", 4) == 0) { + incomment = STARTING_COMMENT; + cp += 4; + } else if (strncmp(cp, "/\\\n", 3) == 0) { + incomment = STARTING_COMMENT; + cp += 3; + } else if (strncmp(cp, "/*", 2) == 0) { + incomment = C_COMMENT; + cp += 2; + } else if (strncmp(cp, "//", 2) == 0) { + incomment = CXX_COMMENT; + cp += 2; + } else if (strncmp(cp, "\'", 1) == 0) { + incomment = CHAR_LITERAL; + linestate = LS_DIRTY; + cp += 1; + } else if (strncmp(cp, "\"", 1) == 0) { + incomment = STRING_LITERAL; + linestate = LS_DIRTY; + cp += 1; + } else if (strncmp(cp, "\n", 1) == 0) { + linestate = LS_START; + cp += 1; + } else if (strchr(" \r\t", *cp) != NULL) { + cp += 1; + } else + return (cp); + continue; + case CXX_COMMENT: + if (strncmp(cp, "\n", 1) == 0) { + incomment = NO_COMMENT; + linestate = LS_START; + } + cp += 1; + continue; + case CHAR_LITERAL: + case STRING_LITERAL: + if ((incomment == CHAR_LITERAL && cp[0] == '\'') || + (incomment == STRING_LITERAL && cp[0] == '\"')) { + incomment = NO_COMMENT; + cp += 1; + } else if (cp[0] == '\\') { + if (cp[1] == '\0') + cp += 1; + else + cp += 2; + } else if (strncmp(cp, "\n", 1) == 0) { + if (incomment == CHAR_LITERAL) + error("unterminated char literal"); + else + error("unterminated string literal"); + } else + cp += 1; + continue; + case C_COMMENT: + if (strncmp(cp, "*\\\r\n", 4) == 0) { + incomment = FINISHING_COMMENT; + cp += 4; + } else if (strncmp(cp, "*\\\n", 3) == 0) { + incomment = FINISHING_COMMENT; + cp += 3; + } else if (strncmp(cp, "*/", 2) == 0) { + incomment = NO_COMMENT; + cp += 2; + } else + cp += 1; + continue; + case STARTING_COMMENT: + if (*cp == '*') { + incomment = C_COMMENT; + cp += 1; + } else if (*cp == '/') { + incomment = CXX_COMMENT; + cp += 1; + } else { + incomment = NO_COMMENT; + linestate = LS_DIRTY; + } + continue; + case FINISHING_COMMENT: + if (*cp == '/') { + incomment = NO_COMMENT; + cp += 1; + } else + incomment = C_COMMENT; + continue; + default: + abort(); /* bug */ + } + return (cp); +} + +/* + * Skip macro arguments. + */ +static const char * +skipargs(const char *cp) +{ + const char *ocp = cp; + int level = 0; + cp = skipcomment(cp); + if (*cp != '(') + return (cp); + do { + if (*cp == '(') + level++; + if (*cp == ')') + level--; + cp = skipcomment(cp+1); + } while (level != 0 && *cp != '\0'); + if (level == 0) + return (cp); + else + /* Rewind and re-detect the syntax error later. */ + return (ocp); +} + +/* + * Skip over an identifier. + */ +static const char * +skipsym(const char *cp) +{ + while (!endsym(*cp)) + ++cp; + return (cp); +} + +/* + * Look for the symbol in the symbol table. If it is found, we return + * the symbol table index, else we return -1. + */ +static int +findsym(const char *str) +{ + const char *cp; + int symind; + + cp = skipsym(str); + if (cp == str) + return (-1); + if (symlist) { + if (symdepth && firstsym) + printf("%s%3d", zerosyms ? "" : "\n", depth); + firstsym = zerosyms = false; + printf("%s%.*s%s", + symdepth ? " " : "", + (int)(cp-str), str, + symdepth ? "" : "\n"); + /* we don't care about the value of the symbol */ + return (0); + } + for (symind = 0; symind < nsyms; ++symind) { + if (strlcmp(symname[symind], str, cp-str) == 0) { + debug("findsym %s %s", symname[symind], + value[symind] ? value[symind] : ""); + return (symind); + } + } + return (-1); +} + +/* + * Add a symbol to the symbol table. + */ +static void +addsym(bool ignorethis, bool definethis, char *sym) +{ + int symind; + char *val; + + symind = findsym(sym); + if (symind < 0) { + if (nsyms >= MAXSYMS) + errx(2, "too many symbols"); + symind = nsyms++; + } + symname[symind] = sym; + ignore[symind] = ignorethis; + val = sym + (skipsym(sym) - sym); + if (definethis) { + if (*val == '=') { + value[symind] = val+1; + *val = '\0'; + } else if (*val == '\0') + value[symind] = "1"; + else + usage(); + } else { + if (*val != '\0') + usage(); + value[symind] = NULL; + } + debug("addsym %s=%s", symname[symind], + value[symind] ? value[symind] : "undef"); +} + +/* + * Compare s with n characters of t. + * The same as strncmp() except that it checks that s[n] == '\0'. + */ +static int +strlcmp(const char *s, const char *t, size_t n) +{ + while (n-- && *t != '\0') + if (*s != *t) + return ((unsigned char)*s - (unsigned char)*t); + else + ++s, ++t; + return ((unsigned char)*s); +} + +/* + * Diagnostics. + */ +static void +debug(const char *msg, ...) +{ + va_list ap; + + if (debugging) { + va_start(ap, msg); + vwarnx(msg, ap); + va_end(ap); + } +} + +static void +error(const char *msg) +{ + if (depth == 0) + warnx("%s: %d: %s", filename, linenum, msg); + else + warnx("%s: %d: %s (#if line %d depth %d)", + filename, linenum, msg, stifline[depth], depth); + closeout(); + errx(2, "output may be truncated"); +} diff --git a/src/net/scripts/ver_linux b/src/net/scripts/ver_linux new file mode 100755 index 0000000..0968a30 --- /dev/null +++ b/src/net/scripts/ver_linux @@ -0,0 +1,81 @@ +#!/usr/bin/awk -f +# SPDX-License-Identifier: GPL-2.0 +# Before running this script please ensure that your PATH is +# typical as you use for compilation/installation. I use +# /bin /sbin /usr/bin /usr/sbin /usr/local/bin, but it may +# differ on your system. + +BEGIN { + usage = "If some fields are empty or look unusual you may have an old version.\n" + usage = usage "Compare to the current minimal requirements in Documentation/Changes.\n" + print usage + + system("uname -a") + printf("\n") + + vernum = "[0-9]+([.]?[0-9]+)+" + libc = "libc[.]so[.][0-9]+$" + libcpp = "(libg|stdc)[+]+[.]so[.][0-9]+$" + + printversion("GNU C", version("gcc -dumpversion")) + printversion("GNU Make", version("make --version")) + printversion("Binutils", version("ld -v")) + printversion("Util-linux", version("mount --version")) + printversion("Mount", version("mount --version")) + printversion("Module-init-tools", version("depmod -V")) + printversion("E2fsprogs", version("tune2fs")) + printversion("Jfsutils", version("fsck.jfs -V")) + printversion("Reiserfsprogs", version("reiserfsck -V")) + printversion("Reiser4fsprogs", version("fsck.reiser4 -V")) + printversion("Xfsprogs", version("xfs_db -V")) + printversion("Pcmciautils", version("pccardctl -V")) + printversion("Pcmcia-cs", version("cardmgr -V")) + printversion("Quota-tools", version("quota -V")) + printversion("PPP", version("pppd --version")) + printversion("Isdn4k-utils", version("isdnctrl")) + printversion("Nfs-utils", version("showmount --version")) + printversion("Bison", version("bison --version")) + printversion("Flex", version("flex --version")) + + while ("ldconfig -p 2>/dev/null" | getline > 0) { + if ($NF ~ libc && !seen[ver = version("readlink " $NF)]++) + printversion("Linux C Library", ver) + else if ($NF ~ libcpp && !seen[ver = version("readlink " $NF)]++) + printversion("Linux C++ Library", ver) + } + + printversion("Dynamic linker (ldd)", version("ldd --version")) + printversion("Procps", version("ps --version")) + printversion("Net-tools", version("ifconfig --version")) + printversion("Kbd", version("loadkeys -V")) + printversion("Console-tools", version("loadkeys -V")) + printversion("Oprofile", version("oprofiled --version")) + printversion("Sh-utils", version("expr --v")) + printversion("Udev", version("udevadm --version")) + printversion("Wireless-tools", version("iwconfig --version")) + + while ("sort /proc/modules" | getline > 0) { + mods = mods sep $1 + sep = " " + } + printversion("Modules Loaded", mods) +} + +function version(cmd, ver) { + cmd = cmd " 2>&1" + while (cmd | getline > 0) { + if (match($0, vernum)) { + ver = substr($0, RSTART, RLENGTH) + break + } + } + close(cmd) + return ver +} + +function printversion(name, value, ofmt) { + if (value != "") { + ofmt = "%-20s\t%s\n" + printf(ofmt, name, value) + } +} diff --git a/src/net/scripts/xen-hypercalls.sh b/src/net/scripts/xen-hypercalls.sh new file mode 100644 index 0000000..f18b008 --- /dev/null +++ b/src/net/scripts/xen-hypercalls.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +out="$1" +shift +in="$@" + +for i in $in; do + eval $CPP $LINUXINCLUDE -dD -imacros "$i" -x c /dev/null +done | \ +awk '$1 == "#define" && $2 ~ /__HYPERVISOR_[a-z][a-z_0-9]*/ { v[$3] = $2 } + END { print "/* auto-generated by scripts/xen-hypercall.sh */" + for (i in v) if (!(v[i] in v)) + print "HYPERCALL("substr(v[i], 14)")"}' | sort -u >$out diff --git a/src/net/scripts/xz_wrap.sh b/src/net/scripts/xz_wrap.sh new file mode 100755 index 0000000..76e9cbc --- /dev/null +++ b/src/net/scripts/xz_wrap.sh @@ -0,0 +1,23 @@ +#!/bin/sh +# +# This is a wrapper for xz to compress the kernel image using appropriate +# compression options depending on the architecture. +# +# Author: Lasse Collin <lasse.collin@tukaani.org> +# +# This file has been put into the public domain. +# You can do whatever you want with this file. +# + +BCJ= +LZMA2OPTS= + +case $SRCARCH in + x86) BCJ=--x86 ;; + powerpc) BCJ=--powerpc ;; + ia64) BCJ=--ia64; LZMA2OPTS=pb=4 ;; + arm) BCJ=--arm ;; + sparc) BCJ=--sparc ;; +esac + +exec $XZ --check=crc32 $BCJ --lzma2=$LZMA2OPTS,dict=32MiB diff --git a/src/net/smoke.sh b/src/net/smoke.sh new file mode 100755 index 0000000..dffa23b --- /dev/null +++ b/src/net/smoke.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +#接收参数 +smoke_stage=$1 #两种取值:gateci、versionci + +#暂时没实现的,固定返回0,后期如果实现,根据各组件自身需求调整该脚本 +if [ $smoke_stage = "gateci" ]; then + echo "gateci compile success" + exit 0 +fi + +if [ $smoke_stage = "versionci" ]; then + echo "versionci compile success" + exit 0 +fi + diff --git a/src/net/test b/src/net/test new file mode 100755 index 0000000..6d54b09 --- /dev/null +++ b/src/net/test @@ -0,0 +1,2 @@ + +#define CONFIG_MLX5_SF 1 diff --git a/src/net/test_tools/Makefile b/src/net/test_tools/Makefile new file mode 100644 index 0000000..a2b723a --- /dev/null +++ b/src/net/test_tools/Makefile @@ -0,0 +1,9 @@ +cc = gcc +prom = zxdh_net_test +source = zxdh_net_test.c + +$(prom): $(source) + $(cc) -o $(prom) $(source) + +clean: + @-rm -rf $(prom) diff --git a/src/net/test_tools/pkt_dtp_nopi_parse.txt b/src/net/test_tools/pkt_dtp_nopi_parse.txt new file mode 100644 index 0000000..a4d1846 --- /dev/null +++ b/src/net/test_tools/pkt_dtp_nopi_parse.txt @@ -0,0 +1,34 @@ +#[type] +02 1a 00 00 +#[pi] +81 23 00 00 00 00 00 00 00 56 00 46 00 30 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +#[pd] +00 00 00 00 00 00 00 00 88 a8 00 00 81 00 00 00 +#[dst mac] +22 22 22 22 22 1f +#[src mac] +22 22 22 22 22 2f +#[vlan] +81 00 00 64 +#[eth type] +08 00 +#[ip header] +45 00 00 32 c9 51 00 00 64 +#[ip protocol] +11 +#[ip checksum] +fb d5 +#[src ip] +c8 c8 00 01 +#[dst ip] +c8 c8 00 02 +#[src port] +f9 63 +#[dst port] +12 34 +#[udp len] +00 08 +#[udp checksum] +4c dc +#[payload] +00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 \ No newline at end of file diff --git a/src/net/test_tools/pkt_dtp_pi_parse.txt b/src/net/test_tools/pkt_dtp_pi_parse.txt new file mode 100644 index 0000000..91835d9 --- /dev/null +++ b/src/net/test_tools/pkt_dtp_pi_parse.txt @@ -0,0 +1,34 @@ +#[type] +02 1a 00 00 +#[pi] +01 23 00 00 00 00 00 00 00 46 00 5a 00 30 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +#[pd] +00 00 00 00 00 00 00 00 88 a8 00 00 81 00 00 00 +#[dst mac] +22 22 22 22 22 1f +#[src mac] +22 22 22 22 22 2f +#[vlan] +81 00 00 64 +#[eth type] +08 00 +#[ip header] +45 00 00 32 c9 51 00 00 64 +#[ip protocol] +11 +#[ip checksum] +fb d5 +#[src ip] +c8 c8 00 01 +#[dst ip] +c8 c8 00 02 +#[src port] +f9 63 +#[dst port] +12 34 +#[udp len] +00 08 +#[udp checksum] +4c dc +#[payload] +00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 \ No newline at end of file diff --git a/src/net/test_tools/pkt_dtp_pi_parse_lookside.txt b/src/net/test_tools/pkt_dtp_pi_parse_lookside.txt new file mode 100644 index 0000000..ee85868 --- /dev/null +++ b/src/net/test_tools/pkt_dtp_pi_parse_lookside.txt @@ -0,0 +1,34 @@ +#[type] +02 20 00 00 +#[pi] +01 27 00 00 00 00 00 00 00 56 00 6a 00 30 20 00 12 34 56 78 1a 2a 3a 4a 11 22 33 44 55 66 77 88 33 11 87 0b 13 30 ea 71 74 65 fd c3 46 6c 21 e5 +#[pd] +00 00 00 00 00 00 00 00 88 a8 00 00 81 00 00 00 +#[dst mac] +22 22 22 22 22 1f +#[src mac] +22 22 22 22 22 2f +#[vlan] +81 00 00 64 +#[eth type] +08 00 +#[ip header] +45 00 00 32 c9 51 00 00 64 +#[ip protocol] +11 +#[ip checksum] +fb d5 +#[src ip] +c8 c8 00 01 +#[dst ip] +c8 c8 00 02 +#[src port] +f9 63 +#[dst port] +12 34 +#[udp len] +00 08 +#[udp checksum] +4c dc +#[payload] +00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 \ No newline at end of file diff --git a/src/net/test_tools/pkt_np_128.txt b/src/net/test_tools/pkt_np_128.txt new file mode 100644 index 0000000..b31d068 --- /dev/null +++ b/src/net/test_tools/pkt_np_128.txt @@ -0,0 +1,35 @@ +#[type] +00 1a 00 00 +#[pi] +01 a9 00 00 00 00 00 00 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +#[pd] +00 00 00 00 00 00 00 00 88 a8 00 00 81 00 00 00 +#[dst mac] +22 22 22 22 22 0f +#[src mac] +22 22 22 22 22 2f +#[vlan] +81 00 00 64 +#[eth type] +08 00 +#[ip header] +45 00 00 32 c9 51 00 00 64 +#[ip protocol] +11 +#[ip checksum] +fb d5 +#[src ip] +c8 c8 00 01 +#[dst ip] +c8 c8 00 02 +#[src port] +f9 63 +#[dst port] +12 34 +#[udp len] +00 08 +#[udp checksum] +4c dc +#[payload] +00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 +00 00 00 00 00 00 01 28 \ No newline at end of file diff --git a/src/net/test_tools/zxdh_net_test.c b/src/net/test_tools/zxdh_net_test.c new file mode 100644 index 0000000..2bfc08a --- /dev/null +++ b/src/net/test_tools/zxdh_net_test.c @@ -0,0 +1,496 @@ +#include "zxdh_net_test.h" + + +cmd_table_t CMD_TABLE[] = +{ + {"h", HELP_CMD, CMD_PARA_NUM_TWO, zxdh_net_test_usage}, + {"r", GET_REG_CMD, CMD_PARA_NUM_FIVE, zxdh_get_reg}, + {"w", SET_REG_CMD, CMD_PARA_NUM_FIVE, zxdh_set_reg}, + {"vring", GET_VQ_INFO, CMD_PARA_NUM_SIX, zxdh_get_vring_info}, + {"msgq_config", SET_MSGQ_INFO, CMD_PARA_NUM_FOUR, zxdh_set_msgq_info}, + {"msgq_send", MSGQ_MSG_SEND, CMD_PARA_NUM_FIVE, zxdh_msgq_send_pkt}, + {"send_file_pkt", SEND_FILE_PKT, CMD_PARA_NUM_THREE, zxdh_send_file_pkt}, +}; +#define CMD_NUM(table) (sizeof(table) / sizeof(table[0])) + +uint32_t htoi(int8_t *str) +{ + int32_t i = 0; + uint32_t n = 0; + + if (NULL == str) + { + return ERR_INPUT_CMD_PARAMS; + } + + if ((str[0] == '0') && (str[1] == 'x' || str[1] == 'X')) + { + i = 2; + } + else + { + i = 0; + } + + for (; (str[i] >= '0' && str[i] <= '9') || (str[i] >= 'a' && str[i] <= 'f') || (str[i] >= 'A' && str[i] <= 'F'); ++i) + { + if (tolower(str[i]) > '9') + { + n = 16 * n + (10 + tolower(str[i]) - 'a'); + } + else + { + n = 16 * n + (tolower(str[i]) - '0'); + } + } + return n; +} + +int32_t zxdh_net_test_usage(__attribute__((unused)) const int32_t skfd, __attribute__((unused)) const int8_t *ifrname, + __attribute__((unused)) struct zxdh_en_reg *reg) +{ + printf("\nUsage: zxdh_net_test\n" + "Version: 1.0\n" + "[zxdh_net_test options]\n" + "./zxdh_net_test h print usage\n" + "./zxdh_net_test netdev_name r addr_offset reg_num read the register\n" + "./zxdh_net_test netdev_name w addr_offset value write the register\n" + "./zxdh_net_test netdev_name vring queue desc_index desc_num get the vring and desc_num desc informations from the desc_index\n" + "./zxdh_net_test netdev_name msgq_config loop_back print_data config msgq para\n" + "./zxdh_net_test netdev_name msgq_send pkt_len no_reps send_cnt msgq send pkt\n" + "./zxdh_net_test netdev_name send_file_pkt ./pkt.txt send packets with the specified packet contents including the self-defined header\n" + "\n"); + + return 0; +} + +int32_t zxdh_get_reg(const int32_t skfd, const int8_t *ifrname, struct zxdh_en_reg *reg) +{ + struct ifreq ifr; + int32_t i = 0; + + memset(&ifr, 0, sizeof(struct ifreq)); + strncpy(ifr.ifr_name, ifrname, IFNAMSIZ); + ifr.ifr_ifru.ifru_data = (void *)reg; + + if ((reg->offset + reg->num * 4) >= MAX_IOMAP_RANGE) + { + fprintf(stdout, "the offset:%#x, num=%#x is out of pci io map range!\n", reg->offset, reg->num); + return ERR_IOMAP_RANGE; + } + + if (ioctl(skfd, SIOCGMIIREG, &ifr) < 0) + { + fprintf(stderr, "SIOCGMIIREG on %s failed: %s\n", ifrname, strerror(errno)); + return ERRCMD; + } + + fprintf(stdout, "read register offset:%#x, num=%#x\n", reg->offset, reg->num); + for (i = 0; i < reg->num; i++) + { + fprintf(stdout, "0x%.8x: 0x%.8x ", reg->offset + i * 4, reg->data[i]); + if(((i + 1) % 4) == 0) + { + fprintf(stdout, "\n"); + } + } + fprintf(stdout, "\n"); + + return 0; +} + +int32_t zxdh_set_reg(const int32_t skfd, const int8_t *ifrname, struct zxdh_en_reg *reg) +{ + struct ifreq ifr; + int32_t i = 0; + + memset(&ifr, 0, sizeof(struct ifreq)); + strncpy(ifr.ifr_name, ifrname, IFNAMSIZ); + ifr.ifr_ifru.ifru_data = (void *)reg; + + if ((reg->offset + reg->num * 4) >= MAX_IOMAP_RANGE) + { + fprintf(stderr, "the offset:%#x, num=%#x is out of pci io map range!\n", reg->offset, reg->num); + return ERR_IOMAP_RANGE; + } + + if (ioctl(skfd, SIOCSMIIREG, &ifr) < 0) + { + fprintf(stderr, "SIOCSMIIREG on %s failed: %s\n", ifrname, strerror(errno)); + return ERRCMD; + } + + fprintf(stdout, "write register offset:%#x, num=%#x\n", reg->offset, reg->num); + for (i = 0; i < reg->num; i++) + { + if(((i + 1) % 4) == 0) + { + fprintf(stdout, "\n"); + } + fprintf(stdout, "0x%.8x: 0x%.8x ", reg->offset + i * 4, reg->data[i]); + } + fprintf(stdout, "\n"); + + return 0; +} + +int32_t zxdh_get_vring_info(const int32_t skfd, const int8_t *ifrname, struct zxdh_en_reg *reg) +{ + struct ifreq ifr; + + memset(&ifr, 0, sizeof(struct ifreq)); + strncpy(ifr.ifr_name, ifrname, IFNAMSIZ); + ifr.ifr_ifru.ifru_data = (void *)reg; + + if (ioctl(skfd, SIOCDEVPRIVATE_VQ_INFO, &ifr) < 0) + { + fprintf(stderr, "SIOCDEVPRIVATE_VQ_INFO on %s failed: %s\n", ifrname, strerror(errno)); + return ERRCMD; + } + + return 0; +} + +int32_t zxdh_set_msgq_info(const int32_t skfd, const int8_t *ifrname, struct zxdh_en_reg *reg) +{ + struct ifreq ifr; + int32_t i = 0; + + memset(&ifr, 0, sizeof(struct ifreq)); + strncpy(ifr.ifr_name, ifrname, IFNAMSIZ); + ifr.ifr_ifru.ifru_data = (void *)reg; + + if (ioctl(skfd, SIOCDEVPRIVATE_MSGQ_CONFIG, &ifr) < 0) + { + fprintf(stderr, "SIOCDEVPRIVATE_MSGQ_CONFIG on %s failed: %s\n", ifrname, strerror(errno)); + return ERRCMD; + } + + fprintf(stdout, "set msgq loop_back:%d\n", reg->data[0]); + fprintf(stdout, "set msgq print_flag:%d\n", reg->data[1]); + + return 0; +} + +int32_t zxdh_msgq_send_pkt(const int32_t skfd, const int8_t *ifrname, struct zxdh_en_reg *reg) +{ + struct ifreq ifr; + int32_t i = 0; + + memset(&ifr, 0, sizeof(struct ifreq)); + strncpy(ifr.ifr_name, ifrname, IFNAMSIZ); + ifr.ifr_ifru.ifru_data = (void *)reg; + + if (ioctl(skfd, SIOCDEVPRIVATE_MSGQ_SNED, &ifr) < 0) + { + fprintf(stderr, "SIOCDEVPRIVATE_MSGQ_SNED on %s failed: %s\n", ifrname, strerror(errno)); + return ERRCMD; + } + + return -reg->num; +} + +int32_t zxdh_send_file_pkt(const int32_t skfd, const int8_t *ifrname, struct zxdh_en_reg *reg) +{ + struct ifreq ifr; + + memset(&ifr, 0, sizeof(struct ifreq)); + strncpy(ifr.ifr_name, ifrname, IFNAMSIZ); + ifr.ifr_ifru.ifru_data = (void *)reg; + + if (ioctl(skfd, SIOCDEVPRIVATE_SEND_FILE_PKT, &ifr) < 0) + { + fprintf(stderr, "SIOCDEVPRIVATE_SEND_FILE_PKT on %s failed: %s\n", ifrname, strerror(errno)); + return ERRCMD; + } + + fprintf(stdout, "try to send file packets success\n"); + + return 0; +} + +bool is_cmd_valid(const int32_t cmd) +{ + if ((cmd < MIN_CMD) || (cmd > MAX_CMD)) + { + return false; + } + return true; +} + +int32_t get_cmd(int8_t *cmd_argv) +{ + int32_t cmd = 0; + int32_t i = 0; + + for (i = 0; i < CMD_NUM(CMD_TABLE); i++) + { + if (cmd_argv == NULL) + { + cmd = CMD_TABLE[i].cmd; + return cmd; + } + + if (strcmp(cmd_argv, CMD_TABLE[i].argv) == 0) + { + cmd = CMD_TABLE[i].cmd; + } + } + return cmd; +} + +int32_t check_cmd_para_num(const int32_t cmd, const int32_t para_num) +{ + int32_t cmd_para_num = 0; + int32_t i = 0; + + for (i = 0; i < CMD_NUM(CMD_TABLE); i++) + { + if (CMD_TABLE[i].cmd == cmd) + { + cmd_para_num = CMD_TABLE[i].para_num; + break; + } + } + + if (para_num < cmd_para_num) + { + fprintf(stderr, "cmd %d need para_num =%d, but %d paras input is given!\n", cmd, cmd_para_num, para_num); + return ERRCMD; + } + return 0; +} + +int32_t get_reg_cmd_para(int8_t **argv, struct zxdh_en_reg *reg) +{ + reg->offset = htoi(argv[3]); + reg->num = (uint32_t)atoi(argv[4]); + + return 0; +} + +int32_t set_reg_cmd_para(int8_t **argv, struct zxdh_en_reg *reg) +{ + int32_t i = 0; + + reg->offset = htoi(argv[3]); + reg->num = (uint32_t)atoi(argv[4]); + + while ((i < reg->num) && argv[5 + i]) + { + reg->data[i] = htoi(argv[5 + i]); + i++; + } + + return 0; +} + +int32_t get_vring_info_cmd_para(int8_t **argv, struct zxdh_en_reg *reg) +{ + reg->offset = (uint32_t)atoi(argv[3]); + reg->num = (uint32_t)atoi(argv[4]); + reg->data[0] = (uint32_t)atoi(argv[5]); + + return 0; +} + +int32_t set_msgq_info_para(int8_t **argv, struct zxdh_en_reg *reg) +{ + reg->data[0] = (uint32_t)atoi(argv[3]); + reg->data[1] = (uint32_t)atoi(argv[4]); + return 0; +} + +int32_t msgq_msg_send_para(int8_t **argv, struct zxdh_en_reg *reg) +{ + reg->data[0] = (uint32_t)atoi(argv[3]); + reg->data[1] = (uint32_t)atoi(argv[4]); + reg->data[2] = (uint32_t)atoi(argv[5]); + return 0; +} + +uint32_t delet_str_spec(uint8_t *pstr, uint32_t len) +{ + uint16_t i = 0; + uint16_t j = 0; + uint8_t *buf = pstr; + + for (i = 0; i < len; i++) + { + if (pstr[i] == '\0') + { + break; + } + + if ((pstr[i] != ' ') && (pstr[i] != '\n')) + { + *(buf + j) = pstr[i]; + j++; + } + } + if (j < i) + { + memset(buf + j, 0, (i - j)); + } + + return j; +} + +uint32_t hexstr_to_data(uint8_t *pstr, uint32_t len, uint32_t *data) +{ + int8_t hexbuf[3] = {0}; + uint32_t i = 0; + uint32_t loop = 0; + + if (len % 2) + { + len -= 1; + } + loop = len / 2; + for (i = 0; i < loop; i++) + { + memset(hexbuf, 0, sizeof(hexbuf)); + memcpy(hexbuf, &pstr[2*i], 2); + data[i] = htoi(hexbuf); + fprintf(stdout, "%.2x ", data[i]); + } + fprintf(stdout, "\n"); + + return i; +} + +int32_t get_para_from_file(int8_t **argv, struct zxdh_en_reg *reg) +{ + int8_t filename[100] = {0}; + int8_t buf[1000] = {0}; + int32_t i = 0; + FILE *f = NULL; + uint32_t len = 0; + + strncpy(filename, argv[3], strlen(argv[3])); + filename[strlen(argv[3])] = '\0'; + if ((f = fopen(filename, "r")) == NULL) + { + fprintf(stdout, "get_para_from_file: cannot open %s\n", filename); + return ERR_INPUT_CMD_PARAMS; + } + memset(reg, 0, sizeof(struct zxdh_en_reg)); + + fprintf(stdout, "read file pkt:\n"); + while (fgets(buf, sizeof(buf), f) != NULL) + { + if ((buf[0] != '\n') && (buf[0] != '#')) + { + len = delet_str_spec(buf, strlen(buf)); + reg->num += hexstr_to_data(buf, len, (uint32_t *)®->data[reg->num]); + } + } + fprintf(stdout, "pkt len: %d\n\n", reg->num); + + fclose(f); + + return 0; +} + +struct get_cmd_para_table cmd_para_table[] = +{ + {HELP_CMD, NULL}, + {GET_REG_CMD, get_reg_cmd_para}, + {SET_REG_CMD, set_reg_cmd_para}, + {GET_VQ_INFO, get_vring_info_cmd_para}, + {SET_MSGQ_INFO, set_msgq_info_para}, + {MSGQ_MSG_SEND, msgq_msg_send_para}, + {SEND_FILE_PKT, get_para_from_file}, +}; + +int32_t get_cmd_para(const int32_t cmd, int8_t **argv, struct zxdh_en_reg *reg) +{ + int32_t i = 0; + int32_t ret = 0; + + if (NULL == argv) + { + fprintf(stdout, "%s %d pointer is null!\n", __FUNCTION__, __LINE__); + return ERR_INPUT_CMD_PARAMS; + } + + memset((void *)reg, 0, sizeof(struct zxdh_en_reg)); + for (i = 0; i < CMD_NUM(cmd_para_table); i++) + { + if ((cmd == cmd_para_table[i].cmd) && (cmd_para_table[i].func)) + { + ret = cmd_para_table[i].func(argv, reg); + } + } + + return ret; +} + +int32_t get_cmd_and_para(const int32_t argc, int8_t **argv, int8_t *ifrname, struct zxdh_en_reg *reg) +{ + int32_t cmd = 0; + int32_t ret = 0; + + cmd = get_cmd(argv[2]); + fprintf(stdout, "cmd = %d\n", cmd); + + if (!is_cmd_valid(cmd)) + { + fprintf(stderr, "cmd %d invalid\n", cmd); + return ERRCMD; + } + + if (check_cmd_para_num(cmd, argc) < 0) + { + fprintf(stderr, "para num check failed!\n"); + return ERRCMD; + } + + ifrname = argv[1]; + ret = get_cmd_para(cmd, argv, reg); + if (ret < 0) + { + fprintf(stderr, "get detail cmd para failed, ret %d!\n", ret); + return ERRCMD; + } + + return cmd; +} + +int32_t main(int32_t argc, int8_t **argv) +{ + int8_t *ifrname = NULL; + int32_t skfd = -1; + int32_t ret = 0; + int32_t cmd = 0; + uint32_t num = 0; + uint32_t i = 0; + struct zxdh_en_reg reg = {0}; + + for (num = 0; num < argc; num++) + { + fprintf(stdout, "argv[%d]: %s\n", num, argv[num]); + } + + memset(®, 0, sizeof(struct zxdh_en_reg)); + ifrname = argv[1]; + cmd = get_cmd_and_para(argc, argv, ifrname, ®); + + if ((skfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) + { + fprintf(stderr, "socket error\n"); + return ERR_SOCKET; + } + + for (i = 0; i < CMD_NUM(CMD_TABLE); i++) + { + if ((cmd == CMD_TABLE[i].cmd) && (CMD_TABLE[i].func)) + { + ret = CMD_TABLE[i].func(skfd, ifrname, ®); + } + } + + close(skfd); + fprintf(stdout, "ret=%d\n", ret); + return ret; +} diff --git a/src/net/test_tools/zxdh_net_test.h b/src/net/test_tools/zxdh_net_test.h new file mode 100644 index 0000000..d716959 --- /dev/null +++ b/src/net/test_tools/zxdh_net_test.h @@ -0,0 +1,100 @@ +#ifndef _ZXDH_NET_TEST_ +#define _ZXDH_NET_TEST_ + +#ifdef __cplusplus + extern "C" { +#endif /* __cplusplus */ + + +#include <stdio.h> +#include <stdint.h> +#include <stdbool.h> +#include <string.h> +#include <errno.h> +#include <fcntl.h> +#include <getopt.h> +#include <sys/socket.h> +#include <sys/ioctl.h> +#include <net/if.h> +#include <stdlib.h> +#include <unistd.h> +#include <linux/ethtool.h> +#include <linux/sockios.h> +#include <sys/mman.h> +#include <pthread.h> +#include <time.h> +#include <sys/types.h> +#include <dirent.h> +#include <ctype.h> + + +/* command */ +#define ERRCMD (-1) +#define MIN_CMD 0 +#define MAX_CMD 6 +#define HELP_CMD MIN_CMD +#define GET_REG_CMD 1 +#define SET_REG_CMD 2 +#define GET_VQ_INFO 3 +#define SET_MSGQ_INFO 4 +#define MSGQ_MSG_SEND 5 +#define SEND_FILE_PKT MAX_CMD + +#define MAX_IOMAP_RANGE (256 * 1024) + +#define ERR_SOCKET (-1) +#define ERR_IOMAP_RANGE (-3) +#define ERR_INPUT_CMD_PARAMS (-4) + +#define CMD_PARA_NUM_TWO 2 +#define CMD_PARA_NUM_THREE 3 +#define CMD_PARA_NUM_FOUR 4 +#define CMD_PARA_NUM_FIVE 5 +#define CMD_PARA_NUM_SIX 6 +#define CMD_PARA_NUM_EIGHT 8 +#define CMD_PARA_NUM_NINE 9 + +#define SIOCDEVPRIVATE_VQ_INFO (SIOCDEVPRIVATE + 2) +#define SIOCDEVPRIVATE_MSGQ_SNED (SIOCDEVPRIVATE + 3) +#define SIOCDEVPRIVATE_MSGQ_CONFIG (SIOCDEVPRIVATE + 4) +#define SIOCDEVPRIVATE_SEND_FILE_PKT (SIOCDEVPRIVATE + 6) + +#define MAX_ACCESS_NUM 500 +struct zxdh_en_reg +{ + uint32_t offset; + uint32_t num; + uint32_t data[MAX_ACCESS_NUM]; +}; + +typedef int32_t (*function)(const int32_t skfd, const int8_t *ifrname, struct zxdh_en_reg *reg); + +typedef struct +{ + int8_t *argv; + int32_t cmd; + int32_t para_num; + function func; +}cmd_table_t; + +struct get_cmd_para_table +{ + int32_t cmd; + int32_t (*func)(int8_t **argv, struct zxdh_en_reg *reg); +}; + +int32_t zxdh_net_test_usage(__attribute__((unused)) const int32_t skfd, __attribute__((unused)) const int8_t *ifrname, + __attribute__((unused)) struct zxdh_en_reg *reg); +int32_t zxdh_get_reg(const int32_t skfd, const int8_t *ifrname, struct zxdh_en_reg *reg); +int32_t zxdh_set_reg(const int32_t skfd, const int8_t *ifrname, struct zxdh_en_reg *reg); +int32_t zxdh_get_vring_info(const int32_t skfd, const int8_t *ifrname, struct zxdh_en_reg *reg); +int32_t zxdh_set_msgq_info(const int32_t skfd, const int8_t *ifrname, struct zxdh_en_reg *reg); +int32_t zxdh_msgq_send_pkt(const int32_t skfd, const int8_t *ifrname, struct zxdh_en_reg *reg); +int32_t zxdh_send_file_pkt(const int32_t skfd, const int8_t *ifrname, struct zxdh_en_reg *reg); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _ZXDH_NET_TEST_ */ diff --git a/src/net/upload.sh b/src/net/upload.sh new file mode 100755 index 0000000..869e21d --- /dev/null +++ b/src/net/upload.sh @@ -0,0 +1,201 @@ +#!/bin/bash + +#接收参数 +upload_stage=$1 +chg_branch=$2 +env_user=$3 +env_pwd=$4 + +#ver_path固定不变,各组件需要修改的只有root_dir +ver_path=/zte +root_dir=$ver_path/zxdh_kernel #(各组件根据实际调整) + + +#获取库下面的制品名称(制品在前面compile阶段已生成) +cd ${root_dir}/kernel-src + +if [ "$upload_stage" = "versionci" ]; then + echo "versionci upload start" + pf_tgz_name=$(ls | grep "^zxdh-eth-.*daily\.src\.tgz$") + host_hpf_tgz_name=$(ls | grep "^zxdh-neo-host-hpf-.*daily\.src\.tgz$") + zf_mpf_tgz_name=$(ls | grep "^zxdh-neo-mpf-.*daily\.src\.tgz$") +fi + +if [ "$upload_stage" = "postci" ]; then + echo "postci upload start" + pf_tgz_name=$(ls | grep "^zxdh-eth-.*\.src\.tgz$") + host_hpf_tgz_name=$(ls | grep "^zxdh-neo-host-hpf-.*\.src\.tgz$") + zf_mpf_tgz_name=$(ls | grep "^zxdh-neo-mpf-.*\.src\.tgz$") +fi + +if [ "$pf_tgz_name" = "" -o "$host_hpf_tgz_name" = "" -o "$zf_mpf_tgz_name" = "" ]; then + echo "找不到相关制品" + exit 1 +fi + +cd ${root_dir} +host_arm_en_pf_rpm=$(ls | grep "^zxdh-eth-.*\.cgsl${NXI_Host_CGS_kernel_aarch64:1}\.aarch64\.rpm$") +host_x86_en_pf_rpm=$(ls | grep "^zxdh-eth-.*\.cgsl${NXI_Host_CGS_kernel_X86:1}\.x86_64\.rpm$") +host_arm_hpf_rpm=$(ls | grep "^zxdh-hpf-.*\.cgsl${NXI_Host_CGS_kernel_aarch64:1}\.aarch64\.rpm$") +host_x86_hpf_rpm=$(ls | grep "^zxdh-hpf-.*\.cgsl${NXI_Host_CGS_kernel_X86:1}\.x86_64\.rpm$") +zf_arm_en_pf_rpm=$(ls | grep "^zxdh-eth-.*\.cgsl${DPU_CGS_kernel_aarch64:1}\.aarch64\.rpm$") +zf_arm_zf_mpf_rpm=$(ls | grep "^zxdh-zf-mpf-.*\.cgsl${DPU_CGS_kernel_aarch64:1}\.aarch64\.rpm$") +dpu_config_rpm=$(ls | grep "zxdh-dpu-config") +smartnic_config_rpm=$(ls | grep "zxdh-smartnic-config") + +if [ "$host_arm_en_pf_rpm" = "" ]; then + echo "找不到 host-arm en_pf rpm制品" + exit 1 +fi +if [ "$host_x86_en_pf_rpm" = "" ]; then + echo "找不到 host-x86 en_pf rpm制品" + exit 1 +fi +if [ "$host_arm_hpf_rpm" = "" ]; then + echo "找不到 host-arm hpf rpm制品" + exit 1 +fi +if [ "$host_x86_hpf_rpm" = "" ]; then + echo "找不到 host-x86 hpf rpm制品" + exit 1 +fi +if [ "$zf_arm_zf_mpf_rpm" = "" ]; then + echo "找不到 zf-arm zf_mpf rpm制品" + exit 1 +fi +if [ "$zf_arm_en_pf_rpm" = "" ]; then + echo "找不到 zf-arm en_pf rpm制品" + exit 1 +fi +if [ "$dpu_config_rpm" = "" ]; then + echo "找不到dpu_config rpm制品" + exit 1 +fi +if [ "$smartnic_config_rpm" = "" ]; then + echo "找不到smartnic_config rpm制品" + exit 1 +fi + +echo "全部找到" +echo "pf_tgz_name ${pf_tgz_name}" +echo "host_hpf_tgz_name ${host_hpf_tgz_name}" +echo "zf_mpf_tgz_name ${zf_mpf_tgz_name}" +echo "host_arm_en_pf_rpm ${host_arm_en_pf_rpm}" +echo "host_x86_en_pf_rpm ${host_x86_en_pf_rpm}" +echo "host_arm_hpf_rpm ${host_arm_hpf_rpm}" +echo "host_x86_hpf_rpm ${host_x86_hpf_rpm}" +echo "zf_arm_en_pf_rpm ${zf_arm_en_pf_rpm}" +echo "zf_arm_zf_mpf_rpm ${zf_arm_zf_mpf_rpm}" +echo "dpu_config_rpm ${dpu_config_rpm}" +echo "smartnic_config_rpm ${smartnic_config_rpm}" + +#制品库路径:即各组件版本/制品在制品库上的存放目录 +art_path="https://artsz.zte.com.cn:443/artifactory/dinghai-snapshot-generic/dpu_sdk/net/driver/zxdh_kernel/${chg_branch}" #(各组件根据实际调整) + +#版本/制品本地路径:即各组件版本/制品在库下面的存放(生成)路径+制品/版本名称 +art_pf_tgz_src="${root_dir}/kernel-src/${pf_tgz_name}" +art_host_hpf_src="${root_dir}/kernel-src/${host_hpf_tgz_name}" +art_zf_mpf_src="${root_dir}/kernel-src/${zf_mpf_tgz_name}" +art_host_arm_en_pf_src="${root_dir}/${host_arm_en_pf_rpm}" +art_host_x86_en_pf_src="${root_dir}/${host_x86_en_pf_rpm}" +art_host_arm_hpf_src="${root_dir}/${host_arm_hpf_rpm}" +art_host_x86_hpf_src="${root_dir}/${host_x86_hpf_rpm}" +art_zf_arm_en_pf_src="${root_dir}/${zf_arm_en_pf_rpm}" +art_zf_arm_zf_mpf_src="${root_dir}/${zf_arm_zf_mpf_rpm}" +art_src2="${root_dir}/${dpu_config_rpm}" +art_src3="${root_dir}/${smartnic_config_rpm}" + +art_user="-u${env_user}:${env_pwd}" + +#版本/制品名:(按照规范来) +art_pf_tgz_name="${pf_tgz_name}" +art_host_hpf_name="${host_hpf_tgz_name}" +art_zf_mpf_name="${zf_mpf_tgz_name}" +art_host_arm_en_pf_name="${host_arm_en_pf_rpm}" +art_host_x86_en_pf_name="${host_x86_en_pf_rpm}" +art_host_arm_hpf_name="${host_arm_hpf_rpm}" +art_host_x86_hpf_name="${host_x86_hpf_rpm}" +art_zf_arm_en_pf_name="${zf_arm_en_pf_rpm}" +art_zf_arm_zf_mpf_name="${zf_arm_zf_mpf_rpm}" +art_name2="${dpu_config_rpm}" +art_name3="${smartnic_config_rpm}" + +regex="202[3-9]{1}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])" +gen_data=$(echo ${art_host_x86_en_pf_name} | grep -oE "$regex") +git_ver_path="git_ver/${gen_data}" +#一次只上传单个制品/版本以下内容无需修改,如果需要一次上传多个制品,增加art_dst和curl操作 +art_pf_tgz_dst1="${art_path}/${git_ver_path}/${art_pf_tgz_name}" +art_pf_tgz_dst2="${art_path}/last/${art_pf_tgz_name}" +art_host_hpf_dst1="${art_path}/${git_ver_path}/${art_host_hpf_name}" +art_host_hpf_dst2="${art_path}/last/${art_host_hpf_name}" +art_zf_mpf_dst1="${art_path}/${git_ver_path}/${art_zf_mpf_name}" +art_zf_mpf_dst2="${art_path}/last/${art_zf_mpf_name}" + +art_host_arm_en_pf_dst1="${art_path}/${git_ver_path}/${art_host_arm_en_pf_name}" +art_host_arm_en_pf_dst2="${art_path}/last/${art_host_arm_en_pf_name}" + +art_host_x86_en_pf_dst1="${art_path}/${git_ver_path}/${art_host_x86_en_pf_name}" +art_host_x86_en_pf_dst2="${art_path}/last/${art_host_x86_en_pf_name}" + +art_host_arm_hpf_dst1="${art_path}/${git_ver_path}/${art_host_arm_hpf_name}" +art_host_arm_hpf_dst2="${art_path}/last/${art_host_arm_hpf_name}" + +art_host_x86_hpf_dst1="${art_path}/${git_ver_path}/${art_host_x86_hpf_name}" +art_host_x86_hpf_dst2="${art_path}/last/${art_host_x86_hpf_name}" + +art_zf_arm_en_pf_dst1="${art_path}/${git_ver_path}/${art_zf_arm_en_pf_name}" +art_zf_arm_en_pf_dst2="${art_path}/last/${art_zf_arm_en_pf_name}" + +art_zf_arm_zf_mpf_dst1="${art_path}/${git_ver_path}/${art_zf_arm_zf_mpf_name}" +art_zf_arm_zf_mpf_dst2="${art_path}/last/${art_zf_arm_zf_mpf_name}" + +art_dst5="${art_path}/${git_ver_path}/${art_name2}" +art_dst6="${art_path}/last/${art_name2}" + +art_dst7="${art_path}/${git_ver_path}/${art_name3}" +art_dst8="${art_path}/last/${art_name3}" + +last_files=$(curl -k ${art_user} -X GET ${art_path}/last/) + +for file in ${last_files} +do + if [[ ${file} =~ "href=" ]] + then + file_name=$(echo ${file#*>} | sed -e 's/<\/a>//') + if [[ ${file_name} != "../" ]] + then + curl -k ${art_user} -X DELETE ${art_path}/last/${file_name} + fi + fi +done +curl -k ${art_user} -T ${art_pf_tgz_src} ${art_pf_tgz_dst1} +curl -k ${art_user} -T ${art_pf_tgz_src} ${art_pf_tgz_dst2} +curl -k ${art_user} -T ${art_host_hpf_src} ${art_host_hpf_dst1} +curl -k ${art_user} -T ${art_host_hpf_src} ${art_host_hpf_dst2} +curl -k ${art_user} -T ${art_zf_mpf_src} ${art_zf_mpf_dst1} +curl -k ${art_user} -T ${art_zf_mpf_src} ${art_zf_mpf_dst2} + +curl -k ${art_user} -T ${art_host_arm_en_pf_src} ${art_host_arm_en_pf_dst1} +curl -k ${art_user} -T ${art_host_arm_en_pf_src} ${art_host_arm_en_pf_dst2} + +curl -k ${art_user} -T ${art_host_x86_en_pf_src} ${art_host_x86_en_pf_dst1} +curl -k ${art_user} -T ${art_host_x86_en_pf_src} ${art_host_x86_en_pf_dst2} + +curl -k ${art_user} -T ${art_host_arm_hpf_src} ${art_host_arm_hpf_dst1} +curl -k ${art_user} -T ${art_host_arm_hpf_src} ${art_host_arm_hpf_dst2} + +curl -k ${art_user} -T ${art_host_x86_hpf_src} ${art_host_x86_hpf_dst1} +curl -k ${art_user} -T ${art_host_x86_hpf_src} ${art_host_x86_hpf_dst2} + +curl -k ${art_user} -T ${art_zf_arm_en_pf_src} ${art_zf_arm_en_pf_dst1} +curl -k ${art_user} -T ${art_zf_arm_en_pf_src} ${art_zf_arm_en_pf_dst2} + +curl -k ${art_user} -T ${art_zf_arm_zf_mpf_src} ${art_zf_arm_zf_mpf_dst1} +curl -k ${art_user} -T ${art_zf_arm_zf_mpf_src} ${art_zf_arm_zf_mpf_dst2} + +curl -k ${art_user} -T ${art_src2} ${art_dst5} +curl -k ${art_user} -T ${art_src2} ${art_dst6} + +curl -k ${art_user} -T ${art_src3} ${art_dst7} +curl -k ${art_user} -T ${art_src3} ${art_dst8} +exit 0 diff --git a/src/net/ut.sh b/src/net/ut.sh new file mode 100755 index 0000000..2dfe825 --- /dev/null +++ b/src/net/ut.sh @@ -0,0 +1,6 @@ +#!/bin/bash + + +#暂时没实现的,固定返回0,后期如果实现,根据各组件自身需求调整该脚本 +exit 0 + diff --git a/src/net/zxdh_eth_rpm_build.sh b/src/net/zxdh_eth_rpm_build.sh new file mode 100755 index 0000000..ae96d67 --- /dev/null +++ b/src/net/zxdh_eth_rpm_build.sh @@ -0,0 +1,276 @@ +#!/bin/bash +host_arch=$(uname -m) +dist=$(rpm --eval %{dist}) +build_kernel=$(uname -r) + +usage() +{ +cat <<EOF +Usage: + ${0##*/} --rpm-driver-name <driver_name> + --rpm-driver-version <driver_version> + --rpm-driver-release <driver_release> + --rpm-config-name <config_name> [ zxdh-smartnic-config | zxdh-dpu-config ] + --rpm-config-version <config_version> + --rpm-config-release <config_release> + --eth-driver-version <eth_driver_version> + --ksrc <kernel_source_path> + --cross-compile <cross_compile_path> + --target-arch <target_arch> [ x86_64 | aarch64 ] + --dist <kernel source dist> [ .el8 | .zncgsl6 ] + --output-dir <outputdir> [options] + +Options: + --rpm-driver-name <driver_name> Set rpm driver name (default: zxdh-eth) + --rpm-driver-version <driver_version> Set rpm driver version (default: 1.0) + --rpm-driver-release <driver_release> Set rpm driver release (default: 1) + --rpm-config-name <config_name> Set rpm config name (default: zxdh-smartnic-config) + --rpm-config-version <config_version> Set rpm config version (default: 1.0) + --rpm-config-release <config_release> Set rpm config release (default: 1) + --eth-driver-version <eth_driver_version> Set eth driver version (default: 1.0-0) + --ksrc <kernel_source> Set kernel source path (default: /lib/modules/$(uname -r)/source) + --cross-compile <cross_compile_path> Set cross compile tools path (default(Don't cross compile): None) + --target-arch <traget_arch> Set the target arch (default(current arch): $(uname -m)) + --dist <kernel source dist> Set the kernel source dist (default(current dist): $(rpm --eval %{dist})) + --output-dir <outputdir> Change rpm output dir (default(working dir): $(pwd)) + -h, --help Show help message + +Output: + - build driver binary rpm package(eg: zxdh-eth-1.0-1$(rpm --eval %{dist}).$(uname -m).rpm) and copy it to dir (--output-dir eg: $(pwd)) + - build config rpm package(eg: zxdh-smartnic-config-1.0-1.rpm) and copy it to dir (--output-dir eg: $(pwd)) +EOF +} + +show_args() +{ +cat <<EOF +********************************************** +kernel source: $ksrc +kernel dist: $dist +host arch: $host_arch +target arch: $target_arch_info +cross compile: $cross_compile_info +eth driver version: $eth_driver_version +********************************************** +rpm dirver name: $rpm_driver_name +rpm driver version: $rpm_driver_version +rpm driver release: $rpm_driver_release +********************************************** +rpm config name: $rpm_config_name +rpm config version: $rpm_config_version +rpm config release: $rpm_config_release +********************************************** +output dir: $output_dir +********************************************** +EOF +} + +while [ ! -z "$1" ] +do + case "$1" in + --rpm-driver-name) + rpm_driver_name="$2" + shift + ;; + --rpm-driver-version) + rpm_driver_version="$2" + shift + ;; + --rpm-driver-release) + rpm_driver_release="$2" + shift + ;; + --rpm-mpf-name) + rpm_mpf_name="$2" + shift + ;; + --rpm-mpf-version) + rpm_mpf_version="$2" + shift + ;; + --rpm-mpf-release) + rpm_mpf_release="$2" + shift + ;; + --rpm-config-name) + rpm_config_name="$2" + shift + ;; + --rpm-config-version) + rpm_config_version="$2" + shift + ;; + --rpm-config-release) + rpm_config_release="$2" + shift + ;; + --eth-driver-version) + eth_driver_version="$2" + shift + ;; + --ksrc) + ksrc="$2" + shift + ;; + --build-mpf) + build_mpf="$2" + shift + ;; + --cross-compile) + cross_compile="$2" + shift + ;; + --target-arch) + target_arch="$2" + shift + ;; + --dist) + dist="$2" + shift + ;; + --output-dir) + output_dir="$2" + shift + ;; + -h | *help) + usage + exit 0 + ;; + *) + echo "-E- Unsupported option: $1" >&2 + exit 1 + ;; + esac + shift +done + +# Some input verification +if [ -z "$rpm_driver_name" ]; then + rpm_driver_name="zxdh-eth" +fi +if [ -z "$rpm_driver_version" ]; then + rpm_driver_version="1.0" +fi +if [ -z "$rpm_driver_release" ]; then + rpm_driver_release="1" +fi +if [ -z "$rpm_config_name" ]; then + rpm_config_name="zxdh-smartnic-config" +fi +if [ -z "$rpm_config_version" ]; then + rpm_config_version="1.0" +fi +if [ -z "$rpm_config_release" ]; then + rpm_config_release="1" +fi +if [ -z "$eth_driver_version" ]; then + eth_driver_version="1.0-1" +fi +if [ -z "$ksrc" ]; then + ksrc="/lib/modules/$(uname -r)/source" +fi +if [ -z "$cross_compile" ]; then + cross_compile_info="Don't corss compile..." +else + cross_compile_info=$cross_compile +fi +if [ -z "$target_arch" ]; then + target_arch=$host_arch + target_arch_info="$target_arch (Don't corss compile, same as host arch)" +else + target_arch_info=$target_arch +fi +if [ -z "$output_dir" ]; then + output_dir=$(pwd) +fi +if [ ! -d $ksrc ]; then + echo "-E- $ksrc is not exists" >&2 + exit 1 +fi +if [ ! -d $output_dir ]; then + mkdir -p $output_dir + if [ $? -ne 0 ]; then + echo "-E- Failed to create $outputdir" >&2 + exit 1 + fi +fi + +show_args +sleep 3 + +tmpdir=$(mktemp -d /tmp/$rpm_driver_name.XXXXXX) +if [ ! -d "$tmpdir" ]; then + echo "-E- Failed to create $tmpdir!" >&2 + exit 1 +fi +trap "/bin/rm -rf $tmpdir" EXIT + +cp -r ../zxdh_kernel $tmpdir +cd $tmpdir +cd zxdh_kernel + +# 将spec文件拷贝到zxdh_kernel目录下 制作rpm包 +cp build/spec/zxdh-eth.spec.example ./zxdh-eth.spec +cd $tmpdir +tar czf $rpm_driver_name-$rpm_driver_version-$rpm_driver_release.tar.gz ./zxdh_kernel/ + +zxdh_eth_rpm=$rpm_driver_name-$rpm_driver_version-$rpm_driver_release$dist.$target_arch.rpm +zxdh_config_rpm=$rpm_config_name-$rpm_config_version-$rpm_config_release.noarch.rpm + +if [ -d "$HOME/rpmbuild/RPMS/$target_arch" ]; then + cd $HOME/rpmbuild/RPMS/$target_arch + if [ -f "$zxdh_eth_rpm" ]; then + rm $zxdh_eth_rpm + fi +fi + +if [ -d "$HOME/rpmbuild/RPMS/noarch" ]; then + cd $HOME/rpmbuild/RPMS/noarch + if [ -f "$zxdh_config_rpm" ]; then + rm $zxdh_config_rpm + fi +fi + +cd $tmpdir + +# make rpmbuild parameters +rpm_build_args=() +if [ "$target_arch" != "$host_arch" ]; then + # 交叉编译 + rpm_build_args+=( --target $target_arch) + rpm_build_args+=( --define "target $target_arch") + rpm_build_args+=( --define "CROSS_COMPILE $cross_compile") +fi + +rpm_build_args+=( --define "_name $rpm_driver_name") +rpm_build_args+=( --define "_version $rpm_driver_version") +rpm_build_args+=( --define "_release $rpm_driver_release") + +rpm_build_args+=( --define "_config_name $rpm_config_name") +rpm_build_args+=( --define "_config_version $rpm_config_version") +rpm_build_args+=( --define "_config_release $rpm_config_release") + +rpm_build_args+=( --define "ETH_DRI_VER $eth_driver_version") + +rpm_build_args+=( --define "KSRC $ksrc") + +rpm_build_args+=( --define "dist $dist") +rpm_build_args+=( ./$rpm_driver_name-$rpm_driver_version-$rpm_driver_release.tar.gz) + +rpmbuild -tb "${rpm_build_args[@]}" + +cd $HOME/rpmbuild/RPMS/$target_arch + +if [ -f "$zxdh_eth_rpm" ]; then + cp $zxdh_eth_rpm $output_dir + rm $zxdh_eth_rpm +fi + +cd $HOME/rpmbuild/RPMS/noarch + +if [ -f "$zxdh_config_rpm" ]; then + cp $zxdh_config_rpm $output_dir + rm $zxdh_config_rpm +fi + +exit 0 diff --git a/src/net/zxdh_hpf_rpm_build.sh b/src/net/zxdh_hpf_rpm_build.sh new file mode 100755 index 0000000..a746d71 --- /dev/null +++ b/src/net/zxdh_hpf_rpm_build.sh @@ -0,0 +1,209 @@ +#!/bin/bash +host_arch=$(uname -m) +dist=$(rpm --eval %{dist}) +build_kernel=$(uname -r) + +usage() +{ +cat <<EOF +Usage: + ${0##*/} --rpm-driver-name <driver_name> + --rpm-driver-version <driver_version> + --rpm-driver-release <driver_release> + --hpf-driver-version <hpf_driver_version> + --ksrc <kernel_source_path> + --cross-compile <cross_compile_path> + --target-arch <target_arch> [ x86_64 | aarch64 ] + --dist <kernel source dist> [ .el8 | .zncgsl6 ] + --output-dir <outputdir> [options] + +Options: + --rpm-driver-name <driver_name> Set rpm driver name (default: zxdh-hpf) + --rpm-driver-version <driver_version> Set rpm driver version (default: 1.0) + --rpm-driver-release <driver_release> Set rpm driver release (default: 1) + --hpf-driver-version <hpf_driver_version> Set hpf driver version (default: 1.0-0) + --ksrc <kernel_source> Set kernel source path (default: /lib/modules/$(uname -r)/source) + --cross-compile <cross_compile_path> Set cross compile tools path (default(Don't cross compile): None) + --target-arch <traget_arch> Set the target arch (default(current arch): $(uname -m)) + --dist <kernel source dist> Set the kernel source dist (default(current dist): $(rpm --eval %{dist})) + --output-dir <outputdir> Change rpm output dir (default(working dir): $(pwd)) + -h, --help Show help message + +Output: + - build driver binary rpm package(eg: zxdh-hpf-1.0-1$(rpm --eval %{dist}).$(uname -m).rpm) and copy it to dir (--output-dir eg: $(pwd)) +EOF +} + +show_args() +{ +cat <<EOF +********************************************** +kernel source: $ksrc +kernel dist: $dist +host arch: $host_arch +target arch: $target_arch_info +cross compile: $cross_compile_info +hpf driver version: $hpf_driver_version +********************************************** +rpm dirver name: $rpm_driver_name +rpm driver version: $rpm_driver_version +rpm driver release: $rpm_driver_release +********************************************** +output dir: $output_dir +********************************************** +EOF +} + +while [ ! -z "$1" ] +do + case "$1" in + --rpm-driver-name) + rpm_driver_name="$2" + shift + ;; + --rpm-driver-version) + rpm_driver_version="$2" + shift + ;; + --rpm-driver-release) + rpm_driver_release="$2" + shift + ;; + --hpf-driver-version) + hpf_driver_version="$2" + shift + ;; + --ksrc) + ksrc="$2" + shift + ;; + --cross-compile) + cross_compile="$2" + shift + ;; + --target-arch) + target_arch="$2" + shift + ;; + --dist) + dist="$2" + shift + ;; + --output-dir) + output_dir="$2" + shift + ;; + -h | *help) + usage + exit 0 + ;; + *) + echo "-E- Unsupported option: $1" >&2 + exit 1 + ;; + esac + shift +done + +# Some input verification +if [ -z "$rpm_driver_name" ]; then + rpm_driver_name="zxdh-hpf" +fi +if [ -z "$rpm_driver_version" ]; then + rpm_driver_version="1.0" +fi +if [ -z "$rpm_driver_release" ]; then + rpm_driver_release="1" +fi +if [ -z "$hpf_driver_version" ]; then + hpf_driver_version="1.0-1" +fi +if [ -z "$ksrc" ]; then + ksrc="/lib/modules/$(uname -r)/source" +fi +if [ -z "$cross_compile" ]; then + cross_compile_info="Don't corss compile..." +else + cross_compile_info=$cross_compile +fi +if [ -z "$target_arch" ]; then + target_arch=$host_arch + target_arch_info="$target_arch (Don't corss compile, same as host arch)" +else + target_arch_info=$target_arch +fi +if [ -z "$output_dir" ]; then + output_dir=$(pwd) +fi +if [ ! -d $ksrc ]; then + echo "-E- $ksrc is not exists" >&2 + exit 1 +fi +if [ ! -d $output_dir ]; then + mkdir -p $output_dir + if [ $? -ne 0 ]; then + echo "-E- Failed to create $outputdir" >&2 + exit 1 + fi +fi + +show_args +sleep 3 + +tmpdir=$(mktemp -d /tmp/$rpm_driver_name.XXXXXX) +if [ ! -d "$tmpdir" ]; then + echo "-E- Failed to create $tmpdir!" >&2 + exit 1 +fi +trap "/bin/rm -rf $tmpdir" EXIT + +cp -r ../zxdh_kernel $tmpdir +cd $tmpdir +cd zxdh_kernel + +# 将spec文件拷贝到zxdh_kernel目录下 制作rpm包 +cp build/spec/zxdh-hpf.spec.example ./zxdh-hpf.spec +cd $tmpdir +tar czf $rpm_driver_name-$rpm_driver_version-$rpm_driver_release.tar.gz ./zxdh_kernel/ + +zxdh_hpf_rpm=$rpm_driver_name-$rpm_driver_version-$rpm_driver_release$dist.$target_arch.rpm + +if [ -d "$HOME/rpmbuild/RPMS/$target_arch" ]; then + cd $HOME/rpmbuild/RPMS/$target_arch + if [ -f "$zxdh_hpf_rpm" ]; then + rm $zxdh_hpf_rpm + fi +fi + +cd $tmpdir + +# make rpmbuild parameters +rpm_build_args=() +if [ "$target_arch" != "$host_arch" ]; then + # 交叉编译 + rpm_build_args+=( --target $target_arch) + rpm_build_args+=( --define "target $target_arch") + rpm_build_args+=( --define "CROSS_COMPILE $cross_compile") +fi + +rpm_build_args+=( --define "_name $rpm_driver_name") +rpm_build_args+=( --define "_version $rpm_driver_version") +rpm_build_args+=( --define "_release $rpm_driver_release") + +rpm_build_args+=( --define "HPF_DRI_VER $hpf_driver_version") + +rpm_build_args+=( --define "KSRC $ksrc") + +rpm_build_args+=( --define "dist $dist") +rpm_build_args+=( ./$rpm_driver_name-$rpm_driver_version-$rpm_driver_release.tar.gz) + +rpmbuild -tb "${rpm_build_args[@]}" + +cd $HOME/rpmbuild/RPMS/$target_arch + +if [ -f "$zxdh_hpf_rpm" ]; then + cp $zxdh_hpf_rpm $output_dir + rm $zxdh_hpf_rpm +fi + +exit 0 diff --git a/src/net/zxdh_kernel.sh b/src/net/zxdh_kernel.sh new file mode 100755 index 0000000..b6a852f --- /dev/null +++ b/src/net/zxdh_kernel.sh @@ -0,0 +1,127 @@ +#!/bin/bash + +cmd=$1 + +ver_path=/zte +root_dir=$ver_path/zxdh_kernel + +if ! yum list installed | grep -q Data-Dumper; then + yum install 'perl(Data::Dumper)' +fi + +function get_submit_info(){ + cd $1 + commit_id=$(git log --pretty=format:"%H" | head -n 1) + chg_no=$(git ls-remote | awk '/'${commit_id}'/&&/changes/' | sed 's/\//\n/g' | tail -n 2 | head -1) + title=$(git log --pretty=format:"%s" ${commit_id} -1) + cd - + echo "${commit_id} ${chg_no} ${title}" +} + +function get_chg_no(){ + cd $1 + commit_id=$(git log --pretty=format:"%H" | head -n 1) + chg_no=$(git ls-remote | awk '/'${commit_id}'/&&/changes/' | sed 's/\//\n/g' | tail -n 2 | head -1) + cd - + echo "${chg_no}" +} + +if [ $cmd = "compile" ]; then + yum -y install autoconf + file_name=$(uname -r) + echo ${file_name} + directory=/lib/modules/${file_name} + unzip -o $ver_path/driver/5.10.134-13.1.zncgsl6.x86_64.zip -d /lib/modules + if [ ! -d "$directory" ]; then + mv /lib/modules/5.10.134-13.1.zncgsl6.x86_64 /lib/modules/${file_name} + ls /lib/modules + ls /usr/lib/modules + fi + cd $root_dir/build + ./build.pl -t kernel -m CONFIG_DINGHAI_ETH -m CONFIG_ZXDH_AUXILIARY -m CONFIG_DINGHAI_MPF \ + -m CONFIG_DINGHAI_PF -m CONFIG_ZXDH_SF -m CONFIG_DINGHAI_EN_AUX -m HAVE_DEVLINK_ALLOC_GET_1_PARAMS \ + -m HAVE_DEV_PM_DOMAIN_ATTACH -m HAVE_BUS_FIND_DEVICE_GET_CONST -m CONFIG_DINGHAI_DH_CMD -m CONFIG_DINGHAI_NP + ret=$? + exit ${ret} +fi + +if [ $cmd = "upload_gerrit" ]; then + build_no=$2 + chg_no=$3 + chg_branch=$4 + env_user=$5 + env_pwd=$6 + date=$(date +%Y%m%d%H%M%S) + + cd $root_dir + zip -j kofile_${build_no}.${chg_no}.${date}.zip $root_dir/drivers/base/zxdh_auxiliary.ko \ + $root_dir/drivers/net/ethernet/dinghai/zxdh_en_aux.ko $root_dir/drivers/net/ethernet/dinghai/zxdh_mpf.ko \ + $root_dir/drivers/net/ethernet/dinghai/zxdh_np.ko $root_dir/drivers/net/ethernet/dinghai/zxdh_pf.ko + art_path="https://artsz.zte.com.cn:443/artifactory/dinghai-snapshot-generic/dpu_sdk/net/driver/zxdh_kernel/${chg_branch}" + art_src="${root_dir}/kofile_${build_no}.${chg_no}.${date}.zip" + art_user="-u${env_user}:${env_pwd}" + art_name="kofile_${build_no}.${chg_no}.${date}.zip" + art_dst1="${art_path}/${art_name}" + art_dst2="${art_path}/last/${art_name}" + last_files=$(curl -k ${art_user} -X GET ${art_path}/last/) + for file in ${last_files} + do + #echo "new line:"${file} + if [[ ${file} =~ "href=" ]] + then + file_name=$(echo ${file#*>} | sed -e 's/<\/a>//') + #echo "file:"$file_name + if [[ ${file_name} != "../" ]] + then + curl -k ${art_user} -X DELETE ${art_path}/last/${file_name} + fi + fi + done + curl -k ${art_user} -T ${art_src} ${art_dst1} + curl -k ${art_user} -T ${art_src} ${art_dst2} + exit 0 +fi + +if [ $cmd = "upload_versionci" ]; then + build_no=$2 + chg_branch=$3 + env_user=$4 + env_pwd=$5 + chg_no=`get_chg_no ./ | tail -n 1` + art_user="-u${env_user}:${env_pwd}" + date=$(date +%Y%m%d%H%M%S) + + cd ${root_dir} + art_path="https://artsz.zte.com.cn:443/artifactory/dinghai-snapshot-generic/dpu_sdk/net/driver/zxdh_kernel/${chg_branch}" + art_src="${root_dir}/kofile_${build_no}.${chg_no}.${date}.zip" + art_user="-u${env_user}:${env_pwd}" + art_name="kofile_${build_no}.${chg_no}.${date}.zip" + art_dst1="${art_path}/${art_name}" + art_dst2="${art_path}/last/${art_name}" + last_files=$(curl -k ${art_user} -X GET ${art_path}/last/) + for file in ${last_files} + do + #echo "new line:"${file} + if [[ ${file} =~ "href=" ]] + then + file_name=$(echo ${file#*>} | sed -e 's/<\/a>//') + #echo "file:"$file_name + if [[ ${file_name} != "../" ]] + then + curl -k ${art_user} -X DELETE ${art_path}/last/${file_name} + fi + fi + done + # get_submit_info ./ | tail -n 1 >> mcode_${build_no}.${chg_no}.${date}-daily.txt + # art_src1="${root_dir}/mcode_${build_no}.${chg_no}.${date}-daily.txt" + curl -k ${art_user} -T ${art_src} ${art_dst1} + curl -k ${art_user} -T ${art_src} ${art_dst2} + # curl -k ${art_user} -T ${art_src1} ${art_dst1} + # curl -k ${art_user} -T ${art_src1} ${art_dst2} + exit 0 +fi + +echo "unknow cmd" +exit 1 + + diff --git a/src/net/zxdh_zf_mpf_rpm_build.sh b/src/net/zxdh_zf_mpf_rpm_build.sh new file mode 100755 index 0000000..96938fd --- /dev/null +++ b/src/net/zxdh_zf_mpf_rpm_build.sh @@ -0,0 +1,201 @@ +#!/bin/bash +host_arch=$(uname -m) +dist=$(rpm --eval %{dist}) +build_kernel=$(uname -r) + +usage() +{ +cat <<EOF +Usage: + ${0##*/} --rpm-driver-name <driver_name> + --rpm-driver-version <driver_version> + --rpm-driver-release <driver_release> + --zf-mpf-driver-version <zf_mpf_driver_version> + --ksrc <kernel_source_path> + --cross-compile <cross_compile_path> + --dist <kernel source dist> [ .el8 | .zncgsl6 ] + --output-dir <outputdir> [options] + +Options: + --rpm-driver-name <driver_name> Set rpm driver name (default: zxdh-zf-mpf) + --rpm-driver-version <driver_version> Set rpm driver version (default: 1.0) + --rpm-driver-release <driver_release> Set rpm driver release (default: 1) + --zf-mpf-driver-version <zf_mpf_driver_version> Set zf_mpf driver version (default: 1.0-0) + --ksrc <kernel_source> Set kernel source path (default: /lib/modules/$(uname -r)/source) + --cross-compile <cross_compile_path> Set cross compile tools path + --dist <kernel source dist> Set the kernel source dist (default(current dist): $(rpm --eval %{dist})) + --output-dir <outputdir> Change rpm output dir (default(working dir): $(pwd)) + -h, --help Show help message + +Output: + - build driver binary rpm package(eg: zxdh-zf-mpf-1.0-1$(rpm --eval %{dist}).aarch64.rpm) and copy it to dir (--output-dir eg: $(pwd)) +EOF +} + +show_args() +{ +cat <<EOF +********************************************** +kernel source: $ksrc +kernel dist: $dist +host arch: $host_arch +target arch: $target_arch_info +cross compile: $cross_compile_info +zf_mpf driver version:$zf_mpf_driver_version +********************************************** +rpm dirver name: $rpm_driver_name +rpm driver version: $rpm_driver_version +rpm driver release: $rpm_driver_release +********************************************** +output dir: $output_dir +********************************************** +EOF +} + +while [ ! -z "$1" ] +do + case "$1" in + --rpm-driver-name) + rpm_driver_name="$2" + shift + ;; + --rpm-driver-version) + rpm_driver_version="$2" + shift + ;; + --rpm-driver-release) + rpm_driver_release="$2" + shift + ;; + --zf-mpf-driver-version) + zf_mpf_driver_version="$2" + shift + ;; + --ksrc) + ksrc="$2" + shift + ;; + --cross-compile) + cross_compile="$2" + shift + ;; + --dist) + dist="$2" + shift + ;; + --output-dir) + output_dir="$2" + shift + ;; + -h | *help) + usage + exit 0 + ;; + *) + echo "-E- Unsupported option: $1" >&2 + exit 1 + ;; + esac + shift +done + +# Some input verification +if [ -z "$rpm_driver_name" ]; then + rpm_driver_name="zxdh-zf-mpf" +fi +if [ -z "$rpm_driver_version" ]; then + rpm_driver_version="1.0" +fi +if [ -z "$rpm_driver_release" ]; then + rpm_driver_release="1" +fi +if [ -z "$zf_mpf_driver_version" ]; then + zf_mpf_driver_version="1.0-1" +fi +if [ -z "$ksrc" ]; then + ksrc="/lib/modules/$(uname -r)/source" +fi +if [ -z "$cross_compile" ]; then + cross_compile_info="Don't corss compile..." +else + cross_compile_info=$cross_compile +fi + +target_arch="aarch64" +target_arch_info="$target_arch (target arch must be aarch64)" + +if [ -z "$output_dir" ]; then + output_dir=$(pwd) +fi +if [ ! -d $ksrc ]; then + echo "-E- $ksrc is not exists" >&2 + exit 1 +fi +if [ ! -d $output_dir ]; then + mkdir -p $output_dir + if [ $? -ne 0 ]; then + echo "-E- Failed to create $outputdir" >&2 + exit 1 + fi +fi + +show_args +sleep 3 + +tmpdir=$(mktemp -d /tmp/$rpm_driver_name.XXXXXX) +if [ ! -d "$tmpdir" ]; then + echo "-E- Failed to create $tmpdir!" >&2 + exit 1 +fi +trap "/bin/rm -rf $tmpdir" EXIT + +cp -r ../zxdh_kernel $tmpdir +cd $tmpdir +cd zxdh_kernel + +# 将spec文件拷贝到zxdh_kernel目录下 制作rpm包 +cp build/spec/zxdh-zf-mpf.spec.example ./zxdh-zf-mpf.spec +cd $tmpdir +tar czf $rpm_driver_name-$rpm_driver_version-$rpm_driver_release.tar.gz ./zxdh_kernel/ + +zxdh_zf_mpf_rpm=$rpm_driver_name-$rpm_driver_version-$rpm_driver_release$dist.$target_arch.rpm + +if [ -d "$HOME/rpmbuild/RPMS/$target_arch" ]; then + cd $HOME/rpmbuild/RPMS/$target_arch + if [ -f "$zxdh_zf_mpf_rpm" ]; then + rm $zxdh_zf_mpf_rpm + fi +fi + +cd $tmpdir + +# make rpmbuild parameters +rpm_build_args=() +if [ "$target_arch" != "$host_arch" ]; then + # 交叉编译 + rpm_build_args+=( --target $target_arch) + rpm_build_args+=( --define "target $target_arch") + rpm_build_args+=( --define "CROSS_COMPILE $cross_compile") +fi + +rpm_build_args+=( --define "_name $rpm_driver_name") +rpm_build_args+=( --define "_version $rpm_driver_version") +rpm_build_args+=( --define "_release $rpm_driver_release") + +rpm_build_args+=( --define "ZF_MPF_DRI_VER $zf_mpf_driver_version") + +rpm_build_args+=( --define "KSRC $ksrc") + +rpm_build_args+=( --define "dist $dist") +rpm_build_args+=( ./$rpm_driver_name-$rpm_driver_version-$rpm_driver_release.tar.gz) + +rpmbuild -tb "${rpm_build_args[@]}" + +cd $HOME/rpmbuild/RPMS/$target_arch + +if [ -f "$zxdh_zf_mpf_rpm" ]; then + cp $zxdh_zf_mpf_rpm $output_dir + rm $zxdh_zf_mpf_rpm +fi + +exit 0 -- Gitee From 245ad62e6fb9eb0c2a6483916adc5a9321ff7516 Mon Sep 17 00:00:00 2001 From: hcf <11636549+hcf85679@user.noreply.gitee.com> Date: Fri, 14 Jun 2024 11:18:13 +0800 Subject: [PATCH 2/3] modify spec kernel version --- kmod-zxdh.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kmod-zxdh.spec b/kmod-zxdh.spec index 4db6f9f..b97474b 100644 --- a/kmod-zxdh.spec +++ b/kmod-zxdh.spec @@ -1,5 +1,5 @@ %global pkg zxdh -%global kernel 5.10.134-16.2.an8 +%global kernel kernel version %define pkg_version 1.13.1 %define anolis_release 1 -- Gitee From aa97ccada4e8836bb79e02ef179fc5d135fa4aad Mon Sep 17 00:00:00 2001 From: hcf <11636549+hcf85679@user.noreply.gitee.com> Date: Fri, 14 Jun 2024 14:58:23 +0800 Subject: [PATCH 3/3] modify spec kernel version --- kmod-zxdh.spec => kmod-dinghai.spec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename kmod-zxdh.spec => kmod-dinghai.spec (99%) diff --git a/kmod-zxdh.spec b/kmod-dinghai.spec similarity index 99% rename from kmod-zxdh.spec rename to kmod-dinghai.spec index b97474b..1dbffbb 100644 --- a/kmod-zxdh.spec +++ b/kmod-dinghai.spec @@ -1,6 +1,6 @@ -%global pkg zxdh +%global pkg dinghai %global kernel kernel version -%define pkg_version 1.13.1 +%define pkg_version 2.24.20 %define anolis_release 1 %global debug_package %{nil} -- Gitee

    7tzU2H*LwYWLBHB*zVZ6CQek89 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